diff -ruN groff-1.19.1/aclocal.m4 groff-1.19.2/aclocal.m4 --- groff-1.19.1/aclocal.m4 2003-12-09 18:39:30.000000000 +0100 +++ groff-1.19.2/aclocal.m4 2005-05-26 15:37:18.000000000 +0200 @@ -1,21 +1,22 @@ # Autoconf macros for groff. -# Copyright (C) 1989-1995, 2001, 2002, 2003 Free Software Foundation, Inc. -# +# Copyright (C) 1989-1995, 2001, 2002, 2003, 2004, 2005 +# Free Software Foundation, Inc. +# # This file is part of groff. -# +# # groff 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. -# +# # groff 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 groff; see the file COPYING. If not, write to the Free Software -# Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. AC_DEFUN([GROFF_PRINT], [if test -z "$PSPRINT"; then @@ -41,7 +42,7 @@ # Figure out DVIPRINT from PSPRINT. AC_MSG_CHECKING([for command to use for printing dvi files]) if test -n "$PSPRINT" && test -z "$DVIPRINT"; then - if test "X$PSPRINT" = "Xlpr"; then + if test "x$PSPRINT" = "xlpr"; then DVIPRINT="lpr -d" else DVIPRINT="$PSPRINT" @@ -59,57 +60,85 @@ # The following programs are needed for grohtml. AC_DEFUN([GROFF_HTML_PROGRAMS], - [make_html=html + [AC_REQUIRE([GROFF_GHOSTSCRIPT_PATH]) + make_html=html make_install_html=install_html missing= AC_FOREACH([groff_prog], - [pnmcut pnmcrop pnmtopng psselect pnmtops gs], + [pnmcut pnmcrop pnmtopng psselect pnmtops], [AC_CHECK_PROG(groff_prog, groff_prog, [found], [missing]) if test $[]groff_prog = missing; then - missing="$missing groff_prog" + missing="$missing \`groff_prog'" fi;]) + test "$GHOSTSCRIPT" = "missing" && missing="$missing \`gs'" + if test -n "$missing"; then - cnt=0 - for i in $missing - do - cnt=`expr $cnt + 1` - eval "prog$cnt=$i" - done - plural="s" - case $cnt in - 1) - plural="" - progs="\`$prog1'" ;; - 2) - progs="\`$prog1' and \`$prog2'" ;; - 3) - progs="\`$prog1', \`$prog2', and \`$prog3'" ;; - 4) - progs="\`$prog1', \`$prog2', \`$prog3', and \`$prog4'" ;; - 5) - progs="\`$prog1', \`$prog2', \`$prog3', \`$prog4', and \`$prog5'" ;; - 6) - progs="\`$prog1', \`$prog2', \`$prog3', \`$prog4', \`$prog5', and \`$prog6'" ;; - esac + plural=`set $missing; test $[#] -gt 1 && echo s` + missing=`set $missing + missing="" + while test $[#] -gt 0 + do + case $[#] in + 1) missing="$missing$[1]" ;; + 2) missing="$missing$[1] and " ;; + *) missing="$missing$[1], " ;; + esac + shift + done + echo $missing` make_html= make_install_html= - AC_MSG_WARN([ + AC_MSG_WARN([missing program$plural: The program$plural - $progs - can't be found in the path, thus the HTML backend of groff (grohtml) - won't work properly. Consequently, no documentation in HTML format - is built and installed. + $missing + cannot be found in the PATH. + Consequently, groff's HTML backend (grohtml) will not work properly; + therefore, it will neither be possible to prepare, nor to install, + documentation in HTML format. ]) fi AC_SUBST([make_html]) AC_SUBST([make_install_html])]) +# To produce PDF docs, we need both awk and ghostscript. + +AC_DEFUN([GROFF_PDFDOC_PROGRAMS], + [AC_REQUIRE([GROFF_AWK_PATH]) + AC_REQUIRE([GROFF_GHOSTSCRIPT_PATH]) + + make_pdfdoc=pdfdoc + make_install_pdfdoc=install_pdfdoc + + missing="" + test "$AWK" = missing && missing="\`awk'" + test "$GHOSTSCRIPT" = missing && missing="$missing \`gs'" + if test -n "$missing"; then + plural=`set $missing; test $[#] -eq 2 && echo s` + test x$plural = xs \ + && missing=`set $missing; echo "$[1] and $[2]"` \ + || missing=`echo $missing` + + make_pdfdoc= + make_install_pdfdoc= + + AC_MSG_WARN([missing program$plural: + + The program$plural $missing cannot be found in the PATH. + Consequently, groff's PDF formatter (pdfroff) will not work properly; + therefore, it will neither be possible to prepare, nor to install, + documentation in PDF format. + ]) + fi + + AC_SUBST([make_pdfdoc]) + AC_SUBST([make_install_pdfdoc])]) + # Check whether pnmtops can handle the -nosetpage option. AC_DEFUN([GROFF_PNMTOPS_NOSETPAGE], @@ -123,13 +152,57 @@ fi AC_SUBST([pnmtops_nosetpage])]) +# Check location of `gs'; allow `--with-gs=PROG' option to override. + +AC_DEFUN([GROFF_GHOSTSCRIPT_PATH], + [AC_REQUIRE([GROFF_GHOSTSCRIPT_PREFS]) + AC_ARG_WITH([gs], + [AS_HELP_STRING([--with-gs=PROG], + [actual [/path/]name of ghostscript executable])], + [GHOSTSCRIPT=$withval], + [AC_CHECK_TOOLS(GHOSTSCRIPT, [$ALT_GHOSTSCRIPT_PROGS], [missing])]) + test "$GHOSTSCRIPT" = "no" && GHOSTSCRIPT=missing]) + +# Preferences for choice of `gs' program... +# (allow --with-alt-gs="LIST" to override). + +AC_DEFUN([GROFF_GHOSTSCRIPT_PREFS], + [AC_ARG_WITH([alt-gs], + [AS_HELP_STRING([--with-alt-gs=LIST], + [alternative names for ghostscript executable])], + [ALT_GHOSTSCRIPT_PROGS="$withval"], + [ALT_GHOSTSCRIPT_PROGS="gs gswin32c gsos2"]) + AC_SUBST([ALT_GHOSTSCRIPT_PROGS])]) + +# Check location of `awk'; allow `--with-awk=PROG' option to override. + +AC_DEFUN([GROFF_AWK_PATH], + [AC_REQUIRE([GROFF_AWK_PREFS]) + AC_ARG_WITH([awk], + [AS_HELP_STRING([--with-awk=PROG], + [actual [/path/]name of awk executable])], + [AWK=$withval], + [AC_CHECK_TOOLS(AWK, [$ALT_AWK_PROGS], [missing])]) + test "$AWK" = "no" && AWK=missing]) + +# Preferences for choice of `awk' program; allow --with-alt-awk="LIST" +# to override. + +AC_DEFUN([GROFF_AWK_PREFS], + [AC_ARG_WITH([alt-awk], + [AS_HELP_STRING([--with-alt-awk=LIST], + [alternative names for awk executable])], + [ALT_AWK_PROGS="$withval"], + [ALT_AWK_PROGS="gawk mawk nawk awk"]) + AC_SUBST([ALT_AWK_PROGS])]) + # GROFF_CSH_HACK(if hack present, if not present) AC_DEFUN([GROFF_CSH_HACK], [AC_MSG_CHECKING([for csh hash hack]) cat <conftest.sh -#!/bin/sh +#! /bin/sh true || exit 0 export PATH || exit 0 exit 1 @@ -193,6 +266,48 @@ [AC_MSG_RESULT([int])]) AC_LANG_POP([C++])]) +# In April 2005, autoconf's AC_TYPE_SIGNAL is still broken. + +AC_DEFUN([GROFF_TYPE_SIGNAL], + [AC_MSG_CHECKING([for return type of signal handlers]) + for groff_declaration in \ + 'extern "C" void (*signal (int, void (*)(int)))(int);' \ + 'extern "C" void (*signal (int, void (*)(int)) throw ())(int);' \ + 'void (*signal ()) ();' + do + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([[ + +#include +#include +#ifdef signal +# undef signal +#endif +$groff_declaration + + ]], + [[ + +int i; + + ]]) + ], + [break], + [continue]) + done + + if test -n "$groff_declaration"; then + AC_MSG_RESULT([void]) + AC_DEFINE([RETSIGTYPE], [void], + [Define as the return type of signal handlers + (`int' or `void').]) + else + AC_MSG_RESULT([int]) + AC_DEFINE([RETSIGTYPE], [int], + [Define as the return type of signal handlers + (`int' or `void').]) + fi]) + AC_DEFUN([GROFF_SYS_NERR], [AC_LANG_PUSH([C++]) AC_MSG_CHECKING([for sys_nerr in , , or ]) @@ -284,28 +399,6 @@ [AC_MSG_RESULT([no])]) AC_LANG_POP([C++])]) -AC_DEFUN([GROFF_STDINT_H], - [AC_LANG_PUSH([C++]) - AC_MSG_CHECKING([C++ ]) - AC_COMPILE_IFELSE([ - AC_LANG_PROGRAM([[ - -#include - - ]], - [[ - -uint32_t x; -int32_t y; - - ]]) - ], - [AC_MSG_RESULT([yes]) - AC_DEFINE([HAVE_CC_STDINT_H], [1], - [Define if you have a C++ .])], - [AC_MSG_RESULT([no])]) - AC_LANG_POP([C++])]) - AC_DEFUN([GROFF_TIME_T], [AC_LANG_PUSH([C++]) AC_MSG_CHECKING([for declaration of time_t]) @@ -426,7 +519,7 @@ AC_DEFUN([GROFF_PAGE], [AC_MSG_CHECKING([default paper size]) groff_prefix=$prefix - test "x$prefix" = xNONE && groff_prefix=$ac_default_prefix + test "x$prefix" = "xNONE" && groff_prefix=$ac_default_prefix if test -z "$PAGE"; then descfile= if test -r $groff_prefix/share/groff/font/devps/DESC; then @@ -581,7 +674,7 @@ *) grep "Copyright.*Free Software Foundation" $f >/dev/null \ || tmac_wrap="$tmac_wrap $suff" ;; - esac + esac done elif test -n "$sys_tmac_prefix"; then files=`echo $sys_tmac_prefix*` @@ -704,7 +797,7 @@ AC_LANG_PUSH([C++]) AC_CACHE_VAL([groff_cv_decl_needed_$1], [AC_COMPILE_IFELSE([ - AC_LANG_PROGRAM([[ + AC_LANG_PROGRAM([[ #include #ifdef HAVE_STRING_H @@ -775,7 +868,7 @@ AC_DEFUN([GROFF_INTTYPES_H], [AC_LANG_PUSH([C++]) - AC_MSG_CHECKING([for inttypes.h]) + AC_MSG_CHECKING([C++ ]) AC_COMPILE_IFELSE([ AC_LANG_PROGRAM([[ @@ -789,7 +882,9 @@ ]]) ], - [groff_cv_header_inttypes_h=yes], + [groff_cv_header_inttypes_h=yes + AC_DEFINE([HAVE_CC_INTTYPES_H], [1], + [Define if you have a C++ .])], [groff_cv_header_inttypes_h=no]) AC_MSG_RESULT([$groff_cv_header_inttypes_h]) AC_LANG_POP([C++])]) @@ -845,7 +940,7 @@ cp ${srcdir}/src/include/nonposix.h conftest.h AC_COMPILE_IFELSE([ AC_LANG_PROGRAM([[ - + #include #include "conftest.h" @@ -862,3 +957,196 @@ [GROFF_PATH_SEPARATOR=";"]) AC_MSG_RESULT([$GROFF_PATH_SEPARATOR]) AC_SUBST(GROFF_PATH_SEPARATOR)]) + +# Check for X11. + +AC_DEFUN([GROFF_X11], + [AC_REQUIRE([AC_PATH_XTRA]) + groff_no_x=$no_x + if test -z "$groff_no_x"; then + OLDCFLAGS=$CFLAGS + OLDLDFLAGS=$LDFLAGS + OLDLIBS=$LIBS + CFLAGS="$CFLAGS $X_CFLAGS" + LDFLAGS="$LDFLAGS $X_LIBS" + LIBS="$LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS" + + LIBS="$LIBS -lXaw" + AC_MSG_CHECKING([for Xaw library and header files]) + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([[ + +#include +#include + + ]], + []) + ], + [AC_MSG_RESULT([yes])], + [AC_MSG_RESULT([no]) + groff_no_x="yes"]) + + LIBS="$LIBS -lXmu" + AC_MSG_CHECKING([for Xmu library and header files]) + AC_LINK_IFELSE([ + AC_LANG_PROGRAM([[ + +#include +#include + + ]], + []) + ], + [AC_MSG_RESULT([yes])], + [AC_MSG_RESULT([no]) + groff_no_x="yes"]) + + CFLAGS=$OLDCFLAGS + LDFLAGS=$OLDLDFLAGS + LIBS=$OLDLIBS + fi + + if test "x$groff_no_x" = "xyes"; then + AC_MSG_NOTICE([gxditview and xtotroff won't be built]) + else + XDEVDIRS="font/devX75 font/devX75-12 font/devX100 font/devX100-12" + XPROGDIRS="src/devices/xditview src/utils/xtotroff" + XLIBDIRS="src/libs/libxutil" + fi + + AC_SUBST([XDEVDIRS]) + AC_SUBST([XPROGDIRS]) + AC_SUBST([XLIBDIRS])]) + +# Set up the `--with-appresdir' command line option. + +AC_DEFUN([GROFF_APPRESDIR_OPTION], + [AC_ARG_WITH([appresdir], + dnl Don't quote AS_HELP_STRING! + AS_HELP_STRING([--with-appresdir=DIR], + [X11 application resource files]))]) + +# Get a default value for the application resource directory. +# +# We ignore the `XAPPLRES' and `XUSERFILESEARCHPATH' environment variables. +# +# The goal is to find the `root' of X11. Under most systems this is +# `/usr/X11/lib'. Application default files are then in +# `/usr/X11/lib/X11/app-defaults'. +# +# Based on autoconf's AC_PATH_X macro. + +AC_DEFUN([GROFF_APPRESDIR_DEFAULT], + [if test -z "$groff_no_x"; then + # Create an Imakefile, run `xmkmf', then `make'. + rm -f -r conftest.dir + if mkdir conftest.dir; then + cd conftest.dir + # Make sure to not put `make' in the Imakefile rules, + # since we grep it out. + cat >Imakefile <<'EOF' + +xlibdirs: + @echo 'groff_x_usrlibdir="${USRLIBDIR}"; groff_x_libdir="${LIBDIR}"' +EOF + + if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then + # GNU make sometimes prints "make[1]: Entering...", + # which would confuse us. + eval `${MAKE-make} xlibdirs 2>/dev/null | grep -v make` + + # Open Windows `xmkmf' reportedly sets LIBDIR instead of USRLIBDIR. + for groff_extension in a so sl; do + if test ! -f $groff_x_usrlibdir/libX11.$groff_extension && + test -f $groff_x_libdir/libX11.$groff_extension; then + groff_x_usrlibdir=$groff_x_libdir + break + fi + done + fi + + cd .. + rm -f -r conftest.dir + fi + + # In case the test with `xmkmf' wasn't successful, try a suite of + # standard directories. Check `X11' before `X11Rn' because it is often + # a symlink to the current release. + groff_x_libdirs=' + /usr/X11/lib + /usr/X11R6/lib + /usr/X11R5/lib + /usr/X11R4/lib + + /usr/lib/X11 + /usr/lib/X11R6 + /usr/lib/X11R5 + /usr/lib/X11R4 + + /usr/local/X11/lib + /usr/local/X11R6/lib + /usr/local/X11R5/lib + /usr/local/X11R4/lib + + /usr/local/lib/X11 + /usr/local/lib/X11R6 + /usr/local/lib/X11R5 + /usr/local/lib/X11R4 + + /usr/X386/lib + /usr/x386/lib + /usr/XFree86/lib/X11 + + /usr/lib + /usr/local/lib + /usr/unsupported/lib + /usr/athena/lib + /usr/local/x11r5/lib + /usr/lpp/Xamples/lib + + /usr/openwin/lib + /usr/openwin/share/lib' + + if test -z "$groff_x_usrlibdir"; then + # We only test whether libX11 exists. + for groff_dir in $groff_x_libdirs; do + for groff_extension in a so sl; do + if test ! -r $groff_dir/libX11.$groff_extension; then + groff_x_usrlibdir=$groff_dir + break 2 + fi + done + done + fi + + if test "x$with_appresdir" = "x"; then + appresdir=$groff_x_usrlibdir/X11/app-defaults + else + appresdir=$with_appresdir + fi + fi + AC_SUBST([appresdir])]) + + +# Emit warning if --with-appresdir hasn't been used. + +AC_DEFUN([GROFF_APPRESDIR_CHECK], + [if test -z "$groff_no_x"; then + if test "x$with_appresdir" = "x"; then + AC_MSG_NOTICE([ + + The application resource file for gxditview will be installed as + + $appresdir/GXditview + + (an existing file will be saved as `GXditview.old'). + To install it into a different directory, say, `/etc/gxditview', + add `--with-appresdir=/etc/gxditview' to the configure script + command line options and rerun it. The environment variable + `APPLRESDIR' must then be set to `/etc/' (note the trailing slash), + omitting the `gxditview' part which is automatically appended by + the X11 searching routines for resource files. More details can be + found in the X(7) manual page. + ]) + fi + fi]) diff -ruN groff-1.19.1/arch/misc/Makefile.sub groff-1.19.2/arch/misc/Makefile.sub --- groff-1.19.1/arch/misc/Makefile.sub 2004-04-07 19:39:37.000000000 +0200 +++ groff-1.19.2/arch/misc/Makefile.sub 2005-05-26 15:37:17.000000000 +0200 @@ -15,13 +15,13 @@ # # You should have received a copy of the GNU General Public License along # with groff; see the file COPYING. If not, write to the Free Software -# Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. CLEANADD=shdeps.sed all: shdeps.sed -shdeps.sed: shdeps.sh - $(SHELL) $< "$(RT_SEP)" "$(SH_SEP)" "$(bindir)" > $@ +shdeps.sed: $(srcdir)/shdeps.sh + $(SHELL) $(srcdir)/shdeps.sh "$(RT_SEP)" "$(SH_SEP)" "$(bindir)" > $@ # eof diff -ruN groff-1.19.1/arch/misc/shdeps.sh groff-1.19.2/arch/misc/shdeps.sh --- groff-1.19.1/arch/misc/shdeps.sh 2004-04-09 07:40:37.000000000 +0200 +++ groff-1.19.2/arch/misc/shdeps.sh 2005-05-26 15:37:17.000000000 +0200 @@ -1,7 +1,7 @@ -#!/bin/sh +#! /bin/sh # shdeps.sh: Generate OS dependency fixups, for `groff' shell scripts # -# Copyright (C) 2004 Free Software Foundation, Inc. +# Copyright (C) 2004, 2005 Free Software Foundation, Inc. # Written by Keith Marshall (keith.d.marshall@ntlworld.com) # # Invoked only by `make', as: @@ -21,7 +21,7 @@ # # You should have received a copy of the GNU General Public License along # with groff; see the file COPYING. If not, write to the Free Software -# Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. cat << ETX # shdeps.sed: Script generated automatically by \`make' -- do not modify! @@ -40,6 +40,7 @@ cat << ETX \\ GROFF_RUNTIME="\${GROFF_BIN_PATH=$3}:" +/@PATH_SEARCH_SETUP@/d ETX else @@ -83,6 +84,34 @@ GROFF_RUNTIME=\${GROFF_BIN_PATH="$POSIX_BINDIR"}";" ;;\\ esac ETX + # On Microsoft platforms, we may also need to configure + # the PATH search function, used in the `pdfroff' script, + # to use ';', instead of ':', as the PATH_SEPARATOR. + + cat << ETX +/@PATH_SEARCH_SETUP@/c\\ +#\\ +# This implementation is configured for a Microsoft platform.\\ +# Thus, the default PATH_SEPARATOR is ';', although some shells may\\ +# use the POSIX standard ':' instead. Therefore, we need to examine\\ +# the OSTYPE environment variable, to identify which is appropriate\\ +# to make PATH searches work correctly.\\ +#\\ + case "\$OSTYPE" in\\ +#\\ + msys | cygwin)\\ + #\\ + # These emulate POSIX, and use ':'\\ + #\\ + PATH_SEPARATOR=\${PATH_SEPARATOR-':'} ;;\\ +#\\ + *)\\ + #\\ + # For anything else, default to ';'\\ + #\\ + PATH_SEPARATOR=\${PATH_SEPARATOR-';'} ;;\\ + esac +ETX fi diff -ruN groff-1.19.1/ChangeLog groff-1.19.2/ChangeLog --- groff-1.19.1/ChangeLog 2004-05-12 11:46:47.000000000 +0200 +++ groff-1.19.2/ChangeLog 2005-09-04 12:01:44.000000000 +0200 @@ -1,16804 +1,5251 @@ -2004-05-10 Stephen Gildea +2005-09-04 Werner LEMBERG - * src/preproc/refer/label.y (same_author_last_name, - same_author_name): Handle empty sort keys. + * tmac/groff_ms.man, doc/groff.texinfo: Synchronize. -2004-05-10 Werner LEMBERG + * doc/webpage.ms: Updated. - * NEWS, README, TODO, PROJECTS, PROBLEMS, MANIFEST, doc/webpage.ms, - tmac/TODO: Updated. + * install-sh, mkinstalldirs: New versions; taken from texinfo CVS. - * tmac/doc-syms (doc-str-Lb-libposix, doc-str-Lb-libpthread, - doc-str-Lb-librt): Reset font. - (Lb): Rename `doc-str-Lb' to `doc-str-Lb1'. - Provide `doc-str-Lb' to reset font. - * tmac/groff_mdoc.man: Updated. +2005-09-04 Jörgen Grahn -2004-05-08 Jan Schaumann + * tmac/groff_ms.man: Document `PO' better. - * src/preproc/html/pre-html.cpp (make_message): Make it work for - snprintf versions which don't conform to ANSI C 99 (this is, - counting the string's trailing null byte in the return value). +2005-09-03 Werner LEMBERG -2004-05-07 Keith Marshall + * NEWS: Document grotty changes. - * src/roff/troff/node.cpp (suppress_node::tprint): Don't expect - that all implementations of sprintf handle null pointers correctly. +2005-09-01 Keith Marshall -2004-05-04 Werner LEMBERG + Backward compatibility support for `man' program. - * NEWS, man/groff_diff.man, man/groff.man, doc/groff.texinfo: - Document `.U' register. + * tmac/an-old.tmac (LL): Initialize it to respect prior LL register + assignment, prior `.ll' request and then package defaults, in this + specified order of decreasing priority. - * src/roff/troff/env.cpp (environment::mark_last_line) - [WIDOW_CONTROL]: Fix scope of `p' for new C++ compilers. + * tmac/groff_man.man, doc/groff.texinfo: Document altered `LL' + register initialization priorities. -2004-05-04 Larry Kollar +2005-08-29 Gary W. Swearingen - New read-only register `.U'; it returns 1 in safer mode and 0 - otherwise. + * tmac/groff_mdoc.man: Go into more details how the `AUTHORS' + section should look like. - * src/roff/troff/input.cpp (init_input_requests): Implement `.U' - register. +2005-08-29 Werner LEMBERG -2004-05-03 Werner LEMBERG + * tmac/groff_mdoc.man: The month's name in a call to .Dd shouldn't + be abbreviated. - * install-sh, mkinstalldirs: New versions; taken from texinfo CVS. +2005-08-27 Bernd Warken -2004-04-17 Werner LEMBERG + * tmac/groff_man.man: Add man(7) too SEE ALSO and more minor + fixes. - * src/include/font.h (font): Use `int' for ch_index. - * src/libs/libgroff/font.cpp (font::alloc_ch_index, - font::compact): Updated. +2005-08-11 Bernd Warken - * src/roff/groff/pipeline.c (run_pipeline) [_WIN32]: Fix compiler - warnings. + * tmac/www.tmac (URL, MTO): Handle empty \\$1 better. - * src/roff/troff/div.cpp (begin_page), src/roff/troff/env.cpp - (hyphen_word): Fix compiler warnings. - * src/roff/troff/input.cpp (get_char_for_escape_name): Return - `char'. - Update all callers. - (get_delim_number, get_line_arg): Change second argument type to - `unsigned char'. - (macro_header::copy, token::next, do_define_string, - do_define_character, substring_request, asciify_macro, - unformat_macro, read_size, non_interpreted_node::interpret, - while_request, main: Fix compiler warnings. - (read_color_draw_node): Initialize `col'. +2005-08-09 Bernd Warken - * src/preproc/tbl/table.cpp (horizontal_span, table_entry): Make - `start_col' and `end_col' of type `int'. - (vertical_rule): Make `col' of type `int'. + * tmac/www.tmac (URL, MTO): Use bold series if color support is + deactivated. - * src/preproc/grn/hdb.cpp (DBRead): Protect call to getc with check - for EOF. +2005-08-02 Bernd Warken - * src/preproc/refer/label.y (uppercase_array, lowercase_array): - New arrays. - (format_serial): Use them to remove dependency on ASCII. + * doc/Makefile.sub (uninstall_sub): Use --remove, not --delete + as argument to $(INSTALL_INFO). The latter isn't portable. + Remove $(HTMLEXAMPLEFILES) too. - * src/devices/grops/ps.cpp (ps_printer::define_encoding): Fix - compiler warning. - * src/devices/grops/psrm.cpp (resource_manager::supply_resource): - Ditto. + * Makefile.in (uninstall_dirs): Remove $(datadir)/doc/groff and + $(datadir)/doc too. + Suppress warning messages and return always true. - * src/devices/grotty/tty.cpp (tty_font::load_tty_font): Fix - compiler warnings. - (glyph): Change type of `hpos' to `int'. + * tmac/Makefile.sub (uninstall_sub): Remove www.tmac too. - * src/devices/lbp/lbp.cpp (strsep): Removed. Unused. - * src/devices/lbp/lbp.h (splinerel): Fix compiler warnings. +2005-07-02 Bernd Warken - * src/utils/tfmtodit.cpp (gf::load): Fix compiler warnings. + * src/devices/xditview/gxditview.man: Change many `.I' to `.B'. + * man/groff_out.man: More markup and minor improvements. + * src/roff/groff/groff.man: Minor improvements. - * src/utils/pfbtops/pfbtops.c (get_text): Fix compiler warning. +2005-06-28 Werner LEMBERG -2004-04-16 Werner LEMBERG + * ChangeLog: Split off older entries into... + * ChangeLog.115 ChangeLog.116, ChangeLog.117, ChangeLog.118: New + files. - * src/devices/grolbp/lbp.h, src/preproc/grn/gprint.h, - src/preproc/grn/hgraph.cpp, src/preproc/grn/hpoint.cpp, - src/preproc/html/pushback.cpp, src/preproc/html/pushback.h: Use - `double' instead of `float' everywhere. - * src/preproc/grn/main.cpp: Use `double' instead of `float' - everywhere. - (main): Add return value. - * src/preproc/grn/hdb.cpp: Use `double' instead of `float' - everywhere. - Update all user functions. +2005-06-26 Bernd Warken - * src/include/search.h, src/include/ptable.h, src/include/printer.h, - src/preproc/eqn/box.h, src/preproc/pic/object.h, - src/preproc/refer/refer.h, src/preproc/tbl/table.h, - src/preproc/tbl/table.cpp, src/roff/troff/env.h, - src/roff/troff/div.h, src/roff/troff/token.h, src/roff/troff/node.h, - src/roff/troff/input.cpp, src/roff/troff/request.h, - src/roff/troff/node.cpp: Don't mix `struct' and `class' in forward - declarations. + * src/devices/xditview/gxditview.man: More minor fixes. - * src/utils/indxbib/signal.c: Include stdlib.h. +2005-06-24 Werner LEMBERG -2004-04-14 Keith Marshall + * src/preproc/pic/troff.cpp (troff_output::set_fill, + troff_output::set_color, troff_output::reset_color): Use .bcolor and + .fcolor instead of \m and \M, respectively. - * tmac/s.tmac (@init, RP): Allow initialization of the PO register - before the first page. +2005-06-23 Bernd Warken -2004-04-14 Thomas Klausner + * src/devices/xditview/gxditview.man: More minor fixes. + * README: Formatting issues. + Mention some problems with Debian. - * tmac/doc-common (doc-volume-as-*): Use lowercase names. - (doc-operating-system-*): Updated. - * tmac/doc-syms (doc-str-St-*): Various small fixes. - (doc-str-Lb-*): Add more library names. +2005-06-23 Bernd Warken -2004-04-10 Art Haas + * src/devices/xditview/gxditview.man: Revised and improved. - * src/utils/hpftodit/hpuni.cpp (hp_msl_to_unicode_list): Don't - use anonymous type. +2005-06-22 Werner LEMBERG -2004-04-09 Art Haas + Another round in fixing getopt problems. Hopefully the last one! + This time we use the getopt stuff from gnulib and define a prefix + unconditionally so that there are no collisions with any other + getopt implementations. This is a slight waste of space in case + we already use a GNU getopt implementation, but on + the other hand it really simplifies life. - * src/utils/tfmtodit.cpp (lig_chars): Don't use anonymous type. + * src/include/getopt.h: Use gnulib version. -2004-04-09 Keith Marshall + * src/include/getopt_int.h: Use gnulib version. - * arch/misc/shdeps.sh: Generate better comment for sed script. + * src/include/groff-getopt.h: Removed. Obsolete now. -2004-04-08 Art Haas + * src/include/lib.h: Regarding getopt, don't handle any platform + specially; just include getopt.h. + (__GETOPT_PREFIX): Define (before getopt.h). - * src/libs/libgroff/glyphuni.cpp (glyph_to_unicode_list), - src/libs/libgroff/uniglyph.cpp (unicode_to_glyph_list), - src/libs/libgroff/uniuni.cpp (unicode_decompose_list), - src/preproc/eqn/box.cpp (param_table), src/preproc/grn/hgraph.cpp - (polyfill), src/preproc/grn/main.cpp (polyfill), - src/preproc/refer/command.cpp (command_table), - src/utils/tfmtodit.cpp (lig_table): Don't use anonymous types (which - gcc 3.5 doesn't like). + * src/include/Makefile.sub (HDRS): Updated. -2004-04-08 Werner Lemberg + * src/libs/libgroff/getopt1.c, src/libs/libgroff/getopt.c: Use + gnulib version. - Removing many compiler warnings. groff should now compile with - a C++ compiler used for C files also. [Simple variable renamings - to avoid shadowing aren't logged in detail.] + * src/libs/libgroff/Makefile.sub (EXTRA_CFLAGS): Set + __GETOPT_PREFIX. - * src/devices/grodvi/dvi.cpp: Some local variable renamings. - (draw_dvi_printer::draw) ['c']: Enclose in block. + * src/utils/pfbtops/pfbtops.c, src/utils/xtotroff/xtotroff.c + (__GETOPT_PREFIX): Define (before getopt.h). - * src/devices/grohtml/post-html.cpp: Some local variable renamings. - (page::add_line): Fix typos. - * src/devices/grohtml/html-text.cpp: Some local variable renamings. +2005-06-21 Werner LEMBERG - * src/devices/grolbp/lbp.cpp: Don't define _GNU_SOURCE. - Some local variable renamings. - * src/devices/grolbp/lbp.h: Some local variable renamings. + * src/include/lib.h: Provide a fix for Mac OS X to not include + groff-getopt.h. - * src/devices/grolj4/lj4.cpp, src/devices/grotty/tty.cpp: Some local - variable renamings. +2005-06-20 Denis M. Wilson - * src/libs/libbib/index.cpp (index_search_item_iterator::get_tag): - Remove redundant local variable declaration. - * src/libs/libbib/map.c (mapread, unmap): Don't use K&R style. - Don't use `caddr_t' but `void *'. - Enclose functions with `extern "C"' for C++. + * font/devps/prologue.ps (EP): Dont' use `bind'. Reason: Using + `bind' to define a procedure which contains `showpage' means that an + invocation of `showpage' may execute wrongly (the exact effect + depending on the interpreter). Not usually a problem except under + transformations, such as combining pages. + (PEND): Don't call `clear'. Reason: Using `clear' in the definition + of /PEND means that stack underflow will occur if the stack is + deliberately non-empty before document inclusion. If included + files are found to be generally badly behaved, we could replace the + `clear' with `mark' in /PBEGIN and `cleartomark' in /PEND (I've + never found this necessary). - * src/libs/libdriver/input.cpp (remember_filename, - remember_source_filename): Use cast for string constant. +2005-06-20 Jörgen Grahn - * src/libs/libgroff/font.cpp, src/libs/libgroff/fontfile.cpp, - src/libs/libgroff/nametoindex.cpp, src/libs/libgroff/paper.cpp, - src/libs/libgroff/geometry.cpp: Some local variable renamings. - * src/libs/libgroff/iftoa.c, src/libs/libgroff/itoa.c: Don't use K&R - style. - Enclose functions with `extern "C"' for C++. - * src/libs/libgroff/quotearg.c (TRUE,FALSE): Define as macros. - (needs_quoting): Return `int'. - (quote_arg): Add proper casts to malloc and realloc. - * src/libs/libgroff/spawnvp.c: Compile code only for MS-DOS and - various MS Windows environments. - (spawnvp_wrapper): Add proper cast to malloc. + * src/preproc/soelim/soelim.cpp (do_file): Append trailing zero + earlier to get correct error message. - * src/preproc/eqn/box.h: Remove redundant declarations of - `make_script_box', `make_mark_box' and `make_lineup_box'. - * src/preproc/eqn/eqn.y: Remove redundant declaration of `strsave'. - * src/preproc/eqn/script.cpp, src/preproc/eqn/pile.cpp: Some local - variable renamings. +2005-06-16 Bernd Warken + * src/roff/nroff/nroff.sh: Add support for iso-8859-15. - * src/preproc/grn/hpoint.cpp: Some local variable renamings. - * src/preproc/grn/hgraph.cpp: Some local variable renamings. - (dx, dy): Renamed functions to... - (deltax, deltay): This. - * src/preproc/grn/main.cpp: Some local variable renamings. - (deffont): Add `const'. - (initpic, conv): Use cast for string constant. +2005-06-15 Werner LEMBERG - * src/preproc/html/pre-html.cpp: Some local variable renamings. - (makeFileName, alterDeviceTo, addZ): Use cast for string constant. - (char_buffer::run_output_filter): Second argument is unused. - * src/preproc/html/pushback.cpp: Some local variable renamings. + Another try to update getopt files. This time we add a dummy + gettext.h file to satisfy the dependency. - * src/preproc/pic/pic.y: Remove redundant declaration of `do_copy'. - * src/preproc/pic/object.cpp: Some local variable renamings. + * src/include/getopt.h, src/libs/libgroff/getopt.c, + src/libs/libgroff/getopt1.c: Updated from GNU libc CVS. - * src/preproc/refer/label.y (lookup_label): Remove redundant - declaration of local variable. + * src/include/getopt_int.h: New file (from GNU libc CVS). - * src/preproc/soelim.cpp: Remove redundant declaration of - `interpret_lf_args'. + * src/include/gettext.h: Dummy file which just defines a gettext() + macro. - * src/preproc/tbl/main.cpp: Some local variable renamings. + * src/include/groff-getopt.h: Updated. - * src/roff/groff/groff.cpp (main): Use cast for string constant. - * src/roff/groff/pipeline.c: Enclose declarations of `error', - `c_fatal', and `i_to_a' with `extern "C"' for C++. - Don't use C++-style comments. + * src/include/Makefile.sub (HDRS): Add getopt_int.h and gettext.h. - * src/roff/troff/env.h: Remove redundant declaration of `title'. - * src/roff/troff/node.h, src/roff/troff/env.cpp, - src/roff/troff/div.cpp, src/roff/troff/node.cpp: Some local variable - renamings. - * src/roff/troff/div.h: Remove redundant declaration of - `end_diversions'. - * src/roff/troff/troff.h: Remove redundant declaration of - `cleanup_and_exit' - * src/roff/troff/input.cpp: Remove redundant declaration of - `handle_first_page_transition' and `process_input_stack'. - * src/utils/hpftodit.cpp: Some local variable renamings. + * src/libs/libdriver/input.cpp (IntArray): Remove superfluous + `const' keywords in return value. - * src/utils/indxbib/signal.c: Enclose functions with `extern "C"' - for C++. - Don't define RETSIGTYPE. - * src/utils/indxbib/indxbib.cpp: Some local variable renamings. + * src/preproc/html/pushback.cpp (pushBackBuffer::~pushBackBuffer): + Remove redundant variable `old'. + (pushBackBuffer::skipToNewline): Remove redundant variable `ch'. - * src/utils/pfbtops/pfbtops.cpp: Don't use K&R style. - (error): Use `const' in argument. - (main): Remove redundant declaration of `optind'. - Move declaration of `Version_string' to top-level. + * src/preproc/tbl/main.cpp (process_table): Remove redundant + variable `c'. - * PROBLEMS: Document difficulties compiling signal.c if a C++ - compiler is used for C. -2004-04-07 Werner Lemberg + Fix more friend name injection problems since modern C++ compilers + fail otherwise. We simply provide (global) declarations for all + functions declared as friends. This is not really necessary but + doesn't harm. - * Makefile.sub (DISTCLEANFILES): Add `test-groff'. + * src/preproc/eqn/lex.cpp: Provide declarations for get_char, + peek_char, and get_location. -2004-04-06 Keith Marshall + * src/preproc/refer/ref.h: Provide declarations for + compare_reference, same_reference, same_year, same_date, + same_author_last_name, and same_author_name. - Make scripts like nroff.sh and neqn.sh portable across various - (Unix-like) shell implementations from Cygwin, MSYS, etc., which use - non-POSIX path separators. The idea is to extend those scripts to - decide at run-time (of the script) which path separator to use. + * src/roff/troff/div.h: Provide declarations for do_divert and + page_offset. - * arch/misc/Makefile.sub: New file. - * arch/misc/shdeps.sh: New file, generating OS dependency fixups. - This script handles @GROFF_BIN_PATH_SETUP@, replacing it with - a proper definition of the variable `GROFF_RUNTIME'. + * src/roff/troff/env.h: Provide declarations for title_length, + space_size, fill, no_fill, adjust, no_adjust, center, right_justify, + vertical_spacing, post_vertical_spacing, line_spacing, line_length, + indent, temporary_indent, do_underline, do_input_trap, set_tabs, + margin_character, no_number, number_lines, leader_character, + tab_character, hyphenate_request, no_hyphenate, + hyphen_line_max_request, hyphenation_space_request, + hyphenation_margin_request, line_width, tabs_save, tabs_restore, + line_tabs_request, widow_control_request, and do_divert. - * Makefile.in (SH_DEPS_SED_SCRIPT): New variable. - (MDEFINES): Add SH_DEPS_SED_SCRIPT. - (PROGDEPDIRS): New variable. - `FORCE' it. - (PROGDIRS): Add PROGDEPDIRS. + * src/roff/troff/input.cpp: Provide declaration for chop_macro. - * src/preproc/eqn/Makefile.sub (neqn): Call SH_DEPS_SED_SCRIPT. - Don't substitute @SEP@ and @BINDIR@. - * src/preproc/eqn/neqn.sh: Use @GROFF_BIN_PATH_SETUP@. - (PATH): Use GROFF_RUNTIME. + * src/roff/troff/node.cpp: Provide declarations for class + tfont_spec. + Provide declaration for make_tfont. - * src/roff/nroff/Makefile.sub (nroff): Call SH_DEPS_SED_SCRIPT. - Don't substitute @SEP@ and @BINDIR@. - * src/roff/nroff/nroff.sh: Use @GROFF_BIN_PATH_SETUP@. - (PATH): Use GROFF_RUNTIME. +2005-05-29 Werner LEMBERG -2004-04-05 Keith Marshall + * doc/fdl.texi: Updated to version 1.2. Reported by Bernd Warken. - * src/roff/nroff/nroff.sh: Implement work-around for sh.exe from - Cygwin which doesn't handle stderr correctly. +2005-05-28 Werner LEMBERG -2004-03-08 Werner LEMBERG + * contrib/pdfmark/Makefile.sub (.ms.pdf): Use `--stylesheet', not + `--style'. - * Makefile.comm (install_dev, uninstall_dev): Protect `for' loops - against empty argument. Problem reported by . + * src/devices/grolbp/lbp.cpp, src/devices/grolbp/lbp.h: Remove + redundant semicolons. -2004-03-05 Keith Marshall + * src/preproc/eqn/Makefile.sub, src/preproc/html/Makefile.sub, + src/preproc/soelim/Makefile.sub, src/preproc/tbl/Makefile.sub: + Define `MLIB'. Some compilers need this for linking with libgroff. - * Makefile.in (SEP): Replaced with... - (RT_SEP, SH_SEP): Separators for the target platform's native path - separator and the build environment, respectively. - (fontpath, tmacpath): Use RT_SEP. - (MDEFINES): Updated. +2005-05-27 Werner LEMBERG - * contrib/mom/Makefile.sub (GROFF_BIN_PATH): Use SH_SEP. - * doc/Makefile.sub (GROFF_BIN_PATH): Use SH_SEP. - * src/preproc/eqn/Makefile.sub (neqn): Use SH_SEP. - * src/roff/nroff/Makefile.sub (nroff): Use SH_SEP. + * MANIFEST, README, doc/webpage.ms: Updated. -2004-03-05 Werner LEMBERG +2005-05-26 Werner LEMBERG - * fonts/devlj4/Makefile.sub (LJ4RES): Set to 1200. This helps to - reduce alignment problems with newer printers which use built-in - TrueType fonts (instead of the older Intellifonts). The ideal - solution is to provide a second set of groff metric files, but this - is extremely time-consuming to produce, given that HP's metric - files are very rudimentary. + * All affected files: Update postal address of FSF. -2004-03-01 Werner LEMBERG +2005-05-25 Keith Marshall + Bernd Warken - * src/devices/grolj4/lj4.cpp (main): Fix argument of getopt_long. - s/operand/argument/ in error message. + * README: More fixes. -2004-03-01 Keith Marshall + * README.CVS: Removed. Its contents is now part of the README file. - * src/roff/groff/groff.cpp (main): Don't allow option -o if -Thtml - is in use. +2005-05-21 Werner LEMBERG -2004-03-01 Antti Kantee + * README: Updated. Based on a patch from Bernd Warken. - * tmac/s.tmac (XE): Fix error message. +2005-05-16 Keith Marshall -2004-02-27 Jeff Conrad + Miscellaneous script portability enhancements. - * src/include/nonposix.h (write, dup, dup2, close) [_MSC_VER]: - New macros. + * aclocal.m4: (GROFF_CSH_HACK): Add space in shebang prototype for + generated conftest.sh script, conforming to portability + recommendation in autoconf docs. + * configure: Likewise, for code generated by GROFF_CSH_HACK. + * contrib/eqn2graph/eqn2graph.sh: Add space in shebang, conforming + to portability recommendation in autoconf docs. + * contrib/gdiffmk/gdiffmk.sh: Likewise. + * contrib/gdiffmk/tests/runtests.in: Likewise. + * contrib/grap2graph/grap2graph.sh: Likewise. + * contrib/groffer/groffer.sh: Likewise. + * contrib/mm/mmroff.pl: Likewise. + * contrib/mom/momdoc/appendices.html: Likewise. + * contrib/pic2graph/pic2graph.sh: Likewise. + * font/devps/generate/afmname: Likewise. + * src/devices/xditview/ad2c: Likewise. + * src/preproc/eqn/neqn.sh: Likewise. + * src/roff/grog/grog.pl: Likewise. + * src/roff/grog/grog.sh: Likewise. + * src/roff/nroff/nroff.sh: Likewise. + * PROBLEMS: Likewise, in embedded script examples. - * src/roff/groff/pipeline.c: Declare strcasecmp. - (run_pipeline) [_WIN32]: Use function name variants which don't - start with `_'. - Fix stream handling. +2005-05-16 Keith Marshall -2004-02-27 Keith Marshall + Improve portability of `pdfroff' shell script. - * src/include/nonposix.h: Fix declaration of `system_shell_name'. - Declare `spawnvp_wrapper' and macro definitions of spawnvp only - for platforms which use the native Win32 runtime libraries. - (FLUSH_INPUT_PIPE) [_UWIN]: Provide non-empty version. + * arch/misc/shdeps.sh: Add space in shebang, conforming to + portability guidelines in `autoconf' docs. + (PATH_SEARCH_SETUP): New substitution; emits PATH_SEPARATOR + initialization code. Used by contrib/pdfmark/pdfroff.sh's + `searchpath' function. - * src/libs/libgroff/quotearg.c (QUOTE_ARG_MALLOC_ERROR, - QUOTE_ARG_REALLOC_ERROR): Fix string. +2005-05-14 Werner LEMBERG - * src/preproc/html/pre-html.cpp: Remove declaration of - `spawnvp_wrapper'. - Don't use __MINGW32__. - s/DEBUG_FILE/DEBUG_FILE_DIR/. - (DEBUG_TEXT, DEBUG_NAME, DEBUG_FILE) [DEBUGGING]: New macros. - (OUTPUT_STREAM, PS_OUTPUT_STREAM, REGION_OUTPUT_STREAM): New macros. - (char_buffer::run_output_filter) [MAY_FORK_CHILD_PROCESS]: Fix - calls to `set_redirection' and `WAIT'. - [MAY_SPAWN_ASYNCHRONOUS_CHILD]: Remove unused variable `i' and `j'. - Fix calls to `set_redirection' and `save_and_redirect'. - (char_buffer::do_html, char_buffer::do_image) [DEBUGGING]: Fix calls - to `set_redirection' and `save_and_redirect'. - (usage): Fix message. - (makeTempFiles, main): Use `DEBUG_FILE'. + * contrib/pic2graph/pic2graph.sh, contrib/graph2graph.sh, + contrib/eqn2graph.sh: Add option `-trim' to `convert' which is + needed for newer ImageMagick versions. -2004-02-21 Werner LEMBERG +2005-05-07 Werner LEMBERG - * src/roff/troff/troff.h (WARN_TOTAL): Fix value. + * src/preproc/refer/refer.man: Many small typographic fixes. -2004-02-21 Keith Marshall +2005-05-06 Jeff Conrad - * src/libs/libgroff/quotearg.c: New file, providing proper argument - quoting for MSVC's spawn* and exec* functions. - * src/libs/libgroff/spawnvp.c: New file, providing a wrapper around - spawnvp with proper quoting for MSVC. + * src/devices/grohtml/post-html.cpp (assert_state::~assert_state): + Use `char *' cast for a_delete. - * src/libs/libgroff/assert.cpp (program_name), - src/libs/libgroff/new.cpp (program_name): Declare as `extern "C"'. - * src/libs/libgroff/Makefile.sub (OBJS, CSRCS): Updated. +2005-05-03 Werner LEMBERG - * src/roff/troff/input.cpp (program_name): Declare as `extern "C"'. + * src/libs/libgroff/maxpathname.cpp: Include stdlib.h. + src/libs/libgroff/relocate.cpp: Use path_name_max everywhere. - * src/include/error.h (program_name): Declare as `extern "C"'. - * src/include/nonposix.h [__MSDOS__ ...]: Handle spawnvp. +2005-05-03 Jeff Conrad -2004-02-21 Jeff Conrad + * src/devices/grohtml/post-html.cpp: Use casts to `char *' if using + `a_delete' for `const char *'. - * src/preproc/html/pre-html.cpp [__CYGWIN__ ...]: Declare - spawnvp_wrapper. - [MAY_SPAWN_ASYNCHRONOUS_CHILD]: Declare i and j. +2005-05-03 Werner LEMBERG -2004-02-20 Jeff Conrad + * src/devices/grohtml/post-html.cpp, + src/devices/grohtml/html-table.cpp, + src/devices/grohtml/html-text.cpp, src/devices/grohtml/output.cpp: + Replace malloc/free with new/delete/a_delete. - * src/roff/groff/pipeline.c (cmd) [__MSDOS__ || ...]: New global - variable. - (sbasename) [__MSDOS__ || ...]: New function. - (system_shell_name) [__MSDOS__ || ...]: Use a different, more - generic algorithm. - (system_shell_dash_c, is_system_shell) [__MSDOS__ || ...]: Updated. - (run_pipeline) [_WIN32]: Use _XXX variants for some macros instead - of XXX. - Use STDOUT_FILENO instead of hardcoded file handle. - (signal_catcher) [__MSDOS__]: Moved to non-_WIN32 section. + * src/devices/grolbp/lbp.h: Remove superfluous semicolons which + are prohibited with ANSI C++. + (lbpprintf, vdmprintf): Remove useless `inline' keyword (since the + function has a variable number of arguments). -2004-02-19 Werner LEMBERG + * src/preproc/grn/main.cpp (doinput): Change return type to `int'. + Simplify function and update all callers. - * src/roff/troff/div.cpp: Include nonposix.h after troff.h to - avoid warnings w.r.t. redefinition of P_tmpdir for some compilers. +2005-05-02 Werner LEMBERG -2004-02-18 Werner LEMBERG + Undo getopt changes from 2005-04-30. We don't want a dependency + on gettext. - * font/devlj4/Makefile.sub (DEVFILES): Updated to contain all - new font and mapping files. + * src/include/getopt_int.h: Removed. -2004-02-18 Jeff Conrad - Keith Marshall + * src/include/getopt.h, src/include/groff-getopt.h, + src/include/Makefile.sub, src/libs/libgroff/getopt.c, + src/libs/libgroff/getopt1.c: Revert to previous version. - * src/include/nonposix.h (FLUSH_INPUT_PIPE): New macro to empty - an input pipe. This is needed for the MSVC compiler to make troff's - `-o' option work. - * src/roff/troff/div.cpp: Include nonposix.h. - (cleanup_and_exit): Call FLUSH_INPUT_PIPE. + * src/include/nonposix.h (access) [_MSC_VER]: New macro. -2004-02-17 Werner LEMBERG + * src/include/posix.h (F_OK): Define conditionally. - * font/devlj4/generate/special.awk: New script. - * font/devlj4/generate/Makefile (S): Use special.awk. - * font/devlj4/*: Regenerated, including the following new files: - Arial (AR, AB, AI, ABI), Times New Roman (TNRR, TNRB, TNRI, TNRBI), - MS Symbol (SYMBOL), Wingdings (WINGDINGS). - * NEWS: Document new lj4 fonts and revised hpftodit. + * src/devices/grotty/tty.cpp (tty_printer::make_underline): Use + different variable name in second `for' loop to avoid MSVC compiler + problem. -2004-02-17 Paco Andrés Verdú +2005-04-30 Werner LEMBERG - * src/devices/grolbp/lbp.h (vmdvarc): Fix formatting string. + AC_TYPE_SIGNAL from current autoconf can fail if CC=g++. -2004-01-25 Werner LEMBERG + * aclocal.m4 (GROFF_TYPE_SIGNAL): New function. + * configure.ac: Use GROFF_TYPE_SIGNAL, not AC_TYPE_SIGNAL. + * configure, src/include/config.hin: Regenerated. - * src/libs/libgroff/progname.cpp: Replaced with... - * src/libs/libgroff/progname.c: New file. - * src/libs/libgroff/Makefile.sub: Updated accordingly. + * PROBLEMS: Updated. -2004-01-17 Werner LEMBERG - * font/devlj4/generate/Makefile (SYMBOL): Use 9nb28703.tfm. + Update getopt files. -2004-01-16 Jeff Conrad + * src/include/getopt.h, src/libs/libgroff/getopt.c, + src/libs/libgroff/getopt1.c: Updated from GNU libc CVS. - * font/devlj4/generate/wingdings.map, - font/devlj4/generate/symbol.map: Include unnamed glyphs. - Use groff glyph names where possible. - * src/devices/grolj4/lj4_font.man: Minor updates. + * src/include/getopt_int.h: New file (from GNU libc CVS). -2004-01-13 Werner LEMBERG + * src/include/groff-getopt.h: Updated. - * tmac/www.tmac (DC): Handle TTY devices. + * src/include/Makefile.sub (HDRS): Add getopt_int.h. - * doc/webpage.ms: Document viewCVS from ffii.org. - * NEWS, README: Updated. - * src/roff/groff/groff.man: Mention lj4_font man page. + * font/devutf8/NOTES: Updated. - * font/devlj4/generate/Makefile (SYMBOLMAP, WINGDINGSMAP): New - variables. - (FONTS): Add SYMBOL and WINGDINGS. - (SYMBOL, WINGDINGS): New targets. +2005-04-28 Werner LEMBERG -2004-01-13 Jeff Conrad + Bug fix for Win32 relocatable code. Based on a patch from Keith + Marshall. - * src/devices/grolj4/lj4_font.man: New man page. - * src/devices/grolj4/Makefile.sub (MAN5): New variable. - * src/devices/grolj4.man: Mention lj4_font man page. + * src/libs/libgroff/maxpathname.cpp (PATH_MAX): Test for `_MAX_PATH' + also. - * src/utils/hpftodit/hpftodit.cpp (read_map): Handle line comments. - * src/utils/hpftodit/hpftodit.man: Document it. - (CW): New macro. - Remove details about fonts (which are now in lj4_font.man). + * src/libs/libgroff/relocate.c (DEBUG): Define it conditionally. + (searchpath) [_WIN32]: Use `_fullpath', not `realpath'. - * font/devlj4/generate/symbol.map, - font/devlj4/generate/wingdings.map: New files. +2005-04-28 Keith Marshall -2004-01-12 Werner LEMBERG + Correct `gnu.eps' handling for build from distribution tarball, with + separate source and build directories. - * README: Mention ffii's viewcvs access. + * doc/Makefile.sub: (examples.stamp): New target; forces copy of + grnexmpl.g, groff.css and gnu.eps from source to build directory; + generate gnu.eps from gnu.xpm if required; touch examples.stamp. + (prepare_examples): Make it depend on examples.stamp. + (CLEANADD): Add examples.stamp. -2004-01-09 Werner LEMBERG +2005-04-27 Werner LEMBERG - * font/devlj4/generate/special.map: Map MSL 228 to U+221F. + Implement the rule -2004-01-09 Jeff Conrad + position: '(' position ')' - Revert most of the change from 2004-01-03 to better control used - symbol sets. + in pic. - * src/utils/hpftodit/hpftodit.cpp (symbol_set): New structure. - (text_symbol_sets, special_symbol_sets): New arrays. - (symbol_set_table): New global variable. - (read_symbol_sets): Use search order given in the text_symbol_sets - and special_symbol_sets arrays. If command line flag -a is not - given, search both arrays. - (output_charset): Require x_height_tag only for command line flag -i. + * src/preproc/pic/pic.y (position, position_not_place): Handle + additional parentheses. -2004-01-06 Werner LEMBERG + * doc/pic.ms: Updated. - Implement string-valued registers \n[.m] and \n[.M] to return the - name of the current drawing and background color, respectively. +2005-04-23 Larry Jones - * src/roff/troff/symbol.h: Moved to... - * src/include/symbol.h: Here. - Small fixes to make it work outside of the `troff' directory. - * src/roff/troff/symbol.cpp: Moved to... - * src/libs/libgroff/symbol.cpp: Here. - Small fixes to make it work outside of the `troff' directory. + * src/utils/xtotroff/xtotroff.c (MapFont): Fix variable declaration. - * src/include/Makefile.sub (HDRS), src/libs/libgroff/Makefile.sub - (OBJS, CCSRCS), src/roff/troff/Makefile.sub (OBJS, CCSRCS, HDRS): - Updated. +2005-04-18 Werner LEMBERG - * src/include/color.h: Include symbol.h. - (color): Add new field `nm'. - * src/libs/libgroff/color.cpp (color::color): Updated. + * src/roff/groff/pipeline.c: Don't include ctype.h. - * src/roff/troff/dictionary.cpp, src/roff/troff/div.cpp, - src/roff/troff/node.cpp, src/roff/troff/number.cpp, - src/roff/troff/reg.cpp: Don't include symbol.h. +2005-04-13 Werner LEMBERG - * src/roff/troff/env.cpp: Don't include symbol.h. - (environment::get_glyph_color_string, - environment_get_fill_color_string): New member functions. - (init_env_requests): Handle `.m' and `.M' registers. - * src/roff/troff/input.cpp: Don't include symbol.h. - (default_symbol): Moved to symbol.cpp/symbol.h. - (do_glyph_color, do_fill_color, define_color): Pass symbol name - to color constructor. - * src/roff/troff/env.h: Updated. + * src/roff/nroff/nroff.man: Document option `-M'. - * NEWS, man/groff_diff.man, man/groff.man, doc/groff.texinfo: - Document new registers. +2005-04-13 Bruce Lilly -2004-01-05 Werner LEMBERG + * src/roff/nroff/nroff.sh: Make the script accept option `-M'. - * src/roff/troff/nroff.cpp (space_node::get_breakpoints, - space_node::nbreaks): Protect against zero `next' field. +2005-04-01 Kees Zeelenberg + Werner LEMBERG -2004-01-03 Jeff Conrad + Add binary relocation support for Windows platforms. - In hpftodit, use the symbol sets offered in the TFM. + * src/include/Makefile.sub (defs.h): Add `INSTALLPATH'. - * src/utils/hpftodit/hpftodit.cpp (NO_GLYPH): New constant. - (symbol_set, text_symbol_sets, special_symbol_sets, - symbol_set_table): Removed. - (get_printcode): Removed. - (read_symbol_sets): Initialize `symbol_set' field with - `NO_SYMBOL_SET'. - Simplify code to just use the `kind' value. - (output_charset): Improve output formatting. - (dump_symbols): Simplified. + * src/include/relocate.h, src/libs/libgroff/relocate.cpp: New files. -2004-01-02 Werner LEMBERG + * src/libs/libgroff/searchpath.cpp: Handle `relocate'. + (search_path::search_path, search_path::open_file_cautious): Use + `relocate'. - * font/devlj4/generate/text.map: Add more MSL numbers. + * src/libs/libgroff/Makefile.sub (OBJS, CCSRCS), + src/include/Makefile.sub (HDRS): Updated. -2004-01-02 Jeff Conrad +2005-04-01 Werner LEMBERG - * src/utils/hpftodit/hpftodit.cpp (is_decomposed): New macro. - (text_symbol_sets): Add more symbol sets. - (debug_flag): New static variable (moved from `main'). - (get_printcode, show_symset): New functions. - (main): Remove `debug_flag'. - (output_charset): Use `show_symset'. - (dump_symbols): Use `show_symset'. - Print symsets for all glyphs. - (read_map): Actually call `unicode_to_ucode_make' but this time - correctly. + * src/devices/grohtml/post-html.cpp: Don't use strdup/free but + strsave/a_delete. -2004-01-01 Werner LEMBERG + * src/libs/libgroff/font.cpp: Replace strdup with strsave. - * font/devlj4/generate/text.map, font/devlj4/generate/special.map: - Fix placement of comments. + * src/libs/libgroff/maxfilename.cpp: Don't include limits.h since + lib.h already does it. -2004-01-01 Jeff Conrad + * src/libs/libgroff/maxpathname.cpp: New file, defining + path_name_max. - * src/utils/hpftodit/hpftodit.cpp (main): Read map file also if - option `-d' is given. - (output_charset): Improve warning messages to give more information. - (dump_symbols): Make information more precise. - (usage): Updated. - (read_map): Don't call unicode_to_ucode_name; the glyph names must - appear as-is and shouldn't be decomposed. + * src/include/lib.h: Add prototype for path_name_max. -2003-12-31 Werner LEMBERG + * src/libs/libgroff/Makefile.sub (OBJS, CCSRCS): Updated. - * src/utils/hpftodit/hpftodit.cpp (dump_tags): Handle posture_tag. - * font/devlj4/generate/Makefile (IFLAG): Updated to new units. - (FONTS): Add TrueType font families Arial and Times New Roman. - (TNRR, TNRB, TNRI, TNRBI, AR, AB, AI, ABI): New targets. - * font/devlj4/generate/text.map: Fix Unicode values of `fi' and - `fl'. + * src/include/nonposix.h (PATH_EXT): New macro. -2003-12-31 Jeff Conrad +2005-03-28 Werner LEMBERG - * test-groff.in (SEP): Quote value. - * src/roff/troff/node.cpp (suppress_node::tprint): Change type of - `tem' to `char*' to avoid deallocation of a pointer to a constant - object which some compilers don't like. + Add support for double- and zero-width characters in grotty. -2003-12-31 Werner LEMBERG + * src/devices/grotty/tty.cpp (glyph): Add width. + (tty_printer::make_underline, tty_printer::make_bold, + tty_printer::add_character): Add parameter to pass character width. + Update all callers. + (tty_printer::end_page): Increase hpos by actual character width. - * font/devlj4/generate (text.map, special.map): Rewritten to work - with the new hpftodit version. + * font/devutf8/R.proto: Specify zero width for non-spacing + characters. -2003-12-30 Jeff Conrad + * tmac/unicode.tmac: Remove definitions for non-spacing entities. - * src/utils/hpftodit/hpftodit.cpp (output_charset): Emit HP symbol - set and 8bit character code for all glyphs also. + * Makefile.comm (extraclean): Remove more junk files. -2003-12-30 Werner LEMBERG +2005-03-25 Werner LEMBERG - * src/libs/libgroff/strcasecmp.c: Updated from gnulib. + * configure.ac: Undo change from 2005-03-24. + * configure: Regenerated. -2003-12-29 Werner LEMBERG +2005-03-24 Werner LEMBERG - More fixes for MSVC compiler. + * Makefile.in (NOMAKEDIRS): Add contrib/gdiffmk/tests. + (dist): Search Makefile while descending into $(EXTRADIRS). - * doc/Makefile.sub, contrib/mom/Makefile.sub (GROFF_BIN_PATH): Use - $(SEP). + * doc/Makefile.in (.PHONY): Add. + (clean): Don't remove *.png and *.eps. + Don't handle *.gif. + (realclean): Remove *.png and *.eps. + (extraclean): Depend on distclean. - * src/include/nonposix.h (STDIN_FILENO, STDOUT_FILENO, - STDERR_FILENO) [_MSC_VER]: Define conditionally. - (getpid) [_MSC_VER]: Remove. - Include direct.h and process.h conditionally. + * configure.ac: Add copyright. + Handle contrib/pdfmark/Makefile. - * src/roff/troff/node.cpp (suppress_node::tprint): Don't use - parentheses for a_delete. + * configure: Regenerated. - * src/utils/lookbib/lookbib.cpp: Include nonposix.h. +2005-03-18 Larry Kollar - * test-groff: Replaced with... - * test-groff.in: This new template to handle path separator - properly. + Add numbered and definition lists to www.tmac. - * configure.ac: Check for direct.h and process.h. - Generate test-groff script. - * configure, src/include/config.hin: Regenerated. + * tmac/www.tmac (www-ul-level1, www-ul-level2, www-ul-level3, + www-ol-level1, www-ol-level2, www-ol-level3, www-ol-tmp): New + auxiliary string registers. + (www-ul-level, www-ol-level, www-dl-level, www-ol-ctr1, www-ol-ctr2, + www-ol-ctr3, www-dl-shift): New auxiliary number registers. + (www-level): Removed. + (www-level1, www-level2, www-level3): Initialize to empty. + (www-level0, www-level4, www-level5, www-level6, www-level7, + www-level8, www-level9): New string registers. + (www-push-li, www-pop-li): New macros. + (www-push-level, www-pop-level): Renamed to... + (www-push-ul-level, www-pop-ul-level): This. + Updated. + (www-push-ol-level, www-pop-ol-level): New macros. + (ULS, ULE): Updated. + (OLS, OLE, DLS, DLE): New user macros. + (LI): Removed. It is aliased to one of... + (www-li-ul, www-li-ol, www-li-dl): New macros. -2003-12-28 Werner LEMBERG + * tmac/groff_www.man: Document new macros. - Add integral extension glyph. - Add new option `-x' to afmtodit to suppress use of built-in AGL. + * NEWS: Updated. - * font/devhtml/R.proto, font/devutf8/R.proto: Add `u23AE'. +2005-03-18 Werner LEMBERG - * font/devps/generate/textmap: Provide entry for `integralex' to - override (old) PUA value of the AGL. - * font/devps/generate/Makefile (SS): Add afmtodit option `-x'. - * font/devps/*: Regenerated. + * tmac/doc-common (doc-operating-system-NetBSD-2.0.1, + doc-operating-system-NetBSD-2.0.2): New strings. - * src/utils/afmtodit/afmtodit.pl: Add option `-x'. - * src/utils/afmtodit/afmtodit.man, NEWS: Updated. + * tmac/groff_mdoc.man: Updated. -2003-12-27 Werner LEMBERG +2005-03-17 Werner LEMBERG - Add forgotten `coproduct' symbol (already available for DVI). + * doc/Makefile.sub (CLEANADD): Add `groff.html'. - * font/devhtml/R.proto, font/devps/generate/textmap, - font/devps/symbolmap, font/devutf8/R.proto, man/groff_char.man, - src/libs/libgroff/uniglyph.cc, src/libs/libgroff/glyphuni.cpp: Add - U+2210 (\[coproduct]). +2005-03-17 Werner LEMBERG -2003-12-26 Jeff Conrad + * src/libs/libgroff/hypot.c: Renamed to... + * src/libs/libgroff/hypot.cpp: This. Updated to C++. - hpftodit has been extended to handle TrueType metric files and - more glyphs. See hpftodit.man for more details. + * src/libs/libgroff/Makefile.sub (CCSRCS, CSRCS): Updated. - * src/utils/hpftodit/hpftodit.cpp: Include stdio.h, string.h, - ctype.h, and unicode.h. - s/msl/charcode/ everywhere since we now handle Unicode values also. - (equal, NO, YES, MSL, SYMSET, UNICODE, UNICODE): New macros. - Use it where appropriate. - (MULTIPLIER): Replaced with... - (multiplier): New global static variable. - (scale): Updated. - (tag_type): Add more TFM tags. - (tag_name): New array. - (ENUM_TYPE, FLOAT_TYPE): Removed. - (BYTE_TYPE): New value assigned. - (ASCII_TYPE, RATIONAL_TYPE): New enumeration values. - (text_symbol_sets, special_symbol_sets): Extended to cover more - sets. - (check_type): Add return value. - (check_units): Add parameters to get ppi and upem values. - Handle TrueType TFM data. - (output_font_name): New function. - (output_charset): Add parameter to handle TFM type. - Handle TrueType TFMs also. - (em_fract): New macro. - (dump_tags): Be much more verbose and handle more tags. - (dump_ascii, dump_symbol_sets, dump_symbols): New functions. - (hp_msl_to_ucode_name, unicode_to_ucode_name, is_uname): New - functions. - (read_map): Add parameter to handle TFM type. - Handle both MSL and Unicode mappings. - (main): Add two new command line options `-a' and `-q'. - Updated to make use of new functions. - (usage): Updated. + * src/include/lib.h: Updated. - * src/utils/hpftodit/hpuni.cpp: New file. +2005-03-16 Werner LEMBERG - * src/utils/hpftodit/Makefile.sub, src/utils/hpftodit/hpftodit.man: - Updated. + Add workaround for broken hypot() on Interix. -2003-12-25 Werner LEMBERG + * src/libs/libgroff/hypot.c: New wrapper file for `hypot'. - * src/include/nonposix.h (read) [_MSC_VER]: Define. + * src/libs/libgroff/Makefile.sub (OBJS): Add `hypot.o'. + (CSRCS): Add `hypot.c'. -2003-12-24 Werner LEMBERG + * src/include/lib.h: Declare `groff_hypot'. - * src/utils/afmtodit/afmtodit.man: Some reformulations as suggested - by Michail Vidiassov . + * src/preproc/grn/hgraph.cpp: Don't declare `hypot'. + Use `groff_hypot'. -2003-12-20 Werner LEMBERG + * src/preproc/pic/pic.h: Don't declare `hypot'. - * font/devhtml/R.proto: Add u00{47,67}_0306, u00{53,73}_0327, - and u0049_0307. - Add missing latin-2 glyphs. - * font/devutf8/R.proto: Add missing latin-2 glyphs. + * src/preproc/pic/object.cpp (hypot): Use `groff_hypot'. - * tmac/troffrc: Load `composite.tmac' earlier. +2005-03-15 Gaius Mulley - * tmac/dvi.tmac, tmac/ps.tmac, tmac/lbp.tmac: Add u00{47,67}_0306, - u00{53,73}_0327, and u0049_0307. - * tmac/X.tmac: Add u00{47,67}_0306. - * tmac/tty-char.tmac: Use composite glyph names for readability. + * src/devices/grohtml/post-html.cpp + (html_printer::lookahead_for_tables): End .ce properly to avoid a + segfault. - * NEWS: Updated. +2005-03-15 Werner LEMBERG - * src/include/unicode.h: Remove `extern' keywords. + makeinfo 4.8 doesn't produce good HTML output from groff.texinfo. -2003-12-20 Nilgün Belma Bugüner + * doc/fixinfo.sh: New script to postprocess makeinfo's HTML output. - * tmac/latin5.tmac: New file. + * doc/Makefile.in (.texinfo.html): Call fixinfo.sh. -2003-12-19 Werner LEMBERG +2005-03-14 Werner LEMBERG - Add some glyphs needed for Turkish. + Add Cyrillic support to devutf8 and devhtml. - * font/devutf8/R.proto: Add u00{47,67}_0306, u00{53,73}_0327, - and u0049_0307. + * font/devutf8/R.proto, font/devhtml/R.proto: Add Cyrillic blocks. - * tmac/composite.tmac: Add `,' as a synonym for `ac' accent. - * tmac/tty-char.tmac: Add representations for u00{47,67}_0306, - u00{53,73}_0327, and u0049_0307. + * tmac/unicode.tmac: New file. -2003-12-18 Werner LEMBERG + * tmac/tty.tmac: Include unicode.tmac if device is utf8. - * src/devices/grops/ps.cc (ps_output::put_float): Revert change - from 2001-10-04. - Remove trailing zeros. + * tmac/Makefile.sub (NORMALFILES): Add unicode.tmac. -2003-12-17 Werner LEMBERG + * NEWS: Updated. - Make \? transparent to end-of-sentence recognition. +2005-03-02 Keith Marshall - * src/roff/troff/input.cc (non_interpreted_node): Add - `ends_sentence' member function. + * src/libs/libdriver/printer.cpp (check_for_output_error): New + function. It has been introduced to catch peculiar error contexts + on MS-Windows platforms. -2003-12-16 Werner LEMBERG +2005-02-28 Werner LEMBERG - * doc/groff.texinfo: Document `dt' request correctly. - Other minor typographical improvements. + * src/roff/troff/input.cpp (string_iterator::fill): Protect against + null pointer. -2003-12-10 Michail Vidiassov + * tmac/papersize.tmac: Convert `paper' string contents to lowercase. - * src/utils/afmtodit/Makefile.sub (afmtodit): Fix typo. + * configure: Regenerated. -2003-12-10 Richard Stallman + * NEWS: Updated. - * LICENSE: Better wording. +2005-02-28 Keith Marshall -2003-12-09 Werner LEMBERG + Integrate `pdfmark' into normal groff build system; + install macro `pdfmark' packages, build and install `pdfroff', + and PDF format documentation. - * aclocal.m4 (GROFF_BROKEN_SPOOLER_FLAGS): Set default value to 0. - * configure, NEWS: Updated. + * Makefile.comm: Add PDFDOCDIR. -2003-12-08 Werner LEMBERG + * Makefile.in: (MDEFINES) ALT_AWK_PROGS, ALT_GHOSTSCRIPT_PROGS, + pdfdocdir, make_pdfdoc, make_install_pdfdoc: New variables. + (unstall_dirs): Add pdfdocdir. - * FDL: Updated to version 1.2 (from www.gnu.org/copyleft). + * aclocal.m4: (GROFF_GHOSTSCRIPT_PREFS): New function; support + `--with-alt-gs' option, set ALT_GHOSTSCRIPT_PROGS. + (GROFF_GHOSTSCRIPT_PATH): Support `--with-gs' option, force use of + GROFF_GHOSTSCRIPT_PREFS, set GHOSTSCRIPT. + (GROFF_HTML_PROGRAMS): Force use of GROFF_GHOSTSCRIPT_PATH; tidy up. + (GROFF_AWK_PREFS): New function; support `--with-alt-awk' option, + set ALT_AWK_PROGS. + (GROFF_AWK_PATH): New function; support `--with-awk' option, force + use of GROFF_AWK_PREFS. + (GROFF_PDFDOC_PROGRAMS): New function; force use of GROFF_AWK_PATH + and GROFF_GHOSTSCRIPT_PATH, set make_pdfdoc and make_install_pdfdoc. -2003-12-07 Bernd Warken + * configure.ac: Add AC_PREREQ(2.59), GROFF_PDFDOC_PROGRAMS. + Remove GROFF_GHOSTSCRIPT_PATH, (forced by GROFF_PDFDOC_PROGRAMS, and + also by modified GROFF_HTML_PROGRAMS). - * LICENSE: Updated. +2005-02-27 Gaius Mulley -2003-12-07 Werner LEMBERG + * src/devices/grohtml/html-text.cpp (html_text::do_pre): Preserve + paragraph spacing. + (html_text::done_para): Unset `start_space'. + (html_text::remove_para_align): Call `retrieve_para_space' for the + spacing. - * INSTALL: Improved. + * src/devices/grohtml/post-html.cpp (html_printer::emit_raw): Unset + `seen_space'. + (html_printer::do_check_center): Emit vertical space if necessary. -2003-12-05 Keith Marshall + * src/roff/troff/env.cpp (environment_switch): Preserve + `seen_space', `seen_eol', and `suppress_next_eol' while switching + environments. - Use path separator character of target platform for compiled-in - default paths. + * src/roff/troff/node.cpp (suppress_node::suppress_node): Set + `is_special'. - * aclocal.m4 (GROFF_TARGET_PATH_SEPARATOR): New macro. - * configure.ac: Use GROFF_TARGET_PATH_SEPARATOR. - * configure: Regenerated. - * Makefile.in (SEP): Use GROFF_PATH_SEPARATOR. +2005-02-20 Werner LEMBERG -2003-12-05 Werner LEMBERG + * src/preproc/eqn/eqn.man, NEWS: Document various extensions of + eqn. - * src/include/nonposix.h (PATH_SEP_CHAR): New definition. - Replace `PATH_SEP[0]' with `PATH_SEP_CHAR' everywhere. +2005-02-17 Werner LEMBERG -2003-12-04 Bernd Warken + * doc/pic.ms, man/groff.man: Fix typos. - * LICENSE: New file. + * doc/groff.texinfo: Fix typos. + (\LEmacro): Get proper mathematical spacing. -2003-12-03 Werner LEMBERG +2005-02-16 Werner LEMBERG - * src/utils/afmtodit/afmtodit.pl: Comment out code which handles - ligatures present in AFM files since groff currently only - understands some standard ligatures and nothing else. + * aclocal.m4 (GROFF_APPRESDIR_CHECK): Improve warning message. + * configure: Regenerated with autoconf 2.59b. -2003-12-03 Jeff Conrad +2005-02-16 Gaius Mulley - * src/roff/groff/groff.cpp (main): Don't run the spooler if - option -v is given. + * src/devices/grohtml/post-html.cpp (html_printer::is_line_start, + html_printer::start_font): Fix handling of preformatted text. - * src/roff/groff/pipeline.c (run_pipeline) [_WIN32]: Fix error - messages. - Close stdout copy. - Don't use Unix wait flags. +2005-02-15 Gaius Mulley -2003-12-02 Werner LEMBERG + These patches modify the indentation implementation to use `

'. Many thanks to Peter and Larry for + suggesting this solution. Grohtml only uses tables for `.IP' and + related tags when the first operand has a short width. - * src/roff/troff/glyphuni.cpp, src/roff/troff/unicode.cpp, - src/roff/troff/unicode.h, src/roff/troff/uniglyph.cpp, - src/roff/troff/uniuni.cpp: Moved to... - * src/libs/libgroff/glyphuni.cpp, src/libs/libgroff/unicode.cpp, - src/libs/libgroff/unicode.h, src/libs/libgroff/uniglyph.cpp, - src/libs/libgroff/uniuni.cpp: Here. + Similarly, they modify all vertical space code. By default, grohtml + sets up a style sheet which uses no vertical space between `table', + `pre', and `p' tags. It forces spaces when it needs them using + `style="margin-top: 1em"'. - * src/include/Makefile.sub.old (HDRS), - src/libs/libgroff/Makefile.sub (OBJS, CCSRCS), - src/roff/troff/Makefile.sub (HDRS, PBJS, CCSRCS): Updated. + * src/devices/grohtml/html-table.cpp: Include `html-text.h'. + (html_table::emit_table_header, html_table::emit_new_row): + Rewritten. + (html_table::set_space): New function. + (html_indent::html_indent): Don't set `is_used'. + (html_indent::begin): Rewritten. + (html_indent::end): Remove code in function. + + * src/devices/grohtml/html-table.h: Updated. + (html_table): Make `out' public. + + * src/devices/grohtml/html-text.cpp (html_text::html_text): + Initialize `start_space' with FALSE. + (html_text::end_tag) : Updated. + (html_text::issue_tag): Add argument to handle space style. + (html_text::start_tag) : Updated. + (html_text::flush_text): Don't set `start_space'. + (html_text::push_para): Don't set `p->really_issued'. + (html_text::do_emittext): Updated. + (html_text::do_para): Add paremeter to handle space. + Update all callers. + (html_text::retrieve_para_space): New function. -2003-12-01 Keith Marshall + * src/devices/grohtml/html-text.h (STYLE_VERTICAL_SPACE): New macro. + (tag_definition): Remove `really_issued'. + (html_text): Updated. + + * src/devices/grohtml/post-html.cpp (html_printer): Add variables + `current_column' and `row_space'. + Update constructor. + (html_printer::emit_raw, html_printer::write_header, + html_printer::do_indent, html_printer::do_check_center, + html_printer::do_tab_ts): Handle vertical space. + (html_printer:do_tab_te, html_printer::do_end_para): Call + `remove_para_space'. + (html_printer::do_col): Rewritten. + (html_printer::flush_globs): Remove debugging code. + (html_printer::is_line_start): New function. + (html_printer::start_font): Use `is_line_start'. + (html_printer::writeHeadMetaStyle): New function. + (html_printer::do_file_components, html_printer::~html_printer): + Call `writeHeadMetaStyle'. + + * tmac/www.tmac (www-handle-percent): New macro. + (MPIMG): Handle percent values for width and height parameters. + (DC): Updated. - * src/preproc/htlp/pre-html.cpp (__tmpfile): Renamed to - `DEBUG_FILE'. - Updated all users. + * tmac/groff_www.man: Updated. -2003-12-01 Werner LEMBERG +2005-02-14 Werner LEMBERG - * groff.texinfo: Document special behaviour of `.vs 0'. - Improve documentation of `cflags' request. - * NEWS: Updated. + * src/utils/afmtodit/afmtodit.pl: Remove an incorrect `my' from + $psname and $italic_angle. + Immediately restart file input loops if `split' returns an empty + array. + +2005-02-13 Michail Vidiassov + Werner LEMBERG + + Update afmtodit to better support Unicode (Michail). + Update afmtodit to use Perl 5 syntax (Werner). + + * src/utils/afmtodit/afmtodit.pl: Don't use `getopts.pl' but + `Getopts::Std'. + Decorate variables with `my' where necessary. + Use `defined' where necessary to avoid warnings. + Don't use `do' for subroutine calls. + Other minor syntax updates. + Check for both `uXXXX[X[X]]' and `uniXXXX'. + Handle glyph variants properly. + (%unicode_decomposed, %AGL_to_unicode): Don't use `u' prefix in + strings. -2003-11-29 Werner LEMBERG + * src/utils/afmtodit/afmtodit.man: Updated. - * font/devlj4/generate/Makefile (CORONET): Use correct TFM. - * font/devlj4/CORONET: Regenerated. +2005-02-13 Werner LEMBERG -2003-11-24 Werner LEMBERG + Make groff.texinfo work with texinfo 4.8. - * src/roff/troff/env.cpp (hyphen_trie::read_patterns_file): Fix loop - if processing hyphenation patterns in traditional mode. - Improve error messages. + * doc/groff.texinfo (@Var): Use @r and @slanted. + (@defdummy, @Def*): Use @c to avoid empty lines. + (\angles): Replaced with... + (\Langlemacro, \Ranglemacro): New TeX macros. + (@Langlemacro, @Ranglemacro): New variables defined with @set. + (@angles): Use @Langlemacro and @Ranglemacro. + (\LE): Replaced with... + (\LEmacro): New TeX macro. + (@LEmacro): New variable defined with @set. + (@LE): Use @LEmacro. + (@Lparenmacro, @Rparenmacro, @Lbrackmacro, @Rbrackmacro): New + variables defined with @set. + (@lparen, @rparen, @lbrack, @rbrack): Replaced with... + (@Lparen, @Rparen, @Lbrack, @Rbrack): New macros. + Update all callers. -2003-11-20 Werner LEMBERG + Other minor updates. - * src/roff/troff/node.cpp (troff_output_file::put_char_width, - troff_output_file::put_char): Fix type of local variable `c'. + * doc/texinfo.tex: Update to texinfo version 4.8. -2003-11-19 Werner LEMBERG + * README.CVS: Updated. - * src/roff/groff/pipeline.c (P): Removed. Updated all function - declarations. - (i_to_a): Removed. libgroff already provides this function. - (run_pipeline) [_WIN32]: Don't use itoa but i_to_a. +2005-02-09 Alejandro López-Valencia (tiny change) -2003-11-18 Keith Marshall + * doc/groff.texinfo (ms Document Control Registers): Document `HY' + and `FAM' registers. - * src/roff/groff/pipeline.c (xstrsignal): Fix usage of - HAVE_DECL_SYS_LIST. +2005-02-05 Werner LEMBERG -2003-11-17 Werner LEMBERG + * tmac/groff_mdoc.man, tmac/doc-common, tmac/doc-ditroff, + tmac/doc-nroff, tmac/doc-old.tmac, tmac/doc-syms, tmac/doc.tmac: + Update BSD license. - * COPYING: Use correct version. +2005-02-01 Werner LEMBERG -2003-11-11 Werner LEMBERG + * src/roff/groff/groff.man: Add information about paper size. - LynxOS 4.0.0 doesn't declare vfprintf. +2005-01-25 Werner LEMBERG - * configure.ac: Check for vfprintf. - * configure: Regenerated. - * src/include/lib.h: Handle `NEED_DECLARATION_VFPRINTF'. - * src/include/config.hin: Regenerated. + * src/roff/nroff/nroff.sh: Handle `*.ISO8859-1' in locale. From + NetBSD bin/29114. -2003-11-10 Werner LEMBERG +2005-01-22 Ruslan Ermilov - LynxOS 4.0.0 has snprintf (without declaration) but no vsnprintf. + * tmac/doc.tmac (Sm): Improved. It didn't work properly in many + cases. + (Re): Emit a warning if called without `.Rs'. + (doc-finish-reference): Use parameter for decreasing + `doc-reference-count'. + (doc-print-reference): Pass specific count parameters to + `doc-finish-reference'. - * configure.ac: Check for vsnprintf. - * configure: Regenerated. - * src/include/lib.h: Handle `NEED_DECLARATION_VSNPRINTF' and - `HAVE_VSNPRINTF'. - * src/include/config.hin: Regenerated. +2005-01-21 Werner LEMBERG -2003-11-09 Werner LEMBERG + * src/libs/libdriver/input.cpp (delete_current_env, do_file): + Reset pointers to zero after deallocation. This fixes a crash + if a driver is called with multiple input files. Reported by + Ken Chilton . - * aclocal.m4: Updated syntax to autoconf 2.59. - (GROFF_HTML_PROGRAMS): Use AC_FOREACH. - Don't check for gsos2. - (GROFF_SRCDIR, GROFF_BUILDDIR): Removed. autoconf 2.59 provides - working abs_top_srcdir and abs_top_builddir. + * src/devices/grops/grops.man: Add more info on DSC. - * configure.ac: Updated syntax to autoconf 2.59. - Don't call GROFF_SRCDIR and GROFF_BUILDDIR. - Replace call to AC_DECL_SYS_SIGLIST with call to AC_CHECK_DECLS. - * configure: Regenerated. +2005-01-17 Ruslan Ermilov - * Makefile.in, doc/Makefile.in: s/@top_srcdir@/@abs_top_srcdir@/, - s/@groff_top_builddir@/@abs_top_builddir@/. + * tmac/doc-common (Dd), tmac/doc-ditroff (gX, doc-setup-header): + Remove dead code. - * src/roff/groff/pipeline.c (xstrsignal): - s/SYS_SIGLIST_DECLARED/HAVE_DECL_SYS_SIGLIST/. +2005-01-17 Werner LEMBERG -2003-11-07 Werner LEMBERG + * src/roff/troff/div.cpp (top_level_diversion::space): Protect + against division by zero. - * src/devices/grodvi/dvi.cpp (draw_dvi_printer::draw) ['a']: Always - make start angle smaller than end angle to circumvent a bug in tpic - handling of some versions of dvipdfm (and dvipdfmx). +2005-01-13 Ruslan Ermilov -2003-10-30 Werner LEMBERG + * tmac/doc.tmac (Ef): Restore doc-curr-font and doc-curr-size. - * src/devices/grops/grops.man: Improve section on creating EPS. +2004-12-19 Werner LEMBERG -2003-10-29 Werner LEMBERG + * install-sh: New version; taken from texinfo CVS. - * contrib/pic2graph/pic2graph.sh: Fix typo (-P-letter -> - -P-pletter). +2004-12-17 Werner LEMBERG -2003-10-28 Werner LEMBERG + * tmac/devtag.tmac: Protect against loading twice. + Protect agains compatibility mode. + * tmac/www.tmac: Protect against loading twice. + Load `devtag.tmac' before switching off compatibility mode. + * tmac/an-old.tmac, tmac/s.tmac: Load `devtag.tmac'. - * doc/groff.texinfo: Fix documentation of `.if'. +2004-12-16 Mike Bianchi -2003-10-27 Michail Vidiassov + * configure.ac: Produce `contrib/gdiffmk/tests/runtests'. + * configure: Updated. - * src/utils/afmtodit/afmtodit.pl: Handle unmapped characters of - the form `uniXXXX' also. +2004-12-15 Thomas Klausner -2003-10-27 Werner LEMBERG + * tmac/doc-syms, tmac/groff_mdoc.man: Add `libpam' library. - * contrib/eqn2graph/eqn2graph.sh, contrib/grap2graph/grap2graph.sh, - contrib/pic2graph/pic2graph.sh: Implement secure management of - temporary files. - Pass `-P-pletter' to groff to avoid data outside of the converted - area -- some versions of `convert' (for example 5.3.8) don't check - the bounding box of the image but always use a fixed image size - (letter paper format). - * contrib/eqn2graph/eqn2graph.man, contrib/grap2graph/grap2graph.man, - contrib/pic2graph/pic2graph.man: Updated. +2004-12-15 Werner LEMBERG - * src/roff/groff/groff.man: Document $TMP and $TEMP. + Make `test-groff' work again -- previously, wrong paths have been + used. Additionally, it can now be called from anywhere. -2003-10-26 Werner LEMBERG + * test-groff.in: Don't test for groff binary. This is no longer + necessary since the proper paths are determined by `configure'. + (EXEEXT): Removed. No longer used. + (srcdir, builddir): Use values provided by the configure script. + (XENVIRONMENT): Updated. - * src/preproc/pic/troff.cpp (troff_output::simple_circle, - troff_output::simple_ellipse, troff_output::simple_arc, - troff_output::simple_line, troff_output::simple_spline, - troff_output::simple_polygon): Insert a space before arguments. - (troff_output::set_fill): Emit `\&' before `\D'Fg...' since the - latter doesn't produce a node, so the following `.sp -1' would do - the wrong thing. - Don't emit `.sp -1' after \M. This also doesn't produce a token - (and we don't have to care about compatibility mode). - (troff_output::set_color, troff_output::reset_color): Don't emit - `.sp -1' after \M and \m. + * INSTALL: Updated. - * src/roff/troff/input.cpp (old_have_input): New global variable. - (input_stack::get): Handle `old_have_input'. - (process_input_stack) : Call - `trapping_blank_line' depending on `old_have_input', not - `have_input'. +2004-12-14 Gaius Mulley -2003-10-20 Keith Marshall + Make .tag and .taga work for all devices (but only grohtml actually + handles them). - * src/libs/libgroff/tmpfile.cpp [__MSDOS__, _Win32] - (WIN32_TMPDIR_ENVVAR, MSDOS_TMPDIR_ENVVAR): New macros, providing - default directory names for temporary files. - [__MSDOS__, _Win32] (temp_init::temp_init): Use them. + * src/devices/grohtml/post-html.cpp: s/html-tag/devtag/. + (text_glob::is_br, page::add_tag, html_printer::troff_tag, + html_printer::handle_assertion): Don't use hard-coded string + lengths. + (html_printer::lookahead_for_table): Reset `tbl' properly if + necessary. + (html_printer::devtag): New function, handling `devtag'. + (html_printer::special): Don't handle `html-tag'. - * src/roff/groff/pipeline.c [__MSDOS__]: Include stdlib.h. - [__MSDOS__] (run_pipeline): Honour environment variables. - Don't use `tmpnam' but `tempnam' to work around messy - implementation. + * src/include/printer.h, src/libs/libdriver/printer.cpp + (printer::devtag): New virtual function. - * README.MinGW: New file. + * src/libs/libdriver/input.cpp (parse_x_command) <'X'>: Handle + `devtag'. -2003-10-16 Werner LEMBERG + * src/roff/troff/env.cpp, src/roff/troff/mtsm.cpp, + src/roff/troff/node.cpp: s/html-tag/devtag/. - * src/preproc/html/pre-html.cpp (write_upto_newline): Don't use - `(*t)->next' without testing validity of `*t'. - (usage): Make it more readable. + * src/roff/troff/input.cpp (tag, taga): Always call + curenv->add_node. -2003-10-16 Keith Marshall + * tmac/an-old.tmac, tmac/s.tmac, tmac/troffrc-end: Use DEVTAG* + macros instead of HTML-TAG*. - Make html device run under both MS-DOS and Win32. + * tmac/devtag.tmac: New file, defining the DEVTAG-* macros. - * src/preproc/html/pre-html.cpp (MAY_FORK_CHILD_PROCESS, - MAY_SPAWN_ASYNCHRONOUS_CHILD): New macros to control whether - spawn or fork+exec has to be used, and whether parent must sleep - until the child process terminates. Used in - `char_buffer::run_output_filter'. - (copyofstdoutfd): Removed. - (char_buffer): Replace `write_file_html' and `write_file_troff' - member functions with `emit_troff_output' and `run_output_filter'. - (DEVICE_FORMAT, HTML_OUTPUT_FILTER, IMAGE_OUTPUT_FILTER): New - macros. - (replaceFd): Replaced with... - (set_redirection): New auxiliary function. - (waitForChild): Replaced with... - (save_and_redirect): New auxiliary function for. + * tmac/www.tmac: Load devtag.tmac. + Replace HTML-TAG* macros with DEVTAG* macros. + (HTML, HTML-NS): Changed definitions. + (URL): Use HTML-NS. + (HTML-TAG, HTML-TAG-NS, HTML-TAG-NEXT): Removed. - (char_buffer::do_html, char_buffer::do_image): Simplified, using new - functions. + * tmac/Makefile.sub (NORMALFILES): Add devtag.tmac. -2003-10-14 Keith Marshall +2004-12-10 Werner LEMBERG - * aclocal.m4 (GROFF_SYS_NERR): Check stdlib.h also. - (GROFF_LIBC): New function. - * configure.ac: Call GROFF_LIBC. - Check for `kill'. - * configure: Regenerated. + Import Mike's `gdiffmk' package. - * src/include/lib.h: Handle __MINGW32__. - * src/include/nonposix.h [_MSC_VER]: Handle __MINGW32__. - Add macro for `pipe'. - Define P_tmpdir. + * contrib/gdiffmk/*: New files. + * Makefile.in (OTHERDIRS): Add contrib/gdiffmk. + * NEWS: Updated. - * src/roff/groff/pipeline.c (run_pipeline): Handle `no_pipe' - correctly. +2004-12-08 Werner LEMBERG - * src/utils/indxbib/signal.c (handle_fatal_signal) [!HAVE_KILL]: - Implement. + Import Keith's `pdfmark' package. Integration is very preliminary. -2003-10-13 Werner LEMBERG + * contrib/pdfmark/*: New files. + * Makefile.in (OTHERDIRS): Add contrib/pdfmark. + * NEWS: Updated. - Finally fix change 2003-08-26, based on ideas from Chuck Silvers - . +2004-12-07 Gaius Mulley - * contrib/mom/Makefile.sub: Use a stamp file in the `examples' - directory. + Fix a bug with title handling in HTML. -2003-10-12 Werner LEMBERG + * src/devices/grohtml/post-html.cpp (text_glob::is_nf, + text_glob::is_fi, text_glob::is_ce): Use strlen to compute string + length. + (html_printer::handle_tag_within_title): New function. + (html_printer::do_title): Use it. - * src/roff/groff/groff.cpp (help), src/devices/grops/ps.cpp (usage), - src/roff/troff/input.cc (usage): Updated. + * tmac/s.tmac (TL): Don't set `need_eo_tl'. + (cov*tl-au-print): Emit `.eo.tl' tag. - * NEWS, doc/groff.texinfo: Updated. +2004-12-05 Alejandro López-Valencia -2003-10-12 Peter Miller + * man/groff_char.man: Minor imrovements. - * src/libs/libgroff/searchpath.cpp - (search_path::open_file_cautious): New function which also handles - `-' as stdin and stdout depending on the access mode. - * src/include/searchpath.h (search_path): Updated. +2004-12-04 Werner LEMBERG - * src/devices/grops/ps.cpp (main): Handle new `-I' switch. - * src/devices/grops/ps.h: Include `searchpath.h'. - * src/devices/grops/psrm.cpp (resource_manager::supply_resource): - Open resource file with `include_search_path.open_file_cautious'. - * src/devices/grops/grops.man: Document new `-I' switch. + * src/preproc/eqn/eqn.man: Revised. - * src/devices/grodvi/dvi.cpp (main), src/devices/grolbp/lbp.cpp - (main), src/devices/grolj4/lj4.cpp (main), - src/devices/grotty/tty.cpp (main): Ignore new `-I' switch. +2004-11-25 Werner LEMBERG - * src/preproc/soelim/soelim.cpp (include_list_length, include_list): - Replaced with... - (include_search_path): New global variable. - (include_path_append): Removed. - (main): Use `include_search_path.command_line_dir' to handle `-I'. - (do_file): Simplify, using new - `include_search_path.open_file_cautious'. + * src/utils/xtotroff/xtotroff.c: Reformat to be similar to other + groff source files. + Include config.h. + Include limits.h. + Remove X_NOT_STDC_ENV conditional. + (Version_string, program_name): New global variables. + (groff_flag): Removed. + (MapFont): Updated. + (usage): Take a stream as argument. + Use `program_name'. + Update all callers. + (main): Add `long_options' array for `--help' and `--version'. + Make `-g' a dummy option. + Handle `-v' and unknown options. + Remove unused `position' variable. - * src/roff/groff/groff.cpp (print_commands): Accept file handle as - parameter. - (main): Pass arguments to `-I' to both troff and devices. - Improve handling of `-V'. - * src/roff/groff/groff.man: Document changes to -I and -V. + * src/utils/xtotroff/Makefile.sub (MAN1): Define. + (XLIBS): Add LIBGROFF. - * src/roff/troff/input.cpp (include_search_path): New global - variable. - (next_file, source, ps_bbox_request, transparent_file, - process_input_file): Use new - `include_search_path.open_file_cautious'. - (main) Handle `-I' switch. - * src/roff/troff/node.cpp (troff_output_file::really_copy_file): - Use new `include_search_path.open_file_cautious'. - * src/roff/troff/node.h: New extern symbol `include_search_path'. - * src/roff/troff/troff.man: Document new `-I' switch. + * src/utils/xtotroff/xtotroff.man, src/utils/xtotroff/Makefile.in: + New files. -2003-09-15 Ruslan Ermilov + * src/devices/xditview/Dvi.c (default_font_map): Split into three + parts to avoid compiler warning. + (resources): Don't initialize with `default_font_map'. + (ClassInitialize): Initialize first element of `resources'. - Support multiple calls of .Lb in LIBRARY section. + * src/devices/xditview/Makefile.sub (devdir, xtotroff, DPIS, fonts): + Removed. - * tmac/doc-common (doc-in-library-section): New register. - (doc-section-library): New string. - (Sh): Set `doc-in-library-section'. - (Rd): Updated. - * tmac/doc-syms (Lb): Insert breaks before and after arguments - if in LIBRARY section. - * tmac/doc.tmac (doc-save-global-vars): Updated. - * NEWS, tmac/groff_mdoc.man: Updated. + * src/utils/lkbib/lkbib.man, src/utils/lookbib/lookbib.man, + src/utils/pfbtops/pfbtops.man: Revised, updated. -2003-09-14 Ruslan Ermilov + * configure.ac: Generate src/utils/xtotroff/Makefile. + * configure: Regenerated. - * tmac/doc-common (doc-default-operating-system): New variable. - (Os): Use it. +2004-11-24 Werner LEMBERG -2003-09-08 Werner LEMBERG + First fixes to get produce HTML. - * tmac/doc.tmac (doc-reset-reference): Handle data for `%I' also. + * src/devices/grohtml/post-html.cpp (generate_img_src): Add `alt' + attribute. -2003-08-31 Werner LEMBERG + * tmac/www.tmac (IMG, PIMG, MPIMG): Add `alt' attribute. + (HR, LI): Use `HTML

', not `HTML'. - * contrib/mom/Makefile.sub: Fix last change to make it really work. - * Makefile.comm: Use `test ... ||' in favor of `if test ...; then'. - (install_dev, uninstall_dev): Check whether $(DEVSCRIPTS) and - $(DEVFILES) are not empty. - * Makefile.in: Use `test ... ||' in favor of `if test ...; then'. + * doc/webpage.ms: Minor updates. -2003-08-26 Chuck Silvers +2004-11-23 Larry Kollar - * contrib/mom/Makefile.sub (prepare_make_examples): Make it work - with parallel runs of `make'. + Add option -S grohtml to determine the file split level. -2003-08-23 Stephen Gildea + * src/devices/grohtml/post-html.cpp (split_level): New global + variable. + (html_header::determine_header_level): Use split_level. + (main): Handle `-S' command line option. + Sort options. - * src/preproc/ref/ref.cpp (reference::compute_sort_key): Always - insert SORT_SEP. With certain combinations of sort specifications, - refer sorted entries in the wrong order. In particular, entries - with a missing field should be be sorted before all entries that - have that field, before refer looks to the next field. + * src/preproc/html/pre-html.cpp (scanArguments): Updated. -2003-08-23 Werner LEMBERG + * src/devices/grohtml/grohtml.man: Document it. + Sort options. - * src/utils/pfbtops/Makefile.sub (LINK.c): Define it so that the - g++ linker is used. Reported by Mark J. Reed - . + * NEWS: Document it. -2003-08-16 Heinz-Jürgen Oertel +2004-11-23 Y T - Add key character `x' to tbl which makes tbl call a user-defined - macro on a table cell. + * tmac/s.tmac (ref*add-V, ref*add-N): New macros for handling + the volume and number refer entries. - * src/preproc/tbl/table.h (entry_modifier): Add `macro'. - * src/preproc/tbl/table.cpp (block_entry::do_divert): Call - `set_modifier' after printing the compatibility request. - (set_modifier): Print call to `m->macro' if not empty. - * src/preproc/tbl/main.cpp (entry_format::debug_print): Handle - `macro'. - (process_format): Implement cases `x' and `X'. - * src/preproc/tbl/tbl.man, NEWS: Updated. +2004-11-22 Werner LEMBERG -2003-08-15 Werner LEMBERG + * src/devices/grohtml/html-table.cpp + (html_table::emit_table_header): Don't emit `cols' attribute which + doesn't exist in HTML 4.0 and is thus invalid. - * doc/groff.texinfo: Minor fixes. + * NEWS: More minor fixes and updates. -2003-08-09 Werner LEMBERG +2004-11-18 Werner LEMBERG - * tmac/an-old.tmac [cR]: Fix redefinition of `bp'. + * tmac/www.tmac (HTML-NS, HTML-TAG-NS, HTML-TAG-NEXT): Simplified. + (HTML

): Minor clean-up. -2003-08-07 Werner LEMBERG + * tmac/groff_www.man: Updated. - * doc/Makefile.sub: Not all shells expand wildcards in the `for' - argument list to nothing if there is no file to match. Use `ls' as - a protection, similar to autoconf. + * src/devices/grohtml/grohtml.man: Revised and updated. - * Makefile.comm (install_dev, uninstall_dev): Protect `for' against - empty argument lists. + * NEWS: Updated. - * doc/groff.texinfo: Improve documentation how vertical spacing - and line breaks interact. - Other minor fixes. +2004-11-18 Gaius Mulley - * tmac/www.tmac: Initialize `www-htmlimage-gap'. + * src/devices/grohtml/post-html.cpp (html_printer::do_heading): + Fix space insertion. + (html_printer::do_links): Fix rules generation around automatic + heading links. -2003-08-03 Werner LEMBERG + * tmac/www.tmac (LK): Use HTML-TAG-NS. + (HR): Simplify. + No longer emit empty line for non-HTML devices. - * NEWS, src/devices/grops/grops.man: -b16 is necessary to produce - EPS (using eps2eps or similar programs to compute the bounding box). +2004-11-17 Werner LEMBERG -2003-07-24 Werner LEMBERG + * doc/Makefile.in (prepare_examples, webpage.html): Handle + `groff.css'. - * doc/groff.texinfo: Use the new @/ command to avoid overlong lines. - * doc/texinfo.tex: Updated from texinfo 4.6. - * README.CVS: From now on we need texinfo 4.6. + * doc/Makefile.sub (EXAMPLEFILES, CLEANNOTSRCDIRADD, + prepare_examples, webpage.html): Handle `groff.css'. -2003-07-23 Werner LEMBERG +2004-11-15 Werner LEMBERG - Add requests `dei1' and `ami1' for completeness. + * NEWS, README, doc/webpage.ms: Updated. - * src/roff/troff/input.cc (calling_mode): Remove - CALLING_DISABLE_COMP. - (comp_mode): New enumeration. - (do_define_string, define_string, define_nocomp_string, - append_string, append_nocomp_string): Updated. - (do_define_macro): Add third parameter. - (define_macro, define_nocomp_macro, define_indirect_macro, - append_macro, append_nocomp_macro, append_indirect_macro): Updated. - (define_indirect_nocomp_macro, append_indirect_nocomp_macro): New - functions. - (ignore): Updated. - (init_input_requests): Add `dei1' and `ami1'. + * tmac/www.tmac (HTML, HTML-TAG): Minor clean-ups. - * tmac/trace.tmac: Handle de1 and am1. - (de): Improve tracing message. - (am): Add missing `do'. - (return): Use de1. +2004-10-30 Gaius Mulley - * NEWS, man/groff_diff.man, man/groff.man, doc/groff.texinfo: - Document new requests. + * src/include/printer.h (printer): Remove virtual function + `round_width'. + Update all source files. -2003-07-22 Heinz-Jürgen Oertel + * src/devices/grohtml/post-html.cpp (html_printer): New member + function `round_width'. - Add option -G to .MPIMG to insert a gap between text and the image. +2004-10-20 Tadziu Hoffmann - * tmac/www.tmac (www-finish-left-po, www-finish-right-ll, - www-finish-left-ll): Updated. - (www-image-just, www-image-gap, www-htmlimage-gap): New variables. - (MPIMG): Make option -L and -R optional. - Implement option -G. + * src/preproc/tbl/table.cpp (table::do_row): Fix handling of the `d' + column key letter suffix. -2003-07-22 Gaius Mulley +2004-10-14 Werner LEMBERG - * src/devices/grohtml/post-html.cpp - (html_printer::do_file_components): Don't use `stdout' as lvalue - since it can be a macro. + * Makefile.in (check): Depend on `site.exp' and `docheck'. + (docheck): Run dejagnu's `runtest' if it exists. + (site.exp): Create dejagnu configuration file. -2003-07-22 Werner LEMBERG + * Makefile.sub (DISTCLEANFILES): Add files related to dejagnu. - * src/libs/libgroff/strerror.c: Include errno.h to be in sync with - the corresponding test in aclocal.m4. +2004-10-13 Werner LEMBERG -2003-07-21 Werner LEMBERG + * src/devices/grohtml/html-text.cpp (html_text_get_alignment), + src/devices/grohtml/post-html.cpp (make_val, + html_printer::handle_state_assertion): Fix compiler warnings. - * src/preproc/html/pre-html.cpp (TRANSPARENT): Don't use colour - names but RGB values directly. Otherwise pnmtopng depends on - an external file `rgb.txt' which maps colour names to values. + * src/roff/troff/div.cpp: Include `stringclass.h' and `mtsm.h'. + (diversion::diversion): Fix order of initializers. -2003-07-20 Werner LEMBERG + * src/roff/troff/div.h: Don't include `mtsm.h'. - * aclocal.m4 (GROFF_SYS_ERRLIST): Include stdlib.h for MinGW. - * configure, src/include/config.hin: Regenerated. + * src/roff/troff/env.cpp: Include `stringclass.h' and `mtsm.h'. + (environment::environment): Fix order of initializers. + (environment::make_tag, environment::construct_format_state): Fix + compiler warnings. - * src/libs/libgroff/strerror.c: Include stdlib.h for MinGW. + * src/roff/troff/input.cpp: Include `stringclass.h' and `mtsm.h'. + (input_iterator::input_iterator, macro::macro): Fix order of + initializers. + + * src/roff/troff/mtsm.cpp: Include only necessary header files. + (state_set::add, state_set::val): Fix compiler warnings. + + * src/roff/troff/mtsm.h: Don't include `stringclass.h'. + (bool_value_state, int_value_state, units_value_state, + string_value_state): Remove comma after last element which causes + an error with g++ 3.3.3. + + * src/roff/troff/node.cpp: Include `stringclass.h'. + (hline_node::hline_node, vline_node::vline_node, + space_char_hmotion_node, left_italic_corrected_node): Fix compiler + warnings. + (zero_width_node::zero_width_node): Fix order of initializers. -2003-07-19 Werner LEMBERG + * src/roff/troff/node.h: Don't include `mtsm.h'. + (hmotion_node): Fix compiler warnings. - * PROBLEMS: Add solution for UTF-8 problem with hyphens. + * src/roff/troff/number.cpp: Include `stringclass.h' and `mtsm.h'. -2003-07-18 Werner LEMBERG +2004-10-12 Gaius Mulley - * *.man: Switch to non-compatibility mode temporarily if GNU - syntax extensions are used in the particular man page. + * doc/groff.css: New file. - * PROBLEMS: Add solutions for SGR problems. + * doc/webpage.ms: Use `groff.css'. + Other small fixes. -2003-07-17 Werner LEMBERG + * tmac/an-old.tmac (need_eo_h): New number register. + (TH): Emit `.eo.tl' tag after title. + (SH): Set `need_eo_h'. + (an-trap): Handle `need_eo_h'. + (an-do-tag): s/HTML-TAG-NS/HTML-TAG-NEXT/. - Don't ignore grotty's command line options if \X'tty: sgr ...' is - used to change the drawing scheme. + * tmac/s.tmac (need_eo_h, need_eo_tl): New number registers. + (TL): Always start diversion. + Updated. + (@AI): Always call `par@reset'. + (@AB): Update code for -Thtml. + (cov*tl-au-print): Handle -Thtml. + (par@reset): Handle `need_eo_tl', `need_eo_h'. + (@IP): Simplified. + (@IT-html): Removed. + (@SH): Set `need_eo_h' for -Thtml. + (par@TL): s/HTML-TAG/HTMl-TAG-NS/. + Set `need_eo_tl'. + (@NH): s/HTML-TAG/HTMl-TAG-NS/. + Set `need_eo_h' for -Thtml. + (@EQ, @EN): Don't handle -Thtml specially. + (par@load-init): Don't handle -Thtml specially. + + * tmac/www.tmac (www:paraspace): New macro. + (HTML-NS, HTML-TAG-NS): Use new `tag' request. + (HTML

, HTML-TAG-NEXT): New macros. + (HnE): Emit tag `.eo.h' instead of break. + (HR): s/HTML-NS/HTML/. + (www-end-nowhere): End diversion only if `www-html' not set. + Emit `.eo.tl' tag. + (ULS, ULE): s|HTML|HTML

|. + (LI): Call `www:paraspace'. + (HEAD): New macro. + +2004-10-11 Gaius Mulley + + * src/roff/troff/request.h (macro): Make `p' public. + New variable `is_a_diversion'. + New member function `is_diversion'. + + + * src/devices/grohtml/html.h (simple_output): New member function + `force_nl'. + + * src/devices/grohtml/html-table.cpp (tabs::compatible): Fix + computation of `total'. + (tabs::check_init): New function. + (html_table::emit_table_header): Emit style data. + (html_table::insert_column): Improved. + + * src/devices/grohtml/html-table.h: Updated. + + * src/devices/grohtml/html-text.cpp (html_text::html_text): + Initialize `start_space' with TRUE. + (html_text::end_tag, html_start_tag): Fix `P_TAG' and `PRE_TAG' + cases. + (html_text::flush_text): Set `start_space' flag. + (html_text::uses_indent, html_text::remove_para_space, + html_text::get_alignment): New functions. + (html_text::push_para): Updated. + (html_text::do_para): Check for empty argument. + Don't set `space_emitted'. + (html_text::do_space, html_text::emit_space): Updated. + + * src/devices/grohtml/html-text.h (tag_definition): New variable + `really_issued'. + (html_text): New member function `uses_indent', `remove_para_space', + `get_alignment'. - * src/devives/grotty/tty.cpp (bold_flag_option, - underline_flag_option, italic_flag_option, reverse_flag_option, - bold_underline_mode_option): New global variables. - (update_options): New function. - (tty_printer::special): Call update_options. - (main): Don't set xxx_flag but xxx_flag_option, then call - update_options. + * src/devices/grohtml/output.cpp (simple_output::force_nl): New + function. + (simple_output:nl): Always emit `\n'. -2003-07-14 Werner LEMBERG + * src/devices/grohtml/post-html.cpp: Include `string.h'. + (BASE_POINT_SIZE): Removed. + (base_point_size, head_info): New global variables. + (text_glob): New member functions `is_ll', `is_tl', `is_eo_tl', + `is_eo_h'. + (text_glob::is_nf, text_glob::is_fi): Handle `.fi 0' and `.fi 1' + tags, respectively. + (page::add_and_encode): Pass additional parameter for tag flag. + (assert_pos): New structure. + (assert_state): New class. + (html_printer): Remove `indentation', `prev_indent'. + Add variables `troff_indent', `device_indent', `temp_indent'. + Add variables `seen_indent', `next_indent', `seen_pageoffset', + `next_pageoffset', `seen_linelenght', `next_linelength', + `seen_center', `next_center', `seen_space', `seen_break', `as'. + Add member functions `do_check_center', `do_space', `do_head', + `get_troff_indent', `restore_troff_indent', `handle_assertion', + `handle_state_assertion', `do_end_para', `set_char_and_width'. + Change argument to `do_fill' to `char *'. + Update constructor. + (html_printer::emit_raw): Call `shutdown_table'. + Use new functions. + (html_printer::do_center): Simplified. + (html_printer::do_title): Improved. + (html_printer::write_header): Emit one more newline. + Use new functions. + (html_printer::do_heading, html_printer::do_indent, + html_printer::do_eol, html_printer::do_tab_ts, + html_printer::do_tab, html_printer::do_tab0, + html_printer::calc_po_in, html_printer::next_horiz_pos, + html_printer::remove_courier_tabs, + html_printer::insert_tab0_foreach_tab, html_printer::begin_page): + Updated. + (html_printer::do_linelength, html_printer::do_pageoffset, + html_printer::do_indentation, html_printer::do_tempindent, + html_printer::do_tab_te): Simplified. + (html_printer::do_pointsize): Check whether point size is really + associated a `.tl' tag. + (html_printer::do_break): Rewritten. + (html_printer::troff_tag): Improved. + (html_printer::flush_globs): Updated. + (html_printer::lookahead_for_tables): Handle `is_br'. + Use new functions. + (html_printer::set_char): Check `sbuf_style.f'. + (html_printer::write_navigation): Use string comparison. + (html_printer::~html_printer): Emit `head_info'. + (html_printer::special): Rewritten. + (get_str, make_val): New functions. + (main): New option `s' to set the base point size. + + * src/preproc/html/pre-html.cpp (scanArguments): Handle option `s'. + +2004-10-10 Gaius Mulley + + * src/roff/troff/node.cpp: New extern `debug_state'. + Include `stringclass.h' and `mtsm.h'. + Implement new classes and class members from `node.h'. + (real_output_file): Make `fp' public. + (troff_output_file): New variables `cur_div_level' and `tag_list'. + Update constructors. + (troff_output_file::really_print_line): Check whether we should push + the current troff state and use the state at the start of the + invocation of this diversion. + (troff_output_file::add_to_tag_list): New member function. + (node::add_char): Handle `glyph_comp_np'. + + * src/roff/troff/node.h: Include `mtsm.h'. + (node): New variables `state', `push_state', `div_nest_level', + `is_special'. Update constructors, all descendants. + Pass additional argument to `add_char' member function. + New virtual member functions `is_tag', `debug_node', + `debug_node_list'. Update all descendants. + (tag_node): New class for handling tags. + (output_file): Add variable `state'. + +2004-10-09 Gaius Mulley + + * src/roff/troff/mtsm.cpp, src/roff/troff/mtsm.h: New files, + providing a minimal troff state machine to emit meta tags for the + post-grohtml device driver. - Make grotty emit proper Unicode box drawing characters for -Tutf8. + * src/roff/troff/Makefile.sub (OBJS, CCSRCS, HDRS): Handle new + files. - * src/devices/grotty/tty.cpp (START_LINE, END_LINE): New enum - values. - (hline_char, vline_char): New global variables. - (tty_printer::tty_printer): Initialize them. - (tty_printer::draw): Emit START_LINE and END_LINE flags for both - horizontal and vertical lines. - (crossings): New global array. - (tty_printer::end_page): Use it to determine the proper crossing - character for -Tutf8. +2004-10-09 Werner LEMBERG -2003-07-12 Werner LEMBERG + * tmac/trace.tmac: Fix handling of `am' and `am1' calls. - * doc/Makefilesub (HTMLDOCFILESALL): New macro. - (HTMLDOCFILES): Revert to `pic.html'. - (CLEANADD, install_html, uninstall_sub): Use HTMLDOCFILESALL. +2004-10-06 Gaius Mulley -2003-07-11 Werner LEMBERG + * src/roff/troff/column.cpp (vjustify_node::copy): Updated. - * doc/pic.ms: Improve documentation of absolute coordinates. - Document absolute positioning of pictures. + * src/roff/troff/div.h: Include `mtsm.h'. + (diversion): New variables `any_chars_added', `needs_push', + `saved_seen_break', `saved_seen_space', `saved_seen_eol', + `saved_suppress_next_eol', `modified_tag'. + New virtual member function `is_diversion'. Update all descendants. + + * src/roff/troff/div.cpp (diversion::diversion, + macro_diversion::macro_diversion): Updated. + (do_divert): Handle `seen_break', `seen_space', `seen_eol', + `suppress_next_eol'. + (top_level_diversion::space): Handle `curenv->seen_space'. + (page_offset): Update tag handling. + (space_request, blank_line, flush_output): Don't call `add_html_tag'. + + * src/roff/troff/env.h (environment): Make `tabs' public. + Remove `ignore_next_eol', `emitted_node'. + Update `output_line', `output'. + New variables `seen_space', `seen_eol', `suppress_next_eol', + `seen_break'. + New member functions `construct_state', `make_tag', + `construct_format_state, `construct_new_line_state, + `dump_troff_state'. + Remove `add_html_tag', `make_html_tag'. + + * src/roff/troff/env.cpp: New externs `suppress_push', + `get_diversion_state', `global_diverted_space'. + (pending_output_line): New variable `was_centered'. + Update constructor and all callers. + (pending_output_line::output): Call `curenv->construct_format_state'. + (environment::environment, environment::copy): Updated. + (environment::output): Handle `was_centered'. + (environment::add_char): Handle construct and diversion state. + (environment::add_node): Handle construct state. + (environment::newline): Handle `was_centered'. + (environment::output_line): Updated. + (environment::possibly_break_line): Updated. + Update tag handling. + (environment::add_html_tag): Replaced with... + (environment::make_tag): New function. + (environment::add_html_tag_tabs, environment::make_html_tag): Removed. + (environment::dump_troff_state): New debugging function. + (environment::construct_state, environment::construct_format_state, + environment::construct_new_line_state): New functions. + (environment::do_break): Updated. + Handle `global_diverted_space'. + (environment::handle_tag): Update tag handling. + (point_size, fill, do_break_request): Don't call `add_html_tag'. + (no_fill): Don't call `add_html_tag'. + Set `suppress_next_eol'. + (center, right_justify, line_length, indent, temporary_indent, + set_tabs): + Update tag handling. + + * src/roff/troff/input.cpp: Don't include `stringclass.h'. + (input_iterator): New variables `is_diversion', `diversion_state'. + Update constructors. + (input_stack): New member functions `get_div_level', + `get_diversion_state', `check_end_diversion'. + New variables `div_level', `diversion_state'. Initialize them. + (suppress_push, global_diverted_space): New global variables. + (input_stack::finish_get, input_stack::finish_peek, + input_stack::remove_boundary, input_stack::end_file, + input_stack::clear, input_stack::pop_macro): Call + `check_end_diversion'. + (input_stack::push): Handle `div_level' and `diversion_state'. + (get_diversion_state): New function. + (diverted_space_node::reread): Handle `global_diverted_space'. + (macro::macro): Update constructors. + (macro::is_diversion): New function. + (macro::operator=): Set `is_a_diversion'. + (string_iterator): New member function `is_diversion'. + (string_iterator::string_iterator): Update constructors. + (string_iterator::fill): Set `div_nest_level'. + (macro_iterator): New member function `is_diversion'. + (do_if_request): Handle `suppress_push'. + (tag, taga): New functions. + (init_input_requests): Add `tag' and `taga' requests. + +2004-10-05 Gaius Mulley + + * src/include/font.h (font): New member function + `get_image_generator'. + New variables `unscaled_charwidths' and `image_generator'. + + * src/libs/libgroff/font.cpp (font::get_width): Always return the + character's unscaled width if `font::unscaled_charwidths' is set. + (font::get_image_generator): New function. + (font::load_desc): Check the `unscaled_charwidths' and + `image_generator' keywords. + + * src/libs/libgroff/fontfile.cpp: Initialize + `font::unscaled_charwidths' and `font::image_generator'. + + * font/devhtml/DESC.proto: s/html/unscaled_charwidths/. + + * font/devhtml/Makefile.sub (DESC): Set `image_generator' keyword. + + * man/groff_font.man: Document `unscaled_charwidths' and + `image_generator'. + + * src/preproc/html/pre-html.cpp: Include `device.h'. + (image_gen): New global variable. + (imageList::createPage): Use `image_gen'. + (main): Use `image_generator' keyword. + +2004-10-04 Gaius Mulley + + * tmac/html.tmac: Handle \[sqrtex]. + +2004-10-04 Gaius Mulley + + * src/include/printer.h (printer): New virtual method `round_width'. + + * src/devices/grodvi/dvi.cpp, src/devices/grolbp/lbp.cpp, + src/devices/grolj4/lj4.cpp, src/devices/grops/ps.cpp, + src/devices/grotty/tty.cpp (printer::round_width): New function + member. - * NEWS: Add new pic capability. + * src/devices/grohtml/post-html.cpp (printer::round_width): New + function member. + (html_printer::set_numbered_char): Use it. -2003-07-09 Hartmut Henkel +2004-10-03 Gaius Mulley - * src/libs/libgroff/geometry.cpp (check_output_arc_limits): - Rewritten. + * aclocal.m4 (GROFF_GHOSTSCRIPT_PATH): New macro. -2003-07-07 Werner LEMBERG + * configure.ac: Call GROFF_GHOSTSCRIPT_PATH. - Implement support for dashed and dotted ellipses in pic. Based on - a patch from Hartmut Henkel . + * configure: Regenerated. - * src/preproc/pic/common.cpp (common_output::ellipse_arc, - common_output::dashed_ellipse, common_output::dotted_ellipse): New - functions. Ellipse arcs are approximated with circle arcs. - * src/preproc/pic/common.h (common_output): Updated. - * src/preproc/pic/tex.cpp (tex_output::ellipse): Use new ellipse - functions. - * src/preproc/pic/troff.cpp (simple_output::ellipse): Ditto. + * Makefile.in (GHOSTSCRIPT): New variable. + (MDEFINES): Add GHOSTSCRIPT. - * src/preproc/pic/TODO, src/preproc/pic/pic.man: Updated. +2004-10-03 Werner LEMBERG -2003-07-06 Werner LEMBERG + * INSTALL.gen: Updated (taken from texinfo CVS). - Make grotty work on platforms which have unsigned char as the - default for char. Based on a patch by Thomas Klausner - . +2004-09-28 Werner LEMBERG - * src/devices/grotty/tty.cpp (schar): New typedef. - Updated calls to declare_ptable and implement_ptable. - (glyph): Use schar for back_color_idx and fore_color_idx. - (tty_printer): Use schar for curr_fore_idx and curr_back_idx. - (tty_printer::tty_color, tty_printer::tty_printer, - tty_printer::color_to_idx, tty_printer::put_color): Updated. + * NEWS: Updated. -2003-07-06 Ruslan Ermilov +2004-09-28 Heinz-Jürgen Oertel - * src/roff/nroff/nroff.sh: Add option -d for completeness. - * src/roff/nroff/nroff.man: Updated. + * tmac/groff_www.man: Revised and updated. -2003-07-05 Werner LEMBERG +2004-09-26 Werner LEMBERG - * NEWS, tmac/groff_www.man: Updated. - * doc/Makefile.sub: Updated. + Fix \$@ and \$* to handle any number of arguments. -2003-07-05 Gaius Mulley + * src/roff/troff/input.h (BEGIN_QUOTE, END_QUOTE): New special + characters. - Implement support for multiple HTML output files. + * src/roff/troff/input.cpp (input_iterator::internal_level): + Removed. + (input_stack): New member functions `increase_level' and + `decrease_level'. + (input_stack::get_level): Don't use `internal_level'. + (get_copy, token::next): Handle BEGIN_QUOTE and END_QUOTE. + (end_quote_iterator): Completely removed. + (interpolate_arg): Build string for \$@ and \$* which is then + pushed onto the input stack. + +2004-09-23 Keith Marshall + + * tmac/groff_ms.man, doc/groff.texinfo: Document changes from + 2004-09-19. + +2004-09-23 Werner LEMBERG + + * tmac/an-old.tmac (ne): Using default scaling operator. + +2004-09-19 Keith Marshall + + This change implements the following features: + + PORPHANS + New numeric register: Defines number of lines following LP, PP, + QP, IP or XP, which must be kept together, before any automatic + page break. If insufficient space remains on the current page, a + page break is forced before the new paragraph begins. + + HORPHANS + New numeric register: Sets number of lines of following paragraph + which must be kept with a heading, defined by NH or SH, before any + automatic page break. If insufficient space remains on the + current page, a page break is forced before the heading. + + GROWPS + (Thanks to Joerg van den Hoff, for this idea). + + New numeric register: Sets the first level of heading (set with + NH), which will keep the same point size as body text; e.g. if + GROWPS is set to 3, .NH 3, .NH 4, ... will produce headings at the + point size specified by \n[PS], but .NH 2 and .NH 1 will have + progressively larger point sizes, determined by \n[PSINCR] (see + below). + + PSINCR + New numeric register: Sets the point size increment for each level + of heading, (set with NH), below the threshold level set by + GROWPS; e.g. if \n[PS] = 10, \n[GROWPS] = 3 and \n[PSINCR] = 2.0p, + then .NH 1 will produce 14pt headings, .NH 2 will produce 12pt, + and all other levels will remain at 10pt, (because \n[PS] = 10). + + SH + Existing macro now accepts a numeric argument, to make heading + size match that of NH with same argument value, when the + GROWPS/PSINCR feature is enabled. + + SN-DOT + New string, set by NH macro, replaces the existing (undocumented) + use of SN, to represent the assigned section number. + + SN-NO-DOT + New string, set by NH macro, represents the assigned section + number, but omits the terminal period (periods at intermediate + levels are retained). + + SN + String set by NH macro, originally undocumented, now implemented + as an alias for SN-DOT (which reproduces original behaviour). + + * tmac/s.tmac (PORPHANS): New register. + (par*start): Use it. + (HORPHANS, GROWPS, PSINCR): New registers. + (SH-NO-TAG, @SH): Use them. + (@NH): Improved. - * src/preproc/html/pre-html.cpp (scanArguments): Dummy handling for - -j command line option. +2004-09-19 Keith Marshall - * src/devices/grohtml/post-html.cpp (job_name, multiple_files): New - global variables. - (file): New fields `new_output_file', `require_links', - `output_file_name'. - (file::file): Updated. - (files::set_file_name, files::set_links_required, - files::are_links_required, files::is_new_output_file, - files::file_name, files::next_file_name): New functions. - (header_desc): New fields `no_of_level_one_headings', - `header_filename'. - (header_desc::header_desc): Updated. - (header_desc::write_headings): Handle multiple files. - (html_printer::write_header): Save file name in which header occurs. - (html_printer::determine_header_level): Possibly split files on - level one headings. - (html_printer::do_links, html_printer::troff_tag): Updated. - (html_printer::insert_split_file, html_printer::do_job_name, - html_printer::emit_link, html_printer::write_navigation, - html_printer::do_file_components): New functions. - (html_printer::~html_printer): Handle multiple files. - (main): Handle command line option `-j'. + * NEWS, doc/groff.texinfo, tmac/groff_ms.man: Document the deletion + of `Ds' and `De' macros. - * src/devices/grohtml/grohtml.man: Updated. +2004-09-10 Werner LEMBERG - * doc/Makefile.sub (pic.html), doc/Makefile.in (pic.html): New rule - which splits file. + In tbl, handle \a as an interpreted leader character if in + compatibility mode. - * tmac/www.tmac (JOBNAME): New macro. - * tmac/s.tmac (SH-NO-TAG): New macro. - (@SH): Call SH-NO-TAG. - (@NH): Updated. + * src/preproc/tbl/table.h (PREFIX, PREFIX_CHAR, LEADER, + LEADER_CHAR): New macros. + (compatible_flag): New declaration. + + * src/preproc/tbl/main.cpp (table_input): Add LEADER_1, LEADER_2, + LEADER_3, and LEADER_4 to `state'. + (table_input::get): Handle `\a'. + + * src/preproc/tbl/table.cpp (PREFIX): Removed. + (LEADER_REG): New macro. + (table::init_output): Define LEADER_REG string register if in + compatibility mode. -2003-07-05 Ruslan Ermilov + * src/preproc/tbl/tbl.man: Document it. - * tmac/groff_mdoc.man: Improve documentation of punctuation - characters. +2004-08-18 Werner LEMBERG -2003-07-04 Ruslan Ermilov + * tmac/doc.tmac (An): Fix error message. - * tmac/doc.tmac (Bd): Change to doc-Li-font later. +2004-08-06 Werner LEMBERG -2003-07-03 Werner LEMBERG + * src/preproc/tbl/main.cpp (main): Call `fatal' not `error' if a + file can't be opened. UNIX tbl has the same behaviour. - * tmac/an-old.tmac [cR]: Redefine `bp' to avoid empty lines. +2004-08-05 Y T -2003-07-01 Ruslan Ermilov + * src/preproc/grn/hdb.cpp (compatibility_flag): Add declaration. + (DBRead): If in compatibility mode, take into account the text + when computing figure boundaries. - * tmac/doc.tmac (doc-do-func, doc-do-func-args): Don't print a comma - after `/*' and `*/'. - Fix spacing. - (Fn, Fo): Reduce indentation in synopsis. +2004-08-05 Werner LEMBERG - * tmac/doc-common (doc-check-depth): New macro. - (doc-end-macro, Sh, Ss): Use it. - (Cd): Fix behaviour in synopsis. - (In): Make it parsed and callable. - If not in the synopsis, represent the C header file enclosed in - angle brackets. - (doc-str-Rv-std-suffix, doc-str-Rv-stds-suffix, doc-str-Rv-std0): - Use minus, not hyphen. + * src/preproc/soelim/soelim.man: Improved. Based on suggestions + from Tadziu Hoffmann. - * tmc/groff_mdoc.man: Updated. +2004-08-03 Werner LEMBERG -2003-07-01 Werner LEMBERG + * doc/meref.me: Document `_M' register. - Integrated grap2graph, contributed by Eric S. Raymond. +2004-08-03 Martin Husemann - * contrib/grap2graph/{Makefile.sub, grap2graph.sh, grap2graph.man}: - New files. - * Makefile.in, NEWS, MANIFEST, contrib/eqn2graph.man, - contrib/pic2graph.man, src/roff/groff/groff.man: Updated. + Make hpftodit work correctly on big-endian systems. -2003-07-01 Colin Watson + * src/utils/hpftodit/hpftodit.cpp (File): New method + `get_uint32(char *)'. + (entry): New member `orig_value'. + (read_tags): Use new method. + (output_font_name, read_and_output_pcltypeface, dump_ascii): + Updated. - * src/xditview/*.c: Add prototypes, fix return types, add includes. - Based on work by Fumitoshi UKAI . +2004-08-01 Werner LEMBERG -2003-06-31 Ruslan Ermilov + * tmac/s.tmac: Undo change 2003-06-29. The proper macro definitions + are already in X11's `macros.t' file. - * tmac/tty-char.tmac: Provide `lb', `rb', `lk', `rk', `lt', `rt'. +2004-08-01 Jeff Conrad -2003-06-31 Werner LEMBERG + * src/utils/hpftodit/hfptodit.cpp (output_font_name, dump_ascii): + Fix casting bug. + (read_and_output_pcltypeface): Handle strings with length <= 4. - * doc/Makefile.sub (CLEANADD): Remove all files created by - running `make groff.{pdf,dvi}'. +2004-07-27 Egil Kvaleberg - * Makefile.sub (DISTCLEANFILES): Remove all non-source files from - src/xditview also. + * tmac/s.tmac (pg@top): Don't save `PO' register. + (pg*end-col, pg*end-page): Directly use `PO' register. -2003-06-30 Werner LEMBERG +2004-07-27 Werner LEMBERG - * Makefile.in (SHELL): Define as @SHELL@. - (mkinstalldirs): Use $(SHELL). - (MDEFINES): Add $(SHELL). - * Makefile.comm (SHELL): Removed. + * man/groff_tmac.man: Mention `trace' and `pic' macro packages. -2003-06-29 Werner LEMBERG + * src/preproc/refer/refer.cpp (output_references): Check for + empty hash table. + * src/preproc/refer/refer.man: Improve documentation of + `bibliography' command. - * tmac/s.tmac (De, Ds): New aliases for .DE and .DS, respectively. - The X11 documentation files use them. - * tmac/groff_ms.man, doc/groff.texinfo: Document them. +2004-07-26 Werner LEMBERG -2003-06-15 Robert Goulding + Add requests `fcolor' and `gcolor'. - * tmac/e.tmac (@C): Handle .ad also. + * src/roff/troff/env.cpp (fill_color_change, glyph_color_change): + New functions. + (init_env_requests): Add `fcolor' and `gcolor'. -2003-06-12 Werner LEMBERG + * src/roff/troff/input.h: Export do_glyph_color and do_fill_color. - * src/preproc/tbl/tbl.man: Document formatting of text blocks. + * NEWS, man/groff_diff.man, man/groff.man, doc/groff.texinfo: + Document new requests. - * src/roff/troff/input.cc (token::next) : - Assign `n' even here. It is possible to construct a node - immediately following an escape character: +2004-07-24 Werner LEMBERG - .di xx - \?\\\?a - .br - .di - .xx + Add support for fractional point sizes in ms macros. A value for + PS, VS, FPS, and FVS greater than or equal to 1000 is always divided + by 1000. For example, `.nr PS 10250' sets the font size to 10.25p. -2003-06-10 Werner LEMBERG + * tmac/s.tmac (@AU, @AI, par@load-init, par@init, par@reset, NL, + PX): Handle fractional point sizes for PS, VS, FPS, and FVS. - * README.WIN32: Removed. - * MANIFEST: Updated. + * tmac/groff_ms.man, docs/groff.texinfo, NEWS: Document it. -2003-06-07 Werner LEMBERG +2004-07-19 Werner LEMBERG - * src/roff/nroff/nroff.sh: Don't emit SGR for option -u. + * src/preproc/pic/lex.cpp (for_input): Add member `from'. + Update constructor. + (do_for, for_input::get, for_input::peek): Handle negative `by'. + * src/preproc/pic/pic.man, doc/pic.ms, NEWS: Document it. -2003-06-05 Werner LEMBERG +2004-07-08 Thomas Klausner - * src/preproc/pic/pic.y : Implement workaround for bug - in Compaq C++ V6.5-033 for Compaq Tru64 UNIX V5.1A (Rev. 1885). + * tmac/doc-syms (doc-str-St--p1003.1-2004): New string. + * tmac/groff_mdoc.man: Updated. -2003-06-03 Werner LEMBERG +2004-07-05 Werner LEMBERG - * src/preproc/grn/hdb.cpp (DBRead): Don't close file handle; this - is done by the calling function. + * doc/groff.texinfo: Further improve documentation of `hcode'. -2003-05-22 Ruslan Ermilov +2004-07-04 Sang Dae Yu - * tmac/X.tmac: Fix definition of `em'. + Improve appearance of arrows in pic. -2003-05-22 Werner LEMBERG + * src/preproc/pic/object.cpp (draw_arrow): Make outline of filled + arrow head thin. + Use two line segments for drawing non-filled arrow head. + (line_object::print, spline_object::print): Shorten line length to + avoid arrow sticking. + (arc_object::print): Take arrow direction into account. + +2004-07-03 Heinz-Jürgen Oertel + + * tmac/groff_www.man: Update documentation of .MPIMG. + +2004-07-03 Werner LEMBERG + + * tmac/an-old.tmac (RI): Always start with font `R'. + (RI, IR): Properly end with font `R'. + +2004-07-02 Paul Eggert + + * man/ditroff.man, man/groff_font.man, man/groff_out.man, + src/devices/grohtml/grohtml.man, src/preproc/grn/grn.man, + src/preproc/pic/pic.man, tmac/groff_man.man, tmac/groff_ms.man: + Don't pass more than six arguments to .R, .I, .B, etc., for + compatibility with traditional troff macros. + +2004-07-02 Werner LEMBERG + + * src/roff/troff/input.h: s/COMPATIBLE_SAVE/PUSH_GROFF_MODE/. + s/COMPATIBLE_RESTORE/POP_GROFFCOMP_MODE/. + Update all users. + (PUSH_COMP_MODE): New internal character constant. + Update all users. + + * src/roff/troff/input.cpp (get_copy): Handle PUSH_GROFF_MODE, + PUSH_COMP_MODE, and POP_GROFFCOMP_MODE. + (token::next, macro::append): Handle PUSH_COMP_MODE. + (decode_args): Add PUSH_GROFF_MODE or PUSH_COMP_MODE before and + POP_GROFFCOMP after each of the decoded arguments to make them + independent from the compatibility mode status. + (comp_mode): Add `COMP_ENABLE'. + (do_define_string, do_define_macro): Handle COMP_ENABLE. + (define_string, append_string, define_macro, define_indirect_macro, + append_macro, append_indirect_macro): Handle `compatible_flag'. + (chop_macro, substring_request, asciify): Handle PUSH_COMP_MODE. + + * man/groff_diff.man, doc/groff.texinfo: Updated. + +2004-07-01 Werner LEMBERG + + * doc/groff.texinfo: Improve documentation of `hcode'. + Use @documentencoding and convert document to latin-1; to do that + make latin characters active and assign proper macros (within a + @tex...@end tex environment). + * doc/Makefile.in (.texinfo.html, groff): Use --enable-encoding. + * doc/Makefile.sub (groff): Ditto. + +2004-06-29 Werner LEMBERG + + Implement two new conditional operators `F ' and `S ' + which check whether is a valid font or style, respectively. + + * src/libs/libgroff/font.cpp (text_file): Add `silent' member. + (text_file::text_file): Updated. + (text_file::error): Don't emit message if `silent' is set. + (font::load_font): Add optional third argument (which is directly + passed to `load'. + (font::load): Add optional second argument to check the header of + a font only, without emitting warning or error messages. + * src/include/font.h (font): Updated. + + * src/roff/troff/input.cpp (do_if_request): Implement `S' and `F' + conditionals. + * src/roff/troff/node.cpp (mount_font_no_translate): Add optional + fourth argument to check a font without mounting. + (check_font, check_style): New functions. + * src/roff/troff/node.h: Updated. - * src/roff/troff/input.cc (return_macro_request): Fix detection of - argument. + * man/groff_diff.man, man/groff.man, NEWS, doc/groff.texinfo: + Updated. -2003-05-18 Werner LEMBERG +2004-06-27 Werner LEMBERG - * tmac/doc.tmac (doc-tag-list): Force horizontal mode after tag - to make items work which consist only of a tag. + Implement new string-valued register `.sty' to return the current + style name. -2003-05-17 Werner LEMBERG + * env.cpp (environment::get_style_name_string): New function. + (init_env_requests): Add `.sty' register. + * env.h (environment): Updated. + * node.cpp (font_info): Make `get_style_name' a friend. + (get_style_name): New function. + * node.h: Updated. - * tmac/doc.tmac (doc-tag-list): Don't use \Z to assure that spaces - aren't stretched in a tag (this can fail with unformatted boxes). - Instead, insert a break and go back one line. + * man/groff_diff.man, man/groff.man, NEWS, doc/groff.texinfo: + Updated. -2003-05-16 Werner LEMBERG +2004-06-15 Werner LEMBERG - * src/roff/troff/input.cc (return_macro_request): If called with - argument pop macro twice. We need this to trace `return'. + * src/preproc/tbl/main.cpp (process_data) : Handle + `nospaces' option. - * tmac/trace.tmac: Handle `return'. - Fix typos. +2004-06-10 Colin Percival - * NEWS, man/groff_diff.man, man/groff.man, doc/groff.texinfo: - Document. + * doc/meintro.me, doc/meref.me: Don't use \*[td], \n[dy], \*[mo], + and \n[mo] to avoid dependency on current date. -2003-05-15 Larry Kollar +2004-06-08 Werner LEMBERG - * tmac/groff_ms.man, doc/groff.texinfo: Improve documentation of - registers `FPS', `FVS', and `FPD'. + * Makefile.sub (install_data): New target. -2003-05-15 Werner LEMBERG +2004-06-04 Werner LEMBERG - * src/utils/pfbtops/pfbtops.c (get_text): Handle loop counter - correctly. + * src/libs/libxutil/Makefile.sub (EXTRA_CFLAGS): Define. -2003-05-03 Ruslan Ermilov +2004-06-03 Werner LEMBERG - * tmac/groff_mdoc.man: Slight improvements. + * src/devices/xditview/Makefile.sub (EXTRA_LDFLAGS): Fix typo and + order of libraries. + (install_data): Add $(srcdir). -2003-05-03 Werner LEMBERG + * src/utils/xtotroff/Makefile.sub (EXTRA_LDFLAGS): Fix order of + libraries. - * tmac/doc-common (doc-header): Emit vertical space of 1v instead of - `doc-header-space' after header line if register `cR' is set. +2004-06-02 Werner LEMBERG -2003-05-02 Werner LEMBERG + * aclocal.m4 (GROFF_X11): s/have_no_x/groff_no_x/. + Add X11 stuff to CFLAGS, LDFLAGS, and LIBS temporarily. + Add test for Xmu library. + (GROFF_APPRESDIR_OPTION, GROFF_APPRESDIR_CHECK, + GROFF_APPRESDIR_DEFAULT): New macros. - * TODO: Updated. + * configure.ac: Call GROFF_APPRESDIR_OPTION, GROFF_APPRESDIR_CHECK, + and GROFF_APPRESDIR_DEFAULT. -2003-05-01 Ruslan Ermilov + * configure: Regenerated. - * tmac/doc-common (Nd): Use \[em]. + * Makefile.in (appresdir): New variable. + (MDEFINES): Add appresdir. -2003-05-01 Werner LEMBERG + * src/devices/xditview/Makefile.sub (EXTRA_LDFLAGS): Add -Xmu and + -Xt. + (install_data, uninstall_sub): New targets to handle GXditview.ad. + + * src/utils/indxbib/Makefiles.ub (install_data): Depend on + `$(srcdir)/eign', not `eign'. + + * MANIFEST, INSTALL, NEWS, PROBLEMS: Updated. + + * man/groff_out.man, man/roff.man, src/devices/grops/grops.man, + src/devices/xditview/gxditview.man, src/roff/groff/groff.man: + Protect (g)xditview with `\%' to avoid hyphenation. + Other minor formatting. + +2004-06-01 Werner LEMBERG + + Integrate gxditview into groff's standard directory hierarchy. + + * src/xditview/*: Moved to ... + * src/devices/xditview/*: Here. + Moved DviChar.h and XFontName.h to src/include. + Moved DviChar.c and XFontName.c to new directory src/libs/libxutil. + Split off `xmalloc' into new file src/libs/libxutil/xmalloc.c. + Moved xtotroff.c to new directory src/utils/xtotroff. + Provide proper Makefile.sub files (reusing the stuff from + Imakefile.in). + DESC renamed to DESC.in. + Removed GXDitview-ad.h, INSTALL, Imakefile.in. + Converted everything from K&R to ANSI C. + Decorated with const where appropriate. + Cast string constants with `String' and `char *' where appropriate. + Made it compile with C++ (used as a C compiler). + Removed other minor compiler warnings. - * tmac/doc-ditroff, tmac/doc-nroff (doc-header-space, - doc-footer-space): Initialize to 0.5i. - (doc-setup-page-layout): Don't set doc-header-space and - doc-footer-space. + * src/devices/xditview/device.c: Include config.h, string.h, and + defs.h. + Don't declare `exit', `strtok', `strchr', and `getenv'. + (FONTPATH): Remove. -2003-04-30 Werner LEMBERG + * src/devices/xditview/font.c: Don't declare `XParseFontName' and + `XFormatFontName'. - * REVISION: Set to 1. + * src/devices/xditview/xditview.c: Include config.h. + Include stdio.h earlier. + Protect declaration of `popen' and `pclose' with + NEED_DECLARATION_POPEN and NEED_DECLARATION_PCLOSE. + Replace `caddr_t' with `XtPointer'. + (MakePromptFunc): New typedef. + (DoPrint): Use RETSIGTYPE. + (promptfunction): Change type to MakePromptFunc. + (MakePrompt): Use MakePromptFunc for third argument. + (xmalloc): Removed. + + * src/devices/xditview/ad2c: Add casts to `String'. + + * src/include/XFontName.h (XFontNameString): Don't use array + notation. + Add prototypes for `XParseFontName', `XFormatFontName', + `XCompareFontName', and `XCopyFontName'. + + * src/include/Makefile.sub (HDRS): Add `DviChar.h' and + `XFontName.h'. + + * src/utils/xtotroff/xtotroff.c: Include getopt.h. + Don't declare `XParseFontName' and `XFormatFontName'. + (xmalloc): Removed. + (main): Remove `optind' and `optarg'. + + * Makefile.in (XDEVDIRS, XPROGDIRS, XLIBDIRS): New variables + (to select programs which need X). + Make XDEVIDIRS depend on `FORCE'. + (X_CFLAGS, X_LIBS, X_EXTRA_LIBS, X_PRE_LIBS): New variables (for + X support). + (MDEFINES): Updated. + (LIBDIRS): Use XLIBDIRS. + (CPROGDIRS): Use XPROGDIRS. + (DEVDIRS): Remove font directories for gxditview. + (ALLDIRS, DISTDIRS): Add XDEVDIRS. + (EXTRADIRS): Remove src/xditview. - * doc/pic.ms: Document possible problems with `figname'. + * Makefile.sub (DISCLEANFILES): Updated. -2003-04-29 Werner LEMBERG + * Makefile.comm (LIBXUTIL): New variable. + (.cpp.o, .cpp.obj): Handle EXTRA_CCFLAGS. + (.c.o, .c.obj, .y.o): Handle EXTRA_CFLAGS. -Version 1.19 released -===================== + * Makefile.cpg, Makefile.ccpg ($PROG): Handle EXTRA_LDFLAGS. - * VERSION: Set to 1.19. - * REVISION: Set to 0. - * doc/groff.texinfo, doc/webpage.ms, NEWS: Updated. + * aclocal.m4 (GROFF_X11): New function. - * src/devices/grohtml/post-html.cpp (html_printer::~html_printer): - Define charset as `US-ASCII' in html output. + * configure.ac: Call GROFF_X11. + Don't create src/xditview/Imakefile. + Don't emit notice how to build gxditview. - * tmac/www.tmac (ULE): Add missing scaling indicator. + * configure: Regenerated. - * win32-diffs: Removed. + * test-groff.in (GROFF_BIN_PATH, XENVIRONMENT): Updated. -2003-04-28 Werner LEMBERG +2004-05-28 Akihiro Sagawa - * doc/groff.texinfo: Document `dn' and `dl' registers if used with - `.da' and `.boxa'. - Document how to insert discardable whitespace with `.ss'. + * Makefile.in (CPPFLAGS): Define. + (MDEFINES): Add CPPFLAGS. -2003-04-27 Werner LEMBERG +2004-05-27 Werner LEMBERG - * src/preproc/pic/tex.cpp (tex_output::start_picture): Make code - work with plain TeX also. + * arch/misc/Makefile.sub (shdeps.sed): Use $(srcdir). - * src/preproc/pic/pic.man, doc/pic.ms: Fix TeX code example. +2004-05-26 Niklas Edmundsson -2003-04-25 Gaius Mulley + Fix problems with `friend name injections'. - * src/devices/grohtml/post-html.cpp (html_printer::~html_printer): - Use a loose DTD. + * src/preproc/eqn/box.h (make_mark_box, make_lineup_box, + make_script_box), src/roff/troff/div.h (end_diversions), + src/roff/troff/env.h (title), input.cpp (process_input_stack): Undo + change 2004-04-08. -2003-04-24 Werner LEMBERG +2004-05-25 Bernd Warken - * src/preproc/pic/pic.man, doc/pic.ms: Explain how to get a - vbox with positive height and zero depth if in TeX mode. + * src/preproc/pic/pic.man, doc/pic.ms: Add example for `command'. - * NEWS: Document glyph name changes for grodvi and grolj4. +2004-05-25 Werner LEMBERG -2003-04-23 Werner LEMBERG + * src/libs/libgroff/cset.cpp, src/libs/libgroff/lf.cpp, + src/libs/libgroff/color.cpp: Include lib.h. - * src/preproc/pic/tex.cpp (tex_output::start_picture): Fix TeX code. - * doc/pic.ms: Fixed. +2004-05-25 Paul Eggert -2003-04-21 Werner LEMBERG + * PROBLEMS: Update documentation for problems with Sun C++ 5.0 + through Forte 6u1, and for how to get GNU make on Solaris. - HP-UX 10.20 has `snprintf' but it isn't declared. +2004-05-24 Werner LEMBERG - * configure.ac: Add declaration test for snprintf. - * configure: Regenerated. - * src/include/lib.h: Handle `NEED_DECLARATION_SNPRINTF'. - * src/include/config.hin: Regenerated. + * PROBLEMS: Document problems with gcc 3.4.0 on Sun. Reported + by Paul Eggert. -2003-04-19 Werner LEMBERG +2004-05-15 Keith Marshall - Add keyword `figname' to pic, specifying the name of the picture - box in TeX mode. Based on a patch from William J Poser - . + * arch/misc/Makefile.sub (shdeps.sed): Don't use `$<' in explicit + rule. - * src/preproc/pic/pic.y: New token `FIGNAME'. - (macro_name): New rule of type . - (placeless_element): Handle `FIGNAME'. - * src/preproc/pic/lex.cpp (lookup_keyword): Add `figname'. - * src/preproc/pic/main.cpp (graphname): New global variable. - (do_picture): Initialize `graphname'. - * src/preproc/pic/pic.h: Updated. - * src/preproc/pic/tex.cpp (tex_output::start_picture): Use - `graphname'. - Simplify TeX code. - (tex_output::text): Beautify output. - * src/preproc/pic/object.cpp (object_spec::~object_spec): Deallocate - `shaded' and `outlined' unconditionally. - * NEWS, src/preproc/pic/pic.man, doc/pic.ms: Updated. - Minor improvements. +2004-05-14 Werner LEMBERG - * PROBLEMS, README.CVS: Mention that bison version 1.875b or - greater is necessary. + * REVISION: Set to 2. -2003-04-17 Hartmut Henkel + * aclocal.m4 (GROFF_STDINT_H): Removed. + (GROFF_INTTYPES_H): Define HAVE_CC_INTTYPES_H. - Add option -r to soelim to avoid emission of `.lf' lines. - Add option -t to produces TeX comment lines instead of `.lf' lines. + * configure.ac: Updated. + * configure, src/include/config.hin: Regenerated. - * src/preproc/soelim/soelim.cpp: New global variables `raw_flag' - and `tex_flag'. - (usage): Updated. - (main): Handle `-r' and `-t'. - (set_location): Handle `raw_flag' and `tex_flag'. - * src/preproc/soelim/soelim.man, NEWS: Updated. + * src/libs/libgroff/tmpname.cpp: Don't include stdint.h but + inttypes.h conditionally. -2003-04-17 Werner LEMBERG +2004-05-13 Werner LEMBERG - * tmac/hyphenex.sh: Replaced with... - * tmac/hyphenex.pl: This perl script to avoid sed compatibility - nightmares. +Version 1.19.1 released +======================= - * aclocal.m4 (GROFF_HTML_PROGRAMS): Emit useful warning message - if --quiet is used for the configure script. - * configure: Regenerated. +2004-05-10 Stephen Gildea -2003-04-16 Werner LEMBERG + * src/preproc/refer/label.y (same_author_last_name, + same_author_name): Handle empty sort keys. - * src/devices/grohtml/post-html.cpp (text_glob::text_glob): - Add `const' to second argument. - (html_printer::add_table_end): Add `const' to argument. - * src/devices/grohtml/html-text.cpp (html_text::issue_tag): Add - `const' to arguments. - * src/devices/grohtml/html-text.h: Updated. +2004-05-10 Werner LEMBERG - * src/devices/grolbp/charset.h (symset): Use `unsigned char'. - * src/devices/grolbp/lbp.h (lbpputc): Use `unsigned char' for - argument. + * NEWS, README, TODO, PROJECTS, PROBLEMS, MANIFEST, doc/webpage.ms, + tmac/TODO: Updated. - * src/devices/grotty/tty.cpp (tty_printer::make_rgb_string): Use - cast for integer constant. + * tmac/doc-syms (doc-str-Lb-libposix, doc-str-Lb-libpthread, + doc-str-Lb-librt): Reset font. + (Lb): Rename `doc-str-Lb' to `doc-str-Lb1'. + Provide `doc-str-Lb' to reset font. + * tmac/groff_mdoc.man: Updated. - * src/preproc/html/pre-html.cpp (image_device): Use `const'. - (writeNbytes): Add `const' to first argument. - (writeString): Add `const' to argument. - (char_buffer::can_see): Add `const' to third argument. - * src/preproc/html/pushback.cpp (pushBackBuffer::isString): Add - `const' to argument. - * src/preproc/html/pushback.h: Updated. - - * src/preproc/soelim/soelim.cpp (include_list): Add `const'. - (include_path_append): Add `const' to argument. - (do_file): Updated. - - * src/roff/troff/uniglyph.cpp (unicode_to_glyph_list): Use `const' - for `value'. - (unicode_to_glyph_init::unicode_to_glyph_init): Updated. - * src/roff/troff/uniuni.cpp (unicode_decompose_list): Use `const' - for `value'. - (unicode_decompose_init::unicode_decompose_init): Updated. - * src/roff/troff/glyphuni.cpp (glyph_to_unicode_list): Use `const' - for `value'. - (glyph_to_unicode_init::glyph_to_unicode_init): Updated. - * src/roff/troff/input.cc (process_startup_file): Add `const' to - argument. - - * tmac/hyphenex.sh: Make script more portable by using a here - document. - -2003-04-15 Werner LEMBERG - - Renamed all `*.cc' files to `*.cpp'. - Updated all configuration files, makefiles, and documentation. - -2003-04-14 Werner LEMBERG - - * tmac/hyphenex.sh: Slight improvements. - -2003-04-13 Werner LEMBERG - - * font/devascii/R.proto, font/devcp1037/R.proto, - font/devlatin1/R.proto, font/devutf8/R.proto: Fill up remaining - character slots with unnamed glyphs. - - * tmac/an-old.tmac: Fix hyphenation value if `cR' is active. - (an-first): New global variable. - (an-header): Emit vertical space between multiple man pages. - -2003-04-11 Werner LEMBERG - - * doc/groff.texinfo, man/groff_out.man: \S only accepts integer - values. - -2003-04-10 Werner LEMBERG - - * PROBLEMS: Revised. - -2003-04-10 Bernd Warken - - * doc/webpage.ms: Improved. - -2003-04-09 Werner LEMBERG - - Add register \n[.height] which returns the value of \H. - Add register \n[.slant] which returns the value of \S. - - * src/roff/troff/env.cc (init_env_requests): Implement. - * NEWS, man/groff_diff.man, man/groff.man, doc/groff.texinfo: - Document. - -2003-04-08 Werner LEMBERG - - * tmac/html.tmac: Move some of the data into html-end.tmac. - Remove most of the character translations for eqn since html fonts - now cover those characters. - Load www.tmac. - * tmac/html-end.tmac: New file. - * tmac/troffrc: Load html.tmac not www.tmac for -Thtml. - * tmac/troffrc-end: Load html-end.tmac not html.tmac for -Thtml. - * tmac/Makefile.sub (NORMALFILES): Add html-end.tmac. - -2003-04-07 Werner LEMBERG - - * man/groff_out.man: Document negative values of `N' if -Thtml is - used. - -2003-04-06 Werner LEMBERG - - * Makefile.comm (depend.temp): Check location of YTABC. - -2003-04-05 Maciej W. Rozycki - - * contrib/mom/Makefile.sub (GROFFBIN): New variable for groff - binary path. - (groff_bin_path): Rename to GROFF_BIN_PATH. - (GROFF): Use GROFFBIN and GROFF_BIN_PATH. - * doc/Makefile.in (TROFFBIN): New variable for troff - binary path. - (GROFFBIN): New variable for groff binary path. - (groff_bin_path): Rename to GROFF_BIN_PATH. - (TROFF): Use TROFFBIN. - (GROFF): Use GROFFBIN and GROFF_BIN_PATH. - * doc/Makefile.sub (GROFFBIN): New variable for groff - binary path. - (groff_bin_path): Rename to GROFF_BIN_PATH. - (GROFF): Use GROFFBIN and GROFF_BIN_PATH. - - * Makefile.comm (install_dev): Install scripts from DEVSCRIPTS - with INSTALL_SCRIPT. - (uninstall_dev): Uninstall scripts from DEVSCRIPTS. - * Makefile.dev (all): Depend on DEVSCRIPTS. - (install_dev): Likewise. - * font/devdvi/Makefile.sub (DEVSCRIPTS): New variable to hold - scripts. - * font/devps/Makefile.sub (DEVSCRIPTS): Likewise. - (DEVGENSCRIPTS): New variable to hold generated scripts. - -2003-04-05 Werner LEMBERG - - * src/libs/libdriver/input.cc (IntArray::operator[], - IntArray::get_data): Remove meaningless `const' in return value. - - * README.CVS: New file. - -2003-04-04 Werner LEMBERG - - Check for stdint.h in C++, not in C. - - * aclocal.m4 (GROFF_STDINT_H): New function, - * configure.ac: Check for stdint.h with GROFF_STDINT_H instead of - AC_CHECK_HEADERS. - * configure, src/include/config.hin: Regenerated. - * src/libs/libgroff/tmpname.cc: Use HAVE_CC_STDINT_H. - - - Fix handling of   in grohtml. To do this, troff emits `N' - with a negative value, representing the width of the unbreakable - space (only for -Thtml). grohtml then converts this back to -   and uses the value of N as its width. - - * src/roff/troff/node.cc (space_char_hmotion_node::tprint, - unbreakable_space_node::tprint): Emit `N-'. - * src/include/printer.h (printer::set_numbered_char): Make it - virtual. - Make members `font_table' and `nfonts' protected instead of private. - * src/devices/grohtml/post-html.cc - (html_printer::set_numbered_char): New member function. - - - * src/libs/libgroff/maxfilename.cc: - s/HAVE_LIMITS_H/HAVE_CC_LIMITS_H/. - - * src/roff/troff/node.cc (unbreakable_space_node::tprint): Don't - emit word marker. - -2003-04-03 Sergey A. Osokin - - * man/roff.man: Small fixes. - -2003-04-03 Werner LEMBERG - - Make groff independent from locale's numeric settings. - - * configure.ac: Check for `setlocale'. - * configure, src/include/config.hin: Regenerated. - - * src/include/lib.h: Handle HAVE_SETLOCALE. - - * src/devices/grodvi/dvi.cc (main), src/devices/grolj4/lj4.cc - (main), src/devices/grops/ps.cc (main), src/preproc/grn/main.cc - (main), src/preproc/pic/main.cc (main): Call `setlocale'. - - - * doc/groff.texinfo: Change dir category to `Typesetting'. - (Man font macros): Mention that there is no space between arguments - of .BI and friends. - - * src/libs/libdriver/printer.cc, src/devices/grotty/tty.cc - (*printer::change_color, *printer::change_fill_color): Add missing - `const'. - -2003-04-02 Werner LEMBERG - - * src/devices/grohtml/html-table.cc (html_table::emit_col, - html_table::is_gap): Compute table widths after converting border - positions to avoid rounding errors. - -2003-04-01 Werner LEMBERG - - * src/devices/grohtml/html-text.cc (html_text::do_space): Handle - `space_emitted' properly. - -2003-03-31 Werner LEMBERG - - * src/devices/grohtml/html-table.cc: Fix column width calculation. - (html_table::set_linelength): Don't add 1. - (html_table::add_indent): Don't subtract 1. - - * tmac/html.tmac: Set default page offset to zero. - -2003-03-30 Werner LEMBERG - - Make groff emit ` ' for `\ ' and `\~' if `-Thtml' is used. - - * src/roff/troff/node.cc (space_char_hmotion_node::tprint, - unbreakable_space_node::tprint): New functions. - (troff_output_file): Make space_char_hmotion_mode::tprint and - unbreakable_space_node::tprint to friends. - * src/roff/troff/node.h: Updated. - - * font/devhtml/R.proto: Add ` ' at position 0xA0 (as defined - in the HTML standard). - -2003-03-29 Werner LEMBERG - - * src/roff/troff/env.cc (point_size): Fix emission of html tag. - Otherwise, the following code - - .di xxx - .ps 10 - a - .br - .di - x\*[xxx] - - produces `x a' instead of `xa'. This is a temporary fix, disabling - font changes in diversions for -Thtml. - - * tmac/an-old.tmac (TH, SH): Use `HTML-TAG-NS' instead of - `HTML-TAG'. - (an-do-tag-html): Merge with ... - (an-do-tag): This macro. - Change code slightly to circumvent grohtml bug. - * tmac/troffrc-end: Define dummy for HTML-TAG-NS. - - * src/devices/grohtml/html-table.cc (html_table::emit_col, - html_table::is_gap): Round `width' properly. - - * tmac/html.tmac: Provide some default layout parameters for - grohtml. - - * font/devhtml/DESC.proto: Don't use discrete values for `sizes' - command. - -2003-03-28 Werner LEMBERG - - src/devices/grops/ps.cc (ps_printer::do_import): Fix error message. - -2003-03-27 Werner LEMBERG - - * tmac/an-old.tmac (BT): Don't call .tl if register `ps4html' is - defined. - -2003-03-20 Werner LEMBERG - - * src/roff/troff/env.cc (vertical_spacing): Allow zero value for - `.vs'. - * doc/groff.texinfo: Updated. - -2003-03-19 Werner LEMBERG - - * src/roff/troff/input.cc (process_input_stack) : Reset `have_input'. - -2003-03-18 Werner LEMBERG - - * src/roff/groff/groff.man: Mention groff_trace man page. - -2003-03-16 Werner LEMBERG - - * Makefile.in (LIBEXT): New variable to indicate the file extension - of library files. Computed heuristically from $(OBJEXT). - (MDEFINES): Add $(LIBEXT). - * Makefile.lib, Makefile.comm: Use it. - - * src/utils/pfbtops/pfbtops.c (get_text): New function. Split - overlong lines into smaller chunks. - (get_binary): New function. - (main): Use them. - * src/utils/pfbtops/pfbtops.man: Updated. - -2003-03-15 Colin Watson - - * src/roff/groff/groff.man: Minor syntax fix. - -2003-03-14 Egil Kvaleberg - - * src/devices/grops/ps.cc (ps_printer::media_set, - ps_printer::~ps_printer): Handle zero paper width and length. - -2003-03-13 Werner LEMBERG - - Add options -p and -l to grodvi. - - * src/devices/grodvi/dvi.cc: Include paper.h. - (landscape_flag, user_paper_length, user_paper_width): New global - variables. - (dvi_printer::begin_page): Emit `papersize' special. - Set color after initialization of `cur_h' and `cur_v'. - (main): Add options `-l' and `-p'. - * font/devdvi/Makefile.sub (DESC): Set `papersize'. - * src/devices/grodvi/grodvi.man, NEWS: Updated. - - * src/devices/grops/psrm.cc (valid_input_table): Fixed. - -2003-03-12 Werner LEMBERG - - * src/devices/grops/grops.man: Move documentation of .PSPIC to... - * man/groff_tmac.man: This man page. - * man/groff_font.man: Declare `paperwidth' and `paperlength' as - deprecated. - - * tmac/X.tmac: Don't load pspic.tmac. - -2003-03-11 Werner LEMBERG - - Make variable `pr' local to libdriver/input.cc. Based on a patch - by Bernd Warken . - - * src/include/driver.h (pr): Removed. - - * src/libs/libdriver/input.cc (pr): New global variable. - (do_file): Deallocate `pr'. - * src/libs/libdriver/printer.cc (pr): Removed. - - * src/devices/grodvi/dvi.cc (main), src/devices/grohtml/post-html.cc - (main), src/devices/grolbp/lbp.cc (main), src/devices/grolj4/lj4.cc - (main), src/devices/grops/ps.cc (main), src/devices/grotty/tty.cc - (main): Don't delete `pr'. - -2003-03-10 Werner LEMBERG - - * tmac/a4.tmac, tmac/composite.tmac: Use `.do'. - * tmac/papersize.tmac: New file. - * tmac/troffrc: Include `papersize.tmac'. - * tmac/Makefile.sub (NORMALFILES): Add `papersize.tmac'. - * tmac/an-old.tmac: Set LT to LL by default. - - * NEWS, MANIFEST, tmac/groff_man.man, man/groff_tmac.man, - doc/groff.texinfo: Updated. - - * src/libs/libgroff/paper.cc (add_iso_paper): Fix very embarassing - bug which caused all odd iso papers to have wrong dimensions. - - * src/devices/grops/ps.cc (user_paper_width): New global variable. - (main) <'p'>: Set `user_paper_width' also. - (ps_printer::media_width, ps_printer::media_height): Use values - given with option `-p'. - -2003-03-09 Werner LEMBERG - - * src/include/nonposix.h: Provide default for SET_BINARY. - - * src/devices/grodvi/dvi.cc, src/devices/grolbp/lbp.cc, - src/devices/grolj4/lj4.cc, src/devices/grops/ps.cc: Call SET_BINARY - unconditionally. - - * src/utils/pfbtops/pfbtops.c: Call SET_BINARY unconditionally. - (main): Treat \r\n as \n. - -2003-03-08 Werner LEMBERG - - * tmac/an-old.tmac: Use register `HY' to control hyphenation. - * NEWS, tmac/groff_man.man, doc/groff.texinfo: Document it. - -2003-03-07 Werner LEMBERG - - Added support to access more than 256 glyphs in Type 1 fonts. - - * src/devices/grops/ps.cc (subencoding): New structure. - (style): Add `sub' field. - Updated all users. - (ps_printer): Add `subencodings' and `next_subencoding_index' fields. - Add `set_subencoding', `get_subfont' and `encode_subfont' member - functions. - Updated all users. - (ps_printer::set_char): Use `set_subencoding'. - (make_subencoding_name): New function. - (ps_printer::set_style): Handle case where `sty.sub' is not zero. - (ps_printer::~ps_printer): Emit subencoding definitions. - - * src/devices/grops/psrm.cc (valid_input_table): New array to - properly support EBCDIC. - (white_space): Add `\f'. - (ps_get_line): Change first argument to be of type `string &'. - Updated all callers. - This allows to get lines of arbitrary length. - Use `valid_input_table'. - Remove warning about non-conforming PS line length. This seems - not to be of great importance -- for example, dvips don't emit - a warning either. - (PS_LINE_MAX): Removed. - (matches_comment): Change first argument to be of type `string &'. - - * src/devices/grops/grops.man, src/devices/grops/TODO: Updated. - - * src/utils/afmtodit/afmtodit.pl (%unicode_decomposed, - %AGL_to_unicode, %default_ligatures): New hash tables. - Read all map entries. - Add unencoded characters. - Check for default ligatures if there are no `L' entries. - Print all kern entries. - Print all characters in charset. - * src/utils/afmtodit/afmtodit.man: Updated. - - * font/devps/*: Regerated all fonts. - - * tmac/latin[129].tmac, tmac/cp1047.tmac: Don't test for existence - of characters, just use `.trin'. Otherwise the mapping depends - on the font encoding. - * tmac/ps.tmac: Add `fi' and `fl'. - Improve `Fi' and `Fl'. - * tmac/X.tmac, tmac/lbp.tmac, tmac/tty.tmac: Improve `Fi' and `Fl'. - * tmac/Xps.tmac: Fix `em'. - - * NEWS: Updated. - -2003-03-04 Werner LEMBERG - - * src/roff/troff/input.cc (charinfo_to_node_list): Reset - `have_input'. - -2003-03-03 Werner LEMBERG - - * Makefile.sub (DISTCLEANFILES): Add gxditview._man. - - * font/devps/generate/textmap: Remove entry `similarequal'. - * font/devps/symbolmap: Updated. - -2003-03-02 Werner LEMBERG - - * src/libs/libgroff/font.cc (font::load): Fix error message for - bad character type. - - * src/devices/grops/grops.man: Improve documentation of the -b - flag. - - * tmac/tty.tmac: Load latin1.tmac for all TTY devices except - `ascii' and `cp1047'. - -2003-03-01 Werner LEMBERG - - Document composite glyphs and the `composite' request. - - * man/groff.man, man/groff_diff.man, doc/groff.texinfo: Do it. - -2003-02-28 Werner LEMBERG - - * font/devdvi/generate/ec.map: Add some more Unicode entities. - * font/devdvi/*EC: Updated. - - * tmac/composite.tmac, tmac/latin2.tmac, tmac/latin9.tmac: New files. - * tmac/latin1 (latin1-tr): Undo any previous mapping. - * tmac/troffrc: Load `composite.tmac'. - * tmac/Makefile.sub (NORMALFILES): Updated. - - * doc/groff.texinfo (Input Encodings): New section. - * NEWS: Updated. - -2003-02-27 Werner LEMBERG - - * doc/texinfo.tex: New version 2003-02-11.06. - - * tmac/doc-common (Dt): Don't emit warning for unknown section. - * tmac/groff_mdoc.man: Fix description of `Dt'. - -2003-02-26 Egil Kvaleberg - - * font/devps/prologue.ps: Fix for included Postscript that does - a setpagedevice -- which is now safely ignored. - - * NEWS: Updated. - - * src/devices/grops/ps.cc: Now sets the page size in the generated - document. This is done in two ways: Via a %%-comment for gv and - the like, and via a PageSize and setpagedevice for programs that - understands Postscript proper, like ps2pdf. - - * src/devices/grops/ps.h: New broken-flag to avoid page size - definition, if required. - - * src/devices/grops/grops.man: New broken-flag 16 mentioned. - - * doc/Makefile.in: Added -nosetpage flag (via @pnmtops_nosetpage@). - Not really necessary due to the fix in prologue.ps, but cleaner: - Such information does not belong in an .eps file. - - * doc/Makefile.sub: See doc/Makefile.in. - -2003-02-26 Ralph Corderoy - - * aclocal.m4 (GROFF_PNMTOPS_NOSETPAGE): Use P2 format for testing - instead of P1 since the latter is broken in some versions of netpbm. - * configure: Updated. - -2003-02-26 Larry Kollar - - Make man pages more customizable. - - * tmac/an-old.tmac (FT): New register holding footer distance from - bottom. - (HF): New string holding the default heading font. - (TH): Handle registers `IN' and `SN' set on the command line. - Use `FT'. - (PT, BT): New strings to customize header and footer lines. - (an-header, an-footer): Use them. - (SH, SS): Use `HF'. - * tmac/groff_man.man: Document changes. - - * doc/groff.texinfo: Document man changes. - Document Ultrix extensions of man. - -2003-02-26 Werner LEMBERG - - * src/roff/troff/input.cc (do_width, do_if_request): Reset - `have_input' after changing back to old environment. - - * src/devices/grolbp/lbp.cc (lbp_printer::set_line_thickness): Move - function up to be defined before first call. This is necessary to - avoid a compilation problem with Sun's WorkShop 6 C++ compiler. - - * src/utils/afmtodit/afmtodit.pl: Make script search for files in - the default font directory also. Based on a patch from James - J. Ramsey . - * src/utils/afmtodit/Makefile.sub (afmtodit): Handle @FONTDIR@. - * src/utils/afmtodit/afmtodit.man: Document it. - - * NEWS: Updated. - - * tmac/groff_man.man, doc/groff.texinfo: Many minor fixes. - -2003-02-25 Gaius Mulley - - * aclocal.m4 (GROFF_HTML_PROGRAMS): Add test for pnmtops. - (GROFF_PNMTOPS_NOSETPAGE): New macro. - * configure.ac: Use it. - * configure: Regenerated. - * Makefile.in: Updated. - - * tmac/Makefile.sub (NORMALFILES): Remove www.tmac. - (CLEANADD): Add www.tmac-sed. - (pnmtops_nosetpage): Define default. - (install_data): Handle www.tmac-sed and substitute - @PNMTOPS_NOSETPAGE@. - (stamp-sed): Add www.tmac. - * tmac/www.tmac: Rewritten, based on a patch by Bernd Warken. - It now breaks URLs at suitable places. - (www:substring_ok): New register set by... - (www:@test_substring): New macro. - (www:error): New alias to www-error. - (www:lenstr, www:splitstr, www:url_breaks, www:url_breaks_splitted): - New macros. - (URL): Use www:url_breaks. - (PIMG, MPIMG): Use @PNMTOPS_NOSETPAGE@. - (CDS, CDE): New macros. - -2003-02-25 Werner LEMBERG - - * src/devices/grops/ps.cc (ps_printer::define_encoding): Avoid - buffer overflow. - -2003-02-24 Werner LEMBERG - - Contrary to the PCL5 Developer's Guide, the ascenders in TFM files - can be negative also. - - * src/utils/hpftodit/hpftodit.cc (char_info): `ascent' must be - `int16'. - (read_char_table): Avoid negative ascenders. - (output_charset): Add cast. - * font/devlj4/*: Regenerated. - - Replace unnamed glyphs for DVI fonts with `uXXXX' glyph names where - possible. - - * font/devdvi/generate/{tc,texttt,ec,texmi,texsy,textex}.map: Do it. - * font/devdvi/generate/textex.map: Map glyph 23 to `u21C6' instead - of `<>'. - * font/devdvi/*: Regenerated. - - Map `la' and `ra' to U+27E8 and U+27E9. These two characters have - normal width, while the previously used characters (U+2329 and - U+232A) are classified as wide due to canonical equivalence with the - CJK punctuation characters U+3008 and U+3009. - - * font/devutf8/R.proto: Updated. - * src/roff/troff/uniglyph.cc, src/roff/troff/glyphuni.cc: Ditto. - - * man/groff_char.man: Simplify handling of table traps by - introducing `start block' and `end block' macros. - (Ns, Ne, 2s, 2e, Ds, De): New macros. - (DL): Make it work with Unix troff also. - Fix code values of `la' and `ra'. - - * tmac/dvi.tmac: Define `<>' for CW and CWI. - -2003-02-23 Gaius Mulley - - * src/devices/grohtml/post-html.cc (element_list::~element_list): - New destructor, fixing a major memory leak. - -2003-02-22 Werner LEMBERG - - * font/devhtml/R.proto, font/devutf8/R.proto: Flip `*f' and `+f' - to be in conformance with Unicode 3.0 and newer. - - * font/devlj4/generate/text.map: Add `Eu'. - * font/devlj4/generate/special.map: Flip `*e' and `+e'. - * font/devlj4/S: Regenerated. - - * man/groff_char.man: Completely rewritten. - - * doc/groff.texinfo: Fix description of request and macro arguments. - -2003-02-20 Gaius Mulley - - Valgrind fixes. - - * src/devices/grohtml/html-table.cc (html_table::~html_table): - Deallocate `columns' list. - * src/devices/grohtml/post-html.cc (char_block::~char_block): - New destructor. - (text_glob::text_glob_html, text_glob::text_glob_special, - text_glob::text_glob_line, text_glob::text_glob_auto_image, - text_glob::text_glob_tag): Avoid memory leaks. - (text_glob::remember_table): Free memory before reassigning. - -2003-02-19 Werner LEMBERG - - Add glyph `+e', greek lunate epsilon symbol, and `-h' (with the - alias `hbar'), the Planck constant over two pi. - - * font/devdvi/generate/texmi.map: Use `*e' for position 15 and - `+e' for position 34. - * font/devdvi/generate/texsy.map: Replace `DI' and `HE' with - `u2662' and `u2661'. - * font/devdvi/{MI,S}: Regenerated. - * font/devhtml/R.proto, font/devutf8/R.proto: Add `+e', `-h', `hbar'. - * font/devlbp/*: Add `hbar' alias. - * font/devlj4/generate/special.map: Ditto. - * font/devlj4/S: Regenerated. - * font/devps/generate/symbolchars: Add `+e'. - * font/devps/generate/textmap: Fix PS name for `-h'. - Add `hbar' alias. - * font/devps/symbolmap: Regenerated. - - * src/devices/grops/ps.cc (transform_fill): Removed since unused. - - * src/roff/troff/glyphuni.cc (glyph_to_unicode_list): Add `+e', - `-h', `hbar'. - * src/roff/troff/uniglyph.cc (unicode_to_glyph_list): Add `+e', - `-h'. - - * tmac/X.tmac, tmac/ps.tmac: Provide definitions for `-h' and - `hbar'. - * tmac/tty-char.tmac: Add `+e'. - -2003-02-17 Werner LEMBERG - - Another round trying to really fix problems with `have_input'. - - * src/roff/troff/input.cc (input_stack::get): Handle `have_input'. - (token::next) <'\n'>, <\'\n'>: Don't handle `have_input'. - - * src/devices/grotty/tty.cc (tty_printer::put_color): Fix color - handling if both foreground and background colors are default. - - * doc/groff.texinfo (Debugging): Document .lf differences to - AT&T troff. - -2003-02-16 Werner LEMBERG - - * src/devices/grotty/tty.cc (tty_printer::make_rgb_string): Avoid - null-bytes in created string. - - * src/roff/troff/input.cc (lookup_color, interpolate_macro, - alias_macro, lookup_request): Improve warning messages. - - * src/roff/troff/node.cc (suppress_node::tprint): Use `strsave', - not `strdup'. - Free `last_image_filename'. - - * src/preproc/html/pre-html.cc (char_block::char_block): Initialize - `buffer'. - (imageList::createPage, imageList::createImage): Use `free', not - `a_delete'. - (imageItem::~imageItem): Free `imageName'. - (addRegDef): Use `strsave', not `strdup'. - (get_resolution): Free `pathp'. - -2003-02-15 Werner LEMBERG - - * src/devices/grotty/tty.cc (tty_printer::tty_printer): Fix pointer - to `dummy'. - -2003-02-14 Werner LEMBERG - - Add memory management for colors to deallocate unnamed colors - properly. - - * src/include/color.h (color): New members `free_list' and `next'. - New member functions `new' and `delete'. - Add destructor. - * src/libs/libgroff/color.cc: Implement it. - - * src/libs/libgroff/font.cc (font::add_kern): Use integer cast - for array size of new operator. - - * src/libs/libdriver/input.cc (IntArray::operator[]): Remove - redundant comparison. - - * src/roff/troff/input.cc (word_space_node::reread, - hmotion_node::reread): Avoid warning about unused parameter. - (reset_output_registers): Remove redundant parameter. - (define_color): Undo change 2003-02-12. - - * src/roff/troff/reg.h: Updated. - - * src/roff/troff/node.cc (troff_output_file::really_print_line, - output_file::put_filename, real_output_file::really_put_filename, - ascii_output_file::really_print_line, - break_char_node::get_hyphen_list): Avoid warning about unused - parameter. - (suppress_node::tprint): Updated. - - * configure.ac: Check declaration for rand() and srand(). - * configure: Regenerated. - - * src/preproc/pic/pic.h: Declare fmod(), rand(), and srand() - conditionally. - * src/preproc/pic/pic.y: Remove declaration of fmod(), rand(), - and srand(). - - * src/preproc/eqn/delim.cc (delim_table): Add missing initializers - to avoid compiler warnings. - - * src/preproc/grn/hgraph.cc (HGPrintElt): Second parameter is - unused. - - * src/devices/grops/ps.cc (ps_printer::set_char): Last parameter - is unused. - * src/devices/grops/psrm.cc (skip_possible_newline): Remove first - (unused) parameter. - Updated all callers. - - * src/devices/grotty/tty.cc (tty_printer::set_char): Last parameter - is unused. - * src/devices/grodvi/dvi.cc (dvi_printer::set_char): Ditto. - * src/devices/grolj4/lj4.cc (lj4_printer::set_char): Ditto. - - * src/devices/grohtml/post-html.cc (html_printer::emit_line): - Parameter is unused. - (html_printer::add_table_end): Define parameter conditionally. - * src/devices/grohtml/output.cc (simple_output::special): Parameter - is unused. - - * src/devices/grolbp/lbp.cc: Define _GNU_SOURCE conditionally. - (lbp_printer::set_char): Last parameter is unused. - - * src/utils/indxbib/indxbib.cc (main): Remove redundant comparison. - -2003-02-13 Werner LEMBERG - - New commands \D'Fr ...', \D'Fc ...', etc. for orthogonality. - Make \D'f ...' move horizontally again for backwards compatibility. - Replace it with \D'Fg ...' where appropriate to avoid dependency - on horizontal resolution. - - * src/roff/troff/input.cc (do_get_long_name): New function. - (get_long_name): Call it. - - (read_draw_node): Handle `\D'Fx ...' by calling ... - (read_color_draw_node): New function. - - (read_rgb, read_cmy, read_cmyk, read_gray): New optional argument - `end'. - Pass it to `do_get_long_name' which is used instead of - `get_long_name'. - - * src/libs/libdriver/input.cc (color_from_Df_command): Remove - unnecessary value guard. - (parse_D_command) <'f'>: Add horizontal shift. - - * src/preproc/grn/hgraph.cc (HGPrintElt) : Use \D'Fg ...'. - * src/preproc/pic/troff.cc (troff_output::set_fill): Ditto. - (FILL_MAX): Removed. - - * NEWS, man/groff_diff.man, man/groff.man, doc/groff.texinfo: - Updated. - -2003-02-12 Werner LEMBERG - - * src/roff/troff/input.cc (do_name_test, do_expr_test, - do_zero_width): Push `\n' if closing delimiter is missing. - - (token::next) , <'\n'>, <\'\n'>: Reset `have_input'. - <'F'>: Make \F non-transparent at the beginning of line. - (process_input_stack) : Don't handle - `have_input'. - - (define_color): Free color in case of reassignment. - - * doc/groff.texinfo (@Defesc, @DefescList, @DefescItem, - @DefescListEnd): Use @Var, not @var. - Fix all calls. - - * src/preproc/grn/hgraph.cc (HGPrintElt): Fix typo. - - * src/preproc/pic/object.cc (object_spec::~object_spec): Free - `shaded' and `outlined' arrays. - (object_spec::object_spec): Initialize `shaded' and `outlined'. - (graphic_object::set_fill_color, graphic_object::set_outline_color): - Use strsave. - (closed_object::set_fill_color): Ditto. - * src/preproc/pic/troff.cc (troff_output::set_color): Use strsave - instead of strdup. - (troff_output::reset_color): Use a_delete instead of free. - * src/preproc/pic/main.cc (do_file): Free `out' in case of error. - -2003-02-11 Werner LEMBERG - - * doc/groff.texinfo: Improve documentation of `ad'. - Document that \D'f...' is dependent on the horizontal resolution. - * man/groff_diff.man: Improve documentation of \D'f...'. - - * src/preproc/grn/hgraph.cc (HGPrintElt) : Don't emit - compensating \h'...' for \D'f ...' since the latter no longer moves - current position. - * src/preproc/pic/troff.cc (troff_output::set_fill): Ditto. - -2003-02-10 Werner LEMBERG - - Improve error messages for `x F' (and `F') commands. - - * src/include/error.h: Add declaration for - `current_source_filename'. - * src/libs/libgroff/filename.cc: Add `current_source_filename'. - * src/libs/libgroff/error.cc (do_error_with_file_and_line): Add - parameter for source file string. - Updated all callers. - - * src/libs/libdriver/input.cc: Add `current_source_filename'. - (remember_source_filename): New function. - (parse_x_command <'F'>, do_file <'F'>): Use it. - -2003-02-09 Werner LEMBERG - - Make grotty not emit warnings about unknown colors more than - necessary. - - * src/devices/grotty/tty.cc: Include `ptable.h'. - (TTY_MAX_COLORS): Removed. - (DEFAULT_COLOR_IDX): Defined to -1. - (glyph): Change `back_color_idx' and `fore_color_idx' to `char'. - (tty_printer): Change `curr_back_idx' and `curr_fore_idx' to `char'. - Change `tty_colors' to be a ptable. - First arg of `put_color' is now `char'. - New functions `make_rgb_string' and `tty_color'. - (tty_printer::tty_printer): Use `tty_color'. - (tty_printer::color_to_idx): Return value is now `char'. - Use `tty_color'. - - * src/include/color.h (color): Add `print_color' member function. - * src/libs/libgroff/color.cc (color::print_color): Implement it. - -2003-02-08 Werner LEMBERG - - Valgrind fixes. - - * src/devices/grops/ps.cc (ps_printer::define_encoding): Close - encoding file. - - * src/include/ptable.h (PTABLE::~PTABLE, PTABLE::define): Always - assume that value has been allocated with `new[]', thus use - `a_delete' for deallocation. - - * src/libs/libdriver/input.cc (get_integer_arg, - get_possibly_int_args, parse_x_command, do_file): Use `a_delete' - where appropriate. - - * src/libs/libgroff/new.cc (delete) [!COOKIE_BUG]: Define. - * src/libs/libgroff/nametoindex.cc - (character_indexer::named_char_index): Use `new [1]'. - - * src/preproc/eqn/lex.cc (init_table, do_definition): Use `new - [1]'. - * src/preproc/eqn/text.cc (set_special_char_type): Ditto. - (split_text): Use `a_delete'. - - * src/preproc/pic/pic.y (define_label, define_variable): Use `new - [1]'. - - * src/roff/troff/env.cc (environment::choose_breakpoint): Avoid - harmless memory leak. - (hyphen_trie::read_patterns_file): Initialize `buf'. - * src/roff/troff/node.cc (troff_output_file::troff_output_file): - Initialize `current_fill_color'and `current_glyph_color'. - * src/roff/troff/glyphuni.cc - (glyph_to_unicode_init::glyph_to_unicode_init): Use `new [1]'. - * src/roff/troff/uniuni.cc - (unicode_decompose_init::unicode_decompose_init): Ditto. - * src/roff/troff/uniglyph.cc - (unicode_to_glyph_init::unicode_to_glyph_init): Ditto. - -2003-01-26 Werner LEMBERG - - * src/utils/indxbib/indxbib.cc (main) [__EMX__]: Check with - `access' before calling `unlink'. - (do_file): Handle __EMX__. - - * src/include/nonposix.h: Handle __EMX__. - - * Makefile.in (SEP): New variable; set to @PATH_SEPARATOR@. - (fontpath,tmacpath): Use it. - (MDEFINES): Add it. - Sorted alphabetically. - - * src/preproc/eqn/neqn.sh, src/roff/nroff/nroff.sh: Use - @SEP@. - * src/preproc/eqn/Makefile.sub, src/roff/nroff/Makefile.sub: Handle - @SEP@. - -2003-01-27 Werner LEMBERG - - * src/libs/libgroff/strcasecmp.c, src/libs/libgroff/strncasecmp.c: - New files, copied from gnulib. - * src/libs/libgroff/Makefile.sub (CSRCS): Add them. - * configure.ac: Updated. - * configure: Regenerated. - - * src/include/config.hin: Regenerated. - * src/include/lib.h [!HAVE_STRCASECMP]: Declare `strcasecmp'. - Don't define `strcasecmp' as `strcmp'. - [!HAVE_STRNCASECMP]: Declare `strncasecmp'. - Dont define `strncasecmp' as `strncmp'. - - * src/roff/groff/pipeline.c [!HAVE_STRCASECMP, !HAVE_STRNCASECMP]: - Removed. - -2003-01-26 Werner LEMBERG - - * src/utils/indxbib/indxbib.cc (main) [__EMX__]: Fix typo: - s/unline/unlink/. - -2003-01-25 Werner LEMBERG - - * doc/groff.texinfo (Ligatures and Kerning): Mention limitations. - -2003-01-24 Werner LEMBERG - - Add US-english hyphenation exceptions (converted from Barbara - Beeton's hyphenation exception log reports which appear irregularly - in TUGBoat). - - * tmac/hyphen.us: Updated to latest version. - * tmac/README: Updated. - * tmac/hyphenex.us, tmac/hyphenex.sh: New files. - * tmac/troffrc: Load `hyphenex.us'. - * tmac/Makefile.sub (NORMALFILES): Add `hyphenex.us'. - * doc/groff.texinfo: Updated. - -2003-01-23 Werner LEMBERG - - Improve hyphenation slightly. This is a first step in redesigning - the hyphenation algorithm to make it more flexible (e.g. allowing - kerns and ligatures between the hyphenation character and the - following character -- while not used normally in English, other - languages like German would benefit). - - * src/roff/troff/env.cc (environment::hyphenate_line): Use - assertion instead of if-clause. - Let `get_hyphen_list' return the number of involved characters in - the hyphenation pattern instead of computing it directly (which - often yields too small values). - * src/roff/troff/node.h (*::get_hyphen_list): Add second parameter. - * src/roff/troff/node.cc (*::get_hyphen_list): Handle new second - parameter. - -2003-01-22 Werner LEMBERG - - Fixing a bug which caused groff to hang if the hyphenation exception - dictionary tried to grow. - - * src/roff/troff/env.cc (hyphen_trie::insert_hyphenation, - hyphen_trie::read_patterns_file, do_hyphenation_patterns_file): Use - pointer to dictionary. - -2003-01-20 Werner LEMBERG - - * src/utils/afmtodit/afmtodit.pl: Add switch `-m' to suppress - negative left italic correction. - * src/utils/afmtodit/afmtodit.man: Document it. - - * font/devps/generate/Makefile (RFLAG): Add `-m'. - * font/devps/{AB,AR,BMB,BMR,CB,CR,EURO,HB,HR,HNB,HNR,NB,NR,PB,PR, - S,TB,TR,ZD,ZDR}: Regenerated with afmtodit options `-i 0 -m'. - - * NEWS: Updated. - -2003-01-16 Werner LEMBERG - - * NEWS: Updated. - -2003-01-16 Jörgen Grahn - - * src/preproc/refer/refer.man: Mention REFER environment variable. - -2003-01-05 Werner LEMBERG - - Similar to \[is], the square root glyph (\[sr]) and the square root - extension glyph (\[radicalex]) are now text symbols. The new - mathematical versions are called \[sqrt] and \[sqrtex], - respectively. - - * font/devX*/S: Regenerated. - * font/devdvi/generate/texex.map: Rename `sr[0123]' to `sqrt[0123]'. - * font/devdvi/generate/texsy.map: Rename `sr' to `sqrt'. - * font/devdvi/EX, font/devdvi/S: Regenerated. - * font/devhtml/R.proto, font/devutf8/R.proto: Add `sqrt'. - * font/devlj4/generate/special.map: Add `sqrt'. - * font/devlj4/S: Regenerated. - * font/devps/generate/textmap: Add `sqrt'. - * font/devps/S, font/devps/symbolmap: Regenerated. - - * src/preproc/eqn/sqrt.cc (SQRT_CHAR, RADICAL_EXTENSION_CHAR, - SQRT_CHAIN, BAR_CHAIN): Use `sqrt*' and `sqrtex*'. - * src/roff/troff/input.cc (init_charset_table): Make `sqrtex' - overlap horizontally. - - * tmac/X.tmac, tmac/ps.tmac, tmac/lj4.tmac: Add `sqrtex'. - * tmac/dvi.tmac: Add `sr', and `sqrtex'. - Fix `radicalex'. - - * doc/groff.texinfo, man/groff_diff.man: Document that `radicalex' - and `sqrtex' are overlapping glyphs. - -2003-01-04 Werner LEMBERG - - * font/devdvi/generate/texsy.map: Add `is'. - * font/devps/symbolmap: Regenerated. - * font/devdvi/*TC, MI, S: Regenerated. - - * tmac/dvi.tmac: Remove `is'. - -2003-01-03 Werner LEMBERG - - `is' is now a text symbol (only relevant for dvi). The math variant - can be accessed with `integral'. - - * font/devX*/S: Regenerated. - * font/devdvi/generate/texex.map: Remove `is'. - * font/devdvi/EX: Updated. - * font/devhtml/R.proto, font/devutf8/R.proto: Add `integral'. - * font/devlj4/generate/special.map: Ditto. - * font/devlj4/S: Regenerated. - * font/devps/generate/textmap: Add `integral'. - * font/devps/S: Regenerated. - - * tmac/dvi.tmac: Define `is'. - - * src/roff/troff/glyphuni.cc (glyph_to_unicode_list): Add `integral'. - - * src/preproc/tbl/main.cc (process_format): Fix error message. - -2003-01-02 Werner LEMBERG - - * font/devhtml/R.proto, font/devutf8/R.proto: Add `ne' and `nc'. - * font/devps/textmap: Fix entries for `ne' and `nc'. - * font/devps/symbolmap: Regenerated. - - * src/roff/troff/glyphuni.cc (glyph_to_unicode_list), - src/roff/troff/uniglyph.cc (unicode_to_glyph_list): Add `18', - `38', `58', `78', `-+', `|=', `nc', `ne'. - - * tmac/dvi.tmac: Add `nm', `ne', `nc'. - Use `schar' for `aq'. - * tmac/ps.tmac, tmac/X.tmac: Add `nc' and `ne'. - * tmac/ec.tmac: Add `SC' to special fonts for `CW' and `CWI'. - * tmac/tty.tmac: Add `ne'. - - * src/roff/troff/node.cc (make_glyph_node): Test with `get_macro' - for fallback glyphs. - -2002-12-29 Werner LEMBERG - - Add glyph `|='. - - * font/devX*/*: Regenerated. - * font/devdvi/generate/ec.map: Remove `eq'. - * font/devdvi/generate/texsy.map: Make `~=' the same as `~~'. - Assign `|=' to position 39. - * font/devdvi/*EC, S: Regenerated. - * font/devhtml/R.proto, font/devutf8/R.proto: Add `|='. - * font/devlj4/generate/special.map: Make `~=' the same as `~~'. - Assign `|=' to position 549. - * font/devps/generate/textmap, font/devps/enerate/symbolmap: Remove - `equalmath'. - Add `uni2243' for `|='. - - * tmac/ec.tmac: Add `eq'. - * tmac/dvi.tmac: Add `=~'. - * tmac/tty-char.tmac, tmac/ps.tmac, tmac/X.tmac, tmac/lbp.tmac: Add - `|='. - -2002-12-21 Werner LEMBERG - - * font/devdvi/generate/tc.map: Remove `**'. - * font/devdvi/*TC: Regenerated. - * font/devhtml/R.proto, font/devutf8/R.proto: Add `18', `38', `58', - `78', `<<', `>>'. - * font/devutf8/NOTES: Updated. - - * src/roff/troff/charinfo.h (charinfo): Add `setx_macro' function. - Don't give default parameter to `set_macro'. - * src/roff/troff/input.cc (do_define_character): Use `setx_macro' - instead of `set_macro'. - (charinfo::setx_macro): Implement it. - (charinfo::set_macro): Don't change `mode'. - - * tmac/tty.tmac: Add `18', `38', `58', `78', `<<', `>>'. - * tmac/ps.tmac, tmac/X.tmac: Add `<<', `>>'. - * tmac/dvi.tmac: Define `!=' with `.schar'. - -2002-12-20 Werner LEMBERG - - * font/devX*/S: Regenerated. - * font/devdvi/generate/ec.map: Remove `pl'. - * font/devdvi/generate/tc.map: Remove `mi', `14', `12', `34'. - * font/devdvi/*{TC,EC}: Regenerated. - * font/devhtml/R.proto: Add `-+'. - Remove double entries for `rk', `lk', `lt', `rt', `rb', `lb'. - * font/devlbp/*: Remove `or'. - * font/devlj4/generate/special.map: Remove `or'. - * font/devlj4/S: Regenerated. - * font/devps/generate/textmap: Add `fiveeighths', `oneeighth', - `seveneighths', `threeeighths'. - Remove `plusmath'. - Replace `minusplus' with `uni2213'. - * font/devps/symbolmap: Regenerated. - * font/devutf8/R.proto: Replace `shc' with unnamed glyph. - Add `-+'. - - * src/roff/troff/charinfo.h (charinfo): Add `is_normal' inline - function. - * src/roff/troff/node.cc (troff_output_file::put_char_width): - Call glyph_color and fill_color even if tcommand_flag isn't set. - (make_node, node::add_char): Check not ci->is_fallback but - ci->is_normal. - - * tmac/lj4.tmac, tmac/lbp.tmac: Define `or'. - * tmac/ec.tmac: Add .rchar entry for `f/'. - Don't remove `12', `14', `34'. - Define `pl' to be always roman. - * tmac/ps.tmac (ps-frac, ps-frac-mono): New macros. - Define `18', `38', `58', `78'. - * tmac/tty.tmac: Add `-+'. - * tmac/dvi.tmac: Define `f/'. - (dvi-frac): Use `f/'. - * tmac/X.tmac (X-frac, X-frac-mono): New macros. - Define `18', `38', `58', `78'. - -2002-12-15 Colin Watson - - * contrib/pic2graph/pic2graph.sh: Add missing `;;'. - -2002-12-10 Werner LEMBERG - - Add glyph `tno', a textual variant of `no'. - - * font/devX*/*: Regenerated. - * font/{devcp1047,devlatin1,devutf8,devhtml}/R.proto: Add `tno'. - * font/devdvi/generate/{tc.map: Replace `no' with `tno'. - * font/devdvi/generated/{texsy,textex}.map: Add `tno'. - * font/devdvi/*: Regenerated. - * font/devlbp/*: Add `tno'. - * font/devlj4/generate/tex.map: Replace `no' with `tno'. - * font/devlj4/*: Regenerated. - * font/devps/generate/textmap: Replace `no' with `tno'. - * font/devps/generate/symbolchars: Add `no'. - * font/devps/*: Regenerated. - - * src/roff/troff/glyphuni.cc (glyph_to_unicode_list): Add `tno'. - - * tmac/cp1047.tmac, tmac/latin1.tmac: Replace `no' with `tno'. - * tmac/tty-char.tmac: Add entry for `tno' and `3d'. - - * NEWS: Updated. - - * tmac/dvi.tmac: Replace most `\\' with `\E'. - Add definition for `sd'. - * tmac/X.tmac, tmac/ps.tmac: Replace most `\\' with `\E'. - - * tmac/eqnrc : Use `integral' instead of `is' glyph. - -2002-12-08 Werner LEMBERG - - * tmac/an-old.tmac (TH): Use integer value for `IN' if in nroff - mode to avoid rounding errors. - (an-do-tag, an-do-tag-html, RS, RE): Remove redundant `.br'. - - * src/roff/groff/groff.man, src/roff/nroff/nroff.man, - src/roff/troff/troff.man: Improve documentation of -T. - -2002-12-07 Jeff Conrad - - * src/roff/groff/pipeline.c: Don't define `const' for _WIN32. - (run_pipeline) [_WIN32]: Provide working function without `fork'. - -2002-12-06 Werner LEMBERG - - * font/devps/generate/freeeuro.sfd: Make dimensions of Euro.symbol - glyphs compatible to Adobe's Euro fonts (scaling them down a bit). - Scaling Euro.sansserif glyphs down to have the same height as - digits. - Removed unnecessary points; added some extrema. - - * font/devps/EURO, font/devps/freeeuro.afm, font/devps/freeeuro.pfa: - Regenerated. - -2002-12-04 Werner LEMBERG - - * font/devps/generate/freeeuro.sfd: Add glyphs `Euro.symbol.slanted' - and `Euro.symbol.bold.slanted'. - Improve some glyph offsets and widths. - * font/devps/EURO, font/devps/freeeuro.afm, font/devps/freeeuro.pfa: - Regenerated. - * font/devps/generate/Makefile (freeeuro.afm freeeuro.pfa): Fix - typo. - * font/devps/generate/sfdtopfa.pe: Generate PFA in current - direcory. - - * tmac/europs.tmac: Updated to new glyph indices. - Use Euro.symbol for font familiy `A'. - - * doc/groff.texinfo: Minor improvements. - -2002-12-02 Werner LEMBERG - - * font/devdvi/generate.tc.map: s/%O/%0/. - * font/devdvi/*TC: Regenerated. - - * src/roff/troff/div.cc (init_div_requests): Sorted. - - * tmac/dvi.tmac: Remove `Ye'. - * tmac/ec.tmac: Remove `Ye'. - Add .rchar entry for `de'. - - * man/groff.man, man/groff_diff.man: Document register `.pe'. - * doc/groff.texinfo: Document registers `.pe', `.n', and `.w'. - * NEWS: Updated. - -2002-11-30 Werner LEMBERG - - Add PS font for various Euro glyphs. - - * font/devps/generate/freeeuro.sfd: New master font file for - pfaedit. - * font/devps/generate/sfdtopfa.pe: New conversion script for - pfaedit. - * font/devps/generate/Makefile (FONTS): Add `EURO'. - (EURO, freeeuro.afm, freeeuro.pfa): New rules. - * font/devps/freeeuro.pfa, font/devps/freeeuro.afm: Generated from - `freeeuro.sfd'. - * font/devps/EURO: Generated from `freeeuro.afm'. - * font/devps/download: Add `freeuro.pfa'. - * font/devps/Makefile.sub (NORMALFILES): Adde `EURO' and - `freeeuro.pfa'. - - * tmac/europs.tmac: New file. - * tmac/ps.tmac: Include `europs.tmac'. - * tmac/Makefile.sub (DISTFILES): Add `europs.tmac'. - -2002-11-29 Werner LEMBERG - - * font/devdvi/generate/texsy.map: Remove `lh' and `rh'. - * font/devdvi/S: Regenerated. - * font/devhtml/R.proto: Fix `CR' and `ci'. - Add `OK'. - * font/devps/generate/textmap: Fix `lh', `rh', and `sq'. - Remove `bs'. - * font/devps/symbolmap: Regenerated. - * font/devutf8/R.proto: Fix `CR' and `ci'. - Add `OK'. - * font/devutf8/NOTES: Updated. - - * src/roff/troff/uniglyph.cc (unicode_to_glyph_list): Fix `CR' and - `ci'. - Add `OK'. - * src/roff/troff/glyphuni.cc (glyph_to_unicode_list): Ditto. - - * tmac/dvi.tmac: Add `lh' and `rh'. - * tmac/Xps.tmac: Fix `lh' and `rh'. - * tmac/X.tmac: Add `OK'. - * tmac/lj4.tmac: Ditto. - -2002-11-24 Werner LEMBERG - - * font/devX*/S: Regenerated. - * font/devascii/R.proto, font/devcp1047/R.proto: Remove glyphs `lb', - `lc', `lf', `lk', `lt', `rb', `rc', `rf', `rk', and `rt'. - * font/devdvi/generate/texsy.map: Remove `or' glyph. - * font/devdvi/S: Regenerated. - * font/devhtml/R.proto, font/devutf8/R.proto: Add/fix glyphs - `parenlefttp', `parenleftex', `parenleftbt', `parenrighttp', - `parenrightex', `parenrightbt', `bracketlefttp', `bracketleftex', - `bracketleftbt', `bracketrighttp', `bracketrightex', - `bracketrightbt', `bracelefttp', `braceleftmid', `braceleftbt', - `braceex', `braceleftex', `bracerightex', `bracerighttp', - `bracerightmid', `bracerightbt', `lt', `lk', `lb', `rt', `rk', - `rb', and `bv'. - * src/roff/troff/glyphuni.cc, src/roff/troff/uniglyph.cc: Ditto. - * font/devutf8/NOTES: Updated. - * font/devlj4/generate/special.map: Add glyph `braceex'. - * font/devlj4/S: Regenerated. - - * tmac/tty-char.tmac: Add glyphs `lf', `rf', `lc', and `rc'. - -2002-11-14 Werner LEMBERG - - * src/roff/troff/uniglyph.cc (unicode_to_glyph_list): Add `va' - and `vA'. - Fix code for `an'. - * src/roff/troff/glyphuni.cc (glyph_to_unicode_list): Ditto. - - * doc/texinfo.tex: New version from texinfo 4.3. - * doc/groff.texinfo: Updated for texinfo 4.3. - Use @tie{} where appropriate. - * font/devdvi/generate/ec.map: Don't include `or' and `bv'. - * font/devdvi/generate/tc.map: Remove `rn'. - * font/devdvi/*TC, font/devdvi/*EC: Regenerated. - * font/devhtml/R.proto, font/devutf8/R.proto: Add `vA'. - Fix code for `an'. - * font/devX100/*, font/devX100-12/*, font/devX75/*, - font/devX75-12/*: Regenerated. - - * tmac/dvi.tmac: Add special fonts `SA' and `SB'. - Use .char (again) for `br', `ul', `rn', `or', and `ru'. - Improve definition of `an'. - * tmac/ps.tmac: Use .char (again) for `br', `ul', `rn', `or', and - `ru'. - * tmac/lj4.tmac: Use .char (again) for `br', `ul', `rn', and `ru'. - * tmac/X.tmac: Add definition for `or'. - * tmac/Xps.tmac: Undo change 2002-11-05. - * tmac/lbp.tmac: Add definitions for `br', `rn', `ul', and `ru'. - -2002-11-11 Werner LEMBERG - - * src/roff/troff/node.cc (troff_output_file::put_char): Always - call flush_tbuf. - -2002-11-10 Werner LEMBERG - - Added three new requests `schar', `fschar', and `rfschar'. `schar' - defines a glyph which is searched after the check for fonts declared - with `.special' (and before the check for all mounted special - fonts). `fschar' defines a glyph for a particular font which is - searched after the check for fonts declared with `.fspecial' (and - before the check for fonts declared with `.special'). `rfschar' - removes glyphs defined with `fschar'. - - * src/roff/troff/token.h (char_mode): New enum. - Declare do_define_character. - * src/roff/troff/charinfo.h (charinfo): Replace `fallback' with - `mode'. - (charinfo::is_fallback): Updated. - (charinfo::is_special): New method. - * src/roff/troff/input.cc (do_define_character): Add and use - optional second parameter used as a prefix for font-specific glyph - names. - (define_character, define_fallback_character): Updated. - (define_special_character): New function. - (init_input_requests): Add `schar'. - (charinfo::charinfo, charinfo::set_macro): Updated. - * src/roff/troff/node.cc: Include `stringclass.h'. - (make_glyph_node): Handle special glyphs defined with `.schar' and - `.fschar'. - (define_font_special_character, remove_font_special_character): New - functions. - (init_node_requests): Sorted. - Add `fschar' and `rfschar'. - * NEWS, man/groff_diff.man, man/groff.man, doc/groff.texinfo: - Document new requests. - - * font/devhtml/R.proto, font/devutf8/R.proto: Add `va'. - * tmac/dvi.tmac: Add `va' for CW and CWI (using `.fschar'). - -2002-11-08 Werner LEMBERG - - Added new font `SC' (cmtex10) to devdvi. - - * devdvi/generate/Makefile (FONTS): Add `SC'. - (SC): New rule. - * devdvi/generate/textex.map: New map file for cmtex. - * devdvi/SC: New. - * devdvi/Makefile.sub (DEVFILES): Updated. - * tmac/dvi.tmac: Add fspecial entries for SC. - Add `MI', `S' and `CW' to the `special' call. Otherwise, `SC' is - found before `S' since the font position of `SC' is lower due to the - gaps in DESC's `font' line. - * tmac/ec.tmac: Add a `special' call. - * NEWS: Updated. - - * font/devhtml/R.proto: Remove double entry for `ti'. - * tmac/tty.tmac: Add entries for `IJ', `ij', and `bq'. - * tmac/tty-char.tmac: Remove entry for `bq'. - * tmac/lbp.tmac: Add entries for `lq', `rq', `fo', `fc', and `em'. - * tmac/ec.tmac: Don't remove `aq' glyph. - * tmac/X.tmac: Fix entry for `em'. - Add entries for `fo' and `fc'. - * tmac/dvi.tmac: Add entries for `em', `en', `hy', `fo', and `fc'. - - * doc/groff.texinfo, man/groff.man, man/groff_diff.man: Fix - documentation of `special' and `fspecial' requests. - -2002-11-05 Werner LEMBERG - - * font/devascii/R.proto, font/devcp1047/R.proto, - font/devlatin1/R.proto: Remove entry for `.i'. - * font/devdvi/generate/textt.map: Add entry for `ad'. - * font/devdvi/generate/texr.map, font/devdvi/generate/texb.map, - font/devdvi/generate/texi.map: Add dummy glyph name `slash@for@l'. - We need this for getting kerning values to compose `/l' and `/L'. - * font/devdvi: Regenerated font definition files for CM fonts. - * font/devhtml/R.proto: Add entries for "'C", "'c", `IJ', and `ij'. - * font/devutf8/R.proto: Ditto. - Remove double entry for `ti'. - - * src/roff/troff/glyphuni.cc (glyph_to_unicode_list): Fix entries - for (groff) ligatures, `la', and `ra'. - Add "'C", "'c", `IJ', and `ij'. - Remove double entry for `ti'. - * src/roff/troff/uniglyph.cc (unicode_to_glyph_list): Remove all - double entries. - Add "'C", "'c", `IJ', and `ij'. - Fix entries for (groff) ligatures, `la', and `ra'. - - * tmac/ps.tmac (ps-achar): New macro. - Define "'c" and "'C". - * tmac/tty.tmac: Add entry for `.i'. - * tmac/X.tmac (X-achar): New macro. - Define "'c", "'C", and `:Y'. - Add entries for `IJ' and `ij'. - * tmac/Xps.tmac (Xps-achar): New macro. - Define "'c" and "'C". - Add entries for `IJ' and `ij'. - * tmac/lbp.tmac (lbp-achar): New macro. - Add fallback characters for all groff ligatures and many other - glyphs. - * tmac/dvi.tmac: Fix definitions of `_' and `ul'. - Add entries for `/l' and `/L'. - Define "'c" and "'C". - Add entries for `IJ' and `ij'. - -2002-11-02 Larry Kollar - - * PROBLEMS: Document how to solve Mac OS X compilation problems. - -2002-11-02 Werner LEMBERG - - Adding support for composite glyphs: \[xxx yyy ...] and the - `composite' request. - - * src/roff/troff/glyphuni.cc: New file for mapping groff glyph names - to Unicode-based glyph names. - * src/roff/troff/uniglyph.cc: New file for mapping Unicode-based - glyph names to groff glyph names. - * src/roff/troff/uniuni.cc: New file for canonically decomposing - Unicode-based glyph names. - * src/roff/troff/unicode.cc, src/roff/troff/unicode.h: New files - for handling Unicode glyph names. - * src/roff/troff/input.cc: Include unicode.h. - (composite_glyph_name): New function. - (token::next) <'['>: Handle Unicode glyph names and composite - glyphs. - (composite_dictionary): New dictionary for the `composite' request. - (composite_request): Implement `composite' request. - (init_input_requests): Add `composite'. - Alphabetically sorted. - * src/roff/troff/env.cc (tabs_save, tabs_restore): Removed (already - commented out). - (init_env_requests): Alphabetically sorted. - Removed `tas' and `tar' (already commented out). - * src/roff/troff/Makefile.sub: Updated. - -2002-10-31 Ruslan Ermilov - - * src/roff/nroff/nroff.man, src/roff/nroff/nroff.sh: Fix description - of options. - -2002-10-29 Werner LEMBERG - - Fix computation of .trunc register. Additionally, its value (and - the value of the .ne register) is now always set before entering the - trap. - - * src/roff/troff/div.cc (diversion::need): Set `truncated_space' and - `needed_space' before calling `space'. - (top_level_diversion::space): Remove special code for 'sp before the - first page. - Call `begin_page' with the discarded space as a parameter. - (top_level_diversion::begin_page): Add optional parameter to set - `truncated_space'. - * src/roff/troff/div.h: Updated. - - * doc/groff.texinfo: Improve documentation of .sp, \n[.trunc], and - \n[.ne]. - - * tmac/an-old.tmac (SH, SS, TP, IP, HP, TS): Undo change 2002-10-26. - (LP): Remove superfluous call to `br'. - * tmac/doc-common (doc-paragraph): Undo change 2002-10-26. - * tmac/doc.tmac (Bd, Bl, doc-set-vertical-and-indent): Ditto. - -2002-10-26 Werner LEMBERG - - * tmac/doc-ditroff: Remove useless switch/variable -rC. - (doc-setup-header): Don't set page register `%'. - * tmac/doc-nroff: Remove variable `C'. - (doc-setup-page-layout): Set doc-header-space to .5i unconditionally. - (doc-setup-header): Don't set page register `%'. - Don't call `bp'. - * tmac/doc-common (doc-header): Call `ns'. - (doc-paragraph): Protect .sp with .br so that it survives traps - possibly set by the user. - * tmac/doc.tmac (Bd, Bl, doc-set-vertical-and-indent): Ditto. - - * tmac/doc*: Replace ' with . for consistency if no effect. - -2002-10-26 Werner LEMBERG - - * tmac/an-old.tmac (SH, SS, TP, IP, HP, TS): Protect .sp with .br - so that it survives traps possibly set by the user. - - * src/roff/troff/node.cc: Fix the changes from 2002-10-23. - (troff_output_file::set_font): Call flush_tbuf if necessary. - (troff_output_file::fill_color, troff_output_file::glyph_color): Call - flush_tbuf and do_motion only if necessary. - (troff_output_file::start_special, - troff_output_file::put_char_width, troff_output_file::put_char, - troff_output_file::draw): Updated. - (word_space_node::tprint, space_node::tprint, hmotion_node::tprint, - vmotion_node::tprint): Undo change 2002-10-23. - -2002-10-25 Werner LEMBERG - - * tmac/www.tmac (DC): Fix case of overlapping images. - -2002-10-23 Werner LEMBERG - - * src/roff/troff/node.cc (troff_output_file::fill_color, - troff_output_file::glyph_color): Set current color before testing - color_flag. - (troff_output_file::put_char_width, troff_output_file::put_char, - troff_output_file::draw): Don't call flush_tbuf and/or do_motion - before glyph_color. - (troff_output_file::file_color, troff_output_file::glyph_color): - Call do_motion. - (word_space_node::tprint, space_node::tprint, hmotion_node::tprint, - vmotion_node::tprint): Move first, then call fill_color. - -2002-10-20 Werner LEMBERG - - * doc/groff.texinfo, man/groff_tmac.man: Document that it is not - possible to use multiple main macro packages. - -2002-10-19 Werner LEMBERG - - * src/devices/grops/ps.cc (cmyk_flag): New global variable. - (ps_printer::set_color): Set `cmyk_flag' for CMY and CMYK colors. - (ps_printer::~ps_printer): Emit `%%Extensions: CMYK' if `cmyk_flag' - is set. - * font/devps/prologue.ps (Fk, Ck): Enclose definitions with a - `where' construction since `cmyksetcolor' is a PS Level 2 operator. - -2002-10-16 Werner LEMBERG - - * NEWS, doc/webpage.ms: Updated. - -2002-10-14 Werner LEMBERG - - * src/roff/troff/node.cc (troff_output_file::put_char_width, - troff_output_file::put_char, troff_output_file::fill_color, - troff_output_file::glyph_color): Handle case where color pointer - is null. - -2002-10-13 Ruslan Ermilov - - Add the new -r option to grotty. It is similar to the -i option - except it tells grotty(1) to use the "reverse video" attribute to - render italic fonts. - - * src/devices/grotty/tty.cc (reverse_flag): New global variable. - (SGR_REVERSE, SGR_NO_REVERSE): New macros. - (tty_printer::make_underline, tty_printer::put_color, - tty_printer::end_page): Use it. - (main): Add -r switch. - (usage): Updated. - * src/devices/grotty/grotty.man: Document it. - -2002-10-11 Ruslan Ermilov - - * src/roff/troff/env.cc (hyphen_trie::read_patterns_file): Add - cast to `unsigned char' to properly read patterns with 8bit - characters. - -2002-10-08 Werner LEMBERG - - * REVISION: Increased to 2. - -Version 1.18.1 released -======================= - -2002-10-08 Werner LEMBERG - - * doc/webpage.ms, NEWS: Updated. - -2002-10-07 Werner LEMBERG - - * tmac/doc-common (Ss): Add final `.ns' (similar to `.Sh') to - suppress additional whitespace after the header. - - * tmac/doc-ditroff, tmac/doc-nroff (Am): New string to be in sync - with NetBSD. - - * src/preproc/grn/grn.man, tmac/groff_mdoc.man, NEWS: Updated. - -2002-10-07 Ruslan Ermilov - - * tmac/doc-common(doc-volume-operating-system-ateol): New flag. - (Dt): Use it to improve language localization (especially Russian - and French). - -2002-10-07 Daniel Senderowicz - - * src/preproc/grn/gprint.h (BSPLINE, BEZIER): New macros. - * src/preproc/grn/hdb.cc (DBGetType): Parse spline and bezier - drawing commands. - * src/preproc/grn/hgraph.cc (drawwig): Add parameter to control - curve type. - Call `picurve' for BSPLINE. - (HGPrintElt): Handle BSPLINE. - * src/preproc/grn/README: Document it. - -2002-10-03 Werner LEMBERG - - * src/roff/troff/node.cc (break_char_node::col): New variable. - Updated constructor. - (space_node::tprint, word_space_node::tprint): Call `fill_color' - unconditionally. - (space_node::space_node): Remove assertion. - (break_char_node::add_self): Pass color argument to space node. - * src/roff/troff/input.cc (token::add_to_node_list, token::process): - Ditto. - * src/roff/troff/env.cc (environment::do_break, - environment::add_padding): Ditto. - -2002-10-02 Werner LEMBERG - - Redesigning color support in troff. Colors are no longer - represented as separate nodes but are now part of glyph nodes and - friends. This fixes the current formatting misbehaviour due to the - changes introduced on 2002-09-20. Some extra code is necessary for - proper grotty support: Without adding color variables to - space-related nodes, the background color would be changed too late. - - * src/roff/troff/node.h, src/roff/troff/node.cc: - s/current_pagecolor/current_fill_color/. - s/current_glyphcolor/current_glyph_color/. - (glyph_color_node, fill_color_node): Removed. - (node::get_glyph_color, node::get_fill_color): New virtual member - functions. - (space_node::col): New variable. - Updated constructors of space_node and derived classes accordingly. - (hmotion_node::col): New variable. - Updated constructors of hmotion_node and space_char_hmotion_node - accordingly. - (vmotion_node::col): New variable. - Updated constructor accordingly. - (draw_node::gcol, draw_node::fcol): New variables. - Updated constructor accordingly. - (special_node::gcol, special_node::fcol): New variables. - Updated constructors accordingly. - (troff_output_file::put_char, troff_output_file::put_charwidth, - troff_output_file::draw): Set glyph and fill color. - (troff_output_file::start_special): Set glyph and fill color. - Always set current font. - (troff_output_file::fill_color, troff_output_file::glyph_color): - Don't call `do_motion'. - (glyph_node::gcol, glyph_node::fcol): New variables. - Updated constructors of glyph_node and ligature_node accordingly. - (glyph_node::get_glyph_color, glyph_node::get_fill_color): New - member functions. - (glyph_node::merge_glyph_node, - kern_pair_node::add_discretionary_hyphen, - node::add_discretionary_hyphen): Updated. - (break_char_node::merge_self): Updated. - (word_space_node::tprint, space_node::tprint, hmotion_node::tprint, - vmotion_node::tprint): Handle color. - (make_glyph_node, make_node, node::add_char): Updated. - - * src/roff/troff/env.cc (environment::space_newline, - environment::space, environment::output_line, environment::do_break, - environment::make_tab_node, environment::add_padding, title): - Updated. - (environment_switch, environment_copy): Don't add color nodes. - - * src/roff/troff/input.cc (do_glyph_color, do_fill_color): Return - nothing. - (token::next): Updated. - \m and \M now are as transparent as \s. - (process_input_stack, token::add_to_node_list, token::process, - read_draw_node): Updated. - (charinfo_to_node_list): Don't add color nodes. - - * doc/groff.texinfo: Updated. - -2002-09-27 Ruslan Ermilov - - * tmac/doc-common (ds-operating-system-FreeBSD-4.*): New version - strings. - -2002-09-27 Colin Watson - - * src/roff/troff/node.cc (bracket_node::copy): Check `list' != 0. - -2002-09-23 Werner LEMBERG - - * src/devices/grolbp/lbp.cc: Replace `300' with `font::res' where - appropriate. - (DEFAULT_LINEWIDTH_FACTOR): New macro. - (linewidth_factor): New global variable. - (lbp_printer::set_line_thickness): Fix case for size < 0, using - linewidth_factor. - (long_options): Add -w/--linewidth option. - (usage): Updated. - (main): Handle -w option to set linewidth_factor. - (lbp_printer::lbp_printer): Initialize req_linethickness, not - line_thickness. - - * src/devices/grolbp/grolbp.man, NEWS, doc/webpage.ms: Updated. - -2002-09-22 Paco Andrés Verdú - - Fixed a bug in the line thickness setting code. - - * src/devices/grolbp/lbp.cc (lbp_printer::req_linethickness): New - variable. - (lbp_printer::set_line_thickness): Pass environment as second - parameter. - Implement it actually. - (lpb_printer::set_char, lbp_printer::draw): Use `req_linethickness' - and `set_line_thickness, depending on the current font size. - -2002-09-21 Werner LEMBERG - - Some Debian patches. - - * src/roff/groff/pipeline.h (MAX_COMMANDS): Increase to 12. - * src/roff/troff/node.cc (bracket_node::copy): Initialize - `list->last'. - -2002-09-20 Werner LEMBERG - - * configure: Regenerated with autoconf 2.54. - -2002-09-20 Werner LEMBERG - - * src/roff/troff/env.h (environment): Rename cur_glyph_color to - glyph_color. - Rename cur_fill_color to fill_color. - * src/roff/troff/env.cc: Updated. - -2002-09-20 Werner LEMBERG - - * src/roff/troff/env.cc (title): Copy color status after processing - title. - * src/roff/troff/input.cc (charinfo_to_node_list): Emit glyph and - fill color nodes to reset colors properly. - - * tmac/www.tmac (DC): Fix color handling. - - * src/preproc/pic/pic.man, doc/pic.ms: Document some color issues. - * doc/groff.texinfo: Fixing documentation of `tl' request. - * doc/webpage.ms: Updated. - -2002-09-19 Werner LEMBERG - - * src/roff/troff/env.cc (environent_switch, environment_copy): - Emit glyph and fill color nodes to initialize colors properly. - -2002-09-17 Colin Watson - - * src/roff/troff/env.cc (environment::set_glyph_color, - environment::set_fill_color): Fix typo which prevented \m[] work - correctly. - -2002-09-17 Werner LEMBERG - - Add left and right italic correction to non-slanted PS fonts. This - is an experimental feature to improve image rendering of grohtml. - - * font/devps/generate/Makefile (RFLAG): New variable, set to `-i 0'. - ({T,H,C,P,N,BM,A,HN}{R,B}, ZD, S, ZDR): Use it. - * font/devps/*: All non-slanted fonts regenerated. - * NEWS: Updated. - -2002-09-16 Werner LEMBERG - - Add a site-specific font directory. - - * Makefile.in (localfontdir, legacyfontdir): New variables. - (fontpath): Use them. - (MDEFINES, uninstall_dirs): Updated. - * Makefile.comm (.man.n): Add `LOCALFONTDIR' and `LEGACYFONTDIR'. - Remove `FONTPATH' and `MACROPATH'. - - * src/roff/troff/troff.man, NEWS: Updated. - * doc/groff.texinfo (Font Directories): New section. - Other minor fixes. - - * src/devices/grodvi/grodvi.man, src/devices/grohtml/grohtml.man, - src/devices/grolbp/grolbp.man, src/devices/grolj4/grolj4.man, - src/preproc/grn/grn.man: Minor fixes. - - * src/devices/grohtml/post-html.cc (html_printer::do_tab_ts): - Remove unused variable. - -2002-09-11 Werner LEMBERG - - * doc/groff.texinfo, man/groff_font.man: Clarify argument of \N. - * man/groff_out.man: Fix documentation of 'N'. - -2002-09-09 Gaius Mulley - - * doc/Makefile.in (webpage.html): Depend on gnu.eps also. - * src/roff/troff/env.cc (indent): Emit html tag only if break_flag is - set. - * src/devices/grohtml/post-html.cc (text_glob::is_br_ni): Removed. - (text_glob::is_br, html_printer::lookahead_for_tables): Updated. - (html_printer::do_tab_ts): Call `emit_table_header' with `FALSE'. - * src/devices/grohtml/html-text.cc (html_text::start_tag) : Call `begin' with `FALSE'. - -2002-09-09 Ralph Corderoy - - * src/libs/libgroff/string.cc (string::extract): Fix position of - terminating null byte. - -2002-09-08 Werner LEMBERG - - Add global option `nospaces' to tbl so that leading and trailing - spaces in data items are ignored. - - * src/libs/libgroff/string.cc (string::remove_spaces): New member - function to remove leading and trailing spaces. - * src/include/stringclass.h: Updated. - - * src/preproc/tbl/table.h (table): Add flag `NOSPACES'. - - * src/preproc/tbl/main.cc (process_options): Handle `nospaces' - option. - Fix typo in error messages. - (process_data): Implement `nospaces' option. - * src/preproc/tbl/tbl.man, NEWS, doc/webpage.ms: Updated. - -2002-09-07 Werner LEMBERG - - * src/include/config.hin: Add `HAVE_ISATTY'. - * src/libs/libgroff/tmpfile.cc (xtmpfile_list): Drop `const' for - `fname' member. - * src/libs/libgroff/tmpname.cc: Include `time.h'. - * src/libs/libdriver/input.cc (Char): Add `operator==' and - `operator!=' for `char'. - * doc/groff.texinfo: Replace @ifnottex block for top node with - @ifhtml block. - -2002-09-06 Werner LEMBERG - - * doc/Makefile.in (.texinfo.html): Add -I switch. - * doc/groff.texinfo: Add @ifnottex block for top node to make - translation to HTML work. - -2002-09-05 Gaius Mulley - - * src/preproc/html/pre-html.cc (LETTER_LENGTH): Removed. - (get_papersize, determine_vertical_offset): Removed. - (char_buffer::do_image): Always specify letter size. - (main): Updated. - (imageList::createPage): Use -dDEVICEHEIGHTPOINTS instead of - -sPAPERSIZE. - -2002-09-05 Werner LEMBERG - - * doc/groff.texinfo, tmac/groff_man.man: Improve documentation of - default indentation. - -2002-09-04 Gaius Mulley - - * src/preproc/html/pre-html.cc (imageList::createPage): Use - -sPAPERSIZE for gs. - (generateImages): Clean up push-back buffer. - -2002-09-04 Ralph Corderoy - - * doc/groff.texinfo: Minor fixes. - -2002-08-21 Gaius Mulley - - * src/preproc/html/pre-html.cc (DEFAULT_LINE_LENGTH): New macro. - (MAX_WIDTH, A4_LENGTH, A4_OFFSET, LETTER_OFFSET): Removed. - (gsPaper): Removed. - (determine_vertical_offset): Use LETTER_LENGTH. - (createPage): Moved to ... - (imageList::createPage): This. - Call gs with -dDEVICEWIDTHPOINTS to avoid cropping. - (imageList::getMaxX): New function. - (createImage): Moved to ... - (imageList::createImage): This. - (imageList::createImages): New function. - (generateImages): Read `maxx' directly. - Updated. - (scanArguments): Don't specify `gsPaper' for `-o'. - (makeTempFiles): Call `xtmpfile' with the last argument set to - `TRUE'. - -2002-08-24 Werner LEMBERG - - * src/include/nonposix.h (mkdir, WAIT, creat) [_MSC_VER]: Define. - (WAIT, _WAIT_CHILD) [!_MSC_VER]: Define. - * src/preproc/html/pre-html.cc (waitForChild): Use WAIT. - * src/preproc/html/pushback.cc: Include nonposix.h. - * src/roff/groff/pipeline.c: Define strcasecmp and strncasecmp - conditionally. - -2002-08-23 Werner LEMBERG - - Use $(OBJEXT) for the object file extension. - - * Makefile.comm (.SUFFIXES): Add .obj. - (.cc.obj, .c.obj): New implicit rules. - * Makefile.in (OBJEXT): New variable, initialized from autoconf. - (MDEFINES): Add EXEEXT and OBJEXT. - * */Makefile.sub: s/.o/.$(OBJEXT)/. - -2002-08-22 Werner LEMBERG - - * INSTALL: Mention texinfo 4.2 as a prerequisite. - -2002-08-21 Gaius Mulley - - * src/devices/grohtml/post-html.cc (colType): Make enum global to - the file. - (html_printer::update_min_max, html_printer::add_table_end): New - methods. - (html_printer::lookahead_for_tables): Use them. - Reset page offset correctly. - (html_printer::~html_printer): Add creation of creator comment up. - -2002-08-20 Werner LEMBERG - - * tmac/an-old.tmac (T&): New dummy macro to avoid warning. - * man/groff_tmac.man: Fix typos. - * man/groff_font.man: Minor reordering. - * contrib/eqn2graph/eqn2graph.man (Tp): New macro. - * contrib/groffer/groffer.man: Fix typos. - -2002-08-18 Gaius Mulley - - Avoid endless loops while scanning for tables. - - * src/devices/grohtml/post-html.cc (list::insert): Set - ptr->right->left. - (html_printer::next_horiz_pos): Add `text_glob' argument; update - all callers. - Return immediately if that argument is NULL. - (html_printer::calc_nf): Don't test if `g' is NULL. - (html_printer::lookahead_for_tables): Use - `glyphs.move_right_get_data'. - Don't test if `g' is NULL. - -2002-08-18 Gaius Mulley - - A better fix, replacing fix 2002-08-15, for increasing SIZE. - - * src/devices/grohtml/post-html.cc (char_block): Make `buffer' - a pointer. - (char_block::char_block): Allocate `buffer'. - (char_buffer::add_string): Use it. - -2002-08-15 Werner LEMBERG - - * src/devices/grops/grops.man, src/devices/grolj4/grolj4.man, - src/devices/grodvi/grodvi.man: Document default line thickness. - -2002-08-15 Gaius Mulley - - * src/devices/grohtml/post-html.cc (char_block): Increase SIZE to - 8192. - -2002-08-14 Werner LEMBERG - - * doc/webpage.ms: Updated. - -2002-08-09 Werner LEMBERG - - * src/roff/troff/node.cc (node::add_char): Call `freeze_space' for - unbreakable space. - -2002-08-08 Aaron Campbell - - * src/preproc/pic/object.cc (object_spec::make_move): Fix typo - (&& -> &). - -2002-08-08 Werner LEMBERG - - * src/roff/troff/input.cc (read_rgb, read_cmy, read_cmyk): Call - tok.next(). - (read_gray): Ditto. - Don't push back a space but a newline onto the stack. - -2002-08-07 Gaius Mulley - - Add fonts `CI', `CB', and `CBI' to grohtml which have been omitted - inadvertently. - - * src/devices/grohtml/post-html.cc (html_printer::end_font, - html_printer::start_font): Handle them. - * src/devices/grohtml/html-text.cc (html_text::do_italic): Don't - reset bold and tt. - (html_text::do_bold): Don't reset italic and tt. - (html_text::do_tt, html_text::do_pre): Don't reset bold and italic. - * font/devhtml/DESC.proto: Add those fonts. - * font/devhtml/Makefile.sub (PROTOFONTS): Updated. - -2002-08-07 Werner LEMBERG - - * MORE.STUFF: Added gpresent. - - * tmac/trace.tmac: Show nesting level by a corresponding amount of - whitespace before printing the logging message. - -2002-07-31 Colin Watson - - * src/devices/grohtml/html-table.cc (html_table::finish_row): - Initialize `n' to zero. This fixes a segfault on ARM. - -2002-07-30 Werner LEMBERG - - * doc/grnexmpl.me: Remove calls to .st and .sc which are undefined. - -2002-07-29 Werner LEMBERG - - * src/preproc/pic/pic.y (print_arg, relative_path): Add missing - final semicolon. - -2002-07-28 Colin Watson - - * src/devices/grohtml/post-html (html_printer::troff_tag): Handle - `.ps'. - (html_printer::html_printer): Initialize `pointsize'. - -2002-07-26 Werner LEMBERG - - * doc/Makefile.sub (PROCESSEDEXAMPLEFILES): Remove gnu.eps and - gnu.png. - (CLEANNOTSRCDIRADD): Add gnu.eps and gnu.png. - (gnu.eps): Add -rle switch to pnmtops. - (distfiles): Add gnu.eps and gnu.png. - -2002-07-25 Petter Reinholdtsen - - * src/libs/libdriver/input.cc (Char): Add const to `operator=='. - Add `operator!='. - -2002-07-24 Werner LEMBERG - - * doc/Makefile.in, doc/Makefile.sub (groff_bin_path): Don't use - ' \+' but ' *' for sed. - (GROFF): Set GROFF_COMMAND_PREFIX to empty value. - -2002-07-23 Werner LEMBERG - - * doc/groff.texinfo: Document `papersize' keyword. - * NEWS, man/groff_font.man: Updated. - -2002-07-23 Colin Watson - - Extend papersize keyword to accept more than a single entry. The - first valid will be used. - - * src/libs/libgroff/font.cc (font::load_desc): Implement it. - (font::scan_papersize): Really skip final newline. - * src/preproc/html/pre-html.cc (get_papersize): Ditto. - -2002-07-23 Werner LEMBERG - - * configure.ac: Test for isatty. - * configure: Regenerated. - * src/include/posix.h: Check HAVE_ISATTY. - * src/roff/troff/input.cc [ISATTY_MISSING]: Removed. - * src/utils/lookbib/lookbib.cc: Include posix.h. - Don't declare isatty. - -2002-07-21 Werner LEMBERG - - * NEWS: Add `output' request. - - * REVISION: Increased to 1. - -Version 1.18.0 released -======================= - -2002-07-19 Gaius Mulley - - Allow internal glyph indices > 0xFF in grohtml for input characters. - - * src/devices/grohtml/post-html.cc (to_unicode): Use `unsigned int' - as parameter. - (html_printer::add_to_sbuf): Use `unsigned int' as first parameter. - Updated all callers. - (html_printer::sbuf_continuation, html_printer::overstrike): Ditto. - (html_printer): Updated. - -2002-07-19 Werner LEMBERG - - * font/devhtml/R.proto: Updated to HTML 4, adding many glyphs. - * font/devutf8/R.proto: Adding some missing glyphs. - * font/devutf8/NOTES: Updated. - - * tmac/dvi.tmac: Add more composite glyphs. - * tmac/html.tmac: Updated. - - * man/groff_char.man: Add `sum' and `product' entities. - - * NEWS: Updated. - -2002-07-18 Gaius Mulley - - Improved table, tab, and indenting support. - - * src/roff/troff/input.cc (file_iterator::suppress_newline_flag, - string_iterator::suppress_newline_flag): Removed. Updated all - function which have used it. - - * src/roff/troff/env.cc: Include `input.h'. - (environment::add_node): Accept 0 as parameter. - (environment::add_html_tag): Add `force' parameter. - Updated all callers. - (environment::add_html_tag_tabs): Ditto. - For the moment, support left-aligned tabs only. - (environment::make_html_tag): New function. - (fill, no_fill): Set .br html tag additionally. - (environment::newline): Emit `eol.ce' or `eol' tag for html. - (environment::add_html_tag_eol): Removed. - (tab_stops::distance_to_next_tab): Add variant for handling - nextpos'. - (environment::distance_to_next_tab): Ditto. - Updated all callers. - (environment::handle_tab): Handle tabs for html. - - * src/roff/troff/env.h: Updated. - - * src/roff/troff/div.cc: Updated all callers of - `environment::add_html_tag'. - - * src/devices/grohtml/html-table.cc, - src/devices/grohtml/html-table.h: New files. - - * src/devices/grohtml/html-text.cc (html_text): New members - `blank_para' and `start_space'. - (html_text::issue_tag): Don't emit TABLE_TAG. - Handle indentation for PRE_TAG and P_TAG. - (html_text::end_tag): Updated. - (html_text::table_is_void, html_text::issue_table_begin, - html_text::issue_table_end): Removed. - (html_text::do_push): Simplified. - [DEBUGGING]: Small fix. - (html_text::push_para): Add new parameter for indentation; updated - all callers. - Handle PRE_TAG. - (html_text::do_indent, html_text::do_table, html_text::done_table, - html_text::is_in_table): Removed. - (html_text::do_pre): Handle P_TAG also. - (html_text::shutdown): Handle p->indent. - (html_text::check_emit_text): Simplified. - (html_text::do_emittext): Reset `blank_para'. - (html_text::do_para): Add new parameter for indentation; updated - all callers. - (html_text::remove_indent): New function. - (html_text::do_space): Handle verbatim text properly. - (html_text::ever_emitted_text, html_text::starts_with_space, - html_text::remove_para_align): New functions. - (html_text::dump_stack_element, html_text::dump_stack): Updated. - - * src/devices/grohtml/html_text.h (HTML_TAG): Remove TABLE_TAG. - Updated. - - * src/devices/grohtml/post-html.cc: Include html-table.h. - (INDENTATION): Removed. - (text_glob): Added many `is_' functions. - Added table description `tab'. - Added `get_arg',`get_tab_args', `remember_table', and `get_table' - member functions. - (list): Add `insert' and `move_to' member functions. - (page): Add `insert_tag' member function. - (page::dump_page) [DEBUG_TABLES]: Improved. - (html_printer): Add `table' and `max_linelength' elements. - Add many `do_', `insert_', `next_horiz_pos', - `lookahead_for_tables', `shutdown_table', `calc_nf', `calc_po_in', - `remove_tabs', `remove_courier_tabs'. - (html_printer::emit_raw): Handle indentation. - (html_printer::do_center, html_printer::write_header): Updated. - (html_printer::is_courier_until_eol): Check for tag. - (html_printer::do_linelength): Handle max_linelength. - (html_printer::do_page_offset, html_printer::do_indentation): Handle - fill_on. - (html_printer::do_tempindent): Updated. - (html_printer::do_indentedparagraph): Removed. - (html_printer::do_indent): Simplified. - (html_printer::do_eol): Use `ever_emitted_text'. - (html_printer::do_flush, html_printer::do_links): Don't call - done_table. - (html_printer::do_break): Handle end_tempindent. - (html_printer::troff_tag): Get argument. - Don't handle `.ip'. - Handle `.tab-ts', `.tab-te', `.col', `tab', and `tab0' tags. - (html_printer::flush_page): Call `lookahead_for_tables'. - Don't call `done_table'. - (html_printer::add_to_sbuf): Always call do_indent. - - * src/devices/grohtml/Makefile.sub: Updated. - - * tmac/an-old.tmac (TP): Don't handle html device specially. - (an-do-tag-html): New function which will be used instead of - `an-do-tag' if html device is used. - - * tmac/html.tmac: Call .po to pass default page offset to grohtml. - - * tmac/s.tmac (@IP): Don't handle html device specially. - (@IP-html): New function which will be used instead of `@IP' if - html device is used. - - * tmac/www.tmac (HTML-NS, HTML-TAG-NS): New auxiliary macros -- this - is a hack which will eventually vanish again. - (PIMG): Handle `-C' option correctly if not html. - (HR): Use HTML-NS. - -2002-07-17 Werner LEMBERG - - * src/utils/afmtodit/afmtodit.pl: Don't use `-P-' for invoking perl. - -2002-07-14 Eric S. Raymond - - * contrib/pic2graph/pic2graph.*: Use convert(1). - * contrib/eqn2graph/eqn2graph.*: Minor fixes. - -2002-07-14 Bernd Warken - - * tmac/groff_trace.man: New file. - * tmac/Makefile.sub: Updated. - * NEWS: Updated. - -2002-07-13 Werner LEMBERG - - * src/roff/groff/groff.man: Add some cross references. - -2002-07-12 Werner LEMBERG - - * src/roff/troff/input.cc (substring_request): Add warnings for - string indices out of range. - -2002-07-11 Werner LEMBERG - - * font/devdvi/generate/ec.map: Fix typo (`(l' -> `/l'). - * font/devdvi/*EC: Regenerated. - -2002-07-10 Bernd Warken - - * man/groff_char.man: Updated and extended. - -2002-07-10 Werner LEMBERG - - * src/roff/troff/input.cc (length_macro): Renamed to... - (length_request): This. - Move call of `tok.next()' to the very end, otherwise the register - value hasn't been updated yet. - (init_input_requests): Updated. - -2002-07-09 Werner LEMBERG - - * src/roff/troff/input.cc (substring_macro): Renamed to... - (substring_request): This. - (init_input_requests): Updated. - * src/roff/troff/request.h: Updated. - -2002-07-08 Robert D. Goulding - - * src/roff/grog/grog.sh: Fix typo. - -2002-07-08 Werner LEMBERG - - * win32-diffs: Updated. - - Handle `papersize' keyword properly in DESC. - - * src/libs/libgroff/font.cc (font::scan_papersize): Fix argument - type. - Updated all callers. - * src/libs/libgroff/paper.cc: Add four more paper formats used by - grolj4. - * src/include/paper.h: Updated. - - * src/devices/grolbp/lbp.cc: Remove unnecessary semicolons. - Other minor C syntax fixes. - (papersize, paperlength, paperwidth): Renamed to `user_*'. - (lbp_printer): Add `papersize', `paperlength', and `paperwidth' - members. - (lbp_printer::lbp_printer): Pass three arguments. - Set paper dimensions properly. - (make_printer, main): Updated. - (handle_unknown_desc_command): Fix error messages. - (main): Handle papersize keyword in DESC properly. - - * src/devices/grolj4/lj4.cc (paper_size): Renamed to - `user_paper_size'. - (lbp_printer::lbp_printer): Pass an argument. - Set paper_size properly. - (handle_unknown_desc_command): Removed. - (make_printer, main): Updated. - * src/devices/grolj4/grolj4.man: Minor documentation fix. - - * man/groff_font.man, NEWS: Updated. - -2002-07-07 Werner LEMBERG - - Integrated eqn2graph, contributed by Eric S. Raymond. - - * contrib/eqn2graph/{Makefile.sub, eqn2graph.sh, eqn2graph.man}: New - files. - * Makefile.in, NEWS: Updated. - -2002-06-04 Werner LEMBERG - - Changing the substring request to make it fit better with other - string manipulation functions in other programming languages: - Index 0 is now the first character in the string, and index -1 - indicates the last character. Since this request didn't work - properly anyway in the last release, it doesn't harm too much to - change the syntax. - - * src/roff/troff/input.cc (substring_macro): Use loops to get - the real string length (ignoring COMPATIBLE_SAVE and - COMPATIBLE_RESTORE) and offsets. - Implement change described above. - - * man/groff_char.man, tmac/doc-common (doc-header), tmac/doc.tmac - (doc-do-Bd-args, doc-do-Bl-args): Changed accordingly. - - * NEWS, doc/groff.texinfo, man/groff_diff.man: Updated. - -2002-06-03 Werner LEMBERG - - Make .chop work with .de1 and friends. COMPATIBLE_SAVE and - COMPATIBLE_RESTORE are completely ignored. - - * src/roff/troff/input.cc (char_list::set, char_list::get): New - functions. - (macro): `length' field renamed to `len'. - Added new field `empty_macro' (1 if macro is empty), to be used - instead of checking `len'. - Updated all callers. - (macro::empty): Updated. - (macro::length, macro::set, macro::get): New functions. - (macro::append): Ignore COMPATIBLE_SAVE and COMPATIBLE_RESTORE. - Set `empty_macro'. - (chop_macro): Check and remove trailing COMPATIBLE_SAVE/ - COMPATIBLE_RESTORE pairs. - (asciify): Ignore COMPATIBLE_SAVE and COMPATIBLE_RESTORE. - * src/roff/troff/request.h: Updated. - - * doc/groff.texinfo: Document .chop's behaviour better. - -2002-06-02 Werner LEMBERG - - * doc/pic.ms: Fix documentation for the addition of positions. - - * tmac/doc.tmac, tmac/an-old.tmac: Need groff version 1.18. - -2002-06-29 Werner LEMBERG - - Implementation of string arguments of the form \*[foo arg1 arg2 ...] - - * src/roff/troff/input.cc (have_string_arg): New global variable. - (read_mode): New enumeration. - (read_escape_name): Use it. Update all calls. - (read_long_escape_name): Use it. Update all calls. - Set have_string_arg if appropriate. - (get_char_for_escape_name): Add parameter for handling space - character. - (interpolate_string_with_args, decode_string_args): New functions. - (get_copy, token::next): Call it if necessary. - (interpolate_string): Fix error message. - - * NEWS, doc/groff.texinfo, man/groff.man, man/groff_diff.man: - Document it. - -2002-06-24 Bernd Warken - - * man/groff_tmac.man: Updated and extended. - -2002-06-24 Werner LEMBERG - - * doc/pic.ms, src/preproc/pic/pic.man: Fix description of `:='. - -2002-06-23 Werner LEMBERG - - * doc/pic.ms: Improve documentation of composite block objects. - -2002-06-22 Werner LEMBERG - - * src/roff/troff/input.cc (init_registers): Add three registers - `seconds', `minutes', and `hours' to hold the current time. - - * NEWS, doc/groff.texinfo, man/groff.man, man/groff_diff.man: - Updated. - -2002-06-20 Werner LEMBERG - - Make \X accept both `\ ' and `\~', converting them to single space - characters. - - * src/roff/troff/token.h (token): Add TOKEN_UNSTRETCHABLE_SPACE. - (token::unstretchable_space): New inline function. - * src/roff/troff/input.cc (token::next, token::delimiter, - token::description, token::add_to_node_list, token::process): Handle - TOKEN_UNSTRETCHABLE_NODE. - (encode_char): Handle tok.stretchable_space and - tok.unstretchable_space. - - * NEWS, doc/groff.texinfo: Document it.. - -2002-06-19 Werner LEMBERG - - * src/devices/grops/ps.cc (ps_printer::special): Fix error message. - - * src/devices/grotty/tty.cc (tty_printer::special): Add `sgr' - keyword to enable/disable SGR output. - (tty_printer::change_fill_color): New function. - * NEWS, src/devices/grotty/grotty.man: Document `sgr' special. - - * src/roff/troff/input.cc (output_request): Add missing `tok.next()' - call. - -2002-06-18 Werner LEMBERG - - Add a `color' request and a `.color' register to control usage of - colours. - - * src/roff/troff/input.cc (disable_color_flag): Replaced with... - (color_flag): This (which is the inverse). - (activate_color): New function. - (main, init_input_requests): Updated. - * src/roff/troff/troff.h, src/roff/troff/node.cc - (troff_output_file::fill_color, troff_output_file::glyph_color): - Updated. - - * NEWS, doc/groff.texinfo, man/groff_diff.man, man/groff.man: - Document the changes. - -2002-06-17 Colin Watson - - Circumvent bug in autoconf 2.53 regarding top_builddir. - - * aclocal.m4 (GROFF_BUILDDIR): s/top_builddir/groff_top_builddir/. - * Makefile.in, doc/Makefile.in: - s/@top_builddir@/@groff_top_builddir@/. - * configure: Regenerated (with autoconf 2.53). - -2002-06-17 Werner LEMBERG - - * src/libs/libgroff/font.cc (font::load_desc): Fix computation of - `paperwidth' and `paperlength' for the `papersize' keyword. - -2002-06-16 P. Alejandro Lopez-Valencia - - * src/devices/grops/grops.man: Add info about Type 42 fonts. - -2002-06-15 Gaius Mulley - - * src/devices/grohtml/post-html.cc (html_printer::emit_raw, - html_printer::do_linelength, html_printer::do_pageoffset, - html_printer::do_indentation, html_printer::do_tempindent, - html_printer::do_break, html_printer::begin_page): Clear indented - text. - * tmac/html.tmac: Disable hyphenation. - -2002-06-15 Werner LEMBERG - - Don't produce HTML files if utility programs are missing. - - * Makefile.in (make_html, make_install_html): New variables. - (MDEFINES): Updated. - - * aclocal.m4 (GROFF_HTML_PROGRAMS): New function to test for HTML - utility programs. - * configure.ac: Use it. - * configure: Regenerated. - - * doc/Makefile.sub (PROCESSEDEXAMPLEFILES): Move webpage.html to... - (HTMLEXAMPLESFILES): This new variable. - (EXAMPLESIMAGEFILES): Renamed to... - (HTMLEXAMPLEIMAGEFILES): This. - (CLEANADD): Add HTMLEXAMPLEFILES. - (all): Use `make_html'. - (html): New target. - (install_data): Use `make_install_html'. - Move html stuff to... - (install_html): This new target. - (uninstall_sub): Updated. - -2002-06-14 Bernd Warken - - * src/roff/grog/Makefile.sub (grog): Renamed to... - (grog.old): This. - (grog): New rule to always install grog.sh as grog. - -2002-06-08 Bernd Warken - - * src/roff/grog/grog.pl: Fix typo. - -2002-06-07 Werner LEMBERG - - * doc/groff.texinfo: Add more info on .tr arguments. - -2002-06-05 Werner LEMBERG - - * NEWS, src/roff/grog/grog.man, doc/groff.texinfo: Updated. - - * aclocal.m4 (GROFF_MKSTEMP): Include unistd.h. - * configure: Regenerated. - -2002-06-05 Ralph Corderoy - - * src/roff/troff/symbol.cc (table_sizes): Add more values. - - * src/roff/grog/grog.pl, src/roff/grog/grog.sh: Recognize mom. - -2002-06-04 Werner LEMBERG - - * aclocal.m4 (GROFF_PAGE): Don't use `prefix' directly since it - is not initialized at the time we need it in case `--prefix' hasn't - been set. Check for `ac_default_prefix' also. - Test for `papersize' keyword also and generalize allowed whitespace. - * configure: Regenerated. - - * font/devps/Makefile.sub (DESC): Use `papersize' instead of - `paperlength'. - - * src/libs/libgroff/Makefile.sub (version, revision): Replaced - with... - (src_version, src_revision): New variables to avoid overwriting - from parent make process. - (version.cc): Updated. - - * src/preproc/html/pre-html.cc: Include paper.h and font.h. - (linebuf, linebufsize): New global variables. - (sys_fatal): Use `fatal' to abort properly. - (get_line): New function. - (get_resolution): Use it. - Improve error messages. - (get_papersize): Check `papersize' also. - Use `get_line'. - Improve error messages. - -2002-06-03 Werner LEMBERG - - * Makefile.comm (CLEANNOTSRCDIRADD): New target for files which - should be removed only if builddir is not srcdir. - (mostlyclean): Handle `CLEANNOTSRCDIRADD'. - (clean): Depend on `mostlyclean'. - (distclean): Depend on `clean'. - (realclean, extraclean): Depend on `distclean'. - (.y.cc, .y.o): Simplified. The output files are no longer written - to srcdir but to builddir. - * Makefile.in (MDEFINES): Add `version' and `revision'. - (uninstall_dirs): Fix order of directories. - * doc/Makefile.sub (version, revision): Removed. - (CLEANADD): Removed grnexmpl.g, groff, groff-*. - Added `HTMLDOCFILES'. - (CLEANNOTSRCDIRADD): New target for grnexmpl.h, groff, groff-*. - * src/preproc/eqn/Makefile.sub, src/preproc/pic/Makefile.sub, - src/preproc/refer/Makefile.sub (YTABC, YTABH): Don't use `srcdir' - as prefix. - - * doc/texinfo.tex (\authortt): New macro. - (\shortcontt): Define. - (\titlepage): Set \tt to \authortt while defining \authorfont. - (\appendixbox): New macro. - (\chapmacro, \appendixentry): Use \appendixbox to get even - indentation for letters. - (\summarycontents): Set \tt. - (\internalpagesize): Add two arguments for real paper width and - height as needed by pdfTeX. - (\letterpaper, \smallbook, \afourpaper, \afivepaper, \afourlatex): - Updated. - (\tempdima, \tempdimb): New temporary dimensions. - (\pagesizesyyy): Updated. - -2002-06-02 Werner LEMBERG - - Adding a new keyword `papersize' to the DESC file format (similar - but not completely identical to grolbp's extension). grops now has - a -p command line option to override `papersize'. Finally, grolbp - has been adapted to the new syntax. - - * src/libs/libgroff/paper.cc, src/include/paper.h: New files. It - defines and initializes the `papersizes[]' array with NUM_PAPERSIZES - elements. - * src/libs/libgroff/Makefile.sub (OBJS): Add `paper.o'. - (CCSRCS): Add `paper.cc'. - - * src/include/font.h (font): Add `papersize' element. - * src/libs/libgroff/font.cc (font::unit_scale): New helper function. - (font::scan_papersize): New function. - (font::load_desc): Use it for handling `papersize' keyword. - * src/libs/libgroff/fontfile.cc: Initialize `font::papersize'. - - * src/devices/grops/ps.cc: Include paper.h. - (user_paper_length): New global variable. - (ps_printer): Use paper length as initializer. - (make_printer): Updated. - (main): Handle new `-p' option. - * src/devices/grops/grops.man: Updated. - - * src/devices/grolbp/lbp.cc: Include paper.h. - s/papersizes/lbp_papersizes/. - (set_papersize): Use new `papersizes' array. - (handle_unknown_desc_command): Don't handle `papersize'. - (main): Use `font::scan_papersize' for handling `-p' option. - * src/devices/grolbp/grolbp.man: Updated. - - * man/groff_font.man: Document `papersize'. - * NEWS: Updated. - -2002-05-30 Werner LEMBERG - - * src/devices/grops/TODO: Updated. - * src/devices/grops/grops.man: More info on paper formats. - * man/groff_font.man: Document `paperheight' and `paperwidth'. - -2002-05-29 Werner LEMBERG - - * doc/Makefile.sub (CLEANADD): Add grnexmpl.g, groff, and groff-* - to list only if srcdir != currdir. - (distfiles): New target. - - * Makefile.in (EXTRADIRS): Add font/devlj4/generate. - (NOMAKEDIRS): New variable. - (DISTDIRS): Use it. - -2002-05-26 Werner LEMBERG - - Add .output request, similar to \! at top-level. - - * src/roff/troff/input.cc (transparent): Remove unused declaration. - (output_request): New function. - (init_input_requests): Add it. - Sorted. - * NEWS, doc/groff.texinfo, man/groff_diff.man, man/groff.man: - Document it. - - * Makefile.in (MDEFINES): Add INSTALL_INFO. - (prepare_examples): Fix typo. - * doc/groff.texinfo (@direntry): Fix it. - -2002-05-25 Werner LEMBERG - - Including the doc subdir into groff's Makefile system. - - * aclocal.m4 (GROFF_INSTALL_INFO): New function. - * configure.ac: Use it. - Generate `doc/Makefile'. - * configure: Regenerated. - - * Makefile.in (infodir, INSTALL_INFO): New variables. - (MDEFINES, uninstall_dirs): Updated. - (OTHERDIRS): Add `doc'. - * Makefile.comm (CLEANDIRADD): New variable. - (mostlyclean): Use it. - - * doc/Makefile.sub, doc/Makefile.in: New files. - * doc/Makefile: Removed. - - * NEWS, INSTALL: Updated. - -2002-05-24 Werner LEMBERG - - * doc/homepage.ms: Renamed to ... - * doc/webpage.ms: This. - Use `.NHR'. - -2002-05-23 Werner LEMBERG - - Integrating the `mom' macro package, contributed by Peter Schaffter - . - - * contrib/mom/*: New subdirectory tree. - * Makefile.in (docdir, exampledir, htmldocdir): New variables to - be used for documentation files. - (MDEFINES, uninstall_dirs): Use them. - (OTHERDIRS): Add contrib/mom. - * Makefile.comm (.man.n): Add @DOCDIR@, @EXAMPLEDIR@, and - @HTMLDOCDIR@. - * MANIFEST, NEWS: Updated. - -2002-05-22 Gaius Mulley - - Change syntax of \O: \O[0] suppresses output, \O[1] enables output - if at outer level; at start-up we are at outer level. - - * src/roff/troff/input.cc (do_suppress): Implement it. - Simplify \O[3]. - - Add option -p to show progress information. - pre-grohtml will now render only one page at a time, reducing the - size of needed disk resources enormously. - - * src/preproc/html/pre-html.cc (imagePageStem): Replaced with... - (imagePageName): New global variable. - (psPageName, show_progress, currentPageNo): New global variables. - (html_system): Close saved stderr and stdout handles. - (write_end_image): Accept a parameter to control \O escape. - (write_start_image): Adapted to new \O meaning. - (char_buffer::write_upto_newline): Updated. - (createAllPages): Replaced with... - (createPage): This new function to create a single page for images. - It uses `psselect' from the psutils package. - (removeAllPages): Removed. - (createImage): Updated. - Handle progress display. - (char_buffer::do_html, char_buffer::do_image) [DEBUGGING]: Removed. - (scanArguments): Add option -p. - (makeTempFiles): Updated to create temp files for psPageName and - imagePageName. - (removeTempFiles): Removed. - (main): Updated. - - * src/devices/grohtml/post-html.cc (header_desc::write_headings, - html_printer::write_header): Append `\0' to `buffer'. - (html_printer::do_eol): Depend on `current_paragraph->emitted_text'. - (main): Handle -p. - * src/devices/grohtml/html-text.cc (html_text::dump_stack_element): - Handle `text_emitted'. - (html_text::table_is_void): Slightly rewritten. - (stop): New external symbol. - (html_text::do_push) [DEBUGGING]: Use it and simplify. - (html_text::shutdown): Call `dump_stack'. - (html_text::do_space): Rewritten. - * src/devices/grohtml/grohtml.man: Document -p and the need of - `psselect'. - - * tmac/www.tmac (DC, HTML-DO-IMAGE, HTML-IMAGE-END): Updated to - new \O syntax. - Call \O[0] if `ps4html' is active. - * tmac/s.tmac (@EQ, @EN): Handle html better. - (@TS, TE): Ditto. - * tmac/html.tmac: Don't use black for background colour. - - * src/roff/troff/node.cc: Include `div.h'. - (troff_output_file::really_print_line): Don't use `is_on'. - (troff_output_file::word_marker, troff_output_file::flush_tbuf - troff_output_file::check_charinfo, - troff_output_file::put_char_width, troff_output_file::put_char, - troff_output_file::determine_line_limits, troff_output_file::draw, - real_output_file::begin_page, glyph_color_node::tprintf, - fill_color_node::tprint, hline_node::tprint, vline_node::tprint): - Use `is_on'. - (troff_output_file::really_on): Call `do_motion'. - (suppress_node::tprint): Use `get_page_number' instead of `%' - register. - Call `reset_output_registers' conditionally on `is_on'. - - * doc/groff.texinfo: Document new syntax of \O. - * NEWS, man/groff_diff.man: Updated. - -2002-05-22 Werner LEMBERG - - * MORE.STUFF: Add info about David Frey's deroff implementation. - Mention troff.org. - -2002-05-16 Werner LEMBERG - - Pic's `with' attribute now accepts positions. - - * src/preproc/pic/pic.y: Make `.', BOX, CIRCLE, ELLIPSE, ARC, LINE, - ARROW, SPLINE, and `[' left-associative tokens to fix shift/reduce - conflicts. - (object_spec): Add rule for `WITH' and `position'. - (relative_path): Give `corner' the precedence of `CHOP'. - * src/preproc/pic/object.h (path): New members `pos' and - `is_position'. - * src/preproc/pic/object.cc: Updated initializers of `path'. - (path::follow): Handle `is_position'. - - * doc/pic.ms: Completely updated grammar description. - Many typographical improvements. - -2002-05-15 Werner LEMBERG - - * src/roff/troff/env.cc(hyphen_trie::hpf_getc): Accept ^^x (char - code of x in range 0-127) also. - * doc/groff.texinfo, man/groff_diff.man: Updated. - - Added keywords `north', `south', `east', and `west' for corners - in pic. - - * src/preproc/pic/lex.cc (lookup_keyword): Add NORTH, SOUTH, EAST, - and WEST. - (yylex): Handle them. - * src/preproc/pic/pic.y: Add tokens NORTH, SOUTH, EAST, and WEST. - (corner): Handle them. - -2002-05-14 Werner LEMBERG - - * src/devices/grops/grops.man: Clarify handling of `download' file. - -2002-05-11 Werner LEMBERG - - Adding `warnscale' and `spreadwarn' requests, based on a patch from - Jeffrey Friedl . - - * src/roff/troff/input.cc (spread_limit, warn_scale, - warn_scaling_indicator): New global variables. - (warnscale_request, spreadwarn_requests): New functions. - (main): Initialize `warn_scale' and `warn_scaling_indicator'. - (init_input_requests): Updated. - (error_type): Add `OUTPUT_WARNING'. - (do_error): Handle it. - (output_warning): New warning function which shows output location. - * src/roff/troff/env.h (spread_limit): New external variable. - * src/roff/troff/env.cc (environment::choose_breakpoint): Use - `output_warning'. - (distribute_space): Emit warning if added space is larger than - `spread_limit'. - (environment::possibly_break_line): Emit warning if a line can't - be adjusted on both sides. - - * doc/groff.texinfo, man/groff_diff.man, man/groff.man: Document it. - -2002-05-08 Werner LEMBERG - - * src/roff/troff/node.cc (special_node::special_node): Use - env_definite_font(curenv) instead of curenv->get_font(). Otherwise - \X''\% crashes, for example. - - * doc/groff.texinfo: Document \! and \? used at top-level. - -2002-05-06 Werner LEMBERG - - * src/preproc/pic/pic.man: Fix some keyword syntax. - Other minor typographical fixes. - - * src/roff/groff/groff.man: Fix typos. - -2002-05-04 Werner LEMBERG - - * src/roff/groff/groff.man ([ShortOpt]): Renamed to... - (ShortOpt[]): This to avoid problems with refer. - - * doc/pic.ms: Fix typo. - Fix pic grammar description. - - * tmac/an-old.tmac (ne): Use de1, not de. - -2002-05-03 Werner LEMBERG - - * doc/groff.texinfo: Finished separation of glyphs and characters. - Don't use the string `Appendix' for appendix headers (both in - the text and the table of contents). - * man/groff_tmac.man, src/roff/troff/troff.man: Fix order of tmac - directories. - - Use registers LL and LT (similar to -ms) for controlling the - length of title and line, respectively, in the -man and -mdoc - macro packages. - - * tmac/doc-ditroff (doc-setup-page-layout), tmac/doc-nroff - (doc-setup-page-layout): Use \n[LL] and \n[LT]. - * tmac/an-old.tmac: Set \n[LL] and \n[LT] if not defined. - (TH): Use \n[LL]. - (an-header, an-p-footer): Use \n[LT]. - * NEWS, tmac/groff_man.man, tmac/groff_mdoc.man, - doc/groff.texinfo: Document it. - -2002-05-02 Werner LEMBERG - - * doc/fdl.texi: New file. - * doc/groff.texinfo: Include it. - Define and use @copying. - Starting with separating glyph, symbol, and character. - -2002-04-27 Werner LEMBERG - - * Makefile.in (EXEEXT): Set it. - * src/*/Makefile.sub (PROG): Add $(EXEEXT) for all non-script - programs. - - * src/include/nonposix.h: Define GS_NAME. - * src/preproc/html/pre-html.cc (createAllPages): Use GS_NAME. - - Some preliminary changes for EMX support under OS/2. - - * src/preproc/pic/main.cc (main), src/roff/groff/pipeline.c: Add - __EMX__ similar to __MSDOS__. - * src/utils/indxbib/indxbib.cc (main) [__EMX__]: Use `unlink'. - -2002-04-25 Werner LEMBERG - - * doc/groff.texinfo: Integrated groff_out.man. - Some macro fixes. - -2002-04-23 Werner LEMBERG - - * man/groff_out.man: Minor fixes. - -2002-04-23 Werner LEMBERG - - * doc/groff.texinfo: Moving @cindex entries after @Def* to get - correct page references. - Fixed many index entries. - -2002-04-23 Bernd Warken - - * man/roff.man: Enlarged. - -2002-04-22 Werner LEMBERG - - * doc/groff.texinfo: More examples, other fixes. - -2002-04-20 Werner LEMBERG - - * src/roff/troff/input.cc (pipe_output): Multiple calls to `pi' - will now form a chain, e.g. - - .pi foo - .pi bar - - is now the same as - - .pi foo | bar - - This is for compatibility with plan 9's troff. - - * tmac/tty.tmac: Set default tab values to 0.8i to be compatible - with UNIX troff. - * NEWS: Updated. - - * doc/groff.texinfo: Add documentation of remaining requests and - registers. - -2002-04-19 Werner LEMBERG - - * doc/groff.texinfo: Add documentation of remaining escapes. - - * font/devdvi/generate/tc.map: Remove entry for `sr'. - * font/devdvi/*TC: Regenerated. - -2002-04-18 Werner LEMBERG - - * src/roff/troff/input.cc (token::next): Make \H behave consistently - if not in compatibility mode, i.e., increment relative to the - previous height. - * doc/groff.texinfo: Updated accordingly. - -2002-04-17 Werner LEMBERG - - * doc/groff.texinfo: Document \\, \e, \E, \., and \c. - -2002-04-16 Bernd Warken - - * src/roff/groff/groff.man: Improve documentation of -P option. - Other minor fixes. - -2002-04-15 Werner LEMBERG - - Add new escape \F to switch font family. - - * src/roff/troff/input.cc (token::next): Handle \F. - * src/roff/troff/env.cc (environment::set_family): Handle - `interrupted' flag. - * NEWS, doc/groff.texinfo, man/groff_diff.man, man/groff.man: - Document it. - -2002-04-14 Werner LEMBERG - - * tmac/doc.tmac (doc-tag-list): Use \Z to avoid stretching of - spaces in tags. - -2002-04-13 Werner LEMBERG - - Implement \f[] as an alternative to \fP. Change \mP and \MP to - \m[] and \M[], respectively. - - * src/roff/troff/symbol.cc (EMPTY_SYMBOL): New global variable. - (symbol::symbol): Handle NULL string and empty string differently. - * src/roff/troff/symbol.h (symbol::is_empty): New inline function. - * src/roff/troff/input.cc (read_escape_name, read_long_escape_name): - Add optional parameter. - Updated calling functions. - (get_copy, do_glyph_color, do_fill_color, token::next): Use - `symbol::is_empty'. - * src/roff/troff/env.cc (environment::set_font): Ditto. - - * src/preproc/pic/troff.cc (troff_output::set_fill, - troff_output::reset_color: Updated. - - * tmac/www.tmac: Updated. - - * NEWS, man/groff_diff.man, man/groff.man, doc/groff.texinfo, - doc/homepage.ms, src/devices/grotty/grotty.man, tmac/groff_www.man: - Updated. - - * tmac/Xps.tmac: Remove some redundant code. - - * tmac/doc-common, tmac/doc-ditroff, tmac/doc-nroff, tmac/doc.tmac, - tmac/dvi.tmac, contrib/groffer/groffer.man, man/roff.man, - man/groff_out.man, man/groff.man, man/groff_diff.man, - src/roff/groff/groff.man: Replace \f[P] with \f[]. - -2002-04-13 Bernd Warken - - * src/include/printer.h, src/libs/libdriver/printer.cc - (printer::change_fill_color): New member function. - * src/libs/libdriver/input.cc (parse_D_command): Use it. - -2002-04-12 Werner LEMBERG - - * doc/groff.texinfo: Completed pass on gtroff reference. - -2002-04-11 Werner LEMBERG - - * doc/groff.texinfo: More fixes. - -2002-04-11 Bernd Warken - - * src/include/color.h: Decorate with `const'. - Use `size_t'. - Include `stddef.h'. - * src/libs/libgroff.color.cc: Decorate with `const'. - Use `size_t'. - (color::color): Initialize members. - * src/libs/libdriver/input.cc (parse_D_command): Handle `f' - command according to the documentation. - - * man/groff_out.man: Updated. - Minor fixes. - -2002-04-11 Gaius Mulley - - * src/preproc/html/pre-html.cc (write_start_image): Remove - redundant output. - * tmac/www.tmac (DC, HTML-DO-IMAGE): Ditto. - - * src/devices/grohtml/post-html.cc (page::add_and_encode): Using - \C'hy' caused an assertion failure. - - * src/roff/troff/env.cc (environment::environment): Initialize - `emitted_node'. - (environment::copy): Handle `ignore_next_eol' and `emitted_node'. - -2002-04-10 Werner LEMBERG - - * man/groff_diff.man, man/groff.man, NEWS, doc/groff.texinfo: - Document pvs request and .pvs register. - -2002-04-09 Werner LEMBERG - - * doc/groff.texinfo: Improve and fix documentation of diversions - and environments. - -2002-04-08 Werner LEMBERG - - * doc/groff.texinfo: Fix documentation of drawing functions. - Other minor fixes. - -2002-04-07 Werner LEMBERG - - * doc/groff.texinfo: Better documentation of double quotes as - arguments. - Other minor fixes. - -2002-04-06 Werner LEMBERG - - * man/groff_font.man: Document names of special characters better. - * doc/groff.texinfo: Minor improvements. - - * tmac/lbp.tmac: Load latin1.tmac. - * tmac/X.tmac, tmac/Xps.tmac: Load latin1.tmac or cp1047.tmac. - - * font/devX*/*: Regenerated (all chars > 0x80 removed). - -2002-04-05 Werner LEMBERG - - * tmac/tty.tmac: Don't use shc request. - * tmac/latin1.tmac, tmac/cp1047.tmac: Translate soft hyphen to `\%'. - * NEWS: Updated. - - * man/groff_diff.man: Minor fixes. - - * font/devlbp/*: Remove all `charXXX' entities. - - * src/libs/libgroff/font.cc (font::~font): Deallocate - `special_device_coding'. - (font::load): Use `new' for allocating `special_device_coding'. - * src/libs/libgroff/nametoindex.cc (character_indexer::lookup_char): - Removed unused member. - -2002-04-05 Werner LEMBERG - - * src/drivers/grops/psrm.cc (skip_possible_newline): New function. - (resource_manager::do_begin_binary, - resource_manager::do_begin_data): Use it. - - * doc/texinfo.tex: Updated to version 4.2. - - * src/roff/troff/token.h: Add TOKEN_ZERO_WIDTH_BREAK for `\:'. - (token::zero_width_break): New inline function. - * src/roff/troff/input.cc (token::next): Use it. - (token::description): Updated. - (encode_char): Ignore `\%', `\&', `\)', and `\:'. - (token::add_to_node_list, token::process): Use it. - * NEWS, doc/groff.texinfo: Updated. - - * src/preproc/eqn/over.cc (over_box::output): Fix typo. - * tmac/tty.tmac: Add missing backslash. - -2002-04-04 Tadziu Hoffmann - - * src/preproc/eqn/box.cc (set_script_size, box::top_level): Use - `.ps' register instead of `.s' to handle fractional point sizes. - * src/preproc/eqn/limit.cc (limit_box::compute_metrics, - limit_box::output): Ditto. - * src/preproc/eqn/other.cc (size_box::compute_metrics, - size_box::output): Ditto. - * src/preproc/eqn/over.cc (over_box::compute_metrics, - over_box::output): Ditto. - * src/preproc/eqn/script.cc (script_box::compute_metrics, - script_box::output): Ditto. - * src/preproc/eqn/sqrt.cc (sqrt_box::compute_metrics, - sqrt_box::output): Ditto. - -2002-04-03 Michael Selway - - * src/drivers/grops/psrm.cc (resource_manager::do_begin_binary): - Fix typo. - -2002-04-03 Werner LEMBERG - - * doc/homepage.ms: Reduce title size. - * doc/groff.texinfo: Fix documentation of .t register. - Fix handling of colon. - Fix `\' vs. `\\'. - - * src/roff/troff/input.cc (exit_troff): Emit LAST_PAGE_EJECTOR - only if page length is positive to avoid a loop. - - * tmac/an-old.tmac (ne): Increase page length to avoid problems with - tbl. - -2002-04-02 P. Alejandro Lopez-Valencia - - * src/include/nonposix.h, src/roff/groff/pipeline.c: - s/__CYGWIN32__/__CYGWIN__/. - -2002-03-28 Gaius Mulley - - * doc/gnu.xpm: New image contributed by Emily Mulley. - * doc/Makefile (gnu.eps, gnu.png): Use pnmdepth. - (homepage.html): Be dependent on gnu.eps. - * doc/homepage.ms: Updated to new image. - - * src/devices/grohtml/post-html.cc (html_printer): New member - `sbuf_prev_hpos'. - (html_printer::flush_sbuf, html_printer::set_char): Set it. - (html_printer::sbuf_continuation): Use it. - -2002-03-28 Werner LEMBERG - - * src/libs/libgroff/getopt.c: Updated to latest version. - - * tmac/README: More on hyphen.tex license. - -2002-03-26 Larry Kollar - - * doc/groff.texinfo: Add documentation of most missing requests. - -2002-03-25 Werner LEMBERG - - Add three glyphs `t+-', `tmu', and `tdi' which are textual variants - of `+-', `mu', and `di', respectively. - - * font/devascii/R.proto, font/devutf8/R.proto, - font/devlatin1/R.proto, font/devhtml/R.proto, - font/devcp1047/R.proto, font/devlpb/*: Add them. - * font/devps/generate/textmap: Ditto. - * font/devps/*: Regenerated. - * font/devlj4/generate/text.map: Add them. - * font/devlj4/*: Regenerated. - * font/devdvi/generate/tc.map: Use them. - * font/devdvi/generate/texsy.map: Add them. - * font/devdvi/*: Regenerated. - * font/devX*/*: Regenerated. - - * tmac/latin1.tmac, tmac/cp1047.tmac, tmac/tty.tmac, - tmac/tty-char.tmac: Updated. - - * NEWS, man/groff_char.man: Updated. - -2002-03-24 Werner LEMBERG - - * tmac/dvi.tmac, tmac/X.tmac, tmac/ps.tmac, tmac/html.tmac, - tmac/lj4.tmac, tmac/tty.tmac: Replace most `.char' with `.fchar'. - * tmac/ec.tmac: Remove `.rchar' calls (no longer necessary since - we use `.fchar' in dvi.tmac. - * tmac/dvi.tmac: Improve definition of \[Fo] and \[Fc]. - * tmac/Xps.tmac: Simplify some char definitions. - Add definition for \[f/]. - * man/groff_char.man: Updated for new X.tmac. - - * tmac/README: New file. - -2002-03-23 Phil Lobbes - - * Makefile.comm (.y.o): New rule for make on Solaris 2.5.1 -- the - internal .y.o rule took precendence over the .y.cc rule, compiling - the yacc files with gcc instead of g++. - -2002-03-23 Werner LEMBERG - - * tmac/dvi.tmac: Add replacement font for `CB'. - - * tmac/doc.tmac: s/request/macro/ in messages. - (doc-generic-macro): Improve error message. - * tmac/groff_mdoc.man: Minor improvements. - -2002-03-22 Werner LEMBERG - - * doc/groff.texinfo: Document possible conflict between `tr' and - `char' requests. - -2002-03-21 Werner LEMBERG - - Improve handling of hyphenation patterns. It is now possible to - use most of TeX's pattern files unmodified. To make the process - more flexible, a new request `hpfcode' has been added which - provides a character code mapping for the `hpf' request. See - comment before hpf_getc() for more details. - - * src/roff/troff/env.cc (insert_hyphenation, hpf_getc): New - functions. - (read_patterns_file): Additional parameter for exception dictionary. - Extended to recognize \pattern, \hyphenation, and \endinput. - (do_hyphenation_patterns_file): Updated. - * src/roff/troff/env.h (hpf_code_table): New extern. - - * src/roff/troff/input.cc (hpf_code_table): New array. - (init_hpf_code_table, hyphenation_patterns_file_code): New - functions. - (hyphenation_code): Handle translation from `trin' correctly. - (main, init_input_requests): Updated. - (charinfo::set_translation): Handle hyphenation code also. - - * src/roff/troff/charinfo.h (charinfo::get_translation_input): New - inline function. - - * src/roff/troff/env.cc (WORD_MAX): Reduced to 256 since `unsigned - char' is used for offsets in hyphenation exceptions. - - * tmac/hyphen.us: Replace with contents of unmodified `hyphen.tex'. - - * NEWS, man/groff_diff.man, man/groff.man: Document it. - -2002-03-20 Larry Kollar - - * doc/groff.texinfo: Add documentation for `hpfa' and `trin' - requests. - -2002-03-18 Werner LEMBERG - - * tmac/html.tmac: Fix serious typo. - -2002-03-17 Larry Kollar - - * doc/groff.texinfo: Add documentation for `writec' request. - -2002-03-17 Werner LEMBERG - - Added request `hpfa' to append hyphenation patterns. - - * src/roff/troff/env.cc (hyphen_trie::read_patterns_file): Add - parameter `append'. - (hyphenation_patterns_file): Renamed to... - (do_hyphenation_patterns_file): This. - (hyphenation_patterns_file, hyphenation_patterns_file_append): New - functions. - (init_hyphen_requests): Updated. - * NEWS, man/groff.man, man/groff_diff.man: Document it. - -2002-03-16 Werner LEMBERG - - Added request `writec' in analogy to `tmc'. - - * src/roff/troff/input.cc (write_request): Renamed to... - (do_write_request): This. - Added one parameter. - (write_request, write_request_continue): New functions. - (init_input_requests): Updated. - * NEWS, man/groff.man, man/groff_diff.man: Document it. - - * font/devdvi/DESC.in (sizes): Allow all sizes in the range - 5-10000pt. - * NEWS: Document it. - -2002-03-15 Werner LEMBERG - - * man/groff.man: Add writem request. - - Add request `trin' (translate input) to make `.asciify' work - correctly. This is necessary since `charXXX' entity names are no - longer hardcoded in font definition files. - - * src/roff/troff/charinfo.h (charinfo): Add `asciify_code' and - `translate_input' members. - (charinfo::set_asciify_code, charinfo::get_asciify_code, - charinfo::set_translation_input): New methods. - (charinfo::set_translation): Add third argument. - * src/roff/troff/input.cc (charinfo:set_translation): Set - `asciify_code'. - (do_translate): Add second argument. - (translate_input): New function. - (init_input_requests): Updated. - * src/roff/troff/node.cc (glyph_node::asciify, - composite_node::asciify): Use `get_asciify_code'. - - * tmac/cp1047.tmac, tmac/latin1.tmac: Use `trin'. - - * NEWS, man/groff.man, man/groff_diff.man: Updated. - -2002-03-14 Larry Kollar - - * doc/groff.texinfo: Improve documentation of .RS and .RE. - -2002-03-14 Werner LEMBERG - - Add a new request `sizes' similar to the `sizes' command in DESC - files. - - * src/roff/troff/env.cc (override_sizes): New function. - (init_env_requests): Use it. - * src/roff/troff/token.h: Export `read_string'. - * NEWS, man/groff_diff.man, man/groff.man: Document it. - -2002-03-12 Werner LEMBERG - - * doc/groff.texinfo: More fixes for texinfo 4.1 and higher. - -2002-03-10 Werner LEMBERG - - * tmac/pspic.tmac: Add support for -Tdvi. - * tmac/dvi.tmac: Include pspic.tmac. - * src/devices/grodvi/grodvi.man: Document it. - * NEWS: Updated. - - * font/devlj4/generate/Makefile: Fix URL of metric files. - -2002-03-09 Werner LEMBERG - - * PROBLEMS: The static constructor bug has been fixed in z/OS V1R3. - -2002-03-09 Larry Kollar - - * tmac/groff_ms.man: Add documentation for RS and RE macros. - -2002-03-08 Werner LEMBERG - - * doc/groff.texinfo: Fixes for texinfo 4.1. - -2002-03-07 Werner LEMBERG - - * src/include/lib.h: Include getopt.h if groff-getopt.h can't be - included. - Handle CYGWIN properly. - -2002-03-07 Paco Andrés Verdú - - * font/devlbp/Makefile.sub (DEVFILES): Add some missing fonts. - * tmac/lbp.tmac: Add some font translations. - -2002-03-02 Werner LEMBERG - - * font/devcp1047/R.proto, font/devlatin1/R.proto, - font/devhtml/R.proto: Remove `charXXX' entries. - * tmac/tty.tmac, tmac/html.tmac: Load latin1.tmac or cp1047.tmac - where appropriate. - - * font/devlj4/generate/text.map: Remove `charXXX' entries. - * font/devlj4/*: Regenerated all font definition files. - * tmac/lj4.tmac: Load latin1.tmac. - - * src/utils/hpftodit/hpftodit.cc (do_file): Partially undo change - from 2000-06-17: LJ4 metric files are *not* text files. - - * tmac/troffrc, tmac/dvi.tmac, tmac/ps.tmac: Don't use .T string - register to test for EBCDIC. - -2002-03-01 Werner LEMBERG - - * src/utils/afmtodit/afmtodit.pl: Skip comment lines in encoding - files (as grops already does). - * src/utils/afmtodit/afmtodit.man: Document comment lines in map - files. - * src/devices/grops/grops.man: Document comment lines in encoding - files. - - * tmac/cp1047.tmac: New file. - * tmac/dvi.tmac, tmac/tty-char.tmac: Use it. - * tmac/ps.tmac: Load latin1.tmac or cp1047.tmac. - * tmac/Makefile.sub (NORMALFILES): Updated. - - * tmac/ec.tmac: Don't load latin1.tmac again. - - * font/devps/generate/lgreekmap, font/devps/generate/symbolchars, - font/devps/generate/dingbats.map, - font/devps/generate/dingbats.rmap, font/devps/text.enc, - font/devps/generate/Makefile (symbolmap): Add header comment. - * font/devps/generate/textmap: Ditto. - Remove `charXXX' entries. - * font/devps/symbolmap: Regenerated. - * font/devps/*: Regenerated all font definition files. - -2002-02-28 Werner LEMBERG - - Add color support to grodvi (for drawing colors are currently - translated to gray values). - - * src/devices/grodvi/dvi.cc (FILL_MAX): Removed. - (dvi_printer): Add `cur_color' member. - (dvi_printer::set_color): New function. - (draw_dvi_printer): Remove `fill'. - (draw_dvi_printer::fill_next): Pass environment as parameter. - Update code for new color support translated to gray. - (dvi_printer::set_char): Updated. - (dvi_printer::begin_page, dvi_printer::end_page): Handle color - changes crossing the page border. - (dvi_printer::draw): Updated. - Remove cases `f' and `F'. - * tmac/dvi.tmac: Add color definitions. - * NEWS, src/devices/grodvi/grodvi.man: Updated. - - * tmac/an-old.tmac (R): Make this a macro to emit a warning if - used incorrectly. - - * aclocal.m4 (GROFF_NEED_DECLARATION): Use test similar to recent - versions of autoconf. - * configure: Updated. - - * doc/homepage.ms: Use `.blm'. - * tmac/www.tmac (www-depth): New auxiliary variable. - (www-pop-level): Don't issue HTML tag. - (ULS, ULE, LI): Use absolute indentation. - - * src/devices/grops/ps.cc (ps_printer::begin_page, - ps_printer::end_page): Switch forth and back to default color while - starting a new page. - -2002-02-27 Werner LEMBERG - - Add EC and TC fonts to devdvi. - - * src/utils/tfmtodit/tfmtodit.man: Document patching of exbase.mf. - * font/devdvi/generate/cork.map: Renamed to... - * font/devdvi/generate/ec.map: This. - Remove entry for `aq'. - * font/devdvi/generate/tc.map: New file. - * font/devdvi/generate/Makefile (*EC, *TC): New creation rules for - EC and TC fonts. - (FONTS): Updated. - * font/devdvi/*EC, font/devdvi/*TC: New font definition files. - * font/devdvi/Makefile.sub (DEVFILES): Updated. - * tmac/ec.tmac: New file. - * tmac/Makefile.sub (NORMALFILES): Updated. - * NEWS, src/devices/grodvi/grodvi.man: Updated. - * man/groff_char.man: Check `ECFONTS' register. - - * font/devdvi/{TR,TI,TB,TBI,HR}: Fix `name' field. - -2002-02-26 Werner LEMBERG - - * font/devdvi/generate/*.map: Remove all `charXXX' entries. - * font/devdvi/generate/cork.map: Add 'y and 'Y. - * font/devdvi/*: Updated. - * tmac/dvi.tmac: Formatting. - - Add font `HBI' for the dvi output. - Add support for font families `T' and `H'. - - * font/devdvi/HBI: New file. - * font/devdvi/B: Renamed to ... - * font/devdvi/TB: This. - * font/devdvi/BI: Renamed to ... - * font/devdvi/TBI: This. - * font/devdvi/I: Renamed to ... - * font/devdvi/TI: This. - * font/devdvi/R: Renamed to ... - * font/devdvi/TR: This. - * font/devdvi/H: Renamed to ... - * font/devdvi/HR: This. - * font/devdvi/Makefile.sub (DEVFILES): Updated. - * font/devdvi/generate/Makefile (HBI): New rule. - (FONTS): Updated. - (R, I, B, BI, H): Renamed to ... - (TR, TI, TB, TBI, HR): This, respectively. - (srcdir): Fixed. - * NEWS, src/devices/grodvi/grodvi.man: Updated. - * font/devdvi/DESC.in: Don't mount R, I, B, BI, and CWI. - Add `styles' and `family' keywords. - * tmac/dvi.tmac: Alias `H' to `HR'. - Add some fspecial requests for italic fonts. - Add TR and TI as special. - Add support for `_' with font CWI. - - * src/roff/troff/number.cc (parse_expr): Add missing `break' for - operator `:'. Until now, the expression `0:1' would return 2 - instead of 1. - -2002-02-25 Werner LEMBERG - - * man/groff_char.man: Added some missing PS glyph names (from the - Adobe Glyph List). - * font/devps/generate/textmap, font/devps/symbolmap: Add - `arrowupdn'. - - * doc/groff.texinfo: Minor additions and fixes. - * man/groff_diff.man: Remove documentation of fp request. This - is already covered in the original troff manual. - Updated to be consistent with other doc files. - * NEWS: Updated. - -2002-02-24 Werner LEMBERG - - * aclocal.m4 (GROFF_EBCDIC): Don't include `font/devutf8' in - TTYDEVDIRS. - Define new variable OTHERDEVDIRS (containing `font/devlj4 - font/devlbp' if not EBCDIC). - * Makefile.in (TTYDEVDIRS): Always include `font/devutf8'. - (OTHERDEVDIRS): New variable. - (MDEFINES, DEVDIRS, ALLDIRS, DISTDIRS): Updated. - * configure: Regenerated. - - * NEWS, src/devices/grotty/grotty.man: Updated. - -2002-02-23 Werner LEMBERG - - * src/roff/troff/input.cc (do_overstrike, do_bracket, - get_line_arg): Honour input level. - - Add new symbol `mc' corresponding to U+00B5 MICRO SIGN. - - * font/*/*: Implement it in all font files. - * font/devps/generate/textmap, font/devps/generate/symbolchars, - * font/devps/symbolmap: Updated. - * font/devlj4/generate/text.map: Updated. - * font/devdvi/generate/CompileFonts (sizes): Add LaTeX sizes. - * font/devdvi/generate/texmi.map: Updated. - - * font/devutf8/R.proto: Remove all `charXXX' entries. - * font/devutf8/NOTES: Updated. - - * font/devX*/*: Regenerated with xtotroff, using fonts from XFree86 - version 4.1.0. - - * tmac/latin1.tmac, tmac/psold.tmac, tmac/tty-char.tmac: Updated. - - * NEWS, man/groff_char.man: Updated. - -2002-02-21 Phil Lobbes - - * src/include/lib.h [HAVE_SNPRINTF]: Include stdarg.h. - -2002-02-20 Ralph Corderoy - - * src/roff/grog/grog.pl: Fix computation of $refer. - -2002-02-19 Werner LEMBERG - - * src/include/lib.h [!HAVE_SNPRINTF]: Add declarations for - `snprintf' and `vsnprintf'. - - * src/include/htmlindicate.h: Renamed to... - * src/include/htmlhint.h: This. - * src/include/Makefile.sub: Updated. - * src/preproc/eqn/main.cc: Updated. - -2002-02-18 Werner LEMBERG - - * man/roff.man, man/groff_out.man, man/groff.man, - man/groff_diff.man, man/ditroff.man, src/roff/groff/groff.man, - src/roff/troff/troff.man: Updated to latest changes in www.tmac. - - * win32-diffs: Updated. - -2002-02-17 Werner LEMBERG - - * doc/Makefile (clean): Add *.eps. - (MEMACROS): Removed. - (TFLAG): New variable. - (TROFF): Use it. - Add -ww. - (GROFF): Use TFLAG, FFLAG, -U, -p, -e, -t, and -ww. - (.me.dit): Fixed. - (.ms.html, .ms.ascii, .ms.ps, homepage.html): Simplify. - - * tmac/www.tmac: Use dummy diversion while resetting and disabling - `.tl'. - * tmac/e.tmac: Inserted some more `\"' to remove warnings if used - unstripped. - * src/roff/troff/troff.man: Fix order of parameter description. - - * NEWS: Updated. - -2002-02-16 Gaius Mulley - - Simplify image handling for grohtml. - Fix

bug. - - * src/devices/grohtml/html-text.cc (DEBUGGING): Don't undefine but - comment out. - (html_text::dump_stack): Don't emit newline while debugging. - (html_text::do_push) [DEBUGGING]: Print more info. - (html_text::check_emit_text): Fix handling of

. - * src/devices/grohtml/html.h: Updated. - * src/devices/grohtml/output.cc (FPUTC, FPUTS, PUTC): New macros, - replacing `fputc', `fputs', `putc'. If DEBUGGING is defined, they - send its data to stderr also. - Update all callers. - (simple_output::space_or_newline) [DEBUGGING]: Removed. - * src/devices/grohtml/post-html.cc (html_printer::do_links, - html_printer::html_printer): Remove `DEBUGGING' conditionals. - - * src/include/html-strings.h (HTML_IMAGE_{CENTERED,LEFT,RIGHT,END}): - Removed. - * src/libs/libgroff/htmlhint.cc (is_in_graphic_start, - is_inline_image): Removed. - (html_begin_suppress, html_end_suppress): Don't take a parameter. - (graphic_start, graphic_end): Removed. - * src/include/htmlindicate.h: Updated. - * src/preproc/html/pre-html.cc (DEBUG_HTML): Removed. - (macroset_template): New global variable. - (makeFileName): Use `macroset_template'. - (write_end_image): Don't take a parameter. - Don't emit newline. - (write_start_image: Don't emit newline. - (char_buffer::write_upto_newline): Updated. - (char_buffer::skip_to_newline): Renamed to ... - (char_buffer::skip_until_newline): This. - Fix code. - (char_buffer::write_file_troff, char_buffer::write_file_html): - Simplified. - (createAllPages, createImage) [DEBUGGING]: Handle `debug' flag. - (removeAllPages): Remove `DEBUGGING' conditionals. - (addRegDef, dump_args): New functions. - (char_buffer::do_html, char_buffer::do_image): Handle - `www-image-template' command line variable. - Add more debugging code. - (addps4html): Removed. - (removeTempFiles) [DEBUGGING]: Handle `debug' flag. - - * src/preproc/eqn/main.cc: Include `ctype.h'. - (suppress_html): Removed. - (do_file): Updated. - (inline_equation): Use `html_begin_suppress' and - `html_end_suppress'. - * src/preproc/pic/troff.cc: Don't include `htmlindicate.h'. - (troff_output::start_picture, troff_output::finish_picture): - Updated. - * src/preproc/tbl/main.cc: Don't include `htmlindicate.h'. - (process_input_file): Updated. - - * src/roff/troff/div.cc (page_number): Set page number only if the - `ps4html' register isn't defined. - * src/roff/troff/input.cc (image_no): New external variable. - (do_suppress): Use it. - * src/roff/troff/node.h (suppress_node::image_id): New member. - * src/roff/troff/node.cc (image_no): Remove `static' keyword. - (suppress_node::suppress_node): Initialize `image_id' member. - (suppress_node::same): Handle `image_id' also. - (suppress_node::copy): Updated. - (last_image_id): New global variable. - (suppress_node::tprint): Use it. - - * tmac/an-old.tmac (TS, TE, EQ, EN): Use HTML-IMAGE and - HTML-IMAGE-END. - * tmac/pspic.mac (PSPIC): Fix html support. - * tmac/s.tmac (@EQ, @EN, @TS, TE, PS, PE): Ditto. - * tmac/www.tmac (www-image-template): Set up. - (HTMLINDEX): Renamed to... - (HX): This. - (BODYCOLOR): Renamed to... - (BCL): This. - (BACKGROUND): Renamed to... - (BGIMG): This. - (URL): Change order of parameters for consistency. - (MAILTO): Renamed to... - (MTO): This. - (IMAGE, PNG-IMAGE, MARGIN-PNG-IMAGE): Renamed to... - (IMG, PIMG, MPIMG): This. - (HTML-H-BEGIN, HTML-H-END): Renamed to... - (HnS, HnE): This. - (LINKS): Renamed to... - (LK): This. - (LINE): Renamed to... - (HR): This. - (NO-AUTO-RULE): Renamed to... - (NHR): This. - (HTML-TL): Renamed to... - (HTL): This. - (UL-BEGIN, UL-END): Renamed to... - (ULS, ULE): This. - (DROPCAP): Renamed to... - (DC): This. - (TS, TE, EQ, EN): Provide default definitions. - (www-make-unique-name): Updated. - (HTML-IMAGE-INLINE): Fix typo. - * tmac/groff_www.man: Updated. - - * doc/Makefile (homepage.html): Add option -r to grohtml. - Use shortened image name. - * doc/groff.texinfo: Updated info on grohtml strings and macros. - * doc/homepage.ms: Updated and extended. - -2002-02-14 Werner LEMBERG - - Don't use `CSI 39 m' and `CSI 49 m' but `CSI 0 m'. - - * src/devices/grotty/tty.cc (SGR_DEFAULT_COLOR, - SGR_BACK_DEFAULT_COLOR): Replaced with ... - (tty_printer::put_color): Use it. - (ttr_printer::end_page): Simplify. - -2002-02-13 Werner LEMBERG - - * tmac/groff_tmac.man: Moved to... - * man/groff_tmac.man: This place. - * tmac/Makefile.sub, man/Makefile.sub: Updated. - -2002-02-12 Werner LEMBERG - - * src/libs/libgroff/Makefile.sub (snprintf.o): Don't use - $(COMPILE.c) to not include groff's assert.h. - - * src/drivers/grotty/tty.cc (main): Add GROFF_NO_SGR environment - variable. - * NEWS, src/drivers/grotty/grotty.man: Document it. - -2002-02-11 Werner LEMBERG - - * src/libs/snprintf/snprintf.c: Updated to latest version - (2002-02-11). - - * src/roff/grog/grog.pl (process): Fix handling of `.['. We now - test whether there is `.]' also. - Don't check for spaces after `.['. - * src/roff/grog/grog.sh: Do the same. - -2002-02-10 Werner LEMBERG - - Illegal -> Invalid. - - * src/libs/libgroff/illegal.cc: Renamed to ... - * src/libs/libgroff/invalid.cc: This. - (illegal_char_table): Renamed to ... - (invalid_char_table): This. - * src/libs/libgroff/Makefile.sub: Updated. - * win32-diffs: Updated. - - * doc/groff.texinfo, src/devices/grops/psrm.cc (ps_get_line), - src/libs/libdriver/input.cc (fatal_command, parse_color_command, - parse_x_command), src/libs/libgroff/font.cc (text_file::next, - font::load), src/preproc/eqn/main.cc (read_line, main), - src/preproc/eqn/lex.cc (file_input::read_line), - src/preproc/pic/lex.cc (file_input::read_line, - simple_file_input::get, simple_file_input::peek), - src/preproc/pic/main.cc (top_input::get, top_input::peek), - src/preproc/pic/pic.man, src/preproc/refer/main.cc - (input_stack::push_file), src/preproc/refer/refer.cc (do_file, - do_bib), src/preproc/tbl/main.cc (table_input::get), - src/preproc/grn/grn.man, src/preproc/grn/main.cc (interpret), - src/roff/troff/input.cc (file_iterator::fill, file_iterator::peek, - do_zero_width, read_request, encode_char, ps_get_line, - transparent_file, get_char_for_escape_name, transparent_translate, - asciify, input_char_description, read_string, set_string), - src/roff/troff/env.cc (environment::add_html_tag), - src/roff/troff/troff.man, tmac/e.tmac (`@(', `(f'): Do it. - - * src/include/lib.h: Updated. - - * src/preproc/eqn/eqn.cc: Removed. - - * NEWS: Updated. - - * src/preproc/grn/hdb.cc (DBRead): Fix fscanf() fields. - -2002-02-09 Werner LEMBERG - - * doc/gnu.xpm: New image. - * doc/Makefile (DOCS): Add homepage.ps. - Add rules for converting xpm->png and xpm->eps. - Use `gnu.{xpm,eps}' as image names. - * doc/homepage.ms: Updated. - -2002-02-09 Gaius Mulley - - * tmac/www.tmac (www-error): New macro, replacing calls to `@error'. - (IMAGE): Change image position parameters to `-L', `-R', and `-C'. - Remove calls to `B1' and `B2' - (PNG-IMAGE): New macro for inclusion of images in PNG format. - (www-left-ll-trap, www-left-po-trap, www-right-ll-trap): New - auxiliary variables for MARGIN-PNG-IMAGE. - (www-finish-left-po, www-finish-right-ll, www-finish-left-ll): New - auxiliary macros for MARGIN-PNG-IMAGE. - (MARGIN-PNG-IMAGE): New macro to put an image in PNG format into - the margin. - (www-heading-no): New auxiliary variable for HTML-H-{BEGIN,END}. - (HTML-H-BEGIN, HTML-H-END): New macros to begin and end a heading. - (DROPCAP): New macro to produce dropcap characters. - (www-do-image): Renamed back to... - (HTML-DO-IMAGE): This. - Updated all callers. - - * doc/Makefile (gnubw.eps): Updated. - * doc/homepage.ms: Updated. - -2002-02-08 Werner LEMBERG - - * doc/pic.ms: Fixed typos (\(*tx -> \*(tx). - Added `linethick' to table in section `Style Variables'. - -2002-02-08 Gaius Mulley - - * src/libs/libdriver/input.cc (get_extended_arg): Fix conditional. - -2002-02-07 Werner LEMBERG - - Adding options -C (compatibility mode) and -c (grotty's old output - scheme) to nroff. - - * src/roff/nroff/nroff.sh: Implement it. - Remove `-Wall'. - * NEWS, src/roff/nroff/nroff.man: Updated. - - * PROBLEMS: Document bison 1.32 bug. - - Some fixes to make groff compile on z/OS 1.2 UNIX (was OS/390). - - * src/roff/troff/node.cc (make_tfont): Define it earlier. - * src/roff/troff/div.h: Add prototype for `end_diversions'. - * src/roff/troff/input.cc: Add prototype for `process_input_stack'. - * src/roff/troff/env.h: Add prototype for `title'. - - Adding EBCDIC support to grotty. - - * src/devices/grotty/tty.cc (CSI): New macro. - (SGR_*, tty_printer::put_color): Use it. - -2002-02-06 Werner LEMBERG - - Implementing color support in grotty. The new switch -c activates - the old drawing scheme, disabling color at the same time. The new - switch `-i' selects italic instead of underlining (SGR only). - - * src/devices/grotty/tty.cc (putstring): New define instead of - `fputs'. Updated all callers. - (old_drawing_scheme): New global variable. - (COLOR_CHANGE): New enum value. - (SGR_*): New defines containing color handling escape sequences. - (TTY_MAX_COLORS, DEFAULT_COLOR_IDX): New defines. - (glyph): New members `back_color_idx' and `fore_color_idx'. - (glyph::order): Add COLOR_CHANGE. - (tty_printer): New members `cur_fore_idx', `curr_back_idx', - `is_underline', `is_bold', `cu_flag', `tty_colors'. - New methods `make_underline', `make_bold', `color_to_idx', - `change_color', `put_color'. - (cu_flag): Moved into `tty_printer' class. - (tty_printer::tty_printer): Initialize colors. - (tty_printer::add_char, tty_printer::set_char, tty_printer::special, - tty_printer::draw, tty_printer::end_page): Handle colors also. - (main): Add options `-c' and `-i'. - (usage): Updated. - * NEWS, src/devices/grotty/grotty.man: Updated. - - * src/include/errarg.h (errarg): Add support for `unsigned int'. - * src/libs/libgroff/errarg.c: Implement it. - - * src/include/printer.h (printer): Add `change_color' method - (currently used by grotty only). - * src/libs/libdriver/printer.cc: Implement it. - * src/libs/libdriver/input.cc (parse_D_command, do_file): Add - call to `pr->change_color'. - - * src/roff/troff/node.cc (troff_output_file::fill_color, - troff_output_file::glyph_color): Call `do_motion'. - - * tmac/tty.tmac: Add color definitions. - - * src/roff/groff/groff.man: Minor fixes. - -2002-02-05 Bernd Warken - - * src/libs/libdriver/input.cc: Introduce `EnvInt' typedef and use - it. This is a preparation for future changes. - -2002-02-05 Werner LEMBERG - - * src/roff/troff/input.cc (process_input_stack): Fix the case - where leading spaces are followed by \f or \s; previously, an - incorrect space width has been used. - - * doc/roff.man (quoted_char): Fix argument. - (comment): Define string. - -2002-02-04 Larry Kollar - - * doc/groff.texinfo: More fixes. - -2002-02-04 Werner LEMBERG - - * src/preproc/eqn/box.cc (output_string): Don't use \\*[...]. - * src/preproc/eqn/main.cc (do_file, inline_equation): Call - `restore_compatibility' before `output_string' -- the LINE_STRING - register now already contains proper switches from and to - compatibility mode. - - * man/groff_char.man: Add Euro symbol. - * man/groff_diff.man: Improve documentation of `.am1' and `.as1'. - * tmac/tty.tmac: Add `EUR' as replacement for `eu' and `Eu'. - * doc/groff.texinfo (Defstr*): Print strings with full syntax. - Other minor fixes. - - * doc/Makefile (.SUFFIXES, .texinfo.pdf, clean): Add support for - texinfo->pdf. - (.texinfo.html): Add support for texinfo->html. - -2002-02-03 Werner LEMBERG - - Added three new requests `ds1', `as1', and `ami'. The former two - are equivalent to `ds' and `as' with the difference that - compatibility mode is saved on entry, switched off during string - expansion, and restored on exit. The latter is the pendant to `dei' - for `am'. - - (do_define_string): Use `define_mode' and `calling mode'. - Insert COMPATIBLE_SAVE and COMPATIBLE_RESTORE at the beginning and - end of string, respectively. - (define_string, append_string): Use `calling_mode'. - (define_nocomp_string, append_nocomp_string, - define_string_indirect): New functions. - (init_input_requests): Updated. - * NEWS, man/groff_diff.man, man/groff.man: Document it. - - * src/preproc/eqn/box.cc (box::top_level, box::extra_space): Use - `as1' for assigning LINE_STRING (this is `10' usually). Sun's - mm macro package accesses this string register directly. - * src/preproc/eqn/main.cc (inline_equation): Use `as1'. - - * tmac/trace.tmac: Trace calls to `am' also. Make it work in - compatibility mode. - -2002-02-02 Larry Kollar - - * doc/groff.texinfo, tmac/groff_ms.man: More fixes. - -2002-01-31 Werner LEMBERG - - * tmac/an-old.tmac (I): Use \, and \/ to improve spacing. - -2002-01-31 Bernd Warken - - * src/devices/grolbp/lbp.cc (main): Delete `pr'. - * man/groff_out.man: Revised and updated. - -2002-01-30 Bernd Warken - - * src/libs/libdriver/input.cc [USE_ENV_STACK]: New macro to comment - out the unused `{' and `}' commands. Undefined by default. - (IntArray): Make `data' private. - (IntArray::operator[], IntArray::get_data, IntArray::len): Use these - new methods instead. - (skip_line_D, skip_to_end_of_line): New functions. - (get_D_fixed_args): Use `skip_line_D'. - Changed to handle dummy odd arguments by ... - (get_D_fixed_args_odd_dummy): This new function. - (get_D_variable_args): Split some code into ... - (get_possibly_integer_args): This new function. - (send_draw): Use more `const'. - (delete_current_env): New function. - (position_to_end_of_args): Use `size_t'. - Updated. - (send_draw): Updated. - (parse_D_command): Handle `c', `C', and `t' better. - Updated. - (do_file): Updated. - -2002-01-29 Werner LEMBERG - - * NEWS: Revised. - * doc/groff.texinfo: Introduce @Def...List, @Def...Item, and - @Def...ListEnd which replaces @Def...x. This is necessary to get - proper HTML output -- see the comment in the file for more - information. - Updated all calls. - -2002-01-29 Gaius Mulley - - Fixes to make color changes of 2002-01-21 work with grohtml. - - * src/devices/grohtml/post-html.cc (style): Updated. - (html_printer): Remove unused methods. - (html_printer::do_font, html_printer::draw, html_printer::set_char, - html_printer::special): Updated. - * src/devices/grohtml/html-text.cc (debugStack, turnDebug, - html_text::dump_stack_element, html_text::dump_stack) [DEBUGGING]: - Added some debugging code. - (html_text::start_tag): Updated. - (html_text::do_push): New method. - (html_text::push_para): Call it. - Add method for handling color. - (html_text::do_color): Updated. - (html_text::shutdown): Handle color. - * src/devices/grohtml/html-text.h (tag_definition): New member - `col'. - Updated. - -2002-01-28 Werner LEMBERG - - * tmac/ps.tmac, tmac/html.tmac: Fix compatibility mode issues. - -2002-01-27 Gaius Mulley - - Add two switches -a and -g to control the antialiasing bits for - text and graphics, respectively. - - * src/devices/grohtml/post-html.cc (main): Dummy code for `-a' and - `-g'. - * src/devices/grohtml/grohtml.man: Document them. - * src/preproc/html/pre-html.cc (MIN_ALPHA_BITS, MAX_ALPHA_BITS): - New macros. - (textAlphaBits, graphicAlphaBits, antiAlias): New global variables. - (setupAntiAlias): New function. - (createAllPages): Updated. - (scanArguments): Handle `-a' and `-g'. - (main): Call `setupAntiAlias'. - * NEWS: Updated. - -2002-01-27 Werner LEMBERG - - * doc/groff.texinfo (Def*): Call index function after deffn. - - * tmac/html.tmac: Call `nroff' request. - -2002-01-26 Larry Kollar - - * tmac/groff_ms.man: Add some omissions. - -2002-01-25 Larry Kollar - - * tmac/groff_ms.man: Typographical improvements. - -2002-01-25 Werner LEMBERG - - * doc/groff.texinfo: Updated version and copyright. - * src/devices/grops/grops.man: Updated. - - * tmac/groff_tmac.man: Fix `ig' macro. - - * tmac/an-old.tmac (ne): Redefine `ne' request to be a no-op in - nroff mode. - Use `.ne' unconditionally everywhere. - (TS): Only insert some vertical space. Doing a page break is no - longer necessary due to the redefinition of the `ne' request. - - * src/libs/libdriver/input.cc (parse_D_command): Don't emit a - warning for unknown subcommands but parse and pass them to the - device driver. - -2002-01-24 Werner LEMBERG - - * tmac/groff_www.man, NEWS: Fix typos. - -2002-01-21 Werner LEMBERG - - Complete revision of color support: - - Adapt programs to the new libdriver/input.cc. - - Color spaces are no longer converted to RGB but transferred as-is - in the troff intermediate output format. - - Handle default color gracefully. troff now supports a `default' - color (which can't be changed). - - grops will now use the proper color space functions if available. - - Update pic. - - Note that currently grohtml doesn't handle colors properly. This - has to be fixed. - - * src/libs/libgroff/itoa.c (UINT_DIGITS): New macro. - (ui_to_a): New function. - * src/include/lib.h: Updated. - - * src/include/color.h (color_scheme): Replace `NONE' with `DEFAULT'. - (color): Simplified; removed all `double' members and methods. - A new array `components' now holds the color parameters. - (color::is_default, color::get_components): New methods. - (color::operator==, color:operator!=): New. - (Red, Green, Blue, Cyan, Magenta, Yellow, Black, Gray): New macros - to make access to the `components' array more comprehensible. - * src/libs/libgroff/color.cc: Implement new color support. - (atoh): Small fixes. - (color::read_encoding): Simplified for new troff intermediate color - output format. - (default_color): New global variable. - - * src/roff/troff/input.cc (default_symbol): New global variable. - (lookup_color): Use it. - (default_black): Removed. - (do_glyph_color, do_fill_color): Simplified. - (define_color): Handle default color. - Improve warnings. - (do_if_request): Handle default color. - * src/roff/troff/env.cc (environment::environment): Initialize - colors with `default_color'. - * src/roff/troff/node.cc (troff_output_file::put): Add method - for `unsigned int'. - (troff_output_file::hex): Removed. - (troff_output_file::fill_color, troff_output_file::glyph_color): - Updated to include/color.h and libdriver/input.cc. - - * src/preproc/pic/object.cc (draw_arrow): New parameter to set - fill color properly (identically to the outline color). \D'f...' - doesn't work any more. - All function calls to it updated. - - * src/devices/grohtml/post-html.cc (html_printer::do_body, main): - Updated. - * src/devices/grohtml/html-text.cc (html_text::issue_color_begin): - Updated. - - * src/devices/grops/ps.cc (ps_output::put_color): New method. - (ps_printer::sbuf_color): Make a real member instead of pointer. - (ps_printer::fill_color, ps_printer::output_color): Removed. - (ps_printer::ps_printer): Updated. - (ps_printer::set_char): Ditto. - (ps_printer::set_color): Use various color schemes. - Use `put_color' method. - (ps_printer::flush_sbuf): Don't set color. - (ps_printer::fill_path): Take `environment' as parameter. - Simplify color handling. - (ps_printer::set_line_thickness): Renamed to ... - (ps_printer::set_line_thickness_and_color): This (and updated). - (ps_printer::set_color): Change second parameter from `complete' - to `fill' which better describes what it does. - (ps_printer::draw): Call `flush_sbuf' to output graphic commands - and text in the right order. - Updated. - Remove branches for `f' and `F'; this is handled by - libdriver/input.cc. - * src/devices/grops/ps.h: Updated. - * font/devps/prologue (FL): Redefined. - ({F,C}r,k,g: New color functions (with and without filling). - - * doc/pic.ms, src/preproc/pic/pic.man: Small fixes. - * man/groff_diff.man, man/groff.man, man/groff_out.man, - doc/groff.texinfo, NEWS: Updated. - -2002-01-20 Bernd Warken - - * src/libs/libdriver/input.cc: Completely rewritten. See comments - in this file for what has been changed. - -2002-01-19 Werner LEMBERG - - * test-groff: Fix GROFF_FONT_PATH. - * tmac/andoc.tmac: Add dummy macros for equation support -- eqnrc - is read before .TH or .Dd is parsed. - -2002-01-18 Gaius Mulley - - * src/libs/libgroff/geometry.cc (check_output_arc_limits): Fix - quadrant boundaries. - -2002-01-18 Werner LEMBERG - - * devices/grops/ps.cc: Aargh! Fix the fix of the incorrectly - applied last patch. - -2002-01-17 Ruslan Ermilov - - * tmac/doc.common: Initialize %I register for the %I macro to - avoid (harmless) warning. - * tmac/doc.tmac (Bd): There is no reason to enforce -compact - when in the SYNOPSIS section. - -2002-01-17 Bruno Haible - - * src/preproc/pic/lex.cc (get_token): Fix typo. - -2002-01-17 Werner LEMBERG - - * devices/grops/ps.cc: Fix incorrectly applied last patch. - -2002-01-17 Larry Kollar - - * tmac/groff_ms.man: Completely rewritten. - -2002-01-16 Werner LEMBERG - - * tmac/an-old.tmac (TS): Force break, inserting some vertical space. - -2002-01-15 Gaius Mulley - - * devices/grops/ps.cc (ps_printer::fill_path): Fix handling of - fill colors. - (ps_printer::draw): Ditto. - -2002-01-14 Ruslan Ermilov - - * tmac/groff_mdoc.man: Minor fixes. - -2002-01-13 Werner LEMBERG - - * man/groff_out.man: Some fixes. - -2002-01-13 Gaius Mulley - - * doc/pic.ms: Fix typos. - -2002-01-12 Werner LEMBERG - - * doc/groff.texinfo, doc/groff.man: More on a printable backslash. - -2002-01-10 Werner LEMBERG - - * font/devutf8/R.proto, font/devhtml/R.prot: Add `Eu' and `eu' - symbols. - * NEWS: Updated. - -2002-01-09 Bernd Warken - - * man/groff_out.man: Revised. - * man/roff.man: Minor fixes. - * src/roff/troff/troff.man: Some reordering. - -2002-01-09 Werner LEMBERG - - * tmac/an-old.tmac: Add dummy macros for equation support. - -2002-01-07 Werner LEMBERG - - doc/groff.texinfo: Fix documentation of glyph searching algorithm. - - * tmac/an-old.tmac: Revert change 2001-12-23. This breaks too many - man pages. - * tmac/groff_man.man: Small improvements. - -2002-01-07 Bernd Warken - - * man/groff_diff.man: Revised. - -2002-01-06 Werner LEMBERG - - * tmac/www.tmac: Remove extraneous backslash. - -2002-01-06 Bernd Warken - - * man/ditroff.man, src/roff/groff/groff.man, man/groff.man: Revised. - -2002-01-05 Werner LEMBERG - - Integrated groffer, contributed by Bernd Warken. - - * contrib/groffer/*: New. - * Makefile.in, NEWS: Updated. - -2002-01-04 Werner LEMBERG - - * doc/groff.texinfo: Added macros `@Defmpreg' and `@Defmpregx' for - registers defined in macro packages. - Revising the ms part. - -2002-01-04 Larry Kollar - - * doc/groff.texinfo: Add documentation for ms macros. - -2002-01-02 Werner LEMBERG - - First step in adding PS support for the Euro symbol. `eu' is the - official Euro logo, `Eu' is a font-specific glyph variant. - - * font/devps/text.enc: Add `Euro' at position 9. - * font/devps/generate/textmap: Add `Euro' as symbol `Eu'. - * font/devps/symbolmap: Regenerated. - - * NEWS: Updated. - -2002-01-02 Bernd Warken - - * man/roff.man: Revised. - -2002-01-01 Bernd Warken - - * src/roff/groff/groff.man: Completely rewritten. - -2001-12-31 Werner LEMBERG - - * doc/Makefile: Updated. - -2001-12-30 Werner LEMBERG - - * tmac/www.tmac: Make all names of internal macros/registers/strings - lowercase, and prepend `www-'. - Other minor changes. - * src/roff/troff/troff.man: Add preprocessor string at BOF. - -2001-12-30 Gaius Mulley - - Implement option `-b' in grohtml to set the HTML background colour. - - * src/devices/grohtml/post-html.cc (default_background): New global - variable. - (html_printer::html_printer): Initialize `background' to - `default_background'. - (main): Implement option `-b'. - (usage): Updated. - * src/preproc/html/pre-html.cc (scanArguments): Add dummy handling - of `-b' option. - * src/devices/grohtml/grohtml.man: Updated. - * doc/Makefile (.ms.html): Use `-b'. - * tmac/html.tmac: Don't set background color. - - Add new grohtml tag `.html-tl'. - - * src/devices/grohtml/post-html.cc (title_desc): Add `with_h1' - member variable. - (title_desc::title_desc): Updated. - (html_printer::troff_tag): Handle `.html-tl'. - (html_printer::write_title): Use `with_h1'. - * tmac/www.tmac (www-end-nowhere): New auxiliary macro. - (HTML-TL): New macro. - - Add support for unordered lists in HTML. - - * tmac/www.tmac (www-level): New auxiliary register. - (www-level1, www-level2, www-level3): New auxiliary strings. - (www-push-level, www-pop-level): New auxiliary macros - (UL-BEGIN, UL-END, LI): User macros for unordered lists. - - Miscellaneous. - - * src/preproc/html/pre-html.cc (DEFAULT_IMAGE_RES): Increase to 100. - (DEFAULT_VERTICAL_OFFSET): Removed. - (IMAGE_BOARDER_PIXELS): Set to 0. - (A4_LENGTH, A4_OFFSET, LETTER_LENGTH, LETTER_OFFSET): New macros. - (vertical_offset): Initialize with 0. - (gsPaper): New global variable. - (get_resolution): Scan for and return unsigned int. - (get_papersize): New function to get paper length from devps/DESC. - (determine_vertical_offset): New function. - (createAllPages): Produce gray-level images and use proper page - length. - (createImage): Use `-quiet' option of pnmcrop. - (addZ): Fix passing of `-Z'. - (scanArguments): Fix handling of `-o'. - (main): Call `determine_vertical_offset'. - * src/devices/grohtml/post-html.cc (html_printer::draw): Comment out - code for `l'. - - * src/libs/libgroff/tmpfile.cc (add_tmp_file): Fix buffer length. - * src/roff/troff/node.cc (troff_output_file::check_charinfo): Handle - glyph descenders properly. - - * doc/homepage.ms: Include `gnubw.eps'. - * doc/Makefile (gnubw.eps): New rule. - (homepage.html): Depend on `gnubw.eps'. - -2001-12-25 Werner LEMBERG - - * src/roff/troff/input.cc (default_black): Fix return value. - -2001-12-24 Ruslan Ermilov - - * tmac/doc-common (Dt): Change output of architecture strings. - Do some syntax cleanup. - * tmac/groff_mdoc.man: Updated. - -2001-12-23 Werner LEMBERG - - Adding an `itc' request (input line trap accepting \c). - - * src/roff/troff/env.h (environment): New member - `continued_input_trap'. - Make `do_input_trap' a friend function instead of `input_trap'. - * src/roff/troff/env.cc (environment::environment, - environment::copy): Updated. - (environment::newline): Implement it. - (do_input_trap): New function. - (input_trap): Call `do_input_trap'. - (input_trap_continued): New function. - (init_env_requests): Updated. - * src/roff/troff/TODO: Updated. - - * tmac/an-old.tmac (SH, SS, B, I, SM, SB, TP): Use `.itc' instead of - `.it'. - - * src/preproc/grn/hdb.cc (DBRead): Really chop after 127 characters. - -2001-12-22 Ruslan Ermilov - - * tmac/doc-common, tmac/doc-syms: Small updates. - -2001-12-22 Colin Watson - - * tmac/an-old.tmac (an-p-footer): Set title length in environment 1. - -2001-12-22 Bernd Warken - - * MANIFEST: New file. - -2001-12-22 Werner LEMBERG - - * src/preproc/grn/grn.man: Updated. - -2001-12-22 Solar Designer - - * src/preproc/grn/hdb.cc (MAXSTRING_S): New macro. - (DBRead): Use it. - -2001-12-19 Werner LEMBERG - - Implement a fallback character request `.fchar'. - - * src/roff/troff/charinfo.h (charinfo): New flag `fallback'. - (is_fallback): New inline function. - * src/roff/troff/input.cc (do_define_character): New function. - (define_character): Call `do_define_character'. - (define_fallback_character): New function. - (init_input_requests): Add `fchar'. - (charinfo::charinfo): Updated. - (charinfo::set_macro): New argument to set `fallback' flag. - * src/roff/troff/node.cc (make_glyph_node, make_node, - node::add_char): Check `fallback' flag. - * NEWS, man/groff_diff.man, man/groff_man: Updated. - -2001-12-16 Werner LEMBERG - - * groff.texinfo: Document exact search algorithm for glyphs. - -2001-12-15 Werner LEMBERG - - * Makefile.cpg, Makefile.ccpg, Makefile.man: Add dummy file to - the left side of $(MANPAGES) rule to make it always non-empty. - -2001-12-14 Werner LEMBERG - - * src/roff/troff/input.cc (default_black): Define default color - `black' if not yet defined. - -2001-12-13 Werner LEMBERG - - Implement new string-valued register `.fn' to return the current - real (internal) font name. - - * env.cc (environment::get_font_name_string): New function. - (init_env_requests): Add `.fn' register. - * env.h (environment): Updated. - * node.cc (font_info): Make `get_font_name' a friend. - (get_font_name): New function. - * node.h: Updated. - - * man/groff_diff.man, man/groff.man, NEWS: Updated. - -2001-12-12 Ralph Corderoy - - * src/preproc/eqn/main.cc (inline_equation): Fix typos. - -2001-12-12 Werner LEMBERG - - * tmac/groff_man.man, doc/groff.texinfo: There is no .R macro. - -2001-12-10 Gaius Mulley - - * man/groff_diff.man: Adding documentation for \O. - -2001-12-10 Werner LEMBERG - - * src/preproc/html/pre-html.cc (TROFF_COMMAND): Removed. - (scanArguments): Use PROG_PREFIX for the name of the troff binary. - -2001-12-09 Werner LEMBERG - - * man/roff.man: Revised. - * src/roff/groff/groff.man: Replace man page references with a - pointer to roff.man. - -2001-12-09 Bernd Warken - - * man/roff.man: Completely rewritten. - -2001-12-06 Ralph Corderoy - - * src/preproc/eqn/main.cc (inline_equation): Improve error message. - -2001-12-05 Werner LEMBERG - - * src/roff/troff/input.cc (get_delim_file_name): Removed since no - longer used. - * src/devices/grohtml/post-html.cc (html_printer::html_printer): Fix - order of initializers. - * NEWS: Updated. - -2001-12-05 Gaius Mulley - - * doc/groff.texinfo: Fix documentation of \O. - - * src/devices/grohtml/html-text.cc (html_text::do_indent, - html_text::do_table, html_text::do_emittext, html_text::do_para): - Use `const' for first argument. - (html_text::do_table): Use cast. - * src/devices/grohtml/html-text.h: Updated. - * src/devices/grohtml/output.cc (simple_output::put_string): Add - method for `const string &s'. - * src/devices/grohtml/html.h: Updated. - * src/devices/grohtml/post-html.cc (MAX_STRING_LENGTH): Removed. - (ANCHOR_TEMPLATE): Modified. - (manufacture_headings): New global variable to handle `-h' option. - (is_subsection): Removed. - (char_buffer::add_string): Add `const' to first argument. - Protect against invalid string argument. - Add method for `const string &s'. - (text_glob): Completely redesigned. - (page): Use `const' for strings and remove string length variable. - (page::add_html): Removed. - (page::add_end_encode): New member function. - (to_unicode): Moved upwards. - (title_desc, header_desc): Updated. - (header_desc::write_headings): Updated to new ANCHOR_TEMPLATE - definition. - (html_printer::is_bold, html_printer::make_bold): New member - functions. - (html_printer::end_of_line): Updated. - (generate_img_src, html_printer::do_auto_image, - html_printer::do_title, html_printer::write_header, - html_printer::determine_header_level, html_printer::do_heading, - html_printer::do_linelength, html_printer::do_pageoffset, - html_printer::do_indentation, html_printer::do_tempindent, - html_printer::do_indentedparagraph, html_printer::do_break, - html_printer::flush_sbuf, get_html_translation, - html_printer::begin_page, html_printer::special): Rewritten to get - rid of static string length limit. - (html_printer::troff_tag): Added `.no-auto-rule'. - (html_printer::flush_globs): Small fix. - (html_printer::determine_space): Don't compute `space_width'. - (html_printer::translate_to_html): Renamed to ... - (html_printer::emit_html): This (with updates). - (html_printer::write_header): Implement `-h' option. - (html_printer::draw): Remove commented-out code. Handle `F' - command. - (html_printer::add_char_to_sbuf): Removed. - (html_printer::add_to_sbuf): Rewritten. - (html_printer::sbuf_continuation): Fixed. - (html_printer::seen_backwards_escape, reverse, - html_printer::remove_last_char_from_sbuf): Removed. - (char_translate_to_html, str_translate_to_html): Removed. - (html_printer::overstrike): New function member. - (html_printer::set_char): Use it. - (html_printer::do_body): New function member. - (html_printer::~html_printer): Use it. - (main): Handle `-h' option. - (usage): Updated. - * src/devices/grohtml/grohtml.man: Document -h switch. - - * src/preproc/html/pre-html.cc: Include searchpath.h - Replace `POSTSCRIPTRES' macro with `postscriptRes' variable. - (get_resolution): New function. - (checkImageDir): Use `0777' permissions in mkdir() - (write_start_image): Rewritten to use `\O[5...]'. - (createImage, generateImages): Updated. - (main): Handle `F' and `h' options. - Use `get_resolution'. - - * src/roff/troff/input.cc (begin, end, image): Removed. - (do_suppress): Take parameter. - Handle modified syntax of `\O'. - (token::next): Updated. - (init_markup_requests): Removed. - (main): Updated. - - * src/roff/troff/div.h: Add declaration for begin_page(). - - * tmac/color-html.tmac: Removed. Contents moved to... - * tmac/html.tmac: Here. Set background color. - * tmac/color.tmac: Removed. Contents moved to... - * tmac/ps.tmac: Here. - * tmac/www.tmac: Remove the title command when generating images - for html. - (NO_AUTO_RULE): New macro. - (HTML_DO_IMAGE): Use revised `\O' escapes. - * tmac/Makefile.sub, tmac/groff_www.man, tmac/troffrc: Updated. - -2001-12-02 Werner LEMBERG - - * tmac/groff_mdoc.man: Fix typo. - -2001-12-01 Colin Watson - - * man/roff.man: Fix typo. - -2001-11-29 Werner LEMBERG - - * src/libs/libbib/map.c, src/utils/pfbtops/pfbtops.c: Include - stdlib.h. - - * src/roff/troff/input.cc (read_draw_node): Emit error message if - more than one argument to \D'f ...'. - - * tmac/Makefile.sub (NORMALFILES): Add lbp.tmac. - -2001-11-28 Werner LEMBERG - - * tmac/an-old.tmac, tmac/doc.tmac: Assure that the macro package is - loaded only once. - - * tmac/groff_man.man: Minor cosmetic fix. - -2001-11-27 Werner LEMBERG - - * src/roff/groff/groff.man, tmac/groff_tmac.man, - tmac/groff_www.man: s/mwww/www/. - -2001-11-26 Werner LEMBERG - - * aclocal.m4 (GROFF_MKSTEMP): Implement test using C++ linkage. - * configure: Regenerated. - * win32-diffs: Updated. - - * tmac/groff_mwww.tmac: Renamed to ... - * tmac/groff_www.tmac: This. - * tmac/mwww.tmac: Removed. - * NEWS, tmac/Makefile.sub: Updated. - -2001-11-21 Werner LEMBERG - - * doc/groff.texinfo: Improve documentation of the `\v' escape. - Fix explanation of `\D' and `rt'. - -2001-11-20 Werner LEMBERG - - * tmac/an-old.tmac (an-header): Set header length equal to page - width. - * doc/groff.texinfo: Improve documentation of `ne' request. Other - minor fixes. - * NEWS: Small fix. - -2001-11-19 Werner LEMBERG - - * NEWS, man/Makefile.sub: Updated. - -2001-11-19 Bernd Warken - - * man/ditroff.man: New file. - -2001-11-17 Werner LEMBERG - - * man/groff_differences.man: Renamed to ... - * man/groff_diff.man: This. Updated. - * man/Makefile.sub, src/roff/troff/troff.man, NEWS: Updated. - - * src/preproc/html/pushbackbuffer.cc: Renamed to ... - * src/preproc/html/pushback.cc: This. Updated. - * src/preproc/html/pushbackbuffer.h: Renamed to ... - * src/preproc/html/pushback.h: This. - * src/preproc/html/Makefile.sub, src/preproc/html/pre-html.cc: - Updated. - - * src/libs/libgroff/htmlindicate.cc: Renamed to ... - * src/libs/libgroff/htmlhint.cc: This. - * src/libs/libgroff/Makefile.sub: Updated. - - * tmac/an-old.tmac (an-end): Fix page length. - -2001-11-16 Werner LEMBERG - - * NEWS, man/groff_differences.man, doc/groff.texinfo: Updated. - * man/Makefile.sub: Include groff_differences.man. - * VERSION: Set to 1.18. - * REVISION: Set to 0. - -2001-11-16 Bernd Warken - - * src/roff/troff/input.cc (do_define_macro): Allow whitespace before - the second dot (or ending macro name) to end a macro. - * doc/groff.texinfo: Doc fix. - -2001-11-16 Ruslan Ermilov - - * tmac/doc-common (doc-header): Handle very long document titles - better. - -2001-11-16 Werner LEMBERG - - * tmac/doc.tmac (doc-do-Bl-args): Fix .substring requests. - -2001-11-15 Werner LEMBERG - - * src/roff/troff/troff.man: Revised and split into troff.man and... - * man/groff_differences.man: New file. - * NEWS: Updated. - -2001-11-13 Werner LEMBERG - - * tmac/an-old.tmac (TS, TE): New macros for table support. - -2001-11-12 Werner LEMBERG - - * src/include/lib.h: Provide a fix for emx to not include - groff-getopt.h. - -2001-10-27 Werner LEMBERG - - * src/roff/troff/input.cc (substring_macro): Fix computation of - boundary values. - -2001-10-20 Werner LEMBERG - - Undo change from 2001-08-28. - - * src/roff/troff/input.cc (have_input): New global variable. - (token::next): Set `have_input' for \f, \H, \R, \s, and \S if not - in compatibility mode. - (process_input_stack): Use it. - -2001-10-19 Ruslan Ermilov - - * tmac/doc.tmac (doc-flag-recursion): Protect arguments against - being handled as end-of-sentence characters, - -2001-10-10 Gaius Mulley - - * src/roff/troff/input.cc (file_iterator): New members - `suppress_newline_flag' and `seen_escape'. - (file_iterator::next_file): Updated. - (file_iterator::fill): Use it. - (string_iterator): New member `suppress_newline_flag'. - (string_iterator::fill): Set it. - (get_color_element): Use MAX_COLOR_VAL. - * src/roff/troff/env.cc (environment): Remove `need_eol'. - (no_fill): Don't set `env->ignore_next_eol'. - (environment::newline): Handle `eol' tag properly. - Emit `eol.ce'. - (environment::add_html_tag): Set `env->ignore_next_eol'. - Don't handle `.ce'. - * src/roff/troff/env.h (environment): Updated. - - * src/devices/grohtml/post-html.cc (text_glob::is_eol_ce): New - member function. - (html_printer::outstanding_eol): New member function. - (html_printer::do_title): Use new functions. - (html_printer::troff_tag): Test `id_eol_ce'. - -2001-10-10 Werner LEMBERG - - * tmac/color.tmac, tmac/color-html.tmac: Use `.do' to make those - files work with -C also. - -2001-10-05 Werner LEMBERG - - * doc/pic.ms: Minor fix. - * src/preproc/html/pre-html.cc (scanArguments): Don't handle `-?' - as a valid command line switch. - * src/devices/grohtml/post-html.cc (main): Ditto. - (usage): Updated. - * src/devices/grohtml/grohtml.man: Updated. - * src/roff/groff/groff.cc (main): Pass `-v' to predriver also. - -2001-10-04 Werner LEMBERG - - Implementing color support in troff, pic, grops, and grohtml. These - changes are based on a major patch provided by Gaius Mulley - . - - New request: `defcolor', supporting rgb, cmy, cmyk, and gray - definitions with both hex values and fractions. - - New escapes: \m and \M for drawing and background color, - respectively. This corresponds to the troff output commands `m' - and `DF'. - - groff and troff accept command line switch `-c' to disable color - output (which is automatically disabled in compatibility mode). - - New scaling indicator `f' for fractions (1f = 65536u). - - New conditional operator `m' to test for defined colors with `if' - and `ie'. - - New keywords `color' (or `colour', `colored', `coloured'), `outline' - (or `outlined'), and `shaded' added to pic. - - * src/include/color.h: New file. - * src/include/driver.h: Include it. - * src/include/printer.h: Include color.h. - (environment): New members `col' and `fill'. - (printer): Remove `adjust_arc_center' member function. - * src/include/Makefile.sub: Updated. - - * src/libs/libdriver/input.cc (do_file): Initialize `env.col' and - `env.fill'. - Handle `m' and `DF' troff commands. - * src/libs/libgroff/color.cc: New file. - * src/libs/libgroff/Makefile.sub: Updated. - - * src/preproc/html/pre-html.cc (IMAGE_BORDER_PIXELS): Set to 2. - (stop): Removed. - (createImage): Fix computation of `y2'. - Use `pnmcrop' also. - (buffer::write_file_html): Remove calls to `stop'. - - * src/preproc/pic/common.h (common_output): New abstract function - members `set_color', `reset_color', `get_last_filled', and - `get_outline_color'. - * src/preproc/pic/object.h: Add `IS_SHADED' and `IS_OUTLINED'. - (object_spec): Add members `shaded' and `outlined'. - * src/preproc/pic/output.h (output): `command' is now abstract. - New function members `set_color', `reset_color', `get_last_filled', - and `get_outline_color'. - * src/preproc/pic/lex.cc (lookup_keyword): Recognize `colo[u]r[ed]', - `outline[d]', and `shaded'. - * src/preproc/pic/object.cc (output::command): Removed. - (output::set_location): Moved to output.h. - (graphic_object): Add protected members `outline_color' and - `color_fill'. - Add member functions `set_outline_color', `get_outline_color', and - `set_fill_color'. - (closed_object): Add member function `set_fill_color'. - Add member `color_fill'. - (graphic_object::print_text): Use `out->set_color' and - `out->reset_color'. - (box_object::print, ellipse_object::print, circle_object::print, - line_object::print, spline_object::print, arc_object::print): Ditto. - (object_spec::make_object): Implement `IS_OUTLINED' and `IS_SHADED'. - * src/preproc/pic/pic.y: Add tokens `COLORED', `OUTLINED', and - `SHADED', making them `%left'. - Add rules `object_spec [SHADED|COLORED|OUTLINED] text'. - * src/preproc/pic/tex.cc (tex_output): New dummy function members - `set_color', `reset_color', `get_last_filled', and - `get_outline_color'. - * src/preproc/pic/troff.cc (simple_output): New abstract function - members `set_color', `reset_color', and `get_last_filled'. - (simple_output::polygon, simple_output::circle, - simple_output::ellipse): Use `get_last_filled'. - (troff_output): New members `last_filled' and `last_outlined'. - New function members `set_color', `reset_color', `get_last_filled', - and `get_outline_color'. - (troff_output::finish_picture): Use `reset_color'. - (troff_output::set_fill): Test `last_filled'. - * src/preproc/pic/pic.man: Updated. - - * src/roff/groff/groff.cc (main): Implement `-c' option. - (synopsis, help): Updated. - src/roff/groff/groff.man: Updated. - - * src/roff/troff/troff.h: Include color.h. - (warning_type): Add WARN_COLOR. - * src/roff/troff/env.h (environment): New members - `{cur,prev}_{glyph,fill}_color'. - New member functions `get_{prev_,}{glyph,fill}_color'. - * src/roff/troff/env.cc: Initialize and implement them. - * src/roff/troff/input.cc: New global variable `disable_color_flag'. - Replace `NULL' with `0' everywhere for consistency. - (lookup_color, default_black, do_glyph_color, do_fill_color, - get_color_element, read_rgb, read_cmy, read_cmyk, read_gray, - define_color): New functions. - (token::next): Implement \M and \m escapes. - (do_if_request): Implement `m' operator. - (usage): Updated. - (main): Implement `-c' option. - (init_markup_requests): Add `defcolor' request. - (warning_table): Add `color' warning. - * src/roff/troff/node.h (glyph_color_node, fill_color_node): New - classes. - * src/roff/troff/node.cc (troff_output_file): New members - `current_{page,glyph}color'. New member functions `put_hex', - `glyph_color', and `fill_color'. - (glyph_color_node::*, fill_color_node::*): Implement it. - * src/roff/troff/number.cc (SCALE_INDICATOR_CHARS): Add `f'. - (parse_term): Add support for `f'. - * src/roff/troff/troff.man: Updated. - - * src/devices/grodvi/dvi.cc (draw_dvi_printer::draw): Add dummy - entry for `F'. - * src/devices/grolbp/lbp.cc (lbp_printer::draw): Ditto. - * src/devices/grolj4/lj4.cc (lj4_printer::draw): Ditto. - - * src/devices/grohtml/html-text.h (HTML_TAG): Add COLOR_TAG. - (tag_definition): Use `void *' for arg1. - (html_text): New member functions `do_color' and `done_color'. - Use `void *' for second parameter of `push_para' member function. - New `push_para' member function with a single parameter. - Use `char *' for parameter of `issue_table_begin' member funtion. - New `issue_color_begin' member function. - * src/devices/grohtml/html-text.cc (html_text::end_tag): Handle - COLOR_TAG. - (html_text::issue_color_begin): New function. - (html_text::issue_table_begin): Use `char *' for parameter. - (html_text::start_tag, html_text::shutdown, - html_text::check_emit_text): Updated. - (html_text::push_para): Use `void *' for second parameter. - Add same function with only one parameter. - (html_text::do_*): Updated. - (html_text::do_color, html_text::done_color): New functions. - * src/devices/grohtml/post-html.cc (style): New member `col'. - Mew member `style' with 6 parameters. - (style::style, style::operator==): Updated. - (html_printer::do_font): Use it. - (html_printer::draw): Add dummy entry for `F'. - (html_printer::set_char): Updated. - * src/devices/grohtml/grohtml.man: Updated. - - * src/devices/grops/ps.cc (ps_output::put_float): Use `%g' to have - trailing zeroes removed. - (ps_printer): New members `sbuf_color', `fill_color', and - `output_color'. - Removed member `fill'. - New member function `set_color'. - (ps_printer::ps_printer, ps_printer::set_char): Updated. - (ps_printer::flush_sbuf, ps_printer::set_line_thickness, - ps_printer::fill_path, ps_printer::draw): Use `set_color'. - - * tmac/color-html.tmac, tmac/color.tmac: New files. - * tmac/troffrc: Include them. - * tmac/www.tmac (URL, FTP, MAILTO): Use blue color. - * tmac/Makefile.sub: Updated. - - * NEWS, doc/groff.texinfo, doc/pic.ms, man/groff_out.man, - man/groff.man: Updated. - * font/devps/prologue.ps: Define FC and CO functions. - -2001-10-04 Gaius Mulley - - Fix incorrect cropping of images and incorrect handling of special - characters. Fix handling of file names in \O. - - * src/include/geometry.h: New file. - * src/libs/libgroff/geometry.cc: New file. - * src/libs/libdriver/printer.cc (printer::adjust_arc_center): Moved - to `geometry.cc'. - * src/roff/troff/input.cc (get_delim_file_name): Fixed problem with - initial spaces. - (do_suppress): Updated. - * src/roff/troff/node.cc: Include geometry.h. - (troff_output_file::flush_tbuf): Fixed parameters to - `check_output_limits'. - (troff_output_file::check_charinfo): Ditto. - (troff_output_file::determine_line_limits): Add support for `Da' - and `Dl' commands. - - * src/devices/grohtml/post-html.cc (str_translate_to_html): - Add new parameter `is_special' to decode special characters from - escape sequences. - (html_printer::do_title, html_printer::do_heading, - html_printer::do_indentedparagraph, - html_printer::translate_to_html, html_printer::special): Updated. - -2001-10-03 Werner LEMBERG - - * Makefile.sub (DISTCLEANFILES): Add stamp-h. - Fix entry for config.h. - * test-groff (GROFF_BIN_PATH): Add $builddir/roff/groff. - * tmac/troffrc: Translate nonbreakable space character to `\~'. - * src/preproc/eqn/eqn.man: Document -d command line option. - -2001-09-27 Werner LEMBERG - - * man/groff.man: Use - - .ev xxx - .na - .nh - - .ev - - instead of the old code (`.ad .hy' after the table) to suppress - incorrect hyphenation for grohtml output. - -2001-09-22 Werner LEMBERG - - * man/groff_font.man, man/groff_out.man: Minor fixes. - -2001-09-20 Werner LEMBERG - - * PROBLEMS: Updated, reordered. Improved EPS section (thanks to - Arnold Robbins ). - -2001-09-09 Werner LEMBERG - - * configure: Regenerated with autoconf 2.52. - - * doc/groff.texinfo: Complete revision of indices. - -2001-09-07 Werner LEMBERG - - * doc/Makefile (clean): Updated to delete all indices. - -2001-09-05 Werner LEMBERG - - * src/roff/troff/troff.man: Remove superfluous line. - - * tmac/s.tmac: Enable all warnings only if no -W or -w option is - given on the command line (or rather, if only the default warnings - are set). - -2001-09-03 Werner LEMBERG - - * man/groff.man, src/preproc/eqn/eqn.man, tmac/groff_mdoc.man: Don't - use .ne for TTY devices. - -2001-08-31 Werner LEMBERG - - * src/roff/troff/token.h, src/roff/troff/input.cc: - s/TOKEN_TRANSPARENT_ESCAPE/TOKEN_OPAQUE_ESCAPE/. - -2001-08-28 Werner LEMBERG - - * src/roff/troff/token.h (token_type): Add TOKEN_TRANSPARENT_ESCAPE. - * src/roff/troff/input.cc (token::next): Return - TOKEN_TRANSPARENT_ESCAPE for \f, \H, \R, \s, and \S if not in - compatibility mode. - (token::description): Updated. - (process_input_stack): Reset `bol' for TOKEN_TRANSPARENT_ESCAPE. - (token::add_to_node_list, token::process): Ignore - TOKEN_TRANSPARENT_ESCAPE. - -2001-08-27 Werner LEMBERG - - * tmac/an-old.tmac: Fix `S' string. - -2001-08-26 Werner LEMBERG - - * src/roff/troff/troff.man: Don't use .ne for TTY devices. - -2001-08-25 Werner LEMBERG - - * doc/pic.ms: Replace `\\' with `\e' (and fixing some single - backslashes). - Many other minor fixes. - - * configure.ac: Add message at end to inform how to compile - xditview. - * configure: Regenerated. - -2001-08-24 Werner LEMBERG - - * src/include/getopt.h, src/libs/libgroff/{getopt.c, getopt1.c}: - Updated to latest version of libc. - -2001-08-23 Werner LEMBERG - - * configure.ac: Don't create subdirectories before AC_CONFIG_FILES. - Autoconf 2.50 and newer can handle this. - * configure: Regenerated. - -2001-08-21 Werner LEMBERG - - * doc/pic.ms: Fix typo. - * src/preproc/tbl/tbl.man: Document case of global options. - -2001-08-21 Gaius Mulley - - * src/devices/grohtml/post-html.cc (html_printer::end_font): Fix - handling of `CR' font. - -2001-08-20 Werner LEMBERG - - Use a config.h file. - - * src/include/lib.h: Include config.h. - * All C files: Ditto (if necessary). - * All C++ source and header files: Include lib.h first (if - necessary). - - * src/include/config.hin: New file (autogenerated by autoheader). - * stamp-h.in: New file. - * configure.ac: Updated. - * aclocal.m4: Add third parameters to AC_DEFINE macros. - (GROFF_ARRAY_DELETE): Simplified. - * Makefile.sub (DISTCLEANFILES): Updated. - Added targets for remaking config.status, config.hin, config.h, - stamp-h.in, and stamp-h. - * configure: Regenerated. - -2001-08-19 Werner LEMBERG - - * NEWS: Updated. - -2001-08-18 Sebastian Krahmer - - * src/preproc/pic/pic.y (format_number): Use do_sprintf(). - (do_sprintf): Use snprintf(). - -2001-08-18 Werner LEMBERG - - * src/libs/snprintf/*: Added an snprintf module written by Mark - Martinec. - * src/libs/libgroff/Makefile.sub: Updated. - * configure.ac: Add test for snprintf(). - * Makefile.in: Updated. - * configure: Regenerated. - - * src/preproc/html/pre-html.cc (make_message): Reactivate code which - uses snprintf(). - -2001-08-14 Ruslan Ermilov - - * tmac/doc.tmac (Ex): New implementation. - * tmac/doc-common, tmac/groff_tmac.man: Updated. - -2001-08-13 Ruslan Ermilov - - * tmac/doc.tmac (Rv): Implement support for 0 or more than 1 - argument. - * tmac/groff_tmac.man: Updated. - -2001-08-13 Werner LEMBERG - - * src/preproc/tbl/tbl.man: Minor documentation update. - -2001-08-13 John David Anglin - - * src/libs/libgroff/tmpname.cc: Add prototype for gettimeofday(). - * configure.ac: Add declaration test for gettimeofday(). - * Makefile.in: Document NEED_DECLARATION_GETTIMEOFDAY defines. - * aclocal.m4: Include sys/time.h for gettimeofday declaration test. - * configure: Regenerated. - -2001-08-11 Werner LEMBERG - - * aclocal.m4 (GROFF_MKSTEMP): Define HAVE_MKSTEMP. - * configure.ac: Add declaration test for strcasecmp(). - * Makefile.in: Updated. - * configure: Regenerated. - * src/include/lib.h [!HAVE_MKSTEMP]: Add prototype for mkstemp() -- - this is necessary because groff's mkstemp.cc is C++. - Add declaration conditionally for strcasecmp(). - -2001-08-10 Werner LEMBERG - - Integrated pic2graph, contributed by Eric S. Raymond. - - * contrib/pic2graph/{Makefile.sub, pic2graph.sh, pic2graph.man}: New - files. - * Makefile.in, NEWS: Updated. - - * src/preproc/tbl/tbl.man: Revised. - -2001-08-09 Eric S. Raymond - - * src/preproc/tbl/tbl.man: Extended to cover all tbl features. - -2001-08-09 Werner LEMBERG - - * src/preproc/tbl/main.cc (process_data): Fix recognition of .lf - requests. - -2001-08-08 Paul Eggert - - * Makefile.sub (configure): Depend on configure.ac, not - configure.in. - * INSTALL.gen: Upgrade to autoconf 2.52's INSTALL. - -2001-08-07 Werner LEMBERG - - * src/utils/afmtodit/afmtodit.man, src/roff/groff/groff.man: Minor - fixes. - -2001-08-06 Werner LEMBERG - - * src/roff/troff/troff.man: Improve documentation of -E option. - -2001-07-28 Ralph Corderoy - - * src/preproc/html/pushbackbuffer.cc (pushBackBuffer::readNumber): - Simplified. - -2001-07-27 Werner LEMBERG - - * src/preproc/refer/refer.cc: Undo last change. - * src/devices/grohtml/post-html.cc: Ditto. - -2001-07-26 Werner LEMBERG - - * src/preproc/refer/refer.cc: Include `lib.h'. - * src/devices/grohtml/post-html.cc: Ditto. - -2001-07-25 Gaius Mulley - - * aclocal.m4 (GROFF_PAGE): Add `AC_DEFINE(PAGEA4)'. - * src/preproc/html/pre-html.cc: Use it for DEFAULT_VERTICAL_OFFSET. - * Makefile.in: Comment updated. - * configure: Regenerated. - -2001-07-25 Werner LEMBERG - - * src/preproc/pic/pic.cc: Removed. - * src/preproc/pic/pic_tab.h: Removed. - * src/preproc/refer/label.cc: Removed. - - * doc/Makefile (.ms.html): Don't use a file name extension in - argument to grohtml's -I option. - * Makefile.in (dist): Remove CVS directories. - Call `distfiles' target. - - * src/devices/grohtml/grohtml.man: Add information about valid - versions of pnmtopng. - * src/preproc/html/pre-html.cc (TRANSPARENT): Use `white' as colour - name instead of number. - -2001-07-24 Werner LEMBERG - - * doc/groff.texinfo: Minor fixes. - -2001-07-21 Gaius Mulley - - * doc/Makefile (.ms.html): Put image files into a subdirectory. - (clean): Updated. - -2001-07-20 Werner LEMBERG - - * src/libs/libgroff/tmpname.cc: New file, defining get_tempname(). - * src/libs/libgroff/mkstemp.cc: New file. - * src/libs/libgroff/mksdir.cc: New file. - * src/libs/libgroff/tmpfile.cc [HAVE_MKSTEMP_PROTO]: Removed. - (xtmpfile) [!HAVE_MKSTEMP]: Removed. - * src/libs/libgroff/Makefile.sub: Updated. - * src/include/lib.h: Add mksdir() prototype. - * src/include/posix.h: Define S_IXUSR if not yet defined. - - * src/preproc/html/pre-html.cc (MAX_RETRIES): Removed. - (createAllPages): Use mksdir() instead of current code. - * src/utils/indxbib/indxbib.cc [HAVE_MKSTEMP_PROTO]: Removed. - (main): [!HAVE_MKSTEMP]: Removed. - - * aclocal.m4 (GROFF_MKSTEMP): Updated to use new mkstemp.cc file. - (GROFF_INTTYPES_H, GROFF_UNSIGNED_LONG_LONG, GROFF_UINTMAX_T): New - macros. - * configure.ac: Add tests for stdint.h, sys/time.h, and - gettimeofday(). - Call new GROFF_xxx macros. - * configure: Regenerated. - * Makefile.in: Comments updated. - -2001-07-20 Gaius Mulley - - * src/preproc/html/pre-html.cc (scanArguments): Use getopt_long() - instead of current code. - * src/devices/grohtml/post-html.cc (main): Handle `-d' option. - * src/roff/groff/groff.cc (possible_command::insert_args): New - function. - (main): Use it for predriver handling instead of insert_arg(). - -2001-07-19 Werner LEMBERG - - * doc/Makefile: Added GROFF_BIN_PATH to make it work with uninstalled - groff also. - - * src/include/posix.h: Define S_IWUSR if not yet defined. - -2001-07-18 Werner LEMBERG - - * NEWS: Updated. - -2001-07-18 Ruslan Ermilov - - * tmac/groff_mdoc.man: Document new -width and -column syntax. - Some other minor fixes. - * tmac/an-old.tmac: Add `AT' and `UC' macros. - -2001-07-17 Gaius Mulley - - Replace call to `troff' with `groff -Z' to make it aware of - GROFF_BIN_PATH. - - * src/preproc/html/pre-html.cc (TROFF_COMMAND): New macro. - (troff_command, command_prefix): Removed. - (alterDeviceTo): Use groff. - (addZ): New function. - (char_buffer::do_html): Use it. - (scanArguments): Use TROFF_COMMAND. - (findPrefix): Removed. - (main): Updated. - * src/roff/groff/groff.cc (main): Handle zflag for preprocessors. - -2001-07-17 Eric S. Raymond - - * doc/pic.ms: Documentation fixes. - -2001-07-17 Werner LEMBERG - - Replace atexit() with global destructor. - - * src/libs/libgroff/tmpfile.cc (xtmpfile_list): Add constructor. - (xtmpfile_list_init): New global structure to deallocate - xtmpfile_list on exit. Its destructor inherits most code from - remove_tmp_files(). - (remove_tmp_files): Deleted. - (add_tmp_file): Simplified. - -2001-07-16 Werner LEMBERG - - Replace strdup() with strsave(). - - * src/devices/grolbp/lbp.cc [!HAVE_STRDUP]: Removed. - (set_papersize): Use strsave() and a_delete. - (main): Use strsave(). - * src/preproc/html/pre-html.cc (make_message, createAllPages, - removeAllPages): Use strsave() and a_delete. - - * configure.ac: Remove test for strdup. - * Makefile.in: Comment updated. - * configure: Regenerated. - -2001-07-15 Werner LEMBERG - - * win32-diffs: Updated. - -2001-07-14 Werner LEMBERG - - * src/preproc/html/pre-html.cc (makeTempFiles): Activate new code, - removing the old one. - * src/utils/indxbib/indxbib.cc (main): Remove compiler warning. - -2001-07-14 Ralph Corderoy - - * src/libs/libgroff/tmpfile.cc (xtmpfile): Fix guard for `namep'. - -2001-07-12 Ruslan Ermilov - - Merge -xwidth into -width. Add -xwidth functionality to -column - also. - - * tmac/doc.tmac (Bl): Add dummy doc-typeXXX and doc-spaceXXX to - avoid warning. - (doc-do-Bl-args): Merge -xwidth code with -width. Test whether - string immediately following a leading dot starts with a valid mdoc - argument. - Add similar code to the -column branch. - (doc-Bl-usage): Updated. - * groff_mdoc.man: s/-xwidth/-width/. - -2001-07-12 Gaius Mulley - - * src/devices/grohtml/post-html.cc (text_glob::is_br): Stop titles - running into centered or non-formatted text. - -2001-07-11 Werner LEMBERG - - Introduce short and long prefixes to have the selection at run-time - whether there is a 8+3 limit for names of temporary files. - - * src/libs/libgroff/tmpfile.cc (TMPFILE_PREFIX): Replaced with... - (TMPFILE_PREFIX_SHORT, TMPFILE_PREFIX_LONG): This. - (tmpfile_prefix, tmpfile_prefix_len, use_short_prefix): New - variables. - (temp_init): New global structure to initialize above three - variables. - (xtmptemplate): Use two parameters for long and short prefix. - Simplify code use above three variables. - (xtmpfile): Use long and short prefixes as parameters. - * src/include/lib.h: Updated. - - * src/preproc/html/pre-html.cc ({PAGE,PS,REGION}_TEMPLATE): Replace - with ... - ({PAGE,PS,REGION}_TEMPLATE_{SHORT,LONG}): This. - (createAllPages, makeTempFiles): Updated. - -2001-07-09 Werner LEMBERG - - * REVISION: Increased to 3. - -Version 1.17.2 released -======================= - -2001-07-07 Werner LEMBERG - - * src/utils/indxbib/indxbib.cc (main): Change type of `name_max' - to size_t. - -2001-07-06 Ruslan Ermilov - - * tmac/doc.tmac (Rv): Make `Rv' really not parseable. - Fix synopsis. - * tmac/groff_mdoc.man: Fix synopsis. - -2001-07-05 Ruslan Ermilov - - * tmac/doc.tmac (doc-inset-list, doc-hang-list, doc-ohang-list): - Restore `doc-Pa-font'. - -2001-07-04 Werner LEMBERG - - * src/utils/indxbib/dirnamemax.c: Moved to ... - * src/libs/libgroff/maxfilename.cc: Here. - s/dir_name_max/file_name_max/. - Add copyright. - * src/include/lib.h: Add file_name_max. - * src/utils/indxbib/indxbib.cc: Updated. - * src/utils/indxbib/Makefile.sub, src/libs/libgroff/Makefile.sub: - Updated. - - * src/libs/libgroff/tmpfile.cc (TMPFILE_PREFIX) [__MSDOS__]: Define - as empty. - (xtmpfile) [_MSC_VER]: Removed -- MSVC has mktemp(). - - * src/preproc/html/pre-html.cc (PAGE_TEMPLATE, PS_TEMPLATE, - REGION_TEMPLATE): New macros. - (createAllPages, makeTempFiles): Use them. - Include `nonposix.h'. - (html_system): New function. - (createAllPages, createImage): Use it. - Use EXE_EXT. - - * tmac/www.tmac: Fix typos. - -2001-07-03 Werner LEMBERG - - * tmac/www.tmac: Disable hyphenation in normal text only if output - device is html. - (URL, FTP, MAILTO): Disable hyphenation of actual URL with `\%'. - * tmac/groff_mwww.man, NEWS: Updated. - -2001-07-03 Gaius Mulley - - * tmac/www.tmac (.IMAGE): Add fourth parameter to specify vertical - image location. - -2001-07-02 Ruslan Ermilov - - * tmac/doc-common, tmac/doc.tmac (doc-display-ft-stack, - doc-display-ps-stack): Implement font and font size stack for - displays. - -2001-07-02 Werner LEMBERG - - * REVISION: Increased to 2. - * src/roff/troff/input.cc (read_size): Fix special case `\s[0]'. - - * src/groff/grog/grog.pl (process): Handle `Oo' and `Oc' not at the - beginning of a line. - * src/groff/grog/grog.sh: Ditto. - -2001-06-29 Peter Marquardt - - * src/preproc/eqn/neqn.sh: Put `export' keyword in a new line to - make it portable. - -2001-06-27 Werner LEMBERG - - Fix problems with preprocessor string for `man' program. - - * *.man: Don't use `s' in preprocessor string -- it doesn't exist. - Updated/added copyright. - Moved Emacs's local variable to identify nroff mode to the end of - the file; add local variable if missing. - -2001-06-26 Andras Salamon - - * aclocal.m4: Replace AC_LANG_SAVE + AC_LANG_CPLUSPLUS with - AC_LANG_PUSH(C++) and AC_LANG_RESTORE with AC_LANG_POP(C++). - * configure: Regenerated. - -2001-06-25 Andras Salamon - - * aclocal.m4 (GROFF_PAGE): Fix page detection code. - * configure: Regenerated. - -2001-06-24 Werner LEMBERG - - * doc/homepage.ms: Don't include arkup.tmac (which no longer exists) - but www.tmac. - * doc/pic.ms: Fix typos. - -Version 1.17.1 released -======================= - -2001-06-21 Golubev I. N. - - * aclocal.m4 (GROFF_NEED_DECLARATION): Fix inclusion of strings.h. - * configure: Updated. - -2001-06-20 Gaius Mulley - - * src/roff/preproc/html/pre-html.cc (make_message): Fix incorrect - image names. - * src/roff/troff/dic.cc (blank_line): Add html tag. - -2001-06-19 Gaius Mulley - - * src/roff/troff/input.cc (do_suppress): Fix typo. - -2001-06-18 Gaius Mulley - - Added two new options (-D and -I) to specify image names and a - subdirectory to place the images in. - - Change syntax from \\Ox to \\O[x]. - - * src/devices/grohtml/post-html.cc (main): Add options. - (usage): Updated. - * src/preproc/html/pre-html.cc: Include `stdarg.h'. - Use `NULL' instead of `0' for null string pointers. - (MAX_RETRIES): New macro. - (lengthOfintToStr, intToStr, make_message): New functions. - (makeFileName): Make function static. - Implement -D and -I options. - (checkImageDir): New function. - (write_end_image, write_start_image): Use new syntax of \O. - (createAllPages, removeAllPages): Implement -D and -I options. Use - make_message(). - (createImage): Use make_message(). - (addps4html): Add guard for malloc(). - (usage, scanArguments): Updated. - (makeTempFiles): Use mkstemp(). - (removeTempFiles): Use unlink(). - (findPrefix): Add guard for malloc(). - (main): Updated. - * src/roff/troff/input.cc (get_delim_file_name): New function to - parse \O. - (do_suppress): Updated to parse new syntax. - * src/devices/grohtml/grohtml.man: Updated. - * tmac/www.tmac: Updated to new syntax. - - * NEWS: Updated. - -2001-06-15 Werner LEMBERG - - * src/roff/grog/Makefile.sub: Remove NAMEPREFIX. - - * src/devices/grohtml/grohtml.man: Minor improvements. - -2001-06-14 Werner LEMBERG - - * src/preproc/html/Makefile.sub: Remove NAMEPREFIX. - -2001-06-11 Werner LEMBERG - - * man/roff.man, mann/groff.man: Use '\" instead of .\" in the first - line to specify preprocessor options -- mandb 2.3.1 only recognizes - the former. - * src/preproc/grn/grn.man: Add proper '\" string. - -2001-06-11 OKAZAKI Tetsurou - - * test-groff: Don't use PATH but GROFF_BIN_PATH. - -2001-06-08 Werner LEMBERG - - Updated to autoconf 2.50. - - * configure.in: Renamed to... - * configure.ac: This. - * aclocal.m4 (AC_OUTPUT_MAKE_DEFS): Removed. - (GROFF_OS390): Updated. - * configure: Regenerated. - -2001-05-18 Werner LEMBERG - - * src/roff/troff/env.c, src/roff/troff/env.h, - src/roff/troff/input.cc, src/roff/troff/troff.man: Undo `ss' change - from 2000-12-21. - -2001-05-17 Jeffrey Friedl - - * src/roff/troff/input.cc (read_size): Fix special case `\s0'. - -2001-05-16 Werner LEMBERG - - * src/roff/troff/input.cc (read_size): Emit warning if value becomes - less than or equal zero; set it to 1 then. - * src/roff/troff/node.h (node::node): Initialize `last'. - -2001-05-08 Werner LEMBERG - - * tmac/an-old.tmac: Make predefined strings work in compatibility - mode. - Add troff version guard. - * tmac/doc.tmac: Simplify version guard. - -2001-05-07 Werner LEMBERG - - The .ns and .rs requests are now honoured not only in the top-level - but in all diversions (similar to UNIX troff). - - This change is based on a patch from Tadziu Hoffmann - . - - * src/roff/troff/div.h (diversion): Add `no_space_mode' member. - (top_level_diversion): Remove `no_space_mode' member. - * src/roff/troff/div.cc (diversion::diversion, - top_level_diversion::top_level_diversion): Updated. - (macro_diversion::output): Reset `no_space_mode'. - (no_space, restore_spacing): Use `curdiv' unconditionally. - (space_request, blank_line): Check `curdiv->no_space_mode'. - (no_space_mode_reg::get_value, no_space_mode_reg::get_string): Use - `curdiv' unconditionally. - * NEWS, src/roff/troff/troff.man, man/groff.man, doc/groff.texinfo: - Updated. - -2001-05-06 Werner LEMBERG - - Added two new requests `de1' and `am1' which are similar to `de' and - `am' with the difference that compatibility mode is saved on entry, - switched off during macro execution, and restored on exit. - - * src/roff/troff/input.h: Added two new special characters - (COMPATIBLE_SAVE, COMPATIBLE_RESTORE). - * src/roff/troff/input.cc (input_iterator): Added two member - functions `save_compatible_flag' and `get_compatible_flag'. - (input_stack): Ditto. - (string_iterator): Ditto. Also add private member - `saved_compatible_flag'. - (token::next): Use COMPATIBLE_SAVE and COMPATIBLE_RESTORE. - (calling_mode): New enumeration. - (do_define_macro): Use it. Insert COMPATIBLE_SAVE and - COMPATIBLE_RESTORE at the beginning and end of macro, respectively. - (define_macro, define_indirect_macro, append_macro, ignore): Use - `calling_mode'. - (define_nocomp_macro, append_nocomp_macro): New functions. - (init_input_requests): Updated. - (do_request): Rename local variable `saved_compatible_flag' to - `old_compatible_flag'. - * NEWS, src/roff/troff/troff.man, man/groff.man: Document it. - - * tmac/an-old.tmac: Use `de1' instead of `de' request for all - public and trap-invoked macros. As a consequence, the man macros - work in compatibility mode also. - -2001-05-06 Solar Designer - - * Makefile.in: Use $(mandir). - -2001-05-06 Alexios Zavras - - * src/utils/afmtodit/afmtodit.pl: Fix serious typo. - -2001-05-05 Werner LEMBERG - - Added `.ns' number register: Returns 1 in no-space mode (if in - top-level diversion), 0 otherwise. - - * src/roff/troff/div.cc (no_space_mode_reg): New class. - (init_div_requests): Updated. - * NEWS, src/roff/troff/troff.man, man/groff.man, doc/groff.texinfo: - Document it. - -2001-05-04 Werner LEMBERG - - * src/roff/nroff/nroff.man: Improved documentation (especially - locales). - -2001-05-02 Werner LEMBERG - - Added `brp' request: This is \p as a request. - - * src/roff/troff/env.cc (environment::do_break): Add parameter - `spread'. - (do_break_request): New function (was `break_request'). - (break_request): Calls `do_break_request'. - (break_spread_request): New; calls `do_break_request'. - (init_env_requests): Updated. - * src/roff/troff/env.h: Updated. - * NEWS, src/roff/troff/troff.man, man/groff.man: Document it. - - * REVISION: Increased to 1. - * win32-diffs: Updated. - -2001-05-01 Werner LEMBERG - - * tmac/an-old.tmac: Fix minor compatibility mode issue. - * tmac/troffrc-end: Make it really work in compatibility mode. - -2001-04-27 Werner LEMBERG - - * src/utils/lkbib/lkbib.cc: Switch inclusion order of stdio.h and - stdlib.h. - -2001-04-22 Werner LEMBERG - - * src/libs/libgroff/getopt.c, src/include/getopt.h: Updating to - latest versions from glibc CVS archive. - - * MORE.STUFF: Updated, using a patch from Kees Zeelenberg - . - -2001-04-21 Werner LEMBERG - - * configure.in: Move check for mkstemp() to... - * aclocal.m4 (GROFF_MKSTEMP): This new function. - * configure: Regenerated. - - * src/include/groff-getopt.h: Don't use variable names in - declarations. - - * src/devices/grohtml/html-chars.h: Removed. It isn't used. - * src/devices/grohtml/Makefile.sub, - src/devices/grohtml/post-html.cc: Updated. - -2001-04-21 Albert Chin-A-Young - - * configure.in: Add special check for mkstemp(). - * src/libs/libgroff/tmpfile.cc: Use it. - * src/utils/indxbib/indxbib.cc: Ditto. - * src/utils/pfbtops/pfbtops.c (main): Don't use C++ comment style. - * src/devices/grolbp/lbp.h (lbpprintf, lbpputs, vdmprintf): Use - `const'. - -2001-04-20 Bruce Lilly - - `Version_string' as C++ object was not visible to linker from C - object files. - Add `const' to `Version_string'. - - * src/utils/pfbtops/pfbtops.c (main), src/roff/groff/groff.cc - (main), src/roff/troff/input.cc (main), src/preproc/tbl/main.cc - (main), src/preproc/pic/main.cc (main), src/preproc/eqn/main.cc - (main), src/preproc/grn/main.cc (main), src/preproc/html/pre-html.cc - (scanArguments), src/preproc/refer/refer.cc (main), - src/preproc/soelim/soelim.cc (main), src/devices/grotty/tty.cc - (main), src/devices/grodvi/dvi.cc (main), src/devices/grolj4/lj4.cc - (main), src/devices/grohtml/post-html.cc (main), - src/devices/grolbp/lbp.cc (main), src/utils/tfmtodit/tfmtodit.cc - (main), src/utils/hpftodit/hpftodit.cc (main), - src/utils/lookbib/lookbib.cc (main), src/utils/indxbib/indxbib.cc - (main), src/utils/lkbib/lkbib.cc (main), - src/utils/addftinfo/addftinfo.cc (main): Implement it. - - * src/roff/groff/pipeline.c: Add _UWIN. - * src/include/nonposix.h: Ditto. - -2001-04-20 Werner LEMBERG - - * src/include/lib.h: Use HAVE_STRERROR. - * src/roff/groff/pipeline.c: Ditto. - * src/preproc/html/pre-html.cc: Remove declaration of `strerror'. - * src/libs/libgroff/Makefile.sub (version.cc): Add `extern "C"'. - * src/utils/pfbtops/pfbtops.c: Add copyright notice. - * win32-diffs: Updated. - * src/utils/hpftodit/hpftodit.cc (read_map): Fix compiler warning. - -2001-04-19 Werner LEMBERG - - * src/preproc/html/pre-html.cc (scanArguments): Use `troff_command' - instead of hardwired `"troff"'. - (char_buffer::read_file): Remove unused variables. - (char_buffer::write_file_troff): Ditto. - (char_buffer::write_file_html): Ditto. - (generateImages): Ditto. - (abs): Removed. - * src/utils/addftinfo/addftinfo.cc (main): Fix compilation problem. - - * src/include/lib.h: Don't include `groff-getopt.h' for UWIN. - - * src/libs/libgroff/font.cc (font::load_desc): Fix compiler warning. - * src/libs/libbib/index.cc (index_search_item_iterator::get_tag, - index_search_item::search1): Ditto. - * src/roff/troff/node.h (width_list): Reorder members. - * src/roff/troff/input.cc (do_define_macro): Fix compiler warning. - (lookup_warning): Ditto. - (prepend_string): Commented out. - * src/roff/troff/dictionary.cc (is_good_size): Fix compiler warning. - * src/roff/troff/reg.cc (number_value_to_ascii): Ditto. - * src/preproc/tbl/main.cc (process_format): Ditto. - * src/preproc/pic/pic.y (define_variable, reset, reset_all): Fix - compiler warnings. - * src/preproc/pic/pic.cc: Updated. - * src/preproc/eqn/lex.cc (init_table): Fix compiler warnings. - * src/preproc/eqn/over.cc (over_box::compute_metrics): Ditto. - * src/preproc/refer/command.cc (execute_command): Ditto. - * src/preproc/refer/ref.cc (sortify_title, find_month): Ditto. - * src/preproc/refer/token.cc (lookup_token): Ditto. - * src/preproc/soelim/soelim.cc: Ditto. - * src/preproc/html/pushbackbuffer.cc (ERROR): Ditto. - (isHexDigit): Commented out. - (pushBackBuffer::isString): Remove unused variable. - * src/devices/grops/ps.cc (ps_printer::special): Fix compiler - warning. - * src/devices/grops/psrm.cc (resource_manager::lookup_font, - resource_manager::read_resource_arg, read_one_of, parse_extensions): - Ditto. - * src/devices/grodvi/dvi.cc (dvi_printer::draw): Ditto. - * src/devices/grolj4/lj4.cc (lj4_font::handle_unknown_font_command, - lookup_paper_size): Ditto. - * src/devices/grohtml/post-html.cc (is_subsection): Commented out. - (text_glob, element_list): Reorder members. - * src/devices/grohtml/html-text.cc (html_text::do_pre): Remove - compiler warning. - * src/devices/grohtml/html-text.h (html_text::emit_space): Change - return value to `void'. - * src/devices/grohtml/output.cc (word_list::word_list): Fix order - of initializers. - * src/devices/grohtml/html.h (simple_output::check_newline, - simple_output::space_or_newline, simple_output::enable_newlines): - Add return value. - * src/devices/grolbp/lbp.cc (wp54charset, set_papersize): Remove - compiler warnings. - * src/utils/tfmtodit/tfmtodit.cc (tfm::load, gf::load, main): Ditto. - * src/utils/hpftodit/hpftodit.cc (File::seek, read_symbol_sets, - output_ligatures, output_charset, read_map): Ditto. - * src/utils/lookbib/lookbib.cc (main): Ditto. - * src/utils/indxbib/indxbib.cc (main, fwrite_or_die): Ditto. - (do_file): Fix typo (`=' -> `=='). - * src/utils/lkbib/lkbib.cc (main): Remove compiler warning. - * src/utils/addftinfo/addftinfo.cc (main): Ditto. - -2001-04-18 Ruslan Ermilov - - * src/roff/nroff/nroff.sh: Adding -p (pic) and -t (tbl) options. - Fix usage of GROFF_BIN_PATH. - * src/roff/nroff/nroff.man: Updated. - -2001-04-18 Werner LEMBERG - - * NEWS: Fixing typos. - Updated. - -Version 1.17 released -===================== - -2001-04-17 Werner LEMBERG - - * tmac/Makefile.sub (install-data): mdoc.local-s is in current - directory, not in $(srcdir). - -2001-04-16 Werner LEMBERG - - * doc/groff.texinfo: More info on conditionals. - -2001-04-15 Werner LEMBERG - - * doc/groff.texinfo: Added some info about groff internals. - - * src/roff/troff/node.cc (make_glyph_node): Emit warning message - about missing special character only if the name is non-null. - -2001-04-14 Werner LEMBERG - - Removing the grohtml-old device driver which is now obsolete. - - * src/devices/grohtml-old/*: Removed. - * font/devhtml-old/*: Removed. - * src/libs/libgroff/htmlindicate.cc (graphic_start, graphic_end): - Remove comments. - * Makefile.in (CCPROGDIRS, DEVDIRS): Updated. - * test-groff (PATH): Updated. - * tmac/Makefile.sub (NORMALFILES): Updated. - * tmac/an-old.tmac: Remove special code for html-old device. - Replace `html-or-html-old' register with `an-html'. - * tmac/eqnrc: Updated. - * tmac/html-old.tmac: Removed. - * tmac/troffrc, tmac/troffrc-end: Updated. - * tmac/www.tmac: Remove special code for html-old device. - Replace `html-or-html-old' register with `www-html'. - - * src/libs/libgroff/tmpfile.cc (remove_tmp_files), - src/libs/libgroff/htmlindicate.cc (graphic_end), - include/htmlindicate.h, src/preproc/grn/*.cc, - src/roff/groff/env.{cc,h}: Remove `void' parameter if used as a - single argument for consistency with rest of source code. - - * aclocal.m4, tmac/an-old.tmac: Fix copyright. - -2001-04-13 Ruslan Ermilov - - * src/roff/troff/troff.man: Fixing typos. - -2001-04-13 Werner LEMBERG - - * doc/pic.ms: Fixing many font switches. - * doc/groff.texinfo: Fixes, additions. - * MORE.STUFF: Updated. - -2001-04-12 Gaius Mulley - - * src/devices/grohtml/grohtml.man: Updated manual page regarding - simple anchor. - * src/preproc/html/pre-html.cc (createImage): Fixed right hand - cropping of images. - (removeTempFiles): New function to tidy up temporary files. - * src/preproc/html/pre-html.cc (main): Calls `removeTempFiles()'. - Many fixes to do with the new inline suppress node and image regions - are much tighter. - * src/devices/grohtml/post-html.cc: New method `is_auto_img'. - (generate_img_src): New function. - (html_printer::do_auto_image): Utilizes it. - (do_heading, do_title): Include inline images within their contents. - (html_printer::begin_page): Tidied up comments that are issued to - the html output file. - (html_printer::do_fill): Fixed so that `.nf' works with fonts other - than courier. - (text_glob::is_br): New method used by do_heading. - * tmac/s.tmac: If -Thtml then emit $1 in .IP rather than its - equivalent diversion. - * src/include/html-strings.h: Altered image tags to reflect the - inline image node. - * src/include/htmlindicate.h (html_end_suppress): Added `is_inline' - parameter. - * src/preproc/eqn/main.cc: Will suppress generation of image tags if - it is already inside a pic image. Only emit tags if the argument - `-Tps:html' is present. - * src/preproc/tbl/main.cc: Changes to reflect additional - `html_end_suppress' parameter. - * src/roff/troff/env.cc: Only emit eol tag if a node has been - emitted since the last eol tag was written. - * src/roff/troff/env.h: New boolean `emitted_node'. - * src/roff/troff/input.cc (do_suppress): Handles extra suppress - nodes \O3, \O4, \O5. No longer use `output_low_mark_miny'. - * src/roff/troff/node.cc (check_charinfo): New method. - (troff_output_file::determine_line_limits): Alterations to limit - checking. - * tmac/www.tmac: Changes to reflect new suppress nodes. - -2001-04-12 Bruno Haible - - * src/devices/grohtml/post-html.cc (html_printer::add_to_sbuf): - Escape the html_glyph in the buffer. - (str_translate_to_html): Output the unescaped escaped_char. - * src/devices/grohtml/html-text.cc (issue_table_begin): Set - `frame=void', not `frame=none'. Add `border=0'. - -2001-04-12 Werner LEMBERG - - * PROBLEMS: Add some words on how to avoid wrapper macros. - -2001-04-11 Blake McBride - - * src/include/nonposix.h (fileno) [_MSC_VER]: Removed. - -2001-04-11 Werner LEMBERG - - * font/devlbp/Makefile.sub (CLEANADD): Set it. - * tmac/Makefile.sub (CLEANADD): Add tmac.local-s. - * Makefile.in (dist): Don't remove src/xditview/Imakefile, but ... - * Makefile.sub (DISTCLEANFILES): Here. - - * libs/libgroff/new.cc: Include `nonposix.h'. - * win32-diffs: Updated. - -2001-04-10 Ruslan Ermilov - - Added skeleton macro for defunct macros. - - Updated documentation. - - When inside displays, an empty input line warning should be - suppressed. If another macro call is put inside a display, - all subsequent empty lines found in that display caused a - warning to be emitted. - - * tmac/doc.tmac (doc-defunct-macro): New macro. - (Db, Ds, Ex, Or, Sf): Reimplemented using this macro. - (doc-restore-global-vars): Fixed typo. - (doc-empty-line): Check the `doc-display-depth' register to - determine whether we are inside display or not. - - * tmac/doc-common: Removed `Or' and `Sf' registers. - Moved obsolete `Ds' macro to doc.tmac. - - * tmac/groff_mdoc.man: Bump document date. - Document `.Vt' under ``Variable Types''. - Removed documentation for obsolete `.Or' macro. - -2001-04-10 Werner LEMBERG - - * NEWS: Updated. - * doc/groff.texinfo: Many fixes, additions, clarifications, etc. - -2001-04-10 Bruno Haible - - * src/devices/grodvi/dvi.cc (main): Accept --help and --version. - (usage): Add stream argument. Don't exit. - * src/devices/grohtml/post-html.cc (main): Accept --help and --version. - Write --version output to stdout, not stderr. - (usage): Add stream argument. Don't exit. - * src/devices/grohtml-old/html.cc (main): Accept --help and --version. - (usage): Add stream argument. Don't exit. - * src/devices/grolbp/lbp.cc (long_options): Use symbolic getopt.h - constants. - (usage): Add stream argument. Don't exit. - (main): Write --help output to stdout, not stderr. - * src/devices/grolj4/lj4.cc (main): Accept --help and --version. - (usage): Add stream argument. Don't exit. - * src/devices/grops/ps.cc (main): Accept --help and --version. - (usage): Add stream argument. Don't exit. - * src/devices/grotty/tty.cc (main): Accept --help and --version. - (usage): Add stream argument. Don't exit. - * src/preproc/eqn/main.cc (usage): Add stream argument. Don't exit. - (main): Accept --help and --version. - * src/preproc/grn/main.cc (usage): Add stream argument. Don't exit. - (main): Accept --help and --version. - * src/preproc/html/pre-html.cc (usage): Add stream argument. - (scanArguments): Accept --help and --version. - * src/preproc/pic/main.cc (usage): Add stream argument. Don't exit. - (main): Accept --help and --version. - * src/preproc/refer/refer.cc (main): Accept --help and --version. - (usage): Add stream argument. Don't exit. - * src/preproc/soelim/soelim.cc (usage): Add stream argument. Don't - exit. - (main): Accept --help and --version. - * src/preproc/tbl/main.cc (usage): Add stream argument. Don't exit. - (main): Accept --help and --version. - * src/roff/groff/groff.cc (main): Accept --help and --version. - (synopsis): Add stream argument. - (help): Write --help output to stdout, not stderr. - (usage): Add stream argument. Don't exit. - * src/roff/grog/grog.pl: Accept --help and --version. - (help): New sub. - * src/roff/grog/grog.sh: Accept --help and --version. - * src/roff/nroff/nroff.sh: Accept --help and --version. - * src/roff/troff/input.cc (USAGE_EXIT_CODE): Remove macro. - (usage): Add stream argument. Don't exit. - (main): Accept --help and --version. - * src/utils/addftinfo/addftinfo.cc (main): Accept --help and --version. - (usage): New function with stream argument, doesn't exit. - * src/utils/hpftodit/hpftodit.cc (main): Accept --help and --version. - (usage): New function with stream argument, doesn't exit. - * src/utils/indxbib/indxbib.cc (main): Accept --help and --version. - (usage): Add stream argument. Don't exit. - * src/utils/lkbib/lkbib.cc (usage): Add stream argument. Don't exit. - (main): Accept --help and --version. - * src/utils/lookbib/lookbib.cc (usage): Add stream argument. Don't - exit. - (main): Accept --help and --version. - * src/utils/pfbtops/pfbtops.c (usage): Add stream argument. Don't exit. - (main): Accept --help and --version. - * src/utils/tfmtodit/tfmtodit.cc (main): Accept --help and --version. - (usage): Add stream argument. Don't exit. - -2001-04-10 Ruslan Ermilov - - Fix indentation in SYNOPSIS. - - Updated to include changes of latest BSD mdoc version (basically, - the only change is that `.Fn' and `.Fc' put a final semicolon after - a function declaration in the SYNOPSIS section). - - * tmac/doc.tmac (doc-in-synopsis-count): Replaced with ... - (doc-in-synopsis-section): New variable. Updated all related - functions. - (doc-indent-synopsis-active): New register. - (Nd, Fn, Fo): Use it. - (Cd): It requires manipulation of \n[doc-indent-synopsis] so that - `.Cd' with long argument line produces indented wrapped lines. - Also, the misplaced `.nop \*[doc-Nm-font]\c'' caused extra - undesirable line break to be output. - (doc-do-func-decl, Nm, Vt, Fn, Fo): Remove extraneous calls to - `.rs'. - (Fn, Fc): Add final `;' to output. - (doc-save-global-vars, doc-restore-global-vars): Updated. - * tmac/doc-common: Remove `Ex' register. - Updated. - * tmac/doc-ditroff, tmac/doc-nroff, tmac/doc-syms: Updated - copyright. - -2001-04-06 Ruslan Ermilov - - * tmac/doc.tmac (Cd): Simplify code. - * tmac/groff_mdoc.man: Document some behaviour of `Cd' request. - -2001-04-06 Werner LEMBERG - - Implement continuous underlining for nroff mode. To do that, a new - request in the ditroff language has been added: `x u N' (N is 0 - or 1). - - \X and \Y are now transparent to end-of-sentence recognition. - - * src/include/printer.h (printer): Add `type' parameter to `special' - method. - * src/libs/libdriver/printer.cc (printer::special): Updated. - * src/libs/libdriver/input.cc (do_file): Handle `x u N'. - - * src/devices/dvi/dvi.cc (dvi_printer::special): Handle only - specials of type `p'. - * src/devices/grohtml/post-html.cc (html_printer::special): Ditto. - * src/devices/grohtml-old/html.cc (html_printer::special): Ditto. - * src/devices/grops/ps.cc (ps_printer::special): Ditto. - * src/devices/grotty/tty.cc: Add new enum CU_MODE. - (glyph::order): New method. - (tty_printer::add_char): Use it. - (tty_printer::special): New method. - (tty_printer::end_page): Implement it. - - * src/roff/troff/node.h (special_node): Add `no_init_string' member. - * src/roff/troff/node.cc (special_node::special_node): Add parameter - to set `no_init_string'. - (special_node::tprint_start): Use it. - (special_node::same, special_node::copy): Updated. - (special_node::ends_sentence): New method. - (troff_output_file::start_special): Add parameter to include - inititialization of special conditionally. - - * src/roff/troff/env.h (environment): New member `underline_spaces'. - * src/roff/troff/env.cc (do_underline_special): New function. - (environment::set_font): Use it. - (do_underline): Use it. This was `underline()'. - (underline): Call `do_underline()'. - (continuous_underline): New function which calls `do_underline()'. - (environment::newline): Use `do_underline_special()'. - (init_env_requests): Updated. - - * NEWS, man/troff_out.man: Updated. - -2001-04-06 Bruno Haible - - * font/devutf8/R.proto: Fix code of 'shc'. - -2001-04-06 Ruslan Ermilov - - Many fixes. Diag lists can now be nested also; additionally, - `-compact' and `-offset' are supported. - - * tmac/doc.tmac (doc-have-indent): Replaced with ... - (doc-list-have-indent-stackXXX): A new register stack. - (doc-have-diag-list): Removed. - (Bl): Use `doc-list-have-indent-stackXXX'. - (El): Updated. - (doc-diag-list): Use `doc-compact-list-stackXXX'. - (doc-tag-list): Use `doc-list-have-indent-stackXXX'. - (doc-set-vertical-and-indent): Ditto. - (doc-next-list-depth): Removed. - (doc-increment-list-stack): Updated. - (doc-decrement-list-stack): Use `doc-list-depth' instead of - `doc-next-list-depth'. - (doc-end-list, doc-end-column-list): Don't use - `doc-increment-list-stack'. - (doc-set-column-tab): Don't use `doc-list-offset-stackXXX'. - (doc-save-global-vars, doc-restore-global-vars): Updated. - * tmac/doc-common: Updated. - * tmac/groff_mdoc.man: Updated. - * NEWS: Fix typo. - -2001-04-02 Werner LEMBERG - - * src/devices/grotty/grotty.man: Fix grammatical error. - -2001-03-30 Ruslan Ermilov - - Remove .Ld from mdoc package; replace it with special handling of - `...'. - - * tmac/doc-common: Remove `Ld' register. - Uncomment `doc-volume-ds-*' strings. - Remove `doc-operating-system-default'. - (Os): Updated. - * tmac/doc-syms (Ld): Removed. - * tmac/doc.tmac (doc-parse-args, doc-parse-arg-vector): Handle - `...' specially. - * NEWS: Updated. - - * tmac/groff_mdoc.man: Many fixes and updates. - -2001-03-29 Werner LEMBERG - - * tmac/troffrc-end: Protect data with `.do'. Reported by T. Kurt - Bond . - * tmac/www.tmac: Save compatibility mode. - -2001-03-28 Ruslan Ermilov - - * tmac/groff_mdoc.man: Many fixes. - -2001-03-28 Werner LEMBERG - - * src/preproc/soelim/soelim.man: Document that `.so' - isn't recognized. - -2001-03-27 Werner LEMBERG - - * tmac/an-old.tmac (TP, an-do-tag): Reduce line length while in - diversion. This fixes overlong tags. - -2001-03-26 Werner LEMBERG - - * doc/groff.texinfo: Fixed and improved documentation of fonts. - * tmac/doc-syms: Fix error messages. - * tmac/an-old.tmac: Remove incorrect double backslashes. - -2001-03-24 Ruslan Ermilov - - * tmac/Makefile.sub: Strip mdoc.local also - * tmac/strip.sed: Fixed. - -2001-03-24 Werner LEMBERG - - * tmac/doc-nroff, tmac/doc-ditroff: Implement -rSxx switch for - selecting the font size. - * tmac/groff_mdoc.man, NEWS: Document it. - -2001-03-23 Werner LEMBERG - - * src/roff/troff/div.cc (save_vertical_space): Add default argument - to `sv' request. - * src/roff/troff/env.cc (family_change): Make `.fam' accept no - argument to restore previous font family. - * src/roff/troff/troff.man, man/groff.man, NEWS: Updated. - - * doc/groff.texinfo: More fixes and additions (mainly for font - manipulating commands). - - * tmac/groff_mdoc.reference.man: Small updates and renamed to ... - * tmac/groff_mdoc.man: This. The quick reference has been removed. - * tmac/Makefile.sub, NEWS: Updated. - -2001-03-23 Werner LEMBERG - - Replaced mdoc implementation. The new version is `state of the - art', using almost all new features of groff 1.17 -- it won't run - with older versions. - - * tmac/doc.tmac: Completely rewritten. - * tmac/doc-common: Ditto. - * tmac/doc-nroff: Ditto. - * tmac/doc-ditroff: Ditto. - * tmac/doc-syms: Ditto. - * tmac/mdoc.local: New file. - * tmac/groff_mdoc.samples.man: Replaced with ... - * tmac/groff_mdoc.reference.man: New file, covering mdoc completely. - * tmac/strip.sed: Updated. - * tmac/Makefile.sub: Updated. - * INSTALL: Updated. - - * tmac/groff_man.man: Add `man.local' to the FILES section. - -2001-03-22 Werner LEMBERG - - * doc/groff.texinfo: Added many @noindent. - Replaced @end_Example -> @endExample. - Added info whether registers are r/o. - Many other additions and fixes. - -2001-03-21 Werner LEMBERG - - * doc/groff.texinfo: Added macro @Var (and some hacks due to bugs - in makeinfo of texinfo 4.0) to be used in @Def* macros. - Improved @Def* macros: Now the exact syntax of request, register, - and escapes is shown. - Added macros for parentheses and brackets to be used in @Def*. - Many fixes and improvements of the documentation. - -2001-03-20 Werner LEMBERG - - * doc/groff.texinfo: Added new index: `st' (for strings). - Added macros @Defstr(x). - Added macro @Example (adding @group). - Other minor improvements. - -2001-03-19 Werner LEMBERG - - * doc/groff.texinfo: Added two new indices: `es' (for escapes) and - `rq' for requests. `fn' is no longer used. - Added macros @Defreq(x), @Defreg(x), and @Defesc(x). - Removed @Deffn(x). - - * tmac/an-old.tmac (an-p-footer): If `cR' is set, replace page - number with name of man page. - -2001-03-19 Larry Kollar - - * doc/groff.texinfo: Complete revision. Added many @Deffn to gain - consistency. - -2001-03-19 Werner LEMBERG - - * man/groff_font.man: Document `prepro', `postpro', and `print'. - * src/roff/groff/groff.man: Improve documentation of `-l' and `-L'. - * src/devices/grohtml/grohtml.man: Fixing typos. - -2001-03-19 Gaius Mulley - - * tmac/s.tmac (@IP): Pass `.ip' html tag. - * tmac/groff_mwww.man: Remove .LINE macro - * tmac/www.tmac (LINE): Add `.ti'. - - * src/devices/grohtml/post-html.cc (html_printer): New member - `indent'. - (html_printer::emit_raw): Use it. - (html_printer::do_linelength): Ditto. - (html_printer::do_pageoffset): Ditto. - (html_printer::do_indentation): Ditto. - (html_printer::do_tempindent): Ditto. - (html_printer::do_break): Ditto. - (html_printer::begin_page): Ditto. - (html_printer::do_indentedparagraph): New function. - (html_printer::troff_tag): Handle `.ip'. - * src/devices/grohtml/html-text.cc (html_text::issue_table_begin): - Add `
' handling. - (html_text::do_table): Add parameter. - (html_text::do_indent): Updated. - * src/devices/groohtml/html-text.h: Updated. - -2001-03-16 Gaius Mulley - - Introduced simple html tables to implement indentation. - - * src/devices/grohtml/html.h (word, word_list): New structures. - (simple_output): Use it. - * src/devices/grohtml/post-html.cc: Add `INDENTATION'. - (html_printer): Improve indentation handling. - (html_printer::emit_raw): Set `in_table' element. Handle - indentation if set. - (html_printer::write_header): Move conditional downwards. - Don't allow whitespace in tags. - (html_printer::do_linelength): Handle line length and indentation - conditionally. - (html_printer::do_pageoffset): Handle indentation conditionally. - (html_printer::do_indentation): Ditto. - (html_printer::do_tempindent): New function member. - (html_printer::do_fill): Take care of indentation. - (html_printer::do_flush): Finish table. - (html_printer::do_links): Ditto. - (html_printer::do_break): New function for handling `.br' and `.ti'. - (html_printer::troff_tag): Use it. - Handle `.ti'. - (html_printer::flush_globs): Fix. - (html_printer::flush_page): Finish table. - (html_printer::html_printer): Fix error message. Set up - `linelength'. - (html_printer::add_to_sbuf): Remove special handling of character - code 255. - (to_unicode): Remove `stop()'. - (html_printer::write_title): Cleanup. - (html_printer::begin_page): Use `put_string()'. Handle indentation. - (html_printer::~html_printer): Flush text and end the line. - Use `put_string()'. - * src/devices/grohtml/html_text.h: Add more *_TAG enum values. - * src/devices/grohtml/html_text.cc (html_text::end_tag): Fix - emission of tags. - (html_text::start_tag): Disable newlines. - (html_text::table_is_void): New function. - (html_text::issue_table_begin): Ditto. - (html_text::issue_table_end): Ditto. - (html_text::push_para): Better table handling. - (html_text::do_indent): New function. - (html_text::do_table): Ditto. - (html_text::done_table): Ditto. - (html_text::do_tt): Handle PRE_TAG. - (html_text::is_in_table): New function. - (html_text::check_emit_text): Handle tables. - (html_text::do_emittext): Use `nl()'. - (html_text::do_para): Handle table. - (html_text::remove_def): New function. - * src/devices/grohtml/output.cc (word, word_list): Implement - methods. - (simple_output::end_line): Flush last word. - (simple_output::simple_comment): Ditto. - (simple_output::begin_comment): Recoded. - (simple_output::end_comment): Ditto. - (simple_output::comment_arg): Removed. - (simple_output::check_newline): Improve test and flush last word. - (simple_output::space_or_newline): Improved. - (simple_output::write_newline): Replaced with... - (simple_output::nl): This. - (simple_output::put_raw_char): Flush last word. - (simple_output::check_space): Removed. - (simple_output::put_translated_string): Ditto. - (simple_output::put_string): Simplified. - (simple_output::put_number): Updated. - (simple_output::put_float): Ditto. - (simple_output::put_symbol): Removed. - (simple_output::enable_newlines): Add `check_newline()'. - (simple_output::flush_last_word): New function. - - * src/roff/troff/enc.cc (no_fill): Remove call to add_html_tag(). - * src/roff/troff/div.cc (page_offset): Add call to add_html_tag(). - - * tmac/s.tmac (@PP, @IP): Add html conditional code. - * tmac/an-old.tmac (TP): Ditto. - -2001-03-09 Ruslan Ermilov - - * mdate.sh: Make it POSIX compliant. - -2001-03-09 Werner LEMBERG - - Added the `return' request to end a macro immediately. It simply - pops iterators from the input stack until a macro iterator is found. - - * src/roff/troff/input.cc (input_iterator::is_macro, - macro_iterator::is_macro): New member. - (input_return_boundary): New class to signal an immediate return - to while_request(). - (input_stack::add_return_boundary, input_stack::is_return_boundary): - New functions. - (input_stack::clear): Use it. - (input_stack::pop_macro): New function. - (while_request): Use `is_return_boundary()'. - (return_macro_request): New function. - (init_input_requests): Use it. - - * src/roff/troff/TODO: Updated. - * NEWS, src/roff/troff/troff.man, man/groff.man: Document it. - -2001-03-08 Werner LEMBERG - - * src/roff/troff/input.cc (input_iterator::is_boundary): Minor - cleanup. - -2001-03-07 Werner LEMBERG - - Make `\B' more rigid. - - * src/roff/troff/number.cc (parse_expr, parse_term): Add `rigid' - parameter. - (get_number_rigidly): New function. - * src/roff/troff/input.cc (do_expr_test): Use it. - * src/roff/troff/token.h: Updated. - - * src/roff/troff/request.h: Fix typo (init_html_request -> - init_markup_request). - -2001-03-04 Gaius Mulley - - Fixed grohtml handling of any named glyph for glyph indexes < 0x80. - Cosmetic changes to `.html-begin', `.html-end', `.html-image' which - are now `.begin', `.end', `.image'. - - * src/devices/grohtml/post-html.cc: Adding UNICODE_DESC_START. - (html_printer::add_to_sbuf): Changing type of `code' parameter. - Use add_char_to_sbuf(). - (to_unicode): New function. - (char_translate_to_html): Changing type of `ch' parameter. - Use `to_unicode()'. - (html_printer::~html_printer): Comment out doctype string. - * src/preproc/html/pre-html.cc (write_end_image): Use `.end' - instead of `.html-end'. - (write_start_image): Use `.begin' and `.image' instead of - `.html-begin' and `.html-image'. - * src/roff/troff/input.cc: Rename `html_level' to `begin_level'. - (html_begin): Renamed to ... - (begin): This. - (html_end): Renamed to ... - (end): This. - (html_image): Renamed to ... - (image): This. - (init_html_requests): Renamed to ... - (init_markup_requests): This. - * tmac/www.tmac: Updated. - -2001-02-28 Bram - - * src/libs/libgroff/font.cc (font_widths_cache): Fixing syntax of - constructor. - -2001-02-26 David Leonard - - * doc/meref.me: Fixing some typos. - -2001-02-16 Werner LEMBERG - - * src/roff/troff/node.cc (space_node::get_hyphenation_type): New - method. Return `HYPHEN_MIDDLE' if it was `\:'. - * src/roff/troff/node.h: Updated. - -2001-02-17 Ruslan Ermilov - - * tmac/groff_tmac.man: Fix typo. - -2001-02-16 Werner LEMBERG - - Fixing a bug which prevented proper end-of-sentence recognition - between an `unformatted' box and the following text. As a - consequence, vertical line distances are no longer preserved in - boxes after a call to `.unformat' -- because boxes aren't - line-oriented (contrary to diversions), this doesn't make sense - anyway. - - * src/roff/troff/node.cc (*node::set_unformat_flag): Add return - value. - (vertical_size_node::set_unformat_flag): New method. - * src/roff/troff/node.hh: Updated. - * src/roff/troff/input.cc (word_space_node::reread, - hmotion_node::reread): Reset `unformat' flag after usage. - (unformat_macro): Append only if `set_unformat_flag()' returns - non-zero. - * src/roff/troff/troff.man: Updated. - -2001-02-15 Werner LEMBERG - - * src/roff/troff/troff.man, NEWS, man/groff.man: Improved - documentation of `asciify' and `unformat' requests. - -2001-02-13 Werner LEMBERG - - Redesigned the `unformat' request. It is no longer connected with - `asciify' but rather uses new `reread()' methods if the `unformat' - flag is set. Additionally, the handling of space characters after - unformatting has been fixed so that they retain their width. - - * src/roff/troff/node.h (width_list): New structure to store - original widths of spaces. - (node): Added `unformat' member. - Replaced `num_spaces' variable with `orig_width' list. - * src/roff/troff/node.cc (*node::asciify, - asciify_reverse_node_list): Removed `unformat_only' flag and related - code. - (word_space_node::asciify, word_space_node::word_space_node): Use - `orig_width'. - (word_space_node::~word_space_node): New destructor. - (word_space_node::copy): Updated to handle `orig_width'. - (hmotion_node::copy, unbreakable_space_node::copy): Updated. - (*node::merge_space): Update `orig_width' list if necessary. - (*node::set_unformat_flag): New methods to set the `unformat' flag. - * src/roff/troff/enc.cc (environment::space_newline): Use - `width_list'. - (environment::space): Added method to handle space width and - sentence space width as parameters. Use `width_list'. - (environment::make_tab_node): Updated. - * src/roff/troff/env.h: Updated. - * src/roff/troff/input.cc (word_space_node::reread, - unbreakable_space_node::reread, hmotion_node::reread): New methods - to handle nodes specially if `unformat' flag is set. - (do_asciify_macro): Renamed back to ... - (asciify_macro): This. - (unformat_macro): New implementation to simply set the `unformat' - flag. - - * MORE.STUFF: Added more info about deroff. - -2001-02-08 Werner LEMBERG - - * src/roff/troff/node.h (unbreakable_space_node, hmotion_node, - space_char_hmotion_node, overstrike_node): Add `get_hyphen_list()' - and `add_self()' methods to avoid hyphenation. For example, the - hyphen list for `foo\0\0bar' was `foobar', causing insertion of a - soft hyphen after `foo'. Now the hyphen list is correctly - `foobar'. - -2001-02-05 Yoshiteru Kageyama - - * tmac/groff_tmac.man: Fix `BIR' macro. - -2001-02-04 Werner LEMBERG - - A new escape sequence `\:', inserting a zero-width break point. - - * src/roff/troff/input.h: Adding `ESCAPE_COLON'. - * src/roff/troff/input.cc (get_copy, token::next, asciify): - Implement it. - * src/roff/troff/node.h (node): Add `is_escape_colon()' virtual - method. - (space_node): Add `was_escape_colon' member. Add `is_escape_colon()' - and `asciify()' methods. - * src/roff/troff/node.cc (space_node::space_node): Updated. - (space_node::asciify): Handle `was_escape_colon'. - * NEWS, src/roff/troff/troff.man, man/groff.man: Document it. - - Handle `\~' similar to other comparable requests. - - * src/roff/troff/input.cc (process_input_stack): Remove now obsolete - label. - (token::next): Move creation of an unbreakable_space_node to... - (token::add_to_node_list): Here. - - Fix a bug which sometimes prevented hyphenation of words connected - with `\~' or `\ ' (and other escape sequences handled as - TOKEN_NODE). This also fixes a hyphenation problem with boxes - (after a call to the `unformat' request). - - * src/roff/troff/env.h (environment::possibly_break_line, - environment::hyphenate_line): Introducing `start_here' parameter. - * src/roff/troff/env.cc (environment::space_newline, - environment::space): Use it. - (environment::possibly_break_line, environment::hyphenate_line): - Implement it. - * src/roff/troff/input.cc (process_input_stack): Use it. - * src/roff/troff/node.h (unbreakable_space_node, hmotion_node, - space_char_hmotion_node, overstrike_node): Add - `get_hyphenation_type()' method. - * src/roff/troff/node.cc (break_char_node::asciify): Don't asciify - if `unformat_only' is active. - -2001-01-30 Werner LEMBERG - - Implemented new read-only number register `.linetabs' which - returns 1 if in line-tabs mode, 0 otherwise. - - * src/roff/troff/env.h (environment): Add get_line_tabs() member. - * src/roff/troff/env.cc (get_line_tabs): New function. - (init_env_requests): Use it. - * NEWS, src/roff/troff/troff.man, man/groff.man: Document it. - - * VERSION, REVISION: Changing to 1.17.0. - -2001-01-28 Werner LEMBERG - - Fixed a bug which prevented hyphenation of words which are finished - with `\)'. - - * src/roff/troff/token.h (token): Add enum type - `TOKEN_TRANSPARENT_DUMMY' and method `transparent_dummy()'. - * src/roff/troff/input.cc (token::next, token::description, - get_line_arg, token::add_to_node_list, token::process): Use it. - -2001-01-27 Werner LEMBERG - - * src/roff/troff/div.h (diversion): Add `saved_prev_line_interrupted'. - * src/roff/troff/div.cc (do_divert): Use it. - - * src/roff/troff/input.cc (asciify): Add ESCAPE_RIGHT_PARENTHESIS. - -2001-01-25 Werner LEMBERG - - Adding the `linetabs' request. If set, tab distances are not - computed relative to the input line but relative to the output line. - - * src/roff/troff/env.h (environment): New member `line_tabs'. - * src/roff/troff/env.cc (line_tabs_request): Implement request. - (environment::environment, environment::copy): Updated. - (environment::distance_to_next_tab): Use `line_tabs'. - (init_env_requests): Register request. - * src/roff/troff/troff.man, man/groff.man, NEWS: Document it. Other - fixes. - -2001-01-24 Werner LEMBERG - - Introducing a new read-only register `.int' which is set to a - positive value if the last output line is interrupted (i.e., if it - contains `\c'). - - * src/roff/troff/env.cc (init_env_requests): Add it. - * NEWS, src/roff/troff/troff.man, man/groff.man: Document it. - -2001-01-23 Gaius Mulley - - * tmac/mwww.tmac: Call `www.tmac', not `arkup.tmac'. - * src/preproc/html/pre-html.cc (findPrefix): New function which - generates the troff executable name via the system prefix. - * src/preproc/eqn/main.cc: Modified warning message. - -2001-01-23 Werner LEMBERG - - troff's `box' and `boxa' requests didn't preserve temporary - indentation. - - * src/roff/troff/div.h (diversion): Add `saved_saved_indent' and - `saved_target_text_length' members. - * src/roff/troff/div.cc (do_divert): Use them. - - Tabs (but not yet leaders and fields) are now handled correctly by - `asciify' request. - - * node.h (hmotion_node): Add field `was_tab'. - * env.cc (environment::make_tab_node): Set it. - * node.cc (hmotion_node::copy, hmotion_node::asciify): Use it. - - Added new request `unformat' which will, contrary to `asciify', - preserve font information after unformatting (i.e., only nodes - dealing with horizontal space are converted back to input - characters). - - * input.cc (asciify_macro): Renamed to ... - (do_asciify_macro): this, having a new parameter `unformat_only'. - (asciify_macro, unformat_macro): New; using do_asciify_macro. - (init_input_requests): Added `unformat'. - * node.cc (*_node::asciify), asciify_reverse_node_list: Added - parameter to control asciification process. - * node.h (*_node::asciify): Ditto. - * NEWS, src/roff/troff/troff.man, man/groff.man: Document it. - -2001-01-20 Werner LEMBERG - - * doc/groff.texinfo: Minor improvement of `.in' documentation. - -2001-01-18 Werner LEMBERG - - * tmac/ps.tmac: Remove call of psold.tmac. - * tmac/psold.tmac: Comment updated. - * tmac/psnew.tmac: Removed since no longer needed. - * tmac/Makefile.sub, NEWS, src/devices/grops/grops.man: Updated. - - * font/devutf8/R.proto: Adding `shc' glyph. - * font/devutf8/NOTES: Updated. - - * test-groff: Updated. - -2001-01-15 Gaius Mulley - - First cut of the new html device driver. Changes to pre-html and - the new grohtml are too numerous to be documented here. - - Stuff related to `html' has been renamed to `html-old' and `html2' - stuff has been renamed to `html' (including directories). The new - html device driver is therefore invoked as `-Thtml'. - - Added new `\O' escape to suppress output (needed by html driver). - - Added functions and code to pass info about input-level commands - (`.in', `.fl', etc.) to html driver. - - Three new functions (.html-begin, .html-end, and .html-image) for - better html handling: `html-begin' will execute the remaining line - if at the outermost nesting level, increasing an internal counter. - `html-end' does the same but decreases the internal counter. - `html_image' puts its arguments into a special node (suppress_node) - to define an image region. - - The `output' request has been removed. - - * tmac/html-tags.tmac: Removed. - * tmac/arkup.tmac: Updated and renamed to ... - * tmac/www.tmac: New file. - * tmac/markup.tmac Updated and renamed to ... - * tmac/mwww.tmac: New file. - * tmac/Makefile.sub: Updated. - * tmac/an-old.tmac: Updated. - * tmac/eqnrc: Updated. - * tmac/groff_man.man - * tmac/groff_markup.man: Updated and renamed to ... - * tmac/groff_mwww.man: New file. - * tmac/groff_tmac.man: Updated. - * tmac/html-old.tmac: Updated and Renamed from html.tmac. - * tmac/html.tmac: Updated and renamed from html2.tmac. - * tmac/pspic.tmac: Updated html support. - * tmac/s.tmac: Added html output support. - * tmac/troffrc, tmac/troffrc-end: Updated. - - * Makefile.in, doc/Makefile: Updated. - * doc/groff.texinfo: Added info about new `\O' escape. - * doc/homepage.ms: Use `MAILTO' macro. - - * font/devhtml/DESC.proto: Add `C' font. - * font/devhtml/Makefile.sub: Updated. - * font/devhtml/R.proto: Minor fixes. - * font/devhtml-old/Makefile.sub: Updated. - - * src/devices/grohtml-old/Makefile.sub: Updated. - - * src/libs/libdriver/printer.cc (printer::get_font_from_index): New - method. - * src/libs/libgroff/htmlindicate.cc (html_begin_suppress, - graphic_start): Add `inline' parameter. Update. - (html_end_suppress, graphic_end): Update. - - * src/include/html-strings.h: New file. - * src/include/htmlindicate.h: Comments updated. - * src/include/printer.h: Updated. - - * src/preproc/eqn/main.cc (do_file, main): Updated. - * src/preproc/pic/troff.cc (troff_output::start_picture, - troff_output::finish_picture): Updated. - * src/preproc/tbl/main.cc (process_input_file): Updated. - - * src/roff/groff/groff.cc (main): Updated. - Pass device arguments to predrivers also. - Use `ps' device for `eqn' preprocessor if `-Thtml' is given. - * src/roff/troff/env.h (environment): Updated. - New elements `need_eol' and `ignore_next_eol' (for html output). - * src/roff/troff/env.cc (environment::environment): Add initializers - for `need_eol' and `ignore_next_eol'. - (environment::add_html_tag_eol, environment::add_html_tag_tabs): New - functions. - (point_size, fill, no_fill, center, right_justify, line_length, - indent, temporary_indent, break_request, handle_tab): Use - `add_html_tag()'. - (set_tabs): Use `add_html_tag_tabs()'. - (environment::add_html_tag): Updated. - (environment::do_break): Updated. - * src/roff/troff/div.cc (space_request, flush_output): Use - `environment::add_html_tag()'. - * src/roff/troff/input.cc: Updated. - New variable `html_level' to indicate nested `html-begin' requests. - (file_iterator::fill): Use `environment::add_html_tag_eol()'. - (non_interpreted_char_node, token_node, non_interpreted_node): Add - `force_tprint()' method. - (token::next): Handle `\O'. - (do_suppress): Implement it. - (html_begin, html_end, html_image): New functions. - (init_output_requests): Renamed to ... - (init_html_requests): this. - (main): Use it. - (macro::append_str, macro::append_unsigned, macro::append_int): New - methods. - New variable `output_low_mark_miny' to limit minimal value of y. - (reset_output_registers): Use it. - (output_request): Removed. - (get_output_registers): New function. - * src/roff/troff/node.h (node): Make `force_tprint()' virtual. - (*_node): Added `force_tprint()' if necessary. - (special_node): New elements `tf' and `get_tfont()'. - (suppress_node): New class. - * src/roff/troff/node.cc: - New global variables `image_no' and `suppress_start_page'. - (real_output_file): New method `is_on()'. - (troff_output_file): New method `start_special(tfont)'. - (troff_output_file::really_print_line): Use `tprint' conditionally. - (real_output_file::print_line): Updated. - (real_output_file::on): Updated. - (*_node): Added `force_tprint()'. - (special_node::special_node): Initializer updated. - (special_node::same, special_node::copy, special_node::tprint_start): - Updated. - (get_reg_int, get_reg_str): New functions. - (suppress_node::*): New methods. - New global variables last_position, last_image_filename; - (min): New inline function. - * src/roff/troff/reg.h, src/roff/troff/request.h, - src/roff/troff/troff.h: Updated. - -2001-01-13 Werner LEMBERG - - * NEWS, src/roff/troff/troff.man, doc/groff.texinfo: Fix - documentation of `asciify' request. - -2001-01-12 Werner LEMBERG - - * src/roff/troff/input.cc: Move definition of special characters - like `ESCAPE_TILDE' to ... - * src/roff/troff/input.h: New file. - * src/roff/troff/Makefile.sub (HDRS): Add it. - - Extending the .asciify request to `unformat' space characters also. - - * src/roff/troff/node.h (word_space_node): Add `num_spaces' element - to count input space characters. - Update constructors to take care of it. - * src/roff/troff/node.cc (space_char_hmotion_node::asciify): Use - `ESCAPE_SPACE' instead of normal space. - (word_space_node::asciify): New method. - (unbreakable_space_node::asciify): New method. - (word_space_node::merge_space): New method. - * src/roff/troff/env.cc (environment::space_newline, - environment::space): Add code to initialize `num_spaces' (using the - constructor of `word_space_node'). - * NEWS, src/roff/troff/troff.man, man/groff.man, doc/groff.texinfo: - Document it. - -2001-01-09 Werner LEMBERG - - * man/groff_char.man: Use table header traps only conditionally. - -2001-01-09 Bjarni Ingi Gíslason - - * man/groff_char.man: Add `ý' and `Ý' to the `acute' group. - -2001-01-08 Werner LEMBERG - - Introducing the `box' and `boxa' requests which are similar to - `di' resp. `da' but omitting a partially filled line (which is - restored after ending the diversion). - - * src/roff/troff/div.h (diversion): Add elements to save partially - filled line. - * src/roff/troff/div.cc (do_divert): Add parameter `boxing' to save - partially filled line. - (divert, divert_append): Updated. - (box, box_append): New functions. - (init_div_requests): Use them. - * src/roff/troff/env.h (environment): do_divert() is now a friend. - * NEWS, src/roff/troff/troff.man, man/groff.man: Document it. - - * doc/groff.texinfo: Fix documentation of `lf' request. - -2000-12-25 Werner LEMBERG - - * src/roff/troff/troff.man, NEWS: Document `writem' request. - -2000-12-21 Werner LEMBERG - - Ignore `ss' request if in compatibility mode. - - * src/roff/troff/input.cc: Make `compatible_flag' non-static. - * src/roff/troff/env.h: Added extern `compatible_flag' declaration. - * src/roff/troff/env.cc (space_size): Use it. - - * doc/groff.texinfo, src/roff/troff/troff.man: Fix documentation of - `ss' request in nroff mode. - - * tmac/an-old.tmac: Fixed some serious bugs introduced with latest - changes. - -2000-12-15 Ruslan Ermilov - - * tmac/troffrc, tmac/troffrc-end: Convert tmac.* to *.tmac. - -2000-12-13 Werner LEMBERG - - * src/preproc/eqn/Makefile.sub (MAN1): Added neqn.man. - * src/preproc/eqn/neqn.man: Small fixes and additions. - -2000-12-13 Ruslan Ermilov - - * src/utils/addftinfo/addftinfo.man, src/devices/grops/grops.man: - Fixing typo. - - * src/preproc/eqn/neqn.man: New file. - - * src/preproc/tbl/table.cc (table::print): Fix `indent cannot be - negative' warning. - - * tmac/e.tmac: Add `T&' macro. - Fix `indent cannot be negative' warning. - * tmac/s.tmac: Fix `indent cannot be negative' warning. - -2000-12-07 Werner LEMBERG - - * src/include/lib.h: Replaced __ALPHA with __alpha symbol. - -2000-12-06 Werner LEMBERG - - * PROBLEMS: Added info about adding -lPW on HP-UX to satisfy the - `alloca' symbol . - - * MORE.STUFF: Added info about deroff for djgpp. - - * tmac/an-old.tmac, tmac/groff_man.man, doc/groff.texinfo, NEWS: Fix - documentation of -rcR switch. - -2000-12-03 Werner LEMBERG - - * tmac/an-old.tmac: Implementing the -rcR switch (similar to mdoc); - if -rcR=1 (which is now the default in nroff mode), a single, very - long page is created instead of multiple pages: All `ne' and `wh' - requests are put into conditionals; a new macro `an-end' is added to - be called with `em'. - - Some other minor cleanups. - - * NEWS, tmac/groff_man.man, doc/groff.texinfo: Updated. - -2000-12-02 Werner LEMBERG - - Fixing a bug which prevented hyphenation in words followed - immediately by a TOKEN_NODE (e.g. `\ ', `\~', etc.). - - * src/roff/troff/input.cc (process_input_stack ): - Adding possibly_break_line(). - * src/roff/troff/env.h (environment): Make possibly_break_line() - public. - - Make `\~' usable in .tr request. - - * src/roff/troff/token.h (token_type): Add TOKEN_STRETCHABLE_SPACE. - (token): Add stretchable_space(). - * src/roff/troff/input.cc (token::next, token::delimiter, - token::description, process_input_stack, do_translate, - add_to_node_list, token::process): Use it. - * src/roff/troff/node.h (node): Add fourth parameter to add_char() - for adjusting the space. - * src/roff/troff/node.cc (node::add_char): Implement it. Add code - for stretchable space. - * src/roff/troff/input.cc (token::add_to_node_list): Use it. - (make_node): Add code for stretchable space. - * src/roff/troff/env.cc (environment::add_char): Use it. - * src/roff/troff/input.cc: Add ESCAPE_TILDE special character. - (get_copy, token::next, transparent_translate, asciify): Use it. - - * NEWS, src/roff/troff/troff.man, src/roff/troff/TODO, - doc/groff.texinfo: Updated. - * man/groff.man: Small reorderings. - -2000-11-23 Werner LEMBERG - - * NEWS: Fixes. - * src/preproc/eqn/main.cc (main): Use `config_macro_path' for -M - option. - * src/roff/troff/input.cc (main): Add `config_macro_path' and - `safer_macro_path' to -M option. - * src/roff/troff/troff.man: Fixes. - -2000-11-22 Werner LEMBERG - - Use safer path (except for config files) if -U isn't specified. Add - a special macro path (without home and current directory) for config - files. Add home directory to unsafe path for consistency. Don't - include the home directory in the font path. - - * src/libs/libgroff/macropath.cc: Add `config_macro_path', change - `macro_path'. - * src/include/macropath.h: Add `config_macrp_path'. - * src/libs/libgroff/fontfile.cc: Fix font path. - * src/roff/troff/input.cc (process_startup_file): Use - `config_macro_path'. - (main): Select unsafe path if -U is given. - - * src/preproc/eqn/main.cc (main): Fixing search path for - configuration file. - * src/preproc/eqn/eqn.man: Updated. - - * src/roff/troff/troff.man, man/roff.man, tmac/groff_tmac.man: - Updated. - - * src/preproc/grn/grn.man, src/devices/grodvi/grodvi.man, - src/devices/grohtml/grohtml.man, src/devices/grolbp/grplbp.man, - src/devices/grolj4/grolj4.man, src/devices/grops/grops.man, - src/devices/grotty/grotty.man: Updated. - - * Makefile.in: Fix comments. - -2000-11-17 Werner LEMBERG - - * tmac/safer.tmac: Empty file added (again) for compatibility - reasons. - * tmac/Makefile.sub: Updated. - -2000-11-16 Werner LEMBERG - - * src/devices/grodvi/dvi.cc (main), - src/devices/grohtml2/post-html.cc (main), - src/devices/grolbp/lbp.cc (main), src/devices/grolj4/lj4.cc - (main), src/devices/grops/ps.cc (main), src/devices/grotty/tty.cc - (main), src/preproc/eqn/main.cc (main), src/preproc/grn/main.cc - (main), src/preproc/html2/pre-html.cc (main), - src/preproc/pic/main.cc (main), src/preproc/refer/refer.cc (main), - src/preproc/soelim/soelim.cc (main), src/preproc/tbl/main.cc - (main), src/roff/groff/groff.cc (main), src/roff/troff/input.cc - (main), src/utils/hpftodit/hpftodit.cc (main), - src/utils/indxbib/indxbib.cc (main), src/utils/lkbib/lkbib.cc - (main), src/utils/lookbib/lookbib.cc (main), - src/utils/pfbtops/pfbtops.c (main), src/utils/tfmtodit/tfmtodit.cc - (main): Use stdout for -v. - * src/roff/groff/groff.cc (run_commands), - src/roff/groff/pipeline.c (run_pipeline): New parameter `no_pipe' - to make direct printing to stdout possible. - * src/roff/groff/pipeline.h: Updated. - - * src/utils/afmtodit/afmtodit.pl: Add -v switch. - * src/utils/afmtodit/Makefile.sub (afmtodit): Use @VERSION@. - * src/utils/afmtodit/afmtodit.man: Updated. - - * src/utils/addftinfo/addftinfo.cc (main): Add -v switch. - (version): New function. - (usage): Updated. - * src/utils/addftinfo/addftinfo.man: Updated. - - * src/devices/*/*, src/preproc/*/*, src/roff/*/*, src/utils/*/*: - Fixing copyright dates. - - * src/preproc/eqn/neqn.sh: Adding GROFF_BIN_PATH to path instead of - replacing it. - - * src/devices/grolbp/lbp.cc (main): Use Version_string instead of - version_string. - - * src/roff/nroff/Makefile.sub (nroff): Fix use of @VERSION@. - -2000-11-15 Werner LEMBERG - - In all programs, make -v return immediately with exit status 0 to - be compliant with the GNU standard. - - * src/devices/grodvi/dvi.cc (main), - src/devices/grohtml2/post-html.cc (main), - src/devices/grolbp/lbp.cc (main), src/devices/grolj4/lj4.cc - (main), src/devices/grops/ps.cc (main), src/devices/grotty/tty.cc - (main) src/preproc/eqn/main.cc (main), src/preproc/grn/main.cc - (main), src/preproc/html2/pre-html.cc (main), - src/preproc/pic/main.cc (main), src/preproc/refer/refer.cc (main), - src/preproc/soelim/soelim.cc (main), src/preproc/tbl/main.cc - (main), src/roff/groff/groff.cc (main), src/roff/troff/input.cc - (main): Implement it. - * NEWS: Updated. - - * src/roff/groff/groff.cc (main): Add copyright notice. Add refer - and postprocessors to the -v option. - - * src/roff/grog/grog.pl: Implement -v. - * src/roff/grog/Makefile.sub (grog): Use @VERSION@. - * src/roff/grog/grog.man, doc/groff.texinfo: Updated. - - * src/roff/nroff/nroff.sh: Implement -v. - * src/roff/nroff/Makefile.sub (nroff): Use @VERSION@. - * src/roff/nroff/nroff.man: Updated. - - * src/preproc/eqn/main.cc (main): Fix comment typo. - - * MORE.STUFF: Added info about djgpp port of grap. - -2000-11-14 Werner LEMBERG - - * src/roff/grog/grog.{pl,sh}: Implemented -C switch for compatibility - mode (or rather, implemented non-compatibility mode). - * NEWS, src/roff/grog/grog.man, doc/groff.texinfo: Updated. - - * src/roff/groff/groff.cc (main): Add BIN_PATH to PATH instead of - replacing it -- we don't find gxditview otherwise. - * NEWS, src/roff/groff/groff.man, doc/groff.texinfo: Updated. - - * src/preproc/pic/depend: Removed. Unnecessary. - - Implemented dummy keyword `solid' in pic for compatibility with - AT&T pic. - - * lex.cc (lookup_keyword): Added `solid'. - * pic.y: Added SOLID with dummy rule. - * pic.cc, pic_tab.h: Regenerated. - * doc/pic.ms: Updated. - -2000-11-13 Werner LEMBERG - - For security reasons, don't use the current directory but the home - directory while searching and scanning troffrc and troffrc-end. - Similarly, replace the current directory with the home directory - in the font path. - - * Makefile.in (fontpath, tmacpath): Remove current directory. - - * src/libs/libgroff/searchpath.cc (search_path::search_path): Add - two parameters `add_home' and `add_current'. - (search_path::~search_path, search_path::command_line_dir, - search_path::open_file): Remove tests for `dirs' being zero. - * src/include/searchpath.h: Adjust. - * src/libs/libgroff/macropath.cc, src/include/macropath.h: Add - `safer_macro_path'. - * src/libs/libgroff/fontfile.cc: Adjust `font_path'. - - * src/roff/troff/troff.h: Add `searchpath.h' and `mac_path'. - * src/roff/troff/input.cc: Use `mac_path', initialized with - `macro_path'. - (process_startup_file): Set `mac_path' to `safer_macro_path'. - * src/roff/troff/env.cc: Use `mac_path'. - - * src/preproc/eqn/main.cc (main): Use `safer_macro_path'. - - * NEWS, man/roff.man, src/roff/troff/troff.man, - src/roff/groff/groff.man, tmac/groff_tmac.man, arch/djgpp/README: - Updated. - -2000-11-12 Werner LEMBERG - - * src/include/lib.h: Don't include groff-getopt.h for OSF/1. - - * aclocal.m4 (GROFF_SYS_ERRLIST): Do test in C, not in C++. - * configure.in: Fix typo in comment. - * configure: Regenerated. - - * src/libs/libgroff/*, src/include/*, src/roff/troff/*: Fixing - copyright dates. - -2000-11-08 Werner LEMBERG - - Add system tmac directory (/usr/local/lib/groff/site-tmac). - - * Makefile.in: Add $(libdir), $(libprogramdir), and $(systemtmacdir). - (uninstall_dirs): Add $(libdir), $(libprogramdir), and - $(systemtmacdir). - Use @libdir@. - * Makefile.comm (.man.n): Add @SYSTEMMACRODIR@. - * tmac/Makefile.sub (install_data): Create - $(systemtmacdir) and $(localtmacdir). - (uninstall_sub): Use $(systemtmacdir) for wrapper macros. - * man/roff.man, src/roff/troff/troff.man, src/roff/groff/groff.man, - NEWS, doc/groff.texinfo: Updated and minor fixes. - - * Makefile.comm, Makefile.in: Added tmac_{s,an}_prefix stuff again. - * tmac/Makefile.sub: Added `wrap' stuff again, but installing into - $(systemtmacdir) since the wrapper files are platform-dependent. - -2000-11-01 Werner LEMBERG - - * doc/groff.texinfo: Fix typo. - -2000-10-26 Werner LEMBERG - - Convert macros `tmac.XXX' to `XXX.tmac'. Special cases: - tmac.doc.old -> doc-old.tmac - tmac.an.old -> an-old.tmac - - * tmac/tmac.*: Moved to ... - * tmac/*.tmac: this. - * tmac/man.local: Fix comment. - * tmac/groff_man.man, tmac/groff_markup.man, tmac/groff_mdoc.man, - tmac/groff_me.man, tmac/groff_ms.man, tmac/groff_tmac.man: Updated. - Added some `FILES' sections. More use of @...@ directives. Other - minor updates. - * arch/djgpp/README, font/devutf8/NOTES: Updated. - * doc/homepage.ms, doc/groff.texinfo: Updated. - * man/groff.man, man/roff.man: Updated. - * src/devices/grodvi/grodvi.man, src/devices/grolbp/grolbp.man, - src/devices/grolj4/grolj4.man, src/devices/grops/grops.man, - src/devices/grotty/grotty.man: Updated. - * src/preproc/pic/pic.man: Updated. - * src/roff/grog/grog.pl, src/roff/grog/grog.sh: Use -mdoc-old - instead of -mdoc.old. - * src/roff/grog/grog.man: Document -mdoc and -mdoc-old. - * src/roff/nroff/nroff.man: Updated. - * NEWS: Updated. - - * tmac/fixmacros.sed, tmac/strip.sed: Add explanatory comment. - - * tmac/mm.diff: Removed -- it has no use now since the mm package - is part of groff. - - * tmac/*: Removed trailing spaces. - - * arch/djgpp/t-groff.bat: Fix GROFF_TMAC_PATH (hyphen.us is now in - the tmac subdirectory also). - - * Makefile.comm, Makefile.in: Remove tmac_{s,an}_prefix stuff. - * tmac/Makefile.sub: Adapted to new macro names; removed `wrap' - stuff since it is no longer needed. - - * README, PROBLEMS: Updated. - -2000-10-25 Werner LEMBERG - - Invert current behaviour: Search first FOOBAR.tmac, then - tmac.FOOBAR. - - * src/roff/troff/input.cc: Introduce MACRO_POSTFIX. - (open_mac_file, macro_source): Implement it. - * src/roff/troff/troff.man, tmac/groff_tmac.man, man/roff.man, - doc/groff.texinfo, NEWS: Document it. - - * src/roff/nroff/nroff.man, src/roff/groff/groff.man, man/groff.man: - Small documentation improvements. - - * test-groff: Fix GROFF_TMAC_PATH (hyphen.us is now in the tmac - subdirectory also). - - * font/devps/Makefile.sub: Fix rules for dingbats.*map. - -2000-10-24 Werner LEMBERG - - Add local tmac directory (groff/site-tmac). - - * Makefile.in: Add $(localtmacdir). - (uninstall_dirs): Add $(localtmacdir). - * Makefile.comm (.man.n): Add @LOCALMACRODIR@. - * tmac/Makefile.sub (install_data, uninstall_sub): Handle man.local - in $(localtmacdir). Create $(localtmacdir). - * man/roff.man, src/roff/troff/troff.man, NEWS, doc/groff.texinfo: - Updated and minor fixes. - - Rename font/devps/generate/dingbats[r]map to dingbats.[r]map. - - * font/devps/generate/Makefile.sub, arch/djgpp/README: Adjust. - -2000-10-23 Werner LEMBERG - - Move hyphen.us to tmac directory. - - * src/roff/troff/hyphen.us: Removed. - * src/tmac/hyphen.us: Added. - * src/roff/troff/Makefile.sub, tmac/Makefile.sub: Updated. - - Change installation structure for data files from .../groff/... to - .../groff//... to be conform with other GNU - programs. - - * Makefile.in, Makefile.comm, src/utils/indxbib/Makefile.sub, - doc/Makefile: Implement it. - * aclocal.m4 (GROFF_PAGE): Add test for new directory structure. - * configure: Updated. - * arch/djgpp/README, font/devutf8/NOTES: Use it. - * NEWS: Document it. - * man/roff.man, tmac/groff_tmac.man: Use @FONTPATH@, @FONTDIR@, and - @MACRODIR@ instead of hard-coded directories. - -2000-10-22 Werner LEMBERG - - Implement $GROFF_BIN_PATH environment variable (which defaults to - $bindir) used for child programs of groff and similar wrappers. - - * gendefs.sh: Improve documentation. - * Makefile.comm (,man.n), src/include/Makefile.sub (defs.h), - src/preproc/eqn/Makefile.sub (neqn), - src/roff/nroff/Makefile.sub (nroff): Add $(bindir). - * src/preproc/eqn/neqn.sh, src/roff/nroff/nroff.sh: Implement - $GROFF_BIN_PATH. - * src/roff/groff/groff.cc (main): Implement $GROFF_BIN_PATH and - $GROFF_PATH__ (the latter for communication with troff). - * src/roff/troff/input.cc (main): Use $GROFF_PATH__ for $PATH if - set. - * NEWS, src/roff/nroff/nroff.man, src/roff/groff/groff.man, - doc/groff.texinfo: Document it. - - * doc/groff.texinfo: Improve documentation of troff's -a option. - -2000-10-17 Gaius Mulley - - * src/roff/troff/node.cc: Fixed calculation of opminx and fixed - non-intrusive eol marker. - (troff_output_file::determine_line_limits): New function. - (troff_output_file::draw): Use it. - * src/roff/troff/env.cc (environment::add_html_tag): Use output() + - output_pending_lines() instead of output_line(). - * src/preproc/eqn/main.cc (do_file): Fix graphic_end(). - * src/preproc/html2/pre-html.cc (char_buffer::write_file_troff, - createImage): Small fixes. - -2000-10-14 Werner LEMBERG - - Replace tmac.safer with a real secure solution. - - * src/roff/troff/input.cc (open_request, opena_request, pipe_source, - system_request, pipe_output): Disable requests if in safer mode. - * src/roff/groff/groff.cc (main): Remove reference to tmac.safer. - * tmac/tmac.safer, tmac/groff_msafer.man: Removed. - * tmac/Makefile.sub, NEWS, man/roff.man, tmac/groff_tmac.man, - doc/groff.texinfo, src/roff/groff/groff.man, - src/roff/troff/troff.man, arch/djgpp/README: Updated. - - * src/devices/grops/ps.cc (main), src/devices/grops/psrm.cc - (resource_manager::output_prolog): Replace setenv() with putenv(). - -2000-10-09 Werner LEMBERG - - * src/libs/libbib/map.c, src/libs/libgroff/getcwd.c, - src/libs/libgroff/strtol.c, src/preproc/html2/image.cc, - src/preproc/html2/pre-html.cc, src/preproc/html2/pushbackbuffer.cc, - src/roff/groff/pipeline.c: Removing `#ifndef errno' to avoid - compilation errors with some compilers. It seems that this code - is no longer necessary -- if yes, it is easy to add some #ifdef's - for that particular old-fashioned compiler. - - * MORE.STUFF: Added info about Meta-tbl. - - * doc/groff.texinfo: Added more info about `.if "..."..."'. - -2000-10-07 Werner LEMBERG - - Adding a new escape sequence \B'...': If the string between - the delimiters is a valid numeric expression, return the character - `1', and `0' otherwise. This is an analogon to \A. - - * src/roff/troff/input.cc (do_expr_test): Implement it. - (token::next): Use it. - * src/roff/troff/troff.man, NEWS, man/groff.man: Document it. - - * tmac/tmac.trace: Made independent from escape character. - -2000-10-06 Werner LEMBERG - - Adding a new request .dei: define indirect. The first and second - parameter of .dei are taken from string registers instead directly; - this very special request is needed to make tmac.trace independent - from the escape character (which might even be disabled). - - * src/roff/troff/input.cc (do_define_macro): Implement it. - (define_macro_indirect): New function. - (init_input_requests): Use it. - - Adding two requests .ecs and .ecr: Save and restore the escape - character. These two requests are needed to make tmac.trace - independent from the escape character (which might even be - disabled). - - * src/roff/troff/input.cc (save_escape_char, restore_escape_char): - Implement it. - (init_input_requests): Use it. - - * src/roff/troff/troff.man, NEWS, man/groff.man: Updated. - -2000-09-22 Ricardo Soares Guimarães - - Adding a new option -P and new environment variable GROPS_PROLOGUE - to grops, selecting a different prologue file (minor modifications - by WL). - - * src/devices/grops/psrm.cc (resource_manager::output_prolog), - src/devices/grops/ps.cc (main): Implement it. - * src/devices/grops/grops.man, NEWS: Document it. - -2000-09-22 Werner LEMBERG - - * INSTALL: Add info about selecting paper format. - -2000-09-21 Werner LEMBERG - - * src/roff/troff/input.cc (main): Fixing compiler warning. - * src/include/{driver.h, lib.h}: Move inclusion of string.h and - strings.h from the former to the latter. - * src/devices/grolbp/lpb.cc, src/include/lib.h: Move strncasecmp() - stuff from the former to the latter. - -2000-09-11 Werner LEMBERG - - Implementing two new requests .tm1 and .tmc: The former is similar - to .tm but can output leading spaces; its syntax is similar to - defining a string, i.e., a `"' can be used to mark the beginning of - the string to be written to stderr: `.tm1 " test'. The latter is - similar to .tm1 but doesn't write out a final newline character. - - * src/roff/troff/input.cc (terminal1, terminal_continue, - do_terminal): New functions. - (init_input_requests): Use them. - * src/roff/troff/troff.man, NEWS, man/groff.man: Updated. - -2000-09-09 Werner LEMBERG - - * tmac/groff_mdoc.samples.man: Small fixes. - -2000-09-08 Werner LEMBERG - - * tmac/groff_mdoc.man: Fixing typo. - -2000-09-02 Werner LEMBERG - - Implementing a .nop request which does nothing. - - * src/roff/troff/input.cc (nop_request): New function. - (init_input_requests): Use it. - * src/roff/troff/troff.man, NEWS, man/groff.man: Updated. - -2000-09-01 Werner LEMBERG - - * doc/groff.texinfo: Added some comments. - -2000-08-30 Werner LEMBERG - - * src/roff/troff/TODO: Updated. - -2000-08-25 Werner LEMBERG - - * doc/groff.texinfo: Fix comment how to compile the DVI file. - -2000-08-25 Eli Zaretskii - - * font/devps/generate/Makefile (SHELL): Define explicitly to - "/bin/sh", for non-Unix platforms. - (extraclean): Use a more portable "" quoting instead of a - backslash (which doesn't work on DOS/Windows). - - * font/devlj4/generate/Makefile (extraclean): Ditto. - - * font/devdvi/generate/Makefile (extraclean): Ditto. - -2000-08-25 Werner LEMBERG - - * NEWS, doc/groff.texinfo, tmac/groff_tmac.man, man/roff.man, - src/roff/troff/troff.man: Document Eli's latest changes. - -2000-08-25 Eli Zaretskii - - * src/roff/troff/input.cc (open_mac_file, macro_source): Support - macro file names of the form NAME.tmac as well as tmac.NAME. - -2000-08-25 Werner LEMBERG - - * src/include/posix.h: Remove definition of FILENAME_MAX. - - * src/preproc/html2/pre-html.h, pre-html.cc: Add return type to - `sys_fatal' and `stop' function(). - - * test-groff: Updated. - -2000-08-24 Gaius Mulley - - Added the new troff command .output to suppress output (while - still obeying motion) and also the opminx, opminy, opmaxx, opmaxy - registers (for passing the output dimensions to the output device). - - * src/roff/troff/div.cc (top_level_diversion::output): Use `width' - parameter. - * src/roff/troff/node.h, src/roff/troff/node.cc - (troff_output_file::really_print_line, - ascii_output_file::really_print_line, - supress_output_file::really_print_line): Use `width' parameter. - (troff_output_file::really_on, troff_output_file::really_off, - output_file::on, output_file::off, real_output_file::on, - real_output_file::off, real_output_file::really_on, - real_output_file::really_off): New functions. - (real_output_file:public output_file): New variable `output_on'. - (real_output_file::begin_page, real_output_file::copy_file, - real_output_file::transparent_char, real_output_file::print_line): - Use it. - (real_output_file::print_line): Use check_output_limits. - * src/roff/troff/reg.h, src/roff/troff/request.h, - src/roff/troff/input.cc (assign_registers): New function to remove - two `goto's. - (do_ps_file): Use it. - (check_output_limits, reset_output_registers, output_request, - init_output_requests): New functions. - (init_input_requests): Updated. - - Added new grohtml2 device and html2 preprocessor (coding - not yet finished) which will eventually replace grohtml. - - * Makefile.in, tmac/Makefile.sub, tmac/eqnrc, tmac/troffrc-end: - Updated. - * src/include/htmlindicate.h, src/include/htmlindicate - (html_begin_suppress, html_end_suppress): New functions. - * src/preproc/tbl/main.cc: Use it. - * src/roff/groff/groff.cc: Add support for html2 device (which will - automatically invoke the html2 preprocessor). - * src/roff/troff/input.cc (is_html2): New variable. - * src/roff/troff/troff.h, src/roff/troff/env.h, - src/roff/troff/env.cc (environment::add_html_tag): New function - (uses `is_html2'). - (environment::do_break): Use it. - * font/devhtml2/*: New files. - * src/devices/grohtml2: New device. - * src/preproc/html2: New preprocessor. - * tmac/tmac.html-tags, tmac/tmac.html2: New files. - -2000-08-23 Werner LEMBERG - - * src/devices/grolbp/lbp.cc: Same workaround for sinix as for AIX. - -2000-08-22 Werner LEMBERG - - * src/include/lib.h: Provide a fix for IRIX to not include - groff-getopt.h. - -2000-08-18 Werner LEMBERG - - * configure.in: Don't provide an empty value for SH_SCRIPT_SED_CMD - since some non-GNU sed programs can't handle null regexps. - * configure, src/preproc/eqn/Makefile.sub, - src/roff/grog/Makefile.sub, src/roff/nroff/Makefile.sub: Updated. - - * src/devices/grolbp/lbp.cc: Add an AIX workaround for an autoconf - bug (string.h and strings.h are both needed according to latest - POSIX standard). - - * MORE.STUFF: Added info about unroff and troffcvt. - -2000-08-08 Werner LEMBERG - - * tmac/tmac.a4: Will now work with ms macros also; -ma4 should be - used before -ms. - - * tmac/tmac.man.old: Remove unused number register. - - * tmac.doc: Minor documentation fix. - -2000-08-07 Paul Eggert - - * src/roff/groff/pipeline.c (is_system_shell): - Fix typo: "monocased_shell" no longer exists. - -2000-08-07 Paul Eggert - - Remove FILENAME_MAX limits. - - * src/roff/groff/pipeline.c (is_system_shell): Do not assume - that the argument length is less than FILENAME_MAX. - * src/libs/libgroff/tmpfile.cc (add_tmp_file): Likewise. - Use struct hack to allocate and free file name. - (struct xtmpfile_list): fname is now part of the structure, - not a pointer to another string. - -2000-08-07 Tom Schmidt - - * src/include/posix.h: Add a default value for FILENAME_MAX. - -2000-08-06 Paul Eggert - - Add support for new BSD-style man pages (with ".Dd" instead of - ".TH"), so that "groff -man" understands both styles, even - when running "groff -man" on a host whose system man page - macros don't support ".Dd". - - * tmac/Makefile.sub (NORMALFILES): Add tmac.an.old. - (stamp-wrap): Source tmac.andoc first when wrapping man macros, - in case the system man macros don't define Dd or TH. - - * tmac/tmac.an.old: Renamed from tmac/tmac.an. - * tmac/tmac.an: New one-line file. - * tmac/tmac.andoc (TH): Adjust to the tmac.an.old file renaming. - -2000-08-06 Werner LEMBERG - - * src/roff/troff/troff.man: Fixing typos. - -Version 1.16.1 released -======================= - -2000-07-31 Werner LEMBERG - - Preparing release 1.16.1. - - * REVISION: Revision number set to 1. - * MORE.STUFF: Added info about port to DOS. - * NEWS, win32-diffs: Updated. - - * src/include/nonposix.h: Remove first line -- this file is used - in C also. - - * Makefile.in (dist): Delete Imakefile earlier to avoid a soft - link to it. - -2000-07-30 Werner LEMBERG - - * doc/texinfo.tex: Update to latest version. - -2000-06-28 Paul Eggert - - * Makefile.in (ENVSETUP): Don't assume POSIX make semantics for - commands that fail. Don't assume that "export a=b" is valid shell - syntax. This is needed for Solaris 2.5.1. - - * src/libs/libgroff/tmpfile.cc, src/utils/indxbib/indxbib.cc: Fix - comment about missing Solaris headers. - - * PROBLEMS: Add section about problems with Sun Make and VPATH. - -2000-06-25 Werner LEMBERG - - * src/devics/grodvi/dvi.cc: Replace _setmode() (for MSC) with - SET_BINARY(). - - * src/include/posix.h: Use HAVE_UNISTD instead of _MSC_VER. - - * win32-diffs: Updated. - * README.WIN32: Added CRs to make all Windows editors happy. - - * src/roff/troff/node.cc: Added WIFSIGNALED() macro (copied from - src/roff/groff/pipeline.c). - -2000-06-23 Eli Zaretskii - - * src/roff/grog/Makefile.sub (grog): Prepend `-e' to - $(SH_SCRIPT_SED_CMD), for the case where its value is empty. - -2000-06-17 Eli Zaretskii - - * src/utils/tfmtodit/tfmtodit.cc: #include nonposix.h. - (tfm::load, gf::load): Open tfm and gf files in binary mode: these - are binary files. - (main): Support non-Posix systems with several different styles of - slash characters in file names. - - * src/utils/pfbtops/pfbtops.c: #include nonposix.h. - (main) [SET_BINARY]: Switch stdin into binary mode. - - * src/utils/indxbib/indxbib.cc: #include nonposix.h. - (main): Support file names with several possible slash-type - characters, as given by DIR_SEPS[] in nonposix.h. - (main) [__MSDOS__]: If renaming the temporary index file fails - because it has more than one dot in its trunk, replace the dot - with an underscore and try again. - (do_file): Use FOPEN_RB instead of "r". Skip every CR before a - Newline. - [__MSDOS__ || _MSC_VER]: Stop at the first ^Z character. - - * src/utils/hpftodit/hpftodit.cc: #include nonposix.h. - (File::File): Open the input file in binary mode. Strip CR - characters from each CR-LF pair. - (xbasename): Support file names with several possible slash-type - characters, as given by DIR_SEPS[] in nonposix.h. - - * src/include/Makefile.sub (HDRS): Add nonposix.h. - - * src/roff/troff/node.cc [HAVE_UNISTD_H]: Include . - (WIFEXITED, WEXITSTATUS, WTERMSIG, WIFSTOPPED, WSTOPSIG) - [!_POSIX_VERSION]: Define for traditional Unix systems. - (real_output_file::real_output_file): Remove the MSVC-specific - call to popen, use instead POPEN_WT, appropriately defined on - nonposix.h. #include nonposix.h. - (real_output_file::~real_output_file): Remove the MSVC-specific - call to pclose, a suitable macro is now defined on nonposix.h. - Use the portable macros WIFEXITED, WIFSIGNALED, WTERMSIG, WSTOPSIG - and WEXITSTATUS instead of assuming traditional Unix - interpretation of the status returned by pclose. - - * src/roff/troff/input.cc (pipe_source): Remove the MSVC-specific - call to popen, use POPEN_RT instead (appropriately defined on - nonposix.h). #include nonposix.h. - (ps_bbox_request): Open the PostScript file in binary mode. - Close the file after processing it. - (getpid) [_MSC_VER]: Remove; a suitable macro is now defined on - nonposix.h. - - * src/roff/groff/pipeline.c (run_pipeline) [__MSDOS__ || _WIN32]: - A version of run_pipeline that doesn't use `fork'. - (signal_catcher) [__MSDOS__ || _WIN32]: New function. - (system_shell_name, system_shell_dash_c) - (is_system_shell) [__MSDOS__ || _WIN32]: New functions, to hide - the ugliness of testing DOS/Windows file names for equality, and - support both stock shells and ports of Unix shells. - - * src/roff/groff/groff.cc: #include nonposix.h. - (BSHELL): Definition moved to nonposix.h. - (main): Use PATH_SEP[0] instead of literal ':'. Use BSHELL_DASH_C - instead of a literal "-c". - (xbasename): Support file names with several possible slash-type - characters, as given by DIR_SEPS[] in nonposix.h. - (possible_command::print): Use BSHELL_DASH_C and IS_BSHELL instead - of literal strings. - - * src/preproc/soelim/soelim.cc: #include nonposix.h. - (do_file): Use IS_ABSOLUTE instead of testing for a literal '/'. - - * src/preproc/pic/Makefile.sub (YTABH): Change pic.tab.h to - pic_tab.h. - - * src/preproc/pic/lex.cc: Change pic.tab.h to pic_tab.h. - - * src/preproc/eqn/Makefile.sub (YTABH): Rename eqn.tab.h to - eqn_tab.h. - - * src/preproc/eqn/lex.cc: #include eqn_tab.h, not eqn.tab.h. - - * src/libs/libgroff/tmpfile.cc (DEFAULT_TMPDIR) [P_tmpdir]: If - P_tmpdir is defined, use it instead of the literal "/tmp". - (remove_tmp_files, add_tmp_file): New functions. - (xtmpfile): Record temporary files and register an atexit function - to delete them explicitly, instead of relying on the OS to do - that, which doesn't work on non-Unix systems. - - * src/libs/libgroff/searchpath.cc: #include nonposix.h. - (search_path::search_path): Use PATH_SEP instead of a literal - colon. - (search_path::command_line_dir): Ditto. - (search_path::open_file): Use IS_ABSOLUTE, PATH_SEP and DIR_SEPS, - to support non-Posix systems. - - * src/libs/libbib/search.cc: #include nonposix.h. - (search_list::add_file): Open the file in binary mode. - - * src/libs/libbib/linear.cc: #include nonposix.h. - (file_buffer::load): Remove \r characters preceding \n from the - loaded buffer. - - * src/libs/libbib/index.cc: #include nonposix.h. - (make_index_search_item): Open index_filename in O_BINARY mode. - (index_search_item_iterator::get_tag): Ditto. Remove \r - characters before \n characters. - (index_search_item::check_files): Open files in binary mode. - (index_search_item::munge_filename): Support DOS-style file names - with backslashes and drive letters, use IS_ABSOLUTE. - - * src/devices/grops/ps.cc: #include nonposix.h. - (main) [SET_BINARY]: Switch stdout to binary mode. - - * src/devices/grolj4/lj4.cc: #include nonposix.h. - (main) [SET_BINARY]: Switch stdout to binary mode. - - * src/devices/grolbp/lbp.cc: #include nonposix.h - (fill_pattern) [SET_BINARY]: Switch stdout to binary mode. - - * src/devices/grodvi/dvi.cc: #include nonposix.h. - [_MSC_VER]: Remove inclusion of Windows-specific headers (done by - nonposix.h). - (main) [SET_BINARY]: Switch stdout to binary mode. - [_MSC_VER]: Remove an explicit call to _setmode. - - * src/include/nonposix.h: New file. - - * Makefile.in (ENVSETUP): New variable, to set up case-sensitive - operation when building with DJGPP. - ($(TARGETS), dot, $(LIBDIRS), $(CPROGDIRS), $(CCPROGDIRS)) - ($(DEVDIRS), $(TTYDEVDIRS), $(INCDIRS), $(OTHERDIRS)): Use - ENVSETUP. - - * Makefile.comm: mv y.tab.[ch] to y_tab.[ch], to make it work on - MS-DOS. - (.man.n): Replace `;' with `|', since FONTPATH, MACROPATH, - etc. can include a semi-colon on DOS/Windows. - (depend.temp): Use depend1.temp instead of depend.temp1, to - prevent files from overerwiting each other on 8+3 filesystems. - - * gendef.sh (t): Change definition to work with DOS/Windows. - - doc/groff.texinfo: Apart of some typo corrections, I also changed - some index entris, to make them more non-ambiguous, and also put - @ignore around some parts that are not yet written, to allow the - Info output be readable. - -2000-06-10 Gael Queri - - Replaced specific checks for function declarations with a generic - routine taken from GNU bfd. - - * aclocal.m4 (GROFF_NEED_DECLARATION): New function. - GROFF_PUTENV, GROFF_POPEN, GROFF_PCLOSE, GROFF_HYPOT: Removed. - * configure.in: Use it. - * src/devices/grolbp/lbp.cc, src/include/lib.h, - src/preproc/grn/hgraph.cc, src/preproc/pic/pic.h, - src/roff/groff/groff.cc: Use it. - * Makefile.in, configure: Updated. - -2000-06-07 Paco Andrés Verdú - - * src/devides/grolbp/lbp.h: Removed unused variables. - -2000-05-31 Keith Thompson - - * src/devices/grolbp/lbp.cc (set_papersizes): Add declaration of - strncasecmp(). - -2000-05-31 Werner LEMBERG - - * aclocal.m4 (GROFF_SRAND): New function to test the return value - of srand() -- at least SunOS 4.1.3 uses `int' instead of `void'. - * configure.in: Use it. - * src/preproc/pic/pic.y, src/preproc/pic/pic.cc: Use it. - * configure, Makefile.in: Updated. - - * configure.in: Add test for strncasecmp(). - * src/include/lib.h: Use it. - -2000-05-29 Andrej Borsenkow - - * src/preproc/grn/Makefile.sub: Add MLIB. - -2000-05-29 Nix - - * Makefile.in: Use @datadir@ and @mandir@ appropriately. - -2000-05-29 Werner LEMBERG - - * src/roff/grog/Makefile.sub, src/roff/grog/grog.sh: Add `@g@'. - - * PROBLEMS: Small update. - - * src/devices/grolbp/lbp.cc: Various small fixes. - -2000-05-28 Keith Thompson - - * src/roff/nroff/nroff.sh: Fix main loop syntax. - - * src/utils/indxbib/indxbib.cc: Add declaration of mkstemp(). - -2000-05-25 Werner LEMBERG - - * man/roff.man: Removed unused macro. - -2000-05-24 Werner LEMBERG - - * Makefile.in (dist): Remove src/xditview/Imakefile explicitly. - This is needed e.g. if you do - `make distclean; ./configure; make dist'. - -Version 1.16 released -===================== - -2000-05-23 Werner LEMBERG - - Adding font CWI (constant width italic) to devdvi. - - * font/devdvi/CWI: New file. - * font/devdvi/generate/Makefile: Add generating rule. - * font/devdvi/DESC.in, font/devdvi/Makefile.sub, win32-diffs, - tmac/tmac.dvi: Use it. - * NEWS: Announce it. - - * font/devlj4/*: Regenerated (only adding kernings for `cq' glyph). - * font/devlj4/generate/Makefile: Cosmetic changes only. - - * man/groff.man: Removed most of the redundant description of - special characters (which is in groff_char.man). Added font - translation CB->CR for devdvi. Other minor fixes. - - * tmac/tmac.dvi: Improved appearance of \(co (copyright) and \(rg - (registered) symbols. - -2000-05-22 Werner LEMBERG - - * doc/Makefile: Added rule for creating info files. - - * font/devdvi/*: Added kernings for `cq' glyph. Updated to latest - AMS font metrics. - * font/devdvi/generate/Makefile: Fixed dependencies. - - * font/devps/*: Regenerated. Heavy changes for Bookman and - NewCentury Schoolbook! - * font/devps/generate/afmname: Will now run with GNU awk. - * font/devps/generate/textmap: Added forgotten `cq' glyph name. - * font/devps/generate/Makefile: Cosmetic changes only. - -2000-05-21 Werner LEMBERG - - * tmac/tmac.an: Added a new command line option `-rSxx' (`xx' can be - 10, 11, or 12) to support output with 11pt and 12pt base font sizes. - `.SS' now produces a heading with a smaller size than `.SH'. - Completely formatted. - * doc/groff.texinfo, tmac/groff_man.man, NEWS: Document it. - - * man/groff.man: Improved table appearance. Use of `eo' request - to reduce number of doubled backslashes in macro definitions. - Replacing `\e' with `\(rs'. Other minor fixes. - - * src/preproc/tbl/main.cc: Insert HTML table end tag before `lf' - to have correct line number. - - * INSTALL: Small improvement. - -2000-05-20 Bernd Warken - - * man/roff.man, tmac/groff_tmac.man: Updates (with corrections by - WL). - -2000-05-19 Bernd Warken - - * man/groff.man: Complete update (with a lot of corrections by WL). - -2000-05-18 Werner LEMBERG - - Adding `cq' (PS name `quoteright') glyph name as an alias for "'". - - * font/*/*: Implement it. - * man/groff_char.man, NEWS: Document it. - - * src/include/unix.h: Removed. It isn't used. - - * doc/groff.texinfo: Slight improvements. - -2000-05-17 Werner LEMBERG - - * README, win32-diffs: Small fixes and improvements. - -2000-05-16 Werner LEMBERG - - * FDL: New file (the Free Documentation License version 1.1). - - * doc/groff.texinfo: Added many start-up values for gtroff. - Some structural improvements of the source code. - -2000-05-15 Werner LEMBERG - - * src/roff/troff/input.cc: Added small comment about troffrc-end. - * src/roff/troff/troff.man: Added info about troffrc-end. - -2000-05-14 Werner LEMBERG - - * Makefile.in (EXTRADIRS): Fix typos. - (dist): Handle deletion of old .tar.gz file correctly. - (DISTDIRS): Include all tty output devices. - - * doc/groff.texinfo: Adding more cross references; countless other - fixes. - -2000-05-13 Werner LEMBERG - - * MORE.STUFF: Added Robert Marks's utilities. - -2000-05-12 Werner LEMBERG - - Added win32 port contributed by Blake McBride - . - - * README.WIN32, win32-diffs: New files. - * NEWS: Updated. - - * src/preproc/grn/hgraph.cc (HGSetBrush): Replace `%lf' with `%f'. - (tmove, tmove2): Added parentheses to avoid compiler warnings. - (change): Removed unused variables. - - * src/preproc/grn/main.cc (main, conv): Removed unused variables. - (savebounds): Changed return value from `int' to `void'. - * src/preproc/grn/hdb.cc: Ditto. - - * src/devices/grolbp/lbp.cc (lbp_printer::draw): Removed superfluous - final backslash in comment to avoid compiler warning. - - * src/utils/pfbtops/pfbtops.c: Added `getopt.h'. - - * doc/groff.texinfo: More fixes. - -2000-05-11 OKAZAKI Tetsurou - - * tmac/tmac.doc: Documentation fix. - -2000-05-11 Werner LEMBERG - - * doc/groff.texinfo: Reading the source code shows up a lot of - omissions and incorrect data... More conversion to @Deffn macros. - -2000-05-10 Werner LEMBERG - - * src/roff/troff/reg.cc (number_value_to_ascii): Remove ASCII - dependency. - - * src/roff/troff/request.h: Removing unused `no_break_flag'. - -2000-05-09 Werner LEMBERG - - * man/groff.man, man/roff.man, tmac/groff_tmac.man: Minor - improvements. - - * doc/groff.texinfo: Extended history section. More conversion to - @Deffn macros. More .tr documentation. - -2000-05-07 Werner LEMBERG - - * doc/groff.texinfo: Completed tab section. Added info about - fields. - -2000-05-06 Mike MacIsaac - - * PROBLEMS: Describe configure script fix for OS/390 Unix. - -2000-05-05 Werner LEMBERG - - * font/devdvi/DESC.in: Change size 11pt to 10.95pt (as used in - LaTeX 2e). - * NEWS: Document it. - - * man/troff.man: Minor optical improvements. - -2000-05-03 Werner LEMBERG - - Adding `dq' (PS name `quotedbl') glyph name as an alias for `"'. - - * font/*/*: Implement it. - * man/groff_char.man, NEWS: Document it. - -2000-05-02 Werner LEMBERG - - * tmac/groff_tmac.man, man/groff.man, man/roff.man: Fixing @MANxEXT@ - expansion. - * NEWS: Document the three new man pages. - - * aclocal.m4 (GROFF_CXX_CHECK): Removing obsolete AC_C_CROSS call. - * configure: Updated. - - * font/devcp1047/R.proto: Fixing fatal bug (a missing `"' character). - -2000-05-01 Werner LEMBERG - - Added grap support to grog. - - * src/roff/grog/grog.sh, src/roff/grog/grog.pl: Implement it. - * src/roff/grog/grog.man: Document it. - - * doc/groff.texinfo, NEWS: Add info about grap support. - - Add new man pages comptributed by Bernd Warken - (with slight fixes by me). - - * tmac/groff_tmac.man: New file documenting tmac mechanism. - * tmac/Makefile.sub: Add groff_tmac.man. - * man/roff.man: New file giving overview of roff system. - * man/troff.man: A short reference of troff. - * man/Makefile.sub: Add roff.man and troff.man. - -2000-04-30 Werner LEMBERG - - Added grap support to groff. - - * src/roff/groff/groff.cc: Implement it. - * src/roff/groff/groff.man: Document it. - - * src/devices/grotty/grotty.man: Add cp1047 device. - * src/preproc/eqn/eqn.man, src/preproc/eqn/neqn.sh, tmac/eqnrc: - Ditto. - * src/roff/groff/groff.man: Ditto. - * src/roff/nroff/nroff.sh, src/roff/nroff/nroff.man: Ditto. - * doc/groff.texinfo: Ditto. - - * tmac/troffrc: Fix mapping of latin-1 char 160 (non-breakable space) - for cp1047. - -2000-04-29 Werner LEMBERG - - * man/groff_char.man: Add `pc' glyph. - * tmac/tmac.latin1: Replacing `md' glyph with `pc'. - * tmac/tmac.tty: Add `pc' glyph. - * tmac/tmac.tty-char: Use/add `pc' glyph. Don't call tmac.latin1 if - we use cp1047 output device. - - * Makefile.in, aclocal.m4: Don't build utf8 on EBCDIC hosts since - there are still hardcoded latin1->unicode values in utf8's font - definition files. - * configure: Updated. - * NEWS: Minor clarification. Updated. - - * PROBLEMS: Formatted. Added info about C++ fix pack for OS/390 - Unix. - -2000-04-28 Werner LEMBERG - - Adding EBCDIC code page 1047. - - * font/devcp1047/R.proto, font/devcp1047/Makefile.sub, - font/devcp1047/DESC.proto: New files. - - * aclocal.m4 (GROFF_EBCDIC): Introduce TTYDEVDIRS which can be - either ascii/latin1 or cp1047. - * Makefile.in: Use it. - * configure: Updated. - - Replacing and/or adding `md' (mathdot) glyph with `pc' - (periodcentered) in all text fonts. - - * font/*/*: Change it. - -2000-04-27 Werner LEMBERG - - * aclocal.m4 (GROFF_OS390): Fixing compiler flags. - - * configure.in: Add check for strings.h. - * src/include/driver.h: Use HAVE_STRINGS_H. - * src/devices/grolbp/lpb.cc: Remove string.h. - - * src/include/groff-getopt.h: New file. It will be used instead of - getopt.h (to be included in lib.h) to avoid endless problems with - picky C++ compilers. - * src/include/lib.h: Use groff-getopt.h. - * src/include/Makefile.sub: Updated. - - * configure: Updated. - * Makefile.in: Updated. - - * NEWS: Mention EBCDIC support. - -2000-04-26 Werner LEMBERG - - * TODO: Some additions. - -2000-04-25 Werner LEMBERG - - * src/roff/troff/troff.man, doc/groff.texinfo: Fixing documentation - of mso request. - -2000-04-23 Werner LEMBERG - - * src/roff/troff/troff.man: Minor fixes. - -2000-04-22 Werner LEMBERG - - * src/roff/troff/troff.man, doc/groff.texinfo, NEWS: Document the - `.T' string register and the incompatible definition of the `.T' - number register (compared to Unix troff). - - * man/groff_char.man: Add some missing characters. - * font/devutf8/NOTES: Update. - -2000-04-21 Werner LEMBERG - - * src/include/htmlindicate.h, src/include/lib.h, - src/include/posix.h: Fix copyright. - - * src/include/Makefile.sub: Update. - -2000-04-20 Werner LEMBERG - - * src/roff/troff/input.cc (input_char_description): Removing - superfluous space char. - - * tmac/tmac.X: Fix typo \(bq -> \(Bq. - - * doc/groff.texinfo: Document EBCDIC. - -2000-04-19 Werner LEMBERG - - Introducing `shc' as the glyph name for the soft hyphen character. - - * tmac/tmac.tty, tmac/tmac.latin1, tmac/tmac.html, - font/devlatin1/R.proto: Use it. - - * NEWS: Updated. - -2000-04-18 Werner LEMBERG - - * src/devices/grops/ps.cc (ps_printer::flush_sbuf): Removing - dependency on ASCII order. - -2000-04-16 Sandor BARANY - - * src/libs/libgroff/illegal.c: Added EBCDIC table. - * src/roff/troff/input.cc: Added adaptation to EBCDIC. - - * src/preproc/refer/refer.cc, src/roff/troff/env.cc: Minor changes - to increase portability. - -2000-04-15 Werner LEMBERG - - * aclocal.m4: Added GROFF_EBCDIC and GROFF_OS390 tests. - Redefined AC_OUTPUT_MAKE_DEFS to replace ASCII character `012' with - the generic `\n' if under OS/390 Unix. - - * configure.in: Call GROFF_EBCDIC and GROFF_OS390. - - * configure: Regenerated. - -2000-04-14 Werner LEMBERG - - * doc/groff.texinfo: More conversions to @Deffn. - -2000-04-12 Werner LEMBERG - - * tmac/tmac.psfig: Fix incorrect use of `&' operator by replacing it - with `:'. - - * src/roff/nroff/nroff.man: Add note about tmac.tty-char. - -2000-04-10 Werner LEMBERG - - * doc/groff.texinfo: More conversions to @Deffn. - -2000-04-08 Werner LEMBERG - - * src/libs/libgroff/{getopt.c,getopt1.c}, src/include/getopt.h: - Updated to latest version (glibc 2.1.3). - -2000-04-07 Werner LEMBERG - - * doc/Makefile (clean): Include more index files. - Add rule texinfo->dvi. - -2000-04-05 Werner LEMBERG - - * doc/groff.texinfo: Added new index `op' for operators. More - info on end of sentence characters. More use of @Deffn. - -2000-03-30 Werner LEMBERG - - * */*.man: Adding a note that a whitespace can be inserted between - a command line option and its parameter -- we are using GNU getopt. - - * src/roff/groff/groff.man: Add example of `-m mandoc'. - -2000-03-28 Werner LEMBERG - - Correct anachronism of calling the man macro file with `-man' - instead of `-m man' etc. - - * tmac/tmac.man, tmac/tmac.mandoc, tmac/tmac.markup, tmac/tmac.mdoc, - tmac/tmac.me, tmac/tmac.ms: New files tmac.m which simply - load tmac.. - - * tmac/Makefile.sub: Updated. Take care of $(tmac_an_prefix) etc. - - * NEWS: Updated. - - * doc/groff.texinfo: Updated. - - * tmac/groff_man.man: Copyright added. - -2000-03-27 Werner LEMBERG - - * doc/groff.texinfo: Introducing macros `Deffn' and `Defmac' to - typeset the request resp. escape name with a tt font -- due to a - bug in texinfo.tex it is necessary to use the `-e' switch with - texi2dvi. - - Improving info about usage of groff units. - - Other minor fixes. - -2000-03-20 Werner LEMBERG - - * doc/groff.texinfo: Added section about man macro package - (I've basically taken groff_man.man). Introducing new indices `ma' - for macros/strings and `gl' for glyph names. Other minor fixes. - - * tmac/groff_man.man: Fixed some typos. - -2000-03-19 Werner LEMBERG - - * doc/groff.texinfo: Removed all occurrences of `you', `we', etc. - Other minor fixes. - - * doc/texinfo.tex: New file. - -2000-03-18 Werner LEMBERG - - * doc/groff.texinfo: Improved section on number registers. Other - minor updates. - -2000-03-16 Werner LEMBERG - - * src/roff/groff/groff.man: Added info about grolbp. Make nicer - synopsis. - - * src/devices/grolbp/grolbp.man, src/roff/nroff/nroff.man, - src/devices/grolj4/grlj4.man, src/devices/grops/grops.man, - src/preproc/eqn/eqn.man, src/utils/afmtodit/afmtodit.man, - src/utils/tfmtodit/tfmtodit.man: Make nicer synopsis. - - * src/preproc/grn/grn.man: Better synopsis; added copyright. - - * src/roff/grog/grog.man: Updated copyright date. - -2000-03-14 Francisco Andrés Verdú - - * configure.in: Added test for strdup. - - * src/devices/grolbp/lbp.cc: Added a strdup() version in case none - is available. - - Replaced dynamic allocation of arrays `[...]' with `new' operator. - - Other minor fixes. - -2000-03-12 OKAZAKI Tetsurou - - * Makefile.comm: Add $(INCLUDES) to $(ALL_CFLAGS). - -2000-03-11 Werner LEMBERG - - * src/preproc/grn/hdb.cc (DBGetType): Added return value to make - compilers silent. - * src/preproc/grn/hgraph.cc: Add #ifdef for hypot(). - * src/include/lib.h: Remove some spaces. - -2000-03-10 Werner LEMBERG - - * src/libs/libgroff/tmpfile.cc (xtmptemplate, xtmpfile): Removing - initializers from arguments (some compilers don't like this). - -2000-03-09 Gaius Mulley - - * src/libs/libgroff/htmlindicate.cc: Added library file which is now - used by pic and eqn to tell grohtml where the graphic regions start - and end. - * src/libs/libgroff/Makefile.sub: Use it. - * src/preproc/eqn/main.cc, src/preproc/pic/troff.cc: Altered to use - graphic_start() and graphic_end() from htmlindicate.cc. - -2000-03-09 Werner LEMBERG - - * tmac/tmac.safer: Will now work correctly in compatibility mode. - * tmac/groff_man.man: More fixes. - -2000-03-08 Werner LEMBERG - - * doc/Makefile: Added texput.log to the `clean' target. - * doc/groff.texinfo: Added info about delimiters for escapes. - -2000-03-08 Bernd Warken - - * src/preproc/pic/pic.man: Add info on conversion of pic images to - other graphic formats. - -2000-03-07 OKAZAKI Tetsurou - - * Makefile.in, Makefile.sub, src/preproc/eqn/Makefile.sub, - src/roff/groff/Makefile.sub, src/roff/nroff/Makefile.sub, - src/utils/afmtodit/Makefile.sub: Use $(INSTALL_SCRIPT) for script - files. - -2000-03-07 Werner LEMBERG - - * doc/groff.texinfo: Spelling fixes. - -2000-03-06 Werner LEMBERG - - * tmac/groff_man.man: Completely revised to cover everything in - tmac.an. - - * doc/groff.texinfo, src/roff/troff/troff.man: Document evc request. - Other minor fixings. - * src/roff/troff/env.cc (environment_copy): Improve error message and - fix itoa->i_to_a. - * src/roff/troff/TODO: Updated. - - * doc/Makefile: Bug fixes -- this is still provisional, though... - - * tmac/eqnrc: Small fixes. - -2000-03-05 Abramo Bagnara - - Adding a request `evc' to copy environments. - - * src/roff/troff/env.cc (environment::copy, environment_copy): - Implement it. - * src/roff/troff/env.h: Add prototype. - -2000-03-05 Francisco Andrés Verdú - - Adding strsep() -- Solaris 8 doesn't have it. - - * configure.in: Test it. - * src/devices/grolbp/lbp.cc: Add code. - -2000-03-05 Werner LEMBERG - - * src/roff/troff/div.cc (macro_diversion::output, - top_level_diversion::output): Fixing an incompatibility with - original troff: \x'0' updates the .a register also. Thanks to - for pointing this out. - * doc/groff.texinfo: Document it. - - * Makefile.in: Create Makefile.dep if necessary before calling the - submake process to avoid warning about nonexistent file. - - * NEWS, PROJECTS: Updated. - -2000-03-04 Werner LEMBERG - - * tmac/troffrc: Add tmac.lbp. - -2000-03-03 Francisco Andrés Verdú - - * tmac/tmac.lbp: New file. - * src/devices/grolbp/grolbp.man: Add documentation of `lbpname' - command. - -2000-03-03 Werner LEMBERG - - * Makefile.in: Fixing $(subdir). - - * README, NEWS: Small fixes. - - * test-groff: Adding path to grolbp. - - * configure.in: The (new) file src/xditview/Imakefile.in will be - also configured -- it is now possible to build gxditview in a - directory different from $srcdir. - -2000-03-02 Blake McBride - - * src/libs/libgroff/searchpath.cc (open_file): Adapting to WinNT. - - * MORE.STUFF: Added website of bell labs and info about plot2dev. - -2000-03-01 Colin Phipps - - * src/utils/indxbib/indxbib.cc (main): Use mkstemp() for temporary - files. - -2000-02-29 Werner LEMBERG - - Adding GNU getopt to the groff distribution. - - * src/include/getopt.h, src/libs/libgroff/{getopt.c,getopt1.c}: - New files. - * src/include/Makefile.sub, src/libs/libgroff/Makefile.sub: Update. - * aclocal.a4: Remove GROFF_GETOPT function. - * configure.in, Makefile.in, PROBLEMS: Update. - * src/include/lib.h: Replace getopt tests with getopt.h. - * src/devices/grolbp/lpb.cc: Remove inclusion of getopt.h. - - * doc/groff.texinfo: Further checking/updating. Adding more index - entries. - - * man/groff_out.man: Fix nroff mode activation (for emacs). - * man/groff_font.man: Add missing ligature. - -2000-02-28 Werner LEMBERG - - * doc/groff.texinfo: Further checking/updating. Adding more index - entries. - - * src/devices/grolbp/grolbp.man: Added a comment line at the - beginning of the file (similar to shell scripts) which indicates - that `tbl' should be used as a preprocessor. - -2000-02-27 Blake McBride - - Adapting groff to MS Visual C++ 6.0 compiler (tested with - Windows NT 4.0). Uses _MSC_VER define where necessary. - - * src/devices/grodvi/dvi.cc: Making stdout a binary stream. - * src/devices/grolj4/lj4.cc: Making getopt variables `extern "C"'. - * src/devices/grohtml/html.cc, src/devices/grops/ps.cc, - src/include/lib.h, src/libs/libgroff/errarg.cc, - src/libs/libgroff/itoa.c, src/libs/libgroff/nametoindex.cc, - src/preproc/refer/label.y, src/preproc/refer/label.cc, - src/roff/groff/pipeline.c, src/roff/troff/column.cc, - src/roff/troff/div.cc, src/roff/troff/env.cc, - src/roff/troff/input.cc, src/roff/troff/node.cc, - src/roff/troff/reg.cc: Renaming itoa() to i_to_a() and iftoa() to - if_to_a() to avoid name clashes. - * src/include/posix.h: Don't use unistd.h. - * src/libs/libgroff/tmpfile.cc: Use `#ifndef...#else...#endif' - clause for integrating non-Unix xtmpfile() code. - * src/roff/troff/input.cc: Adding `public' keyword to macro_header - structure; use "rt" for popen() in pipe_source(); add getpid() - dummy function. - * src/roff/troff/node.cc: Use special versions of popen() in - real_output_file() and pclose() in ~real_output_file(). - -2000-02-27 Werner LEMBERG - - Adding a new driver, grolbp, for Canon CAPSL printers (LBP-4 and - LBP-8 series laser printers). This code has been contributed by - Francisco Andrés Verdú . - - * src/devices/grolbp/*: The grolbp output device. - * font/devlpb/*: The font description files. - * Makefile.in: Add grolpb and devlbp subdirectories. - - * src/devices/grodvi/grodvi.man, src/devices/grolj4/grolj4.man, - src/devices/grotty/grotty.man,src/roff/troff/troff.man: Minor - typographic fixes. - - * doc/groff.texinfo: Further checking/updating. Adding more index - entries. - - * NEWS: Updated. - - * src/devices/grolbp/Makefile.sub: Adding $(srcdir). - - * man/groff_font.man: Adding info about obsolete DESC keywords. - * src/devices/grolj4/grolj4.man: Documenting additional DESC - keywords. - -2000-02-26 Werner LEMBERG - - * src/preproc/grn/grn.man: Added info about the gremlin file format - (contributed by Daniel Senderowicz ). - -2000-02-25 Werner LEMBERG - - * src/preproc/grn/main.cc: Allow values of `narrow' parameter and - friends to be non-integer. - - * src/preproc/grn/grn.man: Document it. - - * doc/groff.texinfo: Further checking/updating. Adding more index - entries. - -2000-02-24 Werner LEMBERG - - * src/preproc/grn/main.cc: Introduce BASE_THICKNESS, defining - line thicknesses to be integer multiples of this value. - - * src/preproc/grn/grn.man: Commenting out the -s option -- the - corresponding code doesn't work (yet). - - * doc/groff.texinfo: Further checking/updating. Adding more index - entries. - -2000-02-23 Werner LEMBERG - - * src/preproc/grn/{main.cc, hgraph.cc}: Using point units to - specify line thickness instead of base units. The new default - values are now 0.15,pt 0.45pt, and 0.75pt for thin, middle, and - thick lines respectively. - - Removed unused variable `prevval'. - - * src/preproc/grn/grn.man: Updated. - -2000-02-22 Werner LEMBERG - - * src/preproc/grn/main.cc: Slight formatting. - - * src/roff/groff/groff.man: Formatting fix. - * src/preproc/grn/grn.man: Ditto. - - * src/roff/grog/grog.pl: Fixing two embarassing bugs. - - * doc/groff.texinfo: Further checking/updating. - -2000-02-21 Werner LEMBERG - - * README, INSTALL, PROJECT, PROBLEMS, BUGREPORT: Updated. - - * test-groff: Added grn subdir to path. - - * doc/groff.texinfo: Some restructing and other small improvements. - - * src/roff/groff/groff.cc (help): Fixed info string. - -2000-02-20 Werner LEMBERG - - * doc/meref.me: Fix description of .GS request. - - * src/roff/troff/troff.man: Fixing typo. - - Adding the `grn' preprocessor for gremlin graphic files. - - * src/preproc/grn/*: This is the Berkeley distribution written by - David Slattengren and Barry Roitblat, adapted to groff by Daniel - Senderowicz and Werner Lemberg. - - * doc/grnexampl.{me,g}: A sample for grn. - - * Makefile.in: Added subdirectory entry for grn. - - * src/roff/groff/groff.cc: Added support for grn. It can be now - called with the switch `-g'. - - * src/roff/groff/groff.man: Updated. - - * src/roff/grog/grog.{man,pl,sh}: Updated. - - * NEWS: Updated. - -2000-02-11 Gaius Mulley - - * src/include/lib.h: Added xtmptemplate and made xtmpfile - parametrically polymorphic. - - * src/libs/libgroff/tmpfile.cc: Implemented xtmptemplate - and the alterations to xtmpfile. - xtmpfile can be requested to return the filename created - and asked not to unlink the temp file. The default behaviour - if parameters are absent is exactly the same as before. - -2000-02-11 Abramo Bagnara - - A new request `length' is available which returns the length of a - string in a number register: - - * src/roff/troff/input.cc (length_macro): Implement it. - * src/roff/troff/input.cc (init_input_requests): Register it. - -2000-02-11 Werner LEMBERG - - * doc/groff.texinfo, src/roff/troff/troff.man: Add documentation - of the `substring' request. - - * src/roff/troff/troff.man, doc/groff.texinfo: Document `length' - request. - - * src/roff/troff/TODO, NEWS: Updated. - -2000-02-09 Werner LEMBERG - - * src/roff/groff/groff.man: Added an example. - -2000-02-06 Werner LEMBERG - - I've considerably modified the directory structure of the - distribution to get a more vertical layout. For example, the number - of top level directories has been reduced from 42 to 6. - - As a consequence, many changes, especially to the makefiles, were - necessary: - - * The makefile variables `top_builddir' and `top_srcdir' have been - introduced. Virtually all relative paths have been replaced with - absolute ones using these two variables. - - * Dependencies (in the files `Makefile.dep') are no longer part of - the distribution. Instead, they are created during a `make install' - in the build directory. - - * aclocal.m4 (GROFF_SRCDIR, GROFF_BUILDDIR): Two new functions to - make `top_srcdir' and `top_builddir' absolute. - - Some other changes: - - * Man pages now depend on the files `VERSION' and `REVISION'. - - * The added shell script `mkinstalldirs' will replace `mkdir' in - almost all cases. - - * VERSION: Version number increased to 1.16. - -2000-02-04 Werner LEMBERG - - * grops/psrm.cc (read_one_of): Fixed pointer incrementation. - - * Makefile.in: Removed $(tmac_m) since it is no longer needed - (after an update of the mm stuff). - - * troff/Makefile.sub (majorminor.cc): Fix dependencies. - -2000-02-03 Werner LEMBERG - - The .psbb request will now also accept Mac PS images (i.e. using LF - as the EOL character). - - * troff/input.cc (ps_get_line): New function, taken from psrm.cc - (with slight modifications). - * troff/input.cc (do_ps_file): Use it. - - * test-groff: Add grohtml and grolj4 output devices to PATH. - -2000-01-30 Werner LEMBERG - - * NEWS, MORE.STUFF: Updated. - -2000-01-30 Cary D. Renzema - - Add the `srand' command to pic. - - * pic/lex.cc, pic/pic.y: Implement it. - * pic/pic.man: Document it. - * pic/pic.cc, pic/pic.tab.h: Regenerated (with yacc). - -2000-01-30 Werner LEMBERG - - Add a new request `.psbb'. This does exactly what the external - program psbb did. It scans a PostScript image file for a - %%BoundingBox comment and extracts the bounding box values (in - PostScript units) which are then stored in the four new (read-only) - number registers `llx', `lly', `urx', and `ury'. - - This will allow the usage of the .PSPIC macro without worrying - about unsafe behaviour of groff, i.e., it will work without the - `-U' switch of groff. - - * troff/input.cc: Implement it. - * tmac/tmac.pspic: Use it. - * troff/troff.man, grops/grops.man, NEWS: Document it. - * psbb/*, Makefile.in: Remove it since it is no longer needed. - - This is bloody C code simply adapted from psbb.c! Any improvements - welcome. - -2000-01-29 Werner LEMBERG - - * man/groff_font.man: Minor clarifications. - - * NEWS: Updated. - -2000-01-28 Werner LEMBERG - - * afmtodit/afmtodit.pl: Use new `--' comment delimiter. - -2000-01-28 Gaius Mulley - - * man/groff_font.man: Brought up to date regarding tcommand - extensions. - * libgroff/font.cc: Handle everything after `--' as a comment - in the font files. - * devps/*: Added comment delimiter inside devps font files. - -2000-01-28 Werner LEMBERG - - * tmac/tmac.arkup, tmac/groff_markup.man: Replace \fC...\fR with - \fC...\fP (which now works as expected). - - * troff/troff.man: Fix typo. - -2000-01-27 Gaius Mulley - - Completed the pass_filenames implementation in troff. - - * libdriver/input.cc: Will read the new `F' tcommand. - * troff/node.cc, troff/node.h: Will issue the new `F' tcommand. - * troff/input.cc: Use it. - -2000-01-26 Werner LEMBERG - - * troff/env.cc (set_font): Fix the behaviour of \fP. The previous - font will now be updated even if an invalid font is selected. - -2000-01-24 Werner LEMBERG - - * doc/homepage.ms: Updated for new tmac.arkup. - - * tmac/tmac.html: Disable line breaks after hyphen-like characters. - - * tmac/tmac.arkup: Cleanup. - - Added `\&' to .HTML macro to `leave vertical mode', so to say. - - Removed obsolete .LINK macro completely. - - The macros .URL, .FTP, and .MAILTO now accept a third argument which - will be immediately appended to the second argument (to be used with - punctuation, for example). - - Disabled .CDFTP macro temporarily for security reasons. - - * tmac/groff_markup.man: Complete revision for latest changes in - tmac.arkup -- note that it does not yet format correctly with - grohtml :-( - -2000-01-23 Bruno Haible - - * nroff/nroff.sh: Accept -Tutf8 option and pass it through. - * devutf8/R.proto: Add mappings for wp, lh, rh. - * devutf8/NOTES: Updated. - -2000-01-23 Werner LEMBERG - - * doc/groff.texinfo: Updated version/copyright info. - -2000-01-21 Gaius Mulley - - Added support for two new directives in device descriptions: - `pass_filenames' (to pass the input file name to the output device) - and `use_charnames_in_special' (to support e.g. accented characters - in the `X' request). - - * include/font.h, troff/charinfo.h: Declare it. - - * libgroff/font.cc, libgroff/fontfile.cc: Set it. - - * devhtml/DESC: Use it. - - * troff/input.cc: New function encoded_char. - - * troff/token.h: Add test for `specialness'. - -2000-01-21 Werner LEMBERG - - * tmac/Makefile.sub: tmac.a4 and tmac.trace have been removed by - mistake from the list of files to be installed. - -2000-01-18 Werner LEMBERG - - * README: Added info how to apply patches. - -2000-01-15 Jan Echternach - - * troff/node.cc (ligature_note::operator delete): Fix g++ warning. - -2000-01-15 Gaius Mulley - - * troff/input.cc: Add support for troffrc-end. - - * tbl/main.cc: Altered to issue table-start and table-end special - characters if using the html device. - - * devhtml/*: Modified font files to incorporate html encoding of - characters. - - * tmac/groff_markup.man: New file documenting tmac.arkup. - - * tmac/troffrc-end: New file. This is invoked after all user - specified macros. Currently used by the html device to include - tmac.html. Thus no need for users to specify -mhtml anymore. - - * tmac/Makefile.sub (NORMALFILES): Add troffrc-end. - (MAN7): Add groff_markup.man. - - * tmac/tmac.an, tmac/tmac.html: Small html updates. - - * tmac/troffrc: tmac.arkup will now be called for the html device. - - * libgroff/font.cc, libgroff/font.h: Altered to include reading of - extra device specific information about fonts. - - * doc/homepage.ms: New file. It is an example how an HTML home page - could look like with grohtml. - - * doc/Makefile: Add homepage.ms. Remove rule for pic.html. - -2000-01-12 Bruno Haible - - * devutf8/R.proto: Add mappings for ti, Fn, st, an. Change mappings - of Im, Re. - - * devutf8/NOTES: Updated. - -2000-01-08 Bruno Haible - - * eqn/box.cc, eqn/lex.cc, eqn/other.cc, eqn/over.cc, eqn/special.cc, - eqn/text.cc, grodvi/dvi.cc, grops/ps.cc, grops/psrm.cc, - libbib/index.cc, libbib/linear.cc, libbib/search.cc, - libdriver/printer.cc, libgroff/font.cc, libgroff/string.cc, - pic/lex.cc, pic/object.cc, refer/label.y, refer/ref.cc, tbl/main.cc, - tbl/table.cc, tfmtodit/tfmtodit.cc, troff/dictionary.cc, - troff/div.cc, troff/env.cc, troff/input.cc, troff/node.cc, - troff/node.h, troff/reg.cc: Avoid most "g++ -Wall -Wno-sign-compare" - warnings. - - * troff/node.cc (bracket_node::copy): Initialize last to NULL. - -2000-01-12 Fabrizio Polacco - - grolj4: Paper size will be searched case-insensitively. - - * include/lib.h: Add check for strcasecmp(). - * grolj4/li4.cc (lookup_paper_size): Use strcasecmp(). - * configure.in: Check for strcasecmp(). - -2000-01-11 Werner LEMBERG - - * troff/Makefile.sub (majorminor.cc): Fix incorrect path to - `REVISION'. - -2000-01-10 Werner LEMBERG - - * Makefile.comm, Makefile.in, doc/Makefile: More fixes for the - revision scheme. - - Add a new read-only register, `.Y', which contains the groff - revision. - - * troff/input.cc (init_input_requests): Define it. - * troff/Makefile.sub (majorminor.cc): Define `revision' string. - * doc/groff.texinfo, troff/troff.man: Document it. - - * libgroff/Makefile.sub (version.cc): Add definition of - `Version_string[]', consisting of `..' - * eqn/main.cc, grodvi/dvi.cc, grolj4/lj4.cc, grops/ps.cc, - grotty/tty.cc, hpftodit/hpftodit.cc, indxbib/indxbib.cc, pic/main.cc, - refer/refer.cc, soelim/soelim.cc, tbl/main.cc, tfmtodit/tfmtodit.cc, - troff/input.cc, pfbtops/pfbtops.c: Use it. - -2000-01-10 Fabrizio Polacco - - Add a revision scheme to the groff package. - - * REVISION: New file. - * libgroff/Makefile.sub (version.cc): Use it to define - `revision_string[]'. - * grops/psrm.cc: Use revision_string (converted to an unsigned - integer) in constructor of resource_manager. - -2000-01-10 Bruno Haible - - * devutf8/Makefile.sub, devutf8/DESC.proto, devutf8/R.proto: New - files. - * Makefile.in (DEVDIRS): Add devutf8. - * grotty/tty.cc: Include device.h. - (glyph): Change type of `code' to `unsigned int'. - (tty_printer): New field is_utf8. Constructor takes device argument. - (tty_printer::tty_printer): If device if `utf8', set is_utf8. - (tty_printer::add_char): Change type of first arg to `unsigned int'. - (tty_printer::put_char): New function. - (tty_printer::end_page): Use put_char() instead of ::putchar(). - (make_printer): Pass device to tty_printer constructor. - * nroff.sh: Determine default device by calling 'locale'. As a - fallback, look at all of $LC_ALL, $LC_CTYPE, $LANG, $LESSCHARSET. - Recognize UTF-8 locales. - * tmac/eqnrc: Recognize utf8 like latin1. - * tmac/troffrc: Device utf8 needs tmac.tty. - -2000-01-07 Werner LEMBERG - - * tmac/Makefile.sub: tmac.a4 and tmac.trace will now be installed. - -2000-01-07 Paul Eggert - - Add a new predefined writeable number register, `year', - which contains the current year. - - * doc/groff.texinfo, PROBLEMS, troff/troff.man: Document it. - * tmac/tmac.s: Use it. - * troff/input.cc (init_registers): Initialize it. - -2000-01-06 Werner LEMBERG - - * PROBLEMS: Fixed typo. - -2000-01-04 Paul Eggert - - * PROBLEMS: Add Y2k advice for the yr number register. - -2000-01-03 Paul Eggert - - * doc/groff.texinfo: Fix Y2k bug in documentation of \n(yr. - -2000-01-02 Werner LEMBERG - - * tmac/tmac.arkup: Slight modification of macros to provide better - appearance for non-HTML formats. - -2000-01-01 Charles Levert - - * soelim/soelim.cc (include_path_append): realloc(NULL, n) - does not automatically translate to malloc(n) on all OSes - (e.g., SunOS) so do it explicitly. Also, check the returned - value. - -2000-01-01 Werner LEMBERG - - * tmac/tmac.arkup: Added .LINE macro. Some formatting. - - * Makefile.in: Added $(tmac_m) again since the Makefile in `mm' - expects this variable - -2000-01-01 Gaius Mulley - - * doc/Makefile: Added instructions to create HTML and text - versions of some files. - -1999-12-31 Werner LEMBERG - - * Updated INSTALL.gen. - - * tmac/tmac.arkup: Added fixes so that .FTP and .MAILTO works - better resp. correctly with non-HTML devices. - -Version 1.15 released -===================== - -1999-12-28 Werner LEMBERG - - * NEWS, VERSION: Changed to 1.15 - -1999-12-27 Paul Eggert - - * nroff/nroff.man: -S is safer, not safe. - - * groff/groff.cc (main): Use `safer', not `safe', in variable - names. This does not change the behavior. - - * troff/input.cc (main): Likewise. - - * nroff/nroff.sh: Likewise. - - * troff/input.cc (prepend_string): New function. - (main): Prepend -msafer, so that we check macro libraries for - safety. - - * PROBLEMS: Report problem with Sun C++ 5.0 and 5.1. - -Version 1.14 released -===================== - -1999-12-26 Werner LEMBERG - - * NEWS, VERSION: Changed to 1.14. - -1999-12-24 Werner LEMBERG - - * refer/refer.cc: Fixing the last fix. - -Version 1.13 released -===================== - -1999-12-23 Werner LEMBERG - - * tmac/tmac.an: A typo (`.if' instead of `.ie') made the page - number disappear. - - * NEWS: Updated. - - * tmac/tmac.safer: Forgot to remove `so' from the `rm' request. - - * VERSION: Changed to 1.13 -- to be compliant with the Adobe 3.0 - document conventions, the version number must be a real. - -Version 1.12.1 released -======================= - -1999-12-22 Werner LEMBERG - - * VERSION: Changed to 1.12.1. - -1999-12-22 Alan Rooks - - * refer/refer.cc (do_file): Slight modification to satisfy the - `Standard system CC - C++ Compilation System 3.1 03/03/99' on SCO - UnixWare 7.1. - -1999-12-20 Werner LEMBERG - - * changed prep.ai.mit.edu -> ftp.gnu.org; updated copyright - notices. - - * tmac/tmac.safer, tmac/groff_msafer.man: Remove `so' (again) from - list of unsafe requests. - - * pic/pic.man: Fixed a typo. - - * man/groff_out.man: Fixed a typo. - -1999-12-18 Werner LEMBERG - - * Makefile.in: Doc fixes. - -1999-12-17 Fabrizio Polacco - - * groff/groff.cc: Missing `U' option added to getopt(). - - * troff/troff.man: Missing `U' option added to synopsis. - -Version 1.12 released -===================== - -1999-12-14 Werner LEMBERG - - * troff/input.cc (usage), groff/groff.cc (synopsis): Added -U flag - to the synopsis. - - * nroff/nroff.sh, nroff/nroff.man: Replaced `secure', `unsecure' - with the more appropriate terms `safer' and `unsafe'. - - * libgroff/strerror.c, aclocal.m4, configure.in: Added checks for - sys_nerr and sys_errlist[]. - - * pic/pic.h, aclocal.m4, configure.in: Added check for hypot(). - - * pic/pic.y, pic/pic.cc: Added check for fmod(). - -1999-12-13 Werner LEMBERG - - * VERSION: Changed to 1.12. - - Here some patches from various sources; most of them taken from - the Debian distribution. - - * tmac/groff_mdoc.man, tmac/groff_mdoc.samples.man, - tmac/Makefile.sub: New files copied directly from the NetBSD - distribution. Probably, some additional adaptation later on is - necessary... - - * tmac/tmac.safer, tmac/groff_msafer.man: Added `so' to the list - of unsafe requests. - - * groff/groff.cc, groff/groff.man, nroff/nroff.sh, - nroff/nroff.man, pic/main.cc, pic/pic.man, troff/input.cc, - troff/troff.man: Added option `-U' for unsafe mode. Safe mode - (`-S') is now the default. - - * README, NEWS: Updated. - -1999-12-09 Werner LEMBERG - - * doc/groff.texinfo: Regenerated nodes and menus with emacs. - - * doc/Makefile (clean): Added cleaning commands for groff.texinfo. - -1999-12-06 Werner LEMBERG - - * configure.in: Removed AC_PREFIX_PROGRAM since it causes more - grief than relief today. Additionally, it is against the GNU - coding standards. - - * configure: Recreated. - -1999-12-05 Werner LEMBERG - - * configure.in: Added GROFF_LIBM. - - * configure: Recreated. - - * aclocal.m4 (GROFF_LIBM): New function which tests whether -lm is - necessary. - - * Makefile.in: Added definition of $(LIBM). - - * Makefile.comm (LIBM): Removed. - - * pfbtops/Makefile.sub: On AIX, -lm is needed also. - -1999-12-03 Gaius Mulley - - * doc/Makefile: Added rule for generation pic.html. - - (clean): Files produced by grohtml will be removed also. - - * doc/pic.ms: Small fix. - - * tmac/tmac.html: Fixed suppression of headers. - -1999-11-16 Gaius Mulley - - * tmac/tmac.html: Fixing horizontal arrows. - - Turning off hyphenation. - - * tmac/tmac.an: Improved support for grohtml; better indentation, - no footers/headers. - -1999-10-31 Gaius Mulley - - * tmac/tmac.arkup: Added CDFTP macro - - * tmac/tmac.html: All headers are turned off for ms, me, and mm - macros. - - * tmac/troffrc: Some additions for HTML stuff. - -1999-10-06 Gaius Mulley - - * tmac/tmac.html: Small changes. - -1999-09-26 Werner LEMBERG - - * doc/groff.texinfo: Minor fixes. - -1999-09-26 Gaius Mulley - - * devhtml/TR: Changed spacewidth to 3. - - * tmac/Makefile.sub (NORMALFILES): Added tmac.arkup. - - * tmac/tmac.html: Moved markup macros to tmap.arkup. - - * tmac/tmac.arkup: New file. - - * grohtml/ChangeLog: New file. - -1999-09-16 Werner LEMBERG - - * doc/groff.texinfo (Common Features): Added Copying chapter. - Changed format to @smallbook. - -1999-09-15 Werner LEMBERG - - * NEWS: Added info about groff.texinfo. - - * doc/groff.texinfo: Will now compile (using texi2dvi) without - warning messages. - -1999-09-14 Werner LEMBERG - - * groff/groff.man: More updates. - -1999-09-13 Werner LEMBERG - - * doc/groff.texinfo: New file. This manual is still very - rudimentary. It has been originally contributed by Trent - A. Fisher with first corrections and - additions by me. - - * INSTALL: Added information about the `doc' subdir - - * troff/troff.man: Minor fixes. - - * groff/groff.man: Added missing `-L arg' to SYNOPSIS section; - reordered options. - - * troff/input.cc (usage): Added missing `-ffam' to usage message. - - * Makefile.in (dist): groff-$(version).tar.gz must be removed - also, otherwise it is included itself in another call of `make - dist'. - - * groff/groff.cc (synopsis): Removed superfluous space. - - * PROJECTS, PROBLEMS, NEWS: Updated. - - * VERSION: Updated to 1.12beta. - - * BUG-REPORT: Some cosmetic fixes. Corrected email address. - - * README: Updated: Included documentation about CVS repository, - mailing lists, and daily snapshots. - - * tmac/Makefile.sub: Fixed $(tmap_wrap) finally. - -1999-09-12 Bjarni Ingi Gislason - - * tmac/tmac.an: If the tag didn't fit into the space that the - macro `TP' specifies, the rest of the tag went into the space for - the next line. - -1999-09-12 Jeffrey Copeland - - * grolj4/lj4.cc: Added duplex printing (option `-d'). - - * grolj4/grolj4.man: Document duplex printing. - -1999-09-12 Werner LEMBERG - - * doc/Makefile (pic.ps): Fixed rule which caused problems with - non-GNUish sed programs. - - * tmac/doc-syms: Removed extra space from -iso8802-3 macro - definition. - - * configure.in (LIBS): Added `-lc' - - * Makefile.comm (.man.n): Added substitution for @TMAC_AN_PREFIX@. - - * pic/tex.cc (solid_arc): Casting M_PI to double. - - * libgroff/putenv.c (putenv): Changed function header to ANSI C. - - * groff/groff.man, tmac/Makefile.sub (MAN7), tmac/groff_msafer.man - (new file), tmac/msafer.man (deleted), tmac/groff_me.man (new - file), tmac/me.man (deleted): {me,msafer} -> groff_{me,msafer}. - - * groff/groff_man.man: New file. This manual page was originally - written for the Debian GNU/Linux system by Susan G. Kleinmann - . - - * eqn/list.cc (list_box::compute_metrics, - list_box::compute_sublist_width): Removed variable declaration to - avoid shadowing warnings. - - * grops/psrm.cc (resource_manager::process_file): Ditto. - - * tfmtodit/tfmtodit.cc (main): Ditto. - - * libgroff/font.cc (font::load_desc): Renamed auxiliary variable - to avoid shadowing warnings. - - * tbl/table.cc (block_entry::do_divert, table::do_row): Renamed - shadowing loop variable. - - * groff/groff.man, troff/troff.man: Added doc about grohtml. - -1999-09-12 Gaius Mulley - - New grohtml frontend to convert groff input to html. - - * Makefile.in (CCPROGDIRS, DEVDIRS): Added html device. - - * tmac/Makefile.sub (NORMALFILES): Added tmac.html. - - * tmac/eqnrc: Added html device. - - * tmac/tmac.html: New file. - - * eqn/main.cc (do_file, inline_equation), pic/troff.cc - (troff_output::start_picture, troff_output::finish_picture), - tbl/main.cc (process_input_file): - Surrounded output with `graphics_start' and `graphics_end' so that - the html driver can identify non-text portions. - - * grodvi/dvi.cc (dvi_printer::set_char), grolj4/lj4.cc - (lj4_printer::set_char), grops/ps.cc (ps_printer::set_char), - grotty/tty.ps (tty_printer::set_char): Additional parameter - `name'. - - * include/printer.h: Class printer: New function - set_char_and_width; new variables (is_char_named, is_named_set, - named_command, named_char_s, named_char_n) to hold information - about named characters -- needed by the html driver. - - * libdriver/printer.cc (printer::set_ascii_char, - printer::set_special_char): Use set_char_and_width. - - * devhtml/*: New device files for html driver. - - * grohtml/*: New driver grohtml. - -1999-09-11 Wilfredo Sanchez - - * tmac/doc-common, tmac/tmac.an: Removed the word `UNIX' in - default strings. - -1999-09-11 Luke Mewburn - - * libgroff/string.cc (search): Small fix to test against NULL - pointer. - -1999-09-11 Jeff Conrad - - * troff/node.cc (copy): The characters in a bracket escape (e.g., - \b'abc') were stacked in reverse order when processed in a - diversion. - - * troff/node.h: Added `*last' to struct `node' to make the above - fix work. - - * troff/input.cc (read_draw_node), libdriver/input.cc (do_file): - The default scale for the 'f' and 't' graphics functions were 'm' - rather than 'u' (i.e., no scaling). - -1999-09-11 Peter Miller - - * groff/groff.cc (main), groff.man, soelim/soelim.cc (main, - do_file), soelim/soelim.man: Added `-I file' option to soelim, - defining include paths. - - * soelim/soelim.cc (include_path_append): New function. - -1999-09-11 Larry Jones - - * tbl/main.cc (process_options): Unix (at least Documenter's - Workbench) tbl allows arbitrary non-alpha characters between - options. - -1999-09-11 Paul Eggert - - Y2k fixes. Don't assume that the current year precedes 2000. - - * doc/meref.me: Add \n(y2, \n(y4. - - * tmac/doc-common (Yr): New number register. - (Dd): Don't assume current year precedes 2000. - - * tmac/tmac.e (td): Likewise. - (y2, y4): New number registers. - - * pic/pic.man: Update reference for pic paper to May, 1991 - version. - -1999-09-11 Werner LEMBERG - - * tmac/Makefile.sub (install_data, stamp-wrap, uninstall_sub): - Removed quotation marks which prevented correct expansion of - $(tmac_wrap). - - * devlj4/Makefile.sub (LJ4RES): Fixed value (600 instead of 300). - -1999-09-10 Werner LEMBERG - - * Makefile.sub (DISTCLEANFILES): Added `config.log' and - `config.cache'. - - * Removed configure.old. - -1999-08-31 Werner LEMBERG - - * VERSION: Updated to 1.11.1 - -1999-05-27 Werner LEMBERG - - * doc/Makefile: changed `.PS' postfix to `.ps' for consistency. - - * tmac/Makefile.sub (install_data, stamp-wrap, uninstall_sub): - added quotations around $(tmac_wrap) to avoid syntax error if - variable is empty. - - * configure: Newly generated using autoconf 2.13. - - * Makefile.in (LDFLAGS): Set variable to @LDFLAGS@. - -Fri Aug 15 08:51:47 1997 Eric S. Raymond - - * README, PROJECTS, NEWS, INSTALL, VERSION, - doc/Makefile. doc/pic.ms, groff/groff.man: - Prepare for 1.11 release. No code changes. - Documentation for pic added (doc/pic.ms). - -Sun Nov 26 11:45:13 1995 James Clark - - * Version 1.10 released. - -Fri Nov 24 09:56:16 1995 James Clark - - * afmtodit/afmtodit.pl: Avoid comment on first line. - -Mon Nov 20 11:13:49 1995 James Clark - - * aclocal.m4 (GROFF_INSTALL_SH): New macro. - * configure.in: Call it. - - * Makefile.sub (configure): Depends on aclocal.m4 not acgroff.m4. - (distfiles): Doesn't depend on config.log or config.cache. - -Sun Oct 1 08:45:36 1995 James Clark - - * grog/grog.sh: Use print "" rather than print in END rule. - -Wed Aug 23 13:30:52 1995 James Clark - - * tbl/main.cc (process_data): Don't give error for excess data - entries that are comments. - -Fri Jul 28 11:00:27 1995 James Clark - - * tbl/main.cc (process_data): Fix case where new for-scope rules - silently change meaning of code. - -Tue Jul 4 23:39:51 1995 James Clark - - * troff/env.cc (hyphenate): Loop over all consecutive sequences - of non-zero hyphenation codes. - -Sat Jul 1 00:42:15 1995 James Clark - - * aclocal.m4 (GROFF_POSIX): Use conflicting declaration technique. - -Thu Jun 29 13:58:36 1995 James Clark - - * tmac/tmac.e (ip): Divert the tag so as to freeze the spaces. - -Tue Jun 27 12:30:16 1995 James Clark - - * tmac/tmac.andoc: Make it work in compatibility mode. - - * refer/token.h (token_info::is_range_sep): New function. - * refer/token.cc (init_special_chars): Make \(en a RANGE_SEP. - * refer/ref.cc (reference::output): More sophisticated check for - multiple pages. - - * devps/prologue.ps (MANUAL): New procedure. - * grops/ps.cc (main): New -m option. - (usage): Include -m. - (ps_printer::~ps_printer): Implement -m. - - * aclocal.m4 (GROFF_G): New macro. - * configure.in: Call it. - * Makefile.in (g): Provided by configure. - - * hpftodit/hpftodit.cc (basename): Rename to xbasename. - - * tmac/tmac.tty: Disable warning about bad fonts. Remove font - translations. - - * Makefile.in (tmacpath): Don't include /usr/lib/tmac. - (tmac_m, tmac_s): Deleted. - (sys_tmac_prefix, tmac_wrap, tmac_prefix, tmac_an_prefix, - tmac_s_prefix): New variables. - (MDEFINES): Change accordingly. - * Makefile.comm (.man.n): Use new TMAC_* variables. - * configure.in (GROFF_TMAC): Call. - * aclocal.m4 (GROFF_TMAC): Define. - * tmac/Makefile.sub (stamp_wrap): New target. - (install_data, uninstall_sub): Handle macro wrapping. - -Mon Jun 26 14:54:39 1995 James Clark - - * tbl/main.cc (main): Ignore -T option. - -Thu Jun 22 09:08:06 1995 James Clark - - * devlj4/generate/special.map: Add definition of \(nb. - - * tmac/tmac.dvi: Add definition of \(nb. - - * troff/dictionary.c (dictionary::dictionary): association::v gets - initialized by association::association. - - * tmac/Makefile.sub: Avoid using temporary files when installing. - - * troff/env.cc (environment::set_font): Make bad font number a - warning. - - * Makefile.in (fontpath): Remove $(prefix)/lib/font from fontpath. - - * Makefile.in (datadir): Use share rather than lib. - - * groff/groff.cc (basename): Rename to xbasename. - -Wed Jun 21 16:59:46 1995 James Clark - - * Makefile (CCLIBS): Don't use. - * Makefile.ccpg: Likewise. - - * acgroff.m4: Rename to... - * aclocal.m4: Modify extensively for autoconf 2. - * configure.in: Likewise. - * Makefile.in: Likewise. - - * groff/pipeline.c (const): Declare as empty if __STDC__ not - defined. - (xstrsignal): Check for definition of NSIG. Conditionalize - on SYS_SIGLIST_DECLARED. Make return type const. - -Sat Jun 10 12:28:16 1995 James Clark - - * troff/input.cc (interpolate_macro): Rephrase missing space - warning. - -Thu May 11 01:07:16 1995 Jason Merrill - - * addftinfo/addftinfo.cc, eqn/delim.cc, eqn/lex.cc, eqn/list.cc, - grodvi/dvi.cc, groff/groff.cc, grops/ps.cc, grops/psrm.cc, - grotty/tty.cc, include/ptable.h indxbib/indxbib.cc, - libbib/index.cc, libbib/linear.cc, libbib/search.cc, - libdriver/input.cc, libdriver/printer.cc, libgroff/font.cc, - libgroff/lf.cc, libgroff/nametoindex.cc, libgroff/ptable.cc, - libgroff/string.cc, lkbib/lkbib.cc, lookbib/lookbib.cc, - pic/lex.cc, pic/object.cc, pic/pic.y refer/label.y refer/ref.cc, - refer/refer.cc, refer/token.cc, tbl/main.cc, tbl/table.cc, - tfmtodit/tfmtodit.cc, troff/dictionary.cc, troff/div.cc, - troff/env.cc, troff/input.cc, troff/node.cc, troff/symbol.cc: - Fix 'for' scoping. - -Wed Apr 19 21:15:11 1995 James Clark - - * troff/input.cc (spring_trap): Push a macro_iterator rather than a - string_iterator. - (spring_trap, postpone_traps, unpostpone_traps): Move to later in - file. - (macro_iterator::macro_iterator): Add additional argument. - -Mon Apr 10 12:06:02 1995 James Clark - - * troff/div.cc (vertical_size::vertical_size): In place of integer - specifying line spacing use cunits specifying post vertical - space. - (macro_diversion::output, top_level_diversion::output): Likewise. - * troff/div.h: Change declarations accordingly. - * troff/env.cc (pending_output_line): Replace ls field by post_vs - field. - (pending_output_line::pending_output_line, - pending_output_line::output, environment::output, - environment::output_line, environment::output_title, - environment::hyphenate_line): In place of - integer specifying line spacing use cunits specifying post vertical - space. - (environment::environment): Add post_vertical_spacing and - prev_post_vertical_spacing arguments. - (environment::get_post_vertical_spacing): New function. - (environment::total_post_vertical_spacing): New function. - (environment::post_vertical_spacing): New function. - (init_env_requests): Initialize pvs request and .pvs register. - * troff/env.h: Change declarations. - -Tue Mar 28 09:52:07 1995 James Clark - - * tmac/tmac.pspic: Immediately remove the temporary file. - -Sat Mar 25 10:43:11 1995 James Clark - - * tmac/tmac.pspic (PSPIC): Scale graphic uniformly even when - height is specified. - -Thu Jan 26 16:20:13 1995 James Clark - - * tbl/table.c (struct vertical rule, class table_entry): Use int - not short for start_row and end_row. - -Fri Jan 13 13:53:05 1995 James Clark - - * troff/input.cc (trapping_blank_line, blank_line_macro): New - functions. - (diverted_space_node::reread, process_input_stack): Call - trapping_blank_line() rather than blank_line(). - (init_input_requests): Bind "blm" to blank_line_macro(). - - * tmac/tmac.s (XA): Use .br and par@reset rather than XA. - -Tue Jan 10 11:40:35 1995 James Clark - - * troff/env.cc (environment::possibly_break_line): Require that - width total excluding width of final space node be greater than - the target text length. - -Tue Jan 3 09:13:37 1995 James Clark - - * troff/node.cc (kern_pair_node::vertical_extent): New function. - -Sun Dec 4 13:19:07 1994 James Clark - - * troff/node.cc (charinfo_node): New class. - (glyph_node, composite_node): Derive from charinfo_node. Change - member functions accordingly. - -Wed Nov 30 10:29:29 1994 James Clark - - * nroff/nroff.sh: Use -Tlatin1 not -TLatin1. - -Mon Aug 8 10:17:59 1994 James Clark (jjc@jclark.com) - - * tmac/tmac.tty-char: Add definitions for \(ab and \[arrowvertex]. - - * devps/generate/textmap (notsubset): Add. - - * tmac/tmac.a4: New file. - -Sun Jul 24 20:08:42 1994 James Clark (jjc@jclark.com) - - * pic/main.cc (had_parse_error): New variable. - (do_picture, do_whole_file): Set had_parse_error if yyparse() - returns non-zero. - (main): Return 1 if had_parse_error is true. - -Tue Jul 19 13:40:31 1994 James Clark (jjc@jclark.com) - - * grolj4/lj4.cc (main): Avoid use of strtoul. - -Mon Jul 18 15:03:02 1994 James Clark (jjc@jclark.com) - - * nroff/nroff.sh: Default device is -Tlatin1 if $LC_CTYPE is - iso_8859_1 or $LESSCHARSET is latin1. - -Sun Jul 10 13:38:35 1994 James Clark (jjc@jclark.com) - - * hpftodit: New directory. - * Makefile.in (CCPROGDIRS): Add hpftodit. - * devlj4/generate: New directory. - -Thu Jul 7 23:49:48 1994 James Clark (jjc@jclark.com) - - * configure.in: Don't use AC_VFORK. - * groff/pipeline.c (run_pipeline): Use fork() always. - -Wed Jul 6 11:13:17 1994 James Clark (jjc@jclark.com) - - * grops/ps.cc (main): Use %1 not %s in error message for -w. - - * Makefile.in (CCPROGDIRS): Add grolj4. - (DEVDIRS): Add devlj4. - * grolj4, devlj4: New directories. - * tmac/troffrc: Handle lj4. - * tmac/tmac.lj4: New file. - -Fri Jun 17 18:02:53 1994 James Clark (jjc@jclark.com) - - * tmac/tmac.e (@n): Set indent to 0 before calling |h. - -Wed Jun 1 07:33:47 1994 James Clark (jjc@jclark.com) - - * troff/input.cc (do_if_request): At end of second string, switch - environments before getting next token. - -Fri May 20 07:39:18 1994 James Clark (jjc@jclark.com) - - * devps/psstrip.sed: Split rule that strips whitespace on either - side of delimiters. - -Wed May 18 08:13:47 1994 James Clark (jjc@jclark.com) - - * troff/node.h (font_family::make_definition): Add return value to - declaration. * troff/symbol.h (symbol::operator==, - symbol::operator!=): Likewise. - -Tue May 17 20:46:06 1994 James Clark (jjc@jclark.com) - - * groff/groff.cc (main, help, synopsis): Handle -S. - (possible_command::insert_arg): New function. - - * tmac/tmac.safer: New file. - * tmac/msafer.man: New file. - * tmac/Makefile.sub (FILES): Add tmac.safer and msafer.man. - -Thu Mar 10 01:58:30 1994 Paul Eggert (eggert@twinsun.com) - - * pic/pic.h, pic/main.cc (safer_flag): New variable. - * pic/pic.y (placeless_element): Avoid unsafe operations if - `safer_flag' is set. - * pic/main.cc (main): Add -S option, which sets `safer_flag'. - -Tue May 10 13:02:31 1994 James Clark (jjc@jclark.com) - - * eqn/lex.cc (get_token): Put call to add_context() in block to - work around Sun C++ 4.0 bug. - - * include/stringclass.h (operator +): Use ?: instead of `if' to - work around Sun C++ 4.0 bug. - -Thu May 5 11:18:03 1994 James Clark (jjc@jclark.com) - - * tbl/main.cc (process_format): Accept - as a synonym for the _ - key letter. - - * libbib/index.cc (minus_one): Don't declare as const. - -Fri Apr 29 09:32:48 1994 James Clark (jjc@jclark.com) - - * troff/input.cc (get_char_for_escape_name): Push back a newline. - -Wed Apr 27 21:14:18 1994 James Clark (jjc@jclark.com) - - * troff/input.cc (write_macro_request): New function. - (init_input_requests): Bind write_macro_request to writem. - -Sun Apr 17 11:15:38 1994 James Clark (jjc@jclark.com) - - * tmac/tmac.s (@EN): Turn filling back on even if there was no - equation. - - * eqn/lex.cc (do_space): Supply missing argument to lex_error. - - * tmac/tmac.s (@TS): Renamed from TS. - (TS): Call LP then TS again. - (cov*ab-init): Alias @TS to TS. - - * tmac/tmac.s: Allow QP or RS to initialize. - - * tmac/tmac.s (par@load-init): New macro. Call at end of file. - Move initializations of PS and LL here. - (par@init): Don't initialize HY. Avoid changing environment 0. - (par*env-init): Don't all par@reset. - -Thu Apr 14 19:15:45 1994 James Clark (jjc@jclark.com) - - * include/posix.h: Include only if not using . - -Sun Apr 10 09:54:44 1994 James Clark (jjc@jclark.com) - - * Makefile.in (MDEFINES): Add LDFLAGS. - (LDFLAGS): Add definition line. - -Thu Apr 7 22:22:22 1994 James Clark (jjc@jclark.com) - - * troff/input.cc (get_optional_char): Split off error check into... - (check_missing_character): New function. - * troff/token.h: Declare it. - * troff/env.cc (margin_character): Don't call get_optional_char. - Only call tok.next() after making the node. - - * include/lib.h (getopt): Make 2nd argument char *const *. - -Fri Mar 11 07:28:03 1994 James Clark (jjc@jclark.com) - - * nroff/conftest.sh: Deleted. - -Fri Mar 4 10:51:36 1994 James Clark (jjc@jclark.com) - - * pic/make-dos-dist: Deleted. - -Wed Mar 2 20:59:16 1994 James Clark (jjc@jclark.com) - - * devps/psstrip.sed: Strip comments before stripping trailing - white space. - -Sat Feb 19 13:07:16 1994 James Clark (jjc@jclark.com) - - * Version 1.09 released. - -Wed Feb 16 16:53:49 1994 James Clark (jjc@jclark.com) - - * tmac/doc-ditroff (hK): Don't reset page number if \nC is > 0. - -Mon Feb 14 08:26:40 1994 James Clark (jjc@jclark.com) - - * libgroff/font.cc (font::load_desc): Fix typo in error message. - -Sun Feb 13 09:37:38 1994 James Clark (jjc@jclark.com) - - * libgroff/new.cc (operator new): Rewrite so as to avoid warning - about returning without a value. - - * troff/charinfo.h (charinfo::get_special_translation): Cast - TRANSLATE_NONE to int. - - * refer/token.cc (lookup_token, store_token): Remove bogus loop - test. Fix test so that it works with n unsigned. - - * pic/pic.y (defaults_table): Fully bracket initializer. - * pic/lex.cc (lookup_keyword): Likewise. - * eqn/lex.cc (token_table, def_table): Likewise. - * eqn/box.cc (param_table): Likewise. - * troff/input.cc (warning_table): Likewise. - * libgroff/font.cc (table): Likewise. - * grops/ps.cc (ps_printer::special): Likewise. - * grops/psrm.cc (resource_manager::process_file): Likewise. - * tfmtodit/tfmtodit.cc (lig_chars, lig_table): Likewise. - * refer/command.cc (command_table): Likewise. - * addftinfo/addftinfo.cc (param_table): Likewise. - - * troff/symbol.cc (symbol::symbol): Prevent compiler warnings - about temp's being unused. - (unused): New function. - - * groff/pipeline.cc: Declare c_fatal. - - * libbib/linear.cc (bmpattern::search): Cast patterrn[--j] to - uchar. - - * libbib/index.cc (index_search_item::load): Prevent compiler - warnings about fd_closer's being unused. - (unused): New function. - -Sat Feb 12 10:31:59 1994 James Clark (jjc@jclark.com) - - * troff/input.cc (copy_mode_error): Make `prefix' static. - Fix typo. - - * include/posix.h: Include is HAVE_CC_OSFCN_H is - defined. - * acgroff.m4, configure.in, Makefile: Rename HAVE_CC_UNISTD_H to - HAVE_CC_OSFCN_H and modify accordingly. - - * troff/input.cc (init_charset_table): radicalex overlaps - horizontally. - - * groff/acgroff.m4 (GROFF_ISC_SYSV3): New macro (from - udodo!hans@relay.NL.net). - * groff/configure.in: Call it. - - * groff/acgroff.m4 (GROFF_PCLOSE): New macro. - * groff/configure.in: Call it. - * include/lib.h: Conditionalize declaration of pclose. - - * troff/div.cc (last_page_number): New global variable. - (top_level_diversion::begin_page): Exit if we just printed the - last page. - * troff/div.h (last_page_number): Declare it. - * troff/input.cc (parse_output_page_list): Set last_page_number. - - * eqn/sqrt.cc: Rename \(rn to \[radicalex]. - * devps/S, devps/textmap, tmac/tmac.ps, tmac/tmac.dvi, - tmac/tmac.X: Likewise. - * tmac/tmac.ps, tmac/tmac.X, tmac.dvi: Add definitions of \(rn. - * tmac.dvi: Make \(ru and \(ul extend beyond their width by .04m. - -Fri Feb 11 11:45:40 1994 James Clark (jjc@jclark.com) - - * tmac/doc-ditroff (hK): Remove groff specific code which - prevented page-breaks between separate manual entries. If this is - the first page, don't set the page number to 1. - - * acgroff.m4 (GROFF_POSIX): New macro. - * configure.in: Use it. - - * troff/node.cc (class real_output_file, - real_output_file::real_output_file, - real_output_file::~real_output_file): Conditionalize use of - popen/pclose on POPEN_MISSING. - * troff/node.h: Conditionalize pipe_command on POPEN_MISSING. - * troff/input.cc (pipe_command): Give an error if POPEN_MISSING. - (pipe_source): Similarily. - - * acgroff.m4 (GROFF_PROG_CCC): Update message about libg++. - - * acgroff.m4 (GROFF_GETOPT, GROFF_PUTENV, GROFF_POPEN): Detect - presence of declarations by trying to compile example with - conflicting declarations. (gcc only gives a warning for missing - declarations.) - -Wed Feb 9 09:12:23 1994 James Clark (jjc@jclark.com) - - * tmac/tmac.pspic (PSPIC): Allow options to specify alignment - (from Ulrich Lauther). - -Tue Feb 8 03:56:40 1994 James Clark (jjc@jclark.com) - - * libbib/linear.cc (file_buffer::load): Use S_ISREG macro. - -Thu Feb 3 09:34:35 1994 James Clark (jjc@jclark.com) - - * indxbib/indxbib.cc (write_hash_table): Add code for case where - pointers and ints have different sizes. - -Sun Jan 9 16:17:51 1994 James Clark (jjc@jclark.com) - - * tmac/tmac.s (par*env-init): Call par@reset. - -Fri Jan 7 10:24:27 1994 James Clark (jjc@jclark.com) - - * tmac/tmac.s (@IP): Switch to a new environment when diverting - tag. - (par*push-tag-env, par*pop-tag-env): New macros. - -Wed Jan 5 21:18:34 1994 James Clark (jjc@jclark.com) - - * grops/ps.cc (ps_printer::ps_printer): Use MAX_LINE_LENGTH for - initializing `out'. Reduce MAX_LINE_LENGTH from 79 to 72. - - * grops/ps.cc (ps_printer::~ps_printer): Output %%CreationDate - comment. Include . - -Wed Dec 15 14:14:00 1993 James Clark (jjc@jclark.com) - - * grops/ps.cc (is_small_h, is_small_v): Deleted. - (ps_printer::flush_sbuf): Use absolute motion only at beginning of - lines. - -Tue Dec 14 10:06:34 1993 James Clark (jjc@jclark.com) - - * troff/input.cc (read_request): Only print a prompt if reading - from the terminal. Also clearerr on EOF if reading from the - terminal. Declare isatty. - -Mon Nov 29 08:38:15 1993 James Clark (jjc@jclark.com) - - * refer/label.y: Rename map_t to map_func and extractor_t to - extractor_func. - -Sat Oct 30 06:38:12 1993 James Clark (jjc@jclark.com) - - * include/assert.h: Don't use volatile. - * libgroff/assert.cc: Likewise. - -Fri Oct 29 15:00:23 1993 James Clark (jjc@jclark.com) - - * troff/input.cc (abort_request): Look at character in tok before - calling get_copy(). - -Thu Oct 28 14:09:48 1993 James Clark (jjc@jclark.com) - - * troff/troff.h (NO_RETURN): Deleted. - * troff/div.cc (cleanup_and_exit): Don't declare aas NO_RETURN. - * troff/input.cc (exit_troff): Likewise - - * Makefile.in: Remove `Making ...' messages since GNU make now - gives these. - - * configure.in: Use AC_HAVE_HEADERS(unistd.h) instead of AC_UNISTD_H. - -Wed Oct 27 11:12:51 1993 James Clark (jjc@jclark.com) - - * tmac/tmac.s (@init): Initialize PO to \n(.o here, rather than - to constant 1 inch. - -Sat Oct 23 10:03:52 1993 James Clark (jjc@jclark.com) - - * tmac/tmac.e (hl): Use \n[.in] rather than \n(.i. - -Thu Oct 14 12:09:45 1993 James Clark (jjc@jclark.com) - - * eqn/delim.cc (delim_box::compute_metrics): Don't increase - MARK_REG if there was no left delimiter. - -Sat Oct 2 19:54:47 1993 James Clark (jjc@jclark.com) - - * pic/troff.cc (troff_output::text): Set line thickness to - relative before outputting text. - - * tmac/tmac.e (@k): Don't zero ?T. - ((z): Likewise. - -Sat Sep 25 11:08:43 1993 James Clark (jjc@jclark.com) - - * tmac/tmac.e ($p): Handle possibility that $3 is empty. - -Wed Aug 18 08:51:41 1993 James Clark (jjc@jclark.com) - - * troff/input.cc (decode_args): Warn about unquoted tabs (from - Paul Eggert). - -Tue Aug 10 08:38:32 1993 James Clark (jjc@jclark.com) - - * troff/input.cc (ignoring): New variable. - (ignore): Set ignoring during call to do_define_macro. - (do_define_macro): Clear ignoring before interpolating terminating - macro. - (copy_mode_error): New function. - (get_char_for_escape_name, read_long_escape_name, - interpolate_arg): Use copy_mode_error. - (warning_table): Add WARN_IG. - * troff/troff.h (WARN_IG): Declare. - (WARN_TOTAL): Change accordingly. - - * groff/pipeline.c (strsignal): Rename to xstrsignal. - * groff/groff.cc (strsignal): Delete declaration. - -Fri Jul 16 01:43:12 1993 James Clark (jjc@jclark.com) - - * troff/div.cc (page_offset): Use 'm' as default scaling. - -Sat Jul 3 09:11:38 1993 James Clark (jjc@jclark.com) - - * nroff/nroff.sh: Ignore -u. - -Wed Jun 9 12:17:27 1993 James Clark (jjc@jclark.com) - - * Makefile.in (MDEFINES): Pass down MAKEOVERRIDES. - -Fri Jun 4 17:35:47 1993 James Clark (jjc@jclark.com) - - * tmac/tmac.s (par*box-draw): Set adjustment mode to l while - drawing box. - (B2): With -Tascii, leave additional vertical space before - and after. Ensure that the left and right indent is restored to - what it was even if the point size changes. Don't call - par@finish. Change the indent, line length and title length - directly. With -Tascii, make the width of the box 1n less. - (B1): Remember 1n at the current point size. Don't call - par@reset. Change the indent, line length and title length - directly. Ensure that the temporary indent is preserved. - (par*box-mark-top): Turn off no spacing mode. - -Thu Jun 3 17:47:14 1993 James Clark (jjc@jclark.com) - - * Makefile.in (dist): Use .gz suffix. - -Thu May 27 20:04:59 1993 James Clark (jjc@jclark.com) - - * troff/input.cc (main): Add return 0. - * pic/main.cc (main): Use return instead of exit. - * tbl/main.cc (main): Likewise. - * eqn/main.cc (main): Likewise. - * grops/ps.cc (main): Likewise. - * grotty/tty.cc (main): Likewise. - * groff/groff.cc (main): Likewise. - * grodvi/dvi.cc (main): Likewise. - * refer/refer.cc (main): Likewise. - * indxbib/indxbib.cc (main): Likewise. - * lkbib/lkbib.cc (main): Likewise. - * soelim/soelim.cc (main): Likewise. - * addftinfo/addftinfo.cc (main): Likewise. - * acgroff.m4 (GROFF_PROG_CCC, GROFF_CC_COMPILE_CHECK, - GROFF_COOKIE_BUG, GROFF_CC_ANSI_BUG): Likewise. - - * troff/token.h (process_input_stack): Don't declare as static. - * troff/input.cc: Likewise. - - * troff/node.c (invalidate_fontno): Make it a static member of - class font_family. Change callers. - * troff/node.c: Change declaration. - - * tbl/main.cc (struct input_entry_format): Add explicit public - specifier. - * tbl/table.cc (struct text_stuff, struct single_hline_stuff, - struct double_hline_stuff): Likewise. - * tbl/table.h (struct entry_format): Likewise. - * pic/object.h (struct saved_state): Likewise. - - * include/stringclass.h: Add forward declarations of friend - functions that are later declared as inline. Don't include inline - specifier in friend declaration. - - * libgroff/lib.h: Declare popen and pclose. - * acgroff.m4 (GROFF_POPEN): New macro. - * configure.in: Call it. - - * include/lib.h (PI): New constant. Undef first if necessary. - * tfmtodit/tfmtodit.cc (main): Use PI rather than M_PI. - * grops/ps.cc (degrees, radians): Likewise. - * libgroff/font.cc (font::get_skew): Likewise. - - * grops/ps.cc (is_ascii): New function. - (ps_output::put_string): Use is_ascii. Use csprint rather than - isprint. - (ps_printer::define_encoding): Use csspace. - * libgroff/strtol.c (ISASCII): New macro. - (strtol): Cast arguments to is*() and tolower() to unsigned char. - Use ISASCII rather than isascii. - * libgroff/cmap.cc: Use isascii() only if defines it. - * libgroff/cset.cc: Likewise. - * libdriver/input.cc: Include cset.h. - (do_file, get_integer, possibly_get_integer): Use csdigit() rather - than isdigit(). - - * refer/refer.cc (main): Use %ld rather than %d for longs. - - * libbib/index.cc (index_search_item_iterator::get_tag): Use - S_ISREG macro. - - * addftinfo/addftinfo.cc (param_t): Add explicit `int'. - -Mon May 24 08:51:37 1993 James Clark (jjc@jclark.com) - - * troff/input.cc (hyphenation_code): Skip white space between - char/code pairs. - -Sun May 16 08:15:52 1993 James Clark (jjc at jclark.com) - - * tbl/table.h (table::entry_list_tailp): New member. - (table::table): Initialize it. - (table::add_entry): Use entry_list_tailp to avoid O(n^2) - behaviour. - -Sat May 15 17:26:00 1993 James Clark (jjc at jclark.com) - - * grotty/tty.cc (tty_printer::add_char): Don't discard characters - with negative horizontal positions. Remove casts of glyph::hpos to - int. - (USHRT_MAX): Delete definition. - (SHRT_MAX, SHRT_MIN): New definitions. - (glyph::hpos): Change type to short. - (tty_printer::end_page): Output multiple backspaces if necessary. - Remove casts of glyph::hpos to int. - -Fri May 7 12:14:37 1993 James Clark (jjc at jclark.com) - - * tmac/tmac.s (@RT): New definition. - -Thu May 6 21:36:54 1993 James Clark (jjc at jclark.com) - - * refer/refer.cc (do_file): Make sure current_filename is set when - filename is "-". - - * pic/common.cc (common_output::dot_line): Handle zero length - lines. - -Sun May 2 19:54:16 1993 James Clark (jjc at jclark.com) - - * tmac/tmac.s (par@reset): Get value for .hy for \n[HY]. - (par@init): Initialize \n[HY]. - -Mon Apr 26 11:43:16 1993 James Clark (jjc at jclark.com) - - * troff/dictionary.cc (dictionary::remove): Continue when - r < j < i. - -Sun Apr 25 11:03:00 1993 James Clark (jjc at jclark.com) - - * Makefile.com (.y.cc): Avoid ending up with two versions of - $(YTABH). - -Thu Apr 22 21:03:45 1993 James Clark (jjc at jclark.com) - - * tmac/tmac.dvi (\(,c): Define only if it does not exist. - (\(,C): Likewise. Also fix typo. - -Wed Apr 21 08:47:32 1993 James Clark (jjc at jclark.com) - - * lib.h: Delete extraneous semi-colon. - - * Add pso request: `so' from a pipe. - * troff/input.c (file_iterator::file_iterator): Add 3rd argument. - (file_iterator::close): New function. - (file_iterator::~file_iterator, file_iterator::next_file): Use - file_iterator::close. - (file_iterator::backtrace): Say `process' rather than `file' when - the stream is popened. - (pipe_source): New function. - (init_input_requests): Bind ".pso" to pipe_source. - -Tue Apr 20 00:02:26 1993 James Clark (jjc at jclark.com) - - * afmtodit/afmtodit.pl: Avoid single quotes in comments. - - * pfbtops/pfbtops.c: Output 64 characters per line. Output hex - digits in lower case. - -Mon Apr 19 09:55:57 1993 James Clark (jjc at jclark) - - * Version 1.08 released. - - * Makefile.in (dist): Insert || true after ln -s commands that - might fail. - - * mm: Update to mm 1.16. - - * acgroff.m4 (GROFF_CSH_HACK): New macro. - * configure.in: Call GROFF_CSH_HACK. Substitute for - SH_SCRIPT_SED_CMD. - * Makefile.in (SH_SCRIPT_SED_CMD): New variable. Include in - MDEFINES. - * nroff/Makefile.sub (nroff): New target. - (install_data): Install nroff. - * eqn/Makefile.sub (neqn): Sed with SH_SCRIPT_SED_CMD. - * grog/Makefile.sub (grog): Sed grog.sh with SH_SCRIPT_SED_CMD. - -Sat Apr 17 08:24:28 1993 James Clark (jjc at jclark) - - * eqn/Makefile.sub (neqn): Add chmod +x. - - * grog/Makefile.sub (grog): Remove spurious semi-colon. - -Fri Apr 16 22:41:57 1993 James Clark (jjc at jclark) - - * troff/input.cc (string_iterator::string_iterator()): Initialize - lineno and count. - -Tue Apr 13 10:22:28 1993 James Clark (jjc at jclark) - - * troff/div.cc (macro_diversion::space, - top_level_diversion::space): Don't set high_water_mark. - (macro_diversion::output, top_level_diversion::output): Don't - include post line space in high water mark. - -Wed Apr 7 12:48:18 1993 James Clark (jjc at jclark) - - * eqn/eqn.y: Don't define YYDEBUG. - * pic/pic.y: Likewise. - -Mon Apr 5 10:15:15 1993 James Clark (jjc at jclark) - - * tmac/tmac.e ([3): Add space after comma following editors. - Change double spaces to single spaces. - ([4): Change double spaces to single spaces. - - * grops/ps.h (USE_PS_ADOBE_2_0): New flag for broken_flags. - * grops/ps.cc (ps_printer::~ps_printer): If the USE_PS_ADOBE_2_0 - bit is set in broken_flags, use 2.0 rather than 3.0 as the version - after %!PS-Adobe- (for Newsprint). - - * troff/div.cc (top_level_diversion::begin_page): When - before_first_page is 1, set page_number to 1. - -Sun Apr 4 14:28:53 1993 James Clark (jjc at jclark) - - * eqn/box.cc (box::top_level): Protect equation with \&. - -Sat Apr 3 23:27:25 1993 James Clark (jjc at jclark) - - * groff/groff.cc (possible_command::set_name): Delete old name. - - * groff/groff.cc (possible_command::~possible_command): Use - a_delete. - - * troff/node.cc (troff_output_file::begun_page): New member. - (troff_output_file::troff_output_file): Initialize it. - (troff_output_file::really_begin_page): Only output V command if a - page has been begun. - - * pic/pic.y (placeless_element): Delete argument to PRINT after - use. - -Fri Apr 2 11:31:02 1993 James Clark (jjc at jclark) - - * Make wrapman work. - * troff/div.h (class top_level_diversion): Replace - first_page_begun by before_first_page (with opposite sense). - * Change first_page_begun to before_first_page inverting sense. - * troff/div.cc (class nl_reg): New class. - (init_div_requests): Use class nl_reg for \n(nl. - (top_level_diversion::begin_page): Don't call - output_file::begin_page if before_first_page is 2; - reset before_first_page afterwards. If have_next_page_number is - false, then always increment page_number. - * tmac/tmac.an: Set traps within TH rather than at the top-level. - Restore compatibility mode after loading, and then disable - compatibility mode in TH. - -Thu Apr 1 11:09:34 1993 James Clark (jjc at jclark) - - * grotty/tty.cc (tty_printer::end_page): Don't discard characters - past last line. - * troff/node.h (output_file::trailer): Declare. - * troff/div.cc (cleanup_and_exit): Call output_file::trailer(). - * troff/node.cc (output_file::trailer): New function. - (troff_output_file::~troff_output_file): Move most code into... - (troff_output_file::trailer): New function. - (class troff_output_file): Delete page_length member. Declare - trailer(). - (troff_output_file::really_begin_page): Use current page length - for final V command. - - * tbl/main.cc (struct options): New decimal_point_char member. - (options::options): Initialize this. - (process_options): Implement decimalpoint option. - (process_data): Pass decimal_point_char option to table::table. - * tbl/table.h (class table): New decimal_point_char member. - (table::table): Add additional argument. - * tbl/table.cc (find_dot): Rename to find_decimal_point. Add - second argument specifying decimal point character. Use this - instead of '.'. - (table::table): Initialize decimal_point_char. - (table::add_entry): Change call to find_dot. - - * troff/input.cc (get_copy, token::next): Implement \V. - (interpolate_environment_variable): New function. - -Tue Mar 30 14:41:39 1993 James Clark (jjc at jclark) - - * pic/lex.cc (lookup_keyword): Rename MIN to K_MIN, MAX to K_MAX. - * pic/pic.y: Likewise. - - * grotty/tty.cc (tty_printer::add_char, tty_printer::end_page): - Add casts to int. - * refer/ref.cc (reference::insert_field, reference::delete_field): - Likewise. - * troff/number.cc (parse_term): Likewise. - - * acgroff.m4 (GROFF_PROG_YACC): New macro. - * configure.in: Use GROFF_PROG_YACC. - - * acgroff.m4 (GROFF_PROG_CCC): Don't add -O automatically for gcc - and g++. - * Makefile.in (OPTIMIZE): New define. - (DEBUG): Empty by default. - (CCFLAGS, CFLAGS): Include $(OPTIMIZE). - - * acgroff.m4 (GROFF_SYS_SIGLIST): Don't quote program. - (GROFF_ARRAY_DELETE): Likewise. - (GROFF_CC_COMPILE_CHECK): Quote use of $2 and $3. - - * troff/env.cc (trie::~trie): Make virtual to shut up g++. - - * devps/psstrip.sed: Use different delimiter on last line (so that - it works with BSD 4.4 sed.) - -Mon Mar 29 17:07:14 1993 James Clark (jjc at jclark) - - * devps/psstrip.sed: Delete comments. - - * acgroff.m4 (AC_GETOPT): Don't test whether declares - optind, opterr, optarg. - * lib.h: When UNISTD_H_DECLARES_GETOPT is defined, declare optind, - opterr, optarg. - -Sun Mar 28 17:44:25 1993 James Clark (jjc at jclark) - - * Makefile.in (check): Dummy target. - -Wed Mar 3 04:53:38 1993 James Clark (jjc at jclark) - - * Version 1.07 released. - - * Integrate mm 1.11. - - * tbl/table.cc (alphabetic_block_entry::print): start_row was used - where start_col was meant. - -Thu Feb 25 07:55:36 1993 James Clark (jjc at jclark) - - * grog/grog.sh, grog/grog.pl: Recognize PH and SA as -mm macros. - -Wed Feb 24 10:15:34 1993 James Clark (jjc at jclark) - - * troff/input.cc (token::next): Make \z\o'...' and similar things - work. - - * env.h (MARGIN_CHARACTER_ON, MARGIN_CHARACTER_NEXT): New - constants. - (environment): Add margin_character_flags member. - * env.cc (environment::environment(symbol), - environment::environment(const environment *): Initialize - margin_character_flags. - (margin_character): Rewrite. - (environment::output_line): Add a margin character if - margin_character_flags is non-zero. Turn off the - MARGIN_CHARACTER_NEXT bit. If that makes margin_character_flags - zero, use margin_character_node without copying and then set - margin_character_node to 0. - - * devps/DESC.in: Change minimum size to 1000. - -Tue Feb 23 14:57:49 1993 James Clark (jjc at jclark) - - * troff/symbol.h (symbol::hash): Change return type to unsigned - long. - * troff/dictionary.cc (dictionary::lookup, dictionary::remove): - Add casts to int. - - * test-groff: Use -r rather than -x. - - * grops/psfig.diff: Include in distribution again. - -Mon Feb 22 09:10:44 1993 James Clark (jjc at jclark) - - * Makefile.in (dist): Use gzip. - -Sun Feb 21 11:12:53 1993 James Clark (jjc at jclark) - - * acgroff.m4 (GROFF_GETOPT): Check for declaration of getopt() in - unistd.h as well as in stdlib.h. - * include/lib.h: Include is STDLIB_H_DECLARES_GETOPT is - defined; otherwise include and if - UNISTD_H_DECLARES_GETOPT is defined. - - * configure.in: use builtin(include, ... rather than include(... - * configure: Regenerate with autoconf 1.3. - - * libdriver/print.cc (printer::adjust_arc_center): Use new - algorithm suggested by Andy Fyfe. - - * libdriver/printer.cc (printer::adjust_arc_center): New function. - * include/printer.h: Declare this. - * grops/ps.cc (ps_printer::draw): Use it. - * grodvi/dvi.cc (dvi_printer::draw): Use it. - -Fri Feb 19 23:13:51 1993 James Clark (jjc at jclark) - - * Makefile.comm (.man.n): Replace macrodir by tmacdir. - -Thu Feb 11 16:46:59 1993 James Clark (jjc at jclark) - - * eqn/main.cc (main): Handle "eqn -". - -Mon Jan 4 20:29:56 1993 James Clark (jjc at jclark) - - * tmac/tmac.e (++): Install fix from comp.bugs.4sd. - - * mm: Integrate version 1.08. - - * pic/troff.cc (troff_output::finish_picture): Set - EQN_NO_EXTRA_SPACE reg to 0 rather than removing it. - * eqn/box.cc (box::extra_space): Set EQN_NO_EXTRA_SPACE_REG to 0 - if it's not defined. Check whether the register is non-zero rather - than whether it's not defined. - * tmac.e ({, <): Make argument to \x zero if \n(0x is non-zero. - - * indxbib/indxbib.cc: Move all signal handling into... - * indxbib/signal.c: New file. - * configure.in: Call AC_RETSIGTYPE. - - * acgroff.m4 (GROFF_STRUCT_EXCEPTION): New macro. - * configure.in: Call GROFF_STRUCT_EXCEPTION. - * libgroff/matherr.c: Protect with ifdef HAVE_STRUCT_EXCEPTION. - - * troff/input.cc (token::token, token::operator=): Work round SGI - C++ bug. - * pic/object.cc (position::position): Likewise. - -Mon Dec 28 21:50:21 1992 James Clark (jjc at jclark) - - * pic/pic.h: Move declaration of hypot(). - -Wed Dec 16 12:28:29 1992 James Clark (jjc at jclark) - - * pic/pic.h: Declare hypot(). - - * pic/pic.h: Define M_PI if necessary. - -Thu Dec 10 12:03:29 1992 James Clark (jjc at jclark) - - * tmac/tmac.e (re): Add alternative version that doesn't use groff - `.ta T' feature. - - * devps/prologue.ps (RE): Handle the possibility that the old font - doesn't have a FontName entry. - -Wed Dec 2 10:25:29 1992 James Clark (jjc at jclark) - - * tmac/tmac.e (fam): Redefine to set family in environment 2. - (@C): Use @fam not fam. - -Thu Nov 26 16:01:25 1992 James Clark (jjc at jclark) - - * lookbib/lookbib.cc (main): Change type of start to const char *. - * lkbib/lkbib.cc (main): Likewise. - - * eqn/lex.cc (definition::definition): Don't use member - initializer syntax for members of anonymous unions. - - * troff/input.cc (input_stack::backtrace): Change type of to const - char *. - -Wed Nov 25 13:43:09 1992 James Clark (jjc at jclark) - - * include/stringclass.h (class string): Declare inline friend - functions as inline in class declaration. - * troff/hvunits.h (class hunits, class vunits): Likewise. - * include/refid.h (class reference_id): Likewise - * troff/troff.h (points_to_units(units), scale(units, double)): - Delete declarations. - * libdriver/input.cc (get_char): Delete declaration. - * include/lib.h: Change 2nd argument of getopt from const char ** - to char **. - * troff/symbol.cc (symbol::symbol): Cast `new char *[n]' to `const - char **' before assigning to a `const char **'. - * tbl/table.cc: Delete extra declarations of prints(). - -Tue Nov 24 14:33:13 1992 James Clark (jjc at jclark) - - * libgroff/font.cc (font::load_desc): Cast `new char *[n]' to `const - char **' before assigning to a `const char **'. - - * libgroff/errarg.cc (errarg::errarg): Don't use member - initializer syntax for members of anonymous unions. - -Sat Nov 21 05:02:23 1992 James Clark (jjc at jclark) - - * mm: Integrate version 1.07. - -Tue Nov 17 16:44:27 1992 James Clark (jjc at jclark) - - * troff/input.c (translate2): Rename to - (translate_no_transparent). - (init_input_requests): Rename tr2 to trnt. - -Mon Nov 16 09:49:32 1992 James Clark (jjc at jclark) - - * troff/charinfo.h (class charinfo): Add transparent_translate field. - (charinfo::set_translation, charinfo::set_special_translation): - Add second argument that specifies value for - transparent_translate. - (charinfo::get_translation, charinfo::get_special_translation): - Add optional second argument that specifies whether translation is - being used for transparent throughput. - * troff/input.cc (charinfo::set_translation, - charinfo::set_special_translation): Handle second argument. - (charinfo::charinfo): Initialize transparent_translate. - (translate): Split main part off into - (do_translate): New function. Pass argument saying whether - translation applies to transparent throughput. - (translate2): New request. - (init_input_requests): Bind translate2 to `tr2'. - -Wed Nov 11 11:43:20 1992 James Clark (jjc at jclark) - - * tbl/table.h (class table): Add `nokeep' flag. - * tbl/main.cc (process_options): Handle `nokeep' option. - * tbl/table.cc (table::init_output, table::do_row, table::do_top, - table::do_bottom): Don't output keep/release macro definitions or - calls when `nokeep' option has been specified. - -Sat Nov 7 01:28:33 1992 James Clark (jjc at jclark) - - * tmac/tmac.Xps (Xps-char): Use " as delimiter for \Z. - -Wed Nov 4 16:29:04 1992 James Clark (jjc at jclark) - - * tbl/table.cc (table_entry::divert, block_entry::do_divert, - block_entry::divert, alphabetic_block_entry::divert): Add extra - argument giving column separation. - (table::compute_widths): Pass column separation to - table_entry::divert(). - (block_entry::do_divert): If an entry spans multiple columns and a - minimumum width has been specified for each column, then set the - line length to the sum of the widths (plus possibly the column - separations). - - * troff/input.cc (set_escape_char): Don't set the escape_char - until after calling has_arg(). - -Tue Nov 3 11:23:27 1992 James Clark (jjc at jclark) - - * tbl/table.cc (table::do_top): Add missing \s0 for double box - case. - - * tbl/table.cc (table::print_double_hline): Avoid extra new line - in case where r > nrows - 1. - - * tbl/table.cc (BODY_HEIGHT): Deleted. - (LINE_SEP): New definition. - (table::print_single_hline, table::print_double_hline, - table::compute_vrule_top_adjust, table::compute_vrule_bot_adjust, - table::do_row, table::do_top): Use LINE_SEP space before a line - instead of \n[.v]-BODY_HEIGHT-BODY_DEPTH. - - * tbl/table.cc (text_entry::print_contents): New function. - (text_string_name, right_text_string_name): Deleted. - (TEXT_STRING, RIGHT_TEXT_STRING): Deleted. - (simple_text_entry::do_width, numeric_text_entry::do_width, - alphabetic_text_entry::do_width): Don't store the contents of the - entry in a string. - (left_text_entry::simple_print, right_text_entry::simple_print, - center_text_entry::simple_print, - alphabetic_text_entry::simple_print, - numeric_text_entry::simple_print): Print the entry directly - instead of using the stored string. - -Fri Oct 30 10:39:32 1992 James Clark (jjc at jclark) - - * devps/Makefile: Strip PostScript files. - * devps/prologue: Rename to... - * devps/prologue.ps. - * devps/psstrip.sed: New file. - * devps/download: Use .pfa rather than .ps for installed versions - of fonts. - -Thu Oct 29 09:14:43 1992 James Clark (jjc at jclark) - - * troff/env.cc (input_trap): Give a warning if the argument is out - of range. - - * troff/env.cc (adjust): Treat negative argument as missing. Round - argument > 5 down to 5. - - * troff/env.cc (center, right_justify): Make negative argument zero. - - * troff/div.cc (page_offset, vertical_position_traps): Treat - invalid argument as missing. - * troff/env.cc (line_spacing, line_length, title_length, indent, - underline, hyphen_line_max_request, control_char, - no_break_control_char, widow_control_request, adjust, input_trap, - point_size): Likewise. - * troff/node.cc (ligature, kern_request, bold_font, track_kern, - constant_space): Likewise. - * troff/input.cc (compatible, shift, warn_request, - set_escape_char): Likewise. - - * tbl/main.cc (format::format): Avoid doing `new int[0]'. - * tbl/table.cc (table::table): Likewise. - - * Makefile.dev (install_dev): depends on $(DEVFILES). - -Wed Oct 28 08:30:57 1992 James Clark (jjc at jclark) - - * devX75, devX75-12, devX100, devX100-12: New directories. - * Makefile.in: Add these to DEVDIRS. - - * troff/Makefile.sub, eqn/Makefile.sub, indxbib/Makefile.sub, - afmtodit/Makefile.sub, tmac/Makefile.sub, nroff/Makefile.sub, - grog/Makefile.sub, mm/Makefile.sub (uninstall_sub): New target. - * Makefile.in (uninstall, uninstall_sub, uninstall_dirs): New - targets. - * Makefile.ccpg, Makefile.cpg, Makefile.dev, Makefile.man - (uninstall): New target. - * Makefile.comm (uninstall, uninstall_sub, uninstall_man, - uninstall_prog, uninstall_dev): New targets. - - * troff/div.cc (return_request): Treat an invalid argument as - missing. - -Mon Oct 26 11:33:47 1992 James Clark (jjc at jclark) - - * tmac/tmac.e ((f): Set up the environment even when there's a - current diversion. Transperently throughput a call to @N. - (@N): New macro. - -Thu Oct 22 05:05:59 1992 James Clark (jjc at jclark) - - * tbl/table.cc (table::compute_vrule_top_adjust): Round adjustment - up to vertical resolution. - - * tbl/table.cc (table::do_row): Change row number after printing - stuff list. - - * pic/lex.cc (get_token_after_dot): Make .left and .right work. - -Wed Oct 21 14:46:45 1992 James Clark (jjc at jclark) - - * Rename CHANGES to NEWS. - -Tue Oct 20 23:25:21 1992 James Clark (jjc at jclark) - - * libgroff/new.cc (operator new): Avoid calling malloc(0). - -Mon Oct 19 09:10:13 1992 James Clark (jjc at jclark) - - * man.ultrix: Removed. - -Sun Oct 18 06:35:15 1992 James Clark (jjc at jclark) - - * Makefile.comm (extraclean): Delete files whose names begin with - `='. - - * pic/troff.cc (troff_output::text): Fix typo in implementation of - aligned text. - -Sat Oct 10 09:32:29 1992 James Clark (jjc at jclark) - - * troff/env.cc (hyphenate_request, vertical_spacing, no_number): - * troff/div.cc (page_length, need_space, space_request): Treat - invalid optional argument as missing. - * troff/env.cc (number_lines): If the first argument is present - but not a number, turn on line numbering, don't change the next - line number and parse the remaining arguments. - - * tmac/tmac.e (@q): Do the `ne' before changing to environment 2. - -Thu Oct 8 10:24:40 1992 James Clark (jjc at jclark) - - * eqn/box.h: Change declaration accordingly. - * eqn/box.cc (set_gsize): Change return type to int. Return 0 if - the specified size was bad but don't give an error. Check for - overflow. - * eqn/main.cc (main): Change caller. Leave validation to set_gsize. - * eqn/lex (do_size): Likewise. - -Wed Oct 7 09:48:59 1992 James Clark (jjc at jclark) - - * acgroff.m4 (GROFF_PROG_CCC): Use fopen when checking for C++ - compatible headers. - -Sun Oct 4 18:24:02 1992 James Clark (jjc at jclark) - - * tbl/table.cc (table::init_output): Improve error message when - table won't fit on one page. - -Fri Oct 2 10:41:40 1992 James Clark (jjc at jclark) - - * pic/troff.cc (troff_output::start_picture): Generate line - containing a horizontal motion equal to the width of the picture. - - * groff/groff.cc (main): Allow PROG_PREFIX to be set at runtime - using GROFF_COMMAND_PREFIX environment variable. - -Fri Sep 25 11:40:40 1992 James Clark (jjc at jclark) - - * mdate.sh: Use $NF rather than $(NF). - -Tue Sep 22 09:47:24 1992 James Clark (jjc at jclark) - - * pic/main.cc (main): Use %1 not %c in argument to warning. - - * eqn/main.cc (main): Output code to check that geqn was given the - correct -T option. - -Mon Sep 21 10:59:16 1992 James Clark (jjc at jclark) - - * Makefile.in (dist): Instead of doing `make -f ../Makefile', do - `ln -s ../Makefile .; make; rm -f Makefile'. - - * troff/hyphen: Rename to... - * troff/hyphen.us: - * troff/input.cc (main): Delete -H option. Don't call - read_hyphen_file(). - * troff/env.cc: Include searchpath.h and macropath.h. - (exception_dictionary): Deleted. - (ht): Deleted. - (read_hyphen_file): Deleted. - (hyphenation_language): New struct. - (class trie, class hyphen_trie): Move declarations up. - (trie_node::~trie_node): Deleted. - (trie::delete_trie_node): New function. - (trie::do_delete): New pure virtual function. - (hyphen_trie::do_delete): New function. - (trie::~trie): New function. - (hyphen_trie::~hyphen_trie): New function. - (trie::clear): No need to chcek that tp is not 0. - (current_language, language_dictionary): New variables. - (hyphen_word): Give an error if no current language. Use - exceptions dictionary in current language. - (hyphen_trie::read_patterns_file): Find file using macro_path. - Allow comments (starting with %) in patterns file. Don't make it - a fatal error if the file can't be found. - (hyphenate): Return if no current language. Get the exceptions - dictionary and the hyphenation patterns from the current language. - (set_hyphenation_language): New variable. - (hyphenation_patterns_file): New function. - (hyphenation_language_reg): New class. - (hyphenation_language_reg::get_string): New function. - (init_hyphen_requests): Bind "hla" to set_hyphenation_language and - "hpf" to hyphenation_patterns_file. Initialize `.hla' number - register. - * groff/groff.cc (main, help, synopsis): Delete -H option. - * include/Makefile.sub: Don't define HYPHENFILE. - * Makefile.in: Delete hyphenfile variable and remove from MDEFINES. - * Makefile.comm (.man.n): Don't substitute for HYPHENFILE. - * tmac/troffrc: Set hyphenation language to `us'. Load `hyphen.us' - hyphenation patterns. - -Sun Sep 20 09:33:02 1992 James Clark (jjc at jclark) - - * eqn/neqn.sh: New file. - * eqn/Makefile.sub: Handle neqn.sh. - - * eqn/eqn.h: Declare `nroff' variable. - * eqn/box.cc (param_table): Add `nroff' param. - (nroff): Define it. - * eqn/lex.cc (yylex): Handle TDEFINE and NDEFINE using `nroff' - variable. - * tmac/eqnrc: Set `nroff' to 1 for -Tascii or -Tlatin1. - - * troff/troff.h (WARN_FONT): New warning. - (WARN_TOTAL): Change accordingly. - * troff/input.cc (DEFAULT_WARNING_MASK): Include WARN_FONT. - (warning_table): Add WARN_FONT. - * troff/node.cc (mount_font_no_translate): Pass argument to - font::load_font. If this is non-zero, give a warning. - Don't give an error message when accessing a font that has already - been found to be invalid. - * include/font.h (font::load, font::load_font): Add additional - optional argument which suppresses error message if the font is - not found. - * libgroff/font.cc (font::load_font): Handle additional argument. - (font::load): Add additional argument. If this is non-null, set it - to 1 and don't give error message. - - * include/printer.h (printer::end_page): Add argument giving - length of page. - * libdriver/input.cc (do_file): Pass this. - * grops/ps.cc (ps_printer::end_page): Add argument. - * grodvi/dvi.cc (dvi_printer::end_page, - draw_dvi_printer::end_page): Add argument. - * grotty/tty.cc (class tty_printer): Remove lines_per_page and - columns_per_page members. New member nlines. - (DEFAULT_LINES_PER_PAGE): Deleted. - (tty_printer::tty_printer): Don't compute lines_per_page from - font::paperlength. Don't compute columns_per_page from - font::paperwidth. - (tty_printer::add_char): Don't check horizontal position against - columns_per_page. Grow glyphs vector if neccessary. - (tty_printer::end_page): Add argument giving page_length in units. - Discard lines past end of page. - -Wed Sep 16 06:29:52 1992 James Clark (jjc at jclark) - - * tmac/tmac.tty-char: Fix definition of \(/l. - - * tmac/tmac.X: Define \(en. - -Tue Sep 15 10:37:13 1992 James Clark (jjc at jclark) - - * acgroff.m4 (GROFF_PRINT): If a system has lpr and lp but not - lpq, then use lp rather than lpr. - - * tmac/tmac.s (par@reset): Don't call `ad'. - (par*env-init): Call `ad'. - -Sun Sep 13 18:48:20 1992 James Clark (jjc at jclark) - - * mdate.sh: Use $(NF) instead of $6 to extract year from output of - date. - - * troff/symbol.cc: #undef BLOCK_SIZE if it's defined. - * indxbib/indxbib.cc: Likewise. - -Sun Sep 6 09:44:46 1992 James Clark (jjc at jclark) - - * libgroff/putenv.c: New file. - * libgroff/Makefile.sub: Add putenv.c to CSRCS. - * Makefile.in: Say that putenv.o can be one of LIBOBJS. - * configure.in: Test for putenv with AC_REPLACE_FUNCS. Test for - stdlib.h with AC_HAVE_HEADERS. - -Sat Sep 5 18:11:52 1992 James Clark (jjc at jclark) - - * indxbib/dirnamemax.c: Include only if - does not exist. - -Fri Sep 4 09:43:26 1992 James Clark (jjc at jclark) - - * eqn/box.cc (gsize): Make it an int. - (set_gsize): Parse argument handling increment or decrement. - (box::top_level): Convert gsize to a string. - - * troff/input.cc (exit_troff): Make buf unsigned char []. - Call to make_temp_iterator casts buf to char*. - - * Makefile.in ($(TARGETS), dot): Pass $(MDEFINES) to recursive makes. - - * Makefile.ccpg (depend.temp): Depends on $(YTABC). - * Makefile.cpg (depend.temp): Likewise. - - * Makefile.dep: Remove Makefile.dep from $(REALCLEANFILES). - - * Makefile.comm: Add y.output to MOSTLYCLEANFILES. - -Thu Sep 3 08:01:55 1992 James Clark (jjc at jclark) - - * tmac/tmac.s (B, I, BI, CW): Rewrite avoiding aliases. - -Tue Sep 1 18:24:53 1992 James Clark (jjc at jclark) - - * Version 1.06 released. - - * Integrate mm 1.04. - -Fri Aug 28 11:28:19 1992 James Clark (jjc at jclark) - - * Makefile.comm, Makefile.ccpg, Makefile.cpg: Fix TAGS target. - -Thu Aug 27 11:03:33 1992 James Clark (jjc at jclark) - - * afmtodit/afmtodit.pl: Add -n option that disables generation of - ligatures command. - * devps/generate/Makefile (CR, CB, CI, CBI): Pass -n flag to - afmtodit. Regenerate. - - * tmac/tmac.e ()z): Adjust _b if necessary so as to avoid moving - @f back past the current position. - - * tmac/tmac.e: Change calls to @R so that comments are not part of - arguments. - -Tue Aug 25 10:42:07 1992 James Clark (jjc at jclark) - - * configure.in: Check for mkstemp with AC_HAVE_FUNCS. - - * acgroff.m4 (GROFF_PROG_CCC): Don't check for . Instead - check that we can link a call to a function declared in . - (GROFF_UNISTD_H): New macro. - * configure.in: Call it. - * Makefile.in: Document it. - * include/posix.h: New file. - * troff/troff.h: Don't include - * troff/input.cc: Include posix.h. - * libgroff/new.cc, libgroff/tmpfile.cc: Include posix.h rather than - osfcn.h. - * indxbib/indxbib.cc, libbib/{search.cc,linear.cc,index.cc}: - Include posix.h rather , , , - . - * indxbib/indxbib.cc (S_IRUSR, S_IRGRP, S_IROTH): Delete definitions. - * libbib/index.cc (S_ISREG, O_RDONLY): Delete definitions. - * libbib/search.cc (O_RDONLY): Delete definition. - * refer/refer.cc, include/driver.h, pic/pic.h, groff/groff.cc: - Don't include . - - * acgroff.m4 (GROFF_TIME_T): New macro. - * configure.in: Call it. - * Makefile.in: Document it. - - * acgroff.m4 (GROFF_TRADITIONAL_CPP): New macro. - * configure.in: Call it. - * Makefile.in: Document -DTRADITIONAL_CPP. - * include/ptable.h: Don't include generic.h. - (name2): Define it. - - * tmac/tmac.s (][): Make [T1 and [T2 aliases for [T. - Afterwards remove [T1 and [T2. - (ref*spec!0, ref*spec!2): Use T1 rather than T. - (ref*spec!1, ref*spec!4, ref*spec!4): Use T2 rather than T. - (ref*add-T2): Renamed from ref*add-T. - (ref*add-T1): New macro. - -Mon Aug 24 11:11:11 1992 James Clark (jjc at jclark) - - * acgroff.m4 (AC_PROG_CCC): Use GROFF_EXIT rather than exit 1. - - * libbib/index.cc: Include . - (O_RDONLY): Define if necessary. - (make_index_search_item, index_search_item_iterator::get_tag, - index_search_item::check_files): Use O_RDONLY. - * libbib/seach.cc: Include , , . - (O_RDONLY): Define if necessary. - (search_list::add_file): Use O_RDONLY. - * indxbib/indxbib.cc: Include , , - . - (S_IRUSR, S_IRGRP, S_IROTH): Define if necessary. - (main): Use these. - - * libbib/index.cc (S_ISREG): Define it if necessary. - (index_search_item::load): Use S_ISREG. - - * include/driver.h: Include . - -Sun Aug 23 11:32:18 1992 James Clark (jjc at jclark) - - * eqn/box.cc (body_height): Increase default value to 85. - (body_depth): Increase default value to 35. - -Fri Aug 21 05:34:42 1992 James Clark (jjc at jclark) - - * eqn/pbox.h (SAVE_FONT_STRING): Define it. - * eqn/box.cc (box::top_level): Hide use of \R in a string that is - protected from expansion with \E. - - * acgroff.m4 (GROFF_PAGE): Use `case' to test domain. - - * Makefile (Makefile): New target. - - * Makefile.sub (configure, distfiles): New targets. - - * acgroff.m4 (GROFF_BROKEN_SPOOLER_FLAGS): Avoid using ${var:-val} - construct. - -Thu Aug 20 12:27:26 1992 James Clark (jjc at jclark) - - * eqn/box.cc (param_table): Add body_height and body_depth. - - * eqn/lex.cc (def_table): Make circumflex in hat_def roman. - -Tue Aug 18 16:24:25 1992 James Clark (jjc at jclark) - - * psbb/Makefile.sub: Don't link with libgroff.a. - - * acgroff.m4 (GROFF_PUTENV): New macro. - * configure.in: Call GROFF_PUTENV. - * Makefile.in: Document STDLIB_H_DECLARES_PUTENV. - * groff/groff.cc: Don't declare putenv if STDLIB_H_DECLARES_PUTENV - is defined. - - * troff/env.cc (distribute_space): Rename force_forward argument - to force_reverse. Reverse the list if force_reverse is true. - -Mon Aug 17 17:49:05 1992 James Clark (jjc at jclark) - - * tmac/tmac.an: Don't define a string `T'. Just define Tm. - - * eqn/pile.cc (matrix_box::compute_metrics): Don't allow computed - height or depth to be negative. Guard against SUP_RAISE quantity - being negative. - -Sat Aug 15 08:18:54 1992 James Clark (jjc at jclark) - - * devps/generate/textmap: Add `an' (arrowhorizex). - * tmac/tmac.ps: \(an overlaps horizontally. - * tmac/tmac.dvi, tmac/tmac.tty: Add `an'. - - * devps/symbolchars: Add arrowverttp, arrowvertbt. - * devps/textmap: Add arrowvertex. - * eqn/delim.cc (delim_table): Add uparrow, downarrow and - updownarrow delimiters. - * tmac/tmac.ps, tmac/tmac.X: Add definition of \(va. - - * tbl/table.cc (simple_entry::position_vertically, - block_entry::position_vertically): For a centered entry, perform - the motion in two stages. - - * refer/refer.cc (split_punct): Don't call lookup_token if there - is no token. - -Fri Aug 14 11:14:58 1992 James Clark (jjc at jclark) - - * troff/input.cc (token::next): Delete token_node after copying - token. - - * grodvi/grodvi.cc (dvi_printer::dvi_printer): Initialize - cur_point_size. - - * libdriver/printer.cc (printer::load_font): Delete old_font_table. - - * grops/ps.cc (ps_printer::define_encoding): Delete elements of vec. - -Tue Aug 11 13:50:38 1992 James Clark (jjc at jclark) - - * grops/ps.cc (usage): -b option takes an argument. - - * devps/prologue (PLG): New procedure. - * grops/ps.cc (main, usage): New -g option. - (ps_printer::~ps_printer): If guess_flag is set, guess the paper - length using PLG. - -Mon Aug 10 11:17:53 1992 James Clark (jjc at jclark) - - * include/cset.h: Include if we have it. - - * libgroff/illegal.cc: New file. - * include/lib.h (illegal_input_char): Use table. - * troff/input.cc (ESCAPE_RIGHT_PARENTHESIS): Renumber to 0206. - * pic/lex.cc (ARG1): Renumber to 14. - * eqn/lex.cc (ARG1): Likewise. - - * troff/Makefile.sub (majorminor.cc): Handle 3 part versions - (eg 1.05.90) correctly. - -Sun Aug 9 13:35:43 1992 James Clark (jjc at jclark) - - * tmac/tmac.e (sr): Deleted. Set $r and $R directly. - Rename $r and $R registers to $v and $V. - ($r, $R): Initialize to 0. - (@v, @V): New macros. - (sz): Call @v. - (@M): Call @V. - - * troff/input.cc (main, usage): Add -R option that says not to - load troffrc. - * eqn/main.cc (main, usage): Rename -n to -R. - -Sat Aug 8 00:16:00 1992 James Clark (jjc at jclark) - - * devps/DESC.in: Leave font positions 5-9 blank. - * devdvi/DESC.in: Likewise. - - * grog/grog.pl: Handle `.PS 0. - - * macros/tmac.e (@R, @S): New macros. - Declare @, po, $0, $i, $p, df, so, fu, bt, *, ?a, ?b, ?C, ?e, ?H, - ?I, ?n, ?o, ?R, ?s, ?T, ?W, ?w registers with @R. - Declare $H, $[0-9], .. macros with @S. - Declare |0, |1, |2, |3 strings with @S. - - * macros/tmac.e (@S): Rename to @U. - - * macros/tmac.e (@z): Define @b and bp as empty instead of - deleting them, - - * macros/tmac.e (@m): Deleted. - (@h): Don't call @m. - (@z): Don't set @m trap. - - * macros/tmac.e ($h, $f): Define |z as empty string. - - * macros/tmac.e (@D): Rework to avoid unbalanced .el requests. - (@q): Likewise. - - * macros/tmac.e (@h): Set ?H, ?C , ?s registers to 0 rather than - removing them. - ()f): Likewise for * register. - - * macros/tmac.e (sr): Don't ever scale the arguments. If the third - argument is missing, don't change $R. Call sr with three - arguments when initializing. - -Thu Jul 16 12:17:12 1992 James Clark (jjc at jclark) - - * macros/tmac.e (sr): New macro. - Initialize $r and $R using sr. - - * macros/tmac.e (,): Delete \*(#[. - - * troff/env.c (set_tabs): Read the tab type even if the position - is bad. Allow the position of the first tab stop to be negative. - -Wed Jul 15 13:14:37 1992 James Clark (jjc at jclark) - - * refer/dirnamemax.c: Use pathconf() if defines - _POSIX_VERSION. - * refer/Makefile: Compile dirnamemax.c using -DHAVE_UNISTD_H - rather than -DPATHCONF_MISSING. - * Makefile: Get rid of PATHCONF_MISSING. - - * refer/map.c: New file. - * refer/index.c: Interface to mmap through map.c. Rename map_size - to map_len. - * refer/Makefile: Handle map.c. - * Makefile: Include -DHAVE_MMAP in OLDCFLAGS rather than CFLAGS. - -Tue Jul 14 14:15:20 1992 James Clark (jjc at jclark) - - * Makefile: RANLIB should be `true' if there is no ranlib. - * lib/Makefile (libgroff.a): Simplify. - * driver/Makefile (libdriver.a): Simplify. +2004-05-08 Jan Schaumann - * Makefile: Change -DWAIT_COREDUMP_0200 to -DWCOREFLAG=0200. - * groff.c (WCOREDUMP): Use WCOREFLAG. Define only if not already - defined. + * src/preproc/html/pre-html.cpp (make_message): Make it work for + snprintf versions which don't conform to ANSI C 99 (this is, + counting the string's trailing null byte in the return value). -Sat Jul 11 09:19:17 1992 James Clark (jjc at jclark) +2004-05-07 Keith Marshall - * troff/env.c (compare_ranges): Declare as extern "C". + * src/roff/troff/node.cpp (suppress_node::tprint): Don't expect + that all implementations of sprintf handle null pointers correctly. - * troff/input.c (init_registers): Use `struct tm' instead of `tm'. +2004-05-04 Werner LEMBERG - * macros/tmac.s, macros/tmac.e: Change .nx /dev/null to .nx. + * NEWS, man/groff_diff.man, man/groff.man, doc/groff.texinfo: + Document `.U' register. -Wed Jul 8 11:52:27 1992 James Clark (jjc at jclark) - - * pic/troff.c (troff_output::text): Merge in grops_output::text, - but conditionalize use of \X based on \*(.T. - (grops_output::*): Deleted. - * pic/output.h: Delete declaration of make_grops_output. - * pic/main.c (main): Ignore -p and -x. driver_extension_flag is 1 - by default. -n sets it to 0. - (usage): Corresponding changes. - * groff.c (main): Don't pass -x or -p to pic. - * groff.sh: Likewise. - - * ps/ps.c (ps_printer::do_exec, ps_printer::do_file): Force ndefs - to be non-zero. - - * ps/devps/afmtodit: Change calculation of asc_boundary and - desc_boundary. Make these bounds inclusive. - * ps/devps: Regenerate font files. - -Tue Jul 7 13:14:15 1992 James Clark (jjc at jclark) - - * macros/tmac.latin1: New file. - * macros/tmac.tty-char: Use tmac.latin1. - (tmac.tty-tr): Deleted. - * macros/Makefile: Install tmac.latin1. - * macros/tmac.dvi: Use tmac.latin1. - * macros/troffrc: Translate \[char160] onto no-break space here. - * macros/{tmac.dvi,tmac.ps,tmac.tty,tmac.X75}: Don't do it here. - -Mon Jul 6 11:06:52 1992 James Clark (jjc at jclark) - - * macros/tmac.Xps: Use `do' request. - - * macros/tmac.ps: Use `do' request. - - * macros/tmac.e (@C): Use `do' request. - - * macros/tmac.X, macros/tmac.Xps: Moved from xditview. - * macros/Makefile: Install tmac.X*. - - * tty/tmac.tty, tty/tmac.tty-char: Move to macros. - * tty/Makefile: Don't install tmac.tty*. - * macros/Makefile: Install tmac.tty*. - - * dvi/tmac.dvi: Move to macros. - * dvi/Makefile: Don't install tmac.dvi. - * macros/Makefile: Install tmac.dvi. - - * ps/tmac.ps*: Move to macros. - * ps/Makefile: Don't install tmac.ps*. - * macros/Makefile: Install tmac.ps*. - - * eqn/box.c: Provide draw_lines parameter corresponding to -D - option. - * macros/eqnrc: Set draw_lines parameter based on device. - * groff.c: Don't pass -D flag to eqn. - * groff.sh: Likewise. - * eqn/main.c: Warn about use of -D. - - * troff/input.c (process_startup_file): New function. - (main): Call process_startup_file(). - * macros/troffrc: New file. - * macros/Makefile: Install troffrc. - * groff.c (main): Don't pass extra -m option to troff. For a - pseudo device pass the name of the pseudo device to troff using - -d. - * groff.sh: Likewise. - * groff.c (possible_command::prepend_arg): Deleted. - - * troff/input.c (do_request): New function. - (init_input_requests): Bind "do" to do_request. - - * eqn/main.c (main): Instead of loading eqnchar from device directory, - load eqnrc from macro directory. - * macros/eqnrc: New file. - * macros/Makefile: Install eqnrc. - * ps/devps/eqnchar: Deleted. - * ps/devps/Makefile: Don't install eqnchar. - * dvi/devdvi/eqnchar: Deleted. - * dvi/devdvi/Makefile: Don't install eqnchar. - * groff.c (main): Pass -M to eqn. Don't pass -F to eqn. New - variable optM. - - * lib/device.[ch]: New files. - * lib/font.h (font::set_device_name, font::get_device_name): - Deleted. - * lib/fontfile.c: Use device.h. - * lib/Makefile: Handle device.[ch]. Make paths.h define DEVICE. - * troff/input.c: Delete definition of `device'. - (main): Don't initialize device. - * troff/troff.h: Include device.h rather than declaring device. - * troff/Makefile: No need to handle DEVICE. - * driver/input.c: Include device.h. Don't use - font::{set,get}_device_name. - * groff.c, Makefile: Rename device.h to config.h. - * groff.c: Use library device variable. - * eqn/main.c: Use library device variable. - * eqn/Makefile: No need to handle DEVICE. - - * lib/searchpath.[ch]: New files. - * lib/Makefile: Handle searchpath.[ch]. - * troff/input.c (open_file, init_dirs): Deleted. - (macro_dirs): Deleted. - (open_mac_file, macro_source): Use class search_path. - (add_string, struct string_list): Move definition. - (main): Change -M option to use macro_path. Delete call to - init_dirs(). - * lib/fontfile.c (font::command_line_font_dir, font::open_file): - Rewrite to use class search_path. - * lib/font.h, lib/fontfile.c (font::cl_font_dirs): Deleted. - * lib/Makefile: fontfile.c depends on searchpath.h. - * lib/Makefile: Rename fontpath.h to paths.h. Make paths.h define - MACROPATH. - * lib/macropath.[ch]: New files. - * troff/Makefile: No need to handle MACROPATH. - - * troff/input.c: Delete DUMP code. - * lib/fontfile.c, lib/font.h: Delete - font::forget_command_line_font_dirs. - - * troff/input.c (push_token): New function. - (handle_first_page_transition): Use push_token(). - (process_input_stack): Change handling of a space at the beginning - of the line. - -Sun Jul 5 17:11:09 1992 James Clark (jjc at jclark) - - * troff/input.c (font_dirs): Delete unused variable. - - * eqn/lex.c (do_set): Correct error messages. - -Sat Jul 4 10:20:55 1992 James Clark (jjc at jclark) - - * troff/input.c (do_define_string): Allow the string name to be - followed immediately by a tab. - (define_character): Likewise. - -Thu Jul 2 10:59:15 1992 James Clark (jjc at jclark) - - * ps/ps.c (ps_printer::draw): When drawing an arc, don't allow k to - be negative. - - * troff/input.c (input_iterator::is_file): New virtual function. - (file_iterator::is_file): New function. - (input_stack::end_file): New function. - (input_stack::next_file): Handle the situation where there is no - file on the input stack correctly. Avoid making two passes over - the input stack. - (next_file): Make the filename optional; in this case call - input_stack::end_file(). + * src/roff/troff/env.cpp (environment::mark_last_line) + [WIDOW_CONTROL]: Fix scope of `p' for new C++ compilers. -Wed Jul 1 10:17:25 1992 James Clark (jjc at jclark) +2004-05-04 Larry Kollar - * dvi/tmac.dvi: Change the definitions of \(ul and _ so that they - produce a real _ charater when the current font is CW and _ + New read-only register `.U'; it returns 1 in safer mode and 0 otherwise. - * lib/errarg.c (errarg::errarg(const char *)): Invert conditional - expression to work around gcc 2.2 bug. - -Wed Jun 24 08:12:24 1992 James Clark (jjc at jclark) - - * eqn/main.c (main): Don't give an error if we can't find eqnchar. - - * troff/env.c (environment::add_padding): New function. - (environment::add_char): Use add_padding(). - (environment::space): Likewise. - (environment::wrap_up_field): Add some padding if there is none - and there's no current tab. - * troff/env.h: Declare environment::add_padding. - -Mon Jun 22 08:37:45 1992 James Clark (jjc@jclark) - - * pic/pic.y: undef fmod and rand before declaring them. - -Sun Jun 14 11:40:18 1992 James Clark (jjc@jclark) - - * troff/input.c (main): If the DESC file specifies a font name of - 0, then leave the corresponding font position empty. - - * nroff.sh: New file. - * Makefile (install.nobin): Install nroff.sh. - - * tty/devlatin1/R.proto: Add ao as synonym for de. - * tty/tmac.tty-char: Define ao as o. - - * tty/dev{ascii,latin1}/R.proto: Add aq. - * tty/tmac.tty-char: Delete definition of aq. - -Mon Jun 8 11:43:20 1992 James Clark (jjc@jclark) - - * troff/input.c (init_charset_table): Don't translate 0240. - * ps/tmac.ps: Translate char160 to space. - * dvi/tmac.dvi: Likewise. - * tty/tmac.tty: Likewise. - -Sun Jun 7 10:52:35 1992 James Clark (jjc@jclark) - - * dvi/tmac.dvi: Add support for all Latin-1 characters. - - * macros/tmac.s: Delete definitions of \(rg, \(ah, \(ad, \(a-, - \(ao, \(ac, \(ho, \(-D, \(Sd, \(TP, \(Tp, \(ss, \(AE, \(ae, \(OE, - \(oe, \(r?, \(r!. - - * tty/tmac.tty-char: Add \(ah. - - * dvi/tmac.dvi: Add definitions of Tp, TP, Sd, -D, ho. - No need to define \(FM and \(!/. Conditionalize all character - definitions. - - * ps/devps/lgreekmap: Add +h, +f, +p. - - * ps/tmac.psnew: New file. - * ps/Makefile: Install tmac.psnew. - - * troff/input.c (charinfo_to_node_list): Don't ever interpret - character definitions in compatible mode. - - * troff/input.c (remove_character): New function. - (init_input_requests): Bind remove_character to "rchar". - - * ps/tmac.psold: New file. - * ps/Makefile: Install tmac.psold. - * ps/tmac.ps: Load tmac.psold. Move definitions of ISO Latin-1 - characters into tmac.psold. Make these definitions unconditional. - - * tty/tmac.tty-char: Define \n(_C only if it is not already defined. - - * ps/tmac.ps: Don't define \('c and \('C. - - * ps/devps/textmap: Move Greek characters to... - * ps/devps/symbolchars: - -Sat Jun 6 16:41:17 1992 James Clark (jjc@jclark) - - * ps/devps/text.enc: Add quotesingle. - * ps/devps/textmap: Add +h, +f, +p, Fn, Bq, bq, aq, lz. - * tty/tmac.tty-char: Likewise. - * dvi/devdvi/texmi.map: Add +h, +f, +p. - * dvi/devdvi/texi.map: Add Fn. - * dvi/devdvi/msam.map: Add lz. - * dvi/tmac.dvi: Handle Bq, bq, aq. - - * pic/lex.c (get_token): Recognize 'th. - * pic/map.y: Allow `expr'th in contexts where ORDINAL was allowed. - -Fri Jun 5 11:20:46 1992 James Clark (jjc@jclark) - - * ps/devps/textmap: Move di, mu, +- to... - * ps/devps/symbolchars: - - * macros/tmac.s (@XS): Don't call par@reset or fi. - (XA): Call LP. Turn off adjustment. Reduce line length. - - * macros/tmac.s: Initially alias XS to LP. - (XS): Rename to @XS. - (cov*ab-init): Alias XS to @XS. - -Thu Jun 4 09:12:05 1992 James Clark (jjc@jclark) - - * troff/token.h: Delete TOKEN_CHAR_HEIGHT, TOKEN_CHAR_SLANT, - TOKEN_FONT_NAME, TOKEN_FONT_POSITION, TOKEN_SIZE tokens. - (token::is_size, token::changes_env): Deleted. - * troff/number.c (parse_term): No need to process \s explicitly. - Call tok.next() only after scale indicator has been processed. - * troff/input.c (do_overstrike, do_bracket): No need to process \s, - \f etc explicitly. - (token::next): Handle \s, \f, \S, \H immediately rather than - returning them as tokens. - (token::operator==, token::description, token::add_to_node_list, - token::process): Remove handling of deleted tokens. - - * troff/env.c (environment::add_char): When adding padding - indicator character, call start_line() if necessary. - -Wed Jun 3 09:55:50 1992 James Clark (jjc@jclark) - - * ps/devps/afmtodit: Don't output 0 kerns. - - * ps/devps/afmtodit: Remove directory from name of encoding in - font description file. - - * ps/devps/afmtodit: Improve error messages. - - * ps/devps/afmtodit: Allow DESC file to be specified with -d. - - * ps/devps/Makefile: Incorporate FontMakefile. Rework. - * ps/devps/FontMakefile: Deleted. - * ps/devps/afmname: New file. - - * ps/devps/symbol.sed: New file. - * ps/devps/symbol.diff: Deleted. - * ps/devps/FontMakefile: Generate symbol.afm using symbol.sed. - Generate zapfdr.afm from zapfd.afm. - - * tty/tmac.tty (tty-char): Prefix definition with ". - - * macros/tmac.an (TP): Don't start a diversion if one has already - been started. - - * tty/tmac.tty-char: Add Latin-1 characters. - - * tty/tmac.tty-char: Incorporate suggestions from Paul Eggert. - -Tue Jun 2 00:54:34 1992 James Clark (jjc@jclark) - - * tbl/table.c (table::allocate): Delete old_vline, old_entry. - Move declaration of struct horizontal_span. - - * tbl/table.c (table::table): Initialize span_list. - (table::~table): Delete span_list. - - * lib/ptable.h (PTABLE(T)::~PTABLE(T)): Delete v. - - * ps/devps/Makefile: Avoid dependency on GNU make. - - * ps/tmac.ps: Check that character does not already exist before - defining it. - - * tty/tmac.tty: Add definitions of \(ff, \(!=, \(==, \(~=, \(sq, - \(OE, \(oe, \(AE, \(ae, \(lh, \(rh. Delete definitions of \(en, - \(ru, \(ul, \(br, \(bv, \(sl which are in the font description - files. - - * tty/tmac.tty-char: New file. - * tty/Makefile: Install tmac.tty-char. - * tty/tmac.tty: Move definitions of \(ua, \(da, \(uA, \(dA into - tmac.tty-char. - - * tty/tmac.tty: Fix definition of \(34. - - * tty/dev{ascii,latin1}/R.proto: Add ha and ti. Map - bracket-drawing characters onto |. Add *o. - - * troff/env.c (environment::wrap_up_tab): Increment field_spaces - only if current_field. - - * troff/dictionary.c (dictionary::lookup): Free old_table after - rehashing. - -Mon Jun 1 10:15:22 1992 James Clark (jjc@jclark) - - * tty/dev{ascii,latin1}/R.proto: Add uppercase Greek characters - whose glyphs are identical to glyphs of some Roman character. - - * tty/devlatin1/R.proto (bu): Deleted. - * tty/devascii/R.proto (bu): Deleted. - * tty/tmac.tty: Add definition of \(bu. - - * eqn/main.c (do_file): Pass FILE as argument. - (main): Automatically load eqnchar. New options -F and -n. - Pass do_file an opened FILE. - * groff.c: Don't pass eqnchar to eqn. Pass -F options onto eqn. - No need to include font.h. - * groff.sh: Likewise. Don't need to use - for standard input. - Prefix files with -- if first file starts with -. - - * macros/tmac.e: Conditionalize use of \$* on \n(.g. - - * troff/env.c (environment::possibly_break_line): Don't set line - to 0 across call to output_line(). Don't call output_line() until - after discarding nodes after break. - -Sun May 31 10:45:29 1992 James Clark (jjc@jclark) - - * request.h (macro::empty): Declare it. - * input.c (macro::empty): New method. - (interpolate_macro): Don't give a WARN_SPACE if the two-character - macro is empty. - -Sat May 30 10:27:15 1992 James Clark (jjc@jclark) - - * troff/env.c (environment::start_field): Decrement space_total - when a space is frozen. - -Fri May 22 14:34:38 1992 James Clark (jjc@jclark) - - * macros/tmac.an (R): Delete macro. - - * troff/input.c (get_copy, token::next): Support \# (like \" but - newline is ignored). - - * troff/input.c (token::next): Fix error message in 'Y' case. - -Thu May 21 09:26:24 1992 James Clark (jjc@jclark) - - * eqn/delim.c (define_extensible_string): Recognize any prefix of - a delimiter name. - -Fri May 15 10:20:41 1992 James Clark (jjc at jclark) - - * c++test.c: Include . - - * lib/strtol.c, lib/getcwd.c, ps/psbb.c: Declare errno in case - doesn't. - -Fri May 8 09:37:19 1992 James Clark (jjc at jclark) - - * tbl/table.c (table::divide_span): Don't count column separation - if expand was specified. + * src/roff/troff/input.cpp (init_input_requests): Implement `.U' + register. - * tbl/main.c (process_format): Don't ignore width specs in - continued format. Give warning for changing equal widths or - column separation in continued format. - (process_data): Set column separation, minimum width, equal - columns at end of table. +2004-05-03 Werner LEMBERG -Thu May 7 08:50:40 1992 James Clark (jjc at jclark) + * install-sh, mkinstalldirs: New versions; taken from texinfo CVS. - * troff/node.c (kern_pair_node::add_discretionary_hyphen, - node::add_discretionary_hyphen): Use soft_hyphen_char. - (set_soft_hyphen_char): New function. - (init_node_requests): Bind to shc. Initialize soft_hyphen_char. +2004-04-17 Werner LEMBERG - * Makefile (c++tested): Give more helpful message if test fails. + * src/include/font.h (font): Use `int' for ch_index. + * src/libs/libgroff/font.cpp (font::alloc_ch_index, + font::compact): Updated. -Tue May 5 10:58:39 1992 James Clark (jjc at jclark) + * src/roff/groff/pipeline.c (run_pipeline) [_WIN32]: Fix compiler + warnings. - * troff/input.c (init_charset_table): Translate 0240 to - an unbreakable space. + * src/roff/troff/div.cpp (begin_page), src/roff/troff/env.cpp + (hyphen_word): Fix compiler warnings. + * src/roff/troff/input.cpp (get_char_for_escape_name): Return + `char'. + Update all callers. + (get_delim_number, get_line_arg): Change second argument type to + `unsigned char'. + (macro_header::copy, token::next, do_define_string, + do_define_character, substring_request, asciify_macro, + unformat_macro, read_size, non_interpreted_node::interpret, + while_request, main: Fix compiler warnings. + (read_color_draw_node): Initialize `col'. - * troff/token.h (token::hyphen_indicator): New function. - * troff/charinfo.h (TRANSLATE_HYPHEN_INDICATOR): New special - translation. - * troff/input.c (translate): Allow translation to \%. - * troff/node.c (node::add_char): Handle - TRANSLATE_HYPHEN_INDICATOR. - (make_node): Don't allow TRANSLATE_HYPHEN_INDICATOR here. + * src/preproc/tbl/table.cpp (horizontal_span, table_entry): Make + `start_col' and `end_col' of type `int'. + (vertical_rule): Make `col' of type `int'. - * troff/input.c (init_charset_table): Don't set BREAK_AFTER flag - for \(hy. + * src/preproc/grn/hdb.cpp (DBRead): Protect call to getc with check + for EOF. - * tty/devlatin1/R.proto: \(hy and - should print as 055. + * src/preproc/refer/label.y (uppercase_array, lowercase_array): + New arrays. + (format_serial): Use them to remove dependency on ASCII. -Tue Apr 21 09:24:42 1992 James Clark (jjc at jclark) + * src/devices/grops/ps.cpp (ps_printer::define_encoding): Fix + compiler warning. + * src/devices/grops/psrm.cpp (resource_manager::supply_resource): + Ditto. - * groff.c (run_commands): If the last command gets a SIGPIPE send - a SIGPIPE to all children than haven't yet terminated. When - command terminates, set pid field to -1. + * src/devices/grotty/tty.cpp (tty_font::load_tty_font): Fix + compiler warnings. + (glyph): Change type of `hpos' to `int'. -Fri Apr 17 11:20:48 1992 James Clark (jjc at jclark) + * src/devices/lbp/lbp.cpp (strsep): Removed. Unused. + * src/devices/lbp/lbp.h (splinerel): Fix compiler warnings. - * groff.c (main): Pass an appropriate -filename option to gxditview. + * src/utils/tfmtodit.cpp (gf::load): Fix compiler warnings. -Thu Apr 16 15:11:40 1992 James Clark (jjc at jclark) + * src/utils/pfbtops/pfbtops.c (get_text): Fix compiler warning. - * Makefile.bd (install): Remove existing program before copying. +2004-04-16 Werner LEMBERG - * Makefile, */Makefile, Makefile.bd, groff.sh, groff.c: Allow - programs which have Unix counterparts to be installed with - user-specified prefix. + * src/devices/grolbp/lbp.h, src/preproc/grn/gprint.h, + src/preproc/grn/hgraph.cpp, src/preproc/grn/hpoint.cpp, + src/preproc/html/pushback.cpp, src/preproc/html/pushback.h: Use + `double' instead of `float' everywhere. + * src/preproc/grn/main.cpp: Use `double' instead of `float' + everywhere. + (main): Add return value. + * src/preproc/grn/hdb.cpp: Use `double' instead of `float' + everywhere. + Update all user functions. - * troff/input.c (exit_troff): Don't check if exit_started. - (exit_request): Don't call exit_troff if exit_started. + * src/include/search.h, src/include/ptable.h, src/include/printer.h, + src/preproc/eqn/box.h, src/preproc/pic/object.h, + src/preproc/refer/refer.h, src/preproc/tbl/table.h, + src/preproc/tbl/table.cpp, src/roff/troff/env.h, + src/roff/troff/div.h, src/roff/troff/token.h, src/roff/troff/node.h, + src/roff/troff/input.cpp, src/roff/troff/request.h, + src/roff/troff/node.cpp: Don't mix `struct' and `class' in forward + declarations. - * Makefile.bd (install.mm): Rename to install.dwbmm. + * src/utils/indxbib/signal.c: Include stdlib.h. -Tue Apr 14 10:05:10 1992 James Clark (jjc at jclark) +2004-04-14 Keith Marshall - * driver/input.c (do_file): Add missing break for '#' case. + * tmac/s.tmac (@init, RP): Allow initialization of the PO register + before the first page. -Mon Apr 13 10:11:02 1992 James Clark (jjc at jclark) +2004-04-14 Thomas Klausner - * troff/input.c (input_stack::clear): Clear past any boundaries and - then add the boundaries back. + * tmac/doc-common (doc-volume-as-*): Use lowercase names. + (doc-operating-system-*): Updated. + * tmac/doc-syms (doc-str-St-*): Various small fixes. + (doc-str-Lb-*): Add more library names. - * troff/input.c (exit_troff): Return immediately if already - exiting. +2004-04-10 Art Haas - * macros/tmac.s (pg@end-text): New macro. Use pg@end-text for the - end macro. - (pg*end-page): If the text has ended and there are no more - footnotes or keeps, exit. + * src/utils/hpftodit/hpuni.cpp (hp_msl_to_unicode_list): Don't + use anonymous type. - * macros/doc-ditroff (Lq, Rq): Define as \(lq and \(rq. +2004-04-09 Art Haas - * troff/input.c (init_charset_table): Make \(rq transparent by - default. + * src/utils/tfmtodit.cpp (lig_chars): Don't use anonymous type. - * macros/tmac.an: Define lq and rq strings. +2004-04-09 Keith Marshall - * macros/tmac.s (Q, U): Define as \(lq and \(rq. + * arch/misc/shdeps.sh: Generate better comment for sed script. -Sun Apr 12 12:54:37 1992 James Clark (jjc at jclark) +2004-04-08 Art Haas - * troff/env.c (environment::final_break): New function. - (environment::newline): Set prev_line_interrupted to 2 if - exit_started. - * troff/env.h: Declare environment::final_break. - * troff/input.c (exit_troff): Call environment::final_break() - instead of environment::do_break(). + * src/libs/libgroff/glyphuni.cpp (glyph_to_unicode_list), + src/libs/libgroff/uniglyph.cpp (unicode_to_glyph_list), + src/libs/libgroff/uniuni.cpp (unicode_decompose_list), + src/preproc/eqn/box.cpp (param_table), src/preproc/grn/hgraph.cpp + (polyfill), src/preproc/grn/main.cpp (polyfill), + src/preproc/refer/command.cpp (command_table), + src/utils/tfmtodit.cpp (lig_table): Don't use anonymous types (which + gcc 3.5 doesn't like). - * macros/Makefile: Install man.local if $(MACRODIR)/man.local - doesn't already exist. - * macros/man.local: New file. - * macros/tmac.an: Load man.local. - * macros/man.ultrix: New file. +2004-04-08 Werner LEMBERG -Sat Apr 11 17:32:04 1992 James Clark (jjc at jclark) + Removing many compiler warnings. groff should now compile with + a C++ compiler used for C files also. [Simple variable renamings + to avoid shadowing aren't logged in detail.] - * troff/input.c (exit_groff): Rename to... - (exit_troff): New function. + * src/devices/grodvi/dvi.cpp: Some local variable renamings. + (draw_dvi_printer::draw) ['c']: Enclose in block. - * troff/div.c (exit_started, done_end_macro, - seen_last_page_ejector): New global variables. - (began_page_in_end_macro): New static variable. - (exit_flag): Deleted. - (top_level_diversion::top_level_diversion): Initialize - last_page_count. - (top_level_diversion): More elaborate test for whether - cleanup_and_exit() should be called. - Set began_page_in_end_macro if the end macro isn't yet finished. - * troff/div.h (top_level_diversion::last_page_count): New data - member. - (top_level_diversion::set_last_page): New function. - (exit_started, done_end_macro, seen_last_page_ejector): Declare. - * troff/env.c (do_break): Zero prev_line_interrupted. - * troff/input.c (exit_flag): Delete declaration. - (LAST_PAGE_EJECTOR): New magic cookie. - (token::next): Handle LAST_PAGE_EJECTOR. - (exit_groff): Set exit_started and done_end_macro instead of - exit_flag. Call top_level_diversion::set_last_page. Push a - LAST_PAGE_EJECTOR instead of calling push_page_ejector(). Do - another ejection after setting seen_last_page_ejector. + * src/devices/grohtml/post-html.cpp: Some local variable renamings. + (page::add_line): Fix typos. + * src/devices/grohtml/html-text.cpp: Some local variable renamings. -Thu Apr 9 04:37:11 1992 James Clark (jjc at jclark) + * src/devices/grolbp/lbp.cpp: Don't define _GNU_SOURCE. + Some local variable renamings. + * src/devices/grolbp/lbp.h: Some local variable renamings. - * etc/grog.sh, etc/grog.sh: Recognize -me sh macro. + * src/devices/grolj4/lj4.cpp, src/devices/grotty/tty.cpp: Some local + variable renamings. - * macros/tmac.e (TH): Make sure there's room for the initial - header. + * src/libs/libbib/index.cpp (index_search_item_iterator::get_tag): + Remove redundant local variable declaration. + * src/libs/libbib/map.c (mapread, unmap): Don't use K&R style. + Don't use `caddr_t' but `void *'. + Enclose functions with `extern "C"' for C++. - * macros/tmac.s (par@init): Make PD and DD at least \n(.V. - Set FVS in points rather than units. + * src/libs/libdriver/input.cpp (remember_filename, + remember_source_filename): Use cast for string constant. -Mon Apr 6 11:21:32 1992 James Clark (jjc at jclark) + * src/libs/libgroff/font.cpp, src/libs/libgroff/fontfile.cpp, + src/libs/libgroff/nametoindex.cpp, src/libs/libgroff/paper.cpp, + src/libs/libgroff/geometry.cpp: Some local variable renamings. + * src/libs/libgroff/iftoa.c, src/libs/libgroff/itoa.c: Don't use K&R + style. + Enclose functions with `extern "C"' for C++. + * src/libs/libgroff/quotearg.c (TRUE,FALSE): Define as macros. + (needs_quoting): Return `int'. + (quote_arg): Add proper casts to malloc and realloc. + * src/libs/libgroff/spawnvp.c: Compile code only for MS-DOS and + various MS Windows environments. + (spawnvp_wrapper): Add proper cast to malloc. - * troff/div.c (top_level_diversion::add_trap): Don't consider the - position of empty slots. + * src/preproc/eqn/box.h: Remove redundant declarations of + `make_script_box', `make_mark_box' and `make_lineup_box'. + * src/preproc/eqn/eqn.y: Remove redundant declaration of `strsave'. + * src/preproc/eqn/script.cpp, src/preproc/eqn/pile.cpp: Some local + variable renamings. -Fri Apr 3 10:46:45 1992 James Clark (jjc at jclark) + * src/preproc/grn/hpoint.cpp: Some local variable renamings. + * src/preproc/grn/hgraph.cpp: Some local variable renamings. + (dx, dy): Renamed functions to... + (deltax, deltay): This. + * src/preproc/grn/main.cpp: Some local variable renamings. + (deffont): Add `const'. + (initpic, conv): Use cast for string constant. - * ps/devps/S: Fix height and depth of parenrightex. - * ps/devps/symbol.diff: Regenerate. + * src/preproc/html/pre-html.cpp: Some local variable renamings. + (makeFileName, alterDeviceTo, addZ): Use cast for string constant. + (char_buffer::run_output_filter): Second argument is unused. + * src/preproc/html/pushback.cpp: Some local variable renamings. -Sat Mar 28 21:17:52 1992 James Clark (jjc at jclark) + * src/preproc/pic/pic.y: Remove redundant declaration of `do_copy'. + * src/preproc/pic/object.cpp: Some local variable renamings. - * tmac.e (u): Do underlining as in -mgs. + * src/preproc/refer/label.y (lookup_label): Remove redundant + declaration of local variable. -Fri Mar 27 09:23:44 1992 James Clark (jjc at jclark) + * src/preproc/soelim.cpp: Remove redundant declaration of + `interpret_lf_args'. - * tty/tty.c (tty_printer::end_page): If overstriking is - suppressed, still turn overstruck horizontal and vertical lines - into +. + * src/preproc/tbl/main.cpp: Some local variable renamings. - * lib/new.c: Back out Feb 24 change; no longer needed with gcc - 2.1. + * src/roff/groff/groff.cpp (main): Use cast for string constant. + * src/roff/groff/pipeline.c: Enclose declarations of `error', + `c_fatal', and `i_to_a' with `extern "C"' for C++. + Don't use C++-style comments. - * refer/label.y (format_expr::evaluate): Avoid use of %0*d. + * src/roff/troff/env.h: Remove redundant declaration of `title'. + * src/roff/troff/node.h, src/roff/troff/env.cpp, + src/roff/troff/div.cpp, src/roff/troff/node.cpp: Some local variable + renamings. + * src/roff/troff/div.h: Remove redundant declaration of + `end_diversions'. + * src/roff/troff/troff.h: Remove redundant declaration of + `cleanup_and_exit' + * src/roff/troff/input.cpp: Remove redundant declaration of + `handle_first_page_transition' and `process_input_stack'. -Wed Mar 18 09:29:10 1992 James Clark (jjc at jclark) + * src/utils/hpftodit.cpp: Some local variable renamings. - * Version 1.05 released. + * src/utils/indxbib/signal.c: Enclose functions with `extern "C"' + for C++. + Don't define RETSIGTYPE. + * src/utils/indxbib/indxbib.cpp: Some local variable renamings. -Tue Mar 17 16:50:45 1992 James Clark (jjc at jclark) + * src/utils/pfbtops/pfbtops.cpp: Don't use K&R style. + (error): Use `const' in argument. + (main): Remove redundant declaration of `optind'. + Move declaration of `Version_string' to top-level. - * tty/tty.c: Instead of keeping an array of glyphs and then - sorting it, keep a ordered linked list of glyphs for each line. + * PROBLEMS: Document difficulties compiling signal.c if a C++ + compiler is used for C. - * driver/driver.h: Include stddef.h. +2004-04-07 Werner LEMBERG - * tty/tty.c (compare_glyph): - * refer/refer.c (rcompare): - * troff/env.c (compare_ranges): Arguments of qsort comparison - function should be const void *. + * Makefile.sub (DISTCLEANFILES): Add `test-groff'. - * troff/number.c (parse_term): - * dvi/dvi.c (draw_dvi_printer::draw): Avoid initialization in - switch statement. +2004-04-06 Keith Marshall - * refer/label.y (consider_authors): Don't access variables - constructed under a condition outside that condition: put braces - round for statement containing declaration; redeclare use of same - variable later. + Make scripts like nroff.sh and neqn.sh portable across various + (Unix-like) shell implementations from Cygwin, MSYS, etc., which use + non-POSIX path separators. The idea is to extend those scripts to + decide at run-time (of the script) which path separator to use. - * pic/pic.y (text_expr): Delete production that allows - parenthesised text_expr. - (expr): Allow a conditional_expr to appear in parentheses. - (conditional_expr): Rename to any_expr. + * arch/misc/Makefile.sub: New file. + * arch/misc/shdeps.sh: New file, generating OS dependency fixups. + This script handles @GROFF_BIN_PATH_SETUP@, replacing it with + a proper definition of the variable `GROFF_RUNTIME'. - * mm: Install new version 1.01 from jh. + * Makefile.in (SH_DEPS_SED_SCRIPT): New variable. + (MDEFINES): Add SH_DEPS_SED_SCRIPT. + (PROGDEPDIRS): New variable. + `FORCE' it. + (PROGDIRS): Add PROGDEPDIRS. - * lib/font.c (font::get_width): Cache scaled widths. - (font::font): Initialize widths_cache. - (font::~font): Destroy widths_cache. - * lib/font.h: Add font::widths_cache. Declare font_widths_cache. + * src/preproc/eqn/Makefile.sub (neqn): Call SH_DEPS_SED_SCRIPT. + Don't substitute @SEP@ and @BINDIR@. + * src/preproc/eqn/neqn.sh: Use @GROFF_BIN_PATH_SETUP@. + (PATH): Use GROFF_RUNTIME. -Mon Mar 16 10:16:10 1992 James Clark (jjc at jclark) + * src/roff/nroff/Makefile.sub (nroff): Call SH_DEPS_SED_SCRIPT. + Don't substitute @SEP@ and @BINDIR@. + * src/roff/nroff/nroff.sh: Use @GROFF_BIN_PATH_SETUP@. + (PATH): Use GROFF_RUNTIME. - * c++test.c, c++test.ref: New files. - * Makefile: Check that the C++ compiler works. +2004-04-05 Keith Marshall - * ps/tmac.pspic (PSPIC): Do a break. + * src/roff/nroff/nroff.sh: Implement work-around for sh.exe from + Cygwin which doesn't handle stderr correctly. - * ps/tmac.ps: Move definition of PSPIC into... - * ps/tmac.pspic: New file. - (PSPIC): Draw box around picture, but make it invisible to grops. - * ps/tmac.ps: Load tmac.pspic. - * ps/Makefile: Install tmac.pspic. +2004-03-08 Werner LEMBERG -Sun Mar 15 14:18:08 1992 James Clark (jjc at jclark) + * Makefile.comm (install_dev, uninstall_dev): Protect `for' loops + against empty argument. Problem reported by . - * lib/font.c (scale_round): If n is negative, - subtract .5 before truncating floating point result. +2004-03-05 Keith Marshall - * lib/fontfile.c: Include . + * Makefile.in (SEP): Replaced with... + (RT_SEP, SH_SEP): Separators for the target platform's native path + separator and the build environment, respectively. + (fontpath, tmacpath): Use RT_SEP. + (MDEFINES): Updated. -Tue Mar 10 14:17:03 1992 James Clark (jjc at jclark) + * contrib/mom/Makefile.sub (GROFF_BIN_PATH): Use SH_SEP. + * doc/Makefile.sub (GROFF_BIN_PATH): Use SH_SEP. + * src/preproc/eqn/Makefile.sub (neqn): Use SH_SEP. + * src/roff/nroff/Makefile.sub (nroff): Use SH_SEP. - * driver/input.c (get_char): Inline. Don't update current_lineno. - Change callers to up date current_lineno if necessary. - Use get_char() instead of getc(current_file). +2004-03-05 Werner LEMBERG -Sun Mar 8 18:05:28 1992 James Clark (jjc at jclark) + * fonts/devlj4/Makefile.sub (LJ4RES): Set to 1200. This helps to + reduce alignment problems with newer printers which use built-in + TrueType fonts (instead of the older Intellifonts). The ideal + solution is to provide a second set of groff metric files, but this + is extremely time-consuming to produce, given that HP's metric + files are very rudimentary. - * ps/tmac.ps: Fix up spacing of \(mo and \(nm. +2004-03-01 Werner LEMBERG -Fri Mar 6 19:38:58 1992 James Clark (jjc at jclark) + * src/devices/grolj4/lj4.cpp (main): Fix argument of getopt_long. + s/operand/argument/ in error message. - * tty/tty.c (tmac.tty): Define \(rg as (R). +2004-03-01 Keith Marshall -Tue Mar 3 10:11:25 1992 James Clark (jjc at jclark) + * src/roff/groff/groff.cpp (main): Don't allow option -o if -Thtml + is in use. - * lib/lib.h: New define a_delete. - * Use a_delete instead of delete when deleting an array of objects - without destructors. +2004-03-01 Antti Kantee - * lib/lib.h: Rename adelete to ad_delete. - * Change uses of adelete. + * tmac/s.tmac (XE): Fix error message. -Mon Mar 2 12:41:05 1992 James Clark (jjc at jclark) +2004-02-27 Jeff Conrad - * eqn/eqn.y: Include lib.h. + * src/include/nonposix.h (write, dup, dup2, close) [_MSC_VER]: + New macros. - * troff/node.c (grow_font_table): Delete old_font_table. + * src/roff/groff/pipeline.c: Declare strcasecmp. + (run_pipeline) [_WIN32]: Use function name variants which don't + start with `_'. + Fix stream handling. - * mm: Install new version from jh. +2004-02-27 Keith Marshall -Fri Feb 28 10:42:23 1992 James Clark (jjc at jclark) + * src/include/nonposix.h: Fix declaration of `system_shell_name'. + Declare `spawnvp_wrapper' and macro definitions of spawnvp only + for platforms which use the native Win32 runtime libraries. + (FLUSH_INPUT_PIPE) [_UWIN]: Provide non-empty version. - * tbl/table.h (format_type): Make global instead of local to class - entry_format. Prefix enumerators with FORMAT_. - * tbl/table.c, tbl/main.c: Corresponding changes. - * refer/token.h (token_type): Make global. Prefix enumerators - with TOKEN_. - * refer/token.[ch]: Corresponding changes. - * Makefile: Get rid of -DNO_NESTED_TYPES configuration option. + * src/libs/libgroff/quotearg.c (QUOTE_ARG_MALLOC_ERROR, + QUOTE_ARG_REALLOC_ERROR): Fix string. - * troff/div.c (node::set_vertical_size): Don't name argument. + * src/preproc/html/pre-html.cpp: Remove declaration of + `spawnvp_wrapper'. + Don't use __MINGW32__. + s/DEBUG_FILE/DEBUG_FILE_DIR/. + (DEBUG_TEXT, DEBUG_NAME, DEBUG_FILE) [DEBUGGING]: New macros. + (OUTPUT_STREAM, PS_OUTPUT_STREAM, REGION_OUTPUT_STREAM): New macros. + (char_buffer::run_output_filter) [MAY_FORK_CHILD_PROCESS]: Fix + calls to `set_redirection' and `WAIT'. + [MAY_SPAWN_ASYNCHRONOUS_CHILD]: Remove unused variable `i' and `j'. + Fix calls to `set_redirection' and `save_and_redirect'. + (char_buffer::do_html, char_buffer::do_image) [DEBUGGING]: Fix calls + to `set_redirection' and `save_and_redirect'. + (usage): Fix message. + (makeTempFiles, main): Use `DEBUG_FILE'. -Thu Feb 27 10:29:19 1992 James Clark (jjc at jclark) +2004-02-21 Werner LEMBERG - * Makefile: New configuration option ARRAY_DELETE_NEEDS_SIZE. - * lib/lib.h: Define adelete accordingly. - * pic/object.c (graphic_object::graphic_object): - * tbl/main.c (format::~format): - * tbl/table.c (table::~table): - * refer/ref.c (reference::~reference, reference::merge, - reference::insert_field, reference::delete_field): Use adelete. + * src/roff/troff/troff.h (WARN_TOTAL): Fix value. - * Makefile: Change NESTED_TYPES to NO_NESTED_TYPES. - * refer/token.h: - * tbl/table.h: Corresponding changes. +2004-02-21 Keith Marshall - * common.c (common_output::dashed_arc, common_output::dotted_arc): - Ensure total_angle is positive. + * src/libs/libgroff/quotearg.c: New file, providing proper argument + quoting for MSVC's spawn* and exec* functions. + * src/libs/libgroff/spawnvp.c: New file, providing a wrapper around + spawnvp with proper quoting for MSVC. -Wed Feb 26 08:49:26 1992 James Clark (jjc at jclark) + * src/libs/libgroff/assert.cpp (program_name), + src/libs/libgroff/new.cpp (program_name): Declare as `extern "C"'. + * src/libs/libgroff/Makefile.sub (OBJS, CSRCS): Updated. - * refer/ref.c (reference::merge, reference::insert_field, - reference::delete_field): Avoid delete[0]. + * src/roff/troff/input.cpp (program_name): Declare as `extern "C"'. - * refer/token.c (init_special_chars): Move calls to cmupper - outside calls to init_two_char_letter to work around bug in gcc - 2.0. + * src/include/error.h (program_name): Declare as `extern "C"'. + * src/include/nonposix.h [__MSDOS__ ...]: Handle spawnvp. -Mon Feb 24 14:20:00 1992 James Clark (jjc at jclark) +2004-02-21 Jeff Conrad - * lib/new.c (operator new): Use __builtin_new for g++. + * src/preproc/html/pre-html.cpp [__CYGWIN__ ...]: Declare + spawnvp_wrapper. + [MAY_SPAWN_ASYNCHRONOUS_CHILD]: Declare i and j. - * pic/object.c (graphic_object::~graphic_object): Don't use - delete [] on 0. +2004-02-20 Jeff Conrad - * pic/object.c (output::compute_scale): Initialize max_width and - max_height. + * src/roff/groff/pipeline.c (cmd) [__MSDOS__ || ...]: New global + variable. + (sbasename) [__MSDOS__ || ...]: New function. + (system_shell_name) [__MSDOS__ || ...]: Use a different, more + generic algorithm. + (system_shell_dash_c, is_system_shell) [__MSDOS__ || ...]: Updated. + (run_pipeline) [_WIN32]: Use _XXX variants for some macros instead + of XXX. + Use STDOUT_FILENO instead of hardcoded file handle. + (signal_catcher) [__MSDOS__]: Moved to non-_WIN32 section. -Sat Feb 15 09:55:20 1992 James Clark (jjc at jclark) +2004-02-19 Werner LEMBERG - * troff/input.c (write_request): Call fflush. + * src/roff/troff/div.cpp: Include nonposix.h after troff.h to + avoid warnings w.r.t. redefinition of P_tmpdir for some compilers. - * troff/node.h (class composite_node): Move declaration to node.c - * troff/input.c (charinfo_to_node): Rename to ... - (charinfo_to_node_list): Return node list rather than composite - node. - * troff/node.c (make_composite_node): New function. - (make_node, add_char): Call make_composite_node instead of - charinfo_to_node. - (class composite_node): Add a tfont * member. Delete font_size - member. - (composite_node::composite_node, composite_node::copy, - composite_node::size): Corresponding changes. - (composite_node::tprint): Provide constant spacing, emboldening - and track kerning as specified in tfont. - (composite_node::width): Change width calculation accordingly. - * troff/env.h (environment::composite): New member. - (environment::is_composite, environment::set_composite): New - functions. - * troff/env.c (environment::environment): Initialize composite. - * troff/input.c (charinfo_to_node): Call - environment::set_composite. - * troff/node.c (make_composite_node, make_glyph_node): Use the - plain version of the tfont if the environment is composite. +2004-02-18 Werner LEMBERG - * troff/node.c (font_info::get_space_width): Additional argument - giving space_size. Handle constant space correctly. Scale by - space_size unless constant spaced. - (env_sentence_space_width): New function. - * troff/node.h: Declare it. - * troff/env.h (environment::get_space_size, - environment::get_sentence_space_size, - environment::get_narrow_space_width, - environment::get_half_narrow_space_width): Make inline. - (environment::get_space_width): Make inline. Just call - env_space_width. - * troff/env.c: Delete definitions for funtions made inline. - (environment::space_newline, environment::space): Use - env_sentence_space_width(). Don't scale by space_size. - * troff/node.h: Move declarations of env*space_width() functions - into env.h. + * font/devlj4/Makefile.sub (DEVFILES): Updated to contain all + new font and mapping files. -Sat Feb 8 09:30:22 1992 James Clark (jjc at jclark) +2004-02-18 Jeff Conrad + Keith Marshall - * macros/tmac.s (PS): Don't try to set negative indent. + * src/include/nonposix.h (FLUSH_INPUT_PIPE): New macro to empty + an input pipe. This is needed for the MSVC compiler to make troff's + `-o' option work. -Thu Feb 6 09:00:35 1992 James Clark (jjc at jclark) + * src/roff/troff/div.cpp: Include nonposix.h. + (cleanup_and_exit): Call FLUSH_INPUT_PIPE. - * pic/pic.y: Fix min function. +2004-02-17 Werner LEMBERG -Tue Jan 28 07:52:29 1992 James Clark (jjc at jclark) + * font/devlj4/generate/special.awk: New script. + * font/devlj4/generate/Makefile (S): Use special.awk. + * font/devlj4/*: Regenerated, including the following new files: + Arial (AR, AB, AI, ABI), Times New Roman (TNRR, TNRB, TNRI, TNRBI), + MS Symbol (SYMBOL), Wingdings (WINGDINGS). + * NEWS: Document new lj4 fonts and revised hpftodit. - * man/mdate.sh: Clear LANGUAGE. +2004-02-17 Paco Andrés Verdú -Sun Jan 19 13:02:41 1992 James Clark (jjc at jclark) + * src/devices/grolbp/lbp.h (vmdvarc): Fix formatting string. - * pic/pic.y, pic/lex.c: Rename COMMAND token to COMMAND_LINE. - * pic/lex.c: New COMMAND keyword. - * pic/pic.y (print_args, print_arg): New rules. - (placeless_element): Use print_args for PRINT. - New COMMAND element. +2004-01-25 Werner LEMBERG -Tue Jan 7 13:14:31 1992 James Clark (jjc at jclark) + * src/libs/libgroff/progname.cpp: Replaced with... + * src/libs/libgroff/progname.c: New file. + * src/libs/libgroff/Makefile.sub: Updated accordingly. - * troff/input.c (terminal): Handle missing argument correctly. +2004-01-17 Werner LEMBERG - * pic/pic.y (text_expr): New rule. + * font/devlj4/generate/Makefile (SYMBOL): Use 9nb28703.tfm. - * pic/pic.y: Implement := operator. +2004-01-16 Jeff Conrad -Sun Jan 5 10:23:02 1992 James Clark (jjc at jclark) + * font/devlj4/generate/wingdings.map, + font/devlj4/generate/symbol.map: Include unnamed glyphs. + Use groff glyph names where possible. + * src/devices/grolj4/lj4_font.man: Minor updates. - * etc/grog.pl, etc/grog.sh: Distinguish old and new versions of - mdoc. +2004-01-13 Werner LEMBERG -Sat Jan 4 14:42:26 1992 James Clark (jjc at jclark) + * tmac/www.tmac (DC): Handle TTY devices. - * ps/devps/dingbatsrmap: Include this in the distribution. + * doc/webpage.ms: Document viewCVS from ffii.org. + * NEWS, README: Updated. - * macros/tmac.doc: Replace with new version from 2nd Networking - Release. Fix loading of doc-* files. - * macros/{doc-common,doc-ditroff,doc-nroff,doc-syms}: New files. - * macros/tmac.doc.old: New file. Apply fixes that had been - applied to old tmac.doc. - * macros/tmac.andoc: Check that we're running under groff. - * macros/Makefile: Rework. + * src/roff/groff/groff.man: Mention lj4_font man page. -Fri Jan 3 13:27:51 1992 James Clark (jjc at jclark) + * font/devlj4/generate/Makefile (SYMBOLMAP, WINGDINGSMAP): New + variables. + (FONTS): Add SYMBOL and WINGDINGS. + (SYMBOL, WINGDINGS): New targets. - * tbl/table.h (format_type): - * refer/token.h (token_type): If NESTED_TYPES is defined, use - typedef to make these types visible at file scope. - * Makefile: Add NESTED_TYPES configuration option. +2004-01-13 Jeff Conrad - * troff/div.c (mark): At the top level use the value of - nl_reg_contents rather than the current vertical position. + * src/devices/grolj4/lj4_font.man: New man page. + * src/devices/grolj4/Makefile.sub (MAN5): New variable. + * src/devices/grolj4.man: Mention lj4_font man page. -Thu Jan 2 10:34:51 1992 James Clark (jjc at jclark) + * src/utils/hpftodit/hpftodit.cpp (read_map): Handle line comments. + * src/utils/hpftodit/hpftodit.man: Document it. + (CW): New macro. + Remove details about fonts (which are now in lj4_font.man). - * tty/tty.c: Implement \D for horizontal or vertical lines. - (tty_printer::set_char): Use vec_used+2 as serial number. - Don't allow size of vector to exceed USHRT_MAX-2. - Split off part into... - (tty_printer::add_char): New function. - (tty_printer::draw): New function. - (compare_glyph): Handle equal serial numbers. - (tty_printer::end_page): Handle overstruck characters from \D. - (main, usage): Implement -d option. + * font/devlj4/generate/symbol.map, + font/devlj4/generate/wingdings.map: New files. -Mon Dec 23 10:37:51 1991 James Clark (jjc at jclark) +2004-01-12 Werner LEMBERG - * tbl/main.c (process_format): - * eqn/text.c (split_text): - * troff/input.c (token::next): Use inner block for declarations - with initializers in switch statement. + * README: Mention ffii's viewcvs access. -Mon Dec 16 20:52:03 1991 James Clark (jjc at jclark) +2004-01-09 Werner LEMBERG - * pic/common.c (common_output::dash_line): Cope with zero-length - lines. + * font/devlj4/generate/special.map: Map MSL 228 to U+221F. -Sun Nov 17 12:04:08 1991 James Clark (jjc at jclark) +2004-01-09 Jeff Conrad - * Version 1.04 released. + Revert most of the change from 2004-01-03 to better control used + symbol sets. -Wed Nov 13 05:27:21 1991 James Clark (jjc at jclark) + * src/utils/hpftodit/hpftodit.cpp (symbol_set): New structure. + (text_symbol_sets, special_symbol_sets): New arrays. + (symbol_set_table): New global variable. + (read_symbol_sets): Use search order given in the text_symbol_sets + and special_symbol_sets arrays. If command line flag -a is not + given, search both arrays. + (output_charset): Require x_height_tag only for command line flag -i. - * macros/tmac.an (TH): Define a macro an-init to define variables - based on command line arguments. - (an-header): Call it. +2004-01-06 Werner LEMBERG -Sun Nov 3 12:07:34 1991 James Clark (jjc at jclark) + Implement string-valued registers \n[.m] and \n[.M] to return the + name of the current drawing and background color, respectively. - * Makefile (install.mm): Rename to install.dwbmm. + * src/roff/troff/symbol.h: Moved to... + * src/include/symbol.h: Here. + Small fixes to make it work outside of the `troff' directory. + * src/roff/troff/symbol.cpp: Moved to... + * src/libs/libgroff/symbol.cpp: Here. + Small fixes to make it work outside of the `troff' directory. - * Makefile: Integrate mm. - * mm: New directory. + * src/include/Makefile.sub (HDRS), src/libs/libgroff/Makefile.sub + (OBJS, CCSRCS), src/roff/troff/Makefile.sub (OBJS, CCSRCS, HDRS): + Updated. -Wed Oct 30 10:11:34 1991 James Clark (jjc at jclark) + * src/include/color.h: Include symbol.h. + (color): Add new field `nm'. + * src/libs/libgroff/color.cpp (color::color): Updated. - * refer/dirnamemax.c: If PATHCONF_MISSING is defined, include - . + * src/roff/troff/dictionary.cpp, src/roff/troff/div.cpp, + src/roff/troff/node.cpp, src/roff/troff/number.cpp, + src/roff/troff/reg.cpp: Don't include symbol.h. - * pic/troff.c (troff_output::simple_spline, - troff_output::simple_polygon): Rename variable `v' to `d' to avoid - shadowing parameter. + * src/roff/troff/env.cpp: Don't include symbol.h. + (environment::get_glyph_color_string, + environment_get_fill_color_string): New member functions. + (init_env_requests): Handle `.m' and `.M' registers. + * src/roff/troff/input.cpp: Don't include symbol.h. + (default_symbol): Moved to symbol.cpp/symbol.h. + (do_glyph_color, do_fill_color, define_color): Pass symbol name + to color constructor. + * src/roff/troff/env.h: Updated. - * lib/tmpfile.c (xtmpfile): Declare dir as const char *. + * NEWS, man/groff_diff.man, man/groff.man, doc/groff.texinfo: + Document new registers. - * lib/ptable.h: Add explicit casts when converting from unsigned - long to unsigned. +2004-01-05 Werner LEMBERG - * dvi/devdvi/{SA,SB,msam.map,msbm.map}: New files. - * dvi/devdvi/Makefile: Install SA, SB. + * src/roff/troff/node.cpp (space_node::get_breakpoints, + space_node::nbreaks): Protect against zero `next' field. - * refer/indxbib.c: Add declaration of mktemp. +2004-01-03 Jeff Conrad - * refer/lookbib.c: Add declaration of isatty. + In hpftodit, use the symbol sets offered in the TFM. -Fri Oct 25 09:00:17 1991 James Clark (jjc at jclark) + * src/utils/hpftodit/hpftodit.cpp (NO_GLYPH): New constant. + (symbol_set, text_symbol_sets, special_symbol_sets, + symbol_set_table): Removed. + (get_printcode): Removed. + (read_symbol_sets): Initialize `symbol_set' field with + `NO_SYMBOL_SET'. + Simplify code to just use the `kind' value. + (output_charset): Improve output formatting. + (dump_symbols): Simplified. - * pic/lex.c (interpolate_macro_with_args): While collecting - arguments, keep track of whether we're in a string. +2004-01-02 Werner LEMBERG -Wed Oct 23 08:42:48 1991 James Clark (jjc at jclark) + * font/devlj4/generate/text.map: Add more MSL numbers. - * ps/tmac.ps (PSPIC): Do the .sp after the \X, and move the \X - down with \v, so as to avoid problems with top of page trap - setting no space mode. +2004-01-02 Jeff Conrad -Tue Oct 22 17:38:49 1991 James Clark (jjc at jclark) + * src/utils/hpftodit/hpftodit.cpp (is_decomposed): New macro. + (text_symbol_sets): Add more symbol sets. + (debug_flag): New static variable (moved from `main'). + (get_printcode, show_symset): New functions. + (main): Remove `debug_flag'. + (output_charset): Use `show_symset'. + (dump_symbols): Use `show_symset'. + Print symsets for all glyphs. + (read_map): Actually call `unicode_to_ucode_make' but this time + correctly. - * eqn/lex.c (get_delimited_text): Allow tab before macro body. +2004-01-01 Werner LEMBERG -Tue Oct 15 17:24:53 1991 James Clark (jjc at jclark) + * font/devlj4/generate/text.map, font/devlj4/generate/special.map: + Fix placement of comments. - * ps/psrm.c (ps_get_line): Fix bug when lines longer than 255. - Improve error message. +2004-01-01 Jeff Conrad -Fri Oct 11 11:09:38 1991 James Clark (jjc at jclark) + * src/utils/hpftodit/hpftodit.cpp (main): Read map file also if + option `-d' is given. + (output_charset): Improve warning messages to give more information. + (dump_symbols): Make information more precise. + (usage): Updated. + (read_map): Don't call unicode_to_ucode_name; the glyph names must + appear as-is and shouldn't be decomposed. - * ps/psrm.c (print_ps_string): Don't pass negative numbers to - printf("%03o"); +2003-12-31 Werner LEMBERG -Wed Oct 9 17:50:14 1991 James Clark (jjc at jclark) + * src/utils/hpftodit/hpftodit.cpp (dump_tags): Handle posture_tag. + * font/devlj4/generate/Makefile (IFLAG): Updated to new units. + (FONTS): Add TrueType font families Arial and Times New Roman. + (TNRR, TNRB, TNRI, TNRBI, AR, AB, AI, ABI): New targets. + * font/devlj4/generate/text.map: Fix Unicode values of `fi' and + `fl'. - * groff.c (possible_command::execp): Always use _exit() after a - failed exec. +2003-12-31 Jeff Conrad - * Makefile: Add HAVE_UNION_WAIT, HAVE_PID_T, WAIT_COREDUMP_0200, - NO_SYS_WAIT_H configuration options. - * groff.c: Use these options. Use POSIX-style macros to extract - fields from the status returned by wait(). + * test-groff.in (SEP): Quote value. + * src/roff/troff/node.cpp (suppress_node::tprint): Change type of + `tem' to `char*' to avoid deallocation of a pointer to a constant + object which some compilers don't like. -Fri Oct 4 12:12:27 1991 James Clark (jjc at jclark) +2003-12-31 Werner LEMBERG - * tbl/table.c (table::compute_separation_factor): Allow the - separation factor to drop to 0. + * font/devlj4/generate (text.map, special.map): Rewritten to work + with the new hpftodit version. -Tue Oct 1 18:12:38 1991 James Clark (jjc at jclark) +2003-12-30 Jeff Conrad - * refer/search.c: Include . + * src/utils/hpftodit/hpftodit.cpp (output_charset): Emit HP symbol + set and 8bit character code for all glyphs also. -Sun Sep 29 08:40:57 1991 James Clark (jjc at jclark) +2003-12-30 Werner LEMBERG - * pic/pic.y (YYDEBUG): Don't define for Borland C++. + * src/libs/libgroff/strcasecmp.c: Updated from gnulib. - * lib/lib.h: #ifdef out declarations of itoa and iftoa for Borland - C++. +2003-12-29 Werner LEMBERG - * pic/lex.c (input_stack::bol): Move definition out of class body. + More fixes for MSVC compiler. - * pic/main.c: On MSDOS munge argv[0]. + * doc/Makefile.sub, contrib/mom/Makefile.sub (GROFF_BIN_PATH): Use + $(SEP). - * lib/ptable.h: Define name2 as _Paste2 for Borland C++. + * src/include/nonposix.h (STDIN_FILENO, STDOUT_FILENO, + STDERR_FILENO) [_MSC_VER]: Define conditionally. + (getpid) [_MSC_VER]: Remove. + Include direct.h and process.h conditionally. - * lib/ptable.c (hash_string): Use unsigned long rather than - unsigned. - (next_ptable_size): Use unsigned rather than int. Give an error - message if we've hit the largest table size. - * lib/ptable.c: Corresponding changes. Also use unsigneds for the - table size. + * src/roff/troff/node.cpp (suppress_node::tprint): Don't use + parentheses for a_delete. - * pic/object.h (object_spec): Make flags unsigned long. Declare - flags as const unisgned long rather than as enums. + * src/utils/lookbib/lookbib.cpp: Include nonposix.h. - * pic/output.c: Deleted. + * test-groff: Replaced with... + * test-groff.in: This new template to handle path separator + properly. - * pic/troff.c (troff_output::simple_ellipse): Remove spurious %. + * configure.ac: Check for direct.h and process.h. + Generate test-groff script. + * configure, src/include/config.hin: Regenerated. - * tbl/table.c (simple_entry::note_double_vrule_on_{left,right}): - Add additional argument. - (line_entry::note_double_vrule_on_{left,right}): Set value of - douvle_vrule_on_{right,left} flag according to argument. - (simple_line_entry::simple_print, - simple_line_entry::double_line_print): If adjacent to double vrule - on a corner extend rather than shorten the rule by half the double - vrule sep. +2003-12-28 Werner LEMBERG - * troff/number.c (parse_term): In checking for overflow, handle the - case where the current horizontal position is negative. + Add integral extension glyph. + Add new option `-x' to afmtodit to suppress use of built-in AGL. -Thu Sep 12 08:26:09 1991 James Clark (jjc at jclark) + * font/devhtml/R.proto, font/devutf8/R.proto: Add `u23AE'. - * pic/object.c (draw_arrow): Check for object having zero length. + * font/devps/generate/textmap: Provide entry for `integralex' to + override (old) PUA value of the AGL. + * font/devps/generate/Makefile (SS): Add afmtodit option `-x'. + * font/devps/*: Regenerated. -Wed Sep 11 10:32:38 1991 James Clark (jjc at jclark) + * src/utils/afmtodit/afmtodit.pl: Add option `-x'. + * src/utils/afmtodit/afmtodit.man, NEWS: Updated. - * eqn/main.c (do_file): Split off inline equation handling into... - (inline_equation): New function. Search for starting delimiter - using... - (delim_search): New function. Don't recognize a delimiter that - occurs in the name of an escape sequence, number register, string - etc. +2003-12-27 Werner LEMBERG -Tue Sep 10 04:01:11 1991 James Clark (jjc at jclark) + Add forgotten `coproduct' symbol (already available for DVI). - * eqn/delim.c (delim_box::compute_metrics): Don't call - define_extensible_string if left is 0. - (delim_box::output): Don't print the left delimiter if left is 0. - (delim_box::debug_print): Check for left == 0 before calling printf. + * font/devhtml/R.proto, font/devps/generate/textmap, + font/devps/symbolmap, font/devutf8/R.proto, man/groff_char.man, + src/libs/libgroff/uniglyph.cc, src/libs/libgroff/glyphuni.cpp: Add + U+2210 (\[coproduct]). -Fri Aug 23 13:02:30 1991 James Clark (jjc at jclark) +2003-12-26 Jeff Conrad - * troff/Makefile (majorminor.c): Include only digits in - minor_version. + hpftodit has been extended to handle TrueType metric files and + more glyphs. See hpftodit.man for more details. -Thu Aug 22 09:35:37 1991 James Clark (jjc at jclark) + * src/utils/hpftodit/hpftodit.cpp: Include stdio.h, string.h, + ctype.h, and unicode.h. + s/msl/charcode/ everywhere since we now handle Unicode values also. + (equal, NO, YES, MSL, SYMSET, UNICODE, UNICODE): New macros. + Use it where appropriate. + (MULTIPLIER): Replaced with... + (multiplier): New global static variable. + (scale): Updated. + (tag_type): Add more TFM tags. + (tag_name): New array. + (ENUM_TYPE, FLOAT_TYPE): Removed. + (BYTE_TYPE): New value assigned. + (ASCII_TYPE, RATIONAL_TYPE): New enumeration values. + (text_symbol_sets, special_symbol_sets): Extended to cover more + sets. + (check_type): Add return value. + (check_units): Add parameters to get ppi and upem values. + Handle TrueType TFM data. + (output_font_name): New function. + (output_charset): Add parameter to handle TFM type. + Handle TrueType TFMs also. + (em_fract): New macro. + (dump_tags): Be much more verbose and handle more tags. + (dump_ascii, dump_symbol_sets, dump_symbols): New functions. + (hp_msl_to_ucode_name, unicode_to_ucode_name, is_uname): New + functions. + (read_map): Add parameter to handle TFM type. + Handle both MSL and Unicode mappings. + (main): Add two new command line options `-a' and `-q'. + Updated to make use of new functions. + (usage): Updated. - * refer/dirnamemax.c: new file. - * refer/genlimits.c: Deleted. - * refer/indxbib.c (main): Use dir_name_max() instead of NAME_MAX. - Don't check path length. - * refer/Makefile: Add dir_name_max.o; delete genlimits. - * Makefile: Add PATHCONF_MISSING option. + * src/utils/hpftodit/hpuni.cpp: New file. - * refer/indxbib.c (get_cwd): New function. - (main): Use get_cwd(). - * lib/getcwd.c: New file. - * Makefile: Delete -DHAVE_GETWD. Include GETCWD variable. Pass - GETCWD in SUBFLAGS. - * lib/Makefile: Compile getcwd.o. + * src/utils/hpftodit/Makefile.sub, src/utils/hpftodit/hpftodit.man: + Updated. - * ps/tmac.psatk (psatk-defs): Define showpage after pushing - userdict. +2003-12-25 Werner LEMBERG - * refer/indxbib.c (main): Check success of mktemp. + * src/include/nonposix.h (read) [_MSC_VER]: Define. - * lib/tmpfile.c: New file. - * lib/Makefile: Add tmpfile.c. - * lib/lib.h: Declare xtmpfile(); include . - * ps/ps.h: Delete declaration of mktemp(). - * ps/ps.c (ps_printer::ps_printer): Use xtmpfile(). - * refer/refer.c (divert_to_temporary_file): Use xtmpfile(). - * driver/driver.h: No need now to include errno.h. +2003-12-24 Werner LEMBERG - * everywhere: Set errno to 0 before calling fopen(). + * src/utils/afmtodit/afmtodit.man: Some reformulations as suggested + by Michail Vidiassov . - * eqn/eqn.h, etc/soelim.c, driver/driver.h, etc/addftinfo.c, - dvi/tfmtodit.c, groff.c, refer/index.c, refer/linear.c, - refer/lookbib.c, refer/refer.h, ps/psbb.c: Include . +2003-12-20 Werner LEMBERG -Mon Aug 19 10:52:18 1991 James Clark (jjc at jclark) + * font/devhtml/R.proto: Add u00{47,67}_0306, u00{53,73}_0327, + and u0049_0307. + Add missing latin-2 glyphs. + * font/devutf8/R.proto: Add missing latin-2 glyphs. - * troff/env.h (translate_space_to_dummy): Declare it. - * troff/env.c (environment::space_newline, environment::space): - If translate_space_to_dummy is set then make the width of spaces 0. - * troff/input.c (translate): If the second character of a - translation is a space, translate to unbreakable space. If the - first character is a space, set or clear translate_space_to_dummy - according to whether the second character is \&. Weird! + * tmac/troffrc: Load `composite.tmac' earlier. -Tue Jul 30 10:03:56 1991 James Clark (jjc at jclark) + * tmac/dvi.tmac, tmac/ps.tmac, tmac/lbp.tmac: Add u00{47,67}_0306, + u00{53,73}_0327, and u0049_0307. + * tmac/X.tmac: Add u00{47,67}_0306. + * tmac/tty-char.tmac: Use composite glyph names for readability. - * groff.c (run_commands): Don't use non-zero exit code because a - command gets SIGPIPE. + * NEWS: Updated. - * groff.c, groff.sh: Use -mXps with -TXps. + * src/include/unicode.h: Remove `extern' keywords. - * ps/ps.c (ps_printer::special): Move call to flush_sbuf() into... - (ps_printer::do_exec, ps_printer::do_file, ps_printer::do_def, - ps_printer::do_mdef, ps_printer::do_import): Call flush_sbuf(). - (ps_printer::special): New specials invis and endinvis. - (ps_printer::do_invis, ps_printer::do_endinvis): New functions. - (ps_printer::set_char, ps_printer::draw): Return if invis_count>0. - (ps_printer::end_page): Check that invis_count == 0. - (ps_printer::invis_count): New member. - (ps_printer::ps_printer): Initialize invis_count to 0. +2003-12-20 Nilgün Belma Bugüner - * troff/env.c (environment::hyphenate_line): Hyphenation - indicator at beginning of word inhibits splitting after -, \(em - etc. + * tmac/latin5.tmac: New file. - * pic/pic.y (element): Allow another element to follow } without - any intervening separator. +2003-12-19 Werner LEMBERG -Mon Jul 22 12:27:37 1991 James Clark (jjc at jclark) + Add some glyphs needed for Turkish. - * pic/lex.c (get_delimited): Allow tabs before delimiter. + * font/devutf8/R.proto: Add u00{47,67}_0306, u00{53,73}_0327, + and u0049_0307. -Wed Jul 17 10:59:08 1991 James Clark (jjc at jclark) + * tmac/composite.tmac: Add `,' as a synonym for `ac' accent. + * tmac/tty-char.tmac: Add representations for u00{47,67}_0306, + u00{53,73}_0327, and u0049_0307. - * groff.c: Get rid of HAVE_UNION_WAIT stuff. Instead suppress - declaration of wait() in header files. - * Makefile: Get rid of -DHAVE_UNION_WAIT. +2003-12-18 Werner LEMBERG - * tbl/table.c (alphabetic_text_entry::add_tab): New function. + * src/devices/grops/ps.cc (ps_output::put_float): Revert change + from 2001-10-04. + Remove trailing zeros. - * lib/lib.h: Declare return type of strerror as char *. +2003-12-17 Werner LEMBERG - * man/Makefile: Add g flag to sed substitutions. - * Makefile (shgroff, bindist): Likewise. + Make \? transparent to end-of-sentence recognition. -Sun Jul 14 11:57:02 1991 James Clark (jjc at jclark) + * src/roff/troff/input.cc (non_interpreted_node): Add + `ends_sentence' member function. - * ps/ps.c (ps_printer::do_import): Move push of userdict into... - * ps/devps/prologue (PBEGIN): Define showpage after pushing - userdict. +2003-12-16 Werner LEMBERG -Sat Jul 13 20:53:04 1991 James Clark (jjc at jclark) + * doc/groff.texinfo: Document `dt' request correctly. + Other minor typographical improvements. - * ps/devps/prologue (PBEGIN): Zap any definition of showpage in - userdict. +2003-12-10 Michail Vidiassov -Fri Jul 12 07:10:09 1991 James Clark (jjc at jclark) + * src/utils/afmtodit/Makefile.sub (afmtodit): Fix typo. - * man/mdate.sh: Handle the fact that BSD ls -l does not print the - group. +2003-12-10 Richard Stallman -Sun Jul 7 08:00:23 1991 James Clark (jjc at jclark) + * LICENSE: Better wording. - * troff/input.c (define_number_reg): If currently undefined, - don't define it if the argument is an invalid expression. +2003-12-09 Werner LEMBERG - * Makefile: Ignore return value of `if' commands without `else' - parts. + * aclocal.m4 (GROFF_BROKEN_SPOOLER_FLAGS): Set default value to 0. + * configure, NEWS: Updated. - * Makefile: Split up CPPDEFINES into a series of separate - configuration options. +2003-12-08 Werner LEMBERG - * troff/input.c (init_registers): Use time_t instead of long - unless LONG_FOR_TIME_T is defined. Use returned result rather - than passing pointer. - * Makefile: Document LONG_FOR_TIME_T as a CPPDEFINE. + * FDL: Updated to version 1.2 (from www.gnu.org/copyleft). - * lib/Makefile (fontpath.h): Use gendef. +2003-12-07 Bernd Warken -Thu Jul 4 09:48:05 1991 James Clark (jjc at jclark) + * LICENSE: Updated. - * troff/input.c (input_iterator::shift): Delete argument name. - * troff/node.c (suppress_output_file::really_begin_page, - suppress_output_file::really_transparent_char, node::ascii_print, - node::tprint): Delete names of unused arguments. +2003-12-07 Werner LEMBERG -Wed Jul 3 17:34:57 1991 James Clark (jjc at jclark) + * INSTALL: Improved. - * refer/label.y (string): Pass $4 to command_error. +2003-12-05 Keith Marshall -Tue Jul 2 15:06:01 1991 James Clark (jjc at jclark) + Use path separator character of target platform for compiled-in + default paths. - * Version 1.03 released. + * aclocal.m4 (GROFF_TARGET_PATH_SEPARATOR): New macro. + * configure.ac: Use GROFF_TARGET_PATH_SEPARATOR. + * configure: Regenerated. + * Makefile.in (SEP): Use GROFF_PATH_SEPARATOR. -Sat Jun 29 08:14:01 1991 James Clark (jjc at jclark) +2003-12-05 Werner LEMBERG - * Makefile: Pass definition of SHELL in SUBFLAGS. + * src/include/nonposix.h (PATH_SEP_CHAR): New definition. + Replace `PATH_SEP[0]' with `PATH_SEP_CHAR' everywhere. - * gendef: New file. - * Makefile, eqn/Makefile, refer/Makefile, troff/Makefile, - ps/Makefile: Use gendef to construct header files that are - constructed from the Makefile. +2003-12-04 Bernd Warken - * macros/Makefile: make all should build stripped version of tmac.e. + * LICENSE: New file. - * refer/Makefile (clean): Remove y.output. +2003-12-03 Werner LEMBERG -Fri Jun 28 09:44:36 1991 James Clark (jjc at jclark) + * src/utils/afmtodit/afmtodit.pl: Comment out code which handles + ligatures present in AFM files since groff currently only + understands some standard ligatures and nothing else. - * ps/pfbtops.c (main): Add -v option which prints out a version - number. - * ps/Makefile (pfbtops): Link with libgroff.a. +2003-12-03 Jeff Conrad -Fri Jun 21 07:43:23 1991 James Clark (jjc at jclark) + * src/roff/groff/groff.cpp (main): Don't run the spooler if + option -v is given. - * refer/search.h (linear_searcher::get_nkeys): Delete declaration. - * refer/linear.c (linear_searcher::get_nkeys): Delete definition. + * src/roff/groff/pipeline.c (run_pipeline) [_WIN32]: Fix error + messages. + Close stdout copy. + Don't use Unix wait flags. - * refer/lkbib.c (main): Always terminate reference with blank - line. - * refer/lookbib.c (main): Likewise. +2003-12-02 Werner LEMBERG - * refer/linear.c (file_buffer::load): Check that the file is not a - binary file. + * src/roff/troff/glyphuni.cpp, src/roff/troff/unicode.cpp, + src/roff/troff/unicode.h, src/roff/troff/uniglyph.cpp, + src/roff/troff/uniuni.cpp: Moved to... + * src/libs/libgroff/glyphuni.cpp, src/libs/libgroff/unicode.cpp, + src/libs/libgroff/unicode.h, src/libs/libgroff/uniglyph.cpp, + src/libs/libgroff/uniuni.cpp: Here. - * refer/Makefile (genlimits): Possibly add -DHAVE_SYS_DIR_H. - (genlimits.c): Include if HAVE_SYS_DIR_H is defined. - Delete second inclusion of . + * src/include/Makefile.sub.old (HDRS), + src/libs/libgroff/Makefile.sub (OBJS, CCSRCS), + src/roff/troff/Makefile.sub (HDRS, PBJS, CCSRCS): Updated. -Tue Jun 18 01:32:26 1991 James Clark (jjc at jclark) +2003-12-01 Keith Marshall - * troff/token.h (token::special): Deleted. + * src/preproc/htlp/pre-html.cpp (__tmpfile): Renamed to + `DEBUG_FILE'. + Updated all users. - * tbl/main.c (process_format): Rework so that opt->tab_char is - recognized only when appropriate. +2003-12-01 Werner LEMBERG - * ps/Makefile (clean): Remove pfbtops. + * groff.texinfo: Document special behaviour of `.vs 0'. + Improve documentation of `cflags' request. + * NEWS: Updated. -Sun Jun 16 09:37:19 1991 James Clark (jjc at jclark) +2003-11-29 Werner LEMBERG - * lib/font.c (text_file::next): Don't return if we have got a - blank line. + * font/devlj4/generate/Makefile (CORONET): Use correct TFM. + * font/devlj4/CORONET: Regenerated. -Fri Jun 14 09:52:26 1991 James Clark (jjc at jclark) +2003-11-24 Werner LEMBERG - * refer/refer.c (store_reference): Get hash code from old_table[i] - when rehashing the table. + * src/roff/troff/env.cpp (hyphen_trie::read_patterns_file): Fix loop + if processing hyphenation patterns in traditional mode. + Improve error messages. -Thu Jun 13 01:26:43 1991 James Clark (jjc at jclark) +2003-11-20 Werner LEMBERG - * eqn/box.c (box::top_level): Save size and prev size using \R and - restore it afterwards. Set the size to the size at the beginning - of the line. - * eqn/pbox.h: Declare SAVED_INLINE_PREV_SIZE_REG, - SAVED_INLINE_SIZE_REG, and SAVED_SIZE_REG. + * src/roff/troff/node.cpp (troff_output_file::put_char_width, + troff_output_file::put_char): Fix type of local variable `c'. - * refer/Makefile (limits.h): Use ./genlimits. +2003-11-19 Werner LEMBERG -Wed Jun 12 16:05:34 1991 James Clark (jjc at jclark) + * src/roff/groff/pipeline.c (P): Removed. Updated all function + declarations. + (i_to_a): Removed. libgroff already provides this function. + (run_pipeline) [_WIN32]: Don't use itoa but i_to_a. - * refer/index.c: Delete declarations of stat() and fstat(). +2003-11-18 Keith Marshall -Tue Jun 11 14:52:49 1991 James Clark (jjc at jclark) + * src/roff/groff/pipeline.c (xstrsignal): Fix usage of + HAVE_DECL_SYS_LIST. - * tty/tmac.tty: Add character definitions for \(>= and \(<=. +2003-11-17 Werner LEMBERG -Mon Jun 10 22:49:48 1991 James Clark (jjc at jclark) + * COPYING: Use correct version. - * etc/grog.sh, etc/grog.pl: Change regex for .PS. +2003-11-11 Werner LEMBERG -Fri Jun 7 09:13:06 1991 James Clark (jjc at jclark) + LynxOS 4.0.0 doesn't declare vfprintf. - * troff/input.c (token::get_char): Handle \e. + * configure.ac: Check for vfprintf. + * configure: Regenerated. + * src/include/lib.h: Handle `NEED_DECLARATION_VFPRINTF'. + * src/include/config.hin: Regenerated. - * refer/linear.c: Delete declarations of fstat() and stat(). +2003-11-10 Werner LEMBERG -Wed Jun 5 09:11:59 1991 James Clark (jjc at jclark) + LynxOS 4.0.0 has snprintf (without declaration) but no vsnprintf. - * troff/node.c, troff/env.c, troff/input.c, Makefile: Remove - OP_DELETE_BROKEN stuff, since we now have a fix for g++. + * configure.ac: Check for vsnprintf. + * configure: Regenerated. + * src/include/lib.h: Handle `NEED_DECLARATION_VSNPRINTF' and + `HAVE_VSNPRINTF'. + * src/include/config.hin: Regenerated. -Mon Jun 3 13:41:32 1991 James Clark (jjc at jclark) +2003-11-09 Werner LEMBERG - * troff/input.c (do_define_macro): Improve error handling for end - of file while defining macro. + * aclocal.m4: Updated syntax to autoconf 2.59. + (GROFF_HTML_PROGRAMS): Use AC_FOREACH. + Don't check for gsos2. + (GROFF_SRCDIR, GROFF_BUILDDIR): Removed. autoconf 2.59 provides + working abs_top_srcdir and abs_top_builddir. -Sun Jun 2 10:20:24 1991 James Clark (jjc at jclark) + * configure.ac: Updated syntax to autoconf 2.59. + Don't call GROFF_SRCDIR and GROFF_BUILDDIR. + Replace call to AC_DECL_SYS_SIGLIST with call to AC_CHECK_DECLS. + * configure: Regenerated. - * eqn/box.h: Fix declaration of set_gsize. - * eqn/box.c (set_gsize): Make argument const char *. - (gsize): Declare as char *. - * eqn/main.c (main): Don't convert gsize to int. - * eqn/lex.c (do_gsize): Pass char * to set_gsize. + * Makefile.in, doc/Makefile.in: s/@top_srcdir@/@abs_top_srcdir@/, + s/@groff_top_builddir@/@abs_top_builddir@/. - * Version 1.02 released. + * src/roff/groff/pipeline.c (xstrsignal): + s/SYS_SIGLIST_DECLARED/HAVE_DECL_SYS_SIGLIST/. -Sat Jun 1 12:19:46 1991 James Clark (jjc at jclark) +2003-11-07 Werner LEMBERG - * macros/tmac.andoc: New file. - * macros/Makefile: Install tmac.andoc. + * src/devices/grodvi/dvi.cpp (draw_dvi_printer::draw) ['a']: Always + make start angle smaller than end angle to circumvent a bug in tpic + handling of some versions of dvipdfm (and dvipdfmx). - * troff/node.c, troff/env.c, troff/input.c: Conditionalize use of - operator new and delete on OP_DELETE_BROKEN not being defined. - * Makefile: Mention OP_DELETE_BROKEN. +2003-10-30 Werner LEMBERG -Mon May 27 13:49:07 1991 James Clark (jjc at jclark) + * src/devices/grops/grops.man: Improve section on creating EPS. - * Makefile (bindist): Pass SUBFLAGS. +2003-10-29 Werner LEMBERG -Sun May 26 14:13:22 1991 James Clark (jjc at jclark) + * contrib/pic2graph/pic2graph.sh: Fix typo (-P-letter -> + -P-pletter). - * Makefile, groff.c: Pass definitions to groff.c via device.h. +2003-10-28 Werner LEMBERG - * tty/tty.c (tty_font::load_tty_font): Avoid shadowing - parameter. + * doc/groff.texinfo: Fix documentation of `.if'. - * ps/Makefile, ps.c: Pass BROKEN_SPOOLER_FLAGS via broken.h. +2003-10-27 Michail Vidiassov - * ps/ps.h, ps/psrm.c: Make comment_table and - header_comment_table local to resource_manager::process_file. + * src/utils/afmtodit/afmtodit.pl: Handle unmapped characters of + the form `uniXXXX' also. - * groff.sh: With -TXps pass -printCommand option to gxditview. +2003-10-27 Werner LEMBERG - * groff.c (possible_command::print): Implement using - append_arg_to_string. + * contrib/eqn2graph/eqn2graph.sh, contrib/grap2graph/grap2graph.sh, + contrib/pic2graph/pic2graph.sh: Implement secure management of + temporary files. + Pass `-P-pletter' to groff to avoid data outside of the converted + area -- some versions of `convert' (for example 5.3.8) don't check + the bounding box of the image but always use a fixed image size + (letter paper format). + * contrib/eqn2graph/eqn2graph.man, contrib/grap2graph/grap2graph.man, + contrib/pic2graph/pic2graph.man: Updated. - * xditview: Merge in new implementation with own ChangeLog. + * src/roff/groff/groff.man: Document $TMP and $TEMP. -Sat May 25 18:33:20 1991 James Clark (jjc at jclark) +2003-10-26 Werner LEMBERG - * groff.c (main): Implement PRINT_OPTION. - (append_arg_to_string): New command. - (device_table): Set PRINT_OPTION flag for Xps. + * src/preproc/pic/troff.cpp (troff_output::simple_circle, + troff_output::simple_ellipse, troff_output::simple_arc, + troff_output::simple_line, troff_output::simple_spline, + troff_output::simple_polygon): Insert a space before arguments. + (troff_output::set_fill): Emit `\&' before `\D'Fg...' since the + latter doesn't produce a node, so the following `.sp -1' would do + the wrong thing. + Don't emit `.sp -1' after \M. This also doesn't produce a token + (and we don't have to care about compatibility mode). + (troff_output::set_color, troff_output::reset_color): Don't emit + `.sp -1' after \M and \m. -Fri May 24 09:48:58 1991 James Clark (jjc at jclark) + * src/roff/troff/input.cpp (old_have_input): New global variable. + (input_stack::get): Handle `old_have_input'. + (process_input_stack) : Call + `trapping_blank_line' depending on `old_have_input', not + `have_input'. - * troff/groff.h: Rename to troff.h. +2003-10-20 Keith Marshall - * pic/lex.c (lookup_keyword, docmp): New functions. - (get_token): Use new lookup_keyword. - Don't include key.h. - * pic/key.[ch], pic/pic.gperf: Deleted. - * pic/Makefile: Remove gperf stuff. + * src/libs/libgroff/tmpfile.cpp [__MSDOS__, _Win32] + (WIN32_TMPDIR_ENVVAR, MSDOS_TMPDIR_ENVVAR): New macros, providing + default directory names for temporary files. + [__MSDOS__, _Win32] (temp_init::temp_init): Use them. - * pic/Makefile, pic/output.h: Move definition of TEX_SUPPORT - into output.h. - * pic/tex.c: Move include of pic.h before test of TEX_SUPPORT. + * src/roff/groff/pipeline.c [__MSDOS__]: Include stdlib.h. + [__MSDOS__] (run_pipeline): Honour environment variables. + Don't use `tmpnam' but `tempnam' to work around messy + implementation. - * troff/Makefile, troff/node.c: Move definition of - STORE_WIDTH into node.c. + * README.MinGW: New file. - * etc/grog.pl, etc/grog.sh: Support -mdoc. +2003-10-16 Werner LEMBERG -Thu May 23 12:30:49 1991 James Clark (jjc at jclark) + * src/preproc/html/pre-html.cpp (write_upto_newline): Don't use + `(*t)->next' without testing validity of `*t'. + (usage): Make it more readable. - * dvi/devdvi/texr.map, dvi.devdvi/texi.map, - dvi/devdvi/texb.map: Add lq and rq. - dvi/devdvi: Regenerate fonts. - * ps/devps/textmap: Add lq and rq. - * ps/devps: Regenerate fonts. - * tty/devascii/R.proto, tty/devlatin1/R.proto: Add lq and rq. - * macros/tmac.e: Define \*(lq and \*(rq to be \(lq and \(rq. +2003-10-16 Keith Marshall - * pic/object.c (position_rectangle): When checking radius - cope with possiblity that width or height is negative. - (box_object::box_object): Have separate xrad and yrad with - signs matching signs of dim components. - (box_object::{north,south}_{east,west}): Use xrad and yrad. - (box_object::print): With rounded boxes use absolute values - for dim and rad arguments. + Make html device run under both MS-DOS and Win32. - * lib/Makefile, lib/fontfile.o: Pass definition of FONTPATH - in fontpath.h. + * src/preproc/html/pre-html.cpp (MAY_FORK_CHILD_PROCESS, + MAY_SPAWN_ASYNCHRONOUS_CHILD): New macros to control whether + spawn or fork+exec has to be used, and whether parent must sleep + until the child process terminates. Used in + `char_buffer::run_output_filter'. + (copyofstdoutfd): Removed. + (char_buffer): Replace `write_file_html' and `write_file_troff' + member functions with `emit_troff_output' and `run_output_filter'. + (DEVICE_FORMAT, HTML_OUTPUT_FILTER, IMAGE_OUTPUT_FILTER): New + macros. + (replaceFd): Replaced with... + (set_redirection): New auxiliary function. + (waitForChild): Replaced with... + (save_and_redirect): New auxiliary function for. - * eqn/Makefile, eqn/main.c: Pass definition of DEVICE in device.h. + (char_buffer::do_html, char_buffer::do_image): Simplified, using new + functions. - * various files: Add explicit destructors to keep Saber CC +d - happy. +2003-10-14 Keith Marshall -Wed May 22 11:37:11 1991 James Clark (jjc at jclark) + * aclocal.m4 (GROFF_SYS_NERR): Check stdlib.h also. + (GROFF_LIBC): New function. + * configure.ac: Call GROFF_LIBC. + Check for `kill'. + * configure: Regenerated. - * eqn/box.c (box::top_level): Restore fonts correctly after - font changes in line containing inline equation. Also - restore previous font as well as current font. - * eqn/pbox.h: Define necessary string and register names. + * src/include/lib.h: Handle __MINGW32__. + * src/include/nonposix.h [_MSC_VER]: Handle __MINGW32__. + Add macro for `pipe'. + Define P_tmpdir. - * troff/input.c (token::next): Case 'R' calls do_register. - (do_register): New function. + * src/roff/groff/pipeline.c (run_pipeline): Handle `no_pipe' + correctly. -Tue May 21 11:28:23 1991 James Clark (jjc at jclark) + * src/utils/indxbib/signal.c (handle_fatal_signal) [!HAVE_KILL]: + Implement. - * groff.c, groff.sh: Support Xps device. Allow each device - to have a pseudo_name and a real_name. +2003-10-13 Werner LEMBERG - * groff.c (run_commands): Don't print `Broken pipe' messages. + Finally fix change 2003-08-26, based on ideas from Chuck Silvers + . - * ps/pfbtops.c: New file. - * ps/Makefile: Add pfbtops. + * contrib/mom/Makefile.sub: Use a stamp file in the `examples' + directory. - * troff/number.c (parse_term): Improved error message. +2003-10-12 Werner LEMBERG -Mon May 20 11:22:14 1991 James Clark (jjc at jclark) + * src/roff/groff/groff.cpp (help), src/devices/grops/ps.cpp (usage), + src/roff/troff/input.cc (usage): Updated. - * groff.c, groff.sh, etc/grog.sh, etc/grog.pl: Support grefer. + * NEWS, doc/groff.texinfo: Updated. - * Makefile: Integrate refer. - * refer: New directory. - * man/grefer.man, man/glookbib.man, man/gindxbib.man, - man/lkbib.man: New files. - * man/Makefile: Support refer man pages. +2003-10-12 Peter Miller - * lib/lib.h: Declare is_prime. - * lib/prime.c: New file. + * src/libs/libgroff/searchpath.cpp + (search_path::open_file_cautious): New function which also handles + `-' as stdin and stdout depending on the access mode. + * src/include/searchpath.h (search_path): Updated. - * troff/input.c (macro_source): New function. - (init_input_requests): Bind "mso" to macro_source. + * src/devices/grops/ps.cpp (main): Handle new `-I' switch. + * src/devices/grops/ps.h: Include `searchpath.h'. + * src/devices/grops/psrm.cpp (resource_manager::supply_resource): + Open resource file with `include_search_path.open_file_cautious'. + * src/devices/grops/grops.man: Document new `-I' switch. - * troff/env.c (environment::possibly_break_line): Maintain - pointer to pointer to node to be split in ndp so as to avoid - using address of freed node. + * src/devices/grodvi/dvi.cpp (main), src/devices/grolbp/lbp.cpp + (main), src/devices/grolj4/lj4.cpp (main), + src/devices/grotty/tty.cpp (main): Ignore new `-I' switch. - * troff/env.c (environment::hyphenate_line): Maintain pointer to - pointer to first node to be hyphenated in startp so as to - avoid using address of freed node. + * src/preproc/soelim/soelim.cpp (include_list_length, include_list): + Replaced with... + (include_search_path): New global variable. + (include_path_append): Removed. + (main): Use `include_search_path.command_line_dir' to handle `-I'. + (do_file): Simplify, using new + `include_search_path.open_file_cautious'. - * troff/env.c (class trie, class hyphen_trie): Make the - elements of the trie be of type char not unsigned char. - Declare arguments to be const char* instead of unsigned char *. - - * troff/env.c (hyphenate): Initialize hbuf[0]. + * src/roff/groff/groff.cpp (print_commands): Accept file handle as + parameter. + (main): Pass arguments to `-I' to both troff and devices. + Improve handling of `-V'. + * src/roff/groff/groff.man: Document changes to -I and -V. - * troff/input.c (set_string): Declare p to be char * and cast - *p to unsigned char when necessary. + * src/roff/troff/input.cpp (include_search_path): New global + variable. + (next_file, source, ps_bbox_request, transparent_file, + process_input_file): Use new + `include_search_path.open_file_cautious'. + (main) Handle `-I' switch. + * src/roff/troff/node.cpp (troff_output_file::really_copy_file): + Use new `include_search_path.open_file_cautious'. + * src/roff/troff/node.h: New extern symbol `include_search_path'. + * src/roff/troff/troff.man: Document new `-I' switch. - * troff/input.c (do_define_macro): Declare s to be const - char*. Cast element to unisgned char when necessary, Declare - d to be an int. Handle EOF better. +2003-09-15 Ruslan Ermilov - * troff/Makefile, troff/input.c: Different scheme for passing - definitions of MACROPATH, HYPHENFILE and DEVICE. + Support multiple calls of .Lb in LIBRARY section. -Tue May 14 13:41:36 1991 James Clark (jjc at jclark) + * tmac/doc-common (doc-in-library-section): New register. + (doc-section-library): New string. + (Sh): Set `doc-in-library-section'. + (Rd): Updated. + * tmac/doc-syms (Lb): Insert breaks before and after arguments + if in LIBRARY section. + * tmac/doc.tmac (doc-save-global-vars): Updated. + * NEWS, tmac/groff_mdoc.man: Updated. - * tty/devascii/R.proto: Delete entry for em. - * tty/devlatin1/R.proto: Likewise. +2003-09-14 Ruslan Ermilov -Sat May 11 11:13:28 1991 James Clark (jjc at jclark) + * tmac/doc-common (doc-default-operating-system): New variable. + (Os): Use it. - * troff/input.c (translate): Stop when we get a space. Treat eof - like newline. +2003-09-08 Werner LEMBERG - * macros/tmac.an (IP): Only pass quoted argument to TP when \n(.$>1. + * tmac/doc.tmac (doc-reset-reference): Handle data for `%I' also. -Wed Apr 24 19:24:33 1991 James Clark (jjc at jclark) +2003-08-31 Werner LEMBERG - * tbl/main.c (process_format): A font name following a `f' - modifier that starts with a digit can be only one character long. - Also deal with EOF on the second character of the font name. + * contrib/mom/Makefile.sub: Fix last change to make it really work. + * Makefile.comm: Use `test ... ||' in favor of `if test ...; then'. + (install_dev, uninstall_dev): Check whether $(DEVSCRIPTS) and + $(DEVFILES) are not empty. + * Makefile.in: Use `test ... ||' in favor of `if test ...; then'. -Wed Apr 17 11:23:43 1991 James Clark (jjc at jclark) +2003-08-26 Chuck Silvers - * troff/input.c (token::next): Turn \~ into an - unbreakable_space_node. - * troff/node.c (unbreakable_space_node): New class. - * troff/node.h: Declare it. + * contrib/mom/Makefile.sub (prepare_make_examples): Make it work + with parallel runs of `make'. -Tue Apr 16 10:47:12 1991 James Clark (jjc at jclark) +2003-08-23 Stephen Gildea - * dvi/dvi.c (dvi_printer::set_char): Make code an int. Check that - it's >= 0, before outputting it as a single byte. + * src/preproc/ref/ref.cpp (reference::compute_sort_key): Always + insert SORT_SEP. With certain combinations of sort specifications, + refer sorted entries in the wrong order. In particular, entries + with a missing field should be be sorted before all entries that + have that field, before refer looks to the next field. -Mon Apr 15 11:20:23 1991 James Clark (jjc at jclark) +2003-08-23 Werner LEMBERG - * lib/font.c: Make font_char_metric::code an int. - (font::get_code): Change return type to int. - (font::load): Allow code to be arbitrary integer. - * lib/font.h (font::get_code): Change return type to int. - (font::number_to_index): Change argument type to int. - * troff/input.c (token::next): In case 'N', allow any value. - Store value in token::val. - (token::operator==): For TOKEN_NUMBERED_CHAR test equality of val. - (token::get_char, token::add_to_node_list, token::process): Get - number from val. - (charinfo::set_number): Change argument to int. - (charinfo::get_number): Require that NUMBERED flag be set. - (get_charinfo_by_number): Store numbered characters not between 0 - and 255 in a dictionary. - * troff/charinfo.h (get_charinfo_by_number): Change argument type - to int. - (charinfo::number): Change type to int. - (charinfo::set_number): Change type of set_number to int. - * troff/node.c (troff_output_file::put_char_width, - troff_output_file::put_char): Test whether character is numbered - using charinfo::numbered(). - * driver/printer.c (printer::set_numbered_char): Allow arbitrary - values of num. - * lib/nametoindex.c: New implementation to cope with arbitrary - number characters. + * src/utils/pfbtops/Makefile.sub (LINK.c): Define it so that the + g++ linker is used. Reported by Mark J. Reed + . - * troff/input.c (token::operator==): Test val for - TOKEN_CHAR_HEIGHT, TOKEN_CHAR_SLANT, TOKEN_FONT_POSITION, and - TOKEN_SIZE. +2003-08-16 Heinz-Jürgen Oertel - * man/Makefile: Add definiton of BROKEN_SPOOLER_FLAGS. - (.man.n): sed out @BROKEN_SPOOLER_FLAGS@. + Add key character `x' to tbl which makes tbl call a user-defined + macro on a table cell. -Sun Apr 14 12:57:00 1991 James Clark (jjc at jclark) + * src/preproc/tbl/table.h (entry_modifier): Add `macro'. + * src/preproc/tbl/table.cpp (block_entry::do_divert): Call + `set_modifier' after printing the compatibility request. + (set_modifier): Print call to `m->macro' if not empty. + * src/preproc/tbl/main.cpp (entry_format::debug_print): Handle + `macro'. + (process_format): Implement cases `x' and `X'. + * src/preproc/tbl/tbl.man, NEWS: Updated. - * ps/devps/zapfdr.ps: Don't copy UniqueID. Avoid use of newdict - variable. +2003-08-15 Werner LEMBERG - * all Makefiles: rm targets of cp and >. + * doc/groff.texinfo: Minor fixes. - * xditview/xtotroff.c (MapFont): Unlink troff_name before opening - it. +2003-08-09 Werner LEMBERG - * eqn/lex.c (def_table): Add dollar. + * tmac/an-old.tmac [cR]: Fix redefinition of `bp'. -Sat Apr 13 13:02:44 1991 James Clark (jjc at jclark) +2003-08-07 Werner LEMBERG - * troff/input.c (do_width): Push back newline before closing delim - like do_bracket. - -Fri Apr 12 15:16:03 1991 James Clark (jjc at jclark) - - * groff.c (possible_command::prepend_arg): New function. - (main): Prepend device -m option. - * groff.sh: Put device -m options before command-line options. - -Tue Apr 9 10:24:43 1991 James Clark (jjc at jclark) - - * macros/tmac.an (IP): Quote argument to TP. - - * ps/ps.c (main): New option -b, which sets... - (broken_flags): New variable. - (ps_printer::~ps_printer): Incorporate the setup section in the - prolog if (broken_flags & NO_SETUP_SECTION). - (ps_printer::begin_page): Generate {Begin,End}PageSetup comments. - (ps_printer::merge_download_fonts, ps_printer::merge_import_fonts, - ps_printer::merge_ps_fonts, ps_printer::print_font_comment, - ps_printer::print_needed_font_comment, - ps_printer::print_supplied_font_comment, - ps_printer::print_include_font_comments, - ps_printer::lookup_doc_font, ps_printer::download_fonts, - ps_printer::read_download_file, read_document_fonts, add_font, - skip_line, parse_fonts_arg, document_font::document_font, - document_font::~document_font, document_font::download, - ps_output::include_file): Deleted. - (ps_printer::~ps_printer): Generate %%EOF. Generate %!PS-Adobe-3.0 - rather than %!PS-Adobe-2.0. Make calls to - resource_manager::need_font for each font that we used. Replace - calls to merge_ps_fonts, merge_download_fonts, print_font_comment, - print_supplied_font_comment, print_needed_font_comment by call to - resource_manager::print_header_comments. Output %%Orientation - comment. Output %%Requirements: numcopies comment if ncopies > 1. - Don't output the prolog directly. Instead call - resource_manager::output_prolog. Only define #copies when ncopies - > 1. Delete calls to print_include_font_comments and - download_fonts. Add call to resource_manager::document_setup. - (ps_printer::do_file): Call resource_manager::import_file instead - of including it ourselves. - (ps_printer::do_import): Likewise. Also don't call - merge_import_fonts. Push userdict on the dictionary stack before - and pop it afterwards. - Move declaration of ps_output into ps.h. - * ps/psrm.c: New file implementing resource_manager class. - * ps/ps.h: New file declaring ps_output and resource_manager - classes. - * ps/devps/zapfdr.ps: - * ps/devps/symbolsl.ps: - * ps/devps/prologue: Use 3.0 conventions. - * ps/Makefile: Pass definition of BROKEN_SPOOLER_FLAGS in DEFINES. - Add default definition of BROKEN_SPOOLER_FLAGS. - * Makefile: New variable BROKEN_SPOOLER_FLAGS. Add - BROKEN_SPOOLER_FLAGS to SUBFLAGS. - -Mon Apr 8 09:26:54 1991 James Clark (jjc at jclark) - - * etc/grog.pl: New file. - * Makefile (GROG): New variable. - Add GROG to SUBFLAGS. - * etc/Makefile (GROG): New variable. - (install.nobin): Install $(GROG) rather than grog.sh. - -Thu Apr 4 11:36:45 1991 James Clark (jjc at jclark) - - * eqn/special.c (special_box::compute_metrics): Make the input and - output strings the same. Get the new height and depth from the - predefined height and depth registers. Also make subscript kern - and skew available. - (special_box::compute_subscript_kern, special_box::compute_skew): - New functions. + * doc/Makefile.sub: Not all shells expand wildcards in the `for' + argument list to nothing if there is no file to match. Use `ls' as + a protection, similar to autoconf. - * eqn/box.c (pointer_box::compute_skew, - simple_box::compute_metrics, box::top_level) - * eqn/text.c (prime_box::compute_metrics, - prime_box::comput_subscript_kern) - * eqn/limit.c (limit_box::compute_metrics): - * eqn/delim.c (build_extensible, delim_box::compute_metrics): - * eqn/sqrt.c (sqrt_box::compute_metrics): Protect possibly - negative numbers in `nr' requests with a leading 0. + * Makefile.comm (install_dev, uninstall_dev): Protect `for' against + empty argument lists. -Wed Apr 3 15:58:23 1991 James Clark (jjc at jclark) + * doc/groff.texinfo: Improve documentation how vertical spacing + and line breaks interact. + Other minor fixes. - * eqn/special.c: New file. - * eqn/eqn.y: Declare token SPECIAL. Make it right associative. - Add new rule for simple. - * eqn/lex.c (token_table): Add SPECIAL. - * eqn/box.h: Declare make_special_box. - * eqn/Makefile: Add special.[co]. + * tmac/www.tmac: Initialize `www-htmlimage-gap'. -Sat Mar 30 10:57:53 1991 James Clark (jjc at jclark) +2003-08-03 Werner LEMBERG - * ps/devps/prologue: Possibly set packing to true while defining. - Create grops dictionary here. Initialize local variables before - defining procedures. - (PICTURE): Rename to PBEGIN. Also do save, noop showpage, count - the dictionary stack. Set strokeadjust and overprint to false if - the relevant operators are defined. - (PEND): New procedure. - * ps/ps.c (ps_printer::~ps_printer): In the prolog just include - prologue. Do everything else in the setup section. - (ps_printer::do_import): Just call PBEGIN and PEND around the - picture. Also push userdict before, and pop it afterwards. + * NEWS, src/devices/grops/grops.man: -b16 is necessary to produce + EPS (using eps2eps or similar programs to compute the bounding box). -Wed Mar 27 07:59:50 1991 James Clark (jjc at jclark) +2003-07-24 Werner LEMBERG - * troff/node.c (bracket_node::tprint): Brackets were being printed - 1m too low. + * doc/groff.texinfo: Use the new @/ command to avoid overlong lines. + * doc/texinfo.tex: Updated from texinfo 4.6. + * README.CVS: From now on we need texinfo 4.6. - * macros/tmac.an (SH, SS): Set fill mode. +2003-07-23 Werner LEMBERG -Tue Mar 26 07:46:31 1991 James Clark (jjc at jclark) + Add requests `dei1' and `ami1' for completeness. - * troff/div.c (top_level_diversion::begin_page): Set - high_water_mark to 0. + * src/roff/troff/input.cc (calling_mode): Remove + CALLING_DISABLE_COMP. + (comp_mode): New enumeration. + (do_define_string, define_string, define_nocomp_string, + append_string, append_nocomp_string): Updated. + (do_define_macro): Add third parameter. + (define_macro, define_nocomp_macro, define_indirect_macro, + append_macro, append_nocomp_macro, append_indirect_macro): Updated. + (define_indirect_nocomp_macro, append_indirect_nocomp_macro): New + functions. + (ignore): Updated. + (init_input_requests): Add `dei1' and `ami1'. -Fri Mar 22 09:19:46 1991 James Clark (jjc at jclark) + * tmac/trace.tmac: Handle de1 and am1. + (de): Improve tracing message. + (am): Add missing `do'. + (return): Use de1. - * man/mdate.sh: New file. - * man/mdate.c: Deleted. - * man/Makefile: Use mdate.sh instead of mdate. - (mdate): Deleted. + * NEWS, man/groff_diff.man, man/groff.man, doc/groff.texinfo: + Document new requests. - * eqn/lex.c (do_gsize): Supply missing argument to error message. +2003-07-22 Heinz-Jürgen Oertel -Tue Mar 19 11:06:50 1991 James Clark (jjc at jclark) + Add option -G to .MPIMG to insert a gap between text and the image. - * man/mdate.c: New file. - * man/*.man: Replace modification date by @MDATE@. - * man/Makefile (.man.n): Replace @MDATE@ by `mdate $<`. - (mdate): New target. + * tmac/www.tmac (www-finish-left-po, www-finish-right-ll, + www-finish-left-ll): Updated. + (www-image-just, www-image-gap, www-htmlimage-gap): New variables. + (MPIMG): Make option -L and -R optional. + Implement option -G. - * lib/font.c (text_file::next): Deal with arbitrarily long lines. - Remove illegal input characters. +2003-07-22 Gaius Mulley -Mon Mar 18 08:32:25 1991 James Clark (jjc at jclark) + * src/devices/grohtml/post-html.cpp + (html_printer::do_file_components): Don't use `stdout' as lvalue + since it can be a macro. - * macros/tmac.s (pg*start-col): Do .ns *after* running the hooks. +2003-07-22 Werner LEMBERG -Sat Mar 16 03:52:25 1991 James Clark (jjc at jclark) + * src/libs/libgroff/strerror.c: Include errno.h to be in sync with + the corresponding test in aclocal.m4. - * troff/div.c (begin_page): Change behaviour when - !first_page_begun and !break_flag. +2003-07-21 Werner LEMBERG - * troff/input.c (do_name_test): Return 0 if argument is empty. + * src/preproc/html/pre-html.cpp (TRANSPARENT): Don't use colour + names but RGB values directly. Otherwise pnmtopng depends on + an external file `rgb.txt' which maps colour names to values. - * troff/input.c (read_long_escape_name): Require closing ] to be - at same input level as opening [. +2003-07-20 Werner LEMBERG - * troff/input.c (read_increment_and_escape_name): New function. - (get_copy, process_input_stack): Use this for \n. + * aclocal.m4 (GROFF_SYS_ERRLIST): Include stdlib.h for MinGW. + * configure, src/include/config.hin: Regenerated. -Fri Mar 15 00:31:48 1991 James Clark (jjc at jclark) + * src/libs/libgroff/strerror.c: Include stdlib.h for MinGW. - * troff/div.c (top_level_diversion::begin_page): Ignore the - current value of page_number if !first_page_begun. +2003-07-19 Werner LEMBERG - * groff.c (main): Fix declaration of buf. + * PROBLEMS: Add solution for UTF-8 problem with hyphens. - * troff/input.c (do_name_test): New function. - (token::next): Implement \A. - (token::next): Implement \e by turning it into a TOKEN_ESCAPE. - (token::description, token::add_to_node_list, token::process): - Handle TOKEN_ESCAPE. - * troff/token.h: New token TOKEN_ESCAPE. +2003-07-18 Werner LEMBERG -Thu Mar 14 10:22:26 1991 James Clark (jjc at jclark) + * *.man: Switch to non-compatibility mode temporarily if GNU + syntax extensions are used in the particular man page. - * pic/main.c (do_picture): Allow space before and after filename - following `<'. Check that the filename is not empty. + * PROBLEMS: Add solutions for SGR problems. -Wed Mar 13 12:49:40 1991 James Clark (jjc at jclark) +2003-07-17 Werner LEMBERG - * Version 1.01 released. + Don't ignore grotty's command line options if \X'tty: sgr ...' is + used to change the drawing scheme. - * dvi/devdvi/CompileFonts: Add cm*ss10 fonts. + * src/devives/grotty/tty.cpp (bold_flag_option, + underline_flag_option, italic_flag_option, reverse_flag_option, + bold_underline_mode_option): New global variables. + (update_options): New function. + (tty_printer::special): Call update_options. + (main): Don't set xxx_flag but xxx_flag_option, then call + update_options. - * dvi/tmac.dvi: ftr HR to H. +2003-07-14 Werner LEMBERG - * macros/tmac.e: Round up computation of $r. + Make grotty emit proper Unicode box drawing characters for -Tutf8. - * xditview/tmac.X: Don't give up completely in compatibility mode. - Use \n(.s instead of \n[.s]. + * src/devices/grotty/tty.cpp (START_LINE, END_LINE): New enum + values. + (hline_char, vline_char): New global variables. + (tty_printer::tty_printer): Initialize them. + (tty_printer::draw): Emit START_LINE and END_LINE flags for both + horizontal and vertical lines. + (crossings): New global array. + (tty_printer::end_page): Use it to determine the proper crossing + character for -Tutf8. - * dvi/tmac.dvi: Don't give up completely in compatibility mode. - Use \(ci instead of \[ci]. Use \n(.s instead of \n[.s]. - Add u to factors inside \s[...]. Rename frac to dvi-frac. - Translate \(FM onto \[prime] and \(!/ onto \[slashnot]; use these - short names in the char definitions. +2003-07-12 Werner LEMBERG - * ps/tmac.ps: Don't give up completely in compatibility mode. - Fix the fraction definitions to use \n(.s and \(f/. Add an extra - quote in front of \n(.s. Add u to factors inside \s[...]. + * doc/Makefilesub (HTMLDOCFILESALL): New macro. + (HTMLDOCFILES): Revert to `pic.html'. + (CLEANADD, install_html, uninstall_sub): Use HTMLDOCFILESALL. -Mon Mar 11 12:01:20 1991 James Clark (jjc at jclark) +2003-07-11 Werner LEMBERG - * tty/tmac.tty: Call the nroff request. + * doc/pic.ms: Improve documentation of absolute coordinates. + Document absolute positioning of pictures. - * macros/tmac.e ((x, )x): Better definitions that work properly - in a diversion. - (@0, @1): Helper macros for (x. + * NEWS: Add new pic capability. - * macros/tmac.e ($s, hl): Use \l rather than \D. +2003-07-09 Hartmut Henkel - * tty/tmac.tty: Make it work better in compatibility mode. - (pchar): Rename to tty-char. + * src/libs/libgroff/geometry.cpp (check_output_arc_limits): + Rewritten. - * macros/tmac.e (@E): New macro. - (r, i, b, rb, bi): Use @E. +2003-07-07 Werner LEMBERG - * macros/tmac.e (@F): Don't use (;...) syntax. + Implement support for dashed and dotted ellipses in pic. Based on + a patch from Hartmut Henkel . - * macros/tmac.e: Remove mention of \*(||/revisions. Mention that - it was modified for groff. + * src/preproc/pic/common.cpp (common_output::ellipse_arc, + common_output::dashed_ellipse, common_output::dotted_ellipse): New + functions. Ellipse arcs are approximated with circle arcs. + * src/preproc/pic/common.h (common_output): Updated. + * src/preproc/pic/tex.cpp (tex_output::ellipse): Use new ellipse + functions. + * src/preproc/pic/troff.cpp (simple_output::ellipse): Ditto. - * macros/tmac.e: Make sure \n(ps and \n(es are >= \n(.V. + * src/preproc/pic/TODO, src/preproc/pic/pic.man: Updated. - * macros/tmac.e (<., .>): Removed. - ([., .]): If \n(.V>=1v, use [] instead of superscripting. +2003-07-06 Werner LEMBERG - * macros/tmac.e: Remove check that groff is being used. + Make grotty work on platforms which have unsigned char as the + default for char. Based on a patch by Thomas Klausner + . - * macros/tmac.e (@C): Change families only if using groff; turn - compatibility mode off while changing familes. Save compatibility - mode before changing families and restore it afterwards. + * src/devices/grotty/tty.cpp (schar): New typedef. + Updated calls to declare_ptable and implement_ptable. + (glyph): Use schar for back_color_idx and fore_color_idx. + (tty_printer): Use schar for curr_fore_idx and curr_back_idx. + (tty_printer::tty_color, tty_printer::tty_printer, + tty_printer::color_to_idx, tty_printer::put_color): Updated. - * macros/tmac.e (@h): Remove test for offset + line length. +2003-07-06 Ruslan Ermilov - * macros/tmac.e (sorry): Rename to @S. Use \$1 instead of \$0 - (lo, th, ac): Define to call @S instead of using als. + * src/roff/nroff/nroff.sh: Add option -d for completeness. + * src/roff/nroff/nroff.man: Updated. - * macros/tmac.e: Make $r and $R now contain \n(.v*100/\n(.sp, ie - the ratio of the vertical spacing to the point size in units - expressed as a percentage. Use these instead of $10r and $10R, - Delete $10r and $10R. +2003-07-05 Werner LEMBERG - * lib/font.c (font::load): In default computation of space_width, - divide by sizescale. Use scale_round. + * NEWS, tmac/groff_www.man: Updated. + * doc/Makefile.sub: Updated. - * macros/tmac.an (TP): Don't call `nf'. - (an-do-tag): Don't call `fi'. +2003-07-05 Gaius Mulley -Sun Mar 10 09:52:35 1991 James Clark (jjc at jclark) + Implement support for multiple HTML output files. - * troff/input.c (process_input_stack): Handle the case where - spaces at the beginning of an input line are followed by a - newline. + * src/preproc/html/pre-html.cpp (scanArguments): Dummy handling for + -j command line option. -Thu Mar 7 20:18:07 1991 James Clark (jjc at jclark) + * src/devices/grohtml/post-html.cpp (job_name, multiple_files): New + global variables. + (file): New fields `new_output_file', `require_links', + `output_file_name'. + (file::file): Updated. + (files::set_file_name, files::set_links_required, + files::are_links_required, files::is_new_output_file, + files::file_name, files::next_file_name): New functions. + (header_desc): New fields `no_of_level_one_headings', + `header_filename'. + (header_desc::header_desc): Updated. + (header_desc::write_headings): Handle multiple files. + (html_printer::write_header): Save file name in which header occurs. + (html_printer::determine_header_level): Possibly split files on + level one headings. + (html_printer::do_links, html_printer::troff_tag): Updated. + (html_printer::insert_split_file, html_printer::do_job_name, + html_printer::emit_link, html_printer::write_navigation, + html_printer::do_file_components): New functions. + (html_printer::~html_printer): Handle multiple files. + (main): Handle command line option `-j'. - * groff.c (device_table): Add PIC_X_OPTION for dvi device. - * groff.sh: Use pic -x with the dvi device. + * src/devices/grohtml/grohtml.man: Updated. - * dvi/devdvi/FontMakefile (H): Don't use -s. + * doc/Makefile.sub (pic.html), doc/Makefile.in (pic.html): New rule + which splits file. - * dvi/devdvi/HI, dvi/devdvi/HB: New files. - * dvi/devdvi/Makefile: Add HI and HB to FONTS. - * dvi/devdvi/FontMakefile: Add rules for HI and HB. Include these - in FONTS. + * tmac/www.tmac (JOBNAME): New macro. + * tmac/s.tmac (SH-NO-TAG): New macro. + (@SH): Call SH-NO-TAG. + (@NH): Updated. -Mon Mar 4 13:20:14 1991 James Clark (jjc at jclark) +2003-07-05 Ruslan Ermilov - * ps/psfig.diff: New file. - * ps/tmac.psfig: New file. + * tmac/groff_mdoc.man: Improve documentation of punctuation + characters. -Sat Mar 2 00:15:09 1991 James Clark (jjc at jclark) +2003-07-04 Ruslan Ermilov - * macros/tmac.s (]=, ref*do-tl, ref*bib-print): Deleted. - (]-): Don't call ref*do-tl. + * tmac/doc.tmac (Bd): Change to doc-Li-font later. - * macros/tmac.s (ref*end-print): Use XP if [F not defined. +2003-07-03 Werner LEMBERG - * macros/tmac.s (ref*normal-print): Call FS rather than fn@do-FS. - (fn@do-FS): Rename to fn*do-FS. + * tmac/an-old.tmac [cR]: Redefine `bp' to avoid empty lines. - * troff/input.c (transparent_translate): New function. - (process_input_stack): Apply transparent_translate before calling - diversion::transparent_output(unsigned char). +2003-07-01 Ruslan Ermilov -Wed Feb 27 00:13:25 1991 James Clark (jjc at jclark) + * tmac/doc.tmac (doc-do-func, doc-do-func-args): Don't print a comma + after `/*' and `*/'. + Fix spacing. + (Fn, Fo): Reduce indentation in synopsis. - * troff/input.c (do_define_macro): Define the macro before calling - skip_line. + * tmac/doc-common (doc-check-depth): New macro. + (doc-end-macro, Sh, Ss): Use it. + (Cd): Fix behaviour in synopsis. + (In): Make it parsed and callable. + If not in the synopsis, represent the C header file enclosed in + angle brackets. + (doc-str-Rv-std-suffix, doc-str-Rv-stds-suffix, doc-str-Rv-std0): + Use minus, not hyphen. - * xditview/Makefile: Add DEVICES variable. Change install target - to use this. + * tmc/groff_mdoc.man: Updated. -Tue Feb 26 10:46:22 1991 James Clark (jjc at jclark) +2003-07-01 Werner LEMBERG - * groff.c (run_commands): Handle the possibility that there are - child processes other than those forked by us. + Integrated grap2graph, contributed by Eric S. Raymond. -Sun Feb 24 21:32:30 1991 James Clark (jjc at jclark) + * contrib/grap2graph/{Makefile.sub, grap2graph.sh, grap2graph.man}: + New files. + * Makefile.in, NEWS, MANIFEST, contrib/eqn2graph.man, + contrib/pic2graph.man, src/roff/groff/groff.man: Updated. - * lib/string.c (string::append): New function. - * lib/stringclass.h: Declare it. +2003-07-01 Colin Watson -Thu Feb 21 11:49:26 1991 James Clark (jjc at jclark) + * src/xditview/*.c: Add prototypes, fix return types, add includes. + Based on work by Fumitoshi UKAI . - * eqn/main.c (main): New option -N which sets - no_newline_in_delim_flag. - (do_file): If no_newline_in_delim_flag is set don't allow newlines - in delimiters. - * groff.c (main): Pass -N on to eqn. - (help, synopsis): Mention -N. - * groff.sh: Implement -N. +2003-06-31 Ruslan Ermilov -Wed Feb 20 15:16:10 1991 James Clark (jjc at jclark) + * tmac/tty-char.tmac: Provide `lb', `rb', `lk', `rk', `lt', `rt'. - * macros/tmac.s (]=, ref*bib-print, ref*do-tl): New macros. - (]-): Call ref*do-tl if ref*need-tl is non-zero. - (XP): Allow as initializer. +2003-06-31 Werner LEMBERG -Tue Feb 19 14:09:06 1991 James Clark (jjc at jclark) + * doc/Makefile.sub (CLEANADD): Remove all files created by + running `make groff.{pdf,dvi}'. - * troff/env.c (environment::wrap_up_field): If field_spaces are - non-zero and we have a current_tab, subtract padding from - tab_distance. If this makes tab_distance <= 0, use the next tab - stop instead. If there isn't any next tab or it's a left tab, - wrap up the current tab. - (environment::start_field): Initialize tab_precedes_field. - (environment::wrap_up_tab): If there's a current field, update - pre_field_width, field_distance and tab_precedes_field. - * troff/env.h (environment::tab_precedes_field): New member. + * Makefile.sub (DISTCLEANFILES): Remove all non-source files from + src/xditview also. -Fri Feb 15 01:24:00 1991 James Clark (jjc at jclark) +2003-06-30 Werner LEMBERG - * ps/ps.c (ps_printer::do_file): New function. - (ps_printer::special): Bind to `file' special. - (ps_printer::do_exec): Set ndefined_styles to 0. + * Makefile.in (SHELL): Define as @SHELL@. + (mkinstalldirs): Use $(SHELL). + (MDEFINES): Add $(SHELL). + * Makefile.comm (SHELL): Removed. -Sat Feb 9 03:03:04 1991 James Clark (jjc at jclark) +2003-06-29 Werner LEMBERG - * eqn/text.c (split_text): Grok \* and similar escapes sequences. - Avoid stripping first character from the start of unrecognized - escapes. Use lex_error instead of error to report errors. - * eqn/lex.c (get_token): Rework handling of escapes. - (lex_error): Move declaration into... - * eqn/eqn.h. + * tmac/s.tmac (De, Ds): New aliases for .DE and .DS, respectively. + The X11 documentation files use them. + * tmac/groff_ms.man, doc/groff.texinfo: Document them. - * xditview/xditview.c (main): Make -page option work. +2003-06-15 Robert Goulding - * Makefile: Correct comment about -DBROKEN_SPOOLER and pageview. + * tmac/e.tmac (@C): Handle .ad also. -Wed Feb 6 12:28:43 1991 James Clark (jjc at jclark) +2003-06-12 Werner LEMBERG - * macros/tmac.s (B2): Correct size of box. + * src/preproc/tbl/tbl.man: Document formatting of text blocks. -Tue Feb 5 00:37:35 1991 James Clark (jjc at jclark) + * src/roff/troff/input.cc (token::next) : + Assign `n' even here. It is possible to construct a node + immediately following an escape character: - * macros/tmac.s (B2): Postpone drawing the box until in the - top-level diversion. + .di xx + \?\\\?a + .br + .di + .xx - * tty/tmac.tty: Add font translations for C, CR, CW. +2003-06-10 Werner LEMBERG - * groff.c (synopsis, help): Document -i. - * groff.sh: Implement -i. + * README.WIN32: Removed. + * MANIFEST: Updated. - * macros/tmac.s (@NH): Put a `.' after multi-part numbers. - Simplify the construction of SN. +2003-06-07 Werner LEMBERG - * troff/number.c (parse_term): Give `|' a higher precedence. - * tbl/table.c (numeric_text_entry::simple_print): Parenthesise - accordingly. + * src/roff/nroff/nroff.sh: Don't emit SGR for option -u. - * macros/tmac.s (B2): Use par@finish instead of par@reset. +2003-06-05 Werner LEMBERG -Mon Feb 4 12:36:09 1991 James Clark (jjc at jclark) + * src/preproc/pic/pic.y : Implement workaround for bug + in Compaq C++ V6.5-033 for Compaq Tru64 UNIX V5.1A (Rev. 1885). - * lib/string.c (string::move): New function. - * lib/stringclass.h: Declare it. +2003-06-03 Werner LEMBERG -Sat Feb 2 16:02:16 1991 James Clark (jjc at jclark) + * src/preproc/grn/hdb.cpp (DBRead): Don't close file handle; this + is done by the calling function. - * troff/env.c (distribute_space): Add optional argument - `force_forward'. - (environment::wrap_up_field): Call distribute_space with - `force_forward' argument of 1. +2003-05-22 Ruslan Ermilov -Fri Feb 1 19:36:33 1991 James Clark (jjc at jclark) + * tmac/X.tmac: Fix definition of `em'. - * lib/string.c, lib/stringclass.h (string::operator+=(char)): - Inline it. Move reallocation into... - (string::grow1): New function. - * pic/Makefile, tbl/Makefile, eqn/Makefile, ps/Makefile: Redo - dependencies to include library header files. - * lib/Makefile: Make string.c and lf.c depend on stringclass.h. +2003-05-22 Werner LEMBERG -Thu Jan 31 15:02:27 1991 James Clark (jjc at jclark) + * src/roff/troff/input.cc (return_macro_request): Fix detection of + argument. - * macros/tmac.s (@NH): Use the same number registers than -ms does - for the heading level counters. Use the same string that -ms does - for the number for this heading. +2003-05-18 Werner LEMBERG -Wed Jan 30 14:25:40 1991 James Clark (jjc at jclark) + * tmac/doc.tmac (doc-tag-list): Force horizontal mode after tag + to make items work which consist only of a tag. - * lib/new.c (operator new): Cast result of malloc to char *. +2003-05-17 Werner LEMBERG - * troff/input.c (spring_trap, lookup_request): Add assert that nm - is not null. + * tmac/doc.tmac (doc-tag-list): Don't use \Z to assure that spaces + aren't stretched in a tag (this can fail with unformatted boxes). + Instead, insert a break and go back one line. -Tue Jan 29 18:08:05 1991 James Clark (jjc at jclark) +2003-05-16 Werner LEMBERG - * groff.c (main): Support -i. + * src/roff/troff/input.cc (return_macro_request): If called with + argument pop macro twice. We need this to trace `return'. -Sun Jan 27 13:23:17 1991 James Clark (jjc at jclark) + * tmac/trace.tmac: Handle `return'. + Fix typos. - * pic/pic.h: Include . + * NEWS, man/groff_diff.man, man/groff.man, doc/groff.texinfo: + Document. - * ps/ps.c: Add declaration of mktemp. +2003-05-15 Larry Kollar - * Makefile: Add -DHAVE_UNION_WAIT option for CPPDEFINES. - * groff.c: If HAVE_UNION_WAIT is defined, declare wait()'s - argument as union wait *. - (run_commands): If HAVE_UNION_WAIT is defined cast wait()'s - argument to union wait *. + * tmac/groff_ms.man, doc/groff.texinfo: Improve documentation of + registers `FPS', `FVS', and `FPD'. -Sat Jan 26 12:04:52 1991 James Clark (jjc at jclark) +2003-05-15 Werner LEMBERG - * tty/tmac.tty: Add definition of \(co. + * src/utils/pfbtops/pfbtops.c (get_text): Handle loop counter + correctly. - * pic/object.c (make_arc): Only increase radius when radius - strictly less than d. - (arc_object::update_bounding_box): May need to add 4.0 to end_quad - more than once. +2003-05-03 Ruslan Ermilov - * troff/env.c (environment::environment(symbol), - environment::environment(const environment *)): Initialize - input_trap_count. + * tmac/groff_mdoc.man: Slight improvements. -Sat Jan 19 08:18:35 1991 James Clark (jjc at jclark) +2003-05-03 Werner LEMBERG - * tbl/main.c (main): Add exit(0). + * tmac/doc-common (doc-header): Emit vertical space of 1v instead of + `doc-header-space' after header line if register `cR' is set. - * ps/ps.c (ps_printer::~ps_printer): Use fseek instead of rewind. +2003-05-02 Werner LEMBERG - * pic/main.c (main): - * eqn/main.c (main): - * tbl/main.c (main): - * etc/soelim.c (main): - * driver/printer.c (printer::~printer): - * troff/node.c (real_output_file::~real_output_file, - real_output_file::flush): Check for errors on stdout. + * TODO: Updated. - * most files: Add 1991 to copyright notice. +2003-05-01 Ruslan Ermilov - * macros/tmac.s: Don't test \n(.x and \n(.y. + * tmac/doc-common (Nd): Use \[em]. - * troff/input.c (token::next): Rename `escape_char' label to - `handle_escape_char' and `normal_char' label to - `handle_normal_char'. +2003-05-01 Werner LEMBERG -Thu Jan 17 15:46:35 1991 James Clark (jjc at jclark) + * tmac/doc-ditroff, tmac/doc-nroff (doc-header-space, + doc-footer-space): Initialize to 0.5i. + (doc-setup-page-layout): Don't set doc-header-space and + doc-footer-space. - * groff.c (main, synopsis, help): Support -a option. - * groff.sh: Likewise. Also eliminate Zflag variable by adding -z - to trflags while parsing options. +2003-04-30 Werner LEMBERG -Tue Jan 15 13:07:27 1991 James Clark (jjc at jclark) + * REVISION: Set to 1. - * troff/number.c (parse_term): With `m', `M' and `n' scale - indicators, convert scale factor to hunits before scaling. + * doc/pic.ms: Document possible problems with `figname'. -Mon Jan 14 12:39:12 1991 James Clark (jjc at jclark) +2003-04-29 Werner LEMBERG - * lib/font.c (scale_round): Better test for overflow when n is - negative. +Version 1.19 released +===================== -Thu Jan 10 11:10:56 1991 James Clark (jjc at jclark) + * VERSION: Set to 1.19. + * REVISION: Set to 0. + * doc/groff.texinfo, doc/webpage.ms, NEWS: Updated. - * tbl/main.c (process_format): Add second argument of type - options*. Change callers. Allow opt->tab_char as well as '\t' - between format items. + * src/devices/grohtml/post-html.cpp (html_printer::~html_printer): + Define charset as `US-ASCII' in html output. -Mon Jan 7 12:30:18 1991 James Clark (jjc at jclark) + * tmac/www.tmac (ULE): Add missing scaling indicator. - * macros/tmac.an (PD): With no arguments, make sure register PD is - at least \n[.V]. - (TH): Call PD with no argument, instead of setting register PD - directly. + * win32-diffs: Removed. -Sun Jan 6 11:18:39 1991 James Clark (jjc at jclark) +2003-04-28 Werner LEMBERG - * Version 1.00 released. + * doc/groff.texinfo: Document `dn' and `dl' registers if used with + `.da' and `.boxa'. + Document how to insert discardable whitespace with `.ss'. -Sat Jan 5 08:44:30 1991 James Clark (jjc at jclark) +2003-04-27 Werner LEMBERG - * ps/tmac.ps, xditview/tmac.X: Add font translation of C to CR. + * src/preproc/pic/tex.cpp (tex_output::start_picture): Make code + work with plain TeX also. - * dvi/devdvi/DESC: Mount CW instead of CR. + * src/preproc/pic/pic.man, doc/pic.ms: Fix TeX code example. - * dvi/tmac.dvi: Add definition of \(tm. +2003-04-25 Gaius Mulley - * dvi/devdvi/texsy.map: Add lh, and rh. - * dvi/devdvi/texex.map: Add lt, rt, lb, rb, lk, rk. - * dvi/devdvi/texmi.map: Add *o. Regenerate fonts. + * src/devices/grohtml/post-html.cpp (html_printer::~html_printer): + Use a loose DTD. - * dvi/devdvi/FontMakefile: Generate H from cmss10. - * dvi/devdvi/Makefile: Install H. - * dvi/devdvi/H: New file. +2003-04-24 Werner LEMBERG -Fri Jan 4 15:04:57 1991 James Clark (jjc at jclark) + * src/preproc/pic/pic.man, doc/pic.ms: Explain how to get a + vbox with positive height and zero depth if in TeX mode. - * troff/env.c (vertical_spacing): Don't allow vertical spacing to - be 0. + * NEWS: Document glyph name changes for grodvi and grolj4. -Thu Jan 3 13:41:19 1991 James Clark (jjc at jclark) +2003-04-23 Werner LEMBERG - * macros/tmac.s (@EN): Add \n(.V to the argument to ds@need. + * src/preproc/pic/tex.cpp (tex_output::start_picture): Fix TeX code. + * doc/pic.ms: Fixed. - * macros/tmac.pic (PS): Avoid attempting to set negative indent. +2003-04-21 Werner LEMBERG - * macros/tmac.s (@EN): Handle the case where the equation is empty - but the label is not. + HP-UX 10.20 has `snprintf' but it isn't declared. -Wed Jan 2 10:31:44 1991 James Clark (jjc at jclark) + * configure.ac: Add declaration test for snprintf. + * configure: Regenerated. + * src/include/lib.h: Handle `NEED_DECLARATION_SNPRINTF'. + * src/include/config.hin: Regenerated. - * troff/groff.h: New warning category WARN_SPACE. - * troff/input.c: Add WARN_SPACE to DEFAULT_WARNING_MASK. Add - WARN_SPACE to warning_table. - (interpolate_macro): Give a warning of type WARN_SPACE if the name - is longer than two characters and is not defined, but the first - two characters do make a defined name. +2003-04-19 Werner LEMBERG - * PROBLEMS: New file. + Add keyword `figname' to pic, specifying the name of the picture + box in TeX mode. Based on a patch from William J Poser + . - * CHANGES: New file. - * README-0.6, README-1.00: Deleted. + * src/preproc/pic/pic.y: New token `FIGNAME'. + (macro_name): New rule of type . + (placeless_element): Handle `FIGNAME'. + * src/preproc/pic/lex.cpp (lookup_keyword): Add `figname'. + * src/preproc/pic/main.cpp (graphname): New global variable. + (do_picture): Initialize `graphname'. + * src/preproc/pic/pic.h: Updated. + * src/preproc/pic/tex.cpp (tex_output::start_picture): Use + `graphname'. + Simplify TeX code. + (tex_output::text): Beautify output. + * src/preproc/pic/object.cpp (object_spec::~object_spec): Deallocate + `shaded' and `outlined' unconditionally. + * NEWS, src/preproc/pic/pic.man, doc/pic.ms: Updated. + Minor improvements. - * groff.c, groff.sh: Add X75-12 and X100-12 devices. - * xditview/devX75/Makefile: Make devX75-12. - * xditview/devX100/Makefile: Make devX100-12. + * PROBLEMS, README.CVS: Mention that bison version 1.875b or + greater is necessary. - * xditview/devX100/eqnchar, xditview/devX75/eqnchar, - dvi/devdvi/eqnchar, ps/devps/eqnchar: Remove use of \R. +2003-04-17 Hartmut Henkel -Tue Jan 1 19:24:01 1991 James Clark (jjc at jclark) + Add option -r to soelim to avoid emission of `.lf' lines. + Add option -t to produces TeX comment lines instead of `.lf' lines. - * README-0.7: Rename to README-1.00. + * src/preproc/soelim/soelim.cpp: New global variables `raw_flag' + and `tex_flag'. + (usage): Updated. + (main): Handle `-r' and `-t'. + (set_location): Handle `raw_flag' and `tex_flag'. + * src/preproc/soelim/soelim.man, NEWS: Updated. - * macros/tmac.pic: New file. - * macros/Makefile (install.nobin): Install tmac.pic. +2003-04-17 Werner LEMBERG -Mon Dec 31 10:40:53 1990 James Clark (jjc at jclark) + * tmac/hyphenex.sh: Replaced with... + * tmac/hyphenex.pl: This perl script to avoid sed compatibility + nightmares. - * troff/env.c (hyphen_word): Correct the test for whether the - token is a hyphen. Reset npos to 0. + * aclocal.m4 (GROFF_HTML_PROGRAMS): Emit useful warning message + if --quiet is used for the configure script. + * configure: Regenerated. - * macros/tmac.s (par@sup-start, par@sup-end): New implementations. +2003-04-16 Werner LEMBERG -Sun Dec 30 15:53:13 1990 James Clark (jjc at jclark) + * src/devices/grohtml/post-html.cpp (text_glob::text_glob): + Add `const' to second argument. + (html_printer::add_table_end): Add `const' to argument. + * src/devices/grohtml/html-text.cpp (html_text::issue_tag): Add + `const' to arguments. + * src/devices/grohtml/html-text.h: Updated. - * macros/tmac.s (ds*common-end): Call par*reset. - (PE): Likewise. - (par@reset-indent): Deleted. + * src/devices/grolbp/charset.h (symset): Use `unsigned char'. + * src/devices/grolbp/lbp.h (lbpputc): Use `unsigned char' for + argument. - * macros/tmac.s (@IP): Divert the label. + * src/devices/grotty/tty.cpp (tty_printer::make_rgb_string): Use + cast for integer constant. -Sat Dec 29 14:33:32 1990 James Clark (jjc at jclark) + * src/preproc/html/pre-html.cpp (image_device): Use `const'. + (writeNbytes): Add `const' to first argument. + (writeString): Add `const' to argument. + (char_buffer::can_see): Add `const' to third argument. + * src/preproc/html/pushback.cpp (pushBackBuffer::isString): Add + `const' to argument. + * src/preproc/html/pushback.h: Updated. - * xditview/draw.c (setGC): Use a line width of .1m rather than - .04m by default; round rather than truncate value. + * src/preproc/soelim/soelim.cpp (include_list): Add `const'. + (include_path_append): Add `const' to argument. + (do_file): Updated. - * tbl/table.c (class empty_entry): New class. - (empty_entry::empty_entry, empty_entry::line_type): New functions. - (table::add_entry): Represent empty entries by objects of type - empty_entry. - (table_entry::line_type): Return -1. - (table::determine_row_type): Ignore entries with line_type 0. - Treat type -1 as non-lines. + * src/roff/troff/uniglyph.cpp (unicode_to_glyph_list): Use `const' + for `value'. + (unicode_to_glyph_init::unicode_to_glyph_init): Updated. + * src/roff/troff/uniuni.cpp (unicode_decompose_list): Use `const' + for `value'. + (unicode_decompose_init::unicode_decompose_init): Updated. + * src/roff/troff/glyphuni.cpp (glyph_to_unicode_list): Use `const' + for `value'. + (glyph_to_unicode_init::glyph_to_unicode_init): Updated. + * src/roff/troff/input.cc (process_startup_file): Add `const' to + argument. -Fri Dec 28 15:04:41 1990 James Clark (jjc at jclark) + * tmac/hyphenex.sh: Make script more portable by using a here + document. - * ps/devps/textmap, xditview/libXdvi/DviChar.c, tty/devlatin1/R.proto, - macros/tmac.s: Rename \(-d to \(Sd. +2003-04-15 Werner LEMBERG -Thu Dec 27 12:35:47 1990 James Clark (jjc at jclark) + Renamed all `*.cc' files to `*.cpp'. + Updated all configuration files, makefiles, and documentation. - * ps/devps/textmap: Add `sd', `/_' and `3d' characters. - * xditview/libXdvi/DviChar.c: Likewise. - * dvi/devdvi/texsy.map: Add `<<', `>>'. +2003-04-14 Werner LEMBERG -Wed Dec 26 13:33:23 1990 James Clark (jjc at jclark) + * tmac/hyphenex.sh: Slight improvements. - * troff/div.c (top_level_diversion::begin_page): Call - init_output() if the_output is 0. +2003-04-13 Werner LEMBERG -Sat Dec 22 12:35:29 1990 James Clark (jjc at jclark) + * font/devascii/R.proto, font/devcp1037/R.proto, + font/devlatin1/R.proto, font/devutf8/R.proto: Fill up remaining + character slots with unnamed glyphs. - * troff/input.c: Replace ESCAPE_E by ESCAPE_e and ESCAPE_C by - ESCAPE_c. - (get_copy): Turn \E into ESCAPE_E. - (token::process, asciify): Handle ESCAPE_E. + * tmac/an-old.tmac: Fix hyphenation value if `cR' is active. + (an-first): New global variable. + (an-header): Emit vertical space between multiple man pages. - * macros/tmac.s (ds*common-end, par@reset): Add `.rj 0'. - (RD): New macro. - (DS): Implement `.DS R'. +2003-04-11 Werner LEMBERG -Fri Dec 21 11:41:53 1990 James Clark (jjc at jclark) + * doc/groff.texinfo, man/groff_out.man: \S only accepts integer + values. - * macros/tmac.s (FS): New macro. +2003-04-10 Werner LEMBERG - * macros/tmac.s (fn@do-FS): Use @LP instead of LP. + * PROBLEMS: Revised. - * macros/tmac.s (cov*tl-init): Remove after first execution - instead of aliasing to @nop. Call top of page macro explicitly - instead of setting trap; call @init first. Set pg@top as top of - page macro. - (cov*auto-init): Deleted. Set cov*tl-init instead of - cov*auto-init as top of page trap. - (TL, LP): Do a break instead of calling cov*tl-init. - (cov*print): With RP format but no TL, alias FS and FE to @FS and - @FE; in this case also give a warning and always start another - page. No need to set pg@top here. - (cov*tl-init): Rename to cov*first-page-init. +2003-04-10 Bernd Warken - * macros/tmac.s (RP): Do `.pn 0'. - (cov*tl-init): With RP format don't do `.pn 0'. + * doc/webpage.ms: Improved. - * macros/tmac.s (pg@cs-top): Set no space mode. +2003-04-09 Werner LEMBERG - * macros/tmac.s (par@TL, par@AU, par@AI): New macros. - (cov*ab-init): Alias TL, AU and AI to these. + Add register \n[.height] which returns the value of \H. + Add register \n[.slant] which returns the value of \S. -Thu Dec 20 10:10:50 1990 James Clark (jjc at jclark) + * src/roff/troff/env.cc (init_env_requests): Implement. + * NEWS, man/groff_diff.man, man/groff.man, doc/groff.texinfo: + Document. - * macros/tmac.s (@EQ): Move the space before the equation into @EN - (@EN): Do nothing unless \n[dl] is > 0. +2003-04-08 Werner LEMBERG -Tue Dec 18 12:20:47 1990 James Clark (jjc at jclark) + * tmac/html.tmac: Move some of the data into html-end.tmac. + Remove most of the character translations for eqn since html fonts + now cover those characters. + Load www.tmac. + * tmac/html-end.tmac: New file. + * tmac/troffrc: Load html.tmac not www.tmac for -Thtml. + * tmac/troffrc-end: Load html-end.tmac not html.tmac for -Thtml. + * tmac/Makefile.sub (NORMALFILES): Add html-end.tmac. - * pic/object.c (ellipse_object::radius): New function. +2003-04-07 Werner LEMBERG - * VERSION: Change version to 0.7. + * man/groff_out.man: Document negative values of `N' if -Thtml is + used. - * tbl/table.c (block_entry::do_divert): Declare return type as - void. - (block_entry::divert, alphabetic_block_entry::divert): Return 1. +2003-04-06 Werner LEMBERG -Mon Dec 17 12:30:34 1990 James Clark (jjc at jclark) + * Makefile.comm (depend.temp): Check location of YTABC. - * troff/column.c: New file. - * troff/Makefile: Corresponding changes. +2003-04-05 Maciej W. Rozycki - * troff/hvunits.c (scale(vunits, vunits, vunits)): New function. - Friend of vunits. + * contrib/mom/Makefile.sub (GROFFBIN): New variable for groff + binary path. + (groff_bin_path): Rename to GROFF_BIN_PATH. + (GROFF): Use GROFFBIN and GROFF_BIN_PATH. + * doc/Makefile.in (TROFFBIN): New variable for troff + binary path. + (GROFFBIN): New variable for groff binary path. + (groff_bin_path): Rename to GROFF_BIN_PATH. + (TROFF): Use TROFFBIN. + (GROFF): Use GROFFBIN and GROFF_BIN_PATH. + * doc/Makefile.sub (GROFFBIN): New variable for groff + binary path. + (groff_bin_path): Rename to GROFF_BIN_PATH. + (GROFF): Use GROFFBIN and GROFF_BIN_PATH. - * troff/div.c (top_level_diversion::space): If the space causes - the first-page transition and springs a trap, truncate the space - to 0. + * Makefile.comm (install_dev): Install scripts from DEVSCRIPTS + with INSTALL_SCRIPT. + (uninstall_dev): Uninstall scripts from DEVSCRIPTS. + * Makefile.dev (all): Depend on DEVSCRIPTS. + (install_dev): Likewise. + * font/devdvi/Makefile.sub (DEVSCRIPTS): New variable to hold + scripts. + * font/devps/Makefile.sub (DEVSCRIPTS): Likewise. + (DEVGENSCRIPTS): New variable to hold generated scripts. -Fri Dec 14 12:30:02 1990 James Clark (jjc at jclark) +2003-04-05 Werner LEMBERG - * ps/ps.c (ps_printer::do_import): Add a `clear' after including - the document. + * src/libs/libdriver/input.cc (IntArray::operator[], + IntArray::get_data): Remove meaningless `const' in return value. - * pic/troff.c (troff_output::line_thickness, - troff_output::set_fill): Do a horizontal motion to compensate for - the width of the \D escape sequence. + * README.CVS: New file. -Thu Dec 13 10:17:14 1990 James Clark (jjc at jclark) +2003-04-04 Werner LEMBERG - * xditview/tmac.X: Reinstate definition of \(rn, but only for X100 - (not X75). + Check for stdint.h in C++, not in C. - * eqn/sqrt.c (sqrt_box::compute_metrics): Supply missing argument - to printf. + * aclocal.m4 (GROFF_STDINT_H): New function, + * configure.ac: Check for stdint.h with GROFF_STDINT_H instead of + AC_CHECK_HEADERS. + * configure, src/include/config.hin: Regenerated. + * src/libs/libgroff/tmpname.cc: Use HAVE_CC_STDINT_H. - * tbl/table.c (simple_entry::simply_print): Don't declare as pure. - Supply empty definition. - (text_entry::simple_print, simple_text_entry::simple_print): - Delete declarations. - (table::add_entry): Represent empty entries by objects of type - `simple_entry'. -Wed Dec 12 08:50:48 1990 James Clark (jjc at jclark) + Fix handling of   in grohtml. To do this, troff emits `N' + with a negative value, representing the width of the unbreakable + space (only for -Thtml). grohtml then converts this back to +   and uses the value of N as its width. - * troff/Makefile: Remove -DHYPHEN_CONTROL from DEFINES. + * src/roff/troff/node.cc (space_char_hmotion_node::tprint, + unbreakable_space_node::tprint): Emit `N-'. + * src/include/printer.h (printer::set_numbered_char): Make it + virtual. + Make members `font_table' and `nfonts' protected instead of private. + * src/devices/grohtml/post-html.cc + (html_printer::set_numbered_char): New member function. - * tbl/table.c (left_text_entry::add_tab): New function. - * macros/tmac.s: Make @RT an alias for par@reset. Make RT - initialize like LP. + * src/libs/libgroff/maxfilename.cc: + s/HAVE_LIMITS_H/HAVE_CC_LIMITS_H/. -Mon Dec 10 11:19:55 1990 James Clark (jjc at jclark) + * src/roff/troff/node.cc (unbreakable_space_node::tprint): Don't + emit word marker. - * troff/env.c (environment::start_field): Give an error message if - there is no next tab. +2003-04-03 Sergey A. Osokin -Sun Dec 9 11:46:40 1990 James Clark (jjc at jclark) + * man/roff.man: Small fixes. - * troff/env.c (hyphenate): Skip initial elements with zero - hyphenation code. +2003-04-03 Werner LEMBERG - * macros/tmac.s (par@init): Keep VS in points rather than units. + Make groff independent from locale's numeric settings. -Sat Dec 8 23:00:27 1990 James Clark (jjc at jclark) + * configure.ac: Check for `setlocale'. + * configure, src/include/config.hin: Regenerated. - * pic/main.c (main): Implement `-c' option. - * pic/output.h: Declare make_tpic_output(). - * pic/tex.c (tex_output::set_pen_size): Make it virtual and - protected. - (tpic_output): New class. - (tpic_output::tpic_output, tpic_output::set_pen_size, - tpic_output::command, make_tpic_output): New functions. + * src/include/lib.h: Handle HAVE_SETLOCALE. -Fri Dec 7 11:57:41 1990 James Clark (jjc at jclark) + * src/devices/grodvi/dvi.cc (main), src/devices/grolj4/lj4.cc + (main), src/devices/grops/ps.cc (main), src/preproc/grn/main.cc + (main), src/preproc/pic/main.cc (main): Call `setlocale'. - * tbl/main.c (main): Call `.ab' if \n(.g is false. Define TS/TE - if they're not already defined. - * tbl/table.c (init_output): Don't test \n(.g. - * troff/input.c (do_if_request): Delete `g' condition. Recognize - `d', `r' and `c' conditions even in compatibility mode. + * doc/groff.texinfo: Change dir category to `Typesetting'. + (Man font macros): Mention that there is no space between arguments + of .BI and friends. -Tue Dec 4 09:13:47 1990 James Clark (jjc at jclark) + * src/libs/libdriver/printer.cc, src/devices/grotty/tty.cc + (*printer::change_color, *printer::change_fill_color): Add missing + `const'. - * ps/tmac.ps (ps-bb): Protect against negative numbers in bounding - box. +2003-04-02 Werner LEMBERG -Mon Dec 3 07:18:26 1990 James Clark (jjc at jclark) + * src/devices/grohtml/html-table.cc (html_table::emit_col, + html_table::is_gap): Compute table widths after converting border + positions to avoid rounding errors. - * troff/env.h (environment::prev_line_interrupted): New member. - (environment::get_prev_line_interrupted): New function. - * troff/env.c (environment::newline): Set prev_line_interrupted. - (environment::environment(const environment *), - environment::environment(symbol)): Initialize - prev_line_interrupted. - * troff/input.c (process_input_stack): Don't give special - treatment to space and newline at the beginning of the line if the - previous line was interrupted. +2003-04-01 Werner LEMBERG -Sat Dec 1 15:48:37 1990 James Clark (jjc at jclark) + * src/devices/grohtml/html-text.cc (html_text::do_space): Handle + `space_emitted' properly. - * eqn/eqn.y: Disallow PRIME by itself. - * eqn/lex.c (token_table): Bind `opprime' instead of `prime' to - PRIME. - (def_table): Remove definition of '. Define prime to be `. +2003-03-31 Werner LEMBERG - * eqn/eqn.y: Split off part of rule `script' into a new rule - `nonsup'. + * src/devices/grohtml/html-table.cc: Fix column width calculation. + (html_table::set_linelength): Don't add 1. + (html_table::add_indent): Don't subtract 1. -Fri Nov 30 10:23:44 1990 James Clark (jjc at jclark) + * tmac/html.tmac: Set default page offset to zero. - * macros/tmac.s ({, }): New string aliases. +2003-03-30 Werner LEMBERG -Thu Nov 29 11:34:40 1990 James Clark (jjc at jclark) + Make groff emit ` ' for `\ ' and `\~' if `-Thtml' is used. - * README-0.7: New file. + * src/roff/troff/node.cc (space_char_hmotion_node::tprint, + unbreakable_space_node::tprint): New functions. + (troff_output_file): Make space_char_hmotion_mode::tprint and + unbreakable_space_node::tprint to friends. + * src/roff/troff/node.h: Updated. -Wed Nov 28 10:09:57 1990 James Clark (jjc at jclark) + * font/devhtml/R.proto: Add ` ' at position 0xA0 (as defined + in the HTML standard). - * macros/tmac.s: New file. - * man/groff_ms.man: New file. - * Makefile: Add definition of TMAC_S. Pass TMAC_S in SUBFLAGS. - * Makefile.bd: Similarily. - * man/Makefile: Add groff_ms.n to MAN7PAGES. Replace @TMAC_S@. Add - definition of TMAC_S. - * macros/Makefile: Add definition of TMAC_S. Install tmac.s. - * macros/TODO: New file. +2003-03-29 Werner LEMBERG -Sat Nov 24 20:04:54 1990 James Clark (jjc at jclark) + * src/roff/troff/env.cc (point_size): Fix emission of html tag. + Otherwise, the following code - * troff/env.c (right_justify): New function. - (init_env_requests): Bind this to request "rj". - (center_lines): Set right_justify_lines to 0. If we get a bad - integer, center 1 line. - (environment::environment(symbol), environment::environment(const - environment *)): Initialize right_justify_lines. - (environment::get_right_justify_lines): New function. - (init_env_requests): Bind this to number_register ".rj". + .di xxx + .ps 10 + a + .br + .di + x\*[xxx] - * troff/env.c (environment::choose_breakpoint): Implement - hyphenation_margin and hyphenation_space. - (environment::get_hyphenation_space, - environment::get_hyphenation_margin): New functions. - (init_env_requests): Bind these to .hys and .hym. - (hyphenation_space_request, hyphenation_margin_request): New - functions - (init_env_requests): Bind these to hys and hym. - (environment::environment(symbol), environment::environment(const - environment *)): Initialize hyphenation_margin and - hyphenation_space. - * troff/env.h: Corresponding changes to class environment. + produces `x a' instead of `xa'. This is a temporary fix, disabling + font changes in diversions for -Thtml. -Fri Nov 23 09:08:16 1990 James Clark (jjc at jclark) + * tmac/an-old.tmac (TH, SH): Use `HTML-TAG-NS' instead of + `HTML-TAG'. + (an-do-tag-html): Merge with ... + (an-do-tag): This macro. + Change code slightly to circumvent grohtml bug. + * tmac/troffrc-end: Define dummy for HTML-TAG-NS. - * troff/div.c (blank_line): Always do a break. + * src/devices/grohtml/html-table.cc (html_table::emit_col, + html_table::is_gap): Round `width' properly. - * eqn/box.c (do_text): Turn off escapes while appending text to - string. + * tmac/html.tmac: Provide some default layout parameters for + grohtml. -Thu Nov 22 10:58:59 1990 James Clark (jjc at jclark) + * font/devhtml/DESC.proto: Don't use discrete values for `sizes' + command. - * troff/input.c (while_break_request, while_continue_request): New - functions. - (init_input_requests): Bind these to "break" and "continue". - (while_depth, while_break_flag): New variables. - (while_request): Update while_depth. Break out of loop if - while_break_flag is set. +2003-03-28 Werner LEMBERG -Wed Nov 21 10:54:40 1990 James Clark (jjc at jclark) + src/devices/grops/ps.cc (ps_printer::do_import): Fix error message. - * tbl/table.c (init_span_reg): Initialize span_width_reg to \n(.H - rather than 0. +2003-03-27 Werner LEMBERG -Mon Nov 19 00:45:03 1990 James Clark (jjc at jclark) + * tmac/an-old.tmac (BT): Don't call .tl if register `ps4html' is + defined. - * Makefile: Include -DBROKEN_SPOOLER by default. Expand comment. +2003-03-20 Werner LEMBERG - * stringify: New file. - * Makefile (groff.o): Use stringify. + * src/roff/troff/env.cc (vertical_spacing): Allow zero value for + `.vs'. + * doc/groff.texinfo: Updated. - * xditview/tmac.X: Remove definition of \(rn. - * xditview/libXdvi/DviChar.c: Remove radicalex from - Adobe_symbol_map. +2003-03-19 Werner LEMBERG -Sat Nov 17 10:44:58 1990 James Clark (jjc at jclark) + * src/roff/troff/input.cc (process_input_stack) : Reset `have_input'. - * tbl/table.c (table::add_entry): Allow alphabetic text blocks. - (alphabetic_block_entry::alphabetic_block_entry, - alphabetic_block_entry::divert, alphabetic_block_entry::print): - New functions. - (block_entry::divert): Split off body into ... - (block_entry::do_divert): If the block is alphabetic, subtract 2n - from the line length; also update the span width to dl+2n, and the - alphabetic span width to dl. +2003-03-18 Werner LEMBERG - * driver/input.c (do_file): While reading argument to D command, - when expanding buffer, multiply szp by sizeof(int) rather than 2 - in the argument to memcpy. + * src/roff/groff/groff.man: Mention groff_trace man page. - * tbl/table.c (compute_span_width): Add 2n rather than 1n to the - width of alphabetic columns. +2003-03-16 Werner LEMBERG -Fri Nov 16 06:34:27 1990 James Clark (jjc at jclark) + * Makefile.in (LIBEXT): New variable to indicate the file extension + of library files. Computed heuristically from $(OBJEXT). + (MDEFINES): Add $(LIBEXT). + * Makefile.lib, Makefile.comm: Use it. - * troff/node.c (lookup_family): Supply second argument to lookup. + * src/utils/pfbtops/pfbtops.c (get_text): New function. Split + overlong lines into smaller chunks. + (get_binary): New function. + (main): Use them. + * src/utils/pfbtops/pfbtops.man: Updated. - * troff/dictionary.c (dictionary::lookup): After an unsuccesful - search, return immediately if v is 0. +2003-03-15 Colin Watson - * pic/troff.c: Define EQN_NO_EXTRA_SPACE_REG. - (troff_output::start_picture): Set this reg. - (troff_output::end_picture): Remove this reg - * eqn/box.c (box::extra_space): Don't produce `\x's if - EQN_NO_EXTRA_SPACE_REG is defined. + * src/roff/groff/groff.man: Minor syntax fix. - * eqn/eqn.y: Allow just a PRIME to be a `simple'. - * eqn/text.c (split_text): Map ' to \(fm when it's the first - character. +2003-03-14 Egil Kvaleberg -Thu Nov 15 10:35:06 1990 James Clark (jjc at jclark) + * src/devices/grops/ps.cc (ps_printer::media_set, + ps_printer::~ps_printer): Handle zero paper width and length. - * macros/tmac.e: Use font 3 instead of B in $c. Remove `bd' - requests. +2003-03-13 Werner LEMBERG - * troff/div.c (top_level_diversion::top_level_diversion): - Initialize page_number to 0. + Add options -p and -l to grodvi. -Wed Nov 14 21:41:58 1990 James Clark (jjc at jclark) + * src/devices/grodvi/dvi.cc: Include paper.h. + (landscape_flag, user_paper_length, user_paper_width): New global + variables. + (dvi_printer::begin_page): Emit `papersize' special. + Set color after initialization of `cur_h' and `cur_v'. + (main): Add options `-l' and `-p'. + * font/devdvi/Makefile.sub (DESC): Set `papersize'. + * src/devices/grodvi/grodvi.man, NEWS: Updated. - * groff/troff (environment::environment(const environment *)): - Initialize name to e->name, rather than "anonymous". + * src/devices/grops/psrm.cc (valid_input_table): Fixed. -Sat Nov 10 01:59:37 1990 James Clark (jjc at jclark) +2003-03-12 Werner LEMBERG - * xditview/libXdvi/Dvi.c (ShowDvi): If eof is encountered, reset - requested_page. Split middle part into ... - (FindPage): New function. - (SetValues): If we don't yet know the last page, and the requested - page is greater than the current page, call FindPage. - Update the font_map_string before doing this. + * src/devices/grops/grops.man: Move documentation of .PSPIC to... + * man/groff_tmac.man: This man page. + * man/groff_font.man: Declare `paperwidth' and `paperlength' as + deprecated. - * xditview/tmac.X: Add definitions of \(sq, \(ga, \(dg and \(dd. - Translate \(lh and \(rh into left and right double arrows. + * tmac/X.tmac: Don't load pspic.tmac. - * troff/node.c (class hyphen_inhibitor_node): New class. - (hyphen_inhibitor_node::hyphen_inhibitor_node, - hyphen_inhibitor_node::copy, hyphen_inhibitor_node::same, - hyphen_inhibitor_node::type, - hyphen_inhibitor_node::get_hyphenation_type): New functions. - (node::add_discretionary_hyphen): Use hyphen_inhibitor_node rather - than dbreak_node(0, 0) to represent a `\%' at the beginning of a - word. +2003-03-11 Werner LEMBERG -Fri Nov 9 16:05:38 1990 James Clark (jjc at jclark) + Make variable `pr' local to libdriver/input.cc. Based on a patch + by Bernd Warken . - * troff/node.h (dummy_node::get_hyphenation_type, - transparent_dummy_node::get_hyphenation_type): Declare them. - * troff/node.c: (dummy_node::get_hyphenation_type, - transparent_dummy_node::get_hyphenation_type): New functions. + * src/include/driver.h (pr): Removed. -Wed Nov 7 10:09:06 1990 James Clark (jjc at jclark) + * src/libs/libdriver/input.cc (pr): New global variable. + (do_file): Deallocate `pr'. + * src/libs/libdriver/printer.cc (pr): Removed. - * xditview/libXdvi/draw.c: If M_PI not defined after including - math.h, then define it. + * src/devices/grodvi/dvi.cc (main), src/devices/grohtml/post-html.cc + (main), src/devices/grolbp/lbp.cc (main), src/devices/grolj4/lj4.cc + (main), src/devices/grops/ps.cc (main), src/devices/grotty/tty.cc + (main): Don't delete `pr'. - * xditview/Makefile: Add definition of AR. Pass it to the submake - in libXdvi. - * xditview/libXdvi/Makefile: Add definitions of AR and RANLIB. +2003-03-10 Werner LEMBERG -Tue Nov 6 10:14:27 1990 James Clark (jjc at jclark) + * tmac/a4.tmac, tmac/composite.tmac: Use `.do'. + * tmac/papersize.tmac: New file. + * tmac/troffrc: Include `papersize.tmac'. + * tmac/Makefile.sub (NORMALFILES): Add `papersize.tmac'. + * tmac/an-old.tmac: Set LT to LL by default. - * troff/dictionary.h (object_dictionary::alias): Declare return - value as int. - * troff/dictionary.c (object_dictionary::alias): Return non-zero - if the old name was defined. - * troff/input.c (alias_macro): Give a warning if the old name was - not defined. - * troff/reg.c (alias_reg): Likewise. + * NEWS, MANIFEST, tmac/groff_man.man, man/groff_tmac.man, + doc/groff.texinfo: Updated. -Mon Nov 5 00:31:39 1990 James Clark (jjc at jclark) + * src/libs/libgroff/paper.cc (add_iso_paper): Fix very embarassing + bug which caused all odd iso papers to have wrong dimensions. - * troff/input.c (token::next): Delete implementation of \R. + * src/devices/grops/ps.cc (user_paper_width): New global variable. + (main) <'p'>: Set `user_paper_width' also. + (ps_printer::media_width, ps_printer::media_height): Use values + given with option `-p'. - * macros/Makefile: Strip comments from tmac.e while installing it. +2003-03-09 Werner LEMBERG - * troff/input.c: New variable `nroff_mode'. - (troff_request, nroff_request): New functions. - (init_input_requests): Bind `troff' and `nroff' to troff_request - and nroff_request. - (do_if_request): Compute results of t and n conditions from - nroff_mode. + * src/include/nonposix.h: Provide default for SET_BINARY. - * text/text.c (split_text): Fix typo in >=. + * src/devices/grodvi/dvi.cc, src/devices/grolbp/lbp.cc, + src/devices/grolj4/lj4.cc, src/devices/grops/ps.cc: Call SET_BINARY + unconditionally. - * eqn/lex.c: Add definition of `==' to def_table. + * src/utils/pfbtops/pfbtops.c: Call SET_BINARY unconditionally. + (main): Treat \r\n as \n. -Fri Nov 2 02:49:09 1990 James Clark (jjc at jclark) +2003-03-08 Werner LEMBERG - * pic/tex.c (tex_output::start_picture): Change the definitions of - \graph and \graphtemp so that they work properly with Plain TeX. + * tmac/an-old.tmac: Use register `HY' to control hyphenation. + * NEWS, tmac/groff_man.man, doc/groff.texinfo: Document it. - * pic/tex.c (tex_output::solid_arc): Ensure that the second angle - argument to `ar' is not less than the first. +2003-03-07 Werner LEMBERG - * pic/pic.y: Allow a comma between elements of the variable list - in the argument to `reset'. + Added support to access more than 256 glyphs in Type 1 fonts. - * pic/object.c (arc_object::arc_object): Fix computation of - radius. + * src/devices/grops/ps.cc (subencoding): New structure. + (style): Add `sub' field. + Updated all users. + (ps_printer): Add `subencodings' and `next_subencoding_index' fields. + Add `set_subencoding', `get_subfont' and `encode_subfont' member + functions. + Updated all users. + (ps_printer::set_char): Use `set_subencoding'. + (make_subencoding_name): New function. + (ps_printer::set_style): Handle case where `sty.sub' is not zero. + (ps_printer::~ps_printer): Emit subencoding definitions. - * eqn/main.c (main): Add exit(0). + * src/devices/grops/psrm.cc (valid_input_table): New array to + properly support EBCDIC. + (white_space): Add `\f'. + (ps_get_line): Change first argument to be of type `string &'. + Updated all callers. + This allows to get lines of arbitrary length. + Use `valid_input_table'. + Remove warning about non-conforming PS line length. This seems + not to be of great importance -- for example, dvips don't emit + a warning either. + (PS_LINE_MAX): Removed. + (matches_comment): Change first argument to be of type `string &'. -Thu Nov 1 02:03:50 1990 James Clark (jjc at jclark) + * src/devices/grops/grops.man, src/devices/grops/TODO: Updated. - * troff/div.c (begin_page): Test no_space_mode after doing the - break, but still push the page ejector cookie before doing the - break. Also set the next page number after doing the break. - - * xditview/xditview.c (NewFile): Don't set the title and icon name - if this is the first file and its name is `-'. - * groff/groff.c: Define a new device flag XT_OPTION. Set it for - the X75 and X100 devices. - (main): If a device has the XT_OPTION flag set and there's exactly - one file argument, pass the driver -xrm and -title options to set - the icon name and window title to the name of the file. + * src/utils/afmtodit/afmtodit.pl (%unicode_decomposed, + %AGL_to_unicode, %default_ligatures): New hash tables. + Read all map entries. + Add unencoded characters. + Check for default ligatures if there are no `L' entries. + Print all kern entries. + Print all characters in charset. + * src/utils/afmtodit/afmtodit.man: Updated. - * troff/env.c (environment_switch): If there was an argument but - it wasn't a valid number or name, then pop an environment but - don't give an error message on underflow. + * font/devps/*: Regerated all fonts. - * troff/number.c (start_number): Correct spelling in error message. + * tmac/latin[129].tmac, tmac/cp1047.tmac: Don't test for existence + of characters, just use `.trin'. Otherwise the mapping depends + on the font encoding. + * tmac/ps.tmac: Add `fi' and `fl'. + Improve `Fi' and `Fl'. + * tmac/X.tmac, tmac/lbp.tmac, tmac/tty.tmac: Improve `Fi' and `Fl'. + * tmac/Xps.tmac: Fix `em'. - * troff/input.c (token::delimiter): Don't print an error message - if err is false. + * NEWS: Updated. - * xditview/libXdvi/parse.c (ParseInput): In case 'D', only call - ParseDrawFunction if dw->display_enable is true. +2003-03-04 Werner LEMBERG -Wed Oct 31 05:49:50 1990 James Clark (jjc at jclark) + * src/roff/troff/input.cc (charinfo_to_node_list): Reset + `have_input'. - * pic/pic.y: Parse text positioning like normal attributes, so as - to allow `"text" at 0,0 ljust'. Don't allow `center' as a - positioning attribute. +2003-03-03 Werner LEMBERG -Mon Oct 29 22:50:38 1990 James Clark (jjc at jclark) + * Makefile.sub (DISTCLEANFILES): Add gxditview._man. - * tbl/main.c (process_data): When in state START while reading a - text block, don't change to state MIDDLE if c is a newline. + * font/devps/generate/textmap: Remove entry `similarequal'. + * font/devps/symbolmap: Updated. -Sun Oct 28 21:59:56 1990 James Clark (jjc at jclark) +2003-03-02 Werner LEMBERG - * dvi/dvi.c (dvi_printer::begin_page): Rename `i' variable to `j' - so as to avoid shadowing parameter. + * src/libs/libgroff/font.cc (font::load): Fix error message for + bad character type. -Wed Oct 24 18:35:39 1990 James Clark (jjc at jclark) + * src/devices/grops/grops.man: Improve documentation of the -b + flag. - * tbl/table.c (trim_space): Deleted. - (table::add_entry): Don't call trim_space. + * tmac/tty.tmac: Load latin1.tmac for all TTY devices except + `ascii' and `cp1047'. -Mon Oct 22 03:48:39 1990 James Clark (jjc at jclark) +2003-03-01 Werner LEMBERG - * VERSION: Change version to 0.6. + Document composite glyphs and the `composite' request. - * troff/number.c (parse_expr): Make == work. + * man/groff.man, man/groff_diff.man, doc/groff.texinfo: Do it. -Sat Oct 20 11:28:17 1990 James Clark (jjc at jclark) +2003-02-28 Werner LEMBERG - * man/grog.man: New file. - * man/Makefile: Add grog.n to MAN1PAGES. - * etc/grog.sh: New file. - * etc/Makefile: Install grog.sh as grog. + * font/devdvi/generate/ec.map: Add some more Unicode entities. + * font/devdvi/*EC: Updated. -Fri Oct 19 11:17:15 1990 James Clark (jjc at jclark) + * tmac/composite.tmac, tmac/latin2.tmac, tmac/latin9.tmac: New files. + * tmac/latin1 (latin1-tr): Undo any previous mapping. + * tmac/troffrc: Load `composite.tmac'. + * tmac/Makefile.sub (NORMALFILES): Updated. - * troff/input.c (token::next): Implement \E. + * doc/groff.texinfo (Input Encodings): New section. + * NEWS: Updated. -Thu Oct 18 11:56:24 1990 James Clark (jjc at jclark) +2003-02-27 Werner LEMBERG - * xditview/tmac.X: Change font translations to match tmac.ps. + * doc/texinfo.tex: New version 2003-02-11.06. - * troff/input.c (non_empty_name_warning): Don't give a warning if - `\{' terminates the name. + * tmac/doc-common (Dt): Don't emit warning for unknown section. + * tmac/groff_mdoc.man: Fix description of `Dt'. -Tue Oct 16 10:04:23 1990 James Clark (jjc at jclark) +2003-02-26 Egil Kvaleberg - * ps/devps/symbol.diff: New file. - * ps/devps/FontMakefile: Mention symbol.diff. + * font/devps/prologue.ps: Fix for included Postscript that does + a setpagedevice -- which is now safely ignored. -Sun Oct 14 11:46:46 1990 James Clark (jjc at jclark) + * NEWS: Updated. - * troff/node.c (font_position): Use get_long_name to read the - external_name. + * src/devices/grops/ps.cc: Now sets the page size in the generated + document. This is done in two ways: Via a %%-comment for gv and + the like, and via a PageSize and setpagedevice for programs that + understands Postscript proper, like ps2pdf. - * troff/env.c (environment_switch): If we get a number that's < 0 - or >= NENVIRONMENTS, treat it like a name. - Change NENVIRONMENTS to 10. + * src/devices/grops/ps.h: New broken-flag to avoid page size + definition, if required. - * troff/groff.h: Remove definition of FONTS_MAX. - * troff/node.h (class font_family): Make map a pointer instead of - an array. Add a map_size member. Make it a class. Make nm const - and public. Make invalidate_fontno a friend. - * troff/node.c: Define font_table_size. Make font_info a pointer - rather than an array. - (class troff_output_file): Allocate font_position dynamically. Add - nfont_positions member. - (troff_output_file::set_font): Grow font_position if necessary. - (troff_output_file::~troff_output_file): Delete font_position. - (troff_output_file::troff_output_file): Allocate font_position. - (grow_font_table): New function. - (troff_output_file::really_begin_page, - troff_output_file:really_copy_page): Use nfont_positions rather - than FONTS_MAX. - (mount_font_no_translate, mount_style): Call grow_font_table if - necessary. - (font_family::font_family): Allocate map. - (font_family::make_definite): Grow map if necessary. Use - font_table_size instead of FONTS_MAX. - (font_family::~font_family): New function. - (invalidate_fontno): Use font_family::map_size. - (get_fontno, env_space_width, env_half_narrow_space_width, - env_narrow_space_width, symbol_fotno, is_good_fontno, - get_bold_fontno, make_glyph_node): Use font_table_size rather than - FONTS_MAX. - (next_available_font_position): Never return 0. + * src/devices/grops/grops.man: New broken-flag 16 mentioned. -Fri Oct 12 10:17:52 1990 James Clark (jjc at jclark) + * doc/Makefile.in: Added -nosetpage flag (via @pnmtops_nosetpage@). + Not really necessary due to the fix in prologue.ps, but cleaner: + Such information does not belong in an .eps file. - * ps/tmac.ps: Add font translations for compatibility with dpost. + * doc/Makefile.sub: See doc/Makefile.in. -Thu Oct 11 12:09:03 1990 James Clark (jjc at jclark) +2003-02-26 Ralph Corderoy - * eqn/pile.c: Rename default_baseline_sep to baseline_sep. - Move BASELINE_SEP_FORMAT and COLUMN_WIDTH_FORMAT into pbox.h. - Move definitions baseline_sep, shift_down, column_sep, - matrix_side_sep into... - * eqn/box.c: Add them to param_table. - * eqn/pbox.h: Add declarations to pbox.h. + * aclocal.m4 (GROFF_PNMTOPS_NOSETPAGE): Use P2 format for testing + instead of P1 since the latter is broken in some versions of netpbm. + * configure: Updated. - * troff/input.c (set_string): Cast value to unsigned char *. +2003-02-26 Larry Kollar - * troff/token.h (process_input_stack): Declare it static before - declaring it a friend. + Make man pages more customizable. -Wed Oct 10 09:59:13 1990 James Clark (jjc at jclark) + * tmac/an-old.tmac (FT): New register holding footer distance from + bottom. + (HF): New string holding the default heading font. + (TH): Handle registers `IN' and `SN' set on the command line. + Use `FT'. + (PT, BT): New strings to customize header and footer lines. + (an-header, an-footer): Use them. + (SH, SS): Use `HF'. + * tmac/groff_man.man: Document changes. - * dvi/devdvi/texex.map: Fix positions of extensible brace middle - and bottom. - * dvi/devdvi/EX: Regenerate. + * doc/groff.texinfo: Document man changes. + Document Ultrix extensions of man. - * troff/input.c (init_charset_table): Make ", ', ), ], *, \(dg - transparent. +2003-02-26 Werner LEMBERG -Tue Oct 9 08:34:02 1990 James Clark (jjc at jclark) + * src/roff/troff/input.cc (do_width, do_if_request): Reset + `have_input' after changing back to old environment. - * eqn/lex.c: In defaults_table, make definition of `dot' call - `dot_def'. Don't explicitly make it roman. Similarily for other - accents. + * src/devices/grolbp/lbp.cc (lbp_printer::set_line_thickness): Move + function up to be defined before first call. This is necessary to + avoid a compilation problem with Sun's WorkShop 6 C++ compiler. - * pic/lex.c (for_input::for_input): Add by_is_multiplicative - argument. - (for_input::get, for_input::peek): Use this. - (do_for): Add by_is_multiplicative argument. - * pic/pic.y: Change optional_by clause to allow '*' after `by'. - Change semantic value of optional_by to be a double plus a flag - saying whethet the by clause is multiplicative. - - * eqn/lex.c (get_delimited_text): Remember location of start of - definition. Improve error handling when EOF is encountered. - - * lib/font.h: Rename handle_x_command to - handle_unknown_font_command. - * lib/font.c (font::load): Call handle_unknown_font_command for - any unknown command in the font description file. Don't call - handle_x_command. Include the name of the command in the argv. - Improve message for unknown command after kernpairs or charset - command. - * ps/ps.c (ps_font::handle_x_command): Rename to - handle_unknown_font_command. Remove message about `x download' - command. Give error message for wrong number of arguments. - * ps/devps/afmtodit: Generate `encoding' instead of `x encoding'. - * dvi/dvi.c (dvi_font::handle_x_command): Rename to - handle_unknown_font_command. Give an error message for wrong - number of arguments. Rename design_size to designsize. - * dvi/tfmtodit.c (main): Generate `checksum' instead of `x - checksum', `designsize' instead of `design_size'. - -Mon Oct 8 00:38:55 1990 James Clark (jjc at jclark) - - * eqn/*.[chy]: Change underaccent to uaccent. - - * eqn/eqn.y: Add rule for underaccent. Declare UNDERACCENT token; - give it the same precedence as ACCENT. - * eqn/other.c (make_underaccent_box): New function. - * eqn/box.h: Declare it. - * eqn/lex.c: Add UNDERACCENT to token_table. Add utilde to - def_table. - -Sun Oct 7 11:25:16 1990 James Clark (jjc at jclark) - - * pic/pic.y (reset_all): New function. Called in rule for RESET. - (parse_init): Call reset_all. - (define_variable): When defining scale reset only those - pre-defined variables that are scaled. - (defaults_table): Add `scale' as non-scaled value. - - * pic/pic.y: Redo parsing of text adjustments: parse adjustments - together with the text; allow any number of positioning words; - allow center as a positioning word. - - * pic/object.c (output::compute_scale): Get picture maximum height - and width from variables called maxpswid and maxpsht. - * pic/pic.y: Add maxpswid and maxpsht to defaults_table. - -Sat Oct 6 10:16:56 1990 James Clark (jjc at jclark) - - * pic/object.c (object_spec::make_text): Multiply textht by number - of text items. - - * pic/pic.y: Allow `sprintf("string", expr,...)' wherever text can - occur. - (do_sprintf): New function. - (pic.gperf): Add sprintf token. - (text, sprintf): New rules. - - * pic/pic.y: `rand()' with no arguments returns a random number - in the range [0,1). - - * pic/pic.y: Allow a bare expression to be an attribute: change - precedences to support this. Change optional_ordinal rule to - optional_ordinal_last to avoid reduce/reduce conflict. - * pic/object.c (object_spec::object_spec): Initialize direction. - - * pic/pic.y: Implement ^ operator meaning exponentiation. - - * troff/node.h: Add default argument to mount_font. - * troff/node.c (font_position): Read an optional third argument - giving the external_name. - (mount_font): Add optional argument giving the external_name. - (mount_font_not_translate): Have additional argument giving - external name. Use this name to load the font. Pass both names - to font_info::font_info. - (font_info::font_info): Have additional argument giving - external_name. - (class tfont): New member external_name. - (font_info::get_tfont): Use external name to construct tfont_spec. - -Fri Oct 5 04:03:13 1990 James Clark (jjc at jclark) - - * eqn/lex.c (init_table): Add argument giving device. Define - name of device to be "1". - (do_ifdef): Counts as true if the argument has been defined with - `define'. - * eqn/main.c (main): Call init_table with device argument. Make - device local to main. - * eqn/eqn.h: Change declaration of init_table. Remove declaration - of device. - - * pic/lex.c (get_delimited): Allow text to be delimited by - matching {}s. Don't recognize ending delimiter within a string. - - * troff/input.c (get_delim_name): New function. - (token::next): Implement \C. - - * lib/font.c (font::load): Grok ---. Add an alias for each - character based on its code. - (font::get_code_width): Deleted. - * lib/font.h (class font): Declare font::number_to_index(). - Remove declaration of font::get_code_width. - * lib/nametoindex.c (font::name_to_index): Add 512 rather than 256 - to indices of named characters. - (font::number_to_index): New function. - * troff/input.c (font::number_to_index): New function. - (get_charinfo_by_number, charinfo::get_number, - charinfo::set_number): New functions. - (token::next): Turn \N into a TOKEN_NUMBERED_CHAR. - (token::process, token::description, token::get_char, - token::add_to_node_list, token::operator==): Handle - TOKEN_NUMBERED_CHAR. - * troff/charinfo.h: Declare get_charinfo_by_number, - charinfo::get_number, charinfo::set_number. Add NUMBERED flag to - charinfo class. - (charinfo::numbered): New function. - * troff/token.h: Add TOKEN_NUMBERED_CHAR. - * troff/env.h (class environment): Remove declaration of ... - * troff/env.c (environment::make_numbered_char_node): Deleted. - * troff/node.c (make_numbered_node): Deleted. - (class numbered_glyph_node): Remove. - (troff_output_file::put_char_width, troff_output_file::put_char): - Handle numbered chars. - (troff_output_file::numbered_char): Removed. - (tfont::get_code_width): Removed. - (make_glyph_node): Don't search special fonts for numbered - characters. - * troff/node.h: Remove declaration of make_numbered_node. - * driver/input.c (do_file): Handle N command. - * driver/printer.h: Add declaration of ... - * driver/printer.c (printer::set_numbered_char): New function. - * dvi/tfmtodit.c (main): Generate unnamed entries. - * ps/devps/afmtodit: Likewise. - * xditview/xtotroff.c (MapFont): Likewise. - * xditview/libXdvi/parse.c (ParseInput): Grok N command. - - * tbl/main.c (process_format): If multiple widths are specified - for a column but all the widths are the same, don't give an error - message. - - * tbl/table.c (table::do_row): If the current row is all lines and - the stuff doesn't contains a line, mark the top of the row after - printing stuff before the row. If the current row is not all - lines and the stuff doesn't contain a line, don't unnecessarily - mark the top of the row before printing the stuff. - -Mon Oct 1 11:42:00 1990 James Clark (jjc at jclark) - - * troff/groff.h: Remove MAX_PATH. - * troff/input.c (open_file): Dynamically allocate space for the - path. - (open_mac_file, process_macro_file): Corresponding changes. - -Sun Sep 23 18:56:26 1990 James Clark (jjc at jclark) - - * troff/node.h (class output_file): Make copy_file pure. Add - vspace method ifdef COLUMN. Add is_printing method. - * troff/node.c: Add class printing_reg. Add class - real_output_file. Derive other output_file classes from - real_output_file; in these classes rename begin_page to - really_begin_page, print_line to really_print_line, copy_file to - really_copy_file, transparent_char to really_transparent_char. - Move output_file::flush to real_output_file. Add printing member - to class output_file. - * troff/div.h: Remove printing member from top_level_diversion. - Add vspace member function to class diversion ifdef COLUMN. Add - some declarations ifdef COLUMN. - * troff/div.c (top_level_diversion::copy_file, - top_level_diversion::transparent_output, - top_level_diversion::output): Don't test printing member before - output. - * troff/input.c: Handle initial variable_space_request ifdef - COLUMN. - * troff/Makefile: Add column.c but comment it out. Add -DCOLUMN - but comment it out. - -Sat Sep 22 11:32:22 1990 James Clark (jjc at jclark) - - * troff/div.c (diversion::need): Make any space forced. If we - sprung a trap, set truncated_space to minus the distance to the - trap and set needed_space to the amount that was needed. - (top_level_diversion::space): A forced space turns no_space_mode - off. - (class constant_vunits_reg): New class. - (init_div_requests): Implement number registers .trunc and .ne - using constant_vunits_reg. - (class truncated_space_reg): Deleted. - - * troff/div.h: Don't have a no_space_mode member in diversion. - Instead have it in top_level_diversion. - * troff/div.c (diversion::diversion): Don't initialize - no_space_mode. - (top_level_diversion::top_level_diversion): Initialize - no_space_mode. - (no_space, restore_spacing): Do nothing if curdiv != topdiv. - (macro_diversion::output): Don't clear no_space_mode. - - * troff/input.c (diverted_space_node::reread): Don't call - environment::do_break. In fill mode, act like a blank line. - (diverted_copy_file_node::reread): Don't call - environment::do_break. - - * troff/div.c (blank_line): New function. - * troff/div.h: Declare it. - * troff/input.c (process_input_stack): Call it. - - * troff/div.c (truncated_space_reg::get_string): New function. - (init_div_requests): Bind to .trunc. - (space_request, top_level_diversion::space, - top_level_diversion::output, macro_diversion::space, - macro_diversion::output): Update truncated_space. - (macro_diversion::output): Redo calculations when trap sprung. - (macro_diversion::output, macro_diversion::space): No need for - trap_flag. - - * troff/div.c (top_level_diversion::output): Set nl_reg_contents - after truncating post line spacing. - -Fri Sep 21 11:27:25 1990 James Clark (jjc at jclark) - - * ps/devps/prologue (MF, SF): Make them work even if setfont is - defined as a procedure rather than as an operator. + * src/utils/afmtodit/afmtodit.pl: Make script search for files in + the default font directory also. Based on a patch from James + J. Ramsey . + * src/utils/afmtodit/Makefile.sub (afmtodit): Handle @FONTDIR@. + * src/utils/afmtodit/afmtodit.man: Document it. -Thu Sep 20 12:55:05 1990 James Clark (jjc at jclark) + * NEWS: Updated. - * troff/div.c (macro_diversion::space): Ignore no_space_mode. + * tmac/groff_man.man, doc/groff.texinfo: Many minor fixes. -Wed Sep 19 10:54:37 1990 James Clark (jjc at jclark) +2003-02-25 Gaius Mulley - * troff/div.c (top_level_diversion::output): Merge - output_file::print_line and output_file::end_of_line member - functions. - * troff/div.h (class output_file): - * troff/node.c (troff_output_file::print_line, - troff_output_file::end_of_line, output_file::end_of_line, - ascii_output_file::print_line, suppress_output_file::print_line): - Corresponding changes. - -Tue Sep 18 11:31:47 1990 James Clark (jjc at jclark) - - * troff/input.c (token::next): Don't give a warning for `\.'. - - * troff/env.c (environment::get_center_lines): New function. - (init_env_requests): Bind number register .ce to it. - * troff/env.h: Declare it. - * tbl/table.c (table::init_output): Define reset macro to restore - .ce. If center option not given, store .ce in SAVED_CENTER_REG. - Then do .ce 0. - (table::print): If center option not given, then imply center - option if SAVED_CENTER_REG > 0. - -Mon Sep 17 09:19:19 1990 James Clark (jjc at jclark) - - * ps/devps/Makefile: Remove T from FONTS. Remove TSymbol.ps and - Troff.ps from DOWNLOAD. - - * troff/Makefile: Change comment in DEFINES to avoid confusing - System V make. - - * ps/ps.c (ps_printer::do_exec): Allow newlines within PostScript - code. Don't try to catch errors with stopped. - (check_line_lengths): New function. - * ps/devps/prologue (EXEC): Deleted. - (EBEGIN, EEND): New procedures. - -Sun Sep 16 14:51:15 1990 James Clark (jjc at jclark) - - * troff/input.c: Include request.h before node.h. - * troff/node.c: Likewise. - * troff/env.c: Likewise. - * troff/div.c: Likewise. - * troff/node.h (class special_node): Store argument as a macro - rather than a char *. - * troff/node.c (special_node::special_node, special_node::copy): - Grok this. - (special_node::~special_node): Deleted. - (special_node::tprint): Deleted. - (special_node::tprint_start, special_node::tprint_end, - special_node::tprint_char): New functions. - (troff_output_file::special): Deleted. - (troff_output_file::start_special, troff_output_file::end_special, - troff_output_file::special_char): New functions. - * troff/input.c (special_node::tprint): New function. - (do_special): Use macro not char *. - (do_transparent_macro): Deleted. - (token::next): Don't call do_transparent_macro. - - * troff/input.c (token::next): Add 'Y' case. - (do_transparent_macro): New function. - * troff/node.c (troff_output_file::special): Handle newlines with - argument using new continuation convention. - * driver/input.c (get_string): Cope with continuation convention. - (do_file): Don't call skip_line after calling get_string(1). - * ps/ps.c (ps_printer::special, ps_printer::do_import, - ps_printer::do_def, ps_printer::do_exec): Cope with newlines in - arg. - * xditview/libXdvi/parse.c (ParseInput): Ignore lines starting - with +. - -Sat Sep 15 19:00:10 1990 James Clark (jjc at jclark) - - * troff/input.c (asciify): By default, illegal input characters - should return empty string. - - * troff/input.c (copy_file): Handle first page transition like title. - (token::next, process_input_stack): Grok COPY_FILE_REQUEST. - - * troff/input.c (token::next): Improve error message for EOF after - escape character. - (input_char_description): New function. - (get_char_for_escape_name): Use input_char_description. - (token::next): Warn about unrecognized escape sequences. - (warning_table): Add WARN_ESCAPE. - * troff/groff.h: Declare WARN_ESCAPE. Change WARN_TOTAL - accordingly. - - * troff/token.h: Remove declaration of process_input_stack. - - * troff/input.c: Remove declaration of init_hyphen_requests. - * troff/request.h: Correct spelling in declaration of same. - - * troff/input.c (token::next): Check whether escape_char is 0. - -Fri Sep 14 12:09:25 1990 James Clark (jjc at jclark) - - * groff.c (main, usage, help): Implement -P and -L options. - * groff.sh: Likewise. - - * troff/input.c (token::next): Use some gotos to avoid code - duplication. - - * troff/input.c (get_long_name, get_name, read_long_ecsape_name): - Avoid calling symbol::symbol if name empty. - -Thu Sep 13 06:21:45 1990 James Clark (jjc at jclark) - - * troff/input.c (init_input_requests): Make \n(.x return the major - version number and \n(.y return the minor version number. - * troff/Makefile: Construct file majorminor.c defining - major_version and minor_version automatically from ../VERSION. - - * troff/node.c (class glyph_node): Make operator new and operator - delete public. - (class ligature_node): Similarily. + * aclocal.m4 (GROFF_HTML_PROGRAMS): Add test for pnmtops. + (GROFF_PNMTOPS_NOSETPAGE): New macro. + * configure.ac: Use it. + * configure: Regenerated. + * Makefile.in: Updated. - * troff/input.c (operator==(const macro &, const macro &)): New - function. - (non_interpreted_node::same): Use this. - (string_iterator::string_iterator): Make macro& argument const. + * tmac/Makefile.sub (NORMALFILES): Remove www.tmac. + (CLEANADD): Add www.tmac-sed. + (pnmtops_nosetpage): Define default. + (install_data): Handle www.tmac-sed and substitute + @PNMTOPS_NOSETPAGE@. + (stamp-sed): Add www.tmac. + * tmac/www.tmac: Rewritten, based on a patch by Bernd Warken. + It now breaks URLs at suitable places. + (www:substring_ok): New register set by... + (www:@test_substring): New macro. + (www:error): New alias to www-error. + (www:lenstr, www:splitstr, www:url_breaks, www:url_breaks_splitted): + New macros. + (URL): Use www:url_breaks. + (PIMG, MPIMG): Use @PNMTOPS_NOSETPAGE@. + (CDS, CDE): New macros. - * troff/input.c (input_iterator::get): New function. Don't make - asciify_macro or class non_interpreted_node friends of class - input_iterator. - (non_interpreted_node::interpret): Use input_iterator::get. - (asciify_macro): Likewise. +2003-02-25 Werner LEMBERG - * troff/input.c (~token_node, ~string_iterator, ~arg_list, - ~non_interpreted_node): Deleted. - * troff/node.c: (~suppress_output_file, ~ascii_output_file): - Deleted. + * src/devices/grops/ps.cc (ps_printer::define_encoding): Avoid + buffer overflow. - * troff/symbol.h: Make all symbol member functions const. +2003-02-24 Werner LEMBERG - * lib/strtol.c: New file. - * lib/Makefile: Add strtol.c. - * Makefile: Define STRTOL as strtol.o to include strtol in - libgroff.a. + Contrary to the PCL5 Developer's Guide, the ascenders in TFM files + can be negative also. -Wed Sep 12 10:00:49 1990 James Clark (jjc at jclark) + * src/utils/hpftodit/hpftodit.cc (char_info): `ascent' must be + `int16'. + (read_char_table): Avoid negative ascenders. + (output_charset): Add cast. + * font/devlj4/*: Regenerated. - * pic/troff.c (troff_output::simple_circle): Divide by scale. + Replace unnamed glyphs for DVI fonts with `uXXXX' glyph names where + possible. -Tue Sep 11 14:17:16 1990 James Clark (jjc at jclark) + * font/devdvi/generate/{tc,texttt,ec,texmi,texsy,textex}.map: Do it. + * font/devdvi/generate/textex.map: Map glyph 23 to `u21C6' instead + of `<>'. + * font/devdvi/*: Regenerated. - * troff/input.c (do_special): Use input_level. + Map `la' and `ra' to U+27E8 and U+27E9. These two characters have + normal width, while the previously used characters (U+2329 and + U+232A) are classified as wide due to canonical equivalence with the + CJK punctuation characters U+3008 and U+3009. - * troff/token.h (TOKEN_BACKSPACE): New token. - (token::backspace): New function. - * troff/input.c (token::description, token::next, token::process): - Grok TOKEN_BACKSPACE. - (do_special): Turn TOKEN_BACKSPACE back into \b. + * font/devutf8/R.proto: Updated. + * src/roff/troff/uniglyph.cc, src/roff/troff/glyphuni.cc: Ditto. - * troff/token.h (token::leader): New function. - * troff/input.c (do_special): Turn TOKEN_LEADER back into \001. + * man/groff_char.man: Simplify handling of table traps by + introducing `start block' and `end block' macros. + (Ns, Ne, 2s, 2e, Ds, De): New macros. + (DL): Make it work with Unix troff also. + Fix code values of `la' and `ra'. - * troff/input.c (do_special): Turn TOKEN_TAB back into \t. + * tmac/dvi.tmac: Define `<>' for CW and CWI. - * troff/input.c (do_special): Use token::description in error - message. +2003-02-23 Gaius Mulley -Mon Sep 10 11:06:27 1990 James Clark (jjc at jclark) + * src/devices/grohtml/post-html.cc (element_list::~element_list): + New destructor, fixing a major memory leak. - * troff/input.c (decode_args): Combine quoted and - quote_input_level variables. Make it a for (;;) loop. +2003-02-22 Werner LEMBERG - * troff/input.c (get_char_for_escape_name): Check for \001 and \b. + * font/devhtml/R.proto, font/devutf8/R.proto: Flip `*f' and `+f' + to be in conformance with Unicode 3.0 and newer. - * troff/input.c (read_long_escape_name): The test for whether to - expand buffer was off by 1. - (read_string): Similarily. + * font/devlj4/generate/text.map: Add `Eu'. + * font/devlj4/generate/special.map: Flip `*e' and `+e'. + * font/devlj4/S: Regenerated. -Fri Sep 7 11:45:50 1990 James Clark (jjc at jclark) + * man/groff_char.man: Completely rewritten. - * troff/input.c: Use `const int' rather than `static const int'. + * doc/groff.texinfo: Fix description of request and macro arguments. - * troff/div.h (diversion::copy_file): Declare as pure virtual. - (macro_diversion::copy_file): New function. - * troff/node.h: New class diverted_copy_file_node. - * troff/node.c: Implement it. - * troff/input.c (copy_file): Use diversion::copy_file. Handle - first page transition by pushing a diverted_copy_file_node. - * troff/input.c (token::next, process_input_stack): Don't handle - COPY_FILE_REQUEST. +2003-02-20 Gaius Mulley -Thu Sep 6 13:29:10 1990 James Clark (jjc at jclark) + Valgrind fixes. - * ps/ps.c (flush_sbuf): Remember to add sbuf_kern when checking - whether space widths need adjusting. + * src/devices/grohtml/html-table.cc (html_table::~html_table): + Deallocate `columns' list. + * src/devices/grohtml/post-html.cc (char_block::~char_block): + New destructor. + (text_glob::text_glob_html, text_glob::text_glob_special, + text_glob::text_glob_line, text_glob::text_glob_auto_image, + text_glob::text_glob_tag): Avoid memory leaks. + (text_glob::remember_table): Free memory before reassigning. - * troff/charinfo.h: Generalize translated_to_space to - special_translation so as to allow translation to \&. - * troff/input.c (translate): Allow translation to \&. - (charinfo::*): Corresponding changes. - * troff/node.c (make_node, node::add_char): Corresponding changes. - * troff/node.h (dummy_node::dummy_node): Allow optional first - argument. +2003-02-19 Werner LEMBERG - * lib/lib.h: Make codes 0200 to 0237 illegal input characters. - * troff/token.h: Remove TOKEN_TITLE. Remove token::title. Add - TOKEN_REQUEST. - * troff/input.c (token::next): Turn a TITLE_REQUEST into a - TOKEN_REQUEST with an argument of TITLE_REQUEST. - (token::process): Grok that. - * troff/input.c (copy_file): Handle first page transition like - title by pushing a COPY_FILE_REQUEST cookie. - (token::next, process_input_stack): Grok that. - * troff/node.h (output_file::copy_file): Add x and y arguments. - Make it non-pure. - * troff/div.c (top_level_diversion::copy_file): Supply them. - * troff/node.c (troff_output_file::copy_file): Add x and y - arguments; moveto specified position. Invalidate font_position - array after copying file. - (output_file::copy_file): New function. - (suppressed_output_file::copy_file, ascii_output::copy_file): - Removed. - * troff/input.c (transparent_file): New function. - (init_input_requests): Bind to "trf". - (token::next): Handle TRANSPARENT_FILE_REQUEST cookie. - (process_input_stack): Likewise. + Add glyph `+e', greek lunate epsilon symbol, and `-h' (with the + alias `hbar'), the Planck constant over two pi. - * troff/Makefile: Add ../lib/lib.h to GROFF_H. + * font/devdvi/generate/texmi.map: Use `*e' for position 15 and + `+e' for position 34. + * font/devdvi/generate/texsy.map: Replace `DI' and `HE' with + `u2662' and `u2661'. + * font/devdvi/{MI,S}: Regenerated. + * font/devhtml/R.proto, font/devutf8/R.proto: Add `+e', `-h', `hbar'. + * font/devlbp/*: Add `hbar' alias. + * font/devlj4/generate/special.map: Ditto. + * font/devlj4/S: Regenerated. + * font/devps/generate/symbolchars: Add `+e'. + * font/devps/generate/textmap: Fix PS name for `-h'. + Add `hbar' alias. + * font/devps/symbolmap: Regenerated. - * troff/node.c (init_node_requests): New number registers .kern - pointing to global_kern_mode, and .lg pointing to - global_ligature_mode. + * src/devices/grops/ps.cc (transform_fill): Removed since unused. - * troff/node.c (ligature): Don't change it if we get a bad - integer. + * src/roff/troff/glyphuni.cc (glyph_to_unicode_list): Add `+e', + `-h', `hbar'. + * src/roff/troff/uniglyph.cc (unicode_to_glyph_list): Add `+e', + `-h'. - * troff/input.c (do_define_string): Don't strip tabs. + * tmac/X.tmac, tmac/ps.tmac: Provide definitions for `-h' and + `hbar'. + * tmac/tty-char.tmac: Add `+e'. - * troff/input.c (asciify_macro): Make the string_iterator auto. +2003-02-17 Werner LEMBERG - * troff/node.c (init_font_requests): Rename to... - (init_node_requests): - * troff/node.h: Change declaration. - * troff/input.c (main): Change call. + Another round trying to really fix problems with `have_input'. - * troff/input.c (node::reread, diverted_space_node::reread): New - methods. - (process_input_stack): Call reread rather than - get_diverted_space_node. - * troff/node.c (node::get_diverted_space_node, - diverted_space_node::get_diverted_space_node): Removed. - * troff/node.h: Declare reread methods instead of - get_diverted_space_node methods. Make `n' member private. - * troff/input.c: (token::diverted_space): Removed. - * troff/token.h: Removed declaration. - + * src/roff/troff/input.cc (input_stack::get): Handle `have_input'. + (token::next) <'\n'>, <\'\n'>: Don't handle `have_input'. -Tue Sep 4 00:48:04 1990 James Clark (jjc at jclark) + * src/devices/grotty/tty.cc (tty_printer::put_color): Fix color + handling if both foreground and background colors are default. - * eqn/script.c (script_box::compute_metrics): Don't let - SUP_RAISE_FORMAT become negative. + * doc/groff.texinfo (Debugging): Document .lf differences to + AT&T troff. - * tbl/table.c (table::do_row): Entries that don't end in the - this row shouldn't make the row non-blank. - - * tbl/table.c (table::make_columns_equal): Only set the width of - columns which are marked as equal. - - * tbl/main.c (process_data): Before issuing excess data error, - if last character was a newline unget it; then get it again after - the error. Also include the contents of the entry in the message. +2003-02-16 Werner LEMBERG - * groff.c: New file. - * Makefile: Build groff from groff.c. Make it possible to use - either groff.sh or groff.c as groff. - * Makefile.bd: Similarily. + * src/devices/grotty/tty.cc (tty_printer::make_rgb_string): Avoid + null-bytes in created string. -Mon Sep 3 09:39:49 1990 James Clark (jjc at jclark) + * src/roff/troff/input.cc (lookup_color, interpolate_macro, + alias_macro, lookup_request): Improve warning messages. - * groff.sh: Don't delay expansion of $@ in assignment to files. - Remove occurrences of \". + * src/roff/troff/node.cc (suppress_node::tprint): Use `strsave', + not `strdup'. + Free `last_image_filename'. -Sun Sep 2 09:56:59 1990 James Clark (jjc at jclark) + * src/preproc/html/pre-html.cc (char_block::char_block): Initialize + `buffer'. + (imageList::createPage, imageList::createImage): Use `free', not + `a_delete'. + (imageItem::~imageItem): Free `imageName'. + (addRegDef): Use `strsave', not `strdup'. + (get_resolution): Free `pathp'. - * all Makefiles: Simplify and rearrange. +2003-02-15 Werner LEMBERG - * Makefile: Handle fmod like malloc. - * lib/Makefile: Similarily. - * lib/fmod.c: Remove #ifdef NEED_FMOD. + * src/devices/grotty/tty.cc (tty_printer::tty_printer): Fix pointer + to `dummy'. - * Makefile: Rename OPTIMISE to OPTIMIZE. +2003-02-14 Werner LEMBERG - * groff.sh: Remove assignment to PATH. - * Makefile: Remove SHPATH variable. - * Makefile.bd: Similarily. + Add memory management for colors to deallocate unnamed colors + properly. - * groff.sh: Add -V option to print the pipeline instead of - executing it. + * src/include/color.h (color): New members `free_list' and `next'. + New member functions `new' and `delete'. + Add destructor. + * src/libs/libgroff/color.cc: Implement it. -Fri Aug 31 00:56:46 1990 James Clark (jjc at jclark) + * src/libs/libgroff/font.cc (font::add_kern): Use integer cast + for array size of new operator. - * lib/font.c: Split off file searching into ... - * lib/fontfile.c: New file. + * src/libs/libdriver/input.cc (IntArray::operator[]): Remove + redundant comparison. - * lib/strerror.c (strerror): Use `Error %d' for unknown errors. + * src/roff/troff/input.cc (word_space_node::reread, + hmotion_node::reread): Avoid warning about unused parameter. + (reset_output_registers): Remove redundant parameter. + (define_color): Undo change 2003-02-12. -Thu Aug 30 13:13:55 1990 James Clark (jjc at jclark) + * src/roff/troff/reg.h: Updated. - * tbl/table.c (table::do_hspan): Delete assertion that e != 0. - Also change misleading comment. - (table::do_vspan): Change similarily misleading comment. - * tbl/main.c (process_data): A format row with an explicit `s' - uses up a data line, even if all the other columns are `_' or `='. + * src/roff/troff/node.cc (troff_output_file::really_print_line, + output_file::put_filename, real_output_file::really_put_filename, + ascii_output_file::really_print_line, + break_char_node::get_hyphen_list): Avoid warning about unused + parameter. + (suppress_node::tprint): Updated. - * troff/input.c (token::description): Fix description of - TOKEN_DUMMY and TOKEN_EMPTY. + * configure.ac: Check declaration for rand() and srand(). + * configure: Regenerated. -Wed Aug 29 04:12:08 1990 James Clark (jjc at jclark) + * src/preproc/pic/pic.h: Declare fmod(), rand(), and srand() + conditionally. + * src/preproc/pic/pic.y: Remove declaration of fmod(), rand(), + and srand(). - * groff.sh: Fix description of -Z in help message. + * src/preproc/eqn/delim.cc (delim_table): Add missing initializers + to avoid compiler warnings. -Tue Aug 28 07:28:33 1990 James Clark (jjc at jclark) + * src/preproc/grn/hgraph.cc (HGPrintElt): Second parameter is + unused. - * pic/object.c (object_spec::make_object): Allow negative and zero - line thicknesses. - * pic/pic.y: Give linethick default value of -1.0. - * pic/troff.c (troff_output::troff_output): Initialize - last_line_thickness to BAD_THICKNESS. - (troff_output::finish_picture): Set thickness to BAD_THICKNESS. - (troff_output::line_thickness): Canonicalize negative thicknesses - to RELATIVE_THICKNESS. - * pic/tex.c (tex_output::set_pen_size): Silently map negative line - thicknesses to DEFAULT_PEN_SIZE. Canonicalize negative pen sizes - to -1.0. - (tex_output::start_picture): Set pen_size to -2.0. + * src/devices/grops/ps.cc (ps_printer::set_char): Last parameter + is unused. + * src/devices/grops/psrm.cc (skip_possible_newline): Remove first + (unused) parameter. + Updated all callers. - * ps/ps.c (ps_printer::set_line_thickness): If line_thickness is - 0, then use 0 linewidth. - (ps_printer::ps_printer): Initialize line_thickness to -1. + * src/devices/grotty/tty.cc (tty_printer::set_char): Last parameter + is unused. + * src/devices/grodvi/dvi.cc (dvi_printer::set_char): Ditto. + * src/devices/grolj4/lj4.cc (lj4_printer::set_char): Ditto. - * pic/troff.c (troff_output::simple_ellipse): Divide by scale. + * src/devices/grohtml/post-html.cc (html_printer::emit_line): + Parameter is unused. + (html_printer::add_table_end): Define parameter conditionally. + * src/devices/grohtml/output.cc (simple_output::special): Parameter + is unused. - * ps/devps/symbolchars: Remove `or'. - * ps/tmac.ps: Implement \(or with .char. + * src/devices/grolbp/lbp.cc: Define _GNU_SOURCE conditionally. + (lbp_printer::set_char): Last parameter is unused. - * ps/devps/symbolchars: Move most characters into textmap. - * ps/devps/textmap: Add names for troff bracket characters. Remove - ul, ru, br, bv. + * src/utils/indxbib/indxbib.cc (main): Remove redundant comparison. - * ps/devps/TSymbol.ps: Removed. - * ps/devps/FontMakefile: Make S from Symbol not TSymbol. - * ps/tmac.ps: Do with .char what TSymbol did. - * ps/devps/download: Remove TSymbol. +2003-02-13 Werner LEMBERG - * ps/devps/T: Removed. - * ps/devps/Troff.ps: Removed. - * ps/devps/Troff.afm: Removed. - * ps/tmac.ps: Implement \(ru, \(ul, and \(br with .char. - * ps/devps/download: Remove Troff. - * ps/devps/FontMakefile: Remove T target. - * ps/devps/DESC-A4: Remove T from font list. - * ps/devps/DESC-letter: Likewise. + New commands \D'Fr ...', \D'Fc ...', etc. for orthogonality. + Make \D'f ...' move horizontally again for backwards compatibility. + Replace it with \D'Fg ...' where appropriate to avoid dependency + on horizontal resolution. - * troff/input.c (macro_to_node): Rename to ... - (charinfo_to_node): Don't pass mac argument. Temporarily remove the - character's definition while processing it. - * troff/node.c (node::add_char, make_node): Change calls to - macro_to_node accordingly. + * src/roff/troff/input.cc (do_get_long_name): New function. + (get_long_name): Call it. - * troff/input.c (token::next): Translate \_ to \(ul. + (read_draw_node): Handle `\D'Fx ...' by calling ... + (read_color_draw_node): New function. - * tty/devascii/R.proto: Add `|'. - * tty/devlatin1/R.proto: Likewise. + (read_rgb, read_cmy, read_cmyk, read_gray): New optional argument + `end'. + Pass it to `do_get_long_name' which is used instead of + `get_long_name'. -Mon Aug 27 11:25:41 1990 James Clark (jjc at jclark) + * src/libs/libdriver/input.cc (color_from_Df_command): Remove + unnecessary value guard. + (parse_D_command) <'f'>: Add horizontal shift. - * man: Put the version number in all the man pages. + * src/preproc/grn/hgraph.cc (HGPrintElt) : Use \D'Fg ...'. + * src/preproc/pic/troff.cc (troff_output::set_fill): Ditto. + (FILL_MAX): Removed. -Sun Aug 26 11:40:05 1990 James Clark (jjc at jclark) + * NEWS, man/groff_diff.man, man/groff.man, doc/groff.texinfo: + Updated. - * Makefile.bd: New file. - * README.bd: New file. +2003-02-12 Werner LEMBERG - * VERSION: New file. - * lib/version.c: Removed. - * lib/Makefile: Create version.c from ../VERSION. Remove version.c - in clean target. + * src/roff/troff/input.cc (do_name_test, do_expr_test, + do_zero_width): Push `\n' if closing delimiter is missing. - * troff/input.c (main): Get hyphen_file from GROFF_HYPHEN - environment variable. + (token::next) , <'\n'>, <\'\n'>: Reset `have_input'. + <'F'>: Make \F non-transparent at the beginning of line. + (process_input_stack) : Don't handle + `have_input'. - * all Makefiles: Split install target into install.bin for - binaries, and install.nobin for everything else. - * Makefile: Add bindist target. + (define_color): Free color in case of reassignment. - * man/afmtodit.man: New file. - * man/Makefile: Add afmtodit.n to MAN1PAGES. - * ps/devps/Makefile: Add textmap to DEVICEFILES. Install afmtodit - in BINDIR. - * ps/Makefile: Pass BINDIR to make install in devps. + * doc/groff.texinfo (@Defesc, @DefescList, @DefescItem, + @DefescListEnd): Use @Var, not @var. + Fix all calls. - * ps/ps.c (ps_printer::set_char): Do nothing if the character is - the space character. + * src/preproc/grn/hgraph.cc (HGPrintElt): Fix typo. - * ps/devps/FontMakefile: Rename symbol.afm to tsymbol.afm. + * src/preproc/pic/object.cc (object_spec::~object_spec): Free + `shaded' and `outlined' arrays. + (object_spec::object_spec): Initialize `shaded' and `outlined'. + (graphic_object::set_fill_color, graphic_object::set_outline_color): + Use strsave. + (closed_object::set_fill_color): Ditto. + * src/preproc/pic/troff.cc (troff_output::set_color): Use strsave + instead of strdup. + (troff_output::reset_color): Use a_delete instead of free. + * src/preproc/pic/main.cc (do_file): Free `out' in case of error. -Sat Aug 25 15:39:03 1990 James Clark (jjc at jclark) +2003-02-11 Werner LEMBERG - * ps/ps.c: Redo font downloading. - * ps/devps/download: New file. - * ps/devps/Makefile: Add download to DEVICEFILES. - * ps/devps/afmtodit: Remove -d option. - * ps/devps/FontMakefile: Don't use -d option with afmtodit. - * ps/devps/symbosl.ps: Add %%DocumentFonts comment. - * ps/devps/zapfdr.ps: Likewise. - * ps/devps/TSymbol.ps: Likewise. + * doc/groff.texinfo: Improve documentation of `ad'. + Document that \D'f...' is dependent on the horizontal resolution. + * man/groff_diff.man: Improve documentation of \D'f...'. -Fri Aug 24 20:10:30 1990 James Clark (jjc at jclark) + * src/preproc/grn/hgraph.cc (HGPrintElt) : Don't emit + compensating \h'...' for \D'f ...' since the latter no longer moves + current position. + * src/preproc/pic/troff.cc (troff_output::set_fill): Ditto. - * groff.sh: Initialize dev to ${GROFF_TYPESETTER:-@DEVICE@}. +2003-02-10 Werner LEMBERG -Thu Aug 23 10:03:47 1990 James Clark (jjc at yquem) + Improve error messages for `x F' (and `F') commands. - * ps/ps.c (ps_output::include_file): If BROKEN_SPOOLER is defined, - then strip the first line if it starts with %. - * Makefile: Add a comment about this. + * src/include/error.h: Add declaration for + `current_source_filename'. + * src/libs/libgroff/filename.cc: Add `current_source_filename'. + * src/libs/libgroff/error.cc (do_error_with_file_and_line): Add + parameter for source file string. + Updated all callers. - * man/tfmtodit.man: New file. - * man/Makefile: Add tfmtodit.n to MAN1PAGES. - * dvi/Makefile: Install tfmtodit in BINDIR. + * src/libs/libdriver/input.cc: Add `current_source_filename'. + (remember_source_filename): New function. + (parse_x_command <'F'>, do_file <'F'>): Use it. - * dvi/tfmtodit.c (usage): Mention -v option. +2003-02-09 Werner LEMBERG -Wed Aug 22 09:56:36 1990 James Clark (jjc at yquem) + Make grotty not emit warnings about unknown colors more than + necessary. - * troff/node.c (troff_output_file::end_of_line): Call do_motion. - * troff/node.c (troff_output_file::transparent_char): Don't call - flush_tbuf. + * src/devices/grotty/tty.cc: Include `ptable.h'. + (TTY_MAX_COLORS): Removed. + (DEFAULT_COLOR_IDX): Defined to -1. + (glyph): Change `back_color_idx' and `fore_color_idx' to `char'. + (tty_printer): Change `curr_back_idx' and `curr_fore_idx' to `char'. + Change `tty_colors' to be a ptable. + First arg of `put_color' is now `char'. + New functions `make_rgb_string' and `tty_color'. + (tty_printer::tty_printer): Use `tty_color'. + (tty_printer::color_to_idx): Return value is now `char'. + Use `tty_color'. - * eqn: Add check_tabs method to most box classes. - * eqn/box.c (box::top_level): Call check_tabs. + * src/include/color.h (color): Add `print_color' member function. + * src/libs/libgroff/color.cc (color::print_color): Implement it. - * eqn/script.c (script_box::output): Use \Z. - * eqn/limit.c (limit_box::output): Use \Z. +2003-02-08 Werner LEMBERG - * eqn/box.c (box::top_level): Use itoa. + Valgrind fixes. -Tue Aug 21 09:29:28 1990 James Clark (jjc at yquem) + * src/devices/grops/ps.cc (ps_printer::define_encoding): Close + encoding file. - * dvi/tmac.dvi: Add font translations for CR, C, TT. - * dvi/devdvi/Makefile: Don't make links to CW. + * src/include/ptable.h (PTABLE::~PTABLE, PTABLE::define): Always + assume that value has been allocated with `new[]', thus use + `a_delete' for deallocation. - * ps/tmac.ps: Add font translations for C, CW, CO, CX, CD, H, HO, - HX, HD. - * xditview/tmac.X: Likewise. + * src/libs/libdriver/input.cc (get_integer_arg, + get_possibly_int_args, parse_x_command, do_file): Use `a_delete' + where appropriate. - * troff/node.c: Add font translation feature. - (get_font_translation): New function. - (symbol_fontno): Translate the font name. - (mount_font_no_translate): Rename to mount_font to this. - (mount_font): New function. - (font_family::make_definite): Call mount_font_no_translate instead - of mount_font. - (mount_style): Translate the font name. - (font_translate): New function. - (init_font_requests): Bind "ftr" to font_translate. + * src/libs/libgroff/new.cc (delete) [!COOKIE_BUG]: Define. + * src/libs/libgroff/nametoindex.cc + (character_indexer::named_char_index): Use `new [1]'. - * ps/devps/prologue (SN): New procedure that rounds a position to - the nearest (pixel + (.25,.25)). - (DL): Use SN to round endpoints. + * src/preproc/eqn/lex.cc (init_table, do_definition): Use `new + [1]'. + * src/preproc/eqn/text.cc (set_special_char_type): Ditto. + (split_text): Use `a_delete'. - * lib/version.c: Changed version to 0.5. + * src/preproc/pic/pic.y (define_label, define_variable): Use `new + [1]'. -Sat Aug 18 04:43:21 1990 James Clark (jjc at yquem) + * src/roff/troff/env.cc (environment::choose_breakpoint): Avoid + harmless memory leak. + (hyphen_trie::read_patterns_file): Initialize `buf'. + * src/roff/troff/node.cc (troff_output_file::troff_output_file): + Initialize `current_fill_color'and `current_glyph_color'. + * src/roff/troff/glyphuni.cc + (glyph_to_unicode_init::glyph_to_unicode_init): Use `new [1]'. + * src/roff/troff/uniuni.cc + (unicode_decompose_init::unicode_decompose_init): Ditto. + * src/roff/troff/uniglyph.cc + (unicode_to_glyph_init::unicode_to_glyph_init): Ditto. - * Makefile: Move definition of PAGE to the very beginning, so that - people are less likely to miss it. +2003-01-26 Werner LEMBERG -Fri Aug 17 02:15:11 1990 James Clark (jjc at yquem) + * src/utils/indxbib/indxbib.cc (main) [__EMX__]: Check with + `access' before calling `unlink'. + (do_file): Handle __EMX__. - * man/Makefile: Don't need to sed out @UPCASE_PROG_PREFIX@. + * src/include/nonposix.h: Handle __EMX__. - * troff/env.c (environment::choose_breakpoint): Make `can't find - breakpoint' error a warning of type WARN_BREAK. Change message to - `can't break line'. - * troff/groff.h: Declare WARN_BREAK with code 4; change WARN_INPUT to - code 040000. - * troff/input.c: Add WARN_BREAK to warning_table. Include - WARN_BREAK in DEFAULT_WARNING_MASK. + * Makefile.in (SEP): New variable; set to @PATH_SEPARATOR@. + (fontpath,tmacpath): Use it. + (MDEFINES): Add it. + Sorted alphabetically. - * tty/tmac.tty: Add definition of \(+-. + * src/preproc/eqn/neqn.sh, src/roff/nroff/nroff.sh: Use + @SEP@. + * src/preproc/eqn/Makefile.sub, src/roff/nroff/Makefile.sub: Handle + @SEP@. - * groff.sh: Remove `--' option to set command. +2003-01-27 Werner LEMBERG - * dvi/devdvi/texsy.map: Remove duplicate md entry. + * src/libs/libgroff/strcasecmp.c, src/libs/libgroff/strncasecmp.c: + New files, copied from gnulib. + * src/libs/libgroff/Makefile.sub (CSRCS): Add them. + * configure.ac: Updated. + * configure: Regenerated. - * ps/devps/eqnchar: Better definition of cdot using md. - * dvi/devdvi/eqnchar: Likewise. - * xditview/devX100/eqnchar: Likewise. - * xditview/devX75/eqnchar: Likewise. - * eqn/lex.c: Add definition of cdot. + * src/include/config.hin: Regenerated. + * src/include/lib.h [!HAVE_STRCASECMP]: Declare `strcasecmp'. + Don't define `strcasecmp' as `strcmp'. + [!HAVE_STRNCASECMP]: Declare `strncasecmp'. + Dont define `strncasecmp' as `strncmp'. -Thu Aug 16 09:33:57 1990 James Clark (jjc at yquem) + * src/roff/groff/pipeline.c [!HAVE_STRCASECMP, !HAVE_STRNCASECMP]: + Removed. - * troff/input.c (get_optional_char): New function. - * troff/input.c (set_page_character): Use get_optional_char(), - rather than has_arg() and tok.get_char(1). - * troff/env.c (tab_character, leader_character, hyphen_char, - field_characters): Likewise. - (margin_character): Likewise. Also always delete the - margin_character_node. +2003-01-26 Werner LEMBERG - * troff/input.c (token::get_char): Use token::description. + * src/utils/indxbib/indxbib.cc (main) [__EMX__]: Fix typo: + s/unline/unlink/. - * troff/input.c (has_arg): Don't skip over tab and \}. - * troff/number.c (start_number): Give a warning if the number - starts with \} (WARN_RIGHT_BRACE) or tab (WARN_TAB). +2003-01-25 Werner LEMBERG -Wed Aug 15 10:04:37 1990 James Clark (jjc at yquem) + * doc/groff.texinfo (Ligatures and Kerning): Mention limitations. - * troff/input.c (empty_name_warning, non_empty_name_warning): New - functions. - (get_name, get_long_name): Use these. Rename `warn' argument to - `required'. +2003-01-24 Werner LEMBERG - * troff/node.c (get_fontno): Test that the symbol is not null. + Add US-english hyphenation exceptions (converted from Barbara + Beeton's hyphenation exception log reports which appear irregularly + in TUGBoat). - * troff/input.c (token::description): New function. - * troff/number.c (parse_term): Use token::description in `numeric - expression expected' message. - * troff/groff.h: Add WARN_MISSING. - * troff/number.c (start_number): New function. - * troff/number.c (get_vunits, get_hunits, get_number, get_integer, - get_incr_number): Use start_number(). - * troff/input.c (DEFAULT_WARNING_MASK): Enable WARN_NUMBER by - default. - * troff/input.c (get_name, get_long_name): Use WARN_MISSING. - * troff/reg.c (alter_format): Use WARN_MISSING. Also use - token::descripion. - * troff/input.c (token::get_char): Use WARN_MISSING. - * troff/input.c (token::delimiter): Use token::description. - * troff/env.c (environment_switch): Back out Aug 3 change. - * troff/input.c (has_arg): Skip over \}s and tabs but give a - warning. - * troff/token.h (token::tab): New function. - * troff/node.c (get_fontno): Use tok.skip() rather than has_arg(). - * troff/reg.c (alter_format): Likewise. - * troff/node.c (bold_font): Use has_arg() rather than tok.skip(). + * tmac/hyphen.us: Updated to latest version. + * tmac/README: Updated. + * tmac/hyphenex.us, tmac/hyphenex.sh: New files. + * tmac/troffrc: Load `hyphenex.us'. + * tmac/Makefile.sub (NORMALFILES): Add `hyphenex.us'. + * doc/groff.texinfo: Updated. -Tue Aug 14 10:11:21 1990 James Clark (jjc at yquem) +2003-01-23 Werner LEMBERG - * troff (most files): Redo warnings. Divide warnings into various - categories; warning() has an additional first argument indicating - the category it falls into. - * troff/input.c (main): -w now takes an argument. New option -W. - (enable_warning, disable_warning): New functions. + Improve hyphenation slightly. This is a first step in redesigning + the hyphenation algorithm to make it more flexible (e.g. allowing + kerns and ligatures between the hyphenation character and the + following character -- while not used normally in English, other + languages like German would benefit). - * ps/devps/afmtodit: Add -a option to lie about the italic angle. - * ps/devps/FontMakefile: Pretend TI has an angle of 7. + * src/roff/troff/env.cc (environment::hyphenate_line): Use + assertion instead of if-clause. + Let `get_hyphen_list' return the number of involved characters in + the hyphenation pattern instead of computing it directly (which + often yields too small values). + * src/roff/troff/node.h (*::get_hyphen_list): Add second parameter. + * src/roff/troff/node.cc (*::get_hyphen_list): Handle new second + parameter. -Mon Aug 13 10:11:16 1990 James Clark (jjc at yquem) +2003-01-22 Werner LEMBERG - * ps/devps/eqnchar: Better definitions of dotdot, vec, dyad, inf. - * xditview/devX100/eqnchar: Likewise. Remove definition of dot. - * xditview/devX75/eqnchar: Likewise. - * dvi/devdvi/eqnchar: Better definitions of vec, dyad, dotdot. + Fixing a bug which caused groff to hang if the hyphenation exception + dictionary tried to grow. - * eqn/other.c: When bar or over applies to a single character - don't produce an overline_box or an underline_box. Instead produce - an accent_box or an underaccent_box, with the accent a line - whose width is accent_width. New classes underaccent_box, - overline_char_box and underline_char_box. - * eqn/box.h: Move overline_box, underline_box, accent_box class - declarations into eqn/other.c. Add declarations of - make_underline_box, make_overline_box, make_accent_box. - * eqn/eqn.y: Call make_overline_box, make_underline_box - make_accent_box instead of constructors. - * eqn/pbox.h, eqn/box.c: Add accent_width parameter. + * src/roff/troff/env.cc (hyphen_trie::insert_hyphenation, + hyphen_trie::read_patterns_file, do_hyphenation_patterns_file): Use + pointer to dictionary. - * eqn/other.c: Add accent_box::~accent_box. - * eqn/box.h: Declare it. +2003-01-20 Werner LEMBERG - * groff.sh: With -Tps, use eqn -D. + * src/utils/afmtodit/afmtodit.pl: Add switch `-m' to suppress + negative left italic correction. + * src/utils/afmtodit/afmtodit.man: Document it. - * eqn/other.c (overline_box::output): Use \Z. If draw_flag use \D - rather than \l. - (underline_box::output): Similarily. - (accent_box::output): Use \Z. + * font/devps/generate/Makefile (RFLAG): Add `-m'. + * font/devps/{AB,AR,BMB,BMR,CB,CR,EURO,HB,HR,HNB,HNR,NB,NR,PB,PR, + S,TB,TR,ZD,ZDR}: Regenerated with afmtodit options `-i 0 -m'. - * xditview/tmac.X: Add definitions of ~ and ^ (so that they are a - bit smaller.) + * NEWS: Updated. -Sun Aug 12 09:41:15 1990 James Clark (jjc at yquem) +2003-01-16 Werner LEMBERG - * troff/div.c (top_level_diversion::transparent_output(unsigned - char)): Use asciify. - * troff/input.c (asciify): Don't make it static. - * troff/token.h (asciify): Declare it. - - * troff/input.c (get_name, get_long_name, token::get_char, - token::delimiter): Add an extra default argument which says - whether a warning should be printed. - * troff: Pass a non-zero argument to one of these rather than - printing a warning directly. + * NEWS: Updated. -Sat Aug 11 09:02:21 1990 James Clark (jjc at yquem) +2003-01-16 Jörgen Grahn - * troff: Consistently use symbol::is_null. + * src/preproc/refer/refer.man: Mention REFER environment variable. - * troff/dictionary.h: Move some inline functions into - dictionary.c. +2003-01-05 Werner LEMBERG - * troff/request.h: Move inline functions into input.c. - (request_or_macro::invoke): Make it pure. + Similar to \[is], the square root glyph (\[sr]) and the square root + extension glyph (\[radicalex]) are now text symbols. The new + mathematical versions are called \[sqrt] and \[sqrtex], + respectively. - * troff/input.c, troff/reg.h: New class `constant_int_reg'. - * troff/input.c (init_input_requests): Use class constant_int_reg. - (class compatible_reg): Deleted. - * troff/div.c (init_div_requests): Use class constant_int_reg. - (class last_post_line_extra_space_reg): Deleted. + * font/devX*/S: Regenerated. + * font/devdvi/generate/texex.map: Rename `sr[0123]' to `sqrt[0123]'. + * font/devdvi/generate/texsy.map: Rename `sr' to `sqrt'. + * font/devdvi/EX, font/devdvi/S: Regenerated. + * font/devhtml/R.proto, font/devutf8/R.proto: Add `sqrt'. + * font/devlj4/generate/special.map: Add `sqrt'. + * font/devlj4/S: Regenerated. + * font/devps/generate/textmap: Add `sqrt'. + * font/devps/S, font/devps/symbolmap: Regenerated. - * troff/env.c (tab_character): Don't change the tab character if - we get an invalid argument. - (hyphen_char): Similarily. + * src/preproc/eqn/sqrt.cc (SQRT_CHAR, RADICAL_EXTENSION_CHAR, + SQRT_CHAIN, BAR_CHAIN): Use `sqrt*' and `sqrtex*'. + * src/roff/troff/input.cc (init_charset_table): Make `sqrtex' + overlap horizontally. - * troff/reg.c (alter_format): Check that nm is not null. + * tmac/X.tmac, tmac/ps.tmac, tmac/lj4.tmac: Add `sqrtex'. + * tmac/dvi.tmac: Add `sr', and `sqrtex'. + Fix `radicalex'. - * Makefile, groff.sh: Make it possible to customize the commands - used for printing PostScript and dvi files. Also make it possible - to customize the path used by groff.sh. + * doc/groff.texinfo, man/groff_diff.man: Document that `radicalex' + and `sqrtex' are overlapping glyphs. - * eqn/eqn.y: Make `left' right associative. +2003-01-04 Werner LEMBERG -Fri Aug 10 18:20:39 1990 James Clark (jjc at yquem) + * font/devdvi/generate/texsy.map: Add `is'. + * font/devps/symbolmap: Regenerated. + * font/devdvi/*TC, MI, S: Regenerated. - * pic/pic.h: Added definition of M_SQRT2 for those systems that - don't have it. + * tmac/dvi.tmac: Remove `is'. - * pic/pic.h: Removed definition of INT_MAX. +2003-01-03 Werner LEMBERG - * troff/node.c (italic_corrected_node::vertical_extent): Omit - `return'. + `is' is now a text symbol (only relevant for dvi). The math variant + can be accessed with `integral'. - * troff/input.c (token::next): Handle \R like \n. + * font/devX*/S: Regenerated. + * font/devdvi/generate/texex.map: Remove `is'. + * font/devdvi/EX: Updated. + * font/devhtml/R.proto, font/devutf8/R.proto: Add `integral'. + * font/devlj4/generate/special.map: Ditto. + * font/devlj4/S: Regenerated. + * font/devps/generate/textmap: Add `integral'. + * font/devps/S: Regenerated. -Tue Aug 7 09:46:33 1990 James Clark (jjc at yquem) + * tmac/dvi.tmac: Define `is'. - * ps/tmac.pc (PSPIC): Simplify. + * src/roff/troff/glyphuni.cc (glyph_to_unicode_list): Add `integral'. - * troff/env.c (tab_stops::to_string): - * pic/pic.y (object_type_name): - * pic/troff.c (simple_output::line): - * pic/tex.c (tex_output::spline): - * pic/object.c (object_spec::make_object): - * tbl/main.c (process_data): Add cases to switch statements to - avoid cfront warnings. (Some of these are spurious, since the - switch already has a default case.) + * src/preproc/tbl/main.cc (process_format): Fix error message. - * ps/tmac.ps (PSPIC): Reformatted. Prefix all local names with - `ps-'. Don't test systat; instead check number of arguments to - ps-bb. +2003-01-02 Werner LEMBERG -Mon Aug 6 00:13:07 1990 James Clark (jjc at yquem) + * font/devhtml/R.proto, font/devutf8/R.proto: Add `ne' and `nc'. + * font/devps/textmap: Fix entries for `ne' and `nc'. + * font/devps/symbolmap: Regenerated. - * macros/tmac.e: Do not decrease the page offset by 0.5i. + * src/roff/troff/glyphuni.cc (glyph_to_unicode_list), + src/roff/troff/uniglyph.cc (unicode_to_glyph_list): Add `18', + `38', `58', `78', `-+', `|=', `nc', `ne'. - * ps/ps.c (ps_printer::ps_printer): Use mktemp instead of tempnam. - Unlink the file as soon as we have opened it, so that we don't - have to bother with signal handlers. - (handler): Deleted. - (fatal_error_exit): Deleted. - (main): Don't call signal. + * tmac/dvi.tmac: Add `nm', `ne', `nc'. + Use `schar' for `aq'. + * tmac/ps.tmac, tmac/X.tmac: Add `nc' and `ne'. + * tmac/ec.tmac: Add `SC' to special fonts for `CW' and `CWI'. + * tmac/tty.tmac: Add `ne'. - * dvi/tfmtodit.c: Add -k option so that kerns with the skewchar - can be ignored. - * dvi/devdvi/Makefile: Use the -k option with S and MI. + * src/roff/troff/node.cc (make_glyph_node): Test with `get_macro' + for fallback glyphs. - * pic/pic.y: If there is a label, or an nth construction before - the first `.' in the argument to `with', ignore it and generate a - warning. - * pic/lex.c (lex_warning): New function. +2002-12-29 Werner LEMBERG - * tbl/table.c (table::init_output): In section keep and release - macro, use 0 indent when diverting and the correct indent when - rereading. + Add glyph `|='. - * troff/input.c (interpolate_number_format): Do not interpolate - anything if the number register is not defined. + * font/devX*/*: Regenerated. + * font/devdvi/generate/ec.map: Remove `eq'. + * font/devdvi/generate/texsy.map: Make `~=' the same as `~~'. + Assign `|=' to position 39. + * font/devdvi/*EC, S: Regenerated. + * font/devhtml/R.proto, font/devutf8/R.proto: Add `|='. + * font/devlj4/generate/special.map: Make `~=' the same as `~~'. + Assign `|=' to position 549. + * font/devps/generate/textmap, font/devps/enerate/symbolmap: Remove + `equalmath'. + Add `uni2243' for `|='. - * tbl/main.c (process_data): Don't add entry when col >= ncolumns. + * tmac/ec.tmac: Add `eq'. + * tmac/dvi.tmac: Add `=~'. + * tmac/tty-char.tmac, tmac/ps.tmac, tmac/X.tmac, tmac/lbp.tmac: Add + `|='. -Sat Aug 4 08:12:05 1990 James Clark (jjc at yquem) +2002-12-21 Werner LEMBERG - * ps/devps/prologue (PICTURE): Set components of graphics state to - their default values. + * font/devdvi/generate/tc.map: Remove `**'. + * font/devdvi/*TC: Regenerated. + * font/devhtml/R.proto, font/devutf8/R.proto: Add `18', `38', `58', + `78', `<<', `>>'. + * font/devutf8/NOTES: Updated. - * ps/devps/text.enc: Add trademark - * ps/devps/textmap: Add names for club, spade, heart, diamond, - carriagereturn, suchthat. Use Upsilon1 rather than Upsilon. - * ps/devps/symbolchars: Add names for summation and product. + * src/roff/troff/charinfo.h (charinfo): Add `setx_macro' function. + Don't give default parameter to `set_macro'. + * src/roff/troff/input.cc (do_define_character): Use `setx_macro' + instead of `set_macro'. + (charinfo::setx_macro): Implement it. + (charinfo::set_macro): Don't change `mode'. - * dvi/devdvi/texsy.map: Add names for club, spade, heart, diamond, - suchthat. Add pp. Add upper-case letters. + * tmac/tty.tmac: Add `18', `38', `58', `78', `<<', `>>'. + * tmac/ps.tmac, tmac/X.tmac: Add `<<', `>>'. + * tmac/dvi.tmac: Define `!=' with `.schar'. - * xditview/libXdvi/DviChar.c: Add names for club, spade, heart, - diamond, carriagereturn, suchthat. Use Upsilon1 rather than - Upsilon. +2002-12-20 Werner LEMBERG - * dvi/devdvi/texsy.map: Rename lA (left angle bracket) to la, and - rA (right angle bracket) to ra. Introduce names for double-headed - arrows and double-barred arrows: <>, va, lA, rA, hA, uA, dA, vA. - * ps/devps/textmap: Likewise for ps device. - * xditview/libXdvi/DviChar.c: Likewise for X100 and X75 devices. - * tty/devascii/R.proto: Rename lA to la and rA to ra. - * tty/devascii/R.proto: Likewise. - * tty/tmac.tty: Provide definitions for \(<>, \(lA, \(rA, \(hA, - \(uA, \(dA. - * eqn/delim.c: In delim_table, rename \(lA to \(la and \(rA to \(ra. + * font/devX*/S: Regenerated. + * font/devdvi/generate/ec.map: Remove `pl'. + * font/devdvi/generate/tc.map: Remove `mi', `14', `12', `34'. + * font/devdvi/*{TC,EC}: Regenerated. + * font/devhtml/R.proto: Add `-+'. + Remove double entries for `rk', `lk', `lt', `rt', `rb', `lb'. + * font/devlbp/*: Remove `or'. + * font/devlj4/generate/special.map: Remove `or'. + * font/devlj4/S: Regenerated. + * font/devps/generate/textmap: Add `fiveeighths', `oneeighth', + `seveneighths', `threeeighths'. + Remove `plusmath'. + Replace `minusplus' with `uni2213'. + * font/devps/symbolmap: Regenerated. + * font/devutf8/R.proto: Replace `shc' with unnamed glyph. + Add `-+'. - * xditview/tmac.X: Add definitions for \(fi \(fl \(ff \(Fi \(Fl. + * src/roff/troff/charinfo.h (charinfo): Add `is_normal' inline + function. + * src/roff/troff/node.cc (troff_output_file::put_char_width): + Call glyph_color and fill_color even if tcommand_flag isn't set. + (make_node, node::add_char): Check not ci->is_fallback but + ci->is_normal. - * eqn/lex.c: Added definitions of `approx', `grad' and `del' to - def_table. + * tmac/lj4.tmac, tmac/lbp.tmac: Define `or'. + * tmac/ec.tmac: Add .rchar entry for `f/'. + Don't remove `12', `14', `34'. + Define `pl' to be always roman. + * tmac/ps.tmac (ps-frac, ps-frac-mono): New macros. + Define `18', `38', `58', `78'. + * tmac/tty.tmac: Add `-+'. + * tmac/dvi.tmac: Define `f/'. + (dvi-frac): Use `f/'. + * tmac/X.tmac (X-frac, X-frac-mono): New macros. + Define `18', `38', `58', `78'. -Fri Aug 3 09:59:27 1990 James Clark (jjc at yquem) +2002-12-15 Colin Watson - * troff/div.c (when_request): Use symbol::is_null rather than - has_arg to determine whether we have an argument. - (change_trap): Remove the trap if we get an invalid number. Give - an error if we don't get at least the macro name. - (diversion_trap): Remove trap if we get an invalid name or number. + * contrib/pic2graph/pic2graph.sh: Add missing `;;'. - * troff/env.c (environment_switch): Pop if we get an invalid - symbol or numeric expression. +2002-12-10 Werner LEMBERG - * troff/input.c (do_define_macro): If EOF is encoutered while - defining the macro, do tok.next() before returning. + Add glyph `tno', a textual variant of `no'. - * troff/token.h (has_arg): Move definition from here, to ... - * troff/input.c (has_arg): ... here + * font/devX*/*: Regenerated. + * font/{devcp1047,devlatin1,devutf8,devhtml}/R.proto: Add `tno'. + * font/devdvi/generate/{tc.map: Replace `no' with `tno'. + * font/devdvi/generated/{texsy,textex}.map: Add `tno'. + * font/devdvi/*: Regenerated. + * font/devlbp/*: Add `tno'. + * font/devlj4/generate/tex.map: Replace `no' with `tno'. + * font/devlj4/*: Regenerated. + * font/devps/generate/textmap: Replace `no' with `tno'. + * font/devps/generate/symbolchars: Add `no'. + * font/devps/*: Regenerated. - * troff/env.c (space_size): Do nothing if we get an invalid argument. - * troff/input.c (shift): Likewise. + * src/roff/troff/glyphuni.cc (glyph_to_unicode_list): Add `tno'. - * pic/lex.c (get_token_after_dot): Accept `.center' as a synonym - for `.c'. + * tmac/cp1047.tmac, tmac/latin1.tmac: Replace `no' with `tno'. + * tmac/tty-char.tmac: Add entry for `tno' and `3d'. - * pic/troff.c (troff_output::start_picture): Comment out calls to - `..'. + * NEWS: Updated. - * eqn/main.c (do_file): Subtract 1 from current_lineno if - interpret_lf_args succeeds. + * tmac/dvi.tmac: Replace most `\\' with `\E'. + Add definition for `sd'. + * tmac/X.tmac, tmac/ps.tmac: Replace most `\\' with `\E'. - * eqn/main.c (do_file): Don't recognize delimiter if preceded by - \\. This avoids problems with \$N. + * tmac/eqnrc : Use `integral' instead of `is' glyph. - * groff.sh: Pass -C to preprocessors. +2002-12-08 Werner LEMBERG - * lib/lf.c (interpret_lf_args): Be more flexible. + * tmac/an-old.tmac (TH): Use integer value for `IN' if in nroff + mode to avoid rounding errors. + (an-do-tag, an-do-tag-html, RS, RE): Remove redundant `.br'. - * tbl/main.c (main): Add -C option. - (table_input::get): Do not recognize TE if followed by character - other than a space or newline unless -C option given. - (process_input_file): Likewise for lf, TS. - (process_data): Likewise for lf in text blocks. + * src/roff/groff/groff.man, src/roff/nroff/nroff.man, + src/roff/troff/troff.man: Improve documentation of -T. - * eqn/main.c (main): Add -C option. - (do_file): Don't recognize EQ, EN or lf if followed by character - other than space or newline unless -C option given. - * eqn/lex.c (file_input::read_line): Similarily. - * eqn/eqn.h: Declare compatible_flag. +2002-12-07 Jeff Conrad - * etc/soelim.c (main): Add -C option. - (interpret_lf_args): Use version in libgroff. - (do_file): + * src/roff/groff/pipeline.c: Don't define `const' for _WIN32. + (run_pipeline) [_WIN32]: Provide working function without `fork'. - * pic/main.c (main): Add -C option, which sets compatible_flag. - (top_input::get), (top_input::peek): If -C option not given, - do not recognize .PS/.PE/.PF/.lf if followed by a character - other than space or newline. - * pic/lex.c (file_input::read_line): Similarily. - * pic/pic.h: Add declaration of compatible_flag. +2002-12-06 Werner LEMBERG -Thu Aug 2 11:11:27 1990 James Clark (jjc at yquem) + * font/devps/generate/freeeuro.sfd: Make dimensions of Euro.symbol + glyphs compatible to Adobe's Euro fonts (scaling them down a bit). + Scaling Euro.sansserif glyphs down to have the same height as + digits. + Removed unnecessary points; added some extrema. - * ps/tmac.ps (PSPIC): Avoid use of `echo -n'. + * font/devps/EURO, font/devps/freeeuro.afm, font/devps/freeeuro.pfa: + Regenerated. - * troff/node.c, troff/node.h: Add `asciify' methods to classes - derived from node. New class space_char_hmotion_node. - * troff/input.c (asciify_macro): New function. - * troff/input.c (init_input_requests): New request `asciify' bound - to asciify_macro. - * macros/mm.diff: New file. - * Makefile: In install.mm target use `patch' to apply - macros/mm.diff. +2002-12-04 Werner LEMBERG - * troff/input.c (macro::print_size): Just print the size in bytes. + * font/devps/generate/freeeuro.sfd: Add glyphs `Euro.symbol.slanted' + and `Euro.symbol.bold.slanted'. + Improve some glyph offsets and widths. + * font/devps/EURO, font/devps/freeeuro.afm, font/devps/freeeuro.pfa: + Regenerated. + * font/devps/generate/Makefile (freeeuro.afm freeeuro.pfa): Fix + typo. + * font/devps/generate/sfdtopfa.pe: Generate PFA in current + direcory. - * troff/div.c (return_request): Correct the argument - interpretation. + * tmac/europs.tmac: Updated to new glyph indices. + Use Euro.symbol for font familiy `A'. -Wed Aug 1 12:38:36 1990 James Clark (jjc at yquem) + * doc/groff.texinfo: Minor improvements. - * troff/node.h (class composite_node): Add sz member. - * troff/node.c (composite_node::size): Return sz. - * troff/input.c (macro_to_node): Use the initial size in the - environment as the size of the composite_node. +2002-12-02 Werner LEMBERG - * troff/node.c (node::zero_width_tprint): Provide a reasonable - default. + * font/devdvi/generate.tc.map: s/%O/%0/. + * font/devdvi/*TC: Regenerated. -Tue Jul 31 10:07:10 1990 James Clark (jjc at yquem) + * src/roff/troff/div.cc (init_div_requests): Sorted. - * troff/div.c (change_trap): If we get a bad number expression, - do nothing. + * tmac/dvi.tmac: Remove `Ye'. + * tmac/ec.tmac: Remove `Ye'. + Add .rchar entry for `de'. -Mon Jul 30 10:30:49 1990 James Clark (jjc at yquem) + * man/groff.man, man/groff_diff.man: Document register `.pe'. + * doc/groff.texinfo: Document registers `.pe', `.n', and `.w'. + * NEWS: Updated. - * lib/matherr.c (matherr): Define this only if math.h defines - TLOSS. +2002-11-30 Werner LEMBERG -Sun Jul 29 10:34:27 1990 James Clark (jjc at yquem) + Add PS font for various Euro glyphs. - * troff/div.c (macro_diversion::distance_to_next_trap): If there - no diversion trap return vunits(INT_MAX - vresolution). + * font/devps/generate/freeeuro.sfd: New master font file for + pfaedit. + * font/devps/generate/sfdtopfa.pe: New conversion script for + pfaedit. + * font/devps/generate/Makefile (FONTS): Add `EURO'. + (EURO, freeeuro.afm, freeeuro.pfa): New rules. + * font/devps/freeeuro.pfa, font/devps/freeeuro.afm: Generated from + `freeeuro.sfd'. + * font/devps/EURO: Generated from `freeeuro.afm'. + * font/devps/download: Add `freeuro.pfa'. + * font/devps/Makefile.sub (NORMALFILES): Adde `EURO' and + `freeeuro.pfa'. -Sat Jul 28 14:28:14 1990 James Clark (jjc at yquem) + * tmac/europs.tmac: New file. + * tmac/ps.tmac: Include `europs.tmac'. + * tmac/Makefile.sub (DISTFILES): Add `europs.tmac'. - * troff/input.c (do_zero_width): New implementation that doesn't - use a temporary environment. Use instead: - (token::add_to_node_list): New function. - * troff/env.c (environment::get_prev_char_height), - (environment::get_prev_char_height), - (environment::get_prev_char_skew): New functions. - (environment::get_prev_char): New function. - (environment::get_prev_char_width): Change to use get_prev_char. - (init_env_request): Implement new registers .cht, .cdp, .csk. - * eqn/sqrt.c (sqrt_box::output): Don't rely upon the argument to - \Z being processed in a separate environment. +2002-11-29 Werner LEMBERG -Fri Jul 27 10:21:25 1990 James Clark (jjc at yquem) + * font/devdvi/generate/texsy.map: Remove `lh' and `rh'. + * font/devdvi/S: Regenerated. + * font/devhtml/R.proto: Fix `CR' and `ci'. + Add `OK'. + * font/devps/generate/textmap: Fix `lh', `rh', and `sq'. + Remove `bs'. + * font/devps/symbolmap: Regenerated. + * font/devutf8/R.proto: Fix `CR' and `ci'. + Add `OK'. + * font/devutf8/NOTES: Updated. - * tbl/table.c: Removed TABLE_BOTTOM_REG. + * src/roff/troff/uniglyph.cc (unicode_to_glyph_list): Fix `CR' and + `ci'. + Add `OK'. + * src/roff/troff/glyphuni.cc (glyph_to_unicode_list): Ditto. - * tbl/table.c (table::init_output): In the section release macro, - give a warning message if the section won't fit on one page. + * tmac/dvi.tmac: Add `lh' and `rh'. + * tmac/Xps.tmac: Fix `lh' and `rh'. + * tmac/X.tmac: Add `OK'. + * tmac/lj4.tmac: Ditto. - * tbl/table.c (table::do_top): Emit table keep only if table is - boxed. - (table::do_bottom): Likewise for table release. - (table::table), (table::add_vertical_rule): Remove reference to - keep member. - * tbl/table.h: Remove keep member. +2002-11-24 Werner LEMBERG - * tbl/table.c: New register SUPPRESS_BOTTOM_REG. In - SECTION_RELEASE_MACRO, if there's not enough space before the next - trap to output the diversion, call T# ourselves, set - SUPPRESS_BOTTOM_REG to 1, spring the trap, then set - SUPPRESS_BOTTOM_REG back to 0. In T#, do nothing if - SUPPRESS_BOTTOM_REG is non-zero. In T#, always mark the current - vertical position and return to it before turning traps on again. - -Thu Jul 26 02:54:32 1990 James Clark (jjc at yquem) + * font/devX*/S: Regenerated. + * font/devascii/R.proto, font/devcp1047/R.proto: Remove glyphs `lb', + `lc', `lf', `lk', `lt', `rb', `rc', `rf', `rk', and `rt'. + * font/devdvi/generate/texsy.map: Remove `or' glyph. + * font/devdvi/S: Regenerated. + * font/devhtml/R.proto, font/devutf8/R.proto: Add/fix glyphs + `parenlefttp', `parenleftex', `parenleftbt', `parenrighttp', + `parenrightex', `parenrightbt', `bracketlefttp', `bracketleftex', + `bracketleftbt', `bracketrighttp', `bracketrightex', + `bracketrightbt', `bracelefttp', `braceleftmid', `braceleftbt', + `braceex', `braceleftex', `bracerightex', `bracerighttp', + `bracerightmid', `bracerightbt', `lt', `lk', `lb', `rt', `rk', + `rb', and `bv'. + * src/roff/troff/glyphuni.cc, src/roff/troff/uniglyph.cc: Ditto. + * font/devutf8/NOTES: Updated. + * font/devlj4/generate/special.map: Add glyph `braceex'. + * font/devlj4/S: Regenerated. - * troff/node.c, troff/node.h: In classes derived from node, - replace prev_char_width method by last_char_node method. - * troff/env.c (environment::get_prev_char_width): Use - node::last_char_node rather than node::get_prev_char_width. + * tmac/tty-char.tmac: Add glyphs `lf', `rf', `lc', and `rc'. - * Makefile: Added comment about -fno-inline on 68030-based - Apollos. +2002-11-14 Werner LEMBERG - * troff/reg.c (number_format_to_ascii), eqn/delim.c (DELIM_TABLE_SIZE), - tty/tty.c (tty_font::load_tty_font), dvi/tfmtodit.c (main): Cast - expressions using sizeof to int. - * dvi/dvi.c (dvi_font::handle_x_command): Avoid long->int warnings. + * src/roff/troff/uniglyph.cc (unicode_to_glyph_list): Add `va' + and `vA'. + Fix code for `an'. + * src/roff/troff/glyphuni.cc (glyph_to_unicode_list): Ditto. - * macros/tmac.e (TS): Don't move @f back past the current - position. + * doc/texinfo.tex: New version from texinfo 4.3. + * doc/groff.texinfo: Updated for texinfo 4.3. + Use @tie{} where appropriate. + * font/devdvi/generate/ec.map: Don't include `or' and `bv'. + * font/devdvi/generate/tc.map: Remove `rn'. + * font/devdvi/*TC, font/devdvi/*EC: Regenerated. + * font/devhtml/R.proto, font/devutf8/R.proto: Add `vA'. + Fix code for `an'. + * font/devX100/*, font/devX100-12/*, font/devX75/*, + font/devX75-12/*: Regenerated. -Wed Jul 25 09:11:08 1990 James Clark (jjc at yquem) + * tmac/dvi.tmac: Add special fonts `SA' and `SB'. + Use .char (again) for `br', `ul', `rn', `or', and `ru'. + Improve definition of `an'. + * tmac/ps.tmac: Use .char (again) for `br', `ul', `rn', `or', and + `ru'. + * tmac/lj4.tmac: Use .char (again) for `br', `ul', `rn', and `ru'. + * tmac/X.tmac: Add definition for `or'. + * tmac/Xps.tmac: Undo change 2002-11-05. + * tmac/lbp.tmac: Add definitions for `br', `rn', `ul', and `ru'. - * ps/ps.c (main): Buffer stderr. - * dvi/dvi.c (main): Likewise. - * tty/tty.c (main): Likewise. +2002-11-11 Werner LEMBERG - * ps/ps.c (ps_printer::do_import): Improve error handling. + * src/roff/troff/node.cc (troff_output_file::put_char): Always + call flush_tbuf. - * troff/input.c (abort_request): Use asciify. +2002-11-10 Werner LEMBERG - * driver/printer.h (printer::draw), driver/printer.c (printer::draw), - ps/ps.c (ps_printer::draw), dvi/dvi.c (dvi_printer::draw): Make - type of first argument int rather than char. This works around a - bug on the 68030 based Apollo using g++ 1.37.1. + Added three new requests `schar', `fschar', and `rfschar'. `schar' + defines a glyph which is searched after the check for fonts declared + with `.special' (and before the check for all mounted special + fonts). `fschar' defines a glyph for a particular font which is + searched after the check for fonts declared with `.fspecial' (and + before the check for fonts declared with `.special'). `rfschar' + removes glyphs defined with `fschar'. - * tbl/table.h (class table): Add `keep' member. - * tbl/table.c (table::table): Initialize `keep'. - (table::add_vertical_rule): Set `keep' to 1. - (table::do_top): Only emit table keep macro is `keep' is non-zero. - (table::do_bottom): Likewise for table release macro. - (table::do_row): Emit section keep macro even if the row is 0. + * src/roff/troff/token.h (char_mode): New enum. + Declare do_define_character. + * src/roff/troff/charinfo.h (charinfo): Replace `fallback' with + `mode'. + (charinfo::is_fallback): Updated. + (charinfo::is_special): New method. + * src/roff/troff/input.cc (do_define_character): Add and use + optional second parameter used as a prefix for font-specific glyph + names. + (define_character, define_fallback_character): Updated. + (define_special_character): New function. + (init_input_requests): Add `schar'. + (charinfo::charinfo, charinfo::set_macro): Updated. + * src/roff/troff/node.cc: Include `stringclass.h'. + (make_glyph_node): Handle special glyphs defined with `.schar' and + `.fschar'. + (define_font_special_character, remove_font_special_character): New + functions. + (init_node_requests): Sorted. + Add `fschar' and `rfschar'. + * NEWS, man/groff_diff.man, man/groff.man, doc/groff.texinfo: + Document new requests. -Tue Jul 24 08:35:07 1990 James Clark (jjc at yquem) + * font/devhtml/R.proto, font/devutf8/R.proto: Add `va'. + * tmac/dvi.tmac: Add `va' for CW and CWI (using `.fschar'). - * macros/tmac.e (@C): Preserve the font family across the change - in environments. +2002-11-08 Werner LEMBERG -Mon Jul 23 10:15:23 1990 James Clark (jjc at yquem) + Added new font `SC' (cmtex10) to devdvi. - * lib/font.c: Initialize font::hor and font::vert to 1. - (font::load_desc): Check the values of font::hor and font::vert. + * devdvi/generate/Makefile (FONTS): Add `SC'. + (SC): New rule. + * devdvi/generate/textex.map: New map file for cmtex. + * devdvi/SC: New. + * devdvi/Makefile.sub (DEVFILES): Updated. + * tmac/dvi.tmac: Add fspecial entries for SC. + Add `MI', `S' and `CW' to the `special' call. Otherwise, `SC' is + found before `S' since the font position of `SC' is lower due to the + gaps in DESC's `font' line. + * tmac/ec.tmac: Add a `special' call. + * NEWS: Updated. - * lib/lib.h: Added definition of INT_DIGITS. Fix it so that it can - be included in a C compilation. - (iftoa): Use INT_DIGITS. Include lib.h. - (itoa): Likewise. - (as_string): Likewise. - * tbl/table.c: Removed definition of INT_DIGITS. - * eqn/box.c (box::top_level): Use INT_DIGITS + 1 instead of 12. - * troff/input.c (input_input_requests): Likewise. - * ps/ps.c (make_encoding_name): Likewise. - (ps_printer::set_style): Likewise. - (ps_output::put_number): Use 1 + INT_DIGITS + 1 instead of 12. + * font/devhtml/R.proto: Remove double entry for `ti'. + * tmac/tty.tmac: Add entries for `IJ', `ij', and `bq'. + * tmac/tty-char.tmac: Remove entry for `bq'. + * tmac/lbp.tmac: Add entries for `lq', `rq', `fo', `fc', and `em'. + * tmac/ec.tmac: Don't remove `aq' glyph. + * tmac/X.tmac: Fix entry for `em'. + Add entries for `fo' and `fc'. + * tmac/dvi.tmac: Add entries for `em', `en', `hy', `fo', and `fc'. - * tty/devascii/R.proto: Map fm onto '. - * tty/devlatin1/R.proto: Likewise. + * doc/groff.texinfo, man/groff.man, man/groff_diff.man: Fix + documentation of `special' and `fspecial' requests. -Sat Jul 21 12:45:07 1990 James Clark (jjc at yquem) +2002-11-05 Werner LEMBERG - * tbl/table.c: Use ' instead of DELIMITER_CHAR in places where the - argument to \w is at a different input level. + * font/devascii/R.proto, font/devcp1047/R.proto, + font/devlatin1/R.proto: Remove entry for `.i'. + * font/devdvi/generate/textt.map: Add entry for `ad'. + * font/devdvi/generate/texr.map, font/devdvi/generate/texb.map, + font/devdvi/generate/texi.map: Add dummy glyph name `slash@for@l'. + We need this for getting kerning values to compose `/l' and `/L'. + * font/devdvi: Regenerated font definition files for CM fonts. + * font/devhtml/R.proto: Add entries for "'C", "'c", `IJ', and `ij'. + * font/devutf8/R.proto: Ditto. + Remove double entry for `ti'. - * tbl/table.c (table::init_output): Define a new macro - REPEATED_VPT_MACRO, like vpt but if in a diversion also - transparently outputs itself. - (table::define_bottom_macro): Use REPEATED_VPT_MACRO instead of - vpt. - (table::do_row): Likewise. + * src/roff/troff/glyphuni.cc (glyph_to_unicode_list): Fix entries + for (groff) ligatures, `la', and `ra'. + Add "'C", "'c", `IJ', and `ij'. + Remove double entry for `ti'. + * src/roff/troff/uniglyph.cc (unicode_to_glyph_list): Remove all + double entries. + Add "'C", "'c", `IJ', and `ij'. + Fix entries for (groff) ligatures, `la', and `ra'. - * tbl/table.c (vertical_rule::print): Prefix the .sp -1 line with - TRANSPARENT_STRING_NAME. + * tmac/ps.tmac (ps-achar): New macro. + Define "'c" and "'C". + * tmac/tty.tmac: Add entry for `.i'. + * tmac/X.tmac (X-achar): New macro. + Define "'c", "'C", and `:Y'. + Add entries for `IJ' and `ij'. + * tmac/Xps.tmac (Xps-achar): New macro. + Define "'c" and "'C". + Add entries for `IJ' and `ij'. + * tmac/lbp.tmac (lbp-achar): New macro. + Add fallback characters for all groff ligatures and many other + glyphs. + * tmac/dvi.tmac: Fix definitions of `_' and `ul'. + Add entries for `/l' and `/L'. + Define "'c" and "'C". + Add entries for `IJ' and `ij'. - * tbl/table.c (table::init_output): In the table release macro - print an error message and don't produce any output if after - issuing the need request the table still will not fit. Also - remove the diversion after bringing it back. +2002-11-02 Larry Kollar - * tbl/table.c (table::init_output): Define a new macro - REPEATED_MARK_MACRO, like mk but if in a diversion also - transparently outputs itself. - (table::do_row): Mark row_top_reg using REPEATED_MARK_MACRO. This - is necessary because .TH might not call .T#. - (table::do_top): Likewise TOP_REG. - (table::define_bottom_macro): If TOP_REG is no longer valid, use - #T - DOUBLE_LINE_SEP rather than #T. This is necessary because the - table header might contain just the two top rules. + * PROBLEMS: Document how to solve Mac OS X compilation problems. -Fri Jul 20 10:51:42 1990 James Clark (jjc at yquem) +2002-11-02 Werner LEMBERG - * troff/div.c: Implement new request `ptr' to print all traps. + Adding support for composite glyphs: \[xxx yyy ...] and the + `composite' request. - * troff/env.c (init_env_requests): Implement `.tabs' reg with - init_string_env_reg. - * troff/env.c (class tab_reg): Deleted. + * src/roff/troff/glyphuni.cc: New file for mapping groff glyph names + to Unicode-based glyph names. + * src/roff/troff/uniglyph.cc: New file for mapping Unicode-based + glyph names to groff glyph names. + * src/roff/troff/uniuni.cc: New file for canonically decomposing + Unicode-based glyph names. + * src/roff/troff/unicode.cc, src/roff/troff/unicode.h: New files + for handling Unicode glyph names. + * src/roff/troff/input.cc: Include unicode.h. + (composite_glyph_name): New function. + (token::next) <'['>: Handle Unicode glyph names and composite + glyphs. + (composite_dictionary): New dictionary for the `composite' request. + (composite_request): Implement `composite' request. + (init_input_requests): Add `composite'. + Alphabetically sorted. + * src/roff/troff/env.cc (tabs_save, tabs_restore): Removed (already + commented out). + (init_env_requests): Alphabetically sorted. + Removed `tas' and `tar' (already commented out). + * src/roff/troff/Makefile.sub: Updated. -Thu Jul 19 12:07:16 1990 James Clark (jjc at yquem) +2002-10-31 Ruslan Ermilov - * troff/div.c: New number register .pn returns the number of the - next page as set by the pn request. + * src/roff/nroff/nroff.man, src/roff/nroff/nroff.sh: Fix description + of options. - * macros/tmac.an: Redid headers and footers. Number each manual - entry starting from 1 unless \nC is > 0, like Sun. Added an - optional 5th argument to .TH which specifies the manual name and - appears in the center of the header. Understand the X, P and D - registers like Sun. +2002-10-29 Werner LEMBERG -Wed Jul 18 10:23:31 1990 James Clark (jjc at yquem) + Fix computation of .trunc register. Additionally, its value (and + the value of the .ne register) is now always set before entering the + trap. - * troff/env.c (init_env_requests): New number register `.lt' to - return the title length. + * src/roff/troff/div.cc (diversion::need): Set `truncated_space' and + `needed_space' before calling `space'. + (top_level_diversion::space): Remove special code for 'sp before the + first page. + Call `begin_page' with the discarded space as a parameter. + (top_level_diversion::begin_page): Add optional parameter to set + `truncated_space'. + * src/roff/troff/div.h: Updated. - * troff/node.h (class transparent_dummy_node): New class. - * troff/node.c (class transparent_dummy_node): Provide member - functions. - * troff/env.c (interrupt): Add a transparent_dummy_node, rather - than a dummy_node. + * doc/groff.texinfo: Improve documentation of .sp, \n[.trunc], and + \n[.ne]. - * troff/input.c (token::next): New escape sequence \). - * troff/input.c (get_copy): Recognize \) in copy mode. + * tmac/an-old.tmac (SH, SS, TP, IP, HP, TS): Undo change 2002-10-26. + (LP): Remove superfluous call to `br'. + * tmac/doc-common (doc-paragraph): Undo change 2002-10-26. + * tmac/doc.tmac (Bd, Bl, doc-set-vertical-and-indent): Ditto. - * troff/input.c (input_stack::clear): New function. - * troff/input.c (exit_request): Use input_stack::clear. +2002-10-26 Werner LEMBERG - * troff/token.h: Removed TOKEN_NO_PRINT_CHAR. - * troff/input.c (token::process): Removed case TOKEN_NO_PRINT_CHAR. + * tmac/doc-ditroff: Remove useless switch/variable -rC. + (doc-setup-header): Don't set page register `%'. + * tmac/doc-nroff: Remove variable `C'. + (doc-setup-page-layout): Set doc-header-space to .5i unconditionally. + (doc-setup-header): Don't set page register `%'. + Don't call `bp'. + * tmac/doc-common (doc-header): Call `ns'. + (doc-paragraph): Protect .sp with .br so that it survives traps + possibly set by the user. + * tmac/doc.tmac (Bd, Bl, doc-set-vertical-and-indent): Ditto. - * troff/env.c: Move set_page_character to input.c. Move - page_character to input.c also. - * troff/env.c (title): Split off the reading of the parts of the - title into read_title_parts. - * troff/input.c (read_title_parts): New function. Check the - input_level when testing whether a token matches the delimiter. + * tmac/doc*: Replace ' with . for consistency if no effect. - * troff/input.c (exit_request): New function. - * troff/input.c (init_input_requests): Bind ex request to - exit_request rather than exit_groff. +2002-10-26 Werner LEMBERG - * troff/input.c (exit_groff): Call tok.next() before - process_input_stack(). + * tmac/an-old.tmac (SH, SS, TP, IP, HP, TS): Protect .sp with .br + so that it survives traps possibly set by the user. -Mon Jul 16 09:47:23 1990 James Clark (jjc at yquem) + * src/roff/troff/node.cc: Fix the changes from 2002-10-23. + (troff_output_file::set_font): Call flush_tbuf if necessary. + (troff_output_file::fill_color, troff_output_file::glyph_color): Call + flush_tbuf and do_motion only if necessary. + (troff_output_file::start_special, + troff_output_file::put_char_width, troff_output_file::put_char, + troff_output_file::draw): Updated. + (word_space_node::tprint, space_node::tprint, hmotion_node::tprint, + vmotion_node::tprint): Undo change 2002-10-23. - * troff/env.c: ifdef widow control support on WIDOW_CONTROL. - * troff/env.h: ditto. - * troff/input.c: ditto. +2002-10-25 Werner LEMBERG - * troff/env.c (environment::is_empty): Test pending_lines. + * tmac/www.tmac (DC): Fix case of overlapping images. - * troff/env.c (environment::have_pending_lines): Removed. +2002-10-23 Werner LEMBERG - * troff/input.c: Add request to flush pending lines from the - environment. + * src/roff/troff/node.cc (troff_output_file::fill_color, + troff_output_file::glyph_color): Set current color before testing + color_flag. + (troff_output_file::put_char_width, troff_output_file::put_char, + troff_output_file::draw): Don't call flush_tbuf and/or do_motion + before glyph_color. + (troff_output_file::file_color, troff_output_file::glyph_color): + Call do_motion. + (word_space_node::tprint, space_node::tprint, hmotion_node::tprint, + vmotion_node::tprint): Move first, then call fill_color. - * troff/env.c, troff/env.h: Add automatic widow control feature. +2002-10-20 Werner LEMBERG - * troff/input.c (exit_groff): Do process_input_stack() after - do_break() but before setting exit_flag to 2. + * doc/groff.texinfo, man/groff_tmac.man: Document that it is not + possible to use multiple main macro packages. - * troff/input.c: Remove FLUSH_PENDING_LINES and - TOKEN_FLUSH_PENDING_LINES. Instead, flush pending lines from - environment after END_TRAP token seen, but only if there aren't - any more traps still unfinished. - * troff/token.h: Remove TOKEN_FLUSH_PENDING_LINES. +2002-10-19 Werner LEMBERG -Sun Jul 15 10:50:08 1990 James Clark (jjc at yquem) + * src/devices/grops/ps.cc (cmyk_flag): New global variable. + (ps_printer::set_color): Set `cmyk_flag' for CMY and CMYK colors. + (ps_printer::~ps_printer): Emit `%%Extensions: CMYK' if `cmyk_flag' + is set. + * font/devps/prologue.ps (Fk, Ck): Enclose definitions with a + `where' construction since `cmyksetcolor' is a PS Level 2 operator. - * troff/env.c: Rename the `retain_size' member of class - pending_output_line to `no_fill'. +2002-10-16 Werner LEMBERG - * troff/env.c (title): When the line is output, make the - retain_size argument !fill. + * NEWS, doc/webpage.ms: Updated. - * troff/node.h: Add `hyphenated' member to struct breakpoint. - * troff/node.c (space_node::get_breakpoints), - (dbreak_node::get_breakpoints): Fill this in. - * troff/env.c: Allow specification of maximum number of - consecutive hyphenated lines. +2002-10-14 Werner LEMBERG - * troff/env.c (environment::is_empty): Add test for !current_tab. + * src/roff/troff/node.cc (troff_output_file::put_char_width, + troff_output_file::put_char, troff_output_file::fill_color, + troff_output_file::glyph_color): Handle case where color pointer + is null. -Sat Jul 14 11:23:01 1990 James Clark (jjc at yquem) +2002-10-13 Ruslan Ermilov - * troff/env.c (environment::hyphenate_line): Don't completely give - up if the word is not to be hyphenated; continue so that breaks - can be made at break_char_node's. + Add the new -r option to grotty. It is similar to the -i option + except it tells grotty(1) to use the "reverse video" attribute to + render italic fonts. - * lib/lib.h: Only define INT_MAX if it's not already defined; - undef INT_MIN if it's already defined. + * src/devices/grotty/tty.cc (reverse_flag): New global variable. + (SGR_REVERSE, SGR_NO_REVERSE): New macros. + (tty_printer::make_underline, tty_printer::put_color, + tty_printer::end_page): Use it. + (main): Add -r switch. + (usage): Updated. + * src/devices/grotty/grotty.man: Document it. - * Makefile: Make it easy to define CFRONT_ANSI_BUG. +2002-10-11 Ruslan Ermilov - * lib/lib.h: If CFRONT_ANSI_BUG is defined, cast INT_MIN to long. - This works around a bug in AT&T C++ 2.0 used with an ANSI C - compiler. - - * macros/tmac.an (an-header): Set no-space mode. + * src/roff/troff/env.cc (hyphen_trie::read_patterns_file): Add + cast to `unsigned char' to properly read patterns with 8bit + characters. - * macros/tmac.an (TH): Start a new page if necessary. +2002-10-08 Werner LEMBERG - * Started using ChangeLog at version 0.4. + * REVISION: Increased to 2. Local Variables: version-control: never diff -ruN groff-1.19.1/ChangeLog.115 groff-1.19.2/ChangeLog.115 --- groff-1.19.1/ChangeLog.115 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/ChangeLog.115 2005-06-28 18:10:52.000000000 +0200 @@ -0,0 +1,6147 @@ + +Version 1.15 released +===================== + +1999-12-28 Werner LEMBERG + + * NEWS, VERSION: Changed to 1.15 + +1999-12-27 Paul Eggert + + * nroff/nroff.man: -S is safer, not safe. + + * groff/groff.cc (main): Use `safer', not `safe', in variable + names. This does not change the behavior. + + * troff/input.cc (main): Likewise. + + * nroff/nroff.sh: Likewise. + + * troff/input.cc (prepend_string): New function. + (main): Prepend -msafer, so that we check macro libraries for + safety. + + * PROBLEMS: Report problem with Sun C++ 5.0 and 5.1. + +Version 1.14 released +===================== + +1999-12-26 Werner LEMBERG + + * NEWS, VERSION: Changed to 1.14. + +1999-12-24 Werner LEMBERG + + * refer/refer.cc: Fixing the last fix. + +Version 1.13 released +===================== + +1999-12-23 Werner LEMBERG + + * tmac/tmac.an: A typo (`.if' instead of `.ie') made the page + number disappear. + + * NEWS: Updated. + + * tmac/tmac.safer: Forgot to remove `so' from the `rm' request. + + * VERSION: Changed to 1.13 -- to be compliant with the Adobe 3.0 + document conventions, the version number must be a real. + +Version 1.12.1 released +======================= + +1999-12-22 Werner LEMBERG + + * VERSION: Changed to 1.12.1. + +1999-12-22 Alan Rooks + + * refer/refer.cc (do_file): Slight modification to satisfy the + `Standard system CC - C++ Compilation System 3.1 03/03/99' on SCO + UnixWare 7.1. + +1999-12-20 Werner LEMBERG + + * changed prep.ai.mit.edu -> ftp.gnu.org; updated copyright + notices. + + * tmac/tmac.safer, tmac/groff_msafer.man: Remove `so' (again) from + list of unsafe requests. + + * pic/pic.man: Fixed a typo. + + * man/groff_out.man: Fixed a typo. + +1999-12-18 Werner LEMBERG + + * Makefile.in: Doc fixes. + +1999-12-17 Fabrizio Polacco + + * groff/groff.cc: Missing `U' option added to getopt(). + + * troff/troff.man: Missing `U' option added to synopsis. + +Version 1.12 released +===================== + +1999-12-14 Werner LEMBERG + + * troff/input.cc (usage), groff/groff.cc (synopsis): Added -U flag + to the synopsis. + + * nroff/nroff.sh, nroff/nroff.man: Replaced `secure', `unsecure' + with the more appropriate terms `safer' and `unsafe'. + + * libgroff/strerror.c, aclocal.m4, configure.in: Added checks for + sys_nerr and sys_errlist[]. + + * pic/pic.h, aclocal.m4, configure.in: Added check for hypot(). + + * pic/pic.y, pic/pic.cc: Added check for fmod(). + +1999-12-13 Werner LEMBERG + + * VERSION: Changed to 1.12. + + Here some patches from various sources; most of them taken from + the Debian distribution. + + * tmac/groff_mdoc.man, tmac/groff_mdoc.samples.man, + tmac/Makefile.sub: New files copied directly from the NetBSD + distribution. Probably, some additional adaptation later on is + necessary... + + * tmac/tmac.safer, tmac/groff_msafer.man: Added `so' to the list + of unsafe requests. + + * groff/groff.cc, groff/groff.man, nroff/nroff.sh, + nroff/nroff.man, pic/main.cc, pic/pic.man, troff/input.cc, + troff/troff.man: Added option `-U' for unsafe mode. Safe mode + (`-S') is now the default. + + * README, NEWS: Updated. + +1999-12-09 Werner LEMBERG + + * doc/groff.texinfo: Regenerated nodes and menus with emacs. + + * doc/Makefile (clean): Added cleaning commands for groff.texinfo. + +1999-12-06 Werner LEMBERG + + * configure.in: Removed AC_PREFIX_PROGRAM since it causes more + grief than relief today. Additionally, it is against the GNU + coding standards. + + * configure: Recreated. + +1999-12-05 Werner LEMBERG + + * configure.in: Added GROFF_LIBM. + + * configure: Recreated. + + * aclocal.m4 (GROFF_LIBM): New function which tests whether -lm is + necessary. + + * Makefile.in: Added definition of $(LIBM). + + * Makefile.comm (LIBM): Removed. + + * pfbtops/Makefile.sub: On AIX, -lm is needed also. + +1999-12-03 Gaius Mulley + + * doc/Makefile: Added rule for generation pic.html. + + (clean): Files produced by grohtml will be removed also. + + * doc/pic.ms: Small fix. + + * tmac/tmac.html: Fixed suppression of headers. + +1999-11-16 Gaius Mulley + + * tmac/tmac.html: Fixing horizontal arrows. + + Turning off hyphenation. + + * tmac/tmac.an: Improved support for grohtml; better indentation, + no footers/headers. + +1999-10-31 Gaius Mulley + + * tmac/tmac.arkup: Added CDFTP macro + + * tmac/tmac.html: All headers are turned off for ms, me, and mm + macros. + + * tmac/troffrc: Some additions for HTML stuff. + +1999-10-06 Gaius Mulley + + * tmac/tmac.html: Small changes. + +1999-09-26 Werner LEMBERG + + * doc/groff.texinfo: Minor fixes. + +1999-09-26 Gaius Mulley + + * devhtml/TR: Changed spacewidth to 3. + + * tmac/Makefile.sub (NORMALFILES): Added tmac.arkup. + + * tmac/tmac.html: Moved markup macros to tmap.arkup. + + * tmac/tmac.arkup: New file. + + * grohtml/ChangeLog: New file. + +1999-09-16 Werner LEMBERG + + * doc/groff.texinfo (Common Features): Added Copying chapter. + Changed format to @smallbook. + +1999-09-15 Werner LEMBERG + + * NEWS: Added info about groff.texinfo. + + * doc/groff.texinfo: Will now compile (using texi2dvi) without + warning messages. + +1999-09-14 Werner LEMBERG + + * groff/groff.man: More updates. + +1999-09-13 Werner LEMBERG + + * doc/groff.texinfo: New file. This manual is still very + rudimentary. It has been originally contributed by Trent + A. Fisher with first corrections and + additions by me. + + * INSTALL: Added information about the `doc' subdir + + * troff/troff.man: Minor fixes. + + * groff/groff.man: Added missing `-L arg' to SYNOPSIS section; + reordered options. + + * troff/input.cc (usage): Added missing `-ffam' to usage message. + + * Makefile.in (dist): groff-$(version).tar.gz must be removed + also, otherwise it is included itself in another call of `make + dist'. + + * groff/groff.cc (synopsis): Removed superfluous space. + + * PROJECTS, PROBLEMS, NEWS: Updated. + + * VERSION: Updated to 1.12beta. + + * BUG-REPORT: Some cosmetic fixes. Corrected email address. + + * README: Updated: Included documentation about CVS repository, + mailing lists, and daily snapshots. + + * tmac/Makefile.sub: Fixed $(tmap_wrap) finally. + +1999-09-12 Bjarni Ingi Gislason + + * tmac/tmac.an: If the tag didn't fit into the space that the + macro `TP' specifies, the rest of the tag went into the space for + the next line. + +1999-09-12 Jeffrey Copeland + + * grolj4/lj4.cc: Added duplex printing (option `-d'). + + * grolj4/grolj4.man: Document duplex printing. + +1999-09-12 Werner LEMBERG + + * doc/Makefile (pic.ps): Fixed rule which caused problems with + non-GNUish sed programs. + + * tmac/doc-syms: Removed extra space from -iso8802-3 macro + definition. + + * configure.in (LIBS): Added `-lc' + + * Makefile.comm (.man.n): Added substitution for @TMAC_AN_PREFIX@. + + * pic/tex.cc (solid_arc): Casting M_PI to double. + + * libgroff/putenv.c (putenv): Changed function header to ANSI C. + + * groff/groff.man, tmac/Makefile.sub (MAN7), tmac/groff_msafer.man + (new file), tmac/msafer.man (deleted), tmac/groff_me.man (new + file), tmac/me.man (deleted): {me,msafer} -> groff_{me,msafer}. + + * groff/groff_man.man: New file. This manual page was originally + written for the Debian GNU/Linux system by Susan G. Kleinmann + . + + * eqn/list.cc (list_box::compute_metrics, + list_box::compute_sublist_width): Removed variable declaration to + avoid shadowing warnings. + + * grops/psrm.cc (resource_manager::process_file): Ditto. + + * tfmtodit/tfmtodit.cc (main): Ditto. + + * libgroff/font.cc (font::load_desc): Renamed auxiliary variable + to avoid shadowing warnings. + + * tbl/table.cc (block_entry::do_divert, table::do_row): Renamed + shadowing loop variable. + + * groff/groff.man, troff/troff.man: Added doc about grohtml. + +1999-09-12 Gaius Mulley + + New grohtml frontend to convert groff input to html. + + * Makefile.in (CCPROGDIRS, DEVDIRS): Added html device. + + * tmac/Makefile.sub (NORMALFILES): Added tmac.html. + + * tmac/eqnrc: Added html device. + + * tmac/tmac.html: New file. + + * eqn/main.cc (do_file, inline_equation), pic/troff.cc + (troff_output::start_picture, troff_output::finish_picture), + tbl/main.cc (process_input_file): + Surrounded output with `graphics_start' and `graphics_end' so that + the html driver can identify non-text portions. + + * grodvi/dvi.cc (dvi_printer::set_char), grolj4/lj4.cc + (lj4_printer::set_char), grops/ps.cc (ps_printer::set_char), + grotty/tty.ps (tty_printer::set_char): Additional parameter + `name'. + + * include/printer.h: Class printer: New function + set_char_and_width; new variables (is_char_named, is_named_set, + named_command, named_char_s, named_char_n) to hold information + about named characters -- needed by the html driver. + + * libdriver/printer.cc (printer::set_ascii_char, + printer::set_special_char): Use set_char_and_width. + + * devhtml/*: New device files for html driver. + + * grohtml/*: New driver grohtml. + +1999-09-11 Wilfredo Sanchez + + * tmac/doc-common, tmac/tmac.an: Removed the word `UNIX' in + default strings. + +1999-09-11 Luke Mewburn + + * libgroff/string.cc (search): Small fix to test against NULL + pointer. + +1999-09-11 Jeff Conrad + + * troff/node.cc (copy): The characters in a bracket escape (e.g., + \b'abc') were stacked in reverse order when processed in a + diversion. + + * troff/node.h: Added `*last' to struct `node' to make the above + fix work. + + * troff/input.cc (read_draw_node), libdriver/input.cc (do_file): + The default scale for the 'f' and 't' graphics functions were 'm' + rather than 'u' (i.e., no scaling). + +1999-09-11 Peter Miller + + * groff/groff.cc (main), groff.man, soelim/soelim.cc (main, + do_file), soelim/soelim.man: Added `-I file' option to soelim, + defining include paths. + + * soelim/soelim.cc (include_path_append): New function. + +1999-09-11 Larry Jones + + * tbl/main.cc (process_options): Unix (at least Documenter's + Workbench) tbl allows arbitrary non-alpha characters between + options. + +1999-09-11 Paul Eggert + + Y2k fixes. Don't assume that the current year precedes 2000. + + * doc/meref.me: Add \n(y2, \n(y4. + + * tmac/doc-common (Yr): New number register. + (Dd): Don't assume current year precedes 2000. + + * tmac/tmac.e (td): Likewise. + (y2, y4): New number registers. + + * pic/pic.man: Update reference for pic paper to May, 1991 + version. + +1999-09-11 Werner LEMBERG + + * tmac/Makefile.sub (install_data, stamp-wrap, uninstall_sub): + Removed quotation marks which prevented correct expansion of + $(tmac_wrap). + + * devlj4/Makefile.sub (LJ4RES): Fixed value (600 instead of 300). + +1999-09-10 Werner LEMBERG + + * Makefile.sub (DISTCLEANFILES): Added `config.log' and + `config.cache'. + + * Removed configure.old. + +1999-08-31 Werner LEMBERG + + * VERSION: Updated to 1.11.1 + +1999-05-27 Werner LEMBERG + + * doc/Makefile: changed `.PS' postfix to `.ps' for consistency. + + * tmac/Makefile.sub (install_data, stamp-wrap, uninstall_sub): + added quotations around $(tmac_wrap) to avoid syntax error if + variable is empty. + + * configure: Newly generated using autoconf 2.13. + + * Makefile.in (LDFLAGS): Set variable to @LDFLAGS@. + +Fri Aug 15 08:51:47 1997 Eric S. Raymond + + * README, PROJECTS, NEWS, INSTALL, VERSION, + doc/Makefile. doc/pic.ms, groff/groff.man: + Prepare for 1.11 release. No code changes. + Documentation for pic added (doc/pic.ms). + +Sun Nov 26 11:45:13 1995 James Clark + + * Version 1.10 released. + +Fri Nov 24 09:56:16 1995 James Clark + + * afmtodit/afmtodit.pl: Avoid comment on first line. + +Mon Nov 20 11:13:49 1995 James Clark + + * aclocal.m4 (GROFF_INSTALL_SH): New macro. + * configure.in: Call it. + + * Makefile.sub (configure): Depends on aclocal.m4 not acgroff.m4. + (distfiles): Doesn't depend on config.log or config.cache. + +Sun Oct 1 08:45:36 1995 James Clark + + * grog/grog.sh: Use print "" rather than print in END rule. + +Wed Aug 23 13:30:52 1995 James Clark + + * tbl/main.cc (process_data): Don't give error for excess data + entries that are comments. + +Fri Jul 28 11:00:27 1995 James Clark + + * tbl/main.cc (process_data): Fix case where new for-scope rules + silently change meaning of code. + +Tue Jul 4 23:39:51 1995 James Clark + + * troff/env.cc (hyphenate): Loop over all consecutive sequences + of non-zero hyphenation codes. + +Sat Jul 1 00:42:15 1995 James Clark + + * aclocal.m4 (GROFF_POSIX): Use conflicting declaration technique. + +Thu Jun 29 13:58:36 1995 James Clark + + * tmac/tmac.e (ip): Divert the tag so as to freeze the spaces. + +Tue Jun 27 12:30:16 1995 James Clark + + * tmac/tmac.andoc: Make it work in compatibility mode. + + * refer/token.h (token_info::is_range_sep): New function. + * refer/token.cc (init_special_chars): Make \(en a RANGE_SEP. + * refer/ref.cc (reference::output): More sophisticated check for + multiple pages. + + * devps/prologue.ps (MANUAL): New procedure. + * grops/ps.cc (main): New -m option. + (usage): Include -m. + (ps_printer::~ps_printer): Implement -m. + + * aclocal.m4 (GROFF_G): New macro. + * configure.in: Call it. + * Makefile.in (g): Provided by configure. + + * hpftodit/hpftodit.cc (basename): Rename to xbasename. + + * tmac/tmac.tty: Disable warning about bad fonts. Remove font + translations. + + * Makefile.in (tmacpath): Don't include /usr/lib/tmac. + (tmac_m, tmac_s): Deleted. + (sys_tmac_prefix, tmac_wrap, tmac_prefix, tmac_an_prefix, + tmac_s_prefix): New variables. + (MDEFINES): Change accordingly. + * Makefile.comm (.man.n): Use new TMAC_* variables. + * configure.in (GROFF_TMAC): Call. + * aclocal.m4 (GROFF_TMAC): Define. + * tmac/Makefile.sub (stamp_wrap): New target. + (install_data, uninstall_sub): Handle macro wrapping. + +Mon Jun 26 14:54:39 1995 James Clark + + * tbl/main.cc (main): Ignore -T option. + +Thu Jun 22 09:08:06 1995 James Clark + + * devlj4/generate/special.map: Add definition of \(nb. + + * tmac/tmac.dvi: Add definition of \(nb. + + * troff/dictionary.c (dictionary::dictionary): association::v gets + initialized by association::association. + + * tmac/Makefile.sub: Avoid using temporary files when installing. + + * troff/env.cc (environment::set_font): Make bad font number a + warning. + + * Makefile.in (fontpath): Remove $(prefix)/lib/font from fontpath. + + * Makefile.in (datadir): Use share rather than lib. + + * groff/groff.cc (basename): Rename to xbasename. + +Wed Jun 21 16:59:46 1995 James Clark + + * Makefile (CCLIBS): Don't use. + * Makefile.ccpg: Likewise. + + * acgroff.m4: Rename to... + * aclocal.m4: Modify extensively for autoconf 2. + * configure.in: Likewise. + * Makefile.in: Likewise. + + * groff/pipeline.c (const): Declare as empty if __STDC__ not + defined. + (xstrsignal): Check for definition of NSIG. Conditionalize + on SYS_SIGLIST_DECLARED. Make return type const. + +Sat Jun 10 12:28:16 1995 James Clark + + * troff/input.cc (interpolate_macro): Rephrase missing space + warning. + +Thu May 11 01:07:16 1995 Jason Merrill + + * addftinfo/addftinfo.cc, eqn/delim.cc, eqn/lex.cc, eqn/list.cc, + grodvi/dvi.cc, groff/groff.cc, grops/ps.cc, grops/psrm.cc, + grotty/tty.cc, include/ptable.h indxbib/indxbib.cc, + libbib/index.cc, libbib/linear.cc, libbib/search.cc, + libdriver/input.cc, libdriver/printer.cc, libgroff/font.cc, + libgroff/lf.cc, libgroff/nametoindex.cc, libgroff/ptable.cc, + libgroff/string.cc, lkbib/lkbib.cc, lookbib/lookbib.cc, + pic/lex.cc, pic/object.cc, pic/pic.y refer/label.y refer/ref.cc, + refer/refer.cc, refer/token.cc, tbl/main.cc, tbl/table.cc, + tfmtodit/tfmtodit.cc, troff/dictionary.cc, troff/div.cc, + troff/env.cc, troff/input.cc, troff/node.cc, troff/symbol.cc: + Fix 'for' scoping. + +Wed Apr 19 21:15:11 1995 James Clark + + * troff/input.cc (spring_trap): Push a macro_iterator rather than a + string_iterator. + (spring_trap, postpone_traps, unpostpone_traps): Move to later in + file. + (macro_iterator::macro_iterator): Add additional argument. + +Mon Apr 10 12:06:02 1995 James Clark + + * troff/div.cc (vertical_size::vertical_size): In place of integer + specifying line spacing use cunits specifying post vertical + space. + (macro_diversion::output, top_level_diversion::output): Likewise. + * troff/div.h: Change declarations accordingly. + * troff/env.cc (pending_output_line): Replace ls field by post_vs + field. + (pending_output_line::pending_output_line, + pending_output_line::output, environment::output, + environment::output_line, environment::output_title, + environment::hyphenate_line): In place of + integer specifying line spacing use cunits specifying post vertical + space. + (environment::environment): Add post_vertical_spacing and + prev_post_vertical_spacing arguments. + (environment::get_post_vertical_spacing): New function. + (environment::total_post_vertical_spacing): New function. + (environment::post_vertical_spacing): New function. + (init_env_requests): Initialize pvs request and .pvs register. + * troff/env.h: Change declarations. + +Tue Mar 28 09:52:07 1995 James Clark + + * tmac/tmac.pspic: Immediately remove the temporary file. + +Sat Mar 25 10:43:11 1995 James Clark + + * tmac/tmac.pspic (PSPIC): Scale graphic uniformly even when + height is specified. + +Thu Jan 26 16:20:13 1995 James Clark + + * tbl/table.c (struct vertical rule, class table_entry): Use int + not short for start_row and end_row. + +Fri Jan 13 13:53:05 1995 James Clark + + * troff/input.cc (trapping_blank_line, blank_line_macro): New + functions. + (diverted_space_node::reread, process_input_stack): Call + trapping_blank_line() rather than blank_line(). + (init_input_requests): Bind "blm" to blank_line_macro(). + + * tmac/tmac.s (XA): Use .br and par@reset rather than XA. + +Tue Jan 10 11:40:35 1995 James Clark + + * troff/env.cc (environment::possibly_break_line): Require that + width total excluding width of final space node be greater than + the target text length. + +Tue Jan 3 09:13:37 1995 James Clark + + * troff/node.cc (kern_pair_node::vertical_extent): New function. + +Sun Dec 4 13:19:07 1994 James Clark + + * troff/node.cc (charinfo_node): New class. + (glyph_node, composite_node): Derive from charinfo_node. Change + member functions accordingly. + +Wed Nov 30 10:29:29 1994 James Clark + + * nroff/nroff.sh: Use -Tlatin1 not -TLatin1. + +Mon Aug 8 10:17:59 1994 James Clark (jjc@jclark.com) + + * tmac/tmac.tty-char: Add definitions for \(ab and \[arrowvertex]. + + * devps/generate/textmap (notsubset): Add. + + * tmac/tmac.a4: New file. + +Sun Jul 24 20:08:42 1994 James Clark (jjc@jclark.com) + + * pic/main.cc (had_parse_error): New variable. + (do_picture, do_whole_file): Set had_parse_error if yyparse() + returns non-zero. + (main): Return 1 if had_parse_error is true. + +Tue Jul 19 13:40:31 1994 James Clark (jjc@jclark.com) + + * grolj4/lj4.cc (main): Avoid use of strtoul. + +Mon Jul 18 15:03:02 1994 James Clark (jjc@jclark.com) + + * nroff/nroff.sh: Default device is -Tlatin1 if $LC_CTYPE is + iso_8859_1 or $LESSCHARSET is latin1. + +Sun Jul 10 13:38:35 1994 James Clark (jjc@jclark.com) + + * hpftodit: New directory. + * Makefile.in (CCPROGDIRS): Add hpftodit. + * devlj4/generate: New directory. + +Thu Jul 7 23:49:48 1994 James Clark (jjc@jclark.com) + + * configure.in: Don't use AC_VFORK. + * groff/pipeline.c (run_pipeline): Use fork() always. + +Wed Jul 6 11:13:17 1994 James Clark (jjc@jclark.com) + + * grops/ps.cc (main): Use %1 not %s in error message for -w. + + * Makefile.in (CCPROGDIRS): Add grolj4. + (DEVDIRS): Add devlj4. + * grolj4, devlj4: New directories. + * tmac/troffrc: Handle lj4. + * tmac/tmac.lj4: New file. + +Fri Jun 17 18:02:53 1994 James Clark (jjc@jclark.com) + + * tmac/tmac.e (@n): Set indent to 0 before calling |h. + +Wed Jun 1 07:33:47 1994 James Clark (jjc@jclark.com) + + * troff/input.cc (do_if_request): At end of second string, switch + environments before getting next token. + +Fri May 20 07:39:18 1994 James Clark (jjc@jclark.com) + + * devps/psstrip.sed: Split rule that strips whitespace on either + side of delimiters. + +Wed May 18 08:13:47 1994 James Clark (jjc@jclark.com) + + * troff/node.h (font_family::make_definition): Add return value to + declaration. * troff/symbol.h (symbol::operator==, + symbol::operator!=): Likewise. + +Tue May 17 20:46:06 1994 James Clark (jjc@jclark.com) + + * groff/groff.cc (main, help, synopsis): Handle -S. + (possible_command::insert_arg): New function. + + * tmac/tmac.safer: New file. + * tmac/msafer.man: New file. + * tmac/Makefile.sub (FILES): Add tmac.safer and msafer.man. + +Thu Mar 10 01:58:30 1994 Paul Eggert (eggert@twinsun.com) + + * pic/pic.h, pic/main.cc (safer_flag): New variable. + * pic/pic.y (placeless_element): Avoid unsafe operations if + `safer_flag' is set. + * pic/main.cc (main): Add -S option, which sets `safer_flag'. + +Tue May 10 13:02:31 1994 James Clark (jjc@jclark.com) + + * eqn/lex.cc (get_token): Put call to add_context() in block to + work around Sun C++ 4.0 bug. + + * include/stringclass.h (operator +): Use ?: instead of `if' to + work around Sun C++ 4.0 bug. + +Thu May 5 11:18:03 1994 James Clark (jjc@jclark.com) + + * tbl/main.cc (process_format): Accept - as a synonym for the _ + key letter. + + * libbib/index.cc (minus_one): Don't declare as const. + +Fri Apr 29 09:32:48 1994 James Clark (jjc@jclark.com) + + * troff/input.cc (get_char_for_escape_name): Push back a newline. + +Wed Apr 27 21:14:18 1994 James Clark (jjc@jclark.com) + + * troff/input.cc (write_macro_request): New function. + (init_input_requests): Bind write_macro_request to writem. + +Sun Apr 17 11:15:38 1994 James Clark (jjc@jclark.com) + + * tmac/tmac.s (@EN): Turn filling back on even if there was no + equation. + + * eqn/lex.cc (do_space): Supply missing argument to lex_error. + + * tmac/tmac.s (@TS): Renamed from TS. + (TS): Call LP then TS again. + (cov*ab-init): Alias @TS to TS. + + * tmac/tmac.s: Allow QP or RS to initialize. + + * tmac/tmac.s (par@load-init): New macro. Call at end of file. + Move initializations of PS and LL here. + (par@init): Don't initialize HY. Avoid changing environment 0. + (par*env-init): Don't all par@reset. + +Thu Apr 14 19:15:45 1994 James Clark (jjc@jclark.com) + + * include/posix.h: Include only if not using . + +Sun Apr 10 09:54:44 1994 James Clark (jjc@jclark.com) + + * Makefile.in (MDEFINES): Add LDFLAGS. + (LDFLAGS): Add definition line. + +Thu Apr 7 22:22:22 1994 James Clark (jjc@jclark.com) + + * troff/input.cc (get_optional_char): Split off error check into... + (check_missing_character): New function. + * troff/token.h: Declare it. + * troff/env.cc (margin_character): Don't call get_optional_char. + Only call tok.next() after making the node. + + * include/lib.h (getopt): Make 2nd argument char *const *. + +Fri Mar 11 07:28:03 1994 James Clark (jjc@jclark.com) + + * nroff/conftest.sh: Deleted. + +Fri Mar 4 10:51:36 1994 James Clark (jjc@jclark.com) + + * pic/make-dos-dist: Deleted. + +Wed Mar 2 20:59:16 1994 James Clark (jjc@jclark.com) + + * devps/psstrip.sed: Strip comments before stripping trailing + white space. + +Sat Feb 19 13:07:16 1994 James Clark (jjc@jclark.com) + + * Version 1.09 released. + +Wed Feb 16 16:53:49 1994 James Clark (jjc@jclark.com) + + * tmac/doc-ditroff (hK): Don't reset page number if \nC is > 0. + +Mon Feb 14 08:26:40 1994 James Clark (jjc@jclark.com) + + * libgroff/font.cc (font::load_desc): Fix typo in error message. + +Sun Feb 13 09:37:38 1994 James Clark (jjc@jclark.com) + + * libgroff/new.cc (operator new): Rewrite so as to avoid warning + about returning without a value. + + * troff/charinfo.h (charinfo::get_special_translation): Cast + TRANSLATE_NONE to int. + + * refer/token.cc (lookup_token, store_token): Remove bogus loop + test. Fix test so that it works with n unsigned. + + * pic/pic.y (defaults_table): Fully bracket initializer. + * pic/lex.cc (lookup_keyword): Likewise. + * eqn/lex.cc (token_table, def_table): Likewise. + * eqn/box.cc (param_table): Likewise. + * troff/input.cc (warning_table): Likewise. + * libgroff/font.cc (table): Likewise. + * grops/ps.cc (ps_printer::special): Likewise. + * grops/psrm.cc (resource_manager::process_file): Likewise. + * tfmtodit/tfmtodit.cc (lig_chars, lig_table): Likewise. + * refer/command.cc (command_table): Likewise. + * addftinfo/addftinfo.cc (param_table): Likewise. + + * troff/symbol.cc (symbol::symbol): Prevent compiler warnings + about temp's being unused. + (unused): New function. + + * groff/pipeline.cc: Declare c_fatal. + + * libbib/linear.cc (bmpattern::search): Cast patterrn[--j] to + uchar. + + * libbib/index.cc (index_search_item::load): Prevent compiler + warnings about fd_closer's being unused. + (unused): New function. + +Sat Feb 12 10:31:59 1994 James Clark (jjc@jclark.com) + + * troff/input.cc (copy_mode_error): Make `prefix' static. + Fix typo. + + * include/posix.h: Include is HAVE_CC_OSFCN_H is + defined. + * acgroff.m4, configure.in, Makefile: Rename HAVE_CC_UNISTD_H to + HAVE_CC_OSFCN_H and modify accordingly. + + * troff/input.cc (init_charset_table): radicalex overlaps + horizontally. + + * groff/acgroff.m4 (GROFF_ISC_SYSV3): New macro (from + udodo!hans@relay.NL.net). + * groff/configure.in: Call it. + + * groff/acgroff.m4 (GROFF_PCLOSE): New macro. + * groff/configure.in: Call it. + * include/lib.h: Conditionalize declaration of pclose. + + * troff/div.cc (last_page_number): New global variable. + (top_level_diversion::begin_page): Exit if we just printed the + last page. + * troff/div.h (last_page_number): Declare it. + * troff/input.cc (parse_output_page_list): Set last_page_number. + + * eqn/sqrt.cc: Rename \(rn to \[radicalex]. + * devps/S, devps/textmap, tmac/tmac.ps, tmac/tmac.dvi, + tmac/tmac.X: Likewise. + * tmac/tmac.ps, tmac/tmac.X, tmac.dvi: Add definitions of \(rn. + * tmac.dvi: Make \(ru and \(ul extend beyond their width by .04m. + +Fri Feb 11 11:45:40 1994 James Clark (jjc@jclark.com) + + * tmac/doc-ditroff (hK): Remove groff specific code which + prevented page-breaks between separate manual entries. If this is + the first page, don't set the page number to 1. + + * acgroff.m4 (GROFF_POSIX): New macro. + * configure.in: Use it. + + * troff/node.cc (class real_output_file, + real_output_file::real_output_file, + real_output_file::~real_output_file): Conditionalize use of + popen/pclose on POPEN_MISSING. + * troff/node.h: Conditionalize pipe_command on POPEN_MISSING. + * troff/input.cc (pipe_command): Give an error if POPEN_MISSING. + (pipe_source): Similarily. + + * acgroff.m4 (GROFF_PROG_CCC): Update message about libg++. + + * acgroff.m4 (GROFF_GETOPT, GROFF_PUTENV, GROFF_POPEN): Detect + presence of declarations by trying to compile example with + conflicting declarations. (gcc only gives a warning for missing + declarations.) + +Wed Feb 9 09:12:23 1994 James Clark (jjc@jclark.com) + + * tmac/tmac.pspic (PSPIC): Allow options to specify alignment + (from Ulrich Lauther). + +Tue Feb 8 03:56:40 1994 James Clark (jjc@jclark.com) + + * libbib/linear.cc (file_buffer::load): Use S_ISREG macro. + +Thu Feb 3 09:34:35 1994 James Clark (jjc@jclark.com) + + * indxbib/indxbib.cc (write_hash_table): Add code for case where + pointers and ints have different sizes. + +Sun Jan 9 16:17:51 1994 James Clark (jjc@jclark.com) + + * tmac/tmac.s (par*env-init): Call par@reset. + +Fri Jan 7 10:24:27 1994 James Clark (jjc@jclark.com) + + * tmac/tmac.s (@IP): Switch to a new environment when diverting + tag. + (par*push-tag-env, par*pop-tag-env): New macros. + +Wed Jan 5 21:18:34 1994 James Clark (jjc@jclark.com) + + * grops/ps.cc (ps_printer::ps_printer): Use MAX_LINE_LENGTH for + initializing `out'. Reduce MAX_LINE_LENGTH from 79 to 72. + + * grops/ps.cc (ps_printer::~ps_printer): Output %%CreationDate + comment. Include . + +Wed Dec 15 14:14:00 1993 James Clark (jjc@jclark.com) + + * grops/ps.cc (is_small_h, is_small_v): Deleted. + (ps_printer::flush_sbuf): Use absolute motion only at beginning of + lines. + +Tue Dec 14 10:06:34 1993 James Clark (jjc@jclark.com) + + * troff/input.cc (read_request): Only print a prompt if reading + from the terminal. Also clearerr on EOF if reading from the + terminal. Declare isatty. + +Mon Nov 29 08:38:15 1993 James Clark (jjc@jclark.com) + + * refer/label.y: Rename map_t to map_func and extractor_t to + extractor_func. + +Sat Oct 30 06:38:12 1993 James Clark (jjc@jclark.com) + + * include/assert.h: Don't use volatile. + * libgroff/assert.cc: Likewise. + +Fri Oct 29 15:00:23 1993 James Clark (jjc@jclark.com) + + * troff/input.cc (abort_request): Look at character in tok before + calling get_copy(). + +Thu Oct 28 14:09:48 1993 James Clark (jjc@jclark.com) + + * troff/troff.h (NO_RETURN): Deleted. + * troff/div.cc (cleanup_and_exit): Don't declare aas NO_RETURN. + * troff/input.cc (exit_troff): Likewise + + * Makefile.in: Remove `Making ...' messages since GNU make now + gives these. + + * configure.in: Use AC_HAVE_HEADERS(unistd.h) instead of AC_UNISTD_H. + +Wed Oct 27 11:12:51 1993 James Clark (jjc@jclark.com) + + * tmac/tmac.s (@init): Initialize PO to \n(.o here, rather than + to constant 1 inch. + +Sat Oct 23 10:03:52 1993 James Clark (jjc@jclark.com) + + * tmac/tmac.e (hl): Use \n[.in] rather than \n(.i. + +Thu Oct 14 12:09:45 1993 James Clark (jjc@jclark.com) + + * eqn/delim.cc (delim_box::compute_metrics): Don't increase + MARK_REG if there was no left delimiter. + +Sat Oct 2 19:54:47 1993 James Clark (jjc@jclark.com) + + * pic/troff.cc (troff_output::text): Set line thickness to + relative before outputting text. + + * tmac/tmac.e (@k): Don't zero ?T. + ((z): Likewise. + +Sat Sep 25 11:08:43 1993 James Clark (jjc@jclark.com) + + * tmac/tmac.e ($p): Handle possibility that $3 is empty. + +Wed Aug 18 08:51:41 1993 James Clark (jjc@jclark.com) + + * troff/input.cc (decode_args): Warn about unquoted tabs (from + Paul Eggert). + +Tue Aug 10 08:38:32 1993 James Clark (jjc@jclark.com) + + * troff/input.cc (ignoring): New variable. + (ignore): Set ignoring during call to do_define_macro. + (do_define_macro): Clear ignoring before interpolating terminating + macro. + (copy_mode_error): New function. + (get_char_for_escape_name, read_long_escape_name, + interpolate_arg): Use copy_mode_error. + (warning_table): Add WARN_IG. + * troff/troff.h (WARN_IG): Declare. + (WARN_TOTAL): Change accordingly. + + * groff/pipeline.c (strsignal): Rename to xstrsignal. + * groff/groff.cc (strsignal): Delete declaration. + +Fri Jul 16 01:43:12 1993 James Clark (jjc@jclark.com) + + * troff/div.cc (page_offset): Use 'm' as default scaling. + +Sat Jul 3 09:11:38 1993 James Clark (jjc@jclark.com) + + * nroff/nroff.sh: Ignore -u. + +Wed Jun 9 12:17:27 1993 James Clark (jjc@jclark.com) + + * Makefile.in (MDEFINES): Pass down MAKEOVERRIDES. + +Fri Jun 4 17:35:47 1993 James Clark (jjc@jclark.com) + + * tmac/tmac.s (par*box-draw): Set adjustment mode to l while + drawing box. + (B2): With -Tascii, leave additional vertical space before + and after. Ensure that the left and right indent is restored to + what it was even if the point size changes. Don't call + par@finish. Change the indent, line length and title length + directly. With -Tascii, make the width of the box 1n less. + (B1): Remember 1n at the current point size. Don't call + par@reset. Change the indent, line length and title length + directly. Ensure that the temporary indent is preserved. + (par*box-mark-top): Turn off no spacing mode. + +Thu Jun 3 17:47:14 1993 James Clark (jjc@jclark.com) + + * Makefile.in (dist): Use .gz suffix. + +Thu May 27 20:04:59 1993 James Clark (jjc@jclark.com) + + * troff/input.cc (main): Add return 0. + * pic/main.cc (main): Use return instead of exit. + * tbl/main.cc (main): Likewise. + * eqn/main.cc (main): Likewise. + * grops/ps.cc (main): Likewise. + * grotty/tty.cc (main): Likewise. + * groff/groff.cc (main): Likewise. + * grodvi/dvi.cc (main): Likewise. + * refer/refer.cc (main): Likewise. + * indxbib/indxbib.cc (main): Likewise. + * lkbib/lkbib.cc (main): Likewise. + * soelim/soelim.cc (main): Likewise. + * addftinfo/addftinfo.cc (main): Likewise. + * acgroff.m4 (GROFF_PROG_CCC, GROFF_CC_COMPILE_CHECK, + GROFF_COOKIE_BUG, GROFF_CC_ANSI_BUG): Likewise. + + * troff/token.h (process_input_stack): Don't declare as static. + * troff/input.cc: Likewise. + + * troff/node.c (invalidate_fontno): Make it a static member of + class font_family. Change callers. + * troff/node.c: Change declaration. + + * tbl/main.cc (struct input_entry_format): Add explicit public + specifier. + * tbl/table.cc (struct text_stuff, struct single_hline_stuff, + struct double_hline_stuff): Likewise. + * tbl/table.h (struct entry_format): Likewise. + * pic/object.h (struct saved_state): Likewise. + + * include/stringclass.h: Add forward declarations of friend + functions that are later declared as inline. Don't include inline + specifier in friend declaration. + + * libgroff/lib.h: Declare popen and pclose. + * acgroff.m4 (GROFF_POPEN): New macro. + * configure.in: Call it. + + * include/lib.h (PI): New constant. Undef first if necessary. + * tfmtodit/tfmtodit.cc (main): Use PI rather than M_PI. + * grops/ps.cc (degrees, radians): Likewise. + * libgroff/font.cc (font::get_skew): Likewise. + + * grops/ps.cc (is_ascii): New function. + (ps_output::put_string): Use is_ascii. Use csprint rather than + isprint. + (ps_printer::define_encoding): Use csspace. + * libgroff/strtol.c (ISASCII): New macro. + (strtol): Cast arguments to is*() and tolower() to unsigned char. + Use ISASCII rather than isascii. + * libgroff/cmap.cc: Use isascii() only if defines it. + * libgroff/cset.cc: Likewise. + * libdriver/input.cc: Include cset.h. + (do_file, get_integer, possibly_get_integer): Use csdigit() rather + than isdigit(). + + * refer/refer.cc (main): Use %ld rather than %d for longs. + + * libbib/index.cc (index_search_item_iterator::get_tag): Use + S_ISREG macro. + + * addftinfo/addftinfo.cc (param_t): Add explicit `int'. + +Mon May 24 08:51:37 1993 James Clark (jjc@jclark.com) + + * troff/input.cc (hyphenation_code): Skip white space between + char/code pairs. + +Sun May 16 08:15:52 1993 James Clark (jjc at jclark.com) + + * tbl/table.h (table::entry_list_tailp): New member. + (table::table): Initialize it. + (table::add_entry): Use entry_list_tailp to avoid O(n^2) + behaviour. + +Sat May 15 17:26:00 1993 James Clark (jjc at jclark.com) + + * grotty/tty.cc (tty_printer::add_char): Don't discard characters + with negative horizontal positions. Remove casts of glyph::hpos to + int. + (USHRT_MAX): Delete definition. + (SHRT_MAX, SHRT_MIN): New definitions. + (glyph::hpos): Change type to short. + (tty_printer::end_page): Output multiple backspaces if necessary. + Remove casts of glyph::hpos to int. + +Fri May 7 12:14:37 1993 James Clark (jjc at jclark.com) + + * tmac/tmac.s (@RT): New definition. + +Thu May 6 21:36:54 1993 James Clark (jjc at jclark.com) + + * refer/refer.cc (do_file): Make sure current_filename is set when + filename is "-". + + * pic/common.cc (common_output::dot_line): Handle zero length + lines. + +Sun May 2 19:54:16 1993 James Clark (jjc at jclark.com) + + * tmac/tmac.s (par@reset): Get value for .hy for \n[HY]. + (par@init): Initialize \n[HY]. + +Mon Apr 26 11:43:16 1993 James Clark (jjc at jclark.com) + + * troff/dictionary.cc (dictionary::remove): Continue when + r < j < i. + +Sun Apr 25 11:03:00 1993 James Clark (jjc at jclark.com) + + * Makefile.com (.y.cc): Avoid ending up with two versions of + $(YTABH). + +Thu Apr 22 21:03:45 1993 James Clark (jjc at jclark.com) + + * tmac/tmac.dvi (\(,c): Define only if it does not exist. + (\(,C): Likewise. Also fix typo. + +Wed Apr 21 08:47:32 1993 James Clark (jjc at jclark.com) + + * lib.h: Delete extraneous semi-colon. + + * Add pso request: `so' from a pipe. + * troff/input.c (file_iterator::file_iterator): Add 3rd argument. + (file_iterator::close): New function. + (file_iterator::~file_iterator, file_iterator::next_file): Use + file_iterator::close. + (file_iterator::backtrace): Say `process' rather than `file' when + the stream is popened. + (pipe_source): New function. + (init_input_requests): Bind ".pso" to pipe_source. + +Tue Apr 20 00:02:26 1993 James Clark (jjc at jclark.com) + + * afmtodit/afmtodit.pl: Avoid single quotes in comments. + + * pfbtops/pfbtops.c: Output 64 characters per line. Output hex + digits in lower case. + +Mon Apr 19 09:55:57 1993 James Clark (jjc at jclark) + + * Version 1.08 released. + + * Makefile.in (dist): Insert || true after ln -s commands that + might fail. + + * mm: Update to mm 1.16. + + * acgroff.m4 (GROFF_CSH_HACK): New macro. + * configure.in: Call GROFF_CSH_HACK. Substitute for + SH_SCRIPT_SED_CMD. + * Makefile.in (SH_SCRIPT_SED_CMD): New variable. Include in + MDEFINES. + * nroff/Makefile.sub (nroff): New target. + (install_data): Install nroff. + * eqn/Makefile.sub (neqn): Sed with SH_SCRIPT_SED_CMD. + * grog/Makefile.sub (grog): Sed grog.sh with SH_SCRIPT_SED_CMD. + +Sat Apr 17 08:24:28 1993 James Clark (jjc at jclark) + + * eqn/Makefile.sub (neqn): Add chmod +x. + + * grog/Makefile.sub (grog): Remove spurious semi-colon. + +Fri Apr 16 22:41:57 1993 James Clark (jjc at jclark) + + * troff/input.cc (string_iterator::string_iterator()): Initialize + lineno and count. + +Tue Apr 13 10:22:28 1993 James Clark (jjc at jclark) + + * troff/div.cc (macro_diversion::space, + top_level_diversion::space): Don't set high_water_mark. + (macro_diversion::output, top_level_diversion::output): Don't + include post line space in high water mark. + +Wed Apr 7 12:48:18 1993 James Clark (jjc at jclark) + + * eqn/eqn.y: Don't define YYDEBUG. + * pic/pic.y: Likewise. + +Mon Apr 5 10:15:15 1993 James Clark (jjc at jclark) + + * tmac/tmac.e ([3): Add space after comma following editors. + Change double spaces to single spaces. + ([4): Change double spaces to single spaces. + + * grops/ps.h (USE_PS_ADOBE_2_0): New flag for broken_flags. + * grops/ps.cc (ps_printer::~ps_printer): If the USE_PS_ADOBE_2_0 + bit is set in broken_flags, use 2.0 rather than 3.0 as the version + after %!PS-Adobe- (for Newsprint). + + * troff/div.cc (top_level_diversion::begin_page): When + before_first_page is 1, set page_number to 1. + +Sun Apr 4 14:28:53 1993 James Clark (jjc at jclark) + + * eqn/box.cc (box::top_level): Protect equation with \&. + +Sat Apr 3 23:27:25 1993 James Clark (jjc at jclark) + + * groff/groff.cc (possible_command::set_name): Delete old name. + + * groff/groff.cc (possible_command::~possible_command): Use + a_delete. + + * troff/node.cc (troff_output_file::begun_page): New member. + (troff_output_file::troff_output_file): Initialize it. + (troff_output_file::really_begin_page): Only output V command if a + page has been begun. + + * pic/pic.y (placeless_element): Delete argument to PRINT after + use. + +Fri Apr 2 11:31:02 1993 James Clark (jjc at jclark) + + * Make wrapman work. + * troff/div.h (class top_level_diversion): Replace + first_page_begun by before_first_page (with opposite sense). + * Change first_page_begun to before_first_page inverting sense. + * troff/div.cc (class nl_reg): New class. + (init_div_requests): Use class nl_reg for \n(nl. + (top_level_diversion::begin_page): Don't call + output_file::begin_page if before_first_page is 2; + reset before_first_page afterwards. If have_next_page_number is + false, then always increment page_number. + * tmac/tmac.an: Set traps within TH rather than at the top-level. + Restore compatibility mode after loading, and then disable + compatibility mode in TH. + +Thu Apr 1 11:09:34 1993 James Clark (jjc at jclark) + + * grotty/tty.cc (tty_printer::end_page): Don't discard characters + past last line. + * troff/node.h (output_file::trailer): Declare. + * troff/div.cc (cleanup_and_exit): Call output_file::trailer(). + * troff/node.cc (output_file::trailer): New function. + (troff_output_file::~troff_output_file): Move most code into... + (troff_output_file::trailer): New function. + (class troff_output_file): Delete page_length member. Declare + trailer(). + (troff_output_file::really_begin_page): Use current page length + for final V command. + + * tbl/main.cc (struct options): New decimal_point_char member. + (options::options): Initialize this. + (process_options): Implement decimalpoint option. + (process_data): Pass decimal_point_char option to table::table. + * tbl/table.h (class table): New decimal_point_char member. + (table::table): Add additional argument. + * tbl/table.cc (find_dot): Rename to find_decimal_point. Add + second argument specifying decimal point character. Use this + instead of '.'. + (table::table): Initialize decimal_point_char. + (table::add_entry): Change call to find_dot. + + * troff/input.cc (get_copy, token::next): Implement \V. + (interpolate_environment_variable): New function. + +Tue Mar 30 14:41:39 1993 James Clark (jjc at jclark) + + * pic/lex.cc (lookup_keyword): Rename MIN to K_MIN, MAX to K_MAX. + * pic/pic.y: Likewise. + + * grotty/tty.cc (tty_printer::add_char, tty_printer::end_page): + Add casts to int. + * refer/ref.cc (reference::insert_field, reference::delete_field): + Likewise. + * troff/number.cc (parse_term): Likewise. + + * acgroff.m4 (GROFF_PROG_YACC): New macro. + * configure.in: Use GROFF_PROG_YACC. + + * acgroff.m4 (GROFF_PROG_CCC): Don't add -O automatically for gcc + and g++. + * Makefile.in (OPTIMIZE): New define. + (DEBUG): Empty by default. + (CCFLAGS, CFLAGS): Include $(OPTIMIZE). + + * acgroff.m4 (GROFF_SYS_SIGLIST): Don't quote program. + (GROFF_ARRAY_DELETE): Likewise. + (GROFF_CC_COMPILE_CHECK): Quote use of $2 and $3. + + * troff/env.cc (trie::~trie): Make virtual to shut up g++. + + * devps/psstrip.sed: Use different delimiter on last line (so that + it works with BSD 4.4 sed.) + +Mon Mar 29 17:07:14 1993 James Clark (jjc at jclark) + + * devps/psstrip.sed: Delete comments. + + * acgroff.m4 (AC_GETOPT): Don't test whether declares + optind, opterr, optarg. + * lib.h: When UNISTD_H_DECLARES_GETOPT is defined, declare optind, + opterr, optarg. + +Sun Mar 28 17:44:25 1993 James Clark (jjc at jclark) + + * Makefile.in (check): Dummy target. + +Wed Mar 3 04:53:38 1993 James Clark (jjc at jclark) + + * Version 1.07 released. + + * Integrate mm 1.11. + + * tbl/table.cc (alphabetic_block_entry::print): start_row was used + where start_col was meant. + +Thu Feb 25 07:55:36 1993 James Clark (jjc at jclark) + + * grog/grog.sh, grog/grog.pl: Recognize PH and SA as -mm macros. + +Wed Feb 24 10:15:34 1993 James Clark (jjc at jclark) + + * troff/input.cc (token::next): Make \z\o'...' and similar things + work. + + * env.h (MARGIN_CHARACTER_ON, MARGIN_CHARACTER_NEXT): New + constants. + (environment): Add margin_character_flags member. + * env.cc (environment::environment(symbol), + environment::environment(const environment *): Initialize + margin_character_flags. + (margin_character): Rewrite. + (environment::output_line): Add a margin character if + margin_character_flags is non-zero. Turn off the + MARGIN_CHARACTER_NEXT bit. If that makes margin_character_flags + zero, use margin_character_node without copying and then set + margin_character_node to 0. + + * devps/DESC.in: Change minimum size to 1000. + +Tue Feb 23 14:57:49 1993 James Clark (jjc at jclark) + + * troff/symbol.h (symbol::hash): Change return type to unsigned + long. + * troff/dictionary.cc (dictionary::lookup, dictionary::remove): + Add casts to int. + + * test-groff: Use -r rather than -x. + + * grops/psfig.diff: Include in distribution again. + +Mon Feb 22 09:10:44 1993 James Clark (jjc at jclark) + + * Makefile.in (dist): Use gzip. + +Sun Feb 21 11:12:53 1993 James Clark (jjc at jclark) + + * acgroff.m4 (GROFF_GETOPT): Check for declaration of getopt() in + unistd.h as well as in stdlib.h. + * include/lib.h: Include is STDLIB_H_DECLARES_GETOPT is + defined; otherwise include and if + UNISTD_H_DECLARES_GETOPT is defined. + + * configure.in: use builtin(include, ... rather than include(... + * configure: Regenerate with autoconf 1.3. + + * libdriver/print.cc (printer::adjust_arc_center): Use new + algorithm suggested by Andy Fyfe. + + * libdriver/printer.cc (printer::adjust_arc_center): New function. + * include/printer.h: Declare this. + * grops/ps.cc (ps_printer::draw): Use it. + * grodvi/dvi.cc (dvi_printer::draw): Use it. + +Fri Feb 19 23:13:51 1993 James Clark (jjc at jclark) + + * Makefile.comm (.man.n): Replace macrodir by tmacdir. + +Thu Feb 11 16:46:59 1993 James Clark (jjc at jclark) + + * eqn/main.cc (main): Handle "eqn -". + +Mon Jan 4 20:29:56 1993 James Clark (jjc at jclark) + + * tmac/tmac.e (++): Install fix from comp.bugs.4sd. + + * mm: Integrate version 1.08. + + * pic/troff.cc (troff_output::finish_picture): Set + EQN_NO_EXTRA_SPACE reg to 0 rather than removing it. + * eqn/box.cc (box::extra_space): Set EQN_NO_EXTRA_SPACE_REG to 0 + if it's not defined. Check whether the register is non-zero rather + than whether it's not defined. + * tmac.e ({, <): Make argument to \x zero if \n(0x is non-zero. + + * indxbib/indxbib.cc: Move all signal handling into... + * indxbib/signal.c: New file. + * configure.in: Call AC_RETSIGTYPE. + + * acgroff.m4 (GROFF_STRUCT_EXCEPTION): New macro. + * configure.in: Call GROFF_STRUCT_EXCEPTION. + * libgroff/matherr.c: Protect with ifdef HAVE_STRUCT_EXCEPTION. + + * troff/input.cc (token::token, token::operator=): Work round SGI + C++ bug. + * pic/object.cc (position::position): Likewise. + +Mon Dec 28 21:50:21 1992 James Clark (jjc at jclark) + + * pic/pic.h: Move declaration of hypot(). + +Wed Dec 16 12:28:29 1992 James Clark (jjc at jclark) + + * pic/pic.h: Declare hypot(). + + * pic/pic.h: Define M_PI if necessary. + +Thu Dec 10 12:03:29 1992 James Clark (jjc at jclark) + + * tmac/tmac.e (re): Add alternative version that doesn't use groff + `.ta T' feature. + + * devps/prologue.ps (RE): Handle the possibility that the old font + doesn't have a FontName entry. + +Wed Dec 2 10:25:29 1992 James Clark (jjc at jclark) + + * tmac/tmac.e (fam): Redefine to set family in environment 2. + (@C): Use @fam not fam. + +Thu Nov 26 16:01:25 1992 James Clark (jjc at jclark) + + * lookbib/lookbib.cc (main): Change type of start to const char *. + * lkbib/lkbib.cc (main): Likewise. + + * eqn/lex.cc (definition::definition): Don't use member + initializer syntax for members of anonymous unions. + + * troff/input.cc (input_stack::backtrace): Change type of to const + char *. + +Wed Nov 25 13:43:09 1992 James Clark (jjc at jclark) + + * include/stringclass.h (class string): Declare inline friend + functions as inline in class declaration. + * troff/hvunits.h (class hunits, class vunits): Likewise. + * include/refid.h (class reference_id): Likewise + * troff/troff.h (points_to_units(units), scale(units, double)): + Delete declarations. + * libdriver/input.cc (get_char): Delete declaration. + * include/lib.h: Change 2nd argument of getopt from const char ** + to char **. + * troff/symbol.cc (symbol::symbol): Cast `new char *[n]' to `const + char **' before assigning to a `const char **'. + * tbl/table.cc: Delete extra declarations of prints(). + +Tue Nov 24 14:33:13 1992 James Clark (jjc at jclark) + + * libgroff/font.cc (font::load_desc): Cast `new char *[n]' to `const + char **' before assigning to a `const char **'. + + * libgroff/errarg.cc (errarg::errarg): Don't use member + initializer syntax for members of anonymous unions. + +Sat Nov 21 05:02:23 1992 James Clark (jjc at jclark) + + * mm: Integrate version 1.07. + +Tue Nov 17 16:44:27 1992 James Clark (jjc at jclark) + + * troff/input.c (translate2): Rename to + (translate_no_transparent). + (init_input_requests): Rename tr2 to trnt. + +Mon Nov 16 09:49:32 1992 James Clark (jjc at jclark) + + * troff/charinfo.h (class charinfo): Add transparent_translate field. + (charinfo::set_translation, charinfo::set_special_translation): + Add second argument that specifies value for + transparent_translate. + (charinfo::get_translation, charinfo::get_special_translation): + Add optional second argument that specifies whether translation is + being used for transparent throughput. + * troff/input.cc (charinfo::set_translation, + charinfo::set_special_translation): Handle second argument. + (charinfo::charinfo): Initialize transparent_translate. + (translate): Split main part off into + (do_translate): New function. Pass argument saying whether + translation applies to transparent throughput. + (translate2): New request. + (init_input_requests): Bind translate2 to `tr2'. + +Wed Nov 11 11:43:20 1992 James Clark (jjc at jclark) + + * tbl/table.h (class table): Add `nokeep' flag. + * tbl/main.cc (process_options): Handle `nokeep' option. + * tbl/table.cc (table::init_output, table::do_row, table::do_top, + table::do_bottom): Don't output keep/release macro definitions or + calls when `nokeep' option has been specified. + +Sat Nov 7 01:28:33 1992 James Clark (jjc at jclark) + + * tmac/tmac.Xps (Xps-char): Use " as delimiter for \Z. + +Wed Nov 4 16:29:04 1992 James Clark (jjc at jclark) + + * tbl/table.cc (table_entry::divert, block_entry::do_divert, + block_entry::divert, alphabetic_block_entry::divert): Add extra + argument giving column separation. + (table::compute_widths): Pass column separation to + table_entry::divert(). + (block_entry::do_divert): If an entry spans multiple columns and a + minimumum width has been specified for each column, then set the + line length to the sum of the widths (plus possibly the column + separations). + + * troff/input.cc (set_escape_char): Don't set the escape_char + until after calling has_arg(). + +Tue Nov 3 11:23:27 1992 James Clark (jjc at jclark) + + * tbl/table.cc (table::do_top): Add missing \s0 for double box + case. + + * tbl/table.cc (table::print_double_hline): Avoid extra new line + in case where r > nrows - 1. + + * tbl/table.cc (BODY_HEIGHT): Deleted. + (LINE_SEP): New definition. + (table::print_single_hline, table::print_double_hline, + table::compute_vrule_top_adjust, table::compute_vrule_bot_adjust, + table::do_row, table::do_top): Use LINE_SEP space before a line + instead of \n[.v]-BODY_HEIGHT-BODY_DEPTH. + + * tbl/table.cc (text_entry::print_contents): New function. + (text_string_name, right_text_string_name): Deleted. + (TEXT_STRING, RIGHT_TEXT_STRING): Deleted. + (simple_text_entry::do_width, numeric_text_entry::do_width, + alphabetic_text_entry::do_width): Don't store the contents of the + entry in a string. + (left_text_entry::simple_print, right_text_entry::simple_print, + center_text_entry::simple_print, + alphabetic_text_entry::simple_print, + numeric_text_entry::simple_print): Print the entry directly + instead of using the stored string. + +Fri Oct 30 10:39:32 1992 James Clark (jjc at jclark) + + * devps/Makefile: Strip PostScript files. + * devps/prologue: Rename to... + * devps/prologue.ps. + * devps/psstrip.sed: New file. + * devps/download: Use .pfa rather than .ps for installed versions + of fonts. + +Thu Oct 29 09:14:43 1992 James Clark (jjc at jclark) + + * troff/env.cc (input_trap): Give a warning if the argument is out + of range. + + * troff/env.cc (adjust): Treat negative argument as missing. Round + argument > 5 down to 5. + + * troff/env.cc (center, right_justify): Make negative argument zero. + + * troff/div.cc (page_offset, vertical_position_traps): Treat + invalid argument as missing. + * troff/env.cc (line_spacing, line_length, title_length, indent, + underline, hyphen_line_max_request, control_char, + no_break_control_char, widow_control_request, adjust, input_trap, + point_size): Likewise. + * troff/node.cc (ligature, kern_request, bold_font, track_kern, + constant_space): Likewise. + * troff/input.cc (compatible, shift, warn_request, + set_escape_char): Likewise. + + * tbl/main.cc (format::format): Avoid doing `new int[0]'. + * tbl/table.cc (table::table): Likewise. + + * Makefile.dev (install_dev): depends on $(DEVFILES). + +Wed Oct 28 08:30:57 1992 James Clark (jjc at jclark) + + * devX75, devX75-12, devX100, devX100-12: New directories. + * Makefile.in: Add these to DEVDIRS. + + * troff/Makefile.sub, eqn/Makefile.sub, indxbib/Makefile.sub, + afmtodit/Makefile.sub, tmac/Makefile.sub, nroff/Makefile.sub, + grog/Makefile.sub, mm/Makefile.sub (uninstall_sub): New target. + * Makefile.in (uninstall, uninstall_sub, uninstall_dirs): New + targets. + * Makefile.ccpg, Makefile.cpg, Makefile.dev, Makefile.man + (uninstall): New target. + * Makefile.comm (uninstall, uninstall_sub, uninstall_man, + uninstall_prog, uninstall_dev): New targets. + + * troff/div.cc (return_request): Treat an invalid argument as + missing. + +Mon Oct 26 11:33:47 1992 James Clark (jjc at jclark) + + * tmac/tmac.e ((f): Set up the environment even when there's a + current diversion. Transperently throughput a call to @N. + (@N): New macro. + +Thu Oct 22 05:05:59 1992 James Clark (jjc at jclark) + + * tbl/table.cc (table::compute_vrule_top_adjust): Round adjustment + up to vertical resolution. + + * tbl/table.cc (table::do_row): Change row number after printing + stuff list. + + * pic/lex.cc (get_token_after_dot): Make .left and .right work. + +Wed Oct 21 14:46:45 1992 James Clark (jjc at jclark) + + * Rename CHANGES to NEWS. + +Tue Oct 20 23:25:21 1992 James Clark (jjc at jclark) + + * libgroff/new.cc (operator new): Avoid calling malloc(0). + +Mon Oct 19 09:10:13 1992 James Clark (jjc at jclark) + + * man.ultrix: Removed. + +Sun Oct 18 06:35:15 1992 James Clark (jjc at jclark) + + * Makefile.comm (extraclean): Delete files whose names begin with + `='. + + * pic/troff.cc (troff_output::text): Fix typo in implementation of + aligned text. + +Sat Oct 10 09:32:29 1992 James Clark (jjc at jclark) + + * troff/env.cc (hyphenate_request, vertical_spacing, no_number): + * troff/div.cc (page_length, need_space, space_request): Treat + invalid optional argument as missing. + * troff/env.cc (number_lines): If the first argument is present + but not a number, turn on line numbering, don't change the next + line number and parse the remaining arguments. + + * tmac/tmac.e (@q): Do the `ne' before changing to environment 2. + +Thu Oct 8 10:24:40 1992 James Clark (jjc at jclark) + + * eqn/box.h: Change declaration accordingly. + * eqn/box.cc (set_gsize): Change return type to int. Return 0 if + the specified size was bad but don't give an error. Check for + overflow. + * eqn/main.cc (main): Change caller. Leave validation to set_gsize. + * eqn/lex (do_size): Likewise. + +Wed Oct 7 09:48:59 1992 James Clark (jjc at jclark) + + * acgroff.m4 (GROFF_PROG_CCC): Use fopen when checking for C++ + compatible headers. + +Sun Oct 4 18:24:02 1992 James Clark (jjc at jclark) + + * tbl/table.cc (table::init_output): Improve error message when + table won't fit on one page. + +Fri Oct 2 10:41:40 1992 James Clark (jjc at jclark) + + * pic/troff.cc (troff_output::start_picture): Generate line + containing a horizontal motion equal to the width of the picture. + + * groff/groff.cc (main): Allow PROG_PREFIX to be set at runtime + using GROFF_COMMAND_PREFIX environment variable. + +Fri Sep 25 11:40:40 1992 James Clark (jjc at jclark) + + * mdate.sh: Use $NF rather than $(NF). + +Tue Sep 22 09:47:24 1992 James Clark (jjc at jclark) + + * pic/main.cc (main): Use %1 not %c in argument to warning. + + * eqn/main.cc (main): Output code to check that geqn was given the + correct -T option. + +Mon Sep 21 10:59:16 1992 James Clark (jjc at jclark) + + * Makefile.in (dist): Instead of doing `make -f ../Makefile', do + `ln -s ../Makefile .; make; rm -f Makefile'. + + * troff/hyphen: Rename to... + * troff/hyphen.us: + * troff/input.cc (main): Delete -H option. Don't call + read_hyphen_file(). + * troff/env.cc: Include searchpath.h and macropath.h. + (exception_dictionary): Deleted. + (ht): Deleted. + (read_hyphen_file): Deleted. + (hyphenation_language): New struct. + (class trie, class hyphen_trie): Move declarations up. + (trie_node::~trie_node): Deleted. + (trie::delete_trie_node): New function. + (trie::do_delete): New pure virtual function. + (hyphen_trie::do_delete): New function. + (trie::~trie): New function. + (hyphen_trie::~hyphen_trie): New function. + (trie::clear): No need to chcek that tp is not 0. + (current_language, language_dictionary): New variables. + (hyphen_word): Give an error if no current language. Use + exceptions dictionary in current language. + (hyphen_trie::read_patterns_file): Find file using macro_path. + Allow comments (starting with %) in patterns file. Don't make it + a fatal error if the file can't be found. + (hyphenate): Return if no current language. Get the exceptions + dictionary and the hyphenation patterns from the current language. + (set_hyphenation_language): New variable. + (hyphenation_patterns_file): New function. + (hyphenation_language_reg): New class. + (hyphenation_language_reg::get_string): New function. + (init_hyphen_requests): Bind "hla" to set_hyphenation_language and + "hpf" to hyphenation_patterns_file. Initialize `.hla' number + register. + * groff/groff.cc (main, help, synopsis): Delete -H option. + * include/Makefile.sub: Don't define HYPHENFILE. + * Makefile.in: Delete hyphenfile variable and remove from MDEFINES. + * Makefile.comm (.man.n): Don't substitute for HYPHENFILE. + * tmac/troffrc: Set hyphenation language to `us'. Load `hyphen.us' + hyphenation patterns. + +Sun Sep 20 09:33:02 1992 James Clark (jjc at jclark) + + * eqn/neqn.sh: New file. + * eqn/Makefile.sub: Handle neqn.sh. + + * eqn/eqn.h: Declare `nroff' variable. + * eqn/box.cc (param_table): Add `nroff' param. + (nroff): Define it. + * eqn/lex.cc (yylex): Handle TDEFINE and NDEFINE using `nroff' + variable. + * tmac/eqnrc: Set `nroff' to 1 for -Tascii or -Tlatin1. + + * troff/troff.h (WARN_FONT): New warning. + (WARN_TOTAL): Change accordingly. + * troff/input.cc (DEFAULT_WARNING_MASK): Include WARN_FONT. + (warning_table): Add WARN_FONT. + * troff/node.cc (mount_font_no_translate): Pass argument to + font::load_font. If this is non-zero, give a warning. + Don't give an error message when accessing a font that has already + been found to be invalid. + * include/font.h (font::load, font::load_font): Add additional + optional argument which suppresses error message if the font is + not found. + * libgroff/font.cc (font::load_font): Handle additional argument. + (font::load): Add additional argument. If this is non-null, set it + to 1 and don't give error message. + + * include/printer.h (printer::end_page): Add argument giving + length of page. + * libdriver/input.cc (do_file): Pass this. + * grops/ps.cc (ps_printer::end_page): Add argument. + * grodvi/dvi.cc (dvi_printer::end_page, + draw_dvi_printer::end_page): Add argument. + * grotty/tty.cc (class tty_printer): Remove lines_per_page and + columns_per_page members. New member nlines. + (DEFAULT_LINES_PER_PAGE): Deleted. + (tty_printer::tty_printer): Don't compute lines_per_page from + font::paperlength. Don't compute columns_per_page from + font::paperwidth. + (tty_printer::add_char): Don't check horizontal position against + columns_per_page. Grow glyphs vector if neccessary. + (tty_printer::end_page): Add argument giving page_length in units. + Discard lines past end of page. + +Wed Sep 16 06:29:52 1992 James Clark (jjc at jclark) + + * tmac/tmac.tty-char: Fix definition of \(/l. + + * tmac/tmac.X: Define \(en. + +Tue Sep 15 10:37:13 1992 James Clark (jjc at jclark) + + * acgroff.m4 (GROFF_PRINT): If a system has lpr and lp but not + lpq, then use lp rather than lpr. + + * tmac/tmac.s (par@reset): Don't call `ad'. + (par*env-init): Call `ad'. + +Sun Sep 13 18:48:20 1992 James Clark (jjc at jclark) + + * mdate.sh: Use $(NF) instead of $6 to extract year from output of + date. + + * troff/symbol.cc: #undef BLOCK_SIZE if it's defined. + * indxbib/indxbib.cc: Likewise. + +Sun Sep 6 09:44:46 1992 James Clark (jjc at jclark) + + * libgroff/putenv.c: New file. + * libgroff/Makefile.sub: Add putenv.c to CSRCS. + * Makefile.in: Say that putenv.o can be one of LIBOBJS. + * configure.in: Test for putenv with AC_REPLACE_FUNCS. Test for + stdlib.h with AC_HAVE_HEADERS. + +Sat Sep 5 18:11:52 1992 James Clark (jjc at jclark) + + * indxbib/dirnamemax.c: Include only if + does not exist. + +Fri Sep 4 09:43:26 1992 James Clark (jjc at jclark) + + * eqn/box.cc (gsize): Make it an int. + (set_gsize): Parse argument handling increment or decrement. + (box::top_level): Convert gsize to a string. + + * troff/input.cc (exit_troff): Make buf unsigned char []. + Call to make_temp_iterator casts buf to char*. + + * Makefile.in ($(TARGETS), dot): Pass $(MDEFINES) to recursive makes. + + * Makefile.ccpg (depend.temp): Depends on $(YTABC). + * Makefile.cpg (depend.temp): Likewise. + + * Makefile.dep: Remove Makefile.dep from $(REALCLEANFILES). + + * Makefile.comm: Add y.output to MOSTLYCLEANFILES. + +Thu Sep 3 08:01:55 1992 James Clark (jjc at jclark) + + * tmac/tmac.s (B, I, BI, CW): Rewrite avoiding aliases. + +Tue Sep 1 18:24:53 1992 James Clark (jjc at jclark) + + * Version 1.06 released. + + * Integrate mm 1.04. + +Fri Aug 28 11:28:19 1992 James Clark (jjc at jclark) + + * Makefile.comm, Makefile.ccpg, Makefile.cpg: Fix TAGS target. + +Thu Aug 27 11:03:33 1992 James Clark (jjc at jclark) + + * afmtodit/afmtodit.pl: Add -n option that disables generation of + ligatures command. + * devps/generate/Makefile (CR, CB, CI, CBI): Pass -n flag to + afmtodit. Regenerate. + + * tmac/tmac.e ()z): Adjust _b if necessary so as to avoid moving + @f back past the current position. + + * tmac/tmac.e: Change calls to @R so that comments are not part of + arguments. + +Tue Aug 25 10:42:07 1992 James Clark (jjc at jclark) + + * configure.in: Check for mkstemp with AC_HAVE_FUNCS. + + * acgroff.m4 (GROFF_PROG_CCC): Don't check for . Instead + check that we can link a call to a function declared in . + (GROFF_UNISTD_H): New macro. + * configure.in: Call it. + * Makefile.in: Document it. + * include/posix.h: New file. + * troff/troff.h: Don't include + * troff/input.cc: Include posix.h. + * libgroff/new.cc, libgroff/tmpfile.cc: Include posix.h rather than + osfcn.h. + * indxbib/indxbib.cc, libbib/{search.cc,linear.cc,index.cc}: + Include posix.h rather , , , + . + * indxbib/indxbib.cc (S_IRUSR, S_IRGRP, S_IROTH): Delete definitions. + * libbib/index.cc (S_ISREG, O_RDONLY): Delete definitions. + * libbib/search.cc (O_RDONLY): Delete definition. + * refer/refer.cc, include/driver.h, pic/pic.h, groff/groff.cc: + Don't include . + + * acgroff.m4 (GROFF_TIME_T): New macro. + * configure.in: Call it. + * Makefile.in: Document it. + + * acgroff.m4 (GROFF_TRADITIONAL_CPP): New macro. + * configure.in: Call it. + * Makefile.in: Document -DTRADITIONAL_CPP. + * include/ptable.h: Don't include generic.h. + (name2): Define it. + + * tmac/tmac.s (][): Make [T1 and [T2 aliases for [T. + Afterwards remove [T1 and [T2. + (ref*spec!0, ref*spec!2): Use T1 rather than T. + (ref*spec!1, ref*spec!4, ref*spec!4): Use T2 rather than T. + (ref*add-T2): Renamed from ref*add-T. + (ref*add-T1): New macro. + +Mon Aug 24 11:11:11 1992 James Clark (jjc at jclark) + + * acgroff.m4 (AC_PROG_CCC): Use GROFF_EXIT rather than exit 1. + + * libbib/index.cc: Include . + (O_RDONLY): Define if necessary. + (make_index_search_item, index_search_item_iterator::get_tag, + index_search_item::check_files): Use O_RDONLY. + * libbib/seach.cc: Include , , . + (O_RDONLY): Define if necessary. + (search_list::add_file): Use O_RDONLY. + * indxbib/indxbib.cc: Include , , + . + (S_IRUSR, S_IRGRP, S_IROTH): Define if necessary. + (main): Use these. + + * libbib/index.cc (S_ISREG): Define it if necessary. + (index_search_item::load): Use S_ISREG. + + * include/driver.h: Include . + +Sun Aug 23 11:32:18 1992 James Clark (jjc at jclark) + + * eqn/box.cc (body_height): Increase default value to 85. + (body_depth): Increase default value to 35. + +Fri Aug 21 05:34:42 1992 James Clark (jjc at jclark) + + * eqn/pbox.h (SAVE_FONT_STRING): Define it. + * eqn/box.cc (box::top_level): Hide use of \R in a string that is + protected from expansion with \E. + + * acgroff.m4 (GROFF_PAGE): Use `case' to test domain. + + * Makefile (Makefile): New target. + + * Makefile.sub (configure, distfiles): New targets. + + * acgroff.m4 (GROFF_BROKEN_SPOOLER_FLAGS): Avoid using ${var:-val} + construct. + +Thu Aug 20 12:27:26 1992 James Clark (jjc at jclark) + + * eqn/box.cc (param_table): Add body_height and body_depth. + + * eqn/lex.cc (def_table): Make circumflex in hat_def roman. + +Tue Aug 18 16:24:25 1992 James Clark (jjc at jclark) + + * psbb/Makefile.sub: Don't link with libgroff.a. + + * acgroff.m4 (GROFF_PUTENV): New macro. + * configure.in: Call GROFF_PUTENV. + * Makefile.in: Document STDLIB_H_DECLARES_PUTENV. + * groff/groff.cc: Don't declare putenv if STDLIB_H_DECLARES_PUTENV + is defined. + + * troff/env.cc (distribute_space): Rename force_forward argument + to force_reverse. Reverse the list if force_reverse is true. + +Mon Aug 17 17:49:05 1992 James Clark (jjc at jclark) + + * tmac/tmac.an: Don't define a string `T'. Just define Tm. + + * eqn/pile.cc (matrix_box::compute_metrics): Don't allow computed + height or depth to be negative. Guard against SUP_RAISE quantity + being negative. + +Sat Aug 15 08:18:54 1992 James Clark (jjc at jclark) + + * devps/generate/textmap: Add `an' (arrowhorizex). + * tmac/tmac.ps: \(an overlaps horizontally. + * tmac/tmac.dvi, tmac/tmac.tty: Add `an'. + + * devps/symbolchars: Add arrowverttp, arrowvertbt. + * devps/textmap: Add arrowvertex. + * eqn/delim.cc (delim_table): Add uparrow, downarrow and + updownarrow delimiters. + * tmac/tmac.ps, tmac/tmac.X: Add definition of \(va. + + * tbl/table.cc (simple_entry::position_vertically, + block_entry::position_vertically): For a centered entry, perform + the motion in two stages. + + * refer/refer.cc (split_punct): Don't call lookup_token if there + is no token. + +Fri Aug 14 11:14:58 1992 James Clark (jjc at jclark) + + * troff/input.cc (token::next): Delete token_node after copying + token. + + * grodvi/grodvi.cc (dvi_printer::dvi_printer): Initialize + cur_point_size. + + * libdriver/printer.cc (printer::load_font): Delete old_font_table. + + * grops/ps.cc (ps_printer::define_encoding): Delete elements of vec. + +Tue Aug 11 13:50:38 1992 James Clark (jjc at jclark) + + * grops/ps.cc (usage): -b option takes an argument. + + * devps/prologue (PLG): New procedure. + * grops/ps.cc (main, usage): New -g option. + (ps_printer::~ps_printer): If guess_flag is set, guess the paper + length using PLG. + +Mon Aug 10 11:17:53 1992 James Clark (jjc at jclark) + + * include/cset.h: Include if we have it. + + * libgroff/illegal.cc: New file. + * include/lib.h (illegal_input_char): Use table. + * troff/input.cc (ESCAPE_RIGHT_PARENTHESIS): Renumber to 0206. + * pic/lex.cc (ARG1): Renumber to 14. + * eqn/lex.cc (ARG1): Likewise. + + * troff/Makefile.sub (majorminor.cc): Handle 3 part versions + (eg 1.05.90) correctly. + +Sun Aug 9 13:35:43 1992 James Clark (jjc at jclark) + + * tmac/tmac.e (sr): Deleted. Set $r and $R directly. + Rename $r and $R registers to $v and $V. + ($r, $R): Initialize to 0. + (@v, @V): New macros. + (sz): Call @v. + (@M): Call @V. + + * troff/input.cc (main, usage): Add -R option that says not to + load troffrc. + * eqn/main.cc (main, usage): Rename -n to -R. + +Sat Aug 8 00:16:00 1992 James Clark (jjc at jclark) + + * devps/DESC.in: Leave font positions 5-9 blank. + * devdvi/DESC.in: Likewise. + + * grog/grog.pl: Handle `.PS 0. + + * macros/tmac.e (@R, @S): New macros. + Declare @, po, $0, $i, $p, df, so, fu, bt, *, ?a, ?b, ?C, ?e, ?H, + ?I, ?n, ?o, ?R, ?s, ?T, ?W, ?w registers with @R. + Declare $H, $[0-9], .. macros with @S. + Declare |0, |1, |2, |3 strings with @S. + + * macros/tmac.e (@S): Rename to @U. + + * macros/tmac.e (@z): Define @b and bp as empty instead of + deleting them, + + * macros/tmac.e (@m): Deleted. + (@h): Don't call @m. + (@z): Don't set @m trap. + + * macros/tmac.e ($h, $f): Define |z as empty string. + + * macros/tmac.e (@D): Rework to avoid unbalanced .el requests. + (@q): Likewise. + + * macros/tmac.e (@h): Set ?H, ?C , ?s registers to 0 rather than + removing them. + ()f): Likewise for * register. + + * macros/tmac.e (sr): Don't ever scale the arguments. If the third + argument is missing, don't change $R. Call sr with three + arguments when initializing. + +Thu Jul 16 12:17:12 1992 James Clark (jjc at jclark) + + * macros/tmac.e (sr): New macro. + Initialize $r and $R using sr. + + * macros/tmac.e (,): Delete \*(#[. + + * troff/env.c (set_tabs): Read the tab type even if the position + is bad. Allow the position of the first tab stop to be negative. + +Wed Jul 15 13:14:37 1992 James Clark (jjc at jclark) + + * refer/dirnamemax.c: Use pathconf() if defines + _POSIX_VERSION. + * refer/Makefile: Compile dirnamemax.c using -DHAVE_UNISTD_H + rather than -DPATHCONF_MISSING. + * Makefile: Get rid of PATHCONF_MISSING. + + * refer/map.c: New file. + * refer/index.c: Interface to mmap through map.c. Rename map_size + to map_len. + * refer/Makefile: Handle map.c. + * Makefile: Include -DHAVE_MMAP in OLDCFLAGS rather than CFLAGS. + +Tue Jul 14 14:15:20 1992 James Clark (jjc at jclark) + + * Makefile: RANLIB should be `true' if there is no ranlib. + * lib/Makefile (libgroff.a): Simplify. + * driver/Makefile (libdriver.a): Simplify. + + * Makefile: Change -DWAIT_COREDUMP_0200 to -DWCOREFLAG=0200. + * groff.c (WCOREDUMP): Use WCOREFLAG. Define only if not already + defined. + +Sat Jul 11 09:19:17 1992 James Clark (jjc at jclark) + + * troff/env.c (compare_ranges): Declare as extern "C". + + * troff/input.c (init_registers): Use `struct tm' instead of `tm'. + + * macros/tmac.s, macros/tmac.e: Change .nx /dev/null to .nx. + +Wed Jul 8 11:52:27 1992 James Clark (jjc at jclark) + + * pic/troff.c (troff_output::text): Merge in grops_output::text, + but conditionalize use of \X based on \*(.T. + (grops_output::*): Deleted. + * pic/output.h: Delete declaration of make_grops_output. + * pic/main.c (main): Ignore -p and -x. driver_extension_flag is 1 + by default. -n sets it to 0. + (usage): Corresponding changes. + * groff.c (main): Don't pass -x or -p to pic. + * groff.sh: Likewise. + + * ps/ps.c (ps_printer::do_exec, ps_printer::do_file): Force ndefs + to be non-zero. + + * ps/devps/afmtodit: Change calculation of asc_boundary and + desc_boundary. Make these bounds inclusive. + * ps/devps: Regenerate font files. + +Tue Jul 7 13:14:15 1992 James Clark (jjc at jclark) + + * macros/tmac.latin1: New file. + * macros/tmac.tty-char: Use tmac.latin1. + (tmac.tty-tr): Deleted. + * macros/Makefile: Install tmac.latin1. + * macros/tmac.dvi: Use tmac.latin1. + * macros/troffrc: Translate \[char160] onto no-break space here. + * macros/{tmac.dvi,tmac.ps,tmac.tty,tmac.X75}: Don't do it here. + +Mon Jul 6 11:06:52 1992 James Clark (jjc at jclark) + + * macros/tmac.Xps: Use `do' request. + + * macros/tmac.ps: Use `do' request. + + * macros/tmac.e (@C): Use `do' request. + + * macros/tmac.X, macros/tmac.Xps: Moved from xditview. + * macros/Makefile: Install tmac.X*. + + * tty/tmac.tty, tty/tmac.tty-char: Move to macros. + * tty/Makefile: Don't install tmac.tty*. + * macros/Makefile: Install tmac.tty*. + + * dvi/tmac.dvi: Move to macros. + * dvi/Makefile: Don't install tmac.dvi. + * macros/Makefile: Install tmac.dvi. + + * ps/tmac.ps*: Move to macros. + * ps/Makefile: Don't install tmac.ps*. + * macros/Makefile: Install tmac.ps*. + + * eqn/box.c: Provide draw_lines parameter corresponding to -D + option. + * macros/eqnrc: Set draw_lines parameter based on device. + * groff.c: Don't pass -D flag to eqn. + * groff.sh: Likewise. + * eqn/main.c: Warn about use of -D. + + * troff/input.c (process_startup_file): New function. + (main): Call process_startup_file(). + * macros/troffrc: New file. + * macros/Makefile: Install troffrc. + * groff.c (main): Don't pass extra -m option to troff. For a + pseudo device pass the name of the pseudo device to troff using + -d. + * groff.sh: Likewise. + * groff.c (possible_command::prepend_arg): Deleted. + + * troff/input.c (do_request): New function. + (init_input_requests): Bind "do" to do_request. + + * eqn/main.c (main): Instead of loading eqnchar from device directory, + load eqnrc from macro directory. + * macros/eqnrc: New file. + * macros/Makefile: Install eqnrc. + * ps/devps/eqnchar: Deleted. + * ps/devps/Makefile: Don't install eqnchar. + * dvi/devdvi/eqnchar: Deleted. + * dvi/devdvi/Makefile: Don't install eqnchar. + * groff.c (main): Pass -M to eqn. Don't pass -F to eqn. New + variable optM. + + * lib/device.[ch]: New files. + * lib/font.h (font::set_device_name, font::get_device_name): + Deleted. + * lib/fontfile.c: Use device.h. + * lib/Makefile: Handle device.[ch]. Make paths.h define DEVICE. + * troff/input.c: Delete definition of `device'. + (main): Don't initialize device. + * troff/troff.h: Include device.h rather than declaring device. + * troff/Makefile: No need to handle DEVICE. + * driver/input.c: Include device.h. Don't use + font::{set,get}_device_name. + * groff.c, Makefile: Rename device.h to config.h. + * groff.c: Use library device variable. + * eqn/main.c: Use library device variable. + * eqn/Makefile: No need to handle DEVICE. + + * lib/searchpath.[ch]: New files. + * lib/Makefile: Handle searchpath.[ch]. + * troff/input.c (open_file, init_dirs): Deleted. + (macro_dirs): Deleted. + (open_mac_file, macro_source): Use class search_path. + (add_string, struct string_list): Move definition. + (main): Change -M option to use macro_path. Delete call to + init_dirs(). + * lib/fontfile.c (font::command_line_font_dir, font::open_file): + Rewrite to use class search_path. + * lib/font.h, lib/fontfile.c (font::cl_font_dirs): Deleted. + * lib/Makefile: fontfile.c depends on searchpath.h. + * lib/Makefile: Rename fontpath.h to paths.h. Make paths.h define + MACROPATH. + * lib/macropath.[ch]: New files. + * troff/Makefile: No need to handle MACROPATH. + + * troff/input.c: Delete DUMP code. + * lib/fontfile.c, lib/font.h: Delete + font::forget_command_line_font_dirs. + + * troff/input.c (push_token): New function. + (handle_first_page_transition): Use push_token(). + (process_input_stack): Change handling of a space at the beginning + of the line. + +Sun Jul 5 17:11:09 1992 James Clark (jjc at jclark) + + * troff/input.c (font_dirs): Delete unused variable. + + * eqn/lex.c (do_set): Correct error messages. + +Sat Jul 4 10:20:55 1992 James Clark (jjc at jclark) + + * troff/input.c (do_define_string): Allow the string name to be + followed immediately by a tab. + (define_character): Likewise. + +Thu Jul 2 10:59:15 1992 James Clark (jjc at jclark) + + * ps/ps.c (ps_printer::draw): When drawing an arc, don't allow k to + be negative. + + * troff/input.c (input_iterator::is_file): New virtual function. + (file_iterator::is_file): New function. + (input_stack::end_file): New function. + (input_stack::next_file): Handle the situation where there is no + file on the input stack correctly. Avoid making two passes over + the input stack. + (next_file): Make the filename optional; in this case call + input_stack::end_file(). + +Wed Jul 1 10:17:25 1992 James Clark (jjc at jclark) + + * dvi/tmac.dvi: Change the definitions of \(ul and _ so that they + produce a real _ charater when the current font is CW and _ + otherwise. + + * lib/errarg.c (errarg::errarg(const char *)): Invert conditional + expression to work around gcc 2.2 bug. + +Wed Jun 24 08:12:24 1992 James Clark (jjc at jclark) + + * eqn/main.c (main): Don't give an error if we can't find eqnchar. + + * troff/env.c (environment::add_padding): New function. + (environment::add_char): Use add_padding(). + (environment::space): Likewise. + (environment::wrap_up_field): Add some padding if there is none + and there's no current tab. + * troff/env.h: Declare environment::add_padding. + +Mon Jun 22 08:37:45 1992 James Clark (jjc@jclark) + + * pic/pic.y: undef fmod and rand before declaring them. + +Sun Jun 14 11:40:18 1992 James Clark (jjc@jclark) + + * troff/input.c (main): If the DESC file specifies a font name of + 0, then leave the corresponding font position empty. + + * nroff.sh: New file. + * Makefile (install.nobin): Install nroff.sh. + + * tty/devlatin1/R.proto: Add ao as synonym for de. + * tty/tmac.tty-char: Define ao as o. + + * tty/dev{ascii,latin1}/R.proto: Add aq. + * tty/tmac.tty-char: Delete definition of aq. + +Mon Jun 8 11:43:20 1992 James Clark (jjc@jclark) + + * troff/input.c (init_charset_table): Don't translate 0240. + * ps/tmac.ps: Translate char160 to space. + * dvi/tmac.dvi: Likewise. + * tty/tmac.tty: Likewise. + +Sun Jun 7 10:52:35 1992 James Clark (jjc@jclark) + + * dvi/tmac.dvi: Add support for all Latin-1 characters. + + * macros/tmac.s: Delete definitions of \(rg, \(ah, \(ad, \(a-, + \(ao, \(ac, \(ho, \(-D, \(Sd, \(TP, \(Tp, \(ss, \(AE, \(ae, \(OE, + \(oe, \(r?, \(r!. + + * tty/tmac.tty-char: Add \(ah. + + * dvi/tmac.dvi: Add definitions of Tp, TP, Sd, -D, ho. + No need to define \(FM and \(!/. Conditionalize all character + definitions. + + * ps/devps/lgreekmap: Add +h, +f, +p. + + * ps/tmac.psnew: New file. + * ps/Makefile: Install tmac.psnew. + + * troff/input.c (charinfo_to_node_list): Don't ever interpret + character definitions in compatible mode. + + * troff/input.c (remove_character): New function. + (init_input_requests): Bind remove_character to "rchar". + + * ps/tmac.psold: New file. + * ps/Makefile: Install tmac.psold. + * ps/tmac.ps: Load tmac.psold. Move definitions of ISO Latin-1 + characters into tmac.psold. Make these definitions unconditional. + + * tty/tmac.tty-char: Define \n(_C only if it is not already defined. + + * ps/tmac.ps: Don't define \('c and \('C. + + * ps/devps/textmap: Move Greek characters to... + * ps/devps/symbolchars: + +Sat Jun 6 16:41:17 1992 James Clark (jjc@jclark) + + * ps/devps/text.enc: Add quotesingle. + * ps/devps/textmap: Add +h, +f, +p, Fn, Bq, bq, aq, lz. + * tty/tmac.tty-char: Likewise. + * dvi/devdvi/texmi.map: Add +h, +f, +p. + * dvi/devdvi/texi.map: Add Fn. + * dvi/devdvi/msam.map: Add lz. + * dvi/tmac.dvi: Handle Bq, bq, aq. + + * pic/lex.c (get_token): Recognize 'th. + * pic/map.y: Allow `expr'th in contexts where ORDINAL was allowed. + +Fri Jun 5 11:20:46 1992 James Clark (jjc@jclark) + + * ps/devps/textmap: Move di, mu, +- to... + * ps/devps/symbolchars: + + * macros/tmac.s (@XS): Don't call par@reset or fi. + (XA): Call LP. Turn off adjustment. Reduce line length. + + * macros/tmac.s: Initially alias XS to LP. + (XS): Rename to @XS. + (cov*ab-init): Alias XS to @XS. + +Thu Jun 4 09:12:05 1992 James Clark (jjc@jclark) + + * troff/token.h: Delete TOKEN_CHAR_HEIGHT, TOKEN_CHAR_SLANT, + TOKEN_FONT_NAME, TOKEN_FONT_POSITION, TOKEN_SIZE tokens. + (token::is_size, token::changes_env): Deleted. + * troff/number.c (parse_term): No need to process \s explicitly. + Call tok.next() only after scale indicator has been processed. + * troff/input.c (do_overstrike, do_bracket): No need to process \s, + \f etc explicitly. + (token::next): Handle \s, \f, \S, \H immediately rather than + returning them as tokens. + (token::operator==, token::description, token::add_to_node_list, + token::process): Remove handling of deleted tokens. + + * troff/env.c (environment::add_char): When adding padding + indicator character, call start_line() if necessary. + +Wed Jun 3 09:55:50 1992 James Clark (jjc@jclark) + + * ps/devps/afmtodit: Don't output 0 kerns. + + * ps/devps/afmtodit: Remove directory from name of encoding in + font description file. + + * ps/devps/afmtodit: Improve error messages. + + * ps/devps/afmtodit: Allow DESC file to be specified with -d. + + * ps/devps/Makefile: Incorporate FontMakefile. Rework. + * ps/devps/FontMakefile: Deleted. + * ps/devps/afmname: New file. + + * ps/devps/symbol.sed: New file. + * ps/devps/symbol.diff: Deleted. + * ps/devps/FontMakefile: Generate symbol.afm using symbol.sed. + Generate zapfdr.afm from zapfd.afm. + + * tty/tmac.tty (tty-char): Prefix definition with ". + + * macros/tmac.an (TP): Don't start a diversion if one has already + been started. + + * tty/tmac.tty-char: Add Latin-1 characters. + + * tty/tmac.tty-char: Incorporate suggestions from Paul Eggert. + +Tue Jun 2 00:54:34 1992 James Clark (jjc@jclark) + + * tbl/table.c (table::allocate): Delete old_vline, old_entry. + Move declaration of struct horizontal_span. + + * tbl/table.c (table::table): Initialize span_list. + (table::~table): Delete span_list. + + * lib/ptable.h (PTABLE(T)::~PTABLE(T)): Delete v. + + * ps/devps/Makefile: Avoid dependency on GNU make. + + * ps/tmac.ps: Check that character does not already exist before + defining it. + + * tty/tmac.tty: Add definitions of \(ff, \(!=, \(==, \(~=, \(sq, + \(OE, \(oe, \(AE, \(ae, \(lh, \(rh. Delete definitions of \(en, + \(ru, \(ul, \(br, \(bv, \(sl which are in the font description + files. + + * tty/tmac.tty-char: New file. + * tty/Makefile: Install tmac.tty-char. + * tty/tmac.tty: Move definitions of \(ua, \(da, \(uA, \(dA into + tmac.tty-char. + + * tty/tmac.tty: Fix definition of \(34. + + * tty/dev{ascii,latin1}/R.proto: Add ha and ti. Map + bracket-drawing characters onto |. Add *o. + + * troff/env.c (environment::wrap_up_tab): Increment field_spaces + only if current_field. + + * troff/dictionary.c (dictionary::lookup): Free old_table after + rehashing. + +Mon Jun 1 10:15:22 1992 James Clark (jjc@jclark) + + * tty/dev{ascii,latin1}/R.proto: Add uppercase Greek characters + whose glyphs are identical to glyphs of some Roman character. + + * tty/devlatin1/R.proto (bu): Deleted. + * tty/devascii/R.proto (bu): Deleted. + * tty/tmac.tty: Add definition of \(bu. + + * eqn/main.c (do_file): Pass FILE as argument. + (main): Automatically load eqnchar. New options -F and -n. + Pass do_file an opened FILE. + * groff.c: Don't pass eqnchar to eqn. Pass -F options onto eqn. + No need to include font.h. + * groff.sh: Likewise. Don't need to use - for standard input. + Prefix files with -- if first file starts with -. + + * macros/tmac.e: Conditionalize use of \$* on \n(.g. + + * troff/env.c (environment::possibly_break_line): Don't set line + to 0 across call to output_line(). Don't call output_line() until + after discarding nodes after break. + +Sun May 31 10:45:29 1992 James Clark (jjc@jclark) + + * request.h (macro::empty): Declare it. + * input.c (macro::empty): New method. + (interpolate_macro): Don't give a WARN_SPACE if the two-character + macro is empty. + +Sat May 30 10:27:15 1992 James Clark (jjc@jclark) + + * troff/env.c (environment::start_field): Decrement space_total + when a space is frozen. + +Fri May 22 14:34:38 1992 James Clark (jjc@jclark) + + * macros/tmac.an (R): Delete macro. + + * troff/input.c (get_copy, token::next): Support \# (like \" but + newline is ignored). + + * troff/input.c (token::next): Fix error message in 'Y' case. + +Thu May 21 09:26:24 1992 James Clark (jjc@jclark) + + * eqn/delim.c (define_extensible_string): Recognize any prefix of + a delimiter name. + +Fri May 15 10:20:41 1992 James Clark (jjc at jclark) + + * c++test.c: Include . + + * lib/strtol.c, lib/getcwd.c, ps/psbb.c: Declare errno in case + doesn't. + +Fri May 8 09:37:19 1992 James Clark (jjc at jclark) + + * tbl/table.c (table::divide_span): Don't count column separation + if expand was specified. + + * tbl/main.c (process_format): Don't ignore width specs in + continued format. Give warning for changing equal widths or + column separation in continued format. + (process_data): Set column separation, minimum width, equal + columns at end of table. + +Thu May 7 08:50:40 1992 James Clark (jjc at jclark) + + * troff/node.c (kern_pair_node::add_discretionary_hyphen, + node::add_discretionary_hyphen): Use soft_hyphen_char. + (set_soft_hyphen_char): New function. + (init_node_requests): Bind to shc. Initialize soft_hyphen_char. + + * Makefile (c++tested): Give more helpful message if test fails. + +Tue May 5 10:58:39 1992 James Clark (jjc at jclark) + + * troff/input.c (init_charset_table): Translate 0240 to + an unbreakable space. + + * troff/token.h (token::hyphen_indicator): New function. + * troff/charinfo.h (TRANSLATE_HYPHEN_INDICATOR): New special + translation. + * troff/input.c (translate): Allow translation to \%. + * troff/node.c (node::add_char): Handle + TRANSLATE_HYPHEN_INDICATOR. + (make_node): Don't allow TRANSLATE_HYPHEN_INDICATOR here. + + * troff/input.c (init_charset_table): Don't set BREAK_AFTER flag + for \(hy. + + * tty/devlatin1/R.proto: \(hy and - should print as 055. + +Tue Apr 21 09:24:42 1992 James Clark (jjc at jclark) + + * groff.c (run_commands): If the last command gets a SIGPIPE send + a SIGPIPE to all children than haven't yet terminated. When + command terminates, set pid field to -1. + +Fri Apr 17 11:20:48 1992 James Clark (jjc at jclark) + + * groff.c (main): Pass an appropriate -filename option to gxditview. + +Thu Apr 16 15:11:40 1992 James Clark (jjc at jclark) + + * Makefile.bd (install): Remove existing program before copying. + + * Makefile, */Makefile, Makefile.bd, groff.sh, groff.c: Allow + programs which have Unix counterparts to be installed with + user-specified prefix. + + * troff/input.c (exit_troff): Don't check if exit_started. + (exit_request): Don't call exit_troff if exit_started. + + * Makefile.bd (install.mm): Rename to install.dwbmm. + +Tue Apr 14 10:05:10 1992 James Clark (jjc at jclark) + + * driver/input.c (do_file): Add missing break for '#' case. + +Mon Apr 13 10:11:02 1992 James Clark (jjc at jclark) + + * troff/input.c (input_stack::clear): Clear past any boundaries and + then add the boundaries back. + + * troff/input.c (exit_troff): Return immediately if already + exiting. + + * macros/tmac.s (pg@end-text): New macro. Use pg@end-text for the + end macro. + (pg*end-page): If the text has ended and there are no more + footnotes or keeps, exit. + + * macros/doc-ditroff (Lq, Rq): Define as \(lq and \(rq. + + * troff/input.c (init_charset_table): Make \(rq transparent by + default. + + * macros/tmac.an: Define lq and rq strings. + + * macros/tmac.s (Q, U): Define as \(lq and \(rq. + +Sun Apr 12 12:54:37 1992 James Clark (jjc at jclark) + + * troff/env.c (environment::final_break): New function. + (environment::newline): Set prev_line_interrupted to 2 if + exit_started. + * troff/env.h: Declare environment::final_break. + * troff/input.c (exit_troff): Call environment::final_break() + instead of environment::do_break(). + + * macros/Makefile: Install man.local if $(MACRODIR)/man.local + doesn't already exist. + * macros/man.local: New file. + * macros/tmac.an: Load man.local. + * macros/man.ultrix: New file. + +Sat Apr 11 17:32:04 1992 James Clark (jjc at jclark) + + * troff/input.c (exit_groff): Rename to... + (exit_troff): New function. + + * troff/div.c (exit_started, done_end_macro, + seen_last_page_ejector): New global variables. + (began_page_in_end_macro): New static variable. + (exit_flag): Deleted. + (top_level_diversion::top_level_diversion): Initialize + last_page_count. + (top_level_diversion): More elaborate test for whether + cleanup_and_exit() should be called. + Set began_page_in_end_macro if the end macro isn't yet finished. + * troff/div.h (top_level_diversion::last_page_count): New data + member. + (top_level_diversion::set_last_page): New function. + (exit_started, done_end_macro, seen_last_page_ejector): Declare. + * troff/env.c (do_break): Zero prev_line_interrupted. + * troff/input.c (exit_flag): Delete declaration. + (LAST_PAGE_EJECTOR): New magic cookie. + (token::next): Handle LAST_PAGE_EJECTOR. + (exit_groff): Set exit_started and done_end_macro instead of + exit_flag. Call top_level_diversion::set_last_page. Push a + LAST_PAGE_EJECTOR instead of calling push_page_ejector(). Do + another ejection after setting seen_last_page_ejector. + +Thu Apr 9 04:37:11 1992 James Clark (jjc at jclark) + + * etc/grog.sh, etc/grog.sh: Recognize -me sh macro. + + * macros/tmac.e (TH): Make sure there's room for the initial + header. + + * macros/tmac.s (par@init): Make PD and DD at least \n(.V. + Set FVS in points rather than units. + +Mon Apr 6 11:21:32 1992 James Clark (jjc at jclark) + + * troff/div.c (top_level_diversion::add_trap): Don't consider the + position of empty slots. + +Fri Apr 3 10:46:45 1992 James Clark (jjc at jclark) + + * ps/devps/S: Fix height and depth of parenrightex. + * ps/devps/symbol.diff: Regenerate. + +Sat Mar 28 21:17:52 1992 James Clark (jjc at jclark) + + * tmac.e (u): Do underlining as in -mgs. + +Fri Mar 27 09:23:44 1992 James Clark (jjc at jclark) + + * tty/tty.c (tty_printer::end_page): If overstriking is + suppressed, still turn overstruck horizontal and vertical lines + into +. + + * lib/new.c: Back out Feb 24 change; no longer needed with gcc + 2.1. + + * refer/label.y (format_expr::evaluate): Avoid use of %0*d. + +Wed Mar 18 09:29:10 1992 James Clark (jjc at jclark) + + * Version 1.05 released. + +Tue Mar 17 16:50:45 1992 James Clark (jjc at jclark) + + * tty/tty.c: Instead of keeping an array of glyphs and then + sorting it, keep a ordered linked list of glyphs for each line. + + * driver/driver.h: Include stddef.h. + + * tty/tty.c (compare_glyph): + * refer/refer.c (rcompare): + * troff/env.c (compare_ranges): Arguments of qsort comparison + function should be const void *. + + * troff/number.c (parse_term): + * dvi/dvi.c (draw_dvi_printer::draw): Avoid initialization in + switch statement. + + * refer/label.y (consider_authors): Don't access variables + constructed under a condition outside that condition: put braces + round for statement containing declaration; redeclare use of same + variable later. + + * pic/pic.y (text_expr): Delete production that allows + parenthesised text_expr. + (expr): Allow a conditional_expr to appear in parentheses. + (conditional_expr): Rename to any_expr. + + * mm: Install new version 1.01 from jh. + + * lib/font.c (font::get_width): Cache scaled widths. + (font::font): Initialize widths_cache. + (font::~font): Destroy widths_cache. + * lib/font.h: Add font::widths_cache. Declare font_widths_cache. + +Mon Mar 16 10:16:10 1992 James Clark (jjc at jclark) + + * c++test.c, c++test.ref: New files. + * Makefile: Check that the C++ compiler works. + + * ps/tmac.pspic (PSPIC): Do a break. + + * ps/tmac.ps: Move definition of PSPIC into... + * ps/tmac.pspic: New file. + (PSPIC): Draw box around picture, but make it invisible to grops. + * ps/tmac.ps: Load tmac.pspic. + * ps/Makefile: Install tmac.pspic. + +Sun Mar 15 14:18:08 1992 James Clark (jjc at jclark) + + * lib/font.c (scale_round): If n is negative, + subtract .5 before truncating floating point result. + + * lib/fontfile.c: Include . + +Tue Mar 10 14:17:03 1992 James Clark (jjc at jclark) + + * driver/input.c (get_char): Inline. Don't update current_lineno. + Change callers to up date current_lineno if necessary. + Use get_char() instead of getc(current_file). + +Sun Mar 8 18:05:28 1992 James Clark (jjc at jclark) + + * ps/tmac.ps: Fix up spacing of \(mo and \(nm. + +Fri Mar 6 19:38:58 1992 James Clark (jjc at jclark) + + * tty/tty.c (tmac.tty): Define \(rg as (R). + +Tue Mar 3 10:11:25 1992 James Clark (jjc at jclark) + + * lib/lib.h: New define a_delete. + * Use a_delete instead of delete when deleting an array of objects + without destructors. + + * lib/lib.h: Rename adelete to ad_delete. + * Change uses of adelete. + +Mon Mar 2 12:41:05 1992 James Clark (jjc at jclark) + + * eqn/eqn.y: Include lib.h. + + * troff/node.c (grow_font_table): Delete old_font_table. + + * mm: Install new version from jh. + +Fri Feb 28 10:42:23 1992 James Clark (jjc at jclark) + + * tbl/table.h (format_type): Make global instead of local to class + entry_format. Prefix enumerators with FORMAT_. + * tbl/table.c, tbl/main.c: Corresponding changes. + * refer/token.h (token_type): Make global. Prefix enumerators + with TOKEN_. + * refer/token.[ch]: Corresponding changes. + * Makefile: Get rid of -DNO_NESTED_TYPES configuration option. + + * troff/div.c (node::set_vertical_size): Don't name argument. + +Thu Feb 27 10:29:19 1992 James Clark (jjc at jclark) + + * Makefile: New configuration option ARRAY_DELETE_NEEDS_SIZE. + * lib/lib.h: Define adelete accordingly. + * pic/object.c (graphic_object::graphic_object): + * tbl/main.c (format::~format): + * tbl/table.c (table::~table): + * refer/ref.c (reference::~reference, reference::merge, + reference::insert_field, reference::delete_field): Use adelete. + + * Makefile: Change NESTED_TYPES to NO_NESTED_TYPES. + * refer/token.h: + * tbl/table.h: Corresponding changes. + + * common.c (common_output::dashed_arc, common_output::dotted_arc): + Ensure total_angle is positive. + +Wed Feb 26 08:49:26 1992 James Clark (jjc at jclark) + + * refer/ref.c (reference::merge, reference::insert_field, + reference::delete_field): Avoid delete[0]. + + * refer/token.c (init_special_chars): Move calls to cmupper + outside calls to init_two_char_letter to work around bug in gcc + 2.0. + +Mon Feb 24 14:20:00 1992 James Clark (jjc at jclark) + + * lib/new.c (operator new): Use __builtin_new for g++. + + * pic/object.c (graphic_object::~graphic_object): Don't use + delete [] on 0. + + * pic/object.c (output::compute_scale): Initialize max_width and + max_height. + +Sat Feb 15 09:55:20 1992 James Clark (jjc at jclark) + + * troff/input.c (write_request): Call fflush. + + * troff/node.h (class composite_node): Move declaration to node.c + * troff/input.c (charinfo_to_node): Rename to ... + (charinfo_to_node_list): Return node list rather than composite + node. + * troff/node.c (make_composite_node): New function. + (make_node, add_char): Call make_composite_node instead of + charinfo_to_node. + (class composite_node): Add a tfont * member. Delete font_size + member. + (composite_node::composite_node, composite_node::copy, + composite_node::size): Corresponding changes. + (composite_node::tprint): Provide constant spacing, emboldening + and track kerning as specified in tfont. + (composite_node::width): Change width calculation accordingly. + * troff/env.h (environment::composite): New member. + (environment::is_composite, environment::set_composite): New + functions. + * troff/env.c (environment::environment): Initialize composite. + * troff/input.c (charinfo_to_node): Call + environment::set_composite. + * troff/node.c (make_composite_node, make_glyph_node): Use the + plain version of the tfont if the environment is composite. + + * troff/node.c (font_info::get_space_width): Additional argument + giving space_size. Handle constant space correctly. Scale by + space_size unless constant spaced. + (env_sentence_space_width): New function. + * troff/node.h: Declare it. + * troff/env.h (environment::get_space_size, + environment::get_sentence_space_size, + environment::get_narrow_space_width, + environment::get_half_narrow_space_width): Make inline. + (environment::get_space_width): Make inline. Just call + env_space_width. + * troff/env.c: Delete definitions for funtions made inline. + (environment::space_newline, environment::space): Use + env_sentence_space_width(). Don't scale by space_size. + * troff/node.h: Move declarations of env*space_width() functions + into env.h. + +Sat Feb 8 09:30:22 1992 James Clark (jjc at jclark) + + * macros/tmac.s (PS): Don't try to set negative indent. + +Thu Feb 6 09:00:35 1992 James Clark (jjc at jclark) + + * pic/pic.y: Fix min function. + +Tue Jan 28 07:52:29 1992 James Clark (jjc at jclark) + + * man/mdate.sh: Clear LANGUAGE. + +Sun Jan 19 13:02:41 1992 James Clark (jjc at jclark) + + * pic/pic.y, pic/lex.c: Rename COMMAND token to COMMAND_LINE. + * pic/lex.c: New COMMAND keyword. + * pic/pic.y (print_args, print_arg): New rules. + (placeless_element): Use print_args for PRINT. + New COMMAND element. + +Tue Jan 7 13:14:31 1992 James Clark (jjc at jclark) + + * troff/input.c (terminal): Handle missing argument correctly. + + * pic/pic.y (text_expr): New rule. + + * pic/pic.y: Implement := operator. + +Sun Jan 5 10:23:02 1992 James Clark (jjc at jclark) + + * etc/grog.pl, etc/grog.sh: Distinguish old and new versions of + mdoc. + +Sat Jan 4 14:42:26 1992 James Clark (jjc at jclark) + + * ps/devps/dingbatsrmap: Include this in the distribution. + + * macros/tmac.doc: Replace with new version from 2nd Networking + Release. Fix loading of doc-* files. + * macros/{doc-common,doc-ditroff,doc-nroff,doc-syms}: New files. + * macros/tmac.doc.old: New file. Apply fixes that had been + applied to old tmac.doc. + * macros/tmac.andoc: Check that we're running under groff. + * macros/Makefile: Rework. + +Fri Jan 3 13:27:51 1992 James Clark (jjc at jclark) + + * tbl/table.h (format_type): + * refer/token.h (token_type): If NESTED_TYPES is defined, use + typedef to make these types visible at file scope. + * Makefile: Add NESTED_TYPES configuration option. + + * troff/div.c (mark): At the top level use the value of + nl_reg_contents rather than the current vertical position. + +Thu Jan 2 10:34:51 1992 James Clark (jjc at jclark) + + * tty/tty.c: Implement \D for horizontal or vertical lines. + (tty_printer::set_char): Use vec_used+2 as serial number. + Don't allow size of vector to exceed USHRT_MAX-2. + Split off part into... + (tty_printer::add_char): New function. + (tty_printer::draw): New function. + (compare_glyph): Handle equal serial numbers. + (tty_printer::end_page): Handle overstruck characters from \D. + (main, usage): Implement -d option. + +Mon Dec 23 10:37:51 1991 James Clark (jjc at jclark) + + * tbl/main.c (process_format): + * eqn/text.c (split_text): + * troff/input.c (token::next): Use inner block for declarations + with initializers in switch statement. + +Mon Dec 16 20:52:03 1991 James Clark (jjc at jclark) + + * pic/common.c (common_output::dash_line): Cope with zero-length + lines. + +Sun Nov 17 12:04:08 1991 James Clark (jjc at jclark) + + * Version 1.04 released. + +Wed Nov 13 05:27:21 1991 James Clark (jjc at jclark) + + * macros/tmac.an (TH): Define a macro an-init to define variables + based on command line arguments. + (an-header): Call it. + +Sun Nov 3 12:07:34 1991 James Clark (jjc at jclark) + + * Makefile (install.mm): Rename to install.dwbmm. + + * Makefile: Integrate mm. + * mm: New directory. + +Wed Oct 30 10:11:34 1991 James Clark (jjc at jclark) + + * refer/dirnamemax.c: If PATHCONF_MISSING is defined, include + . + + * pic/troff.c (troff_output::simple_spline, + troff_output::simple_polygon): Rename variable `v' to `d' to avoid + shadowing parameter. + + * lib/tmpfile.c (xtmpfile): Declare dir as const char *. + + * lib/ptable.h: Add explicit casts when converting from unsigned + long to unsigned. + + * dvi/devdvi/{SA,SB,msam.map,msbm.map}: New files. + * dvi/devdvi/Makefile: Install SA, SB. + + * refer/indxbib.c: Add declaration of mktemp. + + * refer/lookbib.c: Add declaration of isatty. + +Fri Oct 25 09:00:17 1991 James Clark (jjc at jclark) + + * pic/lex.c (interpolate_macro_with_args): While collecting + arguments, keep track of whether we're in a string. + +Wed Oct 23 08:42:48 1991 James Clark (jjc at jclark) + + * ps/tmac.ps (PSPIC): Do the .sp after the \X, and move the \X + down with \v, so as to avoid problems with top of page trap + setting no space mode. + +Tue Oct 22 17:38:49 1991 James Clark (jjc at jclark) + + * eqn/lex.c (get_delimited_text): Allow tab before macro body. + +Tue Oct 15 17:24:53 1991 James Clark (jjc at jclark) + + * ps/psrm.c (ps_get_line): Fix bug when lines longer than 255. + Improve error message. + +Fri Oct 11 11:09:38 1991 James Clark (jjc at jclark) + + * ps/psrm.c (print_ps_string): Don't pass negative numbers to + printf("%03o"); + +Wed Oct 9 17:50:14 1991 James Clark (jjc at jclark) + + * groff.c (possible_command::execp): Always use _exit() after a + failed exec. + + * Makefile: Add HAVE_UNION_WAIT, HAVE_PID_T, WAIT_COREDUMP_0200, + NO_SYS_WAIT_H configuration options. + * groff.c: Use these options. Use POSIX-style macros to extract + fields from the status returned by wait(). + +Fri Oct 4 12:12:27 1991 James Clark (jjc at jclark) + + * tbl/table.c (table::compute_separation_factor): Allow the + separation factor to drop to 0. + +Tue Oct 1 18:12:38 1991 James Clark (jjc at jclark) + + * refer/search.c: Include . + +Sun Sep 29 08:40:57 1991 James Clark (jjc at jclark) + + * pic/pic.y (YYDEBUG): Don't define for Borland C++. + + * lib/lib.h: #ifdef out declarations of itoa and iftoa for Borland + C++. + + * pic/lex.c (input_stack::bol): Move definition out of class body. + + * pic/main.c: On MSDOS munge argv[0]. + + * lib/ptable.h: Define name2 as _Paste2 for Borland C++. + + * lib/ptable.c (hash_string): Use unsigned long rather than + unsigned. + (next_ptable_size): Use unsigned rather than int. Give an error + message if we've hit the largest table size. + * lib/ptable.c: Corresponding changes. Also use unsigneds for the + table size. + + * pic/object.h (object_spec): Make flags unsigned long. Declare + flags as const unisgned long rather than as enums. + + * pic/output.c: Deleted. + + * pic/troff.c (troff_output::simple_ellipse): Remove spurious %. + + * tbl/table.c (simple_entry::note_double_vrule_on_{left,right}): + Add additional argument. + (line_entry::note_double_vrule_on_{left,right}): Set value of + douvle_vrule_on_{right,left} flag according to argument. + (simple_line_entry::simple_print, + simple_line_entry::double_line_print): If adjacent to double vrule + on a corner extend rather than shorten the rule by half the double + vrule sep. + + * troff/number.c (parse_term): In checking for overflow, handle the + case where the current horizontal position is negative. + +Thu Sep 12 08:26:09 1991 James Clark (jjc at jclark) + + * pic/object.c (draw_arrow): Check for object having zero length. + +Wed Sep 11 10:32:38 1991 James Clark (jjc at jclark) + + * eqn/main.c (do_file): Split off inline equation handling into... + (inline_equation): New function. Search for starting delimiter + using... + (delim_search): New function. Don't recognize a delimiter that + occurs in the name of an escape sequence, number register, string + etc. + +Tue Sep 10 04:01:11 1991 James Clark (jjc at jclark) + + * eqn/delim.c (delim_box::compute_metrics): Don't call + define_extensible_string if left is 0. + (delim_box::output): Don't print the left delimiter if left is 0. + (delim_box::debug_print): Check for left == 0 before calling printf. + +Fri Aug 23 13:02:30 1991 James Clark (jjc at jclark) + + * troff/Makefile (majorminor.c): Include only digits in + minor_version. + +Thu Aug 22 09:35:37 1991 James Clark (jjc at jclark) + + * refer/dirnamemax.c: new file. + * refer/genlimits.c: Deleted. + * refer/indxbib.c (main): Use dir_name_max() instead of NAME_MAX. + Don't check path length. + * refer/Makefile: Add dir_name_max.o; delete genlimits. + * Makefile: Add PATHCONF_MISSING option. + + * refer/indxbib.c (get_cwd): New function. + (main): Use get_cwd(). + * lib/getcwd.c: New file. + * Makefile: Delete -DHAVE_GETWD. Include GETCWD variable. Pass + GETCWD in SUBFLAGS. + * lib/Makefile: Compile getcwd.o. + + * ps/tmac.psatk (psatk-defs): Define showpage after pushing + userdict. + + * refer/indxbib.c (main): Check success of mktemp. + + * lib/tmpfile.c: New file. + * lib/Makefile: Add tmpfile.c. + * lib/lib.h: Declare xtmpfile(); include . + * ps/ps.h: Delete declaration of mktemp(). + * ps/ps.c (ps_printer::ps_printer): Use xtmpfile(). + * refer/refer.c (divert_to_temporary_file): Use xtmpfile(). + * driver/driver.h: No need now to include errno.h. + + * everywhere: Set errno to 0 before calling fopen(). + + * eqn/eqn.h, etc/soelim.c, driver/driver.h, etc/addftinfo.c, + dvi/tfmtodit.c, groff.c, refer/index.c, refer/linear.c, + refer/lookbib.c, refer/refer.h, ps/psbb.c: Include . + +Mon Aug 19 10:52:18 1991 James Clark (jjc at jclark) + + * troff/env.h (translate_space_to_dummy): Declare it. + * troff/env.c (environment::space_newline, environment::space): + If translate_space_to_dummy is set then make the width of spaces 0. + * troff/input.c (translate): If the second character of a + translation is a space, translate to unbreakable space. If the + first character is a space, set or clear translate_space_to_dummy + according to whether the second character is \&. Weird! + +Tue Jul 30 10:03:56 1991 James Clark (jjc at jclark) + + * groff.c (run_commands): Don't use non-zero exit code because a + command gets SIGPIPE. + + * groff.c, groff.sh: Use -mXps with -TXps. + + * ps/ps.c (ps_printer::special): Move call to flush_sbuf() into... + (ps_printer::do_exec, ps_printer::do_file, ps_printer::do_def, + ps_printer::do_mdef, ps_printer::do_import): Call flush_sbuf(). + (ps_printer::special): New specials invis and endinvis. + (ps_printer::do_invis, ps_printer::do_endinvis): New functions. + (ps_printer::set_char, ps_printer::draw): Return if invis_count>0. + (ps_printer::end_page): Check that invis_count == 0. + (ps_printer::invis_count): New member. + (ps_printer::ps_printer): Initialize invis_count to 0. + + * troff/env.c (environment::hyphenate_line): Hyphenation + indicator at beginning of word inhibits splitting after -, \(em + etc. + + * pic/pic.y (element): Allow another element to follow } without + any intervening separator. + +Mon Jul 22 12:27:37 1991 James Clark (jjc at jclark) + + * pic/lex.c (get_delimited): Allow tabs before delimiter. + +Wed Jul 17 10:59:08 1991 James Clark (jjc at jclark) + + * groff.c: Get rid of HAVE_UNION_WAIT stuff. Instead suppress + declaration of wait() in header files. + * Makefile: Get rid of -DHAVE_UNION_WAIT. + + * tbl/table.c (alphabetic_text_entry::add_tab): New function. + + * lib/lib.h: Declare return type of strerror as char *. + + * man/Makefile: Add g flag to sed substitutions. + * Makefile (shgroff, bindist): Likewise. + +Sun Jul 14 11:57:02 1991 James Clark (jjc at jclark) + + * ps/ps.c (ps_printer::do_import): Move push of userdict into... + * ps/devps/prologue (PBEGIN): Define showpage after pushing + userdict. + +Sat Jul 13 20:53:04 1991 James Clark (jjc at jclark) + + * ps/devps/prologue (PBEGIN): Zap any definition of showpage in + userdict. + +Fri Jul 12 07:10:09 1991 James Clark (jjc at jclark) + + * man/mdate.sh: Handle the fact that BSD ls -l does not print the + group. + +Sun Jul 7 08:00:23 1991 James Clark (jjc at jclark) + + * troff/input.c (define_number_reg): If currently undefined, + don't define it if the argument is an invalid expression. + + * Makefile: Ignore return value of `if' commands without `else' + parts. + + * Makefile: Split up CPPDEFINES into a series of separate + configuration options. + + * troff/input.c (init_registers): Use time_t instead of long + unless LONG_FOR_TIME_T is defined. Use returned result rather + than passing pointer. + * Makefile: Document LONG_FOR_TIME_T as a CPPDEFINE. + + * lib/Makefile (fontpath.h): Use gendef. + +Thu Jul 4 09:48:05 1991 James Clark (jjc at jclark) + + * troff/input.c (input_iterator::shift): Delete argument name. + * troff/node.c (suppress_output_file::really_begin_page, + suppress_output_file::really_transparent_char, node::ascii_print, + node::tprint): Delete names of unused arguments. + +Wed Jul 3 17:34:57 1991 James Clark (jjc at jclark) + + * refer/label.y (string): Pass $4 to command_error. + +Tue Jul 2 15:06:01 1991 James Clark (jjc at jclark) + + * Version 1.03 released. + +Sat Jun 29 08:14:01 1991 James Clark (jjc at jclark) + + * Makefile: Pass definition of SHELL in SUBFLAGS. + + * gendef: New file. + * Makefile, eqn/Makefile, refer/Makefile, troff/Makefile, + ps/Makefile: Use gendef to construct header files that are + constructed from the Makefile. + + * macros/Makefile: make all should build stripped version of tmac.e. + + * refer/Makefile (clean): Remove y.output. + +Fri Jun 28 09:44:36 1991 James Clark (jjc at jclark) + + * ps/pfbtops.c (main): Add -v option which prints out a version + number. + * ps/Makefile (pfbtops): Link with libgroff.a. + +Fri Jun 21 07:43:23 1991 James Clark (jjc at jclark) + + * refer/search.h (linear_searcher::get_nkeys): Delete declaration. + * refer/linear.c (linear_searcher::get_nkeys): Delete definition. + + * refer/lkbib.c (main): Always terminate reference with blank + line. + * refer/lookbib.c (main): Likewise. + + * refer/linear.c (file_buffer::load): Check that the file is not a + binary file. + + * refer/Makefile (genlimits): Possibly add -DHAVE_SYS_DIR_H. + (genlimits.c): Include if HAVE_SYS_DIR_H is defined. + Delete second inclusion of . + +Tue Jun 18 01:32:26 1991 James Clark (jjc at jclark) + + * troff/token.h (token::special): Deleted. + + * tbl/main.c (process_format): Rework so that opt->tab_char is + recognized only when appropriate. + + * ps/Makefile (clean): Remove pfbtops. + +Sun Jun 16 09:37:19 1991 James Clark (jjc at jclark) + + * lib/font.c (text_file::next): Don't return if we have got a + blank line. + +Fri Jun 14 09:52:26 1991 James Clark (jjc at jclark) + + * refer/refer.c (store_reference): Get hash code from old_table[i] + when rehashing the table. + +Thu Jun 13 01:26:43 1991 James Clark (jjc at jclark) + + * eqn/box.c (box::top_level): Save size and prev size using \R and + restore it afterwards. Set the size to the size at the beginning + of the line. + * eqn/pbox.h: Declare SAVED_INLINE_PREV_SIZE_REG, + SAVED_INLINE_SIZE_REG, and SAVED_SIZE_REG. + + * refer/Makefile (limits.h): Use ./genlimits. + +Wed Jun 12 16:05:34 1991 James Clark (jjc at jclark) + + * refer/index.c: Delete declarations of stat() and fstat(). + +Tue Jun 11 14:52:49 1991 James Clark (jjc at jclark) + + * tty/tmac.tty: Add character definitions for \(>= and \(<=. + +Mon Jun 10 22:49:48 1991 James Clark (jjc at jclark) + + * etc/grog.sh, etc/grog.pl: Change regex for .PS. + +Fri Jun 7 09:13:06 1991 James Clark (jjc at jclark) + + * troff/input.c (token::get_char): Handle \e. + + * refer/linear.c: Delete declarations of fstat() and stat(). + +Wed Jun 5 09:11:59 1991 James Clark (jjc at jclark) + + * troff/node.c, troff/env.c, troff/input.c, Makefile: Remove + OP_DELETE_BROKEN stuff, since we now have a fix for g++. + +Mon Jun 3 13:41:32 1991 James Clark (jjc at jclark) + + * troff/input.c (do_define_macro): Improve error handling for end + of file while defining macro. + +Sun Jun 2 10:20:24 1991 James Clark (jjc at jclark) + + * eqn/box.h: Fix declaration of set_gsize. + * eqn/box.c (set_gsize): Make argument const char *. + (gsize): Declare as char *. + * eqn/main.c (main): Don't convert gsize to int. + * eqn/lex.c (do_gsize): Pass char * to set_gsize. + + * Version 1.02 released. + +Sat Jun 1 12:19:46 1991 James Clark (jjc at jclark) + + * macros/tmac.andoc: New file. + * macros/Makefile: Install tmac.andoc. + + * troff/node.c, troff/env.c, troff/input.c: Conditionalize use of + operator new and delete on OP_DELETE_BROKEN not being defined. + * Makefile: Mention OP_DELETE_BROKEN. + +Mon May 27 13:49:07 1991 James Clark (jjc at jclark) + + * Makefile (bindist): Pass SUBFLAGS. + +Sun May 26 14:13:22 1991 James Clark (jjc at jclark) + + * Makefile, groff.c: Pass definitions to groff.c via device.h. + + * tty/tty.c (tty_font::load_tty_font): Avoid shadowing + parameter. + + * ps/Makefile, ps.c: Pass BROKEN_SPOOLER_FLAGS via broken.h. + + * ps/ps.h, ps/psrm.c: Make comment_table and + header_comment_table local to resource_manager::process_file. + + * groff.sh: With -TXps pass -printCommand option to gxditview. + + * groff.c (possible_command::print): Implement using + append_arg_to_string. + + * xditview: Merge in new implementation with own ChangeLog. + +Sat May 25 18:33:20 1991 James Clark (jjc at jclark) + + * groff.c (main): Implement PRINT_OPTION. + (append_arg_to_string): New command. + (device_table): Set PRINT_OPTION flag for Xps. + +Fri May 24 09:48:58 1991 James Clark (jjc at jclark) + + * troff/groff.h: Rename to troff.h. + + * pic/lex.c (lookup_keyword, docmp): New functions. + (get_token): Use new lookup_keyword. + Don't include key.h. + * pic/key.[ch], pic/pic.gperf: Deleted. + * pic/Makefile: Remove gperf stuff. + + * pic/Makefile, pic/output.h: Move definition of TEX_SUPPORT + into output.h. + * pic/tex.c: Move include of pic.h before test of TEX_SUPPORT. + + * troff/Makefile, troff/node.c: Move definition of + STORE_WIDTH into node.c. + + * etc/grog.pl, etc/grog.sh: Support -mdoc. + +Thu May 23 12:30:49 1991 James Clark (jjc at jclark) + + * dvi/devdvi/texr.map, dvi.devdvi/texi.map, + dvi/devdvi/texb.map: Add lq and rq. + dvi/devdvi: Regenerate fonts. + * ps/devps/textmap: Add lq and rq. + * ps/devps: Regenerate fonts. + * tty/devascii/R.proto, tty/devlatin1/R.proto: Add lq and rq. + * macros/tmac.e: Define \*(lq and \*(rq to be \(lq and \(rq. + + * pic/object.c (position_rectangle): When checking radius + cope with possiblity that width or height is negative. + (box_object::box_object): Have separate xrad and yrad with + signs matching signs of dim components. + (box_object::{north,south}_{east,west}): Use xrad and yrad. + (box_object::print): With rounded boxes use absolute values + for dim and rad arguments. + + * lib/Makefile, lib/fontfile.o: Pass definition of FONTPATH + in fontpath.h. + + * eqn/Makefile, eqn/main.c: Pass definition of DEVICE in device.h. + + * various files: Add explicit destructors to keep Saber CC +d + happy. + +Wed May 22 11:37:11 1991 James Clark (jjc at jclark) + + * eqn/box.c (box::top_level): Restore fonts correctly after + font changes in line containing inline equation. Also + restore previous font as well as current font. + * eqn/pbox.h: Define necessary string and register names. + + * troff/input.c (token::next): Case 'R' calls do_register. + (do_register): New function. + +Tue May 21 11:28:23 1991 James Clark (jjc at jclark) + + * groff.c, groff.sh: Support Xps device. Allow each device + to have a pseudo_name and a real_name. + + * groff.c (run_commands): Don't print `Broken pipe' messages. + + * ps/pfbtops.c: New file. + * ps/Makefile: Add pfbtops. + + * troff/number.c (parse_term): Improved error message. + +Mon May 20 11:22:14 1991 James Clark (jjc at jclark) + + * groff.c, groff.sh, etc/grog.sh, etc/grog.pl: Support grefer. + + * Makefile: Integrate refer. + * refer: New directory. + * man/grefer.man, man/glookbib.man, man/gindxbib.man, + man/lkbib.man: New files. + * man/Makefile: Support refer man pages. + + * lib/lib.h: Declare is_prime. + * lib/prime.c: New file. + + * troff/input.c (macro_source): New function. + (init_input_requests): Bind "mso" to macro_source. + + * troff/env.c (environment::possibly_break_line): Maintain + pointer to pointer to node to be split in ndp so as to avoid + using address of freed node. + + * troff/env.c (environment::hyphenate_line): Maintain pointer to + pointer to first node to be hyphenated in startp so as to + avoid using address of freed node. + + * troff/env.c (class trie, class hyphen_trie): Make the + elements of the trie be of type char not unsigned char. + Declare arguments to be const char* instead of unsigned char *. + + * troff/env.c (hyphenate): Initialize hbuf[0]. + + * troff/input.c (set_string): Declare p to be char * and cast + *p to unsigned char when necessary. + + * troff/input.c (do_define_macro): Declare s to be const + char*. Cast element to unisgned char when necessary, Declare + d to be an int. Handle EOF better. + + * troff/Makefile, troff/input.c: Different scheme for passing + definitions of MACROPATH, HYPHENFILE and DEVICE. + +Tue May 14 13:41:36 1991 James Clark (jjc at jclark) + + * tty/devascii/R.proto: Delete entry for em. + * tty/devlatin1/R.proto: Likewise. + +Sat May 11 11:13:28 1991 James Clark (jjc at jclark) + + * troff/input.c (translate): Stop when we get a space. Treat eof + like newline. + + * macros/tmac.an (IP): Only pass quoted argument to TP when \n(.$>1. + +Wed Apr 24 19:24:33 1991 James Clark (jjc at jclark) + + * tbl/main.c (process_format): A font name following a `f' + modifier that starts with a digit can be only one character long. + Also deal with EOF on the second character of the font name. + +Wed Apr 17 11:23:43 1991 James Clark (jjc at jclark) + + * troff/input.c (token::next): Turn \~ into an + unbreakable_space_node. + * troff/node.c (unbreakable_space_node): New class. + * troff/node.h: Declare it. + +Tue Apr 16 10:47:12 1991 James Clark (jjc at jclark) + + * dvi/dvi.c (dvi_printer::set_char): Make code an int. Check that + it's >= 0, before outputting it as a single byte. + +Mon Apr 15 11:20:23 1991 James Clark (jjc at jclark) + + * lib/font.c: Make font_char_metric::code an int. + (font::get_code): Change return type to int. + (font::load): Allow code to be arbitrary integer. + * lib/font.h (font::get_code): Change return type to int. + (font::number_to_index): Change argument type to int. + * troff/input.c (token::next): In case 'N', allow any value. + Store value in token::val. + (token::operator==): For TOKEN_NUMBERED_CHAR test equality of val. + (token::get_char, token::add_to_node_list, token::process): Get + number from val. + (charinfo::set_number): Change argument to int. + (charinfo::get_number): Require that NUMBERED flag be set. + (get_charinfo_by_number): Store numbered characters not between 0 + and 255 in a dictionary. + * troff/charinfo.h (get_charinfo_by_number): Change argument type + to int. + (charinfo::number): Change type to int. + (charinfo::set_number): Change type of set_number to int. + * troff/node.c (troff_output_file::put_char_width, + troff_output_file::put_char): Test whether character is numbered + using charinfo::numbered(). + * driver/printer.c (printer::set_numbered_char): Allow arbitrary + values of num. + * lib/nametoindex.c: New implementation to cope with arbitrary + number characters. + + * troff/input.c (token::operator==): Test val for + TOKEN_CHAR_HEIGHT, TOKEN_CHAR_SLANT, TOKEN_FONT_POSITION, and + TOKEN_SIZE. + + * man/Makefile: Add definiton of BROKEN_SPOOLER_FLAGS. + (.man.n): sed out @BROKEN_SPOOLER_FLAGS@. + +Sun Apr 14 12:57:00 1991 James Clark (jjc at jclark) + + * ps/devps/zapfdr.ps: Don't copy UniqueID. Avoid use of newdict + variable. + + * all Makefiles: rm targets of cp and >. + + * xditview/xtotroff.c (MapFont): Unlink troff_name before opening + it. + + * eqn/lex.c (def_table): Add dollar. + +Sat Apr 13 13:02:44 1991 James Clark (jjc at jclark) + + * troff/input.c (do_width): Push back newline before closing delim + like do_bracket. + +Fri Apr 12 15:16:03 1991 James Clark (jjc at jclark) + + * groff.c (possible_command::prepend_arg): New function. + (main): Prepend device -m option. + * groff.sh: Put device -m options before command-line options. + +Tue Apr 9 10:24:43 1991 James Clark (jjc at jclark) + + * macros/tmac.an (IP): Quote argument to TP. + + * ps/ps.c (main): New option -b, which sets... + (broken_flags): New variable. + (ps_printer::~ps_printer): Incorporate the setup section in the + prolog if (broken_flags & NO_SETUP_SECTION). + (ps_printer::begin_page): Generate {Begin,End}PageSetup comments. + (ps_printer::merge_download_fonts, ps_printer::merge_import_fonts, + ps_printer::merge_ps_fonts, ps_printer::print_font_comment, + ps_printer::print_needed_font_comment, + ps_printer::print_supplied_font_comment, + ps_printer::print_include_font_comments, + ps_printer::lookup_doc_font, ps_printer::download_fonts, + ps_printer::read_download_file, read_document_fonts, add_font, + skip_line, parse_fonts_arg, document_font::document_font, + document_font::~document_font, document_font::download, + ps_output::include_file): Deleted. + (ps_printer::~ps_printer): Generate %%EOF. Generate %!PS-Adobe-3.0 + rather than %!PS-Adobe-2.0. Make calls to + resource_manager::need_font for each font that we used. Replace + calls to merge_ps_fonts, merge_download_fonts, print_font_comment, + print_supplied_font_comment, print_needed_font_comment by call to + resource_manager::print_header_comments. Output %%Orientation + comment. Output %%Requirements: numcopies comment if ncopies > 1. + Don't output the prolog directly. Instead call + resource_manager::output_prolog. Only define #copies when ncopies + > 1. Delete calls to print_include_font_comments and + download_fonts. Add call to resource_manager::document_setup. + (ps_printer::do_file): Call resource_manager::import_file instead + of including it ourselves. + (ps_printer::do_import): Likewise. Also don't call + merge_import_fonts. Push userdict on the dictionary stack before + and pop it afterwards. + Move declaration of ps_output into ps.h. + * ps/psrm.c: New file implementing resource_manager class. + * ps/ps.h: New file declaring ps_output and resource_manager + classes. + * ps/devps/zapfdr.ps: + * ps/devps/symbolsl.ps: + * ps/devps/prologue: Use 3.0 conventions. + * ps/Makefile: Pass definition of BROKEN_SPOOLER_FLAGS in DEFINES. + Add default definition of BROKEN_SPOOLER_FLAGS. + * Makefile: New variable BROKEN_SPOOLER_FLAGS. Add + BROKEN_SPOOLER_FLAGS to SUBFLAGS. + +Mon Apr 8 09:26:54 1991 James Clark (jjc at jclark) + + * etc/grog.pl: New file. + * Makefile (GROG): New variable. + Add GROG to SUBFLAGS. + * etc/Makefile (GROG): New variable. + (install.nobin): Install $(GROG) rather than grog.sh. + +Thu Apr 4 11:36:45 1991 James Clark (jjc at jclark) + + * eqn/special.c (special_box::compute_metrics): Make the input and + output strings the same. Get the new height and depth from the + predefined height and depth registers. Also make subscript kern + and skew available. + (special_box::compute_subscript_kern, special_box::compute_skew): + New functions. + + * eqn/box.c (pointer_box::compute_skew, + simple_box::compute_metrics, box::top_level) + * eqn/text.c (prime_box::compute_metrics, + prime_box::comput_subscript_kern) + * eqn/limit.c (limit_box::compute_metrics): + * eqn/delim.c (build_extensible, delim_box::compute_metrics): + * eqn/sqrt.c (sqrt_box::compute_metrics): Protect possibly + negative numbers in `nr' requests with a leading 0. + +Wed Apr 3 15:58:23 1991 James Clark (jjc at jclark) + + * eqn/special.c: New file. + * eqn/eqn.y: Declare token SPECIAL. Make it right associative. + Add new rule for simple. + * eqn/lex.c (token_table): Add SPECIAL. + * eqn/box.h: Declare make_special_box. + * eqn/Makefile: Add special.[co]. + +Sat Mar 30 10:57:53 1991 James Clark (jjc at jclark) + + * ps/devps/prologue: Possibly set packing to true while defining. + Create grops dictionary here. Initialize local variables before + defining procedures. + (PICTURE): Rename to PBEGIN. Also do save, noop showpage, count + the dictionary stack. Set strokeadjust and overprint to false if + the relevant operators are defined. + (PEND): New procedure. + * ps/ps.c (ps_printer::~ps_printer): In the prolog just include + prologue. Do everything else in the setup section. + (ps_printer::do_import): Just call PBEGIN and PEND around the + picture. Also push userdict before, and pop it afterwards. + +Wed Mar 27 07:59:50 1991 James Clark (jjc at jclark) + + * troff/node.c (bracket_node::tprint): Brackets were being printed + 1m too low. + + * macros/tmac.an (SH, SS): Set fill mode. + +Tue Mar 26 07:46:31 1991 James Clark (jjc at jclark) + + * troff/div.c (top_level_diversion::begin_page): Set + high_water_mark to 0. + +Fri Mar 22 09:19:46 1991 James Clark (jjc at jclark) + + * man/mdate.sh: New file. + * man/mdate.c: Deleted. + * man/Makefile: Use mdate.sh instead of mdate. + (mdate): Deleted. + + * eqn/lex.c (do_gsize): Supply missing argument to error message. + +Tue Mar 19 11:06:50 1991 James Clark (jjc at jclark) + + * man/mdate.c: New file. + * man/*.man: Replace modification date by @MDATE@. + * man/Makefile (.man.n): Replace @MDATE@ by `mdate $<`. + (mdate): New target. + + * lib/font.c (text_file::next): Deal with arbitrarily long lines. + Remove illegal input characters. + +Mon Mar 18 08:32:25 1991 James Clark (jjc at jclark) + + * macros/tmac.s (pg*start-col): Do .ns *after* running the hooks. + +Sat Mar 16 03:52:25 1991 James Clark (jjc at jclark) + + * troff/div.c (begin_page): Change behaviour when + !first_page_begun and !break_flag. + + * troff/input.c (do_name_test): Return 0 if argument is empty. + + * troff/input.c (read_long_escape_name): Require closing ] to be + at same input level as opening [. + + * troff/input.c (read_increment_and_escape_name): New function. + (get_copy, process_input_stack): Use this for \n. + +Fri Mar 15 00:31:48 1991 James Clark (jjc at jclark) + + * troff/div.c (top_level_diversion::begin_page): Ignore the + current value of page_number if !first_page_begun. + + * groff.c (main): Fix declaration of buf. + + * troff/input.c (do_name_test): New function. + (token::next): Implement \A. + (token::next): Implement \e by turning it into a TOKEN_ESCAPE. + (token::description, token::add_to_node_list, token::process): + Handle TOKEN_ESCAPE. + * troff/token.h: New token TOKEN_ESCAPE. + +Thu Mar 14 10:22:26 1991 James Clark (jjc at jclark) + + * pic/main.c (do_picture): Allow space before and after filename + following `<'. Check that the filename is not empty. + +Wed Mar 13 12:49:40 1991 James Clark (jjc at jclark) + + * Version 1.01 released. + + * dvi/devdvi/CompileFonts: Add cm*ss10 fonts. + + * dvi/tmac.dvi: ftr HR to H. + + * macros/tmac.e: Round up computation of $r. + + * xditview/tmac.X: Don't give up completely in compatibility mode. + Use \n(.s instead of \n[.s]. + + * dvi/tmac.dvi: Don't give up completely in compatibility mode. + Use \(ci instead of \[ci]. Use \n(.s instead of \n[.s]. + Add u to factors inside \s[...]. Rename frac to dvi-frac. + Translate \(FM onto \[prime] and \(!/ onto \[slashnot]; use these + short names in the char definitions. + + * ps/tmac.ps: Don't give up completely in compatibility mode. + Fix the fraction definitions to use \n(.s and \(f/. Add an extra + quote in front of \n(.s. Add u to factors inside \s[...]. + +Mon Mar 11 12:01:20 1991 James Clark (jjc at jclark) + + * tty/tmac.tty: Call the nroff request. + + * macros/tmac.e ((x, )x): Better definitions that work properly + in a diversion. + (@0, @1): Helper macros for (x. + + * macros/tmac.e ($s, hl): Use \l rather than \D. + + * tty/tmac.tty: Make it work better in compatibility mode. + (pchar): Rename to tty-char. + + * macros/tmac.e (@E): New macro. + (r, i, b, rb, bi): Use @E. + + * macros/tmac.e (@F): Don't use (;...) syntax. + + * macros/tmac.e: Remove mention of \*(||/revisions. Mention that + it was modified for groff. + + * macros/tmac.e: Make sure \n(ps and \n(es are >= \n(.V. + + * macros/tmac.e (<., .>): Removed. + ([., .]): If \n(.V>=1v, use [] instead of superscripting. + + * macros/tmac.e: Remove check that groff is being used. + + * macros/tmac.e (@C): Change families only if using groff; turn + compatibility mode off while changing familes. Save compatibility + mode before changing families and restore it afterwards. + + * macros/tmac.e (@h): Remove test for offset + line length. + + * macros/tmac.e (sorry): Rename to @S. Use \$1 instead of \$0 + (lo, th, ac): Define to call @S instead of using als. + + * macros/tmac.e: Make $r and $R now contain \n(.v*100/\n(.sp, ie + the ratio of the vertical spacing to the point size in units + expressed as a percentage. Use these instead of $10r and $10R, + Delete $10r and $10R. + + * lib/font.c (font::load): In default computation of space_width, + divide by sizescale. Use scale_round. + + * macros/tmac.an (TP): Don't call `nf'. + (an-do-tag): Don't call `fi'. + +Sun Mar 10 09:52:35 1991 James Clark (jjc at jclark) + + * troff/input.c (process_input_stack): Handle the case where + spaces at the beginning of an input line are followed by a + newline. + +Thu Mar 7 20:18:07 1991 James Clark (jjc at jclark) + + * groff.c (device_table): Add PIC_X_OPTION for dvi device. + * groff.sh: Use pic -x with the dvi device. + + * dvi/devdvi/FontMakefile (H): Don't use -s. + + * dvi/devdvi/HI, dvi/devdvi/HB: New files. + * dvi/devdvi/Makefile: Add HI and HB to FONTS. + * dvi/devdvi/FontMakefile: Add rules for HI and HB. Include these + in FONTS. + +Mon Mar 4 13:20:14 1991 James Clark (jjc at jclark) + + * ps/psfig.diff: New file. + * ps/tmac.psfig: New file. + +Sat Mar 2 00:15:09 1991 James Clark (jjc at jclark) + + * macros/tmac.s (]=, ref*do-tl, ref*bib-print): Deleted. + (]-): Don't call ref*do-tl. + + * macros/tmac.s (ref*end-print): Use XP if [F not defined. + + * macros/tmac.s (ref*normal-print): Call FS rather than fn@do-FS. + (fn@do-FS): Rename to fn*do-FS. + + * troff/input.c (transparent_translate): New function. + (process_input_stack): Apply transparent_translate before calling + diversion::transparent_output(unsigned char). + +Wed Feb 27 00:13:25 1991 James Clark (jjc at jclark) + + * troff/input.c (do_define_macro): Define the macro before calling + skip_line. + + * xditview/Makefile: Add DEVICES variable. Change install target + to use this. + +Tue Feb 26 10:46:22 1991 James Clark (jjc at jclark) + + * groff.c (run_commands): Handle the possibility that there are + child processes other than those forked by us. + +Sun Feb 24 21:32:30 1991 James Clark (jjc at jclark) + + * lib/string.c (string::append): New function. + * lib/stringclass.h: Declare it. + +Thu Feb 21 11:49:26 1991 James Clark (jjc at jclark) + + * eqn/main.c (main): New option -N which sets + no_newline_in_delim_flag. + (do_file): If no_newline_in_delim_flag is set don't allow newlines + in delimiters. + * groff.c (main): Pass -N on to eqn. + (help, synopsis): Mention -N. + * groff.sh: Implement -N. + +Wed Feb 20 15:16:10 1991 James Clark (jjc at jclark) + + * macros/tmac.s (]=, ref*bib-print, ref*do-tl): New macros. + (]-): Call ref*do-tl if ref*need-tl is non-zero. + (XP): Allow as initializer. + +Tue Feb 19 14:09:06 1991 James Clark (jjc at jclark) + + * troff/env.c (environment::wrap_up_field): If field_spaces are + non-zero and we have a current_tab, subtract padding from + tab_distance. If this makes tab_distance <= 0, use the next tab + stop instead. If there isn't any next tab or it's a left tab, + wrap up the current tab. + (environment::start_field): Initialize tab_precedes_field. + (environment::wrap_up_tab): If there's a current field, update + pre_field_width, field_distance and tab_precedes_field. + * troff/env.h (environment::tab_precedes_field): New member. + +Fri Feb 15 01:24:00 1991 James Clark (jjc at jclark) + + * ps/ps.c (ps_printer::do_file): New function. + (ps_printer::special): Bind to `file' special. + (ps_printer::do_exec): Set ndefined_styles to 0. + +Sat Feb 9 03:03:04 1991 James Clark (jjc at jclark) + + * eqn/text.c (split_text): Grok \* and similar escapes sequences. + Avoid stripping first character from the start of unrecognized + escapes. Use lex_error instead of error to report errors. + * eqn/lex.c (get_token): Rework handling of escapes. + (lex_error): Move declaration into... + * eqn/eqn.h. + + * xditview/xditview.c (main): Make -page option work. + + * Makefile: Correct comment about -DBROKEN_SPOOLER and pageview. + +Wed Feb 6 12:28:43 1991 James Clark (jjc at jclark) + + * macros/tmac.s (B2): Correct size of box. + +Tue Feb 5 00:37:35 1991 James Clark (jjc at jclark) + + * macros/tmac.s (B2): Postpone drawing the box until in the + top-level diversion. + + * tty/tmac.tty: Add font translations for C, CR, CW. + + * groff.c (synopsis, help): Document -i. + * groff.sh: Implement -i. + + * macros/tmac.s (@NH): Put a `.' after multi-part numbers. + Simplify the construction of SN. + + * troff/number.c (parse_term): Give `|' a higher precedence. + * tbl/table.c (numeric_text_entry::simple_print): Parenthesise + accordingly. + + * macros/tmac.s (B2): Use par@finish instead of par@reset. + +Mon Feb 4 12:36:09 1991 James Clark (jjc at jclark) + + * lib/string.c (string::move): New function. + * lib/stringclass.h: Declare it. + +Sat Feb 2 16:02:16 1991 James Clark (jjc at jclark) + + * troff/env.c (distribute_space): Add optional argument + `force_forward'. + (environment::wrap_up_field): Call distribute_space with + `force_forward' argument of 1. + +Fri Feb 1 19:36:33 1991 James Clark (jjc at jclark) + + * lib/string.c, lib/stringclass.h (string::operator+=(char)): + Inline it. Move reallocation into... + (string::grow1): New function. + * pic/Makefile, tbl/Makefile, eqn/Makefile, ps/Makefile: Redo + dependencies to include library header files. + * lib/Makefile: Make string.c and lf.c depend on stringclass.h. + +Thu Jan 31 15:02:27 1991 James Clark (jjc at jclark) + + * macros/tmac.s (@NH): Use the same number registers than -ms does + for the heading level counters. Use the same string that -ms does + for the number for this heading. + +Wed Jan 30 14:25:40 1991 James Clark (jjc at jclark) + + * lib/new.c (operator new): Cast result of malloc to char *. + + * troff/input.c (spring_trap, lookup_request): Add assert that nm + is not null. + +Tue Jan 29 18:08:05 1991 James Clark (jjc at jclark) + + * groff.c (main): Support -i. + +Sun Jan 27 13:23:17 1991 James Clark (jjc at jclark) + + * pic/pic.h: Include . + + * ps/ps.c: Add declaration of mktemp. + + * Makefile: Add -DHAVE_UNION_WAIT option for CPPDEFINES. + * groff.c: If HAVE_UNION_WAIT is defined, declare wait()'s + argument as union wait *. + (run_commands): If HAVE_UNION_WAIT is defined cast wait()'s + argument to union wait *. + +Sat Jan 26 12:04:52 1991 James Clark (jjc at jclark) + + * tty/tmac.tty: Add definition of \(co. + + * pic/object.c (make_arc): Only increase radius when radius + strictly less than d. + (arc_object::update_bounding_box): May need to add 4.0 to end_quad + more than once. + + * troff/env.c (environment::environment(symbol), + environment::environment(const environment *)): Initialize + input_trap_count. + +Sat Jan 19 08:18:35 1991 James Clark (jjc at jclark) + + * tbl/main.c (main): Add exit(0). + + * ps/ps.c (ps_printer::~ps_printer): Use fseek instead of rewind. + + * pic/main.c (main): + * eqn/main.c (main): + * tbl/main.c (main): + * etc/soelim.c (main): + * driver/printer.c (printer::~printer): + * troff/node.c (real_output_file::~real_output_file, + real_output_file::flush): Check for errors on stdout. + + * most files: Add 1991 to copyright notice. + + * macros/tmac.s: Don't test \n(.x and \n(.y. + + * troff/input.c (token::next): Rename `escape_char' label to + `handle_escape_char' and `normal_char' label to + `handle_normal_char'. + +Thu Jan 17 15:46:35 1991 James Clark (jjc at jclark) + + * groff.c (main, synopsis, help): Support -a option. + * groff.sh: Likewise. Also eliminate Zflag variable by adding -z + to trflags while parsing options. + +Tue Jan 15 13:07:27 1991 James Clark (jjc at jclark) + + * troff/number.c (parse_term): With `m', `M' and `n' scale + indicators, convert scale factor to hunits before scaling. + +Mon Jan 14 12:39:12 1991 James Clark (jjc at jclark) + + * lib/font.c (scale_round): Better test for overflow when n is + negative. + +Thu Jan 10 11:10:56 1991 James Clark (jjc at jclark) + + * tbl/main.c (process_format): Add second argument of type + options*. Change callers. Allow opt->tab_char as well as '\t' + between format items. + +Mon Jan 7 12:30:18 1991 James Clark (jjc at jclark) + + * macros/tmac.an (PD): With no arguments, make sure register PD is + at least \n[.V]. + (TH): Call PD with no argument, instead of setting register PD + directly. + +Sun Jan 6 11:18:39 1991 James Clark (jjc at jclark) + + * Version 1.00 released. + +Sat Jan 5 08:44:30 1991 James Clark (jjc at jclark) + + * ps/tmac.ps, xditview/tmac.X: Add font translation of C to CR. + + * dvi/devdvi/DESC: Mount CW instead of CR. + + * dvi/tmac.dvi: Add definition of \(tm. + + * dvi/devdvi/texsy.map: Add lh, and rh. + * dvi/devdvi/texex.map: Add lt, rt, lb, rb, lk, rk. + * dvi/devdvi/texmi.map: Add *o. Regenerate fonts. + + * dvi/devdvi/FontMakefile: Generate H from cmss10. + * dvi/devdvi/Makefile: Install H. + * dvi/devdvi/H: New file. + +Fri Jan 4 15:04:57 1991 James Clark (jjc at jclark) + + * troff/env.c (vertical_spacing): Don't allow vertical spacing to + be 0. + +Thu Jan 3 13:41:19 1991 James Clark (jjc at jclark) + + * macros/tmac.s (@EN): Add \n(.V to the argument to ds@need. + + * macros/tmac.pic (PS): Avoid attempting to set negative indent. + + * macros/tmac.s (@EN): Handle the case where the equation is empty + but the label is not. + +Wed Jan 2 10:31:44 1991 James Clark (jjc at jclark) + + * troff/groff.h: New warning category WARN_SPACE. + * troff/input.c: Add WARN_SPACE to DEFAULT_WARNING_MASK. Add + WARN_SPACE to warning_table. + (interpolate_macro): Give a warning of type WARN_SPACE if the name + is longer than two characters and is not defined, but the first + two characters do make a defined name. + + * PROBLEMS: New file. + + * CHANGES: New file. + * README-0.6, README-1.00: Deleted. + + * groff.c, groff.sh: Add X75-12 and X100-12 devices. + * xditview/devX75/Makefile: Make devX75-12. + * xditview/devX100/Makefile: Make devX100-12. + + * xditview/devX100/eqnchar, xditview/devX75/eqnchar, + dvi/devdvi/eqnchar, ps/devps/eqnchar: Remove use of \R. + +Tue Jan 1 19:24:01 1991 James Clark (jjc at jclark) + + * README-0.7: Rename to README-1.00. + + * macros/tmac.pic: New file. + * macros/Makefile (install.nobin): Install tmac.pic. + +Mon Dec 31 10:40:53 1990 James Clark (jjc at jclark) + + * troff/env.c (hyphen_word): Correct the test for whether the + token is a hyphen. Reset npos to 0. + + * macros/tmac.s (par@sup-start, par@sup-end): New implementations. + +Sun Dec 30 15:53:13 1990 James Clark (jjc at jclark) + + * macros/tmac.s (ds*common-end): Call par*reset. + (PE): Likewise. + (par@reset-indent): Deleted. + + * macros/tmac.s (@IP): Divert the label. + +Sat Dec 29 14:33:32 1990 James Clark (jjc at jclark) + + * xditview/draw.c (setGC): Use a line width of .1m rather than + .04m by default; round rather than truncate value. + + * tbl/table.c (class empty_entry): New class. + (empty_entry::empty_entry, empty_entry::line_type): New functions. + (table::add_entry): Represent empty entries by objects of type + empty_entry. + (table_entry::line_type): Return -1. + (table::determine_row_type): Ignore entries with line_type 0. + Treat type -1 as non-lines. + +Fri Dec 28 15:04:41 1990 James Clark (jjc at jclark) + + * ps/devps/textmap, xditview/libXdvi/DviChar.c, tty/devlatin1/R.proto, + macros/tmac.s: Rename \(-d to \(Sd. + +Thu Dec 27 12:35:47 1990 James Clark (jjc at jclark) + + * ps/devps/textmap: Add `sd', `/_' and `3d' characters. + * xditview/libXdvi/DviChar.c: Likewise. + * dvi/devdvi/texsy.map: Add `<<', `>>'. + +Wed Dec 26 13:33:23 1990 James Clark (jjc at jclark) + + * troff/div.c (top_level_diversion::begin_page): Call + init_output() if the_output is 0. + +Sat Dec 22 12:35:29 1990 James Clark (jjc at jclark) + + * troff/input.c: Replace ESCAPE_E by ESCAPE_e and ESCAPE_C by + ESCAPE_c. + (get_copy): Turn \E into ESCAPE_E. + (token::process, asciify): Handle ESCAPE_E. + + * macros/tmac.s (ds*common-end, par@reset): Add `.rj 0'. + (RD): New macro. + (DS): Implement `.DS R'. + +Fri Dec 21 11:41:53 1990 James Clark (jjc at jclark) + + * macros/tmac.s (FS): New macro. + + * macros/tmac.s (fn@do-FS): Use @LP instead of LP. + + * macros/tmac.s (cov*tl-init): Remove after first execution + instead of aliasing to @nop. Call top of page macro explicitly + instead of setting trap; call @init first. Set pg@top as top of + page macro. + (cov*auto-init): Deleted. Set cov*tl-init instead of + cov*auto-init as top of page trap. + (TL, LP): Do a break instead of calling cov*tl-init. + (cov*print): With RP format but no TL, alias FS and FE to @FS and + @FE; in this case also give a warning and always start another + page. No need to set pg@top here. + (cov*tl-init): Rename to cov*first-page-init. + + * macros/tmac.s (RP): Do `.pn 0'. + (cov*tl-init): With RP format don't do `.pn 0'. + + * macros/tmac.s (pg@cs-top): Set no space mode. + + * macros/tmac.s (par@TL, par@AU, par@AI): New macros. + (cov*ab-init): Alias TL, AU and AI to these. + +Thu Dec 20 10:10:50 1990 James Clark (jjc at jclark) + + * macros/tmac.s (@EQ): Move the space before the equation into @EN + (@EN): Do nothing unless \n[dl] is > 0. + +Tue Dec 18 12:20:47 1990 James Clark (jjc at jclark) + + * pic/object.c (ellipse_object::radius): New function. + + * VERSION: Change version to 0.7. + + * tbl/table.c (block_entry::do_divert): Declare return type as + void. + (block_entry::divert, alphabetic_block_entry::divert): Return 1. + +Mon Dec 17 12:30:34 1990 James Clark (jjc at jclark) + + * troff/column.c: New file. + * troff/Makefile: Corresponding changes. + + * troff/hvunits.c (scale(vunits, vunits, vunits)): New function. + Friend of vunits. + + * troff/div.c (top_level_diversion::space): If the space causes + the first-page transition and springs a trap, truncate the space + to 0. + +Fri Dec 14 12:30:02 1990 James Clark (jjc at jclark) + + * ps/ps.c (ps_printer::do_import): Add a `clear' after including + the document. + + * pic/troff.c (troff_output::line_thickness, + troff_output::set_fill): Do a horizontal motion to compensate for + the width of the \D escape sequence. + +Thu Dec 13 10:17:14 1990 James Clark (jjc at jclark) + + * xditview/tmac.X: Reinstate definition of \(rn, but only for X100 + (not X75). + + * eqn/sqrt.c (sqrt_box::compute_metrics): Supply missing argument + to printf. + + * tbl/table.c (simple_entry::simply_print): Don't declare as pure. + Supply empty definition. + (text_entry::simple_print, simple_text_entry::simple_print): + Delete declarations. + (table::add_entry): Represent empty entries by objects of type + `simple_entry'. + +Wed Dec 12 08:50:48 1990 James Clark (jjc at jclark) + + * troff/Makefile: Remove -DHYPHEN_CONTROL from DEFINES. + + * tbl/table.c (left_text_entry::add_tab): New function. + + * macros/tmac.s: Make @RT an alias for par@reset. Make RT + initialize like LP. + +Mon Dec 10 11:19:55 1990 James Clark (jjc at jclark) + + * troff/env.c (environment::start_field): Give an error message if + there is no next tab. + +Sun Dec 9 11:46:40 1990 James Clark (jjc at jclark) + + * troff/env.c (hyphenate): Skip initial elements with zero + hyphenation code. + + * macros/tmac.s (par@init): Keep VS in points rather than units. + +Sat Dec 8 23:00:27 1990 James Clark (jjc at jclark) + + * pic/main.c (main): Implement `-c' option. + * pic/output.h: Declare make_tpic_output(). + * pic/tex.c (tex_output::set_pen_size): Make it virtual and + protected. + (tpic_output): New class. + (tpic_output::tpic_output, tpic_output::set_pen_size, + tpic_output::command, make_tpic_output): New functions. + +Fri Dec 7 11:57:41 1990 James Clark (jjc at jclark) + + * tbl/main.c (main): Call `.ab' if \n(.g is false. Define TS/TE + if they're not already defined. + * tbl/table.c (init_output): Don't test \n(.g. + + * troff/input.c (do_if_request): Delete `g' condition. Recognize + `d', `r' and `c' conditions even in compatibility mode. + +Tue Dec 4 09:13:47 1990 James Clark (jjc at jclark) + + * ps/tmac.ps (ps-bb): Protect against negative numbers in bounding + box. + +Mon Dec 3 07:18:26 1990 James Clark (jjc at jclark) + + * troff/env.h (environment::prev_line_interrupted): New member. + (environment::get_prev_line_interrupted): New function. + * troff/env.c (environment::newline): Set prev_line_interrupted. + (environment::environment(const environment *), + environment::environment(symbol)): Initialize + prev_line_interrupted. + * troff/input.c (process_input_stack): Don't give special + treatment to space and newline at the beginning of the line if the + previous line was interrupted. + +Sat Dec 1 15:48:37 1990 James Clark (jjc at jclark) + + * eqn/eqn.y: Disallow PRIME by itself. + * eqn/lex.c (token_table): Bind `opprime' instead of `prime' to + PRIME. + (def_table): Remove definition of '. Define prime to be `. + + * eqn/eqn.y: Split off part of rule `script' into a new rule + `nonsup'. + +Fri Nov 30 10:23:44 1990 James Clark (jjc at jclark) + + * macros/tmac.s ({, }): New string aliases. + +Thu Nov 29 11:34:40 1990 James Clark (jjc at jclark) + + * README-0.7: New file. + +Wed Nov 28 10:09:57 1990 James Clark (jjc at jclark) + + * macros/tmac.s: New file. + * man/groff_ms.man: New file. + * Makefile: Add definition of TMAC_S. Pass TMAC_S in SUBFLAGS. + * Makefile.bd: Similarily. + * man/Makefile: Add groff_ms.n to MAN7PAGES. Replace @TMAC_S@. Add + definition of TMAC_S. + * macros/Makefile: Add definition of TMAC_S. Install tmac.s. + * macros/TODO: New file. + +Sat Nov 24 20:04:54 1990 James Clark (jjc at jclark) + + * troff/env.c (right_justify): New function. + (init_env_requests): Bind this to request "rj". + (center_lines): Set right_justify_lines to 0. If we get a bad + integer, center 1 line. + (environment::environment(symbol), environment::environment(const + environment *)): Initialize right_justify_lines. + (environment::get_right_justify_lines): New function. + (init_env_requests): Bind this to number_register ".rj". + + * troff/env.c (environment::choose_breakpoint): Implement + hyphenation_margin and hyphenation_space. + (environment::get_hyphenation_space, + environment::get_hyphenation_margin): New functions. + (init_env_requests): Bind these to .hys and .hym. + (hyphenation_space_request, hyphenation_margin_request): New + functions + (init_env_requests): Bind these to hys and hym. + (environment::environment(symbol), environment::environment(const + environment *)): Initialize hyphenation_margin and + hyphenation_space. + * troff/env.h: Corresponding changes to class environment. + +Fri Nov 23 09:08:16 1990 James Clark (jjc at jclark) + + * troff/div.c (blank_line): Always do a break. + + * eqn/box.c (do_text): Turn off escapes while appending text to + string. + +Thu Nov 22 10:58:59 1990 James Clark (jjc at jclark) + + * troff/input.c (while_break_request, while_continue_request): New + functions. + (init_input_requests): Bind these to "break" and "continue". + (while_depth, while_break_flag): New variables. + (while_request): Update while_depth. Break out of loop if + while_break_flag is set. + +Wed Nov 21 10:54:40 1990 James Clark (jjc at jclark) + + * tbl/table.c (init_span_reg): Initialize span_width_reg to \n(.H + rather than 0. + +Mon Nov 19 00:45:03 1990 James Clark (jjc at jclark) + + * Makefile: Include -DBROKEN_SPOOLER by default. Expand comment. + + * stringify: New file. + * Makefile (groff.o): Use stringify. + + * xditview/tmac.X: Remove definition of \(rn. + * xditview/libXdvi/DviChar.c: Remove radicalex from + Adobe_symbol_map. + +Sat Nov 17 10:44:58 1990 James Clark (jjc at jclark) + + * tbl/table.c (table::add_entry): Allow alphabetic text blocks. + (alphabetic_block_entry::alphabetic_block_entry, + alphabetic_block_entry::divert, alphabetic_block_entry::print): + New functions. + (block_entry::divert): Split off body into ... + (block_entry::do_divert): If the block is alphabetic, subtract 2n + from the line length; also update the span width to dl+2n, and the + alphabetic span width to dl. + + * driver/input.c (do_file): While reading argument to D command, + when expanding buffer, multiply szp by sizeof(int) rather than 2 + in the argument to memcpy. + + * tbl/table.c (compute_span_width): Add 2n rather than 1n to the + width of alphabetic columns. + +Fri Nov 16 06:34:27 1990 James Clark (jjc at jclark) + + * troff/node.c (lookup_family): Supply second argument to lookup. + + * troff/dictionary.c (dictionary::lookup): After an unsuccesful + search, return immediately if v is 0. + + * pic/troff.c: Define EQN_NO_EXTRA_SPACE_REG. + (troff_output::start_picture): Set this reg. + (troff_output::end_picture): Remove this reg + * eqn/box.c (box::extra_space): Don't produce `\x's if + EQN_NO_EXTRA_SPACE_REG is defined. + + * eqn/eqn.y: Allow just a PRIME to be a `simple'. + * eqn/text.c (split_text): Map ' to \(fm when it's the first + character. + +Thu Nov 15 10:35:06 1990 James Clark (jjc at jclark) + + * macros/tmac.e: Use font 3 instead of B in $c. Remove `bd' + requests. + + * troff/div.c (top_level_diversion::top_level_diversion): + Initialize page_number to 0. + +Wed Nov 14 21:41:58 1990 James Clark (jjc at jclark) + + * groff/troff (environment::environment(const environment *)): + Initialize name to e->name, rather than "anonymous". + +Sat Nov 10 01:59:37 1990 James Clark (jjc at jclark) + + * xditview/libXdvi/Dvi.c (ShowDvi): If eof is encountered, reset + requested_page. Split middle part into ... + (FindPage): New function. + (SetValues): If we don't yet know the last page, and the requested + page is greater than the current page, call FindPage. + Update the font_map_string before doing this. + + * xditview/tmac.X: Add definitions of \(sq, \(ga, \(dg and \(dd. + Translate \(lh and \(rh into left and right double arrows. + + * troff/node.c (class hyphen_inhibitor_node): New class. + (hyphen_inhibitor_node::hyphen_inhibitor_node, + hyphen_inhibitor_node::copy, hyphen_inhibitor_node::same, + hyphen_inhibitor_node::type, + hyphen_inhibitor_node::get_hyphenation_type): New functions. + (node::add_discretionary_hyphen): Use hyphen_inhibitor_node rather + than dbreak_node(0, 0) to represent a `\%' at the beginning of a + word. + +Fri Nov 9 16:05:38 1990 James Clark (jjc at jclark) + + * troff/node.h (dummy_node::get_hyphenation_type, + transparent_dummy_node::get_hyphenation_type): Declare them. + * troff/node.c: (dummy_node::get_hyphenation_type, + transparent_dummy_node::get_hyphenation_type): New functions. + +Wed Nov 7 10:09:06 1990 James Clark (jjc at jclark) + + * xditview/libXdvi/draw.c: If M_PI not defined after including + math.h, then define it. + + * xditview/Makefile: Add definition of AR. Pass it to the submake + in libXdvi. + * xditview/libXdvi/Makefile: Add definitions of AR and RANLIB. + +Tue Nov 6 10:14:27 1990 James Clark (jjc at jclark) + + * troff/dictionary.h (object_dictionary::alias): Declare return + value as int. + * troff/dictionary.c (object_dictionary::alias): Return non-zero + if the old name was defined. + * troff/input.c (alias_macro): Give a warning if the old name was + not defined. + * troff/reg.c (alias_reg): Likewise. + +Mon Nov 5 00:31:39 1990 James Clark (jjc at jclark) + + * troff/input.c (token::next): Delete implementation of \R. + + * macros/Makefile: Strip comments from tmac.e while installing it. + + * troff/input.c: New variable `nroff_mode'. + (troff_request, nroff_request): New functions. + (init_input_requests): Bind `troff' and `nroff' to troff_request + and nroff_request. + (do_if_request): Compute results of t and n conditions from + nroff_mode. + + * text/text.c (split_text): Fix typo in >=. + + * eqn/lex.c: Add definition of `==' to def_table. + +Fri Nov 2 02:49:09 1990 James Clark (jjc at jclark) + + * pic/tex.c (tex_output::start_picture): Change the definitions of + \graph and \graphtemp so that they work properly with Plain TeX. + + * pic/tex.c (tex_output::solid_arc): Ensure that the second angle + argument to `ar' is not less than the first. + + * pic/pic.y: Allow a comma between elements of the variable list + in the argument to `reset'. + + * pic/object.c (arc_object::arc_object): Fix computation of + radius. + + * eqn/main.c (main): Add exit(0). + +Thu Nov 1 02:03:50 1990 James Clark (jjc at jclark) + + * troff/div.c (begin_page): Test no_space_mode after doing the + break, but still push the page ejector cookie before doing the + break. Also set the next page number after doing the break. + + * xditview/xditview.c (NewFile): Don't set the title and icon name + if this is the first file and its name is `-'. + * groff/groff.c: Define a new device flag XT_OPTION. Set it for + the X75 and X100 devices. + (main): If a device has the XT_OPTION flag set and there's exactly + one file argument, pass the driver -xrm and -title options to set + the icon name and window title to the name of the file. + + * troff/env.c (environment_switch): If there was an argument but + it wasn't a valid number or name, then pop an environment but + don't give an error message on underflow. + + * troff/number.c (start_number): Correct spelling in error message. + + * troff/input.c (token::delimiter): Don't print an error message + if err is false. + + * xditview/libXdvi/parse.c (ParseInput): In case 'D', only call + ParseDrawFunction if dw->display_enable is true. + +Wed Oct 31 05:49:50 1990 James Clark (jjc at jclark) + + * pic/pic.y: Parse text positioning like normal attributes, so as + to allow `"text" at 0,0 ljust'. Don't allow `center' as a + positioning attribute. + +Mon Oct 29 22:50:38 1990 James Clark (jjc at jclark) + + * tbl/main.c (process_data): When in state START while reading a + text block, don't change to state MIDDLE if c is a newline. + +Sun Oct 28 21:59:56 1990 James Clark (jjc at jclark) + + * dvi/dvi.c (dvi_printer::begin_page): Rename `i' variable to `j' + so as to avoid shadowing parameter. + +Wed Oct 24 18:35:39 1990 James Clark (jjc at jclark) + + * tbl/table.c (trim_space): Deleted. + (table::add_entry): Don't call trim_space. + +Mon Oct 22 03:48:39 1990 James Clark (jjc at jclark) + + * VERSION: Change version to 0.6. + + * troff/number.c (parse_expr): Make == work. + +Sat Oct 20 11:28:17 1990 James Clark (jjc at jclark) + + * man/grog.man: New file. + * man/Makefile: Add grog.n to MAN1PAGES. + * etc/grog.sh: New file. + * etc/Makefile: Install grog.sh as grog. + +Fri Oct 19 11:17:15 1990 James Clark (jjc at jclark) + + * troff/input.c (token::next): Implement \E. + +Thu Oct 18 11:56:24 1990 James Clark (jjc at jclark) + + * xditview/tmac.X: Change font translations to match tmac.ps. + + * troff/input.c (non_empty_name_warning): Don't give a warning if + `\{' terminates the name. + +Tue Oct 16 10:04:23 1990 James Clark (jjc at jclark) + + * ps/devps/symbol.diff: New file. + * ps/devps/FontMakefile: Mention symbol.diff. + +Sun Oct 14 11:46:46 1990 James Clark (jjc at jclark) + + * troff/node.c (font_position): Use get_long_name to read the + external_name. + + * troff/env.c (environment_switch): If we get a number that's < 0 + or >= NENVIRONMENTS, treat it like a name. + Change NENVIRONMENTS to 10. + + * troff/groff.h: Remove definition of FONTS_MAX. + * troff/node.h (class font_family): Make map a pointer instead of + an array. Add a map_size member. Make it a class. Make nm const + and public. Make invalidate_fontno a friend. + * troff/node.c: Define font_table_size. Make font_info a pointer + rather than an array. + (class troff_output_file): Allocate font_position dynamically. Add + nfont_positions member. + (troff_output_file::set_font): Grow font_position if necessary. + (troff_output_file::~troff_output_file): Delete font_position. + (troff_output_file::troff_output_file): Allocate font_position. + (grow_font_table): New function. + (troff_output_file::really_begin_page, + troff_output_file:really_copy_page): Use nfont_positions rather + than FONTS_MAX. + (mount_font_no_translate, mount_style): Call grow_font_table if + necessary. + (font_family::font_family): Allocate map. + (font_family::make_definite): Grow map if necessary. Use + font_table_size instead of FONTS_MAX. + (font_family::~font_family): New function. + (invalidate_fontno): Use font_family::map_size. + (get_fontno, env_space_width, env_half_narrow_space_width, + env_narrow_space_width, symbol_fotno, is_good_fontno, + get_bold_fontno, make_glyph_node): Use font_table_size rather than + FONTS_MAX. + (next_available_font_position): Never return 0. + +Fri Oct 12 10:17:52 1990 James Clark (jjc at jclark) + + * ps/tmac.ps: Add font translations for compatibility with dpost. + +Thu Oct 11 12:09:03 1990 James Clark (jjc at jclark) + + * eqn/pile.c: Rename default_baseline_sep to baseline_sep. + Move BASELINE_SEP_FORMAT and COLUMN_WIDTH_FORMAT into pbox.h. + Move definitions baseline_sep, shift_down, column_sep, + matrix_side_sep into... + * eqn/box.c: Add them to param_table. + * eqn/pbox.h: Add declarations to pbox.h. + + * troff/input.c (set_string): Cast value to unsigned char *. + + * troff/token.h (process_input_stack): Declare it static before + declaring it a friend. + +Wed Oct 10 09:59:13 1990 James Clark (jjc at jclark) + + * dvi/devdvi/texex.map: Fix positions of extensible brace middle + and bottom. + * dvi/devdvi/EX: Regenerate. + + * troff/input.c (init_charset_table): Make ", ', ), ], *, \(dg + transparent. + +Tue Oct 9 08:34:02 1990 James Clark (jjc at jclark) + + * eqn/lex.c: In defaults_table, make definition of `dot' call + `dot_def'. Don't explicitly make it roman. Similarily for other + accents. + + * pic/lex.c (for_input::for_input): Add by_is_multiplicative + argument. + (for_input::get, for_input::peek): Use this. + (do_for): Add by_is_multiplicative argument. + * pic/pic.y: Change optional_by clause to allow '*' after `by'. + Change semantic value of optional_by to be a double plus a flag + saying whethet the by clause is multiplicative. + + * eqn/lex.c (get_delimited_text): Remember location of start of + definition. Improve error handling when EOF is encountered. + + * lib/font.h: Rename handle_x_command to + handle_unknown_font_command. + * lib/font.c (font::load): Call handle_unknown_font_command for + any unknown command in the font description file. Don't call + handle_x_command. Include the name of the command in the argv. + Improve message for unknown command after kernpairs or charset + command. + * ps/ps.c (ps_font::handle_x_command): Rename to + handle_unknown_font_command. Remove message about `x download' + command. Give error message for wrong number of arguments. + * ps/devps/afmtodit: Generate `encoding' instead of `x encoding'. + * dvi/dvi.c (dvi_font::handle_x_command): Rename to + handle_unknown_font_command. Give an error message for wrong + number of arguments. Rename design_size to designsize. + * dvi/tfmtodit.c (main): Generate `checksum' instead of `x + checksum', `designsize' instead of `design_size'. + +Mon Oct 8 00:38:55 1990 James Clark (jjc at jclark) + + * eqn/*.[chy]: Change underaccent to uaccent. + + * eqn/eqn.y: Add rule for underaccent. Declare UNDERACCENT token; + give it the same precedence as ACCENT. + * eqn/other.c (make_underaccent_box): New function. + * eqn/box.h: Declare it. + * eqn/lex.c: Add UNDERACCENT to token_table. Add utilde to + def_table. + +Sun Oct 7 11:25:16 1990 James Clark (jjc at jclark) + + * pic/pic.y (reset_all): New function. Called in rule for RESET. + (parse_init): Call reset_all. + (define_variable): When defining scale reset only those + pre-defined variables that are scaled. + (defaults_table): Add `scale' as non-scaled value. + + * pic/pic.y: Redo parsing of text adjustments: parse adjustments + together with the text; allow any number of positioning words; + allow center as a positioning word. + + * pic/object.c (output::compute_scale): Get picture maximum height + and width from variables called maxpswid and maxpsht. + * pic/pic.y: Add maxpswid and maxpsht to defaults_table. + +Sat Oct 6 10:16:56 1990 James Clark (jjc at jclark) + + * pic/object.c (object_spec::make_text): Multiply textht by number + of text items. + + * pic/pic.y: Allow `sprintf("string", expr,...)' wherever text can + occur. + (do_sprintf): New function. + (pic.gperf): Add sprintf token. + (text, sprintf): New rules. + + * pic/pic.y: `rand()' with no arguments returns a random number + in the range [0,1). + + * pic/pic.y: Allow a bare expression to be an attribute: change + precedences to support this. Change optional_ordinal rule to + optional_ordinal_last to avoid reduce/reduce conflict. + * pic/object.c (object_spec::object_spec): Initialize direction. + + * pic/pic.y: Implement ^ operator meaning exponentiation. + + * troff/node.h: Add default argument to mount_font. + * troff/node.c (font_position): Read an optional third argument + giving the external_name. + (mount_font): Add optional argument giving the external_name. + (mount_font_not_translate): Have additional argument giving + external name. Use this name to load the font. Pass both names + to font_info::font_info. + (font_info::font_info): Have additional argument giving + external_name. + (class tfont): New member external_name. + (font_info::get_tfont): Use external name to construct tfont_spec. + +Fri Oct 5 04:03:13 1990 James Clark (jjc at jclark) + + * eqn/lex.c (init_table): Add argument giving device. Define + name of device to be "1". + (do_ifdef): Counts as true if the argument has been defined with + `define'. + * eqn/main.c (main): Call init_table with device argument. Make + device local to main. + * eqn/eqn.h: Change declaration of init_table. Remove declaration + of device. + + * pic/lex.c (get_delimited): Allow text to be delimited by + matching {}s. Don't recognize ending delimiter within a string. + + * troff/input.c (get_delim_name): New function. + (token::next): Implement \C. + + * lib/font.c (font::load): Grok ---. Add an alias for each + character based on its code. + (font::get_code_width): Deleted. + * lib/font.h (class font): Declare font::number_to_index(). + Remove declaration of font::get_code_width. + * lib/nametoindex.c (font::name_to_index): Add 512 rather than 256 + to indices of named characters. + (font::number_to_index): New function. + * troff/input.c (font::number_to_index): New function. + (get_charinfo_by_number, charinfo::get_number, + charinfo::set_number): New functions. + (token::next): Turn \N into a TOKEN_NUMBERED_CHAR. + (token::process, token::description, token::get_char, + token::add_to_node_list, token::operator==): Handle + TOKEN_NUMBERED_CHAR. + * troff/charinfo.h: Declare get_charinfo_by_number, + charinfo::get_number, charinfo::set_number. Add NUMBERED flag to + charinfo class. + (charinfo::numbered): New function. + * troff/token.h: Add TOKEN_NUMBERED_CHAR. + * troff/env.h (class environment): Remove declaration of ... + * troff/env.c (environment::make_numbered_char_node): Deleted. + * troff/node.c (make_numbered_node): Deleted. + (class numbered_glyph_node): Remove. + (troff_output_file::put_char_width, troff_output_file::put_char): + Handle numbered chars. + (troff_output_file::numbered_char): Removed. + (tfont::get_code_width): Removed. + (make_glyph_node): Don't search special fonts for numbered + characters. + * troff/node.h: Remove declaration of make_numbered_node. + * driver/input.c (do_file): Handle N command. + * driver/printer.h: Add declaration of ... + * driver/printer.c (printer::set_numbered_char): New function. + * dvi/tfmtodit.c (main): Generate unnamed entries. + * ps/devps/afmtodit: Likewise. + * xditview/xtotroff.c (MapFont): Likewise. + * xditview/libXdvi/parse.c (ParseInput): Grok N command. + + * tbl/main.c (process_format): If multiple widths are specified + for a column but all the widths are the same, don't give an error + message. + + * tbl/table.c (table::do_row): If the current row is all lines and + the stuff doesn't contains a line, mark the top of the row after + printing stuff before the row. If the current row is not all + lines and the stuff doesn't contain a line, don't unnecessarily + mark the top of the row before printing the stuff. + +Mon Oct 1 11:42:00 1990 James Clark (jjc at jclark) + + * troff/groff.h: Remove MAX_PATH. + * troff/input.c (open_file): Dynamically allocate space for the + path. + (open_mac_file, process_macro_file): Corresponding changes. + +Sun Sep 23 18:56:26 1990 James Clark (jjc at jclark) + + * troff/node.h (class output_file): Make copy_file pure. Add + vspace method ifdef COLUMN. Add is_printing method. + * troff/node.c: Add class printing_reg. Add class + real_output_file. Derive other output_file classes from + real_output_file; in these classes rename begin_page to + really_begin_page, print_line to really_print_line, copy_file to + really_copy_file, transparent_char to really_transparent_char. + Move output_file::flush to real_output_file. Add printing member + to class output_file. + * troff/div.h: Remove printing member from top_level_diversion. + Add vspace member function to class diversion ifdef COLUMN. Add + some declarations ifdef COLUMN. + * troff/div.c (top_level_diversion::copy_file, + top_level_diversion::transparent_output, + top_level_diversion::output): Don't test printing member before + output. + * troff/input.c: Handle initial variable_space_request ifdef + COLUMN. + * troff/Makefile: Add column.c but comment it out. Add -DCOLUMN + but comment it out. + +Sat Sep 22 11:32:22 1990 James Clark (jjc at jclark) + + * troff/div.c (diversion::need): Make any space forced. If we + sprung a trap, set truncated_space to minus the distance to the + trap and set needed_space to the amount that was needed. + (top_level_diversion::space): A forced space turns no_space_mode + off. + (class constant_vunits_reg): New class. + (init_div_requests): Implement number registers .trunc and .ne + using constant_vunits_reg. + (class truncated_space_reg): Deleted. + + * troff/div.h: Don't have a no_space_mode member in diversion. + Instead have it in top_level_diversion. + * troff/div.c (diversion::diversion): Don't initialize + no_space_mode. + (top_level_diversion::top_level_diversion): Initialize + no_space_mode. + (no_space, restore_spacing): Do nothing if curdiv != topdiv. + (macro_diversion::output): Don't clear no_space_mode. + + * troff/input.c (diverted_space_node::reread): Don't call + environment::do_break. In fill mode, act like a blank line. + (diverted_copy_file_node::reread): Don't call + environment::do_break. + + * troff/div.c (blank_line): New function. + * troff/div.h: Declare it. + * troff/input.c (process_input_stack): Call it. + + * troff/div.c (truncated_space_reg::get_string): New function. + (init_div_requests): Bind to .trunc. + (space_request, top_level_diversion::space, + top_level_diversion::output, macro_diversion::space, + macro_diversion::output): Update truncated_space. + (macro_diversion::output): Redo calculations when trap sprung. + (macro_diversion::output, macro_diversion::space): No need for + trap_flag. + + * troff/div.c (top_level_diversion::output): Set nl_reg_contents + after truncating post line spacing. + +Fri Sep 21 11:27:25 1990 James Clark (jjc at jclark) + + * ps/devps/prologue (MF, SF): Make them work even if setfont is + defined as a procedure rather than as an operator. + +Thu Sep 20 12:55:05 1990 James Clark (jjc at jclark) + + * troff/div.c (macro_diversion::space): Ignore no_space_mode. + +Wed Sep 19 10:54:37 1990 James Clark (jjc at jclark) + + * troff/div.c (top_level_diversion::output): Merge + output_file::print_line and output_file::end_of_line member + functions. + * troff/div.h (class output_file): + * troff/node.c (troff_output_file::print_line, + troff_output_file::end_of_line, output_file::end_of_line, + ascii_output_file::print_line, suppress_output_file::print_line): + Corresponding changes. + +Tue Sep 18 11:31:47 1990 James Clark (jjc at jclark) + + * troff/input.c (token::next): Don't give a warning for `\.'. + + * troff/env.c (environment::get_center_lines): New function. + (init_env_requests): Bind number register .ce to it. + * troff/env.h: Declare it. + * tbl/table.c (table::init_output): Define reset macro to restore + .ce. If center option not given, store .ce in SAVED_CENTER_REG. + Then do .ce 0. + (table::print): If center option not given, then imply center + option if SAVED_CENTER_REG > 0. + +Mon Sep 17 09:19:19 1990 James Clark (jjc at jclark) + + * ps/devps/Makefile: Remove T from FONTS. Remove TSymbol.ps and + Troff.ps from DOWNLOAD. + + * troff/Makefile: Change comment in DEFINES to avoid confusing + System V make. + + * ps/ps.c (ps_printer::do_exec): Allow newlines within PostScript + code. Don't try to catch errors with stopped. + (check_line_lengths): New function. + * ps/devps/prologue (EXEC): Deleted. + (EBEGIN, EEND): New procedures. + +Sun Sep 16 14:51:15 1990 James Clark (jjc at jclark) + + * troff/input.c: Include request.h before node.h. + * troff/node.c: Likewise. + * troff/env.c: Likewise. + * troff/div.c: Likewise. + * troff/node.h (class special_node): Store argument as a macro + rather than a char *. + * troff/node.c (special_node::special_node, special_node::copy): + Grok this. + (special_node::~special_node): Deleted. + (special_node::tprint): Deleted. + (special_node::tprint_start, special_node::tprint_end, + special_node::tprint_char): New functions. + (troff_output_file::special): Deleted. + (troff_output_file::start_special, troff_output_file::end_special, + troff_output_file::special_char): New functions. + * troff/input.c (special_node::tprint): New function. + (do_special): Use macro not char *. + (do_transparent_macro): Deleted. + (token::next): Don't call do_transparent_macro. + + * troff/input.c (token::next): Add 'Y' case. + (do_transparent_macro): New function. + * troff/node.c (troff_output_file::special): Handle newlines with + argument using new continuation convention. + * driver/input.c (get_string): Cope with continuation convention. + (do_file): Don't call skip_line after calling get_string(1). + * ps/ps.c (ps_printer::special, ps_printer::do_import, + ps_printer::do_def, ps_printer::do_exec): Cope with newlines in + arg. + * xditview/libXdvi/parse.c (ParseInput): Ignore lines starting + with +. + +Sat Sep 15 19:00:10 1990 James Clark (jjc at jclark) + + * troff/input.c (asciify): By default, illegal input characters + should return empty string. + + * troff/input.c (copy_file): Handle first page transition like title. + (token::next, process_input_stack): Grok COPY_FILE_REQUEST. + + * troff/input.c (token::next): Improve error message for EOF after + escape character. + (input_char_description): New function. + (get_char_for_escape_name): Use input_char_description. + (token::next): Warn about unrecognized escape sequences. + (warning_table): Add WARN_ESCAPE. + * troff/groff.h: Declare WARN_ESCAPE. Change WARN_TOTAL + accordingly. + + * troff/token.h: Remove declaration of process_input_stack. + + * troff/input.c: Remove declaration of init_hyphen_requests. + * troff/request.h: Correct spelling in declaration of same. + + * troff/input.c (token::next): Check whether escape_char is 0. + +Fri Sep 14 12:09:25 1990 James Clark (jjc at jclark) + + * groff.c (main, usage, help): Implement -P and -L options. + * groff.sh: Likewise. + + * troff/input.c (token::next): Use some gotos to avoid code + duplication. + + * troff/input.c (get_long_name, get_name, read_long_ecsape_name): + Avoid calling symbol::symbol if name empty. + +Thu Sep 13 06:21:45 1990 James Clark (jjc at jclark) + + * troff/input.c (init_input_requests): Make \n(.x return the major + version number and \n(.y return the minor version number. + * troff/Makefile: Construct file majorminor.c defining + major_version and minor_version automatically from ../VERSION. + + * troff/node.c (class glyph_node): Make operator new and operator + delete public. + (class ligature_node): Similarily. + + * troff/input.c (operator==(const macro &, const macro &)): New + function. + (non_interpreted_node::same): Use this. + (string_iterator::string_iterator): Make macro& argument const. + + * troff/input.c (input_iterator::get): New function. Don't make + asciify_macro or class non_interpreted_node friends of class + input_iterator. + (non_interpreted_node::interpret): Use input_iterator::get. + (asciify_macro): Likewise. + + * troff/input.c (~token_node, ~string_iterator, ~arg_list, + ~non_interpreted_node): Deleted. + * troff/node.c: (~suppress_output_file, ~ascii_output_file): + Deleted. + + * troff/symbol.h: Make all symbol member functions const. + + * lib/strtol.c: New file. + * lib/Makefile: Add strtol.c. + * Makefile: Define STRTOL as strtol.o to include strtol in + libgroff.a. + +Wed Sep 12 10:00:49 1990 James Clark (jjc at jclark) + + * pic/troff.c (troff_output::simple_circle): Divide by scale. + +Tue Sep 11 14:17:16 1990 James Clark (jjc at jclark) + + * troff/input.c (do_special): Use input_level. + + * troff/token.h (TOKEN_BACKSPACE): New token. + (token::backspace): New function. + * troff/input.c (token::description, token::next, token::process): + Grok TOKEN_BACKSPACE. + (do_special): Turn TOKEN_BACKSPACE back into \b. + + * troff/token.h (token::leader): New function. + * troff/input.c (do_special): Turn TOKEN_LEADER back into \001. + + * troff/input.c (do_special): Turn TOKEN_TAB back into \t. + + * troff/input.c (do_special): Use token::description in error + message. + +Mon Sep 10 11:06:27 1990 James Clark (jjc at jclark) + + * troff/input.c (decode_args): Combine quoted and + quote_input_level variables. Make it a for (;;) loop. + + * troff/input.c (get_char_for_escape_name): Check for \001 and \b. + + * troff/input.c (read_long_escape_name): The test for whether to + expand buffer was off by 1. + (read_string): Similarily. + +Fri Sep 7 11:45:50 1990 James Clark (jjc at jclark) + + * troff/input.c: Use `const int' rather than `static const int'. + + * troff/div.h (diversion::copy_file): Declare as pure virtual. + (macro_diversion::copy_file): New function. + * troff/node.h: New class diverted_copy_file_node. + * troff/node.c: Implement it. + * troff/input.c (copy_file): Use diversion::copy_file. Handle + first page transition by pushing a diverted_copy_file_node. + * troff/input.c (token::next, process_input_stack): Don't handle + COPY_FILE_REQUEST. + +Thu Sep 6 13:29:10 1990 James Clark (jjc at jclark) + + * ps/ps.c (flush_sbuf): Remember to add sbuf_kern when checking + whether space widths need adjusting. + + * troff/charinfo.h: Generalize translated_to_space to + special_translation so as to allow translation to \&. + * troff/input.c (translate): Allow translation to \&. + (charinfo::*): Corresponding changes. + * troff/node.c (make_node, node::add_char): Corresponding changes. + * troff/node.h (dummy_node::dummy_node): Allow optional first + argument. + + * lib/lib.h: Make codes 0200 to 0237 illegal input characters. + * troff/token.h: Remove TOKEN_TITLE. Remove token::title. Add + TOKEN_REQUEST. + * troff/input.c (token::next): Turn a TITLE_REQUEST into a + TOKEN_REQUEST with an argument of TITLE_REQUEST. + (token::process): Grok that. + * troff/input.c (copy_file): Handle first page transition like + title by pushing a COPY_FILE_REQUEST cookie. + (token::next, process_input_stack): Grok that. + * troff/node.h (output_file::copy_file): Add x and y arguments. + Make it non-pure. + * troff/div.c (top_level_diversion::copy_file): Supply them. + * troff/node.c (troff_output_file::copy_file): Add x and y + arguments; moveto specified position. Invalidate font_position + array after copying file. + (output_file::copy_file): New function. + (suppressed_output_file::copy_file, ascii_output::copy_file): + Removed. + * troff/input.c (transparent_file): New function. + (init_input_requests): Bind to "trf". + (token::next): Handle TRANSPARENT_FILE_REQUEST cookie. + (process_input_stack): Likewise. + + * troff/Makefile: Add ../lib/lib.h to GROFF_H. + + * troff/node.c (init_node_requests): New number registers .kern + pointing to global_kern_mode, and .lg pointing to + global_ligature_mode. + + * troff/node.c (ligature): Don't change it if we get a bad + integer. + + * troff/input.c (do_define_string): Don't strip tabs. + + * troff/input.c (asciify_macro): Make the string_iterator auto. + + * troff/node.c (init_font_requests): Rename to... + (init_node_requests): + * troff/node.h: Change declaration. + * troff/input.c (main): Change call. + + * troff/input.c (node::reread, diverted_space_node::reread): New + methods. + (process_input_stack): Call reread rather than + get_diverted_space_node. + * troff/node.c (node::get_diverted_space_node, + diverted_space_node::get_diverted_space_node): Removed. + * troff/node.h: Declare reread methods instead of + get_diverted_space_node methods. Make `n' member private. + * troff/input.c: (token::diverted_space): Removed. + * troff/token.h: Removed declaration. + + +Tue Sep 4 00:48:04 1990 James Clark (jjc at jclark) + + * eqn/script.c (script_box::compute_metrics): Don't let + SUP_RAISE_FORMAT become negative. + + * tbl/table.c (table::do_row): Entries that don't end in the + this row shouldn't make the row non-blank. + + * tbl/table.c (table::make_columns_equal): Only set the width of + columns which are marked as equal. + + * tbl/main.c (process_data): Before issuing excess data error, + if last character was a newline unget it; then get it again after + the error. Also include the contents of the entry in the message. + + * groff.c: New file. + * Makefile: Build groff from groff.c. Make it possible to use + either groff.sh or groff.c as groff. + * Makefile.bd: Similarily. + +Mon Sep 3 09:39:49 1990 James Clark (jjc at jclark) + + * groff.sh: Don't delay expansion of $@ in assignment to files. + Remove occurrences of \". + +Sun Sep 2 09:56:59 1990 James Clark (jjc at jclark) + + * all Makefiles: Simplify and rearrange. + + * Makefile: Handle fmod like malloc. + * lib/Makefile: Similarily. + * lib/fmod.c: Remove #ifdef NEED_FMOD. + + * Makefile: Rename OPTIMISE to OPTIMIZE. + + * groff.sh: Remove assignment to PATH. + * Makefile: Remove SHPATH variable. + * Makefile.bd: Similarily. + + * groff.sh: Add -V option to print the pipeline instead of + executing it. + +Fri Aug 31 00:56:46 1990 James Clark (jjc at jclark) + + * lib/font.c: Split off file searching into ... + * lib/fontfile.c: New file. + + * lib/strerror.c (strerror): Use `Error %d' for unknown errors. + +Thu Aug 30 13:13:55 1990 James Clark (jjc at jclark) + + * tbl/table.c (table::do_hspan): Delete assertion that e != 0. + Also change misleading comment. + (table::do_vspan): Change similarily misleading comment. + * tbl/main.c (process_data): A format row with an explicit `s' + uses up a data line, even if all the other columns are `_' or `='. + + * troff/input.c (token::description): Fix description of + TOKEN_DUMMY and TOKEN_EMPTY. + +Wed Aug 29 04:12:08 1990 James Clark (jjc at jclark) + + * groff.sh: Fix description of -Z in help message. + +Tue Aug 28 07:28:33 1990 James Clark (jjc at jclark) + + * pic/object.c (object_spec::make_object): Allow negative and zero + line thicknesses. + * pic/pic.y: Give linethick default value of -1.0. + * pic/troff.c (troff_output::troff_output): Initialize + last_line_thickness to BAD_THICKNESS. + (troff_output::finish_picture): Set thickness to BAD_THICKNESS. + (troff_output::line_thickness): Canonicalize negative thicknesses + to RELATIVE_THICKNESS. + * pic/tex.c (tex_output::set_pen_size): Silently map negative line + thicknesses to DEFAULT_PEN_SIZE. Canonicalize negative pen sizes + to -1.0. + (tex_output::start_picture): Set pen_size to -2.0. + + * ps/ps.c (ps_printer::set_line_thickness): If line_thickness is + 0, then use 0 linewidth. + (ps_printer::ps_printer): Initialize line_thickness to -1. + + * pic/troff.c (troff_output::simple_ellipse): Divide by scale. + + * ps/devps/symbolchars: Remove `or'. + * ps/tmac.ps: Implement \(or with .char. + + * ps/devps/symbolchars: Move most characters into textmap. + * ps/devps/textmap: Add names for troff bracket characters. Remove + ul, ru, br, bv. + + * ps/devps/TSymbol.ps: Removed. + * ps/devps/FontMakefile: Make S from Symbol not TSymbol. + * ps/tmac.ps: Do with .char what TSymbol did. + * ps/devps/download: Remove TSymbol. + + * ps/devps/T: Removed. + * ps/devps/Troff.ps: Removed. + * ps/devps/Troff.afm: Removed. + * ps/tmac.ps: Implement \(ru, \(ul, and \(br with .char. + * ps/devps/download: Remove Troff. + * ps/devps/FontMakefile: Remove T target. + * ps/devps/DESC-A4: Remove T from font list. + * ps/devps/DESC-letter: Likewise. + + * troff/input.c (macro_to_node): Rename to ... + (charinfo_to_node): Don't pass mac argument. Temporarily remove the + character's definition while processing it. + * troff/node.c (node::add_char, make_node): Change calls to + macro_to_node accordingly. + + * troff/input.c (token::next): Translate \_ to \(ul. + + * tty/devascii/R.proto: Add `|'. + * tty/devlatin1/R.proto: Likewise. + +Mon Aug 27 11:25:41 1990 James Clark (jjc at jclark) + + * man: Put the version number in all the man pages. + +Sun Aug 26 11:40:05 1990 James Clark (jjc at jclark) + + * Makefile.bd: New file. + * README.bd: New file. + + * VERSION: New file. + * lib/version.c: Removed. + * lib/Makefile: Create version.c from ../VERSION. Remove version.c + in clean target. + + * troff/input.c (main): Get hyphen_file from GROFF_HYPHEN + environment variable. + + * all Makefiles: Split install target into install.bin for + binaries, and install.nobin for everything else. + * Makefile: Add bindist target. + + * man/afmtodit.man: New file. + * man/Makefile: Add afmtodit.n to MAN1PAGES. + * ps/devps/Makefile: Add textmap to DEVICEFILES. Install afmtodit + in BINDIR. + * ps/Makefile: Pass BINDIR to make install in devps. + + * ps/ps.c (ps_printer::set_char): Do nothing if the character is + the space character. + + * ps/devps/FontMakefile: Rename symbol.afm to tsymbol.afm. + +Sat Aug 25 15:39:03 1990 James Clark (jjc at jclark) + + * ps/ps.c: Redo font downloading. + * ps/devps/download: New file. + * ps/devps/Makefile: Add download to DEVICEFILES. + * ps/devps/afmtodit: Remove -d option. + * ps/devps/FontMakefile: Don't use -d option with afmtodit. + * ps/devps/symbosl.ps: Add %%DocumentFonts comment. + * ps/devps/zapfdr.ps: Likewise. + * ps/devps/TSymbol.ps: Likewise. + +Fri Aug 24 20:10:30 1990 James Clark (jjc at jclark) + + * groff.sh: Initialize dev to ${GROFF_TYPESETTER:-@DEVICE@}. + +Thu Aug 23 10:03:47 1990 James Clark (jjc at yquem) + + * ps/ps.c (ps_output::include_file): If BROKEN_SPOOLER is defined, + then strip the first line if it starts with %. + * Makefile: Add a comment about this. + + * man/tfmtodit.man: New file. + * man/Makefile: Add tfmtodit.n to MAN1PAGES. + * dvi/Makefile: Install tfmtodit in BINDIR. + + * dvi/tfmtodit.c (usage): Mention -v option. + +Wed Aug 22 09:56:36 1990 James Clark (jjc at yquem) + + * troff/node.c (troff_output_file::end_of_line): Call do_motion. + * troff/node.c (troff_output_file::transparent_char): Don't call + flush_tbuf. + + * eqn: Add check_tabs method to most box classes. + * eqn/box.c (box::top_level): Call check_tabs. + + * eqn/script.c (script_box::output): Use \Z. + * eqn/limit.c (limit_box::output): Use \Z. + + * eqn/box.c (box::top_level): Use itoa. + +Tue Aug 21 09:29:28 1990 James Clark (jjc at yquem) + + * dvi/tmac.dvi: Add font translations for CR, C, TT. + * dvi/devdvi/Makefile: Don't make links to CW. + + * ps/tmac.ps: Add font translations for C, CW, CO, CX, CD, H, HO, + HX, HD. + * xditview/tmac.X: Likewise. + + * troff/node.c: Add font translation feature. + (get_font_translation): New function. + (symbol_fontno): Translate the font name. + (mount_font_no_translate): Rename to mount_font to this. + (mount_font): New function. + (font_family::make_definite): Call mount_font_no_translate instead + of mount_font. + (mount_style): Translate the font name. + (font_translate): New function. + (init_font_requests): Bind "ftr" to font_translate. + + * ps/devps/prologue (SN): New procedure that rounds a position to + the nearest (pixel + (.25,.25)). + (DL): Use SN to round endpoints. + + * lib/version.c: Changed version to 0.5. + +Sat Aug 18 04:43:21 1990 James Clark (jjc at yquem) + + * Makefile: Move definition of PAGE to the very beginning, so that + people are less likely to miss it. + +Fri Aug 17 02:15:11 1990 James Clark (jjc at yquem) + + * man/Makefile: Don't need to sed out @UPCASE_PROG_PREFIX@. + + * troff/env.c (environment::choose_breakpoint): Make `can't find + breakpoint' error a warning of type WARN_BREAK. Change message to + `can't break line'. + * troff/groff.h: Declare WARN_BREAK with code 4; change WARN_INPUT to + code 040000. + * troff/input.c: Add WARN_BREAK to warning_table. Include + WARN_BREAK in DEFAULT_WARNING_MASK. + + * tty/tmac.tty: Add definition of \(+-. + + * groff.sh: Remove `--' option to set command. + + * dvi/devdvi/texsy.map: Remove duplicate md entry. + + * ps/devps/eqnchar: Better definition of cdot using md. + * dvi/devdvi/eqnchar: Likewise. + * xditview/devX100/eqnchar: Likewise. + * xditview/devX75/eqnchar: Likewise. + * eqn/lex.c: Add definition of cdot. + +Thu Aug 16 09:33:57 1990 James Clark (jjc at yquem) + + * troff/input.c (get_optional_char): New function. + * troff/input.c (set_page_character): Use get_optional_char(), + rather than has_arg() and tok.get_char(1). + * troff/env.c (tab_character, leader_character, hyphen_char, + field_characters): Likewise. + (margin_character): Likewise. Also always delete the + margin_character_node. + + * troff/input.c (token::get_char): Use token::description. + + * troff/input.c (has_arg): Don't skip over tab and \}. + * troff/number.c (start_number): Give a warning if the number + starts with \} (WARN_RIGHT_BRACE) or tab (WARN_TAB). + +Wed Aug 15 10:04:37 1990 James Clark (jjc at yquem) + + * troff/input.c (empty_name_warning, non_empty_name_warning): New + functions. + (get_name, get_long_name): Use these. Rename `warn' argument to + `required'. + + * troff/node.c (get_fontno): Test that the symbol is not null. + + * troff/input.c (token::description): New function. + * troff/number.c (parse_term): Use token::description in `numeric + expression expected' message. + * troff/groff.h: Add WARN_MISSING. + * troff/number.c (start_number): New function. + * troff/number.c (get_vunits, get_hunits, get_number, get_integer, + get_incr_number): Use start_number(). + * troff/input.c (DEFAULT_WARNING_MASK): Enable WARN_NUMBER by + default. + * troff/input.c (get_name, get_long_name): Use WARN_MISSING. + * troff/reg.c (alter_format): Use WARN_MISSING. Also use + token::descripion. + * troff/input.c (token::get_char): Use WARN_MISSING. + * troff/input.c (token::delimiter): Use token::description. + * troff/env.c (environment_switch): Back out Aug 3 change. + * troff/input.c (has_arg): Skip over \}s and tabs but give a + warning. + * troff/token.h (token::tab): New function. + * troff/node.c (get_fontno): Use tok.skip() rather than has_arg(). + * troff/reg.c (alter_format): Likewise. + * troff/node.c (bold_font): Use has_arg() rather than tok.skip(). + +Tue Aug 14 10:11:21 1990 James Clark (jjc at yquem) + + * troff (most files): Redo warnings. Divide warnings into various + categories; warning() has an additional first argument indicating + the category it falls into. + * troff/input.c (main): -w now takes an argument. New option -W. + (enable_warning, disable_warning): New functions. + + * ps/devps/afmtodit: Add -a option to lie about the italic angle. + * ps/devps/FontMakefile: Pretend TI has an angle of 7. + +Mon Aug 13 10:11:16 1990 James Clark (jjc at yquem) + + * ps/devps/eqnchar: Better definitions of dotdot, vec, dyad, inf. + * xditview/devX100/eqnchar: Likewise. Remove definition of dot. + * xditview/devX75/eqnchar: Likewise. + * dvi/devdvi/eqnchar: Better definitions of vec, dyad, dotdot. + + * eqn/other.c: When bar or over applies to a single character + don't produce an overline_box or an underline_box. Instead produce + an accent_box or an underaccent_box, with the accent a line + whose width is accent_width. New classes underaccent_box, + overline_char_box and underline_char_box. + * eqn/box.h: Move overline_box, underline_box, accent_box class + declarations into eqn/other.c. Add declarations of + make_underline_box, make_overline_box, make_accent_box. + * eqn/eqn.y: Call make_overline_box, make_underline_box + make_accent_box instead of constructors. + * eqn/pbox.h, eqn/box.c: Add accent_width parameter. + + * eqn/other.c: Add accent_box::~accent_box. + * eqn/box.h: Declare it. + + * groff.sh: With -Tps, use eqn -D. + + * eqn/other.c (overline_box::output): Use \Z. If draw_flag use \D + rather than \l. + (underline_box::output): Similarily. + (accent_box::output): Use \Z. + + * xditview/tmac.X: Add definitions of ~ and ^ (so that they are a + bit smaller.) + +Sun Aug 12 09:41:15 1990 James Clark (jjc at yquem) + + * troff/div.c (top_level_diversion::transparent_output(unsigned + char)): Use asciify. + * troff/input.c (asciify): Don't make it static. + * troff/token.h (asciify): Declare it. + + * troff/input.c (get_name, get_long_name, token::get_char, + token::delimiter): Add an extra default argument which says + whether a warning should be printed. + * troff: Pass a non-zero argument to one of these rather than + printing a warning directly. + +Sat Aug 11 09:02:21 1990 James Clark (jjc at yquem) + + * troff: Consistently use symbol::is_null. + + * troff/dictionary.h: Move some inline functions into + dictionary.c. + + * troff/request.h: Move inline functions into input.c. + (request_or_macro::invoke): Make it pure. + + * troff/input.c, troff/reg.h: New class `constant_int_reg'. + * troff/input.c (init_input_requests): Use class constant_int_reg. + (class compatible_reg): Deleted. + * troff/div.c (init_div_requests): Use class constant_int_reg. + (class last_post_line_extra_space_reg): Deleted. + + * troff/env.c (tab_character): Don't change the tab character if + we get an invalid argument. + (hyphen_char): Similarily. + + * troff/reg.c (alter_format): Check that nm is not null. + + * Makefile, groff.sh: Make it possible to customize the commands + used for printing PostScript and dvi files. Also make it possible + to customize the path used by groff.sh. + + * eqn/eqn.y: Make `left' right associative. + +Fri Aug 10 18:20:39 1990 James Clark (jjc at yquem) + + * pic/pic.h: Added definition of M_SQRT2 for those systems that + don't have it. + + * pic/pic.h: Removed definition of INT_MAX. + + * troff/node.c (italic_corrected_node::vertical_extent): Omit + `return'. + + * troff/input.c (token::next): Handle \R like \n. + +Tue Aug 7 09:46:33 1990 James Clark (jjc at yquem) + + * ps/tmac.pc (PSPIC): Simplify. + + * troff/env.c (tab_stops::to_string): + * pic/pic.y (object_type_name): + * pic/troff.c (simple_output::line): + * pic/tex.c (tex_output::spline): + * pic/object.c (object_spec::make_object): + * tbl/main.c (process_data): Add cases to switch statements to + avoid cfront warnings. (Some of these are spurious, since the + switch already has a default case.) + + * ps/tmac.ps (PSPIC): Reformatted. Prefix all local names with + `ps-'. Don't test systat; instead check number of arguments to + ps-bb. + +Mon Aug 6 00:13:07 1990 James Clark (jjc at yquem) + + * macros/tmac.e: Do not decrease the page offset by 0.5i. + + * ps/ps.c (ps_printer::ps_printer): Use mktemp instead of tempnam. + Unlink the file as soon as we have opened it, so that we don't + have to bother with signal handlers. + (handler): Deleted. + (fatal_error_exit): Deleted. + (main): Don't call signal. + + * dvi/tfmtodit.c: Add -k option so that kerns with the skewchar + can be ignored. + * dvi/devdvi/Makefile: Use the -k option with S and MI. + + * pic/pic.y: If there is a label, or an nth construction before + the first `.' in the argument to `with', ignore it and generate a + warning. + * pic/lex.c (lex_warning): New function. + + * tbl/table.c (table::init_output): In section keep and release + macro, use 0 indent when diverting and the correct indent when + rereading. + + * troff/input.c (interpolate_number_format): Do not interpolate + anything if the number register is not defined. + + * tbl/main.c (process_data): Don't add entry when col >= ncolumns. + +Sat Aug 4 08:12:05 1990 James Clark (jjc at yquem) + + * ps/devps/prologue (PICTURE): Set components of graphics state to + their default values. + + * ps/devps/text.enc: Add trademark + * ps/devps/textmap: Add names for club, spade, heart, diamond, + carriagereturn, suchthat. Use Upsilon1 rather than Upsilon. + * ps/devps/symbolchars: Add names for summation and product. + + * dvi/devdvi/texsy.map: Add names for club, spade, heart, diamond, + suchthat. Add pp. Add upper-case letters. + + * xditview/libXdvi/DviChar.c: Add names for club, spade, heart, + diamond, carriagereturn, suchthat. Use Upsilon1 rather than + Upsilon. + + * dvi/devdvi/texsy.map: Rename lA (left angle bracket) to la, and + rA (right angle bracket) to ra. Introduce names for double-headed + arrows and double-barred arrows: <>, va, lA, rA, hA, uA, dA, vA. + * ps/devps/textmap: Likewise for ps device. + * xditview/libXdvi/DviChar.c: Likewise for X100 and X75 devices. + * tty/devascii/R.proto: Rename lA to la and rA to ra. + * tty/devascii/R.proto: Likewise. + * tty/tmac.tty: Provide definitions for \(<>, \(lA, \(rA, \(hA, + \(uA, \(dA. + * eqn/delim.c: In delim_table, rename \(lA to \(la and \(rA to \(ra. + + * xditview/tmac.X: Add definitions for \(fi \(fl \(ff \(Fi \(Fl. + + * eqn/lex.c: Added definitions of `approx', `grad' and `del' to + def_table. + +Fri Aug 3 09:59:27 1990 James Clark (jjc at yquem) + + * troff/div.c (when_request): Use symbol::is_null rather than + has_arg to determine whether we have an argument. + (change_trap): Remove the trap if we get an invalid number. Give + an error if we don't get at least the macro name. + (diversion_trap): Remove trap if we get an invalid name or number. + + * troff/env.c (environment_switch): Pop if we get an invalid + symbol or numeric expression. + + * troff/input.c (do_define_macro): If EOF is encoutered while + defining the macro, do tok.next() before returning. + + * troff/token.h (has_arg): Move definition from here, to ... + * troff/input.c (has_arg): ... here + + * troff/env.c (space_size): Do nothing if we get an invalid argument. + * troff/input.c (shift): Likewise. + + * pic/lex.c (get_token_after_dot): Accept `.center' as a synonym + for `.c'. + + * pic/troff.c (troff_output::start_picture): Comment out calls to + `..'. + + * eqn/main.c (do_file): Subtract 1 from current_lineno if + interpret_lf_args succeeds. + + * eqn/main.c (do_file): Don't recognize delimiter if preceded by + \\. This avoids problems with \$N. + + * groff.sh: Pass -C to preprocessors. + + * lib/lf.c (interpret_lf_args): Be more flexible. + + * tbl/main.c (main): Add -C option. + (table_input::get): Do not recognize TE if followed by character + other than a space or newline unless -C option given. + (process_input_file): Likewise for lf, TS. + (process_data): Likewise for lf in text blocks. + + * eqn/main.c (main): Add -C option. + (do_file): Don't recognize EQ, EN or lf if followed by character + other than space or newline unless -C option given. + * eqn/lex.c (file_input::read_line): Similarily. + * eqn/eqn.h: Declare compatible_flag. + + * etc/soelim.c (main): Add -C option. + (interpret_lf_args): Use version in libgroff. + (do_file): + + * pic/main.c (main): Add -C option, which sets compatible_flag. + (top_input::get), (top_input::peek): If -C option not given, + do not recognize .PS/.PE/.PF/.lf if followed by a character + other than space or newline. + * pic/lex.c (file_input::read_line): Similarily. + * pic/pic.h: Add declaration of compatible_flag. + +Thu Aug 2 11:11:27 1990 James Clark (jjc at yquem) + + * ps/tmac.ps (PSPIC): Avoid use of `echo -n'. + + * troff/node.c, troff/node.h: Add `asciify' methods to classes + derived from node. New class space_char_hmotion_node. + * troff/input.c (asciify_macro): New function. + * troff/input.c (init_input_requests): New request `asciify' bound + to asciify_macro. + * macros/mm.diff: New file. + * Makefile: In install.mm target use `patch' to apply + macros/mm.diff. + + * troff/input.c (macro::print_size): Just print the size in bytes. + + * troff/div.c (return_request): Correct the argument + interpretation. + +Wed Aug 1 12:38:36 1990 James Clark (jjc at yquem) + + * troff/node.h (class composite_node): Add sz member. + * troff/node.c (composite_node::size): Return sz. + * troff/input.c (macro_to_node): Use the initial size in the + environment as the size of the composite_node. + + * troff/node.c (node::zero_width_tprint): Provide a reasonable + default. + +Tue Jul 31 10:07:10 1990 James Clark (jjc at yquem) + + * troff/div.c (change_trap): If we get a bad number expression, + do nothing. + +Mon Jul 30 10:30:49 1990 James Clark (jjc at yquem) + + * lib/matherr.c (matherr): Define this only if math.h defines + TLOSS. + +Sun Jul 29 10:34:27 1990 James Clark (jjc at yquem) + + * troff/div.c (macro_diversion::distance_to_next_trap): If there + no diversion trap return vunits(INT_MAX - vresolution). + +Sat Jul 28 14:28:14 1990 James Clark (jjc at yquem) + + * troff/input.c (do_zero_width): New implementation that doesn't + use a temporary environment. Use instead: + (token::add_to_node_list): New function. + * troff/env.c (environment::get_prev_char_height), + (environment::get_prev_char_height), + (environment::get_prev_char_skew): New functions. + (environment::get_prev_char): New function. + (environment::get_prev_char_width): Change to use get_prev_char. + (init_env_request): Implement new registers .cht, .cdp, .csk. + * eqn/sqrt.c (sqrt_box::output): Don't rely upon the argument to + \Z being processed in a separate environment. + +Fri Jul 27 10:21:25 1990 James Clark (jjc at yquem) + + * tbl/table.c: Removed TABLE_BOTTOM_REG. + + * tbl/table.c (table::init_output): In the section release macro, + give a warning message if the section won't fit on one page. + + * tbl/table.c (table::do_top): Emit table keep only if table is + boxed. + (table::do_bottom): Likewise for table release. + (table::table), (table::add_vertical_rule): Remove reference to + keep member. + * tbl/table.h: Remove keep member. + + * tbl/table.c: New register SUPPRESS_BOTTOM_REG. In + SECTION_RELEASE_MACRO, if there's not enough space before the next + trap to output the diversion, call T# ourselves, set + SUPPRESS_BOTTOM_REG to 1, spring the trap, then set + SUPPRESS_BOTTOM_REG back to 0. In T#, do nothing if + SUPPRESS_BOTTOM_REG is non-zero. In T#, always mark the current + vertical position and return to it before turning traps on again. + +Thu Jul 26 02:54:32 1990 James Clark (jjc at yquem) + + * troff/node.c, troff/node.h: In classes derived from node, + replace prev_char_width method by last_char_node method. + * troff/env.c (environment::get_prev_char_width): Use + node::last_char_node rather than node::get_prev_char_width. + + * Makefile: Added comment about -fno-inline on 68030-based + Apollos. + + * troff/reg.c (number_format_to_ascii), eqn/delim.c (DELIM_TABLE_SIZE), + tty/tty.c (tty_font::load_tty_font), dvi/tfmtodit.c (main): Cast + expressions using sizeof to int. + * dvi/dvi.c (dvi_font::handle_x_command): Avoid long->int warnings. + + * macros/tmac.e (TS): Don't move @f back past the current + position. + +Wed Jul 25 09:11:08 1990 James Clark (jjc at yquem) + + * ps/ps.c (main): Buffer stderr. + * dvi/dvi.c (main): Likewise. + * tty/tty.c (main): Likewise. + + * ps/ps.c (ps_printer::do_import): Improve error handling. + + * troff/input.c (abort_request): Use asciify. + + * driver/printer.h (printer::draw), driver/printer.c (printer::draw), + ps/ps.c (ps_printer::draw), dvi/dvi.c (dvi_printer::draw): Make + type of first argument int rather than char. This works around a + bug on the 68030 based Apollo using g++ 1.37.1. + + * tbl/table.h (class table): Add `keep' member. + * tbl/table.c (table::table): Initialize `keep'. + (table::add_vertical_rule): Set `keep' to 1. + (table::do_top): Only emit table keep macro is `keep' is non-zero. + (table::do_bottom): Likewise for table release macro. + (table::do_row): Emit section keep macro even if the row is 0. + +Tue Jul 24 08:35:07 1990 James Clark (jjc at yquem) + + * macros/tmac.e (@C): Preserve the font family across the change + in environments. + +Mon Jul 23 10:15:23 1990 James Clark (jjc at yquem) + + * lib/font.c: Initialize font::hor and font::vert to 1. + (font::load_desc): Check the values of font::hor and font::vert. + + * lib/lib.h: Added definition of INT_DIGITS. Fix it so that it can + be included in a C compilation. + (iftoa): Use INT_DIGITS. Include lib.h. + (itoa): Likewise. + (as_string): Likewise. + * tbl/table.c: Removed definition of INT_DIGITS. + * eqn/box.c (box::top_level): Use INT_DIGITS + 1 instead of 12. + * troff/input.c (input_input_requests): Likewise. + * ps/ps.c (make_encoding_name): Likewise. + (ps_printer::set_style): Likewise. + (ps_output::put_number): Use 1 + INT_DIGITS + 1 instead of 12. + + * tty/devascii/R.proto: Map fm onto '. + * tty/devlatin1/R.proto: Likewise. + +Sat Jul 21 12:45:07 1990 James Clark (jjc at yquem) + + * tbl/table.c: Use ' instead of DELIMITER_CHAR in places where the + argument to \w is at a different input level. + + * tbl/table.c (table::init_output): Define a new macro + REPEATED_VPT_MACRO, like vpt but if in a diversion also + transparently outputs itself. + (table::define_bottom_macro): Use REPEATED_VPT_MACRO instead of + vpt. + (table::do_row): Likewise. + + * tbl/table.c (vertical_rule::print): Prefix the .sp -1 line with + TRANSPARENT_STRING_NAME. + + * tbl/table.c (table::init_output): In the table release macro + print an error message and don't produce any output if after + issuing the need request the table still will not fit. Also + remove the diversion after bringing it back. + + * tbl/table.c (table::init_output): Define a new macro + REPEATED_MARK_MACRO, like mk but if in a diversion also + transparently outputs itself. + (table::do_row): Mark row_top_reg using REPEATED_MARK_MACRO. This + is necessary because .TH might not call .T#. + (table::do_top): Likewise TOP_REG. + (table::define_bottom_macro): If TOP_REG is no longer valid, use + #T - DOUBLE_LINE_SEP rather than #T. This is necessary because the + table header might contain just the two top rules. + +Fri Jul 20 10:51:42 1990 James Clark (jjc at yquem) + + * troff/div.c: Implement new request `ptr' to print all traps. + + * troff/env.c (init_env_requests): Implement `.tabs' reg with + init_string_env_reg. + * troff/env.c (class tab_reg): Deleted. + +Thu Jul 19 12:07:16 1990 James Clark (jjc at yquem) + + * troff/div.c: New number register .pn returns the number of the + next page as set by the pn request. + + * macros/tmac.an: Redid headers and footers. Number each manual + entry starting from 1 unless \nC is > 0, like Sun. Added an + optional 5th argument to .TH which specifies the manual name and + appears in the center of the header. Understand the X, P and D + registers like Sun. + +Wed Jul 18 10:23:31 1990 James Clark (jjc at yquem) + + * troff/env.c (init_env_requests): New number register `.lt' to + return the title length. + + * troff/node.h (class transparent_dummy_node): New class. + * troff/node.c (class transparent_dummy_node): Provide member + functions. + * troff/env.c (interrupt): Add a transparent_dummy_node, rather + than a dummy_node. + + * troff/input.c (token::next): New escape sequence \). + * troff/input.c (get_copy): Recognize \) in copy mode. + + * troff/input.c (input_stack::clear): New function. + * troff/input.c (exit_request): Use input_stack::clear. + + * troff/token.h: Removed TOKEN_NO_PRINT_CHAR. + * troff/input.c (token::process): Removed case TOKEN_NO_PRINT_CHAR. + + * troff/env.c: Move set_page_character to input.c. Move + page_character to input.c also. + * troff/env.c (title): Split off the reading of the parts of the + title into read_title_parts. + * troff/input.c (read_title_parts): New function. Check the + input_level when testing whether a token matches the delimiter. + + * troff/input.c (exit_request): New function. + * troff/input.c (init_input_requests): Bind ex request to + exit_request rather than exit_groff. + + * troff/input.c (exit_groff): Call tok.next() before + process_input_stack(). + +Mon Jul 16 09:47:23 1990 James Clark (jjc at yquem) + + * troff/env.c: ifdef widow control support on WIDOW_CONTROL. + * troff/env.h: ditto. + * troff/input.c: ditto. + + * troff/env.c (environment::is_empty): Test pending_lines. + + * troff/env.c (environment::have_pending_lines): Removed. + + * troff/input.c: Add request to flush pending lines from the + environment. + + * troff/env.c, troff/env.h: Add automatic widow control feature. + + * troff/input.c (exit_groff): Do process_input_stack() after + do_break() but before setting exit_flag to 2. + + * troff/input.c: Remove FLUSH_PENDING_LINES and + TOKEN_FLUSH_PENDING_LINES. Instead, flush pending lines from + environment after END_TRAP token seen, but only if there aren't + any more traps still unfinished. + * troff/token.h: Remove TOKEN_FLUSH_PENDING_LINES. + +Sun Jul 15 10:50:08 1990 James Clark (jjc at yquem) + + * troff/env.c: Rename the `retain_size' member of class + pending_output_line to `no_fill'. + + * troff/env.c (title): When the line is output, make the + retain_size argument !fill. + + * troff/node.h: Add `hyphenated' member to struct breakpoint. + * troff/node.c (space_node::get_breakpoints), + (dbreak_node::get_breakpoints): Fill this in. + * troff/env.c: Allow specification of maximum number of + consecutive hyphenated lines. + + * troff/env.c (environment::is_empty): Add test for !current_tab. + +Sat Jul 14 11:23:01 1990 James Clark (jjc at yquem) + + * troff/env.c (environment::hyphenate_line): Don't completely give + up if the word is not to be hyphenated; continue so that breaks + can be made at break_char_node's. + + * lib/lib.h: Only define INT_MAX if it's not already defined; + undef INT_MIN if it's already defined. + + * Makefile: Make it easy to define CFRONT_ANSI_BUG. + + * lib/lib.h: If CFRONT_ANSI_BUG is defined, cast INT_MIN to long. + This works around a bug in AT&T C++ 2.0 used with an ANSI C + compiler. + + * macros/tmac.an (an-header): Set no-space mode. + + * macros/tmac.an (TH): Start a new page if necessary. + + * Started using ChangeLog at version 0.4. + +Local Variables: +version-control: never +coding: latin-1 +End: diff -ruN groff-1.19.1/ChangeLog.116 groff-1.19.2/ChangeLog.116 --- groff-1.19.1/ChangeLog.116 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/ChangeLog.116 2005-06-28 18:10:40.000000000 +0200 @@ -0,0 +1,1388 @@ + +Version 1.16.1 released +======================= + +2000-07-31 Werner LEMBERG + + Preparing release 1.16.1. + + * REVISION: Revision number set to 1. + * MORE.STUFF: Added info about port to DOS. + * NEWS, win32-diffs: Updated. + + * src/include/nonposix.h: Remove first line -- this file is used + in C also. + + * Makefile.in (dist): Delete Imakefile earlier to avoid a soft + link to it. + +2000-07-30 Werner LEMBERG + + * doc/texinfo.tex: Update to latest version. + +2000-06-28 Paul Eggert + + * Makefile.in (ENVSETUP): Don't assume POSIX make semantics for + commands that fail. Don't assume that "export a=b" is valid shell + syntax. This is needed for Solaris 2.5.1. + + * src/libs/libgroff/tmpfile.cc, src/utils/indxbib/indxbib.cc: Fix + comment about missing Solaris headers. + + * PROBLEMS: Add section about problems with Sun Make and VPATH. + +2000-06-25 Werner LEMBERG + + * src/devics/grodvi/dvi.cc: Replace _setmode() (for MSC) with + SET_BINARY(). + + * src/include/posix.h: Use HAVE_UNISTD instead of _MSC_VER. + + * win32-diffs: Updated. + * README.WIN32: Added CRs to make all Windows editors happy. + + * src/roff/troff/node.cc: Added WIFSIGNALED() macro (copied from + src/roff/groff/pipeline.c). + +2000-06-23 Eli Zaretskii + + * src/roff/grog/Makefile.sub (grog): Prepend `-e' to + $(SH_SCRIPT_SED_CMD), for the case where its value is empty. + +2000-06-17 Eli Zaretskii + + * src/utils/tfmtodit/tfmtodit.cc: #include nonposix.h. + (tfm::load, gf::load): Open tfm and gf files in binary mode: these + are binary files. + (main): Support non-Posix systems with several different styles of + slash characters in file names. + + * src/utils/pfbtops/pfbtops.c: #include nonposix.h. + (main) [SET_BINARY]: Switch stdin into binary mode. + + * src/utils/indxbib/indxbib.cc: #include nonposix.h. + (main): Support file names with several possible slash-type + characters, as given by DIR_SEPS[] in nonposix.h. + (main) [__MSDOS__]: If renaming the temporary index file fails + because it has more than one dot in its trunk, replace the dot + with an underscore and try again. + (do_file): Use FOPEN_RB instead of "r". Skip every CR before a + Newline. + [__MSDOS__ || _MSC_VER]: Stop at the first ^Z character. + + * src/utils/hpftodit/hpftodit.cc: #include nonposix.h. + (File::File): Open the input file in binary mode. Strip CR + characters from each CR-LF pair. + (xbasename): Support file names with several possible slash-type + characters, as given by DIR_SEPS[] in nonposix.h. + + * src/include/Makefile.sub (HDRS): Add nonposix.h. + + * src/roff/troff/node.cc [HAVE_UNISTD_H]: Include . + (WIFEXITED, WEXITSTATUS, WTERMSIG, WIFSTOPPED, WSTOPSIG) + [!_POSIX_VERSION]: Define for traditional Unix systems. + (real_output_file::real_output_file): Remove the MSVC-specific + call to popen, use instead POPEN_WT, appropriately defined on + nonposix.h. #include nonposix.h. + (real_output_file::~real_output_file): Remove the MSVC-specific + call to pclose, a suitable macro is now defined on nonposix.h. + Use the portable macros WIFEXITED, WIFSIGNALED, WTERMSIG, WSTOPSIG + and WEXITSTATUS instead of assuming traditional Unix + interpretation of the status returned by pclose. + + * src/roff/troff/input.cc (pipe_source): Remove the MSVC-specific + call to popen, use POPEN_RT instead (appropriately defined on + nonposix.h). #include nonposix.h. + (ps_bbox_request): Open the PostScript file in binary mode. + Close the file after processing it. + (getpid) [_MSC_VER]: Remove; a suitable macro is now defined on + nonposix.h. + + * src/roff/groff/pipeline.c (run_pipeline) [__MSDOS__ || _WIN32]: + A version of run_pipeline that doesn't use `fork'. + (signal_catcher) [__MSDOS__ || _WIN32]: New function. + (system_shell_name, system_shell_dash_c) + (is_system_shell) [__MSDOS__ || _WIN32]: New functions, to hide + the ugliness of testing DOS/Windows file names for equality, and + support both stock shells and ports of Unix shells. + + * src/roff/groff/groff.cc: #include nonposix.h. + (BSHELL): Definition moved to nonposix.h. + (main): Use PATH_SEP[0] instead of literal ':'. Use BSHELL_DASH_C + instead of a literal "-c". + (xbasename): Support file names with several possible slash-type + characters, as given by DIR_SEPS[] in nonposix.h. + (possible_command::print): Use BSHELL_DASH_C and IS_BSHELL instead + of literal strings. + + * src/preproc/soelim/soelim.cc: #include nonposix.h. + (do_file): Use IS_ABSOLUTE instead of testing for a literal '/'. + + * src/preproc/pic/Makefile.sub (YTABH): Change pic.tab.h to + pic_tab.h. + + * src/preproc/pic/lex.cc: Change pic.tab.h to pic_tab.h. + + * src/preproc/eqn/Makefile.sub (YTABH): Rename eqn.tab.h to + eqn_tab.h. + + * src/preproc/eqn/lex.cc: #include eqn_tab.h, not eqn.tab.h. + + * src/libs/libgroff/tmpfile.cc (DEFAULT_TMPDIR) [P_tmpdir]: If + P_tmpdir is defined, use it instead of the literal "/tmp". + (remove_tmp_files, add_tmp_file): New functions. + (xtmpfile): Record temporary files and register an atexit function + to delete them explicitly, instead of relying on the OS to do + that, which doesn't work on non-Unix systems. + + * src/libs/libgroff/searchpath.cc: #include nonposix.h. + (search_path::search_path): Use PATH_SEP instead of a literal + colon. + (search_path::command_line_dir): Ditto. + (search_path::open_file): Use IS_ABSOLUTE, PATH_SEP and DIR_SEPS, + to support non-Posix systems. + + * src/libs/libbib/search.cc: #include nonposix.h. + (search_list::add_file): Open the file in binary mode. + + * src/libs/libbib/linear.cc: #include nonposix.h. + (file_buffer::load): Remove \r characters preceding \n from the + loaded buffer. + + * src/libs/libbib/index.cc: #include nonposix.h. + (make_index_search_item): Open index_filename in O_BINARY mode. + (index_search_item_iterator::get_tag): Ditto. Remove \r + characters before \n characters. + (index_search_item::check_files): Open files in binary mode. + (index_search_item::munge_filename): Support DOS-style file names + with backslashes and drive letters, use IS_ABSOLUTE. + + * src/devices/grops/ps.cc: #include nonposix.h. + (main) [SET_BINARY]: Switch stdout to binary mode. + + * src/devices/grolj4/lj4.cc: #include nonposix.h. + (main) [SET_BINARY]: Switch stdout to binary mode. + + * src/devices/grolbp/lbp.cc: #include nonposix.h + (fill_pattern) [SET_BINARY]: Switch stdout to binary mode. + + * src/devices/grodvi/dvi.cc: #include nonposix.h. + [_MSC_VER]: Remove inclusion of Windows-specific headers (done by + nonposix.h). + (main) [SET_BINARY]: Switch stdout to binary mode. + [_MSC_VER]: Remove an explicit call to _setmode. + + * src/include/nonposix.h: New file. + + * Makefile.in (ENVSETUP): New variable, to set up case-sensitive + operation when building with DJGPP. + ($(TARGETS), dot, $(LIBDIRS), $(CPROGDIRS), $(CCPROGDIRS)) + ($(DEVDIRS), $(TTYDEVDIRS), $(INCDIRS), $(OTHERDIRS)): Use + ENVSETUP. + + * Makefile.comm: mv y.tab.[ch] to y_tab.[ch], to make it work on + MS-DOS. + (.man.n): Replace `;' with `|', since FONTPATH, MACROPATH, + etc. can include a semi-colon on DOS/Windows. + (depend.temp): Use depend1.temp instead of depend.temp1, to + prevent files from overerwiting each other on 8+3 filesystems. + + * gendef.sh (t): Change definition to work with DOS/Windows. + + doc/groff.texinfo: Apart of some typo corrections, I also changed + some index entris, to make them more non-ambiguous, and also put + @ignore around some parts that are not yet written, to allow the + Info output be readable. + +2000-06-10 Gael Queri + + Replaced specific checks for function declarations with a generic + routine taken from GNU bfd. + + * aclocal.m4 (GROFF_NEED_DECLARATION): New function. + GROFF_PUTENV, GROFF_POPEN, GROFF_PCLOSE, GROFF_HYPOT: Removed. + * configure.in: Use it. + * src/devices/grolbp/lbp.cc, src/include/lib.h, + src/preproc/grn/hgraph.cc, src/preproc/pic/pic.h, + src/roff/groff/groff.cc: Use it. + * Makefile.in, configure: Updated. + +2000-06-07 Paco Andrés Verdú + + * src/devides/grolbp/lbp.h: Removed unused variables. + +2000-05-31 Keith Thompson + + * src/devices/grolbp/lbp.cc (set_papersizes): Add declaration of + strncasecmp(). + +2000-05-31 Werner LEMBERG + + * aclocal.m4 (GROFF_SRAND): New function to test the return value + of srand() -- at least SunOS 4.1.3 uses `int' instead of `void'. + * configure.in: Use it. + * src/preproc/pic/pic.y, src/preproc/pic/pic.cc: Use it. + * configure, Makefile.in: Updated. + + * configure.in: Add test for strncasecmp(). + * src/include/lib.h: Use it. + +2000-05-29 Andrej Borsenkow + + * src/preproc/grn/Makefile.sub: Add MLIB. + +2000-05-29 Nix + + * Makefile.in: Use @datadir@ and @mandir@ appropriately. + +2000-05-29 Werner LEMBERG + + * src/roff/grog/Makefile.sub, src/roff/grog/grog.sh: Add `@g@'. + + * PROBLEMS: Small update. + + * src/devices/grolbp/lbp.cc: Various small fixes. + +2000-05-28 Keith Thompson + + * src/roff/nroff/nroff.sh: Fix main loop syntax. + + * src/utils/indxbib/indxbib.cc: Add declaration of mkstemp(). + +2000-05-25 Werner LEMBERG + + * man/roff.man: Removed unused macro. + +2000-05-24 Werner LEMBERG + + * Makefile.in (dist): Remove src/xditview/Imakefile explicitly. + This is needed e.g. if you do + `make distclean; ./configure; make dist'. + +Version 1.16 released +===================== + +2000-05-23 Werner LEMBERG + + Adding font CWI (constant width italic) to devdvi. + + * font/devdvi/CWI: New file. + * font/devdvi/generate/Makefile: Add generating rule. + * font/devdvi/DESC.in, font/devdvi/Makefile.sub, win32-diffs, + tmac/tmac.dvi: Use it. + * NEWS: Announce it. + + * font/devlj4/*: Regenerated (only adding kernings for `cq' glyph). + * font/devlj4/generate/Makefile: Cosmetic changes only. + + * man/groff.man: Removed most of the redundant description of + special characters (which is in groff_char.man). Added font + translation CB->CR for devdvi. Other minor fixes. + + * tmac/tmac.dvi: Improved appearance of \(co (copyright) and \(rg + (registered) symbols. + +2000-05-22 Werner LEMBERG + + * doc/Makefile: Added rule for creating info files. + + * font/devdvi/*: Added kernings for `cq' glyph. Updated to latest + AMS font metrics. + * font/devdvi/generate/Makefile: Fixed dependencies. + + * font/devps/*: Regenerated. Heavy changes for Bookman and + NewCentury Schoolbook! + * font/devps/generate/afmname: Will now run with GNU awk. + * font/devps/generate/textmap: Added forgotten `cq' glyph name. + * font/devps/generate/Makefile: Cosmetic changes only. + +2000-05-21 Werner LEMBERG + + * tmac/tmac.an: Added a new command line option `-rSxx' (`xx' can be + 10, 11, or 12) to support output with 11pt and 12pt base font sizes. + `.SS' now produces a heading with a smaller size than `.SH'. + Completely formatted. + * doc/groff.texinfo, tmac/groff_man.man, NEWS: Document it. + + * man/groff.man: Improved table appearance. Use of `eo' request + to reduce number of doubled backslashes in macro definitions. + Replacing `\e' with `\(rs'. Other minor fixes. + + * src/preproc/tbl/main.cc: Insert HTML table end tag before `lf' + to have correct line number. + + * INSTALL: Small improvement. + +2000-05-20 Bernd Warken + + * man/roff.man, tmac/groff_tmac.man: Updates (with corrections by + WL). + +2000-05-19 Bernd Warken + + * man/groff.man: Complete update (with a lot of corrections by WL). + +2000-05-18 Werner LEMBERG + + Adding `cq' (PS name `quoteright') glyph name as an alias for "'". + + * font/*/*: Implement it. + * man/groff_char.man, NEWS: Document it. + + * src/include/unix.h: Removed. It isn't used. + + * doc/groff.texinfo: Slight improvements. + +2000-05-17 Werner LEMBERG + + * README, win32-diffs: Small fixes and improvements. + +2000-05-16 Werner LEMBERG + + * FDL: New file (the Free Documentation License version 1.1). + + * doc/groff.texinfo: Added many start-up values for gtroff. + Some structural improvements of the source code. + +2000-05-15 Werner LEMBERG + + * src/roff/troff/input.cc: Added small comment about troffrc-end. + * src/roff/troff/troff.man: Added info about troffrc-end. + +2000-05-14 Werner LEMBERG + + * Makefile.in (EXTRADIRS): Fix typos. + (dist): Handle deletion of old .tar.gz file correctly. + (DISTDIRS): Include all tty output devices. + + * doc/groff.texinfo: Adding more cross references; countless other + fixes. + +2000-05-13 Werner LEMBERG + + * MORE.STUFF: Added Robert Marks's utilities. + +2000-05-12 Werner LEMBERG + + Added win32 port contributed by Blake McBride + . + + * README.WIN32, win32-diffs: New files. + * NEWS: Updated. + + * src/preproc/grn/hgraph.cc (HGSetBrush): Replace `%lf' with `%f'. + (tmove, tmove2): Added parentheses to avoid compiler warnings. + (change): Removed unused variables. + + * src/preproc/grn/main.cc (main, conv): Removed unused variables. + (savebounds): Changed return value from `int' to `void'. + * src/preproc/grn/hdb.cc: Ditto. + + * src/devices/grolbp/lbp.cc (lbp_printer::draw): Removed superfluous + final backslash in comment to avoid compiler warning. + + * src/utils/pfbtops/pfbtops.c: Added `getopt.h'. + + * doc/groff.texinfo: More fixes. + +2000-05-11 OKAZAKI Tetsurou + + * tmac/tmac.doc: Documentation fix. + +2000-05-11 Werner LEMBERG + + * doc/groff.texinfo: Reading the source code shows up a lot of + omissions and incorrect data... More conversion to @Deffn macros. + +2000-05-10 Werner LEMBERG + + * src/roff/troff/reg.cc (number_value_to_ascii): Remove ASCII + dependency. + + * src/roff/troff/request.h: Removing unused `no_break_flag'. + +2000-05-09 Werner LEMBERG + + * man/groff.man, man/roff.man, tmac/groff_tmac.man: Minor + improvements. + + * doc/groff.texinfo: Extended history section. More conversion to + @Deffn macros. More .tr documentation. + +2000-05-07 Werner LEMBERG + + * doc/groff.texinfo: Completed tab section. Added info about + fields. + +2000-05-06 Mike MacIsaac + + * PROBLEMS: Describe configure script fix for OS/390 Unix. + +2000-05-05 Werner LEMBERG + + * font/devdvi/DESC.in: Change size 11pt to 10.95pt (as used in + LaTeX 2e). + * NEWS: Document it. + + * man/troff.man: Minor optical improvements. + +2000-05-03 Werner LEMBERG + + Adding `dq' (PS name `quotedbl') glyph name as an alias for `"'. + + * font/*/*: Implement it. + * man/groff_char.man, NEWS: Document it. + +2000-05-02 Werner LEMBERG + + * tmac/groff_tmac.man, man/groff.man, man/roff.man: Fixing @MANxEXT@ + expansion. + * NEWS: Document the three new man pages. + + * aclocal.m4 (GROFF_CXX_CHECK): Removing obsolete AC_C_CROSS call. + * configure: Updated. + + * font/devcp1047/R.proto: Fixing fatal bug (a missing `"' character). + +2000-05-01 Werner LEMBERG + + Added grap support to grog. + + * src/roff/grog/grog.sh, src/roff/grog/grog.pl: Implement it. + * src/roff/grog/grog.man: Document it. + + * doc/groff.texinfo, NEWS: Add info about grap support. + + Add new man pages comptributed by Bernd Warken + (with slight fixes by me). + + * tmac/groff_tmac.man: New file documenting tmac mechanism. + * tmac/Makefile.sub: Add groff_tmac.man. + * man/roff.man: New file giving overview of roff system. + * man/troff.man: A short reference of troff. + * man/Makefile.sub: Add roff.man and troff.man. + +2000-04-30 Werner LEMBERG + + Added grap support to groff. + + * src/roff/groff/groff.cc: Implement it. + * src/roff/groff/groff.man: Document it. + + * src/devices/grotty/grotty.man: Add cp1047 device. + * src/preproc/eqn/eqn.man, src/preproc/eqn/neqn.sh, tmac/eqnrc: + Ditto. + * src/roff/groff/groff.man: Ditto. + * src/roff/nroff/nroff.sh, src/roff/nroff/nroff.man: Ditto. + * doc/groff.texinfo: Ditto. + + * tmac/troffrc: Fix mapping of latin-1 char 160 (non-breakable space) + for cp1047. + +2000-04-29 Werner LEMBERG + + * man/groff_char.man: Add `pc' glyph. + * tmac/tmac.latin1: Replacing `md' glyph with `pc'. + * tmac/tmac.tty: Add `pc' glyph. + * tmac/tmac.tty-char: Use/add `pc' glyph. Don't call tmac.latin1 if + we use cp1047 output device. + + * Makefile.in, aclocal.m4: Don't build utf8 on EBCDIC hosts since + there are still hardcoded latin1->unicode values in utf8's font + definition files. + * configure: Updated. + * NEWS: Minor clarification. Updated. + + * PROBLEMS: Formatted. Added info about C++ fix pack for OS/390 + Unix. + +2000-04-28 Werner LEMBERG + + Adding EBCDIC code page 1047. + + * font/devcp1047/R.proto, font/devcp1047/Makefile.sub, + font/devcp1047/DESC.proto: New files. + + * aclocal.m4 (GROFF_EBCDIC): Introduce TTYDEVDIRS which can be + either ascii/latin1 or cp1047. + * Makefile.in: Use it. + * configure: Updated. + + Replacing and/or adding `md' (mathdot) glyph with `pc' + (periodcentered) in all text fonts. + + * font/*/*: Change it. + +2000-04-27 Werner LEMBERG + + * aclocal.m4 (GROFF_OS390): Fixing compiler flags. + + * configure.in: Add check for strings.h. + * src/include/driver.h: Use HAVE_STRINGS_H. + * src/devices/grolbp/lpb.cc: Remove string.h. + + * src/include/groff-getopt.h: New file. It will be used instead of + getopt.h (to be included in lib.h) to avoid endless problems with + picky C++ compilers. + * src/include/lib.h: Use groff-getopt.h. + * src/include/Makefile.sub: Updated. + + * configure: Updated. + * Makefile.in: Updated. + + * NEWS: Mention EBCDIC support. + +2000-04-26 Werner LEMBERG + + * TODO: Some additions. + +2000-04-25 Werner LEMBERG + + * src/roff/troff/troff.man, doc/groff.texinfo: Fixing documentation + of mso request. + +2000-04-23 Werner LEMBERG + + * src/roff/troff/troff.man: Minor fixes. + +2000-04-22 Werner LEMBERG + + * src/roff/troff/troff.man, doc/groff.texinfo, NEWS: Document the + `.T' string register and the incompatible definition of the `.T' + number register (compared to Unix troff). + + * man/groff_char.man: Add some missing characters. + * font/devutf8/NOTES: Update. + +2000-04-21 Werner LEMBERG + + * src/include/htmlindicate.h, src/include/lib.h, + src/include/posix.h: Fix copyright. + + * src/include/Makefile.sub: Update. + +2000-04-20 Werner LEMBERG + + * src/roff/troff/input.cc (input_char_description): Removing + superfluous space char. + + * tmac/tmac.X: Fix typo \(bq -> \(Bq. + + * doc/groff.texinfo: Document EBCDIC. + +2000-04-19 Werner LEMBERG + + Introducing `shc' as the glyph name for the soft hyphen character. + + * tmac/tmac.tty, tmac/tmac.latin1, tmac/tmac.html, + font/devlatin1/R.proto: Use it. + + * NEWS: Updated. + +2000-04-18 Werner LEMBERG + + * src/devices/grops/ps.cc (ps_printer::flush_sbuf): Removing + dependency on ASCII order. + +2000-04-16 Sandor BARANY + + * src/libs/libgroff/illegal.c: Added EBCDIC table. + * src/roff/troff/input.cc: Added adaptation to EBCDIC. + + * src/preproc/refer/refer.cc, src/roff/troff/env.cc: Minor changes + to increase portability. + +2000-04-15 Werner LEMBERG + + * aclocal.m4: Added GROFF_EBCDIC and GROFF_OS390 tests. + Redefined AC_OUTPUT_MAKE_DEFS to replace ASCII character `012' with + the generic `\n' if under OS/390 Unix. + + * configure.in: Call GROFF_EBCDIC and GROFF_OS390. + + * configure: Regenerated. + +2000-04-14 Werner LEMBERG + + * doc/groff.texinfo: More conversions to @Deffn. + +2000-04-12 Werner LEMBERG + + * tmac/tmac.psfig: Fix incorrect use of `&' operator by replacing it + with `:'. + + * src/roff/nroff/nroff.man: Add note about tmac.tty-char. + +2000-04-10 Werner LEMBERG + + * doc/groff.texinfo: More conversions to @Deffn. + +2000-04-08 Werner LEMBERG + + * src/libs/libgroff/{getopt.c,getopt1.c}, src/include/getopt.h: + Updated to latest version (glibc 2.1.3). + +2000-04-07 Werner LEMBERG + + * doc/Makefile (clean): Include more index files. + Add rule texinfo->dvi. + +2000-04-05 Werner LEMBERG + + * doc/groff.texinfo: Added new index `op' for operators. More + info on end of sentence characters. More use of @Deffn. + +2000-03-30 Werner LEMBERG + + * */*.man: Adding a note that a whitespace can be inserted between + a command line option and its parameter -- we are using GNU getopt. + + * src/roff/groff/groff.man: Add example of `-m mandoc'. + +2000-03-28 Werner LEMBERG + + Correct anachronism of calling the man macro file with `-man' + instead of `-m man' etc. + + * tmac/tmac.man, tmac/tmac.mandoc, tmac/tmac.markup, tmac/tmac.mdoc, + tmac/tmac.me, tmac/tmac.ms: New files tmac.m which simply + load tmac.. + + * tmac/Makefile.sub: Updated. Take care of $(tmac_an_prefix) etc. + + * NEWS: Updated. + + * doc/groff.texinfo: Updated. + + * tmac/groff_man.man: Copyright added. + +2000-03-27 Werner LEMBERG + + * doc/groff.texinfo: Introducing macros `Deffn' and `Defmac' to + typeset the request resp. escape name with a tt font -- due to a + bug in texinfo.tex it is necessary to use the `-e' switch with + texi2dvi. + + Improving info about usage of groff units. + + Other minor fixes. + +2000-03-20 Werner LEMBERG + + * doc/groff.texinfo: Added section about man macro package + (I've basically taken groff_man.man). Introducing new indices `ma' + for macros/strings and `gl' for glyph names. Other minor fixes. + + * tmac/groff_man.man: Fixed some typos. + +2000-03-19 Werner LEMBERG + + * doc/groff.texinfo: Removed all occurrences of `you', `we', etc. + Other minor fixes. + + * doc/texinfo.tex: New file. + +2000-03-18 Werner LEMBERG + + * doc/groff.texinfo: Improved section on number registers. Other + minor updates. + +2000-03-16 Werner LEMBERG + + * src/roff/groff/groff.man: Added info about grolbp. Make nicer + synopsis. + + * src/devices/grolbp/grolbp.man, src/roff/nroff/nroff.man, + src/devices/grolj4/grlj4.man, src/devices/grops/grops.man, + src/preproc/eqn/eqn.man, src/utils/afmtodit/afmtodit.man, + src/utils/tfmtodit/tfmtodit.man: Make nicer synopsis. + + * src/preproc/grn/grn.man: Better synopsis; added copyright. + + * src/roff/grog/grog.man: Updated copyright date. + +2000-03-14 Francisco Andrés Verdú + + * configure.in: Added test for strdup. + + * src/devices/grolbp/lbp.cc: Added a strdup() version in case none + is available. + + Replaced dynamic allocation of arrays `[...]' with `new' operator. + + Other minor fixes. + +2000-03-12 OKAZAKI Tetsurou + + * Makefile.comm: Add $(INCLUDES) to $(ALL_CFLAGS). + +2000-03-11 Werner LEMBERG + + * src/preproc/grn/hdb.cc (DBGetType): Added return value to make + compilers silent. + * src/preproc/grn/hgraph.cc: Add #ifdef for hypot(). + * src/include/lib.h: Remove some spaces. + +2000-03-10 Werner LEMBERG + + * src/libs/libgroff/tmpfile.cc (xtmptemplate, xtmpfile): Removing + initializers from arguments (some compilers don't like this). + +2000-03-09 Gaius Mulley + + * src/libs/libgroff/htmlindicate.cc: Added library file which is now + used by pic and eqn to tell grohtml where the graphic regions start + and end. + * src/libs/libgroff/Makefile.sub: Use it. + * src/preproc/eqn/main.cc, src/preproc/pic/troff.cc: Altered to use + graphic_start() and graphic_end() from htmlindicate.cc. + +2000-03-09 Werner LEMBERG + + * tmac/tmac.safer: Will now work correctly in compatibility mode. + * tmac/groff_man.man: More fixes. + +2000-03-08 Werner LEMBERG + + * doc/Makefile: Added texput.log to the `clean' target. + * doc/groff.texinfo: Added info about delimiters for escapes. + +2000-03-08 Bernd Warken + + * src/preproc/pic/pic.man: Add info on conversion of pic images to + other graphic formats. + +2000-03-07 OKAZAKI Tetsurou + + * Makefile.in, Makefile.sub, src/preproc/eqn/Makefile.sub, + src/roff/groff/Makefile.sub, src/roff/nroff/Makefile.sub, + src/utils/afmtodit/Makefile.sub: Use $(INSTALL_SCRIPT) for script + files. + +2000-03-07 Werner LEMBERG + + * doc/groff.texinfo: Spelling fixes. + +2000-03-06 Werner LEMBERG + + * tmac/groff_man.man: Completely revised to cover everything in + tmac.an. + + * doc/groff.texinfo, src/roff/troff/troff.man: Document evc request. + Other minor fixings. + * src/roff/troff/env.cc (environment_copy): Improve error message and + fix itoa->i_to_a. + * src/roff/troff/TODO: Updated. + + * doc/Makefile: Bug fixes -- this is still provisional, though... + + * tmac/eqnrc: Small fixes. + +2000-03-05 Abramo Bagnara + + Adding a request `evc' to copy environments. + + * src/roff/troff/env.cc (environment::copy, environment_copy): + Implement it. + * src/roff/troff/env.h: Add prototype. + +2000-03-05 Francisco Andrés Verdú + + Adding strsep() -- Solaris 8 doesn't have it. + + * configure.in: Test it. + * src/devices/grolbp/lbp.cc: Add code. + +2000-03-05 Werner LEMBERG + + * src/roff/troff/div.cc (macro_diversion::output, + top_level_diversion::output): Fixing an incompatibility with + original troff: \x'0' updates the .a register also. Thanks to + for pointing this out. + * doc/groff.texinfo: Document it. + + * Makefile.in: Create Makefile.dep if necessary before calling the + submake process to avoid warning about nonexistent file. + + * NEWS, PROJECTS: Updated. + +2000-03-04 Werner LEMBERG + + * tmac/troffrc: Add tmac.lbp. + +2000-03-03 Francisco Andrés Verdú + + * tmac/tmac.lbp: New file. + * src/devices/grolbp/grolbp.man: Add documentation of `lbpname' + command. + +2000-03-03 Werner LEMBERG + + * Makefile.in: Fixing $(subdir). + + * README, NEWS: Small fixes. + + * test-groff: Adding path to grolbp. + + * configure.in: The (new) file src/xditview/Imakefile.in will be + also configured -- it is now possible to build gxditview in a + directory different from $srcdir. + +2000-03-02 Blake McBride + + * src/libs/libgroff/searchpath.cc (open_file): Adapting to WinNT. + + * MORE.STUFF: Added website of bell labs and info about plot2dev. + +2000-03-01 Colin Phipps + + * src/utils/indxbib/indxbib.cc (main): Use mkstemp() for temporary + files. + +2000-02-29 Werner LEMBERG + + Adding GNU getopt to the groff distribution. + + * src/include/getopt.h, src/libs/libgroff/{getopt.c,getopt1.c}: + New files. + * src/include/Makefile.sub, src/libs/libgroff/Makefile.sub: Update. + * aclocal.a4: Remove GROFF_GETOPT function. + * configure.in, Makefile.in, PROBLEMS: Update. + * src/include/lib.h: Replace getopt tests with getopt.h. + * src/devices/grolbp/lpb.cc: Remove inclusion of getopt.h. + + * doc/groff.texinfo: Further checking/updating. Adding more index + entries. + + * man/groff_out.man: Fix nroff mode activation (for emacs). + * man/groff_font.man: Add missing ligature. + +2000-02-28 Werner LEMBERG + + * doc/groff.texinfo: Further checking/updating. Adding more index + entries. + + * src/devices/grolbp/grolbp.man: Added a comment line at the + beginning of the file (similar to shell scripts) which indicates + that `tbl' should be used as a preprocessor. + +2000-02-27 Blake McBride + + Adapting groff to MS Visual C++ 6.0 compiler (tested with + Windows NT 4.0). Uses _MSC_VER define where necessary. + + * src/devices/grodvi/dvi.cc: Making stdout a binary stream. + * src/devices/grolj4/lj4.cc: Making getopt variables `extern "C"'. + * src/devices/grohtml/html.cc, src/devices/grops/ps.cc, + src/include/lib.h, src/libs/libgroff/errarg.cc, + src/libs/libgroff/itoa.c, src/libs/libgroff/nametoindex.cc, + src/preproc/refer/label.y, src/preproc/refer/label.cc, + src/roff/groff/pipeline.c, src/roff/troff/column.cc, + src/roff/troff/div.cc, src/roff/troff/env.cc, + src/roff/troff/input.cc, src/roff/troff/node.cc, + src/roff/troff/reg.cc: Renaming itoa() to i_to_a() and iftoa() to + if_to_a() to avoid name clashes. + * src/include/posix.h: Don't use unistd.h. + * src/libs/libgroff/tmpfile.cc: Use `#ifndef...#else...#endif' + clause for integrating non-Unix xtmpfile() code. + * src/roff/troff/input.cc: Adding `public' keyword to macro_header + structure; use "rt" for popen() in pipe_source(); add getpid() + dummy function. + * src/roff/troff/node.cc: Use special versions of popen() in + real_output_file() and pclose() in ~real_output_file(). + +2000-02-27 Werner LEMBERG + + Adding a new driver, grolbp, for Canon CAPSL printers (LBP-4 and + LBP-8 series laser printers). This code has been contributed by + Francisco Andrés Verdú . + + * src/devices/grolbp/*: The grolbp output device. + * font/devlpb/*: The font description files. + * Makefile.in: Add grolpb and devlbp subdirectories. + + * src/devices/grodvi/grodvi.man, src/devices/grolj4/grolj4.man, + src/devices/grotty/grotty.man,src/roff/troff/troff.man: Minor + typographic fixes. + + * doc/groff.texinfo: Further checking/updating. Adding more index + entries. + + * NEWS: Updated. + + * src/devices/grolbp/Makefile.sub: Adding $(srcdir). + + * man/groff_font.man: Adding info about obsolete DESC keywords. + * src/devices/grolj4/grolj4.man: Documenting additional DESC + keywords. + +2000-02-26 Werner LEMBERG + + * src/preproc/grn/grn.man: Added info about the gremlin file format + (contributed by Daniel Senderowicz ). + +2000-02-25 Werner LEMBERG + + * src/preproc/grn/main.cc: Allow values of `narrow' parameter and + friends to be non-integer. + + * src/preproc/grn/grn.man: Document it. + + * doc/groff.texinfo: Further checking/updating. Adding more index + entries. + +2000-02-24 Werner LEMBERG + + * src/preproc/grn/main.cc: Introduce BASE_THICKNESS, defining + line thicknesses to be integer multiples of this value. + + * src/preproc/grn/grn.man: Commenting out the -s option -- the + corresponding code doesn't work (yet). + + * doc/groff.texinfo: Further checking/updating. Adding more index + entries. + +2000-02-23 Werner LEMBERG + + * src/preproc/grn/{main.cc, hgraph.cc}: Using point units to + specify line thickness instead of base units. The new default + values are now 0.15,pt 0.45pt, and 0.75pt for thin, middle, and + thick lines respectively. + + Removed unused variable `prevval'. + + * src/preproc/grn/grn.man: Updated. + +2000-02-22 Werner LEMBERG + + * src/preproc/grn/main.cc: Slight formatting. + + * src/roff/groff/groff.man: Formatting fix. + * src/preproc/grn/grn.man: Ditto. + + * src/roff/grog/grog.pl: Fixing two embarassing bugs. + + * doc/groff.texinfo: Further checking/updating. + +2000-02-21 Werner LEMBERG + + * README, INSTALL, PROJECT, PROBLEMS, BUGREPORT: Updated. + + * test-groff: Added grn subdir to path. + + * doc/groff.texinfo: Some restructing and other small improvements. + + * src/roff/groff/groff.cc (help): Fixed info string. + +2000-02-20 Werner LEMBERG + + * doc/meref.me: Fix description of .GS request. + + * src/roff/troff/troff.man: Fixing typo. + + Adding the `grn' preprocessor for gremlin graphic files. + + * src/preproc/grn/*: This is the Berkeley distribution written by + David Slattengren and Barry Roitblat, adapted to groff by Daniel + Senderowicz and Werner Lemberg. + + * doc/grnexampl.{me,g}: A sample for grn. + + * Makefile.in: Added subdirectory entry for grn. + + * src/roff/groff/groff.cc: Added support for grn. It can be now + called with the switch `-g'. + + * src/roff/groff/groff.man: Updated. + + * src/roff/grog/grog.{man,pl,sh}: Updated. + + * NEWS: Updated. + +2000-02-11 Gaius Mulley + + * src/include/lib.h: Added xtmptemplate and made xtmpfile + parametrically polymorphic. + + * src/libs/libgroff/tmpfile.cc: Implemented xtmptemplate + and the alterations to xtmpfile. + xtmpfile can be requested to return the filename created + and asked not to unlink the temp file. The default behaviour + if parameters are absent is exactly the same as before. + +2000-02-11 Abramo Bagnara + + A new request `length' is available which returns the length of a + string in a number register: + + * src/roff/troff/input.cc (length_macro): Implement it. + * src/roff/troff/input.cc (init_input_requests): Register it. + +2000-02-11 Werner LEMBERG + + * doc/groff.texinfo, src/roff/troff/troff.man: Add documentation + of the `substring' request. + + * src/roff/troff/troff.man, doc/groff.texinfo: Document `length' + request. + + * src/roff/troff/TODO, NEWS: Updated. + +2000-02-09 Werner LEMBERG + + * src/roff/groff/groff.man: Added an example. + +2000-02-06 Werner LEMBERG + + I've considerably modified the directory structure of the + distribution to get a more vertical layout. For example, the number + of top level directories has been reduced from 42 to 6. + + As a consequence, many changes, especially to the makefiles, were + necessary: + + * The makefile variables `top_builddir' and `top_srcdir' have been + introduced. Virtually all relative paths have been replaced with + absolute ones using these two variables. + + * Dependencies (in the files `Makefile.dep') are no longer part of + the distribution. Instead, they are created during a `make install' + in the build directory. + + * aclocal.m4 (GROFF_SRCDIR, GROFF_BUILDDIR): Two new functions to + make `top_srcdir' and `top_builddir' absolute. + + Some other changes: + + * Man pages now depend on the files `VERSION' and `REVISION'. + + * The added shell script `mkinstalldirs' will replace `mkdir' in + almost all cases. + + * VERSION: Version number increased to 1.16. + +2000-02-04 Werner LEMBERG + + * grops/psrm.cc (read_one_of): Fixed pointer incrementation. + + * Makefile.in: Removed $(tmac_m) since it is no longer needed + (after an update of the mm stuff). + + * troff/Makefile.sub (majorminor.cc): Fix dependencies. + +2000-02-03 Werner LEMBERG + + The .psbb request will now also accept Mac PS images (i.e. using LF + as the EOL character). + + * troff/input.cc (ps_get_line): New function, taken from psrm.cc + (with slight modifications). + * troff/input.cc (do_ps_file): Use it. + + * test-groff: Add grohtml and grolj4 output devices to PATH. + +2000-01-30 Werner LEMBERG + + * NEWS, MORE.STUFF: Updated. + +2000-01-30 Cary D. Renzema + + Add the `srand' command to pic. + + * pic/lex.cc, pic/pic.y: Implement it. + * pic/pic.man: Document it. + * pic/pic.cc, pic/pic.tab.h: Regenerated (with yacc). + +2000-01-30 Werner LEMBERG + + Add a new request `.psbb'. This does exactly what the external + program psbb did. It scans a PostScript image file for a + %%BoundingBox comment and extracts the bounding box values (in + PostScript units) which are then stored in the four new (read-only) + number registers `llx', `lly', `urx', and `ury'. + + This will allow the usage of the .PSPIC macro without worrying + about unsafe behaviour of groff, i.e., it will work without the + `-U' switch of groff. + + * troff/input.cc: Implement it. + * tmac/tmac.pspic: Use it. + * troff/troff.man, grops/grops.man, NEWS: Document it. + * psbb/*, Makefile.in: Remove it since it is no longer needed. + + This is bloody C code simply adapted from psbb.c! Any improvements + welcome. + +2000-01-29 Werner LEMBERG + + * man/groff_font.man: Minor clarifications. + + * NEWS: Updated. + +2000-01-28 Werner LEMBERG + + * afmtodit/afmtodit.pl: Use new `--' comment delimiter. + +2000-01-28 Gaius Mulley + + * man/groff_font.man: Brought up to date regarding tcommand + extensions. + * libgroff/font.cc: Handle everything after `--' as a comment + in the font files. + * devps/*: Added comment delimiter inside devps font files. + +2000-01-28 Werner LEMBERG + + * tmac/tmac.arkup, tmac/groff_markup.man: Replace \fC...\fR with + \fC...\fP (which now works as expected). + + * troff/troff.man: Fix typo. + +2000-01-27 Gaius Mulley + + Completed the pass_filenames implementation in troff. + + * libdriver/input.cc: Will read the new `F' tcommand. + * troff/node.cc, troff/node.h: Will issue the new `F' tcommand. + * troff/input.cc: Use it. + +2000-01-26 Werner LEMBERG + + * troff/env.cc (set_font): Fix the behaviour of \fP. The previous + font will now be updated even if an invalid font is selected. + +2000-01-24 Werner LEMBERG + + * doc/homepage.ms: Updated for new tmac.arkup. + + * tmac/tmac.html: Disable line breaks after hyphen-like characters. + + * tmac/tmac.arkup: Cleanup. + + Added `\&' to .HTML macro to `leave vertical mode', so to say. + + Removed obsolete .LINK macro completely. + + The macros .URL, .FTP, and .MAILTO now accept a third argument which + will be immediately appended to the second argument (to be used with + punctuation, for example). + + Disabled .CDFTP macro temporarily for security reasons. + + * tmac/groff_markup.man: Complete revision for latest changes in + tmac.arkup -- note that it does not yet format correctly with + grohtml :-( + +2000-01-23 Bruno Haible + + * nroff/nroff.sh: Accept -Tutf8 option and pass it through. + * devutf8/R.proto: Add mappings for wp, lh, rh. + * devutf8/NOTES: Updated. + +2000-01-23 Werner LEMBERG + + * doc/groff.texinfo: Updated version/copyright info. + +2000-01-21 Gaius Mulley + + Added support for two new directives in device descriptions: + `pass_filenames' (to pass the input file name to the output device) + and `use_charnames_in_special' (to support e.g. accented characters + in the `X' request). + + * include/font.h, troff/charinfo.h: Declare it. + + * libgroff/font.cc, libgroff/fontfile.cc: Set it. + + * devhtml/DESC: Use it. + + * troff/input.cc: New function encoded_char. + + * troff/token.h: Add test for `specialness'. + +2000-01-21 Werner LEMBERG + + * tmac/Makefile.sub: tmac.a4 and tmac.trace have been removed by + mistake from the list of files to be installed. + +2000-01-18 Werner LEMBERG + + * README: Added info how to apply patches. + +2000-01-15 Jan Echternach + + * troff/node.cc (ligature_note::operator delete): Fix g++ warning. + +2000-01-15 Gaius Mulley + + * troff/input.cc: Add support for troffrc-end. + + * tbl/main.cc: Altered to issue table-start and table-end special + characters if using the html device. + + * devhtml/*: Modified font files to incorporate html encoding of + characters. + + * tmac/groff_markup.man: New file documenting tmac.arkup. + + * tmac/troffrc-end: New file. This is invoked after all user + specified macros. Currently used by the html device to include + tmac.html. Thus no need for users to specify -mhtml anymore. + + * tmac/Makefile.sub (NORMALFILES): Add troffrc-end. + (MAN7): Add groff_markup.man. + + * tmac/tmac.an, tmac/tmac.html: Small html updates. + + * tmac/troffrc: tmac.arkup will now be called for the html device. + + * libgroff/font.cc, libgroff/font.h: Altered to include reading of + extra device specific information about fonts. + + * doc/homepage.ms: New file. It is an example how an HTML home page + could look like with grohtml. + + * doc/Makefile: Add homepage.ms. Remove rule for pic.html. + +2000-01-12 Bruno Haible + + * devutf8/R.proto: Add mappings for ti, Fn, st, an. Change mappings + of Im, Re. + + * devutf8/NOTES: Updated. + +2000-01-08 Bruno Haible + + * eqn/box.cc, eqn/lex.cc, eqn/other.cc, eqn/over.cc, eqn/special.cc, + eqn/text.cc, grodvi/dvi.cc, grops/ps.cc, grops/psrm.cc, + libbib/index.cc, libbib/linear.cc, libbib/search.cc, + libdriver/printer.cc, libgroff/font.cc, libgroff/string.cc, + pic/lex.cc, pic/object.cc, refer/label.y, refer/ref.cc, tbl/main.cc, + tbl/table.cc, tfmtodit/tfmtodit.cc, troff/dictionary.cc, + troff/div.cc, troff/env.cc, troff/input.cc, troff/node.cc, + troff/node.h, troff/reg.cc: Avoid most "g++ -Wall -Wno-sign-compare" + warnings. + + * troff/node.cc (bracket_node::copy): Initialize last to NULL. + +2000-01-12 Fabrizio Polacco + + grolj4: Paper size will be searched case-insensitively. + + * include/lib.h: Add check for strcasecmp(). + * grolj4/li4.cc (lookup_paper_size): Use strcasecmp(). + * configure.in: Check for strcasecmp(). + +2000-01-11 Werner LEMBERG + + * troff/Makefile.sub (majorminor.cc): Fix incorrect path to + `REVISION'. + +2000-01-10 Werner LEMBERG + + * Makefile.comm, Makefile.in, doc/Makefile: More fixes for the + revision scheme. + + Add a new read-only register, `.Y', which contains the groff + revision. + + * troff/input.cc (init_input_requests): Define it. + * troff/Makefile.sub (majorminor.cc): Define `revision' string. + * doc/groff.texinfo, troff/troff.man: Document it. + + * libgroff/Makefile.sub (version.cc): Add definition of + `Version_string[]', consisting of `..' + * eqn/main.cc, grodvi/dvi.cc, grolj4/lj4.cc, grops/ps.cc, + grotty/tty.cc, hpftodit/hpftodit.cc, indxbib/indxbib.cc, pic/main.cc, + refer/refer.cc, soelim/soelim.cc, tbl/main.cc, tfmtodit/tfmtodit.cc, + troff/input.cc, pfbtops/pfbtops.c: Use it. + +2000-01-10 Fabrizio Polacco + + Add a revision scheme to the groff package. + + * REVISION: New file. + * libgroff/Makefile.sub (version.cc): Use it to define + `revision_string[]'. + * grops/psrm.cc: Use revision_string (converted to an unsigned + integer) in constructor of resource_manager. + +2000-01-10 Bruno Haible + + * devutf8/Makefile.sub, devutf8/DESC.proto, devutf8/R.proto: New + files. + * Makefile.in (DEVDIRS): Add devutf8. + * grotty/tty.cc: Include device.h. + (glyph): Change type of `code' to `unsigned int'. + (tty_printer): New field is_utf8. Constructor takes device argument. + (tty_printer::tty_printer): If device if `utf8', set is_utf8. + (tty_printer::add_char): Change type of first arg to `unsigned int'. + (tty_printer::put_char): New function. + (tty_printer::end_page): Use put_char() instead of ::putchar(). + (make_printer): Pass device to tty_printer constructor. + * nroff.sh: Determine default device by calling 'locale'. As a + fallback, look at all of $LC_ALL, $LC_CTYPE, $LANG, $LESSCHARSET. + Recognize UTF-8 locales. + * tmac/eqnrc: Recognize utf8 like latin1. + * tmac/troffrc: Device utf8 needs tmac.tty. + +2000-01-07 Werner LEMBERG + + * tmac/Makefile.sub: tmac.a4 and tmac.trace will now be installed. + +2000-01-07 Paul Eggert + + Add a new predefined writeable number register, `year', + which contains the current year. + + * doc/groff.texinfo, PROBLEMS, troff/troff.man: Document it. + * tmac/tmac.s: Use it. + * troff/input.cc (init_registers): Initialize it. + +2000-01-06 Werner LEMBERG + + * PROBLEMS: Fixed typo. + +2000-01-04 Paul Eggert + + * PROBLEMS: Add Y2k advice for the yr number register. + +2000-01-03 Paul Eggert + + * doc/groff.texinfo: Fix Y2k bug in documentation of \n(yr. + +2000-01-02 Werner LEMBERG + + * tmac/tmac.arkup: Slight modification of macros to provide better + appearance for non-HTML formats. + +2000-01-01 Charles Levert + + * soelim/soelim.cc (include_path_append): realloc(NULL, n) + does not automatically translate to malloc(n) on all OSes + (e.g., SunOS) so do it explicitly. Also, check the returned + value. + +2000-01-01 Werner LEMBERG + + * tmac/tmac.arkup: Added .LINE macro. Some formatting. + + * Makefile.in: Added $(tmac_m) again since the Makefile in `mm' + expects this variable + +2000-01-01 Gaius Mulley + + * doc/Makefile: Added instructions to create HTML and text + versions of some files. + +1999-12-31 Werner LEMBERG + + * Updated INSTALL.gen. + + * tmac/tmac.arkup: Added fixes so that .FTP and .MAILTO works + better resp. correctly with non-HTML devices. + +Local Variables: +version-control: never +coding: latin-1 +End: diff -ruN groff-1.19.1/ChangeLog.117 groff-1.19.2/ChangeLog.117 --- groff-1.19.1/ChangeLog.117 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/ChangeLog.117 2005-06-28 18:10:59.000000000 +0200 @@ -0,0 +1,2190 @@ + +Version 1.17.2 released +======================= + +2001-07-07 Werner LEMBERG + + * src/utils/indxbib/indxbib.cc (main): Change type of `name_max' + to size_t. + +2001-07-06 Ruslan Ermilov + + * tmac/doc.tmac (Rv): Make `Rv' really not parseable. + Fix synopsis. + * tmac/groff_mdoc.man: Fix synopsis. + +2001-07-05 Ruslan Ermilov + + * tmac/doc.tmac (doc-inset-list, doc-hang-list, doc-ohang-list): + Restore `doc-Pa-font'. + +2001-07-04 Werner LEMBERG + + * src/utils/indxbib/dirnamemax.c: Moved to ... + * src/libs/libgroff/maxfilename.cc: Here. + s/dir_name_max/file_name_max/. + Add copyright. + * src/include/lib.h: Add file_name_max. + * src/utils/indxbib/indxbib.cc: Updated. + * src/utils/indxbib/Makefile.sub, src/libs/libgroff/Makefile.sub: + Updated. + + * src/libs/libgroff/tmpfile.cc (TMPFILE_PREFIX) [__MSDOS__]: Define + as empty. + (xtmpfile) [_MSC_VER]: Removed -- MSVC has mktemp(). + + * src/preproc/html/pre-html.cc (PAGE_TEMPLATE, PS_TEMPLATE, + REGION_TEMPLATE): New macros. + (createAllPages, makeTempFiles): Use them. + Include `nonposix.h'. + (html_system): New function. + (createAllPages, createImage): Use it. + Use EXE_EXT. + + * tmac/www.tmac: Fix typos. + +2001-07-03 Werner LEMBERG + + * tmac/www.tmac: Disable hyphenation in normal text only if output + device is html. + (URL, FTP, MAILTO): Disable hyphenation of actual URL with `\%'. + * tmac/groff_mwww.man, NEWS: Updated. + +2001-07-03 Gaius Mulley + + * tmac/www.tmac (.IMAGE): Add fourth parameter to specify vertical + image location. + +2001-07-02 Ruslan Ermilov + + * tmac/doc-common, tmac/doc.tmac (doc-display-ft-stack, + doc-display-ps-stack): Implement font and font size stack for + displays. + +2001-07-02 Werner LEMBERG + + * REVISION: Increased to 2. + * src/roff/troff/input.cc (read_size): Fix special case `\s[0]'. + + * src/groff/grog/grog.pl (process): Handle `Oo' and `Oc' not at the + beginning of a line. + * src/groff/grog/grog.sh: Ditto. + +2001-06-29 Peter Marquardt + + * src/preproc/eqn/neqn.sh: Put `export' keyword in a new line to + make it portable. + +2001-06-27 Werner LEMBERG + + Fix problems with preprocessor string for `man' program. + + * *.man: Don't use `s' in preprocessor string -- it doesn't exist. + Updated/added copyright. + Moved Emacs's local variable to identify nroff mode to the end of + the file; add local variable if missing. + +2001-06-26 Andras Salamon + + * aclocal.m4: Replace AC_LANG_SAVE + AC_LANG_CPLUSPLUS with + AC_LANG_PUSH(C++) and AC_LANG_RESTORE with AC_LANG_POP(C++). + * configure: Regenerated. + +2001-06-25 Andras Salamon + + * aclocal.m4 (GROFF_PAGE): Fix page detection code. + * configure: Regenerated. + +2001-06-24 Werner LEMBERG + + * doc/homepage.ms: Don't include arkup.tmac (which no longer exists) + but www.tmac. + * doc/pic.ms: Fix typos. + +Version 1.17.1 released +======================= + +2001-06-21 Golubev I. N. + + * aclocal.m4 (GROFF_NEED_DECLARATION): Fix inclusion of strings.h. + * configure: Updated. + +2001-06-20 Gaius Mulley + + * src/roff/preproc/html/pre-html.cc (make_message): Fix incorrect + image names. + * src/roff/troff/dic.cc (blank_line): Add html tag. + +2001-06-19 Gaius Mulley + + * src/roff/troff/input.cc (do_suppress): Fix typo. + +2001-06-18 Gaius Mulley + + Added two new options (-D and -I) to specify image names and a + subdirectory to place the images in. + + Change syntax from \\Ox to \\O[x]. + + * src/devices/grohtml/post-html.cc (main): Add options. + (usage): Updated. + * src/preproc/html/pre-html.cc: Include `stdarg.h'. + Use `NULL' instead of `0' for null string pointers. + (MAX_RETRIES): New macro. + (lengthOfintToStr, intToStr, make_message): New functions. + (makeFileName): Make function static. + Implement -D and -I options. + (checkImageDir): New function. + (write_end_image, write_start_image): Use new syntax of \O. + (createAllPages, removeAllPages): Implement -D and -I options. Use + make_message(). + (createImage): Use make_message(). + (addps4html): Add guard for malloc(). + (usage, scanArguments): Updated. + (makeTempFiles): Use mkstemp(). + (removeTempFiles): Use unlink(). + (findPrefix): Add guard for malloc(). + (main): Updated. + * src/roff/troff/input.cc (get_delim_file_name): New function to + parse \O. + (do_suppress): Updated to parse new syntax. + * src/devices/grohtml/grohtml.man: Updated. + * tmac/www.tmac: Updated to new syntax. + + * NEWS: Updated. + +2001-06-15 Werner LEMBERG + + * src/roff/grog/Makefile.sub: Remove NAMEPREFIX. + + * src/devices/grohtml/grohtml.man: Minor improvements. + +2001-06-14 Werner LEMBERG + + * src/preproc/html/Makefile.sub: Remove NAMEPREFIX. + +2001-06-11 Werner LEMBERG + + * man/roff.man, mann/groff.man: Use '\" instead of .\" in the first + line to specify preprocessor options -- mandb 2.3.1 only recognizes + the former. + * src/preproc/grn/grn.man: Add proper '\" string. + +2001-06-11 OKAZAKI Tetsurou + + * test-groff: Don't use PATH but GROFF_BIN_PATH. + +2001-06-08 Werner LEMBERG + + Updated to autoconf 2.50. + + * configure.in: Renamed to... + * configure.ac: This. + * aclocal.m4 (AC_OUTPUT_MAKE_DEFS): Removed. + (GROFF_OS390): Updated. + * configure: Regenerated. + +2001-05-18 Werner LEMBERG + + * src/roff/troff/env.c, src/roff/troff/env.h, + src/roff/troff/input.cc, src/roff/troff/troff.man: Undo `ss' change + from 2000-12-21. + +2001-05-17 Jeffrey Friedl + + * src/roff/troff/input.cc (read_size): Fix special case `\s0'. + +2001-05-16 Werner LEMBERG + + * src/roff/troff/input.cc (read_size): Emit warning if value becomes + less than or equal zero; set it to 1 then. + * src/roff/troff/node.h (node::node): Initialize `last'. + +2001-05-08 Werner LEMBERG + + * tmac/an-old.tmac: Make predefined strings work in compatibility + mode. + Add troff version guard. + * tmac/doc.tmac: Simplify version guard. + +2001-05-07 Werner LEMBERG + + The .ns and .rs requests are now honoured not only in the top-level + but in all diversions (similar to UNIX troff). + + This change is based on a patch from Tadziu Hoffmann + . + + * src/roff/troff/div.h (diversion): Add `no_space_mode' member. + (top_level_diversion): Remove `no_space_mode' member. + * src/roff/troff/div.cc (diversion::diversion, + top_level_diversion::top_level_diversion): Updated. + (macro_diversion::output): Reset `no_space_mode'. + (no_space, restore_spacing): Use `curdiv' unconditionally. + (space_request, blank_line): Check `curdiv->no_space_mode'. + (no_space_mode_reg::get_value, no_space_mode_reg::get_string): Use + `curdiv' unconditionally. + * NEWS, src/roff/troff/troff.man, man/groff.man, doc/groff.texinfo: + Updated. + +2001-05-06 Werner LEMBERG + + Added two new requests `de1' and `am1' which are similar to `de' and + `am' with the difference that compatibility mode is saved on entry, + switched off during macro execution, and restored on exit. + + * src/roff/troff/input.h: Added two new special characters + (COMPATIBLE_SAVE, COMPATIBLE_RESTORE). + * src/roff/troff/input.cc (input_iterator): Added two member + functions `save_compatible_flag' and `get_compatible_flag'. + (input_stack): Ditto. + (string_iterator): Ditto. Also add private member + `saved_compatible_flag'. + (token::next): Use COMPATIBLE_SAVE and COMPATIBLE_RESTORE. + (calling_mode): New enumeration. + (do_define_macro): Use it. Insert COMPATIBLE_SAVE and + COMPATIBLE_RESTORE at the beginning and end of macro, respectively. + (define_macro, define_indirect_macro, append_macro, ignore): Use + `calling_mode'. + (define_nocomp_macro, append_nocomp_macro): New functions. + (init_input_requests): Updated. + (do_request): Rename local variable `saved_compatible_flag' to + `old_compatible_flag'. + * NEWS, src/roff/troff/troff.man, man/groff.man: Document it. + + * tmac/an-old.tmac: Use `de1' instead of `de' request for all + public and trap-invoked macros. As a consequence, the man macros + work in compatibility mode also. + +2001-05-06 Solar Designer + + * Makefile.in: Use $(mandir). + +2001-05-06 Alexios Zavras + + * src/utils/afmtodit/afmtodit.pl: Fix serious typo. + +2001-05-05 Werner LEMBERG + + Added `.ns' number register: Returns 1 in no-space mode (if in + top-level diversion), 0 otherwise. + + * src/roff/troff/div.cc (no_space_mode_reg): New class. + (init_div_requests): Updated. + * NEWS, src/roff/troff/troff.man, man/groff.man, doc/groff.texinfo: + Document it. + +2001-05-04 Werner LEMBERG + + * src/roff/nroff/nroff.man: Improved documentation (especially + locales). + +2001-05-02 Werner LEMBERG + + Added `brp' request: This is \p as a request. + + * src/roff/troff/env.cc (environment::do_break): Add parameter + `spread'. + (do_break_request): New function (was `break_request'). + (break_request): Calls `do_break_request'. + (break_spread_request): New; calls `do_break_request'. + (init_env_requests): Updated. + * src/roff/troff/env.h: Updated. + * NEWS, src/roff/troff/troff.man, man/groff.man: Document it. + + * REVISION: Increased to 1. + * win32-diffs: Updated. + +2001-05-01 Werner LEMBERG + + * tmac/an-old.tmac: Fix minor compatibility mode issue. + * tmac/troffrc-end: Make it really work in compatibility mode. + +2001-04-27 Werner LEMBERG + + * src/utils/lkbib/lkbib.cc: Switch inclusion order of stdio.h and + stdlib.h. + +2001-04-22 Werner LEMBERG + + * src/libs/libgroff/getopt.c, src/include/getopt.h: Updating to + latest versions from glibc CVS archive. + + * MORE.STUFF: Updated, using a patch from Kees Zeelenberg + . + +2001-04-21 Werner LEMBERG + + * configure.in: Move check for mkstemp() to... + * aclocal.m4 (GROFF_MKSTEMP): This new function. + * configure: Regenerated. + + * src/include/groff-getopt.h: Don't use variable names in + declarations. + + * src/devices/grohtml/html-chars.h: Removed. It isn't used. + * src/devices/grohtml/Makefile.sub, + src/devices/grohtml/post-html.cc: Updated. + +2001-04-21 Albert Chin-A-Young + + * configure.in: Add special check for mkstemp(). + * src/libs/libgroff/tmpfile.cc: Use it. + * src/utils/indxbib/indxbib.cc: Ditto. + * src/utils/pfbtops/pfbtops.c (main): Don't use C++ comment style. + * src/devices/grolbp/lbp.h (lbpprintf, lbpputs, vdmprintf): Use + `const'. + +2001-04-20 Bruce Lilly + + `Version_string' as C++ object was not visible to linker from C + object files. + Add `const' to `Version_string'. + + * src/utils/pfbtops/pfbtops.c (main), src/roff/groff/groff.cc + (main), src/roff/troff/input.cc (main), src/preproc/tbl/main.cc + (main), src/preproc/pic/main.cc (main), src/preproc/eqn/main.cc + (main), src/preproc/grn/main.cc (main), src/preproc/html/pre-html.cc + (scanArguments), src/preproc/refer/refer.cc (main), + src/preproc/soelim/soelim.cc (main), src/devices/grotty/tty.cc + (main), src/devices/grodvi/dvi.cc (main), src/devices/grolj4/lj4.cc + (main), src/devices/grohtml/post-html.cc (main), + src/devices/grolbp/lbp.cc (main), src/utils/tfmtodit/tfmtodit.cc + (main), src/utils/hpftodit/hpftodit.cc (main), + src/utils/lookbib/lookbib.cc (main), src/utils/indxbib/indxbib.cc + (main), src/utils/lkbib/lkbib.cc (main), + src/utils/addftinfo/addftinfo.cc (main): Implement it. + + * src/roff/groff/pipeline.c: Add _UWIN. + * src/include/nonposix.h: Ditto. + +2001-04-20 Werner LEMBERG + + * src/include/lib.h: Use HAVE_STRERROR. + * src/roff/groff/pipeline.c: Ditto. + * src/preproc/html/pre-html.cc: Remove declaration of `strerror'. + * src/libs/libgroff/Makefile.sub (version.cc): Add `extern "C"'. + * src/utils/pfbtops/pfbtops.c: Add copyright notice. + * win32-diffs: Updated. + * src/utils/hpftodit/hpftodit.cc (read_map): Fix compiler warning. + +2001-04-19 Werner LEMBERG + + * src/preproc/html/pre-html.cc (scanArguments): Use `troff_command' + instead of hardwired `"troff"'. + (char_buffer::read_file): Remove unused variables. + (char_buffer::write_file_troff): Ditto. + (char_buffer::write_file_html): Ditto. + (generateImages): Ditto. + (abs): Removed. + * src/utils/addftinfo/addftinfo.cc (main): Fix compilation problem. + + * src/include/lib.h: Don't include `groff-getopt.h' for UWIN. + + * src/libs/libgroff/font.cc (font::load_desc): Fix compiler warning. + * src/libs/libbib/index.cc (index_search_item_iterator::get_tag, + index_search_item::search1): Ditto. + * src/roff/troff/node.h (width_list): Reorder members. + * src/roff/troff/input.cc (do_define_macro): Fix compiler warning. + (lookup_warning): Ditto. + (prepend_string): Commented out. + * src/roff/troff/dictionary.cc (is_good_size): Fix compiler warning. + * src/roff/troff/reg.cc (number_value_to_ascii): Ditto. + * src/preproc/tbl/main.cc (process_format): Ditto. + * src/preproc/pic/pic.y (define_variable, reset, reset_all): Fix + compiler warnings. + * src/preproc/pic/pic.cc: Updated. + * src/preproc/eqn/lex.cc (init_table): Fix compiler warnings. + * src/preproc/eqn/over.cc (over_box::compute_metrics): Ditto. + * src/preproc/refer/command.cc (execute_command): Ditto. + * src/preproc/refer/ref.cc (sortify_title, find_month): Ditto. + * src/preproc/refer/token.cc (lookup_token): Ditto. + * src/preproc/soelim/soelim.cc: Ditto. + * src/preproc/html/pushbackbuffer.cc (ERROR): Ditto. + (isHexDigit): Commented out. + (pushBackBuffer::isString): Remove unused variable. + * src/devices/grops/ps.cc (ps_printer::special): Fix compiler + warning. + * src/devices/grops/psrm.cc (resource_manager::lookup_font, + resource_manager::read_resource_arg, read_one_of, parse_extensions): + Ditto. + * src/devices/grodvi/dvi.cc (dvi_printer::draw): Ditto. + * src/devices/grolj4/lj4.cc (lj4_font::handle_unknown_font_command, + lookup_paper_size): Ditto. + * src/devices/grohtml/post-html.cc (is_subsection): Commented out. + (text_glob, element_list): Reorder members. + * src/devices/grohtml/html-text.cc (html_text::do_pre): Remove + compiler warning. + * src/devices/grohtml/html-text.h (html_text::emit_space): Change + return value to `void'. + * src/devices/grohtml/output.cc (word_list::word_list): Fix order + of initializers. + * src/devices/grohtml/html.h (simple_output::check_newline, + simple_output::space_or_newline, simple_output::enable_newlines): + Add return value. + * src/devices/grolbp/lbp.cc (wp54charset, set_papersize): Remove + compiler warnings. + * src/utils/tfmtodit/tfmtodit.cc (tfm::load, gf::load, main): Ditto. + * src/utils/hpftodit/hpftodit.cc (File::seek, read_symbol_sets, + output_ligatures, output_charset, read_map): Ditto. + * src/utils/lookbib/lookbib.cc (main): Ditto. + * src/utils/indxbib/indxbib.cc (main, fwrite_or_die): Ditto. + (do_file): Fix typo (`=' -> `=='). + * src/utils/lkbib/lkbib.cc (main): Remove compiler warning. + * src/utils/addftinfo/addftinfo.cc (main): Ditto. + +2001-04-18 Ruslan Ermilov + + * src/roff/nroff/nroff.sh: Adding -p (pic) and -t (tbl) options. + Fix usage of GROFF_BIN_PATH. + * src/roff/nroff/nroff.man: Updated. + +2001-04-18 Werner LEMBERG + + * NEWS: Fixing typos. + Updated. + +Version 1.17 released +===================== + +2001-04-17 Werner LEMBERG + + * tmac/Makefile.sub (install-data): mdoc.local-s is in current + directory, not in $(srcdir). + +2001-04-16 Werner LEMBERG + + * doc/groff.texinfo: More info on conditionals. + +2001-04-15 Werner LEMBERG + + * doc/groff.texinfo: Added some info about groff internals. + + * src/roff/troff/node.cc (make_glyph_node): Emit warning message + about missing special character only if the name is non-null. + +2001-04-14 Werner LEMBERG + + Removing the grohtml-old device driver which is now obsolete. + + * src/devices/grohtml-old/*: Removed. + * font/devhtml-old/*: Removed. + * src/libs/libgroff/htmlindicate.cc (graphic_start, graphic_end): + Remove comments. + * Makefile.in (CCPROGDIRS, DEVDIRS): Updated. + * test-groff (PATH): Updated. + * tmac/Makefile.sub (NORMALFILES): Updated. + * tmac/an-old.tmac: Remove special code for html-old device. + Replace `html-or-html-old' register with `an-html'. + * tmac/eqnrc: Updated. + * tmac/html-old.tmac: Removed. + * tmac/troffrc, tmac/troffrc-end: Updated. + * tmac/www.tmac: Remove special code for html-old device. + Replace `html-or-html-old' register with `www-html'. + + * src/libs/libgroff/tmpfile.cc (remove_tmp_files), + src/libs/libgroff/htmlindicate.cc (graphic_end), + include/htmlindicate.h, src/preproc/grn/*.cc, + src/roff/groff/env.{cc,h}: Remove `void' parameter if used as a + single argument for consistency with rest of source code. + + * aclocal.m4, tmac/an-old.tmac: Fix copyright. + +2001-04-13 Ruslan Ermilov + + * src/roff/troff/troff.man: Fixing typos. + +2001-04-13 Werner LEMBERG + + * doc/pic.ms: Fixing many font switches. + * doc/groff.texinfo: Fixes, additions. + * MORE.STUFF: Updated. + +2001-04-12 Gaius Mulley + + * src/devices/grohtml/grohtml.man: Updated manual page regarding + simple anchor. + * src/preproc/html/pre-html.cc (createImage): Fixed right hand + cropping of images. + (removeTempFiles): New function to tidy up temporary files. + * src/preproc/html/pre-html.cc (main): Calls `removeTempFiles()'. + Many fixes to do with the new inline suppress node and image regions + are much tighter. + * src/devices/grohtml/post-html.cc: New method `is_auto_img'. + (generate_img_src): New function. + (html_printer::do_auto_image): Utilizes it. + (do_heading, do_title): Include inline images within their contents. + (html_printer::begin_page): Tidied up comments that are issued to + the html output file. + (html_printer::do_fill): Fixed so that `.nf' works with fonts other + than courier. + (text_glob::is_br): New method used by do_heading. + * tmac/s.tmac: If -Thtml then emit $1 in .IP rather than its + equivalent diversion. + * src/include/html-strings.h: Altered image tags to reflect the + inline image node. + * src/include/htmlindicate.h (html_end_suppress): Added `is_inline' + parameter. + * src/preproc/eqn/main.cc: Will suppress generation of image tags if + it is already inside a pic image. Only emit tags if the argument + `-Tps:html' is present. + * src/preproc/tbl/main.cc: Changes to reflect additional + `html_end_suppress' parameter. + * src/roff/troff/env.cc: Only emit eol tag if a node has been + emitted since the last eol tag was written. + * src/roff/troff/env.h: New boolean `emitted_node'. + * src/roff/troff/input.cc (do_suppress): Handles extra suppress + nodes \O3, \O4, \O5. No longer use `output_low_mark_miny'. + * src/roff/troff/node.cc (check_charinfo): New method. + (troff_output_file::determine_line_limits): Alterations to limit + checking. + * tmac/www.tmac: Changes to reflect new suppress nodes. + +2001-04-12 Bruno Haible + + * src/devices/grohtml/post-html.cc (html_printer::add_to_sbuf): + Escape the html_glyph in the buffer. + (str_translate_to_html): Output the unescaped escaped_char. + * src/devices/grohtml/html-text.cc (issue_table_begin): Set + `frame=void', not `frame=none'. Add `border=0'. + +2001-04-12 Werner LEMBERG + + * PROBLEMS: Add some words on how to avoid wrapper macros. + +2001-04-11 Blake McBride + + * src/include/nonposix.h (fileno) [_MSC_VER]: Removed. + +2001-04-11 Werner LEMBERG + + * font/devlbp/Makefile.sub (CLEANADD): Set it. + * tmac/Makefile.sub (CLEANADD): Add tmac.local-s. + * Makefile.in (dist): Don't remove src/xditview/Imakefile, but ... + * Makefile.sub (DISTCLEANFILES): Here. + + * libs/libgroff/new.cc: Include `nonposix.h'. + * win32-diffs: Updated. + +2001-04-10 Ruslan Ermilov + + Added skeleton macro for defunct macros. + + Updated documentation. + + When inside displays, an empty input line warning should be + suppressed. If another macro call is put inside a display, + all subsequent empty lines found in that display caused a + warning to be emitted. + + * tmac/doc.tmac (doc-defunct-macro): New macro. + (Db, Ds, Ex, Or, Sf): Reimplemented using this macro. + (doc-restore-global-vars): Fixed typo. + (doc-empty-line): Check the `doc-display-depth' register to + determine whether we are inside display or not. + + * tmac/doc-common: Removed `Or' and `Sf' registers. + Moved obsolete `Ds' macro to doc.tmac. + + * tmac/groff_mdoc.man: Bump document date. + Document `.Vt' under ``Variable Types''. + Removed documentation for obsolete `.Or' macro. + +2001-04-10 Werner LEMBERG + + * NEWS: Updated. + * doc/groff.texinfo: Many fixes, additions, clarifications, etc. + +2001-04-10 Bruno Haible + + * src/devices/grodvi/dvi.cc (main): Accept --help and --version. + (usage): Add stream argument. Don't exit. + * src/devices/grohtml/post-html.cc (main): Accept --help and --version. + Write --version output to stdout, not stderr. + (usage): Add stream argument. Don't exit. + * src/devices/grohtml-old/html.cc (main): Accept --help and --version. + (usage): Add stream argument. Don't exit. + * src/devices/grolbp/lbp.cc (long_options): Use symbolic getopt.h + constants. + (usage): Add stream argument. Don't exit. + (main): Write --help output to stdout, not stderr. + * src/devices/grolj4/lj4.cc (main): Accept --help and --version. + (usage): Add stream argument. Don't exit. + * src/devices/grops/ps.cc (main): Accept --help and --version. + (usage): Add stream argument. Don't exit. + * src/devices/grotty/tty.cc (main): Accept --help and --version. + (usage): Add stream argument. Don't exit. + * src/preproc/eqn/main.cc (usage): Add stream argument. Don't exit. + (main): Accept --help and --version. + * src/preproc/grn/main.cc (usage): Add stream argument. Don't exit. + (main): Accept --help and --version. + * src/preproc/html/pre-html.cc (usage): Add stream argument. + (scanArguments): Accept --help and --version. + * src/preproc/pic/main.cc (usage): Add stream argument. Don't exit. + (main): Accept --help and --version. + * src/preproc/refer/refer.cc (main): Accept --help and --version. + (usage): Add stream argument. Don't exit. + * src/preproc/soelim/soelim.cc (usage): Add stream argument. Don't + exit. + (main): Accept --help and --version. + * src/preproc/tbl/main.cc (usage): Add stream argument. Don't exit. + (main): Accept --help and --version. + * src/roff/groff/groff.cc (main): Accept --help and --version. + (synopsis): Add stream argument. + (help): Write --help output to stdout, not stderr. + (usage): Add stream argument. Don't exit. + * src/roff/grog/grog.pl: Accept --help and --version. + (help): New sub. + * src/roff/grog/grog.sh: Accept --help and --version. + * src/roff/nroff/nroff.sh: Accept --help and --version. + * src/roff/troff/input.cc (USAGE_EXIT_CODE): Remove macro. + (usage): Add stream argument. Don't exit. + (main): Accept --help and --version. + * src/utils/addftinfo/addftinfo.cc (main): Accept --help and --version. + (usage): New function with stream argument, doesn't exit. + * src/utils/hpftodit/hpftodit.cc (main): Accept --help and --version. + (usage): New function with stream argument, doesn't exit. + * src/utils/indxbib/indxbib.cc (main): Accept --help and --version. + (usage): Add stream argument. Don't exit. + * src/utils/lkbib/lkbib.cc (usage): Add stream argument. Don't exit. + (main): Accept --help and --version. + * src/utils/lookbib/lookbib.cc (usage): Add stream argument. Don't + exit. + (main): Accept --help and --version. + * src/utils/pfbtops/pfbtops.c (usage): Add stream argument. Don't exit. + (main): Accept --help and --version. + * src/utils/tfmtodit/tfmtodit.cc (main): Accept --help and --version. + (usage): Add stream argument. Don't exit. + +2001-04-10 Ruslan Ermilov + + Fix indentation in SYNOPSIS. + + Updated to include changes of latest BSD mdoc version (basically, + the only change is that `.Fn' and `.Fc' put a final semicolon after + a function declaration in the SYNOPSIS section). + + * tmac/doc.tmac (doc-in-synopsis-count): Replaced with ... + (doc-in-synopsis-section): New variable. Updated all related + functions. + (doc-indent-synopsis-active): New register. + (Nd, Fn, Fo): Use it. + (Cd): It requires manipulation of \n[doc-indent-synopsis] so that + `.Cd' with long argument line produces indented wrapped lines. + Also, the misplaced `.nop \*[doc-Nm-font]\c'' caused extra + undesirable line break to be output. + (doc-do-func-decl, Nm, Vt, Fn, Fo): Remove extraneous calls to + `.rs'. + (Fn, Fc): Add final `;' to output. + (doc-save-global-vars, doc-restore-global-vars): Updated. + * tmac/doc-common: Remove `Ex' register. + Updated. + * tmac/doc-ditroff, tmac/doc-nroff, tmac/doc-syms: Updated + copyright. + +2001-04-06 Ruslan Ermilov + + * tmac/doc.tmac (Cd): Simplify code. + * tmac/groff_mdoc.man: Document some behaviour of `Cd' request. + +2001-04-06 Werner LEMBERG + + Implement continuous underlining for nroff mode. To do that, a new + request in the ditroff language has been added: `x u N' (N is 0 + or 1). + + \X and \Y are now transparent to end-of-sentence recognition. + + * src/include/printer.h (printer): Add `type' parameter to `special' + method. + * src/libs/libdriver/printer.cc (printer::special): Updated. + * src/libs/libdriver/input.cc (do_file): Handle `x u N'. + + * src/devices/dvi/dvi.cc (dvi_printer::special): Handle only + specials of type `p'. + * src/devices/grohtml/post-html.cc (html_printer::special): Ditto. + * src/devices/grohtml-old/html.cc (html_printer::special): Ditto. + * src/devices/grops/ps.cc (ps_printer::special): Ditto. + * src/devices/grotty/tty.cc: Add new enum CU_MODE. + (glyph::order): New method. + (tty_printer::add_char): Use it. + (tty_printer::special): New method. + (tty_printer::end_page): Implement it. + + * src/roff/troff/node.h (special_node): Add `no_init_string' member. + * src/roff/troff/node.cc (special_node::special_node): Add parameter + to set `no_init_string'. + (special_node::tprint_start): Use it. + (special_node::same, special_node::copy): Updated. + (special_node::ends_sentence): New method. + (troff_output_file::start_special): Add parameter to include + inititialization of special conditionally. + + * src/roff/troff/env.h (environment): New member `underline_spaces'. + * src/roff/troff/env.cc (do_underline_special): New function. + (environment::set_font): Use it. + (do_underline): Use it. This was `underline()'. + (underline): Call `do_underline()'. + (continuous_underline): New function which calls `do_underline()'. + (environment::newline): Use `do_underline_special()'. + (init_env_requests): Updated. + + * NEWS, man/troff_out.man: Updated. + +2001-04-06 Bruno Haible + + * font/devutf8/R.proto: Fix code of 'shc'. + +2001-04-06 Ruslan Ermilov + + Many fixes. Diag lists can now be nested also; additionally, + `-compact' and `-offset' are supported. + + * tmac/doc.tmac (doc-have-indent): Replaced with ... + (doc-list-have-indent-stackXXX): A new register stack. + (doc-have-diag-list): Removed. + (Bl): Use `doc-list-have-indent-stackXXX'. + (El): Updated. + (doc-diag-list): Use `doc-compact-list-stackXXX'. + (doc-tag-list): Use `doc-list-have-indent-stackXXX'. + (doc-set-vertical-and-indent): Ditto. + (doc-next-list-depth): Removed. + (doc-increment-list-stack): Updated. + (doc-decrement-list-stack): Use `doc-list-depth' instead of + `doc-next-list-depth'. + (doc-end-list, doc-end-column-list): Don't use + `doc-increment-list-stack'. + (doc-set-column-tab): Don't use `doc-list-offset-stackXXX'. + (doc-save-global-vars, doc-restore-global-vars): Updated. + * tmac/doc-common: Updated. + * tmac/groff_mdoc.man: Updated. + * NEWS: Fix typo. + +2001-04-02 Werner LEMBERG + + * src/devices/grotty/grotty.man: Fix grammatical error. + +2001-03-30 Ruslan Ermilov + + Remove .Ld from mdoc package; replace it with special handling of + `...'. + + * tmac/doc-common: Remove `Ld' register. + Uncomment `doc-volume-ds-*' strings. + Remove `doc-operating-system-default'. + (Os): Updated. + * tmac/doc-syms (Ld): Removed. + * tmac/doc.tmac (doc-parse-args, doc-parse-arg-vector): Handle + `...' specially. + * NEWS: Updated. + + * tmac/groff_mdoc.man: Many fixes and updates. + +2001-03-29 Werner LEMBERG + + * tmac/troffrc-end: Protect data with `.do'. Reported by T. Kurt + Bond . + * tmac/www.tmac: Save compatibility mode. + +2001-03-28 Ruslan Ermilov + + * tmac/groff_mdoc.man: Many fixes. + +2001-03-28 Werner LEMBERG + + * src/preproc/soelim/soelim.man: Document that `.so' + isn't recognized. + +2001-03-27 Werner LEMBERG + + * tmac/an-old.tmac (TP, an-do-tag): Reduce line length while in + diversion. This fixes overlong tags. + +2001-03-26 Werner LEMBERG + + * doc/groff.texinfo: Fixed and improved documentation of fonts. + * tmac/doc-syms: Fix error messages. + * tmac/an-old.tmac: Remove incorrect double backslashes. + +2001-03-24 Ruslan Ermilov + + * tmac/Makefile.sub: Strip mdoc.local also + * tmac/strip.sed: Fixed. + +2001-03-24 Werner LEMBERG + + * tmac/doc-nroff, tmac/doc-ditroff: Implement -rSxx switch for + selecting the font size. + * tmac/groff_mdoc.man, NEWS: Document it. + +2001-03-23 Werner LEMBERG + + * src/roff/troff/div.cc (save_vertical_space): Add default argument + to `sv' request. + * src/roff/troff/env.cc (family_change): Make `.fam' accept no + argument to restore previous font family. + * src/roff/troff/troff.man, man/groff.man, NEWS: Updated. + + * doc/groff.texinfo: More fixes and additions (mainly for font + manipulating commands). + + * tmac/groff_mdoc.reference.man: Small updates and renamed to ... + * tmac/groff_mdoc.man: This. The quick reference has been removed. + * tmac/Makefile.sub, NEWS: Updated. + +2001-03-23 Werner LEMBERG + + Replaced mdoc implementation. The new version is `state of the + art', using almost all new features of groff 1.17 -- it won't run + with older versions. + + * tmac/doc.tmac: Completely rewritten. + * tmac/doc-common: Ditto. + * tmac/doc-nroff: Ditto. + * tmac/doc-ditroff: Ditto. + * tmac/doc-syms: Ditto. + * tmac/mdoc.local: New file. + * tmac/groff_mdoc.samples.man: Replaced with ... + * tmac/groff_mdoc.reference.man: New file, covering mdoc completely. + * tmac/strip.sed: Updated. + * tmac/Makefile.sub: Updated. + * INSTALL: Updated. + + * tmac/groff_man.man: Add `man.local' to the FILES section. + +2001-03-22 Werner LEMBERG + + * doc/groff.texinfo: Added many @noindent. + Replaced @end_Example -> @endExample. + Added info whether registers are r/o. + Many other additions and fixes. + +2001-03-21 Werner LEMBERG + + * doc/groff.texinfo: Added macro @Var (and some hacks due to bugs + in makeinfo of texinfo 4.0) to be used in @Def* macros. + Improved @Def* macros: Now the exact syntax of request, register, + and escapes is shown. + Added macros for parentheses and brackets to be used in @Def*. + Many fixes and improvements of the documentation. + +2001-03-20 Werner LEMBERG + + * doc/groff.texinfo: Added new index: `st' (for strings). + Added macros @Defstr(x). + Added macro @Example (adding @group). + Other minor improvements. + +2001-03-19 Werner LEMBERG + + * doc/groff.texinfo: Added two new indices: `es' (for escapes) and + `rq' for requests. `fn' is no longer used. + Added macros @Defreq(x), @Defreg(x), and @Defesc(x). + Removed @Deffn(x). + + * tmac/an-old.tmac (an-p-footer): If `cR' is set, replace page + number with name of man page. + +2001-03-19 Larry Kollar + + * doc/groff.texinfo: Complete revision. Added many @Deffn to gain + consistency. + +2001-03-19 Werner LEMBERG + + * man/groff_font.man: Document `prepro', `postpro', and `print'. + * src/roff/groff/groff.man: Improve documentation of `-l' and `-L'. + * src/devices/grohtml/grohtml.man: Fixing typos. + +2001-03-19 Gaius Mulley + + * tmac/s.tmac (@IP): Pass `.ip' html tag. + * tmac/groff_mwww.man: Remove .LINE macro + * tmac/www.tmac (LINE): Add `.ti'. + + * src/devices/grohtml/post-html.cc (html_printer): New member + `indent'. + (html_printer::emit_raw): Use it. + (html_printer::do_linelength): Ditto. + (html_printer::do_pageoffset): Ditto. + (html_printer::do_indentation): Ditto. + (html_printer::do_tempindent): Ditto. + (html_printer::do_break): Ditto. + (html_printer::begin_page): Ditto. + (html_printer::do_indentedparagraph): New function. + (html_printer::troff_tag): Handle `.ip'. + * src/devices/grohtml/html-text.cc (html_text::issue_table_begin): + Add `' handling. + (html_text::do_table): Add parameter. + (html_text::do_indent): Updated. + * src/devices/groohtml/html-text.h: Updated. + +2001-03-16 Gaius Mulley + + Introduced simple html tables to implement indentation. + + * src/devices/grohtml/html.h (word, word_list): New structures. + (simple_output): Use it. + * src/devices/grohtml/post-html.cc: Add `INDENTATION'. + (html_printer): Improve indentation handling. + (html_printer::emit_raw): Set `in_table' element. Handle + indentation if set. + (html_printer::write_header): Move conditional downwards. + Don't allow whitespace in tags. + (html_printer::do_linelength): Handle line length and indentation + conditionally. + (html_printer::do_pageoffset): Handle indentation conditionally. + (html_printer::do_indentation): Ditto. + (html_printer::do_tempindent): New function member. + (html_printer::do_fill): Take care of indentation. + (html_printer::do_flush): Finish table. + (html_printer::do_links): Ditto. + (html_printer::do_break): New function for handling `.br' and `.ti'. + (html_printer::troff_tag): Use it. + Handle `.ti'. + (html_printer::flush_globs): Fix. + (html_printer::flush_page): Finish table. + (html_printer::html_printer): Fix error message. Set up + `linelength'. + (html_printer::add_to_sbuf): Remove special handling of character + code 255. + (to_unicode): Remove `stop()'. + (html_printer::write_title): Cleanup. + (html_printer::begin_page): Use `put_string()'. Handle indentation. + (html_printer::~html_printer): Flush text and end the line. + Use `put_string()'. + * src/devices/grohtml/html_text.h: Add more *_TAG enum values. + * src/devices/grohtml/html_text.cc (html_text::end_tag): Fix + emission of tags. + (html_text::start_tag): Disable newlines. + (html_text::table_is_void): New function. + (html_text::issue_table_begin): Ditto. + (html_text::issue_table_end): Ditto. + (html_text::push_para): Better table handling. + (html_text::do_indent): New function. + (html_text::do_table): Ditto. + (html_text::done_table): Ditto. + (html_text::do_tt): Handle PRE_TAG. + (html_text::is_in_table): New function. + (html_text::check_emit_text): Handle tables. + (html_text::do_emittext): Use `nl()'. + (html_text::do_para): Handle table. + (html_text::remove_def): New function. + * src/devices/grohtml/output.cc (word, word_list): Implement + methods. + (simple_output::end_line): Flush last word. + (simple_output::simple_comment): Ditto. + (simple_output::begin_comment): Recoded. + (simple_output::end_comment): Ditto. + (simple_output::comment_arg): Removed. + (simple_output::check_newline): Improve test and flush last word. + (simple_output::space_or_newline): Improved. + (simple_output::write_newline): Replaced with... + (simple_output::nl): This. + (simple_output::put_raw_char): Flush last word. + (simple_output::check_space): Removed. + (simple_output::put_translated_string): Ditto. + (simple_output::put_string): Simplified. + (simple_output::put_number): Updated. + (simple_output::put_float): Ditto. + (simple_output::put_symbol): Removed. + (simple_output::enable_newlines): Add `check_newline()'. + (simple_output::flush_last_word): New function. + + * src/roff/troff/enc.cc (no_fill): Remove call to add_html_tag(). + * src/roff/troff/div.cc (page_offset): Add call to add_html_tag(). + + * tmac/s.tmac (@PP, @IP): Add html conditional code. + * tmac/an-old.tmac (TP): Ditto. + +2001-03-09 Ruslan Ermilov + + * mdate.sh: Make it POSIX compliant. + +2001-03-09 Werner LEMBERG + + Added the `return' request to end a macro immediately. It simply + pops iterators from the input stack until a macro iterator is found. + + * src/roff/troff/input.cc (input_iterator::is_macro, + macro_iterator::is_macro): New member. + (input_return_boundary): New class to signal an immediate return + to while_request(). + (input_stack::add_return_boundary, input_stack::is_return_boundary): + New functions. + (input_stack::clear): Use it. + (input_stack::pop_macro): New function. + (while_request): Use `is_return_boundary()'. + (return_macro_request): New function. + (init_input_requests): Use it. + + * src/roff/troff/TODO: Updated. + * NEWS, src/roff/troff/troff.man, man/groff.man: Document it. + +2001-03-08 Werner LEMBERG + + * src/roff/troff/input.cc (input_iterator::is_boundary): Minor + cleanup. + +2001-03-07 Werner LEMBERG + + Make `\B' more rigid. + + * src/roff/troff/number.cc (parse_expr, parse_term): Add `rigid' + parameter. + (get_number_rigidly): New function. + * src/roff/troff/input.cc (do_expr_test): Use it. + * src/roff/troff/token.h: Updated. + + * src/roff/troff/request.h: Fix typo (init_html_request -> + init_markup_request). + +2001-03-04 Gaius Mulley + + Fixed grohtml handling of any named glyph for glyph indexes < 0x80. + Cosmetic changes to `.html-begin', `.html-end', `.html-image' which + are now `.begin', `.end', `.image'. + + * src/devices/grohtml/post-html.cc: Adding UNICODE_DESC_START. + (html_printer::add_to_sbuf): Changing type of `code' parameter. + Use add_char_to_sbuf(). + (to_unicode): New function. + (char_translate_to_html): Changing type of `ch' parameter. + Use `to_unicode()'. + (html_printer::~html_printer): Comment out doctype string. + * src/preproc/html/pre-html.cc (write_end_image): Use `.end' + instead of `.html-end'. + (write_start_image): Use `.begin' and `.image' instead of + `.html-begin' and `.html-image'. + * src/roff/troff/input.cc: Rename `html_level' to `begin_level'. + (html_begin): Renamed to ... + (begin): This. + (html_end): Renamed to ... + (end): This. + (html_image): Renamed to ... + (image): This. + (init_html_requests): Renamed to ... + (init_markup_requests): This. + * tmac/www.tmac: Updated. + +2001-02-28 Bram + + * src/libs/libgroff/font.cc (font_widths_cache): Fixing syntax of + constructor. + +2001-02-26 David Leonard + + * doc/meref.me: Fixing some typos. + +2001-02-16 Werner LEMBERG + + * src/roff/troff/node.cc (space_node::get_hyphenation_type): New + method. Return `HYPHEN_MIDDLE' if it was `\:'. + * src/roff/troff/node.h: Updated. + +2001-02-17 Ruslan Ermilov + + * tmac/groff_tmac.man: Fix typo. + +2001-02-16 Werner LEMBERG + + Fixing a bug which prevented proper end-of-sentence recognition + between an `unformatted' box and the following text. As a + consequence, vertical line distances are no longer preserved in + boxes after a call to `.unformat' -- because boxes aren't + line-oriented (contrary to diversions), this doesn't make sense + anyway. + + * src/roff/troff/node.cc (*node::set_unformat_flag): Add return + value. + (vertical_size_node::set_unformat_flag): New method. + * src/roff/troff/node.hh: Updated. + * src/roff/troff/input.cc (word_space_node::reread, + hmotion_node::reread): Reset `unformat' flag after usage. + (unformat_macro): Append only if `set_unformat_flag()' returns + non-zero. + * src/roff/troff/troff.man: Updated. + +2001-02-15 Werner LEMBERG + + * src/roff/troff/troff.man, NEWS, man/groff.man: Improved + documentation of `asciify' and `unformat' requests. + +2001-02-13 Werner LEMBERG + + Redesigned the `unformat' request. It is no longer connected with + `asciify' but rather uses new `reread()' methods if the `unformat' + flag is set. Additionally, the handling of space characters after + unformatting has been fixed so that they retain their width. + + * src/roff/troff/node.h (width_list): New structure to store + original widths of spaces. + (node): Added `unformat' member. + Replaced `num_spaces' variable with `orig_width' list. + * src/roff/troff/node.cc (*node::asciify, + asciify_reverse_node_list): Removed `unformat_only' flag and related + code. + (word_space_node::asciify, word_space_node::word_space_node): Use + `orig_width'. + (word_space_node::~word_space_node): New destructor. + (word_space_node::copy): Updated to handle `orig_width'. + (hmotion_node::copy, unbreakable_space_node::copy): Updated. + (*node::merge_space): Update `orig_width' list if necessary. + (*node::set_unformat_flag): New methods to set the `unformat' flag. + * src/roff/troff/enc.cc (environment::space_newline): Use + `width_list'. + (environment::space): Added method to handle space width and + sentence space width as parameters. Use `width_list'. + (environment::make_tab_node): Updated. + * src/roff/troff/env.h: Updated. + * src/roff/troff/input.cc (word_space_node::reread, + unbreakable_space_node::reread, hmotion_node::reread): New methods + to handle nodes specially if `unformat' flag is set. + (do_asciify_macro): Renamed back to ... + (asciify_macro): This. + (unformat_macro): New implementation to simply set the `unformat' + flag. + + * MORE.STUFF: Added more info about deroff. + +2001-02-08 Werner LEMBERG + + * src/roff/troff/node.h (unbreakable_space_node, hmotion_node, + space_char_hmotion_node, overstrike_node): Add `get_hyphen_list()' + and `add_self()' methods to avoid hyphenation. For example, the + hyphen list for `foo\0\0bar' was `foobar', causing insertion of a + soft hyphen after `foo'. Now the hyphen list is correctly + `foobar'. + +2001-02-05 Yoshiteru Kageyama + + * tmac/groff_tmac.man: Fix `BIR' macro. + +2001-02-04 Werner LEMBERG + + A new escape sequence `\:', inserting a zero-width break point. + + * src/roff/troff/input.h: Adding `ESCAPE_COLON'. + * src/roff/troff/input.cc (get_copy, token::next, asciify): + Implement it. + * src/roff/troff/node.h (node): Add `is_escape_colon()' virtual + method. + (space_node): Add `was_escape_colon' member. Add `is_escape_colon()' + and `asciify()' methods. + * src/roff/troff/node.cc (space_node::space_node): Updated. + (space_node::asciify): Handle `was_escape_colon'. + * NEWS, src/roff/troff/troff.man, man/groff.man: Document it. + + Handle `\~' similar to other comparable requests. + + * src/roff/troff/input.cc (process_input_stack): Remove now obsolete + label. + (token::next): Move creation of an unbreakable_space_node to... + (token::add_to_node_list): Here. + + Fix a bug which sometimes prevented hyphenation of words connected + with `\~' or `\ ' (and other escape sequences handled as + TOKEN_NODE). This also fixes a hyphenation problem with boxes + (after a call to the `unformat' request). + + * src/roff/troff/env.h (environment::possibly_break_line, + environment::hyphenate_line): Introducing `start_here' parameter. + * src/roff/troff/env.cc (environment::space_newline, + environment::space): Use it. + (environment::possibly_break_line, environment::hyphenate_line): + Implement it. + * src/roff/troff/input.cc (process_input_stack): Use it. + * src/roff/troff/node.h (unbreakable_space_node, hmotion_node, + space_char_hmotion_node, overstrike_node): Add + `get_hyphenation_type()' method. + * src/roff/troff/node.cc (break_char_node::asciify): Don't asciify + if `unformat_only' is active. + +2001-01-30 Werner LEMBERG + + Implemented new read-only number register `.linetabs' which + returns 1 if in line-tabs mode, 0 otherwise. + + * src/roff/troff/env.h (environment): Add get_line_tabs() member. + * src/roff/troff/env.cc (get_line_tabs): New function. + (init_env_requests): Use it. + * NEWS, src/roff/troff/troff.man, man/groff.man: Document it. + + * VERSION, REVISION: Changing to 1.17.0. + +2001-01-28 Werner LEMBERG + + Fixed a bug which prevented hyphenation of words which are finished + with `\)'. + + * src/roff/troff/token.h (token): Add enum type + `TOKEN_TRANSPARENT_DUMMY' and method `transparent_dummy()'. + * src/roff/troff/input.cc (token::next, token::description, + get_line_arg, token::add_to_node_list, token::process): Use it. + +2001-01-27 Werner LEMBERG + + * src/roff/troff/div.h (diversion): Add `saved_prev_line_interrupted'. + * src/roff/troff/div.cc (do_divert): Use it. + + * src/roff/troff/input.cc (asciify): Add ESCAPE_RIGHT_PARENTHESIS. + +2001-01-25 Werner LEMBERG + + Adding the `linetabs' request. If set, tab distances are not + computed relative to the input line but relative to the output line. + + * src/roff/troff/env.h (environment): New member `line_tabs'. + * src/roff/troff/env.cc (line_tabs_request): Implement request. + (environment::environment, environment::copy): Updated. + (environment::distance_to_next_tab): Use `line_tabs'. + (init_env_requests): Register request. + * src/roff/troff/troff.man, man/groff.man, NEWS: Document it. Other + fixes. + +2001-01-24 Werner LEMBERG + + Introducing a new read-only register `.int' which is set to a + positive value if the last output line is interrupted (i.e., if it + contains `\c'). + + * src/roff/troff/env.cc (init_env_requests): Add it. + * NEWS, src/roff/troff/troff.man, man/groff.man: Document it. + +2001-01-23 Gaius Mulley + + * tmac/mwww.tmac: Call `www.tmac', not `arkup.tmac'. + * src/preproc/html/pre-html.cc (findPrefix): New function which + generates the troff executable name via the system prefix. + * src/preproc/eqn/main.cc: Modified warning message. + +2001-01-23 Werner LEMBERG + + troff's `box' and `boxa' requests didn't preserve temporary + indentation. + + * src/roff/troff/div.h (diversion): Add `saved_saved_indent' and + `saved_target_text_length' members. + * src/roff/troff/div.cc (do_divert): Use them. + + Tabs (but not yet leaders and fields) are now handled correctly by + `asciify' request. + + * node.h (hmotion_node): Add field `was_tab'. + * env.cc (environment::make_tab_node): Set it. + * node.cc (hmotion_node::copy, hmotion_node::asciify): Use it. + + Added new request `unformat' which will, contrary to `asciify', + preserve font information after unformatting (i.e., only nodes + dealing with horizontal space are converted back to input + characters). + + * input.cc (asciify_macro): Renamed to ... + (do_asciify_macro): this, having a new parameter `unformat_only'. + (asciify_macro, unformat_macro): New; using do_asciify_macro. + (init_input_requests): Added `unformat'. + * node.cc (*_node::asciify), asciify_reverse_node_list: Added + parameter to control asciification process. + * node.h (*_node::asciify): Ditto. + * NEWS, src/roff/troff/troff.man, man/groff.man: Document it. + +2001-01-20 Werner LEMBERG + + * doc/groff.texinfo: Minor improvement of `.in' documentation. + +2001-01-18 Werner LEMBERG + + * tmac/ps.tmac: Remove call of psold.tmac. + * tmac/psold.tmac: Comment updated. + * tmac/psnew.tmac: Removed since no longer needed. + * tmac/Makefile.sub, NEWS, src/devices/grops/grops.man: Updated. + + * font/devutf8/R.proto: Adding `shc' glyph. + * font/devutf8/NOTES: Updated. + + * test-groff: Updated. + +2001-01-15 Gaius Mulley + + First cut of the new html device driver. Changes to pre-html and + the new grohtml are too numerous to be documented here. + + Stuff related to `html' has been renamed to `html-old' and `html2' + stuff has been renamed to `html' (including directories). The new + html device driver is therefore invoked as `-Thtml'. + + Added new `\O' escape to suppress output (needed by html driver). + + Added functions and code to pass info about input-level commands + (`.in', `.fl', etc.) to html driver. + + Three new functions (.html-begin, .html-end, and .html-image) for + better html handling: `html-begin' will execute the remaining line + if at the outermost nesting level, increasing an internal counter. + `html-end' does the same but decreases the internal counter. + `html_image' puts its arguments into a special node (suppress_node) + to define an image region. + + The `output' request has been removed. + + * tmac/html-tags.tmac: Removed. + * tmac/arkup.tmac: Updated and renamed to ... + * tmac/www.tmac: New file. + * tmac/markup.tmac Updated and renamed to ... + * tmac/mwww.tmac: New file. + * tmac/Makefile.sub: Updated. + * tmac/an-old.tmac: Updated. + * tmac/eqnrc: Updated. + * tmac/groff_man.man + * tmac/groff_markup.man: Updated and renamed to ... + * tmac/groff_mwww.man: New file. + * tmac/groff_tmac.man: Updated. + * tmac/html-old.tmac: Updated and Renamed from html.tmac. + * tmac/html.tmac: Updated and renamed from html2.tmac. + * tmac/pspic.tmac: Updated html support. + * tmac/s.tmac: Added html output support. + * tmac/troffrc, tmac/troffrc-end: Updated. + + * Makefile.in, doc/Makefile: Updated. + * doc/groff.texinfo: Added info about new `\O' escape. + * doc/homepage.ms: Use `MAILTO' macro. + + * font/devhtml/DESC.proto: Add `C' font. + * font/devhtml/Makefile.sub: Updated. + * font/devhtml/R.proto: Minor fixes. + * font/devhtml-old/Makefile.sub: Updated. + + * src/devices/grohtml-old/Makefile.sub: Updated. + + * src/libs/libdriver/printer.cc (printer::get_font_from_index): New + method. + * src/libs/libgroff/htmlindicate.cc (html_begin_suppress, + graphic_start): Add `inline' parameter. Update. + (html_end_suppress, graphic_end): Update. + + * src/include/html-strings.h: New file. + * src/include/htmlindicate.h: Comments updated. + * src/include/printer.h: Updated. + + * src/preproc/eqn/main.cc (do_file, main): Updated. + * src/preproc/pic/troff.cc (troff_output::start_picture, + troff_output::finish_picture): Updated. + * src/preproc/tbl/main.cc (process_input_file): Updated. + + * src/roff/groff/groff.cc (main): Updated. + Pass device arguments to predrivers also. + Use `ps' device for `eqn' preprocessor if `-Thtml' is given. + * src/roff/troff/env.h (environment): Updated. + New elements `need_eol' and `ignore_next_eol' (for html output). + * src/roff/troff/env.cc (environment::environment): Add initializers + for `need_eol' and `ignore_next_eol'. + (environment::add_html_tag_eol, environment::add_html_tag_tabs): New + functions. + (point_size, fill, no_fill, center, right_justify, line_length, + indent, temporary_indent, break_request, handle_tab): Use + `add_html_tag()'. + (set_tabs): Use `add_html_tag_tabs()'. + (environment::add_html_tag): Updated. + (environment::do_break): Updated. + * src/roff/troff/div.cc (space_request, flush_output): Use + `environment::add_html_tag()'. + * src/roff/troff/input.cc: Updated. + New variable `html_level' to indicate nested `html-begin' requests. + (file_iterator::fill): Use `environment::add_html_tag_eol()'. + (non_interpreted_char_node, token_node, non_interpreted_node): Add + `force_tprint()' method. + (token::next): Handle `\O'. + (do_suppress): Implement it. + (html_begin, html_end, html_image): New functions. + (init_output_requests): Renamed to ... + (init_html_requests): this. + (main): Use it. + (macro::append_str, macro::append_unsigned, macro::append_int): New + methods. + New variable `output_low_mark_miny' to limit minimal value of y. + (reset_output_registers): Use it. + (output_request): Removed. + (get_output_registers): New function. + * src/roff/troff/node.h (node): Make `force_tprint()' virtual. + (*_node): Added `force_tprint()' if necessary. + (special_node): New elements `tf' and `get_tfont()'. + (suppress_node): New class. + * src/roff/troff/node.cc: + New global variables `image_no' and `suppress_start_page'. + (real_output_file): New method `is_on()'. + (troff_output_file): New method `start_special(tfont)'. + (troff_output_file::really_print_line): Use `tprint' conditionally. + (real_output_file::print_line): Updated. + (real_output_file::on): Updated. + (*_node): Added `force_tprint()'. + (special_node::special_node): Initializer updated. + (special_node::same, special_node::copy, special_node::tprint_start): + Updated. + (get_reg_int, get_reg_str): New functions. + (suppress_node::*): New methods. + New global variables last_position, last_image_filename; + (min): New inline function. + * src/roff/troff/reg.h, src/roff/troff/request.h, + src/roff/troff/troff.h: Updated. + +2001-01-13 Werner LEMBERG + + * NEWS, src/roff/troff/troff.man, doc/groff.texinfo: Fix + documentation of `asciify' request. + +2001-01-12 Werner LEMBERG + + * src/roff/troff/input.cc: Move definition of special characters + like `ESCAPE_TILDE' to ... + * src/roff/troff/input.h: New file. + * src/roff/troff/Makefile.sub (HDRS): Add it. + + Extending the .asciify request to `unformat' space characters also. + + * src/roff/troff/node.h (word_space_node): Add `num_spaces' element + to count input space characters. + Update constructors to take care of it. + * src/roff/troff/node.cc (space_char_hmotion_node::asciify): Use + `ESCAPE_SPACE' instead of normal space. + (word_space_node::asciify): New method. + (unbreakable_space_node::asciify): New method. + (word_space_node::merge_space): New method. + * src/roff/troff/env.cc (environment::space_newline, + environment::space): Add code to initialize `num_spaces' (using the + constructor of `word_space_node'). + * NEWS, src/roff/troff/troff.man, man/groff.man, doc/groff.texinfo: + Document it. + +2001-01-09 Werner LEMBERG + + * man/groff_char.man: Use table header traps only conditionally. + +2001-01-09 Bjarni Ingi Gíslason + + * man/groff_char.man: Add `ý' and `Ý' to the `acute' group. + +2001-01-08 Werner LEMBERG + + Introducing the `box' and `boxa' requests which are similar to + `di' resp. `da' but omitting a partially filled line (which is + restored after ending the diversion). + + * src/roff/troff/div.h (diversion): Add elements to save partially + filled line. + * src/roff/troff/div.cc (do_divert): Add parameter `boxing' to save + partially filled line. + (divert, divert_append): Updated. + (box, box_append): New functions. + (init_div_requests): Use them. + * src/roff/troff/env.h (environment): do_divert() is now a friend. + * NEWS, src/roff/troff/troff.man, man/groff.man: Document it. + + * doc/groff.texinfo: Fix documentation of `lf' request. + +2000-12-25 Werner LEMBERG + + * src/roff/troff/troff.man, NEWS: Document `writem' request. + +2000-12-21 Werner LEMBERG + + Ignore `ss' request if in compatibility mode. + + * src/roff/troff/input.cc: Make `compatible_flag' non-static. + * src/roff/troff/env.h: Added extern `compatible_flag' declaration. + * src/roff/troff/env.cc (space_size): Use it. + + * doc/groff.texinfo, src/roff/troff/troff.man: Fix documentation of + `ss' request in nroff mode. + + * tmac/an-old.tmac: Fixed some serious bugs introduced with latest + changes. + +2000-12-15 Ruslan Ermilov + + * tmac/troffrc, tmac/troffrc-end: Convert tmac.* to *.tmac. + +2000-12-13 Werner LEMBERG + + * src/preproc/eqn/Makefile.sub (MAN1): Added neqn.man. + * src/preproc/eqn/neqn.man: Small fixes and additions. + +2000-12-13 Ruslan Ermilov + + * src/utils/addftinfo/addftinfo.man, src/devices/grops/grops.man: + Fixing typo. + + * src/preproc/eqn/neqn.man: New file. + + * src/preproc/tbl/table.cc (table::print): Fix `indent cannot be + negative' warning. + + * tmac/e.tmac: Add `T&' macro. + Fix `indent cannot be negative' warning. + * tmac/s.tmac: Fix `indent cannot be negative' warning. + +2000-12-07 Werner LEMBERG + + * src/include/lib.h: Replaced __ALPHA with __alpha symbol. + +2000-12-06 Werner LEMBERG + + * PROBLEMS: Added info about adding -lPW on HP-UX to satisfy the + `alloca' symbol . + + * MORE.STUFF: Added info about deroff for djgpp. + + * tmac/an-old.tmac, tmac/groff_man.man, doc/groff.texinfo, NEWS: Fix + documentation of -rcR switch. + +2000-12-03 Werner LEMBERG + + * tmac/an-old.tmac: Implementing the -rcR switch (similar to mdoc); + if -rcR=1 (which is now the default in nroff mode), a single, very + long page is created instead of multiple pages: All `ne' and `wh' + requests are put into conditionals; a new macro `an-end' is added to + be called with `em'. + + Some other minor cleanups. + + * NEWS, tmac/groff_man.man, doc/groff.texinfo: Updated. + +2000-12-02 Werner LEMBERG + + Fixing a bug which prevented hyphenation in words followed + immediately by a TOKEN_NODE (e.g. `\ ', `\~', etc.). + + * src/roff/troff/input.cc (process_input_stack ): + Adding possibly_break_line(). + * src/roff/troff/env.h (environment): Make possibly_break_line() + public. + + Make `\~' usable in .tr request. + + * src/roff/troff/token.h (token_type): Add TOKEN_STRETCHABLE_SPACE. + (token): Add stretchable_space(). + * src/roff/troff/input.cc (token::next, token::delimiter, + token::description, process_input_stack, do_translate, + add_to_node_list, token::process): Use it. + * src/roff/troff/node.h (node): Add fourth parameter to add_char() + for adjusting the space. + * src/roff/troff/node.cc (node::add_char): Implement it. Add code + for stretchable space. + * src/roff/troff/input.cc (token::add_to_node_list): Use it. + (make_node): Add code for stretchable space. + * src/roff/troff/env.cc (environment::add_char): Use it. + * src/roff/troff/input.cc: Add ESCAPE_TILDE special character. + (get_copy, token::next, transparent_translate, asciify): Use it. + + * NEWS, src/roff/troff/troff.man, src/roff/troff/TODO, + doc/groff.texinfo: Updated. + * man/groff.man: Small reorderings. + +2000-11-23 Werner LEMBERG + + * NEWS: Fixes. + * src/preproc/eqn/main.cc (main): Use `config_macro_path' for -M + option. + * src/roff/troff/input.cc (main): Add `config_macro_path' and + `safer_macro_path' to -M option. + * src/roff/troff/troff.man: Fixes. + +2000-11-22 Werner LEMBERG + + Use safer path (except for config files) if -U isn't specified. Add + a special macro path (without home and current directory) for config + files. Add home directory to unsafe path for consistency. Don't + include the home directory in the font path. + + * src/libs/libgroff/macropath.cc: Add `config_macro_path', change + `macro_path'. + * src/include/macropath.h: Add `config_macrp_path'. + * src/libs/libgroff/fontfile.cc: Fix font path. + * src/roff/troff/input.cc (process_startup_file): Use + `config_macro_path'. + (main): Select unsafe path if -U is given. + + * src/preproc/eqn/main.cc (main): Fixing search path for + configuration file. + * src/preproc/eqn/eqn.man: Updated. + + * src/roff/troff/troff.man, man/roff.man, tmac/groff_tmac.man: + Updated. + + * src/preproc/grn/grn.man, src/devices/grodvi/grodvi.man, + src/devices/grohtml/grohtml.man, src/devices/grolbp/grplbp.man, + src/devices/grolj4/grolj4.man, src/devices/grops/grops.man, + src/devices/grotty/grotty.man: Updated. + + * Makefile.in: Fix comments. + +2000-11-17 Werner LEMBERG + + * tmac/safer.tmac: Empty file added (again) for compatibility + reasons. + * tmac/Makefile.sub: Updated. + +2000-11-16 Werner LEMBERG + + * src/devices/grodvi/dvi.cc (main), + src/devices/grohtml2/post-html.cc (main), + src/devices/grolbp/lbp.cc (main), src/devices/grolj4/lj4.cc + (main), src/devices/grops/ps.cc (main), src/devices/grotty/tty.cc + (main), src/preproc/eqn/main.cc (main), src/preproc/grn/main.cc + (main), src/preproc/html2/pre-html.cc (main), + src/preproc/pic/main.cc (main), src/preproc/refer/refer.cc (main), + src/preproc/soelim/soelim.cc (main), src/preproc/tbl/main.cc + (main), src/roff/groff/groff.cc (main), src/roff/troff/input.cc + (main), src/utils/hpftodit/hpftodit.cc (main), + src/utils/indxbib/indxbib.cc (main), src/utils/lkbib/lkbib.cc + (main), src/utils/lookbib/lookbib.cc (main), + src/utils/pfbtops/pfbtops.c (main), src/utils/tfmtodit/tfmtodit.cc + (main): Use stdout for -v. + * src/roff/groff/groff.cc (run_commands), + src/roff/groff/pipeline.c (run_pipeline): New parameter `no_pipe' + to make direct printing to stdout possible. + * src/roff/groff/pipeline.h: Updated. + + * src/utils/afmtodit/afmtodit.pl: Add -v switch. + * src/utils/afmtodit/Makefile.sub (afmtodit): Use @VERSION@. + * src/utils/afmtodit/afmtodit.man: Updated. + + * src/utils/addftinfo/addftinfo.cc (main): Add -v switch. + (version): New function. + (usage): Updated. + * src/utils/addftinfo/addftinfo.man: Updated. + + * src/devices/*/*, src/preproc/*/*, src/roff/*/*, src/utils/*/*: + Fixing copyright dates. + + * src/preproc/eqn/neqn.sh: Adding GROFF_BIN_PATH to path instead of + replacing it. + + * src/devices/grolbp/lbp.cc (main): Use Version_string instead of + version_string. + + * src/roff/nroff/Makefile.sub (nroff): Fix use of @VERSION@. + +2000-11-15 Werner LEMBERG + + In all programs, make -v return immediately with exit status 0 to + be compliant with the GNU standard. + + * src/devices/grodvi/dvi.cc (main), + src/devices/grohtml2/post-html.cc (main), + src/devices/grolbp/lbp.cc (main), src/devices/grolj4/lj4.cc + (main), src/devices/grops/ps.cc (main), src/devices/grotty/tty.cc + (main) src/preproc/eqn/main.cc (main), src/preproc/grn/main.cc + (main), src/preproc/html2/pre-html.cc (main), + src/preproc/pic/main.cc (main), src/preproc/refer/refer.cc (main), + src/preproc/soelim/soelim.cc (main), src/preproc/tbl/main.cc + (main), src/roff/groff/groff.cc (main), src/roff/troff/input.cc + (main): Implement it. + * NEWS: Updated. + + * src/roff/groff/groff.cc (main): Add copyright notice. Add refer + and postprocessors to the -v option. + + * src/roff/grog/grog.pl: Implement -v. + * src/roff/grog/Makefile.sub (grog): Use @VERSION@. + * src/roff/grog/grog.man, doc/groff.texinfo: Updated. + + * src/roff/nroff/nroff.sh: Implement -v. + * src/roff/nroff/Makefile.sub (nroff): Use @VERSION@. + * src/roff/nroff/nroff.man: Updated. + + * src/preproc/eqn/main.cc (main): Fix comment typo. + + * MORE.STUFF: Added info about djgpp port of grap. + +2000-11-14 Werner LEMBERG + + * src/roff/grog/grog.{pl,sh}: Implemented -C switch for compatibility + mode (or rather, implemented non-compatibility mode). + * NEWS, src/roff/grog/grog.man, doc/groff.texinfo: Updated. + + * src/roff/groff/groff.cc (main): Add BIN_PATH to PATH instead of + replacing it -- we don't find gxditview otherwise. + * NEWS, src/roff/groff/groff.man, doc/groff.texinfo: Updated. + + * src/preproc/pic/depend: Removed. Unnecessary. + + Implemented dummy keyword `solid' in pic for compatibility with + AT&T pic. + + * lex.cc (lookup_keyword): Added `solid'. + * pic.y: Added SOLID with dummy rule. + * pic.cc, pic_tab.h: Regenerated. + * doc/pic.ms: Updated. + +2000-11-13 Werner LEMBERG + + For security reasons, don't use the current directory but the home + directory while searching and scanning troffrc and troffrc-end. + Similarly, replace the current directory with the home directory + in the font path. + + * Makefile.in (fontpath, tmacpath): Remove current directory. + + * src/libs/libgroff/searchpath.cc (search_path::search_path): Add + two parameters `add_home' and `add_current'. + (search_path::~search_path, search_path::command_line_dir, + search_path::open_file): Remove tests for `dirs' being zero. + * src/include/searchpath.h: Adjust. + * src/libs/libgroff/macropath.cc, src/include/macropath.h: Add + `safer_macro_path'. + * src/libs/libgroff/fontfile.cc: Adjust `font_path'. + + * src/roff/troff/troff.h: Add `searchpath.h' and `mac_path'. + * src/roff/troff/input.cc: Use `mac_path', initialized with + `macro_path'. + (process_startup_file): Set `mac_path' to `safer_macro_path'. + * src/roff/troff/env.cc: Use `mac_path'. + + * src/preproc/eqn/main.cc (main): Use `safer_macro_path'. + + * NEWS, man/roff.man, src/roff/troff/troff.man, + src/roff/groff/groff.man, tmac/groff_tmac.man, arch/djgpp/README: + Updated. + +2000-11-12 Werner LEMBERG + + * src/include/lib.h: Don't include groff-getopt.h for OSF/1. + + * aclocal.m4 (GROFF_SYS_ERRLIST): Do test in C, not in C++. + * configure.in: Fix typo in comment. + * configure: Regenerated. + + * src/libs/libgroff/*, src/include/*, src/roff/troff/*: Fixing + copyright dates. + +2000-11-08 Werner LEMBERG + + Add system tmac directory (/usr/local/lib/groff/site-tmac). + + * Makefile.in: Add $(libdir), $(libprogramdir), and $(systemtmacdir). + (uninstall_dirs): Add $(libdir), $(libprogramdir), and + $(systemtmacdir). + Use @libdir@. + * Makefile.comm (.man.n): Add @SYSTEMMACRODIR@. + * tmac/Makefile.sub (install_data): Create + $(systemtmacdir) and $(localtmacdir). + (uninstall_sub): Use $(systemtmacdir) for wrapper macros. + * man/roff.man, src/roff/troff/troff.man, src/roff/groff/groff.man, + NEWS, doc/groff.texinfo: Updated and minor fixes. + + * Makefile.comm, Makefile.in: Added tmac_{s,an}_prefix stuff again. + * tmac/Makefile.sub: Added `wrap' stuff again, but installing into + $(systemtmacdir) since the wrapper files are platform-dependent. + +2000-11-01 Werner LEMBERG + + * doc/groff.texinfo: Fix typo. + +2000-10-26 Werner LEMBERG + + Convert macros `tmac.XXX' to `XXX.tmac'. Special cases: + tmac.doc.old -> doc-old.tmac + tmac.an.old -> an-old.tmac + + * tmac/tmac.*: Moved to ... + * tmac/*.tmac: this. + * tmac/man.local: Fix comment. + * tmac/groff_man.man, tmac/groff_markup.man, tmac/groff_mdoc.man, + tmac/groff_me.man, tmac/groff_ms.man, tmac/groff_tmac.man: Updated. + Added some `FILES' sections. More use of @...@ directives. Other + minor updates. + * arch/djgpp/README, font/devutf8/NOTES: Updated. + * doc/homepage.ms, doc/groff.texinfo: Updated. + * man/groff.man, man/roff.man: Updated. + * src/devices/grodvi/grodvi.man, src/devices/grolbp/grolbp.man, + src/devices/grolj4/grolj4.man, src/devices/grops/grops.man, + src/devices/grotty/grotty.man: Updated. + * src/preproc/pic/pic.man: Updated. + * src/roff/grog/grog.pl, src/roff/grog/grog.sh: Use -mdoc-old + instead of -mdoc.old. + * src/roff/grog/grog.man: Document -mdoc and -mdoc-old. + * src/roff/nroff/nroff.man: Updated. + * NEWS: Updated. + + * tmac/fixmacros.sed, tmac/strip.sed: Add explanatory comment. + + * tmac/mm.diff: Removed -- it has no use now since the mm package + is part of groff. + + * tmac/*: Removed trailing spaces. + + * arch/djgpp/t-groff.bat: Fix GROFF_TMAC_PATH (hyphen.us is now in + the tmac subdirectory also). + + * Makefile.comm, Makefile.in: Remove tmac_{s,an}_prefix stuff. + * tmac/Makefile.sub: Adapted to new macro names; removed `wrap' + stuff since it is no longer needed. + + * README, PROBLEMS: Updated. + +2000-10-25 Werner LEMBERG + + Invert current behaviour: Search first FOOBAR.tmac, then + tmac.FOOBAR. + + * src/roff/troff/input.cc: Introduce MACRO_POSTFIX. + (open_mac_file, macro_source): Implement it. + * src/roff/troff/troff.man, tmac/groff_tmac.man, man/roff.man, + doc/groff.texinfo, NEWS: Document it. + + * src/roff/nroff/nroff.man, src/roff/groff/groff.man, man/groff.man: + Small documentation improvements. + + * test-groff: Fix GROFF_TMAC_PATH (hyphen.us is now in the tmac + subdirectory also). + + * font/devps/Makefile.sub: Fix rules for dingbats.*map. + +2000-10-24 Werner LEMBERG + + Add local tmac directory (groff/site-tmac). + + * Makefile.in: Add $(localtmacdir). + (uninstall_dirs): Add $(localtmacdir). + * Makefile.comm (.man.n): Add @LOCALMACRODIR@. + * tmac/Makefile.sub (install_data, uninstall_sub): Handle man.local + in $(localtmacdir). Create $(localtmacdir). + * man/roff.man, src/roff/troff/troff.man, NEWS, doc/groff.texinfo: + Updated and minor fixes. + + Rename font/devps/generate/dingbats[r]map to dingbats.[r]map. + + * font/devps/generate/Makefile.sub, arch/djgpp/README: Adjust. + +2000-10-23 Werner LEMBERG + + Move hyphen.us to tmac directory. + + * src/roff/troff/hyphen.us: Removed. + * src/tmac/hyphen.us: Added. + * src/roff/troff/Makefile.sub, tmac/Makefile.sub: Updated. + + Change installation structure for data files from .../groff/... to + .../groff//... to be conform with other GNU + programs. + + * Makefile.in, Makefile.comm, src/utils/indxbib/Makefile.sub, + doc/Makefile: Implement it. + * aclocal.m4 (GROFF_PAGE): Add test for new directory structure. + * configure: Updated. + * arch/djgpp/README, font/devutf8/NOTES: Use it. + * NEWS: Document it. + * man/roff.man, tmac/groff_tmac.man: Use @FONTPATH@, @FONTDIR@, and + @MACRODIR@ instead of hard-coded directories. + +2000-10-22 Werner LEMBERG + + Implement $GROFF_BIN_PATH environment variable (which defaults to + $bindir) used for child programs of groff and similar wrappers. + + * gendefs.sh: Improve documentation. + * Makefile.comm (,man.n), src/include/Makefile.sub (defs.h), + src/preproc/eqn/Makefile.sub (neqn), + src/roff/nroff/Makefile.sub (nroff): Add $(bindir). + * src/preproc/eqn/neqn.sh, src/roff/nroff/nroff.sh: Implement + $GROFF_BIN_PATH. + * src/roff/groff/groff.cc (main): Implement $GROFF_BIN_PATH and + $GROFF_PATH__ (the latter for communication with troff). + * src/roff/troff/input.cc (main): Use $GROFF_PATH__ for $PATH if + set. + * NEWS, src/roff/nroff/nroff.man, src/roff/groff/groff.man, + doc/groff.texinfo: Document it. + + * doc/groff.texinfo: Improve documentation of troff's -a option. + +2000-10-17 Gaius Mulley + + * src/roff/troff/node.cc: Fixed calculation of opminx and fixed + non-intrusive eol marker. + (troff_output_file::determine_line_limits): New function. + (troff_output_file::draw): Use it. + * src/roff/troff/env.cc (environment::add_html_tag): Use output() + + output_pending_lines() instead of output_line(). + * src/preproc/eqn/main.cc (do_file): Fix graphic_end(). + * src/preproc/html2/pre-html.cc (char_buffer::write_file_troff, + createImage): Small fixes. + +2000-10-14 Werner LEMBERG + + Replace tmac.safer with a real secure solution. + + * src/roff/troff/input.cc (open_request, opena_request, pipe_source, + system_request, pipe_output): Disable requests if in safer mode. + * src/roff/groff/groff.cc (main): Remove reference to tmac.safer. + * tmac/tmac.safer, tmac/groff_msafer.man: Removed. + * tmac/Makefile.sub, NEWS, man/roff.man, tmac/groff_tmac.man, + doc/groff.texinfo, src/roff/groff/groff.man, + src/roff/troff/troff.man, arch/djgpp/README: Updated. + + * src/devices/grops/ps.cc (main), src/devices/grops/psrm.cc + (resource_manager::output_prolog): Replace setenv() with putenv(). + +2000-10-09 Werner LEMBERG + + * src/libs/libbib/map.c, src/libs/libgroff/getcwd.c, + src/libs/libgroff/strtol.c, src/preproc/html2/image.cc, + src/preproc/html2/pre-html.cc, src/preproc/html2/pushbackbuffer.cc, + src/roff/groff/pipeline.c: Removing `#ifndef errno' to avoid + compilation errors with some compilers. It seems that this code + is no longer necessary -- if yes, it is easy to add some #ifdef's + for that particular old-fashioned compiler. + + * MORE.STUFF: Added info about Meta-tbl. + + * doc/groff.texinfo: Added more info about `.if "..."..."'. + +2000-10-07 Werner LEMBERG + + Adding a new escape sequence \B'...': If the string between + the delimiters is a valid numeric expression, return the character + `1', and `0' otherwise. This is an analogon to \A. + + * src/roff/troff/input.cc (do_expr_test): Implement it. + (token::next): Use it. + * src/roff/troff/troff.man, NEWS, man/groff.man: Document it. + + * tmac/tmac.trace: Made independent from escape character. + +2000-10-06 Werner LEMBERG + + Adding a new request .dei: define indirect. The first and second + parameter of .dei are taken from string registers instead directly; + this very special request is needed to make tmac.trace independent + from the escape character (which might even be disabled). + + * src/roff/troff/input.cc (do_define_macro): Implement it. + (define_macro_indirect): New function. + (init_input_requests): Use it. + + Adding two requests .ecs and .ecr: Save and restore the escape + character. These two requests are needed to make tmac.trace + independent from the escape character (which might even be + disabled). + + * src/roff/troff/input.cc (save_escape_char, restore_escape_char): + Implement it. + (init_input_requests): Use it. + + * src/roff/troff/troff.man, NEWS, man/groff.man: Updated. + +2000-09-22 Ricardo Soares Guimarães + + Adding a new option -P and new environment variable GROPS_PROLOGUE + to grops, selecting a different prologue file (minor modifications + by WL). + + * src/devices/grops/psrm.cc (resource_manager::output_prolog), + src/devices/grops/ps.cc (main): Implement it. + * src/devices/grops/grops.man, NEWS: Document it. + +2000-09-22 Werner LEMBERG + + * INSTALL: Add info about selecting paper format. + +2000-09-21 Werner LEMBERG + + * src/roff/troff/input.cc (main): Fixing compiler warning. + * src/include/{driver.h, lib.h}: Move inclusion of string.h and + strings.h from the former to the latter. + * src/devices/grolbp/lpb.cc, src/include/lib.h: Move strncasecmp() + stuff from the former to the latter. + +2000-09-11 Werner LEMBERG + + Implementing two new requests .tm1 and .tmc: The former is similar + to .tm but can output leading spaces; its syntax is similar to + defining a string, i.e., a `"' can be used to mark the beginning of + the string to be written to stderr: `.tm1 " test'. The latter is + similar to .tm1 but doesn't write out a final newline character. + + * src/roff/troff/input.cc (terminal1, terminal_continue, + do_terminal): New functions. + (init_input_requests): Use them. + * src/roff/troff/troff.man, NEWS, man/groff.man: Updated. + +2000-09-09 Werner LEMBERG + + * tmac/groff_mdoc.samples.man: Small fixes. + +2000-09-08 Werner LEMBERG + + * tmac/groff_mdoc.man: Fixing typo. + +2000-09-02 Werner LEMBERG + + Implementing a .nop request which does nothing. + + * src/roff/troff/input.cc (nop_request): New function. + (init_input_requests): Use it. + * src/roff/troff/troff.man, NEWS, man/groff.man: Updated. + +2000-09-01 Werner LEMBERG + + * doc/groff.texinfo: Added some comments. + +2000-08-30 Werner LEMBERG + + * src/roff/troff/TODO: Updated. + +2000-08-25 Werner LEMBERG + + * doc/groff.texinfo: Fix comment how to compile the DVI file. + +2000-08-25 Eli Zaretskii + + * font/devps/generate/Makefile (SHELL): Define explicitly to + "/bin/sh", for non-Unix platforms. + (extraclean): Use a more portable "" quoting instead of a + backslash (which doesn't work on DOS/Windows). + + * font/devlj4/generate/Makefile (extraclean): Ditto. + + * font/devdvi/generate/Makefile (extraclean): Ditto. + +2000-08-25 Werner LEMBERG + + * NEWS, doc/groff.texinfo, tmac/groff_tmac.man, man/roff.man, + src/roff/troff/troff.man: Document Eli's latest changes. + +2000-08-25 Eli Zaretskii + + * src/roff/troff/input.cc (open_mac_file, macro_source): Support + macro file names of the form NAME.tmac as well as tmac.NAME. + +2000-08-25 Werner LEMBERG + + * src/include/posix.h: Remove definition of FILENAME_MAX. + + * src/preproc/html2/pre-html.h, pre-html.cc: Add return type to + `sys_fatal' and `stop' function(). + + * test-groff: Updated. + +2000-08-24 Gaius Mulley + + Added the new troff command .output to suppress output (while + still obeying motion) and also the opminx, opminy, opmaxx, opmaxy + registers (for passing the output dimensions to the output device). + + * src/roff/troff/div.cc (top_level_diversion::output): Use `width' + parameter. + * src/roff/troff/node.h, src/roff/troff/node.cc + (troff_output_file::really_print_line, + ascii_output_file::really_print_line, + supress_output_file::really_print_line): Use `width' parameter. + (troff_output_file::really_on, troff_output_file::really_off, + output_file::on, output_file::off, real_output_file::on, + real_output_file::off, real_output_file::really_on, + real_output_file::really_off): New functions. + (real_output_file:public output_file): New variable `output_on'. + (real_output_file::begin_page, real_output_file::copy_file, + real_output_file::transparent_char, real_output_file::print_line): + Use it. + (real_output_file::print_line): Use check_output_limits. + * src/roff/troff/reg.h, src/roff/troff/request.h, + src/roff/troff/input.cc (assign_registers): New function to remove + two `goto's. + (do_ps_file): Use it. + (check_output_limits, reset_output_registers, output_request, + init_output_requests): New functions. + (init_input_requests): Updated. + + Added new grohtml2 device and html2 preprocessor (coding + not yet finished) which will eventually replace grohtml. + + * Makefile.in, tmac/Makefile.sub, tmac/eqnrc, tmac/troffrc-end: + Updated. + * src/include/htmlindicate.h, src/include/htmlindicate + (html_begin_suppress, html_end_suppress): New functions. + * src/preproc/tbl/main.cc: Use it. + * src/roff/groff/groff.cc: Add support for html2 device (which will + automatically invoke the html2 preprocessor). + * src/roff/troff/input.cc (is_html2): New variable. + * src/roff/troff/troff.h, src/roff/troff/env.h, + src/roff/troff/env.cc (environment::add_html_tag): New function + (uses `is_html2'). + (environment::do_break): Use it. + * font/devhtml2/*: New files. + * src/devices/grohtml2: New device. + * src/preproc/html2: New preprocessor. + * tmac/tmac.html-tags, tmac/tmac.html2: New files. + +2000-08-23 Werner LEMBERG + + * src/devices/grolbp/lbp.cc: Same workaround for sinix as for AIX. + +2000-08-22 Werner LEMBERG + + * src/include/lib.h: Provide a fix for IRIX to not include + groff-getopt.h. + +2000-08-18 Werner LEMBERG + + * configure.in: Don't provide an empty value for SH_SCRIPT_SED_CMD + since some non-GNU sed programs can't handle null regexps. + * configure, src/preproc/eqn/Makefile.sub, + src/roff/grog/Makefile.sub, src/roff/nroff/Makefile.sub: Updated. + + * src/devices/grolbp/lbp.cc: Add an AIX workaround for an autoconf + bug (string.h and strings.h are both needed according to latest + POSIX standard). + + * MORE.STUFF: Added info about unroff and troffcvt. + +2000-08-08 Werner LEMBERG + + * tmac/tmac.a4: Will now work with ms macros also; -ma4 should be + used before -ms. + + * tmac/tmac.man.old: Remove unused number register. + + * tmac.doc: Minor documentation fix. + +2000-08-07 Paul Eggert + + * src/roff/groff/pipeline.c (is_system_shell): + Fix typo: "monocased_shell" no longer exists. + +2000-08-07 Paul Eggert + + Remove FILENAME_MAX limits. + + * src/roff/groff/pipeline.c (is_system_shell): Do not assume + that the argument length is less than FILENAME_MAX. + * src/libs/libgroff/tmpfile.cc (add_tmp_file): Likewise. + Use struct hack to allocate and free file name. + (struct xtmpfile_list): fname is now part of the structure, + not a pointer to another string. + +2000-08-07 Tom Schmidt + + * src/include/posix.h: Add a default value for FILENAME_MAX. + +2000-08-06 Paul Eggert + + Add support for new BSD-style man pages (with ".Dd" instead of + ".TH"), so that "groff -man" understands both styles, even + when running "groff -man" on a host whose system man page + macros don't support ".Dd". + + * tmac/Makefile.sub (NORMALFILES): Add tmac.an.old. + (stamp-wrap): Source tmac.andoc first when wrapping man macros, + in case the system man macros don't define Dd or TH. + + * tmac/tmac.an.old: Renamed from tmac/tmac.an. + * tmac/tmac.an: New one-line file. + * tmac/tmac.andoc (TH): Adjust to the tmac.an.old file renaming. + +2000-08-06 Werner LEMBERG + + * src/roff/troff/troff.man: Fixing typos. + +Local Variables: +version-control: never +coding: latin-1 +End: diff -ruN groff-1.19.1/ChangeLog.118 groff-1.19.2/ChangeLog.118 --- groff-1.19.1/ChangeLog.118 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/ChangeLog.118 2005-06-28 18:10:27.000000000 +0200 @@ -0,0 +1,3794 @@ + +Version 1.18.1 released +======================= + +2002-10-08 Werner LEMBERG + + * doc/webpage.ms, NEWS: Updated. + +2002-10-07 Werner LEMBERG + + * tmac/doc-common (Ss): Add final `.ns' (similar to `.Sh') to + suppress additional whitespace after the header. + + * tmac/doc-ditroff, tmac/doc-nroff (Am): New string to be in sync + with NetBSD. + + * src/preproc/grn/grn.man, tmac/groff_mdoc.man, NEWS: Updated. + +2002-10-07 Ruslan Ermilov + + * tmac/doc-common(doc-volume-operating-system-ateol): New flag. + (Dt): Use it to improve language localization (especially Russian + and French). + +2002-10-07 Daniel Senderowicz + + * src/preproc/grn/gprint.h (BSPLINE, BEZIER): New macros. + * src/preproc/grn/hdb.cc (DBGetType): Parse spline and bezier + drawing commands. + * src/preproc/grn/hgraph.cc (drawwig): Add parameter to control + curve type. + Call `picurve' for BSPLINE. + (HGPrintElt): Handle BSPLINE. + * src/preproc/grn/README: Document it. + +2002-10-03 Werner LEMBERG + + * src/roff/troff/node.cc (break_char_node::col): New variable. + Updated constructor. + (space_node::tprint, word_space_node::tprint): Call `fill_color' + unconditionally. + (space_node::space_node): Remove assertion. + (break_char_node::add_self): Pass color argument to space node. + * src/roff/troff/input.cc (token::add_to_node_list, token::process): + Ditto. + * src/roff/troff/env.cc (environment::do_break, + environment::add_padding): Ditto. + +2002-10-02 Werner LEMBERG + + Redesigning color support in troff. Colors are no longer + represented as separate nodes but are now part of glyph nodes and + friends. This fixes the current formatting misbehaviour due to the + changes introduced on 2002-09-20. Some extra code is necessary for + proper grotty support: Without adding color variables to + space-related nodes, the background color would be changed too late. + + * src/roff/troff/node.h, src/roff/troff/node.cc: + s/current_pagecolor/current_fill_color/. + s/current_glyphcolor/current_glyph_color/. + (glyph_color_node, fill_color_node): Removed. + (node::get_glyph_color, node::get_fill_color): New virtual member + functions. + (space_node::col): New variable. + Updated constructors of space_node and derived classes accordingly. + (hmotion_node::col): New variable. + Updated constructors of hmotion_node and space_char_hmotion_node + accordingly. + (vmotion_node::col): New variable. + Updated constructor accordingly. + (draw_node::gcol, draw_node::fcol): New variables. + Updated constructor accordingly. + (special_node::gcol, special_node::fcol): New variables. + Updated constructors accordingly. + (troff_output_file::put_char, troff_output_file::put_charwidth, + troff_output_file::draw): Set glyph and fill color. + (troff_output_file::start_special): Set glyph and fill color. + Always set current font. + (troff_output_file::fill_color, troff_output_file::glyph_color): + Don't call `do_motion'. + (glyph_node::gcol, glyph_node::fcol): New variables. + Updated constructors of glyph_node and ligature_node accordingly. + (glyph_node::get_glyph_color, glyph_node::get_fill_color): New + member functions. + (glyph_node::merge_glyph_node, + kern_pair_node::add_discretionary_hyphen, + node::add_discretionary_hyphen): Updated. + (break_char_node::merge_self): Updated. + (word_space_node::tprint, space_node::tprint, hmotion_node::tprint, + vmotion_node::tprint): Handle color. + (make_glyph_node, make_node, node::add_char): Updated. + + * src/roff/troff/env.cc (environment::space_newline, + environment::space, environment::output_line, environment::do_break, + environment::make_tab_node, environment::add_padding, title): + Updated. + (environment_switch, environment_copy): Don't add color nodes. + + * src/roff/troff/input.cc (do_glyph_color, do_fill_color): Return + nothing. + (token::next): Updated. + \m and \M now are as transparent as \s. + (process_input_stack, token::add_to_node_list, token::process, + read_draw_node): Updated. + (charinfo_to_node_list): Don't add color nodes. + + * doc/groff.texinfo: Updated. + +2002-09-27 Ruslan Ermilov + + * tmac/doc-common (ds-operating-system-FreeBSD-4.*): New version + strings. + +2002-09-27 Colin Watson + + * src/roff/troff/node.cc (bracket_node::copy): Check `list' != 0. + +2002-09-23 Werner LEMBERG + + * src/devices/grolbp/lbp.cc: Replace `300' with `font::res' where + appropriate. + (DEFAULT_LINEWIDTH_FACTOR): New macro. + (linewidth_factor): New global variable. + (lbp_printer::set_line_thickness): Fix case for size < 0, using + linewidth_factor. + (long_options): Add -w/--linewidth option. + (usage): Updated. + (main): Handle -w option to set linewidth_factor. + (lbp_printer::lbp_printer): Initialize req_linethickness, not + line_thickness. + + * src/devices/grolbp/grolbp.man, NEWS, doc/webpage.ms: Updated. + +2002-09-22 Paco Andrés Verdú + + Fixed a bug in the line thickness setting code. + + * src/devices/grolbp/lbp.cc (lbp_printer::req_linethickness): New + variable. + (lbp_printer::set_line_thickness): Pass environment as second + parameter. + Implement it actually. + (lpb_printer::set_char, lbp_printer::draw): Use `req_linethickness' + and `set_line_thickness, depending on the current font size. + +2002-09-21 Werner LEMBERG + + Some Debian patches. + + * src/roff/groff/pipeline.h (MAX_COMMANDS): Increase to 12. + * src/roff/troff/node.cc (bracket_node::copy): Initialize + `list->last'. + +2002-09-20 Werner LEMBERG + + * configure: Regenerated with autoconf 2.54. + +2002-09-20 Werner LEMBERG + + * src/roff/troff/env.h (environment): Rename cur_glyph_color to + glyph_color. + Rename cur_fill_color to fill_color. + * src/roff/troff/env.cc: Updated. + +2002-09-20 Werner LEMBERG + + * src/roff/troff/env.cc (title): Copy color status after processing + title. + * src/roff/troff/input.cc (charinfo_to_node_list): Emit glyph and + fill color nodes to reset colors properly. + + * tmac/www.tmac (DC): Fix color handling. + + * src/preproc/pic/pic.man, doc/pic.ms: Document some color issues. + * doc/groff.texinfo: Fixing documentation of `tl' request. + * doc/webpage.ms: Updated. + +2002-09-19 Werner LEMBERG + + * src/roff/troff/env.cc (environent_switch, environment_copy): + Emit glyph and fill color nodes to initialize colors properly. + +2002-09-17 Colin Watson + + * src/roff/troff/env.cc (environment::set_glyph_color, + environment::set_fill_color): Fix typo which prevented \m[] work + correctly. + +2002-09-17 Werner LEMBERG + + Add left and right italic correction to non-slanted PS fonts. This + is an experimental feature to improve image rendering of grohtml. + + * font/devps/generate/Makefile (RFLAG): New variable, set to `-i 0'. + ({T,H,C,P,N,BM,A,HN}{R,B}, ZD, S, ZDR): Use it. + * font/devps/*: All non-slanted fonts regenerated. + * NEWS: Updated. + +2002-09-16 Werner LEMBERG + + Add a site-specific font directory. + + * Makefile.in (localfontdir, legacyfontdir): New variables. + (fontpath): Use them. + (MDEFINES, uninstall_dirs): Updated. + * Makefile.comm (.man.n): Add `LOCALFONTDIR' and `LEGACYFONTDIR'. + Remove `FONTPATH' and `MACROPATH'. + + * src/roff/troff/troff.man, NEWS: Updated. + * doc/groff.texinfo (Font Directories): New section. + Other minor fixes. + + * src/devices/grodvi/grodvi.man, src/devices/grohtml/grohtml.man, + src/devices/grolbp/grolbp.man, src/devices/grolj4/grolj4.man, + src/preproc/grn/grn.man: Minor fixes. + + * src/devices/grohtml/post-html.cc (html_printer::do_tab_ts): + Remove unused variable. + +2002-09-11 Werner LEMBERG + + * doc/groff.texinfo, man/groff_font.man: Clarify argument of \N. + * man/groff_out.man: Fix documentation of 'N'. + +2002-09-09 Gaius Mulley + + * doc/Makefile.in (webpage.html): Depend on gnu.eps also. + * src/roff/troff/env.cc (indent): Emit html tag only if break_flag is + set. + * src/devices/grohtml/post-html.cc (text_glob::is_br_ni): Removed. + (text_glob::is_br, html_printer::lookahead_for_tables): Updated. + (html_printer::do_tab_ts): Call `emit_table_header' with `FALSE'. + * src/devices/grohtml/html-text.cc (html_text::start_tag) : Call `begin' with `FALSE'. + +2002-09-09 Ralph Corderoy + + * src/libs/libgroff/string.cc (string::extract): Fix position of + terminating null byte. + +2002-09-08 Werner LEMBERG + + Add global option `nospaces' to tbl so that leading and trailing + spaces in data items are ignored. + + * src/libs/libgroff/string.cc (string::remove_spaces): New member + function to remove leading and trailing spaces. + * src/include/stringclass.h: Updated. + + * src/preproc/tbl/table.h (table): Add flag `NOSPACES'. + + * src/preproc/tbl/main.cc (process_options): Handle `nospaces' + option. + Fix typo in error messages. + (process_data): Implement `nospaces' option. + * src/preproc/tbl/tbl.man, NEWS, doc/webpage.ms: Updated. + +2002-09-07 Werner LEMBERG + + * src/include/config.hin: Add `HAVE_ISATTY'. + * src/libs/libgroff/tmpfile.cc (xtmpfile_list): Drop `const' for + `fname' member. + * src/libs/libgroff/tmpname.cc: Include `time.h'. + * src/libs/libdriver/input.cc (Char): Add `operator==' and + `operator!=' for `char'. + * doc/groff.texinfo: Replace @ifnottex block for top node with + @ifhtml block. + +2002-09-06 Werner LEMBERG + + * doc/Makefile.in (.texinfo.html): Add -I switch. + * doc/groff.texinfo: Add @ifnottex block for top node to make + translation to HTML work. + +2002-09-05 Gaius Mulley + + * src/preproc/html/pre-html.cc (LETTER_LENGTH): Removed. + (get_papersize, determine_vertical_offset): Removed. + (char_buffer::do_image): Always specify letter size. + (main): Updated. + (imageList::createPage): Use -dDEVICEHEIGHTPOINTS instead of + -sPAPERSIZE. + +2002-09-05 Werner LEMBERG + + * doc/groff.texinfo, tmac/groff_man.man: Improve documentation of + default indentation. + +2002-09-04 Gaius Mulley + + * src/preproc/html/pre-html.cc (imageList::createPage): Use + -sPAPERSIZE for gs. + (generateImages): Clean up push-back buffer. + +2002-09-04 Ralph Corderoy + + * doc/groff.texinfo: Minor fixes. + +2002-08-21 Gaius Mulley + + * src/preproc/html/pre-html.cc (DEFAULT_LINE_LENGTH): New macro. + (MAX_WIDTH, A4_LENGTH, A4_OFFSET, LETTER_OFFSET): Removed. + (gsPaper): Removed. + (determine_vertical_offset): Use LETTER_LENGTH. + (createPage): Moved to ... + (imageList::createPage): This. + Call gs with -dDEVICEWIDTHPOINTS to avoid cropping. + (imageList::getMaxX): New function. + (createImage): Moved to ... + (imageList::createImage): This. + (imageList::createImages): New function. + (generateImages): Read `maxx' directly. + Updated. + (scanArguments): Don't specify `gsPaper' for `-o'. + (makeTempFiles): Call `xtmpfile' with the last argument set to + `TRUE'. + +2002-08-24 Werner LEMBERG + + * src/include/nonposix.h (mkdir, WAIT, creat) [_MSC_VER]: Define. + (WAIT, _WAIT_CHILD) [!_MSC_VER]: Define. + * src/preproc/html/pre-html.cc (waitForChild): Use WAIT. + * src/preproc/html/pushback.cc: Include nonposix.h. + * src/roff/groff/pipeline.c: Define strcasecmp and strncasecmp + conditionally. + +2002-08-23 Werner LEMBERG + + Use $(OBJEXT) for the object file extension. + + * Makefile.comm (.SUFFIXES): Add .obj. + (.cc.obj, .c.obj): New implicit rules. + * Makefile.in (OBJEXT): New variable, initialized from autoconf. + (MDEFINES): Add EXEEXT and OBJEXT. + * */Makefile.sub: s/.o/.$(OBJEXT)/. + +2002-08-22 Werner LEMBERG + + * INSTALL: Mention texinfo 4.2 as a prerequisite. + +2002-08-21 Gaius Mulley + + * src/devices/grohtml/post-html.cc (colType): Make enum global to + the file. + (html_printer::update_min_max, html_printer::add_table_end): New + methods. + (html_printer::lookahead_for_tables): Use them. + Reset page offset correctly. + (html_printer::~html_printer): Add creation of creator comment up. + +2002-08-20 Werner LEMBERG + + * tmac/an-old.tmac (T&): New dummy macro to avoid warning. + * man/groff_tmac.man: Fix typos. + * man/groff_font.man: Minor reordering. + * contrib/eqn2graph/eqn2graph.man (Tp): New macro. + +2002-08-18 Gaius Mulley + + Avoid endless loops while scanning for tables. + + * src/devices/grohtml/post-html.cc (list::insert): Set + ptr->right->left. + (html_printer::next_horiz_pos): Add `text_glob' argument; update + all callers. + Return immediately if that argument is NULL. + (html_printer::calc_nf): Don't test if `g' is NULL. + (html_printer::lookahead_for_tables): Use + `glyphs.move_right_get_data'. + Don't test if `g' is NULL. + +2002-08-18 Gaius Mulley + + A better fix, replacing fix 2002-08-15, for increasing SIZE. + + * src/devices/grohtml/post-html.cc (char_block): Make `buffer' + a pointer. + (char_block::char_block): Allocate `buffer'. + (char_buffer::add_string): Use it. + +2002-08-15 Werner LEMBERG + + * src/devices/grops/grops.man, src/devices/grolj4/grolj4.man, + src/devices/grodvi/grodvi.man: Document default line thickness. + +2002-08-15 Gaius Mulley + + * src/devices/grohtml/post-html.cc (char_block): Increase SIZE to + 8192. + +2002-08-14 Werner LEMBERG + + * doc/webpage.ms: Updated. + +2002-08-09 Werner LEMBERG + + * src/roff/troff/node.cc (node::add_char): Call `freeze_space' for + unbreakable space. + +2002-08-08 Aaron Campbell + + * src/preproc/pic/object.cc (object_spec::make_move): Fix typo + (&& -> &). + +2002-08-08 Werner LEMBERG + + * src/roff/troff/input.cc (read_rgb, read_cmy, read_cmyk): Call + tok.next(). + (read_gray): Ditto. + Don't push back a space but a newline onto the stack. + +2002-08-07 Gaius Mulley + + Add fonts `CI', `CB', and `CBI' to grohtml which have been omitted + inadvertently. + + * src/devices/grohtml/post-html.cc (html_printer::end_font, + html_printer::start_font): Handle them. + * src/devices/grohtml/html-text.cc (html_text::do_italic): Don't + reset bold and tt. + (html_text::do_bold): Don't reset italic and tt. + (html_text::do_tt, html_text::do_pre): Don't reset bold and italic. + * font/devhtml/DESC.proto: Add those fonts. + * font/devhtml/Makefile.sub (PROTOFONTS): Updated. + +2002-08-07 Werner LEMBERG + + * MORE.STUFF: Added gpresent. + + * tmac/trace.tmac: Show nesting level by a corresponding amount of + whitespace before printing the logging message. + +2002-07-31 Colin Watson + + * src/devices/grohtml/html-table.cc (html_table::finish_row): + Initialize `n' to zero. This fixes a segfault on ARM. + +2002-07-30 Werner LEMBERG + + * doc/grnexmpl.me: Remove calls to .st and .sc which are undefined. + +2002-07-29 Werner LEMBERG + + * src/preproc/pic/pic.y (print_arg, relative_path): Add missing + final semicolon. + +2002-07-28 Colin Watson + + * src/devices/grohtml/post-html (html_printer::troff_tag): Handle + `.ps'. + (html_printer::html_printer): Initialize `pointsize'. + +2002-07-26 Werner LEMBERG + + * doc/Makefile.sub (PROCESSEDEXAMPLEFILES): Remove gnu.eps and + gnu.png. + (CLEANNOTSRCDIRADD): Add gnu.eps and gnu.png. + (gnu.eps): Add -rle switch to pnmtops. + (distfiles): Add gnu.eps and gnu.png. + +2002-07-25 Petter Reinholdtsen + + * src/libs/libdriver/input.cc (Char): Add const to `operator=='. + Add `operator!='. + +2002-07-24 Werner LEMBERG + + * doc/Makefile.in, doc/Makefile.sub (groff_bin_path): Don't use + ' \+' but ' *' for sed. + (GROFF): Set GROFF_COMMAND_PREFIX to empty value. + +2002-07-23 Werner LEMBERG + + * doc/groff.texinfo: Document `papersize' keyword. + * NEWS, man/groff_font.man: Updated. + +2002-07-23 Colin Watson + + Extend papersize keyword to accept more than a single entry. The + first valid will be used. + + * src/libs/libgroff/font.cc (font::load_desc): Implement it. + (font::scan_papersize): Really skip final newline. + * src/preproc/html/pre-html.cc (get_papersize): Ditto. + +2002-07-23 Werner LEMBERG + + * configure.ac: Test for isatty. + * configure: Regenerated. + * src/include/posix.h: Check HAVE_ISATTY. + * src/roff/troff/input.cc [ISATTY_MISSING]: Removed. + * src/utils/lookbib/lookbib.cc: Include posix.h. + Don't declare isatty. + +2002-07-21 Werner LEMBERG + + * NEWS: Add `output' request. + + * REVISION: Increased to 1. + +Version 1.18.0 released +======================= + +2002-07-19 Gaius Mulley + + Allow internal glyph indices > 0xFF in grohtml for input characters. + + * src/devices/grohtml/post-html.cc (to_unicode): Use `unsigned int' + as parameter. + (html_printer::add_to_sbuf): Use `unsigned int' as first parameter. + Updated all callers. + (html_printer::sbuf_continuation, html_printer::overstrike): Ditto. + (html_printer): Updated. + +2002-07-19 Werner LEMBERG + + * font/devhtml/R.proto: Updated to HTML 4, adding many glyphs. + * font/devutf8/R.proto: Adding some missing glyphs. + * font/devutf8/NOTES: Updated. + + * tmac/dvi.tmac: Add more composite glyphs. + * tmac/html.tmac: Updated. + + * man/groff_char.man: Add `sum' and `product' entities. + + * NEWS: Updated. + +2002-07-18 Gaius Mulley + + Improved table, tab, and indenting support. + + * src/roff/troff/input.cc (file_iterator::suppress_newline_flag, + string_iterator::suppress_newline_flag): Removed. Updated all + function which have used it. + + * src/roff/troff/env.cc: Include `input.h'. + (environment::add_node): Accept 0 as parameter. + (environment::add_html_tag): Add `force' parameter. + Updated all callers. + (environment::add_html_tag_tabs): Ditto. + For the moment, support left-aligned tabs only. + (environment::make_html_tag): New function. + (fill, no_fill): Set .br html tag additionally. + (environment::newline): Emit `eol.ce' or `eol' tag for html. + (environment::add_html_tag_eol): Removed. + (tab_stops::distance_to_next_tab): Add variant for handling + nextpos'. + (environment::distance_to_next_tab): Ditto. + Updated all callers. + (environment::handle_tab): Handle tabs for html. + + * src/roff/troff/env.h: Updated. + + * src/roff/troff/div.cc: Updated all callers of + `environment::add_html_tag'. + + * src/devices/grohtml/html-table.cc, + src/devices/grohtml/html-table.h: New files. + + * src/devices/grohtml/html-text.cc (html_text): New members + `blank_para' and `start_space'. + (html_text::issue_tag): Don't emit TABLE_TAG. + Handle indentation for PRE_TAG and P_TAG. + (html_text::end_tag): Updated. + (html_text::table_is_void, html_text::issue_table_begin, + html_text::issue_table_end): Removed. + (html_text::do_push): Simplified. + [DEBUGGING]: Small fix. + (html_text::push_para): Add new parameter for indentation; updated + all callers. + Handle PRE_TAG. + (html_text::do_indent, html_text::do_table, html_text::done_table, + html_text::is_in_table): Removed. + (html_text::do_pre): Handle P_TAG also. + (html_text::shutdown): Handle p->indent. + (html_text::check_emit_text): Simplified. + (html_text::do_emittext): Reset `blank_para'. + (html_text::do_para): Add new parameter for indentation; updated + all callers. + (html_text::remove_indent): New function. + (html_text::do_space): Handle verbatim text properly. + (html_text::ever_emitted_text, html_text::starts_with_space, + html_text::remove_para_align): New functions. + (html_text::dump_stack_element, html_text::dump_stack): Updated. + + * src/devices/grohtml/html_text.h (HTML_TAG): Remove TABLE_TAG. + Updated. + + * src/devices/grohtml/post-html.cc: Include html-table.h. + (INDENTATION): Removed. + (text_glob): Added many `is_' functions. + Added table description `tab'. + Added `get_arg',`get_tab_args', `remember_table', and `get_table' + member functions. + (list): Add `insert' and `move_to' member functions. + (page): Add `insert_tag' member function. + (page::dump_page) [DEBUG_TABLES]: Improved. + (html_printer): Add `table' and `max_linelength' elements. + Add many `do_', `insert_', `next_horiz_pos', + `lookahead_for_tables', `shutdown_table', `calc_nf', `calc_po_in', + `remove_tabs', `remove_courier_tabs'. + (html_printer::emit_raw): Handle indentation. + (html_printer::do_center, html_printer::write_header): Updated. + (html_printer::is_courier_until_eol): Check for tag. + (html_printer::do_linelength): Handle max_linelength. + (html_printer::do_page_offset, html_printer::do_indentation): Handle + fill_on. + (html_printer::do_tempindent): Updated. + (html_printer::do_indentedparagraph): Removed. + (html_printer::do_indent): Simplified. + (html_printer::do_eol): Use `ever_emitted_text'. + (html_printer::do_flush, html_printer::do_links): Don't call + done_table. + (html_printer::do_break): Handle end_tempindent. + (html_printer::troff_tag): Get argument. + Don't handle `.ip'. + Handle `.tab-ts', `.tab-te', `.col', `tab', and `tab0' tags. + (html_printer::flush_page): Call `lookahead_for_tables'. + Don't call `done_table'. + (html_printer::add_to_sbuf): Always call do_indent. + + * src/devices/grohtml/Makefile.sub: Updated. + + * tmac/an-old.tmac (TP): Don't handle html device specially. + (an-do-tag-html): New function which will be used instead of + `an-do-tag' if html device is used. + + * tmac/html.tmac: Call .po to pass default page offset to grohtml. + + * tmac/s.tmac (@IP): Don't handle html device specially. + (@IP-html): New function which will be used instead of `@IP' if + html device is used. + + * tmac/www.tmac (HTML-NS, HTML-TAG-NS): New auxiliary macros -- this + is a hack which will eventually vanish again. + (PIMG): Handle `-C' option correctly if not html. + (HR): Use HTML-NS. + +2002-07-17 Werner LEMBERG + + * src/utils/afmtodit/afmtodit.pl: Don't use `-P-' for invoking perl. + +2002-07-14 Eric S. Raymond + + * contrib/pic2graph/pic2graph.*: Use convert(1). + * contrib/eqn2graph/eqn2graph.*: Minor fixes. + +2002-07-14 Bernd Warken + + * tmac/groff_trace.man: New file. + * tmac/Makefile.sub: Updated. + * NEWS: Updated. + +2002-07-13 Werner LEMBERG + + * src/roff/groff/groff.man: Add some cross references. + +2002-07-12 Werner LEMBERG + + * src/roff/troff/input.cc (substring_request): Add warnings for + string indices out of range. + +2002-07-11 Werner LEMBERG + + * font/devdvi/generate/ec.map: Fix typo (`(l' -> `/l'). + * font/devdvi/*EC: Regenerated. + +2002-07-10 Bernd Warken + + * man/groff_char.man: Updated and extended. + +2002-07-10 Werner LEMBERG + + * src/roff/troff/input.cc (length_macro): Renamed to... + (length_request): This. + Move call of `tok.next()' to the very end, otherwise the register + value hasn't been updated yet. + (init_input_requests): Updated. + +2002-07-09 Werner LEMBERG + + * src/roff/troff/input.cc (substring_macro): Renamed to... + (substring_request): This. + (init_input_requests): Updated. + * src/roff/troff/request.h: Updated. + +2002-07-08 Robert D. Goulding + + * src/roff/grog/grog.sh: Fix typo. + +2002-07-08 Werner LEMBERG + + * win32-diffs: Updated. + + Handle `papersize' keyword properly in DESC. + + * src/libs/libgroff/font.cc (font::scan_papersize): Fix argument + type. + Updated all callers. + * src/libs/libgroff/paper.cc: Add four more paper formats used by + grolj4. + * src/include/paper.h: Updated. + + * src/devices/grolbp/lbp.cc: Remove unnecessary semicolons. + Other minor C syntax fixes. + (papersize, paperlength, paperwidth): Renamed to `user_*'. + (lbp_printer): Add `papersize', `paperlength', and `paperwidth' + members. + (lbp_printer::lbp_printer): Pass three arguments. + Set paper dimensions properly. + (make_printer, main): Updated. + (handle_unknown_desc_command): Fix error messages. + (main): Handle papersize keyword in DESC properly. + + * src/devices/grolj4/lj4.cc (paper_size): Renamed to + `user_paper_size'. + (lbp_printer::lbp_printer): Pass an argument. + Set paper_size properly. + (handle_unknown_desc_command): Removed. + (make_printer, main): Updated. + * src/devices/grolj4/grolj4.man: Minor documentation fix. + + * man/groff_font.man, NEWS: Updated. + +2002-07-07 Werner LEMBERG + + Integrated eqn2graph, contributed by Eric S. Raymond. + + * contrib/eqn2graph/{Makefile.sub, eqn2graph.sh, eqn2graph.man}: New + files. + * Makefile.in, NEWS: Updated. + +2002-06-04 Werner LEMBERG + + Changing the substring request to make it fit better with other + string manipulation functions in other programming languages: + Index 0 is now the first character in the string, and index -1 + indicates the last character. Since this request didn't work + properly anyway in the last release, it doesn't harm too much to + change the syntax. + + * src/roff/troff/input.cc (substring_macro): Use loops to get + the real string length (ignoring COMPATIBLE_SAVE and + COMPATIBLE_RESTORE) and offsets. + Implement change described above. + + * man/groff_char.man, tmac/doc-common (doc-header), tmac/doc.tmac + (doc-do-Bd-args, doc-do-Bl-args): Changed accordingly. + + * NEWS, doc/groff.texinfo, man/groff_diff.man: Updated. + +2002-06-03 Werner LEMBERG + + Make .chop work with .de1 and friends. COMPATIBLE_SAVE and + COMPATIBLE_RESTORE are completely ignored. + + * src/roff/troff/input.cc (char_list::set, char_list::get): New + functions. + (macro): `length' field renamed to `len'. + Added new field `empty_macro' (1 if macro is empty), to be used + instead of checking `len'. + Updated all callers. + (macro::empty): Updated. + (macro::length, macro::set, macro::get): New functions. + (macro::append): Ignore COMPATIBLE_SAVE and COMPATIBLE_RESTORE. + Set `empty_macro'. + (chop_macro): Check and remove trailing COMPATIBLE_SAVE/ + COMPATIBLE_RESTORE pairs. + (asciify): Ignore COMPATIBLE_SAVE and COMPATIBLE_RESTORE. + * src/roff/troff/request.h: Updated. + + * doc/groff.texinfo: Document .chop's behaviour better. + +2002-06-02 Werner LEMBERG + + * doc/pic.ms: Fix documentation for the addition of positions. + + * tmac/doc.tmac, tmac/an-old.tmac: Need groff version 1.18. + +2002-06-29 Werner LEMBERG + + Implementation of string arguments of the form \*[foo arg1 arg2 ...] + + * src/roff/troff/input.cc (have_string_arg): New global variable. + (read_mode): New enumeration. + (read_escape_name): Use it. Update all calls. + (read_long_escape_name): Use it. Update all calls. + Set have_string_arg if appropriate. + (get_char_for_escape_name): Add parameter for handling space + character. + (interpolate_string_with_args, decode_string_args): New functions. + (get_copy, token::next): Call it if necessary. + (interpolate_string): Fix error message. + + * NEWS, doc/groff.texinfo, man/groff.man, man/groff_diff.man: + Document it. + +2002-06-24 Bernd Warken + + * man/groff_tmac.man: Updated and extended. + +2002-06-24 Werner LEMBERG + + * doc/pic.ms, src/preproc/pic/pic.man: Fix description of `:='. + +2002-06-23 Werner LEMBERG + + * doc/pic.ms: Improve documentation of composite block objects. + +2002-06-22 Werner LEMBERG + + * src/roff/troff/input.cc (init_registers): Add three registers + `seconds', `minutes', and `hours' to hold the current time. + + * NEWS, doc/groff.texinfo, man/groff.man, man/groff_diff.man: + Updated. + +2002-06-20 Werner LEMBERG + + Make \X accept both `\ ' and `\~', converting them to single space + characters. + + * src/roff/troff/token.h (token): Add TOKEN_UNSTRETCHABLE_SPACE. + (token::unstretchable_space): New inline function. + * src/roff/troff/input.cc (token::next, token::delimiter, + token::description, token::add_to_node_list, token::process): Handle + TOKEN_UNSTRETCHABLE_NODE. + (encode_char): Handle tok.stretchable_space and + tok.unstretchable_space. + + * NEWS, doc/groff.texinfo: Document it.. + +2002-06-19 Werner LEMBERG + + * src/devices/grops/ps.cc (ps_printer::special): Fix error message. + + * src/devices/grotty/tty.cc (tty_printer::special): Add `sgr' + keyword to enable/disable SGR output. + (tty_printer::change_fill_color): New function. + * NEWS, src/devices/grotty/grotty.man: Document `sgr' special. + + * src/roff/troff/input.cc (output_request): Add missing `tok.next()' + call. + +2002-06-18 Werner LEMBERG + + Add a `color' request and a `.color' register to control usage of + colours. + + * src/roff/troff/input.cc (disable_color_flag): Replaced with... + (color_flag): This (which is the inverse). + (activate_color): New function. + (main, init_input_requests): Updated. + * src/roff/troff/troff.h, src/roff/troff/node.cc + (troff_output_file::fill_color, troff_output_file::glyph_color): + Updated. + + * NEWS, doc/groff.texinfo, man/groff_diff.man, man/groff.man: + Document the changes. + +2002-06-17 Colin Watson + + Circumvent bug in autoconf 2.53 regarding top_builddir. + + * aclocal.m4 (GROFF_BUILDDIR): s/top_builddir/groff_top_builddir/. + * Makefile.in, doc/Makefile.in: + s/@top_builddir@/@groff_top_builddir@/. + * configure: Regenerated (with autoconf 2.53). + +2002-06-17 Werner LEMBERG + + * src/libs/libgroff/font.cc (font::load_desc): Fix computation of + `paperwidth' and `paperlength' for the `papersize' keyword. + +2002-06-16 P. Alejandro Lopez-Valencia + + * src/devices/grops/grops.man: Add info about Type 42 fonts. + +2002-06-15 Gaius Mulley + + * src/devices/grohtml/post-html.cc (html_printer::emit_raw, + html_printer::do_linelength, html_printer::do_pageoffset, + html_printer::do_indentation, html_printer::do_tempindent, + html_printer::do_break, html_printer::begin_page): Clear indented + text. + * tmac/html.tmac: Disable hyphenation. + +2002-06-15 Werner LEMBERG + + Don't produce HTML files if utility programs are missing. + + * Makefile.in (make_html, make_install_html): New variables. + (MDEFINES): Updated. + + * aclocal.m4 (GROFF_HTML_PROGRAMS): New function to test for HTML + utility programs. + * configure.ac: Use it. + * configure: Regenerated. + + * doc/Makefile.sub (PROCESSEDEXAMPLEFILES): Move webpage.html to... + (HTMLEXAMPLESFILES): This new variable. + (EXAMPLESIMAGEFILES): Renamed to... + (HTMLEXAMPLEIMAGEFILES): This. + (CLEANADD): Add HTMLEXAMPLEFILES. + (all): Use `make_html'. + (html): New target. + (install_data): Use `make_install_html'. + Move html stuff to... + (install_html): This new target. + (uninstall_sub): Updated. + +2002-06-14 Bernd Warken + + * src/roff/grog/Makefile.sub (grog): Renamed to... + (grog.old): This. + (grog): New rule to always install grog.sh as grog. + +2002-06-08 Bernd Warken + + * src/roff/grog/grog.pl: Fix typo. + +2002-06-07 Werner LEMBERG + + * doc/groff.texinfo: Add more info on .tr arguments. + +2002-06-05 Werner LEMBERG + + * NEWS, src/roff/grog/grog.man, doc/groff.texinfo: Updated. + + * aclocal.m4 (GROFF_MKSTEMP): Include unistd.h. + * configure: Regenerated. + +2002-06-05 Ralph Corderoy + + * src/roff/troff/symbol.cc (table_sizes): Add more values. + + * src/roff/grog/grog.pl, src/roff/grog/grog.sh: Recognize mom. + +2002-06-04 Werner LEMBERG + + * aclocal.m4 (GROFF_PAGE): Don't use `prefix' directly since it + is not initialized at the time we need it in case `--prefix' hasn't + been set. Check for `ac_default_prefix' also. + Test for `papersize' keyword also and generalize allowed whitespace. + * configure: Regenerated. + + * font/devps/Makefile.sub (DESC): Use `papersize' instead of + `paperlength'. + + * src/libs/libgroff/Makefile.sub (version, revision): Replaced + with... + (src_version, src_revision): New variables to avoid overwriting + from parent make process. + (version.cc): Updated. + + * src/preproc/html/pre-html.cc: Include paper.h and font.h. + (linebuf, linebufsize): New global variables. + (sys_fatal): Use `fatal' to abort properly. + (get_line): New function. + (get_resolution): Use it. + Improve error messages. + (get_papersize): Check `papersize' also. + Use `get_line'. + Improve error messages. + +2002-06-03 Werner LEMBERG + + * Makefile.comm (CLEANNOTSRCDIRADD): New target for files which + should be removed only if builddir is not srcdir. + (mostlyclean): Handle `CLEANNOTSRCDIRADD'. + (clean): Depend on `mostlyclean'. + (distclean): Depend on `clean'. + (realclean, extraclean): Depend on `distclean'. + (.y.cc, .y.o): Simplified. The output files are no longer written + to srcdir but to builddir. + * Makefile.in (MDEFINES): Add `version' and `revision'. + (uninstall_dirs): Fix order of directories. + * doc/Makefile.sub (version, revision): Removed. + (CLEANADD): Removed grnexmpl.g, groff, groff-*. + Added `HTMLDOCFILES'. + (CLEANNOTSRCDIRADD): New target for grnexmpl.h, groff, groff-*. + * src/preproc/eqn/Makefile.sub, src/preproc/pic/Makefile.sub, + src/preproc/refer/Makefile.sub (YTABC, YTABH): Don't use `srcdir' + as prefix. + + * doc/texinfo.tex (\authortt): New macro. + (\shortcontt): Define. + (\titlepage): Set \tt to \authortt while defining \authorfont. + (\appendixbox): New macro. + (\chapmacro, \appendixentry): Use \appendixbox to get even + indentation for letters. + (\summarycontents): Set \tt. + (\internalpagesize): Add two arguments for real paper width and + height as needed by pdfTeX. + (\letterpaper, \smallbook, \afourpaper, \afivepaper, \afourlatex): + Updated. + (\tempdima, \tempdimb): New temporary dimensions. + (\pagesizesyyy): Updated. + +2002-06-02 Werner LEMBERG + + Adding a new keyword `papersize' to the DESC file format (similar + but not completely identical to grolbp's extension). grops now has + a -p command line option to override `papersize'. Finally, grolbp + has been adapted to the new syntax. + + * src/libs/libgroff/paper.cc, src/include/paper.h: New files. It + defines and initializes the `papersizes[]' array with NUM_PAPERSIZES + elements. + * src/libs/libgroff/Makefile.sub (OBJS): Add `paper.o'. + (CCSRCS): Add `paper.cc'. + + * src/include/font.h (font): Add `papersize' element. + * src/libs/libgroff/font.cc (font::unit_scale): New helper function. + (font::scan_papersize): New function. + (font::load_desc): Use it for handling `papersize' keyword. + * src/libs/libgroff/fontfile.cc: Initialize `font::papersize'. + + * src/devices/grops/ps.cc: Include paper.h. + (user_paper_length): New global variable. + (ps_printer): Use paper length as initializer. + (make_printer): Updated. + (main): Handle new `-p' option. + * src/devices/grops/grops.man: Updated. + + * src/devices/grolbp/lbp.cc: Include paper.h. + s/papersizes/lbp_papersizes/. + (set_papersize): Use new `papersizes' array. + (handle_unknown_desc_command): Don't handle `papersize'. + (main): Use `font::scan_papersize' for handling `-p' option. + * src/devices/grolbp/grolbp.man: Updated. + + * man/groff_font.man: Document `papersize'. + * NEWS: Updated. + +2002-05-30 Werner LEMBERG + + * src/devices/grops/TODO: Updated. + * src/devices/grops/grops.man: More info on paper formats. + * man/groff_font.man: Document `paperheight' and `paperwidth'. + +2002-05-29 Werner LEMBERG + + * doc/Makefile.sub (CLEANADD): Add grnexmpl.g, groff, and groff-* + to list only if srcdir != currdir. + (distfiles): New target. + + * Makefile.in (EXTRADIRS): Add font/devlj4/generate. + (NOMAKEDIRS): New variable. + (DISTDIRS): Use it. + +2002-05-26 Werner LEMBERG + + Add .output request, similar to \! at top-level. + + * src/roff/troff/input.cc (transparent): Remove unused declaration. + (output_request): New function. + (init_input_requests): Add it. + Sorted. + * NEWS, doc/groff.texinfo, man/groff_diff.man, man/groff.man: + Document it. + + * Makefile.in (MDEFINES): Add INSTALL_INFO. + (prepare_examples): Fix typo. + * doc/groff.texinfo (@direntry): Fix it. + +2002-05-25 Werner LEMBERG + + Including the doc subdir into groff's Makefile system. + + * aclocal.m4 (GROFF_INSTALL_INFO): New function. + * configure.ac: Use it. + Generate `doc/Makefile'. + * configure: Regenerated. + + * Makefile.in (infodir, INSTALL_INFO): New variables. + (MDEFINES, uninstall_dirs): Updated. + (OTHERDIRS): Add `doc'. + * Makefile.comm (CLEANDIRADD): New variable. + (mostlyclean): Use it. + + * doc/Makefile.sub, doc/Makefile.in: New files. + * doc/Makefile: Removed. + + * NEWS, INSTALL: Updated. + +2002-05-24 Werner LEMBERG + + * doc/homepage.ms: Renamed to ... + * doc/webpage.ms: This. + Use `.NHR'. + +2002-05-23 Werner LEMBERG + + Integrating the `mom' macro package, contributed by Peter Schaffter + . + + * contrib/mom/*: New subdirectory tree. + * Makefile.in (docdir, exampledir, htmldocdir): New variables to + be used for documentation files. + (MDEFINES, uninstall_dirs): Use them. + (OTHERDIRS): Add contrib/mom. + * Makefile.comm (.man.n): Add @DOCDIR@, @EXAMPLEDIR@, and + @HTMLDOCDIR@. + * MANIFEST, NEWS: Updated. + +2002-05-22 Gaius Mulley + + Change syntax of \O: \O[0] suppresses output, \O[1] enables output + if at outer level; at start-up we are at outer level. + + * src/roff/troff/input.cc (do_suppress): Implement it. + Simplify \O[3]. + + Add option -p to show progress information. + pre-grohtml will now render only one page at a time, reducing the + size of needed disk resources enormously. + + * src/preproc/html/pre-html.cc (imagePageStem): Replaced with... + (imagePageName): New global variable. + (psPageName, show_progress, currentPageNo): New global variables. + (html_system): Close saved stderr and stdout handles. + (write_end_image): Accept a parameter to control \O escape. + (write_start_image): Adapted to new \O meaning. + (char_buffer::write_upto_newline): Updated. + (createAllPages): Replaced with... + (createPage): This new function to create a single page for images. + It uses `psselect' from the psutils package. + (removeAllPages): Removed. + (createImage): Updated. + Handle progress display. + (char_buffer::do_html, char_buffer::do_image) [DEBUGGING]: Removed. + (scanArguments): Add option -p. + (makeTempFiles): Updated to create temp files for psPageName and + imagePageName. + (removeTempFiles): Removed. + (main): Updated. + + * src/devices/grohtml/post-html.cc (header_desc::write_headings, + html_printer::write_header): Append `\0' to `buffer'. + (html_printer::do_eol): Depend on `current_paragraph->emitted_text'. + (main): Handle -p. + * src/devices/grohtml/html-text.cc (html_text::dump_stack_element): + Handle `text_emitted'. + (html_text::table_is_void): Slightly rewritten. + (stop): New external symbol. + (html_text::do_push) [DEBUGGING]: Use it and simplify. + (html_text::shutdown): Call `dump_stack'. + (html_text::do_space): Rewritten. + * src/devices/grohtml/grohtml.man: Document -p and the need of + `psselect'. + + * tmac/www.tmac (DC, HTML-DO-IMAGE, HTML-IMAGE-END): Updated to + new \O syntax. + Call \O[0] if `ps4html' is active. + * tmac/s.tmac (@EQ, @EN): Handle html better. + (@TS, TE): Ditto. + * tmac/html.tmac: Don't use black for background colour. + + * src/roff/troff/node.cc: Include `div.h'. + (troff_output_file::really_print_line): Don't use `is_on'. + (troff_output_file::word_marker, troff_output_file::flush_tbuf + troff_output_file::check_charinfo, + troff_output_file::put_char_width, troff_output_file::put_char, + troff_output_file::determine_line_limits, troff_output_file::draw, + real_output_file::begin_page, glyph_color_node::tprintf, + fill_color_node::tprint, hline_node::tprint, vline_node::tprint): + Use `is_on'. + (troff_output_file::really_on): Call `do_motion'. + (suppress_node::tprint): Use `get_page_number' instead of `%' + register. + Call `reset_output_registers' conditionally on `is_on'. + + * doc/groff.texinfo: Document new syntax of \O. + * NEWS, man/groff_diff.man: Updated. + +2002-05-22 Werner LEMBERG + + * MORE.STUFF: Add info about David Frey's deroff implementation. + Mention troff.org. + +2002-05-16 Werner LEMBERG + + Pic's `with' attribute now accepts positions. + + * src/preproc/pic/pic.y: Make `.', BOX, CIRCLE, ELLIPSE, ARC, LINE, + ARROW, SPLINE, and `[' left-associative tokens to fix shift/reduce + conflicts. + (object_spec): Add rule for `WITH' and `position'. + (relative_path): Give `corner' the precedence of `CHOP'. + * src/preproc/pic/object.h (path): New members `pos' and + `is_position'. + * src/preproc/pic/object.cc: Updated initializers of `path'. + (path::follow): Handle `is_position'. + + * doc/pic.ms: Completely updated grammar description. + Many typographical improvements. + +2002-05-15 Werner LEMBERG + + * src/roff/troff/env.cc(hyphen_trie::hpf_getc): Accept ^^x (char + code of x in range 0-127) also. + * doc/groff.texinfo, man/groff_diff.man: Updated. + + Added keywords `north', `south', `east', and `west' for corners + in pic. + + * src/preproc/pic/lex.cc (lookup_keyword): Add NORTH, SOUTH, EAST, + and WEST. + (yylex): Handle them. + * src/preproc/pic/pic.y: Add tokens NORTH, SOUTH, EAST, and WEST. + (corner): Handle them. + +2002-05-14 Werner LEMBERG + + * src/devices/grops/grops.man: Clarify handling of `download' file. + +2002-05-11 Werner LEMBERG + + Adding `warnscale' and `spreadwarn' requests, based on a patch from + Jeffrey Friedl . + + * src/roff/troff/input.cc (spread_limit, warn_scale, + warn_scaling_indicator): New global variables. + (warnscale_request, spreadwarn_requests): New functions. + (main): Initialize `warn_scale' and `warn_scaling_indicator'. + (init_input_requests): Updated. + (error_type): Add `OUTPUT_WARNING'. + (do_error): Handle it. + (output_warning): New warning function which shows output location. + * src/roff/troff/env.h (spread_limit): New external variable. + * src/roff/troff/env.cc (environment::choose_breakpoint): Use + `output_warning'. + (distribute_space): Emit warning if added space is larger than + `spread_limit'. + (environment::possibly_break_line): Emit warning if a line can't + be adjusted on both sides. + + * doc/groff.texinfo, man/groff_diff.man, man/groff.man: Document it. + +2002-05-08 Werner LEMBERG + + * src/roff/troff/node.cc (special_node::special_node): Use + env_definite_font(curenv) instead of curenv->get_font(). Otherwise + \X''\% crashes, for example. + + * doc/groff.texinfo: Document \! and \? used at top-level. + +2002-05-06 Werner LEMBERG + + * src/preproc/pic/pic.man: Fix some keyword syntax. + Other minor typographical fixes. + + * src/roff/groff/groff.man: Fix typos. + +2002-05-04 Werner LEMBERG + + * src/roff/groff/groff.man ([ShortOpt]): Renamed to... + (ShortOpt[]): This to avoid problems with refer. + + * doc/pic.ms: Fix typo. + Fix pic grammar description. + + * tmac/an-old.tmac (ne): Use de1, not de. + +2002-05-03 Werner LEMBERG + + * doc/groff.texinfo: Finished separation of glyphs and characters. + Don't use the string `Appendix' for appendix headers (both in + the text and the table of contents). + * man/groff_tmac.man, src/roff/troff/troff.man: Fix order of tmac + directories. + + Use registers LL and LT (similar to -ms) for controlling the + length of title and line, respectively, in the -man and -mdoc + macro packages. + + * tmac/doc-ditroff (doc-setup-page-layout), tmac/doc-nroff + (doc-setup-page-layout): Use \n[LL] and \n[LT]. + * tmac/an-old.tmac: Set \n[LL] and \n[LT] if not defined. + (TH): Use \n[LL]. + (an-header, an-p-footer): Use \n[LT]. + * NEWS, tmac/groff_man.man, tmac/groff_mdoc.man, + doc/groff.texinfo: Document it. + +2002-05-02 Werner LEMBERG + + * doc/fdl.texi: New file. + * doc/groff.texinfo: Include it. + Define and use @copying. + Starting with separating glyph, symbol, and character. + +2002-04-27 Werner LEMBERG + + * Makefile.in (EXEEXT): Set it. + * src/*/Makefile.sub (PROG): Add $(EXEEXT) for all non-script + programs. + + * src/include/nonposix.h: Define GS_NAME. + * src/preproc/html/pre-html.cc (createAllPages): Use GS_NAME. + + Some preliminary changes for EMX support under OS/2. + + * src/preproc/pic/main.cc (main), src/roff/groff/pipeline.c: Add + __EMX__ similar to __MSDOS__. + * src/utils/indxbib/indxbib.cc (main) [__EMX__]: Use `unlink'. + +2002-04-25 Werner LEMBERG + + * doc/groff.texinfo: Integrated groff_out.man. + Some macro fixes. + +2002-04-23 Werner LEMBERG + + * man/groff_out.man: Minor fixes. + +2002-04-23 Werner LEMBERG + + * doc/groff.texinfo: Moving @cindex entries after @Def* to get + correct page references. + Fixed many index entries. + +2002-04-23 Bernd Warken + + * man/roff.man: Enlarged. + +2002-04-22 Werner LEMBERG + + * doc/groff.texinfo: More examples, other fixes. + +2002-04-20 Werner LEMBERG + + * src/roff/troff/input.cc (pipe_output): Multiple calls to `pi' + will now form a chain, e.g. + + .pi foo + .pi bar + + is now the same as + + .pi foo | bar + + This is for compatibility with plan 9's troff. + + * tmac/tty.tmac: Set default tab values to 0.8i to be compatible + with UNIX troff. + * NEWS: Updated. + + * doc/groff.texinfo: Add documentation of remaining requests and + registers. + +2002-04-19 Werner LEMBERG + + * doc/groff.texinfo: Add documentation of remaining escapes. + + * font/devdvi/generate/tc.map: Remove entry for `sr'. + * font/devdvi/*TC: Regenerated. + +2002-04-18 Werner LEMBERG + + * src/roff/troff/input.cc (token::next): Make \H behave consistently + if not in compatibility mode, i.e., increment relative to the + previous height. + * doc/groff.texinfo: Updated accordingly. + +2002-04-17 Werner LEMBERG + + * doc/groff.texinfo: Document \\, \e, \E, \., and \c. + +2002-04-16 Bernd Warken + + * src/roff/groff/groff.man: Improve documentation of -P option. + Other minor fixes. + +2002-04-15 Werner LEMBERG + + Add new escape \F to switch font family. + + * src/roff/troff/input.cc (token::next): Handle \F. + * src/roff/troff/env.cc (environment::set_family): Handle + `interrupted' flag. + * NEWS, doc/groff.texinfo, man/groff_diff.man, man/groff.man: + Document it. + +2002-04-14 Werner LEMBERG + + * tmac/doc.tmac (doc-tag-list): Use \Z to avoid stretching of + spaces in tags. + +2002-04-13 Werner LEMBERG + + Implement \f[] as an alternative to \fP. Change \mP and \MP to + \m[] and \M[], respectively. + + * src/roff/troff/symbol.cc (EMPTY_SYMBOL): New global variable. + (symbol::symbol): Handle NULL string and empty string differently. + * src/roff/troff/symbol.h (symbol::is_empty): New inline function. + * src/roff/troff/input.cc (read_escape_name, read_long_escape_name): + Add optional parameter. + Updated calling functions. + (get_copy, do_glyph_color, do_fill_color, token::next): Use + `symbol::is_empty'. + * src/roff/troff/env.cc (environment::set_font): Ditto. + + * src/preproc/pic/troff.cc (troff_output::set_fill, + troff_output::reset_color: Updated. + + * tmac/www.tmac: Updated. + + * NEWS, man/groff_diff.man, man/groff.man, doc/groff.texinfo, + doc/homepage.ms, src/devices/grotty/grotty.man, tmac/groff_www.man: + Updated. + + * tmac/Xps.tmac: Remove some redundant code. + + * tmac/doc-common, tmac/doc-ditroff, tmac/doc-nroff, tmac/doc.tmac, + tmac/dvi.tmac, man/roff.man, man/groff_out.man, man/groff.man, + man/groff_diff.man, src/roff/groff/groff.man: Replace \f[P] with + \f[]. + +2002-04-13 Bernd Warken + + * src/include/printer.h, src/libs/libdriver/printer.cc + (printer::change_fill_color): New member function. + * src/libs/libdriver/input.cc (parse_D_command): Use it. + +2002-04-12 Werner LEMBERG + + * doc/groff.texinfo: Completed pass on gtroff reference. + +2002-04-11 Werner LEMBERG + + * doc/groff.texinfo: More fixes. + +2002-04-11 Bernd Warken + + * src/include/color.h: Decorate with `const'. + Use `size_t'. + Include `stddef.h'. + * src/libs/libgroff.color.cc: Decorate with `const'. + Use `size_t'. + (color::color): Initialize members. + * src/libs/libdriver/input.cc (parse_D_command): Handle `f' + command according to the documentation. + + * man/groff_out.man: Updated. + Minor fixes. + +2002-04-11 Gaius Mulley + + * src/preproc/html/pre-html.cc (write_start_image): Remove + redundant output. + * tmac/www.tmac (DC, HTML-DO-IMAGE): Ditto. + + * src/devices/grohtml/post-html.cc (page::add_and_encode): Using + \C'hy' caused an assertion failure. + + * src/roff/troff/env.cc (environment::environment): Initialize + `emitted_node'. + (environment::copy): Handle `ignore_next_eol' and `emitted_node'. + +2002-04-10 Werner LEMBERG + + * man/groff_diff.man, man/groff.man, NEWS, doc/groff.texinfo: + Document pvs request and .pvs register. + +2002-04-09 Werner LEMBERG + + * doc/groff.texinfo: Improve and fix documentation of diversions + and environments. + +2002-04-08 Werner LEMBERG + + * doc/groff.texinfo: Fix documentation of drawing functions. + Other minor fixes. + +2002-04-07 Werner LEMBERG + + * doc/groff.texinfo: Better documentation of double quotes as + arguments. + Other minor fixes. + +2002-04-06 Werner LEMBERG + + * man/groff_font.man: Document names of special characters better. + * doc/groff.texinfo: Minor improvements. + + * tmac/lbp.tmac: Load latin1.tmac. + * tmac/X.tmac, tmac/Xps.tmac: Load latin1.tmac or cp1047.tmac. + + * font/devX*/*: Regenerated (all chars > 0x80 removed). + +2002-04-05 Werner LEMBERG + + * tmac/tty.tmac: Don't use shc request. + * tmac/latin1.tmac, tmac/cp1047.tmac: Translate soft hyphen to `\%'. + * NEWS: Updated. + + * man/groff_diff.man: Minor fixes. + + * font/devlbp/*: Remove all `charXXX' entities. + + * src/libs/libgroff/font.cc (font::~font): Deallocate + `special_device_coding'. + (font::load): Use `new' for allocating `special_device_coding'. + * src/libs/libgroff/nametoindex.cc (character_indexer::lookup_char): + Removed unused member. + +2002-04-05 Werner LEMBERG + + * src/drivers/grops/psrm.cc (skip_possible_newline): New function. + (resource_manager::do_begin_binary, + resource_manager::do_begin_data): Use it. + + * doc/texinfo.tex: Updated to version 4.2. + + * src/roff/troff/token.h: Add TOKEN_ZERO_WIDTH_BREAK for `\:'. + (token::zero_width_break): New inline function. + * src/roff/troff/input.cc (token::next): Use it. + (token::description): Updated. + (encode_char): Ignore `\%', `\&', `\)', and `\:'. + (token::add_to_node_list, token::process): Use it. + * NEWS, doc/groff.texinfo: Updated. + + * src/preproc/eqn/over.cc (over_box::output): Fix typo. + * tmac/tty.tmac: Add missing backslash. + +2002-04-04 Tadziu Hoffmann + + * src/preproc/eqn/box.cc (set_script_size, box::top_level): Use + `.ps' register instead of `.s' to handle fractional point sizes. + * src/preproc/eqn/limit.cc (limit_box::compute_metrics, + limit_box::output): Ditto. + * src/preproc/eqn/other.cc (size_box::compute_metrics, + size_box::output): Ditto. + * src/preproc/eqn/over.cc (over_box::compute_metrics, + over_box::output): Ditto. + * src/preproc/eqn/script.cc (script_box::compute_metrics, + script_box::output): Ditto. + * src/preproc/eqn/sqrt.cc (sqrt_box::compute_metrics, + sqrt_box::output): Ditto. + +2002-04-03 Michael Selway + + * src/drivers/grops/psrm.cc (resource_manager::do_begin_binary): + Fix typo. + +2002-04-03 Werner LEMBERG + + * doc/homepage.ms: Reduce title size. + * doc/groff.texinfo: Fix documentation of .t register. + Fix handling of colon. + Fix `\' vs. `\\'. + + * src/roff/troff/input.cc (exit_troff): Emit LAST_PAGE_EJECTOR + only if page length is positive to avoid a loop. + + * tmac/an-old.tmac (ne): Increase page length to avoid problems with + tbl. + +2002-04-02 P. Alejandro Lopez-Valencia + + * src/include/nonposix.h, src/roff/groff/pipeline.c: + s/__CYGWIN32__/__CYGWIN__/. + +2002-03-28 Gaius Mulley + + * doc/gnu.xpm: New image contributed by Emily Mulley. + * doc/Makefile (gnu.eps, gnu.png): Use pnmdepth. + (homepage.html): Be dependent on gnu.eps. + * doc/homepage.ms: Updated to new image. + + * src/devices/grohtml/post-html.cc (html_printer): New member + `sbuf_prev_hpos'. + (html_printer::flush_sbuf, html_printer::set_char): Set it. + (html_printer::sbuf_continuation): Use it. + +2002-03-28 Werner LEMBERG + + * src/libs/libgroff/getopt.c: Updated to latest version. + + * tmac/README: More on hyphen.tex license. + +2002-03-26 Larry Kollar + + * doc/groff.texinfo: Add documentation of most missing requests. + +2002-03-25 Werner LEMBERG + + Add three glyphs `t+-', `tmu', and `tdi' which are textual variants + of `+-', `mu', and `di', respectively. + + * font/devascii/R.proto, font/devutf8/R.proto, + font/devlatin1/R.proto, font/devhtml/R.proto, + font/devcp1047/R.proto, font/devlpb/*: Add them. + * font/devps/generate/textmap: Ditto. + * font/devps/*: Regenerated. + * font/devlj4/generate/text.map: Add them. + * font/devlj4/*: Regenerated. + * font/devdvi/generate/tc.map: Use them. + * font/devdvi/generate/texsy.map: Add them. + * font/devdvi/*: Regenerated. + * font/devX*/*: Regenerated. + + * tmac/latin1.tmac, tmac/cp1047.tmac, tmac/tty.tmac, + tmac/tty-char.tmac: Updated. + + * NEWS, man/groff_char.man: Updated. + +2002-03-24 Werner LEMBERG + + * tmac/dvi.tmac, tmac/X.tmac, tmac/ps.tmac, tmac/html.tmac, + tmac/lj4.tmac, tmac/tty.tmac: Replace most `.char' with `.fchar'. + * tmac/ec.tmac: Remove `.rchar' calls (no longer necessary since + we use `.fchar' in dvi.tmac. + * tmac/dvi.tmac: Improve definition of \[Fo] and \[Fc]. + * tmac/Xps.tmac: Simplify some char definitions. + Add definition for \[f/]. + * man/groff_char.man: Updated for new X.tmac. + + * tmac/README: New file. + +2002-03-23 Phil Lobbes + + * Makefile.comm (.y.o): New rule for make on Solaris 2.5.1 -- the + internal .y.o rule took precendence over the .y.cc rule, compiling + the yacc files with gcc instead of g++. + +2002-03-23 Werner LEMBERG + + * tmac/dvi.tmac: Add replacement font for `CB'. + + * tmac/doc.tmac: s/request/macro/ in messages. + (doc-generic-macro): Improve error message. + * tmac/groff_mdoc.man: Minor improvements. + +2002-03-22 Werner LEMBERG + + * doc/groff.texinfo: Document possible conflict between `tr' and + `char' requests. + +2002-03-21 Werner LEMBERG + + Improve handling of hyphenation patterns. It is now possible to + use most of TeX's pattern files unmodified. To make the process + more flexible, a new request `hpfcode' has been added which + provides a character code mapping for the `hpf' request. See + comment before hpf_getc() for more details. + + * src/roff/troff/env.cc (insert_hyphenation, hpf_getc): New + functions. + (read_patterns_file): Additional parameter for exception dictionary. + Extended to recognize \pattern, \hyphenation, and \endinput. + (do_hyphenation_patterns_file): Updated. + * src/roff/troff/env.h (hpf_code_table): New extern. + + * src/roff/troff/input.cc (hpf_code_table): New array. + (init_hpf_code_table, hyphenation_patterns_file_code): New + functions. + (hyphenation_code): Handle translation from `trin' correctly. + (main, init_input_requests): Updated. + (charinfo::set_translation): Handle hyphenation code also. + + * src/roff/troff/charinfo.h (charinfo::get_translation_input): New + inline function. + + * src/roff/troff/env.cc (WORD_MAX): Reduced to 256 since `unsigned + char' is used for offsets in hyphenation exceptions. + + * tmac/hyphen.us: Replace with contents of unmodified `hyphen.tex'. + + * NEWS, man/groff_diff.man, man/groff.man: Document it. + +2002-03-20 Larry Kollar + + * doc/groff.texinfo: Add documentation for `hpfa' and `trin' + requests. + +2002-03-18 Werner LEMBERG + + * tmac/html.tmac: Fix serious typo. + +2002-03-17 Larry Kollar + + * doc/groff.texinfo: Add documentation for `writec' request. + +2002-03-17 Werner LEMBERG + + Added request `hpfa' to append hyphenation patterns. + + * src/roff/troff/env.cc (hyphen_trie::read_patterns_file): Add + parameter `append'. + (hyphenation_patterns_file): Renamed to... + (do_hyphenation_patterns_file): This. + (hyphenation_patterns_file, hyphenation_patterns_file_append): New + functions. + (init_hyphen_requests): Updated. + * NEWS, man/groff.man, man/groff_diff.man: Document it. + +2002-03-16 Werner LEMBERG + + Added request `writec' in analogy to `tmc'. + + * src/roff/troff/input.cc (write_request): Renamed to... + (do_write_request): This. + Added one parameter. + (write_request, write_request_continue): New functions. + (init_input_requests): Updated. + * NEWS, man/groff.man, man/groff_diff.man: Document it. + + * font/devdvi/DESC.in (sizes): Allow all sizes in the range + 5-10000pt. + * NEWS: Document it. + +2002-03-15 Werner LEMBERG + + * man/groff.man: Add writem request. + + Add request `trin' (translate input) to make `.asciify' work + correctly. This is necessary since `charXXX' entity names are no + longer hardcoded in font definition files. + + * src/roff/troff/charinfo.h (charinfo): Add `asciify_code' and + `translate_input' members. + (charinfo::set_asciify_code, charinfo::get_asciify_code, + charinfo::set_translation_input): New methods. + (charinfo::set_translation): Add third argument. + * src/roff/troff/input.cc (charinfo:set_translation): Set + `asciify_code'. + (do_translate): Add second argument. + (translate_input): New function. + (init_input_requests): Updated. + * src/roff/troff/node.cc (glyph_node::asciify, + composite_node::asciify): Use `get_asciify_code'. + + * tmac/cp1047.tmac, tmac/latin1.tmac: Use `trin'. + + * NEWS, man/groff.man, man/groff_diff.man: Updated. + +2002-03-14 Larry Kollar + + * doc/groff.texinfo: Improve documentation of .RS and .RE. + +2002-03-14 Werner LEMBERG + + Add a new request `sizes' similar to the `sizes' command in DESC + files. + + * src/roff/troff/env.cc (override_sizes): New function. + (init_env_requests): Use it. + * src/roff/troff/token.h: Export `read_string'. + * NEWS, man/groff_diff.man, man/groff.man: Document it. + +2002-03-12 Werner LEMBERG + + * doc/groff.texinfo: More fixes for texinfo 4.1 and higher. + +2002-03-10 Werner LEMBERG + + * tmac/pspic.tmac: Add support for -Tdvi. + * tmac/dvi.tmac: Include pspic.tmac. + * src/devices/grodvi/grodvi.man: Document it. + * NEWS: Updated. + + * font/devlj4/generate/Makefile: Fix URL of metric files. + +2002-03-09 Werner LEMBERG + + * PROBLEMS: The static constructor bug has been fixed in z/OS V1R3. + +2002-03-09 Larry Kollar + + * tmac/groff_ms.man: Add documentation for RS and RE macros. + +2002-03-08 Werner LEMBERG + + * doc/groff.texinfo: Fixes for texinfo 4.1. + +2002-03-07 Werner LEMBERG + + * src/include/lib.h: Include getopt.h if groff-getopt.h can't be + included. + Handle CYGWIN properly. + +2002-03-07 Paco Andrés Verdú + + * font/devlbp/Makefile.sub (DEVFILES): Add some missing fonts. + * tmac/lbp.tmac: Add some font translations. + +2002-03-02 Werner LEMBERG + + * font/devcp1047/R.proto, font/devlatin1/R.proto, + font/devhtml/R.proto: Remove `charXXX' entries. + * tmac/tty.tmac, tmac/html.tmac: Load latin1.tmac or cp1047.tmac + where appropriate. + + * font/devlj4/generate/text.map: Remove `charXXX' entries. + * font/devlj4/*: Regenerated all font definition files. + * tmac/lj4.tmac: Load latin1.tmac. + + * src/utils/hpftodit/hpftodit.cc (do_file): Partially undo change + from 2000-06-17: LJ4 metric files are *not* text files. + + * tmac/troffrc, tmac/dvi.tmac, tmac/ps.tmac: Don't use .T string + register to test for EBCDIC. + +2002-03-01 Werner LEMBERG + + * src/utils/afmtodit/afmtodit.pl: Skip comment lines in encoding + files (as grops already does). + * src/utils/afmtodit/afmtodit.man: Document comment lines in map + files. + * src/devices/grops/grops.man: Document comment lines in encoding + files. + + * tmac/cp1047.tmac: New file. + * tmac/dvi.tmac, tmac/tty-char.tmac: Use it. + * tmac/ps.tmac: Load latin1.tmac or cp1047.tmac. + * tmac/Makefile.sub (NORMALFILES): Updated. + + * tmac/ec.tmac: Don't load latin1.tmac again. + + * font/devps/generate/lgreekmap, font/devps/generate/symbolchars, + font/devps/generate/dingbats.map, + font/devps/generate/dingbats.rmap, font/devps/text.enc, + font/devps/generate/Makefile (symbolmap): Add header comment. + * font/devps/generate/textmap: Ditto. + Remove `charXXX' entries. + * font/devps/symbolmap: Regenerated. + * font/devps/*: Regenerated all font definition files. + +2002-02-28 Werner LEMBERG + + Add color support to grodvi (for drawing colors are currently + translated to gray values). + + * src/devices/grodvi/dvi.cc (FILL_MAX): Removed. + (dvi_printer): Add `cur_color' member. + (dvi_printer::set_color): New function. + (draw_dvi_printer): Remove `fill'. + (draw_dvi_printer::fill_next): Pass environment as parameter. + Update code for new color support translated to gray. + (dvi_printer::set_char): Updated. + (dvi_printer::begin_page, dvi_printer::end_page): Handle color + changes crossing the page border. + (dvi_printer::draw): Updated. + Remove cases `f' and `F'. + * tmac/dvi.tmac: Add color definitions. + * NEWS, src/devices/grodvi/grodvi.man: Updated. + + * tmac/an-old.tmac (R): Make this a macro to emit a warning if + used incorrectly. + + * aclocal.m4 (GROFF_NEED_DECLARATION): Use test similar to recent + versions of autoconf. + * configure: Updated. + + * doc/homepage.ms: Use `.blm'. + * tmac/www.tmac (www-depth): New auxiliary variable. + (www-pop-level): Don't issue HTML tag. + (ULS, ULE, LI): Use absolute indentation. + + * src/devices/grops/ps.cc (ps_printer::begin_page, + ps_printer::end_page): Switch forth and back to default color while + starting a new page. + +2002-02-27 Werner LEMBERG + + Add EC and TC fonts to devdvi. + + * src/utils/tfmtodit/tfmtodit.man: Document patching of exbase.mf. + * font/devdvi/generate/cork.map: Renamed to... + * font/devdvi/generate/ec.map: This. + Remove entry for `aq'. + * font/devdvi/generate/tc.map: New file. + * font/devdvi/generate/Makefile (*EC, *TC): New creation rules for + EC and TC fonts. + (FONTS): Updated. + * font/devdvi/*EC, font/devdvi/*TC: New font definition files. + * font/devdvi/Makefile.sub (DEVFILES): Updated. + * tmac/ec.tmac: New file. + * tmac/Makefile.sub (NORMALFILES): Updated. + * NEWS, src/devices/grodvi/grodvi.man: Updated. + * man/groff_char.man: Check `ECFONTS' register. + + * font/devdvi/{TR,TI,TB,TBI,HR}: Fix `name' field. + +2002-02-26 Werner LEMBERG + + * font/devdvi/generate/*.map: Remove all `charXXX' entries. + * font/devdvi/generate/cork.map: Add 'y and 'Y. + * font/devdvi/*: Updated. + * tmac/dvi.tmac: Formatting. + + Add font `HBI' for the dvi output. + Add support for font families `T' and `H'. + + * font/devdvi/HBI: New file. + * font/devdvi/B: Renamed to ... + * font/devdvi/TB: This. + * font/devdvi/BI: Renamed to ... + * font/devdvi/TBI: This. + * font/devdvi/I: Renamed to ... + * font/devdvi/TI: This. + * font/devdvi/R: Renamed to ... + * font/devdvi/TR: This. + * font/devdvi/H: Renamed to ... + * font/devdvi/HR: This. + * font/devdvi/Makefile.sub (DEVFILES): Updated. + * font/devdvi/generate/Makefile (HBI): New rule. + (FONTS): Updated. + (R, I, B, BI, H): Renamed to ... + (TR, TI, TB, TBI, HR): This, respectively. + (srcdir): Fixed. + * NEWS, src/devices/grodvi/grodvi.man: Updated. + * font/devdvi/DESC.in: Don't mount R, I, B, BI, and CWI. + Add `styles' and `family' keywords. + * tmac/dvi.tmac: Alias `H' to `HR'. + Add some fspecial requests for italic fonts. + Add TR and TI as special. + Add support for `_' with font CWI. + + * src/roff/troff/number.cc (parse_expr): Add missing `break' for + operator `:'. Until now, the expression `0:1' would return 2 + instead of 1. + +2002-02-25 Werner LEMBERG + + * man/groff_char.man: Added some missing PS glyph names (from the + Adobe Glyph List). + * font/devps/generate/textmap, font/devps/symbolmap: Add + `arrowupdn'. + + * doc/groff.texinfo: Minor additions and fixes. + * man/groff_diff.man: Remove documentation of fp request. This + is already covered in the original troff manual. + Updated to be consistent with other doc files. + * NEWS: Updated. + +2002-02-24 Werner LEMBERG + + * aclocal.m4 (GROFF_EBCDIC): Don't include `font/devutf8' in + TTYDEVDIRS. + Define new variable OTHERDEVDIRS (containing `font/devlj4 + font/devlbp' if not EBCDIC). + * Makefile.in (TTYDEVDIRS): Always include `font/devutf8'. + (OTHERDEVDIRS): New variable. + (MDEFINES, DEVDIRS, ALLDIRS, DISTDIRS): Updated. + * configure: Regenerated. + + * NEWS, src/devices/grotty/grotty.man: Updated. + +2002-02-23 Werner LEMBERG + + * src/roff/troff/input.cc (do_overstrike, do_bracket, + get_line_arg): Honour input level. + + Add new symbol `mc' corresponding to U+00B5 MICRO SIGN. + + * font/*/*: Implement it in all font files. + * font/devps/generate/textmap, font/devps/generate/symbolchars, + * font/devps/symbolmap: Updated. + * font/devlj4/generate/text.map: Updated. + * font/devdvi/generate/CompileFonts (sizes): Add LaTeX sizes. + * font/devdvi/generate/texmi.map: Updated. + + * font/devutf8/R.proto: Remove all `charXXX' entries. + * font/devutf8/NOTES: Updated. + + * font/devX*/*: Regenerated with xtotroff, using fonts from XFree86 + version 4.1.0. + + * tmac/latin1.tmac, tmac/psold.tmac, tmac/tty-char.tmac: Updated. + + * NEWS, man/groff_char.man: Updated. + +2002-02-21 Phil Lobbes + + * src/include/lib.h [HAVE_SNPRINTF]: Include stdarg.h. + +2002-02-20 Ralph Corderoy + + * src/roff/grog/grog.pl: Fix computation of $refer. + +2002-02-19 Werner LEMBERG + + * src/include/lib.h [!HAVE_SNPRINTF]: Add declarations for + `snprintf' and `vsnprintf'. + + * src/include/htmlindicate.h: Renamed to... + * src/include/htmlhint.h: This. + * src/include/Makefile.sub: Updated. + * src/preproc/eqn/main.cc: Updated. + +2002-02-18 Werner LEMBERG + + * man/roff.man, man/groff_out.man, man/groff.man, + man/groff_diff.man, man/ditroff.man, src/roff/groff/groff.man, + src/roff/troff/troff.man: Updated to latest changes in www.tmac. + + * win32-diffs: Updated. + +2002-02-17 Werner LEMBERG + + * doc/Makefile (clean): Add *.eps. + (MEMACROS): Removed. + (TFLAG): New variable. + (TROFF): Use it. + Add -ww. + (GROFF): Use TFLAG, FFLAG, -U, -p, -e, -t, and -ww. + (.me.dit): Fixed. + (.ms.html, .ms.ascii, .ms.ps, homepage.html): Simplify. + + * tmac/www.tmac: Use dummy diversion while resetting and disabling + `.tl'. + * tmac/e.tmac: Inserted some more `\"' to remove warnings if used + unstripped. + * src/roff/troff/troff.man: Fix order of parameter description. + + * NEWS: Updated. + +2002-02-16 Gaius Mulley + + Simplify image handling for grohtml. + Fix

bug. + + * src/devices/grohtml/html-text.cc (DEBUGGING): Don't undefine but + comment out. + (html_text::dump_stack): Don't emit newline while debugging. + (html_text::do_push) [DEBUGGING]: Print more info. + (html_text::check_emit_text): Fix handling of

. + * src/devices/grohtml/html.h: Updated. + * src/devices/grohtml/output.cc (FPUTC, FPUTS, PUTC): New macros, + replacing `fputc', `fputs', `putc'. If DEBUGGING is defined, they + send its data to stderr also. + Update all callers. + (simple_output::space_or_newline) [DEBUGGING]: Removed. + * src/devices/grohtml/post-html.cc (html_printer::do_links, + html_printer::html_printer): Remove `DEBUGGING' conditionals. + + * src/include/html-strings.h (HTML_IMAGE_{CENTERED,LEFT,RIGHT,END}): + Removed. + * src/libs/libgroff/htmlhint.cc (is_in_graphic_start, + is_inline_image): Removed. + (html_begin_suppress, html_end_suppress): Don't take a parameter. + (graphic_start, graphic_end): Removed. + * src/include/htmlindicate.h: Updated. + * src/preproc/html/pre-html.cc (DEBUG_HTML): Removed. + (macroset_template): New global variable. + (makeFileName): Use `macroset_template'. + (write_end_image): Don't take a parameter. + Don't emit newline. + (write_start_image: Don't emit newline. + (char_buffer::write_upto_newline): Updated. + (char_buffer::skip_to_newline): Renamed to ... + (char_buffer::skip_until_newline): This. + Fix code. + (char_buffer::write_file_troff, char_buffer::write_file_html): + Simplified. + (createAllPages, createImage) [DEBUGGING]: Handle `debug' flag. + (removeAllPages): Remove `DEBUGGING' conditionals. + (addRegDef, dump_args): New functions. + (char_buffer::do_html, char_buffer::do_image): Handle + `www-image-template' command line variable. + Add more debugging code. + (addps4html): Removed. + (removeTempFiles) [DEBUGGING]: Handle `debug' flag. + + * src/preproc/eqn/main.cc: Include `ctype.h'. + (suppress_html): Removed. + (do_file): Updated. + (inline_equation): Use `html_begin_suppress' and + `html_end_suppress'. + * src/preproc/pic/troff.cc: Don't include `htmlindicate.h'. + (troff_output::start_picture, troff_output::finish_picture): + Updated. + * src/preproc/tbl/main.cc: Don't include `htmlindicate.h'. + (process_input_file): Updated. + + * src/roff/troff/div.cc (page_number): Set page number only if the + `ps4html' register isn't defined. + * src/roff/troff/input.cc (image_no): New external variable. + (do_suppress): Use it. + * src/roff/troff/node.h (suppress_node::image_id): New member. + * src/roff/troff/node.cc (image_no): Remove `static' keyword. + (suppress_node::suppress_node): Initialize `image_id' member. + (suppress_node::same): Handle `image_id' also. + (suppress_node::copy): Updated. + (last_image_id): New global variable. + (suppress_node::tprint): Use it. + + * tmac/an-old.tmac (TS, TE, EQ, EN): Use HTML-IMAGE and + HTML-IMAGE-END. + * tmac/pspic.mac (PSPIC): Fix html support. + * tmac/s.tmac (@EQ, @EN, @TS, TE, PS, PE): Ditto. + * tmac/www.tmac (www-image-template): Set up. + (HTMLINDEX): Renamed to... + (HX): This. + (BODYCOLOR): Renamed to... + (BCL): This. + (BACKGROUND): Renamed to... + (BGIMG): This. + (URL): Change order of parameters for consistency. + (MAILTO): Renamed to... + (MTO): This. + (IMAGE, PNG-IMAGE, MARGIN-PNG-IMAGE): Renamed to... + (IMG, PIMG, MPIMG): This. + (HTML-H-BEGIN, HTML-H-END): Renamed to... + (HnS, HnE): This. + (LINKS): Renamed to... + (LK): This. + (LINE): Renamed to... + (HR): This. + (NO-AUTO-RULE): Renamed to... + (NHR): This. + (HTML-TL): Renamed to... + (HTL): This. + (UL-BEGIN, UL-END): Renamed to... + (ULS, ULE): This. + (DROPCAP): Renamed to... + (DC): This. + (TS, TE, EQ, EN): Provide default definitions. + (www-make-unique-name): Updated. + (HTML-IMAGE-INLINE): Fix typo. + * tmac/groff_www.man: Updated. + + * doc/Makefile (homepage.html): Add option -r to grohtml. + Use shortened image name. + * doc/groff.texinfo: Updated info on grohtml strings and macros. + * doc/homepage.ms: Updated and extended. + +2002-02-14 Werner LEMBERG + + Don't use `CSI 39 m' and `CSI 49 m' but `CSI 0 m'. + + * src/devices/grotty/tty.cc (SGR_DEFAULT_COLOR, + SGR_BACK_DEFAULT_COLOR): Replaced with ... + (tty_printer::put_color): Use it. + (ttr_printer::end_page): Simplify. + +2002-02-13 Werner LEMBERG + + * tmac/groff_tmac.man: Moved to... + * man/groff_tmac.man: This place. + * tmac/Makefile.sub, man/Makefile.sub: Updated. + +2002-02-12 Werner LEMBERG + + * src/libs/libgroff/Makefile.sub (snprintf.o): Don't use + $(COMPILE.c) to not include groff's assert.h. + + * src/drivers/grotty/tty.cc (main): Add GROFF_NO_SGR environment + variable. + * NEWS, src/drivers/grotty/grotty.man: Document it. + +2002-02-11 Werner LEMBERG + + * src/libs/snprintf/snprintf.c: Updated to latest version + (2002-02-11). + + * src/roff/grog/grog.pl (process): Fix handling of `.['. We now + test whether there is `.]' also. + Don't check for spaces after `.['. + * src/roff/grog/grog.sh: Do the same. + +2002-02-10 Werner LEMBERG + + Illegal -> Invalid. + + * src/libs/libgroff/illegal.cc: Renamed to ... + * src/libs/libgroff/invalid.cc: This. + (illegal_char_table): Renamed to ... + (invalid_char_table): This. + * src/libs/libgroff/Makefile.sub: Updated. + * win32-diffs: Updated. + + * doc/groff.texinfo, src/devices/grops/psrm.cc (ps_get_line), + src/libs/libdriver/input.cc (fatal_command, parse_color_command, + parse_x_command), src/libs/libgroff/font.cc (text_file::next, + font::load), src/preproc/eqn/main.cc (read_line, main), + src/preproc/eqn/lex.cc (file_input::read_line), + src/preproc/pic/lex.cc (file_input::read_line, + simple_file_input::get, simple_file_input::peek), + src/preproc/pic/main.cc (top_input::get, top_input::peek), + src/preproc/pic/pic.man, src/preproc/refer/main.cc + (input_stack::push_file), src/preproc/refer/refer.cc (do_file, + do_bib), src/preproc/tbl/main.cc (table_input::get), + src/preproc/grn/grn.man, src/preproc/grn/main.cc (interpret), + src/roff/troff/input.cc (file_iterator::fill, file_iterator::peek, + do_zero_width, read_request, encode_char, ps_get_line, + transparent_file, get_char_for_escape_name, transparent_translate, + asciify, input_char_description, read_string, set_string), + src/roff/troff/env.cc (environment::add_html_tag), + src/roff/troff/troff.man, tmac/e.tmac (`@(', `(f'): Do it. + + * src/include/lib.h: Updated. + + * src/preproc/eqn/eqn.cc: Removed. + + * NEWS: Updated. + + * src/preproc/grn/hdb.cc (DBRead): Fix fscanf() fields. + +2002-02-09 Werner LEMBERG + + * doc/gnu.xpm: New image. + * doc/Makefile (DOCS): Add homepage.ps. + Add rules for converting xpm->png and xpm->eps. + Use `gnu.{xpm,eps}' as image names. + * doc/homepage.ms: Updated. + +2002-02-09 Gaius Mulley + + * tmac/www.tmac (www-error): New macro, replacing calls to `@error'. + (IMAGE): Change image position parameters to `-L', `-R', and `-C'. + Remove calls to `B1' and `B2' + (PNG-IMAGE): New macro for inclusion of images in PNG format. + (www-left-ll-trap, www-left-po-trap, www-right-ll-trap): New + auxiliary variables for MARGIN-PNG-IMAGE. + (www-finish-left-po, www-finish-right-ll, www-finish-left-ll): New + auxiliary macros for MARGIN-PNG-IMAGE. + (MARGIN-PNG-IMAGE): New macro to put an image in PNG format into + the margin. + (www-heading-no): New auxiliary variable for HTML-H-{BEGIN,END}. + (HTML-H-BEGIN, HTML-H-END): New macros to begin and end a heading. + (DROPCAP): New macro to produce dropcap characters. + (www-do-image): Renamed back to... + (HTML-DO-IMAGE): This. + Updated all callers. + + * doc/Makefile (gnubw.eps): Updated. + * doc/homepage.ms: Updated. + +2002-02-08 Werner LEMBERG + + * doc/pic.ms: Fixed typos (\(*tx -> \*(tx). + Added `linethick' to table in section `Style Variables'. + +2002-02-08 Gaius Mulley + + * src/libs/libdriver/input.cc (get_extended_arg): Fix conditional. + +2002-02-07 Werner LEMBERG + + Adding options -C (compatibility mode) and -c (grotty's old output + scheme) to nroff. + + * src/roff/nroff/nroff.sh: Implement it. + Remove `-Wall'. + * NEWS, src/roff/nroff/nroff.man: Updated. + + * PROBLEMS: Document bison 1.32 bug. + + Some fixes to make groff compile on z/OS 1.2 UNIX (was OS/390). + + * src/roff/troff/node.cc (make_tfont): Define it earlier. + * src/roff/troff/div.h: Add prototype for `end_diversions'. + * src/roff/troff/input.cc: Add prototype for `process_input_stack'. + * src/roff/troff/env.h: Add prototype for `title'. + + Adding EBCDIC support to grotty. + + * src/devices/grotty/tty.cc (CSI): New macro. + (SGR_*, tty_printer::put_color): Use it. + +2002-02-06 Werner LEMBERG + + Implementing color support in grotty. The new switch -c activates + the old drawing scheme, disabling color at the same time. The new + switch `-i' selects italic instead of underlining (SGR only). + + * src/devices/grotty/tty.cc (putstring): New define instead of + `fputs'. Updated all callers. + (old_drawing_scheme): New global variable. + (COLOR_CHANGE): New enum value. + (SGR_*): New defines containing color handling escape sequences. + (TTY_MAX_COLORS, DEFAULT_COLOR_IDX): New defines. + (glyph): New members `back_color_idx' and `fore_color_idx'. + (glyph::order): Add COLOR_CHANGE. + (tty_printer): New members `cur_fore_idx', `curr_back_idx', + `is_underline', `is_bold', `cu_flag', `tty_colors'. + New methods `make_underline', `make_bold', `color_to_idx', + `change_color', `put_color'. + (cu_flag): Moved into `tty_printer' class. + (tty_printer::tty_printer): Initialize colors. + (tty_printer::add_char, tty_printer::set_char, tty_printer::special, + tty_printer::draw, tty_printer::end_page): Handle colors also. + (main): Add options `-c' and `-i'. + (usage): Updated. + * NEWS, src/devices/grotty/grotty.man: Updated. + + * src/include/errarg.h (errarg): Add support for `unsigned int'. + * src/libs/libgroff/errarg.c: Implement it. + + * src/include/printer.h (printer): Add `change_color' method + (currently used by grotty only). + * src/libs/libdriver/printer.cc: Implement it. + * src/libs/libdriver/input.cc (parse_D_command, do_file): Add + call to `pr->change_color'. + + * src/roff/troff/node.cc (troff_output_file::fill_color, + troff_output_file::glyph_color): Call `do_motion'. + + * tmac/tty.tmac: Add color definitions. + + * src/roff/groff/groff.man: Minor fixes. + +2002-02-05 Bernd Warken + + * src/libs/libdriver/input.cc: Introduce `EnvInt' typedef and use + it. This is a preparation for future changes. + +2002-02-05 Werner LEMBERG + + * src/roff/troff/input.cc (process_input_stack): Fix the case + where leading spaces are followed by \f or \s; previously, an + incorrect space width has been used. + + * doc/roff.man (quoted_char): Fix argument. + (comment): Define string. + +2002-02-04 Larry Kollar + + * doc/groff.texinfo: More fixes. + +2002-02-04 Werner LEMBERG + + * src/preproc/eqn/box.cc (output_string): Don't use \\*[...]. + * src/preproc/eqn/main.cc (do_file, inline_equation): Call + `restore_compatibility' before `output_string' -- the LINE_STRING + register now already contains proper switches from and to + compatibility mode. + + * man/groff_char.man: Add Euro symbol. + * man/groff_diff.man: Improve documentation of `.am1' and `.as1'. + * tmac/tty.tmac: Add `EUR' as replacement for `eu' and `Eu'. + * doc/groff.texinfo (Defstr*): Print strings with full syntax. + Other minor fixes. + + * doc/Makefile (.SUFFIXES, .texinfo.pdf, clean): Add support for + texinfo->pdf. + (.texinfo.html): Add support for texinfo->html. + +2002-02-03 Werner LEMBERG + + Added three new requests `ds1', `as1', and `ami'. The former two + are equivalent to `ds' and `as' with the difference that + compatibility mode is saved on entry, switched off during string + expansion, and restored on exit. The latter is the pendant to `dei' + for `am'. + + (do_define_string): Use `define_mode' and `calling mode'. + Insert COMPATIBLE_SAVE and COMPATIBLE_RESTORE at the beginning and + end of string, respectively. + (define_string, append_string): Use `calling_mode'. + (define_nocomp_string, append_nocomp_string, + define_string_indirect): New functions. + (init_input_requests): Updated. + * NEWS, man/groff_diff.man, man/groff.man: Document it. + + * src/preproc/eqn/box.cc (box::top_level, box::extra_space): Use + `as1' for assigning LINE_STRING (this is `10' usually). Sun's + mm macro package accesses this string register directly. + * src/preproc/eqn/main.cc (inline_equation): Use `as1'. + + * tmac/trace.tmac: Trace calls to `am' also. Make it work in + compatibility mode. + +2002-02-02 Larry Kollar + + * doc/groff.texinfo, tmac/groff_ms.man: More fixes. + +2002-01-31 Werner LEMBERG + + * tmac/an-old.tmac (I): Use \, and \/ to improve spacing. + +2002-01-31 Bernd Warken + + * src/devices/grolbp/lbp.cc (main): Delete `pr'. + * man/groff_out.man: Revised and updated. + +2002-01-30 Bernd Warken + + * src/libs/libdriver/input.cc [USE_ENV_STACK]: New macro to comment + out the unused `{' and `}' commands. Undefined by default. + (IntArray): Make `data' private. + (IntArray::operator[], IntArray::get_data, IntArray::len): Use these + new methods instead. + (skip_line_D, skip_to_end_of_line): New functions. + (get_D_fixed_args): Use `skip_line_D'. + Changed to handle dummy odd arguments by ... + (get_D_fixed_args_odd_dummy): This new function. + (get_D_variable_args): Split some code into ... + (get_possibly_integer_args): This new function. + (send_draw): Use more `const'. + (delete_current_env): New function. + (position_to_end_of_args): Use `size_t'. + Updated. + (send_draw): Updated. + (parse_D_command): Handle `c', `C', and `t' better. + Updated. + (do_file): Updated. + +2002-01-29 Werner LEMBERG + + * NEWS: Revised. + * doc/groff.texinfo: Introduce @Def...List, @Def...Item, and + @Def...ListEnd which replaces @Def...x. This is necessary to get + proper HTML output -- see the comment in the file for more + information. + Updated all calls. + +2002-01-29 Gaius Mulley + + Fixes to make color changes of 2002-01-21 work with grohtml. + + * src/devices/grohtml/post-html.cc (style): Updated. + (html_printer): Remove unused methods. + (html_printer::do_font, html_printer::draw, html_printer::set_char, + html_printer::special): Updated. + * src/devices/grohtml/html-text.cc (debugStack, turnDebug, + html_text::dump_stack_element, html_text::dump_stack) [DEBUGGING]: + Added some debugging code. + (html_text::start_tag): Updated. + (html_text::do_push): New method. + (html_text::push_para): Call it. + Add method for handling color. + (html_text::do_color): Updated. + (html_text::shutdown): Handle color. + * src/devices/grohtml/html-text.h (tag_definition): New member + `col'. + Updated. + +2002-01-28 Werner LEMBERG + + * tmac/ps.tmac, tmac/html.tmac: Fix compatibility mode issues. + +2002-01-27 Gaius Mulley + + Add two switches -a and -g to control the antialiasing bits for + text and graphics, respectively. + + * src/devices/grohtml/post-html.cc (main): Dummy code for `-a' and + `-g'. + * src/devices/grohtml/grohtml.man: Document them. + * src/preproc/html/pre-html.cc (MIN_ALPHA_BITS, MAX_ALPHA_BITS): + New macros. + (textAlphaBits, graphicAlphaBits, antiAlias): New global variables. + (setupAntiAlias): New function. + (createAllPages): Updated. + (scanArguments): Handle `-a' and `-g'. + (main): Call `setupAntiAlias'. + * NEWS: Updated. + +2002-01-27 Werner LEMBERG + + * doc/groff.texinfo (Def*): Call index function after deffn. + + * tmac/html.tmac: Call `nroff' request. + +2002-01-26 Larry Kollar + + * tmac/groff_ms.man: Add some omissions. + +2002-01-25 Larry Kollar + + * tmac/groff_ms.man: Typographical improvements. + +2002-01-25 Werner LEMBERG + + * doc/groff.texinfo: Updated version and copyright. + * src/devices/grops/grops.man: Updated. + + * tmac/groff_tmac.man: Fix `ig' macro. + + * tmac/an-old.tmac (ne): Redefine `ne' request to be a no-op in + nroff mode. + Use `.ne' unconditionally everywhere. + (TS): Only insert some vertical space. Doing a page break is no + longer necessary due to the redefinition of the `ne' request. + + * src/libs/libdriver/input.cc (parse_D_command): Don't emit a + warning for unknown subcommands but parse and pass them to the + device driver. + +2002-01-24 Werner LEMBERG + + * tmac/groff_www.man, NEWS: Fix typos. + +2002-01-21 Werner LEMBERG + + Complete revision of color support: + + Adapt programs to the new libdriver/input.cc. + + Color spaces are no longer converted to RGB but transferred as-is + in the troff intermediate output format. + + Handle default color gracefully. troff now supports a `default' + color (which can't be changed). + + grops will now use the proper color space functions if available. + + Update pic. + + Note that currently grohtml doesn't handle colors properly. This + has to be fixed. + + * src/libs/libgroff/itoa.c (UINT_DIGITS): New macro. + (ui_to_a): New function. + * src/include/lib.h: Updated. + + * src/include/color.h (color_scheme): Replace `NONE' with `DEFAULT'. + (color): Simplified; removed all `double' members and methods. + A new array `components' now holds the color parameters. + (color::is_default, color::get_components): New methods. + (color::operator==, color:operator!=): New. + (Red, Green, Blue, Cyan, Magenta, Yellow, Black, Gray): New macros + to make access to the `components' array more comprehensible. + * src/libs/libgroff/color.cc: Implement new color support. + (atoh): Small fixes. + (color::read_encoding): Simplified for new troff intermediate color + output format. + (default_color): New global variable. + + * src/roff/troff/input.cc (default_symbol): New global variable. + (lookup_color): Use it. + (default_black): Removed. + (do_glyph_color, do_fill_color): Simplified. + (define_color): Handle default color. + Improve warnings. + (do_if_request): Handle default color. + * src/roff/troff/env.cc (environment::environment): Initialize + colors with `default_color'. + * src/roff/troff/node.cc (troff_output_file::put): Add method + for `unsigned int'. + (troff_output_file::hex): Removed. + (troff_output_file::fill_color, troff_output_file::glyph_color): + Updated to include/color.h and libdriver/input.cc. + + * src/preproc/pic/object.cc (draw_arrow): New parameter to set + fill color properly (identically to the outline color). \D'f...' + doesn't work any more. + All function calls to it updated. + + * src/devices/grohtml/post-html.cc (html_printer::do_body, main): + Updated. + * src/devices/grohtml/html-text.cc (html_text::issue_color_begin): + Updated. + + * src/devices/grops/ps.cc (ps_output::put_color): New method. + (ps_printer::sbuf_color): Make a real member instead of pointer. + (ps_printer::fill_color, ps_printer::output_color): Removed. + (ps_printer::ps_printer): Updated. + (ps_printer::set_char): Ditto. + (ps_printer::set_color): Use various color schemes. + Use `put_color' method. + (ps_printer::flush_sbuf): Don't set color. + (ps_printer::fill_path): Take `environment' as parameter. + Simplify color handling. + (ps_printer::set_line_thickness): Renamed to ... + (ps_printer::set_line_thickness_and_color): This (and updated). + (ps_printer::set_color): Change second parameter from `complete' + to `fill' which better describes what it does. + (ps_printer::draw): Call `flush_sbuf' to output graphic commands + and text in the right order. + Updated. + Remove branches for `f' and `F'; this is handled by + libdriver/input.cc. + * src/devices/grops/ps.h: Updated. + * font/devps/prologue (FL): Redefined. + ({F,C}r,k,g: New color functions (with and without filling). + + * doc/pic.ms, src/preproc/pic/pic.man: Small fixes. + * man/groff_diff.man, man/groff.man, man/groff_out.man, + doc/groff.texinfo, NEWS: Updated. + +2002-01-20 Bernd Warken + + * src/libs/libdriver/input.cc: Completely rewritten. See comments + in this file for what has been changed. + +2002-01-19 Werner LEMBERG + + * test-groff: Fix GROFF_FONT_PATH. + * tmac/andoc.tmac: Add dummy macros for equation support -- eqnrc + is read before .TH or .Dd is parsed. + +2002-01-18 Gaius Mulley + + * src/libs/libgroff/geometry.cc (check_output_arc_limits): Fix + quadrant boundaries. + +2002-01-18 Werner LEMBERG + + * devices/grops/ps.cc: Aargh! Fix the fix of the incorrectly + applied last patch. + +2002-01-17 Ruslan Ermilov + + * tmac/doc.common: Initialize %I register for the %I macro to + avoid (harmless) warning. + * tmac/doc.tmac (Bd): There is no reason to enforce -compact + when in the SYNOPSIS section. + +2002-01-17 Bruno Haible + + * src/preproc/pic/lex.cc (get_token): Fix typo. + +2002-01-17 Werner LEMBERG + + * devices/grops/ps.cc: Fix incorrectly applied last patch. + +2002-01-17 Larry Kollar + + * tmac/groff_ms.man: Completely rewritten. + +2002-01-16 Werner LEMBERG + + * tmac/an-old.tmac (TS): Force break, inserting some vertical space. + +2002-01-15 Gaius Mulley + + * devices/grops/ps.cc (ps_printer::fill_path): Fix handling of + fill colors. + (ps_printer::draw): Ditto. + +2002-01-14 Ruslan Ermilov + + * tmac/groff_mdoc.man: Minor fixes. + +2002-01-13 Werner LEMBERG + + * man/groff_out.man: Some fixes. + +2002-01-13 Gaius Mulley + + * doc/pic.ms: Fix typos. + +2002-01-12 Werner LEMBERG + + * doc/groff.texinfo, doc/groff.man: More on a printable backslash. + +2002-01-10 Werner LEMBERG + + * font/devutf8/R.proto, font/devhtml/R.prot: Add `Eu' and `eu' + symbols. + * NEWS: Updated. + +2002-01-09 Bernd Warken + + * man/groff_out.man: Revised. + * man/roff.man: Minor fixes. + * src/roff/troff/troff.man: Some reordering. + +2002-01-09 Werner LEMBERG + + * tmac/an-old.tmac: Add dummy macros for equation support. + +2002-01-07 Werner LEMBERG + + doc/groff.texinfo: Fix documentation of glyph searching algorithm. + + * tmac/an-old.tmac: Revert change 2001-12-23. This breaks too many + man pages. + * tmac/groff_man.man: Small improvements. + +2002-01-07 Bernd Warken + + * man/groff_diff.man: Revised. + +2002-01-06 Werner LEMBERG + + * tmac/www.tmac: Remove extraneous backslash. + +2002-01-06 Bernd Warken + + * man/ditroff.man, src/roff/groff/groff.man, man/groff.man: Revised. + +2002-01-05 Werner LEMBERG + + Integrated groffer, contributed by Bernd Warken. + + * contrib/groffer/*: New. + * Makefile.in, NEWS: Updated. + +2002-01-04 Werner LEMBERG + + * doc/groff.texinfo: Added macros `@Defmpreg' and `@Defmpregx' for + registers defined in macro packages. + Revising the ms part. + +2002-01-04 Larry Kollar + + * doc/groff.texinfo: Add documentation for ms macros. + +2002-01-02 Werner LEMBERG + + First step in adding PS support for the Euro symbol. `eu' is the + official Euro logo, `Eu' is a font-specific glyph variant. + + * font/devps/text.enc: Add `Euro' at position 9. + * font/devps/generate/textmap: Add `Euro' as symbol `Eu'. + * font/devps/symbolmap: Regenerated. + + * NEWS: Updated. + +2002-01-02 Bernd Warken + + * man/roff.man: Revised. + +2002-01-01 Bernd Warken + + * src/roff/groff/groff.man: Completely rewritten. + +2001-12-31 Werner LEMBERG + + * doc/Makefile: Updated. + +2001-12-30 Werner LEMBERG + + * tmac/www.tmac: Make all names of internal macros/registers/strings + lowercase, and prepend `www-'. + Other minor changes. + * src/roff/troff/troff.man: Add preprocessor string at BOF. + +2001-12-30 Gaius Mulley + + Implement option `-b' in grohtml to set the HTML background colour. + + * src/devices/grohtml/post-html.cc (default_background): New global + variable. + (html_printer::html_printer): Initialize `background' to + `default_background'. + (main): Implement option `-b'. + (usage): Updated. + * src/preproc/html/pre-html.cc (scanArguments): Add dummy handling + of `-b' option. + * src/devices/grohtml/grohtml.man: Updated. + * doc/Makefile (.ms.html): Use `-b'. + * tmac/html.tmac: Don't set background color. + + Add new grohtml tag `.html-tl'. + + * src/devices/grohtml/post-html.cc (title_desc): Add `with_h1' + member variable. + (title_desc::title_desc): Updated. + (html_printer::troff_tag): Handle `.html-tl'. + (html_printer::write_title): Use `with_h1'. + * tmac/www.tmac (www-end-nowhere): New auxiliary macro. + (HTML-TL): New macro. + + Add support for unordered lists in HTML. + + * tmac/www.tmac (www-level): New auxiliary register. + (www-level1, www-level2, www-level3): New auxiliary strings. + (www-push-level, www-pop-level): New auxiliary macros + (UL-BEGIN, UL-END, LI): User macros for unordered lists. + + Miscellaneous. + + * src/preproc/html/pre-html.cc (DEFAULT_IMAGE_RES): Increase to 100. + (DEFAULT_VERTICAL_OFFSET): Removed. + (IMAGE_BOARDER_PIXELS): Set to 0. + (A4_LENGTH, A4_OFFSET, LETTER_LENGTH, LETTER_OFFSET): New macros. + (vertical_offset): Initialize with 0. + (gsPaper): New global variable. + (get_resolution): Scan for and return unsigned int. + (get_papersize): New function to get paper length from devps/DESC. + (determine_vertical_offset): New function. + (createAllPages): Produce gray-level images and use proper page + length. + (createImage): Use `-quiet' option of pnmcrop. + (addZ): Fix passing of `-Z'. + (scanArguments): Fix handling of `-o'. + (main): Call `determine_vertical_offset'. + * src/devices/grohtml/post-html.cc (html_printer::draw): Comment out + code for `l'. + + * src/libs/libgroff/tmpfile.cc (add_tmp_file): Fix buffer length. + * src/roff/troff/node.cc (troff_output_file::check_charinfo): Handle + glyph descenders properly. + + * doc/homepage.ms: Include `gnubw.eps'. + * doc/Makefile (gnubw.eps): New rule. + (homepage.html): Depend on `gnubw.eps'. + +2001-12-25 Werner LEMBERG + + * src/roff/troff/input.cc (default_black): Fix return value. + +2001-12-24 Ruslan Ermilov + + * tmac/doc-common (Dt): Change output of architecture strings. + Do some syntax cleanup. + * tmac/groff_mdoc.man: Updated. + +2001-12-23 Werner LEMBERG + + Adding an `itc' request (input line trap accepting \c). + + * src/roff/troff/env.h (environment): New member + `continued_input_trap'. + Make `do_input_trap' a friend function instead of `input_trap'. + * src/roff/troff/env.cc (environment::environment, + environment::copy): Updated. + (environment::newline): Implement it. + (do_input_trap): New function. + (input_trap): Call `do_input_trap'. + (input_trap_continued): New function. + (init_env_requests): Updated. + * src/roff/troff/TODO: Updated. + + * tmac/an-old.tmac (SH, SS, B, I, SM, SB, TP): Use `.itc' instead of + `.it'. + + * src/preproc/grn/hdb.cc (DBRead): Really chop after 127 characters. + +2001-12-22 Ruslan Ermilov + + * tmac/doc-common, tmac/doc-syms: Small updates. + +2001-12-22 Colin Watson + + * tmac/an-old.tmac (an-p-footer): Set title length in environment 1. + +2001-12-22 Bernd Warken + + * MANIFEST: New file. + +2001-12-22 Werner LEMBERG + + * src/preproc/grn/grn.man: Updated. + +2001-12-22 Solar Designer + + * src/preproc/grn/hdb.cc (MAXSTRING_S): New macro. + (DBRead): Use it. + +2001-12-19 Werner LEMBERG + + Implement a fallback character request `.fchar'. + + * src/roff/troff/charinfo.h (charinfo): New flag `fallback'. + (is_fallback): New inline function. + * src/roff/troff/input.cc (do_define_character): New function. + (define_character): Call `do_define_character'. + (define_fallback_character): New function. + (init_input_requests): Add `fchar'. + (charinfo::charinfo): Updated. + (charinfo::set_macro): New argument to set `fallback' flag. + * src/roff/troff/node.cc (make_glyph_node, make_node, + node::add_char): Check `fallback' flag. + * NEWS, man/groff_diff.man, man/groff_man: Updated. + +2001-12-16 Werner LEMBERG + + * groff.texinfo: Document exact search algorithm for glyphs. + +2001-12-15 Werner LEMBERG + + * Makefile.cpg, Makefile.ccpg, Makefile.man: Add dummy file to + the left side of $(MANPAGES) rule to make it always non-empty. + +2001-12-14 Werner LEMBERG + + * src/roff/troff/input.cc (default_black): Define default color + `black' if not yet defined. + +2001-12-13 Werner LEMBERG + + Implement new string-valued register `.fn' to return the current + real (internal) font name. + + * env.cc (environment::get_font_name_string): New function. + (init_env_requests): Add `.fn' register. + * env.h (environment): Updated. + * node.cc (font_info): Make `get_font_name' a friend. + (get_font_name): New function. + * node.h: Updated. + + * man/groff_diff.man, man/groff.man, NEWS: Updated. + +2001-12-12 Ralph Corderoy + + * src/preproc/eqn/main.cc (inline_equation): Fix typos. + +2001-12-12 Werner LEMBERG + + * tmac/groff_man.man, doc/groff.texinfo: There is no .R macro. + +2001-12-10 Gaius Mulley + + * man/groff_diff.man: Adding documentation for \O. + +2001-12-10 Werner LEMBERG + + * src/preproc/html/pre-html.cc (TROFF_COMMAND): Removed. + (scanArguments): Use PROG_PREFIX for the name of the troff binary. + +2001-12-09 Werner LEMBERG + + * man/roff.man: Revised. + * src/roff/groff/groff.man: Replace man page references with a + pointer to roff.man. + +2001-12-09 Bernd Warken + + * man/roff.man: Completely rewritten. + +2001-12-06 Ralph Corderoy + + * src/preproc/eqn/main.cc (inline_equation): Improve error message. + +2001-12-05 Werner LEMBERG + + * src/roff/troff/input.cc (get_delim_file_name): Removed since no + longer used. + * src/devices/grohtml/post-html.cc (html_printer::html_printer): Fix + order of initializers. + * NEWS: Updated. + +2001-12-05 Gaius Mulley + + * doc/groff.texinfo: Fix documentation of \O. + + * src/devices/grohtml/html-text.cc (html_text::do_indent, + html_text::do_table, html_text::do_emittext, html_text::do_para): + Use `const' for first argument. + (html_text::do_table): Use cast. + * src/devices/grohtml/html-text.h: Updated. + * src/devices/grohtml/output.cc (simple_output::put_string): Add + method for `const string &s'. + * src/devices/grohtml/html.h: Updated. + * src/devices/grohtml/post-html.cc (MAX_STRING_LENGTH): Removed. + (ANCHOR_TEMPLATE): Modified. + (manufacture_headings): New global variable to handle `-h' option. + (is_subsection): Removed. + (char_buffer::add_string): Add `const' to first argument. + Protect against invalid string argument. + Add method for `const string &s'. + (text_glob): Completely redesigned. + (page): Use `const' for strings and remove string length variable. + (page::add_html): Removed. + (page::add_end_encode): New member function. + (to_unicode): Moved upwards. + (title_desc, header_desc): Updated. + (header_desc::write_headings): Updated to new ANCHOR_TEMPLATE + definition. + (html_printer::is_bold, html_printer::make_bold): New member + functions. + (html_printer::end_of_line): Updated. + (generate_img_src, html_printer::do_auto_image, + html_printer::do_title, html_printer::write_header, + html_printer::determine_header_level, html_printer::do_heading, + html_printer::do_linelength, html_printer::do_pageoffset, + html_printer::do_indentation, html_printer::do_tempindent, + html_printer::do_indentedparagraph, html_printer::do_break, + html_printer::flush_sbuf, get_html_translation, + html_printer::begin_page, html_printer::special): Rewritten to get + rid of static string length limit. + (html_printer::troff_tag): Added `.no-auto-rule'. + (html_printer::flush_globs): Small fix. + (html_printer::determine_space): Don't compute `space_width'. + (html_printer::translate_to_html): Renamed to ... + (html_printer::emit_html): This (with updates). + (html_printer::write_header): Implement `-h' option. + (html_printer::draw): Remove commented-out code. Handle `F' + command. + (html_printer::add_char_to_sbuf): Removed. + (html_printer::add_to_sbuf): Rewritten. + (html_printer::sbuf_continuation): Fixed. + (html_printer::seen_backwards_escape, reverse, + html_printer::remove_last_char_from_sbuf): Removed. + (char_translate_to_html, str_translate_to_html): Removed. + (html_printer::overstrike): New function member. + (html_printer::set_char): Use it. + (html_printer::do_body): New function member. + (html_printer::~html_printer): Use it. + (main): Handle `-h' option. + (usage): Updated. + * src/devices/grohtml/grohtml.man: Document -h switch. + + * src/preproc/html/pre-html.cc: Include searchpath.h + Replace `POSTSCRIPTRES' macro with `postscriptRes' variable. + (get_resolution): New function. + (checkImageDir): Use `0777' permissions in mkdir() + (write_start_image): Rewritten to use `\O[5...]'. + (createImage, generateImages): Updated. + (main): Handle `F' and `h' options. + Use `get_resolution'. + + * src/roff/troff/input.cc (begin, end, image): Removed. + (do_suppress): Take parameter. + Handle modified syntax of `\O'. + (token::next): Updated. + (init_markup_requests): Removed. + (main): Updated. + + * src/roff/troff/div.h: Add declaration for begin_page(). + + * tmac/color-html.tmac: Removed. Contents moved to... + * tmac/html.tmac: Here. Set background color. + * tmac/color.tmac: Removed. Contents moved to... + * tmac/ps.tmac: Here. + * tmac/www.tmac: Remove the title command when generating images + for html. + (NO_AUTO_RULE): New macro. + (HTML_DO_IMAGE): Use revised `\O' escapes. + * tmac/Makefile.sub, tmac/groff_www.man, tmac/troffrc: Updated. + +2001-12-02 Werner LEMBERG + + * tmac/groff_mdoc.man: Fix typo. + +2001-12-01 Colin Watson + + * man/roff.man: Fix typo. + +2001-11-29 Werner LEMBERG + + * src/libs/libbib/map.c, src/utils/pfbtops/pfbtops.c: Include + stdlib.h. + + * src/roff/troff/input.cc (read_draw_node): Emit error message if + more than one argument to \D'f ...'. + + * tmac/Makefile.sub (NORMALFILES): Add lbp.tmac. + +2001-11-28 Werner LEMBERG + + * tmac/an-old.tmac, tmac/doc.tmac: Assure that the macro package is + loaded only once. + + * tmac/groff_man.man: Minor cosmetic fix. + +2001-11-27 Werner LEMBERG + + * src/roff/groff/groff.man, tmac/groff_tmac.man, + tmac/groff_www.man: s/mwww/www/. + +2001-11-26 Werner LEMBERG + + * aclocal.m4 (GROFF_MKSTEMP): Implement test using C++ linkage. + * configure: Regenerated. + * win32-diffs: Updated. + + * tmac/groff_mwww.tmac: Renamed to ... + * tmac/groff_www.tmac: This. + * tmac/mwww.tmac: Removed. + * NEWS, tmac/Makefile.sub: Updated. + +2001-11-21 Werner LEMBERG + + * doc/groff.texinfo: Improve documentation of the `\v' escape. + Fix explanation of `\D' and `rt'. + +2001-11-20 Werner LEMBERG + + * tmac/an-old.tmac (an-header): Set header length equal to page + width. + * doc/groff.texinfo: Improve documentation of `ne' request. Other + minor fixes. + * NEWS: Small fix. + +2001-11-19 Werner LEMBERG + + * NEWS, man/Makefile.sub: Updated. + +2001-11-19 Bernd Warken + + * man/ditroff.man: New file. + +2001-11-17 Werner LEMBERG + + * man/groff_differences.man: Renamed to ... + * man/groff_diff.man: This. Updated. + * man/Makefile.sub, src/roff/troff/troff.man, NEWS: Updated. + + * src/preproc/html/pushbackbuffer.cc: Renamed to ... + * src/preproc/html/pushback.cc: This. Updated. + * src/preproc/html/pushbackbuffer.h: Renamed to ... + * src/preproc/html/pushback.h: This. + * src/preproc/html/Makefile.sub, src/preproc/html/pre-html.cc: + Updated. + + * src/libs/libgroff/htmlindicate.cc: Renamed to ... + * src/libs/libgroff/htmlhint.cc: This. + * src/libs/libgroff/Makefile.sub: Updated. + + * tmac/an-old.tmac (an-end): Fix page length. + +2001-11-16 Werner LEMBERG + + * NEWS, man/groff_differences.man, doc/groff.texinfo: Updated. + * man/Makefile.sub: Include groff_differences.man. + * VERSION: Set to 1.18. + * REVISION: Set to 0. + +2001-11-16 Bernd Warken + + * src/roff/troff/input.cc (do_define_macro): Allow whitespace before + the second dot (or ending macro name) to end a macro. + * doc/groff.texinfo: Doc fix. + +2001-11-16 Ruslan Ermilov + + * tmac/doc-common (doc-header): Handle very long document titles + better. + +2001-11-16 Werner LEMBERG + + * tmac/doc.tmac (doc-do-Bl-args): Fix .substring requests. + +2001-11-15 Werner LEMBERG + + * src/roff/troff/troff.man: Revised and split into troff.man and... + * man/groff_differences.man: New file. + * NEWS: Updated. + +2001-11-13 Werner LEMBERG + + * tmac/an-old.tmac (TS, TE): New macros for table support. + +2001-11-12 Werner LEMBERG + + * src/include/lib.h: Provide a fix for emx to not include + groff-getopt.h. + +2001-10-27 Werner LEMBERG + + * src/roff/troff/input.cc (substring_macro): Fix computation of + boundary values. + +2001-10-20 Werner LEMBERG + + Undo change from 2001-08-28. + + * src/roff/troff/input.cc (have_input): New global variable. + (token::next): Set `have_input' for \f, \H, \R, \s, and \S if not + in compatibility mode. + (process_input_stack): Use it. + +2001-10-19 Ruslan Ermilov + + * tmac/doc.tmac (doc-flag-recursion): Protect arguments against + being handled as end-of-sentence characters, + +2001-10-10 Gaius Mulley + + * src/roff/troff/input.cc (file_iterator): New members + `suppress_newline_flag' and `seen_escape'. + (file_iterator::next_file): Updated. + (file_iterator::fill): Use it. + (string_iterator): New member `suppress_newline_flag'. + (string_iterator::fill): Set it. + (get_color_element): Use MAX_COLOR_VAL. + * src/roff/troff/env.cc (environment): Remove `need_eol'. + (no_fill): Don't set `env->ignore_next_eol'. + (environment::newline): Handle `eol' tag properly. + Emit `eol.ce'. + (environment::add_html_tag): Set `env->ignore_next_eol'. + Don't handle `.ce'. + * src/roff/troff/env.h (environment): Updated. + + * src/devices/grohtml/post-html.cc (text_glob::is_eol_ce): New + member function. + (html_printer::outstanding_eol): New member function. + (html_printer::do_title): Use new functions. + (html_printer::troff_tag): Test `id_eol_ce'. + +2001-10-10 Werner LEMBERG + + * tmac/color.tmac, tmac/color-html.tmac: Use `.do' to make those + files work with -C also. + +2001-10-05 Werner LEMBERG + + * doc/pic.ms: Minor fix. + * src/preproc/html/pre-html.cc (scanArguments): Don't handle `-?' + as a valid command line switch. + * src/devices/grohtml/post-html.cc (main): Ditto. + (usage): Updated. + * src/devices/grohtml/grohtml.man: Updated. + * src/roff/groff/groff.cc (main): Pass `-v' to predriver also. + +2001-10-04 Werner LEMBERG + + Implementing color support in troff, pic, grops, and grohtml. These + changes are based on a major patch provided by Gaius Mulley + . + + New request: `defcolor', supporting rgb, cmy, cmyk, and gray + definitions with both hex values and fractions. + + New escapes: \m and \M for drawing and background color, + respectively. This corresponds to the troff output commands `m' + and `DF'. + + groff and troff accept command line switch `-c' to disable color + output (which is automatically disabled in compatibility mode). + + New scaling indicator `f' for fractions (1f = 65536u). + + New conditional operator `m' to test for defined colors with `if' + and `ie'. + + New keywords `color' (or `colour', `colored', `coloured'), `outline' + (or `outlined'), and `shaded' added to pic. + + * src/include/color.h: New file. + * src/include/driver.h: Include it. + * src/include/printer.h: Include color.h. + (environment): New members `col' and `fill'. + (printer): Remove `adjust_arc_center' member function. + * src/include/Makefile.sub: Updated. + + * src/libs/libdriver/input.cc (do_file): Initialize `env.col' and + `env.fill'. + Handle `m' and `DF' troff commands. + * src/libs/libgroff/color.cc: New file. + * src/libs/libgroff/Makefile.sub: Updated. + + * src/preproc/html/pre-html.cc (IMAGE_BORDER_PIXELS): Set to 2. + (stop): Removed. + (createImage): Fix computation of `y2'. + Use `pnmcrop' also. + (buffer::write_file_html): Remove calls to `stop'. + + * src/preproc/pic/common.h (common_output): New abstract function + members `set_color', `reset_color', `get_last_filled', and + `get_outline_color'. + * src/preproc/pic/object.h: Add `IS_SHADED' and `IS_OUTLINED'. + (object_spec): Add members `shaded' and `outlined'. + * src/preproc/pic/output.h (output): `command' is now abstract. + New function members `set_color', `reset_color', `get_last_filled', + and `get_outline_color'. + * src/preproc/pic/lex.cc (lookup_keyword): Recognize `colo[u]r[ed]', + `outline[d]', and `shaded'. + * src/preproc/pic/object.cc (output::command): Removed. + (output::set_location): Moved to output.h. + (graphic_object): Add protected members `outline_color' and + `color_fill'. + Add member functions `set_outline_color', `get_outline_color', and + `set_fill_color'. + (closed_object): Add member function `set_fill_color'. + Add member `color_fill'. + (graphic_object::print_text): Use `out->set_color' and + `out->reset_color'. + (box_object::print, ellipse_object::print, circle_object::print, + line_object::print, spline_object::print, arc_object::print): Ditto. + (object_spec::make_object): Implement `IS_OUTLINED' and `IS_SHADED'. + * src/preproc/pic/pic.y: Add tokens `COLORED', `OUTLINED', and + `SHADED', making them `%left'. + Add rules `object_spec [SHADED|COLORED|OUTLINED] text'. + * src/preproc/pic/tex.cc (tex_output): New dummy function members + `set_color', `reset_color', `get_last_filled', and + `get_outline_color'. + * src/preproc/pic/troff.cc (simple_output): New abstract function + members `set_color', `reset_color', and `get_last_filled'. + (simple_output::polygon, simple_output::circle, + simple_output::ellipse): Use `get_last_filled'. + (troff_output): New members `last_filled' and `last_outlined'. + New function members `set_color', `reset_color', `get_last_filled', + and `get_outline_color'. + (troff_output::finish_picture): Use `reset_color'. + (troff_output::set_fill): Test `last_filled'. + * src/preproc/pic/pic.man: Updated. + + * src/roff/groff/groff.cc (main): Implement `-c' option. + (synopsis, help): Updated. + src/roff/groff/groff.man: Updated. + + * src/roff/troff/troff.h: Include color.h. + (warning_type): Add WARN_COLOR. + * src/roff/troff/env.h (environment): New members + `{cur,prev}_{glyph,fill}_color'. + New member functions `get_{prev_,}{glyph,fill}_color'. + * src/roff/troff/env.cc: Initialize and implement them. + * src/roff/troff/input.cc: New global variable `disable_color_flag'. + Replace `NULL' with `0' everywhere for consistency. + (lookup_color, default_black, do_glyph_color, do_fill_color, + get_color_element, read_rgb, read_cmy, read_cmyk, read_gray, + define_color): New functions. + (token::next): Implement \M and \m escapes. + (do_if_request): Implement `m' operator. + (usage): Updated. + (main): Implement `-c' option. + (init_markup_requests): Add `defcolor' request. + (warning_table): Add `color' warning. + * src/roff/troff/node.h (glyph_color_node, fill_color_node): New + classes. + * src/roff/troff/node.cc (troff_output_file): New members + `current_{page,glyph}color'. New member functions `put_hex', + `glyph_color', and `fill_color'. + (glyph_color_node::*, fill_color_node::*): Implement it. + * src/roff/troff/number.cc (SCALE_INDICATOR_CHARS): Add `f'. + (parse_term): Add support for `f'. + * src/roff/troff/troff.man: Updated. + + * src/devices/grodvi/dvi.cc (draw_dvi_printer::draw): Add dummy + entry for `F'. + * src/devices/grolbp/lbp.cc (lbp_printer::draw): Ditto. + * src/devices/grolj4/lj4.cc (lj4_printer::draw): Ditto. + + * src/devices/grohtml/html-text.h (HTML_TAG): Add COLOR_TAG. + (tag_definition): Use `void *' for arg1. + (html_text): New member functions `do_color' and `done_color'. + Use `void *' for second parameter of `push_para' member function. + New `push_para' member function with a single parameter. + Use `char *' for parameter of `issue_table_begin' member funtion. + New `issue_color_begin' member function. + * src/devices/grohtml/html-text.cc (html_text::end_tag): Handle + COLOR_TAG. + (html_text::issue_color_begin): New function. + (html_text::issue_table_begin): Use `char *' for parameter. + (html_text::start_tag, html_text::shutdown, + html_text::check_emit_text): Updated. + (html_text::push_para): Use `void *' for second parameter. + Add same function with only one parameter. + (html_text::do_*): Updated. + (html_text::do_color, html_text::done_color): New functions. + * src/devices/grohtml/post-html.cc (style): New member `col'. + Mew member `style' with 6 parameters. + (style::style, style::operator==): Updated. + (html_printer::do_font): Use it. + (html_printer::draw): Add dummy entry for `F'. + (html_printer::set_char): Updated. + * src/devices/grohtml/grohtml.man: Updated. + + * src/devices/grops/ps.cc (ps_output::put_float): Use `%g' to have + trailing zeroes removed. + (ps_printer): New members `sbuf_color', `fill_color', and + `output_color'. + Removed member `fill'. + New member function `set_color'. + (ps_printer::ps_printer, ps_printer::set_char): Updated. + (ps_printer::flush_sbuf, ps_printer::set_line_thickness, + ps_printer::fill_path, ps_printer::draw): Use `set_color'. + + * tmac/color-html.tmac, tmac/color.tmac: New files. + * tmac/troffrc: Include them. + * tmac/www.tmac (URL, FTP, MAILTO): Use blue color. + * tmac/Makefile.sub: Updated. + + * NEWS, doc/groff.texinfo, doc/pic.ms, man/groff_out.man, + man/groff.man: Updated. + * font/devps/prologue.ps: Define FC and CO functions. + +2001-10-04 Gaius Mulley + + Fix incorrect cropping of images and incorrect handling of special + characters. Fix handling of file names in \O. + + * src/include/geometry.h: New file. + * src/libs/libgroff/geometry.cc: New file. + * src/libs/libdriver/printer.cc (printer::adjust_arc_center): Moved + to `geometry.cc'. + * src/roff/troff/input.cc (get_delim_file_name): Fixed problem with + initial spaces. + (do_suppress): Updated. + * src/roff/troff/node.cc: Include geometry.h. + (troff_output_file::flush_tbuf): Fixed parameters to + `check_output_limits'. + (troff_output_file::check_charinfo): Ditto. + (troff_output_file::determine_line_limits): Add support for `Da' + and `Dl' commands. + + * src/devices/grohtml/post-html.cc (str_translate_to_html): + Add new parameter `is_special' to decode special characters from + escape sequences. + (html_printer::do_title, html_printer::do_heading, + html_printer::do_indentedparagraph, + html_printer::translate_to_html, html_printer::special): Updated. + +2001-10-03 Werner LEMBERG + + * Makefile.sub (DISTCLEANFILES): Add stamp-h. + Fix entry for config.h. + * test-groff (GROFF_BIN_PATH): Add $builddir/roff/groff. + * tmac/troffrc: Translate nonbreakable space character to `\~'. + * src/preproc/eqn/eqn.man: Document -d command line option. + +2001-09-27 Werner LEMBERG + + * man/groff.man: Use + + .ev xxx + .na + .nh + + .ev + + instead of the old code (`.ad .hy' after the table) to suppress + incorrect hyphenation for grohtml output. + +2001-09-22 Werner LEMBERG + + * man/groff_font.man, man/groff_out.man: Minor fixes. + +2001-09-20 Werner LEMBERG + + * PROBLEMS: Updated, reordered. Improved EPS section (thanks to + Arnold Robbins ). + +2001-09-09 Werner LEMBERG + + * configure: Regenerated with autoconf 2.52. + + * doc/groff.texinfo: Complete revision of indices. + +2001-09-07 Werner LEMBERG + + * doc/Makefile (clean): Updated to delete all indices. + +2001-09-05 Werner LEMBERG + + * src/roff/troff/troff.man: Remove superfluous line. + + * tmac/s.tmac: Enable all warnings only if no -W or -w option is + given on the command line (or rather, if only the default warnings + are set). + +2001-09-03 Werner LEMBERG + + * man/groff.man, src/preproc/eqn/eqn.man, tmac/groff_mdoc.man: Don't + use .ne for TTY devices. + +2001-08-31 Werner LEMBERG + + * src/roff/troff/token.h, src/roff/troff/input.cc: + s/TOKEN_TRANSPARENT_ESCAPE/TOKEN_OPAQUE_ESCAPE/. + +2001-08-28 Werner LEMBERG + + * src/roff/troff/token.h (token_type): Add TOKEN_TRANSPARENT_ESCAPE. + * src/roff/troff/input.cc (token::next): Return + TOKEN_TRANSPARENT_ESCAPE for \f, \H, \R, \s, and \S if not in + compatibility mode. + (token::description): Updated. + (process_input_stack): Reset `bol' for TOKEN_TRANSPARENT_ESCAPE. + (token::add_to_node_list, token::process): Ignore + TOKEN_TRANSPARENT_ESCAPE. + +2001-08-27 Werner LEMBERG + + * tmac/an-old.tmac: Fix `S' string. + +2001-08-26 Werner LEMBERG + + * src/roff/troff/troff.man: Don't use .ne for TTY devices. + +2001-08-25 Werner LEMBERG + + * doc/pic.ms: Replace `\\' with `\e' (and fixing some single + backslashes). + Many other minor fixes. + + * configure.ac: Add message at end to inform how to compile + xditview. + * configure: Regenerated. + +2001-08-24 Werner LEMBERG + + * src/include/getopt.h, src/libs/libgroff/{getopt.c, getopt1.c}: + Updated to latest version of libc. + +2001-08-23 Werner LEMBERG + + * configure.ac: Don't create subdirectories before AC_CONFIG_FILES. + Autoconf 2.50 and newer can handle this. + * configure: Regenerated. + +2001-08-21 Werner LEMBERG + + * doc/pic.ms: Fix typo. + * src/preproc/tbl/tbl.man: Document case of global options. + +2001-08-21 Gaius Mulley + + * src/devices/grohtml/post-html.cc (html_printer::end_font): Fix + handling of `CR' font. + +2001-08-20 Werner LEMBERG + + Use a config.h file. + + * src/include/lib.h: Include config.h. + * All C files: Ditto (if necessary). + * All C++ source and header files: Include lib.h first (if + necessary). + + * src/include/config.hin: New file (autogenerated by autoheader). + * stamp-h.in: New file. + * configure.ac: Updated. + * aclocal.m4: Add third parameters to AC_DEFINE macros. + (GROFF_ARRAY_DELETE): Simplified. + * Makefile.sub (DISTCLEANFILES): Updated. + Added targets for remaking config.status, config.hin, config.h, + stamp-h.in, and stamp-h. + * configure: Regenerated. + +2001-08-19 Werner LEMBERG + + * NEWS: Updated. + +2001-08-18 Sebastian Krahmer + + * src/preproc/pic/pic.y (format_number): Use do_sprintf(). + (do_sprintf): Use snprintf(). + +2001-08-18 Werner LEMBERG + + * src/libs/snprintf/*: Added an snprintf module written by Mark + Martinec. + * src/libs/libgroff/Makefile.sub: Updated. + * configure.ac: Add test for snprintf(). + * Makefile.in: Updated. + * configure: Regenerated. + + * src/preproc/html/pre-html.cc (make_message): Reactivate code which + uses snprintf(). + +2001-08-14 Ruslan Ermilov + + * tmac/doc.tmac (Ex): New implementation. + * tmac/doc-common, tmac/groff_tmac.man: Updated. + +2001-08-13 Ruslan Ermilov + + * tmac/doc.tmac (Rv): Implement support for 0 or more than 1 + argument. + * tmac/groff_tmac.man: Updated. + +2001-08-13 Werner LEMBERG + + * src/preproc/tbl/tbl.man: Minor documentation update. + +2001-08-13 John David Anglin + + * src/libs/libgroff/tmpname.cc: Add prototype for gettimeofday(). + * configure.ac: Add declaration test for gettimeofday(). + * Makefile.in: Document NEED_DECLARATION_GETTIMEOFDAY defines. + * aclocal.m4: Include sys/time.h for gettimeofday declaration test. + * configure: Regenerated. + +2001-08-11 Werner LEMBERG + + * aclocal.m4 (GROFF_MKSTEMP): Define HAVE_MKSTEMP. + * configure.ac: Add declaration test for strcasecmp(). + * Makefile.in: Updated. + * configure: Regenerated. + * src/include/lib.h [!HAVE_MKSTEMP]: Add prototype for mkstemp() -- + this is necessary because groff's mkstemp.cc is C++. + Add declaration conditionally for strcasecmp(). + +2001-08-10 Werner LEMBERG + + Integrated pic2graph, contributed by Eric S. Raymond. + + * contrib/pic2graph/{Makefile.sub, pic2graph.sh, pic2graph.man}: New + files. + * Makefile.in, NEWS: Updated. + + * src/preproc/tbl/tbl.man: Revised. + +2001-08-09 Eric S. Raymond + + * src/preproc/tbl/tbl.man: Extended to cover all tbl features. + +2001-08-09 Werner LEMBERG + + * src/preproc/tbl/main.cc (process_data): Fix recognition of .lf + requests. + +2001-08-08 Paul Eggert + + * Makefile.sub (configure): Depend on configure.ac, not + configure.in. + * INSTALL.gen: Upgrade to autoconf 2.52's INSTALL. + +2001-08-07 Werner LEMBERG + + * src/utils/afmtodit/afmtodit.man, src/roff/groff/groff.man: Minor + fixes. + +2001-08-06 Werner LEMBERG + + * src/roff/troff/troff.man: Improve documentation of -E option. + +2001-07-28 Ralph Corderoy + + * src/preproc/html/pushbackbuffer.cc (pushBackBuffer::readNumber): + Simplified. + +2001-07-27 Werner LEMBERG + + * src/preproc/refer/refer.cc: Undo last change. + * src/devices/grohtml/post-html.cc: Ditto. + +2001-07-26 Werner LEMBERG + + * src/preproc/refer/refer.cc: Include `lib.h'. + * src/devices/grohtml/post-html.cc: Ditto. + +2001-07-25 Gaius Mulley + + * aclocal.m4 (GROFF_PAGE): Add `AC_DEFINE(PAGEA4)'. + * src/preproc/html/pre-html.cc: Use it for DEFAULT_VERTICAL_OFFSET. + * Makefile.in: Comment updated. + * configure: Regenerated. + +2001-07-25 Werner LEMBERG + + * src/preproc/pic/pic.cc: Removed. + * src/preproc/pic/pic_tab.h: Removed. + * src/preproc/refer/label.cc: Removed. + + * doc/Makefile (.ms.html): Don't use a file name extension in + argument to grohtml's -I option. + * Makefile.in (dist): Remove CVS directories. + Call `distfiles' target. + + * src/devices/grohtml/grohtml.man: Add information about valid + versions of pnmtopng. + * src/preproc/html/pre-html.cc (TRANSPARENT): Use `white' as colour + name instead of number. + +2001-07-24 Werner LEMBERG + + * doc/groff.texinfo: Minor fixes. + +2001-07-21 Gaius Mulley + + * doc/Makefile (.ms.html): Put image files into a subdirectory. + (clean): Updated. + +2001-07-20 Werner LEMBERG + + * src/libs/libgroff/tmpname.cc: New file, defining get_tempname(). + * src/libs/libgroff/mkstemp.cc: New file. + * src/libs/libgroff/mksdir.cc: New file. + * src/libs/libgroff/tmpfile.cc [HAVE_MKSTEMP_PROTO]: Removed. + (xtmpfile) [!HAVE_MKSTEMP]: Removed. + * src/libs/libgroff/Makefile.sub: Updated. + * src/include/lib.h: Add mksdir() prototype. + * src/include/posix.h: Define S_IXUSR if not yet defined. + + * src/preproc/html/pre-html.cc (MAX_RETRIES): Removed. + (createAllPages): Use mksdir() instead of current code. + * src/utils/indxbib/indxbib.cc [HAVE_MKSTEMP_PROTO]: Removed. + (main): [!HAVE_MKSTEMP]: Removed. + + * aclocal.m4 (GROFF_MKSTEMP): Updated to use new mkstemp.cc file. + (GROFF_INTTYPES_H, GROFF_UNSIGNED_LONG_LONG, GROFF_UINTMAX_T): New + macros. + * configure.ac: Add tests for stdint.h, sys/time.h, and + gettimeofday(). + Call new GROFF_xxx macros. + * configure: Regenerated. + * Makefile.in: Comments updated. + +2001-07-20 Gaius Mulley + + * src/preproc/html/pre-html.cc (scanArguments): Use getopt_long() + instead of current code. + * src/devices/grohtml/post-html.cc (main): Handle `-d' option. + * src/roff/groff/groff.cc (possible_command::insert_args): New + function. + (main): Use it for predriver handling instead of insert_arg(). + +2001-07-19 Werner LEMBERG + + * doc/Makefile: Added GROFF_BIN_PATH to make it work with uninstalled + groff also. + + * src/include/posix.h: Define S_IWUSR if not yet defined. + +2001-07-18 Werner LEMBERG + + * NEWS: Updated. + +2001-07-18 Ruslan Ermilov + + * tmac/groff_mdoc.man: Document new -width and -column syntax. + Some other minor fixes. + * tmac/an-old.tmac: Add `AT' and `UC' macros. + +2001-07-17 Gaius Mulley + + Replace call to `troff' with `groff -Z' to make it aware of + GROFF_BIN_PATH. + + * src/preproc/html/pre-html.cc (TROFF_COMMAND): New macro. + (troff_command, command_prefix): Removed. + (alterDeviceTo): Use groff. + (addZ): New function. + (char_buffer::do_html): Use it. + (scanArguments): Use TROFF_COMMAND. + (findPrefix): Removed. + (main): Updated. + * src/roff/groff/groff.cc (main): Handle zflag for preprocessors. + +2001-07-17 Eric S. Raymond + + * doc/pic.ms: Documentation fixes. + +2001-07-17 Werner LEMBERG + + Replace atexit() with global destructor. + + * src/libs/libgroff/tmpfile.cc (xtmpfile_list): Add constructor. + (xtmpfile_list_init): New global structure to deallocate + xtmpfile_list on exit. Its destructor inherits most code from + remove_tmp_files(). + (remove_tmp_files): Deleted. + (add_tmp_file): Simplified. + +2001-07-16 Werner LEMBERG + + Replace strdup() with strsave(). + + * src/devices/grolbp/lbp.cc [!HAVE_STRDUP]: Removed. + (set_papersize): Use strsave() and a_delete. + (main): Use strsave(). + * src/preproc/html/pre-html.cc (make_message, createAllPages, + removeAllPages): Use strsave() and a_delete. + + * configure.ac: Remove test for strdup. + * Makefile.in: Comment updated. + * configure: Regenerated. + +2001-07-15 Werner LEMBERG + + * win32-diffs: Updated. + +2001-07-14 Werner LEMBERG + + * src/preproc/html/pre-html.cc (makeTempFiles): Activate new code, + removing the old one. + * src/utils/indxbib/indxbib.cc (main): Remove compiler warning. + +2001-07-14 Ralph Corderoy + + * src/libs/libgroff/tmpfile.cc (xtmpfile): Fix guard for `namep'. + +2001-07-12 Ruslan Ermilov + + Merge -xwidth into -width. Add -xwidth functionality to -column + also. + + * tmac/doc.tmac (Bl): Add dummy doc-typeXXX and doc-spaceXXX to + avoid warning. + (doc-do-Bl-args): Merge -xwidth code with -width. Test whether + string immediately following a leading dot starts with a valid mdoc + argument. + Add similar code to the -column branch. + (doc-Bl-usage): Updated. + * groff_mdoc.man: s/-xwidth/-width/. + +2001-07-12 Gaius Mulley + + * src/devices/grohtml/post-html.cc (text_glob::is_br): Stop titles + running into centered or non-formatted text. + +2001-07-11 Werner LEMBERG + + Introduce short and long prefixes to have the selection at run-time + whether there is a 8+3 limit for names of temporary files. + + * src/libs/libgroff/tmpfile.cc (TMPFILE_PREFIX): Replaced with... + (TMPFILE_PREFIX_SHORT, TMPFILE_PREFIX_LONG): This. + (tmpfile_prefix, tmpfile_prefix_len, use_short_prefix): New + variables. + (temp_init): New global structure to initialize above three + variables. + (xtmptemplate): Use two parameters for long and short prefix. + Simplify code use above three variables. + (xtmpfile): Use long and short prefixes as parameters. + * src/include/lib.h: Updated. + + * src/preproc/html/pre-html.cc ({PAGE,PS,REGION}_TEMPLATE): Replace + with ... + ({PAGE,PS,REGION}_TEMPLATE_{SHORT,LONG}): This. + (createAllPages, makeTempFiles): Updated. + +2001-07-09 Werner LEMBERG + + * REVISION: Increased to 3. + +Local Variables: +version-control: never +coding: latin-1 +End: diff -ruN groff-1.19.1/configure groff-1.19.2/configure --- groff-1.19.1/configure 2003-12-30 05:03:25.000000000 +0100 +++ groff-1.19.2/configure 2005-09-03 16:28:36.000000000 +0200 @@ -1,8 +1,9 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.59. +# Generated by GNU Autoconf 2.59b. # -# Copyright (C) 2003 Free Software Foundation, Inc. +# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## --------------------- ## @@ -16,11 +17,35 @@ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' -elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + setopt NO_GLOB_SUBST +elif test -n "${BASH_VERSION+set}${KSH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi +BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh + +# PATH needs CR +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset @@ -29,8 +54,34 @@ fi +# Find who we are. Look in the path if we contain no path at all +# relative or not. +case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + { echo "$as_me: error: cannot find myself; rerun with an absolute file name" >&2 + { (exit 1); exit 1; }; } +fi + # Work around bugs in pre-3.0 UWIN ksh. -$as_unset ENV MAIL MAILPATH +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +done PS1='$ ' PS2='> ' PS4='+ ' @@ -44,7 +95,7 @@ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else - $as_unset $as_var + ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var fi done @@ -75,101 +126,282 @@ s/.*/./; q'` -# PATH needs CR, and LINENO needs CR and PATH. -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - echo "#! /bin/sh" >conf$$.sh - echo "exit 0" >>conf$$.sh - chmod +x conf$$.sh - if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then - PATH_SEPARATOR=';' - else - PATH_SEPARATOR=: - fi - rm -f conf$$.sh +if test "x$CONFIG_SHELL" = x; then + if (eval ":") 2>/dev/null; then + as_have_required=yes +else + as_have_required=no fi + if test $as_have_required = yes && (eval ": +(func_return () { + (exit \$1) +} +func_success () { + func_return 0 +} +func_failure () { + func_return 1 +} +func_ret_success () { + return 0 +} +func_ret_failure () { + return 1 +} - as_lineno_1=$LINENO - as_lineno_2=$LINENO - as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" || { - # Find who we are. Look in the path if we contain no path at all - # relative or not. - case $0 in - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break -done +exitcode=0 +if func_success; then + : +else + exitcode=1 + echo func_failure succeeded. +fi - ;; - esac - # We did not find ourselves, most probably we were run as `sh COMMAND' - # in which case we are not to be found in the path. - if test "x$as_myself" = x; then - as_myself=$0 - fi - if test ! -f "$as_myself"; then - { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 - { (exit 1); exit 1; }; } - fi - case $CONFIG_SHELL in - '') +if func_failure; then + exitcode=1 + echo func_success failed. +fi + +if func_ret_success; then + : +else + exitcode=1 + echo func_ret_success failed. +fi + +if func_ret_failure; then + exitcode=1 + echo func_ret_failure succeeded. +fi + +test \$exitcode = 0) || { (exit 1); exit 1; } + +( + as_lineno_1=\$LINENO + as_lineno_2=\$LINENO + as_lineno_3=\`(expr \$as_lineno_1 + 1) 2>/dev/null\` + test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && + test \"x\$as_lineno_3\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } +") 2> /dev/null; then + : +else + as_candidate_shells= as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - for as_base in sh bash ksh sh5; do - case $as_dir in + case $as_dir in /*) - if ("$as_dir/$as_base" -c ' + for as_base in sh bash ksh sh5; do + as_candidate_shells="$as_candidate_shells $as_dir/$as_base" + done + esac +done + + + for as_shell in $as_candidate_shells $SHELL; do + if { $as_shell 2> /dev/null <<\_ASEOF +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +elif test -n "${BASH_VERSION+set}${KSH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +: +_ASEOF +}; then + CONFIG_SHELL=$as_shell + as_have_required=yes + if { $as_shell 2> /dev/null <<\_ASEOF +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +elif test -n "${BASH_VERSION+set}${KSH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +: +(func_return () { + (exit $1) +} +func_success () { + func_return 0 +} +func_failure () { + func_return 1 +} +func_ret_success () { + return 0 +} +func_ret_failure () { + return 1 +} + +exitcode=0 +if func_success; then + : +else + exitcode=1 + echo func_failure succeeded. +fi + +if func_failure; then + exitcode=1 + echo func_success failed. +fi + +if func_ret_success; then + : +else + exitcode=1 + echo func_ret_success failed. +fi + +if func_ret_failure; then + exitcode=1 + echo func_ret_failure succeeded. +fi + +test $exitcode = 0) || { (exit 1); exit 1; } + +( as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then - $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } - $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } - CONFIG_SHELL=$as_dir/$as_base - export CONFIG_SHELL - exec "$CONFIG_SHELL" "$0" ${1+"$@"} - fi;; - esac - done -done -;; - esac + test "x$as_lineno_3" = "x$as_lineno_2") || { (exit 1); exit 1; } + +_ASEOF +}; then + break +fi + +fi + + done + + if test "x$CONFIG_SHELL" != x; then + for as_var in BASH_ENV ENV + do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var + done + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} +fi + + + if test $as_have_required = no; then + echo This script requires a shell more modern than all the + echo shells that I found on your system. Please install a + echo modern shell, or manually run the script under such a + echo shell if you do have one. + { (exit 1); exit 1; } +fi + + +fi + +fi + + + +(eval "func_return () { + (exit \$1) +} +func_success () { + func_return 0 +} +func_failure () { + func_return 1 +} +func_ret_success () { + return 0 +} +func_ret_failure () { + return 1 +} + +exitcode=0 +if func_success; then + : +else + exitcode=1 + echo func_failure succeeded. +fi + +if func_failure; then + exitcode=1 + echo func_success failed. +fi + +if func_ret_success; then + : +else + exitcode=1 + echo func_ret_success failed. +fi + +if func_ret_failure; then + exitcode=1 + echo func_ret_failure succeeded. +fi + +test \$exitcode = 0") || { + echo No shell found that supports shell functions. + echo Please tell autoconf@gnu.org about your system, + echo including any error possibly output before this + echo message +} + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a - # line-number line before each line; the second 'sed' does the real - # work. The second script uses 'N' to pair each line-number line - # with the numbered line, and appends trailing '-' during - # substitution so that $LINENO is not a special case at line end. + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the - # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) - sed '=' <$as_myself | + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | sed ' + s,[$]LINENO.*,&-, + t lineno + b + : lineno N - s,$,-, : loop - s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + s,[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\),\2\1\2, t loop - s,-$,, - s,^['$as_cr_digits']*\n,, + s,-\n.*,, ' >$as_me.lineno && chmod +x $as_me.lineno || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 @@ -300,16 +532,15 @@ #endif #if HAVE_INTTYPES_H # include -#else -# if HAVE_STDINT_H -# include -# endif +#endif +#if HAVE_STDINT_H +# include #endif #if HAVE_UNISTD_H # include #endif" -ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CXX CXXFLAGS ac_ct_CXX TTYDEVDIRS OTHERDEVDIRS LPR LP LPQ PSPRINT DVIPRINT PERLPATH YACC RANLIB ac_ct_RANLIB INSTALL_INFO INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA LN_S SH_SCRIPT_SED_CMD CPP EGREP LIBC LIBM LIBOBJS BROKEN_SPOOLER_FLAGS PAGE g sys_tmac_prefix tmac_wrap GROFF_PATH_SEPARATOR pnmcut pnmcrop pnmtopng psselect pnmtops gs make_html make_install_html pnmtops_nosetpage LTLIBOBJS' +ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CXX CXXFLAGS ac_ct_CXX TTYDEVDIRS OTHERDEVDIRS CPP X_CFLAGS X_PRE_LIBS X_LIBS X_EXTRA_LIBS XDEVDIRS XPROGDIRS XLIBDIRS appresdir LPR LP LPQ PSPRINT DVIPRINT PERLPATH YACC RANLIB ac_ct_RANLIB INSTALL_INFO INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA LN_S SH_SCRIPT_SED_CMD GREP EGREP LIBC LIBM LIBOBJS BROKEN_SPOOLER_FLAGS PAGE g sys_tmac_prefix tmac_wrap GROFF_PATH_SEPARATOR ALT_GHOSTSCRIPT_PROGS GHOSTSCRIPT ac_ct_GHOSTSCRIPT pnmcut pnmcrop pnmtopng psselect pnmtops make_html make_install_html ALT_AWK_PROGS AWK ac_ct_AWK make_pdfdoc make_install_pdfdoc pnmtops_nosetpage LTLIBOBJS' ac_subst_files='' # Initialize some variables set by options. @@ -351,6 +582,7 @@ mandir='${prefix}/man' ac_prev= +ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. @@ -364,7 +596,9 @@ # Accept the important Cygnus configure options, so we can diagnose typos. - case $ac_option in + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; @@ -655,7 +889,7 @@ { (exit 1); exit 1; }; } fi -# Be sure to have absolute paths. +# Be sure to have absolute directory names. for ac_var in exec_prefix prefix do eval ac_val=$`echo $ac_var` @@ -666,7 +900,7 @@ esac done -# Be sure to have absolute paths. +# Be sure to have absolute directory names. for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ localstatedir libdir includedir oldincludedir infodir mandir do @@ -838,6 +1072,10 @@ _ACEOF cat <<\_ACEOF + +X features: + --x-includes=DIR X include files are in DIR + --x-libraries=DIR X library files are in DIR _ACEOF fi @@ -845,6 +1083,16 @@ cat <<\_ACEOF +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-x use the X Window System + --with-appresdir=DIR X11 application resource files + --with-alt-gs=LIST alternative names for ghostscript executable + --with-gs=PROG actual [/path/]name of ghostscript executable + --with-alt-awk=LIST alternative names for awk executable + --with-awk=PROG actual [/path/]name of awk executable + Some influential environment variables: CC C compiler command CFLAGS C compiler flags @@ -885,15 +1133,15 @@ else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; - [\\/]* | ?:[\\/]* ) # Absolute path. + [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; - *) # Relative path. + *) # Relative name. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac -# Do not use `cd foo && pwd` to compute absolute paths, because +# Do not use `cd foo && pwd` to compute absolute names, because # the directories may not exist. case `pwd` in .) ac_abs_builddir="$ac_dir";; @@ -947,7 +1195,7 @@ else echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi - cd $ac_popdir + cd "$ac_popdir" done fi @@ -955,7 +1203,8 @@ if $ac_init_version; then cat <<\_ACEOF -Copyright (C) 2003 Free Software Foundation, Inc. +Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002, +2003, 2004 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF @@ -967,7 +1216,7 @@ running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was -generated by GNU Autoconf 2.59. Invocation command line was +generated by GNU Autoconf 2.59b. Invocation command line was $ $0 $@ @@ -1144,7 +1393,7 @@ echo "$as_me: exit $exit_status" } >&5 rm -f core *.core && - rm -rf conftest* confdefs* conf$$* $ac_clean_files && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do @@ -1153,9 +1402,11 @@ ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -rf conftest* confdefs.h +rm -f -r conftest* confdefs.h # AIX cpp loses on an empty file, so make sure it contains at least a newline. -echo >confdefs.h +# NextStep 3.3 (patch 3) loses unless the first echo outputs at least 14 bytes. +ac_space=' ' +echo "$ac_space$ac_space$ac_space$ac_space$ac_space$ac_space$ac_space$ac_space$ac_space$ac_space$ac_space$ac_space$ac_space" >confdefs.h # Predefined preprocessor variables. @@ -1295,6 +1546,7 @@ + ac_config_headers="$ac_config_headers src/include/config.h:src/include/config.hin" @@ -1379,7 +1631,19 @@ echo "${ECHO_T}no" >&6 fi - CC=$ac_ct_CC + if test "x$ac_ct_CC" = x; then + CC="" + else + if test "$build" != "$host"; then + { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} + fi + CC=$ac_ct_CC + fi else CC="$ac_cv_prog_CC" fi @@ -1459,7 +1723,19 @@ echo "${ECHO_T}no" >&6 fi - CC=$ac_ct_CC + if test "x$ac_ct_CC" = x; then + CC="" + else + if test "$build" != "$host"; then + { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} + fi + CC=$ac_ct_CC + fi else CC="$ac_cv_prog_CC" fi @@ -1603,7 +1879,19 @@ test -n "$ac_ct_CC" && break done - CC=$ac_ct_CC + if test "x$ac_ct_CC" = x; then + CC="" + else + if test "$build" != "$host"; then + { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} + fi + CC=$ac_ct_CC + fi fi fi @@ -1658,28 +1946,39 @@ echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6 ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` +# +# List of possible output files, starting from the most likely. +# The algorithm is not robust to junk in `.', hence go to wildcards (a.*) +# only as a last resort. b.out is created by i960 compilers. +ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out' +# +# The IRIX 6 linker writes into existing files which may not be +# executable, retaining their permissions. Remove them first so a +# subsequent execution test works. +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 (eval $ac_link_default) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then - # Find the output, starting from the most likely. This scheme is -# not robust to junk in `.', hence go to wildcards (a.*) only as a last -# resort. - -# Be careful to initialize this variable, since it used to be cached. + # Be careful to initialize this variable, since it used to be cached. # Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. ac_cv_exeext= -# b.out is created by i960 compilers. -for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out +for ac_file in $ac_files do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; - conftest.$ac_ext ) - # This is the source file. - ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. @@ -1897,13 +2196,16 @@ GCC=`test $ac_compiler_gnu = yes && echo yes` ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS -CFLAGS="-g" echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 if test "${ac_cv_prog_cc_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - cat >conftest.$ac_ext <<_ACEOF + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext @@ -1945,56 +2247,147 @@ echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_prog_cc_g=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 -echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 -if test "$ac_test_CFLAGS" = set; then - CFLAGS=$ac_save_CFLAGS -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi -echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 -echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 -if test "${ac_cv_prog_cc_stdc+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_cv_prog_cc_stdc=no -ac_save_CC=$CC -cat >conftest.$ac_ext <<_ACEOF +CFLAGS="" + cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -#include -#include -#include -#include -/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -struct buf { int x; }; -FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; + +int +main () { - return p[i]; + + ; + return 0; } -static char *f (char * (*g) (char **, int), char **p, ...) -{ - char *s; +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 +echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_prog_cc_stdc=no +ac_save_CC=$CC +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); @@ -2005,10 +2398,10 @@ /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std1 is added to get + as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std1. */ + that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; int test (int i, double x); @@ -2028,11 +2421,11 @@ # Don't try gcc -ansi; that turns off useful extensions and # breaks some systems' header files. # AIX -qlanglvl=ansi -# Ultrix and OSF/1 -std1 +# Ultrix, OSF/1, Tru64 -std # HP-UX 10.20 and later -Ae # HP-UX older versions -Aa -D_HPUX_SOURCE # SVR4 -Xc -D__EXTENSIONS__ -for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +for ac_arg in "" -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" rm -f conftest.$ac_objext @@ -2317,9 +2710,20 @@ test -n "$ac_ct_CXX" && break done -test -n "$ac_ct_CXX" || ac_ct_CXX="g++" - CXX=$ac_ct_CXX + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + if test "$build" != "$host"; then + { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} + fi + CXX=$ac_ct_CXX + fi fi @@ -2404,13 +2808,103 @@ GXX=`test $ac_compiler_gnu = yes && echo yes` ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS -CXXFLAGS="-g" echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6 if test "${ac_cv_prog_cxx_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - cat >conftest.$ac_ext <<_ACEOF + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cxx_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +CXXFLAGS="" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext @@ -2452,10 +2946,14 @@ echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_prog_cxx_g=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6 if test "$ac_test_CXXFLAGS" = set; then @@ -2868,34 +3366,1899 @@ echo "${ECHO_T}no" >&6 ;; esac fi -if test -z "$PSPRINT"; then - for ac_prog in lpr -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_LPR+set}" = set; then +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 +echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test "${ac_cv_prog_CPP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - if test -n "$LPR"; then - ac_cv_prog_LPR="$LPR" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_LPR="$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done - -fi + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +echo "$as_me:$LINENO: result: $CPP" >&5 +echo "${ECHO_T}$CPP" >&6 +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&5 +echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +echo "$as_me:$LINENO: checking for X" >&5 +echo $ECHO_N "checking for X... $ECHO_C" >&6 + + +# Check whether --with-x or --without-x was given. +if test "${with_x+set}" = set; then + withval="$with_x" + +fi; +# $have_x is `yes', `no', `disabled', or empty when we do not yet know. +if test "x$with_x" = xno; then + # The user explicitly disabled X. + have_x=disabled +else + if test "x$x_includes" != xNONE && test "x$x_libraries" != xNONE; then + # Both variables are already set. + have_x=yes + else + if test "${ac_cv_have_x+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # One or both of the vars are not set, and there is no cached value. +ac_x_includes=no ac_x_libraries=no +rm -f -r conftest.dir +if mkdir conftest.dir; then + cd conftest.dir + # Make sure to not put "make" in the Imakefile rules, since we grep it out. + cat >Imakefile <<'_ACEOF' +acfindx: + @echo 'ac_im_incroot="${INCROOT}"; ac_im_usrlibdir="${USRLIBDIR}"; ac_im_libdir="${LIBDIR}"' +_ACEOF + if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then + # GNU make sometimes prints "make[1]: Entering...", which would confuse us. + eval `${MAKE-make} acfindx 2>/dev/null | grep -v make` + # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. + for ac_extension in a so sl; do + if test ! -f $ac_im_usrlibdir/libX11.$ac_extension && + test -f $ac_im_libdir/libX11.$ac_extension; then + ac_im_usrlibdir=$ac_im_libdir; break + fi + done + # Screen out bogus values from the imake configuration. They are + # bogus both because they are the default anyway, and because + # using them would break gcc on systems where it needs fixed includes. + case $ac_im_incroot in + /usr/include) ;; + *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; + esac + case $ac_im_usrlibdir in + /usr/lib | /lib) ;; + *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; + esac + fi + cd .. + rm -f -r conftest.dir +fi + +# Standard set of common directories for X headers. +# Check X11 before X11Rn because it is often a symlink to the current release. +ac_x_header_dirs=' +/usr/X11/include +/usr/X11R6/include +/usr/X11R5/include +/usr/X11R4/include + +/usr/include/X11 +/usr/include/X11R6 +/usr/include/X11R5 +/usr/include/X11R4 + +/usr/local/X11/include +/usr/local/X11R6/include +/usr/local/X11R5/include +/usr/local/X11R4/include + +/usr/local/include/X11 +/usr/local/include/X11R6 +/usr/local/include/X11R5 +/usr/local/include/X11R4 + +/usr/X386/include +/usr/x386/include +/usr/XFree86/include/X11 + +/usr/include +/usr/local/include +/usr/unsupported/include +/usr/athena/include +/usr/local/x11r5/include +/usr/lpp/Xamples/include + +/usr/openwin/include +/usr/openwin/share/include' + +if test "$ac_x_includes" = no; then + # Guess where to find include files, by looking for Intrinsic.h. + # First, try using that file with no special directory specified. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # We can compile using X headers with no special include directory. +ac_x_includes= +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + for ac_dir in $ac_x_header_dirs; do + if test -r "$ac_dir/X11/Intrinsic.h"; then + ac_x_includes=$ac_dir + break + fi +done +fi +rm -f conftest.err conftest.$ac_ext +fi # $ac_x_includes = no + +if test "$ac_x_libraries" = no; then + # Check for the libraries. + # See if we find them without any special options. + # Don't add to $LIBS permanently. + ac_save_LIBS=$LIBS + LIBS="-lXt $LIBS" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +XtMalloc (0) + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + LIBS=$ac_save_LIBS +# We can link X programs with no special library path. +ac_x_libraries= +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +LIBS=$ac_save_LIBS +for ac_dir in `echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` +do + # Don't even attempt the hair of trying to link an X program! + for ac_extension in a so sl; do + if test -r $ac_dir/libXt.$ac_extension; then + ac_x_libraries=$ac_dir + break 2 + fi + done +done +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi # $ac_x_libraries = no + +if test "$ac_x_includes" = no || test "$ac_x_libraries" = no; then + # Didn't find X anywhere. Cache the known absence of X. + ac_cv_have_x="have_x=no" +else + # Record where we found X for the cache. + ac_cv_have_x="have_x=yes \ + ac_x_includes=$ac_x_includes ac_x_libraries=$ac_x_libraries" +fi +fi + + fi + eval "$ac_cv_have_x" +fi # $with_x != no + +if test "$have_x" != yes; then + echo "$as_me:$LINENO: result: $have_x" >&5 +echo "${ECHO_T}$have_x" >&6 + no_x=yes +else + # If each of the values was on the command line, it overrides each guess. + test "x$x_includes" = xNONE && x_includes=$ac_x_includes + test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries + # Update the cache value to reflect the command line values. + ac_cv_have_x="have_x=yes \ + ac_x_includes=$x_includes ac_x_libraries=$x_libraries" + echo "$as_me:$LINENO: result: libraries $x_libraries, headers $x_includes" >&5 +echo "${ECHO_T}libraries $x_libraries, headers $x_includes" >&6 +fi + +if test "$no_x" = yes; then + # Not all programs may use this symbol, but it does not hurt to define it. + +cat >>confdefs.h <<\_ACEOF +#define X_DISPLAY_MISSING 1 +_ACEOF + + X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= +else + if test -n "$x_includes"; then + X_CFLAGS="$X_CFLAGS -I$x_includes" + fi + + # It would also be nice to do this for all -L options, not just this one. + if test -n "$x_libraries"; then + X_LIBS="$X_LIBS -L$x_libraries" + # For Solaris; some versions of Sun CC require a space after -R and + # others require no space. Words are not sufficient . . . . + case `(uname -sr) 2>/dev/null` in + "SunOS 5"*) + echo "$as_me:$LINENO: checking whether -R must be followed by a space" >&5 +echo $ECHO_N "checking whether -R must be followed by a space... $ECHO_C" >&6 + ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_R_nospace=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_R_nospace=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test $ac_R_nospace = yes; then + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + X_LIBS="$X_LIBS -R$x_libraries" + else + LIBS="$ac_xsave_LIBS -R $x_libraries" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_R_space=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_R_space=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test $ac_R_space = yes; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + X_LIBS="$X_LIBS -R $x_libraries" + else + echo "$as_me:$LINENO: result: neither works" >&5 +echo "${ECHO_T}neither works" >&6 + fi + fi + LIBS=$ac_xsave_LIBS + esac + fi + + # Check for system-dependent libraries X programs must link with. + # Do this before checking for the system-independent R6 libraries + # (-lICE), since we may need -lsocket or whatever for X linking. + + if test "$ISC" = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" + else + # Martyn Johnson says this is needed for Ultrix, if the X + # libraries were built with DECnet support. And Karl Berry says + # the Alpha needs dnet_stub (dnet does not exist). + ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char XOpenDisplay (); +int +main () +{ +XOpenDisplay (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: checking for dnet_ntoa in -ldnet" >&5 +echo $ECHO_N "checking for dnet_ntoa in -ldnet... $ECHO_C" >&6 +if test "${ac_cv_lib_dnet_dnet_ntoa+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldnet $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dnet_ntoa (); +int +main () +{ +dnet_ntoa (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dnet_dnet_ntoa=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dnet_dnet_ntoa=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dnet_dnet_ntoa" >&5 +echo "${ECHO_T}$ac_cv_lib_dnet_dnet_ntoa" >&6 +if test $ac_cv_lib_dnet_dnet_ntoa = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" +fi + + if test $ac_cv_lib_dnet_dnet_ntoa = no; then + echo "$as_me:$LINENO: checking for dnet_ntoa in -ldnet_stub" >&5 +echo $ECHO_N "checking for dnet_ntoa in -ldnet_stub... $ECHO_C" >&6 +if test "${ac_cv_lib_dnet_stub_dnet_ntoa+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldnet_stub $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dnet_ntoa (); +int +main () +{ +dnet_ntoa (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dnet_stub_dnet_ntoa=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dnet_stub_dnet_ntoa=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5 +echo "${ECHO_T}$ac_cv_lib_dnet_stub_dnet_ntoa" >&6 +if test $ac_cv_lib_dnet_stub_dnet_ntoa = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" +fi + + fi +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$ac_xsave_LIBS" + + # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, + # to get the SysV transport functions. + # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4) + # needs -lnsl. + # The nsl library prevents programs from opening the X display + # on Irix 5.2, according to T.E. Dickey. + # The functions gethostbyname, getservbyname, and inet_addr are + # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking. + echo "$as_me:$LINENO: checking for gethostbyname" >&5 +echo $ECHO_N "checking for gethostbyname... $ECHO_C" >&6 +if test "${ac_cv_func_gethostbyname+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define gethostbyname to an innocuous variant, in case declares gethostbyname. + For example, HP-UX 11i declares gettimeofday. */ +#define gethostbyname innocuous_gethostbyname + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char gethostbyname (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef gethostbyname + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char gethostbyname (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_gethostbyname) || defined (__stub___gethostbyname) +choke me +#else +char (*f) () = gethostbyname; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != gethostbyname; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_gethostbyname=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_gethostbyname=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_gethostbyname" >&5 +echo "${ECHO_T}$ac_cv_func_gethostbyname" >&6 + + if test $ac_cv_func_gethostbyname = no; then + echo "$as_me:$LINENO: checking for gethostbyname in -lnsl" >&5 +echo $ECHO_N "checking for gethostbyname in -lnsl... $ECHO_C" >&6 +if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lnsl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char gethostbyname (); +int +main () +{ +gethostbyname (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_nsl_gethostbyname=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_nsl_gethostbyname=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_nsl_gethostbyname" >&5 +echo "${ECHO_T}$ac_cv_lib_nsl_gethostbyname" >&6 +if test $ac_cv_lib_nsl_gethostbyname = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" +fi + + if test $ac_cv_lib_nsl_gethostbyname = no; then + echo "$as_me:$LINENO: checking for gethostbyname in -lbsd" >&5 +echo $ECHO_N "checking for gethostbyname in -lbsd... $ECHO_C" >&6 +if test "${ac_cv_lib_bsd_gethostbyname+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbsd $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char gethostbyname (); +int +main () +{ +gethostbyname (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_bsd_gethostbyname=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_bsd_gethostbyname=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_bsd_gethostbyname" >&5 +echo "${ECHO_T}$ac_cv_lib_bsd_gethostbyname" >&6 +if test $ac_cv_lib_bsd_gethostbyname = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd" +fi + + fi + fi + + # lieder@skyler.mavd.honeywell.com says without -lsocket, + # socket/setsockopt and other routines are undefined under SCO ODT + # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary + # on later versions), says Simon Leinen: it contains gethostby* + # variants that don't use the name server (or something). -lsocket + # must be given before -lnsl if both are needed. We assume that + # if connect needs -lnsl, so does gethostbyname. + echo "$as_me:$LINENO: checking for connect" >&5 +echo $ECHO_N "checking for connect... $ECHO_C" >&6 +if test "${ac_cv_func_connect+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define connect to an innocuous variant, in case declares connect. + For example, HP-UX 11i declares gettimeofday. */ +#define connect innocuous_connect + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char connect (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef connect + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char connect (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_connect) || defined (__stub___connect) +choke me +#else +char (*f) () = connect; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != connect; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_connect=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_connect=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_connect" >&5 +echo "${ECHO_T}$ac_cv_func_connect" >&6 + + if test $ac_cv_func_connect = no; then + echo "$as_me:$LINENO: checking for connect in -lsocket" >&5 +echo $ECHO_N "checking for connect in -lsocket... $ECHO_C" >&6 +if test "${ac_cv_lib_socket_connect+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsocket $X_EXTRA_LIBS $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char connect (); +int +main () +{ +connect (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_socket_connect=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_socket_connect=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_socket_connect" >&5 +echo "${ECHO_T}$ac_cv_lib_socket_connect" >&6 +if test $ac_cv_lib_socket_connect = yes; then + X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" +fi + + fi + + # Guillermo Gomez says -lposix is necessary on A/UX. + echo "$as_me:$LINENO: checking for remove" >&5 +echo $ECHO_N "checking for remove... $ECHO_C" >&6 +if test "${ac_cv_func_remove+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define remove to an innocuous variant, in case declares remove. + For example, HP-UX 11i declares gettimeofday. */ +#define remove innocuous_remove + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char remove (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef remove + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char remove (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_remove) || defined (__stub___remove) +choke me +#else +char (*f) () = remove; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != remove; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_remove=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_remove=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_remove" >&5 +echo "${ECHO_T}$ac_cv_func_remove" >&6 + + if test $ac_cv_func_remove = no; then + echo "$as_me:$LINENO: checking for remove in -lposix" >&5 +echo $ECHO_N "checking for remove in -lposix... $ECHO_C" >&6 +if test "${ac_cv_lib_posix_remove+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lposix $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char remove (); +int +main () +{ +remove (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_posix_remove=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_posix_remove=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_posix_remove" >&5 +echo "${ECHO_T}$ac_cv_lib_posix_remove" >&6 +if test $ac_cv_lib_posix_remove = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" +fi + + fi + + # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. + echo "$as_me:$LINENO: checking for shmat" >&5 +echo $ECHO_N "checking for shmat... $ECHO_C" >&6 +if test "${ac_cv_func_shmat+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define shmat to an innocuous variant, in case declares shmat. + For example, HP-UX 11i declares gettimeofday. */ +#define shmat innocuous_shmat + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char shmat (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef shmat + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shmat (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_shmat) || defined (__stub___shmat) +choke me +#else +char (*f) () = shmat; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != shmat; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_shmat=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_shmat=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_shmat" >&5 +echo "${ECHO_T}$ac_cv_func_shmat" >&6 + + if test $ac_cv_func_shmat = no; then + echo "$as_me:$LINENO: checking for shmat in -lipc" >&5 +echo $ECHO_N "checking for shmat in -lipc... $ECHO_C" >&6 +if test "${ac_cv_lib_ipc_shmat+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lipc $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shmat (); +int +main () +{ +shmat (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_ipc_shmat=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_ipc_shmat=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_ipc_shmat" >&5 +echo "${ECHO_T}$ac_cv_lib_ipc_shmat" >&6 +if test $ac_cv_lib_ipc_shmat = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" +fi + + fi + fi + + # Check for libraries that X11R6 Xt/Xaw programs need. + ac_save_LDFLAGS=$LDFLAGS + test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" + # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to + # check for ICE first), but we must link in the order -lSM -lICE or + # we get undefined symbols. So assume we have SM if we have ICE. + # These have to be linked with before -lX11, unlike the other + # libraries we check for below, so use a different variable. + # John Interrante, Karl Berry + echo "$as_me:$LINENO: checking for IceConnectionNumber in -lICE" >&5 +echo $ECHO_N "checking for IceConnectionNumber in -lICE... $ECHO_C" >&6 +if test "${ac_cv_lib_ICE_IceConnectionNumber+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lICE $X_EXTRA_LIBS $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char IceConnectionNumber (); +int +main () +{ +IceConnectionNumber (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_ICE_IceConnectionNumber=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_ICE_IceConnectionNumber=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5 +echo "${ECHO_T}$ac_cv_lib_ICE_IceConnectionNumber" >&6 +if test $ac_cv_lib_ICE_IceConnectionNumber = yes; then + X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" +fi + + LDFLAGS=$ac_save_LDFLAGS + +fi + + + groff_no_x=$no_x + if test -z "$groff_no_x"; then + OLDCFLAGS=$CFLAGS + OLDLDFLAGS=$LDFLAGS + OLDLIBS=$LIBS + CFLAGS="$CFLAGS $X_CFLAGS" + LDFLAGS="$LDFLAGS $X_LIBS" + LIBS="$LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS" + + LIBS="$LIBS -lXaw" + echo "$as_me:$LINENO: checking for Xaw library and header files" >&5 +echo $ECHO_N "checking for Xaw library and header files... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +#include +#include + + +int +main () +{ + + ; + return 0; +} + +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + groff_no_x="yes" +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + LIBS="$LIBS -lXmu" + echo "$as_me:$LINENO: checking for Xmu library and header files" >&5 +echo $ECHO_N "checking for Xmu library and header files... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +#include +#include + + +int +main () +{ + + ; + return 0; +} + +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + groff_no_x="yes" +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + CFLAGS=$OLDCFLAGS + LDFLAGS=$OLDLDFLAGS + LIBS=$OLDLIBS + fi + + if test "x$groff_no_x" = "xyes"; then + { echo "$as_me:$LINENO: gxditview and xtotroff won't be built" >&5 +echo "$as_me: gxditview and xtotroff won't be built" >&6;} + else + XDEVDIRS="font/devX75 font/devX75-12 font/devX100 font/devX100-12" + XPROGDIRS="src/devices/xditview src/utils/xtotroff" + XLIBDIRS="src/libs/libxutil" + fi + + + + + +# Check whether --with-appresdir or --without-appresdir was given. +if test "${with_appresdir+set}" = set; then + withval="$with_appresdir" + +fi; +if test -z "$groff_no_x"; then + # Create an Imakefile, run `xmkmf', then `make'. + rm -f -r conftest.dir + if mkdir conftest.dir; then + cd conftest.dir + # Make sure to not put `make' in the Imakefile rules, + # since we grep it out. + cat >Imakefile <<'EOF' + +xlibdirs: + @echo 'groff_x_usrlibdir="${USRLIBDIR}"; groff_x_libdir="${LIBDIR}"' +EOF + + if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then + # GNU make sometimes prints "make[1]: Entering...", + # which would confuse us. + eval `${MAKE-make} xlibdirs 2>/dev/null | grep -v make` + + # Open Windows `xmkmf' reportedly sets LIBDIR instead of USRLIBDIR. + for groff_extension in a so sl; do + if test ! -f $groff_x_usrlibdir/libX11.$groff_extension && + test -f $groff_x_libdir/libX11.$groff_extension; then + groff_x_usrlibdir=$groff_x_libdir + break + fi + done + fi + + cd .. + rm -f -r conftest.dir + fi + + # In case the test with `xmkmf' wasn't successful, try a suite of + # standard directories. Check `X11' before `X11Rn' because it is often + # a symlink to the current release. + groff_x_libdirs=' + /usr/X11/lib + /usr/X11R6/lib + /usr/X11R5/lib + /usr/X11R4/lib + + /usr/lib/X11 + /usr/lib/X11R6 + /usr/lib/X11R5 + /usr/lib/X11R4 + + /usr/local/X11/lib + /usr/local/X11R6/lib + /usr/local/X11R5/lib + /usr/local/X11R4/lib + + /usr/local/lib/X11 + /usr/local/lib/X11R6 + /usr/local/lib/X11R5 + /usr/local/lib/X11R4 + + /usr/X386/lib + /usr/x386/lib + /usr/XFree86/lib/X11 + + /usr/lib + /usr/local/lib + /usr/unsupported/lib + /usr/athena/lib + /usr/local/x11r5/lib + /usr/lpp/Xamples/lib + + /usr/openwin/lib + /usr/openwin/share/lib' + + if test -z "$groff_x_usrlibdir"; then + # We only test whether libX11 exists. + for groff_dir in $groff_x_libdirs; do + for groff_extension in a so sl; do + if test ! -r $groff_dir/libX11.$groff_extension; then + groff_x_usrlibdir=$groff_dir + break 2 + fi + done + done + fi + + if test "x$with_appresdir" = "x"; then + appresdir=$groff_x_usrlibdir/X11/app-defaults + else + appresdir=$with_appresdir + fi + fi + +if test -z "$PSPRINT"; then + for ac_prog in lpr +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_LPR+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$LPR"; then + ac_cv_prog_LPR="$LPR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_LPR="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi fi LPR=$ac_cv_prog_LPR if test -n "$LPR"; then @@ -3011,7 +5374,7 @@ echo "$as_me:$LINENO: checking for command to use for printing dvi files" >&5 echo $ECHO_N "checking for command to use for printing dvi files... $ECHO_C" >&6 if test -n "$PSPRINT" && test -z "$DVIPRINT"; then - if test "X$PSPRINT" = "Xlpr"; then + if test "x$PSPRINT" = "xlpr"; then DVIPRINT="lpr -d" else DVIPRINT="$PSPRINT" @@ -3164,7 +5527,6 @@ done done - test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":" fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB @@ -3176,7 +5538,19 @@ echo "${ECHO_T}no" >&6 fi - RANLIB=$ac_ct_RANLIB + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + if test "$build" != "$host"; then + { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} + fi + RANLIB=$ac_ct_RANLIB + fi else RANLIB="$ac_cv_prog_RANLIB" fi @@ -3311,10 +5685,10 @@ if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else - # As a last resort, use the slow shell script. We don't cache a - # path for INSTALL within a source directory, because that will + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is - # removed, or if the path is relative. + # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi @@ -3347,7 +5721,7 @@ echo $ECHO_N "checking for csh hash hack... $ECHO_C" >&6 cat <conftest.sh -#!/bin/sh +#! /bin/sh true || exit 0 export PATH || exit 0 exit 1 @@ -3367,254 +5741,206 @@ # checks for headers -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 -echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then - if test "${ac_cv_prog_CPP+set}" = set; then +echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 +echo $ECHO_N "checking for grep that handles long lines and -e... $ECHO_C" >&6 +if test "${ac_cv_path_GREP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - # Double quotes because CPP needs to be expanded - for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" - do - ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - : + # Extract the first word of "grep ggrep" to use in msg output +if test -z "$GREP"; then +set dummy grep ggrep; ac_prog_name=$2 +if test "${ac_cv_path_GREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.$ac_ext + # Create a temporary directory, and hook for its removal unless debugging. +$debug || +{ + trap 'exit_status=$?; rm -f -r $tmp && exit $exit_status' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} - # OK, works on sane cases. Now check whether non-existent headers - # can be detected and how. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes +# Create a (secure) tmp directory for tmp files. +: ${TMPDIR=/tmp} +{ + tmp=`(umask 077 && mktemp -d -q "$TMPDIR/GREPXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=$TMPDIR/GREP$$-$RANDOM + (umask 077 && mkdir $tmp) +} || +{ + echo "$me: cannot create a temporary directory in $TMPDIR" >&2 + { (exit 1); exit 1; } +} +ac_path_GREP_found=false +# Loop through the user's path and test for each of PROGNAME-LIST +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_dummy="$PATH:/usr/xpg4/bin" +for as_dir in $as_dummy +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + test -f "$ac_path_GREP" || continue + $ac_path_GREP_found || if $as_executable_p "$ac_path_GREP"; then + # Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +if "$ac_path_GREP" --version 2>&1 < /dev/null | grep 'GNU' >/dev/null; then + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=: +else + ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >"$tmp/conftest.in" + while : + do + cat "$tmp/conftest.in" "$tmp/conftest.in" >"$tmp/conftest.tmp" + mv "$tmp/conftest.tmp" "$tmp/conftest.in" + cp "$tmp/conftest.in" "$tmp/conftest.nl" + echo 'GREP' >> "$tmp/conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "$tmp/conftest.nl" >"$tmp/conftest.out" 2>/dev/null || break + diff "$tmp/conftest.out" "$tmp/conftest.nl" >/dev/null 2>&1 || break + ac_count=`expr $ac_count + 1` + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done fi -if test -z "$ac_cpp_err"; then - # Broken: success on invalid input. -continue -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - # Passes both tests. -ac_preproc_ok=: -break fi -rm -f conftest.err conftest.$ac_ext + $ac_path_GREP_found && break 3 + done done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then - break -fi - done - ac_cv_prog_CPP=$CPP +done + +rm -rf "$tmp" fi - CPP=$ac_cv_prog_CPP -else - ac_cv_prog_CPP=$CPP + +GREP="$ac_cv_path_GREP" +if test -z "$GREP"; then + { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH:/usr/xpg4/bin" >&5 +echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH:/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } fi -echo "$as_me:$LINENO: result: $CPP" >&5 -echo "${ECHO_T}$CPP" >&6 -ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes + fi -if test -z "$ac_cpp_err"; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - # Broken: fails on valid input. -continue + fi -rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 +echo "${ECHO_T}$ac_cv_path_GREP" >&6 + GREP="$ac_cv_path_GREP" - # OK, works on sane cases. Now check whether non-existent headers - # can be detected and how. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi + +echo "$as_me:$LINENO: checking for egrep" >&5 +echo $ECHO_N "checking for egrep... $ECHO_C" >&6 +if test "${ac_cv_path_EGREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - # Broken: success on invalid input. -continue + if echo a | ($GREP -E '(a|b)') >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + # Extract the first word of "egrep" to use in msg output +if test -z "$EGREP"; then +set dummy egrep; ac_prog_name=$2 +if test "${ac_cv_path_EGREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 + # Create a temporary directory, and hook for its removal unless debugging. +$debug || +{ + trap 'exit_status=$?; rm -f -r $tmp && exit $exit_status' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} - # Passes both tests. -ac_preproc_ok=: -break +# Create a (secure) tmp directory for tmp files. +: ${TMPDIR=/tmp} +{ + tmp=`(umask 077 && mktemp -d -q "$TMPDIR/EGREPXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=$TMPDIR/EGREP$$-$RANDOM + (umask 077 && mkdir $tmp) +} || +{ + echo "$me: cannot create a temporary directory in $TMPDIR" >&2 + { (exit 1); exit 1; } +} +ac_path_EGREP_found=false +# Loop through the user's path and test for each of PROGNAME-LIST +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_dummy="$PATH:/usr/xpg4/bin" +for as_dir in $as_dummy +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + test -f "$ac_path_EGREP" || continue + $ac_path_EGREP_found || if $as_executable_p "$ac_path_EGREP"; then + # Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +if "$ac_path_EGREP" --version 2>&1 < /dev/null | grep 'GNU' >/dev/null; then + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=: +else + ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >"$tmp/conftest.in" + while : + do + cat "$tmp/conftest.in" "$tmp/conftest.in" >"$tmp/conftest.tmp" + mv "$tmp/conftest.tmp" "$tmp/conftest.in" + cp "$tmp/conftest.in" "$tmp/conftest.nl" + echo 'EGREP' >> "$tmp/conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "$tmp/conftest.nl" >"$tmp/conftest.out" 2>/dev/null || break + diff "$tmp/conftest.out" "$tmp/conftest.nl" >/dev/null 2>&1 || break + ac_count=`expr $ac_count + 1` + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done fi -rm -f conftest.err conftest.$ac_ext +fi + + $ac_path_EGREP_found && break 3 + done done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then - : -else - { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details." >&5 -echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details." >&2;} + +done + +rm -rf "$tmp" + +fi + +EGREP="$ac_cv_path_EGREP" +if test -z "$EGREP"; then + { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH:/usr/xpg4/bin" >&5 +echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH:/usr/xpg4/bin" >&2;} { (exit 1); exit 1; }; } fi -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu +fi -echo "$as_me:$LINENO: checking for egrep" >&5 -echo $ECHO_N "checking for egrep... $ECHO_C" >&6 -if test "${ac_cv_prog_egrep+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if echo a | (grep -E '(a|b)') >/dev/null 2>&1 - then ac_cv_prog_egrep='grep -E' - else ac_cv_prog_egrep='egrep' - fi + fi fi -echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5 -echo "${ECHO_T}$ac_cv_prog_egrep" >&6 - EGREP=$ac_cv_prog_egrep +echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 +echo "${ECHO_T}$ac_cv_path_EGREP" >&6 + EGREP="$ac_cv_path_EGREP" echo "$as_me:$LINENO: checking for ANSI C header files" >&5 @@ -3726,6 +6052,7 @@ cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include +#include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) @@ -3745,7 +6072,7 @@ for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) - exit(2); + exit (2); exit (0); } _ACEOF @@ -4192,7 +6519,7 @@ else cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ + /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF @@ -4295,7 +6622,7 @@ else cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ + /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF @@ -4398,7 +6725,7 @@ else cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ + /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF @@ -4501,7 +6828,7 @@ else cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ + /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF @@ -4604,7 +6931,7 @@ else cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ + /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF @@ -4707,7 +7034,7 @@ else cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ + /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF @@ -4810,7 +7137,7 @@ else cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ + /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF @@ -4913,7 +7240,7 @@ else cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ + /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF @@ -5016,7 +7343,7 @@ else cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ + /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF @@ -5119,7 +7446,7 @@ else cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ + /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF @@ -5222,7 +7549,7 @@ else cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ + /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF @@ -5325,7 +7652,7 @@ else cat >conftest.$ac_ext <<_ACEOF - /* confdefs.h. */ + /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF @@ -5722,85 +8049,8 @@ ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - echo "$as_me:$LINENO: checking C++ " >&5 -echo $ECHO_N "checking C++ ... $ECHO_C" >&6 - cat >conftest.$ac_ext <<_ACEOF - - /* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - - -#include - - -int -main () -{ - - -uint32_t x; -int32_t y; - - - ; - return 0; -} - -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" - || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6 - -cat >>confdefs.h <<\_ACEOF -#define HAVE_CC_STDINT_H 1 -_ACEOF - -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6 -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -ac_ext=cc -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - - echo "$as_me:$LINENO: checking for inttypes.h" >&5 -echo $ECHO_N "checking for inttypes.h... $ECHO_C" >&6 + echo "$as_me:$LINENO: checking C++ " >&5 +echo $ECHO_N "checking C++ ... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ @@ -5850,6 +8100,11 @@ echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then groff_cv_header_inttypes_h=yes + +cat >>confdefs.h <<\_ACEOF +#define HAVE_CC_INTTYPES_H 1 +_ACEOF + else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 @@ -6030,35 +8285,42 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -echo "$as_me:$LINENO: checking return type of signal handlers" >&5 -echo $ECHO_N "checking return type of signal handlers... $ECHO_C" >&6 -if test "${ac_cv_type_signal+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ +echo "$as_me:$LINENO: checking for return type of signal handlers" >&5 +echo $ECHO_N "checking for return type of signal handlers... $ECHO_C" >&6 + for groff_declaration in \ + 'extern "C" void (*signal (int, void (*)(int)))(int);' \ + 'extern "C" void (*signal (int, void (*)(int)) throw ())(int);' \ + 'void (*signal ()) ();' + do + cat >conftest.$ac_ext <<_ACEOF + + /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ + + #include #include #ifdef signal # undef signal #endif -#ifdef __cplusplus -extern "C" void (*signal (int, void (*)(int)))(int); -#else -void (*signal ()) (); -#endif +$groff_declaration + int main () { + + int i; + + ; return 0; } + _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 @@ -6082,23 +8344,33 @@ ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then - ac_cv_type_signal=void + break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -ac_cv_type_signal=int +continue fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -fi -echo "$as_me:$LINENO: result: $ac_cv_type_signal" >&5 -echo "${ECHO_T}$ac_cv_type_signal" >&6 + done -cat >>confdefs.h <<_ACEOF -#define RETSIGTYPE $ac_cv_type_signal + if test -n "$groff_declaration"; then + echo "$as_me:$LINENO: result: void" >&5 +echo "${ECHO_T}void" >&6 + +cat >>confdefs.h <<\_ACEOF +#define RETSIGTYPE void _ACEOF + else + echo "$as_me:$LINENO: result: int" >&5 +echo "${ECHO_T}int" >&6 + +cat >>confdefs.h <<\_ACEOF +#define RETSIGTYPE int +_ACEOF + fi echo "$as_me:$LINENO: checking struct exception" >&5 echo $ECHO_N "checking struct exception... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF @@ -6668,7 +8940,7 @@ data2 = (char *) malloc (2 * pagesize); if (!data2) exit (1); - data2 += (pagesize - ((long) data2 & (pagesize - 1))) & (pagesize - 1); + data2 += (pagesize - ((long int) data2 & (pagesize - 1))) & (pagesize - 1); if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED, fd, 0L)) exit (1); @@ -7463,7 +9735,7 @@ echo "$as_me:$LINENO: checking default paper size" >&5 echo $ECHO_N "checking default paper size... $ECHO_C" >&6 groff_prefix=$prefix - test "x$prefix" = xNONE && groff_prefix=$ac_default_prefix + test "x$prefix" = "xNONE" && groff_prefix=$ac_default_prefix if test -z "$PAGE"; then descfile= if test -r $groff_prefix/share/groff/font/devps/DESC; then @@ -7662,7 +9934,124 @@ echo "$as_me:$LINENO: result: $GROFF_PATH_SEPARATOR" >&5 echo "${ECHO_T}$GROFF_PATH_SEPARATOR" >&6 -make_html=html + +# Check whether --with-alt-gs or --without-alt-gs was given. +if test "${with_alt_gs+set}" = set; then + withval="$with_alt_gs" + ALT_GHOSTSCRIPT_PROGS="$withval" +else + ALT_GHOSTSCRIPT_PROGS="gs gswin32c gsos2" +fi; + + + +# Check whether --with-gs or --without-gs was given. +if test "${with_gs+set}" = set; then + withval="$with_gs" + GHOSTSCRIPT=$withval +else + if test -n "$ac_tool_prefix"; then + for ac_prog in $ALT_GHOSTSCRIPT_PROGS + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_GHOSTSCRIPT+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$GHOSTSCRIPT"; then + ac_cv_prog_GHOSTSCRIPT="$GHOSTSCRIPT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_GHOSTSCRIPT="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +GHOSTSCRIPT=$ac_cv_prog_GHOSTSCRIPT +if test -n "$GHOSTSCRIPT"; then + echo "$as_me:$LINENO: result: $GHOSTSCRIPT" >&5 +echo "${ECHO_T}$GHOSTSCRIPT" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$GHOSTSCRIPT" && break + done +fi +if test -z "$GHOSTSCRIPT"; then + ac_ct_GHOSTSCRIPT=$GHOSTSCRIPT + for ac_prog in $ALT_GHOSTSCRIPT_PROGS +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_GHOSTSCRIPT+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_GHOSTSCRIPT"; then + ac_cv_prog_ac_ct_GHOSTSCRIPT="$ac_ct_GHOSTSCRIPT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_GHOSTSCRIPT="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_GHOSTSCRIPT=$ac_cv_prog_ac_ct_GHOSTSCRIPT +if test -n "$ac_ct_GHOSTSCRIPT"; then + echo "$as_me:$LINENO: result: $ac_ct_GHOSTSCRIPT" >&5 +echo "${ECHO_T}$ac_ct_GHOSTSCRIPT" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_GHOSTSCRIPT" && break +done + + if test "x$ac_ct_GHOSTSCRIPT" = x; then + GHOSTSCRIPT="missing" + else + if test "$build" != "$host"; then + { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} + fi + GHOSTSCRIPT=$ac_ct_GHOSTSCRIPT + fi +fi + +fi; + test "$GHOSTSCRIPT" = "no" && GHOSTSCRIPT=missing + + make_html=html make_install_html=install_html missing= @@ -7703,7 +10092,7 @@ fi if test $pnmcut = missing; then - missing="$missing pnmcut" + missing="$missing \`pnmcut'" fi;# Extract the first word of "pnmcrop", so it can be a program name with args. set dummy pnmcrop; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 @@ -7741,7 +10130,7 @@ fi if test $pnmcrop = missing; then - missing="$missing pnmcrop" + missing="$missing \`pnmcrop'" fi;# Extract the first word of "pnmtopng", so it can be a program name with args. set dummy pnmtopng; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 @@ -7779,7 +10168,7 @@ fi if test $pnmtopng = missing; then - missing="$missing pnmtopng" + missing="$missing \`pnmtopng'" fi;# Extract the first word of "psselect", so it can be a program name with args. set dummy psselect; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 @@ -7817,7 +10206,7 @@ fi if test $psselect = missing; then - missing="$missing psselect" + missing="$missing \`psselect'" fi;# Extract the first word of "pnmtops", so it can be a program name with args. set dummy pnmtops; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 @@ -7855,16 +10244,79 @@ fi if test $pnmtops = missing; then - missing="$missing pnmtops" - fi;# Extract the first word of "gs", so it can be a program name with args. -set dummy gs; ac_word=$2 + missing="$missing \`pnmtops'" + fi; + + test "$GHOSTSCRIPT" = "missing" && missing="$missing \`gs'" + + if test -n "$missing"; then + plural=`set $missing; test $# -gt 1 && echo s` + missing=`set $missing + missing="" + while test $# -gt 0 + do + case $# in + 1) missing="$missing$1" ;; + 2) missing="$missing$1 and " ;; + *) missing="$missing$1, " ;; + esac + shift + done + echo $missing` + + make_html= + make_install_html= + + { echo "$as_me:$LINENO: WARNING: missing program$plural: + + The program$plural + $missing + cannot be found in the PATH. + Consequently, groff's HTML backend (grohtml) will not work properly; + therefore, it will neither be possible to prepare, nor to install, + documentation in HTML format. + " >&5 +echo "$as_me: WARNING: missing program$plural: + + The program$plural + $missing + cannot be found in the PATH. + Consequently, groff's HTML backend (grohtml) will not work properly; + therefore, it will neither be possible to prepare, nor to install, + documentation in HTML format. + " >&2;} + fi + + + + +# Check whether --with-alt-awk or --without-alt-awk was given. +if test "${with_alt_awk+set}" = set; then + withval="$with_alt_awk" + ALT_AWK_PROGS="$withval" +else + ALT_AWK_PROGS="gawk mawk nawk awk" +fi; + + + +# Check whether --with-awk or --without-awk was given. +if test "${with_awk+set}" = set; then + withval="$with_awk" + AWK=$withval +else + if test -n "$ac_tool_prefix"; then + for ac_prog in $ALT_AWK_PROGS + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 -if test "${ac_cv_prog_gs+set}" = set; then +if test "${ac_cv_prog_AWK+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else - if test -n "$gs"; then - ac_cv_prog_gs="$gs" # Let the user override the test. + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH @@ -7873,71 +10325,117 @@ test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_gs="found" + ac_cv_prog_AWK="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done - test -z "$ac_cv_prog_gs" && ac_cv_prog_gs="missing" fi fi -gs=$ac_cv_prog_gs -if test -n "$gs"; then - echo "$as_me:$LINENO: result: $gs" >&5 -echo "${ECHO_T}$gs" >&6 +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + echo "$as_me:$LINENO: result: $AWK" >&5 +echo "${ECHO_T}$AWK" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi - if test $gs = missing; then - missing="$missing gs" - fi; + test -n "$AWK" && break + done +fi +if test -z "$AWK"; then + ac_ct_AWK=$AWK + for ac_prog in $ALT_AWK_PROGS +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_AWK+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_AWK"; then + ac_cv_prog_ac_ct_AWK="$ac_ct_AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AWK="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done - if test -n "$missing"; then - cnt=0 - for i in $missing - do - cnt=`expr $cnt + 1` - eval "prog$cnt=$i" - done - plural="s" - case $cnt in - 1) - plural="" - progs="\`$prog1'" ;; - 2) - progs="\`$prog1' and \`$prog2'" ;; - 3) - progs="\`$prog1', \`$prog2', and \`$prog3'" ;; - 4) - progs="\`$prog1', \`$prog2', \`$prog3', and \`$prog4'" ;; - 5) - progs="\`$prog1', \`$prog2', \`$prog3', \`$prog4', and \`$prog5'" ;; - 6) - progs="\`$prog1', \`$prog2', \`$prog3', \`$prog4', \`$prog5', and \`$prog6'" ;; - esac +fi +fi +ac_ct_AWK=$ac_cv_prog_ac_ct_AWK +if test -n "$ac_ct_AWK"; then + echo "$as_me:$LINENO: result: $ac_ct_AWK" >&5 +echo "${ECHO_T}$ac_ct_AWK" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi - make_html= - make_install_html= + test -n "$ac_ct_AWK" && break +done + + if test "x$ac_ct_AWK" = x; then + AWK="missing" + else + if test "$build" != "$host"; then + { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} + fi + AWK=$ac_ct_AWK + fi +fi - { echo "$as_me:$LINENO: WARNING: +fi; + test "$AWK" = "no" && AWK=missing - The program$plural - $progs - can't be found in the path, thus the HTML backend of groff (grohtml) - won't work properly. Consequently, no documentation in HTML format - is built and installed. + + + make_pdfdoc=pdfdoc + make_install_pdfdoc=install_pdfdoc + + missing="" + test "$AWK" = missing && missing="\`awk'" + test "$GHOSTSCRIPT" = missing && missing="$missing \`gs'" + if test -n "$missing"; then + plural=`set $missing; test $# -eq 2 && echo s` + test x$plural = xs \ + && missing=`set $missing; echo "$1 and $2"` \ + || missing=`echo $missing` + + make_pdfdoc= + make_install_pdfdoc= + + { echo "$as_me:$LINENO: WARNING: missing program$plural: + + The program$plural $missing cannot be found in the PATH. + Consequently, groff's PDF formatter (pdfroff) will not work properly; + therefore, it will neither be possible to prepare, nor to install, + documentation in PDF format. " >&5 -echo "$as_me: WARNING: +echo "$as_me: WARNING: missing program$plural: - The program$plural - $progs - can't be found in the path, thus the HTML backend of groff (grohtml) - won't work properly. Consequently, no documentation in HTML format - is built and installed. + The program$plural $missing cannot be found in the PATH. + Consequently, groff's PDF formatter (pdfroff) will not work properly; + therefore, it will neither be possible to prepare, nor to install, + documentation in PDF format. " >&2;} fi @@ -7958,7 +10456,9 @@ ac_config_files="$ac_config_files stamp-h" - ac_config_files="$ac_config_files Makefile doc/Makefile src/xditview/Imakefile" + ac_config_files="$ac_config_files Makefile doc/Makefile src/utils/xtotroff/Makefile" + + ac_config_files="$ac_config_files contrib/gdiffmk/tests/runtests" ac_config_files="$ac_config_files test-groff" @@ -8042,8 +10542,8 @@ ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. - ac_i=`echo "$ac_i" | - sed 's/\$U\././;s/\.o$//;s/\.obj$//'` + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`echo "$ac_i" | sed "$ac_script"` # 2. Add them. ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' @@ -8084,11 +10584,35 @@ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' -elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + setopt NO_GLOB_SUBST +elif test -n "${BASH_VERSION+set}${KSH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi +BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh + +# PATH needs CR +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset @@ -8097,8 +10621,35 @@ fi +# Find who we are. Look in the path if we contain no path at all +# relative or not. +case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute file name" >&5 +echo "$as_me: error: cannot find myself; rerun with an absolute file name" >&2;} + { (exit 1); exit 1; }; } +fi + # Work around bugs in pre-3.0 UWIN ksh. -$as_unset ENV MAIL MAILPATH +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +done PS1='$ ' PS2='> ' PS4='+ ' @@ -8112,7 +10663,7 @@ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else - $as_unset $as_var + ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var fi done @@ -8143,102 +10694,38 @@ s/.*/./; q'` -# PATH needs CR, and LINENO needs CR and PATH. -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - echo "#! /bin/sh" >conf$$.sh - echo "exit 0" >>conf$$.sh - chmod +x conf$$.sh - if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then - PATH_SEPARATOR=';' - else - PATH_SEPARATOR=: - fi - rm -f conf$$.sh -fi - - as_lineno_1=$LINENO - as_lineno_2=$LINENO - as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" || { - # Find who we are. Look in the path if we contain no path at all - # relative or not. - case $0 in - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break -done - ;; - esac - # We did not find ourselves, most probably we were run as `sh COMMAND' - # in which case we are not to be found in the path. - if test "x$as_myself" = x; then - as_myself=$0 - fi - if test ! -f "$as_myself"; then - { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 -echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} - { (exit 1); exit 1; }; } - fi - case $CONFIG_SHELL in - '') - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for as_base in sh bash ksh sh5; do - case $as_dir in - /*) - if ("$as_dir/$as_base" -c ' as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && - test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then - $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } - $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } - CONFIG_SHELL=$as_dir/$as_base - export CONFIG_SHELL - exec "$CONFIG_SHELL" "$0" ${1+"$@"} - fi;; - esac - done -done -;; - esac + test "x$as_lineno_3" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a - # line-number line before each line; the second 'sed' does the real - # work. The second script uses 'N' to pair each line-number line - # with the numbered line, and appends trailing '-' during - # substitution so that $LINENO is not a special case at line end. + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the - # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) - sed '=' <$as_myself | + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | sed ' + s,[$]LINENO.*,&-, + t lineno + b + : lineno N - s,$,-, : loop - s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + s,[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\),\2\1\2, t loop - s,-$,, - s,^['$as_cr_digits']*\n,, + s,-\n.*,, ' >$as_me.lineno && chmod +x $as_me.lineno || { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 @@ -8325,7 +10812,7 @@ cat >&5 <<_CSEOF This file was extended by $as_me, which was -generated by GNU Autoconf 2.59. Invocation command line was +generated by GNU Autoconf 2.59b. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -8385,10 +10872,10 @@ cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ config.status -configured by $0, generated by GNU Autoconf 2.59, +configured by $0, generated by GNU Autoconf 2.59b, with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" -Copyright (C) 2003 Free Software Foundation, Inc. +Copyright (C) 2004 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." srcdir=$srcdir @@ -8490,7 +10977,8 @@ "stamp-h" ) CONFIG_FILES="$CONFIG_FILES stamp-h" ;; "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; "doc/Makefile" ) CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; - "src/xditview/Imakefile" ) CONFIG_FILES="$CONFIG_FILES src/xditview/Imakefile" ;; + "src/utils/xtotroff/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/utils/xtotroff/Makefile" ;; + "contrib/gdiffmk/tests/runtests" ) CONFIG_FILES="$CONFIG_FILES contrib/gdiffmk/tests/runtests" ;; "test-groff" ) CONFIG_FILES="$CONFIG_FILES test-groff" ;; "src/include/config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS src/include/config.h:src/include/config.hin" ;; *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 @@ -8514,7 +11002,7 @@ # Create a temporary directory, and hook for its removal unless debugging. $debug || { - trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 + trap 'exit_status=$?; rm -f -r $tmp && exit $exit_status' 0 trap '{ (exit 1); exit 1; }' 1 2 13 15 } @@ -8589,6 +11077,15 @@ s,@ac_ct_CXX@,$ac_ct_CXX,;t t s,@TTYDEVDIRS@,$TTYDEVDIRS,;t t s,@OTHERDEVDIRS@,$OTHERDEVDIRS,;t t +s,@CPP@,$CPP,;t t +s,@X_CFLAGS@,$X_CFLAGS,;t t +s,@X_PRE_LIBS@,$X_PRE_LIBS,;t t +s,@X_LIBS@,$X_LIBS,;t t +s,@X_EXTRA_LIBS@,$X_EXTRA_LIBS,;t t +s,@XDEVDIRS@,$XDEVDIRS,;t t +s,@XPROGDIRS@,$XPROGDIRS,;t t +s,@XLIBDIRS@,$XLIBDIRS,;t t +s,@appresdir@,$appresdir,;t t s,@LPR@,$LPR,;t t s,@LP@,$LP,;t t s,@LPQ@,$LPQ,;t t @@ -8604,7 +11101,7 @@ s,@INSTALL_DATA@,$INSTALL_DATA,;t t s,@LN_S@,$LN_S,;t t s,@SH_SCRIPT_SED_CMD@,$SH_SCRIPT_SED_CMD,;t t -s,@CPP@,$CPP,;t t +s,@GREP@,$GREP,;t t s,@EGREP@,$EGREP,;t t s,@LIBC@,$LIBC,;t t s,@LIBM@,$LIBM,;t t @@ -8615,14 +11112,21 @@ s,@sys_tmac_prefix@,$sys_tmac_prefix,;t t s,@tmac_wrap@,$tmac_wrap,;t t s,@GROFF_PATH_SEPARATOR@,$GROFF_PATH_SEPARATOR,;t t +s,@ALT_GHOSTSCRIPT_PROGS@,$ALT_GHOSTSCRIPT_PROGS,;t t +s,@GHOSTSCRIPT@,$GHOSTSCRIPT,;t t +s,@ac_ct_GHOSTSCRIPT@,$ac_ct_GHOSTSCRIPT,;t t s,@pnmcut@,$pnmcut,;t t s,@pnmcrop@,$pnmcrop,;t t s,@pnmtopng@,$pnmtopng,;t t s,@psselect@,$psselect,;t t s,@pnmtops@,$pnmtops,;t t -s,@gs@,$gs,;t t s,@make_html@,$make_html,;t t s,@make_install_html@,$make_install_html,;t t +s,@ALT_AWK_PROGS@,$ALT_AWK_PROGS,;t t +s,@AWK@,$AWK,;t t +s,@ac_ct_AWK@,$ac_ct_AWK,;t t +s,@make_pdfdoc@,$make_pdfdoc,;t t +s,@make_install_pdfdoc@,$make_install_pdfdoc,;t t s,@pnmtops_nosetpage@,$pnmtops_nosetpage,;t t s,@LTLIBOBJS@,$LTLIBOBJS,;t t CEOF @@ -8696,7 +11200,7 @@ /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then - mkdir -p "$ac_dir" + test -d "$ac_dir" || mkdir -p "$ac_dir" else as_dir="$ac_dir" as_dirs= @@ -8738,15 +11242,15 @@ else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; - [\\/]* | ?:[\\/]* ) # Absolute path. + [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; - *) # Relative path. + *) # Relative name. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac -# Do not use `cd foo && pwd` to compute absolute paths, because +# Do not use `cd foo && pwd` to compute absolute names, because # the directories may not exist. case `pwd` in .) ac_abs_builddir="$ac_dir";; @@ -8864,6 +11368,7 @@ # Run the commands associated with the file. case $ac_file in stamp-h ) echo timestamp > stamp-h ;; + contrib/gdiffmk/tests/runtests ) chmod +x contrib/gdiffmk/tests/runtests ;; test-groff ) chmod +x test-groff ;; esac done @@ -8914,7 +11419,7 @@ test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } - # Do quote $f, to prevent DOS paths from being IFS'd. + # Quote $f, to prevent DOS file names from being IFS'd. echo "$f";; *) # Relative if test -f "$f"; then @@ -9058,7 +11563,7 @@ /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then - mkdir -p "$ac_dir" + test -d "$ac_dir" || mkdir -p "$ac_dir" else as_dir="$ac_dir" as_dirs= @@ -9122,23 +11627,37 @@ fi -{ echo "$as_me:$LINENO: - - Configuration completed. - - You can now say \`make' to compile the groff package and \`make install' - to install it afterwards. - - If you want to compile xditview, change the directory to \`src/xditview' - and follow the instructions given in the file \`INSTALL'. -" >&5 +if test -z "$groff_no_x"; then + if test "x$with_appresdir" = "x"; then + { echo "$as_me:$LINENO: + + The application resource file for gxditview will be installed as + + $appresdir/GXditview + + (an existing file will be saved as \`GXditview.old'). + To install it into a different directory, say, \`/etc/gxditview', + add \`--with-appresdir=/etc/gxditview' to the configure script + command line options and rerun it. The environment variable + \`APPLRESDIR' must then be set to \`/etc/' (note the trailing slash), + omitting the \`gxditview' part which is automatically appended by + the X11 searching routines for resource files. More details can be + found in the X(7) manual page. + " >&5 echo "$as_me: - Configuration completed. + The application resource file for gxditview will be installed as - You can now say \`make' to compile the groff package and \`make install' - to install it afterwards. + $appresdir/GXditview - If you want to compile xditview, change the directory to \`src/xditview' - and follow the instructions given in the file \`INSTALL'. -" >&6;} + (an existing file will be saved as \`GXditview.old'). + To install it into a different directory, say, \`/etc/gxditview', + add \`--with-appresdir=/etc/gxditview' to the configure script + command line options and rerun it. The environment variable + \`APPLRESDIR' must then be set to \`/etc/' (note the trailing slash), + omitting the \`gxditview' part which is automatically appended by + the X11 searching routines for resource files. More details can be + found in the X(7) manual page. + " >&6;} + fi + fi diff -ruN groff-1.19.1/configure.ac groff-1.19.2/configure.ac --- groff-1.19.1/configure.ac 2003-12-30 05:03:01.000000000 +0100 +++ groff-1.19.2/configure.ac 2005-05-26 15:37:18.000000000 +0200 @@ -1,5 +1,27 @@ +# Autoconf configuration file for groff. +# Copyright (C) 1989-1995, 2001, 2002, 2003, 2004, 2005 +# Free Software Foundation, Inc. +# +# This file is part of groff. +# +# groff 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. +# +# groff 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 groff; see the file COPYING. If not, write to the Free Software +# Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. +# # Process this file with autoconf to produce a configure script. + AC_INIT +AC_PREREQ(2.59) AC_CONFIG_HEADERS([src/include/config.h:src/include/config.hin]) AC_CONFIG_SRCDIR([src/roff/groff/groff.cpp]) @@ -10,6 +32,9 @@ GROFF_CXX_CHECK GROFF_EBCDIC GROFF_OS390 +GROFF_X11 +GROFF_APPRESDIR_OPTION +GROFF_APPRESDIR_DEFAULT GROFF_PRINT AC_PATH_PROG([PERLPATH], [perl], [/usr/bin/perl]) GROFF_PROG_YACC @@ -48,14 +73,13 @@ GROFF_SYS_ERRLIST GROFF_OSFCN_H GROFF_LIMITS_H -GROFF_STDINT_H GROFF_INTTYPES_H # checks for typedefs GROFF_UNSIGNED_LONG_LONG GROFF_UINTMAX_T GROFF_TIME_T -AC_TYPE_SIGNAL +GROFF_TYPE_SIGNAL GROFF_STRUCT_EXCEPTION # checks for libraries @@ -89,20 +113,14 @@ GROFF_TMAC GROFF_TARGET_PATH_SEPARATOR GROFF_HTML_PROGRAMS +GROFF_PDFDOC_PROGRAMS GROFF_PNMTOPS_NOSETPAGE AC_CONFIG_FILES([stamp-h], [echo timestamp > stamp-h]) -AC_CONFIG_FILES([Makefile doc/Makefile src/xditview/Imakefile]) +AC_CONFIG_FILES([Makefile doc/Makefile src/utils/xtotroff/Makefile]) +AC_CONFIG_FILES([contrib/gdiffmk/tests/runtests], + [chmod +x contrib/gdiffmk/tests/runtests]) AC_CONFIG_FILES([test-groff], [chmod +x test-groff]) AC_OUTPUT -AC_MSG_NOTICE([ - - Configuration completed. - - You can now say `make' to compile the groff package and `make install' - to install it afterwards. - - If you want to compile xditview, change the directory to `src/xditview' - and follow the instructions given in the file `INSTALL'. -]) +GROFF_APPRESDIR_CHECK diff -ruN groff-1.19.1/contrib/eqn2graph/eqn2graph.sh groff-1.19.2/contrib/eqn2graph/eqn2graph.sh --- groff-1.19.1/contrib/eqn2graph/eqn2graph.sh 2003-10-28 08:46:23.000000000 +0100 +++ groff-1.19.2/contrib/eqn2graph/eqn2graph.sh 2005-05-18 09:03:06.000000000 +0200 @@ -1,4 +1,4 @@ -#!/bin/sh +#! /bin/sh # # eqn2graph -- compile EQN equation descriptions to bitmap images # @@ -32,7 +32,7 @@ # # Thus, we pass -U to groff(1), and everything else to convert(1). # -# $Id: eqn2graph.sh,v 1.3 2003/10/28 07:46:23 wlemb Exp $ +# $Id: eqn2graph.sh,v 1.5 2005/05/18 07:03:06 wl Exp $ # groff_opts="" convert_opts="" @@ -85,7 +85,7 @@ read equation (echo ".EQ"; echo 'delim $$'; echo ".EN"; echo '$'"$equation"'$') | \ groff -e $groff_opts -Tps -P-pletter > $tmp/eqn2graph.ps \ - && convert -crop 0x0 $convert_opts $tmp/eqn2graph.ps $tmp/eqn2graph.$format \ + && convert -trim -crop 0x0 $convert_opts $tmp/eqn2graph.ps $tmp/eqn2graph.$format \ && cat $tmp/eqn2graph.$format # End diff -ruN groff-1.19.1/contrib/gdiffmk/ChangeLog groff-1.19.2/contrib/gdiffmk/ChangeLog --- groff-1.19.1/contrib/gdiffmk/ChangeLog 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/contrib/gdiffmk/ChangeLog 2005-01-17 00:06:50.000000000 +0100 @@ -0,0 +1,63 @@ +2005-01-16 Mike Bianchi + + * gdiffmk.sh (Usage): Fix typos. + : Allow `-M ' also. + + * gdiffmk.man: Updated. + +2005-01-13 Mike Bianchi + + * gdiffmk.sh: Add the -D, -M, and -B options, which provide actions + akin to nrchbar. + Thanks to Larry Kollar (http://home.alltel.net/kollar/groff/). + + * gdiffmk.man: Updated. + + * tests/runtests.in: Added tests for gdiffmk's -D, -M, and -B + options. + + * tests/baseline8, tests/baseline9, tests/baseline10: New files. + +2004-12-16 Mike Bianchi + + * tests/runtests.in: Fix typo (s/$(srcdir)/${srcdir}/). + +2004-12-15 Werner LEMBERG + + The configure script now generates tests/runtests. + + * tests/tests.sh: Renamed to... + * tests/runtests.in: This. + Add proper $srcdir prefixes to make it run from build directory. + * README, Makefile.sub (CLEANADD), tests/test_baseline7: Updated. + +2004-12-14 Werner LEMBERG + + * gdiffmk.sh: Make sed pattern work with alternate result of GNU + diff's -D option, using `!' instead of `not' in #endif comments. + (Exit): Use prefix for each emitted message line. + +2004-12-14 Mike Bianchi + + * tests/*: New files for testing gdiffmk. + + * README, gdiffmk.man, gdiffmk.sh: Updated. + Minor fixes. + +2004-12-13 Mike Bianchi + + Add `-x' command line option to select a diff program. + + * gdiffmk.sh: Add code to handle `-x'. + Move test for working `diff' down. + Fix sed pattern -- `.mc *' needs to be followed by `.mc .'. + (Usage): Updated. + * gdiffmk.man: Updated. + +2004-12-12 Mike Bianchi + + * README: New file. + +2004-12-11 Mike Bianchi + + First import of gdiffmk files. diff -ruN groff-1.19.1/contrib/gdiffmk/gdiffmk.man groff-1.19.2/contrib/gdiffmk/gdiffmk.man --- groff-1.19.1/contrib/gdiffmk/gdiffmk.man 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/contrib/gdiffmk/gdiffmk.man 2005-05-26 15:37:18.000000000 +0200 @@ -0,0 +1,281 @@ +.ig \"-*- nroff -*- +Copyright (C) 2004, 2005 Free Software Foundation, Inc. + +This file is part of the gdiffmk utility, which is part of groff. +Written by Mike Bianchi > + +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 included in +translations approved by the Free Software Foundation instead of in +the original English. +.. +. +.do mso www.tmac +. +.TH GDIFFMK @MAN1EXT@ "@MDATE@" "Groff Version @VERSION@" +. +. +.SH NAME +gdiffmk \- mark differences between groff/nroff/troff files +. +. +.SH SYNOPSIS +.nr a \n(.j +.ad l +.nr i \n(.i +.in +\w'\fBgdiffmk 'u +.ti \niu +.B gdiffmk +.de OP +. ie \\n(.$-1 .RI "[\ \fB\\$1\fP" "\\$2" "\ ]" +. el .RB "[\ " "\\$1" "\ ]" +.. +.OP \-a \%addmark +.OP \-c \%changemark +.OP \-d \%deletemark +[\ \c +.B \-D +.OP \-B +.OP \-M "mark1 mark2" +] +.OP \-x \%diffcmd +.OP \-\- +.OP \-\-help +.OP \%\-\-version +.I \%file1 +.I \%file2 +[\ \c +.IR \%output \ \c +] +.br +.ad \na +. +. +.SH DESCRIPTION +.B gdiffmk +compares two +.BR groff (1), +.BR nroff (1), +or +.BR troff (1) +documents, +.I file1 +and +.IR file2 , +and creates an output which is +.I file2 +with added `margin character' (.mc) commands that indicate the differences. +. +.LP +If the +.I output +filename is present, +the output is written there. +If it is +.B \- +or absent the output is written to the standard output. +. +.LP +If the +.I file1 +or +.I file2 +argument is +.B \- +the standard input is read for that input. +Clearly both cannot be +.BR \- . +. +.LP +Note that the output is not necessarily compatible with all macro packages +and all preprocessors. +See the +.B BUGS +section below. +. +. +.SH OPTIONS +.TP +.BI \-a addmark +Use the +.I addmark +for source lines not in +.I file1 +but present in +.IR file2 . +Default: +.BR + . +. +.TP +.B \-B +By default, the deleted texts marked by the +.B \-D +option end +with an added troff break command, +.BR .br , +to ensure that the deletions are marked properly. +This is the only way to guarantee that deletions and small +changes get flagged. +This option directs the program not to insert these breaks; it makes no +sense to use it without +.BR \-D . +. +.TP +.BI \-c changemark +Use the +.I changemark +for changed source lines. +Default: +.BR | . +. +.TP +.BI \-d deletemark +Use the +.I deletemark +for deleted source lines. +Default: +.BR * . +. +.TP +.B \-D +Show the deleted portions from changed and deleted text. +Default delimiting marks: +.BR "[[" " .\&.\&.\&. " "]]" . +. +.TP +.BI \-M "mark1 mark2" +Change the delimiting marks for the +.B \-D +option. +It makes no sense to use this option without +.BR \-D . +. +.TP +.BI \-x diffcmd +Use the +.I diffcmd +command to perform the comparison of +.I file1 +and +.IR file2 . +In particular, +.I diffcmd +should accept the GNU +.B diff +.BI \-D name +option. +Default: +.BR diff (1). +. +.TP +.B \-\- +All the following arguments are treated as file names, +even if they begin with +.BR \- . +. +.TP +.B \-\-help +Print a usage message on standard error output and exit. +. +.TP +.B \-\-version +Print version information on the standard output and exit. +. +. +.SH BUGS +The output is not necessarily compatible with all macro packages +and all preprocessors. +A workaround that is often successful against preprocessor problems +is to run +.B gdiffmk +on the output of all the preprocessors instead of the input source. +. +.LP +.B gdiffmk +relies on the +.BI \-D name +option of GNU +.BR diff (1) +to make a merged `#ifdef' output format. +It hasn't been tested whether other versions of +.BR diff (1) +do support this option. +See also the +.BI \-x diffcmd +option. +. +.LP +Report bugs to bug-groff@gnu.org. +Include a complete, self-contained example that will allow the bug to +be reproduced, and say which version of +.B gdiffmk +you are using. +. +. +.SH AUTHORS +This document was written and is maintained by +.MTO MBianchi@Foveal.com "Mike Bianchi" . +. +.LP +This document is distributed under the terms of the FDL (GNU Free +Documentation License) version 1.1 or later. +You should have received a copy of the FDL on your system, it is also +available on-line at the +.URL http://\:www.gnu.org/\:copyleft/\:fdl.html "GNU copyleft site" . +. +.LP +.B gdiffmk +is part of the +.I groff +GNU free software project. +All parts of the +.I groff package +are protected by GNU copyleft licenses. +The software files are distributed under the terms of the GNU General +Public License (GPL), while the documentation files mostly use the GNU +Free Documentation License (FDL). +. +. +.SH COPYRIGHT +Copyright \(co 2004, 2005 Free Software Foundation, Inc. +. +.LP +.B gdiffmk +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. +. +.LP +.B gdiffmk +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. +. +.LP +You should have received a copy of the GNU General Public License along +with groff; see the file COPYING. +If not, write to the Free Software +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. +. +. +.SH "SEE ALSO" +.BR groff (@MAN1EXT@), +.BR nroff (@MAN1EXT@), +.BR gtroff (@MAN1EXT@), +.BR diff (@MAN1EXT@) +. +.\" Local Variables: +.\" mode: nroff +.\" End: diff -ruN groff-1.19.1/contrib/gdiffmk/gdiffmk.sh groff-1.19.2/contrib/gdiffmk/gdiffmk.sh --- groff-1.19.1/contrib/gdiffmk/gdiffmk.sh 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/contrib/gdiffmk/gdiffmk.sh 2005-05-26 15:37:18.000000000 +0200 @@ -0,0 +1,346 @@ +#! /bin/sh +# Copyright (C) 2004, 2005 Free Software Foundation, Inc. +# Written by Mike Bianchi > + +# This file is part of the gdiffmk utility, which is part of groff. + +# groff 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. + +# groff 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 groff; see the files COPYING and LICENSE in the top +# directory of the groff source. If not, write to the Free Software +# Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. +# This file is part of GNU gdiffmk. + + +cmd=$( basename $0 ) + +function Usage { + if test "$#" -gt 0 + then + echo >&2 "${cmd}: $@" + fi + echo >&2 "\ + +Usage: ${cmd} [ OPTIONS ] FILE1 FILE2 [ OUTPUT ] +Place difference marks into the new version of a groff/nroff/troff document. +FILE1 and FILE2 are compared, using \`diff', and FILE2 is output with +groff \`.mc' requests added to indicate how it is different from FILE1. + + FILE1 Previous version of the groff file. \`-' means standard input. + FILE2 Current version of the groff file. \`-' means standard input. + Either FILE1 or FILE2 can be standard input, but not both. + OUTPUT Copy of FILE2 with \`.mc' commands added. + \`-' means standard output (the default). + +OPTIONS: + -a ADDMARK Mark for added groff source lines. Default: \`+'. + -c CHANGEMARK Mark for changed groff source lines. Default: \`|'. + -d DELETEMARK Mark for deleted groff source lines. Default: \`*'. + + -D Show the deleted portions from changed and deleted text. + Default delimiting marks: \`[[' .... \`]]'. + -B By default, the deleted texts marked by the \`-D' option end + with an added troff \`.br' command. This option prevents + the added \`.br'. + -M MARK1 MARK2 Change the delimiting marks for the \`-D' option. + + -x DIFFCMD Use a different diff(1) command; + one that accepts the \`-Dname' option, such as GNU diff. + --version Print version information on the standard output and exit. + --help Print this message on the standard error. +" + exit 255 +} + + +function Exit { + exitcode=$1 + shift + for arg + do + echo >&2 "${cmd}: $1" + shift + done + exit ${exitcode} +} + +# Usage: FileRead exit_code filename +# +# Check for existence and readability of given file name. +# If not found or not readable, print message and exit with EXIT_CODE. +function FileRead { + case "$2" in + -) + return + ;; + esac + + if test ! -e "$2" + then + Exit $1 "File \`$2' not found." + fi + if test ! -r "$2" + then + Exit $1 "File \`$2' not readable." + fi +} + + +# Usage: FileCreate exit_code filename +# +# Create the given filename if it doesn't exist. +# If unable to create or write, print message and exit with EXIT_CODE. +function FileCreate { + case "$2" in + -) + return + ;; + esac + + if ! touch "$2" 2>/dev/null + then + if test ! -e "$2" + then + Exit $1 "File \`$2' not created; " \ + "Cannot write directory \`$( dirname "$2" )'." + fi + Exit $1 "File \`$2' not writeable." + fi +} + +function WouldClobber { + case "$2" in + -) + return + ;; + esac + + if test "$1" -ef "$3" + then + Exit 3 \ + "The $2 and OUTPUT arguments both point to the same file," \ + "\`$1', and it would be overwritten." + fi +} + +ADDMARK='+' +CHANGEMARK='|' +DELETEMARK='*' +MARK1='[[' +MARK2=']]' + +function RequiresArgument { + # Process flags that take either concatenated or + # separated values. + case "$1" in + -??*) + expr "$1" : '-.\(.*\)' + return 1 + ;; + esac + + if test "$#" -lt 2 + then + Exit 255 "Option \`$1' requires a value." + fi + + echo "$2" + return 0 +} + +badoption= +DIFFCMD=diff +D_option= +br=.br +for OPTION +do + case "${OPTION}" in + -a*) + ADDMARK=$( RequiresArgument "${OPTION}" $2 ) && + shift + ;; + -c*) + CHANGEMARK=$( RequiresArgument "${OPTION}" $2 ) && + shift + ;; + -d*) + DELETEMARK=$( RequiresArgument "${OPTION}" $2 ) && + shift + ;; + -D ) + D_option=D_option + ;; + -M* ) + MARK1=$( RequiresArgument "${OPTION}" $2 ) && + shift + if [ $# -lt 2 ] + then + Usage "Option \`-M' is missing the MARK2 value." + fi + MARK2=$2 + shift + ;; + -B ) + br=. + ;; + -x* ) + DIFFCMD=$( RequiresArgument "${OPTION}" $2 ) && + shift + ;; + --version) + echo "GNU ${cmd} (groff) version @VERSION@" + exit 0 + ;; + --help) + Usage + ;; + --) + # What follows -- are file arguments + shift + break + ;; + -) + break + ;; + -*) + badoption="${cmd}: invalid option \`$1'" + ;; + *) + break + ;; + esac + shift +done + +${DIFFCMD} -Dx /dev/null /dev/null >/dev/null 2>&1 || + Usage "The \`${DIFFCMD}' program does not accept" \ + "the required \`-Dname' option. +Use GNU diff instead. See the \`-x DIFFCMD' option." + +if test -n "${badoption}" +then + Usage "${badoption}" +fi + +if test "$#" -lt 2 -o "$#" -gt 3 +then + Usage "Incorrect number of arguments." +fi + +if test "1$1" = 1- -a "2$2" = 2- +then + Usage "Both FILE1 and FILE2 are \`-'." +fi + +FILE1=$1 +FILE2=$2 + +FileRead 1 "${FILE1}" +FileRead 2 "${FILE2}" + +if test "$#" = 3 +then + case "$3" in + -) + # output goes to standard output + ;; + *) + # output goes to a file + WouldClobber "${FILE1}" FILE1 "$3" + WouldClobber "${FILE2}" FILE2 "$3" + + FileCreate 3 "$3" + exec >$3 + ;; + esac +fi + +# To make a very unlikely label even more unlikely ... +label=__diffmk_$$__ + +sed_script=' + /^#ifdef '"${label}"'/,/^#endif \/\* '"${label}"'/ { + /^#ifdef '"${label}"'/ s/.*/.mc '"${ADDMARK}"'/ + /^#endif \/\* '"${label}"'/ s/.*/.mc/ + p + d + } + /^#ifndef '"${label}"'/,/^#endif \/\* [!not ]*'"${label}"'/ { + /^#else \/\* '"${label}"'/,/^#endif \/\* '"${label}"'/ { + /^#else \/\* '"${label}"'/ s/.*/.mc '"${CHANGEMARK}"'/ + /^#endif \/\* '"${label}"'/ s/.*/.mc/ + p + d + } + /^#endif \/\* \(not\|!\) '"${label}"'/ { + s/.*/.mc '"${DELETEMARK}"'/p + a\ +.mc + } + d + } + p + ' + +if [ ${D_option} ] +then + sed_script=' + /^#ifdef '"${label}"'/,/^#endif \/\* '"${label}"'/ { + /^#ifdef '"${label}"'/ s/.*/.mc '"${ADDMARK}"'/ + /^#endif \/\* '"${label}"'/ s/.*/.mc/ + p + d + } + /^#ifndef '"${label}"'/,/^#endif \/\* [!not ]*'"${label}"'/ { + /^#ifndef '"${label}"'/ { + i\ +'"${MARK1}"' + d + } + /^#else \/\* '"${label}"'/ ! { + /^#endif \/\* [!not ]*'"${label}"'/ ! { + p + d + } + } + /^#else \/\* '"${label}"'/,/^#endif \/\* '"${label}"'/ { + /^#else \/\* '"${label}"'/ { + i\ +'"${MARK2}"'\ +'"${br}"' + s/.*/.mc '"${CHANGEMARK}"'/ + a\ +.mc '"${CHANGEMARK}"' + d + } + /^#endif \/\* '"${label}"'/ s/.*/.mc/ + p + d + } + /^#endif \/\* \(not\|!\) '"${label}"'/ { + i\ +'"${MARK2}"'\ +'"${br}"' + s/.*/.mc '"${DELETEMARK}"'/p + a\ +.mc + } + d + } + p + ' +fi + +diff -D"${label}" -- ${FILE1} ${FILE2} | + sed -n "${sed_script}" + +# EOF diff -ruN groff-1.19.1/contrib/gdiffmk/Makefile.sub groff-1.19.2/contrib/gdiffmk/Makefile.sub --- groff-1.19.1/contrib/gdiffmk/Makefile.sub 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/contrib/gdiffmk/Makefile.sub 2005-05-26 15:37:18.000000000 +0200 @@ -0,0 +1,47 @@ +# Makefile.sub for `gdiffmk' (integration into the groff source tree) + +# File position: /contrib/gdiffmk/Makefile.sub + +# Last update: 12 December 2004 + +# Copyright (C) 2004 Free Software Foundation, Inc. +# Written by Mike Bianchi > + +# This file is part of the gdiffmk utility, which is part of groff. + +# groff 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. + +# groff 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 groff; see the files COPYING and LICENSE in the top +# directory of the groff source. If not, write to the Free Software +# Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. + +######################################################################## + +MAN1=gdiffmk.n +CLEANADD=gdiffmk tests/runtests + +all: gdiffmk + +gdiffmk: gdiffmk.sh + rm -f $@; \ + sed -e "s|@BINDIR@|$(bindir)|g" \ + -e "s|@VERSION@|$(version)$(revision)|g" \ + -e $(SH_SCRIPT_SED_CMD) $(srcdir)/gdiffmk.sh >$@; \ + chmod +x $@ + +install_data: gdiffmk + -test -d $(bindir) || $(mkinstalldirs) $(bindir) + -rm -f $(bindir)/gdiffmk + $(INSTALL_SCRIPT) gdiffmk $(bindir)/gdiffmk + +uninstall_sub: + -rm -f $(bindir)/gdiffmk diff -ruN groff-1.19.1/contrib/gdiffmk/README groff-1.19.2/contrib/gdiffmk/README --- groff-1.19.1/contrib/gdiffmk/README 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/contrib/gdiffmk/README 2005-05-26 15:37:18.000000000 +0200 @@ -0,0 +1,46 @@ +gdiffmk is approximately a recreation of the original Bell Labs/AT&T diffmk +command for troff/nroff documents, with enhancements. + +It should not be confused with `diffmk' commands that operate on XML. + +The inspiration for this code was a Perl 2 version written in 1989 by Randal +L. Schwartz. See + landfield.com/software/comp.sources.misc/archive-name/volume06/diffmk.p.gz + +The command also attempts to reproduce some of the functionality of the old +`nrchbar' command. See + open-systems.ufl.edu/mirrors/ftp.isc.org/usenet/comp.sources.unix/volume10/nrchbar.Z + +Thanks to Werner Lemberg for help in making the package more portable and +fit into the GNU groff source structure. + +Gnu diff(1) with the -Dname option does all of the work and sed(1) +translates the output into something groff/troff/nroff can handle. + +Note the BUGS on the man page. + +The `tests' directory contains simple tests. `runtests run' runs them and +compares the output against baseline files. Calling `runtests' without +argument gives the usage. + +---------------------------------------------------------------------------- + +Copyright (C) 2004, 2005 Free Software Foundation, Inc. +Written by Mike Bianchi > + +This file is part of the gdiffmk utility, which is part of groff. + +groff 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. + +groff 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 groff; see the files COPYING and LICENSE in the top +directory of the groff source. If not, write to the Free Software +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. diff -ruN groff-1.19.1/contrib/gdiffmk/tests/file1 groff-1.19.2/contrib/gdiffmk/tests/file1 --- groff-1.19.1/contrib/gdiffmk/tests/file1 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/contrib/gdiffmk/tests/file1 2004-12-15 01:01:55.000000000 +0100 @@ -0,0 +1,11 @@ +.ll 25 +.pl 20 +.nf +file1 and file2 #1 +file1 only +file1 and file2 #2 +file1 and file2 #3 +file1 only +file1 only +file1 and file2 #4 +file1 and file2 #5 diff -ruN groff-1.19.1/contrib/gdiffmk/tests/file2 groff-1.19.2/contrib/gdiffmk/tests/file2 --- groff-1.19.1/contrib/gdiffmk/tests/file2 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/contrib/gdiffmk/tests/file2 2004-12-15 01:01:55.000000000 +0100 @@ -0,0 +1,11 @@ +.ll 25 +.pl 20 +.nf +file1 and file2 #1 +file2 only +file2 only +file1 and file2 #2 +file2 only +file1 and file2 #3 +file1 and file2 #4 +file1 and file2 #5 diff -ruN groff-1.19.1/contrib/gdiffmk/tests/runtests.in groff-1.19.2/contrib/gdiffmk/tests/runtests.in --- groff-1.19.1/contrib/gdiffmk/tests/runtests.in 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/contrib/gdiffmk/tests/runtests.in 2005-05-18 07:33:28.000000000 +0200 @@ -0,0 +1,98 @@ +#! /bin/sh +# A very simple function test for gdiffmk.sh. + +srcdir=@srcdir@ + +command=../gdiffmk + +# Test the number of arguments and the first argument. +case $#-$1 in +1-clean ) + rm -fv test_result* tmp_file* + exit 0 + ;; +1-run ) + ;; +* ) + echo >&2 "$0 [ clean | run ] +Run a few simple tests on \`${command}'."' + +clean Remove the test_result? and tmp_file? files. +run Run the tests. +' + exit 255 + ;; +esac + +function TestResult { + if cmp -s $1 $2 + then + echo $2 PASSED + else + echo '' + echo $2 TEST FAILED + diff $1 $2 + echo '' + fi +} + +tmpfile=/tmp/$$ +trap 'rm -f ${tmpfile}' 0 1 2 3 15 + +# Run tests. + +# 3 file arguments +ResultFile=test_result1 +${command} ${srcdir}/file1 ${srcdir}/file2 ${ResultFile} 2>${tmpfile} +cat ${tmpfile} >>${ResultFile} +TestResult ${srcdir}/test_baseline ${ResultFile} + +# OUTPUT to stdout by default +ResultFile=test_result2 +${command} ${srcdir}/file1 ${srcdir}/file2 >${ResultFile} 2>&1 +TestResult ${srcdir}/test_baseline ${ResultFile} + +# OUTPUT to stdout via - argument +ResultFile=test_result3 +${command} ${srcdir}/file1 ${srcdir}/file2 - >${ResultFile} 2>&1 +TestResult ${srcdir}/test_baseline ${ResultFile} + +# FILE1 from standard input via - argument +ResultFile=test_result4 +${command} - ${srcdir}/file2 <${srcdir}/file1 >${ResultFile} 2>&1 +TestResult ${srcdir}/test_baseline ${ResultFile} + +# FILE2 from standard input via - argument +ResultFile=test_result5 +${command} ${srcdir}/file1 - <${srcdir}/file2 >${ResultFile} 2>&1 +TestResult ${srcdir}/test_baseline ${ResultFile} + +# Different values for addmark, changemark, deletemark +ResultFile=test_result6 +${command} -aA -cC -dD ${srcdir}/file1 ${srcdir}/file2 >${ResultFile} 2>&1 +TestResult ${srcdir}/test_baseline6 ${ResultFile} + +# Test for accidental file overwrite. +ResultFile=test_result7 +cp ${srcdir}/file2 tmp_file7 +${command} -aA -dD -cC ${srcdir}/file1 tmp_file7 tmp_file7 \ + >${ResultFile} 2>&1 +TestResult ${srcdir}/test_baseline7 ${ResultFile} + +# Test -D option +ResultFile=test_result8 +${command} -D ${srcdir}/file1 ${srcdir}/file2 >${ResultFile} 2>&1 +TestResult ${srcdir}/test_baseline8 ${ResultFile} + +# Test -D and -M options +ResultFile=test_result9 +${command} -D -M '<<<<' '>>>>' \ + ${srcdir}/file1 ${srcdir}/file2 >${ResultFile} 2>&1 +TestResult ${srcdir}/test_baseline9 ${ResultFile} + +# Test -D and -B options +ResultFile=test_result10 +${command} -D -B ${srcdir}/file1 ${srcdir}/file2 >${ResultFile} 2>&1 +TestResult ${srcdir}/test_baseline10 ${ResultFile} + +# EOF diff -ruN groff-1.19.1/contrib/gdiffmk/tests/test_baseline groff-1.19.2/contrib/gdiffmk/tests/test_baseline --- groff-1.19.1/contrib/gdiffmk/tests/test_baseline 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/contrib/gdiffmk/tests/test_baseline 2004-12-15 01:01:55.000000000 +0100 @@ -0,0 +1,17 @@ +.ll 25 +.pl 20 +.nf +file1 and file2 #1 +.mc | +file2 only +file2 only +.mc +file1 and file2 #2 +.mc + +file2 only +.mc +file1 and file2 #3 +.mc * +.mc +file1 and file2 #4 +file1 and file2 #5 diff -ruN groff-1.19.1/contrib/gdiffmk/tests/test_baseline10 groff-1.19.2/contrib/gdiffmk/tests/test_baseline10 --- groff-1.19.1/contrib/gdiffmk/tests/test_baseline10 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/contrib/gdiffmk/tests/test_baseline10 2005-01-15 15:30:01.000000000 +0100 @@ -0,0 +1,26 @@ +.ll 25 +.pl 20 +.nf +file1 and file2 #1 +[[ +file1 only +]] +. +.mc | +file2 only +file2 only +.mc +file1 and file2 #2 +.mc + +file2 only +.mc +file1 and file2 #3 +[[ +file1 only +file1 only +]] +. +.mc * +.mc +file1 and file2 #4 +file1 and file2 #5 diff -ruN groff-1.19.1/contrib/gdiffmk/tests/test_baseline6 groff-1.19.2/contrib/gdiffmk/tests/test_baseline6 --- groff-1.19.1/contrib/gdiffmk/tests/test_baseline6 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/contrib/gdiffmk/tests/test_baseline6 2004-12-15 01:01:55.000000000 +0100 @@ -0,0 +1,17 @@ +.ll 25 +.pl 20 +.nf +file1 and file2 #1 +.mc C +file2 only +file2 only +.mc +file1 and file2 #2 +.mc A +file2 only +.mc +file1 and file2 #3 +.mc D +.mc +file1 and file2 #4 +file1 and file2 #5 diff -ruN groff-1.19.1/contrib/gdiffmk/tests/test_baseline7 groff-1.19.2/contrib/gdiffmk/tests/test_baseline7 --- groff-1.19.1/contrib/gdiffmk/tests/test_baseline7 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/contrib/gdiffmk/tests/test_baseline7 2004-12-16 23:30:52.000000000 +0100 @@ -0,0 +1,2 @@ +gdiffmk: The FILE2 and OUTPUT arguments both point to the same file, +gdiffmk: `tmp_file7', and it would be overwritten. diff -ruN groff-1.19.1/contrib/gdiffmk/tests/test_baseline8 groff-1.19.2/contrib/gdiffmk/tests/test_baseline8 --- groff-1.19.1/contrib/gdiffmk/tests/test_baseline8 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/contrib/gdiffmk/tests/test_baseline8 2005-01-15 15:30:01.000000000 +0100 @@ -0,0 +1,26 @@ +.ll 25 +.pl 20 +.nf +file1 and file2 #1 +[[ +file1 only +]] +.br +.mc | +file2 only +file2 only +.mc +file1 and file2 #2 +.mc + +file2 only +.mc +file1 and file2 #3 +[[ +file1 only +file1 only +]] +.br +.mc * +.mc +file1 and file2 #4 +file1 and file2 #5 diff -ruN groff-1.19.1/contrib/gdiffmk/tests/test_baseline9 groff-1.19.2/contrib/gdiffmk/tests/test_baseline9 --- groff-1.19.1/contrib/gdiffmk/tests/test_baseline9 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/contrib/gdiffmk/tests/test_baseline9 2005-01-15 15:30:01.000000000 +0100 @@ -0,0 +1,26 @@ +.ll 25 +.pl 20 +.nf +file1 and file2 #1 +<<<< +file1 only +>>>> +.br +.mc | +file2 only +file2 only +.mc +file1 and file2 #2 +.mc + +file2 only +.mc +file1 and file2 #3 +<<<< +file1 only +file1 only +>>>> +.br +.mc * +.mc +file1 and file2 #4 +file1 and file2 #5 diff -ruN groff-1.19.1/contrib/grap2graph/grap2graph.sh groff-1.19.2/contrib/grap2graph/grap2graph.sh --- groff-1.19.1/contrib/grap2graph/grap2graph.sh 2003-10-28 08:46:23.000000000 +0100 +++ groff-1.19.2/contrib/grap2graph/grap2graph.sh 2005-05-18 09:03:06.000000000 +0200 @@ -1,4 +1,4 @@ -#!/bin/sh +#! /bin/sh # # grap2graph -- compile graph description descriptions to bitmap images # @@ -28,7 +28,7 @@ # # Thus, we pass -U to groff(1), and everything else to convert(1). # -# $Id: grap2graph.sh,v 1.2 2003/10/28 07:46:23 wlemb Exp $ +# $Id: grap2graph.sh,v 1.4 2005/05/18 07:03:06 wl Exp $ # groff_opts="" convert_opts="" @@ -79,7 +79,7 @@ # 3. Process through groff(1) with pic preprocessing to emit Postscript. # 4. Use convert(1) to crop the Postscript and turn it into a bitmap. (echo ".G1"; cat; echo ".G2") | grap | groff -p $groff_opts -Tps -P-pletter | \ - convert -crop 0x0 $convert_opts - $tmp/grap2graph.$format \ + convert -trim -crop 0x0 $convert_opts - $tmp/grap2graph.$format \ && cat $tmp/grap2graph.$format # End diff -ruN groff-1.19.1/contrib/groffer/ChangeLog groff-1.19.2/contrib/groffer/ChangeLog --- groff-1.19.1/contrib/groffer/ChangeLog 2004-04-30 09:37:39.000000000 +0200 +++ groff-1.19.2/contrib/groffer/ChangeLog 2005-08-23 00:11:05.000000000 +0200 @@ -1,3 +1,749 @@ + ________________________________________________________________ + * release of groffer 0.9.22 + +2005-22-04 Bernd Warken + + ### `--whatis' + + Produce a `groff' output and allow wild cards on filespec + parameters for `--whatis'. + + * groffer2.sh: + - $_FILESPEC_ARG: New variable for storing the actual filespec + parameter. + - main_do_fileargs(): Set $_FILESPEC_ARG and add + what_is_filespec(). + - main_parse_args(): Add --all to --whatis. + - to_tmp_line(): New function to write the arguments to the + temorary cat file. + - whatis_filename(): Rename of what_is(). Construct a better + printout using $_FILESPEC_ARG. Repair the sed sequneces. + - whatis_filespec(): New function to print the filespec once + during the `whatis' process. + - whatis_header(): New funtion for printing the header of the + `whatis' output. + + * groffer.man: Revise the documentation of --whatis. + + ### `--apropos*' + + Produce `groff' for `--apropos*'. Allow `--sections' for + `--apropos', ignore it with `--apropos-*'. + + * groffer2.sh: + - --apropos*: Make these options without argument. + - $_APROPOS_PROG: New variable for the program that is is used for + `apropos'. + - $_APROPOS_SECTIONS: New variable to determine the sections that + are filtered out of `apropos' output depending on `--apropos-*'. + - apropos_filespec(): Handling of apropos at the filespec level. + - apropos_run(): Remove it. + - apropos_setup(): New function. + - main_set_mode(): Remove handling of $_OPT_APROPOS*. + + * groffer.man: + - Revise the documentation of `--apropos*'. + - Split section 'options for GNU man' into two sections `options + for man pages' and `long options taken over from GNU man'. + - Move `--apropos*', `--whatis', `--man', and `--no-man' to + section `options for man pages'. + + ### special display (apropos and whatis) + + * groffer2.sh: + - special_setup(): New function that chooses the setup between + apropos and whatis. + - special_filespec(): New function that does the output at the + filespec level for apropos or whatis. + + ### handle `--sections' for man page searching + + * groffer2.sh: + - man_do_filespec(): Use $_OPT_SECTIONS of --sections instead of + $_MAN_AUTO_SEC if non-empty. If a section was given on the + filespec parameter $_OPT_SECTIONS is ignored. This differs from + `man' which always uses the restricted sections of --sections. + This function works for both normal man page search and whatis. + - apropos_filespec(): Use --sections for --apropos, but not for + --apropos-* because these provide already their own sections. + + ### wildcards in filespec arguments + + * groffer2.sh: Wildcards are now accepted. In `--apropos*' and + `--whatis' they are interpreted as wildcard search elements; but + in normal display they are only handled as their own character. + + ### development; new option + + * groffer2.sh: + - --print: New option that prints just its argument for parameter + check. + - usage(): Add new option. + - $_OPT_DO_NOTHING: New variable for do_nothing(). Handle it at + the end of main_parse_Args(). + + * groffer.man: Add information on --print. + + ### safe exit + + * groffer2.sh: + - error(): Always exit with $_ERROR. + - exit_test(): New function to exit when first exit was hidden by + (). Call it after each $(). + + ### automatic shell determination + + * groffer.sh: + - If no option --shell is given perform a test of several shells + to automatically start some shell for groffer2.sh. `ksh' is used + first because it can be safely terminated by Ctrl-C. + - This can be cancelled by providing --shell=''. + - Add test on `sed' program. + + * groffer.man: Revise information on --shell. + + ### trap + + * groffer2.sh: + - trap_set(): Remove argument. Instead of $_ALL_EXIT use only + signal 0. + - trap_unset(): Rename trap_clean(). Instead of $_ALL_EXIT use + only signal 0. + - $_ALL_EXIT: Remove this variable. + - Replace all direct `trap' calls by trap_set(). + + * README_SH: New section `Bugs' on `trap'.. + + ### user errors, error output without function stack + + * groffer2.sh: + - error_user(): New function for user errors. + - error(): Remove call of clean_up() because the trap will do it + with the exit. Remove the `kill' commands. Create a temporary + file `.error' that can be tested by exit_test() for a better exit + test (especially for shell `ksh'). + - $_DEBUG_USER_WITH_STACK: New variable to enable function stack + output in error_user(). + - list_from_cmdline(), list_single_from_abbrev(), main_set_mode(): + Use error_user(). + + ### test modes on X and tty + + * groffer2,sh: + - is_X(), is_not_X(): New functions for checking on X Window. + - $_VIEWER_HTML_TTY, $_VIEWER_HTML_X: New variables that split + $_VIEWER_HTML. Add `galeon'. + - main_parse_args(): Allow mode change for graphical modes only + when in X Window. + - _do_display() of main_display(): Create a special run for + viewers that run on the terminal; `lynx' is the only one so far. + + ### add $GROFFER_MODE to command line + + * groffer.sh: + - After the handling of the configuration files integrate + $GROFFER_OPT to the command line. + - This makes a `set' in the shell determination unnecessary. + + * groffer2.sh: + - The debug test gets simpler because quotes are vanished without + $GROFFER_OPT. + - main_parse_MANOPT(): Prepend $mpm_list to the command line. + - main_parse_args(): `set' is unnecessary. + + ### debug; new options + + * groffer2.sh: + - --debug-all, --debug-lm, --debug-params, --debug-shell, + --debug-stacks, --debug-tmpdir, --debug-user: New options. + - --debug: Enable all debug variables except $_DEBUG_STACKS and + $_DEBUG_LM. By the new options the smallest abbreviation is now + `--debug'. + - $_DEBUG_STACKS: Rename $_DEBUG. + - $_DEBUG_PRINT_TMPDIR: New debug variable for printing the name + of the temporary directory in main_init(). + - $_OPT_DEBUG: Remove this variable because debug is handled at + the early part of the script. + - clean_up(): Enlarge $_DEBUG_KEEP_FILES to not deleting the + temporary directory. + - usage(): Move all development options on a section of its own. + - Move the test of rudimentary shell functionality at the + beginning of the script. Add test on `sed'. + - Follow this by the debug section. The determination of all + --debug* options can be done without a function. + + * groffer.man: Revise information on --debug and add new options. + + ### variables + + * groffer.sh: + - $_ERROR: Move the definition of this variable here. + - $_GROFF_VERSION: New variable, is set over @...@ construct. + - $_OUTPUT_FILE_NAME: Move this variable to groffer2.sh. + + * groffer2.sh: + - $_MAN_AUTO_SEC_LIST: Rename $_MAN_AUTO_SEC because it represents + a list. + - $_MAN_AUTO_SEC_CHARS: New read-only variable for storing + $_MAN_AUTO_SEC_LIST in [] construct. Use it in man_do_filespec() + and whatis_filename(). + - $_SPACE_CASE: New read-only variable with [] on space characters + with \ for `case' patterns. Use it in several functions. + - $_SPACE_SED: New read-only variable with [] on space characters + for `sed'. Use it in several functions. + + ### options and display + + * groffer2.sh: + - list_from_cmdline(): Add test whether the same abbreviation is + part of long options with and without arguments. Give handling of + `=' a `case' pattern of its own. + - main_display(): Remove unnecessary calls of `clean_up' in order + to use `mozilla' without problems. In _do_display(): Fix -X by + providing a different process when $_DISPLAY_PROG is empty. + - main_set_mode(): Accept options for viewers as is, without check + for program. Add test whether no program is given for a mode. + This avoids unnecessary empty $_DISPLAY_PROG in main_display(). + + ### viewer programs that run on the terminal (tty); new options + + * groffer2.sh: + - $_VIEWER_TERMINAL: New variable that stores whether a viewer was + supposed to run on tty. + - --dvi-viewer-tty, --html-viewer-tty, --pdf-viewer-tty, + --ps-viewer-tty, --tty-viewer-tty, --X-viewer-tty, --x-viewer-tty, + --www-viewer-tty: New options for viewers that run on a terminal. + - main_parse_args(), _do_display() of main_display(): Use the new + options and the new variable. + - usage(): Add the new options. + + * groffer.man: Add information on options --*-viewer-tty. + + ### other fixes + + * groffer2.sh: + - _do_display() of main_display(): Bear errors of `groff' run. + - is_not_file: Fix to have exactly one argument. + - is_not_prog(): Handle no arguments. + - list_has_not(): Fix. + - main_do_fileargs(): Remove $mdfa_exitcode. + - register_title(): Limit title to 4 elements. + - version(): Print the version information to standard output just + like `groff' does. + - --no-special: New option to disable former calls of `--all', + `--apropos*', and `whatis. + - --title: Make it an option with argument. + +2005-08-07 Keith Marshall + + * contrib/groffer/Makefile.sub (install): Reference groffer2.sh + as $(srcdir)/groffer2.sh, so it will install when building in a + different directory from the source. + + ________________________________________________________________ + * release of groffer 0.9.21 + +2005-08-02 Bernd Warken + + ### @...@ constructs + + * groffer.sh: + - $_AT: New variable for `@'. + - @...@: Replace the @...@ constructs by variables _AT_..._AT. + These constructs are transformed by `make' to useful information. + Keep all of these constructs in the first part of groffer.sh. For + a run before a `make' call, the script sets these variables to + special values for testing purpose. + - $_GROFFER_LIBDIR: Variable pointing to the groffer library + directory @libdir@/groff/groffer. + + ### Configuration files + + * groffer.sh: + - Add test for `$()' construct. + - Read and transform the configuration files and execute the + emerging commands. The `sed' script was heavily enlarged to + handle line with spaces and quotes. The emerging script is now + called by `eval', so no temporary file is needed. + - $_CONF_FILE_ETC, $_CONF_FILE_HOME: New variables for the config + files. + - $_SQ, $_SP: Move variables for characters before the handling of + the configuration files. Rename $_SQUOTE to $_SQ and $_SPACE to + $_SP. + - $GROFFER_OPT: Remove cleaning of this variable before the + reading of the configuration files. + + * groffer2.sh: + - main_init(): Remove the getting of the configuration files. + + ### Rewrite the shell determination + + * groffer.sh: + - Get rid of all functions in `groffer.sh'. Rewrite the shell + determination with `` and $(). + - --shell: Shortest abbreviation is `--sh'. Allow arguments for + the shell name. + - Allow an empty argument for --shell as shell name to overwrite a + specified shell; an empty shell name gets back to the default + shell. + - The shell determination now inludes the full handling of the + config files. The `--shell' option needs no longer a line + starting with `-'. + + ### Test of unset + + * groffer.sh: + - Remove test of `unset'. + - Remove all calls of `unset'. + - Use one character names for all variables that are meant to be + local in this script. + + * groffer2.sh: + - Move the test of `unset' to the testing of rudimentary shell + functionality without change. + + ### Allow abbreviations for long options + + * groffer2.sh: + - list_has_abbrev(): New function for checking a list having an + element with a given abbreviation. + - list_get_single_from_abbrev(): New function to retrieve the + element having a given abbreviation. + - list_from_cmd_line(): For an option abbreviation determine the + corresponding long option. + - From the man option lists remove the elements that are also in + a groffer list. + - Allow abbreviation for the early test of --debug. + + * groffer.sh: Allow abbreviation for the early test on --shell. + - get_opt_shell(): Rewrite _get_opt_shell() and the shell test + around it. + - test_on_shell(): Rename function _test_on_shell(). + - $_SHELL: global variable for the shell to run groffer2.sh. + + ### Get rid of `sh -c' + + * groffer2.sh: + - main_display(), _do_display(): Remove the `sh -c' calls. Make + the cleanup working without it. + - _do_display(): Extend _do_display() such that it can be used for + the pdf mode as well. + - _make_pdf(): New subfunction of main_display() for running the + additional parts of pdf mode in _do_display(). + - rm_file(), rm_file_with_debug(), rm_tree(): New functions for + removing files and directories. + + ### Change directory + + * groffer2.sh: + - $_START_DIR: New variable to store the directory at the starting + time of the script. + - main_display(): Go to the groffer temporary directory to be able + to process internal `groff' data like pictures. + - clean_up(): Get back to the starting directory. + + ### Compatibility with strange shells + + * groffer2.sh: + - clean_up(): `zsh' and `posh' had difficulties with `eval'. + - is_*(): Add test on empty argument. Some shells return true on + `test -d' etc. with empty argument, while most shells return + false. + - echo1(); New function to print single line `cat <file' for generating an empty file. + - rmdir: Replace `rmdir' by `rm -f -r'. + - eval: Add `eval' to many commands with variable arguments. + + * groffer.sh: repair `debug' + - Print all debug output to stderr. + - $_FUNC_STACK: Built function call stack even when $_DEBUG is not + set. Now the arguments are not added. + - $_DEBUG: If set to `yes' print 3 call stack events: the function + that is added with its arguments is printed with `+++ ' + (func_push()); the call stack after the addition is printed with + `>>> ' (func_push()); the call stack after the removing is printed + with `<<< ' (func_pop()). + - error(): Always print the function call stack on errors. + + * groffer.sh: Corrections + - $_groffer_run: Rename to $_GROFFER_RUN. + - $unset: Rename to $_UNSET. + - Repair test of `unset'. + - Repair test for `--shell'. The script is now rerun under the + shell specified in the option argument. This can increase the + speed. + + * README_SH: `zsh' now works. + + * groffer.man: + - Reformulate the information for the `groffer' specific details + of option `-V'. + - Add information on the debug process. + - Add information on the default devices in `x mode'. + - Minor corrections. + + ________________________________________________________________ + * release of groffer 0.9.18 + +2005-07-01 Bernd Warken + + * groffer.sh: further shell compatibility + - `echo': Remove options and possible options of `echo' by + preceding the argument with a character `x' that is removed by + `sed' or replace `echo' by `cat </README_SH - + ******* Extension of the `apropos' handling The output of man's `apropos' has grown immensely meanwhile, so it @@ -80,7 +826,7 @@ specify function arguments and the calling syntax in a simpler way by letting the first argument be a variable name, usable for input or output. - + Such an object type is `list', the string value of a shell variable arranged in space-separated single-quoted elements, such as $GROFFER_OPT internally. @@ -102,7 +848,7 @@ spaces at the beginning.of the line are omitted. - all other lines are interpreted as a shell command and executed in the current shell of the groffer call. - + Precedence: - The command line and the external environment variables such as $GROFFER_OPT of the groffer call have the highest precedence. @@ -110,8 +856,8 @@ directory. - The system configuration file in /etc has the lowest precedence. - - * groffer.sh: + + * groffer.sh: The configuration files are now called after the determination of the temporary files in main_init(). @@ -128,7 +874,7 @@ - Force the script to be called as an executable file, so $0 must contain the program name. - + ******* Improved temporary file names Just like groff, groffer mixes all file parameters into a single @@ -136,7 +882,7 @@ list built from the file name arguments without a leading comma. So a leading comma can be used for the internal temporary file names. - + * groffer.sh: - $_OUTPUT_FILE_NAME: new global variable as basis for the output file name; it is set in main_set_resources(). @@ -201,9 +947,9 @@ - man_search_section(): correction of some `for' loops. - Remove export of external non-groffer variables. - + ******* Documentation - + * groffer.man: - Reorder the option details according to the option origin as groffer, groff, X, and man options. @@ -213,19 +959,19 @@ * README_SH: new file Move large parts of the documentation in `groffer.sh' into this file. - + * groffer.sh: usage(): - Change the output for `--help' to standard output. - Restructure the information for this help output. - + ******* Removement of the author's email address - + Because of the extreme spam attacks, the author removed all occurencies of his email address in every file of the groffer source. -2003-01-22 Bernd Warken +2003-01-22 Bernd Warken ________________________________________________________________ * release of groffer 0.9.4 @@ -242,11 +988,11 @@ - Test existence of directory before deleting it in the `clean_up' definitions. - Correct help output in `usage' (called by `--help'). - + * TODO: Remove mention of `shoop' and `apropos'. -2002-10-21 Bernd Warken +2002-10-21 Bernd Warken ________________________________________________________________ * release of groffer 0.9.3 @@ -269,8 +1015,8 @@ * TODO: think about... - writing part of groffer in C/C++. - handling several files with different macro packages. - -2002-10-17 Bernd Warken + +2002-10-17 Bernd Warken ________________________________________________________________ * fixes of groffer 0.9.2 @@ -282,12 +1028,12 @@ - New macro ".Header_CB" for CB font in .TP headers; used for definition of variables in option --mode. - Fix some option references to refer to long options. - + * README: New file for general information on the groffer source; it is not installed. - -2002-10-14 Bernd Warken + +2002-10-14 Bernd Warken * Makefile.sub: add replacement "@BINDIR@" to "$(bindir)" for "groffer:" @@ -299,7 +1045,7 @@ * groffer.man: Remove double definition of filespec parameters. -2002-10-13 Bernd Warken +2002-10-13 Bernd Warken ________________________________________________________________ * release of groffer 0.9.2 @@ -321,16 +1067,16 @@ - New macro for file names ".File_name". - "Option Parsing" is moved to section "COMPATIBILITY". - Fix some "EXAMPLES". - -2002-09-30 Bernd Warken + +2002-09-30 Bernd Warken ________________________________________________________________ * release of groffer 0.9.1 - + * TODO: remove done entries - Remove request for different shells. - Remove the 'sed' complaints. -2002-07-15 Bernd Warken +2002-07-15 Bernd Warken * groffer.sh: replace `sed' interface by direct `sed' - This improves the performance of the shell programming parts @@ -354,7 +1100,7 @@ groffer was called from the command line, or with the shell name in the first line of the script, actually `/bin/sh'. -2002-07-12 Bernd Warken +2002-07-12 Bernd Warken ________________________________________________________________ * fixes for groffer 0.9.0 @@ -364,7 +1110,7 @@ - the string `is part of ' - groff's version information (version number and copyright), but not groff's `called subprograms' information. - + * groffer.sh: minor fixes - Fix the argument parser to process argument `-' correctly. - Some display programs have trouble with empty input; feed a @@ -374,7 +1120,7 @@ * TODO: fix entry `shoop' (not 'shopt'). -2002-06-28 Bernd Warken +2002-06-28 Bernd Warken ________________________________________________________________ * release of groffer 0.9.0 @@ -387,25 +1133,25 @@ - New options `--pdf', `--pdf-viewer', `--mode pdf'. - Standard pdf viewers `xpdf' and `acroread'. - For `xpdf', choose zoom `z 3' for 100 dpi, `z 2' for 75 dpi. - + * groffer.sh: support bzip2 decompression - add test for `bzip2' with necessary options - extend functions `catz()' and `save_stdin()'. * TODO remove entry on `bzip' decompression (done). - + * groffer.man: - Document new `pdf' features. - Document new `bzip2' decompression. - Fix documentation for `--auto-modes'. - + * groffer.sh: minor fixes - Improve device tests in `tty' and `dvi' modes. - Internally, map mode `auto' to '' to facilitate tests. - Fix auto mode sequence to: `ps,x,tty' as was intended. -2002-06-25 Bernd Warken +2002-06-25 Bernd Warken * groffer.sh: Fix `source' mode. @@ -413,7 +1159,7 @@ * groffer.man: Fix some indentations. -2002-06-23 Bernd Warken +2002-06-23 Bernd Warken ________________________________________________________________ * release of groffer 0.8 @@ -425,7 +1171,7 @@ - Document the configuration files in new section `FILES'. - Redesign section `EXAMPLES'. - Remove documentation for `-W'. - + * groffer.sh: new debugging features - Disabled by default; enabled by environment variables. - Add landmark() to catch typos with quotes. @@ -437,7 +1183,7 @@ - Actually, the groffer script uses only shell builtins found in `ash' (a subset of POSIX) and POSIX `sed' as the only external shell utility. - + * groffer.sh: customization of viewers - In `groff' mode, the groffer viewing facilities are disabled. - The postprocessor option `-P' costumizes the viewer only in @@ -458,7 +1204,7 @@ -> `--title': set viewer window title. -> `--xrm': set X resource. - Remove misnamed option `--xrdb'. - + * groffer.sh: new mode structure - New Postcript mode `ps' (`--ps'): -> default viewers: gv,ghostview,gs_x11,gs; @@ -483,7 +1229,7 @@ -> automatically active with one of `-V', `-X', `-Z'. - Revise `tty' mode: -> allow several text devices. - -> + -> - Reorganize the mode management: -> new mode setting option `--mode'. -> logically separate source, groff, and display modes. @@ -496,7 +1242,7 @@ - `${HOME}/.groff/groffer.conf' user configuration. - The configuration file are shell scripts for now; later implementations can identify this from the `#! /bin/sh' line. - + * groffer.sh: new data structure `list': - Implement a `list' data structure as a string consisting of single-quoted elements, separated by a space character; @@ -513,18 +1259,18 @@ allow unusual characters in options. - Parse $MANOPT first; translate essential arguments into groffer options. - + * groffer.man: - determine prompt length for `.Shell_cmd'* dynamically. - naming scheme for static strings and registers changed to `namespace:macro.variable'. - + 2002-06-16 Werner Lemberg * groffer.sh: Implement man option `--ascii' by `-mtty-char'. - + 2002-05-31 Werner LEMBERG @@ -532,7 +1278,7 @@ Increase to 4m (we use `sh#' as the prompt). -2002-05-31 Bernd Warken +2002-05-31 Bernd Warken ________________________________________________________________ * release of groffer 0.7 @@ -568,14 +1314,14 @@ - fix TP_header. -2002-05-28 Bernd Warken +2002-05-28 Bernd Warken ________________________________________________________________ * release of groffer 0.6 This is almost a complete rewrite since groffer 0.5 . ________________________________________________________________ * Documentation - + * groffer.man: - Apply the changes done in www.tmac (.URL and .MTO) - Replace \fP by \f[]. @@ -608,7 +1354,7 @@ - The only external programs used are POSIX `sed' and the fallback to `apropos'. All other program calls were replaced by shell builtins and functions. - + ________________________________________________________________ * Cosmetics @@ -660,10 +1406,10 @@ characters in file names). - Fix and complement usage(). - The filespec parsers gets a function of its own do_manpage(). - - -2002-01-08 Bernd Warken - + + +2002-01-08 Bernd Warken + * groffer 0.5 (beta) released * groffer.man: @@ -672,7 +1418,7 @@ - Examples of shell commands now print in font CR instead of CB. - Remove documentation for option `-X'. - Add documentation for option `--dpi'. - + * groffer.sh: - New method for creating temporary files, based on process IDs. This is reliable enough and suitable for GNU and POSIX. @@ -689,15 +1435,15 @@ - Implement option `--dpi' for setting the resolution for the X viewer, which had already been documented in earlier versions. -2002-01-07 Bernd Warken +2002-01-07 Bernd Warken * groffer 0.4 (beta) released (as groff `contrib') - + * groffer.man: - New features documented. - Macros stream-lined. - Section EXAMPLES added. - + * groffer.sh: - System tests added/optimized. - Speed/memory optimizations by defining some shell functions @@ -728,7 +1474,7 @@ * groffer.man (OptDef): Add missing backslashes. Update copyright. -2001-12-15 Bernd Warken +2001-12-15 Bernd Warken * groffer 0.3 (alpha) released (still stand-alone package). @@ -746,20 +1492,20 @@ * Recognize the following filespecs as man-page parameters: man:name(section), man:name, name.section, name. - -2001-12-03 Bernd Warken + +2001-12-03 Bernd Warken * Stand-alone package for groffer 0.2 (alpha) created Files: groffer, groffer.man, Makefile, TODO, ChangeLog - -2001-12-02 Bernd Warken + +2001-12-02 Bernd Warken * groffer 0.2 (alpha) program released. * Name changed from `groffview' to `groffer'. * Comments added. - + * Name changed from `groffview' to `groffer'. * Options harmonized with groff. @@ -771,26 +1517,30 @@ * Bugs with temporary files fixed. * Code restructured and comments added. - -2001-11-28 Bernd Warken + +2001-11-28 Bernd Warken ***** groffview 0.1 (experimental) and groffview.man released (predecessor of groffer, shell script) * Options : -h --help, -v --version - + * Search for man-pages based on $MANPATH * development of `groffview' shell script started 2001-11-28 Bernd Warken + ________________________________________________________________ License - Copyright (C) 2001,2002,2003,2004 Free Software Foundation, Inc. + Copyright (C) 2001,2002,2003,2004,2005 + Free Software Foundation, Inc. Written by Bernd Warken + Copying and distribution of this file, with or without modification, are permitted provided the copyright notice and this notice are preserved. - This file is part of groffer, which is part of the groff project. + This file is part of `groffer', which is part of the `groff' + project. diff -ruN groff-1.19.1/contrib/groffer/groffer2.sh groff-1.19.2/contrib/groffer/groffer2.sh --- groff-1.19.1/contrib/groffer/groffer2.sh 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/contrib/groffer/groffer2.sh 2005-08-23 00:13:05.000000000 +0200 @@ -0,0 +1,5854 @@ +#! /bin/sh + +# groffer - display groff files + +# Source file position: /contrib/groffer/groffer2.sh +# Installed position: /lib/groff/groffer/groffer2.sh + +# This file should not be run independently. It is called by +# `groffer.sh' in the source or by the installed `groffer' program. + +# Copyright (C) 2001,2002,2003,2004,2005 +# Free Software Foundation, Inc. +# Written by Bernd Warken + +# Last update: 22 August 2005 + +# This file is part of `groffer', which is part of `groff'. + +# `groff' 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. + +# `groff' 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 `groff'; see the files COPYING and LICENSE in the top +# directory of the `groff' source. If not, write to the Free Software +# Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, +# USA. + + +######################################################################## +# Test of rudimentary shell functionality +######################################################################## + + +######################################################################## +# Test of `unset' +# +export _UNSET; +export _foo; +_foo=bar; +_res="$(unset _foo 2>&1)"; +if unset _foo >${_NULL_DEV} 2>&1 && \ + test _"${_res}"_ = __ && test _"${_foo}"_ = __ +then + _UNSET='unset'; + eval "${_UNSET}" _foo; + eval "${_UNSET}" _res; +else + _UNSET=':'; +fi; + + +######################################################################## +# Test of `test'. +# +if test a = a && test a != b && test -f "${_GROFFER_SH}" +then + :; +else + echo '"test" did not work.' >&2; + exit "${_ERROR}"; +fi; + + +######################################################################## +# Test of `echo' and the `$()' construct. +# +if echo '' >${_NULL_DEV} +then + :; +else + echo '"echo" did not work.' >&2; + exit "${_ERROR}"; +fi; +if test _"$(t1="$(echo te)" && + t2="$(echo '')" && + t3="$(echo 'st')" && + echo "${t1}${t2}${t3}")"_ \ + != _test_ +then + echo 'The "$()" construct did not work' >&2; + exit "${_ERROR}"; +fi; + + +######################################################################## +# Test of sed program; test in groffer.sh is not valid here. +# +if test _"$(echo red | sed -e 's/r/s/')"_ != _sed_ +then + echo 'The sed program did not work.' >&2; + exit "${_ERROR}"; +fi; + + +######################################################################## +# Test of function definitions. +# +_t_e_s_t_f_u_n_c_() +{ + return 0; +} + +if _t_e_s_t_f_u_n_c_ 2>${_NULL_DEV} +then + :; +else + echo 'Shell '"${_SHELL}"' does not support function definitions.' >&2; + exit "${_ERROR}"; +fi; + + +######################################################################## +# debug - diagnostic messages +######################################################################## + +export _DEBUG_STACKS; +_DEBUG_STACKS='no'; # disable stack output in each function +#_DEBUG_STACKS='yes'; # enable stack output in each function + +export _DEBUG_LM; +_DEBUG_LM='no'; # disable landmark messages +#_DEBUG_LM='yes'; # enable landmark messages + +export _DEBUG_KEEP_FILES; +_DEBUG_KEEP_FILES='no' # disable file keeping in temporary dir +#_DEBUG_KEEP_FILES='yes' # enable file keeping in temporary dir + +export _DEBUG_PRINT_PARAMS; +_DEBUG_PRINT_PARAMS='no'; # disable printing of all parameters +#_DEBUG_PRINT_PARAMS='yes'; # enable printing of all parameters + +export _DEBUG_PRINT_SHELL; +_DEBUG_PRINT_SHELL='no'; # disable printing of the shell name +#_DEBUG_PRINT_SHELL='yes'; # enable printing of the shell name + +export _DEBUG_PRINT_TMPDIR; +_DEBUG_PRINT_TMPDIR='no'; # disable printing of the temporary dir +#_DEBUG_PRINT_TMPDIR='yes'; # enable printing of the temporary dir + +export _DEBUG_USER_WITH_STACK; +_DEBUG_USER_WITH_STACK='no'; # disable stack dump in error_user() +#_DEBUG_USER_WITH_STACK='yes'; # enable stack dump in error_user() + +# determine all --debug* options +case " $*" in +*\ --debug*) + case " $* " in + *' --debug '*) + # _DEBUG_STACKS='yes'; + # _DEBUG_LM='yes'; + _DEBUG_KEEP_FILES='yes'; + _DEBUG_PRINT_PARAMS='yes'; + _DEBUG_PRINT_SHELL='yes'; + _DEBUG_PRINT_TMPDIR='yes'; + _DEBUG_USER_WITH_STACK='yes'; + ;; + esac; + d=' --debug-all --debug-keep --debug-lm --debug-params --debug-shell '\ +'--debug-stacks --debug-tmpdir --debug-user '; + for i + do + case "$i" in + --debug-s) + echo 'The abbreviation --debug-s has multiple options: '\ +'--debug-shell and --debug-stacks.' >&2 + exit "${_ERROR}"; + ;; + esac; + case "$d" in + *\ ${i}*) + # extract whole word of abbreviation $i + s="$(cat <&2; +fi; + +if test _"${_DEBUG_PRINT_SHELL}"_ = _yes_ +then + if test _"${_SHELL}"_ = __ + then + if test _"${POSIXLY_CORRECT}"_ = _y_ + then + echo 'shell: bash as /bin/sh (none specified)' >&2; + else + echo 'shell: /bin/sh (none specified)' >&2; + fi; + else + echo "shell: ${_SHELL}" >&2; + fi; +fi; + + +######################################################################## +# Environment Variables +######################################################################## + +# Environment variables that exist only for this file start with an +# underscore letter. Global variables to this file are written in +# upper case letters, e.g. $_GLOBAL_VARIABLE; temporary variables +# start with an underline and use only lower case letters and +# underlines, e.g. $_local_variable . + +# [A-Z]* system variables, e.g. $MANPATH +# _[A-Z_]* global file variables, e.g. $_MAN_PATH +# _[a-z_]* temporary variables, e.g. $_manpath + +# Due to incompatibilities of the `ash' shell, the name of loop +# variables in `for' must be single character +# [a-z] local loop variables, e.g. $i + + +######################################################################## +# read-only variables (global to this file) +######################################################################## + +# function return values; `0' means ok; other values are error codes +export _ALL_EXIT; +export _BAD; +export _GOOD; +export _NO; +export _OK; +export _YES; + +_GOOD='0'; # return ok +_BAD='1'; # return negatively, error code `1' +# $_ERROR was already defined as `7' in groffer.sh. + +_NO="${_BAD}"; +_YES="${_GOOD}"; +_OK="${_GOOD}"; + +# quasi-functions, call with `eval', e.g `eval "${return_ok}"' +export return_ok; +export return_good; +export return_bad; +export return_yes; +export return_no; +export return_error; +export return_var; +return_ok="func_pop; return ${_OK}"; +return_good="func_pop; return ${_GOOD}"; +return_bad="func_pop; return ${_BAD}"; +return_yes="func_pop; return ${_YES}"; +return_no="func_pop; return ${_NO}"; +return_error="func_pop; return ${_ERROR}"; +return_var="func_pop; return"; # add number, e.g. `eval "${return_var} $n' + + +export _DEFAULT_MODES; +_DEFAULT_MODES='x,ps,tty'; +export _DEFAULT_RESOLUTION; +_DEFAULT_RESOLUTION='75'; + +export _DEFAULT_TTY_DEVICE; +_DEFAULT_TTY_DEVICE='latin1'; + +# _VIEWER_* viewer programs for different modes (only X is necessary) +# _VIEWER_* a comma-separated list of viewer programs (with options) +export _VIEWER_DVI; # viewer program for dvi mode +export _VIEWER_HTML_TTY; # viewer program for html mode in tty +export _VIEWER_HTML_X; # viewer program for html mode in X +export _VIEWER_PDF; # viewer program for pdf mode +export _VIEWER_PS; # viewer program for ps mode +export _VIEWER_X; # viewer program for X mode +_VIEWER_DVI='kdvi,xdvi,dvilx'; +_VIEWER_HTML_TTY='lynx'; +_VIEWER_HTML_X='konqueror,mozilla,netscape,galeon,opera,amaya,arena'; +_VIEWER_PDF='kghostview --scale 1.45,ggv,xpdf,acroread,kpdf'; +_VIEWER_PS='kghostview --scale 1.45,ggv,gv,ghostview,gs_x11,gs'; +_VIEWER_X='gxditview,xditview'; + +# Search automatically in standard sections `1' to `8', and in the +# traditional sections `9', `n', and `o'. On many systems, there +# exist even more sections, mostly containing a set of man pages +# special to a specific program package. These aren't searched for +# automatically, but must be specified on the command line. +export _MAN_AUTO_SEC_LIST; +_MAN_AUTO_SEC_LIST="'1' '2' '3' '4' '5' '6' '7' '8' '9' 'n' 'o'"; +export _MAN_AUTO_SEC_CHARS; +_MAN_AUTO_SEC_CHARS='[123456789no]'; + +export _SPACE_SED; +_SPACE_SED='['"${_SP}${_TAB}"']'; + +export _SPACE_CASE; +_SPACE_CASE='[\'"${_SP}"'\'"${_TAB}"']'; + +export _PROCESS_ID; # for shutting down the program +_PROCESS_ID="$$"; + + +############ the command line options of the involved programs +# +# The naming scheme for the options environment names is +# $_OPTS__[_] +# +# : program name GROFFER, GROFF, or CMDLINE (for all +# command line options) +# : LONG (long options) or SHORT (single character options) +# : ARG for options with argument, NA for no argument; +# without _ both the ones with and without arg. +# +# Each option that takes an argument must be specified with a +# trailing : (colon). + +# exports +export _OPTS_GROFFER_SHORT_NA; +export _OPTS_GROFFER_SHORT_ARG; +export _OPTS_GROFFER_LONG_NA; +export _OPTS_GROFFER_LONG_ARG; +export _OPTS_GROFF_SHORT_NA; +export _OPTS_GROFF_SHORT_ARG; +export _OPTS_GROFF_LONG_NA; +export _OPTS_GROFF_LONG_ARG; +export _OPTS_X_SHORT_ARG; +export _OPTS_X_SHORT_NA; +export _OPTS_X_LONG_ARG; +export _OPTS_X_LONG_NA; +export _OPTS_MAN_SHORT_ARG; +export _OPTS_MAN_SHORT_NA; +export _OPTS_MAN_LONG_ARG; +export _OPTS_MAN_LONG_NA; +export _OPTS_MANOPT_SHORT_ARG; +export _OPTS_MANOPT_SHORT_NA; +export _OPTS_MANOPT_LONG_ARG; +export _OPTS_MANOPT_LONG_NA; +export _OPTS_CMDLINE_SHORT_NA; +export _OPTS_CMDLINE_SHORT_ARG; +export _OPTS_CMDLINE_LONG_NA; +export _OPTS_CMDLINE_LONG_ARG; + +###### groffer native options + +_OPTS_GROFFER_SHORT_NA="'h' 'Q' 'v' 'V' 'X' 'Z'"; +_OPTS_GROFFER_SHORT_ARG="'T'"; + +_OPTS_GROFFER_LONG_NA="'auto' \ +'apropos' 'apropos-data' 'apropos-devel' 'apropos-progs' \ +'debug' 'debug-all' 'debug-keep' 'debug-lm' 'debug-params' 'debug-shell' \ +'debug-stacks' 'debug-tmpdir' 'debug-user' 'default' 'do-nothing' 'dvi' \ +'groff' 'help' 'intermediate-output' 'html' 'man' \ +'no-location' 'no-man' 'no-special' 'pdf' 'ps' 'rv' 'source' \ +'text' 'text-device' \ +'tty' 'tty-device' 'version' 'whatis' 'where' 'www' 'x' 'X'"; + +_OPTS_GROFFER_LONG_ARG="\ +'default-modes' 'device' 'dvi-viewer' 'dvi-viewer-tty' 'extension' 'fg' \ +'fn' 'font' 'foreground' 'html-viewer' 'html-viewer-tty' 'mode' \ +'pdf-viewer' 'pdf-viewer-tty' 'print' 'ps-viewer' 'ps-viewer-tty' 'shell' \ +'title' 'tty-viewer' 'tty-viewer-tty' 'www-viewer' 'www-viewer-tty' \ +'x-viewer' 'x-viewer-tty' 'X-viewer' 'X-viewer-tty'"; + +##### groffer options inhereted from groff + +_OPTS_GROFF_SHORT_NA="'a' 'b' 'c' 'C' 'e' 'E' 'g' 'G' 'i' 'l' 'N' 'p' \ +'R' 's' 'S' 't' 'U' 'z'"; +_OPTS_GROFF_SHORT_ARG="'d' 'f' 'F' 'I' 'L' 'm' 'M' 'n' 'o' 'P' 'r' \ +'w' 'W'"; +_OPTS_GROFF_LONG_NA=""; +_OPTS_GROFF_LONG_ARG=""; + +##### groffer options inhereted from the X Window toolkit + +_OPTS_X_SHORT_NA=""; +_OPTS_X_SHORT_ARG=""; + +_OPTS_X_LONG_NA="'iconic' 'rv'"; + +_OPTS_X_LONG_ARG="'background' 'bd' 'bg' 'bordercolor' 'borderwidth' \ +'bw' 'display' 'fg' 'fn' 'font' 'foreground' 'ft' 'geometry' \ +'resolution' 'title' 'xrm'"; + +###### groffer options inherited from man + +_OPTS_MAN_SHORT_NA=""; +_OPTS_MAN_SHORT_ARG=""; + +_OPTS_MAN_LONG_NA="'all' 'ascii' 'catman' 'ditroff' \ +'local-file' 'location' 'troff' 'update'"; + +_OPTS_MAN_LONG_ARG="'locale' 'manpath' \ +'pager' 'preprocessor' 'prompt' 'sections' 'systems' 'troff-device'"; + +###### additional options for parsing $MANOPT only + +_OPTS_MANOPT_SHORT_NA="'7' 'a' 'c' 'd' 'D' 'f' 'h' 'k' 'l' 't' 'u' \ +'V' 'w' 'Z'"; +_OPTS_MANOPT_SHORT_ARG="'e' 'L' 'm' 'M' 'p' 'P' 'r' 'S' 'T'"; + +_OPTS_MANOPT_LONG_NA="${_OPTS_MAN_LONG_NA} \ +'apropos' 'debug' 'default' 'help' 'html' 'ignore-case' 'location-cat' \ +'match-case' 'troff' 'update' 'version' 'whatis' 'where' 'where-cat'"; + +_OPTS_MANOPT_LONG_ARG="${_OPTS_MAN_LONG_NA} \ +'config_file' 'encoding' 'extension' 'locale'"; + +###### collections of command line options + +_OPTS_CMDLINE_SHORT_NA="${_OPTS_GROFFER_SHORT_NA} \ +${_OPTS_GROFF_SHORT_NA} ${_OPTS_X_SHORT_NA} ${_OPTS_MAN_SHORT_NA}"; +_OPTS_CMDLINE_SHORT_ARG="${_OPTS_GROFFER_SHORT_ARG} \ +${_OPTS_GROFF_SHORT_ARG} ${_OPTS_X_SHORT_ARG} ${_OPTS_MAN_SHORT_ARG}"; + +_OPTS_CMDLINE_LONG_NA="${_OPTS_GROFFER_LONG_NA} \ +${_OPTS_GROFF_LONG_NA} ${_OPTS_X_LONG_NA} ${_OPTS_MAN_LONG_NA}"; +_OPTS_CMDLINE_LONG_ARG="${_OPTS_GROFFER_LONG_ARG} \ +${_OPTS_GROFF_LONG_ARG} ${_OPTS_MAN_LONG_ARG} ${_OPTS_X_LONG_ARG}"; + + +######################################################################## +# read-write variables (global to this file) +######################################################################## + +export _ALL_PARAMS; # All options and file name parameters +export _ADDOPTS_GROFF; # Transp. options for groff (`eval'). +export _ADDOPTS_POST; # Transp. options postproc (`eval'). +export _ADDOPTS_X; # Transp. options X postproc (`eval'). +export _APROPOS_PROG; # Program to run apropos. +export _APROPOS_SECTIONS; # Sections for different --apropos-*. +export _DEFAULT_MODES; # Set default modes. +export _DISPLAY_MODE; # Display mode. +export _DISPLAY_PROG; # Viewer program to be used for display. +export _DISPLAY_ARGS; # X resources for the viewer program. +export _FILEARGS; # Stores filespec parameters. +export _FILESPEC_ARG; # Stores the actual filespec parameter. +export _FUNC_STACK; # Store debugging information. +export _REGISTERED_TITLE; # Processed file names. +# _HAS_* from availability tests +export _HAS_COMPRESSION; # `yes' if gzip compression is available +export _HAS_BZIP; # `yes' if bzip2 compression is available +# _MAN_* finally used configuration of man searching +export _MAN_ALL; # search all man pages per filespec +export _MAN_ENABLE; # enable search for man pages +export _MAN_EXT; # extension for man pages +export _MAN_FORCE; # force file parameter to be man pages +export _MAN_IS_SETUP; # setup man variables only once +export _MAN_LANG; # language for man pages +export _MAN_LANG2; # language for man pages +export _MAN_LANG_DONE; # language dirs added to man path +export _MAN_PATH; # search path for man pages +export _MAN_SEC; # sections for man pages; sep. `:' +export _MAN_SEC_DONE; # sections added to man path +export _MAN_SYS; # system names for man pages; sep. `,' +export _MAN_SYS; # system names added to man path +# _MANOPT_* as parsed from $MANOPT +export _MANOPT_ALL; # $MANOPT --all +export _MANOPT_EXTENSION; # $MANOPT --extension +export _MANOPT_LANG; # $MANOPT --locale +export _MANOPT_PATH; # $MANOPT --manpath +export _MANOPT_PAGER; # $MANOPT --pager +export _MANOPT_SEC; # $MANOPT --sections +export _MANOPT_SYS; # $MANOPT --systems +# _OPT_* as parsed from groffer command line +export _OPT_ALL; # display all suitable man pages. +export _OPT_APROPOS; # call `apropos' program. +export _OPT_BD; # set border color in some modes. +export _OPT_BG; # set background color in some modes. +export _OPT_BW; # set border width in some modes. +export _OPT_DEFAULT_MODES; # `,'-list of modes when no mode given. +export _OPT_DEVICE; # device option. +export _OPT_DO_NOTHING; # do nothing in main_display(). +export _OPT_DISPLAY; # set X display. +export _OPT_FG; # set foreground color in some modes. +export _OPT_FN; # set font in some modes. +export _OPT_GEOMETRY; # set size and position of viewer in X. +export _OPT_ICONIC; # -iconic option for X viewers. +export _OPT_LANG; # set language for man pages +export _OPT_LOCATION; # print processed file names to stderr +export _OPT_MODE; # values: X, tty, Q, Z, "" +export _OPT_MANPATH; # manual setting of path for man-pages +export _OPT_PAGER; # specify paging program for tty mode +export _OPT_RESOLUTION; # set X resolution in dpi +export _OPT_RV; # reverse fore- and background colors. +export _OPT_SECTIONS; # sections for man page search +export _OPT_SYSTEMS; # man pages of different OS's +export _OPT_TITLE; # title for gxditview window +export _OPT_TEXT_DEVICE; # set device for tty mode. +export _OPT_V; # groff option -V. +export _OPT_VIEWER_DVI; # viewer program for dvi mode +export _OPT_VIEWER_PDF; # viewer program for pdf mode +export _OPT_VIEWER_PS; # viewer program for ps mode +export _OPT_VIEWER_HTML; # viewer program for html mode +export _OPT_VIEWER_X; # viewer program for x mode +export _OPT_WHATIS; # print the man description +export _OPT_XRM; # specify X resource. +export _OPT_Z; # groff option -Z. +export _OUTPUT_FILE_NAME; # output generated, see main_set_res..() +export _VIEWER_TERMINAL; # viewer options for terminal (--*-viewer-tty) +# _TMP_* temporary directory and files +export _TMP_DIR; # groffer directory for temporary files +export _TMP_CAT; # stores concatenation of everything +export _TMP_STDIN; # stores stdin, if any + +# these variables are preset in section `Preset' after the rudim. test + + +######################################################################## +# Preset and reset of read-write global variables +######################################################################## + + +export _START_DIR; # directory at start time of the script +_START_DIR="$(pwd)"; + +# For variables that can be reset by option `--default', see reset(). + +_FILEARGS=''; + +# _HAS_* from availability tests +_HAS_COMPRESSION=''; +_HAS_BZIP=''; + +# _TMP_* temporary files +_TMP_DIR=''; +_TMP_CAT=''; +_TMP_CONF=''; +_TMP_STDIN=''; + + +######################################################################## +# reset () +# +# Reset the variables that can be affected by options to their default. +# +reset() +{ + if test "$#" -ne 0 + then + error "reset() does not have arguments."; + fi; + + _ADDOPTS_GROFF=''; + _ADDOPTS_POST=''; + _ADDOPTS_X=''; + _APROPOS_PROG=''; + _APROPOS_SECTIONS=''; + _DISPLAY_ARGS=''; + _DISPLAY_MODE=''; + _DISPLAY_PROG=''; + _REGISTERED_TITLE=''; + + # _MAN_* finally used configuration of man searching + _MAN_ALL='no'; + _MAN_ENABLE='yes'; # do search for man-pages + _MAN_EXT=''; + _MAN_FORCE='no'; # first local file, then search man page + _MAN_IS_SETUP='no'; + _MAN_LANG=''; + _MAN_LANG2=''; + _MAN_PATH=''; + _MAN_SEC=''; + _MAN_SEC_DONE='no'; + _MAN_SYS=''; + _MAN_SYS_DONE='no'; + + # _MANOPT_* as parsed from $MANOPT + _MANOPT_ALL='no'; + _MANOPT_EXTENSION=''; + _MANOPT_LANG=''; + _MANOPT_PATH=''; + _MANOPT_PAGER=''; + _MANOPT_SEC=''; + _MANOPT_SYS=''; + + # _OPT_* as parsed from groffer command line + _OPT_ALL='no'; + _OPT_APROPOS='no'; + _OPT_BD=''; + _OPT_BG=''; + _OPT_BW=''; + _OPT_DEFAULT_MODES=''; + _OPT_DEVICE=''; + _OPT_DISPLAY=''; + _OPT_DO_NOTHING='no'; + _OPT_FG=''; + _OPT_FN=''; + _OPT_GEOMETRY=''; + _OPT_ICONIC='no'; + _OPT_LANG=''; + _OPT_LOCATION='no'; + _OPT_MODE=''; + _OPT_MANPATH=''; + _OPT_PAGER=''; + _OPT_RESOLUTION=''; + _OPT_RV='no'; + _OPT_SECTIONS=''; + _OPT_SYSTEMS=''; + _OPT_TITLE=''; + _OPT_TEXT_DEVICE=''; + _OPT_V='no'; + _OPT_VIEWER_DVI=''; + _OPT_VIEWER_PDF=''; + _OPT_VIEWER_PS=''; + _OPT_VIEWER_HTML=''; + _OPT_VIEWER_X=''; + _OPT_WHATIS='no'; + _OPT_XRM=''; + _OPT_Z='no'; + _VIEWER_TERMINAL='no'; +} + +reset; + + +######################################################################## +# Functions for error handling and debugging +######################################################################## + + +############## +# echo1 (*) +# +# Output to stdout. +# +# Arguments : arbitrary text including `-'. +# +echo1() +{ + cat <*) +# +# Output to stderr. +# +# Arguments : arbitrary text. +# +echo2() +{ + cat >&2 <) +# +# Print to standard error as a debugging aid. +# +# Globals: $_DEBUG_LM +# +landmark() +{ + if test _"${_DEBUG_LM}"_ = _yes_ + then + echo2 "LM: $*"; + fi; +} + +landmark "1: debugging functions"; + + +############## +# clean_up () +# +# Clean up at exit. +# +clean_up() +{ + cd "${_START_DIR}" >"${_NULL_DEV}" 2>&1; + if test _${_DEBUG_KEEP_FILES}_ = _yes_ + then + echo2 "Kept temporary directory ${_TMP_DIR}." + else + if test _"${_TMP_DIR}"_ != __ + then + if test -d "${_TMP_DIR}" || test -f "${_TMP_DIR}" + then + rm -f -r "${_TMP_DIR}" >${_NULL_DEV} 2>&1; + fi; + fi; + fi; +} + + +############# +# diag (text>*) +# +# Output a diagnostic message to stderr +# +diag() +{ + echo2 '>>>>>'"$*"; +} + + +############# +# error (*) +# +# Print an error message to standard error, print the function stack, +# exit with an error condition. The argument should contain the name +# of the function from which it was called. This is for system errors. +# +error() +{ + case "$#" in + 1) echo2 'groffer error: '"$1"; ;; + *) echo2 'groffer error: wrong number of arguments in error().'; ;; + esac; + func_stack_dump; + if test _"${_TMP_DIR}"_ != __ && test -d "${_TMP_DIR}" + then + : >"${_TMP_DIR}"/,error; + fi; + exit "${_ERROR}"; +} + + +############# +# error_user (*) +# +# Print an error message to standard error; exit with an error condition. +# The error is supposed to be produce by the user. So the funtion stack +# is omitted. +# +error_user() +{ + case "$#" in + 1) + echo2 'groffer error: '"$1"; + ;; + *) + echo2 'groffer error: wrong number of arguments in error_user().'; + ;; + esac; + if test _"${_DEBUG_USER_WITH_STACK}"_ = _yes_ + then + func_stack_dump; + fi; + if test _"${_TMP_DIR}"_ != __ && test -d "${_TMP_DIR}" + then + : >"${_TMP_DIR}"/,error; + fi; + exit "${_ERROR}"; +} + + +############# +# exit_test () +# +# Test whether the former command ended with error(). Exit again. +# +# Globals: $_ERROR +# +exit_test() +{ + if test "$?" = "${_ERROR}" + then + exit ${_ERROR}; + fi; + if test _"${_TMP_DIR}"_ != __ && test -f "${_TMP_DIR}"/,error + then + exit ${_ERROR}; + fi; +} + + +############# +# func_check ( "$@") +# +# Check number of arguments and register to _FUNC_STACK. +# +# Arguments: >=3 +# : name of the calling function. +# : a relational operator: = != < > <= >= +# : number of arguments to be checked against +# "$@": the arguments of the calling function. +# +# Variable prefix: fc +# +func_check() +{ + if test "$#" -lt 3 + then + error 'func_check() needs at least 3 arguments.'; + fi; + fc_fname="$1"; + case "$3" in + 1) + fc_nargs="$3"; + fc_s=''; + ;; + 0|[2-9]) + fc_nargs="$3"; + fc_s='s'; + ;; + *) + error "func_check(): third argument must be a digit."; + ;; + esac; + case "$2" in + '='|'-eq') + fc_op='-eq'; + fc_comp='exactly'; + ;; + '>='|'-ge') + fc_op='-ge'; + fc_comp='at least'; + ;; + '<='|'-le') + fc_op='-le'; + fc_comp='at most'; + ;; + '<'|'-lt') + fc_op='-lt'; + fc_comp='less than'; + ;; + '>'|'-gt') + fc_op='-gt'; + fc_comp='more than'; + ;; + '!='|'-ne') + fc_op='-ne'; + fc_comp='not'; + ;; + *) + error \ + 'func_check(): second argument is not a relational operator.'; + ;; + esac; + shift; + shift; + shift; + if test "$#" "${fc_op}" "${fc_nargs}" + then + do_nothing; + else + error "func_check(): \ +${fc_fname}"'() needs '"${fc_comp} ${fc_nargs}"' argument'"${fc_s}"'.'; + fi; + func_push "${fc_fname}"; + if test _"${_DEBUG_STACKS}"_ = _yes_ + then + echo2 '+++ '"${fc_fname} $@"; + echo2 '>>> '"${_FUNC_STACK}"; + fi; + eval ${_UNSET} fc_comp; + eval ${_UNSET} fc_fname; + eval ${_UNSET} fc_nargs; + eval ${_UNSET} fc_op; + eval ${_UNSET} fc_s; +} + + +############# +# func_pop () +# +# Retrieve the top element from the stack. +# +# The stack elements are separated by `!'; the popped element is +# identical to the original element, except that all `!' characters +# were removed. +# +# Arguments: 1 +# +func_pop() +{ + if test "$#" -ne 0 + then + error 'func_pop() does not have arguments.'; + fi; + case "${_FUNC_STACK}" in + '') + if test _"${_DEBUG_STACKS}"_ = _yes_ + then + error 'func_pop(): stack is empty.'; + fi; + ;; + *!*) + # split at first bang `!'. + _FUNC_STACK="$(echo1 "${_FUNC_STACK}" | sed -e 's/^[^!]*!//')"; + exit_test; + ;; + *) + _FUNC_STACK=''; + ;; + esac; + if test _"${_DEBUG_STACKS}"_ = _yes_ + then + echo2 '<<< '"${_FUNC_STACK}"; + fi; +} + + +############# +# func_push () +# +# Store another element to stack. +# +# The stack elements are separated by `!'; if contains a `!' +# it is removed first. +# +# Arguments: 1 +# +# Variable prefix: fp +# +func_push() +{ + if test "$#" -ne 1 + then + error 'func_push() needs 1 argument.'; + fi; + case "$1" in + *'!'*) + # remove all bangs `!'. + fp_element="$(echo1 "$1" | sed -e 's/!//g')"; + exit_test; + ;; + *) + fp_element="$1"; + ;; + esac; + if test _"${_FUNC_STACK}"_ = __ + then + _FUNC_STACK="${fp_element}"; + else + _FUNC_STACK="${fp_element}!${_FUNC_STACK}"; + fi; + eval ${_UNSET} fp_element; +} + + +############# +# func_stack_dump () +# +# Print the content of the stack. Ignore the arguments. +# +func_stack_dump() +{ + diag 'call stack: '"${_FUNC_STACK}"; +} + + +######################################################################## +# System Test +######################################################################## + +landmark "2: system test"; + +# Test the availability of the system utilities used in this script. + + +######################################################################## +# Test of function `sed'. +# + +if test _"$(echo xTesTx \ + | sed -e 's/^.\([Tt]e*x*sTT*\).*$/\1/' \ + | sed -e 's|T|t|g')"_ != _test_ +then + error 'Test of "sed" command failed.'; +fi; + + +######################################################################## +# Test of function `cat'. +# +if test _"$(echo test | cat)"_ != _test_ +then + error 'Test of "cat" command failed.'; +fi; + + +######################################################################## +# Test for compression. +# +if test _"$(echo 'test' | gzip -c -d -f - 2>${_NULL_DEV})"_ = _test_ +then + _HAS_COMPRESSION='yes'; + if echo1 'test' | bzip2 -c 2>${_NULL_DEV} | bzip2 -t 2>${_NULL_DEV} \ + && test _"$(echo 'test' | bzip2 -c 2>${_NULL_DEV} \ + | bzip2 -d -c 2>${_NULL_DEV})"_ \ + = _test_ + then + _HAS_BZIP='yes'; + else + _HAS_BZIP='no'; + fi; +else + _HAS_COMPRESSION='no'; + _HAS_BZIP='no'; +fi; + + +######################################################################## +# Definition of normal Functions in alphabetical order +######################################################################## +landmark "3: functions"; + +######################################################################## +# apropos_filespec () +# +# Setup for the --apropos* options +# +apropos_filespec() +{ + + func_check apropos_filespec '=' 0 "$@"; + if obj _OPT_APROPOS is_yes + then + eval to_tmp_line \ + "'.SH $(echo1 "${_FILESPEC_ARG}" | sed 's/[^\\]-/\\-/g')'"; + exit_test; + if obj _APROPOS_PROG is_empty + then + error 'apropos_filespec: apropos_setup() must be run first.'; + fi; + if obj _APROPOS_SECTIONS is_empty + then + if obj _OPT_SECTIONS is_empty + then + s='^.*(.*).*$'; + else + s='^.*(['"$(echo1 "${_OPT_SECTIONS}" | sed -e 's/://g')"']'; + fi; + else + s='^.*(['"${_APROPOS_SECTIONS}"']'; + fi; + eval "${_APROPOS_PROG}" "'${_FILESPEC_ARG}'" | \ + sed -n -e ' +/^'"${_FILESPEC_ARG}"': /p +/'"$s"'/p +' | \ + sort |\ + sed -e ' +s/^\(.* (..*)\) *- *\(.*\)$/\.br\n\.TP 15\n\.BR \1\n\2/ +' >>"${_TMP_CAT}"; + fi; + eval "${return_ok}"; +} + + +######################################################################## +# apropos_setup () +# +# Setup for the --apropos* options +# +apropos_setup() +{ + func_check apropos_setup '=' 0 "$@"; + if obj _OPT_APROPOS is_yes + then + if is_prog apropos + then + _APROPOS_PROG='apropos'; + elif is_prog man + then + if man --apropos man >${_NULL_DEV} 2>${_NULL_DEV} + then + _APROPOS_PROG='man --apropos'; + elif man -k man >${_NULL_DEV} 2>${_NULL_DEV} + then + _APROPOS_PROG='man -k'; + fi; + fi; + if obj _APROPOS_PROG is_empty + then + error 'apropos_setup: no apropos program available.'; + fi; + to_tmp_line '.TH GROFFER APROPOS'; + fi; + eval "${return_ok}"; +} + + +######################################################################## +# base_name () +# +# Get the file name part of , i.e. delete everything up to last +# `/' from the beginning of . Remove final slashes, too, to get a +# non-empty output. +# +# Arguments : 1 +# Output : the file name part (without slashes) +# +# Variable prefix: bn +# +base_name() +{ + func_check base_name = 1 "$@"; + bn_name="$1"; + case "${bn_name}" in + */) + # delete all final slashes + bn_name="$(echo1 "${bn_name}" | sed -e 's|//*$||')"; + exit_test; + ;; + esac; + case "${bn_name}" in + /|'') + eval ${_UNSET} bn_name; + eval "${return_bad}"; + ;; + */*) + # delete everything before and including the last slash `/'. + echo1 "${bn_name}" | sed -e 's|^.*//*\([^/]*\)$|\1|'; + ;; + *) + obj bn_name echo1; + ;; + esac; + eval ${_UNSET} bn_name; + eval "${return_ok}"; +} + + +######################################################################## +# cat_z () +# +# Decompress if possible or just print to standard output. +# +# gzip, bzip2, and .Z decompression is supported. +# +# Arguments: 1, a file name. +# Output: the content of , possibly decompressed. +# +if test _"${_HAS_COMPRESSION}"_ = _yes_ +then + cat_z() + { + func_check cat_z = 1 "$@"; + case "$1" in + '') + error 'cat_z(): empty file name'; + ;; + '-') + error 'cat_z(): for standard input use save_stdin()'; + ;; + esac; + if obj _HAS_BZIP is_yes + then + if bzip2 -t "$1" 2>${_NULL_DEV} + then + bzip2 -c -d "$1" 2>${_NULL_DEV}; + eval "${return_ok}"; + fi; + fi; + gzip -c -d -f "$1" 2>${_NULL_DEV}; + eval "${return_ok}"; + } +else + cat_z() + { + func_check cat_z = 1 "$@"; + cat "$1"; + eval "${return_ok}"; + } +fi; + + +######################################################################## +# clean_up () +# +# Do the final cleaning up before exiting; used by the trap calls. +# +# defined above + + +######################################################################## +# diag (*) +# +# Print marked message to standard error; useful for debugging. +# +# defined above + + +######################################################################## +landmark '4: dirname()*'; +######################################################################## + +####################################################################### +# dirname_append ( ) +# +# Append `name' to `dir' with clean handling of `/'. +# +# Arguments : 2 +# Output : the generated new directory name / +# +dirname_append() +{ + func_check dirname_append = 2 "$@"; + if is_empty "$1" + then + error "dir_append(): first argument is empty."; + fi; + if is_empty "$2" + then + echo1 "$1"; + else + dirname_chop "$1"/"$2"; + fi; + eval "${return_ok}"; +} + + +######################################################################## +# dirname_chop () +# +# Remove unnecessary slashes from directory name. +# +# Argument: 1, a directory name. +# Output: path without double, or trailing slashes. +# +# Variable prefix: dc +# +dirname_chop() +{ + func_check dirname_chop = 1 "$@"; + # replace all multiple slashes by a single slash `/'. + dc_res="$(echo1 "$1" | sed -e 's|///*|/|g')"; + exit_test; + case "${dc_res}" in + ?*/) + # remove trailing slash '/'; + echo1 "${dc_res}" | sed -e 's|/$||'; + ;; + *) + obj dc_res echo1 + ;; + esac; + eval ${_UNSET} dc_res; + eval "${return_ok}"; +} + + +######################################################################## +# do_filearg () +# +# Append the file, man-page, or standard input corresponding to the +# argument to the temporary file. If this is compressed in the gzip +# or Z format it is decompressed. A title element is generated. +# +# Argument either: +# - name of an existing file. +# - `-' to represent standard input (several times allowed). +# - `man:name.(section)' the man-page for `name' in `section'. +# - `man:name.section' the man-page for `name' in `section'. +# - `man:name' the man-page for `name' in the lowest `section'. +# - `name.section' the man-page for `name' in `section'. +# - `name' the man-page for `name' in the lowest `section'. +# Globals : +# $_TMP_STDIN, $_MAN_ENABLE, $_MAN_IS_SETUP, $_OPT_MAN +# +# Output : none +# Return : $_GOOD if found, ${_BAD} otherwise. +# +# Variable prefix: df +# +do_filearg() +{ + func_check do_filearg = 1 "$@"; + df_filespec="$1"; + # store sequence into positional parameters + case "${df_filespec}" in + '') + eval ${_UNSET} df_filespec; + eval "${return_good}"; + ;; + '-') + register_file '-'; + eval ${_UNSET} df_filespec; + eval "${return_good}"; + ;; + */*) # with directory part; so no man search + set 'File'; + ;; + *) + if obj _MAN_ENABLE is_yes + then + if obj _MAN_FORCE is_yes + then + set 'Manpage' 'File'; + else + set 'File' 'Manpage'; + fi; + else + set 'File'; + fi; + ;; + esac; + for i + do + case "$i" in + File) + if test -f "${df_filespec}" + then + if test -r "${df_filespec}" + then + register_file "${df_filespec}"; + eval ${_UNSET} df_filespec; + eval ${_UNSET} df_no_man; + eval "${return_good}"; + else + echo2 "could not read \`${df_filespec}'"; + eval ${_UNSET} df_filespec; + eval ${_UNSET} df_no_man; + eval "${return_bad}"; + fi; + else + if obj df_no_man is_not_empty + then + if obj _OPT_WHATIS is_yes + then + to_tmp_line "This is neither a file nor a man page." + else + echo2 "\`${df_filespec}' is neither a file nor a man page." + fi; + fi; + df_no_file=yes; + continue; + fi; + ;; + Manpage) # parse filespec as man page + if obj _MAN_IS_SETUP is_not_yes + then + man_setup; + fi; + if man_do_filespec "${df_filespec}" + then + eval ${_UNSET} df_filespec; + eval ${_UNSET} df_no_file; + eval "${return_good}"; + else + if obj df_no_file is_not_empty + then + if obj _OPT_WHATIS is_yes + then + to_tmp_line "This is neither a file nor a man page." + else + echo2 "\`${df_filespec}' is neither a file nor a man page." + fi; + fi; + df_no_man=yes; + continue; + fi; + ;; + esac; + done; + eval ${_UNSET} df_filespec; + eval ${_UNSET} df_no_file; + eval ${_UNSET} df_no_man; + eval "${return_bad}"; +} # do_filearg() + + +######################################################################## +# do_nothing () +# +# Dummy function. +# +do_nothing() +{ + eval return "${_OK}"; +} + + +######################################################################## +# echo2 (*) +# +# Print to standard error with final line break. +# +# defined above + + +######################################################################## +# error (*) +# +# Print error message and exit with error code. +# +# defined above + + +######################################################################## +# exit_test () +# +# Test whether the former command ended with error(). Exit again. +# +# defined above + + +######################################################################## +# func_check ( "$@") +# +# Check number of arguments and register to _FUNC_STACK. +# +# Arguments: >=3 +# : name of the calling function. +# : a relational operator: = != < > <= >= +# : number of arguments to be checked against +# "$@": the arguments of the calling function. +# +# defined above + +######################################################################### +# func_pop () +# +# Delete the top element from the function call stack. +# +# defined above + + +######################################################################## +# func_push () +# +# Store another element to function call stack. +# +# defined above + + +######################################################################## +# func_stack_dump () +# +# Print the content of the stack. +# +# defined above + + +######################################################################## +# get_first_essential (*) +# +# Retrieve first non-empty argument. +# +# Return : `1' if all arguments are empty, `0' if found. +# Output : the retrieved non-empty argument. +# +# Variable prefix: gfe +# +get_first_essential() +{ + func_check get_first_essential '>=' 0 "$@"; + if is_equal "$#" 0 + then + eval "${return_ok}"; + fi; + for i + do + gfe_var="$i"; + if obj gfe_var is_not_empty + then + obj gfe_var echo1; + eval ${_UNSET} gfe_var; + eval "${return_ok}"; + fi; + done; + eval ${_UNSET} gfe_var; + eval "${return_bad}"; +} + + +######################################################################## +landmark '5: is_*()'; +######################################################################## + +######################################################################## +# is_dir () +# +# Test whether `name' is a directory. +# +# Arguments : 1 +# Return : `0' if arg1 is a directory, `1' otherwise. +# +is_dir() +{ + func_check is_dir '=' 1 "$@"; + if test _"$1"_ != __ && test -d "$1" && test -r "$1" + then + eval "${return_yes}"; + fi; + eval "${return_no}"; +} + + +######################################################################## +# is_empty () +# +# Test whether `string' is empty. +# +# Arguments : <=1 +# Return : `0' if arg1 is empty or does not exist, `1' otherwise. +# +is_empty() +{ + func_check is_empty '=' 1 "$@"; + if test _"$1"_ = __ + then + eval "${return_yes}"; + fi; + eval "${return_no}"; +} + + +######################################################################## +# is_equal ( ) +# +# Test whether `string1' is equal to . +# +# Arguments : 2 +# Return : `0' both arguments are equal strings, `1' otherwise. +# +is_equal() +{ + func_check is_equal '=' 2 "$@"; + if test _"$1"_ = _"$2"_ + then + eval "${return_yes}"; + fi; + eval "${return_no}"; +} + + +######################################################################## +# is_existing () +# +# Test whether `name' is an existing file or directory. Solaris 2.5 does +# not have `test -e'. +# +# Arguments : 1 +# Return : `0' if arg1 exists, `1' otherwise. +# +is_existing() +{ + func_check is_existing '=' 1 "$@"; + if test _"$1"_ = __ + then + eval "${return_no}"; + fi; + if test -f "$1" || test -d "$1" || test -c "$1" + then + eval "${return_yes}"; + fi; + eval "${return_no}"; +} + + +######################################################################## +# is_file () +# +# Test whether `name' is a readable file. +# +# Arguments : 1 +# Return : `0' if arg1 is a readable file, `1' otherwise. +# +is_file() +{ + func_check is_file '=' 1 "$@"; + if is_not_empty "$1" && test -f "$1" && test -r "$1" + then + eval "${return_yes}"; + fi; + eval "${return_no}"; +} + + +######################################################################## +# is_non_empty_file () +# +# Test whether `file_name' is a non-empty existing file. +# +# Arguments : <=1 +# Return : +# `0' if arg1 is a non-empty existing file +# `1' otherwise +# +is_non_empty_file() +{ + func_check is_non_empty_file '=' 1 "$@"; + if is_file "$1" && test -s "$1" + then + eval "${return_yes}"; + fi; + eval "${return_no}"; +} + + +######################################################################## +# is_not_dir () +# +# Test whether `name' is not a readable directory. +# +# Arguments : 1 +# Return : `0' if arg1 is a directory, `1' otherwise. +# +is_not_dir() +{ + func_check is_not_dir '=' 1 "$@"; + if is_dir "$1" + then + eval "${return_no}"; + fi; + eval "${return_yes}"; +} + + +######################################################################## +# is_not_empty () +# +# Test whether `string' is not empty. +# +# Arguments : <=1 +# Return : `0' if arg1 exists and is not empty, `1' otherwise. +# +is_not_empty() +{ + func_check is_not_empty '=' 1 "$@"; + if is_empty "$1" + then + eval "${return_no}"; + fi; + eval "${return_yes}"; +} + + +######################################################################## +# is_not_equal ( ) +# +# Test whether `string1' differs from `string2'. +# +# Arguments : 2 +# +is_not_equal() +{ + func_check is_not_equal '=' 2 "$@"; + if is_equal "$1" "$2" + then + eval "${return_no}"; + fi + eval "${return_yes}"; +} + + +######################################################################## +# is_not_file () +# +# Test whether `name' is a not readable file. +# +# Arguments : 1 (empty allowed) +# +is_not_file() +{ + func_check is_not_file '=' 1 "$@"; + if is_file "$1" + then + eval "${return_no}"; + fi; + eval "${return_yes}"; +} + + +######################################################################## +# is_not_prog ([ [*]]) +# +# Verify that arg is a not program in $PATH. +# +# Arguments : >=0 (empty allowed) +# more args are ignored, this allows to specify progs with arguments +# +is_not_prog() +{ + func_check is_not_prog '>=' 0 "$@"; + case "$#" in + 0) + eval "${return_yes}"; + ;; + *) + if where_is "$1" >${_NULL_DEV} + then + eval "${return_no}"; + fi; + ;; + esac + eval "${return_yes}"; +} + + +######################################################################## +# is_not_writable () +# +# Test whether `name' is a not a writable file or directory. +# +# Arguments : >=1 (empty allowed), more args are ignored +# +is_not_writable() +{ + func_check is_not_writable '>=' 1 "$@"; + if is_writable "$1" + then + eval "${return_no}"; + fi; + eval "${return_yes}"; +} + + +######################################################################## +# is_not_X () +# +# Test whether not running in X Window by checking $DISPLAY +# +is_not_X() +{ + func_check is_X '=' 0 "$@"; + if obj DISPLAY is_empty + then + eval "${return_yes}"; + fi; + eval "${return_no}"; +} + + +######################################################################## +# is_not_yes () +# +# Test whether `string' is not "yes". +# +# Arguments : 1 +# +is_not_yes() +{ + func_check is_not_yes = 1 "$@"; + if is_yes "$1" + then + eval "${return_no}"; + fi; + eval "${return_yes}"; +} + + +######################################################################## +# is_prog ([ [*]]) +# +# Determine whether is a program in $PATH +# +# Arguments : >=0 (empty allowed) +# * are ignored, this allows to specify progs with arguments. +# +is_prog() +{ + func_check is_prog '>=' 0 "$@"; + case "$#" in + 0) + eval "${return_no}"; + ;; + *) + if where_is "$1" >${_NULL_DEV} + then + eval "${return_yes}"; + fi; + ;; + esac + eval "${return_no}"; +} + + +######################################################################## +# is_writable () +# +# Test whether `name' is a writable file or directory. +# +# Arguments : >=1 (empty allowed), more args are ignored +# +is_writable() +{ + func_check is_writable '>=' 1 "$@"; + if test _"$1"_ = __ + then + eval "${return_no}"; + fi; + if test -r "$1" + then + if test -w "$1" + then + eval "${return_yes}"; + fi; + fi; + eval "${return_no}"; +} + + +######################################################################## +# is_X () +# +# Test whether running in X Window by checking $DISPLAY +# +is_X() +{ + func_check is_X '=' 0 "$@"; + if obj DISPLAY is_not_empty + then + eval "${return_yes}"; + fi; + eval "${return_no}"; +} + + +######################################################################## +# is_yes () +# +# Test whether `string' has value "yes". +# +# Return : `0' if arg1 is `yes', `1' otherwise. +# +is_yes() +{ + func_check is_yes '=' 1 "$@"; + if is_equal "$1" 'yes' + then + eval "${return_yes}"; + fi; + eval "${return_no}"; +} + + +######################################################################## +# landmark () +# +# Print debugging information on standard error if $_DEBUG_LM is `yes'. +# +# Globals: $_DEBUG_LM +# +# Defined in section `Debugging functions'. + + +######################################################################## +# leave ([]) +# +# Clean exit without an error or with . +# +leave() +{ + clean_up; + if test $# = 0 + then + exit "${_OK}"; + else + exit "$1"; + fi; +} + + +######################################################################## +landmark '6: list_*()'; +######################################################################## +# +# `list' is an object class that represents an array or list. Its +# data consists of space-separated single-quoted elements. So a list +# has the form "'first' 'second' '...' 'last'". See list_append() for +# more details on the list structure. The array elements of `list' +# can be get by `eval set x "$list"; shift`. + + +######################################################################## +# list_append ( ...) +# +# Arguments: >=2 +# : a variable name for a list of single-quoted elements +# : some sequence of characters. +# Output: none, but $ is set to +# if is empty: "'' '...'" +# otherwise: "$list '' ..." +# +# Variable prefix: la +# +list_append() +{ + func_check list_append '>=' 2 "$@"; + la_name="$1"; + eval la_list='"${'$1'}"'; + shift; + for s + do + la_s="$s"; + case "${la_s}" in + *\'*) + # escape each single quote by replacing each + # "'" (squote) by "'\''" (squote bslash squote squote); + # note that the backslash must be doubled in the following `sed' + la_element="$(echo1 "${la_s}" | sed -e 's/'"${_SQ}"'/&\\&&/g')"; + exit_test; + ;; + '') + la_element=""; + ;; + *) + la_element="${la_s}"; + ;; + esac; + if obj la_list is_empty + then + la_list="'${la_element}'"; + else + la_list="${la_list} '${la_element}'"; + fi; + done; + eval "${la_name}"='"${la_list}"'; + eval ${_UNSET} la_element; + eval ${_UNSET} la_list; + eval ${_UNSET} la_name; + eval ${_UNSET} la_s; + eval "${return_ok}"; +} + + +######################################################################## +# list_from_cmdline ( [...]) +# +# Transform command line arguments into a normalized form. +# +# Options, option arguments, and file parameters are identified and +# output each as a single-quoted argument of its own. Options and +# file parameters are separated by a '--' argument. +# +# Arguments: >=1 +# : common part of a set of 4 environment variable names: +# $_SHORT_NA: list of short options without an arg. +# $_SHORT_ARG: list of short options that have an arg. +# $_LONG_NA: list of long options without an arg. +# $_LONG_ARG: list of long options that have an arg. +# ...: the arguments from a command line, such as "$@", +# the content of a variable, or direct arguments. +# +# Output: ['-[-]opt' ['optarg']]... '--' ['filename']... +# +# Example: +# list_from_cmdline PRE 'a b' 'c' '' 'long' -a f1 -bcarg --long=larg f2 +# If $PRE_SHORT_NA, $PRE_SHORT_ARG, $PRE_LONG_NA, and $PRE_LONG_ARG are +# none-empty option lists, this will result in printing: +# '-a' '-b' '-c' 'arg' '--long' 'larg' '--' 'f1' 'f2' +# +# Use this function in the following way: +# eval set x "$(args_norm PRE_NAME "$@")"; +# shift; +# while test "$1" != '--'; do +# case "$1" in +# ... +# esac; +# shift; +# done; +# shift; #skip '--' +# # all positional parameters ("$@") left are file name parameters. +# +# Variable prefix: lfc +# +list_from_cmdline() +{ + func_check list_from_cmdline '>=' 1 "$@"; + lfc_short_n="$(obj_data "$1"_SHORT_NA)"; # short options, no argument + lfc_short_a="$(obj_data "$1"_SHORT_ARG)"; # short options, with argument + lfc_long_n="$(obj_data "$1"_LONG_NA)"; # long options, no argument + lfc_long_a="$(obj_data "$1"_LONG_ARG)"; # long options, with argument + exit_test; + if obj lfc_short_n is_empty + then + error 'list_from_cmdline(): no $'"$1"'_SHORT_NA options.'; + fi; + if obj lfc_short_a is_empty + then + error 'list_from_cmdline(): no $'"$1"'_SHORT_ARG options.'; + fi; + if obj lfc_long_n is_empty + then + error 'list_from_cmdline(): no $'"$1"'_LONG_NA options.'; + fi; + if obj lfc_long_a is_empty + then + error 'list_from_cmdline(): no $'"$1"'_LONG_ARG options.'; + fi; + + shift; + if is_equal "$#" 0 + then + echo1 -- + eval ${_UNSET} lfc_fparams; + eval ${_UNSET} lfc_short_a; + eval ${_UNSET} lfc_short_n; + eval ${_UNSET} lfc_long_a; + eval ${_UNSET} lfc_long_n; + eval ${_UNSET} lfc_result; + eval "${return_ok}"; + fi; + + lfc_fparams=''; + lfc_result=''; + while test "$#" -ge 1 + do + lfc_arg="$1"; + shift; + case "${lfc_arg}" in + --) break; ;; + --*=*) + # delete leading '--'; + lfc_abbrev="$(echo1 "${lfc_arg}" | sed -e 's/^--//')"; + lfc_with_equal="${lfc_abbrev}"; + # extract option by deleting from the first '=' to the end + lfc_abbrev="$(echo1 "${lfc_with_equal}" | \ + sed -e 's/^\([^=]*\)=.*$/\1/')"; + lfc_opt="$(list_single_from_abbrev lfc_long_a "${lfc_abbrev}")"; + exit_test; + if obj lfc_opt is_empty + then + error_user "--${lfc_abbrev} is not an option."; + else + # get the option argument by deleting up to first `=' + lfc_optarg="$(echo1 "${lfc_with_equal}" | sed -e 's/^[^=]*=//')"; + exit_test; + list_append lfc_result "--${lfc_opt}" "${lfc_optarg}"; + continue; + fi; + ;; + --*) + # delete leading '--'; + lfc_abbrev="$(echo1 "${lfc_arg}" | sed -e 's/^--//')"; + if list_has lfc_long_n "${lfc_abbrev}" + then + lfc_opt="${lfc_abbrev}"; + else + exit_test; + lfc_opt="$(list_single_from_abbrev lfc_long_n "${lfc_abbrev}")"; + exit_test; + if obj lfc_opt is_not_empty && is_not_equal "$#" 0 + then + a="$(list_single_from_abbrev lfc_long_a "${lfc_abbrev}")"; + exit_test; + if obj a is_not_empty + then + error_user "The abbreviation ${lfc_arg} \ +has multiple options: --${lfc_opt} and --${a}."; + fi; + fi; + fi; + if obj lfc_opt is_not_empty + then + # long option, no argument + list_append lfc_result "--${lfc_opt}"; + continue; + fi; + lfc_opt="$(list_single_from_abbrev lfc_long_a "${lfc_abbrev}")"; + exit_test; + if obj lfc_opt is_not_empty + then + # long option with argument + if test "$#" -le 0 + then + error_user "no argument for option --${lfc_opt}." + fi; + list_append lfc_result "--${lfc_opt}" "$1"; + shift; + continue; + fi; + error_user "${lfc_arg} is not an option."; + ;; + -?*) # short option (cluster) + # delete leading `-'; + lfc_rest="$(echo1 "${lfc_arg}" | sed -e 's/^-//')"; + exit_test; + while obj lfc_rest is_not_empty + do + # get next short option from cluster (first char of $lfc_rest) + lfc_optchar="$(echo1 "${lfc_rest}" | sed -e 's/^\(.\).*$/\1/')"; + # remove first character from ${lfc_rest}; + lfc_rest="$(echo1 "${lfc_rest}" | sed -e 's/^.//')"; + exit_test; + if list_has lfc_short_n "${lfc_optchar}" + then + list_append lfc_result "-${lfc_optchar}"; + continue; + elif list_has lfc_short_a "${lfc_optchar}" + then + if obj lfc_rest is_empty + then + if test "$#" -ge 1 + then + list_append lfc_result "-${lfc_optchar}" "$1"; + shift; + continue; + else + error_user "no argument for option -${lfc_optchar}."; + fi; + else # rest is the argument + list_append lfc_result "-${lfc_optchar}" "${lfc_rest}"; + lfc_rest=''; + continue; + fi; + else + error_user "unknown option -${lfc_optchar}."; + fi; + done; + ;; + *) + # Here, $lfc_arg is not an option, so a file parameter. + list_append lfc_fparams "${lfc_arg}"; + + # Ignore the strange POSIX option handling to end option + # parsing after the first file name argument. To reuse it, do + # a `break' here if $POSIXLY_CORRECT of `bash' is not empty. + # When `bash' is called as `sh' $POSIXLY_CORRECT is set + # automatically to `y'. + ;; + esac; + done; + list_append lfc_result '--'; + if obj lfc_fparams is_not_empty + then + lfc_result="${lfc_result} ${lfc_fparams}"; + fi; + if test "$#" -gt 0 + then + list_append lfc_result "$@"; + fi; + obj lfc_result echo1; + eval ${_UNSET} lfc_abbrev; + eval ${_UNSET} lfc_fparams; + eval ${_UNSET} lfc_short_a; + eval ${_UNSET} lfc_short_n; + eval ${_UNSET} lfc_long_a; + eval ${_UNSET} lfc_long_n; + eval ${_UNSET} lfc_result; + eval ${_UNSET} lfc_arg; + eval ${_UNSET} lfc_opt; + eval ${_UNSET} lfc_opt_arg; + eval ${_UNSET} lfc_opt_char; + eval ${_UNSET} lfc_with_equal; + eval ${_UNSET} lfc_rest; + eval "${return_ok}"; +} # list_from_cmdline() + + +######################################################################## +# list_from_split ( ) +# +# In , escape all white space characters and replace each +# by space. +# +# Arguments: 2: a that is to be split into parts divided by +# +# Output: the resulting list string +# +# Variable prefix: lfs +# +list_from_split() +{ + func_check list_from_split = 2 "$@"; + + # precede each space or tab by a backslash `\' (doubled for `sed') + lfs_s="$(echo1 "$1" | sed -e 's/\('"${_SPACE_SED}"'\)/\\\1/g')"; + exit_test; + + # replace split character of string by the list separator ` ' (space). + case "$2" in + /) # cannot use normal `sed' separator + echo1 "${lfs_s}" | sed -e 's|'"$2"'| |g'; + ;; + ?) # use normal `sed' separator + echo1 "${lfs_s}" | sed -e 's/'"$2"'/ /g'; + ;; + ??*) + error 'list_from_split(): separator must be a single character.'; + ;; + esac; + eval ${_UNSET} lfs_s; + eval "${return_ok}"; +} + + +######################################################################## +# list_get () +# +# Check whether is a space-separated list of '-quoted elements. +# +# If the test fails an error is raised. +# If the test succeeds the argument is echoed. +# +# Testing criteria: +# A list has the form "'first' 'second' '...' 'last'". So it has a +# leading and a final quote and the elements are separated by "' '" +# constructs. If these are all removed there should not be any +# unescaped single-quotes left. Watch out for escaped single +# quotes; they have the form '\'' (sq bs sq sq). + +# Arguments: 1 +# Output: the argument unchanged, if the check succeeded. +# +# Variable prefix: lg +# +list_get() +{ + func_check list_get = 1 "$@"; + eval lg_list='"${'$1'}"'; + # remove leading and final space characters + lg_list="$(echo1 "${lg_list}" | sed -e ' +s/^'"${_SPACE_SED}"'*// +s/'"${_SPACE_SED}"'*$// +')"; + exit_test; + case "${lg_list}" in + '') + eval ${_UNSET} lg_list; + eval "${return_ok}"; + ;; + \'*\') + obj lg_list echo1; + eval ${_UNSET} lg_list; + eval "${return_ok}"; + ;; + *) + error "list_get(): bad list: $1" + ;; + esac; + eval ${_UNSET} lg_list; + eval "${return_ok}"; +} + + +######################################################################## +# list_has ( ) +# +# Test whether the list has the element . +# +# Arguments: 2 +# : a variable name for a list of single-quoted elements +# : some sequence of characters. +# +# Variable prefix: lh +# +list_has() +{ + func_check list_has = 2 "$@"; + eval lh_list='"${'$1'}"'; + if obj lh_list is_empty + then + eval "${_UNSET}" lh_list; + eval "${return_no}"; + fi; + case "$2" in + \'*\') lh_element=" $2 "; ;; + *) lh_element=" '$2' "; ;; + esac; + if string_contains " ${lh_list} " "${lh_element}" + then + eval "${_UNSET}" lh_list; + eval "${_UNSET}" lh_element; + eval "${return_yes}"; + else + eval "${_UNSET}" lh_list; + eval "${_UNSET}" lh_element; + eval "${return_no}"; + fi; +} + + +######################################################################## +# list_has_abbrev ( ) +# +# Test whether the list has an element starting with . +# +# Arguments: 2 +# : a variable name for a list of single-quoted elements +# : some sequence of characters. +# +# Variable prefix: lha +# +list_has_abbrev() +{ + func_check list_has_abbrev = 2 "$@"; + eval lha_list='"${'$1'}"'; + if obj lha_list is_empty + then + eval "${_UNSET}" lha_list; + eval "${return_no}"; + fi; + case "$2" in + \'*) + lha_element="$(echo1 "$2" | sed -e 's/'"${_SQ}"'$//')"; + exit_test; + ;; + *) lha_element="'$2"; ;; + esac; + if string_contains " ${lha_list}" " ${lha_element}" + then + eval "${_UNSET}" lha_list; + eval "${_UNSET}" lha_element; + eval "${return_yes}"; + else + eval "${_UNSET}" lha_list; + eval "${_UNSET}" lha_element; + eval "${return_no}"; + fi; + eval "${return_ok}"; +} + + +######################################################################## +# list_has_not ( ) +# +# Test whether has no . +# +# Arguments: 2 +# : a space-separated list of single-quoted elements. +# : some sequence of characters. +# +# Variable prefix: lhn +# +list_has_not() +{ + func_check list_has_not = 2 "$@"; + eval lhn_list='"${'$1'}"'; + if obj lhn_list is_empty + then + eval "${_UNSET}" lhn_list; + eval "${return_yes}"; + fi; + case "$2" in + \'*\') lhn_element=" $2 "; ;; + *) lhn_element=" '$2' "; ;; + esac; + if string_contains " ${lhn_list} " "${lhn_element}" + then + eval "${_UNSET}" lhn_list; + eval "${_UNSET}" lhn_element; + eval "${return_no}"; + else + eval "${_UNSET}" lhn_list; + eval "${_UNSET}" lhn_element; + eval "${return_yes}"; + fi; +} + + +######################################################################## +# list_single_from_abbrev ( ) +# +# Check whether the list has an element starting with . If +# there are more than a single element an error is created. +# +# Arguments: 2 +# : a variable name for a list of single-quoted elements +# : some sequence of characters. +# +# Output: the found element. +# +# Variable prefix: lsfa +# +list_single_from_abbrev() +{ + func_check list_single_from_abbrev = 2 "$@"; + eval lsfa_list='"${'$1'}"'; + if obj lsfa_list is_empty + then + eval "${_UNSET}" lsfa_list; + eval "${return_no}"; + fi; + lsfa_abbrev="$2"; + if list_has lsfa_list "${lsfa_abbrev}" + then + obj lsfa_abbrev echo1; + eval "${_UNSET}" lsfa_abbrev; + eval "${_UNSET}" lsfa_list; + eval "${return_yes}"; + fi; + if list_has_abbrev lsfa_list "${lsfa_abbrev}" + then + lsfa_element=''; + eval set x "${lsfa_list}"; + shift; + for i + do + case "$i" in + ${lsfa_abbrev}*) + if obj lsfa_element is_not_empty + then + error_user "The abbreviation --${lsfa_abbrev} \ +has multiple options: --${lsfa_element} and --${i}."; + fi; + lsfa_element="$i"; + ;; + esac; + done; + obj lsfa_element echo1; + eval "${_UNSET}" lsfa_abbrev; + eval "${_UNSET}" lsfa_element; + eval "${_UNSET}" lsfa_list; + eval "${return_yes}"; + else + eval "${_UNSET}" lsfa_abbrev; + eval "${_UNSET}" lsfa_element; + eval "${_UNSET}" lsfa_list; + eval "${return_no}"; + fi; +} + + +######################################################################## +landmark '7: man_*()'; +######################################################################## + +######################################################################## +# man_do_filespec () +# +# Print suitable man page(s) for filespec to $_TMP_CAT. +# +# Arguments : 2 +# : argument of the form `man:name.section', `man:name', +# `man:name(section)', `name.section', `name'. +# +# Globals : $_OPT_ALL +# +# Output : none. +# Return : `0' if man page was found, `1' else. +# +# Only called from do_fileargs(), checks on $MANPATH and $_MAN_ENABLE +# are assumed (see man_setup()). +# +# Variable prefix: mdf +# +man_do_filespec() +{ + func_check man_do_filespec = 1 "$@"; + if obj _MAN_PATH is_empty + then + eval "${return_bad}"; + fi; + if is_empty "$1" + then + eval "${return_bad}"; + fi; + mdf_spec="$1"; + mdf_name=''; + mdf_section=''; + case "${mdf_spec}" in + */*) # not a man spec with containing '/' + eval ${_UNSET} mdf_got_one; + eval ${_UNSET} mdf_name; + eval ${_UNSET} mdf_section; + eval ${_UNSET} mdf_spec; + eval "${return_bad}"; + ;; + man:?*\(?*\)) # man:name(section) + mdf_name="$(echo1 "${mdf_spec}" \ + | sed -e 's/^man:\(..*\)(\(..*\))$/\1/')"; + mdf_section="$(echo1 "${mdf_spec}" \ + | sed -e 's/^man:\(..*\)(\(..*\))$/\2/')"; + exit_test; + ;; + man:?*.${_MAN_AUTO_SEC_CHARS}) # man:name.section + mdf_name="$(echo1 "${mdf_spec}" \ + | sed -e 's/^man:\(..*\)\..$/\1/')"; + mdf_section="$(echo1 "${mdf_spec}" \ + | sed -e 's/^.*\(.\)$/\1/')"; + exit_test; + ;; + man:?*) # man:name + mdf_name="$(echo1 "${mdf_spec}" | sed -e 's/^man://')"; + exit_test; + ;; + ?*\(?*\)) # name(section) + mdf_name="$(echo1 "${mdf_spec}" \ + | sed -e 's/^\(..*\)(\(..*\))$/\1/')"; + mdf_section="$(echo1 "${mdf_spec}" \ + | sed -e 's/^\(..*\)(\(..*\))$/\2/')"; + exit_test; + ;; + ?*.${_MAN_AUTO_SEC_CHARS}) # name.section + mdf_name="$(echo1 "${mdf_spec}" \ + | sed -e 's/^\(..*\)\..$/\1/')"; + mdf_section="$(echo1 "${mdf_spec}" \ + | sed -e 's/^.*\(.\)$/\1/')"; + exit_test; + ;; + ?*) + mdf_name="${mdf_spec}"; + ;; + esac; + if obj mdf_name is_empty + then + eval ${_UNSET} mdf_got_one; + eval ${_UNSET} mdf_name; + eval ${_UNSET} mdf_section; + eval ${_UNSET} mdf_spec; + eval "${return_bad}"; + fi; + mdf_got_one='no'; + if obj mdf_section is_empty + then + if obj _OPT_SECTIONS is_empty + then + eval set x "${_MAN_AUTO_SEC_LIST}"; + else + # use --sections when no section is given to filespec + eval set x "$(echo1 "${_OPT_SECTIONS}" | sed -e 's/:/ /g')"; + fi; + shift; + for s + do + mdf_s="$s"; + if man_search_section "${mdf_name}" "${mdf_s}" + then # found + if obj _MAN_ALL is_yes + then + mdf_got_one='yes'; + else + eval ${_UNSET} mdf_got_one; + eval ${_UNSET} mdf_name; + eval ${_UNSET} mdf_s; + eval ${_UNSET} mdf_section; + eval ${_UNSET} mdf_spec; + eval "${return_good}"; + fi; + fi; + done; + else + if man_search_section "${mdf_name}" "${mdf_section}" + then + eval ${_UNSET} mdf_got_one; + eval ${_UNSET} mdf_name; + eval ${_UNSET} mdf_s; + eval ${_UNSET} mdf_section; + eval ${_UNSET} mdf_spec; + eval "${return_good}"; + else + eval ${_UNSET} mdf_got_one; + eval ${_UNSET} mdf_name; + eval ${_UNSET} mdf_section; + eval ${_UNSET} mdf_spec; + eval "${return_bad}"; + fi; + fi; + if obj _MAN_ALL is_yes && obj mdf_got_one is_yes + then + eval ${_UNSET} mdf_got_one; + eval ${_UNSET} mdf_name; + eval ${_UNSET} mdf_s; + eval ${_UNSET} mdf_section; + eval ${_UNSET} mdf_spec; + eval "${return_good}"; + fi; + eval ${_UNSET} mdf_got_one; + eval ${_UNSET} mdf_name; + eval ${_UNSET} mdf_s; + eval ${_UNSET} mdf_section; + eval ${_UNSET} mdf_spec; + eval "${return_bad}"; +} # man_do_filespec() + + +######################################################################## +# man_register_file ( [
]) +# +# Write a found man page file and register the title element. +# +# Arguments: 1, 2, or 3; maybe empty +# Output: none +# +man_register_file() +{ + func_check man_register_file '>=' 2 "$@"; + case "$#" in + 2|3) do_nothing; ;; + *) + error "man_register_file() expects 2 or 3 arguments."; + ;; + esac; + if is_empty "$1" + then + error 'man_register_file(): file name is empty'; + fi; + to_tmp "$1"; + case "$#" in + 2) + register_title "man:$2"; + eval "${return_ok}"; + ;; + 3) + register_title "$2.$3"; + eval "${return_ok}"; + ;; + esac; + eval "${return_ok}"; +} + + +######################################################################## +# man_search_section (
) +# +# Retrieve man pages. +# +# Arguments : 2 +# Globals : $_MAN_PATH, $_MAN_EXT +# Return : 0 if found, 1 otherwise +# +# Variable prefix: mss +# +man_search_section() +{ + func_check man_search_section = 2 "$@"; + if obj _MAN_PATH is_empty + then + eval "${return_bad}"; + fi; + if is_empty "$1" + then + eval "${return_bad}"; + fi; + if is_empty "$2" + then + eval "${return_bad}"; + fi; + mss_name="$1"; + mss_section="$2"; + eval set x "$(path_split "${_MAN_PATH}")"; + exit_test; + shift; + mss_got_one='no'; + if obj _MAN_EXT is_empty + then + for d + do + mss_dir="$(dirname_append "$d" "man${mss_section}")"; + exit_test; + if obj mss_dir is_dir + then + mss_prefix="$(\ + dirname_append "${mss_dir}" "${mss_name}.${mss_section}")"; + if obj _OPT_WHATIS is_yes + then + mss_files="$(eval ls "${mss_prefix}"'*' 2>${_NULL_DEV} | + sed -e '\| found|s|.*||' + )"; + else + mss_files="$(eval ls "'${mss_prefix}'"'*' 2>${_NULL_DEV} | + sed -e '\| found|s|.*||' + )"; + fi; + exit_test; + if obj mss_files is_not_empty + then + # for f in $mss_files + for f in $(eval set x ${mss_files}; shift; echo1 "$@") + do + exit_test; + mss_f="$f"; + if obj mss_f is_file + then + if is_yes "${mss_got_one}" + then + register_file "${mss_f}"; + elif obj _MAN_ALL is_yes + then + man_register_file "${mss_f}" "${mss_name}"; + else + man_register_file "${mss_f}" "${mss_name}" "${mss_section}"; + eval ${_UNSET} mss_dir; + eval ${_UNSET} mss_ext; + eval ${_UNSET} mss_f; + eval ${_UNSET} mss_files; + eval ${_UNSET} mss_got_one; + eval ${_UNSET} mss_name; + eval ${_UNSET} mss_prefix; + eval ${_UNSET} mss_section; + eval "${return_good}"; + fi; + mss_got_one='yes'; + fi; + done; + fi; + fi; + done; + else + mss_ext="${_MAN_EXT}"; + # check for directory name having trailing extension + for d + do + mss_dir="$(dirname_append $d man${mss_section}${mss_ext})"; + exit_test; + if obj mss_dir is_dir + then + mss_prefix=\ + "$(dirname_append "${mss_dir}" "${mss_name}.${mss_section}")"; + mss_files="$( eval ls "${mss_prefix}"'*' 2>${_NULL_DEV} | + sed -e '\|not found|s|.*||' + )"; + exit_test; + if obj mss_files is_not_empty + then + # for f in $mss_files + for f in $(eval set x ${mss_files}; shift; echo1 "$@") + do + mss_f="$f"; + if obj mss_f is_file + then + if is_yes "${mss_got_one}" + then + register_file "${mss_f}"; + elif obj _MAN_ALL is_yes + then + man_register_file "${mss_f}" "${mss_name}"; + else + man_register_file "${mss_f}" "${mss_name}" "${mss_section}"; + eval ${_UNSET} mss_dir; + eval ${_UNSET} mss_ext; + eval ${_UNSET} mss_f; + eval ${_UNSET} mss_files; + eval ${_UNSET} mss_got_one; + eval ${_UNSET} mss_name; + eval ${_UNSET} mss_prefix; + eval ${_UNSET} mss_section; + eval "${return_good}"; + fi; + mss_got_one='yes'; + fi; + done; + fi; + fi; + done; + # check for files with extension in directories without extension + for d + do + mss_dir="$(dirname_append "$d" "man${mss_section}")"; + exit_test; + if obj mss_dir is_dir + then + mss_prefix="$(dirname_append "${mss_dir}" \ + "${mss_name}.${mss_section}${mss_ext}")"; + mss_files="$(eval ls "${mss_prefix}"'*' 2>${_NULL_DEV} | + sed -e '\|not found|s|.*||' + )"; + exit_test; + if obj mss_files is_not_empty + then + # for f in $mss_files + for f in $(eval set x ${mss_files}; shift; echo1 "$@") + do + mss_f="$f"; + if obj mss_f is_file + then + if is_yes "${mss_got_one}" + then + register_file "${mss_f}"; + elif obj _MAN_ALL is_yes + then + man_register_file "${mss_f}" "${mss_name}"; + else + man_register_file "${mss_f}" "${mss_name}" "${mss_section}"; + eval ${_UNSET} mss_dir; + eval ${_UNSET} mss_ext; + eval ${_UNSET} mss_f; + eval ${_UNSET} mss_files; + eval ${_UNSET} mss_got_one; + eval ${_UNSET} mss_name; + eval ${_UNSET} mss_prefix; + eval ${_UNSET} mss_section; + eval "${return_good}"; + fi; + mss_got_one='yes'; + fi; + done; + fi; + fi; + done; + fi; + if obj _MAN_ALL is_yes && is_yes "${mss_got_one}" + then + eval ${_UNSET} mss_dir; + eval ${_UNSET} mss_ext; + eval ${_UNSET} mss_f; + eval ${_UNSET} mss_files; + eval ${_UNSET} mss_got_one; + eval ${_UNSET} mss_name; + eval ${_UNSET} mss_prefix; + eval ${_UNSET} mss_section; + eval "${return_good}"; + fi; + eval ${_UNSET} mss_dir; + eval ${_UNSET} mss_ext; + eval ${_UNSET} mss_f; + eval ${_UNSET} mss_files; + eval ${_UNSET} mss_got_one; + eval ${_UNSET} mss_name; + eval ${_UNSET} mss_prefix; + eval ${_UNSET} mss_section; + eval "${return_bad}"; +} # man_search_section() + + +######################################################################## +# man_setup () +# +# Setup the variables $_MAN_* needed for man page searching. +# +# Globals: +# in: $_OPT_*, $_MANOPT_*, $LANG, $LC_MESSAGES, $LC_ALL, +# $MANPATH, $MANROFFSEQ, $MANSEC, $PAGER, $SYSTEM, $MANOPT. +# out: $_MAN_PATH, $_MAN_LANG, $_MAN_SYS, $_MAN_LANG, $_MAN_LANG2, +# $_MAN_SEC, $_MAN_ALL +# in/out: $_MAN_ENABLE +# +# The precedence for the variables related to `man' is that of GNU +# `man', i.e. +# +# $LANG; overridden by +# $LC_MESSAGES; overridden by +# $LC_ALL; this has the same precedence as +# $MANPATH, $MANROFFSEQ, $MANSEC, $PAGER, $SYSTEM; overridden by +# $MANOPT; overridden by +# the groffer command line options. +# +# Variable prefix: ms +# +man_setup() +{ + func_check main_man_setup = 0 "$@"; + + if obj _MAN_IS_SETUP is_yes + then + eval "${return_ok}"; + fi; + _MAN_IS_SETUP='yes'; + + if obj _MAN_ENABLE is_not_yes + then + eval "${return_ok}"; + fi; + + # determine basic path for man pages + _MAN_PATH="$(get_first_essential \ + "${_OPT_MANPATH}" "${_MANOPT_PATH}" "${MANPATH}")"; + exit_test; + if obj _MAN_PATH is_empty + then + manpath_set_from_path; + else + _MAN_PATH="$(path_clean "${_MAN_PATH}")"; + exit_test; + fi; + if obj _MAN_PATH is_empty + then + if is_prog 'manpath' + then + _MAN_PATH="$(manpath 2>${_NULL_DEV})"; # not always available + exit_test; + fi; + fi; + if obj _MAN_PATH is_empty + then + _MAN_ENABLE="no"; + eval "${return_ok}"; + fi; + + _MAN_ALL="$(get_first_essential "${_OPT_ALL}" "${_MANOPT_ALL}")"; + exit_test; + if obj _MAN_ALL is_empty + then + _MAN_ALL='no'; + fi; + + _MAN_SYS="$(get_first_essential \ + "${_OPT_SYSTEMS}" "${_MANOPT_SYS}" "${SYSTEM}")"; + ms_lang="$(get_first_essential \ + "${_OPT_LANG}" "${LC_ALL}" "${LC_MESSAGES}" "${LANG}")"; + exit_test; + case "${ms_lang}" in + C|POSIX) + _MAN_LANG=""; + _MAN_LANG2=""; + ;; + ?) + _MAN_LANG="${ms_lang}"; + _MAN_LANG2=""; + ;; + *) + _MAN_LANG="${ms_lang}"; + # get first two characters of $ms_lang + _MAN_LANG2="$(echo1 "${ms_lang}" | sed -e 's/^\(..\).*$/\1/')"; + exit_test; + ;; + esac; + # from now on, use only $_LANG, forget about $_OPT_LANG, $LC_*. + + manpath_add_lang_sys; # this is very slow + + _MAN_SEC="$(get_first_essential \ + "${_OPT_SECT}" "${_MANOPT_SEC}" "${MANSEC}")"; + exit_test; + if obj _MAN_PATH is_empty + then + _MAN_ENABLE="no"; + eval ${_UNSET} ms_lang; + eval "${return_ok}"; + fi; + + _MAN_EXT="$(get_first_essential \ + "${_OPT_EXTENSION}" "${_MANOPT_EXTENSION}")"; + exit_test; + eval ${_UNSET} ms_lang; + eval "${return_ok}"; +} # man_setup() + + +######################################################################## +landmark '8: manpath_*()'; +######################################################################## + +######################################################################## +# manpath_add_lang_sys () +# +# Add language and operating system specific directories to man path. +# +# Arguments : 0 +# Output : none +# Globals: +# in: $_MAN_SYS: has the form `os1,os2,...', a comma separated +# list of names of operating systems. +# $_MAN_LANG and $_MAN_LANG2: each a single name +# in/out: $_MAN_PATH: has the form `dir1:dir2:...', a colon +# separated list of directories. +# +# Variable prefix: mals +# +manpath_add_lang_sys() +{ + func_check manpath_add_lang_sys = 0 "$@"; + if obj _MAN_PATH is_empty + then + eval "${return_ok}"; + fi; + # twice test both sys and lang + eval set x "$(path_split "${_MAN_PATH}")"; + shift; + exit_test; + mals_mp=''; + for p + do # loop on man path directories + mals_mp="$(_manpath_add_lang_sys_single "${mals_mp}" "$p")"; + exit_test; + done; + eval set x "$(path_split "${mals_mp}")"; + shift; + exit_test; + for p + do # loop on man path directories + mals_mp="$(_manpath_add_lang_sys_single "${mals_mp}" "$p")"; + exit_test; + done; + _MAN_PATH="$(path_chop "${mals_mp}")"; + exit_test; + eval ${_UNSET} mals_mp; + eval "${return_ok}"; +} + + +# To the directory in $1 append existing sys/lang subdirectories +# Function is necessary to split the OS list. +# +# globals: in: $_MAN_SYS, $_MAN_LANG, $_MAN_LANG2 +# argument: 2: `man_path' and `dir' +# output: colon-separated path of the retrieved subdirectories +# +# Variable prefix: _mals +# +_manpath_add_lang_sys_single() +{ + func_check _manpath_add_lang_sys_single = 2 "$@"; + _mals_res="$1"; + _mals_parent="$2"; + eval set x "$(list_from_split "${_MAN_SYS}" ',')"; + shift; + exit_test; + for d in "$@" "${_MAN_LANG}" "${_MAN_LANG2}" + do + _mals_dir="$(dirname_append "${_mals_parent}" "$d")"; + exit_test; + if obj _mals_res path_not_contains "${_mals_dir}" && \ + obj _mals_dir is_dir + then + _mals_res="${_mals_res}:${_mals_dir}"; + fi; + done; + if path_not_contains "${_mals_res}" "${_mals_parent}" + then + _mals_res="${_mals_res}:${_mals_parent}"; + fi; + path_chop "${_mals_res}"; + eval ${_UNSET} _mals_dir; + eval ${_UNSET} _mals_parent; + eval ${_UNSET} _mals_res; + eval "${return_ok}"; +} + +# end manpath_add_lang_sys () + + +######################################################################## +# manpath_set_from_path () +# +# Determine basic search path for man pages from $PATH. +# +# Return: `0' if a valid man path was retrieved. +# Output: none +# Globals: +# in: $PATH +# out: $_MAN_PATH +# +# Variable prefix: msfp +# +manpath_set_from_path() +{ + func_check manpath_set_from_path = 0 "$@"; + + msfp_manpath=''; + + # get a basic man path from $PATH + if obj PATH is_not_empty + then + eval set x "$(path_split "${PATH}")"; + shift; + exit_test; + for d + do + # delete the final `/bin' part + msfp_base="$(echo1 "$d" | sed -e 's|//*bin/*$||')"; + exit_test; + for e in /share/man /man + do + msfp_mandir="${msfp_base}$e"; + if test -d "${msfp_mandir}" && test -r "${msfp_mandir}" + then + msfp_manpath="${msfp_manpath}:${msfp_mandir}"; + fi; + done; + done; + fi; + + # append some default directories + for d in /usr/local/share/man /usr/local/man \ + /usr/share/man /usr/man \ + /usr/X11R6/man /usr/openwin/man \ + /opt/share/man /opt/man \ + /opt/gnome/man /opt/kde/man + do + msfp_d="$d"; + if obj msfp_manpath path_not_contains "${msfp_d}" && obj mfsp_d is_dir + then + msfp_manpath="${msfp_manpath}:${mfsp_d}"; + fi; + done; + + _MAN_PATH="${msfp_manpath}"; + eval ${_UNSET} msfp_base; + eval ${_UNSET} msfp_d; + eval ${_UNSET} msfp_mandir; + eval ${_UNSET} msfp_manpath; + eval "${return_ok}"; +} # manpath_set_from_path() + + +######################################################################## +landmark '9: obj_*()'; +######################################################################## + +######################################################################## +# obj ( ...) +# +# This works like a method (object function) call for an object. +# Run " $ ...". +# +# The first argument represents an object whose data is given as first +# argument to (). +# +# Argument: >=2 +# : variable name +# : a program or function name +# +# Variable prefix: o +# +obj() +{ + func_check obj '>=' 2 "$@"; + eval o_arg1='"${'$1'}"'; + if is_empty "$2" + then + error "obj(): function name is empty." + else + o_func="$2"; + fi; + shift; + shift; + eval "${o_func}"' "${o_arg1}" "$@"'; + n="$?"; + eval ${_UNSET} o_arg1; + eval ${_UNSET} o_func; + eval "${return_var} $n"; +} # obj() + + +######################################################################## +# obj_data () +# +# Print the data of , i.e. the content of $. +# For possible later extensions. +# +# Arguments: 1 +# : a variable name +# Output: the data of +# +# Variable prefix: od +# +obj_data() +{ + func_check obj '=' 1 "$@"; + if is_empty "$1" + then + error "obj_data(): object name is empty." + fi; + eval od_res='"${'$1'}"'; + obj od_res echo1; + eval ${_UNSET} od_res; + eval "${return_ok}"; +} + + +######################################################################## +# obj_from_output ( ...) +# +# Run '$="$( ...)"' to set the result of a +# function call to a global variable. +# +# Arguments: >=2 +# : a variable name +# : the name of a function or program +# : optional argument to +# Output: none +# +# Variable prefix: ofo +# +obj_from_output() +{ + func_check obj_from_output '>=' 2 "$@"; + if is_empty "$1" + then + error "res(): variable name is empty."; + elif is_empty "$2" + then + error "res(): function name is empty." + else + ofo_result_name="$1"; + fi; + shift; + eval "${ofo_result_name}"'="$('"$@"')"'; + exit_test; + eval "${return_ok}"; +} + + +######################################################################## +# obj_set ( ) +# +# Set the data of , i.e. call "$=". +# +# Arguments: 2 +# : a variable name +# : a string +# Output:: none +# +obj_set() +{ + func_check obj_set '=' 2 "$@"; + if is_empty "$1" + then + error "obj_set(): object name is empty." + fi; + eval "$1"='"$2"'; + eval "${return_ok}"; +} + + +######################################################################## +# path_chop () +# +# Remove unnecessary colons from path. +# +# Argument: 1, a colon separated path. +# Output: path without leading, double, or trailing colons. +# +path_chop() +{ + func_check path_chop = 1 "$@"; + + # replace multiple colons by a single colon `:' + # remove leading and trailing colons + echo1 "$1" | sed -e ' +s/^:*// +s/:::*/:/g +s/:*$// +'; + eval "${return_ok}"; +} + + +######################################################################## +# path_clean () +# +# Remove non-existing directories from a colon-separated list. +# +# Argument: 1, a colon separated path. +# Output: colon-separated list of existing directories. +# +# Variable prefix: pc +# +path_clean() +{ + func_check path_clean = 1 "$@"; + if is_not_equal "$#" 1 + then + error 'path_clean() needs 1 argument.'; + fi; + pc_arg="$1"; + eval set x "$(path_split "${pc_arg}")"; + exit_test; + shift; + pc_res=""; + for i + do + pc_i="$i"; + if obj pc_i is_not_empty \ + && obj pc_res path_not_contains "${pc_i}" \ + && obj pc_i is_dir + then + case "${pc_i}" in + ?*/) + pc_res="${pc_res}$(dirname_chop "${pc_i}")"; + exit_test; + ;; + *) + pc_res="${pc_res}:${pc_i}"; + exit_test; + ;; + esac; + fi; + done; + eval ${_UNSET} pc_arg; + eval ${_UNSET} pc_i; + eval ${_UNSET} pc_res; + if path_chop "${pc_res}" + then + eval "${return_ok}"; + else + eval "${return_bad}"; + fi; +} + + +######################################################################## +# path_contains ( ) +#- +# Test whether `dir' is contained in `path', a list separated by `:'. +# +# Arguments : 2 arguments. +# Return : `0' if arg2 is substring of arg1, `1' otherwise. +# +path_contains() +{ + func_check path_contains = 2 "$@"; + case ":$1:" in + *":$2:"*) + eval "${return_yes}"; + ;; + *) + eval "${return_no}"; + ;; + esac; + eval "${return_ok}"; +} + + +######################################################################## +# path_not_contains ( ) +# +# Test whether `dir' is not contained in colon separated `path'. +# +# Arguments : 2 arguments. +# +path_not_contains() +{ + func_check path_not_contains = 2 "$@"; + if path_contains "$1" "$2" + then + eval "${return_no}"; + else + eval "${return_yes}"; + fi; + eval "${return_ok}"; +} + + +######################################################################## +# path_split () +# +# In `path' escape white space and replace each colon by a space. +# +# Arguments: 1: a colon-separated path +# Output: the resulting list, process with `eval set' +# +path_split() +{ + func_check path_split = 1 "$@"; + list_from_split "$1" ':'; + eval "${return_ok}"; +} + + +######################################################################## +landmark '10: register_*()'; +######################################################################## + +######################################################################## +# register_file () +# +# Write a found file and register the title element. +# +# Arguments: 1: a file name +# Output: none +# +register_file() +{ + func_check register_file = 1 "$@"; + if is_empty "$1" + then + error 'register_file(): file name is empty'; + fi; + if is_equal "$1" '-' + then + to_tmp "${_TMP_STDIN}"; + register_title 'stdin'; + else + to_tmp "$1"; + register_title "$(base_name "$1")"; + exit_test; + fi; + eval "${return_ok}"; +} # register_file() + + +######################################################################## +# register_title () +# +# Create title element from and append to $_REGISTERED_TITLE +# +# Globals: $_REGISTERED_TITLE (rw) +# +# Variable prefix: rt +# +register_title() +{ + func_check register_title '=' 1 "$@"; + if is_empty "$1" + then + eval "${return_ok}"; + fi; + + case "${_REGISTERED_TITLE}" in + *\ *\ *\ *) + eval "${return_ok}"; + ;; + esac; + + # remove directory part + rt_title="$(base_name "$1")"; + # replace space characters by `_' + rt_title="$(echo1 "${rt_title}" | sed -e 's/[ ]/_/g')"; + # remove extension `.bz2' + rt_title="$(echo1 "${rt_title}" | sed -e 's/\.bz2$//')"; + # remove extension `.gz' + rt_title="$(echo1 "${rt_title}" | sed -e 's/\.gz$//')"; + # remove extension `.Z' + rt_title="$(echo1 "${rt_title}" | sed -e 's/\.Z$//')"; + exit_test; + + if obj rt_title is_empty + then + eval ${_UNSET} rt_title; + eval "${return_ok}"; + fi; + if obj _REGISTERED_TITLE is_empty + then + _REGISTERED_TITLE="${rt_title}"; + else + _REGISTERED_TITLE="${_REGISTERED_TITLE} ${rt_title}"; + fi; + eval ${_UNSET} rt_title; + eval "${return_ok}"; +} # register_title() + + +######################################################################## +# reset () +# +# Reset the variables that can be affected by options to their default. +# +# +# Defined in section `Preset' after the rudimentary shell tests. + + +######################################################################## +# rm_file () +# +# Remove file if $_DEBUG_KEEP_FILES allows it. +# +# Globals: $_DEBUG_KEEP_FILES +# +rm_file() +{ + func_check rm_file '=' 1 "$@"; + if is_file "$1" + then + rm -f "$1" >${_NULL_DEV} 2>&1; + fi; + if is_existing "$1" + then + eval "${return_bad}"; + else + eval "${return_good}"; + fi; +} + + +######################################################################## +# rm_file_with_debug () +# +# Remove file if $_DEBUG_KEEP_FILES allows it. +# +# Globals: $_DEBUG_KEEP_FILES +# +rm_file_with_debug() +{ + func_check rm_file_with_debug '=' 1 "$@"; + if obj _DEBUG_KEEP_FILES is_not_yes + then + if is_file "$1" + then + rm -f "$1" >${_NULL_DEV} 2>&1; + fi; + fi; + if is_existing "$1" + then + eval "${return_bad}"; + else + eval "${return_good}"; + fi; +} + + +######################################################################## +# rm_tree () +# +# Remove file if $_DEBUG_KEEP_FILES allows it. +# +# Globals: $_DEBUG_KEEP_FILES +# +rm_tree() +{ + func_check rm_tree '=' 1 "$@"; + if is_existing "$1" + then + rm -f -r "$1" >${_NULL_DEV} 2>&1; + fi; + if is_existing "$1" + then + eval "${return_bad}"; + else + eval "${return_good}"; + fi; +} + + +######################################################################## +# save_stdin () +# +# Store standard input to temporary file (with decompression). +# +# Variable prefix: ss +# +if obj _HAS_COMPRESSION is_yes +then + save_stdin() + { + func_check save_stdin '=' 0 "$@"; + ss_f="${_TMP_DIR}"/INPUT; + cat >"${ss_f}"; + cat_z "${ss_f}" >"${_TMP_STDIN}"; + rm_file "${ss_f}"; + eval ${_UNSET} ss_f; + eval "${return_ok}"; + } +else + save_stdin() + { + func_check save_stdin = 0 "$@"; + cat >"${_TMP_STDIN}"; + eval "${return_ok}"; + } +fi; + + +######################################################################## +# special_filespec () +# +# Handle special modes like whatis and apropos. +# +special_filespec() +{ + func_check special_setup '=' 0 "$@"; + if obj _OPT_APROPOS is_yes + then + if obj _OPT_WHATIS is_yes + then + error \ + 'special_setup: $_OPT_APROPOS and $_OPT_WHATIS are both "yes"'; + fi; + apropos_filespec; + eval "${return_ok}"; + fi; + if obj _OPT_WHATIS is_yes + then + whatis_filespec; + fi; + eval "${return_ok}"; +} + + +######################################################################## +# special_setup () +# +# Handle special modes like whatis and apropos. +# +special_setup() +{ + func_check special_setup '=' 0 "$@"; + if obj _OPT_APROPOS is_yes + then + if obj _OPT_WHATIS is_yes + then + error \ + 'special_setup: $_OPT_APROPOS and $_OPT_WHATIS are both "yes"'; + fi; + apropos_setup; + eval "${return_ok}"; + fi; + if obj _OPT_WHATIS is_yes + then + whatis_header; + fi; + eval "${return_ok}"; +} + + +######################################################################## +landmark '11: stack_*()'; +######################################################################## + +######################################################################## +# string_contains ( ) +# +# Test whether `part' is contained in `string'. +# +# Arguments : 2 text arguments. +# Return : `0' if arg2 is substring of arg1, `1' otherwise. +# +string_contains() +{ + func_check string_contains '=' 2 "$@"; + case "$1" in + *"$2"*) + eval "${return_yes}"; + ;; + *) + eval "${return_no}"; + ;; + esac; + eval "${return_ok}"; +} + + +######################################################################## +# string_not_contains ( ) +# +# Test whether `part' is not substring of `string'. +# +# Arguments : 2 text arguments. +# Return : `0' if arg2 is substring of arg1, `1' otherwise. +# +string_not_contains() +{ + func_check string_not_contains '=' 2 "$@"; + if string_contains "$1" "$2" + then + eval "${return_no}"; + else + eval "${return_yes}"; + fi; + eval "${return_ok}"; +} + + +######################################################################## +landmark '12: tmp_*()'; +######################################################################## + +######################################################################## +# tmp_cat () +# +# output the temporary cat file (the concatenation of all input) +# +tmp_cat() +{ + func_check tmp_cat '=' 0 "$@"; + cat "${_TMP_CAT}"; + eval "${return_var}" "$?"; +} + + +######################################################################## +# tmp_create (?) +# +# Create temporary file. +# +# It's safe to use the shell process ID together with a suffix to +# have multiple temporary files. +# +# Globals: $_TMP_DIR +# +# Output : name of created file +# +# Variable prefix: tc +# +tmp_create() +{ + func_check tmp_create '<=' 1 "$@"; + # the output file does not have `,' as first character, so these are + # different names from the output file. + tc_tmp="${_TMP_DIR}/,$1"; + : >"${tc_tmp}" + obj tc_tmp echo1; + eval ${_UNSET} tc_tmp; + eval "${return_ok}"; +} + + +######################################################################## +# to_tmp () +# +# print file (decompressed) to the temporary cat file +# +to_tmp() +{ + func_check to_tmp '=' 1 "$@"; + if obj _TMP_CAT is_empty + then + error 'to_tmp_line: $_TMP_CAT is not yet set'; + fi; + if is_file "$1" + then + if obj _OPT_LOCATION is_yes + then + echo2 "$1"; + fi; + if obj _OPT_WHATIS is_yes + then + whatis_filename "$1" >>"${_TMP_CAT}"; + else + cat_z "$1" >>"${_TMP_CAT}"; + fi; + else + error "to_tmp(): could not read file \`$1'."; + fi; + eval "${return_ok}"; +} + + +######################################################################## +# to_tmp_line ([]) +# +# print line to the temporary cat file +# +to_tmp_line() +{ + func_check to_tmp '>=' 0 "$@"; + if obj _TMP_CAT is_empty + then + error 'to_tmp_line: $_TMP_CAT is not yet set'; + fi; + echo1 "$*" >>"${_TMP_CAT}"; + eval "${return_ok}"; +} + + +######################################################################## +# trap_set +# +# call function on signal 0 +# +trap_set() +{ + func_check trap_set '=' 0 "$@"; + trap 'clean_up' 0 2>${_NULL_DEV} || :; + eval "${return_ok}"; +} + + +######################################################################## +# trap_unset () +# +# disable trap on signal 0. +# +trap_unset() +{ + func_check trap_unset '=' 0 "$@"; + trap '' 0 2>${_NULL_DEV} || :; + eval "${return_ok}"; +} + + +######################################################################## +# usage () +# +# print usage information to stderr; for groffer option --help. +# +usage() +{ + func_check usage = 0 "$@"; + echo; + version; + echo1 'Usage: groffer [option]... [filespec]...'; + cat <&1 | sed -e '/^ *$/q' | sed -e '1s/^/is part of /'; + eval "${return_ok}"; +} + + +######################################################################## +# warning () +# +# Print warning to stderr +# +warning() +{ + echo2 "warning: $*"; +} + + +######################################################################## +# whatis_filename () +# +# Interpret as a man page and display its `whatis' +# information as a fragment written in the groff language. +# +# Variable prefix: wf +# +whatis_filename() +{ + func_check whatis_filename = 1 "$@"; + wf_arg="$1"; + if obj wf_arg is_not_file + then + error "whatis_filename(): argument is not a readable file." + fi; + wf_dot='^\.'"${_SPACE_SED}"'*'; + if obj _FILESPEC_ARG is_equal '-' + then + wf_arg='stdin'; + fi; + cat <) +# +# Output path of a program if in $PATH. +# +# Arguments : >=1 (empty allowed) +# more args are ignored, this allows to specify progs with arguments +# Return : `0' if arg1 is a program in $PATH, `1' otherwise. +# +# Variable prefix: w +# +where_is() +{ + func_check where_is '>=' 1 "$@"; + w_arg="$1"; + if obj w_arg is_empty + then + eval ${_UNSET} w_arg; + eval "${return_bad}"; + fi; + case "${w_arg}" in + /*) + eval ${_UNSET} w_arg; + eval ${_UNSET} w_file; + if test -f "${w_arg}" && test -x "${w_arg}" + then + eval "${return_ok}"; + else + eval "${return_bad}"; + fi; + ;; + esac; + eval set x "$(path_split "${PATH}")"; + exit_test; + shift; + for p + do + case "$p" in + */) w_file=${p}${w_arg}; ;; + *) w_file=${p}/${w_arg}; ;; + esac; + if test -f "${w_file}" && test -x "${w_file}" + then + obj w_file echo1; + eval ${_UNSET} w_arg; + eval ${_UNSET} w_file; + eval "${return_ok}"; + fi; + done; + eval ${_UNSET} w_arg; + eval ${_UNSET} w_file; + eval "${return_bad}"; +} + + +######################################################################## +# main* Functions +######################################################################## + +# The main area contains the following parts: +# - main_init(): initialize temporary files and set exit trap +# - main_parse_MANOPT(): parse $MANOPT +# - main_parse_args(): argument parsing +# - main_set_mode (): determine the display mode +# - main_do_fileargs(): process filespec arguments +# - main_set_resources(): setup X resources +# - main_display(): do the displaying +# - main(): the main function that calls all main_*() + + +####################################################################### +# main_init () +# +# set exit trap and create temporary files +# +# Globals: $_TMP_DIR, $_TMP_CAT, $_TMP_STDIN +# +# Variable prefix: mi +# +main_init() +{ + func_check main_init = 0 "$@"; + # call clean_up() on shell termination. + trap_set; + + # create temporary directory + umask 0022; + _TMP_DIR=''; + for d in "${GROFF_TMPDIR}" "${TMPDIR}" "${TMP}" "${TEMP}" \ + "${TEMPDIR}" "${HOME}"'/tmp' '/tmp' "${HOME}" '.' + do + mi_dir="$d"; + if obj mi_dir is_empty || obj mi_dir is_not_dir || \ + obj mi_dir is_not_writable + then + continue; + fi; + + case "${mi_dir}" in + */) + _TMP_DIR="${mi_dir}"; + ;; + *) + _TMP_DIR="${mi_dir}"'/'; + ;; + esac; + _TMP_DIR="${_TMP_DIR}groffer${_PROCESS_ID}"; + if obj _TMP_DIR rm_tree + then + : + else + mi_tdir_="${_TMP_DIR}"_; + mi_n=1; + mi_tdir_n="${mi_tdir_}${mi_n}"; + while obj mi_tdir_n is_existing + do + if obj mi_tdir_n rm_tree + then + # directory could not be removed + mi_n="$(expr "${mi_n}" + 1)"; + mi_tdir_n="${mi_tdir_}${mi_n}"; + continue; + fi; + done; + _TMP_DIR="${mi_tdir_n}"; + fi; + eval mkdir "${_TMP_DIR}"; + if is_not_equal "$?" 0 + then + obj _TMP_DIR rm_tree; + _TMP_DIR=''; + continue; + fi; + if obj _TMP_DIR is_dir && obj _TMP_DIR is_writable + then + # $_TMP_DIR can now be used as temporary directory + break; + fi; + obj _TMP_DIR rm_tree; + _TMP_DIR=''; + continue; + done; + if obj _TMP_DIR is_empty + then + error "main_init: \ +Couldn't create a directory for storing temporary files."; + fi; + if obj _DEBUG_PRINT_TMPDIR is_yes + then + echo2 "temporary directory: ${_TMP_DIR}"; + fi; + + _TMP_CAT="$(tmp_create groffer_cat)"; + _TMP_STDIN="$(tmp_create groffer_input)"; + exit_test; + + eval ${_UNSET} mi_dir; + eval ${_UNSET} mi_n; + eval ${_UNSET} mi_tdir_; + eval ${_UNSET} mi_tdir_n; + eval "${return_ok}"; +} # main_init() + + +######################################################################## +# main_parse_MANOPT () +# +# Parse $MANOPT to retrieve man options, but only if it is a non-empty +# string; found man arguments can be overwritten by the command line. +# +# Globals: +# in: $MANOPT, $_OPTS_MANOPT_* +# out: $_MANOPT_* +# +# Variable prefix: mpm +# +main_parse_MANOPT() +{ + func_check main_parse_MANOPT = 0 "$@"; + + if obj MANOPT is_not_empty + then + # Delete leading and final spaces + MANOPT="$(echo1 "${MANOPT}" | sed -e ' +s/^'"${_SPACE_SED}"'*// +s/'"${_SPACE_SED}"'*$// +')"; + exit_test; + fi; + if obj MANOPT is_empty + then + eval "${return_ok}"; + fi; + + mpm_list=''; + # add arguments in $MANOPT by mapping them to groffer options + eval set x "$(list_from_cmdline _OPTS_MANOPT "${MANOPT}")"; + exit_test; + shift; + until test "$#" -le 0 || is_equal "$1" '--' + do + mpm_opt="$1"; + shift; + case "${mpm_opt}" in + -7|--ascii) + list_append mpm_list '--ascii'; + ;; + -a|--all) + list_append mpm_list '--all'; + ;; + -c|--catman) + do_nothing; + shift; + ;; + -d|--debug) + do_nothing; + ;; + -D|--default) + # undo all man options so far + mpm_list=''; + ;; + -e|--extension) + list_append mpm_list '--extension'; + shift; + ;; + -f|--whatis) + list_append mpm_list '--whatis'; + shift; + ;; + -h|--help) + do_nothing; + shift; + ;; + -k|--apropos) + # groffer's --apropos takes an argument, but man's does not, so + do_nothing; + ;; + -l|--local-file) + do_nothing; + ;; + -L|--locale) + list_append mpm_list '--locale' "$1"; + shift; + ;; + -m|--systems) + list_append mpm_list '--systems' "$1"; + shift; + ;; + -M|--manpath) + list_append mpm_list '--manpath' "$1"; + shift; + ;; + -p|--preprocessor) + do_nothing; + shift; + ;; + -P|--pager) + list_append mpm_list '--pager' "$1"; + shift; + ;; + -r|--prompt) + do_nothing; + shift; + ;; + -S|--sections) + list_append mpm_list '--sections' "$1"; + shift; + ;; + -t|--troff) + do_nothing; + shift; + ;; + -T|--device) + list_append mpm_list '-T' "$1"; + shift; + ;; + -u|--update) + do_nothing; + shift; + ;; + -V|--version) + do_nothing; + ;; + -w|--where|--location) + list_append mpm_list '--location'; + ;; + -Z|--ditroff) + do_nothing; + ;; + # ignore all other options + esac; + done; + + # prepend $mpm_list to the command line + if obj mpm_list is_not_empty + then + eval set x "${mpm_list}" '"$@"'; + shift; + fi; + + eval ${_UNSET} mpm_list; + eval ${_UNSET} mpm_opt; + eval "${return_ok}"; +} # main_parse_MANOPT() + + +######################################################################## +# main_parse_args (*) +# +# Parse arguments; process options and filespec parameters +# +# Arguments: pass the command line arguments unaltered. +# Globals: +# in: $_OPTS_* +# out: $_OPT_*, $_ADDOPTS, $_FILEARGS +# +# Variable prefix: mpa +# +main_parse_args() +{ + func_check main_parse_args '>=' 0 "$@"; + _ALL_PARAMS="$(list_from_cmdline _OPTS_CMDLINE "$@")"; + exit_test; + if obj _DEBUG_PRINT_PARAMS is_yes + then + echo2 "parameters: ${_ALL_PARAMS}"; + fi; + eval set x "${_ALL_PARAMS}"; + shift; + + # By the call of `eval', unnecessary quoting was removed. So the + # positional shell parameters ($1, $2, ...) are now guaranteed to + # represent an option or an argument to the previous option, if any; + # then a `--' argument for separating options and + # parameters; followed by the filespec parameters if any. + + # Note, the existence of arguments to options has already been checked. + # So a check for `$#' or `--' should not be done for arguments. + + until test "$#" -le 0 || is_equal "$1" '--' + do + mpa_opt="$1"; # $mpa_opt is fed into the option handler + shift; + case "${mpa_opt}" in + -h|--help) + usage; + leave; + ;; + -Q|--source) # output source code (`Quellcode'). + _OPT_MODE='source'; + ;; + -T|--device|--troff-device) # device; arg + _OPT_DEVICE="$1"; + _check_device_with_mode; + shift; + ;; + -v|--version) + version; + leave; + ;; + -V) + _OPT_V='yes'; + ;; + -Z|--ditroff|--intermediate-output) # groff intermediate output + _OPT_Z='yes'; + ;; + -X) + if is_X + then + _OPT_MODE=X; + fi; + ;; + -?) + # delete leading `-' + mpa_optchar="$(echo1 "${mpa_opt}" | sed -e 's/^-//')"; + exit_test; + if list_has _OPTS_GROFF_SHORT_NA "${mpa_optchar}" + then + list_append _ADDOPTS_GROFF "${mpa_opt}"; + elif list_has _OPTS_GROFF_SHORT_ARG "${mpa_optchar}" + then + list_append _ADDOPTS_GROFF "${mpa_opt}" "$1"; + shift; + else + error "main_parse_args(): Unknown option : \`$1'"; + fi; + ;; + --all) + _OPT_ALL='yes'; + ;; + --apropos) # run `apropos' + _OPT_APROPOS='yes'; + _APROPOS_SECTIONS=''; + _OPT_WHATIS='no'; + ;; + --apropos-data) # run `apropos' for data sections + _OPT_APROPOS='yes'; + _APROPOS_SECTIONS='457'; + _OPT_WHATIS='no'; + ;; + --apropos-devel) # run `apropos' for development sections + _OPT_APROPOS='yes'; + _APROPOS_SECTIONS='239'; + _OPT_WHATIS='no'; + ;; + --apropos-progs) # run `apropos' for program sections + _OPT_APROPOS='yes'; + _APROPOS_SECTIONS='168'; + _OPT_WHATIS='no'; + ;; + --ascii) + list_append _ADDOPTS_GROFF '-mtty-char'; + if obj _OPT_MODE is_empty + then + _OPT_MODE='text'; + fi; + ;; + --auto) # the default automatic mode + _OPT_MODE=''; + ;; + --bd) # border color for viewers, arg; + _OPT_BD="$1"; + shift; + ;; + --bg|--backgroud) # background color for viewers, arg; + _OPT_BG="$1"; + shift; + ;; + --bw) # border width for viewers, arg; + _OPT_BW="$1"; + shift; + ;; + --debug|--debug-all|--debug-keep|--debug-lm|--debug-params|\ +--debug-shell|--debug-stacks|--debug-tmpdir|--debug-user) + # debug is handled at the beginning + :; + ;; + --default) # reset variables to default + reset; + ;; + --default-modes) # sequence of modes in auto mode; arg + _OPT_DEFAULT_MODES="$1"; + shift; + ;; + --display) # set X display, arg + _OPT_DISPLAY="$1"; + shift; + ;; + --do-nothing) + _OPT_DO_NOTHING='yes'; + ;; + --dvi) + if is_X + then + _OPT_MODE='dvi'; + fi; + ;; + --dvi-viewer) # viewer program for dvi mode; arg + _VIEWER_TERMINAL='no'; + _OPT_VIEWER_DVI="$1"; + shift; + ;; + --dvi-viewer-tty) # viewer program for dvi mode in tty; arg + _VIEWER_TERMINAL='yes'; + _OPT_VIEWER_DVI="$1"; + shift; + ;; + --extension) # the extension for man pages, arg + _OPT_EXTENSION="$1"; + shift; + ;; + --fg|--foreground) # foreground color for viewers, arg; + _OPT_FG="$1"; + shift; + ;; + --fn|--font) # set font for viewers, arg; + _OPT_FN="$1"; + shift; + ;; + --geometry) # window geometry for viewers, arg; + _OPT_GEOMETRY="$1"; + shift; + ;; + --groff) + _OPT_MODE='groff'; + ;; + --html|--www) # display with web browser + _OPT_MODE=html; + ;; + --html-viewer|--www-viewer) # viewer program for html mode; arg + _VIEWER_TERMINAL='no'; + _OPT_VIEWER_HTML="$1"; + shift; + ;; + --html-viewer-tty|--www-viewer-tty) # viewer for html mode in tty; arg + _VIEWER_TERMINAL='yes'; + _OPT_VIEWER_HTML="$1"; + shift; + ;; + --iconic) # start viewers as icons + _OPT_ICONIC='yes'; + ;; + --locale) # set language for man pages, arg + # argument is xx[_territory[.codeset[@modifier]]] (ISO 639,...) + _OPT_LANG="$1"; + shift; + ;; + --local-file) # force local files; same as `--no-man' + _MAN_FORCE='no'; + _MAN_ENABLE='no'; + ;; + --location|--where) # print file locations to stderr + _OPT_LOCATION='yes'; + ;; + --man) # force all file params to be man pages + _MAN_ENABLE='yes'; + _MAN_FORCE='yes'; + ;; + --manpath) # specify search path for man pages, arg + # arg is colon-separated list of directories + _OPT_MANPATH="$1"; + shift; + ;; + --mode) # display mode + mpa_arg="$1"; + shift; + case "${mpa_arg}" in + auto|'') # search mode automatically among default + _OPT_MODE=''; + ;; + groff) # pass input to plain groff + _OPT_MODE='groff'; + ;; + html|www) # display with a web browser + _OPT_MODE='html'; + ;; + dvi) # display with xdvi viewer + if is_X + then + _OPT_MODE='dvi'; + fi; + ;; + pdf) # display with PDF viewer + if is_X + then + _OPT_MODE='pdf'; + fi; + ;; + ps) # display with Postscript viewer + if is_X + then + _OPT_MODE='ps'; + fi; + ;; + text) # output on terminal + _OPT_MODE='text'; + ;; + tty) # output on terminal + _OPT_MODE='tty'; + ;; + X|x) # output on X roff viewer + if is_X + then + _OPT_MODE='x'; + fi; + ;; + Q|source) # display source code + _OPT_MODE="source"; + ;; + *) + error "main_parse_args(): unknown mode ${mpa_arg}"; + ;; + esac; + ;; + --no-location) # disable former call to `--location' + _OPT_LOCATION='yes'; + ;; + --no-man) # disable search for man pages + # the same as --local-file + _MAN_FORCE='no'; + _MAN_ENABLE='no'; + ;; + --no-special) # disable some special former calls + _OPT_ALL='no' + _OPT_APROPOS='no' + _OPT_WHATIS='no' + ;; + --pager|--tty-viewer|--tty-viewer-tty) + # set paging program for tty mode, arg + _VIEWER_TERMINAL='yes'; + _OPT_PAGER="$1"; + shift; + ;; + --pdf) + if is_X + then + _OPT_MODE='pdf'; + fi; + ;; + --pdf-viewer) # viewer program for ps mode; arg + _VIEWER_TERMINAL='no'; + _OPT_VIEWER_PDF="$1"; + shift; + ;; + --pdf-viewer-tty) # viewer program for ps mode in tty; arg + _VIEWER_TERMINAL='yes'; + _OPT_VIEWER_PDF="$1"; + shift; + ;; + --print) # for argument test + echo2 "$1"; + shift; + ;; + --ps) + if is_X + then + _OPT_MODE='ps'; + fi; + ;; + --ps-viewer) # viewer program for ps mode; arg + _VIEWER_TERMINAL='no'; + _OPT_VIEWER_PS="$1"; + shift; + ;; + --ps-viewer-tty) # viewer program for ps mode in tty; arg + _VIEWER_TERMINAL='yes'; + _OPT_VIEWER_PS="$1"; + shift; + ;; + --resolution) # set resolution for X devices, arg + mpa_arg="$1"; + shift; + case "${mpa_arg}" in + 75|75dpi) + mpa_dpi=75; + ;; + 100|100dpi) + mpa_dpi=100; + ;; + *) + error "main_parse_args(): \ +only resoutions of 75 or 100 dpi are supported"; + ;; + esac; + _OPT_RESOLUTION="${mpa_dpi}"; + ;; + --rv) + _OPT_RV='yes'; + ;; + --sections) # specify sections for man pages, arg + # arg is colon-separated list of section names + _OPT_SECTIONS="$1"; + shift; + ;; + --shell) + # already done during the first run; so ignore the argument + shift; + ;; + --systems) # man pages for different OS's, arg + # argument is a comma-separated list + _OPT_SYSTEMS="$1"; + shift; + ;; + --text) # text mode without pager + _OPT_MODE=text; + ;; + --title) # title for X viewers; arg + _OPT_TITLE="$1"; + shift; + ;; + --tty) # tty mode, text with pager + _OPT_MODE=tty; + ;; + --text-device|--tty-device) # device for tty mode; arg + _OPT_TEXT_DEVICE="$1"; + shift; + ;; + --whatis) + _OPT_WHATIS='yes'; + _OPT_ALL='yes'; + _OPT_APROPOS='no'; + ;; + --X|--x) + if is_X + then + _OPT_MODE=x; + fi; + ;; + --xrm) # pass X resource string, arg; + list_append _OPT_XRM "$1"; + shift; + ;; + --x-viewer|--X-viewer) # viewer program for x mode; arg + _VIEWER_TERMINAL='no'; + _OPT_VIEWER_X="$1"; + shift; + ;; + --x-viewer-tty|--X-viewer-tty) # viewer program for x mode in tty; arg + _VIEWER_TERMINAL='yes'; + _OPT_VIEWER_X="$1"; + shift; + ;; + *) + error 'main_parse_args(): error on argument parsing : '"\`$*'"; + ;; + esac; + done; + shift; # remove `--' argument + + if obj _OPT_DO_NOTHING is_yes + then + leave; + fi; + + # Remaining arguments are file names (filespecs). + # Save them to list $_FILEARGS + if is_equal "$#" 0 + then # use "-" for standard input + set x '-'; + shift; + fi; + _FILEARGS=''; + list_append _FILEARGS "$@"; + if list_has _FILEARGS '-' + then + save_stdin; + fi; + # $_FILEARGS must be retrieved with `eval set x "$_FILEARGS"; shift;' + eval ${_UNSET} mpa_arg; + eval ${_UNSET} mpa_dpi; + eval ${_UNSET} mpa_opt; + eval ${_UNSET} mpa_optchar; + eval "${return_ok}"; +} # main_parse_args() + + +# Called from main_parse_args() because double `case' is not possible. +# Globals: $_OPT_DEVICE, $_OPT_MODE +_check_device_with_mode() +{ + func_check _check_device_with_mode = 0 "$@"; + case "${_OPT_DEVICE}" in + dvi) + _OPT_MODE=dvi; + eval "${return_ok}"; + ;; + html) + _OPT_MODE=html; + eval "${return_ok}"; + ;; + lbp|lj4) + _OPT_MODE=groff; + eval "${return_ok}"; + ;; + ps) + _OPT_MODE=ps; + eval "${return_ok}"; + ;; + ascii|cp1047|latin1|utf8) + if obj _OPT_MODE is_not_equal text + then + _OPT_MODE=tty; # default text mode + fi; + eval "${return_ok}"; + ;; + X*) + _OPT_MODE=x; + eval "${return_ok}"; + ;; + *) # unknown device, go to groff mode + _OPT_MODE=groff; + eval "${return_ok}"; + ;; + esac; + eval "${return_error}"; +} # _check_device_with_mode() of main_parse_args() + + +######################################################################## +# main_set_mode () +# +# Determine the display mode. +# +# Globals: +# in: $DISPLAY, $_OPT_MODE, $_OPT_DEVICE +# out: $_DISPLAY_MODE +# +# Variable prefix: msm +# +main_set_mode() +{ + func_check main_set_mode = 0 "$@"; + + # set display + if obj _OPT_DISPLAY is_not_empty + then + DISPLAY="${_OPT_DISPLAY}"; + fi; + + if obj _OPT_V is_yes + then + list_append _ADDOPTS_GROFF '-V'; + fi; + if obj _OPT_Z is_yes + then + _DISPLAY_MODE='groff'; + list_append _ADDOPTS_GROFF '-Z'; + fi; + if obj _OPT_MODE is_equal 'groff' + then + _DISPLAY_MODE='groff'; + fi; + if obj _DISPLAY_MODE is_equal 'groff' + then + eval ${_UNSET} msm_modes; + eval ${_UNSET} msm_viewer; + eval ${_UNSET} msm_viewers; + eval "${return_ok}"; + fi; + + if obj _OPT_MODE is_equal 'source' + then + _DISPLAY_MODE='source'; + eval ${_UNSET} msm_modes; + eval ${_UNSET} msm_viewer; + eval ${_UNSET} msm_viewers; + eval "${return_ok}"; + fi; + + case "${_OPT_MODE}" in + '') # automatic mode + case "${_OPT_DEVICE}" in + X*) + if is_not_X + then + error_user "no X display found for device ${_OPT_DEVICE}"; + fi; + _DISPLAY_MODE='x'; + eval ${_UNSET} msm_modes; + eval ${_UNSET} msm_viewer; + eval ${_UNSET} msm_viewers; + eval "${return_ok}"; + ;; + ascii|cp1047|latin1|utf8) + if obj _DISPLAY_MODE is_not_equal 'text' + then + _DISPLAY_MODE='tty'; + fi; + eval ${_UNSET} msm_modes; + eval ${_UNSET} msm_viewer; + eval ${_UNSET} msm_viewers; + eval "${return_ok}"; + ;; + esac; + if is_not_X + then + _DISPLAY_MODE='tty'; + eval ${_UNSET} msm_modes; + eval ${_UNSET} msm_viewer; + eval ${_UNSET} msm_viewers; + eval "${return_ok}"; + fi; + + if obj _OPT_DEFAULT_MODES is_empty + then + msm_modes="${_DEFAULT_MODES}"; + else + msm_modes="${_OPT_DEFAULT_MODES}"; + fi; + ;; + text) + _DISPLAY_MODE='text'; + eval ${_UNSET} msm_modes; + eval ${_UNSET} msm_viewer; + eval ${_UNSET} msm_viewers; + eval "${return_ok}"; + ;; + tty) + _DISPLAY_MODE='tty'; + eval ${_UNSET} msm_modes; + eval ${_UNSET} msm_viewer; + eval ${_UNSET} msm_viewers; + eval "${return_ok}"; + ;; + html) + _DISPLAY_MODE='html'; + msm_modes="${_OPT_MODE}"; + ;; + *) # display mode was given + if is_not_X + then + error_user "You must be in X Window for ${_OPT_MODE} mode."; + fi; + msm_modes="${_OPT_MODE}"; + ;; + esac; + + # only viewer modes are left + eval set x "$(list_from_split "${msm_modes}" ',')"; + exit_test; + shift; + while test "$#" -gt 0 + do + m="$1"; + shift; + case "$m" in + dvi) + if obj _OPT_VIEWER_DVI is_not_empty + then + msm_viewer="${_OPT_VIEWER_DVI}"; + else + msm_viewer="$(_get_first_prog "$_VIEWER_DVI}")"; + exit_test; + fi; + if obj msm_viewer is_empty + then + error 'No viewer for dvi mode available.'; + fi; + if is_not_equal "$?" 0 + then + continue; + fi; + _DISPLAY_PROG="${msm_viewer}"; + _DISPLAY_MODE="dvi"; + eval ${_UNSET} msm_modes; + eval ${_UNSET} msm_viewer; + eval ${_UNSET} msm_viewers; + eval "${return_ok}"; + ;; + html) + if obj _OPT_VIEWER_HTML is_not_empty + then + msm_viewer="${_OPT_VIEWER_HTML}"; + else + if is_X + then + msm_viewers="${_VIEWER_HTML_X}"; + else + msm_viewers="${_VIEWER_HTML_TTY}"; + fi; + msm_viewer="$(_get_first_prog "${msm_viewers}")"; + exit_test; + fi; + if obj msm_viewer is_empty + then + error 'No viewer for html mode available.'; + fi; + if is_not_equal "$?" 0 + then + continue; + fi; + _DISPLAY_PROG="${msm_viewer}"; + _DISPLAY_MODE=html; + eval ${_UNSET} msm_modes; + eval ${_UNSET} msm_viewer; + eval ${_UNSET} msm_viewers; + eval "${return_ok}"; + ;; + pdf) + if obj _OPT_VIEWER_PDF is_not_empty + then + msm_viewer="${_OPT_VIEWER_PDF}"; + else + msm_viewer="$(_get_first_prog "${_VIEWER_PDF}")"; + exit_test; + fi; + if obj msm_viewer is_empty + then + error 'No viewer for pdf mode available.'; + fi; + if is_not_equal "$?" 0 + then + continue; + fi; + _DISPLAY_PROG="${msm_viewer}"; + _DISPLAY_MODE="pdf"; + eval ${_UNSET} msm_modes; + eval ${_UNSET} msm_viewer; + eval ${_UNSET} msm_viewers; + eval "${return_ok}"; + ;; + ps) + if obj _OPT_VIEWER_PS is_not_empty + then + msm_viewer="${_OPT_VIEWER_PS}"; + else + msm_viewer="$(_get_first_prog "${_VIEWER_PS}")"; + exit_test; + fi; + if obj msm_viewer is_empty + then + error 'No viewer for ps mode available.'; + fi; + if is_not_equal "$?" 0 + then + continue; + fi; + _DISPLAY_PROG="${msm_viewer}"; + _DISPLAY_MODE="ps"; + eval ${_UNSET} msm_modes; + eval ${_UNSET} msm_viewer; + eval ${_UNSET} msm_viewers; + eval "${return_ok}"; + ;; + text) + _DISPLAY_MODE='text'; + eval ${_UNSET} msm_modes; + eval ${_UNSET} msm_viewer; + eval ${_UNSET} msm_viewers; + eval "${return_ok}"; + ;; + tty) + _DISPLAY_MODE='tty'; + eval ${_UNSET} msm_modes; + eval ${_UNSET} msm_viewer; + eval ${_UNSET} msm_viewers; + eval "${return_ok}"; + ;; + x) + if obj _OPT_VIEWER_X is_not_empty + then + msm_viewer="${_OPT_VIEWER_X}"; + else + msm_viewer="$(_get_first_prog "${_VIEWER_X}")"; + exit_test; + fi; + if obj msm_viewer is_empty + then + error 'No viewer for x mode available.'; + fi; + if is_not_equal "$?" 0 + then + continue; + fi; + _DISPLAY_PROG="${msm_viewer}"; + _DISPLAY_MODE='x'; + eval ${_UNSET} msm_modes; + eval ${_UNSET} msm_viewer; + eval ${_UNSET} msm_viewers; + eval "${return_ok}"; + ;; + X) + _DISPLAY_MODE='X'; + eval ${_UNSET} msm_modes; + eval ${_UNSET} msm_viewer; + eval ${_UNSET} msm_viewers; + eval "${return_ok}"; + ;; + esac; + done; + eval ${_UNSET} msm_modes; + eval ${_UNSET} msm_viewer; + eval ${_UNSET} msm_viewers; + error_user "No suitable display mode found."; +} # main_set_mode() + + +# _get_first_prog () +# +# Retrieve first argument that represents an existing program in $PATH. +# Local function for main_set_mode(). +# +# Arguments: 1; a comma-separated list of commands (with options), +# like $_VIEWER_*. +# +# Return : `1' if none found, `0' if found. +# Output : the argument that succeded. +# +# Variable prefix: _gfp +# +_get_first_prog() +{ + if is_equal "$#" 0 + then + error "_get_first_prog() needs 1 argument."; + fi; + if is_empty "$1" + then + return "${_BAD}"; + fi; + eval set x "$(list_from_split "$1" ',')"; + exit_test; + shift; + for i + do + _gfp_i="$i"; + if obj _gfp_i is_empty + then + continue; + fi; + if eval is_prog "$(get_first_essential ${_gfp_i})" + then + exit_test; + obj _gfp_i echo1; + eval ${_UNSET} _gfp_i; + return "${_GOOD}"; + fi; + done; + eval ${_UNSET} _gfp_i; + return "${_BAD}"; +} # _get_first_prog() of main_set_mode() + + +####################################################################### +# main_do_fileargs () +# +# Process filespec arguments in $_FILEARGS. +# +# Globals: +# in: $_FILEARGS (process with `eval set x "$_FILEARGS"; shift;') +# +# Variable prefix: mdfa +# +main_do_fileargs() +{ + func_check main_do_fileargs = 0 "$@"; + special_setup; + eval set x "${_FILEARGS}"; + shift; + eval ${_UNSET} _FILEARGS; + # temporary storage of all input to $_TMP_CAT + while test "$#" -ge 2 + do + # test for `s name' arguments, with `s' a 1-char standard section + mdfa_filespec="$1"; + _FILESPEC_ARG="$1"; + shift; + case "${mdfa_filespec}" in + '') + continue; + ;; + '-') + special_filespec; + if obj _OPT_APROPOS is_yes + then + continue; + fi; + register_file '-' + continue; + ;; + ?) + if obj _OPT_APROPOS is_yes + then + special_filespec; + continue; + fi; + if list_has_not _MAN_AUTO_SEC_LIST "${mdfa_filespec}" + then + special_filespec; + do_filearg "${mdfa_filespec}" + continue; + fi; + mdfa_name="$1"; + _FILESPEC_ARG="${_FILESPEC_ARG} $1"; + special_filespec; + case "${mdfa_name}" in + */*|man:*|*\(*\)|*."${mdfa_filespec}") + do_filearg "${mdfa_filespec}" + continue; + ;; + esac; + shift; + if do_filearg "man:${mdfa_name}(${mdfa_filespec})" + then + continue; + else + do_filearg "${mdfa_filespec}" + continue; + fi; + ;; + *) + special_filespec; + if obj _OPT_APROPOS is_yes + then + continue; + fi; + do_filearg "${mdfa_filespec}" + continue; + ;; + esac; + done; # end of `s name' test + while test "$#" -gt 0 + do + mdfa_filespec="$1"; + _FILESPEC_ARG="$1"; + shift; + special_filespec; + if obj _OPT_APROPOS is_yes + then + continue; + fi; + do_filearg "${mdfa_filespec}" + done; + obj _TMP_STDIN rm_file_with_debug; + eval ${_UNSET} mdfa_filespec; + eval ${_UNSET} mdfa_name; + eval "${return_ok}"; +} # main_do_fileargs() + + +######################################################################## +# main_set_resources () +# +# Determine options for setting X resources with $_DISPLAY_PROG. +# +# Globals: $_DISPLAY_PROG, $_OUTPUT_FILE_NAME +# +# Variable prefix: msr +# +main_set_resources() +{ + func_check main_set_resources = 0 "$@"; + # $msr_prog viewer program + # $msr_rl resource list + msr_title="$(get_first_essential \ + "${_OPT_TITLE}" "${_REGISTERED_TITLE}")"; + exit_test; + _OUTPUT_FILE_NAME=''; + eval set x "${msr_title}"; + shift; + until is_equal "$#" 0 + do + msr_n="$1"; + case "${msr_n}" in + '') + continue; + ;; + ,*) + msr_n="$(echo1 "$1" | sed -e 's/^,,*//')"; + exit_test; + ;; + esac + if obj msr_n is_empty + then + continue; + fi; + if obj _OUTPUT_FILE_NAME is_not_empty + then + _OUTPUT_FILE_NAME="${_OUTPUT_FILE_NAME}"','; + fi; + _OUTPUT_FILE_NAME="${_OUTPUT_FILE_NAME}${msr_n}"; + shift; + done; + case "${_OUTPUT_FILE_NAME}" in + '') + _OUTPUT_FILE_NAME='-'; + ;; + ,*) + error "main_set_resources(): ${_OUTPUT_FILE_NAME} starts with a comma."; + ;; + esac; + _OUTPUT_FILE_NAME="${_TMP_DIR}/${_OUTPUT_FILE_NAME}"; + + if obj _DISPLAY_PROG is_empty + then # for example, for groff mode + _DISPLAY_ARGS=''; + eval ${_UNSET} msr_n; + eval ${_UNSET} msr_prog; + eval ${_UNSET} msr_rl; + eval ${_UNSET} msr_title; + eval "${return_ok}"; + fi; + + eval set x "${_DISPLAY_PROG}"; + shift; + msr_prog="$(base_name "$1")"; + exit_test; + shift; + if test $# != 0 + then + if obj _DISPLAY_PROG is_empty + then + _DISPLAY_ARGS="$*"; + else + _DISPLAY_ARGS="$* ${_DISPLAY_ARGS}"; + fi; + fi; + msr_rl=''; + if obj _OPT_BD is_not_empty + then + case "${msr_prog}" in + ghostview|gv|gxditview|xditview|xdvi) + list_append msr_rl '-bd' "${_OPT_BD}"; + ;; + esac; + fi; + if obj _OPT_BG is_not_empty + then + case "${msr_prog}" in + ghostview|gv|gxditview|xditview|xdvi) + list_append msr_rl '-bg' "${_OPT_BG}"; + ;; + kghostview) + list_append msr_rl '--bg' "${_OPT_BG}"; + ;; + xpdf) + list_append msr_rl '-papercolor' "${_OPT_BG}"; + ;; + esac; + fi; + if obj _OPT_BW is_not_empty + then + case "${msr_prog}" in + ghostview|gv|gxditview|xditview|xdvi) + _list_append msr_rl '-bw' "${_OPT_BW}"; + ;; + esac; + fi; + if obj _OPT_FG is_not_empty + then + case "${msr_prog}" in + ghostview|gv|gxditview|xditview|xdvi) + list_append msr_rl '-fg' "${_OPT_FG}"; + ;; + kghostview) + list_append msr_rl '--fg' "${_OPT_FG}"; + ;; + esac; + fi; + if is_not_empty "${_OPT_FN}" + then + case "${msr_prog}" in + ghostview|gv|gxditview|xditview|xdvi) + list_append msr_rl '-fn' "${_OPT_FN}"; + ;; + kghostview) + list_append msr_rl '--fn' "${_OPT_FN}"; + ;; + esac; + fi; + if is_not_empty "${_OPT_GEOMETRY}" + then + case "${msr_prog}" in + ghostview|gv|gxditview|xditview|xdvi|xpdf) + list_append msr_rl '-geometry' "${_OPT_GEOMETRY}"; + ;; + kghostview) + list_append msr_rl '--geometry' "${_OPT_GEOMETRY}"; + ;; + esac; + fi; + if is_empty "${_OPT_RESOLUTION}" + then + _OPT_RESOLUTION="${_DEFAULT_RESOLUTION}"; + case "${msr_prog}" in + gxditview|xditview) + list_append msr_rl '-resolution' "${_DEFAULT_RESOLUTION}"; + ;; + xpdf) + case "${_DEFAULT_RESOLUTION}" in + 75) + # 72dpi is '100' + list_append msr_rl '-z' '104'; + ;; + 100) + list_append msr_rl '-z' '139'; + ;; + esac; + ;; + esac; + else + case "${msr_prog}" in + ghostview|gv|gxditview|xditview|xdvi) + list_append msr_rl '-resolution' "${_OPT_RESOLUTION}"; + ;; + xpdf) + case "${_OPT_RESOLUTION}" in + 75) + list_append msr_rl '-z' '104'; + # '100' corresponds to 72dpi + ;; + 100) + list_append msr_rl '-z' '139'; + ;; + esac; + ;; + esac; + fi; + if is_yes "${_OPT_ICONIC}" + then + case "${msr_prog}" in + ghostview|gv|gxditview|xditview|xdvi) + list_append msr_rl '-iconic'; + ;; + esac; + fi; + if is_yes "${_OPT_RV}" + then + case "${msr_prog}" in + ghostview|gv|gxditview|xditview|xdvi) + list_append msr_rl '-rv'; + ;; + esac; + fi; + if is_not_empty "${_OPT_XRM}" + then + case "${msr_prog}" in + ghostview|gv|gxditview|xditview|xdvi|xpdf) + eval set x "${_OPT_XRM}"; + shift; + for i + do + list_append msr_rl '-xrm' "$i"; + done; + ;; + esac; + fi; + if is_not_empty "${msr_title}" + then + case "${msr_prog}" in + gxditview|xditview) + list_append msr_rl '-title' "${msr_title}"; + ;; + esac; + fi; + _DISPLAY_ARGS="${msr_rl}"; + eval ${_UNSET} msr_n; + eval ${_UNSET} msr_prog; + eval ${_UNSET} msr_rl; + eval ${_UNSET} msr_title; + eval "${return_ok}"; +} # main_set_resources + + +######################################################################## +# main_display () +# +# Do the actual display of the whole thing. +# +# Globals: +# in: $_DISPLAY_MODE, $_OPT_DEVICE, +# $_ADDOPTS_GROFF, $_ADDOPTS_POST, $_ADDOPTS_X, +# $_TMP_CAT, $_OPT_PAGER, $PAGER, $_MANOPT_PAGER, +# $_OUTPUT_FILE_NAME +# +# Variable prefix: md +# +main_display() +{ + func_check main_display = 0 "$@"; + + export md_addopts; + export md_groggy; + export md_modefile; + + if obj _TMP_CAT is_non_empty_file + then + md_modefile="${_OUTPUT_FILE_NAME}"; + else + echo2 'groffer: empty input.'; + clean_up; + eval ${_UNSET} md_modefile; + eval "${return_ok}"; + fi; + + # go to the temporary directory to be able to access internal data files + cd "${_TMP_DIR}" >"${_NULL_DEV}" 2>&1; + + case "${_DISPLAY_MODE}" in + groff) + _ADDOPTS_GROFF="${_ADDOPTS_GROFF} ${_ADDOPTS_POST}"; + if obj _OPT_DEVICE is_not_empty + then + _ADDOPTS_GROFF="${_ADDOPTS_GROFF} -T${_OPT_DEVICE}"; + fi; + md_groggy="$(tmp_cat | eval grog "${md_options}")"; + exit_test; + _do_opt_V; + + obj md_modefile rm_file; + mv "${_TMP_CAT}" "${md_modefile}"; + trap_unset; + cat "${md_modefile}" | \ + { + trap_set; + eval "${md_groggy}" "${_ADDOPTS_GROFF}"; + } & + ;; + text|tty) + case "${_OPT_DEVICE}" in + '') + md_device="$(get_first_essential \ + "${_OPT_TEXT_DEVICE}" "${_DEFAULT_TTY_DEVICE}")"; + exit_test; + ;; + ascii|cp1047|latin1|utf8) + md_device="${_OPT_DEVICE}"; + ;; + *) + warning "main_display(): \ +wrong device for ${_DISPLAY_MODE} mode: ${_OPT_DEVICE}"; + ;; + esac; + md_addopts="${_ADDOPTS_GROFF} ${_ADDOPTS_POST}"; + md_groggy="$(tmp_cat | grog -T${md_device})"; + exit_test; + if obj _DISPLAY_MODE is_equal 'text' + then + _do_opt_V; + tmp_cat | eval "${md_groggy}" "${md_addopts}"; + else + md_pager=''; + for p in "${_OPT_PAGER}" "${PAGER}" "${_MANOPT_PAGER}" \ + 'less -r -R' 'more' 'pager' 'cat' + do + md_p="$p"; + if eval is_prog ${md_p} + then # no "" for is_prog() allows args for $p + md_pager="${md_p}"; + break; + fi; + done; + if obj md_pager is_empty + then + error 'main_display(): no pager program found for tty mode'; + fi; + _do_opt_V; + tmp_cat | eval "${md_groggy}" "${md_addopts}" | \ + eval "${md_pager}"; + fi; + clean_up; + ;; + source) + tmp_cat; + clean_up; + ;; + + #### viewer modes + + dvi) + case "${_OPT_DEVICE}" in + ''|dvi) do_nothing; ;; + *) + warning "main_display(): \ +wrong device for ${_DISPLAY_MODE} mode: ${_OPT_DEVICE}" + ;; + esac; + md_modefile="${md_modefile}".dvi; + md_groggy="$(tmp_cat | grog -Tdvi)"; + exit_test; + _do_display; + ;; + html) + case "${_OPT_DEVICE}" in + ''|html) do_nothing; ;; + *) + warning "main_display(): \ +wrong device for ${_DISPLAY_MODE} mode: ${_OPT_DEVICE}"; + ;; + esac; + md_modefile="${md_modefile}".html; + md_groggy="$(tmp_cat | grog -Thtml)"; + exit_test; + _do_display; + ;; + pdf) + case "${_OPT_DEVICE}" in + ''|ps) + do_nothing; + ;; + *) + warning "main_display(): \ +wrong device for ${_DISPLAY_MODE} mode: ${_OPT_DEVICE}"; + ;; + esac; + md_groggy="$(tmp_cat | grog -Tps)"; + exit_test; + _do_display _make_pdf; + ;; + ps) + case "${_OPT_DEVICE}" in + ''|ps) + do_nothing; + ;; + *) + warning "main_display(): \ +wrong device for ${_DISPLAY_MODE} mode: ${_OPT_DEVICE}"; + ;; + esac; + md_modefile="${md_modefile}".ps; + md_groggy="$(tmp_cat | grog -Tps)"; + exit_test; + _do_display; + ;; + x) + case "${_OPT_DEVICE}" in + X*) + md_device="${_OPT_DEVICE}" + ;; + *) + case "${_OPT_RESOLUTION}" in + 100) + md_device='X100'; + if obj _OPT_GEOMETRY is_empty + then + case "${_DISPLAY_PROG}" in + gxditview|xditview) + # add width of 800dpi for resolution of 100dpi to the args + list_append _DISPLAY_ARGS '-geometry' '800'; + ;; + esac; + fi; + ;; + *) + md_device='X75-12'; + ;; + esac + esac; + md_groggy="$(tmp_cat | grog -T${md_device} -Z)"; + exit_test; + _do_display; + ;; + X) + case "${_OPT_DEVICE}" in + '') + md_groggy="$(tmp_cat | grog -X)"; + exit_test; + ;; + X*|dvi|html|lbp|lj4|ps) + # these devices work with + md_groggy="$(tmp_cat | grog -T"${_OPT_DEVICE}" -X)"; + exit_test; + ;; + *) + warning "main_display(): \ +wrong device for ${_DISPLAY_MODE} mode: ${_OPT_DEVICE}"; + md_groggy="$(tmp_cat | grog -Z)"; + exit_test; + ;; + esac; + _do_display; + ;; + *) + error "main_display(): unknown mode \`${_DISPLAY_MODE}'"; + ;; + esac; + eval ${_UNSET} md_addopts; + eval ${_UNSET} md_device; + eval ${_UNSET} md_groggy; + eval ${_UNSET} md_modefile; + eval ${_UNSET} md_options; + eval ${_UNSET} md_p; + eval ${_UNSET} md_pager; + eval "${return_ok}"; +} # main_display() + + +######################## +# _do_display ([]) +# +# Perform the generation of the output and view the result. If an +# argument is given interpret it as a function name that is called in +# the midst (actually only for `pdf'). +# +# Globals: $md_modefile, $md_groggy (from main_display()) +# +_do_display() +{ + func_check _do_display '>=' 0 "$@"; + _do_opt_V; + if obj _DISPLAY_PROG is_empty + then + trap_unset; + { + trap_set; + eval "${md_groggy}" "${_ADDOPTS_GROFF}" "${_TMP_CAT}"; + } & + else + obj md_modefile rm_file; + cat "${_TMP_CAT}" | \ + eval "${md_groggy}" "${_ADDOPTS_GROFF}" > "${md_modefile}"; + if is_not_empty "$1" + then + eval "$1"; + fi; + obj _TMP_CAT rm_file_with_debug; + if obj _VIEWER_TERMINAL is_yes # for programs that run on tty + then + eval "${_DISPLAY_PROG}" ${_DISPLAY_ARGS} "\"${md_modefile}\""; + else + case "${_DISPLAY_PROG}" in +# lynx\ *|less\ *|more\ *) # programs known to run on the terminal +# eval "${_DISPLAY_PROG}" ${_DISPLAY_ARGS} "\"${md_modefile}\""; +# ;; + *) + trap_unset; + { + trap_set; + eval "${_DISPLAY_PROG}" ${_DISPLAY_ARGS} "\"${md_modefile}\""; + } & + ;; + esac; + fi; + fi; + eval "${return_ok}"; +} # _do_display() of main_display() + + +############# +# _do_opt_V () +# +# Check on option `-V'; if set print the corresponding output and leave. +# +# Globals: $_ALL_PARAMS, $_ADDOPTS_GROFF, $_DISPLAY_MODE, $_DISPLAY_PROG, +# $_DISPLAY_ARGS, $md_groggy, $md_modefile +# +# Variable prefix: _doV +# +_do_opt_V() +{ + func_check _do_opt_V '=' 0 "$@"; + if obj _OPT_V is_yes + then + _OPT_V='no'; + echo1 "Parameters: ${_ALL_PARAMS}"; + echo1 "Display mode: ${_DISPLAY_MODE}"; + echo1 "Output file: ${md_modefile}"; + echo1 "Display prog: ${_DISPLAY_PROG} ${_DISPLAY_ARGS}"; + a="$(eval echo1 "'${_ADDOPTS_GROFF}'")"; + exit_test; + echo1 "Output of grog: ${md_groggy} $a"; + _doV_res="$(eval "${md_groggy}" "${_ADDOPTS_GROFF}")"; + exit_test; + echo1 "groff -V: ${_doV_res}" + leave; + fi; + eval "${return_ok}"; +} # _do_opt_V() of main_display() + + +############## +# _make_pdf () +# +# Transform to pdf format; for pdf mode in _do_display(). +# +# Globals: $md_modefile (from main_display()) +# +# Variable prefix: _mp +# +_make_pdf() +{ + func_check _do_display '=' 0 "$@"; + _mp_psfile="${md_modefile}"; + md_modefile="${md_modefile}.pdf"; + obj md_modefile rm_file; + if gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite \ + -sOutputFile="${md_modefile}" -c save pop -f "${_mp_psfile}" + then + :; + else + error '_make_pdf: could not transform into pdf format.'; + fi; + obj _mp_psfile rm_file_with_debug; + eval ${_UNSET} _mp_psfile; + eval "${return_ok}"; +} # _make_pdf() of main_display() + + +######################################################################## +# main (*) +# +# The main function for groffer. +# +# Arguments: +# +main() +{ + func_check main '>=' 0 "$@"; + # Do not change the sequence of the following functions! + landmark '13: main_init()'; + main_init; + landmark '14: main_parse_MANOPT()'; + main_parse_MANOPT; + landmark '15: main_parse_args()'; + main_parse_args "$@"; + landmark '16: main_set_mode()'; + main_set_mode; + landmark '17: main_do_fileargs()'; + main_do_fileargs; + landmark '18: main_set_resources()'; + main_set_resources; + landmark '19: main_display()'; + main_display; + eval "${return_ok}"; +} + + +######################################################################## + +main "$@"; diff -ruN groff-1.19.1/contrib/groffer/groffer.man groff-1.19.2/contrib/groffer/groffer.man --- groff-1.19.1/contrib/groffer/groffer.man 2004-05-04 06:45:21.000000000 +0200 +++ groff-1.19.2/contrib/groffer/groffer.man 2005-08-22 23:53:43.000000000 +0200 @@ -15,30 +15,51 @@ Source file position: /contrib/groffer/groffer.man Installed position: $prefix/share/man/man1/groffer.1 -Version : groffer 0.9.7 -Last update : 03 May 2004 +Last update: 22 August 2005 Source file position: /contrib/groffer/groffer.man - -Copyright (C) 2001,2002,2004 Free Software Foundation, Inc. -Written by Bernd Warken - -This file is part of groff version @VERSION@. - -groff 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. - -groff 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 groff; see the files COPYING and LICENSE in the top -directory of the groff source. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +.. +.de author +This file was written by +.MTO "" "Bernd Warken" . +.. +.de copyleft +Copyright (C) 2001,2002,2004,2005 Free Software Foundation, Inc. +. +.P +This file is part of +.IR \%groffer , +which is part of +.IR \%groff , +a free software project. +. +You can redistribute it and/or modify it under the terms of the +.nh +.B GNU General Public License +.hy +as published by the +.nh +.BR "Free Software Foundation" , +.hy +either version 2, or (at your option) any later version. +. +.P +You should have received a copy of the \f[CR]GNU General Public +License\f[] along with +.IR groff , +see the files \%\f[CB]COPYING\f[] and \%\f[CB]LICENSE\f[] in the top +directory of the +.I groff +source package. +. +Or read the +.I man\~page +.BR gpl (1). +You can also write to the +.nh +.B Free Software Foundation, 51 Franklin St - Fifth Floor, Boston, +.BR "MA 02110-1301, USA" . +.hy .. . .\" -------------------------------------------------------------------- @@ -58,15 +79,6 @@ . ftr CB CW .\} . -.ds @- "\-\"" -.ds @-- "\-\^\-\"" -. -.ds @b- "\f[CB]-\f[]\"" -.ds @b-- "\f[CB]--\f[]\"" -. -.ds @i- "\f[CI]-\f[]\"" -.ds @i-- "\f[CI]--\f[]\"" -. .ds Ellipsis ".\|.\|.\"" . .\" -------------------------------------------------------------------- @@ -188,7 +200,7 @@ .c -------------------------------------------------------------------- .c .Opt_- ([]) .c -.c Print `-' (minus sign); optional punctuation. +.c Print `-' (minus sign); optional punctuation. .c .de Opt_- . ie (\\n[.$] == 0) \ @@ -199,7 +211,7 @@ .c -------------------------------------------------------------------- .c .Opt_[-] ([]) .c -.c Print `Opt_[-]' (minus sign in brackets); optional punctuation. +.c Print `Opt_[-]' (minus sign in brackets); optional punctuation. .c .de Opt_[-] . ie (\\n[.$] == 0) \ @@ -210,7 +222,7 @@ .c -------------------------------------------------------------------- .c .Opt_-- ([]) .c -.c Print `--' (double minus); optional punctuation. +.c Print `--' (double minus); optional punctuation. .c .de Opt_-- . ie (\\n[.$] == 0) \ @@ -221,7 +233,7 @@ .c -------------------------------------------------------------------- .c .Opt_[--] ([]) .c -.c Print `Opt_[--]' (double minus in brackets); optional punctuation. +.c Print `Opt_[--]' (double minus in brackets); optional punctuation. .c .de Opt_[--] . ie (\\n[.$] == 0) \ @@ -284,7 +296,7 @@ .c Alternating options; base macro for many others; do not use directly. .c .c Arguments: -.c
: prefix, resulted is preceded by this.
+.c   
: prefix, result is preceded by this.
 .c   : separator between minus/opt pairs.
 .c   : postfix, is appended to the result.
 .c   : either `-' or `--' (font CB).
@@ -294,7 +306,8 @@
 .c Result:
 .c   String `
' followed by the / argument pairs, each
 .c   separated by string `', optionally add '', separated by
-.c   a single space ` ', followed by the string `'.
+.c   a single space ` ', followed by the string `'.  Terminated
+.c   by the optional punctuation .
 .c
 .de Opt_alt_base
 .  nr @font \\n[.f]\"
@@ -314,9 +327,13 @@
 .    \}
 .    c                                  separator
 .    if (\\n[@count] > 0) \
-.      as @res \f[CR]\\*[@sep]\"
+.      as @res \f[CR]\\*[@sep]\:\"
 .    nr @count +1
-.    as @res \f[CB]\\$1\\$2\:\"         combine minus with option name
+.    c                                  combine minus with option name
+.    as @res \f[CB]\\-\"
+.    if '\\$1'--' \
+.      as @res \\-\"
+.    as @res \\$2\"
 .    shift 2
 .  \}
 .  if (\\n[.$] >= 3) \
@@ -553,7 +570,9 @@
 .de Text
 .  if (\\n[.$] == 0) \
 .    return
+.  nh
 .  nop \)\\$*\)
+.  hy
 ..
 .c --------------------------------------------------------------------
 .c .Topic  ([])
@@ -646,13 +665,9 @@
 .
 .ad l
 .Synopsis groffer
-.RI [ option...\& ]
+.RI [ option... ]
 .Opt_[--]
-.RI [ "filespec" "\*[Ellipsis]]"
-./Synopsis
-.
-.Synopsis groffer
-.Opt_alt -- apropos -- apropos-data -- apropos-devel -- apropos-progs name
+.RI [ "\%filespec" "\*[Ellipsis]]"
 ./Synopsis
 .
 .Synopsis groffer
@@ -669,62 +684,83 @@
 .\" --------------------------------------------------------------------
 .
 The
-.I groffer
+.B \%groffer
 program is the easiest way to use
-.BR groff (@MAN1EXT@).
+.BR \%groff (@MAN1EXT@).
 It can display arbitrary documents written in the
-.BR groff (@MAN7EXT@)
-language or other
-.BR roff (@MAN7EXT@)
-languages that are compatible to the original troff language.
+.I \%groff
+language, see
+.BR \%groff (@MAN7EXT@),
+or other
+.I \%roff
+languages, see
+.BR \%roff (@MAN7EXT@),
+that are compatible to the original
+.I \%troff
+language.
 .
 The
-.I groffer
+.B \%groffer
 program also includes many of the features for finding and displaying
-the UNIX manual pages
+the \%\f[CR]Unix\f[] manual pages
+.nh
 .RI ( man\~pages ),
+.hy
 such that it can be used as a replacement for a
-.BR man (1)
+.BR \%man (1)
 program.
 .
 Moreover, compressed files that can be handled by
-.BR gzip (1)
+.BR \%gzip (1)
 or
-.BR bzip2 (1)
+.BR \%bzip2 (1)
 are decompressed on-the-fly.
 .
 .
 .P
 The normal usage is quite simple by supplying a file name or name of a
-man\~page without further options.
+.I \%man\~page
+without further options.
 .
 But the option handling has many possibilities for creating special
 behaviors.
 .
-This can be done in configuration files, with the shell environment
-variable
-.BR $GROFFER_OPT ,
+This can be done either in configuration files, with the shell
+environment variable
+.BR \%$GROFFER_OPT ,
 or on the command line.
 .
 .
 .P
 The output can be generated and viewed in several different ways
 available for
-.IR groff .
+.IR \%groff .
 .
-This includes the groff native X viewer
-.BR gxditview (@MAN1EXT@),
-each Postcript or dvi display program, a web browser by generating
-html in www-mode, or several text modes in text terminals.
+This includes the
+.I \%groff
+native \%\f[CR]X\~Window\f[] viewer
+.BR \%gxditview (@MAN1EXT@),
+each
+.IR \%Postcript ,
+.IR \%pdf ,
+or
+.I \%dvi
+display program, a web browser by generating
+.I \%html
+in
+.IR \%www\~mode ,
+or several
+.I \%text\~modes
+in text terminals.
 .
 .
 .P
 Most of the options that must be named when running
-.I groff
+.B \%groff
 directly are determined automatically for
-.IR groffer ,
+.BR \%groffer ,
 due to the internal usage of the
-.BR grog (@MAN1EXT@)
+.BR \%grog (@MAN1EXT@)
 program.
 .
 But all parts can also be controlled manually by arguments.
@@ -734,7 +770,20 @@
 Several file names can be specified on the command line arguments.
 .
 They are transformed into a single document in the normal way of
-.IR groff .
+.BR \%groff .
+.
+.
+.P
+Option handling is done in \f[CR]GNU\f[] style.
+.
+Options and file names can be mixed freely.
+.
+The option
+.RB ` \-\- '
+closes the option handling, all following arguments are treated as
+file names.
+.
+Long options can be abbreviated.
 .
 .
 .\" --------------------------------------------------------------------
@@ -745,41 +794,42 @@
 .I breaking options
 .RS
 .P
-.Opt_[alt] -- apropos name
-.Opt_[alt] -- apropos-data name
-.Opt_[alt] -- apropos-devel name
-.Opt_[alt] -- apropos-progs name
 .Opt_[alt] - h -- help
 .Opt_[alt] - v -- version
 .RE
 .
 .
 .TP
-.I groffer mode options
+.I \%groffer mode options
 .RS
 .P
 .Opt_[alt] -- auto
 .Opt_[alt] -- default
-.Opt_[alt] -- default-modes mode1,mode2,\*[Ellipsis]
+.Opt_[alt] -- default\-modes mode1,mode2,\*[Ellipsis]
 .Opt_[alt] -- dvi
-.Opt_[alt] -- dvi-viewer prog
+.Opt_[alt] -- dvi\-viewer prog
+.Opt_[alt] -- dvi\-viewer\-tty prog
 .Opt_[alt] -- groff
 .Opt_[alt] -- html
-.Opt_[alt] -- html-viewer prog
-.Opt_[alt] -- man
+.Opt_[alt] -- html\-viewer prog
+.Opt_[alt] -- html\-viewer\-tty prog
 .Opt_[alt] -- mode display_mode
-.Opt_[alt] -- no-man
 .Opt_[alt] -- pdf
-.Opt_[alt] -- pdf-viewer prog
+.Opt_[alt] -- pdf\-viewer prog
+.Opt_[alt] -- pdf\-viewer\-tty prog
 .Opt_[alt] -- ps
-.Opt_[alt] -- ps-viewer prog
+.Opt_[alt] -- ps\-viewer prog
+.Opt_[alt] -- ps\-viewer\-tty prog
 .Opt_[alt] -- text
 .Opt_[alt] -- tty
-.Opt_[alt] -- tty-viewer prog
+.Opt_[alt] -- tty\-viewer prog
+.Opt_[alt] -- tty\-viewer\-tty prog
 .Opt_[alt] -- www
-.Opt_[alt] -- www-viewer prog
+.Opt_[alt] -- www\-viewer prog
+.Opt_[alt] -- www\-viewer\- prog
 .Opt_[alt] -- x -- X
-.Opt_[alt] -- x-viewer -- X-viewer prog
+.Opt_[alt] -- x\-viewer -- X\-viewer prog
+.Opt_[alt] -- x\-viewer\-tty -- X\-viewer\-tty prog
 .RE
 .
 .
@@ -788,45 +838,40 @@
 .RS
 .P
 .Opt_[alt] -- debug
-.Opt_[alt] -- shell
+.Opt_[alt] -- do\-nothing
+.Opt_[alt] -- shell prog
+.Opt_[alt] - Q -- source
+.Opt_[alt] - V
 .RE
 .
 .
 .TP
-.I options related to groff
+.I options related to \%groff
 .RS
 .P
-.Opt_[alt] - P -- postproc-arg opt_or_arg
-.Opt_[alt] - Q -- source
 .Opt_[alt] - T -- device device
-.Opt_[alt] - Z -- intermediate-output -- ditroff
+.Opt_[alt] - Z -- intermediate\-output -- ditroff
 .P
 All further
-.I groff
+.B \%groff
 short options are accepted.
 .RE
 .
 .
 .TP
-.I X Window toolkit options
-.RS
-.P
-.Opt_[alt] -- bd pixels
-.Opt_[alt] -- bg -- background color
-.Opt_[alt] -- bw pixels
-.Opt_[alt] -- display X-display
-.Opt_[alt] -- fg -- foreground color
-.Opt_[alt] -- ft -- font font_name
-.Opt_[alt] -- geometry size_pos
-.Opt_[alt] -- resolution value
-.Opt_[alt] -- rv
-.Opt_[alt] -- title string
-.Opt_[alt] -- xrm X_resource
-.RE
+.I options for man\~pages
+.Opt_[alt] -- apropos
+.Opt_[alt] -- apropos\-data
+.Opt_[alt] -- apropos\-devel
+.Opt_[alt] -- apropos\-progs
+.Opt_[alt] -- whatis
+.Opt_[alt] -- man
+.Opt_[alt] -- no-man
+.Opt_[alt] -- no-special
 .
 .
 .TP
-.I options from man
+.I long options taken over from GNU man
 .RS
 .P
 .Opt_[alt] -- all
@@ -840,20 +885,37 @@
 .Opt_[alt] -- sections sec1:sec2:\*[Ellipsis]
 .Opt_[alt] -- systems sys1,sys2,\*[Ellipsis]
 .Opt_[alt] -- troff-device device
-.Opt_[alt] -- whatis
 .P
-Further long options of GNU
-.I man
+Further long options of \f[CR]GNU\f[]
+.B man
 are accepted as well.
 .RE
 .
 .
 .TP
-.I filespec argument
+.I X Window Toolkit options
+.RS
+.P
+.Opt_[alt] -- bd pixels
+.Opt_[alt] -- bg -- background color
+.Opt_[alt] -- bw pixels
+.Opt_[alt] -- display X-display
+.Opt_[alt] -- fg -- foreground color
+.Opt_[alt] -- ft -- font font_name
+.Opt_[alt] -- geometry size_pos
+.Opt_[alt] -- resolution value
+.Opt_[alt] -- rv
+.Opt_[alt] -- title string
+.Opt_[alt] -- xrm X-resource
+.RE
+.
+.
+.TP
+.I \%filespec arguments
 .RS
 .P
 No
-.I filespec
+.I \%filespec
 parameters means standard input.
 .
 .
@@ -871,9 +933,9 @@
 .BI man: name ( section )
 .TP+
 .IB name ( section )
-search the man\~page
-.I name
-in man\~section\~\c
+search the \%man\~page
+.I \%name
+in \%man\~section
 .IR section .
 .
 .
@@ -884,17 +946,17 @@
 if
 .I s
 is a character in
-.BR [1-9on] ,
-search for a man\~page
-.I name
-in man\~section
+.BR \%[1-9on] ,
+search for a \%man\~page
+.I \%name
+in \%man\~section
 .IR s .
 .
 .
 .TP
 .BI man: name
-man\~page in the lowest man\~section that has
-.IR name .
+\%man\~page in the lowest \%man\~section that has
+.IR \%name .
 .
 .
 .TP
@@ -902,19 +964,19 @@
 if
 .I s
 is a character in
-.BR [1-9on] ,
-search for a man\~page
-.I name
-in man\~section
+.BR \%[1-9on] ,
+search for a \%man\~page
+.I \%name
+in \%man\~section
 .IR s .
 .
 .
 .TP
 .I name
-if 
-.I name
+if
+.I \%name
 is not an existing file search for the man\~page
-.I name
+.I \%name
 in the lowest man\~section.
 .
 .RE
@@ -925,7 +987,7 @@
 .\" --------------------------------------------------------------------
 .
 The
-.I groffer
+.B \%groffer
 program can usually be run with very few options.
 .
 But for special purposes, it supports many options.
@@ -935,14 +997,14 @@
 .
 .P
 All short options of
-.I groffer
+.B \%groffer
 are compatible with the short options of
-.BR groff (@MAN1EXT@).
+.BR \%groff (@MAN1EXT@).
 .
 All long options of
-.I groffer
+.B \%groffer
 are compatible with the long options of
-.BR man (1).
+.BR \%man (1).
 .
 .
 .\" --------------------------------------------------------------------
@@ -951,52 +1013,12 @@
 .
 As soon as one of these options is found on the command line it is
 executed, printed to standard output, and the running
-.I groffer
+.B \%groffer
 is terminated thereafter.
 .
 All other arguments are ignored.
 .
 .
-.Opt_def -- apropos name
-Start the
-.BR apropos (1)
-command for searching within man page
-descriptions.
-.
-That slightly differs from the strange behavior of the
-.Opt_long apropos
-program of
-.BR man (1),
-which has no argument of its own, but takes the file arguments
-instead.
-.
-Practically both concepts are compatible.
-.
-.
-.Opt_def -- apropos-data name
-Show only the
-.BR apropos (1)
-descriptions for data documents, in the
-.BR man (7)
-sections 4, 5, and 7.
-.
-.
-.Opt_def -- apropos-devel name
-Show only the
-.BR apropos (1)
-descriptions for development documents, in the
-.BR man (7)
-sections 2, 3, and 9.
-.
-.
-.Opt_def -- apropos-progs name
-Show only the
-.BR apropos (1)
-descriptions for documents on programs, in the
-.BR man (7)
-sections 1, 6, and 8.
-.
-.
 .Opt_def - h -- help
 Print a helping information with a short explanation of option sto
 standard output.
@@ -1014,9 +1036,60 @@
 options.
 .
 If none of these mode and viewer options is specified
-.I groffer
+.B \%groffer
 tries to find a suitable display mode automatically.
 .
+The default modes are
+.I mode x
+with
+.B gxditview
+in \%\f[CR]X\~Window\f[] and
+.I mode tty
+with device
+.I latin1
+under
+.B less
+on a terminal.
+.
+.
+.P
+There are two kinds of options for viewers.
+.Opt_long \fImode\fP-viewer
+chooses the normal viewer programs that run on their own in
+\%\f[CR]X\~Window\f[], while
+.Opt_long \fImode\fP-viewer-tty
+chooses programs that run on the terminal (on tty).
+.
+Most graphical viewers are programs running in \%\f[CR]X\~Window\f[],
+so there aren't many opportunities to call the tty viewers.
+.
+But they give the chance to view the output source; for example,
+.Opt_long ps\-viewer\-tty=less
+shows the content of the
+.I Postscript
+output with the pager
+.BR less .
+.
+.
+.P
+The \%\f[CR]X\~Window\f[] viewers are not critical, you can use both
+.Opt_long *\-viewer
+and
+.Opt_long *\-viewer\-tty
+for them; with
+.Opt_long *\-viewer\-tty
+the viewer program will not become independently, it just stays
+coupled with
+.BR groffer .
+But the program will not run if you specify a terminal program with
+.Opt_long *\-viewer
+because this viewer will stay in background without a chance to reach
+it.
+.
+So you really need
+.Opt_long *\-viewer\-tty
+for viewers that run on tty.
+.
 .
 .Opt_def -- auto
 Equivalent to
@@ -1032,9 +1105,9 @@
 and restart option processing using only the rest of the command line.
 .
 .
-.Opt_def -- default-modes mode1,mode2,\*[Ellipsis]
+.Opt_def -- default\-modes mode1,mode2,\*[Ellipsis]
 Set the sequence of modes for
-.I auto mode
+.I \%auto\~mode
 to the comma separated list given in the argument.
 .
 See
@@ -1044,30 +1117,42 @@
 .IR x ,
 .IR ps ,
 and
-.I tty
+.I \%tty
 in this sequence.
 .
 .
 .
 .Opt_def -- dvi
 Equivalent to
-.Opt_long_arg mode dvi .
+.Opt_long_arg mode \%dvi .
 .
 .
-.Opt_def -- dvi-viewer prog
-Set the viewer program for dvi mode.
+.Opt_def -- dvi\-viewer prog
+Choose an \%\f[CR]X\~Window\f[] viewer program for
+.IR \%dvi\~mode .
 .
 This can be a file name or a program to be searched in
 .Env_var $PATH .
 .
-Known dvi viewers inlude
-.BR xdvi (1)
+Known \%\f[CR]X\~Window\f[]
+.I \%dvi
+viewers include
+.BR \%xdvi (1)
 and
-.BR dvilx (1)
+.BR \%dvilx (1)
 .
 In each case, arguments can be provided additionally.
 .
 .
+.Opt_def -- dvi\-viewer\-tty prog
+Choose a program running on the terminal for viewing the output of
+.IR \%dvi\~mode .
+.
+This can be a file name or a program to be searched in
+.Env_var $PATH ;
+arguments can be provided additionally.
+.
+.
 .Opt_def -- groff
 Equivalent to
 .Opt_long_arg mode groff .
@@ -1078,9 +1163,23 @@
 .Opt_long_arg mode html .
 .
 .
-.Opt_def -- html-viewer
-Equivalent to
-.Opt_long www-viewer .
+.Opt_def -- html\-viewer
+Choose an \%\f[CR]X\~Window\f[] web browser program for viewing in
+.I \%html\~mode .
+.
+It can be the path name of an executable file or a program in
+.Env_var $PATH .
+.
+In each case, arguments can be provided additionally.
+.
+.
+.Opt_def -- html\-viewer\-tty
+Choose a terminal program for viewing the output of
+.I \%html\~mode .
+.
+It can be the path name of an executable file or a program in
+.Env_var $PATH ;
+arguments can be provided additionally.
 .
 .
 .Opt_def -- mode value
@@ -1096,21 +1195,22 @@
 Select the automatic determination of the display mode.
 .
 The sequence of modes that are tried can be set with the
-.Opt_long default-modes
+.Opt_long default\-modes
 option.
 .
-Useful for restoring the default mode when a different mode was
-specified before.
+Useful for restoring the
+.I \%default\~mode
+when a different mode was specified before.
 .
 .
 .TP
 .Header_CB dvi
 Display formatted input in a
-.I dvi
+.I \%dvi
 viewer program.
 .
 By default, the formatted input is displayed with the
-.BR xdvi (1)
+.BR \%xdvi (1)
 program.
 .Opt_long dvi .
 .
@@ -1118,13 +1218,13 @@
 .TP
 .Header_CB groff
 After the file determination, switch
-.I groffer
+.B \%groffer
 to process the input like
-.BR groff (@MAN1EXT@)
-would do .
+.BR \%groff (@MAN1EXT@)
+would do.
 .
 This disables the
-.I groffer
+.I \%groffer
 viewing features.
 .
 .
@@ -1135,34 +1235,37 @@
 .
 By default, the existence of a sequence of standard web browsers is
 tested, starting with
-.BR konqueror (1)
+.BR \%konqueror (1)
 and
-.BR mozilla (1).
+.BR \%mozilla (1).
 The text html viewer is
-.BR lynx (1).
+.BR \%lynx (1).
 .
 .
 .TP
 .Header_CB pdf
 Display formatted input in a
-.I PDF
+.I \%PDF
 (Portable Document Format) viewer
 program.
 .
-By default, the input is formatted by groff using the Postscript
-device, then it is transformed into the PDF file format using
-.BR gs (1),
+By default, the input is formatted by
+.B \%groff
+using the Postscript device, then it is transformed into the PDF file
+format using
+.BR \%gs (1),
 and finally displayed either with the
-.BR xpdf (1)
+.BR \%xpdf (1)
 or the
-.BR acroread (1)
+.BR \%acroread (1)
 program.
 .
 PDF has a big advantage because the text is displayed graphically and
 is searchable as well.
 .
 But as the transformation takes a considerable amount of time, this
-mode is not suitable as a default device for the auto mode.
+mode is not suitable as a default device for the
+.I \%auto\~mode .
 .
 .
 .TP
@@ -1170,19 +1273,19 @@
 Display formatted input in a Postscript viewer program.
 .
 By default, the formatted input is displayed with the
-.BR ghostview (@MAN1EXT@)
+.BR \%ghostview (@MAN1EXT@)
 program.
 .
 .
 .TP
 .Header_CB text
 Format in a
-.I groff
-text mode and write the result to standard output without a pager or
-viewer program.
+.I \%groff\~text\~mode
+and write the result to standard output without a pager or viewer
+program.
 .
 The text device,
-.I latin1
+.I \%latin1
 by default, can be chosen with option
 .Opt_short T .
 .
@@ -1190,37 +1293,68 @@
 .TP
 .Header_CB tty
 Format in a
-.I groff
-text mode and write the result to standard output using a text pager
-program, even when in X Window.
+.I \%groff\~text\~mode
+and write the result to standard output using a text pager program,
+even when in \%\f[CR]X\~Window\f[].
 .
 .
 .TP
 .Header_CB www
 Equivalent to
-.Opt_long www .
+.Opt_long_arg mode html .
 .
 .
 .TP
-.Header_CB X
-Display formatted input in a native roff viewer.
+.Header_CB x
+Display the formatted input in a native
+.I roff
+viewer.
 .
 By default, the formatted input is displayed with the
-.BR gxditview (@MAN1EXT@)
-program, being distributed together with groff, or with
-.BR xditview (1),
-which is distributed as a standard X tool.
+.BR \%gxditview (@MAN1EXT@)
+program being distributed together with
+.BR \%groff .
+But the standard \%\f[CR]X\~Window\f[] tool
+.BR \%xditview (1)
+can also be chosen with the option
+.Opt_long x\-viewer .
+The default resolution is
+.BR 75\~dpi ,
+but
+.B 100\~dpi
+are also possible.
+.
+The default
+.I groff
+device
+for the resolution of
+.B 75\~dpi
+is
+.BR X75\-12 ,
+for
+.B 100\~dpi
+it is
+.BR X100 .
+.
+The corresponding
+.I "groff intermediate output"
+for the actual device is generated and the result is displayed.
+.
+For a resolution of
+.BR 100\~dpi ,
+the default width of the geometry of the display program is chosen to
+.BR 850\~dpi .
 .
 .
 .TP
-.Header_CB x
+.Header_CB X
 Equivalent to
-.Opt_long_arg mode X .
+.Opt_long_arg mode x .
 .
 .
 .P
 The following modes do not use the
-.I groffer
+.I \%groffer
 viewing features.
 .
 They are only interesting for advanced applications.
@@ -1229,15 +1363,15 @@
 .TP
 .Header_CB groff
 Generate device output with plain
-.I groff
+.I \%groff
 without using the special viewing features of
-.IR groffer .
+.IR \%groffer .
 If no device was specified by option
 .Opt_short T
 the
-.I groff
+.I \%groff
 default
-.B ps
+.B \%ps
 is assumed.
 .
 .
@@ -1255,15 +1389,22 @@
 .Opt_long_arg mode pdf .
 .
 .
-.Opt_def -- pdf-viewer prog
-Set the viewer program for
-.I pdf
-mode.
+.Opt_def -- pdf\-viewer prog
+Choose an \%\f[CR]X\~Window\f[] viewer program for
+.IR \%pdf\~mode .
 .
 This can be a file name or a program to be searched in
-.Env_var $PATH .
+.Env_var $PATH ;
+arguments can be provided additionally.
 .
-In each case, arguments can be provided additionally.
+.
+.Opt_def -- pdf\-viewer\-tty prog
+Choose a terminal viewer program for
+.IR \%pdf\~mode .
+.
+This can be a file name or a program to be searched in
+.Env_var $PATH ;
+arguments can be provided additionally.
 .
 .
 .Opt_def -- ps
@@ -1271,23 +1412,31 @@
 .Opt_long_arg mode ps .
 .
 .
-.Opt_def -- ps-viewer prog
-Set the viewer program for
-.I ps
-mode.
+.Opt_def -- ps\-viewer prog
+Choose an \%\f[CR]X\~Window\f[] viewer program for
+.IR \%ps\~mode .
 .
 This can be a file name or a program to be searched in
 .Env_var $PATH .
 .
 Common Postscript viewers inlude
-.BR gv (1),
-.BR ghostview (1),
+.BR \%gv (1),
+.BR \%ghostview (1),
 and
-.BR gs (1),
+.BR \%gs (1),
 .
 In each case, arguments can be provided additionally.
 .
 .
+.Opt_def -- ps\-viewer\-tty prog
+Choose a terminal viewer program for
+.IR \%ps\~mode .
+.
+This can be a file name or a program to be searched in
+.Env_var $PATH ;
+arguments can be provided additionally.
+.
+.
 .Opt_def -- text
 Equivalent to
 .Opt_long_arg mode text .
@@ -1298,74 +1447,93 @@
 .Opt_long_arg mode tty .
 .
 .
-.Opt_def -- tty-viewer
-Choose tty display mode, that means displaying in a text pager even
-when in X; eqivalent to
-.Opt_long_arg mode tty .
+.Opt_def -- tty\-viewer prog
+Choose a text pager for mode
+.IR tty .
+The standard pager is
+.BR less (1).
+This option is eqivalent to
+.I man
+option
+.Opt_long_arg pager prog .
+The option argument can be a file name or a program to be searched in
+.Env_var $PATH ;
+arguments can be provided additionally.
+.
+.
+.Opt_def -- tty\-viewer\-tty prog
+This is equivalent to
+.Opt_long tty\-viewer
+because the programs for
+.I tty
+mode run on a terminal anyway.
 .
 .
 .Opt_def -- www
 Equivalent to
-.Opt_long_arg mode www .
-.
+.Opt_long_arg mode html .
 .
-.Opt_def -- www-viewer prog
-Set the web browser program for viewing in
-.I www
-mode.
-.
-Each program that accepts html input and allows the
-.BI file://localhost/ dir / file
-syntax on the command line is suitable as viewer program; it can be
-the path name of an executable file or a program in
-.Env_var $PATH .
 .
-In each case, arguments can be provided additionally.
+.Opt_def -- www\-viewer prog
+Equivalent to
+.Opt_long html\-viewer .
 .
 .
-.Opt_def - X -- X -- x
+.Opt_def -- www\-viewer\-tty prog
 Equivalent to
-.Opt_long_arg mode X .
+.Opt_long html\-viewer\-tty .
 .
 .
-.Opt_def -- X-viewer -- x-viewer prog
-Set the viewer program for
-.I x
-mode.
+.Opt_def -- X -- x
+Equivalent to
+.Opt_long_arg mode x .
+.
 .
+.Opt_def -- X\-viewer -- x\-viewer prog
+Choose an \%\f[CR]X\~Window\f[] viewer program for
+.IR \%x\~mode .
 Suitable viewer programs are
-.BR gxditview (@MAN1EXT@)
-and
-.BR xditview (1).
+.BR \%gxditview (@MAN1EXT@)
+which is the default and
+.BR \%xditview (1).
+The argument can be any executable file or a program in
+.Env_var $PATH ;
+arguments can be provided additionally.
 .
-But the argument can be any executable file or a program in
-.Env_var $PATH .
 .
-In each case, arguments can be provided additionally.
+.Opt_def -- X\-viewer\-tty -- x\-viewer\-tty prog
+Choose a terminal viewer program for
+.IR \%x\~mode .
+The argument can be any executable file or a program in
+.Env_var $PATH ;
+arguments can be provided additionally.
 .
 .
 .TP
 .Opt_--
 Signals the end of option processing; all remaining arguments are
 interpreted as
-.I filespec
+.I \%filespec
 parameters.
 .
 .
 .P
 Besides these,
-.I groffer
-accepts all arguments that are valid for the
-.BR groff (@MAN1EXT@)
+.B \%groffer
+accepts all short options that are valid for the
+.BR \%groff (@MAN1EXT@)
 program.
 .
-All non-groffer options are sent unmodified via
-.I grog
+All
+.RB \%non- groffer
+options are sent unmodified via
+.B \%grog
 to
-.IR groff .
+.BR \%groff .
 .
-Postprocessors, macro packages, compatibility with classical
-.IR troff ,
+So postprocessors, macro packages, compatibility with
+.I classical
+.IR \%troff ,
 and much more can be manually specified.
 .
 .
@@ -1374,19 +1542,86 @@
 .\" --------------------------------------------------------------------
 .
 .Opt_def -- debug
-Print debugging information for development only.
+Enable five debugging informations.
+.
+The temporary files are kept and not deleted, the name of the
+temporary directory and the shell name for
+.File_name groffer2.sh
+are printed, the parameters are printed at several steps of
+development, and a function stack is output with function
+\f[CR]error_user()\f[] as well.
+.
+Neither the function call stack that is printed at each opening and
+closing of a function call nor the landmark information that is
+printed to determine how far the program is running are used.
+.
+This seems to be the most useful among all debugging options.
+.
+.
+.Opt_def -- debug\-all
+Enable all seven debugging informations including the function call
+stack and the landmark information.
+.
+.
+.Opt_def -- debug\-keep
+Enable two debugging information, the printing of the name of the
+temporary directory and the keeping of the temporary files.
+.
+.
+.Opt_def -- debug\-lm
+Enable one debugging information, the landmark information.
+.
+.
+.Opt_def -- debug\-params
+Enable one debugging information, the parameters at several steps.
+.
+.
+.Opt_def -- debug\-shell
+Enable one debugging information, the shell name for
+.File_name groffer2.sh .
+.
+.
+.Opt_def -- debug\-stacks
+Enable one debugging information, the function call stack.
+.
 .
-Actually, a function call stack is printed if an error occurs.
+.Opt_def -- debug\-tmpdir
+Enable one debugging information, the name of the temporary directory.
+.
+.
+.Opt_def -- debug\-user
+Enable one debugging information, the function stack with
+\f[CR]error_user()\f[].
+.
+.
+.Opt_def -- do-nothing
+This is like
+.Opt_long version ,
+but without the output; no viewer is started.
+.
+This makes only sense in development.
+.
+.
+.Opt_def -- print=text
+Just print the argument to standard error.
+.
+This is good for parameter check.
 .
 .
 .Opt_def -- shell "shell_program"
-Specify the shell under which the groffer script should be run.
+Specify the shell under which the
+.File_name \%groffer2.sh
+script should be run.
 .
-The script first tests whether this option is set (either by
-configuration, within
-.Env_var $GROFF_OPT
-or as a command line option); if so, the script is rerun under the
-shell program specified with the option argument.
+This option overwrites the automatic shell determination of the
+program.
+.
+If the argument
+.I shell_program
+is empty a former shell option and the automatic shell determination
+is cancelled and the default shell is restored.
+.
+Some shells run considerably faster than the standard shell.
 .
 .
 .Opt_def - Q -- source
@@ -1397,14 +1632,43 @@
 .Opt_long_arg mode source .
 .
 .
+.Opt_def - V
+This is an advanced option for debugging only.
+.
+Instead of displaying the formatted input, a lot of
+.I \%groffer
+specific information is printed to standard output:
+.
+.RS
+.Topic
+the output file name in the temporary directory,
+.
+.Topic
+the display mode of the actual
+.B \%groffer
+run,
+.
+.Topic
+the display program for viewing the output with its arguments,
+.
+.Topic
+the active parameters from the config files, the arguments in
+.Env_var $GROFFER_OPT ,
+and the arguments of the command line,
+.
+.Topic
+the pipeline that would be run by the
+.B \%groff
+program, but without executing it.
+.RE
+.
+.
 .P
 Other useful debugging options are the
-.I groff
-options
-.Opt_short V
-and
+.B \%groff
+option
 .Opt_short Z
-and option
+and
 .Opt_long_arg mode groff .
 .
 .
@@ -1413,49 +1677,49 @@
 .\" --------------------------------------------------------------------
 .
 All short options of
-.I groffer
+.B \%groffer
 are compatible with the short options of
-.BR groff (@MAN1EXT@).
+.BR \%groff (@MAN1EXT@).
 .
 The following of
-.I groff
+.B \%groff
 options have either an additional special meaning within
-.I groffer
+.B \%groffer
 or make sense for normal usage.
 .
 .
 .P
 Because of the special outputting behavior of the
-.I groff
-options
-.Opt_short V
-and
+.B \%groff
+option
 .Opt_short Z
-.I groffer
+.B \%groffer
 was designed to be switched into
-.I groff
-mode by these; the
-.I groffer
+.I \%groff\~mode ;
+the
+.I \%groffer
 viewing features are disabled there.
 .
 The other
-.I groff
+.B \%groff
 options do not switch the mode, but allow to customize the formatting
 process.
 .
 .
 .Opt_def - a
-This generates an ascii approximation of output in text modes.
+This generates an ascii approximation of output in the
+.IR \%text\~modes .
 .
 That could be important when the text pager has problems with control
-sequences.
+sequences in
+.IR "tty mode" .
 .
 .
 .Opt_def - m file
 Add
-.I file
+.I \%file
 as a
-.I groff
+.I \%groff
 macro file.
 .
 This is useful in case it cannot be recognized automatically.
@@ -1463,317 +1727,334 @@
 .
 .Opt_def - P opt_or_arg
 Send the argument
-.I opt_or_arg
+.I \%opt_or_arg
 as an option or option argument to the actual
-.I groff
+.B \%groff
 postprocessor.
 .
 .
 .Opt_def - T -- device devname
 .
 This option determines
-.IR groff 's
+.BR \%groff 's
 output device.
 .
 The most important devices are the text output devices for referring
 to the different character sets, such as
-.BR ascii ,
-.BR utf8 ,
-.BR latin1 ,
+.BR \%ascii ,
+.BR \%utf8 ,
+.BR \%latin1 ,
 and others.
 .
 Each of these arguments switches
-.I groffer
-into a text mode using this device, to
-.I mode tty
-if the actual mode is not a text mode.
+.B \%groffer
+into a
+.I \%text\~mode
+using this device, to
+.I \%mode\~tty
+if the actual mode is not a
+.IR \%text\~mode .
 .
 The following
-.I devname
+.I \%devname
 arguments are mapped to the corresponding
-.I groffer
+.B \%groffer
 .Opt_long_arg mode \fIdevname\fR
 option:
-.BR dvi ,
-.BR html ,
+.BR \%dvi ,
+.BR \%html ,
 and
-.BR ps .
+.BR \%ps .
 All
-.B X*
-arguments are mapped to mode
-.BR X .
+.B \%X*
+arguments are mapped to
+.IR \%mode\~x .
 Each other
-.I devname
+.I \%devname
 argument switches to
-.I mode groff
+.I \%mode\~groff
 using this device.
 .
 .
-.Opt_def - V
-Switch into
-.I groff
-mode and show only the
-.I groff
-calling pipe without formatting the input.
-.
-This an advanced option from
-.BR groff (@MAN1EXT@) ,
-only useful for debugging.
-.
-.
 .Opt_def - X
-was made equivalent to
-.Opt_long_arg mode x ;
-this slightly enhances the facility of
-.IR groff 's
-option.
+is equivalent to
+.BR "groff \-X" .
+It displays the
+.I groff intermediate output
+with
+.BR gxditview .
+As the quality is relatively bad this option is deprecated; use
+.Opt_long X
+instead because the
+.I \%x\~mode
+uses an
+.IR X *
+device for a better display.
 .
 .
 .Opt_def - Z -- intermediate-output -- ditroff
 Switch into
-.I groff
-mode and format the input with
-.I groff
-intermediate output without postprocessing; see
-.BR groff_out (@MAN1EXT@).
+.I \%groff\~mode
+and format the input with the
+.I \%groff intermediate output
+without postprocessing; see
+.BR \%groff_out (@MAN5EXT@).
 This is equivalent to option
 .Opt_long ditroff
 of
-.IR man ,
+.IR \%man ,
 which can be used as well.
 .
 .
 .P
 All other
-.I groff
+.B \%groff
 options are supported by
-.IR groffer ,
+.BR \%groffer ,
 but they are just transparently transferred to
-.I groff
+.B \%groff
 without any intervention.
 .
 The options that are not explicitly handled by
-.I groffer
+.B \%groffer
 are transparently passed to
-.IR groff .
+.BR \%groff .
 .
 Therefore these transparent options are not documented here, but in
-.BR groff (@MAN1EXT@).
+.BR \%groff (@MAN1EXT@).
 Due to the automatism in
-.IR groffer ,
+.BR \%groffer ,
 none of these
-.I groff
+.B \%groff
 options should be needed, except for advanced usage.
 .
 .
 .\" --------------------------------------------------------------------
-.SS "X Window toolkit Options"
+.SS "Options for man\~pages"
 .\" --------------------------------------------------------------------
 .
-The following long options were adapted from the corresponding X
-Toolkit options.
-.
-.I groffer
-will pass them to the actual viewer program if it is an X Window
-program.
-.
-Otherwise these options are ignored.
-.
+.Opt_def -- apropos
+Start the
+.BR \%apropos (1)
+command or facility of
+.BR \%man (1)
+for searching the
+.I \%filespec
+arguments within all
+.I \%man\~page
+descriptions.
 .
-.P
-Unfortunately these options use the old style of a single minus for
-long options.
-.
-For
-.I groffer
-that was changed to the standard with using a double minus for long
-options, for example,
-.I groffer
-uses the option
-.Opt_long font
-for the
-.I X
-option
-.Opt_short font .
-.
-.
-.P
-See
-.BR X (1),
-.BR X (7),
-and the documentation on the X toolkit options for more details on
-these options and their arguments.
-.
-.
-.Opt_def -- background color
-Set the background color of the viewer window.
-.
-.
-.Opt_def -- bd pixels
-Specifies the color of the border surrounding the viewer window.
+Each
+.I \%filespec
+argument is taken for search as it is; section specific parts are not
+handled, such that
+.B 7 groff
+searches for the two arguments
+.B 7
+and
+.B groff
+with a large result; for the
+.I \%filespec
+.B groff.7
+nothing will be found.
+.
+The display differs from the
+.B \%apropos
+program by the following concepts:
+.RS
+.Topic
+construct a
+.I \%groff
+frame to the output of
+.BR \%apropos ,
+.Topic
+each
+.I \%filespec
+argument is searched on its own.
+.Topic
+the restriction by
+.Opt_long sections
+is handled as well,
+.Topic
+wildcard characters are allowed and handled without a further option.
+.RE
 .
 .
-.Opt_def -- bg color
-This is equivalent to
-.Opt_long background .
+.Opt_def -- apropos\-data
+Show only the
+.B \%apropos
+descriptions for data documents, these are the
+.BR \%man (7)
+sections 4, 5, and 7.
 .
+Direct section declarations are ignored, wildcards are accepted.
 .
-.Opt_def -- bw pixels
-Specifies the width in pixels of the border surrounding the viewer
-window.
 .
+.Opt_def -- apropos\-devel
+Show only the
+.B \%apropos
+descriptions for development documents, these are the
+.BR man (7)
+sections 2, 3, and 9.
 .
-.Opt_def -- display X-display
-Set the X display on which the viewer program shall be started, see the
-.I X Window
-documentation for the syntax of the argument.
+Direct section declarations are ignored, wildcards are accepted.
 .
 .
-.Opt_def -- foreground color
-Set the foreground color of the viewer window.
+.Opt_def -- apropos\-progs
+Show only the
+.B \%apropos
+descriptions for documents on programs, these are the
+.BR \%man (7)
+sections 1, 6, and 8.
 .
+Direct section declarations are ignored, wildcards are accepted.
 .
-.Opt_def -- fg color
-This is equivalent to
-.Opt_short foreground .
 .
+.Opt_def -- whatis
+For each
+.I \%filespec
+argument search all
+.I \%man\~pages
+and display their description \[em] or say that it is not a
+.IR \%man\~page .
+This differs from
+.IR man 's
+.B whatis
+output by the following concepts
+.RS
+.Topic
+each retrieved file name is added,
+.Topic
+local files are handled as well,
+.Topic
+the display is framed by a
+.I groff
+output format,
+.Topic
+wildcard characters are allowed without a further option.
+.RE
 .
-.Opt_def -- font font_name
-Set the font used by the viewer window.
 .
-The argument is an X font name.
+.P
+The following two options were added to
+.B \%groffer
+for choosing whether the file name arguments are interpreted as names
+for local files or as a search pattern for
+.IR \%man\~pages .
 .
+The default is looking up for local files.
 .
-.Opt_def -- ft font_name
-This is equivalent to
-.Opt_long ft .
 .
+.Opt_def -- man
+Check the non-option command line arguments
+.nh
+.RI ( filespecs )
+.hy
+first on being
+.IR \%man\~pages ,
+then whether they represent an existing file.
+.
+By default, a
+.I \%filespec
+is first tested whether it is an existing file.
 .
-.Opt_def -- geometry size_pos
-Set the geometry of the display window, that means its size and its
-starting position.
 .
-See
-.BR X (7)
-for the syntax of the argument.
+.Opt_def -- no-man -- local-file
+Do not check for
+.IR \%man\~pages .
 .
+.Opt_long local-file
+is the corresponding
+.B man
+option.
 .
-.Opt_def -- resolution value
-Set X resolution in dpi (dots per inch) in some viewer programs.
 .
-The only supported dpi values are
-.B 75
+.Opt_def -- no-special
+Disable former calls of
+.Opt_long all ,
+.Opt_long apropos* ,
 and
-.BR 100 .
-.
-Actually, the default resolution for
-.I groffer
-is set to
-.BR 75 .
-.
-.
-.Opt_def -- rv
-Reverse foreground and background color of the viewer window.
-.
-.
-.Opt_def -- title "'some text'"
-Set the title for the viewer window.
-.
-.
-.Opt_def -- xrm "'resource'"
-Set X resource.
+.Opt_long whatis .
 .
 .
 .\" --------------------------------------------------------------------
-.SS "Options from man"
+.SS "Long options taken over from GNU man"
 .\" --------------------------------------------------------------------
 .
 The long options of
-.I groffer
-were synchronized with the long options of
-.IR GNU man .
+.B \%groffer
+were synchronized with the long options of \f[CR]GNU\f[]
+.BR man .
 .
-All long options of
-.I GNU man
+All long options of \f[CR]GNU\f[]
+.B man
 are recognized, but not all of these options are important to
-.IR groffer ,
+.BR \%groffer ,
 so most of them are just ignored.
 .
 .
 .P
-The following two options were added by
-.I groffer
-for choosing whether the file name arguments are interpreted as names
-for local files or as a search pattern for man pages.
-.
-The default is looking up for local files.
-.
-.
-.Opt_def -- man
-Check the non-option command line arguments (filespecs) first on being
-man\~pages, then whether they represent an existing file.
-.
-By default, a filespec is first tested whether it is an existing file.
-.
-.
-.Opt_def -- no-man -- local-file
-Do not check for man\~pages.
-.
-.Opt_long local-file
-is the corresponding
-.I man
-option.
-.
-.
-.P
 In the following, the
-.I man
+.B man
 options that have a special meaning for
-.I groffer
+.B \%groffer
 are documented.
 .
 .
 .P
-The full set of long and short options of the
-.I GNU man
+The full set of long and short options of the \f[CR]GNU\f[]
+.B man
 program can be passed via the environment variable
 .Env_var $MANOPT ;
 see
-.BR man (1)
-if your system has
-.I GNU man
+.BR \%man (1)
+if your system has \f[CR]GNU\f[]
+.B man
 installed.
 .
 .
 .Opt_def -- all
-In searching man\~pages, retrieve all suitable documents instead of
-only one.
+In searching
+.IR \%man\~pages ,
+retrieve all suitable documents instead of only one.
 .
 .
 .Opt_def - 7 -- ascii
-In text modes, display ASCII translation of special characters.
+In
+.IR \%text\~modes ,
+display ASCII translation of special characters for critical environment.
+.
+This is equivalent to
+.BR "groff -mtty_char" ;
+see
+.BR groff_tmac (@MAN5EXT@).
 .
 .
 .Opt_def -- ditroff
 Eqivalent to
-.I groffer
+.B \%groffer
 .Opt_short Z .
 .
 .
 .Opt_def -- extension suffix
-Restrict man\~page search to file names that have
-.I suffix
+Restrict
+.I \%man\~page
+search to file names that have
+.I \%suffix
 appended to their section element.
 .
 For example, in the file name
-.I /usr/share/man/man3/terminfo.3ncurses.gz
-the man\~page extension is
-.IR ncurses .
+.I \%/usr/share/man/man3/terminfo.3ncurses.gz
+the
+.I \%man\~page
+extension is
+.IR \%ncurses .
 .
 .
 .Opt_def -- locale language
 .
-Set the language for man pages.
+Set the language for
+.IR \%man\~pages .
 .
 This has the same effect, but overwrites
 .Env_var $LANG
@@ -1789,50 +2070,166 @@
 .Opt_long location .
 .
 This was added by
-.IR groffer .
+.BR \%groffer .
 .
 .
 .Opt_def -- manpath "'dir1:dir2:\*[Ellipsis]'"
-Use the specified search path for retrieving man\~pages instead of the
-program defaults.
+Use the specified search path for retrieving
+.I \%man\~pages
+instead of the program defaults.
 .
-If the argument is set to the empty string "" the search for man\~page
+If the argument is set to the empty string "" the search for
+.I \%man\~page
 is disabled.
 .
 .
 .Opt_def -- pager
-Set the pager program in tty mode; default is
-.IR less .
+Set the pager program in
+.IR \%tty\~mode ;
+default is
+.BR \%less .
 This is equivalent to
-.Opt_long tty-viewer .
+.Opt_long tty\-viewer .
 .
 .
 .Opt_def -- sections "'sec1:sec2:\*[Ellipsis]'"
-Restrict searching for man\~pages to the given
+Restrict searching for
+.I \%man\~pages
+to the given
 .IR sections ,
 a colon-separated list.
 .
 .
 .Opt_def -- systems "'sys1,sys2,\*[Ellipsis]'"
-Search for man pages for the given operating systems; the argument
-.I systems
+Search for
+.I \%man\~pages
+for the given operating systems; the argument
+.I \%systems
 is a comma-separated list.
 .
 .
-.Opt_def -- whatis
-Instead of displaying the content, get the one-liner description from
-the retrieved man\~page files \[em] or say that it is not a man\~page.
-.
-.
 .Opt_def -- where
 Eqivalent to
 .Opt_long location .
 .
 .
+.\" --------------------------------------------------------------------
+.SS "X\~\%Window\~\%Toolkit Options"
+.\" --------------------------------------------------------------------
+.
+The following long options were adapted from the corresponding
+\%\f[CR]X\~\Window\~Toolkit\f[] options.
+.
+.B \%groffer
+will pass them to the actual viewer program if it is an
+\%\f[CR]X\~Window\f[] program.
+.
+Otherwise these options are ignored.
+.
+.
 .P
-Additionally, the following short option of
-.I man
-is supported as well.
+Unfortunately these options use the old style of a single minus for
+long options.
+.
+For
+.B \%groffer
+that was changed to the standard with using a double minus for long
+options, for example,
+.B \%groffer
+uses the option
+.Opt_long font
+for the \%\f[CR]X\~Window\f[] option
+.Opt_short font .
+.
+.
+.P
+See
+.BR \%X (1),
+.BR \%X (7),
+and the documentation on the \%\f[CR]X\~Window\~Toolkit\f[] options
+for more details on these options and their arguments.
+.
+.
+.Opt_def -- background color
+Set the background color of the viewer window.
+.
+.
+.Opt_def -- bd pixels
+Specifies the color of the border surrounding the viewer window.
+.
+.
+.Opt_def -- bg color
+This is equivalent to
+.Opt_long background .
+.
+.
+.Opt_def -- bw pixels
+Specifies the width in pixels of the border surrounding the viewer
+window.
+.
+.
+.Opt_def -- display X-display
+Set the \%\f[CR]X\~Window\f[] display on which the viewer program
+shall be started, see the \%\f[CR]X\~Window\f[] documentation for the
+syntax of the argument.
+.
+.
+.Opt_def -- foreground color
+Set the foreground color of the viewer window.
+.
+.
+.Opt_def -- fg color
+This is equivalent to
+.Opt_short foreground .
+.
+.
+.Opt_def -- font font_name
+Set the font used by the viewer window.
+.
+The argument is an \%\f[CR]X\~Window\f[] font name.
+.
+.
+.Opt_def -- ft font_name
+This is equivalent to
+.Opt_long ft .
+.
+.
+.Opt_def -- geometry size_pos
+Set the geometry of the display window, that means its size and its
+starting position.
+.
+See
+.BR \%X (7)
+for the syntax of the argument.
+.
+.
+.Opt_def -- resolution value
+Set \%\f[CR]X\~Window\f[] resolution in dpi (dots per inch) in some
+viewer programs.
+.
+The only supported dpi values are
+.B 75
+and
+.BR 100 .
+.
+Actually, the default resolution for
+.B \%groffer
+is set to
+.BR 75\~dpi .
+The resolution also sets the default device in
+.IR "mode x" .
+.
+.
+.Opt_def -- rv
+Reverse foreground and background color of the viewer window.
+.
+.
+.Opt_def -- title "'some text'"
+Set the title for the viewer window.
+.
+.
+.Opt_def -- xrm "'resource'"
+Set \f[CR]\%X\~Window\f[] resource.
 .
 .
 .\" --------------------------------------------------------------------
@@ -1840,43 +2237,48 @@
 .\" --------------------------------------------------------------------
 .
 A
-.I filespec
-parameter is an argument meaning an input source, such as a file name
-or template for searching man\~pages.
+.I \%filespec
+parameter is an argument that is not an option or option argument.
 .
-These input sources are collected and composed into a single output
-file.
+It means an input source.
 .
-Each of these
-.I filespec
-parameters can have one of the following forms.
+In
+.BR \%groffer ,
+.I \%filespec
+parameters are a file name or a template for searching
+.IR \%man\~pages .
 .
+These input sources are collected and composed into a single output
+file such as
+.B \%groff
+does.
 .
-.P
-No
-.I filespec
-parameters means that
-.I groffer
-waits for standard input.
 .
-The minus option
-.Opt_short ""
-stands for standard input, too, but can occur several times.
+.P
+The strange \%\f[CR]POSIX\f[] behavior to regard all arguments behind
+the first non-option argument as
+.I \%filespec
+arguments is ignored.
 .
-Next
-.I filespec
-is tested whether it is the path name of an existing file.
+The \f[CR]GNU\f[] behavior to recognize options even when mixed with
+.I \%filespec
+arguments is used througout.
 .
-Otherwise it is assumed as a searching pattern for a man\~page.
+But, as usual, the double minus argument
+.Opt_long
+ends the option handling and interprets all following arguments as
+.I \%filespec
+arguments; so the \%\f[CR]POSIX\f[] behavior can be easily adopted.
 .
 .
 .P
-On each system, the man pages are sorted according to their content
-into several sections.
+For the following, it is necessary to know that on each system the
+.I \%man\~pages
+are sorted according to their content into several sections.
 .
 The
 .I classical man sections
-have a single-character name, either are a digit from
+have a single-character name, either a digit from
 .B 1
 to
 .B 9
@@ -1887,49 +2289,77 @@
 .
 In the following, a stand-alone character
 .I s
-means this scheme.
-.
-.
-.P
+stands for a
+.IR "classical man section" .
 The internal precedence of
-.I man
-for searching man pages with the same name within several sections
-goes according to the classical single-character sequence.
+.B \%man
+for searching
+.I \%man\~pages
+with the same name within several sections goes according to the
+classical single-character sequence.
 .
 On some systems, this single character can be extended by a following
 string.
 .
 But the special
-.I groffer
-man page facility is based on the classical single character sections.
+.B \%groffer
+.I \%man\~page
+facility is based on the classical single character sections.
 .
 .
 .P
-.BI man: name ( section )
+Each
+.I \%filespec
+parameter can have one of the following forms in decreasing sequence.
+.
+.
+.Topic
+No
+.I \%filespec
+parameters means that
+.B \%groffer
+waits for standard input.
+.
+The minus option
+.Opt_short ""
+stands for standard input, too; it can occur several times.
+.
+.
+.Topic
+Next a
+.I \%filespec
+is tested whether it is the path name of an existing file.
+.
+Otherwise it is assumed to be a searching pattern for a
+.IR \%man\~page .
+.
+.
+.Topic
+.BI \%man: name ( section )
 and
-.IB name ( section )
-search the man\~page
-.I name
-in man\~section\~\c
-.IR section ,
+.IB \%name ( section )
+search the \%man\~page
+.I \%name
+in \%man\~section\~\c
+.IR \%section ,
 where
-.I section
+.I \%section
 can be any string, but it must exist in the
-.I man
+.I \%man
 system.
 .
 .
-.P
+.Topic
 Next some patterns based on the
 .I classical man sections
-were constructed.
+are checked.
 .
-.BI man: name . s
+.BI \%man: name . s
 and
-.IB name . s
-search for a man\~page
-.I name
-in man\~section
+.IB \%name . s
+search for a \%man\~page
+.I \%name
+in \%man\~section
 .I s
 if
 .I s
@@ -1937,67 +2367,87 @@
 .I classical man section
 mentioned above.
 .
-Otherwise search for a man\~page named
-.IR name.s
-in the lowest
-.I man
-section.
+Otherwise a
+.I \%man\~page
+named
+.IR \%name.s
+is searched in the lowest
+.B man\~section .
 .
 .
-.P
+.Topic
 Now
-.BI man: name
-searches for a man\~page in the lowest man\~section that has a
-document called
-.IR name .
+.BI \%man: name
+searches for a
+.I \%man\~page
+in the lowest
+.I \%man\~section
+that has a document called
+.IR \%name .
 .
 .
-.P
+.Topic
 The pattern
-.I "s name"
+.I \%s\~name
 originates from a strange argument parsing of the
-.I man
+.B man
 program.
 .
 If
 .I s
 is a
 .I classical man section
-interpret it as a search for a man\~page called
-.I name
+interpret it as a search for a
+.I \%man\~page
+called
+.I \%name
 in man\~section
 .IR s ,
-otherwise interpret
+otherwise interpret both
 .I s
-as a file argument and
-.I name
-as another
-.I filespec
-argument.
+and
+.I \%name
+as two independent
+.I \%filespec
+arguments.
 .
 .
-.P
+.Topic
 We are left with the argument
-.I name
+.I \%name
 which is not an existing file.
 .
-So this searches for the man\~page called
-.I name
-in the lowest man\~section that has a document for this name.
+So this searches for the
+.I \%man\~page
+called
+.I \%name
+in the lowest
+.I \%man\~section
+that has a document for this name.
+.
+.
+.P
+Wildcards in
+.I \%filespec
+arguments are only accepted for
+.Opt_long apropos*
+and
+.Opt_long whatis ;
+for normal display, they are interpreted as characters.
 .
 .
 .P
 Several file name arguments can be supplied.
 .
 They are mixed by
-.I groff
+.B \%groff
 into a single document.
 .
 Note that the set of option arguments must fit to all of these file
 arguments.
 .
 So they should have at least the same style of the
-.I groff
+.I \%groff
 language.
 .
 .
@@ -2006,19 +2456,19 @@
 .\" --------------------------------------------------------------------
 .
 By default, the
-.I groffer
+.B \%groffer
 program collects all input into a single file, formats it with the
-.I groff
+.B \%groff
 program for a certain device, and then chooses a suitable viewer
 program.
 .
 The device and viewer process in
-.I groffer
+.B \%groffer
 is called a
-.IR mode .
+.IR \%mode .
 .
 The mode and viewer of a running
-.I groffer
+.B \%groffer
 program is selected automatically, but the user can also choose it
 with options.
 .
@@ -2030,103 +2480,111 @@
 .Opt_long \fIanymode .
 Most of these modes have a viewer program, which can be chosen by an
 option that is constructed like
-.Opt_long \fIanymode\fR-viewer .
+.Opt_long \fIanymode\fR\-viewer .
 .
 .
 .P
-Several different modes are offered, graphical X modes, text modes,
+Several different modes are offered, graphical modes for
+\f[CR]\%X\~Window\f[],
+.IR \%text\~modes ,
 and some direct
-.I groff
-modes for debugging and development.
+.I \%groff\~modes
+for debugging and development.
 .
 .
 .P
 By default,
-.I groffer
+.B \%groffer
 first tries whether
-.B x
-mode is possible, then
-.B ps
-mode, and finally
-.B tty
-mode.
+.I \%x\~mode
+is possible, then
+.IR \%ps\~mode ,
+and finally
+.IR \%tty\~mode .
 .
 This mode testing sequence for
-.B auto
-mode can be changed by specifying a comma separated list of modes
-with the option
+.I \%auto\~mode
+can be changed by specifying a comma separated list of modes with the
+option
 .Opt_long default\-modes.
 .
 .
 .P
-The searching for man\~pages and the decompression of the input are
-active in every mode.
+The searching for
+.I \%man\~pages
+and the decompression of the input are active in every mode.
 .
 .
 .\" --------------------------------------------------------------------
 .SS "Graphical Display Modes"
 .\" --------------------------------------------------------------------
 .
-The graphical display modes work only in the X Window environment (or
-similar implementations within other windowing environments).
+The graphical display modes work mostly in the \%\f[CR]X\~Window\f[]
+environment (or similar implementations within other windowing
+environments).
 .
 The environment variable
 .Env_var $DISPLAY
 and the option
 .Opt_long display
-are used for specifying the X display to be used.
+are used for specifying the \%\f[CR]X\~Window\f[] display to be used.
 .
-If neither is given,
-.I groffer
-assumes that no X and changes to one text mode.
+If this environment variable is empty
+.B \%groffer
+assumes that no \%\f[CR]X\~Window\f[] is running and changes to a
+.IR \%text\~mode .
 .
 You can change this automatic behavior by the option
 .Opt_long default\-modes .
 .
 .
 .P
-Known viewers for the graphical display modes and their standard X
-Window viewer progams are
+Known viewers for the graphical display modes and their standard
+\%\f[CR]X\~Window\f[] viewer progams are
 .
 .Topic
-X Window roff viewers such as
-.BR gxditview (@MAN1EXT@)
-or
-.BR xditview (1)
-.RI (in x
+\%\f[CR]X\~Window\f[]
+.I roff
+viewers such as
+.BR \%gxditview (@MAN1EXT@)
 or
-.I X
-mode),
+.BR \%xditview (1)
+(in
+.IR \%x\~mode ),
 .
 .Topic
 in a Postscript viewer
-.RI ( ps
-mode),
+.nh
+.RI ( \%ps\~mode ),
+.hy
 .
 .Topic
 in a dvi viewer program
-.RI ( dvi
-mode),
+.nh
+.RI ( \%dvi\~mode ),
+.hy
 .
 .Topic
 in a PDF viewer
-.RI ( pdf
-mode),
+.nh
+.RI ( \%pdf\~mode ),
+.hy
 .
 .Topic
 in a web browser
+.nh
 .RI ( html
 or
-.I www
-mode),
+.IR \%www\~mode ).
+.hy
 .RE
 .
 .
 .P
 The
-.I pdf
-mode has a major advantage \[em] it is the only graphical diplay mode
-that allows to search for text within the viewer; this can be a really
+.I \%pdf\~mode
+has a major advantage \[em] it is the only graphical diplay mode that
+allows to search for text within the viewer; this can be a really
 important feature.
 .
 Unfortunately, it takes some time to transform the input into the PDF
@@ -2134,38 +2592,42 @@
 .
 .
 .P
-These graphical viewers can be customized by options of the X Window
-Toolkit.
+These graphical viewers can be customized by options of the
+\%\f[CR]X\~Window\~Toolkit\f[].
 .
 But the
-.I groffer
+.B \%groffer
 options use a leading double minus instead of the single minus used by
-the X Window Toolkit.
+the \%\f[CR]X\~Window\~Toolkit\f[].
 .
 .
 .\" --------------------------------------------------------------------
-.SS "Text mode"
+.SS "Text modes"
 .\" --------------------------------------------------------------------
 .
-There are to modes for text output, mode
-.I text
-for plain output without a pager and mode
-.I tty
+There are two modes for text output,
+.I \%mode\~text
+for plain output without a pager and
+.I \%mode\~tty
 for a text output on a text terminal using some pager program.
 .
 .
 .P
 If the variable
-.Env_var $DISPLAY
-is not set or empty, groffer assumes that it should use
-.I tty
-mode.
+.Env_var \%$DISPLAY
+is not set or empty,
+.B \%groffer
+assumes that it should use
+.IR \%tty\~\%mode .
 .
 .
 .P
-In the actual implementation, the groff output device
-.I latin1
-is chosen for text modes.
+In the actual implementation, the
+.I groff
+output device
+.I \%latin1
+is chosen for
+.IR \%text\~modes .
 .
 This can be changed by specifying option
 .Opt_short T
@@ -2177,11 +2639,11 @@
 The pager to be used can be specified by one of the options
 .Opt_long pager
 and
-.Opt_long tty-viewer ,
+.Opt_long tty\-viewer ,
 or by the environment variable
 .Env_var $PAGER .
 If all of this is not used the
-.BR less (1)
+.BR \%less (1)
 program with the option
 .Opt_short r
 for correctly displaying control sequences is used as the default
@@ -2193,13 +2655,13 @@
 .\" --------------------------------------------------------------------
 .
 These modes use the
-.I groffer
+.I \%groffer
 file determination and decompression.
 .
 This is combined into a single input file that is fed directly into
-.I groff
+.B \%groff
 with different strategy without the
-.I groffer
+.I \%groffer
 viewing facilities.
 .
 These modes are regarded as advanced, they are useful for debugging
@@ -2208,15 +2670,21 @@
 .
 .P
 The
-.I source
-mode with just displays the generated input.
+.I \%source\~mode
+with option
+.Opt_short Q
+and
+.Opt_long source
+just displays the decompressed input.
 .
+.
+.P
 The
-.I groff
-mode passes the input to
-.I groff
+.I \%groff\~mode
+passes the input to
+.B \%groff
 using only some suitable options provided to
-.IR groffer .
+.BR \%groffer .
 .
 This enables the user to save the generated output into a file or pipe
 it into another program.
@@ -2224,90 +2692,115 @@
 .
 .P
 In
-.I groff
-mode, the option
+.IR \%groff\~\%mode ,
+the option
 .Opt_short Z
 disables post-processing, thus producing the
+.nh
 .I groff intermediate
 .IR output .
+.hy
 .
 In this mode, the input is formatted, but not postprocessed; see
-.BR groff_out (@MAN5EXT@)
+.BR \%groff_out (@MAN5EXT@)
 for details.
 .
 .
 .P
 All
-.I groff
+.B \%groff
 short options are supported by
-.IR groffer .
+.BR \%groffer .
 .
 .
 .\" --------------------------------------------------------------------
 .SH "MAN\~PAGE\~SEARCHING"
 .\" --------------------------------------------------------------------
 .
-The default behavior of groffer is to first test whether a file
-parameter represents a local file; if it is not an existing file name,
-it is assumed to represent a name of a man\~page.
+The default behavior of
+.B \%groffer
+is to first test whether a file parameter represents a local file; if
+it is not an existing file name, it is assumed to represent a name of
+a
+.IR \%man\~page .
 .
 This behavior can be modified by the following options.
 .
 .
 .TP
 .Opt_long man
-forces to interpret all file parameters as filespecs for searching
-man\~pages.
+forces to interpret all file parameters as
+.I \%filespecs
+for searching
+.IR \%man\~pages .
 .
 .TP
 .Opt_long no\-man
 .TP+
 .Opt_long local\-file
-disable the man searching; so only local files are displayed.
+disable the
+.I man
+searching; so only local files are displayed.
 .
 .
 .P
-If neither a local file nor a man\~page was retrieved for some file
-parameter a warning is issued on standard error, but processing is
-continued.
+If neither a local file nor a
+.I \%man\~page
+was retrieved for some file parameter a warning is issued on standard
+error, but processing is continued.
 .
 .
 .P
-The groffer program provides a search facility for man\~pages.
+The
+.B \%groffer
+program provides a search facility for
+.IR \%man\~pages .
 .
 All long options, all environment variables, and most of the
-functionality of the GNU
-.BR man (1)
+functionality of the \f[CR]GNU\f[]
+.BR \%man (1)
 program were implemented.
 .
-This inludes the extended file names of man\~pages, for example,
-the man\~page of
-.I groff
+This inludes the extended file names of
+.IR \%man\~pages ,
+for example, the
+.I \%man\~page
+of
+.B \%groff
 in man\~section 7 may be stored under
 .File_name /usr/share/man/man7/groff.7.gz ,
 where
 .File_name /usr/share/man/
 is part of the man\~path, the subdirectory
-.I man7
+.I \%man7
 and the file extension
 .I .7
 refer to the man\~section 7;
-.I .gz
+.I \%.gz
 shows the compression of the file.
 .
 .
 .P
 The
 .I cat\~pages
-(preformatted man\~pages) are intentionally excluded from the search
-because groffer is a roff program that wants to format by its own.
+(preformatted
+.IR \%man\~pages )
+are intentionally excluded from the search because
+.B \%groffer
+is a
+.I roff
+program that wants to format by its own.
 .
 With the excellent performance of the actual computers, the
-preformatted man\~pages aren't necessary any longer.
+preformatted
+.I \%man\~pages
+aren't necessary any longer.
 .
 .
 .P
-The algorithm for retrieving man\~pages uses five search methods.
+The algorithm for retrieving
+\I \%man\~pages
+uses five search methods.
 .
 They are successively tried until a method works.
 .
@@ -2315,7 +2808,9 @@
 .Topic
 The search path can be manually specified by using the option
 .Opt_long manpath .
-An empty argument disables the man\~page searching.
+An empty argument disables the
+.I \%man\~page
+searching.
 .
 This overwrites the other methods.
 .
@@ -2335,33 +2830,42 @@
 .Topic
 If this does not work a reasonable default path from
 .Env_var $PATH
-is searched for man\~pages.
+is searched for
+.IR \%man\~pages .
 .
 .
 .Topic
 If this does not work, the
-.BR manpath (1)
-program for determining a path of man directories is tried.
+.BR \%manpath (1)
+program for determining a path of
+.I man
+directories is tried.
 .
 .
 .P
 After this, the path elements for the language (locale) and operating
-system specific man\~pages are added to the man\~path; their sequence
-is determined automatically.
+system specific
+.I \%man\~pages
+are added to the
+.IR man\~path ;
+their sequence is determined automatically.
 .
 For example, both
-.I /usr/share/man/linux/fr
+.File_name /usr/share/man/linux/fr
 and
-.I /usr/share/man/fr/linux
-for french linux man\~pages are found.
+.File_name /usr/share/man/fr/linux
+for french linux
+.I \%man\~pages
+are found.
 .
 The language and operating system names are determined from both
 environment variables and command line options.
 .
 .
 .P
-The locale (language) is determined like in GNU man, that is from
-highest to lowest precedence:
+The locale (language) is determined like in \f[CR]GNU\f[]
+.BR man ,
+that is from highest to lowest precedence:
 .Topic
 .Opt_long locale
 .
@@ -2382,32 +2886,40 @@
 .
 .
 .P
-The language locale is usually specified in the POSIX 1003.1 based
-format:
+The language locale is usually specified in the
+\%\f[CR]POSIX\~1003.1\f[] based format:
 .P
+.nh
 \f[I]\f[][\f[CB]_\f[]\f[I]\f[][\f[CB].\f[]\
 \f[I]\f[][\f[CB],\f[]\f[I]\f[]]]],
+.hy
 .P
 but the two-letter code in
+.nh
 .I 
+.hy
 is sufficient for most purposes.
 .
 .
 .P
-If no man\~pages for a complicated locale are found the country part
-consisting of the first two characters (without the `\f[CB]_\f[]',
-`\f[CB].\f[]', and `\f[CB],\f[]', parts) of the locale is searched as
-well.
+If no
+.I \%man\~pages
+for a complicated locale are found the country part consisting of the
+first two characters (without the `\f[CB]_\f[]', `\f[CB].\f[]', and
+`\f[CB],\f[]' parts) of the locale is searched as well.
 .
 .
 .P
-If still not found the corresponding man\~page in the default language
-is used instead.
+If still not found the corresponding
+.I \%man\~page
+in the default language is used instead.
 .
 As usual, this default can be specified by one of \f[CR]C\f[] or
-\f[CR]POSIX\f[].
+\f[CR]\%POSIX\f[].
 .
-The man\~pages in the default language are usually in English.
+The
+.I \%man\~pages
+in the default language are usually in English.
 .
 .
 .P
@@ -2435,22 +2947,29 @@
 .
 .
 .P
-When searching for man\~pages this man\~path with the additional
-language and system specific directories is used.
+When searching for
+.I \%man\~pages
+this
+.I man\~path
+with the additional language and system specific directories is used.
 .
 .
 .P
 The search can further be restricted by limiting it to certain
 sections.
 .
-A single section can be specified within each filespec argument,
-several sections as a colon-separated list in command line option
+A single section can be specified within each
+.I \%filespec
+argument, several sections as a colon-separated list in command line
+option
 .Opt_long sections
 or environment variable
 .Env_var $MANSECT .
 .
 When no section was specified a set of standard sections is searched
-until a suitable man\~page was found.
+until a suitable
+.I \%man\~page
+was found.
 .
 .
 .P
@@ -2465,8 +2984,10 @@
 .
 .
 .P
-For further details on man\~page searching, see
-.BR man (1).
+For further details on
+.I \%man\~page
+searching, see
+.BR \%man (1).
 .
 .
 .\" --------------------------------------------------------------------
@@ -2477,16 +2998,16 @@
 .
 If standard input or a file that was retrieved from the command line
 parameters is compressed with a format that is supported by either
-.BR gzip (1)
+.BR \%gzip (1)
 or
-.BR bzip2 (1)
+.BR \%bzip2 (1)
 it is decompressed on-the-fly.
 .
-This includes the GNU
-.BR .gz ,
-.BR .bz2 ,
+This includes the \f[CR]GNU\f[]
+.BR \%.gz ,
+.BR \%.bz2 ,
 and the traditional
-.B .Z
+.B \%.Z
 compression.
 .
 The program displays the concatenation of all decompressed input in
@@ -2497,13 +3018,15 @@
 .SH "ENVIRONMENT"
 .\" --------------------------------------------------------------------
 .
-The groffer programs supports many system variables, most of them by
-courtesy of other programs.
+The
+.B \%groffer
+program supports many system variables, most of them by courtesy of
+other programs.
 .
 All environment variables of
-.BR groff (@MAN1EXT@)
-and GNU
-.BR man (1)
+.BR \%groff (@MAN1EXT@)
+and \f[CR]GNU\f[]
+.BR \%man (1)
 and some standard system variables are honored.
 .
 .
@@ -2513,7 +3036,8 @@
 .
 .TP
 .Env_var $GROFFER_OPT
-Store options for a run of groffer.
+Store options for a run of
+.BR \%groffer .
 .
 The options specified in this variable are overridden by the options
 given on the command line.
@@ -2522,33 +3046,43 @@
 so arguments containing white-space or special shell characters should
 be quoted.
 .
+Do not forget to export this variable, otherwise it does not exist
+during the run of
+.BR groffer .
+.
 .
 .\" --------------------------------------------------------------------
 .SS "System Variables"
 .\" --------------------------------------------------------------------
 .
-The groffer program is a shell script that is run through
-.BR /bin/sh ,
+The
+.B \%groffer
+program is a shell script that is run through
+.File_name /bin/sh ,
 which can be internally linked to programs like
-.BR bash (1).
+.BR \%bash (1).
 The corresponding system environment is automatically effective.
 .
-The following variables have a special meaning for groffer.
+The following variables have a special meaning for
+.BR \%groffer .
 .
 .
 .TP
 .Env_var $DISPLAY
-If this variable is set this indicates that the X Window system is
-running.
+If this variable is set this indicates that the \%\f[CR]X\~Window\f[]
+system is running.
 .
 Testing this variable decides on whether graphical or text output is
 generated.
 .
 This variable should not be changed by the user carelessly, but it can
-be used to start the graphical groffer on a remote X terminal.
-.
-For example, depending on your system, groffer can be started on the
-second monitor by the command
+be used to start the graphical
+.B \%groffer
+on a remote \%\f[CR]X\~Window\f[] terminal.
+.
+For example, depending on your system,
+.B \%groffer
+can be started on the second monitor by the command
 .Shell_cmd DISPLAY=:0.1\~groffer\~ what.ever &
 .
 .
@@ -2560,9 +3094,11 @@
 .Env_var $LANG
 If one of these variables is set (in the above sequence), its content
 is interpreted as the locale, the language to be used, especially when
-retrieving man\~pages.
+retrieving
+\IR \%man\~pages .
 .
 A locale name is typically of the form
+.nh
 .IR language [\c
 .B _\c
 .IR territory [\c
@@ -2570,22 +3106,21 @@
 .IR codeset [\c
 .B @\c
 .IR modifier ]]],
+.hy
 where
-.I language
+.I \%language
 is an ISO 639 language code,
-.I territory
+.I \%territory
 is an ISO 3166 country code, and
-.I codeset
+.I \%codeset
 is a character set or encoding identifier like ISO-8859-1 or UTF-8;
 see
-.BR setlocale (3).
+.BR \%setlocale (3).
 .
-The locale values\~\c
-.B C
-and
-.B POSIX
-stand for the default, i.e. the man\~page directories without a
-language prefix.
+The locale values \f[CR]C\f[] and \%\f[CR]POSIX\f[]
+stand for the default, i.e. the
+.I \%man\~page
+directories without a language prefix.
 .
 This is the same behavior as when all 3\~variables are unset.
 .
@@ -2596,65 +3131,77 @@
 .
 For example, to disable the use of a pager completely set this
 variable to the
-.BR cat (1)
+.BR \%cat (1)
 program
 .Shell_cmd PAGER=cat\~groffer\~ anything
 .
 .
 .TP
 .Env_var $PATH
-All programs within the groffer shell script are called without a
-fixed path.
+All programs within the
+.B \%groffer
+shell script are called without a fixed path.
 .
 Thus this environment variable determines the set of programs used
-within the run of groffer.
-.
-.
-.TP
-.Env_var $POSIXLY_CORRECT
-If set to a non-empty value this chooses the POSIX mode for option
-processing, that means that option processing will be finished as soon
-as a non-option argument is found.
-.
-Usually, you do not want to set this environment variable.
+within the run of
+.BR \%groffer .
 .
 .
 .\" --------------------------------------------------------------------
 .SS "Groff Variables"
 .\" --------------------------------------------------------------------
 .
-The groffer program internally calls groff, so all environment
-variables documented in
-.BR groff (@MAN1EXT@)
-are internally used within groffer as well.
+The
+.B \%groffer
+program internally calls
+.BR \%groff ,
+so all environment variables documented in
+.BR \%groff (@MAN1EXT@)
+are internally used within
+.B \%groffer
+as well.
 .
-The following variables have a direct meaning for the groffer program.
+The following variable has a direct meaning for the
+.B \%groffer
+program.
 .
 .TP
 .Env_var $GROFF_TMPDIR
 If the value of this variable is an existing, writable directory,
-groffer uses it for storing its temporary files, just as groff does.
+.B \%groffer
+uses it for storing its temporary files, just as
+.B groff
+does.
 .
 .
 .\" --------------------------------------------------------------------
 .SS "Man Variables"
 .\" --------------------------------------------------------------------
 .
-Parts of the functionality of the man\~program were implemented in
-groffer; support for all environment variables documented in
-.BR man (1)
-was added to groffer, but the meaning was slightly modified due to the
-different approach in groffer; but the user interface is the same.
+Parts of the functionality of the
+.B man
+program were implemented in
+.BR \%groffer ;
+support for all environment variables documented in
+.BR \%man (1)
+was added to
+.BR \%groffer ,
+but the meaning was slightly modified due to the different approach in
+.BR \%groffer ;
+but the user interface is the same.
 .
-The man environment variables can be overwritten by options provided
-with
+The
+.B man
+environment variables can be overwritten by options provided with
 .Env_var $MANOPT ,
 which in turn is overwritten by the command line.
 .
 .
 .TP
 .Env_var $EXTENSION
-Restrict the search for man\~pages to files having this extension.
+Restrict the search for
+.I \%man\~pages
+to files having this extension.
 .
 This is overridden by option
 .Opt_long extension ;
@@ -2664,12 +3211,14 @@
 .TP
 .Env_var $MANOPT
 This variable contains options as a preset for
-.BR man (1).
-As not all of these are relevant for groffer only the essential parts
-of its value are extracted.
+.BR \%man (1).
+As not all of these are relevant for
+.B \%groffer
+only the essential parts of its value are extracted.
 .
 The options specified in this variable overwrite the values of the
-other environment variables taht are specific to man.
+other environment variables that are specific to
+.IR man .
 .
 All options specified in this variable are overridden by the options
 given on the command line.
@@ -2677,7 +3226,8 @@
 .
 .TP
 .Env_var $MANPATH
-If set, this variable contains the directories in which the man\~page
+If set, this variable contains the directories in which the
+.I \%man\~page
 trees are stored.
 .
 This is overridden by option
@@ -2687,7 +3237,8 @@
 .TP
 .Env_var $MANSECT
 If this is a colon separated list of section names, the search for
-man\~pages is restricted to those manual sections in that order.
+.I \%man\~pages
+is restricted to those manual sections in that order.
 .
 This is overridden by option
 .Opt_long sections .
@@ -2696,7 +3247,9 @@
 .TP
 .Env_var $SYSTEM
 If this is set to a comma separated list of names these are interpreted
-as man\~page trees for different operating systems.
+as
+.I \%man\~page
+trees for different operating systems.
 .
 This variable can be overwritten by option
 .Opt_long systems ;
@@ -2706,8 +3259,9 @@
 .P
 The environment variable
 .Env_var $MANROFFSEQ
-is ignored by groffer because the necessary preprocessors are
-determined automatically.
+is ignored by
+.B \%groffer
+because the necessary preprocessors are determined automatically.
 .
 .
 .\" --------------------------------------------------------------------
@@ -2715,51 +3269,81 @@
 .\" --------------------------------------------------------------------
 .
 The
-.I groffer
+.B \%groffer
 program can be preconfigured by two configuration files.
 .
-This configuration can be overridden at each program start by command
-line options or by the environment variable
-.Env_var $GROFFER_OPT .
-.
 .
 .TP
 .File_name /etc/groff/groffer.conf
-System-wide configuration file for groffer.
+System-wide configuration file for
+.BR \%groffer .
 .
 .
 .TP
 .File_name $HOME/.groff/groffer.conf
-User-specific configuration file for groffer, where
+User-specific configuration file for
+.BR \%groffer ,
+where
 .Env_var $HOME
 denotes the user's home directory.
 .
-This script is called after the system-wide configuration file to
-enable overriding by the user.
+This file is called after the system-wide configuration file to enable
+overriding by the user.
+.
+.
+.P
+The precedence of option delivery is given in the following.
+.
+The configuration file in
+.File_name /etc
+has the lowest precedence; it is overwritten by the configuration file
+in the home directory; both configuration files are overwritten by the
+environment variable
+.Env_var $GROFFER_OPT ;
+everything is overwritten by the command line.
 .
 .
 .P
-Their lines either start with a minus character or are shell commands.
+In the configuration files, arbitrary spaces are allowed at the
+beginning of each line, they are just ignored.
+.
+Apart from that, the lines of the configuration lines either start
+with a minus character, all other lines are interpreted as shell
+commands.
 .
-Arbitrary spaces are allowed at the beginning, they are just ignored.
 .
-The lines with the beginning minus are appended to the existing value
-of $GROFFER_OPT.
+.P
+The lines with the beginning minus are interpreted as
+.B groffer
+options.
 .
 This easily allows to set general
-.I groffer
-options that are used with any call of
-.IR groffer .
+.B \%groffer
+options that should be used with any call of
+.BR \%groffer .
+.
+Each line can represent a single short option, a short option cluster,
+or a long option with two minus signs, eventually with an argument.
+.
+The argument can be appended either after a space character or an
+equal sign
+.RB ` = '.
+The argument can be surrounded by quotes, but this is not necessary.
+.
+The options from these lines are collected and prepended to the
+existing value of
+.Env_var $GROFFER_OPT
+at the end of each configuration file.
 .
 .
 .P
-After the transformation of the minus lines the emerging shell scripts
-that are called by
-.I groffer
+After the transformation of the minus lines, the configuration files
+have been transferred into a shell script that is called within
+.B \%groffer
 using the `\c
-.CB .\~\c
-.IR filename '
-syntax.
+.CB \.\~\c
+.IR \%filename '
+shell syntax.
 .
 .
 .P
@@ -2767,28 +3351,38 @@
 tasks:
 .
 .Topic
-Preset command line options by writing them into lines starting with a
-minus sign.
+Preset command line options, such as choosing a
+.I \%mode
+or a viewer.
+.
+These are written into lines starting with a single or double minus
+sign, followed by the option name.
 .
 .Topic
-Preset environment variables recognized by groffer.
+Preset environment variables recognized by
+.BR \%groffer ;
+but do not forget to export them.
 .
 .Topic
-Write a function for calling a viewer program for a special
-.I mode
-and feed this name into its corresponding
+You can also write a shell function for calling, for example a viewer
+program for some
+.IR \%mode .
+Such a function can be fed into a corresponding
 .Opt_long \f[I]mode\f[]\-viewer
 option.
 .
-Note that the name of such a function must coincide with some existing
-program in the system path
-.Env_var $PATH
-in order to be recognized by groffer.
+.Topic
+Enter
+.Opt_long shell
+to specify a shell for the run of
+.File_name groffer2.sh .
+Some shells run much faster than the standard shell.
 .
 .
 .P
 As an example, consider the following configuration file in
-~/.groff/groffer.conf, say.
+.File_name ~/.groff/groffer.conf ,
+say.
 .
 .P
 .ft CR
@@ -2797,13 +3391,14 @@
 # groffer configuration file
 #
 # groffer options that are used in each call of groffer
---resolution=100
---foreground=DarkBlue
---x-viewer 'gxditview -geometry 850x800'
+\-\-shell=ksh
+\-\-foreground=DarkBlue
+\-\-resolution=100
+\-\-x\-viewer='gxditview \-geometry 900x1200'
 #
 # some shell commands
 if test "$DISPLAY" = ""; then
-  DISPLAY='localhost:0.0'
+  export DISPLAY='localhost:0.0'
 fi
 date >>~/mygroffer.log
 .fi
@@ -2812,55 +3407,76 @@
 .
 .
 .P
-This configuration sets three
-.I groffer
-options and runs two shell commands.
+The lines starting with
+.B #
+are command lines.
+.
+This configuration sets four
+.B \%groffer
+options (the lines starting with `\-') and runs two shell commands (the
+rest of the script).
 .
 This has the following effects:
 .
 .
 .Topic
-Lines starting with a 
-.B #
-character
-are 
+Use
+.B ksh
+as the shell to run the
+.B \%groffer
+script; if it works it should be faster than the usual
+.BR sh .
+.
+.
+.Topic
+Use a text color of
+.B \%DarkBlue
+in all viewers that support this, such as
+.BR \%gxditview .
 .
 .
 .Topic
 Use a resolution of
-.B 100 dpi
-and a text color of
-.B DarkBlue
-in all viewers that support this.
+.B 100\~dpi
+in all viewers that support this, such as
+.BR \%gxditview .
+.
+By this, the default device in
+.I x mode
+is set to
+.BR X100 .
 .
 .
 .Topic
 Force
-.BR gxditview (@MAN1EXT@)
-as the X-mode viewer using the geometry option for setting the width
-to
-.B 850 dpi
+.BR \%gxditview (@MAN1EXT@)
+as the
+.I \%x-mode
+viewer using the geometry option for setting the width to
+.B 900\~dpi
 and the height to
-.B 800
-.BR dpi .
+.BR 1200\~dpi .
+This geometry is suitable for a resolution of
+.BR 100\~dpi .
 .
 .
 .Topic
-The variable
+If the environment variable
 .Env_var $DISPLAY
-is set to
-.IR localhost:0.0
-which allows to start
-.I groffer
-in the standard X display, even when the program is called from a text
-console.
+is empty set it to
+.IR localhost:0.0 .
+.
+That allows to start
+.B \%groffer
+in the standard \%\f[CR]X\~Window\f[] display, even when the program
+is called from a text console.
 .
 .
 .Topic
 Just for fun, the date of each
-.I groffer
+.B \%groffer
 start is written to the file
-.B mygroffer.log
+.File_name mygroffer.log
 in the home directory.
 .
 .
@@ -2868,44 +3484,54 @@
 .SH "EXAMPLES"
 .\" --------------------------------------------------------------------
 .
-The usage of groffer is very easy.
-.
-Usually, it is just called with a file name or man\~page.
-.
-The following examples, however, show that groffer has much more fancy
-capabilities.
+The usage of
+.B \%groffer
+is very easy.
+.
+Usually, it is just called with a file name or
+.IR \%man\~page .
+.
+The following examples, however, show that
+.B \%groffer
+has much more fancy capabilities.
 .
 .
 .TP
 .Shell_cmd "groffer\~/usr/local/share/doc/groff/meintro.ms.gz"
 Decompress, format and display the compressed file
-.I meintro.ms.gz
+.File_name meintro.ms.gz
 in the directory
-.IR /usr/local/share/doc/groff ,
-using
-.I gxditview
-as graphical viewer when in X Window, or the
-.BR less (1)
-pager program when not in X.
+.File_name /usr/local/share/doc/groff ,
+using the standard viewer
+.B \%gxditview
+as graphical viewer when in \%\f[CR]X\~Window\f[], or the
+.BR \%less (1)
+pager program when not in \%\f[CR]X\~Window\f[].
 .
 .
 .TP
 .Shell_cmd "groffer\~groff"
 If the file
-.I ./groff
+.File_name \%./groff
 exists use it as input.
 .
-Otherwise interpret the argument as a search for the man\~page named
-.I groff
-in the smallest possible man\~section, being secion 1 in this case.
+Otherwise interpret the argument as a search for the
+.I \%man\~page
+named
+.B \%groff
+in the smallest possible
+.IR \%man\~section ,
+being section 1 in this case.
 .
 .
 .TP
 .Shell_cmd "groffer\~man:groff"
-search for the man\~page of
-.I groff
+search for the
+.I \%man\~page
+of
+.B \%groff
 even when the file
-.I ./groff
+.File_name ./groff
 exists.
 .
 .
@@ -2913,9 +3539,12 @@
 .Shell_cmd "groffer\~groff.7"
 .TP+
 .Shell_cmd "groffer\~7\~groff"
-search the man\~page of
-.I groff
-in man\~section
+search the
+.I \%man\~page
+of
+.B \%groff
+in
+.I \%man\~section
 .BR 7 .
 This section search works only for a digit or a single character from
 a small set.
@@ -2924,31 +3553,36 @@
 .TP
 .Shell_cmd "groffer\~fb.modes"
 If the file
-.I ./fb.modes
-does not exist interpret this as a search for the man\~page of
-.IR fb.modes .
+.File_name ./fb.modes
+does not exist interpret this as a search for the
+.I \%man\~page
+of
+.BR fb.modes .
 As the extension
-.I modes
+.I \%modes
 is not a single character in classical section style the argument is
 not split to a search for
-.IR fb .
+.BR fb .
 .
 .
 .TP
 .Shell_cmd "groffer\~groff\~\[cq]troff(1)\[cq]\~man:roff"
 .
 The arguments that are not existing files are looked-up as the
-following man\~pages:
-.I groff
-(automatic search, should be found in man\~section\~1),
-.I troff
+following
+.IR \%man\~pages :
+.B \%groff
+(automatic search, should be found in \fIman\fP\~section\~1),
+.B \%troff
 (in section\~1),
 and
-.I roff
+.B \%roff
 (in the section with the lowest number, being\~7 in this case).
 .
 The quotes around
+.nh
 .I \[cq]troff(1)\[cq]
+.hy
 are necessary because the paranthesis are special shell characters;
 escaping them with a backslash character
 .I \[rs](
@@ -2960,44 +3594,55 @@
 .
 .
 .TP
-.Shell_cmd "LANG=de\~groffer\~--man\~--www\~--www-viever=mozilla\~ls"
+.Shell_cmd "LANG=de\~groffer\~--man\~--www\~--www-viever=galeon\~ls"
 .
-Retrieve the German man\~page (language
+Retrieve the German
+.I \%man\~page
+(language
 .IR de )
 for the
 .B ls
 program, decompress it, format it to
-.I html
+.I \%html
 format
-.RI ( www
-mode) and view the result in the web browser
-.I galeon .
+.nh
+.RI ( \%www\~mode )
+.hy
+and view the result in the web browser
+.BR \%galeon .
 The option
 .Opt_long man
-guarantees that the man\~page is retrieved, even when a local file
-.I ls
+guarantees that the
+.I \%man\~page
+is retrieved, even when a local file
+.File_name \%ls
 exists in the actual directory.
 .
 .
 .TP
 .Shell_cmd "groffer\~--source\~'man:roff(7)'"
 .
-Get the man\~page called
-.I roff
-in man\~section 7, decompress it, and print its unformatted content,
-its source code.
+Get the
+.I \%man\~page
+called
+.I \%roff
+in \fIman\fP\~section 7, decompress it, and print its unformatted
+content, its source code.
 .
 .
 .TP
 .Shell_cmd "cat\~file.gz\~|\~groffer\~-Z\~-mfoo"
 .
 Decompress the standard input, send this to
-.I groff
-intermediate mode without post-processing (groff option
+.I \%groff intermediate output mode
+without post-processing
+.RB ( groff
+option
 .Opt_short Z ),
 using macro package by
-.I foo
-(groff option
+.I \%foo
+.RB ( groff
+option
 .Opt_short m ) .
 .
 .
@@ -3015,86 +3660,109 @@
 .\" --------------------------------------------------------------------
 .
 The
-.B groffer
-shell script is compatible with both GNU and POSIX.
-.
-POSIX compatibility refers to
-.B IEEE P1003.2/D11.2
-of September 1991, a very early version of the POSIX standard that is
-still freely available in the internet.
-.
-Unfortunately, this version of the standard has `local' for shell
-function variables removed.
-.
-As `local' is needed for serious programming this temporary POSIX
-deprecation was ignored.
+.B \%groffer
+program consists of two shell scripts.
 .
 .
 .P
-Most GNU shells are compatible with this interpretation of POSIX, but
-provide much more facilities.
+The starting script is the file
+.File_name \%groffer
+that is installed in a
+.File_name bin
+directory.
 .
-Nevertheless this script uses only a restricted set of shell language
-elements and shell builtins, such that it can be run on `ash', a GNU
-shell that is quite fast, but has a slightly limited shell language.
+It is generated from the source file
+.File_name \%groffer.sh .
 .
-The groffer script should work on most actual free and commercial
-operating systems.
+It is just a short starting script without any functions such that it
+can run on very poor shells.
 .
 .
 .P
-The groffer program provides its own parser for command line options;
-it can handle option arguments and file names containing white space
-and a large set of special characters.
+The main part of the
+.B \%groffer
+program is the file
+.File_name groffer2.sh
+that is installed in the
+.I groff
+library directory.
+.
+This script can be run under a different shell by using the
+.B \%groffer
+option
+.Opt_long shell .
 .
 .
 .P
-The groffer shell script was tested with the following common
-implementations of the GNU shells:
-.BR ash (1),
-POSIX
-.BR sh (1),
-.BR bash (1),
-and others.
+Both scripts are compatible with both
+\f[CR]GNU\f[] and \%\f[CR]POSIX\f[].
 .
-Free POSIX compatible shells and shell utilities for most operating
-systems are available at the
-.URL http://\:www.gnu.org/software/ "GNU software archive" .
+\%\f[CR]POSIX\f[] compatibility refers to
+\%\f[CR]IEEE\~P1003.2/D11.2\f[] of September 1991, a very early
+version of the \%\f[CR]POSIX\f[] standard that is still freely
+available in the internet at
+.URL http://\:www.funet.fi/\:pub/\:doc/\:posix/\:p1003.2/\:d11.2/\:all \
+"\%POSIX\~P1003.2\~draft\~11.2" .
 .
 .
 .P
-The best performance was obtained with the
-.I ash
-shell; so
-.I groffer
-tries to run under
-.I ash
-whenever possible.
+Only a restricted set of shell language elements and shell builtins is
+used to achieve even compatibility with some Bourne shells that are
+not fully \%\f[CR]POSIX\f[] compatible.
 .
-If
-.I ash
-is not available the shell under which the script was started in the
-first place is used instead.
+The
+.B \%groffer
+shell scripts were tested on many shells, including the following
+Bourne shells:
+.BR \%ash (1),
+.BR \%bash (1),
+.BR \%dash (1),
+.BR \%ksh (1),
+.BR \%pdksh (1),
+.BR \%posh (1),
+and
+.BR \%zsh (1).
+So it should work on most actual free and commercial operating
+systems.
 .
-This can be modified by the option
+.
+.P
+The shell for the run of
+.File_name groffer2.sh
+can be chosen by the option
+.Opt_long shell
+on the command line or the environment variable
+.Env_var $GROFF_OPT .
+If you want to add it to one of the
+.B \%groffer
+configuration files you must write a line starting with
 .Opt_long shell .
 .
 .
 .P
-The groffer program provides its own parser for command line arguments
-that is compatible to both POSIX
-.BR getopts (1)
-and GNU
-.BR getopt (1)
-except for shortcuts of long options.
+The
+.B \%groffer
+program provides its own parser for command line arguments that is
+compatible to both \%\f[CR]POSIX\f[]
+.BR \%getopts (1)
+and \%\f[CR]GNU\f[]
+.BR \%getopt (1).
+It can handle option arguments and file names containing white space
+and a large set of special characters.
 .
 The following standard types of options are supported.
 .
 .
 .Topic
-A single minus always refers to single character option or a
-combination thereof, for example, the
-.I groffer
+The option consisiting of a single minus
+.Opt_short
+refers to standard input.
+.
+.
+.Topic
+A single minus followed by characters refers to a single character
+option or a combination thereof; for example, the
+.B \%groffer
 short option combination
 .Opt_short Qmfoo
 is equivalent to
@@ -3103,7 +3771,7 @@
 .
 .Topic
 Long options are options with names longer than one character; they
-are always prededed by a double minus.
+are always preceded by a double minus.
 .
 An option argument can either go to the next command line argument or
 be appended with an equal sign to the argument; for example,
@@ -3116,161 +3784,232 @@
 An argument of
 .Opt_--
 ends option parsing; all further command line arguments are
-interpreted as file name arguments.
+interpreted as
+.I \%filespec
+parameters, i.e. file names or constructs for searching
+.IR \%man\~pages ).
 .
 .
 .Topic
-By default, all command line arguments that are neither options nor
-option arguments are interpreted as filespec parameters and stored
-until option parsing has finished.
+All command line arguments that are neither options nor option
+arguments are interpreted as
+.I \%filespec
+parameters and stored until option parsing has finished.
 .
 For example, the command line
 .Shell_cmd "groffer file1 -a -o arg file2"
-is, by default, equivalent to
+is equivalent to
 .Shell_cmd "groffer -a -o arg -- file1 file2"
 .
 .
 .P
-This behavior can be changed by setting the environment variable
-.Env_var $POSIXLY_CORRECT
-to a non-empty value.
-.
-Then the strange POSIX non-option behavior is adopted, i. e. option
-processing is stopped as soon as the first non-option argument is
-found and each following argument is taken as a file name.
+The free mixing of options and
+.I \%filespec
+parameters follows the GNU principle.
 .
-For example, in posixly correct mode, the command line
-.Shell_cmd "groffer file1 -a -o arg file 2"
-is equivalent to
-.Shell_cmd "groffer -- file1 -a -o arg file 2"
-As this leads to unwanted behavior in most cases, most people do not
-want to set
-.Env_var $POSIXLY_CORRECT .
+That does not fulfill the strange option behavior of \%\f[CR]POSIX\f[]
+that ends option processing as soon as the first non-option argument
+has been reached.
+.
+The end of option processing can be forced by the option
+.RB ` \-\- '
+anyway.
 .
 .
 .\" --------------------------------------------------------------------
-.SH "SEE ALSO"
+.SH "BUGS"
 .\" --------------------------------------------------------------------
 .
-.TP
-.BR groff (@MAN1EXT@)
-.TP+
-.BR troff (@MAN1EXT@)
-Details on the options and environment variables available in
-.IR groff ;
-all of them can be used with groffer.
+Report bugs to the
+.MTO bug-groff@gnu.org "bug-groff mailing list" .
 .
+Include a complete, self-contained example that will allow the bug to
+be reproduced, and say which version of
+.B \%groffer
+you are using.
 .
-.TP
-.BR man (1)
-The standard program to diplay man\~pages.
 .
-The information there is only useful if it is the man\~page for
-.IR "GNU\~man" .
-Then it documents the options and environment variables that are
-supported by groffer.
+.P
+You can also use the
+.MTO groff@gnu.org "groff mailing list" ,
+but you must first subscribe to this list.
 .
+You can do that by visiting the
+.URL http://\:lists.gnu.org/\:mailman/\:listinfo/\:groff \
+"groff mailing list web page" .
 .
-.TP
-.BR gxditview (@MAN1EXT@)
-.TP+
-.BR xditview (1x)
-Viewers for groffer's
-.I x
-mode.
 .
+.P
+See
+.BR \%groff (@MAN1EXT@)
+for information on availability.
 .
-.TP
-.BR gv (1)
-.TP+
-.BR ghostview (1)
-Viewers for groffer's
-.I ps
-mode.
 .
+.\" --------------------------------------------------------------------
+.SH "SEE ALSO"
+.\" --------------------------------------------------------------------
 .
-.TP+
-.BR gs (1)
-Transformer from
-.I ps
-to
-.IR pdf ;
-and a
-.I ps
-viewer.
+.P
+.BR \%groff (@MAN1EXT@),
+.BR \%@g@troff (@MAN1EXT@)
+.RS
+Details on the options and environment variables available in
+.BR \%groff ;
+all of them can be used with
+.BR \%groffer .
+.RE
 .
 .
 .TP
-.BR xpdf (1)
-Viewers for
-.I pdf
-files.
+.BR \%groff (@MAN7EXT@)
+Documentation of the
+.I \%groff
+language.
 .
 .
 .TP
-.BR xdvi (1)
-.TP+
-.BR dvilx (1)
-Viewers for groffer's
-.I dvi
-mode.
+.BR \%grog (@MAN1EXT@)
+Internally,
+.B \%groffer
+tries to guess the
+.B \%groff
+command line options from the input using this program.
 .
 .
 .TP
-.BR less (1)
-Standard pager program for the
-.I tty
-.IR mode .
+.BR groff_out (@MAN5EXT@)
+Documentation on the
+.I \%groff intermediate output
+.nh
+.RI ( ditroff
+output).
+.hy
 .
 .
 .TP
-.BR gzip (1)
-.TP+
-.BR bzip2 (1)
-The decompression programs supported by groffer.
+.BR groff_tmac (@MAN5EXT@)
+Documentation on the
+.I \%groff
+macro files.
 .
 .
 .TP
-.BR groff (@MAN7EXT@)
-Documentation of the
-.I groff
-language.
+.BR \%man (1)
+The standard program to display
+.IR \%man\~pages .
 .
+The information there is only useful if it is the
+.I \%man\~page
+for GNU
+.BR man .
+Then it documents the options and environment variables that are
+supported by
+.BR \%groffer .
 .
-.TP
-.BR grog (@MAN1EXT@)
-Internally, groffer tries to guess the groff command line options from
-the input using this program.
 .
+.P
+.BR \%ash (1),
+.BR \%bash (1),
+.BR \%dash (1),
+.BR \%ksh (1),
+.BR \%pdksh (1),
+.BR \%posh (1),
+.BR \%sh (1),
+.BR \%zsh (1)
+.RS
+Bourne shells that were tested with
+.BR \%groffer .
+.RE
 .
-.TP
-.BR groff_out (@MAN5EXT@)
-Documentation on the groff intermediate output (ditroff output).
 .
+.P
+.BR \%gxditview (@MAN1EXT@),
+.BR \%xditview (1x)
+.RS
+Viewers for
+.BR \%groffer 's
+.IR \%x\~mode .
+.RE
 .
-.\" --------------------------------------------------------------------
-.SH "AUTHOR"
-.\" --------------------------------------------------------------------
 .
-Copyright (C) 2001,2002,2004 Free Software Foundation, Inc.
+.P
+.BR \%kghostview (1),
+.BR \%ggv (1),
+.BR \%gv (1),
+.BR \%ghostview (1),
+.BR \%gs (1)
+.RS
+Viewers for
+.BR \%groffer 's
+.IR \%ps\~mode .
+.RE
+.
 .
 .P
-This document is distributed under the terms of the FDL (GNU Free
-Documentation License) version 1.1 or later.
+.BR \%kghostview (1),
+.BR \%ggv (1),
+.BR \%xpdf (1),
+.BR \%acroread (1),
+.BR \%kpdf (1)
+.RS
+Viewers for
+.BR \%groffer 's
+.IR \%pdf\~mode .
+.RE
 .
-You should have received a copy of the FDL on your system, it is also
-available on-line at the
-.URL http://\:www.gnu.org/\:copyleft/\:fdl.html "GNU copyleft site" .
 .
 .P
-This document is part of
-.IR groff ,
-the GNU roff distribution.
+.BR \%kdvi (1),
+.BR \%xdvi (1),
+.BR \%dvilx (1)
+.RS
+Viewers for
+.BR \%groffer 's
+.IR \%dvi\~mode .
+.RE
+.
+.
+.P
+.BR \%konqueror (1),
+.BR \%mozilla (1),
+.BR \%lynx (1)
+.RS
+Web-browsers for
+.BR \%groffer 's
+.I \%html
+or
+.IR \%www\~mode .
+.RE
+.
+.
+.TP
+.BR \%less (1)
+Standard pager program for the
+.I \%tty\~mode .
+.
 .
-It was written by Bernd Warken.
+.P
+.BR \%gzip (1),
+.BR \%bzip2 (1)
+.RS
+The decompression programs supported by
+.BR \%groffer .
+.RE
 .
 .
-\" --------------------------------------------------------------------
+.\" --------------------------------------------------------------------
+.SH "AUTHOR"
+.\" --------------------------------------------------------------------
+.author
+.
+.
+.\" --------------------------------------------------------------------
+.SH "COPYING"
+.\" --------------------------------------------------------------------
+.copyleft
+.
+.
+.\" --------------------------------------------------------------------
 .\" Emacs settings
 .\" --------------------------------------------------------------------
 .
diff -ruN groff-1.19.1/contrib/groffer/groffer.sh groff-1.19.2/contrib/groffer/groffer.sh
--- groff-1.19.1/contrib/groffer/groffer.sh	2004-05-04 07:03:01.000000000 +0200
+++ groff-1.19.2/contrib/groffer/groffer.sh	2005-08-23 00:08:40.000000000 +0200
@@ -1,4535 +1,299 @@
-#!/bin/sh
+#! /bin/sh
 
 # groffer - display groff files
 
 # Source file position: /contrib/groffer/groffer.sh
 
-# Copyright (C) 2001,2002,2003,2004 Free Software Foundation, Inc.
+# Copyright (C) 2001,2002,2003,2004,2005
+# Free Software Foundation, Inc.
 # Written by Bernd Warken
 
-# This file is part of groff version @VERSION@.
+# This file is part of `groffer', which is part of `groff' version
+# @VERSION@.  See $_GROFF_VERSION.
 
-# groff is free software; you can redistribute it and/or modify it
+# `groff' 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.
 
-# groff 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.
+# `groff' 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 groff; see the files COPYING and LICENSE in the top
-# directory of the groff source.  If not, write to the Free Software
-# Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
-_PROGRAM_NAME='groffer';
-_PROGRAM_VERSION='0.9.7';
-_LAST_UPDATE='30 Apr 2004';
-
-
-########################################################################
-# Determine the shell under which to run this script;
-# if `ash' is available restart the script using `ash';
-# otherwise just go on.
-
-if test "${_groffer_run}" = ''; then
-  # only reached during the first run of the script
-
-  export _PROGRAM_NAME;
-  export _PROGRAM_VERSION;
-  export _LAST_UPDATE;
-
-  export GROFFER_OPT;		# option environment for groffer
-  export _GROFFER_SH;		# file name of this shell script
-  export _OUTPUT_FILE_NAME;	# output generated, see main_set_res..()
-  export _groffer_run;		# counter for the runs of groffer
-
-  _groffer_run='first';
-
-  case "$0" in
-  *${_PROGRAM_NAME}*)
-    _GROFFER_SH="$0";
-    # was: _GROFFER_SH="@BINDIR@/${_PROGRAM_NAME}";
-    ;;
-  *)
-    echo "The ${_PROGRAM_NAME} script should be started directly." >&2
-    exit 1;
-    ;;
-  esac;
-
-  ###########################
-  # _get_opt_shell ("$@")
-  #
-  # Determine whether `--shell' was specified in $GROFF_OPT or in $*;
-  # if so echo its argument.
-  #
-  _get_opt_shell()
-  {
-    local i;
-    local _sh;
-    case " ${GROFFER_OPT} $*" in
-      *\ --shell\ *|*\ --shell=*)
-        (
-          eval set -- "${GROFFER_OPT}" '"$@"';
-          _sh='';
-          for i in "$@"; do
-            case "$1" in
-              --shell)
-                if test "$#" -ge 2; then
-                  _sh="$2";
-                  shift;
-                fi;
-                ;;
-              --shell=?*)
-                # delete up to first `=' character
-                _sh="$(echo -n "$1" | sed -e 's/^[^=]*=//')";
-                ;;
-            esac;
-            shift;
-          done;
-          echo -n "${_sh}";
-        )
-        ;;
-    esac;
-  }
-
-
-  ###########################
-  # _test_on_shell ()
-  #
-  # Test whether  is a shell program of Bourne type (POSIX sh).
-  #
-  _test_on_shell()
-  {
-    if test "$#" -le 0 || test "$1" = ''; then
-      return 1;
-    fi;
-    # do not quote $1 to allow arguments
-    test "$($1 -c 's=ok; echo -n "$s"' 2>/dev/null)" = 'ok';
-  }
-
-  # do the shell determination
-  _shell="$(_get_opt_shell "$@")";
-  if test "${_shell}" = ''; then
-    _shell='ash';
-  fi;
-  if _test_on_shell "${_shell}"; then
-    _groffer_run='second';
-    # do not quote $_shell to allow arguments
-    exec ${_shell} "${_GROFFER_SH}" "$@";
-    exit;
-  fi;
-
-  # clean-up of shell determination
-  unset _shell;
-  unset _GROFFER_SH;
-  unset _groffer_run;
-  _get_opt_shell()
-  {
-    return 0;
-  }
-  _test_on_shell()
-  {
-    return 0;
-  }
-
-fi; # end of first run
-
-if test "${_groffer_run}" != 'second';
-then
-  echo "$_groffer_run should be 'second' here." >&2
-  exit 1
-fi;
-unset _groffer_run
-
-
-########################################################################
-# diagnostic messages
-#
-export _DEBUG;
-_DEBUG='no';			# disable debugging information
-#_DEBUG='yes';			# enable debugging information
-
-export _DEBUG_LM;
-_DEBUG_LM='no';			# disable landmark messages
-#_DEBUG_LM='yes';		# enable landmark messages
-
+# along with `groff'; see the files COPYING and LICENSE in the top
+# directory of the `groff' source.  If not, write to the Free Software
+# Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301,
+# USA.
 
 ########################################################################
-#                       Environment Variables
-########################################################################
-
-# Environment variables that exist only for this file start with an
-# underscore letter.  Global variables to this file are written in
-# upper case letters, e.g. $_GLOBAL_VARIABLE; temporary variables
-# start with an underline and use only lower case letters and
-# underlines, e.g.  $_local_variable .
 
-#   [A-Z]*     system variables,      e.g. $MANPATH
-#   _[A-Z_]*   global file variables, e.g. $_MAN_PATH
-#   _[a-z_]*   temporary variables,   e.g. $_manpath
+_PROGRAM_VERSION='0.9.22';
+_LAST_UPDATE='22 August 2005';
 
-# Due to incompatibilities of the `ash' shell, the name of loop
-# variables in `for' must be single character
-#   [a-z]      local loop variables,   e.g. $i
+export _PROGRAM_VERSION;
+export _LAST_UPDATE;
 
+export GROFFER_OPT;		# option environment for groffer
 
-########################################################################
-# read-only variables (global to this file)
-########################################################################
+export _CONF_FILE_ETC;		# configuration file in /etc
+export _CONF_FILE_HOME;		# configuration file in $HOME
+export _CONF_FILES;		# configuration files
+_CONF_FILE_ETC='/etc/groff/groffer.conf';
+_CONF_FILE_HOME="${HOME}/.groff/groffer.conf";
+_CONF_FILES="${_CONF_FILE_ETC} ${_CONF_FILE_HOME}";
 
 # characters
 
-export _BQUOTE;
-export _BSLASH;
-export _DQUOTE;
-export _NEWLINE;
-export _LBRACK;
-export _LPAR;
-export _RBRACK;
-export _RPAR;
-export _SPACE;
-export _SQUOTE;
+export _AT;
+export _SP;
+export _SQ;
 export _TAB;
 
-_BQUOTE='`';
-_BSLASH='\';
-_DQUOTE='"';
-_NEWLINE='
-';
-_LBRACK='[';
-_LPAR='(';
-_RBRACK=']';
-_RPAR=')';
-_SPACE=' ';
-_SQUOTE="'";
+_AT='@';
+_SP=' ';
+_SQ="'";
 _TAB='	';
 
-# function return values; `0' means ok; other values are error codes
-export _ALL_EXIT;
-export _BAD;
 export _ERROR;
-export _GOOD;
-export _NO;
-export _OK;
-export _YES;
-
-_GOOD='0';			# return ok
-_BAD='1';			# return negatively, error code `1'
 _ERROR='7';			# for syntax errors; no `-1' in `ash'
 
-_ALL_EXIT="${_GOOD} ${_BAD} ${_ERROR}"; # all exit codes (for `trap_set')
-
-_NO="${_BAD}";
-_YES="${_GOOD}";
-_OK="${_GOOD}";
-
-# quasi-functions, call with `eval'
-export return_ok;
-export return_good;
-export return_bad;
-export return_yes;
-export return_no;
-export return_error;
-return_ok="func_pop; return ${_OK}";
-return_good="func_pop; return ${_GOOD}";
-return_bad="func_pop; return ${_BAD}";
-return_yes="func_pop; return ${_YES}";
-return_no="func_pop; return ${_NO}";
-return_error="func_pop; return ${_ERROR}";
-
-
-export _CONFFILES;
-_CONFFILES="/etc/groff/groffer.conf ${HOME}/.groff/groffer.conf";
-
-export _DEFAULT_MODES;
-_DEFAULT_MODES='x,ps,tty';
-export _DEFAULT_RESOLUTION;
-_DEFAULT_RESOLUTION='75';
-
-export _DEFAULT_TTY_DEVICE;
-_DEFAULT_TTY_DEVICE='latin1';
-
-# _VIEWER_* viewer programs for different modes (only X is necessary)
-# _VIEWER_* a comma-separated list of viewer programs (with options)
-export _VIEWER_DVI;		# viewer program for dvi mode
-export _VIEWER_PS;		# viewer program for ps mode
-export _VIEWER_HTML_X;		# viewer program for html mode in X
-export _VIEWER_HTML_TTY;	# viewer program for html mode in tty
-_VIEWER_DVI='xdvi,dvilx';
-_VIEWER_PDF='xpdf,acroread';
-_VIEWER_PS='gv,ghostview,gs_x11,gs';
-_VIEWER_HTML='konqueror,mozilla,netscape,opera,amaya,arena,lynx';
-_VIEWER_X='gxditview,xditview';
-
-# Search automatically in standard sections `1' to `8', and in the
-# traditional sections `9', `n', and `o'.  On many systems, there
-# exist even more sections, mostly containing a set of man pages
-# special to a specific program package.  These aren't searched for
-# automatically, but must be specified on the command line.
-export _MAN_AUTO_SEC;
-_MAN_AUTO_SEC="'1' '2' '3' '4' '5' '6' '7' '8' '9' 'n' 'o'"
-
-export _PROCESS_ID;		# for shutting down the program
-_PROCESS_ID="$$";
-
-
-############ the command line options of the involved programs
-#
-# The naming scheme for the options environment names is
-# $_OPTS__[_]
-#
-# :    program name GROFFER, GROFF, or CMDLINE (for all
-#            command line options)
-# :  LONG (long options) or SHORT (single character options)
-# : ARG for options with argument, NA for no argument;
-#            without _ both the ones with and without arg.
-#
-# Each option that takes an argument must be specified with a
-# trailing : (colon).
-
-# exports
-export _OPTS_GROFFER_SHORT_NA;
-export _OPTS_GROFFER_SHORT_ARG;
-export _OPTS_GROFFER_LONG_NA;
-export _OPTS_GROFFER_LONG_ARG;
-export _OPTS_GROFF_SHORT_NA;
-export _OPTS_GROFF_SHORT_ARG;
-export _OPTS_GROFF_LONG_NA;
-export _OPTS_GROFF_LONG_ARG;
-export _OPTS_X_SHORT_ARG;
-export _OPTS_X_SHORT_NA;
-export _OPTS_X_LONG_ARG;
-export _OPTS_X_LONG_NA;
-export _OPTS_MAN_SHORT_ARG;
-export _OPTS_MAN_SHORT_NA;
-export _OPTS_MAN_LONG_ARG;
-export _OPTS_MAN_LONG_NA;
-export _OPTS_MANOPT_SHORT_ARG;
-export _OPTS_MANOPT_SHORT_NA;
-export _OPTS_MANOPT_LONG_ARG;
-export _OPTS_MANOPT_LONG_NA;
-export _OPTS_CMDLINE_SHORT_NA;
-export _OPTS_CMDLINE_SHORT_ARG;
-export _OPTS_CMDLINE_LONG_NA;
-export _OPTS_CMDLINE_LONG_ARG;
-
-###### groffer native options
-
-_OPTS_GROFFER_SHORT_NA="'h' 'Q' 'v' 'V' 'X' 'Z'";
-_OPTS_GROFFER_SHORT_ARG="'T'";
-
-_OPTS_GROFFER_LONG_NA="'auto' 'debug' 'default' 'dvi' \
-'groff' 'help' 'intermediate-output' 'html' 'man' \
-'no-location' 'no-man' 'pdf' 'ps' 'rv' 'source' 'text' 'text-device' \
-'title' 'tty' 'tty-device' 'version' 'whatis' 'where' 'www' 'x' 'X'";
-
-_OPTS_GROFFER_LONG_ARG="\
-'apropos' 'apropos-data' 'apropos-devel' 'apropos-progs' \
-'default-modes' 'dvi-viewer' 'extension' 'fg' 'fn' 'font' \
-'foreground' 'html-viewer' 'mode' 'pdf-viewer' 'ps-viewer' 'shell' \
-'tty-viewer' 'www-viewer' 'x-viewer' 'X-viewer'";
-
-##### groffer options inhereted from groff
-
-_OPTS_GROFF_SHORT_NA="'a' 'b' 'c' 'C' 'e' 'E' 'g' 'G' 'i' 'l' 'N' 'p' \
-'R' 's' 'S' 't' 'U' 'V' 'z'";
-_OPTS_GROFF_SHORT_ARG="'d' 'f' 'F' 'I' 'L' 'm' 'M' 'n' 'o' 'P' 'r' \
-'w' 'W'";
-_OPTS_GROFF_LONG_NA="'source'";
-_OPTS_GROFF_LONG_ARG="'device' 'macro-file'";
-
-##### groffer options inhereted from the X Window toolkit
-
-_OPTS_X_SHORT_NA="";
-_OPTS_X_SHORT_ARG="";
-
-_OPTS_X_LONG_NA="'iconic' 'rv'";
-
-_OPTS_X_LONG_ARG="'background' 'bd' 'bg' 'bordercolor' 'borderwidth' \
-'bw' 'display' 'fg' 'fn' 'font' 'foreground' 'ft', 'geometry'
-'resolution' 'title' 'xrm'";
-
-###### groffer options inherited from man
-
-_OPTS_MAN_SHORT_NA="";
-_OPTS_MAN_SHORT_ARG="";
-
-_OPTS_MAN_LONG_NA="'all' 'ascii' 'catman' 'debug' 'ditroff' 'help' \
-'local-file' 'location' 'pager' 'troff' 'update' 'version' \
-'whatis' 'where'";
-
-_OPTS_MAN_LONG_ARG="'extension' 'locale' 'manpath' \
-'pager' 'preprocessor' 'prompt' 'sections' 'systems' 'troff-device'";
-
-###### additional options for parsing $MANOPT only
-
-_OPTS_MANOPT_SHORT_NA="'7' 'a' 'c' 'd' 'D' 'f' 'h' 'k' 'l' 't' 'u' \
-'V' 'w' 'Z'";
-_OPTS_MANOPT_SHORT_ARG="'e' 'L' 'm' 'M' 'p' 'P' 'r' 'S' 'T'";
-
-_OPTS_MANOPT_LONG_NA="${_OPTS_MAN_LONG_NA} \
-'apropos' 'debug' 'default' 'html' 'ignore-case' 'location-cat' \
-'match-case' 'troff' 'update' 'version' 'where-cat'";
+# @...@ constructs
 
-_OPTS_MANOPT_LONG_ARG="${_OPTS_MAN_LONG_NA} \
-'config_file' 'encoding' 'locale'";
-
-###### collections of command line options
-
-_OPTS_CMDLINE_SHORT_NA="${_OPTS_GROFFER_SHORT_NA}\
-${_OPTS_GROFF_SHORT_NA} ${_OPTS_X_SHORT_NA} ${_OPTS_MAN_SHORT_NA}";
-_OPTS_CMDLINE_SHORT_ARG="${_OPTS_GROFFER_SHORT_ARG} \
-${_OPTS_GROFF_SHORT_ARG} ${_OPTS_X_SHORT_ARG} ${_OPTS_MAN_SHORT_ARG}";
-
-_OPTS_CMDLINE_LONG_NA="${_OPTS_GROFFER_LONG_NA} \
-${_OPTS_GROFF_LONG_NA} ${_OPTS_X_LONG_NA} ${_OPTS_MAN_LONG_NA}";
-_OPTS_CMDLINE_LONG_ARG="${_OPTS_GROFFER_LONG_ARG} \
-${_OPTS_GROFF_LONG_ARG} ${_OPTS_MAN_LONG_ARG} ${_OPTS_X_LONG_ARG}";
-
-
-########################################################################
-# read-write variables (global to this file)
-########################################################################
-
-export _ADDOPTS_GROFF;		# Transp. options for groff (`eval').
-export _ADDOPTS_POST;		# Transp. options postproc (`eval').
-export _ADDOPTS_X;		# Transp. options X postproc (`eval').
-export _DEFAULT_MODES;		# Set default modes.
-export _DISPLAY_MODE;		# Display mode.
-export _DISPLAY_PROG;		# Viewer program to be used for display.
-export _DISPLAY_ARGS;		# X resources for the viewer program.
-export _FILEARGS;		# Stores filespec parameters.
-export _FUNC_STACK;		# Store debugging information.
-export _REGISTERED_TITLE;	# Processed file names.
-# _HAS_* from availability tests
-export _HAS_COMPRESSION;	# `yes' if compression is available
-export _HAS_OPTS_GNU;		# `yes' if GNU `getopt' is available
-export _HAS_OPTS_POSIX;		# `yes' if POSIX `getopts' is available
-# _MAN_* finally used configuration of man searching
-export _MAN_ALL;		# search all man pages per filespec
-export _MAN_ENABLE;		# enable search for man pages
-export _MAN_EXT;		# extension for man pages
-export _MAN_FORCE;		# force file parameter to be man pages
-export _MAN_IS_SETUP;		# setup man variables only once
-export _MAN_LANG;		# language for man pages
-export _MAN_LANG_DONE;		# language dirs added to man path
-export _MAN_PATH;		# search path for man pages
-export _MAN_SEC;		# sections for man pages; sep. `:'
-export _MAN_SEC_DONE;		# sections added to man path
-export _MAN_SYS;		# system names for man pages; sep. `,'
-export _MAN_SYS;		# system names added to man path
-# _MANOPT_* as parsed from $MANOPT
-export _MANOPT_ALL;		# $MANOPT --all
-export _MANOPT_EXTENSION;	# $MANOPT --extension
-export _MANOPT_LANG;		# $MANOPT --locale
-export _MANOPT_PATH;		# $MANOPT --manpath
-export _MANOPT_PAGER;		# $MANOPT --pager
-export _MANOPT_SEC;		# $MANOPT --sections
-export _MANOPT_SYS;		# $MANOPT --systems
-# _OPT_* as parsed from groffer command line
-export _OPT_ALL;		# display all suitable man pages.
-export _OPT_APROPOS;		# call `apropos' program.
-export _OPT_APROPOS_DATA;	# `apropos' for man sections 4, 5, 7
-export _OPT_APROPOS_DEVEL;	# `apropos' for man sections 2, 3, 9
-export _OPT_APROPOS_PROGS;	# `apropos' for man sections 1, 6, 8
-export _OPT_BD;			# set border color in some modes.
-export _OPT_BG;			# set background color in some modes.
-export _OPT_BW;			# set border width in some modes.
-export _OPT_DEBUG;		# print debugging information on stderr.
-export _OPT_DEFAULT_MODES;	# `,'-list of modes when no mode given.
-export _OPT_DEVICE;		# device option.
-export _OPT_DISPLAY;		# set X display.
-export _OPT_FG;			# set foreground color in some modes.
-export _OPT_FN;			# set font in some modes.
-export _OPT_GEOMETRY;		# set size and position of viewer in X.
-export _OPT_ICONIC;		# -iconic option for X viewers.
-export _OPT_LANG;		# set language for man pages
-export _OPT_LOCATION;		# print processed file names to stderr
-export _OPT_MODE;		# values: X, tty, Q, Z, ""
-export _OPT_MANPATH;		# manual setting of path for man-pages
-export _OPT_PAGER;		# specify paging program for tty mode
-export _OPT_RESOLUTION;		# set X resolution in dpi
-export _OPT_RV;			# reverse fore- and background colors.
-export _OPT_SECTIONS;		# sections for man page search
-export _OPT_SYSTEMS;		# man pages of different OS's
-export _OPT_TITLE;		# title for gxditview window
-export _OPT_TEXT_DEVICE;		# set device for tty mode.
-export _OPT_V;			# groff option -V.
-export _OPT_VIEWER_DVI;		# viewer program for dvi mode
-export _OPT_VIEWER_PDF;		# viewer program for pdf mode
-export _OPT_VIEWER_PS;		# viewer program for ps mode
-export _OPT_VIEWER_HTML;	# viewer program for html mode
-export _OPT_VIEWER_X;		# viewer program for x mode
-export _OPT_WHATIS;		# print the one-liner man info
-export _OPT_XRM;		# specify X resource.
-export _OPT_Z;			# groff option -Z.
-# _TMP_* temporary files
-export _TMP_DIR;		# groff directory for temporary files
-export _TMP_DIR_SUB;		# groffer directory for temporary files
-export _TMP_CAT;		# stores concatenation of everything
-export _TMP_STDIN;		# stores stdin, if any
-
-# these variables are preset in section `Preset' after the rudim. test
+export _GROFF_VERSION
+_GROFF_VERSION='@VERSION@';
+if test _@VERSION@_ = _${_AT}VERSION${_AT}_
+then
+  _GROFF_VERSION='1.19.2';
+fi;
 
+export _AT_BINDIR_AT;
+export _AT_G_AT;
+export _AT_LIBDIR_AT;
+export _GROFFER_LIBDIR;
+if test _@BINDIR@_ = _${_AT}BINDIR${_AT}_
+then
+  # script before `make'
+  _AT_BINDIR_AT='.';
+  _AT_G_AT='';
+  _AT_LIBDIR_AT='';
+  _GROFFER_LIBDIR='.';
+else
+  _AT_BINDIR_AT='@BINDIR@';
+  _AT_G_AT='@g@';
+  _AT_LIBDIR_AT='@libdir@';
+  _GROFFER_LIBDIR="${_AT_LIBDIR_AT}"'/groff/groffer';
+fi;
 
-########################################################################
-#             Test of rudimentary shell functionality
-########################################################################
+export _GROFFER_SH;		# file name of this shell script
+case "$0" in
+*groffer*)
+  _GROFFER_SH="$0";
+  # was: _GROFFER_SH="${_AT_BINDIR_AT}/groffer";
+  ;;
+*)
+  echo 'The groffer script should be started directly.' >&2
+  exit 1;
+  ;;
+esac;
 
+export _GROFFER2_SH;		# file name of the script that follows up
+_GROFFER2_SH="${_GROFFER_LIBDIR}"/groffer2.sh;
 
-########################################################################
-# Test of `test'.
-#
-test "a" = "a" || exit 1;
+export _NULL_DEV;
+if test -c /dev/null
+then
+  _NULL_DEV="/dev/null";
+else
+  _NULL_DEV="NUL";
+fi;
 
 
-########################################################################
-# Test of `echo' and the `$()' construct.
-#
-echo -n '' >/dev/null || exit "${_ERROR}";
-if test "$(echo -n 'te' && echo -n '' && echo -n 'st')" != "test"; then
+# Test of the `$()' construct.
+if test _"$(echo "$(echo 'test')")"_ \
+     != _test_
+then
+  echo 'The "$()" construct did not work.' >&2;
   exit "${_ERROR}";
 fi;
 
-
-########################################################################
-# Test of function definitions.
-#
-_t_e_s_t_f_u_n_c_()
-{
-  return "${_OK}";
-}
-
-if _t_e_s_t_f_u_n_c_ 2>/dev/null; then
-  :
-else
-  echo 'shell does not support function definitions.' >&2;
+# Test of sed program
+if test _"$(echo red | sed -e 's/r/s/')"_ != _sed_
+then
+  echo 'The sed program did not work.' >&2;
   exit "${_ERROR}";
 fi;
 
 
-########################################################################
-# Preset and reset of read-write global variables
-########################################################################
-
-
-# For variables that can be reset by option `--default', see reset().
+########################### configuration
 
-_FILEARGS='';
-
-# _HAS_* from availability tests
-_HAS_COMPRESSION='';
-_HAS_OPTS_GNU='';
-_HAS_OPTS_POSIX='';
-
-# _TMP_* temporary files
-_TMP_DIR='';
-_TMP_DIR_SUB='';
-_TMP_CAT='';
-_TMP_STDIN='';
-
-
-########################################################################
-# reset ()
-#
-# Reset the variables that can be affected by options to their default.
-#
-reset()
-{
-  if test "$#" -ne 0; then
-    error "reset() does not have arguments.";
-  fi;
-
-  _ADDOPTS_GROFF='';
-  _ADDOPTS_POST='';
-  _ADDOPTS_X='';
-  _DISPLAY_ARGS='';
-  _DISPLAY_MODE='';
-  _DISPLAY_PROG='';
-  _REGISTERED_TITLE='';
-
-  # _MAN_* finally used configuration of man searching
-  _MAN_ALL='no';
-  _MAN_ENABLE='yes';		# do search for man-pages
-  _MAN_EXT='';
-  _MAN_FORCE='no';		# first local file, then search man page
-  _MAN_IS_SETUP='no';
-  _MAN_LANG='';
-  _MAN_LANG_DONE='no';
-  _MAN_PATH='';
-  _MAN_SEC='';
-  _MAN_SEC_DONE='no';
-  _MAN_SYS='';
-  _MAN_SYS_DONE='no';
-
-  # _MANOPT_* as parsed from $MANOPT
-  _MANOPT_ALL='no';
-  _MANOPT_EXTENSION='';
-  _MANOPT_LANG='';
-  _MANOPT_PATH='';
-  _MANOPT_PAGER='';
-  _MANOPT_SEC='';
-  _MANOPT_SYS='';
-
-  # _OPT_* as parsed from groffer command line
-  _OPT_ALL='no';
-  _OPT_APROPOS='';
-  _OPT_APROPOS_DATA='';
-  _OPT_APROPOS_DEVEL='';
-  _OPT_APROPOS_PROGS='';
-  _OPT_BD='';
-  _OPT_BG='';
-  _OPT_BW='';
-  _OPT_DEBUG='no';
-  _OPT_DEFAULT_MODES='';
-  _OPT_DEVICE='';
-  _OPT_DISPLAY='';
-  _OPT_FG='';
-  _OPT_FN='';
-  _OPT_GEOMETRY='';
-  _OPT_ICONIC='no';
-  _OPT_LANG='';
-  _OPT_LOCATION='no';
-  _OPT_MODE='';
-  _OPT_MANPATH='';
-  _OPT_PAGER='';
-  _OPT_RESOLUTION='';
-  _OPT_RV='no';
-  _OPT_SECTIONS='';
-  _OPT_SYSTEMS='';
-  _OPT_TITLE='';
-  _OPT_TEXT_DEVICE='';
-  _OPT_V='no';
-  _OPT_VIEWER_DVI='';
-  _OPT_VIEWER_PDF='';
-  _OPT_VIEWER_PS='';
-  _OPT_VIEWER_HTML='';
-  _OPT_VIEWER_X='';
-  _OPT_WHATIS='no';
-  _OPT_XRM='';
-  _OPT_Z='no';
-
-}
-
-reset;
-
-
-########################################################################
-#          Functions for error handling and debugging
-########################################################################
-
-
-##############
-# landmark ()
-#
-# Print  to standard error as a debugging aid.
-#
-# Globals: $_DEBUG_LM
-#
-landmark()
-{
-  if test "${_DEBUG_LM}" = 'yes'; then
-    echo ">>> $*" >&2;
-  fi;
-}
-
-landmark "1: debugging functions";
-
-
-##############
-# clean_up ()
-#
-# Clean up at exit.
-#
-clean_up()
-{
-  if test -d "${_TMP_DIR}"; then
-    rm -f "${_TMP_DIR}"/*;
-    rmdir "${_TMP_DIR}";
-  fi;
-}
-
-
-##############
-# echo2 (*)
-#
-# Output to stderr.
-#
-# Arguments : arbitrary text.
-#
-echo2()
-{
-  echo "$*" >&2;
-}
-
-
-##############
-# echo2n (*)
-#
-# Output to stderr.
-#
-# Arguments : arbitrary text.
-#
-echo2n()
-{
-  echo -n "$*" >&2;
-}
-
-
-#############
-# diag (text>*)
-#
-# Output a diagnostic message to stderr
-#
-diag()
-{
-  echo2 '>>>>>'"$*";
-}
-
-
-#############
-# error (*)
-#
-# Print an error message to standard error; exit with an error condition
-#
-error()
-{
-  local i;
-  local _code;
-  _code="${_ERROR}";
-  case "$#" in
-    0) true; ;;
-    1) echo2 'groffer error: '"$1"; ;;
-    2)
-      echo2 'groffer error: '"$1";
-      _code="$2";
-      ;;
-    *) echo2 'groffer error: wrong number of arguments in error().'; ;;
-  esac;
-  if test "${_DEBUG}" = 'yes'; then
-    func_stack_dump;
+# read and transform the configuration files, execute the arising commands
+for f in "${_CONF_FILE_HOME}" "${_CONF_FILE_ETC}"
+do
+  if test -f "$f"
+  then
+    o="";			# $o means groffer option
+    # use "" quotes because of ksh and posh
+    eval "$(cat "$f" | sed -n -e '
+# Ignore comments
+/^['"${_SP}${_TAB}"']*#/d
+# Delete leading and final space
+s/^['"${_SP}${_TAB}"']*//
+s/['"${_SP}${_TAB}"']*$//
+# Print all shell commands
+/^[^-]/p
+# Replace empty arguments
+s/^\(-[^ ]*\)=$/o="${o} \1 '"${_SQ}${_SQ}"'"/p
+# Replace division between option and argument by single space
+s/[='"${_SP}${_TAB}"']['"${_SP}${_TAB}"']*/'"${_SP}"'/
+# Handle lines without spaces
+s/^\(-[^'"${_SP}"']*\)$/o="${o} \1"/p
+# Print options that have their argument encircled with single quotes
+/^-[^ ]* '"${_SQ}"'.*'"${_SQ}"'$/s/^.*$/o="${o} &"/p
+# Replace encircled double quotes by single quotes and print the result
+s/^\(-[^ ]*\) "\(.*\)"$/o="${o} \1 '"${_SQ}"'\2'"${_SQ}"'"/p
+# Encircle the remaining arguments with single quotes
+s/^\(-[^ ]*\) \(.*\)$/o="${o} \1 '"${_SQ}"'\2'"${_SQ}"'"/p
+')"
+    if test _"${o}"_ != __
+    then
+      if test _"{GROFFER_OPT}"_ = __
+      then
+        GROFFER_OPT="${o}";
+      else
+        GROFFER_OPT="${o} ${GROFFER_OPT}";
+      fi;
+    fi;
   fi;
-  clean_up;
-  kill "${_PROCESS_ID}" >/dev/null 2>&1;
-  kill -9 "${_PROCESS_ID}" >/dev/null 2>&1;
-  exit "${_code}";
-}
+done;
 
-
-#############
-# abort (*)
-#
-# Terminate program with error condition
-#
-abort()
-{
-  error "Program aborted.";
-  exit 1;
-}
+# integrate $GROFFER_OPT into the command line; it isn't needed any more
+if test _"${GROFFER_OPT}"_ != __
+then
+  eval set x "${GROFFER_OPT}" '"$@"';
+  shift;
+  GROFFER_OPT='';
+fi;
 
 
-#############
-# func_check (   "$@")
-#
-# Check number of arguments and register to _FUNC_STACK.
-#
-# Arguments: >=3
-#   : name of the calling function.
-#   :    a relational operator: = != < > <= >= 
-#   :   number of arguments to be checked against 
-#   "$@":        the arguments of the calling function.
-#
-func_check()
-{
-  local _comp;
-  local _fname;
-  local _nargs;
-  local _op;
-  local _s;
-  if test "$#" -lt 3; then
-    error 'func_check() needs at least 3 arguments.';
-  fi;
-  _fname="$1";
-  case "$3" in
-    1)
-      _nargs="$3";
-      _s='';
-      ;;
-    0|[2-9])
-      _nargs="$3";
-      _s='s';
-      ;;
-    *)
-      error "func_check(): third argument must be a digit.";
-      ;;
-  esac;
-  case "$2" in
-    '='|'-eq')
-      _op='-eq';
-      _comp='exactly';
-      ;;
-    '>='|'-ge')
-      _op='-ge';
-      _comp='at least';
-      ;;
-    '<='|'-le')
-      _op='-le';
-      _comp='at most';
-      ;;
-    '<'|'-lt')
-      _op='-lt';
-      _comp='less than';
-      ;;
-    '>'|'-gt')
-      _op='-gt';
-      _comp='more than';
-      ;;
-    '!='|'-ne')
-      _op='-ne';
-      _comp='not';
-      ;;
-    *) 
-      error \
-        'func_check(): second argument is not a relational operator.';
-      ;;
-  esac;
-  shift 3;
-  if test "$#" "${_op}" "${_nargs}"; then
-    do_nothing;
-  else
-    error \
-      "${_fname}"'() needs '"${_comp} ${_nargs}"' argument'"${_s}"'.';
-  fi;
-  if test "${_DEBUG}" = 'yes'; then
-    func_push "${_fname} $*";
-  fi;
-}
+########################### Determine the shell
 
+export _SHELL;
 
-#############
-# func_pop ()
-#
-# Retrieve the top element from the stack.
-#
-# The stack elements are separated by `!'; the popped element is
-# identical to the original element, except that all `!' characters
-# were removed.
-#
-# Arguments: 1
-#
-func_pop()
-{
-  if test "${_DEBUG}" = 'yes'; then
-    if test "$#" -ne 0; then
-      error 'func_pop() does not have arguments.';
-    fi;
-    case "${_FUNC_STACK}" in
-      '')
-        error 'func_pop(): stack is empty.';
+# use "``" instead of "$()" for using the case ")" construct
+# do not use "" quotes because of ksh
+_SHELL=`
+  # $x means list.
+  # $s means shell.
+  # The command line arguments are taken over.
+  # Shifting herein does not have an effect outside.
+  export x;  
+  case " $*" in
+  *\ --sh*)			# abbreviation for --shell
+    x='';
+    s='';
+    # determine all --shell arguments, store them in $x in reverse order
+    while test $# != 0
+    do
+      case "$1" in
+      --shell|--sh|--she|--shel)
+        if test "$#" -ge 2
+        then
+          s="$2";
+          shift;
+        fi;
         ;;
-      *!*)
-        # split at first bang `!'.
-        _FUNC_STACK="$(echo -n ${_FUNC_STACK} \
-                       | sed -e 's/^[^!]*!//')";
+      --shell=*|--sh=*|--she=*|--shel=*)
+        # delete up to first "=" character
+        s="$(echo x"$1" | sed -e 's/^x[^=]*=//')";
         ;;
       *)
-        _FUNC_STACK='';
-        ;;
-    esac;
-  fi;
-}
-
+        shift;
+        continue;
+      esac;
+      if test _"${x}"_ = __
+      then
+        x="'${s}'";
+      else
+        x="'${s}' ${x}";
+      fi;
+      shift;
+    done;
 
-#############
-# func_push ()
-#
-# Store another element to stack.
-#
-# The stack elements are separated by `!'; if  contains a `!'
-# it is removed first.
-#
-# Arguments: 1
-#
-func_push()
-{
-  local _element;
-  if test "${_DEBUG}" = 'yes'; then
-    if test "$#" -ne 1; then
-      error 'func_push() needs 1 argument.';
-    fi;
-    case "$1" in
-      *'!'*)
-        # remove all bangs `!'.
-        _element="$(echo -n "$1" | sed -e 's/!//g')";
-        ;;
-      *)
-        _element="$1";
-        ;;
-    esac;
-    if test "${_FUNC_STACK}" = ''; then
-      _FUNC_STACK="${_element}";
-    else
-      _FUNC_STACK="${_element}!${_FUNC_STACK}";
+    # from all possible shells in $x determine the first being a shell
+    # or being empty
+    s="$(
+      # "" quotes because of posh
+      eval set x "${x}";
+      shift;
+      if test $# != 0
+      then
+        for i
+        do
+          if test _"$i"_ = __
+          then
+            # use the empty argument as the default shell
+            echo empty;
+            break;
+          else
+            # test $i on being a shell program;
+            # use this kind of quoting for posh
+            if test _"$(eval "$i -c 'echo ok'" 2>${_NULL_DEV})"_ = _ok_ >&2
+            then
+              # shell found
+              cat </dev/null 2>&1; then
-  true;
-else
-  true()
-  {
-    return "${_GOOD}";
-  }
-
-  false()
-  {
-    return "${_BAD}";
-  }
-fi;
-
-
-########################################################################
-# Test of `unset'.
-#
-_test='test';
-if unset _test >/dev/null 2>&1 && test "${_test}" = ''; then
-  true;
-else
-  unset()
-  {
-    for v in "$@"; do
-      eval "$v"='';
-    done;
-  }
-fi;
-unset _test;
-
-########################################################################
-# Test of builtin `local'
-#
+`
 
-_t_e_s_t_f_u_n_c_()
-{
-  local _test >/dev/null 2>&1 || return "${_BAD}";
-}
+########################### test fast shells for automatic run
 
-if _t_e_s_t_f_u_n_c_; then
-  :
-else
-  local()
-  {
-    if test "$1" != ''; then
-      error "overriding global variable \`$1' with local value.";
+if test _"${_SHELL}"_ = __
+then
+  for s in ksh ash dash pdksh zsh posh
+  do
+    if test _"$(eval "$s -c 'echo ok'" 2>${_NULL_DEV})"_ = _ok_ >&2
+    then
+      _SHELL="$s";
+      break;
     fi;
-  }
+  done;
 fi;
 
 
-########################################################################
-# Test of global setting in functions
-#
-_global='outside';
-_clobber='outside';
-
-_t_e_s_t_f_u_n_c_()
-{
-  local _clobber;
-  _global='inside';
-  _clobber='inside';
-}
+########################### start groffer2.sh
 
-_t_e_s_t_f_u_n_c_;
-if test "${_global}" != 'inside' || test "${_clobber}" != 'outside';
+if test _"${_SHELL}"_ = _empty_
 then
-  error "Cannot assign to global variables from within functions.";
+  _SHELL='';
 fi;
 
-unset _global;
-unset _clobber;
-
-
-########################################################################
-# Test of function `sed'.
-#
-if test "$(echo xTesTx \
-           | sed -e 's/^.\([Tt]e*x*sTT*\).*$/\1/' \
-           | sed -e '\|T|s||t|g')" != 'test';
+if test _"${_SHELL}"_ = __
 then
-  error 'Test of "sed" command failed.';
-fi;
-
-
-########################################################################
-# Test of function `cat'.
-#
-if test "$(echo test | cat)" != "test"; then
-  error 'Test of "cat" command failed.';
-fi;
-
-
-########################################################################
-# Test for compression.
-#
-if test "$(echo 'test' | gzip -c -d -f - 2>/dev/null)" = 'test'; then
-  _HAS_COMPRESSION='yes';
-  if echo 'test' | bzip2 -c 2>/dev/null | bzip2 -t 2>/dev/null \
-     && test "$(echo 'test' | bzip2 -c 2>/dev/null \
-                            | bzip2 -d -c 2>/dev/null)" \
-             = 'test'; then
-    _HAS_BZIP='yes';
-  else
-    _HAS_BZIP='no';
-  fi;
-else
-  _HAS_COMPRESSION='no';
-  _HAS_BZIP='no';
-fi;
-
-
-########################################################################
-_t_e_s_t_f_u_n_c_()
-{
-  :
-}
-
-
-########################################################################
-#                   Definition of normal Functions
-########################################################################
-landmark "3: functions";
-
-########################################################################
-# abort (*)
-#
-# Unconditionally terminate the program with error code;
-# useful for debugging.
-#
-# defined above
-
-
-########################################################################
-# apropos_run ()
-#
-# 
-apropos_run() {
-  func_check apropos_run = 1 "$@";
-  if apropos apropos >/dev/null 2>/dev/null; then
-    apropos "$1";
-  elif man --apropos man >/dev/null 2>/dev/null; then
-    man --apropos "$1";
-  elif man -k man >/dev/null 2>/dev/null; then
-    man -k "$1";
-  fi;
-}
-
-
-########################################################################
-# base_name ()
-#
-# Get the file name part of , i.e. delete everything up to last
-# `/' from the beginning of .  Remove final slashes, too, to get a
-# non-empty output.
-#
-# Arguments : 1
-# Output    : the file name part (without slashes)
-#
-base_name()
-{
-  func_check base_name = 1 "$@";
-  local f;
-  f="$1";
-  case "$f" in
-    */)
-      # delete all final slashes
-      f="$(echo -n "$f" | sed -e '\|//*$|s|||')";
-      ;;
-  esac;
-  case "$f" in
-    /|'')
-      eval "${return_bad}";
-      ;;
-    */*)
-      # delete everything before and including the last slash `/'.
-      echo -n "$f" | sed -e '\|^.*//*\([^/]*\)$|s||\1|';
-      ;;
-    *)
-      echo -n "$f";
-      ;;
-  esac;
-  eval "${return_ok}";
-}
-
-
-########################################################################
-# catz ()
-#
-# Decompress if possible or just print  to standard output.
-#
-# gzip, bzip2, and .Z decompression is supported.
-#
-# Arguments: 1, a file name.
-# Output: the content of , possibly decompressed.
-#
-if test "${_HAS_COMPRESSION}" = 'yes'; then
-  catz()
-  {
-    func_check catz = 1 "$@";
-    case "$1" in
-      '')
-        error 'catz(): empty file name';
-        ;;
-      '-')
-        error 'catz(): for standard input use save_stdin()';
-        ;;
-    esac;
-    if obj _HAS_BZIP is_yes; then
-      if bzip2 -t "$1" 2>/dev/null; then
-        bzip2 -c -d "$1" 2>/dev/null;
-        eval "${return_ok}";
-      fi;
-    fi;
-    gzip -c -d -f "$1" 2>/dev/null;
-    eval "${return_ok}";
-  }
+  # no shell found, so start groffer2.sh normally
+  eval exec "'${_GROFFER2_SH}'" '"$@"';
+  exit;
 else
-  catz()
-  {
-    func_check catz = 1 "$@";
-    cat "$1";
-    eval "${return_ok}";
-  }
+  # start groffer2.sh with the found $_SHELL
+  # do not quote $_SHELL to allow arguments
+  eval exec "${_SHELL} '${_GROFFER2_SH}'" '"$@"';
+  exit;
 fi;
-
-
-########################################################################
-# clean_up ()
-#
-# Do the final cleaning up before exiting; used by the trap calls.
-#
-# defined above
-
-
-########################################################################
-# diag (*)
-#
-# Print marked message to standard error; useful for debugging.
-#
-# defined above
-
-
-########################################################################
-landmark '4: dirname()*';
-########################################################################
-
-#######################################################################
-# dirname_append ( )
-#
-# Append `name' to `dir' with clean handling of `/'.
-#
-# Arguments : 2
-# Output    : the generated new directory name /
-#
-dirname_append()
-{
-  func_check dirname_append = 2 "$@";
-  local _res;
-  if is_empty "$1"; then
-    error "dir_append(): first argument is empty.";
-  fi;
-  if is_empty "$2"; then
-    echo -n "$1";
-  else
-    dirname_chop "$1"/"$2";
-  fi;
-  eval "${return_ok}";
-}
-
-
-########################################################################
-# dirname_chop ()
-#
-# Remove unnecessary slashes from directory name.
-#
-# Argument: 1, a directory name.
-# Output:   path without double, or trailing slashes.
-#
-dirname_chop()
-{
-  func_check dirname_chop = 1 "$@";
-  local _arg;
-  local _res;
-  local _sep;
-  # replace all multiple slashes by a single slash `/'.
-  _res="$(echo -n "$1" | sed -e '\|///*|s||/|g')";
-  case "${_res}" in
-    ?*/)
-      # remove trailing slash '/';
-      echo -n "${_res}" | sed -e '\|/$|s|||';
-      ;;
-    *) echo -n "${_res}"; ;;
-  esac;
-  eval "${return_ok}";
-}
-
-
-########################################################################
-# do_filearg ()
-#
-# Append the file, man-page, or standard input corresponding to the
-# argument to the temporary file.  If this is compressed in the gzip
-# or Z format it is decompressed.  A title element is generated.
-#
-# Argument either:
-#   - name of an existing files.
-#   - `-' to represent standard input (several times allowed).
-#   - `man:name.(section)' the man-page for `name' in `section'.
-#   - `man:name.section' the man-page for `name' in `section'.
-#   - `man:name' the man-page for `name' in the lowest `section'.
-#   - `name.section' the man-page for `name' in `section'.
-#   - `name' the man-page for `name' in the lowest `section'.
-# Globals :
-#   $_TMP_STDIN, $_MAN_ENABLE, $_MAN_IS_SETUP, $_OPT_MAN
-#
-# Output  : none
-# Return  : $_GOOD if found, ${_BAD} otherwise.
-#
-do_filearg()
-{
-  func_check do_filearg = 1 "$@";
-  local _filespec;
-  local i;
-  _filespec="$1";
-  # store sequence into positional parameters
-  case "${_filespec}" in
-    '')
-       eval "${return_good}";
-       ;;
-    '-')
-      register_file '-';
-      eval "${return_good}";
-      ;;
-    */*)			# with directory part; so no man search
-      set -- 'File';
-      ;;
-    *)
-      if obj _MAN_ENABLE is_yes; then
-        if obj _MAN_FORCE is_yes; then
-          set -- 'Manpage' 'File';
-        else
-          set -- 'File' 'Manpage';
-        fi;
-      else
-        set -- 'File';
-      fi;
-      ;;
-  esac;
-  for i in "$@"; do
-    case "$i" in
-      File)
-        if test -f "${_filespec}"; then
-          if test -r "${_filespec}"; then
-            register_file "${_filespec}";
-            eval "${return_good}";
-          else
-	    echo2 "could not read \`${_filespec}'";
-            eval "${return_bad}";
-          fi;
-        else
-          continue;
-        fi;
-        ;;
-      Manpage)			# parse filespec as man page
-        if obj _MAN_IS_SETUP is_not_yes; then
-          man_setup;
-        fi;
-        if man_do_filespec "${_filespec}"; then
-          eval "${return_good}";
-        else
-          continue;
-	fi;
-        ;;
-    esac;
-  done;
-  eval "${return_bad}";
-} # do_filearg()
-
-
-########################################################################
-# do_nothing ()
-#
-# Dummy function.
-#
-do_nothing()
-{
-  return "${_OK}";
-}
-
-
-########################################################################
-# echo2 (*)
-#
-# Print to standard error with final line break.
-#
-# defined above
-
-
-########################################################################
-# echo2n (*)
-#
-# Print to standard error without final line break.
-#
-# defined above
-
-
-########################################################################
-# error (*)
-#
-# Print error message and exit with error code.
-#
-# defined above
-
-
-########################################################################
-# func_check (   "$@")
-#
-# Check number of arguments and register to _FUNC_STACK.
-#
-# Arguments: >=3
-#   : name of the calling function.
-#   :    a relational operator: = != < > <= >= 
-#   :   number of arguments to be checked against 
-#   "$@":        the arguments of the calling function.
-#
-# defined above
-
-#########################################################################
-# func_pop ()
-#
-# Delete the top element from the function call stack.
-#
-# defined above
-
-
-########################################################################
-# func_push ()
-#
-# Store another element to function call stack.
-#
-# defined above
-
-
-########################################################################
-# func_stack_dump ()
-#
-# Print the content of the stack.
-#
-# defined above
-
-
-########################################################################
-# get_first_essential (*)
-#
-# Retrieve first non-empty argument.
-#
-# Return  : `1' if all arguments are empty, `0' if found.
-# Output  : the retrieved non-empty argument.
-#
-get_first_essential()
-{
-  func_check get_first_essential '>=' 0 "$@";
-  local i;
-  if is_equal "$#" 0; then
-    eval "${return_ok}";
-  fi;
-  for i in "$@"; do
-    if obj i is_not_empty; then
-      echo -n "$i";
-      eval "${return_ok}";
-    fi;
-  done;
-  eval "${return_bad}";
-}
-
-
-########################################################################
-landmark '5: is_*()';
-########################################################################
-
-########################################################################
-# is_dir ()
-#
-# Test whether `name' is a directory.
-#
-# Arguments : 1
-# Return    : `0' if arg1 is a directory, `1' otherwise.
-#
-is_dir()
-{
-  func_check is_dir = 1 "$@";
-  if test -d "$1" && test -r "$1"; then
-    eval "${return_yes}";
-  fi;
-  eval "${return_no}";
-}
-
-
-########################################################################
-# is_empty ()
-#
-# Test whether `string' is empty.
-#
-# Arguments : <=1
-# Return    : `0' if arg1 is empty or does not exist, `1' otherwise.
-#
-is_empty()
-{
-  func_check is_empty = 1 "$@";
-  if test "$1" = ''; then
-    eval "${return_yes}";
-  fi;
-  eval "${return_no}";
-}
-
-
-########################################################################
-# is_equal ( )
-#
-# Test whether `string1' is equal to .
-#
-# Arguments : 2
-# Return    : `0' both arguments are equal strings, `1' otherwise.
-#
-is_equal()
-{
-  func_check is_equal = 2 "$@";
-  if test "$1" = "$2"; then
-    eval "${return_yes}";
-  fi;
-  eval "${return_no}";
-}
-
-
-########################################################################
-# is_file ()
-#
-# Test whether `name' is a readable file.
-#
-# Arguments : 1
-# Return    : `0' if arg1 is a readable file, `1' otherwise.
-#
-is_file()
-{
-  func_check is_file = 1 "$@";
-  if test -f "$1" && test -r "$1"; then
-    eval "${return_yes}";
-  fi;
-  eval "${return_no}";
-}
-
-
-########################################################################
-# is_non_empty_file ()
-#
-# Test whether `file_name' is a non-empty existing file.
-#
-# Arguments : <=1
-# Return    :
-#   `0' if arg1 is a non-empty existing file
-#   `1' otherwise
-#
-is_non_empty_file()
-{
-  func_check is_empty = 1 "$@";
-  if is_file "$1"; then
-    if is_not_empty "$(cat "$1" | sed -e '/./q')"; then
-      eval "${return_yes}";
-    fi;
-  fi;
-  eval "${return_no}";
-}
-
-
-########################################################################
-# is_not_dir ()
-#
-# Test whether `name' is not a readable directory.
-#
-# Arguments : 1
-# Return    : `0' if arg1 is a directory, `1' otherwise.
-#
-is_not_dir()
-{
-  func_check is_not_dir = 1 "$@";
-  if is_dir "$1"; then
-    eval "${return_no}";
-  fi;
-  eval "${return_yes}";
-}
-
-
-########################################################################
-# is_not_empty ()
-#
-# Test whether `string' is not empty.
-#
-# Arguments : <=1
-# Return    : `0' if arg1 exists and is not empty, `1' otherwise.
-#
-is_not_empty()
-{
-  func_check is_not_empty = 1 "$@";
-  if is_empty "$1"; then
-    eval "${return_no}";
-  fi;
-  eval "${return_yes}";
-}
-
-
-########################################################################
-# is_not_equal ( )
-#
-# Test whether `string1' differs from `string2'.
-#
-# Arguments : 2
-#
-is_not_equal()
-{
-  func_check is_not_equal = 2 "$@";
-  if is_equal "$1" "$2"; then
-    eval "${return_no}";
-  fi
-  eval "${return_yes}";
-}
-
-
-########################################################################
-# is_not_file ()
-#
-# Test whether `name' is a not readable file.
-#
-# Arguments : >=1 (empty allowed), more args are ignored
-#
-is_not_file()
-{
-  func_check is_not_file '>=' 1 "$@";
-  if is_file "$1"; then
-    eval "${return_no}";
-  fi;
-  eval "${return_yes}";
-}
-
-
-########################################################################
-# is_not_prog ()
-#
-# Verify that arg is a not program in $PATH.
-#
-# Arguments : >=1 (empty allowed)
-#   more args are ignored, this allows to specify progs with arguments
-#
-is_not_prog()
-{
-  func_check is_not_prog '>=' 1 "$@";
-  if where "$1" >/dev/null; then
-    eval "${return_no}";
-  fi;
-  eval "${return_yes}";
-}
-
-
-########################################################################
-# is_not_writable ()
-#
-# Test whether `name' is a not a writable file or directory.
-#
-# Arguments : >=1 (empty allowed), more args are ignored
-#
-is_not_writable()
-{
-  func_check is_not_writable '>=' 1 "$@";
-  if is_writable "$1"; then
-    eval "${return_no}";
-  fi;
-  eval "${return_yes}";
-}
-
-
-########################################################################
-# is_not_yes ()
-#
-# Test whether `string' is not "yes".
-#
-# Arguments : 1
-#
-is_not_yes()
-{
-  func_check is_not_yes = 1 "$@";
-  if is_yes "$1"; then
-    eval "${return_no}";
-  fi;
-  eval "${return_yes}";
-}
-
-
-########################################################################
-# is_prog ()
-#
-# Determine whether arg is a program in $PATH
-#
-# Arguments : >=0 (empty allowed)
-#   more args are ignored, this allows to specify progs with arguments
-#
-is_prog()
-{
-  func_check is_prog '>=' 0 "$@";
-  case "$#" in
-  0)
-    eval "${return_no}";
-    ;;
-  *)
-    if where "$1" >/dev/null; then
-      eval "${return_yes}";
-    fi;
-    ;;
-  esac
-  eval "${return_no}";
-}
-
-
-########################################################################
-# is_writable ()
-#
-# Test whether `name' is a writable file or directory.
-#
-# Arguments : >=1 (empty allowed), more args are ignored
-#
-is_writable()
-{
-  func_check is_writable '>=' 1 "$@";
-  if test -r "$1"; then
-    if test -w "$1"; then
-      eval "${return_yes}";
-    fi;
-  fi;
-  eval "${return_no}";
-}
-
-
-########################################################################
-# is_yes ()
-#
-# Test whether `string' has value "yes".
-#
-# Arguments : <=1
-# Return    : `0' if arg1 is `yes', `1' otherwise.
-#
-is_yes()
-{
-  func_check is_yes = 1 "$@";
-  if is_equal "$1" 'yes'; then
-    eval "${return_yes}";
-  fi;
-  eval "${return_no}";
-}
-
-
-########################################################################
-# landmark ()
-#
-# Print debugging information on standard error if $_DEBUG_LM is `yes'.
-#
-# Globals: $_DEBUG_LM
-#
-# Defined in section `Debugging functions'.
-
-
-########################################################################
-# leave ()
-#
-# Clean exit without an error.
-#
-leave()
-{
-  clean_up;
-  exit "${_OK}";
-}
-
-
-########################################################################
-landmark '6: list_*()';
-########################################################################
-#
-# `list' is an object class that represents an array or list.  Its
-# data consists of space-separated single-quoted elements.  So a list
-# has the form "'first' 'second' '...' 'last'".  See list_append() for
-# more details on the list structure.  The array elements of `list'
-# can be get by `set -- $list`.
-
-
-########################################################################
-# list_append ( ...)
-#
-# Arguments: >=2
-#   : a variable name for a list of single-quoted elements
-#   :  some sequence of characters.
-# Output: none, but $ is set to
-#   if  is empty:  "'' '...'"
-#   otherwise:           "$list '' ..."
-#
-list_append()
-{
-  func_check list_append '>=' 2 "$@";
-  local _element;
-  local _list;
-  local _name;
-  _name="$1";
-  eval _list='"${'$1'}"';
-  shift;
-  for s in "$@"; do
-    case "$s" in
-    *\'*)
-      # escape each single quote by replacing each
-      # "'" (squote) by "'\''" (squote bslash squote squote);
-      # note that the backslash must be doubled in the following `sed'
-      _element="$(echo -n "$s" | sed -e 's/'"${_SQUOTE}"'/&\\&&/g')";
-      ;;
-    '')  
-      _element="";
-      ;;
-    *)
-      _element="$s";
-      ;;
-    esac;
-    if obj _list is_empty; then
-      _list="'${_element}'";
-    else
-      _list="${_list} '${_element}'";
-    fi;
-  done;
-  eval "${_name}"='"${_list}"';
-  eval "${return_ok}";
-}
-
-
-########################################################################
-# list_from_cmdline (    [...])
-#
-# Transform command line arguments into a normalized form.
-#
-# Options, option arguments, and file parameters are identified and
-# output each as a single-quoted argument of its own.  Options and
-# file parameters are separated by a '--' argument.
-#
-# Arguments: >=4
-#   : space-separated list of short options without an arg.
-#   : space-separated list of short options that have an arg.
-#   : space-separated list of long options without an arg.
-#   : space-separated list of long options that have an arg.
-#   ...: the arguments from a command line, such as "$@",
-#                     the content of a variable, or direct arguments.
-#
-# Globals: $POSIXLY_CORRECT (only kept for compatibility).
-#
-# Output: ['-[-]opt' ['optarg']]... '--' ['filename']...
-#
-# Example:
-#     list_normalize 'a b' 'c' '' 'long' -a f1 -bcarg --long=larg f2
-#   will result in printing:
-#     '-a' '-b' '-c' 'arg' '--long' 'larg' '--' 'f1' 'f2'
-#   If $POSIXLY_CORRECT is not empty, the result will be:
-#     '-a' '--' 'f1' '-bcarg' '--long=larg' 'f2'
-#
-#   Rationale:
-#     In POSIX, the first non-option ends the option processing.
-#     In GNU mode, used by default, non-option arguments are sorted
-#     behind the options.
-#
-#   Use this function only in the following way:
-#     eval set -- "$(args_norm '...' '...' '...' '...' "$@")";
-#     while test "$1" != '--'; do
-#       case "$1" in
-#       ...
-#       esac;
-#       shift;
-#     done;
-#     shift;         #skip '--'
-#     # all positional parameters ("$@") left are file name parameters.
-#
-list_from_cmdline()
-{
-  func_check list_from_cmdline '>=' 4 "$@";
-  local _fparams;
-  local _fn;
-  local _result;
-  local _long_a;
-  local _long_n;
-  local _short_a;
-  local _short_n;
-  _short_n="$(list_get "$1")"; # short options, no argument
-  _short_a="$(list_get "$2")"; # short options with argument
-  _long_n="$(list_get "$3")";	 # long options, no argument
-  _long_a="$(list_get "$4")";	 # long options with argument
-  shift 4;
-  _fn='list_from_cmdline():';	 # for error messages
-  if is_equal "$#" 0; then
-    echo -n "'--'";
-    eval "${return_ok}";
-  fi;
-  _fparams='';
-  _result='';
-  while test "$#" -ge 1; do
-    _arg="$1";
-    shift;
-    case "$_arg" in
-      --) break; ;;
-      --?*)
-        # delete leading '--';
-        _opt="$(echo -n "${_arg}" | sed -e 's/^..//')";
-        if list_has _long_n "${_opt}"; then
-          # long option, no argument
-          list_append _result "--${_opt}";
-          continue;
-        fi;
-        # test on `--opt=arg'
-        if string_contains "${_opt}" '='; then
-          # extract option by deleting from the first '=' to the end
-          _lopt="$(echo -n "${_opt}" | sed -e 's/=.*$//')";
-          if list_has _long_a "${_lopt}"; then
-            # get the option argument by deleting up to first `='
-            _optarg="$(echo -n "${_opt}" | sed -e 's/^[^=]*=//')";
-            list_append _result "--${_lopt}" "${_optarg}";
-            continue;
-          fi;
-        fi;
-        if list_has _long_a "${_opt}"; then
-          # long option with argument
-          if test "$#" -le 0; then
-            error "${_fn} no argument for option --${_opt}."
-          fi;
-          list_append _result "--${_opt}" "$1";
-          shift;
-          continue;
-        fi;
-        error "${_fn} --${_opt} is not an option."
-        ;;
-      -?*)			# short option (cluster)
-        # delete leading `-';
-        _rest="$(echo -n "${_arg}" | sed -e 's/^-//')";
-        while obj _rest is_not_empty; do
-          # get next short option from cluster (first char of $_rest)
-          _optchar="$(echo -n "${_rest}" | sed -e 's/^\(.\).*$/\1/')";
-          # remove first character from ${_rest};
-          _rest="$(echo -n "${_rest}" | sed -e 's/^.//')";
-          if list_has _short_n "${_optchar}"; then
-            list_append _result "-${_optchar}";
-            continue;
-          elif list_has _short_a "${_optchar}"; then
-            if obj _rest is_empty; then
-              if test "$#" -ge 1; then
-                list_append _result "-${_optchar}" "$1";
-                shift;
-                continue;
-              else
-                error \
-                  "${_fn}"' no argument for option -'"${_optchar}."
-              fi;
-            else		# rest is the argument
-              list_append _result "-${_optchar}" "${_rest}";
-              _rest='';
-              continue;
-            fi;
-          else
-            error "${_fn} unknown option -${_optchar}."
-          fi;
-        done;
-        ;;
-      *)
-	# Here, $_arg is not an option, so a file parameter.
-        # When $POSIXLY_CORRECT is set this ends option parsing;
-        # otherwise, the argument is stored as a file parameter and
-        # option processing is continued.
-        list_append _fparams "${_arg}";
-	if obj POSIXLY_CORRECT is_not_empty; then
-          break;
-        fi;
-        ;;
-    esac;
-  done;
-  list_append _result '--';
-  if obj _fparams is_not_empty; then
-    _result="${_result} ${_fparams}";
-  fi;
-  if test "$#" -gt 0; then
-    list_append _result "$@";
-  fi;
-  echo -n "$_result";
-  eval "${return_ok}";
-} # list_from_cmdline()
-
-
-########################################################################
-# list_from_split ( )
-#
-# In , escape all white space characters and replace each
-#  by space.
-#
-# Arguments: 2: a  that is to be split into parts divided by
-#               
-# Output:    the resulting list string
-#
-list_from_split()
-{
-  func_check list_from_split = 2 "$@";
-  local _s;
-
-  # precede each space or tab by a backslash `\' (doubled for `sed')
-  _s="$(echo -n "$1" | sed -e 's/\(['"${_SPACE}${_TAB}"']\)/\\\1/g')";
-
-  # replace split character of string by the list separator ` ' (space).
-  case "$2" in
-    /)				# cannot use normal `sed' separator
-      echo -n "${_s}" | sed -e '\|'"$2"'|s|| |g';
-      ;;
-    ?)				# use normal `sed' separator
-      echo -n "${_s}" | sed -e 's/'"$2"'/ /g';
-      ;;
-    ??*)
-      error 'list_from_split(): separator must be a single character.';
-      ;;
-  esac;
-  eval "${return_ok}";
-}
-
-
-########################################################################
-# list_get ()
-#
-# Check whether  is a space-separated list of '-quoted elements.
-#
-# If the test fails an error is raised.
-# If the test succeeds the argument is echoed.
-#
-# Testing criteria:
-#   A list has the form "'first' 'second' '...' 'last'".  So it has a
-#   leading and a final quote and the elements are separated by "' '"
-#   constructs.  If these are all removed there should not be any
-#   unescaped single-quotes left.  Watch out for escaped single
-#   quotes; they have the form '\'' (sq bs sq sq).
-
-# Arguments: 1
-# Output: the argument  unchanged, if the check succeeded.
-#
-list_get()
-{
-  func_check list_get = 1 "$@";
-  local _list;
-  eval _list='"${'$1'}"';
-  # remove leading and final space characters
-  _list="$(echo -n "${_list}" | \
-           sed -e '/^['"${_SPACE}${_TAB}"']*/s///' | \
-           sed -e '/['"${_SPACE}${_TAB}"']*$/s///')";
-  case "${_list}" in
-  '')
-    eval "${return_ok}";
-    ;;
-  \'*\')
-    echo -n "${_list}";
-    eval "${return_ok}";
-    ;;
-  *)
-    error "list_get(): bad list: $1"
-    ;;
-  esac;
-  eval "${return_ok}";
-}
-
-
-########################################################################
-# list_has ( )
-#
-# Arguments: 2
-#   : a variable name for a list of single-quoted elements
-#   :  some sequence of characters.
-# Output:
-#   if  is empty:  "'' '...'"
-#   otherwise:           "list '' ..."
-#
-list_has()
-{
-  func_check list_has = 2 "$@";
-  eval _list='"${'$1'}"';
-  if obj _list is_empty; then
-    eval "${return_no}";
-  fi;
-  _element="$2";
-  case "$2" in
-    \'*\')  _element="$2"; ;;
-    *)      _element="'$2'"; ;;
-  esac;
-  if string_contains "${_list}" "${_element}"; then
-    eval "${return_yes}";
-  else
-    eval "${return_no}";
-  fi;
-  eval "${return_ok}";
-}
-
-
-########################################################################
-# list_has_not ( )
-#
-# Arguments: 2
-#   :    a space-separated list of single-quoted elements.
-#   : some sequence of characters.
-# Output:
-#   if  is empty:  "'' '...'"
-#   otherwise:           " '' ..."
-#
-list_has_not()
-{
-  func_check list_has_not = 2 "$@";
-  eval _list='"${'$1'}"';
-  if obj _list is_empty; then
-    eval "${return_yes}";
-  fi;
-  _element="$2";
-  case "$2" in
-    \'*\')  _element="$2"; ;;
-    *)      _element="'$2'"; ;;
-  esac;
-  if string_contains "${_list}" "${_element}"; then
-    eval "${return_no}";
-  else
-    eval "${return_yes}";
-  fi;
-  eval "${return_ok}";
-}
-
-
-########################################################################
-landmark '7: man_*()';
-########################################################################
-
-########################################################################
-# man_do_filespec ()
-#
-# Print suitable man page(s) for filespec to $_TMP_CAT.
-#
-# Arguments : 2
-#   : argument of the form `man:name.section', `man:name',
-#               `man:name(section)', `name.section', `name'.
-#
-# Globals   : $_OPT_ALL
-#
-# Output    : none.
-# Return    : `0' if man page was found, `1' else.
-#
-# Only called from do_fileargs(), checks on $MANPATH and
-# $_MAN_ENABLE are assumed.
-#
-man_do_filespec()
-{
-  func_check man_do_filespec = 1 "$@";
-  local _got_one;
-  local _name;
-  local _prevsec;
-  local _res;
-  local _section;
-  local _spec;
-  local _string;
-  local s;
-  if obj _MAN_PATH is_empty; then
-    eval "${return_bad}";
-  fi;
-  if is_empty "$1"; then
-    eval "${return_bad}";
-  fi;
-  _spec="$1";
-  _name='';
-  _section='';
-  case "${_spec}" in
-    */*)			# not a man spec when it contains '/'
-      eval "${return_bad}";
-      ;;
-    man:?*\(?*\))		# man:name(section)
-      _name="$(echo -n "${_spec}" \
-               | sed -e 's/^man:\(..*\)(\(..*\))$/\1/')";
-      _section="$(echo -n "${_spec}" \
-               | sed -e 's/^man:\(..*\)(\(..*\))$/\2/')";
-      ;;
-    man:?*.[0-9on])			# man:name.section
-      _name="$(echo -n "${_spec}" \
-               | sed -e 's/^man:\(..*\)\..$/\1/')";
-      _section="$(echo -n "${_spec}" \
-               | sed -e 's/^.*\(.\)$/\1/')";
-      ;;
-    man:?*)			# man:name
-      _name="$(echo -n "${_spec}" | sed -e 's/^man://')";
-      ;;
-    ?*\(?*\))			# name(section)
-      _name="$(echo -n "${_spec}" \
-               | sed -e 's/^\(..*\)(\(..*\))$/\1/')";
-      _section="$(echo -n "${_spec}" \
-               | sed -e 's/^\(..*\)(\(..*\))$/\2/')";
-      ;;
-    ?*.[0-9on])			# name.section
-      _name="$(echo -n "${_spec}" \
-               | sed -e 's/^\(..*\)\..$/\1/')";
-      _section="$(echo -n "${_spec}" \
-               | sed -e 's/^.*\(.\)$/\1/')";
-      ;;
-    ?*)
-      _name="${_filespec}";
-      ;;
-  esac;
-  if obj _name is_empty; then
-    eval "${return_bad}";
-  fi;
-  _got_one='no';
-  if obj _section is_empty; then
-    eval set -- "${_MAN_AUTO_SEC}";
-    for s in "$@"; do
-      if man_search_section "${_name}" "$s"; then # found
-        if obj _MAN_ALL is_yes; then
-          _got_one='yes';
-        else
-          eval "${return_good}";
-        fi;
-      fi;
-    done;
-  else
-    if man_search_section "${_name}" "${_section}"; then
-      eval "${return_good}";
-    else
-      eval "${return_bad}";
-    fi;
-  fi;
-  if obj _MAN_ALL is_yes && is_yes "${_got_one}"; then
-    eval "${return_good}";
-  fi;
-  eval "${return_bad}";
-} # man_do_filespec()
-
-
-########################################################################
-# man_register_file (  [
]) -# -# Write a found man page file and register the title element. -# -# Arguments: 1, 2, or 3; maybe empty -# Output: none -# -man_register_file() -{ - func_check man_register_file '>=' 2 "$@"; - case "$#" in - 2|3) do_nothing; ;; - *) - error "man_register_file() expects 2 or 3 arguments."; - ;; - esac; - if is_empty "$1"; then - error 'man_register_file(): file name is empty'; - fi; - to_tmp "$1"; - case "$#" in - 2) - register_title "man:$2"; - eval "${return_ok}"; - ;; - 3) - register_title "$2.$3"; - eval "${return_ok}"; - ;; - esac; - eval "${return_ok}"; -} - - -######################################################################## -# man_search_section (
) -# -# Retrieve man pages. -# -# Arguments : 2 -# Globals : $_MAN_PATH, $_MAN_EXT -# Return : 0 if found, 1 otherwise -# -man_search_section() -{ - func_check man_search_section = 2 "$@"; - local _dir; - local _ext; - local _got_one; - local _name; - local _prefix - local _section; - local d; - local f; - if obj _MAN_PATH is_empty; then - eval "${return_bad}"; - fi; - if is_empty "$1"; then - eval "${return_bad}"; - fi; - if is_empty "$2"; then - eval "${return_bad}"; - fi; - _name="$1"; - _section="$2"; - eval set -- "$(path_split "${_MAN_PATH}")"; - _got_one='no'; - if obj _MAN_EXT is_empty; then - for d in "$@"; do - _dir="$(dirname_append "$d" "man${_section}")"; - if obj _dir is_dir; then - _prefix="$(dirname_append "${_dir}" "${_name}.${_section}")"; - for f in $(echo -n ${_prefix}*); do - if obj f is_file; then - if is_yes "${_got_one}"; then - register_file "$f"; - elif obj _MAN_ALL is_yes; then - man_register_file "$f" "${_name}"; - else - man_register_file "$f" "${_name}" "${_section}"; - eval "${return_good}"; - fi; - _got_one='yes'; - fi; - done; - fi; - done; - else - _ext="${_MAN_EXT}"; - # check for directory name having trailing extension - for d in "$@"; do - _dir="$(dirname_append $d man${_section}${_ext})"; - if obj _dir is_dir; then - _prefix="$(dirname_append "${_dir}" "${_name}.${_section}")"; - for f in ${_prefix}*; do - if obj f is_file; then - if is_yes "${_got_one}"; then - register_file "$f"; - elif obj _MAN_ALL is_yes; then - man_register_file "$f" "${_name}"; - else - man_register_file "$f" "${_name}" "${_section}"; - eval "${return_good}"; - fi; - _got_one='yes'; - fi; - done; - fi; - done; - # check for files with extension in directories without extension - for d in "$@"; do - _dir="$(dirname_append "$d" "man${_section}")"; - if obj _dir is_dir; then - _prefix="$(dirname_append "${_dir}" \ - "${_name}.${_section}${_ext}")"; - for f in ${_prefix}*; do - if obj f is_file; then - if is_yes "${_got_one}"; then - register_file "$f"; - elif obj _MAN_ALL is_yes; then - man_register_file "$f" "${_name}"; - else - man_register_file "$f" "${_name}" "${_section}"; - eval "${return_good}"; - fi; - _got_one='yes'; - fi; - done; - fi; - done; - fi; - if obj _MAN_ALL is_yes && is_yes "${_got_one}"; then - eval "${return_good}"; - fi; - eval "${return_bad}"; -} # man_search_section() - - -######################################################################## -# man_setup () -# -# Setup the variables $_MAN_* needed for man page searching. -# -# Globals: -# in: $_OPT_*, $_MANOPT_*, $LANG, $LC_MESSAGES, $LC_ALL, -# $MANPATH, $MANROFFSEQ, $MANSEC, $PAGER, $SYSTEM, $MANOPT. -# out: $_MAN_PATH, $_MAN_LANG, $_MAN_SYS, $_MAN_LANG, $_MAN_LANG2, -# $_MAN_SEC, $_MAN_ALL -# in/out: $_MAN_ENABLE -# -# The precedence for the variables related to `man' is that of GNU -# `man', i.e. -# -# $LANG; overridden by -# $LC_MESSAGES; overridden by -# $LC_ALL; this has the same precedence as -# $MANPATH, $MANROFFSEQ, $MANSEC, $PAGER, $SYSTEM; overridden by -# $MANOPT; overridden by -# the groffer command line options. -# -man_setup() -{ - func_check main_man_setup = 0 "$@"; - local _lang; - - if obj _MAN_IS_SETUP is_yes; then - eval "${return_ok}"; - fi; - _MAN_IS_SETUP='yes'; - - if obj _MAN_ENABLE is_not_yes; then - eval "${return_ok}"; - fi; - - # determine basic path for man pages - _MAN_PATH="$(get_first_essential \ - "${_OPT_MANPATH}" "${_MANOPT_PATH}" "${MANPATH}")"; - if obj _MAN_PATH is_empty; then - manpath_set_from_path; - else - _MAN_PATH="$(path_clean "${_MAN_PATH}")"; - fi; - if obj _MAN_PATH is_empty; then - if is_prog 'manpath'; then - _MAN_PATH="$(manpath 2>/dev/null)"; # not always available - fi; - fi; - if obj _MAN_PATH is_empty; then - _MAN_ENABLE="no"; - eval "${return_ok}"; - fi; - - _MAN_ALL="$(get_first_essential "${_OPT_ALL}" "${_MANOPT_ALL}")"; - if obj _MAN_ALL is_empty; then - _MAN_ALL='no'; - fi; - - _MAN_SYS="$(get_first_essential \ - "${_OPT_SYSTEMS}" "${_MANOPT_SYS}" "${SYSTEM}")"; - _lang="$(get_first_essential \ - "${_OPT_LANG}" "${LC_ALL}" "${LC_MESSAGES}" "${LANG}")"; - case "${_lang}" in - C|POSIX) - _MAN_LANG=""; - _MAN_LANG2=""; - ;; - ?) - _MAN_LANG="${_lang}"; - _MAN_LANG2=""; - ;; - *) - _MAN_LANG="${_lang}"; - # get first two characters of $_lang - _MAN_LANG2="$(echo -n "${_lang}" | sed -e 's/^\(..\).*$/\1/')"; - ;; - esac; - # from now on, use only $_LANG, forget about $_OPT_LANG, $LC_*. - - manpath_add_lang_sys; # this is very slow - - _MAN_SEC="$(get_first_essential \ - "${_OPT_SECT}" "${_MANOPT_SEC}" "${MANSEC}")"; - if obj _MAN_PATH is_empty; then - _MAN_ENABLE="no"; - eval "${return_ok}"; - fi; - - _MAN_EXT="$(get_first_essential \ - "${_OPT_EXTENSION}" "${_MANOPT_EXTENSION}")"; - eval "${return_ok}"; -} # man_setup() - - -######################################################################## -landmark '8: manpath_*()'; -######################################################################## - -######################################################################## -# manpath_add_lang_sys () -# -# Add language and operating system specific directories to man path. -# -# Arguments : 0 -# Output : none -# Globals: -# in: $_MAN_SYS: has the form `os1,os2,...', a comma separated -# list of names of operating systems. -# $_MAN_LANG and $_MAN_LANG2: each a single name -# in/out: $_MAN_PATH: has the form `dir1:dir2:...', a colon -# separated list of directories. -# -manpath_add_lang_sys() -{ - func_check manpath_add_lang_sys = 0 "$@"; - local p; - local _mp; - if obj _MAN_PATH is_empty; then - eval "${return_ok}"; - fi; - # twice test both sys and lang - eval set -- "$(path_split "${_MAN_PATH}")"; - _mp=''; - for p in "$@"; do # loop on man path directories - _mp="$(_manpath_add_lang_sys_single "${_mp}" "$p")"; - done; - eval set -- "$(path_split "${_mp}")"; - for p in "$@"; do # loop on man path directories - _mp="$(_manpath_add_lang_sys_single "${_mp}" "$p")"; - done; - _MAN_PATH="$(path_chop "${_mp}")"; - eval "${return_ok}"; -} - - -_manpath_add_lang_sys_single() -{ - # To the directory in $1 append existing sys/lang subdirectories - # Function is necessary to split the OS list. - # - # globals: in: $_MAN_SYS, $_MAN_LANG, $_MAN_LANG2 - # argument: 2: `man_path' and `dir' - # output: colon-separated path of the retrieved subdirectories - # - func_check _manpath_add_lang_sys_single = 2 "$@"; - local d; - _res="$1"; - _parent="$2"; - eval set -- "$(list_from_split "${_MAN_SYS}" ',')"; - for d in "$@" "${_MAN_LANG}" "${_MAN_LANG2}"; do - _dir="$(dirname_append "${_parent}" "$d")"; - if obj _res path_not_contains "${_dir}" && obj _dir is_dir; then - _res="${_res}:${_dir}"; - fi; - done; - if path_not_contains "${_res}" "${_parent}"; then - _res="${_res}:${_parent}"; - fi; - path_chop "${_res}"; -} - -# end manpath_add_lang_sys () - - -######################################################################## -# manpath_set_from_path () -# -# Determine basic search path for man pages from $PATH. -# -# Return: `0' if a valid man path was retrieved. -# Output: none -# Globals: -# in: $PATH -# out: $_MAN_PATH -# -manpath_set_from_path() -{ - func_check manpath_set_from_path = 0 "$@"; - local _base; - local _mandir; - local _manpath; - local d; - local e; - _manpath=''; - - # get a basic man path from $PATH - if obj PATH is_not_empty; then - eval set -- "$(path_split "${PATH}")"; - for d in "$@"; do - # delete the final `/bin' part - _base="$(echo -n "$d" | sed -e '\|//*bin/*$|s|||')"; - for e in /share/man /man; do - _mandir="${_base}$e"; - if test -d "${_mandir}" && test -r "${_mandir}"; then - _manpath="${_manpath}:${_mandir}"; - fi; - done; - done; - fi; - - # append some default directories - for d in /usr/local/share/man /usr/local/man \ - /usr/share/man /usr/man \ - /usr/X11R6/man /usr/openwin/man \ - /opt/share/man /opt/man \ - /opt/gnome/man /opt/kde/man; do - if obj _manpath path_not_contains "$d" && obj d is_dir; then - _manpath="${_manpath}:$d"; - fi; - done; - - _MAN_PATH="${_manpath}"; - eval "${return_ok}"; -} # manpath_set_from_path() - - -######################################################################## -landmark '9: obj_*()'; -######################################################################## - -######################################################################## -# obj ( ...) -# -# This works like a method (object function) call for an object. -# Run " $ ...". -# -# The first argument represents an object whose data is given as first -# argument to (). -# -# Argument: >=2 -# : variable name -# : a program or function name -# -obj() -{ - func_check obj '>=' 2 "$@"; - local func; - local var; - if is_empty "$2"; then - error "obj(): function name is empty." - else - func="$2"; - fi; - eval arg1='"${'$1'}"'; - shift; - shift; - eval "${func}"' "${arg1}" "$@"'; -} - - -######################################################################## -# obj_data () -# -# Print the data of , i.e. the content of $. -# For possible later extensions. -# -# Arguments: 1 -# : a variable name -# Output: the data of -# -obj_data() -{ - func_check obj '=' 1 "$@"; - if is_empty "$1"; then - error "obj_data(): object name is empty." - fi; - eval echo -n '"${'$1'}"'; -} - - -######################################################################## -# obj_from_output ( ...) -# -# Run '$="$( ...)"' to set the result of a -# function call to a global variable. -# -# Arguments: >=2 -# : a variable name -# : the name of a function or program -# : optional argument to -# Output: none -# -obj_from_output() -{ - func_check obj_from_output '>=' 2 "$@"; - local result_name; - if is_empty "$1"; then - error "res(): variable name is empty."; - elif is_empty "$2"; then - error "res(): function name is empty." - else - result_name="$1"; - fi; - shift; - eval "${result_name}"'="$('"$@"')"'; -} - - -######################################################################## -# obj_set ( ) -# -# Set the data of , i.e. call "$=". -# -# Arguments: 2 -# : a variable name -# : a string -# Output:: none -# -obj_set() -{ - func_check obj_set '=' 2 "$@"; - if is_empty "$1"; then - error "obj_set(): object name is empty." - fi; - eval "$1"='"$2"'; -} - - -######################################################################## -# path_chop () -# -# Remove unnecessary colons from path. -# -# Argument: 1, a colon separated path. -# Output: path without leading, double, or trailing colons. -# -path_chop() -{ - func_check path_chop = 1 "$@"; - local _res; - - # replace multiple colons by a single colon `:' - # remove leading and trailing colons - echo -n "$1" | sed -e 's/:::*/:/g' | - sed -e 's/^:*//' | - sed -e 's/:*$//'; - eval "${return_ok}"; -} - - -######################################################################## -# path_clean () -# -# Remove non-existing directories from a colon-separated list. -# -# Argument: 1, a colon separated path. -# Output: colon-separated list of existing directories. -# -path_clean() -{ - func_check path_clean = 1 "$@"; - local _arg; - local _dir; - local _res; - local i; - if is_not_equal "$#" 1; then - error 'path_clean() needs 1 argument.'; - fi; - _arg="$1"; - eval set -- "$(path_split "${_arg}")"; - _res=""; - for i in "$@"; do - if obj i is_not_empty \ - && obj _res path_not_contains "$i" \ - && obj i is_dir; - then - case "$i" in - ?*/) _res="${_res}$(dirname_chop "$i")"; ;; - *) _res="${_res}:$i"; - esac; - fi; - done; - if path_chop "${_res}"; then - eval "${return_ok}"; - else - eval "${return_badk}"; - fi; -} - - -######################################################################## -# path_contains ( ) -#- -# Test whether `dir' is contained in `path', a list separated by `:'. -# -# Arguments : 2 arguments. -# Return : `0' if arg2 is substring of arg1, `1' otherwise. -# -path_contains() -{ - func_check path_contains = 2 "$@"; - case ":$1:" in - *":$2:"*) - eval "${return_yes}"; - ;; - *) - eval "${return_no}"; - ;; - esac; - eval "${return_ok}"; -} - - -######################################################################## -# path_not_contains ( ) -#- -# Test whether `dir' is not contained in colon separated `path'. -# -# Arguments : 2 arguments. -# -path_not_contains() -{ - func_check path_not_contains = 2 "$@"; - if path_contains "$1" "$2"; then - eval "${return_no}"; - else - eval "${return_yes}"; - fi; - eval "${return_ok}"; -} - - -######################################################################## -# path_split () -# -# In `path' escape white space and replace each colon by a space. -# -# Arguments: 1: a colon-separated path -# Output: the resulting list, process with `eval set --' -# -path_split() -{ - func_check path_split = 1 "$@"; - list_from_split "$1" ':'; - eval "${return_ok}"; -} - - -######################################################################## -landmark '10: register_*()'; -######################################################################## - -######################################################################## -# register_file () -# -# Write a found file and register the title element. -# -# Arguments: 1: a file name -# Output: none -# -register_file() -{ - func_check register_file = 1 "$@"; - if is_empty "$1"; then - error 'register_file(): file name is empty'; - fi; - if is_equal "$1" '-'; then - to_tmp "${_TMP_STDIN}"; - register_title '-'; - else - to_tmp "$1"; - register_title "$(base_name "$1")"; - fi; - eval "${return_ok}"; -} - - -######################################################################## -# register_title () -# -# Create title element from and append to $_REGISTERED_TITLE -# -# Globals: $_REGISTERED_TITLE (rw) -# -register_title() -{ - func_check register_title = 1 "$@"; - local _title; - if is_empty "$1"; then - eval "${return_ok}"; - fi; - _title="$(base_name "$1")"; # remove directory part - - # remove extension `.gz' - _title="$(echo -n "${_title}" | sed -e 's/\.gz$//')"; - # remove extension `.Z' - _title="$(echo -n "${_title}" | sed -e 's/\.Z$//')"; - - if obj _title is_empty; then - eval "${return_ok}"; - fi; - _REGISTERED_TITLE="${_REGISTERED_TITLE} ${_title}"; - eval "${return_ok}"; -} - - -######################################################################## -# reset () -# -# Reset the variables that can be affected by options to their default. -# -# -# Defined in section `Preset' after the rudimentary shell tests. - - -######################################################################## -# save_stdin () -# -# Store standard input to temporary file (with decompression). -# -if obj _HAS_COMPRESSION is_yes; then - save_stdin() - { - local _f; - func_check save_stdin = 0 "$@"; - _f="${_TMP_DIR}"/INPUT; - cat >"${_f}"; - catz "${_f}" >"${_TMP_STDIN}"; - rm -f "${_f}"; - eval "${return_ok}"; - } -else - save_stdin() - { - func_check save_stdin = 0 "$@"; - cat >"${_TMP_STDIN}"; - eval "${return_ok}"; - } -fi; - - -######################################################################## -landmark '11: stack_*()'; -######################################################################## - -######################################################################## -# string_contains ( ) -# -# Test whether `part' is contained in `string'. -# -# Arguments : 2 text arguments. -# Return : `0' if arg2 is substring of arg1, `1' otherwise. -# -string_contains() -{ - func_check string_contains = 2 "$@"; - case "$1" in - *"$2"*) - eval "${return_yes}"; - ;; - *) - eval "${return_no}"; - ;; - esac; - eval "${return_ok}"; -} - - -######################################################################## -# string_not_contains ( ) -# -# Test whether `part' is not substring of `string'. -# -# Arguments : 2 text arguments. -# Return : `0' if arg2 is substring of arg1, `1' otherwise. -# -string_not_contains() -{ - func_check string_not_contains = 2 "$@"; - if string_contains "$1" "$2"; then - eval "${return_no}"; - else - eval "${return_yes}"; - fi; - eval "${return_ok}"; -} - - -######################################################################## -landmark '12: tmp_*()'; -######################################################################## - -######################################################################## -# tmp_cat () -# -# output the temporary cat file (the concatenation of all input) -# -tmp_cat() -{ - cat "${_TMP_CAT}"; -} - - -######################################################################## -# tmp_create (?) -# -# create temporary file -# -# It's safe to use the shell process ID together with a suffix to -# have multiple temporary files. -# -# Output : name of created file -# -tmp_create() -{ - func_check tmp_create '<=' 1 "$@"; - local _tmp; - # the output file does not have `,' as first character - _tmp="${_TMP_DIR}/,$1"; - echo -n >"${_tmp}"; - echo -n "${_tmp}"; # output file name - eval "${return_ok}"; -} - - -######################################################################## -# to_tmp () -# -# print file (decompressed) to the temporary cat file -# -to_tmp() -{ - func_check to_tmp = 1 "$@"; - if is_file "$1"; then - if obj _OPT_LOCATION is_yes; then - echo2 "$1"; - fi; - if obj _OPT_WHATIS is_yes; then - what_is "$1" >>"${_TMP_CAT}"; - else - catz "$1" >>"${_TMP_CAT}"; - fi; - else - error "to_tmp(): could not read file \`$1'."; - fi; - eval "${return_ok}"; -} - - -######################################################################## -# trap_clean () -# -# disable trap on all exit codes ($_ALL_EXIT) -# -# Arguments: 0 -# Globals: $_ALL_EXIT -# -trap_clean() -{ - func_check trap_clean = 0 "$@"; - local i; - for i in ${_ALL_EXIT}; do - trap "" "$i" 2>/dev/null || true; - done; - eval "${return_ok}"; -} - - -######################################################################## -# trap_set () -# -# call function on all exit codes ($_ALL_EXIT) -# -# Arguments: 1 (name of a shell function) -# Globals: $_ALL_EXIT -# -trap_set() -{ - func_check trap_set = 1 "$@"; - local i; - for i in ${_ALL_EXIT}; do - trap "$1" "$i" 2>/dev/null || true; - done; - eval "${return_ok}"; -} - - -######################################################################## -# usage () -# -# print usage information to stderr; for groffer option --help. -# -usage() -{ - func_check usage = 0 "$@"; - echo; - version; - echo 'Usage: '"${_PROGRAM_NAME}"' [option]... [filespec]...'; - cat <&1 | sed -e '/^ *$/q' | sed -e '1s/^/is part of /' >&2; -} - - -######################################################################## -# warning () -# -# Print warning to stderr -# -warning() -{ - echo2 "warning: $*"; -} - - -######################################################################## -# what_is () -# -# Interpret as a man page and display its `whatis' -# information as a fragment written in the groff language. -# -what_is() -{ - func_check what_is = 1 "$@"; - local _res; - local _dot; - if is_not_file "$1"; then - error "what_is(): argument is not a readable file." - fi; - _dot='^\.['"${_SPACE}${_TAB}"']*'; - echo '.br'; - echo "$1: "; - echo '.br'; - echo -n ' '; - # grep the line containing `.TH' macro, if any - _res="$(catz "$1" | sed -e '/'"${_dot}"'TH /p -d')"; - if obj _res is_not_empty; then # traditional man style - # get the text between the first and the second `.SH' macro, by - # - delete up to first .SH; - # - of this, print everything up to next .SH, and delete the rest; - # - of this, delete the final .SH line; - catz "$1" | sed -e '1,/'"${_dot}"'SH/d' \ - | sed -e '1,/'"${_dot}"'SH/p -d' \ - | sed -e '/'"${_dot}"'SH/d'; - eval "${return_ok}"; - fi; - # grep the line containing `.Dd' macro, if any - _res="$(catz "$1" | sed -e '/'"${_dot}"'Dd /p -d')"; - if obj _res is_not_empty; then # BSD doc style - # get the text between the first and the second `.Nd' macro, by - # - delete up to first .Nd; - # - of this, print everything up to next .Nd, and delete the rest; - # - of this, delete the final .Nd line; - catz "$1" | sed -e '1,/'"${_dot}"'Nd/d' \ - | sed -e '1,/'"${_dot}"'Nd/p -d' \ - | sed -e '/'"${_dot}"'Nd/d'; - eval "${return_ok}"; - fi; - echo 'is not a man page.'; - eval "${return_bad}"; -} - - -######################################################################## -# where () -# -# Output path of a program if in $PATH. -# -# Arguments : >=1 (empty allowed) -# more args are ignored, this allows to specify progs with arguments -# Return : `0' if arg1 is a program in $PATH, `1' otherwise. -# -where() -{ - func_check where '>=' 1 "$@"; - local _file; - local _arg; - local p; - _arg="$1"; - if obj _arg is_empty; then - eval "${return_bad}"; - fi; - case "${_arg}" in - /*) - if test -f "${_arg}" && test -x "${_arg}"; then - eval "${return_ok}"; - else - eval "${return_bad}"; - fi; - ;; - esac; - eval set -- "$(path_split "${PATH}")"; - for p in "$@"; do - case "$p" in - */) _file=${p}${_arg}; ;; - *) _file=${p}/${_arg}; ;; - esac; - if test -f "${_file}" && test -x "${_file}"; then - echo -n "${_file}"; - eval "${return_ok}"; - fi; - done; - eval "${return_bad}"; -} - - -######################################################################## -# main -######################################################################## - -# The main area contains the following parts: -# - main_init(): initialize temporary files and set exit trap -# - parse $MANOPT -# - main_parse_args(): argument parsing -# - determine display mode -# - process filespec arguments -# - setup X resources -# - do the displaying - -# These parts are implemented as functions, being defined below in the -# sequence they are called in the main() function. - - -####################################################################### -# main_init () -# -# set exit trap and create temporary files -# -# Globals: $_TMP_CAT, $_TMP_STDIN -# -landmark '13: main_init()'; -main_init() -{ - func_check main_init = 0 "$@"; - # call clean_up() on any signal - trap_set clean_up; - - # determine temporary directory - umask 000; - _TMP_DIR=''; - for d in "${GROFF_TMPDIR}" "${TMPDIR}" "${TMP}" "${TEMP}" \ - "${TEMPDIR}" "${HOME}"'/tmp' '/tmp' "${HOME}" '.'; - do - if is_not_empty "$d"; then - if obj d is_dir && obj d is_writable; then - _TMP_DIR="${d}/${_PROGRAM_NAME}${_PROCESS_ID}"; - if obj _TMP_DIR is_dir; then - rm -f "${_TMP_DIR}"/*; - break; - else - mkdir "${_TMP_DIR}"; - if obj _TMP_DIR is_not_dir; then - _TMP_DIR=''; - continue; - fi; - break; - fi; - fi; - if obj _TMP_DIR is_not_writable; then - _TMP_DIR=''; - continue; - fi; - fi; - done; - unset d; - if obj _TMP_DIR is_empty; then - error "Couldn't create a directory for storing temporary files."; - fi; - - _TMP_CAT="$(tmp_create groffer_cat)"; - _TMP_STDIN="$(tmp_create groffer_input)"; - - # groffer configuration files - for f in ${_CONFFILES}; do - if obj f is_file; then - echo '_groffer_opt=""' >>${_TMP_CAT}; - # collect the lines starting with a minus - cat "$f" | sed -e \ - '/^[ ]*\(-.*\)$/s//_groffer_opt="${_groffer_opt} \1"'/ \ - >>${_TMP_CAT}; - # prepend the collected information to $GROFFER_OPT - echo 'GROFFER_OPT="${_groffer_opt} ${GROFFER_OPT}"' >>${_TMP_CAT}; - fi; - done; - . "${_TMP_CAT}"; - _TMP_CAT="$(tmp_create groffer_cat)"; - - eval "${return_ok}"; -} # main_init() - - -######################################################################## -# main_parse_MANOPT () -# -# Parse $MANOPT to retrieve man options, but only if it is a non-empty -# string; found man arguments can be overwritten by the command line. -# -# Globals: -# in: $MANOPT, $_OPTS_MANOPT_* -# out: $_MANOPT_* -# in/out: $GROFFER_OPT -# -landmark '14: main_parse_MANOPT()'; -main_parse_MANOPT() -{ - func_check main_parse_MANOPT = 0 "$@"; - local _opt; - local _list; - _list=''; - if obj MANOPT is_not_empty; then - MANOPT="$(echo -n "${MANOPT}" | \ - sed -e 's/^'"${_SPACE}${_SPACE}"'*//')"; - fi; - if obj MANOPT is_empty; then - eval "${return_ok}"; - fi; - # add arguments in $MANOPT by mapping them to groffer options - eval set -- "$(list_from_cmdline \ - _OPTS_MANOPT_SHORT_NA _OPTS_MANOPT_SHORT_ARG \ - _OPTS_MANOPT_LONG_NA _OPTS_MANOPT_LONG_ARG \ - "${MANOPT}")"; - until test "$#" -le 0 || is_equal "$1" '--'; do - _opt="$1"; - shift; - case "${_opt}" in - -7|--ascii) - list_append _list '--ascii'; - ;; - -a|--all) - list_append _list '--all'; - ;; - -c|--catman) - do_nothing; - shift; - ;; - -d|--debug) - list_append _list '--debug'; - ;; - -D|--default) - # undo all man options so far - _list=''; - ;; - -e|--extension) - list_append _list '--extension'; - shift; - ;; - -f|--whatis) - list_append _list '--whatis'; - shift; - ;; - -h|--help) - do_nothing; - shift; - ;; - -k|--apropos) - # groffer's --apropos takes an argument, but man's does not, so - do_nothing; - shift; - ;; - -l|--local-file) - list_append _list '--local-file'; - ;; - -L|--locale) - list_append _list '--locale' "$1"; - shift; - ;; - -m|--systems) - list_append _list '--systems' "$1"; - shift; - ;; - -M|--manpath) - list_append _list '--manpath' "$1"; - shift; - ;; - -p|--preprocessor) - do_nothing; - shift; - ;; - -P|--pager|--tty-viewer) - list_append _list '--pager' "$1"; - shift; - ;; - -r|--prompt) - do_nothing; - shift; - ;; - -S|--sections) - list_append _list '--sections' "$1"; - shift; - ;; - -t|--troff) - do_nothing; - shift; - ;; - -T|--device) - list_append _list '-T' "$1"; - shift; - ;; - -u|--update) - do_nothing; - shift; - ;; - -V|--version) - do_nothing; - ;; - -w|--where|--location) - list_append _list '--location'; - ;; - -Z|--ditroff) - list_append _list '-Z' "$1"; - shift; - ;; - # ignore all other options - esac; - done; - # append the 2 lists in $_list and $GROFFER_OPT to $GROFFER_OPT - if obj GROFFER_OPT is_empty; then - GROFFER_OPT="${_list}"; - elif obj _list is_not_empty; then - GROFFER_OPT="${_list} ${GROFFER_OPT}"; - fi; - eval "${return_ok}"; -} # main_parse_MANOPT() - - -######################################################################## -# main_parse_args (*) -# -# Parse arguments; process options and filespec parameters -# -# Arguments: pass the command line arguments unaltered. -# Globals: -# in: $_OPTS_* -# out: $_OPT_*, $_ADDOPTS, $_FILEARGS -# -landmark '15: main_parse_args()'; -main_parse_args() -{ - func_check main_parse_args '>=' 0 "$@"; - local _arg; - local _code; - local _dpi; - local _longopt; - local _mode; - local _opt; - local _optchar; - local _optarg; - local _opts; - local _string; - - eval set -- "${GROFFER_OPT}" '"$@"'; - - eval set -- "$(list_from_cmdline \ - _OPTS_CMDLINE_SHORT_NA _OPTS_CMDLINE_SHORT_ARG \ - _OPTS_CMDLINE_LONG_NA _OPTS_CMDLINE_LONG_ARG \ - "$@")"; - -# By the call of `eval', unnecessary quoting was removed. So the -# positional shell parameters ($1, $2, ...) are now guaranteed to -# represent an option or an argument to the previous option, if any; -# then a `--' argument for separating options and -# parameters; followed by the filespec parameters if any. - -# Note, the existence of arguments to options has already been checked. -# So a check for `$#' or `--' should not be done for arguments. - - until test "$#" -le 0 || is_equal "$1" '--'; do - _opt="$1"; # $_opt is fed into the option handler - shift; - case "${_opt}" in - -h|--help) - usage; - leave; - ;; - -Q|--source) # output source code (`Quellcode'). - _OPT_MODE='source'; - ;; - -T|--device|--troff-device) # device; arg - _OPT_DEVICE="$1"; - _check_device_with_mode; - shift; - ;; - -v|--version) - version; - leave; - ;; - -V) - _OPT_V='yes'; - ;; - -Z|--ditroff|--intermediate-output) # groff intermediate output - _OPT_Z='yes'; - ;; - -X|--X|--x) - _OPT_MODE=x; - ;; - -?) - # delete leading `-' - _optchar="$(echo -n "${_opt}" | sed -e 's/^.//')"; - if list_has _OPTS_GROFF_SHORT_NA "${_optchar}"; - then - list_append _ADDOPTS_GROFF "${_opt}"; - elif list_has _OPTS_GROFF_SHORT_ARG "${_optchar}"; - then - list_append _ADDOPTS_GROFF "${_opt}" "$1"; - shift; - else - error "Unknown option : \`$1'"; - fi; - ;; - --all) - _OPT_ALL="yes"; - ;; - --ascii) - list_append _ADDOPTS_GROFF '-mtty-char'; - if obj _mode is_empty; then - _mode='text'; - fi; - ;; - --apropos) # run `apropos' - apropos_run "$1"; - _code="$?"; - clean_up; - exit "${_code}"; - ;; - --apropos-data) # run `apropos' for data sections - apropos_run "$1" | grep '^[^(]*([457])'; - _code="$?"; - clean_up; - exit "${_code}"; - ;; - --apropos-devel) # run `apropos' for development sections - apropos_run "$1" | grep '^[^(]*([239])'; - _code="$?"; - clean_up; - exit "${_code}"; - ;; - --apropos-progs) # run `apropos' for program sections - apropos_run "$1" | grep '^[^(]*([168])'; - _code="$?"; - clean_up; - exit "${_code}"; - ;; - --auto) # the default automatic mode - _mode=''; - ;; - --bd) # border color for viewers, arg; - _OPT_BD="$1"; - shift; - ;; - --bg|--backgroud) # background color for viewers, arg; - _OPT_BG="$1"; - shift; - ;; - --bw) # border width for viewers, arg; - _OPT_BW="$1"; - shift; - ;; - --default) # reset variables to default - reset; - ;; - --default-modes) # sequence of modes in auto mode; arg - _OPT_DEFAULT_MODES="$1"; - shift; - ;; - --debug) # buggy, only for development - _OPT_DEBUG='yes'; - ;; - --display) # set X display, arg - _OPT_DISPLAY="$1"; - shift; - ;; - --dvi) - _OPT_MODE='dvi'; - ;; - --dvi-viewer) # viewer program for dvi mode; arg - _OPT_VIEWER_DVI="$1"; - shift; - ;; - --extension) # the extension for man pages, arg - _OPT_EXTENSION="$1"; - shift; - ;; - --fg|--foreground) # foreground color for viewers, arg; - _OPT_FG="$1"; - shift; - ;; - --fn|--font) # set font for viewers, arg; - _OPT_FN="$1"; - shift; - ;; - --geometry) # window geometry for viewers, arg; - _OPT_GEOMETRY="$1"; - shift; - ;; - --groff) - _OPT_MODE='groff'; - ;; - --html|--www) # display with web browser - _OPT_MODE=html; - ;; - --html-viewer|--www-viewer) # viewer program for html mode; arg - _OPT_VIEWER_HTML="$1"; - shift; - ;; - --iconic) # start viewers as icons - _OPT_ICONIC='yes'; - ;; - --locale) # set language for man pages, arg - # argument is xx[_territory[.codeset[@modifier]]] (ISO 639,...) - _OPT_LANG="$1"; - shift; - ;; - --local-file) # force local files; same as `--no-man' - _MAN_FORCE='no'; - _MAN_ENABLE='no'; - ;; - --location|--where) # print file locations to stderr - _OPT_LOCATION='yes'; - ;; - --man) # force all file params to be man pages - _MAN_ENABLE='yes'; - _MAN_FORCE='yes'; - ;; - --manpath) # specify search path for man pages, arg - # arg is colon-separated list of directories - _OPT_MANPATH="$1"; - shift; - ;; - --mode) # display mode - _arg="$1"; - shift; - case "${_arg}" in - auto|'') # search mode automatically among default - _mode=''; - ;; - groff) # pass input to plain groff - _mode='groff'; - ;; - html|www) # display with a web browser - _mode='html'; - ;; - dvi) # display with xdvi viewer - _mode='dvi'; - ;; - pdf) # display with PDF viewer - _mode='pdf'; - ;; - ps) # display with Postscript viewer - _mode='ps'; - ;; - text) # output on terminal - _mode='text'; - ;; - tty) # output on terminal - _mode='tty'; - ;; - X|x) # output on X roff viewer - _mode='x'; - ;; - Q|source) # display source code - _mode="source"; - ;; - *) - error "unknown mode ${_arg}"; - ;; - esac; - _OPT_MODE="${_mode}"; - ;; - --no-location) # disable former call to `--location' - _OPT_LOCATION='yes'; - ;; - --no-man) # disable search for man pages - # the same as --local-file - _MAN_FORCE="no"; - _MAN_ENABLE="no"; - ;; - --pager) # set paging program for tty mode, arg - _OPT_PAGER="$1"; - shift; - ;; - --pdf) - _OPT_MODE='pdf'; - ;; - --pdf-viewer) # viewer program for ps mode; arg - _OPT_VIEWER_PDF="$1"; - shift; - ;; - --ps) - _OPT_MODE='ps'; - ;; - --ps-viewer) # viewer program for ps mode; arg - _OPT_VIEWER_PS="$1"; - shift; - ;; - --resolution) # set resolution for X devices, arg - _arg="$1"; - shift; - case "${_arg}" in - 75|75dpi) - _dpi=75; - ;; - 100|100dpi) - _dpi=100; - ;; - *) - error "only resoutions of 75 or 100 dpi are supported"; - ;; - esac; - _OPT_RESOLUTION="${_dpi}"; - ;; - --rv) - _OPT_RV='yes'; - ;; - --sections) # specify sections for man pages, arg - # arg is colon-separated list of section names - _OPT_SECTIONS="$1"; - shift; - ;; - --shell) - shift; - ;; - --systems) # man pages for different OS's, arg - # argument is a comma-separated list - _OPT_SYSTEMS="$1"; - shift; - ;; - --text) # text mode without pager - _OPT_MODE=text; - ;; - --title) # title for X viewers; arg - _OPT_TITLE="$1"; - shift; - ;; - --tty) # tty mode, text with pager - _OPT_MODE=tty; - ;; - --text-device|--tty-device) # device for tty mode; arg - _OPT_TEXT_DEVICE="$1"; - shift; - ;; - --whatis) - _OPT_WHATIS='yes'; - ;; - --xrm) # pass X resource string, arg; - list_append _OPT_XRM "$1"; - shift; - ;; - --x-viewer|--X-viewer) # viewer program for x mode; arg - _OPT_VIEWER_X="$1"; - shift; - ;; - *) - error 'error on argument parsing : '"\`$*'"; - ;; - esac; - done; - shift; # remove `--' argument - - if obj _DEBUG is_not_yes; then - if obj _OPT_DEBUG is_yes; then - _DEBUG='yes'; - fi; - fi; - - # Remaining arguments are file names (filespecs). - # Save them to list $_FILEARGS - if is_equal "$#" 0; then # use "-" for standard input - set -- '-'; - fi; - _FILEARGS=''; - list_append _FILEARGS "$@"; - if list_has _FILEARGS '-'; then - save_stdin; - fi; - # $_FILEARGS must be retrieved with `eval set -- "$_FILEARGS"' - eval "${return_ok}"; -} # main_parse_args() - -# Called from main_parse_args() because double `case' is not possible. -# Globals: $_OPT_DEVICE, $_OPT_MODE -_check_device_with_mode() -{ - func_check _check_device_with_mode = 0 "$@"; - case "${_OPT_DEVICE}" in - dvi) - _OPT_MODE=dvi; - eval "${return_ok}"; - ;; - html) - _OPT_MODE=html; - eval "${return_ok}"; - ;; - lbp|lj4) - _OPT_MODE=groff; - eval "${return_ok}"; - ;; - ps) - _OPT_MODE=ps; - eval "${return_ok}"; - ;; - ascii|cp1047|latin1|utf8) - if obj _OPT_MODE is_not_equal text; then - _OPT_MODE=tty; # default text mode - fi; - eval "${return_ok}"; - ;; - X*) - _OPT_MODE=x; - eval "${return_ok}"; - ;; - *) # unknown device, go to groff mode - _OPT_MODE=groff; - eval "${return_ok}"; - ;; - esac; - eval "${return_error}"; -} - - -######################################################################## -# main_set_mode () -# -# Determine the display mode. -# -# Globals: -# in: $DISPLAY, $_OPT_MODE, $_OPT_DEVICE -# out: $_DISPLAY_MODE -# - -# _get_first_prog () -# -# Retrieve first argument that represents an existing program in $PATH. -# Local function for main_set_mode(). -# -# Arguments: 1; a comma-separated list of commands (with options), -# like $_VIEWER_*. -# -# Return : `1' if none found, `0' if found. -# Output : the argument that succeded. -# -landmark '16: main_set_mode()'; -main_set_mode() -{ - func_check main_set_mode = 0 "$@"; - local m; - local _modes; - local _viewer; - local _viewers; - - # handle apropos - if obj _OPT_APROPOS is_not_empty; then - apropos "${_OPT_APROPOS}"; - _code="$?"; - clean_up; - exit "${_code}"; - fi; - if obj _OPT_APROPOS_DATA is_not_empty; then - apropos "$@" | grep '^[^(]*([457])'; - _code="$?"; - clean_up; - exit "${_code}"; - fi; - if obj _OPT_APROPOS_DEVEL is_not_empty; then - apropos "$@" | grep '^[^(]*([239])'; - _code="$?"; - clean_up; - exit "${_code}"; - fi; - if obj _OPT_APROPOS_PROGS is_not_empty; then - apropos "$@" | grep '^[^(]*([168])'; - _code="$?"; - clean_up; - exit "${_code}"; - fi; - - # set display - if obj _OPT_DISPLAY is_not_empty; then - DISPLAY="${_OPT_DISPLAY}"; - fi; - - if obj _OPT_V is_yes; then - _DISPLAY_MODE='groff'; - list_append _ADDOPTS_GROFF '-V'; - fi; - if obj _OPT_Z is_yes; then - _DISPLAY_MODE='groff'; - list_append _ADDOPTS_GROFF '-Z'; - fi; - if obj _OPT_MODE is_equal 'groff'; then - _DISPLAY_MODE='groff'; - fi; - if obj _DISPLAY_MODE is_equal 'groff'; then - eval "${return_ok}"; - fi; - - if obj _OPT_MODE is_equal 'source'; then - _DISPLAY_MODE='source'; - eval "${return_ok}"; - fi; - - case "${_OPT_MODE}" in - '') # automatic mode - case "${_OPT_DEVICE}" in - X*) - if obj DISPLAY is_empty; then - error "no X display found for device ${_OPT_DEVICE}"; - fi; - _DISPLAY_MODE='x'; - eval "${return_ok}"; - ;; - ascii|cp1047|latin1|utf8) - if obj _DISPLAY_MODE is_not_equal 'text'; then - _DISPLAY_MODE='tty'; - fi; - eval "${return_ok}"; - ;; - esac; - if obj DISPLAY is_empty; then - _DISPLAY_MODE='tty'; - eval "${return_ok}"; - fi; - - if obj _OPT_DEFAULT_MODES is_empty; then - _modes="${_DEFAULT_MODES}"; - else - _modes="${_OPT_DEFAULT_MODES}"; - fi; - ;; - text) - _DISPLAY_MODE='text'; - eval "${return_ok}"; - ;; - tty) - _DISPLAY_MODE='tty'; - eval "${return_ok}"; - ;; - *) # display mode was given - if obj DISPLAY is_empty; then - error "you must be in X Window for ${_OPT_MODE} mode."; - fi; - _modes="${_OPT_MODE}"; - ;; - esac; - - # only viewer modes are left - eval set -- "$(list_from_split "${_modes}" ',')"; - while test "$#" -gt 0; do - m="$1"; - shift; - case "$m" in - text) - _DISPLAY_MODE='text'; - eval "${return_ok}"; - ;; - tty) - _DISPLAY_MODE='tty'; - eval "${return_ok}"; - ;; - x) - if obj _OPT_VIEWER_X is_not_empty; then - _viewers="${_OPT_VIEWER_X}"; - else - _viewers="${_VIEWER_X}"; - fi; - _viewer="$(_get_first_prog "${_viewers}")"; - if is_not_equal "$?" 0; then - continue; - fi; - _DISPLAY_PROG="${_viewer}"; - _DISPLAY_MODE='x'; - eval "${return_ok}"; - ;; - dvi) - if obj _OPT_VIEWER_DVI is_not_empty; then - _viewers="${_OPT_VIEWER_DVI}"; - else - _viewers="${_VIEWER_DVI}"; - fi; - _viewer="$(_get_first_prog "${_viewers}")"; - if is_not_equal "$?" 0; then - continue; - fi; - _DISPLAY_PROG="${_viewer}"; - _DISPLAY_MODE="dvi"; - eval "${return_ok}"; - ;; - pdf) - if obj _OPT_VIEWER_PDF is_not_empty; then - _viewers="${_OPT_VIEWER_PDF}"; - else - _viewers="${_VIEWER_PDF}"; - fi; - _viewer="$(_get_first_prog "${_viewers}")"; - if is_not_equal "$?" 0; then - continue; - fi; - _DISPLAY_PROG="${_viewer}"; - _DISPLAY_MODE="pdf"; - eval "${return_ok}"; - ;; - ps) - if obj _OPT_VIEWER_PS is_not_empty; then - _viewers="${_OPT_VIEWER_PS}"; - else - _viewers="${_VIEWER_PS}"; - fi; - _viewer="$(_get_first_prog "${_viewers}")"; - if is_not_equal "$?" 0; then - continue; - fi; - _DISPLAY_PROG="${_viewer}"; - _DISPLAY_MODE="ps"; - eval "${return_ok}"; - ;; - html) - if obj _OPT_VIEWER_HTML is_not_empty; then - _viewers="${_OPT_VIEWER_HTML}"; - else - _viewers="${_VIEWER_HTML}"; - fi; - _viewer="$(_get_first_prog "${_viewers}")"; - if is_not_equal "$?" 0; then - continue; - fi; - _DISPLAY_PROG="${_viewer}"; - _DISPLAY_MODE=html; - eval "${return_ok}"; - ;; - esac; - done; - error "no suitable display mode found."; -} - -_get_first_prog() -{ - local i; - if is_equal "$#" 0; then - error "_get_first_prog() needs 1 argument."; - fi; - if is_empty "$1"; then - return "${_BAD}"; - fi; - eval set -- "$(list_from_split "$1" ',')"; - for i in "$@"; do - if obj i is_empty; then - continue; - fi; - if is_prog "$(get_first_essential $i)"; then - echo -n "$i"; - return "${_GOOD}"; - fi; - done; - return "${_BAD}"; -} # main_set_mode() - - -####################################################################### -# main_do_fileargs () -# -# Process filespec arguments in $_FILEARGS. -# -# Globals: -# in: $_FILEARGS (process with `eval set -- "$_FILEARGS"') -# -landmark '17: main_do_fileargs()'; -main_do_fileargs() -{ - func_check main_do_fileargs = 0 "$@"; - local _exitcode; - local _filespec; - local _name; - _exitcode="${_BAD}"; - eval set -- "${_FILEARGS}"; - unset _FILEARGS; - # temporary storage of all input to $_TMP_CAT - while test "$#" -ge 2; do - # test for `s name' arguments, with `s' a 1-char standard section - _filespec="$1"; - shift; - case "${_filespec}" in - '') - continue; - ;; - '-') - if register_file '-'; then - _exitcode="${_GOOD}"; - fi; - continue; - ;; - ?) - if list_has_not _MAN_AUTO_SEC "${_filespec}"; then - if do_filearg "${_filespec}"; then - _exitcode="${_GOOD}"; - fi; - continue; - fi; - _name="$1"; - case "${_name}" in - */*|man:*|*\(*\)|*."${_filespec}") - if do_filearg "${_filespec}"; then - _exitcode="${_GOOD}"; - fi; - continue; - ;; - esac; - if do_filearg "man:${_name}(${_filespec})"; then - _exitcode="${_GOOD}"; - shift; - continue; - else - if do_filearg "${_filespec}"; then - _exitcode="${_GOOD}"; - fi; - continue; - fi; - ;; - *) - if do_filearg "${_filespec}"; then - _exitcode="${_GOOD}"; - fi; - continue; - ;; - esac; - done; # end of `s name' test - while test "$#" -gt 0; do - _filespec="$1"; - shift; - if do_filearg "${_filespec}"; then - _exitcode="${_GOOD}"; - fi; - done; - rm -f "${_TMP_STDIN}"; - if is_equal "${_exitcode}" "${_BAD}"; then - eval "${return_bad}"; - fi; - eval "${return_ok}"; -} # main_do_fileargs() - - -######################################################################## -# main_set_resources () -# -# Determine options for setting X resources with $_DISPLAY_PROG. -# -# Globals: $_DISPLAY_PROG, $_OUTPUT_FILE_NAME -# -landmark '18: main_set_resources()'; -main_set_resources() -{ - func_check main_set_resources = 0 "$@"; - local _prog; # viewer program - local _rl; # resource list - local n; - _title="$(get_first_essential \ - "${_OPT_TITLE}" "${_REGISTERED_TITLE}")"; - _OUTPUT_FILE_NAME=''; - set -- ${_title}; - until is_equal "$#" 0; do - n="$1"; - case "$n" in - '') - continue; - ;; - ,*) - n="$(echo -n "$1" | sed -e '/^,,*/s///')"; - ;; - esac - if obj n is_empty; then - continue; - fi; - if obj _OUTPUT_FILE_NAME is_not_empty; then - _OUTPUT_FILE_NAME="${_OUTPUT_FILE_NAME},"; - fi; - _OUTPUT_FILE_NAME="${_OUTPUT_FILE_NAME}$n"; - shift; - done; - case "${_OUTPUT_FILE_NAME}" in - '') - _OUTPUT_FILE_NAME='-'; - ;; - ,*) - error "$_OUTPUT_FILE_NAME starts with a comma."; - ;; - esac; - _OUTPUT_FILE_NAME="${_TMP_DIR}/${_OUTPUT_FILE_NAME}"; - - if obj _DISPLAY_PROG is_empty; then # for example, for groff mode - _DISPLAY_ARGS=''; - eval "${return_ok}"; - fi; - - set -- ${_DISPLAY_PROG}; - _prog="$(base_name "$1")"; - _rl=''; - if obj _OPT_BD is_not_empty; then - case "${_prog}" in - ghostview|gv|gxditview|xditview|xdvi) - list_append _rl '-bd' "${_OPT_BD}"; - ;; - esac; - fi; - if obj _OPT_BG is_not_empty; then - case "${_prog}" in - ghostview|gv|gxditview|xditview|xdvi) - list_append _rl '-bg' "${_OPT_BG}"; - ;; - xpdf) - list_append _rl '-papercolor' "${_OPT_BG}"; - ;; - esac; - fi; - if obj _OPT_BW is_not_empty; then - case "${_prog}" in - ghostview|gv|gxditview|xditview|xdvi) - _list_append _rl '-bw' "${_OPT_BW}"; - ;; - esac; - fi; - if obj _OPT_FG is_not_empty; then - case "${_prog}" in - ghostview|gv|gxditview|xditview|xdvi) - list_append _rl '-fg' "${_OPT_FG}"; - ;; - esac; - fi; - if is_not_empty "${_OPT_FN}"; then - case "${_prog}" in - ghostview|gv|gxditview|xditview|xdvi) - list_append _rl '-fn' "${_OPT_FN}"; - ;; - esac; - fi; - if is_not_empty "${_OPT_GEOMETRY}"; then - case "${_prog}" in - ghostview|gv|gxditview|xditview|xdvi|xpdf) - list_append _rl '-geometry' "${_OPT_GEOMETRY}"; - ;; - esac; - fi; - if is_empty "${_OPT_RESOLUTION}"; then - _OPT_RESOLUTION="${_DEFAULT_RESOLUTION}"; - case "${_prog}" in - gxditview|xditview) - list_append _rl '-resolution' "${_DEFAULT_RESOLUTION}"; - ;; - xpdf) - case "${_DEFAULT_RESOLUTION}" in - 75) - # 72dpi is '100' - list_append _rl '-z' '104'; - ;; - 100) - list_append _rl '-z' '139'; - ;; - esac; - ;; - esac; - else - case "${_prog}" in - ghostview|gv|gxditview|xditview|xdvi) - list_append _rl '-resolution' "${_OPT_RESOLUTION}"; - ;; - xpdf) - case "${_OPT_RESOLUTION}" in - 75) - list_append _rl '-z' '104'; - # '100' corresponds to 72dpi - ;; - 100) - list_append _rl '-z' '139'; - ;; - esac; - ;; - esac; - fi; - if is_yes "${_OPT_ICONIC}"; then - case "${_prog}" in - ghostview|gv|gxditview|xditview|xdvi) - list_append _rl '-iconic'; - ;; - esac; - fi; - if is_yes "${_OPT_RV}"; then - case "${_prog}" in - ghostview|gv|gxditview|xditview|xdvi) - list_append _rl '-rv'; - ;; - esac; - fi; - if is_not_empty "${_OPT_XRM}"; then - case "${_prog}" in - ghostview|gv|gxditview|xditview|xdvi|xpdf) - eval set -- "{$_OPT_XRM}"; - for i in "$@"; do - list_append _rl '-xrm' "$i"; - done; - ;; - esac; - fi; - if is_not_empty "${_title}"; then - case "${_prog}" in - gxditview|xditview) - list_append _rl '-title' "${_title}"; - ;; - esac; - fi; - _DISPLAY_ARGS="${_rl}"; - - eval "${return_ok}"; -} # main_set_resources - - -######################################################################## -# main_display () -# -# Do the actual display of the whole thing. -# -# Globals: -# in: $_DISPLAY_MODE, $_OPT_DEVICE, -# $_ADDOPTS_GROFF, $_ADDOPTS_POST, $_ADDOPTS_X, -# $_REGISTERED_TITLE, $_TMP_CAT, -# $_OPT_PAGER $PAGER $_MANOPT_PAGER -# -landmark '19: main_display()'; -main_display() -{ - func_check main_display = 0 "$@"; - local p; - local _addopts; - local _device; - local _groggy; - local _modefile; - local _options; - local _pager; - local _title; - export _addopts; - export _groggy; - export _modefile; - - if obj _TMP_CAT is_non_empty_file; then - _modefile="${_OUTPUT_FILE_NAME}"; - else - clean_up; - eval "${return_ok}"; - fi; - case "${_DISPLAY_MODE}" in - groff) - _ADDOPTS_GROFF="${_ADDOPTS_GROFF} ${_ADDOPTS_POST}"; - if obj _OPT_DEVICE is_not_empty; then - _ADDOPTS_GROFF="${_ADDOPTS_GROFF} -T${_OPT_DEVICE}"; - fi; - _groggy="$(tmp_cat | eval grog "${_options}")"; - trap_clean; - # start a new shell program to get another process ID. - sh -c ' - set -e; - test -f "${_modefile}" && rm -f "${_modefile}"; - mv "${_TMP_CAT}" "${_modefile}"; - cat "${_modefile}" | \ - ( - clean_up() - { - if test -d "${_TMP_DIR}"; then - rm -f "${_TMP_DIR}"/* || true; - rmdir "${_TMP_DIR}"; - fi; - } - trap clean_up 0 2>/dev/null || true; - eval "${_groggy}" "${_ADDOPTS_GROFF}"; - ) &' - ;; - text|tty) - case "${_OPT_DEVICE}" in - '') - _device="$(get_first_essential \ - "${_OPT_TEXT_DEVICE}" "${_DEFAULT_TTY_DEVICE}")"; - ;; - ascii|cp1047|latin1|utf8) - _device="${_OPT_DEVICE}"; - ;; - *) - warning \ - "wrong device for ${_DISPLAY_MODE} mode: ${_OPT_DEVICE}"; - ;; - esac; - _addopts="${_ADDOPTS_GROFF} ${_ADDOPTS_POST}"; - _groggy="$(tmp_cat | grog -T${_device})"; - if obj _DISPLAY_MODE is_equal 'text'; then - tmp_cat | eval "${_groggy}" "${_addopts}"; - else - _pager=''; - for p in "${_OPT_PAGER}" "${PAGER}" "${_MANOPT_PAGER}" \ - 'less -r -R' 'more' 'pager' 'cat'; do - if is_prog $p; then # no "" for is_prog() allows args for $p - _pager="$p"; - break; - fi; - done; - if obj _pager is_empty; then - error 'no pager program found for tty mode'; - fi; - tmp_cat | eval "${_groggy}" "${_addopts}" | \ - eval "${_pager}"; - fi; - clean_up; - ;; - - #### viewer modes - - dvi) - case "${_OPT_DEVICE}" in - ''|dvi) do_nothing; ;; - *) - warning \ - "wrong device for ${_DISPLAY_MODE} mode: ${_OPT_DEVICE}"; - ;; - esac; - _groggy="$(tmp_cat | grog -Tdvi)"; - _do_display; - ;; - html) - case "${_OPT_DEVICE}" in - ''|html) do_nothing; ;; - *) - warning \ - "wrong device for ${_DISPLAY_MODE} mode: ${_OPT_DEVICE}"; - ;; - esac; - _modefile="${_modefile}".html - _groggy="$(tmp_cat | grog -Thtml)"; - _do_display; - ;; - pdf) - case "${_OPT_DEVICE}" in - ''|ps) - do_nothing; - ;; - *) - warning \ - "wrong device for ${_DISPLAY_MODE} mode: ${_OPT_DEVICE}"; - ;; - esac; - _modefile="${_modefile}" - _groggy="$(tmp_cat | grog -Tps)"; - trap_clean; - # start a new shell program to get another process ID. - sh -c ' - set -e; - _psfile="${_modefile}.ps"; - _modefile="${_modefile}.pdf"; - test -f "${_psfile}" && rm -f "${_psfile}"; - test -f "${_modefile}" && rm -f "${_modefile}"; - cat "${_TMP_CAT}" | \ - eval "${_groggy}" "${_ADDOPTS_GROFF}" > "${_psfile}"; - gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite \ - -sOutputFile="${_modefile}" -c save pop -f "${_psfile}"; - test -f "${_psfile}" && rm -f "${_psfile}"; - test -f "${_TMP_CAT}" && rm -f "${_TMP_CAT}"; - ( - clean_up() { - rm -f "${_modefile}"; - if test -d "${_TMP_DIR}"; then - rm -f "${_TMP_DIR}"/* || true; - rmdir "${_TMP_DIR}"; - fi; - } - trap clean_up 0 2>/dev/null || true; - eval "${_DISPLAY_PROG}" ${_DISPLAY_ARGS} "${_modefile}"; - ) &' - ;; - ps) - case "${_OPT_DEVICE}" in - ''|ps) - do_nothing; - ;; - *) - warning \ - "wrong device for ${_DISPLAY_MODE} mode: ${_OPT_DEVICE}"; - ;; - esac; - _groggy="$(tmp_cat | grog -Tps)"; - _do_display; - ;; - source) - tmp_cat; - clean_up; - ;; - x) - case "${_OPT_DEVICE}" in - '') - _groggy="$(tmp_cat | grog -Z)"; - ;; - X*|ps) - _groggy="$(tmp_cat | grog -T"${_OPT_DEVICE}" -Z)"; - ;; - *) - warning \ - "wrong device for ${_DISPLAY_MODE} mode: ${_OPT_DEVICE}"; - _groggy="$(tmp_cat | grog -Z)"; - ;; - esac; - _do_display; - ;; - *) - error "unknown mode \`${_DISPLAY_MODE}'"; - ;; - esac; - eval "${return_ok}"; -} # main_display() - -_do_display() -{ - func_check _do_display = 0 "$@"; - trap_clean; - # start a new shell program for another process ID and better - # cleaning-up of the temporary files. - sh -c ' - set -e; - test -f "${_modefile}" && rm -f "${_modefile}"; - cat "${_TMP_CAT}" | \ - eval "${_groggy}" "${_ADDOPTS_GROFF}" > "${_modefile}"; - rm -f "${_TMP_CAT}"; - ( - clean_up() { - if test -d "${_TMP_DIR}"; then - rm -f "${_TMP_DIR}"/* || true; - rmdir "${_TMP_DIR}"; - fi; - } - trap clean_up 0 2>/dev/null || true; - eval "${_DISPLAY_PROG}" ${_DISPLAY_ARGS} "${_modefile}"; - ) &' -} - - -######################################################################## -# main (*) -# -# The main function for groffer. -# -# Arguments: -# -main() -{ - func_check main '>=' 0 "$@"; - # Do not change the sequence of the following functions! - main_init; - main_parse_MANOPT; - main_parse_args "$@"; - main_set_mode; - main_do_fileargs; - main_set_resources; - main_display; - eval "${return_ok}"; -} - -landmark '20: end of function definitions'; - -######################################################################## - -main "$@"; diff -ruN groff-1.19.1/contrib/groffer/Makefile.sub groff-1.19.2/contrib/groffer/Makefile.sub --- groff-1.19.1/contrib/groffer/Makefile.sub 2004-04-28 01:40:39.000000000 +0200 +++ groff-1.19.2/contrib/groffer/Makefile.sub 2005-08-15 16:49:38.000000000 +0200 @@ -1,47 +1,60 @@ -# Makefile.sub for `groffer' (integration into the groff source tree) +# Makefile.sub for `groffer' (integration into the `groff' source tree) # File position: /contrib/groffer/Makefile.sub -# Last update: 21 October 2002 +# Copyright (C) 2001,2002,2005 Free Software Foundation, Inc. +# Written by Werner Lemberg and Bernd Warken. -# Copyright (C) 2001,2002 Free Software Foundation, Inc. -# Written by Werner Lemberg +# Last update: 15 August 2005 -# This file is part of groff. +# This file is part of `groffer' which is part of `groff'. -# groff is free software; you can redistribute it and/or modify it +# `groff' 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. -# groff 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. +# `groff' 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 groff; see the files COPYING and LICENSE in the top -# directory of the groff source. If not, write to the Free Software -# Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# along with `groff'; see the files COPYING and LICENSE in the top +# directory of the `groff' source. If not, write to the Free Software +# Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. ######################################################################## MAN1=groffer.n CLEANADD=groffer +# not all make programs have $(RM) predefined. +RM=rm -f + all: groffer -groffer: groffer.sh - rm -f $@; \ - sed -e "s|@BINDIR@|$(bindir)|g" \ +groffer: groffer.sh groffer2.sh $(SH_DEPS_SED_SCRIPT) + $(RM) $@; + sed -f $(SH_DEPS_SED_SCRIPT) \ + -e "s|@g@|$(g)|g" \ + -e "s|@BINDIR@|$(bindir)|g" \ + -e "s|@libdir@|$(libdir)|g" \ -e "s|@VERSION@|$(version)$(revision)|g" \ - -e $(SH_SCRIPT_SED_CMD) $(srcdir)/groffer.sh >$@; \ + -e $(SH_SCRIPT_SED_CMD) $(srcdir)/groffer.sh >$@; chmod +x $@ install_data: groffer -test -d $(bindir) || $(mkinstalldirs) $(bindir) - -rm -f $(bindir)/groffer + -$(RM) $(bindir)/groffer $(INSTALL_SCRIPT) groffer $(bindir)/groffer + -test -d $(libdir)/groff/groffer || \ + $(mkinstalldirs) $(libdir)/groff/groffer + -$(RM) $(libdir)/groff/groffer/groffer2.sh + $(INSTALL_SCRIPT) $(srcdir)/groffer2.sh \ + $(libdir)/groff/groffer/groffer2.sh uninstall_sub: - -rm -f $(bindir)/groffer + -$(RM) $(bindir)/groffer + -$(RM) $(libdir)/groff/groffer/groffer2.sh + -rmdir $(libdir)/groff/groffer diff -ruN groff-1.19.1/contrib/groffer/README groff-1.19.2/contrib/groffer/README --- groff-1.19.1/contrib/groffer/README 2004-04-28 01:51:05.000000000 +0200 +++ groff-1.19.2/contrib/groffer/README 2005-08-03 00:02:43.000000000 +0200 @@ -1,44 +1,104 @@ +README + The `groffer' program is the easiest way to read documents written in -some `groff' language, such as the `man pages', the manual pages in -many operating systems. All input is sent to `grog' and then to -`groff' such that no special `groff' arguments must be determined. - -`groffer' also has many built-in `man' functionalities to find and -read the manual pages on UNIX and similar operating systems. It -accepts the information from an installed `man' program, but tries to -find a man path by itself if there isn't any. - -So far, `groffer' is a shell script. It should run on any POSIX or -Bourne style shell, but it runs the fastest under the GNU `ash' shell. -If this shell is available, it is started automatically. There are -efforts to port part of the shell script to C/C++ to increase the -speed independent of the shell. +some `roff' language, such as the `man pages', the manual pages in +many operating systems. + + +Input + +Input comes from either standard input or command line parameters that +represent names of exisiting roff files or standardized specifications +for searching man pages. All of these can be compressed in a format +that is decompressible by `gzip', including `.gz', `bz2', and `.Z'. + +`groffer' has many built-in `man' functionalities to find and read the +manual pages on UNIX and similar operating systems. It accepts the +information from an installed `man' program, but tries to find a man +path by itself. + +`groffer' bundles all filespec parameters into a single output file in +the same way as `groff'. The disadvantage of this is that all file +name arguments must use the same groff language. To change this, the +option parsing must be revised for large parts. It seems that this +would create incompatibilities, so the actual option strategy is kept. + + +Output + +All input is first sent to `grog' to determine the necessary `groff' +options and then to `groff'. So no special `groff' arguments must be +given. But all `groff' options can be specified when this seems to be +appropriate. + +The following displaying modes for the output are available: +- Display formatted input with +-- the X `roff' viewer `gxditview', +-- a Postcript viewer, +-- a PDF viewer, +-- a DVI viewer, +-- a web browser, +-- a pager in a text terminal (tty). +- Generate `groff' output on stdout without a viewer. +- Generate the `groff intermediate output' on standard output without + postprocessing. +- Output the source code without any `groff' processing. +- There are some information outputs without `groff' processing, such + as by option `-V' and the `man' like `whatis' and `apropos' + outputs. + +By default, the program tries to display with `gxditview' as graphical +device in X; on non-X text terminals, the `tty' text mode with a pager +is tried by default. + + +Compatibility + +`groffer' consists of two shell scripts. It should run on any POSIX +or Bourne style shell that supports shell functions. See file +`README_SH' for more information. + + +Mailing lists For reporting bugs of `groffer', groff's free mailing list - can be used. For a general discussion, the - is more useful; see the `README' file in the top -directory of the `groff' source package for more details on this -mailing list. + can be used. + +For a general discussion, the mailing list is more +useful, but one has to subscribe to this list at +http://lists.gnu.org/mailman/listinfo/groff. + +See the `README' file in the top directory of the `groff' source +package for more details on these mailing lists. ####### License -Copyright (C) 2003,2004 Free Software Foundation, Inc. +Last update: 2 August 2005 + +Copyright (C) 2003,2004,2005 Free Software Foundation, Inc. Written by Bernd Warken -This file is part of groffer, which is part of groff. +This file is part of `groffer', which is part of `groff'. -groff is free software; you can redistribute it and/or modify it +`groff' 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. -groff 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. +`groff' 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 groff; see the files COPYING and LICENSE in the top -directory of the groff source. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +along with `groff'; see the files COPYING and LICENSE in the top +directory of the `groff' source. If not, write to the Free Software +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. + + +####### Emacs settings + +Local Variables: +mode: text +End: diff -ruN groff-1.19.1/contrib/groffer/README_SH groff-1.19.2/contrib/groffer/README_SH --- groff-1.19.1/contrib/groffer/README_SH 2004-04-30 09:35:05.000000000 +0200 +++ groff-1.19.2/contrib/groffer/README_SH 2005-08-19 01:37:18.000000000 +0200 @@ -1,39 +1,39 @@ -Description of groffer.sh, the shell version of groffer +Additional description for the shell version of `groffer' -Display groff files and man pages on X or tty, even when compressed. +Scripts -Usage +The shell version of `groffer' contains two files, `groffer.sh' and +`groffer2.sh'. -Input comes from either standard input or command line parameters that -represent names of exisiting roff files or standardized specifications -for searching man pages. All of these can be compressed in a format -that is decompressible by `gzip', including `.gz', `bz2', and `.Z'. - -The following displaying modes are available: -- Display formatted input with the X roff viewer `gxditview', -- with a Prostcript viewer, -- with a dvi viewer, -- with a web browser. -- Display formatted input in plain text mode. -- Run a pager on the formatted input in a text terminal (tty). -- Generate output for some groff device on stdout without a viewer. -- Output only the source code without any groff processing. -- Generate the troff intermediate output on standard output - without groff postprocessing. -By default, the program tries to display with `gxditview' as graphical -device, `tty' mode with a pager is tried as text display. - - -Several File Arguments - -So far, `groffer' bundles all filespec parameters into a single output -file in the same way as `groff'. The disadvantage of this is that all -file name arguments must have the same groff language. - -To change this, the option parsing must be revised for large parts. -It seems that this would create incompatibilities, so the actual -option strategy is kept. +`groffer.sh' is a short introductory script without any functions. I +can be run with a very poor Bourne shell. It just contains some basic +variables, the reading of the configuration files, and the +determination of the shell for `groffer2.sh'. This script is +transformed by `make' into `groffer' which will be installed into +@bindir@, which is usually /usr/local/bin. + +`groffer2.sh' is a long main script with all functions; it is called +by `groffer.sh' (`groffer' after installation). It is installed +unchanged into @libdir@/groff/groffer, which is usually +/usr/local/lib/groff/groffer. This script can be called with a +different shell, using the `groffer' option `--shell'. + + +Options + +The `groffer' script provides its own option parser. It is compatible +to the usual GNU style command line This includes long option names +with two signs such as `--option', clusters of short options, the +mixing of options and non-option file names, the option `--' to close +the option handling, and it is possible to abbreviate the long option +names. + +The flexible mixing of options and file names in GNU style is always +possible, even if the environment variable `$POSIXLY_CORRECT' is set +to a non-empty value. This disables the rather wicked POSIX behavior +to terminate option parsing when the first non-option command line +argument is found. Error Handling @@ -44,115 +44,32 @@ and error(). -Shell Compatibility - -This shell script is compatible to the both the GNU and the POSIX -shell and utilities. Care was taken to restrict the programming -technics used here in order to achieve POSIX compatibility as far -back as POSIX P1003.2 Draft 11.2 of September 1991. - -The only non-builtin used here is POSIX `sed'. This script was -tested under `bash', `ash', and `ksh'. The speed under `ash' is -more than double when compared to the larger shells. - -This script provides its own option parser. It is compatible to the -usual GNU style command line (option clusters, long options, mixing -of options and non-option file names), except that it is not -possible to abbreviate long option names. - -The mixing of options and file names can be prohibited by setting -the environment variable `$POSIXLY_CORRECT' to a non-empty value. -This enables the rather wicked POSIX behavior to terminate option -parsing when the first non-option command line argument is found. - - -Survey of Functions defined in groffer.sh - -The elements specified within paranthesis `(<>)' give hints to what -the arguments are meant to be; the argument names are irrelevant. -<>? 0 or 1 -<>* arbitrarily many such arguments, incl. none -<>+ one or more such arguments -<> exactly 1 - -A function that starts with an underscore `_' is an internal -function for some function. The internal functions are defined just -after their corresponding function; they are not mentioned in the -following. - -abort (text>*) -base_name (path) -catz () -clean_up () -diag (text>*) -dirname_append ( []) -dirname_chop () -do_filearg () -do_nothing () -echo2 (*) -echo2n (*) -error (*) -get_first_essential (*) -is_dir () -is_empty () -is_equal ( ) -is_file () -is_non_empty_file () -is_not_dir () -is_not_empty () -is_not_equal ( ) -is_not_file () -is_not_prog () -is_not_writable () -is_not_yes () -is_prog () -is_yes () -leave () -landmark () -list_append ( ...) -list_from_cmdline ( [...]) -list_from_split ( ) -list_get () -list_has ( ) -list_has_not ( ) -main_*(), see after the functions -man_do_filespec () -man_setup () -man_register_file ( [ [
]]) -man_search_section (
) -man_set() -manpath_add_lang( ) -manpath_add_system() -manpath_from_path () -normalize_args ( *) -path_chop () -path_clean () -path_contains ( ) -path_not_contains ( ) -path_split () -register_file () -register_title () -res ( ...) -reset () -save_stdin () -string_contains ( ) -string_not_contains ( ) -tmp_cat () -tmp_create (?) -to_tmp () -trap_clean () -trap_set () -usage () -version () -warning () -whatis () -where () - +Function Definitions in `groffer2.sh' -External non-groffer Environment Variables - -If these variables are exported in the script the `ash' shell coughs -when calling `groff' in `main_display()'. +Each funtion in groffer2.sh has a description that starts with the +function name and symbols for its arguments in paranthesis `()'. Each +`<>' construction gives an argument name that just gives a hint on +what the argument is meant to be; these argument names are otherwise +irrelevant. The `>' sign can be followed by another character that +shows how many of these arguments are possible. + + exactly 1 of this argument +? 0 or 1 of these arguments +* arbitrarily many such arguments, incl. none ++ one or more such arguments +... one or more such arguments +[...] optional arguments + +A function that starts with an underscore `_' is an internal function +for some other function. The internal functions are defined just +after their corresponding function. + + +External Environment Variables + +The groffer.sh script uses the following external system variables. +It is supposed that these variables are already exported outside of +groffer.sh; otherwise they do not have a value within the script. external system environment variables that are explicitly used $DISPLAY: Presets the X display. @@ -160,7 +77,7 @@ $LC_ALL: For language specific man pages. $LC_MESSAGES: For language specific man pages. $PAGER: Paging program for tty mode. -$PATH: Path for the programs called (: list). +$PATH: Path for the programs called (`:' separated list). groffer native environment variables $GROFFER_OPT preset options for groffer. @@ -196,24 +113,156 @@ The class `list' represents an array structure, see list_*(). +Shell Compatibility + +The `groffer' shell scripts are compatible to both the GNU and the +POSIX shell and utilities. Care was taken to restrict the programming +technics used here in order to achieve POSIX compatibility as far back +as POSIX P1003.2 Draft 11.2 of September 1991. This draft is +available at http://www.funet.fi/pub/doc/posix/p1003.2/d11.2 in the +internet. + +The POSIX draft does not include `local' variables for functions. So +this concept was replaced by global variables with a prefix that +differs for each function. The prefix is chosen from the function +name. These quasi-local variables are unset before each return of the +function. + +The `groffer' scripts were tested under the shells `ash', `bash', +`bash-minimal', `dash', 'ksh', `mksh', `pdksh', 'posh', and `zsh' +without problems in Linux Debian. A shell can be tested by the +`groffer' option `--shell', but that will run only with groffer2.sh. +To start it directly from the beginning under this shell the following +command can be used. + + groffer.sh --shell= ... + + +Some shells are not fully POSIX compatible. For them the following +restrictions were done. For more information look at the +documentation `Portable shells' in the `info' page of `autoconf' +(look-up in Emacs-Help-Manuals_Info). + +- The command parts `then', `else', and `do' must be written each on a + line of their own. + +- Replace `for i in "$@"' by `for i' and remove internal `;' (kah). + +- Replace `set -- ...' by `set x ...; shift'. After the first + non-option argument, all arguments including those starting with `-' + are accepted as non-option. For variables or `$()' constructs with + line-breaks, use `eval set' without quotes. That transforms a + line-break within a variable to a space. + +- The name of the variable in `for' is chosen as a single character + (old ash). The content of such variables is not safe because it can + also occur in other functions. So it is often stored in an + additional quasi-local variable. + +- `echo' is not portable on options; some `echo' commands have many + options, others have none. So `echo -n' cannot be used, such that + the output of each function has complete lines. There are two + methods to avoid having `-' as the first character of any argument. + Either a character such as `x' can be prepended to the argument; + this must later on be removed by `sed'. Otherwise, `echo' can be + replaced by `cat < +Thu May 26 08:23:40 2005 Werner LEMBERG + + * m.tmac: Load devtag.tmac. + +Wed Mar 16 06:56:02 2005 Larry Kollar + + Add rudimentary support for grohtml. + + * m.tmac (H): Call DEVTAG-NH and DEVTAG-EO-H. + (pg@enable-trap, pg@header): Do nothing for devhtml. + +Sun Mar 7 16:34:46 2004 Jeff Conrad * m.tmac (S): Improve debug message. @@ -7,7 +18,7 @@ * Changed default value for Hy in manual to 0 * Check Hy at each new page -Mon Mar 1 22:16:38 CET 2004 Jeff Conrad +Mon Mar 1 22:16:38 2004 Jeff Conrad * m.tmac (S): Fix scaling indicator for vertical spacing. diff -ruN groff-1.19.1/contrib/mm/groff_mm.man groff-1.19.2/contrib/mm/groff_mm.man --- groff-1.19.1/contrib/mm/groff_mm.man 2004-05-13 15:13:24.000000000 +0200 +++ groff-1.19.2/contrib/mm/groff_mm.man 2004-07-03 14:46:56.000000000 +0200 @@ -1,5 +1,5 @@ .\" -.\" $Id: groff_mm.man,v 2.12 2004/05/13 13:13:24 wlemb Exp $ +.\" $Id: groff_mm.man,v 2.13 2004/07/03 12:46:56 wlemb Exp $ .\" .de T2 .if t .ne 2v @@ -1278,7 +1278,7 @@ This macro must be used before any text to inhibit the pageheader on the first page. .TP -.B PIC [-L] [-C] [-R] [-I n] filename [width [height]] +.B "PIC [-L] [-C] [-R] [-I n] filename [width [height]]" \fBPIC\fP includes a Postscript file in the document. The macro depends on \fBmmroff\fP and \fBINITR\fP. \fB-L\fP, \fB-C\fP, \fB-R\fP and \fB-I n\fP adjusts the picture diff -ruN groff-1.19.1/contrib/mm/mmroff.pl groff-1.19.2/contrib/mm/mmroff.pl --- groff-1.19.1/contrib/mm/mmroff.pl 2002-09-11 12:54:17.000000000 +0200 +++ groff-1.19.2/contrib/mm/mmroff.pl 2005-05-18 07:33:28.000000000 +0200 @@ -1,4 +1,4 @@ -#!/usr/bin/perl +#! /usr/bin/perl use strict; # runs groff in safe mode, that seems to be the default diff -ruN groff-1.19.1/contrib/mm/m.tmac groff-1.19.2/contrib/mm/m.tmac --- groff-1.19.1/contrib/mm/m.tmac 2004-03-10 07:11:26.000000000 +0100 +++ groff-1.19.2/contrib/mm/m.tmac 2005-05-26 08:28:38.000000000 +0200 @@ -3,11 +3,12 @@ .ds RE \\$2 .. .\" -.\" $Id: m.tmac,v 2.24 2004/03/10 06:11:26 wlemb Exp $ -.@revision $Revision: 2.24 $ +.\" $Id: m.tmac,v 2.26 2005/05/26 06:28:38 wl Exp $ +.@revision $Revision: 2.26 $ .ig -Copyright (C) 1991-2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. +Copyright (C) 1991-2000, 2001, 2002, 2003, 2004, 2005 + Free Software Foundation, Inc. mgm is written by Jörgen Hägg mgm is free software; you can redistribute it and/or modify it under @@ -36,6 +37,7 @@ .do if d PH .nx .if \n(.C .ab The groff mm macros do not work in compatibility mode. .if (\n[.warn] == 65543) .warn +.mso devtag.tmac .\" ######## init ####### .\" Contents level [0:14], contents saved if heading level <= Cl .nr Cl 2 @@ -1038,6 +1040,7 @@ .\"---------- user macro HY ------------- .\" user macro to reset indents .if d HY .HY \\n[hd*level] \\n[hd*arg1] "\\$2\\$3" +.DEVTAG-NH \\n[hd*level] \" HTML: mark beginning of heading .\"-------------------------------------- .nr hd*mark-size \w@\\*[hd*mark]@ .if (\\n[hd*level]<=\\n[Hc])&\\n[hd*htype] .ce\" center if level<=Hc @@ -1085,6 +1088,7 @@ .nr hd*last-pos \\n[nl] .nr hd*last-hsize \\n[.k] .nr par@ind-flag 0 +.DEVTAG-EO-H \" HTML: end of heading .. .\"-------- .de HM @@ -1147,9 +1151,12 @@ .if \\n[D]>2 .tm pg*last-pos \\n[@pl]u-(\\n[pg*block-size]u+\\n[pg*foot-margin]u+\\n[pg*footer-size]u+\\n[pg*extra-footer-size]u) = \\n[pg*last-pos] .. .de pg@enable-trap +.\" Disable in HTML mode +.if !'\*[.T]'html' \{\ .wh \\n[pg*foot-trap]u pg@footer .if \\n[D]>2 .tm pg@enable-trap .t=\\n[.t] nl=\\n[nl] .if \\n[D]>2 .ptr +.\} .. .de pg@disable-trap .ch pg@footer @@ -1198,6 +1205,8 @@ .\"------------------------------------------------------------ .\" HEADER .de pg@header +.\" Disable in HTML mode +.if !'\*[.T]'html' \{\ .if \\n[D]>1 .tm Page# \\n[%] (\\n[.F]:\\n[c.]) .\" check if Hy has been changed .ie \\n[Hy] 'hy 14 @@ -1257,6 +1266,7 @@ .\} .if \\n[pg*top-enabled]<0 .nr pg*top-enabled 1 .nr hd*cur-bline \\n[nl] \" .H needs to know if output has occured +.\} .. .\"--------------------------------------------------------- .\" FOOTER diff -ruN groff-1.19.1/contrib/mom/BUGS groff-1.19.2/contrib/mom/BUGS --- groff-1.19.1/contrib/mom/BUGS 2004-03-22 07:18:36.000000000 +0100 +++ groff-1.19.2/contrib/mom/BUGS 2005-08-07 09:59:33.000000000 +0200 @@ -2,19 +2,148 @@ The documentation should be taken as the authoritative source for how things ought to be. -Post to the groff mailing list (groff@ffii.org) with bug reports, -questions and suggestions, or contact me directly at: +Post to the groff mailing list with bug reports, questions and +suggestions, or contact me directly at: - df191@ncf.ca + peter@faustus.dyn.ca + or + ptpi@golden.net If writing me directly, please include the word "groff" or "mom" in -the Subject line or you risk my spam filter nuking your message. +the Subject line or you risk my spam filters nuking your message. Also, please--no html email. That, too, gets nuked. --Peter Schaffter ======================================================================== +Version 1.3 +=========== + +Persistent error in html coding of docs ( tag). +---Fixed--- + +Version 1.2-f +============ + +Multiple line subheads near page bottom sometimes printing one line +of subhead at page bottom, and subsequent lines on next page. +---Fixed--- + +Post-quote spacing still wonky when paragraph spacing is turned on. +---Fixed--- (for good would be nice) + +RULE not always resetting quad and quad value. +---Fixed--- + +Version 1.2-e +============= + +Some string definitions in om.tmac had superfluous spaces after +them (e.g. $COVERTITLE). +---Fixed--- + +Spacing under quotes not correct when paragraph spacing is turned +on. +---Fixed--- + + +First word of last line before footnotes is getting chopped. +---Fixed--- + +Version 1.2-d +============= + +HEADER_FAMILY not changing header family. +---Fixed--- + +FAMILY, after COLLATE, not changing the family of all and every +page element or tag. +---Fixed--- + +Heads and subheads at the start of docs are printing one line lower +than they should. +---Fixed--- + +Gaps are appearing at the bottom of pages when there's a linebreak +followed by a subhead. +---Fixed--- + +When LS is invoked after a single text line at the top of a page +containing a T_MARGIN (set with T_MARGIN or PAGE), mom is performing +spacing adjustments as if the first line doesn't exist. +---Fixed--- + +Changes made to ALD and LS in version 1.2-c should not apply when +the document processing macros are used. There is a significant +conflict with the internal use of ALD when the docheader is only +one line long (as, for example, when DOCTYPE is CHAPTER). +---Fixed, pending discovery of further conflicts--- + +Version 1.2-c +============= + +Deferred footnotes not always being output, and groff complains +"ending diversion FN_OVERFLOW on exit." +---Fixed--- + +First .LS call after a top margin has been set (with .T_MARGIN +or .PAGE) causing mom to move off the top margin baseline. Also, +there are conflicts between ALD, LS and T_MARGIN. +---Fixed--- + +DROPCAP not properly restoring a running \*[COND] or \*[EXT] after +COND or EXT are given as arguments to DROPCAP. +---Fixed--- + +Version 1.2 +=========== + +.PAD not co-operating with mom's fontstyles, esp. when a full +family+fontstyle is given to .FT. +---Fixed--- + +.DROPCAP -- ditto the above. +---Fixed--- + +Version 1.1.9 +============= + +Footnote markers not resetting properly on new pages when COLUMNS +is enabled. +---Fixed--- + +When overflowed footnote material is the only footnote material on +the page or in the column, no footnotes are output. +---Fixed--- + +The AUTOLEAD used in FOOTNOTE not being disabled after FOOTNOTES +are output, or after PROCESS_FN_LEFTOVER/PROCESS_FN_IN_DIVER. +---Fixed--- + +COL_NEXT and COL_BREAK, when invoked during the last column on a +page, are overprinting the last column instead of breaking to a new +page when there are footnotes in the column. +---Fixed--- + +BR_AT_LINE_KERN not "break-and-spreading" text when used in +justified copy. +---Fixed--- + +Version 1.1.8 +============= + +BLOCKQUOTE_FAMILY not changing blockquote family. +---Fixed--- + +FOOTNOTE, whether in column mode or not, was using +#FN_COUNT_FOR_COLS for all footnote markers and handling. +---Fixed--- + +Deferred footnotes that occured on the second to last page of +documents not printing. +---Fixed--- + Version 1.1.7-a =============== diff -ruN groff-1.19.1/contrib/mom/ChangeLog groff-1.19.2/contrib/mom/ChangeLog --- groff-1.19.1/contrib/mom/ChangeLog 2004-03-22 07:18:36.000000000 +0100 +++ groff-1.19.2/contrib/mom/ChangeLog 2005-08-11 06:19:16.000000000 +0200 @@ -1,3 +1,263 @@ +*Thu Aug 11 2005 + +o Makefile.sub (HTMLDOCFILES): Add `refer.html' + +*Mon Jun 20 2005 + +o Makefile.sub (HTMLDOCFILES_, EXAMPLEFILES_, PROCESSEDEXAMPLEFILES_): New + variables. + (install_data): Install files in `mom' subdirectories. + Make it work actually. + (uninstall_sub): Updated. + +*Thu Jun 16 2005 + +o Makefile.sub (install_data, uninstall_sub): Use $(exampledir) for example +files. Reported by Keith Marshall. + +*Mon May 16 2005 + +o Update groff_mom.man. + +*Thu May 12 2005 + +o Added margin notes capability + +o Added mom-specific refer support; refer calls can be embedded in + running text, sent to footnotes or endnotes, or collected for + output on a bibliography page; also added mom-specific refer + control macros + +o Added bibliography page capability, with full suite of control + macros + +o Added referencing of footnotes and endnotes by line number + +o Added capability to have footnotes run on when footnotes are + being referenced by line number + +o Added a post footnote space option, in case users want a little + space between their footnotes + +o Added ENDNOTE_MARKER_STYLE, so user can choose between endnotes + identified by a numerical marker in the text, or by line number + +o Added control macros to accommodate differing needs for endnotes + identified by line number + +o Added ENDNOTE_TITLE_SPACE, so user can control starting position + of the endnotes page title + +o Extended LIST so that it accepts lowercase alpha, uppercase roman + numeral and lowercase roman numeral enumerators; also added a + "prefix" argument (which comes *after* the separator argument) + +o Changed RESET_LIST so that it can reset a list to any number, + letter, or roman numeral, instead of just 1, a, A, I and i + +o Change to handling of footnote/endnote markers in text; input + lines before FOOTNOTE still require \c, but input line after + FOOTNOTE OFF must be entered as a literal continuation of the + line before FOOTNOTE, including any required word space or + punctuation (this so users can get the footnote marker in text + either before or after the punctuation without hassle) + +o Added QUOTE_AUTOLEAD and BLOCKQUOTE_AUTOLEAD, so user can have + quotes and blockquotes leaded differently from running text + +o Reworked QUOTE and BLOCKQUOTE to accommodate _AUTOLEAD control; + spacing above and below quotes is equalized *on a per quote + basis* (not completely happy with this, but at least it gives + users some flexibility in designing (block)quotes) + +*Fri Mar 18 2005 + +o Added mom.vim to /examples + +*Thu Jan 20 2005 + +o Added \*[TB+] and \*[B] to give inline functionality of .TN and + .EL, respectively. + +o Added SECTION and SECTION_CHAR as aliases of LINEBREAK and + LINEBREAK_CHAR + +o Added a NOBREAK option to PAD, so when PAD is called, it's possible + to instruct mom not to advance on the page. + +*Wed Jan 19 2005 + +o New macro, ADD_SPACE, so that extra space can be added at the + top of a new page in document processing; the .ns call in HEADER + was making additional space impossible + +o Reworked handling of ALD/SPACE/SP and LS when they're used at + the tops of pages during pure (i.e. non-docprocessing) + typesetting. First lines were still wandering. Should also be + more intuitive: ALD after LS advances the specified distance from + the top baseline; LS after ALD doesn't change the position of the + first baseline (i.e. merely sets the lead for the text that + follows). + +*Tue Dec 14 2004 + +o Fixed a small problem with spacing under quotes when paragraph + spacing is turned on. + +*Fri Dec 10 2004 + +o Put all calls in VFP_CHECK inside their own environment. Without + the .ev call, the trap invoked VFP_CHECK was chopping off the + first word of the last line before footnotes. + +*Dec 6 2004 + +o Small fixes to elvis_syntax.new (dealing with strings, \{\ and \} + +o Changed + . ie \\n[#START] \{\ + . if \\n[#DOC_HEADER]=0 \{ . \} + . \} + in HEAD to + . ie \\n[#START] \{\ + . if \\n[#DOC_HEADER]=0 \{ .RLD 1v \} + . \} + so that HEADs at the start of docs with no docheaders falls on + the correct baseline. + +*Dec 3 2004 + +o Removed spurious parens from if ( \\n[#TRAP_DISTANCE] < \\n[#DOC_LEAD]*2 ) + in SUBHEAD. + +*Oct 14 2004 + +o Reworked the LL macro so that the argument can take a prepended + + or - sign (i.e. the argument is relative to the current line + length). + +*Oct 13 2004 + +o Added an .if \\n(.n=0 if to the ie clause in LS that controls how mom + responds to initial LS invocation at page top if T_MARGIN has + been set. Now, if there's text on the "top" baseline, LS behaves + as expected when invoked afterwards. + +*Oct 11 2004 + +o Added an ie !r#DOCS clause to the processing of "top baseline" + ALDs. ALD is used extensively (internally) in the document + processing macros, and does not need to check--indeed, should not + check--for top baseline placement prior to execution. + +*Sep 29 2004 + +o Additions to elvis_syntax.new + +*Sep 12 2004 + +o Small fixes to the documentation. + +*Aug 21 2004 + +o Removed superfluous second arguments from strings UP, DOWN, FWD + and BCK + +*Aug 8 2004 + +o Version changed from the 1.1.x series to 1.2. All of the + features I originally wanted mom to have originally have been + implemented, and appear to be stable. + +o Major overhaul to the setting of page traps and the handling of + footnotes, both "normal" footnotes and footnotes that occur + inside QUOTE, BLOCKQUOTE and EPIGRAPH. + +o Addtion of font "styles" to om.tmac, plus changes to the FAMILY + and FT macros to manage them. New section in the doc appendices + on adding fonts and managing the new font styles. + +o Mom now uses a "fallback font" whenever there's an illegal call + to FAMILY. + +o RW and EW now affect only the font in effect. A change of family + or font disables them. + +o BR_AT_LINE_KERN now properly does a .brp (spread and break) when + used in justified text. + +o NEWPAGE, which used to be an alias for .bp, has been moved into + its own macro, in order to make it more responsive to some unusal + situations. + +o Some changes to elvis_syn.new, including that the file extensions + recognized by elvis now include both .mom and .tmac. This makes + om.tmac much easier to read. + +*Jul 6 2004 + +o FT and FAM(ILY) reworked to take advantage of if S, if F and + \n[.sty] additions to groff (1.19.2). Warnings are emitted if a + style hasn't been registered, or if a font style doesn't exist in + the current family. Invalid .FAM(ILY) calls now use a "fallback" + font" (although no warning is issued); fallback is user-settable + +o New macro, FALLBACK_FONT. Not only controls the fallback font + for invalid family calls, but also controls whether mom aborts on + invalid .FT calls after issuing a warning. + +o RW/EW now affect only the current font (or font style) + +o BR_AT_LINE_KERN now (properly) does a break-and-spread when text + is justified. + +o Fairly extensive list of .sty's added to om.tmac. Hopefully, + this will make life easier for users wishing to add new fonts + and/or entire new families to their groff site-font/devps + directory. + +*Jun 6 2004 + +o Altered kerning slightly for footnote markers in text. Daggers + and double-daggers were getting a bit jammed + +*Fri Jun 4 2004 + +o Makefile.sub (HTMLDOCFILES, EXAMPLEFILES, PROCESSEDEXAMPLEFILES): Updated. + +*Thu Jun 3 2004 + +o Rewrote the routines dealing with _FAMILY, _FONT, _SIZE, _COLOR + and _QUAD. A single macro for each checks for the calling alias + (e.g. TITLE_FAMILY in _FAMILY), and performs the appropriate + action. + +o All "COLOUR" aliases of "COLOR", no matter where, have been + removed. + +o Added cover and doc cover page generation. + +o Added reference macros COVERTITLE, DOC_COVERTITLE, MISC and + COPYRIGHT (for use with covers only) + +o Fixed EL and TN so they don't spring page traps; in nofill modes + the preceding input line must be terminated by \c. + +o Added #T_MARGIN_LEAD_ADJ to DO_B_MARGIN, DO_T_MARGIN and NEWPAGE + to ensure accurate placement of first lines on new pages when + docprocessing is not taking place. + +o Made NEWPAGE it's own macro; formerly just an alias of .bp. + +o Made BREAKQUOTE obsolete; rewrote sections of footnote handling, + including adding support macros to deal with processing of + footnotes that were started inside quotes, blockquotes and + epigraphs. + +o Added a TERMINATE .em to docprocessing (except letters) to ensure + that deferred footnotes print on the last page of a doc. + + *Mar 15 2004 o Added color support diff -ruN groff-1.19.1/contrib/mom/copyright groff-1.19.2/contrib/mom/copyright --- groff-1.19.1/contrib/mom/copyright 2002-05-23 23:59:00.000000000 +0200 +++ groff-1.19.2/contrib/mom/copyright 2005-05-14 07:54:53.000000000 +0200 @@ -1,15 +1,15 @@ AUTHOR ------ -Peter Schaffter (df191@ncf.ca) -15, chemin Brunette -RR 2, CP 406 -Ste-Cécile-de-Masham (Québec) +Peter Schaffter (peter@faustus.dyn.ca) (ptpi@golden.net) +320 Gordon St. +Fergus, Ontario CANADA +N1M 2W3 ======================================================================== The groff macro file om.tmac and the html documentation pertaining -to it are copyright (c) 2002 Peter Schaffter. +to it are copyright (c) 2004, 2005 Peter Schaffter. om.tmac is issued under the GNU General Public License, a full copy of which can be had at diff -ruN groff-1.19.1/contrib/mom/examples/elvis_syntax groff-1.19.2/contrib/mom/examples/elvis_syntax --- groff-1.19.1/contrib/mom/examples/elvis_syntax 2003-07-07 22:51:54.000000000 +0200 +++ groff-1.19.2/contrib/mom/examples/elvis_syntax 2005-05-14 07:54:53.000000000 +0200 @@ -1,143 +1,90 @@ #Mom language mom -extension .mom -startword .\ -inword _( -keyword .ALD .ALIAS .ALWAYS_FULLSPACE_QUOTES .ATTRIBUTE_STRING -keyword .AUTHOR .AUTHOR_FAMILY .AUTHOR_FONT .AUTHOR_SIZE .AUTOLEAD .BLANKPAGE -keyword .BLOCKQUOTE .BLOCKQUOTE_FAMILY .BLOCKQUOTE_FONT .BLOCKQUOTE_QUAD .BLOCKQUOTE_SIZE -keyword .B_MARGIN .BR .BR_AT_LINE_KERN .BREAK_QUOTE -keyword .CAPS .CENTER .CENTRE -keyword .CHAPTER .CHAPTER_TITLE .CHAPTER_STRING .CITATION .CITE .CLOSING -keyword .COLLATE .COL_BREAK .COL_BREAK .COL_NEXT .COLUMNS -keyword .COMMENT .CONDENSE .COPYSTYLE -keyword .DATE .DEFAULTS -keyword .DOC_FAM .DOC_FAMILY .DOCHEADER -keyword .DOCHEADER_ADVANCE .DOCHEADER_LEAD -keyword .DOC_LEAD .DOC_LEAD_ADJUST .DOC_LEFT_MARGIN .DOC_LINE_LENGTH -keyword .DOC_LLENGTH .DOC_L_LENGTH .DOC_L_MARGIN .DOC_LMARGIN -keyword .DOC_LS .DOC_PS .DOC_PT_SIZE .DOC_QUAD -keyword .DOC_RIGHT_MARGIN .DOC_R_MARGIN .DOC_RMARGIN -keyword .DOCTYPE .DOCTYPE_FAMILY .DOCTYPE_FONT .DOCTYPE_SIZE .DOC_TITLE -keyword .DRAFT .DRAFT_STRING .DRAFT_WITH_PAGENUMBER -keyword .DROPCAP .DROPCAP_ADJUST .DROPCAP_FAMILY .DROPCAP_FONT .DROPCAP_GUTTER .DROPCAP_OFF -keyword .EL -keyword .ENDNOTE .ENDNOTES -keyword .ENDNOTE_FAMILY .ENDNOTE_FONT .ENDNOTE_PT_SIZE .ENDNOTE_LEAD .ENDNOTE_QUAD -keyword .ENDNOTE_STRING .ENDNOTE_STRING_FAMILY .ENDNOTE_STRING_FONT .ENDNOTE_STRING_SIZE -keyword .ENDNOTE_STRING_QUAD .ENDNOTE_STRING_UNDERSCORE -keyword .ENDNOTE_TITLE .ENDNOTE_TITLE_FAMILY .ENDNOTE_TITLE_FONT .ENDNOTE_TITLE_SIZE -keyword .ENDNOTE_TITLE_QUAD .ENDNOTE_TITLE_UNDERSCORE -keyword .ENDNOTE_NUMBER_FAMILY .ENDNOTE_NUMBER_FONT .ENDNOTE_NUMBER_SIZE -keyword .ENDNOTE_NUMBERS_ALIGN_RIGHT .ENDNOTE_NUMBERS_ALIGN_LEFT -keyword .ENDNOTE_PARA_INDENT .ENDNOTE_PARA_SPACE .ENDNOTES_FOOTER_CENTER .ENDNOTES_HEADER_CENTER -keyword .ENDNOTE_STRING_CAPS .ENDNOTES_NO_COLUMNS .ENDNOTES_NO_FIRST_PAGENUM -keyword .ENDNOTES_ALLOWS_HEADERS .ENDNOTES_PAGENUM_STYLE .ENDNOTES_FIRST_PAGENUMBER -keyword .ENDNOTE_SINGLESPACE -keyword .EPIGRAPH .EPIGRAPH_AUTOLEAD .EPIGRAPH_FAMILY .EPIGRAPH_FONT -keyword .EPIGRAPH_INDENT .EPIGRAPH_QUAD .EPIGRAPH_SIZE -keyword .EW .EXTEND -keyword .FAM .FAMILY -keyword .FINIS .FINIS_STRING -keyword .FOOTER .FOOTER_CENTER .FOOTER_CENTER_CAPS .FOOTER_CENTER_FAM .FOOTER_CENTER_FAMILY -keyword .FOOTER_CENTER_FONT .FOOTER_CENTER_FT .FOOTER_CENTER_PS .FOOTER_CENTER_SIZE -keyword .FOOTER_CENTRE .FOOTER_CENTRE_CAPS .FOOTER_CENTRE_FAM .FOOTER_CENTRE_FAMILY -keyword .FOOTER_CENTRE_FT .FOOTER_CENTRE_PS .FOOTER_CENTRE_SIZE .FOOTER_FAM -keyword .FOOTER_FAMILY .FOOTER_GAP .FOOTER_LEFT .FOOTER_LEFT_CAPS .FOOTER_LEFT_FAM -keyword .FOOTER_LEFT_FAMILY .FOOTER_LEFT_FONT .FOOTER_LEFT_FT .FOOTER_LEFT_PS -keyword .FOOTER_LEFT_SIZE .FOOTER_MARGIN .FOOTER_ON_FIRST_PAGE .FOOTER_PLAIN -keyword .FOOTER_RECTO .FOOTER_RIGHT .FOOTER_RIGHT_CAPS .FOOTER_RIGHT_FAM .FOOTER_RIGHT_FAMILY -keyword .FOOTER_RIGHT_FONT .FOOTER_RIGHT_FT .FOOTER_RIGHT_PS .FOOTER_RIGHT_SIZE -keyword .FOOTER_RULE .FOOTER_RULE_GAP .FOOTERS .FOOTER_SIZE .FOOTER_VERSO -keyword .FOOTNOTE .FOOTNOTE_AUTOLEAD .FOOTNOTE_FAMILY .FOOTNOTE_FONT .FOOTNOTE_MARKERS -keyword .FOOTNOTE_MARKER_STYLE .FOOTNOTE_QUAD .FOOTNOTE_RULE .FOOTNOTE_RULE_ADJ -keyword .FOOTNOTE_RULE_LENGTH .FOOTNOTE_SIZE -keyword .FROM .FT -keyword .GREETING -keyword .HDRFTR_CENTER .HDRFTR_CENTER .HDRFTR_CENTER_CAPS .HDRFTR_CENTER_FAMILY -keyword .HDRFTR_CENTER_FONT .HDRFTR_CENTER_SIZE .HDRFTR_FAMILY .HDRFTR_GAP .HDRFTR_CENTER_PAD -keyword .HDRFTR_LEFT .HDRFTR_LEFT .HDRFTR_LEFT_CAPS .HDRFTR_LEFT_FAMILY -keyword .HDRFTR_LEFT_FONT .HDRFTR_LEFT_SIZE .HDRFTR_MARGIN .HDRFTR_PLAIN -keyword .HDRFTR_RIGHT .HDRFTR_RIGHT_CAPS .HDRFTR_RIGHT_FAMILY .HDRFTR_RIGHT_FONT -keyword .HDRFTR_RIGHT_SIZE .HDRFTR_RULE .HDRFTR_RULE_GAP .HDRFTR_RULE_INTERNAL -keyword .HDRFTR_RULE_INTERNAL .HDRFTR_SIZE -keyword .HEAD .HEAD_CAPS .HEADER .HEADER_CENTER .HEADER_CENTER_CAPS -keyword .HEADER_CENTER_FAM .HEADER_CENTER_FAMILY .HEADER_CENTER_FONT -keyword .HEADER_CENTER_FT .HEADER_CENTER_PS .HEADER_CENTER_SIZE .HEADER_CENTRE -keyword .HEADER_CENTRE_CAPS .HEADER_CENTRE_FAM .HEADER_CENTRE_FAMILY -keyword .HEADER_CENTRE_FONT .HEADER_CENTRE_FT .HEADER_CENTRE_PS .HEADER_CENTRE_SIZE -keyword .HEADER_FAM .HEADER_FAMILY .HEADER_GAP -keyword .HEADER_LEFT .HEADER_LEFT_CAPS .HEADER_LEFT_FAM .HEADER_LEFT_FAMILY -keyword .HEADER_LEFT_FONT .HEADER_LEFT_FT .HEADER_LEFT_PS .HEADER_LEFT_SIZE -keyword .HEADER_MARGIN .HEADER_PLAIN -keyword .HEADER_RECTO .HEADER_RIGHT .HEADER_RIGHT_CAPS .HEADER_RIGHT_FAM .HEADER_RIGHT_FAMILY -keyword .HEADER_RIGHT_FONT .HEADER_RIGHT_FT .HEADER_RIGHT_PS .HEADER_RIGHT_SIZE .HEADER_VERSO -keyword .HEADER_RULE .HEADER_RULE_GAP .HEADERS .HEADER_SIZE -keyword .HEAD_FAMILY .HEAD_FONT .HEAD_QUAD .HEAD_SIZE .HEAD_SPACE .HEAD_UNDERLINE -keyword .HI .HY .HYPHENATE .HYPHENATION .HY_SET -keyword .IB .IBX .IBQ .IH .IL .ILX .ILQ -keyword .IQ .IR .IRX .IRQ .IT .IX -keyword .INDENT_FIRST_PARAS .ITALIC_MEANS_ITALIC -keyword .JUSTIFY -keyword .KERN -keyword .LEADER_CHARACTER .LEFT .LIG .LIGATURES .LINEBREAK .LL .LL .L_MARGIN .LS -keyword .MCO .MCR .MCX -keyword .NEWPAGE .NEW_PAGE .NO_SUITE .NUMBER_HEADS .NUMBER_PARAHEADS .NUMBER_SUBHEADS -keyword .PAD .PADMARKER .PAD_STRING .PAGE .PAGE_LENGTH .PAGELENGTH .PAGEWIDTH -keyword .PAGENUM .PAGENUM_FAMILY .PAGENUM_FONT .PAGENUM_HYPHENS -keyword .PAGENUM_ON_FIRST_PAGE .PAGENUM_POS .PAGENUM_SIZE .PAGENUM_STYLE .PAGENUMBER -keyword .PAGINATE .PAGINATION .PAPER -keyword .PARAHEAD .PARAHEAD_FAMILY .PARAHEAD_FONT .PARAHEAD_INDENT .PARAHEAD_SIZE -keyword .PARA_INDENT .PARA_SPACE -keyword .PP .PP_FONT .PP_FT .PT_SIZE .PSPIC -keyword .PRINTSTYLE -keyword .QUAD -keyword .QUOTE .QUOTE_FAMILY .QUOTE_FONT .QUOTE_INDENT .QUOTE_SIZE -keyword .RECTO_VERSO -keyword .RESET_FOOTNOTE_NUMBER .RESET_HEAD_NUMBER .RESET_PARAHEAD_NUMBER -keyword .RESET_SUBHEAD_NUMBER -keyword .REVISION .REVISION_STRING .RIGHT .RLD .R_MARGIN .RW -keyword .SETBOLDER .SETSLANT .SHIM .SILENT .SLANT_MEANS_SLANT .SMARTQUOTES .SP .SPACE -keyword .SPREAD .SS .ST .START .STRING .SUBHEAD .SUBHEAD_FAMILY .SUBHEAD_FONT .SUBHEAD_SIZE -keyword .SUBTITLE .SUBTITLE_FAMILY .SUBTITLE_FONT .SUBTITLE_SIZE -keyword .SWITCH_FOOTERS .SWITCH_HDRFTR .SWITCH_HEADERS -keyword .SUSPEND_PAGINATION .RESTORE_PAGINATION -keyword .TAB_SET .TAB .TABSET .TB .TI -keyword .TITLE .TITLE_FAMILY .TITLE_FONT .TITLE_SIZE .T_MARGIN -keyword .TN .TO .TOC -keyword .TOC_FAMILY .TOC_PT_SIZE .TOC_LEAD .TOC_PAGENUM_STYLE -keyword .TOC_HEADER_FAMILY .TOC_HEADER_FONT .TOC_HEADER_SIZE .TOC_HEADER_QUAD .TOC_HEADER_STRING -keyword .TOC_TITLE_FAMILY .TOC_TITLE_FONT .TOC_TITLE_SIZE .TOC_TITLE_INDENT -keyword .TOC_HEAD_FAMILY .TOC_HEAD_FONT .TOC_HEAD_SIZE .TOC_HEAD_INDENT -keyword .TOC_SUBHEAD_FAMILY .TOC_SUBHEAD_FONT .TOC_SUBHEAD_SIZE .TOC_SUBHEAD_INDENT -keyword .TOC_PARAHEAD_FAMILY .TOC_PARAHEAD_FONT .TOC_PARAHEAD_SIZE .TOC_PARAHEAD_INDENT -keyword .TOC_PN_FAMILY .TOC_PN_FONT .TOC_PN_SIZE -keyword .TOC_APPENDS_AUTHOR .TOC_RV_SWITCH .TOC_PADDING .PAGINATE_TOC -keyword .TQ .TRAP .TYPESIZE -keyword .UNDERLINE .UNDERLINE_ITALIC .UNDERLINE_QUOTES .UNDERLINE_SLANT -keyword .UNDERSCORE .UNDERSCORE_2 .UNDERSCORE2 -keyword .WS -font fixed DEFAULT CHAPTER NAMED LETTER -font fixed TYPESET TYPEWRITE -font fixed FINAL DRAFT -font fixed BLOCK QUAD -font fixed LEFT RIGHT CENTER CENTRE JUSTIFY TOP BOTTOM -font fixed OFF QUIT END EXIT DONE NO ALL -font fixed PAGE NUMBER STAR -font fixed COND EXT -font fixed LETTER LEGAL EXECUTIVE LEDGER TABLOID QUARTO FOLIO -font fixed 10x14 A3 A4 A5 B4 B5 -font fixed SINGLESPACE -font fixed FACTOR -font underlined \/ \/. \/? \/! \/, \/; \/: -font underlined \, \,. \,? \,! \,, \,; \,: -font underlined \\ \~ \% \0 \: \( \| \^ \& \% -font underlined \b \c \C \d \D \e \f \f( \h \l \L \p \r \s \s+ \s- \S \u \v \w -font fixed \(bu \(co \(ct \(de \(dg \(di \(em \(en \(mu \(pl \(rg \(sc \(sq -font fixed \(14 \(12 \(34 \(+- -font fixed # ' ^ -font italic " -character \] -comment \# -comment \" -comment \! +extension .mom .tmac + +startword . +color startword normal + +inword _.' +color inword normal + +other initialpunct +mostly normal + +backslash none + +color args like fixed +color braces like char +color brackets like underlined +color chars like emphasized +color decimals like number +color ellipsis normal +color escapes like keyword +color math like cursor +color misc like string +color operators like string +color parens like comment +color reg_string like math +color tmac_escapes like keyword +color single_slash like char + +font args DA DE EN ES FR IT NL NO PT SV +font args DEFAULT CHAPTER NAMED LETTER +font args TYPESET TYPEWRITE +font args FINAL DRAFT +font args BLOCK QUAD +font args LEFT RIGHT CENTER CENTRE JUSTIFY TOP BOTTOM L R C J +font args OFF QUIT END EXIT DONE NO ALL +font args PAGE NUMBER STAR +font args LETTER LEGAL EXECUTIVE LEDGER TABLOID QUARTO FOLIO +font args 10x14 A3 A4 A5 B4 B5 +font args SINGLESPACE +font args FACTOR +font args DASH BULLET ALPHA DIGIT USER +font args RGB CYM CMYK GRAY GREY +font args COND CONDX EXT EXTX SUP SUPX CONDSUP CONDSUPX EXTSUP EXTSUPX +font args BOLDER BOLDERX SLANT SLANTX +font args UP DOWN BCK FWD BU BP FU FP +font args ROM IT BD BDI PREV +font args ST +font args SUSPEND RESUME + +prefix { \{ \{\ +font braces { \{ \{\ +prefix [ ] +font brackets [ ] +prefix \(bu \(co \(ct \(de \(dg \(di \(em \(en \(mu \(pl \(rg \(sc \(sq \(lq \(rq +font chars \(bu \(co \(ct \(de \(dg \(di \(em \(en \(mu \(pl \(rg \(sc \(sq \(lq \(rq +prefix \(14 \(12 \(34 \(+- +font chars \(14 \(12 \(34 \(+- +prefix \fR \fB \fI \fP \f0 \f1 \f2 \f3 +font chars \fR \fB \fI \fP \f0 \f1 \f2 \f3 +prefix .0 .1 .2 .3 .4 .5 .6 .7 .8 .9 +font decimals . .0 .1 .2 .3 .4 .5 .6 .7 .8 .9 +prefix \/ \/. \/? \/! \/, \/; \/: +font escapes \/ \/. \/? \/! \/, \/; \/: +prefix \, \,. \,? \,! \,, \,; \,: +font escapes \, \,. \,? \,! \,, \,; \,: +prefix \~ \0 \: \| \^ \& \% \! +font escapes \~ \0 \: \| \^ \& \% \! +prefix \b \c \C \d \D \e \f \f( \h \l \L \p \r \s \s+ \s- \S \u \v \w +font escapes \b \c \C \d \D \e \f \f( \h \l \L \p \r \s \s+ \s- \S \u \v \w +prefix ... +font ellipsis ... +prefix + - * / = == < > <= >= ? % +font math + - * / = == < > <= >= ? % +prefix | +font misc | +prefix ! : & +font operators ! : & +prefix ( ) +font parens ( ) +prefix # * $ +font reg_string # * $ +prefix \n \* \[ +font single_slash \n \* \[ +prefix \\n \\* \\$ +font tmac_escapes \\n \\* \\$ + +comment \# +comment \" diff -ruN groff-1.19.1/contrib/mom/examples/elvis_syntax.new groff-1.19.2/contrib/mom/examples/elvis_syntax.new --- groff-1.19.1/contrib/mom/examples/elvis_syntax.new 2004-03-22 07:18:36.000000000 +0100 +++ groff-1.19.2/contrib/mom/examples/elvis_syntax.new 2005-05-14 07:54:53.000000000 +0200 @@ -12,11 +12,10 @@ " " If you're using an older version of elvis, stick with the " highlighting rules in the files elvis_syntax. -# elvis.syn -- stores descriptions of languages for use with ":display syntax" #Mom language mom -extension .mom +extension .mom .tmac startword . color startword normal @@ -27,12 +26,23 @@ other initialpunct mostly normal -color args like fixed -color chars like emphasized -color decimals normal -color ellipsis normal -color escapes like keyword -color misc green +backslash none + +color args like fixed +color braces like char +color brackets like underlined +color chars like emphasized +color decimals normal +color ellipsis normal +color escapes like keyword +color math like cursor +color misc like string +color operators like string +color parens like comment +color reg_string like math +color tmac_escapes like keyword +color single_slash like char + font args DA DE EN ES FR IT NL NO PT SV font args DEFAULT CHAPTER NAMED LETTER font args TYPESET TYPEWRITE @@ -40,33 +50,57 @@ font args BLOCK QUAD font args LEFT RIGHT CENTER CENTRE JUSTIFY TOP BOTTOM L R C J font args OFF QUIT END EXIT DONE NO ALL -font args PAGE NUMBER STAR -font args COND EXT +font args PAGE NUMBER STAR LINE font args LETTER LEGAL EXECUTIVE LEDGER TABLOID QUARTO FOLIO font args 10x14 A3 A4 A5 B4 B5 font args SINGLESPACE font args FACTOR -font args DASH BULLET ALPHA DIGIT USER +font args DASH BULLET ALPHA DIGIT USER ROMAN roman alpha +font args SUSPEND RESUME font args RGB CYM CMYK GRAY GREY -prefix \/ \/. \/? \/! \/, \/; \/: -font escapes \/ \/. \/? \/! \/, \/; \/: -prefix \, \,. \,? \,! \,, \,; \,: -font escapes \, \,. \,? \,! \,, \,; \,: -prefix \\ \~ \0 \: \| \^ \& \% \! -font escapes \\ \~ \0 \: \| \^ \& \% \! -prefix \b \c \C \d \D \e \f \f( \h \l \L \p \r \s \s+ \s- \S \u \v \w -font escapes \b \c \C \d \D \e \f \f( \h \l \L \p \r \s \s+ \s- \S \u \v \w -prefix \(bu \(co \(ct \(de \(dg \(di \(em \(en \(mu \(pl \(rg \(sc \(sq \(lq \(rq -font chars \(bu \(co \(ct \(de \(dg \(di \(em \(en \(mu \(pl \(rg \(sc \(sq \(lq \(rq -prefix \(14 \(12 \(34 \(+- -font chars \(14 \(12 \(34 \(+- -prefix \fR \fB \fI \fP \f0 \f1 \f2 \f3 -font chars \fR \fB \fI \fP \f0 \f1 \f2 \f3 -prefix ... -font ellipsis ... -prefix .0 .1 .2 .3 .4 .5 .6 .7 .8 .9 -font decimals . .0 .1 .2 .3 .4 .5 .6 .7 .8 .9 -character \] -string ' -comment \# -comment \" +font args COND CONDX EXT EXTX SUP SUPX CONDSUP CONDSUPX EXTSUP EXTSUPX +font args BOLDER BOLDERX SLANT SLANTX +font args UP DOWN BCK FWD BU BP FU FP FN_MARK EN_MARK +font args ROM IT BD BDI PREV +font args ST + +prefix { \{ \} \{\ } +font braces { \{ \} \{\ } +prefix [ ] +font brackets [ ] +prefix \(bu \(co \(ct \(de \(dg \(di \(em \(en \(mu \(pl \(rg \(sc \(sq \(lq \(rq +font chars \(bu \(co \(ct \(de \(dg \(di \(em \(en \(mu \(pl \(rg \(sc \(sq \(lq \(rq +prefix \(14 \(12 \(34 \(+- +font chars \(14 \(12 \(34 \(+- +prefix \fR \fB \fI \fP \f0 \f1 \f2 \f3 +font chars \fR \fB \fI \fP \f0 \f1 \f2 \f3 +prefix .0 .1 .2 .3 .4 .5 .6 .7 .8 .9 +font decimals . .0 .1 .2 .3 .4 .5 .6 .7 .8 .9 +prefix \/ \/. \/? \/! \/, \/; \/: +font escapes \/ \/. \/? \/! \/, \/; \/: +prefix \, \,. \,? \,! \,, \,; \,: +font escapes \, \,. \,? \,! \,, \,; \,: +prefix \~ \0 \: \| \^ \& \% \! +font escapes \~ \0 \: \| \^ \& \% \! +prefix \b \c \C \d \D \e \f \f( \h \l \L \p \r \s \s+ \s- \S \u \v \w +font escapes \b \c \C \d \D \e \f \f( \h \l \L \p \r \s \s+ \s- \S \u \v \w +prefix ... +font ellipsis ... +prefix + - * / = == < > <= >= ? % +font math + - * / = == < > <= >= ? % +prefix | +font misc | +prefix ! : & +font operators ! : & +prefix ( ) +font parens ( ) +prefix # * $ +font reg_string # * $ +prefix \n \* +font single_slash \n \* +prefix \\n \\* \\$ +font tmac_escapes \\n \\* \\$ + +character \]' +comment \# +comment \" diff -ruN groff-1.19.1/contrib/mom/examples/macros.mom groff-1.19.2/contrib/mom/examples/macros.mom --- groff-1.19.1/contrib/mom/examples/macros.mom 2004-01-25 08:19:56.000000000 +0100 +++ groff-1.19.2/contrib/mom/examples/macros.mom 1970-01-01 01:00:00.000000000 +0100 @@ -1,672 +0,0 @@ -\# Basic page setup -\# -.PAGE 8.5i 11i \" Printer sheet size -.L_MARGIN 1i \" Left margin 1 inch -.R_MARGIN 1i \" Right margin 1 inch (calculates the line length) -\# -\# Refinements -\# -.KERN \" Automatic pairwise kerning -.SS 0 \" No extra space between sentences -.HY \" Hyphenate -.LIGATURES \" Automatic ligature generation -.SMARTQUOTES \" Enable smartquotes -\# -\# Basic type parameters -\# -.FAM T \" Times Roman family -.FT B \" Bold font -.PT_SIZE 12 \" Point size -.LS 14 \" Leading (line spacing) -.LEFT \" Set lines flush left, nofill mode -\# -\# -.ALD |1i-1v \" Advance 1 inch from top of paper to first baseline -Example 1\*[BU 2]: -.ALD .25v \" Advance an extra 1/4 linespace -.UNDERSCORE 3.75p "T\*[BU 4]asting notes using padding, string tabs \ -and multi-columns" -.SP \" Add an extra line space -\# -\# -.FAM H \" Helvetica family -.PT_SIZE 10 -.LS 11 \" New leading -\# -\# The following uses a combination of padding, string tabs, and the FWD escape -\# to set up five tabs with 12-point (1-pica) gutters over the full line length. -\# -.SILENT \" Don't print the next line -.PAD "\*[ST1]VIN#\*[ST1X]\*[FWD 12p]\*[ST2]ROBE#\*[ST2X]\*[FWD 12p]\*[ST3]NEZ#\*[ST3X]\*[FWD 12p]\*[ST4]BOUCHE#\*[ST4X]\*[FWD 12p]\*[ST5]COMMENTAIRES\*[ST5X]" -.SILENT OFF \" Resume normal printing of text -\# -\# Now that the string tabs have been marked off, we "set" them. -\# -.ST 1 L \" First string tab flush left, nofill mode (no need for .BR's between input lines) -.ST 2 L QUAD \" Remaining tabs are flush left/rag right, fill mode -.ST 3 L QUAD -.ST 4 L QUAD -.ST 5 L QUAD -\# -\# -.TAB 1 \" Call first tab -.UNDERSCORE "VIN" -.TN \" Move to next tab and stay on the same baseline -.UNDERSCORE "ROBE" -.TN \" Ibid -.UNDERSCORE "NEZ" -.TN \" Ibid -.UNDERSCORE "BOUCHE" -.TN \" Ibid -.UNDERSCORE "COMMENTAIRES" -.TQ \" Quit tabs -\# -\# -.ALD 6p \" Advance an extra 6 points -.FT R \" Change font to roman (medium) -.MCO \" Turn multi-column mode on -\# -\# -.TAB 1 \" Notice that this tab gets set line-for-line -\*[IT]Peelee Island \" Set italic -\*[PREV]Gewürztraminer \" Revert to former font (roman) -2000 -(Canada) -.MCR \" Return to top of column -.TAB 2 \" Call tab 2; in multi-column mode, don't use .TN -Jaune pâle. -.MCR -.TB 3 \" Notice that from here on, we use the alias TB instead of TAB -Frais, fruité, ci\%tronné, arômes fortes de lichee et de fruits -tropicaux. -.MCR -.TB 4 -Doux, fruité, bien équilibré avec une bonne acidité. -.MCR -.TB 5 -Bon apéro. Servir avec des plats -.RW .1 -indiens ou \%chinois. -.RW 0 -.BR -Excellent rapport qualité/prix. -.MCX 8p \" Multi-column mode off; advance an extra 8 points -.MCO \" Re-invoke multi-columns for next wine description -.TB 1 -\*[IT]Carau Pujol -\*[ROM]Tannat -1995 -(Uraguay) -.MCR -.TB 2 -Rubis foncé, vio\%lacée, presque opaque. -.MCR -.TB 3 -Belles arômes de fruits foncés (prunes, cerises noires, cassis). -Odeurs tertiares de cuir, cèdre, violets, eucalyptus, avec une trace -exotique de Band-Aid*\*[BU 12]. -\# -\# The \*[BU 12], above, pulls the period back so that it falls -\# underneath the asterisk. \*[BP<#>] could have been used instead -\# if you prefer to use points rather than kern units. -\# -.MCR -.TB 4 -Très rond, tannins mûres et veloutés, avec un long finis fruité et -doucement alcoolique. -.MCR -.TB 5 -Superbe\|! Une aubaine à ne pas manquer. Prêt à boire maintenant. -.MCX 1v \" Multi-columns off; advance an extra linespace -\# -\# Now, an example of a hanging indent. This is excessively fussy -\# from a typographic standpoint in that it hangs the asterisk outside -\# the current left margin so that the text following it lines up with -\# with the text in the tasting notes. Notice that in order to use a -\# hanging indent, you must first set a left indent. -\# -.FT I \" Change font to italic -.PT_SIZE -.5 \" Reduce point size by 1/2 point -.LS -.5 \" Reduce leading by 1/2 point -.JUSTIFY \" Set text justified -\# -\# Now, move the left margin back by the width of an asterisk plus 2 points... -\# -.L_MARGIN -(\w'*'+2p) -\# -\# ...and set a left indent equal to the width of an asterisk plus 2 points -\# -.IL \w'*'+2p -\# -\# Now, set the hanging indent equal to the left indent, effectively pulling -\# the first line of the following text back to the new left margin. -\# Subsequent output lines will be indented by the .IL amount. -\# Notice that when using the \w inline escape, there's no need to append -\# a unit of measure to it. -\# -.HI \w'*'+2p -*\*[FWD 1p]The term "Band-Aid" means the slightly sweet, vaguely chemical -smell associated with medical-grade plastics. It is often found in -wines from terroirs in South America. Provided a wine has a sufficient -concentration of fruit -.RW .04 \" Kern the whole next line slightly, so "lipstick" doesn't hyphenate. -aromas and complex tertiary characteristics, Band-Aid is a Good Thing. -Otherwise, it smells like cheap lipstick. -.RW 0 \" Reset kerning to 0 -\# -\# Notice, above, that although the values for IL and HI are the width -\# of an asterisk plus 2 points, when setting the first line of text -\# (the one with the asterisk at the beginning), we put only 1 point of -\# space after the *. This is to compensate for the fact that in the -\# italic font, the letter T doesn't align visually with the rest of -\# the text. As already noted, this is an extremely fussy example. :) -\# -\# -\# -.IQ CLEAR \" Cancel and clear stored indent values -.L_MARGIN 1i \" Reset left margin to its original value. -\# -\# -.ALD 2P \" Add 2-picas extra space before next example -.FAM T -.FT B -.PT_SIZE 12 -.LS 14 -Example 2: -.ALD .25v -\# -.COMMENT \" COMMENT lets you enter comments without using \# or \" -In the next line, because the string to be underscored must be -enclosed by double-quotes, you can't use the double-quote character -itself around the word "Massaging". We circumvent this by using the -groff inline escapes \(lq and \(rq (leftquote and rightquote). -.COMMENT OFF \" Remember to turn COMMENT off! -\# -.UNDERSCORE 3.75p "\(lqMassaging\(rq \*[BCK 1p]a passage of rag right text" -.SP \" Add an extra linespace -\# -\# -.PT_SIZE 12.5 -.LS 14 -.PT_SIZE -1 \" Reduce point size by 1 point -Passage using groff defaults -.ALD .5v \" Add an extra 1/2 line space -.PT_SIZE +1 \" Restore point size -.QUAD LEFT \" Set quad left, fill mode -.IB 3P \" Indent 3 picas from both the left and right margins -.FT R -The thousand injuries of Fortunato I had borne as I best could; -but when he ventured upon insult, I vowed revenge. You, who so well -know the nature of my soul, will not suppose, however, that I gave -utterance to a threat. \*[IT]At length\*[PREV] I would be -avenged; this was a point definitively settled\(embut the very -definitiveness with which it was resolved, precluded the idea of -risk. I must not only punish, but punish with impunity. A -wrong is unredressed when retribution overtakes its redresser. -It is equally unredressed when the avenger fails to make himself -felt as such to him who has done the wrong. -.ALD 6p -\# -\# The next line is set quad right, nofill mode, 1/2 point smaller -\# than the preceding text (using the \*S[...] inline escape. -\# -.RIGHT -\*S[-.5]\(emEdgar Allen Poe, \*[IT]The Cask of Amontillado\*[PREV]\*S[+.5] -.SP \" Extra linespace -.IBQ \" Disable "indent both" -\# -\# The passage above, while acceptable in a longer document, exhibits a -\# few typographic flaws. The shape of the right margin rag exhibits -\# a decidedly "rounded" appearance. The word "I" stands alone at the -\# end of the third line. The space between the 1st and 2nd sentences -\# ("...revenge. You...") is too large, owing to the letter "Y" that -\# begins the 2nd sentence. The spacing between "A wrong..." (line 6) -\# is equally too large because of the way "A" and "w" fit together. -\# The em-dash before Edgar isn't vertically centered with the letter "E". -\# And so on. The most important correction below is fixing the rag -\# so that longer and shorter lines alternate. This is accomplished by -\# manually breaking lines and then slightly lengthening and shortening -\# them until a pleasing rag is achieved. The remainder of the little -\# flaws are fixed with inline escapes. -\# -.FT B -.PT_SIZE -1 -.LEFT -The same passage, \*[BU 4]"massaged" -.ALD .5v -.FT R -.PT_SIZE +1 -.QUAD LEFT -.HY OFF \" Turn automatic hyphenation off -.BR_AT_LINE_KERN \" Automatically insert a line break (.BR) with each invocation of .RW and .EW -.WS +1 \" Increase word space slightly -.IB \" Turn "indent both" back on; values are the same as before -\# -\# -The thousand injuries of Fortunato I had borne as I best could; but -when he ventured upon insult, I \*[BU 2]vowed revenge. \*[BU 4]Y\*[BU 6]ou, -\*[BU 4]who so \*[BU 2]well know the nature -.EW .2 -of my soul, \*[BU 2]will not suppose, however, that I gave utterance to -a threat. \*[IT]At -.EW .2 -length\*[PREV] I would be avenged; this was a point definitively -settled\(embut the -.EW .2 -v\*[BU 1]ery definitiveness with which it was resolved, precluded the idea -of risk. -.EW 0 -I must not only punish, but punish with impunity. A \*[BCK 1p]wrong is -unredressed -.EW .1 -when retribution overtakes its redresser. It is equally unredressed -when the -.RW .1 -avenger fails to make himself felt as such to him \*[BU 2]who has done -the wrong. -.RW 0 -.WS +0 \" Restore normal wordspacing -.ALD 6p -.PT_SIZE -.5 -.RIGHT -\*[UP 1.5p]\(em\*[DOWN 1.5p]\*[BCK 1p]Edgar \*[BCK 1p]Allen Poe, \*[IT]The Cask of Amontillado\*[PREV] -.IQ CLEAR \" Cancel and clear stored values of all indents -\# -\# -.NEWPAGE \" Start a new page -.T_MARGIN 1i \" Set top margin to 1i (approx. equivalent to .ALD |1i-1v above) -\# -\# -.FAM T -.FT B -.PT_SIZE 12 -.LS 14 -.LEFT -Example 3: -.ALD .25v -.UNDERSCORE 3.75p "A \*[BU 2]recipe for enumerated lists using indents" -.SP .5v \" Add an extra half line space -.FAM N \" New Century Schoolbook family -.FT R -.PT_SIZE 11 -.LS 13 -.HY \" Turn hyphenation back on -.JUSTIFY \" Justify text -This example demonstrates the use of left and hanging indents for -simple enumerated lists. Nested lists are possible, as the example -shows; however, the more complex the nesting, the wiser it becomes -to use (string) tabs, as seen in Example 4. -.TI 1.5m -\*[BD]Please note: mom\*[PREV] has macros that allow you to set -enumerated lists automatically. These examples merely show hanging -indents and string tabs in use. -\# -\# -.JUSTIFY \" Justify text -.IL \w'\0.\0' \" Establish a left indent equal to the width of 2 figure spaces plus a period. -.HI \w'\0.\0' \" Establish a hanging indent equal to the size of the left indent. -.ALD 6p -\# -\# -1.\0This is the first item in the list. N\*[BU 2]otice how the first line -"hangs" back from the remaining text, which is otherwise -indented by the width of by two figure-spaces (digit-width -spaces) and a period. -.BR -.HI \" Notice that HI doesn't require an argument once the value's been set -.ALD 6p -2.\0This is the second item in the list. As with the above item, -notice the use of the \*[BU 8]\\0 escape sequence in the input text. It's -there to ensure that the space after the number/period combination -always remains the same (i.e. doesn't stretch when the line is -justified). That way, the text of each item always lines up perfectly. -\# -\# -.COMMENT -Now we're going to set a bullet-point list, indented from the text -above by 1 pica. IL arguments are always added to whatever value -is in already effect for IL, hence all we have to do is tell mom to -indent (from the current left indent) 1 pica plus the width of the -bullet character ( \(bu ). \*[FWD 3p] puts three points of space after -the bullet so that the bullet and the text are visually separated. -.COMMENT OFF -\# -\# -.IL 1P+\w'\(bu\*[FWD 3p]' -\# -\# Hanging indents are always relative to the current left indent. -\# The additional 1-pica indent, above, already having been taken -\# care of, we only want to hang the first lines of bullet list items -\# back by the width of the bullet character plus its 3 extra -\# points of space. -\# -.ALD 6p -.HI \w'\(bu\*[FWD 3p]' -\*[DOWN 1p]\(bu\*[UP 1p]\*[FWD 3p]This is the first line of a sublist with bullets. -N\*[BU 2]otice how the first line (the one with the bullet) is indented -exactly one pica from the text of the list item above it, while the -remaining lines align with the left indent we set above. -.ALD 6p -.HI -\*[DOWN 1p]\(bu\*[UP 1p]\*[FWD 3p]This is the second item of the sublist with bullets. \*[BU 4]We -could go on indefinitely, but let's go back to the top level (numbered) -list... -\# -\# The easiest way to return to a previous indent value is by subtraction. -\# The argument to IL, above, was 1P+\w'\(bu\*[FWD 3p]', so we just reverse -\# it by putting a minus sign in front. The parentheses are required -\# for groff to evaluate the expression properly. -\# -.IL -(1P+\w'\(bu\*[FWD 3p]') -.HI \w'\0.\0' \" Reset hanging indent for use with numbered items. -.ALD 6p -3.\0...and here we are. -.HI \" Again, notice that once HI has been set, you don't have to keep passing it an argument. -.ALD 6p -4.\0In order not to make the example too long, we'll stop here. -.IQ CLEAR \" Don't forget to cancel and/or clear indents! -\# -\# -.FAM T -.FT B -.PT_SIZE 12 -.LS 14 -.LEFT -.SP -\# -\# -Example 4: -.ALD .25v -.UNDERSCORE 3.75p "A \*[BU 2]recipe for nested lists using string tabs" -.SP .5v -.FAM N -.FT R -.PT_SIZE 11 -.LS 13 -.JUSTIFY -Although setting up string tabs is a bit more complex than setting -up indents, it's \*[BU 3]well worth the effort, especially for nested lists. -.ALD 6p -\# -.COMMENT -The PAD line, below, sets up two string tabs. The first (ST1) -is exactly the length of two figure spaces and a period. The -second (ST2) is simply "the remainder of the line." -.COMMENT OFF -\# -.SILENT -.PAD "\*[ST1]\0.\0\*[ST1X]\*[ST2]#\*[ST2X]" -.ST 1 L \" String tabs must be "set" after being marked off in a line -.ST 2 J \" ST 1 will be set flush left, nofill; ST 2 will be justified. -.SILENT OFF -\# -\# -.TB 1 -1. -.TN \" Use .TN here so text stays on the same baseline as the number in tab 1 -This is the first item in the list. N\*[BU 2]otice how, just as in Example 3, -the first line hangs back from the remaining text, which is otherwise -indented. -.ALD 6p -.TB 1 -2. -.TN -This is the second item in the list. N\*[BU 2]otice that when setting "lists" -with tabs, there's no need to use the \*[BU 8]\\0 escape sequence after -the number/period combination in the input text. -.ALD 6p -\# -.COMMENT -Now, set up the indented bullet-point sublist. The PAD line -says: move forward 12 points (1 pica), then mark off a string -tab (ST3) that's the length of the bullet character; move foward -another three points, then make the next string tab (ST4) the -length of remainder of the line. -.COMMENT OFF -\# -.SILENT -.PAD "\*[FWD 12p]\*[ST3]\(bu\*[ST3X]\*[FWD 3p]\*[ST4]#\*[ST4X]" -.ST 3 L -.ST 4 J -.SILENT OFF -.ALD 6p -.TB 3 -\*[DOWN 1p]\(bu\*[UP 1p] -.TN -This is the first line of a sublist with bullets. N\*[BU 2]otice how the -bullets and the text line up exactly the same as in Example 3. -.ALD 6p -.TB 3 -\*[DOWN 1p]\(bu\*[UP 1p] -.TN -This is the second item of the sublist with bullets. For the fun of -it, lets add in an -.SPREAD -en-dashed sub-sublist. -.BR \" We're in a fill mode right now, so you *must* terminate the line with BR -\# -\# -.SILENT -.PAD "\*[FWD 12p]\*[ST5]\(en\*[ST5X]\*[FWD 4p]\*[ST6]#\*[ST6X]" -.ST 5 L -.ST 6 J -.SILENT OFF -.ALD 6p -.TB 5 -\*[UP .75p]\(en\*[DOWN .75p] -.TN -Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam -nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, -sed diam voluptua. -.ALD 6p -.TB 5 -\*[UP .75p]\(en\*[DOWN .75p] -.TN -At \*[BU 3]vero eos et accusam et justo duo dolores et ea rebum. Stet clita -kasd gubergren, no sea takimata sanctus est lorem ipsum dolor sit amet. -.ALD 6p -.TB 1 -3. -.TN -And here we are, back at the top-level numbered list with a minimum -of muss and fuss, -.ALD 6p -.TB 1 -4. -.TN -Generally speaking, once you get the hang of string tabs and the -\*[BD]PAD\*[PREV] macro, you'll find setting up complex nested lists -(or anything similar to them) easier than with hanging indents. -.TQ -\# -.NEWPAGE -.FAM T -.FT B -.PT_SIZE 12 -.LS 14 -.LEFT -Example 5: -.ALD .25v -.UNDERSCORE 3.75p "Word spacing" -.ALD 8p -.FAM P \" Palatino family -.PT_SIZE 11 -.LS 14 -\# -\# The "label" lines for the following are set in Helvetica bold, one -\# point smaller than the examples themselves. This demonstrates the -\# use of the groff inline escape \f[...] to change both family and -\# font inline. It also shows using the mom inline \*S[...]. -\# -\f[HB]\*S[-1]Normal word spacing\*S[+1]\*[PREV] -.FT R -N\*[BU 1]o\*[BU 1]w \*[BU 1]is the time for all good men to come to the aid of the party. -.ALD 4p -\f[HB]\*S[-1]Word spacing adjusted by \*[UP 1p]\*[BU 3]+\*[DOWN 1p]\*[BU 1]2\*S[+1]\*[PREV] -.FT R -.WS +2 -N\*[BU 1]o\*[BU 1]w \*[BU 1]is the time for all good men to come to the aid of the party. -.WS +0 -.ALD 4p -\f[HB]\*S[-1]Word spacing adjusted by \*[UP 1p]\*[BU 3]+\*[DOWN 1p]4\*S[+1]\*[PREV] -.FT R -.WS +4 -N\*[BU 1]o\*[BU 1]w \*[BU 1]is the time for all good men to come to the aid of the party. -.WS +0 -.ALD 4p -\f[HB]\*S[-1]Word spacing adjusted by \*[UP 1p]\*[BU 3]+\*[DOWN 1p]6\*S[+1]\*[PREV] -.FT R -.WS +6 -N\*[BU 1]o\*[BU 1]w \*[BU 1]is the time for all good men to come to the aid of the party. -.WS +0 -.SP 1.5v -\# -\# -.FAM T -.FT B -.PT_SIZE 12 -.LS 14 -.LEFT -Example 6: -.ALD .25v -.UNDERSCORE 3.75p "Line kerning" -.ALD 8p -.FAM P \" Palatino family -.FT R -.PT_SIZE 11 -.LS 15 -\# -\# Here, we set up some tabs so the examples can go into facing columns. -\# -.TAB_SET 1 0 19.5P L -.TAB_SET 2 19.5P 19.5P L -\# -\# -.MCO \" Turn multi-columns on -.TB 1 -\f[HB]\*S[-1]Unkerned line\*S[+1]\*[PREV] -.FT R -"But this is \*[IT]important!\/"\*[PREV]she exclaimed. -.ALD 4p -\f[HB]\*S[-1]Line "tightened" \(en .RW .1\*S[+1]\*[PREV] -.RW .1 -"But this is \*[IT]important!\/"\*[PREV]she exclaimed. -.ALD 4p -\# -\# In the next line, notice that because it uses a different family -\# (Helvetica instead of Palatino), the RW macro doesn't affect it. -\# -\f[HB]\*S[-1]Line "tightened" \(en .RW .2\*S[+1]\*[PREV] -.RW .2 -"But this is \*[IT]important!\/"\*[PREV]she exclaimed. -.ALD 4p -\f[HB]\*S[-1]Line "tightened" \(en .RW .3\*S[+1]\*[PREV] -.RW .3 -"But this is \*[IT]important!\/"\*[PREV]she exclaimed. -.MCR -.TB 2 -\f[HB]\*S[-1]Unkerned line\*S[+1]\*[PREV] -"But this is \*[IT]important!\/"\*[PREV]she exclaimed. -.ALD 4p -\f[HB]\*S[-1]Line "loosened" \(en .EW .1\*S[+1]\*[PREV] -.EW .1 -"But this is \*[IT]important!\/"\*[PREV]she exclaimed. -.ALD 4p -\f[HB]\*S[-1]Line "loosened" \(en .EW .2\*S[+1]\*[PREV] -.EW .2 -"But this is \*[IT]important!\/"\*[PREV]she exclaimed. -.ALD 4p -\f[HB]\*S[-1]Line "loosened" \(en .EW .3\*S[+1]\*[PREV] -.EW .3 -"But this is \*[IT]important!\/"\*[PREV]she exclaimed. -.MCX 1.5v -\# -\# -.FAM T -.FT B -.PT_SIZE 12 -.LS 14 -.LEFT -Example 7: -.ALD .25v -.UNDERSCORE 3.75p "Cutaround using left\*[FU 2]/right indents, multi columns \ -and a dropcap" -.SP -\# -\# -.FT R -.PT_SIZE 11 -.LS 12 -.BR_AT_LINE_KERN OFF \" In justified text, it's best to have this OFF -\# -\# -.TAB_SET 1 0 18.5P J -.TAB_SET 2 20.5P 18.5P J -.MCO -.ALD 5P+9p -\# -\# The little picture of tux. -\# -.PSPIC penguin.ps -.MCR -.TAB 1 -.DROPCAP_FONT B -.DROPCAP L 3 COND 80 \" i.e. the letter L dropped 3 lines, condensed to 80% of its normal width -.EW .2 -orem ipsum dolor sit amet, consetetur sa\%dip\%scing elitr, sed diam -nonumy eir\%mod tempor invidunt ut labore et dolore magna aliquyam erat, -sed diam voluptua. -.EW 0 -.TI 1P -At vero eos et accusam et justo duo dolores et ea rebum. Stet clita -kasd gubergren, no sea taki- -.SPREAD \" Force justify preceding line before starting indent -.IR 3.5P -kimata sanctus est lorem ipsum dolor sit amet. -Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam -nonumy eirmod tempor. -.EW .2 -.TI -Invidunt ut labore et dolore magna ali\%qu\%yam erat, sed diam voluptua. -At -.EW 0 -vero eos et accusam et justo duo dolores et ea rebum. -.TI -Stet clita kasd gubergren, no sea ta- -.SPREAD \" Force justify preceding line before quitting indent -.IRQ -kimata sanctus est lorem ipsum dolor sit amet. Lorem ipsum dolor -sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor -in\%vi\%dunt ut labore et dolore magna aliquyam erat. Sed diam voluptua, -at vero eos et accusam et justo duo -.SPREAD -.EW .3 -dolores et ea rebum. Stet clita no kasd guber- -.SPREAD -.MCR -.TB 2 -gren, no sea takimata sanctus est lorem ipsum -.EW 0 -dolor sit amet. Consetetur sadipscing elitr, sed diam nonumy eirmod -tempor invidunt ut labore et dolore. -.TI -Magna aliquyam erat, sed diam voluptua, at vero eos et accusam. -Et justo duo dolores et ea -.SPREAD -.IL 3.5P -rebum, stet clita kasd gubergren. No sea -takimata sanctus est, lorem ipsum dolor sit amet. -.TI -Sit amet, consetetur sadipscing elitr, sed diam. Nonumy eirmod tempor -in\%vi- -.EW .3 -dunt ut labore et dolore magna. Ali- -.EW 0 -quyam erat sed diam voluptua. -At vero eos et accusam et justo duo dolores et ea rebum stet. -.ILQ -.TI -Dolores et ea rebum stet clita kasd gubergren, no sea takimata -sanctus. Sadipscing elitr sed diam, nonumy eirmod tempor, invidunt -ut labore et dolore magna aliquyam erat. Sed diam voluptua, at vero -eos et accusam et justo duo dolores et ea rebum. diff -ruN groff-1.19.1/contrib/mom/examples/README.mom groff-1.19.2/contrib/mom/examples/README.mom --- groff-1.19.1/contrib/mom/examples/README.mom 2004-01-25 08:19:56.000000000 +0100 +++ groff-1.19.2/contrib/mom/examples/README.mom 1970-01-01 01:00:00.000000000 +0100 @@ -1,59 +0,0 @@ -The files in this directory show mom in action. I haven't included -PostScript output from the files because I want to keep the mom -archive as lean as possible. In order to see the PostScript output of -these files, process them with groff, sending the output either to a -separate file for previewing with gv (ghostview) or to your printer. -I don't recommend previewing with gxditview because it doesn't render -some of mom's effects properly. - -All the files are set up for 8.5ix11i paper. - -macros.mom ----------- - -This file demonstrates the use of typesetting tabs, string tabs, -line padding, multi-columns and various indent styles, as well as -some of the refinements and fine-tuning available via macros and -inline escapes. - -Because the file also demonstrates a "cutaround" using a small picture -(of Tux), the PostScript file has been included in the directory. - -typeset.mom ------------ - -This file contains samples of three of the document styles available -with the document processing macros, as well as demonstrating the -use of COLLATE. The relatively rare BREAK_QUOTE macro is also used. -The PRINTSTYLE of this file is TYPESET, letting you get a look at mom's -default behaviour when she typesets a document. The last sample, -set in 2 columns, shows a few of the ways in which you can modify -mom's behaviour. - -typewrite.mom -------------- - -Using the first two samples from typeset.mom, this file shows what -"typewritten, double-spaced" documents (PRINTSTYLE TYPEWRITE) look -like. - -letter.mom ----------- - -This is just the tutorial example from the momdocs, ready for -previewing. - -elvis_syntax.new ----------------- - -For those who use the vi clone, elvis, you can paste this file into -your elvis.syn file. Provided your mom documents have the extension -.mom, they'll come out with colorized syntax highlighting. The rules -in elvis_syntax aren't exhaustive, but they go a LONG way to making mom -files more readable. - -The file elvis_syntax (for pre-2.2h versions of elvis) is no longer -being maintained. Users are encouraged to update to elvis 2.2h or -higher, and to use elvis_syntax.new for mom highlighting. -I'll be very happy if someone sends me syntax highlighting rules for vim -and emacs. :) diff -ruN groff-1.19.1/contrib/mom/examples/README.txt groff-1.19.2/contrib/mom/examples/README.txt --- groff-1.19.1/contrib/mom/examples/README.txt 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/contrib/mom/examples/README.txt 2005-05-14 07:54:53.000000000 +0200 @@ -0,0 +1,115 @@ +The files in this directory show mom in action. + +If you have downloaded and untarrred a version of mom from her +homepage, you'll see that none of the example files come with +corresponding PostScript (.ps) files, as they do with pre-compiled +versions of groff, or groff built from source. + +I haven't included the PostScript output because I want to +keep the mom archive as lean as possible. To view the PostScript +output, process the files with groff and either + + a) send the output to a separate file for previewing with a + PostScript viewer such as gv (ghostview), or + + b) to your printer. + +Using the file sample_docs.mom as an example, you would +accomplish a) like this: + + groff -mom -Tps sample_docs.mom > sample_docs.ps + gv sample_docs.ps + +Accomplishing b) depends on your printer setup, but a fairly +standard way to do it would be + + groff -mom -Tps sample_docs.mom | lpr + + or + + groff -mom -Tps -l sample_docs.mom + +Note: I don't recommend previewing with gxditview because it doesn't +render some of mom's effects properly. + +The files themselves +-------------------- + +All are set up for 8.5x11 inch paper (US letter). + +***typesetting.mom** + +The file, typesetting.mom, demonstrates the use of typesetting tabs, +string tabs, line padding, multi-columns and various indent styles, +as well as some of the refinements and fine-tuning available via +macros and inline escapes. + +Because the file also demonstrates a "cutaround" using a small +picture (of everybody's favourite mascot, Tux), the PostScript file, +penguin.ps has been included in the directory. + +***sample_docs.mom*** + +The file, sample_docs.mom, shows examples of three of the document +styles available with the mom's document processing macros, as well +as demonstrating the use of COLLATE. + +The PRINTSTYLE of this file is TYPESET, to give you an idea of mom's +default behaviour when typesetting a document. + +The last sample, set in 2 columns, shows off mom's flexibility +when it comes to designing documents. + +If you'd like to see how mom handles exactly the same file when the +PRINTSTYLE is TYPEWRITE (i.e. typewritten, double-spaced), simply +change + + .PRINTSTYLE TYPESET + +to + + .PRINTSTYLE TYPEWRITE + +near the top of the file. + +***letter.mom*** + +This is just the tutorial example from the momdocs, ready for +previewing. + +***elvis_syntax.new*** + +For those who use the vi clone, elvis, you can paste this file into +your elvis.syn. Provided your mom documents have the extension +.mom, they'll come out with colorized syntax highlighting. The +rules in elvis_syntax aren't exhaustive, but they go a LONG way to +making mom files more readable. + +The file elvis_syntax (for pre-2.2h versions of elvis) is no longer +being maintained. Users are encouraged to update to elvis 2.2h or +higher, and to use elvis_syntax.new for mom highlighting. + +I'll be very happy if someone decides to send me syntax highlighting +rules for emacs. :) + +***mom.vim*** + +Christian V. J. Brüssow has kindly contributed a set of mom syntax +highlighting rules for use with vim. Copy the file to your +~/.vim/syntax directory, then, if your vim isn't already set up to +do so, enable mom syntax highlighting with + + :syntax enable + +or + + :syntax on + +Please note: I don't use vim, so I won't be making changes to this +file myself. Christian Brüssow is the maintainer of the ruleset, +which is available on the Web at + + http://www.cvjb.de/comp/vim/mom.vim + +Contact Christian (cvjb@cvjb.de) if you have any suggestions or +requests. diff -ruN groff-1.19.1/contrib/mom/examples/sample_docs.mom groff-1.19.2/contrib/mom/examples/sample_docs.mom --- groff-1.19.1/contrib/mom/examples/sample_docs.mom 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/contrib/mom/examples/sample_docs.mom 2005-05-14 07:54:53.000000000 +0200 @@ -0,0 +1,574 @@ +\# This file contains three greeked documents collated together: +\# +\# i) two pages of a novelist's outline +\# ii) two pages of a chapter using COPYSTYLE DRAFT +\# iii) three pages of an academic paper, set in two columns +\# +\# Mom's defaults are used throughout, except for iii), which +\# demonstrates some of the ways you can design your own documents. +\# +\# Since the text throughout is greeked, and groff doesn't know how +\# to hyphenate all that pseudo-latinate nonsense, I've inserted +\# discretionary hyphens (\%) into a large number of the the words. +\# Normally, this isn't necessary. +\# +\# The PRINTSTYLE is TYPESET. If you'd like to see what mom does +\# with the documents when the PRINTSTYLE is TYPEWRITE, change +\# PRINTSTYLE TYPESET, below, to PRINTSTYLE TYPEWRITE. Also, in the +\# third example, comment out PARA_INDENT and QUOTE_INDENT (lines +\# 332 and 333). +\# +\# =================================================================== +\# +\# First, a sample "NAMED" document--in this case, an outline. +\# A novelist wouldn't normally write an outline with numbered heads, +\# subheads and paraheads. I've turned the feature on merely to +\# demonstrate it. +\# +\# Reference macros +\# +.TITLE "Lake Attica's Shores" +.SUBTITLE "A Romance Novel" +.AUTHOR "Rosemary Winspeare" +.DRAFT 1 \" Ignored because COPYSTYLE is FINAL +.REVISION 2 \" Ignored because COPYSTYLE is FINAL +.COPYRIGHT "2004 Alma Podborski +\# +\# Reference macros for the document cover +\# +.DOC_COVERTITLE "Sample mom Documents" +.MISC "Three types of mom documents" "assembled and collated by mom's author" +\# +\# Docstyle macros +\# +.DOCTYPE NAMED "Outline" +.PRINTSTYLE TYPESET \" Or TYPEWRITE to preview "typewritten, double-spaced" +\# +.DOC_COVER COVERTITLE MISC +.COVER TITLE AUTHOR DOCTYPE COPYRIGHT +\# +\# Additional setup macros +\# +.NUMBER_PARAHEADS +\# +.START +.PP +.PARAHEAD "A note on the setting" +Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam +nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna ali\%quyam erat, +sed diam voluptua. Stet clita kasd gubergren, no sea takimata sanctus est. +At vero eos et accusam et justo duo do\%lo\%re et ea rebum. +.PP +Stet clita kasd gubergren, no sea takimata sanctus est. Lorem ipsum +dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod +tempor invidunt ut labore et do\%lo\%re magna ali\%quyam erat, sed diam +voluptua. +.PP +Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt +ut labore et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. At +vero, eos et accusam et justo duo do\%lo\%res et ea rebum. Consetetur +sadipscing elitr, sed diam nonumy. +.LINEBREAK +.PP +.PARAHEAD "About historical personnages" +At vero eos et accusam et justo duo do\%lo\%res et ea rebum. Stet clita +kasd gubergren, no sea takimata sanctus est. Tempor invidunt ut +labore et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. +.PP +Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam +nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna ali\%quyam erat, +sed diam voluptua. Consetetur sadipscing elitr, sed diam nonumy +eirmod tempor invidunt ut labore et do\%lo\%re magna. Tempor invidunt +ut labore et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. +.NUMBER_HEADS +.NUMBER_SUBHEADS +.HEAD "Part One" +.SUBHEAD "Chapter 1" +.PP +Lorem ipsum dolor sit amet, consetetur sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna +ali\%quyam erat, sed diam voluptua. At vero eos et accusam et +justo duo do\%lo\%res et ea rebum. +.PP +At vero eos et accusam et justo duo do\%lo\%res et ea rebum. Stet clita +kasd gubergren, no sea takimata sanctus est. Lorem ipsum dolor sit +amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor +invidunt ut labore et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. +Stet clita kasd gubergren, no sea takimata sanctus est. +.SUBHEAD "Chapter 2" +.PP +Stet clita kasd gubergren, no sea takimata sanctus est. Lorem ipsum +dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod +tempor invidunt ut labore et do\%lo\%re magna ali\%quyam erat, sed diam +voluptua. At vero eos et accusam et justo duo do\%lo\%res et ea rebum. +.PP +Lorem ipsum dolor sit amet, consetetur sadipscing elitr, +sed diam nonumy eirmod tempor invidunt. Ut labore et do\%lo\%re magna +ali\%quyam erat, sed diam voluptua at vero. +.SUBHEAD "Chapter 3" +.PP +Eos et accusam et justo duo do\%lo\%res et ea rebum. Stet clita kasd +gubergren, no sea takimata sanctus est lorem ipsum dolor sit amet. +Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam +nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna ali\%quyam erat, +sed diam voluptua. At vero eos et accusam et justo duo do\%lo\%res et +ea rebum. +.HEAD "Part Two" +.SUBHEAD "Chapter 4" +.PP +Stet clita kasd gubergren, no sea takimata sanctus est +lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur +sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore +et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. +.PP +At vero eos et accusam et justo duo do\%lo\%res et ea rebum. Stet clita +kasd gubergren, no sea takimata sanctus est lorem ipsum dolor sit amet. +.PP +Nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna ali\%quyam erat, +sed diam voluptua. At vero eos et accusam et justo duo do\%lo\%res et +ea rebum. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, +sed diam nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna +ali\%quyam erat, sed diam voluptua. At vero eos et accusam et justo +duo do\%lo\%res et ea rebum. Stet clita kasd gubergren, no sea takimata +sanctus est lorem ipsum dolor sit amet. Consetetur sadipscing elitr, +sed diam nonumy eirmod tempor invidunt. +.SUBHEAD "Chapter 5" +.PP +Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed +diam nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna +ali\%quyam erat, sed diam voluptua. At vero eos et accusam et +justo duo do\%lo\%res et ea rebum. Stet clita kasd gubergren, +no sea takimata sanctus est lorem ipsum dolor sit amet. +.PP +Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt +ut labore et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. At vero +eos et accusam et justo duo do\%lo\%res et ea rebum. Stet clita kasd +gubergren, no sea takimata sanctus. +.PP +At vero eos et accusam et justo duo do\%lo\%res et ea rebum. Stet clita +kasd gubergren. Sea takimata sanctus est lorem ipsum dolor +sit amet. Accusam et justo duo do\%lo\%res et ea rebum +.SPREAD +.RIGHT +\*[BD]\&...end of sample outline\c +.EL +.COLLATE +\# +\# The .EL after the line "...end of sample outline" ensures that +\# mom doesn't spring the page trap, which would deposit a header at +\# the top of the next page. COLLATE doesn't print a page header +\# on the first page of a collated document, but if the page trap +\# has already deposited one there, COLLATE can't undo it. +\# +\# Normally, this isn't necessary; here we require it because the +\# line falls right at the bottom of the page, and would therefore +\# normally spring the page trap. Sorry for the fussiness, but at +\# least now you know what to do if you ever encounter the problem +\# of a page header printing at the top of a collated document. +\# +\# Please notice, too, the use of "\&" before "..." Whenever an +\# input line begins with either a period, an apostrophe or a space, +\# you must precede it with \&, otherwise the line will disappear, +\# even when, as here, there's an inline escape that starts the +\# line. +\# +\# ===================================================================== +\# +\# Next, two pages of a chapter, set in DRAFT style, showing +\# the use of the EPIGRAPH BLOCK macro and the QUOTE macro. +\# +\# You'll notice that the starting page number of this "draft" is 1 (in +\# roman numerals). COPYSTYLE DRAFT always numbers the first page of a +\# document 1. +\# +\# Reference macros +\# +.TITLE "Lake Attica's Shores" +.SUBTITLE "A Romance Novel" +.AUTHOR "Rosemary Winspeare" +.CHAPTER 1 +.CHAPTER_TITLE "The Bonny Blue Yonder" +.DRAFT 1 +.REVISION 2 +.MISC "Draft 1, 2nd revision" +\# +\# Docstyle macros +\# +.DOCTYPE CHAPTER +.COPYSTYLE DRAFT +\# +\# Additional style macros +\# +.EPIGRAPH_FONT I \" Epigraphs are normally set in roman +.DRAFT_WITH_PAGENUMBER \" Draft/revision info usually goes in the header +.COVER_MISC_QUAD RIGHT \" Change default position of the cover "misc" line +\# +.COVER CHAPTER+TITLE MISC +\# +.START +.EPIGRAPH BLOCK +Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam +nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna ali\%quyam erat, +sed diam voluptua. +.RIGHT +\*[ROM]\(emJoseph E. Blough +.EPIGRAPH OFF +.PP +Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam +nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna ali\%quyam erat, +sed diam voluptua. At vero eos et accusam et justo duo do\%lo\%res et +ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est. +At vero eos et accusam et justo duo do\%lo\%res et ea rebum. Lorem ipsum +dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod +tempor invidunt ut labore et do\%lo\%re magna ali\%quyam erat, sed diam +voluptua. At vero eos et accusam et justo duo do\%lo\%res et ea rebum. +Stet clita kasd gubergren, no sea takimata sanctus est. At vero eos +et accusam et justo duo do\%lo\%res et ea rebum. +.PP +Stet clita kasd gubergren, no sea takimata sanctus est. Lorem ipsum +dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod +tempor invidunt. +.PP +"Consetetur sadipscing elitr," dixit ea. +.PP +"Sed diam nonumy eirmod tempor invidunt ut labore," dixit eum. +.PP +Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam +nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna ali\%quyam erat, +sed diam voluptua. Consetetur sadipscing elitr, sed diam nonumy +eirmod tempor invidunt ut labore et do\%lo\%re magna. +.PP +"Lorem ipsum dolor sit amet," dixit ea. +.PP +"At vero eos et accusam et justo duo do\%lo\%res et ea rebum. Stet clita +kasd gubergren, no sea takimata sanctus est," dixit eum. "Sed diam +nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna ali\%quyam erat, +sed diam voluptua." +.PP +Consetetur sadipscing elitr, sed diam nonumy eirmod tempor: +.QUOTE +Invidunt ut labore et do\%lo\%re +Magna ali\%quyam erat sed diam +Voluptua stet clita kasd gubergren +No sea takimata sanctus est. +.QUOTE OFF +.PP +Justo duo do\%lo\%res et ea rebum. Stet clita kasd gubergren, no +sea takimata sanctus est. Lorem ipsum dolor sit amet, consetetur +sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore +et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. +.PP +"Stet clita kasd gubergren," dixit ea. +.PP +"No sea takimata sanctus est," dixit eum. +.PP +Nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna. Aliquyam erat +sed diam voluptua. At vero eos et accusam et justo, duo do\%lo\%res et +ea rebum. +.PP +Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam +nonumy eirmod tempor invidunt. Ut labore et do\%lo\%re magna ali\%quyam +erat, sed diam voluptua at vero. Stet clita kasd gubergren, no sea +takimata sanctus est. Consetetur sadipscing elitr, sed diam nonumy +eirmod tempor invidunt ut labore et do\%lo\%re magna. +.PP +Invidunt ut labore et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. +At vero eos et accusam et justo duo do\%lo\%res et ea rebum. Stet clita +kasd gubergren, no sea takimata sanctus est. At vero eos et accusam et +justo duo do\%lo\%res et ea rebum. Lorem ipsum dolor sit amet, consetetur +sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore +et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. At vero eos et +accusam et justo duo do\%lo\%res et ea rebum. Stet clita kasd gubergren, +no sea takimata sanctus est. At vero eos et accusam et justo duo +do\%lo\%res et ea rebum. +.RIGHT +\*[BD]\&...end of sample chapter +.COLLATE +\# +\# ===================================================================== +\# +\# Finally, a sample academic article, set in two columns with a +\# 1.5-pica gutter between them. This example also uses QUOTES, +\# BLOCKQUOTES and FOOTNOTES. In addition, it's set RECTO_VERSO, +\# with differing left and right margins that alternate from page to +\# page. (The header also flips from right to left, which you can +\# see on the 2nd and 3rd pages). +\# +\# In order to accomodate the narrow measure of the columns, there's also +\# a demonstration of things you can change with both the typesetting +\# macros and the document processing "control" macros. +\# +\# Reference macros +\# +.TITLE "CONTROL EQUALS CHAOS" +.SUBTITLE "\*[ALD1]The Psychological and Auditory \ +Impact of Serial vs. Aleatoric Music\*[RLD1]" +.AUTHOR "Joe Chang" "and" "Brad Hegel Connors" +.COPYRIGHT "2004 J. Chang, B.H. Connors +.MISC "Submitted June 3, 2004" "\*[IT]Piano Quarterly\*[PREV]" +\# +\# Docstyle macros +\# +.DOCTYPE DEFAULT +.COPYSTYLE FINAL +\# +\# Additional style macros -- general type parameters +\# +.L_MARGIN 6P +.R_MARGIN 4P+6p +.PT_SIZE 10 +.AUTOLEAD 1.5 +\# +\# Additional style macros -- change mom's default behaviour +\# +.RECTO_VERSO +.PAGENUM 1 +.HEADER_LEFT "Chang, Connors" \" Because we have two authors +.COLUMNS 2 1P+6p +.SUBTITLE_SIZE +1.5 +.AUTHOR_SIZE +.5 +.DOCHEADER_LEAD +2p +.HEADER_SIZE +1 +.PARA_INDENT 1P \" Comment this out if previewing PRINTSTYLE TYPEWRITE +.QUOTE_INDENT 2 \" Comment this out if previewing PRINTSTYLE TYPEWRITE +.SUBHEAD_SIZE +0 +.BLOCKQUOTE_FAMILY H +.BLOCKQUOTE_SIZE -2 +.NUMBER_HEADS OFF \" Because we turned them on in the first example +.NUMBER_SUBHEADS OFF \" Ibid +\# +.COVER TITLE AUTHOR COPYRIGHT MISC +\# +.START +.PP +Lorem ipsum dolor sit amet, consetetur sadipscing elitr. Sed diam +nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna. Ali\%quyam +erat, sed diam voluptua. +.PP +At vero eos et accusam et justo duo do\%lo\%res et ea rebum. Stet clita +kasd gubergren no sea takimata. Sanctus est, lorem ipsum dolor sit +amet. Consetetur sadipscing elitr, sed diam nonumy. Eirmod tempor +invidunt ut labore et do\%lo\%re magna ali\%quyam erat. Sed diam voluptua +at vero eos et accusam et justo. +\# +.BLOCKQUOTE +Stet clita kasd gubergren, no sea takimata sanctus est lorem. +Ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy +eirmod tempor. Invidunt ut labore et do\%lo\%re magna ali\%quyam erat, +sed diam voluptua at vero. Eos et accusam et justo duo do\%lo\%res et +ea rebum stet clita.\c +.FOOTNOTE \" Note the use of \c, above, to keep the word and footnote marker together. +Clita ipsum dolor sit amet, consetetur sadipscing elitr. +.FOOTNOTE OFF +.BLOCKQUOTE OFF +\# +.PP +Duo do\%lo\%res et ea rebum, stet clita kasd gubergren. No sea takimata +sanctus est lorem ipsum dolor sit amet, consetetur sadipscing elitr. +Sed diam nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna +ali\%quyam. Erat sed diam voluptua at. Vero eos et accusam et justo +duo do\%lo\%res et ea rebum stet. Clita kasd gubergren no sea takimata +sanctus est. +.PP +Nonumy eirmod tempor invidunt, ut labore et do\%lo\%re magna ali\%quyam +erat? At vero eos et accusam et justo duo do\%lo\%res et ea. Rebum stet +clita kasd gubergren no sea takimata sanctus. Est lorem ipsum dolor +sit amet. Sadipscing\c +.FOOTNOTE +Sadipscing diam nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna +ali\%quyam erat, sed diam voluptua. +.FOOTNOTE OFF + elitr sed diam nonumy eirmod tempor invidunt. Ut labore et do\%lo\%re +magna ali\%quyam erat, sed diam voluptua. At vero eos et accusam et +justo duo do\%lo\%res et ea rebum. Stet clita kasd gubergren no sea. +\# +.SUBHEAD "Schoenberg\(em" "The Origins of Serial Pitch Organization" +\# +.PP +Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam +nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna ali\%quyam erat, +sed diam voluptua. At vero eos et accusam et justo duo do\%lo\%res et ea +rebum. Stet clita kasd gubergren, no sea takimata sanctus est lorem. +Ipsum dolor sit amet consetetur sadipscing. Elitr, sed diam nonumy, +eirmod tempor invidunt ut labore et do\%lo\%re magna. Ali\%quyam erat sed +diam voluptua, at vero eos. Et accusam et justo duo do\%lo\%res et ea +rebum stet clita kasd gubergren lorem ipsum. Dolor sit amet +consetetur, sadipscing elitr, sed diam. Nonumy eirmod tempor invidunt +ut labore et do\%lo\%re. Magna ali\%quyam erat sed diam voluptua at vero. +Eos et accusam et justo duo do\%lo\%res et ea rebum stet clita kasd. +Gubergren no sea takimata sanctus est. +.PP +Amet consetetur sadipscing elitr sed diam nonumy eirmod. Tempor +invidunt ut labore. Et dolor\%e magna ali\%quyam erat, sed diam voluptua, +at vero. Eos et accusam et justo duo do\%lo\%res et ea rebum. Stet clita +kasd gubergren. +.PP +No sea takimata\c +.FOOTNOTE +Takimata sadipscing elitr, sed diam nonumy eirmod tempor invidunt +ut labore et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. +.FOOTNOTE OFF + sanctus est lorem. Ipsum dolor sit amet, consetetur +sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore +et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. At vero eos et +accusam et justo duo do\%lo\%res et ea rebum amet. Consetetur sadipscing +elitr sed diam nonumy eirmod tempor invidunt ut labore, et do\%lo\%re +magna ali\%quyam erat. Sed diam voluptua, at vero, eos et accusam et +justo duo do\%lo\%res et ea rebum. +\# +.SUBHEAD "Messiaen to Stockhausen\(em" "The Quest for Absolute Control" +\# +.PP +Vero eos et accusam et justo duo do\%lo\%res et ea rebum amet: +.QUOTE +Eirmod tempor invidunt +Ut labore et do\%lo\%re magna ali\%quyam erat +Sed diam voluptua +At vero eos et accusam et justo duo do\%lo\%res. +.QUOTE OFF +Lorem ipsum dolor sit amet, consetetur sadipscing elitr +sed diam. Nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna. +Aliquyam erat, sed diam voluptua at vero eos et accusam. Et +justo duo do\%lo\%res et ea rebum stet. +.PP +Elitr sed diam nonumy eirmod tempor. Invidunt ut labore et do\%lo\%re +magna ali\%quyam erat sed. Diam voluptua at vero eos et accusam et +justo duo do\%lo\%res et ea rebum. +\# +.BLOCKQUOTE +Sanctus est lorem ipsum dolor sit amet, consetetur sadipscing. Elitr, +sed diam nonumy eirmod tempor, invidunt ut labore et do\%lo\%re magna +ali\%quyam. Erat sed diam voluptua, at vero eos et accusam et justo +rebum amet. Consetetur sadipsc\%ing elitr sed diam nonumy eirmod +sed diam nonumy, eirmod tempor. Invidunt tempor invidunt ut labore.\c +.FOOTNOTE +Labore diam nonumy eirmod tempor, invidunt ut labore et do\%lo\%re +magna ali\%quyam. Erat sed diam voluptua, at vero eos et accusam et +justo. +.FOOTNOTE OFF + Et do\%lo\%re et magna ali\%quyam erat, sed diam voluptua, at vero. +Eos et accusam et justo duo. +.BLOCKQUOTE OFF +\# +.PP +Lorem ipsum dolor sit amet, consetetur sadipscing elitr. Sed diam +nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna. +.PP +Nonumy eirmod tempor invidunt, ut labore et do\%lo\%re magna ali\%quyam +erat? At vero eos et accusam et justo duo do\%lo\%res et ea. Rebum stet +clita kasd gubergren no sea takimata sanctus. Est lorem ipsum dolor +sit amet. Sadipscing elitr sed diam nonumy eirmod tempor invidunt. +Ut labore et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. +At vero eos et accusam et justo duo do\%lo\%res et ea rebum. +Stet clita kasd gubergren no sea. Ali\%quyam erat, sed diam voluptua. +\# +.SUBHEAD "John Cage\(em" "Leaving It All to Chance" +\# +.PP +Sit amet, consetetur sadipscing elitr, sed diam nonumy. Eirmod tempor +invidunt ut labore et do\%lo\%re magna. Ali\%quyam erat, sed diam +voluptua at vero. Eos et accusam et justo duo dolores et ea rebum. +Stet clita kasd gubergren, no sea taki\%mata sanctus est. +.PP +Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt +ut labore et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. At vero +eos et accusam et justo duo do\%lo\%res et ea rebum. Stet clita kasd +gubergren, no sea takimata sanctus est lorem. Ipsum dolor sit amet, +consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt +ut labore et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. At vero +eos et accusam et justo duo do\%lo\%res et ea rebum. +.PP +Stet clita kasd gubergren. No sea takimata sanctus est lorem ipsum +dolor sit. Amet consetetur sadipscing elitr, sed diam nonumy eirmod +tempor. Invidunt ut labore et do\%lo\%re magna ali\%quyam erat, sed diam +voluptua, at vero. Eos et accusam et justo duo do\%lo\%res et ea rebum. +Stet clita kasd gubergren, no sea takimata. Sanctus est lorem ipsum +dolor sit amet consetetur. Sadipscing elitr sed diam nonumy eirmod +tempor invidunt. Ut labore et do\%lo\%re magna ali\%quyam erat, sed diam +voluptua. At vero eos et accusam et justo duo do\%lo\%res et ea rebum. +\# +.BLOCKQUOTE +.PP +Stet clita kasd gubergren no sea. Takimata sanctus est lorem ipsum +dolor sit amet. Consetetur sadipscing elitr sed diam nonumy eirmod +tempor invidunt ut labore et do\%lo\%re. Magna ali\%quyam\c +.FOOTNOTE +Aliquyam nonumy eirmod tempor invidunt ut labore. +.FOOTNOTE OFF + erat, sed diam +voluptua at vero eos et accusam. Et justo duo do\%lo\%res et ea rebum, +stet clita kasd gubergren, no sea takimata. +.PP +Sanctus est lorem ipsum. Dolor sit amet consetetur sadipscing +elitr. Sed diam nonumy eirmod tempor invidunt ut labore. Et +do\%lo\%re magna ali\%quyam erat, sed diam voluptua. At vero eos et +accusam et justo duo. Dolores et ea rebum stet clita kasd gubergren +no sea. +.PP +Takimata lorem ipsum dolor sit amet consetetur sadipscing elitr. +Sed diam, nonumy eirmod tempor, invidunt ut labore et do\%lo\%re magna. +Aliquyam erat sed diam voluptua. At vero eos et accusam et +justo.\c +.FOOTNOTE +Justo vero eos et accusam et justo duo. +.FOOTNOTE OFF +.BLOCKQUOTE OFF +\# +.PP +Duo do\%lo\%res et ea rebum, stet clita kasd gubergren, no sea takimata +sanctus. Est lorem ipsum. Dolor sit amet, consetetur sadipscing elitr, +sed diam nonumy. Eirmod tempor invidunt ut labore et do\%lo\%re magna +ali\%quyam erat, sed diam voluptua. At vero eos et accusam. +.PP +Et justo duo do\%lo\%res et ea rebum stet clita kasd. Gubergren +no sea takimata sanctus est. Lorem ipsum dolor sit amet, consetetur +sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore +et dolore magna ali\%quyam erat, sed diam voluptua. At vero eos et +accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, +no sea takimata sanctus est. +\# +.SUBHEAD "Beyond Cage\(em" "Catching the Midnight Train" +\# +.PP +Lorem ipsum dolor sit amet, consetetur sadipscing elitr. Sed diam +nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna. Ali\%quyam +erat, sed diam voluptua. +.PP +At vero eos et accusam et justo duo do\%lo\%res et ea rebum. Stet clita +kasd gubergren no sea takimata. Sanctus est, lorem ipsum dolor sit +amet. Consetetur sadipscing elitr, sed diam nonumy. Eirmod tempor +invidunt ut labore et do\%lo\%re magna ali\%quyam erat. Sed diam voluptua +at vero eos et accusam et justo. +.PP +Duo do\%lo\%res et ea rebum, stet clita kasd gubergren. No sea takimata +sanctus est lorem ipsum dolor sit amet, consetetur sadipscing elitr. +Sed diam nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna +ali\%quyam. Erat sed diam voluptua at. Vero eos et accusam et justo +duo do\%lo\%res et ea rebum stet. Clita kasd gubergren no sea takimata +sanctus est. +.PP +Nonumy eirmod tempor invidunt, ut labore et do\%lo\%re magna ali\%quyam +erat? At vero eos et accusam et justo duo do\%lo\%res et ea. Rebum stet +clita kasd gubergren no sea takimata sanctus. Est lorem ipsum dolor +sit amet. Sadipscing\c +.FOOTNOTE +Sadipscing diam nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna +ali\%quyam erat, sed diam voluptua. +.FOOTNOTE OFF + elitr sed diam nonumy eirmod tempor invidunt. Ut labore et do\%lo\%re +magna ali\%quyam erat, sed diam voluptua. At vero eos et accusam et +justo duo do\%lo\%res et ea rebum. Stet clita kasd gubergren no sea +takimata lorem. Ipsum dolor sit amet, consetetur sadipscing elitr. +Sed diam nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna. +Ali\%quyam erat, sed diam voluptua. At vero eos et accusam et justo +duo do\%lo\%res et ea rebum. Stet clita kasd gubergren, no sea +takimata sanctus est. +.PP +Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed +diam nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna +ali\%quyam erat, sed diam voluptua. At vero eos et accusam et justo +duo do\%lo\%res et ea rebum. Stet clita kasd gubergren, no sea +takimata sanctus est. +.RIGHT +\*[BD]\&...end of sample article\*[PREV] +.FINIS diff -ruN groff-1.19.1/contrib/mom/examples/typeset.mom groff-1.19.2/contrib/mom/examples/typeset.mom --- groff-1.19.1/contrib/mom/examples/typeset.mom 2003-10-22 06:29:12.000000000 +0200 +++ groff-1.19.2/contrib/mom/examples/typeset.mom 1970-01-01 01:00:00.000000000 +0100 @@ -1,542 +0,0 @@ -\# This file contains three greeked documents collated together: -\# two pages of a novelist's outline, two pages of a chapter in DRAFT -\# style, and three pages of an academic paper set in two columns. -\# Mom's defaults are used throughout, except for the last one, which -\# shows off some of the ways of changing mom's behaviour. -\# -\# Since the text is greeked, and groff doesn't know how to -\# hyphenate all that pseudo-latinate nonsense, I've inserted -\# discretionary hyphens into a number of the the words. -\# -\# =================================================================== -\# -\# First, a sample "named" document, in this case, an outline. -\# A novelist wouldn't normally write an outline with numbered heads, -\# subheads and paraheads. I've turned the feature on merely to -\# demonstrate it. -\# -\# Reference macros -\# -.TITLE "Lake Attica's Shores" -.SUBTITLE "A Romance Novel" -.AUTHOR "Rosemary Winspeare" -.DRAFT 1 \" Ignored because COPYSTYLE is FINAL -.REVISION 2 \" Ignored because COPYSTYLE is FINAL -\# -\# Docstyle macros -\# -.DOCTYPE NAMED "Outline" -.PRINTSTYLE TYPESET -\# -\# Additional style macros -\# -.NUMBER_PARAHEADS -\# -.START -.PP -.PARAHEAD "A note on the setting" -Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam -nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna ali\%quyam erat, -sed diam voluptua. Stet clita kasd gubergren, no sea takimata sanctus est. -At vero eos et accusam et justo duo do\%lo\%re et ea rebum. -.PP -Stet clita kasd gubergren, no sea takimata sanctus est. Lorem ipsum -dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod -tempor invidunt ut labore et do\%lo\%re magna ali\%quyam erat, sed diam -voluptua. -.PP -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt -ut labore et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. At -vero, eos et accusam et justo duo do\%lo\%res et ea rebum. Consetetur -sadipscing elitr, sed diam nonumy. -.LINEBREAK -.PP -.PARAHEAD "About historical personnages" -At vero eos et accusam et justo duo do\%lo\%res et ea rebum. Stet clita -kasd gubergren, no sea takimata sanctus est. Tempor invidunt ut -labore et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. -.PP -Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam -nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna ali\%quyam erat, -sed diam voluptua. Consetetur sadipscing elitr, sed diam nonumy -eirmod tempor invidunt ut labore et do\%lo\%re magna. Tempor invidunt -ut labore et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. -.NUMBER_HEADS -.NUMBER_SUBHEADS -.HEAD "Part One" -.SUBHEAD "Chapter 1" -.PP -Lorem ipsum dolor sit amet, consetetur sadipscing elitr, -sed diam nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna -ali\%quyam erat, sed diam voluptua. At vero eos et accusam et -justo duo do\%lo\%res et ea rebum. -.PP -At vero eos et accusam et justo duo do\%lo\%res et ea rebum. Stet clita -kasd gubergren, no sea takimata sanctus est. Lorem ipsum dolor sit -amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor -invidunt ut labore et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. -Stet clita kasd gubergren, no sea takimata sanctus est. -.SUBHEAD "Chapter 2" -.PP -Stet clita kasd gubergren, no sea takimata sanctus est. Lorem ipsum -dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod -tempor invidunt ut labore et do\%lo\%re magna ali\%quyam erat, sed diam -voluptua. At vero eos et accusam et justo duo do\%lo\%res et ea rebum. -.PP -Lorem ipsum dolor sit amet, consetetur sadipscing elitr, -sed diam nonumy eirmod tempor invidunt. Ut labore et do\%lo\%re magna -ali\%quyam erat, sed diam voluptua at vero. -.SUBHEAD "Chapter 3" -.PP -Eos et accusam et justo duo do\%lo\%res et ea rebum. Stet clita kasd -gubergren, no sea takimata sanctus est lorem ipsum dolor sit amet. -Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam -nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna ali\%quyam erat, -sed diam voluptua. At vero eos et accusam et justo duo do\%lo\%res et -ea rebum. -.HEAD "Part Two" -.SUBHEAD "Chapter 4" -.PP -Stet clita kasd gubergren, no sea takimata sanctus est -lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur -sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore -et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. -.PP -At vero eos et accusam et justo duo do\%lo\%res et ea rebum. Stet clita -kasd gubergren, no sea takimata sanctus est lorem ipsum dolor sit amet. -.PP -Nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna ali\%quyam erat, -sed diam voluptua. At vero eos et accusam et justo duo do\%lo\%res et -ea rebum. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, -sed diam nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna -ali\%quyam erat, sed diam voluptua. At vero eos et accusam et justo -duo do\%lo\%res et ea rebum. Stet clita kasd gubergren, no sea takimata -sanctus est lorem ipsum dolor sit amet. Consetetur sadipscing elitr, -sed diam nonumy eirmod tempor invidunt. -.SUBHEAD "Chapter 5" -.PP -Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed -diam nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna -ali\%quyam erat, sed diam voluptua. At vero eos et accusam et -justo duo do\%lo\%res et ea rebum. Stet clita kasd gubergren, -no sea takimata sanctus est lorem ipsum dolor sit amet. -.PP -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt -ut labore et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. At vero -eos et accusam et justo duo do\%lo\%res et ea rebum. Stet clita kasd -gubergren, no sea takimata sanctus. -.PP -At vero eos et accusam et justo duo do\%lo\%res et ea rebum. Stet clita -kasd gubergren. Sea takimata sanctus est lorem ipsum dolor -sit amet. Accusam et justo duo do\%lo\%res et ea rebum -.SPREAD -\# -\# This next bit ensures that the line "...end of sample outline" doesn't -\# spring the page trap, which would deposit a header at the top of the -\# next page. COLLATE doesn't print a page header on the first page of -\# a collated document, but if the page trap has already deposited one -\# there, COLLATE can't undo it. Hence, we turn the trap off -\# (TRAP OFF), set the line, and put in an EL afterwards. -\# -\# Normally, all this isn't necessary when collating documents, -\# but if you ever have the problem of a page header printing at the -\# top of a collated document, now you know how to get around it. -\# -.TRAP OFF -.RIGHT -\*[BD]\&...end of sample outline -.EL -.TRAP -.COLLATE -\# -\# ===================================================================== -\# -\# Next, two sample pages of a chapter, set in DRAFT style, showing -\# the use of the EPIGRAPH BLOCK macro and the QUOTE macro. -\# -\# You'll notice that the starting page number of this "draft" is 1 (in -\# roman numerals). COPYSTYLE DRAFT always numbers the first page of a -\# document 1. -\# -\# Reference macros -\# -.TITLE "Lake Attica's Shores" -.SUBTITLE "A Romance Novel" -.AUTHOR "Rosemary Winspeare" -.CHAPTER 1 -.DRAFT 1 \" Appears in the header because copystyle is DRAFT -.REVISION 2 \" Appears in the header because copystyle is DRAFT -\# -\# Docstyle macros -\# -.DOCTYPE CHAPTER -.COPYSTYLE DRAFT -\# -\# Additional style macros -\# -.EPIGRAPH_FONT I \" Epigraphs are set in roman by default -\# -.START -.EPIGRAPH BLOCK -Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam -nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna ali\%quyam erat, -sed diam voluptua. -.RIGHT -\*[ROM]\(emJoseph E. Blough -.EPIGRAPH OFF -.PP -Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam -nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna ali\%quyam erat, -sed diam voluptua. At vero eos et accusam et justo duo do\%lo\%res et -ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est. -At vero eos et accusam et justo duo do\%lo\%res et ea rebum. Lorem ipsum -dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod -tempor invidunt ut labore et do\%lo\%re magna ali\%quyam erat, sed diam -voluptua. At vero eos et accusam et justo duo do\%lo\%res et ea rebum. -Stet clita kasd gubergren, no sea takimata sanctus est. At vero eos -et accusam et justo duo do\%lo\%res et ea rebum. -.PP -Stet clita kasd gubergren, no sea takimata sanctus est. Lorem ipsum -dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod -tempor invidunt. -.PP -"Consetetur sadipscing elitr," dixit ea. -.PP -"Sed diam nonumy eirmod tempor invidunt ut labore," dixit eum. -.PP -Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam -nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna ali\%quyam erat, -sed diam voluptua. Consetetur sadipscing elitr, sed diam nonumy -eirmod tempor invidunt ut labore et do\%lo\%re magna. -.PP -"Lorem ipsum dolor sit amet," dixit ea. -.PP -"At vero eos et accusam et justo duo do\%lo\%res et ea rebum. Stet clita -kasd gubergren, no sea takimata sanctus est," dixit eum. "Sed diam -nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna ali\%quyam erat, -sed diam voluptua." -.PP -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor: -.QUOTE -Invidunt ut labore et do\%lo\%re -Magna ali\%quyam erat sed diam -Voluptua stet clita kasd gubergren -No sea takimata sanctus est. -.QUOTE OFF -.PP -Justo duo do\%lo\%res et ea rebum. Stet clita kasd gubergren, no -sea takimata sanctus est. Lorem ipsum dolor sit amet, consetetur -sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore -et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. -.PP -"Stet clita kasd gubergren," dixit ea. -.PP -"No sea takimata sanctus est," dixit eum. -.PP -Nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna. Aliquyam erat -sed diam voluptua. At vero eos et accusam et justo, duo do\%lo\%res et -ea rebum. -.PP -Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam -nonumy eirmod tempor invidunt. Ut labore et do\%lo\%re magna ali\%quyam -erat, sed diam voluptua at vero. Stet clita kasd gubergren, no sea -takimata sanctus est. Consetetur sadipscing elitr, sed diam nonumy -eirmod tempor invidunt ut labore et do\%lo\%re magna. -.PP -Invidunt ut labore et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. -At vero eos et accusam et justo duo do\%lo\%res et ea rebum. Stet clita -kasd gubergren, no sea takimata sanctus est. At vero eos et accusam et -justo duo do\%lo\%res et ea rebum. Lorem ipsum dolor sit amet, consetetur -sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore -et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. At vero eos et -accusam et justo duo do\%lo\%res et ea rebum. Stet clita kasd gubergren, -no sea takimata sanctus est. At vero eos et accusam et justo duo -do\%lo\%res et ea rebum. -.RIGHT -\*[BD]\&...end of sample chapter -.COLLATE -\# -\# ===================================================================== -\# -\# Finally, a sample academic article, set in two columns with a -\# 1.5-pica gutter between them. This example also uses -\# BLOCKQUOTES, FOOTNOTES, and the relatively rare BREAK_QUOTE. In -\# addition, it's set RECTO_VERSO, with differing left and right -\# margins that alternate from page to page. (The header also -\# flips from right to left, which you can see on the 2nd and 3rd -\# pages). -\# -\# In order to accomodate the narrow measure of the columns, there's also -\# a demonstration of things you can change with both the typesetting -\# macros and the document processing "control" macros. -\# -\# Reference macros -\# -.TITLE "CONTROL EQUALS CHAOS" -.SUBTITLE "\*[ALD1]The Psychological and Auditory Impact of Serial vs. Aleatoric Music\*[RLD1]" -.AUTHOR "Joe Chang" "and" "Brad Hegel Connors" -\# -\# Docstyle macros -\# -.DOCTYPE DEFAULT -.COPYSTYLE FINAL -\# -\# Additional style macros -- general type parameters -\# -.L_MARGIN 6P -.R_MARGIN 4P+6p -.PT_SIZE 10 -.AUTOLEAD 1.5 -\# -\# Additional style macros -- change mom's default behaviour -\# -.RECTO_VERSO -.PAGENUM 1 -.HEADER_LEFT "Chang, Connors" \" Because we have two authors -.COLUMNS 2 1P+6p -.SUBTITLE_SIZE +1.5 -.AUTHOR_SIZE +.5 -.DOCHEADER_LEAD +2p -.HEADER_SIZE +1 -.PARA_INDENT 1P -.SUBHEAD_SIZE +0 -.BLOCKQUOTE_FAMILY H -.BLOCKQUOTE_SIZE -2 -.QUOTE_INDENT 2 -.NUMBER_HEADS OFF \" Because we turned them on in the first example -.NUMBER_SUBHEADS OFF \" Ibid -\# -.START -.PP -Lorem ipsum dolor sit amet, consetetur sadipscing elitr. Sed diam -nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna. Ali\%quyam -erat, sed diam voluptua. -.PP -At vero eos et accusam et justo duo do\%lo\%res et ea rebum. Stet clita -kasd gubergren no sea takimata. Sanctus est, lorem ipsum dolor sit -amet. Consetetur sadipscing elitr, sed diam nonumy. Eirmod tempor -invidunt ut labore et do\%lo\%re magna ali\%quyam erat. Sed diam voluptua -at vero eos et accusam et justo. -\# -.BLOCKQUOTE -Stet clita kasd gubergren, no sea takimata sanctus est lorem. -Ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy -eirmod tempor. Invidunt ut labore et do\%lo\%re magna ali\%quyam erat, -sed diam voluptua at vero. Eos et accusam et justo duo do\%lo\%res et -ea rebum stet clita.\c -.FOOTNOTE \" Note the use of \c, above, to keep the word and footnote marker together. -Lorem ipsum dolor sit amet, consetetur sadipscing elitr. -.FOOTNOTE OFF -.BLOCKQUOTE OFF -\# -.PP -Duo do\%lo\%res et ea rebum, stet clita kasd gubergren. No sea takimata -sanctus est lorem ipsum dolor sit amet, consetetur sadipscing elitr. -Sed diam nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna -ali\%quyam. Erat sed diam voluptua at. Vero eos et accusam et justo -duo do\%lo\%res et ea rebum stet. Clita kasd gubergren no sea takimata -sanctus est. -.PP -Nonumy eirmod tempor invidunt, ut labore et do\%lo\%re magna ali\%quyam -erat? At vero eos et accusam et justo duo do\%lo\%res et ea. Rebum stet -clita kasd gubergren no sea takimata sanctus. Est lorem ipsum dolor -sit amet. Sadipscing\c -.FOOTNOTE -Sed diam nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna -ali\%quyam erat, sed diam voluptua. -.FOOTNOTE OFF -elitr sed diam nonumy eirmod tempor invidunt. Ut labore et do\%lo\%re -magna ali\%quyam erat, sed diam voluptua. At vero eos et accusam et -justo duo do\%lo\%res et ea rebum. Stet clita kasd gubergren no sea. -\# -.SUBHEAD "Schoenberg\(em" "The Origins of Serial Pitch Organization" -\# -.PP -Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam -nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna ali\%quyam erat, -sed diam voluptua. At vero eos et accusam et justo duo do\%lo\%res et ea -rebum. Stet clita kasd gubergren, no sea takimata sanctus est lorem. -Ipsum dolor sit amet consetetur sadipscing. Elitr, sed diam nonumy, -eirmod tempor invidunt ut labore et do\%lo\%re magna. Ali\%quyam erat sed -diam voluptua, at vero eos. Et accusam et justo duo do\%lo\%res et ea -rebum stet clita kasd gubergren lorem ipsum. Dolor sit amet -consetetur, sadipscing elitr, sed diam. Nonumy eirmod tempor invidunt -ut labore et do\%lo\%re. Magna ali\%quyam erat sed diam voluptua at vero. -Eos et accusam et justo duo do\%lo\%res et ea rebum stet clita kasd. -Gubergren no sea takimata sanctus est. -.PP -Amet consetetur sadipscing elitr sed diam nonumy eirmod. Tempor -invidunt ut labore. Et dolor\%e magna ali\%quyam erat, sed diam voluptua, -at vero. Eos et accusam et justo duo do\%lo\%res et ea rebum. Stet clita -kasd gubergren. -.PP -No sea takimata\c -.FOOTNOTE -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt -ut labore et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. -.FOOTNOTE OFF -sanctus est lorem. Ipsum dolor sit amet, consetetur -sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore -et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. At vero eos et -accusam et justo duo do\%lo\%res et ea rebum amet. Consetetur sadipscing -elitr sed diam nonumy eirmod tempor invidunt ut labore, et do\%lo\%re -magna ali\%quyam erat. Sed diam voluptua, at vero, eos et accusam et -justo duo do\%lo\%res et ea rebum. -\# -.SUBHEAD "Messiaen to Stockhausen\(em" "The Quest for Absolute Control" -\# -.PP -Vero eos et accusam et justo duo do\%lo\%res et ea rebum amet: -.QUOTE -Eirmod tempor invidunt -Ut labore et do\%lo\%re magna ali\%quyam erat -Sed diam voluptua -At vero eos et accusam et justo duo do\%lo\%res. -.QUOTE OFF -Lorem ipsum dolor sit amet, consetetur sadipscing elitr -sed diam. Nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna. -Aliquyam erat, sed diam voluptua at vero eos et accusam. Et -justo duo do\%lo\%res et ea rebum stet. -.PP -Elitr sed diam nonumy eirmod tempor. Invidunt ut labore et do\%lo\%re -magna ali\%quyam erat sed. Diam voluptua at vero eos et accusam et -justo duo do\%lo\%res et ea rebum. -\# -.BLOCKQUOTE -Sanctus est lorem ipsum dolor sit amet, consetetur sadipscing. Elitr, -sed diam nonumy eirmod tempor, invidunt ut labore et do\%lo\%re magna -ali\%quyam. Erat sed diam voluptua, at vero eos et accusam et justo -rebum amet. Consetetur sadipsc\%ing elitr sed diam nonumy eirmod -sed diam nonumy, eirmod tempor. Invidunt tempor invidunt ut labore.\c -.FOOTNOTE -Sed diam nonumy eirmod tempor, invidunt ut labore et do\%lo\%re -magna ali\%quyam. Erat sed diam voluptua, at vero eos et accusam et -justo. -.FOOTNOTE OFF -Et do\%lo\%re et magna ali\%quyam erat, sed diam voluptua, at vero. -Eos et accusam et justo duo. -.BLOCKQUOTE OFF -\# -.PP -Lorem ipsum dolor sit amet, consetetur sadipscing elitr. Sed diam -nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna. -.PP -Nonumy eirmod tempor invidunt, ut labore et do\%lo\%re magna ali\%quyam -erat? At vero eos et accusam et justo duo do\%lo\%res et ea. Rebum stet -clita kasd gubergren no sea takimata sanctus. Est lorem ipsum dolor -sit amet. Sadipscing elitr sed diam nonumy eirmod tempor invidunt. -Ut labore et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. -At vero eos et accusam et justo duo do\%lo\%res et ea rebum. -Stet clita kasd gubergren no sea. Ali\%quyam erat, sed diam voluptua. -\# -.SUBHEAD "John Cage\(em" "Leaving It All to Chance" -\# -.PP -Sit amet, consetetur sadipscing elitr, sed diam nonumy. Eirmod tempor -invidunt ut labore et do\%lo\%re magna. Ali\%quyam erat, sed diam -voluptua at vero. Eos et accusam et justo duo dolores et ea rebum. -Stet clita kasd gubergren, no sea taki\%mata sanctus est. -.PP -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt -ut labore et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. At vero -eos et accusam et justo duo do\%lo\%res et ea rebum. Stet clita kasd -gubergren, no sea takimata sanctus est lorem. Ipsum dolor sit amet, -consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt -ut labore et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. At vero -eos et accusam et justo duo do\%lo\%res et ea rebum. -.PP -Stet clita kasd gubergren. No sea takimata sanctus est lorem ipsum -dolor sit. Amet consetetur sadipscing elitr, sed diam nonumy eirmod -tempor. Invidunt ut labore et do\%lo\%re magna ali\%quyam erat, sed diam -voluptua, at vero. Eos et accusam et justo duo do\%lo\%res et ea rebum. -Stet clita kasd gubergren, no sea takimata. Sanctus est lorem ipsum -dolor sit amet consetetur. Sadipscing elitr sed diam nonumy eirmod -tempor invidunt. Ut labore et do\%lo\%re magna ali\%quyam erat, sed diam -voluptua. At vero eos et accusam et justo duo do\%lo\%res et ea rebum. -\# -.BLOCKQUOTE -.PP -Stet clita kasd gubergren no sea. Takimata sanctus est lorem ipsum -dolor sit amet. Consetetur sadipscing elitr sed diam nonumy eirmod -tempor invidunt ut labore et do\%lo\%re. Magna ali\%quyam\c -.FOOTNOTE -Diam nonumy eirmod tempor invidunt ut labore. -.FOOTNOTE OFF -erat, sed diam -voluptua at vero eos et accusam. Et justo duo do\%lo\%res et ea rebum, -stet clita kasd gubergren, no sea takimata. -.PP -Sanctus est lorem ipsum. Dolor sit amet consetetur sadipscing elitr. Sed diam nonumy eirmod tempor invidunt ut -labore. Et do\%lo\%re magna ali\%quyam -erat, sed diam voluptua. -At vero eos et accusam et -.BREAK_QUOTE \"Needed because blockquote crosses a column AND contains a footnote -justo duo. Dolores et ea rebum stet clita kasd gubergren no sea. -.PP -Takimata lorem ipsum dolor sit amet consetetur sadipscing elitr. -Sed diam, nonumy eirmod tempor, invidunt ut labore et do\%lo\%re magna. -Aliquyam erat sed diam voluptua. At vero eos et accusam et -justo.\c -.FOOTNOTE -At vero eos et accusam et justo duo. -.FOOTNOTE OFF -.BLOCKQUOTE OFF -\# -.PP -Duo do\%lo\%res et ea rebum, stet clita kasd gubergren, no sea takimata -sanctus. Est lorem ipsum. Dolor sit amet, consetetur sadipscing elitr, -sed diam nonumy. Eirmod tempor invidunt ut labore et do\%lo\%re magna -ali\%quyam erat, sed diam voluptua. At vero eos et accusam. -.PP -Et justo duo do\%lo\%res et ea rebum stet clita kasd. Gubergren -no sea takimata sanctus est. Lorem ipsum dolor sit amet, consetetur -sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore -et dolore magna ali\%quyam erat, sed diam voluptua. At vero eos et -accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, -no sea takimata sanctus est. -\# -.SUBHEAD "Beyond Cage\(em" "Catching the Midnight Train" -\# -.PP -Lorem ipsum dolor sit amet, consetetur sadipscing elitr. Sed diam -nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna. Ali\%quyam -erat, sed diam voluptua. -.PP -At vero eos et accusam et justo duo do\%lo\%res et ea rebum. Stet clita -kasd gubergren no sea takimata. Sanctus est, lorem ipsum dolor sit -amet. Consetetur sadipscing elitr, sed diam nonumy. Eirmod tempor -invidunt ut labore et do\%lo\%re magna ali\%quyam erat. Sed diam voluptua -at vero eos et accusam et justo. -.PP -Duo do\%lo\%res et ea rebum, stet clita kasd gubergren. No sea takimata -sanctus est lorem ipsum dolor sit amet, consetetur sadipscing elitr. -Sed diam nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna -ali\%quyam. Erat sed diam voluptua at. Vero eos et accusam et justo -duo do\%lo\%res et ea rebum stet. Clita kasd gubergren no sea takimata -sanctus est. -.PP -Nonumy eirmod tempor invidunt, ut labore et do\%lo\%re magna ali\%quyam -erat? At vero eos et accusam et justo duo do\%lo\%res et ea. Rebum stet -clita kasd gubergren no sea takimata sanctus. Est lorem ipsum dolor -sit amet. Sadipscing\c -.FOOTNOTE -Sed diam nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna -ali\%quyam erat, sed diam voluptua. -.FOOTNOTE OFF -elitr sed diam nonumy eirmod tempor invidunt. Ut labore et do\%lo\%re -magna ali\%quyam erat, sed diam voluptua. At vero eos et accusam et -justo duo do\%lo\%res et ea rebum. Stet clita kasd gubergren no sea -takimata lorem. Ipsum dolor sit amet, consetetur sadipscing elitr. -Sed diam nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna. -Ali\%quyam erat, sed diam voluptua. At vero eos et accusam et justo -duo do\%lo\%res et ea rebum. Stet clita kasd gubergren, no sea -takimata sanctus est. -.PP -Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed -diam nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna -ali\%quyam erat, sed diam voluptua. At vero eos et accusam et justo -duo do\%lo\%res et ea rebum. Stet clita kasd gubergren, no sea -takimata sanctus est. -.RIGHT -\*[BD]\&...end of sample article\*[PREV] -.FINIS diff -ruN groff-1.19.1/contrib/mom/examples/typesetting.mom groff-1.19.2/contrib/mom/examples/typesetting.mom --- groff-1.19.1/contrib/mom/examples/typesetting.mom 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/contrib/mom/examples/typesetting.mom 2004-06-04 08:43:07.000000000 +0200 @@ -0,0 +1,673 @@ +\# Most mom users rely on mom's document processing macros to format +\# their work. The doc processing macros take care of all things +\# typographic and are simple, clear and easy to learn. The kind of +\# "by hand" typesetting this file shows off is really geared toward +\# professional typographers. Bear in mind, though, that the full +\# power of mom's typesetting capabilities can be brought to bear +\# on document processing as well. +\# +\# Basic page setup +\# +.PAGE 8.5i 11i \" Printer sheet size +.L_MARGIN 1i \" Left margin 1 inch +.R_MARGIN 1i \" Right margin 1 inch (calculates the line length) +\# +\# Basic type parameters +\# +.FAMILY T \" Times Roman family +.FT B \" Bold font +.PT_SIZE 12 \" Point size +.LS 14 \" Leading (line spacing) +.LEFT \" Set lines flush left, nofill mode +\# +\# Refinements +\# +.HY \" Hyphenate +.KERN \" Automatic pairwise kerning +.LIGATURES \" Automatic ligature generation +.SMARTQUOTES \" Enable smartquotes +.SS 0 \" No extra space between sentences +\# +.ALD 1i-1v \" Advance 1 inch from top of paper to first baseline +Example 1\*[BU 2]: +.ALD .25v \" Advance an extra 1/4 linespace +.UNDERSCORE 3.75p "T\*[BU 4]asting notes using padding, string tabs \ +and multi-columns" +\# +.SP \" Add an extra line space +\# +.FAM H \" Helvetica family +.PT_SIZE 10 +.LS 11 \" New leading +\# +\# The following uses a combination of padding, string tabs, and the +\# FWD escape to set up five tabs with 1-pica gutters stretched over +\# the full line length. +\# +.SILENT \" Don't print the next line +.PAD "\*[ST1]VIN#\*[ST1X]\*[FWD 1P]\*[ST2]ROBE#\*[ST2X]\*[FWD 1P]\*[ST3]NEZ#\*[ST3X]\*[FWD 1P]\*[ST4]BOUCHE#\*[ST4X]\*[FWD 1P]\*[ST5]COMMENTAIRES\*[ST5X]" +.SILENT OFF \" Resume normal printing of text +\# +\# Now that the string tabs have been marked off, we "set" them. +\# +.ST 1 L \" First string tab flush left, nofill mode (no need for .BR's between input lines) +.ST 2 L QUAD \" Remaining tabs are flush left/rag right, fill mode +.ST 3 L QUAD +.ST 4 L QUAD +.ST 5 L QUAD +\# +.TAB 1 \" Call first tab +.UNDERSCORE "VIN" +.TN \" Move to next tab and stay on the same baseline +.UNDERSCORE "ROBE" +.TN \" Ibid +.UNDERSCORE "NEZ" +.TN \" Ibid +.UNDERSCORE "BOUCHE" +.TN \" Ibid +.UNDERSCORE "COMMENTAIRES" +.TQ \" Quit tabs +\# +.ALD 6p \" Advance an extra 6 points +.FT R \" Change font to roman (medium) +.MCO \" Turn multi-column mode on +\# +.TAB 1 \" Notice that this tab gets set line-for-line +\*[IT]Peelee Island \" Set italic +\*[PREV]Gewürztraminer \" Revert to former font (roman) +2000 +(Canada) +.MCR \" Return to top of column +.TAB 2 \" Call tab 2; in multi-column mode, don't use .TN +Jaune pâle. +.MCR +.TB 3 \" Notice that from here on, we use the alias TB instead of TAB +Frais, fruité, ci\%tronné, arômes fortes de lichee et de fruits +tropicaux. +.MCR +.TB 4 +Doux, fruité, bien équilibré avec une bonne acidité. +.MCR +.TB 5 +Bon apéro. Servir avec des plats +.RW .1 \" Reduce Whitespace between letters to tighten this line +indiens ou \%chinois. +.RW 0 \" Back to normal spacing between letters +.BR +Excellent rapport qualité/prix. +.MCX 8p \" Multi-column mode off; advance an extra 8 points +.MCO \" Re-invoke multi-columns for next wine description +.TB 1 +\*[IT]Carau Pujol +\*[ROM]Tannat +1995 +(Uraguay) +.MCR +.TB 2 +Rubis foncé, vio\%lacée, presque opaque. +.MCR +.TB 3 +Belles arômes de fruits foncés (prunes, cerises noires, cassis). +Odeurs tertiares de cuir, cèdre, violets, eucalyptus, avec une trace +exotique de Band-Aid*\*[BU 12]. +\# +\# The \*[BU 12], above, pulls the period back so that it falls +\# underneath the asterisk. \*[BP] could have been used instead +\# if you prefer to use points rather than kern units. +\# +.MCR +.TB 4 +Très rond, tannins mûres et veloutés, avec un long finis fruité et +doucement alcoolique. +.MCR +.TB 5 +Superbe\|! Une aubaine à ne pas manquer. Prêt à boire maintenant. +.MCX 1v \" Multi-columns off; advance an extra linespace +\# +\# Now, an example of a hanging indent. This is excessively fussy +\# from a typographic standpoint in that it hangs the asterisk outside +\# the current left margin so that the text following it lines up with +\# with the text in the tasting notes. Notice that in order to use a +\# hanging indent, you must first set a left indent. +\# +.FT I \" Change font to italic +.PT_SIZE -.5 \" Reduce point size by 1/2 point +.LS -.5 \" Reduce leading by 1/2 point +.JUSTIFY \" Set text justified +\# +\# Now, move the left margin back by the width of an asterisk plus 2 points... +\# +.L_MARGIN -(\w'*'+2p) +\# +\# ...and set a left indent equal to the width of an asterisk plus 2 points +\# +.IL \w'*'+2p +\# +\# Now, set the hanging indent equal to the left indent, effectively pulling +\# the first line of the following text back to the new left margin. +\# Subsequent output lines will be indented by the .IL amount. +\# Notice that when using the \w inline escape, there's no need to append +\# a unit of measure to it. +\# +.HI \w'*'+2p +*\*[FWD 1p]The term "Band-Aid" means the slightly sweet, vaguely chemical +smell associated with medical-grade plastics. It is often found in +wines from terroirs in South America. Provided a wine has a sufficient +concentration of fruit +.RW .04 \" Kern the whole next line slightly, so "lipstick" doesn't hyphenate. +aromas and complex tertiary characteristics, Band-Aid is a Good Thing. +Otherwise, it smells like cheap lipstick. +.RW 0 \" Reset kerning to 0 +\# +\# Notice, above, that although the values for IL and HI are the width +\# of an asterisk plus 2 points, when setting the first line of text +\# (the one with the asterisk at the beginning), we put only 1 point of +\# space after the *. This is to compensate for the fact that in the +\# italic font, the letter T doesn't align visually with the rest of +\# the text. As already noted, this is an extremely fussy example. :) +\# +.IQ CLEAR \" Cancel and clear stored indent values +.L_MARGIN 1i \" Reset left margin to its original value. +\# +.ALD 2P \" Add 2-picas extra space before next example +\# +.FAM T +.FT B +.PT_SIZE 12 +.LS 14 +\# +Example 2: +.ALD .25v +\# +.COMMENT \" COMMENT lets you enter comments without using \# or \" +In the next line, because the string to be underscored must be +enclosed in double-quotes, you can't use the double-quote character +itself around the word "Massaging". We circumvent this by using the +groff inline escapes \(lq and \(rq (leftquote and rightquote). +.COMMENT OFF \" Remember to turn COMMENT off! +\# +.UNDERSCORE 3.75p "\(lqMassaging\(rq \*[BCK 1p]a passage of rag right text" +.SP \" Add an extra linespace +\# +.PT_SIZE 12.5 +.LS 14 +.PT_SIZE -1 \" Reduce point size by 1 point +Passage using groff spacing defaults +\# +.ALD .5v \" Add an extra 1/2 line space +\# +.PT_SIZE +1 \" Restore point size +.QUAD LEFT \" Set quad left, fill mode +.IB 3P \" Indent 3 picas from both the left and right margins +.FT R +The thousand injuries of Fortunato I had borne as I best could; +but when he ventured upon insult, I vowed revenge. You, who so well +know the nature of my soul, will not suppose, however, that I gave +utterance to a threat. \*[IT]At length\*[PREV] I would be +avenged; this was a point definitively settled\(embut the very +definitiveness with which it was resolved, precluded the idea of +risk. I must not only punish, but punish with impunity. A +wrong is unredressed when retribution overtakes its redresser. +It is equally unredressed when the avenger fails to make himself +felt as such to him who has done the wrong. +.ALD 6p +\# +\# The next line is set quad right, nofill mode, 1/2 point smaller +\# than the preceding text (using the \*[SIZE ] inline escape. +\# +.RIGHT +\*[SIZE -.5]\(emEdgar Allen Poe, \*[IT]The Cask of Amontillado\*[PREV]\*[SIZE +.5] +.SP \" Extra linespace +.IBQ \" Disable "indent both" +\# +\# The passage above, while acceptable in a longer document, exhibits a +\# few typographic flaws. The shape of the right margin rag exhibits +\# a decidedly "rounded" appearance. The word "I" stands alone at the +\# end of the third line. The space between the 1st and 2nd sentences +\# ("...revenge. You...") is too large, owing to the letter "Y" that +\# begins the 2nd sentence. The spacing between "A wrong..." (line 6) +\# is equally too large because of the way "A" and "w" fit together. +\# The em-dash before Edgar isn't vertically centered with the letter "E". +\# And so on. The most important correction below is fixing the rag +\# so that longer and shorter lines alternate. This is accomplished by +\# manually breaking lines and then slightly lengthening and shortening +\# them until a pleasing rag is achieved. The remainder of the little +\# flaws are fixed with inline escapes. +\# +.FT B +.PT_SIZE -1 +.LEFT +The same passage, \*[BU 4]"massaged" +\# +.ALD .5v +\# +.FT R +.PT_SIZE +1 +.QUAD LEFT +.HY OFF \" Turn automatic hyphenation off +.BR_AT_LINE_KERN \" Automatically insert a line break (.BR) with each invocation of .RW and .EW +.WS +1 \" Increase word space slightly +.IB \" Turn "indent both" back on; values are the same as before +\# +The thousand injuries of Fortunato I had borne as I best could; but +when he ventured upon insult, I \*[BU 2]vowed revenge. \*[BU 4]Y\*[BU 6]ou, +\*[BU 4]who so \*[BU 2]well know the nature +.EW .2 +of my soul, \*[BU 2]will not suppose, however, that I gave utterance to +a threat. \*[IT]At +.EW .2 +length\*[PREV] I would be avenged; this was a point definitively +settled\(embut the +.EW .2 +v\*[BU 1]ery definitiveness with which it was resolved, precluded the idea +of risk. +.EW 0 +I must not only punish, but punish with impunity. A \*[BCK 1p]wrong is +unredressed +.EW .1 +when retribution overtakes its redresser. It is equally unredressed +when the +.RW .1 +avenger fails to make himself felt as such to him \*[BU 2]who has done +the wrong. +.RW 0 \" Restore normal kerning +.WS +0 \" Restore normal wordspacing +.ALD 6p +.PT_SIZE -.5 +.RIGHT +\*[UP 1.5p]\(em\*[DOWN 1.5p]\*[BCK 1p]Edgar \*[BCK 1p]Allen Poe, \*[IT]The Cask of Amontillado\*[PREV] +.IQ CLEAR \" Cancel and clear stored values of all indents +\# +\# +.NEWPAGE \" Start a new page +.T_MARGIN 1i \" Set top margin to 1i (approx. equivalent to .ALD 1i-1v above) +\# +.FAM T +.FT B +.PT_SIZE 12 +.LS 14 +.LEFT +\# +Example 3: +.ALD .25v +.UNDERSCORE 3.75p "A \*[BU 2]recipe for enumerated lists using indents" +.SP .5v \" Add an extra half line space +.FAM N \" New Century Schoolbook family +.FT R +.PT_SIZE 11 +.LS 13 +.HY \" Turn hyphenation back on +.JUSTIFY \" Justify text +This example demonstrates the use of left and hanging indents for +simple enumerated lists. Nested lists are possible, as the example +shows; however, the more complex the nesting, the wiser it becomes +to use (string) tabs, as seen in Example 4. +.TI 1.5m +\*[BD]Please note: mom\*[PREV] has macros that allow you to set +enumerated lists automatically. These examples merely show hanging +indents and string tabs in use. +\# +.JUSTIFY \" Justify text +.IL \w'\0.\0' \" Establish a left indent equal to the width of 2 figure spaces plus a period. +.HI \w'\0.\0' \" Establish a hanging indent equal to the size of the left indent. +.ALD 6p +\# +\# +1.\0This is the first item in the list. N\*[BU 2]otice how the first line +"hangs" back from the remaining text, which is otherwise +indented by the width of by two figure-spaces (digit-width +spaces) and a period. +.BR +.HI \" Notice that HI doesn't require an argument once the value's been set +.ALD 6p +2.\0This is the second item in the list. As with the above item, +notice the use of the \*[BU 8]\\0 escape sequence in the input text. It's +there to ensure that the space after the number/period combination +always remains the same (i.e. doesn't stretch when the line is +justified). That way, the text of each item always lines up perfectly. +\# +.COMMENT +Now we're going to set a bullet-point list, indented from the text +above by 1 pica. IL arguments are always added to whatever value +is in already effect for IL, hence all we have to do is tell mom to +indent (from the current left indent) 1 pica plus the width of the +bullet character ( \(bu ). \*[FWD 3p] puts three points of space after +the bullet so that the bullet and the text are visually separated. +.COMMENT OFF +\# +\# +.IL 1P+\w'\(bu\*[FWD 3p]' +\# +\# Hanging indents are always relative to the current left indent. +\# The additional 1-pica indent, above, already having been taken +\# care of, we only want to hang the first lines of bullet list items +\# back by the width of the bullet character plus its 3 extra +\# points of space. +\# +.ALD 6p +.HI \w'\(bu\*[FWD 3p]' +\*[DOWN 1p]\(bu\*[UP 1p]\*[FWD 3p]This is the first line of a sublist with bullets. +N\*[BU 2]otice how the first line (the one with the bullet) is indented +exactly one pica from the text of the list item above it, while the +remaining lines align with the left indent we set above. +.ALD 6p +.HI +\*[DOWN 1p]\(bu\*[UP 1p]\*[FWD 3p]This is the second item of the sublist with bullets. \*[BU 4]We +could go on indefinitely, but let's go back to the top level (numbered) +list... +\# +\# The easiest way to return to a previous indent value is by subtraction. +\# The argument to IL, above, was 1P+\w'\(bu\*[FWD 3p]', so we just reverse +\# it by putting a minus sign in front. The parentheses are required +\# for groff to evaluate the expression properly. +\# +.IL -(1P+\w'\(bu\*[FWD 3p]') +.HI \w'\0.\0' \" Reset hanging indent for use with numbered items. +.ALD 6p +3.\0...and here we are. +.HI \" Again, notice that once HI has been set, you don't have to keep passing it an argument. +.ALD 6p +4.\0In order not to make the example too long, we'll stop here. +.IQ CLEAR \" Don't forget to cancel and/or clear indents! +\# +.FAM T +.FT B +.PT_SIZE 12 +.LS 14 +.LEFT +.SP +\# +Example 4: +.ALD .25v +.UNDERSCORE 3.75p "A \*[BU 2]recipe for nested lists using string tabs" +.SP .5v +.FAM N +.FT R +.PT_SIZE 11 +.LS 13 +.JUSTIFY +Although setting up string tabs is a bit more complex than setting +up indents, it's \*[BU 3]well worth the effort, especially for nested lists. +.ALD 6p +\# +.COMMENT +The PAD line, below, sets up two string tabs. The first (ST1) +is exactly the length of two figure spaces and a period. The +second (ST2) is simply "the remainder of the line." +.COMMENT OFF +\# +.SILENT \" Don't print any of this +.PAD "\*[ST1]\0.\0\*[ST1X]\*[ST2]#\*[ST2X]" +.ST 1 L \" String tabs must be "set" after being marked off in a line +.ST 2 J \" ST 1 will be set flush left, nofill; ST 2 will be justified. +.SILENT OFF \" Restore printing +\# +.TB 1 +1. +.TN \" Use .TN here so text stays on the same baseline as the number in tab 1 +This is the first item in the list. N\*[BU 2]otice how, just as in Example 3, +the first line hangs back from the remaining text, which is otherwise +indented. +.ALD 6p +.TB 1 +2. +.TN +This is the second item in the list. N\*[BU 2]otice that when setting "lists" +with tabs, there's no need to use the \*[BU 8]\\0 escape sequence after +the number/period combination in the input text. +.ALD 6p +\# +.COMMENT +Now, set up the indented bullet-point sublist. The PAD line +says: move forward 12 points (1 pica), then mark off a string +tab (ST3) that's the length of the bullet character; move foward +another three points, then make the next string tab (ST4) the +length of remainder of the line. +.COMMENT OFF +\# +.SILENT +.PAD "\*[FWD 12p]\*[ST3]\(bu\*[ST3X]\*[FWD 3p]\*[ST4]#\*[ST4X]" +.ST 3 L +.ST 4 J +.SILENT OFF +.ALD 6p +.TB 3 +\*[DOWN 1p]\(bu\*[UP 1p] +.TN +This is the first line of a sublist with bullets. N\*[BU 2]otice how the +bullets and the text line up exactly the same as in Example 3. +.ALD 6p +.TB 3 +\*[DOWN 1p]\(bu\*[UP 1p] +.TN +This is the second item of the sublist with bullets. For the fun of +it, lets add in an +.SPREAD +en-dashed sub-sublist. +.BR \" We're in a fill mode right now, so you *must* terminate the line with BR +\# +.SILENT +.PAD "\*[FWD 12p]\*[ST5]\(en\*[ST5X]\*[FWD 4p]\*[ST6]#\*[ST6X]" +.ST 5 L +.ST 6 J +.SILENT OFF +.ALD 6p +.TB 5 +\*[UP .75p]\(en\*[DOWN .75p] +.TN +Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam +nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, +sed diam voluptua. +.ALD 6p +.TB 5 +\*[UP .75p]\(en\*[DOWN .75p] +.TN +At \*[BU 3]vero eos et accusam et justo duo dolores et ea rebum. Stet clita +kasd gubergren, no sea takimata sanctus est lorem ipsum dolor sit amet. +.ALD 6p +.TB 1 +3. +.TN +And here we are, back at the top-level numbered list with a minimum +of muss and fuss, +.ALD 6p +.TB 1 +4. +.TN +Generally speaking, once you get the hang of string tabs and the +\*[BD]PAD\*[PREV] macro, you'll find setting up complex nested lists +(or anything similar to them) easier than with hanging indents. +.TQ +\# +.NEWPAGE +.FAM T +.FT B +.PT_SIZE 12 +.LS 14 +.LEFT +\# +Example 5: +.ALD .25v +.UNDERSCORE 3.75p "Word spacing" +.ALD 8p +.FAM P \" Palatino family +.PT_SIZE 11 +.LS 14 +\# +\# The "label" lines for the following are set in Helvetica bold, one +\# point smaller than the examples themselves. This demonstrates the +\# use of the groff inline escape \f[...] to change both family and +\# font inline. It also shows using the mom inline \*S[...], which is +\# an alternate form of the inline, \*[SIZE ] +\# +\f[HB]\*S[-1]Normal word spacing\*S[+1]\*[PREV] +.FT R +N\*[BU 1]o\*[BU 1]w \*[BU 1]is the time for all good men to come to the aid of the party. +.ALD 4p +\f[HB]\*S[-1]Word spacing adjusted by \*[UP 1p]\*[BU 3]+\*[DOWN 1p]\*[BU 1]2\*S[+1]\*[PREV] +.FT R +.WS +2 +N\*[BU 1]o\*[BU 1]w \*[BU 1]is the time for all good men to come to the aid of the party. +.WS +0 +.ALD 4p +\f[HB]\*S[-1]Word spacing adjusted by \*[UP 1p]\*[BU 3]+\*[DOWN 1p]4\*S[+1]\*[PREV] +.FT R +.WS +4 +N\*[BU 1]o\*[BU 1]w \*[BU 1]is the time for all good men to come to the aid of the party. +.WS +0 +.ALD 4p +\f[HB]\*S[-1]Word spacing adjusted by \*[UP 1p]\*[BU 3]+\*[DOWN 1p]6\*S[+1]\*[PREV] +.FT R +.WS +6 +N\*[BU 1]o\*[BU 1]w \*[BU 1]is the time for all good men to come to the aid of the party. +.WS +0 +.SP 1.5v +\# +.FAM T +.FT B +.PT_SIZE 12 +.LS 14 +\# +.LEFT +Example 6: +.ALD .25v +.UNDERSCORE 3.75p "Line kerning" +.ALD 8p +.FAM P \" Palatino family +.FT R +.PT_SIZE 11 +.LS 15 +\# +\# Here, we set up some tabs so the examples can go into facing columns. +\# +.TAB_SET 1 0 19.5P L +.TAB_SET 2 19.5P 19.5P L +\# +.MCO \" Turn multi-columns on +.TB 1 +\f[HB]\*S[-1]Unkerned line\*S[+1]\*[PREV] +.FT R +"But this is \*[IT]important!\/"\*[PREV]she exclaimed. +.ALD 4p +\f[HB]\*S[-1]Line "tightened" \(en .RW .1\*S[+1]\*[PREV] +.RW .1 +"But this is \*[IT]important!\/"\*[PREV]she exclaimed. +.ALD 4p +\# +\# In the next line, notice that because it uses a different family +\# (Helvetica instead of Palatino), the RW macro doesn't affect it. +\# +\f[HB]\*S[-1]Line "tightened" \(en .RW .2\*S[+1]\*[PREV] +.RW .2 +"But this is \*[IT]important!\/"\*[PREV]she exclaimed. +.ALD 4p +\f[HB]\*S[-1]Line "tightened" \(en .RW .3\*S[+1]\*[PREV] +.RW .3 +"But this is \*[IT]important!\/"\*[PREV]she exclaimed. +.MCR +.TB 2 +\f[HB]\*S[-1]Unkerned line\*S[+1]\*[PREV] +"But this is \*[IT]important!\/"\*[PREV]she exclaimed. +.ALD 4p +\f[HB]\*S[-1]Line "loosened" \(en .EW .1\*S[+1]\*[PREV] +.EW .1 +"But this is \*[IT]important!\/"\*[PREV]she exclaimed. +.ALD 4p +\f[HB]\*S[-1]Line "loosened" \(en .EW .2\*S[+1]\*[PREV] +.EW .2 +"But this is \*[IT]important!\/"\*[PREV]she exclaimed. +.ALD 4p +\f[HB]\*S[-1]Line "loosened" \(en .EW .3\*S[+1]\*[PREV] +.EW .3 +"But this is \*[IT]important!\/"\*[PREV]she exclaimed. +.MCX 1.5v +\# +.FAM T +.FT B +.PT_SIZE 12 +.LS 14 +.LEFT +\# +Example 7: +.ALD .25v +.UNDERSCORE 3.75p "Cutaround using left\*[FU 2]/right indents, multi columns \ +and a dropcap" +.SP +\# +.FT R +.PT_SIZE 11 +.LS 12 +.BR_AT_LINE_KERN OFF \" In justified text, it's best to have this OFF +\# +.TAB_SET 1 0 18.5P J +.TAB_SET 2 20.5P 18.5P J +.MCO +.ALD 5P+9p +\# +\# The little picture of tux. +\# +.PSPIC penguin.ps +.MCR +.TAB 1 +.XCOLOR red \" Initialize the X11 color, red +.DROPCAP_COLOR red +.DROPCAP_FONT B +.DROPCAP L 3 COND 80 \" i.e. the letter L dropped 3 lines, condensed to 80% of its normal width +.EW .2 +orem ipsum dolor sit amet, consetetur sa\%dip\%scing elitr, sed diam +nonumy eir\%mod tempor invidunt ut labore et dolore magna aliquyam erat, +sed diam voluptua. +.EW 0 +.TI 1P +At vero eos et accusam et justo duo dolores et ea rebum. Stet clita +kasd gubergren, no sea taki- +.SPREAD \" Force justify preceding line before starting indent +.IR 3.5P +kimata sanctus est lorem ipsum dolor sit amet. +Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam +nonumy eirmod tempor. +.EW .2 +.TI +Invidunt ut labore et dolore magna ali\%qu\%yam erat, sed diam voluptua. +At +.EW 0 +vero eos et accusam et justo duo dolores et ea rebum. +.TI +Stet clita kasd gubergren, no sea ta- +.SPREAD \" Force justify preceding line before quitting indent +.IRQ +kimata sanctus est lorem ipsum dolor sit amet. Lorem ipsum dolor +sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor +in\%vi\%dunt ut labore et dolore magna aliquyam erat. Sed diam voluptua, +at vero eos et accusam et justo duo +.SPREAD +.EW .3 +dolores et ea rebum. Stet clita no kasd guber- +.SPREAD +.MCR +.TB 2 +gren, no sea takimata sanctus est lorem ipsum +.EW 0 +dolor sit amet. Consetetur sadipscing elitr, sed diam nonumy eirmod +tempor invidunt ut labore et dolore. +.TI +Magna aliquyam erat, sed diam voluptua, at vero eos et accusam. +Et justo duo dolores et ea +.SPREAD +.IL 3.5P +rebum, stet clita kasd gubergren. No sea +takimata sanctus est, lorem ipsum dolor sit amet. +.TI +Sit amet, consetetur sadipscing elitr, sed diam. Nonumy eirmod tempor +in\%vi- +.EW .3 +dunt ut labore et dolore magna. Ali- +.EW 0 +quyam erat sed diam voluptua. +At vero eos et accusam et justo duo dolores et ea rebum stet. +.ILQ +.TI +Dolores et ea rebum stet clita kasd gubergren, no sea takimata +sanctus. Sadipscing elitr sed diam, nonumy eirmod tempor, invidunt +ut labore et dolore magna aliquyam erat. Sed diam voluptua, at vero +eos et accusam et justo duo dolores et ea rebum. diff -ruN groff-1.19.1/contrib/mom/examples/typewrite.mom groff-1.19.2/contrib/mom/examples/typewrite.mom --- groff-1.19.1/contrib/mom/examples/typewrite.mom 2003-05-19 07:00:37.000000000 +0200 +++ groff-1.19.2/contrib/mom/examples/typewrite.mom 1970-01-01 01:00:00.000000000 +0100 @@ -1,235 +0,0 @@ -\# A sample of PRINTSTYLE TYPEWRITE. The file contains the sample -\# outline and sample draft chapter found in the docprocessing_tyeset.mom -\# file. Only two changes have been made: the printstyle (here, -\# TYPEWRITE instead of the default TYPESET), and the header size -\# in the sample chapter, reduced by 1 point in order to accomodate -\# all three parts of the header. Other than that, the samples have -\# been left alone so you can assess and get a feel for how PRINTSTYLE -\# TYPEWRITE behaves. -\# -\# ==================================================================== -\# -\# Sample outline using PRINTSTYLE TYPEWRITE -\# -\# Reference macros -\# -.TITLE "Lake Attica's Shores" -.SUBTITLE "A Romance Novel" -.AUTHOR "Rosemary Winspeare" -.DRAFT 1 \" Ignored because COPYSTYLE is FINAL (the default) -.REVISION 2 \" Ignored because COPYSTYLE is FINAL (the default) -\# -\# Docstyle macros -\# -.DOCTYPE NAMED "Outline" -.PRINTSTYLE TYPEWRITE -\# -\# Additional style macros -\# -.NUMBER_PARAHEADS -.HEADER_CENTER_PAD RIGHT 15p \" To get "Outline" in the page header visually centered -\# -.START -.PP -.PARAHEAD "A note on the setting" -Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam -nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna ali\%quyam erat, -sed diam voluptua. Stet clita kasd gubergren, no sea takimata sanctus est. -At vero eos et accusam et justo duo do\%lo\%re et ea rebum. -.PP -Stet clita kasd gubergren, no sea takimata sanctus est. Lorem ipsum -dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod -tempor invidunt ut labore et do\%lo\%re magna ali\%quyam erat, sed diam -voluptua. -.PP -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt -ut labore et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. At -vero, eos et accusam et justo duo do\%lo\%res et ea rebum. Consetetur -sadipscing elitr, sed diam nonumy. -.LINEBREAK -.PP -.PARAHEAD "About historical personnages" -At vero eos et accusam et justo duo do\%lo\%res et ea rebum. Stet clita -kasd gubergren, no sea takimata sanctus est. Tempor invidunt ut -labore et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. -.PP -Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam -nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna ali\%quyam erat, -sed diam voluptua. Consetetur sadipscing elitr, sed diam nonumy -eirmod tempor invidunt ut labore et do\%lo\%re magna. Tempor invidunt -ut labore et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. -.NUMBER_HEADS -.NUMBER_SUBHEADS -.HEAD "Part One" -.SUBHEAD "Chapter 1" -.PP -Lorem ipsum dolor sit amet, consetetur sadipscing elitr, -sed diam nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna -ali\%quyam erat, sed diam voluptua. At vero eos et accusam et -justo duo do\%lo\%res et ea rebum. -.PP -At vero eos et accusam et justo duo do\%lo\%res et ea rebum. Stet clita -kasd gubergren, no sea takimata sanctus est. Lorem ipsum dolor sit -amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor -invidunt ut labore et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. -Stet clita kasd gubergren, no sea takimata sanctus est. -.SUBHEAD "Chapter 2" -.PP -Stet clita kasd gubergren, no sea takimata sanctus est. Lorem ipsum -dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod -tempor invidunt ut labore et do\%lo\%re magna ali\%quyam erat, sed diam -voluptua. At vero eos et accusam et justo duo do\%lo\%res et ea rebum. -.PP -Lorem ipsum dolor sit amet, consetetur sadipscing elitr, -sed diam nonumy eirmod tempor invidunt. Ut labore et do\%lo\%re magna -ali\%quyam erat, sed diam voluptua at vero. -.SUBHEAD "Chapter 3" -.PP -Eos et accusam et justo duo do\%lo\%res et ea rebum. Stet clita kasd -gubergren, no sea takimata sanctus est lorem ipsum dolor sit amet. -Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam -nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna ali\%quyam erat, -sed diam voluptua. At vero eos et accusam et justo duo do\%lo\%res et -ea rebum. -.HEAD "Part Two" -.SUBHEAD "Chapter 4" -.PP -Stet clita kasd gubergren, no sea takimata sanctus est -lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur -sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore -et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. -.PP -At vero eos et accusam et justo duo do\%lo\%res et ea rebum. Stet clita -kasd gubergren, no sea takimata sanctus est lorem ipsum dolor sit amet. -.PP -Nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna ali\%quyam erat, -sed diam voluptua. At vero eos et accusam et justo duo do\%lo\%res et -ea rebum. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, -sed diam nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna -ali\%quyam erat, sed diam voluptua. At vero eos et accusam et justo -duo do\%lo\%res et ea rebum. Stet clita kasd gubergren, no sea takimata -sanctus est lorem ipsum dolor sit amet. Consetetur sadipscing elitr, -sed diam nonumy eirmod tempor invidunt. -.SUBHEAD "Chapter 5" -.PP -Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed -diam nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna -ali\%quyam erat, sed diam voluptua. At vero eos et accusam et -justo duo do\%lo\%res et ea rebum. Stet clita kasd gubergren, -no sea takimata sanctus est lorem ipsum dolor sit amet. -.PP -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt -ut labore et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. At vero -eos et accusam et justo duo do\%lo\%res et ea rebum. Stet clita kasd -gubergren, no sea takimata sanctus. -.PP -At vero eos et accusam et justo duo do\%lo\%res et ea rebum. Stet clita -kasd gubergren. Sea takimata sanctus est lorem ipsum dolor -sit amet. Accusam et justo duo do\%lo\%res et ea rebum -.BR -.RIGHT -\*[BD]\&...end of sample outline \" Notice that TYPEWRITE ignores the \*[BD] -.COLLATE -\# -\# ===================================================================== -\# -\# Sample chapter in COPYSTYLE DRAFT using PRINTSTYLE TYPEWRITE -\# -\# Reference macros -\# -.TITLE "Lake Attica's Shores" -.SUBTITLE "A Romance Novel" -.AUTHOR "Rosemary Winspeare" -.CHAPTER 1 -.DRAFT 1 \" Appears in the header because copystyle is DRAFT -.REVISION 2 \" Appears in the header because copystyle is DRAFT -\# -\# Docstyle macros -\# -.DOCTYPE CHAPTER -.COPYSTYLE DRAFT -\# -\# Additional style macros -\# -.EPIGRAPH_FONT I \" TYPEWRITE underlines italics -.HEADER_SIZE -1 \" Make page header type size smaller -.HEADER_CENTER_PAD RIGHT 6p -\# -.START -.EPIGRAPH BLOCK -Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam -nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna ali\%quyam erat, -sed diam voluptua. -.RIGHT -\*[ROM]\(emJoseph E. Blough -.EPIGRAPH OFF -.PP -Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam -nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna ali\%quyam erat, -sed diam voluptua. At vero eos et accusam et justo duo do\%lo\%res et -ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est. -At vero eos et accusam et justo duo do\%lo\%res et ea rebum. Lorem ipsum -dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod -tempor invidunt ut labore et do\%lo\%re magna ali\%quyam erat, sed diam -voluptua. At vero eos et accusam et justo duo do\%lo\%res et ea rebum. -Stet clita kasd gubergren, no sea takimata sanctus est. At vero eos -et accusam et justo duo do\%lo\%res et ea rebum. -.PP -Stet clita kasd gubergren, no sea takimata sanctus est. Lorem ipsum -dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod -tempor invidunt. -.PP -"Consetetur sadipscing elitr," dixit ea. -.PP -"Sed diam nonumy eirmod tempor invidunt ut labore," dixit eum. -.PP -Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam -nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna ali\%quyam erat, -sed diam voluptua. Consetetur sadipscing elitr, sed diam nonumy -eirmod tempor invidunt ut labore et do\%lo\%re magna. -.PP -"Lorem ipsum dolor sit amet," dixit ea. -.PP -"At vero eos et accusam et justo duo do\%lo\%res et ea rebum. Stet clita -kasd gubergren, no sea takimata sanctus est," dixit eum. "Sed diam -nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna ali\%quyam erat, -sed diam voluptua." -.PP -Consetetur sadipscing elitr, sed diam nonumy eirmod tempor: -.QUOTE -Invidunt ut labore et do\%lo\%re -Magna ali\%quyam erat sed diam -Voluptua stet clita kasd gubergren -No sea takimata sanctus est. -.QUOTE OFF -.PP -Justo duo do\%lo\%res et ea rebum. Stet clita kasd gubergren, no -sea takimata sanctus est. Lorem ipsum dolor sit amet, consetetur -sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore -et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. -.PP -"Stet clita kasd gubergren," dixit ea. -.PP -"No sea takimata sanctus est," dixit eum. -.PP -Nonumy eirmod tempor invidunt ut labore et do\%lo\%re magna. Aliquyam erat -sed diam voluptua. At vero eos et accusam et justo, duo do\%lo\%res et -ea rebum. -.PP -Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam -nonumy eirmod tempor invidunt. Ut labore et do\%lo\%re magna ali\%quyam -erat, sed diam voluptua at vero. Stet clita kasd gubergren, no sea -takimata sanctus est. Consetetur sadipscing elitr, sed diam nonumy -eirmod tempor invidunt ut labore et do\%lo\%re magna. -.PP -Invidunt ut labore et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. -At vero eos et accusam et justo duo do\%lo\%res et ea rebum. Stet clita -kasd gubergren, no sea takimata sanctus est. At vero eos et accusam et -justo duo do\%lo\%res et ea rebum. Lorem ipsum dolor sit amet, consetetur -sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore -et do\%lo\%re magna ali\%quyam erat, sed diam voluptua. At vero eos et -accusam et justo duo do\%lo\%res et ea rebum. Stet clita kasd gubergren, -no sea takimata sanctus est. At vero eos et accusam et justo duo -do\%lo\%res et ea rebum. -.RIGHT -\*[BD]\&...end of sample chapter \" Notice that TYPEWRITE ignores the \*[BD] diff -ruN groff-1.19.1/contrib/mom/groff_mom.man groff-1.19.2/contrib/mom/groff_mom.man --- groff-1.19.1/contrib/mom/groff_mom.man 2003-07-18 09:28:43.000000000 +0200 +++ groff-1.19.2/contrib/mom/groff_mom.man 2005-05-16 10:14:37.000000000 +0200 @@ -1,7 +1,7 @@ .ig This file is part of groff, the GNU roff type-setting system. -Copyright (C) 2002, 2003 Free Software Foundation, Inc. +Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc. written by Werner Lemberg Permission is granted to copy, distribute and/or modify this document @@ -88,10 +88,11 @@ . .B mom was written by -.MTO df191@ncf.ca "Peter Schaffter" . +.MTO peter@faustus.dyn.ca "Peter Schaffter" . Please send bug reports to the .MTO bug-groff@gnu.org "groff bug mailing list" -or directly to the author. +or directly to the author, either at the address above or to +.MTO ptpi@golden.net "" . . .cp \n[groff_mom_C] . diff -ruN groff-1.19.1/contrib/mom/Makefile.sub groff-1.19.2/contrib/mom/Makefile.sub --- groff-1.19.1/contrib/mom/Makefile.sub 2004-03-05 10:52:10.000000000 +0100 +++ groff-1.19.2/contrib/mom/Makefile.sub 2005-08-11 06:18:15.000000000 +0200 @@ -1,4 +1,4 @@ -# Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. +# Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc. # Written by Werner Lemberg (wl@gnu.org) # # This file is part of groff. @@ -15,7 +15,7 @@ # # You should have received a copy of the GNU General Public License along # with groff; see the file COPYING. If not, write to the Free Software -# Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. # These may be overridden if cross-compiling. GROFFBIN=$(top_builddir)/src/roff/groff/groff @@ -44,6 +44,7 @@ HTMLDOCFILES=\ momdoc/appendices.html \ + momdoc/color.html \ momdoc/cover.html \ momdoc/definitions.html \ momdoc/docelement.html \ @@ -53,7 +54,9 @@ momdoc/inlines.html \ momdoc/intro.html \ momdoc/letters.html \ + momdoc/macrolist.html \ momdoc/rectoverso.html \ + momdoc/refer.html \ momdoc/reserved.html \ momdoc/toc.html \ momdoc/typemacdoc.html \ @@ -62,19 +65,21 @@ EXAMPLEFILES=\ examples/letter.mom \ - examples/macros.mom \ - examples/typeset.mom \ - examples/typewrite.mom \ - examples/README.mom \ + examples/sample_docs.mom \ + examples/typesetting.mom \ + examples/README.txt \ examples/elvis_syntax \ examples/elvis_syntax.new \ examples/penguin.ps PROCESSEDEXAMPLEFILES=\ examples/letter.ps \ - examples/macros.ps \ - examples/typeset.ps \ - examples/typewrite.ps + examples/sample_docs.ps \ + examples/typesetting.ps + +HTMLDOCFILES_=`echo $(HTMLDOCFILES) | sed 's|momdoc/||g'` +EXAMPLEFILES_=`echo $(EXAMPLEFILES) | sed 's|examples/||g'` +PROCESSEDEXAMPLEFILES_=`echo $(PROCESSEDEXAMPLEFILES) | sed 's|examples/||g'` CLEANADD=\ penguin.ps \ @@ -104,29 +109,30 @@ rm -f $(tmacdir)/$$f; \ $(INSTALL_DATA) $(srcdir)/$$f $(tmacdir)/$$f; \ done - -test -d $(htmldocdir)/momdoc || $(mkinstalldirs) $(htmldocdir)/momdoc - for f in $(HTMLDOCFILES); do \ - rm -f $(htmldocdir)/$$f; \ - $(INSTALL_DATA) $(srcdir)/$$f $(htmldocdir)/$$f; \ - done - -test -d $(exampledir) || $(mkinstalldirs) $(exampledir) - for f in $(EXAMPLEFILES); do \ - rm -f $(exampledir)/$$f; \ - $(INSTALL_DATA) $(srcdir)/$$f $(docdir)/$$f; \ - done - for f in $(PROCESSEDEXAMPLEFILES); do \ - rm -f $(exampledir)/$$f; \ - $(INSTALL_DATA) $$f $(docdir)/$$f; \ + -test -d $(htmldocdir)/mom || $(mkinstalldirs) $(htmldocdir)/mom + for f in $(HTMLDOCFILES_); do \ + rm -f $(htmldocdir)/mom/$$f; \ + $(INSTALL_DATA) $(srcdir)/momdoc/$$f $(htmldocdir)/mom/$$f; \ + done + -test -d $(exampledir)/mom || $(mkinstalldirs) $(exampledir)/mom + for f in $(EXAMPLEFILES_); do \ + rm -f $(exampledir)/mom/$$f; \ + $(INSTALL_DATA) $(srcdir)/examples/$$f $(exampledir)/mom/$$f; \ + done + for f in $(PROCESSEDEXAMPLEFILES_); do \ + rm -f $(exampledir)/mom/$$f; \ + $(INSTALL_DATA) examples/$$f $(exampledir)/mom/$$f; \ done uninstall_sub: -for f in $(NORMALFILES); do \ rm -f $(tmacdir)/$$f; \ done - -for f in $(HTMLDOCFILES); do \ - rm -f $(htmldocdir)/$$f; \ + -for f in $(HTMLDOCFILES_); do \ + rm -f $(htmldocdir)/mom/$$f; \ done - -rmdir $(htmldocdir)/momdoc - -for f in $(EXAMPLEFILES) $(PROCESSEDEXAMPLEFILES); do \ - rm -f $(docdir)/$$f; \ + -rmdir $(htmldocdir)/mom + -for f in $(EXAMPLEFILES_) $(PROCESSEDEXAMPLEFILES_); do \ + rm -f $(exampledir)/mom/$$f; \ done + -rmdir $(exampledir)/mom diff -ruN groff-1.19.1/contrib/mom/momdoc/appendices.html groff-1.19.2/contrib/mom/momdoc/appendices.html --- groff-1.19.1/contrib/mom/momdoc/appendices.html 2004-02-22 10:17:08.000000000 +0100 +++ groff-1.19.2/contrib/mom/momdoc/appendices.html 2005-05-18 07:33:28.000000000 +0200 @@ -1,3 +1,4 @@ + @@ -8,7 +9,7 @@ Next   -Prev   +Prev   Back to Table of Contents

@@ -19,6 +20,10 @@

  • Further notes on this documentation +
  • Adding PostScript fonts to groff +
  • Some reflections on mom, with an apology
  • Contact the author
  • List of reserved words @@ -67,23 +72,510 @@ For them, firing up a browser is obviously necessary for reading mom's documentation. Browsers being what they are, and not everyone on the globe having the cash for muscle machines -to run Galeon, or Konqueror, or Mozilla, or Netscape, their browser -needs to be one that's fast and light -- Lynx, in other words. +to run Galeon, or Konqueror or Mozilla, their browser +needs to be fast and light--and probably "text-only".

    Some mom users may notice the absence of graphics, -frames, and (for the most part) tables in this documentation. -The reason is simple: Lynx. People who, for whatever reason (choice -or necessity), use Lynx to read the documentation must be able to make -sense of it. All of it. Graphical examples of mom -in action might have made some parts of the documentation easier to -write, but would have excluded Lynx-only users. And it goes -without saying that the documentation looks fine if you're -reading it in a graphical browser. +frames, and (for the most part) tables in this documentation. The +reason is simple: text-only browsers. People who, for whatever +reason (choice or necessity), use lynx, or links or w3m to read +the documentation must be able to make sense of it. All of it. +Graphical examples of mom in action might have made +some parts of the documentation easier to write, but would have +excluded text-only browser users. And it goes without saying that +the documentation looks fine if you're reading it in a graphical +browser.


    + +

    Adding PostScript fonts to groff

    +
    + + +Small note: the term <prefix> in this +section refers to the directory in which groff is installed, +typically something like /usr/share/groff/<version#> +(for distro-specific, pre-compiled groff packages) or +/usr/local/share/groff/<version#> (if you've built groff +from source). +

    +Groff comes with a small library of PostScript +families +(see the +FAMILY +macro for a list). The families have four +fonts +associated with them. These fonts are a combination of +weight +and +shape: +
    +

      +
    • R (Roman, usually Medium weight), +
    • I (Italic, usually Medium weight), +
    • B (Bold, usually Roman shape) and +
    • BI (Bold Italic). +
    +

    +If you do a lot of document processing or typesetting with +mom, you'll find, sooner or later, that these +families and their associated fonts aren't sufficient. You'll want +to supplement them, either with more fonts for the families already +provided--"Damn! I need Helvetica Bold Condensed Italic!"--or with +entire new families. +

    +Without going into the gory details (yet), while it's true that +adding fonts to groff is a relatively straightforward +process, extending existing families or adding new ones requires +some planning. +

    +The traditional approach to extending groff families has been +to create new families for non-default weights and +shapes (e.g. Light, which is a weight; Condensed, which is a +shape), then to associate them with groff's predefined R, +I, B and BI font styles. An example +of this can be seen in the groff PostScript font library itself +(<prefix>/font/devps/): there's one "family" for +Helvetica (HR, HI, HB, HBI) and another for Helvetica Narrow (HNR, +HNI, HNB, HNBI). +

    +The difficulty with this approach is that typographers +tend to think of "families" as referring to the +entire set of font weights and shapes associated with a +particular family name. For example, when a typesetter says +"the Helvetica family", s/he is including the weights Helvetica Thin, +Helvetic Light, Helvetica Regular, Helvetica Bold, Helvetica Heavy, +etc, and all their associated +shapes +(Roman, +Italic, Condensed, Narrow, Extended, Outline, etc). +

    +Thus, intuitively, when a typesetter gives mom a +.FAM(ILY) directive, s/he reasonably expects that any +subsequent .FT directive will access the desired font +from the Helvetica family--without the need to state explicitly both +family and font to .FT, as it is explained one can do in +the +FAMILY +and +FT +sections of these documents. +

    +If one had, say, the fonts, Helvetica Light Roman +and Helvetica Light Italic as well as Helvetica Light Condensed +Roman and Helvetica Light Condensed Italic, the traditional +approach would require two "partial" families: HLR/HLI and +HLCDR/HLCDI. Accessing these family/font combos +routinely throughout a document would then require +changing family (with .FAM(ILY)) and selecting the +desired font (with .FT R or .FT I), or +passing .FT the lengthy family+fontname (.e.g. .FT +HLCDI). +

    +Fortunately, groff provides a mechanism whereby it's possible to +extend the basic R, I, B and BI +fonts ("styles" in groff-speak) so that one can, in +fact, create extensive type families, and access all the fonts +in them with .ft (groff) or .FT (mom). +

    +mom uses this mechanism to offer, in addition to +groff's default PostScript font styles, the following: +

    + +

    +Mom's extensions to groff's basic font styles
    +=============================================
    +
    +	L      =  Light Roman
    +	LI     =  Light Italic
    +	LCD    =  Light Condensed Roman
    +	LCDI   =  Light Condensed Italic
    +	LEX    =  Light Extended Roman
    +	LEXI   =  Light Extended Italic
    +	CD     =  Medium/Book Condensed Roman
    +	CDI    =  Medium/Book Condensed Italic
    +	EX     =  Medium/Book Extended Roman
    +	EXI    =  Medium/Book Extended Italic
    +	DB     =  DemiBold Roman
    +	DBI    =  DemiBold Italic
    +	BCD    =  Bold Condensed Roman
    +	BCDI   =  Bold Condensed Italic
    +	BEX    =  Bold Extended Roman
    +	BEXI   =  Bold Extended Italic
    +	HV     =  Heavy Roman
    +	HVI    =  Heavy Italic
    +	HVCD   =  Heavy Condensed Roman
    +	HVCDI  =  Heavy Condensed Italic
    +	HVEX   =  Heavy Extended Roman
    +	HVEXI  =  Heavy Extended Italic
    +	BL     =  Black Roman
    +	BLI    =  Black Italic
    +	BLCD   =  Black Condensed Roman
    +	BLCDI  =  Black Condensed Italic
    +	BLEX   =  Black Extended Roman
    +	BLEXI  =  Black Extended Italic
    +	UBL    =  Ultra-Black Roman
    +	UBLI   =  Ultra-Black Italic
    +
    + +Thus, with mom, if you've installed, say, some +extra Helvetica fonts and named them according to the convention FS +(where "F" means family and "S" means font +style), once having entered +

    +

    +	.FAMILY H
    +	  or
    +	.FAM H
    +
    + +you can access any of those Helvetica fonts simply by +passing the correct argument from the list above to +FT. +

    +For example, if you were working in Medium Roman (.FT R) +and you needed Medium Condensed Italic for a while (assuming it's +installed), you'd just type +

    +

    +	.FT CDI
    +
    + +to access the Medium Condensed Italic font from the Helvetica +family. +

    +Mom's list of font styles doesn't pretend to +be exhaustive, but rather tries to cover the basic weight/shape +combinations likely to be found in any reasonably complete type +family. +

    +The actual extension names are arbitrary and can be used in a +flexible manner. For example, if you create a family that has a +DemiBold font (DB) but no Bold font (B), you might find it more +convenient to give the DemiBold font the extension "B". +Equally, if the family has an ExtraBold font, you might find it more +convenient to use the extension "HV" (Heavy). + +

    +However, you may, at needs, want to add to mom's +list of font styles. You can do this by editing the file, om.tmac. +Near the top, you'll see lines of the form +

    +

    +	.sty \n[.fp] L       \" Light Roman
    +	.sty \n[.fp] LI      \" Light Italic
    +	.sty \n[.fp] LCD     \" Light Condensed Roman
    +
    + +Simply add your new font style by imitating what you see and +plugging in your new font style (having, of course, first created the +font, correctly named, in groff's PostScript font directory; see +How to create a PostScript font for use with groff). +

    +For example, if you already have some fonts from the Univers +family installed and have called the family UN, you might decide at +some point to add the Bold Outline font (UNBO). In which case, +you'd add +

    +

    +	.sty \n[.fp] BO      \" Bold Outline
    +
    + +to the .sty \n[.fp] <font style> list in om.tmac. +

    +Be careful, though, that any styles you add do not conflict +with family names that already exist. +"C", for example, conflicts with the Courier family +(CR, CI, CB, CI). Were you to create a font style "C", +thinking that .FT C would give you access to font style +once you'd given a .FAM(ILY) directive, you'd get a nasty +surprise: your type would come out in Courier Roman! +

    +VERY IMPORTANT NOTE: mom's font extensions are +not "user-space" controllable via a macro. If you've +been using groff for a long time, and have already rolled your own +solution to adding PostScript families, fonts, weights, shapes, etc. to +groff, you may find that mom's font extensions +conflict with your own scheme. Should that be the case, comment out +the .sty \n[.fp] <font style> lines found near the +top of the om.tmac file. + +

    How to create a PostScript font for use with groff

    +These instructions aren't meant to cover all possibilities, merely +to present one way of making PostScript families/fonts available to +groff and mom. +

    +GNU/Linux distributions being what they are, directory locations may +differ and the presence of some executables can't be guaranteed. +I run a Debian system. The instructions reflect that. Users of +other distros will have to interpret them according to the way their +distro operates. +

    +What you need before you start: +
    +

      +
    • groff, version 1.18 or higher +
      + (Debian package: groff) +
    • a full installation of gs and associated tools +
      + (Debian package: gs or gs-gpl) +
    • a library of gs fonts +
      + (Debian package: gsfonts) +
    • a utility for converting TrueType fonts to Type1 fonts +
      + (Debian package: ttf2pt1) +
    • a font manager +
      + (Debian packages: defoma, psfontmgr, dfontmgr) +
    • perl +
      + (Debian package: perl) +
    +
    +A reasonably complete installation of any major GNU/Linux distro +should already have these on your system, except perhaps for the +utility to convert TrueType fonts to Type1 fonts. +

    +Initial preparation (you only have to do this once): +
    +

      +
    1. If you don't already have one, create a directory in your + home directory to hold new fonts. Any directory name will do. + I use ~/Fonts, with subdirectories for Type1, TrueType and Groff + fonts. + +
    2. Locate the groff directory, site-font. The exact location is + difficult to predict, owing to differences between distros + and whether you're using a pre-packaged groff or have built + it from source. Some typical locations are +
      +
        +
      • /usr/share/groff, +
      • /usr/local/share/groff +
      • /etc/groff +
      +

      + If you can't find the site-font directory, locate + groff's site-tmac directory, and, as root, create site-font + in the same directory as the one that holds site-tmac. + E.g., if you find site-tmac in /usr/share/groff, create + site-font in /usr/share/groff. +

    3. Locate the file <prefix>/font/devps/generate/textmap + and symlink it to textmap in the directory that + contains your personal collection of PostScript fonts. (See the + Small Note, + above, for the meaning of <prefix>). On my system, + at the time of writing, <prefix> is + /usr/local/share/groff/1.19.2/, therefore, I symlink it in + ~/Fonts/Type1 with +
      +
      +ln -s /usr/local/share/groff/1.19.2/font/devps/generate/textmap textmap
      +		
      +
    4. Locate the file <prefix>/font/devps/text.enc and + symlink it to text.enc in your personal font + directory. On my system, in ~/Fonts/Type1 +
      +ln -s /usr/local/share/groff/1.19.2/font/devps/text.enc text.enc
      +		
      +
    5. Make sure you know which directory/ies holds your gs fonts. + You'll need the information later. On a Debian box, some + typical locations are +
      +
        +
      • /usr/lib/ghostscript/fonts +
      • /usr/share/ghostscript/fonts +
      • /usr/share/fonts/type1/gsfonts +
      +
    +
    +Font creation/installation: +
    +
      +
    1. Acquire the font in either Type1 (.pfb) or TrueType + (.ttf) format. +
    2. Place the font in your personal font directory; for me, + that's ~/Fonts/Type1 or ~/Fonts/TrueType. +
    3. In your personal font directory, run one of the following: +
      +
        +
      • For Type1 fonts +
        +
          +
        • getafm fontfilename.pfb | gsnd - > fontfilename.afm +
          + For Type1 fonts, this will generate something called + an .afm (Adobe Font Metrics) file, which is + required to create PostScript fonts for groff. +
        +
      • For TrueType fonts +
        +
          +
        • ttf2pt1 \-b fontfilename.ttf +
          + For TrueType fonts, this will generate a PostScript + .pfb file as well as an .afm file. +
        +
      +
    4. Still in your personal font directory, run +
      +
        +
      • afmtodit -e text.enc fontfilename.afm textmap GROFF_FONTNAME +
      +

      + Q: How do I choose a GROFF_FONTNAME? +

      + A: Start by considering the + family + to which the font belongs. If you're adding to a family that + already exists in groff's <prefix>/font/devps + directory, that will be the first part of the font name. + (See + here + for a list of families already installed, along with their groff + names.) Add to that name the appropriate weight/style extension, + listed + here. +

      + For example, if you're adding Helvetica Light Roman, your + GROFF_FONTNAME would be HL. If you're + adding Helvetica Light Italic, your GROFF_FONTNAME would be + HLI. +

      + If you're adding a font not already in groff's PostScript + families, first choose a meaningful name for the + family + to which the font belongs. The name can be anything you like. If, + for example, the family is Garamond, you could choose GARAMOND, + GARA, GD, or even just plain G as the family name. Then tack on the + appropriate style/weight extension. Thus, if you were installing + Garamond Bold Condensed Italic and had chosen GD + as the family name for Garamond, your GROFF_FONTNAME would be + GDBCDI. +

      + In mom, you can then access the Garamond + family with .FAM GD, and the Bold Condensed + Italic font wth .FT BCDI. +

      + Note: The family name need not be in upper + case, and there's no limit to the length of the name. + "Garamond", for example, could be the name you + give the Garamond family. In fact, you might find it + preferable, since a) you wouldn't have to remember how + you'd named the family, and b) should you be scanning + your + site-font directory, + something like GaramondBCDI will be more meaningful than, + say, GDBCDI. +

    5. Copy or move GROFF_FONTNAME to your + site-font directory, + or change to the site-font directory and make a symlink to + GROFF_FONTNAME in your personal directory. +
    6. Copy or move the .pfb file to the directory that + holds your gs fonts, or change to that directory and make a + symlink to the .pfb file in your personal directory. +
    7. Do whatever your system or distro requires in order to + register the new PostScript font (the .pfb file). On a + Debian system, as root, you can run dfontmgr for a + graphical interface that will take care of registering the + font. +
    +

    +Written out in full, adding fonts looks like a lot of work. It +isn't. Basically, it's just: +
    +

      +
    • acquire the font +
    • generate an .afm file for the font +
    • create the groff font +
    • put the groff font in <prefix>/font/devps +
    • make sure gs knows about the font +
    +
    +After you've done it a couple of times, it all makes sense, and is +really quite easy. Not to mention that once you understand the +process, you can write a bash script to automate the process. +Here's an example, which you can adapt to your own needs. The +script requires an argument (the .pfb filename), then prompts for +the GROFF_FONTNAME. +

    +

    +#! /bin/bash
    +
    +# A script for installing Type1 fonts.
    +#
    +# Builds .afm files from .pfb files, generates a groff font from the
    +# .afm file, makes a symlink in /usr/lib/ghostscript/font/ to the
    +# .pfb file, and a symlink in site-font to the groff font
    +
    +# .pfb filename, stripped of .pfb extension
    +FONT=`basename $1 .pfb`
    +
    +# Directory holding my personal collection of type1 fonts
    +FONTDIR="$HOME/Fonts/Type1"
    +
    +# Directory holding system ghostscript fonts
    +GS_FONTDIR="/usr/lib/ghostscript/fonts"
    +
    +# Location of site-font/devps
    +GROFF_SITE_FONTDIR="/usr/local/share/groff/site-font/devps"
    +
    +# Personal groff fonts directory
    +GROFF_FONTS="$HOME/Fonts/Groff"
    +
    +# Symlinks to textmap and text.enc
    +TEXTMAP="$FONTDIR/textmap"
    +TEXTENC="$FONTDIR/text.enc"
    +
    +if [ ! `pwd` = "$FONTDIR" ] ; then
    +    echo "Changing into $FONTDIR directory.."
    +    cd $FONTDIR
    +    sleep 1
    +else
    +	sleep 1
    +fi
    +
    +echo -n "Groff name for this font: "
    +read FONTNAME
    +sleep 1
    +
    +echo "Getting .afm.."
    +getafm $FONT.pfb | gsnd - > $FONT.afm
    +sleep 1
    +
    +echo "Creating $FONTNAME.."
    +afmtodit -e $TEXTENC $FONTDIR/$FONT.afm $TEXTMAP $FONTNAME
    +mv -i $FONTNAME $GROFF_FONTS
    +sudo ln -s $GROFF_FONTS/$FONTNAME $GROFF_SITE_FONTDIR/$FONTNAME
    +sleep 1
    +
    +echo "Linking $FONT in $GS_FONTDIR.."
    +cd $GS_FONTDIR
    +sudo ln -s $FONTDIR/$FONT.afm $FONT.afm
    +sudo ln -s $FONTDIR/$FONT.pfb $FONT.pfb
    +sleep 1
    +
    +# This next bit is Debian specific.  If you're not running a
    +# Debian system, replace it with whatever your distro requires
    +# in order to register Type1 fonts.
    +
    +if [ !`pidof -x /usr/bin/dfontmgr` ] ; then
    +    echo "I will now run dfontmgr so you can register the font."
    +    exec sudo dfontmgr &
    +else
    +    echo "You may now register the font with dfontmgr."
    +fi
    +
    +
    + + +

    Some reflections on mom

    @@ -105,8 +597,10 @@ I've ever owned have been hand-me-downs -- several generations out-of-date and "resource challenged". Disk space has always been an issue, as has processor speed and available RAM. -One of the reasons I run Linux is that it has helped enormously to -get the most out of my poor little boxes. +One of the reasons I run GNU/Linux is that it has helped enormously +to get the most out of my poor little boxes. (It has been pointed +out to me that NetBSD might be an even better choice of operating +systems for computers with limited resources.)

    In Linux-land, the choice of typesetting systems basically comes down to groff or TeX. Both are wonderful -- monumental achievements if you @@ -124,7 +618,7 @@ Owing to its very long history, it -- and its "power users" -- have remained stuck in a time warp. Most common macro packages still look as they did in those decades when memory was exorbitantly -expensive, and every byte mattered. Documentation -- not always +expensive and every byte mattered. Documentation -- not always easy to find -- is written as if all readers are computer whizzes, or at least have a university degree in one of the higher sciences.

    @@ -176,15 +670,22 @@ (subscription information available here) or contact me, Peter Schaffter, directly at -df191@ncf.ca. +peter@faustus.dyn.ca +or +ptpi@golden.net. +

    Please include the word "mom" or "groff" in the Subject: line of any message sent to my personal address, or you risk the wrath of my implacable spam filters. :)

    +If you want to visit mom's homepage, you'll find +it +here. +


    Next   -Prev   +Prev   Top   Back to Table of Contents diff -ruN groff-1.19.1/contrib/mom/momdoc/color.html groff-1.19.2/contrib/mom/momdoc/color.html --- groff-1.19.1/contrib/mom/momdoc/color.html 2004-03-22 07:16:36.000000000 +0100 +++ groff-1.19.2/contrib/mom/momdoc/color.html 2005-08-07 09:59:33.000000000 +0200 @@ -1,3 +1,4 @@ + @@ -27,7 +28,7 @@ Mom's support for coloured text is straightforward. You begin by telling mom about the colours you want -to with +with NEWCOLOR or XCOLOR. @@ -103,7 +104,7 @@
  • NEWCOLOR
  • XCOLOR
  • COLOR -
  • \*[<colorname> inline escape +
  • \*[<colorname>] inline escape

@@ -112,7 +113,7 @@


Creating (initializing) a colour with NEWCOLOR


-Macro: NEWCOLOR <colour name> [<colour scheme>] <colour components> +
Macro: NEWCOLOR <colour name> [<colour scheme>] <colour components>

NEWCOLOR lets you create a colour, rather like an @@ -193,7 +194,7 @@


Initializing a colour with XCOLOR


-Macro: XCOLOR <X color name> [<alias>] +Macro: XCOLOR <X color name> [<alias>]
*<X color name> must be all one word, all lower case.
@@ -289,9 +290,9 @@

Invoking a color


-Macro: COLOR <colorname> +Macro: COLOR <colorname>
-
Inline: \*[<colorname> +Inline: \*[<colorname>]

Once you've told mom about a colour (via diff -ruN groff-1.19.1/contrib/mom/momdoc/cover.html groff-1.19.2/contrib/mom/momdoc/cover.html --- groff-1.19.1/contrib/mom/momdoc/cover.html 2004-02-22 10:17:08.000000000 +0100 +++ groff-1.19.2/contrib/mom/momdoc/cover.html 2005-08-07 09:59:33.000000000 +0200 @@ -1,3 +1,4 @@ + @@ -7,42 +8,503 @@ -Next   +Next   Prev   Back to Table of Contents

- - -

CREATING A COVER PAGE

+ +

CREATING A COVER PAGE

+ + +

Introduction to cover pages

+

+As of version 1.19 of mom, you can now have cover +pages generated automatically. +

+Though identical in treatment, mom provides two +kinds of cover pages: section cover pages (which I shall refer to +simply as "cover pages") and document cover pages +("doc covers"). +

+A document cover page +(doc cover) +is what you'd most likely use at the start of a collated document, where +you might want the name of the complete document, the author(s) and +the copyright line to appear. Another place you might use a doc +cover is for a novel, where you want the title of the novel, not +the chapter title or chapter number, as the first cover page. +

+A section +cover +page is what you'd use for cover pages that separate sections of a +collated document. A section cover page (but not a doc cover page) +in a collated document could, for example, simply read "PART +I". +

+In non-collated documents (say, an essay) you can use either a +section cover or a doc cover to generate a cover sheet. +

+In addition, nothing prevents you from generating both a doc cover +page and a section cover page for every document in a collated +document. Or you can selectively disable the automatic generation +of either doc covers or section covers in a collated document, +on-the-fly. +

+Important note: +automatic generation of cover or doc cover pages after the first +one(s) only takes place if you are working with collated documents. +Mom provides no mechanism for saying "print +a section cover here even though I'm still working on the same +(non-collated) document." + +

Description of what mom does on cover pages

+ +By default, mom typesets cover (and doc cover) +pages identically to +docheaders +(see +How to change the look of docheaders +for a description of what a docheader looks like). The only +differences are +
+
    +
  • the position on the page where the information is output +
  • the (optional) addition of copyright and miscellaneous + information +
  • there's no running text underneath +
+

-At present, mom provides no mechanism for -automatically generating cover pages. It's a situation not likely -to change, given that what's needed on document covers changes from -document to document, both in terms of style and content. And, -more often than not, what goes on covers is matter of personal taste. -

-If you want a document to begin with a cover page, typeset the cover -(using the -typesetting macros). -At the end, invoke +You tell mom what you want to appear on the cover +pages through the arguments you pass to +COVER +and/or +DOC_COVER. +Provided you have already given mom the +appropriate references macro (e.g. +TITLE +or +AUTHOR), +she will output cover (and doc cover) pages identically to how she +would output docheaders containing the same information. +

+By default, mom starts cover (and doc cover) pages +one-third of the way down the page. This can be changed through +the use of the control macros +COVER_ADVANCE/DOC_COVER_ADVANCE. +

+If you request copyright information (and have already given +mom the reference macro, +COPYRIGHT), +she sets it, by default, in a smaller +point size +in the bottom right hand corner of the cover (or doc cover) page. +The default point size and the position can be controlled +with +COVER_COPYRIGHT_SIZE/DOC_COVER_COPYRIGHT_SIZE +and +COVER_COPYRIGHT_QUAD/DOC_COVER_COPYRIGHT_QUAD. +

+Similarly, if you request miscellaneous information (and have already given +mom the reference macro, +MISC), +she sets it, by default, in a smaller point size in the bottom left +hand corner of the cover (or doc cover) page. The default point +size is dependent on +COVER_COPYRIGHT_SIZE/DOC_COVER_COPYRIGHT_SIZE, +but the position can be controlled with +COVER_MISC_QUAD/DOC_COVER_MISC_QUAD. + + +

+NOTE: mom does not set any +headers +or +footers +on cover pages. Neither does she set any page numbers. From the +point of pagination, cover (and doc cover) pages are considered +"null" pages; if you wish them to be included in the +pagination scheme (even though no page numbers appear), you must +set the page number of each first page following a +COLLATE +manually with +PAGENUMBER. + + +

+Finally, if you want to design your own cover page(s), you can +always typeset them (using the +typesetting macros), +invoke NEWPAGE, -then set up your document in full (see +set up your document in full (see Tutorial -- Setting up a mom document), -invoking -START -as usual once you're done. The cover page (and any typesetting -commands on it) will have no effect on mom's -processing of the document itself, the first page of which, moreover, -will be numbered "1" unless you instruct her otherwise -with +and lastly invoke +START. +The cover page (and any typesetting commands on it) will have no +effect on mom's processing of the document itself, +the first page of which, moreover, will be numbered "1" +unless you instruct her otherwise with PAGENUMBER. +

+ + + +


+

+ + Macro: COVER +
+ Macro: DOC_COVER +
+ Required argument: TITLE | DOCTITLE | COVERTITLE | CHAPTER | CHAPTER_TITLE | CHAPTER+TITLE +
+ Optional arguments: [ SUBTITLE AUTHOR DOCTYPE COPYRIGHT MISC ] +

+ *Note: these macros should be placed in the + "style-sheet" section of your document setup (see the + Tutorial -- Setting up a mom document), + i.e. after PRINTSTYLE (and/or DOCTYPE and/or COPYSTYLE), but + before START. + + +

+COVER and DOC_COVER behave +identically. The reason mom provides two macros +for automatic cover page generation is so that you can have two +different kinds of covers with different information on each. +

+Imagine, for a moment, you've written a document comprised of three +sections. When you +COLLATE +the document for output, you could use DOC_COVER +to generate a cover page that contained the name of the entire +document, your (the author's) name, and perhaps the copyright date. +Subsequently, you could use COVER, after each +COLLATE but before each +START, +to generate a cover page (or cover "sheet", if you prefer) +containing just the name of the section. +
+ +

The required argument

+ +Both COVER and DOC_COVER, whenever +invoked, require a first argument, as listed above. This first argument +will become the first bit of information mom +prints on the cover (or doc cover) page (i.e. it will be the +"title"). +

+In order for the information to appear, you must, of course, first +have given mom the appropriate +reference macro. +A list of arguments with their equivalent reference macros follows. +
+ +

+
TITLE +
-means the argument you gave to +TITLE +
DOCTITLE +
-means the argument you gave to +DOCTITLE +
COVERTITLE +
-means the argument you gave to +COVERTITLE +or +DOC_COVERTITLE +
CHAPTER, CHAPTER_TITLE, CHAPTER+TITLE +
-see below (How the CHAPTER argument and friends work) +
+
+ +

How the CHAPTER argument and friends work

+ +CHAPTER, by itself, will print the CHAPTER_STRING as well +as the chapter number that you gave to +CHAPTER. +For example, assuming a vanilla setup for your chapter +

+

+	\# Reference macros
+	.CHAPTER 1
+	.CHAPTER_TITLE "The Bonny Blue Yonder"
+	<other stuff>
+	.COVER CHAPTER \" (or .DOC_COVER CHAPTER)
+	.START
+
+ +will simply print +

+

+	Chapter 1
+
+ +CHAPTER_TITLE will print the chapter title you +gave to +CHAPTER_TITLE. +For example, assuming a vanilla setup for your chapter +

+

+	\# Reference macros
+	.CHAPTER 1
+	.CHAPTER_TITLE "The Bonny Blue Yonder"
+	<other stuff>
+	.COVER CHAPTER_TITLE \" (or .DOC_COVER CHAPTER_TITLE)
+	.START
+
+ +will simply print +

+

+	The Bonny Blue Yonder
+
+ +

+CHAPTER+TITLE will print both the +chapter string + number AND the chapter title. For example, +assuming a vanilla setup for your chapter +

+

+	\# Reference macros
+	.CHAPTER 1
+	.CHAPTER_TITLE "The Bonny Blue Yonder"
+	<other stuff>
+	.COVER CHAPTER+TITLE \" (or .DOC_COVER CHAPTER+TITLE)
+	.START
+
+ +will print +

+

+	      Chapter 1
+	The Bonny Blue Yonder
+
+ +

The optional arguments

+ +The remainder of the arguments to COVER and +DOC_COVER are optional. They refer specifically +to the information you gave the +reference macros +bearing the same name as the arguments. +

+You may enter as many or as few as you would like to see on your +cover (or doc cover) page. The only hitch is--PAY ATTENTION, +CLASS!--they must be entered in the order given above. For +example, if you want TITLE, AUTHOR, +COPYRIGHT and MISC +

+

+	.COVER TITLE AUTHOR COPYRIGHT MISC
+
+ +is correct, while +

+

+	.COVER TITLE AUTHOR MISC COPYRIGHT
+
+ +is not. +
+ +

What the DOCTYPE argument means

+ +When you pass COVER or DOC_COVER +the argument, DOCTYPE, it refers to the argument you +gave to +DOCTYPE NAMED. +For example, if, in your +docstyle macros +you gave a +

+

+	.DOCTYPE NAMED "Abstract"
+
+ +the argument, DOCTYPE, in the COVER or +DOC_COVER macros, would mean that you wanted the +word, Abstract, to appear on the cover (or doc cover), just as it +would in the +docheader. +
+ + + +
+

+ + Macro: COVERS <toggle> +
+ Macro: DOC_COVERS <toggle> + +

+By default, if you give mom a +COVER +or +DOC_COVER +macro, she will print it. In a document that contains sections, +articles or chapters formerly treated as "one-off's" but +now being +collated, +such behaviour may not be desirable. +

+Mom lets you selectively enable or disable the +generation of covers and/or doc covers with the toggle macros +COVERS and DOC_COVERS. Because +they're toggle macros, simply invoking them by themselves enables +automatic cover (or doc cover) generation, while invoking them +with any argument at all (OFF, QUIT, X, etc) +disables cover (or doc cover) generation. +

+NOTE: You must place these macros prior to any +instance of +START. Since they're +"on" by default, there's no need to use them if you want +covers. However, if you don't, especially in the kind of scenario +described above, the best place to put them (most likely with an +OFF, NO, X, etc. argument), is immediately after the +first invocation of START. By doing so, you ensure +they precede all subsequent instances of START. +

+ +


+

+

Control macros--changing the defaults for covers and document covers

+The default typographic appearance of the items on a cover (or doc +cover) page is identical to that of the items in a +docheader. +(See +How to change the look of docheaders +for a description of the defaults.) +

+COPYRIGHT +and +MISC, +which do not appear in docheaders, have the following default +characteristics: +
+

    +
  1. The copyright line is set in the bottom right hand corner + of the page, 2 + point sizes + smaller than the size of + running text +
  2. The "misc" line is set in the bottom left hand + corner of the page, in the same family, font and point size + as the copyright line. +
+

+With the exception of the copyright and "misc" lines, the +defaults for the entirety of cover (and doc cover) pages, and all +the elements thereon, can be changed with control macros whose +behaviour and arguments are identical to +the control macros used for docheaders. +The only difference is the name by which you invoke the control +macro(s). +

+The complete list of cover (and doc cover) page control macros +follows; please refer to the +docheader control macros index +in order to understand how to use them. +

+

Index of cover and doc cover control macros

+
+.COVER_ADVANCE  .DOC_COVER_ADVANCE -+
+.COVER_FAMILY   .DOC_COVER_FAMILY   | like DOCHEADER_
+.COVER_LEAD     .DOC_COVER_LEAD    -+
+
+.COVER_TITLE_FAMILY  .DOC_COVER_TITLE_FAMILY -+
+.COVER_TITLE_FONT    .DOC_COVER_TITLE_FONT    | like
+.COVER_TITLE_COLOR   .DOC_COVER_TITLE_COLOR   | TITLE_
+.COVER_TITLE_SIZE    .DOC_COVER_TITLE_SIZE   -+
+
+.COVER_CHAPTER_TITLE_FAMILY  .DOC_COVER_CHAPTER_TITLE_FAMILY -+
+.COVER_CHAPTER_TITLE_FONT    .DOC_COVER_CHAPTER_TITLE_FONT    | like
+.COVER_CHAPTER_TITLE_COLOR   .DOC_COVER_CHAPTER_TITLE_COLOR   | CHAPTER_TITLE_
+.COVER_CHAPTER_TITLE_SIZE    .DOC_COVER_CHAPTER_TITLE_SIZE   -+
+
+.COVER_SUBTITLE_FAMILY  .DOC_COVER_SUBTITLE_FAMILY -+
+.COVER_SUBTITLE_FONT    .DOC_COVER_SUBTITLE_FONT    | like
+.COVER_SUBTITLE_COLOR   .DOC_COVER_SUBTITLE_COLOR   | SUBTITLE_
+.COVER_SUBTITLE_SIZE    .DOC_COVER_AUTHOR_SIZE     -+
+
+.COVER_ATTRIBUTE_COLOR  .DOC_COVER_ATTRIBUTE_COLOR - like ATTRIBUTE_COLOR
+ - the macro, .ATTRIBUTE_STRING, controls the attribution string
+   for both docheaders and cover pages; cover pages have no
+   separate ATTRIBUTE_STRING macro
+
+.COVER_AUTHOR_FAMILY  .DOC_COVER_AUTHOR_FAMILY -+
+.COVER_AUTHOR_FONT    .DOC_COVER_AUTHOR_FONT    | like
+.COVER_AUTHOR_COLOR   .DOC_COVER_AUTHOR_COLOR   | AUTHOR_
+.COVER_AUTHOR_SIZE    .DOC_COVER_AUTHOR_SIZE   -+
+
+.COVER_DOCTYPE_FAMILY  .DOC_COVER_DOCTYPE_FAMILY -+
+.COVER_DOCTYPE_FONT    .DOC_COVER_DOCTYPE_FONT    | like
+.COVER_DOCTYPE_COLOR   .DOC_COVER_DOCTYPE_COLOR   | DOCTYPE_
+.COVER_DOCTYPE_SIZE    .DOC_COVER_DOCTYPE_SIZE   -+
+
+.COVER_COPYRIGHT_FAMILY  .DOC_COVER_COPYRIGHT_FAMILY -+
+.COVER_COPYRIGHT_FONT    .DOC_COVER_COPYRIGHT_FONT    | like any
+.COVER_COPYRIGHT_COLOR   .DOC_COVER_COPYRIGHT_COLOR   | of the above
+.COVER_COPYRIGHT_SIZE    .DOC_COVER_COPYRIGHT_SIZE   -+
+.COVER_COPYRIGHT_QUAD    .DOC_COVER_COPYRIGHT_QUAD
+ - the copyright quad can be either L (left) or R (right); default is left
+
+.COVER_MISC_COLOR  .DOC_COVER_MISC_COLOR - like any of the above _COLOR
+.COVER_MISC_QUAD   .DOC_COVER_MISC_QUAD
+ - the misc quad can be either L (left) or R (right); default is right
+
+ +Note: COVER_MISC and +DOC_COVER_MISC have only two control macros, +_COLOR and _QUAD. The +family, font and size of the MISC argument to +COVER or DOC_COVER are always the +same as for COPYRIGHT. Should you wish the family, font +or size to be different from COPYRIGHT, I suggest setting +the type specs for COPYRIGHT to the ones you want for +MISC, then altering them for COPYRIGHT using +inline escapes +in the +string argument +you pass to the macro, +COPYRIGHT. (Of course, +you could always do the reverse, but if you pass several arguments +to +MISC, +it's more likely you want to get MISC right first.)


-Next   +Next   Prev   Top   Back to Table of Contents diff -ruN groff-1.19.1/contrib/mom/momdoc/definitions.html groff-1.19.2/contrib/mom/momdoc/definitions.html --- groff-1.19.1/contrib/mom/momdoc/definitions.html 2004-02-22 10:17:08.000000000 +0100 +++ groff-1.19.2/contrib/mom/momdoc/definitions.html 2004-09-13 17:56:13.000000000 +0200 @@ -1,3 +1,4 @@ + @@ -26,8 +27,7 @@ throughout this documentation, as well as a few terms that apply to mom herself. To make life easier, I'll explain them here. Refer back to this section should you encounter a word -or concept you're not familiar with. Words in these definitions that -are defined elsewhere in this section are marked with asterisks. +or concept you're not familiar with.


@@ -61,14 +61,16 @@
  • Point Size
  • Quad
  • Rag +
  • Shape
  • Solid/set solid
  • Track kerning/Line kerning
  • Unbreakable space +
  • Weight
  • Word space
  • x-height -
    +
    Ascender
    The portion of a letter that extends above the bowl. For example, the letters a, c, and e have no ascenders. The letters b, d, and h @@ -79,8 +81,9 @@ bowls of lower case letters rest.
    Ballot box -
    An unfilled square, usually *cap-height in size, -typically placed beside items in a checklist. +
    An unfilled square, usually +cap-height +in size, typically placed beside items in a checklist.
    Bullet
    A small, filled circle typically found beside items or points in @@ -88,12 +91,14 @@
    Cap-height
    The height of the tallest capital letter in a given -*font at the current *point -size. +font +at the current +point size.
    Descender
    The portion of a letter that extends beneath the -*baseline (j, q, y are letters with descenders). +baseline +(j, q, y are letters with descenders).
    Discretionary hyphen
    A symbol inserted between two syllables of a word that indicates to a @@ -122,24 +127,29 @@
    Em/en
    An em is a relative measurement equal to the width of the -letter M at a given *point size in a given -*font. Since most Ms are designed square, an em is -usually (but sometimes erroneously) considered to be the same size -as the current point size (i.e. if the point size of the type is 12, -one em equals 12 points). An en is equal to the width of a letter -N (historically 2/3 of an em, although groff treats an en as 1/2 of -an em). Typically, ems and ens are used to measure indents, or to -define the length of dashes (long hyphens). +letter M at a given +point size +in a given +font. +Since most Ms are designed square, an em is usually (but sometimes +erroneously) considered to be the same size as the current point +size (i.e. if the point size of the type is 12, one em equals 12 +points). An en is equal to the width of a letter N (historically +2/3 of an em, although groff treats an en as 1/2 of an em). +Typically, ems and ens are used to measure indents, or to define the +length of dashes (long hyphens).
    Family
    The collective name by which a collection of -*fonts are known, e.g. Helvetica, Times Roman, -Garamond. +fonts +are known, e.g. Helvetica, Times Roman, Garamond.
    Figure space/Digit space -
    A *fixed width space that has the width of one digit. Used for -aligning numerals in, say, columns or numbered lists. In groff, -the figure space is entered with +
    A +fixed width space +that has the width of one digit. Used for aligning numerals in, +say, columns or numbered lists. In groff, the figure space is +entered with

     	\0
    @@ -148,9 +158,11 @@
     (backslash followed by a zero).
     
     
    Fixed width space -
    Equal to *word space, but does not expand or -contract when text is *justified. In groff, fixed -width space is entered with +
    Equal to +word space, +but does not expand or contract when text is +justified. +In groff, fixed width space is entered with

     	\<space>
    @@ -159,17 +171,25 @@
     where <space> means "hit the spacebar on your keyboard."
     
     
    Font -
    The specific style of type within a *family, -e.g. roman, italic. Groff understands four fonts within any given -family: roman, italic, bold, and bold italic. +
    The specific +weight +and +shape +of type within a +family, +e.g. light, medium, bold (which are weights), and roman, italic, +condensed (which are shapes). By default, groff knows of four fonts +within its default set of families: R (medium roman), I (medium +italic), B (bold roman) and BI (bold italic).
    Force justify -
    Sometimes, in *justified text, a line needs to be -broken short of the right margin. Force justifying means telling a -typesetting program (like groff) that you want the line broken early -AND that you want the line's word spacing stretched to force the line -flush with the right margin. +
    Sometimes, in +justified +text, a line needs to be broken short of the right margin. Force +justifying means telling a typesetting program (like groff) that you +want the line broken early AND that you want the line's word spacing +stretched to force the line flush with the right margin.
    Gutter
    The vertical whitespace separating columns of type. @@ -179,7 +199,8 @@ right margins. Justification is the act of making both margins flush. Some people use the terms "left justified" and "right justified" to mean type where only the left (or right) margins align. I don't. -See *quad. +See +quad.
    Kerning
    Moving pairs of letters closer together to remove excess @@ -195,31 +216,37 @@
    Kern Units
    A relative distance equal to 1/36 of the current -*point size. Used between individual letters -for *kerning. Different typesetting systems use -different values (1/54 is popular), and sometimes call kern units by -a different name. +point size. +Used between individual letters +for +kerning. +Different typesetting systems use different values (1/54 is +popular), and sometimes call kern units by a different name.

    Experts:
    A kern unit has nothing to do with groff machine units.

    Lead/leading -
    The distance from the *baseline of one line of -type to the line of type immediately beneath it. Pronounced "ledding." -Also called line spacing. Usually measured in *points. +
    The distance from the +baseline +of one line of type to the line of type immediately beneath it. +Pronounced "ledding." Also called line spacing. Usually measured +in +points.

    In case you're interested... In previous centuries, -lines of type were separated by thin strips of -- you guessed it --- lead. Lines of type that had no lead between them were said to +lines of type were separated by thin strips of--you guessed +it--lead. Lines of type that had no lead between them were said to be "set solid." Once you began separating them with strips of lead, they were said to be "leaded", and the spacing was -expressed in terms of the number of *points of lead. -For this reason, "leading" and "line spacing" -aren't, historically speaking, synonymous. If type was set 10 on 12, -for example, the leading was 2 points, not 12. Nowadays, however, -the two terms are used interchangeably to mean the distance from -baseline to baseline. +expressed in terms of the number of +points +of lead. For this reason, "leading" and "line +spacing" aren't, historically speaking, synonymous. If type +was set 10 on 12, for example, the leading was 2 points, not 12. +Nowadays, however, the two terms are used interchangeably to mean +the distance from baseline to baseline.

    Leaders
    Single characters used to fill lines, usually to their end. @@ -247,10 +274,13 @@ typographers have always used their own system of measurement for type.
    Point Size -
    The nominal size of type, measured in *points, -from the bottom of the longest *descender to the top -of the highest *ascender. In reality, type is always -fractionally smaller than its point size. +
    The nominal size of type, measured in +points +from the bottom of the longest +descender +to the top of the highest +ascender. +In reality, type is always fractionally smaller than its point size.
    Quad
    When only one margin of type is flush, lines of type are quadded in @@ -264,12 +294,40 @@
    Describes a margin that isn't flush. Rag right means the right margin isn't flush. Rag left means the left margin isn't flush. The expression "flush left/rag right" is sometimes used to describe -type that is *quadded left. +type that is +quadded +left. + +
    Shape +
    The degree of slant and/or the width of characters. +(Technically speaking, this is not a proper typesetting term; +however, it may help clarify some concepts presented in these +documents.) +

    +Some typical shapes are: +

      +
    • "Roman", which has no slant, and has letterforms of + average width +
    • "Italic", which is slanted, and has letterforms + of average width +
    • "Condensed", which has no slant, but has + letterforms narrower than the average represented by Roman +
    • "Condensed Italic", which is slanted, with letterforms narrower + than average +
    +The term +font, +as it is used in these documents, refers to a combination of +weight +and shape.
    Solid/set solid -
    When no *lead is added between lines of type -(i.e. the *point size and linespacing are the -same), the lines are said to be "set solid." +
    When no +lead +is added between lines of type (i.e. the +point size +and linespacing are the same), the lines are said to be "set +solid."
    Track kerning/Line kerning
    Sometimes, it's advantageous to increase or decrease the amount of @@ -279,11 +337,13 @@ (and sometimes, just "kerning") have come to mean the same thing.
    Unbreakable space -
    Equal to *word space, however words separated by -an unbreakable space will always be kept together on the same line. -Expands and contracts like word space. Useful for proper names, which -one should, whenever possibly, avoid splitting onto two lines. In -groff, unbreakable space is entered with +
    Equal to +word space, +however words separated by an unbreakable space will always be kept +together on the same line. Expands and contracts like word space. +Useful for proper names, which one should, whenever possible, avoid +splitting onto two lines. In groff, unbreakable space is entered +with

     	\~
    @@ -291,10 +351,19 @@
     
     (backslash followed by a tilde).
     
    +
    Weight +
    The thickness of the strokes of letterforms. Medium and Book +have average thicknesses and are the weights used for most of the +text in books, magazines, newspapers, etc. Light has strokes +slightly thinner than Medium or Book, but is still acceptable for +most text. Semibold, Bold, Heavy and Black all have strokes of +increasing thickness, making them suitable for heads, subheads, +headlines and the like. +
    Word space
    The amount of whitespace between words. When text is -*justified, word space expands or contracts to make -the margins flush. +justified, +word space expands or contracts to make the margins flush.
    x-height
    The height of a lower case letter x in a given font at a given @@ -328,20 +397,23 @@
    Alias -
    A *macro invoked by a name different from its -"official" name. For example, the official name of the -macro to change *family is FAMILY. -Its alias is FAM. Aliases may be created for any -macro (via the +
    A +macro +invoked by a name different from its "official" +name. For example, the official name of the macro to change +family +is FAMILY. Its alias is +FAM. Aliases may be created for any macro (via the ALIAS macro) provided the alias uses a name not already taken by the mom macros or one of the groff -*primitives. For a complete list of alias names -you must not use, see the +primitives. +For a complete list of words or names you must not use, see the list of reserved words.
    Arguments -
    Parameters or information needed by a *macro +
    Parameters or information needed by a +macro to do its job. For example, in the macro

    @@ -358,32 +430,42 @@
     Some macros require several arguments; each is separated by a space.
     
     
    Comment Lines -
    *Input lines introduced with the comment character +
    Input lines +introduced with the comment character

     	\#
     
    -When processing output, groff silently ignores everything on the -line after the comment character. +When processing output, groff silently ignores everything on a +line that begins with the comment character.
    Control Lines
    Instructions to groff that appear on a line by themselves, which means that "control lines" are either -*macros or *groff primitives. +macros +or groff +primitives. Control lines begin with a period or, occasionally, an apostrophe.
    Filled lines/fill mode -
    Automatic *justification or -*quadding. In fill mode, the ends of lines as they -appear in your text editor are ignored. Instead, words from adjoining -*input lines are added one at a time to the output -line until no more words fit. Then, depending whether text is to -be *justified or *quadded (left, -right, or centre), and depending on whether automatic hyphenation -is turned on, groff attempts to hyphenate the last word, or, barring -that, spreads and breaks the line (when justification is turned on) or -breaks and quads the line (when quadding is turned on). +
    Automatic +justification +or +quadding. +In fill mode, the ends of lines as they appear in your text editor +are ignored. Instead, words from adjoining +input lines +are added one at a time to the output line until no more words fit. +Then, depending whether text is to be +justified +or +quadded +(left, right, or centre), and depending on whether automatic +hyphenation is turned on, groff attempts to hyphenate the last word, +or, barring that, spreads and breaks the line (when justification +is turned on) or breaks and quads the line (when quadding is turned +on).

    Nofill mode (non-filled text) means that groff respects the ends @@ -391,25 +473,30 @@

    Inline escapes
    Instructions issued to groff that appear as part of an -*input line (as opposed to *macros, -which must appear on a line by themselves). Inline escapes are always -introduced by the backslash character. For example, +input line +(as opposed to +macros, +which must appear on a line by themselves). Inline escapes are +always introduced by the backslash character. For example,

     	A line of text with the word T\*[BU 2]oronto in it
     
    contains the inline escape \*[BU 2] (which means "move the letter -'o' 2 *kern units closer to the letter 'T'"). +'o' 2 +kern units +closer to the letter 'T'").

    Mom's inline escapes always take the form \*[ESCAPE], where ESCAPE is composed of capital letters, sometimes followed immediately -by a digit, sometimes followed by a space and a *numeric -argument. Groff's escapes begin with the -backslash character but typically have no star and are in lower case. -For example, the mom escapes to move forward 6 points -on a line are either +by a digit, sometimes followed by a space and a +numeric argument. +Groff's escapes begin with the backslash character +but typically have no star and are in lower case. For example, the +mom escapes to move forward 6 points on a line are +either

     	\*[FP6]  or  \*[FWD 6p]
    @@ -428,20 +515,26 @@
     
    Instructions embedded in a document that determine how groff processes the text for output. mom's macros always begin with a period, on a line by themselves, and must be typed in capital letters. -Typically, macros contain complex commands issued to groff -- behind -the scenes -- via groff *primitives. +Typically, macros contain complex commands issued to groff--behind +the scenes--via groff +primitives.
    Machine units -
    A machine unit is 1/1000 of a *point when the -groff device is ps. ("ps" means "PostScript" -- -the default device for which groff prepares output, and the device for -which mom was specifically designed.) +
    A machine unit is 1/1000 of a +point +when the groff device is ps. ("ps" means +"PostScript"--the default device for which groff +prepares output, and the device for which mom was +specifically designed.)
    Numeric argument -
    An *argument that has the form of a digit. -Numeric arguments can be built out of arithmetic expressions using -+, -, *, and / for plus, minus, times, and divided-by respectively. -If a numeric argument requires a *unit of measure, +
    An +argument +that has the form of a digit. Numeric arguments can be built out +of arithmetic expressions using +, -, *, and / for plus, minus, +times, and divided-by respectively. If a numeric argument requires +a +unit of measure, a unit of measure must be appended to every digit in the argument. For example:

    @@ -463,9 +556,12 @@ native command language, and out of which macros are built.

    String Argument -
    Technically, any *argument that is not numeric. -In this documentation, string argument means an argument that requires -the user to input text. For example, in the *macro +
    Technically, any +argument +that is not numeric. In this documentation, string argument means +an argument that requires the user to input text. For example, in +the +macro

     	.TITLE "My Pulitzer Novel"
    @@ -475,13 +571,14 @@
     

    Because string arguments must be enclosed by double-quotes, you can't use double-quotes as part of the string argument. If you need -double-quotes to be part of a string argument, use the *inline -escapes \(lq and \(rq -(leftquote and rightquote respectively) in place of the double-quote -character ("). +double-quotes to be part of a string argument, use the +inline escapes +\(lq and \(rq (leftquote and rightquote +respectively) in place of the double-quote character (").

    Unit of measure -
    The single letter after a *numeric argument +
    The single letter after a +numeric argument that tells mom what measurement scale the argument should use. Common valid units are:

    @@ -512,7 +609,8 @@ measure. mom's macros do not have default units of measure. There are a couple of exceptions, the most notable of which are PT_SIZE and LS. Both use -*points as the default unit of measure, which means +points +as the default unit of measure, which means you don't have to append "p" to their argument.

    You can enter decimal values for any unit of measure. Different units @@ -525,10 +623,15 @@ enter the measure as 12P+5p.

    Zero-width character -
    The *inline escape that allows you to print a -literal period, apostrophe and, if *output lines -are *filled, a space that falls at the beginning of -an *input line. It looks like this: +
    The +inline escape +that allows you to print a literal period, apostrophe and, if +output lines +are +filled, +a space that falls at the beginning of an +input line. +It looks like this:

     	\&
    @@ -537,11 +640,12 @@
     (backslash followed by an ampersand).
     

    Normally, groff interprets a period (or an apostrophe) at the beginning -of an input line as meaning that what follows is a *control -line. In fill modes, groff treats a space at the beginning -of an input line as meaning "start a new line and put a space -at the beginning of it." If you want groff to interpret periods -and apostrophes at the beginning of input lines literally (i.e. print +of an input line as meaning that what follows is a +control line. +In fill modes, groff treats a space at the beginning of an input +line as meaning "start a new line and put a space at the +beginning of it." If you want groff to interpret periods and +apostrophes at the beginning of input lines literally (i.e. print them), or spaces at the beginning of input lines as just garden variety word spaces, you must start the line with the zero-width character. @@ -570,16 +674,19 @@

    Blockquote -
    Cited material other than *quotes. +
    Cited material other than +quotes. Typically set at a smaller point size than paragraph text, indented from the left and right margins. Blockquotes are -*filled. +filled.
    Control macro
    Macros used in document processing to control/alter the appearance of document elements (e.g. heads, -quotes, footnotes, *headers, etc.). +quotes, footnotes, +headers, +etc.).
    Document header/docheader
    Document information (title, subtitle, author, etc) output @@ -593,7 +700,7 @@
    Document information (frequently author and title) output in the bottom margin of pages after page one. Not to be confused with footnotes, which are considered part of -*running text. +running text.
    Head
    A title that introduces a major section of a document. @@ -603,20 +710,23 @@ the top margin of pages after page one.

    NOTE: In terms of content and style, headers and -*footers are the same; they differ only in their -placement on the page. In most places in this documentation, -references to the content or style of headers applies equally to -footers. +footers +are the same; they differ only in their placement on the page. In +most places in this documentation, references to the content or +style of headers applies equally to footers.

    Linebreak/author linebreak -
    A horizontal gap in *running text, frequently -set off by typographic symbols such as asterisks or daggers. Used to -indicate a shift in the content of a document (e.g. a scene change in a -short story). Also commonly called a scene break. +
    A horizontal gap in +running text, +frequently set off by typographic symbols such as asterisks or +daggers. Used to indicate a shift in the content of a document +(e.g. a scene change in a short story). Also commonly called a +scene break or a section break.
    Paragraph head
    A title joined to the body of a paragraph; hierarchically one -level beneath *subheads. +level beneath +subheads.
    Quote
    A quote, to mom, is a line-for-line setting @@ -628,14 +738,16 @@
    Running text
    In a document formatted with mom, running text means text that forms the body of the document, including -elements such as heads and subheads. *Docheaders, -*headers, *footers and page numbers are NOT part of -running text. +elements such as heads and subheads. +Docheaders, +headers, +footers +and page numbers are NOT part of running text.
    Subhead
    A title used to introduce secondary sections of a document; hierarchically one level beneath sections introduced by -*heads. +heads.
    Toggle
    A macro or tag that, when invoked without an argument, diff -ruN groff-1.19.1/contrib/mom/momdoc/docelement.html groff-1.19.2/contrib/mom/momdoc/docelement.html --- groff-1.19.1/contrib/mom/momdoc/docelement.html 2004-03-22 07:18:36.000000000 +0100 +++ groff-1.19.2/contrib/mom/momdoc/docelement.html 2005-08-07 09:59:33.000000000 +0200 @@ -1,3 +1,4 @@ + @@ -61,10 +62,10 @@

    The control macros for document processing tags let you "design" the look of all the parts of your documents -- -should you wish. At a bare minimum, all tags have macros to -change mom's defaults for family, font -and point size. Where appropriate, there are macros to control -leading, indents and quad as well. +should you wish. At a bare minimum, all tags have macros to change +mom's defaults for family, font, point size and +colour. Where appropriate, there are macros to control leading, +indents and quad as well.

    In addition, many tags have special macros to control features that are pertinent to those tags alone. Have a look at the section dealing @@ -220,7 +221,7 @@

  • PARAHEAD
  • Parahead control -
  • Linebreaks (author linebreaks) +
  • Linebreaks (author linebreaks, section breaks)
  • List control +
  • Line numbering +
  • Footnotes -
  • Document termination -
  • Endnotes +
  • Margin notes +
      +
    • MN_INIT -- initialize margin notes +
    • MN -- start and end a margin note +
    +
  • Bibliographies and references + +
  • Blank pages
  • Table of contents -
  • Blank page +
  • Document termination + +
    @@ -298,7 +318,7 @@

    - Macro: EPIGRAPH <toggle> | [ BLOCK ] + Macro: EPIGRAPH <toggle> | [ BLOCK ]

    @@ -703,7 +723,27 @@ it any argument (OFF, QUIT, Q, X...) cancels its effect, meaning that paragraphs will once again NOT be separated by a blank line. - +

    +NOTE: If PARA_SPACE is on, +mom spaces only those paragraphs that come after +an "initial" paragraph. Initial paragraphs are those +that come immediately after the +docheader, +epigraphs, +heads, +subheads +and +linebreaks. +(The first paragraph after these document elements requires no +blank line to separate it from other paragraphs.) +

    +Sometimes, you can be fairly deep into a document before using +.PP for the first time, and when you do, because +mom is still waiting for that "initial" +paragraph, she doesn't space it with a blank line, even though +you expect her to. The simple workaround for this is to invoke +.PP twice (in succession) at the point you +expect the blank line to appear.


    @@ -738,7 +778,7 @@

    - Macro: HEAD "<text of head>" [ "<2nd line>" [ "<3rd line>" ... ] ] + Macro: HEAD "<text of head>" [ "<2nd line>" [ "<3rd line>" ... ] ]

    @@ -795,7 +835,7 @@

  • Vertical inline escapes inside heads

    -

    1. Family/font/size/quad

    +

    1. Family/font/size/colour/quad

    See Arguments to the control macros. @@ -914,8 +954,8 @@

     	.HEAD "\[ALD3]Text of head"
    -        or
    -    .HEAD "\[DOWN 3p]Text of head"
    +	    or
    +	.HEAD "\[DOWN 3p]Text of head"
     
    will lower the baseline of the head by three points. Note that @@ -926,8 +966,8 @@

     	.HEAD "\[ALD3]First line" "\[ALD3]Next line" 
    -        or
    -    .HEAD "\[DOWN 3p]First line" "\[DOWN 3p]Next line" 
    +	    or
    +	.HEAD "\[DOWN 3p]First line" "\[DOWN 3p]Next line" 
     

    @@ -963,7 +1003,7 @@

    - Macro: SUBHEAD "<text of subhead>" [ "<2nd line>" [ "<3rd line>" ... ] ] + Macro: SUBHEAD "<text of subhead>" [ "<2nd line>" [ "<3rd line>" ... ] ]

    The argument to SUBHEAD is the text of the subhead, @@ -1071,7 +1111,7 @@


    - Macro: PARAHEAD "<text of parahead>" + Macro: PARAHEAD "<text of parahead>"

    PARAHEAD must come AFTER @@ -1092,7 +1132,7 @@ there are macros to manage parahead numbering.

      -
    1. Family/font/colour/size +
    2. Family/font/size/color
    3. Indent
    4. Numbering
    5. Reset parahead numbering @@ -1206,6 +1246,8 @@ Macro: LINEBREAK +
      +Alias: SECTION

      LINEBREAK takes no arguments. Simply invoke it @@ -1218,12 +1260,13 @@

      Linebreak character control macro

      - Macro: LINEBREAK_CHAR [ <character> ] [ <iterations> [ <vertical adjustment> ] ] + Macro: LINEBREAK_CHAR [ <character> ] [ <iterations> [ <vertical adjustment> ] ]
      +Alias: SECTION_CHAR +
      *The third optional argument requires a unit of measure. -

      LINEBREAK_CHAR determines what mom prints when LINEBREAK is invoked. It takes 3 @@ -1267,7 +1310,7 @@

      Linebreak colour control macro

      - Macro: LINEBREAK_COLOR <color name> + Macro: LINEBREAK_COLOR <color name>

      To change the colour of the linebreak character(s), simply invoke @@ -1335,6 +1378,34 @@ as does the control macro QUOTE_INDENT.

      +Version 1.3: mom's handling of the vertical +whitespace around quotes has changed slightly. In versions prior +to 1.3, it was not possible to alter the +leading +of quotes and blockquotes (which was the same as the document +leading), ensuring that the vertical whitespace remained consistent, +as described above. In 1.3 and later, it is possible to change the +leading of quotes and blockquote via +the QUOTE_AUTOLEAD and +BLOCKQUOTE_AUTOLEADmacro. Now, if your quote +(or blockquote) leading differs from the document leading, +mom attempts to observe the same rules for vertical +whitespace outlined above; however, she will also insert a small, +flexible amount of extra whitespace around the quotes to make sure +the whitespace is equal, top and bottom. Since she does this on a +quote by quote basis, rather than by figuring out how much extra +whitespace is needed to adjust all quotes on a page, +the spacing around multiple quotes on the same page will differ +slightly, although each will be balanced between lines of normal +running text, +top and bottom. (The inability to scan an entire page and insert +equalized whitespace at marked places is a limitation of groff, +which, by and large, works in a linear, line by line fashion.) +If you don't provide mom with a +QUOTE_AUTOLEAD, quotes are leaded at the default +for normal running text, meaning that multiple quotes on the same +page are all spaced identically. +

      TIP: If you want to include snippets of programming code in mom documents, you may come acropper of the fact @@ -1383,7 +1454,7 @@


      - Macro: QUOTE toggle + Macro: QUOTE toggle

      @@ -1404,25 +1475,26 @@

      Quote control macros

        -
      1. Family/font/size/colour/indent +
      2. Family/font/size/leading/colour/indent
      3. Spacing above and below (typeset only)
      4. Underline quotes (typewrite only)
      5. Manually break a footnoted quote that crosses pages/columns

      -

      1. Family/font/size/indent

      +

      1. Family/font/size/colour/indent

      See Arguments to the control macros.

      -.QUOTE_FAMILY default = prevailing document family; default is Times Roman
      -.QUOTE_FONT   default = italic
      -.QUOTE_SIZE   default = +0 (i.e. same size as paragraph text)
      -.QUOTE_COLOR  default = black
      -.QUOTE_INDENT default = paragraph indent x 3 (typeset); x 2 (typewrite)
      -             (note that this macro also sets the indents (left and right)
      -              for blockquotes)
      +.QUOTE_FAMILY   default = prevailing document family; default is Times Roman
      +.QUOTE_FONT     default = italic; underlined in TYPEWRITE
      +.QUOTE_SIZE     default = +0 (i.e. same size as paragraph text)
      +.QUOTE_AUTOLEAD default = none; leading of quotes is the same as paragraphs
      +.QUOTE_COLOR    default = black
      +.QUOTE_INDENT   default = paragraph indent x 3 (typeset); x 2 (typewrite)
      +               (note that this macro also sets the indents (left and right)
      +                for blockquotes)
       

      2. Spacing above and below -- ALWAYS_FULLSPACE_QUOTES (typeset only)

      @@ -1463,6 +1535,16 @@

      4. Manually break a footnoted quote -- BREAK_QUOTE

      +NOTE: As of version 1.1.9, the macro +BREAK_QUOTE has become obsolete (or, at least, +should have become obsolete.) It remains here for backward +compatibility with documents created prior to 1.1.9, and just in +case, despite my efforts to make it obsolete, you still encounter the +problem it's supposed to fix. Should you find yourself having to +use BREAK_QUOTE while running mom +1.1.9 or higher, please notify me immediately. + +

      Exceptionally, a quote or blockquote containing a footnote may cross a page or column. When this happens, the footnote marker may not be correct for its position relative to other footnotes on the page, and @@ -1505,19 +1587,8 @@ off from running text with a small amount of vertical whitespace top and bottom. (See above -for a complete explanation of how this is managed, and how to control it.) -

      -You may notice that BLOCKQUOTE has no macro to -control -leading, -although you can change the point size. There are Very Good -Reasons for this. If you can't live with the limitation, change -the leading of blockquotes (after invoking the tag) with -LS, -but know that there will be Bottom Margin Consequences unless you -use the -SHIM -macro after you turn the blockquote off. +for a complete explanation of how this is managed, and how to control it. +Be sure to read the section Version 1.3.)

      @@ -1525,7 +1596,7 @@


      - Macro: BLOCKQUOTE toggle + Macro: BLOCKQUOTE toggle
      Aliases: CITE, CITATION
      @@ -1553,29 +1624,31 @@

      NOTE: The aliases CITE and CITATION may be used in place of the -BLOCKQUOTE tag, but "CITE" and -"CITATION" must not be used to replace "BLOCKQUOTE" -in any of the tag's control macros. +BLOCKQUOTE tag, as well as in any of the control +macros that begin with BLOCKQUOTE_ or end with +_BLOCKQUOTE.

      Blockquote control macros

        -
      1. Family/font/size/colour/indent +
      2. Family/font/size/leading/colour/quad/indent
      3. Spacing above and below (typeset only)
      4. Manually break a footnoted blockquote that crosses pages/columns

      -

      1. Family/font/size/indent

      +

      1. Family/font/size/colour/quad/indent

      See Arguments to the control macros.

      -.BLOCKQUOTE_FAMILY default = prevailing document family; default is Times Roman
      -.BLOCKQUOTE_FONT   default = italic
      -.BLOCKQUOTE_SIZE   default = -1 (point)
      -.BLOCKQUOTE_COLOR  default = black
      -.QUOTE_INDENT      default = paragraph indent x 3 (typeset); x 2 (typewrite)
      -                  (note that this macro also sets the left indent for quotes)
      +.BLOCKQUOTE_FAMILY   default = prevailing document family; default is Times Roman
      +.BLOCKQUOTE_FONT     default = roman
      +.BLOCKQUOTE_SIZE     default = -1 (point)
      +.BLOCKQUOTE_AUTOLEAD default = none; leading of blockquotes is the same as paragraphs
      +.BLOCKQUOTE_COLOR    default = black
      +.BLOCKQUOTE_QUAD     default = left
      +.BLOCKQUOTE_INDENT   default = paragraph indent x 3 (typeset); x 2 (typewrite)
      +                    (note that this macro also sets the left indent for quotes)
       

      2. Spacing above and below -- ALWAYS_FULLSPACE_QUOTES (typeset only)

      @@ -1616,7 +1689,7 @@ every item in the list, you invoke the macro, ITEM, followed by the text of the item. When a list is finished, you exit the list with LIST OFF (or -QUIT, END, X, +QUIT, END, BACK, etc.)

      By default mom starts each list with the enumerator @@ -1639,7 +1712,7 @@ In other words, mom does not, by default, indent entire lists. Indenting a list is controlled by the macro, -SHIFT_LIST. +SHIFT_LIST. (This is a design decision; there are too many instances where a default indent is not desirable.) Equally, mom does not add any extra space above or below lists. @@ -1647,7 +1720,8 @@ Lists can be nested (as in the example above). In other words, you can set lists within lists, each with an enumerator (and possibly, indent) of your choosing. In nested lists, each invocation of -LIST OFF takes you back to the previous depth (or +LIST OFF (you may prefer to use LIST +BACK) takes you back to the previous depth (or level) of list, with that list's enumerator and indent intact. The final LIST OFF exits lists completely and returns you to the left margin of running text. @@ -1661,8 +1735,7 @@


      - Macro: LIST [ BULLET | DASH | DIGIT | ALPHA | USER ] [ <separator> | <user-defined enumerator> ] [ <off> ] - + Macro: LIST [ BULLET | DASH | DIGIT | ALPHA | alpha | ROMAN<n> | roman<n> | USER <string>] [ <separator> | <user-defined enumerator> ] [ <prefix> ] [ <off> ]

      Invoked by itself (i.e. with no argument), LIST initializes a list (with bullets as the default enumerator). @@ -1670,77 +1743,184 @@ .ITEM, on a line by itself, is treated as a list item.

      +NOTE: Every time you invoke LIST +to start a list (as opposed to +exiting one), +you must supply an enumerator (and optionally, a separator) for the +list, unless you want mom's default enumerator, +which is a bullet. Within nested lists, mom +stores the enumerator, separator and indent for any list you return +backwards to (i.e. with LIST OFF), but +does not store any information for lists you move forward +to. +
      + +

      The first argument--enumerator style

      +

      The optional arguments BULLET, -DASH, DIGIT (for Arabic -numerals), ALPHA (for lowercase letters) and -USER allow you to say what kind of enumerator you -want for a given list. -

      -If you choose DIGIT or ALPHA, you -may enter the optional argument separator to say -what kind of separator you want after the enumerator. The separator -can be anything you like. The default for DIGIT is -a period (dot), like this: +DASH, DIGIT (for +Arabic numerals), ALPHA (for uppercase +letters), alpha (for lowercase letters), +ROMAN<n> (for uppercase roman numerals), +roman<n> (for lowercase roman numerals) tell +mom what kind of enumerator to use for a given +list. +

      +The arguments, ROMAN<n> and +roman<n>, are special. You must append to +them a digit (arabic, e.g. "1" or "9" or "17") saying how many items +a particular roman-numeralled LIST is going to +have. Mom requires this information in order to +align roman numerals sensibly, and will abort--with a message--if +you don't provide it. +

      +A roman-numeralled list containing, say, five items, would be set +up like this: +

      +

      +	.LIST roman5        producing        i)   Item 1.
      +	.ITEM                                ii)  Item 2.
      +	Item 1.                              iii) Item 3.
      +	.ITEM                                iv)  Item 4.
      +	Item 2.                              v)   Item 5.
      +	.ITEM
      +	Item 3
      +	.ITEM
      +	Item 4
      +	.ITEM
      +	Item 5
      +
      + +

      +The argument, USER, lets you make up your own +enumerator, and must be followed by a second argument: what you'd +like the enumerator to look like. For example, if you want a list +enumerated with +=>, +

      +

      +	.LIST USER =>
      +	.ITEM
      +	A list item
      +
      + +will produce +

      +

      +	=> A list item
      +
      + +Please note: if the argument to +USER contains spaces, you must enclose the argument +in double quotes. + +
      + +

      The second argument--separator style

      +

      +If you choose DIGIT, ALPHA, +alpha, ROMAN<n>, or +roman<n>, you may enter the optional +argument, separator, to say what kind of separator +you want after the enumerator. The separator can be anything you +like. The default for DIGIT is a period (dot), +like this:

       	1. A list item
       
      -The default separator for ALPHA is a right -parenthesis, like this: +The default separator for ALPHA, +alpha, ROMAN<n> and +roman<n> is a right parenthesis, like this:

      -	a) A list item
      +	a) An alpha-ed list item
      +	b) A second alpha-ed list item
      +
      +	   or
      +
      +	i)  A roman-ed list item
      +	ii) A second roman-ed item
       
      -If you want digits with a right-parenthesis separator, you'd do +If you'd prefer, say, digits with right-parenthesis separators +instead of the default period, you'd do

       	.LIST DIGIT )
       	.ITEM
      -	A list item
      +	A numberd list item
       
      which would produce

      -	1) A list item
      +	1) A numbered list item
       
      -BULLET, DASH and +Please note: BULLET, DASH and USER do not take a separator. +
      + +

      The third argument--prefix style

      -USER lets you make up your own enumerator. For -example, if you want a list enumerated with =>, +Additionally, you may give a prefix (i.e. a character that comes +before the enumerator) when your enumerator style for a +particular list is DIGIT, ALPHA, +alpha, ROMAN<n> +or roman<n>. In the arguments to +LIST, the prefix comes after the +separator, which may seem counter-intuitive, so please be careful. +

      +A prefix can be anything you like. Most likely, you'll want some +kind of open-bracket, such as a left parenthesis. If, for example, +you want a DIGIT list with the numbers enclosed in +parentheses, you'd enter

      -	.LIST USER =>
      +	.LIST DIGIT ) (
       	.ITEM
      -	A list item
      +	The first item on the list.
      +	.ITEM
      +	The second item on the list.
       
      -will produce +which would produce

      -	=> A list item
      +	(1) The first item on the list.
      +	(2) The second item on the list.
       
      -If the argument to USER contains spaces, you must -enclose the argument in double quotes. +Please note: BULLET, DASH and +USER do not take a prefix. +
      + + +

      Exiting lists--.LIST OFF/BACK or .QUIT_LISTS

      +

      +Any single argument to LIST other +than BULLET, DASH, +DIGIT, ALPHA, +alpha, ROMAN<n>, +roman<n> or USER (e.g. +LIST OFF or LIST +BACK) takes you out of the current list.

      -Any single argument other than BULLET, -DASH, DIGIT, -ALPHA or USER takes you out of the -current list. If you are at the first list-level (or -depth), +If you are at the first list-level (or "list-depth"), mom returns you to the left margin of running text. Any indents that were in effect prior to setting the list are fully -restored. If you are in a nested list, mom moves -you back one list-level and restores the enumerator, separator and -indent appropriate to that level. -

      -Each invocation of LIST must be matched by a -corresponding LIST OFF in order to fully exit -lists. For example, +restored. +

      +If you are in a nested list, mom moves you +back one list-level (i.e. does not take you out of the +list structure) and restores the enumerator, separator and indent +appropriate to that level. +

      +Each invocation of LIST should be be matched by +a corresponding LIST OFF in order to fully exit +lists. For example,

       	Lorem ipsum dolor sit amet, consetetur sadipscing elitr,
      @@ -1774,14 +1954,10 @@
       	sed diam nonumy eirmod tempor invidunt ut labore.
       
      -NOTE: Every time you invoke LIST -to start a list (as opposed to exiting one), you must supply an -enumerator (and optionally, a separator) for the list, unless you -want mom's default enumerator, which is a bullet. -Within nested lists, mom stores the enumerator, -separator and indent for any list you return backwards to -(i.e. with LIST OFF), but does not store any -information for lists you move forward to. +Alternatively, you may use the single-purpose macro, +QUIT_LISTS, to get yourself out of a list +structure. In the example above, the two .LIST OFF +lines could be replaced with a single .QUIT_LISTS.


      @@ -1889,11 +2065,11 @@

      2. Resetting an initialized list's enumerator -- RESET_LIST

      -In nested lists, if your choice of list enumerator for a given level -of list is either DIGIT or ALPHA, -you may sometimes want to reset the list's enumerator back to -"1" or "a" when you return, within the nest, to -that list. Consider the following: +In nested lists, if your choice of list enumerator for a given +level of list is DIGIT, ALPHA, +alpha, ROMAN or +roman, you may sometimes want to reset the list's +enumerator when you return to that list. Consider the following:

       	Things to do religiously each and every day:
      @@ -1908,26 +2084,35 @@
       	   c) canned tuna on Sunday
       
      -Normally, within a nested list, when you return to an alpha- or -digit-enumerated list, the enumerator continues incrementing from -where it left off. That means, in the example above, the normal -state of affairs for the alpha'ed list under "2. Feed the -cat" would be c), d) and e). The solution, in such a case, is -simply to reset the enumerator --before ITEM!-- +Normally, within a nested list, when you return to an +incrementally-enumerated list, the enumerator continues incrementing +from where it left off. That means, in the example above, the +normal state of affairs for the alpha'ed list under "2. Feed +the cat" would be c), d) and e). The solution, in such a case, +is simply to reset the enumerator --before ITEM!-- with the macro, RESET_LIST.

      -RESET_LIST does exactly what it says -- resets the -list -- and doesn't take any arguments. +By default, with no argument, RESET_LIST resets the +enumerator to 1, A, a, I or i depending on the style of enumerator. +You may, if you wish, pass RESET_LISTS a numeric +argument representing the starting enumerator for the reset (if +different from "1"), although I can't at present think of a use for +this feature.

      3. Padding digit enumerators (PAD_LIST_DIGITS)

      +Arabic digits +

      When your choice of enumerators is DIGIT AND the number of items in the list exceeds nine (9), you have to make a design decision: should mom leave room for the extra numeral in two-numeral digits to the right or the left of -the single-numeral digits? If you want the extra space to the -right, just invoke the macro, PAD_LIST_DIGITS by -itself. This will produce something like +the single-numeral digits? +

      +If you want the extra space to the right, invoke the macro, +.PAD_LIST_DIGITS (with no argument), after +LIST and before ITEM. This will +produce something like

       	8.  List item
      @@ -1948,6 +2133,411 @@
       Of course, if the number of items in the list is less than ten
       (10), there's no need for PAD_LIST_DIGITS.
       

      +Roman numerals +

      +By default, mom sets roman numerals in lists flush +left. The <n> argument appended to +ROMAN<n> or roman<n> +allows her to calculate how much space to put after each numeral in +order to ensure that the text of items lines up properly. +

      +If you'd like the roman numerals to line up flush right (i.e. be +padded "left"), simply invoke PAD_LIST_DIGITS +LEFT after LIST ROMAN<n> +or LIST roman<n> amd before +ITEM. +

      +


      + + + +

      Line numbering

      + + +

      +Mom's line-numbering capabilities are not as flexible +as most of her other document processing macros. The reason is +that groff's underlying line-numbering +primitive, +.nm, is, well...primtive. It is not possible, for +example, to select a particular family or font for use exclusively +with line numbers. Nor is it possible to set the +gutter +using any +unit of measure +other than the +figure space. +

      +That said, when you turn line-numbering on, mom, +by default +
      + +

        +
      • numbers every line of paragraph text; line-numbering is + suspended for all other document processing tags (like + docheaders, epigraphs, heads, subheads, etc.) and special + pages (covers, endotes, bibliographies, etc.); be aware, + though, that if you turn + docheaders + off (with + DOCHEADER OFF) + and create your own docheader, mom + will line-number your custom docheader +
      • doesn't touch your line length; line numbers are hung + outside your current left margin (as set with + L_MARGIN, + PAGE + or + DOC_LEFT_MARGIN), + regardless of any indents that may be active +
      • separates line numbers from running text by two + figure spaces. +
      +

      +Line numbering may be enabled and disabled for +QUOTE +and/or +BLOCKQUOTE +in one of three styles. See +Line numbering control macros for quotes and blockquotes. +

      +The first time you invoke +NUMBER_LINES +you must, at a minimum, tell it what line number you want the +next +output line +to have. Optional arguments allow you to state which lines should +be numbered (e.g. every five or every ten lines), and the gutter to +place between line numbers and +running text. +

      +Subsequently, you can turn line-numbering off, either permanently, +or resume it later at a place of your choosing. When you +resume line-numbering, the line numbers pick up where you left off. +

      + + + +


      +

      + + + Macro: NUMBER_LINES <start number> [ <which lines to number> [ <gutter> ] ] +
      + Macro: NUMBER_LINES <anything> | RESUME +
      +
      + + +

      +NUMBER_LINES does what it says: prints line +numbers, to the left of +output lines +of paragraph text. One of the chief reasons for wanting numbered +lines is in order to identify footnotes or endnotes by line number +instead of by a marker in the text. (See +.FOOTNOTE_MARKER_STYLE LINE +for instructions on line-numbered footnotes, and +.ENDNOTE_MARKER_STYLE +for instructions on line-numbered endnotes.) +

      +Every time you invoke NUMBER_LINES, unless you are +using the arguments OFF (QUIT, +END, X, etc.) or +RESUME you must, at a minimum, pass it one +argument, namely the number (digit) you want the next +output line +to have. For example, +

      +	.NUMBER_LINES 3
      +
      + +will prepend the number, 3, to the next output line. +

      +Normally, of course, you will number lines of text starting at 1. +All you have to do in that case is ensure that +

      +	.NUMBER_LINES 1
      +
      + +precedes your first line of input text, which will also be the +first line of output text. +

      +You can alter mom's default line numbering +behaviour (see +above) +with the optional arguments <which lines to +number> and <gutter>. +

      +<which lines to number> instructs +NUMBER_LINES to number only certain lines, e.g. +every two lines or every five lines. If you want, say, only every +five lines to have a prepended number, you'd do +

      +	.NUMBER_LINES 1 5
      +
      + +GOTCHA! The argument to <which +lines to number> only numbers those lines that are +multiples of the argument. Hence, in the above example, line +number "1" will not be numbered, since "1" is not a +multiple of "5". +

      +If you wanted line number "1" to be numbered, you'd have to invoke +.NUMBER_LINES 1 1 before the first output line, then +study your output copy and determine where best to insert +the following in your input copy: +

      +	.NUMBER_LINES \n(ln 5
      +
      + +(The escape, \n(ln, ensures that +NUMBER_LINES automatically supplies the correct +value for the first argument, <start +number>.) +

      +Following this recipe, line number 1 will be numbered; subsequently, +only line numbers that are multiples of 5 will be numbered. A +little experimentation may be required to determine the best place +for it. +

      +The optional argument, <gutter>, tells +mom how much space to put between the line numbers +and the running text. +

      +Note: when giving a value for +<gutter>, you cannot skip the +<which lines to number> argument. Either +fill in the desired value, or use two double-quotes +("") to have mom use the value +formerly in effect. +

      +<gutter> does not require (or even accept) a +unit of measure. +The argument you pass to it is the number of +figure spaces +you want between line numbers and running text. +Mom's default gutter is two figure spaces. If +you'd like a wider gutter, say, four figures spaces, you'd do +

      +	.NUMBER_LINES 1 1 4
      +	                |
      +	                +-- Notice you *must* supply a value
      +	                    for the 2nd argument in order to supply
      +	                    a value for the 3rd.
      +
      + +

      +After you've set up line-numbering, NUMBER_LINES +can be used to control line numbering. +
      +

      Line-numbering control

      +

      +NUMBER_LINES OFF (or END, QUIT, X, etc.) +turns line-numbering off. +

      +Sometimes, you merely want to suspend line-numbering. In that case, +turn line numbering off with NUMBER_LINES OFF. +Later, when you want it to resume, enter +

      +	.NUMBER_LINES RESUME
      +
      + +Line numbering will resume exactly where it left off. If this is +not what you want--say you want to reset the line number to "1"--simply +invoke NUMBER_LINES with whatever arguments +are needed for the desired result. +

      +Extra Notes: +
      +

        +
      1. In document processing, you may invoke NUMBER_LINES + either before or after START. + Mom doesn't care. +
      2. If you're collating documents with + COLLATE, + you should re-invoke, at a minimum, .NUMBER_LINES + 1 for each collated document, in order to ensure that + each begins with the number "1" prepended to the first line + (unless, of course, that is not what you want). +
      3. Occasionally, you may want to change the current gutter + between line numbers and running text without knowing + what the next output line number should be. Since + NUMBER_LINES requires this number + as its first argument, in such instances, pass + NUMBER_LINES as its first argument the + escape \n(ln. +

        + For example, if you were numbering every 5 lines with a + gutter of 2 (figure spaces) and you needed to change the + gutter to 4 (figures spaces), +

        +     .NUMBER_LINES \n(ln 5 4 +

        + would do the trick. +

      4. If you're using margin notes in a document, be sure to set + the gutter for margin notes wide enough to allow room for + the line numbers. +
      5. Mom (groff, actually), only numbers lines + to the left of text. For aesthetic reason, + therefore, the use of line numbering when setting a document + in columns is discouraged. However, should you wish to + number lines when setting in columns, make sure the + gutter(s) + between columns is wide enough to leave room for the + numbers. +
      +
      + +

      Line numbering control macros for QUOTE and BLOCKQUOTE

      +
        +
      1. NUMBER_QUOTE_LINES +
      2. NUMBER_BLOCKQUOTE_LINES +
      3. Setting up line numbering in quotes and blockquotes on a case by case basis +
      + +

      1. NUMBER_QUOTE_LINES

      +

      +If you'd like mom to number lines of output text +in a +QUOTE +as part of the same order and sequence as paragraph text, simply +invoke NUMBER_QUOTE_LINES by itself. +

      +There is a catch with numbering quotes, though. Owing to groff's +restriction of accepting only the figure space as the line number +gutter's unit of measure, it is not possible for line numbers +in quotes to hang outside a document's overall left margin and +be reliably flush with the line numbers of paragraph text. +Conseqently, line numbers in quotes hang to the left of the quote, +separated from the quote by the <gutter> +argument. +

      +If you'd like to change the gutter for quotes line-numbered in +this way, invoke NUMBER_QUOTE_LINES with a digit +representing the number of +figure spaces +you'd like between the line numbers and the quoted text, like this: +

      +	.NUMBER_QUOTE_LINES 1
      +
      + +With the above, line numbers in quotes (and only quotes) will have +a gutter of 1 figure space. +

      +If you are using "line numbering style" for footnotes +(FOOTNOTE_MARKER_STYLE LINE), +you may not wish to have quotes visibly line-numbered, but +still want to embed footnotes inside quotes. In order to do that, +mom allows you to say NUMBER_QUOTE_LINES +SILENT. +

      +When you invoke NUMBER_QUOTE_LINES +SILENT, mom continues to increment line +numbers while quotes are being output, but they won't appear in the +output copy. (Compare this with mom's default +behaviour of suspending incrementing of line numbers +during the output of quotes.) This allows you to embed +line-numbered footnotes inside quotes and have the line number +"label" in the footnote come out sensibly. +

      +Once having turned NUMBER_QUOTE_LINES on, you +may disable it with NUMBER_QUOTE_LINES OFF (or +QUIT, END, X, +etc). +

      + +

      2. NUMBER_BLOCKQUOTE_LINES

      +

      +If you'd like mom to number lines of output text +in a +BLOCKQUOTE +as part of the same order and sequence as paragraph text, simply +invoke NUMBER_BLOCKQUOTE_LINES by itself. +

      +There is a catch with numbering blockquotes, though. Owing to +groff's restriction of accepting only the figure space as the +line number gutter's unit of measure, it is not possible for line +numbers in blockquotes to hang outside a document's overall left +margin and be reliably flush with the line numbers of paragraph +text. Conseqently, line numbers in blockquotes hang to the +left of the blockquote, separated from the blockquote by the +<gutter> argument. +

      +If you'd like to change the gutter for blockquotes line-numbered in +this way, invoke NUMBER_BLOCKQUOTE_LINES with a digit +representing the number of +figure spaces +you'd like between the line numbers and the blockquoted text, like +this: +

      +	.NUMBER_BLOCKQUOTE_LINES 1
      +
      + +With the above, line numbers in blockquotes (and only blockquotes) +will have a gutter of 1 figure space. +

      +If you are using "line numbering style" for footnotes +(FOOTNOTE_MARKER_STYLE LINE), +you may not wish to have blockquotes visibly line-numbered, +but still want to embed footnotes inside blockquotes. In +order to do that, mom allows you to say +NUMBER_BLOCKQUOTE_LINES SILENT. +

      +When you invoke NUMBER_BLOCKQUOTE_LINES +SILENT, mom continues to increment line +numbers while blockquotes are being output, but they won't appear in +the output copy. (Compare this with mom's default +behaviour of suspending incrementing of line numbers during +the output of blockquotes.) This allows you to embed line-numbered +footnotes inside blockquotes and have the line number "label" in the +footnote come out sensibly. +

      +Once having turned NUMBER_BLOCKQUOTE_LINES on, you +may disable it with NUMBER_BLOCKQUOTE_LINES OFF (or +QUIT, END, X, +etc). +

      + +

      3. Setting up line numbering in quotes and blockquotes on a case by case basis

      +

      +Sometimes, you may want quotes or blockquotes to have a different +line numbering scheme from the one used in the rest of the +document. Or, you may want line numbering enabled only inside a +particular quote or blockquote. A common reason for this would be +if you were using the +QUOTE +macro to insert lines of programming code into a document. (See +here +for suggestions about including programming code snippets in +documents.) +

      +To enable line numbering within quotes or blockquotes on a case by +case basis, simply invoke NUMBER_LINES, with the +arguments you need, immediately after entering QUOTE +or BLOCKQUOTE. (NUMBER_QUOTE_LINES +and/or NUMBER_BLOCKQUOTE_LINES should be turned +off if you're doing this.) The quote or blockquote will then be +line-numbered according to your specifications: the starting line +number of the quote or blockquote will be the one you give as a +first argument to NUMBER_LINES; which lines to +number will be the value you pass to <which lines to +number> (defaults to "1"); line numbers will hang +to the left of the quote or blockquote, separated from the quote or +blockquote by <gutter> (defaults to "2"). +

      +As soon as QUOTE or BLOCKQUOTE is +turned off, line numbering ceases, not only with respect to +subsequent paragraph text (if they are not being line-numbered), +but also for any subsequent invocation of QUOTE or +BLOCKQUOTE. In other words, you must re-enable +quote or blockquote line-numbering inside every instance of +QUOTE or BLOCKQUOTE when +line-numbering either of them on a case by case basis. +


      @@ -1955,6 +2545,9 @@

      Footnotes

      @@ -1969,19 +2562,63 @@ .FOOTNOTE <footnote about who the hell is Schelling> .FOOTNOTE OFF - were generally the points of discussion presenting the most + were generally the points of discussion presenting the most of beauty to the imaginative Morella.
      -and be done with it. (Note the obligatory use of the -\c -inline escape.) -Mom takes care of everything: -putting footnote markers in the body of the document, keeping track -of how many footnotes are on the page, identifying the footnotes -themselves appropriately, balancing them properly with the bottom -margin, deferring footnotes that don't fit on the page... Even if -you're using +and be done with it. +

      +(Note the obligatory use of the \c +inline escape. +It is required when your +FOOTNOTE_MARKER_STYLE +is either STAR [star/dagger footnotes] or +NUMBER [superscript numbers]; it is NOT to be used +when the FOOTNOTE_MARKER_STYLE is +LINE, or when footnote markers have been disabled +with +.FOOTNOTE_MARKERS +OFF.) +

      +***Version 1.3 change*** +

      +As of version 1.3, the manner of entering the line +after .FOOTNOTE OFF has changed +to accommodate users' differing wishes with respect to +the order of punctuation and footnote markers. The +correct way to enter the line after .FOOTNOTE +OFF--ONLY if your +FOOTNOTE_MARKER_STYLE is +STAR or NUMBER--is to input +it as if it's literally a continuation of the line before +.FOOTNOTE, and therefore begins with either a space +or a punctuation mark, as in the two following examples. +

      +

      +	   Example 1					  Example 2
      +	   ---------                      ---------
      +
      +	A line of text,\c				A line of text\c
      +	.FOOTNOTE						.FOOTNOTE
      +	A footnote line.				A footnote line.
      +	.FOOTNOTE OFF					.FOOTNOTE OFF
      +	 broken up with a comma.		, broken up with a comma.
      +
      +	(last line begins with			(last line begins with
      +	 a literal space)				 the comma and a space)
      +
      + +If your FOOTNOTE_MARKER_STYLE is line, none of +this is a concern. +

      +***End of version 1.3 change*** +

      +After you invoke FOOTNOTE, mom +takes care of everything: putting footnote markers in the body of +the document, keeping track of how many footnotes are on the page, +identifying the footnotes themselves appropriately, balancing them +properly with the bottom margin, deferring footnotes that don't fit +on the page... Even if you're using COLUMNS, mom knows what to do, and Does The Right Thing.

      @@ -1991,27 +2628,37 @@

      Footnote behaviour

      -By default, mom marks footnotes with -alternating stars (asterisks) and daggers. The first footnote -gets a star, the second a dagger, the third two stars, -the fourth two daggers, etc. If you prefer numbered footnotes, rest -assured mom is happy to oblige. +By default, mom marks footnotes with alternating +stars (asterisks), daggers, and double-daggers. The first footnote +gets a star, the second a dagger, the third a double-dagger, the +fourth two stars, the fifth two daggers, etc. If you prefer +numbered footnotes, rest assured mom is happy to +oblige.

      A small amount of vertical whitespace and a short horizontal rule separate footnotes from the document body. The amount of whitespace varies slightly from page to page depending on the number of lines -in the footnotes. Mom tries for a nice balance +in the footnotes. Mom tries for a nice balance between too little whitespace and too much, but when push comes to -shove, she'll opt for ample over cramped. The last lines of footnotes -are always flush with the document's bottom margin. +shove, she'll usually opt for ample over cramped. The last lines of +footnotes are always flush with the document's bottom margin. +

      If mom sees that a portion of a footnote cannot be fit on its page, she carries that portion over to the next -page. If an entire footnote can't be fitted on its page (i.e. +page. If an entire footnote can't be fit on its page (i.e. FOOTNOTE has been called too close to the bottom), she defers the footnote to the next page, but sets it with the appropriate marker from the previous page.

      +When footnotes occur within cited text, for example a +QUOTE +or a +BLOCKQUOTE, +mom will usually opt for deferring the footnote +over to the next page if it allows her to complete the cited text +on one page. +

      In the unfortunate happenstance that a deferred footnote is the only footnote on its page (i.e. it's marked in the document body with a star) and the page it's deferred to has its own footnotes, @@ -2023,30 +2670,100 @@ makes it clear that the first footnote entry belongs to the previous page.

      -In the circumstance where a deferred footnote is not the only one on -its page, and is consequently marked by something other than a single -star, there's no confusion and mom doesn't bother -with the blank line. (By convention, the first footnote on a page is -always marked with a single star, so if readers see, say, a dagger or two -stars marking the first footnote entry, they'll know the entry belongs -to the previous page). +In the circumstance where a deferred footnote is not the only one +on its page, and is consequently marked by something other than a +single star, there's no confusion and mom doesn't +bother with the blank line. (By convention, the first footnote on +a page is always marked with a single star, so if readers see, say, +a dagger or double-dagger marking the first footnote entry, they'll +know the entry belongs to the previous page). +

      +Very exceptionally, two footnotes may have to be deferred (e.g. one +occurs on the second to last line of a page, and another on the +last line). In such a circumstance, mom does not +add a blank after the second deferred footnote. If you'd like a +blank line separating both deferred footnotes from any footnotes +proper to the page the deferred ones were moved to, add the space +manually by putting a +.SPACE +command at the end of the footnote text, before +FOOTNOTE OFF (or FOOTNOTE X, QUIT, +EXIT, etc...).

      Obviously, deferred footnotes aren't an issue if you request numbered footnotes that increase incrementally throughout the whole document -- yet another convenience mom has thought of.

      -Exceptionally, you may encounter problems with footnotes inside -quotes and blockquotes that cross a page or column. See -BREAK_QUOTE +While mom's handling of footnotes is +sophisticated, and tries to take nearly every imaginable situation +under which they might occur into account, some situations are +simply impossible from a typographic standpoint. For example, if +you have a +HEAD +near the bottom of the page AND that page has some footnotes on it, +mom may simply not have room to set any text under +the head (normally, she insists on having room for at least one line +of text beneath a head). In such an instance, mom +will either set the head, with nothing under it but footnotes, +or transfer the head to the next page. Either way, you'll have a +gaping hole at the bottom of the page. It's a sort of typographic +Catch-22, and can only be resolved by you, the writer or formatter +of the document, adjusting the type on the offending page so as to +circumvent the problem. +

      +NOTE: Exceptionally, you may encounter problems with footnotes inside +quotes and blockquotes that cross a page or column. See BREAK_QUOTE for a solution.

      +

      Footnote markers and punctuation in the running text

      + +

      +As of version 1.3, the manner of entering the line after +.FOOTNOTE OFF has changed. The correct way to +enter the line after .FOOTNOTE OFF now is to +input it as if it's literally a continuation of the line before +.FOOTNOTE, and therefore begins with either a space +or a punctuation mark, as in the two following examples. +

      +

      +	   Example 1					  Example 2
      +	   ---------                      ---------
      +
      +	A line of text,\c				A line of text\c
      +	.FOOTNOTE						.FOOTNOTE
      +	A footnote line.				A footnote line.
      +	.FOOTNOTE OFF					.FOOTNOTE OFF
      +	 broken up with a comma.		, broken up with a comma.
      +
      +	(last line begins with			(last line begins with
      +	 a literal space)				 the comma and a space)
      +
      + +Care must be taken, though, if the punctuation mark that begins the +line after FOOTNOTE OFF is a period (dot). You +must begin such lines with +\&., like this: +

      +

      +	end of a sentence\c
      +	.FOOTNOTE
      +	A footnote line.
      +	.FOOTNOTE OFF
      +	\&.  A new sentence...
      +
      + +If you omit the \&., the line will vanish! +

      + +


      - Macro: FOOTNOTE <toggle> | INDENT LEFT | RIGHT | BOTH <indent value> + Tag: FOOTNOTE <toggle> | INDENT LEFT | RIGHT | BOTH <indent value>
      *See
      HYPER-IMPORTANT NOTE!!!
      @@ -2088,25 +2805,45 @@ that comes immediately before FOOTNOTE MUST terminate with a \c -inline escape. Otherwise, the footnote marker for the word won't be attached to -it (i.e. mom will insert a word space between the word -and the marker). See the +inline escape if your +FOOTNOTE_MARKER_STYLE +is either STAR or NUMBER. +See the footnote example above. +

      +Additionally, the line after a FOOTNOTE +OFF should be entered as if there were no interruption in +the input text, i.e. the line should begin with a literal space or +punctuation mark. See +above. +

      +Do NOT use the \c inline escape if your +FOOTNOTE_MARKER_STYLE is LINE, or +if you have disabled footnote markers with +.FOOTNOTE_MARKERS +OFF. As well, the line after +FOOTNOTE OFF should be entered normally.

      Footnote control macros

      1. Family/font/size/colour/lead/quad
      2. Footnote markers -- on or off -
      3. Footnote marker style -- star+dagger or numbered +
      4. Footnote marker style -- star+dagger, numbered or by line number +
      5. Reset footnote number -- set footnote marker number to 1 +
      6. Inter-footnote spacing
      7. Footnote rule -- on or off
      8. Footnote rule length -- length of footnote separator rule
      9. Adjust vertical position of footnote separator rule

      -

      1. Family/font/size/quad/lead

      +

      1. Family/font/size/colour/lead/quad

      See Arguments to the control macros. @@ -2130,6 +2867,10 @@ .FOOTNOTE_MARKERS with no argument. Footnote markers are on by default.

      +If FOOTNOTE_MARKERS are disabled, do NOT use the +\c inline escape to terminate the line before +.FOOTNOTE. +

      3. Footnote marker style -- FOOTNOTE_MARKER_STYLE

      @@ -2147,10 +2888,98 @@ themselves. By default, footnote numbers increase incrementally (prev. footnote number + 1) throughout the whole document. You can ask mom to start each page's footnote numbers at 1 -with .RESET_FOOTNOTE_NUMBER (see below). +with .RESET_FOOTNOTE_NUMBER +(see below.) +

      +

      +.FOOTNOTE_MARKER_STYLE LINE lets you have +footnotes which are identified by line number, rather than by a +marker in the text. (Note that +NUMBER_LINES +must be enabled in order to use this marker style.) +

      +With FOOTNOTE_MARKER_STYLE LINE, mom +will identify footnotes either by single line numbers, or line +ranges. If what you want is a single line number, you need only +invoke .FOOTNOTE, without terminating the text +line before it with \c, at the appropriate +place in running text. +

      +If you want a range of line numbers (e.g. [5-11] ), +insert, directly into the first line of the range you want, the +inline escape, +\*[FN-MARK]. For the terminating line number of +the range, you need only invoke .FOOTNOTE, (again, +without attaching \c to the text line before it). +Mom is smart enough to figure out that where +FOOTNOTE was invoked represents the terminating +line number. Range-numbered footnotes are always output on the page +where FOOTNOTE was invoked, not the page where +\*[FN-MARK] appears (subject, of course, to the +rules for footnotes that fall too close to the bottom of a page, as +outlined +here). + +

      +Mom, by default, puts footnote line numbers inside +square brackets. The style of the brackets may be changed with +the macro, FOOTNOTE_LINENUMBER_BRACKETS, which +takes one of three possible arguments: PARENS +("round" brackets), SQUARE (the default) or +BRACES (curly braces). If you prefer a +shortform, the arguments, (, [ or +{ may be used instead. + +

      +If you don't want the numbers enclosed in brackets, you may tell +mom to use a "separator" instead. A common +separator would be the colon, but it can be anything you like. The +macro to do this is FOOTNOTE_LINENUMBER_SEPARATOR, +which takes, as its single argument, the separator you want. For +safety and consistency's sake, ALWAYS enclose the argument in +double-quotes. +

      +The separator can be composed of any legal groff character, or any +combination of characters. A word of caution: when +using a separator, mom doesn't insert a space +after the separator. Hence, if you want the space (you probably +do), you must make the space part of the argument you pass to +FOOTNOTE_LINENUMBER_SEPARATOR. For example, +to get a colon separator with a space after it, you'd do +

      +

      +	.FOOTNOTE_LINENUMBER_SEPARATOR ": "
      +
      + +RUN-ON FOOTNOTES +

      +Finally, if your footnote marker style is LINE, you +may instruct mom to do "run-on style" footnotes. +Run-on footnotes do not treat footnotes as discrete entities, i.e. +on a line by themselves. Rather, each footnote is separated from +the footnote before it by a space, so that the footnotes on any +given page form a continuous block, like lines in a paragraph. The +macro to get +mom to run footnotes on is +.FOOTNOTES_RUN_ON. Invoked by itself, it turns +the feature on. Invoked with any other argument +(OFF, NO, etc.), it turns the +feature off. It is generally NOT a good idea to turn the feature +on and off during the course of a single document. If you do, +mom will issue a warning if there's going to be a +problem. However, it is always perfectly safe to enable/disable the +feature after +COLLATE. +

      +The usual reason for wanting run-on footnotes is that you're +using them to hold many, short references. (See +here +for instructions on using the groff program, +refer, to set up references.) +

      -

      4. Reset footnote number -- RESET FOOTNOTE NUMBER

      +

      4. Reset footnote number -- RESET_FOOTNOTE_NUMBER

      .RESET_FOOTNOTE_NUMBER, by itself, resets footnote numbering so that the next footnote you enter is @@ -2160,7 +2989,23 @@ mom to start every page's footnote numbering at 1.

      -

      5. Footnote rule -- FOOTNOTE_RULE

      +

      5. Inter-footnote spacing -- FOOTNOTE_SPACE

      +

      +If you'd like a little extra space between footnotes, you can have +mom put it in for you by invoking +.FOOTNOTE_SPACE with an argument representing the +amount of extra space you'd like. The argument to +FOOTNOTE_SPACE requires a +unit of measure. +

      +In the following example, footnotes will be separated from each +other by 3 +points. +

      +	.FOOTNOTE_SPACE 3p
      +
      + +

      6. Footnote rule -- FOOTNOTE_RULE

      If you don't want a footnote separator rule, toggle it off with .FOOTNOTE_RULE OFF (or END, @@ -2169,12 +3014,11 @@ print the rule.

      -

      6. Footnote rule length -- FOOTNOTE_RULE_LENGTH

      +

      7. Footnote rule length -- FOOTNOTE_RULE_LENGTH

      If you want to change the length of the footnote separator rule, invoke .FOOTNOTE_RULE_LENGTH with a length, like this, -

       	.FOOTNOTE_RULE_LENGTH 1i
       
      @@ -2184,10 +3028,10 @@ is required. The default is 4 picas for both -printstyles. +PRINTSTYLES.

      -

      7. Adjust vertical position of footnote separator rule -- FOOTNOTE_RULE_ADJ

      +

      8. Adjust vertical position of footnote separator rule -- FOOTNOTE_RULE_ADJ

      The footnote separator rule is actually a baseline rule that falls on the @@ -2209,161 +3053,111 @@ unit of measure is required.

      +Tip: If your document +leading +is 2 +points +or less (e.g your +point size +is 10 and your linespacing is 10, 11, or 12, lowering +mom's default footnote rule adjustment will +almost certainly give you nicer looking results than leaving +the adjustment at the default. Furthermore, you can invoke +FOOTNOTE_RULE_ADJ on any page in which footnotes +appear, or in any column, so that the placement of the footnote rule +can be changed on-the-fly, should you wish to do so. +


      -

      Terminate document processing

      +

      Endnotes

      -The use of FINIS is optional. If you invoke it -(at the end of a document before -TOC -or -ENDNOTES), -mom turns off -footers -(if they're on) and page numbering (if page -numbers are at the bottom of the page) and deposits the word -END, centred after a blank line, beneath the last -line of the document. END is enclosed between -em-dashes. -

      -If you're writing in a language other than English, you can -change what mom prints for END with -the control macro FINIS_STRING. +Embedding endnotes into mom documents is accomplished +the same way as embedding +footnotes. The example below is +identical to the one shown in the +introduction to footnotes, +except that .FOOTNOTE has been replaced with +.ENDNOTE.

      + +

      +	...the doctrines of Identity as urged by Schelling\c
      +	.ENDNOTE
      +	<endnote about who the hell is Schelling>
      +	.ENDNOTE OFF
      +	 were generally the points of discussion presenting the most
      +	of beauty to the imaginative Morella.
      +
      - +As with footnotes, note the obligatory use of the \c +inline escape +when your +ENDNOTE_MARKER_STYLE +is NUMBER (which marks endnotes references in +running text +with superscript numbers). When the marker style is +LINE, you must not use the +\c escape. +

      +***Version 1.3 change*** +

      +As of version 1.3, the manner of entering the line after +.ENDNOTE OFF has changed to accommodate users' +differing wishes with respect to the order of punctuation and +endnote markers. The correct way to enter the line after +.ENDNOTE OFF--but NOT +if your +ENDNOTE_MARKER_STYLE +is LINE--is to input it as if it's literally +a continuation of the line before .ENDNOTE, and +therefore begins with either a space or a punctuation mark, as in +the two following examples. +

      + +

      +	   Example 1					  Example 2
      +	   ---------                      ---------
      +
      +	A line of text,\c				A line of text\c
      +	.ENDNOTE						.ENDNOTE
      +	A footnote line.				A footnote line.
      +	.ENDNOTE OFF					.ENDNOTE OFF
      +	 broken up with a comma.		, broken up with a comma.
       
      -
      -

      - - Macro: FINIS - + (last line begins with (last line begins with + a literal space) the comma and a space) +

      -

      -The use of FINIS is optional, but if you use -it, it should be the last macro you invoke in a document (before -ENDNOTES -or -TOC). -See -above -for a description of how FINIS behaves. -

      -NOTE: If you don't use FINIS, -and you don't want -footers -(if they're on) or a page number at the bottom of the last page of -a document, you have to turn them off manually, as the last two -lines of your document file, like this: -

      -

      -	.FOOTERS OFF
      -	.PAGINATE OFF
      -
      - -

      Changing the FINIS string

      - -

      -By default, FINIS prints the word -END between -em-dashes. -If you'd like mom to print something else -between the dashes, use the FINIS_STRING macro -(anywhere in the document prior to FINIS). -

      -For example, if your document's in French, you'd do -

      -

      -	.FINIS_STRING "FIN"
      -
      - -Double-quotes must enclose the macro's argument. -

      -NOTE: If you pass FINIS_STRING -a blank string, i.e. -

      -

      -	.FINIS_STRING ""
      -
      - -mom will still print the em-dashes if you -invoke FINIS. This, in effect, produces a -short, centred horizontal rule that terminates the document. -(In -PRINTSTYLE TYPEWRITE, -it's a short, dashed line composed of four hyphens.) - -

      Changing the FINIS colour

      -

      -Invoking FINIS_COLOR with a pre-defined (or -"initalized") color changes the colour of both the FINIS -string and the em-dashes that surround it. If you use the -inline escape, -\*[<colorname>], -in the argument passed to FINIS, only the text -will be in the new colour; the em-dashes will be in the default -document colour (usually black). - -

      -


      - - - -

      Endnotes

      - - -

      -Embedding endnotes into mom documents is accomplished -the same way as embedding -footnotes. The example below is -identical to the one shown in the -introduction to footnotes, -except that .FOOTNOTE has been replaced with -.ENDNOTE. -

      - -

      -	...the doctrines of Identity as urged by Schelling\c
      -	.ENDNOTE
      -	<endnote about who the hell is Schelling>
      -	.ENDNOTE OFF
      -	were generally the points of discussion presenting the most
      -	of beauty to the imaginative Morella.
      -
      - -As with footnotes, note the obligatory use of the \c -inline escape. +***End version 1.3 change***

      Endnotes differ from footnotes in two ways (other than the fact that endnotes come at the end of a document whereas footnotes appear in the body of the document):

        -
      1. Endnotes are always numbered incrementally throughout a - document. In other words, you don't get a choice of marker styles, - as you do with footnotes. +
      2. When your ENDNOTE_MARKER_STYLE is + NUMBER, endnotes are always numbered + incrementally, starting at "1".
      3. Endnotes MUST be output explicitly; mom does not output them for you. In collated documents, this allows you to choose whether you want the endnotes to appear at the end of each chapter or - section, or grouped together at the very end of the document. + article in a document, or grouped together at the very end + of the document.

      Within endnotes, you may use the document element tags @@ -2387,7 +3181,7 @@

      Endnote behaviour

      -

      +
      When you output endnotes (with ENDNOTES), mom finishes processing the last page of your document, @@ -2424,13 +3218,14 @@

      A Note on Endnote Spacing

      +
      On the endnotes page(s), each new endnote is separated from the previous endnote by a full line space. This can result in a bottom margin that hangs, and is the one instance, other than the use of PARA_SPACE, where mom allows unequal bottom alignment of pages. Should you wish to correct this, by adding or subtracting small amounts -of space between endnotes that appear together on an endnote page, make +of space between endnotes that appear together on an endnotes page, make the adjustment (with ALD, RLD @@ -2444,6 +3239,7 @@

      Endnotes and columnar documents

      +
      Formerly (pre 1.1.6), there was no way to set a document in columns (see COLUMNS) @@ -2457,7 +3253,7 @@

      - Macro: ENDNOTE <toggle> + Macro: ENDNOTE <toggle>
      *See
      HYPER-IMPORTANT NOTE!!! @@ -2475,23 +3271,36 @@ tag. Use PP only to introduce subsequent paragraphs.

      HYPER-IMPORTANT NOTE: -The final word on the +If your +ENDNOTE_MARKER_STYLE +is NUMBER (mom's default), the +final word on the input line that comes immediately before ENDNOTE MUST terminate with a \c -inline escape. Otherwise, the endnote number for the word won't be attached to -it (i.e. mom will insert a word space between the word -and the number). See the +inline escape. See the endnote example above.

      +Additionally, the line after +.ENDNOTE OFF should be entered as if there +were no interruption in the input text, i.e. the line should begin +with a literal space or punctuation mark. See the two +examples, +above. +

      +If your ENDNOTE_MARKER_STYLE is +LINE, do NOT use the \c escape, +and enter the line after .ENDNOTE OFF +normally. +


      -Macro: ENDNOTES +Tag: ENDNOTES

      Unlike footnotes, which mom automatically outputs at the @@ -2520,18 +3329,27 @@

      Endnote control macros

      -Every time you embed an endnote in the body of a document, -mom collects and processes the endnote for -later outputting when you invoke -ENDNOTES. -For this reason, endnote control macros should always be invoked prior -to the first instance of -ENDNOTE/ENDNOTE OFF. +VERY IMPORTANT NOTE!
      +Endnote control macros must always be invoked prior to the first +instance of +ENDNOTE/ENDNOTE OFF. +

      +When you embed endnotes in the body of a document, +mom collects and processes them for later +outputting (when you invoke +ENDNOTES). +By the time you do invoke ENDNOTES, it's much too +late to change your mind about how you want them to look. +

      +My advice? If you're planning to change the default appearance of +endnotes pages, set them up prior to +START. +

      1. General endnotes-pages style control
      2. Endnotes-pages endnote numbering style
          +
        • Endnote marker style--by numbers in the text, or by line number +
        • Endnotes-pages endnote numbering style control
        • Endnote numbering alignment
            @@ -2579,7 +3403,7 @@

            1. General endnotes page style control

            -

            *Endnote family/font/quad

            +

            *Endnote family/font/quad

            See Arguments to the control macros. @@ -2587,14 +3411,16 @@

             .ENDNOTE_FAMILY    default = prevailing document family; default is Times Roman
             .ENDNOTE_FONT      default = roman
            -.ENDNOTE_QUAD      default = justified
            +.ENDNOTE_QUAD*     default = justified
            +
            +*Note: ENDNOTE_QUAD must be set to either L or J
             

            *Endnote point size

            -Macro: ENDNOTE_PT_SIZE <base type size of endnotes> +Macro: ENDNOTE_PT_SIZE <base type size of endnotes>

            Unlike most other control macros that deal with size of document @@ -2633,7 +3459,7 @@

            *Endnote lead

            -Macro: ENDNOTE_LEAD <base leading of endnotes> [ ADJUST ] +Macro: ENDNOTE_LEAD <base leading of endnotes> [ ADJUST ]
            *Does not require a unit of measure; points is assumed @@ -2683,7 +3509,7 @@

            *Singlespace endnotes (TYPEWRITE only)

            -Macro: SINGLESPACE_ENDNOTES <toggle> +Macro: SINGLESPACE_ENDNOTES <toggle>

            If your @@ -2707,7 +3533,7 @@

            *Endnote paragraph indenting

            -Macro: ENDNOTE_PARA_INDENT <amount to indent first line of paragraphs in endnotes> +Macro: ENDNOTE_PARA_INDENT <amount to indent first line of paragraphs in endnotes>
            *Requires a unit of measure @@ -2735,7 +3561,7 @@

            *Endnote paragraph spacing

            -Macro: ENDNOTE_PARA_SPACE <toggle> +Macro: ENDNOTE_PARA_SPACE <toggle>

            ENDNOTE_PARA_SPACE works exactly the same way as @@ -2755,7 +3581,7 @@

            *Turning off column mode during endnotes output

            -Macro: ENDNOTES_NO_COLUMNS <toggle> +Macro: ENDNOTES_NO_COLUMNS <toggle>

            By default, if your document is @@ -2777,7 +3603,7 @@

            *Endnotes-pages page numbering style

            -Macro: ENDNOTES_PAGENUM_STYLE DIGIT | ROMAN | roman | ALPHA | alpha +Macro: ENDNOTES_PAGENUM_STYLE DIGIT | ROMAN | roman | ALPHA | alpha

            Use this macro to set the page numbering style of endnotes pages. @@ -2794,7 +3620,7 @@

            *Setting the first page number of endnotes pages

            -Macro: ENDNOTES_FIRST_PAGENUMBER <page # that appears on page 1 of endnotes> +Macro: ENDNOTES_FIRST_PAGENUMBER <page # that appears on page 1 of endnotes>

            Use this macro with caution. If all endnotes for several @@ -2816,7 +3642,7 @@

            *Omitting a page number on the first page of endnotes

            -Macro: ENDNOTES_NO_FIRST_PAGENUM <toggle> +Macro: ENDNOTES_NO_FIRST_PAGENUM <toggle>

            This macro is for use only if FOOTERS are on. It @@ -2844,7 +3670,6 @@ To restore normal document pagination after endnotes, invoke RESTORE_PAGINATION (again, with no argument) immediately after ENDNOTES. -

            2. Endnotes-page header/footer control

            @@ -2885,7 +3710,7 @@

            *Endnotes page(s) header/footer centre string

            -Macro: ENDNOTES_HEADER_CENTER toggle +Macro: ENDNOTES_HEADER_CENTER toggle

            If your @@ -2901,9 +3726,9 @@ with any argument (OFF, QUIT, Q, X...).

            -

            *Allow headers on endnotes_pages

            +

            *Allow headers on endnotes-pages

            -Macro: ENDNOTES_ALLOWS_HEADERS <none> | ALL +Macro: ENDNOTES_ALLOWS_HEADERS <none> | ALL

            By default, if HEADERS are on, mom @@ -2932,7 +3757,7 @@

            *Endnotes-page first page head (title) string

            -Macro: ENDNOTE_STRING "<head to print at the top of endnotes>" +Macro: ENDNOTE_STRING "<head to print at the top of endnotes>"

            By default, mom prints the word "ENDNOTES" @@ -2954,8 +3779,8 @@

             .ENDNOTE_STRING_FAMILY    default = prevailing document family; default is Times Roman
            -.ENDNOTE_STRING_FONT*     default = bold
            -.ENDNOTE_STRING_SIZE      default = +1
            +.ENDNOTE_STRING_FONT      default = bold
            +.ENDNOTE_STRING_SIZE*     default = +1
             .ENDNOTE_STRING_QUAD      default = centred
             
             *Relative to the size of the endnotes text (set with ENDNOTE_PT_SIZE)
            @@ -2965,7 +3790,7 @@
             
             

            *Endnotes-page head (title) underscoring

            -Macro: ENDNOTE_STRING_UNDERSCORE toggle | 2 +Macro: ENDNOTE_STRING_UNDERSCORE toggle | 2

            Invoked by itself, ENDNOTE_STRING_UNDERSCORE will @@ -2984,7 +3809,7 @@

            *Endnotes-page head (title) automatic capitalization

            -Macro: ENDNOTE_STRING_CAPS toggle +Macro: ENDNOTE_STRING_CAPS toggle

            Invoked by itself, ENDNOTE_STRING_CAPS will @@ -3008,7 +3833,7 @@

            4. Endnote document-identification title

            *Endnote document-identification title string

            -Macro: ENDNOTE_TITLE "<title to identify a document in endnotes>" +Macro: ENDNOTE_TITLE "<title to identify a document in endnotes>"

            By default, mom identifies the document(s) to which @@ -3046,7 +3871,7 @@

            *Endnote document-identification title underscoring

            -Macro: ENDNOTE_TITLE_UNDERSCORE toggle +Macro: ENDNOTE_TITLE_UNDERSCORE toggle

            Invoked by itself, ENDNOTE_TITLE_UNDERSCORE will @@ -3063,6 +3888,106 @@

            5. Endnotes-pages endnote numbering style

            +

            *Endnote marker style

            +

            +The macro to control how endnotes are referenced is +ENDNOTE_MARKER_STYLE. +

            +By default, mom places superscript numbers in +running text +to identify endnotes. However, if you have +line-numbering +turned on, you may instruct mom not to put +superscript numbers in the running text, but rather to reference +endnotes by line number. The command to do this is +

            +

            +	.ENDNOTE_MARKER_STYLE LINE
            +
            + +With ENDNOTE_MARKER_STYLE LINE, mom +will identify endnotes either by single line numbers, or line +ranges. If what you want is a single line number, you need only +invoke .ENDNOTE, without terminating the text +line before it with \c, at the appropriate +place in running text. (Should you wish to revert to +mom's default behaviour of placing a superscript +number in the text to identify an endnote, you can invoke +ENDNOTE_MARKER_STYLE with the argument, +NUMBER. It is not advisable to switch marker +styles within a single document, for aesthetic reasons, but there +is nothing to prevent you from doing so.) +

            +If you want a range of line numbers (e.g. [5-11] ), +insert, directly into the first line of the range you want, the +inline escape, +\*[EN-MARK]. For the terminating line number of +the range, you need only invoke .ENDNOTE, (again, +without attaching \c to the text line before it). +Mom is smart enough to figure out that where +ENDNOTE was invoked represents the terminating +line number. + +

            +Given the impossibility of knowing, in advance, the "string length" +of all the line numbers or ranges of line numbers that will be used +in endnotes (the string length of 12 is two; the string length +of 12-15 is 5), mom cannot "hang" line numbers +and guarantee that they, and the endnote text, will align in a +visually pleasing manner. Consequently, mom sets +the entirety of line-numbered endnotes completely flush left, +including the line numbers themselves. The line +numbers (by default, enclosed in square brackets) are separated from +the beginning of each endnote by a gap, so that a line-numbered +endnote looks approximately like this: +

            +

            +	[1-2]   Notwithstanding, Frye later asserts that Christianity
            +	is "a ghost  with the chains of a foul historical record of
            +	cruelty clanking behind it."
            +
            + +The default gap for PRINTSTYLE TYPESET and +PRINSTYLE TYPEWRITE is 1.5 +ems. +You can change the size of the gap with the macro, +ENDNOTE_LINENUMBER_GAP, which takes, as its single +argument, the size of the gap. The argument requires a +unit of measure, +so, for example, to change the gap to 2 +picas, +you'd do +

            +

            +	.ENDNOTE_LINENUMBER_GAP 2P
            +
            + + +By default, mom puts endnote line numbers inside +square brackets. The style of the brackets may be changed with +the macro, ENDNOTE_LINENUMBER_BRACKETS, which +takes one of three possible arguments: PARENS +("round" brackets), SQUARE (the default) or +BRACES (curly braces). If you prefer a +shortform, the arguments, (, [ or +{ may be used instead. + +

            +If you don't want the numbers enclosed in brackets, you may tell +mom to use a "separator" instead. A common +separator would be the colon, but it can be anything you like. The +macro to do this is ENDNOTE_LINENUMBER_SEPARATOR, +which takes, as its single argument, the separator you want. +(If the argument contains spaces, don't forget to enclose the +argument in double-quotes.) The separator can be composed of +any legal groff character, or any combination of characters. +For example, to get a colon separator after the line number in +line-numbered endnotes, you'd do +

            +

            +	.ENDNOTE_LINENUMBER_SEPARATOR :
            +
            +

            *Endnote numbering style control

            See @@ -3109,7 +4034,7 @@

            - Macro: ENDNOTE_NUMBERS_ALIGN_RIGHT <number of placeholders> + Macro: ENDNOTE_NUMBERS_ALIGN_RIGHT <number of placeholders>

            ENDNOTE_NUMBERS_ALIGN_RIGHT takes one (non-optional) @@ -3132,6 +4057,7 @@ to ensure that the numbers hang and are properly right-aligned.

            +


            @@ -3161,6 +4087,321 @@ +

            Margin notes

            + + +

            +Margin notes are short annotations that appear in either the left +or right margin of a document. Sometimes they comment on the text. +Sometimes they assist in following the "flow" of a document by +summarizing the subject of a portion of text. Sometimes they're +comments to yourself in a draft copy. +

            +The margin notes macros and routines in om.tmac +(mom) are "mommified" versions of the margin notes +macros and routines written by Werner Lemberg and patched by Gaius +Mulley. +

            + +Margin notes behaviour +

            +First things first: before you enter your first margin note, you +must "initialize" margin notes with +MN_INIT. +MN_INIT sets up the style parameters for margin +notes, including things like +font, +family +and +leading. +

            +After initializing margin notes, you create margin notes with the +MN +macro. Based on the argument you pass MN, your +margin note will go in either the left or the right margin. +

            +Margin notes are tricky from a typographic standpoint with respect +to vertical placement. Since the leading of margin notes may +differ from that of +running text, +it's impossible for mom to guess whether to align +the first lines of margin notes with a document +baseline, +whether to align the last lines of margin notes with a document +baseline, or whether to center them, vertically, so that neither +first nor last line aligns with anything! +

            +Given this difficulty, mom always aligns the first +line of any margin note with a document baseline. If you want a +different behaviour, you must adjust the position(s) of margin +notes yourself, on a note by note basis. (See +Adjusting the vertical position of margin notes.) +

            +Generally speaking, mom tries to place margin +notes at the point where you invoke the tag, +MN. +However, in the event that a margin note runs deep, she may not +be able to place a subsequent margin note exactly where you want. +In such an instance, mom will "shift" the margin +note down on the page, placing it one (margin note) +linespace beneath the previous margin note (plus whatever vertical +space is required to get the first line to line up with a baseline +of running text). A warning will be issued, letting you know this +has happened, and where. +

            +Sometimes, if a margin note has to be shifted down, there simply +isn't enough room to start the margin note on the page on which +MN is invoked. In that case, mom +ignores the margin note entirely and issues a warning, letting you +know what she's done, and where. +

            +In the event that a margin note, sucessfully begun on a page, +runs past your bottom margin (or the last line before footnotes +begin), the margin note will "flow" onto the next page. If it is a +"left" margin note, it will continue in the left margin. If it is a +"right" margin note, it will continue in the right margin. +

            +If your document is being set in two columns, mom +will sensibly and automatically set all margin notes pertaining +to the left column in the left margin, and all margin notes +pertaining to the right column in the right margin, regardless of +the "direction" argument you give the MN tag. If +you try to use MN in documents of more than two +columns, mom will ignore all margin notes, and +issue warning for each. +

            +

            Adjusting the vertical position of margin notes

            +

            +When the +leading +of margin notes differs from the leading used throughout a document, +you may want to adjust the vertical position of individual margin +notes. This is most often going to be the case with margin notes +that end near the bottom of the page, where you want the last line of +the margin note to line up with the last line of text on the page. +

            +Adjustments to the vertical position of margin notes must be done +inside the margin note (i.e. after MN), at the +top, before entering text. The commands to use are +\!.ALD +(to lower the margin note), and +\!.RLD +(to raise it). The \! must precede the +macros, or they won't have any effect. + +

            +


            + + + +

            + + Macro: MN_INIT [ ragged | symmetric ] < left-width right-width gutter family+font point-size lead colour hyphenation-flags > + +

            +Before you enter your first margin note, you must initialize +all the parameters associated with margin notes with +MN_INIT. If you forget to do so, +mom will issue a warning and abort. +

            +The argument list is quite long; an +explanation of each argument follows. Any argument whose value you +want to be the default must be entered as "" (i.e. two +double-quotes with no space between them). Defaults for each +argument are given in the explanation below. +

            +[ ragged | symmetric ] +
            +If the first argument is "ragged", both left and right margin notes +will be flush left. If the first argument is "symmetric", left +margin notes will be set flush right, and right margin +notes will be set flush left. The effect is something +like this: +

            +

            +	     A left    This is a meaningless batch        A right
            +	margin note    of text whose sole purpose is      margin note
            +	  with just    to demonstrate how the sym-        with just
            +	a few words    metric argument to MN sets left    a few words
            +	     in it.    and right margin notes.            in it.
            +
            + + +If the argument is omitted, +or given as "", both left and right margin notes will be set +justified. (Justified is usually not a good idea, since the narrow +measure of margin notes makes pleasing justification a near +impossibility.) +

            +left-width +
            +The width of left margin notes. A +unit of measure +must be appended directly onto the argument. The default is to set +left margin notes right out to the edge of the page, which is +almost certainly not what you want, so you should give a value for +this argument if using left margin notes. +

            +right-width +
            +The width of right margin notes. A +unit of measure +must be appended directly onto the argument. The default is to set +right margin notes right out to the edge of the page, which is +almost certainly not what you want, so you should give a value for +this argument if using right margin notes. +

            +gutter +
            +The +gutter +between margin notes and +running text. +A +unit of measure +must be appended directly onto the argument. The gutter applies to +both left and right margin notes. The default is 1 +em. +

            +font +
            +The family+font for margin notes. Yes, that's right: the family +PLUS font combo. For example, if you want Times Roman Medium, +the argument must be TR. If you want Palatino Medium Italic, the +argument must be PI. The default is the same family+font combo used +for a document's paragraph text. +

            +lead +
            +The +leading +of margin notes. lead uses +points +as its unit of measure, so don't tack a unit of measure onto the +end of the argument. The default lead is the same leading as +is used for paragraph text (i.e. the document's base leading). +For convenience and clarity, you may also give the word, +DOC, to this argument, which indicates that the +leading should be the same as the document's base leading. +

            +colour +
            +The colour of margin notes. The colour must be pre-initialized +with +NEWCOLOR +or +XCOLOR. +The default is black. +

            +hyphenation-flags +
            +A number telling groff how you want margin notes +hyphenated. +

            +

            +	1 = hyphenate without restrictions
            +	2 = do not hyphenate the last word on the page
            +	4 = do not hyphenate the last two characters of a word
            +	8 = do not hyphenate the first two characters of a word
            +
            + +The values can be added together, so, for example, if you want +neither the first two nor the last two characters of words +hyphenated, the hyphenation-flag would be 12. The default value is +14 (i.e. 2+4+8). + +

            +


            + + + +

            + + Macro: MN LEFT|RIGHT | <anything> + +

            +Once you've initialized margin notes with +MN_INIT, +you can enter margin notes any time you like with +MN. An argument of LEFT will set +a left margin note. An argument of RIGHT will set +a right margin note. +

            +Any argument, such as OFF (or +QUIT, END, X, +etc) exits the current margin note. + +

            +


            + + + +

            Inserting a blank page into the document

            +

            + + Macro: BLANKPAGE <# of blank pages to insert> + + +

            +This one does exactly what you'd expect -- inserts a blank page into +the document. Mom silently increments the page +number of every blank page and keeps track of +recto/verso +stuff, but otherwise, does nothing. It's up to you, the user, to +figure out what to do with this feature. However, it's worth +noting that without it, inserting completely blank pages, to use +a vernacular Québécois phrase, "c'est pas évident" +(somewhere between "isn't easy", "isn't +obvious" and "isn't fun"). +

            +The argument to BLANK_PAGE is the number of blank +pages to insert. The argument is not optional, hence even if you +only want one blank page, you have to tell mom: +

            +

            +	.BLANKPAGE 1
            +
            + +

            Terminate document processing

            + + +

            +The use of FINIS is optional. If you invoke it +(at the end of a document before +TOC +or +ENDNOTES), +mom +deposits the word END, centred after a blank line, beneath the last +line of the document. END is enclosed between +em-dashes. +

            +Please note that in versions of +mom prior to 1.1.9, FINIS used to +turn off +footers +(if they were on) and page numbering (if page numbers were at the +bottom of the page). Damned if I can recall why I thought anyone +would want this behaviour, but it has been removed. +

            +If you're writing in a language other than English, you can +change what mom prints for END with +the control macro FINIS_STRING. +

            +


            + + +

            Table of contents

          • Additional toc control macros

          • -

            3. Changing the toc header (title) string and style

            @@ -3625,11 +4865,56 @@


            + + +

            + + Macro: TOC_TITLE_ENTRY <"alternate wording for a title entry in the toc"> + +

            +In +collated +documents, the title of each separate document appears in the table +of contents. It may sometimes happen that you don't want the title +as it appears in the toc to be the same as what appears in +the +docheader. +You might, for example, want to shorten it. Or, in the case of +chapters where the docheader contains both a chapter number and a +chapter title, like this +

            +

            +	           Chapter 6
            +	Burning Bush -- Maybe God Was Right
            +
            + +you might want only the chapter title, not the chapter number, to +show up in the toc. (By default, TOC generates +both.) +

            +If you want to change the wording of a title entry in the toc, +simply invoke TOC_TITLE_ENTRY with the desired +wording, enclosed in double-quotes. Using the example, above, +

            +

            +	.CHAPTER 6
            +	.CHAPTER_TITLE "Burning Bush -- Maybe God Was Right"
            +	.TOC_TITLE_ENTRY "Burning Bush"
            +	.DOCTYPE CHAPTER
            +
            + +would identify chapter 6 in the toc simply as "Burning +Bush". + +

            + +


            +

            - Macro: TOC_APPENDS_AUTHOR <none> | <"name(s) of authors"> + Macro: TOC_APPENDS_AUTHOR <none> | <"name(s) of authors">

            In certain kinds of collated documents, different authors are @@ -3662,7 +4947,7 @@

            - Macro: TOC_PADDING <# of placeholders to allow for page number listings> + Macro: TOC_PADDING <# of placeholders to allow for page number listings>

            By default, mom allows room for 3 digits in the @@ -3673,37 +4958,81 @@ .TOC_PADDING 2

  • -
    - - + -

    Inserting a blank page into the document

    +

    - - Macro: BLANKPAGE <# of blank pages to insert> + + Macro: FINIS

    -This one does exactly what you'd expect -- inserts a blank page into -the document. Mom silently increments the page -number of every blank page and keeps track of -recto/verso -stuff, but otherwise, does nothing. It's up to you, the user, to -figure out what to do with this feature. However, it's worth -noting that without it, inserting completely blank pages, to use -a vernacular Québécois phrase, "c'est pas évident" -(somewhere between "isn't easy", "isn't -obvious" and "isn't fun"). +The use of FINIS is optional, but if you use +it, it should be the last macro you invoke in a document (before +ENDNOTES +or +TOC). +See +above +for a description of how FINIS behaves.

    -The argument to BLANK_PAGE is the number of blank -pages to insert. The argument is not optional, hence even if you -only want one blank page, you have to tell mom: +NOTE: If you don't use FINIS, +and you don't want +footers +(if they're on) or a page number at the bottom of the last page of +a document, you have to turn them off manually, as the last two +lines of your document file, like this:

    -	.BLANKPAGE 1
    +	.FOOTERS OFF
    +	.PAGINATE OFF
     
    -
    +

    Changing the FINIS string

    + +

    +By default, FINIS prints the word +END between +em-dashes. +If you'd like mom to print something else +between the dashes, use the FINIS_STRING macro +(anywhere in the document prior to FINIS). +

    +For example, if your document's in French, you'd do +

    +

    +	.FINIS_STRING "FIN"
    +
    + +Double-quotes must enclose the macro's argument. +

    +NOTE: If you pass FINIS_STRING +a blank string, i.e. +

    +

    +	.FINIS_STRING ""
    +
    + +mom will still print the em-dashes if you +invoke FINIS. This, in effect, produces a +short, centred horizontal rule that terminates the document. +(In +PRINTSTYLE TYPEWRITE, +it's a short, dashed line composed of four hyphens.) + +

    Changing the FINIS colour

    +

    +Invoking FINIS_COLOR with a pre-defined (or +"initalized") color changes the colour of both the FINIS +string and the em-dashes that surround it. If you use the +inline escape, +\*[<colorname>], +in the argument passed to FINIS, only the text +will be in the new colour; the em-dashes will be in the default +document colour (usually black). + +

    +


    Next   Prev   Top   diff -ruN groff-1.19.1/contrib/mom/momdoc/docprocessing.html groff-1.19.2/contrib/mom/momdoc/docprocessing.html --- groff-1.19.1/contrib/mom/momdoc/docprocessing.html 2004-03-22 07:18:36.000000000 +0100 +++ groff-1.19.2/contrib/mom/momdoc/docprocessing.html 2005-08-07 09:59:33.000000000 +0200 @@ -1,3 +1,4 @@ + @@ -7,7 +8,7 @@ -Next   +Next   Prev   Back to Table of Contents

    @@ -37,8 +38,11 @@

  • SUBTITLE
  • AUTHOR
  • CHAPTER +
  • CHAPTER_TITLE
  • DRAFT
  • REVISION +
  • COPYRIGHT +
  • MISC
  • The Docstyle Macros -
  • Linebreaks (author linebreaks) +
  • Linebreaks (author linebreaks, also called section breaks) -
  • CREATING A COVER PAGE +
  • CREATING A COVER PAGE
  • WRITING LETTERS
      @@ -341,7 +345,7 @@

      For example, say you want to insert a picture into a document with the special groff macro, PSPIC (see the -grops man page for usage). +groff_tmac man page for usage).

      Pictures aren't usually conveniently sized in multiples of document leading, which means that when you insert the picture, you disrupt @@ -438,11 +442,16 @@

      • TITLE
      • DOCTITLE +
      • COVERTITLE
      • SUBTITLE
      • AUTHOR
      • CHAPTER -- the chapter number
      • DRAFT -- the draft number
      • REVISION -- the revision number +
      • COPYRIGHT -- only used on cover pages +
      • MISC -- only used on cover pages +
      • COVER_TITLE -- only on cover pages; only if needed +
      • DOC_COVER_TITLE -- only on document cover pages; only if needed

      You can use as many or as few as you wish, although at a minimum, @@ -512,7 +521,10 @@ size, margins, family, point size, line space, rag, etc), or any of the document processing macros that set/change/control the appearance of document elements. Think of this as the -"style-sheet " section of a document. +"style-sheet " section of a document. And please note: +you MUST give mom a +PRINTSTYLE +directive before making any such changes.

      Joe Blow wants his story printed in Helvetica, 12 on 14, rag right, with @@ -631,10 +643,11 @@ The reference macros give mom the information she needs to generate -docheaders +docheaders, +page headers, and -page headers. They -must go at the top of any file that uses mom's +covers. +They must go at the top of any file that uses mom's document processing macros.

      @@ -647,8 +660,12 @@

    • SUBTITLE
    • AUTHOR
    • CHAPTER +
    • CHAPTER_TITLE
    • DRAFT
    • REVISION +
    • COPYRIGHT +
    • MISC +
    • COVERTITLE

    @@ -657,7 +674,7 @@

    -Macro: TITLE "<title>" +Macro: TITLE "<title>"
    *Argument must be enclosed in double-quotes @@ -685,8 +702,8 @@


    - -Macro: DOCTITLE "<overall document title>" + +Macro: DOCTITLE "<overall document title>"
    *Argument must be enclosed in double-quotes @@ -733,7 +750,7 @@


    -Macro: SUBTITLE "<subtitle>" +Macro: SUBTITLE "<subtitle>"
    *Argument must be enclosed in double-quotes @@ -749,9 +766,9 @@


    -Macro: AUTHOR "<author string>" [ "<author2 string>" "<author3 string>" ... ] +Macro: AUTHOR "<author string>" [ "<author2 string>" "<author3 string>" ... ]
    -*Multiple arguments must be enclosed in double-quotes +*Multiple arguments must all be enclosed in double-quotes

    Each author string can hold as many names as you like, e.g. @@ -781,7 +798,7 @@


    -Macro: CHAPTER <chapter number> +Macro: CHAPTER <chapter number>

    The chapter number can be in any form you like -- a digit, a roman @@ -794,6 +811,10 @@ She also puts the same thing in the middle of page headers.

    +Please note that if your argument to CHAPTER runs +to more than one word, you must enclose the argument in +double-quotes. +

    If you're not using DOCTYPE CHAPTER, the macro serves no purpose and mom ignores it.

    @@ -818,12 +839,14 @@


    -Macro: CHAPTER_TITLE "<chapter title>" +Macro: CHAPTER_TITLE "<chapter title>" +
    +*Argument must be enclosed in double-quotes

    If, either in addition to or instead of "Chapter #" appearing at the top of chapters, you want your chapter to have a title, use -CHAPTER_TITLE with your title enclosed in +CHAPTER_TITLE, with your title enclosed in double-quotes, like this:

    @@ -832,8 +855,8 @@
     
     If you've used
     CHAPTER to give the chapter a number,
    -"Chapter #" and the title will appear at the top of the
    -chapter, like this:
    +both "Chapter #" and the chapter title will appear at the
    +top of the chapter, like this:
     

                            Chapter 1
    @@ -841,19 +864,28 @@
     
    In such a case, by default, only the chapter's title will appear in the -page headers, not "Chapter #". +page headers, +not "Chapter #".

    If you omit CHAPTER when setting up your reference macros, only the title will appear, both at the top of page one and in subsequent page headers.

    +The style of the chapter title can be altered by +control macros, +e.g. CHAPTER_TITLE_FAMILY, +CHAPTER_TITLE_FONT, etc. The default family, +font and point size are Times Roman, Bold Italic, 4 points larger +than +running text. +


    -Macro: DRAFT <draft #> +Macro: DRAFT <draft #>

    DRAFT only gets used with @@ -920,7 +952,7 @@


    -Macro: REVISION <revision #> +Macro: REVISION <revision #>

    REVISION only gets used with @@ -991,8 +1023,86 @@ .DRAFT_STRING as well, simply supply arguments to either or both.

    -


    + + +
    +

    + +Macro: COPYRIGHT "<copyright info>" +
    +*Argument must be enclosed in double-quotes + +

    +The argument passed to COPYRIGHT is only used on +cover or doc cover pages, and then only if the argument COPYRIGHT is +passed to +COVER +or +DOC_COVER. +Do not include the copyright symbol in the argument passed to +COPYRIGHT; mom puts it in for +you. +

    + + + +


    +

    + +Macro: MISC "<argument 1>" ["<argument 2>" "<argument 3>" ...] +
    +*Multliple arguments must all be enclosed in double-quotes + +

    +The argument(s) passed to MISC are only used on +cover or doc cover pages, and then only if the argument MISC is +passed to +COVER +or +DOC_COVER. +MISC can contain any information you like. Each +argument appears on a separate line at the bottom of the cover or +doc cover page. +

    +For example, if you're submitting an essay where the prof has +requested that you include the course number, his name and the +date, you could do +

    +

    +	.MISC "Music History 101" "Professor Hasbeen" "Dec. 24, 2006"
    +
    + +and the information would appear on the essay's cover page. +

    + + + +


    +

    + +Macro: COVERTITLE "<user defined cover page title>" +
    +Macro: DOC_COVERTITLE "<user defined document cover page title>" +
    +*Argument must be enclosed in double-quotes + +

    +The argument passed to COVERTITLE or +DOC_COVERTITLE is only used on cover or doc cover +pages, and then only if the argument COVERTITLE is passed to +COVER +or +DOC_COVER. +

    +The only time you require a COVERTITLE or +DOC_COVERTITLEis when none of the required first +arguments to COVER or DOC_COVER +fits your needs for the title you want to appear on cover (or doc +cover) pages. + +

    +


    @@ -1027,7 +1137,7 @@

    -Macro: DOCTYPE DEFAULT | CHAPTER | NAMED "<name>" | LETTER +Macro: DOCTYPE DEFAULT | CHAPTER | NAMED "<name>" | LETTER

    The arguments DEFAULT, CHAPTER and NAMED tell mom what to put @@ -1118,7 +1228,7 @@


    -Macro: PRINTSTYLE TYPESET | TYPEWRITE [ SINGLESPACE ] +Macro: PRINTSTYLE TYPESET | TYPEWRITE [ SINGLESPACE ]
    *Required for document processing.
    @@ -1132,10 +1242,16 @@ document processing to take place, mom requires a PRINTSTYLE. If you don't give one, mom will warn you on stderr and print a single -page with a nasty message. Furthermore, PRINTSTYLE -must come before any changes to mom's default -typestyle parameters. (This applies primarily to -PRINTSTYLE TYPESET. +page with a nasty message. +

    +Furthermore, PRINTSTYLE must come before any +changes to mom's default typestyle parameters. +(This applies primarily to, but is by no means restricted to, +PRINTSTYLE TYPESET.) PRINTSTYLE +sets up complete "templates" that include default +papersize, margins, family, fonts, point sizes, and so on. +Therefore, changes to any aspect of document style must come +afterwards.

    TYPESET, as the argument implies, typesets documents (by default in Times Roman; see @@ -1146,20 +1262,22 @@ style control macros of document processing.

    -As mentioned in the above paragraph, PRINTSTYLE -TYPESET must come before any changes to -mom's default typographic settings. For example, +As mentioned above, PRINTSTYLE TYPESET must come +before any changes to mom's default typographic +settings. For example,

    +	.PAPER A4
     	.LS 14
     	.PRINTSTYLE TYPESET
     
    -will not changes mom's default document leading -of 16 points to 14 points, whereas +will not changes mom's default paper size to A4, +nor her default document leading 14 points, whereas
     	.PRINTSTYLE TYPESET
    +	.PAPER A4
     	.LS 14
     
    @@ -1261,6 +1379,7 @@ .UNDERLINE_SLANT restore underlining of italics and pseudo-italics.

    + Additionally, by default, mom underlines quotes (but not @@ -1293,7 +1412,7 @@


    -Macro: COPYSTYLE DRAFT | FINAL +Macro: COPYSTYLE DRAFT | FINAL

    Mom's default COPYSTYLE is @@ -1401,11 +1520,35 @@

    To accomplish such alterations, use the appropriate typesetting macros -(listed below) prior to +(listed below) after +PRINTSTYLE +and before START. -Do NOT use the macros listed in -Changing document-wide typesetting parameters after START -prior to START; they are exclusively for use afterwards. +

    +More than one user has, quite understandably, not fully grasped +the significance of the preceding sentence. The part they've missed +is "after PRINTSTYLE". +

    +Changes to any aspect of the default look and/or formatting +of a mom document must come after +PRINTSTYLE. For example, it might seem natural to +set up page margins at the very top of a document with +

    +

    +	.L_MARGIN 1i
    +	.R_MARGIN 1.5i
    +
    + +However, when you invoke .PRINTSTYLE, those +margins will be overridden. The correct place to set margins--and +all other changes to the look of a document--is after +PRINTSTYLE. + +

    +NOTE: Don't use the macros listed in Changing document-wide typesetting +parameters after START prior to START; they are +exclusively for use afterwards.

    When used before START, @@ -1422,14 +1565,14 @@ (see note) headers/footers or page numbers) ends on each page PAGE If you use PAGE, its final four arguments have the - same meaning as L_ R_ T_ and B_MARGIN above.) + same meaning as L_ R_ T_ and B_MARGIN (above). LL The line length for everything on the page; equivalent to setting the right margin with R_MARGIN FAMILY The family of all type in the document PT_SIZE The point size of type in paragraphs; mom uses this - calculate automatic point size changes (e.g. for heads, - footnotes, quotes, headers, etc) + to calculate automatic point size changes (e.g. for + heads, footnotes, quotes, headers, etc) LS/AUTOLEAD** The leading used in paragraphs; all leading and spacing of running text is calculated from this @@ -1457,7 +1600,6 @@

    Special note on .LEFT, .RIGHT and .CENTER prior to START

    -

    In a word, these three macros have no effect on document processing when invoked prior to START.

    @@ -1477,10 +1619,11 @@ change require that you invoke LEFT, RIGHT or CENTER immediately after every invocation of the tag. +

    Colour

    - +
    Although it doesn't really matter where you define/initialize colours for use in document processing (see NEWCOLOR @@ -1502,6 +1645,26 @@ footnotes, pagenumbers, and so on) must be managed through the use of the document element control macros. +

    +PLEASE NOTE: If you plan to have mom +generate a +table of contents, +do NOT embed colour +inline escapes +(\[<colorname>]) +in the +string arguments +given to any of the +reference macros, +nor in the string arguments given to +.HEAD, +.SUBHEAD +or +.PARAHEAD. +Use, rather, the +control macros +mom provides to automatically colourize these +elements.
    @@ -1509,7 +1672,7 @@


    Adjusting document leading to fill pages


    -Macro: DOC_LEAD_ADJUST toggle +Macro: DOC_LEAD_ADJUST toggle
    *Must come after LS or AUTOLEAD and before START @@ -1584,7 +1747,7 @@

    Managing the docheader


    -Macro: DOCHEADER <toggle> [ distance to advance from top of page ] +Macro: DOCHEADER <toggle> [ distance to advance from top of page ]
    *Must come before START; distance requires a unit of measure @@ -1632,7 +1795,7 @@ DOCHEADER OFF with its optional distance argument to ensure that the body of your document starts where you want. You can even insert a PostScript file (with .PSPIC; -see the grops man page for usage). +see the groff_tmac man page for usage).

    How to change the look of docheaders: docheader control macros

    @@ -1681,7 +1844,7 @@ and a "Chapter Title" (as above), you may find the leading a bit cramped (owing to mom's default docheader -leading. If this is the case, you can adjust the leading either +leading). If this is the case, you can adjust the leading either with DOCHEADER_LEAD or by including the @@ -1695,11 +1858,12 @@
    -

    The docheader macros to:

    +

    The docheader macros to:

      -
    1. Change the starting position +
    2. Change the starting position of the docheader +
    3. Change the family of the entire docheader
    4. Adjust the docheader leading -
    5. Change the family of docheader elements +
    6. Change the family of individual docheader elements
    7. Change the font of docheader elements
    8. Change the colour of the docheader
    9. Adjust the size of docheader elements @@ -1741,7 +1905,33 @@ to place them where you want.

      -

      2. Adjust the leading

      +

      2. Change the family of the entire docheader

      +

      +By default, mom sets the docheader in the same +family used for +running text. +If you'd prefer to have your docheaders set in a different family, +invoke DOCHEADER_FAMILY with the family you want. +The argument for DOCHEADER_FAMILY is the same as +for +FAMILY. +

      +For example, mom's default family for running text +is Times Roman. If you'd like to keep that default, but have the +docheaders set entirely in Helvetica, +

      +

      +	.DOCHEADER_FAMILY H
      +
      + +is how you'd do it. +

      +Please note that if you use DOCHEADER_FAMILY, +you can still alter the family of individual parts of the docheader +with the macros listed +here. + +

      3. Adjust the leading

      The leading @@ -1765,18 +1955,18 @@ is required; points is assumed.

      -

      3. Change the family of docheader elements

      +

      4. Change the family of docheader elements

      The following macros let you change the family of each docheader element separately:

        -
      • TITLE_FAMILY <family> -
      • CHAPTER_TITLE_FAMILY <family> -
      • SUBTITLE_FAMILY <family> -
      • AUTHOR_FAMILY <family> -
      • DOCTYPE_FAMILY <family> (if +
      • TITLE_FAMILY <family> +
      • CHAPTER_TITLE_FAMILY <family> +
      • SUBTITLE_FAMILY <family> +
      • AUTHOR_FAMILY <family> +
      • DOCTYPE_FAMILY <family> (if DOCTYPE is NAMED)

      @@ -1785,18 +1975,18 @@ FAMILY.

      -

      4. Change the font of docheader elements

      +

      5. Change the font of docheader elements

      The following macros let you change the font of each docheader element separately:

        -
      • TITLE_FONT R | B | I | BI -
      • CHAPTER_TITLE_FONT R | B | I | BI -
      • SUBTITLE_FONT R | B | I | BI -
      • AUTHOR_FONT R | B | I | BI -
      • DOCTYPE_FONT R | B | I | BI (if +
      • TITLE_FONT R | B | I | BI +
      • CHAPTER_TITLE_FONT R | B | I | BI +
      • SUBTITLE_FONT R | B | I | BI +
      • AUTHOR_FONT R | B | I | BI +
      • DOCTYPE_FONT R | B | I | BI (if DOCTYPE is NAMED)

      @@ -1806,7 +1996,7 @@ FT.

      -

      5. Change the colour of the docheader

      +

      6. Change the colour of the docheader elements individually

      The following macros let you change the color of each docheader element separately. You must pre-define (or @@ -1816,37 +2006,47 @@ XCOLOR.

        -
      • TITLE_COLOR <colorname> -
      • SUBTITLE_COLOR <colorname> -
      • ATTRIBUTE_COLOR <colorname> -(the "by" string that precedes the author[s] name[s]) -
      • AUTHOR_COLOR <colorname> -
      • DOCTYPE_COLOR <colorname> (if -DOCTYPE is NAMED) +
      • TITLE_COLOR <colorname> +
      • CHAPTER_TITLE_COLOR <colorname> +
          +
        • Note: CHAPTER_TITLE_COLOR is needed + only if you enter both a CHAPTER + reference macro AND a CHAPTER_TITLE + macro. Otherwise, the macro, + TITLE_COLOR takes care of colorizing + the chapter header. +
        +
      • SUBTITLE_COLOR <colorname> +
      • ATTRIBUTE_COLOR <colorname> + (the "by" string that precedes the author[s] name[s]) +
      • AUTHOR_COLOR <colorname> +
      • DOCTYPE_COLOR <colorname> (if + DOCTYPE is NAMED)

      It is not recommended that you embed colour (with the inline escape, \*[<colorname>]) in the strings passed to -TITLE, SUBTITLE, -AUTHOR or the name you give DOCTYPE -NAMED. The strings passed to these macros are used to -generate page +TITLE, CHAPTER_TITLE, +SUBTITLE, AUTHOR or the name you +give DOCTYPE NAMED. The strings passed to these +macros are used to generate page headers and footers. An embedded colour will cause the string to be colourized any time it appears in headers or footers. (If you want headers or footers -colourized, or parts thereof, use the header/footer control macros +colourized, or parts thereof, use the header/footer control macros.)

      + If you want to colourize the entire docheader, use the macro

        -
      • DOCHEADER_COLOR <color name>. +
      • DOCHEADER_COLOR <color name>.
      -

      6. Adjust the size of docheader elements

      +

      7. Adjust the size of docheader elements

      The following macros let you adjust the point size of each docheader element separately. @@ -1860,19 +2060,19 @@ sizes are allowed.

  • -

    3. Enclose page numbers with hyphens (on or off)

    +

    3. Enclose page numbers with hyphens (on or off)

    By default, mom encloses page numbers between hyphens. If you don't want this behaviour, invoke the macro diff -ruN groff-1.19.1/contrib/mom/momdoc/inlines.html groff-1.19.2/contrib/mom/momdoc/inlines.html --- groff-1.19.1/contrib/mom/momdoc/inlines.html 2004-03-22 07:18:36.000000000 +0100 +++ groff-1.19.2/contrib/mom/momdoc/inlines.html 2005-05-14 07:54:53.000000000 +0200 @@ -1,3 +1,4 @@ + @@ -88,6 +89,8 @@

  • Pairwise kerning
  • Horizontal movement
  • Vertical movement +
  • Terminate a line without advancing on the page +
  • Call the next sequential tab without advancing on the page
  • Full measure rules
  • Groff inline escapes @@ -110,26 +113,42 @@

    Changing fonts

    -Mom provides five inlines to change fonts -inline. +Mom provides five escapes for changing fonts +inline:

    -

  • - +
    \*[ROM]Change font to roman -
    \*[IT]Change font to italic -
    \*[BD]Change font to bold -
    \*[BDI]Change font to bold italic -
    \*[PREV]Revert to previous font
    + + + + + + + + + + + + + + + + + + + +
    \*[ROM]Change font to medium roman
    \*[IT]Change font to medium italic
    \*[BD]Change font to bold roman
    \*[BDI]Change font to bold italic
    \*[PREV]Revert to previous font

    -See also -font control with \f -for other ways to change fonts inline. +These escapes are provided for merely for convenience, legibility, +and consistency when typesetting with mom. For +more complete and flexible inline font control, please see +font control with \f.

    NOTE: If you're using the document processing macros, inline font changes remain in effect only for the duration of the -current macro. +current document element tag.

    @@ -205,14 +224,19 @@

    Mom permits inline pairwise kerning through the use of the inline escapes -
    - -
    \*[BU #]
    Closes the space between letters (Back Units). -
    \*[FU #]
    Opens the space between letters (Forward Units). + + + + + + + + +
    \*[BU n]
    Closes the space between letters (Back Units).
    \*[FU n]
    Opens the space between letters (Forward Units).

    -"#" is the number of kern units +"n" is the number of +kern units by which to close or open the space between letters.

    For example, @@ -227,14 +251,15 @@ units closer to the letter A.

    For backward compatibility, the forms -

    - - + + diff -ruN groff-1.19.1/contrib/mom/momdoc/rectoverso.html groff-1.19.2/contrib/mom/momdoc/rectoverso.html --- groff-1.19.1/contrib/mom/momdoc/rectoverso.html 2004-02-22 10:17:08.000000000 +0100 +++ groff-1.19.2/contrib/mom/momdoc/rectoverso.html 2004-06-04 08:43:08.000000000 +0200 @@ -1,3 +1,4 @@ + @@ -234,7 +235,7 @@

     	.COLLATE
    -	.CHAPTER_STRING "Geek Fatigue: Symptoms and Causes"
    +	.CHAPTER_TITLE "Geek Fatigue: Symptoms and Causes"
     	.START
     
    diff -ruN groff-1.19.1/contrib/mom/momdoc/refer.html groff-1.19.2/contrib/mom/momdoc/refer.html --- groff-1.19.1/contrib/mom/momdoc/refer.html 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/contrib/mom/momdoc/refer.html 2005-08-07 09:59:33.000000000 +0200 @@ -0,0 +1,1482 @@ + + + + +Mom -- Bibliographies and References + + + + + +Next   +Prev   +Back to Table of Contents + + +

    + Bibliographies and references +

    +

    +Introduction to bibliographies and references +
    +Tutorial +

    +
    +Index of bibliography and reference macros +

    + + +

    Introduction to bibliographies and references

    + + +Mom provides the ability to automatically format +and generate bibliography pages, as well as footnote or endnote +bibliographic references, or references embedded in text. She +accomplishes this by working in conjunction with a special +groff program called "refer". +

    +refer is a groff +"pre-processor", which is to say that it scans your files looking +for very specific commands (i.e. lines that begin with a period +[dot], just like macros and document element tags). If the +commands aren't there, refer can't do it's job, +and neither can mom. The scanning is done +before any actual mom processing +occurs. +

    +refer is a program that's been around for a long +time. It's powerful and has many, many features. Unfortunately, +the manpage (man refer), while complete and accurate, is +dense and not a good introduction to refer. (It's +a classic manpage Catch-22: the information it contains is most +useful only after you already grasp it.) +

    +In order to get mom users up and running with +refer, this section of mom's +documentation focuses exclusively, in a recipe-like manner, on +what you need to know to use refer satisfactorily +in conjunction with mom. The information and +instructions are not to be taken as +a manual or tutorial on full refer usage. Much has +been left out, on purpose. +

    +It is tempting to provide two levels of documentation, one for +users familiar with refer and one for newcomers +to groff and mom, but such an +approach may muddy the waters for newcomers. Mom's +allegiance, first and foremost, is to newcomers. If you're already +a refer user, the information herein will be useful +for adapting your current refer usage to +mom's way of doing things. If you've never used +refer, the information is essential, and, in many +cases, may be all you need. +

    +(For the benefit of old groff-hands: refer +support in mom is heavily based on the +refer module of the ms macros. The choice +was deliberate so that those wishing to play around with +mom's bibliography formatting style would be +tinkering with the familiar.) +

    +refer requires first that you create a +bibliographic database. From the information contained in the +database, mom formats and generates bibliographies +and references in MLA (Modern Language Association) style. MLA +style is clean, contemporary and flexible, and is widely used in +the humanities, where the range of material that has to be +referenced can run from simple books to live interviews and film. +

    +Once you have created your database, you instruct +refer (and mom) to access entries +in it by supplying keywords from the entries. Depending on what +you've instructed mom to do, she will put the +entries--fully and properly formatted with respect to order, punctuation +and italicization--in footnotes, endnotes, or a full bibliography. +

    +I encourage anyone interested in what MLA style looks like--and, by +extension, how your bibliographies and references will look after +mom formats them--to check out +

    +

    +	http://www.aresearchguide.com/12biblio.html
    +
    + +or any other website or reference book on MLA style. +

    +NOTE: MLA style requires that second and +subsequent lines of individual references be indented. Mom +takes care of this for you with a default indent, which +can be changed with the macro +INDENT_REFS. + + +

    Tutorial

    + +
      +
    1. Creating a refer database +
    2. Required "refer" commands +
    3. Accessing references +
    4. Telling mom where to put references +
    5. Creating bibliography pages +
    6. Invoking groff with mom and refer +
    +

    + +

    1. Creating a refer database

    +

    +The first step in using refer with +mom is setting up your bibliographic database. +The database is a file containing separate entries for each +reference you want to access from your mom files. +The file is not a "mom" file; it is a separate database. +You may set up individual databases for individual documents, or +create a large database that contains all the references you'll +ever need. +

    +Entries ("records") in the database file are separated from each +other by a single, blank line. The records themselves are composed +of single lines ("fields") with no blank lines between them. Each +field begins with a percent sign and a single letter (the "field +identifier") e.g. %A or %T. The letter identifies what part of a +bibliographic entry the field refers to: Author, Title, Publisher, +Date, etc. After the field identifier comes a single space, +followed by the information appropriate to field. No punctuation +should go at the ends of fields; mom adds what's +correct automatically. Do note, however, that author(s) (%A) +requires that you enter the author information exactly as you wish +it to come out (minus the period), including the comma after the +first author's last name. +

    +Here's a sample database containing two records so you can +visualize what the above paragraph says: +

    +

    +%A Schweitzer, Albert
    +%A C.M. Widor
    +%T J.S. Bach
    +%l Ernest Newman
    +%V Vol 2
    +%C London
    +%I Adam and Charles Black
    +%D 1923
    +%O 2 vols
    +%K bach vol 2
    +
    +%A Schaffter, Peter
    +%T The Schumann Proof
    +%C Toronto
    +%I RendezVous Press
    +%D 2004
    +%K schumann schaffter
    +
    + +The order in which you enter fields doesn't matter. +mom and refer will re-arrange +them in the correct order for you. +

    +The meaning of the letters follows. There are, with +refer, quite a few--all uppercase--which have, over +time, come to be "standard". Mom respects these. +However, she adds to the list (mostly the lowercase letters). +

    +

    +	%A Author           -- additional authors may be entered on separate %A
    +	                       lines as in first entry of the sample, above; mom 
    +	                       and refer will figure out what to do with multiple
    +	                       authors according to MLA rules
    +	%T Title            -- either the primary title (e.g. of a book), or the
    +	                       title of an article (e.g. within a book or
    +	                       journal or magazine)
    +	%B Book title       -- the title of a book when %T contains the title
    +	                       of an article; otherwise, use %T for book
    +	                       titles
    +	%R Report number    -- for technical reports
    +	%J Journal name     -- the name of a journal or magazine when %T
    +	                       contains the title of an article
    +	%E Editor           -- additional editors may be entered on separate %E
    +	                       lines (like authors); mom and refer will figure
    +	                       out what to do with them according to MLA rules
    +	%e Edition          -- the number of name of a specific edition
    +	                       (e.g. Second, 2nd, Collector's, etc.)
    +	%V Volume           -- volume number of a journal or series of books
    +	%N Journal number   -- journal or magazine number
    +	%S Series           -- series name for books or journals that are part of
    +	                       a series
    +	%C City             -- the city of publication
    +	%I Publisher        -- the publisher; %I stands for "Issuer"
    +	%D Publication date
    +	%P Page number(s)   -- enter page ranges as, e.g., 22-25
    +	%G Gov't.
    +	   ordering number  -- for government publications
    +	%O Other            -- additional information or comments you want
    +	                       to appear at the end of the reference
    +	%K Keywords         -- any words that will clear up ambiguities
    +	                       resulting from database entries that
    +	                       contain, say, the same author or the
    +	                       same title
    +	%d original
    +	   publication date -- if different from the date
    +	                                   of publication
    +	%a additions        -- for books, any additions to the original work,
    +					       such as the preface to a new edition or a new
    +	                       introduction
    +	%t reprint title    -- if different from a work's original title
    +	%l translator       -- if the translator is not the editor; if more
    +	                        than one translator, this field should contain
    +	                        all the names, with appropriate punctuation
    +	%r translator
    +	   and editor       -- if tr. and ed. are one in the same;
    +	%s site name        -- for web sites, the site name
    +	%c content
    +	   of site          -- for web sites, the content, if unclear
    +	                       (i.e. advertisement, cartoon, blog)
    +	%o organization     -- for web sites, the organization, group or
    +	                       sponsor of the site
    +	%a access date      -- for a website, the date you accessed it
    +	%u URL              -- for websites, the full URL of the site
    +
    + +
    +Tip: If you have hyphenation turned on in your +document (you probably do), mom will hyphenate +your references. This can be a problem because references +typically contain several proper names. Proper names shouldn't be +hyphenated. The solution is to prepend to any proper name in the +database the groff +discretionary hyphen +character, \%, like this: +

    +

    +	%A Hill, \%Reginald
    +
    + +Alternatively, you can turn hyphenation off entirely in +references with the macro, +HYPHENATE_REFSOFF. +

    + +

    2. Required "refer" commands

    +

    +Having set up your database, you now need to put some +refer-specific commands at the top of your +mom file. You cannot skip this step, nor can you +"source" these commands with the groff +primitive, +.so. They must +appear, exactly as shown, in every file requiring bibliographic +references. +

    +refer commands are introduced with a single +line containing .R1, and concluded with a single line +containing .R2. What you put between the .R1 +and .R2 lines are the commands themselves. The commands +should be entered one per line, in lowercase letters, with +no initial period (dot). +

    +Here's an example: +

    +

    +	.R1
    +	no-label-in-text
    +	no-label-in-reference
    +	.R2
    +
    + +There are an awful lot of refer commands. We will +focus only on those required to get mom cooperating +with refer. If you're interested, study the +refer manpage to discover what other commands are +available and how to manipulate them. +

    +At a minimum, all mom files accessing +a bibliographic database must contain the following +refer commands, exactly as shown: +

    + +

    +.R1
    +no-label-in-text
    +no-label-in-reference
    +join-authors ", and " ", " ", and "
    +database <full path to the database>
    +.R2
    +
    + +The first two commands tell refer to let +mom handle everything associated with footnote +and endnote markers, both in the body of the document, and in the +footnotes/endnotes themselves. +

    +The third command is required for mom to handle +multiple authors in proper, MLA style. +

    +The last command, database, assumes you have created +your own database, and do not otherwise have a system-wide +"default" database. "...full path to the database" means the full +path including the database filename, e.g. +/home/user/refer/my_database. +

    If you're already a refer user, feel free to +enter whatever refer commands are necessary to +access the database(s) you want. +

    +With the above refer block, you can embed +references directly into the text of your document, or have them +output as footnotes or endnotes. If you want to "collect" +references for later output on a bibliography page, the block must +read: +

    +

    +.R1
    +no-label-in-text
    +no-label-in-reference
    +join-authors ", and " ", " ", and "
    +database <full path to the database>
    +sort
    +accumulate
    +.R2
    +
    + +

    3. Accessing references

    +

    +References are accessed by putting keywords, all on one line, +between the refer commands .[ and +.]. Both of these commands must appear on separate +lines, by themselves, like this: +

    +

    +	.[
    +	keyword(s)
    +	.]
    +
    + +Keywords are any word, or set of words, that identify a database +record (i.e. a reference) unambiguously. (refer +doesn't like ambiguity.) +

    +If, for example, you want to reference a book by Ray Bradbury, +and the database contains only one book by Bradbury, a suitable +keyword would be "Bradbury". If your database contains several +books by Bradbury, say, Fahrenheit 451 and The Martian +Chronicles, you could reference them with the keywords, "451" +and "Martian". If, in addition to the two books by Bradbury, you +also had one whose title was The Martian Mission, suitable +keywords to reference The Martian Chronicles might be: +

    +

    +	.[                or    .[                   or  .[
    +	Bradbury Martian        Bradbury Chronicles      Martian Chronicles
    +	.]                      .]                       .]
    +
    + +The database field identifier, %K, lets you create special keywords +for references. This can be very handy if you need both a "short" +and a "long" reference to the same work. The short reference might +be used in footnotes; the long one in a bibliography. Consider the +following: +

    +

    +	%A Isherwood, Christopher      %A Isherwood
    +	%T Mr. Norris Changes Trains   %T Mr. Norris Changes Trains
    +	%d 1935                        %K Nor short
    +	%t The Last of Mr. \%Norris
    +	%a Intro. Tom Crawford
    +	%C New York
    +	%I New Directions
    +	%D 1945
    +	%K Norris
    +
    +
    + +To access the shorter reference, you'd do +

    +

    +	.[
    +	Nor short
    +	.]
    +
    + +To access the longer one, you'd do +
    +	.[
    +	Norris
    +	.]
    +
    + +

    4. Telling mom where to put references

    +

    +Mom provides several mechanisms for outputting +references where you want. +

    +

    Embedding references in the document body

    +

    +References may be embedded in the document body, surrounded by +parentheses, square brackets, or braces. Use whichever you prefer, +following the recipes below. +

    +

    +	Parentheses    Square brackets    Braces
    +	-----------    ---------------    ------
    +
    +	.REF(          .REF[              .REF{
    +	.[             .[                 .[
    +	keyword(s)     keyword(s)         keyword(s)
    +	.]             .]                 .]
    +	.REF)          .REF]              .REF}
    +
    + +

    Footnote or endnote references

    +

    +Most times, you'll probably want references in either footnotes or +endnotes. Mom provides a simple mechanism whereby +you can choose which, or even switch back and forth. The primary +tag is +REF, which is used like this: +

    +

    +	.REF
    +	.[
    +	keyword(s)
    +	.]
    +	.REF
    +
    + +REF collects references and outputs them +where you say with the macros, +FOOTNOTE_REFS +or +ENDNOTE_REFS. +Neither +FOOTNOTE_REFS nor ENDNOTE_REFS +requires an argument. All they do is tell REF, +whenever it's invoked, where to put the references. +

    +A recipe for footnote references looks like this: +

    +	.FOOTNOTE_REFS
    +	.REF
    +	.[
    +	keyword(s)
    +	.]
    +	.REF
    +
    + +When FOOTNOTE_REFS are enabled, REF +behaves identically to +FOOTNOTE, +so please read the +HYPER IMPORTANT NOTE +found in the document entry for FOOTNOTE. +

    +The reference between the first and second REF +will be treated as a footnote, as will all subsequent +REF pairs unless you invoke the macro, +ENDNOTE_REFS. +

    +A recipe for endnote references looks like this: +

    +	.ENDNOTE_REFS
    +	.REF
    +	.[
    +	keyword(s)
    +	.]
    +	.REF
    +
    + +The reference between the first and second REF +will be treated as an endnote, as will all subsequent +REF pairs unless you invoke the macro, +FOOTNOTE_REFS. +

    +When ENDNOTE_REFS are enabled, REF +behaves identically to +ENDNOTE, +so please read the +HYPER IMPORTANT NOTE +found in the document entry for ENDNOTE. +

    +The innate flexibility of this scheme allows you to have both +footnote references and endnote references in the same document. +This would be desirable if, say, you wanted "short" references in +footnotes, and complete references in endnotes. +

    + +

    Collected references

    +

    +Sometimes, you may want to put references in input text near +sections of text to which they pertain, but not actually want +them output until later (typically, on a bibliography page). +REF is used for this, too, but you have to make +sure your refer commands block is set up properly. +The recipe for this is: +

    + +

    +.R1
    +no-label-in-text
    +no-label-in-reference
    +join-authors ", and " ", " ", and "
    +database <full path to the database>
    +sort
    +accumulate
    +.R2
    +
    + +After this set up, and provided you don't issue a +FOOTNOTE_REFS or ENDNOTE_REFS +command, all reference between REF pairs will be +collected for later output. +

    +As a precaution, mom will issue a message the +first time you call .REF if neither +FOOTNOTE_REFS nor ENDNOTE_REFS is +in effect. If collected references are what you want, and you have +set up your .R1 - .R2 block as above, you may +safely ignore the message. +

    +LIMITATION: You cannot combine "collected" +references (plain REF) with REFs +that are instructed to go into footnotes (with +FOOTNOTE_REFS) or endnotes (with +ENDNOTE_REFS). This is a limitation imposed by +refer, not mom. + +

    5. Creating bibliography pages

    +

    +Bibliography pages are separate pages, like endnotes, on which +complete bibliographies are output. And, like endnotes pages, just +about every element on them can be designed to your specifications +with control macros. (See +Control macros for bibliographies.) +A bibliography page that uses mom's defaults +begins with the macro, +BIBLIOGRAPHY, +like this: +

    +

    +	.BIBLIOGRAPHY
    +
    + +

    +Following BIBLIOGRAPHY, you have three choices of +how to proceed. +

    +If you have elected to have references collected from within the +body of a document (see above, +Collected references, +for instructions), which assumes you have a refer +command block like the one +here +at the top of your document, you need only do +

    +

    +	.BIBLIOGRAPHY
    +	.[
    +	$LIST$
    +	.]
    +
    + +If you want to create the bibliography by hand (which may be the +case if you've used footnote and/or endnote references throughout +your document), follow this recipe, which assumes you already have a +refer block like the one +here +at the top of your document: +

    +

    +	.BIBLIOGRAPHY
    +	.R1
    +	sort
    +	accumulate
    +	.R2
    +	.[          -+
    +	keyword(s)   |
    +	.]           | "keyword(s)" are keywords identifying the
    +	.[           | particular bibliographic reference you want
    +	keyword(s)   | from your database.  Order doesn't matter here;
    +	.]           | the refer command, sort, takes care of that.
    +	.[           |
    +	keyword(s)   |
    +	.]          -+
    +	.[
    +	$LIST$
    +	.]
    +
    + +Your final choice is to output your whole database. Again, +assuming you have a refer block like the one +here at the top of your file, you need +only do: +

    +

    +	.BIBLIOGRAPHY
    +	.R1
    +	bibliography <full path to database>
    +	.R2
    +
    + +If you haven't put a refer block in +your file already, you can put the whole thing after +BIBLIOGRAPHY, like this: +

    +

    +	.BIBLIOGRAPHY
    +	.R1
    +	no-label-in-text                       -+
    +	no-label-in-reference                   | These are actually optional
    +	database <full path to the database>   -+ 
    +	join-authors ", and " ", " ", and "
    +	bibliography <full path to database>
    +	.R2
    +
    + +Whichever option you choose, mom will output a +full bibliography page, complete with a title (BIBLIOGRAPHY by +default, but that can be changed). + +

    6. Invoking groff with mom and refer

    +

    +So, now you've got a document, formatted properly to use +references processed with refer, what do you do to +output the document? +

    +It's simple. Instead of invoking groff with just +the -mom option, as explained +here, +invoke groff with the -R option as well, like this: +

    +

    +	groff -R -mom filename
    +
    + +
    + +

    +

    Index of bibliography and reference macros

    + +

    + + + +


    +

    Marking off references for footnotes, endnotes, or collection

    +

    + +Tag: REF +

    +The macro, REF, tells mom that +what follows is refer-specific, a +keyword-identified reference from a +refer database. Depending on whether you've +issued a +FOOTNOTE_REFS +or +ENDNOTE_REFS +instruction, REF also tells mom +where to place the reference. If FOOTNOTE_REFS, +the reference will be formatted and placed in a footnote. If +ENDNOTE_REFS, the reference will be collected for +output as an endnote. If you have issued neither instruction, the +reference will be collected for later output, most likely on a +bibliography page. +

    +Before you use REF, you must create a +refer block containing refer +commands (see +Required refer commands +in the tutorial, above). +

    +REF usage always looks like this: +

    +

    +	.REF
    +	.[
    +	keyword(s)
    +	.]
    +	.REF
    +
    + +Notice that REF "brackets" the +refer call, and never takes an argument. +

    +What REF really is is a convenience. One could, +for example, put a reference in a footnote by doing +

    +

    +	.FOOTNOTE
    +	.[
    +	keyword(s)
    +	.]
    +	.FOOTNOTE OFF
    +
    + +However, if you have a lot of references going into footnotes (or +endnotes), it's much shorter to type .REF/.REF than +.FOOTNOTE/.FOOTNOTE OFF. It also helps you +distinguish--visually, in your input file--between footnotes (or +endnotes) which are references, and footnotes (or endnotes) which +are explanatory, or expand on the text. +

    +Additional arguments: If you're using +REF to put references in footnotes and your +footnotes need to be indented, you may (indeed, should) pass +REF the same arguments used to indent footnotes. +See +FOOTNOTE. +

    +Note: +When REF is used with +FOOTNOTE_REFS, +it behaves identically to +FOOTNOTE, +so please read the +HYPER IMPORTANT NOTE +found in the document entry for FOOTNOTE. +

    +When REF is used with +ENDNOTE_REFS, +it behaves identically to +ENDNOTE, +so please read the +HYPER IMPORTANT NOTE +found in the document entry for ENDNOTE. + +
    + + + +


    +

    Instruct REF to put references in footnotes

    +

    + +Macro: FOOTNOTE_REFS +

    +FOOTNOTE_REFS is an instruction to +REF, +saying, "put all subsequent references bracketed by the +REF macro into footnotes." You invoke it by +itself, with no argument. +

    +When FOOTNOTE_REFS is in effect, regular +footnotes, (i.e. those introduced with .FOOTNOTE and +terminated with .FOOTNOTE OFF) continue to behave +normally. +

    +You may switch between FOOTNOTE_REFS and +ENDNOTE_REFS +at any time. +

    +If you have a lot of footnote references, and are identifying +footnotes by line number rather than by markers in the text, you may +want to enable +FOOTNOTES_RUN_ON +in conjunctions with FOOTNOTE_REFS. + +
    + + + +


    +

    Instruct REF to put references in endnotes

    +

    + +Macro: ENDNOTE_REFS +

    +ENDNOTE_REFS is an instruction to +REF, +saying, "add all subsequent references bracketed by the +REF macro to endnotes." You invoke it by +itself, with no argument. +

    +When ENDNOTE_REFS is in effect, +mom continues to format regular endnotes, (i.e. +those introduced with .ENDNOTE and terminated with +.ENDNOTE OFF) in the normal way. +

    +You may switch between ENDNOTE_REFS and +FOOTNOTE_REFS +at any time. + +
    + + + +


    +

    References embedded in text

    +

    + +Macro pair: REF(  ...  REF) +
    +Macro pair: REF[  ...  REF] +
    +Macro pair: REF{  ...  REF} +

    +You may sometimes want to embed references directly into the body +of your documents, typically, but not always, inside parentheses. +Mom makes this possible through the use of the +REF<bracket type> macros. +

    +All three macro pairs, above, are invoked the same way, namely by +introducing the reference with the first ("open") macro of +the REF<bracket type> pair, and +terminating it with the second ("close") +REF<bracket type> of the pair. For +example +

    +

    +	.REF(
    +	.[
    +	keyword(s)
    +	.]
    +	.REF)
    +
    + +will embed a reference in the body of your document, surrounded by +parentheses. .REF[ ... .REF] will +surround the reference with square brackets. +.REF{ ... .REF} will surround it with +curly braces. +
    + + + +
    +

    Manage the second-line indent of references

    +

    + +Macro: INDENT_REFS FOOTNOTE | ENDNOTE | BIBLIO <indent> +
    +*<indent> requires a unit of measure +

    +Proper MLA-style references should have their second, and subsequent +lines, if any, indented. Since mom formats +references in MLA style, she automatically indents second lines. +By default, the indent for the second line of references, +regardless of whether the references appear in footnotes, endnotes, +or bibliographies, is 1.5 +ems +for +PRINSTYLE +TYPESET +and 2 ems for +PRINSTYLE +TYPEWRITE. +

    +If you'd like to change the indent for footnotes, endnotes or +bibliographies, just invoke INDENT_REFS with a +first argument telling mom for which you want the +indent changed, and a second argument saying what you'd like the +indent to be. For example, if you want the second-line indent of +references on a bibliography page to be 3 +picas, +

    +

    +	.INDENT_REFS BIBLIO 3P
    +
    + +is how you'd set it up. +

    +Tip: if you are identifying endnotes by line +number +(ENDNOTE_MARKER_STYLE LINE) +and you have instructed mom to put references +bracketed by +REF +into endnotes (with +ENDNOTE_REFS), +you will probably want to adjust the second-line indent for +references in endnotes, owing to the way mom +formats line-numbered endnotes. Study the output of such +documents to see whether an indent adjustment is required. +
    + + + +


    +

    Enable/disable hyphenation of references

    +

    + +Macro: HYPHENATE_REFS <toggle> +

    +If you have hyphenation turned on for a document (see HY), +and in most cases you probably do, mom will +hyphenate references bracketed by the +REF +macro. Since references typically contain quite a lot of proper +names, which shouldn't be hyphenated, you may want to disable +hyphenation for references. +

    +HYPHENATE_REFS is a toggle macro; +invoking it by itself will turn automatic hyphenation of +REF-bracketed references on (the default). +Invoking it with any other argument (OFF, +NO, X, etc.) will disable +automatic hyphenation for references bracketed by +REF. +

    +An alternative to turning reference hyphenation off is to prepend +to selected proper names in your refer database +the groff +discretionary hyphen +character, \%. (See +here +in the tutorial for an example.) +

    +Note: references embedded in the body of a document +with +REF<bracket type> +are considered part of +running text, +and are hyphenated (or not) according to whether hyphenation +is turned on or off for running text. Therefore, if you want to +disable hyphenation for such references, you must do so +temporarily, with HY, like this: +

    +

    +	.HY OFF
    +	.REF(
    +	.[
    +	keyword(s)
    +	.]
    +	.REF)
    +	.HY
    +
    + +Alternatively, sprinkle your database fields liberally with +\%. +
    + + + +
    +

    Begin a bibliography page

    +

    + +Macro: BIBLIOGRAPHY +
    +

    +If you want to append a bibliography to your document, all you need +do is invoke BIBLIOGRAPHY at the place you want +it. BIBLIOGRAPHY breaks to a new page, prints the +title (BIBLIOGRAPHY by default, but that can be changed), and awaits +refer instructions. How to create bibliographies +is covered in the tutorial section, +Creating bibliography pages. +

    +See the +Bibliography page style control macros +for macros to tweak, design and control the appearance of +bibliography pages. +
    + + + +


    +

    Plain, or numbered list bibliography

    +

    + +Macro: BIBLIOGRAPHY_TYPE PLAIN | LIST [ <list separator> ] [ <list prefix> ] +

    +Mom offers two styles of bibliography output: plain, +or numbered list style. With PLAIN, bibliography +entries are output with no enumerators. With LIST, +each entry is numbered. +

    +Entering .BIBLIOGRPHY_TYPE PLAIN gives you a plain +bibliography. +

    +Entering .BIBLIOGRAPHY_TYPE LIST gives you an enumerated +bibliography. The two optional arguments, +<list separator> and +<list prefix> have the same meaning as +the equivalent arguments to +LIST +(i.e. <separator> and <prefix>). +

    +You may enter BIBLIOGRAPHY_TYPE either before or +after BIBLIOGRAPHY. It must, however, always come +before the refer command to output bibliographies. +(See the tutorial section, +Creating bibliography pages, +for instructions on how to output bibliographies.) +

    +Mom's default BIBLIOGRAPHY_TYPE +is LIST, with a period (dot) as the separator, and +no prefix. + +
    + + + +


    +

    Bibliography page style control

    + +

    +Mom processes bibliography pages in a manner very +similar to the way she processes endnotes pages. The bibliography +page control macros, therefore, behave in the same way as their +endnotes pages equivalents. +
    +

      +
    1. General bibliography page style control + +
    2. Bibliography pages header/footer control + +
    3. Bibliography page head (i.e. the title at the top) control + + +
    +
    + +

    1. General bibliography page style control

    + +

    *Bibliography family/font/quad

    +

    +See +Arguments to the control macros. +

    +

    +.BIBLIOGRAPHY_FAMILY    default = prevailing document family; default is Times Roman
    +.BIBLIOGRAPHY_FONT      default = roman
    +.BIBLIOGRAPHY_QUAD*     default = justified
    +
    +*Note: BIBLIOGRAPHY_QUAD must be set to either L or J
    +
    + + + +

    *Bibliography point size

    +

    +Macro: BIBLIOGRAPHY_PT_SIZE <base type size of bibliography> + +

    +Unlike most other control macros that deal with size of document +elements, BIBLIOGRAPHY_PT_SIZE takes as its argument an +absolute value, relative to nothing. Therefore, the argument represents +the size of bibliography type in +points, +unless you append an alternative +unit of measure. +For example, +

    +

    +	.BIBLIOGRAPHY_PT_SIZE 12
    +
    + +sets the base point size of type on the bibliography page to 12 +points, whereas +

    +

    +	.BIBLIOGRAPHY_PT_SIZE .6i
    +
    + +sets the base point size of type on the bibliography page to 1/6 of an +inch. +

    +The type size set with BIBLIOGRAPHY_PT_SIZE is the size of +type used for the text of the bibliographies, and forms the basis from which +the point size of other bibliography page elements is calculated. +

    +The default for +PRINTSTYLE TYPESET +is 12.5 points (the same default size used in the body of the document). +

    + + + +

    *Bibliography lead

    +

    +Macro: BIBLIOGRAPHY_LEAD <base leading of bibliographies> [ ADJUST ] +
    +*Does not require a unit of measure; points is assumed + +

    +Unlike most other control macros that deal with leading of document +elements, BIBLIOGRAPHY_LEAD takes as its argument an +absolute value, relative to nothing. Therefore, the argument represents +the +leading +of endnotes in +points +unless you append an alternative +unit of measure. +For example, +

    +

    +	.BIBLIOGRAPHY_LEAD 14
    +
    + +sets the base leading of type on the bibliography page to 14 +points, whereas +

    +

    +	.BIBLIOGRAPHY_LEAD .5i
    +
    + +sets the base leading of type on the bibliography page to 1/2 inch. +

    +If you want the leading of bibliographies adjusted to fill the page, +pass BIBLIOGRAPHY_LEAD the optional argument +ADJUST. (See +DOC_LEAD_ADJUST +for an explanation of leading adjustment.) +

    +The default for +PRINTSTYLE TYPESET +is 14 points, adjusted. +

    +NOTE: Even if you give mom a +DOC_LEAD_ADJUST OFF command, she will still, by +default, adjust bibliography leading. You MUST enter +BIBLIOGRAPHY_LEAD <lead> with no +ADJUST argument to disable this default behaviour. +

    + + + +

    *Singlespace bibliographies (TYPEWRITE only)

    +

    +Macro: SINGLESPACE_BIBLIOGRAPHY <toggle> + +

    +If your +PRINTSTYLE +is TYPEWRITE and you use TYPEWRITE's default +double-spacing, bibliographies are double-spaced. If your document +is single-spaced, bibliographies are single-spaced. +

    +If, for some reason, you'd prefer that bibliographies be single-spaced +in an otherwise double-spaced document (including double-spaced +collated +documents), invoke SINGLESPACE_BIBLIOGRAPHY with +with no argument. +

    + + + +

    *Adjusting the space between bibliography entries

    +

    +Macro: BIBLIOGRAPHY_SPACING <amount of space> +
    +*Requires a unit of measure + +

    +By default, mom inserts 1 linespaces between +bibliography entries on bibliography pages. If you'd prefer she +add a different amount of space, instruct her to do so with the +macro, BIBLIOGRAPHY_SPACING. Say, for example, +you'd prefer only 1/2 linespace. That would be done with +

    +

    +	.BIBLIOGRAPHY_SPACING .5v
    +
    + +As with endnotes pages, owing to the space inserted between bibliography +entries, bibliography pages may have hanging bottom margins. +Unlike endnotes pages, mom is sad to report that +there's nothing you can do about this, except a) pray things work +out, or b) set your BIBLIOGRAPHY_SPACING to zero. + + + +

    *Turning off column mode during bibliography output

    +

    +Macro: BIBLIOGRAPHY_NO_COLUMNS <toggle> + +

    +By default, if your document is +set in columns, +mom sets the bibliographies in columns, too. However, +if your document is set in columns and you'd like the bibliographies not +to be, just invoke BIBLIOGRAPHY_NO_COLUMNS with no +argument. The bibliography pages will be set to the full page measure +of your document. +

    +If you output bibliographies at the end of each document in a +collated +document set in columns, column mode will automatically +be reinstated for each document, even with +BIBLIOGRAPHY_NO_COLUMNS turned on. +

    + + + +

    *Bibliography-page page numbering style

    +

    +Macro: BIBLIOGRAPHY_PAGENUM_STYLE DIGIT | ROMAN | roman | ALPHA | alpha + +

    +Use this macro to set the page numbering style of bibliography pages. +The arguments are identical to those for +PAGENUM_STYLE. +The default is digit. You may want to change it +to, say, alpha, which you would do with +

    +

    +	.BIBLIOGRAPHY_PAGENUM_STYLE alpha
    +
    + + + +

    *Setting the first page number of bibliography pages

    +

    +Macro: BIBILOGRAPHY_FIRST_PAGENUMBER <page # that appears on page 1 of bibliographies> + +

    +Use this macro with caution. If all bibliographies for several +collated +documents are to be output at once, i.e. not at the end of each +separate doc, BIBLIOGRAPHY_FIRST_PAGENUMBER tells +mom what page number to put on the first page of +the bibliography. +

    +If you set BIBLIOGRAPHY_FIRST_PAGENUMBER in collated +documents where the bibliographies are output after each separate doc, +you have to reset every separate document's first page number after +COLLATE +and before +START. +

    + + + +

    *Omitting a page number on the first page of bibliographies

    +

    +Macro: BIBLIOGRAPHY_NO_FIRST_PAGENUM <toggle> + +

    +This macro is for use only if FOOTERS are on. It +tells +BIBLIOGRAPHY +not to print a page number on the first bibliography page. +Mom's default is to print the page number. +

    + + + +

    *Suspending pagination of bibliography pages

    +

    +Macro: SUSPEND_PAGINATION +
    +Macro: RESTORE_PAGINATION + +

    +SUSPEND_PAGINATION doesn't take an argument. +Invoked immediately prior to +BIBLIOGRAPHY, +it turns off pagination for the duration of the bibliography. +Mom continues, however to increment page numbers +silently. +

    +To restore normal document pagination after bibliographies, invoke +RESTORE_PAGINATION (again, with no argument) +immediately after you've finished with your bibliography. + +

    2. Bibliography page header/footer control

    +

    + +If you wish to modify what appears in the header/footer that appears +on bibliography pages, make the changes before you invoke +BIBLIOGRAPHY, +not afterwards. +

    +Except in the case of +DOCTYPE CHAPTER, +mom prints the same header or footer used throughout +the document on bibliography pages. Chapters get treated differently +in that, by default, mom does not print the +header/footer centre string (normally the chapter number or chapter +title.) In most cases, this is what you want. However, should you +not want mom to remove the centre string from +the bibliography pages headers/footers, invoke +BIBLIOGRAPHY_HEADER_CENTER +with no argument. +

    +An important change you may want to make is to put the word +"Bibliography" in the header/footer centre position. +To do so, do +

    +

    +	.HEADER_CENTER "Bibliography"
    +	           or
    +	.FOOTER_CENTER "Bibliography"
    +
    + +prior to invoking .BIBLIOGRAPHY. If your +DOCTYPE +is CHAPTER, you must also invoke +BIBLIOGRAPHY_HEADER_CENTER +for the HEADER_CENTER to appear. +

    + +

    *Bibliography page header/footer centre string

    +

    +Macro: BIBLIOGRAPHY_HEADER_CENTER toggle + +

    +If your +DOCTYPE +is CHAPTER and you want mom to include +a centre string in the headers/footers that appear on bibliography pages, +invoke BIBLIOGRAPHY_HEADER_CENTER (or +BIBLIOGRAPHY_FOOTER_CENTER) with no argument. +Mom's default is NOT to print the centre string. +

    +If, for some reason, having enabled the header/footer centre string +on bibliography pages, you wish to disable it, invoke the same macro +with any argument (OFF, QUIT, Q, X...). +

    + +

    *Allow headers on bibliography pages

    +

    +Macro: BIBLIOGRAPHY_ALLOWS_HEADERS <none> | ALL + +

    +By default, if HEADERS are on, mom +prints page headers on all bibliography pages except the first. If you +don't want her to print headers on bibliography pages, do +

    +

    +	.BIBLIOGRAPHY_ALLOWS_HEADERS OFF
    +
    + +If you want headers on every page including the first, do +

    +

    +	.BIBLIOGRAPHY_ALLOWS_HEADERS ALL
    +
    + +NOTE: If FOOTERS are on, +mom prints footers on every bibliography page. This is +a style convention. In mom, there is no such beast +as BIBLIOGRAPHY_ALLOWS_FOOTERS OFF. +

    + +

    3. Bibliography page first page head (title) control

    + + + +

    *Bibliography pages first page head (title) string

    +

    +Macro: BIBLIOGRAPHY_STRING "<head to print at the top of bibliography pages>" + +

    +By default, mom prints the word "BIBLIOGRAPHY" +as a head at the top of the first page of a bibliography. If you want her +to print something else, invoke BIBLIOGRAPHY_STRING with +the bibliography page head you want, surrounded by double-quotes. If +you don't want a head at the top of the first bibliography page, invoke +BIBLIOGRAPHY_STRING with a blank argument (either two +double-quotes side by side -- "" -- or no argument +at all). +

    + + + +

    *Bibliography page first page head (title) control

    +

    +See +Arguments to the control macros. +

    +

    +.BIBLIOGRAPHY_STRING_FAMILY    default = prevailing document family; default is Times Roman
    +.BIBLIOGRAPHY_STRING_FONT      default = bold
    +.BIBLIOGRAPHY_STRING_SIZE*     default = +1
    +.BIBLIOGRAPHY_STRING_QUAD      default = centred
    +
    +*Relative to the size of the bibliography text (set with BIBLIOGRAPHY_PT_SIZE)
    +
    + + + +

    *Bibliography-page head (title) underscoring

    +

    +Macro: BIBLIOGRAPHY_STRING_UNDERSCORE toggle | 2 + +

    +Invoked by itself, BIBLIOGRAPHY_STRING_UNDERSCORE will +underscore the bibliography page head. Invoked with the argument 2 +(i.e. the digit 2), BIBLIOGRAPHY_STRING_UNDERSCORE will +double-underscore the head. Invoked with any other argument, the macro +disables underscoring of the head. +

    +Mom's default is to double-underscore the +head, therefore if you want no underscoring, you must insert +.BIBLIOGRAPHY_STRING_UNDERSCORE OFF (or QUIT, X, NO, +NONE, etc.) into your document prior to outputting a +bibliography with +BIBLIOGRAPHY. + + + +

    *Bibliography-page head (title) automatic capitalization

    +

    +Macro: BIBLIOGRAPHY_STRING_CAPS toggle + +

    +Invoked by itself, BIBLIOGRAPHY_STRING_CAPS will +automatically capitalize the bibliography page head. Invoked with any +other argument, the macro disables automatic capitalization of the +head. +

    +If you're generating a table of contents, you may want the +bibliography page head string in caps, but the toc entry in caps/lower +case. If the argument to +BIBLIOGRAPHY_STRING +is in caps/lower case and BIBLIOGRAPHY_STRING_CAPS is +on, this is exactly what will happen. +

    +Mom's default is to capitalize the bibliography-page +head string. +

    + +
    + +


    +Next   +Prev   +Top   +Back to Table of Contents + + diff -ruN groff-1.19.1/contrib/mom/momdoc/reserved.html groff-1.19.2/contrib/mom/momdoc/reserved.html --- groff-1.19.1/contrib/mom/momdoc/reserved.html 2004-03-22 07:18:37.000000000 +0100 +++ groff-1.19.2/contrib/mom/momdoc/reserved.html 2005-05-14 07:54:53.000000000 +0200 @@ -1,3 +1,4 @@ + @@ -54,20 +55,21 @@ Style ----- -COLOR Change color of text to predefined value -CONDENSE Set percentage of pseudo-condense (alias of - CONDENSE_OR_EXTEND) -EXTEND Set percentage of pseudo-extend (alias of - CONDENSE_OR_EXTEND) -FAMILY Family -FT Font -LL Line length -LS Leading (.vs) -NEWCOLOR Define a text color -PT_SIZE Point size -SETBOLDER Set degree of emboldening (pseudo-bold) in units -SETSLANT Set degree of pseudo-italic -XCOLOR Initialize a color from rgb.txt +COLOR Change color of text to predefined value +CONDENSE Set percentage of pseudo-condense (alias of + CONDENSE_OR_EXTEND) +EXTEND Set percentage of pseudo-extend (alias of + CONDENSE_OR_EXTEND) +FAMILY Family +FT Font +FALLBACK_FONT Font to use whenever FAMILY or FT errors occur +LL Line length +LS Leading (.vs) +NEWCOLOR Define a text color +PT_SIZE Point size +SETBOLDER Set degree of emboldening (pseudo-bold) in units +SETSLANT Set degree of pseudo-italic +XCOLOR Initialize a color from rgb.txt Autolead -------- @@ -182,6 +184,7 @@ +++NUMBER REGISTERS+++ +#ABORT_FT_ERRORS Abort on FT errors? (toggle) #ALD ALD value #ARGS_TO_LIST Tells LIST whether LIST was invoked with a legal arg; controls LIST OFF processing @@ -197,6 +200,7 @@ #BR_INDENT Value of right indent when IB c column mark #CONDENSE Are we in pseudo-condense mode? (toggle) +#CONDENSE_WAS_ON For restoring \*[COND] in DROPCAP #COND_WIDTH Width of pseudo-condensed type (pointsize x $COND_PERCENT) #CURRENT_L_LENGTH Current line length at first invocation of LIST; @@ -205,13 +209,11 @@ #DC_GUT Width of dropcap gutter #DEGREES # of degrees slant for pseudo-italic #ENUMERATOR<n> Number register enumerator for depth <n> in lists -#EXTEND Are we in pseudo-extend mode? (toggle) #EXT_WIDTH Width of pseudo-extended type (pointsize x $EXT_PERCENT) +#EXTEND Are we in pseudo-extend mode? (toggle) +#EXTEND_WAS_ON For restoring \*[EXT] in DROPCAP #FILL_MODE Are we in fill mode (i.e. \n(.u=1)? (toggle) -#FONT_FOR_PAD Used to ensure that the font in effect prior - to PAD is restored at the start of every - iteration of $PAD_STRING #H_INDENT Value of left indent when IH #HL_INDENT Value of the hang when IH #HYPHENATE Hyphenation on? (toggle) @@ -230,6 +232,8 @@ #INDENT_STYLE_RIGHT Indicates IR when #INDENT_ACTIVE=1 (toggle) #INDENT_STYLE_TEMP Indicates IT when #INDENT_ACTIVE=1 (toggle) #IX_WARN Toggles to 1 the first time IX is user-invoked +#JUSTIFY In EW/RW, when BR_AT_LINE_KERN, whether to + break or break-spread preceding line (toggle) #KERN Kern on? (toggle) #LAST_TAB Last tab number set in multi-columns #LEAD Leading (alias) @@ -243,26 +247,33 @@ #NEXT_DEPTH_BACK Next list level back in lists #NEXT_TAB Current tab number + 1 (used in TN) #NEXT_TAB Next tab in an n+1 sequence +#OLD_LEAD Lead in effect prior to changing it with .vs + in .LS #OPEN_CLOSE Manipulates character " to print `` or '' #ORIGINAL_L_LENGTH Used in LIST for IB processing; holds \n(.l p Output line horiz position at end of $PAD_STRING #PAD_COUNT Number of times # was included in arg to PAD -#PAD_LIST_DIGITS Pad list digits to the left? <toggle> +#PAD_LIST_DIGITS Pad list digits to the left? (toggle) #PAD_SPACE Size of padding space #PAGE_LENGTH Page length (alias) #PAGE_WIDTH Page width #PP_ACTIVE Are we in the context of a para? (toggle) -#PRINT_FOOTER_ON_PAGE_1 toggle +#PRINT_FOOTER_ON_PAGE_1 (toggle) +#PSEUDO_FILL Signals that LEFT, RIGHT or CENTER is + in effect (toggled off, i.e. to 0, when + QUAD or JUSTIFY is called) #PT_SIZE Point size (fractional) in units (alias) #Q_AT_TOP Does a quote start at the top of a new page? (toggle) #QUAD In autoquad mode? (toggle) #QUIT Tells LIST whether to exit lists completely - <toggle> + (toggle) #REMOVE Used in LIST OFF cleanup #RESTORE_LEAD Lead value in effect prior to AUTOLEAD #RESTORE_LINE_LENGTH Restores actual line length in RULE +#RESTORE_LN_NUMBER Start linenumbering again with stored + #NEXT_LN? (toggle) #RESTORE_PT_SIZE Stores current point size (in units) prior to underscore #R_INDENT Value of right indent @@ -294,15 +305,18 @@ of LIST #STORED_T_INDENT Current temporary indent at first invocation of LIST -t "mark" register set in T_MARGIN; recalled - in LS and AUTOLEAD if #T_MARGIN_SET is 1 #T_INDENT Value of temporary indent #T_MARGIN Top margin -#T_MARGIN_SET Did we set the top margin with T_MARGIN? - (toggle) #TAB_ACTIVE Are we in a tab? (toggle) #TAB_NUMBER Tab number #TAB_OFFSET Tab indent +#TOP Set to 1 in T_MARGIN, DO_T_MARGIN and ALD; tells + the first LS or AUTOLEAD on a page to maintain + the baseline position prior to the LS call +#TOP_BASELINE_ADJ Amount by which to adjust the baseline position + of the first line on the page if an LS or AUTOLEAD + request differs from the lead current at the end of + the previous page #TOTAL_LISTS Total number of lists in a nest #USER_SET_L_LENGTH Did user invoke LL? (toggle) #USER_SET_TITLE_ITEM Did user invoke TOC_TITLE_ENTRY? @@ -324,13 +338,27 @@ to PAD is restored at the start of every iteration of $PAD_STRING $FONT Font +$FONT_FOR_PAD Used to ensure that the font in effect prior + to PAD is restored at the start of every + iteration of $PAD_STRING $PAD_MARKER Character to mark off padding in PAD $PAD_STRING Arg passed to PAD $QUAD_VALUE Quad value (left, right, centre, justify) -$QUOTE0 `` -$QUOTE1 '' +$QUOTE0 Open quotation marks +$QUOTE1 Close quotation marks +$RESTORE_COND Restores the pseudo-condense value in effect + prior to DROPCAP +$RESTORE_EXT Restores the pseudo-extend value in effect + prior to DROPCAP +$RESTORE_FAM Used to restore the family in effect + prior to DROPCAP +$RESTORE_FT Used to restore the font/fontstyle in effect + prior to DROPCAP +$RESTORE_PT_SIZE Used to restore the point size of normal + running text after a dropcap $RESTORE_QUAD_VALUE Quad value for use in restoring L, R, C, J (after tabs) +$SAVED_STYLE Current style, if there is one (used in FAMILY) $SEPARATOR<n> Separator for depth <n> in lists $SS_VAR Holds + or - sentence space value $ST<#>_FILL Always QUAD if QUAD passed to ST <#> @@ -442,47 +470,88 @@ AUTHOR Author CHAPTER Chapter number CHAPTER_TITLE Chapter title +COPYRIGHT Copyright info (covers only) +DOCTITLE Overall doc title (for collated docs) DRAFT Draft number +MISC Misc info (covers only) REVISION Revision number SUBTITLE Doc subtitle TITLE Doc title +Covers +------ +COVER What goes on cover +COVERS Whether covers get printed (toggle) +COVER_ADVANCE Set vertical start position of cover material +COVER_LEAD Overall leading of covers +COVERTITLE User-defined cover title string +DOC_COVER What goes on doc cover +DOC_COVERS Whether doc covers get printed +DOC_COVER_ADVANCE Set vertical start position of doc cover material +DOC_COVER_LEAD Overall leading of doc covers +DOC_COVERTITLE User-defined doc cover title string + Document style -------------- -COPYSTYLE Output style (DRAFT or FINAL) -DEFAULTS In START, sets defaults -DOCTYPE Kind of doc (DEFAULT, CHAPTER, NAMED, LETTER) -PAGENUMBER Page number that appears on 1st page of doc -PAPER Paper size (LETTER, LEGAL, A4) -PRINTSTYLE Print style (TYPEWRITE or TYPESET) - -Document tags -------------- -BLOCKQUOTE Block-indented, quoted text -COL_BREAK Breaks and spreads line before invocation; moves to - next column on page or 1st col of next page. An alias - of COL_NEXT. -COL_NEXT Moves to next column on page or 1st col of next page -ENDNOTE Endnote -ENDNOTES Output endnotes -EPIGRAPH Epigraph before 1st para -FINIS Prints --END-- -FOOTNOTE Collects footnotes in text for printing at bottom of page -HEAD Section title (main heads) -ITEM Begin a list item -LINEBREAK Break between narrative sections -LIST Initialize a list -PAD_LIST_DIGITS Leave space for two-numeral digit enumerators in a list -PARAHEAD Paragraph head -PP Paragraph -QUOTE Poetic or line for line quotes -RESET_LIST Reset digit or alpha list enumerator -SHIFT_LIST Move a list over to the right -START Prints info collected with doc info macros -SUBHEAD Subheads +COPYSTYLE Output style (DRAFT or FINAL) +DEFAULTS In START, sets defaults +DOCTYPE Kind of doc (DEFAULT, CHAPTER, NAMED, LETTER) +PAGENUMBER Page number that appears on 1st page of doc +PAPER Paper size (LETTER, LEGAL, A4) +PRINTSTYLE Print style (TYPEWRITE or TYPESET) +NUMBER_LINES Number output lines in the left margin + +Document tags and macros +------------------------ +ADD_SPACE Special macro to add space to the top of a pages after + page 1; must be preceded by NEWPAGE +BIBLIOGRAPHY Begin a bibliography page +BIBLIOGRAPHY_TYPE LIST or PLAIN +BLOCKQUOTE Block-indented, quoted text +COL_BREAK Breaks and spreads line before invocation; moves to + next column on page or 1st col of next page. An alias + of COL_NEXT. +COL_NEXT Moves to next column on page or 1st col of next page +ENDNOTE Endnote +ENDNOTE_REFS Send REFs to endnotes +ENDNOTES Output endnotes +EPIGRAPH Epigraph before 1st para +FINIS Prints --END-- +FOOTNOTE Collects footnotes in text for printing at bottom of page +FOOTNOTE_REFS Send REFs to footnotes +HEAD Section title (main heads) +HYPHENATE_REFS Turn on/off hyphenation of REF references +ITEM Begin a list item +LINEBREAK Break between narrative sections +LIST Initialize a list +MN Margin note +MN_INIT Initialize parameters for margin notes +NUMBER_LINES Number text lines +NUMBER_BLOCKQUOTE_LINES Number blockquote lines +NUMBER_QUOTE_LINES Number quote lines +PAD_LIST_DIGITS Leave space for two-numeral digit enumerators + in a list +PARAHEAD Paragraph head +PP Paragraph +QUOTE Poetic or line for line quotes +REF Wrapper around FOOTNOTE or ENDNOTE, depending + on FOOTNOTE_REFS or ENDNOTE_REFS +REF( Begin embedded reference, parens +REF) End embedded reference, parens +REF[ Begin embedded reference, square brackets +REF] End embedded reference, square brackets +REF{ Begin embedded reference, braces +REF} End embedded reference, braces +REF_INDENT Amount of 2nd line indent of references for + footnote, endnote or bibliography refs +RESET_LIST Reset digit or alpha list enumerator +SHIFT_LIST Move a list over to the right +START Sets doc defaults and prints info collected + with doc info macros +SUBHEAD Subheads Headers/footers --------------- +--------------- BREAK_QUOTE Manually break a footnoted quote that crosses a page/column DO_FOOTER Prints footer (after footnote processing, if any) @@ -496,29 +565,18 @@ Alter doc "look" and/or change defaults --------------------------------------- +***General*** + ALWAYS_FULLSPACE_QUOTES Fullspace quotes instead of default 1/2 spacing them. ATTRIBUTE_STRING What to print before author (default is "by") -AUTHOR_FAMILY Family to use for author in doc header -AUTHOR_FONT Font to use for author in doc header -AUTHOR_SIZE ps to use for author in doc header -BLOCKQUOTE_COLOR Blockquote color -BLOCKQUOTE_FAMILY Family to use in blockquotes -BLOCKQUOTE_FONT Font to use in blockquotes -BLOCKQUOTE_QUAD How to quad blockquotes -BLOCKQUOTE_SIZE How much to de/increase point size of bquotes CHAPTER_STRING What to print whenever the word "chapter" is required -CHAPTER_TITLE_FAMILY Family to use for chapter title in doc header -CHAPTER_TITLE_FONT Font to use for chapter title in doc header -CHAPTER_TITLE_SIZE ps in/decrease of chapter title - (relative to size of running text) COLUMNS Print in columns DOC_FAMILY Overall doc family DOCHEADER Print doc header? DOCHEADER_ADVANCE Start position of docheader (relative to top of page) -DOCHEADER_COLOR Color of docheader DOCHEADER_LEAD +|- value applied to #DOC_LEAD to in/decrease leading of doc header DOC_LEAD_ADJUST Adjust #DOC_LEAD to fill page to #B_MARGIN @@ -526,103 +584,119 @@ DOC_LEFT_MARGIN Doc left margin DOC_LINE_LENGTH Doc line length DOC_PT_SIZE Overall doc point size -DOC_QUAD Overall quad of document DOC_RIGHT_MARGIN Doc right margin DOC_TITLE Overall doc title that gets printed in headers/footers (mostly for use with collated docs where each doc is an article with a different title -DOCTYPE_FAMILY Family to use for doctype string in doc header -DOCTYPE_FONT Font to use for doctype string in doc header -DOCTYPE_SIZE ps to use for doctype string in doc header -DOCTYPE Type of doc (DEFAULT, CHAPTER, NAMED, LETTER) -DO_QUOTE Print quote (invoked internally from QUOTE or - BLOCKQUOTE) DRAFT_STRING What to print whenever the word "draft" is required DRAFT_WITH_PAGENUMBER Attach draft/revision info to page number (instead of putting it HEADER centre) -ENDNOTE_FAMILY Family for endnotes -ENDNOTE_FONT Font for endnotes -ENDNOTE_LEAD Leading for endnotes page -ENDNOTE_PARA_INDENT First line indent of paras in multi-para - endnotes -ENDNOTE_PARA_SPACE Whether to space paras in multi-para endnotes -ENDNOTE_PT_SIZE Base point size for endnotes page -ENDNOTE_QUAD Endnote quad -ENDNOTE_STRING Endnotes page head -ENDNOTE_STRING_CAPS Capitalize the endnotes string -ENDNOTE_STRING_FAMILY Family for endnotes page head -ENDNOTE_STRING_FONT Font for endnotes page head -ENDNOTE_STRING_QUAD Quad direction for endnotes page head -ENDNOTE_STRING_SIZE Size for endnotes page head*** -ENDNOTE_STRING_UNDERSCORE Underscoring of endnotes page head -ENDNOTE_TITLE Endnotes identifying title -ENDNOTE_TITLE_FAMILY Family for endnotes identifying title -ENDNOTE_TITLE_FONT Font for endnotes identifying title -ENDNOTE_TITLE_QUAD Quad direction for endnotes identifying title -ENDNOTE_TITLE_SIZE Size for endnotes identifying title*** -ENDNOTE_TITLE_UNDERSCORE Underscoring of endnotes identifying title -ENDNOTE_NUMBER_FAMILY Family of endnote numbers -ENDNOTE_NUMBER_FONT Font of endnote numbers -ENDNOTE_NUMBER_SIZE Size of endnote numbers*** -ENDNOTE_NUMBERS_ALIGN_RIGHT Hang endnote numbers and align right -ENDNOTE_NUMBERS_ALIGN_LEFT Don't hang endnote numbers and align left -ENDNOTES_ALLOWS_HEADERS Page headers on endnotes pages? (toggle) -ENDNOTES_FIRST_PAGENUMBER Page number to appear on page 1 of endnotes - pages -ENDNOTES_HDRFTR_CENTER Print header/footer centre string on endnotes - pages? -ENDNOTES_HEADER_CENTER Print header centre string on endnotes pages? -ENDNOTES_FOOTER_CENTER Print footer centre string on endnotes pages? -ENDNOTES_NO_COLUMNS Turn columnar mode off for endnotes pages -ENDNOTES_NO_FIRST_PAGENUM Don't print a pagenumber on page 1 of - endnotes. -ENDNOTES_PAGENUM_STYLE Set numbering style for endnotes pages page - numbers +REVISION_STRING What to print whenever the word "revision" + is required + +***Covers*** + +COVER_ADVANCE Vertical place on page to start outputting + cover material +COVER_LEAD Lead in/decrease for cover pages +DOC_COVER_ADVANCE Vertical place on page to start outputting + doc cover material +DOC_COVER_LEAD Lead in/decrease for doc cover pages + +***Epigraphs and finis*** + EPIGRAPH_AUTOLEAD Autolead value for epigraphs -EPIGRAPH_COLOR Epigraph color -EPIGRAPH_FAMILY Family to use in epigraphs -EPIGRAPH_FONT Font to use in epigraphs EPIGRAPH_INDENT Value by which to multiply PP_INDENT for block epigraphs -EPIGRAPH_QUAD Quad value of block style epigraphs -EPIGRAPH_SIZE ps de/increase of epigraphs* -FINIS_COLOR Finis string color FINIS_STRING What to print when FINIS is invoked + +***Footnotes*** + +FOOTNOTE_AUTOLEAD Autolead to use in footnotes +FOOTNOTE_LINENUMBER_BRACKETS Brackets for footnote linenumbers +FOOTNOTE_LINENUMBER_SEPARATOR Separator for footnote linenumbers +FOOTNOTE_MARKERS Turns footnote markers on or off +FOOTNOTE_MARKER_STYLE STAR or NUMBER; default=STAR +FOOTNOTE_RULE_ADJ # of points to raise footnote rule from its + baseline +FOOTNOTE_RULE_LENGTH Length of footnote separator rule +FOOTNOTE_RULE Turns printing of fn separator rule on or off; + default is on +FOOTNOTE_SPACING Post footnote item spacing +FOOTNOTES_RUN_ON Run footnotes on (line numbering mode only) +RESET_FOOTNOTE_NUMBER Reset fn# to 1, or, if arg PAGE, reset + automatically to 1 on every page +RUNON_WARNING Utility macro; warns if FOOTNOTES_RUN_ON + was called when fn marker style is STAR or NUMBER + +***Endnotes*** + +ENDNOTE_LEAD Leading for endnotes page +ENDNOTE_LINENUMBER_BRACKETS Brackets around line numbers identifying + endnotes and text +ENDNOTE_LINENUMBER_GAP Amount of space to leave between line +ENDNOTE_LINENUMBER_SEPARATOR Separator between line numbers identifying + endnotes and the endnote item text + endnotes and text +ENDNOTE_MARKER_STYLE NUMBER or LINE +ENDNOTE_NUMBERS_ALIGN_RIGHT Hang endnote numbers and align right +ENDNOTE_NUMBERS_ALIGN_LEFT Don't hang endnote numbers and align left +ENDNOTE_PARA_INDENT First line indent of paras in multi-para + endnotes +ENDNOTE_PARA_SPACE Whether to space paras in multi-para endnotes +ENDNOTE_PT_SIZE Base point size for endnotes page +ENDNOTE_STRING Endnotes page head +ENDNOTE_STRING_CAPS Capitalize the endnotes string +ENDNOTE_STRING_UNDERSCORE Underscoring of endnotes page head +ENDNOTE_TITLE Endnotes identifying title +ENDNOTE_TITLE_SPACE Distance from top of page to endnotest title +ENDNOTE_TITLE_UNDERSCORE Underscoring of endnotes identifying title +ENDNOTES_ALLOWS_HEADERS Page headers on endnotes pages? (toggle) +ENDNOTES_FIRST_PAGENUMBER Page number to appear on page 1 of endnotes + pages +ENDNOTES_HDRFTR_CENTER Print header/footer centre string on endnotes + pages? +ENDNOTES_HEADER_CENTER Print header centre string on endnotes pages? +ENDNOTES_FOOTER_CENTER Print footer centre string on endnotes pages? +ENDNOTES_NO_COLUMNS Turn columnar mode off for endnotes pages +ENDNOTES_NO_FIRST_PAGENUM Don't print a pagenumber on page 1 of + endnotes. +ENDNOTES_PAGENUM_STYLE Set numbering style for endnotes pages page + numbers +SINGLESPACE_ENDNOTES Single space TYPEWRITE endnotes + +***Bibliographies*** + +BIBLIOGRAPHY_ALLOWS_HEADERS Allow headers on bib pages +BIBLIOGRAPHY_FIRST_PAGENUMBER Starting page number for bibliographies +BIBLIOGRAPHY_HDRFTR_CENTER Header/footer center string for bib pages +BIBLIOGRAPHY_LEAD Base lead of bib pages +BIBLIOGRAPHY_NO_COLUMNS De-columnize bibliographies +BIBLIOGRAPHY_NO_FIRST_PAGENUM Don't print a page number on the first + page of bibliographies +BIBLIOGRAPHY_PAGENUM_STYLE Format for bib pages page numbering +BIBLIOGRAPHY_PT_SIZE Base point size for bib pages +BIBLIOGRAPHY_SPACING Post bib entry space +BIBLIOGRAPHY_STRING String for bib title +BIBLIOGRAPHY_STRING_CAPS Capitalize bib title string +BIBLIOGRAPHY_STRING_UNDERSCORE Underscore bib title string +SINGLESPACE_BIBLIOGRAPHY Singlespace bibs if PRINTSTYLE TYPEWRITE + +***Headers and footers*** + FOOTER_COLOR Footer color FOOTER_GAP Distance between running text and footer FOOTER_MARGIN Distance from footer to bottom of page FOOTERS Turns footers on or off -FOOTNOTE_COLOR Footnote color -FOOTNOTE_AUTOLEAD Autolead to use in footnotes -FOOTNOTE_FAMILY Family to use in footnotes -FOOTNOTE_FONT Font to use in footnotes -FOOTNOTE_MARKERS Turns footnote markers on or off -FOOTNOTE_MARKER_STYLE STAR or NUMBER; default=STAR -FOOTNOTE_QUAD Quad to use in footnotes -FOOTNOTE_RULE_ADJ # of points to raise footnote rule from its - baseline -FOOTNOTE_RULE_LENGTH Length of footnote separator rule -FOOTNOTE_RULE Turns printing of fn separator rule on or off; - default is on -FOOTNOTE_SIZE ps of footnotes HDRFTR_CENTER String to go in centre part of header/footer; default doctype HDRFTR_CENTER_CAPS Centre part of header/footer in caps? (toggle) -HDRFTR_CENTER_FAMILY Family of centre part of header/footer -HDRFTR_CENTER_FONT Font of centre part of header/footer HDRFTR_CENTER_PAD Pad hdrftr CENTER left or right by specified amount -HDRFTR_CENTER_SIZE ps in/decrease of CENTER part of header/footer** -HDRFTR_COLOR Header/footer color -HDRFTR_FAMILY Family to use in the headers/footers HDRFTR_GAP Distance from header/footer to running text HDRFTR_LEFT_CAPS Left part of header/footer in caps? (toggle) -HDRFTR_LEFT_FAMILY Family of left part of header/footer -HDRFTR_LEFT_FONT Font of left part of header/footer -HDRFTR_LEFT_SIZE ps in/decrease of left part of - headers/footers** HDRFTR_LEFT String to go in left part of header/footer; default is AUTHOR_1 HDRFTR_LEFT The header/footer left string @@ -632,43 +706,19 @@ HDRFTR_RECTO User-defined, single string recto header/footer HDRFTR_RIGHT_CAPS Right part of header/footer in caps? (toggle) -HDRFTR_RIGHT_FAMILY Family of right part of headers/footers -HDRFTR_RIGHT_FONT Font of right part of headers/footers -HDRFTR_RIGHT_SIZE Size of right part of headers/footers HDRFTR_RIGHT The header/footer right string -HDRFTR_RULE_COLOR Header/footer rule color HDRFTR_RULE_GAP Space between header/footer and header/footer rule HDRFTR_RULE_INTERNAL Prints the header/footer rule HDRFTR_RULE Turns header/footer rule on or off -HDRFTR_RULE Turns header/footer rule on or off. When invoked internally, prints the rule. -HDRFTR_SIZE ps in/decrease of headers/footers* HDRFTR_VERSO User-defined, single string verso header/footer -HEAD_CAPS Print section titles in caps? (toggle) -HEAD_COLOR Head color -HEADER_GAP Space between header and running text -HEADER_MARGIN Space from top of page to header HEADERS Turns headers on or off -HEAD_FAMILY Family to use in section titles -HEAD_FONT Font to use in section titles -HEAD_QUAD Quad value of section titles -HEAD_SIZE How much to in/decrease point size of section - titles* -HEAD_SPACE Give HEADs 2 line-spaces before. If OFF, - only 1. Default is on. -HEAD_UNDERLINE Underline section titles? (toggle) -INDENT_FIRST_PARAS Indent 1st paras? (doc default=not indented) -ITALIC_MEANS_ITALIC For TYPEWRITE; render .FT I in italic. -LINEBREAK_CHAR Linebreak character, iterations and positioning -LINEBREAK_COLOR Linebreak color -NUMBER_HEADS Print head numbers -NUMBER_PARAHEADS Print parahead numbers -NUMBER_SUBHEADS Print subhead numbers -PAGENUM_COLOR Page number color -PAGENUM_FAMILY Family to use in footers -PAGENUM_FONT Font to use for page numbers +SWITCH_HDRFTR Switch HDRFTR_LEFT and HDRFTR_RIGHT + +***Page numbering*** + PAGENUM_HYPHENS Turns on/off hyphens surrounding page numbers PAGENUM_ON_FIRST_PAGE Print page number on first page when footers are on (toggle) @@ -677,91 +727,128 @@ PAGENUM_SIZE How much to in/decrease point size of page numbers* PAGENUM_STYLE Page # in roman, Arabic, or alphabetic -PARAHEAD_COLOR Parahead color -PARAHEAD_FAMILY Family to use for paraheads -PARAHEAD_FONT Font to use for paraheads +RESTORE_PAGINATION Restore pagination after outputting non- + paginated endnotes. +SUSPEND_PAGINATION Suspend pagination prior to outputting + endnotes + +***Heads*** + +HEADER_GAP Space between header and running text +HEADER_MARGIN Space from top of page to header +HEAD_CAPS Print section titles in caps? (toggle) +HEAD_SPACE Give HEADs 2 line-spaces before. If OFF, + only 1. Default is on. +HEAD_UNDERLINE Underline section titles? (toggle) +NUMBER_HEADS Print head numbers +RESET_HEAD_NUMBER Reset head number + +***Subheads*** + +NUMBER_SUBHEADS Print subhead numbers +RESET_SUBHEAD_NUMBER Reset subhead number + +***Para heads*** + +NUMBER_PARAHEADS Print parahead numbers PARAHEAD_INDENT How much to indent paraheads -PARAHEAD_SIZE Size of paraheads* +RESET_PARAHEAD_NUMBER Reset parahead number + +***Paragraphs*** + +INDENT_FIRST_PARAS Indent 1st paras? (doc default=not indented) PARA_INDENT Size of para indent PARA_SPACE Put a line space before paras PP_FONT Overall doc font -PROCESS_SHIM Calculates #SHIM when \n(.d is lower on the - page than #T_MARGIN -QUOTE_COLOR Quote (poetic) color -QUOTE_FAMILY Family to use in pquotes -QUOTE_FONT Font to use in pquotes -QUOTE_INDENT Value by which to multiply PP_INDENT for - block quotes -QUOTE_SIZE How much to de/increase point size of - pquotes* -RESET_FOOTNOTE_NUMBER Reset fn# to 1, or, if arg PAGE, reset - automatically to 1 on every page -RESET_HEAD_NUMBER Reset head number -RESET_PARAHEAD_NUMBER Reset parahead number -RESET_SUBHEAD_NUMBER Reset subhead number -RESTORE_PAGINATION Restore pagination after outputting non- - paginated endnotes. -REVISION_STRING What to print whenever the word "revision" - is required -SHIM Advance to next "legal" baseline -SINGLESPACE_ENDNOTES Single space TYPEWRITE endnotes + +***Quotes*** + +Q_FITS Utility macro for DO_QUOTE +Q_NOFIT Utility macro for DO_QUOTE +QUOTE_AUTOLEAD Leading of (block)quotes + +***Line/section breaks*** + +LINEBREAK_CHAR Linebreak character, iterations and positioning + +***Printstyle TYPEWRITE*** + +ITALIC_MEANS_ITALIC For TYPEWRITE; render .FT I in italic. SLANT_MEANS_SLANT In TYPEWRITE, render \*[SLANT] as slant -SUBHEAD_COLOR Subhead color -SUBHEAD_FAMILY Family to use in subheads -SUBHEAD_FONT Font to use in subheads -SUBHEAD_SIZE How much to in/decrease point size of - subheads* -SUBTITLE_FAMILY Family to use for subtitle in doc header -SUBTITLE_FONT Font to use for subtitle in doc header -SUBTITLE_SIZE ps to use for subtitle in doc header -SUSPEND_PAGINATION Suspend pagination prior to outputting - endnotes -SWITCH_HDRFTR Switch HDRFTR_LEFT and HDRFTR_RIGHT -TITLE_FAMILY Family to use for title in doc headers -TITLE_FONT Font to use for title in doc headers -TITLE_SIZE How much to in/decrease title at start of doc* +UNDERLINE_ITALIC In TYPEWRITE, render .FT I as underlined +UNDERLINE_QUOTES In TYPEWRITE, underline quotes? (toggle) +UNDERLINE_SLANT In TYPEWRITE, render \*[SLANT] as underlined + +***Table of contents*** + TOC_APPENDS_AUTHORS Appends author(s) to toc doc title entries TOC_LEAD Leading of toc pages -TOC_FAMILY Family to use on toc pages -TOC_HEADER_FAMILY Family to use for "Contents" -TOC_HEADER_FONT Font to use for "Contents" TOC_PADDING Number of placeholders for toc entries page numbers -TOC_PN_FAMILY Family to use for toc entries page numbers -TOC_PN_FONT Font to use for toc entries page numbers -TOC_PN_SIZE How much to in/decrease point size of - toc entries page numbers**** -TOC_HEAD_FAMILY Family of toc head entries -TOC_HEAD_FONT Font of toc head entries TOC_HEAD_INDENT Indent of toc head entries -TOC_HEAD_SIZE How much to in/decrease ps of head entries**** -TOC_HEADER_QUAD Quad direction for "Contents" -TOC_HEADER_SIZE How much to in/decrease point size of - "Contents"**** TOC_HEADER_STRING TOC header string (default=Contents) TOC_PAGENUM_STYLE Page numbering style (hdrftr nums) of toc pages -TOC_PT_SIZE Point size to use on toc pages TOC_RV_SWITCH Switch L/R margins of toc pages -TOC_PARAHEAD_FAMILY Family of toc parahead entries -TOC_PARAHEAD_FONT Font of toc parahead entries TOC_PARAHEAD_INDENT Indent of toc parahead entries -TOC_PARAHEAD_SIZE How much to in/decrease ps of parahead - entries**** -TOC_SUBHEAD_FAMILY Family of toc subhead entries -TOC_SUBHEAD_FONT Font of toc subhead entries TOC_SUBHEAD_INDENT Indent of toc subhead entries -TOC_SUBHEAD_SIZE How much to in/decrease ps of subhead - entries**** TOC_TITLE_ENTRY User supplied toc doc title entry -TOC_TITLE_FAMILY Family of toc doc title entries -TOC_TITLE_FONT Font of toc doc title entries TOC_TITLE_INDENT Indent of toc doc title entries -TOC_TITLE_SIZE How much to in/decrease ps of doc title - entries**** -UNDERLINE_ITALIC In TYPEWRITE, render .FT I as underlined -UNDERLINE_QUOTES In TYPEWRITE, underline quotes? (toggle) -UNDERLINE_SLANT In TYPEWRITE, render \*[SLANT] as underlined + +***Aliases for headers and footers*** +HEADER_SIZE HDRFTR_SIZE +HEADER_RIGHT_PS HDRFTR_RIGHT_SIZE +HEADER_RIGHT_SIZE HDRFTR_RIGHT_SIZE +HEADER_RIGHT_FAM HDRFTR_RIGHT_FAMILY +HEADER_RIGHT_FAMILY HDRFTR_RIGHT_FAMILY +HEADER_RIGHT_FONT HDRFTR_RIGHT_FONT +HEADER_RIGHT_FT HDRFTR_RIGHT_FONT +HEADER_LEFT_PS HDRFTR_LEFT_SIZE +HEADER_LEFT_SIZE HDRFTR_LEFT_SIZE +HEADER_LEFT_FAM HDRFTR_LEFT_FAMILY +HEADER_LEFT_FAMILY HDRFTR_LEFT_FAMILY +HEADER_LEFT_FONT HDRFTR_LEFT_FONT +HEADER_LEFT_FT HDRFTR_LEFT_FONT +HEADER_CENTRE_PS HDRFTR_CENTER_SIZE +HEADER_CENTRE_SIZE HDRFTR_CENTER_SIZE +HEADER_FAM HDRFTR_FAMILY +HEADER_FAMILY HDRFTR_FAMILY +HEADER_CENTRE_FAM HDRFTR_CENTER_FAMILY +HEADER_CENTRE_FAMILY HDRFTR_CENTER_FAMILY +HEADER_CENTRE_FONT HDRFTR_CENTER_FONT +HEADER_CENTRE_FT HDRFTR_CENTER_FONT +HEADER_CENTER_PS HDRFTR_CENTER_SIZE +HEADER_CENTER_SIZE HDRFTR_CENTER_SIZE +HEADER_CENTER_FAM HDRFTR_CENTER_FAMILY +HEADER_CENTER_FAMILY HDRFTR_CENTER_FAMILY +HEADER_CENTER_FONT HDRFTR_CENTER_FONT +HEADER_CENTER_FT HDRFTR_CENTER_FONT +FOOTER_SIZE HDRFTR_SIZE +FOOTER_RIGHT_PS HDRFTR_RIGHT_SIZE +FOOTER_RIGHT_SIZE HDRFTR_RIGHT_SIZE +FOOTER_RIGHT_FAM HDRFTR_RIGHT_FAMILY +FOOTER_RIGHT_FAMILY HDRFTR_RIGHT_FAMILY +FOOTER_RIGHT_FONT HDRFTR_RIGHT_FONT +FOOTER_RIGHT_FT HDRFTR_RIGHT_FONT +FOOTER_LEFT_PS HDRFTR_LEFT_SIZE +FOOTER_LEFT_SIZE HDRFTR_LEFT_SIZE +FOOTER_LEFT_FAM HDRFTR_LEFT_FAMILY +FOOTER_LEFT_FAMILY HDRFTR_LEFT_FAMILY +FOOTER_LEFT_FONT HDRFTR_LEFT_FONT +FOOTER_LEFT_FT HDRFTR_LEFT_FONT +FOOTER_CENTRE_PS HDRFTR_CENTER_SIZE +FOOTER_CENTRE_SIZE HDRFTR_CENTER_SIZE +FOOTER_FAM HDRFTR_FAMILY +FOOTER_FAMILY HDRFTR_FAMILY +FOOTER_CENTRE_FAM HDRFTR_CENTER_FAMILY +FOOTER_CENTRE_FAMILY HDRFTR_CENTER_FAMILY +FOOTER_CENTRE_FT HDRFTR_CENTER_FONT +FOOTER_CENTER_PS HDRFTR_CENTER_SIZE +FOOTER_CENTER_SIZE HDRFTR_CENTER_SIZE +FOOTER_CENTER_FAM HDRFTR_CENTER_FAMILY +FOOTER_CENTER_FAMILY HDRFTR_CENTER_FAMILY +FOOTER_CENTER_FONT HDRFTR_CENTER_FONT +FOOTER_CENTER_FT HDRFTR_CENTER_FONT *relative to #DOC_PT_SIZE **relative to overall ps of headers as set by HEADER_SIZE @@ -778,26 +865,20 @@ TO Addressee's name and address ALL_DONE .em (the "end macro") for letters -+++DIVERSIONS+++ - -B_QUOTE Block (indented) quote text -CLOSING Closing (i.e. Yours truly,) -EPI_TEXT Epigraph text -END_NOTES Endnotes text -FN_OVERFLOW Excess footnotes when B_MARGIN is reached -FOOTNOTES Text of footnotes -GREETING Full salutation (e.g. Dear John Smith,) -LETTERHEAD<n> Date, addresser, addressee or greeting; - <n> is from 1 to 4, supplied by #FIELD -P_QUOTE Line for line (poetic) quote text -TOC_ENTRIES TOC entries - +++SUPPORT+++ CHECK_INDENT Applies indents to doc elements inside ev's (head, subhead, etc) +CLEANUP_DEFAULTS Removes selected rregisters and strings + from DEFAULTS after START +DO_COVER Formats and outputs covers +DO_DOC_COVER Formats and outputs doc covers D0_QUOTE Outputs quotes with space adjustments before and after +DIVER_FN_1_PRE -+ +DIVER_FN_2_PRE | Manage footnotes called inside diversions + | QUOTE, BLOCKQUOTE and EPIGRAPH +DIVER_FN_2_POST -+ DIVERT_FN_LEFTOVER Diverts excess fn stored in FN_OVERFLOW into FOOTNOTE DIVERT_FN_OVERFLOW Diverts excess fn stored in FN_OVERFLOW when @@ -806,25 +887,74 @@ and after FN_OVERFLOW_TRAP Fixed at B_MARGIN; if footnotes run longer than B_MARGIN, diverts excess into FN_OVERFLOW +GET_ROMAN_INDENT Figures out amount of space to reserve + for roman numerals in lists HDRFTR_RULE Prints rule under header or over footer +MN_OVERFLOW_TRAP Trap-invoked macro to collect margin note + overflows PRINT_FOOTNOTE_RULE An alias of PRINT_FOOTNOTE; prints footnote separator rule PRINT_HDRFTR Prints header/footer (trap invoked) PRINT_PAGE_NUMBER Invoked in HEADER or FOOTER PRINT_USERDEF_HDRFTR Prints user defined, single string recto/verso header/footer +PROCESS_SHIM Calculates #SHIM when \n(.d is lower on the + page than #T_MARGIN +PROCESS_FN_IN_DIVER Processes footnotes gathered in a diversion (called + at page/column breaks) REMOVE_INDENT Removes indents set with CHECK_INDENT +Q_FITS Handles spacing of quotes when quote fits on the page +Q_NOFIT Handles spacing of quotes when quote does not fit on + the page QUIT_LISTS Exit lists cleanly and completely SET_LIST_INDENT Restore indent of a prev. level of list +SHIM Advance to next "legal" baseline +TERMINATE .em that ensures deferred footnotes get output + on final pages TRAPS Sets hdrftr traps; optionally adjusts #DOC_LEAD to fill page to #B_MARGIN +TYPEWRITER Sets family (C), font (R) and point size (12) + for PRINTSTYLE TYPEWRITE +VFP_CHECK Trap-sprung macro 1 legal baseline higher than + where FOOTER will be sprung; checks whether + there is, in fact, just enough room for + another line of running text to be added to + the page without jamming footnotes too close + to running text. + ++++DIVERSIONS+++ + +B_QUOTE Block (indented) quote text +CLOSING Closing (i.e. Yours truly,) +EPI_TEXT Epigraph text +END_NOTES Endnotes text +FN_IN_DIVER Footnotes gathered from inside a diversion +FN_OVERFLOW Excess footnotes when B_MARGIN is reached +FOOTNOTES Text of footnotes +GREETING Full salutation (e.g. Dear John Smith,) +LETTERHEAD<n> Date, addresser, addressee or greeting; + <n> is from 1 to 4, supplied by #FIELD +P_QUOTE Line for line (poetic) quote text +RUNON_FOOTNOTES Special diversion for run-on footnotes +RUNON_FN_IN_DIVER Special diversion for run-on footnotes inside + (block)quotes +TOC_ENTRIES TOC entries +++NUMBER REGISTERS+++ +#1ST_FN_VP_ADJ An adjustment factor that ensures VFP + doesn't fall below what should be the + correct last printed line of running + text +#ADD_BREAK Instructs FOOTNOTEs and ENDNOTEs to add + a break afer processing a footnote if + we're not in fill mode +#ADJ_BIB_LEAD Adjust BIB_LEAD? (toggle) #ADJ_DOC_LEAD Adjust DOC_LEAD? (toggle) #ADJ_TOC_LEAD Adjust TOC_LEAD? (toggle) #ARG_NUM Keeps track of number of args passed to a macro +#ARGS_TO_LIST Was LIST passed some args? (toggle) #AUTHOR_[n] Strings passed to AUTHOR #AUTHOR_LINES # of lines of authors in doc header; odd=0 even=1 @@ -832,7 +962,36 @@ AUTHOR_<#> in AUTHOR #AUTHORS Equals final value of AUTHOR_NUM; used for authors in doc header +#BASELINE_MARK In PP, the vertical position on the page + (when paragraph spacing is on) after a + quote or blockquote has been output and + the post-quote space has been added. +#BMARG Position of unvarying bottom margin + during doc processing; required for + collecting footnotes inside diversions +#BIB_ALLOWS_HEADERS Put headers on bib pages? (toggle) +#BIB_ALLOWS_HEADERS_ALL Put headers on all bib pages? (toggle) +#BIB_FIRST_PAGE Tells PRINT_PAGE_NUMBER about bibliography + first page number +#BIB_FIRST_PN Starting pagenumber for bibliographies +#BIB_HDRFTR_CENTER Put a center string in bib page headers? + (toggle) +#BIB_LEAD Bibliography lead, expressed in points +#BIB_LIST Output bibs in list style? (toggle) +#BIB_NO_COLS De-columnize bibliographies? (toggle) +#BIB_NO_FIRST_PN Put a page number on the first page of + bibliographies? (toggle) +#BIB_SINGLESPACE Single-space TYPEWRITE bibliographies? (toggle) +#BIB_SPACE Post item space for bibliography pages +#BIB_STRING_CAPS Capitalize bib title? (toggle) +#BIB_STRING_UNDERSCORE Underscore bib title? 0=no; 1=yes; 2=double +#BIB_PS Base point size for bibliography pages expressed + in points +#BIBLIOGRAPHY Are we doing a bib page? (toggle) +#BQ_AUTOLEAD Register created by BLOCKQUOTE_AUTOLEAD +#BQ_LEAD Leading of blockquotes #BQUOTE_COLOR Colored blockquotes? (toggle) +#BQUOTE_LN Number blockquotes? (toggle) #BROKEN_QUOTE Did we invoke BREAK_QUOTE? (toggle) #CAP_HEIGHT_ADJUST Tallest cap height of strings LEFT, CENTER, and RIGHT in footers; used to place rule @@ -841,6 +1000,7 @@ (toggle) #CENTER_CAP_HEIGHT Cap height of CENTER string in headers/footers +#CHAPTER_TITLE_COLOR Colored chapter title? (toggle) #CLOSING Is there a closing (for letters)? 1=yes #COL_L_LENGTH Line length of columns #COL_NEXT Was COL_NEXT invoked? (toggle; used in @@ -855,17 +1015,46 @@ #COLUMNS_WERE_ON Stores columnar state prior to outputting endnotes in no-columns mode #COPY_STYLE 1=draft, 2=final +#COUNTERS_RESET Tells FOOTNOTE if fn counters have + been reset because of footnotes gathered + inside a diversion +#COVER_COLOR Colored cover? (toggle) +#COVER_START_POS Vertical starting pos of cover material +#COVER_TITLE_COLOR Colored cover title? (toggle) +#COVER_SUBTITLE_COLOR Colored cover subtitle? (toggle) +#COVER_ATTRIBUTE_COLOR Colored cover attribution string? (toggle) +#COVER_AUTHOR_COLOR Colored cover author(s)? (toggle) +#COVER_DOCTYPE_COLOR Colored cover doctype? (toggle) +#COVER_COPYRIGHT_COLOR Colored cover copyright line? (toggle) +#COVER_MISC_COLOR Colored cover misc line? (toggle) #CURRENT_V_POS \n(.d ; used in SHIM +#COVERS Print covers? (toggle) #DATE_FIRST Was .DATE invoked as first letter header after .START? (toggle) dc "mark" register for document columns +#DIVER_FN Register that tells FOOTNOTE whether to + "move" or "defer" a footnote collected + inside a diversion +#DEFER_BIB_SPACING Tells DEFAULTS to do BIBLIOGRAPHY_SPACING + if it was called before START #DEFER_PAGINATION Tells COLLATE to restore pagination (from RESTORE_PAGINATION +#DELAY_SHIM Instructs DO_QUOTE to delay SHIM when quote + falls at the top of a page #DEPTH_1 Doc header depth with lead adjustment (#DOCHEADER_LINES * #DOCHEADER_LEAD) #DEPTH_2 Doc header depth without lead adjustment (#DOCHEADER_LINES * #DOC_LEAD) #DEPTH_TO_B_MARGIN Page length minus #B_MARGIN +#DIVERSIONS_HY_MARGIN A reasonable value for .hym applied to + QUOTE, BLOCKQUOTE and EPIGRAPH to + avoid excessive hyphenation if these are + set quad left +#DIVERTED Set to 1 in DIVERT_FN_OVERFLOW; reset + subsequently in FOOTNOTES when called by + PROCESS_FN_LEFTOVER to 2 or 3 for use by + FOOTER to decide whether to in/decrease + #FN_DEPTH when outputting footnotes #DOCHEADER_ADVANCE Distance from top-of-page to baseline of docheader #DOCHEADER_COLOR Colored docheader? (toggle) @@ -873,6 +1062,17 @@ (#DOC_LEAD + #DOCHEADER_LEAD_ADJ) #DOCHEADER_SPACE_ADJ Lead difference between #DEPTH_1 and #DEPTH_2 +#DOC_COVER_START_POS Vertical starting pos of doc cover material +#DOC_COVERS Print doc covers? (toggle) +#DOC_COVER_COLOR Colored cover? (toggle) +#DOC_COVER_START_POS Vertical starting pos of cover material +#DOC_COVER_TITLE_COLOR Colored doc cover title? (toggle) +#DOC_COVER_SUBTITLE_COLOR Colored doc cover subtitle? (toggle) +#DOC_COVER_ATTRIBUTE_COLOR Colored doc cover attribution string? (toggle) +#DOC_COVER_AUTHOR_COLOR Colored doc cover author(s)? (toggle) +#DOC_COVER_DOCTYPE_COLOR Colored doc cover doctype? (toggle) +#DOC_COVER_COPYRIGHT_COLOR Colored doc cover copyright line? (toggle) +#DOC_COVER_MISC_COLOR Colored doc cover misc line? (toggle) #DOC_HEADER Whether to print a doc header (toggle) #DOC_LEAD_ADJ Incrementing value (in units) added to #DOC_LEAD to fill page to #B_MARGIN @@ -885,17 +1085,36 @@ #DOC_R_MARGIN Global R_MARGIN #DOCS Always 1 after START #DOC_TYPE 1=default, 2=chapter, 3=named, 4=letter +#DOING_COVER Tells PRINT_AUTHORS that it's printing + the authors for a cover or doc cover +#DONE_ONCE Keeps track of how many times footnotes + have been collected inside the same diversion +#DONT_RULE_ME Rule this (apparent) first footnote? (toggle) +#DIVER_LN_OFF Turn linenumbering off in (block)quotes? + (toggle) #DRAFT_WITH_PAGENUM Are we attaching draft/revision info to page number? (toggle) #EM_ADJUST Amount to raise \(em at END #EN_ALLOWS_HEADERS Put page headers on endnotes pages? (toggle) #EN_ALLOWS_HEADERS_ALL Put page headers on all endnotes pages? (toggle) +#EN_BQ_AUTOLEAD Register created by EN_BLOCKQUOTE_AUTOLEAD +#EN_BQ_LEAD Leading of blockquotes on endnotes pages +#EN_FIGURE_SPACE Width of \0, for use with formatting endnotes #EN_FIRST_PAGE Tells PRINT_PAGE_NUMBER about endnotes first page number #EN_FIRST_PN Page number that appears on page 1 of endnotes pages. +#EN_HDRFTR_CENTER Should we print centre string of + headers/footers on endnotes pages? (toggle) #EN_LEAD Lead of endnotes +#EN_LN_BRACKETS Are we using brackets for line-numbered + endnotes (toggle) +#EN_LN_SEP Are we using a separator for line-numbered + endnotes (toggle) +#EN_MARK \n(ln when \*[EN-MARK] is called +#EN_MARK_2 \n(ln when ENDNOTE is called +#EN_MARKER_STYLE 1=NUMBER; 2=LINE #EN_NO_COLS Do not set endnotes in columns? (toggle) #EN_NO_FIRST_PN Put pagenumber on 1st page of endnotes? (toggle) @@ -911,6 +1130,9 @@ endnotes #EN_PP_SPACE Space multi-paras in endnotes? (toggle) #EN_PS ps of endnotes +#EN_Q_AUTOLEAD Register created by EN_QUOTE_AUTOLEAD +#EN_Q_LEAD Leading of quotes on endnotes pages +#EN_REF Put REFs in endnotes? (toggle) #EN_SINGLESPACE Single space endnotes pages? (toggle) #EN_STRING_CAPS Should ENDNOTES capitalize the endnotes string? (toggle) @@ -922,9 +1144,8 @@ #END_QUOTE For PP=0 indenting; did we just end a quote? (toggle) #ENDNOTE Are we in an endnote? (toggle) +#ENDNOTE_REFS Are REFs going to endnotes? (toggle) #ENDNOTES Are we in an endnote (for FOOTERs; toggle) -#EN_HDRFTR_CENTER Should we print centre string of - headers/footers on endnotes pages? (toggle) #EPI_ACTIVE Are we in an epigraph? (toggle) #EPI_COLOR Colored epigraphs? (toggle) #EPI_DEPTH Depth of epigraph from first baseline to @@ -948,9 +1169,15 @@ epigraph leading #FIELD Incrementing register tacked onto LETTERHEAD #FINIS Was FINIS invoked? (toggle) +#FINIS_COLOR Colored FINIS? (toggle) #FN_AUTOLEAD Autolead value of footnotes #FN_BL_INDENT Left indent of INDENT BOTH in footnotes #FN_BR_INDENT Right indent of INDENT BOTH in footnotes +#FN_COUNT Which fn marker to print; also to + tell mom to reserve space for and print + the rule above footnotes +#FN_COUNT_AT_FOOTER The FN_COUNT after FOOTNOTES has been + output in FOOTER #FN_COUNT_FOR_COLS Holds a separate footnote count for columns (so they don't reset to 0 1 until page break) #FN_DEFER Defer footnote to next page/column? (toggle) @@ -961,30 +1188,64 @@ #FN_DEPTH Depth of footnote diversion(s) #FN_FOR_EPI Signals to epigraph that a footnote is being processed +#FN_GAP When there are footnotes on a page, the + difference between where FOOTER will be + sprung and the next legal baseline. + Used in VFP_CHECK. #FN_LEAD Lead in footnotes after FN_AUTOLEAD is applied #FN_L_INDENT Left indent of INDENT LEFT in footnotes #FN_LINES Number of lines in fn; used to calculate fn depth +#FN_LN_BRACKETS Are footnote linenumber brackets being used? + (toggle) +#FN_LN_SEP Is a footnote linenumber separator being used? + (toggle) +#FN_MARK \n(ln when \*[FN-MARK] is called +#FN_MARK_2 \n(nl when FOOTNOTE is called #FN_MARKERS Print footnote markers? (toggle) #FN_MARKER_STYLE 1=STAR; 2=NUMBER -#FN_NUMBER Running count of fn #; used to print fn marker +#FN_NUMBER The footnote number attached to running text + (and fns) when numbers instead of + star/dagger is being used for footnootes numbers +#FN_OVERFLOW_TRAP_POS The register that sets the position of + trap FN_OVERFLOW_TRAP. #FN_R_INDENT Right indent of INDENT RIGHT in footnotes +#FN_REF Put REFs in footnotes? (toggle) #FN_RULE_ADJ # of points to raise footnote separator from its baseline #FN_RULE_LENGTH Length of footnote separator rule #FN_RULE Print fn rule? (toggle) +#FN_SPACE Post footnote space #FN_WAS_DEFERED Tells HEADER about a deferred footnote +#FOOTER_DIFF In TRAPS, the difference between the + original #B_MARGIN and #VISUAL_B_MARGIN #FOOTER_GAP Amount of space between end of text and page # #FOOTER_MARGIN Amount of space between page # and bottom of page +#FOOTER_POS Position of footer trap (required for + collecting footnotes inside a diversion) #FOOTERS_ON Are we using footers? (toggle) #FOOTERS_WERE_ON Were footers on? - used in FINIS and BLANKPAGE (toggle) #FOOTNOTE_COLOR Colored footnotes? (toggle) +#FROM_DIVERT_FN Signals to FOOTNOTE, when run from + within DIVERT_FN_LEFTOVER, to set #SPACE_REMAINING + to the total area allowable for running text +#FROM_FOOTER In col to col footnote processing, tells + FOOTNOTE that FOOTNOTES was output from + FOOTER. +#FROM_HEADER In col to col footnote processing, tells + FOOTNOTE that FOOTNOTES was output from + HEADER. #FULLSPACE_QUOTES Should we fullspace quotes? (toggle) +#GET_DEPTH Signals to FOOTNOTE that it should + measure the depth of current footnotes + plus the most recently added one, except + where the footnote is to be deferred to + the next page or column #GUTTER Width of gutter between columns #HDRFTR_CENTER_CAPS CENTER part of header/footer in caps? (toggle; default=off) @@ -1017,31 +1278,57 @@ #HEAD_NUM Head number #HEAD_SPACE 2 line spaces before heads? (toggle; 1=yes, 0=no) -#HEAD_UNDERLINE Underline section titles? (toggle) +#HORIZ_MARK Horizontal #HOW_MANY Number of blank pages to output #IGNORE Should we ignore this macro? Set to 1 in TYPEWRITE. +#IN_BIB_LIST Tells ITEM we're doing a bibliography in + list style #INDENT_FIRST_PARAS Indent first paras? (toggle) #INDENT_FIRSTS Tells footnotes to leave INDENT_FIRST_PARAS alone if it's on for running text. #ITALIC_MEANS_ITALIC For TYPEWRITE. 1=yes; 0=no +#L_LENGTH_FOR_EPI Stores line length at top of doc for use + with EPIGRAPH when columns are on +#L_MARGIN_DIFF Difference between DOC_L_MARGIN and + L_MARGIN #LEFT_CAP_HEIGHT Cap height of left string in headers/footers -#LEGAL_BASELINE Calculates vet. position of next legal +#LEGAL_BASELINE Calculates vert. position of next legal baseline in SHIM #LETTER_STYLE 1=BUSINESS 2=PERSONAL #LINEBREAK Did we have a linebreak? (toggle) +#LINEBREAK_COLOR Colored linebreak? (toggle) +#LINENUMBERS Holds various states of line-numbering when + line numbering is enabled #LINES_PER_PAGE # of lines (at DOC_LEAD) that fit on page after #B_MARGIN is set -#L_LENGTH_FOR_EPI Stores line length at top of doc for use - with EPIGRAPH when columns are on -#L_MARGIN_DIFF Difference between DOC_L_MARGIN and - L_MARGIN +#LN Are line numbers on? (toggle) +#MISC_<n> Used to print "next" misc lines in DO_COVER +#MISC_NUM Number of MISC lines +#MISCS =#MISC_NUM in DO_COVER +#MN_OVERFLOW_LEFT If 1, left margin note text overflows +#MN_OVERFLOW_RIGHT If 1, right margin note text overflows #n%_AT_PAGENUM_SET Page # from n% when PAGENUMBER invoked +#NEEDS_SPACE Instruct FOOTNOTE, when called by + PROCESS_FN_IN_DIVER, that if the footnote + had to be deferred, the VFP must be + raised by 1v (set in DIVER_FN_2_PRE) #NEXT_AUTHOR Supplies correct digit to AUTHOR_<#> when printing authors in doc header +#NEXT_LN Next linenumber when \n(ln has to be stored + because linenumbering suspended +#NEXT_MISC Incrementing counter for misc lines in + DO_COVER +#NO_BACK_UP Instructs FN_OVERFLOW_TRAP not to + subtract 1 line of footnote lead from + FN_OVERFLOW in a PREV_FN_DEFERRED + situation. +#NO_SPACE When para spacing is active, instructs + PP not to add space after a quote or blockquote. #NO_TRAP_RESET Should we reset page traps? (toggle) #NUM_AUTHORS # of authors mod 2 to test if odd or even # of authors +#NUM_MISCS Number of args passed to MISC #NUMBER_HEAD Are heads numbered? (toggle) #NUMBER_PH Are paraheads numbered? (toggle) #NUMBER_SH Are subheads numbered? (toggle) @@ -1050,10 +1337,19 @@ #TOTAL_FIELDS #OK_PROCESS_LEAD Initial processing of TOC and endnote leading is deferred until OK_PROCESS_LEAD=1 +#ORIGINAL_B_MARGIN The value for #B_MARGIN as set by the + macro B_MARGIN +#ORIGINAL_DOC_LEAD The lead for PRINT_STYLE 1 as set in + PRINTSTYLE; required so that PRINT_STYLE 1 + footnotes have an unadjusted lead of + 12 points +#OVERFLOW Signals to FOOTNOTE that some of the + footnote text won't fit on the page #PAGE_NUM_ADJ What to add to n% to get #PAGENUMBER #PAGENUMBER The page number #PAGENUM_STYLE_SET Did we set pagenumber style? (toggle) #PAGE_NUM_H_POS 1=left 2=CENTER 3=right; default=2 +#PAGE_NUM_COLOR Colored pagenumbers? (toggle) #PAGE_NUM_HYPHENS Print hyphens surrounding page numbers? (toggle) #PAGE_NUM_HYPHENS_SET Did user set (or unset) hyphens around page @@ -1066,6 +1362,9 @@ #PAGE_TOP \n(nl after HEADER completes itself #PH_COLOR Colored paraheads? (toggle) #PH_NUM Parahead number +#PAGE_POS Exact position on page during a diversion + (required for collecting footnotes inside + a diversion) #PAGINATE_TOC Is toc pagination on? (toggle) #PAGINATE_WAS_ON Keeps track of pagination state while outputting blank pages @@ -1086,23 +1385,41 @@ #PRINT_STYLE Typewrite=1, typeset=2 #PT_SIZE_IN_UNITS Stored value of \n[.ps] from last time PT_SIZE was called +#Q_AUTOLEAD Register created by QUOTE_AUTOLEAD #Q_DEPTH Depth of quote #Q_FITS Does this quote fit on one page/column? (toggle) +#Q_LEAD Leading of quotes +#Q_LEAD_DIFF Difference between leading of running text + and the leading used in quotes/blockquotes +#Q_LEAD_REAL Leading of quotes and blockquotes saved at the + ends of their respective diversions #Q_L_LENGTH Line length of quotes #Q_OFFSET Page offset for quotes #Q_OFFSET_VALUE Factor by which to multiply PP_INDENT to offset quotes +#Q_PARTIAL_DEPTH The amount of a quote/blockquote that fits at + the bottom of a page when a quote/blockquote + spans pages #Q_PP In PP, stores para # in QUOTE. Removed in ENDQUOTE. +#Q_SPACE_ADJ The flexible amount of whitespace to add before + and after a quote/blockquote #Q_TOP Vertical place on page that a quote starts #QUOTE 1=PQUOTE, 2=BQUOTE #QUOTE_COLOR Color quotes (poetic)? (toggle) +#QUOTE_LN Linenumber quotes? (toggle) #RECTO_VERSO Switch HEADER_LEFT and HEADER_RIGHT on alternate pages? (toggle); default=0 +#REF_HYPHENATE Hyphenate REFs? (toggle) +#REF_WARNING Have we issued a ref warning? (toggle) #REPEAT Number of times to repeat linebreak character +#RESERVED_SPACE Just enough room to put 1 more line of + footnotes on the page #RESET_EN_PP Holds value of register #EN_PP_INDENT +#RESET_FN_COUNTERS 1 = "moved" footnote collected in a diversion + 2 = "deferred" fn collected in a diversion #RESET_FN_NUMBER Should fn# start at 1 on every page? (toggle) #RESET_L_LENGTH Stores current line length when necessary @@ -1113,17 +1430,63 @@ #FULLSPACE_QUOTES (used in endnotes) #RESTORE_DOC_LEAD Holds value of current doc lead (used in endnotes) +#RESTORE_HY Restore hyphenation after .][? (toggle) #RESTORE_OFFSET Page offset at moment footer trap is sprung; not currently used #RESTORE_TOC_PN_PADDING Saves #TOC_PN_PADDING in TOC prior to processing $FIRST_DOC_TITLE #RIGHT_CAP_HEIGHT Cap height of right string in headers/footers +#RULED Tells FOOTNOTE if a rule (or space has been + put above the first footnote on the page +#RUNON_FN_IN_DIVER If #LN=1, if we're in a (block)quote, instructs + FOOTNOTE to unformat diversion RUNON_FN_IN_DIVER +#RUNON_FOOTNOTES If #LN=1, instructs FOOTNOTE to unformat + diversion RUNON_FOOTNOTES +#RUN_ON Are we using run-on footnotes? (toggle) +#SAVED_DIVER_FN_COUNT In the case of a footnote inside a + diversion that should be treated as a + "normal" footnote, FOOTNOTE needs to + distinguish between a "normal" deferred + footnote (always the 1st footnote on the + page) and one that only looks as if + it should be deferred, when, in fact, + it's an overflow; this register lets + FOOTNOTE know whether the diversion + footnote is, in fact, the first on the + page. +#SAVED_FN_COUNT #FN_COUNT+1 prior to +#FN_COUNT; used + in FOOTNOTES while gathering fns inside + diversions +#SAVED_FN_COUNT_FOR_COLS #FN_COUNT_FOR_COLS+1 prior to + +#FN_COUNT_FOR_COLS; used in FOOTNOTES + while gathering fns inside diversions +#SAVED_FN_DEPTH_1 Footnote depth prior to adding footnote + diversion depth to FN_DEPTH; used when + footnote text will overflow +#SAVED_FN_DEPTH_2 Footnote depth after to adding footnote + diversion depth to FN_DEPTH; used when + footnote text will overflow +#SAVED_FOOTER_POS Position of FOOTER in DO_QUOTE (hack) +#SAVED_LEAD In FOOTER and DO_FOOTER, stores the + lead in effect prior to outputting + FOOTNOTES or performing either + PROCESS_FN_LEFTOVER or + PROCESS_FN_IN_DIVERSION; both the + diversion FOOTNOTES and the two macros + have, for PRINT_STYLE 2, an AUTOLEAD + call, which requires that an LS be + performed with the #SAVED_LEAD in + order to remove register #AUTO_LEAD or + #AUTO_LEAD_FACTOR. +#SEP_TYPE Set to 1 if LIST separator is ( or [ or { #SH_LEAD_ADJUST #DOC_LEAD/8 (TYPESET) or /2 (TYPEWRITE) (used for subhead spacing) #SH_NUM Subhead number #SHIM Amount of lead required to advance to next legal baseline +#SILENT_BQUOTE_LN "Silently" linenumber blockquotes? (toggle) +#SILENT_QUOTE_LN "Silently" linenumber quotes? (toggle) #SINGLE_SPACE Is TYPEWRITE in single space mode? (toggle) #SKIP_FOOTER If 1, instructs DO_FOOTER to do nothing if B_MARGIN falls below FOOTER_MARGIN @@ -1132,18 +1495,29 @@ for a while #SPACE_REMAINING Space remaining to footer trap; used to decide whether or not to defer a footnote +#SR_ADJ_FACTOR An adjustment factor that compensates + for the fact that #SPACE_REMAINING + sometimes reports a fractionally larger + space than is actually available for + footnote text. #START If 1, signals completion of START #START_FOR_FOOTERS Toggle set in START; signals to PRINT_HDRFTR that START has been invoked, allowing PRINT_HDRFTR to decide whether or not to print a footer on page 1 +#START_FOR_MNinit If 1, defer processing MN_INIT until #START #STORED_PP_INDENT Temporarily holds value of #PP_INDENT #SUITE Current page number (for letters) #SUP_PT_SIZE Point size of superscript #SUSPEND_PAGINATION Suspend pagination prior to endnotes? #SWITCH_HDRFTR Switch HDRFTR_LEFT and HDRFTR_RIGHT? (toggle) +#T_MARGIN_LEAD_ADJ \n(.v-12000; ensures critically accurate + placement of first lines on pages when + doc processing is not being used and + a T_MARGIN has been set #TAB_OFFSET# "#" at the end is from $CURRENT_TAB +#TERMINATE Has TERMINATE been called? (toggle) #TOC_AUTHORS Whether to append author(s) to toc doc title entries (toggle) #TOC_ENTRY_PN Current page number when a toc entry is @@ -1182,199 +1556,339 @@ #VARIABLE_FOOTER_POS Wandering trap position for processing footnotes and footers; pos depends on footnotes +#VISUAL_B_MARGIN Set in TRAPS, what \n(nl would report + on the last line of running text before + FOOTER is sprung. +#VFP_DIFF #FN_DEPTH minus #SAVED_FN_DEPTH; the + number of footnote lines that will fit + on the page when there will be over, and + therefore the amount by which to raise + the VFP for footnotes with overflow after + the 1st footnote. y Vertical position stored with mk in hdrftrs. +++STRINGS+++ -$ATTRIBUTE_STRING "by" line in doc header -$AUTHOR_1...9 Document author(s) -$AUTHOR_FAM Family to use for author in doc header -$AUTHOR_FT Font to use for author in doc header -$AUTHOR_SIZE_CHANGE ps in/decrease of author in doc header* -$AUTHOR_PT_SIZE Absolute ps of authors -$BQUOTE_COLOR Blockquote color -$BQUOTE_FAM Family to use for blockquotes -$BQUOTE_FT Font to use for blockquotes -$BQUOTE_QUAD Quad value for blockquotes -$BQUOTE_SIZE_CHANGE ps in/decrease of blockquotes* -$CENTER_TITLE What to put in the middle of header - title -$CHAPTER The chapter number -$CHAPTER_STRING What to print whenever the word - "chapter" is required -$CHAPTER_TITLE Chapter title (if there is one) -$CHAPTER_TITLE_FAM Family of chapter title -$CHAPTER_TITLE_FT Font of chapter title -$CHAPTER_TITLE_SIZE_CHANGE ps in/decrease of chapter title* -$CHAPTER_TITLE_PT_SIZE Absolute ps of chapter title -$COPY_STYLE DRAFT or FINAL -$DOC_FAM Predominant font family used in the - document -$DOC_QUAD Quad used for body text (justified or - left) -$DOC_TITLE Overall doc title that gets printed in - headers/footers (mostly for use with - collated docs where each doc is an - article with a different title -$DOC_TYPE Document type (default, chapter, named, - letter) -$DOCHEADER_COLOR Color of docheader -$DOCHEADER_LEAD_ADJ +|- value applied to #DOC_LEAD to - in/decrease leading of doc header -$DOCTYPE_FAM Family to use for DOCTYPE string in - doc header -$DOCTYPE_FT Font to use for DOCTYPE string in - doc header -$DOCTYPE_SIZE_CHANGE ps in/decrease of DOCTYPE string in - doc header* -$DOCTYPE_PT_SIZE Absolute ps of DOCTYPE -$DRAFT The draft number (string valued) -$DRAFT_STRING What to print whenever the word "draft" - is required -$EN_FAMILY Family for endnotes -$EN_FT Font for endnotes -$EN_PN_STYLE Pagenumbering style for endnotes pages -$EN_QUAD Quad for endnotes -$EN_STRING Endnotes page head -$EN_STRING_FAM Endnotes page head family -$EN_STRING_FT Endnotes page head font -$EN_STRING_QUAD Endnotes page head quad direction -$EN_STRING_SIZE_CHANGE Endnotes page head size*** -$EN_TITLE Endnote document identifier -$EN_TITLE_FAM Endnote document identifier family -$EN_TITLE_FT Endnote document identifier font -$EN_TITLE_QUAD Endnote document identifier quad - direction -$EN_TITLE_SIZE_CHANGE Endnote document identifier size*** -$EN_NUMBER_FAM Endnote numbering family -$EN_NUMBER_FT Endnote numbering font -$EN_NUMBER_SIZE_CHANGE Endnote numbering size*** -$EPI_AUTOLEAD Autolead value (decimals ok) of - epigraphs -$EPI_COLOR Color of epigraphs -$EPI_FAM Family to use in epigraphs -$EPI_FT Font to use in epigraphs -$EPI_QUAD Quad in block-style epigraphs - (justified or left) -$EPI_SIZE_CHANGE ps in/decrease of epigraphs* -$FINIS_COLOR Color of FINIS string -$FINIS_STRING What to print when FINIS macro is - invoked -$FIRST_DOC_TITLE 1st doc's title captured in COLLATE -$FN_FAM Family used in footnotes -$FN_FT Font used in footnotes -$FN_QUAD Quad used in footnotes -$FN_SIZE_CHANGE ps in/decrease of footnotes* -$FOOTNOTE_COLOR Footnote color -$HDRFTR_CENTER What to put in CENTER part of headers; - default doctype -$HDRFTR_CENTER_FAM Family of CENTER part of headers -$HDRFTR_CENTER_FT Font of centre part of headers -$HDRFTR_CENTER_NEW HDRFTR_CENTER after the start of TOC; - defined in HDRFTR_CENTER if - HDRFTR_CENTER is called as - FOOTER_CENTER -$HDRFTR_CENTER_OLD HDRFTR_CENTER just prior to start of - TOC; defined in HDRFTR_CENTER if - HDRFTR_CENTER is called as - FOOTER_CENTER -$HDRFTR_CENTER_SIZE_CHANGE ps in/decrease of centre title in - headers** -$HDRFTR_COLOR Color of headers/footers -$HDRFTR_FAM Family to use in headers -$HDRFTR_LEFT_FAM Family of left part of headers -$HDRFTR_LEFT_FT Font of left part of headers -$HDRFTR_LEFT_SIZE_CHANGE ps in/decrease of author in headers** -$HDRFTR_LEFT What to put in left part of headers; - default author -$HDRFTR_RIGHT_FAM Family of right part of headers -$HDRFTR_RIGHT_FT Font of right part of headers -$HDRFTR_RIGHT_SIZE_CHANGE ps in/decrease of right part of - headers** -$HDRFTR_RIGHT What to put in right part of headers; - default title -$HDRFTR_SIZE_CHANGE ps in/decrease of headers* -$HDRFTR_TMP_SIZE_CHANGE_SWITCH Temporarily holds - HDRFTR_LEFT_SIZE_CHANGE if - #SWITCH_HDRFTRS=1 -$HDRFTR_TMP_SWITCH Temporarily holds HDRFTR_LEFT if - #SWITCH_HDRFTRS=1 -$HEAD_COLOR Head color -$HEAD_FAM Family to use for section titles -$HEAD_FT Font to use for section titles -$HEAD_QUAD Quad value of section titles -$HEAD_SIZE_CHANGE ps in/decrease of section titles* -$LINEBREAK_CHAR Character that marks line breaks -$LINEBREAK_CHAR_V_ADJ +|- amount by which to raise/lower - linebreak character -$LINEBREAK_COLOR Linebreak color -PAGE# For use in hdrftr strings where page # - is needed; \*[PAGE] -$PAGENUM_COLOR Page number color -$PAGENUM_STYLE String passed to PAGENUM_STYLE -$PAGE_NUM_FAM Family of page numbers -$PAGE_NUM_FT Font of page numbers -$PAGE_NUM_SIZE_CHANGE ps in/decrease of page numbers -$PAPER Paper size (LETTER, A4, LEGAL); - default=LETTER -$PH_COLOR Parahead color -$PP_FT Font used in paragraphs -$QUOTE_COLOR Quote (poetic) color -$QUOTE_FAM Family to use for pquotes -$QUOTE_FT Font to use for pquotes -$QUOTE_SIZE_CHANGE ps in/decrease of pquotes* -#REVISION The revision number (string valued) -$REVISION_STRING What to print whenever the word - "revision" is required -$SH_FAM Family to use in subheads -$SH_FT Font to use in subheads -$SH_SIZE_CHANGE ps in/decrease of subheads* -$SH_COLOR Subhead color -$SUBTITLE Document subtitle -$SUBTITLE_FAM Family to use for subtitle in doc - header -$SUBTITLE_FT Font to use for subtitle in doc header -$SUBTITLE_SIZE_CHANGE ps in/decrease of subtitle* -$SUBTITLE_PT_SIZE Absolute ps of subtitle -$SUITE The #SUITE number register -$TITLE Document title -$TITLE_FAM Family to use for title in doc header -$TITLE_FT Font to use for title in doc header -$TITLE_PT_SIZE Absolute point size of title in docheader -$TITLE_SIZE_CHANGE ps in/decrease of title in doc header* -$TOC_AUTHORS What to print after toc doc title entry - if #TOC_AUTHORS=1 -$TOC_FAM Family to use on toc pages -$TOC_HEAD_FAM Family of toc head entries -$TOC_HEAD_FT Font of toc head entries -$TOC_HEAD_ITEM A head as collected for TOC_ENTRIES -$TOC_HEADER_FAM Family to use for "Contents" -$TOC_HEADER_FT Font to use for "Contents" -$TOC_HEADER_QUAD Quad direction of "Contents" -$TOC_HEADER_SIZE ps in/decrease of "Contents"**** -$TOC_HEADER_STRING Header string of first toc page -$TOC_PN Sets up toc leaders + entry pn - (typeset) -$TOC_PN_FAM Family for toc entries page numbers -$TOC_PN_FT Font for toc entries page numbers -$TOC_PN_SIZE_CHANGE ps in/decrease of toc entries page - numbers -$TOC_PN_STYLE Page-numbering style of toc pages -$TOC_PN_TYPEWRITE Sets up toc leaders + entry pn - (typewrite) -$TOC_PH_FAM Family of toc parahead entries -$TOC_PH_FT Font of toc parahead entries -$TOC_PARAHEAD_ITEM A parahead collected for TOC_ENTRIES -$TOC_SH_FAM Family of toc subhead entries -$TOC_SH_FT Font of toc subhead entries -$TOC_SH_ITEM A subhead collected for TOC_ENTRIES -$TOC_TITLE_FAM Family of toc doc title entries -$TOC_TITLE_FT Font of toc doc title entries -$USER_SET_TITLE_ITEM User defined toc doc title entry as - set by TOC_TITLE_ENTRY -$UR_PAGINATION_STYLE Pagination style prior to endnotes -$USERDEF_HDRFTR_RECTO User defined header/footer recto string -$USERDEF_HDRFTR_VERSO User defined header/footer verso string +$1ST_LETTER First letter of first arg to LIST +$ADJUST_BIB_LEAD 2nd arg to BIBLIOGRAPHY_LEAD; if not blank + adjust bib leading +$ATTRIBUTE_STRING "by" line in doc header +$AUTHOR_1...9 Document author(s) +$AUTHOR_FAM Family to use for author in doc header +$AUTHOR_FT Font to use for author in doc header +$AUTHOR_SIZE_CHANGE ps in/decrease of author in doc header* +$AUTHOR_PT_SIZE Absolute ps of authors +$BIB_FAM Bibliography page family +$BIB_FT Bibliography page font +$BIB_LEAD Base leading for bibliographies +$BIB_LIST_SEPARATOR Separator between enumerator and text + when outputting bibliographies in LIST style +$BIB_LIST_PREFIX Prefix before enumerator when outputting + bibliographies in LIST style +$BIB_PN_STYLE Format of bibliography page numbers +$BIB_SPACE Post entry space for bibliographies +$BIB_STRING Bibliography title string +$BIB_STRING_FAM Bib title family +$BIB_STRING_FT Bib title font +$BIB_STRING_QUAD Bib title quad +$BIB_STRING_SIZE_CHANGE Bib title size (+ or -) +$BQ_LN_GUTTER Gutter between line numbers and bquotes in + bquotes +$BQUOTE_COLOR Blockquote color +$BQUOTE_FAM Family to use for blockquotes +$BQUOTE_FT Font to use for blockquotes +$BQUOTE_QUAD Quad value for blockquotes +$BQUOTE_SIZE_CHANGE ps in/decrease of blockquotes* +$CENTER_TITLE What to put in the middle of header + title +$CHAPTER The chapter number +$CHAPTER_STRING What to print whenever the word + "chapter" is required +$CHAPTER_TITLE Chapter title (if there is one) +$CHAPTER_TITLE_FAM Family of chapter title +$CHAPTER_TITLE_FT Font of chapter title +$CHAPTER_TITLE_SIZE_CHANGE ps in/decrease of chapter title* +$CHAPTER_TITLE_PT_SIZE Absolute ps of chapter title +$CHAPTER_TITLE_COLOR Color of chapter title +$COPYRIGHT_FAM Copyright line family +$COPYRIGHT_FT Copyright line font +$COPYRIGHT_SIZE_CHANGE Copyright line size* +$COPYRIGHT_COLOR Copyright line color +$COPYRIGHT_QUAD Copyright line quad direction +$COPY_STYLE DRAFT or FINAL +$COVER_FAM Overall cover family +$COVER_COLOR Overall cover color +$COVER_TITLE User-defined cover title string +$COVER_TITLE_FAM Cover title family +$COVER_TITLE_FT Cover title font +$COVER_TITLE_SIZE_CHANGE Cover title size* +$COVER_TITLE_COLOR Cover title color +$COVER_SUBTITLE_FAM Cover subtitle family +$COVER_SUBTITLE_FT Cover subtitle font +$COVER_SUBTITLE_SIZE_CHANGE Cover subtitle size* +$COVER_SUBTITLE_COLOR Cover subtitle color +$COVER_ATTRIBUTE_COLOR Cover attribution string color +$COVER_AUTHOR_FAM Cover author(s) family +$COVER_AUTHOR_FT Cover author(s) font +$COVER_AUTHOR_SIZE_CHANGE Cover author(s) size* +$COVER_AUTHOR_COLOR Cover author(s) color +$COVER_DOCTYPE_FAM Cover doctype family +$COVER_DOCTYPE_FT Cover doctype font +$COVER_DOCTYPE_SIZE_CHANGE Cover doctype size* +$COVER_DOCTYPE_COLOR Cover doctype color +$COVER_COPYRIGHT_FAM Cover copyright family +$COVER_COPYRIGHT_FT Cover copyright font +$COVER_COPYRIGHT_SIZE_CHANGE Cover copyright size* +$COVER_COPYRIGHT_COLOR Cover copyright color +$COVER_MISC_FAM Cover misc family +$COVER_MISC_FT Cover misc font +$COVER_MISC_SIZE_CHANGE Cover misc size* +$COVER_MISC_COLOR Cover misc color +$CURRENT_EV \n[.ev] at REF_BRACKETS_START +$DOC_COVER_FAM Overall doc cover family +$DOC_COVER_COLOR Overall doc cover color +$DOC_COVER_TITLE User-defined doc cover title string +$DOC_COVER_TITLE_FAM Doc cover title family +$DOC_COVER_TITLE_FT Doc cover title font +$DOC_COVER_TITLE_SIZE_CHANGE Doc cover title size* +$DOC_COVER_TITLE_COLOR Doc cover title color +$DOC_COVER_SUBTITLE_FAM Doc cover subtitle family +$DOC_COVER_SUBTITLE_FT Doc cover subtitle font +$DOC_COVER_SUBTITLE_SIZE_CHANGE Doc cover subtitle size* +$DOC_COVER_SUBTITLE_COLOR Doc cover subtitle color +$DOC_COVER_ATTRIBUTE_COLOR Doc cover attribution string color +$DOC_COVER_AUTHOR_FAM Doc cover author(s) family +$DOC_COVER_AUTHOR_FT Doc cover author(s) font +$DOC_COVER_AUTHOR_SIZE_CHANGE Doc cover author(s) size* +$DOC_COVER_AUTHOR_COLOR Doc cover author(s) color +$DOC_COVER_DOCTYPE_FAM Doc cover doctype family +$DOC_COVER_DOCTYPE_FT Doc cover doctype font +$DOC_COVER_DOCTYPE_SIZE_CHANGE Doc cover doctype size* +$DOC_COVER_DOCTYPE_COLOR Doc cover doctype color +$DOC_COVER_COPYRIGHT_FAM Doc cover copyright family +$DOC_COVER_COPYRIGHT_FT Doc cover copyright font +$DOC_COVER_COPYRIGHT_SIZE_CHANGE Doc cover copyright size* +$DOC_COVER_COPYRIGHT_COLOR Doc cover copyright color +$DOC_COVER_MISC_FAM Doc cover misc family +$DOC_COVER_MISC_FT Doc cover misc font +$DOC_COVER_MISC_SIZE_CHANGE Doc cover misc size* +$DOC_COVER_MISC_COLOR Doc cover misc color +$DOC_FAM Predominant font family used in the + document +$DOC_QUAD Quad used for body text (justified or + left) +$DOC_TITLE Overall doc title that gets printed in + headers/footers (mostly for use with + collated docs where each doc is an + article with a different title) +$DOC_TYPE Document type (default, chapter, named, + letter) +$DOCHEADER_COLOR Color of docheader +$DOCHEADER_FAM Family used for all parts of the docheader +$DOCHEADER_LEAD_ADJ +|- value applied to #DOC_LEAD to + in/decrease leading of doc header +$DOCTYPE_FAM Family to use for DOCTYPE string in + doc header +$DOCTYPE_FT Font to use for DOCTYPE string in + doc header +$DOCTYPE_SIZE_CHANGE ps in/decrease of DOCTYPE string in + doc header* +$DOCTYPE_PT_SIZE Absolute ps of DOCTYPE +$DRAFT The draft number (string valued) +$DRAFT_STRING What to print whenever the word "draft" + is required +EN_MARK Inline, gets #EN_MARK (\(ln) +$EN_CLOSE_BRACKET Close bracket for line-number enumerated + endnotes +$EN_FAMILY Family for endnotes +$EN_FT Font for endnotes +$EN_LINENUMBER String to print for line-number enumerators + in line-numbered endnotes +$EN_LN_FAM Family for line-numbers in line-number + identified endnotes +$EN_LN_FT Font for line-numbers in line-number + identified endnotes +$EN_LN_GAP Gap to leave in initial endnote lines + between line-number identifies and text +$EN_OPEN_BRACKET Open bracket for line-number enumerated + endnotes +$EN_LN_SIZE_CHANGE Size change (+ or -) for line-numbers in + line-number identified endnotes +$EN_PN_STYLE Pagenumbering style for endnotes pages +$EN_QUAD Quad for endnotes +$EN_STRING Endnotes page head +$EN_STRING_FAM Endnotes page head family +$EN_STRING_FT Endnotes page head font +$EN_STRING_QUAD Endnotes page head quad direction +$EN_STRING_SIZE_CHANGE Endnotes page head size*** +$EN_TITLE Endnote document identifier +$EN_TITLE_FAM Endnote document identifier family +$EN_TITLE_FT Endnote document identifier font +$EN_TITLE_QUAD Endnote document identifier quad + direction +$EN_TITLE_SIZE_CHANGE Endnote document identifier size*** +$EN_NUMBER_FAM Endnote numbering family +$EN_NUMBER_FT Endnote numbering font +$EN_NUMBER_SIZE_CHANGE Endnote numbering size*** +$EPI_AUTOLEAD Autolead value (decimals ok) of + epigraphs +$EPI_COLOR Color of epigraphs +$EPI_FAM Family to use in epigraphs +$EPI_FT Font to use in epigraphs +$EPI_QUAD Quad in block-style epigraphs + (justified or left) +$EPI_SIZE_CHANGE ps in/decrease of epigraphs* +$EVAL_BIB_SPACE Temporary string to find out if the + arg to BIBLIOGRAPHY_SPACING ended in "v" +$FINIS_COLOR Color of FINIS string +$FINIS_STRING What to print when FINIS macro is + invoked +$FIRST_DOC_TITLE 1st doc's title captured in COLLATE +FN_MARK Inline, gets #FN_MARK (\n(ln) +$FN_CLOSE_BRACKET Close bracket for line-number identified + footnotes +$FN_FAM Family used in footnotes +$FN_FT Font used in footnotes +$FN_LINENUMBER String to print before footnotes when + line-numbering enabled for footnotes +$FN_LN_SEP Separator after line-number identified + footnotes +$FN_OPEN_BRACKET Open bracket for line-number identified + footnotes +$FN_QUAD Quad used in footnotes +$FN_SIZE_CHANGE ps in/decrease of footnotes* +$FOOTNOTE_COLOR Footnote color +$HDRFTR_CENTER What to put in CENTER part of headers; + default doctype +$HDRFTR_CENTER_FAM Family of CENTER part of headers +$HDRFTR_CENTER_FT Font of centre part of headers +$HDRFTR_CENTER_NEW HDRFTR_CENTER after the start of TOC; + defined in HDRFTR_CENTER if + HDRFTR_CENTER is called as + FOOTER_CENTER +$HDRFTR_CENTER_OLD HDRFTR_CENTER just prior to start of + TOC; defined in HDRFTR_CENTER if + HDRFTR_CENTER is called as + FOOTER_CENTER +$HDRFTR_CENTER_SIZE_CHANGE ps in/decrease of centre title in + headers** +$HDRFTR_COLOR Color of headers/footers +$HDRFTR_FAM Family to use in headers +$HDRFTR_LEFT_FAM Family of left part of headers +$HDRFTR_LEFT_FT Font of left part of headers +$HDRFTR_LEFT_SIZE_CHANGE ps in/decrease of author in headers** +$HDRFTR_LEFT What to put in left part of headers; + default author +$HDRFTR_RIGHT_FAM Family of right part of headers +$HDRFTR_RIGHT_FT Font of right part of headers +$HDRFTR_RIGHT_SIZE_CHANGE ps in/decrease of right part of + headers** +$HDRFTR_RIGHT What to put in right part of headers; + default title +$HDRFTR_SIZE_CHANGE ps in/decrease of headers* +$HDRFTR_TMP_SIZE_CHANGE_SWITCH Temporarily holds + HDRFTR_LEFT_SIZE_CHANGE if + #SWITCH_HDRFTRS=1 +$HDRFTR_TMP_SWITCH Temporarily holds HDRFTR_LEFT if + #SWITCH_HDRFTRS=1 +$HEAD_COLOR Head color +$HEAD_FAM Family to use for section titles +$HEAD_FT Font to use for section titles +$HEAD_QUAD Quad value of section titles +$HEAD_SIZE_CHANGE ps in/decrease of section titles* +$LINEBREAK_CHAR Character that marks line breaks +$LINEBREAK_CHAR_V_ADJ +|- amount by which to raise/lower + linebreak character +$LAST_CHAR Temporary string used to discover whether + user has remembered to put a digit after + ROMAN or roman in arg to LIST +$LINEBREAK_COLOR Linebreak color +$LIST_ARG_1 The first arg to LIST (minus digits if + ROMAN or roman +$LN_GUTTER Gutter to leave between line numbers + and text +$LN_INC 2nd arg to NUMBER_LINES as a string +$LN_NUM 1st arg to NUMBER_LINES as a string +$MISC_COLOR Misc line color +$MISC_QUAD Misc line quad +PAGE# For use in hdrftr strings where page # + is needed; \*[PAGE] +$PAGENUM_COLOR Page number color +$PAGENUM_STYLE String passed to PAGENUM_STYLE +$PAGE_NUM_FAM Family of page numbers +$PAGE_NUM_FT Font of page numbers +$PAGE_NUM_SIZE_CHANGE ps in/decrease of page numbers +$PAPER Paper size (LETTER, A4, LEGAL); + default=LETTER +$PH_COLOR Parahead color +$PP_FT Font used in paragraphs +$ROMAN_WIDTH The digit(s) appended to ROMAN or + roman LIST args +$Q_LN_GUTTER Gutter between linenumbers and quotes + in quotes +$QUOTE_COLOR Quote (poetic) color +$QUOTE_FAM Family to use for pquotes +$QUOTE_FT Font to use for pquotes +$QUOTE_SIZE_CHANGE ps in/decrease of pquotes* +$REF_BIB_INDENT 2nd line indent value for references in + bibliographies +$REF_EN_INDENT 2nd line indent value for references in + endnotes +$REF_FN_INDENT 2nd line indent value for references in + footnotes +$RESTORE_SS_VAR Saves \*[$SS_VAR] for use with ref*build +#REVISION The revision number (string valued) +$REVISION_STRING What to print whenever the word + "revision" is required +$SH_FAM Family to use in subheads +$SH_FT Font to use in subheads +$SH_SIZE_CHANGE ps in/decrease of subheads* +$SH_COLOR Subhead color +$SUBTITLE Document subtitle +$SUBTITLE_FAM Family to use for subtitle in doc + header +$SUBTITLE_FT Font to use for subtitle in doc header +$SUBTITLE_SIZE_CHANGE ps in/decrease of subtitle* +$SUBTITLE_PT_SIZE Absolute ps of subtitle +$SUITE The #SUITE number register +$TITLE Document title +$TITLE_FAM Family to use for title in doc header +$TITLE_FT Font to use for title in doc header +$TITLE_PT_SIZE Absolute point size of title in docheader +$TITLE_SIZE_CHANGE ps in/decrease of title in doc header* +$TOC_AUTHORS What to print after toc doc title entry + if #TOC_AUTHORS=1 +$TOC_FAM Family to use on toc pages +$TOC_HEAD_FAM Family of toc head entries +$TOC_HEAD_FT Font of toc head entries +$TOC_HEAD_ITEM A head as collected for TOC_ENTRIES +$TOC_HEADER_FAM Family to use for "Contents" +$TOC_HEADER_FT Font to use for "Contents" +$TOC_HEADER_QUAD Quad direction of "Contents" +$TOC_HEADER_SIZE ps in/decrease of "Contents"**** +$TOC_HEADER_STRING Header string of first toc page +$TOC_PN Sets up toc leaders + entry pn + (typeset) +$TOC_PN_FAM Family for toc entries page numbers +$TOC_PN_FT Font for toc entries page numbers +$TOC_PN_SIZE_CHANGE ps in/decrease of toc entries page + numbers +$TOC_PN_STYLE Page-numbering style of toc pages +$TOC_PN_TYPEWRITE Sets up toc leaders + entry pn + (typewrite) +$TOC_PH_FAM Family of toc parahead entries +$TOC_PH_FT Font of toc parahead entries +$TOC_PARAHEAD_ITEM A parahead collected for TOC_ENTRIES +$TOC_SH_FAM Family of toc subhead entries +$TOC_SH_FT Font of toc subhead entries +$TOC_SH_ITEM A subhead collected for TOC_ENTRIES +$TOC_TITLE_FAM Family of toc doc title entries +$TOC_TITLE_FT Font of toc doc title entries +$USER_SET_TITLE_ITEM User defined toc doc title entry as + set by TOC_TITLE_ENTRY +$UR_PAGINATION_STYLE Pagination style prior to endnotes +$USERDEF_HDRFTR_RECTO User defined header/footer recto string +$USERDEF_HDRFTR_VERSO User defined header/footer verso string *relative to #DOC_PT_SIZE **relative to overall ps of headers as set by HEADER_SIZE @@ -1421,8 +1935,18 @@ +++ALIASES+++ -All macros that include the word COLOR have aliases that use COLOUR instead, -e.g. NEWCOLOUR, XCOLOUR, COLOUR, HEAD_COLOUR, SUBHEAD_COLOUR, etc. +Please note: + +Prior to version 1.1.9, all macros that included the word COLOR had +aliases that used COLOUR instead. This convenience has now been +removed, in an effort to reduce the size of the om.tmac file. + +Furthermore, if you want the convenience, you'll have to edit the +om.tmac file. Simply aliasing, say, HEAD_COLOR as HEAD_COLOUR will +not work, owing to significant changes in the handling of +docelement control macros that end in _COLOR. + ++++The following are for convenience, and header/footer management+++ BREAK_BLOCKQUOTE BREAK_QUOTE BREAK_CITATION BREAK_QUOTE @@ -1440,84 +1964,31 @@ DOC_R_MARGIN DOC_RIGHT_MARGIN DOC_RMARGIN DOC_RIGHT_MARGIN FOOTER_CENTER_CAPS HDRFTR_CENTER_CAPS -FOOTER_CENTER_FAM HDRFTR_CENTER_FAMILY -FOOTER_CENTER_FAMILY HDRFTR_CENTER_FAMILY -FOOTER_CENTER_FONT HDRFTR_CENTER_FONT -FOOTER_CENTER_FT HDRFTR_CENTER_FONT FOOTER_CENTER HDRFTR_CENTER -FOOTER_CENTER_PS HDRFTR_CENTER_SIZE -FOOTER_CENTER_SIZE HDRFTR_CENTER_SIZE FOOTER_CENTRE_CAPS HDRFTR_CENTER_CAPS -FOOTER_CENTRE_FAM HDRFTR_CENTER_FAMILY -FOOTER_CENTRE_FAMILY HDRFTR_CENTER_FAMILY -FOOTER_CENTRE_FT HDRFTR_CENTER_FONT FOOTER_CENTRE HDRFTR_CENTER -FOOTER_CENTRE_PS HDRFTR_CENTER_SIZE -FOOTER_CENTRE_SIZE HDRFTR_CENTER_SIZE -FOOTER_FAM HDRFTR_FAMILY -FOOTER_FAMILY HDRFTR_FAMILY FOOTER_LEFT_CAPS HDRFTR_LEFT_CAPS -FOOTER_LEFT_FAM HDRFTR_LEFT_FAMILY -FOOTER_LEFT_FAMILY HDRFTR_LEFT_FAMILY -FOOTER_LEFT_FONT HDRFTR_LEFT_FONT -FOOTER_LEFT_FT HDRFTR_LEFT_FONT FOOTER_LEFT HDRFTR_LEFT -FOOTER_LEFT_PS HDRFTR_LEFT_SIZE -FOOTER_LEFT_SIZE HDRFTR_LEFT_SIZE FOOTER_PLAIN HDRFTR_PLAIN FOOTER_RECTO HDRFTR_RECTO FOOTER_RIGHT_CAPS HDRFTR_RIGHT_CAPS -FOOTER_RIGHT_FAM HDRFTR_RIGHT_FAMILY -FOOTER_RIGHT_FAMILY HDRFTR_RIGHT_FAMILY -FOOTER_RIGHT_FONT HDRFTR_RIGHT_FONT -FOOTER_RIGHT_FT HDRFTR_RIGHT_FONT FOOTER_RIGHT HDRFTR_RIGHT -FOOTER_RIGHT_PS HDRFTR_RIGHT_SIZE -FOOTER_RIGHT_SIZE HDRFTR_RIGHT_SIZE FOOTER_RULE_GAP HDRFTR_RULE_GAP FOOTER_RULE HDRFTR_RULE -FOOTER_SIZE HDRFTR_SIZE FOOTER_VERSO HDRFTR_VERSO HDRFTR_RULE_INTERNAL HDRFTR_RULE HEADER_CENTER_CAPS HDRFTR_CENTER_CAPS -HEADER_CENTER_FAM HDRFTR_CENTER_FAMILY -HEADER_CENTER_FAMILY HDRFTR_CENTER_FAMILY -HEADER_CENTER_FONT HDRFTR_CENTER_FONT -HEADER_CENTER_FT HDRFTR_CENTER_FONT HEADER_CENTER HDRFTR_CENTER -HEADER_CENTER_PS HDRFTR_CENTER_SIZE -HEADER_CENTER_SIZE HDRFTR_CENTER_SIZE HEADER_CENTRE_CAPS HDRFTR_CENTER_CAPS -HEADER_CENTRE_FAM HDRFTR_CENTER_FAMILY -HEADER_CENTRE_FAMILY HDRFTR_CENTER_FAMILY -HEADER_CENTRE_FONT HDRFTR_CENTER_FONT -HEADER_CENTRE_FT HDRFTR_CENTER_FONT HEADER_CENTRE HDRFTR_CENTER -HEADER_CENTRE_PS HDRFTR_CENTER_SIZE -HEADER_CENTRE_SIZE HDRFTR_CENTER_SIZE -HEADER_FAM HDRFTR_FAMILY -HEADER_FAMILY HDRFTR_FAMILY HEADER_LEFT_CAPS HDRFTR_LEFT_CAPS -HEADER_LEFT_FAM HDRFTR_LEFT_FAMILY -HEADER_LEFT_FAMILY HDRFTR_LEFT_FAMILY -HEADER_LEFT_FONT HDRFTR_LEFT_FONT -HEADER_LEFT_FT HDRFTR_LEFT_FONT HEADER_LEFT HDRFTR_LEFT -HEADER_LEFT_PS HDRFTR_LEFT_SIZE -HEADER_LEFT_SIZE HDRFTR_LEFT_SIZE HEADER_PLAIN HDRFTR_PLAIN HEADER_RECTO HDRFTR_RECTO HEADER_RIGHT_CAPS HDRFTR_RIGHT_CAPS -HEADER_RIGHT_FAM HDRFTR_RIGHT_FAMILY -HEADER_RIGHT_FAMILY HDRFTR_RIGHT_FAMILY -HEADER_RIGHT_FONT HDRFTR_RIGHT_FONT -HEADER_RIGHT_FT HDRFTR_RIGHT_FONT HEADER_RIGHT HDRFTR_RIGHT -HEADER_RIGHT_PS HDRFTR_RIGHT_SIZE -HEADER_RIGHT_SIZE HDRFTR_RIGHT_SIZE HEADER_RULE_GAP HDRFTR_RULE_GAP HEADER_RULE HDRFTR_RULE -HEADER_SIZE HDRFTR_SIZE HEADER_VERSO HDRFTR_VERSO PAGENUM PAGENUMBER PAGINATION PAGINATE @@ -1525,9 +1996,200 @@ PRINT_FOOTNOTE_RULE FOOTNOTE_RULE SWITCH_FOOTERS SWITCH_HDRFTR SWITCH_HEADERS SWITCH_HDRFTR -TOC_FAM TOC_FAMILY TOC_LS TOC_LEAD TOC_PS TOC_PT_SIZE + ++++The following are used for docelement type-style control+++ + +AUTHOR_FAMILY _FAMILY +AUTHOR_FONT _FONT +AUTHOR_SIZE _SIZE +BIBLIOGRAPHY_FAMILY _FAMILY +BIBLIOGRAPHY_FONT _FONT +BIBLIOGRAPHY_FOOTER_CENTER BIBLIOGRAPHY_HDRFTR_CENTER +BIBLIOGRAPHY_FOOTER_CENTRE BIBLIOGRAPHY_HDRFTR_CENTRE +BIBLIOGRAPHY_HEADER_CENTER BIBLIOGRAPHY_HDRFTR_CENTER +BIBLIOGRAPHY_HEADER_CENTRE BIBLIOGRAPHY_HDRFTR_CENTRE +BIBLIOGRAPHY_QUAD _QUAD +BIBLIOGRAPHY_STRING_FAMILY _FAMILY +BIBLIOGRAPHY_STRING_FONT _FONT +BIBLIOGRAPHY_STRING_QUAD _QUAD +BIBLIOGRAPHY_STRING_SIZE _SIZE +BLOCKQUOTE_AUTOLEAD Q_AUTOLEAD +BLOCKQUOTE_AUTOLEAD QUOTE_AUTOLEAD +BLOCKQUOTE_COLOR _COLOR +BLOCKQUOTE_FAMILY _FAMILY +BLOCKQUOTE_FONT _FONT +BLOCKQUOTE_QUAD _QUAD +BLOCKQUOTE_SIZE _SIZE +CHAPTER_TITLE_COLOR _COLOR +CHAPTER_TITLE_FAMILY _FAMILY +CHAPTER_TITLE_FONT _FONT +CHAPTER_TITLE_SIZE _SIZE +COVER_ATTRIBUTE_COLOR _COLOR +COVER_AUTHOR_COLOR _COLOR +COVER_AUTHOR_FAMILY _FAMILY +COVER_AUTHOR_FONT _FONT +COVER_AUTHOR_SIZE _SIZE +COVER_COLOR _COLOR +COVER_COPYRIGHT_COLOR _COLOR +COVER_COPYRIGHT_FAMILY _FAMILY +COVER_COPYRIGHT_FONT _FONT +COVER_COPYRIGHT_QUAD _QUAD +COVER_COPYRIGHT_SIZE _SIZE +COVER_DOCTYPE_COLOR _COLOR +COVER_DOCTYPE_FAMILY _FAMILY +COVER_DOCTYPE_FONT _FONT +COVER_DOCTYPE_SIZE _SIZE +COVER_FAMILY _FAMILY +COVER_MISC_COLOR _COLOR +COVER_MISC_QUAD _QUAD +COVER_SUBTITLE_COLOR _COLOR +COVER_SUBTITLE_FAMILY _FAMILY +COVER_SUBTITLE_FONT _FONT +COVER_SUBTITLE_SIZE _SIZE +COVER_TITLE_COLOR _COLOR +COVER_TITLE_FAMILY _FAMILY +COVER_TITLE_FONT _FONT +COVER_TITLE_SIZE _SIZE +DOC_COVER_ATTRIBUTE_COLOR _COLOR +DOC_COVER_AUTHOR_COLOR _COLOR +DOC_COVER_AUTHOR_FAMILY _FAMILY +DOC_COVER_AUTHOR_FONT _FONT +DOC_COVER_AUTHOR_SIZE _SIZE +DOC_COVER_COLOR _COLOR +DOC_COVER_COPYRIGHT_COLOR _COLOR +DOC_COVER_COPYRIGHT_FAMILY _FAMILY +DOC_COVER_COPYRIGHT_FONT _FONT +DOC_COVER_COPYRIGHT_QUAD _QUAD +DOC_COVER_COPYRIGHT_SIZE _SIZE +DOC_COVER_DOCTYPE_COLOR _COLOR +DOC_COVER_DOCTYPE_FAMILY _FAMILY +DOC_COVER_DOCTYPE_FONT _FONT +DOC_COVER_DOCTYPE_SIZE _SIZE +DOC_COVER_FAMILY _FAMILY +DOC_COVER_MISC_COLOR _COLOR +DOC_COVER_MISC_QUAD _QUAD +DOC_COVER_SUBTITLE_COLOR _COLOR +DOC_COVER_SUBTITLE_FAMILY _FAMILY +DOC_COVER_SUBTITLE_FONT _FONT +DOC_COVER_SUBTITLE_SIZE _SIZE +DOC_COVER_TITLE_COLOR _COLOR +DOC_COVER_TITLE_FAMILY _FAMILY +DOC_COVER_TITLE_FONT _FONT +DOC_COVER_TITLE_SIZE _SIZE +DOCHEADER_COLOR _COLOR +DOCHEADER_FAMILY _FAMILY +DOC_QUAD _QUAD +DOCTYPE_FAMILY _FAMILY +DOCTYPE_FONT _FONT +DOCTYPE_SIZE _SIZE +ENDNOTE_BLOCKQUOTE_AUTOLEAD Q_AUTOLEAD +ENDNOTE_BLOCKQUOTE_AUTOLEAD QUOTE_AUTOLEAD +ENDNOTE_FAMILY _FAMILY +ENDNOTE_FONT _FONT +ENDNOTE_LINENUMBER_FAMILY _FAMILY +ENDNOTE_LINENUMBER_FONT _FONT +ENDNOTE_LINENUMBER_SIZE _SIZE +ENDNOTE_NUMBER_FAMILY _FAMILY +ENDNOTE_NUMBER_FONT _FONT +ENDNOTE_NUMBER_SIZE _SIZE +ENDNOTE_QUAD _QUAD +ENDNOTE_QUOTE_AUTLOEAD Q_AUTOLEAD +ENDNOTE_QUOTE_AUTOLEAD QUOTE_AUTOLEAD +ENDNOTE_STRING_FAMILY _FAMILY +ENDNOTE_STRING_FONT _FONT +ENDNOTE_STRING_QUAD _QUAD +ENDNOTE_STRING_SIZE _SIZE +ENDNOTE_TITLE_FAMILY _FAMILY +ENDNOTE_TITLE_FONT _FONT +ENDNOTE_TITLE_QUAD _QUAD +ENDNOTE_TITLE_SIZE _SIZE +EPIGRAPH_COLOR _COLOR +EPIGRAPH_FAMILY _FAMILY +EPIGRAPH_FONT _FONT +EPIGRAPH_QUAD _QUAD +EPIGRAPH_SIZE _SIZE +FINIS_COLOR _COLOR +FOOTNOTE_COLOR _COLOR +FOOTNOTE_FAMILY _FAMILY +FOOTNOTE_FONT _FONT +FOOTNOTE_QUAD _QUAD +FOOTNOTE_SIZE _SIZE +HDRFTR_CENTER_FAMILY _FAMILY +HDRFTR_CENTER_FONT _FONT +HDRFTR_CENTER_SIZE _SIZE +HDRFTR_COLOR _COLOR +HDRFTR_FAMILY _FAMILY +HDRFTR_LEFT_FAMILY _FAMILY +HDRFTR_LEFT_FONT _FONT +HDRFTR_LEFT_SIZE _SIZE +HDRFTR_RIGHT_FAMILY _FAMILY +HDRFTR_RIGHT_FONT _FONT +HDRFTR_RIGHT_SIZE _SIZE +HDRFTR_RULE_COLOR _COLOR +HDRFTR_SIZE _SIZE +HEAD_COLOR _COLOR +HEAD_FAMILY _FAMILY +HEAD_FONT _FONT +HEAD_QUAD _QUAD +HEAD_SIZE _SIZE +LINEBREAK_COLOR _COLOR +MISC_COLOR _COLOR +MISC_QUAD _QUAD +PAGENUM_COLOR _COLOR +PAGENUM_FAMILY _FAMILY +PAGENUM_FONT _FONT +PARAHEAD_COLOR _COLOR +PARAHEAD_FAMILY _FAMILY +PARAHEAD_FONT _FONT +PARAHEAD_SIZE _SIZE +QUOTE_COLOR _COLOR +QUOTE_FAMILY _FAMILY +QUOTE_FONT _FONT +QUOTE_INDENT _INDENT +QUOTE_SIZE _SIZE +REF_INDENT INDENT_REFS +REF) REF_BRACKETS_END +REF] REF_BRACKETS_END +REF} REF_BRACKETS_END +REF( REF_BRACKETS_START +REF[ REF_BRACKETS_START +REF{ REF_BRACKETS_START +SUBHEAD_COLOR _COLOR +SUBHEAD_FAMILY _FAMILY +SUBHEAD_FONT _FONT +SUBHEAD_SIZE _SIZE +SUBTITLE_COLOR _COLOR +SUBTITLE_FAMILY _FAMILY +SUBTITLE_FONT _FONT +SUBTITLE_SIZE _SIZE +TITLE_COLOR _COLOR +TITLE_FAMILY _FAMILY +TITLE_FONT _FONT +TITLE_SIZE _SIZE +TOC_FAM _FAMILY +TOC_FAMILY _FAMILY +TOC_HEADER_FAMILY _FAMILY +TOC_HEADER_FONT _FONT +TOC_HEADER_QUAD _QUAD +TOC_HEADER_SIZE _SIZE +TOC_HEAD_FAMILY _FAMILY +TOC_HEAD_FONT _FONT +TOC_HEAD_SIZE _SIZE +TOC_PARAHEAD_FAMILY _FAMILY +TOC_PARAHEAD_FONT _FONT +TOC_PARAHEAD_SIZE _SIZE +TOC_PN_FAMILY _FAMILY +TOC_PN_FONT _FONT +TOC_PN_SIZE _SIZE +TOC_PT_SIZE _SIZE +TOC_SUBHEAD_FAMILY _FAMILY +TOC_SUBHEAD_FONT _FONT +TOC_SUBHEAD_SIZE _SIZE +TOC_TITLE_FAMILY _FAMILY +TOC_TITLE_FONT _FONT +TOC_TITLE_SIZE _SIZE
    diff -ruN groff-1.19.1/contrib/mom/momdoc/toc.html groff-1.19.2/contrib/mom/momdoc/toc.html --- groff-1.19.1/contrib/mom/momdoc/toc.html 2004-03-22 07:18:37.000000000 +0100 +++ groff-1.19.2/contrib/mom/momdoc/toc.html 2005-08-07 09:59:33.000000000 +0200 @@ -1,17 +1,31 @@ + -Mom -- Table of Contents +Mom, version 1.3-a -- Table of Contents -

    Table of Contents

    -This link takes you to the top of the Table of Contents proper +

    Table of Contents for mom, version 1.3-a

    + +The table of contents has grown quite large. If you've been using +mom for a while, you might prefer the +Quick Reference Guide. +

    +If you're new to mom, click on any link in the +Quick Table of Contents +to go to the +appropriate section of the Full Table of Contents. +

    +Or click +here +to go directly to the Full Table of Contents.


    -

    Quick Table of Contents Navigation

    + +

    Quick Table of Contents

    INTRODUCTORY STUFF +

    DOCUMENT PROCESSING WITH MOM



    -

    The Table of Contents Proper

    +

    Full Table of Contents

  • 1. WHAT IS MOM? @@ -92,7 +109,7 @@
  • 4.2.1 Macro list -
  • 4.3 Basic Parameters -- family, font, point size, line space, line length, autolead +
  • 4.3 Basic Parameters -- family, font, fallback font, point size, line space, line length, autolead @@ -144,7 +161,7 @@
  • 4.11 Goodies -- aliases, transparent lines, smartquotes, caps, underscoring/underlining, padding lines, leaders, drop - caps, superscripts, (nested) lists + caps, superscripts, (nested) lists, user-definable strings @@ -188,6 +205,10 @@
  • 5.3.2.6 CHAPTER_TITLE
  • 5.3.2.7 DRAFT
  • 5.3.2.8 REVISION +
  • 5.3.2.9 COPYRIGHT +
  • 5.3.2.10 MISC +
  • 5.3.2.11 COVER_TITLE +
  • 5.3.2.12 DOC_COVER_TITLE
  • 5.3.3 The Docstyle Macros
      @@ -197,12 +218,15 @@
  • 5.3.4 Changing Type and Style Parameters before START
  • 5.3.5 ***START*** -- the macro to initiate document processing @@ -211,6 +235,8 @@ + +
  • 5.3.7 Using typesetting macros during document processing
  • 5.4 THE DOCUMENT ELEMENT TAGS @@ -225,15 +251,17 @@
  • 5.4.4 Main heads
  • 5.4.5 Subheads
  • 5.4.6 Paragraph heads -
  • 5.4.7 Linebreaks -- author linebreaks -
  • 5.4.8 Quotes -- line for line poetic quotes or unformatted, verbatim text +
  • 5.4.7 Linebreaks -- author linebreaks (section breaks) +
  • 5.4.8 Quotes -- line for line poetic quotes or unformatted, verbatim text (e.g. code snippets)
  • 5.4.9 Blockquotes -- cited material
  • 5.4.10 Lists -- (nested) lists -
  • 5.4.11 Footnotes -
  • 5.4.12 Endnotes -
  • 5.4.13 Blank page -
  • 5.4.14 Table of contents -
  • 5.4.15 Document termination -- FINIS +
  • 5.4.11 Line numbering +
  • 5.4.12 Footnotes +
  • 5.4.13 Endnotes +
  • 5.4.14 Margin notes +
  • 5.4.15 Blank pages +
  • 5.4.16 Table of contents +
  • 5.4.17 Document termination -- FINIS
  • 5.5 DOCUMENT HEADERS AND FOOTERS @@ -267,26 +295,34 @@ -
  • 5.8 CREATING A COVER PAGE +
  • 5.8 CREATING COVER PAGES +
    + +
  • 5.9 BIBLIOGRAPHIES AND REFERENCES
    -
  • 5.9 WRITING LETTERS +
  • 5.10 WRITING LETTERS - -
  • 5.10 USING TYPESETTING MACROS DURING DOCUMENT PROCESSING + +
  • 6. QUICK REFERENCE GUIDE TO MOM +

    -

  • 6. APPENDICES +
  • 7. APPENDICES diff -ruN groff-1.19.1/contrib/mom/momdoc/typemacdoc.html groff-1.19.2/contrib/mom/momdoc/typemacdoc.html --- groff-1.19.1/contrib/mom/momdoc/typemacdoc.html 2004-03-22 07:18:37.000000000 +0100 +++ groff-1.19.2/contrib/mom/momdoc/typemacdoc.html 2005-05-14 07:54:53.000000000 +0200 @@ -1,3 +1,4 @@ + @@ -7,8 +8,8 @@ -Next   -Prev   +Next   +Prev   Back to Table of Contents

    @@ -51,14 +52,6 @@ leading, and quad. -

    -NOTE: See the section on -Top and bottom margins in document processing -for information on how mom interprets -T_MARGIN -and -B_MARGIN -in document processing.

    Mom assumes that any changes to these parameters @@ -70,7 +63,17 @@

    The following lists those typesetting macros whose behaviour during document processing requires some explanation. -

    +(Please refer to +Top and bottom margins in document processing +for information on how mom interprets +T_MARGIN +and +B_MARGIN +in document processing. Additionally, see +ADD_SPACE +if you encounter the problem of trying to get mom +to put space at the tops of pages after the first.) +

     MACRO           EFFECT DURING DOCUMENT PROCESSING
     -----           ---------------------------------
    @@ -176,10 +179,56 @@
     footers,
     or page numbers.
     
    +
    +	

    ADD_SPACE

    +
    + +

    +Occasionally, you may want to insert space before the start of +running text +on pages after the first. +

    +You might have tried using +ALD +or +SPACE +and found it did nothing. This is because mom +normally inhibits any extra space before the start of running text +on pages after the first. +

    +If you need the space, you must use the macro, +ADD_SPACE, in conjuction with +NEWPAGE. +ADD_SPACE takes as its single argument the +distance you want mom to advance from the normal +baseline position at the top of the page. A +unit of measure +is required. + +

    +For example, say you wanted to insert 2 inches of space before the +start of running text on a page other than the first. You'd +accomplish it with + +

    +

    +	.NEWPAGE
    +	.ADD_SPACE 2i
    +
    + +which would terminate your current page, break to a new page, +print the header (assuming headers are on) and insert 2 inches of +space before the start of running text. +

    +Since adding space in this way is almost sure to disrupt +mom's ability to guarantee perfectly flush bottom +margins, I highly recommend using the +SHIM +macro immediately after ADD_SPACE.


    -Next   -Prev   +Next   +Prev   Top   Back to Table of Contents diff -ruN groff-1.19.1/contrib/mom/momdoc/typesetting.html groff-1.19.2/contrib/mom/momdoc/typesetting.html --- groff-1.19.1/contrib/mom/momdoc/typesetting.html 2004-03-22 07:18:37.000000000 +0100 +++ groff-1.19.2/contrib/mom/momdoc/typesetting.html 2005-08-07 09:59:33.000000000 +0200 @@ -1,3 +1,4 @@ + @@ -29,7 +30,7 @@
  • Introduction to Basic Parameters
  • List of macros -
  • JUSTIFYING, QUADDING, FILLING, BREAKING LINES +
  • JUSTIFYING, QUADDING, FILLING, BREAKING and JOINING LINES
    • Introduction to justify, quad, fill, break
    • List of macros @@ -109,8 +110,8 @@ Mom's typesetting macros can be used as a standalone package, independent of the document processing macros. -With them, you can typeset on-the-fly. Document covers, your best -friend's résumé, a poster for a lost dog -- none of these requires +With them, you can typeset on-the-fly. Book covers, your best +friend's résumé, a poster for a lost dog--none of these requires structured document processing (page headers, paragraphs, heads, footnotes, etc). What they do demand is precise control over every element on the page. The typesetting macros give you that control. @@ -163,7 +164,7 @@

      Page width


      -Macro: PAGEWIDTH <width of printer sheet> +Macro: PAGEWIDTH <width of printer sheet>
      *Requires a unit of measure @@ -182,7 +183,7 @@

      Page length


      -Macro: PAGELENGTH <length of printer sheet> +Macro: PAGELENGTH <length of printer sheet>
      *Requires a unit of measure @@ -202,12 +203,12 @@

      Paper


      -Macro: PAPER <paper type> +Macro: PAPER <paper type>

      PAPER provides a convenient way to set the page -dimensions for some common printer sheet sizes. <paper -type> can be one of: +dimensions for some common printer sheet sizes. <paper +type> can be one of:

       	LETTER
      @@ -245,7 +246,7 @@
       

      Left margin


      -Macro: L_MARGIN <left margin> +Macro: L_MARGIN <left margin>
      *Requires a unit of measure @@ -291,7 +292,7 @@

      Right margin


      -Macro: R_MARGIN <right margin> +Macro: R_MARGIN <right margin>
      *Requires a unit of measure @@ -365,7 +366,7 @@

      Top margin


      -Macro: T_MARGIN <top margin> +Macro: T_MARGIN <top margin>
      *Requires a unit of measure @@ -417,7 +418,7 @@

      Bottom margin


      -Macro: B_MARGIN <bottom margin> +Macro: B_MARGIN <bottom margin>
      *Requires a unit of measure @@ -459,7 +460,7 @@

      Page


      Macro: PAGE -<width> [ <length> [ <lm> [ <rm> [ <tm> [ <bm> ] ] ] ] ] +<width> [ <length> [ <lm> [ <rm> [ <tm> [ <bm> ] ] ] ] ]
      *All arguments require a unit of measure @@ -467,8 +468,8 @@ PAGE lets you establish paper dimensions and page margins with a single macro. The only required argument is page width. The rest are optional, but they must appear in order and you can't -skip over any. <lm>, <rm>, <tm> -and <bm> refer to the left, right, top and bottom +skip over any. <lm>, <rm>, <tm> +and <bm> refer to the left, right, top and bottom margins respectively.

      Assuming your page dimensions are 11 inches by 17 inches, and that's @@ -486,7 +487,7 @@

      Now suppose you also want to set the top margin, say, at 1-1/2 -inches. <tm> comes after <rm> +inches. <tm> comes after <rm> in the optional arguments, but you can't skip over any arguments, therefore to set the top margin, you must also give a right margin. The PAGE macro would look like this: @@ -546,9 +547,15 @@ (subject to the top margin set with T_MARGIN.

      -Experts: NEWPAGE is an alias of -.bp. You can use either, or mix 'n' match with -impunity. +Experts: Prior to version 1.1.9, +NEWPAGE was simply an alias of +.bp. As of 1.1.9, NEWPAGE, +is its own mom macro. While the new macro +should be backwardly compatible with documents created using +pre-1.1.9 moms, I suggest that from this version +onward, if you were in the habit of using .bp +whenever you wanted to break to a new page, you now begin to use +NEWPAGE instead.


      @@ -574,6 +581,7 @@
      • FAMILY (type family)
      • FONT (font) +
      • FALLBACK_FONT (for invalid fonts)
      • PT_SIZE (point size of type)
      • LS (line spacing/leading)
      • AUTOLEAD (automatic line spacing) @@ -585,12 +593,13 @@

        Type family


        -Macro: FAMILY <family> +Macro: FAMILY <family>
        Alias: FAM

        -FAMILY takes one argument: the name of the type family +FAMILY takes one argument: the name of the +family you want. Groff comes with a number of PostScript families, each identified by a 1-, 2- or 3-letter mnemonic. The standard families are: @@ -598,29 +607,80 @@

  • +
    \*[BU1]...\*[BU36]
    -Move back 1...36 -kern units -
    \*[FU1]...\*[FU36]
    -Move forward 1...36 -kern units + + + + + + + + +
    \*[BU1]...\*[BU36]
    Move back 1...36 kern units
    \*[FU1]...\*[FU36]
    Move forward 1...36 kern units

    also exist (i.e. with no space before the number of kern units desired, @@ -262,17 +287,21 @@

    Mom's inline escapes for these horizontal movements are

    - +
    + - + + + - + +
    \*[FWD #<unit>]
    -
    Move forward inline the specified number of -units of measure; -decimal fractions are allowed. +
    \*[FWD n<unit>]
    Move forward inline the specified number of + units of measure; + decimal fractions are allowed.
    \*[BCK #<unit>]
    -
    Move backward inline the specified number of -units of measure; -decimal fractions are allowed. +
    \*[BCK n<unit>]
    Move backward inline the specified number of + units of measure; + decimal fractions are allowed.

    For example, @@ -285,9 +314,15 @@

    NOTE: For backward compatibility, the forms

    - - +
    \*[BP.25]...\*[BP12.75]
    Move back .25...12.75 points -
    \*[FP.25]...\*[FP12.75]
    Move forward .25...12.75 points
    + + + + + + + +
    \*[BP.25]...\*[BP12.75]
    Move back .25...12.75 points
    \*[FP.25]...\*[FP12.75]
    Move forward .25...12.75 points

    also exist (i.e. with no space before the digit and points being @@ -306,15 +341,19 @@ If you need to move portions of type up or down on a line, mom provides the following inline escapes:

    - +
    + - + + + - + +
    \*[UP #<unit>]
    -
    Move up inline the specified number of -units of measure +
    \*[UP n<unit>]
    Move up inline the specified number of + units of measure
    \*[DOWN #<unit>]
    -
    Move down inline the specified number of -units of measure +
    \*[DOWN n<unit>]
    Move down inline the specified number of + units of measure

    For example, @@ -326,14 +365,25 @@ moves the hyphen in the telephone number up by 1 point, then moves back down by the same amount.

    -NOTE: For backward compatibility, the following are -also available: -

    - - +NOTE: \*[UP] and \*[DOWN] do not +work with the inline escape, +\*[RULE]. +See +here +for details. +

    +ADDITIONAL NOTE: For backward compatibility, the +following are also available: +

    +

    \*[ALD.25]...\*[ALD12.75]
    -Advance lead .25...12.75 points (move downward) -
    \*[RLD.25]...\*[RLD12.75]
    -Reverse lead .5...12.75 points (move upward)
    + + + + + +
    \*[ALD.25]...\*[ALD12.75]
    +
    Advance lead .25...12.75 points (move downward) +
    \*[RLD.25]...\*[RLD12.75]
    Reverse lead .5...12.75 points (move upward)

    @@ -341,6 +391,70 @@ points, hence you mustn't use a unit of measure.

    + + +


    +

    Terminate a line without advancing on the page

    + +

    +Sometimes, you want mom to break a line but not +advance on the page. See +here +for an example of when you might want to do this. +

    +In versions of mom prior to 1.2-f, this was +accomplished through the use of +EL. +As of 1.2-f, you can, if you prefer, accomplish the same thing +by using the inline escape, \*[B]. Simply +attach the escape to the end of any line. Using the example +given in the document entry for EL, you'd use +\*[B] like this: + +

    +

    +	.LEFT
    +	.LS 12.5
    +	A line of text.\*[B]
    +	.ALD 24p
    +	The next line of text.
    +
    + +\*[B] works reliably regardless of the current +fill mode. +

    + + + +


    +

    Call the next sequential tab without advancing on the page

    + +

    +Sometimes, you want mom to move to the next tab in +sequence (e.g. from TAB 1 to TAB 2, or TAB 8 to TAB 9) without +mom advancing on the page. (See the example in +here +if you're not clear how mom manages tabs and +linebreaks.) +

    +In versions of mom prior to 1.2-f, this was +accomplished through the use of +TN. +As of 1.2-f, you can, if you prefer, accomplish the same thing +by using the inline escape, \*[TB+]. Simply +attach the escape to the end of any line in a tab, like this: + +

    +

    +	.TAB 1
    +	Some text\*[TB+]    \" This line is in tab 1
    +	Some more text      \" This line is in tab 2, on the same baseline as tab 1
    +
    + +\*[TB+] works reliably regardless of the current +fill mode. +

    +


    @@ -362,7 +476,7 @@ The above draws a rule the full measure of the 6-pica line length.

    -\*[$RULE] should appear on a line by itself. In +\*[RULE] should appear on a line by itself. In fill modes, (i.e. QUAD @@ -370,7 +484,8 @@ JUSTIFY), it requires a .BR -on the line immediately before it; in +on the line immediately before it; otherwise, the rule will be drawn +on the same baseline occupied by any type preceding it. In nofill modes (i.e LEFT, @@ -379,7 +494,7 @@ CENTER), the .BR is not required.

    -Please note that \*[$RULE] draws the rule to the +Please note that \*[RULE] draws the rule to the full measure, hence it cannot be used to fill the remainder of a partial line with a rule in this way:

    @@ -395,7 +510,27 @@ (See the example provided with PAD.) + +

    +Please also note that the inline escapes +\*[UP] +and +\*[DOWN] +cannot be used in conjunction with \*[RULE]. This +doesn't work: +

    +

    +	\*[DOWN 2p]\*[RULE]\*[UP 2p]
    +
    + +This does:

    +

    +	.ALD 2p
    +	\*[RULE]
    +	.RLD 2p
    +
    + See groff's Horizontal line drawing function for more information on drawing horizontal rules. @@ -410,28 +545,47 @@

    Groff's basic mechanism for inline font control is the escape -\f. +\f[<font>].

    - - +
    \fRChange font to roman -
    \fIChange font to italic -
    \fBChange font to bold -
    \f(BIChange font to bold italic -
    \fPRevert to previous font
    + + + + + + + + + + + + + + + + + + + +
    \f[R]Change font to medium roman (equivalent to mom's \*[ROM])
    \f[I]Change font to medium italic (equivalent to mom's \*[IT])
    \f[B]Change font to bold roman (equivalent to mom's \*[BD])
    \f[BI]Change font to bold italic (equivalent to mom's \*[BDI])
    \f[P]Revert to previous font (equivalent to mom's \*[PREV])

    -A special instance of \f is -\f[font], where "font" can be a -complete legal family/font name combo. This is especially -useful should you need to change both family and font inline. -For example, if your prevailing family and font are Times Roman -and you want a few words in Courier Bold Italic, you could do -this: +\f[<font>] can be used with +any legal font style registered with groff. (See +here +for a list of pre-registered font styles provided by +mom). +

    +\f[<font>] can also take a +complete legal family+font name combo. This is especially useful +should you need to change both family and font inline. For example, +if your prevailing family and font are Times Roman and you want a +few words in Courier Bold Italic, you could do this:

     	.FAM T
     	.FT  R
    -	The command \f[CBI]ls -l\fP gives a "long" directory listing.
    +	The command \f[CBI]ls -l\f[P] gives a "long" directory listing.
     
    The Unix command "ls -l" will appear in Courier Bold Italic @@ -458,7 +612,7 @@ position on the current output line. \h'<distance>' is exactly equivalent to -\*[FWD #<unit>]. +\*[FWD n<unit>].

     	\h'-1.25i'
    @@ -466,7 +620,7 @@
     
     moves you 1.25 inches to the left (backwards).
     \h'-<distance>' is exactly equivalent to
    -\*[BCK #<unit>].
    +\*[BCK n<unit>].
     

    @@ -491,7 +645,7 @@ downward on the current output line. \v'<distance>' is exactly equivalent to -\*[DOWN #<unit>]. +\*[DOWN n<unit>].

     	\v'-.6m'
    @@ -499,7 +653,7 @@
     
     moves you (approx.) 2/3 of an em upward.
     \v'<-distance>' is exactly equivalent to \*[UP #<unit>].
    +href="#UP">\*[UP n<unit>].
     

    IMPORTANT: The vertical motion of \v affects ONLY type on the current @@ -578,14 +732,15 @@ typographically precise drawing is a bit like hammering in a nail with a screwdriver -- doable, but not recommended.

    -Groff comes with a number of "preprocessors" designed to ease -creating rules, boxes, splines, and so on (tbl, pic, and friends), but -I tend not to use them. A firm believer in the "right tool for -the job," I prefer a vector drawing program (in my case, tgif) -when I need to combine type with graphic elements (say, a complex -ruled form). Inserting the results into a document is easy enough -with .PSPIC (consult the grops -man page for information on this indispensable and easy-to-use macro). +Groff comes with a number of "preprocessors" designed +to ease creating rules, boxes, splines, and so on (tbl, pic, +and friends), but I tend not to use them. A firm believer +in the "right tool for the job," I prefer a vector +drawing program when I need to combine type with graphic elements +(say, a complex ruled form). Inserting the results into a +document is easy enough with .PSPIC (consult +the groff_tmac man page for information on this +indispensable and easy-to-use macro).

    @@ -598,11 +753,12 @@ via inline escapes. If you're not sure of the meaning of some of these characters, consult the Definitions of Terms. -For a more complete list, consult the section Special -Character Names at the end of the Tutorial Examples -in cstr54, available -here, -the groff info documentation, or man groff_char. +

    +For a complete list of special characters and glyphs (i.e. just +about anything you'd ever want to appear on the printed page, +including mathematical symbols, accented characters, unusual +ligatures and letters unique to various European languages), consult +man groff_char.

         CHARACTER                   ESCAPE SEQUENCE
    diff -ruN groff-1.19.1/contrib/mom/momdoc/intro.html groff-1.19.2/contrib/mom/momdoc/intro.html
    --- groff-1.19.1/contrib/mom/momdoc/intro.html	2004-02-22 10:17:08.000000000 +0100
    +++ groff-1.19.2/contrib/mom/momdoc/intro.html	2005-08-07 09:59:33.000000000 +0200
    @@ -1,3 +1,4 @@
    +
     
     
     
    @@ -25,6 +26,8 @@
     
    A note on mom's documentation
    +Canonical reference materials +
    How to read macro arguments

    Who is mom meant for?

    @@ -61,7 +64,7 @@ Because mom provides both typesetting and document processing macros, it's safe to say she blurs the distinction between document processing and document design. While her basic document style -comes with pretty spiffy defaults (okay -- change "spiffy" +comes with pretty spiffy defaults (okay--change "spiffy" to "typographically professional"), you can easily control how all the various document elements look: titles, page headers and footers, page numbering, heads, subheads, footnotes and so on can be @@ -102,10 +105,9 @@ START macro; see below), every macro is a literal command that remains in effect until you modify it or turn it off. This means that if you -want to create flyers, document covers, surveys, tabulated forms, -curricula vitae and so on, you may do so in the good old-fashioned -way: one step at a time with complete control over every element on -the page. +want to create flyers, surveys, tabulated forms, curricula vitae and +so on, you may do so in the good old-fashioned way: one step at a +time with complete control over every element on the page.

    Years of reading various mailing lists dealing with computer typesetting (groff, TeX, and friends) have convinced me that no program @@ -118,13 +120,12 @@ whatever it's worth, a similar problem exists with engraving musical scores by computer.)

    -Mom does not try to solve the problems posed by -things like hanging punctuation, left-margin adjustments for those -annoying "space-y" upper case letters like T and W, and -so on. She merely tries to provide tools that allow knowledgeable -typesetters to come up with solutions to these problems -in ways that are somewhat easier and more intuitive than manipulating -groff at the +Mom does not try to solve the problems posed +by things like hanging punctuation, left-margin adjustments for +upper case letters like T and W, and so on. She merely tries to +provide tools that allow knowledgeable typesetters to come up with +solutions to these problems in ways that are easier and more +intuitive than manipulating groff at the primitive level. As a professional typesetter of more than two decades, and a writer, I have encountered few situations that cannot be handled by @@ -132,7 +133,7 @@

    Author's note: One area where groff itself needs serious rethinking is in the matter of an algorithm that takes into -account both word AND letter spacing when +account both word and letter spacing when justifying lines. At present, only word spacing is adjusted, requiring what I consider an unnecessary amount of user intervention whenever @@ -158,12 +159,12 @@ don't provide. For example, you can switch between draft-style and final-copy output. If you regularly make submissions to publishers and editors who insist on "typewritten, double-spaced," there's a -special macro -- +special macro-- PRINTSTYLE TYPEWRITE --- that changes typeset documents into ones that would make your -high-school typing teacher proud. Footnotes, multiple columns, -recto/verso printing and user designable headers and footers are also -part of the fun. +--that changes typeset documents into ones that would make your +high-school typing teacher proud. Footnotes, endnotes, tables of +contents, multiple columns, nested lists, recto/verso printing and +user designable headers and footers are also part of the fun.

    Mom's philosophy

    @@ -195,8 +196,9 @@ it, groff primitives tend toward the abstruse, and most inline escapes are about as readable in-line as an encrypted password. This does not make for happy-camper writers, who either find themselves stuck -with document formatting style they don't really like, or are forced to -learn groff from the ground up -- a daunting task, to say the least. +with a document formatting style they don't really like, or are +forced to learn groff from the ground up--a daunting task, to say +the least.

    Mom aims to make creating documents a simple matter, but with no corresponding loss of user control. The document @@ -249,15 +251,17 @@ Mom's documentation assumes users know their way around GNU/Linux. It further assumes they at least know what groff is, even if they don't know much about it. Lastly, it assumes that -everyone -- groff newbies and experts alike -- learns faster from +everyone--groff newbies and experts alike--learns faster from a few well-placed examples than from manpage-style reference docs. What mom's documentation doesn't assume is that -you know everything -- not about groff, not about typesetting, +you know everything--not about groff, not about typesetting, not about document processing. Even experts have odd lacunae in their knowledge base. Therefore, whenever I suspect that a term or procedure will cause head scratching, I offer an explanation. And when explanations aren't enough, I offer examples. - +
    + +

    Canonical reference materials

    The canonical reference materials for groff are cstr54 (a downloadable PostScript copy of which is @@ -265,14 +269,15 @@ here) and the troff and groff_diff manpages. Another excellent source of information (maybe the best) -are the groff info pages, available by typing +is the groff info pages, available by typing

     	info groff
     
    at the command line (assuming you have info -installed on your system). +installed on your system). And for inputting special characters, +see man groff_char.

    I've tried to avoid reiterating the information contained in these documents; however, in a few places, this has proved impossible. @@ -293,7 +298,7 @@ The concise descriptions of macros in this documentation typically look like this:

    -Macro: NAME arguments +Macro: NAME arguments
    arguments lists the macro's arguments using conventions that should be familiar to anyone who has ever read a manpage. Briefly: @@ -324,14 +329,14 @@ Since these macros toggle things on and off, the argument list simply reads
    -toggle +toggle


    Example 1: an argument requiring double-quotes

    -Macro: TITLE "<title of document>" +Macro: TITLE "<title of document>"

    The required argument to TITLE is the title of your @@ -344,7 +349,7 @@

    Example 2: a macro with required and optional arguments

    -Macro: TAB_SET <tab #> <indent> <length> [ L | R | C | J [ QUAD ] ] +Macro: TAB_SET <tab #> <indent> <length> [ L | R | C | J [ QUAD ] ]

    The first required argument is a number that identifies the tab (say, @@ -372,7 +377,7 @@

    Example 3: a sample toggle macro:

    -Macro: QUOTE toggle +Macro: QUOTE toggle

    QUOTE begins a section of quoted text in a document diff -ruN groff-1.19.1/contrib/mom/momdoc/letters.html groff-1.19.2/contrib/mom/momdoc/letters.html --- groff-1.19.1/contrib/mom/momdoc/letters.html 2004-02-22 10:17:08.000000000 +0100 +++ groff-1.19.2/contrib/mom/momdoc/letters.html 2005-05-14 07:54:53.000000000 +0200 @@ -1,3 +1,4 @@ + @@ -7,8 +8,8 @@ -Next   -Prev   +Next   +Prev   Back to Table of Contents

    @@ -209,9 +210,10 @@ If you switch the order of .DATE, .TO and/or .FROM, mom sets all the headers flush left, with a gap of -one linespace underneath. (The default left quad of any header can -be changed by invoking the .RIGHT macro, on a line -by itself, immediately before inputting the text of the header.) +one linespace underneath each. (The default left quad of any header +can be changed by invoking the .RIGHT macro, on +a line by itself, immediately before inputting the text of the +header.)

    Following the headers, mom sets

    @@ -453,8 +455,8 @@


    -Next   -Prev   +Next   +Prev   Top   Back to Table of Contents diff -ruN groff-1.19.1/contrib/mom/momdoc/macrolist.html groff-1.19.2/contrib/mom/momdoc/macrolist.html --- groff-1.19.1/contrib/mom/momdoc/macrolist.html 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/contrib/mom/momdoc/macrolist.html 2005-05-14 07:54:53.000000000 +0200 @@ -0,0 +1,1794 @@ + + + + +Mom -- Quick reference guide + + + + + +Next   +Prev   +Back to Table of Contents + + +

    + Quick reference guide +

    + +Once you know your way around mom, you may find +this guide preferable to using the Table of Contents. It lists (I +hope) all mom's user-space macros. The links +point to references found elsewhere in the documentation. +

    +NOTE: This guide uses tables extensively. Better +make sure you're reading it in a browser that renders them +sensibly. +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypesettingDocument processing
    Page/paper size; margins; line lengthReference macros
    Family/font; pointsize; leadingLetters
    Font modificationsDocument style
    Underscoring and underliningSpecial to PRINTSTYLE TYPEWRITE
    ColourBegin document processing
    Quad, justification and fillCustomizing the document header
    Line terminationPagination
    HyphenationRecto/verso
    Word and sentence spacingAutomatic columns
    Kerning; ligaturesEpigraphs
    Vertical movementsHeads
    Horizontal movementsSubheads
    IndentsParagraph heads
    TabsParagraphs
    Manual columnsQuotes
    SuperscriptsBlockquotes
    DropcapsAuthor linebreaks
    ListsFootnotes
    Padding linesEndnotes
    MiscellaneousDesigning endnotes pages
     Lists
     Margin notes
     Line numbering
     References
     Bibliographies
     Table of contents
     Designing a table of contents
     Finis
     Headers and footers
     Part-by-part control +
    of headers
     Footers
     Covers and doc covers
     Customizing covers +
    and doc covers
     Part-by-part control of +
    covers and doc covers
     Miscellaneous
    + +
    +


    +

    Typesetting macros

    + +

    Page/paper size; margins; line length

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Page/paper sizeMarginsLine length
    PAGEWIDTHT_MARGINLL
    PAGELENGTHB_MARGIN 
    PAPERL_MARGIN 
    PAGER_MARGIN 
    + +

    Family/font; pointsize; leading

    + + + + + + + + + + + + + + + + + + + + + + +
    Family/fontPoint sizeLeading
    FAMILYPT_SIZELS
    FT\*[SIZE n]AUTOLEAD
    FALLBACK_FONT  
    + +

    Font modifications (pseudo-italic, -bold, -condensed, -extended)

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ItalicizeEmboldenCondenseExtend
    SETSLANTSETBOLDERCONDENSEEXTEND
    \*[SLANT]\*[BOLDER]\*[COND]\*[EXT]
    \*[SLANTX]\*[BOLDERX]\*[CONDX]\*[EXTX]
    + +

    Underscoring and underlining

    + + + + + + + + + + + + + + +
    UnderscoreUnderline
    UNDERSCOREUNDERLINE
    UNDERSCORE_2\*[UL]...\*[ULX]
    + +

    Colour

    + + + + + + + + + + + + + +
    Define coloursInvoke colours
    NEWCOLORCOLOR
    XCOLOR\*[<colorname>]
    + +

    Quad, justification and fill

    + + + + + + + + + + + + + + + + + + +
    Fill modesNo-fill modes
    JUSTIFYLEFT
    QUADCENTER
     RIGHT
    + +

    Line termination

    + + + + + + + + + + + + + + +
    BreakBreak (no space)Break (extra space)Break (force justify)
    BRELSPACESPREAD
    + +

    Hyphenation

    + + + + + + + + + + +
    EnableSet parameters
    HYHY_SET
    + +

    Word and sentence spacing

    + + + + + + + + + + +
    Word spaceSentence space
    WSSS
    + +

    Character pair and full line kerning; ligatures

    + + + + + + + + + + + + + + + + + + + + +
    Kern character pairsKern full linesLigatures
    KERNRWLIGATURES
    \*[BU n] + EW 
    \*[FU n] + BR_AT_LINE_KERN 
    + +

    Vertical movements

    + + + + + + + + + + + + + + +
    DownUp
    ALDRLD
    \*[DOWN n]\*[UP n]
    + +

    Horizontal movements

    + + + + + + + + + + +
    ForwardBack
    \*[FWD n]\*[BCK n]
    + +

    Indents

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    LeftRightBothQuitTempHanging
    ILIRIBIQTIHI
    ILXIRXIBX   
    + +

    Tabs

    + + + + + + + + + + + + + + + + + + + + + + +
    SetupInvokingQuitting
    TAB_SETTABTQ
    \*[STn]...\*[STnX]TN 
    ST  
    + +

    Manual columns

    + + + + + + + + + + + + +
    InitializingReturning to topExiting
    MCOMCRMCX
    + +

    Superscripts

    + + + + + + + + + + + + +
    SuperscriptCondensed superscriptExtended superscript
    \*[SUP]...\*[SUPX]\*[CONDSUP]...\*[CONDSUPX]\*[EXTSUP]...\*[EXTSUPX]
    + +

    Dropcaps

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    InvokingDropcap control
    DROPCAPDROPCAP_FAMILY
     DROPCAP_FONT
     DROPCAP_COLOR
     DROPCAP_ADJUST
     DROPCAP_GUTTER
    + +

    Lists

    + + + + + + + + + + + + + + + + + + + + + + +
    InitializingSetting itemsList control
    LISTITEMSHIFT_LIST
      RESET_LIST
      PAD_LIST_DIGITS
    + +

    Padding lines

    + + + + + + + + + + +
    Pad a lineChange the pad marker
    PADPAD_MARKER
    + +

    Miscellaneous

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NewpageAll capsSmartquotesRules/leaders
    NEWPAGECAPSSMARTQUOTES\*[RULE]
       \*[LEADER]
       LEADER_CHARACTER
    +
    + + + + + + + + + + + + + + + + + +
    Change the escape characterSuppress inputDisable traps
    ESC_CHARCOMMENTTRAP
     SILENT 
    + +
    +
    + +

    Document processing

    + +

    Reference macros

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TitlesAuthorsDraft copies
    TITLEAUTHORDRAFT
    SUBTITLE REVISION
    DOCTITLE DRAFT_STRING
    CHAPTER REVISION_STRING
    + +

    Letters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    HeadersClosingControl
    DATECLOSINGNO_SUITE
    FROM  
    TO  
    GREETING  
    + +

    Document style

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Basic styleStyle control*
    COPYSTYLEDOC_LEFT_MARGIN
    DOCTYPEDOC_RIGHT_MARGIN
    PRINTSTYLE**DOC_LINE_LENGTH
     DOC_FAMILY
     DOC_PT_SIZE
     DOC_LEAD
     DOC_LEAD_ADJUST
     DOC_QUAD
    +

    +*See the note +Changing document-wide style parameters after START +
    +**Absolutely required if you wish to use the document processing macros. + +

    Special to PRINTSTYLE TYPEWRITE

    + + + + + + + + + + + + + + + + + + + + + + +
    Italic/underliningQuotes
    UNDERLINE_ITALICUNDERLINE_QUOTES
    ITALIC_MEANS_ITALIC 
    UNDERLINE_SLANT 
    SLANT_MEANS_SLANT 
    + +

    Begin document processing

    + + + + + + + +
    Absolutely required in order to initialize document processing
    START
    + +

    Customizing the document header

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    GlobalTitleSubtitleChapter
    DOCHEADERTITLE_FAMILYSUBTITLE_FAMILYCHAPTER_STRING
    DOCHEADER_ADVANCETITLE_FONTSUBTITLE_FONTCHAPTER_TITLE_FAMILY
    DOCHEADER_FAMILYTITLE_SIZESUBTITLE_SIZECHAPTER_TITLE_FONT
    DOCHEADER_COLORTITLE_COLORSUBTITLE_COLORCHAPTER_TITLE_SIZE
       CHAPTER_TITLE_COLOR
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AttributionAuthorDocument type
    ATTRIBUTE_STRINGAUTHOR_FAMILYDOCTYPE_FAMILY
    ATTRIBUTE_COLORAUTHOR_FONTDOCTYPE_FONT
     AUTHOR_SIZEDOCTYPE_SIZE
     AUTHOR_COLORDOCTYPE_COLOR
    + +

    Pagination

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PaginateStyle control
    PAGINATEPAGENUM_FAMILY
    PAGENUMBERPAGENUM_FONT
    PAGENUM_STYLE*PAGENUM_SIZE
    PAGENUM_ON_FIRST_PAGEPAGENUM_COLOR
    DRAFT_WITH_PAGENUMBERPAGENUM_POS
    SUSPEND_PAGINATIONPAGENUM_HYPHENS
    RESTORE_PAGINATION 
    +

    +*I.e. the "format" of page numbering (digits, roman numerals, letters) + +

    Recto/verso

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EnablingControlingUser-defined page headers/footers +
    + for alternating pages* +
    RECTO_VERSOSWITCH_HEADERSHEADER_RECTO
     SWITCH_FOOTERS*HEADER_VERSO
      FOOTER_RECTO*
      FOOTER_VERSO*
    +

    +*Please note that most aspects of page header and footer control +are treated identically. In the documentation, the descriptions +of macros that control header and footer behaviour usually only +mention "HEADER" or "HEADER_". Simply apply +"FOOTER" or "FOOTER_" to the appropriate +"HEADER" or "HEADER_"macros in order to enable +their behaviour for footers. + + +

    Automatic columns

    + + + + + + + + + + + + + + +
    EnablingControling
    COLUMNSCOL_NEXT
     COL_BREAK
    + +

    Epigraphs

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MacroType-style controlOther
    EPIGRAPHEPIGRAPH_FAMILYEPIGRAPH_AUTOLEAD
     EPIGRAPH_FONTEPIGRAPH_QUAD
     EPIGRAPH_SIZEEPIGRAPH_INDENT
     EPIGRAPH_COLOR 
    + +

    Heads

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MacroType-style controlOther
    HEADHEAD_FAMILYHEAD_QUAD
     HEAD_FONTHEAD_CAPS
     HEAD_SIZEHEAD_UNDERLINE
     HEAD_COLORHEAD_SPACE
      NUMBER_HEADS
      RESET_HEAD_NUMBER
    + +

    Subheads

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MacroType-style controlOther
    SUBHEADSUBHEAD_FAMILYSUBHEAD_QUAD
     SUBHEAD_FONTNUMBER_SUBHEADS
     SUBHEAD_SIZERESET_SUBHEAD_NUMBER
      SUBHEAD_COLOR
    + +

    Paragraph heads

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MacroType-style controlOther
    PARAHEADPARAHEAD_FAMILYPARAHEAD_INDENT
     PARAHEAD_FONTNUMBER_PARAHEADS
     PARAHEAD_SIZERESET_PARAHEAD_NUMBER
     PARAHEAD_COLOR 
    + +

    Paragraphs

    + + + + + + + + + + + + + + + + + + + + + + +
    MacroType-style control*Other
    PPPP_FONTPARA_INDENT
      INDENT_FIRST_PARAS
      PARA_SPACE
    +

    +*For an in-depth explanation of how to manage the type-style of +paragraphs, much of which is normally established through the use of +typesetting macros prior to +START, +see +Paragraph control macros. + +

    Quotes +
    +(line-for-line cited text, e.g. poetry or code snippets) +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MacroType-style controlOther
    QUOTEQUOTE_FAMILYQUOTE_INDENT*
     QUOTE_FONTALWAYS_FULLSPACE_QUOTES
     QUOTE_SIZEBREAK_QUOTE
     QUOTE_AUTOLEADUNDERLINE_QUOTES
     QUOTE_COLOR 
    +

    +*Note that the use of QUOTE_INDENT sets the indent for both QUOTE +and BLOCKQUOTE. + +

    Blockquotes +
    +(formatted citations) +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MacroType-style controlOther
    BLOCKQUOTEBLOCKQUOTE_FAMILYBLOCKQUOTE_INDENT
     BLOCKQUOTE_FONTBLOCKQUOTE_QUAD
     BLOCKQUOTE_SIZEBREAK_BLOCKQUOTE
     BLOCKQUOTE_AUTOLEAD 
     BLOCKQUOTE_COLOR 
    +

    +*Note that the use of BLOCKQUOTE_INDENT sets the indent for both BLOCKQUOTE +and QUOTE. + +

    Author linebreaks +
    +(also called "scene" or "section" breaks) +

    + + + + + + + + + + + + +
    MacroType-style controlOther
    LINEBREAKLINEBREAK_COLORLINEBREAK_CHAR
    + +

    Footnotes

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MacroType-style controlOther
    FOOTNOTE*FOOTNOTE_FAMILYFOOTNOTE_AUTOLEAD
     FOOTNOTE_FONTFOOTNOTE_QUAD
     FOOTNOTE_SIZEFOOTNOTE_MARKERS
     FOOTNOTE_COLORFOOTNOTE_MARKER_STYLE
      RESET_FOOTNOTE_NUMBER
      FOOTNOTE_RULE
      FOOTNOTE_RULE_ADJ
      FOOTNOTE_RULE_LENGTH
      FOOTNOTES_RUN_ON
    +

    +*Indenting of footnotes is handled by arguments passed to FOOTNOTE. + +

    Endnotes

    + + + + + + + + + + +
    Input endnotesOutput endnotes pages
    ENDNOTEENDNOTES
    + +

    Designing endnotes pages +
    +(if you want to change the defaults) +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Type-style controlEndnotes page +
    title string* +
    Document identification string**
    ENDNOTE_FAMILYENDNOTE_STRINGENDNOTE_TITLE
    ENDNOTE_FONTENDNOTE_STRING_FAMILYENDNOTE_TITLE_FAMILY
    ENDNOTE_LEADENDNOTE_STRING_FONTENDNOTE_TITLE_FONT
    ENDNOTE_PT_SIZEENDNOTE_STRING_SIZEENDNOTE_TITLE_SIZE
    ENDNOTE_QUADENDNOTE_STRING_CAPSENDNOTE_TITLE_QUAD
     ENDNOTE_STRING_UNDERSCOREENDNOTE_TITLE_UNDERSCORE
    +

    +*By default, "Endnotes", at the top of the first page of +endnotes +
    +**I.e. how each document in the endnotes for a collated document is +identified (by default, the strings passed to the reference +macro, .TITLE +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Endnotes numberingParagraph controlEndnotes headers/footers
    ENDNOTE_NUMBER_FAMILYENDNOTE_PARA_INDENTENDNOTES_ALLOWS_HEADERS
    ENDNOTE_NUMBER_FONTENDNOTE_PARA_SPACEENDNOTES_HEADER_CENTER
    ENDNOTE_NUMBER_SIZE ENDNOTES_FOOTER_CENTER
    ENDNOTE_NUMBERS_ALIGN_LEFT  
    ENDNOTE_NUMBERS_ALIGN_RIGHT  
    +
    + + + + + + + + + + + + + + + + + + +
    Endnotes page numberingMisc
    ENDNOTES_FIRST_PAGENUMBERENDNOTES_NO_COLUMNS
    ENDNOTES_PAGENUM_STYLE*SINGLESPACE_ENDNOTES**
    ENDNOTES_NO_FIRST_PAGENUM 
    +

    +*I.e. the format of page numbering (digits, roman, letters) +
    +**Applies to PRINTSTYLE TYPEWRITE only + +

    Margin notes

    + + + + + + + + + + +
    InitializeStart
    MN_INITMN
    + +

    Line numbering

    + + + + + + + + + + + + +
    TextQuotesBlockquotes
    NUMBER_LINESNUMBER_QUOTE_LINESNUMBER_BLOCKQUOTE_LINES
    + +

    References

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Begin/end refsFootnote refsEndnote refsEmbedded refs
    REFFOOTNOTE_REFSENDNOTE_REFSREF( / REF)
       REF( / REF)
       REF[ / REF]
       REF{ / REF}
    + +

    Bibliographies

    + + + + + + + + + + +
    Start bibliography pageBibliography type
    BIBLIOGRAPHYBIBLIOGRAPHY_TYPE
    + +

    Table of contents

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    GenerateGeneral +
    + type-style control +
    TOC title string* +
    + and style control +
    TOCTOC_FAMILYTOC_HEADER_STRING
     TOC_PT_SIZETOC_HEADER_FAMILY
     TOC_LEADTOC_HEADER_FONT
      TOC_HEADER_SIZE
      TOC_HEADER_QUAD
    +

    +*By default, "Table of Contents" + +

    Designing a table of contents +
    +(if you want to change the defaults) +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Title entriesHead entriesSubhead entries
    TOC_TITLE_ENTRYTOC_HEAD_FAMILYTOC_SUBHEAD_FAMILY
    TOC_APPENDS_AUTHORTOC_HEAD_FONTTOC_SUBHEAD_FONT
    TOC_TITLE_FAMILYTOC_HEAD_SIZETOC_SUBHEAD_SIZE
    TOC_TITLE_FONTTOC_HEAD_INDENTTOC_SUBHEAD_INDENT
    TOC_TITLE_SIZE  
    TOC_TITLE_INDENT  
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Parahead entriesPage number entriesPaginationMisc
    TOC_PARAHEAD_FAMILYTOC_PN_FAMILYPAGINATE_TOCTOC_RV_SWITCH
    TOC_PARAHEAD_FONTTOC_PN_FONTTOC_PAGENUM_STYLE* 
    TOC_PARAHEAD_SIZETOC_PN_SIZE  
    TOC_PARAHEAD_INDENTTOC_PADDING  
    +

    +*I.e. the format of page numbering (digits, roman, letters) + +

    Finis

    + + + + + + + + + + + + + + +
    MacroType style control
    FINISFINIS_COLOR
    FINIS_STRING 
    + +

    Headers and footers

    +

    +Mom treats all aspects of headers and footers +identically. The only difference between the two is whether the +information they contain appears at the top of the page or at the +bottom. Consequently, in the following, substitute FOOTERS +for HEADERS, and FOOTER_ for HEADER_ if you're hunting down how to +do something with footers. +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MacroPlacementUser-defined headersGeneral +
    + type-style control +
    HEADERSHEADER_MARGINHEADER_RECTOHEADER_FAMILY
     HEADER_GAPHEADER_VERSOHEADER_SIZE
       HEADER_COLOR
       HEADER_PLAIN
    + +

    Part-by-part control of headers

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    LeftCenterRight
    HEADER_LEFTHEADER_CENTERHEADER_RIGHT
    HEADER_LEFT_FAMILYHEADER_CENTER_FAMILYHEADER_RIGHT_FAMILY
    HEADER_LEFT_FONTHEADER_CENTER_FONTHEADER_RIGHT_FONT
    HEADER_LEFT_SIZEHEADER_CENTER_SIZEHEADER_RIGHT_SIZE
    HEADER_LEFT_COLORHEADER_CENTER_COLORHEADER_RIGHT_COLOR
    HEADER_LEFT_CAPSHEADER_CENTER_CAPSHEADER_RIGHT_CAPS
     HEADER_CENTER_PAD 
    +
    + + + + + + + + + + + + + + + + + + +
    Separator ruleMisc
    HEADER_RULEREVISION_STRING
    HEADER_RULE_GAPDRAFT_STRING
    HEADER_RULE_COLOR 
    + +

    Footers

    +

    +This is the one exception to the "HEADER also means FOOTER" +convention used throughout the documentation. + + + + + +
    FOOTER_ON_FIRST_PAGE
    + +

    Covers and doc covers

    + + + + + + + + + + + + + + +
    CoversDoc covers
    COVERDOC_COVER
    COVERSDOC_COVERS
    + + +

    Customizing covers and doc covers

    + + + + + + + + + + + + + + + + + + + + + + +
    CoversDoc covers
    COVERTITLEDOC_COVERTITLE
    COVER_ADVANCEDOC_COVER_ADVANCE
    COVER_FAMILYDOC_COVER_FAMILY
    COVER_LEADDOC_COVER_LEAD
    + +

    Part-by-part control of covers and doc covers

    + +

    +For part-by-part control of the family, font, size and color, please +see + + + + + + + + +
    Control macros--changing the defaults for covers and document covers
    Index of cover and doc cover control macros
    + +

    Miscellaneous

    + + + + + + + + + + + + +
    Output a blank pageCollate multiple +
    documents
    Get leading back +
    on track
    BLANKPAGECOLLATESHIM
    + +
    +
    + +Next   +Prev   +Top   +Back to Table of Contents
    AAvant Garde
    BM Bookman
    HHelvetica +
    HNHelvetica Narrow
    NNew Century Schoolbook
    PPalatino
    TTimes Roman
    ZCMZapf Chancery

    The argument you pass to FAMILY is the identifier at -left above. For example, if you want Helvetica, enter +left, above. For example, if you want Helvetica, enter

     	.FAMILY H
     
    -NOTE: The font macro -(FT) lets you to specify both the type family +NOTE: The +font macro +(FT) lets you specify both the type family and the desired font with a single macro. While this saves a few keystrokes, I recommend using FAMILY for family, and FT for font, except where doing so is genuinely -inconvenient. +inconvenient. ZCM, for example, only exists in one +style: Italic (I). Therefore, .FT ZCMI +makes more sense than setting the family to "ZCM", then +setting the font to "I". +

    + +ADDITIONAL NOTE: As of mom, version +1.1.9-a, if you are running a version of groff lower +than 1.19.2, you MUST follow all FAMILY +requests with a FT request, otherwise +mom will set all type up to the next +FT request in the +fallback font. +

    +If you are running a version of groff greater than or equal +to 1.19.2, when you invoke the FAMILY macro, +mom "remembers" the font style (Roman, +Italic, etc) currently in use (if the font style exists in the new +family) and will continue to use the same font style in the new +family. For example: +

    +

    +	.FAMILY BM   \" Bookman family
    +	.FT     I    \" Medium Italic
    +	<some text>  \" Bookman Medium Italic
    +	.FAMILY H    \" Helvetica family
    +	<more text>  \" Helvetica Medium Italic
    +
    + +However, if the font style does not exist in the new family, +mom will set all subsequent type in the +fallback font +(by default, Courier Medium Roman) until she encounters a +.FT +request that's valid for the family. For example, assuming +you don't have the font "Medium Condensed Roman" +(mom extension "CD") +in the Helvetica family: +

    +

    +	.FAMILY UN    \" Univers family
    +	.FT     CD    \" Medium Condensed
    +	<some text>   \" Univers Medium Condensed
    +	.FAMILY H     \" Helvetica family
    +	<more text>   \" Courier Medium Roman!
    +
    + +In the above example, you must follow .FAMILY H with a +FT request that's valid for Helvetica.

    Experts:
    If you add other PostScript families to groff's /font/devps directory, -be sure to follow the groff standard for naming families and fonts. +I recommend following the groff standard for naming families and fonts. For example, if you add the Garamond family, name the font files

    @@ -635,53 +695,179 @@
     G, or GD.)  R, I, B, and BI after GARAMOND are the roman, italic,
     bold and bold-italic fonts respectively.
     

    +Please see the Appendices, +Adding PostScript fonts to groff, +for information on adding fonts and families to groff, as well as +to see a list of the extensions mom provides to +groff's basic R, I, B, BI styles. +


    Font


    -Macro: FT R | I | B | BI +Macro: FT R | I | B | BI | <any other valid font style>

    -FT takes one of four possible arguments specifying the -desired font: +By default, groff permits FT to take one of four +possible arguments specifying the desired font: - +
    R = roman -
    I = italic -
    B = bold -
    BI = bold-italic
    R = (Medium) Roman +
    I = (Medium) Italic +
    B = Bold (Roman) +
    BI = Bold Italic

    -For example, if your family is Helvetica, entering +For example, if your +family +is Helvetica, entering

     	.FT B
     
    -will give you the Helvetica bold font. If your family were -Palatino, you'd get the Palatino bold font. +will give you the Helvetica bold +font. +If your family were Palatino, you'd get the Palatino bold font. +

    +(As of mom, version 1.1.9-a, the range of arguments +that can be passed to FT has been considerably +extended, allowing access to a greater variety of font +weights +and +shapes. +Please see the +NOTE, +below.) +

    +How mom reacts to an invalid argument to +FT depends on which version of groff you're using. +If your groff version is greater than or equal to 1.19.2, +mom will issue a warning and, depending on how +you've set up the +fallback font, +either continue processing using the fallback font, or abort +(allowing you to correct the problem). If your groff version is less +than 1.19.2, mom will silently continue processing, +using either the fallback font or the font that was in effect prior +to the invalid FT call.

    -You can specify both family and font in the FT macro. -As an example, +FT will also accept, as an argument, a full +family+font name. For example,

     	.FT HB
     
    -sets the font to Helvetica bold. I strongly recommend keeping -family and font separate. +will set subsequent type in Helvetica Bold. However, I strongly +recommend keeping family and font separate except where doing so is +genuinely inconvenient.

    -Fonts can also be changed inline. See +For inline control of fonts, see Inline Escapes, font control.

    + +NOTE: mom, versions 1.1.9-a and higher, +considerably extends the range of arguments you can pass to +FT, making it more convenient to add and access +fonts of differing +weights +and +shapes +within the same family. Have a look +here +for a list of the weight/style arguments mom +allows. +

    +Be aware, though, that you must have the fonts, correctly +installed and named, in order to use the arguments. (See +How to create a PostScript font for use with groff +for how to add fonts to groff.) Please also read the +ADDITIONAL NOTE +found in the description of the FAMILY macro. +

    + + + +


    +

    Fallback font

    +
    +Macro: FALLBACK_FONT <fallback font> [ ABORT | WARN ] | ABORT | WARN + +

    +In the event that you pass an invalid argument to +.FAMILY +(i.e. a non-existent family), mom, by default, uses +the fallback font, Courier Medium Roman (CR), in order to continue +processing your file. +

    +If you'd prefer another fallback font, pass +FALLBACK_FONT the full family+font name +of the font you'd like. For example, if you'd rather the +fallback font were Times Roman Medium Roman, + +

    +	.FALLBACK_FONT TR
    +
    +

    +would do the trick. +

    +Additionally, if your version of groff accepts accepts "if +F" and "if S" (see +above), +mom issues a warning whenever a +font style set with +.FT +does not exist, either because you haven't registered the style +(see +here +for instructions on registering styles), or because the font style +does not exist in the current family set with +.FAMILY. +By default, mom then aborts, which allows you to +correct the problem. +

    +If you'd prefer that mom not abort on non-existent +fonts, but rather continue processing using a fallback font, +you can pass FALLBACK_FONT the argument +WARN, either by itself, or in conjunction with your +chosen fallback font. +

    +Some examples of invoking FALLBACK_FONT: +
    +

      +
    • .FALLBACK_FONT WARN +
      + mom will issue a warning whenever you try + to access a non-existent font but will continue processing + your file with the default fallback font, Courier Medium Roman. +
    • .FALLBACK_FONT TR WARN +
      + mom will issue a warning whenever you try + to access a non-existent font but will continue processing + your file with a fallback font of Times Roman Medium Roman; + additionally, "TR" will be the fallback font whenever + you try to access a family that does not exist. +
    • .FALLBACK_FONT TR ABORT +
      + mom will abort whenever you try to access a + non-existent font, and will use the fallback font + "TR" whenever you try to access a family + that does not exist. +
    +

    +If, for some reason, you want to revert to ABORT, just enter +.FALLBACK_FONT ABORT and mom will once +again abort on font errors. +


    Point size of type


    -Macro: PT_SIZE <size of type in points> +Macro: PT_SIZE <size of type in points>
    *Does not require a unit of measure @@ -717,13 +903,26 @@ The size of type can also be changed inline. See Inline Escapes, changing point size.

    +NOTE: It is unfortunate that the pic +pre-processor uses PS, and thus +mom's macro for setting point sizes can't use it. +However, if you aren't using pic, you might want to +alias PT_SIZE as PS, since +there'd be no conflict. +

    +

    +	.ALIAS PS PT_SIZE
    +
    + +would allow you to set point sizes with .PS. +


    Line spacing/leading


    -Macro: LS <distance between lines> +Macro: LS <distance between lines>
    *Does not require a unit of measure @@ -776,7 +975,7 @@

    Automatic line spacing


    -Macro: AUTOLEAD <amount of automatic leading> [FACTOR] +Macro: AUTOLEAD <amount of automatic leading> [FACTOR]
    *Does not require a unit of measure @@ -831,7 +1030,7 @@

    Line length


    -Macro: LL <line length> +Macro: LL <line length>
    *Requires a unit of measure @@ -858,6 +1057,32 @@ sets the line length to 4-1/2 inches.

    +Additionally, you may express a new line length relative to the +current line length by prepending a plus or minus sign to the +argument. Thus, if you wanted to increase the line length by 3 +points, you could +do +

    +

    +	.LL +3p
    +
    + +This is especially handy when you want to "hang" +punctuation outside the right margin since you can pass groff's +\w +escape as the argument to LL, like this: +

    +

    +	.LL +\w'.'u
    +
    + +The above example increases the current line length by the width of +a period. Notice that you must append the +unit of measure, +u, to the escape since .LL requires a unit of +measure. + +

    NOTE: The right margin macro (R_MARGIN) can also be used to set line length. @@ -878,17 +1103,22 @@ (centred).

    These macros also determine whether or not -input lines are joined and -filled during output. +input lines +are joined and +filled +during output.

    Additionally, macros that deal with how to break -output lines are covered in this -section, as is the -inline escape for joining output lines. +output lines +are covered in this section, as is the +inline escape +for joining input lines.

    You may encounter some words here that are unfamiliar. Refer to -Typesetting terms and -Groff terms for an explanation. +Typesetting terms +and +Groff terms +for an explanation.

    Justification, quad, fill, and break macro list

    @@ -911,7 +1141,8 @@

  • SPACE (break a line and add space before the next output line)
  • SPREAD (break and force-justify an output line) -
  • Joining lines +
  • Joining input lines in + nofill mode
    • \c inline escape
    @@ -944,7 +1175,7 @@

    Quad lines left, right, or centre


    -Macro: QUAD L | LEFT | R | RIGHT | C | CENTER | J | JUSTIFY +Macro: QUAD L | LEFT | R | RIGHT | C | CENTER | J | JUSTIFY
    Alias: FILL
    @@ -1079,7 +1310,25 @@

    Manually break a line without advancing on the page


    Macro: EL - +
    +*In nofill modes (LEFT, RIGHT, CENTER), you must terminate the +line input preceding EL with the \c inline +escape. See +NOTES, +below. +
    +*If you find remembering whether to put in the \c +bothersome, you may prefer to use the +inline escape +alternative to +.EL, +\*[B], +which works consistently regardless of the fill mode. +
    +*EL does not work after the PAD macro. +See +PAD +for the way around this
    .

    The mnemonic "EL" is borrowed from old Compugraphic typesetting systems, where it stood for "End Line." Conceptually, @@ -1090,11 +1339,14 @@ Note to groff jocks: EL is unrelated to groff's .el. If you find the similarity confusing, you may want to alias EL as -EOL. +something else (but don't use EOL; it's already +taken.)

    EL's function is simple: it breaks a line without -advancing on the page. As an example of where you might use it, +advancing on the page. +As +an example of where you might use it, imagine that you're working from marked-up copy. The markup indicates 24 points of space between two given lines, but the prevailing line spacing is 12.5 points. You may find it more @@ -1104,8 +1356,9 @@ get 24. To demonstrate:

    +	.LEFT
     	.LS 12.5
    -	A line of text.
    +	A line of text.\c
     	.EL
     	.ALD 24p
     	The next line of text.
    @@ -1114,6 +1367,7 @@
     may be more intuitive than
     

    +	.LEFT
     	.LS 12.5
     	A line of text.
     	.ALD 11.5p
    @@ -1129,63 +1383,67 @@
     from Compugraphic), which is covered in the section
     Vertical movement.
     

    -IMPORTANT: -EL does not work as advertised on the last +NOTES: +

    +In versions of mom prior to 1.1.9, EL did not +always work as advertised on the last output line -of pages that contain a footer trap (e.g. one set with +of pages that contained a footer trap (e.g. one set with B_MARGIN or in documents formatted using the document processing macros). -The reason is that the EL macro itself deposits -a line break that trips the trap (hey, I like that -- -"trips the trap"), and once the trap has been sprung, -mom can't recover. She places the line after -the EL on the next page. -

    -If you need EL functionality on the last line of a -page that has a footer trap, turn the trap off by surrounding the -line to be EL'd with -TRAP -requests, as in following example.

    -

    -	.TRAP OFF  \" Turn trap off
    -	3.		   \" Input the first line
    -	.EL        \" Invoke EL...
    -	.TRAP      \" ...and turn trap back on *before* inputting next line
    -	\*[FP12]Establish, once and for all, if 42 really is the answer.
    -
    - -The above looks something like this upon output: +EL has been re-written so that this should no longer be the +case. However, in order for it to work in the +nofill +modes +(LEFT, +RIGHT +or +CENTER), +you must always "join" .EL to the line +before it using the +\c +inline escape, +like this:

    -	3.  Establish, once and for all, if 42 really is the answer.
    +	.LEFT
    +	A line I don't want to advance\c
    +	.EL
     
    -with "3." flush at the left margin, and "Establish, -once and for all..." on the same line as "3." but -starting 12 points in from the left margin. -

    -If you hadn't turned the trap off for .EL, -"3." would have appeared at the bottom of the page by -itself, with "Establish, once and for all..." -appearing at the top of the next page. +Conversely, in +fill modes +(QUAD LEFT, +QUAD RIGHT, +QUAD CENTER +or +JUSTIFY), +the \c must not be used.

    +If EL is used after most macros or groff +primitives +(see the exception, below), you don't have to worry about this, +regardless of the fill mode. Just type .EL +


    Break lines and add space between


    -Macro: SPACE <space to add between lines> +Macro: SPACE <space to add between lines>
    Alias: SP

    SPACE breaks a line, just like BR, then adds space after the line. With no -argument, it adds an extra line space. If you pass it a numeric -argument without supplying a +argument, it adds an extra line space of a value equal to the +current +leading. +If you pass it a numeric argument without supplying a unit of measure, it advances that number of extra line spaces. For example:

    @@ -1203,15 +1461,18 @@

    If you supply a unit of measure, SPACE breaks the -line then adds the specified amount of extra space to the current -linespace, as in +line then advances one linespace (at the current +leading) +PLUS the specified amount of extra space given to +SPACE, +as in

     	.SPACE 6p
     
    -which breaks the line then adds six points of space to the current -linespace. +which breaks the line and advances one full linespace plus six +points.

    SUGGESTION: SPACE and @@ -1304,6 +1565,17 @@ fill modes, there'd have been no need for the \c.

    +Addendum: The example, above, is designed to +demonstrate the use of \c. However, an easier and +more intuitive way to accomplish the family/font change in the +example would be with the groff +inline escape, +\f. +

    +

    +	Some lines of text to be \f[HB]joined\*[PREV] together.
    +
    +


    @@ -1350,7 +1622,7 @@

    Word spacing


    -Macro: WS <+|-wordspace> | DEFAULT +Macro: WS <+|-wordspace> | DEFAULT

    WS (Word Space) increases or decreases the amount @@ -1421,7 +1693,7 @@


    Sentence space


    -Macro: SS <+sentence space> | 0 | DEFAULT +Macro: SS <+sentence space> | 0 | DEFAULT

    SS (Sentence Space) tells groff how to treat double @@ -1495,15 +1767,15 @@


    Automatic hyphenation control


    -Macro: HY toggle +Macro: HY toggle
    -Macro: HY LINES <max. number of consecutive hyphenated lines> +Macro: HY LINES <max. number of consecutive hyphenated lines>
    -Macro: HY MARGIN <size of hyphenation margin> +Macro: HY MARGIN <size of hyphenation margin>
    -Macro: HY SPACE <extra interword spacing to prevent hyphenation> +Macro: HY SPACE <extra interword spacing to prevent hyphenation>
    -Macro: HY DEFAULT +Macro: HY DEFAULT
    Aliases: HYPHENATE, HYPHENATION @@ -1534,7 +1806,7 @@ HY observes the following default hyphenation rules:
      -
    1. Last lines (i.e. ones that will spring a trap -- typically +
    2. Last lines (i.e. ones that will spring a trap--typically the last line on a page) will not be hyphenated.
    3. The first and last two characters of a word are never split off. @@ -1626,7 +1898,7 @@

      Set hyphenation parameters all at once


      -Macro: HY_SET <lines> [ <margin> [ <space> ] ] +Macro: HY_SET <lines> [ <margin> [ <space> ] ]
      Alias: HYSET @@ -1675,7 +1947,7 @@

      Reduce whitespace


      -Macro: RW <amount of whitespace reduction between letters> +Macro: RW <amount of whitespace reduction between letters>

      @@ -1706,20 +1978,30 @@

      -IMPORTANT: RW affects all +IMPORTANT: In versions prior to 1.1.9-a, +RW affected all fonts in the family -current at the time it's invoked. It must be reset to zero to -cancel its effect (.RW 0) on those fonts, or reinvoked -(possibly with a different value) if you change family. +current at the time it was invoked. As of 1.1.9-a, this behaviour +has been changed. RW affects only the font +current at the time it's invoked, and remains in effect for that +font every time the font is called, hence must be reset to zero to +cancel its effect (.RW 0) on that font.

      NOTE: By default, RW does not deposit a break -(BR) when it's invoked. If you want +(BR) when it's invoked if you're in one of the +fill +modes (i.e. +QUAD +L, R, C, J or +JUSTIFY). +If you want RW to break at the ends of the previous -input lines, -you can tell mom that's what you want by invoking the +input lines +while you're in a fill mode, tell mom +that's what you want by invoking the BR_AT_LINE_KERN toggle macro.

      @@ -1729,7 +2011,7 @@


      Expand whitespace


      -Macro: EW <amount of whitespace expansion between letters> +Macro: EW <amount of whitespace expansion between letters>

      @@ -1752,14 +2034,31 @@ may be just enough to open up a line without the change in letter spacing being obvious. I highly recommend previewing your work to assess the effect of EW. - +

      +IMPORTANT: In versions prior to 1.1.9-a, +EW affected all +fonts +in the +family +current at the time it was invoked. As of 1.1.9-a, this behaviour +has been changed. EW affects only the font +current at the time it's invoked, and remains in effect for that +font every time the font is called, hence must be reset to zero to +cancel its effect (.EW 0) on that font.

      NOTE: By default, EW does not deposit a break -(BR) when it's invoked. If you want +(BR) when it's invoked if you're in one of the +fill +modes (i.e. +QUAD +L, R, C, J or +JUSTIFY). +If you want EW to break at the ends of the previous -input lines, -you can tell mom that's what you want by invoking the +input lines +while you're in a fill mode, tell mom +that's what you want by invoking the BR_AT_LINE_KERN toggle macro.

      @@ -1769,25 +2068,37 @@


      Break before line kerning


      -Macro: BR_AT_LINE_KERN toggle +Macro: BR_AT_LINE_KERN toggle

      -By default, mom does not break +By default, in +fill +modes (i.e. +QUAD +L, R, C, J or +JUSTIFY) +mom does not break input lines when you invoke RW or EW. -If you'd like mom to break input lines prior -to RW or EW, invoke -BR_AT_INPUT_LINE without any argument. To -disable the breaks, invoke BR_AT_INPUT_LINE -with any argument (OFF, QUIT, Q, X...), like -this +If you'd like her to break input lines prior to RW +or EW, invoke BR_AT_INPUT_LINE +without any argument. To disable the breaks, invoke +BR_AT_INPUT_LINE with any argument (OFF, +QUIT, Q, X...), like this

       	.BR_AT_LINE_KERN OFF
       	    or
       	.BR_AT_LINE_KERN X
       
      + +In QUAD L, R or C, +mom simply breaks the line. In QUAD J +(or JUSTIFY, which is the same thing), she breaks +and +force justifies +the line prior to EW or RW.
      @@ -1795,7 +2106,7 @@

      Automatic kerning


      -Macro: KERN toggle +Macro: KERN toggle

      @@ -1807,7 +2118,7 @@

      Kerning of individual character pairs can be controlled with the inline escapes -\*[BU #] and \*[FU #]. See +\*[BU <n>] and \*[FU <n>]. See Inline Escapes, kerning.

      @@ -1816,7 +2127,7 @@


      Automatic ligature generation


      -Macro: LIGATURES toggle +Macro: LIGATURES toggle
      Alias: LIG @@ -1853,7 +2164,7 @@ to get your hands on a condensed family. That's where these macros and inline escapes come in. With them, you can fake the fonts you're missing. A word of caution, though: "faked" -fonts are just that -- faked. You should only use them as a +fonts are just that--faked. You should only use them as a last resort, and then only sparingly. A word or two or a line or two in a faked font will pass unnoticed; large patches of type in a faked font look typographically cheap. @@ -1891,7 +2202,7 @@

      Set degree of slant for pseudo-italicizing


      -Macro: SETSLANT <degrees to slant type> | RESET +Macro: SETSLANT <degrees to slant type> | RESET

      Pseudo-italicizing of type is accomplished by slanting a roman font @@ -1965,7 +2276,7 @@


      Set amount of emboldening


      -Macro: SETBOLDER <amount of emboldening, in machine units> | RESET +Macro: SETBOLDER <amount of emboldening, in machine units> | RESET

      Emboldening of type is accomplished by printing characters @@ -2040,7 +2351,7 @@


      Set percentage for pseudo-condensed type


      -Macro: CONDENSE <pseudo-condense percentage> +Macro: CONDENSE <pseudo-condense percentage>

      Pseudo-condensing of type is accomplished by reducing the width of @@ -2124,7 +2435,7 @@


      Set percentage for pseudo-extended type


      -Macro: EXTEND <pseudo-extend percentage> +Macro: EXTEND <pseudo-extend percentage>

      Pseudo-extending of type is accomplished by increasing the width of @@ -2230,7 +2541,7 @@


      Advance Lead (move downward)


      -Macro: ALD <distance to move downward> +Macro: ALD <distance to move downward>
      *Requires a unit of measure @@ -2288,7 +2599,7 @@

      Reverse Lead (move upward)


      -Macro: RLD <distance to move upward> +Macro: RLD <distance to move upward>
      *Requires a unit of measure @@ -2745,7 +3056,7 @@

      Set up typesetting tabs


      -Macro: TAB_SET <tab number> <indent> <length> L | R | C | J [ QUAD ] +Macro: TAB_SET <tab number> <indent> <length> L | R | C | J [ QUAD ]
      *<indent> and <length> require a unit of measure @@ -2828,7 +3139,19 @@

      Mark positions of string tabs


      Inlines: \*[ST<number>]...\*[ST<number>X] - +
      +*Quad +direction must be LEFT or JUSTIFY (see +QUAD +and +JUSTIFY) +or the +no-fill mode +set to +LEFT. +Please see +IMPORTANT, +below.

      String tabs need to be marked off with inline escapes @@ -2868,12 +3191,65 @@ SILENT macro.

      -IMPORTANT: Do not try to set up string tabs on -a line that is broken with +IMPORTANT: +Owing to the way groff processes +input lines +and turns them into +output lines, +it is not possible for mom to "guess" the +correct starting position of string tabs marked off in lines that +are centered or set flush right. +

      +Equally, she cannot guess the starting position if a line is fully +justified and broken with SPREAD. -Mom calculates string tab positions and lengths -as she reads the input line, not after the line has undergone -manipulations to the word spacing. +

      +In other words, in order to use string tabs, +LEFT +must be active, or, if +QUAD LEFT +or +JUSTIFY +are active, the line on which the string tabs are marked must be +broken "manually" with +BR +(but not +SPREAD). +

      +To circumvent this behaviour, I recommend using the +PAD +to set up string tabs in centered or flush right lines. Say, for +example, you want to use a string tab to underscore the text of a +centered line with a rule. Rather than this, +

      +

      +	.CENTER
      +	\*[ST1]A line of text\*[ST1X]\c
      +	.EL
      +	.ST 1
      +	.TAB 1
      +	.PT_SIZE 24
      +	.ALD 3p
      +	\*[RULE]
      +	.RLD 3p
      +	.TQ
      +
      + +you should do: +

      +

      +	.QUAD CENTER
      +	.PAD "#\*[ST1]A line of text\*[ST1X]#"
      +	.EL
      +	.ST 1
      +	.TAB 1
      +	.PT_SIZE 24
      +	.ALD 3p
      +	\*[RULE] \" Note that you can't use \*[UP ] or \*[DOWN] with \*[RULE]
      +	.RLD 3p
      +	.TQ
      +
      +

      @@ -2881,7 +3257,7 @@


      Set string tabs


      -Macro: ST <tab number> L | R | C | J [ QUAD ] +Macro: ST <tab number> L | R | C | J [ QUAD ]

      After string tabs have been marked off on an input line (see @@ -2922,7 +3298,7 @@


      Call tabs


      -Macro: TAB <tab number> +Macro: TAB <tab number>
      Alias: TB

      @@ -2993,6 +3369,21 @@
      Macro: TN
      +*In tabs that aren't given the QUAD argument when they're set up +with +TAB_SET +or +ST, you must terminate the line preceding +TN with the \c inline escape. See the +ADDITIONAL NOTE, +
      +*If you find remembering whether to put in the \c +bothersome, you may prefer to use the +inline escape +alternative to +.TN, +\*[TB+], +which works consistently regardless of the fill mode.

      TN moves over to the next tab in numeric @@ -3028,36 +3419,45 @@ Yet more text

    -ADDITIONAL NOTE: TN is like -EL -in that it doesn't work as advertised on the last line before a -footer trap is sprung. If you need to use TN on -the last line of a page that has a footer trap, turn the trap off by -surrounding the line to be TN'd with -TRAP, -requests, as in the following example. +ADDITIONAL NOTE: +In versions of mom prior to 1.1.9, TN did not +always work as advertised on the last +output line +of pages that contained a footer trap (e.g. one set with +B_MARGIN +or in documents formatted using the +document processing macros). +

    +TN has been re-written so that this should no longer be the +case. However, in order for it to work in tabs that have not been +given a QUAD argument (see +TAB_SET +and +ST) +you must always "join" .TN to the line +before it using the +\c +inline escape, +as in the following example:

     	.TAB_SET 1 0  1P  L
     	.TAB_SET 2 1P 20P L
     	.TAB 1
    -	.TRAP OFF  \" Turn trap off
    -	1.         \" Input the first line
    -	.TN        \" Invoke TN...
    -	.TRAP      \" ...and turn trap back on *before* inputting next line
    +	1.\c
    +	.TN
     	The first rule of survival is "make and keep good friends."
     
    -The above, at the bottom of a page, will look something like this: +When output, the example will look like this:

     	1.  The first rule of survival is "make and keep good friends."
     
    -If you hadn't turned the trap off before .TN, -"1." would have appeared as the last line on the page, -with "The first rule of survival..." being the first -line on the next page. +Conversely, if you did give a QUAD argument +to TAB_SET or ST, the +\c must not be used.

    @@ -3179,7 +3579,7 @@ is the macro you use to begin multi-column setting. It marks the current baseline -as the top of your columns, for use late with +as the top of your columns, for use later with MCR. See the introduction to columns for an explanation of multi-columns and some sample @@ -3212,7 +3612,7 @@


    Exit multi-columns


    -Macro: MCX [ <distance to advance below longest column> ] +Macro: MCX [ <distance to advance below longest column> ]
    *Optional argument requires a unit of measure @@ -3228,7 +3628,7 @@ in effect at the moment MCX is invoked.

    -If you pass the <distance> argument to +If you pass the <distance> argument to MCX, it advances 1 linespace below the longest column (see above) PLUS the distance specified by the argument. The argument requires a unit of measure; therefore, to advance @@ -3444,7 +3844,7 @@


    Indent left


    -Macro: IL [ <measure> ] +Macro: IL [ <measure> ]
    *The optional argument requires a unit of measure @@ -3487,7 +3887,7 @@

    Indent right


    -Macro: IR [ <measure> ] +Macro: IR [ <measure> ]
    *The optional argument requires a unit of measure @@ -3528,7 +3928,7 @@

    Indent both


    -Macro: IB [ <left measure> <right measure> ] +Macro: IB [ <left measure> <right measure> ]
    *The optional arguments require a unit of measure @@ -3581,7 +3981,7 @@

    Temporary (left) indent


    -Macro: TI [ <measure> ] +Macro: TI [ <measure> ]
    *The optional argument requires a unit of measure @@ -3626,7 +4026,7 @@

    Hanging indent


    -Macro: HI [ <measure> ] +Macro: HI [ <measure> ]
    *The optional argument requires a unit of measure @@ -3741,13 +4141,13 @@

    Quitting indents


    -Macro: IQ  [ CLEAR ]  (quit any/all indents -- see *IMPORTANT NOTE) +Macro: IQ  [ CLEAR ]  (quit any/all indents -- see *IMPORTANT NOTE)
    -Macro: ILX [ CLEAR ]  (exit Indent Left) +Macro: ILX [ CLEAR ]  (exit Indent Left)
    -Macro: IRX [ CLEAR ]  (exit Indent Right) +Macro: IRX [ CLEAR ]  (exit Indent Right)
    -Macro: IBX [ CLEAR ]  (exit Indent Both) +Macro: IBX [ CLEAR ]  (exit Indent Both)

    *IMPORTANT NOTE: @@ -3765,7 +4165,7 @@ IBQ. Both forms are acceptable.

    Without an argument, the macros to quit indents merely restore your -original left margin and line length. The measures stored in the +original margins and line length. The measures stored in the indent macros themselves are saved so you can call them again without having to supply a measure.

    @@ -3784,5 +4184,6 @@ Prev   Top   Back to Table of Contents + diff -ruN groff-1.19.1/contrib/mom/momdoc/using.html groff-1.19.2/contrib/mom/momdoc/using.html --- groff-1.19.1/contrib/mom/momdoc/using.html 2004-02-22 10:17:08.000000000 +0100 +++ groff-1.19.2/contrib/mom/momdoc/using.html 2005-05-14 07:54:53.000000000 +0200 @@ -1,3 +1,4 @@ + @@ -46,10 +47,10 @@ mom determines the appearance of text following the markup tags automatically, although you, the user, can easily change how mom interprets the tags. This gives you -nearly complete control over the look and feel of your documents. -In addition, the typesetting macros, in combination with document -processing, let you meet all sorts of typesetting needs that just -can't be covered by "one macro fits all" markup tags. +nearly complete control over document design. In addition, the +typesetting macros, in combination with document processing, let you +meet all sorts of typesetting needs that just can't be covered by +"one macro fits all" markup tags.

    How to input mom's macros

    @@ -184,7 +185,7 @@ gxditview. Invoke it with

    -	groff -X -mom <filename>
    +	groff -X -mom filename
     
    It's not particularly pretty, doesn't have many navigation @@ -200,18 +201,24 @@

    A surer way to preview documents is with gv (ghostview). This involves processing documents with groff, -directing the output to a temporary (PostScript) file, then opening -the temporary file in gv. While that may sound -like a lot of work, I've set up my editor (elvis) to do it for me. -Whenever I'm working on a document that needs previewing/checking, -I fire up gv with the "Watch File" -option turned on. To look at the file, I tell elvis to process -it (with groff) and send it to a temporary file (groff --mom filename > filename.ps), then open the file inside -gv. Ever after, when I want to look at any changes -I make, I simply tell elvis to work his magic again. The Watch File -option in gv registers that the file has changed, -and automatically loads the new version. Voilà! -- instant previewing. +and directing the output to a PostScript file, like this, +

    +

    +	groff -mom filename > filename.ps
    +
    +then opening .ps file in gv. +

    +While that may sound like a lot of work, I've set up my editor +(elvis) to do it for me. Whenever I'm working on a document that +needs previewing/checking, I fire up gv with the +"Watch File" option turned on. To look at the file, I +tell elvis to process it (with groff) and send it to a temporary +file (groff -mom filename > filename.ps), then open +the file inside gv. Ever after, when I want to +look at any changes I make, I simply tell elvis to work his magic +again. The Watch File option in gv registers that +the file has changed, and automatically loads the new version. +Voilà! --instant previewing.


    diff -ruN groff-1.19.1/contrib/mom/NEWS groff-1.19.2/contrib/mom/NEWS --- groff-1.19.1/contrib/mom/NEWS 2004-03-22 07:18:36.000000000 +0100 +++ groff-1.19.2/contrib/mom/NEWS 2005-05-14 07:54:53.000000000 +0200 @@ -1,3 +1,113 @@ +Release 1.3 +----------- + +Added line numbering capabilities, with controls. + +Footnotes and endnotes can now be referenced by line number. + +Added ability to adjust vertical position of the title that appears +on the first endnotes page. + +Footnotes can run on when being referenced by line number. + +Footnotes now have a post-footnote spacing option, for adding +a little space between footnotes. + +Extended LIST so it accepts alpha, ROMAN and roman enumerators. + +Added margin notes capability. + +Added refer support. + +Added bibliography page support. + +Added QUOTE_AUTOLEAD and BLOCKQUOTE_AUTOLEAD, so user can have +quotes and blockquotes leaded differently from running text. + +Change: the input line immediately after FOOTNOTE OFF must be +entered as a literal continuation of the line prior to FOOTNOTE, +including any initial spaces or punctuation marks. This allows +for hassle-free placing of footnote markers in running text either +before or after punctuation marks. + +Release 1.2-f +------------- + +Added ADD_SPACE, to permit users to insert space at the top of +running text (after the first page) when using the docprocessing +macros. + +Releases 1.2-a and 1.2-b +------------------------ + +My personal email address has changed. 1.2-a and -b have been +updated to reflect that. Additionally, I made some small changes +to the documentation. + +Release 1.2 +----------- + +As of 1.2, the recommended version of groff to use with mom has +been bumped up from groff, 1.18 to groff, 1.19.2. Although mom will +continue to work with groff, 1.18, her handling of .FAM(ILY) and .FT +is now slightly different, therefore users of groff 1.18 may have to +update documents created with mom so that every .FAM(ILY) request is +followed by a .FT request before any text is input, otherwise mom +will set the text after .FAM(ILY) in Courier (until she encounters a +.FT request). People running groff, >= 1.19.2 don't have to worry +about this, but I recommend that, regardless of which version you're +running, you have a look at the document entries for FAMILY and FT +in order to see how mom will be handling .FAMILY and .FT from now +on. + +When used with groff >=1.19.2, mom now emits warnings if a style +hasn't been registered, or if a font style doesn't exist in the +current family. Invalid .FAM(ILY) calls now use a "fallback" font" +(although no warning is issued). The fallback is user-settable. + +Mom's macro file, om.tmac, now sets up a fairly extensive list of +font "styles," thus expanding the range of arguments that can be +passed to .FT (formerly, just R, I, B and BI, unless users had +already rolled their own solution to the problem of extensive type +families containing fonts like condensed, demibold, black, light, etc). +Users are advised to read the documentation sections on FAM(ILY), +FT and FALLBACK_FONT, as well as the new appendix section, "Adding +PostScript fonts to groff", for information on using mom's style +extensions (and how to disable them, should they conflict with a +user's present groff site-font/devps setup). + +A new macro, FALLBACK_FONT, has been added. It controls not only +the fallback font for invalid .FAMILY calls, but also whether mom +aborts on invalid .FT calls after issuing a warning, or continues +processing using the fallback. + +Release 1.1.9 +------------- + +Added the (optional) generation of cover pages and document cover +pages, plus a full suite of control macros for all cover page +elements. + +Added new reference macros that apply to covers: COVERTITLE, +DOC_COVERTITLE, COPYRIGHT and MISC. + +The need for TRAP OFF/TRAP to deal with ELs and TNs that fall at +the bottom page has been obsoleted. However, both EL and TN, when +invoked in any "nofill" mode (LEFT, RIGHT, CENTER, or the L | R | C +arguments to TAB_SET or ST when no QUAD argument is given), must now +have the input line preceding the EL or TN terminated by \c. Fill +modes do not have this requirement, i.e. no \c is required. + +Footnotes that occur inside quotes, blockquotes and epigraphs now +work just like regular footnotes, with no user intervention +required. This obsoletes the macro BREAK_QUOTE. + +Removed all aliases that used the word COLOUR. Users must use +COLOR wherever COLOR is needed. COLOUR, as a replacement/alias, is +no longer supported. + +NEWPAGE, which used to be an alias of .bp, is now its own macro. + Release 1.1.8 ------------- diff -ruN groff-1.19.1/contrib/mom/om.tmac groff-1.19.2/contrib/mom/om.tmac --- groff-1.19.1/contrib/mom/om.tmac 2004-03-22 07:18:36.000000000 +0100 +++ groff-1.19.2/contrib/mom/om.tmac 2005-08-07 09:59:33.000000000 +0200 @@ -1,42 +1,89 @@ .\" om.tmac -.\" -.\" Mom -- a typesetting/document-processing macro set for groff. -.\" -.\" Copyright (C) 2002, 2003 Free Software Foundation, Inc. -.\" Written by Peter Schaffter (df191@ncf.ca) -.\" -.\" This file is part of groff. -.\" -.\" groff 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. -.\" -.\" groff 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 groff; see the file COPYING. If not, write to the Free Software -.\" Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -.\" -.\" -.\" -\# Version 1.1.8 -\# ------------- -\# -.if (\n[.x]\n[.y] < 118) \ -. ab You need GNU troff version 1.18 or higher to run this version of mom! +.ig +Mom -- a typesetting/document-processing macro set for groff. + +Copyright (C) 2002, 2003 Free Software Foundation, Inc. + Written by Peter Schaffter (peter@faustus.dyn.ca) + +This file is part of groff. + +groff 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. + +groff 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 groff; see the file COPYING. If not, write to the Free Software +Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +Version 1.3-a +------------- +Antoine de St-Exupéry asserted that elegance in engineering is +achieved not when there is nothing left to add, but when there is +nothing left to take away. + +By those standards, mom is a Rube Goldberg contraption. She was +created over the years while groff, and my understanding of it, +changed and evolved. However, I'm a firm believer in "if it +ain't broke, don't fix it," so I'm leaving any major clean-up +of redundancies and whatnot for a rainy day. + +Inasmuch as possible, macros that turn a feature on or off follow +a similar style. Invoking the macro without an argument turns +the feature on. Invoking it with any other argument turns it off. +Use of the argument OFF is recommended, but not required; users +may find other conventions preferable (e.g. NO, X, END, QUIT, etc.). + +"" in the description of arguments that can be passed +to a macro means that any argument turns the feature off. +.. \# -\# Inasmuch as possible, macros that turn a feature on or off follow -\# a similar style. Invoking the macro without an argument turns -\# the feature on. Invoking it with any other argument turns it off. -\# Use of the argument OFF is recommended, but not required; users -\# may find other conventions preferable (e.g. NO, X, END, QUIT, etc.). +\# ==================================================================== \# -\# "" in the description of arguments that can be passed -\# to a macro means that any argument turns the feature off. +\# Check which version of groff is being run +.if (\n[.x]\n[.y] < 118) \ +. ab You need GNU troff version 1.18 or higher to run this version of mom. +\# Check that GNU troff is being run +.if !\n[.g]=1 \ +. ab The mom macros require that you be running GNU troff. +.if \n(.C \ +. ab The groff mom macros do not work in compatibility mode. +\# Add supplementary styles +.sty \n[.fp] L \" Light Roman +.sty \n[.fp] LI \" Light Italic +.sty \n[.fp] LCD \" Light Condensed Roman +.sty \n[.fp] LCDI \" Light Condensed Italic +.sty \n[.fp] LEX \" Light Extended Roman +.sty \n[.fp] LEXI \" Light Extended Italic +.sty \n[.fp] CD \" Medium/Book Condensed Roman +.sty \n[.fp] CDI \" Medium/Book Condensed Italic +.sty \n[.fp] EX \" Medium/Book Extended Roman +.sty \n[.fp] EXI \" Medium/Book Extended Italic +.sty \n[.fp] DB \" DemiBold Roman +.sty \n[.fp] DBI \" DemiBold Italic +.sty \n[.fp] BCD \" Bold Condensed Roman +.sty \n[.fp] BCDI \" Bold Condensed Italic +.sty \n[.fp] BEX \" Bold Extended Roman +.sty \n[.fp] BEXI \" Bold Extended Italic +.sty \n[.fp] HV \" Heavy Roman +.sty \n[.fp] HVI \" Heavy Italic +.sty \n[.fp] HVCD \" Heavy Condensed Roman +.sty \n[.fp] HVCDI \" Heavy Condensed Italic +.sty \n[.fp] HVEX \" Heavy Extended Roman +.sty \n[.fp] HVEXI \" Heavy Extended Italic +.sty \n[.fp] BL \" Black Roman +.sty \n[.fp] BLI \" Black Italic +.sty \n[.fp] BLCD \" Black Condensed Roman +.sty \n[.fp] BLCDI \" Black Condensed Italic +.sty \n[.fp] BLEX \" Black Extended Roman +.sty \n[.fp] BLEXI \" Black Extended Italic +.sty \n[.fp] UBL \" Ultra-Black Roman +.sty \n[.fp] UBLI \" Ultra-Black Italic \# \# ==================================================================== \# @@ -45,17 +92,22 @@ \# \# +++ALIASES+++ \# -.als ALIAS als \"Alias .als as ALIAS -.als ALIASN aln \"Alias .aln (number registers) as ALIASN +\# Alias .als as ALIAS, and .aln (number registers) as ALIASN +\# +.als ALIAS als +.als ALIASN aln +\# +\# +\# ALIASES FOR GROFF REQUESTS +\# -------------------------- \# .ALIAS MAC de .ALIAS BR br -.ALIAS SPACE sp .ALIAS SP sp .ALIAS PAGELENGTH pl -.ALIAS NEWPAGE bp .ALIAS SPREAD brp .ALIAS ESC_CHAR ec +.ALIAS STRING ds \# \# ALIASES FOR NUMBER REGISTERS \# ---------------------------- @@ -73,44 +125,36 @@ \# \# MISCELLANEOUS \# ============= -.cflags 4 /\(en \" So slash and en-dashes get broken .nr #L_MARGIN \n(.o \" Tabs, etc require #L_MARGIN +.cflags 4 /\(en \" So slash and en-dashes get broken +.warn 8192 \# -\# ==================================================================== -\# -\# END MACRO FOR LETTERS -\# --------------------- -\# *Arguments: -\# none -\# *Function: -\# The .em macro executed at the end of letters. Turns footers -\# and pagination off, terminates and outputs diversion CLOSING -\# (indented with the author's name underneath). -\# -.MAC ALL_DONE END -. br -. FOOTERS OFF -. PAGINATION OFF -. if \\n[#DOC_TYPE]=4 \{\ -. br -. if !'\\n(.z'' \{ .di \} -. IQ CLEAR -. TQ -. TAB_SET 1 \\n[#DOC_L_LENGTH]u/2u \\n[#DOC_L_LENGTH]u/2u LEFT -. ALD \\n[#DOC_LEAD]u*2u -. TAB 1 -. if \\n[#CLOSING] \{\ -. nf -. CLOSING -. \} -. ALD \\n[#DOC_LEAD]u*3u -. PRINT \\*[$AUTHOR_1] -. \} -. DO_FOOTER -.END -\# +.ig +About the warn level +-------------------- + +There's a lot of testing for the presence of number registers and +strings in this macro file. Many of the registers and strings +pop into and out of existence on the fly. For convenience, I +often use + + .if \\n[whatever] and .if !\\n[whatever] + +to test "if the register exists and is (not) empty." Groff, +encountering such tests when called with the -ww options, emits + + warning: number register whatever not defined. + +Groff also warns about strings similarly tested for. + +The warn level, above, is high in order to shut off those +warnings. If you're futzing in this file and need more verbose +warnings, either comment out ".warn 8192" or set the warnlevel +to the one you need (but be ready for lots of what I've just +described). +.. \# -\# ===================================================================== +\# ==================================================================== \# \# +++PAGE LAYOUT+++ \# @@ -187,11 +231,9 @@ \# Requires unit of measure. \# .MAC T_MARGIN END -. br . nr #T_MARGIN (\\$1) -. nr #T_MARGIN_SET 1 +. nr #TOP 1 . if !\\n[#DOCS] \{\ -. PRINT \& . sp |\\n[#T_MARGIN]u-1v . \} . wh 0i DO_T_MARGIN @@ -210,6 +252,8 @@ .MAC B_MARGIN END . br . nr #B_MARGIN (\\$1) +. nr #ORIGINAL_B_MARGIN \\n[#B_MARGIN] +. nr #B_MARGIN_SET 1 . wh -\\n[#B_MARGIN]u DO_B_MARGIN .END \# @@ -230,14 +274,14 @@ \# .MAC PAGE END . br -. PAGEWIDTH \\$1 -. PAGELENGTH \\$2 -. ie '\\$3'' \{ .L_MARGIN \\n(.o \} -. el \{ .L_MARGIN \\$3 \} -. ie '\\$4'' \{ .R_MARGIN 1i \} -. el \{ .R_MARGIN \\$4 \} -. if !'\\$5'' \{ .T_MARGIN \\$5 \} -. if !'\\$6'' \{ .B_MARGIN \\$6 \} +. PAGEWIDTH \\$1 +. PAGELENGTH \\$2 +. ie '\\$3'' \{ .L_MARGIN \\n(.o \} +. el \{ .L_MARGIN \\$3 \} +. ie '\\$4'' \{ .R_MARGIN 1i \} +. el \{ .R_MARGIN \\$4 \} +. if !'\\$5'' \{ .T_MARGIN \\$5 \} +. if !'\\$6'' \{ .B_MARGIN \\$6 \} .END \# \# ===================================================================== @@ -251,14 +295,16 @@ \# *Argument: \# \# *Function: -\# Plants the top margin (set in .PAGE) at the top of each page. +\# Plants the top margin at the top of each page. \# *Notes: -\# The trap is set in .PAGE +\# The trap is set in .T_MARGIN or .PAGE \# .MAC DO_T_MARGIN END -. ev 1 +. ev T_MARGIN +. nr #TOP 1 . sp |\\n[#T_MARGIN]u-1v . ev +. sp -\\n[#T_MARGIN_LEAD_ADJ]u .END \# \# @@ -267,16 +313,54 @@ \# *Argument: \# \# *Function: -\# Plants the bottom margin (set in .PAGE) at the bottom of each page. +\# Plants the bottom margin at the bottom of each page. \# *Notes: -\# The trap is set in .PAGE. +\# The trap is set in .B_MARGIN or .PAGE. \# .MAC DO_B_MARGIN END -. ev 1 +. nr #T_MARGIN_LEAD_ADJ \\n[#LEAD]-12000 +. ev B_MARGIN . bp . ev .END \# +\# +\# NEWPAGE +\# ------- +\# *Argument: +\# +\# *Function: +\# Breaks to a new page. +\# *Notes: +\# If a B_MARGIN has been set, processes that, otherwise, just +\# breaks to a new page. +\# +.MAC NEWPAGE END +. br +. nr #NEWPAGE 1 +. ie \\n[#B_MARGIN_SET]=1 \{\ +. ie !\\n[#DOCS]=1 \{\ +. ev NP +. bp +. ev +. \} +. el \{\ +. if \\n[#COLUMNS]=1 \{ .nr #COL_NUM \\n[#NUM_COLS] \} +. ie !\\n[#FN_DEPTH] \{\ +. ch FN_OVERFLOW_TRAP +. DO_B_MARGIN +. wh -(\\n[#FN_OVERFLOW_TRAP_POS]u) FN_OVERFLOW_TRAP +. \} +. el \{\ +. DO_B_MARGIN +. \} +. \} +. \} +. el \{\ +. DO_B_MARGIN +. \} +.END +\# \# ===================================================================== \# \# +++GENERAL STYLE MACROS+++ @@ -296,13 +380,53 @@ \# Requires unit of measure. \# .MAC LL END -. nr #L_LENGTH (\\$1) . nr #USER_SET_L_LENGTH 1 -. ll \\n[#L_LENGTH]u +. ll \\$1 +. nr #L_LENGTH \\n(.l . ta \\n(.lu .END \# \# +\# +++FAMILY AND FONT+++ +\# +\# FALLBACK FONT +\# ------------- +\# *Argument: +\# [ ABORT | WARN ] | ABORT | WARN +\# *Function: +\# Sets register #ABORT_FT_ERRORS to 1, or defines a fallback font +\# called "dummy" at font position 0. +\# *Notes: +\# Calls to non-existent families cause mom to continue processing +\# files using the fallback font until a valid family is entered. +\# +\# Calls to non-existent fonts generate warnings. If ABORT is passed +\# to FALLBACK_FONT, mom stops processing files after the warning. +\# Otherwise, she continues to process files using the fallback font +\# after the warning is issued. The default fallback font is CR; the +\# default for font warnings is to abort. +\# +.MAC FALLBACK_FONT END +. if \\n[#NUM_ARGS]=1 \{\ +. if '\\$1'ABORT' \{ .nr #ABORT_FT_ERRORS 1 \} +. if '\\$1'WARN' \{\ +. if r#ABORT_FT_ERRORS \{ .nr #ABORT_FT_ERRORS 0 \} +. \} +. if !'\\$1'ABORT' \{\ +. if !'\\$1'WARN' \{\ +. fp 0 dummy \\$1 +. \} +. \} +. \} +. if \\n[#NUM_ARGS]=2 \{\ +. fp 0 dummy \\$1 +. if '\\$2'ABORT' \{ .nr #ABORT_FT_ERRORS 1 \} +. if '\\$2'WARN' \{ .nr #ABORT_FT_ERRORS 0 \} +. \} +.END +\# +.FALLBACK_FONT CR ABORT +\# \# FAMILY \# ------ \# *Argument: @@ -312,17 +436,36 @@ \# to $FAMILY. \# .MAC FAMILY END -. if \\n[#PRINT_STYLE]=1 \{ .return \} -. if \\n[#IGNORE] \{ .return \} +. if \\n[#PRINT_STYLE]=1 \{\ +. fam C +. return +. \} +. if \\n[#IGNORE] \{\ +. fam C +. return +. \} +. if (\\n[.x]\\n[.y]\\n[.Y] >= 1192) \{\ +. ds $SAVED_STYLE \\n[.sty] +. \} . ds $FAMILY \\$1 +. ft 0 . fam \\*[$FAMILY] +. if (\\n[.x]\\n[.y]\\n[.Y] >= 1192) \{\ +. ft \\*[$SAVED_STYLE] +. if !F\\n[.fn] \{\ +. ft 0 +. \} +. \} +. if \\n[#COLLATE]=1 \{\ +. if !r#START \{ .DOC_FAM \\*[$FAMILY] \} +. \} .END \# \# \# FONT \# ---- \# *Argument: -\# R | I | B | BI +\# R | I | B | BI | \# *Function: \# Stores user supplied font in $FONT and sets .ft to $FONT. \# @@ -343,7 +486,29 @@ . return . \} . ds $FONT \\$1 +. ft 0 . ft \\*[$FONT] +. if if (\\n[.x]\\n[.y]\\n[.Y] >= 1192) \{\ +. if '\\n[.sty]'' \{\ +. if !F\\n[.fn] \{\ +. if !S\\*[$FONT] \{\ +. tm1 "[mom]: Font style "\\*[$FONT]" at line \\n(.c has not been registered. +. ie \\n[#ABORT_FT_ERRORS]=0 \{\ +. tm1 " Continuing to process using fallback font. +. \} +. el .ab Aborting. +. \} +. if \\n[.f]=0 \{\ +. tm1 "[mom]: Either font style "\\*[$FONT]" at line \\n(.c does not exist in family "\\n[.fam]", +. tm1 " or family "\\n[.fam]" has not been installed in font/devps. +. ie \\n[#ABORT_FT_ERRORS]=0 \{\ +. tm1 " Continuing to process using fallback font. +. \} +. el .ab Aborting. +. \} +. \} +. \} +. \} .END \# \# @@ -391,26 +556,34 @@ \# *Argument: \# \# *Function: -\# Turns off #AUTO_LEAD if it's on. +\# Turns off #AUTOLEAD if it's on. \# Sets .vs to user supplied value. \# *Notes: -\# Does not require unit of measure. LEAD automatically turns off AUTOLEAD. +\# Does not require unit of measure. LS automatically turns off AUTOLEAD. \# .MAC LS END +. br +. nr #OLD_LEAD \\n(.v . if \\n[#PRINT_STYLE]=1 \{ .return \} . if \\n[#IGNORE] \{ .return \} -. nr #LEAD_SET 1 . if \\n[#AUTO_LEAD] \{\ . rr #AUTO_LEAD . rr #AUTOLEAD_FACTOR . \} . vs \\$1 -. if \\n[#T_MARGIN_SET]=1 \{\ -. sp |\\n[#T_MARGIN]u-1v -. rr #T_MARGIN_SET +. if \\n[#TOP] \{\ +. nr #TOP_BASELINE_ADJ \\n(.v-\\n[#OLD_LEAD] +. sp -\\n[#TOP_BASELINE_ADJ]u +. rr #TOP +. rr #TOP_BASELINE_ADJ . \} .END \# +.MAC RESET_LEAD END +' vs +. ch RESET_LEAD +.END +\# \# \# AUTOLEAD \# -------- @@ -430,6 +603,7 @@ . if \\n[#PRINT_STYLE]=1 \{ .return \} . if \\n[#IGNORE] \{ .return \} . nr #AUTO_LEAD 1 +. nr #OLD_LEAD \\n(.v . nr #AUTOLEAD_VALUE (p;\\$1) . ie \\n[#NUM_ARGS]=2 \{\ . if '\\$2'FACTOR' \{\ @@ -440,9 +614,11 @@ . el \{\ . vs \\n[#PT_SIZE]u+\\n[#AUTOLEAD_VALUE]u . \} -. if \\n[#T_MARGIN_SET] \{\ -. sp |\\n[#T_MARGIN]u-1v -. rr #T_MARGIN_SET +. if \\n[#TOP] \{\ +. nr #TOP_BASELINE_ADJ \\n(.v-\\n[#OLD_LEAD] +. sp -\\n[#TOP_BASELINE_ADJ]u +. rr #TOP +. rr #TOP_BASELINE_ADJ . \} .END \# @@ -479,33 +655,35 @@ .END \# \# -\# INLINE KERNING AND HORIZONTAL MOVEMENT -\# -------------------------------------- -\# *Kerning -\# Inline kerning provides a simple method for users to adjust the -\# amount of space between any two letters. It's predicated on a -\# unit of measure "U", which is 1/36 of the current point size as -\# returned by \n[.ps]. E.g., if the current point size is 18, -\# \n[.ps] returns 18000u, therefore U=500u. Since U remains -\# proportional relative to the current point size, the amount -\# of kerning between two letters as expressed in Us remains -\# visually similar regardless of changes in point size. -\# -\# N.B.--the amount of inline kerning supplied by \*[BU] or -\# \*[FU] is added to or subtracted from any kerning that already -\# takes place between two characters when automatic kerning is -\# turned on. -\# -\# In groff v. 1.17.2, it was not possible to pass arguments to macros that -\# were called with inline escapes, nor thence to evaluate conditional -\# expressions. Consequently, each pseudo-escape \[BU] had to be defined -\# separately with ".char". -\# -\# As of v. 1.18, one can pass arguments to inline strings/macros, -\# hence it is now possible to do \*[BU n] where n, inline, is the desired -\# number of kern units. The original .char definitions have been left in -\# for backward compatibility with documents created prior to mom-1.1.3c. -\# +.ig +INLINE KERNING AND HORIZONTAL MOVEMENT +-------------------------------------- +Kerning + +Inline kerning provides a simple method for users to adjust the +amount of space between any two letters. It's predicated on a +unit of measure "U", which is 1/36 of the current point size as +returned by \n[.ps]. E.g., if the current point size is 18, +\n[.ps] returns 18000u, therefore U=500u. Since U remains +proportional relative to the current point size, the amount +of kerning between two letters as expressed in Us remains +visually similar regardless of changes in point size. + +N.B.--the amount of inline kerning supplied by \*[BU] or +\*[FU] is added to or subtracted from any kerning that already +takes place between two characters when automatic kerning is +turned on. + +In groff v. 1.17.2, it was not possible to pass arguments to macros that +were called with inline escapes, nor thence to evaluate conditional +expressions. Consequently, each pseudo-escape \[BU] had to be defined +separately with ".char". + +As of v. 1.18, one can pass arguments to inline strings/macros, +hence it is now possible to do \*[BU n] where n, inline, is the desired +number of kern units. The original .char definitions have been left in +for backward compatibility with documents created prior to mom-1.1.3c. +.. \# .nr #KERN_UNIT 36 .ds BU \h'-(\En[#PT_SIZE]u/\n[#KERN_UNIT]u*\\$1u)' @@ -524,16 +702,18 @@ .\} .rr #LOOP \# +.ig +Horizontal movements + +BP1...12.75 and FP1...12.75 move backwards or forwards inline by the +specified number of points. +Left in for backward compatibility with mom-1.1.3c, the +preferred methods for inline horizontal movements are now +\*[BCK ] and \*[FWD ]. +.. \# -\# *Horizontal movements -\# BP1...12.75 and FP1...12.75 move backwards or forwards inline by the -\# specified number of points. -\# Left in for backward compatibility with mom-1.1.3c, the -\# preferred methods for inline horizontal movements are now -\# \*[BCK ] and \*[FWD ]. -\# -.ds BCK \h'-\\$1\\$2' -.ds FWD \h'\\$1\\$2' +.ds BCK \h'-\\$1' +.ds FWD \h'\\$1' \# .ds BP.25 \h'-.25' .ds BP.5 \h'-.5' @@ -642,10 +822,13 @@ \# \# WHOLE LINE KERNING (RW and EW) \# ----------------------------- -\# The line kerning macros are special instances of track kerning, -\# used where a complete line needs to be tightened (or relaxed) in -\# order to accomodate or remove one or two more characters -\# than the default justification permits. +\# +.ig +The line kerning macros are special instances of track kerning, +used where a complete line needs to be tightened (or relaxed) in +order to accomodate or remove one or two more characters +than the default justification permits. +.. \# \# *Argument: \# @@ -659,38 +842,40 @@ \# *Notes: \# Decimal values are acceptable. \# -\# The groff documentation is a tad confusing about what unit of -\# measure is used in track kerning, only that the width of each -\# character is increased or decreased by the amount(s) passed as -\# arguments to .tkf, and something about linear function of point -\# size. In fact, with the way I've put this macro together, it -\# doesn't matter. All the user needs to know is that a value -\# of one will produce an unacceptably tight or loose line at most -\# text point sizes; therefore, effective use of RW and EW is in -\# the fractional range below 1 (e.g. .25, .5). Given that RW -\# and EW are for massaging type, a certain amount of -\# experimentation and previewing is expected and necessary. -\# -\# \n(.f holds the current font number, which is acceptable to .tkf. -\# -\# RW and EW must be reset to 0 to cancel their effect on -\# subsequent output lines. +.ig +The groff documentation is a tad confusing about what unit of +measure is used in track kerning, only that the width of each +character is increased or decreased by the amount(s) passed as +arguments to .tkf, and something about linear function of point +size. In fact, with the way I've put this macro together, it +doesn't matter. All the user needs to know is that a value of +one will produce an unacceptably tight or loose line at most text +point sizes; therefore, effective use of RW and EW is in the +fractional range below 1 (e.g. .25, .5). Given that RW and EW +are for massaging type, a certain amount of experimentation and +previewing is expected and necessary. + +\n(.f holds the current font number, which is acceptable to .tkf. + +RW and EW must be reset to 0 to cancel their effect on subsequent +output lines. +.. \# .MAC RW END -. if \\n[#BR_AT_LINE_KERN] \{ .br \} -. tkf 1 1 -\\$1 1 -\\$1 -. tkf 2 1 -\\$1 1 -\\$1 -. tkf 3 1 -\\$1 1 -\\$1 -. tkf 4 1 -\\$1 1 -\\$1 +. if \\n[#BR_AT_LINE_KERN] \{\ +. ie \\n[#JUSTIFY]=1 \{ .brp \} +. el \{ .br \} +. \} +. tkf \\n(.f 1 -\\$1 1 -\\$1 .END \# \# .MAC EW END -. if \\n[#BR_AT_LINE_KERN] \{ .br \} -. tkf 1 1 \\$1 1 \\$1 -. tkf 2 1 \\$1 1 \\$1 -. tkf 3 1 \\$1 1 \\$1 -. tkf 4 1 \\$1 1 \\$1 +. if \\n[#BR_AT_LINE_KERN] \{\ +. ie \\n[#JUSTIFY]=1 \{ .brp \} +. el \{ .br \} +. \} +. tkf \\n(.f 1 \\$1 1 \\$1 .END \# \# @@ -725,10 +910,10 @@ \# to default, or permits the setting of various hyphenation \# parameters. \# *Notes: -\# HY ON defaults to .hy 14, i.e. no hyphens after the -\# first two or before the last two characters of a word, and -\# no hyphenation of the last line prior to a trap (e.g., -\# at the bottom of a page). +\# HY, by itself, defaults to .hy 14, i.e. no hyphens after the +\# first two or before the last two characters of a word, and no +\# hyphenation of the last line prior to a trap (e.g., at the +\# bottom of a page). \# \# HY DEFAULT resets the hyphenation style to .hy 14 (see \# above) if that behaviour is desired after changes have been @@ -806,8 +991,22 @@ \# Requires a unit of measure. \# .MAC ALD END -. nr #ALD (\\$1) -. sp \\n[#ALD]u +. if \\n(nl=0 \{ .nr #TOP 1 \} +. if '\\$0'ALD' \{\ +. nr #ALD (\\$1) +. sp \\n[#ALD]u +. \} +. if '\\$0'ADD_SPACE' \{\ +. nr #ALD (\\$1) +. rs +. sp \\n[#ALD]u +. \} +. if '\\$0'SPACE' \{\ +. sp \\$1u +. \} +. if '\\$0'SP' \{\ +. sp \\$1u +. \} .END \# \# @@ -828,14 +1027,16 @@ \# \# ALD/RLD STRINGS \# --------------- -\# The strings \*[ALD.25]...\*[ALD12.75] and their corresponding -\# \*[RLD] forms have been left in for backward compatibility with -\# documents created using mom-1.1.3c or earlier. The prefered -\# methods of advancing and reversing on the page inline are \*[UP ] -\# and \*[DOWN ]. +.ig +The strings \*[ALD.25]...\*[ALD12.75] and their corresponding +\*[RLD] forms have been left in for backward compatibility with +documents created using mom-1.1.3c or earlier. The prefered methods +of advancing and reversing on the page inline are \*[UP ] +and \*[DOWN ]. +.. \# -.ds DOWN \v'\\$1\\$2' -.ds UP \v'-\\$1\\$2' +.ds DOWN \v'\\$1' +.ds UP \v'-\\$1' \# .ds ALD.25 \v'.25p' .ds ALD.5 \v'.5p' @@ -980,7 +1181,7 @@ \# processed. The strings for open/close ($QUOTE) are then \# defined in the macro. \# -\# (Note to myself: ascii code for " is \N'34'.) +\# (Note to myself: code for " is \N'34'.) \# .char " \\*[$QUOTE\\n[#OPEN_CLOSE]]\R'#OPEN_CLOSE (1-\\n[#OPEN_CLOSE])' \# @@ -1079,18 +1280,26 @@ \# Breaks a line without advancing. \# *Notes: \# EL is the mnemonic used on older, dedicated typesetting machines -\# to indicate "process the line, then return to the left margin -\# without advancing the galley medium." It stands for End Line. +\# to indicate "process the line, without advancing the galley +\# medium." It stands for End Line. \# -\# Sadly, EL is only a fake. It will work in all instances EXCEPT -\# when the line to be EL'd is the last line before a footer trap. -\# Use TRAP OFF/TRAP to circumvent this. +\# The \c inline must be appended to the end of input lines when in +\# nofill mode; in fill modes, the \c inline must not be used. \# .MAC EL END +. TRAP OFF +. if \\n[#PSEUDO_FILL]=1 \& . br . sp -1v +. TRAP .END \# +\# An inline escape to accomplish the same thing. Actually +\# preferable, since it works with filled and non-filled copy and +\# doesn't require the user to remember to use (or not use) the \c. +\# +.ds B \h'|0'\c +\# \# ===================================================================== \# \# +++FILLING/QUADDING/JUSTIFYING+++ @@ -1112,7 +1321,7 @@ ' ce 0 . QUAD J . if \\n[#PRINT_STYLE]=1 \{ .QUAD L \} -. nr #FILL 0 +. nr #PSEUDO_FILL 0 .END \# \# @@ -1137,28 +1346,58 @@ . \} ' ce 0 ' fi -. if '\\*[$QUAD_VALUE]'L' \{ .ad l \} -. if '\\*[$QUAD_VALUE]'LEFT' \{ .ad l \} -. if '\\*[$QUAD_VALUE]'R' \{ .ad r \} -. if '\\*[$QUAD_VALUE]'RIGHT' \{ .ad r \} -. if '\\*[$QUAD_VALUE]'C' \{ .ad c \} -. if '\\*[$QUAD_VALUE]'CENTER' \{ .ad c \} -. if '\\*[$QUAD_VALUE]'CENTRE' \{ .ad c \} -. if '\\*[$QUAD_VALUE]'J' \{ .ad b \} -. if '\\*[$QUAD_VALUE]'JUSTIFY' \{ .ad b \} -. nr #FILL 0 +. if '\\*[$QUAD_VALUE]'L' \{\ +. nr #JUSTIFY 0 +. ad l +. \} +. if '\\*[$QUAD_VALUE]'LEFT' \{\ +. nr #JUSTIFY 0 +. ad l +. \} +. if '\\*[$QUAD_VALUE]'R' \{\ +. nr #JUSTIFY 0 +. ad r +. \} +. if '\\*[$QUAD_VALUE]'RIGHT' \{\ +. nr #JUSTIFY 0 +. ad r +. \} +. if '\\*[$QUAD_VALUE]'C' \{\ +. nr #JUSTIFY 0 +. ad c +. \} +. if '\\*[$QUAD_VALUE]'CENTER' \{\ +. nr #JUSTIFY 0 +. ad c +. \} +. if '\\*[$QUAD_VALUE]'CENTRE' \{\ +. nr #JUSTIFY 0 +. ad c +. \} +. if '\\*[$QUAD_VALUE]'J' \{\ +. nr #JUSTIFY 1 +. ad b +. \} +. if '\\*[$QUAD_VALUE]'JUSTIFY' \{\ +. nr #JUSTIFY 1 +. ad b +. \} +. nr #PSEUDO_FILL 0 .END \# \# \# LEFT, RIGHT, AND CENTER \# ----------------------- -\# The purpose of these macros is to allow the user to enter lines -\# of text that will be quadded LRC *without* the user having to -\# enter .BR or .br between lines. For the sake of consistency, -\# all three appear to behave similarly (from the point of view of the user), -\# although the underlying primitives don't. For this reason, LEFT, -\# RIGHT, and CENTER must be followed by .QUAD [L R C J] or .JUSTIFY -\# to restore text to groff fill mode. +\# +.ig +The purpose of these macros is to allow the user to enter lines of +text that will be quadded LRC *without* the user having to enter .BR +or .br between lines. For the sake of consistency, all three appear +to behave similarly (from the point of view of the user), although +the underlying primitives don't. For this reason, LEFT, RIGHT, and +CENTER must be followed by .QUAD [L R C J] or .JUSTIFY to restore +text to groff fill mode. +.. \# \# LEFT \# ---- @@ -1169,7 +1408,7 @@ \# requiring the .BR or .br macro. \# *Notes: \# LEFT simply turns fill off. Lines that exceed the current LL will -\# not be broken, simply continued (indefinitely) until a return is +\# not be broken, just continued (indefinitely) until a return is \# encountered. Note that this behaviour differs from the RIGHT and \# CENTER macros. \# @@ -1180,7 +1419,8 @@ . \} . ce 0 . nf -. nr #FILL 1 +. nr #PSEUDO_FILL 1 +.\" Fix for a little conflict with DOCTYPE LETTER . if '\\n(.z'LETTERHEAD1' \{ .rr #DATE_FIRST \} .END \# @@ -1203,7 +1443,7 @@ . \} . fi . rj 100000 -. nr #FILL 1 +. nr #PSEUDO_FILL 1 .END \# \# @@ -1220,44 +1460,47 @@ \# .MAC CENTER END . if \\n[#TAB_ACTIVE]=0 \{\ +. rr #QUAD . ds $RESTORE_QUAD_VALUE CENTER . \} . fi . ce 100000 -. nr #FILL 1 +. nr #PSEUDO_FILL 1 .END \# \# ===================================================================== \# \# +++TABS+++ \# -\# There are two different kinds of tabs available: typesetting tabs -\# and string tabs. -\# -\# Typesetting tabs are set with TAB_SET, which requires a tab number, -\# an indent (offset) from the left margin and a length (optionally -\# with a quad direction and an instruction to fill lines). After tabs -\# are set with TS, they are called with .TAB n, where "n" -\# corresponds to the number passed to TAB_SET as a valid tab number. -\# -\# String tabs allow the user to mark off tab positions inline. Tab -\# indents and lengths are calculated from the beginning and end -\# positions of the marks. Up to 19 string tabs may be created, -\# numbered 1-19. Once created, they are called with .TAB n, -\# just like typesetting tabs. -\# -\# Setting up string tabs is a two-step procedure. First, the user -\# enters an input line in which s/he wants to mark off string tabs. -\# The beginning of a tab is marked with \*[STn], where "n" is -\# the desired number of the tab. The end of the the tab is marked -\# with \*[STnX]. All ST's must have a matching STX. String tabs -\# may be nested. -\# -\# Next, the user invokes .ST n for every string tab defined, and -\# optionally passes quad information to it. That done, string tabs -\# can be called just like typesetting tabs. -\# -\# String tabs don't preview properly with gxditview. Use gv instead. +.ig +There are two different kinds of tabs available: typesetting tabs +and string tabs. + +Typesetting tabs are set with TAB_SET, which requires a tab number, +an indent (offset) from the left margin and a length (optionally +with a quad direction and an instruction to fill lines). After tabs +are set with TAB_SET, they are called with .TAB n, where "n" +corresponds to the number passed to TAB_SET as a valid tab number. + +String tabs allow the user to mark off tab positions inline. Tab +indents and lengths are calculated from the beginning and end +positions of the marks. Up to 19 string tabs may be created, +numbered 1-19. Once created, they are called with .TAB n, +just like typesetting tabs. + +Setting up string tabs is a two-step procedure. First, the user +enters an input line in which s/he wants to mark off string tabs. +The beginning of a tab is marked with \*[STn], where "n" is +the desired number of the tab. The end of the the tab is marked +with \*[STnX]. All ST's must have a matching STX. String tabs +may be nested. + +Next, the user invokes .ST n for every string tab defined, and +optionally passes quad information to it. That done, string tabs +can be called just like typesetting tabs. + +String tabs don't preview properly with gxditview. Use gv instead. +.. \# \# Strings for string tab inlines \# ------------------------------ @@ -1291,7 +1534,7 @@ \# Creates strings $ST<#>_QUAD_DIR and $ST<#>_FILL, then sets up a \# tab based on the collected information. \# *Notes: -\# Like TS, ST invoked without a quad direction will default to LEFT. +\# Like TAB_SET, ST invoked without a quad direction will default to LEFT. \# If lines should be filled and quadded, use the optional argument QUAD. \# N.B. -- indents *must* be turned off before setting string tabs \# inside .PAD @@ -1334,40 +1577,43 @@ \# \# N.B. -- indents *must* be turned off before setting tabs \# -\# Examples: -\# -\# .TAB_SET 1 2P+6p 12P C -\# -\# means "create a tab numbered 1 that starts 2 picas and 6 points from -\# the left margin, is 12 picas long, and centre each input line." -\# -\# .TAB_SET 1 2P+6P 12P C QUAD -\# -\# means exactly the same thing, except that input lines are joined and -\# the area delimted by the tab filled with centered text. -\# -\# TAB n can be called at any time after being set. -\# -\# Tabs are NOT columnar in behaviour. If the text inside a -\# tab runs to several lines, when you call the next tab a break -\# occurs, meaning that the new tab starts one line below the last -\# line in the previous tab. For columnar behaviour, you must -\# use the multi-column macros in addition to tabs. -\# -\# If you want tabs to line up bottom-line to bottom-line (most likely -\# single line tabs), use .TN (provided the tabs are numbered sequentially). -\# Otherwise, you must use .EL then .TAB if you want them to align. -\# -\# If you want to reset tabs, you must use .TQ before .TAB_SET. -\# -\# Note that indents are turned off automatically whenever a new -\# tab is called with TAB . -\# -\# Tabs themselves are user-invoked using the TAB macro with a numeric -\# argument, e.g. TAB 1. -\# -\# Generally, in order not to get confused, it's a good idea -\# to make sure all indents are off before setting tabs. +.ig +Examples: +-------- + +.TAB_SET 1 2P+6p 12P C + +means "create a tab numbered 1 that starts 2 picas and 6 points from +the left margin, is 12 picas long, and centre each input line." + +.TAB_SET 1 2P+6P 12P C QUAD + +means exactly the same thing, except that input lines are joined and +the area delimted by the tab filled with centered text. + +TAB n can be called at any time after being set. + +Tabs are NOT columnar in behaviour. If the text inside a +tab runs to several lines, when you call the next tab a break +occurs, meaning that the new tab starts one line below the last +line in the previous tab. For columnar behaviour, you must +use the multi-column macros in addition to tabs. + +If you want tabs to line up bottom-line to bottom-line (most likely +single line tabs), use .TN (provided the tabs are numbered sequentially). +Otherwise, you must use .EL then .TAB if you want them to align. + +If you want to reset tabs, you must use .TQ before .TAB_SET. + +Note that indents are turned off automatically whenever a new +tab is called with TAB . + +Tabs themselves are user-invoked using the TAB macro with a numeric +argument, e.g. TAB 1. + +Generally, in order not to get confused, it's a good idea +to make sure all indents are off before setting tabs. +.. \# .MAC TAB_SET END . br @@ -1376,7 +1622,12 @@ . nr #TAB_OFFSET (\\$2) . nr #TAB_LENGTH (\\$3) . MAC TAB\\n[#TAB_NUMBER] DONE \"Define TAB macro -. br +. if !\\\\n[#TB+]=1 \{ .br \} +. if \\\\n[#TB+]=1 \{\ +. EL +. vpt 0 +. rr #TB+ +. \} . in 0 . nr #TAB_ACTIVE 1 . nr #CURRENT_TAB \\n[#TAB_NUMBER] @@ -1399,6 +1650,10 @@ . if '\\$4'C' \{ .CENTER \} . if '\\$4'J' \{ .JUSTIFY \} . \} +. if \\\\n[#TN]=1 \{\ +. TRAP +. rr #TN +. \} .DONE . rr #TAB_ACTIVE .END @@ -1426,16 +1681,23 @@ \# Automagically moves to TAB on the same line as the last \# line of the previous tab. \# *Notes: -\# If the tabs being aligned fall too close to the footer -\# trap, the line entered after .TN will appear on the next page, -\# unless TRAP...TRAP OFF is used. +\# The \c inline must be appended to the end of input lines when in +\# nofill mode; in fill modes, the \c inline must not be used. \# .MAC TN END -. EL +. nr #TN 1 +. TRAP OFF +. sp -1v . nr #NEXT_TAB \\n[#CURRENT_TAB]+1 . TAB\\n[#NEXT_TAB] +. TRAP .END \# +\# An inline escape to accomplish the same thing. Actually +\# preferable, since it works with filled and non-filled copy and +\# doesn't require the user to remember to use (or not use) the \c. +\# +.ds TB+ "\c\\R'#TB+ 1'\\R'#TN 1'\\R'#NEXT_TAB \\n[#CURRENT_TAB]+1'\\*[TAB\\n[#NEXT_TAB]]\c \# \# TAB QUIT \# -------- @@ -1490,7 +1752,7 @@ .ie \\n(.u=1 \{\ \c \\*[\\$1]\c -. \} +.\} .el \{ \\*[\\$1] \} .END \# @@ -1544,7 +1806,6 @@ . if \\n[#NUM_ARGS]=2 .ds \\$2 \m[\\$1] .END \# -\# \# Pre-define xcolors black and white \# .ds black \m[black] @@ -1942,9 +2203,9 @@ .ds SUP \ \R'#PT_SIZE_IN_UNITS \En[.ps]'\ \R'#SUP_PT_SIZE \En[#PT_SIZE_IN_UNITS]u*6u/10u'\ -\s[\En[#PT_SIZE_IN_UNITS]u]\v'-.3m'\s[\En[#SUP_PT_SIZE]u] +\s[\En[#PT_SIZE_IN_UNITS]u]\v'-.26m'\s[\En[#SUP_PT_SIZE]u] \# -.ds SUPX \s[\En[#PT_SIZE_IN_UNITS]u]\v'.3m' +.ds SUPX \s[\En[#PT_SIZE_IN_UNITS]u]\v'.26m' \# .ds CONDSUP \ \R'#PT_SIZE_IN_UNITS \En[.ps]'\ @@ -2141,35 +2402,37 @@ .MAC PAD END . if \\n(.u=1 \{ .nr #FILL_MODE 1 \} . nf -. if !d$PAD_MARKER \{ .ds $PAD_MARKER # \} +. if !d$PAD_MARKER .ds $PAD_MARKER # . char \\*[$PAD_MARKER] \R'#PAD_COUNT \En[#PAD_COUNT]+1' . ds $FAMILY_FOR_PAD \\n[.fam] -. nr #FONT_FOR_PAD \\n(.f +\#. fp \\n[.fp] \\*[$FONT] +. fp \\n[.fp] \\n[.sty] +. ds $FONT_FOR_PAD \\*[$FONT] . nr #SIZE_FOR_PAD \\n[.ps] . ds $PAD_STRING \\$1 . as $PAD_STRING \Ekp . di PAD_STRING . fam \\*[$FAMILY_FOR_PAD] -\\f\\n[#FONT_FOR_PAD]\\s[\\n[#SIZE_FOR_PAD]u]\\*[$PAD_STRING] +\\f[\\*[$FONT_FOR_PAD]]\\s[\\n[#SIZE_FOR_PAD]u]\\*[$PAD_STRING] . br . di . char \\*[$PAD_MARKER] \R'#SPACE_TO_END \En(.l-\Enp'\R'#PAD_SPACE \En[#SPACE_TO_END]/\En[#PAD_COUNT]' . di PAD_STRING . fam \\*[$FAMILY_FOR_PAD] -\\f\\n[#FONT_FOR_PAD]\\s[\\n[#SIZE_FOR_PAD]u]\\*[$PAD_STRING] +\\f]\\*[$FONT_FOR_PAD]]\\s[\\n[#SIZE_FOR_PAD]u]\\*[$PAD_STRING] . br . di . char \\*[$PAD_MARKER] \h'\En[#PAD_SPACE]u' . ie \\n[#SILENT] \{\ . SILENT . fam \\*[$FAMILY_FOR_PAD] -\\f\\n[#FONT_FOR_PAD]\\s[\\n[#SIZE_FOR_PAD]u]\\*[$PAD_STRING] +\\f[\\*[$FONT_FOR_PAD]]\\s[\\n[#SIZE_FOR_PAD]u]\\*[$PAD_STRING] . br . SILENT OFF . \} . el \{\ . fam \\*[$FAMILY_FOR_PAD] -\\f\\n[#FONT_FOR_PAD]\\s[\\n[#SIZE_FOR_PAD]u]\\*[$PAD_STRING] +\\f[\\*[$FONT_FOR_PAD]]\\s[\\n[#SIZE_FOR_PAD]u]\\*[$PAD_STRING] . br . \} . if \\n[#FILL_MODE]=1 \{\ @@ -2182,19 +2445,25 @@ . rm $PAD_STRING . rm PAD_STRING . rchar # +. if '\\$2'NOBREAK' \{\ +. TRAP OFF +. EOL +. TRAP +. \} .END \# \# \# +++LEADERS+++ \# -\# The leader mechanism is primitive, but it works. Basically, -\# every macro in this set that includes a line length also sets -\# a single groff tab stop at the right hand end of the line. -\# That way, whenever Ctrl-A is invoked (always at the end of -\# an input line), leader of the correct length gets deposited. -\# Ctrl-A is accessed by the string LEADER (i.e. inline, as -\# \*[LEADER]). Leaders within tabs get their length from the -\# tab line length. +.ig +The leader mechanism is primitive, but it works. Basically, every +macro in this set that includes a line length also sets a single +groff tab stop at the right hand end of the line. That way, +whenever Ctrl-A is invoked (always at the end of an input line), +leader of the correct length gets deposited. Ctrl-A is accessed by +the string LEADER (i.e. inline, as \*[LEADER]). Leaders within tabs +get their length from the tab line length. +.. \# \# SET LEADER CHARACTER \# -------------------- @@ -2321,25 +2590,34 @@ . \} . ds $DROPCAP \\$1 . nr #DC_LINES \\$2-1 -. ds $RESTORE_COND \\*[$COND_PERCENT] +. if \\n[#CONDENSE]=1 \{\ +. ds $RESTORE_COND \\*[$COND_PERCENT] +\\*[CONDX] +. nr #CONDENSE_WAS_ON 1 +. \} +. if \\n[#EXTEND]=1 \{\ +. ds $RESTORE_EXT \\*[$EXT_PERCENT] +\\*[EXTX] +. nr #EXTEND_WAS_ON 1 +. \} . if '\\$3'COND' \{ .CONDENSE \\$4 \} . if '\\$3'EXT' \{ .EXTEND \\$4 \} . if !r#DC_GUT \{ .nr #DC_GUT (3p) \} . ds $RESTORE_FAM \\n[.fam] -. nr #RESTORE_FT \\n(.f +. ds $RESTORE_FT \\*[$FONT] . nr #RESTORE_PT_SIZE \\n[#PT_SIZE] . nr #RESTORE_INDENT \\n(.i . SIZESPECS . nr #DC_HEIGHT \\n[#DC_LINES]*\\n[#LEAD]+\\n[#CAP_HEIGHT] . ie !d$DC_FAM \{ .FAM \\n[.fam] \} . el \{ .FAM \\*[$DC_FAM] \} -. ie !d$DC_FT \{ .FT \\n(.f \} +. ie !d$DC_FT \{ .FT \\*[$FONT] \} . el \{ .FT \\*[$DC_FT] \} . while \\n[#GET_DC_HEIGHT]<\\n[#DC_HEIGHT] \{\ . ps \\n[#PT_SIZE]u+100u . SIZESPECS . nr #GET_DC_HEIGHT \\n[#CAP_HEIGHT] -. \} +.\} . if d$DC_ADJUST \{ .ps \\*[$DC_ADJUST]p \} . mk x . sp \\n[#DC_LINES]v @@ -2360,23 +2638,31 @@ . if '\\$3'COND' \{ \E*[COND] \} . if '\\$3'EXT' \{ \E*[EXT] \} . ie \\n(.i \{ .in +\w'\\*[$DROPCAP]'u+\\n[#DC_GUT]u \} -. el \{ .in \w'\\*[$DROPCAP]'u+\\n[#DC_GUT]u \} +. el \{ .in \w'\\*[$DROPCAP]'u+\\n[#DC_GUT]u \} . if '\\$3'COND' \{ \E*[CONDX]\c \} . if '\\$3'EXT' \{ \E*[EXTX]\c \} . rt \\nxu . FAM \\*[$RESTORE_FAM] -. FT \\n[#RESTORE_FT] +. FT \\*[$RESTORE_FT] . ps \\n[#RESTORE_PT_SIZE]u -. CONDENSE \\*[$RESTORE_COND] -. EXTEND \\*[$RESTORE_EXT] +. if \\n[#CONDENSE_WAS_ON] \{\ +. CONDENSE \\*[$RESTORE_COND] +\\*[COND]\c +. \} +. if \\n[#EXTEND_WAS_ON] \{\ +. EXTEND \\*[$RESTORE_EXT] +\\*[EXT]\c +. \} . ie \\n(.u \{ .wh \\n(.du+\\n[#DC_HEIGHT]u-1v DROPCAP_OFF \} . el \{ .wh \\n(.du+\\n[#DC_HEIGHT]u DROPCAP_OFF \} +. rr #CONDENSE_WAS_ON +. rr #EXTEND_WAS_ON . rm $DROPCAP . rr #DC_LINES . rm $RESTORE_COND . rm $RESTORE_EXT . rm $RESTORE_FAM -. rr #RESTORE_FT +. rm $RESTORE_FT . rr #RESTORE_PT_SIZE . rr #RESTORE_INDENT . rr #DC_HEIGHT @@ -2401,6 +2687,7 @@ \c . EL . if \\n(.u=1 \{\ +. nr #FILL_WAS_ON 1 . ds $CURRENT_QUAD \\*[$QUAD_VALUE] . nf . \} @@ -2408,15 +2695,19 @@ . nr #RESTORE_L_LENGTH \\n(.l . if \\n[#INDENT_BOTH_ACTIVE] \{ .ll \\n(.lu-\\n[#BL_INDENT]u \} . if \\n[#INDENT_LEFT_ACTIVE] \{ .ll \\n(.lu-\\n[#L_INDENT]u \} -. PRINT \El'\En(.lu' +. PRINT \El'\En(.lu'\c . ll \\n[#RESTORE_L_LENGTH]u . rr #RESTORE_L_LENGTH . \} . el \{\ -. PRINT \El'\En(.lu' +. PRINT \El'\En(.lu'\c +. \} +. if r#FILL_WAS_ON \{\ +. fi +. rr #FILL_WAS_ON +. QUAD \\*[$CURRENT_QUAD] +. rm $CURRENT_QUAD . \} -. QUAD \\*[$CURRENT_QUAD] -. rm $CURRENT_QUAD . EL .END \# @@ -2444,8 +2735,8 @@ .MAC WS END . ds $WS_CONSTANT 12 . ds $WS_VAR \\$1 -. ie '\\$1'DEFAULT' \{ .ds $WS_VAR +0 \} -. el \{ .ds $WS (\\*[$WS_CONSTANT]\\*[$WS_VAR]) \} +. ie '\\$1'DEFAULT' .ds $WS_VAR +0 +. el .ds $WS (\\*[$WS_CONSTANT]\\*[$WS_VAR]) . ie \\n[.sss]=12 \{ .ss \\*[$WS] 12 \} . el \{\ . ss \\*[$WS] (\\*[$WS]\\*[$SS_VAR]) @@ -2490,86 +2781,88 @@ \# \# +++INDENTS+++ \# -\# There are five styles of indents: left, right, both, temporary, -\# and hanging. Each is set/invoked with a different macro. -\# Indent macros begin with the letter "I", hence .IL means "indent left," -\# .IR means "indent right," and so on. -\# -\# The first time any of the indent macros is used, it requires an -\# argument--the size of the indent (with a unit of measure). The -\# size may also be entered using the \w escape--very useful -\# for numbered lists using HI. The unit of measure is required. -\# Subsequent invocations don't require the argument; the indent -\# measure remains the same until it's changed by invoking the macro -\# with an argument again. -\# -\# If no indents are in effect, the arguments passed to indent macros are -\# measured from the left and right margins of the page. If a left indent -\# or a right indent is already in effect, the arguments passed to -\# the indent macros are calculated from the current values; in other words, -\# the arguments are additive. If you quit an indent and later return -\# to it, its value will be the value last in effect, unless you pass -\# it an argument. If you do pass an argument, it is added to the last -\# value in effect, unless you cleared the indent with one of -\# .IX/Q macros. -\# -\# Example -\# ------- -\# -\# .IL 2P -\# ...some text... -\# .IL 2P -\# ...some text... -\# .IQ -\# ...some text... -\# .IL -\# ...some text... -\# -\# The first .IL 2P indents text 2P from the left margin. The second -\# .IL 2P indents text by an additional 2P, i.e. 4P from the left margin. -\# .IQ turns the indent off. The last .IL (which has no argument) -\# takes its value from the total of all arguments passed to .IL (in -\# this case, 2P and 2P), therefore it indents 2P+2P from the left -\# margin, i.e. 4P. If you wanted the last .IL to indent just 2P, -\# you'd either have to reset the .IL prior to .IQ (.IL -2P), or pass -\# the last .IL the argument 2P. -\# -\# To reverse the sense of an indent added to an indent, you may use -\# negative values. -\# -\# Indents can be turned off individually with ILX, IRX, and IBX. -\# LEFT and RIGHT indents may be combined and manipulated -\# separately, (e.g. you can have an IL of 2P and an IR of 4P -\# operative at the same time, and then change, say, the IL to -\# 4P--thereby left indenting 6P--while the IR remains at 4P. -\# -\# IB automatically turns off IL and IR. They have to be reinvoked -\# again when needed. IL and IR automatically turn IB off; it, too, -\# has to be reinvoked with needed. -\# -\# All indents can be turned off at once with IQ. The ILX, IRX, IBX, -\# and IQ macros simply turn the indents off; the values stored in -\# the respective indent macros (IL, IR, IB) remain in effect. If -\# the user wishes to clear the values, the IX macros should be -\# invoked with the single argument CLEAR. IQ CLEAR clears out -\# the values stored for all indent styles. -\# -\# Indents *must* be turned off before settting string tabs -\# inside PAD. Generally, in order not to get confused, it's a -\# good idea to turn all indents off before setting any tabs. -\# -\# TI and HI are special cases. There's no need to turn them off, -\# since they affect only one line--the first after their -\# invocation. Like the other indent styles, the first time -\# they're invoked, they require a value in iPpcm; each subsequent -\# invocation without an argument will use the same value. To -\# change the value, simply pass a new value. Values for TI and HI -\# are *not* additive. -\# -\# HI presupposes that you already have a left or both indent on. -\# HI will never hang a line outside the left margin of a document -\# or column. In other words, you must have IL or IB on before you -\# can use HI. +.ig +There are five styles of indents: left, right, both, temporary, +and hanging. Each is set/invoked with a different macro. +Indent macros begin with the letter "I", hence .IL means "indent left," +.IR means "indent right," and so on. + +The first time any of the indent macros is used, it requires an +argument--the size of the indent (with a unit of measure). The +size may also be entered using the \w escape--very useful +for numbered lists using HI. The unit of measure is required. +Subsequent invocations don't require the argument; the indent +measure remains the same until it's changed by invoking the macro +with an argument again. + +If no indents are in effect, the arguments passed to indent macros are +measured from the left and right margins of the page. If a left indent +or a right indent is already in effect, the arguments passed to +the indent macros are calculated from the current values; in other words, +the arguments are additive. If you quit an indent and later return +to it, its value will be the value last in effect, unless you pass +it an argument. If you do pass an argument, it is added to the last +value in effect, unless you cleared the indent with one of +.IX/Q macros. + +Example +------- + +.IL 2P +...some text... +.IL 2P +...some text... +.IQ +...some text... +.IL +...some text... + +The first .IL 2P indents text 2P from the left margin. The second +.IL 2P indents text by an additional 2P, i.e. 4P from the left margin. +.IQ turns the indent off. The last .IL (which has no argument) +takes its value from the total of all arguments passed to .IL (in +this case, 2P and 2P), therefore it indents 2P+2P from the left +margin, i.e. 4P. If you wanted the last .IL to indent just 2P, +you'd either have to reset the .IL prior to .IQ (.IL -2P), or pass +the last .IL the argument 2P. + +To reverse the sense of an indent added to an indent, you may use +negative values. + +Indents can be turned off individually with ILX, IRX, and IBX. +LEFT and RIGHT indents may be combined and manipulated +separately, (e.g. you can have an IL of 2P and an IR of 4P +operative at the same time, and then change, say, the IL to +4P--thereby left indenting 6P--while the IR remains at 4P. + +IB automatically turns off IL and IR. They have to be reinvoked +again when needed. IL and IR automatically turn IB off; it, too, +has to be reinvoked with needed. + +All indents can be turned off at once with IQ. The ILX, IRX, IBX, +and IQ macros simply turn the indents off; the values stored in +the respective indent macros (IL, IR, IB) remain in effect. If +the user wishes to clear the values, the IX macros should be +invoked with the single argument CLEAR. IQ CLEAR clears out +the values stored for all indent styles. + +Indents *must* be turned off before settting string tabs +inside PAD. Generally, in order not to get confused, it's a +good idea to turn all indents off before setting any tabs. + +TI and HI are special cases. There's no need to turn them off, +since they affect only one line--the first after their +invocation. Like the other indent styles, the first time +they're invoked, they require a value in iPpcm; each subsequent +invocation without an argument will use the same value. To +change the value, simply pass a new value. Values for TI and HI +are *not* additive. + +HI presupposes that you already have a left or both indent on. +HI will never hang a line outside the left margin of a document +or column. In other words, you must have IL or IB on before you +can use HI. +.. \# \# INDENT LEFT \# ----------- @@ -2856,7 +3149,9 @@ \# Returns to the top of a column set \# .MAC MCR END +. TRAP OFF . sp |\\ncu +. TRAP .END \# \# MULTIPLE COLUMNS OFF @@ -2882,7 +3177,7 @@ . TQ . ie \\n[#MCX_ALD]=0 \{ .sp |\\n(.hu-1v \} . el \{ .sp |\\n(.hu+\\n[#MCX_ALD]u \} -. rr #MCX_ALD (\\$1) +. rr #MCX_ALD . \} .END \# @@ -2937,13 +3232,11 @@ \# \# PRINT \# ----- -\# *Arguments: -\# \# *Function: \# Prints anything. A macro that helps keep my code nicely indented. \# .MAC PRINT END -\\$* +. nop \\$* .END \# \# @@ -3050,6 +3343,7 @@ \# \# +++TYPESETTING ALIASES+++ \# +.ALIAS ADD_SPACE ALD .ALIAS CENTRE CENTER .ALIAS COLOUR COLOR .ALIAS COMMENT SILENT @@ -3066,10 +3360,12 @@ .ALIAS LIG LIGATURES .ALIAS NEWCOLOUR NEWCOLOR .ALIAS PADMARKER PAD_MARKER +.ALIAS SP ALD +.ALIAS SPACE ALD .ALIAS TABSET TAB_SET .ALIAS TB TAB .ALIAS UNDERSCORE_2 UNDERSCORE2 -.ALIAS XCOLOUR XCOLOUR +.ALIAS XCOLOUR XCOLOR \# \# \# ==================================================================== @@ -3084,7 +3380,7 @@ \# *Arguments: \# LETTER | LEGAL | STATEMENT | TABLOID | LEDGER | FOLIO | QUARTO | 10x14 | EXECUTIVE | A3 | A4 | A5 | B4 | B5 \# *Function: -\# Sets up margins for different paper sizes. +\# Sets up dimensions for different paper sizes. \# .MAC PAPER END . ds $PAPER \\$1 @@ -3163,70 +3459,84 @@ \# Number registers: TYPEWRITE=1, TYPESET=2. \# .MAC PRINTSTYLE END -. if !d$PAPER \{ .PAPER LETTER \} -. if '\\$1'TYPEWRITE' \{\ -. nr #PRINT_STYLE 1 -. if !\\n[#DOC_TYPE]=4 \{ .L_MARGIN 6P \} -. if !\\n[#DOC_TYPE]=4 \{ .R_MARGIN 6P \} -. fam C -. ft R -. ps 12 -. color 0 -. ie '\\$2'SINGLESPACE' \{\ -. nr #SINGLE_SPACE 1 -. vs 12 -. \} -. el \{ .vs 24 \} -. QUAD L -. HY OFF -. SMARTQUOTES OFF -. if !\\n[#PP_INDENT] \{\ -. in 3P \"Set indent -. nr #PP_INDENT \\n(.i \"Read into #PP_INDENT -. in 0 \"Remove indent -. \} -. HDRFTR_RIGHT_CAPS -. nr #BOLDER_UNITS 0 -. nr #CONDENSE 0 -. nr #EXTEND 0 -. rm IT -. rm BD -. rm BDI -. rm PREV -. UNDERLINE_SLANT -. UNDERLINE_ITALIC -. UNDERLINE_QUOTES -. nr #IGNORE_COLUMNS 1 -. char \(em -- -. \} -. if '\\$1'TYPESET' \{\ -. nr #PRINT_STYLE 2 -. if !\\n[#DOC_TYPE]=4 \{ .L_MARGIN 6P \} -. if !\\n[#DOC_TYPE]=4 \{ .R_MARGIN 6P \} -. FAMILY T -. FT R -. if !\\n[#DOC_TYPE]=4 \{ .PT_SIZE 12.5 \} -. if !\\n[#DOC_TYPE]=4 \{ .LS 16 \} -. JUSTIFY -. HY -. HY_SET 2 36p 1p -. KERN -. LIG -. SS 0 -. SMARTQUOTES -. if !\\n[#PP_INDENT] \{\ -. in 2m \"Set indent -. nr #PP_INDENT \\n(.i \"Read into #PP_INDENT -. in 0 \"Remove indent +. if !\\n[#COLLATE]=1 \{\ +. if !d$PAPER \{ .PAPER LETTER \} +. if '\\$1'TYPEWRITE' \{\ +. nr #PRINT_STYLE 1 +. if !\\n[#DOC_TYPE]=4 \{ .L_MARGIN 6P \} +. if !\\n[#DOC_TYPE]=4 \{ .R_MARGIN 6P \} +. TYPEWRITER +. color 0 +. ie '\\$2'SINGLESPACE' \{\ +. nr #SINGLE_SPACE 1 +. vs 12 +. nr #ORIGINAL_DOC_LEAD \\n(.v +. \} +. el \{\ +. vs 24 +. nr #ORIGINAL_DOC_LEAD \\n(.v +. \} +. QUAD L +. HY OFF +. SMARTQUOTES OFF +. if !\\n[#PP_INDENT] \{\ +. in 3P \"Set indent +. nr #PP_INDENT \\n(.i \"Read into #PP_INDENT +. in 0 \"Remove indent +. \} +. HDRFTR_RIGHT_CAPS +. nr #BOLDER_UNITS 0 +. nr #CONDENSE 0 +. nr #EXTEND 0 +. rm IT +. rm BD +. rm BDI +. rm PREV +. UNDERLINE_SLANT +. UNDERLINE_ITALIC +. UNDERLINE_QUOTES +. nr #IGNORE_COLUMNS 1 +. char \(em -- +. tr `' +. \} +. if '\\$1'TYPESET' \{\ +. nr #PRINT_STYLE 2 +. if !\\n[#DOC_TYPE]=4 \{ .L_MARGIN 6P \} +. if !\\n[#DOC_TYPE]=4 \{ .R_MARGIN 6P \} +. FAMILY T +. FT R +. if !\\n[#DOC_TYPE]=4 \{ .PT_SIZE 12.5 \} +. if !\\n[#DOC_TYPE]=4 \{ .LS 16 \} +. JUSTIFY +. HY +. HY_SET 2 36p 1p +. KERN +. LIG +. SS 0 +. SMARTQUOTES +. if !\\n[#PP_INDENT] \{\ +. in 2m \"Set indent +. nr #PP_INDENT \\n(.i \"Read into #PP_INDENT +. in 0 \"Remove indent +. \} +. HDRFTR_RIGHT_CAPS +. rr #IGNORE_COLUMNS . \} -. HDRFTR_RIGHT_CAPS -. rr #IGNORE_COLUMNS . \} .END \# \# \# Macros to control behaviour of PRINTSTYLE TYPEWRITE \# +\# First, a little utility macro. +\# +.MAC TYPEWRITER END +. fam C +. ft R +. ps 12 +.END +\# +\# \# ITALIC MEANS ITALIC \# ------------------- \# *Argument: @@ -3350,7 +3660,7 @@ . if !d$CHAPTER_STRING \{ .CHAPTER_STRING "Chapter" \} . if !d$DRAFT_STRING \{ .DRAFT_STRING "Draft" \} . if !d$REVISION_STRING \{ .REVISION_STRING "Rev." \} -\# Default +.\" Default . if \\n[#DOC_TYPE]=1 \{\ . ie \\n[#COPY_STYLE]=1 \{\ . ie \\n[#PAGENUM_STYLE_SET] \{ .PAGENUM_STYLE \\*[$PAGENUM_STYLE] \} @@ -3375,15 +3685,16 @@ . el \{\ . ie \\n[#PAGENUM_STYLE_SET] \{ .PAGENUM_STYLE \\*[$PAGENUM_STYLE] \} . el \{ .PAGENUM_STYLE DIGIT \} +. if r#DRAFT_WITH_PAGENUM \{ .rr #DRAFT_WITH_PAGENUM \} . if \\n[#USER_DEF_HDRFTR_CENTER]=0 \{\ . ds $HDRFTR_CENTER . rr #USER_DEF_HDRFTR_CENTER . \} . \} . \} -\# Chapter +.\" Chapter . if \\n[#DOC_TYPE]=2 \{\ -\# Copystyle DRAFT +.\" Copystyle DRAFT . ie \\n[#COPY_STYLE]=1 \{\ . ie \\n[#PAGENUM_STYLE_SET] \{ .PAGENUM_STYLE \\*[$PAGENUM_STYLE] \} . el \{ .PAGENUM_STYLE roman \} @@ -3393,13 +3704,13 @@ . ie !'\\*[$CHAPTER_TITLE]'' \{\ . ds $HDRFTR_CENTER \\*[$CHAPTER_TITLE] . \} -. el \{ .ds $HDRFTR_CENTER \\*[$CHAPTER_STRING] \} +. el .ds $HDRFTR_CENTER \\*[$CHAPTER_STRING] . \} . el \{\ . ie !'\\*[$CHAPTER_TITLE]'' \{\ . ds $HDRFTR_CENTER \\*[$CHAPTER_TITLE] . \} -. el \{ .ds $HDRFTR_CENTER \\*[$CHAPTER_STRING] \\*[$CHAPTER] \} +. el .ds $HDRFTR_CENTER \\*[$CHAPTER_STRING] \\*[$CHAPTER] . \} . \} . el \{\ @@ -3512,8 +3823,9 @@ . \} . \} . \} -\# Copystyle FINAL +.\" Copystyle FINAL . el \{\ +. if r#DRAFT_WITH_PAGENUM \{ .rr #DRAFT_WITH_PAGENUM \} . if \\n[#USER_DEF_HDRFTR_CENTER]=0 \{\ . ie \\n[#PAGENUM_STYLE_SET] \{ .PAGENUM_STYLE \\*[$PAGENUM_STYLE] \} . el \{ .PAGENUM_STYLE DIGIT \} @@ -3536,7 +3848,7 @@ . \} . \} . \} -\# Named +.\" Named . if \\n[#DOC_TYPE]=3 \{\ . ie \\n[#COPY_STYLE]=1 \{\ . ie \\n[#PAGENUM_STYLE_SET] \{ .PAGENUM_STYLE \\*[$PAGENUM_STYLE] \} @@ -3573,6 +3885,7 @@ . \} . \} . el \{\ +. if r#DRAFT_WITH_PAGENUM \{ .rr #DRAFT_WITH_PAGENUM \} . if \\n[#USER_DEF_HDRFTR_CENTER]=0 \{\ . ie \\n[#PAGENUM_STYLE_SET] \{ .PAGENUM_STYLE \\*[$PAGENUM_STYLE] \} . el \{ .PAGENUM_STYLE DIGIT \} @@ -3584,7 +3897,7 @@ \# \# ==================================================================== \# -\# +++COLLECT DOC INFO -- STRINGS AND NUMBER REGISTERS+++ +\# +++COLLECT DOC INFO -- STRINGS AND REGISTERS FOR REFERENCE MACROS+++ \# \# *Arguments: \# various string/register arguments @@ -3592,7 +3905,7 @@ \# Collect information about documents. \# \# -.MAC DOC_TITLE END +.MAC DOCTITLE END . ds $DOC_TITLE \\$1 .END \# @@ -3617,8 +3930,8 @@ \# \# .MAC DRAFT END \"Draft number -. ie '\\$1'' \{ .ds $DRAFT \} -. el \{ .ds $DRAFT " \\$1\} +. ie '\\$1'' .ds $DRAFT +. el .ds $DRAFT " \\$1 .END \# \# @@ -3636,13 +3949,27 @@ . nr #AUTHOR_NUM -1 1 . while \\n[#NUM_ARGS]>\\n[#AUTHOR_NUM] \{\ . ds $AUTHOR_\\n+[#AUTHOR_NUM] \\$\\n[#AUTHOR_NUM] -. \} +.\} . nr #NUM_AUTHORS \\n[#NUM_ARGS]%2 \"Use mod 2 to test if odd or even # of authors . ie \\n[#NUM_AUTHORS]=1 \{ .nr #AUTHOR_LINES 0 \} . el \{ .nr #AUTHOR_LINES 1 \} .END \# \# +.MAC COPYRIGHT END \"For use on cover page only +. ds $COPYRIGHT \[co]\\$1 +.END +\# +\# +.MAC MISC END \"For use on cover page only; enclose all args in double quotes +. nr #MISC_NUM -1 1 +. while \\n[#NUM_ARGS]>\\n[#MISC_NUM] \{\ +. ds $MISC_\\n+[#MISC_NUM] \\$\\n[#MISC_NUM] +.\} +. nr #NUM_MISCS \\n[#NUM_ARGS] +.END +\# +\# .MAC PAGENUMBER END \"Page # that appears on page one. . nr #n%_AT_PAGENUM_SET \\n% . nr #PAGE_NUM_ADJ \\$1-\\n[#n%_AT_PAGENUM_SET] @@ -3802,6 +4129,375 @@ \# \# +++DEFAULTS+++ \# +\# TYPE-STYLE CONTROL MACROS +\# ------------------------- +\# +.ig +The control macros for family, font, size, quad and color are here +grouped together. Each (e.g. _FAMILY or _FONT) tests for a calling +alias before performing the action(s) appropriate to the calling +macro. Defaults for all these guys are set in DEFAULTS, and listed +in the "Control Macros" section of the documentation pertinent to +the macro whose style is to be changed. +.. +\# +.MAC _FAMILY END +. if '\\$0'AUTHOR_FAMILY' .ds $AUTHOR_FAM \\$1 +. if '\\$0'BIBLIOGRAPHY_FAMILY' .ds $BIB_FAM \\$1 +. if '\\$0'BIBLIOGRAPHY_STRING_FAMILY' .ds $BIB_STRING_FAM \\$1 +. if '\\$0'BLOCKQUOTE_FAMILY' .ds $BQUOTE_FAM \\$1 +. if '\\$0'CITATION_FAMILY' .ds $BQUOTE_FAM \\$1 +. if '\\$0'CITE_FAMILY' .ds $BQUOTE_FAM \\$1 +. if '\\$0'CHAPTER_TITLE_FAMILY' .ds $CHAPTER_TITLE_FAM \\$1 +. if '\\$0'COVER_AUTHOR_FAMILY' .ds $COVER_AUTHOR_FAM \\$1 +. if '\\$0'COVER_CHAPTER_TITLE_FAMILY' .ds $COVER_CHAPTER_TITLE_FAM \\$1 +. if '\\$0'COVER_COPYRIGHT_FAMILY' .ds $COVER_COPYRIGHT_FAM \\$1 +. if '\\$0'COVER_DOCTYPE_FAMILY' .ds $COVER_DOCTYPE_FAM \\$1 +. if '\\$0'COVER_FAMILY' .ds $COVER_FAM \\$1 +. if '\\$0'COVER_SUBTITLE_FAMILY' .ds $COVER_SUBTITLE_FAM \\$1 +. if '\\$0'COVER_TITLE_FAMILY' .ds $COVER_TITLE_FAM \\$1 +. if '\\$0'DOC_COVER_AUTHOR_FAMILY' .ds $DOC_COVER_AUTHOR_FAM \\$1 +. if '\\$0'DOC_COVER_CHAPTER_TITLE_FAMILY' .ds $DOC_COVER_CHAPTER_TITLE_FAM \\$1 +. if '\\$0'DOC_COVER_COPYRIGHT_FAMILY' .ds $DOC_COVER_COPYRIGHT_FAM \\$1 +. if '\\$0'DOC_COVER_DOCTYPE_FAMILY' .ds $DOC_COVER_DOCTYPE_FAM \\$1 +. if '\\$0'DOC_COVER_FAMILY' .ds $DOC_COVER_FAM \\$1 +. if '\\$0'DOC_COVER_SUBTITLE_FAMILY' .ds $DOC_COVER_SUBTITLE_FAM \\$1 +. if '\\$0'DOC_COVER_TITLE_FAMILY' .ds $DOC_COVER_TITLE_FAM \\$1 +. if '\\$0'DOCHEADER_FAMILY' .ds $DOCHEADER_FAM \\$1 +. if '\\$0'DOCTYPE_FAMILY' .ds $DOCTYPE_FAM \\$1 +. if '\\$0'ENDNOTE_FAMILY' .ds $EN_FAM \\$1 +. if '\\$0'ENDNOTE_NUMBER_FAMILY' .ds $EN_NUMBER_FAM \\$1 +. if '\\$0'ENDNOTE_LINENUMBER_FAMILY' .ds $EN_LN_FAM \\$1 +. if '\\$0'ENDNOTE_STRING_FAMILY' .ds $EN_STRING_FAM \\$1 +. if '\\$0'ENDNOTE_TITLE_FAMILY' .ds $EN_TITLE_FAM \\$1 +. if '\\$0'EPIGRAPH_FAMILY' .ds $EPI_FAM \\$1 +. if '\\$0'FOOTNOTE_FAMILY' .ds $FN_FAM \\$1 +. if '\\$0'HDRFTR_CENTER_FAMILY' .ds $HDRFTR_CENTER_FAM \\$1 +. if '\\$0'HDRFTR_FAMILY' \{\ +. ds $HDRFTR_FAM \\$1 +. ds $HDRFTR_LEFT_FAM \\$1 +. ds $HDRFTR_CENTER_FAM \\$1 +. ds $HDRFTR_RIGHT_FAM \\$1 +. \} +. if '\\$0'HDRFTR_LEFT_FAMILY' .ds $HDRFTR_LEFT_FAM \\$1 +. if '\\$0'HDRFTR_RIGHT_FAMILY' .ds $HDRFTR_RIGHT_FAM \\$1 +. if '\\$0'HEAD_FAMILY' .ds $HEAD_FAM \\$1 +. if '\\$0'PAGENUM_FAMILY' .ds $PAGE_NUM_FAM \\$1 +. if '\\$0'PARAHEAD_FAMILY' .ds $PH_FAM \\$1 +. if '\\$0'QUOTE_FAMILY' .ds $QUOTE_FAM \\$1 +. if '\\$0'SUBHEAD_FAMILY' .ds $SH_FAM \\$1 +. if '\\$0'SUBTITLE_FAMILY' .ds $SUBTITLE_FAM \\$1 +. if '\\$0'TITLE_FAMILY' .ds $TITLE_FAM \\$1 +. if '\\$0'TOC_FAMILY' .ds $TOC_FAM \\$1 +. if '\\$0'TOC_FAM' .ds $TOC_FAM \\$1 +. if '\\$0'TOC_HEADER_FAMILY' .ds $TOC_HEADER_FAM \\$1 +. if '\\$0'TOC_HEAD_FAMILY' .ds $TOC_HEAD_FAM \\$1 +. if '\\$0'TOC_PARAHEAD_FAMILY' .ds $TOC_PH_FAM \\$1 +. if '\\$0'TOC_PN_FAMILY' .ds $TOC_PN_FAM \\$1 +. if '\\$0'TOC_SUBHEAD_FAMILY' .ds $TOC_SH_FAM \\$1 +. if '\\$0'TOC_TITLE_FAMILY' .ds $TOC_TITLE_FAM \\$1 +.END +\# +\# +.MAC _FONT END +. if '\\$0'AUTHOR_FONT' .ds $AUTHOR_FT \\$1 +. if '\\$0'BIBLIOGRAPHY_FONT' .ds $BIB_FT \\$1 +. if '\\$0'BIBLIOGRAPHY_STRING_FONT' .ds $BIB_STRING_FT \\$1 +. if '\\$0'BLOCKQUOTE_FONT' .ds $BQUOTE_FT \\$1 +. if '\\$0'CITATION_FONT' .ds $BQUOTE_FT \\$1 +. if '\\$0'CITE_FONT' .ds $BQUOTE_FT \\$1 +. if '\\$0'CHAPTER_TITLE_FONT' .ds $CHAPTER_TITLE_FT \\$1 +. if '\\$0'COVER_AUTHOR_FONT' .ds $COVER_AUTHOR_FT \\$1 +. if '\\$0'COVER_CHAPTER_TITLE_FONT' .ds $COVER_CHAPTER_TITLE_FT \\$1 +. if '\\$0'COVER_COPYRIGHT_FONT' .ds $COVER_COPYRIGHT_FT \\$1 +. if '\\$0'COVER_DOCTYPE_FONT' .ds $COVER_DOCTYPE_FT \\$1 +. if '\\$0'COVER_SUBTITLE_FONT' .ds $COVER_SUBTITLE_FT \\$1 +. if '\\$0'COVER_TITLE_FONT' .ds $COVER_TITLE_FT \\$1 +. if '\\$0'DOC_COVER_AUTHOR_FONT' .ds $DOC_COVER_AUTHOR_FT \\$1 +. if '\\$0'DOC_COVER_CHAPTER_TITLE_FONT' .ds $DOC_COVER_CHAPTER_TITLE_FT \\$1 +. if '\\$0'DOC_COVER_COPYRIGHT_FONT' .ds $DOC_COVER_COPYRIGHT_FT \\$1 +. if '\\$0'DOC_COVER_DOCTYPE_FONT' .ds $DOC_COVER_DOCTYPE_FT \\$1 +. if '\\$0'DOC_COVER_SUBTITLE_FONT' .ds $DOC_COVER_SUBTITLE_FT \\$1 +. if '\\$0'DOC_COVER_TITLE_FONT' .ds $DOC_COVER_TITLE_FT \\$1 +. if '\\$0'DOCTYPE_FONT' .ds $DOCTYPE_FT \\$1 +. if '\\$0'ENDNOTE_FONT' .ds $EN_FT \\$1 +. if '\\$0'ENDNOTE_NUMBER_FONT' .ds $EN_NUMBER_FT \\$1 +. if '\\$0'ENDNOTE_LINENUMBER_FONT' .ds $EN_LN_FT \\$1 +. if '\\$0'ENDNOTE_STRING_FONT' .ds $EN_STRING_FT \\$1 +. if '\\$0'ENDNOTE_TITLE_FONT' .ds $EN_TITLE_FT \\$1 +. if '\\$0'EPIGRAPH_FONT' .ds $EPI_FT \\$1 +. if '\\$0'FOOTNOTE_FONT' .ds $FN_FT \\$1 +. if '\\$0'HDRFTR_CENTER_FONT' .ds $HDRFTR_CENTER_FT \\$1 +. if '\\$0'HDRFTR_LEFT_FONT' .ds $HDRFTR_LEFT_FT \\$1 +. if '\\$0'HDRFTR_RIGHT_FONT' .ds $HDRFTR_RIGHT_FT \\$1 +. if '\\$0'HEAD_FONT' .ds $HEAD_FT \\$1 +. if '\\$0'PAGENUM_FONT' .ds $PAGE_NUM_FT \\$1 +. if '\\$0'PARAHEAD_FONT' .ds $PH_FT \\$1 +. if '\\$0'QUOTE_FONT' .ds $QUOTE_FT \\$1 +. if '\\$0'SUBHEAD_FONT' .ds $SH_FT \\$1 +. if '\\$0'SUBTITLE_FONT' .ds $SUBTITLE_FT \\$1 +. if '\\$0'TITLE_FONT' .ds $TITLE_FT \\$1 +. if '\\$0'TOC_HEADER_FONT' .ds $TOC_HEADER_FT \\$1 +. if '\\$0'TOC_HEAD_FONT' .ds $TOC_HEAD_FT \\$1 +. if '\\$0'TOC_PARAHEAD_FONT' .ds $TOC_PH_FT \\$1 +. if '\\$0'TOC_PN_FONT' .ds $TOC_PN_FT \\$1 +. if '\\$0'TOC_SUBHEAD_FONT' .ds $TOC_SH_FT \\$1 +. if '\\$0'TOC_TITLE_FONT' .ds $TOC_TITLE_FT \\$1 +.END +\# +\# +.MAC _SIZE END +. if '\\$0'AUTHOR_SIZE' .ds $AUTHOR_SIZE_CHANGE \\$1 +. if '\\$0'BIBLIOGRAPHY_STRING_SIZE' .ds $BIB_STRING_SIZE_CHANGE \\$1 +. if '\\$0'BLOCKQUOTE_SIZE' .ds $BQUOTE_SIZE_CHANGE \\$1 +. if '\\$0'CITATION_SIZE' .ds $BQUOTE_SIZE_CHANGE \\$1 +. if '\\$0'CITE_SIZE' .ds $BQUOTE_SIZE_CHANGE \\$1 +. if '\\$0'CHAPTER_TITLE_SIZE' .ds $CHAPTER_TITLE_SIZE_CHANGE \\$1 +. if '\\$0'COVER_AUTHOR_SIZE' .ds $COVER_AUTHOR_SIZE_CHANGE \\$1 +. if '\\$0'COVER_CHAPTER_TITLE_SIZE' .ds $COVER_CHAPTER_TITLE_SIZE_CHANGE \\$1 +. if '\\$0'COVER_COPYRIGHT_SIZE' .ds $COVER_COPYRIGHT_SIZE_CHANGE \\$1 +. if '\\$0'COVER_DOCTYPE_SIZE' .ds $COVER_DOCTYPE_SIZE_CHANGE \\$1 +. if '\\$0'COVER_SUBTITLE_SIZE' .ds $COVER_SUBTITLE_SIZE_CHANGE \\$1 +. if '\\$0'COVER_TITLE_SIZE' .ds $COVER_TITLE_SIZE_CHANGE \\$1 +. if '\\$0'DOC_COVER_AUTHOR_SIZE' .ds $DOC_COVER_AUTHOR_SIZE_CHANGE \\$1 +. if '\\$0'DOC_COVER_CHAPTER_TITLE_SIZE' .ds $DOC_COVER_CHAPTER_TITLE_SIZE_CHANGE \\$1 +. if '\\$0'DOC_COVER_COPYRIGHT_SIZE' .ds $DOC_COVER_COPYRIGHT_SIZE_CHANGE \\$1 +. if '\\$0'DOC_COVER_DOCTYPE_SIZE' .ds $DOC_COVER_DOCTYPE_SIZE_CHANGE \\$1 +. if '\\$0'DOC_COVER_SUBTITLE_SIZE' .ds $DOC_COVER_SUBTITLE_SIZE_CHANGE \\$1 +. if '\\$0'DOC_COVER_TITLE_SIZE' .ds $DOC_COVER_TITLE_SIZE_CHANGE \\$1 +. if '\\$0'DOCTYPE_SIZE' .ds $DOCTYPE_SIZE_CHANGE \\$1 +. if '\\$0'ENDNOTE_NUMBER_SIZE' .ds $EN_NUMBER_SIZE_CHANGE \\$1 +. if '\\$0'ENDNOTE_LINENUMBER_SIZE' .ds $EN_LN_SIZE_CHANGE \\$1 +. if '\\$0'ENDNOTE_STRING_SIZE' .ds $EN_STRING_SIZE_CHANGE \\$1 +. if '\\$0'ENDNOTE_TITLE_SIZE' .ds $EN_TITLE_SIZE_CHANGE \\$1 +. if '\\$0'EPIGRAPH_SIZE' .ds $EPI_SIZE_CHANGE \\$1 +. if '\\$0'FOOTNOTE_SIZE' .ds $FN_SIZE_CHANGE \\$1 +. if '\\$0'HDRFTR_CENTER_SIZE' .ds $HDRFTR_CENTER_SIZE_CHANGE \\$1 +. if '\\$0'HDRFTR_LEFT_SIZE' .ds $HDRFTR_LEFT_SIZE_CHANGE \\$1 +. if '\\$0'HDRFTR_RIGHT_SIZE' .ds $HDRFTR_RIGHT_SIZE_CHANGE \\$1 +. if '\\$0'HDRFTR_SIZE' .ds $HDRFTR_SIZE_CHANGE \\$1 +. if '\\$0'HEAD_SIZE' .ds $HEAD_SIZE_CHANGE \\$1 +. if '\\$0'PAGENUM_SIZE' .ds $PAGE_NUM_SIZE_CHANGE \\$1 +. if '\\$0'PARAHEAD_SIZE' .ds $PH_SIZE_CHANGE \\$1 +. if '\\$0'QUOTE_SIZE' .ds $QUOTE_SIZE_CHANGE \\$1 +. if '\\$0'SUBHEAD_SIZE' .ds $SH_SIZE_CHANGE \\$1 +. if '\\$0'SUBTITLE_SIZE' .ds $SUBTITLE_SIZE_CHANGE \\$1 +. if '\\$0'TITLE_SIZE' .ds $TITLE_SIZE_CHANGE \\$1 +. if '\\$0'TOC_HEADER_SIZE' .ds $TOC_HEADER_SIZE_CHANGE \\$1 +. if '\\$0'TOC_HEAD_SIZE' .ds $TOC_HEAD_SIZE_CHANGE \\$1 +. if '\\$0'TOC_PARAHEAD_SIZE' .ds $TOC_PH_SIZE_CHANGE \\$1 +. if '\\$0'TOC_PN_SIZE' .ds $TOC_PN_SIZE_CHANGE \\$1 +. if '\\$0'TOC_SUBHEAD_SIZE' .ds $TOC_SH_SIZE_CHANGE \\$1 +. if '\\$0'TOC_TITLE_SIZE' .ds $TOC_TITLE_SIZE_CHANGE \\$1 +.END +\# +\# +.MAC _COLOR END +. if \\n[#PRINT_STYLE]=1 \{ .return \} +. if '\\$0'ATTRIBUTE_COLOR' \{\ +. nr #ATTRIBUTE_COLOR 1 +. ds $ATTRIBUTE_COLOR \\$1 +. \} +. if '\\$0'AUTHOR_COLOR' \{\ +. nr #AUTHOR_COLOR 1 +. ds $AUTHOR_COLOR \\$1 +. \} +. if '\\$0'BLOCKQUOTE_COLOR' \{\ +. nr #BQUOTE_COLOR 1 +. ds $BQUOTE_COLOR \\$1 +. \} +. if '\\$0'CITATION_COLOR' \{\ +. nr #BQUOTE_COLOR 1 +. ds $BQUOTE_COLOR \\$1 +. \} +. if '\\$0'CITE_COLOR' \{\ +. nr #BQUOTE_COLOR 1 +. ds $BQUOTE_COLOR \\$1 +. \} +. if '\\$0'CHAPTER_TITLE_COLOR' \{\ +. nr #CHAPTER_TITLE_COLOR 1 +. ds $CHAPTER_TITLE_COLOR \\$1 +. \} +. if '\\$0'COVER_ATTRIBUTE_COLOR' \{\ +. nr #COVER_ATTRIBUTE_COLOR 1 +. ds $COVER_ATTRIBUTE_COLOR \\$1 +. \} +. if '\\$0'COVER_AUTHOR_COLOR' \{\ +. nr #COVER_AUTHOR_COLOR 1 +. ds $COVER_AUTHOR_COLOR \\$1 +. \} +. if '\\$0'COVER_CHAPTER_TITLE_COLOR' \{\ +. nr #COVER_CHAPTER_TITLE_COLOR 1 +. ds $COVER_CHAPTER_TITLE_COLOR \\$1 +. \} +. if '\\$0'COVER_COLOR' \{\ +. nr #COVER_COLOR 1 +. ds $COVER_COLOR \\$1 +. \} +. if '\\$0'COVER_COPYRIGHT_COLOR' \{\ +. nr #COVER_COPYRIGHT_COLOR 1 +. ds $COVER_COPYRIGHT_COLOR \\$1 +. \} +. if '\\$0'COVER_MISC_COLOR' \{\ +. nr #COVER_MISC_COLOR 1 +. ds $COVER_MISC_COLOR \\$1 +. \} +. if '\\$0'COVER_TITLE_COLOR' \{\ +. nr #COVER_TITLE_COLOR 1 +. ds $COVER_TITLE_COLOR \\$1 +. \} +. if '\\$0'COVER_SUBTITLE_COLOR' \{\ +. nr #COVER_SUBTITLE_COLOR 1 +. ds $COVER_SUBTITLE_COLOR \\$1 +. \} +. if '\\$0'COVER_DOCTYPE_COLOR' \{\ +. nr #COVER_DOCTYPE_COLOR 1 +. ds $COVER_DOCTYPE_COLOR \\$1 +. \} +. if '\\$0'DOC_COVER_ATTRIBUTE_COLOR' \{\ +. nr #DOC_COVER_ATTRIBUTE_COLOR 1 +. ds $DOC_COVER_ATTRIBUTE_COLOR \\$1 +. \} +. if '\\$0'DOC_COVER_AUTHOR_COLOR' \{\ +. nr #DOC_COVER_AUTHOR_COLOR 1 +. ds $DOC_COVER_AUTHOR_COLOR \\$1 +. \} +. if '\\$0'DOC_COVER_CHAPTER_TITLE_COLOR' \{\ +. nr #DOC_COVER_CHAPTER_TITLE_COLOR 1 +. ds $DOC_COVER_CHAPTER_TITLE_COLOR \\$1 +. \} +. if '\\$0'DOC_COVER_COLOR' \{\ +. nr #DOC_COVER_COLOR 1 +. ds $DOC_COVER_COLOR \\$1 +. \} +. if '\\$0'DOC_COVER_COPYRIGHT_COLOR' \{\ +. nr #DOC_COVER_COPYRIGHT_COLOR 1 +. ds $DOC_COVER_COPYRIGHT_COLOR \\$1 +. \} +. if '\\$0'DOC_COVER_MISC_COLOR' \{\ +. nr #DOC_COVER_MISC_COLOR 1 +. ds $DOC_COVER_MISC_COLOR \\$1 +. \} +. if '\\$0'DOC_COVER_TITLE_COLOR' \{\ +. nr #DOC_COVER_TITLE_COLOR 1 +. ds $DOC_COVER_TITLE_COLOR \\$1 +. \} +. if '\\$0'DOC_COVER_SUBTITLE_COLOR' \{\ +. nr #DOC_COVER_SUBTITLE_COLOR 1 +. ds $DOC_COVER_SUBTITLE_COLOR \\$1 +. \} +. if '\\$0'DOC_COVER_DOCTYPE_COLOR' \{\ +. nr #DOC_COVER_DOCTYPE_COLOR 1 +. ds $DOC_COVER_DOCTYPE_COLOR \\$1 +. \} +. if '\\$0'DOCHEADER_COLOR' \{\ +. nr #DOCHEADER_COLOR 1 +. ds $DOCHEADER_COLOR \\$1 +. \} +. if '\\$0'DOCTYPE_COLOR' \{\ +. nr #DOCTYPE_COLOR 1 +. ds $DOCTYPE_COLOR \\$1 +. \} +. if '\\$0'EPIGRAPH_COLOR' \{\ +. nr #EPI_COLOR 1 +. ds $EPI_COLOR \\$1 +. \} +. if '\\$0'FINIS_COLOR' \{\ +. nr #FINIS_COLOR 1 +. ds $FINIS_COLOR \\$1 +. \} +. if '\\$0'FOOTNOTE_COLOR' \{\ +. nr #FOOTNOTE_COLOR 1 +. ds $FOOTNOTE_COLOR \\$1 +. \} +. if '\\$0'HDRFTR_CENTER_COLOR' \{\ +. nr #HDRFTR_CENTER_COLOR 1 +. ds $HDRFTR_CENTER_COLOR \\$1 +. \} +. if '\\$0'HDRFTR_COLOR' \{\ +. nr #HDRFTR_COLOR 1 +. ds $HDRFTR_COLOR \\$1 +. \} +. if '\\$0'HDRFTR_LEFT_COLOR' \{\ +. nr #HDRFTR_LEFT_COLOR 1 +. ds $HDRFTR_LEFT_COLOR \\$1 +. \} +. if '\\$0'HDRFTR_RIGHT_COLOR' \{\ +. nr #HDRFTR_RIGHT_COLOR 1 +. ds $HDRFTR_RIGHT_COLOR \\$1 +. \} +. if '\\$0'HDRFTR_RULE_COLOR' \{\ +. nr #HDRFTR_RULE_COLOR 1 +. ds $HDRFTR_RULE_COLOR \\$1 +. \} +. if '\\$0'HEAD_COLOR' \{\ +. nr #HEAD_COLOR 1 +. ds $HEAD_COLOR \\$1 +. \} +. if '\\$0'LINEBREAK_COLOR' \{\ +. nr #LINEBREAK_COLOR 1 +. ds $LINEBREAK_COLOR \\$1 +. \} +. if '\\$0'PAGENUM_COLOR' \{\ +. nr #PAGE_NUM_COLOR 1 +. ds $PAGENUM_COLOR \\$1 +. \} +. if '\\$0'PARAHEAD_COLOR' \{\ +. nr #PH_COLOR 1 +. ds $PH_COLOR \\$1 +. \} +. if '\\$0'QUOTE_COLOR' \{\ +. nr #QUOTE_COLOR 1 +. ds $QUOTE_COLOR \\$1 +. \} +. if '\\$0'SUBHEAD_COLOR' \{\ +. nr #SH_COLOR 1 +. ds $SH_COLOR \\$1 +. \} +. if '\\$0'SUBTITLE_COLOR' \{\ +. nr #SUBTITLE_COLOR 1 +. ds $SUBTITLE_COLOR \\$1 +. \} +. if '\\$0'TITLE_COLOR' \{\ +. nr #TITLE_COLOR 1 +. ds $TITLE_COLOR \\$1 +. \} +.END +\# +\# +.MAC _QUAD END +. if '\\$0'BIBLIOGRAPHY_QUAD' \{\ +. ds $BIB_QUAD \\$1 +. if '\\*[$BIB_QUAD]'R' .ab Fatal error: \\$0 must be set to either L or J +. if '\\*[$BIB_QUAD]'C' .ab Fatal error: \\$0 must be set to either L or J +. \} +. if '\\$0'BIBLIOGRAPHY_STRING_QUAD' .ds $BIB_STRING_QUAD \\$1 +. if '\\$0'BLOCKQUOTE_QUAD' .ds $BQUOTE_QUAD \\$1 +. if '\\$0'CITATION_QUAD' .ds $BQUOTE_QUAD \\$1 +. if '\\$0'CITE_QUAD' .ds $BQUOTE_QUAD \\$1 +. if '\\$0'COVER_COPYRIGHT_QUAD' .ds $COVER_COPYRIGHT_QUAD \\$1 +. if '\\$0'COVER_MISC_QUAD' .ds $COVER_MISC_QUAD \\$1 +. if '\\$0'DOC_COVER_COPYRIGHT_QUAD' .ds $DOC_COVER_COPYRIGHT_QUAD \\$1 +. if '\\$0'DOC_COVER_MISC_QUAD' .ds $DOC_COVER_MISC_QUAD \\$1 +. if '\\$0'DOC_QUAD' \{\ +. ds $DOC_QUAD \\$1 +. QUAD \\*[$DOC_QUAD] +. \} +. if '\\$0'ENDNOTE_QUAD' \{\ +. ds $EN_QUAD \\$1 +. if '\\*[$EN_QUAD]'R' .ab Fatal error: \\$0 must be set to either L or J +. if '\\*[$EN_QUAD]'C' .ab Fatal error: \\$0 must be set to either L or J +. \} +. if '\\$0'ENDNOTE_STRING_QUAD' .ds $EN_STRING_QUAD \\$1 +. if '\\$0'ENDNOTE_TITLE_QUAD' .ds $EN_TITLE_QUAD \\$1 +. if '\\$0'EPIGRAPH_QUAD' .ds $EPI_QUAD \\$1 +. if '\\$0'FOOTNOTE_QUAD' .ds $FN_QUAD \\$1 +. if '\\$0'HEAD_QUAD' .ds $HEAD_QUAD \\$1 +. if '\\$0'SUBHEAD_QUAD' .ds $SH_QUAD \\$1 +. if '\\$0'TOC_HEADER_QUAD' .ds $TOC_HEADER_QUAD \\$1 +.END +\# +\# \# DEFAULTS \# -------- \# *Arguments: @@ -3852,7 +4548,7 @@ . \} . \} . if !r#T_MARGIN \{ .T_MARGIN \\n[#HEADER_MARGIN]+\\n[#HEADER_GAP] \} -. if !r#DOCHEADER_ADVANCE \{ .DOCHEADER_ADVANCE \\n[#T_MARGIN] \} +. if !r#DOCHEADER_ADVANCE \{ .nr #DOCHEADER_ADVANCE \\n[#T_MARGIN] \} . if !r#FOOTER_MARGIN \{ .FOOTER_MARGIN 3P \} . if !r#FOOTER_GAP \{ .FOOTER_GAP 3P \} . if !r#B_MARGIN \{ .B_MARGIN \\n[#FOOTER_MARGIN]u+\\n[#FOOTER_GAP]u \} @@ -3861,7 +4557,7 @@ . tm1 " No footers or bottom-of-page page numbers will be printed. . tm1 " Please reset B_MARGIN or FOOTER_MARGIN to allow enough space. . tm1 " If no footers or bottom-of-page page numbers are required, -. tm1 " place .FOOTER_MARGIN 0 before .START +. tm1 " type in .FOOTER_MARGIN 0 before .START . \} . if !r#HDRFTR_RULE_GAP \{\ . if \\n[#HEADERS_ON] \{ .HDRFTR_RULE_GAP 4p \} @@ -3869,26 +4565,35 @@ . \} . if !r#HDRFTR_RULE \{ .HDRFTR_RULE \} . if !r#PAGE_NUM_SET \{ .PAGENUMBER 1 \} -. ie r#ADJ_DOC_LEAD \{ . \} -. el \{ .DOC_LEAD_ADJUST \} -\# Read in number registers and strings for type parameters +.\" Read in number registers and strings for type parameters . nr #DOC_L_MARGIN \\n[#L_MARGIN] . nr #DOC_L_LENGTH \\n[#L_LENGTH] . nr #DOC_R_MARGIN \\n[#PAGE_WIDTH]-(\\n[#DOC_L_MARGIN]+\\n[#L_LENGTH]) . ds $DOC_FAM \\*[$FAMILY] . nr #DOC_PT_SIZE \\n[#PT_SIZE] . nr #DOC_LEAD \\n[#LEAD] +.\" #SAVED_DOC_LEAD is set in COLLATE +. if r#SAVED_DOC_LEAD \{\ +. if !\\n[#DOC_LEAD]=\\n[#SAVED_DOC_LEAD] \{ .nr #RERUN_TRAPS 1 \} +. \} +. ie \\n[#ADJ_DOC_LEAD]=1 \{ . \} +. el \{\ +. if !\\n[#DOC_LEAD_ADJUST_OFF] \{\ +. DOC_LEAD_ADJUST +. \} +. \} . ds $DOC_QUAD \\*[$QUAD_VALUE] . ds $PP_FT \\*[$FONT] -\# Counters +.\" Counters . nr #PP 0 . nr #FN_NUMBER 0 1 . nr #EN_NUMBER 0 1 . nr #FN_COUNT_FOR_COLS 0 1 +. nr #DONE_ONCE 0 1 . RESET_HEAD_NUMBER . RESET_SUBHEAD_NUMBER . RESET_PARAHEAD_NUMBER -\# General style defaults for both PRINTSTYLEs +.\" General style defaults for both PRINTSTYLEs . nr #PP_STYLE 1 . PARA_INDENT \\n[#PP_INDENT]u . if !d$HDRFTR_FAM \{ .HDRFTR_FAMILY \\*[$DOC_FAM] \} @@ -3910,21 +4615,22 @@ . if \\n[#HDRFTR_RIGHT_CAPS]=0 \{\ . if !d$HDRFTR_RIGHT_SIZE_CHANGE \{ .HDRFTR_RIGHT_SIZE +0 \} . \} -. if !d$FN_FAM \{ .FOOTNOTE_FAMILY \\*[$DOC_FAM] \} -. if !d$FN_FT \{ .FOOTNOTE_FONT R \} -. if !d$FN_QUAD \{ .FOOTNOTE_QUAD \\*[$DOC_QUAD] \} -. if !r#FN_RULE \{ .FOOTNOTE_RULE \} -. if !r#FN_MARKERS \{ .FOOTNOTE_MARKERS \} -. if !r#FN_MARKER_STYLE \{ .FOOTNOTE_MARKER_STYLE STAR \} -. if !d$EN_PN_STYLE \{ .ENDNOTES_PAGENUM_STYLE digit \} -. if !d$EN_FAM \{ .ENDNOTE_FAMILY \\*[$DOC_FAM] \} -. if !d$EN_FN \{ .ENDNOTE_FONT R \} -. if !d$EN_QUAD \{ .ENDNOTE_QUAD \\*[$DOC_QUAD] \} -. if !d$EN_STRING \{ .ENDNOTE_STRING "Endnotes" \} -. if !d$EN_STRING_FAM \{ .ENDNOTE_STRING_FAMILY \\*[$EN_FAM] \} -. if !d$EN_STRING_QUAD \{ .ENDNOTE_STRING_QUAD CENTER \} -. if !r#EN_STRING_UNDERSCORE \{ .ENDNOTE_STRING_UNDERSCORE 2 \} -. if !r#EN_STRING_CAPS \{ .ENDNOTE_STRING_CAPS \} +. if !d$FN_FAM \{ .FOOTNOTE_FAMILY \\*[$DOC_FAM] \} +. if !d$FN_FT \{ .FOOTNOTE_FONT R \} +. if !d$FN_QUAD \{ .FOOTNOTE_QUAD \\*[$DOC_QUAD] \} +. if !r#FN_RULE \{ .FOOTNOTE_RULE \} +. if !r#FN_MARKERS \{ .FOOTNOTE_MARKERS \} +. if !\\n[#FN_MARKER_STYLE] \{ .FOOTNOTE_MARKER_STYLE STAR \} +. if !\\n[#EN_MARKER_STYLE] \{ .ENDNOTE_MARKER_STYLE NUMBER \} +. if !d$EN_PN_STYLE \{ .ENDNOTES_PAGENUM_STYLE digit \} +. if !d$EN_FAM \{ .ENDNOTE_FAMILY \\*[$DOC_FAM] \} +. if !d$EN_FT \{ .ENDNOTE_FONT R \} +. if !d$EN_QUAD \{ .ENDNOTE_QUAD \\*[$DOC_QUAD] \} +. if !d$EN_STRING \{ .ENDNOTE_STRING "Endnotes" \} +. if !d$EN_STRING_FAM \{ .ENDNOTE_STRING_FAMILY \\*[$EN_FAM] \} +. if !d$EN_STRING_QUAD \{ .ENDNOTE_STRING_QUAD CENTER \} +. if !r#EN_STRING_UNDERSCORE \{ .ENDNOTE_STRING_UNDERSCORE 2 \} +. if !r#EN_STRING_CAPS \{ .ENDNOTE_STRING_CAPS \} . if !d$EN_TITLE \{\ . ie \\n[#DOC_TYPE]=2 \{\ . ie '\\*[$CHAPTER]'' \{ .ENDNOTE_TITLE "\\*[$CHAPTER_STRING]" \} @@ -3936,61 +4642,86 @@ . if !d$EN_TITLE_QUAD \{ .ENDNOTE_TITLE_QUAD LEFT \} . if !r#EN_TITLE_UNDERSCORE \{ .ENDNOTE_TITLE_UNDERSCORE \} . if !d$EN_NUMBER_FAM \{ .ENDNOTE_NUMBER_FAMILY \\*[$EN_FAM] \} -. if !r#EN_NUMBERS_ALIGN_LEFT \{\ +. if !r#EN_NUMBERS_ALIGN_LEFT \{\ . if !r#EN_NUMBERS_ALIGN_RIGHT \{ .ENDNOTE_NUMBERS_ALIGN_RIGHT 2 \} . \} -. if !d$TOC_HEADER_STRING \{ .TOC_HEADER_STRING "Contents" \} -. if !d$TOC_HEADER_QUAD \{ .TOC_HEADER_QUAD LEFT \} -. if !d$TOC_PN_STYLE \{ .TOC_PAGENUM_STYLE roman \} -. if !r#TOC_PN_PADDING \{ .TOC_PADDING 3 \} -. if !r#TOC_TITLE_INDENT \{ .TOC_TITLE_INDENT 0 \} -. if !r#TOC_HEAD_INDENT \{ .TOC_HEAD_INDENT 18p \} -. if !r#TOC_SH_INDENT \{ .TOC_SUBHEAD_INDENT 30p \} -. if !r#TOC_PH_INDENT \{ .TOC_PARAHEAD_INDENT 42p \} -\# String defaults for both PRINTSTYLEs +. if !d$EN_LN_GAP \{ .ENDNOTE_LINENUMBER_GAP 1.5n \} +. if !d$BIB_PN_STYLE \{ .BIBLIOGRAPHY_PAGENUM_STYLE digit \} +. if !d$BIB_FAM \{ .BIBLIOGRAPHY_FAMILY \\*[$DOC_FAM] \} +. if !d$BIB_FT \{ .BIBLIOGRAPHY_FONT R \} +. if !d$BIB_QUAD \{ .BIBLIOGRAPHY_QUAD \\*[$DOC_QUAD] \} +. if !d$BIB_STRING \{ .BIBLIOGRAPHY_STRING "Bibliography" \} +. if !d$BIB_STRING_FAM \{ .BIBLIOGRAPHY_STRING_FAMILY \\*[$BIB_FAM] \} +. if !d$BIB_STRING_QUAD \{ .BIBLIOGRAPHY_STRING_QUAD CENTER \} +. if !r#BIB_STRING_UNDERSCORE \{ .BIBLIOGRAPHY_STRING_UNDERSCORE 2 \} +. if !r#BIB_STRING_CAPS \{ .BIBLIOGRAPHY_STRING_CAPS \} +. if !d$TOC_HEADER_STRING \{ .TOC_HEADER_STRING "Contents" \} +. if !d$TOC_HEADER_QUAD \{ .TOC_HEADER_QUAD LEFT \} +. if !d$TOC_PN_STYLE \{ .TOC_PAGENUM_STYLE roman \} +. if !r#TOC_PN_PADDING \{ .TOC_PADDING 3 \} +. if !r#TOC_TITLE_INDENT \{ .TOC_TITLE_INDENT 0 \} +. if !r#TOC_HEAD_INDENT \{ .TOC_HEAD_INDENT 18p \} +. if !r#TOC_SH_INDENT \{ .TOC_SUBHEAD_INDENT 30p \} +. if !r#TOC_PH_INDENT \{ .TOC_PARAHEAD_INDENT 42p \} +.\" String defaults for both PRINTSTYLEs . ie \\n[#DOC_TYPE]=1 \{\ . ie '\\*[$DOC_TITLE]'' \{\ -. if \\n[#USER_DEF_HDRFTR_LEFT]=0 \{ .ds $HDRFTR_LEFT \\*[$AUTHOR_1] \} +. if \\n[#USER_DEF_HDRFTR_LEFT]=0 .ds $HDRFTR_LEFT \\*[$AUTHOR_1] . rr #USER_DEF_HDRFTR_LEFT -. if \\n[#USER_DEF_HDRFTR_RIGHT]=0 \{ .ds $HDRFTR_RIGHT \\*[$TITLE] \} +. if \\n[#USER_DEF_HDRFTR_RIGHT]=0 .ds $HDRFTR_RIGHT \\*[$TITLE] . rr #USER_DEF_HDRFTR_RIGHT . \} . el \{\ . if \\n[#COPY_STYLE]=1 \{ .DRAFT_WITH_PAGENUMBER \} -. if \\n[#USER_DEF_HDRFTR_LEFT]=0 \{ .ds $HDRFTR_LEFT \\*[$AUTHOR_1] \} +. if \\n[#USER_DEF_HDRFTR_LEFT]=0 .ds $HDRFTR_LEFT \\*[$AUTHOR_1] . rr #USER_DEF_HDRFTR_LEFT -. if \\n[#USER_DEF_HDRFTR_CENTER]=0 \{ .ds $HDRFTR_CENTER \\*[$TITLE] \} +. if \\n[#USER_DEF_HDRFTR_CENTER]=0 .ds $HDRFTR_CENTER \\*[$TITLE] . rr #USER_DEF_HDRFTR_CENTER -. if \\n[#USER_DEF_HDRFTR_RIGHT]=0 \{ .ds $HDRFTR_RIGHT \\*[$DOC_TITLE] \} +. if \\n[#USER_DEF_HDRFTR_RIGHT]=0 .ds $HDRFTR_RIGHT \\*[$DOC_TITLE] . rr #USER_DEF_HDRFTR_RIGHT . \} . \} . el \{\ -. if \\n[#USER_DEF_HDRFTR_LEFT]=0 \{ .ds $HDRFTR_LEFT \\*[$AUTHOR_1] \} +. if \\n[#USER_DEF_HDRFTR_LEFT]=0 .ds $HDRFTR_LEFT \\*[$AUTHOR_1] . rr #USER_DEF_HDRFTR_LEFT -. if \\n[#USER_DEF_HDRFTR_RIGHT]=0 \{ .ds $HDRFTR_RIGHT \\*[$TITLE] \} +. if \\n[#USER_DEF_HDRFTR_RIGHT]=0 .ds $HDRFTR_RIGHT \\*[$TITLE] . rr #USER_DEF_HDRFTR_RIGHT . \} -. if !d$ATTRIBUTE_STRING \{ .ATTRIBUTE_STRING "by" \} -. if !d$FINIS_STRING \{ .FINIS_STRING "END" \} -\# Defaults for printstyle TYPEWRITE +. if !d$ATTRIBUTE_STRING \{ .ATTRIBUTE_STRING "by" \} +. if !d$FINIS_STRING \{ .FINIS_STRING "END" \} +.\" Covers +. if !r#DOC_COVERS_OFF \{ .nr #DOC_COVERS 1 \} +. if !r#COVERS_OFF \{ .nr #COVERS 1 \} +. if !d$COVER_COPYRIGHT_QUAD \{ .COVER_COPYRIGHT_QUAD R \} +. if !d$COVER_MISC_QUAD \{ .COVER_MISC_QUAD L \} +. if !d$DOC_COVER_COPYRIGHT_QUAD \{ .DOC_COVER_COPYRIGHT_QUAD R \} +. if !d$DOC_COVER_MISC_QUAD \{ .DOC_COVER_MISC_QUAD L \} +.\" Defaults for printstyle TYPEWRITE . if \\n[#PRINT_STYLE]=1 \{\ . if \\n[#UNDERLINE_QUOTES]=1 \{ .UNDERLINE_QUOTES \} . if \\n[#UNDERLINE_QUOTES]=0 \{ .UNDERLINE_QUOTES OFF \} +.\" +Quotes and blockquotes . if !r#Q_OFFSET_VALUE \{ .QUOTE_INDENT 2 \} +.\" +Epigraphs . if !r#EPI_OFFSET_VALUE \{ .EPIGRAPH_INDENT 2 \} +.\" +Linebreaks . if !d$LINEBREAK_CHAR \{ .LINEBREAK_CHAR * 3 2p \} +.\" +Footnotes . if !d$FN_SIZE_CHANGE \{ .FOOTNOTE_SIZE +0 \} . if !r#FN_RULE_LENGTH \{ .FOOTNOTE_RULE_LENGTH 2i \} +.\" +Paragraph heads +. if !r#PH_INDENT \{ .PARAHEAD_INDENT \\n[#PP_INDENT]u/2u \} +.\" +Endnotes +. if !r#EN_PP_INDENT \{ .ENDNOTE_PARA_INDENT \\n[#PP_INDENT] \} +.\" +Footnotes . if !r#FN_RULE_ADJ \{ .FOOTNOTE_RULE_ADJ 6p \} +.\" +Slant stuff . if !r#SLANT_MEANS_SLANT \{\ . ie \\n[#UNDERLINE_SLANT]=1 \{ .UNDERLINE_SLANT \} . el \{ .UNDERLINE_SLANT OFF \} . \} -. if !r#PH_INDENT \{ .PARAHEAD_INDENT \\n[#PP_INDENT]u/2u \} -. if !r#EN_PP_INDENT \{ .ENDNOTE_PARA_INDENT \\n[#PP_INDENT] \} . \} -\# Defaults for printstyle TYPESET +.\" Defaults for printstyle TYPESET . if \\n[#PRINT_STYLE]=2 \{\ . if !d$DOCHEADER_LEAD_ADJ \{\ . ie !'\\*[$CHAPTER_TITLE]'' \{\ @@ -4001,26 +4732,134 @@ . \} . el \{ .DOCHEADER_LEAD +0 \} . \} -. if !d$TITLE_FAM \{ .TITLE_FAMILY \\*[$DOC_FAM] \} -. if !d$TITLE_FT \{ .TITLE_FONT B \} +.\" +Cover +. if !d$COVER_LEAD_ADJ \{ .COVER_LEAD +0 \} +. if !d$COVER_FAM \{ .COVER_FAMILY \\*[$DOC_FAM] \} +.\" (title) +. if !d$COVER_TITLE_FAM \{\ +. ie !d$COVER_FAM \{ .COVER_TITLE_FAMILY \\*[$DOC_FAM] \} +. el \{ .COVER_TITLE_FAMILY \\*[$COVER_FAM] \} +. \} +. if !d$COVER_TITLE_FT \{ .COVER_TITLE_FONT B \} +. if !d$COVER_TITLE_SIZE_CHANGE \{ .COVER_TITLE_SIZE +3.5 \} +.\" (chapter title) +. if !d$COVER_CHAPTER_TITLE_FAM \{\ +. ie !d$COVER_FAM \{ .COVER_CHAPTER_TITLE_FAMILY \\*[$DOC_FAM] \} +. el \{ .COVER_CHAPTER_TITLE_FAMILY \\*[$COVER_FAM] \} +. \} +. if !d$COVER_CHAPTER_TITLE_FT \{ .COVER_CHAPTER_TITLE_FONT BI \} +. if !d$COVER_CHAPTER_TITLE_SIZE_CHANGE \{ .COVER_CHAPTER_TITLE_SIZE +4 \} +.\" (subtitle) +. if !d$COVER_SUBTITLE_FAM \{\ +. ie !d$COVER_FAM \{ .COVER_SUBTITLE_FAMILY \\*[$DOC_FAM] \} +. el \{ .COVER_SUBTITLE_FAMILY \\*[$COVER_FAM] \} +. \} +. if !d$COVER_SUBTITLE_FT \{ .COVER_SUBTITLE_FONT R \} +. if !d$COVER_SUBTITLE_SIZE_CHANGE \{ .COVER_SUBTITLE_SIZE +0 \} +.\" (attribution and author[s]) +. if !d$COVER_AUTHOR_FAM \{\ +. ie !d$COVER_FAM \{ .COVER_AUTHOR_FAMILY \\*[$DOC_FAM] \} +. el \{ .COVER_AUTHOR_FAMILY \\*[$COVER_FAM] \} +. \} +. if !d$COVER_AUTHOR_FT \{ .COVER_AUTHOR_FONT I \} +. if !d$COVER_AUTHOR_SIZE_CHANGE \{ .COVER_AUTHOR_SIZE +0 \} +.\" (doctype if "named") +. if !d$COVER_DOCTYPE_FAM \{\ +. ie !d$COVER_FAM \{ .COVER_DOCTYPE_FAMILY \\*[$DOC_FAM] \} +. el \{ .COVER_DOCTYPE_FAMILY \\*[$COVER_FAM] \} +. \} +. if !d$COVER_DOCTYPE_FT \{ .COVER_DOCTYPE_FONT BI \} +. if !d$COVER_DOCTYPE_SIZE_CHANGE \{ .COVER_DOCTYPE_SIZE +3 \} +.\" (copyright) +. if !d$COVER_COPYRIGHT_FAM \{\ +. ie !d$COVER_FAM \{ .COVER_COPYRIGHT_FAMILY \\*[$DOC_FAM] \} +. el \{ .COVER_COPYRIGHT_FAMILY \\*[$COVER_FAM] \} +. \} +. if !d$COVER_COPYRIGHT_FT \{ .COVER_COPYRIGHT_FONT R \} +. if !d$COVER_COPYRIGHT_SIZE_CHANGE \{ .COVER_COPYRIGHT_SIZE -2 \} +.\" +Doc cover +. if !d$DOC_COVER_LEAD_ADJ \{ .DOC_COVER_LEAD +0 \} +. if !d$DOC_COVER_FAM \{ .DOC_COVER_FAMILY \\*[$DOC_FAM] \} +.\" (title) +. if !d$DOC_COVER_TITLE_FAM \{\ +. ie !d$DOC_COVER_FAM \{ .DOC_COVER_TITLE_FAMILY \\*[$DOC_FAM] \} +. el \{ .DOC_COVER_TITLE_FAMILY \\*[$DOC_COVER_FAM] \} +. \} +. if !d$DOC_COVER_TITLE_FT \{ .DOC_COVER_TITLE_FONT B \} +. if !d$DOC_COVER_TITLE_SIZE_CHANGE \{ .DOC_COVER_TITLE_SIZE +3.5 \} +.\" (chapter title) +. if !d$DOC_COVER_CHAPTER_TITLE_FAM \{\ +. ie !d$DOC_COVER_FAM \{ .DOC_COVER_CHAPTER_TITLE_FAMILY \\*[$DOC_FAM] \} +. el \{ .DOC_COVER_CHAPTER_TITLE_FAMILY \\*[$DOC_COVER_FAM] \} +. \} +. if !d$DOC_COVER_CHAPTER_TITLE_FT \{ .DOC_COVER_CHAPTER_TITLE_FONT BI \} +. if !d$DOC_COVER_CHAPTER_TITLE_SIZE_CHANGE \{ .DOC_COVER_CHAPTER_TITLE_SIZE +4 \} +.\" (subtitle) +. if !d$DOC_COVER_SUBTITLE_FAM \{\ +. ie !d$DOC_COVER_FAM \{ .DOC_COVER_SUBTITLE_FAMILY \\*[$DOC_FAM] \} +. el \{ .DOC_COVER_SUBTITLE_FAMILY \\*[$DOC_COVER_FAM] \} +. \} +. if !d$DOC_COVER_SUBTITLE_FT \{ .DOC_COVER_SUBTITLE_FONT R \} +. if !d$DOC_COVER_SUBTITLE_SIZE_CHANGE \{ .DOC_COVER_SUBTITLE_SIZE +0 \} +.\" (attribution and author[s]) +. if !d$DOC_COVER_AUTHOR_FAM \{\ +. ie !d$DOC_COVER_FAM \{ .DOC_COVER_AUTHOR_FAMILY \\*[$DOC_FAM] \} +. el \{ .DOC_COVER_AUTHOR_FAMILY \\*[$DOC_COVER_FAM] \} +. \} +. if !d$DOC_COVER_AUTHOR_FT \{ .DOC_COVER_AUTHOR_FONT I \} +. if !d$DOC_COVER_AUTHOR_SIZE_CHANGE \{ .DOC_COVER_AUTHOR_SIZE +0 \} +.\" (doctype if "named") +. if !d$DOC_COVER_DOCTYPE_FAM \{\ +. ie !d$DOC_COVER_FAM \{ .DOC_COVER_DOCTYPE_FAMILY \\*[$DOC_FAM] \} +. el \{ .DOC_COVER_DOCTYPE_FAMILY \\*[$DOC_COVER_FAM] \} +. \} +. if !d$DOC_COVER_DOCTYPE_FT \{ .DOC_COVER_DOCTYPE_FONT BI \} +. if !d$DOC_COVER_DOCTYPE_SIZE_CHANGE \{ .DOC_COVER_DOCTYPE_SIZE +3 \} +.\" (copyright) +. if !d$DOC_COVER_COPYRIGHT_FAM \{\ +. ie !d$DOC_COVER_FAM \{ .DOC_COVER_COPYRIGHT_FAMILY \\*[$DOC_FAM] \} +. el \{ .DOC_COVER_COPYRIGHT_FAMILY \\*[$DOC_COVER_FAM] \} +. \} +. if !d$DOC_COVER_COPYRIGHT_FT \{ .DOC_COVER_COPYRIGHT_FONT R \} +. if !d$DOC_COVER_COPYRIGHT_SIZE_CHANGE \{ .DOC_COVER_COPYRIGHT_SIZE -2 \} +.\" +Docheader +. if !d$DOCHEADER_FAM \{ .DOCHEADER_FAMILY \\*[$DOC_FAM] \} +. if !d$TITLE_FAM \{\ +. ie !d$DOCHEADER_FAM \{ .TITLE_FAMILY \\*[$DOC_FAM] \} +. el \{ .TITLE_FAMILY \\*[$DOCHEADER_FAM] \} +. \} +. if !d$TITLE_FT \{ .TITLE_FONT B \} . if !d$TITLE_SIZE_CHANGE \{\ . ie \\n[#DOC_TYPE]=2 \{ .TITLE_SIZE +4 \} . el \{ .TITLE_SIZE +3.5 \} . \} -. if !d$CHAPTER_TITLE_FAM \{ .CHAPTER_TITLE_FAMILY \\*[$DOC_FAM] \} -. if !d$CHAPTER_TITLE_FT \{ .CHAPTER_TITLE_FONT BI \} -. if !d$CHAPTER_TITLE_SIZE_CHANGE \{ .CHAPTER_TITLE_SIZE +4 \} -. if !d$SUBTITLE_FAM \{ .SUBTITLE_FAMILY \\*[$DOC_FAM] \} -. if !d$SUBTITLE_FT \{ .SUBTITLE_FONT R \} -. if !d$SUBTITLE_SIZE_CHANGE \{ .SUBTITLE_SIZE +0 \} -. if !d$AUTHOR_FAM \{ .AUTHOR_FAMILY \\*[$DOC_FAM] \} -. if !d$AUTHOR_FT \{ .AUTHOR_FONT I \} -. if !d$AUTHOR_SIZE_CHANGE \{ .AUTHOR_SIZE +0 \} -. if !d$DOCTYPE_FAM \{ .DOCTYPE_FAMILY \\*[$DOC_FAM] \} -. if !d$DOCTYPE_FT \{ .DOCTYPE_FONT BI \} -. if !d$DOCTYPE_SIZE_CHANGE \{ .DOCTYPE_SIZE +3 \} +. if !d$CHAPTER_TITLE_FAM \{\ +. ie !d$DOCHEADER_FAM \{ .CHAPTER_TITLE_FAMILY \\*[$DOC_FAM] \} +. el \{ .CHAPTER_TITLE_FAMILY \\*[$DOCHEADER_FAM] \} +. \} +. if !d$CHAPTER_TITLE_FT \{ .CHAPTER_TITLE_FONT BI \} +. if !d$CHAPTER_TITLE_SIZE_CHANGE \{ .CHAPTER_TITLE_SIZE +4 \} +. if !d$SUBTITLE_FAM \{\ +. ie !d$DOCHEADER_FAM \{ .SUBTITLE_FAMILY \\*[$DOC_FAM] \} +. el \{ .SUBTITLE_FAMILY \\*[$DOCHEADER_FAM] \} +. \} +. if !d$SUBTITLE_FT \{ .SUBTITLE_FONT R \} +. if !d$SUBTITLE_SIZE_CHANGE \{ .SUBTITLE_SIZE +0 \} +. if !d$AUTHOR_FAM \{\ +. ie !d$DOCHEADER_FAM \{ .AUTHOR_FAMILY \\*[$DOC_FAM] \} +. el \{ .AUTHOR_FAMILY \\*[$DOCHEADER_FAM] \} +. \} +. if !d$AUTHOR_FT \{ .AUTHOR_FONT I \} +. if !d$AUTHOR_SIZE_CHANGE \{ .AUTHOR_SIZE +0 \} +. if !d$DOCTYPE_FAM \{\ +. ie !d$DOCHEADER_FAM \{ .DOCTYPE_FAMILY \\*[$DOC_FAM] \} +. el \{ .DOCTYPE_FAMILY \\*[$DOCHEADER_FAM] \} +. \} +. if !d$DOCTYPE_FT \{ .DOCTYPE_FONT BI \} +. if !d$DOCTYPE_SIZE_CHANGE \{ .DOCTYPE_SIZE +3 \} +.\" +Headers and footers . if !d$HDRFTR_LEFT_FAM \{ .HDRFTR_LEFT_FAMILY \\*[$DOC_FAM] \} -. if !d$HDRFTR_LEFT_FT \{ .HDRFTR_LEFT_FONT R \} +. if !d$HDRFTR_LEFT_FT \{ .HDRFTR_LEFT_FONT R \} . if \\n[#HDRFTR_LEFT_CAPS] \{\ . if !d$HDRFTR_LEFT_SIZE_CHANGE \{ .HDRFTR_LEFT_SIZE -2 \} . \} @@ -4030,101 +4869,171 @@ . if \\n[#HDRFTR_CENTER_CAPS] \{\ . if !d$HDRFTR_CENTER_SIZE_CHANGE \{ .HDRFTR_CENTER_SIZE -2 \} . \} -. if !d$HDRFTR_CENTER_SIZE_CHANGE \{ .HDRFTR_CENTER_SIZE -.5 \} -. if !d$HDRFTR_RIGHT_FAM \{ .HDRFTR_RIGHT_FAMILY \\*[$DOC_FAM] \} -. if !d$HDRFTR_RIGHT_FT \{ .HDRFTR_RIGHT_FONT R \} +. if !d$HDRFTR_CENTER_SIZE_CHANGE \{ .HDRFTR_CENTER_SIZE -.5 \} +. if !d$HDRFTR_RIGHT_FAM \{ .HDRFTR_RIGHT_FAMILY \\*[$DOC_FAM] \} +. if !d$HDRFTR_RIGHT_FT \{ .HDRFTR_RIGHT_FONT R \} . if \\n[#HDRFTR_RIGHT_CAPS] \{\ . if !d$HDRFTR_RIGHT_SIZE_CHANGE \{ .HDRFTR_RIGHT_SIZE -2 \} . \} . if !d$HDRFTR_RIGHT_SIZE_CHANGE \{ .HDRFTR_RIGHT_SIZE -.5 \} +.\" +Heads . if !d$HEAD_FAM \{ .HEAD_FAMILY \\*[$DOC_FAM] \} . if !d$HEAD_FT \{ .HEAD_FONT B \} . if !d$HEAD_SIZE_CHANGE \{ .HEAD_SIZE +1 \} . if !r#HEAD_SPACE \{ .HEAD_SPACE \} +.\" +Subheads . if !d$SH_FAM \{ .SUBHEAD_FAMILY \\*[$DOC_FAM] \} . if !d$SH_FT \{ .SUBHEAD_FONT B \} . if !d$SH_SIZE_CHANGE \{ .SUBHEAD_SIZE +.5 \} +.\" +Paragraph heads . if !d$PH_FAM \{ .PARAHEAD_FAMILY \\*[$DOC_FAM] \} . if !d$PH_FT \{ .PARAHEAD_FONT BI \} . if !d$PH_SIZE_CHANGE \{ .PARAHEAD_SIZE -.25 \} . if !r#PH_INDENT \{ .PARAHEAD_INDENT \\n[#PP_INDENT]u/2u \} +.\" +Quotes . if !d$QUOTE_FAM \{ .QUOTE_FAMILY \\*[$DOC_FAM] \} . if !d$QUOTE_FT \{ .QUOTE_FONT I \} . if !d$QUOTE_SIZE_CHANGE \{ .QUOTE_SIZE +0 \} . if !r#Q_OFFSET_VALUE \{ .QUOTE_INDENT 3 \} +.\" +Blockquotes +.\" Note: the leading for quotes and blockquotes is set after .DEFAULTS in START . if !d$BQUOTE_FAM \{ .BLOCKQUOTE_FAMILY \\*[$DOC_FAM] \} . if !d$BQUOTE_FT \{ .BLOCKQUOTE_FONT R \} . if !d$BQUOTE_SIZE_CHANGE \{ .BLOCKQUOTE_SIZE -1 \} . if !d$BQUOTE_QUAD \{ .BLOCKQUOTE_QUAD LEFT \} +.\" +Epigraphs . if !d$EPI_FAM \{ .EPIGRAPH_FAMILY \\*[$DOC_FAM] \} . if !d$EPI_FT \{ .EPIGRAPH_FONT R \} . if !d$EPI_SIZE_CHANGE \{ .EPIGRAPH_SIZE -1.5 \} . if !r#EPI_AUTOLEAD \{ .EPIGRAPH_AUTOLEAD 2 \} . if !d$EPI_QUAD \{ .EPIGRAPH_QUAD \\*[$DOC_QUAD] \} . if !r#EPI_OFFSET_VALUE \{ .EPIGRAPH_INDENT 3 \} +.\" +Linebreaks . if !d$LINEBREAK_CHAR \{ .LINEBREAK_CHAR * 3 3p \} +.\" +Footnotes . if !r#FN_RULE_LENGTH \{ .FOOTNOTE_RULE_LENGTH 4P \} . if !r#FN_RULE_ADJ \{ .FOOTNOTE_RULE_ADJ 3p \} . if !d$FN_SIZE_CHANGE \{ .FOOTNOTE_SIZE -2 \} . if !r#FN_AUTOLEAD \{ .FOOTNOTE_AUTOLEAD 2 \} +.\" +Endnotes . if !r#EN_PS \{ .ENDNOTE_PT_SIZE \\n[#DOC_PT_SIZE]u \} -. if !d$EN_LEAD \{ .ENDNOTE_LEAD 14 ADJUST \} . if !d$EN_STRING_FT \{ .ENDNOTE_STRING_FONT B \} . if !d$EN_STRING_SIZE_CHANGE \{ .ENDNOTE_STRING_SIZE +1 \} . if !d$EN_TITLE_FT \{ .ENDNOTE_TITLE_FONT B \} . if !d$EN_TITLE_SIZE_CHANGE \{ .ENDNOTE_TITLE_SIZE +0 \} . if !d$EN_NUMBER_FT \{ .ENDNOTE_NUMBER_FONT B \} -. if !d$EN_NUMBER_SIZE_CHANGE \{ .ENDNOTE_NUMBER_SIZE +0 \} +. if !d$EN_NUMBER_SIZE_CHANGE \{ .ENDNOTE_NUMBER_SIZE +0 \} . if !r#EN_PP_INDENT \{ .ENDNOTE_PARA_INDENT 1.5m \} +.\" +Bibliography +. if !r#BIB_LIST \{ .BIBLIOGRAPHY_TYPE LIST . \} +. if !r#BIB_PS \{ .BIBLIOGRAPHY_PT_SIZE \\n[#DOC_PT_SIZE]u \} +. if !d$BIB_STRING_FT \{ .BIBLIOGRAPHY_STRING_FONT B \} +. if !d$BIB_STRING_SIZE_CHANGE \{ .BIBLIOGRAPHY_STRING_SIZE +1 \} +.\" +Table of contents . if !d$TOC_FAM \{ .TOC_FAMILY \\*[$DOC_FAM] \} . if !r#TOC_PS \{ .TOC_PT_SIZE \\n[#DOC_PT_SIZE]u \} . if !r#TOC_LEAD \{ .TOC_LEAD \\n[#DOC_LEAD]u ADJUST \} . if !d$TOC_HEADER_FAM \{ .TOC_HEADER_FAMILY \\*[$TOC_FAM] \} -. if !d$TOC_HEADER_SIZE_CHANGE \{ .TOC_HEADER_SIZE +4 \} -. if !d$TOC_HEADER_FT \{ .TOC_HEADER_FONT B \} +. if !d$TOC_HEADER_SIZE_CHANGE \{ .TOC_HEADER_SIZE +4 \} +. if !d$TOC_HEADER_FT \{ .TOC_HEADER_FONT B \} . if !d$TOC_TITLE_FAM \{ .TOC_TITLE_FAMILY \\*[$TOC_FAM] \} -. if !d$TOC_PN_FAM \{ .TOC_PN_FAMILY \\*[$TOC_FAM] \} -. if !d$TOC_HEAD_FAM \{ .TOC_HEAD_FAMILY \\*[$TOC_FAM] \} -. if !d$TOC_SH_FAM \{ .TOC_SUBHEAD_FAMILY \\*[$TOC_FAM] \} +. if !d$TOC_PN_FAM \{ .TOC_PN_FAMILY \\*[$TOC_FAM] \} +. if !d$TOC_HEAD_FAM \{ .TOC_HEAD_FAMILY \\*[$TOC_FAM] \} +. if !d$TOC_SH_FAM \{ .TOC_SUBHEAD_FAMILY \\*[$TOC_FAM] \} . if !d$TOC_PH_FAM \{ .TOC_PARAHEAD_FAMILY \\*[$TOC_FAM] \} -. if !d$TOC_TITLE_FT \{ .TOC_TITLE_FONT BI \} -. if !d$TOC_PN_FT \{ .TOC_PN_FONT R \} -. if !d$TOC_HEAD_FT \{ .TOC_HEAD_FONT B \} -. if !d$TOC_SH_FT \{ .TOC_SUBHEAD_FONT R \} -. if !d$TOC_PH_FT \{ .TOC_PARAHEAD_FONT I \} -. if !d$TOC_TITLE_SIZE_CHANGE \{ .TOC_TITLE_SIZE +.5 \} -. if !d$TOC_PN_SIZE_CHANGE \{ .TOC_PN_SIZE +0 \} -. if !d$TOC_HEAD_SIZE_CHANGE \{ .TOC_HEAD_SIZE +.5 \} +. if !d$TOC_TITLE_FT \{ .TOC_TITLE_FONT BI \} +. if !d$TOC_PN_FT \{ .TOC_PN_FONT R \} +. if !d$TOC_HEAD_FT \{ .TOC_HEAD_FONT B \} +. if !d$TOC_SH_FT \{ .TOC_SUBHEAD_FONT R \} +. if !d$TOC_PH_FT \{ .TOC_PARAHEAD_FONT I \} +. if !d$TOC_TITLE_SIZE_CHANGE \{ .TOC_TITLE_SIZE +.5 \} +. if !d$TOC_PN_SIZE_CHANGE \{ .TOC_PN_SIZE +0 \} +. if !d$TOC_HEAD_SIZE_CHANGE \{ .TOC_HEAD_SIZE +.5 \} . if !d$TOC_SH_SIZE_CHANGE \{ .TOC_SUBHEAD_SIZE +0 \} -. if !d$TOC_PH_SIZE_CHANGE \{ .TOC_PARAHEAD_SIZE +0 \} +. if !d$TOC_PH_SIZE_CHANGE \{ .TOC_PARAHEAD_SIZE +0 \} +. \} +.\" +Refer support +. if !r#ENDNOTE_REFS \{ .nr #FN_REFS 1 \} +. if '\\*[$REF_FN_INDENT]'' \{\ +. if \\n[#PRINT_STYLE]=1 \{ .INDENT_REFS FOOTNOTE 2m \} +. if \\n[#PRINT_STYLE]=2 \{ .INDENT_REFS FOOTNOTE 1.5m \} +. \} +. if '\\*[$REF_EN_INDENT]'' \{\ +. if \\n[#PRINT_STYLE]=1 \{ .INDENT_REFS ENDNOTE 2m \} +. if \\n[#PRINT_STYLE]=2 \{ .INDENT_REFS ENDNOTE 1.5m \} +. \} +. if '\\*[$REF_BIB_INDENT]'' \{\ +. if \\n[#PRINT_STYLE]=1 \{ .INDENT_REFS BIBLIO 2m \} +. if \\n[#PRINT_STYLE]=2 \{ .INDENT_REFS BIBLIO 1.5m :\} . \} +.\" Adjust doc leading for PRINTSTYLE TYPESET . if \\n[#PRINT_STYLE]=2 \{\ . ie \\n[#ADJ_DOC_LEAD]=1 \{ .DOC_LEAD_ADJUST \} . el \{ . \} . \} -. if !\\n[#COLLATE] \{\ +.\" This diversion is to get a value for #FN_AUTOLEAD +. di NULL +. ev NULL +. if \\n[#PRINT_STYLE]=1 \{\ +. ps 12 +. ie \\n[#SINGLE_SPACE]=1 \{ .vs \\n[#ORIGINAL_DOC_LEAD]u \} +. el \{ .vs \\n[#ORIGINAL_DOC_LEAD]u/2u \} +. \} +. if \\n[#PRINT_STYLE]=2 \{\ +. PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$FN_SIZE_CHANGE] +. AUTOLEAD \\n[#FN_AUTOLEAD] +. \} +. nr #FN_LEAD \\n[#LEAD] +. if \\n[#PRINT_STYLE]=2 \{ .LS \\n[#DOC_LEAD]u \} +. ev +. di +. ie !\\n[#COLLATE] \{\ +.\" DOC_LEAD adjusted (or not) here . TRAPS -\# Endnote and toc leading +. rr #DOC_LEAD_ADJUST_OFF +.\" Endnote, bibliography and toc leading . nr #OK_PROCESS_LEAD 1 . nr #RESTORE_DOC_LEAD \\n(.v +. nr #RESTORE_B_MARGIN \\n[#B_MARGIN] . if \\n[#PRINT_STYLE]=1 \{\ . ie \\n[#SINGLE_SPACE] \{\ . ENDNOTE_LEAD 12 ADJUST +. BIBLIOGRAPHY_LEAD 12 ADJUST . \} . el \{\ . ie \\n[#EN_SINGLESPACE] \{ .ENDNOTE_LEAD 12 ADJUST \} . el \{ .ENDNOTE_LEAD 24 ADJUST \} +. ie \\n[#BIB_SINGLESPACE] \{ .BIBLIOGRAPHY_LEAD 12 ADJUST \} +. el \{ .BIBLIOGRAPHY_LEAD 24 ADJUST \} . \} . \} . if \\n[#PRINT_STYLE]=2 \{\ . ie !d$EN_LEAD \{ .ENDNOTE_LEAD 14 ADJUST \} . el \{ .ENDNOTE_LEAD \\*[$EN_LEAD] \\*[$ADJUST_EN_LEAD] \} +. ie !d$BIB_LEAD \{ .BIBLIOGRAPHY_LEAD 14 ADJUST \} +. el \{ .BIBLIOGRAPHY_LEAD \\*[$BIB_LEAD] \\*[$ADJUST_BIB_LEAD] \} . ie !d$TOC_LEAD \{ .TOC_LEAD \\n[#RESTORE_DOC_LEAD]u \} . el \{ .TOC_LEAD \\*[$TOC_LEAD] \\*[$ADJUST_TOC_LEAD] \} . rm $ADJUST_EN_LEAD +. rm $ADJUST_BIB_LEAD . rm $ADJUST_TOC_LEAD . \} +. ie !d$BIB_SPACE \{ .BIBLIOGRAPHY_SPACING 1v \} +. el \{\ +. if \\n[#DEFER_BIB_SPACING]=1 \{\ +. BIBLIOGRAPHY_SPACING \\*[$BIB_SPACE] +. rr #DEFER_BIB_SPACING +. \} +. \} . DOC_LEAD \\n[#RESTORE_DOC_LEAD]u +. nr #B_MARGIN \\n[#RESTORE_B_MARGIN] +. \} +. el \{\ +. if \\n[#COLLATE] \{\ +. if !\\n[#PRINT_STYLE]=1 \{\ +. if \\n[#RERUN_TRAPS] \{ .TRAPS \} +. \} +. \} . \} . if \\n[#PRINT_STYLE]=1 \{ .nr #IGNORE 1 \} .END @@ -4153,22 +5062,58 @@ \# \# First, define some strings for point sizes \# -.ds $TITLE_PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$TITLE_SIZE_CHANGE] -.ds $CHAPTER_TITLE_PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$CHAPTER_TITLE_SIZE_CHANGE] -.ds $SUBTITLE_PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$SUBTITLE_SIZE_CHANGE] -.ds $AUTHOR_PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$AUTHOR_SIZE_CHANGE] -.ds $DOCTYPE_PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$DOCTYPE_SIZE_CHANGE] +\# Doc cover +.ds $DOC_COVER_AUTHOR_PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$DOC_COVER_AUTHOR_SIZE_CHANGE] +.ds $DOC_COVER_CHAPTER_TITLE_PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$DOC_COVER_CHAPTER_TITLE_SIZE_CHANGE] +.ds $DOC_COVER_COPYRIGHT_PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$DOC_COVER_COPYRIGHT_SIZE_CHANGE] +.ds $DOC_COVER_DOCTYPE_PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$DOC_COVER_DOCTYPE_SIZE_CHANGE] +.ds $DOC_COVER_SUBTITLE_PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$DOC_COVER_SUBTITLE_SIZE_CHANGE] +.ds $DOC_COVER_TITLE_PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$DOC_COVER_TITLE_SIZE_CHANGE] +\# Cover +.ds $COVER_AUTHOR_PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$COVER_AUTHOR_SIZE_CHANGE] +.ds $COVER_CHAPTER_TITLE_PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$COVER_CHAPTER_TITLE_SIZE_CHANGE] +.ds $COVER_COPYRIGHT_PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$COVER_COPYRIGHT_SIZE_CHANGE] +.ds $COVER_DOCTYPE_PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$COVER_DOCTYPE_SIZE_CHANGE] +.ds $COVER_SUBTITLE_PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$COVER_SUBTITLE_SIZE_CHANGE] +.ds $COVER_TITLE_PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$COVER_TITLE_SIZE_CHANGE] +\# Docheader +.ds $AUTHOR_PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$AUTHOR_SIZE_CHANGE] +.ds $CHAPTER_TITLE_PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$CHAPTER_TITLE_SIZE_CHANGE] +.ds $COPYRIGHT_PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$COPYRIGHT_SIZE_CHANGE] +.ds $DOCTYPE_PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$DOCTYPE_SIZE_CHANGE] +.ds $SUBTITLE_PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$SUBTITLE_SIZE_CHANGE] +.ds $TITLE_PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$TITLE_SIZE_CHANGE] \# \# Next, some utility macros for various routines to prevent repetition \# .MAC PRINT_AUTHORS END . nr #AUTHORS \\n[#AUTHOR_NUM] . nr #NEXT_AUTHOR 0 1 -. while \\n[#AUTHORS]>\\n[#NEXT_AUTHOR] \{\ -. ie \\n[#AUTHOR_COLOR]=1 \{\ -. PRINT \m[\\*[$AUTHOR_COLOR]]\\*[$AUTHOR_\\n+[#NEXT_AUTHOR]]\m[] +. ie r#DOING_COVER \{\ +. if \\n[#COVER]=1 \{\ +. while \\n[#AUTHORS]>\\n[#NEXT_AUTHOR] \{\ +. ie \\n[#COVER_AUTHOR_COLOR]=1 \{\ +. PRINT \m[\\*[$COVER_AUTHOR_COLOR]]\\*[$AUTHOR_\\n+[#NEXT_AUTHOR]]\m[] +. \} +. el \{ .PRINT \\*[$AUTHOR_\\n+[#NEXT_AUTHOR]] \} +.\} +. \} +. if \\n[#DOC_COVER]=1 \{\ +. while \\n[#AUTHORS]>\\n[#NEXT_AUTHOR] \{\ +. ie \\n[#DOC_COVER_AUTHOR_COLOR]=1 \{\ +. PRINT \m[\\*[$DOC_COVER_AUTHOR_COLOR]]\\*[$AUTHOR_\\n+[#NEXT_AUTHOR]]\m[] +. \} +. el \{ .PRINT \\*[$AUTHOR_\\n+[#NEXT_AUTHOR]] \} +.\} . \} -. el \{ .PRINT \\*[$AUTHOR_\\n+[#NEXT_AUTHOR]] \} +. \} +. el \{\ +. while \\n[#AUTHORS]>\\n[#NEXT_AUTHOR] \{\ +. ie \\n[#AUTHOR_COLOR]=1 \{\ +. PRINT \m[\\*[$AUTHOR_COLOR]]\\*[$AUTHOR_\\n+[#NEXT_AUTHOR]]\m[] +. \} +. el \{ .PRINT \\*[$AUTHOR_\\n+[#NEXT_AUTHOR]] \} +.\} . \} .END \# @@ -4212,7 +5157,7 @@ . FT \\*[$TITLE_FT] . PT_SIZE \\*[$TITLE_PT_SIZE] . LS \\n[#DOCHEADER_LEAD]u -\# Chapter title only +.\" Chapter title only . ie '\\*[$CHAPTER]'' \{\ . ie !'\\*[$CHAPTER_TITLE]'' \{\ . if \\n[#PRINT_STYLE]=2 \{\ @@ -4233,7 +5178,7 @@ . el \{ .PRINT \\*[$CHAPTER_STRING] \} . \} . \} -\# Chapter string, possibly with a chapter title +.\" Chapter string, possibly with a chapter title . el \{\ . ie \\n[#TITLE_COLOR]=1 \{\ . PRINT \m[\\*[$TITLE_COLOR]]\\*[$CHAPTER_STRING] \\*[$CHAPTER]\m[] @@ -4246,8 +5191,8 @@ . FT \\*[$CHAPTER_TITLE_FT] . PT_SIZE \\*[$CHAPTER_TITLE_PT_SIZE] . LS \\n[#DOCHEADER_LEAD]u -. ie \\n[#TITLE_COLOR]=1 \{\ -. PRINT \m[\\*[$TITLE_COLOR]]\\*[$CHAPTER_TITLE]\m[] +. ie \\n[#CHAPTER_TITLE_COLOR]=1 \{\ +. PRINT \m[\\*[$CHAPTER_TITLE_COLOR]]\\*[$CHAPTER_TITLE]\m[] . \} . el \{ .PRINT \\*[$CHAPTER_TITLE] \} . RLD \\n[#DOC_LEAD]u \" Just looks better this way @@ -4286,7 +5231,6 @@ . \} . el \{ .PRINT \\*[$ATTRIBUTE_STRING] \} . \} -. \} . PRINT_AUTHORS . \} . FAMILY \\*[$DOCTYPE_FAM] @@ -4302,179 +5246,815 @@ .END \# \# -.MAC START END -. if !\\n[#PRINT_STYLE] \{\ -. PRINTSTYLE TYPEWRITE -. PRINT \& -. po 6P -. ll 39P -. ta \\n(.lu -. sp |1i-1v -. CENTER -. PRINT "You neglected to enter a PRINTSTYLE" -. fl -. ab PRINTSTYLE missing -. \} -. nr #DOCS 1 -. if \\n[#COLLATE] \{\ -. COPYSTYLE \\*[$COPY_STYLE] -. nr #HEADERS_ON \\n[#HEADER_STATE] -. if \\n[#PAGE_NUM_V_POS]=1 \{ .nr #PAGINATE \\n[#PAGINATION_STATE] \} -. sp |\\n[#HEADER_MARGIN]u -. PRINT \& -. if !'\\*[$RESTORE_PAGENUM_STYLE]'' \{\ -. PAGENUM_STYLE \\*[$RESTORE_PAGENUM_STYLE] -. rm $RESTORE_PAGENUM_STYLE +\# COVER PAGE +\# ---------- +\# *Arguments: +\# TITLE | DOCTITLE | CHAPTER | CHAPTER_TITLE | CHAPTER+TITLE | COVERTITLE ... +\# ... [ SUBTITLE AUTHOR DOCTYPE COPYRIGHT MISC ] +\# *Function: +\# Toggles the number register for each cover page element +\# passed as an argument. +\# *Notes: +\# TITLE, DOCTITLE, CHAPTER, CHAPTER_TITLE or CHAPTER+TITLE must +\# be supplied. After that, users may enter as many or as few of +\# the arguments as they like; however, the arguments must appear +\# in the order given above. +\# +\# If called as DOC_COVER, performs the same operations, but +\# applies everything to a doc cover. +\# +.MAC COVER END +. ie '\\$0'DOC_COVER' \{\ +. nr #DOC_COVER 1 +. if '\\$1'TITLE' \{ .nr #DOC_COVER_TITLE 1 \} +. if '\\$1'DOCTITLE' \{ .nr #DOC_COVER_TITLE 2 \} +. if '\\$1'CHAPTER' \{ .nr #DOC_COVER_TITLE 3 \} +. if '\\$1'CHAPTER_TITLE' \{ .nr #DOC_COVER_TITLE 4 \} +. if '\\$1'CHAPTER+TITLE' \{ .nr #DOC_COVER_TITLE 5 \} +. if '\\$1'COVERTITLE' \{ .nr #DOC_COVER_TITLE 6 \} +. if '\\$2'SUBTITLE' \{ .nr #DOC_COVER_SUBTITLE 1 \} +. if '\\$2'AUTHOR' \{ .nr #DOC_COVER_AUTHOR 1 \} +. if '\\$2'DOCTYPE' \{ .nr #DOC_COVER_DOCTYPE 1 \} +. if '\\$2'COPYRIGHT' \{ .nr #DOC_COVER_COPYRIGHT 1 \} +. if '\\$2'MISC' \{ .nr #DOC_COVER_MISC 1 \} +. if '\\$3'AUTHOR' \{ .nr #DOC_COVER_AUTHOR 1 \} +. if '\\$3'DOCTYPE' \{ .nr #DOC_COVER_DOCTYPE 1 \} +. if '\\$3'COPYRIGHT' \{ .nr #DOC_COVER_COPYRIGHT 1 \} +. if '\\$3'MISC' \{ .nr #DOC_COVER_MISC 1 \} +. if '\\$4'DOCTYPE' \{ .nr #DOC_COVER_DOCTYPE 1 \} +. if '\\$4'COPYRIGHT' \{ .nr #DOC_COVER_COPYRIGHT 1 \} +. if '\\$4'MISC' \{ .nr #DOC_COVER_MISC 1 \} +. if '\\$5'COPYRIGHT' \{ .nr #DOC_COVER_COPYRIGHT 1 \} +. if '\\$5'MISC' \{ .nr #DOC_COVER_MISC 1 \} +. if '\\$6'MISC' \{ .nr #DOC_COVER_MISC 1 \} +. \} +. el \{\ +. nr #COVER 1 +. if '\\$1'TITLE' \{ .nr #COVER_TITLE 1 \} +. if '\\$1'DOCTITLE' \{ .nr #COVER_TITLE 2 \} +. if '\\$1'CHAPTER' \{ .nr #COVER_TITLE 3 \} +. if '\\$1'CHAPTER_TITLE' \{ .nr #COVER_TITLE 4 \} +. if '\\$1'CHAPTER+TITLE' \{ .nr #COVER_TITLE 5 \} +. if '\\$1'COVERTITLE' \{ .nr #COVER_TITLE 6 \} +. if '\\$2'SUBTITLE' \{ .nr #COVER_SUBTITLE 1 \} +. if '\\$2'AUTHOR' \{ .nr #COVER_AUTHOR 1 \} +. if '\\$2'DOCTYPE' \{ .nr #COVER_DOCTYPE 1 \} +. if '\\$2'COPYRIGHT' \{ .nr #COVER_COPYRIGHT 1 \} +. if '\\$2'MISC' \{ .nr #COVER_MISC 1 \} +. if '\\$3'AUTHOR' \{ .nr #COVER_AUTHOR 1 \} +. if '\\$3'DOCTYPE' \{ .nr #COVER_DOCTYPE 1 \} +. if '\\$3'COPYRIGHT' \{ .nr #COVER_COPYRIGHT 1 \} +. if '\\$3'MISC' \{ .nr #COVER_MISC 1 \} +. if '\\$4'DOCTYPE' \{ .nr #COVER_DOCTYPE 1 \} +. if '\\$4'COPYRIGHT' \{ .nr #COVER_COPYRIGHT 1 \} +. if '\\$4'MISC' \{ .nr #COVER_MISC 1 \} +. if '\\$5'COPYRIGHT' \{ .nr #COVER_COPYRIGHT 1 \} +. if '\\$5'MISC' \{ .nr #COVER_MISC 1 \} +. if '\\$6'MISC' \{ .nr #COVER_MISC 1 \} +. \} +.END +\# +\# +.MAC COVERTITLE END +. ie '\\$0'DOC_COVERTITLE' .ds $DOC_COVER_TITLE \\$1 +. el .ds $COVER_TITLE \\$1 +.END +\# +\# +\# COVER PAGE LEADING +\# ------------------ +\# *Arguments: +\# <+|- amount by which to in/decrease leading of cover/doc cover> +\# *Function: +\# Stores user supplied lead in/decrease in string $COVER_LEAD_ADJ +\# or $DOC_COVER_LEAD_ADJ, depending on whether the macro was called +\# with an alias (DOC_COVER_LEAD). +\# *Notes: +\# A unit of measure must be supplied. Decimal fractions OK. +\# Default is +0, i.e. same as DOC_LEAD. +\# +.MAC COVER_LEAD END +. ie '\\$0'DOC_COVER_LEAD' \{\ +. ds $DOC_COVER_LEAD_ADJ \\$1 +. \} +. el \{\ +. ds $COVER_LEAD_ADJ \\$1 +. \} +.END +\# +\# +\# COVER PAGE START POSITION +\# ------------------------- +\# *Arguments: +\# +\# *Function: +\# Stores user supplied lead in/decrease in #COVER_START_POS +\# or #DOC_COVER_START_POS, depending on whether the macro was +\# called by an alias (DOC_COVER_ADVANCE). +\# *Notes: +\# A unit of measure must be supplied. Decimal fractions OK. +\# If user doesn't invoke this macro, the default starting +\# position for both covers and doc covers is 1/3 of the way +\# down the page (setup in DO_COVER). +\# +.MAC COVER_ADVANCE END +. ie '\\$0'DOC_COVER_ADVANCE' \{\ +. nr #DOC_COVER_START_POS (\\$1) +. \} +. el \{\ +. nr #COVER_START_POS (\\$1) +. \} +.END +\# +\# +\# COVERS - WHETHER TO PRINT +\# ------------------------- +\# *Arguments: +\# | +\# *Function: +\# Creates or removes registers #COVERS and #COVERS_OFF, checked for +\# in DEFAULTS (in START) prior to printing +\# +.MAC COVERS END +. ie '\\$0'DOC_COVERS' \{\ +. ie '\\$1'' \{\ +. rr #DOC_COVERS_OFF +. nr #DOC_COVERS 1 +. \} +. el \{\ +. rr #DOC_COVERS +. nr #DOC_COVERS_OFF 1 . \} . \} -. DEFAULTS -\# Collate stuff -. ie \\n[#COLLATED_DOC]=1 \{\ -\# Collect TITLE for TOC. -. nr #TOC_ENTRY_PN \\n%+\\n[#PAGE_NUM_ADJ] -. af #TOC_ENTRY_PN \\g[#PAGENUMBER] -. ie \\n[#USER_SET_TITLE_ITEM] \{\ -. ds $TOC_TITLE_ITEM \\*[$USER_SET_TITLE_ITEM]\\| -. rr #USER_SET_TITLE_ITEM -. rm $USER_SET_TITLE_ITEM +. el \{\ +. ie '\\$1'' \{\ +. rr #COVERS_OFF +. nr #COVERS 1 . \} . el \{\ -. ie \\n[#DOC_TYPE]=2 \{\ -. ie '\\*[$CHAPTER_TITLE]'' \{\ -. ds $TOC_TITLE_ITEM \\*[$CHAPTER_STRING] \\*[$CHAPTER]\\| +. rr #COVERS +. nr #COVERS_OFF 1 +. \} +. \} +.END +\# +\# +.MAC DO_COVER END +. nr #DOING_COVER 1 +. ev COVER +. evc 0 +. TRAP OFF +. if \\n[#PAGINATE]=1 \{\ +. nr #PAGINATION_WAS_ON 1 +. rr #PAGINATE +. \} +. if \\n[#HEADERS_ON]=1 \{\ +. nr #HEADERS_WERE_ON 1 +. HEADERS OFF +. \} +. if \\n[#FOOTERS_ON]=1 \{\ +. nr #FOOTERS_WERE_ON 1 +. FOOTERS OFF +. \} +. if \\n[#COLUMNS]=1 \{\ +. nr #COLUMNS_WERE_ON 1 +. rr #COLUMNS +. \} +.\" Doc cover +. ie '\\$0'DO_DOC_COVER' \{\ +. if !r#DOC_COVER_START_POS \{\ +. nr #DOC_COVER_START_POS \\n[#PAGE_LENGTH]/3 +. \} +. if \\n[#PRINT_STYLE]=1 \{\ +. ie \\n[#SINGLE_SPACE]=1 \{ .vs \\n[#DOC_LEAD]u*2u \} +. el \{ .vs \\n[#DOC_LEAD]u \} +. \} +. if \\n[#PRINT_STYLE]=2 \{\ +. LS \\n[#DOC_LEAD]u\\*[$DOC_COVER_LEAD_ADJ] +. nr #DOC_COVER_LEAD \\n[#LEAD] +. \} +. PRINT \& +. sp |\\n[#DOC_COVER_START_POS]u-1v +. if \\n[#DOC_COVER_COLOR]=1 \{\ +. nf +\m[\\*[$DOC_COVER_COLOR]] +. EOL +. \} +. CENTER +. FAMILY \\*[$DOC_COVER_TITLE_FAM] +. FT \\*[$DOC_COVER_TITLE_FT] +. PT_SIZE \\*[$DOC_COVER_TITLE_PT_SIZE] +. LS \\n[#DOC_COVER_LEAD]u +. if \\n[#PRINT_STYLE]=1 \{ .TYPEWRITER \} +. if \\n[#DOC_COVER_TITLE]=1 \{\ +. ie \\n[#PRINT_STYLE]=1 \{\ +. CAPS +. UNDERSCORE "\\*[$TITLE]" +. CAPS OFF +. \} +. el \{\ +. ie \\n[#DOC_COVER_TITLE_COLOR]=1 \{\ +. PRINT \m[\\*[$DOC_COVER_TITLE_COLOR]]\\*[$TITLE]\m[] . \} -. el \{\ -. ie '\\*[$CHAPTER]'' \{\ -. ds $TOC_TITLE_ITEM \\*[$CHAPTER_TITLE]\\| -. \} -. el \{\ -. ds $TOC_TITLE_ITEM \\*[$CHAPTER_STRING] \\*[$CHAPTER]: \\*[$CHAPTER_TITLE]\\| -. \} +. el \{ .PRINT \\*[$TITLE] \} +. \} +. \} +. if \\n[#DOC_COVER_TITLE]=2 \{\ +. ie \\n[#PRINT_STYLE]=1 \{\ +. CAPS +. UNDERSCORE "\\*[$DOC_TITLE]" +. CAPS OFF +. \} +. el \{\ +. ie \\n[#DOC_COVER_TITLE_COLOR]=1 \{\ +. PRINT \m[\\*[$DOC_COVER_TITLE_COLOR]]\\*[$DOC_TITLE]\m[] . \} +. el \{ .PRINT \\*[$DOC_TITLE] \} +. \} +. \} +. if \\n[#DOC_COVER_TITLE]=3 \{\ +. ie \\n[#PRINT_STYLE]=1 \{\ +. CAPS +. PRINT \\*[$CHAPTER_STRING] \\*[$CHAPTER] +. CAPS OFF . \} . el \{\ -. ds $TOC_TITLE_ITEM \\*[$TITLE]\\| +. ie \\n[#DOC_COVER_TITLE_COLOR]=1 \{\ +. PRINT \m[\\*[$DOC_COVER_TITLE_COLOR]]\\*[$CHAPTER_STRING] \\*[$CHAPTER]\m[] +. \} +. el \{ .PRINT \\*[$CHAPTER_STRING] \\*[$CHAPTER] \} . \} . \} -. if \\n[#TOC_AUTHORS]=1 \{\ -. ie '\\*[$TOC_AUTHORS]'' \{\ -. as $TOC_TITLE_ITEM /\\|\\*[$AUTHOR_1]\\| +. if \\n[#DOC_COVER_TITLE]=4 \{\ +. ie \\n[#PRINT_STYLE]=1 \{\ +. CAPS +. UNDERSCORE "\\*[$CHAPTER_TITLE]" +. CAPS OFF . \} . el \{\ -. as $TOC_TITLE_ITEM /\\|\\*[$TOC_AUTHORS]\\| -. rm $TOC_AUTHORS +. ie \\n[#DOC_COVER_TITLE_COLOR]=1 \{\ +. PRINT \m[\\*[$DOC_COVER_TITLE_COLOR]]\\*[$CHAPTER_TITLE]\m[] +. \} +. el \{ .PRINT \\*[$CHAPTER_TITLE] \} . \} . \} -\# Note the use of \!, which transparently embeds the macros used -\# in the TOC_ENTRIES diversion. The elements they control must be -\# processed literally when the diversion is output. -. ev TOC_EV -. da TOC_ENTRIES +. if \\n[#DOC_COVER_TITLE]=5 \{\ +. ie \\n[#PRINT_STYLE]=1 \{\ +. CAPS +. PRINT \\*[$CHAPTER_STRING] \\*[$CHAPTER] +. CAPS OFF +. \} +. el \{\ +. ie \\n[#DOC_COVER_TITLE_COLOR]=1 \{\ +. PRINT \m[\\*[$DOC_COVER_TITLE_COLOR]]\\*[$CHAPTER_STRING] \\*[$CHAPTER]\m[] +. \} +. el \{ .PRINT \\*[$CHAPTER_STRING] \\*[$CHAPTER] \} +. \} +. if !'\\*[$CHAPTER_TITLE]'' \{\ +. ie \\n[#PRINT_STYLE]=1 \{\ +. UNDERSCORE "\\*[$CHAPTER_TITLE]" +. \} +. el \{\ +. FAMILY \\*[$DOC_COVER_CHAPTER_TITLE_FAM] +. FT \\*[$DOC_COVER_CHAPTER_TITLE_FT] +. PT_SIZE \\*[$DOC_COVER_CHAPTER_TITLE_PT_SIZE] +. ie \\n[#DOC_COVER_CHAPTER_TITLE_COLOR]=1 \{\ +. PRINT \m[\\*[$DOC_COVER_CHAPTER_TITLE_COLOR]]\\*[$CHAPTER_TITLE]\m[] +. \} +. el \{ .PRINT \\*[$CHAPTER_TITLE] \} +. \} +. \} +. \} +. if \\n[#DOC_COVER_TITLE]=6 \{\ +. ie \\n[#PRINT_STYLE]=1 \{\ +. CAPS +. UNDERSCORE "\\*[$DOC_COVER_TITLE]" +. CAPS OFF +. \} +. el \{\ +. ie \\n[#DOC_COVER_TITLE_COLOR]=1 \{\ +. PRINT \m[\\*[$DOC_COVER_TITLE_COLOR]]\\*[$DOC_COVER_TITLE]\m[] +. \} +. el \{ .PRINT \\*[$DOC_COVER_TITLE] \} +. \} +. \} +. if \\n[#DOC_COVER_SUBTITLE]=1 \{\ +. FAMILY \\*[$DOC_COVER_SUBTITLE_FAM] +. FT \\*[$DOC_COVER_SUBTITLE_FT] +. PT_SIZE \\*[$DOC_COVER_SUBTITLE_PT_SIZE] +. if \\n[#PRINT_STYLE]=1 \{ .TYPEWRITER \} +. ie \\n[#DOC_COVER_SUBTITLE_COLOR]=1 \{\ +. PRINT \m[\\*[$DOC_COVER_SUBTITLE_COLOR]]\\*[$SUBTITLE]\m[] +. \} +. el \{ .PRINT \\*[$SUBTITLE] \} +. \} . if \\n[#PRINT_STYLE]=1 \{\ -\!. fam C -\!. ft R -\!. ps 12 +. if !r#DOC_COVER_SUBTITLE \{ .SP \} . \} -. if \\n[#PRINT_STYLE]=2 \{\ -\!. FAMILY \\*[$TOC_TITLE_FAM] -\!. FT \\*[$TOC_TITLE_FT] -\!. PT_SIZE \\n[#TOC_PS]u\\*[$TOC_TITLE_SIZE_CHANGE] +. if \\n[#DOC_COVER_AUTHOR]=1 \{\ +. FAMILY \\*[$DOC_COVER_AUTHOR_FAM] +. FT \\*[$DOC_COVER_AUTHOR_FT] +. PT_SIZE \\*[$DOC_COVER_AUTHOR_PT_SIZE] +. if \\n[#PRINT_STYLE]=1 \{\ +. TYPEWRITER +. vs \\n[#DOC_LEAD]u/2u +. \} +. if !'\\*[$ATTRIBUTE_STRING]'' \{\ +. ie \\n[#DOC_COVER_ATTRIBUTE_COLOR]=1 \{\ +. PRINT \m[\\*[$DOC_COVER_ATTRIBUTE_COLOR]]\\*[$ATTRIBUTE_STRING]\m[] +. \} +. el \{ .PRINT \\*[$ATTRIBUTE_STRING] \} +. \} +. PRINT_AUTHORS +. \} +. FAMILY \\*[$DOC_COVER_DOCTYPE_FAM] +. FT \\*[$DOC_COVER_DOCTYPE_FT] +. PT_SIZE \\*[$DOC_COVER_DOCTYPE_PT_SIZE] +. SP +. if \\n[#DOC_COVER_DOCTYPE]=1 \{\ +. ie \\n[#PRINT_STYLE]=1 \{\ +. TYPEWRITER +. vs \\n[#DOC_LEAD]u +. UNDERSCORE2 "\\*[$DOC_TYPE] +. \} +. el \{\ +. ie \\n[#DOC_COVER_DOCTYPE_COLOR]=1 \{\ +. COLOR \\*[$DOC_COVER_DOCTYPE_COLOR] +. UNDERSCORE "\\*[$DOC_TYPE] +. \} +. el .UNDERSCORE "\\*[$DOC_TYPE] +. \} . \} -\!. TRAP OFF +. sp |\\n[#VISUAL_B_MARGIN]u+\\n[#DOC_LEAD]u . ie \\n[#PRINT_STYLE]=1 \{\ -\!. PAD "\\*[$TOC_TITLE_ITEM]\\*[$TOC_PN_TYPEWRITE]" +. TYPEWRITER +. ie \\n[#SINGLE_SPACE]=1 \{ .vs \\n[#DOC_LEAD]u \} +. el \{ .vs \\n[#DOC_LEAD]u/2u \} . \} . el \{\ -\!. PAD "\\h'\\n[#TOC_TITLE_INDENT]u'\\*[$TOC_TITLE_ITEM]\\*[$TOC_PN]" +. FAMILY \\*[$DOC_COVER_COPYRIGHT_FAM] +. FT \\*[$DOC_COVER_COPYRIGHT_FT] +. AUTOLEAD 2 +. PT_SIZE \\*[$DOC_COVER_COPYRIGHT_PT_SIZE] +. \} +. if \\n[#DOC_COVER_COPYRIGHT]=1 \{\ +. QUAD \\*[$DOC_COVER_COPYRIGHT_QUAD] +. ie \\n[#DOC_COVER_COPYRIGHT_COLOR]=1 \{\ +. PRINT \m[\\*[$DOC_COVER_COPYRIGHT_COLOR]]\\*[$COPYRIGHT]\m[] +. \} +. el \{ .PRINT \\*[$COPYRIGHT] \} +. \} +. sp |\\n[#VISUAL_B_MARGIN]u+\\n[#DOC_LEAD]u +. if \\n[#DOC_COVER_MISC]=1 \{\ +. QUAD \\*[$DOC_COVER_MISC_QUAD] +. nr #MISCS \\n[#MISC_NUM] +. sp -\\n[#MISCS]+1 +. nr #NEXT_MISC 0 1 +. while \\n[#MISCS]>\\n[#NEXT_MISC] \{\ +. ie \\n[#DOC_COVER_MISC_COLOR]=1 \{\ +. PRINT \m[\\*[$DOC_COVER_MISC_COLOR]]\\*[$MISC_\\n+[#NEXT_MISC]]\m[] +. br +. \} +. el \{\ +. PRINT \\*[$MISC_\\n+[#NEXT_MISC]] +. br +. \} +.\} . \} -\!. EL -\!. ST 100 L -\!. ST 101 R -. if \\n[#PRINT_STYLE]=2 \{\ -\!. FAMILY \\*[$TOC_PN_FAM] -\!. FT \\*[$TOC_PN_FT] -\!. PT_SIZE \\n[#TOC_PS]u\\*[$TOC_PN_SIZE_CHANGE] -. \} -\!. TAB 100 -\!. PRINT \\*[LEADER] -\!. TN -\!. TRAP -\!. PRINT \\n[#TOC_ENTRY_PN] -\!. TQ -. di -. ev . \} +.\" Cover . el \{\ -. nr #FIRST_DOC_TITLE_PN \\n%+\\n[#PAGE_NUM_ADJ] -. af #FIRST_DOC_TITLE_PN \\g[#PAGENUMBER] -. nr #FIRST_DOC_TOC_PN_PADDING \\n[#TOC_PN_PADDING] -. \} -\# End TITLE collection -. if \\n[#PRINT_PAGENUM_ON_PAGE_1] \{\ -. sp |\\n[#HEADER_MARGIN]u -. PRINT_PAGE_NUMBER -. \} -. rr #COLLATE -. rr #PAGINATION_STATE -\# End collate stuff -. ie \\n[#DOC_HEADER]=0 \{\ -. PRINT \& -. if \\n[#DOC_TYPE]=4 \{\ -. if !'\\n(.z'' \{ .di \} +. if !r#COVER_START_POS \{\ +. nr #COVER_START_POS \\n[#PAGE_LENGTH]/3 . \} -. nr #STORED_PP_INDENT \\n[#PP_INDENT] -. PARA_INDENT 0 -. PP -. PARA_INDENT \\n[#STORED_PP_INDENT]u -. rr #STORED_PP_INDENT -. ie r#ADVANCE_FROM_TOP \{\ -. sp |\\n[#ADVANCE_FROM_TOP]u-1v -. SHIM +. if \\n[#PRINT_STYLE]=1 \{\ +. ie \\n[#SINGLE_SPACE]=1 \{ .vs \\n[#DOC_LEAD]u*2u \} +. el \{ .vs \\n[#DOC_LEAD]u \} . \} -. el \{ .sp |\\n[#T_MARGIN]u-1v \} -. if \\n[#COLUMNS] \{\ -. mk dc -. nr #COL_NUM 0 1 -. po \\n[#COL_\\n+[#COL_NUM]_L_MARGIN]u -. nr #L_MARGIN \\n(.o -. ll \\n[#COL_L_LENGTH]u +. if \\n[#PRINT_STYLE]=2 \{\ +. LS \\n[#DOC_LEAD]u\\*[$COVER_LEAD_ADJ] +. nr #COVER_LEAD \\n[#LEAD] . \} -. nr #PP 0 -. rr #DOC_HEADER -. if r#ADVANCE_FROM_TOP \{ .rr #ADVANCE_FROM_TOP \} -. \} -. el \{\ -. if \\n[#PRINT_STYLE]=2 \{ .LS \\n[#DOC_LEAD]u\\*[$DOCHEADER_LEAD_ADJ] \} -. nr #DOCHEADER_LEAD \\n[#LEAD] -\# Default -. if \\n[#DOC_TYPE]=1 \{\ -. PRINT \& -. sp |\\n[#DOCHEADER_ADVANCE]u-1v -. ev DOCHEADER -. if \\n[#DOCHEADER_COLOR]=1 \{\ -. nf -\m[\\*[$DOCHEADER_COLOR]] -. EL -. \} -. L_MARGIN \\n[#DOC_L_MARGIN]u -. LL \\n[#DOC_L_LENGTH]u -. ta \\n(.lu -. if \\n[#PRINT_STYLE]=1 \{\ -. CENTER -. fam C -. ft R -. ps 12 -. ie \\n[#SINGLE_SPACE] \{ .vs \\n[#DOC_LEAD]u*2u \} -. el \{ .vs \\n[#DOC_LEAD]u \} +. PRINT \& +. sp |\\n[#COVER_START_POS]u-1v +. if \\n[#COVER_COLOR]=1 \{\ +. nf +\m[\\*[$COVER_COLOR]] +. EOL +. \} +. CENTER +. FAMILY \\*[$COVER_TITLE_FAM] +. FT \\*[$COVER_TITLE_FT] +. PT_SIZE \\*[$COVER_TITLE_PT_SIZE] +. LS \\n[#COVER_LEAD]u +. if \\n[#PRINT_STYLE]=1 \{ .TYPEWRITER \} +. if \\n[#COVER_TITLE]=1 \{\ +. ie \\n[#PRINT_STYLE]=1 \{\ . CAPS -. if !'\\*[$TITLE]'' \{ .UNDERSCORE "\\*[$TITLE]\} +. UNDERSCORE "\\*[$TITLE]" . CAPS OFF -. if !'\\*[$SUBTITLE]'' \{\ -. ie \\n[#SINGLE_SPACE] \{ .vs \\n[#DOC_LEAD]u*2u \} -. el \{ .vs \\n[#DOC_LEAD]u \} -. PRINT \\*[$SUBTITLE] +. \} +. el \{\ +. ie \\n[#COVER_TITLE_COLOR]=1 \{\ +. PRINT \m[\\*[$COVER_TITLE_COLOR]]\\*[$TITLE]\m[] . \} -. if '\\*[$SUBTITLE]'' \{\ +. el \{ .PRINT \\*[$TITLE] \} +. \} +. \} +. if \\n[#COVER_TITLE]=2 \{\ +. ie \\n[#PRINT_STYLE]=1 \{\ +. CAPS +. UNDERSCORE "\\*[$DOC_TITLE]" +. CAPS OFF +. \} +. el \{\ +. ie \\n[#COVER_TITLE_COLOR]=1 \{\ +. PRINT \m[\\*[$COVER_TITLE_COLOR]]\\*[$DOC_TITLE]\m[] +. \} +. el \{ .PRINT \\*[$DOC_TITLE] \} +. \} +. \} +. if \\n[#COVER_TITLE]=3 \{\ +. ie \\n[#PRINT_STYLE]=1 \{\ +. CAPS +. PRINT \\*[$CHAPTER_STRING] \\*[$CHAPTER] +. CAPS OFF +. \} +. el \{\ +. ie \\n[#COVER_TITLE_COLOR]=1 \{\ +. PRINT \m[\\*[$COVER_TITLE_COLOR]]\\*[$CHAPTER_STRING] \\*[$CHAPTER]\m[] +. \} +. el \{ .PRINT \\*[$CHAPTER_STRING] \\*[$CHAPTER] \} +. \} +. \} +. if \\n[#COVER_TITLE]=4 \{\ +. ie \\n[#PRINT_STYLE]=1 \{\ +. CAPS +. UNDERSCORE "\\*[$CHAPTER_TITLE]" +. CAPS OFF +. \} +. el \{\ +. ie \\n[#COVER_TITLE_COLOR]=1 \{\ +. PRINT \m[\\*[$COVER_TITLE_COLOR]]\\*[$CHAPTER_TITLE]\m[] +. \} +. el \{ .PRINT \\*[$CHAPTER_TITLE] \} +. \} +. \} +. if \\n[#COVER_TITLE]=5 \{\ +. ie \\n[#PRINT_STYLE]=1 \{\ +. CAPS +. PRINT \\*[$CHAPTER_STRING] \\*[$CHAPTER] +. CAPS OFF +. \} +. el \{\ +. ie \\n[#COVER_TITLE_COLOR]=1 \{\ +. PRINT \m[\\*[$COVER_TITLE_COLOR]]\\*[$CHAPTER_STRING] \\*[$CHAPTER]\m[] +. \} +. el \{ .PRINT \\*[$CHAPTER_STRING] \\*[$CHAPTER] \} +. \} +. if !'\\*[$CHAPTER_TITLE]'' \{\ +. ie \\n[#PRINT_STYLE]=1 \{\ +. UNDERSCORE "\\*[$CHAPTER_TITLE]" +. \} +. el \{\ +. FAMILY \\*[$COVER_CHAPTER_TITLE_FAM] +. FT \\*[$COVER_CHAPTER_TITLE_FT] +. PT_SIZE \\*[$COVER_CHAPTER_TITLE_PT_SIZE] +. ie \\n[#COVER_CHAPTER_TITLE_COLOR]=1 \{\ +. PRINT \m[\\*[$COVER_CHAPTER_TITLE_COLOR]]\\*[$CHAPTER_TITLE]\m[] +. \} +. el \{ .PRINT \\*[$CHAPTER_TITLE] \} +. \} +. \} +. \} +. if \\n[#COVER_TITLE]=6 \{\ +. ie \\n[#PRINT_STYLE]=1 \{\ +. CAPS +. UNDERSCORE "\\*[$COVER_TITLE]" +. CAPS OFF +. \} +. el \{\ +. ie \\n[#COVER_TITLE_COLOR]=1 \{\ +. PRINT \m[\\*[$COVER_TITLE_COLOR]]\\*[$COVER_TITLE]\m[] +. \} +. el \{ .PRINT \\*[$COVER_TITLE] \} +. \} +. \} +. if \\n[#COVER_SUBTITLE]=1 \{\ +. FAMILY \\*[$COVER_SUBTITLE_FAM] +. FT \\*[$COVER_SUBTITLE_FT] +. PT_SIZE \\*[$COVER_SUBTITLE_PT_SIZE] +. if \\n[#PRINT_STYLE]=1 \{ .TYPEWRITER \} +. ie \\n[#COVER_SUBTITLE_COLOR]=1 \{\ +. PRINT \m[\\*[$COVER_SUBTITLE_COLOR]]\\*[$SUBTITLE]\m[] +. \} +. el \{ .PRINT \\*[$SUBTITLE] \} +. \} +. if \\n[#PRINT_STYLE]=1 \{\ +. if !r#COVER_SUBTITLE \{ .SP \} +. \} +. if \\n[#COVER_AUTHOR]=1 \{\ +. FAMILY \\*[$COVER_AUTHOR_FAM] +. FT \\*[$COVER_AUTHOR_FT] +. PT_SIZE \\*[$COVER_AUTHOR_PT_SIZE] +. if \\n[#PRINT_STYLE]=1 \{\ +. TYPEWRITER +. vs \\n[#DOC_LEAD]u/2u +. \} +. if !'\\*[$ATTRIBUTE_STRING]'' \{\ +. ie \\n[#COVER_ATTRIBUTE_COLOR]=1 \{\ +. PRINT \m[\\*[$COVER_ATTRIBUTE_COLOR]]\\*[$ATTRIBUTE_STRING]\m[] +. \} +. el \{ .PRINT \\*[$ATTRIBUTE_STRING] \} +. \} +. PRINT_AUTHORS +. \} +. FAMILY \\*[$COVER_DOCTYPE_FAM] +. FT \\*[$COVER_DOCTYPE_FT] +. PT_SIZE \\*[$COVER_DOCTYPE_PT_SIZE] +. SP +. if \\n[#COVER_DOCTYPE]=1 \{\ +. ie \\n[#PRINT_STYLE]=1 \{\ +. TYPEWRITER +. vs \\n[#DOC_LEAD]u +. UNDERSCORE2 "\\*[$DOC_TYPE] +. \} +. el \{\ +. ie \\n[#COVER_DOCTYPE_COLOR]=1 \{\ +. COLOR \\*[$COVER_DOCTYPE_COLOR] +. UNDERSCORE "\\*[$DOC_TYPE] +. \} +. el .UNDERSCORE "\\*[$DOC_TYPE] +. \} +. \} +. sp |\\n[#VISUAL_B_MARGIN]u+\\n[#DOC_LEAD]u +. ie \\n[#PRINT_STYLE]=1 \{\ +. TYPEWRITER +. ie \\n[#SINGLE_SPACE]=1 \{ .vs \\n[#DOC_LEAD]u \} +. el \{ .vs \\n[#DOC_LEAD]u/2u \} +. \} +. el \{\ +. FAMILY \\*[$COVER_COPYRIGHT_FAM] +. FT \\*[$COVER_COPYRIGHT_FT] +. AUTOLEAD 2 +. PT_SIZE \\*[$COVER_COPYRIGHT_PT_SIZE] +. \} +. if \\n[#COVER_COPYRIGHT]=1 \{\ +. QUAD \\*[$COVER_COPYRIGHT_QUAD] +. ie \\n[#COVER_COPYRIGHT_COLOR]=1 \{\ +. PRINT \m[\\*[$COVER_COPYRIGHT_COLOR]]\\*[$COPYRIGHT]\m[] +. \} +. el \{ .PRINT \\*[$COPYRIGHT] \} +. \} +. sp |\\n[#VISUAL_B_MARGIN]u+\\n[#DOC_LEAD]u +. if \\n[#COVER_MISC]=1 \{\ +. QUAD \\*[$COVER_MISC_QUAD] +. nr #MISCS \\n[#MISC_NUM] +. sp -\\n[#MISCS]+1 +. nr #NEXT_MISC 0 1 +. while \\n[#MISCS]>\\n[#NEXT_MISC] \{\ +. ie \\n[#COVER_MISC_COLOR]=1 \{\ +. PRINT \m[\\*[$COVER_MISC_COLOR]]\\*[$MISC_\\n+[#NEXT_MISC]]\m[] +. br +. \} +. el \{\ +. PRINT \\*[$MISC_\\n+[#NEXT_MISC]] +. br +. \} +.\} +. \} +. \} +. EOL +. TRAP +. NEWPAGE +. ev +. if \\n[#PAGINATION_WAS_ON] \{\ +. rr #PAGINATION_WAS_ON +. PAGINATE +. PAGENUMBER \\n%+\\n[#PAGE_NUM_ADJ]-1 +. \} +. if \\n[#HEADERS_WERE_ON] \{\ +. rr #HEADERS_WERE_ON +. HEADERS +. \} +. if \\n[#FOOTERS_WERE_ON] \{\ +. rr #FOOTERS_WERE_ON +. FOOTERS +. \} +. if \\n[#COLUMNS_WERE_ON]=1 \{\ +. rr #COLUMNS_WERE_ON 1 +. nr #COLUMNS 1 +. \} +. rr #DOING_COVER +.END +\# +\# +.MAC START END +. if !\\n[#PRINT_STYLE] \{\ +. PRINTSTYLE TYPEWRITE +. PRINT \& +. po 6P +. ll 39P +. ta \\n(.lu +. sp |1i-1v +. CENTER +. PRINT "You neglected to enter a PRINTSTYLE" +. fl +. ab PRINTSTYLE missing +. \} +. nr #DOCS 1 +. if \\n[#LINENUMBERS]=1 \{\ +. NUMBER_LINES OFF +. nr #LINENUMBERS 2 +. \} +. if \\n[#COLLATE] \{\ +. COPYSTYLE \\*[$COPY_STYLE] +. nr #HEADERS_ON \\n[#HEADER_STATE] +. if \\n[#PAGE_NUM_V_POS]=1 \{ .nr #PAGINATE \\n[#PAGINATION_STATE] \} +. sp |\\n[#HEADER_MARGIN]u +. PRINT \& +. if !'\\*[$RESTORE_PAGENUM_STYLE]'' \{\ +. PAGENUM_STYLE \\*[$RESTORE_PAGENUM_STYLE] +. rm $RESTORE_PAGENUM_STYLE +. \} +. \} +. DEFAULTS +.\" Quote and blockquote default leads are the same as #DOC_LEAD, so +.\" they have to be set after DEFAULTS (where DOC_LEAD is finalized) +. if !r#Q_AUTOLEAD \{ .nr #Q_LEAD \\n[#DOC_LEAD] \} +. if !r#BQ_AUTOLEAD \{ .nr #BQ_LEAD \\n[#DOC_LEAD] \} +. if !r#EN_Q_AUTOLEAD \{ .nr #EN_Q_LEAD \\n[#EN_LEAD] \} +. if !r#EN_BQ_AUTOLEAD \{ .nr #EN_BQ_LEAD \\n[#EN_LEAD] \} +.\" Covers and doc covers +. if \\n[#DOC_COVERS]=1 \{\ +. if \\n[#DOC_COVER]=1 \{\ +. DO_DOC_COVER +. rr #DOC_COVER +. rr #DOC_COVER_TITLE +. rr #DOC_COVER_SUBTITLE +. rr #DOC_COVER_AUTHOR +. rr #DOC_COVER_DOCTYPE +. rr #DOC_COVER_COPYRIGHT +. rr #DOC_COVER_MISC +. \} +. \} +. if \\n[#COVERS]=1 \{\ +. if \\n[#COVER]=1 \{\ +. DO_COVER +. rr #COVER +. rr #COVER_TITLE +. rr #COVER_SUBTITLE +. rr #COVER_AUTHOR +. rr #COVER_DOCTYPE +. rr #COVER_COPYRIGHT +. rr #COVER_MISC +. \} +. \} +.\" Collate related stuff +. ie \\n[#COLLATED_DOC]=1 \{\ +.\" Collect TITLE for TOC. +. nr #TOC_ENTRY_PN \\n%+\\n[#PAGE_NUM_ADJ] +. af #TOC_ENTRY_PN \\g[#PAGENUMBER] +. ie \\n[#USER_SET_TITLE_ITEM] \{\ +. ds $TOC_TITLE_ITEM \\*[$USER_SET_TITLE_ITEM]\\| +. rr #USER_SET_TITLE_ITEM +. rm $USER_SET_TITLE_ITEM +. \} +. el \{\ +. ie \\n[#DOC_TYPE]=2 \{\ +. ie '\\*[$CHAPTER_TITLE]'' \{\ +. ds $TOC_TITLE_ITEM \\*[$CHAPTER_STRING] \\*[$CHAPTER]\\| +. \} +. el \{\ +. ie '\\*[$CHAPTER]'' \{\ +. ds $TOC_TITLE_ITEM \\*[$CHAPTER_TITLE]\\| +. \} +. el \{\ +. ds $TOC_TITLE_ITEM \\*[$CHAPTER_STRING] \\*[$CHAPTER]: \\*[$CHAPTER_TITLE]\\| +. \} +. \} +. \} +. el \{\ +. ds $TOC_TITLE_ITEM \\*[$TITLE]\\| +. \} +. \} +. if \\n[#TOC_AUTHORS]=1 \{\ +. ie '\\*[$TOC_AUTHORS]'' \{\ +. as $TOC_TITLE_ITEM /\\|\\*[$AUTHOR_1]\\| +. \} +. el \{\ +. as $TOC_TITLE_ITEM /\\|\\*[$TOC_AUTHORS]\\| +. rm $TOC_AUTHORS +. \} +. \} +.\" Note the use of \!, which transparently embeds the macros used +.\" in the TOC_ENTRIES diversion. The elements they control must be +.\" processed literally when the diversion is output. +. ev TOC_EV +. da TOC_ENTRIES +. if \\n[#PRINT_STYLE]=1 \{\ +\!. fam C +\!. ft R +\!. ps 12 +. \} +. if \\n[#PRINT_STYLE]=2 \{\ +\!. FAMILY \\*[$TOC_TITLE_FAM] +\!. FT \\*[$TOC_TITLE_FT] +\!. PT_SIZE \\n[#TOC_PS]u\\*[$TOC_TITLE_SIZE_CHANGE] +. \} +\!. TRAP OFF +. ie \\n[#PRINT_STYLE]=1 \{\ +\!. PAD "\\*[$TOC_TITLE_ITEM]\\*[$TOC_PN_TYPEWRITE]" +. \} +. el \{\ +\!. PAD "\\h'\\n[#TOC_TITLE_INDENT]u'\\*[$TOC_TITLE_ITEM]\\*[$TOC_PN]" +. \} +\!. EOL +\!. ST 100 L +\!. ST 101 R +. if \\n[#PRINT_STYLE]=2 \{\ +\!. FAMILY \\*[$TOC_PN_FAM] +\!. FT \\*[$TOC_PN_FT] +\!. PT_SIZE \\n[#TOC_PS]u\\*[$TOC_PN_SIZE_CHANGE] +. \} +\!. TAB 100 +\!. PRINT \\*[LEADER] +\!. TN +\!. TRAP +\!. PRINT \\n[#TOC_ENTRY_PN] +\!. TQ +. di +. ev +. \} +. el \{\ +. nr #FIRST_DOC_TITLE_PN \\n%+\\n[#PAGE_NUM_ADJ] +. af #FIRST_DOC_TITLE_PN \\g[#PAGENUMBER] +. nr #FIRST_DOC_TOC_PN_PADDING \\n[#TOC_PN_PADDING] +. \} +.\" End TITLE collection +. if \\n[#PRINT_PAGENUM_ON_PAGE_1] \{\ +. sp |\\n[#HEADER_MARGIN]u +. PRINT_PAGE_NUMBER +. \} +. rr #COLLATE +. rr #PAGINATION_STATE +.\" End collate stuff +. ie \\n[#DOC_HEADER]=0 \{\ +. PRINT \& +. if \\n[#DOC_TYPE]=4 \{\ +. if !'\\n(.z'' \{ .di \} +. \} +. nr #STORED_PP_INDENT \\n[#PP_INDENT] +. PARA_INDENT 0 +. PP +. PARA_INDENT \\n[#STORED_PP_INDENT]u +. rr #STORED_PP_INDENT +. ie r#ADVANCE_FROM_TOP \{\ +. sp |\\n[#ADVANCE_FROM_TOP]u-1v +. if \\n[#ADJ_DOC_LEAD]=1 \{ .SHIM \} +. \} +. el \{ .sp |\\n[#T_MARGIN]u-1v \} +. if \\n[#COLUMNS] \{\ +. mk dc +. nr #COL_NUM 0 1 +. po \\n[#COL_\\n+[#COL_NUM]_L_MARGIN]u +. nr #L_MARGIN \\n(.o +. ll \\n[#COL_L_LENGTH]u +. \} +. nr #PP 0 +. rr #DOC_HEADER +. if r#ADVANCE_FROM_TOP \{ .rr #ADVANCE_FROM_TOP \} +. \} +. el \{\ +. if \\n[#PRINT_STYLE]=2 \{ .LS \\n[#DOC_LEAD]u\\*[$DOCHEADER_LEAD_ADJ] \} +. nr #DOCHEADER_LEAD \\n[#LEAD] +.\" Default +. if \\n[#DOC_TYPE]=1 \{\ +. PRINT \& +. sp |\\n[#DOCHEADER_ADVANCE]u-1v +. ev DOCHEADER +. if \\n[#DOCHEADER_COLOR]=1 \{\ +. nf +\m[\\*[$DOCHEADER_COLOR]] +. EOL +. \} +. L_MARGIN \\n[#DOC_L_MARGIN]u +. LL \\n[#DOC_L_LENGTH]u +. ta \\n(.lu +. if \\n[#PRINT_STYLE]=1 \{\ +. CENTER +. TYPEWRITER +. ie \\n[#SINGLE_SPACE] \{ .vs \\n[#DOC_LEAD]u*2u \} +. el \{ .vs \\n[#DOC_LEAD]u \} +. CAPS +. if !'\\*[$TITLE]'' \{ .UNDERSCORE "\\*[$TITLE]\} +. CAPS OFF +. if !'\\*[$SUBTITLE]'' \{\ +. ie \\n[#SINGLE_SPACE] \{ .vs \\n[#DOC_LEAD]u*2u \} +. el \{ .vs \\n[#DOC_LEAD]u \} +. PRINT \\*[$SUBTITLE] +. \} +. if '\\*[$SUBTITLE]'' \{\ . ALD \\n[#DOC_LEAD]u . \} . ie !'\\*[$AUTHOR_1]'' \{\ @@ -4489,7 +6069,7 @@ . nr #NEXT_AUTHOR 0 1 . while \\n[#AUTHORS]>\\n[#NEXT_AUTHOR] \{\ . PRINT \\*[$AUTHOR_\\n+[#NEXT_AUTHOR]] -. \} +.\} . if \\n[#AUTHOR_LINES]=1 \{\ . ie \\n[#SINGLE_SPACE] \{ .RLD \\n[#DOC_LEAD]u \} . el \{ .ALD \\n[#DOC_LEAD]u/2u \} @@ -4519,7 +6099,7 @@ . \} . ev . \} -\# Chapter +.\" Chapter . if \\n[#DOC_TYPE]=2 \{\ . PRINT \& . sp |\\n[#DOCHEADER_ADVANCE]u-1v @@ -4527,16 +6107,14 @@ . if \\n[#DOCHEADER_COLOR]=1 \{\ . nf \m[\\*[$DOCHEADER_COLOR]] -. EL +. EOL . \} . L_MARGIN \\n[#DOC_L_MARGIN]u . LL \\n[#DOC_L_LENGTH]u . ta \\n(.lu . if \\n[#PRINT_STYLE]=1 \{\ . CENTER -. fam C -. ft R -. ps 12 +. TYPEWRITER . vs \\n[#DOC_LEAD]u . ie '\\*[$CHAPTER]'' \{\ . CAPS @@ -4573,7 +6151,7 @@ . \} . ev . \} -\# Named +.\" Named . if \\n[#DOC_TYPE]=3 \{\ . PRINT \& . sp |\\n[#DOCHEADER_ADVANCE]u-1v @@ -4581,16 +6159,14 @@ . if \\n[#DOCHEADER_COLOR]=1 \{\ . nf \m[\\*[$DOCHEADER_COLOR]] -. EL +. EOL . \} . L_MARGIN \\n[#DOC_L_MARGIN]u . LL \\n[#DOC_L_LENGTH]u . ta \\n(.lu . if \\n[#PRINT_STYLE]=1 \{\ . CENTER -. fam C -. ft R -. ps 12 +. TYPEWRITER . ie \\n[#SINGLE_SPACE] \{ .vs \\n[#DOC_LEAD]u*2u \} . el \{ .vs \\n[#DOC_LEAD]u \} . CAPS @@ -4616,7 +6192,7 @@ . nr #NEXT_AUTHOR 0 1 . while \\n[#AUTHORS]>\\n[#NEXT_AUTHOR] \{\ . PRINT \\*[$AUTHOR_\\n+[#NEXT_AUTHOR]] -. \} +.\} . if \\n[#AUTHOR_LINES]=1 \{\ . ie \\n[#SINGLE_SPACE] \{ .RLD \\n[#DOC_LEAD]u \} . el \{ .ALD \\n[#DOC_LEAD]u/2u \} @@ -4668,22 +6244,83 @@ . \} . \} . \} +. LS \\n[#DOC_LEAD]u +. if \\n[#ADJ_DOC_LEAD]=1 \{ .SHIM \} . QUAD \\*[$DOC_QUAD] -. rr #DOCHEADER_LEAD -. rr #DOCHEADER_LEAD_ADJ +. CLEANUP_DEFAULTS +. nr #START_FOR_FOOTERS 1 +. if \\n[#COLLATED_DOC]=1 \{\ +. if !\\n[MNinit_DEFERRED]=1 \{\ +. MN_INIT rerun +. \} +. \} +. if \\n[#MNinit_DEFERRED]=1 \{\ +. rr #MNinit_DEFERRED +. nr #START_FOR_MNinit 1 +. MN_INIT \\*[$MN-arg1] \\*[$MN-arg2] \\*[$MN-arg3] \\*[$MN-arg4] \\*[$MN-arg5] \\*[$MN-arg6] \\*[$MN-arg7] \\*[$MN-arg8] \\*[$MN-arg9] +. \} +. nr #START_FOR_MNinit 2 +. if !\\n[#DOC_TYPE]=4 \{ .em TERMINATE \} +. if \\n[#LINENUMBERS]=2 \{\ +. NUMBER_LINES RESUME +. nr #LINENUMBERS 1 +. \} +. if \\n[#RUN_ON]=1 \{\ +. if \\n[#FN_MARKER_STYLE]=1 \{ .RUNON_WARNING \} +. if \\n[#FN_MARKER_STYLE]=2 \{ .RUNON_WARNING \} +. \} +.END +\# +.MAC CLEANUP_DEFAULTS END +. nr #START 1 +.\" Family strings for docheader +. rm $AUTHOR_FAM +. rm $CHAPTER_TITLE_FAM +. rm $DOCTYPE_FAM +. rm $SUBTITLE_FAM +. rm $TITLE_FAM +.\" Family strings for cover +. rm $COVER_AUTHOR_FAM +. rm $COVER_CHAPTER_TITLE_FAM +. rm $COVER_COPYRIGHT_FAM +. rm $COVER_DOCTYPE_FAM +. rm $COVER_LEAD_ADJ +. rm $COVER_SUBTITLE_FAM +. rm $COVER_TITLE_FAM +.\" Family strings for doc cover +. rm $DOC_COVER_AUTHOR_FAM +. rm $DOC_COVER_CHAPTER_TITLE_FAM +. rm $DOC_COVER_COPYRIGHT_FAM +. rm $DOC_COVER_DOCTYPE_FAM +. rm $DOC_COVER_LEAD_ADJ +. rm $DOC_COVER_SUBTITLE_FAM +. rm $DOC_COVER_TITLE_FAM +.\" Quad args to copyright and misc +. rm $COVER_COPYRIGHT_QUAD +. rm $COVER_MISC_QUAD +. rm $DOC_COVER_COPYRIGHT_QUAD +. rm $DOC_COVER_MISC_QUAD +.\" Miscellaneous strings +. rm $TOC_TITLE_ITEM +. rm $DOCHEADER_LEAD_ADJ +.\" Various registers +. rr #ADJ_DOC_LEAD +. rr #ADVANCE_FROM_TOP +. rr #AUTHOR_NUM +. rr #AUTHORS +. rr #COVER_LEAD . rr #DEPTH_1 . rr #DEPTH_2 +. rr #DOC_COVER_LEAD . rr #DOCHEADER_ADVANCE -. rr #ADVANCE_FROM_TOP -. rr #DOCHEADER_SPACE_ADJ . rr #DOCHEADER_EXTRA_SPACE -. rr #AUTHORS +. rr #DOCHEADER_LEAD +. rr #DOCHEADER_SPACE_ADJ +. rr #MISC_NUM +. rr #MISCS . rr #NEXT_AUTHOR -. rr #AUTHOR_NUM +. rr #NEXT_MISC . rr #NUM_AUTHORS -. rm $TOC_TITLE_ITEM -. nr #START 1 -. nr #START_FOR_FOOTERS 1 .END \# \# ==================================================================== @@ -4742,328 +6379,6 @@ .END \# \# -\# DOCHEADER COLOR -\# --------------- -\# *Arguments: -\# -\# *Function: -\# Sets register #DOCHEADER_COLOR to 1; defines string -\# $DOCHEADER_COLOR to argument. -\# *Notes: -\# User must define an XCOLOR or NEWCOLOR before using -\# DOCHEADER_COLOR. -\# -.MAC DOCHEADER_COLOR END -. if \\n[#PRINT_STYLE]=1 \{ .return \} -. nr #DOCHEADER_COLOR 1 -. ds $DOCHEADER_COLOR \\$1 -.END -\# -\# -\# TITLE FAMILY -\# ------------ -\# *Argument: -\# -\# *Function: -\# Creates or modifies string $TITLE_FAM. -\# *Notes: -\# Default is same as running text. -\# -.MAC TITLE_FAMILY END -. ds $TITLE_FAM \\$1 -.END -\# -\# -\# TITLE FONT -\# ---------- -\# *Argument: -\# -\# *Function: -\# Creates or modifies string $TITLE_FT. -\# *Notes: -\# Default is bold. -\# -.MAC TITLE_FONT END -. ds $TITLE_FT \\$1 -.END -\# -\# -\# TITLE SIZE -\# ---------- -\# *Argument: -\# <+|- number of points by which to in/decrease title at start -\# of the document (relative to running text)> -\# *Function: -\# Creates string $TITLE_SIZE_CHANGE. -\# *Notes: -\# Must be preceded by a +|- sign, with no space afterwards. -\# Fractional point sizes are allowed. -\# Default is +3.5 for printstyle TYPESET DEFAULT | STORY | NAMED; -\# 4 for TYPESET CHAPTER; +0 for TYPEWRITE. -\# -.MAC TITLE_SIZE END -. ds $TITLE_SIZE_CHANGE \\$1 -.END -\# -\# -\# TITLE COLOR -\# ----------- -\# *Argument: -\# -\# *Function: -\# Sets register #TITLE_COLOR to 1; creates string $TITLE_COLOR -\# *Notes: -\# The color name must be pre-defined with NEWCOLOR or XCOLOR. -\# -.MAC TITLE_COLOR END -. nr #TITLE_COLOR 1 -. ds $TITLE_COLOR \\$1 -.END -\# -\# -\# CHAPTER TITLE FAMILY -\# -------------------- -\# *Argument: -\# -\# *Function: -\# Creates or modifies string $CHAPTER_TITLE_FAM. -\# *Notes: -\# Default isame as running text. -\# -.MAC CHAPTER_TITLE_FAMILY END -. ds $CHAPTER_TITLE_FAM \\$1 -.END -\# -\# -\# CHAPTER TITLE FONT -\# ------------------ -\# *Argument: -\# -\# *Function: -\# Creates or modifies string $CHAPTER_TITLE_FT. -\# *Notes: -\# Default is bold italic for TYPESET; varies in TYPEWRITE between -\# caps and underscored, depending on whether chapter title stands -\# alone or has CHAPTER # above it. -\# -.MAC CHAPTER_TITLE_FONT END -. ds $CHAPTER_TITLE_FT \\$1 -.END -\# -\# -\# CHAPTER TITLE SIZE -\# ------------------ -\# *Argument: -\# <+|- number of points by which to in/decrease title at start -\# of the document (relative to running text)> -\# *Function: -\# Creates string $CHAPTER_TITLE_SIZE_CHANGE. -\# *Notes: -\# Must be preceded by a +|- sign, with no space afterwards. -\# Fractional point sizes are allowed. -\# Default is +4 for printstyle TYPESET -\# -.MAC CHAPTER_TITLE_SIZE END -. ds $CHAPTER_TITLE_SIZE_CHANGE \\$1 -.END -\# -\# -\# SUBTITLE FAMILY -\# --------------- -\# *Argument: -\# -\# *Function: -\# Creates or modifies string $SUBTITLE_FAM. -\# *Notes: -\# Default is same as running text. -\# -.MAC SUBTITLE_FAMILY END -. ds $SUBTITLE_FAM \\$1 -.END -\# -\# -\# SUBTITLE FONT -\# ------------- -\# *Argument: -\# -\# *Function: -\# Creates or modifies string $SUBTITLE_FT. -\# *Notes: -\# Default is same as running text. -\# -.MAC SUBTITLE_FONT END -. ds $SUBTITLE_FT \\$1 -.END -\# -\# -\# SUBTITLE SIZE -\# ------------- -\# *Argument: -\# <+|- number of points by which to in/decrease subtitle at start -\# of the document (relative to running text)> -\# *Function: -\# Creates or modifies string $SUBTITLE_SIZE_CHANGE. -\# *Notes: -\# Must be preceded by a +|- sign with no space afterwards. -\# Fractional point sizes are allowed. -\# Default is +0. -\# -.MAC SUBTITLE_SIZE END -. ds $SUBTITLE_SIZE_CHANGE \\$1 -.END -\# -\# -\# SUBTITLE COLOR -\# -------------- -\# *Argument: -\# -\# *Function: -\# Sets register #SUBTITLE_COLOR to 1; creates string -\# $SUBTITLE_COLOR. -\# *Notes: -\# The color name must be pre-defined with NEWCOLOR or XCOLOR. -\# -.MAC SUBTITLE_COLOR END -. nr #SUBTITLE_COLOR 1 -. ds $SUBTITLE_COLOR \\$1 -.END -\# -\# -\# ATTRIBUTE COLOR -\# --------------- -\# *Argument: -\# -\# *Function: -\# Sets register #ATTRIBUTE_COLOR to 1; creates string $ATTRIBUTE_COLOR -\# *Notes: -\# The color name must be pre-defined with NEWCOLOR or XCOLOR. -\# -.MAC ATTRIBUTE_COLOR END -. nr #ATTRIBUTE_COLOR 1 -. ds $ATTRIBUTE_COLOR \\$1 -.END -\# -\# -\# AUTHOR FAMILY -\# ------------- -\# *Argument: -\# -\# *Function: -\# Creates or modifies string $AUTHOR_FAM. -\# *Notes: -\# Default is same as running text. -\# -.MAC AUTHOR_FAMILY END -. ds $AUTHOR_FAM \\$1 -.END -\# -\# -\# AUTHOR FONT -\# ----------- -\# *Argument: -\# -\# *Function: -\# Creates or modifies string $AUTHOR_FT. -\# *Notes: -\# Default is italic. -\# -.MAC AUTHOR_FONT END -. ds $AUTHOR_FT \\$1 -.END -\# -\# -\# AUTHOR SIZE -\# ----------- -\# *Argument: -\# <+|- number of points by which to in/decrease author at start -\# of the document> -\# *Function: -\# Creates or modifies string $AUTHOR_SIZE_CHANGE. -\# *Notes: -\# Must be preceded by a +|- sign with no space afterwards. -\# Fractional point sizes are allowed. -\# Default is same as running text. -\# -.MAC AUTHOR_SIZE END -. ds $AUTHOR_SIZE_CHANGE \\$1 -.END -\# -\# -\# AUTHOR COLOR -\# ------------ -\# *Argument: -\# -\# *Function: -\# Sets register #AUTHOR_COLOR to 1; creates string $AUTHOR_COLOR -\# *Notes: -\# The color name must be pre-defined with NEWCOLOR or XCOLOR. -\# -.MAC AUTHOR_COLOR END -. nr #AUTHOR_COLOR 1 -. ds $AUTHOR_COLOR \\$1 -.END -\# -\# -\# DOCTYPE FAMILY -\# -------------- -\# *Argument: -\# -\# *Function: -\# Creates or modifies string $DOCTYPE_FAM. -\# *Notes: -\# Default is same as running text. -\# -.MAC DOCTYPE_FAMILY END -. ds $DOCTYPE_FAM \\$1 -.END -\# -\# -\# DOCTYPE FONT -\# ------------ -\# *Argument: -\# -\# *Function: -\# Creates or modifies string $DOCTYPE_FT. -\# *Notes: -\# Default is bold italic. -\# -.MAC DOCTYPE_FONT END -. ds $DOCTYPE_FT \\$1 -.END -\# -\# -\# DOCTYPE SIZE -\# ------------- -\# *Argument: -\# <+|- number of points by which to in/decrease the document -\# type string (relative to running text)> -\# *Function: -\# Creates or modifies string $DOCTYPE_SIZE_CHANGE. -\# *Notes: -\# Must be preceded by a +|- sign with no space afterwards. -\# Fractional point sizes are allowed. -\# Default is +3 for TYPESET; 0 for TYPEWRITE. -\# -.MAC DOCTYPE_SIZE END -. ds $DOCTYPE_SIZE_CHANGE \\$1 -.END -\# -\# -\# DOCTYPE COLOR -\# ------------- -\# *Argument: -\# -\# *Function: -\# Sets register #DOCTYPE_COLOR to 1; creates string $DOCTYPE_COLOR -\# *Notes: -\# The color name must be pre-defined with NEWCOLOR or XCOLOR. -\# -.MAC DOCTYPE_COLOR END -. nr #DOCTYPE_COLOR 1 -. ds $DOCTYPE_COLOR \\$1 -.END -\# -\# \# DOCUMENT LEFT MARGIN \# -------------------- \# *Argument: @@ -5125,8 +6440,8 @@ \# .MAC DOC_FAMILY END . br -. ds $DOC_FAM \\$1 -. FAMILY \\*[$DOC_FAM] +. ds $DOC_FAM \\$1 +. ds $FAMILY \\*[$DOC_FAM] . TITLE_FAMILY \\*[$DOC_FAM] . SUBTITLE_FAMILY \\*[$DOC_FAM] . AUTHOR_FAMILY \\*[$DOC_FAM] @@ -5137,7 +6452,7 @@ . BLOCKQUOTE_FAMILY \\*[$DOC_FAM] . EPIGRAPH_FAMILY \\*[$DOC_FAM] . HDRFTR_FAMILY \\*[$DOC_FAM] -. PAGENUM_FAMILY \\*[$DOC_FAM] +. FOOTNOTE_FAMILY \\*[$DOC_FAM] .END \# \# @@ -5195,8 +6510,13 @@ \# on #B_MARGIN. \# .MAC DOC_LEAD_ADJUST END -. ie '\\$1'' \{ .nr #ADJ_DOC_LEAD 1 \} -. el \{ .nr #ADJ_DOC_LEAD 0 \} +. ie '\\$1'' \{\ +. nr #ADJ_DOC_LEAD 1 +. \} +. el \{\ +. nr #ADJ_DOC_LEAD 0 +. nr #DOC_LEAD_ADJUST_OFF 1 +. \} .END \# \# @@ -5217,18 +6537,19 @@ .MAC PROCESS_SHIM END . while \\n+[#LEGAL_BASELINE]<\\n[#CURRENT_V_POS] \{\ . -. \} +.\} . nr #SHIM \\n[#LEGAL_BASELINE]-\\n[#CURRENT_V_POS] .END \# +\# .MAC SHIM END -. nr #CURRENT_V_POS \\n(.d . nr #LEGAL_BASELINE \\n[#T_MARGIN]-1v \\n[#DOC_LEAD] +. if !r#CURRENT_V_POS \{ .nr #CURRENT_V_POS \\n(.d \} . ie r#ADVANCE_FROM_TOP \{\ . ie \\n[#CURRENT_V_POS]<(\\n[#T_MARGIN]-1v) \{\ . while \\n-[#LEGAL_BASELINE]>\\n[#CURRENT_V_POS] \{\ . -. \} +.\} . nr #LEGAL_BASELINE +\\n[#DOC_LEAD] . nr #SHIM \\n[#LEGAL_BASELINE]-\\n[#CURRENT_V_POS] . \} @@ -5240,27 +6561,10 @@ . PROCESS_SHIM . \} . ALD \\n[#SHIM]u +. rr #CURRENT_V_POS .END \# \# -\# DOCUMENT QUAD -\# ------------- -\# *Arguments: -\# L | LEFT | R | RIGHT | C | CENTER | CENTRE | J | JUSTIFY -\# *Function: -\# Creates or modifies string $DOC_QUAD. -\# *Notes: -\# While QUAD (from the typesetting macros) can be used before START -\# to change the default document quad, DOC_QUAD *must* be used after -\# the START macro has been invoked. -\# -\# Default is LEFT for printstyle TYPEWRITE, JUSTIFY for printstyle -\# TYPESET. -\# -.MAC DOC_QUAD END -. ds $DOC_QUAD \\$1 -. QUAD \\*[$DOC_QUAD] -.END \# \# ==================================================================== \# @@ -5339,21 +6643,6 @@ . CAPS OFF .END \# -\# FINIS COLOR -\# ----------- -\# *Arguments: -\# -\# *Function: -\# Defines string $FINIS_COLOR to argument. -\# *Notes: -\# User must define an XCOLOR or NEWCOLOR before using -\# FINIS_COLOR. -\# -.MAC FINIS_COLOR END -. if \\n[#PRINT_STYLE]=1 \{ .return \} -. ds $FINIS_COLOR \\$1 -.END -\# \# \# ==================================================================== \# @@ -5380,125 +6669,48 @@ \# \# +++EPIGRAPHS+++ \# -\# EPIGRAPH FAMILY +\# EPIGRAPH INDENT \# --------------- \# *Argument: -\# +\# \# *Function: -\# Creates or modifies string $EPI_FAM. +\# Creates or modifies register #EPI_OFFSET_VALUE. \# *Notes: -\# Default is same as running text. +\# Default is 2 for TYPEWRITE, 3 for TYPESET. \# -.MAC EPIGRAPH_FAMILY END -. ds $EPI_FAM \\$1 +.MAC EPIGRAPH_INDENT END +. nr #EPI_OFFSET_VALUE \\$1 .END \# \# -\# EPIGRAPH FONT -\# ------------- +\# EPIGRAPH AUTOLEAD +\# ----------------- \# *Argument: -\# +\# \# *Function: -\# Creates or modifies string $EPI_FT. +\# Creates or modifies register #EPI_AUTOLEAD. \# *Notes: -\# Default is same as running text. +\# Default is 2 (for TYPESET; TYPEWRITE doesn't require this). \# -.MAC EPIGRAPH_FONT END -. ds $EPI_FT \\$1 +.MAC EPIGRAPH_AUTOLEAD END +. nr #EPI_AUTOLEAD \\$1 .END \# \# -\# EPIGRAPH SIZE -\# ------------- -\# *Argument: -\# <-|+ number of points by which to de/increase point size of epigraphs -\# (relative to running text)> +\# EPIGRAPH +\# -------- +\# *Arguments: +\# BLOCK | \# *Function: -\# Creates or modifies string $EPI_SIZE_CHANGE. +\# Places an epigraph before the document's text, after the +\# document header, or after a HEAD. \# *Notes: -\# Must be preceded by a - or + sign with no space afterwards. -\# Fractional point sizes are allowed. Default -1.5 for printstyle -\# TYPESET; +0 for TYPEWRITE. +\# #EPIGRAPH 1 = centered; 2 = block \# -.MAC EPIGRAPH_SIZE END -. ds $EPI_SIZE_CHANGE \\$1 -.END -\# -\# -\# EPIGRAPH COLOR -\# -------------- -\# *Arguments: -\# -\# *Function: -\# Sets register #EPI_COLOR to 1; defines string -\# $EPI_COLOR to argument. -\# *Notes: -\# User must define an XCOLOR or NEWCOLOR before using -\# EPI_COLOR. -\# -.MAC EPIGRAPH_COLOR END -. if \\n[#PRINT_STYLE]=1 \{ .return \} -. nr #EPI_COLOR 1 -. ds $EPI_COLOR \\$1 -.END -\# -\# -\# EPIGRAPH QUAD -\# ------------- -\# *Arguments: -\# L | LEFT | J | JUSTIFY -\# *Function: -\# Creates or modifies string $EPI_QUAD. -\# *Notes: -\# Default is $DOC_QUAD when BLOCK argument is passed to EPIGRAPH. -\# -.MAC EPIGRAPH_QUAD END -. ds $EPI_QUAD \\$1 -.END -\# -\# -\# EPIGRAPH INDENT -\# --------------- -\# *Argument: -\# -\# *Function: -\# Creates or modifies register #EPI_OFFSET_VALUE. -\# *Notes: -\# Default is 2 for TYPEWRITE, 3 for TYPESET. -\# -.MAC EPIGRAPH_INDENT END -. nr #EPI_OFFSET_VALUE \\$1 -.END -\# -\# -\# EPIGRAPH AUTOLEAD -\# ----------------- -\# *Argument: -\# -\# *Function: -\# Creates or modifies register #EPI_AUTOLEAD. -\# *Notes: -\# Default is 2 (for TYPESET; TYPEWRITE doesn't require this). -\# -.MAC EPIGRAPH_AUTOLEAD END -. nr #EPI_AUTOLEAD \\$1 -.END -\# -\# -\# EPIGRAPH -\# -------- -\# *Arguments: -\# BLOCK | -\# *Function: -\# Places an epigraph before the document's text, after the -\# document header, or after a HEAD. -\# *Notes: -\# #EPIGRAPH 1 = centered; 2 = block -\# -\# By default, epigraphs are centered, allowing the user -\# to input them on a line per line basis. To change this -\# behaviour, the user can supply the argument BLOCK, which -\# will produce indented, filled text similar to BLOCKQUOTE. +\# By default, epigraphs are centered, allowing the user +\# to input them on a line per line basis. To change this +\# behaviour, the user can supply the argument BLOCK, which +\# will produce indented, filled text similar to BLOCKQUOTE. \# \# If a block epigraph contains more than one para, ALL paras of \# the epigraph must be preceded by PP. Otherwise, PP is optional. @@ -5506,6 +6718,10 @@ .MAC EPIGRAPH END . nr #PP_STYLE 2 . nr #Q_PP 0 +. if \\n[#LINENUMBERS]=1 \{\ +. NUMBER_LINES OFF +. nr #LINENUMBERS 2 +. \} . if \\n[#START] \{\ . if \\n[#PRINT_STYLE]=1 \{\ . if \\n[#AUTHOR_LINES]=1 \{ .ALD \\n[#DOC_LEAD]u \} @@ -5514,6 +6730,7 @@ . ie '\\$1'' \{\ . nr #EPIGRAPH 1 . ev EPIGRAPH +. nr #IN_DIVER 1 . ll \\n[#L_LENGTH]u . ta \\n(.lu . CHECK_INDENT @@ -5547,13 +6764,16 @@ . if \\n[#EPI_COLOR]=1 \{\ . nf \m[\\*[$EPI_COLOR]] -. EL +. EOL . \} . AUTOLEAD \\n[#EPI_AUTOLEAD] . nr #EPI_LEAD \\n[#LEAD] . nr #EPI_LEAD_DIFF \\n[#DOC_LEAD]-\\n[#EPI_LEAD] . \} . di EPI_TEXT +. nr #DIVERSIONS_HY_MARGIN (p;\\n[.ps]u*2.75)/1000 +. HY_SET 1 \\n[#DIVERSIONS_HY_MARGIN]u (\\n[#PT_SIZE]u/1000u/8u)p +. hy 14 . nr #EPI_ACTIVE 1 . \} . el \{\ @@ -5602,11 +6822,13 @@ . if \\n[#EPI_COLOR]=1 \{\ . nf \m[\\*[$EPI_COLOR]] -. EL +. EOL . \} . AUTOLEAD \\n[#EPI_AUTOLEAD] . QUAD \\*[$EPI_QUAD] -. HY +. nr #DIVERSIONS_HY_MARGIN (p;\\n[.ps]u*2.75)/1000 +. HY_SET 1 \\n[#DIVERSIONS_HY_MARGIN]u (\\n[#PT_SIZE]u/1000u/8u)p +. hy 14 . nr #EPI_LEAD \\n[#LEAD] . nr #EPI_LEAD_DIFF \\n[#DOC_LEAD]-\\n[#EPI_LEAD] . di EPI_TEXT @@ -5636,15 +6858,27 @@ .MAC DO_EPIGRAPH END . br . di +. rr #IN_DIVER +. if \\n[#RESET_FN_COUNTERS]=2 \{\ +. if !\\n[#FN_COUNT]=1 \{\ +. if ((\\n[#PAGE_LENGTH]+\\n[#VARIABLE_FOOTER_POS])+\\n[#DIVER_DEPTH])>(\\n[#PAGE_LENGTH]+\\n[#VARIABLE_FOOTER_POS]) \{\ +. DIVER_FN_2_POST +. rr #RESET_FN_COUNTERS +. \} +. \} +. \} +. nr #SAVED_FN_NUMBER \\n[#FN_NUMBER] +. nr #DONE_ONCE 0 1 . REMOVE_INDENT . ev . nr #EPI_DEPTH \\n[#DIVER_DEPTH]-\\n[#EPI_LEAD] . nr #EPI_LINES \\n[#EPI_DEPTH]/\\n[#EPI_LEAD] . ie \\n[#START] \{\ +. RLD \\n[#SHIM]u . nr #EPI_WHITESPACE (\\n[#DOC_LEAD]*\\n[#EPI_LINES])-\\n[#EPI_DEPTH] . while \\n[#EPI_WHITESPACE]>\\n[#DOC_LEAD] \{\ . nr #EPI_WHITESPACE -\\n[#DOC_LEAD] -. \} +.\} . if \\n[#PRINT_STYLE]=2 \{\ . RLD \\n[#DOC_LEAD]u . if \\n[#EPI_WHITESPACE]<\\n[#DOC_LEAD] \{\ @@ -5661,7 +6895,7 @@ . nr #EPI_WHITESPACE (\\n[#DOC_LEAD]*\\n[#EPI_LINES])-\\n[#EPI_DEPTH] . while \\n[#EPI_WHITESPACE]>\\n[#DOC_LEAD] \{\ . nr #EPI_WHITESPACE -\\n[#DOC_LEAD] -. \} +.\} . ie \\n[#PRINT_STYLE]=1 \{\ . if \\n[#EPI_WHITESPACE]=\\n[#DOC_LEAD] \{ .ALD \\n[#EPI_WHITESPACE]u/2u \} . \} @@ -5673,17 +6907,18 @@ . ALD \\n[#EPI_LEAD_DIFF]u+(\\n[#EPI_WHITESPACE]u/2u)-\\n[#DOC_LEAD]u . \} . \} +. if \\n[#DIVER_FN]=2 \{ .rr #DIVER_FN \} . \} . el \{\ . nr #EPI_LINES_TO_TRAP 0 1 . while \\n[#EPI_LEAD]*\\n+[#EPI_LINES_TO_TRAP]<\\n[#TRAP_DISTANCE] \{\ . nr #LOOP 1 -. \} +.\} . nr #EPI_LINES_TO_TRAP -1 . nr #EPI_WHITESPACE (\\n[#EPI_LINES_TO_TRAP]*\\n[#DOC_LEAD])-(\\n[#EPI_LINES_TO_TRAP]*\\n[#EPI_LEAD]) . while \\n[#EPI_WHITESPACE]>\\n[#DOC_LEAD] \{\ . nr #EPI_WHITESPACE -\\n[#DOC_LEAD] -. \} +.\} . if \\n[#EPI_WHITESPACE]<\\n[#DOC_LEAD] \{ .ALD \\n[#EPI_WHITESPACE]u \} . if \\n[#EPI_WHITESPACE]>\\n[#DOC_LEAD] \{ .ALD \\n[#EPI_WHITESPACE]u-\\n[#DOC_LEAD]u \} . \} @@ -5712,6 +6947,7 @@ . ie \\n[#EPI_LINES]%2=1 \{ .ALD \\n[#DOC_LEAD]u \} . el \{ .ALD \\n[#DOC_LEAD]u/2u \} . \} +. SHIM . \} . if \\n[#PRINT_STYLE]=2 \{\ . if \\n[#EPI_WHITESPACE]<\\n[#DOC_LEAD] \{\ @@ -5720,6 +6956,7 @@ . if \\n[#EPI_WHITESPACE]>\\n[#DOC_LEAD] \{\ . ALD (\\n[#EPI_WHITESPACE]u/2u)-\\n[#DOC_LEAD]u . \} +. SHIM . \} . \} . el \{\ @@ -5730,7 +6967,7 @@ . nr #EPI_WHITESPACE (\\n[#EPI_LINES_TO_END]*\\n[#DOC_LEAD])-(\\n[#EPI_LINES_TO_END]*\\n[#EPI_LEAD]) . while \\n[#EPI_WHITESPACE]>\\n[#DOC_LEAD] \{\ . nr #EPI_WHITESPACE -\\n[#DOC_LEAD] -. \} +.\} . ALD \\n[#EPI_WHITESPACE]u-(\\n[#DOC_LEAD]u-\\n[#EPI_LEAD]u) . \} . el \{\ @@ -5749,12 +6986,12 @@ . \} . el \{\ . nr #EPI_LINES_TO_END \\n[#EPI_LINES]-\\n[#EPI_LINES_TO_TRAP] -. if \\n[#LOOP] \{. nr #EPI_LINES_TO_END +1 \} +. if \\n[#LOOP] \{ .nr #EPI_LINES_TO_END +1 \} . rr #LOOP . nr #EPI_WHITESPACE (\\n[#EPI_LINES_TO_END]*\\n[#DOC_LEAD])-(\\n[#EPI_LINES_TO_END]*\\n[#EPI_LEAD]) . while \\n[#EPI_WHITESPACE]>\\n[#DOC_LEAD] \{\ . nr #EPI_WHITESPACE -\\n[#DOC_LEAD] -. \} +.\} . ALD \\n[#EPI_WHITESPACE]u-(\\n[#DOC_LEAD]u-\\n[#EPI_LEAD]u) . if \\n[#PRINT_STYLE]=1 \{\ . if !\\n[#SINGLE_SPACE] \{\ @@ -5782,6 +7019,10 @@ . mk dc . \} . \} +. if \\n[#LINENUMBERS]=2 \{\ +. NUMBER_LINES RESUME +. nr #LINENUMBERS 1 +. \} .END \# \# ==================================================================== @@ -5796,21 +7037,11 @@ \# Deposits --END-- at the end of a document. \# .MAC FINIS END +. br . ev FINIS . evc 0 -. nr #FINIS 1 . if \\n[#TAB_ACTIVE] \{ .TQ \} . if \\n[#INDENT_ACTIVE] \{ .IQ CLEAR \} -. if \\n[#FOOTERS_ON] \{\ -. nr #FOOTERS_WERE_ON 1 -. FOOTERS OFF -. \} -. if \\n[#PAGINATE] \{\ -. if \\n[#PAGE_NUM_V_POS]=2 \{\ -. nr #PAGINATION_WAS_ON 1 -. PAGINATION OFF -. \} -. \} . nr #EM_ADJUST (1m/8) . if \\n[#COLUMNS] \{\ . po \\n[#COL_\\n[#COL_NUM]_L_MARGIN]u @@ -5820,7 +7051,10 @@ . CENTER . if \\n[#PRINT_STYLE]=1 \{ .PRINT "--\\*[$FINIS_STRING]--\} . if \\n[#PRINT_STYLE]=2 \{\ -. PRINT "\m[\\*[$FINIS_COLOR]]\v'-\\n[#EM_ADJUST]u'\(em\v'+\\n[#EM_ADJUST]u'\\*[$FINIS_STRING]\v'-\\n[#EM_ADJUST]u'\*[FU1]\(em\m[] +. ie \\n[#FINIS_COLOR] \{\ +. PRINT "\m[\\*[$FINIS_COLOR]]\v'-\\n[#EM_ADJUST]u'\(em\v'+\\n[#EM_ADJUST]u'\\*[$FINIS_STRING]\v'-\\n[#EM_ADJUST]u'\*[FU1]\(em\m[] +. \} +. el \{ .PRINT \v'-\\n[#EM_ADJUST]u'\(em\v'+\\n[#EM_ADJUST]u'\\*[$FINIS_STRING]\v'-\\n[#EM_ADJUST]u'\*[FU1]\(em\m[] \} . \} . ev .END @@ -5836,65 +7070,6 @@ .ds PAGE# \En[#PAGENUMBER] \# \# -\# HDRFTR FAMILY -\# ------------- -\# *Argument: -\# -\# *Function: -\# Creates or modifies string $HDRFTR_FAM. -\# *Notes: -\# Default is same as running text. -\# -.MAC HDRFTR_FAMILY END -. ds $HDRFTR_FAM \\$1 -.END -\# -\# -\# HDRFTR SIZE -\# ----------- -\# *Argument: -\# <+|-number of points by which to in/decrease point size of -\# header/footers (relative to running text)> -\# *Function: -\# Creates or modifies string $HDRFTR_SIZE_CHANGE. -\# *Notes: -\# Must be preceded by a +|- sign. No space afterwards. -\# Fractional point sizes are allowed. Default is +0. -\# -\# By default, header/footers print the author .5 points smaller -\# than the base point size of running text, center titles -\# (Chapter, Draft, Revision, etc.) .5 points smaller -\# than running text (in italics), and the document title 2 full -\# points smaller than running text (in caps). The HDRFTR_SIZE -\# macro changes the overall size for all three parts while -\# maintaining the internal size changes. -\# -\# In other words, if the user likes the header/footers but wants -\# them a bit bigger or a bit smaller, s/he should use HDRFTR_SIZE. -\# -.MAC HDRFTR_SIZE END -. ds $HDRFTR_SIZE_CHANGE \\$1 -.END -\# -\# -\# HDRFTR COLOR -\# ------------ -\# *Arguments: -\# -\# *Function: -\# Sets register #HDRFTR_COLOR to 1; defines string $HDRFTR_COLOR to -\# argument. -\# *Notes: -\# User must define an XCOLOR or NEWCOLOR before using -\# HDRFTR_COLOR. -\# -.MAC HDRFTR_COLOR END -. if \\n[#PRINT_STYLE]=1 \{ .return \} -. nr #HDRFTR_COLOR 1 -. ds $HDRFTR_COLOR \\$1 -.END -\# -\# \# HDRFTR RULE GAP \# --------------- \# *Argument: @@ -5938,64 +7113,6 @@ .END \# \# -\# HDRFTR LEFT FAMILY -\# ------------------ -\# *Argument: -\# -\# *Function: -\# Creates or modifies string $HDRFTR_LEFT_FAM. -\# -.MAC HDRFTR_LEFT_FAMILY END -. ds $HDRFTR_LEFT_FAM \\$1 -.END -\# -\# -\# HDRFTR LEFT FONT -\# ---------------- -\# *Argument: -\# -\# *Function: -\# Creates or modifies string $HDRFTR_LEFT_FT. -\# -.MAC HDRFTR_LEFT_FONT END -. ds $HDRFTR_LEFT_FT \\$1 -.END -\# -\# -\# HDRFTR LEFT SIZE -\# ---------------- -\# *Argument: -\# <+|- number of points to in/decrease size of left string in -\# header/footers (relative to running text)> -\# *Function: -\# Creates or modifies string HDRFTR_LEFT_SIZE_CHANGE. -\# *Notes: -\# Must be preceded by a +|- sign. No space afterwards. -\# Fractional point sizes are allowed. -\# Default is -.5 for printstyle TYPESET; if all caps, -2 -\# Has no effect in TYPEWRITE. -\# -.MAC HDRFTR_LEFT_SIZE END -. ds $HDRFTR_LEFT_SIZE_CHANGE \\$1 -.END -\# -\# -\# HDRFTR LEFT COLOR -\# ----------------- -\# *Argument: -\# -\# *Function: -\# Sets register #HDRFTR_LEFT_COLOR to 1; creates string -\# $HDRFTR_LEFT_COLOR -\# *Notes: -\# The color name must be pre-defined with NEWCOLOR or XCOLOR. -\# -.MAC HDRFTR_LEFT_COLOR END -. nr #HDRFTR_LEFT_COLOR 1 -. ds $HDRFTR_LEFT_COLOR \\$1 -.END -\# -\# \# HDRFTR LEFT CAPS \# ---------------- \# *Argument: @@ -6052,64 +7169,6 @@ .END \# \# -\# HDRFTR CENTER FAMILY -\# -------------------- -\# *Argument: -\# -\# *Function: -\# Creates or modifies string $HDRFTR_CENTER_FAM. -\# -.MAC HDRFTR_CENTER_FAMILY END -. ds $HDRFTR_CENTER_FAM \\$1 -.END -\# -\# -\# HDRFTR CENTER FONT -\# ------------------ -\# *Argument: -\# -\# *Function: -\# Creates or modifies string $HDRFTR_CENTER_FT. -\# -.MAC HDRFTR_CENTER_FONT END -. ds $HDRFTR_CENTER_FT \\$1 -.END -\# -\# -\# HDRFTR CENTER SIZE -\# ------------------ -\# *Argument: -\# <+|- number of points to in/decrease size of centre string in -\# header/footers (relative to header/footer size)> -\# *Function: -\# Creates string HDRFTR_CENTER_SIZE_CHANGE. -\# *Notes: -\# Must be preceded by a +|- sign. No space afterwards. -\# Fractional point sizes are allowed. -\# Default is -.5 for printstyle TYPESET; if all caps, -2 -\# Has no effect in TYPEWRITE. -\# -.MAC HDRFTR_CENTER_SIZE END -. ds $HDRFTR_CENTER_SIZE_CHANGE \\$1 -.END -\# -\# -\# HDRFTR CENTER COLOR -\# ------------------- -\# *Argument: -\# -\# *Function: -\# Sets register #HDRFTR_CENTER_COLOR to 1; creates string -\# $HDRFTR_CENTER_COLOR -\# *Notes: -\# The color name must be pre-defined with NEWCOLOR or XCOLOR. -\# -.MAC HDRFTR_CENTER_COLOR END -. nr #HDRFTR_CENTER_COLOR 1 -. ds $HDRFTR_CENTER_COLOR \\$1 -.END -\# -\# \# HDRFTR CENTER CAPS \# ------------------ \# *Argument: @@ -6201,64 +7260,6 @@ .END \# \# -\# HDRFTR RIGHT FAMILY -\# ------------------- -\# *Argument: -\# -\# *Function: -\# Creates or modifies string $HDRFTR_RIGHT_FAM. -\# -.MAC HDRFTR_RIGHT_FAMILY END -. ds $HDRFTR_RIGHT_FAM \\$1 -.END -\# -\# -\# HDRFTR RIGHT FONT -\# ----------------- -\# *Argument: -\# -\# *Function: -\# Creates or modifies string $HDRFTR_RIGHT_FT. -\# -.MAC HDRFTR_RIGHT_FONT END -. ds $HDRFTR_RIGHT_FT \\$1 -.END -\# -\# -\# HDRFTR RIGHT SIZE -\# ----------------- -\# *Argument: -\# <+|- number of points to in/decrease size of right string in -\# header/footers (relative to header/footer size)> -\# *Function: -\# Creates or modifies string HDRFTR_RIGHT_SIZE_CHANGE. -\# *Notes: -\# Must be preceded by a +|- sign. No space afterwards. -\# Fractional point sizes are allowed. -\# Default is -2 for printstyle TYPESET if all caps; otherwise -.5 -\# Has no effect in TYPEWRITE. -\# -.MAC HDRFTR_RIGHT_SIZE END -. ds $HDRFTR_RIGHT_SIZE_CHANGE \\$1 -.END -\# -\# -\# HDRFTR RIGHT COLOR -\# ------------------ -\# *Argument: -\# -\# *Function: -\# Sets register #HDRFTR_RIGHT_COLOR to 1; creates string -\# $HDRFTR_RIGHT_COLOR -\# *Notes: -\# The color name must be pre-defined with NEWCOLOR or XCOLOR. -\# -.MAC HDRFTR_RIGHT_COLOR END -. nr #HDRFTR_RIGHT_COLOR 1 -. ds $HDRFTR_RIGHT_COLOR \\$1 -.END -\# -\# \# HDRFTR RIGHT CAPS \# ----------------- \# *Argument: @@ -6280,31 +7281,14 @@ .END \# \# -\# HDRFTR RULE COLOR -\# ----------------- -\# *Arguments: -\# -\# *Function: -\# Sets register #HDRFTR_COLOR to 1; defines string -\# $HDRFTR_RULE_COLOR to argument. -\# *Notes: -\# User must define an XCOLOR or NEWCOLOR before using -\# HDRFTR_RULE_COLOR. -\# -.MAC HDRFTR_RULE_COLOR END -. if \\n[#PRINT_STYLE]=1 \{ .return \} -. nr #HDRFTR_RULE_COLOR 1 -. ds $HDRFTR_RULE_COLOR \\$1 -.END -\# -\# \# HDRFTR RULE \# ----------- \# *Arguments: \# | \# *Function: \# If invoked via the alias HDRFTR_RULE_INTERNAL in HDRFTR, prints a rule -\# under the header/footer. Otherwise, turns HDRFTR_RULE on or off. +\# under the header/over the footer. Otherwise, turns HDRFTR_RULE +\# on or off. \# .MAC HDRFTR_RULE END \"To print rule under header/over footer. . ie '\\$0'HDRFTR_RULE_INTERNAL' \{\ @@ -6404,21 +7388,23 @@ \# Creates or modifies register #SWITCH_HDRFTR, used to switch \# default location of HDRFTR_LEFT and HDRFTR_RIGHT. \# *Notes: -\# Typically, the author string appears at the left of header/footers, -\# and the title string appears at the right. This switches the -\# location of the two. Useful in conjuction with RECTO_VERSO to -\# tweak switches on alternate pages to come out as the user wishes. -\# The assumption of RECTO_VERSO is that the first page of the document -\# (recto) is odd, and even though it has no header/footer, if it did have one, -\# it would print as AUTHOR...CENTER...TITLE (or whatever strings -\# the user has supplied for HDRFTR_LEFT/RIGHT), meaning that the -\# next page, which does have a header/footer, will come out as -\# TITLE...CENTER...AUTHOR (or whatever strings the user has -\# supplied for HDRFTR_LEFT/RIGHT). SWITCH_HDRFTRS allows the user -\# to get the desired string in the desired place on the desired -\# recto/verso page. \# -\# Default is OFF. +.ig +Typically, the author string appears at the left of header/footers, +and the title string appears at the right. This switches the +location of the two. Useful in conjuction with RECTO_VERSO to tweak +switches on alternate pages to come out as the user wishes. The +assumption of RECTO_VERSO is that the first page of the document +(recto) is odd, and even though it has no header/footer, if it did +have one, it would print as AUTHOR...CENTER...TITLE (or whatever +strings the user has supplied for HDRFTR_LEFT/RIGHT), meaning that +the next page, which does have a header/footer, will come out as +TITLE...CENTER...AUTHOR (or whatever strings the user has supplied +for HDRFTR_LEFT/RIGHT). SWITCH_HDRFTRS allows the user to get the +desired string in the desired place on the desired recto/verso page. + +Default is OFF. +.. \# .MAC SWITCH_HDRFTR END . ie '\\$1'' \{ .nr #SWITCH_HDRFTR 1 \} @@ -6604,7 +7590,7 @@ . if \\n[#HDRFTR_COLOR]=1 \{\ . nf \m[\\*[$HDRFTR_COLOR]] -. EL +. EOL . \} . fam \\*[$HDRFTR_LEFT_FAM] . ft \\*[$HDRFTR_LEFT_FT] @@ -6712,6 +7698,7 @@ . if \\n[#HDRFTR_RULE] \{\ . HDRFTR_RULE_INTERNAL . \} +. br .END \# \# @@ -6743,7 +7730,7 @@ . if \\n[#USERDEF_HDRFTR_RECTO_QUAD]=2 \{ .CENTER \} . if \\n[#USERDEF_HDRFTR_RECTO_QUAD]=3 \{ .RIGHT \} . PRINT \\*[$USERDEF_HDRFTR_RECTO] -. EL +. EOL . if \\n[#FOOTERS_ON] \{\ . di NULL . SIZESPECS @@ -6757,7 +7744,7 @@ . if \\n[#USERDEF_HDRFTR_VERSO_QUAD]=2 \{ .CENTER \} . if \\n[#USERDEF_HDRFTR_VERSO_QUAD]=3 \{ .RIGHT \} . PRINT \\*[$USERDEF_HDRFTR_VERSO] -. EL +. EOL . if \\n[#FOOTERS_ON] \{\ . di NULL . SIZESPECS @@ -6770,7 +7757,7 @@ . if \\n[#USERDEF_HDRFTR_RECTO_QUAD]=2 \{ .CENTER \} . if \\n[#USERDEF_HDRFTR_RECTO_QUAD]=3 \{ .RIGHT \} . PRINT \\*[$USERDEF_HDRFTR_RECTO] -. EL +. EOL . if \\n[#FOOTERS_ON] \{\ . di NULL . SIZESPECS @@ -6785,7 +7772,7 @@ . if \\n[#USERDEF_HDRFTR_RECTO_QUAD]=2 \{ .CENTER \} . if \\n[#USERDEF_HDRFTR_RECTO_QUAD]=3 \{ .RIGHT \} . PRINT \\*[$USERDEF_HDRFTR_RECTO] -. EL +. EOL . if \\n[#FOOTERS_ON] \{\ . di NULL . SIZESPECS @@ -6863,14 +7850,18 @@ \# event that the user enters .TITLE in caps/lc), I've used \# quad left, quad centre, and quad right to arrange the three bits \# of the header, rather than .tl. This allows the use of the CAPS macro. -\# The downside is that I have to add \\v'-(\\n[#LEAD]u*#) in order +\# The downside is that I have to add \\v'-(\\n[#LEAD]u*) in order \# for -Tlatin1 output to align the header/footer strings on the baseline. \# The console output still isn't brilliant, but at least it's \# comprehensible. \# .MAC HEADER END -. PROCESS_FN_LEFTOVER -. nr #FN_COUNT_FOR_COLS 0 1 +. MNtop +. rr #FROM_FOOTER +. nr #FROM_HEADER 1 +. nr #LAST_FN_COUNT_FOR_COLS \\n[#FN_COUNT_FOR_COLS] +. if \\n[#FN_DEPTH] \{ .PROCESS_FN_LEFTOVER \} +. rr #RULED . if \\n[#RESET_FN_NUMBER] \{ .nr #FN_NUMBER 0 1 \} . po \\n[#DOC_L_MARGIN]u . if \\n[#RECTO_VERSO] \{\ @@ -6910,7 +7901,8 @@ . \} . if \\n[#PRINT_STYLE]=1 \{\ . if \\n[#ENDNOTES]=1 \{\ -. if \\n[#EN_SINGLESPACE] \{\ \"Endnotes s-spaced have different lead +.\" Single-spaced endotes have a different lead +. if \\n[#EN_SINGLESPACE] \{\ . nr #RESTORE_DOC_LEAD \\n[#DOC_LEAD] . nr #DOC_LEAD \\n[#EN_LEAD]u . \} @@ -6959,6 +7951,7 @@ . nr #Q_OFFSET \\n[#L_MARGIN]+(\\n[#PP_INDENT]*\\n[#Q_OFFSET_VALUE]) . po \\n[#Q_OFFSET]u . \} +. ALD \\n[#Q_LEAD_DIFF]u . \} . if \\n[#EPIGRAPH] \{\ . ie \\n[#TAB_ACTIVE] \{ .TAB \\n[#CURRENT_TAB] \} @@ -6980,6 +7973,7 @@ . el \{ .ns \} . ns . if \\n[#COLUMNS] \{\ +. nr #FN_COUNT_FOR_COLS 0 1 . nr #L_MARGIN \\n[#DOC_L_MARGIN] . if \\n[#RECTO_VERSO] \{ .COLUMNS \\n[#NUM_COLS] \\n[#GUTTER]u \} . nr #COL_NUM 0 1 @@ -7000,11 +7994,44 @@ . po \\n[#COL_\\n[#COL_NUM]_L_MARGIN]u+(\\n[#PP_INDENT]u*\\n[#EPI_OFFSET_VALUE]u) . \} . \} +. if \\n[#RESET_FN_COUNTERS]=1 \{\ +. rr #RESET_FN_COUNTERS +. PROCESS_FN_IN_DIVER +. nr #FN_COUNT \\n[#SAVED_FN_COUNT] 1 +. if \\n[#COLUMNS]=1 \{ .nr #FN_COUNT_FOR_COLS \\n[#SAVED_FN_COUNT_FOR_COLS] 1 \} +. ie \\n[#RESET_FN_NUMBER]=1 \{ .nr #FN_NUMBER \\n[#SAVED_FN_NUMBER] 1 \} +. el \{ .nr #FN_NUMBER \\n[#FN_NUMBER] 1 \} +. rm FN_IN_DIVER +. if dRUNON_FN_IN_DIVER \{ .rm RUNON_FN_IN_DIVER \} +. \} . if \\n[#PRINT_STYLE]=1 \{\ . if \\n[#SLANT_ON] \{\ . if \\n[#UNDERLINE_SLANT] \{ .UNDERLINE \} . \} . \} +. rr #FROM_HEADER +. rr #DEFER_SPACE_ADDED +. if !\\n[#FN_DEPTH] \{\ +. if r#DIVERTED \{ .rr #DIVERTED \} +. \} +. if \\n[#MN_OVERFLOW_LEFT]=1 \{\ +. MN LEFT +. nf +. MN_OVERFLOW_LEFT +. MN +. \} +. if \\n[#MN_OVERFLOW_RIGHT]=1 \{\ +. MN RIGHT +. nf +. MN_OVERFLOW_RIGHT +. MN +. \} +. rm MN_OVERFLOW_LEFT +. rr #MN_OVERFLOW_LEFT +. rr #no-repeat-MN-left +. rm MN_OVERFLOW_RIGHT +. rr #MN_OVERFLOW_RIGHT +. rr #no-repeat-MN-right .END \# \# ==================================================================== @@ -7077,45 +8104,90 @@ \# FINAL respects PAGENUMBER. \# .MAC FOOTER END -. ev PAGE_BOTTOM -\# Removed this next bit; can't figure out why I needed it. -\#. if \\n[#START]=1 \{\ -\#. bp -\#. ev -\#. rr #START -\#. return -\#. \} +. ev PAGE_TRANSITION +. if \\n[MN-left]>0 \{\ +. if !\\n[#no-repeat-MN-left]=1 \{\ +. MNbottom-left +. nr #no-repeat-MN-left 1 +. \} +. if '\\n(.z'MN_OVERFLOW_LEFT' \{\ +. di +. nr #MN_OVERFLOW_LEFT 1 +. rr #OVERFLOW_LEFT +. \} +. \} +. if \\n[MN-right]>0 \{\ +. if (\\n[MN-right] > 0) \{\ +. if !\\n[#no-repeat-MN-right]=1 \{\ +. MNbottom-right +. \} +. \} +. if '\\n(.z'MN_OVERFLOW_RIGHT' \{\ +. di +. nr #MN_OVERFLOW_RIGHT 1 +. rr #OVERFLOW_RIGHT +. \} +. \} +. ch MN_OVERFLOW_TRAP +. nr #SAVED_LEAD \\n(.v . nr #L_MARGIN_DIFF \\n[#L_MARGIN]-\\n[#DOC_L_MARGIN] . if !\\n[#FN_DEFER] \{\ . nr #DIVER_DEPTH 0 -. if \\n[#FN_COUNT] \{\ -. sp |\\n[#PAGE_LENGTH]u-(\\n[#B_MARGIN]u+\\n[#FN_DEPTH]u) +. if \\n[#FN_DEPTH] \{\ +. if \\n[#DIVERTED]=3 \{ .nr #FN_DEPTH +\\n[#VFP_DIFF] \} +. vpt 0 +. sp |\\n[#PAGE_LENGTH]u-(\\n[#B_MARGIN]u+\\n[#FN_DEPTH]u-\\n[#DOC_LEAD]u) +. vpt 1 . po \\n[#DOC_L_MARGIN]u . if \\n[#COLUMNS] \{\ . po \\n[#COL_\\n[#COL_NUM]_L_MARGIN]u . nr #L_MARGIN \\n(.o +. nr #FROM_FOOTER 1 . \} . nf . FOOTNOTES . rm FOOTNOTES +. if dRUNON_FOOTNOTES \{ .rm RUNON_FOOTNOTES \} +. if \\n[#PRINT_STYLE]=1 \{ .vs \\n[#SAVED_LEAD]u \} +. if \\n[#PRINT_STYLE]=2 \{ .LS \\n[#SAVED_LEAD]u \} . if '\\n(.z'FN_OVERFLOW' \{\ . di . nr #FN_OVERFLOW_DEPTH \\n[#DIVER_DEPTH] . \} +. nr #FN_COUNT_AT_FOOTER \\n[#FN_COUNT] . nr #FN_COUNT 0 -. if \\n[#COL_NEXT] \{ .nr #COL_NUM \\n-[#COL_NUM] \} +. if \\n[#COL_NEXT] \{\ +. ie !\\n[#COL_NUM]=\\n[#NUM_COLS] \{ .nr #COL_NUM \\n-[#COL_NUM] \} +. el \{ .nr #COL_NUM \\n[#NUM_COLS] 1 \} +. \} . \} +. rr #DIVERTED . \} -. ie \\n[#COLUMNS] \{\ +. ie \\n[#COLUMNS]=1 \{\ . ie \\n[#COL_NUM]=\\n[#NUM_COLS] \{ .DO_FOOTER \} . el \{\ . ie \\n[#ENDNOTES] \{ .sp |\\n(ecu-\\n[#EN_LEAD]u \} . el \{ .sp |\\n(dcu \} . po \\n[#COL_\\n+[#COL_NUM]_L_MARGIN]u . nr #L_MARGIN \\n(.o -. PROCESS_FN_LEFTOVER +. if \\n[#FN_DEPTH] \{ .PROCESS_FN_LEFTOVER \} +. LS \\n[#SAVED_LEAD]u +. if \\n[#PREV_FN_DEFERRED] \{\ +. nr #PREV_FN_DEFERRED 2 +. \} +. rr #RULED . if !\\n[#EPIGRAPH] \{ .rr #COL_NEXT \} . if !\\n[#QUOTE] \{ .rr #COL_NEXT \} +. if \\n[#RESET_FN_COUNTERS]=1 \{\ +. rr #RESET_FN_COUNTERS +. PROCESS_FN_IN_DIVER +. LS \\n[#SAVED_LEAD]u +. nr #FN_COUNT \\n[#FN_COUNT] 1 +. nr #FN_COUNT_FOR_COLS \\n[#FN_COUNT_FOR_COLS] 1 +. rm FN_IN_DIVER +. if dRUNON_FN_IN_DIVER \{ .rm RUNON_FN_IN_DIVER \} +. \} +. rr #DEFER_SPACE_ADDED . if \\n[#TAB_ACTIVE] \{ .TAB \\n[#CURRENT_TAB] \} . if \\n[#QUOTE] \{\ . ie \\n[#TAB_ACTIVE] \{ .TAB \\n[#CURRENT_TAB] \} @@ -7147,6 +8219,7 @@ . ev . \} . ns +. rr #DIVERTED . \} . el \{ .DO_FOOTER \} .END @@ -7161,13 +8234,19 @@ \# Resets CAPS and UNDERLINE if they were on. \# .MAC DO_FOOTER END +.\" Have to change position of FN_OVERFLOW_TRAP or it screws up the +.\" placement of page numbers (or footers). It's reset to its original +.\" position at the end of the macro. +. if r#SAVED_FOOTER_POS \{ .ch FOOTER \\n[#SAVED_FOOTER_POS]u \} +. rr #SAVED_FOOTER_POS . ie (\\n[#FOOTER_MARGIN]+\\n(.v)>\\n[#B_MARGIN] \{\ . nr #SKIP_FOOTER 1 . \} . el \{\ -. vs 12 +. vpt 0 . sp |\\n[#PAGE_LENGTH]u-\\n[#FOOTER_MARGIN]u-1v . mk y +. vpt 1 . \} . ev FOOTER . po \\n[#DOC_L_MARGIN]u @@ -7177,10 +8256,9 @@ . FT R . PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$HDRFTR_SIZE_CHANGE] . if \\n[#PRINT_STYLE]=1 \{\ -. fam C -. ft R -. ps 12 +. TYPEWRITER . \} +. LS \\n[#SAVED_LEAD]u . nr #HDRFTR_PT_SIZE \\n[#PT_SIZE] . if \\n[#CAPS_ON] \{\ . nr #CAPS_WAS_ON 1 @@ -7210,7 +8288,10 @@ . rr #UNDERLINE_WAS_ON . \} . ev +. rr #SAVED_LEAD . bp +.\" This ev pops the PAGE_TRANSITION environment still active at the +.\" end of HEADER . ev .END \# @@ -7339,71 +8420,12 @@ \# \# ---Main heads--- \# -\# HEAD FAMILY -\# ----------- -\# *Argument: -\# +\# HEAD CAPS +\# --------- +\# *Arguments: +\# | \# *Function: -\# Creates or modifies string $HEAD_FAM. -\# *Notes: -\# Default is same as running text. -\# -.MAC HEAD_FAMILY END -. ds $HEAD_FAM \\$1 -.END -\# -\# -\# HEAD FONT -\# --------- -\# *Argument: -\# -\# *Function: -\# Creates or modifies string $HEAD_FT. -\# *Notes: -\# Default is bold. -\# -.MAC HEAD_FONT END -. ds $HEAD_FT \\$1 -.END -\# -\# -\# HEAD SIZE -\# --------- -\# *Argument: -\# <+|- number of points by which to in/decrease point size of -\# section titles (relative to running text)> -\# *Function: -\# Creates or modifies string $HEAD_SIZE_CHANGE. -\# *Notes: -\# Must be preceded by a - or + sign with no space afterwards. -\# Fractional point sizes are allowed. -\# Default +1 for printstyle TYPESET; +0 for TYPEWRITE. -\# -.MAC HEAD_SIZE END -. ds $HEAD_SIZE_CHANGE \\$1 -.END -\# -\# -\# HEAD QUAD -\# --------- -\# *Arguments: -\# L | LEFT | R | RIGHT | C | CENTER | CENTRE -\# *Function: -\# Creates or modifies string $HEAD_QUAD. -\# *Notes: -\# Default is CENTER. -\# -.MAC HEAD_QUAD END -. ds $HEAD_QUAD \\$1 -.END -\# -\# -\# HEAD CAPS -\# --------- -\# *Arguments: -\# | -\# *Function: -\# Creates or modifies register #HEAD_CAPS. +\# Creates or modifies register #HEAD_CAPS. \# *Notes: \# Default is on. \# @@ -7413,23 +8435,6 @@ .END \# \# -\# HEAD COLOR -\# ---------- -\# *Arguments: -\# -\# *Function: -\# Defines string $HEAD_COLOR to argument. -\# *Notes: -\# User must define an XCOLOR or NEWCOLOR before using -\# HEAD_COLOR. -\# -.MAC HEAD_COLOR END -. if \\n[#PRINT_STYLE]=1 \{ .return \} -. nr #HEAD_COLOR 1 -. ds $HEAD_COLOR \\$1 -.END -\# -\# \# HEAD SPACE \# ---------- \# *Arguments: @@ -7476,7 +8481,7 @@ \# .MAC HEAD END . br -\# Collect head for TOC. +.\" Collect head for TOC. . nr #ARG_NUM 0 1 . nr #TOC_ENTRY_PN \\n%+\\n[#PAGE_NUM_ADJ] . af #TOC_ENTRY_PN \\g[#PAGENUMBER] @@ -7485,8 +8490,8 @@ . as $TOC_HEAD_ITEM \\$[\\n+[#ARG_NUM]]\\| . \} . el \{\ -\# Note that in the .as lines, below, \ at the end has a literal -\# space after it. +.\" Note that in the .as lines, below, \ at the end has a literal +.\" space after it. . ie \\n[#NUMBER_HEAD] \{\ . ie \\n[#ARG_NUM]=0 \{\ . as $TOC_HEAD_ITEM \\n+[#HEAD_NUM].\0\\$[\\n+[#ARG_NUM]]\ @@ -7500,10 +8505,10 @@ . as $TOC_HEAD_ITEM \\$[\\n+[#ARG_NUM]]\ . \} . \} -. \} -\# Note the use of \!, which transparently embeds the macros used -\# in the TOC_ENTRIES diversion. The elements they control must be -\# processed literally when the diversion is output. +.\} +.\" Note the use of \!, which transparently embeds the macros used +.\" in the TOC_ENTRIES diversion. The elements they control must be +.\" processed literally when the diversion is output. . ev TOC_EV . da TOC_ENTRIES . if \\n[#PRINT_STYLE]=1 \{\ @@ -7523,7 +8528,7 @@ . el \{\ \!. PAD "\\h'\\n[#TOC_HEAD_INDENT]u'\\*[$TOC_HEAD_ITEM]\\*[$TOC_PN]" . \} -\!. EL +\!. EOL \!. ST 100 L \!. ST 101 R . if \\n[#PRINT_STYLE]=2 \{\ @@ -7539,8 +8544,8 @@ \!. TQ . di . ev -\# End collection of head for TOC -\# Process head +.\" End collection of head for TOC +.\" Process head . nr #HEAD 1 . ev HEAD . ll \\n[#L_LENGTH]u @@ -7552,9 +8557,7 @@ . CHECK_INDENT . QUAD \\*[$HEAD_QUAD] . if \\n[#PRINT_STYLE]=1 \{\ -. fam C -. ft R -. ps 12 +. TYPEWRITER . vs \\n[#DOC_LEAD]u . UNDERLINE OFF . \} @@ -7566,13 +8569,13 @@ . \} . if r#QUOTE \{ .rr #QUOTE \} . if r#EPIGRAPH \{ .rr #EPIGRAPH \} -. if \\n[#PRINT_STYLE]=1 \{ .ne 3 \} +. if \\n[#PRINT_STYLE]=1 \{ .ne \\n[#NUM_ARGS]+2 \} . if \\n[#PRINT_STYLE]=2 \{\ -. ie \\n[#HEAD_SPACE] \{ .ne 4 \} -. el \{ .ne 3 \} +. ie \\n[#HEAD_SPACE] \{ .ne \\n[#NUM_ARGS]+3 \} +. el \{ .ne \\n[#NUM_ARGS]+2 \} . \} . ie \\n[#START] \{\ -. if \\n[#DOC_HEADER]=0 \{ . \} +. if \\n[#DOC_HEADER]=0 \{ .RLD 1v \} . \} . el \{\ . if \\n[#PRINT_STYLE]=1 \{\ @@ -7609,14 +8612,14 @@ . \} . \} . \} -\# Print head +.\" Print head . nr #ARG_NUM 0 1 . if \\n[#HEAD_CAPS] \{ .CAPS \} . if \\n[#PRINT_STYLE]=2 \{\ . if \\n[#HEAD_COLOR]=1 \{\ . TRAP OFF . COLOR \\*[$HEAD_COLOR] -. EL +. EOL . TRAP . \} . \} @@ -7641,7 +8644,7 @@ . el \{ .UNDERSCORE "\\$[\\n+[#ARG_NUM]]\} . br . \} -. \} +.\} . REMOVE_INDENT . CAPS OFF . ev @@ -7664,82 +8667,6 @@ \# \# ---Subheads--- \# -\# SUBHEAD FAMILY -\# -------------- -\# *Argument: -\# -\# *Function: -\# Creates or modifies string $SH_FAM. -\# *Notes: -\# Default is same as running text. -\# -.MAC SUBHEAD_FAMILY END -. ds $SH_FAM \\$1 -.END -\# -\# -\# SUBHEAD FONT -\# -------------- -\# *Argument: -\# -\# *Function: -\# Creates or modifies string $SH_FT. -\# *Notes: -\# Default is bold. -\# -.MAC SUBHEAD_FONT END -. ds $SH_FT \\$1 -.END -\# -\# -\# SUBHEAD SIZE -\# ------------ -\# *Argument: -\# <+|- number of points by which to in/decrease point size of subheads -\# (relative to running text)> -\# *Function: -\# Creates or modifies string $SH_SIZE_CHANGE. -\# *Notes: -\# Must be preceded by a +|- sign. No space afterwards. -\# Fractional point sizes are allowed. -\# Default is +.5 for printstyle TYPESET; +0 for TYPEWRITE. -\# -.MAC SUBHEAD_SIZE END -. ds $SH_SIZE_CHANGE \\$1 -.END -\# -\# -\# SUBHEAD COLOR -\# ------------- -\# *Arguments: -\# -\# *Function: -\# Defines string $SH_COLOR to argument. -\# *Notes: -\# User must define an XCOLOR or NEWCOLOR before using -\# SUBHEAD_COLOR. -\# -.MAC SUBHEAD_COLOR END -. if \\n[#PRINT_STYLE]=1 \{ .return \} -. nr #SH_COLOR 1 -. ds $SH_COLOR \\$1 -.END -\# -\# -\# SUBHEAD QUAD -\# ------------ -\# *Argument: -\# L | LEFT | R | RIGHT | C | CENTER | CENTRE -\# *Function: -\# Creates or modifies string $SH_QUAD. -\# *Notes: -\# Default is LEFT for both TYPESET and TYPEWRITE. -\# -.MAC SUBHEAD_QUAD END -. ds $SH_QUAD \\$1 -.END -\# -\# \# SUBHEAD \# ------- \# *Arguments: @@ -7756,7 +8683,7 @@ \# .MAC SUBHEAD END . br -\# Collect subhead for TOC. +.\" Collect subhead for TOC. . nr #ARG_NUM 0 1 . nr #TOC_ENTRY_PN \\n%+\\n[#PAGE_NUM_ADJ] . while \\n[#ARG_NUM]<\\n[#NUM_ARGS] \{\ @@ -7764,8 +8691,8 @@ . as $TOC_SH_ITEM \\$[\\n+[#ARG_NUM]]\\| . \} . el \{\ -\# Note that in the .as lines, below, \ at the end has a literal -\# space after it. +.\" Note that in the .as lines, below, \ at the end has a literal +.\" space after it. . ie \\n[#NUMBER_SH] \{\ . ie \\n[#ARG_NUM]=0 \{\ . as $TOC_SH_ITEM \\n+[#SH_NUM].\0\\$[\\n+[#ARG_NUM]]\ @@ -7779,10 +8706,10 @@ . as $TOC_SH_ITEM \\$[\\n+[#ARG_NUM]]\ . \} . \} -. \} -\# Note the use of \!, which transparently embeds the macros used -\# in the TOC_ENTRIES diversion. The elements they control must be -\# processed literally when the diversion is output. +.\} +.\" Note the use of \!, which transparently embeds the macros used +.\" in the TOC_ENTRIES diversion. The elements they control must be +.\" processed literally when the diversion is output. . ev TOC_EV . da TOC_ENTRIES . if \\n[#PRINT_STYLE]=1 \{\ @@ -7802,7 +8729,7 @@ . el \{\ \!. PAD "\\h'\\n[#TOC_SH_INDENT]u'\\*[$TOC_SH_ITEM]\\*[$TOC_PN]" . \} -\!. EL +\!. EOL \!. ST 100 L \!. ST 101 R . if \\n[#PRINT_STYLE]=2 \{\ @@ -7818,8 +8745,8 @@ \!. TQ . di . ev -\# End collection of head for TOC -\# Process subhead +.\" End collection of head for TOC +.\" Process subhead . nr #ARG_NUM 0 1 . if r#QUOTE \{ .rr #QUOTE \} . if r#Q_AT_TOP \{ .rr #Q_AT_TOP \} @@ -7832,9 +8759,7 @@ . \} . CHECK_INDENT . if \\n[#PRINT_STYLE]=1 \{\ -. fam C -. ft R -. ps 12 +. TYPEWRITER . vs \\n[#DOC_LEAD]u . QUAD \\*[$SH_QUAD] . UNDERLINE OFF @@ -7848,9 +8773,9 @@ . \} . if \\n[#PRINT_STYLE]=1 \{ .nr #SH_LEAD_ADJUST \\n[#LEAD]/5 \} . if \\n[#PRINT_STYLE]=2 \{ .nr #SH_LEAD_ADJUST \\n[#LEAD]/8 \} -. ie \\n[#START] \{ . \} +. ie \\n[#START] \{ .RLD 1v \} . el \{\ -. ie ( \\n[#TRAP_DISTANCE] < (\\n[#DOC_LEAD]u*2u) ) \{\ +. ie ( \\n[#TRAP_DISTANCE] < (\\n[#DOC_LEAD]*(\\n[#NUM_ARGS]+1)) ) \{\ . ie \\n[#COLUMNS] \{ .COL_NEXT \} . el \{ .bp \} . \} @@ -7872,7 +8797,7 @@ . \} . \} . \} -\# Print subhead +.\" Print subhead . if \\n[#PRINT_STYLE]=1 \{\ . while \\n[#ARG_NUM]<\\n[#NUM_ARGS] \{\ . ie \\n[#NUMBER_SH] \{\ @@ -7900,7 +8825,7 @@ . UNDERSCORE "\v'-\\n[#SH_LEAD_ADJUST]u'\\$[\\n+[#ARG_NUM]] . br . \} -. \} +.\} . \} . if \\n[#PRINT_STYLE]=1 \{\ . if \\n[#SINGLE_SPACE] \{ .ALD \\n[#DOC_LEAD]u \} @@ -7933,7 +8858,7 @@ . PRINT "\\v'-\\n[#SH_LEAD_ADJUST]u'\\$[\\n+[#ARG_NUM]] . br . \} -. \} +.\} . \} . el \{\ . ALD \\n[#DOC_LEAD]u @@ -7942,7 +8867,7 @@ . if \\n[#EPIGRAPH] \{ .RLD \\n[#DOC_LEAD]u \} . while \\n[#ARG_NUM]<\\n[#NUM_ARGS] \{\ . PRINT "\\$[\\n+[#ARG_NUM]] -. \} +.\} . ALD \\n[#DOC_LEAD]u . \} . \} @@ -7961,68 +8886,6 @@ \# \# ---Paragraph heads--- \# -\# PARAHEAD FAMILY -\# --------------- -\# *Argument: -\# -\# *Function: -\# Creates or modifies string $PH_FAM. -\# *Notes: -\# Default is same as running text. -\# -.MAC PARAHEAD_FAMILY END -. ds $PH_FAM \\$1 -.END -\# -\# -\# PARAHEAD FONT -\# ------------- -\# *Argument: -\# -\# *Function: -\# Creates or modifies string $PH_FT. -\# *Notes: -\# Default is bold italic for TYPESET; underlined for TYPEWRITE. -\# -.MAC PARAHEAD_FONT END -. ds $PH_FT \\$1 -.END -\# -\# -\# PARAHEAD SIZE -\# ------------- -\# *Argument: -\# <+|- number of points by which to in/decrease point size of subheads -\# (relative to running text)> -\# *Function: -\# Creates or modifies string $PH_SIZE_CHANGE. -\# *Notes: -\# Must be preceded by a +|- sign. No space afterwards. -\# Fractional point sizes are allowed. No unit of measure, please. -\# Default is +.5 for printstyle TYPESET; +0 for TYPEWRITE. -\# -.MAC PARAHEAD_SIZE END -. ds $PH_SIZE_CHANGE \\$1 -.END -\# -\# -\# PARAHEAD COLOR -\# -------------- -\# *Arguments: -\# -\# *Function: -\# Defines string $PH_COLOR to argument. -\# *Notes: -\# User must define an XCOLOR or NEWCOLOR before using -\# PARAHEAD_COLOR. -\# -.MAC PARAHEAD_COLOR END -. if \\n[#PRINT_STYLE]=1 \{ .return \} -. nr #PH_COLOR 1 -. ds $PH_COLOR \\$1 -.END -\# -\# \# PARAHEAD INDENT \# --------------- \# *Argument: @@ -8048,7 +8911,7 @@ \# PARAHEAD *must* come after PP. \# .MAC PARAHEAD END -\# Collect parahead for TOC. +.\" Collect parahead for TOC. . nr #TOC_ENTRY_PN \\n%+\\n[#PAGE_NUM_ADJ] . ie \\n[#NUMBER_PH] \{\ . ds $TOC_PH_ITEM \\n+[#PH_NUM].\0\\$1\\| @@ -8076,7 +8939,7 @@ . el \{\ \!. PAD "\\h'\\n[#TOC_PH_INDENT]u'\\*[$TOC_PH_ITEM]\\*[$TOC_PN]" . \} -\!. EL +\!. EOL \!. ST 100 L \!. ST 101 R . if \\n[#PRINT_STYLE]=2 \{\ @@ -8092,8 +8955,8 @@ \!. TQ . di . ev -\# End collection of parahead for TOC -\# Process parahead +.\" End collection of parahead for TOC +.\" Process parahead . if \\n[#SLANT_ON] \{\ . nr #SLANT_WAS_ON 1 \E*[SLANTX] @@ -8105,9 +8968,7 @@ . \} . el \{ .ti \\n[#PH_INDENT]u \} . if \\n[#PRINT_STYLE]=1 \{\ -. fam C -. ft R -. ps 12 +. TYPEWRITER . UNDERLINE OFF . ie \\n[#NUMBER_PH] \{\ . if \\n[#NUMBER_HEAD] \{\ @@ -8174,14 +9035,13 @@ . PRINT "\\$1\h'.6m'\c" . \} . \} -. FAMILY \\*[$DOC_FAM] -. FT \\*[$PP_FT] -. PT_SIZE \\n[#DOC_PT_SIZE]u -. if \\n[#PH_COLOR]=1 \m[]\c -. if \\n[#SLANT_WAS_ON] \{\ -. rr #SLANT_WAS_ON 1 +. FAMILY \\*[$DOC_FAM] +. FT \\*[$PP_FT] +. PT_SIZE \\n[#DOC_PT_SIZE]u +. if \\n[#PH_COLOR]=1 \m[]\c +. if \\n[#SLANT_WAS_ON] \{\ +. rr #SLANT_WAS_ON \E*[SLANT]\c -. \} . \} . rr #NUMBERED . rm $TOC_PH_ITEM @@ -8215,27 +9075,11 @@ . while \\$2>\\n[#REPEAT] \{\ . as $LINEBREAK_CHAR "\\ \\$1 . nr #REPEAT \\n[#REPEAT]+1 -. \} +.\} . rr #REPEAT .END \# \# -\# LINEBREAK COLOR -\# --------------- -\# *Arguments: -\# -\# *Function: -\# Defines string $LINEBREAK_COLOR to argument. -\# *Notes: -\# User must define an XCOLOR or NEWCOLOR before using -\# LINEBREAK_COLOR. -\# -.MAC LINEBREAK_COLOR END -. if \\n[#PRINT_STYLE]=1 \{ .return \} -. ds $LINEBREAK_COLOR \\$1 -.END -\# -\# \# LINE BREAK \# ---------- \# *Arguments: @@ -8379,7 +9223,7 @@ . if \\n[#DATE_FIRST]=1 \{ .ALD \\n[#DOC_LEAD]u \} . rr #DATE_FIRST . rm LETTERHEAD\\n[#FIELD] -. \} +.\} . rr #FIELD . rr #NUM_FIELDS . rr #TOTAL_FIELDS @@ -8403,9 +9247,7 @@ . \} . if \\n[#TAB_ACTIVE] \{ .TAB \\n[#CURRENT_TAB] \} . ie \\n[#PRINT_STYLE]=1 \{\ -. fam C -. ft R -. ps 12 +. TYPEWRITER . ie \\n[#ENDNOTE] \{ .vs \\n[#EN_LEAD]u \} . el \{ .vs \\n[#DOC_LEAD]u \} . QUAD \\*[$DOC_QUAD] @@ -8455,9 +9297,20 @@ . if \\n[#PP_SPACE] \{\ . if \\n[#PRINT_STYLE]=2 \{\ . ie \\n[#END_QUOTE] \{\ +. ALD \\n[#DOC_LEAD]u . rr #END_QUOTE +. nr #NO_SPACE 1 +. nr #BASELINE_MARK \\n(nl +. \} +. el \{\ +. if \\n[#NO_SPACE]=1 \{\ +. rr #NO_SPACE +. \} +. if !\\n(nl=\\n[#BASELINE_MARK] \{\ +. ALD \\n[#DOC_LEAD]u +. rr #BASELINE_MARK +. \} . \} -. el \{ .ALD \\n[#DOC_LEAD]u \} . \} . \} . ie \\n[#INDENT_ACTIVE] \{ .ti \\n[#INDENT]u+\\n[#PP_INDENT]u \} @@ -8519,70 +9372,7 @@ \# \# +++QUOTES+++ \# -\# ---Line for line (poetic) quotes--- -\# -\# QUOTE FAMILY -\# ------------ -\# *Argument: -\# -\# *Function: -\# Creates or modifies string $QUOTE_FAM. -\# *Notes: -\# Default is same as running text. -\# -.MAC QUOTE_FAMILY END -. ds $QUOTE_FAM \\$1 -.END -\# -\# -\# QUOTE FONT -\# ---------- -\# *Argument: -\# -\# *Function: -\# Creates or modifies string $QUOTE_FT. -\# *Notes: -\# Default is italic for TYPESET. -\# -.MAC QUOTE_FONT END -. ds $QUOTE_FT \\$1 -.END -\# -\# -\# QUOTE SIZE -\# ---------- -\# *Argument: -\# <-|+ number of points by which to de/increase point size of -\# line for line quotes (relative to running text)> -\# *Function: -\# Creates or modifies string $QUOTE_SIZE_CHANGE. -\# *Notes: -\# Must be preceded by a - or + sign with no space afterwards. -\# Fractional point sizes are allowed. -\# Default is +0. -\# -.MAC QUOTE_SIZE END -. ds $QUOTE_SIZE_CHANGE \\$1 -.END -\# -\# -\# QUOTE COLOR -\# ----------- -\# *Arguments: -\# -\# *Function: -\# Sets register #QUOTE_COLOR to 1; defines string $QUOTE_COLOR to -\# argument. -\# *Notes: -\# User must define an XCOLOR or NEWCOLOR before using -\# QUOTE_COLOR. -\# -.MAC QUOTE_COLOR END -. if \\n[#PRINT_STYLE]=1 \{ .return \} -. nr #QUOTE_COLOR 1 -. ds $QUOTE_COLOR \\$1 -.END -\# +\# ---Line for line quotes, i.e. poetry or code snippets--- \# \# UNDERLINE QUOTES \# ---------------- @@ -8615,6 +9405,24 @@ .END \# \# +\# QUOTE_AUTOLEAD +\# -------------- +\# *Arguments: +\# +\# *Function: +\# Sets autolead for quotes and/or blockquotes. +\# +.MAC QUOTE_AUTOLEAD END +. if '\\$0'QUOTE_AUTOLEAD' \{ .nr #Q_AUTOLEAD \\$1 \} +. if '\\$0'BLOCKQUOTE_AUTOLEAD' \{ .nr #BQ_AUTOLEAD \\$1 \} +. if '\\$0'ENDNOTE_QUOTE_AUTOLEAD' \{ .nr #EN_Q_AUTOLEAD \\$1 \} +. if '\\$0'ENDNOTE_BLOCKQUOTE_AUTOLEAD' \{ .nr #EN_BQ_AUTOLEAD \\$1 \} +.END +\# +.ALIAS BLOCKQUOTE_AUTOLEAD QUOTE_AUTOLEAD +.ALIAS ENDNOTE_QUOTE_AUTOLEAD QUOTE_AUTOLEAD +.ALIAS ENDNOTE_BLOCKQUOTE_AUTOLEAD QUOTE_AUTOLEAD +\# \# ALWAYS FULLSPACE QUOTES \# ----------------------- \# *Arguments: @@ -8644,22 +9452,32 @@ \# .MAC QUOTE END . br -\# **Uncomment the next line to prevent orphaned quote lines. -\#. ne 1 +. if \\n[#LINENUMBERS]=1 \{\ +. nr #LINENUMBERS 2 +. nr #NEXT_LN \\n(ln +. nm +. \} . ie '\\$1'' \{\ . ev QUOTE +. if \\n[#LINENUMBERS]=2 \{\ +. if \\n[#SILENT_QUOTE_LN]=1 \{ .nm \\n[#NEXT_LN] 1000 -4 \} +. \} +. nr #IN_DIVER 1 . nr #QUOTE 1 . di P_QUOTE . ll \\n[#L_LENGTH]u-(\\n[#PP_INDENT]u*\\n[#Q_OFFSET_VALUE]u) +. if \\n[#LINENUMBERS]=2 \{\ +. if \\n[#QUOTE_LN]=1 \{\ +. nm \\n(ln "" \\*[$Q_LN_GUTTER] -3-\\*[$Q_LN_GUTTER] +. \} +. \} . ta \\n(.lu . if \\n[#COLUMNS] \{\ . ll \\n[#COL_L_LENGTH]u-(\\n[#PP_INDENT]u*\\n[#Q_OFFSET_VALUE]u) . ta \\n(.lu . \} . if \\n[#PRINT_STYLE]=1 \{\ -. fam C -. ft R -. ps 12 +. TYPEWRITER . vs \\n[#DOC_LEAD]u . LEFT . \} @@ -8667,12 +9485,34 @@ . FAMILY \\*[$QUOTE_FAM] . FT \\*[$QUOTE_FT] . PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$QUOTE_SIZE_CHANGE] -. LS \\n[#DOC_LEAD]u +. ie !r#Q_AUTOLEAD \{ .LS \\n[#Q_LEAD]u \} +. el \{\ +. AUTOLEAD \\n[#Q_AUTOLEAD] +. nr #Q_LEAD \\n(.v +. \} +. if \\n[#ENDNOTE] \{\ +. PT_SIZE \\n[#EN_PS]u\\*[$QUOTE_SIZE_CHANGE] +. ie !r#EN_Q_AUTOLEAD \{ .LS \\n[#EN_Q_LEAD]u \} +. el \{\ +. AUTOLEAD \\n[#EN_Q_AUTOLEAD] +. nr #EN_Q_LEAD \\n(.v +. \} +. \} +. nr #Q_LEAD_REAL \\n(.v . LEFT . if \\n[#QUOTE_COLOR]=1 \{\ . nf \m[\\*[$QUOTE_COLOR]] -. EL +. EOL +. \} +. \} +. if \\n[#LINENUMBERS]=2 \{\ +. ie \\n[#QUOTE_LN]=1 \{\ +. if '\\*[$Q_LN_GUTTER]'' .ds $Q_LN_GUTTER \\*[$LN_GUTTER] +. nm \\n(ln "" \\*[$Q_LN_GUTTER] -3-\\*[$Q_LN_GUTTER] +. \} +. el \{\ +. if !\\n[#SILENT_QUOTE_LN] \{ .NUMBER_LINES OFF \} . \} . \} . nr #Q_TOP \\n(nl @@ -8685,105 +9525,36 @@ . el \{ .DO_QUOTE \} .END \# -\# \# ---Blockquotes--- \# -\# BLOCKQUOTE FAMILY -\# ----------------- -\# *Argument: -\# -\# *Function: -\# Creates or modifies string $BQUOTE_FAM. -\# *Notes: -\# Default is same as running text. -\# -.MAC BLOCKQUOTE_FAMILY END -. ds $BQUOTE_FAM \\$1 -.END -\# -\# -\# BLOCKQUOTE FONT -\# --------------- -\# *Argument: -\# +\# BLOCKQUOTE +\# ---------- +\# *Arguments: +\# | \# *Function: -\# Creates or modifies string $BQUOTE_FT. +\# Indents quoted text in fill mode and shortens line length +\# equivalently, or turns BLOCKQUOTE off. \# *Notes: -\# Default is same as running text. -\# -.MAC BLOCKQUOTE_FONT END -. ds $BQUOTE_FT \\$1 -.END -\# +\# Owing to the need to bottom align TYPESET pages, quoted text gets +\# diverted so its depth can be measured (in DO_QUOTE) for determining +\# how much space to put before and after. \# -\# BLOCKQUOTE SIZE -\# --------------- -\# *Argument: -\# <-|+ number of points by which to de/increase point size of blockquotes -\# (relative to running text)> -\# *Function: -\# Creates or modifies string $BQUOTE_SIZE_CHANGE. -\# *Notes: -\# Must be preceded by a - or + sign with no space afterwards. -\# Fractional point sizes are allowed. -\# Default is -1 for printstyle TYPESET; +0 for TYPEWRITE. -\# -.MAC BLOCKQUOTE_SIZE END -. ds $BQUOTE_SIZE_CHANGE \\$1 -.END -\# -\# -\# BLOCKQUOTE COLOR -\# ---------------- -\# *Arguments: -\# -\# *Function: -\# Sets register #BQUOTE_COLOR to 1; defines string -\# $BQUOTE_COLOR to argument. -\# *Notes: -\# User must define an XCOLOR or NEWCOLOR before using -\# BLOCKQUOTE_COLOR. -\# -.MAC BLOCKQUOTE_COLOR END -. if \\n[#PRINT_STYLE]=1 \{ .return \} -. nr #BQUOTE_COLOR 1 -. ds $BQUOTE_COLOR \\$1 -.END -\# -\# -\# BLOCKQUOTE QUAD -\# --------------- -\# *Arguments: -\# -\# *Function: -\# Creates or modifies string $BQUOTE_QUAD. -\# *Notes: -\# Default is LEFT. -\# -.MAC BLOCKQUOTE_QUAD END -. ds $BQUOTE_QUAD \\$1 -.END -\# -\# -\# BLOCKQUOTE -\# ---------- -\# *Arguments: -\# | -\# *Function: -\# Indents quoted text in fill mode and shortens line length -\# accordingly, or turns BLOCKQUOTE off. -\# *Notes: -\# Owing to the need to bottom align TYPESET pages, quoted text gets -\# diverted so its depth can be measured (in DO_QUOTE) for determining -\# how much space to put before and after. -\# -\# .PP after blockquote is optional if there's only one para, -\# but REQUIRED if there's more than one. +\# .PP after blockquote is optional if there's only one para, +\# but REQUIRED if there's more than one. \# .MAC BLOCKQUOTE END . br +. if \\n[#LINENUMBERS]=1 \{\ +. nr #LINENUMBERS 2 +. nr #NEXT_LN \\n(ln +. nm +. \} . ie '\\$1'' \{\ . ev BLOCKQUOTE +. if \\n[#LINENUMBERS]=2 \{\ +. if \\n[#SILENT_BQUOTE_LN]=1 \{ .nm \\n[#NEXT_LN] 1000 -4 \} +. \} +. nr #IN_DIVER 1 . nr #QUOTE 2 . nr #PP_STYLE 2 . nr #Q_PP 0 @@ -8812,10 +9583,8 @@ . ta \\n(.lu . \} . if \\n[#PRINT_STYLE]=1 \{\ -. fam C -. ft R -. ps 12 -. vs \\n[#DOC_LEAD]u +. TYPEWRITER +. vs \\n[#DOC_LEAD]u . QUAD LEFT . HY OFF . \} @@ -8823,17 +9592,38 @@ . FAMILY \\*[$BQUOTE_FAM] . FT \\*[$BQUOTE_FT] . PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$BQUOTE_SIZE_CHANGE] -. LS \\n[#DOC_LEAD]u +. ie !\\n[#BQ_AUTOLEAD] \{ .LS \\n[#BQ_LEAD]u \} +. el \{\ +. AUTOLEAD \\n[#BQ_AUTOLEAD] +. nr #BQ_LEAD \\n(.v +. \} . if \\n[#ENDNOTE] \{\ . PT_SIZE \\n[#EN_PS]u\\*[$BQUOTE_SIZE_CHANGE] +. ie !r#EN_BQ_AUTOLEAD \{ .LS \\n[#EN_BQ_LEAD]u \} +. el \{\ +. AUTOLEAD \\n[#EN_BQ_AUTOLEAD] +. nr #EN_BQ_LEAD \\n(.v +. \} . \} +. nr #Q_LEAD_REAL \\n(.v . if \\n[#BQUOTE_COLOR]=1 \{\ . nf \m[\\*[$BQUOTE_COLOR]] -. EL +. EOL . \} . QUAD \\*[$BQUOTE_QUAD] -. HY +. nr #DIVERSIONS_HY_MARGIN (p;\\n[.ps]u*2.75)/1000 +. HY_SET 1 \\n[#DIVERSIONS_HY_MARGIN]u (\\n[#PT_SIZE]u/1000u/8u)p +. hy 14 +. \} +. if \\n[#LINENUMBERS]=2 \{\ +. ie \\n[#BQUOTE_LN]=1 \{\ +. if '\\*[$BQ_LN_GUTTER]'' .ds $BQ_LN_GUTTER \\*[$LN_GUTTER] +. nm \\n(ln "" \\*[$BQ_LN_GUTTER] -3-\\*[$BQ_LN_GUTTER] +. \} +. el \{\ +. if !\\n[#SILENT_BQUOTE_LN] \{ .NUMBER_LINES OFF \} +. \} . \} . nr #Q_TOP \\n(nl . if \\n[#INDENT_FIRST_PARAS] \{\ @@ -8867,15 +9657,39 @@ \# line. (This is to ensure the page remains bottom aligned). \# .MAC DO_QUOTE END +. br +. if \\n[#DIVER_LN_OFF] \{\ +\!. NUMBER_LINES OFF +. rr #DIVER_LN_OFF +. \} . di +. rr #IN_DIVER +. if \\n[#RESET_FN_COUNTERS]=2 \{\ +. if !\\n[#FN_COUNT]=1 \{\ +. if ((\\n[#PAGE_LENGTH]+\\n[#VARIABLE_FOOTER_POS])+\\n[#DIVER_DEPTH])>(\\n[#PAGE_LENGTH]+\\n[#VARIABLE_FOOTER_POS]) \{\ +. DIVER_FN_2_POST +. rr #RESET_FN_COUNTERS +. \} +. \} +. \} +. nr #SAVED_FN_NUMBER \\n[#FN_NUMBER] +. nr #DONE_ONCE 0 1 . REMOVE_INDENT . ev -\# **Change *1 to *2 in next line to prevent orphans after quotes +. nr #Q_DEPTH (\\n[#DIVER_DEPTH]-\\n[#Q_LEAD_REAL])+\\n[#LEAD] +. nr #Q_LEAD_DIFF \\n[#LEAD]-\\n[#Q_LEAD_REAL] +. SILENT +. br +. nf +. nr #CURRENT_V_POS \\n(nl+\\n[#Q_LEAD_DIFF]+(\\n[#DIVER_DEPTH]-\\n[#Q_DEPTH_REAL]) +. SHIM +. SILENT OFF +. nr #Q_SPACE_ADJ \\n[#SHIM]/2 +. nr #TRAP \\n(.t-1 . if \\n[#ENDNOTE] \{\ . nr #RESET_QUOTE_SPACING \\n[#FULLSPACE_QUOTES] . ALWAYS_FULLSPACE_QUOTES . \} -. nr #Q_DEPTH \\n[#DIVER_DEPTH]+(\\n[#LEAD]*1) . if \\n[#PRINT_STYLE]=1 \{\ . if \\n[#START]=1 \{ . \} . if \\n[#START]=0 \{\ @@ -8894,36 +9708,16 @@ . \} . \} . el \{\ -. ie \\n[#Q_DEPTH]<\\n[#TRAP_DISTANCE] \{\ -. nr #Q_FITS 1 -. ie \\n[#HEAD]=1 \{ . \} +. ie \\n[#Q_DEPTH]<(\\n[#TRAP_DISTANCE]-1) \{\ +. ie (\\n[#TRAP_DISTANCE]-1)-\\n[#Q_DEPTH]<\\n[#DOC_LEAD] \{\ +. Q_NOFIT +. \} . el \{\ -. ie \\n[#START] \{ . \} -. el \{\ -. ie \\n[#FULLSPACE_QUOTES] \{\ -. ie \\n[#ENDNOTE] \{\ -. ALD \\n[#EN_LEAD]u -. \} -. el \{ .ALD \\n[#DOC_LEAD]u \} -. \} -. el \{\ -. ie \\n[#ENDNOTE] \{\ -. ALD \\n[#EN_LEAD]u/2u -. \} -. el \{ .ALD \\n[#DOC_LEAD]u/2u \} -. \} -. \} +. Q_FITS . \} . \} . el \{\ -. rr #Q_FITS -. ie r#HEAD \{\ -. if \\n[#HEAD]=1 \{ . \} -. \} -. el \{\ -. ie \\n[#ENDNOTE] \{ .ALD \\n[#EN_LEAD]u \} -. el \{ .ALD \\n[#DOC_LEAD]u \} -. \} +. Q_NOFIT . \} . \} . \} @@ -8935,6 +9729,13 @@ . if \\n[#ENDNOTE] \{\ . in +\\n[#EN_PP_INDENT]u*\\n[#Q_OFFSET_VALUE]u . \} +. ie \\n[#START]=1 \{\ +. ie !\\n[#Q_LEAD_DIFF]<0 \{ .ALD \\n[#Q_SPACE_ADJ]u \} +. el \{ .RLD 0-\\n[#Q_LEAD_DIFF]u \} +. \} +. el \{\ +. ALD \\n[#Q_SPACE_ADJ]u +. \} . if \\n[#QUOTE]=1 \{\ . nf . P_QUOTE @@ -8949,32 +9750,57 @@ . \} . if \\n[#PRINT_STYLE]=2 \{\ . ie \\n[#START] \{\ -. ie \\n[#PP_SPACE] \{ . \} -. el \{ .ALD \\n[#DOC_LEAD]u \} +. ie \\n[#PP_SPACE] \{\ +. +. \} +. el \{\ +. ALD \\n[#DOC_LEAD]u +. SHIM +. \} . \} . el \{\ . ie \\n[#PP_SPACE] \{ . \} . el \{\ -. ie \\n[#HEAD]=1 \{ .ALD \\n[#DOC_LEAD]u \} +. ie \\n[#HEAD]=1 \{\ +. ALD \\n[#DOC_LEAD]u +. SHIM +. \} . el \{\ +. ie \\n[#FULLSPACE_QUOTES] \{\ +. ie \\n[#ENDNOTE] \{ .ALD \\n[#EN_LEAD]u \} +. el \{ .ALD \\n[#DOC_LEAD]u \} +. \} +. el \{ .ALD (\\n[#DOC_LEAD]u/2u) \} . ie \\n[#Q_FITS] \{\ . ie \\n[#Q_TOP]=\\n[#PAGE_TOP] \{\ . nr #Q_AT_TOP 1 -. ALD \\n[#DOC_LEAD]u +. nr #DELAY_SHIM 1 . \} -. el \{\ -. ie \\n[#FULLSPACE_QUOTES] \{ .ALD \\n[#DOC_LEAD]u \} -. el \{ .ALD \\n[#DOC_LEAD]u/2u \} +. el \{ .SHIM \} +. \} +. el \{\ +. SHIM +.\" Make sure that Q_LEAD_DIFF is not added to the first line of +.\" normal text at the top of any page following output of a quote +.\" whose last line falls on B_MARGIN of the previous page. +. if \\n(nl=(\\n[#T_MARGIN]-\\n[#DOC_LEAD]+\\n[#Q_LEAD_DIFF]) \{\ +. PRINT \& +. br +. sp -1v-\\n[#Q_LEAD_DIFF]u . \} . \} -. el \{ .ALD \\n[#DOC_LEAD]u \} . \} . \} . \} . \} +. if \\n[#LINENUMBERS]=2 \{\ +. nr #LINENUMBERS 1 +. ie \\n[#RESTORE_LN_NUM]=1 \{ .nm \\n[#NEXT_LN] \} +. el \{ .nm +0 \} +. \} . if \\n[#ENDNOTE] \{ .nr #FULLSPACE_QUOTES \\n[#RESET_QUOTE_SPACING] \} -. if r#HEAD \{ .rr #HEAD \} -. if r#EPIGRAPH \{ .rr #EPIGRAPH \} +. if r#HEAD \{ .rr #HEAD \} +. if r#EPIGRAPH \{ .rr #EPIGRAPH \} . rr #Q_PP . rr #LINEBREAK . nr #PP_STYLE 1 @@ -9006,6 +9832,88 @@ . ENDNOTE_PARA_INDENT \\n[#RESET_EN_PP_INDENT]u . QUAD \\*[EN_QUAD] . \} +. if r#DELAY_SHIM \{\ +. SHIM +. rr #DELAY_SHIM +. \} +.END +\# +\# +\# Utility macros for DO_QUOTE +\# --------------------------- +\# +.MAC Q_FITS END +. nr #Q_FITS 1 +. ie \\n[#HEAD]=1 \{\ +. ALD \\n[#Q_LEAD_DIFF]u +. \} +. el \{\ +. ie \\n[#START] \{ . \} +. el \{\ +. ie \\n[#FULLSPACE_QUOTES] \{\ +. ie \\n[#ENDNOTE] \{ .ALD \\n[#EN_LEAD]u+\\n[#Q_LEAD_DIFF]u \} +. el \{ .ALD \\n[#DOC_LEAD]u+\\n[#Q_LEAD_DIFF]u \} +. \} +. el \{\ +.\" This seems to be the only way to get the baseline of quotes that start +.\" at the top of the page to fall on the first line of the "grid" (i.e on +.\" the first legal baseline of the page). +. ie \\n[#Q_TOP]=\\n[#PAGE_TOP] \{\ +. if \\n[#QUOTE]=1 \{\ +. rn P_QUOTE Q_TEMP +. di P_QUOTE +. vs \\n[#Q_LEAD]u +. PRINT \& +. sp -1v+\\n[#Q_LEAD_DIFF]u +. Q_TEMP +. di +. \} +. if \\n[#QUOTE]=2 \{\ +. rn B_QUOTE Q_TEMP +. di B_QUOTE +. vs \\n[#BQ_LEAD]u +. PRINT \& +. sp -1v+\\n[#Q_LEAD_DIFF]u +. Q_TEMP +. di +. \} +. rm Q_TEMP +. \} +. el \{\ +. ALD (\\n[#DOC_LEAD]u/2u)+\\n[#Q_LEAD_DIFF]u +. \} +. \} +. \} +. if \\n[#DIVER_FN]=2 \{ .rr #DIVER_FN \} +. \} +.END +\# +.MAC Q_NOFIT END +. rr #Q_FITS +. ie r#HEAD \{\ +. if \\n[#HEAD]=1 \{ . \} +. \} +. el \{\ +. ie \\n[#FULLSPACE_QUOTES] \{\ +. ie \\n[#ENDNOTE] \{ .ALD \\n[#EN_LEAD]u+\\n[#Q_LEAD_DIFF]u \} +. el \{ .ALD \\n[#DOC_LEAD]u+\\n[#Q_LEAD_DIFF]u \} +. \} +. el \{ .ALD (\\n[#DOC_LEAD]u/2u)+\\n[#Q_LEAD_DIFF]u \} +. nr #Q_PARTIAL_DEPTH 0 \\n[#Q_LEAD_REAL] +. while \\n+[#Q_PARTIAL_DEPTH]<(\\n[#TRAP_DISTANCE]-1) \{\ +. +.\} +. nr #Q_PARTIAL_DEPTH -\\n[#Q_LEAD_REAL] +. nr #Q_SPACE_ADJ (\\n[#TRAP_DISTANCE]-1)-\\n[#Q_PARTIAL_DEPTH]+\\n[#Q_LEAD_DIFF]u +.\" Hack to deal with the fact that even though the above routine +.\" makes the bottom line of the quote fall exactly on the bottom +.\" margin when traps are disabled, it refuses to do so when traps +.\" are on. The difference by which it's off is #Q_LEAD_DIFF +.\" (the +\\n[#Q_LEAD_DIFF] at the end of the line, above). Hack +.\" solution: temporarily lower the FOOTER trap position. +. nr #SAVED_FOOTER_POS \\n[#VARIABLE_FOOTER_POS] +. ch FOOTER \\n[#VARIABLE_FOOTER_POS]u+.25v +. \} .END \# \# ==================================================================== @@ -9059,7 +9967,6 @@ . if \\n[#QUOTE]=1 \{\ . nf . P_QUOTE -. if !\\n[#START] \{ .rr #QUOTE \} . \} . if \\n[#QUOTE]=2 \{\ . nf @@ -9135,67 +10042,6 @@ .END \# \# -\# PAGENUMBER FAMILY -\# ----------------- -\# *Argument: -\# -\# *Function: -\# Creates or modifies string $PAGE_NUM_FAM. -\# *Notes: -\# Default is same as running text. -\# -.MAC PAGENUM_FAMILY END -. ds $PAGE_NUM_FAM \\$1 -.END -\# -\# -\# PAGE NUMBER FONT -\# ---------------- -\# *Arguments: -\# -\# *Function: -\# Creates or modifies string $PAGE_NUM_FT. -\# *Notes: -\# Default is same as running text. -\# -.MAC PAGENUM_FONT END -. ds $PAGE_NUM_FT \\$1 -.END -\# -\# -\# PAGE NUMBER SIZE -\# ---------------- -\# *Argument: -\# <+|- number of points by which to in/decrease point size of -\# page numbers (relative to running text)> -\# *Function: -\# Creates or modifies string $PAGE_NUM_SIZE_CHANGE. -\# *Notes: -\# Must be preceded by a +|- sign with no space afterward. -\# Fractional point sizes are allowed. -\# Default is +0. -\# -.MAC PAGENUM_SIZE END -. ds $PAGE_NUM_SIZE_CHANGE \\$1 -.END -\# -\# -\# PAGNUMBER COLOR -\# --------------- -\# *Arguments: -\# -\# *Function: -\# Defines string $PAGENUM_COLOR to argument. -\# *Notes: -\# User must define an XCOLOR or NEWCOLOR before using -\# PAGENUM_COLOR. -\# -.MAC PAGENUM_COLOR END -. if \\n[#PRINT_STYLE]=1 \{ .return \} -. ds $PAGENUM_COLOR \\$1 -.END -\# -\# \# PAGE NUMBER FORMAT \# ------------------ \# *Arguments: @@ -9270,6 +10116,7 @@ . nr #HYPHEN_ADJ \\n[#CAP_HEIGHT]/12 . ds $HYPHEN \v'-\En[#HYPHEN_ADJ]u'-\v'\En[#HYPHEN_ADJ]u' . PRINT \m[\\*[$PAGENUM_COLOR]]\\*[$HYPHEN]\|\\n[#PAGENUMBER]\|\\*[$HYPHEN] +.br .END \# \# @@ -9291,11 +10138,9 @@ . FT \\*[$PAGE_NUM_FT] . PT_SIZE \\n[#DOC_PT_SIZE]u\\*[$PAGE_NUM_SIZE_CHANGE] . if \\n[#PRINT_STYLE]=1 \{\ -. fam C -. ft R -. ps 12 +. TYPEWRITER . \} -. if \\n[#PAGE_NUM_V_POS]=1 \{ .EL \} +. if \\n[#PAGE_NUM_V_POS]=1 \{ .vs 0 \} . if o \{\ . ie \\n[#PAGE_NUM_H_POS]=1 \{ .LEFT \} . el \{ .RIGHT \} @@ -9315,6 +10160,10 @@ . if \\n[#EN_FIRST_PN] \{ .PAGENUMBER \\n[#EN_FIRST_PN] \} . rr #EN_FIRST_PAGE . \} +. if \\n[#BIB_FIRST_PAGE] \{\ +. if \\n[#BIB_FIRST_PN] \{ .PAGENUMBER \\n[#BIB_FIRST_PN] \} +. rr #BIB_FIRST_PAGE +. \} . if \\n[#TOC_FIRST_PAGE] \{\ . PAGENUMBER 1 . rr #TOC_FIRST_PAGE @@ -9368,68 +10217,14 @@ \# \# +++FOOTNOTES+++ \# -\# FOOTNOTE FAMILY -\# -------------- -\# *Argument: -\# -\# *Function: -\# Creates or modifies string $FN_FAM. -\# *Notes: -\# Default is same as running text. -\# -.MAC FOOTNOTE_FAMILY END -. ds $FN_FAM \\$1 -.END -\# -\# -\# FOOTNOTE FONT -\# -------------- -\# *Argument: -\# -\# *Function: -\# Creates or modifies string $FN_FT. -\# *Notes: -\# Default is roman. -\# -.MAC FOOTNOTE_FONT END -. ds $FN_FT \\$1 -.END -\# -\# -\# FOOTNOTE SIZE -\# ------------ -\# *Argument: -\# <+|- number of points by which to in/decrease point size of footnotes -\# (relative to running text)> -\# *Function: -\# Creates or modifies string $FN_SIZE_CHANGE. -\# *Notes: -\# Must be preceded by a +|- sign. No space afterwards. -\# Fractional point sizes are allowed. -\# Default is -2 for printstyle TYPESET; +0 for TYPEWRITE. -\# -.MAC FOOTNOTE_SIZE END -. ds $FN_SIZE_CHANGE \\$1 -.END -\# -\# -\# FOOTNOTE COLOR -\# -------------- -\# *Arguments: -\# -\# *Function: -\# Sets register #FOOTNOTE_COLOR to 1; defines string -\# $FOOTNOTE_COLOR to argument. -\# *Notes: -\# User must define an XCOLOR or NEWCOLOR before using -\# FOOTNOTE_COLOR. -\# -.MAC FOOTNOTE_COLOR END -. if \\n[#PRINT_STYLE]=1 \{ .return \} -. nr #FOOTNOTE_COLOR 1 -. ds $FOOTNOTE_COLOR \\$1 -.END -\# +.ig +Mom's footnote handling is baroque, to say the least. There are +redundancies in a number of the macros involved, as well as some +registers that probably don't get used anymore. The baggage is left +in in case some new footnote oddity/challenge gets thrown my way. + +The macros are heavily commented. +.. \# \# FOOTNOTE AUTOLEAD \# ----------------- @@ -9445,20 +10240,6 @@ .END \# \# -\# FOOTNOTE QUAD -\# ------------- -\# *Arguments: -\# -\# *Function: -\# Creates or modifies string $FN_QUAD. -\# *Notes: -\# Default is same as running text. -\# -.MAC FOOTNOTE_QUAD END -. ds $FN_QUAD \\$1 -.END -\# -\# \# FOOTNOTE MARKERS \# ---------------- \# *Arguments: @@ -9477,23 +10258,129 @@ \# FOOTNOTE MARKER STYLE \# --------------------- \# *Arguments: -\# STAR | NUMBER +\# STAR | NUMBER | LINE \# *Function: \# Sets register #FN_MARKER_STYLE, used in FOOTNOTE to determine \# the style of footnote markers. \# *Notes: -\# 1=STAR; 2=NUMBER. Default is STAR. +\# 1=STAR; 2=NUMBER; 3=LINE. LINE means "use output line numbers". +\# Default is STAR. \# .MAC FOOTNOTE_MARKER_STYLE END . if '\\$1'STAR' \{\ +. if \\n[#FN_MARKER_STYLE]=3 \{\ +. if !\\n[#NEWPAGE]=1 \{\ +. tm1 "[mom]: Your current FOOTNOTE_MARKER STYLE is LINE. +. tm1 " You cannot change footnote marker style without +. tm1 " first breaking to a new page with NEWPAGE. +. tm1 " Ignoring request FOOTNOTE_MARKER_STYLE STAR at line \\n(.c. +. return +. \} +. \} +. if \\n[#RUN_ON]=1 \{\ +. tm1 "[mom]: FOOTNOTE_MARKER_STYLE STAR at line \\n(.c is incompatible +. tm1 " with RUN_ON footnotes. Ignoring request. +. return +. \} . nr #FN_MARKER_STYLE 1 +. if \\n[#NEWPAGE]=1 \{ .rr #NEWPAGE \} +. FOOTNOTE_MARKERS . \} . if '\\$1'NUMBER' \{\ +. if \\n[#FN_MARKER_STYLE]=3 \{\ +. if !\\n[#NEWPAGE]=1 \{\ +. tm1 "[mom]: Your current FOOTNOTE_MARKER STYLE is NUMBER. +. tm1 " You cannot change footnote marker style without +. tm1 " first breaking to a new page with NEWPAGE. +. tm1 " Ignoring request FOOTNOTE_MARKER_STYLE NUMBER at line \\n(.c. +. return +. \} +. \} +. if \\n[#RUN_ON]=1 \{\ +. tm1 "[mom]: FOOTNOTE_MARKER_STYLE NUMBER at line \\n(.c is incompatible +. tm1 " with RUN_ON footnotes. Ignoring request. +. return +. \} . nr #FN_MARKER_STYLE 2 +. if \\n[#NEWPAGE]=1 \{ .rr #NEWPAGE \} +. FOOTNOTE_MARKERS . \} +. if '\\$1'LINE' \{\ +. nr #FN_MARKER_STYLE 3 +. FOOTNOTE_MARKERS OFF +. if !\\n[#FN_LN_SEP] \{\ +. if !\\n[#FN_LN_BRACKETS] \{ .FOOTNOTE_LINENUMBER_BRACKETS SQUARE \} +. \} +. \} +.END +\# +\# +\# FOOTNOTE LINENUMBER MARK +\# ------------------------ +\# *Function: +\# This string, when called inline, stores the current output line +\# number in register #FN_MARK for use with FOOTNOTE. +\# +.ds FN-MARK \R'#FN_MARK \En(ln' +\# +\# +\# FOOTNOTE LINENUMBER SEPARATOR +\# ----------------------------- +\# *Argument: +\# +\# *Function: +\# Stores user-defined separator (for use then +\# FOOTNOTE_MARKER_STYLE is LINE) in string $FN_LN_SEP. The +\# separator is intended to be used when the user wishes a +\# separator, rather than the choice of brackets offered by +\# FOOTNOTE_LINENUMBER_BRACKETS. +\# +.MAC FOOTNOTE_LINENUMBER_SEPARATOR END +. rr #FN_LN_BRACKETS +. nr #FN_LN_SEP 1 +. ds $FN_LN_SEP "\\$1 .END \# \# +\# FOOTNOTE LINENUMBER BRACKETS +\# ---------------------------- +\# *Argument: +\# PARENS | SQUARE | BRACES or ( | [ | { +\# *Function: +\# Sets register #FN_LN_BRACKETS to 1, and creates strings +\# $FN_OPEN_BRACKET and $FN_CLOSE_BRACKET according to the given +\# argument. +\# +.MAC FOOTNOTE_LINENUMBER_BRACKETS END +. rr #FN_LN_SEP +. nr #FN_LN_BRACKETS 1 +. if '\\$1'PARENS' \{\ +. ds $FN_OPEN_BRACKET ( +. ds $FN_CLOSE_BRACKET ) +. \} +. if '\\$1'(' \{\ +. ds $FN_OPEN_BRACKET ( +. ds $FN_CLOSE_BRACKET ) +. \} +. if '\\$1'SQUARE' \{\ +. ds $FN_OPEN_BRACKET [ +. ds $FN_CLOSE_BRACKET ] +. \} +. if '\\$1'[' \{\ +. ds $FN_OPEN_BRACKET [ +. ds $FN_CLOSE_BRACKET ] +. \} +. if '\\$1'BRACES' \{\ +. ds $FN_OPEN_BRACKET { +. ds $FN_CLOSE_BRACKET } +. \} +. if '\\$1'{' \{\ +. ds $FN_OPEN_BRACKET { +. ds $FN_CLOSE_BRACKET } +. \} +.END +\# +\# \# RESET FOOTNOTE NUMBER \# --------------------- \# *Arguments: @@ -9556,10 +10443,10 @@ .MAC FOOTNOTE_RULE END . ie '\\$0'PRINT_FOOTNOTE_RULE' \{\ . if \\n[#FN_RULE]=0 \{ .RLD 1v \} -\!. PT_SIZE 12 \"Not sure why these have to be transparently embedded, but they do. +\!. PT_SIZE 12 . RLD 1v . LEFT -. PRINT \\v'-\\n[#FN_RULE_ADJ]u'\\l'\\n[#FN_RULE_LENGTH]u'\\v'+\\n[#FN_RULE_ADJ]u' +. PRINT \v'-\\n[#FN_RULE_ADJ]u'\l'\\n[#FN_RULE_LENGTH]u'\v'+\\n[#FN_RULE_ADJ]u' \!. PT_SIZE \\n[#DOC_PT_SIZE]u\\*$[FN_SIZE_CHANGE] . QUAD \\*[$FN_QUAD] . \} @@ -9570,27 +10457,204 @@ .END \# \# -\# FOOTNOTE -\# -------- +\# FOOTNOTE SPACING +\# ---------------- \# *Arguments: -\# | INDENT L|LEFT|R|RIGHT|B|BOTH > | +\# | \# *Function: -\# Begins collecting and diverting footnote text if no argument -\# given. Otherwise, ends diversion FOOTNOTES, measures footnote -\# depth, and sets footnote trap. +\# Enables printing of post footnote spacing. \# *Notes: -\# The input line preceding a footnote call MUST terminate with \c -\# or the footnote marker will be spaced away from the word it -\# should be joined to. +\# Default is no space. \# -\# If FOOTNOTES is invoked with INDENT, the footnote will -\# be indented. An indent style and an indent value must be given. -\# Subsequent footnotes will NOT be indented; INDENT must be given -\# for each footnote the user wants indented. +.MAC FOOTNOTE_SPACING END +. ie \B'\\$1' \{ .nr #FN_SPACE (\\$1) \} +. el \{ .nr #FN_SPACE 0 \} +.END \# -.MAC FOOTNOTE END +\# +\# RUN ON FOOTNOTES +\# ---------------- +\# *Arguments: +\# | +\# *Function: +\# Toggles run-on footnotes on or off. +\# +.MAC FOOTNOTES_RUN_ON END . ie '\\$1'' \{\ -. if \\n[#FN_MARKERS] \{\ +. if \\n[#FN_COUNT]>0 \{\ +. tm1 "[mom]: Switching to run-on footnotes at line \\n(.c will cause +. tm1 " you to loose footnotes already formatted for this page. +. tm1 " Ignoring request FOOTNOTES_RUN_ON. +. rr #RUN_ON +. return +. \} +. nr #RUN_ON 1 +. if \\n[#FN_MARKER_STYLE]=1 \{ .RUNON_WARNING \} +. if \\n[#FN_MARKER_STYLE]=2 \{ .RUNON_WARNING \} +. \} +. el \{\ +. if \\n[#FN_COUNT]>0 \{\ +. if \\n[#RUN_ON]=1 \{\ +. tm1 "[mom]: Switching off run-on footnotes at line \\n(.c will cause +. tm1 " you to loose footnotes already formatted for this page. +. tm1 " Ignoring request FOOTNOTES_RUN_ON \\$1. +. return +. \} +. \} +. rr #RUN_ON +. \} +.END +\# +\# +.MAC RUNON_WARNING END +. if \\n[#FN_MARKER_STYLE]=1 \{\ +. tm1 "[mom]: The footnote marker style active at line \\n(.c is STAR, +. tm1 " which is incompatible with run-on footnotes. Please change +. tm1 " the footnote marker style to LINE. Continuing to process, +. tm1 " but ignoring request FOOTNOTES_RUN_ON. +. rr #RUN_ON +. \} +. if \\n[#FN_MARKER_STYLE]=2 \{\ +. tm1 "[mom]: The footnote marker style active at line \\n(.c is NUMBER, +. tm1 " which is incompatible with run-on footnotes. Please change +. tm1 " the footnote marker style to LINE. Continuing to process, +. tm1 " but ignoring request FOOTNOTES_RUN_ON. +. rr #RUN_ON +. \} +.END +\# +\# FOOTNOTE +\# -------- +\# *Arguments: +\# | INDENT L|LEFT|R|RIGHT|B|BOTH | +\# *Function: +\# Begins collecting and diverting footnote text if no argument +\# given. Otherwise, ends diversion FOOTNOTES, measures footnote +\# depth, and sets footnote trap. +\# *Notes: +\# The input line preceding a footnote call MUST terminate with \c +\# or the footnote marker will be spaced away from the word it +\# should be joined to. +\# +\# If FOOTNOTE is invoked with INDENT, the footnote will +\# be indented. An indent style and an indent value must be given. +\# Subsequent footnotes will NOT be indented; INDENT must be given +\# for each footnote the user wants indented. +\# +.MAC FOOTNOTE END +. if !\\n(.u \{ .nr #ADD_BREAK 1 \} +. ie '\\$1'' \{\ +. if \\n[#FN_MARKER_STYLE]=3 \{\ +. if !\\n[#LINENUMBERS] \{\ +. tm1 "[mom]: Line numbering must be enabled with NUMBER_LINES when +. tm1 " FOOTNOTE_MARKER_STYLE is LINE. +. ab Aborting on FOOTNOTE at line \\n(.c. +. \} +. if \\n[#FN_MARK]=0 \{ .nr #FN_MARK \\n(ln \} +. nr #FN_MARK_2 \\n(ln +. if '\\n(.z'P_QUOTE' \{\ +. nr #FN_MARK -1 +. nr #FN_MARK_2 -1 +. \} +. if \\n[#IN_DIVER]=1 \{\ +. if '\\n(.z'P_QUOTE' \{\ +. if !\\n[#QUOTE_LN]=1 \{\ +. if !\\n[#SILENT_QUOTE_LN]=1 \{\ +. tm1 "[mom]: You have requested a line-numbered footnote inside a +. tm1 " QUOTE at line \\n(.c, but line-numbering has not been enabled +. tm1 " for QUOTES. Printing footnote with label "0". +. rr #FN_MARK +. rr #FN_MARK_2 +. \} +. \} +. \} +. if '\\n(.z'B_QUOTE' \{\ +. if !\\n[#BQUOTE_LN]=1 \{\ +. if !\\n[#SILENT_BQUOTE_LN]=1 \{\ +. tm1 "[mom]: You have requested a line-numbered footnote inside a +. tm1 " BLOCKQUOTE at line \\n(.c, but line-numbering has not been enabled +. tm1 " for BLOCKQUOTES. Printing footnote with label "0". +. rr #FN_MARK +. rr #FN_MARK_2 +. \} +. \} +. \} +. \} +. \} +.\" Begin processing footnotes that occur inside QUOTE, BLOCKQUOTE +.\" or EPIGRAPH. +. if \\n[#IN_DIVER]=1 \{\ +. nr #PAGE_POS \\n(nl+\\n(.d+\\n[#DOC_LEAD] +. nr #FOOTER_POS \\n[#PAGE_LENGTH]+(\\n[#VARIABLE_FOOTER_POS]-1) +. nr #SPACE_TO_FOOTER \\n[#FOOTER_POS]-\\n[#PAGE_POS] +.\" Are we on a "defer" line? If so, defer the text of the footnote. +. ie \\n[#SPACE_TO_FOOTER]=\\n[#DOC_LEAD]:\\n[#SPACE_TO_FOOTER]=0 \{\ +. nr #DIVER_FN 2 \" treat like a normal deferred footnote +. \} +. el \{\ +. nr #DIVER_FN 2 \" treat like a normal footnote +. \} +. if \\n[#PAGE_POS]>\\n[#FOOTER_POS] \{\ +. nr #DIVER_FN 1 \" move this footnote +. \} +.\" Test for situation where, because a final line of QUOTE, BLOCKQUOTE +.\" or EPIGRAPH isn't yet adjusted at this point, the last word on the +.\" line may *seem* to belong to the final line of the page, but will, +.\" in fact, become the first word of the subsequent page. In such +.\" circumstances, we want the the footnote to be treated as a "moved" +.\" diversion footnote. +. if \\n(.k>\\n(.l \{ .nr #DIVER_FN 1 \} +. if r#DIVER_FN \{\ +. if !\\n[#DIVER_FN]=2 \{ .\\n+[#DONE_ONCE] \} +.\" A footnote inside a diversion will become the 1st footnote on the +.\" following page/column. +. if \\n[#DIVER_FN]=1 \{ .DIVER_FN_1_PRE \} +.\" A footnote inside a diversion that should be treated like a +.\" normal footnote (including defers.) +. if \\n[#DIVER_FN]=2 \{ .DIVER_FN_2_PRE \} +. \} +. nr #SAVED_FN_COUNT \\n[#FN_COUNT]+1 +. nr #SAVED_FN_COUNT_FOR_COLS \\n[#FN_COUNT_FOR_COLS]+1 +. \} +.\" End processing footnotes that occur inside QUOTE, BLOCKQUOTE or +.\" EPIGRAPH. +.\" +.\" Test for situation where, because a final line of running text +.\" isn't yet adjusted at this point, the last word on the line may +.\" *seem* to belong to the final line of the page, but will, in +.\" fact, become the first word of the subsequent page. In such +.\" circumstances, we want the the footnote marker in running text to +.\" be the correct one for the 1st footnote on the page. +. if \\n(.k>\\n(.l \{\ +. if (\\n(nl+\\n[#DOC_LEAD])>(\\n[#PAGE_LENGTH]+\\n[#VARIABLE_FOOTER_POS]) \{\ +. ie \\n[#COLUMNS]=1 \{\ +. if \\n[#COL_NUM]=\\n[#NUM_COLS] \{\ +. if \\n[#FN_MARKER_STYLE]=1 \{\ +. nr #FN_COUNT_FOR_COLS 0 1 +. \} +. if \\n[#FN_MARKER_STYLE]=2 \{\ +. if \\n[#RESET_FN_NUMBER] \{\ +. nr #FN_NUMBER 0 1 +. nr #NOT_YET_ADJUSTED 1 +. \} +. \} +. \} +. \} +. el \{\ +. if \\n[#FN_MARKER_STYLE]=1 \{\ +. nr #FN_COUNT 0 1 +. \} +. if \\n[#FN_MARKER_STYLE]=2 \{\ +. if \\n[#RESET_FN_NUMBER] \{\ +. nr #FN_NUMBER 0 1 +. nr #NOT_YET_ADJUSTED 1 +. \} +. \} +. \} +. \} +. \} +. if \\n[#FN_MARKERS] \{\ +.\" Housekeeping . if \\n[#CONDENSE] \{ \*[CONDX]\c \} . if \\n[#EXTEND] \{ \*[EXTX]\c \} . if \\n[#PRINT_STYLE]=1 \{\ @@ -9599,48 +10663,75 @@ . UNDERLINE OFF . \} . \} +.\" Add footnote markers to running text... . if !\\n[#NO_FN_MARKER] \{\ -. if \\n[#FN_MARKER_STYLE]=1 \{\ -. ie \\n[#FN_COUNT_FOR_COLS] \{\ -. if \\n[#FN_COUNT_FOR_COLS]=0 \{ .PRINT \*[BU3]* \} -. if \\n[#FN_COUNT_FOR_COLS]=1 \{ .PRINT \*[BU3]\(dg \} -. if \\n[#FN_COUNT_FOR_COLS]=2 \{ .PRINT \*[BU3]** \} -. if \\n[#FN_COUNT_FOR_COLS]=3 \{ .PRINT \*[BU3]\(dg\(dg \} -. if \\n[#FN_COUNT_FOR_COLS]=4 \{ .PRINT \*[BU3]*** \} -. if \\n[#FN_COUNT_FOR_COLS]=5 \{ .PRINT \*[BU3]\(dg\(dg\(dg \} -. if \\n[#FN_COUNT_FOR_COLS]=6 \{ .PRINT \*[BU3]**** \} -. if \\n[#FN_COUNT_FOR_COLS]=7 \{ .PRINT \*[BU3]\(dg\(dg\(dg\(dg \} -. if \\n[#FN_COUNT_FOR_COLS]=8 \{ .PRINT \*[BU3]***** \} -. if \\n[#FN_COUNT_FOR_COLS]=9 \{ .PRINT \*[BU3]\(dg\(dg\(dg\(dg\(dg \} +.\" ...but not if TERMINATE has not been called +. if !r#TERMINATE \{\ +.\" Marker style star/dagger/double-dagger +. if \\n[#FN_MARKER_STYLE]=1 \{\ +.\" Columnar docs either move col to col, or last col to next page. +.\" They require their own special FN_COUNT because regular FN_COUNT +.\" is used to figure out things like whether or not to put a rule +.\" above footnotes (in addition to keeping track of the footnote +.\" count in non-columnar docs). +. ie \\n[#COLUMNS]=1 \{\ +. if \\n[#FN_COUNT_FOR_COLS]=0 \{ .PRINT \*[BU2]*\c \} +. if \\n[#FN_COUNT_FOR_COLS]=1 \{ .PRINT \*[BU1]\(dg\c \} +. if \\n[#FN_COUNT_FOR_COLS]=2 \{ .PRINT \(dd\c \} +. if \\n[#FN_COUNT_FOR_COLS]=3 \{ .PRINT \*[BU2]**\c \} +. if \\n[#FN_COUNT_FOR_COLS]=4 \{ .PRINT \*[BU1]\(dg\(dg\c \} +. if \\n[#FN_COUNT_FOR_COLS]=5 \{ .PRINT \(dd\(dd\c \} +. if \\n[#FN_COUNT_FOR_COLS]=6 \{ .PRINT \*[BU2]***\c \} +. if \\n[#FN_COUNT_FOR_COLS]=7 \{ .PRINT \*[BU1]\(dg\(dg\(dg\c \} +. if \\n[#FN_COUNT_FOR_COLS]=8 \{ .PRINT \(dd\(dd\(dd\c \} +. if \\n[#FN_COUNT_FOR_COLS]=9 \{ .PRINT \*[BU2]****\c \} +. \} +. el \{\ +. if \\n[#FN_COUNT]=0 \{ .PRINT \*[BU2]*\c \} +. if \\n[#FN_COUNT]=1 \{ .PRINT \*[BU1]\(dg\c \} +. if \\n[#FN_COUNT]=2 \{ .PRINT \(dd\c \} +. if \\n[#FN_COUNT]=3 \{ .PRINT \*[BU2]**\c \} +. if \\n[#FN_COUNT]=4 \{ .PRINT \*[BU1]\(dg\(dg\c \} +. if \\n[#FN_COUNT]=5 \{ .PRINT \(dd\(dd\c \} +. if \\n[#FN_COUNT]=6 \{ .PRINT \*[BU2]***\c \} +. if \\n[#FN_COUNT]=7 \{ .PRINT \*[BU1]\(dg\(dg\(dg\c \} +. if \\n[#FN_COUNT]=8 \{ .PRINT \(dd\(dd\(dd\c \} +. if \\n[#FN_COUNT]=9 \{ .PRINT \*[BU2]****\c \} +. \} . \} -. el \{\ -. if \\n[#FN_COUNT]=0 \{ .PRINT \*[BU3]* \} -. if \\n[#FN_COUNT]=1 \{ .PRINT \*[BU3]\(dg \} -. if \\n[#FN_COUNT]=2 \{ .PRINT \*[BU3]** \} -. if \\n[#FN_COUNT]=3 \{ .PRINT \*[BU3]\(dg\(dg \} -. if \\n[#FN_COUNT]=4 \{ .PRINT \*[BU3]*** \} -. if \\n[#FN_COUNT]=5 \{ .PRINT \*[BU3]\(dg\(dg\(dg \} -. if \\n[#FN_COUNT]=6 \{ .PRINT \*[BU3]**** \} -. if \\n[#FN_COUNT]=7 \{ .PRINT \*[BU3]\(dg\(dg\(dg\(dg \} -. if \\n[#FN_COUNT]=8 \{ .PRINT \*[BU3]***** \} -. if \\n[#FN_COUNT]=9 \{ .PRINT \*[BU3]\(dg\(dg\(dg\(dg\(dg\(dg \} +.\" Marker style superscript numbers +. if \\n[#FN_MARKER_STYLE]=2 \{\ +. if \\n[#PRINT_STYLE]=1 \{ .PRINT "\s-2\v'-\\n[#DOC_LEAD]u/5u'\\n+[#FN_NUMBER]\v'+\\n[#DOC_LEAD]u/5u'\s+2\c" \} +. if \\n[#PRINT_STYLE]=2 \{ .PRINT "\*[SUP]\\n+[#FN_NUMBER]\*[SUPX]\c" \} . \} . \} -. if \\n[#FN_MARKER_STYLE]=2 \{\ -. if \\n[#PRINT_STYLE]=1 \{ .PRINT "\s-2\v'-\\n[#DOC_LEAD]u/5u'\\n+[#FN_NUMBER]\v'+\\n[#DOC_LEAD]u/5u'\s+2" \} -. if \\n[#PRINT_STYLE]=2 \{ .PRINT "\*[SUP]\\n+[#FN_NUMBER]\*[SUPX]" \} -. \} . \} . \} -. nr #SPACE_REMAINING \\n[#PAGE_LENGTH]-\\n[#B_MARGIN]-(\\n(nl+1v) +.\" More housekeeping +.\" +.\" #SPACE_REMAINING is the space left between where we are +.\" on the page and the bottom margin. It's used to determine whether +.\" or not the footnote will overflow, and how many lines of +.\" footnotes will fit on the page if some have to overflow. +. ie \\n[#DIVER_FN]=2 \{\ +. nr #SPACE_REMAINING (\\n[#PAGE_LENGTH]-\\n[#B_MARGIN])-(\\n[#PAGE_POS]) +. \} +. el \{\ +. nr #SPACE_REMAINING (\\n[#PAGE_LENGTH]-\\n[#B_MARGIN])-\\n(nl +. \} +. if \\n[#FROM_DIVERT_FN]=1 \{\ +. nr #SPACE_REMAINING \\n[#PAGE_LENGTH]-\\n[#B_MARGIN] +. rr #FROM_DIVERT_FN +. \} . nr #PP_STYLE_PREV \\n[#PP_STYLE] . nr #PP_STYLE 2 . if \\n[#INDENT_FIRST_PARAS] \{ .nr #INDENT_FIRSTS 1 \} . INDENT_FIRST_PARAS +.\" Prepare FOOTNOTE to receive footnote text. . ev FOOTNOTES . ll \\n[#DOC_L_LENGTH]u . ta \\n(.lu -. if \\n[#COLUMNS] \{\ +. if \\n[#COLUMNS]=1 \{\ . ll \\n[#COL_L_LENGTH]u . ta \\n(.lu . \} @@ -9658,72 +10749,193 @@ . AUTOLEAD \\n[#FN_AUTOLEAD] . QUAD \\*[$FN_QUAD] . if \\n[#PRINT_STYLE]=1 \{\ -. fam C -. ft R -. ps 12 -. ie \\n[#SINGLE_SPACE] \{ .vs \\n[#DOC_LEAD]u \} -. el \{ .vs \\n[#DOC_LEAD]u/2u \} +. TYPEWRITER +. ie \\n[#SINGLE_SPACE] \{ .vs \\n[#ORIGINAL_DOC_LEAD]u \} +. el \{ .vs \\n[#ORIGINAL_DOC_LEAD]u/2u \} . QUAD LEFT . HY OFF . \} . nr #FN_LEAD \\n[#LEAD] -. da FOOTNOTES -. if \\n[#FOOTNOTE_COLOR]=1 \{\ -. TRAP OFF -. nf -\m[\\*[$FOOTNOTE_COLOR]] -. EL -. fi -. TRAP +.\" Begin diversion FOOTNOTES or FN_IN_DIVER +. ie r#COUNTERS_RESET \{\ +. ie \\n[#DONE_ONCE]=1 \{\ +. ie \\n[#RUN_ON] \{\ +. di RUNON_FN_IN_DIVER +. nr #RUNON_FN_IN_DIVER 1 +. \} +. el \{ .di FN_IN_DIVER \} +. \} +. el \{\ +. ie \\n[#RUN_ON] \{\ +. da RUNON_FN_IN_DIVER +. nr #RUNON_FN_IN_DIVER 1 +. \} +. el \{ .da FN_IN_DIVER \} +. \} +. \\n+[#DONE_ONCE] +. \} +. el \{\ +. ie \\n[#RUN_ON] \{\ +. da RUNON_FOOTNOTES +. nr #RUNON_FOOTNOTES 1 . \} +. el \{ .da FOOTNOTES \} +. \} +. if \\n[#FOOTNOTE_COLOR]=1 \{\ +. TRAP OFF +. nf +\m[\\*[$FOOTNOTE_COLOR]] +. EOL +. fi +. TRAP +. \} . if \\n[#EPIGRAPH] \{ .nr #FN_FOR_EPI 1 \} +.\" When a deferred footnote is also the 1st footnote on the page, +.\" and when the page it's output on also has footnotes, some +.\" whitespace is needed between the deferred footnote and the +.\" first footnote belonging to the output page so that there's +.\" no confusion when two stars (or two number 1s) appear in +.\" footnotes... . if \\n[#FN_DEFER_SPACE] \{\ -. if \\n[#FN_MARKER_STYLE]=1 \{ .ALD 1v \} -. if \\n[#RESET_FN_NUMBER] \{ .ALD 1v \} +.\" ...but only add the extra space if TERMINATE has not been called +. if !r#TERMINATE \{\ +.\" ...and not if defer space has already been added +. if !\\n[#DEFER_SPACE_ADDED] \{\ +.\" ...and not if the footnote count the last time we checked for +.\" a defer situation inside a diversion is greater than 1. +. if !\\n[#SAVED_DIVER_FN_COUNT]>1 \{\ +. if \\n[#FN_MARKER_STYLE]=1 \{ .ALD 1v \} +. if \\n[#RESET_FN_NUMBER] \{ .ALD 1v \} +. nr #DEFER_SPACE_ADDED 1 +. \} +. \} +. \} . rr #FN_DEFER_SPACE +. rr #SAVED_DIVER_FN_COUNT +. \} +. if \\n[#DIVERTED]=3 \{\ +. if \\n[#FN_COUNT]>0 \{\ +\!. RLD 1v +. \} . \} +.\" Add footnote rule (or, if no rule, some whitespace). +.\" N.B.- this line increments #FN_COUNT each and every time FOOTNOTE +.\" is run. . if \\n+[#FN_COUNT]=1 \{\ -. if !\\n[#FN_DEPTH] \{\ -. if \\n[#PRINT_STYLE]=1 \{ .ALD \\n[#DOC_LEAD]u \} -. ie \\n[#FN_RULE] \{ .PRINT_FOOTNOTE_RULE \} -. el \{ .ALD 1v \} +.\" If a footnote is called in a diversion, and the footnote has to +.\" be moved, don't put in the rule now (it's taken care of when +.\" FN_IN_DIVER is output into FOOTNOTE in PROCESS_FN_IN_DIVER). +. if !\\n[#DONT_RULE_ME]=1 \{\ +. if !\\n[#FN_DEPTH] \{\ +. if \\n[#PRINT_STYLE]=1 \{\ +. if !\\n[#RUN_ON] \{ .ALD \\n[#DOC_LEAD]u \} +. \} +. ie \\n[#FN_RULE]=1 \{\ +. if !\\n[#RUN_ON] \{ .PRINT_FOOTNOTE_RULE \} +. \} +. el \{ .ALD 1v \} +. nr #RULED 1 +. \} . \} . \} -. if \\n[#FN_MARKERS] \{\ +. rr #DONT_RULE_ME +.\" Add footnote markers to footnote text... +. ie \\n[#FN_MARKERS] \{\ +. if \\n[#FN_SPACE]>0 \{\ +. if \\n[#FN_COUNT]>0 \{\ +. ALD \\n[#FN_SPACE]u +. \} +. \} . if !\\n[#NO_FN_MARKER] \{\ -. if \\n[#FN_MARKER_STYLE]=1 \{\ -. ie \\n+[#FN_COUNT_FOR_COLS] \{\ -. if \\n[#FN_COUNT_FOR_COLS]=1 \{ .PRINT *\c \} -. if \\n[#FN_COUNT_FOR_COLS]=2 \{ .PRINT \(dg\c \} -. if \\n[#FN_COUNT_FOR_COLS]=3 \{ .PRINT **\c \} -. if \\n[#FN_COUNT_FOR_COLS]=4 \{ .PRINT \(dg\(dg\c \} -. if \\n[#FN_COUNT_FOR_COLS]=5 \{ .PRINT ***\c \} -. if \\n[#FN_COUNT_FOR_COLS]=6 \{ .PRINT \(dg\(dg\(dg\c \} -. if \\n[#FN_COUNT_FOR_COLS]=7 \{ .PRINT ****\c \} -. if \\n[#FN_COUNT_FOR_COLS]=8 \{ .PRINT \(dg\(dg\(dg\(dg\c \} -. if \\n[#FN_COUNT_FOR_COLS]=9 \{ .PRINT *****\c \} -. if \\n[#FN_COUNT_FOR_COLS]=10 \{ .PRINT \(dg\(dg\(dg\(dg\(dg\c \} +.\" ...but not if TERMINATE has been called. +. if !r#TERMINATE \{\ +. if \\n[#REF]=1 \{\ +\!. in +\\*[$REF_FN_INDENT] +\!. ti -\\*[$REF_FN_INDENT] +. \} +. if \\n[#FN_MARKER_STYLE]=1 \{\ +. ie \\n[#COLUMNS]=1 \{\ +. \\n+[#FN_COUNT_FOR_COLS] +. if \\n[#FN_COUNT_FOR_COLS]=1 \{ .PRINT *\c \} +. if \\n[#FN_COUNT_FOR_COLS]=2 \{ .PRINT \(dg\c \} +. if \\n[#FN_COUNT_FOR_COLS]=3 \{ .PRINT \(dd\c \} +. if \\n[#FN_COUNT_FOR_COLS]=4 \{ .PRINT **\c \} +. if \\n[#FN_COUNT_FOR_COLS]=5 \{ .PRINT \(dg\(dg\c \} +. if \\n[#FN_COUNT_FOR_COLS]=6 \{ .PRINT \(dd\(dd\c \} +. if \\n[#FN_COUNT_FOR_COLS]=7 \{ .PRINT ***\c \} +. if \\n[#FN_COUNT_FOR_COLS]=8 \{ .PRINT \(dg\(dg\(dg\c \} +. if \\n[#FN_COUNT_FOR_COLS]=9 \{ .PRINT \(dd\(dd\(dd\c \} +. if \\n[#FN_COUNT_FOR_COLS]=10 \{ .PRINT ****\c \} +. \} +. el \{\ +. if \\n[#FN_COUNT]=1 \{ .PRINT *\c \} +. if \\n[#FN_COUNT]=2 \{ .PRINT \(dg\c \} +. if \\n[#FN_COUNT]=3 \{ .PRINT \(dd\c \} +. if \\n[#FN_COUNT]=4 \{ .PRINT **\c \} +. if \\n[#FN_COUNT]=5 \{ .PRINT \(dg\(dg\c \} +. if \\n[#FN_COUNT]=6 \{ .PRINT \(dd\(dd\c \} +. if \\n[#FN_COUNT]=7 \{ .PRINT ***\c \} +. if \\n[#FN_COUNT]=8 \{ .PRINT \(dg\(dg\(dg\c \} +. if \\n[#FN_COUNT]=9 \{ .PRINT \(dd\(dd\(dd\c \} +. if \\n[#FN_COUNT]=10 \{ .PRINT ****\c \} +. \} +. \} +. if \\n[#FN_MARKER_STYLE]=2 \{\ +. if \\n[#COLUMNS]=1 \{\ +. \\n+[#FN_COUNT_FOR_COLS] +. \} +. if \\n[#NOT_YET_ADJUSTED]=1 \{\ +. nr #FN_NUMBER 1 1 +. rr #NOT_YET_ADJUSTED +. \} +. if \\n[#PRINT_STYLE]=1 \{ .PRINT "(\\n[#FN_NUMBER])\c" \} +. if \\n[#PRINT_STYLE]=2 \{ .PRINT "\*[SUP]\\n[#FN_NUMBER]\*[SUPX]\*[FU 2]\c" \} +. \} +. \} +. \} +. \} +. el \{\ +.\" Line-numbered footnotes handling +. if \\n[#FN_MARKER_STYLE]=3 \{\ +. if \\n[#FN_SPACE]>0 \{\ +. if !\\n[#RUN_ON]=1 \{\ +. if \\n[#FN_COUNT]>0 \{\ +. ALD \\n[#FN_SPACE]u +. \} +. \} +. \} +. if \\n[#REF]=1 \{\ +. if !\\n[#RUN_ON]=1 \{\ +\!. in +\\*[$REF_FN_INDENT] +\!. ti -\\*[$REF_FN_INDENT] +. \} +. \} +. ie \\n[#FN_LN_BRACKETS]=1 \{\ +. ds $FN_LINENUMBER \v'-.085m'\\*[$FN_OPEN_BRACKET]\v'.085m' +. ie \\n[#FN_MARK_2]=\\n[#FN_MARK] \{\ +. as $FN_LINENUMBER \\n[#FN_MARK]\v'-.085m'\\*[$FN_CLOSE_BRACKET]\v'.085m' \" . \} . el \{\ -. if \\n[#FN_COUNT]=1 \{ .PRINT *\c \} -. if \\n[#FN_COUNT]=2 \{ .PRINT \(dg\c \} -. if \\n[#FN_COUNT]=3 \{ .PRINT **\c \} -. if \\n[#FN_COUNT]=4 \{ .PRINT \(dg\(dg\c \} -. if \\n[#FN_COUNT]=5 \{ .PRINT ***\c \} -. if \\n[#FN_COUNT]=6 \{ .PRINT \(dg\(dg\(dg\c \} -. if \\n[#FN_COUNT]=7 \{ .PRINT ****\c \} -. if \\n[#FN_COUNT]=8 \{ .PRINT \(dg\(dg\(dg\(dg\c \} -. if \\n[#FN_COUNT]=9 \{ .PRINT *****\c \} -. if \\n[#FN_COUNT]=10 \{ .PRINT \(dg\(dg\(dg\(dg\(dg\c \} +. as $FN_LINENUMBER \\n[#FN_MARK]\v'-.1m'-\v'.1m'\\n[#FN_MARK_2]\v'-.085m'\\*[$FN_CLOSE_BRACKET]\v'.085m' \" . \} . \} -. if \\n[#FN_MARKER_STYLE]=2 \{\ -. if \\n[#PRINT_STYLE]=1 \{ .PRINT "(\\n[#FN_NUMBER])\c" \} -. if \\n[#PRINT_STYLE]=2 \{ .PRINT "\*[SUP]\\n[#FN_NUMBER]\*[SUPX]\c" \} +. el \{\ +. ie \\n[#FN_MARK_2]=\\n[#FN_MARK] \{\ +. ds $FN_LINENUMBER \\n[#FN_MARK]\\*[$FN_LN_SEP] +. \} +. el \{\ +. ds $FN_LINENUMBER \\n[#FN_MARK]\v'-.1m'-\v'.1m'\\n[#FN_MARK_2]\\*[$FN_LN_SEP] +. \} . \} +. if !\\n[#NO_FN_MARKER] \{\ +. PRINT \\*[$FN_LINENUMBER]\c +. \} +. rm $FN_LINENUMBER +. nr #FN_MARK 0 . \} . \} . \} +.\" If INDENT arg is passed to FOOTNOTE, calculate the indent... . el \{\ . ie '\\$1'INDENT' \{\ . ev FOOTNOTES @@ -9744,12 +10956,36 @@ . in \\n[#FN_BL_INDENT]u . \} . ev +.\" ...then re-run FOOTNOTE without an argument. . FOOTNOTE . \} . el \{\ . br +.\" Add "defer space" if the previously diverted footnote was the +.\" 1st footnote proper to its page (i.e. it looks like a deferred +.\" footnote but it's really an overflow). +. if \\n[#DIVERTED] \{\ +. if \\n[#PREV_FN_DEFERRED]=1 \{\ +. if \\n[#FN_MARKER_STYLE]=1 \{ .ALD \\n[#FN_LEAD]u \} +. if \\n[#RESET_FN_NUMBER] \{ .ALD \\n[#FN_LEAD]u \} +. nr #PREV_FN_DEFERRED 2 +. \} +. \} +. if \\n[#REF]=1 \{\ +\!. in +. \} +.\" Terminate FOOTNOTES or FN_IN_DIVER diversion . di -. in 0 \"Turn off indent possibly set by FOOTNOTE INDENT... +. HY_SET 1 \\n[#DIVERSIONS_HY_MARGIN]u (\\n[#PT_SIZE]u/1000u/8u)p +. hy 14 +.\" More housekeeping +.\" Turn off indent possibly set by FOOTNOTE INDENT +. in 0 +.\" Restore sentence spacing +. if \\n[#PRINT_STYLE]=2 \{\ +. if d$RESTORE_SS_VAR \{ .SS \\*[$RESTORE_SS_VAR] \} +. rm $RESTORE_SS_VAR +. \} . if \\n[#PRINT_STYLE]=1 \{\ . if \\n[#UNDERLINE_WAS_ON] \{\ . UNDERLINE @@ -9762,124 +10998,555 @@ . nr #PP_STYLE \\n[#PP_STYLE_PREV] . if !\\n[#INDENT_FIRSTS] \{ .INDENT_FIRST_PARAS OFF \} . rr #INDENT_FIRSTS -. nr #FN_DEPTH +\\n[#DIVER_DEPTH] +.\" Calculate footnote depth, but not if #COUNTERS_RESET (created in +.\" DIVER_FN_1_PRE) to instruct FOOTNOTES to skip this step for now +.\" (it's taken care of when FN_IN_DIVER is output into FOOTNOTES in +.\" PROCESS_FN_IN_DIVER). +. ie r#COUNTERS_RESET \{\ +. rr #COUNTERS_RESET +. \} +. el \{\ +. nr #GET_DEPTH 1 +.\" If the footnote is the 1st on the page and it falls too close +.\" to the bottom margin, defer the footnote text to the next page... +. if (\\n[#SPACE_REMAINING]-1)<=(\\n[#DOC_LEAD]) \{\ +.\" ...but not if PROCESS_FN_LEFTOVER has set #PREV_FN_DEFERRED to 1 +. if !\\n[#PREV_FN_DEFERRED]=1 \{\ +. nr #FN_DEFER 1 +. nr #FN_DEPTH +\\n[#DIVER_DEPTH] +. rr #GET_DEPTH +.\" This is required so that the defer space clause can distinguish +.\" a real #FN_COUNT=1 from one generated if FOOTNOTE is run inside +.\" QUOTE, BLOCKQUOTE or EPIGRAPH +. if \\n[#DIVER_FN]=2 \{\ +. nr #SAVED_DIVER_FN_COUNT \\n[#FN_COUNT] +. rr #DIVER_FN +. \} +. \} +. \} +.\" Calculate the footnote depth. +. if \\n[#GET_DEPTH]=1 \{\ +.\" Save the previous footnote depth (for use when there will be +.\" some overflowed footnote text). +. nr #SAVED_FN_DEPTH_1 \\n[#FN_DEPTH] +.\" Add the depth of the current footnote to any already existent +.\" footnotes. +. nr #FN_DEPTH +\\n[#DIVER_DEPTH] +.\" Special handling for run-on footnotes +. if \\n[#RUN_ON]=1 \{\ +. if \\n[#RUNON_FOOTNOTES] \{\ +. unformat RUNON_FOOTNOTES +. \} +. if \\n[#RUNON_FN_IN_DIVER] \{\ +. unformat RUNON_FN_IN_DIVER +. \} +. ev FOOTNOTES +.\" Recreate FOOTNOTES with rule followed by text of unformatted +.\" run-on footnotes. +. di FOOTNOTES +. ie \\n[#FN_RULE]=0 \{ .RLD 1v \} +. el \{\ +. PRINT \v'-\\n[#FN_RULE_ADJ]u'\l'\\n[#FN_RULE_LENGTH]u'\v'+\\n[#FN_RULE_ADJ]u' +. \} +. br +. if \\n[#RUNON_FOOTNOTES] \{\ +. RUNON_FOOTNOTES +. rr #RUNON_FOOTNOTES +. \} +. if \\n[#RUNON_FN_IN_DIVER] \{\ +. RUNON_FN_IN_DIVER +. rr #RUNON_FN_IN_DIVER +. \} +. br +. di +. ev +. nr #FN_DEPTH \\n[#DIVER_DEPTH] +. nr #SAVED_VFP 0+\\n[#VARIABLE_FOOTER_POS] +. nr #VARIABLE_FOOTER_POS 0-\\n[#B_MARGIN]u +. \} +.\" Save the new depth +. nr #SAVED_FN_DEPTH_2 \\n[#FN_DEPTH] +.\" Signal that defer space should be added when PROCESS_FN_LEFTOVER +.\" processes deferred footnotes. +. if \\n[#FN_DEFER] \{\ +. if \\n[#FN_COUNT]=2 \{\ +. ie \\n[#COLUMNS] \{\ +. if !\\n[#FROM_FOOTER] \{\ +. if \\n[#FN_DEFER]=1 \{ .nr #FN_DEFER_SPACE 1 \} +. if \\n[#FN_COUNT_FOR_COLS]>=1 \{ .rr #FN_DEFER_SPACE \} +. if \\n[#FROM_HEADER] \{ .nr #FN_DEFER_SPACE 1 \} +. \} +. \} +. el \{\ +. nr #FN_DEFER_SPACE 1 +. \} +. \} +. rr #FN_DEFER +. \} +.\" If the depth of the whole footnote won't fit in the space +.\" between where we are on the page and the bottom margin, calculate +.\" how much of it will fit. +. if \\n[#FN_DEPTH]>\\n[#SPACE_REMAINING] \{\ +. nr #FN_LINES 0 1 +. while (\\n+[#FN_LINES]*\\n[#FN_LEAD])<\\n[#SPACE_REMAINING] \{\ +. nr #FN_DEPTH (\\n[#FN_LINES]*\\n[#FN_LEAD]) +.\} +. nr #VFP_DIFF \\n[#FN_DEPTH]-\\n[#SAVED_FN_DEPTH_1] +. nr #OVERFLOW 1 +.\" Very occasionally, #VFP_DIFF, on a 1st footnote that isn't to +.\" be deferred, comes up with a depth equal to exactly 1 line +.\" of footnotes, i.e. enough room to print the rule and nothing +.\" else. The following tests for such a condition, and rather than +.\" attempting to treat the footnote as an overflow, it tells mom to +.\" treat it as a special kind of deferred footnote (#FN_DEFER 2). +. if \\n[#SAVED_FN_DEPTH_1]=0 \{\ +. if \\n[#FN_DEPTH]=\\n[#FN_LEAD] \{\ +. nr #FN_DEFER 2 +. nr #FN_DEPTH \\n[#SAVED_FN_DEPTH_2] +. rr #OVERFLOW +. \} +. \} +. \} +.\" Calculate VFP based on whether the footnote overflows, or is to +.\" be treated normally. +. ie \\n[#OVERFLOW]=1 \{\ +. if \\n[#RUN_ON] \{\ +. rr #VARIABLE_FOOTER_POS +. nr #VARIABLE_FOOTER_POS \\n[#SAVED_VFP] +. \} +. ie \\n[#FN_COUNT]=1 \{\ +. ie \\n[#RULED]=1 \{\ +. ie \\n[#COLUMNS]=1 \{\ +. ie \\n[#COL_NUM]=\\n[#NUM_COLS] \{\ +. ie \\n[#FROM_FOOTER] \{\ +. ie \\n[#FN_COUNT_FOR_COLS]>1 \{\ +. nr #FN_DEPTH -\\n[#FN_DEPTH] +. if \\n[#DIVERTED]=1 \{ .nr #DIVERTED 3 \} +. if !\\n[#PREV_FN_DEFERRED]=1 \{\ +. nr #FN_DEPTH -\\n[#VFP_DIFF] +. \} +. \} +. el \{\ +. nr #VARIABLE_FOOTER_POS -\\n[#FN_DEPTH] +. if \\n[#DIVERTED]=1 \{ .nr #DIVERTED 3 \} +. \} +. \} +. el \{\ +. nr #VARIABLE_FOOTER_POS -(\\n[#FN_DEPTH]) +. \} +. \} +. el \{\ +. nr #VARIABLE_FOOTER_POS -(\\n[#FN_DEPTH]) +. \} +. \} +. el \{ .nr #VARIABLE_FOOTER_POS -(\\n[#FN_DEPTH]) \} +. \} +. el \{\ +. nr #VARIABLE_FOOTER_POS -\\n[#VFP_DIFF] +. if \\n[#DIVERTED]=1 \{ .nr #DIVERTED 3 \} +. if !\\n[#PREV_FN_DEFERRED]=1 \{\ +. ie \\n[#COLUMNS]=1 \{\ +. if !\\n[#FROM_FOOTER] \{\ +. +. \} +. \} +. el \{\ +. nr #FN_DEPTH -\\n[#VFP_DIFF] +. \} +. \} +. if \\n[#DIVERTED]=3 \{\ +. if !\\n[#PREV_FN_DEFERRED] \{\ +. if !\\n[#FROM_FOOTER] \{\ +. if \\n[#FN_COUNT]=1 \{\ +. if !\\n[#VFP_DIFF] \{\ +. if \\n[#FN_MARKER_STYLE]=1 \{\ +. da FOOTNOTES +\!. ALD \\n[#FN_LEAD]u +. di +. \} +. if \\n[#RESET_FN_NUMBER] \{\ +. da FOOTNOTES +\!. ALD \\n[#FN_LEAD]u +. di +. \} +. \} +. \} +. \} +. \} +. \} +. \} +. nr #VARIABLE_FOOTER_POS -\\n[#VFP_DIFF] +. nr #FN_DEPTH \\n[#SAVED_FN_DEPTH_1]+\\n[#VFP_DIFF] +. \} +. el \{\ +. nr #VARIABLE_FOOTER_POS -\\n[#VFP_DIFF] +. nr #FN_DEPTH \\n[#SAVED_FN_DEPTH_1]+\\n[#VFP_DIFF] +. \} +. rr #OVERFLOW +. rr #RULED +. \} +. el \{\ +. nr #VARIABLE_FOOTER_POS -\\n[#DIVER_DEPTH] +. if \\n[#PREV_FN_DEFERRED]=1 \{\ +. if \\n[#DIVERTED] \{\ +. if !\\n[#FN_DEPTH]=\\n[#SAVED_FN_DEPTH_1] \{\ +. nr #FN_DEPTH +\\n[#FN_LEAD] +. nr #VARIABLE_FOOTER_POS -\\n[#FN_LEAD] +. rr #PREV_FN_DEFERRED +. \} +. \} +. \} +. if \\n[#FN_COUNT]>1 \{\ +. nr #NO_BACK_UP 1 +. rr #DIVERTED +. rr #RULED +. \} +. \} +. \} +. \} +. ch FOOTER \\n[#VARIABLE_FOOTER_POS]u +.\" See VFP_CHECK for an explanation of the next lines. +.\" The trap has to be removed, prior to setting it, each time +.\" FOOTNOTE is run. +. if \\n[#PRINT_STYLE]=2 \{\ +. ch VFP_CHECK +. wh \\n[#VARIABLE_FOOTER_POS]u-\\n[#DOC_LEAD]u VFP_CHECK +. \} +.\" If we have a footnote whose text has to be deferred to the next +.\" page, reset the FOOTER trap to its original location. . if \\n[#FN_DEFER] \{\ -. nr #FN_DEFER_SPACE 1 -. rr #FN_DEFER +. nr #VARIABLE_FOOTER_POS 0-\\n[#B_MARGIN]u +. ch FOOTER \\n[#VARIABLE_FOOTER_POS]u . \} -. if \\n[#FN_DEPTH]>\\n[#SPACE_REMAINING] \{\ -. ie \\n[#SPACE_REMAINING]<(\\n[#LEAD]*2) \{ .nr #FN_DEFER 1 \} +. \} +. nr #NO_FN_MARKER 0 +. \} +. if \\n[#ADD_BREAK] \{\ +. br +. rr #ADD_BREAK +. \} +.END +\# +\# Utility macros to manage footnotes that occur inside diversions +\# --------------------------------------------------------------- +\# +.ig +There are some redundancies here; they're left in in case unforeseen +footnote situations crop up in the future that might require +manipulation of them. +.. +\# +\# 1. Pre-footnote processing for footnotes in diversions +\# +\# a) A footnote inside a diversion will be moved entirely (marker +\# in running text and text of footnote) to the next page/column. +\# +.MAC DIVER_FN_1_PRE END +. nr #RESET_FN_COUNTERS 1 +. nr #COUNTERS_RESET 1 +. if \\n[#DONE_ONCE]=1 \{\ +. if \\n[#FN_DEFER] \{\ +. if \\n[#SAVED_DIVER_FN_COUNT]=1 \{\ +. ie \\n[#COLUMNS]=1 \{\ +. if \\n[#COL_NUM]=\\n[#NUM_COLS] \{ .nr #FN_DEFER_SPACE 1 \} +. \} . el \{\ -. nr #FN_LINES 0 1 -. while (\\n+[#FN_LINES]*\\n[#FN_LEAD])<\\n[#SPACE_REMAINING] \{\ -. nr #FN_DEPTH (\\n[#FN_LINES]*\\n[#FN_LEAD]) -. \} +. nr #FN_DEFER_SPACE 1 . \} . \} -. nr #VARIABLE_FOOTER_POS -\\n[#DIVER_DEPTH] -. if \\n[#FN_COUNT]=1 \{ .nr #VARIABLE_FOOTER_POS -1v \} . \} -. ch FOOTER \\n[#VARIABLE_FOOTER_POS]u -. if (\\n(nl+1v)>(\\n[#PAGE_LENGTH]+\\n[#VARIABLE_FOOTER_POS]) \{\ -. ch FOOTER \\n(nlu+1v +. if \\n[#FN_MARKER_STYLE]=1 \{\ +. if \\n[#FN_COUNT]>0 \{ .nr #FN_COUNT 0 1 \} +. if \\n[#COLUMNS]=1 \{\ +. if \\n[#COL_NUM]=\\n[#NUM_COLS] \{\ +. nr #FN_COUNT_FOR_COLS 0 1 +. \} +. \} . \} -. if \\n[#FN_DEFER] \{\ -. nr #VARIABLE_FOOTER_POS 0-\\n[#B_MARGIN]u -. ch FOOTER \\n[#VARIABLE_FOOTER_POS]u +. if \\n[#FN_MARKER_STYLE]=2 \{\ +. if \\n[#RESET_FN_NUMBER]=1 \{\ +. ie \\n[#COLUMNS]=1 \{\ +. if \\n[#COL_NUM]=\\n[#NUM_COLS] \{ .nr #FN_NUMBER 0 1 \} +. \} +. el \{\ +. nr #FN_NUMBER 0 1 +. \} +. \} . \} . \} -. nr #NO_FN_MARKER 0 .END \# +\# b) Treat as a normal footnote, including defers. \# -.MAC FN_OVERFLOW_TRAP END -. if \\n[#FN_COUNT] \{\ -. di FN_OVERFLOW -. \} +.MAC DIVER_FN_2_PRE END +. nr #RESET_FN_COUNTERS 2 .END \# +\# 2. Post-footnote processing for footnotes in diversions \# -.MAC DIVERT_FN_LEFTOVER END -. nr #NO_FN_MARKER 1 -. nr #OVERFLOW 1 -. FOOTNOTE -. nf -. FN_OVERFLOW -. FOOTNOTE OFF -. rr #FN_OVERFLOW_DEPTH +\# Even when a footnote inside a diversion is treated as +\# "normal," some manipulation of registers is required. The +\# macro is called in DO_QUOTE (i.e. at the termination of +\# quotes and blockquotes) and in DO_EPIGRAPH. +\# +.MAC DIVER_FN_2_POST END +. if \\n[#DONE_ONCE]=1 \{\ +. if \\n[#FN_MARKER_STYLE]=1 \{\ +. if \\n[#FN_COUNT]=0 \{\ +. nr #DONT_RULE_ME 1 +. \} +. if \\n[#FN_COUNT]>0 \{\ +. nr #FN_COUNT 0 1 +. \} +. if \\n[#COLUMNS]=1 \{\ +. if \\n[#COL_NUM]=\\n[#NUM_COLS] \{ .nr #FN_COUNT_FOR_COLS 0 1 \} +. if !\\n[#COL_NUM]=\\n[#NUM_COLS] \{\ +. \} +. \} +. \} +. if \\n[#FN_MARKER_STYLE]=2 \{\ +. if \\n[#FN_COUNT]=0 \{\ +. nr #DONT_RULE_ME 1 +. \} +. if \\n[#FN_COUNT]>0 \{\ +. nr #FN_COUNT 0 1 +. \} +. if \\n[#RESET_FN_NUMBER]=1 \{\ +. ie \\n[#COLUMNS]=1 \{\ +. if \\n[#COL_NUM]=\\n[#NUM_COLS] \{ .nr #FN_NUMBER 0 1 \} +. \} +. el \{\ +. nr #FN_NUMBER 0 1 +. \} +. \} +. \} +. \} +.END +\# +\# The main macros that handle footnote processing. +\# ----------------------------------------------- +\# +.ig +Sometimes, #VARIABLE_FOOTER_POS sets FOOTER at a location that gives +the impression another line of running text could fit on the page. +VFP_CHECK is always set to the line just above the one where FOOTER +will be sprung, and checks for this condition. If it exists, FOOTER +is set one line lower on the page, thus squeezing in an extra line +of running text. This is a judgment call on my part, but seems to +work well. If there are problems (e.g. footnotes really do look +jammed), the user should probably adjust FOOTNOTE_AUTOLEAD and/or +FOOTNOTE_RULE_ADJ. + +The macro has to be run in its own environment, otherwise the first +word of the last line before the footnotes gets chopped. +.. +\# +.MAC VFP_CHECK END +. ev VFP_CHECK +.\" The trap also has to be removed each time VFP_CHECK is run +. if \\n[#PRINT_STYLE]=2 \{\ +. ch VFP_CHECK +. SIZESPECS +. ie !\\n[#IN_DIVER] \{ .nr #PAGE_POS \\n(nl \} +. el \{ .nr #PAGE_POS \\n(nl+\\n(.d+(\\n[#DOC_LEAD]) \} +. nr #FOOTER_POS \\n[#PAGE_LENGTH]+(\\n[#VARIABLE_FOOTER_POS]) +. nr #SPACE_TO_FOOTER \\n[#FOOTER_POS]-\\n[#PAGE_POS] +. nr #FN_GAP \\n[#SPACE_TO_FOOTER]%\\n[#DOC_LEAD] +. if !\\n[#FN_GAP]<0 \{\ +. if \\n[#FN_GAP]<\\n[#DOC_LEAD] \{\ +. ie (\\n[#PAGE_POS]+(\\n[#FN_DEPTH]+\\n[#FN_GAP]))>(\\n[#VISUAL_B_MARGIN]) \{\ +. nr #VARIABLE_FOOTER_POS 0+\\n[#VARIABLE_FOOTER_POS] +. \} +. el \{\ +. ie \\n[#DOC_LEAD]-\\n[#FN_GAP]<\\n[#DESCENDER] \{\ +. nr #VARIABLE_FOOTER_POS +\\n[#DOC_LEAD] +. ch FOOTER \\n[#VARIABLE_FOOTER_POS]u +. \} +. el \{\ +. nr #VARIABLE_FOOTER_POS 0+\\n[#VARIABLE_FOOTER_POS] +. \} +. \} +. \} +. \} +. \} +. ev +.END +\# +.ig +FN_OVERFLOW_TRAP starts off "underneath" FOOTER, but is revealed +as #VARIABLE_FOOTER_POSITION changes the position of FOOTER. +FN_OVERFLOW_TRAP simply starts diversion FN_OVERFLOW to "catch" +the overflow. The diversion is ended in FOOTER, immediately after +FOOTER outputs the diversion, FOOTNOTES, before PROCESS_FN_LEFTOVER +is run (either in HEADER, or in FOOTER if moving col to col). +.. +\# +.MAC FN_OVERFLOW_TRAP END +. if \\n[#FN_COUNT] \{\ +. di FN_OVERFLOW +. ie !\\n[#NO_BACK_UP]=1 \{\ +. if \\n[#PREV_FN_DEFERRED] \{\ +. ie \\n[#COLUMNS]=1 \{\ +. if \\n[#FROM_FOOTER] \{\ +. if \\n[#PREV_FN_DEFERRED] \{\ +. if !\\n[#COL_NUM]=\\n[#NUM_COLS] \{\ +. rr #PREV_FN_DEFERRED +. \} +. \} +. \} +. if !\\n[#FROM_FOOTER] \{\ +. if !\\n[#COL_NUM]=\\n[#NUM_COLS] \{\ +. if !\\n[#LAST_FN_COUNT_FOR_COLS]>1 \{\ +\!. RLD \\n[#FN_LEAD]u +. \} +. \} +. \} +. \} +. el \{\ +\!. RLD \\n[#FN_LEAD]u +. \} +. \} +. \} +. el \{\ +. rr #NO_BACK_UP +. rr #PREV_FN_DEFERRED +. \} +. \} +.\" When #FROM_DIVERT_FN is 1, it signals to FOOTNOTE, when run from +.\" within DIVERT_FN_LEFTOVER, to set #SPACE_REMAINING to the total +.\" area allowable for running text. +. nr #FROM_DIVERT_FN 1 .END \# +.ig +PROCESS_FN_LEFTOVER is called at the top of HEADER, and in +FOOTER if we're moving from one column to the next (i.e. after +outputting FOOTNOTES). It checks for whether we have a "deferred +footnote" situation, and resets counters and number registers +accordingly. Lastly, if we have some footnote overflow, it calls +DIVERT_FN_OVERFLOW. +.. \# .MAC PROCESS_FN_LEFTOVER END +. if \\n[#PREV_FN_DEFERRED]=2 \{\ +. if \\n[#FN_COUNT_AT_FOOTER]>1 \{ .rr #PREV_FN_DEFERRED \} +. \} . if !\\n[#FN_DEFER] \{\ . nr #FN_COUNT 0 1 . nr #FN_DEPTH 0 . nr #VARIABLE_FOOTER_POS 0-\\n[#B_MARGIN] . \} -. if \\n[#FN_DEFER] \{\ -. nr #VARIABLE_FOOTER_POS -(\\n[#FN_DEPTH]+\\n[#DOC_LEAD]) +. if r#FN_DEFER \{\ +. if \\n[#FN_DEFER]=1 \{\ +. nr #VARIABLE_FOOTER_POS -\\n[#FN_DEPTH] +. \} +. if \\n[#FN_DEFER]=2 \{\ +. nr #FN_DEPTH 0 +. nr #VARIABLE_FOOTER_POS 0-\\n[#B_MARGIN] +. \} . \} . nr #SPACE_REMAINING 0 . ch FOOTER -\\n[#B_MARGIN]u . if \\n[#FN_DEFER] \{\ . nr #NO_FN_MARKER 1 -. da FOOTNOTES -. di . FOOTNOTE . nf . FOOTNOTE OFF +. ie \\n[#COLUMNS]=1 \{\ +. if \\n[#COL_NUM]=\\n[#NUM_COLS] \{\ +. if !\\n[#FROM_FOOTER] \{\ +. if \\n[#FN_COUNT_FOR_COLS]=1 \{ .nr #PREV_FN_DEFERRED 1 \} +. \} +. \} +. \} +. el \{ .nr #PREV_FN_DEFERRED 1 \} . \} . if !\\n[#FN_DEFER] \{\ . if \\n[#FN_OVERFLOW_DEPTH] \{\ -. DIVERT_FN_LEFTOVER +. DIVERT_FN_LEFTOVER . \} . \} -. nr #FN_COUNT 0 1 +. ie \\n[#COLUMNS]=1 \{\ +. if \\n[#COL_NUM]>1 \{\ +. if \\n[#COL_NUM]=\\n[#NUM_COLS] \{ .nr #FN_COUNT 0 1 \} +. \} +. \} +. el \{ .nr #FN_COUNT 0 1 \} +. if \\n[#DIVER_FN]=2 \{ .rr #DIVER_FN \} +. rr #FROM_DIVERT_FN .END \# +.ig +DIVERT_FN_LEFTOVER is called in PROCESS_FN_LEFTOVER (at +the top of HEADER, and in FOOTER if we're moving from one column +to the next). +.. \# -\# ==================================================================== -\# -\# +++ENDNOTES+++ -\# -\# When endnotes are output, the spacing between the notes is always 1 -\# extra linespace. This can have bottom margin consequences. If this -\# doesn't bother you, don't worry about it. If it does bother you, and -\# you want to adjust the spacing between any two endnotes (as they're -\# output), make the spacing adjustments (.ALD/.RLD) at the *end* of -\# endnotes (i.e. just before .ENDNOTE OFF), not at the top. -\# -\# Endnotes must be output manually with .ENDNOTES. This allows user -\# the flexibility to output endnotes at the end of each collated -\# document, or to output them at the end of the entire document. +.MAC DIVERT_FN_LEFTOVER END +. nr #NO_FN_MARKER 1 +. nr #DIVERTED 1 +. FOOTNOTE +. nf +. FN_OVERFLOW +. FOOTNOTE OFF +. if \\n[#PREV_FN_DEFERRED] \{\ +. nr #FN_DEPTH -\\n[#FN_LEAD] +. nr #VARIABLE_FOOTER_POS +\\n[#FN_LEAD] +. ch FOOTER \\n[#VARIABLE_FOOTER_POS]u +. if \\n[#PREV_FN_DEFERRED]=2 \{\ +. nr #PREV_FN_DEFERRED 1 +. rr #DIVERTED +. \} +. \} +. rr #FN_OVERFLOW_DEPTH +.END \# -\# ENDNOTE FAMILY -\# -------------- -\# *Argument: -\# -\# *Function: -\# Creates or modifies string $EN_FAM. -\# *Notes: -\# Default is same as running text in body of document. +.ig +This is a special macro to deal with footnotes that are set inside +diversions (QUOTE, BLOCKQUOTE and EPIGRAPH). It's called in HEADER +(and in FOOTER, if we're moving from column to column), and comes +after PROCESS_FOOTNOTE_LEFTOVER in those two macros. +.. \# -.MAC ENDNOTE_FAMILY END -. ds $EN_FAM \\$1 +.MAC PROCESS_FN_IN_DIVER END +. nr #SPACE_REMAINING 0 +. ch FOOTER -\\n[#B_MARGIN]u +. nr #NO_FN_MARKER 1 +. if !\\n[#RESET_FN_COUNTERS]=2 \{\ +. rr #RESET_FN_COUNTERS +. \} +. FOOTNOTE +. if \\n[#FN_OVERFLOW_DEPTH] \{ .nf \} +. ie dRUNON_FN_IN_DIVER \{\ +. RUNON_FN_IN_DIVER +. rm RUNON_FN_IN_DIVER +. \} +. el \{\ +. nf +. FN_IN_DIVER +. \} +. FOOTNOTE OFF +. rr #DIVER_FN .END \# +\# ==================================================================== \# -\# ENDNOTE FONT -\# ------------ -\# *Argument: -\# -\# *Function: -\# Creates or modifies string $EN_FT. -\# *Notes: -\# Default is roman. +\# +++ENDNOTES+++ \# -.MAC ENDNOTE_FONT END -. ds $EN_FT \\$1 -.END +.ig +When endnotes are output, the spacing between the notes is always +1 extra linespace. This can have bottom margin consequences. If +this doesn't bother you, don't worry about it. If it does bother +you, and you want to adjust the spacing between any two endnotes (as +they're output), make the spacing adjustments (.ALD/.RLD) at the +*end* of endnotes (i.e. just before .ENDNOTE OFF), not at the top. + +Endnotes must be output manually with .ENDNOTES. This allows user +the flexibility to output endnotes at the end of each collated +document, or to output them at the end of the entire document. +.. \# +\# Control macros \# \# ENDNOTE POINT SIZE \# ------------------ @@ -9929,6 +11596,7 @@ . nr #EN_LEAD (p;\\$1) . if '\\$2'ADJUST' \{\ . nr #ORIG_DOC_LEAD \\n[#DOC_LEAD] +. nr #RESTORE_ADJ_DOC_LEAD \\n[#ADJ_DOC_LEAD] . nr #ADJ_DOC_LEAD 1 . nr #ADJ_EN_LEAD 1 . nr #NO_TRAP_RESET 1 @@ -9936,26 +11604,12 @@ . nr #EN_LEAD \\n[#DOC_LEAD] . DOC_LEAD \\n[#ORIG_DOC_LEAD]u . rr #NO_TRAP_RESET -. rr #ADJ_DOC_LEAD +. nr #ADJ_DOC_LEAD \\n[#RESTORE_ADJ_DOC_LEAD] . rr #ORIG_DOC_LEAD . \} .END \# \# -\# ENDNOTE QUAD -\# ------------ -\# *Argument: -\# LEFT | L | CENTER | C | RIGHT | R | JUSTIFY | J -\# *Function: -\# Creates or modifies string $EN_QUAD. -\# *Notes: -\# Default is justified for TYPESET, left for TYPEWRITE. -\# -.MAC ENDNOTE_QUAD END -. ds $EN_QUAD \\$1 -.END -\# -\# \# ENDNOTES_HDRFTR_CENTER \# ---------------------- \# *Argument: @@ -9988,63 +11642,6 @@ .END \# \# -\# ENDNOTE STRING FAMILY -\# --------------------- -\# *Argument: -\# -\# *Function: -\# Creates or modifies string $EN_STRING_FAM. -\# *Notes: -\# Default is same as running text in body of document. -\# -.MAC ENDNOTE_STRING_FAMILY END -. ds $EN_STRING_FAM \\$1 -.END -\# -\# -\# ENDNOTE STRING FONT -\# ------------------- -\# *Argument: -\# -\# *Function: -\# Creates or modifies string $EN_FT. -\# *Notes: -\# Default is BOLD for TYPEWRITE; roman for TYPESET -\# -.MAC ENDNOTE_STRING_FONT END -. ds $EN_STRING_FT \\$1 -.END -\# -\# -\# ENDNOTE STRING SIZE -\# ------------------- -\# *Argument: -\# <+|- number of points by which to in/decrease endnote string -\# (relative to base endnote size)> -\# *Function: -\# Creates or modifies string $EN_STRING_SIZE_CHANGE. -\# *Notes: -\# Default is +1 for TYPESET. -\# -.MAC ENDNOTE_STRING_SIZE END \"Default for TYPESET is +1 -. ds $EN_STRING_SIZE_CHANGE \\$1 -.END -\# -\# -\# ENDNOTE STRING QUAD -\# ------------------- -\# *Argument: -\# LEFT | L | CENTER | C | RIGHT | R -\# *Function: -\# Creates or modifies string $EN_STRING_QUAD. -\# *Notes: -\# Default is centered. -\# -.MAC ENDNOTE_STRING_QUAD END -. ds $EN_STRING_QUAD \\$1 -.END -\# -\# \# ENDNOTE STRING UNDERSCORE \# ------------------------- \# *Arguments: @@ -10099,133 +11696,128 @@ .END \# \# -\# ENDNOTE TITLE FAMILY -\# -------------------- -\# *Argument: -\# -\# *Function: -\# Creates string $EN_TITLE_FAM. -\# *Notes: -\# Default is same as running text of document. -\# -.MAC ENDNOTE_TITLE_FAMILY END -. ds $EN_TITLE_FAM \\$1 -.END -\# -\# -\# ENDNOTE TITLE FONT -\# ------------------ -\# *Argument: -\# -\# *Function: -\# Creates string $EN_TITLE_FT. -\# *Notes: -\# Default is bold for TYPESET; roman for TYPEWRITE. -\# -.MAC ENDNOTE_TITLE_FONT END -. ds $EN_TITLE_FT \\$1 +.MAC ENDNOTE_TITLE_SPACE END +. nr #EN_TITLE_SPACE (\\$1) .END \# \# -\# ENDNOTE TITLE SIZE -\# ------------------ +\# ENDNOTE TITLE UNDERSCORE +\# ------------------------ \# *Argument: -\# <+|- number of points by which to in/decrease endnote title -\# (relative to base endnote size)> +\# toggle \# *Function: -\# Creates string $EN_TITLE_SIZE_CHANGE. +\# Creates or removes register #EN_TITLE_UNDERSCORE. \# *Notes: -\# Default is 0 (i.e. title same size as text of endnotes). +\# Default is to underscore the endnote titles. \# -.MAC ENDNOTE_TITLE_SIZE END -. ds $EN_TITLE_SIZE_CHANGE \\$1 +.MAC ENDNOTE_TITLE_UNDERSCORE END +. ie '\\$1'' \{ .nr #EN_TITLE_UNDERSCORE 1 \} +. el \{ .rr #EN_TITLE_UNDERSCORE \} .END \# \# -\# ENDNOTE TITLE QUAD -\# ------------------ -\# *Argument: -\# +\# ENDNOTE MARKER STYLE +\# -------------------- +\# *Arguments: +\# NUMBER | LINE \# *Function: -\# Creates string $EN_TITLE_QUAD. +\# Sets register #EN_MARKER_STYLE, used in ENDNOTE to determine +\# the style of endnote markers (labels). \# *Notes: -\# Default is left. +\# 1=NUMBER; 2=LINE. LINE means "use output line numbers". +\# Default is NUMBER. \# -.MAC ENDNOTE_TITLE_QUAD END -. ds $EN_TITLE_QUAD \\$1 +.MAC ENDNOTE_MARKER_STYLE END +. if '\\$1'NUMBER' \{\ +. nr #EN_MARKER_STYLE 1 +. \} +. if '\\$1'LINE' \{\ +. nr #EN_MARKER_STYLE 2 +. if !\\n[#EN_LN_SEP] \{\ +. if !\\n[#EN_LN_BRACKETS] \{ .ENDNOTE_LINENUMBER_BRACKETS SQUARE \} +. \} +. \} .END \# \# -\# ENDNOTE TITLE UNDERSCORE -\# ------------------------ -\# *Argument: -\# toggle +\# ENDNOTE LINENUMBER MARK +\# ----------------------- \# *Function: -\# Creates or removes register #EN_TITLE_UNDERSCORE. -\# *Notes: -\# Default is to underscore the endnote titles. +\# This string, when called inline, stores the current output line +\# number in register #EN_MARK for use with ENDNOTE. \# -.MAC ENDNOTE_TITLE_UNDERSCORE END -. ie '\\$1'' \{ .nr #EN_TITLE_UNDERSCORE 1 \} -. el \{ .rr #EN_TITLE_UNDERSCORE \} -.END +.ds EN-MARK \R'#EN_MARK \En(ln' \# \# -\# ENDNOTE NUMBER FAMILY -\# --------------------- +\# ENDNOTE LINENUMBER SEPARATOR +\# ---------------------------- \# *Argument: -\# +\# \# *Function: -\# Creates string $EN_NUMBER_FAM. -\# *Notes: -\# Default is same as running text of document. +\# Stores user-defined separator (for use then +\# ENDNOTE_MARKER_STYLE is LINE) in string $EN_LN_SEP. The +\# separator is intended to be used when the user wishes a +\# separator, rather than the choice of brackets offered by +\# ENDNOTE_LINENUMBER_BRACKETS. \# -\# Family, font, and size of endnote numbers applies only to the -\# numbers as they appear on the endnotes page(s). The superscript -\# numbers that appear in running text are unaffected. -\# -.MAC ENDNOTE_NUMBER_FAMILY END -. ds $EN_NUMBER_FAM \\$1 +.MAC ENDNOTE_LINENUMBER_SEPARATOR END +. rr #EN_LN_BRACKETS +. nr #EN_LN_SEP 1 +. ds $EN_LN_SEP "\\$1 .END \# \# -\# ENDNOTE NUMBER FONT -\# ------------------- +\# ENDNOTE LINENUMBER BRACKETS +\# --------------------------- \# *Argument: -\# +\# PARENS | SQUARE | BRACES or ( | [ | { \# *Function: -\# Creates string $EN_NUMBER_FT. -\# *Notes: -\# Default is bold for TYPESET; roman for TYPEWRITE. +\# Sets register #EN_LN_BRACKETS to 1, and creates strings +\# $EN_OPEN_BRACKET and $EN_CLOSE_BRACKET according to the given argument. \# -\# Family, font, and size of endnote numbers applies only to the -\# numbers as they appear on the endnotes page(s). The superscript -\# numbers that appear in running text are unaffected. -\# -.MAC ENDNOTE_NUMBER_FONT END \"Default for TYPESET is bold -. ds $EN_NUMBER_FT \\$1 +.MAC ENDNOTE_LINENUMBER_BRACKETS END +. rr #EN_LN_SEP +. nr #EN_LN_BRACKETS 1 +. if '\\$1'PARENS' \{\ +. ds $EN_OPEN_BRACKET ( +. ds $EN_CLOSE_BRACKET ) +. \} +. if '\\$1'(' \{\ +. ds $EN_OPEN_BRACKET ( +. ds $EN_CLOSE_BRACKET ) +. \} +. if '\\$1'SQUARE' \{\ +. ds $EN_OPEN_BRACKET [ +. ds $EN_CLOSE_BRACKET ] +. \} +. if '\\$1'[' \{\ +. ds $EN_OPEN_BRACKET [ +. ds $EN_CLOSE_BRACKET ] +. \} +. if '\\$1'BRACES' \{\ +. ds $EN_OPEN_BRACKET { +. ds $EN_CLOSE_BRACKET } +. \} +. if '\\$1'{' \{\ +. ds $EN_OPEN_BRACKET { +. ds $EN_CLOSE_BRACKET } +. \} .END \# \# -\# ENDNOTE NUMBER SIZE -\# ------------------- +\# ENDNOTE LINENUMBER GAP +\# ---------------------- \# *Argument: -\# <+|- number of points by which to in/decrease endnote numbers -\# (relative to base endnote size)> +\# \# *Function: -\# Creates string $EN_NUMBER_SIZE_CHANGE. -\# *Notes: -\# Default is 0. +\# Defines string $EN_LN_GAP, used during printing of line-number +\# labels in ENDNOTE. \# -\# Family, font, and size of endnote numbers applies only to the -\# numbers as they appear on the endnotes page(s). The superscript -\# numbers that appear in running text are unaffected. -\# -.MAC ENDNOTE_NUMBER_SIZE END -. ds $EN_NUMBER_SIZE_CHANGE \\$1 +.MAC ENDNOTE_LINENUMBER_GAP END +. ds $EN_LN_GAP \\$1 .END \# -\# +\# \# ENDNOTE NUMBERS ALIGN RIGHT \# --------------------------- \# *Argument: @@ -10436,25 +12028,42 @@ \# Places superscript endnote number in text, then collects and \# processes endnote in diversion END_NOTES. \# *Notes: -\# \c must be appended to the word immediately preceding .ENDNOTE. +\# \c must be appended to the word immediately preceding .ENDNOTE +\# when ENDNOTE_MARKER_STYLE is NUMBER. \# .MAC ENDNOTE END +. if !\\n(.u \{ .nr #ADD_BREAK 1 \} . ie '\\$1'' \{\ . nr #ENDNOTE 1 -. if \\n[#CONDENSE] \{ \*[CONDX]\c \} -. if \\n[#EXTEND] \{ \*[EXTX]\c \} -. if \\n[#PRINT_STYLE]=1 \{\ -. if \\n[#UNDERLINE_ON] \{\ -. nr #UNDERLINE_WAS_ON 1 -. UNDERLINE OFF -. \} -. if \\n[#SLANT_ON] \{\ -. nr #SLANT_WAS_ON 1 +. if \\n[#EN_MARKER_STYLE]=1 \{\ +. if \\n[#CONDENSE] \{ \*[CONDX]\c \} +. if \\n[#EXTEND] \{ \*[EXTX]\c \} +. if \\n[#PRINT_STYLE]=1 \{\ +. if \\n[#UNDERLINE_ON] \{\ +. nr #UNDERLINE_WAS_ON 1 +. UNDERLINE OFF +. \} +. if \\n[#SLANT_ON] \{\ +. nr #SLANT_WAS_ON 1 \*[SLANTX]\c +. \} +. PRINT "\s-2\v'-\\n[#DOC_LEAD]u/5u'\\n+[#EN_NUMBER]\v'+\\n[#DOC_LEAD]u/5u'\s+2\c" +. \} +. if \\n[#PRINT_STYLE]=2 \{ .PRINT "\*[SUP]\\n+[#EN_NUMBER]\*[SUPX]\c" \} +. \} +. if \\n[#EN_MARKER_STYLE]=2 \{\ +. if !\\n[#LINENUMBERS] \{\ +. tm1 "[mom]: Line numbering must be enabled with NUMBER_LINES when +. tm1 " ENDNOTE_MARKER_STYLE is LINE. +. ab Aborting on ENDNOTE at line \\n(.c. +. \} +. if \\n[#EN_MARK]=0 \{ .nr #EN_MARK \\n(ln \} +. nr #EN_MARK_2 \\n(ln +. if '\\n(.z'P_QUOTE' \{\ +. nr #EN_MARK -1 +. nr #EN_MARK_2 -1 . \} -. PRINT "\s-2\v'-\\n[#DOC_LEAD]u/5u'\\n+[#EN_NUMBER]\v'+\\n[#DOC_LEAD]u/5u'\s+2" . \} -. if \\n[#PRINT_STYLE]=2 \{ .PRINT "\*[SUP]\\n+[#EN_NUMBER]\*[SUPX]" \} . nr #PP_STYLE_PREV \\n[#PP_STYLE] . nr #PP_STYLE 1 . if \\n[#INDENT_FIRST_PARAS] \{ .nr #INDENT_FIRSTS 1 \} @@ -10472,9 +12081,7 @@ . if \\n[#EN_NUMBER]=1 \{\ \!. ne 3 . if \\n[#PRINT_STYLE]=1 \{\ -. fam C -. ft R -. ps 12 +. TYPEWRITER . \} . if \\n[#PRINT_STYLE]=2 \{\ . FAMILY \\*[$EN_TITLE_FAM] @@ -10498,74 +12105,121 @@ . \} . \} . \} -. ie \\n[#EN_NUMBERS_ALIGN_RIGHT] \{\ -. ie \\n[#EN_NUMBER]=1 \{\ -. if !'\\*[$EN_TITLE]'' \{ .sp \} -. \} -. el \{ .sp \} -\!. TRAP OFF -. if \\n[#PRINT_STYLE]=1 \{\ -. fam C -. ft R -. ps 12 -. \} -. if \\n[#PRINT_STYLE]=2 \{\ +. ie \\n[#EN_NUMBER]=1 \{\ +. if !'\\*[$EN_TITLE]'' \{ .sp \} +. \} +. el \{ .sp \} +. if \\n[#PRINT_STYLE]=1 \{\ +. TYPEWRITER +. \} +. if \\n[#PRINT_STYLE]=2 \{\ +. if \\n[#EN_MARKER_STYLE]=1 \{\ . FAMILY \\*[$EN_NUMBER_FAM] . FT \\*[$EN_NUMBER_FT] . PT_SIZE \\n[#EN_PS]u\\*[$EN_NUMBER_SIZE_CHANGE] . \} -. nr #RESET_L_LENGTH \\n(.l -. nr #EN_NUMBER_L_LENGTH \w'\0'*\\n[#EN_NUMBER_PLACEHOLDERS]+\w'.' -. ll \\n[#EN_NUMBER_L_LENGTH]u -. RIGHT -\En[#EN_NUMBER]. -. if \\n[#PRINT_STYLE]=1 \{\ -. fam C -. ft R -. ps 12 +. if \\n[#EN_MARKER_STYLE]=2 \{\ +. FAMILY \\*[$EN_LN_FAM] +. FT \\*[$EN_LN_FT] +. PT_SIZE \\n[#EN_PS]u\\*[$EN_LN_SIZE_CHANGE] . \} -. if \\n[#PRINT_STYLE]=2 \{\ -. FAMILY \\*[$EN_FAM] -. FT \\*[$EN_FT] -. PT_SIZE \\n[#EN_PS]u +. \} +. if \\n[#EN_MARKER_STYLE]=2 \{\ +. ENDNOTE_NUMBERS_ALIGN_LEFT +. ie \\n[#EN_LN_BRACKETS]=1 \{\ +. ds $EN_LINENUMBER \v'-.085m'\\*[$EN_OPEN_BRACKET]\v'.085m' +. ie \\n[#EN_MARK_2]=\\n[#EN_MARK] \{\ +. as $EN_LINENUMBER \\n[#EN_MARK]\v'-.085m'\\*[$EN_CLOSE_BRACKET]\v'.085m' \" +. \} +. el \{\ +. as $EN_LINENUMBER \\n[#EN_MARK]\v'-.1m'-\v'.1m'\\n[#EN_MARK_2]\v'-.085m'\\*[$EN_CLOSE_BRACKET]\v'.085m' \" +. \} . \} -. EL -. ll \\n[#RESET_L_LENGTH]u -. in \\n[#EN_NUMBER_L_LENGTH]u+\w'.\0'u -. nr #EN_TEXT_INDENT \\n(.i -. QUAD \\*[$EN_QUAD] -\!. TRAP +. el \{\ +. ie \\n[#EN_MARK_2]=\\n[#EN_MARK] \{\ +. ds $EN_LINENUMBER \\n[#EN_MARK]\\*[$EN_LN_SEP] +. \} +. el \{\ +. ds $EN_LINENUMBER \\n[#EN_MARK]\v'-.1m'-\v'.1m'\\n[#EN_MARK_2]\\*[$EN_LN_SEP] +. \} +. \} +. nr #EN_MARK 0 +. \} +\!. TRAP OFF +. nr #RESET_L_LENGTH \\n(.l +. ie \\n[#EN_NUMBERS_ALIGN_RIGHT] \{\ +. nr #EN_NUMBER_L_LENGTH \w'\0'*\\n[#EN_NUMBER_PLACEHOLDERS]+\w'.' +. RIGHT . \} . el \{\ -. ie \\n[#EN_NUMBER]=1 \{\ -. if !'\\*[$EN_TITLE]'' \{ .sp \} -. \} -. el \{ .sp \} -. if \\n[#PRINT_STYLE]=1 \{\ -. fam C -. ft R -. ps 12 +. nr #EN_NUMBER_L_LENGTH \w'\En[#EN_NUMBER].\0' +. LEFT +. \} +. if \\n[#EN_MARKER_STYLE]=2 \{\ +. if !\\n[#EN_NUMBERS_ALIGN_RIGHT] \{\ +. nr #EN_NUMBER_L_LENGTH \w'\\*[$EN_LINENUMBER]'+\\*[$EN_LN_GAP] +. LEFT . \} -. if \\n[#PRINT_STYLE]=2 \{\ -. FAMILY \\*[$EN_NUMBER_FAM] -. FT \\*[$EN_NUMBER_FT] -. PT_SIZE \\n[#EN_PS]u\\*[$EN_NUMBER_SIZE_CHANGE] +. \} +. ll \\n[#EN_NUMBER_L_LENGTH]u +. if \\n[#EN_MARKER_STYLE]=1 \{\ +\En[#EN_NUMBER]. +. \} +. if \\n[#EN_MARKER_STYLE]=2 \{\ +\\*[$EN_LINENUMBER] +. rm $EN_LINENUMBER +. \} +. EOL +. ll \\n[#RESET_L_LENGTH]u +. nr #EN_FIGURE_SPACE \w'\0.' +. ie \\n[#EN_NUMBERS_ALIGN_RIGHT] \{\ +. in \\n[#EN_NUMBER_L_LENGTH]u+\\n[#EN_FIGURE_SPACE]u +. \} +. el \{\ +. ti \\n[#EN_NUMBER_L_LENGTH]u +. \} +. nr #EN_TEXT_INDENT \\n(.i +. QUAD \\*[$EN_QUAD] +\!. TRAP +. if \\n[#PRINT_STYLE]=1 \{\ +. TYPEWRITER +. \} +. if \\n[#PRINT_STYLE]=2 \{\ +. FAMILY \\*[$EN_FAM] +. FT \\*[$EN_FT] +. PT_SIZE \\n[#EN_PS]u +. \} +. if \\n[#REF]=1 \{\ +. ie !\\n[#EN_MARKER_STYLE]=2 \{\ +. if \\n[#EN_NUMBERS_ALIGN_LEFT] \{\ +. in \\*[$REF_EN_INDENT] +. ti -(\\*[$REF_EN_INDENT]-\\n[#EN_NUMBER_L_LENGTH]u) +. \} +. if \\n[#EN_NUMBERS_ALIGN_RIGHT] \{\ +. in \\*[$REF_EN_INDENT] +. ti -(\\*[$REF_EN_INDENT]-\\n[#EN_NUMBER_L_LENGTH]u-\\n[#EN_FIGURE_SPACE]u) +. \} . \} -. QUAD \\*[$EN_QUAD] -\En[#EN_NUMBER].\0\c -. if \\n[#PRINT_STYLE]=2 \{\ -. FAMILY \\*[$EN_FAM] -. FT \\*[$EN_FT] -. PT_SIZE \\n[#EN_PS]u +. el \{\ +. if \\n[#EN_NUMBERS_ALIGN_LEFT] \{\ +. in \\*[$REF_EN_INDENT] +. ti -(\\*[$REF_EN_INDENT]-\\n[#EN_NUMBER_L_LENGTH]u) +. \} . \} . \} . \} . el \{\ . br -. if \\n[#EN_NUMBERS_ALIGN_RIGHT] \{\ . in 0 +. if \\n[#EN_MARKER_STYLE]=2 \{\ +\!. in 0 . \} . di +.\" Restore sentence spacing +. if \\n[#PRINT_STYLE]=2 \{\ +. if d$RESTORE_SS_VAR \{ .SS \\*[$RESTORE_SS_VAR] \} +. rm $RESTORE_SS_VAR +. \} . ev . nr #PP_STYLE \\n[#PP_STYLE_PREV] . if !\\n[#INDENT_FIRSTS] \{ .INDENT_FIRST_PARAS OFF \} @@ -10582,6 +12236,10 @@ \*[SLANT]\c . \} . \} +. if \\n[#ADD_BREAK] \{\ +. br +. rr #ADD_BREAK +. \} .END \# \# @@ -10596,10 +12254,13 @@ \# .MAC ENDNOTES END . nr #ENDNOTES 1 -. nr #PAGINATION_STATE \\n[#PAGINATE] . nr #EN_FIRST_PAGE 1 . nr #HEADER_STATE \\n[#HEADERS_ON] . ds $RESTORE_PAGENUM_STYLE \\*[$PAGENUM_STYLE] +. if \\n[#LINENUMBERS]=1 \{\ +. NUMBER_LINES OFF +. nr #LINENUMBERS 2 +. \} . if \\n[#HEADERS_ON]=1 \{\ . if !\\n[#EN_ALLOWS_HEADERS_ALL] \{ .HEADERS OFF \} . \} @@ -10621,32 +12282,9 @@ . el \{ .nr #PAGINATE 0 \} . \} . if \\n[#FOOTERS_ON]=1 \{\ -. if !'\\*[$HDRFTR_CENTER_OLD]'' \{ .ds $HDRFTR_CENTER \\*[$HDRFTR_CENTER_OLD] \} +. if !'\\*[$HDRFTR_CENTER_OLD]'' .ds $HDRFTR_CENTER \\*[$HDRFTR_CENTER_OLD] . \} . NEWPAGE -. if \\n[#FINIS] \{\ -. if \\n[#FOOTERS_WERE_ON] \{\ -. FOOTERS -. rr #FOOTERS_WERE_ON -. \} -. if \\n[#PAGINATION_WAS_ON] \{\ \"This register only set in FINIS -. if \\n[#PAGINATION_STATE]=1 \{\ -. PAGINATE -. rr #PAGINATION_WAS_ON -. \} -. \} -. rr #FINIS -. \} -. if \\n[#FOOTERS_WERE_ON] \{\ -. FOOTERS -. rr #FOOTERS_WERE_ON -. \} -. if \\n[#PAGINATION_WAS_ON] \{\ -. if \\n[#PAGINATION_STATE]=1 \{\ -. PAGINATE -. rr #PAGINATION_WAS_ON -. \} -. \} . if \\n[#FOOTERS_ON]=1 \{\ . ds $HDRFTR_CENTER \\*[$HDRFTR_CENTER_NEW] . rm $HDRFTR_CENTER_OLD @@ -10670,16 +12308,14 @@ . if \\n[#HEADER_STATE]=1 \{\ . if \\n[#EN_ALLOWS_HEADERS] \{ .HEADERS \} . \} -\# Collect endnote title string for TOC +.\" Collect endnotes title string for TOC . nr #TOC_ENTRY_PN \\n%+\\n[#PAGE_NUM_ADJ] . af #TOC_ENTRY_PN \\g[#PAGENUMBER] . ds $TOC_TITLE_ITEM \\*[$EN_STRING]\\| . ev TOC_EV . da TOC_ENTRIES . if \\n[#PRINT_STYLE]=1 \{\ -. fam C -. ft R -. ps 12 +. TYPEWRITER . \} . if \\n[#PRINT_STYLE]=2 \{\ \!. FAMILY \\*[$TOC_TITLE_FAM] @@ -10693,7 +12329,7 @@ . el \{\ \!. PAD "\\h'\\n[#TOC_TITLE_INDENT]u'\\*[$TOC_TITLE_ITEM]\\*[$TOC_PN]" . \} -\!. EL +\!. EOL \!. ST 100 L \!. ST 101 R . if \\n[#PRINT_STYLE]=2 \{\ @@ -10709,8 +12345,8 @@ \!. TQ . di . ev -\# End collection of endnote title string for TOC -\# Process endnote +.\" End collection of endnotes title string for TOC +.\" Process endnotes . if \\n[#PRINT_STYLE]=1 \{ .vs \\n[#EN_LEAD]u \} . if \\n[#PRINT_STYLE]=2 \{\ . if \\n[#EN_NO_COLS] \{\ @@ -10724,7 +12360,8 @@ . el \{ .DOC_LEAD \\n[#EN_LEAD]u \} . \} . PRINT \& -. sp |\\n[#T_MARGIN]u +. ie r#EN_TITLE_SPACE \{ .sp |\\n[#EN_TITLE_SPACE]u \} +. el \{ .sp |\\n[#T_MARGIN]u \} . mk ec . if \\n[#SLANT_ON] \{\ \*[SLANTX]\c @@ -10732,9 +12369,7 @@ . ev ENDNOTES . if !'\\*[$EN_STRING]'' \{\ . if \\n[#PRINT_STYLE]=1 \{\ -. fam C -. ft R -. ps 12 +. TYPEWRITER . vs \\n[#EN_LEAD]u . \} . if \\n[#PRINT_STYLE]=2 \{\ @@ -10757,7 +12392,7 @@ . if '\\*[$EN_STRING_QUAD]'CENTRE' \{ .CENTER \} . if '\\*[$EN_STRING_QUAD]'R' \{ .RIGHT \} . if '\\*[$EN_STRING_QUAD]'RIGHT' \{ .RIGHT \} -. EL +. EOL . if \\n[#EN_STRING_CAPS] \{ .CAPS \} . ie \\n[#EN_STRING_UNDERSCORE] \{\ . ie \\n[#EN_STRING_UNDERSCORE]=2 \{\ @@ -10772,11 +12407,24 @@ . \} . \} . CAPS OFF -. ALD \\n[#EN_LEAD]u -. QUAD \\*[$EN_QUAD] -. nf -. END_NOTES -. br +. if \\n[#PRINT_STYLE]=1 \{\ +. ie \\n[#SINGLE_SPACE]=1 \{\ +. ALD \\n[#EN_LEAD]u*2u +. \} +. el \{\ +. ie \\n[#EN_SINGLESPACE]=1 \{\ +. ALD \\n[#EN_LEAD]u*2 +. \} +. el \{\ +. +. \} +. \} +. \} +. if \\n[#PRINT_STYLE]=2 \{ .ALD \\n[#EN_LEAD]u \} +. QUAD \\*[$EN_QUAD] +. nf +. END_NOTES +. br . ev . rm END_NOTES . if \\n[#PRINT_STYLE]=1 \{ .vs \\n[#DOC_LEAD]u \} @@ -10789,11 +12437,417 @@ . \} . if \\n[#COLUMNS_WERE_ON] \{ .nr #COLUMNS 1 \} . if \\n[#HEADER_STATE]=1 \{ .HEADERS \} +. if \\n[#LINENUMBERS]=2 \{\ +. NUMBER_LINES RESUME +. nr #LINENUMBERS 1 +. \} . rr #ENDNOTES .END \# \# ==================================================================== \# +\# +++BIBLIOGRAPHY+++ +\# +.ig +Mom treats bibliographies and endnotes very similarly. The chief +difference is that endnotes are collected and formatted inside a +diversion, while bibliographies are built "by hand." ENDNOTES sets +up the endnotes page and outputs the formatted diversion. +BIBLIOGRAPHY sets up the bibliography page, then awaits refer +commands. + +All of the bibliography control macros have their exact +counterparts in the endnotes control macros. It was tempting to do +fancy stuff with aliases to avoid the repetition, but for reasons +of my own sanity, and for the benefit of anyone wanting to play +around with the bibliography control macros, I decided to keep them +separate. + +Because the bibliography control macros all have endnotes +equivalents, refer to the appropriate, similar endnote macro for +Arguments, Function and Notes. +.. +\# Bibliography control macros +\# +.MAC BIBLIOGRAPHY_PT_SIZE END +. nr #BIB_PS (p;\\$1) +.END +\# +.MAC BIBLIOGRAPHY_LEAD END +. if !\\n[#OK_PROCESS_LEAD] \{\ +. ds $BIB_LEAD \\$1 +. if !'\\$2'' \{\ +. ds $ADJUST_BIB_LEAD \\$2 +. \} +. return +. \} +. rr #ADJ_BIB_LEAD +. nr #BIB_LEAD (p;\\$1) +. if '\\$2'ADJUST' \{\ +. nr #ORIG_DOC_LEAD \\n[#DOC_LEAD] +. nr #RESTORE_ADJ_DOC_LEAD \\n[#ADJ_DOC_LEAD] +. nr #ADJ_DOC_LEAD 1 +. nr #ADJ_BIB_LEAD 1 +. nr #NO_TRAP_RESET 1 +. DOC_LEAD \\n[#BIB_LEAD]u ADJUST +. nr #BIB_LEAD \\n[#DOC_LEAD] +. DOC_LEAD \\n[#ORIG_DOC_LEAD]u +. rr #NO_TRAP_RESET +. nr #ADJ_DOC_LEAD \\n[#RESTORE_ADJ_DOC_LEAD] +. rr #ORIG_DOC_LEAD +. \} +.END +\# +.MAC BIBLIOGRAPHY_HDRFTR_CENTER END +. ie '\\$1'' \{ .nr #BIB_HDRFTR_CENTER 1 \} +. el \{ .rr #BIB_HDRFTR_CENTER \} +.END +\# +.MAC BIBLIOGRAPHY_STRING END +. ds $BIB_STRING \\$1 +.END +\# +.MAC BIBLIOGRAPHY_STRING_UNDERSCORE END +. ie '\\$1'' \{ .nr #BIB_STRING_UNDERSCORE 1 \} +. el \{\ +. ie '\\$1'2' \{ .nr #BIB_STRING_UNDERSCORE 2 \} +. el \{ .nr #BIB_STRING_UNDERSCORE 0 \} +. \} +.END +\# +.MAC BIBLIOGRAPHY_STRING_CAPS END +. ie '\\$1'' \{ .nr #BIB_STRING_CAPS 1 \} +. el \{ .rr #BIB_STRING_CAPS \} +.END +\# +.MAC BIBLIOGRAPHY_NO_COLUMNS END +. ie '\\$1'' \{ .nr #BIB_NO_COLS 1 \} +. el \{ .rr #BIB_NO_COLS \} +.END +\# +.MAC BIBLIOGRAPHY_NO_FIRST_PAGENUM END +. ie '\\$1'' \{ .nr #BIB_NO_FIRST_PN 1 \} +. el \{ .rr #BIB_NO_FIRST_PN \} +.END +\# +.MAC BIBLIOGRAPHY_ALLOWS_HEADERS END +. ie '\\$1'' \{ .nr #BIB_ALLOWS_HEADERS 1 \} +. el \{\ +. ie '\\$1'ALL' \{\ +. nr #BIB_ALLOWS_HEADERS 1 +. nr #BIB_ALLOWS_HEADERS_ALL 1 +. \} +. el \{\ +. rr #BIB_ALLOWS_HEADERS +. rr #BIB_ALLOWS_HEADERS_ALL +. \} +. \} +.END +\# +.MAC BIBLIOGRAPHY_PAGENUM_STYLE END +. ds $BIB_PN_STYLE \\$1 +.END +\# +.MAC BIBLIOGRAPHY_FIRST_PAGENUMBER END +. nr #BIB_FIRST_PN \\$1 +.END +\# +.MAC SINGLESPACE_BIBLIOGRAPHY END +. if \\n[#PRINT_STYLE]=1 \{\ +. ie \\n[#SINGLE_SPACE] \{\ +. nr #BIB_SINGLESPACE 1 +. rr #IGNORE +. if \\n[#OK_PROCESS_LEAD] \{\ +. BIBLIOGRAPHY_LEAD 12 ADJUST +. nr #IGNORE 1 +. \} +. \} +. el \{\ +. ie '\\$1'' \{\ +. nr #BIB_SINGLESPACE 1 +. rr #IGNORE +. if \\n[#OK_PROCESS_LEAD] \{\ +. BIBLIOGRAPHY_LEAD 12 ADJUST +. nr #IGNORE 1 +. \} +. \} +. el \{\ +. rr #BIB_SINGLESPACE +. rr #IGNORE +. if \\n[#OK_PROCESS_LEAD] \{\ +. BIBLIOGRAPHY_LEAD 24 ADJUST +. nr #IGNORE 1 +. \} +. \} +. \} +. \} +.END +\# +\# +\# Style for outputting collected bibliographic references +\# ------------------------------------------------------- +\# *Argument: +\# LIST | PLAIN [ ] [ ] +\# *Function: +\# Sets #BIB_LIST to 1 for numbered list style, 0 for plain output +\# *Notes: +\# Technically, user is supposed to enter PLAIN if s/he wants an +\# unumbered bibliography, but the el clause says "any arg but +\# LIST means unumbered." Effectively, any arg but LIST produces +\# a "plain" bibliographic list. +\# +\# The 2nd and 3rd args have the same options as the 2nd arg to LIST. +\# +.MAC BIBLIOGRAPHY_TYPE END +. ie '\\$1'LIST' \{\ +. nr #BIB_LIST 1 +. ie '\\$2'' \{\ +. if '\\*[$BIB_LIST_SEPARATOR]'' .ds $BIB_LIST_SEPARATOR . +. \} +. el .ds $BIB_LIST_SEPARATOR \\$2 +. ie '\\$3'' .ds $BIB_LIST_PREFIX +. el .ds $BIB_LIST_PREFIX \\$3 +. \} +. el \{ .nr #BIB_LIST 0 \} +.END +\# +\# Spacing between items in bibliographies +\# --------------------------------------- +\# *Argument: +\# +\# *Function: +\# Gets value for #BIB_SPACE in units. +\# *Notes: +\# Requires a unit of measure. +\# +.MAC BIBLIOGRAPHY_SPACING END +. ds $BIB_SPACE \\$1 +. if \\n[#BIB_LEAD]=0 \{\ +. nr #DEFER_BIB_SPACING 1 +. return +. \} +. ds $EVAL_BIB_SPACE \\*[$BIB_SPACE] +. substring $EVAL_BIB_SPACE -1 +. ie '\\*[$EVAL_BIB_SPACE]'v' \{\ +. substring $BIB_SPACE 0 0 +. nr #BIB_SPACE \\n[#BIB_LEAD]*\\*[$BIB_SPACE] +. \} +. el \{\ +. nr #BIB_SPACE (\\$1) +. \} +.END +\# +\# Set up bibliography page +\# ------------------------ +\# *Function: +\# Sets up a new page, with title, ready to accept the output +\# of refer's $LIST$ or .R1 bibliography .R2 +\# *Notes: +\# Bibliography pages are set up almost identically to endnotes pages. +\# +.MAC BIBLIOGRAPHY END +. nr #BIBLIOGRAPHY 1 +. nr #BIB_FIRST_PAGE 1 +. nr #HEADER_STATE \\n[#HEADERS_ON] +. ds $RESTORE_PAGENUM_STYLE \\*[$PAGENUM_STYLE] +. if \\n[#LINENUMBERS]=1 \{\ +. NUMBER_LINES OFF +. nr #LINENUMBERS 2 +. \} +. if \\n[#HEADERS_ON]=1 \{\ +. if !\\n[#BIB_ALLOWS_HEADERS_ALL] \{ .HEADERS OFF \} +. \} +. if \\n[#HEADER_STATE]=1 \{\ +. ie \\n[#BIB_HDRFTR_CENTER]=1 \{ . \} +. el \{ .rm $HDRFTR_CENTER \} +. \} +. ie !\\n[#SUSPEND_PAGINATION] \{\ +. if \\n[#PAGINATE]=1 \{\ +. if \\n[#PAGE_NUM_V_POS]=1 \{\ +. PAGENUM_STYLE \\*[$BIB_PN_STYLE] +. if \\n[#BIB_FIRST_PN] \{ .PAGENUMBER \\n[#BIB_FIRST_PN]-1 \} +. if r#BIB_NO_FIRST_PN \{ .nr #PAGINATE 0 \} +. \} +. \} +. \} +. el \{\ +. ie \\n[#PAGE_NUM_V_POS]=2 \{ .nr #PAGINATE 1 \} +. el \{ .nr #PAGINATE 0 \} +. \} +. if \\n[#FOOTERS_ON]=1 \{\ +. if !'\\*[$HDRFTR_CENTER_OLD]'' .ds $HDRFTR_CENTER \\*[$HDRFTR_CENTER_OLD] +. \} +. NEWPAGE +. if \\n[#FOOTERS_ON]=1 \{\ +. ds $HDRFTR_CENTER \\*[$HDRFTR_CENTER_NEW] +. rm $HDRFTR_CENTER_OLD +. rm $HDRFTR_CENTER_NEW +. \} +. ie !\\n[#SUSPEND_PAGINATION] \{\ +. if \\n[#PAGE_NUM_V_POS]=1 \{\ +. if r#BIB_NO_FIRST_PN \{\ +. if \\n[#PAGINATION_STATE]=1 \{\ +. nr #PAGINATE 1 +. \} +. \} +. \} +. \} +. el \{\ +. if \\n[#PAGE_NUM_V_POS]=2 \{ .nr #PAGINATE 0 \} +. \} +. rr #PAGINATION_STATE +. PAGENUM_STYLE \\*[$BIB_PN_STYLE] +. if \\n[#BIB_FIRST_PN] \{ .PAGENUMBER \\n[#BIB_FIRST_PN] \} +. if \\n[#HEADER_STATE]=1 \{\ +. if \\n[#BIB_ALLOWS_HEADERS] \{ .HEADERS \} +. \} +.\" Collect bibliography title string for TOC +. nr #TOC_ENTRY_PN \\n%+\\n[#PAGE_NUM_ADJ] +. af #TOC_ENTRY_PN \\g[#PAGENUMBER] +. ds $TOC_TITLE_ITEM \\*[$BIB_STRING]\\| +. ev TOC_EV +. da TOC_ENTRIES +. if \\n[#PRINT_STYLE]=1 \{\ +. TYPEWRITER +. \} +. if \\n[#PRINT_STYLE]=2 \{\ +\!. FAMILY \\*[$TOC_TITLE_FAM] +\!. FT \\*[$TOC_TITLE_FT] +\!. PT_SIZE \\n[#TOC_PS]u\\*[$TOC_TITLE_SIZE_CHANGE] +. \} +\!. TRAP OFF +. ie \\n[#PRINT_STYLE]=1 \{\ +\!. PAD "\\*[$TOC_TITLE_ITEM]\\*[$TOC_PN_TYPEWRITE]" +. \} +. el \{\ +\!. PAD "\\h'\\n[#TOC_TITLE_INDENT]u'\\*[$TOC_TITLE_ITEM]\\*[$TOC_PN]" +. \} +\!. EOL +\!. ST 100 L +\!. ST 101 R +. if \\n[#PRINT_STYLE]=2 \{\ +\!. FAMILY \\*[$TOC_PN_FAM] +\!. FT \\*[$TOC_PN_FT] +\!. PT_SIZE \\n[#TOC_PS]u\\*[$TOC_PN_SIZE_CHANGE] +. \} +\!. TAB 100 +\!. PRINT \\*[LEADER] +\!. TN +\!. TRAP +\!. PRINT \\n[#TOC_ENTRY_PN] +\!. TQ +. di +. ev +.\" End collection of bibliography title string for TOC +.\" Process bibliography +. if \\n[#PRINT_STYLE]=1 \{ .vs \\n[#BIB_LEAD]u \} +. if \\n[#PRINT_STYLE]=2 \{\ +. if \\n[#BIB_NO_COLS] \{\ +. if \\n[#COLUMNS] \{ .nr #COLUMNS_WERE_ON 1 \} +. nr #COLUMNS 0 +. \} +. nr #RESTORE_DOC_LEAD \\n[#DOC_LEAD] +. ie \\n[#ADJ_BIB_LEAD] \{\ +. nr #DOC_LEAD \\n[#BIB_LEAD] +. \} +. el \{ .DOC_LEAD \\n[#BIB_LEAD]u \} +. \} +. PRINT \& +. ie r#BIB_TITLE_SPACE \{ .sp |\\n[#BIB_TITLE_SPACE]u \} +. el \{ .sp |\\n[#T_MARGIN]u \} +. mk ec +. if \\n[#SLANT_ON] \{\ +\*[SLANTX]\c +. \} +. if !'\\*[$BIB_STRING]'' \{\ +. if \\n[#PRINT_STYLE]=1 \{\ +. TYPEWRITER +. vs \\n[#BIB_LEAD]u +. \} +. if \\n[#PRINT_STYLE]=2 \{\ +. LL \\n[#DOC_L_LENGTH]u +. ta \\n(.lu +. if \\n[#COLUMNS] \{\ +. ie \\n[#BIB_NO_COLS] \{ .LL \\n[#DOC_L_LENGTH]u \} +. el \{ .LL \\n[#COL_L_LENGTH]u \} +. ta \\n(.lu +. \} +. FAMILY \\*[$BIB_STRING_FAM] +. FT \\*[$BIB_STRING_FT] +. PT_SIZE \\n[#BIB_PS]u\\*[$BIB_STRING_SIZE_CHANGE] +. vs \\n[#BIB_LEAD]u +. \} +. if '\\*[$BIB_STRING_QUAD]'L' \{ .LEFT \} +. if '\\*[$BIB_STRING_QUAD]'LEFT' \{ .LEFT \} +. if '\\*[$EN_STRING_QUAD]'C' \{ .CENTER \} +. if '\\*[$BIB_STRING_QUAD]'CENTER' \{ .CENTER \} +. if '\\*[$BIB_STRING_QUAD]'CENTRE' \{ .CENTER \} +. if '\\*[$BIB_STRING_QUAD]'R' \{ .RIGHT \} +. if '\\*[$BIB_STRING_QUAD]'RIGHT' \{ .RIGHT \} +. EOL +. if \\n[#BIB_STRING_CAPS] \{ .CAPS \} +. ie \\n[#BIB_STRING_UNDERSCORE] \{\ +. ie \\n[#BIB_STRING_UNDERSCORE]=2 \{\ +. UNDERSCORE2 "\\*[$BIB_STRING] +. \} +. el \{\ +. UNDERSCORE "\\*[$BIB_STRING] +. \} +. \} +. el \{\ +. PRINT "\\*[$BIB_STRING] +. \} +. \} +. CAPS OFF +. FAMILY \\*[$BIB_FAMILY] +. FT \\*[$BIB_FT] +. PT_SIZE -\\*[$BIB_STRING_SIZE_CHANGE] +. if \\n[#PRINT_STYLE]=1 \{\ +. ie \\n[#SINGLE_SPACE]=1 \{\ +. ALD \\n[#BIB_LEAD]*3u +. \} +. el \{\ +. ie \\n[#BIB_SINGLESPACE]=1 \{\ +. ALD \\n[#BIB_LEAD]u*3u +. \} +. el \{\ +. ALD \\n[#BIB_LEAD]u +. \} +. \} +. \} +. if \\n[#PRINT_STYLE]=2 \{ .ALD \\n[#BIB_LEAD]u*2u \} +. QUAD \\*[$BIB_QUAD] +. if \\n[#PRINT_STYLE]=1 \{\ +. ie \\n[#SINGLE_SPACE]=1 \{\ +. vs \\n[#BIB_LEAD]u +. \} +. el \{\ +. ie \\n[#BIB_SINGLESPACE]=1 \{\ +. vs \\n[#BIB_LEAD]u +. \} +. el \{\ +. vs \\n[#BIB_LEAD]u +. \} +. \} +. \} +. if \\n[#PRINT_STYLE]=2 \{\ +. ie \\n[#ADJ_BIB_LEAD] \{\ +. nr #DOC_LEAD \\n[#RESTORE_DOC_LEAD] +. \} +. el \{ .DOC_LEAD \\n[#RESTORE_DOC_LEAD]u \} +. rr #RESTORE_DOC_LEAD +. \} +. if \\n[#COLUMNS_WERE_ON] \{ .nr #COLUMNS 1 \} +. if \\n[#HEADER_STATE]=1 \{ .HEADERS \} +. rr #BIBLIOGRAPHY +. if \\n[#LINENUMBERS]=2 \{\ +. NUMBER_LINES RESUME +. nr #LINENUMBERS 1 +. \} +.END +\# +\# ==================================================================== +\# \# +++TABLE OF CONTENTS+++ \# \# Strings to allocate space for leaders and entry page numbers @@ -10833,20 +12887,6 @@ .END \# \# -\# TOC FAMILY -\# ---------- -\# *Argument: -\# -\# *Function: -\# Creates string $TOC_FAM. -\# *Notes: -\# Default is same as document family. -\# -.MAC TOC_FAMILY END -. ds $TOC_FAM \\$1 -.END -\# -\# \# TOC POINT SIZE \# -------------- \# *Argument: @@ -10892,6 +12932,7 @@ . nr #TOC_LEAD (p;\\$1) . if '\\$2'ADJUST' \{\ . nr #ORIG_DOC_LEAD \\n[#DOC_LEAD] +. nr #RESTORE_ADJ_DOC_LEAD \\n[#ADJ_DOC_LEAD] . nr #ADJ_DOC_LEAD 1 . nr #ADJ_TOC_LEAD 1 . nr #NO_TRAP_RESET 1 @@ -10899,7 +12940,7 @@ . nr #TOC_LEAD \\n[#DOC_LEAD] . DOC_LEAD \\n[#ORIG_DOC_LEAD]u . rr #NO_TRAP_RESET -. rr #ADJ_DOC_LEAD +. nr #ADJ_DOC_LEAD \\n[#RESTORE_ADJ_DOC_LEAD] . rr #ORIG_DOC_LEAD . \} .END @@ -10939,120 +12980,20 @@ \# \# - for TOC "doc header" (i.e. "Contents") \# -\# TOC HEADER FAMILY +\# TOC HEADER STRING \# ----------------- \# *Argument: -\# +\# \# *Function: -\# Creates or modifies string $TOC_HEADER_FAM +\# Creates or modifies string $TOC_HEADER_STRING \# *Notes: -\# Default is same as TOC_FAMILY. +\# Default is "Contents". \# -.MAC TOC_HEADER_FAMILY END -. ds $TOC_HEADER_FAM \\$1 -.END -\# -\# -\# TOC HEADER FONT -\# --------------- -\# *Argument: -\# -\# *Function: -\# Creates or modified string $TOC_HEADER_FT -\# *Notes: -\# Default is bold for TYPESET. -\# -.MAC TOC_HEADER_FONT END -. ds $TOC_HEADER_FT \\$1 -.END -\# -\# -\# TOC HEADER SIZE -\# -------------- -\# *Argument: -\# <+|- number of points by which to in/decrease toc header -\# (relative to overall toc point size)> -\# *Function: -\# Creates or modifies string $TOC_HEADER_SIZE_CHANGE. -\# *Notes: -\# Default is +4 -\# -.MAC TOC_HEADER_SIZE END -. ds $TOC_HEADER_SIZE_CHANGE \\$1 -.END -\# -\# -\# TOC HEADER QUAD -\# --------------- -\# *Argument: -\# L | LEFT | C | CENTER | CENTRE | R | RIGHT -\# *Function: -\# Creates or modifies string $TOC_HEADER_QUAD. -\# *Notes: -\# Default is LEFT. -\# -.MAC TOC_HEADER_QUAD END -. ds $TOC_HEADER_QUAD \\$1 -.END -\# -\# -\# TOC HEADER STRING -\# ----------------- -\# *Argument: -\# -\# *Function: -\# Creates or modifies string $TOC_HEADER_STRING -\# *Notes: -\# Default is "Contents". -\# -.MAC TOC_HEADER_STRING END -. ds $TOC_HEADER_STRING \\$1 -.END -\# -\# - for TOC entries page number numerals -\# -\# TOC ENTRIES PAGE NUMBER FAMILY -\# ------------------------------ -\# *Argument: -\# -\# *Function: -\# Creates or modifies string $TOC_PN_FAM. -\# *Notes: -\# Default is same as $TOC_FAM. -\# -.MAC TOC_PN_FAMILY END -. ds $TOC_PN_FAM \\$1 -.END -\# -\# -\# TOC ENTRIES PAGE NUMBER FONT -\# ---------------------------- -\# *Argument: -\# -\# *Function: -\# Creates or modifies string $TOC_PN_FT. -\# *Notes: -\# Default is roman. -\# -.MAC TOC_PN_FONT END -. ds $TOC_PN_FT \\$1 -.END -\# -\# -\# TOC ENTRIES PAGE NUMBER SIZE -\# ---------------------------- -\# *Argument: -\# <+|- number of points by which to in/decrease toc -\# entries page numbers (relative to overall toc point size)> -\# *Function: -\# Creates or modifies string $TOC_PN_SIZE_CHANGE. -\# *Notes: -\# Default is +0. -\# -.MAC TOC_PN_SIZE END -. ds $TOC_PN_SIZE_CHANGE \\$1 +.MAC TOC_HEADER_STRING END +. ds $TOC_HEADER_STRING \\$1 .END \# +\# - for TOC entries page number numerals \# \# Control macros for toc doc titles, heads, subheads and paraheads \# ---------------------------------------------------------------- @@ -11066,21 +13007,6 @@ \# \# - for title entries \# -.MAC TOC_TITLE_FAMILY END -. ds $TOC_TITLE_FAM \\$1 -.END -\# -\# -.MAC TOC_TITLE_FONT END -. ds $TOC_TITLE_FT \\$1 -.END -\# -\# -.MAC TOC_TITLE_SIZE END -. ds $TOC_TITLE_SIZE_CHANGE \\$1 -.END -\# -\# .MAC TOC_TITLE_INDENT END . nr #TOC_TITLE_INDENT (\\$1) .END @@ -11118,69 +13044,28 @@ \# \# - for head entries \# -.MAC TOC_HEAD_FAMILY END -. ds $TOC_HEAD_FAM \\$1 -.END -\# -\# -.MAC TOC_HEAD_FONT END -. ds $TOC_HEAD_FT \\$1 -.END -\# -\# -.MAC TOC_HEAD_SIZE END -. ds $TOC_HEAD_SIZE_CHANGE \\$1 -.END -\# -\# .MAC TOC_HEAD_INDENT END . nr #TOC_HEAD_INDENT (\\$1) .END \# \# - for subhead entries \# -.MAC TOC_SUBHEAD_FAMILY END -. ds $TOC_SH_FAM \\$1 -.END -\# -\# -.MAC TOC_SUBHEAD_FONT END -. ds $TOC_SH_FT \\$1 -.END -\# -\# -.MAC TOC_SUBHEAD_SIZE END -. ds $TOC_SH_SIZE_CHANGE \\$1 -.END -\# -\# .MAC TOC_SUBHEAD_INDENT END . nr #TOC_SH_INDENT (\\$1) .END \# \# - for parahead entries \# -.MAC TOC_PARAHEAD_FAMILY END -. ds $TOC_PH_FAM \\$1 -.END -\# -\# -.MAC TOC_PARAHEAD_FONT END -. ds $TOC_PH_FT \\$1 -.END -\# -\# -.MAC TOC_PARAHEAD_SIZE END -. ds $TOC_PH_SIZE_CHANGE \\$1 -.END -\# -\# .MAC TOC_PARAHEAD_INDENT END . nr #TOC_PH_INDENT (\\$1) .END \# \# .MAC TOC END +. if \\n[#LINENUMBERS]=1 \{\ +. NUMBER_LINES OFF +. nr #LINENUMBERS 2 +. \} . if !r#PAGINATE_TOC \{ .PAGINATE_TOC \} . nr #TOC_FIRST_PAGE 1 . if \\n[#FINIS] \{\ @@ -11189,7 +13074,7 @@ . \} . \} . if \\n[#FOOTERS_ON]=1 \{\ -. if !'\\*[$HDRFTR_CENTER_OLD]'' \{ .ds $HDRFTR_CENTER \\*[$HDRFTR_CENTER_OLD] \} +. if !'\\*[$HDRFTR_CENTER_OLD]'' .ds $HDRFTR_CENTER \\*[$HDRFTR_CENTER_OLD] . ie \\n[#PAGINATE_TOC]=1 \{ .PAGINATE \} . el \{ .PAGINATION OFF \} . \} @@ -11219,6 +13104,7 @@ . DOC_LEAD 24 ADJUST . nr #IGNORE 1 . \} +. if \\n[#LINENUMBERS]=2 \{ .nr #LINENUMBERS 3 \} . START . PP . nr #COLUMNS 0 @@ -11238,9 +13124,7 @@ . QUAD \\*[$TOC_HEADER_QUAD] . PAGENUM_STYLE \\*[$TOC_PN_STYLE] . if \\n[#PRINT_STYLE]=1 \{\ -. fam C -. ft R -. ps 12 +. TYPEWRITER . \} . if \\n[#PRINT_STYLE]=2 \{\ . FAMILY \\*[$TOC_HEADER_FAM] @@ -11259,9 +13143,9 @@ . \} . LEFT . SP -\# In collated docs, this bit inserts the first doc's title -\# underneath the TOC header, before the TOC_ENTRIES diversion -\# gets output. +.\" In collated docs, this bit inserts the first doc's title +.\" underneath the TOC header, before the TOC_ENTRIES diversion +.\" gets output. . nf . if d$FIRST_DOC_TITLE \{\ . nr #RESTORE_TOC_PN_PADDING \\n[#TOC_PN_PADDING] @@ -11277,7 +13161,7 @@ . el \{\ . PAD "\\h'\\n[#TOC_TITLE_INDENT]u'\\*[$FIRST_DOC_TITLE]\\*[$TOC_PN]" . \} -. EL +. EOL . ST 100 L . ST 101 R . if \\n[#PRINT_STYLE]=2 \{\ @@ -11296,6 +13180,11 @@ . TOC_ENTRIES . br . rr #TOC +. if \\n[#LINENUMBERS]=3 \{\ +. NUMBER_LINES RESUME +. nr #LINENUMBERS 1 +. nn 1 +. \} .END \# \# ==================================================================== @@ -11323,6 +13212,9 @@ . while !\\n[#COL_NUM]=\\n[#NUM_COLS] \{\ . nr #COL_\\n+[#COL_NUM]_L_MARGIN \\n[#L_MARGIN]+\\n[#COL_TOTAL] . nr #COL_TOTAL \\n+[#COL_TOTAL] +.\} +. if \\n[#NUM_COLS]=1 \{\ +. if !\\n[#COLLATE]=1 \{ .MN_INIT \} . \} . rr #COL_TOTAL . rr #COL_NUM @@ -11360,7 +13252,7 @@ \# LIST \# ---- \# *Arguments: -\# [ BULLET | DASH | DIGIT | ALPHA | USER ] [ ] [ ] +\# [ BULLET | DASH | DIGIT | alpha | ALPHA | roman | ROMAN | USER ] [ | NONE ] [ ] [ ] \# *Function: \# Stores indent information in effect prior to invocation and \# initializes a list with the supplied enumerator (and separator). @@ -11372,9 +13264,33 @@ \# desired. \# \# moves back one list level intuitively, or exits lists -\# completely if the level at which it's invoked is the first. +\# completely if the level in which it's invoked is the first. \# .MAC LIST END +. ds $1ST_LETTER \\$1 +. substring $1ST_LETTER 0 0 +. if '\\*[$1ST_LETTER]'r' .ds $1ST_LETTER R +. ie '\\*[$1ST_LETTER]'R' \{\ +. ds $LAST_CHAR \\$1 +. substring $LAST_CHAR -1 +. if !\B'\\*[$LAST_CHAR]' \{\ +. tm1 "[mom]: You must append a number to the \\$1 argument to LIST at line \\n(.c. +. tm1 " The number should be the total number of items in this list. +. tm1 " See the documentation. +. ab Aborting LIST +. \} +. ds $ROMAN_WIDTH \\$1 +. substring $ROMAN_WIDTH 1 +. while !\B'\\*[$ROMAN_WIDTH]' \{\ +. substring $ROMAN_WIDTH 1 +.\} +. length #ROMAN_LENGTH \\*[$ROMAN_WIDTH] +. ds $LIST_ARG_1 \\$1 +. substring $LIST_ARG_1 0 -(\\n[#ROMAN_LENGTH]+1) +. \} +. el \{\ +. ds $LIST_ARG_1 \\$1 +. \} . if !r#DEPTH \{\ . nr #STORED_HL_INDENT \\n[#HL_INDENT] . nr #STORED_T_INDENT \\n[#T_INDENT] @@ -11406,45 +13322,93 @@ . if \\n[#NUM_ARGS]=0 \{\ . nr #ARGS_TO_LIST 1 \" So default behaves as if LIST BULLET . ds $ENUMERATOR\\n+[#DEPTH] \(bu +. ds $ENUMERATOR_TYPE\\n[#DEPTH] other . ds $SEPARATOR . \} . if \\n[#NUM_ARGS]>0 \{\ . rr #ARGS_TO_LIST \" Clear this before processing arg 1. -. if '\\$1'DASH' \{\ +. if '\\*[$LIST_ARG_1]'DASH' \{\ . nr #ARGS_TO_LIST 1 . ds $ENUMERATOR\\n+[#DEPTH] \(en +. ds $ENUMERATOR_TYPE\\n[#DEPTH] other . ds $SEPARATOR\\n[#DEPTH] . \} -. if '\\$1'BULLET' \{\ +. if '\\*[$LIST_ARG_1]'BULLET' \{\ . nr #ARGS_TO_LIST 1 . ds $ENUMERATOR\\n+[#DEPTH] \(bu +. ds $ENUMERATOR_TYPE\\n[#DEPTH] other . ds $SEPARATOR\\n[#DEPTH] . \} -. if '\\$1'DIGIT' \{\ +. if '\\*[$LIST_ARG_1]'DIGIT' \{\ . nr #ARGS_TO_LIST 1 . nr #ENUMERATOR\\n+[#DEPTH] 0 1 . ds $ENUMERATOR_TYPE\\n[#DEPTH] register . ds $SEPARATOR\\n[#DEPTH] . -. if \\n[#NUM_ARGS]=2 \{\ -. ie '\\$2'NONE' \{ .ds $SEPARATOR\\n[#DEPTH]\} -. el \{ .ds $SEPARATOR\\n[#DEPTH] \\$2\} +. ds $PREFIX\\n[#DEPTH] +. if \\n[#NUM_ARGS]>=2 \{\ +. ie '\\$2'NONE' .ds $SEPARATOR\\n[#DEPTH] +. el .ds $SEPARATOR\\n[#DEPTH] \\$2 +. if \\n[#NUM_ARGS]=3 \{\ +. ds $PREFIX\\n[#DEPTH] \\$3 +. \} . \} . \} -. if '\\$1'ALPHA' \{\ +. if '\\*[$LIST_ARG_1]'alpha' \{\ . nr #ARGS_TO_LIST 1 . nr #ENUMERATOR\\n+[#DEPTH] 0 1 . af #ENUMERATOR\\n[#DEPTH] a . ds $ENUMERATOR_TYPE\\n[#DEPTH] register . ds $SEPARATOR\\n[#DEPTH] ) -. if \\n[#NUM_ARGS]=2 \{\ -. ie '\\$2'NONE' \{ .ds $SEPARATOR\\n[#DEPTH]\} -. el \{ .ds $SEPARATOR\\n[#DEPTH] \\$2\} +. ds $PREFIX\\n[#DEPTH] +. if \\n[#NUM_ARGS]>=2 \{\ +. ie '\\$2'NONE' .ds $SEPARATOR\\n[#DEPTH] +. el .ds $SEPARATOR\\n[#DEPTH] \\$2 +. if \\n[#NUM_ARGS]=3 \{\ +. ds $PREFIX\\n[#DEPTH] \\$3 +. \} +. \} +. \} +. if '\\*[$LIST_ARG_1]'ALPHA' \{\ +. nr #ARGS_TO_LIST 1 +. nr #ENUMERATOR\\n+[#DEPTH] 0 1 +. af #ENUMERATOR\\n[#DEPTH] A +. ds $ENUMERATOR_TYPE\\n[#DEPTH] register +. ds $SEPARATOR\\n[#DEPTH] ) +. ds $PREFIX\\n[#DEPTH] +. if \\n[#NUM_ARGS]>=2 \{\ +. ie '\\$2'NONE' .ds $SEPARATOR\\n[#DEPTH] +. el .ds $SEPARATOR\\n[#DEPTH] \\$2 +. if \\n[#NUM_ARGS]=3 \{\ +. ds $PREFIX\\n[#DEPTH] \\$3 +. \} +. \} +. \} +. if '\\*[$1ST_LETTER]'R' \{\ +. nr #ARGS_TO_LIST 1 +. nr #ENUMERATOR\\n+[#DEPTH] 0 1 +. if '\\*[$LIST_ARG_1]'roman' \{\ +. af #ENUMERATOR\\n[#DEPTH] i +. \} +. if '\\*[$LIST_ARG_1]'ROMAN' \{\ +. af #ENUMERATOR\\n[#DEPTH] I +. \} +. ds $ENUMERATOR_TYPE\\n[#DEPTH] roman +. ds $SEPARATOR\\n[#DEPTH] ) +. ds $PREFIX\\n[#DEPTH] +. if \\n[#NUM_ARGS]>=2 \{\ +. ie '\\$2'NONE' .ds $SEPARATOR\\n[#DEPTH] +. el .ds $SEPARATOR\\n[#DEPTH] \\$2 +. if \\n[#NUM_ARGS]=3 \{\ +. ds $PREFIX\\n[#DEPTH] \\$3 +. \} . \} . \} -. if '\\$1'USER' \{\ +. if '\\*[$LIST_ARG_1]'USER' \{\ . nr #ARGS_TO_LIST 1 . ds $ENUMERATOR\\n+[#DEPTH] \\$2 +. ds $ENUMERATOR_TYPE\\n[#DEPTH] other . ds $SEPARATOR\\n[#DEPTH] +. ds $PREFIX\\n[#DEPTH] . \} . if \\n[#NUM_ARGS]=1 \{\ . if !r#ARGS_TO_LIST \{\ @@ -11470,11 +13434,17 @@ . \} . \} . nr #TOTAL_LISTS \\n[#DEPTH] -. ie '\\*[$ENUMERATOR_TYPE\\n[#DEPTH]]'register' \{\ -. nr #LIST_INDENT\\n[#DEPTH] \\w'm\\*[$SEPARATOR\\n[#DEPTH]]\\ ' +. if '\\*[$ENUMERATOR_TYPE\\n[#DEPTH]]'register' \{\ +. nr #LIST_INDENT\\n[#DEPTH] \w'\\*[$PREFIX\\n[#DEPTH]]m\\*[$SEPARATOR\\n[#DEPTH]]\ ' +. if '\\*[$LIST_ARG_1]'ALPHA'\{\ +. nr #LIST_INDENT\\n[#DEPTH] \w'\\*[$PREFIX\\n[#DEPTH]]M\\*[$SEPARATOR\\n[#DEPTH]]\ ' +. \} . \} -. el \{\ -. nr #LIST_INDENT\\n[#DEPTH] \\w'\\*[$ENUMERATOR\\n[#DEPTH]]\\0' +. if '\\*[$ENUMERATOR_TYPE\\n[#DEPTH]]'roman' \{\ +. GET_ROMAN_INDENT +. \} +. if '\\*[$ENUMERATOR_TYPE\\n[#DEPTH]]'other' \{\ +. nr #LIST_INDENT\\n[#DEPTH] \w'\\*[$ENUMERATOR\\n[#DEPTH]]\0' . \} . LL \\n[#CURRENT_L_LENGTH]u . ie \\n[#DEPTH]=1 \{\ @@ -11511,609 +13481,2409 @@ .END \# \# -\# ITEM -\# ---- -\# *Arguments: -\# none -\# *Function: -\# Prints enumerator for a given list depth and prepares mom to -\# receive the text of an item. +\# ITEM +\# ---- +\# *Arguments: +\# none +\# *Function: +\# Prints enumerator for a given list depth and prepares mom to +\# receive the text of an item. +\# +.MAC ITEM END +. if \\n[#LINENUMBERS]=1 \{\ +. NUMBER_LINES OFF +. nr #LINENUMBERS 2 +. \} +. if \\n[#KERN]=1 \{\ +. nr #KERN_WAS_ON 1 +. KERN OFF +. \} +. IL +. ll \\n[#CURRENT_L_LENGTH]u \" Set ll again because IL turns IB off. +. TRAP OFF +. HI \\n[#HL_INDENT\\n[#DEPTH]]u +. if '\\*[$SEPARATOR\\n[#DEPTH]]')' \{ .nr #SEP_TYPE 1 \} +. if '\\*[$SEPARATOR\\n[#DEPTH]]']' \{ .nr #SEP_TYPE 1 \} +. if '\\*[$SEPARATOR\\n[#DEPTH]]'}' \{ .nr #SEP_TYPE 1 \} +. ie \\n[#IN_BIB_LIST]=1 \{\ +. ie \\n[#ENUMERATOR\\n[#DEPTH]]<9 \{\ +. ie \\n[#SEP_TYPE]=1 \{\ +. PRINT \v'-.085m'\\*[$PREFIX\\n[#DEPTH]]\v'.085m'\\n+[#ENUMERATOR\\n[#DEPTH]]\v'-.085m'\\*[$SEPARATOR\\n[#DEPTH]]\v'.085m' +. \} +. el \{\ +. PRINT \\*[$PREFIX\\n[#DEPTH]]\\n+[#ENUMERATOR\\n[#DEPTH]]\\*[$SEPARATOR\\n[#DEPTH]] +. \} +. \} +. el \{\ +. ie \\n[#SEP_TYPE]=1 \{\ +. PRINT \h'-\w'\0'u'\v'-.085m'\\*[$PREFIX\\n[#DEPTH]]\v'.085m'\\n+[#ENUMERATOR\\n[#DEPTH]]\v'-.085m'\\*[$SEPARATOR\\n[#DEPTH]]\v'.085m' +. \} +. el \{\ +. PRINT \h'-\w'\0'u'\\*[$PREFIX\\n[#DEPTH]]\\n+[#ENUMERATOR\\n[#DEPTH]]\\*[$SEPARATOR\\n[#DEPTH]] +. \} +. \} +. \} +. el \{\ +. ie '\\*[$ENUMERATOR_TYPE\\n[#DEPTH]]'register' \{\ +.\" DIGIT +. ie '\\g[#ENUMERATOR\\n[#DEPTH]]'0' \{\ +. ie \\n[#PAD_LIST_DIGITS\\n[#DEPTH]]=1 \{\ +. ie \\n[#ENUMERATOR\\n[#DEPTH]]<9 \{\ +. ie \\n[#SEP_TYPE]=1 \{\ +. PRINT \0\v'-.085m'\\*[$PREFIX\\n[#DEPTH]]\v'.085m'\\n+[#ENUMERATOR\\n[#DEPTH]]\v'-.085m'\\*[$SEPARATOR\\n[#DEPTH]]\v'.085m' +. \} +. el \{\ +. PRINT \0\\*[$PREFIX\\n[#DEPTH]]\\n+[#ENUMERATOR\\n[#DEPTH]]\\*[$SEPARATOR\\n[#DEPTH]] +. \} +. \} +. el \{\ +. ie \\n[#SEP_TYPE]=1 \{\ +. PRINT \v'-.085m'\\*[$PREFIX\\n[#DEPTH]]\v'.085m'\\n+[#ENUMERATOR\\n[#DEPTH]]\v'-.085m'\\*[$SEPARATOR\\n[#DEPTH]]\v'.085m' +. \} +. el \{\ +. PRINT \\*[$PREFIX\\n[#DEPTH]]\\n+[#ENUMERATOR\\n[#DEPTH]]\\*[$SEPARATOR\\n[#DEPTH]] +. \} +. \} +. \} +. el \{\ +. ie \\n[#SEP_TYPE]=1 \{\ +. PRINT \v'-.085m'\\*[$PREFIX\\n[#DEPTH]]\v'.085m'\\n+[#ENUMERATOR\\n[#DEPTH]]\v'-.085m'\\*[$SEPARATOR\\n[#DEPTH]]\v'.085m' +. \} +. el \{\ +. PRINT \\*[$PREFIX\\n[#DEPTH]]\\n+[#ENUMERATOR\\n[#DEPTH]]\\*[$SEPARATOR\\n[#DEPTH]] +. \} +. \} +. \} +. el \{\ +.\" ALPHA +. ie '\\g[#ENUMERATOR\\n[#DEPTH]]'A' \{\ +. ie \\n[#SEP_TYPE]=1 \{\ +. PRINT \v'-.085m'\\*[$PREFIX\\n[#DEPTH]]\v'.085m'\\n+[#ENUMERATOR\\n[#DEPTH]]\v'-.085m'\\*[$SEPARATOR\\n[#DEPTH]]\v'.085m' +. \} +. el \{\ +. PRINT \\*[$PREFIX\\n[#DEPTH]]\\n+[#ENUMERATOR\\n[#DEPTH]]\\*[$SEPARATOR\\n[#DEPTH]] +. \} +. \} +.\" alpha +. el \{\ +. PRINT \\*[$PREFIX\\n[#DEPTH]]\\n+[#ENUMERATOR\\n[#DEPTH]]\\*[$SEPARATOR\\n[#DEPTH]] +. \} +. \} +. \} +. \} +. el \{\ +. if '\\*[$ENUMERATOR_TYPE\\n[#DEPTH]]'roman' \{\ +. ie \\n[#PAD_LIST_DIGITS\\n[#DEPTH]]=1 \{\ +.\" ROMAN I, padded +. ie '\\g[#ENUMERATOR\\n[#DEPTH]]'I' \{\ +. ie \\n[#SEP_TYPE]=1 \{\ +. PRINT "\h'\\n[#LIST_INDENT\\n[#DEPTH]]u'\h'-\w'\\*[$PREFIX\\n[#DEPTH]]\\n+[#ENUMERATOR\\n[#DEPTH]]\\n[#SEPARATOR\\n[#DEPTH]]\ 'u'\v'-.085m'\\*[$PREFIX\\n[#DEPTH]]\v'.085m'\\n[#ENUMERATOR\\n[#DEPTH]]\v'-.085m'\\*[$SEPARATOR\\n[#DEPTH]]\v'.085m' +. \} +. el \{\ +. PRINT "\h'\\n[#LIST_INDENT\\n[#DEPTH]]u'\h'-\w'\\*[$PREFIX\\n[#DEPTH]]\\n+[#ENUMERATOR\\n[#DEPTH]]\\n[#SEPARATOR\\n[#DEPTH]]\ 'u'\\*[$PREFIX\\n[#DEPTH]]\\n[#ENUMERATOR\\n[#DEPTH]]\\*[$SEPARATOR\\n[#DEPTH]] +. \} +. \} +.\" roman i, padded +. el \{\ +. PRINT "\h'\\n[#LIST_INDENT\\n[#DEPTH]]u'\h'-\w'\\*[$PREFIX\\n[#DEPTH]]\\n+[#ENUMERATOR\\n[#DEPTH]]\\n[#SEPARATOR\\n[#DEPTH]]\ 'u'\\*[$PREFIX\\n[#DEPTH]]\\n[#ENUMERATOR\\n[#DEPTH]]\\*[$SEPARATOR\\n[#DEPTH]] +. \} +. \} +.\" No pad +. el \{\ +.\" ROMAN I, no pad +. ie '\\g[#ENUMERATOR\\n[#DEPTH]]'I' \{\ +. ie \\n[#SEP_TYPE]=1 \{\ +. PRINT \v'-.085m'\\*[$PREFIX\\n[#DEPTH]]\v'.085m'\\n+[#ENUMERATOR\\n[#DEPTH]]\v'-.085m'\\*[$SEPARATOR\\n[#DEPTH]]\v'.085m' +. \} +. el \{\ +. PRINT \\*[$PREFIX\\n[#DEPTH]]\\n+[#ENUMERATOR\\n[#DEPTH]]\\*[$SEPARATOR\\n[#DEPTH]] +. \} +. \} +.\" roman i, no pad +. el \{\ +. PRINT \\*[$PREFIX\\n[#DEPTH]]\\n+[#ENUMERATOR\\n[#DEPTH]]\\*[$SEPARATOR\\n[#DEPTH]] +. \} +. \} +. \} +. if '\\*[$ENUMERATOR_TYPE\\n[#DEPTH]]'other' \{\ +. PRINT \\*[$ENUMERATOR\\n[#DEPTH]]\\*[$SEPARATOR\\n[#DEPTH]] +. \} +. \} +. rr #SEP_TYPE +. EOL +. if \\n[#REF]=1 \{\ +. IL +\\*[$REF_BIB_INDENT] +. ti \\n[#L_INDENT]u-\\*[$REF_BIB_INDENT] +. \} +. TRAP +. if \\n[#KERN_WAS_ON]=1 \{\ +. KERN +. rr #KERN_WAS_ON +. \} +. if \\n[#LINENUMBERS]=2 \{\ +. NUMBER_LINES RESUME +. nr #LINENUMBERS 1 +. \} +.END +\# +\# A utility macro that determines the space to reserve for +\# roman numeral enumerated lists. Limit is 20 roman numerals +\# per list. If this isn't enough, the user can add to the +\# macro. +\# +.MAC GET_ROMAN_INDENT END +. if '\\*[$LIST_ARG_1]'roman' \{\ +. if '\\*[$ROMAN_WIDTH]'1' \{\ +. ds $ROMAN_WIDTH\\n[#DEPTH] 1 +. nr #LIST_INDENT\\n[#DEPTH] \w'\\*[$PREFIX\\n[#DEPTH]]i\\*[$SEPARATOR\\n[#DEPTH]]\0' +. \} +. if '\\*[$ROMAN_WIDTH]'2' \{\ +. ds $ROMAN_WIDTH\\n[#DEPTH] 2 +. nr #LIST_INDENT\\n[#DEPTH] \w'\\*[$PREFIX\\n[#DEPTH]]ii\\*[$SEPARATOR\\n[#DEPTH]]\0' +. \} +. if '\\*[$ROMAN_WIDTH]'3' \{\ +. ds $ROMAN_WIDTH\\n[#DEPTH] 3 +. nr #LIST_INDENT\\n[#DEPTH] \w'\\*[$PREFIX\\n[#DEPTH]]iii\\*[$SEPARATOR\\n[#DEPTH]]\0' +. \} +. if '\\*[$ROMAN_WIDTH]'4' \{\ +. ds $ROMAN_WIDTH\\n[#DEPTH] 4 +. nr #LIST_INDENT\\n[#DEPTH] \w'\\*[$PREFIX\\n[#DEPTH]]iii\\*[$SEPARATOR\\n[#DEPTH]]\0' +. \} +. if '\\*[$ROMAN_WIDTH]'5' \{\ +. ds $ROMAN_WIDTH\\n[#DEPTH] 5 +. nr #LIST_INDENT\\n[#DEPTH] \w'\\*[$PREFIX\\n[#DEPTH]]iii\\*[$SEPARATOR\\n[#DEPTH]]\0' +. \} +. if '\\*[$ROMAN_WIDTH]'6' \{\ +. ds $ROMAN_WIDTH\\n[#DEPTH] 6 +. nr #LIST_INDENT\\n[#DEPTH] \w'\\*[$PREFIX\\n[#DEPTH]]iii\\*[$SEPARATOR\\n[#DEPTH]]\0' +. \} +. if '\\*[$ROMAN_WIDTH]'7' \{\ +. ds $ROMAN_WIDTH\\n[#DEPTH] 7 +. nr #LIST_INDENT\\n[#DEPTH] \w'\\*[$PREFIX\\n[#DEPTH]]vii\\*[$SEPARATOR\\n[#DEPTH]]\0' +. \} +. if '\\*[$ROMAN_WIDTH]'8' \{\ +. ds $ROMAN_WIDTH\\n[#DEPTH] 8 +. nr #LIST_INDENT\\n[#DEPTH] \w'\\*[$PREFIX\\n[#DEPTH]]viii\\*[$SEPARATOR\\n[#DEPTH]]\0' +. \} +. if '\\*[$ROMAN_WIDTH]'9' \{\ +. ds $ROMAN_WIDTH\\n[#DEPTH] 9 +. nr #LIST_INDENT\\n[#DEPTH] \w'\\*[$PREFIX\\n[#DEPTH]]viii\\*[$SEPARATOR\\n[#DEPTH]]\0' +. \} +. if '\\*[$ROMAN_WIDTH]'10' \{\ +. ds $ROMAN_WIDTH\\n[#DEPTH] 10 +. nr #LIST_INDENT\\n[#DEPTH] \w'\\*[$PREFIX\\n[#DEPTH]]viii\\*[$SEPARATOR\\n[#DEPTH]]\0' +. \} +. if '\\*[$ROMAN_WIDTH]'11' \{\ +. ds $ROMAN_WIDTH\\n[#DEPTH] 11 +. nr #LIST_INDENT\\n[#DEPTH] \w'\\*[$PREFIX\\n[#DEPTH]]viii\\*[$SEPARATOR\\n[#DEPTH]]\0' +. \} +. if '\\*[$ROMAN_WIDTH]'12' \{\ +. ds $ROMAN_WIDTH\\n[#DEPTH] 12 +. nr #LIST_INDENT\\n[#DEPTH] \w'\\*[$PREFIX\\n[#DEPTH]]viii\\*[$SEPARATOR\\n[#DEPTH]]\0' +. \} +. if '\\*[$ROMAN_WIDTH]'13' \{\ +. ds $ROMAN_WIDTH\\n[#DEPTH] 13 +. nr #LIST_INDENT\\n[#DEPTH] \w'\\*[$PREFIX\\n[#DEPTH]]xiii\\*[$SEPARATOR\\n[#DEPTH]]\0' +. \} +. if '\\*[$ROMAN_WIDTH]'14' \{\ +. ds $ROMAN_WIDTH\\n[#DEPTH] 14 +. nr #LIST_INDENT\\n[#DEPTH] \w'\\*[$PREFIX\\n[#DEPTH]]xiii\\*[$SEPARATOR\\n[#DEPTH]]\0' +. \} +. if '\\*[$ROMAN_WIDTH]'15' \{\ +. ds $ROMAN_WIDTH\\n[#DEPTH] 15 +. nr #LIST_INDENT\\n[#DEPTH] \w'\\*[$PREFIX\\n[#DEPTH]]xiii\\*[$SEPARATOR\\n[#DEPTH]]\0' +. \} +. if '\\*[$ROMAN_WIDTH]'16' \{\ +. ds $ROMAN_WIDTH\\n[#DEPTH] 16 +. nr #LIST_INDENT\\n[#DEPTH] \w'\\*[$PREFIX\\n[#DEPTH]]xiii\\*[$SEPARATOR\\n[#DEPTH]]\0' +. \} +. if '\\*[$ROMAN_WIDTH]'17' \{\ +. ds $ROMAN_WIDTH\\n[#DEPTH] 17 +. nr #LIST_INDENT\\n[#DEPTH] \w'\\*[$PREFIX\\n[#DEPTH]]xvii\\*[$SEPARATOR\\n[#DEPTH]]\0' +. \} +. if '\\*[$ROMAN_WIDTH]'18' \{\ +. ds $ROMAN_WIDTH\\n[#DEPTH] 18 +. nr #LIST_INDENT\\n[#DEPTH] \w'\\*[$PREFIX\\n[#DEPTH]]xviii\\*[$SEPARATOR\\n[#DEPTH]]\0' +. \} +. if '\\*[$ROMAN_WIDTH]'19' \{\ +. ds $ROMAN_WIDTH\\n[#DEPTH] 19 +. nr #LIST_INDENT\\n[#DEPTH] \w'\\*[$PREFIX\\n[#DEPTH]]xviii\\*[$SEPARATOR\\n[#DEPTH]]\0' +. \} +. if '\\*[$ROMAN_WIDTH]'20' \{\ +. ds $ROMAN_WIDTH\\n[#DEPTH] 20 +. nr #LIST_INDENT\\n[#DEPTH] \w'\\*[$PREFIX\\n[#DEPTH]]xviii\\*[$SEPARATOR\\n[#DEPTH]]\0' +. \} +. \} +. if '\\*[$LIST_ARG_1]'ROMAN' \{\ +. if '\\*[$ROMAN_WIDTH]'1' \{\ +. ds $ROMAN_WIDTH\\n[#DEPTH] 1 +. nr #LIST_INDENT\\n[#DEPTH] \w'\\*[$PREFIX\\n[#DEPTH]]I\\*[$SEPARATOR\\n[#DEPTH]]\0' +. \} +. if '\\*[$ROMAN_WIDTH]'2' \{\ +. ds $ROMAN_WIDTH\\n[#DEPTH] 2 +. nr #LIST_INDENT\\n[#DEPTH] \w'\\*[$PREFIX\\n[#DEPTH]]II\\*[$SEPARATOR\\n[#DEPTH]]\0' +. \} +. if '\\*[$ROMAN_WIDTH]'3' \{\ +. ds $ROMAN_WIDTH\\n[#DEPTH] 3 +. nr #LIST_INDENT\\n[#DEPTH] \w'\\*[$PREFIX\\n[#DEPTH]]III\\*[$SEPARATOR\\n[#DEPTH]]\0' +. \} +. if '\\*[$ROMAN_WIDTH]'4' \{\ +. ds $ROMAN_WIDTH\\n[#DEPTH] 4 +. nr #LIST_INDENT\\n[#DEPTH] \w'\\*[$PREFIX\\n[#DEPTH]]IV\\*[$SEPARATOR\\n[#DEPTH]]\0' +. \} +. if '\\*[$ROMAN_WIDTH]'5' \{\ +. ds $ROMAN_WIDTH\\n[#DEPTH] 5 +. nr #LIST_INDENT\\n[#DEPTH] \w'\\*[$PREFIX\\n[#DEPTH]]IV\\*[$SEPARATOR\\n[#DEPTH]]\0' +. \} +. if '\\*[$ROMAN_WIDTH]'6' \{\ +. ds $ROMAN_WIDTH\\n[#DEPTH] 6 +. nr #LIST_INDENT\\n[#DEPTH] \w'\\*[$PREFIX\\n[#DEPTH]]IV\\*[$SEPARATOR\\n[#DEPTH]]\0' +. \} +. if '\\*[$ROMAN_WIDTH]'7' \{\ +. ds $ROMAN_WIDTH\\n[#DEPTH] 7 +. nr #LIST_INDENT\\n[#DEPTH] \w'\\*[$PREFIX\\n[#DEPTH]]VII\\*[$SEPARATOR\\n[#DEPTH]]\0' +. \} +. if '\\*[$ROMAN_WIDTH]'8' \{\ +. ds $ROMAN_WIDTH\\n[#DEPTH] 8 +. nr #LIST_INDENT\\n[#DEPTH] \w'\\*[$PREFIX\\n[#DEPTH]]VIII\\*[$SEPARATOR\\n[#DEPTH]]\0' +. \} +. if '\\*[$ROMAN_WIDTH]'9' \{\ +. ds $ROMAN_WIDTH\\n[#DEPTH] 9 +. nr #LIST_INDENT\\n[#DEPTH] \w'\\*[$PREFIX\\n[#DEPTH]]VIII\\*[$SEPARATOR\\n[#DEPTH]]\0' +. \} +. if '\\*[$ROMAN_WIDTH]'10' \{\ +. ds $ROMAN_WIDTH\\n[#DEPTH] 10 +. nr #LIST_INDENT\\n[#DEPTH] \w'\\*[$PREFIX\\n[#DEPTH]]VIII\\*[$SEPARATOR\\n[#DEPTH]]\0' +. \} +. if '\\*[$ROMAN_WIDTH]'11' \{\ +. ds $ROMAN_WIDTH\\n[#DEPTH] 11 +. nr #LIST_INDENT\\n[#DEPTH] \w'\\*[$PREFIX\\n[#DEPTH]]VIII\\*[$SEPARATOR\\n[#DEPTH]]\0' +. \} +. if '\\*[$ROMAN_WIDTH]'12' \{\ +. ds $ROMAN_WIDTH\\n[#DEPTH] 12 +. nr #LIST_INDENT\\n[#DEPTH] \w'\\*[$PREFIX\\n[#DEPTH]]VIII\\*[$SEPARATOR\\n[#DEPTH]]\0' +. \} +. if '\\*[$ROMAN_WIDTH]'13' \{\ +. ds $ROMAN_WIDTH\\n[#DEPTH] 13 +. nr #LIST_INDENT\\n[#DEPTH] \w'\\*[$PREFIX\\n[#DEPTH]]XIII\\*[$SEPARATOR\\n[#DEPTH]]\0' +. \} +. if '\\*[$ROMAN_WIDTH]'14' \{\ +. ds $ROMAN_WIDTH\\n[#DEPTH] 14 +. nr #LIST_INDENT\\n[#DEPTH] \w'\\*[$PREFIX\\n[#DEPTH]]XIV\\*[$SEPARATOR\\n[#DEPTH]]\0' +. \} +. if '\\*[$ROMAN_WIDTH]'15' \{\ +. ds $ROMAN_WIDTH\\n[#DEPTH] 15 +. nr #LIST_INDENT\\n[#DEPTH] \w'\\*[$PREFIX\\n[#DEPTH]]XIV\\*[$SEPARATOR\\n[#DEPTH]]\0' +. \} +. if '\\*[$ROMAN_WIDTH]'16' \{\ +. ds $ROMAN_WIDTH\\n[#DEPTH] 16 +. nr #LIST_INDENT\\n[#DEPTH] \w'\\*[$PREFIX\\n[#DEPTH]]XIV\\*[$SEPARATOR\\n[#DEPTH]]\0' +. \} +. if '\\*[$ROMAN_WIDTH]'17' \{\ +. ds $ROMAN_WIDTH\\n[#DEPTH] 17 +. nr #LIST_INDENT\\n[#DEPTH] \w'\\*[$PREFIX\\n[#DEPTH]]XVII\\*[$SEPARATOR\\n[#DEPTH]]\0' +. \} +. if '\\*[$ROMAN_WIDTH]'18' \{\ +. ds $ROMAN_WIDTH\\n[#DEPTH] 18 +. nr #LIST_INDENT\\n[#DEPTH] \w'\\*[$PREFIX\\n[#DEPTH]]XVIII\\*[$SEPARATOR\\n[#DEPTH]]\0' +. \} +. if '\\*[$ROMAN_WIDTH]'19' \{\ +. ds $ROMAN_WIDTH\\n[#DEPTH] 19 +. nr #LIST_INDENT\\n[#DEPTH] \w'\\*[$PREFIX\\n[#DEPTH]]XVIII\\*[$SEPARATOR\\n[#DEPTH]]\0' +. \} +. if '\\*[$ROMAN_WIDTH]'20' \{\ +. ds $ROMAN_WIDTH\\n[#DEPTH] 20 +. nr #LIST_INDENT\\n[#DEPTH] \w'\\*[$PREFIX\\n[#DEPTH]]XVIII\\*[$SEPARATOR\\n[#DEPTH]]\0' +. \} +. \} +.END +\# +\# SHIFT LIST +\# ---------- +\# *Arguments: +\# +\# *Function: +\# Adds the value of the arg to the current list's indent. +\# *Notes: +\# Requires a unit of measure. +\# +.MAC SHIFT_LIST END +. ie '\\*[$ENUMERATOR_TYPE\\n[#DEPTH]]'roman' \{\ +. nr #SHIFT_LIST\\n[#DEPTH] (\\$1) +. nr #LIST_INDENT\\n[#DEPTH] \\n(.i+\\n[#L_INDENT]+\\n[#SHIFT_LIST\\n[#DEPTH]] +. nr #L_INDENT \\n[#LIST_INDENT\\n[#DEPTH]] +. \} +. el \{\ +. nr #LIST_INDENT\\n[#DEPTH] \\n[#L_INDENT]+(\\$1) +. nr #L_INDENT \\n[#LIST_INDENT\\n[#DEPTH]] +. \} +.END +\# +\# +\# PAD LIST DIGITS +\# --------------- +\# *Arguments: +\# [ LEFT ] +\# *Function: +\# Adds a figure space to a list's hanging and left indent. If +\# LEFT is given, sets reg. #PAD_LIST_DIGITS to 1 for use in ITEM. +\# +.MAC PAD_LIST_DIGITS END +. if '\\g[#ENUMERATOR\\n[#DEPTH]]'0' \{\ +. nr #LIST_INDENT\\n[#DEPTH] +\\w'\\0' +. nr #L_INDENT \\n[#LIST_INDENT\\n[#DEPTH]]+\\n[#LIST_INDENT\\n-[#DEPTH]] +. nr #HL_INDENT\\n+[#DEPTH] +\\w'\\n[#ENUMERATOR\\n[#DEPTH]]' +. if '\\$1'LEFT' \{ .nr #PAD_LIST_DIGITS\\n[#DEPTH] 1 \} +. \} +. if '\\g[#ENUMERATOR\\n[#DEPTH]]'i' \{\ +. if '\\$1'LEFT' \{ .nr #PAD_LIST_DIGITS\\n[#DEPTH] 1 \} +. \} +. if '\\g[#ENUMERATOR\\n[#DEPTH]]'I' \{\ +. if '\\$1'LEFT' \{ .nr #PAD_LIST_DIGITS\\n[#DEPTH] 1 \} +. \} +.END +\# +\# +\# RESET LIST +\# ---------- +\# *Arguments: +\# none +\# *Function: +\# Resets register enumerators to 1 or a. +\# +.MAC RESET_LIST END +. ie '\\$1'' \{ .nr #ENUMERATOR\\n[#DEPTH] 0 1 \} +. el \{ .nr #ENUMERATOR\\n[#DEPTH] \\$1-1 1 \} +.END +\# +\# +\# QUIT LISTS +\# ---------- +\# *Arguments: +\# none +\# *Function: +\# Exits lists cleanly and restores any indents that were in +\# effect prior to LIST. +\# +.MAC QUIT_LISTS END +. IQ CLEAR +. nr #HL_INDENT \\n[#STORED_HL_INDENT] +. nr #T_INDENT \\n[#STORED_T_INDENT] +. rr #STORED_HL_INDENT +. if \\n[#RESTORE_PREV_INDENT]=1 \{\ +. nr #L_INDENT \\n[#STORED_L_INDENT] +. IL +. rr #STORED_L_INDENT +. \} +. if \\n[#RESTORE_PREV_INDENT]=2 \{\ +. nr #BL_INDENT \\n[#STORED_BL_INDENT] +. nr #BR_INDENT \\n[#STORED_BR_INDENT] +. LL \\n[#ORIG_L_LENGTH]u +. IB +. rr #STORED_BL_INDENT +. rr #STORED_BR_INDENT +. \} +. if \\n[#RESTORE_PREV_INDENT]=3 \{\ +. nr #R_INDENT \\n[#STORED_R_INDENT] +. LL \\n[#ORIG_L_LENGTH]u +. IR +. rr #STORED_R_INDENT +. \} +. if \\n[#RESTORE_PREV_INDENT]=4 \{\ +. nr #R_INDENT \\n[#STORED_R_INDENT] +. nr #L_INDENT \\n[#STORED_L_INDENT] +. LL \\n[#ORIG_L_LENGTH]u +. IR +. IL +. rr #STORED_R_INDENT +. rr #STORED_L_INDENT +. \} +.\" Clean up after exiting last depth of list +. nr #REMOVE 0 1 +. while \\n+[#REMOVE]<=\\n[#TOTAL_LISTS] \{\ +. rr #LIST_INDENT\\n[#REMOVE] +. rr #ENUMERATOR\\n[#REMOVE] +. rm $ENUMERATOR\\n[#REMOVE] +. rr #SEPARATOR\\n[#REMOVE] +. rm $ENUMERATOR_TYPE\\n[#REMOVE] +. rr #PAD_LIST_DIGITS\\n[#REMOVE] +.\} +. rr #REMOVE +. rr #TOTAL_LISTS +. rr #QUIT +. rr #DEPTH +. rr #NEXT_DEPTH_BACK +. rr #RESTORE_PREV_INDENT +. rr #ORIG_L_LENGTH +. rr #CURRENT_L_LENGTH +.END +\# +\# +\# SET LIST INDENT +\# --------------- +\# *Arguments: +\# none +\# *Function: +\# Restores indent of prev. list in nested lists. Also sets the +\# #QUIT register if an invocation of LIST OFF applies to the first +\# level of list. +\# +.MAC SET_LIST_INDENT END +. nr #NEXT_DEPTH_BACK \\n[#DEPTH]-1 +. if \\n[#NEXT_DEPTH_BACK]=0 \{\ +. nr #QUIT 1 +. return +. \} +. nr #L_INDENT -\\n[#LIST_INDENT\\n[#DEPTH]] +. nr #HL_INDENT \\n[#HL_INDENT\\n-[#DEPTH]] +.END +\# +\# ==================================================================== +\# +\# +++DOCUMENT PROCESSING MISC AND SUPPORT MACROS+++ +\# +\# COLLATE +\# ------- +\# *Arguments: +\# +\# *Function: +\# Turns headers off (if on) and saves header state, sets register +\# #COLLATE to 1 (toggle), and breaks to a new page. +\# *Notes: +\# COLLATE exists primarily to allow putting multiple chapters in +\# a single file, although it can be used for any document type. After +\# COLLATE, any of the macros that normally precede START may be +\# used, and should behave as expected. +\# +\# N.B.--the START macro *must* be used after COLLATE (and any other +\# macros that alter mom's behaviour). +\# +.MAC COLLATE END +. nr #COLLATE 1 +. nr #HEADER_STATE \\n[#HEADERS_ON] +. HEADERS OFF +. if \\n[#PAGE_NUM_V_POS]=1 \{\ +. nr #PAGINATION_STATE \\n[#PAGINATE] +. PAGINATION OFF +. \} +. IQ CLEAR +. TQ +.\" Collect first doc's title for TOC +. if \\n[#COLLATED_DOC]=0 \{\ +. ie \\n[#USER_SET_TITLE_ITEM] \{\ +. ds $FIRST_DOC_TITLE \\*[$USER_SET_TITLE_ITEM]\\| +. rr #USER_SET_TITLE_ITEM +. rm $USER_SET_TITLE_ITEM +. \} +. el \{\ +. ie \\n[#DOC_TYPE]=2 \{\ +. ie '\\*[$CHAPTER_TITLE]'' \{\ +. ds $FIRST_DOC_TITLE \\*[$CHAPTER_STRING] \\*[$CHAPTER]\\| +. \} +. el \{\ +. ie '\\*[$CHAPTER]'' \{\ +. ds $FIRST_DOC_TITLE \\*[$CHAPTER_TITLE]\\| +. \} +. el \{\ +. ds $FIRST_DOC_TITLE \\*[$CHAPTER_STRING] \\*[$CHAPTER]: \\*[$CHAPTER_TITLE]\\| +. \} +. \} +. \} +. el \{\ +. ds $FIRST_DOC_TITLE \\*[$TITLE]\\| +. \} +. \} +. if \\n[#TOC_AUTHORS]=1 \{\ +. ie '\\*[$TOC_AUTHORS]'' \{\ +. as $FIRST_DOC_TITLE /\\|\\*[$AUTHOR_1]\\| +. \} +. el \{\ +. as $FIRST_DOC_TITLE /\\|\\*[$TOC_AUTHORS]\\| +. rm $TOC_AUTHORS +. \} +. \} +. nr #COLLATED_DOC 1 +. \} +.\" End title collection for TOC +. LL \\n[#DOC_L_LENGTH]u +. QUAD $DOC_QUAD +. nr #SAVED_DOC_LEAD \\n[#DOC_LEAD] +. LS \\n[#DOC_LEAD]u +\*[SLANTX] +\*[CONDX] +\*[EXTX] +' NEWPAGE +. if \\n[#DEFER_PAGINATION] \{ .PAGINATE \} +. if !'\\*[$RESTORE_PAGENUM_STYLE]'' \{\ +. PAGENUM_STYLE \\*[$RESTORE_PAGENUM_STYLE] +. rm $RESTORE_PAGENUM_STYLE +. \} +. rm $EN_TITLE +. rr #PAGENUM_STYLE_SET +.END +\# +\# +\# NUMBER_LINES +\# ------------ +\# *Arguments: +\# [ [ ] ] +\# or +\# | RESUME +\# *Function: +\# Begin, suspend/turn off, or resume numbering of output lines. +\# +.MAC NUMBER_LINES END +. br +. if '\\n(.z'EPI_TEXT' \{ .return \} +. if '\\$1'' \{\ +. tm1 "[mom]: NUMBER_LINES at line \\n(.c has no argument. +. tm1 " Most likely, you have forgotten to give it a starting line number. +. ab Aborting on NUMBER_LINES. +. \} +. if !\\n[#LINENUMBERS]=2 \{ .nr #LINENUMBERS 1 \} +.\" Test whether the first arg is a digit. +. if \B'\\$1' \{\ +. nr #LN \\$1 +. ds $LN_NUM \\$1 +. if !'\\n(.z'' \{ .nr #RESTORE_LN_NUM 1 \} +. ie '\\$2'' \{\ +. if '\\*[$LN_INC]'' .ds $LN_INC 1 +. \} +. el .ds $LN_INC \\$2 +. ie '\\$3'' \{\ +. if '\\*[$LN_GUTTER]'' .ds $LN_GUTTER 2 +. \} +. el .ds $LN_GUTTER \\$3 +. \} +. ie !\\n[#LN] \{\ +.\" In other words, the first arg was not a digit. +. rr #LN +. ie '\\$1'RESUME' \{\ +. nm +0 +. \} +. el \{\ +. nm +. if !\\n[#LINENUMBERS]=2 \{ .rr #LINENUMBERS \} +. \} +. \} +. el \{\ +. nm \\*[$LN_NUM] \\*[$LN_INC] \\*[$LN_GUTTER] -3-\\*[$LN_GUTTER] +. if !'\\n(.z'' \{ .nr #DIVER_LN_OFF 1 \} +. \} +. rr #LN +.END +\# +\# +\# NUMBER QUOTE AND BLOCKQUOTE LINES AS PART OF RUNNING TEXT +\# --------------------------------------------------------- +\# *Argument: +\# | +\# *Function: +\# Sets #(B)QUOTE_LN to 1 if no argument, or a single numeric +\# argument, is given; otherwise, turns (BLOCK)QUOTE linenumbering +\# off. +\# *Notes: +\# #(B)QUOTE is checked for in QUOTE and BLOCKQUOTE. +\# The single numeric argument allows establishing a different gutter from +\# the one used for line numbers in running text. +\# +.MAC NUMBER_QUOTE_LINES END +. ie \\n[#NUM_ARGS]=0 \{ .nr #QUOTE_LN 1 \} +. el \{\ +. ie \B'\\$1' \{\ +. nr #QUOTE_LN 1 +. ds $Q_LN_GUTTER \\$1 +. \} +. el \{\ +. ie '\\$1'SILENT' \{ .nr #SILENT_QUOTE_LN 1 \} +. el \{\ +. rr #QUOTE_LN +. rr #SILENT_QUOTE_LN +. \} +. \} +. \} +.END +\# +\# +.MAC NUMBER_BLOCKQUOTE_LINES END +. ie \\n[#NUM_ARGS]=0 \{ .nr #BQUOTE_LN 1 \} +. el \{\ +. ie \B'\\$1' \{\ +. nr #BQUOTE_LN 1 +. ds $BQ_LN_GUTTER \\$1 +. \} +. el \{\ +. ie '\\$1'SILENT' \{ .nr #SILENT_BQUOTE_LN 1 \} +. el \{\ +. rr #BQUOTE_LN +. rr #SILENT_BQUOTE_LN +. \} +. \} +. \} +.END +\# +\# OUTPUT BLANK PAGES +\# ------------------ +\# *Argument: +\# +\# *Function: +\# Outputs blank pages. +\# *Notes: +\# If recto/verso, each page is recto/verso, even if there's +\# nothing on it. +\# +\# The argument to BLANKPAGE is non-optional. +\# +.MAC BLANKPAGE END +. nr #HOW_MANY \\$1 +. nr #PAGES 0 1 +. while \\n+[#PAGES]<=\\n[#HOW_MANY] \{\ +. if \\n[#HEADERS_ON]=1 \{\ +. nr #HEADERS_WERE_ON 1 +. HEADERS OFF +. \} +. if \\n[#PAGE_NUM_V_POS]=1 \{\ +. if \\n[#PAGINATE]=1 \{ .nr #PAGINATE_WAS_ON 1 \} +. PAGINATION OFF +. \} +. NEWPAGE +. PRINT \& +. if \\n[#FOOTERS_ON]=1 \{\ +. nr #FOOTERS_WERE_ON 1 +. FOOTERS OFF +. \} +. if \\n[#PAGE_NUM_V_POS]=2 \{\ +. if \\n[#PAGINATE]=1 \{ .nr #PAGINATE_WAS_ON 1 \} +. PAGINATION OFF +. \} +. if \\n[#HEADERS_WERE_ON] \{ .HEADERS \} +. if \\n[#PAGE_NUM_V_POS]=1 \{\ +. if \\n[#PAGINATE_WAS_ON] \{ .PAGINATE \} +. \} +.\} +. NEWPAGE +. if \\n[#FOOTERS_WERE_ON] \{ .FOOTERS \} +. if \\n[#PAGE_NUM_V_POS]=2 \{\ +. if \\n[#PAGINATE_WAS_ON] \{ .PAGINATE \} +. \} +. rr #HEADERS_WERE_ON +. rr #FOOTERS_WERE_ON +. rr #PAGINATE_WAS_ON +.END +\# +\# +\# SET TRAPS FOR HEADERS/FOOTERS/FOOTNOTES +\# --------------------------------------- +\# *Arguments: +\# +\# *Function: +\# Sets header/footer/footnotes/etc... traps. +\# +\# Calculates the number of lines that actually fit on a +\# page based on #B_MARGIN and resets page bottom trap to coincide +\# with the depth of that number of lines, or, if #ADJ_DOC_LEAD=1, +\# adjusts #DOC_LEAD so that the last line of text on a page falls +\# exactly on #B_MARGIN. +\# +.MAC TRAPS END +.\" Remove all header/footer traps +. if !\\n[#NO_TRAP_RESET] \{\ +. ch DO_T_MARGIN +. ch DO_B_MARGIN +. ch HEADER +. ch FOOTER +. ch FN_OVERFLOW_TRAP +.\" Plant header trap +. wh 0 HEADER +. \} +.\" Adjust lead so last line of text falls on B_MARGIN,... +. ie \\n[#ADJ_DOC_LEAD]=1 \{\ +. nr #LINES_PER_PAGE 0 1 +. nr #DOC_LEAD_ADJ 0 1 +. nr #DEPTH_TO_B_MARGIN \\n[#PAGE_LENGTH]-\\n[#ORIGINAL_B_MARGIN]-1v +.\" Get the number of unadjusted lines that fit on the page; always a +.\" bit short of the bottom margin +. while \\n[#T_MARGIN]+(\\n[#DOC_LEAD]*\\n+[#LINES_PER_PAGE])<\\n[#DEPTH_TO_B_MARGIN] \{\ +. +.\} +. nr #LINES_PER_PAGE -1 +.\" Add machine units, 1 at a time, increasing the leading until the +.\" new leading fills the page properly +. while \\n[#T_MARGIN]+(\\n[#DOC_LEAD]+\\n+[#DOC_LEAD_ADJ]*\\n[#LINES_PER_PAGE])<\\n[#DEPTH_TO_B_MARGIN] \{\ +. +.\} +. DOC_LEAD \\n[#DOC_LEAD]u+\\n[#DOC_LEAD_ADJ]u +.\" The "visual" bottom margin is what \n(nl would report on the +.\" last line before the FOOTER trap is sprung +. nr #VISUAL_B_MARGIN \\n[#T_MARGIN]+(\\n[#LINES_PER_PAGE]*\\n[#DOC_LEAD]) +.\" Get the difference between #B_MARGIN and #VISUAL_B_MARGIN +. nr #FOOTER_DIFF (\\n[#PAGE_LENGTH]-\\n[#B_MARGIN])-\\n[#VISUAL_B_MARGIN] +.\" Set #B_MARGIN to 1 machine unit lower on the page than #VISUAL_B_MARGIN +. nr #B_MARGIN \\n[#B_MARGIN]+(\\n[#FOOTER_DIFF]-1) +.\" Set the FN_OVERFLOW_TRAP position +. nr #FN_OVERFLOW_TRAP_POS \\n[#B_MARGIN]u-\\n[#FN_LEAD] +. if \\n[#PRINT_STYLE]=1 .nr #FN_OVERFLOW_TRAP_POS \\n[#ORIGINAL_B_MARGIN]u +. \} +.\" ...or calculate new B_MARGIN based on # of lines (at #DOC_LEAD) that fit +.\" on the page. +. el \{\ +. nr #LINES_PER_PAGE 0 1 +. nr #DEPTH_TO_B_MARGIN \\n[#PAGE_LENGTH]-\\n[#B_MARGIN]-1v +. while \\n[#T_MARGIN]+(\\n[#DOC_LEAD]*\\n+[#LINES_PER_PAGE])<\\n[#DEPTH_TO_B_MARGIN] \{\ +. +.\} +. nr #VISUAL_B_MARGIN \\n[#T_MARGIN]+(\\n[#LINES_PER_PAGE]*\\n[#DOC_LEAD]-1v) +. nr #FOOTER_DIFF (\\n[#PAGE_LENGTH]-\\n[#B_MARGIN])-\\n[#VISUAL_B_MARGIN] +. nr #B_MARGIN \\n[#B_MARGIN]+(\\n[#FOOTER_DIFF]-1) +. nr #FN_OVERFLOW_TRAP_POS \\n[#B_MARGIN]u-\\n[#FN_LEAD] +. \} +.\" Set footer and footnote overflow traps +. if !\\n[#NO_TRAP_RESET] \{\ +. nr #FN_COUNT 0 1 +. nr #SPACE_REMAINING 0 +. nr #FN_DEPTH 0 +. nr #VARIABLE_FOOTER_POS 0-\\n[#B_MARGIN]u +. wh 20i FOOTER +. wh -(\\n[#FN_OVERFLOW_TRAP_POS]u) FN_OVERFLOW_TRAP +. ch FOOTER -\\n[#B_MARGIN]u +. \} +.END +\# +\# +\# CHECK INDENT +\# ------------ +\# *Arguments: +\# +\# *Function: +\# Adds left, right, or both indent values to document elements +\# like heads and subheads that are processed in environments. +\# +.MAC CHECK_INDENT END +. if \\n[#INDENT_LEFT_ACTIVE] \{\ +. in \\n[#L_INDENT]u +. if \\n[#QUOTE] \{\ +. in -\\n[#L_INDENT]u \"Because you added an indent in 2nd line of macro +. ll -\\n[#L_INDENT]u +. ta \\n(.lu +. \} +. if \\n[#EPIGRAPH] \{\ +. in -\\n[#L_INDENT]u +. ll -\\n[#L_INDENT]u +. ta \\n(.lu +. \} +. \} +. if \\n[#INDENT_RIGHT_ACTIVE] \{\ +. ll -\\n[#R_INDENT]u +. ta \\n(.lu +. \} +. if \\n[#INDENT_BOTH_ACTIVE] \{\ +. in \\n[#BL_INDENT]u +. ll -\\n[#BR_INDENT]u +. ta \\n(.lu +. if \\n[#QUOTE] \{\ +. in -\\n[#BL_INDENT]u +. ie \\n[#BR_INDENT]=\\n[#BL_INDENT] \{\ +. ll -\\n[#BR_INDENT]u +. ta \\n(.lu +. \} +. el \{\ +. ll -(\\n[#BR_INDENT]u/2u) +. ta \\n(.lu +. \} +. \} +. if \\n[#EPIGRAPH] \{\ +. in -\\n[#BL_INDENT]u +. ie \\n[#BR_INDENT]=\\n[#BL_INDENT] \{\ +. ll -\\n[#BR_INDENT]u +. ta \\n(.lu +. \} +. el \{\ +. ll -(\\n[#BR_INDENT]u/2u) +. ta \\n(.lu +. \} +. \} +. \} +.END +\# +\# +\# REMOVE INDENT +\# ------------- +\# *Arguments: +\# +\# *Function: +\# Removes left, right, or both indent values from document elements +\# like heads and subheads that are processed in environments. +\# +.MAC REMOVE_INDENT END +. in 0 +. ll \\n[#L_LENGTH]u +. ta \\n(.lu +.END +\# +\# +\# This .em (for all DOC_TYPEs except 4 [LETTER]) ensures that +\# deferred footnotes that happen on the 2nd to last page get +\# output. +\# +.MAC TERMINATE END +. ie \\n[#FN_DEPTH] \{\ +. ie \\n[#FN_DEFER] \{\ +. br +. nr #TERMINATE 1 +. FOOTNOTE +. nf +. FOOTNOTE OFF +. \} +. el \{\ +. br +. ch FN_OVERFLOW_TRAP +. DO_B_MARGIN +. \} +. \} +. el \{\ +. br +. ch FN_OVERFLOW_TRAP +. DO_B_MARGIN +. \} +.END +\# +\# END MACRO FOR LETTERS +\# --------------------- +\# *Arguments: +\# none +\# *Function: +\# The .em macro executed at the end of letters. Turns footers +\# and pagination off, terminates and outputs diversion CLOSING +\# (indented with the author's name underneath). +\# +.MAC ALL_DONE END +. br +. FOOTERS OFF +. PAGINATION OFF +. if \\n[#DOC_TYPE]=4 \{\ +. br +. if !'\\n(.z'' \{ .di \} +. IQ CLEAR +. TQ +. TAB_SET 1 \\n[#DOC_L_LENGTH]u/2u \\n[#DOC_L_LENGTH]u/2u LEFT +. ALD \\n[#DOC_LEAD]u*2u +. TAB 1 +. if \\n[#CLOSING] \{\ +. nf +. CLOSING +. \} +. ALD \\n[#DOC_LEAD]u*3u +. PRINT \\*[$AUTHOR_1] +. \} +. DO_FOOTER +.END +\# +\# Set up a default papersize of US letter +\# +.PAPER LETTER +\# +\# ==================================================================== +\# +\# +++DOCUMENT PROCESSING ALIASES+++ +\# +\# Aliases to make life easier for users: synonyms, short forms +\# and alternate spellings. +\# +.ALIAS BREAK_BLOCKQUOTE BREAK_QUOTE +.ALIAS BREAK_CITATION BREAK_QUOTE +.ALIAS BREAK_CITE BREAK_QUOTE +.ALIAS BLOCKQUOTE_INDENT QUOTE_INDENT +.ALIAS CITATION BLOCKQUOTE +.ALIAS CITATION_FAMILY BLOCKQUOTE_FAMILY +.ALIAS CITATION_FONT BLOCKQUOTE_FONT +.ALIAS CITATION_SIZE BLOCKQUOTE_SIZE +.ALIAS CITATION_COLOR BLOCKQUOTE_COLOR +.ALIAS CITATION_QUAD BLOCKQUOTE_QUAD +.ALIAS CITE BLOCKQUOTE +.ALIAS CITE_FAMILY BLOCKQUOTE_FAMILY +.ALIAS CITE_FONT BLOCKQUOTE_FONT +.ALIAS CITE_SIZE BLOCKQUOTE_SIZE +.ALIAS CITE_COLOR BLOCKQUOTE_COLOR +.ALIAS CITE_QUAD BLOCKQUOTE_QUAD +.ALIAS DOC_R_MARGIN DOC_RIGHT_MARGIN +.ALIAS DOC_L_MARGIN DOC_LEFT_MARGIN +.ALIAS DOC_L_LENGTH DOC_LINE_LENGTH +.ALIAS DOC_RMARGIN DOC_RIGHT_MARGIN +.ALIAS DOC_LMARGIN DOC_LEFT_MARGIN +.ALIAS DOC_LLENGTH DOC_LINE_LENGTH +.ALIAS DOC_FAM DOC_FAMILY +.ALIAS DOC_LS DOC_LEAD +.ALIAS DOC_PS DOC_PT_SIZE +.ALIAS FILL QUAD +.ALIAS PAGENUM PAGENUMBER +.ALIAS PAGINATION PAGINATE +.ALIAS PP_FT PP_FONT +.ALIAS REF_INDENT INDENT_REFS +.ALIAS TOC_PS TOC_PT_SIZE +\# +\# HEADER and FOOTER macros +\# ------------------------ +\# Because the type-style of headers and footers are managed +\# identically, and the type-style macros (_) all +\# require the correct name of the calling macro, it's necessary +\# to create HEADER_ and FOOTER_ macros here. They're basically +\# "aliases" of HDRFTR_, but required because you can't alias an +\# alias. +\# +.MAC FOOTER_CENTER_COLOR END +. HDRFTR_CENTER_COLOR \\$1 +.END +\# +.MAC FOOTER_CENTER_COLOUR END +. HDRFTR_CENTER_COLOR \\$1 +.END +\# +.MAC FOOTER_CENTER_FAM END +. HDRFTR_CENTER_FAMILY \\$1 +.END +\# +.MAC FOOTER_CENTER_FAMILY END +. HDRFTR_CENTER_FAMILY \\$1 +.END +\# +.MAC FOOTER_CENTER_FONT END +. HDRFTR_CENTER_FONT \\$1 +.END +\# +.MAC FOOTER_CENTER_FT END +. HDRFTR_CENTER_FONT \\$1 +.END +\# +.MAC FOOTER_CENTER_PS END +. HDRFTR_CENTER_SIZE \\$1 +.END +\# +.MAC FOOTER_CENTER_SIZE END +. HDRFTR_CENTER_SIZE \\$1 +.END +\# +.MAC FOOTER_CENTRE_CAPS END +. HDRFTR_CENTER_CAPS \\$1 +.END +\# +.MAC FOOTER_CENTRE_COLOR END +. HDRFTR_CENTRE_COLOR \\$1 +.END +\# +.MAC FOOTER_CENTRE_COLOUR END +. HDRFTR_CENTRE_COLOR \\$1 +.END +\# +.MAC FOOTER_CENTRE_FAM END +. HDRFTR_CENTER_FAMILY \\$1 +.END +\# +.MAC FOOTER_CENTRE_FAMILY END +. HDRFTR_CENTER_FAMILY \\$1 +.END +\# +.MAC FOOTER_CENTRE_FONT END +. HDRFTR_CENTER_FONT \\$1 +.END +\# +.MAC FOOTER_CENTRE_FT END +. HDRFTR_CENTER_FONT \\$1 +.END +\# +.MAC FOOTER_CENTRE_PS END +. HDRFTR_CENTER_SIZE \\$1 +.END +\# +.MAC FOOTER_CENTRE_SIZE END +. HDRFTR_CENTER_SIZE \\$1 +.END +\# +.MAC FOOTER_COLOR END +. HDRFTR_COLOR \\$1 +.END +\# +.MAC FOOTER_COLOUR END +. HDRFTR_COLOR \\$1 +.END +\# +.MAC FOOTER_FAM END +. HDRFTR_FAMILY \\$1 +.END +\# +.MAC FOOTER_FAMILY END +. HDRFTR_FAMILY \\$1 +.END +\# +.MAC FOOTER_LEFT_COLOR END +. HDRFTR_LEFT_COLOR \\$1 +.END +\# +.MAC FOOTER_LEFT_COLOUR END +. HDRFTR_LEFT_COLOR \\$1 +.END +\# +.MAC FOOTER_LEFT_FAM END +. HDRFTR_LEFT_FAMILY \\$1 +.END +\# +.MAC FOOTER_LEFT_FAMILY END +. HDRFTR_LEFT_FAMILY \\$1 +.END +\# +.MAC FOOTER_LEFT_FONT END +. HDRFTR_LEFT_FONT \\$1 +.END +\# +.MAC FOOTER_LEFT_FT END +. HDRFTR_LEFT_FONT \\$1 +.END +\# +.MAC FOOTER_LEFT_PS END +. HDRFTR_LEFT_SIZE \\$1 +.END +\# +.MAC FOOTER_LEFT_SIZE END +. HDRFTR_LEFT_SIZE \\$1 +.END +\# +.MAC FOOTER_RIGHT_COLOR END +. HDRFTR_RIGHT_COLOR \\$1 +.END +\# +.MAC FOOTER_RIGHT_COLOUR END +. HDRFTR_RIGHT_COLOR \\$1 +.END +\# +.MAC FOOTER_RIGHT_FAM END +. HDRFTR_RIGHT_FAMILY \\$1 +.END +\# +.MAC FOOTER_RIGHT_FAMILY END +. HDRFTR_RIGHT_FAMILY \\$1 +.END +\# +.MAC FOOTER_RIGHT_FONT END +. HDRFTR_RIGHT_FONT \\$1 +.END +\# +.MAC FOOTER_RIGHT_FT END +. HDRFTR_RIGHT_FONT \\$1 +.END +\# +.MAC FOOTER_RIGHT_PS END +. HDRFTR_RIGHT_SIZE \\$1 +.END +\# +.MAC FOOTER_RIGHT_SIZE END +. HDRFTR_RIGHT_SIZE \\$1 +.END +\# +.MAC FOOTER_RULE_COLOR END +. HDRFTR_RULE_COLOR \\$1 +.END +\# +.MAC FOOTER_SIZE END +. HDRFTR_SIZE \\$1 +.END +\# +.MAC HEADER_CENTER_COLOR END +. HDRFTR_CENTER_COLOR \\$1 +.END +\# +.MAC HEADER_CENTER_COLOUR END +. HDRFTR_CENTER_COLOR \\$1 +.END +\# +.MAC HEADER_CENTER_FAM END +. HDRFTR_CENTER_FAMILY \\$1 +.END +\# +.MAC HEADER_CENTER_FAMILY END +. HDRFTR_CENTER_FAMILY \\$1 +.END +\# +.MAC HEADER_CENTER_FONT END +. HDRFTR_CENTER_FONT \\$1 +.END \# -.MAC ITEM END -. KERN OFF -. IL -. ll \\n[#CURRENT_L_LENGTH]u \" Set ll again because IL turns IB off. -. TRAP OFF -. HI \\n[#HL_INDENT\\n[#DEPTH]]u -. ie '\\*[$ENUMERATOR_TYPE\\n[#DEPTH]]'register' \{\ -. ie '\\g[#ENUMERATOR\\n[#DEPTH]]'0' \{\ -. ie \\n[#PAD_LIST_DIGITS\\n[#DEPTH]]=1 \{\ -. ie \\n[#ENUMERATOR\\n[#DEPTH]]<9 \{\ -. PRINT \\0\\n+[#ENUMERATOR\\n[#DEPTH]]\\*[$SEPARATOR\\n[#DEPTH]] -. \} -. el \{\ -. PRINT \\n+[#ENUMERATOR\\n[#DEPTH]]\\*[$SEPARATOR\\n[#DEPTH]] -. \} -. \} -. el \{\ -. PRINT \\n+[#ENUMERATOR\\n[#DEPTH]]\\*[$SEPARATOR\\n[#DEPTH]] -. \} -. \} -. el \{\ -. PRINT \\n+[#ENUMERATOR\\n[#DEPTH]]\\*[$SEPARATOR\\n[#DEPTH]] -. \} -. \} -. el \{\ -. PRINT \\*[$ENUMERATOR\\n[#DEPTH]]\\*[$SEPARATOR\\n[#DEPTH]] -. \} -. EL -. TRAP -. KERN +.MAC HEADER_CENTER_FT END +. HDRFTR_CENTER_FONT \\$1 .END \# +.MAC HEADER_CENTER_PS END +. HDRFTR_CENTER_SIZE \\$1 +.END \# -\# SHIFT LIST -\# --------- -\# *Arguments: -\# -\# *Function: -\# Adds the value of the arg to the current list's indent. -\# *Notes: -\# Requires a unit of measure. +.MAC HEADER_CENTER_SIZE END +. HDRFTR_CENTER_SIZE \\$1 +.END \# -.MAC SHIFT_LIST END -. nr #LIST_INDENT\\n[#DEPTH] \\n[#L_INDENT]+(\\$1) -. nr #L_INDENT \\n[#LIST_INDENT\\n[#DEPTH]] +.MAC HEADER_CENTRE_COLOR END +. HDRFTR_CENTRE_COLOR \\$1 .END \# +.MAC HEADER_CENTRE_COLOUR END +. HDRFTR_CENTRE_COLOR \\$1 +.END \# -\# PAD LIST DIGITS -\# --------------- -\# *Arguments: -\# [ LEFT ] -\# *Function: -\# Adds a figure space to a list's hanging and left indent. If -\# LEFT is given, sets reg. #PAD_LIST_DIGITS to 1 for use in ITEM. +.MAC HEADER_CENTRE_FAM END +. HDRFTR_CENTER_FAMILY \\$1 +.END \# -.MAC PAD_LIST_DIGITS END -. if '\\g[#ENUMERATOR\\n[#DEPTH]]'0' \{\ -. nr #LIST_INDENT\\n[#DEPTH] +\\w'\\0' -. nr #L_INDENT \\n[#LIST_INDENT\\n[#DEPTH]]+\\n[#LIST_INDENT\\n-[#DEPTH]] -. nr #HL_INDENT\\n+[#DEPTH] +\\w'\\n[#ENUMERATOR\\n[#DEPTH]]' -. if '\\$1'LEFT' \{ .nr #PAD_LIST_DIGITS\\n[#DEPTH] 1 \} -. \} +.MAC HEADER_CENTRE_FAMILY END +. HDRFTR_CENTER_FAMILY \\$1 .END \# +.MAC HEADER_CENTRE_FONT END +. HDRFTR_CENTER_FONT \\$1 +.END \# -\# RESET LIST -\# ---------- -\# *Arguments: -\# none -\# *Function: -\# Resets register enumerators to 1 or a. +.MAC HEADER_CENTRE_FT END +. HDRFTR_CENTER_FONT \\$1 +.END \# -.MAC RESET_LIST END -. nr #ENUMERATOR\\n[#DEPTH] 0 1 +.MAC HEADER_CENTRE_PS END +. HDRFTR_CENTER_SIZE \\$1 .END \# +.MAC HEADER_CENTRE_SIZE END +. HDRFTR_CENTER_SIZE \\$1 +.END \# -\# QUIT LISTS -\# ---------- -\# *Arguments: -\# none -\# *Function: -\# Exits lists cleanly and restores any indents that were in -\# effect prior to LIST. +.MAC HEADER_COLOR END +. HDRFTR_COLOR \\$1 +.END \# -.MAC QUIT_LISTS END -. IQ CLEAR -. nr #HL_INDENT \\n[#STORED_HL_INDENT] -. nr #T_INDENT \\n[#STORED_T_INDENT] -. rr #STORED_HL_INDENT -. if \\n[#RESTORE_PREV_INDENT]=1 \{\ -. nr #L_INDENT \\n[#STORED_L_INDENT] -. IL -. rr #STORED_L_INDENT -. \} -. if \\n[#RESTORE_PREV_INDENT]=2 \{\ -. nr #BL_INDENT \\n[#STORED_BL_INDENT] -. nr #BR_INDENT \\n[#STORED_BR_INDENT] -. LL \\n[#ORIG_L_LENGTH]u -. IB -. rr #STORED_BL_INDENT -. rr #STORED_BR_INDENT -. \} -. if \\n[#RESTORE_PREV_INDENT]=3 \{\ -. nr #R_INDENT \\n[#STORED_R_INDENT] -. LL \\n[#ORIG_L_LENGTH]u -. IR -. rr #STORED_R_INDENT -. \} -. if \\n[#RESTORE_PREV_INDENT]=4 \{\ -. nr #R_INDENT \\n[#STORED_R_INDENT] -. nr #L_INDENT \\n[#STORED_L_INDENT] -. LL \\n[#ORIG_L_LENGTH]u -. IR -. IL -. rr #STORED_R_INDENT -. rr #STORED_L_INDENT -. \} -.\" Clean up after exiting last depth of list -. nr #REMOVE 0 1 -. while \\n+[#REMOVE]<=\\n[#TOTAL_LISTS] \{\ -. rr #LIST_INDENT\\n[#REMOVE] -. rr #ENUMERATOR\\n[#REMOVE] -. rm $ENUMERATOR\\n[#REMOVE] -. rr #SEPARATOR\\n[#REMOVE] -. rm $ENUMERATOR_TYPE\\n[#REMOVE] -. rr #PAD_LIST_DIGITS\\n[#REMOVE] -. \} -. rr #REMOVE -. rr #TOTAL_LISTS -. rr #QUIT -. rr #DEPTH -. rr #NEXT_DEPTH_BACK -. rr #RESTORE_PREV_INDENT -. rr #ORIG_L_LENGTH -. rr #CURRENT_L_LENGTH +.MAC HEADER_COLOUR END +. HDRFTR_COLOR \\$1 .END \# +.MAC HEADER_FAM END +. HDRFTR_FAMILY \\$1 +.END \# -\# SET LIST INDENT -\# --------------- -\# *Arguments: -\# none -\# *Function: -\# Restores indent of prev. list in nested lists. Also sets the -\# #QUIT register if an invocation of LIST OFF applies to the first -\# level of list. +.MAC HEADER_FAMILY END +. HDRFTR_FAMILY \\$1 +.END \# -.MAC SET_LIST_INDENT END -. nr #NEXT_DEPTH_BACK \\n[#DEPTH]-1 -. if \\n[#NEXT_DEPTH_BACK]=0 \{\ -. nr #QUIT 1 -. return -. \} -. ie \\n[#NEXT_DEPTH_BACK]=1 \{ .nr #L_INDENT \\n[#LIST_INDENT1] \} -. el \{ .nr #L_INDENT -\\n[#LIST_INDENT\\n[#DEPTH]] \} -. nr #HL_INDENT \\n[#HL_INDENT\\n-[#DEPTH]] +.MAC HEADER_LEFT_COLOR END +. HDRFTR_LEFT_COLOR \\$1 .END \# -\# ==================================================================== +.MAC HEADER_LEFT_COLOUR END +. HDRFTR_LEFT_COLOR \\$1 +.END \# -\# +++DOCUMENT PROCESSING MISC AND SUPPORT MACROS+++ +.MAC HEADER_LEFT_FAM END +. HDRFTR_LEFT_FAMILY \\$1 +.END \# -\# COLLATE -\# ------- -\# *Arguments: -\# -\# *Function: -\# Turns headers off (if on) and saves header state, sets register -\# #COLLATE to 1 (toggle), and breaks to a new page. -\# *Notes: -\# COLLATE exists primarily to allow putting multiple chapters in -\# a single file, although it can be used for any document type. After -\# COLLATE, any of the macros that normally precede START may be -\# used, and should behave as expected. +.MAC HEADER_LEFT_FAMILY END +. HDRFTR_LEFT_FAMILY \\$1 +.END \# -\# N.B.--the START macro *must* be used after COLLATE (and any other -\# macros that alter mom's behaviour). +.MAC HEADER_LEFT_FONT END +. HDRFTR_LEFT_FONT \\$1 +.END \# -.MAC COLLATE END -. nr #COLLATE 1 -. nr #HEADER_STATE \\n[#HEADERS_ON] -. HEADERS OFF -. if \\n[#PAGE_NUM_V_POS]=1 \{\ -. nr #PAGINATION_STATE \\n[#PAGINATE] -. PAGINATION OFF -. \} -. IQ CLEAR -. TQ -\# Collect first doc's title for TOC -. if \\n[#COLLATED_DOC]=0 \{\ -. ie \\n[#USER_SET_TITLE_ITEM] \{\ -. ds $FIRST_DOC_TITLE \\*[$USER_SET_TITLE_ITEM]\\| -. rr #USER_SET_TITLE_ITEM -. rm $USER_SET_TITLE_ITEM -. \} -. el \{\ -. ie \\n[#DOC_TYPE]=2 \{\ -. ie '\\*[$CHAPTER_TITLE]'' \{\ -. ds $FIRST_DOC_TITLE \\*[$CHAPTER_STRING] \\*[$CHAPTER]\\| -. \} -. el \{\ -. ie '\\*[$CHAPTER]'' \{\ -. ds $FIRST_DOC_TITLE \\*[$CHAPTER_TITLE]\\| -. \} -. el \{\ -. ds $FIRST_DOC_TITLE \\*[$CHAPTER_STRING] \\*[$CHAPTER]: \\*[$CHAPTER_TITLE]\\| -. \} -. \} -. \} -. el \{\ -. ds $FIRST_DOC_TITLE \\*[$TITLE]\\| -. \} -. \} -. if \\n[#TOC_AUTHORS]=1 \{\ -. ie '\\*[$TOC_AUTHORS]'' \{\ -. as $FIRST_DOC_TITLE /\\|\\*[$AUTHOR_1]\\| -. \} -. el \{\ -. as $FIRST_DOC_TITLE /\\|\\*[$TOC_AUTHORS]\\| -. rm $TOC_AUTHORS -. \} -. \} -. nr #COLLATED_DOC 1 -. \} -\# End title collection for TOC -. LL \\n[#DOC_L_LENGTH]u -. QUAD $DOC_QUAD -. LS \\n[#DOC_LEAD]u -\*[SLANTX] -\*[CONDX] -\*[EXTX] -' NEWPAGE -. if \\n[#DEFER_PAGINATION] \{ .PAGINATE \} -. if !'\\*[$RESTORE_PAGENUM_STYLE]'' \{\ -. PAGENUM_STYLE \\*[$RESTORE_PAGENUM_STYLE] -. rm $RESTORE_PAGENUM_STYLE -. \} -. rm $EN_TITLE -. rr #PAGENUM_STYLE_SET +.MAC HEADER_LEFT_FT END +. HDRFTR_LEFT_FONT \\$1 +.END +\# +.MAC HEADER_LEFT_PS END +. HDRFTR_LEFT_SIZE \\$1 +.END +\# +.MAC HEADER_LEFT_SIZE END +. HDRFTR_LEFT_SIZE \\$1 +.END +\# +.MAC HEADER_RIGHT_COLOR END +. HDRFTR_RIGHT_COLOR \\$1 +.END +\# +.MAC HEADER_RIGHT_COLOUR END +. HDRFTR_RIGHT_COLOR \\$1 +.END +\# +.MAC HEADER_RIGHT_FAM END +. HDRFTR_RIGHT_FAMILY \\$1 +.END +\# +.MAC HEADER_RIGHT_FAMILY END +. HDRFTR_RIGHT_FAMILY \\$1 +.END +\# +.MAC HEADER_RIGHT_FONT END +. HDRFTR_RIGHT_FONT \\$1 +.END +\# +.MAC HEADER_RIGHT_FT END +. HDRFTR_RIGHT_FONT \\$1 +.END +\# +.MAC HEADER_RIGHT_PS END +. HDRFTR_RIGHT_SIZE \\$1 +.END +\# +.MAC HEADER_RIGHT_SIZE END +. HDRFTR_RIGHT_SIZE \\$1 +.END +\# +.MAC HEADER_RULE_COLOR END +. HDRFTR_RULE_COLOR \\$1 +.END +\# +.MAC HEADER_SIZE END +. HDRFTR_SIZE \\$1 +.END +\# +\# HEADER and FOOTER aliases for HDRFTR macros. +\# +.ALIAS BIBLIOGRAPHY_FOOTER_CENTER BIBLIOGRAPHY_HDRFTR_CENTER +.ALIAS BIBLIOGRAPHY_FOOTER_CENTRE BIBLIOGRAPHY_HDRFTR_CENTRE +.ALIAS BIBLIOGRAPHY_HEADER_CENTER BIBLIOGRAPHY_HDRFTR_CENTER +.ALIAS BIBLIOGRAPHY_HEADER_CENTRE BIBLIOGRAPHY_HDRFTR_CENTRE +.ALIAS ENDNOTES_FOOTER_CENTER ENDNOTES_HDRFTR_CENTER +.ALIAS ENDNOTES_FOOTER_CENTRE ENDNOTES_HDRFTR_CENTRE +.ALIAS ENDNOTES_HEADER_CENTER ENDNOTES_HDRFTR_CENTER +.ALIAS ENDNOTES_HEADER_CENTRE ENDNOTES_HDRFTR_CENTRE +.ALIAS FOOTER_CENTER_CAPS HDRFTR_CENTER_CAPS +.ALIAS FOOTER_CENTER HDRFTR_CENTER +.ALIAS FOOTER_CENTER_PAD HDRFTR_CENTER_PAD +.ALIAS FOOTER_CENTRE HDRFTR_CENTER +.ALIAS FOOTER_CENTRE_PAD HDRFTR_CENTER_PAD +.ALIAS FOOTER_LEFT_CAPS HDRFTR_LEFT_CAPS +.ALIAS FOOTER_LEFT HDRFTR_LEFT +.ALIAS FOOTER_PLAIN HDRFTR_PLAIN +.ALIAS FOOTER_RECTO HDRFTR_RECTO +.ALIAS FOOTER_RIGHT_CAPS HDRFTR_RIGHT_CAPS +.ALIAS FOOTER_RIGHT HDRFTR_RIGHT +.ALIAS FOOTER_RULE_GAP HDRFTR_RULE_GAP +.ALIAS FOOTER_RULE HDRFTR_RULE +.ALIAS FOOTER_VERSO HDRFTR_VERSO +.ALIAS HEADER_CENTER_CAPS HDRFTR_CENTER_CAPS +.ALIAS HEADER_CENTER HDRFTR_CENTER +.ALIAS HEADER_CENTER_PAD HDRFTR_CENTER_PAD +.ALIAS HEADER_CENTRE_CAPS HDRFTR_CENTER_CAPS +.ALIAS HEADER_CENTRE HDRFTR_CENTER +.ALIAS HEADER_CENTRE_PAD HDRFTR_CENTER_PAD +.ALIAS HEADER_LEFT_CAPS HDRFTR_LEFT_CAPS +.ALIAS HEADER_LEFT HDRFTR_LEFT +.ALIAS HEADER_PLAIN HDRFTR_PLAIN +.ALIAS HEADER_RECTO HDRFTR_RECTO +.ALIAS HEADER_RIGHT_CAPS HDRFTR_RIGHT_CAPS +.ALIAS HEADER_RIGHT HDRFTR_RIGHT +.ALIAS HEADER_RULE_GAP HDRFTR_RULE_GAP +.ALIAS HEADER_RULE HDRFTR_RULE +.ALIAS HEADER_VERSO HDRFTR_VERSO +.ALIAS SWITCH_FOOTERS SWITCH_HDRFTR +.ALIAS SWITCH_HEADERS SWITCH_HDRFTR +\# +\# Type-style aliases +\# +.ALIAS AUTHOR_FAMILY _FAMILY +.ALIAS BIBLIOGRAPHY_FAMILY _FAMILY +.ALIAS BIBLIOGRAPHY_STRING_FAMILY _FAMILY +.ALIAS BLOCKQUOTE_FAMILY _FAMILY +.ALIAS CHAPTER_TITLE_FAMILY _FAMILY +.ALIAS COVER_AUTHOR_FAMILY _FAMILY +.ALIAS COVER_CHAPTER_TITLE_FAMILY _FAMILY +.ALIAS COVER_COPYRIGHT_FAMILY _FAMILY +.ALIAS COVER_DOCTYPE_FAMILY _FAMILY +.ALIAS COVER_FAMILY _FAMILY +.ALIAS COVER_SUBTITLE_FAMILY _FAMILY +.ALIAS COVER_TITLE_FAMILY _FAMILY +.ALIAS DOC_COVER_AUTHOR_FAMILY _FAMILY +.ALIAS DOC_COVER_CHAPTER_TITLE_FAMILY _FAMILY +.ALIAS DOC_COVER_COPYRIGHT_FAMILY _FAMILY +.ALIAS DOC_COVER_DOCTYPE_FAMILY _FAMILY +.ALIAS DOC_COVER_FAMILY _FAMILY +.ALIAS DOC_COVER_SUBTITLE_FAMILY _FAMILY +.ALIAS DOC_COVER_TITLE_FAMILY _FAMILY +.ALIAS DOCHEADER_FAMILY _FAMILY +.ALIAS DOCTYPE_FAMILY _FAMILY +.ALIAS ENDNOTE_FAMILY _FAMILY +.ALIAS ENDNOTE_NUMBER_FAMILY _FAMILY +.ALIAS ENDNOTE_LINENUMBER_FAMILY _FAMILY +.ALIAS ENDNOTE_STRING_FAMILY _FAMILY +.ALIAS ENDNOTE_TITLE_FAMILY _FAMILY +.ALIAS EPIGRAPH_FAMILY _FAMILY +.ALIAS FOOTNOTE_FAMILY _FAMILY +.ALIAS HDRFTR_CENTER_FAMILY _FAMILY +.ALIAS HDRFTR_FAMILY _FAMILY +.ALIAS HDRFTR_LEFT_FAMILY _FAMILY +.ALIAS HDRFTR_RIGHT_FAMILY _FAMILY +.ALIAS HEAD_FAMILY _FAMILY +.ALIAS PAGENUM_FAMILY _FAMILY +.ALIAS PARAHEAD_FAMILY _FAMILY +.ALIAS QUOTE_FAMILY _FAMILY +.ALIAS SUBHEAD_FAMILY _FAMILY +.ALIAS SUBTITLE_FAMILY _FAMILY +.ALIAS TITLE_FAMILY _FAMILY +.ALIAS TOC_FAM _FAMILY +.ALIAS TOC_FAMILY _FAMILY +.ALIAS TOC_HEADER_FAMILY _FAMILY +.ALIAS TOC_HEAD_FAMILY _FAMILY +.ALIAS TOC_PARAHEAD_FAMILY _FAMILY +.ALIAS TOC_PN_FAMILY _FAMILY +.ALIAS TOC_SUBHEAD_FAMILY _FAMILY +.ALIAS TOC_TITLE_FAMILY _FAMILY +\# +.ALIAS AUTHOR_FONT _FONT +.ALIAS BIBLIOGRAPHY_STRING_FONT _FONT +.ALIAS BIBLIOGRAPHY_FONT _FONT +.ALIAS BLOCKQUOTE_FONT _FONT +.ALIAS CHAPTER_TITLE_FONT _FONT +.ALIAS COVER_AUTHOR_FONT _FONT +.ALIAS COVER_CHAPTER_TITLE_FONT _FONT +.ALIAS COVER_COPYRIGHT_FONT _FONT +.ALIAS COVER_DOCTYPE_FONT _FONT +.ALIAS COVER_SUBTITLE_FONT _FONT +.ALIAS COVER_TITLE_FONT _FONT +.ALIAS DOC_COVER_AUTHOR_FONT _FONT +.ALIAS DOC_COVER_CHAPTER_TITLE_FONT _FONT +.ALIAS DOC_COVER_COPYRIGHT_FONT _FONT +.ALIAS DOC_COVER_DOCTYPE_FONT _FONT +.ALIAS DOC_COVER_SUBTITLE_FONT _FONT +.ALIAS DOC_COVER_TITLE_FONT _FONT +.ALIAS DOCTYPE_FONT _FONT +.ALIAS ENDNOTE_FONT _FONT +.ALIAS ENDNOTE_NUMBER_FONT _FONT +.ALIAS ENDNOTE_LINENUMBER_FONT _FONT +.ALIAS ENDNOTE_STRING_FONT _FONT +.ALIAS ENDNOTE_TITLE_FONT _FONT +.ALIAS EPIGRAPH_FONT _FONT +.ALIAS FOOTNOTE_FONT _FONT +.ALIAS HDRFTR_CENTER_FONT _FONT +.ALIAS HDRFTR_LEFT_FONT _FONT +.ALIAS HDRFTR_RIGHT_FONT _FONT +.ALIAS HEAD_FONT _FONT +.ALIAS PAGENUM_FONT _FONT +.ALIAS PARAHEAD_FONT _FONT +.ALIAS QUOTE_FONT _FONT +.ALIAS SUBHEAD_FONT _FONT +.ALIAS SUBTITLE_FONT _FONT +.ALIAS TITLE_FONT _FONT +.ALIAS TOC_HEADER_FONT _FONT +.ALIAS TOC_HEAD_FONT _FONT +.ALIAS TOC_PARAHEAD_FONT _FONT +.ALIAS TOC_PN_FONT _FONT +.ALIAS TOC_SUBHEAD_FONT _FONT +.ALIAS TOC_TITLE_FONT _FONT +\# +.ALIAS AUTHOR_SIZE _SIZE +.ALIAS BIBLIOGRAPHY_STRING_SIZE _SIZE +.ALIAS BLOCKQUOTE_SIZE _SIZE +.ALIAS CHAPTER_TITLE_SIZE _SIZE +.ALIAS COVER_AUTHOR_SIZE _SIZE +.ALIAS COVER_CHAPTER_TITLE_SIZE _SIZE +.ALIAS COVER_COPYRIGHT_SIZE _SIZE +.ALIAS COVER_DOCTYPE_SIZE _SIZE +.ALIAS COVER_SUBTITLE_SIZE _SIZE +.ALIAS COVER_TITLE_SIZE _SIZE +.ALIAS DOC_COVER_AUTHOR_SIZE _SIZE +.ALIAS DOC_COVER_CHAPTER_TITLE_SIZE _SIZE +.ALIAS DOC_COVER_COPYRIGHT_SIZE _SIZE +.ALIAS DOC_COVER_DOCTYPE_SIZE _SIZE +.ALIAS DOC_COVER_SUBTITLE_SIZE _SIZE +.ALIAS DOC_COVER_TITLE_SIZE _SIZE +.ALIAS DOCTYPE_SIZE _SIZE +.ALIAS ENDNOTE_NUMBER_SIZE _SIZE +.ALIAS ENDNOTE_LINENUMBER_SIZE _SIZE +.ALIAS ENDNOTE_STRING_SIZE _SIZE +.ALIAS ENDNOTE_TITLE_SIZE _SIZE +.ALIAS EPIGRAPH_SIZE _SIZE +.ALIAS FOOTNOTE_SIZE _SIZE +.ALIAS HDRFTR_CENTER_SIZE _SIZE +.ALIAS HDRFTR_LEFT_SIZE _SIZE +.ALIAS HDRFTR_RIGHT_SIZE _SIZE +.ALIAS HDRFTR_SIZE _SIZE +.ALIAS HEAD_SIZE _SIZE +.ALIAS PAGENUM_SIZE _SIZE +.ALIAS PARAHEAD_SIZE _SIZE +.ALIAS QUOTE_SIZE _SIZE +.ALIAS SUBHEAD_SIZE _SIZE +.ALIAS SUBTITLE_SIZE _SIZE +.ALIAS TITLE_SIZE _SIZE +.ALIAS TOC_HEADER_SIZE _SIZE +.ALIAS TOC_HEAD_SIZE _SIZE +.ALIAS TOC_PARAHEAD_SIZE _SIZE +.ALIAS TOC_PN_SIZE _SIZE +.ALIAS TOC_SUBHEAD_SIZE _SIZE +.ALIAS TOC_TITLE_SIZE _SIZE +\# +.ALIAS ATTRIBUTE_COLOR _COLOR +.ALIAS AUTHOR_COLOR _COLOR +.ALIAS BLOCKQUOTE_COLOR _COLOR +.ALIAS CHAPTER_TITLE_COLOR _COLOR +.ALIAS COVER_ATTRIBUTE_COLOR _COLOR +.ALIAS COVER_AUTHOR_COLOR _COLOR +.ALIAS COVER_CHAPTER_TITLE_COLOR _COLOR +.ALIAS COVER_COLOR _COLOR +.ALIAS COVER_COPYRIGHT_COLOR _COLOR +.ALIAS COVER_DOCTYPE_COLOR _COLOR +.ALIAS COVER_MISC_COLOR _COLOR +.ALIAS COVER_SUBTITLE_COLOR _COLOR +.ALIAS COVER_TITLE_COLOR _COLOR +.ALIAS DOC_COVER_ATTRIBUTE_COLOR _COLOR +.ALIAS DOC_COVER_AUTHOR_COLOR _COLOR +.ALIAS DOC_COVER_CHAPTER_TITLE_COLOR _COLOR +.ALIAS DOC_COVER_COLOR _COLOR +.ALIAS DOC_COVER_COPYRIGHT_COLOR _COLOR +.ALIAS DOC_COVER_DOCTYPE_COLOR _COLOR +.ALIAS DOC_COVER_MISC_COLOR _COLOR +.ALIAS DOC_COVER_SUBTITLE_COLOR _COLOR +.ALIAS DOC_COVER_TITLE_COLOR _COLOR +.ALIAS DOCHEADER_COLOR _COLOR +.ALIAS DOCTYPE_COLOR _COLOR +.ALIAS EPIGRAPH_COLOR _COLOR +.ALIAS FINIS_COLOR _COLOR +.ALIAS FOOTNOTE_COLOR _COLOR +.ALIAS HDRFTR_CENTER_COLOR _COLOR +.ALIAS HDRFTR_COLOR _COLOR +.ALIAS HDRFTR_LEFT_COLOR _COLOR +.ALIAS HDRFTR_RIGHT_COLOR _COLOR +.ALIAS HDRFTR_RULE_COLOR _COLOR +.ALIAS HEAD_COLOR _COLOR +.ALIAS LINEBREAK_COLOR _COLOR +.ALIAS PAGENUM_COLOR _COLOR +.ALIAS PARAHEAD_COLOR _COLOR +.ALIAS QUOTE_COLOR _COLOR +.ALIAS SUBHEAD_COLOR _COLOR +.ALIAS SUBTITLE_COLOR _COLOR +.ALIAS TITLE_COLOR _COLOR +\# +.ALIAS BIBLIOGRAPHY_QUAD _QUAD +.ALIAS BIBLIOGRAPHY_STRING_QUAD _QUAD +.ALIAS BLOCKQUOTE_QUAD _QUAD +.ALIAS COVER_COPYRIGHT_QUAD _QUAD +.ALIAS COVER_MISC_QUAD _QUAD +.ALIAS DOC_COVER_COPYRIGHT_QUAD _QUAD +.ALIAS DOC_COVER_MISC_QUAD _QUAD +.ALIAS DOC_QUAD _QUAD +.ALIAS ENDNOTE_QUAD _QUAD +.ALIAS ENDNOTE_STRING_QUAD _QUAD +.ALIAS ENDNOTE_TITLE_QUAD _QUAD +.ALIAS EPIGRAPH_QUAD _QUAD +.ALIAS FOOTNOTE_QUAD _QUAD +.ALIAS HEAD_QUAD _QUAD +.ALIAS SUBHEAD_QUAD _QUAD +.ALIAS TOC_HEADER_QUAD _QUAD +\# +\# Support aliases +\# +.ALIAS COL_BREAK COL_NEXT +.ALIAS DOC_COVER_ADVANCE COVER_ADVANCE +.ALIAS DOC_COVER COVER +.ALIAS DOC_COVERS COVERS +.ALIAS DOC_COVER_LEAD COVER_LEAD +.ALIAS DOC_COVERTITLE COVERTITLE +.ALIAS DO_DOC_COVER DO_COVER +.ALIAS PRINT_FOOTNOTE_RULE FOOTNOTE_RULE +\# +\# Miscellaneous aliases +.ALIAS SECTION LINEBREAK +.ALIAS SECTION_CHAR LINEBREAK_CHAR +\# +\# Miscellaneous macros to take care of backward compatibility +\# ----------------------------------------------------------- +\# +\# As of 1.1.9, EL and TN got changed to make TRAP...TRAP OFF +\# unnecessary for users. However, I used both macros extensively +\# throughout this file (in conjunction with TRAP...TRAP OFF). +\# EOL is the "old" EL, for the personal use of om.tmac +\# +.MAC EOL END +. br +. sp -1v .END \# +\# REFER SUPPORT +\# ------------- \# -\# OUTPUT BLANK PAGES +\# Footnote references +\# ------------------- +\# *Function: +\# Instruct REF to put references in footnotes. +\# +.MAC FOOTNOTE_REFS END +. if r#EN_REF \{ .rr #EN_REF \} +. nr #FN_REF 1 +.END +\# +\# Endnote references \# ------------------ +\# *Function: +\# Instruct REF to collect references for endnotes output. +\# +.MAC ENDNOTE_REFS END +. if r#FN_REF \{ .rr #FN_REF \} +. nr #EN_REF 1 +.END +\# +\# Prepare mom for a reference +\# --------------------------- \# *Argument: -\# +\# | INDENT L|LEFT|R|RIGHT|B|BOTH \# *Function: -\# Outputs blank pages. +\# Calls FOOTNOTE or ENDNOTE, depending on whether #REF_FN or +\# #REF_EN is set to 1. \# *Notes: -\# If recto/verso, each page is recto/verso, even if there's -\# nothing on it. +\# For convenience, REF is a toggle. \# -.MAC BLANKPAGE END -. nr #HOW_MANY \\$1 -. nr #PAGES 0 1 -. while \\n+[#PAGES]<=\\n[#HOW_MANY] \{\ -. if \\n[#HEADERS_ON]=1 \{\ -. nr #HEADERS_WERE_ON 1 -. HEADERS OFF -. \} -. if \\n[#PAGE_NUM_V_POS]=1 \{\ -. if \\n[#PAGINATE]=1 \{ .nr #PAGINATE_WAS_ON 1 \} -. PAGINATION OFF -. \} -. NEWPAGE -. PRINT \& -. if \\n[#FOOTERS_ON]=1 \{\ -. nr #FOOTERS_WERE_ON 1 -. FOOTERS OFF +\# REF optionally takes the same arguments as FOOTNOTE, allowing +\# users to indent references that go in footnotes when footnote +\# indenting is required. FOOTNOTE_REFS must be on for this. +\# +.MAC REF END +. ie \\n[#FN_REF]+\\n[#EN_REF]=0 \{\ +. if !\\n[#REF_WARNING]=1 \{\ +. tm1 "[mom]: Before REF at line \\n(.c, neither FOOTNOTE_REFS nor ENDNOTE_REFS +. tm1 " has been selected. If "sort" and "accumulate" are in your refer +. tm1 " commands, references will be collected for later output with $LIST$. +. tm1 " Otherwise, they will disappear. +. nr #REF_WARNING 1 +. \} . \} -. if \\n[#PAGE_NUM_V_POS]=2 \{\ -. if \\n[#PAGINATE]=1 \{ .nr #PAGINATE_WAS_ON 1 \} -. PAGINATION OFF +. el \{\ +. ie \\n[#REF]=1 \{\ +. if \\n[#FN_REF]=1 \{ .FOOTNOTE OFF \} +. if \\n[#EN_REF]=1 \{ .ENDNOTE OFF \} +. rr #REF . \} -. if \\n[#HEADERS_WERE_ON] \{ .HEADERS \} -. if \\n[#PAGE_NUM_V_POS]=1 \{\ -. if \\n[#PAGINATE_WAS_ON] \{ .PAGINATE \} +. el \{\ +. rr #REF_WARNING +. nr #REF 1 +. if \\n[#FN_REF]=1 \{ .FOOTNOTE \\$1 \\$2 \\$3 \} +. if \\n[#EN_REF]=1 \{ .ENDNOTE \} . \} . \} -. NEWPAGE -. if \\n[#FOOTERS_WERE_ON] \{ .FOOTERS \} -. if \\n[#PAGE_NUM_V_POS]=2 \{\ -. if \\n[#PAGINATE_WAS_ON] \{ .PAGINATE \} -. \} -. rr #HEADERS_WERE_ON -. rr #FOOTERS_WERE_ON -. rr #PAGINATE_WAS_ON .END \# +\# Embedded references in text (with brackets) +\# ------------------------------------------- \# -\# SET TRAPS FOR HEADERS/FOOTERS/FOOTNOTES -\# --------------------------------------- -\# *Arguments: -\# -\# *Function: -\# Sets header/footer/footnotes/etc... traps. -\# Calculates the number of lines that actually fit on a -\# page based on #B_MARGIN and resets page bottom trap to coincide -\# with the depth of that number of lines, or, if #ADJ_DOC_LEAD=1, -\# adjusts #DOC_LEAD so that the last line of text on a page falls -\# exactly on #B_MARGIN. +.MAC REF_BRACKETS_START END +. ds $CURRENT_EV \\n[.ev] +. ev REFERENCE +. evc \\*[$CURRENT_EV] +. di REFERENCE +.END \# -.MAC TRAPS END -\# *Remove all header/footer traps -. if !\\n[#NO_TRAP_RESET] \{\ -. ch DO_T_MARGIN -. ch DO_B_MARGIN -. ch HEADER -. ch FOOTER -\# *Plant header trap -. wh 0 HEADER -. \} -\# *Adjust lead so last line of text falls on B_MARGIN,... -. ie \\n[#ADJ_DOC_LEAD]=1 \{\ -. nr #LINES_PER_PAGE 0 1 -. nr #DOC_LEAD_ADJ 0 1 -. nr #DEPTH_TO_B_MARGIN \\n[#PAGE_LENGTH]-\\n[#B_MARGIN]-1v -. while \\n[#T_MARGIN]+(\\n[#DOC_LEAD]*\\n+[#LINES_PER_PAGE])<\\n[#DEPTH_TO_B_MARGIN] \{\ -. -. \} -. nr #LINES_PER_PAGE -1 -. while \\n[#T_MARGIN]+(\\n[#DOC_LEAD]+\\n+[#DOC_LEAD_ADJ]*\\n[#LINES_PER_PAGE])<\\n[#DEPTH_TO_B_MARGIN] \{\ -. -. \} -. DOC_LEAD \\n[#DOC_LEAD]u+\\n[#DOC_LEAD_ADJ]u -. \} -\# *...or calculate new B_MARGIN based on # of lines (at #DOC_LEAD) that fit -\# *on the page. -. el \{\ -. nr #LINES_PER_PAGE 0 1 -. nr #DEPTH_TO_B_MARGIN \\n[#PAGE_LENGTH]-\\n[#B_MARGIN]-1v -. while \\n[#T_MARGIN]+(\\n[#DOC_LEAD]*\\n+[#LINES_PER_PAGE])<\\n[#DEPTH_TO_B_MARGIN] \{\ -. -. \} -. nr #B_MARGIN \\n[#PAGE_LENGTH]-(\\n[#T_MARGIN]+(\\n[#DOC_LEAD]*\\n[#LINES_PER_PAGE])) -. \} -\# *Set footer and footnote overflow traps -. if !\\n[#NO_TRAP_RESET] \{\ -. nr #FN_COUNT 0 1 -. nr #SPACE_REMAINING 0 -. nr #FN_DEPTH 0 -. nr #VARIABLE_FOOTER_POS 0-\\n[#B_MARGIN]u -. wh 12i FOOTER -. wh -\\n[#B_MARGIN]u FN_OVERFLOW_TRAP -. ch FOOTER -\\n[#B_MARGIN]u -. \} -. rr #ADJ_DOC_LEAD +.MAC REF_BRACKETS_END END +. br +. di +. ev +. chop REFERENCE +. unformat REFERENCE +. if '\\$0'REF)' \{ .nop (\\*[REFERENCE]) \} +. if '\\$0'REF]' \{ .nop [\\*[REFERENCE]] \} +. if '\\$0'REF}' \{ .nop {\\*[REFERENCE]} \} .END \# +\# These three pairs of aliases allow users to embed references in +\# text and have them surrounded by (), [] or {}. \# -\# CHECK INDENT -\# ------------ -\# *Arguments: -\# +.ALIAS REF( REF_BRACKETS_START +.ALIAS REF) REF_BRACKETS_END +\# +.ALIAS REF[ REF_BRACKETS_START +.ALIAS REF{ REF_BRACKETS_START +\# +.ALIAS REF} REF_BRACKETS_END +.ALIAS REF] REF_BRACKETS_END +\# +\# Second-line indent for refs +\# --------------------------- +\# *Argument: +\# FOOTNOTE | ENDNOTE | BIBLIO \# *Function: -\# Adds left, right, or both indent values to document elements -\# like heads and subheads that are processed in environments. +\# Sets strings $REF_FN_INDENT, $REF_EN_INDENT or $REF_BIB_INDENT. +\# *Notes: +\# Indent value requires a unit of measure. \# -.MAC CHECK_INDENT END -. if \\n[#INDENT_LEFT_ACTIVE] \{\ -. in \\n[#L_INDENT]u -. if \\n[#QUOTE] \{\ -. in -\\n[#L_INDENT]u \"Because you added an indent in 2nd line of macro -. ll -\\n[#L_INDENT]u -. ta \\n(.lu -. \} -. if \\n[#EPIGRAPH] \{\ -. in -\\n[#L_INDENT]u -. ll -\\n[#L_INDENT]u -. ta \\n(.lu -. \} -. \} -. if \\n[#INDENT_RIGHT_ACTIVE] \{\ -. ll -\\n[#R_INDENT]u -. ta \\n(.lu -. \} -. if \\n[#INDENT_BOTH_ACTIVE] \{\ -. in \\n[#BL_INDENT]u -. ll -\\n[#BR_INDENT]u -. ta \\n(.lu -. if \\n[#QUOTE] \{\ -. in -\\n[#BL_INDENT]u -. ie \\n[#BR_INDENT]=\\n[#BL_INDENT] \{\ -. ll -\\n[#BR_INDENT]u -. ta \\n(.lu -. \} -. el \{\ -. ll -(\\n[#BR_INDENT]u/2u) -. ta \\n(.lu -. \} -. \} -. if \\n[#EPIGRAPH] \{\ -. in -\\n[#BL_INDENT]u -. ie \\n[#BR_INDENT]=\\n[#BL_INDENT] \{\ -. ll -\\n[#BR_INDENT]u -. ta \\n(.lu -. \} -. el \{\ -. ll -(\\n[#BR_INDENT]u/2u) -. ta \\n(.lu -. \} -. \} +.MAC INDENT_REFS END +. if '\\$1'FOOTNOTE' .ds $REF_FN_INDENT \\$2 +. if '\\$1'ENDNOTE' .ds $REF_EN_INDENT \\$2 +. if '\\$1'BIBLIO' .ds $REF_BIB_INDENT \\$2 +.END +\# +\# Hyphenation of references +\# ------------------------- +\# *Argument: +\# | +\# *Function: +\# Sets register #REF_HYPHENATE +\# +.MAC HYPHENATE_REFS END +. ie '\\$1'' \{ .nr #REF_HYPHENATE 1 \} +. el \{\ +. if r#REF_HY \{ .rr #REF_HY \} . \} .END \# +.ig +The remainder of the definitions in this section are modified +versions of the definitions found in the refer module of s.tmac. +.. +\# +\# This one is directly from s.tmac. +.de @error +.tm \\n(.F:\\n(.c: macro error: \\$* +.. +\# +.ig +The following strings define the order of entries for different +types of references. Each letter in the string refers to a database +field (A for author, T1/T2 for article and book titles, etc). +Mom is set up for MLA-style bibliographies. Other styles can be +implemented here by re-ordering the fields. +.. +\# Book - type 2 +.ds ref*spec!2 Q A T1 d t l r E S e V a C I D P O +\# Article within book - type 3 +.ds ref*spec!3 Q A T2 B d t l r E S e V a C I D P O +\# Journal article - type 1 +.ds ref*spec!1 Q A T2 J S N D P O +\# Tech report - type 4 +.ds ref*spec!4 Q A T1 R G C I D P O +\# Internet site - type 0 +.ds ref*spec!0 Q A T2 s E c d o a u O +\# +\# Refer's "1st" macro. Since it is possible to define database +\# fields using any single letter, we remove all possible string +\# definitions of the form [X and [x +\# +.de ]- +.rm [A [B [C [D [E [F [G [H [I [J [K [L [M \ + [N [O [P [Q [R [S [T [U [V [W [X [Y [Z \ +. [a [b [c [d [e [f [g [h [i [j [k [l [m \ + [n [o [p [q [r [s [t [u [v [w [x [y [z +.rm ref*string +.rr ref*type +.. +\# +\# Refer's "2nd" macro; builds up a reference with ref*build, and +\# prints it with ref*print. +\# +.de ][ +.nr ref*type \\$1 +.if \\n[ref*type]=3 \{\ +. if !'\\*([R'' \{\ +. nr ref*type 4 +. ds ref*spec!4 Q A T2 B R C I D P O +. \} +. if !'\\*([G'' \{\ +. nr ref*type 4 +. ds ref*spec!4 Q A T2 B G C I D P O +. \} +.\} +.if r [T \{\ +. als [T1 [T +. als [T2 [T +.\} +.ie d ref*spec!\\n[ref*type] .ref*build \\*[ref*spec!\\n[ref*type]] +.el \{\ +. @error unknown reference type `\\n[ref*type]' +. ref*build \\*[ref*spec!0] +.\} +.if !\\n[.hy]=0 \{\ +.nr #RESTORE_HY \\n[.hy] +.if !r#REF_HY .nh +.\} +.ref*print +.if !\\n[#RESTORE_HY]=0 .hy \\n[#RESTORE_HY] +.rr #RESTORE_HY +.rm ref*string +.rm [F [T1 [T2 +.. +\# +\# Refer's "3rd" macros, which set up and terminate the output +\# of collected references +\# +.de ]< +.als ref*print ref*end-print +.nr #REF 1 +.if \\n[#BIB_LIST]=1 \{\ +. nr #IN_BIB_LIST 1 +. LIST DIGIT \\*[$BIB_LIST_SEPARATOR] \\*[$BIB_LIST_PREFIX] +.\} +.. +\# +.de ]> +.LIST OFF +.rr #REF +.rr #IN_BIB_LIST +.als ref*print ref*normal-print +.. \# -\# REMOVE INDENT +\# Output +\# ------ +\# +\# Output normal, non-collected refs +\# +.de ref*normal-print +.nr #CURRENT_HY \\n[.hy] +\\*[ref*string] +.. +\# +\# Output collected refs +\# +.de ref*end-print +.\" 10 is abritrary +.nn 10 +.ie \\n[#BIB_LIST]=0 \{\ +.in +\\*[$REF_BIB_INDENT] +.ti -\\*[$REF_BIB_INDENT] +.\} +.el .ITEM +\\*[ref*string] +.sp \\n[#BIB_SPACE]u +.ie \\n[#BIB_LIST]=0 .in +.el .IL -\\*[$REF_BIB_INDENT]u +.nn 0 +.. +\# +.als ref*print ref*normal-print +\# +\# Build up the ref*string +\# +.ig +Correct MLA "typewritten" style (printstyle TYPEWRITE) demands +two spaces after each period. The spaces are hardwired into the +string definitions (ref*add-), so we have to make sure that there +aren't two spaces when the printstyle is TYPESET. Since I find that +references look a bit crowded with 0 sentence space, I've bumped it +up to +4. User's sentence spacing is reset in FOOTNOTES and ENDNOTES. +.. +\# +.de ref*build +.if \\n[#PRINT_STYLE]=2 \{\ +. ds $RESTORE_SS_VAR \\*[$SS_VAR] +. SS +4 +.\} +.rm ref*string ref*post-punct +.nr ref*suppress-period 1 +.while \\n[.$] \{\ +. if d [\\$1 \{\ +. ie d ref*add-\\$1 .ref*add-\\$1 +. el .ref*add-dflt \\$1 +. \} +. shift +.\} +.\" now add a final period +.ie d ref*string \{\ +. if !\\n[ref*suppress-period] .as ref*string . +. if d ref*post-punct \{\ +. as ref*string "\\*[ref*post-punct] +. rm ref*post-punct +. \} +.\} +.el .ds ref*string +.. +\# +\# The following macros determine how entries are formatted WRT +\# punctuation, type style, additional strings, etc. +\# +.ig +o First argument is the database field letter. +o Second argument is the punctuation character to use to separate this + field from the previous field. +o Third argument is a string with which to prefix this field. +o Fourth argument is a string with which to postfix this field. +o Fifth argument is a string to add after the punctuation character + supplied by the next field. +.. +\# +\# %A Author(s) +.de ref*add-A +.ref*field A , +.if r [A .nr ref*suppress-period \\n([A +.. +\# %T Title (generic) +.de ref*add-T1 +.ref*field T . " \E*[IT]" "" \E*[PREV] +.if \\n([T .nr ref*suppress-period \\n([T +.. +\# %T Title of a chapter or article +.de ref*add-T2 +.ref*field T . " \(lq" "" "\(rq" +.if \\n([T .nr ref*suppress-period \\n([T +.. +\# %B Book title (when citing an article from a book) +.de ref*add-B +.ie \\n([T .ref*field B "" ".\E*[IT]" "" \E*[PREV] +.el .ref*field B . " \E*[IT]" "" \E*[PREV] +\# refer doesn't set reg [T to 1 for these book titles, so we do it here +.ds eval*[B \\*([B +.substring eval*[B -1 +.rr [T +.if '\\*[eval*[B]'!' .nr [T 1 +.if '\\*[eval*[B]'?' .nr [T 1 +.rm eval*[B +.. +\# %R Report number for technical reports +.de ref*add-R +.ref*field R . " " +.. +\# %J Journal name +.de ref*add-J +.ie \\n([T .ref*field J "" " \E*[IT]" "" \E*[PREV] +.el .ref*field J . " \E*[IT]" "" \E*[PREV] +.. +\# %E Editor(s) +.de ref*add-E +.ie !\\n[ref*type]=0 \{\ +. ie \\n([E>0 \{\ +. ie \\n([T .ref*field E "" " Eds. " +. el .ref*field E . " Eds. " +. \} +. el \{\ +. ie \\n([T .ref*field E "" " Ed. " +. el .ref*field E . " Ed. " +. \} +.\} +.el \{\ +. ie \\n([T .ref*field E "" " " +. el .ref*field E . " " +.\} +.rr [T +.. +\# %e Edition +.de ref*add-e +.ie \\n([T .ref*field e "" " " " edition" +.el .ref*field e . " " " edition" +.rr [T +.. +\# %V Volume (of a journal, or series of books) +.de ref*add-V +.if \\n[ref*type]=1 \{\ +. ref*field V +.\} +.if \\n[ref*type]=2 \{\ +. ie \\n([T .ref*field V "" " " +. el .ref*field V . " " +.\} +.if \\n[ref*type]=3 \{\ +. ie \\n([T .ref*field V "" " " +. el .ref*field V . " " +.\} +.rr [T +.. +\# %N Journal number +.de ref*add-N +.ref*field N +.. +\# %S Series (books or journals) +.de ref*add-S +.if \\n[ref*type]=1 \{\ +. ref*field S +.\} +.if \\n[ref*type]=2 \{\ +. ie \\n([T .ref*field S "" " " +. el .ref*field S . " " +.\} +.if \\n[ref*type]=3 \{\ +. ie \\n([T .ref*field S "" " " +. el .ref*field S . " " +.\} +.rr [T +\# refer doesn't set reg [T to 1 for series titles, so we do it here +.ds eval*[S \\*([S +.substring eval*[S -1 +.if '\\*[eval*[S]'!' .nr [T 1 +.if '\\*[eval*[S]'?' .nr [T 1 +.rm eval*[S +.. +\# %C City +.de ref*add-C +.ie \\n([T .ref*field C "" " " +.el .ref*field C . " " +.rr [T +.. +\# %I Publisher (I stands for Issuer) +.de ref*add-I +.ie !'\\*([C'' .ref*field I : +.el \{\ +. ie \\n([T .ref*field I "" " " +. el .ref*field I . " " +.\} +.rr [T +.. +\# %D Date of publication +.de ref*add-D +.if \\n[ref*type]=1 \{\ +. ie !'\\*([V''.ref*field D "" "(" ")" +. el .ref*field D +.\} +.if \\n[ref*type]=2 .ref*field D , +.if \\n[ref*type]=3 \{\ +. ie '\\*([C'' \{\ +. ie '\\*([I'' .ref*field D . " " +. el .ref*field D , +. \} +. el .ref*field D , +.\} +.if \\n[ref*type]=4 .ref*field D , +.. +\# %P Page number(s) +.de ref*add-P +.ie \\n[ref*type]=1 .ref*field P : +.el .ref*field P . " " +.. +\# %G Gov't. ordering number +.de ref*add-G +.ref*field G . " " +.. +\# %O Other (usually goes at end of ref) +.de ref*add-O +.ref*field O . " " +.ie r [O .nr ref*suppress-period \\n([O +.el .nr ref*suppress-period 1 +.. +\# +.de ref*add-dflt +.ref*field \\$1 , +.. +\# +\# Book reprints \# ------------- -\# *Arguments: -\# -\# *Function: -\# Removes left, right, or both indent values from document elements -\# like heads and subheads that are processed in environments. +\# %d date of publication (the orignal date of publication) +.de ref*add-d +.ie \\n([T .ref*field d "" " " +.el .ref*field d . " " +.rr [T +.. +\# %a additions (such as a new intro to reprints) +.de ref*add-a +.ie \\n([T .ref*field a "" " " +.el .ref*field a . " " +.rr [T +.. +\# %t title, if different from original title (the T field, which s/b +\# the original title) +.de ref*add-t +.ie \\n([T .ref*field t "" " Rpt. as \E*[IT]" "" \E*[PREV] +.el .ref*field t . " Rpt. as \E*[IT]" "" \E*[PREV] +.rr [T +.. \# -.MAC REMOVE_INDENT END -. in 0 -. ll \\n[#L_LENGTH]u -. ta \\n(.lu -.END +\# Translated works +\# ---------------- +\# %l Trans(l)ator +.de ref*add-l +.ie \\n([T .ref*field l "" " Trans. " +.el .ref*field l . " Trans. " +.rr [T +.. +\# %r Translato(r) and edito(r) +.de ref*add-r +.ie \\n([T .ref*field r "" " Trans. and Ed. " +.el .ref*field r . " Trans. and Ed. " +.rr [T +.. \# +\# Internet +\# -------- +\# %s Site name +.de ref*add-s +.ie \\n([s .ref*field s "" ".\E*[IT]" "" \E*[PREV] +.el .ref*field s . " \E*[IT]" "" \E*[PREV] +.\" refer doesn't set reg [T to 1 for these book titles, so we do it here +.ds eval*[s \\*([s +.substring eval*[s -1 +.rr [T +.if '\\*[eval*[s]'!' .nr [T 1 +.if '\\*[eval*[s]'?' .nr [T 1 +.rm eval*[s +.. +\# %c content of site, if unclear (i.e. advertisement, cartoon, +\# interview, etc.) +.de ref*add-c +.ie \\n([T .ref*field c "" " " +.el .ref*field c . " " +.rr [T +.. +\# %o organization, group or sponsor of site +.de ref*add-o +.ie \\n([T .ref*field o "" " " +.el .ref*field o . " " +.rr [T +.. +\# %a access date, i.e. the date you read it +.de ref*add-a +.ie \\n([T .ref*field a "" " " +.el .ref*field a . " " +.rr [T +.. +\# %u URL +.de ref*add-u +.ref*field u "" " <" ">" +.rr [T +.. +\# +\# Build up reference string from ref*add- macros. +\# +.de ref*field +.if d ref*string \{\ +. ie d ref*post-punct \{\ +. as ref*string "\\$2\\*[ref*post-punct] \" +. rm ref*post-punct +. \} +. el .as ref*string "\\$2 \" +.\} +.as ref*string "\\$3\\*([\\$1\\$4 +.if \\n[.$]>4 .ds ref*post-punct "\\$5 +.nr ref*suppress-period 0 +.. \# -\# Set up a default papersize of US letter +\# MARGIN NOTES +\# ------------ +\# This is a wrapper for MNinit. \# -.PAPER LETTER +\# I could use a 'while' loop to assign args to strings, but too many +\# 'while' loops are slowing things down. \# -\# ==================================================================== +.MAC MN_INIT END +. if !'\\$1'rerun' \{\ +. ds $MN-arg1 \\$1 +. ds $MN-arg2 \\$2 +. ds $MN-arg3 \\$3 +. ds $MN-arg4 \\$4 +. ds $MN-arg5 \\$5 +. ds $MN-arg6 \\$6 +. ds $MN-arg7 \\$7 +. ds $MN-arg8 \\$8 +. ds $MN-arg9 \\$9 +. \} +. ie \\n[#START_FOR_MNinit]=0 \{\ +. nr #MNinit_DEFERRED 1 +. nr #START_FOR_MNinit 1 +. return +. \} +. el \{\ +. MNinit \\*[$MN-arg1] \\*[$MN-arg2] \\*[$MN-arg3] \\*[$MN-arg4] \\*[$MN-arg5] \\*[$MN-arg6] \\*[$MN-arg7] \\*[$MN-arg8] \\*[$MN-arg9] +. \} +.END \# -\# +++DOCUMENT PROCESSING ALIASES+++ +.MAC MN_OVERFLOW_TRAP END +. if \\n[#OVERFLOW_LEFT]=1 \{\ +. nr #no-repeat-MN-left 1 +. di MN_OVERFLOW_LEFT +. \} +. if \\n[#OVERFLOW_RIGHT]=1 \{\ +. nr #no-repeat-MN-right 1 +. di MN_OVERFLOW_RIGHT +. \} +. rr #OVERFLOW_LEFT +. rr #OVERFLOW_RIGHT +.END \# -\# Aliases to make life easier for users: synonyms, short forms -\# and alternate spellings. +.ig +The remainder of the margin notes macros and routines are adapted +from Werner Lemberg's MN.tmac. +.. \# -\# Macros +\# MNinit \# ------ -.ALIAS BLOCKQUOTE_COLOUR BLOCKQUOTE_COLOR -.ALIAS BREAK_BLOCKQUOTE BREAK_QUOTE -.ALIAS BREAK_CITATION BREAK_QUOTE -.ALIAS BREAK_CITE BREAK_QUOTE -.ALIAS CITATION BLOCKQUOTE -.ALIAS CITATION_COLOUR CITATION_COLOR -.ALIAS CITATION_FAMILY BLOCKQUOTE_FAMILY -.ALIAS CITATION_FONT BLOCKQUOTE_FONT -.ALIAS CITATION_SIZE BLOCKQUOTE_SIZE -.ALIAS CITATION_COLOR BLOCKQUOTE_COLOR -.ALIAS CITATION_QUAD BLOCKQUOTE_QUAD -.ALIAS CITE BLOCKQUOTE -.ALIAS CITE_COLOUR CITE_COLOR -.ALIAS CITE_FAMILY BLOCKQUOTE_FAMILY -.ALIAS CITE_FONT BLOCKQUOTE_FONT -.ALIAS CITE_SIZE BLOCKQUOTE_SIZE -.ALIAS CITE_COLOR BLOCKQUOTE_COLOR -.ALIAS CITE_QUAD BLOCKQUOTE_QUAD -.ALIAS DOC_R_MARGIN DOC_RIGHT_MARGIN -.ALIAS DOC_L_MARGIN DOC_LEFT_MARGIN -.ALIAS DOC_L_LENGTH DOC_LINE_LENGTH -.ALIAS DOC_RMARGIN DOC_RIGHT_MARGIN -.ALIAS DOC_LMARGIN DOC_LEFT_MARGIN -.ALIAS DOC_LLENGTH DOC_LINE_LENGTH -.ALIAS DOC_FAM DOC_FAMILY -.ALIAS DOC_LS DOC_LEAD -.ALIAS DOC_PS DOC_PT_SIZE -.ALIAS DOCHEADER_COLOUR DOCHEADER_COLOUR -.ALIAS EPIGRAPH_COLOUR EPIGRAPH_COLOR -.ALIAS FILL QUAD -.ALIAS FINIS_COLOUR FINIS_COLOR -.ALIAS HEAD_COLOUR HEAD_COLOR -.ALIAS LINEBREAK_COLOUR LINEBREAK_COLOR -.ALIAS PAGENUM PAGENUMBER -.ALIAS PAGENUM_COLOUR PAGENUM_COLOR -.ALIAS PAGINATION PAGINATE -.ALIAS PARAHEAD_COLOUR PARAHEAD_COLOR -.ALIAS PP_FT PP_FONT -.ALIAS QUOTE_COLOUR QUOTE_COLOR -.ALIAS SUBHEAD_COLOUR SUBHEAD_COLOR -.ALIAS TOC_FAM TOC_FAM -.ALIAS TOC_PS TOC_PT_SIZE +\# Usage: +\# MNinit [ragged|symmetric] \ +\# left-width right-width separation \ +\# font fontsize vertical-spacing \ +\# color hyphenation-flags +\# +\# Initialize margin notes. Empty arguments (denoted with "") set +\# default values. If the first argument is the string `ragged', +\# left and right margin notes are printed ragged-right. If it is +\# `symmetric', left margin notes are printed ragged-left and right +\# margin notes ragged-right. If omitted, margin notes are left +\# and right adjusted. +\# +\# +.de MNinit +. nr #MNinit 1 +. ds MN-left-ad b\" +. ds MN-right-ad b\" +. if '\\$1'RAGGED' \{\ +. ds MN-left-ad l\" +. ds MN-right-ad l\" +. shift +. \} +. if '\\$1'SYMMETRIC' \{\ +. ds MN-left-ad r\" +. ds MN-right-ad l\" +. shift +. \} +. ie \B'\\$3' \ +. nr MN-sep (n;\\$3) +. el \ +. nr MN-sep 1m +. if ((\\n[.o] - \\n[MN-sep]) < 1n) \ +. ab MN: Left margin too small (<1n) for requested margin notes separation. +. ie \B'\\$1' \{\ +. nr MN-left-width (n;\\$1) +. nr MN-left-start (\\n[.o] - \\n[MN-sep] - \\n[MN-left-width]) +. \} +. el \{\ +. nr MN-left-width (\\n[.o] - \\n[MN-sep]) +. nr MN-left-start 0 +. \} +. if (\\n[MN-left-start] < 0) \ +. ab MN: Left margin too small for requested margin notes settings. +. if (\\n[MN-left-width] < 1n) \ +. ab MN: Left margin notes width too small (<1n). +. +. ie \B'\\$2' \{\ +. nr MN-right-width (n;\\$2) +. nr MN-right-start (\\n[.o] + \\n[.l] + \\n[MN-sep]) +. if \\n[#COLUMNS]=1 \{\ +. if !\\n[#NUM_COLS]=1 \{\ +. nr MN-right-start (\\n[#COL_2_L_MARGIN] + \\n[#COL_L_LENGTH] + \\n[MN-sep]) +. \} +. \} +. \} +. el \{\ +. nr MN-right-width \\n[MN-left-width] +. nr MN-right-start (\\n[.o] + \\n[.l] + \\n[MN-sep]) +. if \\n[#COLUMNS]=1 \{\ +. if !\\n[#NUM_COLS]=1 \{\ +. nr MN-right-start (\\n[#COL_2_L_MARGIN] + \\n[#COL_L_LENGTH] + \\n[MN-sep]) +. \} +. \} +. \} +. ie \A'\\$4' \{\ +. ds MN-font \\$4\" +. if \\n[#PRINT_STYLE]=1 .ds MN-font CR +. \} +. el \{\ +. ds MN-font \\*[$PP_FT] +. if \\n[#PRINT_STYLE]=1 .ds MN-font CR +. \} +. ie \B'\\$5' \{\ +. ps \\$5 +. nr MN-size \\n[.ps] +. ps +. if \\n[#PRINT_STYLE]=1 \{\ +. ps 12 +. nr MN-size \\n[.ps] +. ps +. \} +. \} +. el \{\ +. nr MN-size \\n[#DOC_PT_SIZE] +. \} +. ie \B'\\$6' \{\ +' vs \\$6 +. nr MN-spacing \\n(.v +' vs +. if '\\$6'DOC' \{ .nr MN-spacing \\n[#DOC_LEAD] \} +. if \\n[#PRINT_STYLE]=1 \{\ +. nr MN-spacing \\n[#DOC_LEAD] +. \} +. \} +. el \{\ +. nr MN-spacing \\n[#DOC_LEAD] +. \} +. ie \A'\\$7' \ +. if !\\n[#PRINT_STYLE]=1 .ds MN-color \\$7\" +. el \ +. if !\\n[#PRINT_STYLE]=1 .ds MN-color +. ie \B'\\$8' \ +. nr MN-hy \\$8 +. el \ +. nr MN-hy \\n[.hy] +. ev MNbottom-left-env +. if \A'\\*[MN-font]' \ +. ft \\*[MN-font] +. if \\n[MN-size] \ +. ps \\n[MN-size]u +. if \\n[MN-spacing] \ +. vs \\n[MN-spacing]u +. ll \\n[MN-left-width]u +. ad \\*[MN-left-ad] +. hy \\n[MN-hy] +' in 0 +. nop \m[\\*[MN-color]]\c +. ev +. ev MNbottom-right-env +. if \A'\\*[MN-font]' \ +. ft \\*[MN-font] +. if \\n[MN-size] \ +. ps \\n[MN-size]u +. if \\n[MN-spacing] \ +. vs \\n[MN-spacing]u +. ll \\n[MN-right-width]u +. ad \\*[MN-right-ad] +. hy \\n[MN-hy] +' in 0 +. nop \m[\\*[MN-color]]\c +. ev +. nr MN-active 0 +.. +\# MN +\# -- +\# Usage: +\# +\# MN LEFT|RIGHT +\# margin note text +\# MN +\# +\# With a parameter, start a margin note, otherwise end a margin note. +\# If the parameter is the string `left', define a left margin note, +\# otherwise define a right margin note. +\# +.de MN +.ds MN-dir \\$1 +.if \\n[#COLUMNS]=1 \{\ +. if \\n[#NUM_COLS]>2 \{\ +. tm MN: More than two columns. Ignoring margin notes. +. return +. \} +. if !\\n[#NUM_COLS]=1 \{\ +. ie \\n[#COL_NUM]=1 .ds MN-dir LEFT +. el .ds MN-dir RIGHT +. \} +.\} +. if !\\n[#MNinit]=1 \{\ +. tm MN: You must set parameters with MN_INIT before using MN. +. ab Aborting +. \} +. ie !'\\$1'' \{\ +. if \\n[MN-active] \{\ +. tm MN: Can't handle nested margin notes. +. return +. \} +. nr MN-active 1 +. ev MN-env +. ie '\\*[MN-dir]'LEFT' \{\ +. nr MN-left +1 +. ds MN-curr l-\\n[MN-left]\" +. evc MNbottom-left-env +. \} +. el \{\ +. nr MN-right +1 +. ds MN-curr r-\\n[MN-right]\" +. evc MNbottom-right-env +. \} +. mk MN-mk-\\*[MN-curr] +. di MN-div-\\*[MN-curr] +. \} +. el \{\ +. if \\n[MN-active] \{\ +. br +. di +. nr MN-div-\\*[MN-curr]-depth \\n(dn +. ev +. \} +. nr MN-active 0 +. \} +.. \# -\# HEADER and FOOTER aliases for HDRFTR macros. +\# MNtop +\# ----- +\# Resets these registers (called in HEADER) +.de MNtop +. nr MN-left 0 +. nr MN-right 0 +. nr MN-active 0 +.. \# -.ALIAS ENDNOTES_FOOTER_CENTER ENDNOTES_HDRFTR_CENTER -.ALIAS ENDNOTES_HEADER_CENTER ENDNOTES_HDRFTR_CENTER -.ALIAS ENDNOTES_FOOTER_CENTRE ENDNOTES_HDRFTR_CENTRE -.ALIAS ENDNOTES_HEADER_CENTRE ENDNOTES_HDRFTR_CENTRE -.ALIAS FOOTER_CENTER_CAPS HDRFTR_CENTER_CAPS -.ALIAS FOOTER_CENTER_COLOR HDRFTR_CENTER_COLOR -.ALIAS FOOTER_CENTER_COLOUR HDRFTR_CENTER_COLOUR -.ALIAS FOOTER_CENTER_FAM HDRFTR_CENTER_FAMILY -.ALIAS FOOTER_CENTER_FAMILY HDRFTR_CENTER_FAMILY -.ALIAS FOOTER_CENTER_FONT HDRFTR_CENTER_FONT -.ALIAS FOOTER_CENTER_FT HDRFTR_CENTER_FONT -.ALIAS FOOTER_CENTER HDRFTR_CENTER -.ALIAS FOOTER_CENTER_PAD HDRFTR_CENTER_PAD -.ALIAS FOOTER_CENTER_PS HDRFTR_CENTER_SIZE -.ALIAS FOOTER_CENTER_SIZE HDRFTR_CENTER_SIZE -.ALIAS FOOTER_CENTRE_CAPS HDRFTR_CENTER_CAPS -.ALIAS FOOTER_CENTRE_COLOR HDRFTR_CENTRE_COLOR -.ALIAS FOOTER_CENTRE_COLOUR HDRFTR_CENTRE_COLOUR -.ALIAS FOOTER_CENTRE_FAM HDRFTR_CENTER_FAMILY -.ALIAS FOOTER_CENTRE_FAMILY HDRFTR_CENTER_FAMILY -.ALIAS FOOTER_CENTRE_FONT HDRFTR_CENTER_FONT -.ALIAS FOOTER_CENTRE_FT HDRFTR_CENTER_FONT -.ALIAS FOOTER_CENTRE HDRFTR_CENTER -.ALIAS FOOTER_CENTRE_PAD HDRFTR_CENTER_PAD -.ALIAS FOOTER_CENTRE_PS HDRFTR_CENTER_SIZE -.ALIAS FOOTER_CENTRE_SIZE HDRFTR_CENTER_SIZE -.ALIAS FOOTER_COLOR HDRFTR_COLOR -.ALIAS FOOTER_COLOUR HDRFTR_COLOR -.ALIAS FOOTER_FAM HDRFTR_FAMILY -.ALIAS FOOTER_FAMILY HDRFTR_FAMILY -.ALIAS FOOTER_LEFT_CAPS HDRFTR_LEFT_CAPS -.ALIAS FOOTER_LEFT_COLOR HDRFTR_LEFT_COLOR -.ALIAS FOOTER_LEFT_COLOUR HDRFTR_LEFT_COLOUR -.ALIAS FOOTER_LEFT_FAM HDRFTR_LEFT_FAMILY -.ALIAS FOOTER_LEFT_FAMILY HDRFTR_LEFT_FAMILY -.ALIAS FOOTER_LEFT_FONT HDRFTR_LEFT_FONT -.ALIAS FOOTER_LEFT_FT HDRFTR_LEFT_FONT -.ALIAS FOOTER_LEFT HDRFTR_LEFT -.ALIAS FOOTER_LEFT_PS HDRFTR_LEFT_SIZE -.ALIAS FOOTER_LEFT_SIZE HDRFTR_LEFT_SIZE -.ALIAS FOOTER_PLAIN HDRFTR_PLAIN -.ALIAS FOOTER_RECTO HDRFTR_RECTO -.ALIAS FOOTER_RIGHT_CAPS HDRFTR_RIGHT_CAPS -.ALIAS FOOTER_RIGHT_COLOR HDRFTR_RIGHT_COLOR -.ALIAS FOOTER_RIGHT_COLOUR HDRFTR_RIGHT_COLOUR -.ALIAS FOOTER_RIGHT_FAM HDRFTR_RIGHT_FAMILY -.ALIAS FOOTER_RIGHT_FAMILY HDRFTR_RIGHT_FAMILY -.ALIAS FOOTER_RIGHT_FONT HDRFTR_RIGHT_FONT -.ALIAS FOOTER_RIGHT_FT HDRFTR_RIGHT_FONT -.ALIAS FOOTER_RIGHT HDRFTR_RIGHT -.ALIAS FOOTER_RIGHT_PS HDRFTR_RIGHT_SIZE -.ALIAS FOOTER_RIGHT_SIZE HDRFTR_RIGHT_SIZE -.ALIAS FOOTER_RULE_COLOR HDRFTR_RULE_COLOR -.ALIAS FOOTER_RULE_GAP HDRFTR_RULE_GAP -.ALIAS FOOTER_RULE HDRFTR_RULE -.ALIAS FOOTER_SIZE HDRFTR_SIZE -.ALIAS FOOTER_VERSO HDRFTR_VERSO -.ALIAS HEADER_CENTER_CAPS HDRFTR_CENTER_CAPS -.ALIAS HEADER_CENTER_COLOR HDRFTR_CENTER_COLOR -.ALIAS HEADER_CENTER_COLOUR HDRFTR_CENTER_COLOUR -.ALIAS HEADER_CENTER_FAM HDRFTR_CENTER_FAMILY -.ALIAS HEADER_CENTER_FAMILY HDRFTR_CENTER_FAMILY -.ALIAS HEADER_CENTER_FONT HDRFTR_CENTER_FONT -.ALIAS HEADER_CENTER_FT HDRFTR_CENTER_FONT -.ALIAS HEADER_CENTER HDRFTR_CENTER -.ALIAS HEADER_CENTER_PAD HDRFTR_CENTER_PAD -.ALIAS HEADER_CENTER_PS HDRFTR_CENTER_SIZE -.ALIAS HEADER_CENTER_SIZE HDRFTR_CENTER_SIZE -.ALIAS HEADER_CENTRE_CAPS HDRFTR_CENTER_CAPS -.ALIAS HEADER_CENTRE_COLOR HDRFTR_CENTRE_COLOR -.ALIAS HEADER_CENTRE_COLOUR HDRFTR_CENTRE_COLOUR -.ALIAS HEADER_CENTRE_FAM HDRFTR_CENTER_FAMILY -.ALIAS HEADER_CENTRE_FAMILY HDRFTR_CENTER_FAMILY -.ALIAS HEADER_CENTRE_FONT HDRFTR_CENTER_FONT -.ALIAS HEADER_CENTRE_FT HDRFTR_CENTER_FONT -.ALIAS HEADER_CENTRE HDRFTR_CENTER -.ALIAS HEADER_CENTRE_PAD HDRFTR_CENTER_PAD -.ALIAS HEADER_CENTRE_PS HDRFTR_CENTER_SIZE -.ALIAS HEADER_CENTRE_SIZE HDRFTR_CENTER_SIZE -.ALIAS HEADER_COLOR HDRFTR_COLOR -.ALIAS HEADER_COLOUR HDRFTR_COLOR -.ALIAS HEADER_FAM HDRFTR_FAMILY -.ALIAS HEADER_FAMILY HDRFTR_FAMILY -.ALIAS HEADER_LEFT_CAPS HDRFTR_LEFT_CAPS -.ALIAS HEADER_LEFT_COLOR HDRFTR_LEFT_COLOR -.ALIAS HEADER_LEFT_COLOUR HDRFTR_LEFT_COLOUR -.ALIAS HEADER_LEFT_FAM HDRFTR_LEFT_FAMILY -.ALIAS HEADER_LEFT_FAMILY HDRFTR_LEFT_FAMILY -.ALIAS HEADER_LEFT_FONT HDRFTR_LEFT_FONT -.ALIAS HEADER_LEFT_FT HDRFTR_LEFT_FONT -.ALIAS HEADER_LEFT HDRFTR_LEFT -.ALIAS HEADER_LEFT_PS HDRFTR_LEFT_SIZE -.ALIAS HEADER_LEFT_SIZE HDRFTR_LEFT_SIZE -.ALIAS HEADER_PLAIN HDRFTR_PLAIN -.ALIAS HEADER_RECTO HDRFTR_RECTO -.ALIAS HEADER_RIGHT_CAPS HDRFTR_RIGHT_CAPS -.ALIAS HEADER_RIGHT_COLOR HDRFTR_RIGHT_COLOR -.ALIAS HEADER_RIGHT_COLOUR HDRFTR_RIGHT_COLOUR -.ALIAS HEADER_RIGHT_FAM HDRFTR_RIGHT_FAMILY -.ALIAS HEADER_RIGHT_FAMILY HDRFTR_RIGHT_FAMILY -.ALIAS HEADER_RIGHT_FONT HDRFTR_RIGHT_FONT -.ALIAS HEADER_RIGHT_FT HDRFTR_RIGHT_FONT -.ALIAS HEADER_RIGHT HDRFTR_RIGHT -.ALIAS HEADER_RIGHT_PS HDRFTR_RIGHT_SIZE -.ALIAS HEADER_RIGHT_SIZE HDRFTR_RIGHT_SIZE -.ALIAS HEADER_RULE_COLOR HDRFTR_RULE_COLOR -.ALIAS HEADER_RULE_GAP HDRFTR_RULE_GAP -.ALIAS HEADER_RULE HDRFTR_RULE -.ALIAS HEADER_SIZE HDRFTR_SIZE -.ALIAS HEADER_VERSO HDRFTR_VERSO -.ALIAS SWITCH_FOOTERS SWITCH_HDRFTR -.ALIAS SWITCH_HEADERS SWITCH_HDRFTR +\# MNbottom-left +\# ------------- +\# The "left" half of Werner's original MNbottom. \# -\# Support aliases +.de MNbottom-left +. nr MN-curr 0 +. nr MN-last-pos 0 +. nr MN-lead-adj \\n[#DOC_LEAD]-\\n[MN-spacing] +. vpt 0 +. mk MN-curr-pos +. if \\n[MN-active] \{\ +. di +. tm MN: Margin note finished by new page. Ignored. +. \} +. po \\n[MN-left-start]u +. ev MNbottom-left-env +. nr #P \\n%+\\n[#PAGE_NUM_ADJ] +. while (\\n[MN-curr] < \\n[MN-left]) \{\ +. nr MN-curr +1 +. ie (\\n[MN-last-pos] < \\n[MN-mk-l-\\n[MN-curr]]) \ +. sp |\\n[MN-mk-l-\\n[MN-curr]]u+\\n[MN-lead-adj]u +. el \{\ +. nr MN-shifted 1 +. sp 1v +. SHIM +. if \\n[#SHIM]u>\\n[MN-spacing] .sp -(1v+\\n[MN-lead-adj]u) +. tm MN: Warning: Left margin note #\\n[MN-curr] on page \\n[#P] shifted down. +. \} +.\" If last margin note doesn't fit +. if ( (\\n(nl+\\n[MN-div-l-\\n[MN-curr]-depth]) > (\\n(.p+\\n[#VARIABLE_FOOTER_POS]) ) \{\ +. if \\n[MN-shifted]=1 \{\ +. sp -(1v+\\n[#SHIM]u) +. rm MN-div-l-\\n[MN-curr] +. tm1 "[mom]: No room to start left margin note #\\n[MN-curr] on page \\n[#P] on page \\n[#P]. +. tm1 " Ignoring margin note. +. rr MN-shifted +. \} +. nr #no-repeat-MN-left 1 +. nr #OVERFLOW_LEFT 1 +. wh \\n[.p]u+\\n[#VARIABLE_FOOTER_POS]u-1u MN_OVERFLOW_TRAP +. vpt 1 +. \} +. MN-div-l-\\n[MN-curr] +. br +. nr MN-last-pos \\n[nl] +.\} +. ev +. po +. if !\\n[#no-repeat-MN-left]=1 \{\ +. if \\n[MN-right]=0 .vpt 1 +. \} +.. +\# +\# MNbottom-right +\# -------------- +\# The "right" half of Werner's original MNbottom. \# -.ALIAS COL_BREAK COL_NEXT -.ALIAS PRINT_FOOTNOTE_RULE FOOTNOTE_RULE +.de MNbottom-right +. nr MN-curr 0 +. nr MN-last-pos 0 +. nr MN-lead-adj \\n[#DOC_LEAD]-\\n[MN-spacing] +. vpt 0 +. po \\n[MN-right-start]u +. ev MNbottom-right-env +. nr #P \\n%+\\n[#PAGE_NUM_ADJ] +. while (\\n[MN-curr] < \\n[MN-right]) \{\ +. nr MN-curr +1 +. ie (\\n[MN-last-pos] < \\n[MN-mk-r-\\n[MN-curr]]) \ +. sp |\\n[MN-mk-r-\\n[MN-curr]]u+\\n[MN-lead-adj]u +. el \{\ +. nr MN-shifted 1 +. sp 1v +. SHIM +. tm MN: Warning: Right margin note #\\n[MN-curr] on page \\n[#P] shifted down. +. \} +.\" If last margin note doesn't fit +. if ( (\\n(nl+\\n[MN-div-r-\\n[MN-curr]-depth]) > (\\n(.p+\\n[#VARIABLE_FOOTER_POS]) ) \{\ +. if \\n[MN-shifted]=1 \{\ +. sp -(1v+\\n[#SHIM]u) +. rm MN-div-r-\\n[MN-curr] +. tm1 "[mom]: No room to start right margin note #\\n[MN-curr] on page \\n[#P] on page \\n[#P]. +. tm1 " Ignoring margin note. +. rr MN-shifted +. \} +. nr #no-repeat-MN-right 1 +. nr #OVERFLOW_RIGHT 1 +. wh \\n[.p]u+\\n[#VARIABLE_FOOTER_POS]u-1u MN_OVERFLOW_TRAP +. vpt 1 +. \} +. MN-div-r-\\n[MN-curr] +. br +. nr MN-last-pos \\n[nl] +.\} +. ev +. po +' sp |\\n[MN-curr-pos]u +. if !\\n[#no-repeat-MN-right]=1 .vpt 1 +.. diff -ruN groff-1.19.1/contrib/mom/TODO groff-1.19.2/contrib/mom/TODO --- groff-1.19.1/contrib/mom/TODO 2004-03-22 07:18:36.000000000 +0100 +++ groff-1.19.2/contrib/mom/TODO 2004-08-09 11:07:47.000000000 +0200 @@ -1,3 +1,6 @@ +As of version 1.2, the items on this TODO list will only be dealt +with if users request they be implemented. + UNDERLINING ----------- Explore "the ultimative underline macro" for possible inclusion @@ -12,12 +15,6 @@ In columnar docs, maybe give user the choice of gathering all footnotes at the bottom of the last column? -Figure out a way to bypass the \c requirement before .FOOTNOTE. - -Figure out a way to process blockquotes and quotes that contain -footnotes so that the user doesn't have to use the awful kludge -.BREAKQUOTE. - CONTROL MACROS -- _INDENT -------------- Let user be able to enter decimal fractions as the argument to _INDENT diff -ruN groff-1.19.1/contrib/pdfmark/ChangeLog groff-1.19.2/contrib/pdfmark/ChangeLog --- groff-1.19.1/contrib/pdfmark/ChangeLog 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/contrib/pdfmark/ChangeLog 2005-06-23 15:29:56.000000000 +0200 @@ -0,0 +1,137 @@ +2005-06-22 Keith Marshall + + pdfroff.sh portability enhancement. + + * pdfroff.sh: (ARGLIST): Variable removed. + (GROFF_STYLE): Use it for all groff invocations. + (INPUT_FILES): Pass to all groff invocations, instead of ARGLIST. + (CS_MACRO, CE_MACRO): Initialize independently. + (CS_FILTER): Simplify quoting; it used to confuse some shells. + (Source): CVS keyword removed; replaced by... + (RCSfile, Revision): these. + +2005-06-17 Keith Marshall + + * pdfroff.sh: (MATCH): Correct quoting. + (Source): Add terminating `$' on CVS keyword. + +2005-06-17 Zvezdan Petkovic + + * Makefile.sub: (RM): Define as `rm -f', for `make' programs + which don't predefine it. + +2005-06-16 Bernd Warken + + * pdfroff.sh: (NULLDEV): Correct misspelled instance of NULDEV. + +2005-05-28 Werner LEMBERG + + * Makefile.sub (.ms.pdf): Use `--stylesheet', not `--style'. + +2005-05-17 Keith Marshall + + Improve portability of `pdfroff' shell script. + + * pdfroff.sh: Add space in shebang, conforming to portability + guidelines in `autoconf' docs. + (searchpath): New shell function; use it instead of `type' command + to locate prerequisite helper programs. + + * pdfroff.man: Document influence of `OSTYPE' and `PATH_SEPARATOR' + environment variables. + + * Makefile.sub: (pdfroff): Make it depend on SH_DEPS_SED_SCRIPT, + from arch/misc/shdeps.sh; use it to customize PATH_SEPARATOR + initialization code for `searchpath' function in pdfroff.sh. + +2005-05-16 Keith Marshall + + Interim documentation update. + + * pdfmark.ms: (GROFF-WEBSITE): New string; use it in references and + examples. + (Section 2.5): Add definitions of D and Z operators, for use with + pdfhref macro. + (Section 2.5.4): Complete description of pdfhref macro usage for + `Linking to Internet Resources'; provide examples. + +2005-05-14 Nick Stoughton + + * pdfmark.tmac (LB): Renamed to ... + (PDFLB): This to avoid conflicts with mm's LB macro. + +2005-05-02 Keith Marshall + + Handle parsing anomalies in Cygwin's `ash', and similar, shells. + + * pdfroff.sh: ($CAT, $GREP, $SED, $GROFF, $DIFF): Avoid interpreting + misdirected error messages, which `type' sends to `stdout' in some + shells, as a successful program file match. + + ($AWK, $GS): Likewise; also ensure that multiple choice match + prototypes are eval'ed as such, in case token splitting occurs + before variable expansion. + +2005-04-24 Keith Marshall + + Add support for folded outlines in PDF documents. + + * pdfmark.tmac (PDFOUTLINE.FOLDLEVEL): New register. + (pdf:bm.emit): Use it. + + * pdfmark.ms: Document it. + +2005-03-25 Werner LEMBERG + + * Makefile.in: Removed. + +2005-03-24 Werner LEMBERG + + * Makefile: Renamed to... + * Makefile.in: This. + +2005-03-22 Keith Marshall + + * pdfroff.sh: Eliminate invalid program reference to $AWK, when + invoked with `--no-reference-dictionary' option. + +2005-03-02 Keith Marshall + + * contrib/pdfmark/Makefile.sub (install_data): Use $(INSTALL_SCRIPT) + to install `pdfroff'. + * contrib/pdfmark/pdfroff.man (opte): New macro. + Use it to remove spurious equal signs from SYNOPSIS. + +2005-02-28 Keith Marshall + + Provide `pdfroff' shell script, and manpage to document it; + runs multiple groff passes, to format PDF documents. + + * pdfroff.sh: New shell script template; + * pdfroff.man: New man page to document it. + + Integrate `pdfmark' into normal groff build system; + install macro `pdfmark' packages, build and install `pdfroff', + and PDF format documentation. + + * Makefile.sub: Rewritten. + * pdfmark.tmac: Modified. + (pdfhref): New macro operators, `D' and `Z'. + (pdf*href-D, pdf*href-Z): New macros: implement them. + (pdf*href.mark.resolve, pdf*href.mark.emit, pdf*href.mark.flush): + Modified macro algorithm, to eliminate inconsistencies between + `grohtml' representations of `opminy' from differing groff versions. + (pdf*href.mark, pdf*href.mark.release, pdf*href.mark.close): + deleted (redundant macros). + (PDFHREF.LEADING): Default value changed (was 2.5p; now -1.0p). + Global comment updates. + + * TODO: Updated. + +2004-12-10 Werner LEMBERG + + * TODO: Updated. + +2004-12-08 Keith Marshall + + First import of pdfmark files. diff -ruN groff-1.19.1/contrib/pdfmark/cover.ms groff-1.19.2/contrib/pdfmark/cover.ms --- groff-1.19.1/contrib/pdfmark/cover.ms 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/contrib/pdfmark/cover.ms 2004-12-06 11:19:03.000000000 +0100 @@ -0,0 +1,57 @@ +.de CS +.if !rCO .nr CO 0 +.if !rTL .nr TL 0 +.\".nr PO*SAVED \\n[PO] +.nr LL*SAVED \\n[LL] +.nr HM*SAVED \\n[HM] +.nr HM 0 +.nr PO (2.1c+\\n[CO]u) +.nr LL 17.1c +\& +.nr PS*SAVED \\n[PS] +.nr VS*SAVED \\n[VS] +.nr PS 24 +.nr VS 30 +.CD +.fam T +.sp |(5.9c+\\n[TL]u) +.als AU au@first +.. +.de au@first +.sp 1.5v +.als AU au@next +.AU \\$@ +.. +.de au@next +.DE +.nr PS 18 +.nr VS 18 +.CD +.sp 0.5v +\\$* +.. +.de AI +\H'-4z'\\$*\H'0' +.. +.de CE +.DE +.sp |17.5c +.PSPIC gnu.eps +.nr PS 19 +.CD +.fam H +.tkf HR 10z 2p 20z 4p +\H'-4z'A GNU MANUAL\H'0' +.DE +.\".nr PO \\n[PO*SAVED] +.nr LL \\n[LL*SAVED] +.nr PS \\n[PS*SAVED] +.nr VS \\n[VS*SAVED] +.nr HM \\n[HM*SAVED] +.\".rr PO*SAVED +.rr LL*SAVED +.rr PS*SAVED +.rr VS*SAVED +.rr HM*SAVED +.fam +.. diff -ruN groff-1.19.1/contrib/pdfmark/Makefile.sub groff-1.19.2/contrib/pdfmark/Makefile.sub --- groff-1.19.1/contrib/pdfmark/Makefile.sub 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/contrib/pdfmark/Makefile.sub 2005-06-17 09:01:15.000000000 +0200 @@ -0,0 +1,114 @@ +# Copyright (C) 2005, Free Software Foundation, Inc. +# Written by Keith Marshall (keith.d.marshall@ntlworld.com) +# +# This file is part of groff. +# +# groff 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. +# +# groff 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 groff; see the file COPYING. If not, write to the Free Software +# Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. + +MAN1=\ + pdfroff.n + +CMDFILES=\ + pdfroff + +TMACFILES=\ + pdfmark.tmac \ + spdf.tmac + +PDFDOCFILES=\ + pdfmark.pdf + +CLEANADD=\ + gnu.eps \ + $(PDFDOCFILES) \ + $(CMDFILES) + +# Some `makes' don't predefine RM... +RM=rm -f + +GROFF_BIN_DIR=$(top_builddir)/src/roff/groff +GROFF_OTHER_BIN_DIRS=\ + $(top_builddir)/src/roff/troff \ + $(top_builddir)/src/devices/grops +GROFF_BIN_DIRS=$(GROFF_BIN_DIR) $(GROFF_OTHER_BIN_DIRS) +GROFF_BIN_PATH=`echo $(GROFF_BIN_DIRS) | sed -e 's| *|$(SH_SEP)|g'` + +FFLAG=-F$(top_builddir)/font -F$(top_srcdir)/font +MFLAG=-M$(srcdir) -M$(top_builddir)/tmac -M$(top_srcdir)/tmac +PFLAG=-dpaper=$(PAGE) -P-p$(PAGE) + +PDFROFF=\ + export GROFF_COMMAND_PREFIX; GROFF_COMMAND_PREFIX=''; \ + export GROFF_BIN_DIR; GROFF_BIN_DIR=$(GROFF_BIN_DIR); \ + export GROFF_BIN_PATH; GROFF_BIN_PATH=$(GROFF_BIN_PATH); \ + ./pdfroff $(FFLAG) $(MFLAG) $(PFLAG) + +.SUFFIXES: .ms .pdf +.ms.pdf: + $(RM) $@ + $(PDFROFF) -mspdf --stylesheet=$(srcdir)/cover.ms $< >$@ + +all: pdfroff $(make_pdfdoc) + +pdfdoc: gnu.eps $(PDFDOCFILES) + +gnu.eps: + if test -f $(top_srcdir)/doc/gnu.eps; then \ + cp $(top_srcdir)/doc/gnu.eps . ; \ + elif test -f $(top_builddir)/doc/gnu.eps; then \ + cp $(top_builddir)/doc/gnu.eps . ; \ + else \ + xpmtoppm $(top_srcdir)/doc/gnu.xpm | pnmdepth 15 | \ + $(pnmtops_nosetpage) -noturn -rle >$@ ; \ + fi + +pdfroff: pdfroff.sh $(SH_DEPS_SED_SCRIPT) + $(RM) $@ + sed -f $(SH_DEPS_SED_SCRIPT) \ + -e "s|@VERSION@|$(version)$(revision)|" \ + -e "s|@GROFF_AWK_INTERPRETERS@|$(ALT_AWK_PROGS)|" \ + -e "s|@GROFF_GHOSTSCRIPT_INTERPRETERS@|$(ALT_GHOSTSCRIPT_PROGS)|" \ + -e "s|@GROFF_BIN_DIR@|$(bindir)|" $(srcdir)/pdfroff.sh >$@ + chmod +x $@ + +install_data: $(make_install_pdfdoc) + -test -d $(bindir) || $(mkinstalldirs) $(bindir) + for f in $(CMDFILES); do \ + $(RM) $(bindir)/$$f; \ + $(INSTALL_SCRIPT) $$f $(bindir)/$$f; \ + done + -test -d $(tmacdir) || $(mkinstalldirs) $(tmacdir) + for f in $(TMACFILES); do \ + $(RM) $(tmacdir)/$$f; \ + $(INSTALL_DATA) $(srcdir)/$$f $(tmacdir)/$$f; \ + done + +install_pdfdoc: + -test -d $(pdfdocdir) || $(mkinstalldirs) $(pdfdocdir) + for f in $(PDFDOCFILES); do \ + $(RM) $(pdfdocdir)/$$f; \ + $(INSTALL_DATA) $$f $(pdfdocdir)/$$f; \ + done + +uninstall_sub: + for f in $(CMDFILES); do \ + $(RM) $(bindir)/$$f; \ + done + for f in $(TMACFILES); do \ + $(RM) $(tmacdir)/$$f; \ + done + for f in $(PDFDOCFILES); do \ + $(RM) $(pdfdocdir)/$$f; \ + done diff -ruN groff-1.19.1/contrib/pdfmark/pdfmark.ms groff-1.19.2/contrib/pdfmark/pdfmark.ms --- groff-1.19.1/contrib/pdfmark/pdfmark.ms 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/contrib/pdfmark/pdfmark.ms 2005-05-16 10:13:09.000000000 +0200 @@ -0,0 +1,2531 @@ +.\" vim: ft=groff +.CS +Portable Document Format +Publishing with GNU Troff +.AU Keith Marshall +.AI +.CE +.\" +.\" Specify the Internet address for the groff web site. +.\" Currently, there are two available addresses; a copy is maintained at ... +.\" +.ds GROFF-WEBSITE http://www.gnu.org/software/groff +.\" +.\" ... but the official home site is at ... +.\" +.ds GROFF-WEBSITE http://groff.ffii.org +.\" +.\" Set the PDF default document view attribute, to ensure that the document +.\" outline is visible, each time the document is opened in Acrobat Reader. +.\" +.pdfview /PageMode /UseOutlines +.\" +.\" Initialise the outline view to show only three heading levels, +.\" with additional subordinate level headings folded. +.\" +.nr PDFOUTLINE.FOLDLEVEL 3 +.\" +.\" Add document identification meta-data +.\" +.pdfinfo /Title Portable Document Format Publishing with GNU Troff +.pdfinfo /Author Keith Marshall +.pdfinfo /Subject Tips and Techniques for Exploiting PDF Features with GNU Troff +.pdfinfo /Keywords groff troff PDF pdfmark +.\" +.\" Set the default cross reference format to indicate section numbers, +.\" rather than page numbers, when we insert a reference pointer. +.\" +.ds PDFHREF.INFO section \\*[SN-NO-DOT] \\$* +.\" +.\" Define a macro, to print reference links WITHOUT the usual "see" prefix. +.\" +.de XR-NO-PREFIX +.rn PDFHREF.PREFIX xx +.ds PDFHREF.PREFIX +.XR \\$@ +.rn xx PDFHREF.PREFIX +.. +.\" +.\" Define a string, +.\" to insert a Registered Trade Mark symbol as a superscript. +.\" +.ds rg \*{\(rg\*} +.\" +.\" Establish the page layout. +.\" +.nr PO 2.5c +.nr LL 17.0c +.nr LT 17.0c +.nr HY 0 +.nr FF 3 +.nr DI 5n +.\" +.\" Generate headers in larger point sizes, for NH levels < 4, +.\" with point size increasing by 1.5p, for each lesser NH level. +.\" +.nr GROWPS 4 +.nr PSINCR 1.5p +.\" +.de EM +.\".I "\s'+0.3'\\$1\s0" "\\$2" "\\$3" +.I \\$@ +.. +.de CWB +\\$5\fC\\$3\fP\f(CB\\$1\fP\fC\\$2\fP\\$4 +.. +.de CWI +\\$5\fC\\$3\fP\f(CI\\$1\fP\fC\\$2\fP\\$4 +.. +.de CWBI +\\$5\fC\\$3\fP\f[CBI]\\$1\fP\fC\\$2\fP\\$4 +.. +.ds = \f(CB\\$1\f(CR\\$4\f[CBI]\\$2\f(CR\\$3 +.\" +.NH 1 +.\" When we use numbered section headings, we might like to automatically +.\" insert a table of contents entry, using the text of the heading itself. +.\" The "ms" macros don't provide any standard mechanism for doing this, +.\" but "spdf.tmac" adds the "XN" macro, which will do it for us. +.\" +.\" Here's a simple example of how we might use it. In this case, the word +.\" "Introduction" will appear both in the body of the document, as the text +.\" of the heading, and it will be added to the table of contents, which is +.\" subsequently "printed" using the "TC" macro; in both locations, it will +.\" be prefixed by the section number. +.\" +.\" As an additional side effect, any use of "XN" will cause the table of +.\" contents entry to be automatically reproduced, with the exception of its +.\" page number reference, as a PDF document outline entry. Thus, the use +.\" of "XN" to specify numbered section headings results in the automatic +.\" creation of a numbered PDF document outline. This automatic creation +.\" of the outline is completely transparent, and will occur regardless +.\" of whether the "TC" macro is subsequently invoked, or not. +.\" +.XN Introduction +.\" +.\" If using an old s.tmac, without the SN-NO-DOT extension, +.\" make sure we get SOMETHING in section number references. +.\" +.if !dSN-NO-DOT .als SN-NO-DOT SN +.LP +It might appear that it is a fairly simple matter to +produce documents in Adobe\*(rg\~\(lqPortable\~Document\~Format\(rq, +commonly known as PDF, using +.CW groff ) GNU\~Troff\~( +as the document formatter. +Indeed, +.CW groff 's +default output format is the native Adobe\*(rg\~PostScript\*(rg format, +which PDF producers such as Adobe\*(rg Acrobat\*(rg Distiller\*(rg, +or GhostScript, expect as their input format. +Thus, the PDF production process would seem to entail simply +formatting the document source with +.CW groff , +to produce a PostScript\*(rg version of the document, +which can subsequently be processed by Acrobat\*(rg Distiller\*(rg +or GhostScript, to generate the final PDF document. +.LP +For many PDF production requirements, +the production cycle described above may be sufficient. +However, this is a limited PDF production method, +in which the resultant PDF document represents no more than +an on screen image of the printed form of the document, if +.CW groff 's +PostScript\*(rg output were printed directly. +.LP +The Portable Document Format provides a number of features, +which significantly enhance the experience of reading a document on screen, +but which are of little or no value to a document which is merely printed. +It +.EM is +possible to exploit these PDF features, which are described in the Adobe\*(rg +.\" +.de pdfmark-manual +.\" This is an example of a resource reference specified by URI ... +.\" We may need to refer often to the Adobe pdfmark Reference Manual, +.\" so we create the internet link definition using a macro, to make +.\" it reusable. +.\" +.\" Note also, that we protect the description of the reference by +.\" preceding it with "--", to avoid "invalid character in name" type +.\" error messages from groff (caused by the use of "\~"). +.\" +.pdfhref W -D http://partners.adobe.com/asn/acrobat/docs/pdfmark.pdf \ + -P \(lq -A \(rq\\$1 -- pdfmark\~Reference\~Manual +.. +.pdfmark-manual , +with some refinement of the simple PDF production method, provided +appropriate \(lqfeature implementing\(rq instructions can be embedded into +.CW groff 's +PostScript\*(rg rendering of the document. +This, of course, implies that the original document source, which +.CW groff +will process to generate the PostScript\*(rg description of the document, +must include appropriate markup to exploit the desired PDF features. +It is this preparation of the +.CW groff +document source to exploit a number of these features, +which provides the principal focus of this document. +.LP +The markup techniques to be described have been utilised in the production of +the PDF version of this document itself. +This has been formatted using +.CW groff 's +.CW ms +macro package; +thus, usage examples may be found in the document source file, +.CW \n(.F , +to which comments have been added, +to help identify appropriate markup examples for implementing PDF features, +such as:\(en +.QS +.IP \(bu +Selecting a default document view, which defines how the document will appear +when opened in the reader application; for example, when this document is +opened in Acrobat\*(rg\~Reader, it should display the top of the cover sheet, +in the document view pane, while a document outline should appear to the left, +in the \(lqBookmarks\(rq pane. +.IP \(bu +Adding document identification \(lqmeta\(hydata\(rq, +which can be accessed, in Acrobat\*(rg\~Reader, +by inspecting the \(lqFile\^/\^Document\~Properties\^/\^Summary\(rq. +.IP \(bu +Creating a document outline, which will be displayed in the \(lqBookmarks\(rq +pane of Acrobat\*(rg\~Reader, such that readers may quickly navigate to any +section of the document, simply by clicking on the associated heading +in the outline view. +.IP \(bu +Embedding active links in the body of the document, such that readers may +quickly navigate to related material at another location within the same +document, or in another PDF document, or even to a related Internet resource, +specified by its URI. +.IP \(bu +Adding annotations, in the form of \(lqsticky notes\(rq, at strategic +points within the PDF document. +.QE +.LP +All of the techniques described have been tested on +.EM both +GNU/Linux, and on Microsoft\*(rg Windows\(tm2000 operating platforms, using +.CW groff +.CW 1.19.1 ,\c +.pdfhref L -D footnote1 -- \** +.FS +.pdfhref M footnote1 +Later versions should, and some earlier versions may, be equally suitable. +See +.pdfhref W \*[GROFF-WEBSITE] +for information and availability of the latest version. +.FE +in association with +.CW AFPL +.CW GhostScript +.CW 8.14 .\c +.pdfhref L -D footnote2 -- \** +.FS +.pdfhref M footnote2 +Again, other versions may be suitable. +See +.pdfhref W http://ghostscript.com +for information and availability. +.FE +Other tools employed, which should be readily available on +.EM any +.SM +UNIX\(tm +.LG +or GNU/Linux system, are +.CW sed , +.CW awk +and +.CW make , +together with an appropriate text editor, for creating and marking up the +.CW groff +input files. +These additional utilities are not provided, as standard, +on the Microsoft\*(rg Windows\(tm platform, +but several third party implementations are available. +Some worth considering include the MKS\*(rg\~Toolkit,\** +.FS +A commercial offering; see +.pdfhref W http://mkssoftware.com/products/tk/default.asp +for information. +.FE +Cygwin,\** +.FS +A +.EM free +but comprehensive +.SM +POSIX +.LG +emulation environment and +.SM +UNIX\(tm +.LG +toolkit for 32\(hybit Microsoft\*(rg Windows\(tm platforms; see +.pdfhref W http://cygwin.com +for information and download. +.FE +or MSYS.\** +.FS +Another free, but minimal suite of common +.SM +UNIX\(tm +.LG +tools for 32\(hybit Microsoft\*(rg Windows\(tm, available for download from +.pdfhref W -A ; http://www.mingw.org +it +.EM does +include those tools listed above, +and is the package which was actually used when performing the Windows\(tm2000 +platform tests referred to in the text. +.FE +This list is by no means exhaustive, and should in no way be construed as an +endorsement of any of these packages, nor to imply that other similar packages, +which may be available, are in any way inferior to them. +.bp +.NH 1 +.\" We may wish a section heading to represent a named destination, +.\" so that we can create a linked reference to it, from some other +.\" part of the PDF document, (or even from another PDF document). +.\" +.\" Here we use the "-N" option of the "XN" macro, to create a named +.\" PDF link destination, at the location of the heading. Notice that +.\" we also use the "--" marker to separate the heading text from the +.\" preceding option specification; it is not strictly necessary in +.\" this case, but it does help to set off the heading text from the +.\" option specification. +.\" +.XN -N pdf-features -- Exploiting PDF Document Features +.LP +To establish a consistent framework for adding PDF features, a +.CW groff +macro package, named +.CW pdfmark.tmac , +has been provided. +Thus, to incorporate PDF features in a document, +the appropriate macro calls, as described below, may be placed in the +.CW groff +document source, which should then be processed with a +.CW groff +command of the form +.QP +.fam C +groff -Tps [-m +.I name "] -m" +.B pdfmark +.I options \& [- +.I "file ..." \& "...] " +.LP +It may be noted that the +.CW pdfmark +macros have no dependencies on, and no known conflicts with, +any other +.CW groff +macro package; thus, users are free to use any other macro package, +of their choice, to format their documents, while also using the +.CW pdfmark +macros to add PDF features. +.NH 2 +.XN -N pdfmark-operator -- The \F[C]pdfmark\F[] Operator +.LP +All PDF features are implemented by embedding instances of the +.B \F[C]pdfmark\F[] +operator, as described in the Adobe\*(rg +.pdfmark-manual , +into +.CW groff 's +PostScript\*(rg output stream. +To facilitate the use of this operator, the +.CW pdfmark +macro package defines the primitive +.CW pdfmark +macro; it simply emits its argument list, +as arguments to a +.CW pdfmark +operator, in the PostScript\*(rg output stream. +.LP +.pdfhref M -N pdfmark-example +To illustrate the use of the +.CW pdfmark +macro, the following is a much simplified example of how a bookmark +may be added to a PDF document outline +.QP +.CW ".pdfmark \e" +.RS 4 +.nf +.fam C +/Count 2 \e +/Title (An Example of a Bookmark with Two Children) \e +/View [/FitH \en[PDFPAGE.Y]] \e +/OUT +.RE +.LP +In general, users should rarely need to use the +.CW pdfmark +macro directly. +In particular, the above example is too simple for general use; it +.EM will +create a bookmark, but it does +.EM not +address the issues of setting the proper value for the +.CW /Count +key, nor of computing the +.CW PDFPAGE.Y +value used in the +.CW /View +key. The +.CW pdfmark +macro package includes a more robust mechanism for creating bookmarks, +.\" +.\" Here is an example of how a local reference may be planted, +.\" using the automatic formatting feature of the "pdfhref" macro. +.\" +.\" This is a forward reference to the named destination "add-outline", +.\" which is defined below, using the "XN" wrapper macro, from the +.\" "spdf.tmac" macro package. The automatically formatted reference +.\" will be enclosed in parentheses, as specified by the use of +.\" "-P" and "-A" options. +.\" +.pdfhref L -P ( -A ), -D add-outline +.\" +which addresses these issues automatically. +Nevertheless, the +.CW pdfmark +macro may be useful to users wishing to implement more advanced PDF features, +than those currently supported directly by the +.CW pdfmark +macro package. +.NH 2 +.XN -N docview -- Selecting an Initial Document View +.LP +By default, +when a PDF document is opened, +the first page will be displayed, +at the default magnification set for the reader, +and outline and thumbnail views will be hidden. +When using a PDF reader, +such as Acrobat\*(rg\~Reader, +which supports the +.CW /DOCVIEW +class of the +.CW pdfmark +operator, +these default initial view settings may be overridden, +using the +.CW pdfview +macro. +For example +.QP +.CW ".pdfview /PageMode /UseOutlines" +.LP +will cause Acrobat\*(rg\~Reader to open the document outline view, +to the left of the normal page view, +while +.QP +.CW ".pdfview /PageMode /UseThumbs" +.LP +will open the thumbnail view instead. +.LP +Note that the two +.CW /PageMode +examples, above, are mutually exclusive \(em it is not possible to have +.EM both +outline and thumbnail views open simultaneously. +However, it +.EM is +permitted to add +.CW /Page +and +.CW /View +keys, to force the document to open at a page other than the first, +or to change the magnification at which the document is initially displayed; +see the +.pdfmark-manual +for more information. +.LP +It should be noted that the view controlling meta\(hydata, defined by the +.CW pdfview +macro, is not written immediately to the PostScript\*(rg output stream, +but is stored in an internal meta\(hydata \(lqcache\(rq, +(simply implemented as a +.CW groff +diversion). +This \(lqcached\(lq meta\(hydata must be written out later, by invoking the +.CW pdfsync +macro, +.\" +.\" Here is another example of how we may introduce a forward reference. +.\" This time we are using the shorter notation afforded by the "XR" macro +.\" provided by "spdf.tmac"; this example is equivalent to the native +.\" "pdfmark.tmac" form +.\" .pdfhref L -D pdfsync -P ( -A ). +.\" +.XR pdfsync ). ( +.\" +.NH 2 +.XN -N docinfo -- Adding Document Identification Meta-Data +.LP +In addition to the +.CW /DOCVIEW +class of meta\(hydata described above, +.XR docview ), ( +we may also wish to include document identification meta\(hydata, +which belongs to the PDF +.CW /DOCINFO +class. +.LP +To do this, we use the +.CW pdfinfo +macro. +As an example of how it is used, +the identification meta\(hydata attached to this document +was specified using a macro sequence similar to:\(en +.DS I +.CW +\&.pdfinfo /Title PDF Document Publishing with GNU Troff +\&.pdfinfo /Author Keith Marshall +\&.pdfinfo /Subject How to Exploit PDF Features with GNU Troff +\&.pdfinfo /Keywords groff troff PDF pdfmark +.DE +Notice that the +.CW pdfinfo +macro is repeated, once for each +.CW /DOCINFO +record to be placed in the document. +In each case, the first argument is the name of the applicable +.CW /DOCINFO +key, which +.EM must +be named with an initial solidus character; +all additional arguments are collected together, +to define the value to be associated with the specified key. +.LP +As is the case with the +.CW pdfview +macro, +.XR docview ), ( +the +.CW /DOCINFO +records specified with the +.CW pdfinfo +macro are not immediately written to the PostScript\*(rg output stream; +they are stored in the same meta\(hydata cache as +.CW /DOCVIEW +specifications, until this cache is explicitly flushed, +by invoking the +.CW pdfsync +macro, +.XR pdfsync ). ( +.NH 2 +.XN -N add-outline -- Creating a Document Outline +.LP +A PDF document outline comprises a table of references, +to \(lqbookmarked\(rq locations within the document. +When the document is viewed in an \(lqoutline\~aware\(rq PDF document reader, +such as Adobe\*(rg Acrobat\*(rg Reader, +this table of \(lqbookmarks\(rq may be displayed in a document outline pane, +or \(lqBookmarks\(rq pane, to the left of the main document view. +Individual references in the outline view may then be selected, +by clicking with the mouse, +to jump directly to the associated marked location in the document view. +.LP +The document outline may be considered as a collection of \(lqhypertext\(rq +references to \(lqbookmarked\(rq locations within the document. +The +.CW pdfmark +macro package provides a single generalised macro, +.CW pdfhref , +for creating and linking to \(lqhypertext\(rq reference marks. +This macro will be described more comprehensively in a later section, +.XR pdfhref ); ( +the description here is restricted to its use for defining document outline entries. +.NH 3 +.XN -N basic-outline -- A Basic Document Outline +.LP +In its most basic form, the document outline comprises a structured list of headings, +each associated with a marked location, or \(lqbookmark\(rq, in the document text, +and a specification for how that marked location should be displayed, +when this bookmark is selected. +.LP +To create a PDF bookmark, the +.CW pdfhref +macro is used, +at the point in the document where the bookmark is to be placed, +in the form +.QP +.fam C +.B ".pdfhref O" +.I level > < +.I "descriptive text ..." +.LP +in which the reference class +.CWB O \& \& \(rq \(lq +stipulates that this is an outline reference. +.LP +Alternatively, for those users who may prefer to think of a document outline +simply as a collection of bookmarks, the +.CW pdfbookmark +macro is also provided \(em indeed, +.CW pdfhref +invokes it, when processing the +.CWB O \& \& \(rq \(lq +reference class operator. +It may be invoked directly, in the form +.QP +.fam C +.B .pdfbookmark +.I level > < +.I "descriptive text ..." +.LP +Irrespective of which of the above macro forms is employed, the +.CWI level > < +argument is required. +It is a numeric argument, defining the nesting level of the \(lqbookmark\(rq +in the outline hierarchy, with one being the topmost level. +Its function may be considered analagous to the +.EM "heading level" +of the document's section headings, +for example, as specified with the +.CW NH +macro, if using the +.CW ms +macros to format the document. +.LP +All further arguments, following the +.CWI level > < +argument, are collected together, to specify the heading text which will appear +in the document's outline view. +Thus, the outline entry for this section of this document, +which has a level three heading, +might be specified as +.QP +.CW +\&.pdfhref O 3 \*(SN A Basic Document Outline +.LP +or, in the alternative form using the +.CW pdfbookmark +macro, as +.QP +.CW +\&.pdfbookmark 3 \*(SN A Basic Document Outline +.NH 3 +.XN Hierarchical Structure in a Document Outline +.LP +When a document outline is created, using the +.CW pdfhref +macro as described in +.\" +.\" Here is an example of how we can temporarily modify the format of +.\" a reference link, in this case to indicate only the section number +.\" of the link target, in the form "section #", (or, if we define +.\" "SECREF.BEGIN" before the call, its content followed by the +.\" section number). +.\" +.\" We first define a macro, which will get the reference data from +.\" pdfhref, as arguments, and will return the formatted output, as we +.\" require it, the string "PDFHREF.TEXT". +.\" +.de SECREF +.while \\n(.$ \{\ +. ie '\\$1'section' \{\ +. if !dSECREF.BEGIN .ds SECREF.BEGIN \\$1 +. ds PDFHREF.TEXT \\*[SECREF.BEGIN]\~\\$2 +. rm SECREF.BEGIN +. shift \\n(.$ +. \} +. el .shift +. \} +.. +.\" We now tell "pdfhref" to use our formatting macro, in place of +.\" its builtin default formatter, before we specify the reference. +.\" +.pdfhref F SECREF +.pdfhref L -A , -D basic-outline +.\" +.\" At this point, we would normally revert the "pdfhref" formatter +.\" to use its default, built in macro. However, in this particular +.\" case, we want to use our custom format one more time, before we +.\" revert it, so we will omit the reversion step this time. +.\" +and any entry is added at a nesting level greater than one, +then a hierarchical structure is automatically defined for the outline. +However, as was noted in the simplified +.pdfhref L -D pdfmark-example -- example +in +.pdfhref L -A , -D pdfmark-operator +.\" +.\" And now, we revert to default "pdfhref" formatting behaviour, +.\" by completing the call we delayed above. +.\" +.pdfhref F +.\" +the data required by the +.CW pdfmark +operator to create the outline entry may not be fully defined, +when the outline reference is defined in the +.CW groff +document source. +Specifically, when the outline entry is created, its +.CW /Count +key must be assigned a value equal to the number of its subordinate entries, +at the next inner level of the outline hierarchy; +typically however, +these subordinate entries will be defined +.EM later +in the document source, and the appropriate +.CW /Count +value will be unknown, when defining the parent entry. +.LP +To resolve this paradox, the +.CW pdfhref +macro creates the outline entry in two distinct phases \(em +a destination marker is placed in the PostScript\*(rg output stream immediately, +when the outline reference is defined, +but the actual outline entry is stored in an internal \(lqoutline cache\(rq, +until its subordinate hierarchy has been fully defined; +it can then be inserted in the output stream, with its +.CW /Count +value correctly assigned. +Effectively, to ensure integrity of the document outline structure, +this means that each top level outline entry, and +.EM all +of its subordinates, are retained in the cache, until the +.EM next +top level entry is defined. +.LP +One potential problem, which arises from the use of the \(lqoutline cache\(rq, +is that, at the end of any document formatting run, the last top level outline entry, +and any subordinates defined after it, will remain in the cache, and will +.EM not +be automatically written to the output stream. +To avoid this problem, the user should follow the guidelines given in +.\" +.\" Here is a more conventional example of how to temporarily change +.\" to the format used to display reference links. We will again use +.\" the "SECREF" format, which we defined above, but on this occasion +.\" we will immediately revert to the default format, after the link +.\" has been placed. +.\" +.pdfhref F SECREF +.pdfhref L -D pdfsync -A , +.pdfhref F +.\" +to synchronise the output state with the cache state, +.XR pdfsync ), ( +at the end of the +.CW groff +formatting run. +.NH 3 +.XN -N outline-view -- Associating a Document View with an Outline Reference +.LP +Each \(lqbookmark\(rq entry, in a PDF document outline, +is associated with a specific document view. +When the reader selects any outline entry, +the document view changes to display the document context +associated with that entry. +.LP +The document view specification, +to be associated with any document outline entry, +is established at the time when the outline entry is created. +However, rather than requiring that each individual use of the +.CW pdhref +macro, to create an outline entry, +should include its own view specification, +the actual specification assigned to each entry is derived from +a generalised specification defined in the string +.CW PDFBOOKMARK.VIEW , +together with the setting of the numeric register +.CW PDFHREF.VIEW.LEADING , +which determine the effective view specification as follows:\(en +.QS +.IP \*[= PDFBOOKMARK.VIEW] +Establishes the magnification at which the document will be viewed, +at the location of the \(lqbookmark\(rq; by default, it is defined by +.RS +.QP +.CW ".ds PDFBOOKMARK.VIEW /FitH \e\en[PDFPAGE.Y] u" +.RE +.IP +which displays the associated document view, +with the \(lqbookmark\(rq location positioned at the top of the display window, +and with the magnification set to fit the page width to the width of the window. +.IP \*[= PDFHREF.VIEW.LEADING] +Specifies additional spacing, +to be placed between the top of the display window +and the actual location of the \(lqbookmark\(rq on the displayed page view. +By default, it is set as +.RS +.QP +.CW ".nr PDFHREF.VIEW.LEADING 5.0p" +.RE +.IP +Note that +.CW PDFHREF.VIEW.LEADING +does not represent true \(lqleading\(rq, in the typographical sense, +since any preceding text, set in the specified display space, +will be visible at the top of the document viewing window, +when the reference is selected. +.IP +Also note that the specification of +.CW PDFHREF.VIEW.LEADING +is shared by +.EM all +reference views defined by the +.CW pdfhref +macro; whereas +.CW PDFBOOKMARK.VIEW +is applied exclusively to outline references, +there is no independent +.CW PDFBOOKMARK.VIEW.LEADING +specification. +.QE +.LP +If desired, the view specification may be changed, by redefining the string +.CW PDFBOOKMARK.VIEW , +and possibly also the numeric register +.CW PDFHREF.VIEW.LEADING . +Any alternative definition for +.CW PDFBOOKMARK.VIEW +.EM must +be specified in terms of valid view specification parameters, +as described in the Adobe\*(rg +.pdfmark-manual . +.LP +Note the use of the register +.CW PDFPAGE.Y , +in the default definition of +.CW PDFBOOKMARK.VIEW +above. +This register is computed by +.CW pdfhref , +when creating an outline entry; +it specifies the vertical position of the \(lqbookmark\(rq, +in basic +.CW groff +units, relative to the +.EM bottom +edge of the document page on which it is defined, +and is followed, in the +.CW PDFBOOKMARK.VIEW +definition, by the +.CW grops +.CW u \(rq \(lq +operator, to convert it to PostScript\*(rg units on output. +It may be used in any redefined specification for +.CW PDFBOOKMARK.VIEW , +(or in the analogous definition of +.CW PDFHREF.VIEW , +described in +.XR-NO-PREFIX pdfhref-view ), +but +.EM not +in any other context, +since its value is undefined outside the scope of the +.CW pdfhref +macro. +.LP +Since +.CW PDFPAGE.Y +is computed relative to the +.EM bottom +of the PDF output page, +it is important to ensure that the page length specified to +.CW troff +correctly matches the size of the logical PDF page. +This is most effectively ensured, +by providing +.EM identical +page size specifications to +.CW groff , +.CW grops +and to the PostScript\*(rg to PDF converter employed, +and avoiding any page length changes within the document source. +.LP +Also note that +.CW PDFPAGE.Y +is the only automatically computed \(lqbookmark\(rq location parameter; +if the user redefines +.CW PDFBOOKMARK.VIEW , +and the modified view specification requires any other positional parameters, +then the user +.EM must +ensure that these are computed +.EM before +invoking the +.CW pdfhref +macro. +.NH 3 +.XN -N outline-folding -- Folding the Outline to Conceal Less Significant Headings +.LP +When a document incorporates many subheadings, +at deeply nested levels, +it may be desirable to \(lqfold\(rq the outline +such that only the major heading levels are initially visible, +yet making the inferior subheadings accessible, +by allowing the reader to expand the view of any heading branch on demand. +.LP +The +.CW pdfmark +macros support this capability, +through the setting of the +.CW PDFOUTLINE.FOLDLEVEL +register. +This register should be set to the number of heading levels +which it is desired to show in expanded form, in the +.EM initial +document outline display; +all subheadings at deeper levels will still be added to the outline, +but will not become visible until the outline branch containing them is expanded. +'ne 5 +For example, the setting used in this document: +.QS +.LD +.fam C +\&.\e" Initialise the outline view to show only three heading levels, +\&.\e" with additional subordinate level headings folded. +\&.\e" +\&.nr PDFOUTLINE.FOLDLEVEL 3 +.DE +.QE +.LP +results in only the first three levels of headings being displayed +in the document outline, +.EM until +the reader chooses to expand the view, +and so reveal the lower level headings in any outline branch. +.LP +The initial default setting of +.CW PDFOUTLINE.FOLDLEVEL , +if the document author does not choose to change it, +is 10,000. +This is orders of magnitude greater than the maximum heading level +which is likely to be used in any document; +thus the default behaviour will be to show document outlines fully expanded, +to display all headings defined, +at all levels within each document. +.LP +The setting of +.CW PDFOUTLINE.FOLDLEVEL +may be changed at any time; +however, the effect of each such change may be difficult to predict, +since it is applied not only to outline entries which are defined +.EM after +the setting is changed, +but also to any entries which remain in the outline cache, +.EM at +this time. +Therefore, it is recommended that +.CW PDFOUTLINE.FOLDLEVEL +should be set +.EM once , +at the start of each document; +if it +.EM is +deemed necessary to change it at any other time, +the outline cache should be flushed, +.XR pdfsync ), ( +.EM immediately +before the change, +which should immediately preceed a level one heading. +.NH 3 +.XN -N multipart-outline -- Outlines for Multipart Documents +.LP +When a document outline is created, using the +.CW pdfhref +macro, each reference mark is automatically assigned a name, +composed of a fixed stem followed by a serially generated numeric qualifier. +This ensures that, for each single part document, every outline reference +has a uniquely named destination. +.LP +As the overall size of the PDF document increases, +it may become convenient to divide it into smaller, +individually formatted PostScript\*(rg components, +which are then assembled, in the appropriate order, +to create a composite PDF document. +While this strategy may simplify the overall process of creating and +editing larger documents, it does introduce a problem in creating +an overall document outline, +since each individual PostScript\*(rg component will be assigned +duplicated sequences of \(lqbookmark\(rq names, +with each name ultimately referring to multiple locations in the composite document. +To avoid such reference naming conflicts, the +.CW pdfhref +macro allows the user to specify a \(lqtag\(rq, +which is appended to the automatically generated \(lqbookmark\(rq name; +this may be used as a discriminating mark, to distinguish otherwise +similarly named destinations, in different sections of the composite document. +.LP +To create a \(lqtagged\(rq document outline, +the syntax for invocation of the +.CW pdfhref +macro is modified, by the inclusion of an optional \(lqtag\(rq specification, +.EM before +the nesting level argument, i.e. +.QP +.fam C +.B ".pdfhref O" +.B -T \& [ +.I tag >] < +.I level > < +.I "descriptive text ..." +.LP +The optional +.CWI tag > < +argument may be composed of any characters of the user's choice; +however, its initial character +.EM "must not" +be any decimal digit, and ideally it should be kept short +\(em one or two characters at most. +.LP +By employing a different tag in each section, +the user can ensure that \(lqbookmark\(rq names remain unique, +throughout all the sections of a composite document. +For example, when using the +.CW spdf.tmac +macro package, which adds +.CW pdfmark +capabilities to the standard +.CW ms +package, +.XR using-spdf ), ( +the table of contents is collected into a separate PostScript\*(rg section +from the main body of the document. +In the \(lqbody\(rq section, the document outline is \(lquntagged\(rq, +but in the \(lqTable\~of\~Contents\(rq section, a modified version of the +.CW TC +macro adds an outline entry for the start of the \(lqTable\~of\~Contents\(rq, +invoking the +.CW pdfhref +macro as +.QP +.CW ".pdfhref O -T T 1 \e\e*[TOC]" +.LP +to tag the associated outline destination name with the single character suffix, +.CW T \(rq. \(lq +Alternatively, as in the case of the basic outline, +.XR basic-outline ), ( +this may equally well be specified as +.QP +.CW ".pdfbookmark -T T 1 \e\e*[TOC]" +.NH 3 +.XN Delegation of the Outline Definition +.LP +Since the most common use of a document outline +is to provide a quick method of navigating through a document, +using active \(lqhypertext\(rq links to chapter and section headings, +it may be convenient to delegate the responsibility of creating the outline +to a higher level macro, which is itself used to +define and format the section headings. +This approach has been adopted in the +.CW spdf.tmac +package, to be described later, +.XR using-spdf ). ( +.LP +When such an approach is adopted, +the user will rarely, if ever, invoke the +.CW pdfhref +macro directly, to create a document outline. +For example, the structure and content of the outline for this document +has been exclusively defined, using a combination of the +.CW NH +macro, from the +.CW ms +package, to establish the structure, and the +.CW XN +macro from +.CW spdf.tmac , +to define the content. +In this case, +the responsibility for invoking the +.CW pdfhref +macro, to create the document outline, +is delegated to the +.CW XN +macro. +.NH 2 +.XN -N pdfhref -- Adding Reference Marks and Links +.LP +.pdfhref F SECREF +.ds SECREF.BEGIN Section +.pdfhref L -D add-outline +.pdfhref F +has shown how the +.CW pdfhref +macro may be used to create a PDF document outline. +While this is undoubtedly a powerful capability, +it is by no means the only trick in the repertoire of this versatile macro. +.LP +The macro name, +.CW pdfhref , +which is a contraction of \(lqPDF HyperText Reference\(rq, +indicates that the general purpose of this macro is to define +.EM any +type of dynamic reference mark, within a PDF document. +Its generalised usage syntax takes the form +.QP +.fam C +.B .pdfhref +.BI class > < +.I "-options ...\&" ] [ +[--] +.I "descriptive text ...\&" ] [ +.LP +where +.CW <\f(CIclass\fP> +represents a required single character argument, +which defines the specific reference operation to be performed, +and may be selected from:\(en +.QS +.IP \*[= O] +Add an entry to the document outline. +This operation has been described earlier, +.XR add-outline ). ( +.IP \*[= M] +Place a \(lqnamed destination\(rq reference mark at the current output position, +in the current PDF document, +.XR mark-dest ). ( +.IP \*[= D] +Specify the content of a PDF document reference dictionary entry; +typically, such entries are generated automatically, +by transformation of the intermediate output resulting from the use of +.CW pdfhref +.CWB M \& \& \(rq, \(lq +with the +.CWB -X \& \& \(rq \(lq +modifier, +.XR create-map ); ( +however, it is also possible to specify such entries manually, +.XR user-format ). ( +.IP \*[= L] +Insert an active link to a named destination, +.XR link-named ), ( +at the current output position in the current PDF document, +such that when the reader clicks on the link text, +the document view changes to show the location of the named destination. +.IP \*[= W] +Insert an active link to a \(lqweb\(rq resource, +.XR add-weblink ), ( +at the current output position in the current PDF document. +This is effectively the same as using the +.CWB L \& \& \(rq \(lq +operator to establish a link to a named destination in another PDF document, +.XR link-extern ), ( +except that in this case, the destination is specified by a +\(lquniform resource identifier\(rq, or +.CW URI ; +this may represent any Internet or local resource +which can be specified in this manner. +.IP \*[= F] +Specify a user defined macro, to be called by +.CW pdfhref , +when formatting the text in the active region of a link, +.XR set-format ). ( +.IP \*[= Z] +Define the absolute position on the physical PDF output page, +where the \(lqhot\(hyspot\(rq associated with an active link is to be placed. +Invoked in pairs, marking the starting and ending PDF page co\(hyordinates +for each link \(lqhot\(hyspot\(rq, this operator is rarely, if ever, +specified directly by the user; +rather, appropriate +.CW pdfhref +.CWB Z \& \& \(rq \(lq +specifications are inserted automatically into the document reference map +during the PDF document formatting process, +.XR create-map ). ( +.IP \*[= I] +Initialise support for +.CW pdfhref +features. +The current +.CW pdfhref +implementation provides only one such feature which requires initialisation +\(em a helper macro which must be attached to a user supplied page trap handler, +in order to support mapping of reference \(lqhot\(hyspots\(rq +which extend through a page transition; +.XR page-trap ). ( +.QE +.NH 3 +.XN Optional Features of the \F[C]pdfhref\F[] Macro +.LP +The behaviour of a number of the +.CW pdfhref +macro operations can be modified, +by including +.EM "option specifiers" \(rq \(lq +after the operation specifying argument, +but +.EM before +any other arguments normally associated with the operation. +In +.EM all +cases, an option is specified by an +.EM "option flag" \(rq, \(lq +comprising an initial hyphen, +followed by one or two option identifying characters. +Additionally, +.EM some +options require +.EM "exactly one" +option argument; +for these options, the argument +.EM must +be specified, and it +.EM must +be separated from the preceding option flag by one or more +.EM spaces , +(tabs +.EM "must not" +be used). +It may be noted that this paradigm for specifying options +is reminiscent of most +.SM +UNIX\(tm +.LG +shells; however, in the case of the +.CW pdfhref +macro, omission of the space separating an option flag from its argument is +.EM never +permitted. +.LP +A list of +.EM all +general purpose options supported by the +.CW pdfhref +macro is given below. +Note that not all options are supported for all +.CW pdfhref +operations; the operations affected by each option are noted in the list. +For +.EM most +operations, if an unsupported option is specified, +it will be silently ignored; however, this behaviour should +not be relied upon. +.LP +The general purpose options, supported by the +.CW pdfhref +macro, are:\(en +.QS +.IP \*[= -N\0 name > <] +Allows the +.CWI name > < +associated with a PDF reference destination +to be defined independently from the following text, +which describes the reference. +This option affects only the +.CWB M \& \& \(rq \(lq +operation of the +.CW pdfhref +macro, +.XR mark-dest ). ( +.IP \*[= -E] +Also used exclusively with the +.CWB M \& \& \(rq \(lq +operator, the +.CWB -E +option causes any specified +.CWI descriptive \& \& \~\c +.CWI text +arguments, +.XR mark-dest ), ( +to be copied, or +.EM echoed , +in the body text of the document, +at the point where the reference mark is defined; +(without the +.CWB -E +option, such +.CWI descriptive \& \& \~\c +.CWI text +will appear +.EM only +at points where links to the reference mark are placed, +and where the standard reference display format, +.XR set-format ), ( +is used). +.IP \*[= -D\0 dest > <] +Specifies the +.CW URI , +or the destination name associated with a PDF active link, +independently of the following text, +which describes the link and demarcates the link \(lqhot\(hyspot\(rq. +This option affects the behaviour of the +.CW pdfhref +macro's +.CWB L \& \& \(rq \(lq +and +.CWB W \& \& \(rq \(lq +operations. +.IP +When used with the +.CWB L \& \& \(rq \(lq +operator, the +.CWI dest > < +argument must specify a PDF \(lqnamed destination\(rq, +as defined using +.CW pdfhref +with the +.CWB M \& \& \(rq \(lq +operator. +.IP +When used with the +.CWB W \& \& \(rq \(lq +operator, +.CWI dest > < +must specify a link destination in the form of a +\(lquniform resource identifier\(rq, or +.CW URI , +.XR add-weblink ). ( +.IP \*[= -F\0 file > <] +When used with the +.CWB L \& \& \(rq \(lq +.CW pdfhref +operator, +.CWI file > < +specifies an external PDF file in which the named destination +for the link reference is defined. +This option +.EM must +be specified with the +.CWB L \& \& \(rq \(lq +operator, +to create a link to a destination in a different PDF document; +when the +.CWB L \& \& \(rq \(lq +operator is used +.EM without +this option, the link destination is assumed to be defined +within the same document. +.IP \*[= -P\0 \(dqprefix\(hytext\(dq > <] +Specifies +.CWI \(dqprefix\(hytext\(dq > < +to be attached to the +.EM start +of the text describing an active PDF document link, +with no intervening space, but without itself being included in the +active area of the link \(lqhot\(hyspot\(rq; +it is effective with the +.CWB L \& \& \(rq \(lq +and +.CWB W \& \& \(rq \(lq +.CW pdfhref +operators. +.IP +Typically, this option would be used to insert punctuation before +the link \(lqhot\(hyspot\(rq. +Thus, there is little reason for the inclusion of spaces in +.CWI \(dqprefix\(hytext\(dq > < ; +however, if such space is required, then the enclosing double quotes +.EM must +be specified, as indicated. +.IP \*[= -A\0 \(dqaffixed\(hytext\(dq > <] +Specifies +.CWI \(dqaffixed\(hytext\(dq > < +to be attached to the +.EM end +of the text describing an active PDF document link, +with no intervening space, but without itself being included in the +active area of the link \(lqhot\(hyspot\(rq; +it is effective with the +.CWB L \& \& \(rq \(lq +and +.CWB W \& \& \(rq \(lq +.CW pdfhref +operators. +.IP +Typically, this option would be used to insert punctuation after +the link \(lqhot\(hyspot\(rq. +Thus, there is little reason for the inclusion of spaces in +.CWI \(dqaffixed\(hytext\(dq > < ; +however, if such space is required, then the enclosing double quotes +.EM must +be specified, as indicated. +.IP \*[= -T\0 tag > <] +When specified with the +.CWB O \& \& \(rq \(lq +operator, +.CWI tag > < +is appended to the \(lqbookmark\(rq name assigned to the generated outline entry. +This option is +.EM required , +to distinguish between the series of \(lqbookmark\(rq names generated in +individual passes of the +.CW groff +formatter, when the final PDF document is to be assembled +from a number of separately formatted components; +.XR multipart-outline ). ( +.IP \*[= -X] +This +.CW pdfhref +option is used with either the +.CWB M \& \& \(rq \(lq +operator, or with the +.CWB L \& \& \(rq \(lq +operator. +.IP +When used with the +.CWB M \& \& \(rq \(lq +operator, +.XR mark-dest ), ( +it ensures that a cross reference record for the marked destination +will be included in the document reference map, +.XR export-map ). ( +.IP +When used with the +.CWB L \& \& \(rq \(lq +operator, +.XR link-named ), ( +it causes the reference to be displayed in the standard cross reference format, +.XR set-format ), ( +but substituting the +.CWI descriptive \& \& \~\c +.CWI text +specified in the +.CW pdfhref \& \(lq +.CW L \(rq +argument list, +for the description specified in the document reference map. +.IP \*[= --] +Marks the end of the option specifiers. +This may be used with all +.CW pdfhref +operations which accept options, to prevent +.CW pdfhref +from interpreting any following arguments as option specifiers, +even if they would otherwise be interpreted as such. +It is also useful when the argument list to +.CW pdfhref +contains special characters \(em any special character, +which is not legal in a +.CW groff +macro name, will cause a parsing error, if +.CW pdfhref +attempts to match it as a possible option flag; +using the +.CW -- \(rq \(lq +flag prevents this, so suppressing the +.CW groff +warning message, which would otherwise ensue. +.IP +Using this flag after +.EM all +sequences of macro options is recommended, +even when it is not strictly necessary, +if only for the entirely cosmetic benefit of visually separating +the main argument list from the sequence of preceding options. +.QE +.LP +In addition to the +.CW pdfhref +options listed above, a supplementary set of two character options are defined. +These supplementary options, listed below, are intended for use with the +.CWB L \& \& \(rq \(lq +operator, in conjunction with the +.CWB -F \& \& \~\c +.CWBI file > < +option, to specify alternate file names, +in formats compatible with the file naming conventions +of alternate operating systems; +they will be silently ignored, if used in any other context. +.LP +The supported alternate file name options, +which are ignored if the +.CWB -F \& \& \~\c +.CWBI file > < +option is not specified, are:\(en +.QS +.IP \*[= -DF\0 dos\(hyfile > <] +Specifies the name of the file in which a link destination is defined, +using the file naming semantics of the +.CW MS\(hyDOS \*(rg +operating system. +When the PDF document is read on a machine +where the operating system uses the +.CW MS\(hyDOS \*(rg +file system, then +.CWI dos\(hyfile > < +is used as the name of the file containing the reference destination, +overriding the +.CWI file > < +argument specified with the +.CWB -F +option. +.IP \*[= -MF\0 mac\(hyfile > <] +Specifies the name of the file in which a link destination is defined, +using the file naming semantics of the +.CW Apple \*(rg +.CW Macintosh \*(rg +operating system. +When the PDF document is read on a machine +where the operating system uses the +.CW Macintosh \*(rg +file system, then +.CWI mac\(hyfile > < +is used as the name of the file containing the reference destination, +overriding the +.CWI file > < +argument specified with the +.CWB -F +option. +.IP \*[= -UF\0 unix\(hyfile > <] +Specifies the name of the file in which a link destination is defined, +using the file naming semantics of the +.CW UNIX \(tm +operating system. +When the PDF document is read on a machine +where the operating system uses +.CW POSIX +file naming semantics, then +.CWI unix\(hyfile > < +is used as the name of the file containing the reference destination, +overriding the +.CWI file > < +argument specified with the +.CWB -F +option. +.IP \*[= -WF\0 win\(hyfile > <] +Specifies the name of the file in which a link destination is defined, +using the file naming semantics of the +.CW MS\(hyWindows \*(rg +32\(hybit operating system. +When the PDF document is read on a machine +where the operating system uses any of the +.CW MS\(hyWindows \*(rg +file systems, with long file name support, then +.CWI win\(hyfile > < +is used as the name of the file containing the reference destination, +overriding the +.CWI file > < +argument specified with the +.CWB -F +option. +.QE +.NH 3 +.XN -N mark-dest -- Marking a Reference Destination +.LP +The +.CW pdfhref +macro may be used to create active links to any Internet resource, +specified by its +.CW URI , +or to any \(lqnamed destination\(rq, +either within the same document, or in another PDF document. +Although the PDF specification allows link destinations to be defined +in terms of a page number, and an associated view specification, +this style of reference is not currently supported by the +.CW pdfhref +macro, because it is not possible to adequately bind the specification +for the destination with the intended reference context. +.LP +References to Internet resources are interpreted in accordance with the +.CW W3C +standard for defining a +.CW URI ; +hence the only prerequisite, for creating a link to any Internet resource, +is that the +.CW URI +be properly specified, when declaring the reference; +.XR add-weblink ). ( +In the case of references to \(lqnamed destinations\(rq in PDF documents, +however, it is necessary to provide a mechanism for creating such +\(lqnamed destinations\(rq. +This may be accomplished, by invoking the +.CW pdfhref +macro in the form +.QP +.fam C +.B ".pdfhref M" +.B -N \& [ +.I name >] < +.B -X ] [ +.B -E ] [ +.I "descriptive text ...\&" ] [ +.LP +This creates a \(lqnamed destination\(rq reference mark, with its name specified by +.CWI name > < , +or, if the +.CWB -N +option is not specified, by the first word of +.CWI descriptive \& \& \~\c +.CWI text \& \& ; +(note that this imposes the restriction that, +if the +.CWB -N +option is omitted, then +.EM "at least" +one word of +.CWI descriptive \& \& \~\c +.CWI text +.EM must +be specified). +Additionally, a reference view will be automatically defined, +and associated with the reference mark, +.XR pdfhref-view ), ( +.\" and, if any +.\" .CWI descriptive +.\" .CWI text +.\" is specified, or the +and, if the +.CWB -X +option is specified, and no document cross reference map has been imported, +.XR import-map ), ( +then a cross reference mapping record, +.XR export-map ), ( +will be written to the +.CW stdout +stream; +this may be captured, and subsequently used to generate a cross reference map +for the document, +.XR create-map ). ( +.LP +When a \(lqnamed destination\(rq reference mark is created, using the +.CW pdfhref +macro's +.CWB M \& \& \(rq \(lq +operator, there is normally no visible effect in the formatted document; any +.CWI descriptive \& \& \~\c +.CWI text +which is specified will simply be stored in the cross reference map, +for use when a link to the reference mark is created. +This default behaviour may be changed, by specifying the +.CWB -E +option, which causes any specified +.CWI descriptive \& \& \~\c +.CWI text +to be \(lqechoed\(rq in the document text, +at the point where the reference mark is placed, +in addition to its inclusion in the cross reference map. +.NH 4 +.XN -N export-map -- Mapping a Destination for Cross Referencing +.LP +Effective cross referencing of +.EM any +document formatted by +.CW groff +requires multiple pass formatting. +Details of how this multiple pass formatting may be accomplished, +when working with the +.CW pdfmark +macros, will be discussed later, +.XR do-xref ); ( +at this stage, the discussion will be restricted to the initial preparation, +which is required at the time when the cross reference destinations are defined. +.LP +The first stage, in the process of cross referencing a document, +is the generation of a cross reference map. +Again, the details of +.EM how +the cross reference map is generated will be discussed in +.pdfhref F SECREF L -D do-xref -A ; +.pdfhref F +however, it is important to recognise that +.EM what +content is included in the cross reference map is established +when the reference destination is defined \(em it is derived +from the reference data exported on the +.CW stderr +stream by the +.CW pdfhref +macro, when it is invoked with the +.CWB M \& \& \(rq \(lq +operator, and is controlled by whatever definition of the string +.CW PDFHREF.INFO +is in effect, when the +.CW pdfhref +macro is invoked. +.LP +The initial default setting of +.CW PDFHREF.INFO +is +.QP +.CW ".ds PDFHREF.INFO page \e\en% \e\e$*" +.LP +which ensures that the cross reference map will contain +at least a page number reference, supplemented by any +.CWI descriptive \& \& \~\c +.CWI text +which is specified for the reference mark, as defined by the +.CW pdfhref +macro, with its +.CWB M \& \& \(rq \(lq +operator; this may be redefined by the user, +to export additional cross reference information, +or to modify the default format for cross reference links, +.XR set-format ). ( +.NH 4 +.XN -N pdfhref-view -- Associating a Document View with a Reference Mark +.LP +In the same manner as each document outline reference, defined by the +.CW pdfhref +macro with the +.CWB O \& \& \(rq \(lq +operator, +.XR add-outline ), ( +has a specific document view associated with it, +each reference destination marked by +.CW pdfhref +with the +.CWB M \& \& \(rq \(lq +operator, requires an associated document view specification. +.LP +The mechanism whereby a document view is associated with a reference mark +is entirely analogous to that employed for outline references, +.XR outline-view ), ( +except that the +.CW PDFHREF.VIEW +string specification is used, in place of the +.CW PDFBOOKMARK.VIEW +specification. +Thus, the reference view is defined in terms of:\(en +.QS +.IP \*[= PDFHREF.VIEW] +A string, +establishing the position of the reference mark within the viewing window, +and the magnification at which the document will be viewed, +at the location of the marked reference destination; +by default, it is defined by +.RS +.QP +.CW ".ds PDFHREF.VIEW /FitH \e\en[PDFPAGE.Y] u" +.RE +.IP +which displays the reference destination at the top of the viewing window, +with the magnification set to fit the page width to the width of the window. +.IP \*[= PDFHREF.VIEW.LEADING] +A numeric register, +specifying additional spacing, to be placed between the top of the display +window and the actual position at which the location of the reference +destination appears within the window. +This register is shared with the view specification for outline references, +and thus has the same default initial setting, +.RS +.QP +.CW ".nr PDFHREF.VIEW.LEADING 5.0p" +.RE +.IP +as in the case of outline reference views. +.IP +Again, notice that +.CW PDFHREF.VIEW.LEADING +does not represent true typographic \(lqleading\(rq, +since any preceding text, set in the specified display space, +will be visible at the top of the viewing window, +when the reference is selected. +.QE +.LP +Just as the view associated with outline references may be changed, +by redefining +.CW PDFBOOKMARK.VIEW , +so the view associated with marked reference destinations may be changed, +by redefining +.CW PDFHREF.VIEW , +and, if desired, +.CW PDFHREF.VIEW.LEADING ; +such changes will become effective for all reference destinations marked +.EM after +these definitions are changed. +(Notice that, since the specification of +.CW PDFHREF.VIEW.LEADING +is shared by both outline reference views and marked reference views, +if it is changed, then the views for +.EM both +reference types are changed accordingly). +.LP +It may again be noted, that the +.CW PDFPAGE.Y +register is used in the definition of +.CW PDFHREF.VIEW , +just as it is in the definition of +.CW PDFBOOKMARK.VIEW ; +all comments in +.pdfhref F SECREF L -D outline-view +.pdfhref F +relating to its use, and indeed to page position computations in general, +apply equally to marked reference views and to outline reference views. +.NH 3 +.XN -N link-named -- Linking to a Marked Reference Destination +.LP +Any named destination, such as those marked by the +.CW pdfhref +macro, using it's +.CWB M \& \& \(rq \(lq +operator, may be referred to from any point in +.EM any +PDF document, using an +.EM "active link" ; +such active links are created by again using the +.CW pdfhref +macro, but in this case, with the +.CWB L \& \& \(rq \(lq +operator. +This operator provides support for two distinct cases, +depending on whether the reference destination is defined in +the same document as the link, +.XR link-intern ), ( +or is defined as a named destination in a different PDF document, +.XR link-extern ). ( +.NH 4 +.XN -N link-intern -- References within a Single PDF Document +.LP +The general syntactic form for invoking the +.CW pdfhref +macro, +when creating a link to a named destination within the same PDF document is +.QP +.fam C +.B .pdfhref +.B L +.B -D \& [ +.BI dest-name >] < +.B -P \& [ +.BI prefix-text >] < +.B -A \& [ +.BI affixed-text >] < +\e +.br +\0\0\0 +.B -X ] [ +.B -- ] [ +.I "descriptive text ...\&" ] [ +.LP +where +.CWI dest-name > < +specifies the name of the link destination, +as specified using the +.CW pdfhref +.CWB M \& \& \(rq \(lq +operation; (it may be defined either earlier in the document, +to create a backward reference, or later, to create a forward reference). +.\" +.\" Here's a example of how to add an iconic annotation. +.\" +.\".pdfnote -T "Internal Cross References" \ +.\" This description is rather terse, and could benefit from \ +.\" the inclusion of an example. +.LP +If any +.CWI descriptive \& \& \~\c +.CWI text +arguments are specified, then they will be inserted into the +.CW groff +output stream, to define the text appearing in the \(lqhot\(hyspot\(rq +region of the link; +this will be printed in the link colour specified by the string, +.CW PDFHREF.TEXT.COLOUR , +which is described in +.XR-NO-PREFIX set-colour . +If the +.CWB -X +option is also specified, then the +.CWI descriptive \& \& \~\c +.CWI text +will be augmented, by prefacing it with page and section number indicators, +in accordance with the reference formatting rules which are in effect, +.XR set-format ); ( +such indicators will be included within the active link region, +and will also be printed in the link colour. +.LP +Note that +.EM either +the +.CWB -D \& \& \~\c +.CWBI dest\(hyname > < +option, +.EM or +the +.CWI descriptive \& \& \~\c +.CWI text +arguments, +.EM "but not both" , +may be omitted. +If the +.CWB -D \& \& \~\c +.CWBI dest\(hyname > < +option is omitted, then the first word of +.CWI descriptive \& \& \~\c +.CWI text \& \& , +i.e.\~all text up to but not including the first space, +will be interpreted as the +.CWBI dest\(hyname > < +for the link; this text will also appear in the running text of the document, +within the active region of the link. +Alternatively, if the +.CWB -D \& \& \~\c +.CWBI dest\(hyname > < +option +.EM is +specified, and +.CWI descriptive \& \& \~\c +.CWI text +is not, +then the running text which defines the reference, +and its active region, +will be derived from the reference description which is specified +when the named destination is marked, +.XR mark-dest ), ( +and will be formatted according to the reference formatting rules +which are in effect, when the reference is placed, +.XR set-format ); ( +in this case, it is not necessary to specify the +.CWB -X +option to activate automatic formatting of the reference \(em it is implied, +by the omission of all +.CWI descriptive \& \& \~\c +.CWI text +arguments. +.LP +The +.CWB -P \& \& \~\c +.CWBI prefix\(hytext > < +and +.CWB -A \& \& \~\c +.CWBI affixed\(hytext > < +options may be used to specify additional text +which will be placed before and after the linked text respectively, +with no intervening space. +Such prefixed and affixed text will be printed in the normal text colour, +and will not be included within the active region of the link. +This feature is mostly useful for creating parenthetical references, +or for placing punctuation adjacent to, +but not included within, +the text which defines the active region of the link. +.LP +The operation of the +.CW pdfhref +macro, when used with its +.CWB L \& \& \(rq \(lq +operator to place a link to a named PDF destination, +may best be illustrated by an example. +However, since the appearance of the link will be influenced by +factors established when the named destination is marked, +.XR mark-dest ), ( +and also by the formatting rules in effect when the link is placed, +the presentation of a suitable exanple will be deferred, +until the formatting mechanism has been explained, +.XR set-format ). ( +.NH 4 +.XN -N link-extern -- References to Destinations in Other PDF Documents +.LP +The +.CW pdfhref +macro's +.CWB L \& \& \(rq \(lq +operator is not restricted to creating reference links +within a single PDF document. +When the link destination is defined in a different document, +then the syntactic form for invoking +.CW pdfhref +is modified, by the addition of options to specify the +name and location of the PDF file in which the destination is defined. +Thus, the extended +.CW pdfhref +syntactic form becomes +.QP +.fam C +.B .pdfhref +.B L +.B -F +.BI file > < +.B -D \& [ +.BI dest-name >] < +\e +.br +\0\0\0 +.B -DF \& [ +.BI dos-file >] < +.B -MF \& [ +.BI mac-file >] < +.B -UF \& [ +.BI unix-file >] < +\e +.br +\0\0\0 +.B -WF \& [ +.BI win-file >] < +.B -P \& [ +.BI prefix-text >] < +.B -A \& [ +.BI affixed-text >] < +\e +.br +\0\0\0 +.B -X ] [ +.B -- ] [ +.I "descriptive text ...\&" ] [ +.LP +where the +.CWB -F \& \& \~\c +.CWBI file > < +option serves +.EM two +purposes: it both indicates to the +.CW pdfhref +macro that the specified reference destination +is defined in an external PDF file, +and it also specifies the normal path name, +which is to be used to locate this file, +when a user selects the reference. +.LP +In addition to the +.CWB -F \& \& \~\c +.CWBI file > < +option, which +.EM must +be specified when referring to a destination in an external PDF file, +the +.CWB -DF \& \& \~\c +.CWBI dos\(hyfile > < , +.CWB -MF \& \& \~\c +.CWBI mac\(hyfile > < , +.CWB -UF \& \& \~\c +.CWBI unix\(hyfile > < +and +.CWB -WF \& \& \~\c +.CWBI win\(hyfile > < +options may be used to specify the location of the file +containing the reference destination, +in a variety of operating system dependent formats. +These options assign their arguments to the +.CW /DosFile , +.CW /MacFile , +.CW /UnixFile +and +.CW /WinFile +keys of the generated +.CW pdfmark +respectively; thus when any of these options are specified, +.EM "in addition to" +the +.CWB -F \& \& \~\c +.CWBI file > < +option, and the document is read on the appropriate operating systems, +then the path names specified by +.CWBI dos\(hyfile > < , +.CWBI mac\(hyfile > < , +.CWBI unix\(hyfile > < +and +.CWBI win\(hyfile > < +will be searched, +.EM instead +of the path name specified by +.CWBI file > < , +for each of the +.CW MS\(hyDOS \*(rg, +.CW Apple \*(rg +.CW Macintosh \*(rg, +.CW UNIX \(tm +and +.CW MS\(hyWindows \*(rg +operating systems, respectively; see the +.pdfmark-manual , +for further details. +.LP +Other than the use of these additional options, +which specify that the reference destination is in an external PDF file, +the behaviour of the +.CW pdfhref +.CWB L \& \& \(rq \(lq +operator, with the +.CWB -F \& \& \~\c +.CWBI file > < +option, remains identical to its behaviour +.EM without +this option, +.XR link-intern ), ( +with respect to the interpretation of other options, +the handling of the +.CWI descriptive \& \& \~\c +.CWI text +arguments, and the formatting of the displayed reference. +.LP +Once again, since the appearance of the reference is determined by +factors specified in the document reference map, +and also by the formatting rules in effect when the reference is placed, +the presentation of an example of the placing of +a reference to an external destination will be deferred, +until the formatting mechanism has been explained, +.XR set-format ). ( +.NH 3 +.XN -N add-weblink -- Linking to Internet Resources +.LP +In addition to supporting the creation of cross references +to named destinations in PDF documents, the +.CW pdfhref +macro also has the capability to create active links to Internet resources, +or indeed to +.EM any +resource which may be specified by a Uniform Resource Identifier, +(which is usually abbreviated to the acronym \(lqURI\(rq, +and sometimes also referred to as a Uniform Resource Locator, +or \(lqURL\(rq). +.LP +Since the mechanism for creating a link to a URI differs somewhat +from that for creating PDF references, the +.CW pdfhref +macro is invoked with the +.CWB W \& \& \(rq \(lq +(for \(lqweb\(hylink\(rq) operator, rather than the +.CWB L \& \& \(rq \(lq +operator; nevertheless, the invocation syntax is similar, having the form +.QP +.fam C +.B .pdfhref +.B W +.B -D \& [ +.BI URI >] < +.B -P \& [ +.BI prefix-text >] < +.B -A \& [ +.BI affixed-text >] < +\e +.br +\0\0\0 +.B -- ] [ +.I "descriptive text ...\&" +.LP +where the optional +.CWB -D +.CWBI URI > < +modifier specifies the address for the target Internet resource, +in any appropriate +.EM "Uniform Resource Identifier" +format, while the +.CWI descriptive +.CWI text +argument specifies the text which is to appear in the \(lqhot\(hyspot\(rq +region, and the +.CWB -P +.CWBI prefix\(hytext > < +and +.CWB -A +.CWBI affixed\(hytext > < +options have the same effect as in the case of local document links, +.XR link-intern ). ( +.LP +Notice that it is not mandatory to include the +.CWB -D +.CWBI URI > < +in the link specification; if it +.EM is +specified, then it is not necessary for the URI to appear, +in the running text of the document \(em the +.CWI descriptive +.CWI text +argument exactly defines the text +which will appear within the \(lqhot\(hyspot\(rq region, +and this need not include the URI. +However, if the +.CWB -D \& \& \~\c +.CWBI URI > < +specification is omitted, then the +.CWI descriptive +.CWI text +argument +.EM must +be an +.EM exact +representation of the URI, which +.EM will , +therefore, appear as the entire content of the \(lqhot\(hyspot\(rq. +For example, we could introduce a reference to +.pdfhref W -D \*[GROFF-WEBSITE] -A , the groff web site +in which the actual URI is concealed, by using mark up such as:\(en +.DS I +.CW +For example, we could introduce a reference to +\&.pdfhref W -D \*[GROFF-WEBSITE] -A , the groff web site +in which the actual URI is concealed, +.DE +Alternatively, +to refer the reader to the groff web site, +making it obvious that the appropriate URI is +.pdfhref W -A , \*[GROFF-WEBSITE] +the requisite mark up might be:\(en +.DS I +.CW +to refer the reader to the groff web site, +making it obvious that the appropriate URI is +\&.pdfhref W -A , \*[GROFF-WEBSITE] +the requisite mark up might be:\e(en +.DE +.NH 3 +.XN -N set-format -- Establishing a Format for References +.LP +There are two principal aspects to be addressed, +when defining the format to be used when displaying references. +Firstly, it is desirable to provide a visual cue, +to indicate that the text describing the reference is imbued +with special properties \(em it is dynamically linked to the reference +destination \(em and secondly, the textual content should +describe where the link leads, and ideally, +it should also describe the content of the reference destination. +.LP +The visual cue, +that a text region defines a dynamically linked reference, +is most commonly provided by printing the text within the active +region in a distinctive colour. +This technique will be employed automatically by the +.CW pdfhref +macro \(em +.XR set-colour +\(em unless the user specifically chooses to adopt, and implement, +some alternative strategy. +.NH 4 +.XN -N set-colour -- Using Colour to Demarcate Link Regions +.LP +Typically, when a PDF document contains +.EM active +references to other locations, either within the same document, +or even in other documents, or on the World Wide Web, +it is usually desirable to make the regions +where these active links are placed stand out from the surrounding text. +.NH 4 +.XN -N user-format -- Specifying Reference Text Explicitly +.NH 4 +.XN -N auto-format -- Using Automatically Formatted Reference Text +.NH 4 +.XN -N custom-format -- Customising Automatically Formatted Reference Text +.LP +It is incumbent on the user, +if employing automatic formatting of the displayed reference, +.XR set-format ), ( +to ensure that an appropriate reference definition +is created for the reference destination, +and is included in the reference map for the document +in which the reference will appear; +thus, it may be easiest to +.EM always +use manual formatting for external references. +.NH 3 +.XN Problematic Links +.LP +Irrespective of whether a +.CW pdfhref +reference is placed using the +.CWB L \& \& \(rq \(lq +operator, or the +.CWB W \& \& \(rq \(lq +operator, there may be occasions when the resulting link +does function as expected. +A number of scenarios, which are known to be troublesome, +are described below. +.NH 4 +.XN -N page-trap -- Links with a Page Transition in the Active Region +.LP +When a link is placed near the bottom of a page, +it is possible that its active region, or \(lqhot\(hyspot\(rq, +may extend on to the next page. +In this situation, a page trap macro is required +to intercept the page transition, and to restart the mapping of +the \(lqhot\(hyspot\(rq boundary on the new page. +.LP +The +.CW pdfmark +macro package includes a suitable page trap macro, to satisfy this requirement. +However, to avoid pre\(hyempting any other requirement the user may have for +a page transition trap, this is +.EM not +installed as an active page trap, +unless explicitly requested by the user. +.LP +To enable proper handling of page transitions, +which occur within the active regions of reference links, +the user should:\(en +.QS +.nr ITEM 0 1 +.IP \n+[ITEM]. +Define a page transition macro, to provide whatever features may be required, +when a page transition occurs \(em e.g.\& printing footnotes, +adding page footers and headers, etc. +This macro should end by setting the output position at the correct +vertical page offset, where the printing of running text is to restart, +following the page transition. +.IP \n+[ITEM]. +Plant a trap to invoke this macro, at the appropriate vertical position +marking the end of normal running text on each page. +.KS +.IP \n+[ITEM]. +Initialise the +.CW pdfhref +hook into this page transition trap, by invoking +.RS +.IP +.fam C +.B "pdfhref I -PT" +.BI macro-name > < +.LP +where +.CWBI macro-name > < +is the name of the user supplied page trap macro, +to ensure that +.CW pdfhref +will correctly restart mapping of active link regions, +at the start of each new page. +.KE +.RE +.QE +.LP +It may be observed that this initialisation of the +.CW pdfhref +page transition hook is, typically, required only once +.EM before +document formatting begins. +Users of document formatting macro packages may reasonably expect that +this initialisation should be performed by the macro package itself. +Thus, writers of such macro packages which include +.CW pdfmark +bindings, should provide appropriate initialisation, +so relieving the end user of this responsibility. +The following example, abstracted from the sample +.CW ms +binding package, +.CW spdf.tmac , +illustrates how this may be accomplished:\(en +.DS I +.CW +\&.\e" groff "ms" provides the "pg@bottom" macro, which has already +\&.\e" been installed as a page transition trap. To ensure proper +\&.\e" mapping of "pdfhref" links which overflow the bottom of any +\&.\e" page, we need to install the "pdfhref" page transition hook, +\&.\e" as an addendum to this macro. +\&. +\&.pdfhref I -PT pg@bottom +.DE +.NH 2 +.XN -N add-note -- Annotating a PDF Document using Pop-Up Notes +.NH 2 +.XN -N pdfsync -- Synchronising Output and \F[C]pdfmark\F[] Contexts +.LP +It has been noted previously, that the +.CW pdfview +macro, +.XR docview ), ( +the +.CW pdfinfo +macro, +.XR docinfo ), ( +and the +.CW pdfhref +macro, when used to create a document outline, +.XR add-outline ), ( +do not immediately write their +.CW pdfmark +output to the PostScript\*(rg data stream; +instead, they cache their output, in a +.CW groff +diversion, in the case of the +.CW pdfview +and +.CW pdfinfo +macros, or in an ordered collection of strings and numeric registers, +in the case of the document outline, +until a more appropriate time for copying it out. +In the case of +.CW pdfview +and +.CW pdfinfo +\(lqmeta\(hydata\(rq, +this \(lqmore appropriate time\(rq is explicitly chosen by the user; +in the case of document outline data, +.EM some +cached data may be implicitly written out as the document outline is compiled, +but there will +.EM always +be some remaining data, which must be explicitly flushed out, before the +.CW groff +formatting process is allowed to complete. +.LP +To allow the user to choose when cached +.CW pdfmark +data is to be flushed to the output stream, the +.CW pdfmark +macro package provides the +.CW pdfsync +macro, (to synchronise the cache and output states). +In its simplest form, it is invoked without arguments, i.e. +.QP +.fam C +.B .pdfsync +.LP +This form of invocation ensures that +.EM both +the \(lqmeta\(hydata cache\(rq, containing +.CW pdfview +and +.CW pdfinfo +data, +.EM and +the \(lqoutline cache\(rq, +containing any previously uncommitted document outline data, +are flushed; ideally, this should be included in a +.CW groff +\(lqend macro\(rq, to ensure that +.EM both +caches are flushed, before +.CW groff +terminates. +.LP +Occasionally, +it may be desirable to flush either the \(lqmeta\(hydata cache\(rq, +without affecting the \(lqoutline cache\(rq, or vice\(hyversa, +at a user specified time, prior to reaching the end of the document. +This may be accomplished, by invoking the +.CW pdfsync +macro with an argument, i.e. +.QP +.fam C +.B ".pdfsync M" +.LP +to flush only the \(lqmeta\(hydata cache\(rq, or +.QP +.fam C +.B ".pdfsync O" +.LP +to flush only the \(lqoutline cache\(rq. +.LP +The \(lqmeta\(hydata cache\(rq can normally be safely flushed +in this manner, at any time +.EM after +output of the first page has started; +(it may cause formatting problems, +most notably the appearance of unwanted white space, if flushed earlier, +or indeed, if flushed immediately after a page transition, +but before the output of the content on the new page has commenced). +Caution is required, however, when explicitly flushing the +\(lqoutline cache\(rq, since if the outline is to be +subsequently extended, then the first outline entry after flushing +.EM must +be specified at level 1. +Nevertheless, such explict flushing may occasionally be necessary; +for example, the +.CW TC +macro in the +.CW spdf.tmac +package, +.XR using-spdf ), ( +invokes +.CW ".pdfsync\ O" \(rq \(lq +to ensure that the outline for the \(lqbody\(rq section of the document +is terminated, +.EM before +it commences the formatting of the table of contents section. +.bp +.NH 1 +.XN -N pdf-layout -- PDF Document Layout +.LP +The +.CW pdfmark +macros described in the preceding section, +.XR pdf-features ), ( +provide no inherent document formatting capability of their own. +However, +they may be used in conjunction with any other +.CW groff +macro package of the user's choice, +to add such capability. +.LP +In preparing this document, the standard +.CW ms +macro package, supplied as a component of the GNU Troff distribution, +has been employed. +To facilitate the use of the +.CW pdfmark +macros with the +.CW ms +macros, +a binding macro package, +.CW spdf.tmac , +has been created. +The use of this binding macro package is described in the following section, +.XR using-spdf ); ( +it may also serve as an example to users of other standard +.CW groff +macro packages, +as to how the +.CW pdfmark +macros may be employed with their chosen primary macro package. +.NH 2 +.XN -N using-spdf -- Using \F[C]pdfmark\F[] Macros with the \F[C]ms\F[] Macro Package +.LP +The use of the binding macro package, +.CW spdf.tmac , +allows for the use of the +.CW pdfmark +macros in conjunction with the +.CW ms +macros, +simply by issuing a +.CW groff +command of the form +.QP +.fam C +groff -Tps +.B -mspdf +.I "-options ...\&" ] [ +file(s) ... +.LP +When using the +.CW spdf.tmac +package, the +.CW groff +input files may be marked up using any of the standard +.CW ms +macros to specify document formatting, +while PDF features may be added, +using any of the +.CW pdfmark +macros described previously, +.XR pdf-features ). ( +Additionally, +.CW spdf.tmac +defines a number of convenient extensions to the +.CW ms +macro set, to better accomodate the use of PDF features within the +.CW ms +formatting framework, +and to address a number of +.CW ms +document layout issues, +which require special handling when producing PDF documents. +These additional macros, +and the issues they are intended to address, +are described below. +.NH 3 +.XN \F[C]ms\F[] Section Headings in PDF Documents +.LP +Traditionally, +.CW ms +provides the +.CW NH +and +.CW SH +macros, to specify section headings. +However, +there is no standard mechanism for generating a +table of contents entry based on the text of the section heading; +neither is there any recognised standard method for establishing a +cross reference link to the section. +.LP +To address this +.CW ms +limitation, +.CW spdf.tmac +defines the +.CW XN +macro, +.XR xn-macro ), ( +to be used in conjunction with the +.CW NH +macro. +.NH 4 +.XN -N xn-macro -- The \F[C]XN\F[] Macro +.NH 1 +.XN The PDF Publishing Process +.NH 2 +.XN -N do-xref -- Resolving Cross References +.NH 3 +.XN -N create-map -- Creating a Document Reference Map +.NH 3 +.XN -N import-map -- Deploying a Document Reference Map +.TC diff -ruN groff-1.19.1/contrib/pdfmark/pdfmark.tmac groff-1.19.2/contrib/pdfmark/pdfmark.tmac --- groff-1.19.1/contrib/pdfmark/pdfmark.tmac 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/contrib/pdfmark/pdfmark.tmac 2005-05-26 15:37:18.000000000 +0200 @@ -0,0 +1,1562 @@ +.\" -*- nroff -*- +.ig + +pdfmark.tmac + +Copyright (C) 2004 + Free Software Foundation, Inc. + Written by Keith Marshall (keith.d.marshall@ntlworld.com) + +This file is part of groff. + +groff 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. + +groff 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 groff; see the file COPYING. If not, write to the Free Software +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. + +Author's Note +============= + +While I have written this macro package from scratch, much of my +inspiration has come from discussion on the groff mailing list +(mailto:groff@gnu.org). I am particularly indebted to: + + Kees Zeelenberg, for an earlier macro package he posted, + a study of which helped me to get started. + + Carlos J. G. Duarte and Werner Lemberg, whose discussion + on computation of the bounding boxes for link "hot-spots" + forms the basis of such computations in this package. +.. +.if !\n(.g .ab These pdfmark macros require groff. +.\" +.\" Check if we have already been loaded -- do not reload +.if d pdfmark .nx +.\" +.\" ====================================================================== +.\" Module PDFMARK: Insert Arbitrary PDFMARK Code in the PostScript Stream +.\" ====================================================================== +.\" +.\" PDFMARK output may be disabled, by zeroing the PDFOPMODE register, +.\" ( which mimics a more generic OPMODE, if it is defined ). +.\" +.if rOPMODE .aln PDFOPMODE OPMODE +.\" +.\" but if OPMODE wasn't defined, +.\" then make the default PDFMARK mode ENABLED. +.\" +.if !rPDFOPMODE .nr PDFOPMODE 1 +.\" +.\" The "pdfmark" macro is responsible for emitting the appropriate +.\" PostScript code. +.\" +.de pdfmark +.\" ---------------------------------------------------------------- +.\" Usage: +.\" .pdfmark text of pdfmark instruction +.\" Macro supplies the required opening "[" and closing "pdfmark" +.\" operator; DO NOT include them in the instruction text! +.\" ---------------------------------------------------------------- +.\" +.if \\n[PDFOPMODE] \X'ps:exec [\\$* pdfmark'\c +.. +.\" +.\" Some supporting macros defer actual pdfmark output until an +.\" appropriate time for it to be written; the "pdfsync" macro +.\" provides a mechanism for flushing such deferred output; +.\" it should be called from an end macro, and at any other time +.\" when it may be deemed necessary to flush pdfmark context. +.\" +.de pdfsync +.\" ---------------------------------------------------------------- +.\" Usage: +.\" .pdfsync buffer ... +.\" Arguments indicate which "buffer(s)" to flush: +.\" O -> bookmark (outline) cache +.\" M -> document metadata diversion +.\" If no argument, flush ALL buffers +.\" ---------------------------------------------------------------- +.\" +.ie \\n(.$ \{\ +. while \\n(.$ \{\ +. if '\\$1'O' .pdf:bm.sync 1 +. if '\\$1'M' \{\ +. if dpdf:metadata .pdf:metadata +. rm pdf:metadata +. \} +. shift +. \} +. \} +.el .pdfsync O M +.. +.\" +.\" some helper functions ... +.\" +.\" "pdf:warn" and "pdf:error" write diagnostic messages to stderr +.\" +.de pdf:warn +.\" ---------------------------------------------------------- +.\" Usage: +.\" .pdf:warn text of message +.\" ---------------------------------------------------------- +.\" +.tm \\n(.F:\\n(.c: macro warning: \\$* +.. +.de pdf:error +.\" ---------------------------------------------------------- +.\" Usage: +.\" .pdf:error text of message +.\" ---------------------------------------------------------- +.\" +.tm \\n(.F:\\n(.c: macro error: \\$* +.. +.\" "pdf:pop", assisted by "pdf*pop", allows us to retrieve register, +.\" or string values, from a string masquerading as a data queue, +.\" or as a stack. +.\" +.de pdf:pop +.\" ---------------------------------------------------------------- +.\" Usage: +.\" .pdf:pop +.\" $1 = nr for numeric register, ds for string +.\" $2 = name of register or string to be assigned +.\" $3 = name of string, from which data is to be retrieved +.\" ---------------------------------------------------------------- +.\" +.pdf*pop \\$* \\*[\\$3] +.. +.de pdf*pop +.ds pdf:stack \\$3 +.\\$1 \\$2 \\$4 +.shift 4 +.ie \\n(.$ .ds \\*[pdf:stack] \\$* +.el .rm \\*[pdf:stack] +.rm pdf:stack +.. +.\" +.\" +.\" =========================================================== +.\" Module PDFINFO: Insert MetaData Entries into a PDF Document +.\" =========================================================== +.\" +.\" N.B. +.\" Output from the macros in this module is deferred, until +.\" subsequent invocation of .pdfsync, or .pdfexit +.\" +.\" ."pdfinfo" provides a general purpose form of metadata entry ... +.\" it allows arbitrary text to be associated with any specified +.\" metadata field name. +.\" +.de pdfinfo +.\" ------------------------------------------------------------------- +.\" Usage: +.\" .pdfinfo /FieldName field content ... +.\" Examples: +.\" .pdfinfo /Title A PDF Document +.\" .pdfinfo /Author Keith Marshall +.\" ------------------------------------------------------------------- +.\" +.ds pdf:meta.field \\$1 +.shift +.da pdf:metadata +\!.pdfmark \\*[pdf:meta.field] (\\$*) /DOCINFO +.di +.rm pdf:meta.field +.. +.\" +.\" Macro "pdfview" defines a special form of metadata entry ... +.\" it uses the /DOCVIEW pdfmark, to specify the initial (default) view, +.\" when the document is opened. +.\" +.de pdfview +.\" ------------------------------------------------------------------- +.\" Usage: +.\" .pdfview view parameters ... +.\" Examples: +.\" .pdfview /PageMode /UseOutlines +.\" .pdfview /Page 2 /View [/FitH \n(.p u] +.\" ------------------------------------------------------------------- +.\" +.da pdf:metadata +\!.pdfmark \\$* /DOCVIEW +.di +.. +.\" +.\" +.\" ===================================================================== +.\" Module PDFNOTE: Insert "Sticky Note" Style Comments in a PDF Document +.\" ===================================================================== +.\" +.\" "PDFNOTE.WIDTH" and "PDFNOTE.HEIGHT" set the preferred size for +.\" display of the "sticky note" pane, when opened. Acrobat Reader +.\" seems not to honour these -- perhaps GhostScript doesn't encode +.\" them correctly! Anyway, let's set some suitable default values, +.\" in case the user has a set up which does work as advertised. +.\" +.nr PDFNOTE.WIDTH 3.5i +.nr PDFNOTE.HEIGHT 2.0i +.\" +.\" "pdf:bbox" defines the expression used to set the size and location +.\" of the bounding rectangle for display of notes and link "hot-spots". +.\" This is defined, such that a note is placed at troff's current text +.\" position on the current page, with its displayed image size defined +.\" by the "PDFNOTE.WIDTH" and "PDFNOTE.HEIGHT" registers, while the +.\" bounds for a link "hot-spot" are matched to the text region which +.\" defines the "hot-spot". +.\" +.ds pdf:bbox \\n[pdf:llx] u \\n[pdf:lly] u \\n[pdf:urx] u \\n[pdf:ury] u +.\" +.\" Getting line breaks into the text of a PDFNOTE is tricky -- we need +.\" to get a "\n" into the PostScript stream, but three levels of "\" are +.\" swallowed, when we invoke "pdfnote". The following definition of "PDFLB", +.\" (for LineBreak), is rather ugly, but does allow us to use +.\" +.\" .pdfnote Some text.\*[PDFLB]Some more text, on a new line. +.\" +.ds PDFLB \\\\\\\\\\\\\\\\n +.\" +.de pdfnote +.\" ---------------------------------------------------------------------- +.\" Usage: +.\" .pdfnote [-T "Text for Title"] Text of note ... +.\" ---------------------------------------------------------------------- +.\" +.if \\n[PDFOPMODE] \{\ +.\" +.\" First, compute the bounding rectangle, +.\" for this PDFNOTE instance +.\" +. mk pdf:ury +. nr pdf:llx \\n(.k+\\n(.o+\\n[.in] +. nr pdf:lly \\n[pdf:ury]-\\n[PDFNOTE.HEIGHT] +. nr pdf:urx \\n[pdf:llx]+\\n[PDFNOTE.WIDTH] +. ds pdf:note.instance /Rect [\\*[pdf:bbox]] +.\" +.\" Parse any specified (recognisable) PDFNOTE options +.\" +. while dpdf:note\\$1 \{\ +. pdf:note\\$1 \\$@ +. shift \\n[pdf:note.argc] +. \} +.\" +.\" Emit the note, and clean up +.\" +. pdfmark \\*[pdf:note.instance] /Contents (\\$*) /ANN +. rm pdf:note.instance +. rr pdf:note.argc +. \} +.. +.de pdf:note-T +.nr pdf:note.argc 2 +.as pdf:note.instance " /Title (\\$2) +.. +.\" +.\" +.\" ===================================================================== +.\" Module PDFBOOKMARK: Add an Outline Reference in the PDF Bookmark Pane +.\" ===================================================================== +.\" +.\" "PDFBOOKMARK.VIEW" controls how the document will be displayed, +.\" when the user selects a bookmark. This default setting will fit +.\" the page width to the viewing window, with the bookmarked entry +.\" located at the top of the viewable area. +.\" +.ds PDFBOOKMARK.VIEW /FitH \\n[PDFPAGE.Y] u +.\" +.\" "PDFOUTLINE.FOLDLEVEL" controls how the document outline will be +.\" displayed. It is a number, defining the maximum heading level +.\" which will be visible, without outline expansion by the user, in +.\" the initial view of the document outline. Assuming that no sane +.\" document will ever extend to 10,000 levels of nested headings, +.\" this initial default value causes outlines to be fully expanded. +.\" +.nr PDFOUTLINE.FOLDLEVEL 10000 +.\" +.\" The actual job of creating an outline reference +.\" is performed by the "pdfbookmark" macro. +.\" +.de pdfbookmark +.\" ------------------------------------------------------------------ +.\" Usage: +.\" .pdfbookmark [-T tag] level "Text of Outline Entry" +.\" +.\" $1 = nesting level for bookmark (1 is top level) +.\" $2 = text for bookmark, (in PDF viewer bookmarks list) +.\" $3 = suffix for PDF internal bookmark name (optional) +.\" ------------------------------------------------------------------ +.\" +.if \\n[PDFOPMODE] \{\ +.\" +.\" Make the bookmark name "untagged" by default, +.\" then parse any specified options, to set a "tag", if required +.\" +. ds pdf:href-T +. while dpdf:href.opt\\$1 \{\ +. pdf:href.opt\\$1 \\$@ +. shift \\n[pdf:href.argc] +. \} +. rr pdf:href.argc +.\" +.\" If we found "--" to mark the end of the options, discard it +.\" +. if '\\$1'--' .shift +.\" +.\" Synchronise the bookmark cache +.\" to the requested bookmark nesting level +.\" +. pdf:bm.sync \\$1 +. shift +.\" +.\" Increment the bookmark serialisation index +.\" in order to generate a uniquely serialised bookmark name, +.\" ( which we return in the string "PDFBOOKMARK.NAME" ), +.\" and insert this bookmark into the cache +.\" +. pdf:href.sety +. nr pdf:bm.nr +1 +. ds PDFBOOKMARK.NAME pdf:bm\\n[pdf:bm.nr]\\*[pdf:href-T] +. ds pdf:bm\\n[pdf:bm.nr] /Dest /\\*[PDFBOOKMARK.NAME] +. pdfmark \\*[pdf:bm\\n[pdf:bm.nr]] /View [\\*[PDFBOOKMARK.VIEW]] /DEST +. as pdf:bm\\n[pdf:bm.nr] " /Title (\\$*) +. pdf:href.options.clear +. rr PDFPAGE.Y +. \} +.. +.\" +.\" Macro "pdf:bm.sync" is called for each bookmark created, +.\" to establish a cache entry at the appropriate nesting level. +.\" It will flush ALL previous cache content, when called to +.\" add a new bookmark at level 1, or if simply called at +.\" level 1, without adding any bookmark. +.\" +.de pdf:bm.sync +.\" ------------------------------------------------------------------ +.\" Usage: +.\" .pdf:bm.sync level +.\" $1 = nesting level of current bookmark, or 1 to flush cache +.\" ------------------------------------------------------------------ +.\" +.\" First validate the bookmark nesting level +.\" adjusting it if required +.\" +.if \\$1>\\n[pdf:bm.nl] .nr pdf:bm.nl +1 +.ie \\$1>\\n[pdf:bm.nl] \{\ +. pdf:warn adjusted level \\$1 bookmark; should be <= \\n[pdf:bm.nl] +. \} +.el .nr pdf:bm.nl \\$1 +.if \\n[pdf:bm.nl]<1 \{\ +. pdf:warn bad arg (\\$1) in \\$0 \\$1; \\$0 1 forced +. nr pdf:bm.nl 1 +. \} +.\" +.\" If reverting from a higher to a lower nesting level, +.\" cyclicly adjust cache counts for each pending higher level +.\" +.if \\n[pdf:bm.lc]>=\\n[pdf:bm.nl] \{\ +. nr pdf:bm.lc +1 +. if !rpdf:bm.c\\n[pdf:bm.lc].c .nr pdf:bm.c\\n[pdf:bm.lc].c 0 +. while \\n[pdf:bm.lc]>\\n[pdf:bm.nl] \{\ +. as pdf:bm.c\\n[pdf:bm.lc] " \\n[pdf:bm.c\\n[pdf:bm.lc].c] +. rr pdf:bm.c\\n[pdf:bm.lc].c +. nr pdf:bm.lc -1 +. \} +. \} +.\" +.\" Update the cache level, +.\" flushing when we are at level 1 +.\" +.nr pdf:bm.lc \\n[pdf:bm.nl] +.ie \\n[pdf:bm.nl]=1 \{\ +. while \\n[pdf:bm.ic]<\\n[pdf:bm.nr] .pdf:bm.emit 0 +. rr pdf:bm.rc +. \} +.el .nr pdf:bm.c\\n[pdf:bm.nl].c +1 +.. +.\" Macro "pdf:bm.emit" is called, when the cache is at level 1. +.\" This flushes ALL pending bookmarks from the cache, i.e. the +.\" preceding level 1 bookmark, and any nested dependents, +.\" which it may have. +.\" +.de pdf:bm.emit +.\" ------------------------------------------------------------------ +.\" Usage: +.\" .pdf:bm.emit flag +.\" $1 = reference counting flag, used to control recursion +.\" ------------------------------------------------------------------ +.\" +.\" First check for nested dependents, +.\" and append the "dependent count" to the bookmark, as required. +.\" +.nr pdf:bm.ic +1 +.nr pdf:bm.lc +1 +.pdf:pop nr pdf:bm.rc pdf:bm.c\\n[pdf:bm.lc] +.if \\n[pdf:bm.rc] \{\ +. ds pdf:bm.fold +. if \\n[pdf:bm.lc]>\\n[PDFOUTLINE.FOLDLEVEL] .ds pdf:bm.fold - +. as pdf:bm\\n[pdf:bm.ic] " /Count \\*[pdf:bm.fold]\\n[pdf:bm.rc] +. rm pdf:bm.fold +. \} +.pdfmark \\*[pdf:bm\\n[pdf:bm.ic]] /OUT +.rm pdf:bm\\n[pdf:bm.ic] +.\" +.\" For ALL dependents, if any, +.\" recursively flush out any higher level dependents, +.\" which they themselves may have +.\" +.while \\n[pdf:bm.rc] \{\ +. nr pdf:bm.rc -1 +. pdf:bm.emit \\n[pdf:bm.rc] +. \} +.\" +.\" Finally, +.\" unwind the recursive call stack, until we return to the top level. +.\" +.nr pdf:bm.rc \\$1 +.nr pdf:bm.lc -1 +.. +.nr pdf:bm.nr 0 +.nr pdf:bm.nl 1 +.nr pdf:bm.lc 0 +.nr pdf:bm.ic 0 +.\" +.\" +.\" ============================================================= +.\" Module PDFHREF: Create Hypertext References in a PDF Document +.\" ============================================================= +.\" +.\" "PDFHREF.VIEW" controls how the document will be displayed, +.\" when the user follows a link to a named reference. +.\" +.ds PDFHREF.VIEW /FitH \\n[PDFPAGE.Y] u +.\" +.\" This default setting will fit the page width to the viewing +.\" window, with the bookmarked entry located close to the top +.\" of the viewable area. "PDFHREF.VIEW.LEADING" controls the +.\" actual distance below the top of the viewing window, where +.\" the reference will be positioned; 5 points is a reasonable +.\" default offset. +.\" +.nr PDFHREF.VIEW.LEADING 5.0p +.\" +.\" Yuk!!! +.\" PDF view co-ordinates are mapped from the bottom left corner, +.\" of the page, whereas page printing co-ordinates are mapped +.\" conventionally, from top left. +.\" +.\" Macro "pdf:href.sety" transforms the vertical position of the +.\" last printed baseline, from the printing co-ordinate domain to +.\" the PDF view domain. +.\" +.de pdf:href.sety +.\" ---------------------------------------------------------------- +.\" Usage: +.\" .pdf:href.sety +.\" ---------------------------------------------------------------- +.\" +.\" This computation yields the vertical view co-ordinate +.\" in groff's basic units; don't forget to append grops' "u" +.\" conversion operator, when writing the pdfmark! +.\" +.nr PDFPAGE.Y \\n(.p-\\n(nl+\\n[PDFHREF.VIEW.LEADING] +.. +.\" When we create a link "hot-spot" ... +.\" "PDFHREF.LEADING" sets the distance above the top of the glyph +.\" bounding boxes, in each line of link text, over which the link +.\" hot-spot will extend, while "PDFHREF.HEIGHT" sets the hot-spot +.\" height, PER LINE of text occupied by the reference. +.\" +.\" Since most fonts specify some leading space within the bounding +.\" boxes of their glyphs, a better appearance may be achieved when +.\" NEGATIVE leading is specified for link hot-spots; indeed, when +.\" the default 10pt Times font is used, -1.0 point seems to be a +.\" reasonable default value for "PDFHREF.LEADING" -- it may be +.\" changed, if desired. +.\" +.\" "PDFHREF.HEIGHT" is initially set as one vertical spacing unit; +.\" note that it is defined as a string, so it will adapt to changes +.\" in the vertical spacing. Changing it is NOT RECOMMENDED. +.\" +.nr PDFHREF.LEADING -1.0p +.ds PDFHREF.HEIGHT 1.0v +.\" +.\" PDF readers generally place a rectangular border around link +.\" "hot-spots". Within text, this looks rather ugly, so we set +.\" "PDFHREF.BORDER" to suppress it -- the three zeroes represent +.\" the border parameters in the "/Border [0 0 0]" PDFMARK string, +.\" and may be changed to any valid form, as defined in Adobe's +.\" PDFMARK Reference Manual. +.\" +.ds PDFHREF.BORDER 0 0 0 +.\" +.\" "PDFHREF.COLOUR" (note British spelling) defines the colour to +.\" be used for display of link "hot-spots". This will apply both +.\" to borders, if used, and, by default to text; however, actual +.\" text colour is set by "PDFHREF.TEXT.COLOUR", which may be reset +.\" independently of "PDFHREF.COLOUR", to achieve contrasting text +.\" and border colours. +.\" +.\" "PDFHREF.COLOUR" must be set to a sequence of three values, +.\" each in the range 0.0 .. 1.0, representing the red, green, and +.\" blue components of the colour specification in the RGB colour +.\" domain, which is shared by "groff" and the PDF readers. +.\" +.ds PDFHREF.COLOUR 0.35 0.00 0.60 +.defcolor pdf:href.colour rgb \*[PDFHREF.COLOUR] +.\" +.\" "PDFHREF.TEXT.COLOUR", on the other hand, is simply defined +.\" using any "groff" colour name -- this default maps it to the +.\" same colour value as "PDFHREF.COLOUR". +.\" +.ds PDFHREF.TEXT.COLOUR pdf:href.colour +.\" +.\" Accommodate users who prefer the American spelling, COLOR, to +.\" the British spelling, COLOUR. +.\" +.als PDFHREF.COLOR PDFHREF.COLOUR +.als PDFHREF.TEXT.COLOR PDFHREF.TEXT.COLOUR +.\" +.\" All PDF "Hypertext" reference capabilities are accessed +.\" through the "pdfhref" macro +.\" +.de pdfhref +.\" ----------------------------------------------------------------- +.\" Usage: +.\" .pdfhref ... +.\" ----------------------------------------------------------------- +.\" +.if \\n[PDFOPMODE] \{\ +.\" +.\" Loop over all subcommands specified in the argument list +.\" +. while \\n(.$ \{\ +. \" +. \" Initially, assume each subcommand will complete successfully +. \" +. nr pdf:href.ok 1 +. \" +. \" Initialise -E and -X flags in the OFF state +. \" +. nr pdf:href-E 0 +. nr pdf:href-X 0 +. \" +. \" Handle the case where subcommand is specified as "-class", +. \" setting up appropriate macro aliases for subcommand handlers. +. \" +. if dpdf*href\\$1 .als pdf*href pdf*href\\$1 +. if dpdf*href\\$1.link .als pdf*href.link pdf*href\\$1.link +. if dpdf*href\\$1.file .als pdf*href.file pdf*href\\$1.file +. \" +. \" Repeat macro alias setup +. \" for the case where the subcommand is specified as "class", +. \" (without a leading hyphen) +. \" +. if dpdf*href-\\$1 .als pdf*href pdf*href-\\$1 +. if dpdf*href-\\$1.link .als pdf*href.link pdf*href-\\$1.link +. if dpdf*href-\\$1.file .als pdf*href.file pdf*href-\\$1.file +. \" +. \" Process one subcommand ... +. \" +. ie dpdf*href \{\ +. \" +. \" Subcommand "class" is recognised ... +. \" discard the "class" code from the argument list, +. \" set the initial argument count to swallow all arguments, +. \" and invoke the selected subcommand handler. +. \" +. shift +. nr pdf:argc \\n(.$ +. pdf*href \\$@ +. \" +. \" When done, +. \" discard all arguments actually consumed by the handler, +. \" before proceeding to the next subcommand (if any). +. \" +. shift \\n[pdf:argc] +. \} +. el \{\ +. \" +. \" Subcommand "class" is not recognised ... +. \" issue a warning, and discard the entire argument list, +. \" so aborting this "pdfhref" invocation +. \" +. pdf:warn \\$0: undefined reference class '\\$1' ignored +. shift \\n(.$ +. \} +. \" +. \" Clean up temporary reference data, +. \" to ensure it doesn't propagate to any future reference +. \" +. rm pdf*href pdf:href.link pdf:href.files +. rr pdf:href-E pdf:href-X +. pdf:href.options.clear +. \} +. rr pdf:href.ok +. \} +.. +.\" +.\" Macros "pdf:href.flag" and "pdf:href.option" +.\" provide a generic mechanism for switching on flag type options, +.\" and for decoding options with arguments, respectively +.\" +.de pdf:href.flag +.\" ---------------------------------------------------------------------- +.\" ---------------------------------------------------------------------- +.nr pdf:href\\$1 1 +.nr pdf:href.argc 1 +.. +.de pdf:href.option +.\" ---------------------------------------------------------------------- +.\" ---------------------------------------------------------------------- +.ds pdf:href\\$1 \\$2 +.nr pdf:href.argc 2 +.. +.\" +.\" Valid PDFHREF options are simply declared +.\" by aliasing option handlers to "pdf:href.option", +.\" or to "pdf:href.flag", as appropriate +.\" +.als pdf:href.opt-A pdf:href.option \" affixed text +.als pdf:href.opt-D pdf:href.option \" destination name +.als pdf:href.opt-E pdf:href.flag \" echo link descriptor +.als pdf:href.opt-F pdf:href.option \" remote file specifier +.als pdf:href.opt-N pdf:href.option \" reference name +.als pdf:href.opt-P pdf:href.option \" prefixed text +.als pdf:href.opt-T pdf:href.option \" bookmark "tag" +.als pdf:href.opt-X pdf:href.flag \" cross reference +.\" +.\" For references to another document file +.\" we also need to support OS dependent file name specifiers +.\" +.als pdf:href.opt-DF pdf:href.option \" /DOSFile specifier +.als pdf:href.opt-MF pdf:href.option \" /MacFile specifier +.als pdf:href.opt-UF pdf:href.option \" /UnixFile specifier +.als pdf:href.opt-WF pdf:href.option \" /WinFile specifier +.\" +.\" Macro "pdf:href.options.clear" ensures that ALL option +.\" argument strings are deleted, after "pdfhref" has completed +.\" all processing which depends on them +.\" +.de pdf:href.options.clear +.\" ----------------------------------------------------------------- +.\" Usage: +.\" .pdf:href.options.clear [option ...] +.\" ----------------------------------------------------------------- +.\" +.\" When an option list is specified ... +.\" +.ie \\n(.$ \{\ +. \" +. \" then loop through the list, +. \" deleting each specified option argument string in turn +. \" +. while \\n(.$ \{\ +. if dpdf:href-\\$1 .rm pdf:href-\\$1 +. shift +. \} +. \} +.\" +.\" ... but when no list is specified, +.\" then recurse, to clear all known option argument strings +.\" +.el .pdf:href.options.clear A D F N P T DF MF UF WF +.. +.\" +.\" "PDFHREF.INFO" establishes the content of the cross reference +.\" data record, which is exported via the "stderr" stream, when a +.\" cross reference anchor is created using a "pdfhref" macro request +.\" of the form +.\" +.\" .pdfhref M -N name -X text ... +.\" +.\" .ds PDFHREF.INFO \\*[PDFHREF.NAME] reference data ... +.\" +.ds PDFHREF.INFO page \\n% \\$* +.\" +.\" Macro "pdf*href-M" is the handler invoked by "pdfhref", when +.\" called with the "M" reference class specifier, to create a +.\" named cross reference mark, and to emit a cross reference +.\" data record, as specified by "PDFHREF.INFO". +.\" +.de pdf*href-M +.\" ----------------------------------------------------------------- +.\" Usage: +.\" .pdfhref M [-X] [-N name | -D name] [-E] descriptive text ... +.\" ----------------------------------------------------------------- +.\" +.\" Initially, declare the -D and -N string options as empty, +.\" so we avoid warning messages when we try to use them, and find +.\" that they are undefined. +.\" +.ds pdf:href-D +.ds pdf:href-N +.\" +.\" Parse, interpret, and strip any specified options from the +.\" argument list. (Note that only options with a declared handler +.\" will be processed; there is no provision for detecting invalid +.\" options -- anything which is not recognised is assumed to start +.\" the "descriptive text" component of the argument list). +.\" +.while dpdf:href.opt\\$1 \{\ +. pdf:href.opt\\$1 \\$@ +. shift \\n[pdf:href.argc] +. \} +.\" +.\" If we found "--", to mark the end of the options, +.\" then we should discard it. +.\" +.if '\\$1'--' .shift +.\" +.\" All PDF reference markers MUST be named. The name may have been +.\" supplied using the "-N Name" option, (or the "-D Name" option); +.\" if not, deduce it from the first "word" in the "descriptive text", +.\" if any, and set the marker -- if we still can't identify the name +.\" for the destination, then this marker will not be created. +.\" +.pdf*href.set \\*[pdf:href-N] \\*[pdf:href-D] \\$1 +.\" +.\" If we specified a cross reference, with the "-X" option, and the +.\" reference mark has been sucessfully created, then we now need to +.\" write the cross reference info to the STDERR stream +.\" +.if \\n[pdf:href-X] .pdf*href.export \\*[PDFHREF.INFO] +.\" +.\" Irrespective of whether this marker is created, or not, +.\" the descriptive text will be copied to the groff output stream, +.\" provided the "-E" option was specified +.\" +.if \\n[pdf:href-E] \&\\$* +.. +.\" +.de pdf*href.set +.\" ---------------------------------------------------------------------- +.\" ---------------------------------------------------------------------- +.pdf*href.map.init +.ie \\n(.$ \{\ +. \" +. \" a marker name has been supplied ... +. \" if we are formatting for immediate output, +. \" emit PDFMARK code to establish the associated view +. \" +. ie '\\n(.z'' \{\ +. pdf:href.sety +. pdfmark /Dest /\\$1 /View [\\*[PDFHREF.VIEW]] /DEST +. ds PDFHREF.NAME \\$1 +. rr PDFPAGE.Y +. \} +. \" +. \" but, when formatting a diversion ... +. \" delay output of the PDFMARK code, until the diversion +. \" is eventually written out +. \" +. el \!.\\$0 \\$@ +. \" +. \" check if we also need to emit cross reference data +. \" (caller will do this if "pdf:href-X" is set, but it is +. \" not necessary, when "pdf:href.map" already exists) +. \" +. if dpdf:href.map .nr pdf:href-X 0 +. \} +.el \{\ +. \" marker is unnamed ... +. \" issue error message; do not emit reference data +. \" +. pdf:warn pdfhref destination marker must be named +. nr pdf:href-X 0 +. \} +.. +.de pdf*href.export +.\" +.\" Called ONLY by "pdf*href-M", +.\" this macro ensures that the emission of exported reference data +.\" is synchronised with the placement of the reference mark, +.\" especially when the mark is defined within a diversion. +.\" +.ie '\\n(.z'' .tm gropdf-info:href \\*[PDFHREF.NAME] \\$* +.el \!.\\$0 \\$@ +.. +.\" +.\" Macro "pdf*href-D" is invoked when "pdfhref" is called +.\" with the "D" reference class specifier; it provides a +.\" standardised mechanism for interpreting reference data +.\" exported by the "M" reference class, and may be used +.\" to directly define external reference data, without the +.\" use of "M" reference class designators in the source +.\" document. +.\" +.de pdf*href-D +.ds pdf:href-N +.\" +.\" Parse, interpret, and strip any specified options from the +.\" argument list. (Note that only options with a declared handler +.\" will be processed; there is no provision for detecting invalid +.\" options -- anything which is not recognised is assumed to start +.\" the "descriptive text" component of the argument list). +.\" +.while dpdf:href.opt\\$1 \{\ +. pdf:href.opt\\$1 \\$@ +. shift \\n[pdf:href.argc] +. \} +.\" +.\" If we found "--", to mark the end of the options, +.\" then we should discard it. +.\" +.if '\\$1'--' .shift +.\" +.ie '\\*[pdf:href-N]'' \{\ +. pdf:warn pdfhref defined reference requires a name +. \} +.el \{\ +. ds pdf:href(\\*[pdf:href-N]).info \\$* +. \} +.. +.\" +.\" Macro "pdf*href-F" is invoked when "pdfhref" is called +.\" with the "F" reference class specifier; it allows the user +.\" to provide an alternative interpreter macro, which will be +.\" called when a "PDFHREF.INFO" record is retrieved to define +.\" the text of a cross reference link "hot spot". +.\" +.de pdf*href-F +.\" ---------------------------------------------------------------- +.\" Usage: +.\" .pdfhref F [macro-name] +.\" ---------------------------------------------------------------- +.\" +.\" Set macro specified by "macro-name" as the format interpreter +.\" for parsing "PDFHREF.INFO" records; if "macro-name" is omitted, +.\" or is specified as the reserved name "default", then use the +.\" default format parser, "pdf*href.format", defined below. +.\" +.if '\\$1'default' .shift \\n(.$ +.ie \\n(.$ .als pdf*href.format \\$1 +.el .als pdf*href.format pdf*href.default +.nr pdf:argc 1 +.. +.\" The default reference formatting macro is defined below. +.\" It parses the "PDFHREF.INFO" record specific to each reference, +.\" recognising the keywords "file", "page" and "section", when they +.\" appear in initial key/value pairs, replacing the key/value pair +.\" with "PDFHREF.FILEREF", "PDFHREF.PAGEREF" or "PDFHREF.SECTREF" +.\" respectively; any additional data in the "PDFHREF.INFO" record +.\" is enclosed in typographic double quotes, and the parsed record +.\" is appended to "PDFHREF.PREFIX", to be returned as the formatted +.\" reference text. +.\" +.\" Default definitions for the reference strings "PDFHREF.PREFIX", +.\" "PDFHREF.FILEREF", "PDFHREF.PAGEREF" and "PDFHREF.SECTREF" are +.\" provided, in the English language. Users may substitute any +.\" desired alternative definitions, for example, when formatting +.\" documents in other languages. In each case, "\\$1" may be used +.\" in the substitution, to represent the "value" component of the +.\" respective key/value pair specified in the "PDFHREF.INFO" record. +.\" +.ds PDFHREF.PREFIX see +.ds PDFHREF.PAGEREF page \\$1, +.ds PDFHREF.SECTREF section \\$1, +.ds PDFHREF.FILEREF \\$1 +.\" +.de pdf*href.format +.\" ----------------------------------------------------------------- +.\" Usage: (to be called ONLY by "pdfhref") +.\" .pdf*href.format cross reference data ... +.\" ----------------------------------------------------------------- +.\" +.\" This macro is responsible for defining the strings "PDFHREF.TEXT" +.\" and "PDFHREF.DESC", which are used by the "pdfhref" macro, as the +.\" basis for generating the text content of a link "hot spot"; (any +.\" user specified alternate formatter MUST do likewise). +.\" +.\" Note that "PDFHREF.TEXT" defines the overall format for the "link +.\" text", while "PDFHREF.DESC" is the descriptive component thereof. +.\" +.\" This default implementation, subject to user customisation of the +.\" "internationalisation" strings defined above, formats "hot spots" +.\" of the style +.\" +.\" see page N, section S, "descriptive text ..." +.\" +.ds PDFHREF.TEXT \\*[PDFHREF.PREFIX] +.while d\\$0.\\$1 \{\ +. \\$0.\\$1 "\\$2" +. shift 2 +. \} +.\" +.\" Retrieve the descriptive text from the cross reference data, +.\" ONLY IF no overriding description has been set by the calling +.\" "pdfhref" macro invocation. +.\" +.if \\n(.$ .if !dPDFHREF.DESC .ds PDFHREF.DESC \\$* +.\" +.\" Augment "PDFHREF.TEXT" so the descriptive text will be included +.\" in the text of the formatted reference +.\" +.if dPDFHREF.DESC .as PDFHREF.TEXT " \(lq\\\\*[PDFHREF.DESC]\(rq +.\" +.\" Finally, suppress any leading spaces, +.\" which may have been included in the PDFHREF.TEXT definition. +.\" +.ds PDFHREF.TEXT \\*[PDFHREF.TEXT] +.. +.de pdf*href.format.file +.\" ---------------------------------------------------------------------- +.\" Include a file identifier in a formatted reference. +.\" This is invoked ONLY by "pdf*href.format", and ONLY IF the +.\" reference data includes an initial file identifier tuple. +.\" ---------------------------------------------------------------------- +.\" +.as PDFHREF.TEXT " \\*[PDFHREF.FILEREF] +.. +.de pdf*href.format.page +.\" ---------------------------------------------------------------------- +.\" Include a page number in a formatted reference. +.\" This is invoked ONLY by "pdf*href.format", and ONLY IF the +.\" reference data includes an initial page number tuple. +.\" ---------------------------------------------------------------------- +.\" +.as PDFHREF.TEXT " \\*[PDFHREF.PAGEREF] +.. +.de pdf*href.format.section +.\" ---------------------------------------------------------------------- +.\" Include a section number in a formatted reference. +.\" This is invoked ONLY by "pdf*href.format", and ONLY IF the +.\" reference data includes an initial section number tuple. +.\" ---------------------------------------------------------------------- +.\" +.as PDFHREF.TEXT " \\*[PDFHREF.SECTREF] +.. +.\" +.\" Make "pdf*href.format" the default cross reference formatter +.\" +.als pdf*href.default pdf*href.format +.\" +.\" +.\" Macro "pdf*href" provides a generic mechanism for placing link +.\" "hot-spots" in a PDF document. ALL "pdfhref" class macros which +.\" create "hot-spots" are aliased to this macro; each must also have +.\" an appropriately aliased definition for "pdf*href.template". +.\" +.de pdf*href +.\" ------------------------------------------------------------------ +.\" Usage: +.\" .pdf*href class [options ...] [link text ...] +.\" ------------------------------------------------------------------ +.\" +.\" First, we initialise an empty string, which will be affixed to +.\" the end of the "link text". (This is needed to cancel the effect +.\" of a "\c" escape, which is placed at the end of the "link text" +.\" to support the "-A" option -- any text supplied by the user, when +.\" the "-A" option is specified, will replace this empty string). +.\" +.ds pdf:href-A +.\" +.\" Now we interpret, and remove any specified options from the +.\" argument list. (Note that only options with a declared handler +.\" will be processed; there is no provision for detecting invalid +.\" options -- anything which is not recognised is assumed to start +.\" the "link text" component of the argument list). +.\" +.while dpdf:href.opt\\$1 \{\ +. pdf:href.opt\\$1 \\$@ +. shift \\n[pdf:href.argc] +. \} +.\" +.\" If we found "--", to mark the end of the options, then we should +.\" discard it. +.\" +.if '\\$1'--' .shift +.\" +.\" All PDF link classes REQUIRE a named destination. This may have +.\" been supplied using the "-D Name" option, but, if not, deduce it +.\" from the first "word" in the "link text", if any -- if we still +.\" can't identify the destination, then set "pdf:href.ok" to zero, +.\" so this link will not be created. +.\" +.if !dpdf:href-D .pdf:href.option -D \\$1 +.if '\\*[pdf:href-D]'' \{\ +. pdf:error pdfhref has no destination +. nr pdf:href.ok 0 +. \} +.\" +.\" Some PDF link classes support a "/File (FilePathName)" argument. +.\" +.if dpdf*href.file \{\ +. \" +. \" When this is supported, it may be specified by supplying +. \" the "-F FileName" option, which is captured in "pdf:href-F". +. \" +. if dpdf:href-F \{\ +. \" +. \" the /File key is present, so set up the link specification +. \" to establish the reference to the specified file +. \" +. als pdf*href.link pdf*href.file +. ds pdf:href.files /File (\\*[pdf:href-F]) +. \" +. \" in addition to the /File key, +. \" there may also be platform dependent alternate file names +. \" +. if dpdf:href-DF .as pdf:href.files " /DOSFile (\\*[pdf:href-DF]) +. if dpdf:href-MF .as pdf:href.files " /MacFile (\\*[pdf:href-MF]) +. if dpdf:href-UF .as pdf:href.files " /UnixFile (\\*[pdf:href-UF]) +. if dpdf:href-WF .as pdf:href.files " /WinFile (\\*[pdf:href-WF]) +. \} +. \" In some cases, the "/File" key is REQUIRED. +. \" We will know it is missing, if "pdf*href.link" is not defined. +. \" +. if !dpdf*href.link \{\ +. \" +. \" When a REQUIRED "/File" key specification is not supplied, +. \" then complain, and set "pdf:href.ok" to abort the creation +. \" of the current reference. +. \" +. pdf:error pdfhref: required -F specification omitted +. nr pdf:href.ok 0 +. \} +. \" Now, we have no further use for "pdf*href.file". +. \" +. rm pdf*href.file +. \} +.\" +.\" Now, initialise a string, defining the PDFMARK code sequence +.\" to create the reference, using the appropriate type indicators. +.\" +.ds pdf:href.link /Subtype /Link \\*[pdf*href.link] +.\" +.\" And now, we have no further use for "pdf*href.link". +.\" +.rm pdf*href.link +.\" +.\" If the user specified any "link prefix" text, (using the "-P text" +.\" option), then emit it BEFORE processing the "link text" itself. +.\" +.if dpdf:href-P \&\\*[pdf:href-P]\c +.ie \\n[pdf:href.ok] \{\ +. \" +. \" This link is VALID (so far as we can determine) ... +. \" Modify the "link text" argument specification, as required, +. \" to include any pre-formatted cross reference information +. \" +. ie \\n(.$ \{\ +. \" +. \" One or more "link text" argument(s) are present, +. \" so, set the link description from the argument(s) ... +. \" +. ds PDFHREF.DESC \\\\$* +. ie \\n[pdf:href-X] \{\ +. \" +. \" ... and, when the "-X" flag is set, +. \" also include formatted location information, +. \" derived from the cross reference record. +. \" +. pdf*href.format \\*[pdf:href(\\*[pdf:href-D]).info] +. \} +. el \{\ +. \" ... but, when the "-X" flag is NOT set, +. \" use only the argument(s) as the entire content +. \" of the "link text" +. \" +. rn PDFHREF.DESC PDFHREF.TEXT +. \} +. \} +. el \{\ +. \" No "link text" arguments are present, +. \" so, format the cross reference record to define +. \" the content of the "link text". +. \" +. pdf*href.format \\*[pdf:href(\\*[pdf:href-D]).info] +. \} +. \" Apply border and colour specifications to the PDFMARK string +. \" definition, as required. +. \" +. if dPDFHREF.BORDER .as pdf:href.link " /Border [\\*[PDFHREF.BORDER]] +. if dPDFHREF.COLOUR .as pdf:href.link " /Color [\\*[PDFHREF.COLOUR]] +. \" +. \" Emit the "link text", in its appropriate colour, marking the +. \" limits of its bounding box(es), as the before and after output +. \" text positions. +. \" +. pdf*href.mark.begin "\\*[pdf:href.link]" +. if dPDFHREF.COLOUR .defcolor pdf:href.colour rgb \\*[PDFHREF.COLOUR] +. nop \&\m[\\*[PDFHREF.TEXT.COLOUR]]\\*[PDFHREF.TEXT]\m[]\c +. pdf*href.mark.end +. \" +. \" Clean up the temporary registers and strings, used to +. \" compute the "hot-spot" bounds, and format the reference, +. \" +. rm PDFHREF.DESC PDFHREF.TEXT +. \} +.\" +.\" But when we identify an INVALID link ... +.\" We simply emit the "link text", with no colour change, no border, +.\" and no associated "hot-spot". +.\" +.el \&\\$*\c +.\" +.\" And then, if the user specified any affixed text, (using the +.\" "-A text" option), we tack it on at the end. +.\" +.nop \&\\*[pdf:href-A] +.. +.de pdf*href.map.init +.\" ---------------------------------------------------------------------- +.\" ---------------------------------------------------------------------- +.\" +.if dpdf:href.map-1 \{\ +. \" +. \" We have a reference map, but we haven't started to parse it yet. +. \" This must be the first map reference in pass 2, so we need to +. \" "kick-start" the parsing process, by loading the first indexed +. \" sub-map into the global map. +. \" +. rn pdf:href.map-1 pdf:href.map +. als pdf:href.map.internal pdf:href.map +. nr pdf:href.map.index 1 1 +. \} +.als pdf*href.map.init pdf*href.mark.idle +.. +.\" +.\" "pdf*href-Z" is used to add link co-ordinate entries to the +.\" "pdf:href.map". Primarily, it is used by the "pdfroff" formatter, +.\" to pass link co-ordinate data from one "groff" formatting pass to +.\" the next, and is not generally useful to the end user. +.\" +.de pdf*href-Z +.\" ---------------------------------------------------------------------- +.\" Usage: +.\" .pdfhref Z page-index x-displacement y-displacement +.\" Where: +.\" page-index is the reference mark's page number +.\" x-displacement is its offset from the left edge of the page +.\" y-displacement is its offset from the top edge of the page +.\" ( both displacement values are expressed in basic groff units, ) +.\" ( and measured perpendicular to their respective page edges. ) +.\" ---------------------------------------------------------------------- +.\" +.ie \\n(.$=3 .ds pdf:href.map-\\n+[pdf*href-Z.index] \\$* +.el .pdf:error pdfhref Z operator expects exactly three arguments +.. +.\" Initialise the auto-incrementing "pdf*href-Z.index" register, +.\" to ensure that sub-map numbering starts at 1. +.\" +.nr pdf*href-Z.index 0 1 +.\" +.de pdf*href.map.read +.\" ---------------------------------------------------------------------- +.\" Usage: (internal use only): +.\" .pdf*href.map.read co-ordinate name list ... +.\" ---------------------------------------------------------------------- +.\" +.\" Reads values from "pdf:href.map" to each named register, in turn +.\" Reading to "null" discards the corresponding value in "pdf:href.map" +.\" +.while \\n(.$ \{\ +. \" +. \" Loop over all registers named in the argument list, +. \" assigning values from "pdf:href.map" to each in turn. +. \" +. pdf:pop nr pdf:\\$1 pdf:href.map.internal +. if !dpdf:href.map.internal \{\ +. \" +. \" We ran out of map references in the current sub-map, +. \" so move on to the next indexed sub-map, if any. +. \" +. if dpdf:href.map-\\n+[pdf:href.map.index] \{\ +. rn pdf:href.map-\\n[pdf:href.map.index] pdf:href.map +. als pdf:href.map.internal pdf:href.map +. \} +. \} +. \" +. \" Proceed to the next named co-ordinate, (if any), specified +. \" in the argument list. +. \" +. shift +. \} +.\" +.\" Discard any assignments to a register named "null" +.\" +.rr pdf:null +.. +.de pdf*href.mark.begin +.\" ---------------------------------------------------------------------- +.\" ---------------------------------------------------------------------- +.pdf*href.map.init +.ie dpdf:href.map \{\ +. \" +. \" Once we have established a document reference map, +. \" then this, and all subsequent calls to "pdf*href.mark.begin", +. \" may be redirected to the reference mark resolver, and the +. \" "pdf*href.mark.end" macro has nothing further to do. +. \" +. pdf*href.mark.resolve \\$@ +. rn pdf*href.mark.resolve pdf*href.mark.begin +. als pdf*href.mark.end pdf*href.mark.idle +. \} +.el \{\ +. \" Since we don't yet have a document reference map, the +. \" reference mark resolver will not work, in this pass of the +. \" formatter; this, and all subsequent calls to "pdf*href.mark.begin", +. \" may be redirected to "pdf*href.mark.end", which is responsible +. \" for emitting the reference mark data to be incorporated into +. \" the reference map in a subsequent formatting pass. +. \" +. pdf*href.mark.end +. als pdf*href.mark.begin pdf*href.mark.end +. \} +.. +.de pdf*href.mark.resolve +.\" ---------------------------------------------------------------------- +.\" ---------------------------------------------------------------------- +.ie '\\n(.z'' \{\ +. ds pdf:href.link \\$1 +. nr pdf:urx \\n(.o+\\n(.l +. pdf*href.map.read spg llx ury epg urx.end lly.end +. ie \\n[pdf:spg]=\\n[pdf:epg] \{\ +. \" +. \" This link is entirely contained on a single page ... +. \" emit the text, which defines the content of the link region, +. \" then make it active. +. \" +. pdf*href.mark.emit 1 \\n[pdf:urx.end] +. if \\n[pdf:lly]<\\n[pdf:lly.end] \{\ +. \" +. \" This link spans multiple output lines; we must save its +. \" original end co-ordinates, then define a new intermediate +. \" end point, to create a PDFMARK "hot-spot" extending from +. \" the start of the link to the end if its first line. +. \" +. nr pdf:ury +1v +. nr pdf:llx \\n(.o+\\n[.in] +. nr pdf:lly \\n[pdf:lly.end]-\\*[PDFHREF.HEIGHT] +. if \\n[pdf:ury]<\\n[pdf:lly] \{\ +. nr pdf:lly +\\*[PDFHREF.HEIGHT]-1v +. pdf*href.mark.emit 2 +. nr pdf:ury \\n[pdf:lly.end]-\\*[PDFHREF.HEIGHT] +. \} +. pdf*href.mark.emit 0 \\n[pdf:urx.end] +. \} +. pdf*href.mark.flush +. \} +. el \{\ +. \" This link is split across a page break, so ... +. \" We must mark the "hot-spot" region on the current page, +. \" BEFORE we emit the link text, as we will have moved off +. \" this page, by the time the text has been output. +. \" +. \" First step: define the region from the start of the link, +. \" to the end of its first line. +. \" +. pdf*href.mark.emit 1 \\n[pdf:urx] +. \" +. \" All additional regions MUST align with the left margin. +. \" +. nr pdf:llx \\n(.o+\\n[.in] +. \" +. \" If the current page can accomodate more than the current line, +. \" then it will include a second active region for this link; this +. \" will extend from just below the current line to the end of page +. \" trap, if any, or the bottom of the page otherwise, and occupy +. \" the full width of the page, between the margins. +. \" +. nr pdf:ury +1v +. pdf*href.mark.emit 3 +. \" +. \" We now need a page transition trap, to map the active link +. \" region(s), which overflow on to the following page(s); (the +. \" handler for this trap MUST have been previously installed). +. \" +. ie dpdf*href.mark.hook \{\ +. \" +. \" The page transition trap handler has been installed, +. \" so we may activate both it, and also the appropriate +. \" termination handler, to deactivate it when done. +. \" +. als pdf*href.mark.hook pdf*href.mark.trap +. \" +. \" Now we set up "pdf:epg" to count the number of page breaks +. \" which this link will span, and emit the link text, leaving +. \" the page trap macro to map active regions on intervening +. \" pages, which are included in the link. +. \" +. nr pdf:epg -\\n[pdf:spg] 1 +. \} +. el \{\ +. \" There was no handler initialised for the page trap, +. \" so we are unable to map the active regions for this link; +. \" we may discard the remaining map data for this link, +. \" and issue a diagnostic. +. \" +. pdf:error pdfhref: link dissociated at page break (trap not initialised) +. if dPDFHREF.BROKEN.COLOR \{\ +. \" +. \" The user may opt to have such broken links highlighted. +. \" We use "PDFHREF.BROKEN.COLOUR" to specify this requirement, +. \" but the user may prefer the American spelling, so we will +. \" handle both as equivalent. +. \" +. als PDFHREF.BROKEN.COLOUR PDFHREF.BROKEN.COLOR +. \} +. if dPDFHREF.BROKEN.COLOUR \{\ +. if dPDFHREF.COLOUR .als PDFHREF.COLOUR PDFHREF.BROKEN.COLOUR +. \} +. \} +. \} +. \} +.el \!.\\$0 \\$@ +.. +.\" +.\" Macro "pdf*href.mark.emit" is called only by "pdf*href". It is +.\" responsible for emitting the PDFMARK code, to establish the +.\" "hot-spot" region associated with a document or resource link. +.\" +.de pdf*href.mark.emit +.\" ---------------------------------------------------------------------- +.\" Usage: +.\" .pdf*href.mark.emit [] +.\" == 0 --> normal operation -- link height = 1 line +.\" == 1 --> start of link -- add leading above text +.\" == 2 --> overtall link -- set intermediate baseline +.\" == 3 --> split link -- break at bottom of page +.\" ---------------------------------------------------------------------- +.\" +.if \\$1=1 \{\ +. \" +. \" Initialising a new link region ... +. \" Some different versions of "groff" disagree about the vertical +. \" displacement of "opminy", as emitted by "\O1|\h'-\w"|"u'\O2\c", +. \" relative to the current text baseline. Therefore, recompute +. \" the link displacement, independently of "opminy". +. \" +. mk pdf:ury.base +. while \\n[pdf:ury.base]<\\n[pdf:ury] .nr pdf:ury.base +1v +. nr pdf:ury.base -1m+\\n[PDFHREF.LEADING] +. \" +. \" adjust the end-point vertical displacement by the same offset, +. \" and then relocate the link starting point to its new displacement, +. \" as established by this base line relative computation. +. \" +. nr pdf:lly.end +\\n[pdf:ury.base]-\\n[pdf:ury]+\\*[PDFHREF.HEIGHT] +. rnn pdf:ury.base pdf:ury +. \} +.if \\$1<2 \{\ +. \" +. \" Link segment fits on a single line ... +. \" Set its height and end-point horizontal displacement accordingly. +. \" +. nr pdf:lly \\n[pdf:ury]+\\*[PDFHREF.HEIGHT] +. if \\n[pdf:lly]>=\\n[pdf:lly.end] .nr pdf:urx \\$2 +. \} +.ie \\$1=3 \{\ +. \" +. \" Link segment extends beyond the next page break ... +. \" Recompute truncated height, to just fit portion on current page, +. \" recursing to emit it, and leaving page trap mechanism to place +. \" continuation region(s) on following page(s). +. \" +. nr pdf:lly (\\n[.t]u-\\n[.V]u)/1v +. if \\n[pdf:lly]>0 \{\ +. nr pdf:lly \\n[pdf:ury]+\\n[pdf:lly]v-1v+\\*[PDFHREF.HEIGHT] +. pdf*href.mark.emit 2 +. \} +. \} +.el \{\ +. \" Link region size and placement has been fully specified ... +. \" Emit it. +. \" +. pdfmark \\*[pdf:href.link] /Rect [\\*[pdf:bbox]] /ANN +. \} +.. +.\" +.\" When "pdf*href" emits a link for which the "hot-spot" spans a +.\" page break, then we need to provide a "hook" in to the page break +.\" trap, so we can map the "hot-spot" regions which are to be placed +.\" on either side of the page break. +.\" +.\" Macro "pdf*href.mark.idle" is a dummy macro, which provide this +.\" "hook" for normal page breaks, where there is no link "hot-spot" +.\" crossing the break. +.\" +.de pdf*href.mark.idle +.\" ---------------------------------------------------------------------- +.\" Usage: +.\" Called only as an internal hook, by a page trap macro. +.\" Expects no arguments, and does nothing. +.\" ---------------------------------------------------------------------- +.. +.\" +.\" Macro "pdf*href.mark.trap" is the active "hook", which is substituted +.\" for "pdf*href,mark.idle" at those page breaks which are crossed by +.\" a link "hot-spot". +.\" +.de pdf*href.mark.trap +.\" ---------------------------------------------------------------------- +.\" Usage: +.\" Called only as an internal hook, by a page trap macro. +.\" Expects no arguments. Maps residual link "hot-spot" regions, +.\" which spill beyond any page break. Not to be invoked directly +.\" by the user, nor by any user supplied macro. +.\" ---------------------------------------------------------------------- +.\" +.mk pdf:ury +.nr pdf:ury +1v-1m-\\n[PDFHREF.LEADING] +.ie \\n-[pdf:epg] \{\ +. \" +. \" The link "hot-spot" extends across more than one page break, +. \" so, for each page which is completely contained within the +. \" extent of the link, simply mark the entire text area on the +. \" page as a "hot-spot". +. \" +. pdf*href.mark.emit 3 +. \} +.el \{\ +. \" The link "hot-spot" ends on the page which immediately follows +. \" the current page transition, so we may now finalise this link. +. \" +. nr pdf:lly \\n[pdf:ury]+\\*[PDFHREF.HEIGHT] +. if \\n[pdf:lly.end]>\\n[pdf:lly] \{\ +. \" +. \" The "hot-spot" extends beyond the first line of text, +. \" on its final page; compute and emit "hot-spot" region to cover +. \" the full with of the text area, including all but the last +. \" line of the link text. +. \" +. while \\n[pdf:lly.end]>\\n[pdf:lly] .nr pdf:lly +1v +. nr pdf:lly -1v +. pdf*href.mark.emit 2 +. \" +. \" Now, adjust the vertical "hot-spot" mapping reference, +. \" to identify the correct position for the the last line of +. \" text, over which the "hot-spot" extends. +. \" +. nr pdf:ury \\n[pdf:lly.end]-\\*[PDFHREF.HEIGHT] +. \} +. \" +. \" We now have exactly one final line of text, over which we must +. \" emit a "hot-spot" region; map it, terminate page trap processing +. \" for this "hot-spot", and clean up the "hot-spot" mapping context. +. \" +. pdf*href.mark.emit 0 \\n[pdf:urx.end] +. als pdf*href.mark.hook pdf*href.mark.idle +. pdf*href.mark.flush +. \} +.. +.de pdf*href.mark.flush +.\" ---------------------------------------------------------------------- +.\" ---------------------------------------------------------------------- +.rr pdf:spg pdf:epg +.rr pdf:llx pdf:lly pdf:urx pdf:ury +.if dPDFHREF.COLOR .als PDFHREF.COLOUR PDFHREF.COLOR +.rr pdf:urx.end pdf:lly.end +.. +.de pdf*href.mark.end +.\" ---------------------------------------------------------------------- +.\" ---------------------------------------------------------------------- +\O1|\h'-\w"|"u'\O2\c +.. +.\" Macro "pdf*href-I" is used for one time initialisation of special +.\" "pdfhref" features; (currently, only the above page trap hook is +.\" supported, but it is implemented with one level of indirection, to +.\" accommodate possible future expansion). +. +.de pdf*href-I +.\" ---------------------------------------------------------------------- +.\" Usage: +.\" .pdfhref I -
    "); out->nl(); out->enable_newlines(TRUE); - blank_para = TRUE; break; + case PRE_TAG: out->put_string("
  • "); out->enable_newlines(TRUE); + blank_para = TRUE; + if (t->indent != NULL) + delete t->indent; + t->indent = NULL; + break; case SMALL_TAG: out->put_string(""); break; case BIG_TAG: out->put_string(""); break; case COLOR_TAG: out->put_string(""); break; @@ -168,19 +176,29 @@ /* * issue_tag - writes out an html tag with argument. + * space == 0 if no space is requested + * space == 1 if a space is requested + * space == 2 if tag should not have a space style */ -void html_text::issue_tag (const char *tagname, const char *arg) +void html_text::issue_tag (const char *tagname, const char *arg, + int space) { - if ((arg == 0) || (strlen(arg) == 0)) { + if ((arg == 0) || (strlen(arg) == 0)) out->put_string(tagname); - out->put_string(">"); - } else { + else { out->put_string(tagname); out->put_string(" "); out->put_string(arg); - out->put_string(">"); } + if (space == TRUE) { + out->put_string(" style=\"margin-top: "); + out->put_string(STYLE_VERTICAL_SPACE); + out->put_string("\""); + } + if (space == TRUE || space == FALSE) + out->put_string(" valign=\"top\""); + out->put_string(">"); } /* @@ -214,29 +232,31 @@ case I_TAG: issue_tag("arg1); break; case B_TAG: issue_tag("arg1); break; - case P_TAG: if (t->indent == NULL) { + case P_TAG: if (t->indent != NULL) { out->nl(); - issue_tag("\narg1); - } else { - out->nl(); +#if defined(DEBUGGING) out->simple_comment("INDENTATION"); - t->indent->begin(FALSE); - start_space = FALSE; - issue_tag("arg1); +#endif + out->put_string("\nindent->begin(start_space); + issue_tag("", (char *)t->arg1); + } else { + out->nl(); + issue_tag("\narg1, start_space); } out->enable_newlines(TRUE); break; case SUB_TAG: issue_tag("arg1); break; case SUP_TAG: issue_tag("arg1); break; case TT_TAG: issue_tag("arg1); break; - case PRE_TAG: if (t->indent != NULL) { - out->nl(); - out->simple_comment("INDENTATION"); - t->indent->begin(FALSE); - start_space = FALSE; - } - out->enable_newlines(TRUE); - out->nl(); issue_tag("arg1); + case PRE_TAG: out->enable_newlines(TRUE); + out->nl(); out->put_string("indent == NULL) + issue_tag("", (char *)t->arg1, start_space); + else { + t->indent->begin(start_space); + issue_tag("", (char *)t->arg1); + } out->enable_newlines(FALSE); break; case SMALL_TAG: issue_tag("arg1); break; case BIG_TAG: issue_tag("arg1); break; @@ -264,7 +284,7 @@ } p = stackptr; stackptr = stackptr->next; - free(p); + delete p; } lastptr = NULL; } @@ -285,6 +305,23 @@ return FALSE; } +/* + * uses_indent - returns TRUE if the current paragraph is using a + * html table to effect an indent. + */ + +int html_text::uses_indent (void) +{ + tag_definition *p = stackptr; + + while (p != NULL) { + if (p->indent != NULL) + return TRUE; + p = p->next; + } + return FALSE; +} + extern void stop(); /* @@ -337,7 +374,7 @@ void html_text::push_para (HTML_TAG t, void *arg, html_indent *in) { - tag_definition *p=(tag_definition *)malloc(sizeof(tag_definition)); + tag_definition *p= new tag_definition; p->type = t; p->arg1 = arg; @@ -357,7 +394,7 @@ void html_text::push_para (color *c) { - tag_definition *p=(tag_definition *)malloc(sizeof(tag_definition)); + tag_definition *p = new tag_definition; p->type = COLOR_TAG; p->arg1 = NULL; @@ -407,9 +444,11 @@ done_tt(); if (is_present(P_TAG)) { html_indent *i = remove_indent(P_TAG); + int space = retrieve_para_space(); (void)done_para(); if (! is_present(PRE_TAG)) push_para(PRE_TAG, NULL, i); + start_space = space; } else if (! is_present(PRE_TAG)) push_para(PRE_TAG, NULL, NULL); dump_stack(); @@ -475,8 +514,8 @@ /* * push tag onto temp stack */ - p->next = temp; - temp = p; + p->next = temp; + temp = p; } /* @@ -495,7 +534,7 @@ lastptr = NULL; if (p->indent != NULL) delete p->indent; - free(p); + delete p; } /* @@ -508,7 +547,7 @@ push_para(temp->type, temp->arg1, temp->indent); p = temp; temp = temp->next; - free(p); + delete p; } } return arg; @@ -607,7 +646,7 @@ void html_text::do_emittext (const char *s, int length) { if ((! is_present(P_TAG)) && (! is_present(PRE_TAG))) - do_para(""); + do_para("", FALSE); if (is_present(BREAK_TAG)) { int text = remove_break(); @@ -615,13 +654,12 @@ if (text) { if (is_present(PRE_TAG)) { out->nl(); - } else { + } else out->put_string("
    ").nl(); - } } - } else { + } else check_emit_text(stackptr); - } + out->put_string(s, length); space_emitted = FALSE; blank_para = FALSE; @@ -631,31 +669,32 @@ * do_para - starts a new paragraph */ -void html_text::do_para (const char *arg, html_indent *in) +void html_text::do_para (const char *arg, html_indent *in, int space) { if (! is_present(P_TAG)) { if (is_present(PRE_TAG)) { html_indent *i = remove_indent(PRE_TAG); done_pre(); - if (i == in || in == NULL) + if ((arg == NULL || (strcmp(arg, "") == 0)) && + (i == in || in == NULL)) in = i; else delete i; } remove_sub_sup(); push_para(P_TAG, (void *)arg, in); - space_emitted = TRUE; + start_space = space; } } -void html_text::do_para (const char *arg) +void html_text::do_para (const char *arg, int space) { - do_para(arg, NULL); + do_para(arg, NULL, space); } void html_text::do_para (simple_output *op, const char *arg1, int indentation_value, int page_offset, - int line_length) + int line_length, int space) { html_indent *ind; @@ -663,7 +702,7 @@ ind = NULL; else ind = new html_indent(op, indentation_value, page_offset, line_length); - do_para(arg1, ind); + do_para(arg1, ind, space); } /* @@ -672,8 +711,11 @@ char *html_text::done_para (void) { + char *result; space_emitted = TRUE; - return shutdown(P_TAG); + result = shutdown(P_TAG); + start_space = FALSE; + return result; } /* @@ -697,25 +739,30 @@ } /* + * remove_para_space - removes the leading space to a paragraph + * (effectively this trims off a leading `.sp' tag). + */ + +void html_text::remove_para_space (void) +{ + start_space = FALSE; +} + +/* * do_space - issues an end of paragraph */ void html_text::do_space (void) { if (is_in_pre()) { - if (blank_para) - start_space = TRUE; - else { - do_emittext("", 0); - out->nl(); - space_emitted = TRUE; - } + do_emittext("", 0); + out->force_nl(); + space_emitted = TRUE; } else { html_indent *i = remove_indent(P_TAG); - do_para(done_para(), i); + do_para(done_para(), i, TRUE); space_emitted = TRUE; - start_space = TRUE; } } @@ -725,13 +772,11 @@ void html_text::do_break (void) { - if (! is_present(PRE_TAG)) { - if (emitted_text()) { - if (! is_present(BREAK_TAG)) { + if (! is_present(PRE_TAG)) + if (emitted_text()) + if (! is_present(BREAK_TAG)) push_para(BREAK_TAG); - } - } - } + space_emitted = TRUE; } @@ -757,7 +802,8 @@ } /* - * ever_emitted_text - returns TRUE if we have ever emitted text in this paragraph. + * ever_emitted_text - returns TRUE if we have ever emitted text in this + * paragraph. */ int html_text::ever_emitted_text (void) @@ -766,7 +812,7 @@ } /* - * starts_with_space - returns TRUE if we have start this paragraph with a .sp + * starts_with_space - returns TRUE if we started this paragraph with a .sp */ int html_text::starts_with_space (void) @@ -775,19 +821,34 @@ } /* + * retrieve_para_space - returns TRUE, if the paragraph starts with + * a space and text has not yet been emitted. + * If TRUE is returned, then the, start_space, + * variable is set to FALSE. + */ + +int html_text::retrieve_para_space (void) +{ + if (start_space && blank_para) { + start_space = FALSE; + return TRUE; + } + else + return FALSE; +} + +/* * emit_space - writes a space providing that text was written beforehand. */ void html_text::emit_space (void) { - if (space_emitted) { - if (is_present(PRE_TAG)) { - do_emittext(" ", 1); - } - } else { + if (is_present(PRE_TAG)) + do_emittext(" ", 1); + else out->space_or_newline(); - space_emitted = TRUE; - } + + space_emitted = TRUE; } /* @@ -818,7 +879,7 @@ if (l->next == NULL) lastptr = l; } - free(p); + delete p; } } @@ -838,7 +899,8 @@ } /* - * remove_sub_sup - removes a sub or sup tag, should either exist on the stack. + * remove_sub_sup - removes a sub or sup tag, should either exist + * on the stack. */ void html_text::remove_sub_sup (void) @@ -883,7 +945,7 @@ if (l->next == NULL) lastptr = l; } - free(p); + delete p; } /* * now determine whether text was issued before
    @@ -911,8 +973,9 @@ while (p != NULL) { if (p->type == P_TAG && p->arg1 != NULL) { html_indent *i = remove_indent(P_TAG); + int space = retrieve_para_space(); done_para(); - do_para("", i); + do_para("", i, space); return; } p = p->next; @@ -921,6 +984,25 @@ } /* + * get_alignment - returns the alignment for the paragraph. + * If no alignment was given then we return "". + */ + +char *html_text::get_alignment (void) +{ + if (is_present(P_TAG)) { + tag_definition *p=stackptr; + + while (p != NULL) { + if (p->type == P_TAG && p->arg1 != NULL) + return (char *)p->arg1; + p = p->next; + } + } + return (char *)""; +} + +/* * do_small - potentially inserts a tag into the html stream. * However we check for a tag, if present then we terminate it. * Otherwise a tag is inserted. @@ -963,4 +1045,3 @@ { push_para(SUB_TAG); } - diff -ruN groff-1.19.1/src/devices/grohtml/html-text.h groff-1.19.2/src/devices/grohtml/html-text.h --- groff-1.19.1/src/devices/grohtml/html-text.h 2003-04-16 15:29:13.000000000 +0200 +++ groff-1.19.2/src/devices/grohtml/html-text.h 2005-05-26 15:37:18.000000000 +0200 @@ -1,5 +1,6 @@ // -*- C++ -*- -/* Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc. +/* Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005 + * Free Software Foundation, Inc. * * Gaius Mulley (gaius@glam.ac.uk) wrote html-text.h * @@ -23,11 +24,13 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "html.h" #include "html-table.h" +#define STYLE_VERTICAL_SPACE "1em" + /* * html tags */ @@ -64,9 +67,10 @@ void do_pre (void); void do_small (void); void do_big (void); - void do_para (const char *arg); // used for no indentation + void do_para (const char *arg, int space); // used for no indentation void do_para (simple_output *op, const char *arg1, - int indentation, int pageoffset, int linelength); + int indentation, int pageoffset, int linelength, + int space); void do_sup (void); void do_sub (void); void do_space (void); @@ -87,11 +91,15 @@ int emitted_text (void); int ever_emitted_text (void); int starts_with_space (void); + int retrieve_para_space (void); void emit_space (void); int is_in_pre (void); + int uses_indent (void); void remove_tag (HTML_TAG tag); void remove_sub_sup (void); void remove_para_align (void); + void remove_para_space (void); + char *get_alignment (void); private: tag_definition *stackptr; /* the current paragraph state */ @@ -108,7 +116,7 @@ int is_present (HTML_TAG t); void end_tag (tag_definition *t); void start_tag (tag_definition *t); - void do_para (const char *arg, html_indent *in); + void do_para (const char *arg, html_indent *in, int space); void push_para (HTML_TAG t); void push_para (HTML_TAG t, void *arg, html_indent *in); void push_para (color *c); @@ -116,7 +124,7 @@ char *shutdown (HTML_TAG t); void check_emit_text (tag_definition *t); int remove_break (void); - void issue_tag (const char *tagname, const char *arg); + void issue_tag (const char *tagname, const char *arg, int space=2); void issue_color_begin (color *c); void remove_def (tag_definition *t); html_indent *remove_indent (HTML_TAG tag); diff -ruN groff-1.19.1/src/devices/grohtml/output.cpp groff-1.19.2/src/devices/grohtml/output.cpp --- groff-1.19.1/src/devices/grohtml/output.cpp 2003-04-12 15:55:11.000000000 +0200 +++ groff-1.19.2/src/devices/grohtml/output.cpp 2005-05-26 15:37:18.000000000 +0200 @@ -1,5 +1,5 @@ // -*- C++ -*- -/* Copyright (C) 2000, 2001, 2003 Free Software Foundation, Inc. +/* Copyright (C) 2000, 2001, 2003, 2004, 2005 Free Software Foundation, Inc. * * Gaius Mulley (gaius@glam.ac.uk) wrote output.cpp * but it owes a huge amount of ideas and raw code from @@ -25,7 +25,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "driver.h" #include "stringclass.h" @@ -67,7 +67,7 @@ word::word (const char *w, int n) : next(0) { - s = (char *)malloc(n+1); + s = new char[n+1]; strncpy(s, w, n); s[n] = (char)0; } @@ -78,7 +78,7 @@ word::~word () { - free(s); + a_delete s; } /* @@ -253,6 +253,19 @@ } /* + * force_nl - forces a newline. + */ + +simple_output &simple_output::force_nl (void) +{ + space_or_newline(); + col += last_word.flush(fp); + FPUTC('\n', fp); + col = 0; + return *this ; +} + +/* * nl - writes a newline providing that we * are not in the first column. */ @@ -261,10 +274,8 @@ { space_or_newline(); col += last_word.flush(fp); - if (col != 0) { - FPUTC('\n', fp); - col = 0; - } + FPUTC('\n', fp); + col = 0; return *this ; } diff -ruN groff-1.19.1/src/devices/grohtml/post-html.cpp groff-1.19.2/src/devices/grohtml/post-html.cpp --- groff-1.19.1/src/devices/grohtml/post-html.cpp 2004-04-18 17:43:28.000000000 +0200 +++ groff-1.19.2/src/devices/grohtml/post-html.cpp 2005-05-26 15:37:18.000000000 +0200 @@ -1,5 +1,6 @@ // -*- C++ -*- -/* Copyright (C) 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. +/* Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005 + * Free Software Foundation, Inc. * * Gaius Mulley (gaius@glam.ac.uk) wrote post-html.cpp * but it owes a huge amount of ideas and raw code from @@ -21,7 +22,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "driver.h" #include "stringclass.h" @@ -38,6 +39,7 @@ #include #include +#include extern "C" const char *Version_string; @@ -50,8 +52,7 @@ #define MAX_LINE_LENGTH 60 /* maximum characters we want in a line */ #define SIZE_INCREMENT 2 /* font size increment = +2 */ -#define BASE_POINT_SIZE 10 /* 10 points is the base size ie html size 3 */ -#define CENTER_TOLERANCE 2 /* how many pixels off center will we still */ +#define CENTER_TOLERANCE 2 /* how many pixels off center do we allow */ #define ANCHOR_TEMPLATE "heading" /* if simple anchor is set we use this */ #define UNICODE_DESC_START 0x80 /* all character entities above this are */ /* either encoded by their glyph names or if */ @@ -60,7 +61,7 @@ typedef enum {col_tag, tab_tag, tab0_tag, none} colType; #undef DEBUG_TABLES - +// #define DEBUG_TABLES /* * prototypes @@ -83,6 +84,11 @@ static int multiple_files = FALSE; /* must we the output be divided into */ /* multiple html files, one for each */ /* heading? */ +static int base_point_size = 0; /* which troff font size maps onto html */ + /* size 3? */ +static int split_level = 2; /* what heading level to split at? */ +static string head_info; /* user supplied information to be placed */ + /* into */ /* @@ -114,7 +120,7 @@ static int is_intersection (int a1, int a2, int b1, int b2) { // easier to prove NOT outside limits - return( ! ((a1 > b2) || (a2 < b1)) ); + return ! ((a1 > b2) || (a2 < b1)); } /* @@ -123,7 +129,7 @@ static int is_digit (char ch) { - return( (ch >= '0') && (ch <= '9') ); + return (ch >= '0') && (ch <= '9'); } /* @@ -145,7 +151,7 @@ */ file::file (FILE *f) - : fp(f), next(0), new_output_file(FALSE), + : fp(f), next(NULL), new_output_file(FALSE), require_links(FALSE), output_file_name("") { } @@ -174,7 +180,7 @@ */ files::files () - : head(0), tail(0), ptr(0) + : head(NULL), tail(NULL), ptr(NULL) { } @@ -187,7 +193,7 @@ if (ptr) return ptr->fp; else - return 0; + return NULL; } /* @@ -205,7 +211,7 @@ void files::move_next (void) { - if (ptr != 0) + if (ptr != NULL) ptr = ptr->next; } @@ -215,7 +221,7 @@ void files::add_new_file (FILE *f) { - if (head == 0) { + if (head == NULL) { head = new file(f); tail = head; } else { @@ -313,7 +319,7 @@ }; style::style() - : f(0) + : f(NULL) { } @@ -349,14 +355,14 @@ }; char_block::char_block() -: buffer(NULL), used(0), next(0) +: buffer(NULL), used(0), next(NULL) { } char_block::char_block(int length) -: used(0), next(0) +: used(0), next(NULL) { - buffer = (char *)malloc(max(length, char_block::SIZE)); + buffer = new char[max(length, char_block::SIZE)]; if (buffer == NULL) fatal("out of memory error"); } @@ -364,7 +370,7 @@ char_block::~char_block() { if (buffer != NULL) - free(buffer); + a_delete buffer; } class char_buffer { @@ -379,13 +385,13 @@ }; char_buffer::char_buffer() -: head(0), tail(0) +: head(NULL), tail(NULL) { } char_buffer::~char_buffer() { - while (head != 0) { + while (head != NULL) { char_block *temp = head; head = head->next; delete temp; @@ -400,7 +406,7 @@ if (s == NULL || length == 0) return NULL; - if (tail == 0) { + if (tail == NULL) { tail = new char_block(length+1); head = tail; } else { @@ -425,7 +431,7 @@ // and return start of new string - return( &tail->buffer[old_used] ); + return &tail->buffer[old_used]; } char *char_buffer::add_string (const string &s) @@ -466,7 +472,10 @@ int is_in (void); int is_po (void); int is_ti (void); + int is_ll (void); int is_ce (void); + int is_tl (void); + int is_eo_tl (void); int is_eol_ce (void); int is_col (void); int is_tab (void); @@ -476,6 +485,7 @@ int is_tab_te (void); int is_nf (void); int is_fi (void); + int is_eo_h (void); int get_arg (void); int get_tab_args (char *align); @@ -516,7 +526,7 @@ } text_glob::text_glob () - : text_string(0), text_length(0), minv(-1), minh(-1), maxv(-1), maxh(-1), + : text_string(NULL), text_length(0), minv(-1), minh(-1), maxv(-1), maxh(-1), is_tag(FALSE), is_special(FALSE), is_line(FALSE), thickness(0), tab(NULL) { } @@ -649,7 +659,7 @@ int text_glob::is_eol (void) { - return( is_tag && (strcmp(text_string, "html-tag:eol") == 0) ); + return is_tag && (strcmp(text_string, "devtag:.eol") == 0); } /* @@ -658,26 +668,56 @@ int text_glob::is_eol_ce (void) { - return( is_tag && (strcmp(text_string, "html-tag:eol.ce") == 0) ); + return is_tag && (strcmp(text_string, "devtag:eol.ce") == 0); } +/* + * is_tl - returns TRUE if glob contains the tag .tl + */ + +int text_glob::is_tl (void) +{ + return is_tag && (strcmp(text_string, "devtag:.tl") == 0); +} + +/* + * is_eo_tl - returns TRUE if glob contains the tag eo.tl + */ + +int text_glob::is_eo_tl (void) +{ + return is_tag && (strcmp(text_string, "devtag:.eo.tl") == 0); +} /* - * is_nf - returns TRUE if glob contains the tag .nf + * is_nf - returns TRUE if glob contains the tag .fi 0 */ int text_glob::is_nf (void) { - return( is_tag && (strcmp(text_string, "html-tag:.nf") == 0) ); + return is_tag && (strncmp(text_string, "devtag:.fi", + strlen("devtag:.fi")) == 0) && + (get_arg() == 0); } /* - * is_fi - returns TRUE if glob contains the tag .fi + * is_fi - returns TRUE if glob contains the tag .fi 1 */ int text_glob::is_fi (void) { - return( is_tag && (strcmp(text_string, "html-tag:.fi") == 0) ); + return( is_tag && (strncmp(text_string, "devtag:.fi", + strlen("devtag:.fi")) == 0) && + (get_arg() == 1) ); +} + +/* + * is_eo_h - returns TRUE if glob contains the tag .eo.h + */ + +int text_glob::is_eo_h (void) +{ + return is_tag && (strcmp(text_string, "devtag:.eo.h") == 0); } /* @@ -686,7 +726,8 @@ int text_glob::is_ce (void) { - return( is_tag && (strcmp(text_string, "html-tag:.ce") == 0) ); + return is_tag && (strncmp(text_string, "devtag:.ce", + strlen("devtag:.ce")) == 0); } /* @@ -695,7 +736,8 @@ int text_glob::is_in (void) { - return( is_tag && (strncmp(text_string, "html-tag:.in ", strlen("html-tag:.in ")) == 0) ); + return is_tag && (strncmp(text_string, "devtag:.in ", + strlen("devtag:.in ")) == 0); } /* @@ -704,7 +746,8 @@ int text_glob::is_po (void) { - return( is_tag && (strncmp(text_string, "html-tag:.po ", strlen("html-tag:.po ")) == 0) ); + return is_tag && (strncmp(text_string, "devtag:.po ", + strlen("devtag:.po ")) == 0); } /* @@ -713,7 +756,18 @@ int text_glob::is_ti (void) { - return( is_tag && (strncmp(text_string, "html-tag:.ti ", strlen("html-tag:.ti ")) == 0) ); + return is_tag && (strncmp(text_string, "devtag:.ti ", + strlen("devtag:.ti ")) == 0); +} + +/* + * is_ll - returns TRUE if glob contains the tag .ll + */ + +int text_glob::is_ll (void) +{ + return is_tag && (strncmp(text_string, "devtag:.ll ", + strlen("devtag:.ll ")) == 0); } /* @@ -722,7 +776,8 @@ int text_glob::is_col (void) { - return( is_tag && (strncmp(text_string, "html-tag:.col", strlen("html-tag:.col")) == 0) ); + return is_tag && (strncmp(text_string, "devtag:.col", + strlen("devtag:.col")) == 0); } /* @@ -731,7 +786,7 @@ int text_glob::is_tab_ts (void) { - return( is_tag && (strcmp(text_string, "html-tag:.tab-ts") == 0) ); + return is_tag && (strcmp(text_string, "devtag:.tab-ts") == 0); } /* @@ -740,7 +795,7 @@ int text_glob::is_tab_te (void) { - return( is_tag && (strcmp(text_string, "html-tag:.tab-te") == 0) ); + return is_tag && (strcmp(text_string, "devtag:.tab-te") == 0); } /* @@ -749,7 +804,8 @@ int text_glob::is_ta (void) { - return( is_tag && (strncmp(text_string, "html-tag:.ta ", strlen("html-tag:.ta ")) == 0) ); + return is_tag && (strncmp(text_string, "devtag:.ta ", + strlen("devtag:.ta ")) == 0); } /* @@ -758,7 +814,8 @@ int text_glob::is_tab (void) { - return( is_tag && (strncmp(text_string, "html-tag:tab ", strlen("html-tag:tab ")) == 0) ); + return is_tag && (strncmp(text_string, "devtag:tab ", + strlen("devtag:tab ")) == 0); } /* @@ -767,7 +824,8 @@ int text_glob::is_tab0 (void) { - return( is_tag && (strncmp(text_string, "html-tag:tab0", strlen("html-tag:tab0")) == 0) ); + return is_tag && (strncmp(text_string, "devtag:tab0", + strlen("devtag:tab0")) == 0); } /* @@ -789,14 +847,14 @@ int text_glob::is_br (void) { - return( is_a_tag() && ((strcmp ("html-tag:.br", text_string) == 0) || - (strncmp("html-tag:.sp", text_string, 11) == 0) || - (strcmp ("html-tag:.ce", text_string) == 0)) ); + return is_a_tag() && ((strcmp ("devtag:.br", text_string) == 0) || + (strncmp("devtag:.sp", text_string, + strlen("devtag:.sp")) == 0)); } int text_glob::get_arg (void) { - if (strncmp("html-tag:", text_string, strlen("html-tag:")) == 0) { + if (strncmp("devtag:", text_string, strlen("devtag:")) == 0) { const char *p = text_string; while ((*p != (char)0) && (!isspace(*p))) @@ -816,7 +874,7 @@ int text_glob::get_tab_args (char *align) { - if (strncmp("html-tag:", text_string, strlen("html-tag:")) == 0) { + if (strncmp("devtag:", text_string, strlen("devtag:")) == 0) { const char *p = text_string; // firstly the alignment C|R|L @@ -858,10 +916,11 @@ } /* - * the class and methods used to construct ordered double linked lists. - * In a previous implementation we used templates via #include "ordered-list.h", - * but this does assume that all C++ compilers can handle this feature. Pragmatically - * it is safer to assume this is not the case. + * the class and methods used to construct ordered double linked + * lists. In a previous implementation we used templates via + * #include "ordered-list.h", but this does assume that all C++ + * compilers can handle this feature. Pragmatically it is safer to + * assume this is not the case. */ struct element_list { @@ -977,7 +1036,8 @@ } /* - * add - adds a datum to the list in the order specified by the region position. + * add - adds a datum to the list in the order specified by the + * region position. */ void list::add (text_glob *in, int line_number, int min_vertical, int min_horizontal, int max_vertical, int max_horizontal) @@ -986,7 +1046,13 @@ element_list *t = new element_list(in, line_number, min_vertical, min_horizontal, max_vertical, max_horizontal); element_list *last; - if (head == 0) { +#if 0 + fprintf(stderr, "[%s %d,%d,%d,%d] ", + in->text_string, min_vertical, min_horizontal, max_vertical, max_horizontal); + fflush(stderr); +#endif + + if (head == NULL) { head = t; tail = t; ptr = t; @@ -995,9 +1061,8 @@ } else { last = tail; - while ((last != head) && (is_less(t, last))) { + while ((last != head) && (is_less(t, last))) last = last->left; - } if (is_less(t, last)) { t->right = last; @@ -1005,9 +1070,8 @@ t->left = last->left; last->left = t; // now check for a new head - if (last == head) { + if (last == head) head = t; - } } else { // add t beyond last t->right = last->right; @@ -1015,9 +1079,8 @@ last->right->left = t; last->right = t; // now check for a new tail - if (last == tail) { + if (last == tail) tail = t; - } } } } @@ -1032,22 +1095,20 @@ element_list *t=ptr->right; if (head == tail) { - head = 0; - if (tail != 0) { + head = NULL; + if (tail != NULL) delete tail; - } - tail = 0; - ptr = 0; + + tail = NULL; + ptr = NULL; } else { - if (head == ptr) { + if (head == ptr) head = head->right; - } - if (tail == ptr) { + if (tail == ptr) tail = tail->left; - } ptr->left->right = ptr->right; ptr->right->left = ptr->left; - ptr=t; + ptr = t; } } @@ -1075,7 +1136,7 @@ int list::is_empty (void) { - return( head == 0 ); + return head == NULL; } /* @@ -1084,7 +1145,7 @@ int list::is_equal_to_tail (void) { - return( ptr == tail ); + return ptr == tail; } /* @@ -1093,7 +1154,7 @@ int list::is_equal_to_head (void) { - return( ptr == head ); + return ptr == head; } /* @@ -1120,7 +1181,7 @@ text_glob* list::get_data (void) { - return( ptr->datum ); + return ptr->datum; } /* @@ -1131,11 +1192,10 @@ text_glob* list::move_right_get_data (void) { ptr = ptr->right; - if (ptr == head) { - return( 0 ); - } else { - return( ptr->datum ); - } + if (ptr == head) + return NULL; + else + return ptr->datum; } /* @@ -1146,11 +1206,10 @@ text_glob* list::move_left_get_data (void) { ptr = ptr->left; - if (ptr == tail) { - return( 0 ); - } else { - return( ptr->datum ); - } + if (ptr == tail) + return NULL; + else + return ptr->datum; } /* @@ -1162,7 +1221,7 @@ if (is_empty()) fatal("list must not be empty if we are inserting data"); else { - if (ptr == 0) + if (ptr == NULL) ptr = head; element_list *t = new element_list(in, ptr->lineno, ptr->minv, ptr->minh, ptr->maxv, ptr->maxh); @@ -1205,7 +1264,8 @@ void add_and_encode (style *s, const string &str, int line_number, int min_vertical, int min_horizontal, - int max_vertical, int max_horizontal); + int max_vertical, int max_horizontal, + int is_tag); void add_line (style *s, int line_number, int x1, int y1, int x2, int y2, @@ -1267,7 +1327,8 @@ if (str.length() > 0) { text_glob *g; - if (strncmp((str+'\0').contents(), "html-tag:.auto-image", 20) == 0) { + if (strncmp((str+'\0').contents(), "devtag:.auto-image", + strlen("devtag:.auto-image")) == 0) { g = new text_glob(); g->text_glob_auto_image(s, buffer.add_string(str), str.length(), min_vertical, min_horizontal, max_vertical, max_horizontal); @@ -1327,7 +1388,8 @@ void page::add_and_encode (style *s, const string &str, int line_number, int min_vertical, int min_horizontal, - int max_vertical, int max_horizontal) + int max_vertical, int max_horizontal, + int is_tag) { string html_string; char *html_glyph; @@ -1366,9 +1428,18 @@ } if (html_string.length() > 0) { text_glob *g=new text_glob(); - g->text_glob_special(s, buffer.add_string(html_string), html_string.length(), - min_vertical, min_horizontal, max_vertical, max_horizontal); - glyphs.add(g, line_number, min_vertical, min_horizontal, max_vertical, max_horizontal); + if (is_tag) + g->text_glob_tag(s, buffer.add_string(html_string), + html_string.length(), + min_vertical, min_horizontal, + max_vertical, max_horizontal); + else + g->text_glob_special(s, buffer.add_string(html_string), + html_string.length(), + min_vertical, min_horizontal, + max_vertical, max_horizontal); + glyphs.add(g, line_number, min_vertical, + min_horizontal, max_vertical, max_horizontal); } } @@ -1532,6 +1603,337 @@ } } +struct assert_pos { + assert_pos *next; + const char *val; + const char *id; +}; + +class assert_state { +public: + assert_state (); + ~assert_state (); + + void addx (const char *c, const char *i, const char *v, + const char *f, const char *l); + void addy (const char *c, const char *i, const char *v, + const char *f, const char *l); + void build(const char *c, const char *v, + const char *f, const char *l); + void check_br (int br); + void check_ce (int ce); + void check_fi (int fi); + void check_sp (int sp); + void reset (void); + +private: + int check_br_flag; + int check_ce_flag; + int check_fi_flag; + int check_sp_flag; + const char *val_br; + const char *val_ce; + const char *val_fi; + const char *val_sp; + const char *file_br; + const char *file_ce; + const char *file_fi; + const char *file_sp; + const char *line_br; + const char *line_ce; + const char *line_fi; + const char *line_sp; + + assert_pos *xhead; + assert_pos *yhead; + + void add (assert_pos **h, + const char *c, const char *i, const char *v, + const char *f, const char *l); + void compare(assert_pos *t, + const char *v, const char *f, const char *l); + void close (const char *c); + void set (const char *c, const char *v, + const char *f, const char *l); + void check_value (const char *s, int v, const char *name, + const char *f, const char *l, int *flag); + int check_value_error (int c, int v, const char *s, + const char *name, + const char *f, const char *l, int flag); +}; + +assert_state::assert_state () +{ + reset(); + val_br = NULL; + val_ce = NULL; + val_fi = NULL; + val_sp = NULL; + file_br = NULL; + file_ce = NULL; + file_fi = NULL; + file_sp = NULL; + line_br = NULL; + line_ce = NULL; + line_fi = NULL; + line_sp = NULL; + xhead = NULL; + yhead = NULL; +} + +assert_state::~assert_state () +{ + assert_pos *t; + + while (xhead != NULL) { + t = xhead; + xhead = xhead->next; + a_delete (char *)t->val; + a_delete (char *)t->id; + delete t; + } + while (yhead != NULL) { + t = yhead; + yhead = yhead->next; + a_delete (char *)t->val; + a_delete (char *)t->id; + delete t; + } +} + +void assert_state::reset (void) +{ + check_br_flag = 0; + check_ce_flag = 0; + check_fi_flag = 0; + check_sp_flag = 0; +} + +void assert_state::add (assert_pos **h, + const char *c, const char *i, const char *v, + const char *f, const char *l) +{ + assert_pos *t = *h; + + while (t != NULL) { + if (strcmp(t->id, i) == 0) + break; + t = t->next; + } + if (t != NULL && v != NULL && (v[0] != '=')) + compare(t, v, f, l); + else { + if (t == NULL) { + t = new assert_pos; + t->next = *h; + (*h) = t; + } + if (v == NULL || v[0] != '=') { + if (f == NULL) + f = "stdin"; + if (l == NULL) + l = ""; + if (v == NULL) + v = "no value at all"; + fprintf(stderr, "%s:%s:error in assert format of id=%s expecting value to be prefixed with an `=' got %s\n", + f, l, i, v); + } + t->id = i; + t->val = v; + a_delete (char *)c; + a_delete (char *)f; + a_delete (char *)l; + } +} + +void assert_state::addx (const char *c, const char *i, const char *v, + const char *f, const char *l) +{ + add(&xhead, c, i, v, f, l); +} + +void assert_state::addy (const char *c, const char *i, const char *v, + const char *f, const char *l) +{ + add(&yhead, c, i, v, f, l); +} + +void assert_state::compare(assert_pos *t, + const char *v, const char *f, const char *l) +{ + const char *s=t->val; + + while ((*v) == '=') + v++; + while ((*s) == '=') + s++; + + if (strcmp(v, s) != 0) { + if (f == NULL) + f = "stdin"; + if (l == NULL) + l = ""; + fprintf(stderr, "%s:%s: grohtml assertion failed at id%s expecting %s and was given %s\n", + f, l, t->id, s, v); + } +} + +void assert_state::close (const char *c) +{ + if (strcmp(c, "sp") == 0) + check_sp_flag = 0; + else if (strcmp(c, "br") == 0) + check_br_flag = 0; + else if (strcmp(c, "fi") == 0) + check_fi_flag = 0; + else if (strcmp(c, "nf") == 0) + check_fi_flag = 0; + else if (strcmp(c, "ce") == 0) + check_ce_flag = 0; + else + fprintf(stderr, "internal error: unrecognised tag in grohtml (%s)\n", c); +} + +const char *replace_negate_str (const char *before, char *after) +{ + if (before != NULL) + a_delete (char *)before; + + if (strlen(after) > 0) { + int d = atoi(after); + + if (d < 0 || d > 1) { + fprintf(stderr, "expecting nf/fi value to be 0 or 1 not %d\n", d); + d = 0; + } + if (d == 0) + after[0] = '1'; + else + after[0] = '0'; + after[1] = (char)0; + } + return after; +} + +const char *replace_str (const char *before, const char *after) +{ + if (before != NULL) + a_delete (char *)before; + return after; +} + +void assert_state::set (const char *c, const char *v, + const char *f, const char *l) +{ + if (l == NULL) + l = ""; + if (f == NULL) + f = "stdin"; + + // fprintf(stderr, "%s:%s:setting %s to %s\n", f, l, c, v); + if (strcmp(c, "sp") == 0) { + check_sp_flag = 1; + val_sp = replace_str(val_sp, strsave(v)); + file_sp = replace_str(file_sp, strsave(f)); + line_sp = replace_str(line_sp, strsave(l)); + } else if (strcmp(c, "br") == 0) { + check_br_flag = 1; + val_br = replace_str(val_br, strsave(v)); + file_br = replace_str(file_br, strsave(f)); + line_br = replace_str(line_br, strsave(l)); + } else if (strcmp(c, "fi") == 0) { + check_fi_flag = 1; + val_fi = replace_str(val_fi, strsave(v)); + file_fi = replace_str(file_fi, strsave(f)); + line_fi = replace_str(line_fi, strsave(l)); + } else if (strcmp(c, "nf") == 0) { + check_fi_flag = 1; + val_fi = replace_negate_str(val_fi, strsave(v)); + file_fi = replace_str(file_fi, strsave(f)); + line_fi = replace_str(line_fi, strsave(l)); + } else if (strcmp(c, "ce") == 0) { + check_ce_flag = 1; + val_ce = replace_str(val_ce, strsave(v)); + file_ce = replace_str(file_ce, strsave(f)); + line_ce = replace_str(line_ce, strsave(l)); + } +} + +/* + * build - builds the troff state assertion. + * see tmac/www.tmac for cmd examples. + */ + +void assert_state::build (const char *c, const char *v, + const char *f, const char *l) +{ + if (c[0] == '{') + set(&c[1], v, f, l); + if (c[0] == '}') + close(&c[1]); +} + +int assert_state::check_value_error (int c, int v, const char *s, + const char *name, + const char *f, const char *l, int flag) +{ + if (! c) { + if (f == NULL) + f = "stdin"; + if (l == NULL) + l = ""; + fprintf(stderr, "%s:%s:grohtml (troff state) assertion failed, expected %s to be %s but found it to contain %d\n", + f, l, name, s, v); + return 0; + } + return flag; +} + +void assert_state::check_value (const char *s, int v, const char *name, + const char *f, const char *l, int *flag) +{ + if (strncmp(s, "<=", 2) == 0) + *flag = check_value_error(v <= atoi(&s[2]), v, s, name, f, l, *flag); + else if (strncmp(s, ">=", 2) == 0) + *flag = check_value_error(v >= atoi(&s[2]), v, s, name, f, l, *flag); + else if (strncmp(s, "==", 2) == 0) + *flag = check_value_error(v == atoi(&s[2]), v, s, name, f, l, *flag); + else if (strncmp(s, "!=", 2) == 0) + *flag = check_value_error(v != atoi(&s[2]), v, s, name, f, l, *flag); + else if (strncmp(s, "<", 1) == 0) + *flag = check_value_error(v < atoi(&s[2]), v, s, name, f, l, *flag); + else if (strncmp(s, ">", 1) == 0) + *flag = check_value_error(v > atoi(&s[2]), v, s, name, f, l, *flag); + else if (strncmp(s, "=", 1) == 0) + *flag = check_value_error(v == atoi(&s[1]), v, s, name, f, l, *flag); + else + *flag = check_value_error(v == atoi(s), v, s, name, f, l, *flag); +} + +void assert_state::check_sp (int sp) +{ + if (check_sp_flag) + check_value(val_sp, sp, "sp", file_sp, line_sp, &check_sp_flag); +} + +void assert_state::check_fi (int fi) +{ + if (check_fi_flag) + check_value(val_fi, fi, "fi", file_fi, line_fi, &check_fi_flag); +} + +void assert_state::check_br (int br) +{ + if (check_br_flag) + check_value(val_br, br, "br", file_br, line_br, &check_br_flag); +} + +void assert_state::check_ce (int ce) +{ + if (check_ce_flag) + check_value(val_ce, ce, "ce", file_ce, line_ce, &check_ce_flag); +} + class html_printer : public printer { files file_list; simple_output html; @@ -1575,12 +1977,26 @@ int max_linelength; int linelength; int pageoffset; - int indentation; - int prev_indent; + int troff_indent; + int device_indent; + int temp_indent; int pointsize; int vertical_spacing; int line_number; color *background; + int seen_indent; + int next_indent; + int seen_pageoffset; + int next_pageoffset; + int seen_linelength; + int next_linelength; + int seen_center; + int next_center; + int seen_space; + int seen_break; + int current_column; + int row_space; + assert_state as; void flush_sbuf (); void set_style (const style &); @@ -1606,15 +2022,18 @@ void start_font (const char *name); void end_font (const char *name); int is_font_courier (font *f); + int is_line_start (int nf); int is_courier_until_eol (void); void start_size (int from, int to); void do_font (text_glob *g); void do_center (char *arg); + void do_check_center (void); void do_break (void); + void do_space (char *arg); void do_eol (void); void do_eol_ce (void); void do_title (void); - void do_fill (int on); + void do_fill (char *arg); void do_heading (char *arg); void write_header (void); void determine_header_level (int level); @@ -1632,6 +2051,7 @@ void do_links (void); void do_flush (void); void do_job_name (char *name); + void do_head (char *name); void insert_split_file (void); int is_in_middle (int left, int right); void do_sup_or_sub (text_glob *g); @@ -1667,6 +2087,14 @@ void write_navigation (const string &top, const string &prev, const string &next, const string ¤t); void emit_link (const string &to, const char *name); + int get_troff_indent (void); + void restore_troff_indent (void); + void handle_assertion (int minv, int minh, int maxv, int maxh, const char *s); + void handle_state_assertion (text_glob *g); + void do_end_para (text_glob *g); + int round_width (int x); + void handle_tag_within_title (text_glob *g); + void writeHeadMetaStyle (void); // ADD HERE public: @@ -1674,10 +2102,13 @@ ~html_printer (); void set_char (int i, font *f, const environment *env, int w, const char *name); void set_numbered_char(int num, const environment *env, int *widthp); + int set_char_and_width(const char *nm, const environment *env, + int *widthp, font **f); void draw (int code, int *p, int np, const environment *env); void begin_page (int); void end_page (int); void special (char *arg, const environment *env, char type); + void devtag (char *arg, const environment *env, char type); font *make_font (const char *); void end_of_line (); }; @@ -1744,6 +2175,24 @@ } /* + * restore_troff_indent - is called when we have temporarily shutdown + * indentation (typically done when we have + * centered an image). + */ + +void html_printer::restore_troff_indent (void) +{ + troff_indent = next_indent; + if (troff_indent > 0) { + /* + * force device indentation + */ + device_indent = 0; + do_indent(get_troff_indent(), pageoffset, linelength); + } +} + +/* * emit_raw - writes the raw html information directly to the device. */ @@ -1754,17 +2203,20 @@ determine_space(g); current_paragraph->do_emittext(g->text_string, g->text_length); } else { + int space = current_paragraph->retrieve_para_space() || seen_space; + current_paragraph->done_para(); + shutdown_table(); switch (next_tag) { case CENTERED: - current_paragraph->do_para("align=center"); + current_paragraph->do_para("align=center", space); break; case LEFT: - current_paragraph->do_para(&html, "align=left", indentation, pageoffset, linelength); + current_paragraph->do_para(&html, "align=left", get_troff_indent(), pageoffset, linelength, space); break; case RIGHT: - current_paragraph->do_para(&html, "align=right", indentation, pageoffset, linelength); + current_paragraph->do_para(&html, "align=right", get_troff_indent(), pageoffset, linelength, space); break; default: fatal("unknown enumeration"); @@ -1773,39 +2225,37 @@ current_paragraph->done_para(); next_tag = INLINE; supress_sub_sup = TRUE; - if (indentation > 0) { - /* - * restore indentation - */ - int newin = indentation; - indentation = 0; - do_indent(newin, pageoffset, linelength); - } + seen_space = FALSE; + restore_troff_indent(); } } /* + * handle_tag_within_title - handle a limited number of tags within + * the context of a table. Those tags which + * set values rather than generate spaces + * and paragraphs. + */ + +void html_printer::handle_tag_within_title (text_glob *g) +{ + if (g->is_in() || g->is_ti() || g->is_po() || g->is_ce() || g->is_ll() + || g->is_fi() || g->is_nf()) + troff_tag(g); +} + +/* * do_center - handle the .ce commands from troff. */ void html_printer::do_center (char *arg) { - int n = atoi(arg); - current_paragraph->do_break(); - - if (n > 0) { - current_paragraph->done_para(); - supress_sub_sup = TRUE; - current_paragraph->do_para("align=center"); - end_center += n; - } else { - end_center = 0; - current_paragraph->remove_para_align(); - } + next_center = atoi(arg); + seen_center = TRUE; } /* - * do_centered_image - set a flag such that the next html-tag is + * do_centered_image - set a flag such that the next devtag is * placed inside a centered paragraph. */ @@ -1815,7 +2265,7 @@ } /* - * do_right_image - set a flag such that the next html-tag is + * do_right_image - set a flag such that the next devtag is * placed inside a right aligned paragraph. */ @@ -1825,7 +2275,7 @@ } /* - * do_left_image - set a flag such that the next html-tag is + * do_left_image - set a flag such that the next devtag is * placed inside a left aligned paragraph. */ @@ -1863,7 +2313,8 @@ filename++; } if (exists(filename)) - *s += string(""; + *s += string(""; return *s; } @@ -1912,7 +2363,6 @@ { text_glob *t; int removed_from_head; - int eol_ce = 0; if (page_number == 1) { int found_title_start = FALSE; @@ -1934,24 +2384,16 @@ page_contents->glyphs.sub_move_right(); /* move onto next word */ removed_from_head = ((!page_contents->glyphs.is_empty()) && (page_contents->glyphs.is_equal_to_head())); - } else if (t->is_eol_ce()) { - /* process the eol associated with .ce - */ - eol_ce++; - page_contents->glyphs.sub_move_right(); /* move onto next word */ - } else if (t->is_eol()) { + } else if (t->is_eo_tl()) { /* end of title found */ title.has_been_found = TRUE; - outstanding_eol(eol_ce); return; } else if (t->is_a_tag()) { - /* end of title found, but move back so that we read this tag and process it - */ - page_contents->glyphs.move_left(); /* move backwards to last word */ - title.has_been_found = TRUE; - outstanding_eol(eol_ce); - return; + handle_tag_within_title(t); + page_contents->glyphs.sub_move_right(); /* move onto next word */ + removed_from_head = ((!page_contents->glyphs.is_empty()) && + (page_contents->glyphs.is_equal_to_head())); } else if (found_title_start) { title.text += " " + string(t->text_string, t->text_length); page_contents->glyphs.sub_move_right(); /* move onto next word */ @@ -1965,15 +2407,17 @@ removed_from_head = ((!page_contents->glyphs.is_empty()) && (page_contents->glyphs.is_equal_to_head())); } - } while ((! page_contents->glyphs.is_equal_to_head()) || (removed_from_head)); + } while ((! page_contents->glyphs.is_equal_to_head()) || + (removed_from_head)); } - outstanding_eol(eol_ce); } } void html_printer::write_header (void) { if (! header.header_buffer.empty()) { + int space = current_paragraph->retrieve_para_space() || seen_space; + if (header.header_level > 7) { header.header_level = 7; } @@ -2001,7 +2445,7 @@ // lastly we generate a tag - html.nl().put_string("
    do_para(&html, "", indentation, pageoffset, linelength); + current_paragraph->do_para(&html, "", get_troff_indent(), pageoffset, linelength, space); } } @@ -2075,7 +2519,7 @@ } } header.header_level = level+1; - if (header.header_level == 2) { + if (header.header_level >= 2 && header.header_level <= split_level) { header.no_of_level_one_headings++; insert_split_file(); } @@ -2088,39 +2532,46 @@ void html_printer::do_heading (char *arg) { text_glob *g; - text_glob *l = 0; int level=atoi(arg); + int horiz; header.header_buffer.clear(); page_contents->glyphs.move_right(); if (! page_contents->glyphs.is_equal_to_head()) { g = page_contents->glyphs.get_data(); + horiz = g->minh; do { if (g->is_auto_img()) { string img=generate_img_src((char *)(g->text_string + 20)); if (! img.empty()) { simple_anchors = TRUE; // we cannot use full heading anchors with images - if (l != 0) + if (horiz < g->minh) header.header_buffer += " "; - l = g; header.header_buffer += img; } - } else if (! (g->is_a_line() || g->is_a_tag())) { + } + else if (g->is_in() || g->is_ti() || g->is_po() || g->is_ce() || g->is_ll()) + troff_tag(g); + else if (g->is_fi()) + fill_on = 1; + else if (g->is_nf()) + fill_on = 0; + else if (! (g->is_a_line() || g->is_a_tag())) { /* - * we ignore tag commands when constructing a heading + * we ignore the other tag commands when constructing a heading */ - if (l != 0) + if (horiz < g->minh) header.header_buffer += " "; - l = g; + horiz = g->maxh; header.header_buffer += string(g->text_string, g->text_length); } page_contents->glyphs.move_right(); g = page_contents->glyphs.get_data(); } while ((! page_contents->glyphs.is_equal_to_head()) && - (! g->is_br())); + (! g->is_eo_h())); } determine_header_level(level); @@ -2170,8 +2621,8 @@ if (max_linelength == -1) max_linelength = atoi(arg); - if (fill_on) - do_indent(indentation, pageoffset, atoi(arg)); + next_linelength = atoi(arg); + seen_linelength = TRUE; } /* @@ -2180,8 +2631,20 @@ void html_printer::do_pageoffset (char *arg) { - if (fill_on) - do_indent(indentation, atoi(arg), linelength); + next_pageoffset = atoi(arg); + seen_pageoffset = TRUE; +} + +/* + * get_troff_indent - returns the indent value. + */ + +int html_printer::get_troff_indent (void) +{ + if (end_tempindent > 0) + return temp_indent; + else + return troff_indent; } /* @@ -2190,8 +2653,8 @@ void html_printer::do_indentation (char *arg) { - if (fill_on) - do_indent(atoi(arg), pageoffset, linelength); + next_indent = atoi(arg); + seen_indent = TRUE; } /* @@ -2201,9 +2664,12 @@ void html_printer::do_tempindent (char *arg) { if (fill_on) { - end_tempindent = 1; - prev_indent = indentation; - do_indent(atoi(arg), pageoffset, linelength); + /* + * we set the end_tempindent to 2 as the first .br + * activates the .ti and the second terminates it. + */ + end_tempindent = 2; + temp_indent = atoi(arg); } } @@ -2229,17 +2695,19 @@ void html_printer::do_indent (int in, int pageoff, int linelen) { - if ((indentation != -1) && - (pageoffset+indentation != in+pageoff)) { - + if ((device_indent != -1) && + (pageoffset+device_indent != in+pageoff)) { + + int space = current_paragraph->retrieve_para_space() || seen_space; current_paragraph->done_para(); - indentation = in; + device_indent = in; pageoffset = pageoff; if (linelen <= max_linelength) linelength = linelen; - current_paragraph->do_para(&html, "", indentation, pageoffset, max_linelength); + current_paragraph->do_para(&html, "", device_indent, + pageoffset, max_linelength, space); } } @@ -2258,24 +2726,56 @@ void html_printer::do_pointsize (char *arg) { - pointsize = atoi(arg); + /* + * firstly check to see whether this point size is really associated with a .tl tag + */ + + if (! page_contents->glyphs.is_empty()) { + text_glob *g = page_contents->glyphs.get_data(); + text_glob *t = page_contents->glyphs.get_data(); + + while (t->is_a_tag() && (! page_contents->glyphs.is_equal_to_head())) { + if (t->is_tl()) { + /* + * found title therefore ignore this .ps tag + */ + while (t != g) { + page_contents->glyphs.move_left(); + t = page_contents->glyphs.get_data(); + } + return; + } + page_contents->glyphs.move_right(); + t = page_contents->glyphs.get_data(); + } + /* + * move back to original position + */ + while (t != g) { + page_contents->glyphs.move_left(); + t = page_contents->glyphs.get_data(); + } + /* + * collect legal pointsize + */ + pointsize = atoi(arg); + } } /* * do_fill - records whether troff has requested that text be filled. */ -void html_printer::do_fill (int on) +void html_printer::do_fill (char *arg) { - current_paragraph->do_break(); - output_hpos = indentation+pageoffset; + int on = atoi(arg); + + output_hpos = get_troff_indent()+pageoffset; supress_sub_sup = TRUE; if (fill_on != on) { if (on) - current_paragraph->do_para(""); - else - current_paragraph->do_pre(); + current_paragraph->do_para("", seen_space); fill_on = on; } } @@ -2292,7 +2792,53 @@ current_paragraph->do_break(); } } - output_hpos = indentation+pageoffset; + output_hpos = get_troff_indent()+pageoffset; +} + +/* + * do_check_center - checks to see whether we have seen a `.ce' tag + * during the previous line. + */ + +void html_printer::do_check_center(void) +{ + if (seen_center) { + seen_center = FALSE; + if (next_center > 0) { + if (end_center == 0) { + int space = current_paragraph->retrieve_para_space() || seen_space; + current_paragraph->done_para(); + supress_sub_sup = TRUE; + current_paragraph->do_para("align=center", space); + } else + if (strcmp("align=center", + current_paragraph->get_alignment()) != 0) { + /* + * different alignment, so shutdown paragraph and open + * a new one. + */ + int space = current_paragraph->retrieve_para_space() || seen_space; + current_paragraph->done_para(); + supress_sub_sup = TRUE; + current_paragraph->do_para("align=center", space); + } else + /* + * same alignment, if we have emitted text then issue a break. + */ + if (current_paragraph->emitted_text()) + current_paragraph->do_break(); + } else + /* + * next_center == 0 + */ + if (end_center > 0) { + seen_space = seen_space || current_paragraph->retrieve_para_space(); + current_paragraph->done_para(); + supress_sub_sup = TRUE; + current_paragraph->do_para("", seen_space); + } + end_center = next_center; + } } /* @@ -2329,7 +2875,7 @@ void html_printer::do_links (void) { - current_paragraph->done_para(); + html.end_line(); // flush line auto_links = FALSE; /* from now on only emit under user request */ file_list.add_new_file(xtmpfile()); file_list.set_links_required(); @@ -2374,19 +2920,65 @@ } /* + * do_head - adds a string to head_info which is to be included into + * the section of the html document. + */ + +void html_printer::do_head (char *name) +{ + head_info += string(name); + head_info += '\n'; +} + +/* * do_break - handles the ".br" request and also - * undoes an outstanding ".ti" command. + * undoes an outstanding ".ti" command + * and calls indent if the indentation + * related registers have changed. */ void html_printer::do_break (void) { + int seen_temp_indent = FALSE; + current_paragraph->do_break(); if (end_tempindent > 0) { end_tempindent--; - if (end_tempindent == 0) - do_indent(prev_indent, pageoffset, linelength); + if (end_tempindent > 0) + seen_temp_indent = TRUE; + } + if (seen_indent || seen_pageoffset || seen_linelength || seen_temp_indent) { + if (seen_indent && (! seen_temp_indent)) + troff_indent = next_indent; + if (! seen_pageoffset) + next_pageoffset = pageoffset; + if (! seen_linelength) + next_linelength = linelength; + do_indent(get_troff_indent(), next_pageoffset, next_linelength); + } + seen_indent = seen_temp_indent; + seen_linelength = FALSE; + seen_pageoffset = FALSE; + do_check_center(); + output_hpos = get_troff_indent()+pageoffset; + supress_sub_sup = TRUE; +} + +void html_printer::do_space (char *arg) +{ + int n = atoi(arg); + + seen_space = atoi(arg); + as.check_sp(seen_space); +#if 0 + if (n>0 && table) + table->set_space(TRUE); +#endif + + while (n>0) { + current_paragraph->do_space(); + n--; } - output_hpos = indentation+pageoffset; supress_sub_sup = TRUE; } @@ -2399,14 +2991,24 @@ html_table *t = g->get_table(); if (t != NULL) { + current_column = 0; current_paragraph->done_pre(); current_paragraph->done_para(); + current_paragraph->remove_para_space(); +#if defined(DEBUG_TABLES) html.simple_comment("TABS"); +#endif t->set_linelength(max_linelength); t->add_indent(pageoffset); +#if 0 + t->emit_table_header(seen_space); +#else t->emit_table_header(FALSE); + row_space = current_paragraph->retrieve_para_space() || seen_space; + seen_space = FALSE; +#endif } table = t; @@ -2420,23 +3022,16 @@ { if (table) { current_paragraph->done_para(); + current_paragraph->remove_para_space(); table->emit_finish_table(); } table = NULL; - - if (indentation > 0) { - /* - * restore indentation - */ - int newin = indentation; - indentation = 0; - do_indent(newin, pageoffset, linelength); - } + restore_troff_indent(); } /* - * do_tab - handle the "html-tag:tab" tag + * do_tab - handle the "devtag:tab" tag */ void html_printer::do_tab (char *s) @@ -2445,7 +3040,7 @@ while (isspace(*s)) s++; s++; - int col = table->find_column(atoi(s) + pageoffset + indentation); + int col = table->find_column(atoi(s) + pageoffset + get_troff_indent()); if (col > 0) { current_paragraph->done_para(); table->emit_col(col); @@ -2454,13 +3049,13 @@ } /* - * do_tab0 - handle the "html-tag:tab0" tag + * do_tab0 - handle the "devtag:tab0" tag */ void html_printer::do_tab0 (void) { if (table) { - int col = table->find_column(pageoffset+indentation); + int col = table->find_column(pageoffset+get_troff_indent()); if (col > 0) { current_paragraph->done_para(); table->emit_col(col); @@ -2475,33 +3070,40 @@ void html_printer::do_col (char *s) { if (table) { + if (atoi(s) < current_column) + row_space = seen_space; + + current_column = atoi(s); current_paragraph->done_para(); - table->emit_col(atoi(s)); + table->emit_col(current_column); + current_paragraph->do_para("", row_space); } } /* - * troff_tag - processes the troff tag and manipulates the troff state machine. + * troff_tag - processes the troff tag and manipulates the troff + * state machine. */ void html_printer::troff_tag (text_glob *g) { /* - * firstly skip over html-tag: + * firstly skip over devtag: */ - char *t=(char *)g->text_string+9; + char *t=(char *)g->text_string+strlen("devtag:"); - if (g->is_eol()) { + if (strncmp(g->text_string, "html

    :", strlen("html

    :")) == 0) { + do_end_para(g); + } else if (g->is_eol()) { do_eol(); } else if (g->is_eol_ce()) { do_eol_ce(); } else if (strncmp(t, ".sp", 3) == 0) { - if (g->get_arg() > 0) - current_paragraph->do_space(); - else - current_paragraph->do_break(); - supress_sub_sup = TRUE; + char *a = (char *)t+3; + do_space(a); } else if (strncmp(t, ".br", 3) == 0) { + seen_break = 1; + as.check_br(1); do_break(); } else if (strcmp(t, ".centered-image") == 0) { do_centered_image(); @@ -2516,7 +3118,7 @@ char *a = (char *)t+3; supress_sub_sup = TRUE; do_center(a); - } else if (strncmp(t, ".tl", 3) == 0) { + } else if (g->is_tl()) { supress_sub_sup = TRUE; title.with_h1 = TRUE; do_title(); @@ -2525,9 +3127,8 @@ title.with_h1 = FALSE; do_title(); } else if (strncmp(t, ".fi", 3) == 0) { - do_fill(TRUE); - } else if (strncmp(t, ".nf", 3) == 0) { - do_fill(FALSE); + char *a = (char *)t+3; + do_fill(a); } else if ((strncmp(t, ".SH", 3) == 0) || (strncmp(t, ".NH", 3) == 0)) { char *a = (char *)t+3; do_heading(a); @@ -2554,6 +3155,9 @@ } else if (strncmp(t, ".job-name", 9) == 0) { char *a = (char *)t+9; do_job_name(a); + } else if (strncmp(t, ".head", 5) == 0) { + char *a = (char *)t+5; + do_head(a); } else if (strcmp(t, ".no-auto-rule") == 0) { auto_rule = FALSE; } else if (strcmp(t, ".tab-ts") == 0) { @@ -2577,7 +3181,8 @@ int html_printer::is_in_middle (int left, int right) { - return( abs(abs(left-pageoffset) - abs(pageoffset+linelength-right)) <= CENTER_TOLERANCE ); + return( abs(abs(left-pageoffset) - abs(pageoffset+linelength-right)) + <= CENTER_TOLERANCE ); } /* @@ -2592,17 +3197,31 @@ page_contents->glyphs.start_from_head(); do { g = page_contents->glyphs.get_data(); +#if 0 + fprintf(stderr, "[%s:%d:%d:%d:%d]", + g->text_string, g->minv, g->minh, g->maxv, g->maxh) ; + fflush(stderr); +#endif + + handle_state_assertion(g); if (strcmp(g->text_string, "XXXXXXX") == 0) stop(); - if (g->is_a_tag()) { + if (g->is_a_tag()) troff_tag(g); - } else if (g->is_a_line()) { + else if (g->is_a_line()) emit_line(g); - } else { + else { + as.check_sp(seen_space); + as.check_br(seen_break); + seen_break = 0; + seen_space = 0; emit_html(g); } + + as.check_fi(fill_on); + as.check_ce(end_center); /* * after processing the title (and removing it) the glyph list might be empty */ @@ -2621,11 +3240,16 @@ int html_printer::calc_nf (text_glob *g, int nf) { if (g != NULL) { - if (g->is_fi()) + if (g->is_fi()) { + as.check_fi(TRUE); return FALSE; - if (g->is_nf()) + } + if (g->is_nf()) { + as.check_fi(FALSE); return TRUE; + } } + as.check_fi(! nf); return nf; } @@ -2636,16 +3260,15 @@ void html_printer::calc_po_in (text_glob *g, int nf) { if (g->is_in()) - indentation = g->get_arg(); + troff_indent = g->get_arg(); else if (g->is_po()) pageoffset = g->get_arg(); else if (g->is_ti()) { - prev_indent = indentation; - indentation = g->get_arg(); - end_tempindent = 1; - } else if (g->is_br() && ((end_tempindent > 0) || (nf && g->is_eol()))) { - end_tempindent = 0; - indentation = prev_indent; + temp_indent = g->get_arg(); + end_tempindent = 2; + } else if (g->is_br() || (nf && g->is_eol())) { + if (end_tempindent > 0) + end_tempindent--; } } @@ -2656,13 +3279,15 @@ int html_printer::next_horiz_pos (text_glob *g, int nf) { - int next = -1; + int next = -1; if ((g != NULL) && (g->is_br() || (nf && g->is_eol()))) if (! page_contents->glyphs.is_empty()) { page_contents->glyphs.move_right_get_data(); - if (g == NULL) + if (g == NULL) { page_contents->glyphs.start_from_head(); + as.reset(); + } else { next = g->minh; page_contents->glyphs.move_left(); @@ -2682,7 +3307,7 @@ page_contents->glyphs.move_to(where); page_contents->glyphs.move_left(); - page_contents->insert_tag(string("html-tag:.tab-ts")); // tab table start + page_contents->insert_tag(string("devtag:.tab-ts")); // tab table start page_contents->glyphs.move_right(); start_of_table = page_contents->glyphs.get_data(); page_contents->glyphs.move_to(old_pos); @@ -2702,7 +3327,7 @@ while (page_contents->glyphs.get_data()->is_a_tag()) page_contents->glyphs.move_left(); - page_contents->insert_tag(string("html-tag:.tab-te")); // tab table end + page_contents->insert_tag(string("devtag:.tab-te")); // tab table end while (g != page_contents->glyphs.get_data()) page_contents->glyphs.move_right(); page_contents->dump_page(); @@ -2718,7 +3343,7 @@ page_contents->glyphs.move_to(where); page_contents->glyphs.move_left(); - page_contents->insert_tag(string("html-tag:tab0")); // tab0 start of line + page_contents->insert_tag(string("devtag:tab0")); // tab0 start of line page_contents->glyphs.move_right(); page_contents->glyphs.move_to(old_pos); } @@ -2760,10 +3385,11 @@ if (! page_contents->glyphs.is_empty()) { page_contents->glyphs.start_from_head(); + as.reset(); line_start = TRUE; do { g = page_contents->glyphs.get_data(); - + handle_state_assertion(g); nf = calc_nf(g, nf); if (line_start) { @@ -2773,7 +3399,8 @@ } } - line_start = g->is_br() || g->is_nf() || g->is_fi() || (nf && g->is_eol()); + // line_start = g->is_br() || g->is_nf() || g->is_fi() || (nf && g->is_eol()); + line_start = g->is_br() || (nf && g->is_eol()); page_contents->glyphs.move_right(); } while (! page_contents->glyphs.is_equal_to_head()); } @@ -2789,10 +3416,11 @@ if (! page_contents->glyphs.is_empty()) { page_contents->glyphs.start_from_head(); + as.reset(); start_of_line = page_contents->glyphs.get_data(); do { g = page_contents->glyphs.get_data(); - + handle_state_assertion(g); nf = calc_nf(g, nf); if (g->is_tab()) @@ -2805,6 +3433,7 @@ do { page_contents->glyphs.move_right(); g = page_contents->glyphs.get_data(); + handle_state_assertion(g); nf = calc_nf(g, nf); if (page_contents->glyphs.is_equal_to_head()) { if (seen_tab && !seen_col) @@ -2872,7 +3501,8 @@ } /* - * lookahead_for_tables - checks for .col tags and inserts table start/end tags + * lookahead_for_tables - checks for .col tags and inserts table + * start/end tags */ void html_printer::lookahead_for_tables (void) @@ -2900,7 +3530,28 @@ page_contents->dump_page(); if (! page_contents->glyphs.is_empty()) { page_contents->glyphs.start_from_head(); + as.reset(); g = page_contents->glyphs.get_data(); + if (g->is_br()) { + g = page_contents->glyphs.move_right_get_data(); + handle_state_assertion(g); + if (page_contents->glyphs.is_equal_to_head()) { + if (tbl != NULL) { + delete tbl; + tbl = NULL; + } + return; + } + + start_of_line = g; + seen_text = FALSE; + ncol = 0; + left = next_horiz_pos(g, nf); + if (found_col) + last = g; + found_col = FALSE; + } + do { #if defined(DEBUG_TABLES) fprintf(stderr, " [") ; @@ -2936,10 +3587,10 @@ colmin = g->get_tab_args(&align); align = 'L'; // for now as 'C' and 'R' are broken ncol = tbl->find_tab_column(colmin); - colmin += pageoffset + indentation; + colmin += pageoffset + get_troff_indent(); colmax = tbl->get_tab_pos(ncol+1); if (colmax > 0) - colmax += pageoffset + indentation; + colmax += pageoffset + get_troff_indent(); } else if (g->is_tab0()) { if (type_of_col == col_tag && start_of_table != NULL) { page_contents->glyphs.move_left(); @@ -2956,7 +3607,7 @@ type_of_col = tab0_tag; ncol = 1; colmin = 0; - colmax = tbl->get_tab_pos(2) + pageoffset + indentation; + colmax = tbl->get_tab_pos(2) + pageoffset + get_troff_indent(); } else if (! g->is_a_tag()) update_min_max(type_of_col, &colmin, &colmax, g); @@ -2971,10 +3622,15 @@ } else if (g->is_ce() && (start_of_table != NULL)) { add_table_end("*** CE ***"); start_of_table->remember_table(tbl); + tbl = new html_table(&html, -1); start_of_table = NULL; last = NULL; } else if (g->is_ta()) { tab_defs = g->text_string; + + if (type_of_col == col_tag) + tbl->tab_stops->check_init(tab_defs); + if (!tbl->tab_stops->compatible(tab_defs)) { if (start_of_table != NULL) { add_table_end("*** TABS ***"); @@ -3008,16 +3664,19 @@ * move onto next glob, check whether we are starting a new line */ g = page_contents->glyphs.move_right_get_data(); + handle_state_assertion(g); if (g == NULL) { if (found_col) { page_contents->glyphs.start_from_head(); + as.reset(); last = g; found_col = FALSE; } } else if (g->is_br() || (nf && g->is_eol())) { do { g = page_contents->glyphs.move_right_get_data(); + handle_state_assertion(g); nf = calc_nf(g, nf); } while ((g != NULL) && (g->is_br() || (nf && g->is_eol()))); start_of_line = g; @@ -3046,13 +3705,15 @@ page_contents->insert_tag(string("*** LAST ***")); } } - if (tbl != NULL) + if (tbl != NULL) { delete tbl; + tbl = NULL; + } // and reset the registers pageoffset = old_pageoffset; - indentation = 0; - prev_indent = 0; + troff_indent = 0; + temp_indent = 0; end_tempindent = 0; } @@ -3100,6 +3761,37 @@ } /* + * is_line_start - returns TRUE if we are at the start of a line. + */ + +int html_printer::is_line_start (int nf) +{ + int line_start = FALSE; + int result = TRUE; + text_glob *orig = page_contents->glyphs.get_data(); + text_glob *g; + + if (! page_contents->glyphs.is_equal_to_head()) { + do { + page_contents->glyphs.move_left(); + g = page_contents->glyphs.get_data(); + result = g->is_a_tag(); + if (g->is_fi()) + nf = FALSE; + else if (g->is_nf()) + nf = TRUE; + line_start = g->is_col() || g->is_br() || (nf && g->is_eol()); + } while ((!line_start) && (result)); + /* + * now restore our previous position. + */ + while (page_contents->glyphs.get_data() != orig) + page_contents->glyphs.move_right(); + } + return result; +} + +/* * is_font_courier - returns TRUE if the font, f, is courier. */ @@ -3110,7 +3802,7 @@ return( (fontname != 0) && (fontname[0] == 'C') ); } - return( FALSE ); + return FALSE; } /* @@ -3159,24 +3851,28 @@ current_paragraph->do_bold(); current_paragraph->do_italic(); } else if (strcmp(fontname, "CR") == 0) { - if ((! fill_on) && (is_courier_until_eol())) { + if ((! fill_on) && (is_courier_until_eol()) && + is_line_start(! fill_on)) { current_paragraph->do_pre(); } current_paragraph->do_tt(); } else if (strcmp(fontname, "CI") == 0) { - if ((! fill_on) && (is_courier_until_eol())) { + if ((! fill_on) && (is_courier_until_eol()) && + is_line_start(! fill_on)) { current_paragraph->do_pre(); } current_paragraph->do_tt(); current_paragraph->do_italic(); } else if (strcmp(fontname, "CB") == 0) { - if ((! fill_on) && (is_courier_until_eol())) { + if ((! fill_on) && (is_courier_until_eol()) && + is_line_start(! fill_on)) { current_paragraph->do_pre(); } current_paragraph->do_tt(); current_paragraph->do_bold(); } else if (strcmp(fontname, "CBI") == 0) { - if ((! fill_on) && (is_courier_until_eol())) { + if ((! fill_on) && (is_courier_until_eol()) && + is_line_start(! fill_on)) { current_paragraph->do_pre(); } current_paragraph->do_tt(); @@ -3329,6 +4025,23 @@ } /* + * do_end_para - writes out the html text after shutting down the + * current paragraph. + */ + +void html_printer::do_end_para (text_glob *g) +{ + do_font(g); + current_paragraph->done_para(); + current_paragraph->remove_para_space(); + html.put_string(g->text_string+9); + output_vpos = g->minv; + output_hpos = g->maxh; + output_vpos_max = g->maxv; + supress_sub_sup = FALSE; +} + +/* * emit_html - write out the html text */ @@ -3352,6 +4065,7 @@ if (sbuf.length() > 0) { int r=font::res; // resolution of the device set_style(sbuf_style); + if (overstrike_detected && (! is_bold(sbuf_style.f))) { font *bold_font = make_bold(sbuf_style.f); if (bold_font != NULL) @@ -3462,11 +4176,24 @@ max_linelength(-1), linelength(0), pageoffset(0), - indentation(0), - prev_indent(0), - pointsize(0), + troff_indent(0), + device_indent(0), + temp_indent(0), + pointsize(base_point_size), line_number(0), - background(default_background) + background(default_background), + seen_indent(FALSE), + next_indent(0), + seen_pageoffset(FALSE), + next_pageoffset(0), + seen_linelength(FALSE), + next_linelength(0), + seen_center(FALSE), + next_center(0), + seen_space(0), + seen_break(0), + current_column(0), + row_space(FALSE) { file_list.add_new_file(xtmpfile()); html.set_file(file_list.get_file()); @@ -3618,11 +4345,13 @@ } /* - * set_char - adds a character into the sbuf if it is a continuation with the previous - * word otherwise flush the current sbuf and add character anew. + * set_char - adds a character into the sbuf if it is a continuation + * with the previous word otherwise flush the current sbuf + * and add character anew. */ -void html_printer::set_char(int i, font *f, const environment *env, int w, const char *name) +void html_printer::set_char(int i, font *f, const environment *env, + int w, const char *name) { style sty(f, env->size, env->height, env->slant, env->fontno, *env->col); if (sty.slant != 0) { @@ -3636,6 +4365,8 @@ return; flush_sbuf(); + if (sbuf_style.f == NULL) + sbuf_style = sty; add_to_sbuf(i, name); sbuf_end_hpos = env->hpos + w; sbuf_start_hpos = env->hpos; @@ -3681,11 +4412,44 @@ w = nbsp_width; else w = f->get_width(i, env->size); + w = round_width(w); if (widthp) *widthp = w; set_char(i, f, env, w, 0); } +int html_printer::set_char_and_width(const char *nm, const environment *env, + int *widthp, font **f) +{ + int i = font::name_to_index(nm); + int fn = env->fontno; + if (fn < 0 || fn >= nfonts) { + error("bad font position `%1'", fn); + return -1; + } + *f = font_table[fn]; + if (*f == 0) { + error("no font mounted at `%1'", fn); + return -1; + } + if (!(*f)->contains(i)) { + if (nm[0] != '\0' && nm[1] == '\0') + error("font `%1' does not contain ascii character `%2'", + (*f)->get_name(), + nm[0]); + else + error("font `%1' does not contain special character `%2'", + (*f)->get_name(), + nm); + return -1; + } + int w = (*f)->get_width(i, env->size); + w = round_width(w); + if (widthp) + *widthp = w; + return i; +} + /* * write_title - writes the title to this document */ @@ -3738,8 +4502,8 @@ output_vpos = -1; output_vpos_max = -1; current_paragraph = new html_text(&html); - do_indent(indentation, pageoffset, linelength); - current_paragraph->do_para(""); + do_indent(get_troff_indent(), pageoffset, linelength); + current_paragraph->do_para("", FALSE); } void html_printer::end_page(int) @@ -3797,32 +4561,34 @@ if (multiple_files) { write_rule(); fputs("[ ", stdout); - if (prev != "" && prev != top) { + if ((strcmp(prev.contents(), "") != 0) && prev != top && prev != current) { emit_link(prev, "prev"); need_bar = TRUE; } - if (next != "" && next != top) { + if ((strcmp(next.contents(), "") != 0) && next != top && next != current) { if (need_bar) fputs(" | ", stdout); emit_link(next, "next"); need_bar = TRUE; } - if (top != "" && top != "" && top != current) { + if (top != "" && (strcmp(top.contents(), "") != 0) && top != current) { if (need_bar) fputs(" | ", stdout); emit_link(top, "top"); - fputs(" ]\n", stdout); } + fputs(" ]\n", stdout); write_rule(); } } /* - * do_file_components - scan the file list copying each temporary file in turn. - * This is used twofold: + * do_file_components - scan the file list copying each temporary + * file in turn. This is used twofold: * - * firstly to emit section heading links, between file fragments if required - * and secondly to generate jobname file fragments if required. + * firstly to emit section heading links, + * between file fragments if required and + * secondly to generate jobname file fragments + * if required. */ void html_printer::do_file_components (void) @@ -3859,6 +4625,7 @@ fflush(stdout); freopen(split_file.contents(), "w", stdout); fragment_no++; + writeHeadMetaStyle(); write_navigation(top, prev, next, current); } if (file_list.are_links_required()) @@ -3870,6 +4637,31 @@ write_rule(); } +/* + * writeHeadMetaStyle - emits the and \n", stdout); +} + html_printer::~html_printer() { #ifdef LONG_FOR_TIME_T @@ -3892,17 +4684,11 @@ .put_string(ctime(&t), strlen(ctime(&t))-1) .end_comment(); - fputs("\n", stdout); + writeHeadMetaStyle(); - fputs("\n", stdout); - fputs("\n", stdout); - fputs("\n", stdout); - fputs("\n", stdout); - fputs("\n", stdout); write_title(TRUE); + head_info += '\0'; + fputs(head_info.contents(), stdout); fputs("\n", stdout); do_body(); @@ -3927,9 +4713,118 @@ } /* - * special - handle all x X requests from troff. For post-html they allow users - * to pass raw html commands, turn auto linked headings off/on and - * also allow troff to emit tags to indicate when a: .br, .sp etc occurs. + * get_str - returns a dupicate of string, s. The duplicate + * string is terminated at the next ',' or ']'. + */ + +static char *get_str (const char *s, char **n) +{ + int i=0; + char *v; + + while ((s[i] != (char)0) && (s[i] != ',') && (s[i] != ']')) + i++; + if (i>0) { + v = new char[i+1]; + memcpy(v, s, i+1); + v[i] = (char)0; + if (s[i] == ',') + (*n) = (char *)&s[i+1]; + else + (*n) = (char *)&s[i]; + return v; + } + if (s[i] == ',') + (*n) = (char *)&s[1]; + else + (*n) = (char *)s; + return NULL; +} + +/* + * make_val - creates a string from if s is NULL. + */ + +char *make_val (char *s, int v, char *id, char *f, char *l) +{ + if (s == NULL) { + char buf[30]; + + sprintf(buf, "%d", v); + return strsave(buf); + } + else { + /* + * check that value, s, is the same as, v. + */ + char *t = s; + + while (*t == '=') + t++; + if (atoi(t) != v) { + if (f == NULL) + f = (char *)"stdin"; + if (l == NULL) + l = (char *)""; + fprintf(stderr, "%s:%s: grohtml assertion failed at id%s expecting %d and was given %s\n", + f, l, id, v, s); + } + return s; + } +} + +/* + * handle_assertion - handles the assertions created via .www:ASSERT + * in www.tmac. See www.tmac for examples. + * This method should be called as we are + * parsing the ditroff input. It checks the x, y + * position assertions. It does _not_ check the + * troff state assertions as these are unknown at this + * point. + */ + +void html_printer::handle_assertion (int minv, int minh, int maxv, int maxh, const char *s) +{ + char *n; + char *cmd = get_str(s, &n); + char *id = get_str(n, &n); + char *val = get_str(n, &n); + char *file= get_str(n, &n); + char *line= get_str(n, &n); + + if (strcmp(cmd, "assertion:[x") == 0) + as.addx(cmd, id, make_val(val, minh, id, file, line), file, line); + else if (strcmp(cmd, "assertion:[y") == 0) + as.addy(cmd, id, make_val(val, minv, id, file, line), file, line); + else + if (strncmp(cmd, "assertion:[", strlen("assertion:[")) == 0) + page_contents->add_tag(&sbuf_style, string(s), + line_number, minv, minh, maxv, maxh); +} + +/* + * build_state_assertion - builds the troff state assertions. + */ + +void html_printer::handle_state_assertion (text_glob *g) +{ + if (g != NULL && g->is_a_tag() && + (strncmp(g->text_string, "assertion:[", 11) == 0)) { + char *n = (char *)&g->text_string[11]; + char *cmd = get_str(n, &n); + char *val = get_str(n, &n); + (void)get_str(n, &n); // unused + char *file= get_str(n, &n); + char *line= get_str(n, &n); + + as.build(cmd, val, file, line); + } +} + +/* + * special - handle all x X requests from troff. For post-html they + * allow users to pass raw html commands, turn auto linked + * headings off/on etc. */ void html_printer::special(char *s, const environment *env, char type) @@ -3960,16 +4855,73 @@ page_contents->add_and_encode(&sbuf_style, string(&s[5]), line_number, env->vpos-env->size*r/72, env->hpos, - env->vpos , env->hpos); + env->vpos , env->hpos, + FALSE); + + /* + * assume that the html command has no width, if it does then + * hopefully troff will have fudged this in a macro by + * requesting that the formatting move right by the appropriate + * amount. + */ + } else if (strncmp(s, "html

    :", 9) == 0) { + int r=font::res; /* resolution of the device */ + font *f=sbuf_style.f; + + if (f == NULL) { + int found=FALSE; + + f = font::load_font("TR", &found); + } + + /* + * need to pass all of string through to html output during flush + */ + page_contents->add_and_encode(&sbuf_style, string(s), + line_number, + env->vpos-env->size*r/72, env->hpos, + env->vpos , env->hpos, + TRUE); /* - * assume that the html command has no width, if it does then hopefully troff - * will have fudged this in a macro by requesting that the formatting move right by - * the appropriate amount. + * assume that the html command has no width, if it does then + * hopefully troff will have fudged this in a macro by + * requesting that the formatting move right by the appropriate + * amount. */ } else if (strncmp(s, "index:", 6) == 0) { cutoff_heading = atoi(&s[6]); - } else if (strncmp(s, "html-tag:", 9) == 0) { + } else if (strncmp(s, "assertion:[", 11) == 0) { + int r=font::res; /* resolution of the device */ + + handle_assertion(env->vpos-env->size*r/72, env->hpos, + env->vpos, env->hpos, s); + } + } +} + +/* + * devtag - handles device troff tags sent from the `troff'. + * These include the troff state machine tags: + * .br, .sp, .in, .tl, .ll etc + * + * (see man 5 grohtml_tags). + */ + +void html_printer::devtag (char *s, const environment *env, char type) +{ + if (type != 'p') + return; + + if (s != 0) { + flush_sbuf(); + if (env->fontno >= 0) { + style sty(get_font_from_index(env->fontno), env->size, env->height, + env->slant, env->fontno, *env->col); + sbuf_style = sty; + } + + if (strncmp(s, "devtag:", strlen("devtag:")) == 0) { int r=font::res; /* resolution of the device */ page_contents->add_tag(&sbuf_style, string(s), @@ -3980,6 +4932,26 @@ } } + +/* + * taken from number.cpp in src/roff/troff, [hunits::hunits(units x)] + */ + +int html_printer::round_width(int x) +{ + int r = font::hor; + int n; + + // don't depend on the rounding direction for division of negative integers + if (r == 1) + n = x; + else + n = (x < 0 + ? -((-x + r/2 - 1)/r) + : (x + r/2 - 1)/r); + return n * r; +} + int main(int argc, char **argv) { program_name = argv[0]; @@ -3991,27 +4963,40 @@ { "version", no_argument, 0, 'v' }, { NULL, 0, 0, 0 } }; - while ((c = getopt_long(argc, argv, "a:g:o:i:I:j:D:F:vbdhlrnp", long_options, NULL)) + while ((c = getopt_long(argc, argv, "a:bdD:F:g:hi:I:j:lno:prs:S:v", + long_options, NULL)) != EOF) switch(c) { - case 'v': - printf("GNU post-grohtml (groff) version %s\n", Version_string); - exit(0); - break; case 'a': /* text antialiasing bits - handled by pre-html */ break; - case 'g': - /* graphic antialiasing bits - handled by pre-html */ - break; case 'b': // set background color to white default_background = new color; default_background->set_gray(color::MAX_COLOR_VAL); break; + case 'd': + /* handled by pre-html */ + break; + case 'D': + /* handled by pre-html */ + break; case 'F': font::command_line_font_dir(optarg); break; + case 'g': + /* graphic antialiasing bits - handled by pre-html */ + break; + case 'h': + /* do not use the Hn headings of html, but manufacture our own */ + manufacture_headings = TRUE; + break; + case 'i': + /* handled by pre-html */ + break; + case 'I': + /* handled by pre-html */ + break; case 'j': multiple_files = TRUE; job_name = optarg; @@ -4019,15 +5004,8 @@ case 'l': auto_links = FALSE; break; - case 'r': - auto_rule = FALSE; - break; - case 'd': - /* handled by pre-html */ - break; - case 'h': - /* do not use the Hn headings of html, but manufacture our own */ - manufacture_headings = TRUE; + case 'n': + simple_anchors = TRUE; break; case 'o': /* handled by pre-html */ @@ -4035,17 +5013,18 @@ case 'p': /* handled by pre-html */ break; - case 'i': - /* handled by pre-html */ + case 'r': + auto_rule = FALSE; break; - case 'I': - /* handled by pre-html */ + case 's': + base_point_size = atoi(optarg); break; - case 'D': - /* handled by pre-html */ + case 'S': + split_level = atoi(optarg) + 1; break; - case 'n': - simple_anchors = TRUE; + case 'v': + printf("GNU post-grohtml (groff) version %s\n", Version_string); + exit(0); break; case CHAR_MAX + 1: // --help usage(stdout); diff -ruN groff-1.19.1/src/devices/grolbp/lbp.cpp groff-1.19.2/src/devices/grolbp/lbp.cpp --- groff-1.19.1/src/devices/grolbp/lbp.cpp 2004-04-18 17:52:08.000000000 +0200 +++ groff-1.19.2/src/devices/grolbp/lbp.cpp 2005-05-28 07:38:28.000000000 +0200 @@ -1,5 +1,5 @@ // -*- C++ -*- -/* Copyright (C) 1994, 2000, 2001, 2002, 2003, 2004 +/* Copyright (C) 1994, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. Written by Francisco Andrés Verdú with many ideas taken from the other groff drivers. @@ -19,7 +19,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ /* TODO @@ -214,7 +214,7 @@ /* fprintf(stderr, "thickness: %d == %d, size %d, %d \n", size, line_thickness, env->size,req_linethickness); */ return; -}; // lbp_printer::set_line_thickness +} // lbp_printer::set_line_thickness void lbp_printer::begin_page(int) { @@ -424,9 +424,9 @@ if (np != 1 && np != 2) { error("0 or 1 argument required for thickness"); break; - }; + } set_line_thickness(p[0],env); - }; + } break; case 'l': // Line if (np != 2) { @@ -680,7 +680,7 @@ orientation = 1; else error("unknown orientation '%1'", optarg); - }; + } break; case 'c': { diff -ruN groff-1.19.1/src/devices/grolbp/lbp.h groff-1.19.2/src/devices/grolbp/lbp.h --- groff-1.19.1/src/devices/grolbp/lbp.h 2004-04-18 17:55:58.000000000 +0200 +++ groff-1.19.2/src/devices/grolbp/lbp.h 2005-05-28 07:39:34.000000000 +0200 @@ -1,5 +1,6 @@ // -*- C -*- -/* Copyright (C) 1994, 2000, 2001, 2003, 2004 Free Software Foundation, Inc. +/* Copyright (C) 1994, 2000, 2001, 2003, 2004, 2005 + Free Software Foundation, Inc. Written by Francisco Andrés Verdú groff is free software; you can redistribute it and/or modify it under @@ -14,7 +15,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ /* This file contains a set of utility functions to use canon CAPSL printers * (lbp-4 and lbp-8 series printers) */ @@ -28,14 +29,15 @@ static FILE *lbpoutput = NULL; static FILE *vdmoutput = NULL; + static inline void lbpinit(FILE *outfile) { lbpoutput = outfile; -}; +} -static inline void +static void lbpprintf(const char *format, ... ) { /* Taken from cjet */ va_list stuff; @@ -43,68 +45,78 @@ va_start(stuff, format); vfprintf(lbpoutput, format, stuff); va_end(stuff); -}; +} + static inline void lbpputs(const char *data) { fputs(data,lbpoutput); -}; +} + static inline void lbpputc(unsigned char c) { fputc(c,lbpoutput); -}; +} static inline void lbpsavestatus(int idx ) { fprintf(lbpoutput,"\033[%d%%y",idx); -}; +} + static inline void lbprestorestatus(int idx ) { fprintf(lbpoutput,"\033[%d%cz",idx ,'%'); -}; +} + static inline void lbpsavepos(int idx) { fprintf(lbpoutput,"\033[1;%d;0x",idx); -}; +} + static inline void lbprestorepos(int idx) { fprintf(lbpoutput,"\033[0;%d;0x",idx); -}; +} + static inline void lbprestoreposx(int idx) { fprintf(lbpoutput,"\033[0;%d;1x",idx); -}; +} + static inline void lbpmoverel(int despl, char direction) { fprintf(lbpoutput,"\033[%d%c",despl,direction); -}; +} + static inline void lbplinerel(int width,int despl,char direction ) { fprintf(lbpoutput,"\033[%d;0;9{\033[%d%c\033[9}",width,despl,direction); -}; +} + static inline void lbpmoveabs(int x, int y) { fprintf(lbpoutput,"\033[%d;%df",y,x); -}; +} + static inline void lbplineto(int x,int y, int width ) @@ -112,7 +124,8 @@ fprintf(lbpoutput,"\033[%d;0;9{",width); lbpmoveabs(x,y); fprintf(lbpoutput,"\033[9}\n"); -}; +} + static inline void lbpruleabs(int x, int y, int hsize, int vsize) @@ -121,9 +134,11 @@ fprintf(lbpoutput,"\033[0;9;000s"); lbpmoveabs(x+hsize,y+vsize); fprintf(lbpoutput,"\033[9r"); -}; +} + + +static void vdmprintf(const char *format, ... ); -static inline void vdmprintf(const char *format, ... ); static inline char * vdmnum(int num,char *result) @@ -147,7 +162,8 @@ *p++ = b3; *p = 0x00; /* End of the resulting string */ return result; -}; +} + static inline void vdmorigin(int newx, int newy) @@ -155,7 +171,7 @@ char nx[4],ny[4]; vdmprintf("}\"%s%s\x1e",vdmnum(newx,nx),vdmnum(newy,ny)); -}; /* vdmorigin */ +} static inline FILE * @@ -170,15 +186,17 @@ vdmnum(-3,scale),vdmnum(1,size),vdmnum(1,lineend)); return vdmoutput; -}; +} + static inline void vdmend() { vdmprintf("}p\x1e"); -}; +} -static inline void + +static void vdmprintf(const char *format, ... ) { /* Taken from cjet */ va_list stuff; @@ -187,7 +205,8 @@ va_start(stuff, format); vfprintf(vdmoutput, format, stuff); va_end(stuff); -}; +} + static inline void vdmsetfillmode(int pattern,int perimeter, int inverted) @@ -200,7 +219,8 @@ vdmprintf("I%s%s%s%s%s\x1e",vdmnum(pattern,patt),\ vdmnum(perimeter,perim),vdmnum(0,rot), vdmnum(0,espejo),vdmnum(inverted,inv)); -}; +} + static inline void vdmcircle(int centerx, int centery, int radius) @@ -209,7 +229,8 @@ vdmprintf("5%s%s%s\x1e",vdmnum(centerx,x),vdmnum(centery,y),\ vdmnum(radius,rad)); -}; +} + static inline void vdmaarc(int centerx, int centery, int radius,int startangle,int angle,int style,int arcopen) @@ -220,7 +241,8 @@ vdmnum(centerx,x),vdmnum(centery,y),\ vdmnum(radius,rad),vdmnum(startangle,stx),vdmnum(angle,sty),\ vdmnum(style,styl)); -}; +} + static inline void vdmvarc(int centerx, int centery,int radius, int startx, int starty, int endx, int endy,\ @@ -232,7 +254,8 @@ vdmnum(centerx,x),vdmnum(centery,y),\ vdmnum(radius,rad),vdmnum(startx,stx),vdmnum(starty,sty),\ vdmnum(endx,enx),vdmnum(endy,eny),vdmnum(style,styl)); -}; +} + static inline void vdmellipse(int centerx, int centery, int radiusx, int radiusy,int rotation) @@ -242,7 +265,8 @@ vdmprintf("}7%s%s%s%s%s\x1e\n",vdmnum(centerx,x),vdmnum(centery,y),\ vdmnum(radiusx,radx),vdmnum(radiusy,rady),\ vdmnum(rotation,rotat)); -}; +} + static inline void vdmsetlinetype(int lintype) @@ -251,7 +275,8 @@ vdmprintf("E1%s%s\x1e",vdmnum(lintype,ltyp),vdmnum(1,expfact)); -}; +} + static inline void vdmsetlinestyle(int lintype, int pattern,int unionstyle) @@ -265,7 +290,8 @@ vdmnum(pattern,patt),vdmnum(0,rot), vdmnum(0,espejo),vdmnum(0,in)); vdmprintf("}F%s",vdmnum(unionstyle,rot)); -}; +} + static inline void vdmlinewidth(int width) @@ -273,7 +299,8 @@ char wh[4]; vdmprintf("F1%s\x1e",vdmnum(width,wh)); -}; +} + static inline void vdmrectangle(int origx, int origy,int dstx, int dsty) @@ -282,7 +309,8 @@ vdmprintf("}:%s%s%s%s\x1e\n",vdmnum(origx,xcoord),vdmnum(dstx,sdstx),\ vdmnum(origy,ycoord),vdmnum(dsty,sdsty)); -}; /* polyline */ +} + static inline void vdmpolyline(int numpoints, int *points) @@ -296,10 +324,11 @@ for (i = 1; i < numpoints ; i++) { vdmprintf("%s%s",vdmnum(*p,xcoord),vdmnum(*(p+1),ycoord)); p += 2; - }; /* for */ + } /* for */ vdmprintf("\x1e\n"); -}; /* polyline */ +} + static inline void vdmpolygon(int numpoints, int *points) { @@ -312,10 +341,10 @@ for (i = 1; i < numpoints ; i++) { vdmprintf("%s%s",vdmnum(*p,xcoord),vdmnum(*(p+1),ycoord)); p += 2; - }; /* for */ + } /* for */ vdmprintf("\x1e\n"); -}; /* vdmpolygon */ +} /************************************************************************ @@ -325,7 +354,7 @@ vdminited() { return (vdmoutput != NULL); -}; /* vdminited */ +} static inline void @@ -340,7 +369,8 @@ vdmpolyline(2,points); -}; +} + /*#define THRESHOLD .05 */ /* inch */ #define THRESHOLD 1 /* points (1/300 inch) */ @@ -354,7 +384,7 @@ char xcoord[4],ycoord[4]; double npend ; - if (flush == -1) {lx = (int)px; ly = (int)py; return;}; + if (flush == -1) {lx = (int)px; ly = (int)py; return;} if (flush == 0) { dxnew = (int)px -lx; @@ -366,7 +396,7 @@ despx = dxnew; if ((sg == sigpend) && (dy == 0)){ return; - }; + } dy = 0; } else { @@ -377,9 +407,9 @@ else { sigpend = sg; pend = npend; - }; /* else (( npend == pend) && ... */ - }; /* else (if (dynew == 0)) */ - }; /* if (!flush ) */ + } /* else (( npend == pend) && ... */ + } /* else (if (dynew == 0)) */ + } /* if (!flush ) */ /* if we've changed direction we must draw the line */ /* fprintf(stderr," (%d) %.2f,%.2f\n",flush,(float)px,(float)py);*/ @@ -390,7 +420,7 @@ if (flush) { dxnew = dy = despx = despy = 0; return; - }; /* if (flush) */ + } /* if (flush) */ dxnew -= despx; dynew -= despy; if ((dxnew != 0) || (dynew != 0)) vdmprintf("%s%s",vdmnum(dxnew,xcoord),\ @@ -401,7 +431,8 @@ lx = (int)px; ly = (int)py; dxnew = dy = despx = despy = 0; -}; /* splinerel */ +} + /********************************************************************** * The following code to draw splines is adapted from the transfig package @@ -436,8 +467,9 @@ quadratic_spline(x_mid, y_mid, ((a_2+3.0*a_3)/4.0), ((b_2+3.0*b_3)/4.0), ((a_3+x_4)/2.0), ((b_3+y_4)/2.0), x_4, y_4); - }; -}; /* quadratic_spline */ + } +} + #define XCOORD(i) numbers[(2*i)] #define YCOORD(i) numbers[(2*i)+1] @@ -508,7 +540,7 @@ /* fprintf(tfp, "PA%.4f,%.4f;PU;\n", x_1, y_1);*/ -}; /* vdmspline */ +} #endif diff -ruN groff-1.19.1/src/devices/grolj4/lj4.cpp groff-1.19.2/src/devices/grolj4/lj4.cpp --- groff-1.19.1/src/devices/grolj4/lj4.cpp 2004-04-07 18:07:06.000000000 +0200 +++ groff-1.19.2/src/devices/grolj4/lj4.cpp 2005-05-26 15:37:18.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ /* TODO diff -ruN groff-1.19.1/src/devices/grops/grops.man groff-1.19.2/src/devices/grops/grops.man --- groff-1.19.1/src/devices/grops/grops.man 2003-10-31 16:00:20.000000000 +0100 +++ groff-1.19.2/src/devices/grops/grops.man 2005-01-22 07:07:23.000000000 +0100 @@ -1,5 +1,6 @@ .ig -Copyright (C) 1989-2000, 2001, 2002, 2003 Free Software Foundation, Inc. +Copyright (C) 1989-2000, 2001, 2002, 2003, 2004, 2005 + Free Software Foundation, Inc. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice @@ -116,6 +117,15 @@ .B \-P option. . +.PP +Note that +.B grops +doesn't produce a valid document structure (conforming to the Document +Structuring Convention) if called with multiple file arguments. +. +To print such concatenated output it is necessary to deactivate DSC +handling in the printing program or previewer. +. . .SH OPTIONS .TP @@ -774,7 +784,7 @@ .RS .LP For example, -.B gxditview +.B \%gxditview is not able to display a proper .B \[rs](em character because the standard X11 fonts do not provide it; @@ -792,7 +802,7 @@ . .LP In this case, -.B gxditview +.B \%gxditview will be unable to display the .B \[rs](em character and will draw the line, @@ -803,10 +813,10 @@ character and ignore the line (this code is already in file .B Xps.tmac -which will be loaded if a documented intended for +which will be loaded if a document intended for .B grops is previewed with -.BR gxditview ). +.BR \%gxditview ). .RE . .LP @@ -1149,6 +1159,10 @@ .BR groff_char (@MAN7EXT@), .BR groff_tmac (@MAN5EXT@) . +.PP +.URL "http://\:partners.adobe.com/\:public/\:developer/\:en/\:ps/\:5001.DSC_Spec.pdf" \ + "PostScript Language Document Structuring Conventions Specification" +. .cp \n[grops_C] . .\" Local Variables: diff -ruN groff-1.19.1/src/devices/grops/ps.cpp groff-1.19.2/src/devices/grops/ps.cpp --- groff-1.19.1/src/devices/grops/ps.cpp 2004-04-18 13:31:44.000000000 +0200 +++ groff-1.19.2/src/devices/grops/ps.cpp 2005-05-26 15:37:18.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ /* * PostScript documentation: diff -ruN groff-1.19.1/src/devices/grops/ps.h groff-1.19.2/src/devices/grops/ps.h --- groff-1.19.1/src/devices/grops/ps.h 2003-10-13 14:26:52.000000000 +0200 +++ groff-1.19.2/src/devices/grops/ps.h 2005-05-26 15:37:18.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ class ps_output { public: diff -ruN groff-1.19.1/src/devices/grops/psrm.cpp groff-1.19.2/src/devices/grops/psrm.cpp --- groff-1.19.1/src/devices/grops/psrm.cpp 2004-04-18 13:34:36.000000000 +0200 +++ groff-1.19.2/src/devices/grops/psrm.cpp 2005-05-26 15:37:18.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "driver.h" #include "stringclass.h" diff -ruN groff-1.19.1/src/devices/grotty/tty.cpp groff-1.19.2/src/devices/grotty/tty.cpp --- groff-1.19.1/src/devices/grotty/tty.cpp 2004-04-18 17:38:43.000000000 +0200 +++ groff-1.19.2/src/devices/grotty/tty.cpp 2005-05-26 15:37:18.000000000 +0200 @@ -1,5 +1,5 @@ // -*- C++ -*- -/* Copyright (C) 1989-2000, 2001, 2002, 2003, 2004 +/* Copyright (C) 1989-2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. Written by James Clark (jjc@jclark.com) @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "driver.h" #include "device.h" @@ -93,7 +93,7 @@ #define SGR_REVERSE CSI "7m" #define SGR_NO_REVERSE CSI "27m" // many terminals can't handle `CSI 39 m' and `CSI 49 m' to reset -// the foreground and bachground color, respectively; thus we use +// the foreground and background color, respectively; we thus use // `CSI 0 m' exclusively #define SGR_DEFAULT CSI "0m" @@ -155,6 +155,7 @@ static glyph *free_list; public: glyph *next; + int w; int hpos; unsigned int code; unsigned char mode; @@ -204,10 +205,10 @@ int is_bold; int cu_flag; PTABLE(schar) tty_colors; - void make_underline(); - void make_bold(unsigned int); + void make_underline(int); + void make_bold(unsigned int, int); schar color_to_idx(color *col); - void add_char(unsigned int, int, int, color *, color *, unsigned char); + void add_char(unsigned int, int, int, int, color *, color *, unsigned char); char *make_rgb_string(unsigned int, unsigned int, unsigned int); int tty_color(unsigned int, unsigned int, unsigned int, schar *, schar = DEFAULT_COLOR_IDX); @@ -299,11 +300,18 @@ a_delete lines; } -void tty_printer::make_underline() +void tty_printer::make_underline(int w) { if (old_drawing_scheme) { - putchar('_'); - putchar('\b'); + if (!w) + warning("can't underline zero-width character"); + else { + int n = w / font::hor; + for (int i = 0; i < n; i++) + putchar('_'); + for (int j = 0; j < n; j++) + putchar('\b'); + } } else { if (!is_underline) { @@ -318,11 +326,17 @@ } } -void tty_printer::make_bold(unsigned int c) +void tty_printer::make_bold(unsigned int c, int w) { if (old_drawing_scheme) { - put_char(c); - putchar('\b'); + if (!w) + warning("can't print zero-width character in bold"); + else { + int n = w / font::hor; + put_char(c); + for (int i = 0; i < n; i++) + putchar('\b'); + } } else { if (!is_bold) @@ -349,15 +363,15 @@ void tty_printer::set_char(int i, font *f, const environment *env, int w, const char *) { - if (w != font::hor) - fatal("width of character not equal to horizontal resolution"); - add_char(f->get_code(i), + if (w % font::hor != 0) + fatal("width of character not a multiple of horizontal resolution"); + add_char(f->get_code(i), w, env->hpos, env->vpos, env->col, env->fill, ((tty_font *)f)->get_mode()); } -void tty_printer::add_char(unsigned int c, +void tty_printer::add_char(unsigned int c, int w, int h, int v, color *fore, color *back, unsigned char mode) @@ -398,6 +412,7 @@ cached_vpos = vpos; } glyph *g = new glyph; + g->w = w; g->hpos = hpos; g->code = c; g->fore_color_idx = color_to_idx(fore); @@ -421,7 +436,8 @@ void tty_printer::special(char *arg, const environment *env, char type) { if (type == 'u') { - add_char(*arg - '0', env->hpos, env->vpos, env->col, env->fill, CU_MODE); + add_char(*arg - '0', 0, env->hpos, env->vpos, env->col, env->fill, + CU_MODE); return; } if (type != 'p') @@ -460,12 +476,12 @@ void tty_printer::change_color(const environment * const env) { - add_char(0, env->hpos, env->vpos, env->col, env->fill, COLOR_CHANGE); + add_char(0, 0, env->hpos, env->vpos, env->col, env->fill, COLOR_CHANGE); } void tty_printer::change_fill_color(const environment * const env) { - add_char(0, env->hpos, env->vpos, env->col, env->fill, COLOR_CHANGE); + add_char(0, 0, env->hpos, env->vpos, env->col, env->fill, COLOR_CHANGE); } void tty_printer::draw(int code, int *p, int np, const environment *env) @@ -485,20 +501,20 @@ len = -len; } if (len >= 0 && len <= font::vert) - add_char(vline_char, env->hpos, v, env->col, env->fill, + add_char(vline_char, font::hor, env->hpos, v, env->col, env->fill, VDRAW_MODE|START_LINE|END_LINE); else { - add_char(vline_char, env->hpos, v, env->col, env->fill, + add_char(vline_char, font::hor, env->hpos, v, env->col, env->fill, VDRAW_MODE|START_LINE); len -= font::vert; v += font::vert; while (len > 0) { - add_char(vline_char, env->hpos, v, env->col, env->fill, + add_char(vline_char, font::hor, env->hpos, v, env->col, env->fill, VDRAW_MODE|START_LINE|END_LINE); len -= font::vert; v += font::vert; } - add_char(vline_char, env->hpos, v, env->col, env->fill, + add_char(vline_char, font::hor, env->hpos, v, env->col, env->fill, VDRAW_MODE|END_LINE); } } @@ -511,20 +527,20 @@ len = -len; } if (len >= 0 && len <= font::hor) - add_char(hline_char, h, env->vpos, env->col, env->fill, + add_char(hline_char, font::hor, h, env->vpos, env->col, env->fill, HDRAW_MODE|START_LINE|END_LINE); else { - add_char(hline_char, h, env->vpos, env->col, env->fill, + add_char(hline_char, font::hor, h, env->vpos, env->col, env->fill, HDRAW_MODE|START_LINE); len -= font::hor; h += font::hor; while (len > 0) { - add_char(hline_char, h, env->vpos, env->col, env->fill, + add_char(hline_char, font::hor, h, env->vpos, env->col, env->fill, HDRAW_MODE|START_LINE|END_LINE); len -= font::hor; h += font::hor; } - add_char(hline_char, h, env->vpos, env->col, env->fill, + add_char(hline_char, font::hor, h, env->vpos, env->col, env->fill, HDRAW_MODE|END_LINE); } } @@ -676,7 +692,7 @@ if (next_tab_pos > p->hpos) break; if (cu_flag) - make_underline(); + make_underline(p->w); else if (!old_drawing_scheme && is_underline) { if (italic_flag) putstring(SGR_NO_ITALIC); @@ -692,7 +708,7 @@ } for (; hpos < p->hpos; hpos++) { if (cu_flag) - make_underline(); + make_underline(p->w); else if (!old_drawing_scheme && is_underline) { if (italic_flag) putstring(SGR_NO_ITALIC); @@ -720,7 +736,7 @@ continue; } if (p->mode & UNDERLINE_MODE) - make_underline(); + make_underline(p->w); else if (!old_drawing_scheme && is_underline) { if (italic_flag) putstring(SGR_NO_ITALIC); @@ -731,7 +747,7 @@ is_underline = 0; } if (p->mode & BOLD_MODE) - make_bold(p->code); + make_bold(p->code, p->w); else if (!old_drawing_scheme && is_bold) { putstring(SGR_NO_BOLD); is_bold = 0; @@ -747,7 +763,7 @@ } } put_char(p->code); - hpos++; + hpos += p->w / font::hor; } if (!old_drawing_scheme && (is_bold || is_underline diff -ruN groff-1.19.1/src/devices/xditview/ad2c groff-1.19.2/src/devices/xditview/ad2c --- groff-1.19.1/src/devices/xditview/ad2c 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/devices/xditview/ad2c 2005-05-18 07:33:28.000000000 +0200 @@ -0,0 +1,64 @@ +#! /bin/sh +# +# ad2c : Convert app-defaults file to C strings decls. +# +# George Ferguson, ferguson@cs.rcohester.edu, 12 Nov 1990. +# 19 Mar 1991: gf +# Made it self-contained. +# 6 Jan 1992: mycroft@gnu.ai.mit.edu (Charles Hannum) +# Removed use of "-n" and ":read" label since Gnu and +# IBM sed print pattern space on "n" command. Still works +# with Sun sed, of course. +# 7 Jan 1992: matthew@sunpix.East.Sun.COM (Matthew Stier) +# Escape quotes after escaping backslashes. +# 8 Jul 1992: Version 1.6 +# Manpage fixes. +# 19 Apr 1993: Version 1.7 +# Remove comments that were inside the sed command since +# some versions of sed don't like them. The comments are +# now given here in the header. +# 31 May 2004: Werner Lemberg +# Force casts to `String'. +# +# Comments on the script by line: +# /^!/d Remove comments +# /^$/d Remove blanks +# s/\\/\\\\/g Escape backslashes... +# s/\\$//g ...except the line continuation ones +# s/"/\\"/g Escape quotes +# s/^/"/ Add leading quote and cast +# : test Establish label for later branch +# /\\$/b slash Branch to label "slash" if line ends in backslash +# s/$/",/ Otherwise add closing quote and comma... +# p ...output the line... +# d ...and clear the pattern space so it's not printed again +# : slash Branch comes here if line ends in backslash +# n Read next line, append to pattern space +# [...] The "d" and "s" commands that follow just delete +# comments and blank lines and escape control sequences +# b test Branch up to see if the line ends in backslash or not +# + +sed ' +/^!/d +/^$/d +s/\\/\\\\/g +s/\\$//g +s/"/\\"/g +s/^/(String)"/ +: test +/\\$/b slash +s/$/",/ +p +d +: slash +n +/^!/d +/^$/d +s/"/\\"/g +s/\\\\/\\/g +s/\\n/\\\\n/g +s/\\t/\\\\t/g +s/\\f/\\\\f/g +s/\\b/\\\\b/g +b test' "$@" diff -ruN groff-1.19.1/src/devices/xditview/ChangeLog groff-1.19.2/src/devices/xditview/ChangeLog --- groff-1.19.1/src/devices/xditview/ChangeLog 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/devices/xditview/ChangeLog 2004-06-01 12:39:54.000000000 +0200 @@ -0,0 +1,542 @@ +2004-05-29 Werner LEMBERG + + gxditview and xtotroff have been integrated into the normal groff + directory structure; future changes are logged in the main + ChangeLog file. + +2004-05-13 Werner LEMBERG + +Version 1.19.1 released +======================= + +2004-04-17 Werner LEMBERG + + * device.c (scale_round): Round correctly for negative values + (this is the same function as in src/libs/libgroff/font.c). + Found by Paul Eggert. + +2003-11-10 Werner LEMBERG + + * Imakefile.in: s/@top_srcdir@/@abs_top_srcdir@/, + s/@groff_top_builddir@/@abs_top_builddir@/. + +Version 1.19 released +===================== + +2003-03-03 Werner LEMBERG + + * Imakefile.in (extraclean): Added gxditview._man. + +2003-01-28 Werner LEMBERG + + * Imakefile.in (SEP): New variable; set to @PATH_SEPARATOR@. + (GROFF_FONTPATH): Use it. + +2003-01-07 Werner LEMBERG + + * DviChar.c (Adobe_Symbol_map): Add `sqrt'. + +2003-01-06 Werner LEMBERG + + * DviChar.c (Adobe_Symbol_map): Add `integral'. + +2002-12-29 Werner LEMBERG + + * DviChar.c (ISO_8859_1_map): Remove `ap' and `eq'. + +2002-12-20 Werner LEMBERG + + * DviChar.c (Adobe_Symbol_map): Don't include `or'. + * draw.c (AdjustCharDeltas): Apply correction only if nadj > 1. + (DoCharacter): Call FlushCharCache if font size and font number + differ. + Reset `dw->dvi.cache.adjustable' properly. + +2002-12-09 Werner LEMBERG + + * DviChar.c (ISO_8859_1_map): Use `tno' symbol instead of `no'. + +2002-12-01 Werner LEMBERG + + * Imakefile.in: Use `InstallAppDefaultsLong' instead of + `InstallAppDefaults' to make it work if build directory isn't + $srcdir. + +2002-11-24 Werner LEMBERG + + * DviChar.c (Adobe_Symbol_map): Add glyph `braceex'. + +2002-11-14 Werner LEMBERG + + * DviChar.c (ISO_8859_1_map): Don't include `or'. + +Version 1.18.1 released +======================= + +2002-09-16 Werner LEMBERG + + * Imakefile.in (GROFF_LOCALFONTDIR): New variable. + (GROFF_FONTPATH): Use it. + Remove /usr/local/lib/font. + +Version 1.18.0 released +======================= + +2002-06-22 Werner LEMBERG + + * gxditview.c (main): Handle `-help' and `--help' correctly. + +2002-06-17 Colin Watson + + * Imakefile.in: s/@top_builddir@/@groff_top_builddir@/. + +2002-04-06 Werner LEMBERG + + * DviChar.c (ISO_8859_1_map, Adobe_Symbol_map): Remove all + characters > 0x80. + * parse.c (ParseInput): Ignore `m' command. + (ParseDrawFunction): Don't move for unknown drawing functions. + Don't move for `f' drawing function. + +2002-03-25 Werner LEMBERG + + * DviChar.c (ISO_8859_1_map): Use `t+-', `tmu', and `tdi' symbols + instead of `+-', `mu', and `di', respectively. + +2002-02-23 Werner LEMBERG + + * DviChar.c (ISO_8859_1_map): Add `mc' symbol. + +2001-09-22 Werner LEMBERG + + * Imakefile.in: Redefine `ProgramTargetHelper' as + `ProgramTargetHelperNoMan' and add a call to `InstallManPageLong' + to make the `install.man' target work if the build directory isn't + $srcdir. + +Version 1.17.2 released +======================= + +Version 1.17.1 released +======================= + +2001-04-21 Albert Chin-A-Young + + * Imakefile.in: Add support for recent HP architectures. + +Version 1.17 released +===================== + +2001-01-04 Rob Daasch + + * parse.c (ParseInput): Added 'F' to command switch to swallow + filename strings as ignored comments. + +2000-12-02 Werner LEMBERG + + * device.c (find_file): Remove home directory in search path. + +2000-11-14 Werner LEMBERG + + * device.c (open_device_file): Remove `path' parameter. + (find_file): Construct font path similar to groff: First the contents + of GROFF_FONT_PATH, then the home directory, and finally the default + font path. + * Imakefile.in: Fix GROFF_DATAPROGRAMDIR and GROFF_FONTPATH. + +2000-10-23 Werner LEMBERG + + Change installation structure for data files from .../groff/... to + .../groff//... to be conform with other GNU + programs. + + * Imakefile.in: Implement it. + +Version 1.16.1 released +======================= + +Version 1.16 released +===================== + +2000-05-18 Werner LEMBERG + + * DviChar.c: Adding `cq' as an alias for "'" in latin-1 map. + +2000-05-03 Werner LEMBERG + + * DviChar.c: Adding `dq' as an alias for `"' in latin-1 map. + +2000-04-28 Werner LEMBERG + + * DviChar.c: Replacing `md' glyph name with `pc' in latin-1 map to + make it distinct from the `md' glyph in the symbol font. + +2000-03-03 Werner LEMBERG + + * Imakefile replaced with Imakefile.in which will be configured by + the main configure script of groff. This will set the correct font + path, and it will make it possible to build xditview in a directory + different from $srcdir. + +2000-03-01 Colin Phipps + + * Dvi.c (OpenFile): Use tmpdir() for security reasons. + * xtotroff.c (MapFont): Avoid race while opening file. + +2000-02-06 Werner LEMBERG + + * Imakefile: Adapted to new directory structure. + + * README: Updated. + +Version 1.15 released +===================== + +1999-12-21 Werner LEMBERG + + * README: Fixed ftp GNU address. + +1999-12-13 Werner LEMBERG + + * device.c: Use extern declarations of strtok(), strchr(), and + getenv() only if not defined as macros. + +1999-11-18 Larry Jones + + * xditview.c: Add fallback_resources to allow running without + access to the app-defaults file. + + * Imakefile: Added rule to create app-defaults to a C header file. + + * GXditview-ad.h: New file containing fallback default resources. + + * ad2c: New file to do the app-defaults -> C header file + conversion. + +1999-10-27 Larry Jones + + * font.c (DisposeFontSizes): If there's a problem loading a font, + xditview will fall-back and use the default font, but it hasn't + checked before unloading fonts which could result in unloading the + default font (possibly multiple times) and then X errors. + +1999-09-13 Werner LEMBERG + + * Imakefile (extraclean): Added Makefile. + + * xditview.c (main, MakePrompt): Fixing compilation warnings. + + * TODO: Imakefile should be replaced with a configure script. + +1999-09-13 Werner LEMBERG + + * Makefile: Removed. + +1999-09-12 Werner LEMBERG + + * Imakefile (GROFF_FONTPATH): Another addition. + + * device.c (FONTPATH): Update to match current groff version. + +1999-09-11 Larry Jones + + * Imakefile (GROFF_LIBDIR, GROFF_FONTPATH): Update to match + current groff version. + + * Dvi.c (Realize, Destroy), DviP.h, draw.c (setFillGC), gray*.bm: + Allow 8 levels of gray rather than just 1. + + * draw.c (DrawFilledCircle, DrawFilledEllipse, DrawFilledPolygon): + Draw outlines to prevent gaps between abutting figures. + +1999-05-27 Werner LEMBERG + + * xtotroff.c (usage): Fixed typo. + +Mon Sep 11 10:40:33 1995 James Clark + + * device.c (INT_MIN, INT_MAX): Don't define if already defined. + +Mon Aug 8 11:14:11 1994 James Clark (jjc@jclark.com) + + * DviChar.c (Adobe_Symbol_map): Use \(nb for notsubset. + +Tue Apr 19 04:41:16 1994 James Clark (jjc@jclark.com) + + * Dvi.c (resources): Change default for background and foreground + to "XtDefaultBackground" and "XtDefaultForeground". + +Sat Feb 12 10:38:47 1994 James Clark (jjc@jclark.com) + + * DviChar.c (Adobe_Symbol_map): Rename radicalex to rn. + +Thu May 27 20:30:12 1993 James Clark (jjc@jclark.com) + + * device.c (isascii): Define if necessary. + (canonicalize_name): Cast argument to isdigit() to unsigned char. + +Thu Apr 29 18:36:57 1993 James Clark (jjc at jclark.com) + + * xditview.c: Include . + (NewFile): Don't declare rindex(). Use strrchr() rather than + rindex(). + +Tue Mar 30 15:12:09 1993 James Clark (jjc at jclark) + + * draw.c (charExists): Check that fi->per_char is not NULL. + +Sat Dec 12 17:42:40 1992 James Clark (jjc at jclark) + + * Dvi.c (SetGeometry): Cast XtMakeGeometryRequest arguments. + + * draw.c (DrawPolygon, DrawFilledPolygon): Cast Xtfree argument. + + * font.c (DisposeFontSizes): Add declaration. + + * draw.c (FakeCharacter): Add declaration. + +Wed Oct 28 13:24:00 1992 James Clark (jjc at jclark) + + * Imakefile (install.dev): Deleted. + (fonts): New target. + +Mon Oct 12 10:50:44 1992 James Clark (jjc at jclark) + + * Imakefile (install.dev): Say when we're installing devX*-12. + + * Imakefile (install.dev): Depends on DESC and FontMap. + +Thu Oct 1 20:03:45 1992 James Clark (jjc at jclark) + + * xditview.c (Syntax): Mention -filename option. + +Sat Aug 15 12:56:39 1992 James Clark (jjc at jclark) + + * GXditview.ad: Bind space and return to NextPage. Bind backspace + and delete to previous page. + + * DviChar.c (Adobe_Symbol_map): Add `an'. + + * DviChar.c (Adobe_Symbol_map): Add arrowvertex, arrowverttp, and + arrowvertbt. + +Mon Aug 10 11:54:27 1992 James Clark (jjc at jclark) + + * FontMap: Add m/p fields to the fonts names. + +Sat Aug 8 12:00:28 1992 James Clark (jjc at jclark) + + * DESC: Leave font positions 5-9 blank. + +Tue Jul 28 11:37:05 1992 James Clark (jjc at jclark) + + * Imakefile: Don't use gendef. Pass definition of FONTPATH using + DEFINES. + (path.h): Deleted. + (device.c): Don't include path.h. Provide default definition of + FONTPATH. + +Mon Jul 6 14:06:53 1992 James Clark (jjc at jclark) + + * Imakefile: Don't install tmac.X and tmac.Xps. + * tmac.X, tmac.Xps: Moved to ../macros. + + * Imakefile: Don't install eqnchar. + * eqnchar: Deleted. + +Sun Jun 14 12:55:02 1992 James Clark (jjc@jclark) + + * tmac.Xps: Handle OE, oe, lq, rq. + * draw.c (FakeCharacter): Don't handle these. + + * draw.c (FakeCharacter): Don't handle f/. + +Mon Jun 8 11:46:37 1992 James Clark (jjc@jclark) + + * tmac.X: Translate char160 to space. + +Sun Jun 7 14:39:53 1992 James Clark (jjc@jclark) + + * tmac.X: Do `mso tmac.psic' before restoring compatibility mode. + + * tmac.X: Add \(OE, \(oe, \(ah, \(ao, \(ho. + + * tmac.Xps: Make it work in compatibility mode. + Redo existing character definitions with .Xps-char. + Add more character definitions. + (Xps-char): New macro. + +Sat Jun 6 21:46:03 1992 James Clark (jjc@jclark) + + * DviChar.c (Adobe_Symbol_map): Add +h, +f, +p, Fn, lz. + * tmac.X: Add \(bq, \(Bq, \(aq. + * tmac.Xps: Handle \(aq, \(bq, \(Bq, \(Fn. + +Wed Jun 3 11:11:15 1992 James Clark (jjc@jclark) + + * DviChar.c (Adobe_Symbol_map): Add wp. + +Tue Apr 21 09:21:59 1992 James Clark (jjc at jclark) + + * GXditview.ad: Bind n, p, q keys to NextPage, PreviousPage and + Quit actions. + + * xditview.c (RerasterizeAction): New function. + (xditview_actions): Add RerasterizeAction. + * GXditview.ad: Bind r key to Rerasterize action. + +Fri Apr 17 08:25:36 1992 James Clark (jjc at jclark) + + * xditview.c: Add -filename option. + (main): Copy any -filename argument into current_file_name. + +Mon Mar 16 10:21:58 1992 James Clark (jjc at jclark) + + * tmac.X: Load tmac.pspic. + +Sun Mar 8 11:27:19 1992 James Clark (jjc at jclark) + + * Lex.c (GetLine, GetWord, GetNumber): Rewrite. + +Sat Oct 12 22:58:52 1991 James Clark (jjc at jclark) + + * Dvi.c (SetDevice): If the size change request is refused but a + larger geometry is offered, request that. + +Wed Oct 9 12:27:48 1991 James Clark (jjc at jclark) + + * font.c (InstallFontSizes): Ignore FontNameAverageWidth component. + + * Dvi.c (default_font_map): Add `adobe' to font names to avoid + ambiguity. + + * FontMap: New file. + * FontMap.X100, FontMap.X75: Deleted. + * xtotroff.c (main, usage): Add -s and -r options. + (MapFont): Change the font pattern to have the selected resolution and + size. + * Imakefile (install.dev): Use FontMap and supply appropriate -s + and -r options. + + * xtotroff.c (MapFont): Check for ambiguity by comparing canonicalized + font names. + + * DviP.h (DviFontList): Add initialized and scalable members. + (font.c): Add support for scalable fonts based on R5 xditview. + + * DviChar.c: Use xmalloc rather than malloc. + * xditview.c (xmalloc): New function. + * xtotroff.c (xmalloc): New function. + * other files: Use XtMalloc and XtFree instead of malloc and free. + +Thu Aug 29 20:15:31 1991 James Clark (jjc at jclark) + + * draw.c (setGC): Do multiplication in floating point to avoid + overflow. + +Tue Aug 13 12:04:41 1991 James Clark (jjc at jclark) + + * draw.c (FakeCharacter): Remove casts in defintion of pack2. + +Tue Jul 30 11:42:39 1991 James Clark (jjc at jclark) + + * tmac.Xps: New file. + * Imakefile (install): Install tmac.Xps. + +Tue Jul 2 09:31:37 1991 James Clark (jjc at jclark) + + * xtotroff.c (main): Pass argv[0] to usage(). + +Sun Jun 30 12:34:06 1991 James Clark (jjc at jclark) + + * xtotroff.c (MapFont): Handle the case where XLoadQueryFont + returns NULL. + +Sat Jun 29 12:32:52 1991 James Clark (jjc at jclark) + + * Imakefile: Use ../gendef to generate path.h. + +Sun Jun 16 13:26:34 1991 James Clark (jjc at jclark) + + * Imakefile (depend.o): Change to device.o. + +Sun Jun 2 12:17:56 1991 James Clark (jjc at jclark) + + * Imakefile: Remove spaces from the beginning of variable + assignment lines. + +Sun May 26 14:14:01 1991 James Clark (jjc at jclark) + + * xditview.c (Syntax): Update. + + * Dvi.c (DviSaveToFile, SaveToFile): New functions. + (FindPage): Check that we're not readingTmp before checking for + end of file of normal input file. + (ClassPartInitialize): New function. + * Dvi.h: Add declaration of DviSaveToFile. + * DviP.h: Add save method to DviClassPart. Declare + InheritSaveToFile. + * xditview.c (DoPrint, Print, PrintAction): New functions. + * xditview.c: Add print menu entry. + * xditview.c: Provide printCommand application resource. + * lex.c: Don't output EOF to temporary file. + + * Dvi.c (QueryGeometry): Check request->request_mode. + + * Dvi.c (SetDevice): New function. + (SetDeviceResolution): Deleted. + + * Dvi.c: Add resolution resource. + * DviP.h: Add definitions of XtNResolution and XtCResolution. + * xditview.c: Add -resolution argument. + * GXditview.ad: Add default for GXditview.height. + * Dvi.c (Initialize, SetDevice): Use default_resolution. + + * Dvi.c: Make MY_HEIGHT and MY_WIDTH use the paperlength and + paperwidth commands in the DESC file. + + * Dvi.c: Add SS font to default font map. + + * draw.c: Rewritten so as not to assume device and display + resolution is the same. + * DviP.h: Include device.h. Add device_font member to DviFontList. + Add adjustable array to DviCharCache. Add text_x_width, + text_device_width, word_flag, device_font, device_font_number, + device, native, device_resolution, display_resolution, + paperlength, paperwidth, scale_factor, sizescale members. + * Dvi.c (Initialize): Initialize new variable used by draw.c. + (Destroy): Call device_destroy. + * font.c (MaxFontPosition): New function. + (LookupFontSizeBySize): Handle sizescale. + (InstallFont): Load the device font. + (ForgetFonts): New function. + (QueryDeviceFont): New function. + * parse.c (ParseInput): Handle t and u commands. Split off + character output into draw.c. + (ParseDeviceControl): Ignore res command. Use the device argument + to the T command. + + * font.c (MapXNameToDviName): Ifdefed out. + + * path.h: New file. + * device.c, device.h: New files. + + * DviChar.c: Add entries for lB, rB, oq, lC, rC, md. + + * INSTALL: New file. + + * libxdvi: Merged into main directory. + * xtotroff.c, xditview.c: Change includes accordingly. + + * devX75, devX100: Merged into main directory. + * xditview.man: Renamed to gxditview.man. + + * Xditview.ad: Renamed to GXditview.ad. + * xditview.c (main): Use class of GXditview rather than xditview. + + * Imakefile: New file. + * Makefile: Deleted. + + * xtotroff.c (MapFont): Unlink output file before opening it. + + * Started separate ChangeLog. diff -ruN groff-1.19.1/src/devices/xditview/DESC.in groff-1.19.2/src/devices/xditview/DESC.in --- groff-1.19.1/src/devices/xditview/DESC.in 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/devices/xditview/DESC.in 2004-06-01 12:39:54.000000000 +0200 @@ -0,0 +1,9 @@ +styles R I B BI +fonts 6 0 0 0 0 0 S +sizes 8 10 12 14 18 24 0 +res 75 +X11 +hor 1 +vert 1 +unitwidth 10 +postpro gxditview diff -ruN groff-1.19.1/src/devices/xditview/device.c groff-1.19.2/src/devices/xditview/device.c --- groff-1.19.1/src/devices/xditview/device.c 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/devices/xditview/device.c 2004-06-01 12:39:54.000000000 +0200 @@ -0,0 +1,565 @@ +/* device.c */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include + +#include +#include + +#include "device.h" +#include "defs.h" + +#ifndef isascii +#define isascii(c) (1) +#endif + +/* Name of environment variable containing path to be used for +searching for device and font description files. */ +#define FONTPATH_ENV_VAR "GROFF_FONT_PATH" + +#define WS " \t\r\n" + +#ifndef INT_MIN +/* Minimum and maximum values a `signed int' can hold. */ +#define INT_MIN (-INT_MAX-1) +#define INT_MAX 2147483647 +#endif + +#define CHAR_TABLE_SIZE 307 + +struct _DeviceFont { + char *name; + int special; + DeviceFont *next; + Device *dev; + struct charinfo *char_table[CHAR_TABLE_SIZE]; + struct charinfo *code_table[256]; +}; + +struct charinfo { + int width; + int code; + struct charinfo *next; + struct charinfo *code_next; + char name[1]; +}; + +static char *current_filename = 0; +static int current_lineno = -1; + +static void error(const char *s); +static FILE *open_device_file(const char *, const char *, char **); +static DeviceFont *load_font(Device *, const char *); +static Device *new_device(const char *); +static DeviceFont *new_font(const char *, Device *); +static void delete_font(DeviceFont *); +static unsigned hash_name(const char *); +static struct charinfo *add_char(DeviceFont *, const char *, int, int); +static int read_charset_section(DeviceFont *, FILE *); +static char *canonicalize_name(const char *); +static int scale_round(int, int, int); + +static +Device *new_device(const char *name) +{ + Device *dev; + + dev = XtNew(Device); + dev->sizescale = 1; + dev->res = 0; + dev->unitwidth = 0; + dev->fonts = 0; + dev->X11 = 0; + dev->paperlength = 0; + dev->paperwidth = 0; + dev->name = XtNewString(name); + return dev; +} + +void device_destroy(Device *dev) +{ + DeviceFont *f; + + if (!dev) + return; + f = dev->fonts; + while (f) { + DeviceFont *tem = f; + f = f->next; + delete_font(tem); + } + + XtFree(dev->name); + XtFree((char *)dev); +} + +Device *device_load(const char *name) +{ + Device *dev; + FILE *fp; + int err = 0; + char buf[256]; + + fp = open_device_file(name, "DESC", ¤t_filename); + if (!fp) + return 0; + dev = new_device(name); + current_lineno = 0; + while (fgets(buf, sizeof(buf), fp)) { + char *p; + current_lineno++; + p = strtok(buf, WS); + if (p) { + int *np = 0; + char *q; + + if (strcmp(p, "charset") == 0) + break; + if (strcmp(p, "X11") == 0) + dev->X11 = 1; + else if (strcmp(p, "sizescale") == 0) + np = &dev->sizescale; + else if (strcmp(p, "res") == 0) + np = &dev->res; + else if (strcmp(p, "unitwidth") == 0) + np = &dev->unitwidth; + else if (strcmp(p, "paperwidth") == 0) + np = &dev->paperwidth; + else if (strcmp(p, "paperlength") == 0) + np = &dev->paperlength; + + if (np) { + q = strtok((char *)0, WS); + if (!q || sscanf(q, "%d", np) != 1 || *np <= 0) { + error("bad argument"); + err = 1; + break; + } + } + } + } + fclose(fp); + current_lineno = -1; + if (!err) { + if (dev->res == 0) { + error("missing res line"); + err = 1; + } + else if (dev->unitwidth == 0) { + error("missing unitwidth line"); + err = 1; + } + } + if (dev->paperlength == 0) + dev->paperlength = dev->res*11; + if (dev->paperwidth == 0) + dev->paperwidth = dev->res*8 + dev->res/2; + if (err) { + device_destroy(dev); + dev = 0; + } + XtFree(current_filename); + current_filename = 0; + return dev; +} + + +DeviceFont *device_find_font(Device *dev, const char *name) +{ + DeviceFont *f; + + if (!dev) + return 0; + for (f = dev->fonts; f; f = f->next) + if (strcmp(f->name, name) == 0) + return f; + return load_font(dev, name); +} + +static +DeviceFont *load_font(Device *dev, const char *name) +{ + FILE *fp; + char buf[256]; + DeviceFont *f; + int special = 0; + + fp = open_device_file(dev->name, name, ¤t_filename); + if (!fp) + return 0; + current_lineno = 0; + for (;;) { + char *p; + + if (!fgets(buf, sizeof(buf), fp)) { + error("no charset line"); + return 0; + } + current_lineno++; + p = strtok(buf, WS); + /* charset must be on a line by itself */ + if (p && strcmp(p, "charset") == 0 && strtok((char *)0, WS) == 0) + break; + if (p && strcmp(p, "special") == 0) + special = 1; + } + f = new_font(name, dev); + f->special = special; + if (!read_charset_section(f, fp)) { + delete_font(f); + f = 0; + } + else { + f->next = dev->fonts; + dev->fonts = f; + } + fclose(fp); + XtFree(current_filename); + current_filename = 0; + return f; +} + +static +DeviceFont *new_font(const char *name, Device *dev) +{ + int i; + DeviceFont *f; + + f = XtNew(DeviceFont); + f->name = XtNewString(name); + f->dev = dev; + f->special = 0; + f->next = 0; + for (i = 0; i < CHAR_TABLE_SIZE; i++) + f->char_table[i] = 0; + for (i = 0; i < 256; i++) + f->code_table[i] = 0; + return f; +} + +static +void delete_font(DeviceFont *f) +{ + int i; + + if (!f) + return; + XtFree(f->name); + for (i = 0; i < CHAR_TABLE_SIZE; i++) { + struct charinfo *ptr = f->char_table[i]; + while (ptr) { + struct charinfo *tem = ptr; + ptr = ptr->next; + XtFree((char *)tem); + } + } + XtFree((char *)f); +} + + +static +unsigned hash_name(const char *name) +{ + unsigned n = 0; + /* XXX do better than this */ + while (*name) + n = (n << 1) ^ *name++; + + return n; +} + +static +int scale_round(int n, int x, int y) +{ + int y2; + + if (x == 0) + return 0; + y2 = y/2; + if (n >= 0) { + if (n <= (INT_MAX - y2)/x) + return (n*x + y2)/y; + return (int)(n*(double)x/(double)y + .5); + } + else { + if (-(unsigned)n <= (-(unsigned)INT_MIN - y2)/x) + return (n*x - y2)/y; + return (int)(n*(double)x/(double)y + .5); + } +} + +static +char *canonicalize_name(const char *s) +{ + static char ch[2]; + if (s[0] == 'c' && s[1] == 'h' && s[2] == 'a' && s[3] == 'r') { + const char *p; + int n; + + for (p = s + 4; *p; p++) + if (!isascii(*p) || !isdigit((unsigned char)*p)) + return (char *)s; + n = atoi(s + 4); + if (n >= 0 && n <= 0xff) { + ch[0] = (char)n; + return ch; + } + } + return (char *)s; +} + +/* Return 1 if the character is present in the font; widthp gets the +width if non-null. */ + +int device_char_width(DeviceFont *f, int ps, const char *name, int *widthp) +{ + struct charinfo *p; + + name = canonicalize_name(name); + for (p = f->char_table[hash_name(name) % CHAR_TABLE_SIZE];; p = p->next) { + if (!p) + return 0; + if (strcmp(p->name, name) == 0) + break; + } + *widthp = scale_round(p->width, ps, f->dev->unitwidth); + return 1; +} + +int device_code_width(DeviceFont *f, int ps, int code, int *widthp) +{ + struct charinfo *p; + + for (p = f->code_table[code & 0xff];; p = p->code_next) { + if (!p) + return 0; + if (p->code == code) + break; + } + *widthp = scale_round(p->width, ps, f->dev->unitwidth); + return 1; +} + +char *device_name_for_code(DeviceFont *f, int code) +{ + static struct charinfo *state = 0; + if (f) + state = f->code_table[code & 0xff]; + for (; state; state = state->code_next) + if (state->code == code && state->name[0] != '\0') { + char *name = state->name; + state = state->code_next; + return name; + } + return 0; +} + +int device_font_special(DeviceFont *f) +{ + return f->special; +} + +static +struct charinfo *add_char(DeviceFont *f, const char *name, int width, int code) +{ + struct charinfo **pp; + struct charinfo *ci; + + name = canonicalize_name(name); + if (strcmp(name, "---") == 0) + name = ""; + + ci = (struct charinfo *)XtMalloc(XtOffsetOf(struct charinfo, name[0]) + + strlen(name) + 1); + + strcpy(ci->name, name); + ci->width = width; + ci->code = code; + + if (*name != '\0') { + pp = &f->char_table[hash_name(name) % CHAR_TABLE_SIZE]; + ci->next = *pp; + *pp = ci; + } + pp = &f->code_table[code & 0xff]; + ci->code_next = *pp; + *pp = ci; + return ci; +} + +/* Return non-zero for success. */ + +static +int read_charset_section(DeviceFont *f, FILE *fp) +{ + struct charinfo *last_charinfo = 0; + char buf[256]; + + while (fgets(buf, sizeof(buf), fp)) { + char *name; + int width; + int code; + char *p; + + current_lineno++; + name = strtok(buf, WS); + if (!name) + continue; /* ignore blank lines */ + p = strtok((char *)0, WS); + if (!p) /* end of charset section */ + break; + if (strcmp(p, "\"") == 0) { + if (!last_charinfo) { + error("first line of charset section cannot use `\"'"); + return 0; + } + else + (void)add_char(f, name, + last_charinfo->width, last_charinfo->code); + } + else { + char *q; + if (sscanf(p, "%d", &width) != 1) { + error("bad width field"); + return 0; + } + p = strtok((char *)0, WS); + if (!p) { + error("missing type field"); + return 0; + } + p = strtok((char *)0, WS); + if (!p) { + error("missing code field"); + return 0; + } + code = (int)strtol(p, &q, 0); + if (q == p) { + error("bad code field"); + return 0; + } + last_charinfo = add_char(f, name, width, code); + } + } + return 1; +} + +static +FILE *find_file(const char *file, char **result) +{ + char *buf = NULL; + int bufsiz = 0; + int flen; + FILE *fp; + char *path; + char *env; + + env = getenv(FONTPATH_ENV_VAR); + path = XtMalloc(((env && *env) ? strlen(env) + 1 : 0) + + strlen(FONTPATH) + 1); + *path = '\0'; + if (env && *env) { + strcat(path, env); + strcat(path, ":"); + } + strcat(path, FONTPATH); + + *result = NULL; + + if (file == NULL) + return NULL; + if (*file == '\0') + return NULL; + + if (*file == '/') { + fp = fopen(file, "r"); + if (fp) + *result = XtNewString(file); + return fp; + } + + flen = strlen(file); + + while (*path) { + int len; + char *start, *end; + + start = path; + end = strchr(path, ':'); + if (end) + path = end + 1; + else + path = end = strchr(path, '\0'); + if (start >= end) + continue; + if (end[-1] == '/') + --end; + len = (end - start) + 1 + flen + 1; + if (len > bufsiz) { + if (buf) + buf = XtRealloc(buf, len); + else + buf = XtMalloc(len); + bufsiz = len; + } + memcpy(buf, start, end - start); + buf[end - start] = '/'; + strcpy(buf + (end - start) + 1, file); + fp = fopen(buf, "r"); + if (fp) { + *result = buf; + return fp; + } + } + XtFree(buf); + return NULL; +} + +static +FILE *open_device_file(const char *device_name, const char *file_name, + char **result) +{ + char *buf; + FILE *fp; + + buf = XtMalloc(3 + strlen(device_name) + 1 + strlen(file_name) + 1); + sprintf(buf, "dev%s/%s", device_name, file_name); + fp = find_file(buf, result); + if (!fp) { + fprintf(stderr, "can't find device file `%s'\n", file_name); + fflush(stderr); + } + XtFree(buf); + return fp; +} + +static +void error(const char *s) +{ + if (current_filename) { + fprintf(stderr, "%s:", current_filename); + if (current_lineno > 0) + fprintf(stderr, "%d:", current_lineno); + putc(' ', stderr); + } + fputs(s, stderr); + putc('\n', stderr); + fflush(stderr); +} + +/* +Local Variables: +c-indent-level: 4 +c-continued-statement-offset: 4 +c-brace-offset: -4 +c-argdecl-indent: 4 +c-label-offset: -4 +c-tab-always-indent: nil +End: +*/ diff -ruN groff-1.19.1/src/devices/xditview/device.h groff-1.19.2/src/devices/xditview/device.h --- groff-1.19.1/src/devices/xditview/device.h 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/devices/xditview/device.h 2004-06-01 12:39:54.000000000 +0200 @@ -0,0 +1,21 @@ + +typedef struct _DeviceFont DeviceFont; + +typedef struct _Device { + char *name; + int sizescale; + int res; + int unitwidth; + int paperlength; + int paperwidth; + int X11; + DeviceFont *fonts; +} Device; + +void device_destroy(Device *); +Device *device_load(const char *); +DeviceFont *device_find_font(Device *, const char *); +int device_char_width(DeviceFont *, int, const char *, int *); +char *device_name_for_code(DeviceFont *, int); +int device_code_width(DeviceFont *, int, int, int *); +int device_font_special(DeviceFont *); diff -ruN groff-1.19.1/src/devices/xditview/draw.c groff-1.19.2/src/devices/xditview/draw.c --- groff-1.19.1/src/devices/xditview/draw.c 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/devices/xditview/draw.c 2004-06-01 12:39:55.000000000 +0200 @@ -0,0 +1,699 @@ +/* + * draw.c + * + * accept dvi function calls and translate to X + */ + +#include +#include +#include +#include +#include +#include + +/* math.h on a Sequent doesn't define M_PI, apparently */ +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +#include "DviP.h" + +#define DeviceToX(dw, n) ((int)((n) * (dw)->dvi.scale_factor + .5)) +#define XPos(dw) (DeviceToX((dw), (dw)->dvi.state->x - \ + (dw)->dvi.text_device_width) + (dw)->dvi.text_x_width) +#define YPos(dw) (DeviceToX((dw), (dw)->dvi.state->y)) + +static int FakeCharacter(DviWidget, char *, int); + +/* font.c */ +extern int MaxFontPosition(DviWidget); + +void +HorizontalMove(DviWidget dw, int delta) +{ + dw->dvi.state->x += delta; +} + +void +HorizontalGoto(DviWidget dw, int NewPosition) +{ + dw->dvi.state->x = NewPosition; +} + +void +VerticalMove(DviWidget dw, int delta) +{ + dw->dvi.state->y += delta; +} + +void +VerticalGoto(DviWidget dw, int NewPosition) +{ + dw->dvi.state->y = NewPosition; +} + +void +AdjustCacheDeltas (DviWidget dw) +{ + int extra; + int nadj; + int i; + + nadj = 0; + extra = DeviceToX(dw, dw->dvi.text_device_width) + - dw->dvi.text_x_width; + if (extra == 0) + return; + for (i = 0; i <= dw->dvi.cache.index; i++) + if (dw->dvi.cache.adjustable[i]) + ++nadj; + dw->dvi.text_x_width += extra; + if (nadj <= 1) + return; + for (i = 0; i <= dw->dvi.cache.index; i++) + if (dw->dvi.cache.adjustable[i]) { + int x; + int *deltap; + + x = extra/nadj; + deltap = &dw->dvi.cache.cache[i].delta; +#define MIN_DELTA 2 + if (*deltap > 0 && x + *deltap < MIN_DELTA) { + x = MIN_DELTA - *deltap; + if (x <= 0) + *deltap = MIN_DELTA; + else + x = 0; + } + else + *deltap += x; + extra -= x; + --nadj; + dw->dvi.cache.adjustable[i] = 0; + } +} + +void +FlushCharCache (DviWidget dw) +{ + if (dw->dvi.cache.char_index != 0) { + AdjustCacheDeltas (dw); + XDrawText (XtDisplay (dw), XtWindow (dw), dw->dvi.normal_GC, + dw->dvi.cache.start_x, dw->dvi.cache.start_y, + dw->dvi.cache.cache, dw->dvi.cache.index + 1); + } + dw->dvi.cache.index = 0; + dw->dvi.cache.max = DVI_TEXT_CACHE_SIZE; +#if 0 + if (dw->dvi.noPolyText) + dw->dvi.cache.max = 1; +#endif + dw->dvi.cache.char_index = 0; + dw->dvi.cache.cache[0].nchars = 0; + dw->dvi.cache.start_x = dw->dvi.cache.x = XPos (dw); + dw->dvi.cache.start_y = dw->dvi.cache.y = YPos (dw); +} + +void +Newline (DviWidget dw) +{ + FlushCharCache (dw); + dw->dvi.text_x_width = dw->dvi.text_device_width = 0; + dw->dvi.word_flag = 0; +} + +void +Word (DviWidget dw) +{ + dw->dvi.word_flag = 1; +} + +#define charWidth(fi,c) (\ + (fi)->per_char ?\ + (fi)->per_char[(c) - (fi)->min_char_or_byte2].width\ + :\ + (fi)->max_bounds.width\ +) + + +static +int charExists (XFontStruct *fi, int c) +{ + XCharStruct *p; + + /* `c' is always >= 0 */ + if (fi->per_char == NULL + || (unsigned int)c < fi->min_char_or_byte2 + || (unsigned int)c > fi->max_char_or_byte2) + return 0; + p = fi->per_char + (c - fi->min_char_or_byte2); + return (p->lbearing != 0 || p->rbearing != 0 || p->width != 0 + || p->ascent != 0 || p->descent != 0 || p->attributes != 0); +} + +/* `wid' is in device units */ +static void +DoCharacter (DviWidget dw, int c, int wid) +{ + register XFontStruct *font; + register XTextItem *text; + int x, y; + + x = XPos(dw); + y = YPos(dw); + + /* + * quick and dirty extents calculation: + */ + if (!(y + 24 >= dw->dvi.extents.y1 + && y - 24 <= dw->dvi.extents.y2 +#if 0 + && x + 24 >= dw->dvi.extents.x1 + && x - 24 <= dw->dvi.extents.x2 +#endif + )) + return; + + if (y != dw->dvi.cache.y + || dw->dvi.cache.char_index >= DVI_CHAR_CACHE_SIZE) { + FlushCharCache (dw); + x = dw->dvi.cache.x; + dw->dvi.cache.adjustable[dw->dvi.cache.index] = 0; + } + /* + * load a new font, if the current block is not empty, + * step to the next. + */ + if (dw->dvi.cache.font_size != dw->dvi.state->font_size || + dw->dvi.cache.font_number != dw->dvi.state->font_number) + { + FlushCharCache (dw); + x = dw->dvi.cache.x; + dw->dvi.cache.font_size = dw->dvi.state->font_size; + dw->dvi.cache.font_number = dw->dvi.state->font_number; + dw->dvi.cache.font = QueryFont (dw, + dw->dvi.cache.font_number, + dw->dvi.cache.font_size); + if (dw->dvi.cache.cache[dw->dvi.cache.index].nchars != 0) { + ++dw->dvi.cache.index; + if (dw->dvi.cache.index >= dw->dvi.cache.max) + FlushCharCache (dw); + dw->dvi.cache.cache[dw->dvi.cache.index].nchars = 0; + dw->dvi.cache.adjustable[dw->dvi.cache.index] = 0; + } + } + if (x != dw->dvi.cache.x || dw->dvi.word_flag) { + if (dw->dvi.cache.cache[dw->dvi.cache.index].nchars != 0) { + ++dw->dvi.cache.index; + if (dw->dvi.cache.index >= dw->dvi.cache.max) + FlushCharCache (dw); + dw->dvi.cache.cache[dw->dvi.cache.index].nchars = 0; + dw->dvi.cache.adjustable[dw->dvi.cache.index] = 0; + } + dw->dvi.cache.adjustable[dw->dvi.cache.index] + = dw->dvi.word_flag; + dw->dvi.word_flag = 0; + } + font = dw->dvi.cache.font; + text = &dw->dvi.cache.cache[dw->dvi.cache.index]; + if (text->nchars == 0) { + text->chars = &dw->dvi.cache.char_cache[dw->dvi.cache.char_index]; + text->delta = x - dw->dvi.cache.x; + if (font != dw->dvi.font) { + text->font = font->fid; + dw->dvi.font = font; + } else + text->font = None; + dw->dvi.cache.x += text->delta; + } + if (charExists(font, c)) { + int w; + dw->dvi.cache.char_cache[dw->dvi.cache.char_index++] = (char) c; + ++text->nchars; + w = charWidth(font, c); + dw->dvi.cache.x += w; + if (wid != 0) { + dw->dvi.text_x_width += w; + dw->dvi.text_device_width += wid; + } + } +} + +static +int FindCharWidth (DviWidget dw, char *buf, int *widp) +{ + int maxpos; + int i; + + if (dw->dvi.device_font == 0 + || dw->dvi.state->font_number != dw->dvi.device_font_number) { + dw->dvi.device_font_number = dw->dvi.state->font_number; + dw->dvi.device_font + = QueryDeviceFont (dw, dw->dvi.device_font_number); + } + if (dw->dvi.device_font + && device_char_width (dw->dvi.device_font, + dw->dvi.state->font_size, buf, widp)) + return 1; + + maxpos = MaxFontPosition (dw); + for (i = 1; i <= maxpos; i++) { + DeviceFont *f = QueryDeviceFont (dw, i); + if (f && device_font_special (f) + && device_char_width (f, dw->dvi.state->font_size, + buf, widp)) { + dw->dvi.state->font_number = i; + return 1; + } + } + return 0; +} + +/* Return the width of the character in device units. */ + +int PutCharacter (DviWidget dw, char *buf) +{ + int prevFont; + int c = -1; + int wid = 0; + DviCharNameMap *map; + + if (!dw->dvi.display_enable) + return 0; /* The width doesn't matter in this case. */ + prevFont = dw->dvi.state->font_number; + if (!FindCharWidth (dw, buf, &wid)) + return 0; + map = QueryFontMap (dw, dw->dvi.state->font_number); + if (map) + c = DviCharIndex (map, buf); + if (c >= 0) + DoCharacter (dw, c, wid); + else + (void) FakeCharacter (dw, buf, wid); + dw->dvi.state->font_number = prevFont; + return wid; +} + +/* Return 1 if we can fake it; 0 otherwise. */ + +static +int FakeCharacter (DviWidget dw, char *buf, int wid) +{ + int oldx, oldw; + char ch[2]; + const char *chars = 0; + + if (buf[0] == '\0' || buf[1] == '\0' || buf[2] != '\0') + return 0; +#define pack2(c1, c2) (((c1) << 8) | (c2)) + + switch (pack2(buf[0], buf[1])) { + case pack2('f', 'i'): + chars = "fi"; + break; + case pack2('f', 'l'): + chars = "fl"; + break; + case pack2('f', 'f'): + chars = "ff"; + break; + case pack2('F', 'i'): + chars = "ffi"; + break; + case pack2('F', 'l'): + chars = "ffl"; + break; + } + if (!chars) + return 0; + oldx = dw->dvi.state->x; + oldw = dw->dvi.text_device_width; + ch[1] = '\0'; + for (; *chars; chars++) { + ch[0] = *chars; + dw->dvi.state->x += PutCharacter (dw, ch); + } + dw->dvi.state->x = oldx; + dw->dvi.text_device_width = oldw + wid; + return 1; +} + +void +PutNumberedCharacter (DviWidget dw, int c) +{ + char *name; + int wid; + DviCharNameMap *map; + + if (!dw->dvi.display_enable) + return; + + if (dw->dvi.device_font == 0 + || dw->dvi.state->font_number != dw->dvi.device_font_number) { + dw->dvi.device_font_number = dw->dvi.state->font_number; + dw->dvi.device_font + = QueryDeviceFont (dw, dw->dvi.device_font_number); + } + + if (dw->dvi.device_font == 0 + || !device_code_width (dw->dvi.device_font, + dw->dvi.state->font_size, c, &wid)) + return; + if (dw->dvi.native) { + DoCharacter (dw, c, wid); + return; + } + map = QueryFontMap (dw, dw->dvi.state->font_number); + if (!map) + return; + for (name = device_name_for_code (dw->dvi.device_font, c); + name; + name = device_name_for_code ((DeviceFont *)0, c)) { + int code = DviCharIndex (map, name); + if (code >= 0) { + DoCharacter (dw, code, wid); + break; + } + if (FakeCharacter (dw, name, wid)) + break; + } +} + +void +ClearPage (DviWidget dw) +{ + XClearWindow (XtDisplay (dw), XtWindow (dw)); +} + +static void +setGC (DviWidget dw) +{ + int desired_line_width; + + if (dw->dvi.line_thickness < 0) + desired_line_width = (int)(((double)dw->dvi.device_resolution + * dw->dvi.state->font_size) + / (10.0*72.0*dw->dvi.sizescale)); + else + desired_line_width = dw->dvi.line_thickness; + + if (desired_line_width != dw->dvi.line_width) { + XGCValues values; + values.line_width = DeviceToX(dw, desired_line_width); + if (values.line_width == 0) + values.line_width = 1; + XChangeGC(XtDisplay (dw), dw->dvi.normal_GC, + GCLineWidth, &values); + dw->dvi.line_width = desired_line_width; + } +} + +static void +setFillGC (DviWidget dw) +{ + int fill_type; + unsigned long mask = GCFillStyle | GCForeground; + + fill_type = (dw->dvi.fill * 10) / (DVI_FILL_MAX + 1); + if (dw->dvi.fill_type != fill_type) { + XGCValues values; + if (fill_type <= 0) { + values.foreground = dw->dvi.background; + values.fill_style = FillSolid; + } else if (fill_type >= 9) { + values.foreground = dw->dvi.foreground; + values.fill_style = FillSolid; + } else { + values.foreground = dw->dvi.foreground; + values.fill_style = FillOpaqueStippled; + values.stipple = dw->dvi.gray[fill_type - 1]; + mask |= GCStipple; + } + XChangeGC(XtDisplay (dw), dw->dvi.fill_GC, mask, &values); + dw->dvi.fill_type = fill_type; + } +} + +void +DrawLine (DviWidget dw, int x, int y) +{ + int xp, yp; + + AdjustCacheDeltas (dw); + setGC (dw); + xp = XPos (dw); + yp = YPos (dw); + XDrawLine (XtDisplay (dw), XtWindow (dw), dw->dvi.normal_GC, + xp, yp, + xp + DeviceToX (dw, x), yp + DeviceToX (dw, y)); +} + +void +DrawCircle (DviWidget dw, int diam) +{ + int d; + + AdjustCacheDeltas (dw); + setGC (dw); + d = DeviceToX (dw, diam); + XDrawArc (XtDisplay (dw), XtWindow (dw), dw->dvi.normal_GC, + XPos (dw), YPos (dw) - d/2, + d, d, 0, 64*360); +} + +void +DrawFilledCircle (DviWidget dw, int diam) +{ + int d; + + AdjustCacheDeltas (dw); + setFillGC (dw); + d = DeviceToX (dw, diam); + XFillArc (XtDisplay (dw), XtWindow (dw), dw->dvi.fill_GC, + XPos (dw), YPos (dw) - d/2, + d, d, 0, 64*360); + XDrawArc (XtDisplay (dw), XtWindow (dw), dw->dvi.fill_GC, + XPos (dw), YPos (dw) - d/2, + d, d, 0, 64*360); +} + +void +DrawEllipse (DviWidget dw, int a, int b) +{ + AdjustCacheDeltas (dw); + setGC (dw); + XDrawArc (XtDisplay (dw), XtWindow (dw), dw->dvi.normal_GC, + XPos (dw), YPos (dw) - DeviceToX (dw, b/2), + DeviceToX (dw, a), DeviceToX (dw, b), 0, 64*360); +} + +void +DrawFilledEllipse (DviWidget dw, int a, int b) +{ + AdjustCacheDeltas (dw); + setFillGC (dw); + XFillArc (XtDisplay (dw), XtWindow (dw), dw->dvi.fill_GC, + XPos (dw), YPos (dw) - DeviceToX (dw, b/2), + DeviceToX (dw, a), DeviceToX (dw, b), 0, 64*360); + XDrawArc (XtDisplay (dw), XtWindow (dw), dw->dvi.fill_GC, + XPos (dw), YPos (dw) - DeviceToX (dw, b/2), + DeviceToX (dw, a), DeviceToX (dw, b), 0, 64*360); +} + +void +DrawArc (DviWidget dw, int x_0, int y_0, int x_1, int y_1) +{ + int angle1, angle2; + int rad = (int)((sqrt ((double)x_0*x_0 + (double)y_0*y_0) + + sqrt ((double)x_1*x_1 + (double)y_1*y_1) + + 1.0)/2.0); + if ((x_0 == 0 && y_0 == 0) || (x_1 == 0 && y_1 == 0)) + return; + angle1 = (int)(atan2 ((double)y_0, (double)-x_0)*180.0*64.0/M_PI); + angle2 = (int)(atan2 ((double)-y_1, (double)x_1)*180.0*64.0/M_PI); + + angle2 -= angle1; + if (angle2 < 0) + angle2 += 64*360; + + AdjustCacheDeltas (dw); + setGC (dw); + + rad = DeviceToX (dw, rad); + XDrawArc (XtDisplay (dw), XtWindow (dw), dw->dvi.normal_GC, + XPos (dw) + DeviceToX (dw, x_0) - rad, + YPos (dw) + DeviceToX (dw, y_0) - rad, + rad*2, rad*2, angle1, angle2); +} + +void +DrawPolygon (DviWidget dw, int *v, int n) +{ + XPoint *p; + int i; + int dx, dy; + + n /= 2; + + AdjustCacheDeltas (dw); + setGC (dw); + p = (XPoint *)XtMalloc((n + 2)*sizeof(XPoint)); + p[0].x = XPos (dw); + p[0].y = YPos (dw); + dx = 0; + dy = 0; + for (i = 0; i < n; i++) { + dx += v[2*i]; + p[i + 1].x = DeviceToX (dw, dx) + p[0].x; + dy += v[2*i + 1]; + p[i + 1].y = DeviceToX (dw, dy) + p[0].y; + } + p[n+1].x = p[0].x; + p[n+1].y = p[0].y; + XDrawLines (XtDisplay (dw), XtWindow (dw), dw->dvi.normal_GC, + p, n + 2, CoordModeOrigin); + XtFree((char *)p); +} + +void +DrawFilledPolygon (DviWidget dw, int *v, int n) +{ + XPoint *p; + int i; + int dx, dy; + + n /= 2; + if (n < 2) + return; + + AdjustCacheDeltas (dw); + setFillGC (dw); + p = (XPoint *)XtMalloc((n + 2)*sizeof(XPoint)); + p[0].x = p[n+1].x = XPos (dw); + p[0].y = p[n+1].y = YPos (dw); + dx = 0; + dy = 0; + for (i = 0; i < n; i++) { + dx += v[2*i]; + p[i + 1].x = DeviceToX (dw, dx) + p[0].x; + dy += v[2*i + 1]; + p[i + 1].y = DeviceToX (dw, dy) + p[0].y; + } + XFillPolygon (XtDisplay (dw), XtWindow (dw), dw->dvi.fill_GC, + p, n + 1, Complex, CoordModeOrigin); + XDrawLines (XtDisplay (dw), XtWindow (dw), dw->dvi.fill_GC, + p, n + 2, CoordModeOrigin); + XtFree((char *)p); +} + +#define POINTS_MAX 10000 + +static void +appendPoint(XPoint *points, int *pointi, int x, int y) +{ + if (*pointi < POINTS_MAX) { + points[*pointi].x = x; + points[*pointi].y = y; + *pointi += 1; + } +} + +#define FLATNESS 1 + +static void +flattenCurve(XPoint *points, int *pointi, + int x_2, int y_2, int x_3, int y_3, int x_4, int y_4) +{ + int x_1, y_1, dx, dy, n1, n2, n; + + x_1 = points[*pointi - 1].x; + y_1 = points[*pointi - 1].y; + + dx = x_4 - x_1; + dy = y_4 - y_1; + + n1 = dy*(x_2 - x_1) - dx*(y_2 - y_1); + n2 = dy*(x_3 - x_1) - dx*(y_3 - y_1); + if (n1 < 0) + n1 = -n1; + if (n2 < 0) + n2 = -n2; + n = n1 > n2 ? n1 : n2; + + if (n*n / (dy*dy + dx*dx) <= FLATNESS*FLATNESS) + appendPoint (points, pointi, x_4, y_4); + else { + flattenCurve (points, pointi, + (x_1 + x_2)/2, + (y_1 + y_2)/2, + (x_1 + x_2*2 + x_3)/4, + (y_1 + y_2*2 + y_3)/4, + (x_1 + 3*x_2 + 3*x_3 + x_4)/8, + (y_1 + 3*y_2 + 3*y_3 + y_4)/8); + flattenCurve (points, pointi, + (x_2 + x_3*2 + x_4)/4, + (y_2 + y_3*2 + y_4)/4, + (x_3 + x_4)/2, + (y_3 + y_4)/2, + x_4, + y_4); + } +} + +void +DrawSpline (DviWidget dw, int *v, int n) +{ + int sx, sy, tx, ty; + int ox, oy, dx, dy; + int i; + int pointi; + XPoint points[POINTS_MAX]; + + if (n == 0 || (n & 1) != 0) + return; + AdjustCacheDeltas (dw); + setGC (dw); + ox = XPos (dw); + oy = YPos (dw); + dx = v[0]; + dy = v[1]; + sx = ox; + sy = oy; + tx = sx + DeviceToX (dw, dx); + ty = sy + DeviceToX (dw, dy); + + pointi = 0; + + appendPoint (points, &pointi, sx, sy); + appendPoint (points, &pointi, (sx + tx)/2, (sy + ty)/2); + + for (i = 2; i < n; i += 2) { + int ux = ox + DeviceToX (dw, dx += v[i]); + int uy = oy + DeviceToX (dw, dy += v[i+1]); + flattenCurve (points, &pointi, + (sx + tx*5)/6, (sy + ty*5)/6, + (tx*5 + ux)/6, (ty*5 + uy)/6, + (tx + ux)/2, (ty + uy)/2); + sx = tx; + sy = ty; + tx = ux; + ty = uy; + } + + appendPoint (points, &pointi, tx, ty); + + XDrawLines (XtDisplay (dw), XtWindow (dw), dw->dvi.normal_GC, + points, pointi, CoordModeOrigin); +} + + +/* +Local Variables: +c-indent-level: 8 +c-continued-statement-offset: 8 +c-brace-offset: -8 +c-argdecl-indent: 8 +c-label-offset: -8 +c-tab-always-indent: nil +End: +*/ diff -ruN groff-1.19.1/src/devices/xditview/Dvi.c groff-1.19.2/src/devices/xditview/Dvi.c --- groff-1.19.1/src/devices/xditview/Dvi.c 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/devices/xditview/Dvi.c 2004-11-24 20:53:14.000000000 +0100 @@ -0,0 +1,611 @@ +#ifndef SABER +#ifndef lint +static char Xrcsid[] = "$XConsortium: Dvi.c,v 1.9 89/12/10 16:12:25 rws Exp $"; +#endif /* lint */ +#endif /* SABER */ + +/* + * Dvi.c - Dvi display widget + * + */ + +#define XtStrlen(s) ((s) ? strlen(s) : 0) + + /* The following are defined for the reader's convenience. Any + Xt..Field macro in this code just refers to some field in + one of the substructures of the WidgetRec. */ + +#include +#include +#include +#include +#include +#include "DviP.h" + +/**************************************************************** + * + * Full class record constant + * + ****************************************************************/ + +/* Private Data */ + +static char default_font_map_1[] = "\ +TR -adobe-times-medium-r-normal--*-100-*-*-*-*-iso8859-1\n\ +TI -adobe-times-medium-i-normal--*-100-*-*-*-*-iso8859-1\n\ +TB -adobe-times-bold-r-normal--*-100-*-*-*-*-iso8859-1\n\ +TBI -adobe-times-bold-i-normal--*-100-*-*-*-*-iso8859-1\n\ +CR -adobe-courier-medium-r-normal--*-100-*-*-*-*-iso8859-1\n\ +CI -adobe-courier-medium-o-normal--*-100-*-*-*-*-iso8859-1\n\ +CB -adobe-courier-bold-r-normal--*-100-*-*-*-*-iso8859-1\n\ +CBI -adobe-courier-bold-o-normal--*-100-*-*-*-*-iso8859-1\n\ +"; +static char default_font_map_2[] = "\ +HR -adobe-helvetica-medium-r-normal--*-100-*-*-*-*-iso8859-1\n\ +HI -adobe-helvetica-medium-o-normal--*-100-*-*-*-*-iso8859-1\n\ +HB -adobe-helvetica-bold-r-normal--*-100-*-*-*-*-iso8859-1\n\ +HBI -adobe-helvetica-bold-o-normal--*-100-*-*-*-*-iso8859-1\n\ +"; +static char default_font_map_3[] = "\ +NR -adobe-new century schoolbook-medium-r-normal--*-100-*-*-*-*-iso8859-1\n\ +NI -adobe-new century schoolbook-medium-i-normal--*-100-*-*-*-*-iso8859-1\n\ +NB -adobe-new century schoolbook-bold-r-normal--*-100-*-*-*-*-iso8859-1\n\ +NBI -adobe-new century schoolbook-bold-i-normal--*-100-*-*-*-*-iso8859-1\n\ +S -adobe-symbol-medium-r-normal--*-100-*-*-*-*-adobe-fontspecific\n\ +SS -adobe-symbol-medium-r-normal--*-100-*-*-*-*-adobe-fontspecific\n\ +"; + +#define offset(field) XtOffset(DviWidget, field) + +#define MY_WIDTH(dw) ((int)(dw->dvi.paperwidth * dw->dvi.scale_factor + .5)) +#define MY_HEIGHT(dw) ((int)(dw->dvi.paperlength * dw->dvi.scale_factor + .5)) + +static XtResource resources[] = { + {(String)XtNfontMap, (String)XtCFontMap, (String)XtRString, + sizeof (char *), offset(dvi.font_map_string), + (String)XtRString, NULL /* set in code */}, + {(String)XtNforeground, (String)XtCForeground, (String)XtRPixel, + sizeof (unsigned long), offset(dvi.foreground), + (String)XtRString, (XtPointer)"XtDefaultForeground"}, + {(String)XtNbackground, (String)XtCBackground, (String)XtRPixel, + sizeof (unsigned long), offset(dvi.background), + (String)XtRString, (XtPointer)"XtDefaultBackground"}, + {(String)XtNpageNumber, (String)XtCPageNumber, (String)XtRInt, + sizeof (int), offset(dvi.requested_page), + (String)XtRString, (XtPointer)"1"}, + {(String)XtNlastPageNumber, (String)XtCLastPageNumber, (String)XtRInt, + sizeof (int), offset (dvi.last_page), + (String)XtRString, (XtPointer)"0"}, + {(String)XtNfile, (String)XtCFile, (String)XtRFile, + sizeof (FILE *), offset (dvi.file), + (String)XtRFile, (XtPointer)0}, + {(String)XtNseek, (String)XtCSeek, (String)XtRBoolean, + sizeof (Boolean), offset(dvi.seek), + (String)XtRString, (XtPointer)"false"}, + {(String)XtNfont, (String)XtCFont, (String)XtRFontStruct, + sizeof (XFontStruct *), offset(dvi.default_font), + (String)XtRString, (XtPointer)"xtdefaultfont"}, + {(String)XtNbackingStore, (String)XtCBackingStore, (String)XtRBackingStore, + sizeof (int), offset(dvi.backing_store), + (String)XtRString, (XtPointer)"default"}, + {(String)XtNnoPolyText, (String)XtCNoPolyText, (String)XtRBoolean, + sizeof (Boolean), offset(dvi.noPolyText), + (String)XtRString, (XtPointer)"false"}, + {(String)XtNresolution, (String)XtCResolution, (String)XtRInt, + sizeof(int), offset(dvi.default_resolution), + (String)XtRString, (XtPointer)"75"}, +}; + +#undef offset + +static void ClassInitialize (void); +static void ClassPartInitialize(WidgetClass); +static void Initialize(Widget, Widget, ArgList, Cardinal *); +static void Realize (Widget, XtValueMask *, XSetWindowAttributes *); +static void Destroy (Widget); +static void Redisplay (Widget, XEvent *, Region); +static Boolean SetValues (Widget, Widget, Widget, + ArgList, Cardinal *); +static Boolean SetValuesHook (Widget, ArgList, Cardinal *); +static XtGeometryResult QueryGeometry (Widget, XtWidgetGeometry *, + XtWidgetGeometry *); +static void ShowDvi (DviWidget); +static void CloseFile (DviWidget); +static void OpenFile (DviWidget); +static void FindPage (DviWidget); + +static void SaveToFile (Widget, FILE *); + +/* font.c */ +extern void ParseFontMap(DviWidget); +extern void DestroyFontMap(DviFontMap *); +extern void ForgetFonts(DviWidget); + +/* page.c */ +extern void DestroyFileMap(DviFileMap *); +extern long SearchPagePosition(DviWidget, int); +extern void FileSeek(DviWidget, long); +extern void ForgetPagePositions(DviWidget); + +/* parse.c */ +extern int ParseInput(register DviWidget); + +DviClassRec dviClassRec = { +{ + &widgetClassRec, /* superclass */ + (String)"Dvi", /* class_name */ + sizeof(DviRec), /* size */ + ClassInitialize, /* class_initialize */ + ClassPartInitialize, /* class_part_initialize */ + FALSE, /* class_inited */ + Initialize, /* initialize */ + NULL, /* initialize_hook */ + Realize, /* realize */ + NULL, /* actions */ + 0, /* num_actions */ + resources, /* resources */ + XtNumber(resources), /* resource_count */ + NULLQUARK, /* xrm_class */ + FALSE, /* compress_motion */ + TRUE, /* compress_exposure */ + TRUE, /* compress_enterleave */ + FALSE, /* visible_interest */ + Destroy, /* destroy */ + NULL, /* resize */ + Redisplay, /* expose */ + SetValues, /* set_values */ + SetValuesHook, /* set_values_hook */ + NULL, /* set_values_almost */ + NULL, /* get_values_hook */ + NULL, /* accept_focus */ + XtVersion, /* version */ + NULL, /* callback_private */ + 0, /* tm_table */ + QueryGeometry, /* query_geometry */ + NULL, /* display_accelerator */ + NULL /* extension */ +},{ + SaveToFile, /* save */ +}, +}; + +WidgetClass dviWidgetClass = (WidgetClass) &dviClassRec; + +static void ClassInitialize (void) +{ + int len1 = strlen(default_font_map_1); + int len2 = strlen(default_font_map_2); + int len3 = strlen(default_font_map_3); + char *dfm = XtMalloc(len1 + len2 + len3 + 1); + char *ptr = dfm; + strcpy(ptr, default_font_map_1); ptr += len1; + strcpy(ptr, default_font_map_2); ptr += len2; + strcpy(ptr, default_font_map_3); + resources[0].default_addr = dfm; + + XtAddConverter( XtRString, XtRBackingStore, XmuCvtStringToBackingStore, + NULL, 0 ); +} + +/**************************************************************** + * + * Private Procedures + * + ****************************************************************/ + +/* ARGSUSED */ +static void Initialize(Widget request, Widget new_wd, + ArgList args, Cardinal *num_args) +{ + DviWidget dw = (DviWidget) new_wd; + + dw->dvi.current_page = 0; + dw->dvi.font_map = 0; + dw->dvi.cache.index = 0; + dw->dvi.text_x_width = 0; + dw->dvi.text_device_width = 0; + dw->dvi.word_flag = 0; + dw->dvi.file = 0; + dw->dvi.tmpFile = 0; + dw->dvi.state = 0; + dw->dvi.readingTmp = 0; + dw->dvi.cache.char_index = 0; + dw->dvi.cache.font_size = -1; + dw->dvi.cache.font_number = -1; + dw->dvi.cache.adjustable[0] = 0; + dw->dvi.file_map = 0; + dw->dvi.fonts = 0; + dw->dvi.seek = False; + dw->dvi.device_resolution = dw->dvi.default_resolution; + dw->dvi.display_resolution = dw->dvi.default_resolution; + dw->dvi.paperlength = dw->dvi.default_resolution*11; + dw->dvi.paperwidth = (dw->dvi.default_resolution*8 + + dw->dvi.default_resolution/2); + dw->dvi.scale_factor = 1.0; + dw->dvi.sizescale = 1; + dw->dvi.line_thickness = -1; + dw->dvi.line_width = 1; + dw->dvi.fill = DVI_FILL_MAX; + dw->dvi.device_font = 0; + dw->dvi.device_font_number = -1; + dw->dvi.device = 0; + dw->dvi.native = 0; + + request = request; /* unused; suppress compiler warning */ + args = args; + num_args = num_args; +} + +#include "gray1.bm" +#include "gray2.bm" +#include "gray3.bm" +#include "gray4.bm" +#include "gray5.bm" +#include "gray6.bm" +#include "gray7.bm" +#include "gray8.bm" + +static void +Realize (Widget w, XtValueMask *valueMask, XSetWindowAttributes *attrs) +{ + DviWidget dw = (DviWidget) w; + XGCValues values; + + if (dw->dvi.backing_store != Always + WhenMapped + NotUseful) { + attrs->backing_store = dw->dvi.backing_store; + *valueMask |= CWBackingStore; + } + XtCreateWindow (w, (unsigned)InputOutput, (Visual *) CopyFromParent, + *valueMask, attrs); + values.foreground = dw->dvi.foreground; + values.cap_style = CapRound; + values.join_style = JoinRound; + values.line_width = dw->dvi.line_width; + dw->dvi.normal_GC = XCreateGC (XtDisplay (w), XtWindow (w), + GCForeground|GCCapStyle|GCJoinStyle + |GCLineWidth, + &values); + dw->dvi.gray[0] = XCreateBitmapFromData(XtDisplay (w), XtWindow (w), + gray1_bits, + gray1_width, gray1_height); + dw->dvi.gray[1] = XCreateBitmapFromData(XtDisplay (w), XtWindow (w), + gray2_bits, + gray2_width, gray2_height); + dw->dvi.gray[2] = XCreateBitmapFromData(XtDisplay (w), XtWindow (w), + gray3_bits, + gray3_width, gray3_height); + dw->dvi.gray[3] = XCreateBitmapFromData(XtDisplay (w), XtWindow (w), + gray4_bits, + gray4_width, gray4_height); + dw->dvi.gray[4] = XCreateBitmapFromData(XtDisplay (w), XtWindow (w), + gray5_bits, + gray5_width, gray5_height); + dw->dvi.gray[5] = XCreateBitmapFromData(XtDisplay (w), XtWindow (w), + gray6_bits, + gray6_width, gray6_height); + dw->dvi.gray[6] = XCreateBitmapFromData(XtDisplay (w), XtWindow (w), + gray7_bits, + gray7_width, gray7_height); + dw->dvi.gray[7] = XCreateBitmapFromData(XtDisplay (w), XtWindow (w), + gray8_bits, + gray8_width, gray8_height); + values.background = dw->dvi.background; + values.stipple = dw->dvi.gray[5]; + dw->dvi.fill_GC = XCreateGC (XtDisplay (w), XtWindow (w), + GCForeground|GCBackground|GCStipple, + &values); + + dw->dvi.fill_type = 9; + + if (dw->dvi.file) + OpenFile (dw); + ParseFontMap (dw); +} + +static void +Destroy(Widget w) +{ + DviWidget dw = (DviWidget) w; + + XFreeGC (XtDisplay (w), dw->dvi.normal_GC); + XFreeGC (XtDisplay (w), dw->dvi.fill_GC); + XFreePixmap (XtDisplay (w), dw->dvi.gray[0]); + XFreePixmap (XtDisplay (w), dw->dvi.gray[1]); + XFreePixmap (XtDisplay (w), dw->dvi.gray[2]); + XFreePixmap (XtDisplay (w), dw->dvi.gray[3]); + XFreePixmap (XtDisplay (w), dw->dvi.gray[4]); + XFreePixmap (XtDisplay (w), dw->dvi.gray[5]); + XFreePixmap (XtDisplay (w), dw->dvi.gray[6]); + XFreePixmap (XtDisplay (w), dw->dvi.gray[7]); + DestroyFontMap (dw->dvi.font_map); + DestroyFileMap (dw->dvi.file_map); + device_destroy (dw->dvi.device); +} + +/* + * Repaint the widget window + */ + +/* ARGSUSED */ +static void +Redisplay(Widget w, XEvent *event, Region region) +{ + DviWidget dw = (DviWidget) w; + XRectangle extents; + + XClipBox (region, &extents); + dw->dvi.extents.x1 = extents.x; + dw->dvi.extents.y1 = extents.y; + dw->dvi.extents.x2 = extents.x + extents.width; + dw->dvi.extents.y2 = extents.y + extents.height; + ShowDvi (dw); + + event = event; /* unused; suppress compiler warning */ +} + +/* + * Set specified arguments into widget + */ +/* ARGSUSED */ +static Boolean +SetValues (Widget wcurrent, Widget wrequest, Widget wnew, + ArgList args, Cardinal *num_args) +{ + Boolean redisplay = FALSE; + char *new_map; + int cur, req; + DviWidget current = (DviWidget)wcurrent; + DviWidget request = (DviWidget)wrequest; + DviWidget new_wd = (DviWidget)wnew; + + if (current->dvi.font_map_string != request->dvi.font_map_string) { + new_map = XtMalloc (strlen (request->dvi.font_map_string) + 1); + if (new_map) { + redisplay = TRUE; + strcpy (new_map, request->dvi.font_map_string); + new_wd->dvi.font_map_string = new_map; + if (current->dvi.font_map_string) + XtFree (current->dvi.font_map_string); + current->dvi.font_map_string = 0; + ParseFontMap (new_wd); + } + } + + req = request->dvi.requested_page; + cur = current->dvi.requested_page; + if (cur != req) { + if (!request->dvi.file) + req = 0; + else { + if (req < 1) + req = 1; + if (current->dvi.last_page != 0 && + req > current->dvi.last_page) + req = current->dvi.last_page; + } + if (cur != req) + redisplay = TRUE; + new_wd->dvi.requested_page = req; + if (current->dvi.last_page == 0 && req > cur) + FindPage (new_wd); + } + + args = args; /* unused; suppress compiler warning */ + num_args = num_args; + + return redisplay; +} + +/* + * use the set_values_hook entry to check when + * the file is set + */ + +static Boolean +SetValuesHook (Widget wdw, ArgList args, Cardinal *num_argsp) +{ + Cardinal i; + DviWidget dw = (DviWidget)wdw; + + for (i = 0; i < *num_argsp; i++) { + if (!strcmp (args[i].name, XtNfile)) { + CloseFile (dw); + OpenFile (dw); + return TRUE; + } + } + return FALSE; +} + +static void CloseFile (DviWidget dw) +{ + if (dw->dvi.tmpFile) + fclose (dw->dvi.tmpFile); + ForgetPagePositions (dw); +} + +static void OpenFile (DviWidget dw) +{ + dw->dvi.tmpFile = 0; + if (!dw->dvi.seek) + dw->dvi.tmpFile = tmpfile(); + dw->dvi.requested_page = 1; + dw->dvi.last_page = 0; +} + +static XtGeometryResult +QueryGeometry (Widget w, XtWidgetGeometry *request, + XtWidgetGeometry *geometry_return) +{ + XtGeometryResult ret; + DviWidget dw = (DviWidget) w; + + ret = XtGeometryYes; + if (((request->request_mode & CWWidth) + && request->width < MY_WIDTH(dw)) + || ((request->request_mode & CWHeight) + && request->height < MY_HEIGHT(dw))) + ret = XtGeometryAlmost; + geometry_return->width = MY_WIDTH(dw); + geometry_return->height = MY_HEIGHT(dw); + geometry_return->request_mode = CWWidth|CWHeight; + return ret; +} + +void +SetDevice (DviWidget dw, const char *name) +{ + XtWidgetGeometry request, reply; + XtGeometryResult ret; + + ForgetFonts (dw); + dw->dvi.device = device_load (name); + if (!dw->dvi.device) + return; + dw->dvi.sizescale = dw->dvi.device->sizescale; + dw->dvi.device_resolution = dw->dvi.device->res; + dw->dvi.native = dw->dvi.device->X11; + dw->dvi.paperlength = dw->dvi.device->paperlength; + dw->dvi.paperwidth = dw->dvi.device->paperwidth; + if (dw->dvi.native) { + dw->dvi.display_resolution = dw->dvi.device_resolution; + dw->dvi.scale_factor = 1.0; + } + else { + dw->dvi.display_resolution = dw->dvi.default_resolution; + dw->dvi.scale_factor = ((double)dw->dvi.display_resolution + / dw->dvi.device_resolution); + } + request.request_mode = CWWidth|CWHeight; + request.width = MY_WIDTH(dw); + request.height = MY_HEIGHT(dw); + ret = XtMakeGeometryRequest ((Widget)dw, &request, &reply); + if (ret == XtGeometryAlmost + && reply.height >= request.height + && reply.width >= request.width) { + request.width = reply.width; + request.height = reply.height; + XtMakeGeometryRequest ((Widget)dw, &request, &reply); + } +} + +static void +ShowDvi (DviWidget dw) +{ + if (!dw->dvi.file) { + static char Error[] = "No file selected"; + + XSetFont (XtDisplay(dw), dw->dvi.normal_GC, + dw->dvi.default_font->fid); + XDrawString (XtDisplay (dw), XtWindow (dw), dw->dvi.normal_GC, + 20, 20, Error, strlen (Error)); + return; + } + + FindPage (dw); + + dw->dvi.display_enable = 1; + ParseInput (dw); + if (dw->dvi.last_page && dw->dvi.requested_page > dw->dvi.last_page) + dw->dvi.requested_page = dw->dvi.last_page; +} + +static void +FindPage (DviWidget dw) +{ + int i; + long file_position; + + if (dw->dvi.requested_page < 1) + dw->dvi.requested_page = 1; + + if (dw->dvi.last_page != 0 && dw->dvi.requested_page > dw->dvi.last_page) + dw->dvi.requested_page = dw->dvi.last_page; + + file_position = SearchPagePosition (dw, dw->dvi.requested_page); + if (file_position != -1) { + FileSeek(dw, file_position); + dw->dvi.current_page = dw->dvi.requested_page; + } else { + for (i=dw->dvi.requested_page; i > 0; i--) { + file_position = SearchPagePosition (dw, i); + if (file_position != -1) + break; + } + if (file_position == -1) + file_position = 0; + FileSeek (dw, file_position); + + dw->dvi.current_page = i; + + dw->dvi.display_enable = 0; + while (dw->dvi.current_page != dw->dvi.requested_page) { + dw->dvi.current_page = ParseInput (dw); + /* + * at EOF, seek back to the beginning of this page. + */ + if (!dw->dvi.readingTmp && feof (dw->dvi.file)) { + file_position = SearchPagePosition (dw, + dw->dvi.current_page); + if (file_position != -1) + FileSeek (dw, file_position); + dw->dvi.requested_page = dw->dvi.current_page; + break; + } + } + } +} + +void DviSaveToFile(Widget w, FILE *fp) +{ + XtCheckSubclass(w, dviWidgetClass, NULL); + (*((DviWidgetClass) XtClass(w))->command_class.save)(w, fp); +} + +static +void SaveToFile(Widget w, FILE *fp) +{ + DviWidget dw = (DviWidget)w; + long pos; + int c; + + if (dw->dvi.tmpFile) { + pos = ftell(dw->dvi.tmpFile); + if (dw->dvi.ungot) { + pos--; + dw->dvi.ungot = 0; + /* The ungot character is in the tmpFile, so we don't + want to read it from file. */ + (void)getc(dw->dvi.file); + } + } + else + pos = ftell(dw->dvi.file); + FileSeek(dw, 0L); + while (DviGetC(dw, &c) != EOF) + if (putc(c, fp) == EOF) { + /* XXX print error message */ + break; + } + FileSeek(dw, pos); +} + +static +void ClassPartInitialize(WidgetClass widget_class) +{ + DviWidgetClass wc = (DviWidgetClass)widget_class; + DviWidgetClass super = (DviWidgetClass) wc->core_class.superclass; + if (wc->command_class.save == InheritSaveToFile) + wc->command_class.save = super->command_class.save; +} + +/* +Local Variables: +c-indent-level: 8 +c-continued-statement-offset: 8 +c-brace-offset: -8 +c-argdecl-indent: 8 +c-label-offset: -8 +c-tab-always-indent: nil +End: +*/ diff -ruN groff-1.19.1/src/devices/xditview/Dvi.h groff-1.19.2/src/devices/xditview/Dvi.h --- groff-1.19.1/src/devices/xditview/Dvi.h 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/devices/xditview/Dvi.h 2004-06-01 12:39:54.000000000 +0200 @@ -0,0 +1,46 @@ +/* +* $XConsortium: Dvi.h,v 1.4 89/07/21 14:22:06 jim Exp $ +*/ + +#ifndef _XtDvi_h +#define _XtDvi_h + +/*********************************************************************** + * + * Dvi Widget + * + ***********************************************************************/ + +/* Parameters: + + Name Class RepType Default Value + ---- ----- ------- ------------- + background Background pixel White + foreground Foreground Pixel Black + fontMap FontMap char * ... + pageNumber PageNumber int 1 +*/ + +#define XtNfontMap (String)"fontMap" +#define XtNpageNumber (String)"pageNumber" +#define XtNlastPageNumber (String)"lastPageNumber" +#define XtNnoPolyText (String)"noPolyText" +#define XtNseek (String)"seek" +#define XtNresolution (String)"resolution" + +#define XtCFontMap (String)"FontMap" +#define XtCPageNumber (String)"PageNumber" +#define XtCLastPageNumber (String)"LastPageNumber" +#define XtCNoPolyText (String)"NoPolyText" +#define XtCSeek (String)"Seek" +#define XtCResolution (String)"Resolution" + +typedef struct _DviRec *DviWidget; /* completely defined in DviP.h */ +typedef struct _DviClassRec *DviWidgetClass; /* completely defined in DviP.h */ + +extern WidgetClass dviWidgetClass; + +void DviSaveToFile(Widget, FILE *); + +#endif /* _XtDvi_h */ +/* DON'T ADD STUFF AFTER THIS #endif */ diff -ruN groff-1.19.1/src/devices/xditview/DviP.h groff-1.19.2/src/devices/xditview/DviP.h --- groff-1.19.1/src/devices/xditview/DviP.h 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/devices/xditview/DviP.h 2004-06-01 12:39:54.000000000 +0200 @@ -0,0 +1,233 @@ +/* + * $XConsortium: DviP.h,v 1.5 89/07/22 19:44:08 keith Exp $ + */ + +/* + * DviP.h - Private definitions for Dvi widget + */ + +#ifndef _XtDviP_h +#define _XtDviP_h + +#include "Dvi.h" +#include "DviChar.h" +#include "device.h" + +/*********************************************************************** + * + * Dvi Widget Private Data + * + ***********************************************************************/ + +/************************************ + * + * Class structure + * + ***********************************/ + +/* Type for save method. */ + +typedef void (*DviSaveProc)(Widget, FILE *); + +/* + * New fields for the Dvi widget class record + */ + + +typedef struct _DviClass { + DviSaveProc save; +} DviClassPart; + +/* + * Full class record declaration + */ + +typedef struct _DviClassRec { + CoreClassPart core_class; + DviClassPart command_class; +} DviClassRec; + +extern DviClassRec dviClassRec; + +/*************************************** + * + * Instance (widget) structure + * + **************************************/ + +/* + * a list of fonts we've used for this widget + */ + +typedef struct _dviFontSizeList { + struct _dviFontSizeList *next; + int size; + char *x_name; + XFontStruct *font; + int doesnt_exist; +} DviFontSizeList; + +typedef struct _dviFontList { + struct _dviFontList *next; + char *dvi_name; + char *x_name; + int dvi_number; + Boolean initialized; + Boolean scalable; + DviFontSizeList *sizes; + DviCharNameMap *char_map; + DeviceFont *device_font; +} DviFontList; + +typedef struct _dviFontMap { + struct _dviFontMap *next; + char *dvi_name; + char *x_name; +} DviFontMap; + +#define DVI_TEXT_CACHE_SIZE 256 +#define DVI_CHAR_CACHE_SIZE 1024 + +typedef struct _dviCharCache { + XTextItem cache[DVI_TEXT_CACHE_SIZE]; + char adjustable[DVI_TEXT_CACHE_SIZE]; + char char_cache[DVI_CHAR_CACHE_SIZE]; + int index; + int max; + int char_index; + int font_size; + int font_number; + XFontStruct *font; + int start_x, start_y; + int x, y; +} DviCharCache; + +typedef struct _dviState { + struct _dviState *next; + int font_size; + int font_number; + int x; + int y; +} DviState; + +typedef struct _dviFileMap { + struct _dviFileMap *next; + long position; + int page_number; +} DviFileMap; + +/* + * New fields for the Dvi widget record + */ + +typedef struct { + /* + * resource specifiable items + */ + char *font_map_string; + unsigned long foreground; + unsigned long background; + int requested_page; + int last_page; + XFontStruct *default_font; + FILE *file; + Boolean noPolyText; + Boolean seek; /* file is "seekable" */ + int default_resolution; + /* + * private state + */ + FILE *tmpFile; /* used when reading stdin */ + char readingTmp; /* reading now from tmp */ + char ungot; /* have ungetc'd a char */ + GC normal_GC; + GC fill_GC; + DviFileMap *file_map; + DviFontList *fonts; + DviFontMap *font_map; + int current_page; + int font_size; + int font_number; + DeviceFont *device_font; + int device_font_number; + Device *device; + int native; + int device_resolution; + int display_resolution; + int paperlength; + int paperwidth; + double scale_factor; /* display res / device res */ + int sizescale; + int line_thickness; + int line_width; + +#define DVI_FILL_MAX 1000 + + int fill; +#define DVI_FILL_WHITE 0 +#define DVI_FILL_GRAY 1 +#define DVI_FILL_BLACK 2 + int fill_type; + Pixmap gray[8]; + int backing_store; + XFontStruct *font; + int display_enable; + struct ExposedExtents { + int x1, y1, x2, y2; + } extents; + DviState *state; + DviCharCache cache; + int text_x_width; + int text_device_width; + int word_flag; +} DviPart; + +int DviGetAndPut(DviWidget, int *); +#define DviGetIn(dw,cp)\ + (dw->dvi.tmpFile ? (\ + DviGetAndPut (dw, cp) \ + ) :\ + (*cp = getc (dw->dvi.file))\ +) + +#define DviGetC(dw, cp)\ + (dw->dvi.readingTmp ? (\ + ((*cp = getc (dw->dvi.tmpFile)) == EOF) ? (\ + fseek (dw->dvi.tmpFile, 0l, 2),\ + (dw->dvi.readingTmp = 0),\ + DviGetIn (dw,cp)\ + ) : (\ + *cp\ + )\ + ) : (\ + DviGetIn(dw,cp)\ + )\ +) + +#define DviUngetC(dw, c)\ + (dw->dvi.readingTmp ? (\ + ungetc (c, dw->dvi.tmpFile)\ + ) : ( \ + (dw->dvi.ungot = 1),\ + ungetc (c, dw->dvi.file))) + +/* + * Full widget declaration + */ + +typedef struct _DviRec { + CorePart core; + DviPart dvi; +} DviRec; + +#define InheritSaveToFile ((DviSaveProc)_XtInherit) + +XFontStruct *QueryFont (DviWidget, int, int); + +DviCharNameMap *QueryFontMap (DviWidget, int); + +DeviceFont *QueryDeviceFont (DviWidget, int); + +char *GetWord(DviWidget, char *, int); +char *GetLine(DviWidget, char *, int); +#endif /* _XtDviP_h */ diff -ruN groff-1.19.1/src/devices/xditview/font.c groff-1.19.2/src/devices/xditview/font.c --- groff-1.19.1/src/devices/xditview/font.c 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/devices/xditview/font.c 2004-06-01 12:39:55.000000000 +0200 @@ -0,0 +1,442 @@ +/* + * font.c + * + * map dvi fonts to X fonts + */ + +#include +#include +#include +#include +#include +#include +#include "DviP.h" +#include "XFontName.h" + +static void DisposeFontSizes(DviWidget, DviFontSizeList *); +void DestroyFontMap(DviFontMap *); + +static char * +savestr (const char *s) +{ + char *n; + + if (!s) + return 0; + n = XtMalloc (strlen (s) + 1); + if (n) + strcpy (n, s); + return n; +} + +static DviFontList * +LookupFontByPosition (DviWidget dw, int position) +{ + DviFontList *f; + + for (f = dw->dvi.fonts; f; f = f->next) + if (f->dvi_number == position) + break; + return f; +} + +int +MaxFontPosition (DviWidget dw) +{ + DviFontList *f; + int n = -1; + + for (f = dw->dvi.fonts; f; f = f->next) + if (f->dvi_number > n) + n = f->dvi_number; + return n; +} + +static DviFontSizeList * +LookupFontSizeBySize (DviWidget dw, DviFontList *f, int size) +{ + DviFontSizeList *fs, *best = 0, *smallest = 0; + int bestsize = 0; + XFontName fontName; + unsigned int fontNameAttributes; + char fontNameString[2048]; + int decipointsize; + + if (f->scalable) { + decipointsize = (10*size)/dw->dvi.sizescale; + for (best = f->sizes; best; best = best->next) + if (best->size == decipointsize) + return best; + best = (DviFontSizeList *) XtMalloc(sizeof *best); + best->next = f->sizes; + best->size = decipointsize; + f->sizes = best; + XParseFontName (f->x_name, &fontName, &fontNameAttributes); + fontNameAttributes &= ~(FontNamePixelSize|FontNameAverageWidth); + fontNameAttributes |= FontNameResolutionX; + fontNameAttributes |= FontNameResolutionY; + fontNameAttributes |= FontNamePointSize; + fontName.ResolutionX = dw->dvi.display_resolution; + fontName.ResolutionY = dw->dvi.display_resolution; + fontName.PointSize = decipointsize; + XFormatFontName (&fontName, fontNameAttributes, fontNameString); + best->x_name = savestr (fontNameString); + best->doesnt_exist = 0; + best->font = 0; + return best; + } + for (fs = f->sizes; fs; fs=fs->next) { + if (dw->dvi.sizescale*fs->size <= 10*size + && fs->size >= bestsize) { + best = fs; + bestsize = fs->size; + } + if (smallest == 0 || fs->size < smallest->size) + smallest = fs; + } + return best ? best : smallest; +} + +static char * +SkipFontNameElement (char *n) +{ + while (*n != '-') + if (!*++n) + return 0; + return n+1; +} + +# define SizePosition 8 +# define EncodingPosition 13 + +static int +ConvertFontNameToSize (char *n) +{ + int i, size; + + for (i = 0; i < SizePosition; i++) { + n = SkipFontNameElement (n); + if (!n) + return -1; + } + size = atoi (n); + return size; +} + +static char * +ConvertFontNameToEncoding (char *n) +{ + int i; + for (i = 0; i < EncodingPosition; i++) { + n = SkipFontNameElement (n); + if (!n) + return 0; + } + return n; +} + +DviFontSizeList * +InstallFontSizes (DviWidget dw, const char *x_name, Boolean *scalablep) +{ + char fontNameString[2048]; + char **fonts; + int i, count; + int size; + DviFontSizeList *sizes, *new_size; + XFontName fontName; + unsigned int fontNameAttributes; + + *scalablep = FALSE; + if (!XParseFontName ((XFontNameString)x_name, &fontName, + &fontNameAttributes)) + return 0; + fontNameAttributes &= ~(FontNamePixelSize|FontNamePointSize + |FontNameAverageWidth); + fontNameAttributes |= FontNameResolutionX; + fontNameAttributes |= FontNameResolutionY; + fontName.ResolutionX = dw->dvi.display_resolution; + fontName.ResolutionY = dw->dvi.display_resolution; + XFormatFontName (&fontName, fontNameAttributes, fontNameString); + fonts = XListFonts (XtDisplay (dw), fontNameString, 10000000, &count); + sizes = 0; + for (i = 0; i < count; i++) { + size = ConvertFontNameToSize (fonts[i]); + if (size == 0) { + DisposeFontSizes (dw, sizes); + sizes = 0; + *scalablep = TRUE; + break; + } + if (size != -1) { + new_size = (DviFontSizeList *) XtMalloc (sizeof *new_size); + new_size->next = sizes; + new_size->size = size; + new_size->x_name = savestr (fonts[i]); + new_size->doesnt_exist = 0; + new_size->font = 0; + sizes = new_size; + } + } + XFreeFontNames (fonts); + return sizes; +} + +static void +DisposeFontSizes (DviWidget dw, DviFontSizeList *fs) +{ + DviFontSizeList *next; + + for (; fs; fs=next) { + next = fs->next; + if (fs->x_name) + XtFree (fs->x_name); + if (fs->font && fs->font != dw->dvi.default_font) { + XUnloadFont (XtDisplay (dw), fs->font->fid); + XFree ((char *)fs->font); + } + XtFree ((char *) fs); + } +} + +static DviFontList * +InstallFont (DviWidget dw, int position, + const char *dvi_name, const char *x_name) +{ + DviFontList *f; + char *encoding; + + if ((f = LookupFontByPosition (dw, position)) != NULL) { + /* + * ignore gratuitous font loading + */ + if (!strcmp (f->dvi_name, dvi_name) && + !strcmp (f->x_name, x_name)) + return f; + + DisposeFontSizes (dw, f->sizes); + if (f->dvi_name) + XtFree (f->dvi_name); + if (f->x_name) + XtFree (f->x_name); + f->device_font = 0; + } else { + f = (DviFontList *) XtMalloc (sizeof (*f)); + f->next = dw->dvi.fonts; + dw->dvi.fonts = f; + } + f->initialized = FALSE; + f->dvi_name = savestr (dvi_name); + f->device_font = device_find_font (dw->dvi.device, dvi_name); + f->x_name = savestr (x_name); + f->dvi_number = position; + f->sizes = 0; + f->scalable = FALSE; + if (f->x_name) { + encoding = ConvertFontNameToEncoding (f->x_name); + f->char_map = DviFindMap (encoding); + } else + f->char_map = 0; + /* + * force requery of fonts + */ + dw->dvi.font = 0; + dw->dvi.font_number = -1; + dw->dvi.cache.font = 0; + dw->dvi.cache.font_number = -1; + dw->dvi.device_font = 0; + dw->dvi.device_font_number = -1; + return f; +} + +void +ForgetFonts (DviWidget dw) +{ + DviFontList *f = dw->dvi.fonts; + + while (f) { + DviFontList *tem = f; + + if (f->sizes) + DisposeFontSizes (dw, f->sizes); + if (f->dvi_name) + XtFree (f->dvi_name); + if (f->x_name) + XtFree (f->x_name); + f = f->next; + XtFree ((char *) tem); + } + + /* + * force requery of fonts + */ + dw->dvi.font = 0; + dw->dvi.font_number = -1; + dw->dvi.cache.font = 0; + dw->dvi.cache.font_number = -1; + dw->dvi.device_font = 0; + dw->dvi.device_font_number = -1; + dw->dvi.fonts = 0; +} + + +static char * +MapDviNameToXName (DviWidget dw, const char *dvi_name) +{ + DviFontMap *fm; + + for (fm = dw->dvi.font_map; fm; fm=fm->next) + if (!strcmp (fm->dvi_name, dvi_name)) + return fm->x_name; + return 0; +} + +#if 0 +static char * +MapXNameToDviName (DviWidget dw, const char *x_name) +{ + DviFontMap *fm; + + for (fm = dw->dvi.font_map; fm; fm=fm->next) + if (!strcmp (fm->x_name, x_name)) + return fm->dvi_name; + return 0; +} +#endif + +void +ParseFontMap (DviWidget dw) +{ + char dvi_name[1024]; + char x_name[2048]; + char *m, *s; + DviFontMap *fm, *new_map; + + if (dw->dvi.font_map) + DestroyFontMap (dw->dvi.font_map); + fm = 0; + m = dw->dvi.font_map_string; + while (*m) { + s = m; + while (*m && !isspace (*m)) + ++m; + strncpy (dvi_name, s, m-s); + dvi_name[m-s] = '\0'; + while (isspace (*m)) + ++m; + s = m; + while (*m && *m != '\n') + ++m; + strncpy (x_name, s, m-s); + x_name[m-s] = '\0'; + new_map = (DviFontMap *) XtMalloc (sizeof *new_map); + new_map->x_name = savestr (x_name); + new_map->dvi_name = savestr (dvi_name); + new_map->next = fm; + fm = new_map; + ++m; + } + dw->dvi.font_map = fm; +} + +void +DestroyFontMap (DviFontMap *font_map) +{ + DviFontMap *next; + + for (; font_map; font_map = next) { + next = font_map->next; + if (font_map->x_name) + XtFree (font_map->x_name); + if (font_map->dvi_name) + XtFree (font_map->dvi_name); + XtFree ((char *) font_map); + } +} + +/* ARGSUSED */ + +void +SetFontPosition (DviWidget dw, int position, + const char *dvi_name, const char *extra) +{ + char *x_name; + + x_name = MapDviNameToXName (dw, dvi_name); + if (x_name) + (void) InstallFont (dw, position, dvi_name, x_name); + + extra = extra; /* unused; suppress compiler warning */ +} + +XFontStruct * +QueryFont (DviWidget dw, int position, int size) +{ + DviFontList *f; + DviFontSizeList *fs; + + f = LookupFontByPosition (dw, position); + if (!f) + return dw->dvi.default_font; + if (!f->initialized) { + f->sizes = InstallFontSizes (dw, f->x_name, &f->scalable); + f->initialized = TRUE; + } + fs = LookupFontSizeBySize (dw, f, size); + if (!fs) + return dw->dvi.default_font; + if (!fs->font) { + if (fs->x_name) + fs->font = XLoadQueryFont (XtDisplay (dw), fs->x_name); + if (!fs->font) + fs->font = dw->dvi.default_font; + } + return fs->font; +} + +DeviceFont * +QueryDeviceFont (DviWidget dw, int position) +{ + DviFontList *f; + + f = LookupFontByPosition (dw, position); + if (!f) + return 0; + return f->device_font; +} + +DviCharNameMap * +QueryFontMap (DviWidget dw, int position) +{ + DviFontList *f; + + f = LookupFontByPosition (dw, position); + if (f) + return f->char_map; + else + return 0; +} + +#if 0 +LoadFont (DviWidget dw, int position, int size) +{ + XFontStruct *font; + + font = QueryFont (dw, position, size); + dw->dvi.font_number = position; + dw->dvi.font_size = size; + dw->dvi.font = font; + XSetFont (XtDisplay (dw), dw->dvi.normal_GC, font->fid); + return; +} +#endif + +/* +Local Variables: +c-indent-level: 8 +c-continued-statement-offset: 8 +c-brace-offset: -8 +c-argdecl-indent: 8 +c-label-offset: -8 +c-tab-always-indent: nil +End: +*/ diff -ruN groff-1.19.1/src/devices/xditview/FontMap groff-1.19.2/src/devices/xditview/FontMap --- groff-1.19.1/src/devices/xditview/FontMap 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/devices/xditview/FontMap 2004-06-01 12:39:54.000000000 +0200 @@ -0,0 +1,17 @@ +TR -adobe-times-medium-r-normal--*-*-*-*-p-*-iso8859-1 +TI -adobe-times-medium-i-normal--*-*-*-*-p-*-iso8859-1 +TB -adobe-times-bold-r-normal--*-*-*-*-p-*-iso8859-1 +TBI -adobe-times-bold-i-normal--*-*-*-*-p-*-iso8859-1 +CR -adobe-courier-medium-r-normal--*-*-*-*-m-*-iso8859-1 +CI -adobe-courier-medium-o-normal--*-*-*-*-m-*-iso8859-1 +CB -adobe-courier-bold-r-normal--*-*-*-*-m-*-iso8859-1 +CBI -adobe-courier-bold-o-normal--*-*-*-*-m-*-iso8859-1 +HR -adobe-helvetica-medium-r-normal--*-*-*-*-p-*-iso8859-1 +HI -adobe-helvetica-medium-o-normal--*-*-*-*-p-*-iso8859-1 +HB -adobe-helvetica-bold-r-normal--*-*-*-*-p-*-iso8859-1 +HBI -adobe-helvetica-bold-o-normal--*-*-*-*-p-*-iso8859-1 +NR -adobe-new century schoolbook-medium-r-normal--*-*-*-*-p-*-iso8859-1 +NI -adobe-new century schoolbook-medium-i-normal--*-*-*-*-p-*-iso8859-1 +NB -adobe-new century schoolbook-bold-r-normal--*-*-*-*-p-*-iso8859-1 +NBI -adobe-new century schoolbook-bold-i-normal--*-*-*-*-p-*-iso8859-1 +S -adobe-symbol-medium-r-normal--*-*-*-*-p-*-adobe-fontspecific diff -ruN groff-1.19.1/src/devices/xditview/gray1.bm groff-1.19.2/src/devices/xditview/gray1.bm --- groff-1.19.1/src/devices/xditview/gray1.bm 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/devices/xditview/gray1.bm 2004-06-01 12:39:54.000000000 +0200 @@ -0,0 +1,4 @@ +#define gray1_width 3 +#define gray1_height 3 +static char gray1_bits[] = { + 0x00, 0x02, 0x00}; diff -ruN groff-1.19.1/src/devices/xditview/gray2.bm groff-1.19.2/src/devices/xditview/gray2.bm --- groff-1.19.1/src/devices/xditview/gray2.bm 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/devices/xditview/gray2.bm 2004-06-01 12:39:54.000000000 +0200 @@ -0,0 +1,4 @@ +#define gray2_width 3 +#define gray2_height 3 +static char gray2_bits[] = { + 0x00, 0x03, 0x00}; diff -ruN groff-1.19.1/src/devices/xditview/gray3.bm groff-1.19.2/src/devices/xditview/gray3.bm --- groff-1.19.1/src/devices/xditview/gray3.bm 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/devices/xditview/gray3.bm 2004-06-01 12:39:55.000000000 +0200 @@ -0,0 +1,4 @@ +#define gray3_width 3 +#define gray3_height 3 +static char gray3_bits[] = { + 0x00, 0x03, 0x02}; diff -ruN groff-1.19.1/src/devices/xditview/gray4.bm groff-1.19.2/src/devices/xditview/gray4.bm --- groff-1.19.1/src/devices/xditview/gray4.bm 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/devices/xditview/gray4.bm 2004-06-01 12:39:55.000000000 +0200 @@ -0,0 +1,4 @@ +#define gray4_width 3 +#define gray4_height 3 +static char gray4_bits[] = { + 0x00, 0x07, 0x02}; diff -ruN groff-1.19.1/src/devices/xditview/gray5.bm groff-1.19.2/src/devices/xditview/gray5.bm --- groff-1.19.1/src/devices/xditview/gray5.bm 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/devices/xditview/gray5.bm 2004-06-01 12:39:55.000000000 +0200 @@ -0,0 +1,4 @@ +#define gray5_width 3 +#define gray5_height 3 +static char gray5_bits[] = { + 0x04, 0x07, 0x02}; diff -ruN groff-1.19.1/src/devices/xditview/gray6.bm groff-1.19.2/src/devices/xditview/gray6.bm --- groff-1.19.1/src/devices/xditview/gray6.bm 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/devices/xditview/gray6.bm 2004-06-01 12:39:55.000000000 +0200 @@ -0,0 +1,4 @@ +#define gray6_width 3 +#define gray6_height 3 +static char gray6_bits[] = { + 0x04, 0x07, 0x03}; diff -ruN groff-1.19.1/src/devices/xditview/gray7.bm groff-1.19.2/src/devices/xditview/gray7.bm --- groff-1.19.1/src/devices/xditview/gray7.bm 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/devices/xditview/gray7.bm 2004-06-01 12:39:55.000000000 +0200 @@ -0,0 +1,4 @@ +#define gray7_width 3 +#define gray7_height 3 +static char gray7_bits[] = { + 0x05, 0x07, 0x03}; diff -ruN groff-1.19.1/src/devices/xditview/gray8.bm groff-1.19.2/src/devices/xditview/gray8.bm --- groff-1.19.1/src/devices/xditview/gray8.bm 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/devices/xditview/gray8.bm 2004-06-01 12:39:55.000000000 +0200 @@ -0,0 +1,4 @@ +#define gray8_width 3 +#define gray8_height 3 +static char gray8_bits[] = { + 0x05, 0x07, 0x07}; diff -ruN groff-1.19.1/src/devices/xditview/GXditview.ad groff-1.19.2/src/devices/xditview/GXditview.ad --- groff-1.19.1/src/devices/xditview/GXditview.ad 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/devices/xditview/GXditview.ad 2004-06-01 12:39:54.000000000 +0200 @@ -0,0 +1,57 @@ +GXditview.height: 840 + +GXditview.paned.allowResize: true +GXditview.paned.viewport.allowVert: true +GXditview.paned.viewport.allowHoriz: true +GXditview.paned.viewport.skipAdjust: false +GXditview.paned.viewport.width: 600 +GXditview.paned.viewport.height: 800 +GXditview.paned.viewport.showGrip: false +GXditview.paned.label.skipAdjust: true + +GXditview.paned.viewport.dvi.translations: #augment \ + : XawPositionSimpleMenu(menu) MenuPopup(menu)\n\ + Next: NextPage()\n\ + n: NextPage()\n\ + space: NextPage()\n\ + Return: NextPage()\n\ + Prior: PreviousPage()\n\ + p: PreviousPage()\n\ + BackSpace: PreviousPage()\n\ + Delete: PreviousPage()\n\ + Select: SelectPage()\n\ + Find: OpenFile()\n\ + r: Rerasterize()\n\ + q: Quit() +GXditview.paned.label.translations: #augment \ + : XawPositionSimpleMenu(menu) MenuPopup(menu)\n\ + Next: NextPage()\n\ + n: NextPage()\n\ + space: NextPage()\n\ + Return: NextPage()\n\ + Prior: PreviousPage()\n\ + p: PreviousPage()\n\ + BackSpace: PreviousPage()\n\ + Delete: PreviousPage()\n\ + Select: SelectPage()\n\ + Find: OpenFile()\n\ + r: Rerasterize()\n\ + q: Quit() +GXditview.menu.nextPage.label: Next Page +GXditview.menu.previousPage.label: Previous Page +GXditview.menu.selectPage.label: Select Page +GXditview.menu.print.label: Print +GXditview.menu.openFile.label: Open +GXditview.menu.quit.label: Quit + +GXditview.promptShell.allowShellResize: true +GXditview.promptShell.promptDialog.value.translations: #override \ + Return: Accept() + +GXditview.promptShell.promptDialog.accept.label: Accept +GXditview.promptShell.promptDialog.accept.translations: #override \ + : Accept() unset() + +GXditview.promptShell.promptDialog.cancel.label: Cancel +GXditview.promptShell.promptDialog.cancel.translations: #override \ + : Cancel() unset() diff -ruN groff-1.19.1/src/devices/xditview/gxditview.man groff-1.19.2/src/devices/xditview/gxditview.man --- groff-1.19.1/src/devices/xditview/gxditview.man 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/devices/xditview/gxditview.man 2005-07-03 13:31:54.000000000 +0200 @@ -0,0 +1,410 @@ +.TH GXDITVIEW @MAN1EXT@ "@MDATE@" "Groff Version @VERSION@" +. +. +.SH NAME +gxditview \- display groff intermediate output files +. +. +.SH SYNOPSIS +.B \%gxditview +.RI [\fB\- toolkitoption\ .\|.\|.\|] +.RI [\fB\- option\ .\|.\|.\|] +.RI [ filename ] +. +. +.SH DESCRIPTION +The +.B \%gxditview +program displays the +.I groff intermediate +.IR output , +see +.BR groff_out (@MAN5EXT@), +on an X\~display. +. +It uses the standard X11 fonts, so it does not require access to the +server machine for font loading. +. +There are several ways to use +.BR \%gxditview . +. +. +.PP +The +.I groff intermediate output +can be generated by +.BR groff\~\-Z . +This can be viewed by explicity calling +.B \%gxditview +.IR \%filename . +If +.I filename +is +.BR \- , +.B \%gxditview +will read the standard input; +.I \%filename +cannot be omitted. +. +The +.I groff intermediate output +is different for all devices. +. +.B \%gxditview +can view it for all devices, but the quality is not always good. +. +. +.PP +The best result is achieved with the +.BR X * +devices for +.BR groff 's +option +.BR \-T . +. +There are four +.BR X * +devices: +.BR \%\-TX75 , +.BR \%\-TX75\-12 , +.BR \%\-TX100 , +.BR \%\-TX100\-12 . +They differ by the X\~resolution (75dpi or 100dpi) and the used base font +size (10pt or 12pt). +. +They are especially built for +.BR \%gxditview . +When using one of them +.B groff +generates the +.I intermediate output +for this device and calls +.B \%gxditview +automatically for viewing. +. +. +.PP +.BR groff 's +option +.B \-X +should be considered obsolete today; it produces +.I intermediate output +for +.I Postscript +and uses +.B \%gxditview +as a viewer for it, but with a bad quality. +. +Simply don't use it. +. +. +.PP +During the run of +.BR \%gxditview , +the left mouse button brings up a menu with the following entries: +. +.TP 8 +.B "Next Page" +Display the next page. +. +.TP +.B "Previous Page" +Display the previous page. +. +.TP +.B "Select Page" +Select a particular numbered page specified by a dialog box. +. +.TP +.B Print +Print the +.I groff intermediate output +using a command specified by a dialog box. +. +The default command initially displayed is controlled by the +.B printCommand +application resource, and by the +.B \-printCommand +option. +. +.TP +.B Open +Open for display a new file specified by a dialog box. +. +The file should contain some +.I groff intermediate +.IR output . +If the filename starts with +.B | +it will be taken to be a command to read from. +. +.TP +.B Quit +Exit from +.BR \%gxditview . +. +. +.PP +The +.IR n , +.I Space +and +.I Return +keys are bound to the +.B Next\ Page +action. +. +The +.IR p , +.I BackSpace +and +.I Delete +keys are bound to the +.B Previous\ Page +action. +. +The +.I q +key is bound to the +.B Quit +action. +. +The +.I r +key is bound to the +.B Rerasterize +action which rereads the current file, and redisplays the current +page; if the current file is a command, the command will be +reexecuted. +. +. +.PP +The +.B paperlength +and +.B paperwidth +commands in the DESC file specify the length and width in machine units +of the virtual page displayed by +.BR \%gxditview . +. +. +.SH OPTIONS +The +.B \%gxditview +program accepts all of the standard X\~Toolkit command line options +along with the additional options listed below: +. +.TP 8 +.B \-help +This option indicates that a brief summary of the allowed options should be +printed. +. +.TP +.B \-page +This option specifies the page number of the document to be displayed. +. +.TP +.BI \-backingStore\ backing-store-type +Redisplay of the +.I groff intermediate output +window can take up to a second or so, this option causes the server to +save the window contents so that when it is scrolled around the +viewport, the window is painted from contents saved in backing store. +.I backing-store-type +can be one of +.BR Always , +.B WhenMapped +or +.BR NotUseful . +. +.TP +.BI \-printCommand\ command +The default command displayed in the dialog box for the +.B Print +menu entry will be +.IR command . +. +.TP +.BI \-resolution\ res +The +.I groff intermediate output +file will be displayed at a resolution of +.I res +dpi, unless the DESC file contains the +.B X11 +command, in which case the device resolution will be used. +. +This corresponds to the +.I Dvi +widget's +.B resolution +resource. +. +The default is 75. +. +.TP +.BI \-filename\ string +The default filename displayed in the dialog box for the +.B Open +menu entry will be +.IR string . +This can be either a filename, or a command starting with +.BR | . +. +. +.PP +The following standard X\~Toolkit command line arguments are commonly used +with +.BR \%gxditview : +. +.TP 8 +.BI \-bg\ color +This option specifies the color to use for the background of the window. +. +The default is \fIwhite\fP. +. +.TP +.BI \-bd\ color +This option specifies the color to use for the border of the window. +. +The default is \fIblack\fP. +. +.TP +.BI \-bw\ number +This option specifies the width in pixels of the border surrounding the +window. +. +.TP +.BI \-fg\ color +This option specifies the color to use for displaying text. +. +The default is +\fIblack\fP. +. +.TP +.BI \-fn\ font +This option specifies the font to be used for displaying widget text. +. +The default is \fIfixed\fP. +. +.TP +.B \-rv +This option indicates that reverse video should be simulated by swapping +the foreground and background colors. +. +.TP +.BI \-geometry\ geometry +This option specifies the preferred size and position of the window. +. +.TP +.BI \-display\ host : display +This option specifies the X\~server to contact. +. +.TP +.BI \-xrm\ resourcestring +This option specifies a resource string to be used. +. +. +.SH X DEFAULTS +This program uses the +.I Dvi +widget in the X\~Toolkit. +. +It understands all of the core resource names and classes as well as: +. +.TP 8 +.BR width\ (class\ Width ) +Specifies the width of the window. +. +.TP +.BR height\ (class\ Height ) +Specifies the height of the window. +. +.TP +.BR foreground\ (class\ Foreground ) +Specifies the default foreground color. +. +.TP +.BR font\ (class\ Font ) +Specifies the font to be used for error messages. +. +.TP +.BR fontMap\ (class\ FontMap ) +Specifies the mapping from +.I groff +font names to X\~font names. +. +This must be a string containing a sequence of lines. +. +Each line contains two whitespace separated fields: first the +.I groff +font name, and secondly the X\~font name. +. +The default is +.nf +"\e +TR -adobe-times-medium-r-normal--*-100-*-*-*-*-iso8859-1\en\e +TI -adobe-times-medium-i-normal--*-100-*-*-*-*-iso8859-1\en\e +TB -adobe-times-bold-r-normal--*-100-*-*-*-*-iso8859-1\en\e +TBI -adobe-times-bold-i-normal--*-100-*-*-*-*-iso8859-1\en\e +CR -adobe-courier-medium-r-normal--*-100-*-*-*-*-iso8859-1\en\e +CI -adobe-courier-medium-o-normal--*-100-*-*-*-*-iso8859-1\en\e +CB -adobe-courier-bold-r-normal--*-100-*-*-*-*-iso8859-1\en\e +CBI -adobe-courier-bold-o-normal--*-100-*-*-*-*-iso8859-1\en\e +HR -adobe-helvetica-medium-r-normal--*-100-*-*-*-*-iso8859-1\en\e +HI -adobe-helvetica-medium-o-normal--*-100-*-*-*-*-iso8859-1\en\e +HB -adobe-helvetica-bold-r-normal--*-100-*-*-*-*-iso8859-1\en\e +HBI -adobe-helvetica-bold-o-normal--*-100-*-*-*-*-iso8859-1\en\e +NR -adobe-new century schoolbook-medium-r-normal--*-100-*-*-*-*-iso8859-1\en\e +NI -adobe-new century schoolbook-medium-i-normal--*-100-*-*-*-*-iso8859-1\en\e +NB -adobe-new century schoolbook-bold-r-normal--*-100-*-*-*-*-iso8859-1\en\e +NBI -adobe-new century schoolbook-bold-i-normal--*-100-*-*-*-*-iso8859-1\en\e +S -adobe-symbol-medium-r-normal--*-100-*-*-*-*-adobe-fontspecific\en\e +SS -adobe-symbol-medium-r-normal--*-100-*-*-*-*-adobe-fontspecific\en\e +" +.fi +. +. +.SH "SEE ALSO" +.BR X (1), +.BR xrdb (1), +.BR xditview (1), +.BR groff (@MAN1EXT@), +.BR groff_out (@MAN5EXT@) +. +. +.SH ORIGIN +This program is derived from +.BR \%xditview ; +portions of +.B \%xditview +originated in +.B \%xtroff +which was derived from +.BR \%suntroff . +. +. +.SH COPYRIGHT +Copyright 1989, Massachusetts Institute of Technology. +.br +See +.BR X (1) +for a full statement of rights and permissions. +. +. +.SH AUTHORS +Keith Packard (MIT X Consortium) +.br +Richard L. Hyde (Purdue) +.br +David Slattengren (Berkeley) +.br +Malcolm Slaney (Schlumberger Palo Alto Research) +.br +Mark Moraes (University of Toronto) +.br +James Clark +. +.\" Local Variables: +.\" mode: nroff +.\" End: diff -ruN groff-1.19.1/src/devices/xditview/lex.c groff-1.19.2/src/devices/xditview/lex.c --- groff-1.19.1/src/devices/xditview/lex.c 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/devices/xditview/lex.c 2004-06-01 12:39:55.000000000 +0200 @@ -0,0 +1,96 @@ +#include +#include +#include +#include +#include "DviP.h" + +int +DviGetAndPut(DviWidget dw, int *cp) +{ + if (dw->dvi.ungot) { + dw->dvi.ungot = 0; + *cp = getc (dw->dvi.file); + } + else { + *cp = getc (dw->dvi.file); + if (*cp != EOF) + putc (*cp, dw->dvi.tmpFile); + } + return *cp; +} + +char * +GetLine(DviWidget dw, char *Buffer, int Length) +{ + int i = 0, c; + + Length--; /* Save room for final '\0' */ + + while (DviGetC (dw, &c) != EOF) { + if (Buffer && i < Length) + Buffer[i++] = c; + if (c == '\n') { + DviUngetC(dw, c); + break; + } + } + if (Buffer) + Buffer[i] = '\0'; + return Buffer; +} + +char * +GetWord(DviWidget dw, char *Buffer, int Length) +{ + int i = 0, c; + + Length--; /* Save room for final '\0' */ + while (DviGetC(dw, &c) == ' ' || c == '\n') + ; + while (c != EOF) { + if (Buffer && i < Length) + Buffer[i++] = c; + if (DviGetC(dw, &c) == ' ' || c == '\n') { + DviUngetC(dw, c); + break; + } + } + if (Buffer) + Buffer[i] = '\0'; + return Buffer; +} + +int +GetNumber(DviWidget dw) +{ + int i = 0, c; + int negative = 0; + + while (DviGetC(dw, &c) == ' ' || c == '\n') + ; + if (c == '-') { + negative = 1; + DviGetC(dw, &c); + } + + for (; c >= '0' && c <= '9'; DviGetC(dw, &c)) { + if (negative) + i = i*10 - (c - '0'); + else + i = i*10 + c - '0'; + } + if (c != EOF) + DviUngetC(dw, c); + return i; +} + +/* +Local Variables: +c-indent-level: 8 +c-continued-statement-offset: 8 +c-brace-offset: -8 +c-argdecl-indent: 8 +c-label-offset: -8 +c-tab-always-indent: nil +End: +*/ diff -ruN groff-1.19.1/src/devices/xditview/Makefile.sub groff-1.19.2/src/devices/xditview/Makefile.sub --- groff-1.19.1/src/devices/xditview/Makefile.sub 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/devices/xditview/Makefile.sub 2004-11-25 08:17:00.000000000 +0100 @@ -0,0 +1,47 @@ +PROG=gxditview$(EXEEXT) +MAN1=gxditview.n +MLIB=$(LIBM) +XLIBS=$(LIBXUTIL) +EXTRA_CFLAGS=$(X_CFLAGS) +EXTRA_LDFLAGS=$(X_LIBS) $(X_PRE_LIBS) -lXaw -lXmu -lXt -lX11 $(X_EXTRA_LIBS) +OBJS=\ + device.$(OBJEXT) \ + draw.$(OBJEXT) \ + Dvi.$(OBJEXT) \ + font.$(OBJEXT) \ + lex.$(OBJEXT) \ + page.$(OBJEXT) \ + parse.$(OBJEXT) \ + xditview.$(OBJEXT) +CSRCS=\ + $(srcdir)/device.c \ + $(srcdir)/draw.c \ + $(srcdir)/Dvi.c \ + $(srcdir)/font.c \ + $(srcdir)/lex.c \ + $(srcdir)/page.c \ + $(srcdir)/parse.c \ + $(srcdir)/xditview.c +HDRS=\ + $(srcdir)/device.h \ + $(srcdir)/Dvi.h \ + $(srcdir)/DviP.h \ + $(srcdir)/Menu.h +GENHDRS=GXditview-ad.h + +all depend: $(GENHDRS) + +GXditview-ad.h: $(srcdir)/GXditview.ad + @echo Making $@ + @-rm -f $@ + $(SHELL) $(srcdir)/ad2c $(srcdir)/GXditview.ad >GXditview-ad.h + +install_data: $(srcdir)/GXditview.ad + -test -d $(appresdir) || $(mkinstalldirs) $(appresdir) + if test -f $(appresdir)/GXditview; then \ + mv $(appresdir)/GXditview $(appresdir)/GXditview.old; \ + fi + $(INSTALL_DATA) $(srcdir)/GXditview.ad $(appresdir)/GXditview + +uninstall_sub: + -rm -f $(appresdir)/GXditview diff -ruN groff-1.19.1/src/devices/xditview/Menu.h groff-1.19.2/src/devices/xditview/Menu.h --- groff-1.19.1/src/devices/xditview/Menu.h 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/devices/xditview/Menu.h 2004-06-01 12:39:54.000000000 +0200 @@ -0,0 +1,46 @@ +/* + * $XConsortium: Menu.h,v 1.2 89/07/21 14:22:10 jim Exp $ + */ + +#ifndef _XtMenu_h +#define _XtMenu_h + +/*********************************************************************** + * + * Menu Widget + * + ***********************************************************************/ + +/* Parameters: + + Name Class RepType Default Value + ---- ----- ------- ------------- + background Background pixel White + border BorderColor pixel Black + borderWidth BorderWidth int 1 + height Height int 120 + mappedWhenManaged MappedWhenManaged Boolean True + reverseVideo ReverseVideo Boolean False + width Width int 120 + x Position int 0 + y Position int 0 + +*/ + +#define XtNmenuEntries "menuEntries" +#define XtNhorizontalPadding "horizontalPadding" +#define XtNverticalPadding "verticalPadding" +#define XtNselection "Selection" + +#define XtCMenuEntries "MenuEntries" +#define XtCPadding "Padding" +#define XtCSelection "Selection" + +typedef struct _MenuRec *MenuWidget; /* completely defined in MenuPrivate.h */ +typedef struct _MenuClassRec *MenuWidgetClass; /* completely defined in MenuPrivate.h */ + +extern WidgetClass menuWidgetClass; + +extern Widget XawMenuCreate (); +#endif /* _XtMenu_h */ +/* DON'T ADD STUFF AFTER THIS #endif */ diff -ruN groff-1.19.1/src/devices/xditview/page.c groff-1.19.2/src/devices/xditview/page.c --- groff-1.19.1/src/devices/xditview/page.c 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/devices/xditview/page.c 2004-06-01 12:39:55.000000000 +0200 @@ -0,0 +1,82 @@ +/* + * page.c + * + * map page numbers to file position + */ + +#include +#include +#include +#include +#include +#include "DviP.h" + +#ifdef X_NOT_STDC_ENV +extern long ftell(); +#endif + +static DviFileMap * +MapPageNumberToFileMap (DviWidget dw, int number) +{ + DviFileMap *m; + + for (m = dw->dvi.file_map; m; m=m->next) + if (m->page_number == number) + break; + return m; +} + +void +DestroyFileMap (DviFileMap *m) +{ + DviFileMap *next; + + for (; m; m = next) { + next = m->next; + XtFree ((char *) m); + } +} + +void +ForgetPagePositions (DviWidget dw) +{ + DestroyFileMap (dw->dvi.file_map); + dw->dvi.file_map = 0; +} + +void +RememberPagePosition(DviWidget dw, int number) +{ + DviFileMap *m; + + if (!(m = MapPageNumberToFileMap (dw, number))) { + m = (DviFileMap *) XtMalloc (sizeof *m); + m->page_number = number; + m->next = dw->dvi.file_map; + dw->dvi.file_map = m; + } + if (dw->dvi.tmpFile) + m->position = ftell (dw->dvi.tmpFile); + else + m->position = ftell (dw->dvi.file); +} + +long +SearchPagePosition (DviWidget dw, int number) +{ + DviFileMap *m; + + if (!(m = MapPageNumberToFileMap (dw, number))) + return -1; + return m->position; +} + +void +FileSeek(DviWidget dw, long position) +{ + if (dw->dvi.tmpFile) { + dw->dvi.readingTmp = 1; + fseek (dw->dvi.tmpFile, position, 0); + } else + fseek (dw->dvi.file, position, 0); +} diff -ruN groff-1.19.1/src/devices/xditview/parse.c groff-1.19.2/src/devices/xditview/parse.c --- groff-1.19.1/src/devices/xditview/parse.c 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/devices/xditview/parse.c 2004-06-01 12:39:55.000000000 +0200 @@ -0,0 +1,366 @@ +/* + * parse.c + * + * parse dvi input + */ + +#include +#include +#include +#include +#include +#include "DviP.h" + +static int StopSeen = 0; +static void ParseDrawFunction(DviWidget, char *); +static void ParseDeviceControl(DviWidget); +static void push_env(DviWidget); +static void pop_env(DviWidget); + +/* draw.c */ +extern int PutCharacter(DviWidget, char *); +extern int PutNumberedCharacter(DviWidget, int); +extern void HorizontalGoto(DviWidget, int); +extern void Word(DviWidget); +extern void VerticalGoto(DviWidget, int); +extern void VerticalMove(DviWidget, int); +extern void FlushCharCache(DviWidget); +extern void Newline(DviWidget); +extern void DrawLine(DviWidget, int, int); +extern void DrawCircle(DviWidget, int); +extern void DrawFilledCircle(DviWidget, int); +extern void DrawEllipse(DviWidget, int, int); +extern void DrawFilledEllipse(DviWidget, int, int); +extern void DrawArc(DviWidget, int, int, int, int); +extern void DrawPolygon(DviWidget, int *, int); +extern void DrawFilledPolygon(DviWidget, int *, int); +extern void DrawSpline(DviWidget, int *, int); + +/* Dvi.c */ +extern void SetDevice(DviWidget, const char *); + +/* page.c */ +extern void RememberPagePosition(DviWidget, int); + +/* font.c */ +extern void SetFontPosition(DviWidget, int, const char *, const char *); + +/* lex.c */ +extern int GetNumber(DviWidget); + +#define HorizontalMove(dw, delta) ((dw)->dvi.state->x += (delta)) + + +int +ParseInput(register DviWidget dw) +{ + int n, k; + int c; + char Buffer[BUFSIZ]; + int NextPage; + int otherc; + + StopSeen = 0; + + /* + * make sure some state exists + */ + + if (!dw->dvi.state) + push_env (dw); + for (;;) { + switch (DviGetC(dw, &c)) { + case '\n': + break; + case ' ': /* when input is text */ + case 0: /* occasional noise creeps in */ + break; + case '{': /* push down current environment */ + push_env(dw); + break; + case '}': + pop_env(dw); + break; + /* + * two motion digits plus a character + */ + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + HorizontalMove(dw, (c-'0')*10 + + DviGetC(dw,&otherc)-'0'); + /* fall through */ + case 'c': /* single ascii character */ + DviGetC(dw,&c); + if (c == ' ') + break; + Buffer[0] = c; + Buffer[1] = '\0'; + (void) PutCharacter (dw, Buffer); + break; + case 'C': + GetWord (dw, Buffer, BUFSIZ); + (void) PutCharacter (dw, Buffer); + break; + case 't': + Buffer[1] = '\0'; + while (DviGetC (dw, &c) != EOF + && c != ' ' && c != '\n') { + Buffer[0] = c; + HorizontalMove (dw, PutCharacter (dw, Buffer)); + } + break; + case 'u': + n = GetNumber(dw); + Buffer[1] = '\0'; + while (DviGetC (dw, &c) == ' ') + ; + while (c != EOF && c != ' ' && c != '\n') { + Buffer[0] = c; + HorizontalMove (dw, + PutCharacter (dw, Buffer) + n); + DviGetC (dw, &c); + } + break; + + case 'D': /* draw function */ + (void) GetLine(dw, Buffer, BUFSIZ); + if (dw->dvi.display_enable) + ParseDrawFunction(dw, Buffer); + break; + case 's': /* ignore fractional sizes */ + n = GetNumber(dw); + dw->dvi.state->font_size = n; + break; + case 'f': + n = GetNumber(dw); + dw->dvi.state->font_number = n; + break; + case 'H': /* absolute horizontal motion */ + k = GetNumber(dw); + HorizontalGoto(dw, k); + break; + case 'h': /* relative horizontal motion */ + k = GetNumber(dw); + HorizontalMove(dw, k); + break; + case 'w': /* word space */ + Word (dw); + break; + case 'V': + n = GetNumber(dw); + VerticalGoto(dw, n); + break; + case 'v': + n = GetNumber(dw); + VerticalMove(dw, n); + break; + case 'P': /* new spread */ + break; + case 'p': /* new page */ + (void) GetNumber(dw); + NextPage = dw->dvi.current_page + 1; + RememberPagePosition(dw, NextPage); + FlushCharCache (dw); + return(NextPage); + case 'N': + n = GetNumber(dw); + PutNumberedCharacter (dw, n); + break; + case 'n': /* end of line */ + GetNumber(dw); + GetNumber(dw); + Newline (dw); + HorizontalGoto(dw, 0); + break; + case 'F': /* input files */ + case '+': /* continuation of X device control */ + case 'm': /* color */ + case '#': /* comment */ + GetLine(dw, NULL, 0); + break; + case 'x': /* device control */ + ParseDeviceControl(dw); + break; + case EOF: + dw->dvi.last_page = dw->dvi.current_page; + FlushCharCache (dw); + return dw->dvi.current_page; + default: + break; + } + } +} + +static void +push_env(DviWidget dw) +{ + DviState *new_state; + + new_state = (DviState *) XtMalloc (sizeof (*new_state)); + if (dw->dvi.state) + *new_state = *(dw->dvi.state); + else { + new_state->font_size = 10; + new_state->font_number = 1; + new_state->x = 0; + new_state->y = 0; + } + new_state->next = dw->dvi.state; + dw->dvi.state = new_state; +} + +static void +pop_env(DviWidget dw) +{ + DviState *old; + + old = dw->dvi.state; + dw->dvi.state = old->next; + XtFree ((char *) old); +} + +static void +InitTypesetter (DviWidget dw) +{ + while (dw->dvi.state) + pop_env (dw); + push_env (dw); + FlushCharCache (dw); +} + +#define DRAW_ARGS_MAX 128 + +static void +ParseDrawFunction(DviWidget dw, char *buf) +{ + int v[DRAW_ARGS_MAX]; + int i, no_move = 0; + char *ptr; + + v[0] = v[1] = v[2] = v[3] = 0; + + if (buf[0] == '\0') + return; + ptr = buf+1; + + for (i = 0; i < DRAW_ARGS_MAX; i++) { + if (sscanf(ptr, "%d", v + i) != 1) + break; + while (*ptr == ' ') + ptr++; + while (*ptr != '\0' && *ptr != ' ') + ptr++; + } + + switch (buf[0]) { + case 'l': /* draw a line */ + DrawLine(dw, v[0], v[1]); + break; + case 'c': /* circle */ + DrawCircle(dw, v[0]); + break; + case 'C': + DrawFilledCircle(dw, v[0]); + break; + case 'e': /* ellipse */ + DrawEllipse(dw, v[0], v[1]); + break; + case 'E': + DrawFilledEllipse(dw, v[0], v[1]); + break; + case 'a': /* arc */ + DrawArc(dw, v[0], v[1], v[2], v[3]); + break; + case 'p': + DrawPolygon(dw, v, i); + break; + case 'P': + DrawFilledPolygon(dw, v, i); + break; + case '~': /* wiggly line */ + DrawSpline(dw, v, i); + break; + case 't': + dw->dvi.line_thickness = v[0]; + break; + case 'f': + if (i > 0 && v[0] >= 0 && v[0] <= DVI_FILL_MAX) + dw->dvi.fill = v[0]; + no_move = 1; + break; + default: +#if 0 + warning("unknown drawing function %s", buf); +#endif + no_move = 1; + break; + } + + if (!no_move) { + if (buf[0] == 'e') { + if (i > 0) + dw->dvi.state->x += v[0]; + } + else { + while (--i >= 0) { + if (i & 1) + dw->dvi.state->y += v[i]; + else + dw->dvi.state->x += v[i]; + } + } + } +} + +static void +ParseDeviceControl(DviWidget dw) /* Parse the x commands */ +{ + char str[20], str1[50]; + int c, n; + + GetWord (dw, str, 20); + switch (str[0]) { /* crude for now */ + case 'T': /* output device */ + GetWord (dw, str, 20); + SetDevice (dw, str); + break; + case 'i': /* initialize */ + InitTypesetter (dw); + break; + case 't': /* trailer */ + break; + case 'p': /* pause -- can restart */ + break; + case 's': /* stop */ + StopSeen = 1; + return; + case 'r': /* resolution when prepared */ + break; + case 'f': /* font used */ + n = GetNumber (dw); + GetWord (dw, str, 20); + GetLine (dw, str1, 50); + SetFontPosition (dw, n, str, str1); + break; + case 'H': /* char height */ + break; + case 'S': /* slant */ + break; + } + while (DviGetC (dw, &c) != '\n') /* skip rest of input line */ + if (c == EOF) + return; + return; +} + + +/* +Local Variables: +c-indent-level: 8 +c-continued-statement-offset: 8 +c-brace-offset: -8 +c-argdecl-indent: 8 +c-label-offset: -8 +c-tab-always-indent: nil +End: +*/ diff -ruN groff-1.19.1/src/devices/xditview/README groff-1.19.2/src/devices/xditview/README --- groff-1.19.1/src/devices/xditview/README 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/devices/xditview/README 2004-11-24 20:36:23.000000000 +0100 @@ -0,0 +1,13 @@ +This is gxditview, an X11 previewer for groff based on MIT's xditview. +This version can be used with the output of gtroff -Tps as well as +with -TX75 and -TX100. You will need X11R5 or newer to install it (it +might work on X11R4, but I haven't tested it.) + +Previously, gxditview was installed in the usual place for X binaries +(e.g., /usr/bin/X11); you have to remove it manually. + +xditview is copyrighted by MIT under the usual X terms (see +gxditview.man); the changes to that which come along with the groff package +are in the public domain. + +Please report bugs to bug-groff@gnu.org. diff -ruN groff-1.19.1/src/devices/xditview/TODO groff-1.19.2/src/devices/xditview/TODO --- groff-1.19.1/src/devices/xditview/TODO 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/devices/xditview/TODO 2004-06-01 12:39:54.000000000 +0200 @@ -0,0 +1,17 @@ +Replace Imakefile with a configure script. + +Better error handling. + +Resource and command-line option to specify font path. + +Resource to specify name of environment variable from which to get the +font path. + +Have character substitutions (currently done in draw.c:FakeCharacter) +specified in a resource (similar format to FontMap). + +The initial width of the dialog box should expand to accommodate the +default value. + +Option in Print dialog to specify that only the current page should be +printed. diff -ruN groff-1.19.1/src/devices/xditview/xdit.bm groff-1.19.2/src/devices/xditview/xdit.bm --- groff-1.19.1/src/devices/xditview/xdit.bm 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/devices/xditview/xdit.bm 2004-06-01 12:39:55.000000000 +0200 @@ -0,0 +1,14 @@ +#define xdit_width 32 +#define xdit_height 32 +static unsigned char xdit_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x03, 0x02, 0x00, 0x00, 0x02, + 0x8a, 0xa2, 0xfc, 0x03, 0x52, 0x14, 0x03, 0x04, 0x02, 0x80, 0x00, 0x08, + 0x52, 0x54, 0x00, 0x10, 0x8a, 0x22, 0x8f, 0x23, 0x02, 0x20, 0x06, 0x21, + 0x8a, 0x12, 0x8c, 0x40, 0x52, 0x14, 0x8c, 0x40, 0x02, 0x10, 0x58, 0x40, + 0x52, 0x14, 0x30, 0x40, 0x8a, 0x12, 0x30, 0x40, 0x02, 0x10, 0x70, 0x40, + 0x8a, 0x12, 0xc8, 0x40, 0x52, 0x24, 0xc4, 0xe0, 0x02, 0x20, 0x84, 0xe1, + 0x52, 0x54, 0xce, 0xf3, 0x8a, 0xa2, 0x00, 0xf8, 0x02, 0x00, 0x03, 0xfc, + 0x8a, 0x22, 0xfc, 0xf3, 0x52, 0x14, 0x00, 0xc2, 0x02, 0x00, 0x00, 0x02, + 0x52, 0x14, 0x45, 0x02, 0x8a, 0xa2, 0x28, 0x02, 0x02, 0x00, 0x00, 0x02, + 0x02, 0x00, 0x00, 0x02, 0xfe, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff -ruN groff-1.19.1/src/devices/xditview/xdit_mask.bm groff-1.19.2/src/devices/xditview/xdit_mask.bm --- groff-1.19.1/src/devices/xditview/xdit_mask.bm 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/devices/xditview/xdit_mask.bm 2004-06-01 12:39:55.000000000 +0200 @@ -0,0 +1,14 @@ +#define xdit_mask_width 32 +#define xdit_mask_height 32 +static unsigned char xdit_mask_bits[] = { + 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0x07, + 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0x1f, + 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xc7, + 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0x07, + 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff -ruN groff-1.19.1/src/devices/xditview/xditview.c groff-1.19.2/src/devices/xditview/xditview.c --- groff-1.19.1/src/devices/xditview/xditview.c 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/devices/xditview/xditview.c 2004-06-01 12:39:55.000000000 +0200 @@ -0,0 +1,657 @@ +/* + * Copyright 1991 Massachusetts Institute of Technology + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of M.I.T. not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. M.I.T. makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T. + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + */ +/* + * xditview -- + * + * Display ditroff output in an X window + */ + +#ifndef SABER +#ifndef lint +static char rcsid[] = "$XConsortium: xditview.c,v 1.17 89/12/10 17:05:08 rws Exp $"; +#endif /* lint */ +#endif /* SABER */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "Dvi.h" + +#include "xdit.bm" +#include "xdit_mask.bm" + +#ifdef NEED_DECLARATION_POPEN +FILE *popen(const char *, const char *); +#endif /* NEED_DECLARATION_POPEN */ + +#ifdef NEED_DECLARATION_PCLOSE +int pclose (FILE *); +#endif /* NEED_DECLARATION_PCLOSE */ + +typedef void (*MakePromptFunc)(const char *); + +static String fallback_resources[] = { +#include "GXditview-ad.h" + NULL +}; + +static struct app_resources { + char *print_command; + char *filename; +} app_resources; + +#define offset(field) XtOffset(struct app_resources *, field) + +/* Application resources. */ + +static XtResource resources[] = { + {(String)"printCommand", (String)"PrintCommand", (String)XtRString, + sizeof(char*), offset(print_command), (String)XtRString, NULL}, + {(String)"filename", (String)"Filename", (String)XtRString, + sizeof(char*), offset(filename), (String)XtRString, NULL}, +}; + +#undef offset + +/* Command line options table. Only resources are entered here...there is a + pass over the remaining options after XtParseCommand is let loose. */ + +static XrmOptionDescRec options[] = { +{(char *)"-page", (char *)"*dvi.pageNumber", + XrmoptionSepArg, NULL}, +{(char *)"-backingStore", (char *)"*dvi.backingStore", + XrmoptionSepArg, NULL}, +{(char *)"-resolution", (char *)"*dvi.resolution", + XrmoptionSepArg, NULL}, +{(char *)"-printCommand", (char *)".printCommand", + XrmoptionSepArg, NULL}, +{(char *)"-filename", (char *)".filename", + XrmoptionSepArg, NULL}, +{(char *)"-noPolyText", (char *)"*dvi.noPolyText", + XrmoptionNoArg, (XPointer)"TRUE"}, +}; + +static char current_print_command[1024]; + +static char current_file_name[1024]; +static FILE *current_file; + +/* + * Report the syntax for calling xditview. + */ + +static void +Syntax(const char *call) +{ + (void) printf ("Usage: %s [-fg ] [-bg ]\n", call); + (void) printf (" [-bd ] [-bw ] [-help]\n"); + (void) printf (" [-display displayname] [-geometry geom]\n"); + (void) printf (" [-page ] [-backing ]\n"); + (void) printf (" [-resolution ] [-print ]\n"); + (void) printf (" [-filename ] [filename]\n\n"); + exit(1); +} + +static void NewFile (const char *); +static void SetPageNumber (int); +static Widget toplevel, paned, viewport, dvi; +static Widget page; +static Widget simpleMenu; + +static void NextPage(Widget, XtPointer, XtPointer); +static void PreviousPage(Widget, XtPointer, XtPointer); +static void SelectPage(Widget, XtPointer, XtPointer); +static void OpenFile(Widget, XtPointer, XtPointer); +static void Quit(Widget, XtPointer, XtPointer); +static void Print(Widget, XtPointer, XtPointer); + +static struct menuEntry { + const char *name; + XtCallbackProc function; +} menuEntries[] = { + {"nextPage", NextPage}, + {"previousPage", PreviousPage}, + {"selectPage", SelectPage}, + {"print", Print}, + {"openFile", OpenFile}, + {"quit", Quit}, +}; + +static void NextPageAction(Widget, XEvent *, String *, Cardinal *); +static void PreviousPageAction(Widget, XEvent *, String *, Cardinal *); +static void SelectPageAction(Widget, XEvent *, String *, Cardinal *); +static void OpenFileAction(Widget, XEvent *, String *, Cardinal *); +static void QuitAction(Widget, XEvent *, String *, Cardinal *); +static void AcceptAction(Widget, XEvent *, String *, Cardinal *); +static void CancelAction(Widget, XEvent *, String *, Cardinal *); +static void PrintAction(Widget, XEvent *, String *, Cardinal *); +static void RerasterizeAction(Widget, XEvent *, String *, Cardinal *); + +static void MakePrompt(Widget, const char *, MakePromptFunc, const char *); + +XtActionsRec xditview_actions[] = { + {(String)"NextPage", NextPageAction}, + {(String)"PreviousPage", PreviousPageAction}, + {(String)"SelectPage", SelectPageAction}, + {(String)"Print", PrintAction}, + {(String)"OpenFile", OpenFileAction}, + {(String)"Rerasterize", RerasterizeAction}, + {(String)"Quit", QuitAction}, + {(String)"Accept", AcceptAction}, + {(String)"Cancel", CancelAction}, +}; + +#define MenuNextPage 0 +#define MenuPreviousPage 1 +#define MenuSelectPage 2 +#define MenuPrint 3 +#define MenuOpenFile 4 +#define MenuQuit 5 + +static char pageLabel[256] = "Page "; + +int main(int argc, char **argv) +{ + char *file_name = 0; + Cardinal i; + static Arg labelArgs[] = { + {XtNlabel, (XtArgVal) pageLabel}, + }; + XtAppContext xtcontext; + Arg topLevelArgs[2]; + Widget entry; + Arg pageNumberArgs[1]; + int page_number; + + toplevel = XtAppInitialize(&xtcontext, "GXditview", + options, XtNumber (options), + &argc, argv, fallback_resources, NULL, 0); + if (argc > 2 + || (argc == 2 && (!strcmp(argv[1], "-help") + || !strcmp(argv[1], "--help")))) + Syntax(argv[0]); + + XtGetApplicationResources(toplevel, (XtPointer)&app_resources, + resources, XtNumber(resources), + NULL, (Cardinal) 0); + if (app_resources.print_command) + strcpy(current_print_command, app_resources.print_command); + + XtAppAddActions(xtcontext, xditview_actions, XtNumber (xditview_actions)); + + XtSetArg (topLevelArgs[0], XtNiconPixmap, + XCreateBitmapFromData (XtDisplay (toplevel), + XtScreen(toplevel)->root, + (char *)xdit_bits, + xdit_width, xdit_height)); + + XtSetArg (topLevelArgs[1], XtNiconMask, + XCreateBitmapFromData (XtDisplay (toplevel), + XtScreen(toplevel)->root, + (char *)xdit_mask_bits, + xdit_mask_width, xdit_mask_height)); + XtSetValues (toplevel, topLevelArgs, 2); + if (argc > 1) + file_name = argv[1]; + + /* + * create the menu and insert the entries + */ + simpleMenu = XtCreatePopupShell ("menu", simpleMenuWidgetClass, toplevel, + NULL, 0); + for (i = 0; i < XtNumber (menuEntries); i++) { + entry = XtCreateManagedWidget(menuEntries[i].name, + smeBSBObjectClass, simpleMenu, + NULL, (Cardinal) 0); + XtAddCallback(entry, XtNcallback, menuEntries[i].function, NULL); + } + + paned = XtCreateManagedWidget("paned", panedWidgetClass, toplevel, + NULL, (Cardinal) 0); + viewport = XtCreateManagedWidget("viewport", viewportWidgetClass, paned, + NULL, (Cardinal) 0); + dvi = XtCreateManagedWidget ("dvi", dviWidgetClass, viewport, NULL, 0); + page = XtCreateManagedWidget ("label", labelWidgetClass, paned, + labelArgs, XtNumber (labelArgs)); + XtSetArg (pageNumberArgs[0], XtNpageNumber, &page_number); + XtGetValues (dvi, pageNumberArgs, 1); + if (file_name) + NewFile (file_name); + /* NewFile modifies current_file_name, so do this here. */ + if (app_resources.filename) + strcpy(current_file_name, app_resources.filename); + XtRealizeWidget (toplevel); + if (file_name) + SetPageNumber (page_number); + XtAppMainLoop(xtcontext); + return 0; +} + +static void +SetPageNumber (int number) +{ + Arg arg[2]; + int actual_number, last_page; + + XtSetArg (arg[0], XtNpageNumber, number); + XtSetValues (dvi, arg, 1); + XtSetArg (arg[0], XtNpageNumber, &actual_number); + XtSetArg (arg[1], XtNlastPageNumber, &last_page); + XtGetValues (dvi, arg, 2); + if (actual_number == 0) + sprintf (pageLabel, "Page "); + else if (last_page > 0) + sprintf (pageLabel, "Page %d of %d", actual_number, last_page); + else + sprintf (pageLabel, "Page %d", actual_number); + XtSetArg (arg[0], XtNlabel, pageLabel); + XtSetValues (page, arg, 1); +} + +static void +SelectPageNumber (const char *number_string) +{ + SetPageNumber (atoi(number_string)); +} + +static int hadFile = 0; + +static void +NewFile (const char *name) +{ + Arg arg[2]; + char *n; + FILE *new_file; + Boolean seek = 0; + + if (current_file) { + if (!strcmp (current_file_name, "-")) + ; + else if (current_file_name[0] == '|') + pclose (current_file); + else + fclose (current_file); + } + if (!strcmp (name, "-")) + new_file = stdin; + else if (name[0] == '|') + new_file = popen (name+1, "r"); + else { + new_file = fopen (name, "r"); + seek = 1; + } + if (!new_file) { + /* XXX display error message */ + return; + } + XtSetArg (arg[0], XtNfile, new_file); + XtSetArg (arg[1], XtNseek, seek); + XtSetValues (dvi, arg, 2); + if (hadFile || name[0] != '-' || name[1] != '\0') { + XtSetArg (arg[0], XtNtitle, name); + if (name[0] != '/' && (n = strrchr (name, '/'))) + n = n + 1; + else + n = (char *)name; + XtSetArg (arg[1], XtNiconName, n); + XtSetValues (toplevel, arg, 2); + } + hadFile = 1; + SelectPageNumber ("1"); + strcpy (current_file_name, name); + current_file = new_file; +} + +static char fileBuf[1024]; + +static void +ResetMenuEntry (Widget entry) +{ + Arg arg[1]; + + XtSetArg (arg[0], (String)XtNpopupOnEntry, entry); + XtSetValues (XtParent(entry) , arg, (Cardinal) 1); +} + +/*ARGSUSED*/ + +static void +NextPage (Widget entry, XtPointer name, XtPointer data) +{ + name = name; /* unused; suppress compiler warning */ + data = data; + + NextPageAction((Widget)NULL, (XEvent *) 0, (String *) 0, (Cardinal *) 0); + ResetMenuEntry (entry); +} + +static void +NextPageAction (Widget widget, XEvent *event, + String *params, Cardinal *num_params) +{ + Arg args[1]; + int number; + + XtSetArg (args[0], XtNpageNumber, &number); + XtGetValues (dvi, args, 1); + SetPageNumber (number+1); + + widget = widget; /* unused; suppress compiler warning */ + event = event; + params = params; + num_params = num_params; +} + +/*ARGSUSED*/ + +static void +PreviousPage (Widget entry, XtPointer name, XtPointer data) +{ + name = name; /* unused; suppress compiler warning */ + data = data; + + PreviousPageAction ((Widget)NULL, (XEvent *) 0, (String *) 0, + (Cardinal *) 0); + ResetMenuEntry (entry); +} + +static void +PreviousPageAction (Widget widget, XEvent *event, + String *params, Cardinal *num_params) +{ + Arg args[1]; + int number; + + XtSetArg (args[0], XtNpageNumber, &number); + XtGetValues (dvi, args, 1); + SetPageNumber (number-1); + + widget = widget; /* unused; suppress compiler warning */ + event = event; + params = params; + num_params = num_params; +} + +/* ARGSUSED */ + +static void +SelectPage (Widget entry, XtPointer name, XtPointer data) +{ + name = name; /* unused; suppress compiler warning */ + data = data; + + SelectPageAction ((Widget)NULL, (XEvent *) 0, (String *) 0, + (Cardinal *) 0); + ResetMenuEntry (entry); +} + +static void +SelectPageAction (Widget widget, XEvent *event, + String *params, Cardinal *num_params) +{ + widget = widget; /* unused; suppress compiler warning */ + event = event; + params = params; + num_params = num_params; + + MakePrompt (toplevel, "Page number", SelectPageNumber, ""); +} + + +static void +DoPrint (const char *name) +{ + FILE *print_file; + RETSIGTYPE (*handler)(int); + + /* Avoid dieing because of an invalid command. */ + handler = signal(SIGPIPE, SIG_IGN); + + print_file = popen(name, "w"); + if (!print_file) + /* XXX print error message */ + return; + DviSaveToFile(dvi, print_file); + pclose(print_file); + signal(SIGPIPE, handler); + strcpy(current_print_command, name); +} + +static void +RerasterizeAction (Widget widget, XEvent *event, + String *params, Cardinal *num_params) +{ + Arg args[1]; + int number; + + if (current_file_name[0] == 0) { + /* XXX display an error message */ + return; + } + XtSetArg (args[0], XtNpageNumber, &number); + XtGetValues (dvi, args, 1); + NewFile(current_file_name); + SetPageNumber (number); + + widget = widget; /* unused; suppress compiler warning */ + event = event; + params = params; + num_params = num_params; +} + +/* ARGSUSED */ + +static void +Print (Widget entry, XtPointer name, XtPointer data) +{ + name = name; /* unused; suppress compiler warning */ + data = data; + + PrintAction ((Widget)NULL, (XEvent *) 0, (String *) 0, (Cardinal *) 0); + ResetMenuEntry (entry); +} + +static void +PrintAction (Widget widget, XEvent *event, + String *params, Cardinal *num_params) +{ + widget = widget; /* unused; suppress compiler warning */ + event = event; + params = params; + num_params = num_params; + + if (current_print_command[0]) + strcpy (fileBuf, current_print_command); + else + fileBuf[0] = '\0'; + MakePrompt (toplevel, "Print command:", DoPrint, fileBuf); +} + + +/* ARGSUSED */ + +static void +OpenFile (Widget entry, XtPointer name, XtPointer data) +{ + name = name; /* unused; suppress compiler warning */ + data = data; + + OpenFileAction ((Widget)NULL, (XEvent *) 0, (String *) 0, (Cardinal *) 0); + ResetMenuEntry (entry); +} + +static void +OpenFileAction (Widget widget, XEvent *event, + String *params, Cardinal *num_params) +{ + widget = widget; /* unused; suppress compiler warning */ + event = event; + params = params; + num_params = num_params; + + if (current_file_name[0]) + strcpy (fileBuf, current_file_name); + else + fileBuf[0] = '\0'; + MakePrompt (toplevel, "File to open:", NewFile, fileBuf); +} + +/* ARGSUSED */ + +static void +Quit (Widget entry, XtPointer closure, XtPointer data) +{ + entry = entry; /* unused; suppress compiler warning */ + closure = closure; + data = data; + + QuitAction ((Widget)NULL, (XEvent *) 0, (String *) 0, (Cardinal *) 0); +} + +static void +QuitAction (Widget widget, XEvent *event, + String *params, Cardinal *num_params) +{ + widget = widget; /* unused; suppress compiler warning */ + event = event; + params = params; + num_params = num_params; + + exit (0); +} + +Widget promptShell, promptDialog; +MakePromptFunc promptfunction; + +/* ARGSUSED */ +static +void CancelAction (Widget widget, XEvent *event, + String *params, Cardinal *num_params) +{ + widget = widget; /* unused; suppress compiler warning */ + event = event; + params = params; + num_params = num_params; + + if (promptShell) { + XtSetKeyboardFocus(toplevel, (Widget) None); + XtDestroyWidget(promptShell); + promptShell = (Widget) 0; + } +} + +static +void AcceptAction (Widget widget, XEvent *event, + String *params, Cardinal *num_params) +{ + (*promptfunction)(XawDialogGetValueString(promptDialog)); + CancelAction (widget, event, params, num_params); +} + +static void +MakePrompt(Widget centerw, const char *prompt, + MakePromptFunc func, const char *def) +{ + static Arg dialogArgs[] = { + {XtNlabel, 0}, + {XtNvalue, 0}, + }; + Arg valueArgs[1]; + Arg centerArgs[2]; + Position source_x, source_y; + Position dest_x, dest_y; + Dimension center_width, center_height; + Dimension prompt_width, prompt_height; + Widget valueWidget; + + CancelAction ((Widget)NULL, (XEvent *) 0, (String *) 0, (Cardinal *) 0); + promptShell = XtCreatePopupShell ("promptShell", transientShellWidgetClass, + toplevel, NULL, (Cardinal) 0); + dialogArgs[0].value = (XtArgVal)prompt; + dialogArgs[1].value = (XtArgVal)def; + promptDialog = XtCreateManagedWidget( "promptDialog", dialogWidgetClass, + promptShell, dialogArgs, XtNumber (dialogArgs)); + XawDialogAddButton(promptDialog, "accept", NULL, (XtPointer) 0); + XawDialogAddButton(promptDialog, "cancel", NULL, (XtPointer) 0); + valueWidget = XtNameToWidget (promptDialog, "value"); + if (valueWidget) { + XtSetArg (valueArgs[0], (String)XtNresizable, TRUE); + XtSetValues (valueWidget, valueArgs, 1); + /* + * as resizable isn't set until just above, the + * default value will be displayed incorrectly. + * rectify the situation by resetting the values + */ + XtSetValues (promptDialog, dialogArgs, XtNumber (dialogArgs)); + } + XtSetKeyboardFocus (promptDialog, valueWidget); + XtSetKeyboardFocus (toplevel, valueWidget); + XtRealizeWidget (promptShell); + /* + * place the widget in the center of the "parent" + */ + XtSetArg (centerArgs[0], XtNwidth, ¢er_width); + XtSetArg (centerArgs[1], XtNheight, ¢er_height); + XtGetValues (centerw, centerArgs, 2); + XtSetArg (centerArgs[0], XtNwidth, &prompt_width); + XtSetArg (centerArgs[1], XtNheight, &prompt_height); + XtGetValues (promptShell, centerArgs, 2); + source_x = (center_width - prompt_width) / 2; + source_y = (center_height - prompt_height) / 3; + XtTranslateCoords (centerw, source_x, source_y, &dest_x, &dest_y); + XtSetArg (centerArgs[0], XtNx, dest_x); + XtSetArg (centerArgs[1], XtNy, dest_y); + XtSetValues (promptShell, centerArgs, 2); + XtMapWidget(promptShell); + promptfunction = func; +} + +/* +Local Variables: +c-indent-level: 4 +c-continued-statement-offset: 4 +c-brace-offset: -4 +c-argdecl-indent: 4 +c-label-offset: -4 +c-tab-always-indent: nil +End: +*/ diff -ruN groff-1.19.1/src/include/assert.h groff-1.19.2/src/include/assert.h --- groff-1.19.1/src/include/assert.h 2000-02-06 10:36:30.000000000 +0100 +++ groff-1.19.2/src/include/assert.h 2005-05-26 15:37:18.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef ASSERT_H #define ASSERT_H diff -ruN groff-1.19.1/src/include/cmap.h groff-1.19.2/src/include/cmap.h --- groff-1.19.1/src/include/cmap.h 2000-02-06 10:36:30.000000000 +0100 +++ groff-1.19.2/src/include/cmap.h 2005-05-26 15:37:18.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef UCHAR_MAX #define UCHAR_MAX 255 diff -ruN groff-1.19.1/src/include/color.h groff-1.19.2/src/include/color.h --- groff-1.19.1/src/include/color.h 2004-01-07 00:49:32.000000000 +0100 +++ groff-1.19.2/src/include/color.h 2005-05-26 15:37:18.000000000 +0200 @@ -21,7 +21,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include "symbol.h" diff -ruN groff-1.19.1/src/include/config.hin groff-1.19.2/src/include/config.hin --- groff-1.19.1/src/include/config.hin 2003-12-30 05:03:41.000000000 +0100 +++ groff-1.19.2/src/include/config.hin 2005-04-30 07:11:51.000000000 +0200 @@ -3,15 +3,15 @@ /* Define if your C++ doesn't understand `delete []'. */ #undef ARRAY_DELETE_NEEDS_SIZE +/* Define if you have a C++ . */ +#undef HAVE_CC_INTTYPES_H + /* Define if you have a C++ . */ #undef HAVE_CC_LIMITS_H /* Define if you have a C++ . */ #undef HAVE_CC_OSFCN_H -/* Define if you have a C++ . */ -#undef HAVE_CC_STDINT_H - /* Define to 1 if you have the declaration of `sys_siglist', and to 0 if you don't. */ #undef HAVE_DECL_SYS_SIGLIST @@ -203,6 +203,9 @@ core image was produced for a process that was terminated by a signal. */ #undef WCOREFLAG +/* Define to 1 if the X Window System is missing or not being used. */ +#undef X_DISPLAY_MISSING + /* Define if -D_POSIX_SOURCE is necessary. */ #undef _POSIX_SOURCE diff -ruN groff-1.19.1/src/include/cset.h groff-1.19.2/src/include/cset.h --- groff-1.19.1/src/include/cset.h 2000-02-06 10:36:30.000000000 +0100 +++ groff-1.19.2/src/include/cset.h 2005-05-26 15:37:18.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef HAVE_CC_LIMITS_H #include diff -ruN groff-1.19.1/src/include/device.h groff-1.19.2/src/include/device.h --- groff-1.19.1/src/include/device.h 2000-02-06 10:36:30.000000000 +0100 +++ groff-1.19.2/src/include/device.h 2005-05-26 15:37:18.000000000 +0200 @@ -16,6 +16,6 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ extern const char *device; diff -ruN groff-1.19.1/src/include/driver.h groff-1.19.2/src/include/driver.h --- groff-1.19.1/src/include/driver.h 2004-01-05 23:31:01.000000000 +0100 +++ groff-1.19.2/src/include/driver.h 2005-05-26 15:37:18.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "lib.h" diff -ruN groff-1.19.1/src/include/DviChar.h groff-1.19.2/src/include/DviChar.h --- groff-1.19.1/src/include/DviChar.h 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/include/DviChar.h 2004-06-01 12:46:52.000000000 +0200 @@ -0,0 +1,37 @@ +/* + * DviChar.h + * + * descriptions for mapping dvi names to + * font indexes and back. Dvi fonts are all + * 256 elements (actually only 256-32 are usable). + * + * The encoding names are taken from X - + * case insensitive, a dash separating the + * CharSetRegistry from the CharSetEncoding + */ + +# define DVI_MAX_SYNONYMS 10 +# define DVI_MAP_SIZE 256 +# define DVI_HASH_SIZE 256 + +typedef struct _dviCharNameHash { + struct _dviCharNameHash *next; + const char *name; + int position; +} DviCharNameHash; + +typedef struct _dviCharNameMap { + const char *encoding; + int special; + const char *dvi_names[DVI_MAP_SIZE][DVI_MAX_SYNONYMS]; + DviCharNameHash *buckets[DVI_HASH_SIZE]; +} DviCharNameMap; + +DviCharNameMap *DviFindMap (char *); +void DviRegisterMap (DviCharNameMap *); +#ifdef NOTDEF +char *DviCharName (DviCharNameMap *, int, int); +#else +#define DviCharName(map,index,synonym) ((map)->dvi_names[index][synonym]) +#endif +int DviCharIndex (DviCharNameMap *, const char *); diff -ruN groff-1.19.1/src/include/errarg.h groff-1.19.2/src/include/errarg.h --- groff-1.19.1/src/include/errarg.h 2002-02-07 09:36:53.000000000 +0100 +++ groff-1.19.2/src/include/errarg.h 2005-05-26 15:37:18.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ class errarg { enum { EMPTY, STRING, CHAR, INTEGER, UNSIGNED_INTEGER, DOUBLE } type; diff -ruN groff-1.19.1/src/include/error.h groff-1.19.2/src/include/error.h --- groff-1.19.1/src/include/error.h 2004-02-22 01:37:50.000000000 +0100 +++ groff-1.19.2/src/include/error.h 2005-05-26 15:37:18.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ extern void fatal_with_file_and_line(const char *filename, int lineno, const char *format, diff -ruN groff-1.19.1/src/include/font.h groff-1.19.2/src/include/font.h --- groff-1.19.1/src/include/font.h 2004-04-18 08:14:55.000000000 +0200 +++ groff-1.19.2/src/include/font.h 2005-05-26 15:37:18.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ typedef void (*FONT_COMMAND_HANDLER)(const char *, const char *, const char *, int); @@ -54,10 +54,11 @@ const char *get_special_device_encoding(int index); const char *get_name(); const char *get_internal_name(); + const char *get_image_generator(); static int scan_papersize(const char *, const char **, double *, double *); - static font *load_font(const char *, int *not_found = 0); + static font *load_font(const char *, int * = 0, int = 0); static void command_line_font_dir(const char *path); static FILE *open_file(const char *name, char **pathp); static int load_desc(); @@ -77,8 +78,10 @@ static int spare2; static int sizescale; static int tcommand; + static int unscaled_charwidths; static int pass_filenames; static int use_charnames_in_special; + static const char *image_generator; static const char **font_name_table; static const char **style_table; @@ -117,5 +120,5 @@ const char *file, int lineno); protected: font(const char *); - int load(int *not_found = 0); + int load(int * = 0, int = 0); }; diff -ruN groff-1.19.1/src/include/geometry.h groff-1.19.2/src/include/geometry.h --- groff-1.19.1/src/include/geometry.h 2001-10-05 23:45:23.000000000 +0200 +++ groff-1.19.2/src/include/geometry.h 2005-05-26 15:37:18.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ int adjust_arc_center(const int *, double *); void check_output_arc_limits(int x, int y, diff -ruN groff-1.19.1/src/include/getopt.h groff-1.19.2/src/include/getopt.h --- groff-1.19.1/src/include/getopt.h 2001-08-25 01:37:49.000000000 +0200 +++ groff-1.19.2/src/include/getopt.h 2005-05-14 09:15:14.000000000 +0200 @@ -1,21 +1,21 @@ /* Declarations for getopt. - Copyright (C) 1989-1994, 1996-1999, 2001 Free Software Foundation, Inc. + Copyright (C) 1989-1994,1996-1999,2001,2003,2004 + Free Software Foundation, Inc. This file is part of the GNU C Library. - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. + 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. - The GNU C Library is distributed in the hope that it will be useful, + 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 - Lesser General Public License for more details. + 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 Lesser General Public - License along with the GNU C Library; if not, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. */ + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _GETOPT_H @@ -23,6 +23,64 @@ # define _GETOPT_H 1 #endif +/* Standalone applications should #define __GETOPT_PREFIX to an + identifier that prefixes the external functions and variables + defined in this header. When this happens, include the + headers that might declare getopt so that they will not cause + confusion if included after this file. Then systematically rename + identifiers so that they do not collide with the system functions + and variables. Renaming avoids problems with some compilers and + linkers. */ +#if defined __GETOPT_PREFIX && !defined __need_getopt +# include +# include +# if HAVE_UNISTD_H +# include +# endif +# undef __need_getopt +# undef getopt +# undef getopt_long +# undef getopt_long_only +# undef optarg +# undef opterr +# undef optind +# undef optopt +# define __GETOPT_CONCAT(x, y) x ## y +# define __GETOPT_XCONCAT(x, y) __GETOPT_CONCAT (x, y) +# define __GETOPT_ID(y) __GETOPT_XCONCAT (__GETOPT_PREFIX, y) +# define getopt __GETOPT_ID (getopt) +# define getopt_long __GETOPT_ID (getopt_long) +# define getopt_long_only __GETOPT_ID (getopt_long_only) +# define optarg __GETOPT_ID (optarg) +# define opterr __GETOPT_ID (opterr) +# define optind __GETOPT_ID (optind) +# define optopt __GETOPT_ID (optopt) +#endif + +/* Standalone applications get correct prototypes for getopt_long and + getopt_long_only; they declare "char **argv". libc uses prototypes + with "char *const *argv" that are incorrect because getopt_long and + getopt_long_only can permute argv; this is required for backward + compatibility (e.g., for LSB 2.0.1). + + This used to be `#if defined __GETOPT_PREFIX && !defined __need_getopt', + but it caused redefinition warnings if both unistd.h and getopt.h were + included, since unistd.h includes getopt.h having previously defined + __need_getopt. + + The only place where __getopt_argv_const is used is in definitions + of getopt_long and getopt_long_only below, but these are visible + only if __need_getopt is not defined, so it is quite safe to rewrite + the conditional as follows: +*/ +#if !defined __need_getopt +# if defined __GETOPT_PREFIX +# define __getopt_argv_const /* empty */ +# else +# define __getopt_argv_const const +# endif +#endif + /* If __GNU_LIBRARY__ is not already defined, either we are being used standalone, or this is the first header included in the source file. If we are being used with glibc, we need to include , but @@ -34,6 +92,17 @@ # include #endif +#ifndef __THROW +# ifndef __GNUC_PREREQ +# define __GNUC_PREREQ(maj, min) (0) +# endif +# if defined __cplusplus && __GNUC_PREREQ (2,8) +# define __THROW throw () +# else +# define __THROW +# endif +#endif + #ifdef __cplusplus extern "C" { #endif @@ -78,7 +147,7 @@ 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. + 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 @@ -93,11 +162,7 @@ struct option { -# if (defined __STDC__ && __STDC__) || defined __cplusplus 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; @@ -137,39 +202,20 @@ arguments to the option '\0'. This behavior is specific to the GNU `getopt'. */ -#if (defined __STDC__ && __STDC__) || defined __cplusplus -# 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 (int ___argc, char *const *___argv, const char *__shortopts) + __THROW; -# ifndef __need_getopt -extern int getopt_long (int ___argc, char *const *___argv, +#ifndef __need_getopt +extern int getopt_long (int ___argc, char *__getopt_argv_const *___argv, const char *__shortopts, - const struct option *__longopts, int *__longind); -extern int getopt_long_only (int ___argc, char *const *___argv, + const struct option *__longopts, int *__longind) + __THROW; +extern int getopt_long_only (int ___argc, char *__getopt_argv_const *___argv, const char *__shortopts, - const struct option *__longopts, int *__longind); + const struct option *__longopts, int *__longind) + __THROW; -/* 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); -# endif -#else /* not __STDC__ */ -extern int getopt (); -# ifndef __need_getopt -extern int getopt_long (); -extern int getopt_long_only (); - -extern int _getopt_internal (); -# endif -#endif /* __STDC__ */ +#endif #ifdef __cplusplus } diff -ruN groff-1.19.1/src/include/getopt_int.h groff-1.19.2/src/include/getopt_int.h --- groff-1.19.1/src/include/getopt_int.h 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/include/getopt_int.h 2005-05-14 09:15:14.000000000 +0200 @@ -0,0 +1,131 @@ +/* Internal declarations for getopt. + Copyright (C) 1989-1994,1996-1999,2001,2003,2004 + Free Software Foundation, Inc. + This file is part of the GNU C Library. + + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _GETOPT_INT_H +#define _GETOPT_INT_H 1 + +extern int _getopt_internal (int ___argc, char **___argv, + const char *__shortopts, + const struct option *__longopts, int *__longind, + int __long_only, int __posixly_correct); + + +/* Reentrant versions which can handle parsing multiple argument + vectors at the same time. */ + +/* Data type for reentrant functions. */ +struct _getopt_data +{ + /* These have exactly the same meaning as the corresponding global + variables, except that they are used for the reentrant + versions of getopt. */ + int optind; + int opterr; + int optopt; + char *optarg; + + /* Internal members. */ + + /* True if the internal members have been initialized. */ + int __initialized; + + /* 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. */ + char *__nextchar; + + /* 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, or by calling getopt. + + 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. */ + + enum + { + REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER + } __ordering; + + /* If the POSIXLY_CORRECT environment variable is set + or getopt was called. */ + int __posixly_correct; + + + /* 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. */ + + int __first_nonopt; + int __last_nonopt; + +#if defined _LIBC && defined USE_NONOPTION_FLAGS + int __nonoption_flags_max_len; + int __nonoption_flags_len; +# endif +}; + +/* The initializer is necessary to set OPTIND and OPTERR to their + default values and to clear the initialization flag. */ +#define _GETOPT_DATA_INITIALIZER { 1, 1 } + +extern int _getopt_internal_r (int ___argc, char **___argv, + const char *__shortopts, + const struct option *__longopts, int *__longind, + int __long_only, int __posixly_correct, + struct _getopt_data *__data); + +extern int _getopt_long_r (int ___argc, char **___argv, + const char *__shortopts, + const struct option *__longopts, int *__longind, + struct _getopt_data *__data); + +extern int _getopt_long_only_r (int ___argc, char **___argv, + const char *__shortopts, + const struct option *__longopts, + int *__longind, + struct _getopt_data *__data); + +#endif /* getopt_int.h */ diff -ruN groff-1.19.1/src/include/gettext.h groff-1.19.2/src/include/gettext.h --- groff-1.19.1/src/include/gettext.h 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/include/gettext.h 2005-06-15 18:14:48.000000000 +0200 @@ -0,0 +1,4 @@ +/* This is a dummy header file to make getopt compile without gettext + support. */ + +#define gettext(s) s diff -ruN groff-1.19.1/src/include/groff-getopt.h groff-1.19.2/src/include/groff-getopt.h --- groff-1.19.1/src/include/groff-getopt.h 2001-04-21 01:53:48.000000000 +0200 +++ groff-1.19.2/src/include/groff-getopt.h 1970-01-01 01:00:00.000000000 +0100 @@ -1,68 +0,0 @@ -// -*- C++ -*- -/* Copyright (C) 2000, 2001 Free Software Foundation, Inc. - Written by Werner Lemberg (wl@gnu.org) - -This file is part of groff. - -groff 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. - -groff 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 groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -/* - This file has to be included from within lib.h instead of getopt.h - to avoid problems with picky C++ compilers. -*/ - -#ifndef _GROFF_GETOPT_H -#define _GROFF_GETOPT_H - -#ifdef __cplusplus -extern "C" { -#endif - -extern char *optarg; -extern int optind; -extern int opterr; -extern int optopt; - -struct option -{ - const char *name; - int has_arg; - int *flag; - int val; -}; - -#define no_argument 0 -#define required_argument 1 -#define optional_argument 2 - -extern int getopt(int, // __argc - char *const *, // __argv - const char *); // __shortopts -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 - -#ifdef __cplusplus -} -#endif - -#endif /* _GROFF_GETOPT_H */ diff -ruN groff-1.19.1/src/include/htmlhint.h groff-1.19.2/src/include/htmlhint.h --- groff-1.19.1/src/include/htmlhint.h 2002-02-19 17:28:31.000000000 +0100 +++ groff-1.19.2/src/include/htmlhint.h 2005-05-26 15:37:18.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef HTMLINDICATE_H #define HTMLINDICATE_H diff -ruN groff-1.19.1/src/include/html-strings.h groff-1.19.2/src/include/html-strings.h --- groff-1.19.1/src/include/html-strings.h 2003-04-12 15:57:18.000000000 +0200 +++ groff-1.19.2/src/include/html-strings.h 2005-05-26 15:37:18.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ /* * defines the image tags issued by the pre-processors (tbl, pic, eqn) diff -ruN groff-1.19.1/src/include/index.h groff-1.19.2/src/include/index.h --- groff-1.19.1/src/include/index.h 2000-02-06 10:36:30.000000000 +0100 +++ groff-1.19.2/src/include/index.h 2005-05-26 15:37:18.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #define INDEX_MAGIC 0x23021964 #define INDEX_VERSION 1 diff -ruN groff-1.19.1/src/include/lib.h groff-1.19.2/src/include/lib.h --- groff-1.19.1/src/include/lib.h 2003-11-13 09:21:50.000000000 +0100 +++ groff-1.19.2/src/include/lib.h 2005-06-23 08:40:10.000000000 +0200 @@ -1,5 +1,6 @@ // -*- C++ -*- -/* Copyright (C) 1989-2000, 2001, 2002, 2003 Free Software Foundation, Inc. +/* Copyright (C) 1989-2000, 2001, 2002, 2003, 2005 + Free Software Foundation, Inc. Written by James Clark (jjc@jclark.com) This file is part of groff. @@ -16,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H #include @@ -31,19 +32,8 @@ const char *if_to_a(int, int); } -/* stdio.h on IRIX, OSF/1, emx, UWIN, and MinGW include getopt.h */ -/* unistd.h on CYGWIN includes getopt.h */ - -#if !(defined(__sgi) \ - || (defined(__osf__) && defined(__alpha)) \ - || defined(_UWIN) \ - || defined(__EMX__) \ - || defined(__CYGWIN__) \ - || defined(__MINGW32__)) -#include -#else +#define __GETOPT_PREFIX groff_ #include -#endif #ifdef HAVE_SETLOCALE #include @@ -53,6 +43,7 @@ char *strsave(const char *s); int is_prime(unsigned); +double groff_hypot(double, double); #include #include @@ -99,6 +90,7 @@ #endif /* NEED_DECLARATION_PCLOSE */ size_t file_name_max(const char *fname); +size_t path_name_max(); int interpret_lf_args(const char *p); diff -ruN groff-1.19.1/src/include/macropath.h groff-1.19.2/src/include/macropath.h --- groff-1.19.1/src/include/macropath.h 2000-11-22 23:11:20.000000000 +0100 +++ groff-1.19.2/src/include/macropath.h 2005-05-26 15:37:19.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ extern search_path macro_path; extern search_path safer_macro_path; diff -ruN groff-1.19.1/src/include/Makefile.sub groff-1.19.2/src/include/Makefile.sub --- groff-1.19.1/src/include/Makefile.sub 2004-01-06 23:50:29.000000000 +0100 +++ groff-1.19.2/src/include/Makefile.sub 2005-06-23 13:27:53.000000000 +0200 @@ -5,12 +5,14 @@ color.h \ device.h \ driver.h \ + DviChar.h \ errarg.h \ error.h \ font.h \ geometry.h \ getopt.h \ - groff-getopt.h \ + getopt_int.h \ + gettext.h \ htmlhint.h \ index.h \ lib.h \ @@ -20,11 +22,13 @@ printer.h \ ptable.h \ refid.h \ + relocate.h \ search.h \ searchpath.h \ stringclass.h \ symbol.h \ - unicode.h + unicode.h \ + XFontName.h GENHDRS=defs.h all depend: $(GENHDRS) @@ -33,6 +37,7 @@ @$(SHELL) $(top_srcdir)/gendef.sh defs.h \ "PROG_PREFIX=\"$(g)\"" \ "DEVICE=\"$(DEVICE)\"" \ + "INSTALLPATH=\"$(prefix)\"" \ "BINPATH=\"$(bindir)\"" \ "FONTPATH=\"$(fontpath)\"" \ "MACROPATH=\"$(tmacpath)\"" \ diff -ruN groff-1.19.1/src/include/nonposix.h groff-1.19.2/src/include/nonposix.h --- groff-1.19.1/src/include/nonposix.h 2004-02-28 21:56:51.000000000 +0100 +++ groff-1.19.2/src/include/nonposix.h 2005-05-26 15:37:19.000000000 +0200 @@ -1,4 +1,5 @@ -/* Copyright (C) 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. +/* Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005 + Free Software Foundation, Inc. Written by Eli Zaretskii (eliz@is.elta.co.il) This file is part of groff. @@ -15,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ /* This header file compartmentalize all idiosyncrasies of non-Posix systems, such as MS-DOS, MS-Windows, etc. It should be loaded after @@ -64,6 +65,7 @@ # define dup2(f1,f2) _dup2(f1,f2) # define close(f) _close(f) # define isatty(f) _isatty(f) +# define access(p,m) _access(p,m) # endif # define SET_BINARY(f) do {if (!isatty(f)) setmode(f,O_BINARY);} while(0) # define FOPEN_RB "rb" @@ -101,6 +103,9 @@ /* The executable extension. */ # define EXE_EXT ".exe" +/* Possible executable extensions. */ +# define PATH_EXT ".com;.exe;.bat;.cmd" + /* The system null device. */ # define NULL_DEV "NUL" @@ -209,6 +214,9 @@ #ifndef EXE_EXT # define EXE_EXT "" #endif +#ifndef PATH_EXT +# define PATH_EXT "" +#endif #ifndef NULL_DEV # define NULL_DEV "/dev/null" #endif diff -ruN groff-1.19.1/src/include/paper.h groff-1.19.2/src/include/paper.h --- groff-1.19.1/src/include/paper.h 2002-07-09 11:55:04.000000000 +0200 +++ groff-1.19.2/src/include/paper.h 2005-05-26 15:37:19.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ struct paper { char *name; diff -ruN groff-1.19.1/src/include/posix.h groff-1.19.2/src/include/posix.h --- groff-1.19.1/src/include/posix.h 2004-01-05 23:31:48.000000000 +0100 +++ groff-1.19.2/src/include/posix.h 2005-05-26 15:37:19.000000000 +0200 @@ -1,5 +1,5 @@ // -*- C++ -*- -/* Copyright (C) 1992, 2000, 2001, 2002 Free Software Foundation, Inc. +/* Copyright (C) 1992, 2000, 2001, 2002, 2005 Free Software Foundation, Inc. Written by James Clark (jjc@jclark.com) This file is part of groff. @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include @@ -58,6 +58,10 @@ #define O_RDONLY 0 #endif +#ifndef F_OK +#define F_OK 0 +#endif + #ifndef HAVE_ISATTY #define isatty(n) (1) #endif diff -ruN groff-1.19.1/src/include/printer.h groff-1.19.2/src/include/printer.h --- groff-1.19.1/src/include/printer.h 2004-04-17 06:37:24.000000000 +0200 +++ groff-1.19.2/src/include/printer.h 2005-05-26 15:37:19.000000000 +0200 @@ -7,7 +7,7 @@ Written by James Clark (jjc@jclark.com) - Last update: 12 Apr 2002 + Last update: 15 Dec 2004 This file is part of groff. @@ -23,8 +23,8 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. + Software Foundation, 51 Franklin St - Fifth Floor, Boston, MA + 02110-1301, USA. */ /* Description @@ -83,6 +83,9 @@ virtual void end_of_line(); virtual void special(char *arg, const environment *env, char type = 'p'); + virtual void devtag(char *arg, const environment *env, + char type = 'p'); + protected: font_pointer_list *font_list; font **font_table; diff -ruN groff-1.19.1/src/include/ptable.h groff-1.19.2/src/include/ptable.h --- groff-1.19.1/src/include/ptable.h 2004-04-17 06:27:13.000000000 +0200 +++ groff-1.19.2/src/include/ptable.h 2005-05-26 15:37:19.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include diff -ruN groff-1.19.1/src/include/refid.h groff-1.19.2/src/include/refid.h --- groff-1.19.1/src/include/refid.h 2000-02-06 10:36:30.000000000 +0100 +++ groff-1.19.2/src/include/refid.h 2005-05-26 15:37:19.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ class reference_id { int filename_id; diff -ruN groff-1.19.1/src/include/relocate.h groff-1.19.2/src/include/relocate.h --- groff-1.19.1/src/include/relocate.h 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/include/relocate.h 2005-05-26 15:37:19.000000000 +0200 @@ -0,0 +1,27 @@ +// -*- C++ -*- +/* Provide relocation for macro and font files. + Copyright (C) 2005 Free Software Foundation, Inc. + + This program 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, 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, + USA. */ + +extern char *curr_prefix; +extern size_t curr_prefix_len; + +void set_current_prefix (); +char *xdirname (char *s); +char *searchpath (const char *name, const char *pathp); +char *relocatep (const char *path); +char *relocate (const char *path); diff -ruN groff-1.19.1/src/include/search.h groff-1.19.2/src/include/search.h --- groff-1.19.1/src/include/search.h 2004-04-17 06:39:41.000000000 +0200 +++ groff-1.19.2/src/include/search.h 2005-05-26 15:37:19.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ class search_item; class search_item_iterator; diff -ruN groff-1.19.1/src/include/searchpath.h groff-1.19.2/src/include/searchpath.h --- groff-1.19.1/src/include/searchpath.h 2003-10-13 14:40:29.000000000 +0200 +++ groff-1.19.2/src/include/searchpath.h 2005-05-26 15:37:19.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ class search_path { char *dirs; diff -ruN groff-1.19.1/src/include/stringclass.h groff-1.19.2/src/include/stringclass.h --- groff-1.19.1/src/include/stringclass.h 2002-09-08 16:12:10.000000000 +0200 +++ groff-1.19.2/src/include/stringclass.h 2005-05-26 15:37:19.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include diff -ruN groff-1.19.1/src/include/symbol.h groff-1.19.2/src/include/symbol.h --- groff-1.19.1/src/include/symbol.h 2004-01-07 00:29:33.000000000 +0100 +++ groff-1.19.2/src/include/symbol.h 2005-05-26 15:37:19.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #define DONT_STORE 1 #define MUST_ALREADY_EXIST 2 diff -ruN groff-1.19.1/src/include/unicode.h groff-1.19.2/src/include/unicode.h --- groff-1.19.1/src/include/unicode.h 2003-12-22 11:26:45.000000000 +0100 +++ groff-1.19.2/src/include/unicode.h 2005-05-26 15:37:19.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ const char *glyph_name_to_unicode(const char *); const char *unicode_to_glyph_name(const char *); diff -ruN groff-1.19.1/src/include/XFontName.h groff-1.19.2/src/include/XFontName.h --- groff-1.19.1/src/include/XFontName.h 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/include/XFontName.h 2004-06-01 12:46:52.000000000 +0200 @@ -0,0 +1,50 @@ +typedef struct _xFontName { + char Registry[256]; + char Foundry[256]; + char FamilyName[256]; + char WeightName[256]; + char Slant[3]; + char SetwidthName[256]; + char AddStyleName[256]; + unsigned int PixelSize; + unsigned int PointSize; + unsigned int ResolutionX; + unsigned int ResolutionY; + char Spacing[2]; + unsigned int AverageWidth; + char CharSetRegistry[256]; + char CharSetEncoding[256]; +} XFontName; + +#define FontNameRegistry (1<<0) +#define FontNameFoundry (1<<1) +#define FontNameFamilyName (1<<2) +#define FontNameWeightName (1<<3) +#define FontNameSlant (1<<4) +#define FontNameSetwidthName (1<<5) +#define FontNameAddStyleName (1<<6) +#define FontNamePixelSize (1<<7) +#define FontNamePointSize (1<<8) +#define FontNameResolutionX (1<<9) +#define FontNameResolutionY (1<<10) +#define FontNameSpacing (1<<11) +#define FontNameAverageWidth (1<<12) +#define FontNameCharSetRegistry (1<<13) +#define FontNameCharSetEncoding (1<<14) + +#define SlantRoman "R" +#define SlantItalic "I" +#define SlantOblique "O" +#define SlantReverseItalic "RI" +#define SlantReverseOblique "RO" + +#define SpacingMonoSpaced "M" +#define SpacingProportional "P" +#define SpacingCharacterCell "C" + +typedef char *XFontNameString; + +Bool XParseFontName (XFontNameString, XFontName *, unsigned int *); +Bool XFormatFontName (XFontName *, unsigned int, XFontNameString); +Bool XCompareFontName (XFontName *, XFontName *, unsigned int); +Bool XCopyFontName (XFontName *, XFontName *, unsigned int); diff -ruN groff-1.19.1/src/libs/libbib/common.cpp groff-1.19.2/src/libs/libbib/common.cpp --- groff-1.19.1/src/libs/libbib/common.cpp 2000-02-06 10:37:09.000000000 +0100 +++ groff-1.19.2/src/libs/libbib/common.cpp 2005-05-26 15:37:19.000000000 +0200 @@ -15,7 +15,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ unsigned hash(const char *s, int len) { diff -ruN groff-1.19.1/src/libs/libbib/index.cpp groff-1.19.2/src/libs/libbib/index.cpp --- groff-1.19.1/src/libs/libbib/index.cpp 2004-04-07 16:38:02.000000000 +0200 +++ groff-1.19.2/src/libs/libbib/index.cpp 2005-05-26 15:37:19.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "lib.h" diff -ruN groff-1.19.1/src/libs/libbib/linear.cpp groff-1.19.2/src/libs/libbib/linear.cpp --- groff-1.19.1/src/libs/libbib/linear.cpp 2001-08-19 23:32:27.000000000 +0200 +++ groff-1.19.2/src/libs/libbib/linear.cpp 2005-05-26 15:37:19.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "lib.h" diff -ruN groff-1.19.1/src/libs/libbib/map.c groff-1.19.2/src/libs/libbib/map.c --- groff-1.19.1/src/libs/libbib/map.c 2004-04-08 16:46:52.000000000 +0200 +++ groff-1.19.2/src/libs/libbib/map.c 2005-05-26 15:37:19.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include diff -ruN groff-1.19.1/src/libs/libbib/search.cpp groff-1.19.2/src/libs/libbib/search.cpp --- groff-1.19.1/src/libs/libbib/search.cpp 2001-08-19 23:32:27.000000000 +0200 +++ groff-1.19.2/src/libs/libbib/search.cpp 2005-05-26 15:37:19.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "lib.h" diff -ruN groff-1.19.1/src/libs/libdriver/input.cpp groff-1.19.2/src/libs/libdriver/input.cpp --- groff-1.19.1/src/libs/libdriver/input.cpp 2004-04-07 16:30:36.000000000 +0200 +++ groff-1.19.2/src/libs/libdriver/input.cpp 2005-06-15 17:56:29.000000000 +0200 @@ -2,13 +2,13 @@ // /src/libs/libdriver/input.cpp -/* Copyright (C) 1989, 1990, 1991, 1992, 2001, 2002, 2003, 2004 +/* Copyright (C) 1989, 1990, 1991, 1992, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. Written by James Clark (jjc@jclark.com) Major rewrite 2001 by Bernd Warken (bwarken@mayn.de) - Last update: 04 Apr 2003 + Last update: 15 Jun 2005 This file is part of groff, the GNU roff text processing system. @@ -24,8 +24,8 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. + Software Foundation, 51 Franklin St - Fifth Floor, Boston, MA + 02110-1301, USA. */ /* Description @@ -272,16 +272,15 @@ IntArray(void); IntArray(const size_t); ~IntArray(void); - const IntArg operator[](const size_t i) const + IntArg operator[](const size_t i) const { if (i >= num_stored) fatal("index out of range"); return (IntArg) data[i]; } void append(IntArg); - const IntArg * const - get_data(void) const { return (IntArg *)data; } - const size_t len(void) const { return num_stored; } + IntArg *get_data(void) const { return (IntArg *)data; } + size_t len(void) const { return num_stored; } }; // Characters read from the input queue. @@ -608,6 +607,7 @@ delete current_env->col; delete current_env->fill; delete current_env; + current_env = 0; } ////////////////////////////////////////////////////////////////////// @@ -1520,6 +1520,9 @@ char *str_arg = get_extended_arg(); // includes line skip if (npages <= 0) error("`x X' command invalid before first `p' command"); + else if (str_arg && (strncmp(str_arg, "devtag:", + strlen("devtag:")) == 0)) + pr->devtag(str_arg, current_env); else pr->special(str_arg, current_env); a_delete str_arg; @@ -1823,6 +1826,7 @@ if (npages > 0) pr->end_page(current_env->vpos); delete pr; + pr = 0; fclose(current_file); // If `stopped' is not `true' here then there wasn't any `x stop'. if (!stopped) diff -ruN groff-1.19.1/src/libs/libdriver/printer.cpp groff-1.19.2/src/libs/libdriver/printer.cpp --- groff-1.19.1/src/libs/libdriver/printer.cpp 2003-04-12 15:58:14.000000000 +0200 +++ groff-1.19.2/src/libs/libdriver/printer.cpp 2005-05-26 15:37:19.000000000 +0200 @@ -2,11 +2,11 @@ // /src/libs/libdriver/printer.cpp -/* Copyright (C) 1989, 1990, 1991, 1992, 2001, 2002, 2003 +/* Copyright (C) 1989, 1990, 1991, 1992, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. Written by James Clark (jjc@jclark.com) - Last update: 04 Apr 2003 + Last update: 02 Mar 2005 This file is part of groff. @@ -22,12 +22,61 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. + Software Foundation, 51 Franklin St - Fifth Floor, Boston, MA + 02110-1301, USA. */ #include "driver.h" +/* If we are sending output to an onscreen pager (as is the normal case + when reading man pages), then we may get an error state on the output + stream, if the user does not read all the way to the end. + + We normally expect to catch this, and clean up the error context, when + the pager exits, because we should get, and handle, a SIGPIPE. + + However ... +*/ + +#if (defined(_MSC_VER) || defined(_WIN32)) \ + && !defined(__CYGWIN__) && !defined(_UWIN) + + /* Native MS-Windows doesn't know about SIGPIPE, so we cannot detect the + early exit from the pager, and therefore, cannot clean up the error + context; thus we use the following static function to identify this + particular error context, and so suppress unwanted diagnostics. + */ + + static int + check_for_output_error (FILE* stream) + { + /* First, clean up any prior error context on the output stream */ + if (ferror (stream)) + clearerr (stream); + /* Clear errno, in case clearerr() and fflush() don't */ + errno = 0; + /* Flush the output stream, so we can capture any error context, other + than the specific case we wish to suppress. + + Microsoft doesn't document it, but the error code for the specific + context we are trying to suppress seems to be EINVAL -- a strange + choice, since it is not normally associated with fflush(); of course, + it *should* be EPIPE, but this *definitely* is not used, and *is* so + documented. + */ + return ((fflush(stream) < 0) && (errno != EINVAL)); + } + +#else + + /* For other systems, we simply assume that *any* output error context + is to be reported. + */ +# define check_for_output_error(stream) ferror(stream) || fflush(stream) < 0 + +#endif + + font_pointer_list::font_pointer_list(font *f, font_pointer_list *fp) : p(f), next(fp) { @@ -47,7 +96,7 @@ delete tem->p; delete tem; } - if (ferror(stdout) || fflush(stdout) < 0) + if (check_for_output_error(stdout)) fatal("output error"); } @@ -107,6 +156,10 @@ { } +void printer::devtag(char *, const environment *, char) +{ +} + void printer::draw(int, int *, int, const environment *) { } diff -ruN groff-1.19.1/src/libs/libgroff/assert.cpp groff-1.19.2/src/libs/libgroff/assert.cpp --- groff-1.19.1/src/libs/libgroff/assert.cpp 2004-02-21 22:20:20.000000000 +0100 +++ groff-1.19.2/src/libs/libgroff/assert.cpp 2005-05-26 15:37:19.000000000 +0200 @@ -15,7 +15,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include diff -ruN groff-1.19.1/src/libs/libgroff/change_lf.cpp groff-1.19.2/src/libs/libgroff/change_lf.cpp --- groff-1.19.1/src/libs/libgroff/change_lf.cpp 2000-02-06 10:37:12.000000000 +0100 +++ groff-1.19.2/src/libs/libgroff/change_lf.cpp 2005-05-26 15:37:19.000000000 +0200 @@ -15,7 +15,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include diff -ruN groff-1.19.1/src/libs/libgroff/cmap.cpp groff-1.19.2/src/libs/libgroff/cmap.cpp --- groff-1.19.1/src/libs/libgroff/cmap.cpp 2000-02-06 10:37:12.000000000 +0100 +++ groff-1.19.2/src/libs/libgroff/cmap.cpp 2005-05-26 15:37:19.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include "cmap.h" diff -ruN groff-1.19.1/src/libs/libgroff/color.cpp groff-1.19.2/src/libs/libgroff/color.cpp --- groff-1.19.1/src/libs/libgroff/color.cpp 2004-01-07 00:02:33.000000000 +0100 +++ groff-1.19.2/src/libs/libgroff/color.cpp 2005-05-26 15:37:19.000000000 +0200 @@ -2,7 +2,7 @@ /* /src/libs/libgroff/color.cpp -Last update: 07 Jan 2004 +Last update: 26 May 2004 Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. Written by Gaius Mulley @@ -21,8 +21,9 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ +#include "lib.h" #include "color.h" #include "cset.h" #ifdef HAVE_UNISTD_H diff -ruN groff-1.19.1/src/libs/libgroff/cset.cpp groff-1.19.2/src/libs/libgroff/cset.cpp --- groff-1.19.1/src/libs/libgroff/cset.cpp 2000-02-06 10:37:12.000000000 +0100 +++ groff-1.19.2/src/libs/libgroff/cset.cpp 2005-05-26 15:37:19.000000000 +0200 @@ -1,5 +1,5 @@ // -*- C++ -*- -/* Copyright (C) 1989, 1990, 1991, 1992 Free Software Foundation, Inc. +/* Copyright (C) 1989, 1990, 1991, 1992, 2004 Free Software Foundation, Inc. Written by James Clark (jjc@jclark.com) This file is part of groff. @@ -16,9 +16,11 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include + +#include "lib.h" #include "cset.h" cset csalpha(CSET_BUILTIN); diff -ruN groff-1.19.1/src/libs/libgroff/device.cpp groff-1.19.2/src/libs/libgroff/device.cpp --- groff-1.19.1/src/libs/libgroff/device.cpp 2000-02-06 10:37:12.000000000 +0100 +++ groff-1.19.2/src/libs/libgroff/device.cpp 2005-05-26 15:37:19.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include "device.h" diff -ruN groff-1.19.1/src/libs/libgroff/errarg.cpp groff-1.19.2/src/libs/libgroff/errarg.cpp --- groff-1.19.1/src/libs/libgroff/errarg.cpp 2002-02-07 09:36:53.000000000 +0100 +++ groff-1.19.2/src/libs/libgroff/errarg.cpp 2005-05-26 15:37:19.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include "assert.h" diff -ruN groff-1.19.1/src/libs/libgroff/error.cpp groff-1.19.2/src/libs/libgroff/error.cpp --- groff-1.19.1/src/libs/libgroff/error.cpp 2003-02-10 17:55:34.000000000 +0100 +++ groff-1.19.2/src/libs/libgroff/error.cpp 2005-05-26 15:37:19.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include diff -ruN groff-1.19.1/src/libs/libgroff/fatal.cpp groff-1.19.2/src/libs/libgroff/fatal.cpp --- groff-1.19.1/src/libs/libgroff/fatal.cpp 2000-02-06 10:37:13.000000000 +0100 +++ groff-1.19.2/src/libs/libgroff/fatal.cpp 2005-05-26 15:37:19.000000000 +0200 @@ -15,7 +15,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include diff -ruN groff-1.19.1/src/libs/libgroff/fmod.c groff-1.19.2/src/libs/libgroff/fmod.c --- groff-1.19.1/src/libs/libgroff/fmod.c 2000-02-06 10:37:13.000000000 +0100 +++ groff-1.19.2/src/libs/libgroff/fmod.c 2005-05-26 15:37:19.000000000 +0200 @@ -15,7 +15,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include diff -ruN groff-1.19.1/src/libs/libgroff/font.cpp groff-1.19.2/src/libs/libgroff/font.cpp --- groff-1.19.1/src/libs/libgroff/font.cpp 2004-04-18 08:17:40.000000000 +0200 +++ groff-1.19.2/src/libs/libgroff/font.cpp 2005-05-26 15:37:19.000000000 +0200 @@ -1,5 +1,5 @@ // -*- C++ -*- -/* Copyright (C) 1989, 1990, 1991, 1992, 2000, 2001, 2002, 2003, 2004 +/* Copyright (C) 1989, 1990, 1991, 1992, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. Written by James Clark (jjc@jclark.com) @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "lib.h" @@ -71,6 +71,7 @@ int lineno; int size; int skip_comments; + int silent; char *buf; text_file(FILE *fp, char *p); ~text_file(); @@ -82,7 +83,7 @@ }; text_file::text_file(FILE *p, char *s) -: fp(p), path(s), lineno(0), size(0), skip_comments(1), buf(0) +: fp(p), path(s), lineno(0), size(0), skip_comments(1), silent(0), buf(0) { } @@ -141,7 +142,8 @@ const errarg &arg2, const errarg &arg3) { - error_with_file_and_line(path, lineno, format, arg1, arg2, arg3); + if (!silent) + error_with_file_and_line(path, lineno, format, arg1, arg2, arg3); } @@ -272,7 +274,7 @@ int i = ch_index[c]; assert(i >= 0); - if (point_size == unitwidth) + if (point_size == unitwidth || font::unscaled_charwidths) return ch[i].width; if (!widths_cache) @@ -394,7 +396,12 @@ const char *font::get_special_device_encoding(int c) { assert(c >= 0 && c < nindices && ch_index[c] >= 0); - return( ch[ch_index[c]].special_device_coding ); + return ch[ch_index[c]].special_device_coding; +} + +const char *font::get_image_generator() +{ + return image_generator; } void font::alloc_ch_index(int idx) @@ -479,10 +486,10 @@ ch_index[new_index] = ch_index[old_index]; } -font *font::load_font(const char *s, int *not_found) +font *font::load_font(const char *s, int *not_found, int head_only) { font *f = new font(s); - if (!f->load(not_found)) { + if (!f->load(not_found, head_only)) { delete f; return 0; } @@ -557,7 +564,7 @@ // If the font can't be found, then if not_found is non-NULL, it will be set // to 1 otherwise a message will be printed. -int font::load(int *not_found) +int font::load(int *not_found, int head_only) { char *path; FILE *fp; @@ -570,6 +577,7 @@ } text_file t(fp, path); t.skip_comments = 1; + t.silent = head_only; char *p; for (;;) { if (!t.next()) { @@ -638,6 +646,8 @@ else break; } + if (head_only) + return 1; char *command = p; int had_charset = 0; t.skip_comments = 0; @@ -810,7 +820,7 @@ { "spare1", &font::biggestfont }, { "biggestfont", &font::biggestfont }, { "spare2", &font::spare2 }, - { "sizescale", &font::sizescale } + { "sizescale", &font::sizescale }, }; int font::load_desc() @@ -905,6 +915,8 @@ return 0; } } + else if (strcmp("unscaled_charwidths", p) == 0) + unscaled_charwidths = 1; else if (strcmp("pass_filenames", p) == 0) pass_filenames = 1; else if (strcmp("sizes", p) == 0) { @@ -981,6 +993,14 @@ tcommand = 1; else if (strcmp("use_charnames_in_special", p) == 0) use_charnames_in_special = 1; + else if (strcmp("image_generator", p) == 0) { + p = strtok(0, WS); + if (!p) { + t.error("image_generator command requires an argument"); + return 0; + } + image_generator = strsave(p); + } else if (strcmp("charset", p) == 0) break; else if (unknown_desc_command_handler) { diff -ruN groff-1.19.1/src/libs/libgroff/fontfile.cpp groff-1.19.2/src/libs/libgroff/fontfile.cpp --- groff-1.19.1/src/libs/libgroff/fontfile.cpp 2004-04-07 16:25:28.000000000 +0200 +++ groff-1.19.2/src/libs/libgroff/fontfile.cpp 2005-05-26 15:37:19.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "lib.h" @@ -45,7 +45,9 @@ int font::sizescale = 1; int font::tcommand = 0; int font::pass_filenames = 0; +int font::unscaled_charwidths = 0; int font::use_charnames_in_special = 0; +const char *font::image_generator = NULL; const char **font::font_name_table = 0; int *font::sizes = 0; const char *font::family = 0; diff -ruN groff-1.19.1/src/libs/libgroff/geometry.cpp groff-1.19.2/src/libs/libgroff/geometry.cpp --- groff-1.19.1/src/libs/libgroff/geometry.cpp 2004-04-08 13:13:23.000000000 +0200 +++ groff-1.19.2/src/libs/libgroff/geometry.cpp 2005-05-26 15:37:19.000000000 +0200 @@ -18,7 +18,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include diff -ruN groff-1.19.1/src/libs/libgroff/getcwd.c groff-1.19.2/src/libs/libgroff/getcwd.c --- groff-1.19.1/src/libs/libgroff/getcwd.c 2000-11-13 17:51:29.000000000 +0100 +++ groff-1.19.2/src/libs/libgroff/getcwd.c 2005-05-26 15:37:19.000000000 +0200 @@ -15,7 +15,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ /* Partial emulation of getcwd in terms of getwd. */ diff -ruN groff-1.19.1/src/libs/libgroff/getopt1.c groff-1.19.2/src/libs/libgroff/getopt1.c --- groff-1.19.1/src/libs/libgroff/getopt1.c 2001-08-25 01:37:50.000000000 +0200 +++ groff-1.19.2/src/libs/libgroff/getopt1.c 2005-05-14 09:15:14.000000000 +0200 @@ -1,58 +1,35 @@ /* getopt_long and getopt_long_only entry points for GNU getopt. - Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98 + Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98,2004 Free Software Foundation, Inc. This file is part of the GNU C Library. - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. + 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. - The GNU C Library is distributed in the hope that it will be useful, + 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 - Lesser General Public License for more details. + 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 Lesser General Public - License along with the GNU C Library; if not, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. */ + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H #include #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 +#ifdef _LIBC +# include +#else +# include "getopt.h" #endif +#include "getopt_int.h" #include -/* 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 -#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__ @@ -64,14 +41,20 @@ #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; +getopt_long (int argc, char *__getopt_argv_const *argv, const char *options, + const struct option *long_options, int *opt_index) { - return _getopt_internal (argc, argv, options, long_options, opt_index, 0); + return _getopt_internal (argc, (char **) argv, options, long_options, + opt_index, 0, 0); +} + +int +_getopt_long_r (int argc, char **argv, const char *options, + const struct option *long_options, int *opt_index, + struct _getopt_data *d) +{ + return _getopt_internal_r (argc, argv, options, long_options, opt_index, + 0, 0, d); } /* Like getopt_long, but '-' as well as '--' can indicate a long option. @@ -80,27 +63,30 @@ 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; +getopt_long_only (int argc, char *__getopt_argv_const *argv, + const char *options, + const struct option *long_options, int *opt_index) { - return _getopt_internal (argc, argv, options, long_options, opt_index, 1); + return _getopt_internal (argc, (char **) argv, options, long_options, + opt_index, 1, 0); } +int +_getopt_long_only_r (int argc, char **argv, const char *options, + const struct option *long_options, int *opt_index, + struct _getopt_data *d) +{ + return _getopt_internal_r (argc, argv, options, long_options, opt_index, + 1, 0, d); +} -#endif /* Not ELIDE_CODE. */ #ifdef TEST #include int -main (argc, argv) - int argc; - char **argv; +main (int argc, char **argv) { int c; int digit_optind = 0; diff -ruN groff-1.19.1/src/libs/libgroff/getopt.c groff-1.19.2/src/libs/libgroff/getopt.c --- groff-1.19.1/src/libs/libgroff/getopt.c 2002-03-28 16:30:36.000000000 +0100 +++ groff-1.19.2/src/libs/libgroff/getopt.c 2005-05-14 09:15:14.000000000 +0200 @@ -2,24 +2,23 @@ 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 drepper@gnu.org before changing it! - Copyright (C) 1987,88,89,90,91,92,93,94,95,96,98,99,2000,2001,2002 - Free Software Foundation, Inc. + Copyright (C) 1987,88,89,90,91,92,93,94,95,96,98,99,2000,2001,2002,2003,2004 + Free Software Foundation, Inc. This file is part of the GNU C Library. - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. + 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. - The GNU C Library is distributed in the hope that it will be useful, + 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 - Lesser General Public License for more details. + 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 Lesser General Public - License along with the GNU C Library; if not, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. */ + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /* This tells Alpha OSF/1 not to define a getopt prototype in . Ditto for AIX 3.2 and . */ @@ -31,35 +30,8 @@ # include #endif -#if !defined __STDC__ || !__STDC__ -/* This is a separate conditional since some stdc systems - reject `defined (const)'. */ -# ifndef const -# define const -# endif -#endif - #include -/* 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 -# 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__ @@ -69,47 +41,43 @@ # include #endif /* GNU C library. */ +#include + #ifdef VMS # include -# if HAVE_STRING_H - 0 -# include -# endif #endif -#ifndef _ -/* This is for other GNU distributions with internationalized messages. */ -# if (HAVE_LIBINTL_H && ENABLE_NLS) || defined _LIBC -# include -# ifndef _ -# define _(msgid) gettext (msgid) -# endif -# else -# define _(msgid) (msgid) -# endif -# if defined _LIBC && defined USE_IN_LIBIO -# include -# endif +#ifdef _LIBC +# include +#else +# include "gettext.h" +# define _(msgid) gettext (msgid) +#endif + +#if defined _LIBC && defined USE_IN_LIBIO +# include #endif #ifndef attribute_hidden # define attribute_hidden #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. +/* Unlike standard Unix `getopt', functions like `getopt_long' + let the user intersperse the options with the other arguments. - As `getopt' works, it permutes the elements of ARGV so that, + As `getopt_long' 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. + Using `getopt' or setting the environment variable POSIXLY_CORRECT + disables permutation. + Then the application's 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" +#include "getopt_int.h" /* For communication from `getopt' to the caller. When `getopt' finds an option that takes an argument, @@ -134,21 +102,6 @@ /* 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 attribute_hidden; - -/* 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. */ @@ -160,57 +113,12 @@ 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. */ +/* Keep a global copy of all internal members of getopt_data. */ -static enum -{ - REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER -} ordering; +static struct _getopt_data getopt_data; -/* 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 -# define my_index strchr -#else - -# if HAVE_STRING_H -# include -# else -# include -# endif +#ifndef __GNU_LIBRARY__ /* Avoid depending on library functions or files whose names are inconsistent. */ @@ -219,43 +127,8 @@ extern char *getenv (); #endif -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__) && !defined strlen -/* 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 /* Stored original parameters. XXX This is no good solution. We should rather copy the args so @@ -269,14 +142,11 @@ # ifdef USE_NONOPTION_FLAGS /* Defined in getopt_init.c */ extern char *__getopt_nonoption_flags; - -static int nonoption_flags_max_len; -static int nonoption_flags_len; # endif # ifdef USE_NONOPTION_FLAGS # define SWAP_FLAGS(ch1, ch2) \ - if (nonoption_flags_len > 0) \ + if (d->__nonoption_flags_len > 0) \ { \ char __tmp = __getopt_nonoption_flags[ch1]; \ __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \ @@ -298,17 +168,12 @@ `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; +exchange (char **argv, struct _getopt_data *d) { - int bottom = first_nonopt; - int middle = last_nonopt; - int top = optind; + int bottom = d->__first_nonopt; + int middle = d->__last_nonopt; + int top = d->optind; char *tem; /* Exchange the shorter segment with the far end of the longer segment. @@ -320,19 +185,19 @@ /* 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) + if (d->__nonoption_flags_len > 0 && top >= d->__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; + d->__nonoption_flags_len = d->__nonoption_flags_max_len = 0; else { memset (__mempcpy (new_str, __getopt_nonoption_flags, - nonoption_flags_max_len), - '\0', top + 1 - nonoption_flags_max_len); - nonoption_flags_max_len = top + 1; + d->__nonoption_flags_max_len), + '\0', top + 1 - d->__nonoption_flags_max_len); + d->__nonoption_flags_max_len = top + 1; __getopt_nonoption_flags = new_str; } } @@ -378,76 +243,71 @@ /* Update records for the slots the non-options now occupy. */ - first_nonopt += (optind - last_nonopt); - last_nonopt = optind; + d->__first_nonopt += (d->optind - d->__last_nonopt); + d->__last_nonopt = d->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; +_getopt_initialize (int argc, char **argv, const char *optstring, + int posixly_correct, struct _getopt_data *d) { /* 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; + d->__first_nonopt = d->__last_nonopt = d->optind; - nextchar = NULL; + d->__nextchar = NULL; - posixly_correct = getenv ("POSIXLY_CORRECT"); + d->__posixly_correct = posixly_correct || !!getenv ("POSIXLY_CORRECT"); /* Determine how to handle the ordering of options and nonoptions. */ if (optstring[0] == '-') { - ordering = RETURN_IN_ORDER; + d->__ordering = RETURN_IN_ORDER; ++optstring; } else if (optstring[0] == '+') { - ordering = REQUIRE_ORDER; + d->__ordering = REQUIRE_ORDER; ++optstring; } - else if (posixly_correct != NULL) - ordering = REQUIRE_ORDER; + else if (d->__posixly_correct) + d->__ordering = REQUIRE_ORDER; else - ordering = PERMUTE; + d->__ordering = PERMUTE; #if defined _LIBC && defined USE_NONOPTION_FLAGS - if (posixly_correct == NULL + if (!d->__posixly_correct && argc == __libc_argc && argv == __libc_argv) { - if (nonoption_flags_max_len == 0) + if (d->__nonoption_flags_max_len == 0) { if (__getopt_nonoption_flags == NULL || __getopt_nonoption_flags[0] == '\0') - nonoption_flags_max_len = -1; + d->__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; + int len = d->__nonoption_flags_max_len = strlen (orig_str); + if (d->__nonoption_flags_max_len < argc) + d->__nonoption_flags_max_len = argc; __getopt_nonoption_flags = - (char *) malloc (nonoption_flags_max_len); + (char *) malloc (d->__nonoption_flags_max_len); if (__getopt_nonoption_flags == NULL) - nonoption_flags_max_len = -1; + d->__nonoption_flags_max_len = -1; else memset (__mempcpy (__getopt_nonoption_flags, orig_str, len), - '\0', nonoption_flags_max_len - len); + '\0', d->__nonoption_flags_max_len - len); } } - nonoption_flags_len = nonoption_flags_max_len; + d->__nonoption_flags_len = d->__nonoption_flags_max_len; } else - nonoption_flags_len = 0; + d->__nonoption_flags_len = 0; #endif return optstring; @@ -495,10 +355,6 @@ `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. @@ -507,32 +363,32 @@ recent call. If LONG_ONLY is nonzero, '-' as well as '--' can introduce - long-named options. */ + long-named options. + + If POSIXLY_CORRECT is nonzero, behave as if the POSIXLY_CORRECT + environment variable were set. */ 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; +_getopt_internal_r (int argc, char **argv, const char *optstring, + const struct option *longopts, int *longind, + int long_only, int posixly_correct, struct _getopt_data *d) { - int print_errors = opterr; + int print_errors = d->opterr; if (optstring[0] == ':') print_errors = 0; if (argc < 1) return -1; - optarg = NULL; + d->optarg = NULL; - if (optind == 0 || !__getopt_initialized) + if (d->optind == 0 || !d->__initialized) { - if (optind == 0) - optind = 1; /* Don't scan ARGV[0], the program name. */ - optstring = _getopt_initialize (argc, argv, optstring); - __getopt_initialized = 1; + if (d->optind == 0) + d->optind = 1; /* Don't scan ARGV[0], the program name. */ + optstring = _getopt_initialize (argc, argv, optstring, + posixly_correct, d); + d->__initialized = 1; } /* Test whether ARGV[optind] points to a non-option argument. @@ -540,40 +396,41 @@ from the shell indicating it is not an option. The later information is only used when the used in the GNU libc. */ #if defined _LIBC && defined USE_NONOPTION_FLAGS -# define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0' \ - || (optind < nonoption_flags_len \ - && __getopt_nonoption_flags[optind] == '1')) +# define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0' \ + || (d->optind < d->__nonoption_flags_len \ + && __getopt_nonoption_flags[d->optind] == '1')) #else -# define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0') +# define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0') #endif - if (nextchar == NULL || *nextchar == '\0') + if (d->__nextchar == NULL || *d->__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 (d->__last_nonopt > d->optind) + d->__last_nonopt = d->optind; + if (d->__first_nonopt > d->optind) + d->__first_nonopt = d->optind; - if (ordering == PERMUTE) + if (d->__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; + if (d->__first_nonopt != d->__last_nonopt + && d->__last_nonopt != d->optind) + exchange ((char **) argv, d); + else if (d->__last_nonopt != d->optind) + d->__first_nonopt = d->optind; /* Skip any additional non-options and extend the range of non-options previously skipped. */ - while (optind < argc && NONOPTION_P) - optind++; - last_nonopt = optind; + while (d->optind < argc && NONOPTION_P) + d->optind++; + d->__last_nonopt = d->optind; } /* The special ARGV-element `--' means premature end of options. @@ -581,28 +438,29 @@ 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], "--")) + if (d->optind != argc && !strcmp (argv[d->optind], "--")) { - optind++; + d->optind++; - if (first_nonopt != last_nonopt && last_nonopt != optind) - exchange ((char **) argv); - else if (first_nonopt == last_nonopt) - first_nonopt = optind; - last_nonopt = argc; + if (d->__first_nonopt != d->__last_nonopt + && d->__last_nonopt != d->optind) + exchange ((char **) argv, d); + else if (d->__first_nonopt == d->__last_nonopt) + d->__first_nonopt = d->optind; + d->__last_nonopt = argc; - optind = argc; + d->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) + if (d->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; + if (d->__first_nonopt != d->__last_nonopt) + d->optind = d->__first_nonopt; return -1; } @@ -611,17 +469,17 @@ if (NONOPTION_P) { - if (ordering == REQUIRE_ORDER) + if (d->__ordering == REQUIRE_ORDER) return -1; - optarg = argv[optind++]; + d->optarg = argv[d->optind++]; return 1; } /* We have found another option-ARGV-element. Skip the initial punctuation. */ - nextchar = (argv[optind] + 1 - + (longopts != NULL && argv[optind][1] == '-')); + d->__nextchar = (argv[d->optind] + 1 + + (longopts != NULL && argv[d->optind][1] == '-')); } /* Decode the current option-ARGV-element. */ @@ -640,8 +498,9 @@ 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]))))) + && (argv[d->optind][1] == '-' + || (long_only && (argv[d->optind][2] + || !strchr (optstring, argv[d->optind][1]))))) { char *nameend; const struct option *p; @@ -651,15 +510,15 @@ int indfound = -1; int option_index; - for (nameend = nextchar; *nameend && *nameend != '='; nameend++) + for (nameend = d->__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 (!strncmp (p->name, d->__nextchar, nameend - d->__nextchar)) { - if ((unsigned int) (nameend - nextchar) + if ((unsigned int) (nameend - d->__nextchar) == (unsigned int) strlen (p->name)) { /* Exact match found. */ @@ -690,37 +549,44 @@ char *buf; if (__asprintf (&buf, _("%s: option `%s' is ambiguous\n"), - argv[0], argv[optind]) >= 0) + argv[0], argv[d->optind]) >= 0) { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + free (buf); } #else fprintf (stderr, _("%s: option `%s' is ambiguous\n"), - argv[0], argv[optind]); + argv[0], argv[d->optind]); #endif } - nextchar += strlen (nextchar); - optind++; - optopt = 0; + d->__nextchar += strlen (d->__nextchar); + d->optind++; + d->optopt = 0; return '?'; } if (pfound != NULL) { option_index = indfound; - optind++; + d->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; + d->optarg = nameend + 1; else { if (print_errors) @@ -730,7 +596,7 @@ int n; #endif - if (argv[optind - 1][1] == '-') + if (argv[d->optind - 1][1] == '-') { /* --option */ #if defined _LIBC && defined USE_IN_LIBIO @@ -749,38 +615,48 @@ #if defined _LIBC && defined USE_IN_LIBIO n = __asprintf (&buf, _("\ %s: option `%c%s' doesn't allow an argument\n"), - argv[0], argv[optind - 1][0], + argv[0], argv[d->optind - 1][0], pfound->name); #else fprintf (stderr, _("\ %s: option `%c%s' doesn't allow an argument\n"), - argv[0], argv[optind - 1][0], pfound->name); + argv[0], argv[d->optind - 1][0], + pfound->name); #endif } #if defined _LIBC && defined USE_IN_LIBIO if (n >= 0) { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 + |= _IO_FLAGS2_NOTCANCEL; + if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + free (buf); } #endif } - nextchar += strlen (nextchar); + d->__nextchar += strlen (d->__nextchar); - optopt = pfound->val; + d->optopt = pfound->val; return '?'; } } else if (pfound->has_arg == 1) { - if (optind < argc) - optarg = argv[optind++]; + if (d->optind < argc) + d->optarg = argv[d->optind++]; else { if (print_errors) @@ -790,27 +666,36 @@ if (__asprintf (&buf, _("\ %s: option `%s' requires an argument\n"), - argv[0], argv[optind - 1]) >= 0) + argv[0], argv[d->optind - 1]) >= 0) { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 + |= _IO_FLAGS2_NOTCANCEL; + if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + free (buf); } #else fprintf (stderr, _("%s: option `%s' requires an argument\n"), - argv[0], argv[optind - 1]); + argv[0], argv[d->optind - 1]); #endif } - nextchar += strlen (nextchar); - optopt = pfound->val; + d->__nextchar += strlen (d->__nextchar); + d->optopt = pfound->val; return optstring[0] == ':' ? ':' : '?'; } } - nextchar += strlen (nextchar); + d->__nextchar += strlen (d->__nextchar); if (longind != NULL) *longind = option_index; if (pfound->flag) @@ -825,8 +710,8 @@ 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 (!long_only || argv[d->optind][1] == '-' + || strchr (optstring, *d->__nextchar) == NULL) { if (print_errors) { @@ -835,15 +720,15 @@ int n; #endif - if (argv[optind][1] == '-') + if (argv[d->optind][1] == '-') { /* --option */ #if defined _LIBC && defined USE_IN_LIBIO n = __asprintf (&buf, _("%s: unrecognized option `--%s'\n"), - argv[0], nextchar); + argv[0], d->__nextchar); #else fprintf (stderr, _("%s: unrecognized option `--%s'\n"), - argv[0], nextchar); + argv[0], d->__nextchar); #endif } else @@ -851,28 +736,36 @@ /* +option or -option */ #if defined _LIBC && defined USE_IN_LIBIO n = __asprintf (&buf, _("%s: unrecognized option `%c%s'\n"), - argv[0], argv[optind][0], nextchar); + argv[0], argv[d->optind][0], d->__nextchar); #else fprintf (stderr, _("%s: unrecognized option `%c%s'\n"), - argv[0], argv[optind][0], nextchar); + argv[0], argv[d->optind][0], d->__nextchar); #endif } #if defined _LIBC && defined USE_IN_LIBIO if (n >= 0) { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; + if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + free (buf); } #endif } - nextchar = (char *) ""; - optind++; - optopt = 0; + d->__nextchar = (char *) ""; + d->optind++; + d->optopt = 0; return '?'; } } @@ -880,12 +773,12 @@ /* Look at and handle the next short option-character. */ { - char c = *nextchar++; - char *temp = my_index (optstring, c); + char c = *d->__nextchar++; + char *temp = strchr (optstring, c); /* Increment `optind' when we start to process its last character. */ - if (*nextchar == '\0') - ++optind; + if (*d->__nextchar == '\0') + ++d->optind; if (temp == NULL || c == ':') { @@ -896,7 +789,7 @@ int n; #endif - if (posixly_correct) + if (d->__posixly_correct) { /* 1003.2 specifies the format of this message. */ #if defined _LIBC && defined USE_IN_LIBIO @@ -919,16 +812,24 @@ #if defined _LIBC && defined USE_IN_LIBIO if (n >= 0) { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; + if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + free (buf); } #endif } - optopt = c; + d->optopt = c; return '?'; } /* Convenience. Treat POSIX -W foo same as long option --foo */ @@ -943,14 +844,14 @@ int option_index; /* This is an option that requires an argument. */ - if (*nextchar != '\0') + if (*d->__nextchar != '\0') { - optarg = nextchar; + d->optarg = d->__nextchar; /* If we end this ARGV-element by taking the rest as an arg, we must advance to the next element now. */ - optind++; + d->optind++; } - else if (optind == argc) + else if (d->optind == argc) { if (print_errors) { @@ -962,11 +863,19 @@ _("%s: option requires an argument -- %c\n"), argv[0], c) >= 0) { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; + if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + free (buf); } #else @@ -974,7 +883,7 @@ argv[0], c); #endif } - optopt = c; + d->optopt = c; if (optstring[0] == ':') c = ':'; else @@ -982,22 +891,23 @@ return c; } else - /* We already incremented `optind' once; + /* We already incremented `d->optind' once; increment it again when taking next ARGV-elt as argument. */ - optarg = argv[optind++]; + d->optarg = argv[d->optind++]; /* optarg is now the argument, see if it's in the table of longopts. */ - for (nextchar = nameend = optarg; *nameend && *nameend != '='; nameend++) + for (d->__nextchar = nameend = d->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 (!strncmp (p->name, d->__nextchar, nameend - d->__nextchar)) { - if ((unsigned int) (nameend - nextchar) == strlen (p->name)) + if ((unsigned int) (nameend - d->__nextchar) == strlen (p->name)) { /* Exact match found. */ pfound = p; @@ -1023,22 +933,30 @@ char *buf; if (__asprintf (&buf, _("%s: option `-W %s' is ambiguous\n"), - argv[0], argv[optind]) >= 0) + argv[0], argv[d->optind]) >= 0) { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; + if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + free (buf); } #else fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"), - argv[0], argv[optind]); + argv[0], argv[d->optind]); #endif } - nextchar += strlen (nextchar); - optind++; + d->__nextchar += strlen (d->__nextchar); + d->optind++; return '?'; } if (pfound != NULL) @@ -1049,7 +967,7 @@ /* 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; + d->optarg = nameend + 1; else { if (print_errors) @@ -1061,11 +979,20 @@ %s: option `-W %s' doesn't allow an argument\n"), argv[0], pfound->name) >= 0) { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 + |= _IO_FLAGS2_NOTCANCEL; + if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + free (buf); } #else @@ -1075,14 +1002,14 @@ #endif } - nextchar += strlen (nextchar); + d->__nextchar += strlen (d->__nextchar); return '?'; } } else if (pfound->has_arg == 1) { - if (optind < argc) - optarg = argv[optind++]; + if (d->optind < argc) + d->optarg = argv[d->optind++]; else { if (print_errors) @@ -1092,26 +1019,35 @@ if (__asprintf (&buf, _("\ %s: option `%s' requires an argument\n"), - argv[0], argv[optind - 1]) >= 0) + argv[0], argv[d->optind - 1]) >= 0) { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 + |= _IO_FLAGS2_NOTCANCEL; + if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + free (buf); } #else fprintf (stderr, _("%s: option `%s' requires an argument\n"), - argv[0], argv[optind - 1]); + argv[0], argv[d->optind - 1]); #endif } - nextchar += strlen (nextchar); + d->__nextchar += strlen (d->__nextchar); return optstring[0] == ':' ? ':' : '?'; } } - nextchar += strlen (nextchar); + d->__nextchar += strlen (d->__nextchar); if (longind != NULL) *longind = option_index; if (pfound->flag) @@ -1121,7 +1057,7 @@ } return pfound->val; } - nextchar = NULL; + d->__nextchar = NULL; return 'W'; /* Let the application handle it. */ } if (temp[1] == ':') @@ -1129,26 +1065,26 @@ if (temp[2] == ':') { /* This is an option that accepts an argument optionally. */ - if (*nextchar != '\0') + if (*d->__nextchar != '\0') { - optarg = nextchar; - optind++; + d->optarg = d->__nextchar; + d->optind++; } else - optarg = NULL; - nextchar = NULL; + d->optarg = NULL; + d->__nextchar = NULL; } else { /* This is an option that requires an argument. */ - if (*nextchar != '\0') + if (*d->__nextchar != '\0') { - optarg = nextchar; + d->optarg = d->__nextchar; /* If we end this ARGV-element by taking the rest as an arg, we must advance to the next element now. */ - optind++; + d->optind++; } - else if (optind == argc) + else if (d->optind == argc) { if (print_errors) { @@ -1160,11 +1096,19 @@ %s: option requires an argument -- %c\n"), argv[0], c) >= 0) { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; + if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + free (buf); } #else @@ -1173,7 +1117,7 @@ argv[0], c); #endif } - optopt = c; + d->optopt = c; if (optstring[0] == ':') c = ':'; else @@ -1182,8 +1126,8 @@ else /* We already incremented `optind' once; increment it again when taking next ARGV-elt as argument. */ - optarg = argv[optind++]; - nextchar = NULL; + d->optarg = argv[d->optind++]; + d->__nextchar = NULL; } } return c; @@ -1191,18 +1135,40 @@ } int -getopt (argc, argv, optstring) - int argc; - char *const *argv; - const char *optstring; +_getopt_internal (int argc, char **argv, const char *optstring, + const struct option *longopts, int *longind, + int long_only, int posixly_correct) +{ + int result; + + getopt_data.optind = optind; + getopt_data.opterr = opterr; + + result = _getopt_internal_r (argc, argv, optstring, longopts, longind, + long_only, posixly_correct, &getopt_data); + + optind = getopt_data.optind; + optarg = getopt_data.optarg; + optopt = getopt_data.optopt; + + return result; +} + +/* glibc gets a LSB-compliant getopt. + Standalone applications get a POSIX-compliant getopt. */ +#if _LIBC +enum { POSIXLY_CORRECT = 0 }; +#else +enum { POSIXLY_CORRECT = 1 }; +#endif + +int +getopt (int argc, char *const *argv, const char *optstring) { - return _getopt_internal (argc, argv, optstring, - (const struct option *) 0, - (int *) 0, - 0); + return _getopt_internal (argc, (char **) argv, optstring, NULL, NULL, 0, + POSIXLY_CORRECT); } -#endif /* Not ELIDE_CODE. */ #ifdef TEST @@ -1210,9 +1176,7 @@ the above definition of `getopt'. */ int -main (argc, argv) - int argc; - char **argv; +main (int argc, char **argv) { int c; int digit_optind = 0; diff -ruN groff-1.19.1/src/libs/libgroff/glyphuni.cpp groff-1.19.2/src/libs/libgroff/glyphuni.cpp --- groff-1.19.1/src/libs/libgroff/glyphuni.cpp 2004-04-08 16:20:14.000000000 +0200 +++ groff-1.19.2/src/libs/libgroff/glyphuni.cpp 2005-05-26 15:37:19.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "lib.h" #include "stringclass.h" diff -ruN groff-1.19.1/src/libs/libgroff/htmlhint.cpp groff-1.19.2/src/libs/libgroff/htmlhint.cpp --- groff-1.19.1/src/libs/libgroff/htmlhint.cpp 2002-02-17 18:05:54.000000000 +0100 +++ groff-1.19.2/src/libs/libgroff/htmlhint.cpp 2005-05-26 15:37:19.000000000 +0200 @@ -15,7 +15,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "lib.h" diff -ruN groff-1.19.1/src/libs/libgroff/hypot.cpp groff-1.19.2/src/libs/libgroff/hypot.cpp --- groff-1.19.1/src/libs/libgroff/hypot.cpp 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/libs/libgroff/hypot.cpp 2005-03-18 07:56:01.000000000 +0100 @@ -0,0 +1,40 @@ +/* Copyright (C) 2005 Free Software Foundation, Inc. +This file is part of the GNU C Library. + +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., 675 Mass Ave, +Cambridge, MA 02139, USA. */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#ifdef NEED_DECLARATION_HYPOT + double hypot(double, double); +#endif /* NEED_DECLARATION_HYPOT */ + +double groff_hypot(double x, double y) +{ + double result = hypot(x, y); + +#ifdef __INTERIX + /* hypot() on Interix is broken */ + if (isnan(result) && !isnan(x) && !isnan(y)) + return 0.0; +#endif + + return result; +} diff -ruN groff-1.19.1/src/libs/libgroff/iftoa.c groff-1.19.2/src/libs/libgroff/iftoa.c --- groff-1.19.1/src/libs/libgroff/iftoa.c 2004-04-08 07:30:18.000000000 +0200 +++ groff-1.19.2/src/libs/libgroff/iftoa.c 2005-05-26 15:37:19.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #define INT_DIGITS 19 /* enough for 64-bit integer */ diff -ruN groff-1.19.1/src/libs/libgroff/invalid.cpp groff-1.19.2/src/libs/libgroff/invalid.cpp --- groff-1.19.1/src/libs/libgroff/invalid.cpp 2002-02-11 11:46:55.000000000 +0100 +++ groff-1.19.2/src/libs/libgroff/invalid.cpp 2005-05-26 15:37:19.000000000 +0200 @@ -15,7 +15,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "lib.h" diff -ruN groff-1.19.1/src/libs/libgroff/itoa.c groff-1.19.2/src/libs/libgroff/itoa.c --- groff-1.19.1/src/libs/libgroff/itoa.c 2004-04-08 07:24:34.000000000 +0200 +++ groff-1.19.2/src/libs/libgroff/itoa.c 2005-05-26 15:37:19.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #define INT_DIGITS 19 /* enough for 64 bit integer */ #define UINT_DIGITS 20 diff -ruN groff-1.19.1/src/libs/libgroff/lf.cpp groff-1.19.2/src/libs/libgroff/lf.cpp --- groff-1.19.1/src/libs/libgroff/lf.cpp 2000-02-06 10:37:15.000000000 +0100 +++ groff-1.19.2/src/libs/libgroff/lf.cpp 2005-05-26 15:37:19.000000000 +0200 @@ -1,5 +1,5 @@ // -*- C++ -*- -/* Copyright (C) 1989, 1990, 1991, 1992 Free Software Foundation, Inc. +/* Copyright (C) 1989, 1990, 1991, 1992, 2004 Free Software Foundation, Inc. Written by James Clark (jjc@jclark.com) This file is part of groff. @@ -16,10 +16,11 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ -#include #include + +#include "lib.h" #include "cset.h" #include "stringclass.h" diff -ruN groff-1.19.1/src/libs/libgroff/macropath.cpp groff-1.19.2/src/libs/libgroff/macropath.cpp --- groff-1.19.1/src/libs/libgroff/macropath.cpp 2000-11-22 23:11:21.000000000 +0100 +++ groff-1.19.2/src/libs/libgroff/macropath.cpp 2005-05-26 15:37:19.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "lib.h" #include "searchpath.h" diff -ruN groff-1.19.1/src/libs/libgroff/Makefile.sub groff-1.19.2/src/libs/libgroff/Makefile.sub --- groff-1.19.1/src/libs/libgroff/Makefile.sub 2004-02-21 22:16:47.000000000 +0100 +++ groff-1.19.2/src/libs/libgroff/Makefile.sub 2005-06-23 09:25:35.000000000 +0200 @@ -1,4 +1,5 @@ LIB=groff +EXTRA_CFLAGS=-D__GETOPT_PREFIX=groff_ OBJS=\ assert.$(OBJEXT) \ change_lf.$(OBJEXT) \ @@ -17,6 +18,7 @@ getopt1.$(OBJEXT) \ glyphuni.$(OBJEXT) \ htmlhint.$(OBJEXT) \ + hypot.$(OBJEXT) \ iftoa.$(OBJEXT) \ invalid.$(OBJEXT) \ itoa.$(OBJEXT) \ @@ -25,6 +27,7 @@ macropath.$(OBJEXT) \ matherr.$(OBJEXT) \ maxfilename.$(OBJEXT) \ + maxpathname.$(OBJEXT) \ mksdir.$(OBJEXT) \ nametoindex.$(OBJEXT) \ new.$(OBJEXT) \ @@ -33,6 +36,7 @@ progname.$(OBJEXT) \ ptable.$(OBJEXT) \ quotearg.$(OBJEXT) \ + relocate.$(OBJEXT) \ searchpath.$(OBJEXT) \ spawnvp.$(OBJEXT) \ string.$(OBJEXT) \ @@ -61,11 +65,13 @@ $(srcdir)/geometry.cpp \ $(srcdir)/glyphuni.cpp \ $(srcdir)/htmlhint.cpp \ + $(srcdir)/hypot.cpp \ $(srcdir)/invalid.cpp \ $(srcdir)/lf.cpp \ $(srcdir)/lineno.cpp \ $(srcdir)/macropath.cpp \ $(srcdir)/maxfilename.cpp \ + $(srcdir)/maxpathname.cpp \ $(srcdir)/mksdir.cpp \ $(srcdir)/mkstemp.cpp \ $(srcdir)/nametoindex.cpp \ @@ -73,6 +79,7 @@ $(srcdir)/paper.cpp \ $(srcdir)/prime.cpp \ $(srcdir)/ptable.cpp \ + $(srcdir)/relocate.cpp \ $(srcdir)/searchpath.cpp \ $(srcdir)/string.cpp \ $(srcdir)/strsave.cpp \ diff -ruN groff-1.19.1/src/libs/libgroff/matherr.c groff-1.19.2/src/libs/libgroff/matherr.c --- groff-1.19.1/src/libs/libgroff/matherr.c 2001-08-19 23:32:28.000000000 +0200 +++ groff-1.19.2/src/libs/libgroff/matherr.c 2005-05-26 15:37:19.000000000 +0200 @@ -15,7 +15,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H #include diff -ruN groff-1.19.1/src/libs/libgroff/maxfilename.cpp groff-1.19.2/src/libs/libgroff/maxfilename.cpp --- groff-1.19.1/src/libs/libgroff/maxfilename.cpp 2003-04-04 14:07:26.000000000 +0200 +++ groff-1.19.2/src/libs/libgroff/maxfilename.cpp 2005-05-26 15:37:19.000000000 +0200 @@ -1,5 +1,5 @@ // -*- C++ -*- -/* Copyright (C) 1992, 2001, 2003 Free Software Foundation, Inc. +/* Copyright (C) 1992, 2001, 2003, 2005 Free Software Foundation, Inc. Written by James Clark (jjc@jclark.com) This file is part of groff. @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ /* file_name_max(dir) does the same as pathconf(dir, _PC_NAME_MAX) */ @@ -37,10 +37,6 @@ #else /* not _POSIX_VERSION */ -#ifdef HAVE_CC_LIMITS_H -#include -#endif /* HAVE_CC_LIMITS_H */ - #ifdef HAVE_DIRENT_H #include #else /* not HAVE_DIRENT_H */ diff -ruN groff-1.19.1/src/libs/libgroff/maxpathname.cpp groff-1.19.2/src/libs/libgroff/maxpathname.cpp --- groff-1.19.1/src/libs/libgroff/maxpathname.cpp 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/libs/libgroff/maxpathname.cpp 2005-05-26 15:37:19.000000000 +0200 @@ -0,0 +1,71 @@ +// -*- C++ -*- +/* Copyright (C) 2005 Free Software Foundation, Inc. + Written by Werner Lemberg (wl@gnu.org) + +This file is part of groff. + +groff 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. + +groff 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 groff; see the file COPYING. If not, write to the Free Software +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* path_name_max(dir) does the same as pathconf(dir, _PC_PATH_MAX) */ + +#include "lib.h" + +#include + +#ifdef HAVE_UNISTD_H +#include +#endif /* HAVE_UNISTD_H */ + +#ifdef _POSIX_VERSION + +size_t path_name_max() +{ + return pathconf("/", _PC_PATH_MAX) < 1 ? 1024 : pathconf("/",_PC_PATH_MAX); +} + +#else /* not _POSIX_VERSION */ + +#include + +#ifdef HAVE_DIRENT_H +# include +#else /* not HAVE_DIRENT_H */ +# ifdef HAVE_SYS_DIR_H +# include +# endif /* HAVE_SYS_DIR_H */ +#endif /* not HAVE_DIRENT_H */ + +#ifndef PATH_MAX +# ifdef MAXPATHLEN +# define PATH_MAX MAXPATHLEN +# else /* !MAXPATHLEN */ +# ifdef MAX_PATH +# define PATH_MAX MAX_PATH +# else /* !MAX_PATH */ +# ifdef _MAX_PATH +# define PATH_MAX _MAX_PATH +# else /* !_MAX_PATH */ +# define PATH_MAX 255 +# endif /* !_MAX_PATH */ +# endif /* !MAX_PATH */ +# endif /* !MAXPATHLEN */ +#endif /* !PATH_MAX */ + +size_t path_name_max() +{ + return PATH_MAX; +} + +#endif /* not _POSIX_VERSION */ diff -ruN groff-1.19.1/src/libs/libgroff/mksdir.cpp groff-1.19.2/src/libs/libgroff/mksdir.cpp --- groff-1.19.1/src/libs/libgroff/mksdir.cpp 2001-07-20 16:36:55.000000000 +0200 +++ groff-1.19.2/src/libs/libgroff/mksdir.cpp 2005-05-26 15:37:19.000000000 +0200 @@ -15,7 +15,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ /* This file is heavily based on the file mkstemp.c which is part of the diff -ruN groff-1.19.1/src/libs/libgroff/mkstemp.cpp groff-1.19.2/src/libs/libgroff/mkstemp.cpp --- groff-1.19.1/src/libs/libgroff/mkstemp.cpp 2001-07-20 16:36:55.000000000 +0200 +++ groff-1.19.2/src/libs/libgroff/mkstemp.cpp 2005-05-26 15:37:19.000000000 +0200 @@ -15,7 +15,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ /* This file is heavily based on the file mkstemp.c which is part of the diff -ruN groff-1.19.1/src/libs/libgroff/nametoindex.cpp groff-1.19.2/src/libs/libgroff/nametoindex.cpp --- groff-1.19.1/src/libs/libgroff/nametoindex.cpp 2004-04-07 16:28:07.000000000 +0200 +++ groff-1.19.2/src/libs/libgroff/nametoindex.cpp 2005-05-26 15:37:19.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "lib.h" diff -ruN groff-1.19.1/src/libs/libgroff/new.cpp groff-1.19.2/src/libs/libgroff/new.cpp --- groff-1.19.1/src/libs/libgroff/new.cpp 2004-02-21 22:20:08.000000000 +0100 +++ groff-1.19.2/src/libs/libgroff/new.cpp 2005-05-26 15:37:19.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "lib.h" diff -ruN groff-1.19.1/src/libs/libgroff/paper.cpp groff-1.19.2/src/libs/libgroff/paper.cpp --- groff-1.19.1/src/libs/libgroff/paper.cpp 2004-04-07 16:31:57.000000000 +0200 +++ groff-1.19.2/src/libs/libgroff/paper.cpp 2005-05-26 15:37:19.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "lib.h" #include "paper.h" diff -ruN groff-1.19.1/src/libs/libgroff/ptable.cpp groff-1.19.2/src/libs/libgroff/ptable.cpp --- groff-1.19.1/src/libs/libgroff/ptable.cpp 2000-02-06 10:37:15.000000000 +0100 +++ groff-1.19.2/src/libs/libgroff/ptable.cpp 2005-05-26 15:37:19.000000000 +0200 @@ -15,7 +15,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "ptable.h" #include "errarg.h" diff -ruN groff-1.19.1/src/libs/libgroff/quotearg.c groff-1.19.2/src/libs/libgroff/quotearg.c --- groff-1.19.1/src/libs/libgroff/quotearg.c 2004-04-08 13:39:01.000000000 +0200 +++ groff-1.19.2/src/libs/libgroff/quotearg.c 2005-05-26 15:37:19.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include diff -ruN groff-1.19.1/src/libs/libgroff/relocate.cpp groff-1.19.2/src/libs/libgroff/relocate.cpp --- groff-1.19.1/src/libs/libgroff/relocate.cpp 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/libs/libgroff/relocate.cpp 2005-05-26 15:37:19.000000000 +0200 @@ -0,0 +1,238 @@ +// -*- C++ -*- +/* Provide relocation for macro and font files. + Copyright (C) 2005 Free Software Foundation, Inc. + + This program 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, 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, + USA. */ + +// Made after relocation code in kpathsea and gettext. + +#include "lib.h" + +#include +#include + +#include "defs.h" +#include "posix.h" +#include "nonposix.h" +#include "relocate.h" + +#if defined _WIN32 +# define WIN32_LEAN_AND_MEAN +# include +#endif + +#define INSTALLPATHLEN (sizeof(INSTALLPATH) - 1) +#ifndef DEBUG +# define DEBUG 0 +#endif + +extern "C" const char *program_name; + +// The prefix (parent directory) corresponding to the binary. +char *curr_prefix = 0; +size_t curr_prefix_len = 0; + +// Return the directory part of a filename, or `.' if no path separators. +char *xdirname(char *s) +{ + static const char dot[] = "."; + if (!s) + return 0; + // DIR_SEPS[] are possible directory separator characters, see nonposix.h. + // We want the rightmost separator of all possible ones. + // Example: d:/foo\\bar. + char *p = strrchr(s, DIR_SEPS[0]); + const char *sep = &DIR_SEPS[1]; + while (*sep) { + char *p1 = strrchr(s, *sep); + if (p1 && (!p || p1 > p)) + p = p1; + sep++; + } + if (p) + *p = '\0'; + else + s = (char *)dot; + return s; +} + +// Return the full path of NAME along the path PATHP. +// Adapted from search_path::open_file in searchpath.cpp. +char *searchpath(const char *name, const char *pathp) +{ + char *path; + if (!name || !*name) + return 0; +#if DEBUG + fprintf(stderr, "searchpath: pathp: `%s'\n", pathp); + fprintf(stderr, "searchpath: trying `%s'\n", name); +#endif + // Try first NAME as such; success if NAME is an absolute filename, + // or if NAME is found in the current directory. + if (!access (name, F_OK)) { + path = new char[path_name_max()]; +#ifdef _WIN32 + path = _fullpath(path, name, path_name_max()); +#else + path = realpath(name, path); +#endif +#if DEBUG + fprintf(stderr, "searchpath: found `%s'\n", path); +#endif + return path; + } + // Secondly, try the current directory. + // Now search along PATHP. + size_t namelen = strlen(name); + char *p = (char *)pathp; + for (;;) { + char *end = strchr(p, PATH_SEP_CHAR); + if (!end) + end = strchr(p, '\0'); + int need_slash = end > p && strchr(DIR_SEPS, end[-1]) == 0; + path = new char[end - p + need_slash + namelen + 1]; + memcpy(path, p, end - p); + if (need_slash) + path[end - p] = '/'; + strcpy(path + (end - p) + need_slash, name); +#if DEBUG + fprintf(stderr, "searchpath: trying `%s'\n", path); +#endif + if (!access(path, F_OK)) { +#if DEBUG + fprintf(stderr, "searchpath: found `%s'\n", name); +#endif + return path; + } + a_delete path; + if (*end == '\0') + break; + p = end + 1; + } + return 0; +} + +// Search NAME along PATHP with the elements of PATHEXT in turn added. +char *searchpathext(const char *name, const char *pathext, const char *pathp) +{ + char *found = 0; + char *tmpathext = strsave(pathext); // strtok modifies this string, + // so make a copy + char *ext = strtok(tmpathext, PATH_SEP); + while (ext) { + char *namex = new char[strlen(name) + strlen(ext) + 1]; + strcpy(namex, name); + strcat(namex, ext); + found = searchpath(namex, pathp); + a_delete namex; + if (found) + break; + ext = strtok(0, PATH_SEP); + } + a_delete tmpathext; + return found; +} + +// Convert an MS path to a POSIX path. +char *msw2posixpath(char *path) +{ + char *s = path; + while (*s) { + if (*s == '\\') + *s = '/'; + *s++; + } + return path; +} + +// Compute the current prefix. +void set_current_prefix() +{ + char *pathextstr; + curr_prefix = new char[path_name_max()]; + // Obtain the full path of the current binary; + // using GetModuleFileName on MS-Windows, + // and searching along PATH on other systems. +#ifdef _WIN32 + int len = GetModuleFileName(0, curr_prefix, path_name_max()); + if (len) + len = GetShortPathName(curr_prefix, curr_prefix, path_name_max()); +# if DEBUG + fprintf(stderr, "curr_prefix: %s\n", curr_prefix); +# endif /* DEBUG */ +#else /* !_WIN32 */ + curr_prefix = searchpath(program_name, getenv("PATH")); + if (!curr_prefix && !strchr(program_name, '.')) { // try with extensions + pathextstr = strsave(getenv("PATHEXT")); + if (!pathextstr) + pathextstr = strsave(PATH_EXT); + curr_prefix = searchpathext(program_name, pathextstr, getenv("PATH")); + a_delete pathextstr; + } + if (!curr_prefix) + return; +#endif /* !_WIN32 */ + msw2posixpath(curr_prefix); +#if DEBUG + fprintf(stderr, "curr_prefix: %s\n", curr_prefix); +#endif + curr_prefix = xdirname(curr_prefix); // directory of executable + curr_prefix = xdirname(curr_prefix); // parent directory of executable + curr_prefix_len = strlen(curr_prefix); +#if DEBUG + fprintf(stderr, "curr_prefix: %s\n", curr_prefix); + fprintf(stderr, "curr_prefix_len: %d\n", curr_prefix_len); +#endif +} + +// Strip the installation prefix and replace it +// with the current installation prefix; return the relocated path. +char *relocatep(const char *path) +{ +#if DEBUG + fprintf(stderr, "relocatep: path = %s\n", path); + fprintf(stderr, "relocatep: INSTALLPATH = %s\n", INSTALLPATH); + fprintf(stderr, "relocatep: INSTALLPATHLEN = %d\n", INSTALLPATHLEN); +#endif + if (!curr_prefix) + set_current_prefix(); + if (strncmp(INSTALLPATH, path, INSTALLPATHLEN)) + return strsave(path); + char *relative_path = (char *)path + INSTALLPATHLEN; + size_t relative_path_len = strlen(relative_path); + char *relocated_path = new char[curr_prefix_len + relative_path_len + 1]; + strcpy(relocated_path, curr_prefix); + strcat(relocated_path, relative_path); +#if DEBUG + fprintf(stderr, "relocated_path: %s\n", relocated_path); +#endif /* DEBUG */ + return relocated_path; +} + +// Return the original pathname if it exists; +// otherwise return the relocated path. +char *relocate(const char *path) +{ + char *p; + if (access(path, F_OK)) + p = relocatep(path); + else + p = strsave(path); +#if DEBUG + fprintf (stderr, "relocate: %s\n", p); +#endif + return p; +} diff -ruN groff-1.19.1/src/libs/libgroff/searchpath.cpp groff-1.19.2/src/libs/libgroff/searchpath.cpp --- groff-1.19.1/src/libs/libgroff/searchpath.cpp 2003-12-06 13:28:56.000000000 +0100 +++ groff-1.19.2/src/libs/libgroff/searchpath.cpp 2005-05-26 15:37:19.000000000 +0200 @@ -1,5 +1,5 @@ // -*- C++ -*- -/* Copyright (C) 1989, 1990, 1991, 1992, 2000, 2001, 2003 +/* Copyright (C) 1989, 1990, 1991, 1992, 2000, 2001, 2003, 2005 Free Software Foundation, Inc. Written by James Clark (jjc@jclark.com) @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "lib.h" @@ -28,6 +28,12 @@ #include "searchpath.h" #include "nonposix.h" +#ifdef _WIN32 +# include "relocate.h" +#else +# define relocate(path) strsave(path) +#endif + search_path::search_path(const char *envvar, const char *standard, int add_home, int add_current) { @@ -108,11 +114,16 @@ if (!end) end = strchr(p, '\0'); int need_slash = end > p && strchr(DIR_SEPS, end[-1]) == 0; - char *path = new char[(end - p) + need_slash + namelen + 1]; - memcpy(path, p, end - p); + char *origpath = new char[(end - p) + need_slash + namelen + 1]; + memcpy(origpath, p, end - p); if (need_slash) - path[end - p] = '/'; - strcpy(path + (end - p) + need_slash, name); + origpath[end - p] = '/'; + strcpy(origpath + (end - p) + need_slash, name); +#if 0 + fprintf(stderr, "origpath `%s'\n", origpath); +#endif + char *path = relocate(origpath); + a_delete origpath; #if 0 fprintf(stderr, "trying `%s'\n", path); #endif @@ -160,11 +171,16 @@ if (!end) end = strchr(p, '\0'); int need_slash = end > p && strchr(DIR_SEPS, end[-1]) == 0; - char *path = new char[(end - p) + need_slash + namelen + 1]; - memcpy(path, p, end - p); + char *origpath = new char[(end - p) + need_slash + namelen + 1]; + memcpy(origpath, p, end - p); if (need_slash) - path[end - p] = '/'; - strcpy(path + (end - p) + need_slash, name); + origpath[end - p] = '/'; + strcpy(origpath + (end - p) + need_slash, name); +#if 0 + fprintf(stderr, "origpath `%s'\n", origpath); +#endif + char *path = relocate(origpath); + a_delete origpath; #if 0 fprintf(stderr, "trying `%s'\n", path); #endif diff -ruN groff-1.19.1/src/libs/libgroff/spawnvp.c groff-1.19.2/src/libs/libgroff/spawnvp.c --- groff-1.19.1/src/libs/libgroff/spawnvp.c 2004-04-08 07:05:38.000000000 +0200 +++ groff-1.19.2/src/libs/libgroff/spawnvp.c 2005-05-26 15:37:19.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include "config.h" diff -ruN groff-1.19.1/src/libs/libgroff/strcasecmp.c groff-1.19.2/src/libs/libgroff/strcasecmp.c --- groff-1.19.1/src/libs/libgroff/strcasecmp.c 2003-06-04 21:22:29.000000000 +0200 +++ groff-1.19.2/src/libs/libgroff/strcasecmp.c 2005-05-26 15:37:19.000000000 +0200 @@ -13,7 +13,7 @@ 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. */ + Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #if HAVE_CONFIG_H # include diff -ruN groff-1.19.1/src/libs/libgroff/strerror.c groff-1.19.2/src/libs/libgroff/strerror.c --- groff-1.19.1/src/libs/libgroff/strerror.c 2003-07-22 16:41:07.000000000 +0200 +++ groff-1.19.2/src/libs/libgroff/strerror.c 2005-05-26 15:37:19.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H #include diff -ruN groff-1.19.1/src/libs/libgroff/string.cpp groff-1.19.2/src/libs/libgroff/string.cpp --- groff-1.19.1/src/libs/libgroff/string.cpp 2002-09-09 17:15:15.000000000 +0200 +++ groff-1.19.2/src/libs/libgroff/string.cpp 2005-05-26 15:37:19.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "lib.h" diff -ruN groff-1.19.1/src/libs/libgroff/strsave.cpp groff-1.19.2/src/libs/libgroff/strsave.cpp --- groff-1.19.1/src/libs/libgroff/strsave.cpp 2000-02-06 10:37:16.000000000 +0100 +++ groff-1.19.2/src/libs/libgroff/strsave.cpp 2005-05-26 15:37:19.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include diff -ruN groff-1.19.1/src/libs/libgroff/strtol.c groff-1.19.2/src/libs/libgroff/strtol.c --- groff-1.19.1/src/libs/libgroff/strtol.c 2001-08-19 23:32:28.000000000 +0200 +++ groff-1.19.2/src/libs/libgroff/strtol.c 2005-05-26 15:37:19.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H #include diff -ruN groff-1.19.1/src/libs/libgroff/symbol.cpp groff-1.19.2/src/libs/libgroff/symbol.cpp --- groff-1.19.1/src/libs/libgroff/symbol.cpp 2004-01-07 00:26:51.000000000 +0100 +++ groff-1.19.2/src/libs/libgroff/symbol.cpp 2005-05-26 15:37:19.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "lib.h" diff -ruN groff-1.19.1/src/libs/libgroff/tmpfile.cpp groff-1.19.2/src/libs/libgroff/tmpfile.cpp --- groff-1.19.1/src/libs/libgroff/tmpfile.cpp 2003-10-21 11:32:49.000000000 +0200 +++ groff-1.19.2/src/libs/libgroff/tmpfile.cpp 2005-05-26 15:37:19.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "lib.h" diff -ruN groff-1.19.1/src/libs/libgroff/tmpname.cpp groff-1.19.2/src/libs/libgroff/tmpname.cpp --- groff-1.19.1/src/libs/libgroff/tmpname.cpp 2003-04-04 13:52:55.000000000 +0200 +++ groff-1.19.2/src/libs/libgroff/tmpname.cpp 2005-05-26 15:37:19.000000000 +0200 @@ -1,4 +1,4 @@ -/* Copyright (C) 2001, 2003 Free Software Foundation, Inc. +/* Copyright (C) 2001, 2003, 2004 Free Software Foundation, Inc. Written by Werner Lemberg (wl@gnu.org) This file is part of groff. @@ -15,7 +15,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ /* This file is heavily based on the function __gen_tempname() in the @@ -48,8 +48,8 @@ #endif #endif -#if HAVE_CC_STDINT_H -# include +#if HAVE_CC_INTTYPES_H +# include #endif /* Use the widest available unsigned type if uint64_t is not diff -ruN groff-1.19.1/src/libs/libgroff/unicode.cpp groff-1.19.2/src/libs/libgroff/unicode.cpp --- groff-1.19.1/src/libs/libgroff/unicode.cpp 2002-11-02 18:30:13.000000000 +0100 +++ groff-1.19.2/src/libs/libgroff/unicode.cpp 2005-05-26 15:37:19.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "lib.h" #include "cset.h" diff -ruN groff-1.19.1/src/libs/libgroff/uniglyph.cpp groff-1.19.2/src/libs/libgroff/uniglyph.cpp --- groff-1.19.1/src/libs/libgroff/uniglyph.cpp 2004-04-08 16:21:18.000000000 +0200 +++ groff-1.19.2/src/libs/libgroff/uniglyph.cpp 2005-05-26 15:37:19.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "lib.h" #include "stringclass.h" diff -ruN groff-1.19.1/src/libs/libgroff/uniuni.cpp groff-1.19.2/src/libs/libgroff/uniuni.cpp --- groff-1.19.1/src/libs/libgroff/uniuni.cpp 2004-04-08 16:21:47.000000000 +0200 +++ groff-1.19.2/src/libs/libgroff/uniuni.cpp 2005-05-26 15:37:19.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ // This code has been algorithmically derived from the file // UnicodeData-3.2.0.txt, available from unicode.org. diff -ruN groff-1.19.1/src/libs/libxutil/DviChar.c groff-1.19.2/src/libs/libxutil/DviChar.c --- groff-1.19.1/src/libs/libxutil/DviChar.c 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/libs/libxutil/DviChar.c 2004-06-01 12:40:56.000000000 +0200 @@ -0,0 +1,658 @@ +/* + * DviChar.c + * + * Map DVI (ditroff output) character names to + * font indexes and back + */ + +#include +#include +#include "DviChar.h" + +extern char *xmalloc(int); + +#define allocHash() ((DviCharNameHash *) xmalloc (sizeof (DviCharNameHash))) + +struct map_list { + struct map_list *next; + DviCharNameMap *map; +}; + +static struct map_list *world; + +static int standard_maps_loaded = 0; +static void load_standard_maps (void); +static int hash_name (const char *); +static void dispose_hash(DviCharNameMap *); +static void compute_hash(DviCharNameMap *); + +DviCharNameMap * +DviFindMap (char *encoding) +{ + struct map_list *m; + + if (!standard_maps_loaded) + load_standard_maps (); + for (m = world; m; m=m->next) + if (!strcmp (m->map->encoding, encoding)) + return m->map; + return 0; +} + +void +DviRegisterMap (DviCharNameMap *map) +{ + struct map_list *m; + + if (!standard_maps_loaded) + load_standard_maps (); + for (m = world; m; m = m->next) + if (!strcmp (m->map->encoding, map->encoding)) + break; + if (!m) { + m = (struct map_list *) xmalloc (sizeof *m); + m->next = world; + world = m; + } + dispose_hash (map); + m->map = map; + compute_hash (map); +} + +static void +dispose_hash (DviCharNameMap *map) +{ + DviCharNameHash **buckets; + DviCharNameHash *h, *next; + int i; + + buckets = map->buckets; + for (i = 0; i < DVI_HASH_SIZE; i++) { + for (h = buckets[i]; h; h=next) { + next = h->next; + free (h); + } + } +} + +static int +hash_name (const char *name) +{ + int i = 0; + + while (*name) + i = (i << 1) ^ *name++; + if (i < 0) + i = -i; + return i; +} + +static void +compute_hash (DviCharNameMap *map) +{ + DviCharNameHash **buckets; + int c, s, i; + DviCharNameHash *h; + + buckets = map->buckets; + for (i = 0; i < DVI_HASH_SIZE; i++) + buckets[i] = 0; + for (c = 0; c < DVI_MAP_SIZE; c++) + for (s = 0; s < DVI_MAX_SYNONYMS; s++) { + if (!map->dvi_names[c][s]) + break; + i = hash_name (map->dvi_names[c][s]) % DVI_HASH_SIZE; + h = allocHash (); + h->next = buckets[i]; + buckets[i] = h; + h->name = map->dvi_names[c][s]; + h->position = c; + } + +} + +int +DviCharIndex (DviCharNameMap *map, const char *name) +{ + int i; + DviCharNameHash *h; + + i = hash_name (name) % DVI_HASH_SIZE; + for (h = map->buckets[i]; h; h=h->next) + if (!strcmp (h->name, name)) + return h->position; + return -1; +} + +static DviCharNameMap ISO8859_1_map = { + "iso8859-1", + 0, +{ +{ 0, /* 0 */}, +{ 0, /* 1 */}, +{ 0, /* 2 */}, +{ 0, /* 3 */}, +{ 0, /* 4 */}, +{ 0, /* 5 */}, +{ 0, /* 6 */}, +{ 0, /* 7 */}, +{ 0, /* 8 */}, +{ 0, /* 9 */}, +{ 0, /* 10 */}, +{ 0, /* 11 */}, +{ 0, /* 12 */}, +{ 0, /* 13 */}, +{ 0, /* 14 */}, +{ 0, /* 15 */}, +{ 0, /* 16 */}, +{ 0, /* 17 */}, +{ 0, /* 18 */}, +{ 0, /* 19 */}, +{ 0, /* 20 */}, +{ 0, /* 21 */}, +{ 0, /* 22 */}, +{ 0, /* 23 */}, +{ 0, /* 24 */}, +{ 0, /* 25 */}, +{ 0, /* 26 */}, +{ 0, /* 27 */}, +{ 0, /* 28 */}, +{ 0, /* 29 */}, +{ 0, /* 30 */}, +{ 0, /* 31 */}, +{ 0, /* 32 */}, +{ "!", /* 33 */}, +{ "\"", "dq", /* 34 */}, +{ "#", "sh", /* 35 */}, +{ "$", "Do", /* 36 */}, +{ "%", /* 37 */}, +{ "&", /* 38 */}, +{ "'", "cq", /* 39 */}, +{ "(", /* 40 */}, +{ ")", /* 41 */}, +{ "*", /* 42 */}, +{ "+", /* 43 */}, +{ ",", /* 44 */}, +{ "\\-", /* 45 */}, +{ ".", /* 46 */}, +{ "/", "sl", /* 47 */}, +{ "0", /* 48 */}, +{ "1", /* 49 */}, +{ "2", /* 50 */}, +{ "3", /* 51 */}, +{ "4", /* 52 */}, +{ "5", /* 53 */}, +{ "6", /* 54 */}, +{ "7", /* 55 */}, +{ "8", /* 56 */}, +{ "9", /* 57 */}, +{ ":", /* 58 */}, +{ ";", /* 59 */}, +{ "<", /* 60 */}, +{ "=", /* 61 */}, +{ ">", /* 62 */}, +{ "?", /* 63 */}, +{ "@", "at", /* 64 */}, +{ "A", /* 65 */}, +{ "B", /* 66 */}, +{ "C", /* 67 */}, +{ "D", /* 68 */}, +{ "E", /* 69 */}, +{ "F", /* 70 */}, +{ "G", /* 71 */}, +{ "H", /* 72 */}, +{ "I", /* 73 */}, +{ "J", /* 74 */}, +{ "K", /* 75 */}, +{ "L", /* 76 */}, +{ "M", /* 77 */}, +{ "N", /* 78 */}, +{ "O", /* 79 */}, +{ "P", /* 80 */}, +{ "Q", /* 81 */}, +{ "R", /* 82 */}, +{ "S", /* 83 */}, +{ "T", /* 84 */}, +{ "U", /* 85 */}, +{ "V", /* 86 */}, +{ "W", /* 87 */}, +{ "X", /* 88 */}, +{ "Y", /* 89 */}, +{ "Z", /* 90 */}, +{ "[", "lB", /* 91 */}, +{ "\\", "rs", /* 92 */}, +{ "]", "rB", /* 93 */}, +{ "^", "a^", "ha", /* 94 */}, +{ "_", /* 95 */}, +{ "`", "oq", /* 96 */}, +{ "a", /* 97 */}, +{ "b", /* 98 */}, +{ "c", /* 99 */}, +{ "d", /* 100 */}, +{ "e", /* 101 */}, +{ "f", /* 102 */}, +{ "g", /* 103 */}, +{ "h", /* 104 */}, +{ "i", /* 105 */}, +{ "j", /* 106 */}, +{ "k", /* 107 */}, +{ "l", /* 108 */}, +{ "m", /* 109 */}, +{ "n", /* 110 */}, +{ "o", /* 111 */}, +{ "p", /* 112 */}, +{ "q", /* 113 */}, +{ "r", /* 114 */}, +{ "s", /* 115 */}, +{ "t", /* 116 */}, +{ "u", /* 117 */}, +{ "v", /* 118 */}, +{ "w", /* 119 */}, +{ "x", /* 120 */}, +{ "y", /* 121 */}, +{ "z", /* 122 */}, +{ "{", "lC", /* 123 */}, +{ "|", "ba", /* 124 */}, +{ "}", "rC", /* 125 */}, +{ "~", "a~", "ti", /* 126 */}, +{ 0, /* 127 */}, +{ 0, /* 128 */}, +{ 0, /* 129 */}, +{ 0, /* 130 */}, +{ 0, /* 131 */}, +{ 0, /* 132 */}, +{ 0, /* 133 */}, +{ 0, /* 134 */}, +{ 0, /* 135 */}, +{ 0, /* 136 */}, +{ 0, /* 137 */}, +{ 0, /* 138 */}, +{ 0, /* 139 */}, +{ 0, /* 140 */}, +{ 0, /* 141 */}, +{ 0, /* 142 */}, +{ 0, /* 143 */}, +{ 0, /* 144 */}, +{ 0, /* 145 */}, +{ 0, /* 146 */}, +{ 0, /* 147 */}, +{ 0, /* 148 */}, +{ 0, /* 149 */}, +{ 0, /* 150 */}, +{ 0, /* 151 */}, +{ 0, /* 152 */}, +{ 0, /* 153 */}, +{ 0, /* 154 */}, +{ 0, /* 155 */}, +{ 0, /* 156 */}, +{ 0, /* 157 */}, +{ 0, /* 158 */}, +{ 0, /* 159 */}, +{ 0, /* 160 */}, +{ "r!", /* 161 */}, +{ "ct", /* 162 */}, +{ "Po", /* 163 */}, +{ "Cs", /* 164 */}, +{ "Ye", /* 165 */}, +{ "bb", /* 166 */}, +{ "sc", /* 167 */}, +{ "ad", /* 168 */}, +{ "co", /* 169 */}, +{ "Of", /* 170 */}, +{ "Fo", /* 171 */}, +{ "tno", /* 172 */}, +{ "-", "hy", /* 173 */}, +{ "rg", /* 174 */}, +{ "a-", /* 175 */}, +{ "de", /* 176 */}, +{ "t+-", /* 177 */}, +{ "S2", /* 178 */}, +{ "S3", /* 179 */}, +{ "aa", /* 180 */}, +{ "mc", /* 181 */}, +{ "ps", /* 182 */}, +{ "pc", /* 183 */}, +{ "ac", /* 184 */}, +{ "S1", /* 185 */}, +{ "Om", /* 186 */}, +{ "Fc", /* 187 */}, +{ "14", /* 188 */}, +{ "12", /* 189 */}, +{ "34", /* 190 */}, +{ "r?", /* 191 */}, +{ "`A", /* 192 */}, +{ "'A", /* 193 */}, +{ "^A", /* 194 */}, +{ "~A", /* 195 */}, +{ ":A", /* 196 */}, +{ "oA", /* 197 */}, +{ "AE", /* 198 */}, +{ ",C", /* 199 */}, +{ "`E", /* 200 */}, +{ "'E", /* 201 */}, +{ "^E", /* 202 */}, +{ ":E", /* 203 */}, +{ "`I", /* 204 */}, +{ "'I", /* 205 */}, +{ "^I", /* 206 */}, +{ ":I", /* 207 */}, +{ "-D", /* 208 */}, +{ "~N", /* 209 */}, +{ "`O", /* 210 */}, +{ "'O", /* 211 */}, +{ "^O", /* 212 */}, +{ "~O", /* 213 */}, +{ ":O", /* 214 */}, +{ "tmu", /* 215 */}, +{ "/O", /* 216 */}, +{ "`U", /* 217 */}, +{ "'U", /* 218 */}, +{ "^U", /* 219 */}, +{ ":U", /* 220 */}, +{ "'Y", /* 221 */}, +{ "TP", /* 222 */}, +{ "ss", /* 223 */}, +{ "`a", /* 224 */}, +{ "'a", /* 225 */}, +{ "^a", /* 226 */}, +{ "~a", /* 227 */}, +{ ":a", /* 228 */}, +{ "oa", /* 229 */}, +{ "ae", /* 230 */}, +{ ",c", /* 231 */}, +{ "`e", /* 232 */}, +{ "'e", /* 233 */}, +{ "^e", /* 234 */}, +{ ":e", /* 235 */}, +{ "`i", /* 236 */}, +{ "'i", /* 237 */}, +{ "^i", /* 238 */}, +{ ":i", /* 239 */}, +{ "Sd", /* 240 */}, +{ "~n", /* 241 */}, +{ "`o", /* 242 */}, +{ "'o", /* 243 */}, +{ "^o", /* 244 */}, +{ "~o", /* 245 */}, +{ ":o", /* 246 */}, +{ "tdi", /* 247 */}, +{ "/o", /* 248 */}, +{ "`u", /* 249 */}, +{ "'u", /* 250 */}, +{ "^u", /* 251 */}, +{ ":u", /* 252 */}, +{ "'y", /* 253 */}, +{ "Tp", /* 254 */}, +{ ":y", /* 255 */}, +}}; + +static DviCharNameMap Adobe_Symbol_map = { + "adobe-fontspecific", + 1, +{ +{ 0, /* 0 */}, +{ 0, /* 1 */}, +{ 0, /* 2 */}, +{ 0, /* 3 */}, +{ 0, /* 4 */}, +{ 0, /* 5 */}, +{ 0, /* 6 */}, +{ 0, /* 7 */}, +{ 0, /* 8 */}, +{ 0, /* 9 */}, +{ 0, /* 10 */}, +{ 0, /* 11 */}, +{ 0, /* 12 */}, +{ 0, /* 13 */}, +{ 0, /* 14 */}, +{ 0, /* 15 */}, +{ 0, /* 16 */}, +{ 0, /* 17 */}, +{ 0, /* 18 */}, +{ 0, /* 19 */}, +{ 0, /* 20 */}, +{ 0, /* 21 */}, +{ 0, /* 22 */}, +{ 0, /* 23 */}, +{ 0, /* 24 */}, +{ 0, /* 25 */}, +{ 0, /* 26 */}, +{ 0, /* 27 */}, +{ 0, /* 28 */}, +{ 0, /* 29 */}, +{ 0, /* 30 */}, +{ 0, /* 31 */}, +{ 0, /* 32 */}, +{ "!", /* 33 */}, +{ "fa", /* 34 */}, +{ "#", "sh", /* 35 */}, +{ "te", /* 36 */}, +{ "%", /* 37 */}, +{ "&", /* 38 */}, +{ "st", /* 39 */}, +{ "(", /* 40 */}, +{ ")", /* 41 */}, +{ "**", /* 42 */}, +{ "+", "pl", /* 43 */}, +{ ",", /* 44 */}, +{ "\\-", "mi", /* 45 */}, +{ ".", /* 46 */}, +{ "/", "sl", /* 47 */}, +{ "0", /* 48 */}, +{ "1", /* 49 */}, +{ "2", /* 50 */}, +{ "3", /* 51 */}, +{ "4", /* 52 */}, +{ "5", /* 53 */}, +{ "6", /* 54 */}, +{ "7", /* 55 */}, +{ "8", /* 56 */}, +{ "9", /* 57 */}, +{ ":", /* 58 */}, +{ ";", /* 59 */}, +{ "<", /* 60 */}, +{ "=", "eq", /* 61 */}, +{ ">", /* 62 */}, +{ "?", /* 63 */}, +{ "=~", /* 64 */}, +{ "*A", /* 65 */}, +{ "*B", /* 66 */}, +{ "*X", /* 67 */}, +{ "*D", /* 68 */}, +{ "*E", /* 69 */}, +{ "*F", /* 70 */}, +{ "*G", /* 71 */}, +{ "*Y", /* 72 */}, +{ "*I", /* 73 */}, +{ "+h", /* 74 */}, +{ "*K", /* 75 */}, +{ "*L", /* 76 */}, +{ "*M", /* 77 */}, +{ "*N", /* 78 */}, +{ "*O", /* 79 */}, +{ "*P", /* 80 */}, +{ "*H", /* 81 */}, +{ "*R", /* 82 */}, +{ "*S", /* 83 */}, +{ "*T", /* 84 */}, +{ 0, /* 85 */}, +{ "ts", /* 86 */}, +{ "*W", /* 87 */}, +{ "*C", /* 88 */}, +{ "*Q", /* 89 */}, +{ "*Z", /* 90 */}, +{ "[", "lB", /* 91 */}, +{ "tf", "3d", /* 92 */}, +{ "]", "rB", /* 93 */}, +{ "pp", /* 94 */}, +{ "_", /* 95 */}, +{ "radicalex", /* 96 */}, +{ "*a", /* 97 */}, +{ "*b", /* 98 */}, +{ "*x", /* 99 */}, +{ "*d", /* 100 */}, +{ "*e", /* 101 */}, +{ "*f", /* 102 */}, +{ "*g", /* 103 */}, +{ "*y", /* 104 */}, +{ "*i", /* 105 */}, +{ "+f", /* 106 */}, +{ "*k", /* 107 */}, +{ "*l", /* 108 */}, +{ "*m", /* 109 */}, +{ "*n", /* 110 */}, +{ "*o", /* 111 */}, +{ "*p", /* 112 */}, +{ "*h", /* 113 */}, +{ "*r", /* 114 */}, +{ "*s", /* 115 */}, +{ "*t", /* 116 */}, +{ "*u", /* 117 */}, +{ "+p", /* 118 */}, +{ "*w", /* 119 */}, +{ "*c", /* 120 */}, +{ "*q", /* 121 */}, +{ "*z", /* 122 */}, +{ "lC", "{", /* 123 */}, +{ "ba", "|", /* 124 */}, +{ "rC", "}", /* 125 */}, +{ "ap", /* 126 */}, +{ 0, /* 127 */}, +{ 0, /* 128 */}, +{ 0, /* 129 */}, +{ 0, /* 130 */}, +{ 0, /* 131 */}, +{ 0, /* 132 */}, +{ 0, /* 133 */}, +{ 0, /* 134 */}, +{ 0, /* 135 */}, +{ 0, /* 136 */}, +{ 0, /* 137 */}, +{ 0, /* 138 */}, +{ 0, /* 139 */}, +{ 0, /* 140 */}, +{ 0, /* 141 */}, +{ 0, /* 142 */}, +{ 0, /* 143 */}, +{ 0, /* 144 */}, +{ 0, /* 145 */}, +{ 0, /* 146 */}, +{ 0, /* 147 */}, +{ 0, /* 148 */}, +{ 0, /* 149 */}, +{ 0, /* 150 */}, +{ 0, /* 151 */}, +{ 0, /* 152 */}, +{ 0, /* 153 */}, +{ 0, /* 154 */}, +{ 0, /* 155 */}, +{ 0, /* 156 */}, +{ 0, /* 157 */}, +{ 0, /* 158 */}, +{ 0, /* 159 */}, +{ 0, /* 160 */}, +{ "*U", /* 161 */}, +{ "fm", /* 162 */}, +{ "<=", /* 163 */}, +{ "f/", /* 164 */}, +{ "if", /* 165 */}, +{ "Fn", /* 166 */}, +{ "CL", /* 167 */}, +{ "DI", /* 168 */}, +{ "HE", /* 169 */}, +{ "SP", /* 170 */}, +{ "<>", /* 171 */}, +{ "<-", /* 172 */}, +{ "ua", "arrowverttp", /* 173 */}, +{ "->", /* 174 */}, +{ "da", "arrowvertbt", /* 175 */}, +{ "de", /* 176 */}, +{ "+-", /* 177 */}, +{ "sd", /* 178 */}, +{ ">=", /* 179 */}, +{ "mu", /* 180 */}, +{ "pt", /* 181 */}, +{ "pd", /* 182 */}, +{ "bu", /* 183 */}, +{ "di", /* 184 */}, +{ "!=", /* 185 */}, +{ "==", /* 186 */}, +{ "~=", "~~", /* 187 */}, +{ 0, /* 188 */}, +{ "arrowvertex", /* 189 */}, +{ "an", /* 190 */}, +{ "CR", /* 191 */}, +{ "Ah", /* 192 */}, +{ "Im", /* 193 */}, +{ "Re", /* 194 */}, +{ "wp", /* 195 */}, +{ "c*", /* 196 */}, +{ "c+", /* 197 */}, +{ "es", /* 198 */}, +{ "ca", /* 199 */}, +{ "cu", /* 200 */}, +{ "sp", /* 201 */}, +{ "ip", /* 202 */}, +{ "nb", /* 203 */}, +{ "sb", /* 204 */}, +{ "ib", /* 205 */}, +{ "mo", /* 206 */}, +{ "nm", /* 207 */}, +{ "/_", /* 208 */}, +{ "gr", /* 209 */}, +{ "rg", /* 210 */}, +{ "co", /* 211 */}, +{ "tm", /* 212 */}, +{ 0, /* 213 */}, +{ "sr", "sqrt", /* 214 */}, +{ "md", /* 215 */}, +{ "no", /* 216 */}, +{ "AN", /* 217 */}, +{ "OR", /* 218 */}, +{ "hA", /* 219 */}, +{ "lA", /* 220 */}, +{ "uA", /* 221 */}, +{ "rA", /* 222 */}, +{ "dA", /* 223 */}, +{ "lz", /* 224 */}, +{ "la", /* 225 */}, +{ 0, /* 226 */}, +{ 0, /* 227 */}, +{ 0, /* 228 */}, +{ 0, /* 229 */}, +{ "parenlefttp", /* 230 */}, +{ "parenleftex", /* 231 */}, +{ "parenleftbt", /* 232 */}, +{ "bracketlefttp", "lc", /* 233 */}, +{ "bracketleftex", /* 234 */}, +{ "bracketleftbt", "lf", /* 235 */}, +{ "bracelefttp", "lt", /* 236 */}, +{ "braceleftmid", "lk", /* 237 */}, +{ "braceleftbt", "lb", /* 238 */}, +{ "bracerightex", "braceleftex", "braceex", "bv", /* 239 */}, +{ 0, /* 240 */}, +{ "ra", /* 241 */}, +{ "is", "integral", /* 242 */}, +{ 0, /* 243 */}, +{ 0, /* 244 */}, +{ 0, /* 245 */}, +{ "parenrighttp", /* 246 */}, +{ "parenrightex", /* 247 */}, +{ "parenrightbt", /* 248 */}, +{ "bracketrighttp", "rc", /* 249 */}, +{ "bracketrightex", /* 250 */}, +{ "bracketrightbt", "rf", /* 251 */}, +{ "bracerighttp", "rt", /* 252 */}, +{ "bracerightmid", "rk", /* 253 */}, +{ "bracerightbt", "rb", /* 254 */}, +{ 0, /* 255 */}, +}}; + + +static void +load_standard_maps (void) +{ + standard_maps_loaded = 1; + DviRegisterMap (&ISO8859_1_map); + DviRegisterMap (&Adobe_Symbol_map); +} diff -ruN groff-1.19.1/src/libs/libxutil/Makefile.sub groff-1.19.2/src/libs/libxutil/Makefile.sub --- groff-1.19.1/src/libs/libxutil/Makefile.sub 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/libs/libxutil/Makefile.sub 2004-06-04 08:31:09.000000000 +0200 @@ -0,0 +1,10 @@ +LIB=xutil +EXTRA_CFLAGS=$(X_CFLAGS) +OBJS=\ + DviChar.$(OBJEXT) \ + XFontName.$(OBJEXT) \ + xmalloc.$(OBJEXT) +CSRCS=\ + $(srcdir)/DviChar.c \ + $(srcdir)/XFontName.c \ + $(srcdir)/xmalloc.c diff -ruN groff-1.19.1/src/libs/libxutil/XFontName.c groff-1.19.2/src/libs/libxutil/XFontName.c --- groff-1.19.1/src/libs/libxutil/XFontName.c 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/libs/libxutil/XFontName.c 2004-06-01 12:40:56.000000000 +0200 @@ -0,0 +1,241 @@ +/* + * XFontName.c + * + * build/parse X Font name strings + */ + +#include +#include +#include "XFontName.h" +#include + +static char * +extractStringField (char *name, char *buffer, int size, + unsigned int *attrp, unsigned int bit) +{ + char *buf = buffer; + + if (!*name) + return 0; + while (*name && *name != '-' && size > 0) { + *buf++ = *name++; + --size; + } + if (size <= 0) + return 0; + *buf = '\0'; + if (buffer[0] != '*' || buffer[1] != '\0') + *attrp |= bit; + if (*name == '-') + return name+1; + return name; +} + +static char * +extractUnsignedField (char *name, unsigned int *result, + unsigned int *attrp, unsigned int bit) +{ + char buf[256]; + char *c; + unsigned int i; + + name = extractStringField (name, buf, sizeof (buf), attrp, bit); + if (!name) + return 0; + if (!(*attrp & bit)) + return name; + i = 0; + for (c = buf; *c; c++) { + if (!isdigit (*c)) + return 0; + i = i * 10 + (*c - '0'); + } + *result = i; + return name; +} + +Bool +XParseFontName (XFontNameString fontNameString, XFontName *fontName, + unsigned int *fontNameAttributes) +{ + char *name = fontNameString; + XFontName temp; + unsigned int attributes = 0; + +#define GetString(field,bit)\ + if (!(name = extractStringField \ + (name, temp.field, sizeof (temp.field),\ + &attributes, bit))) \ + return False; + +#define GetUnsigned(field,bit)\ + if (!(name = extractUnsignedField \ + (name, &temp.field, \ + &attributes, bit))) \ + return False; + + GetString (Registry, FontNameRegistry) + GetString (Foundry, FontNameFoundry) + GetString (FamilyName, FontNameFamilyName) + GetString (WeightName, FontNameWeightName) + GetString (Slant, FontNameSlant) + GetString (SetwidthName, FontNameSetwidthName) + GetString (AddStyleName, FontNameAddStyleName) + GetUnsigned (PixelSize, FontNamePixelSize) + GetUnsigned (PointSize, FontNamePointSize) + GetUnsigned (ResolutionX, FontNameResolutionX) + GetUnsigned (ResolutionY, FontNameResolutionY) + GetString (Spacing, FontNameSpacing) + GetUnsigned (AverageWidth, FontNameAverageWidth) + GetString (CharSetRegistry, FontNameCharSetRegistry) + if (!*name) { + temp.CharSetEncoding[0] = '\0'; + attributes |= FontNameCharSetEncoding; + } else { + GetString (CharSetEncoding, FontNameCharSetEncoding) + } + *fontName = temp; + *fontNameAttributes = attributes; + return True; +} + +static char * +utoa (unsigned int u, char *s, int size) +{ + char *t; + + t = s + size; + *--t = '\0'; + do + *--t = (u % 10) + '0'; + while (u /= 10); + return t; +} + +Bool +XFormatFontName (XFontName *fontName, unsigned int fontNameAttributes, + XFontNameString fontNameString) +{ + char tmp[256]; + char *name = tmp, *f; + int left = sizeof (tmp) - 1; + char number[32]; + +#define PutString(field, bit)\ + f = (fontNameAttributes & bit) ? \ + fontName->field \ + : (char *)"*"; \ + if ((left -= strlen (f)) < 0) \ + return False; \ + while (*f) \ + if ((*name++ = *f++) == '-') \ + return False; +#define PutHyphen()\ + if (--left < 0) \ + return False; \ + *name++ = '-'; + +#define PutUnsigned(field, bit) \ + f = (fontNameAttributes & bit) ? \ + utoa (fontName->field, number, sizeof (number)) \ + : (char *)"*"; \ + if ((left -= strlen (f)) < 0) \ + return False; \ + while (*f) \ + *name++ = *f++; + + PutString (Registry, FontNameRegistry) + PutHyphen (); + PutString (Foundry, FontNameFoundry) + PutHyphen (); + PutString (FamilyName, FontNameFamilyName) + PutHyphen (); + PutString (WeightName, FontNameWeightName) + PutHyphen (); + PutString (Slant, FontNameSlant) + PutHyphen (); + PutString (SetwidthName, FontNameSetwidthName) + PutHyphen (); + PutString (AddStyleName, FontNameAddStyleName) + PutHyphen (); + PutUnsigned (PixelSize, FontNamePixelSize) + PutHyphen (); + PutUnsigned (PointSize, FontNamePointSize) + PutHyphen (); + PutUnsigned (ResolutionX, FontNameResolutionX) + PutHyphen (); + PutUnsigned (ResolutionY, FontNameResolutionY) + PutHyphen (); + PutString (Spacing, FontNameSpacing) + PutHyphen (); + PutUnsigned (AverageWidth, FontNameAverageWidth) + PutHyphen (); + PutString (CharSetRegistry, FontNameCharSetRegistry) + PutHyphen (); + PutString (CharSetEncoding, FontNameCharSetEncoding) + *name = '\0'; + strcpy (fontNameString, tmp); + return True; +} + +Bool +XCompareFontName (XFontName *name1, XFontName *name2, + unsigned int fontNameAttributes) +{ +#define CompareString(field,bit) \ + if (fontNameAttributes & bit) \ + if (strcmp (name1->field, name2->field)) \ + return False; + +#define CompareUnsigned(field,bit) \ + if (fontNameAttributes & bit) \ + if (name1->field != name2->field) \ + return False; + + CompareString (Registry, FontNameRegistry) + CompareString (Foundry, FontNameFoundry) + CompareString (FamilyName, FontNameFamilyName) + CompareString (WeightName, FontNameWeightName) + CompareString (Slant, FontNameSlant) + CompareString (SetwidthName, FontNameSetwidthName) + CompareString (AddStyleName, FontNameAddStyleName) + CompareUnsigned (PixelSize, FontNamePixelSize) + CompareUnsigned (PointSize, FontNamePointSize) + CompareUnsigned (ResolutionX, FontNameResolutionX) + CompareUnsigned (ResolutionY, FontNameResolutionY) + CompareString (Spacing, FontNameSpacing) + CompareUnsigned (AverageWidth, FontNameAverageWidth) + CompareString (CharSetRegistry, FontNameCharSetRegistry) + CompareString (CharSetEncoding, FontNameCharSetEncoding) + return True; +} + +Bool +XCopyFontName (XFontName *name1, XFontName *name2, + unsigned int fontNameAttributes) +{ +#define CopyString(field,bit) \ + if (fontNameAttributes & bit) \ + strcpy (name2->field, name1->field); + +#define CopyUnsigned(field,bit) \ + if (fontNameAttributes & bit) \ + name2->field = name1->field; + + CopyString (Registry, FontNameRegistry) + CopyString (Foundry, FontNameFoundry) + CopyString (FamilyName, FontNameFamilyName) + CopyString (WeightName, FontNameWeightName) + CopyString (Slant, FontNameSlant) + CopyString (SetwidthName, FontNameSetwidthName) + CopyString (AddStyleName, FontNameAddStyleName) + CopyUnsigned (PixelSize, FontNamePixelSize) + CopyUnsigned (PointSize, FontNamePointSize) + CopyUnsigned (ResolutionX, FontNameResolutionX) + CopyUnsigned (ResolutionY, FontNameResolutionY) + CopyString (Spacing, FontNameSpacing) + CopyUnsigned (AverageWidth, FontNameAverageWidth) + CopyString (CharSetRegistry, FontNameCharSetRegistry) + CopyString (CharSetEncoding, FontNameCharSetEncoding) + return True; +} diff -ruN groff-1.19.1/src/libs/libxutil/xmalloc.c groff-1.19.2/src/libs/libxutil/xmalloc.c --- groff-1.19.1/src/libs/libxutil/xmalloc.c 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/libs/libxutil/xmalloc.c 2004-06-01 12:40:56.000000000 +0200 @@ -0,0 +1,7 @@ +#include +#include + +char *xmalloc(int n) +{ + return XtMalloc(n); +} diff -ruN groff-1.19.1/src/preproc/eqn/box.cpp groff-1.19.2/src/preproc/eqn/box.cpp --- groff-1.19.1/src/preproc/eqn/box.cpp 2004-04-08 16:22:28.000000000 +0200 +++ groff-1.19.2/src/preproc/eqn/box.cpp 2005-05-26 15:37:20.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "eqn.h" #include "pbox.h" diff -ruN groff-1.19.1/src/preproc/eqn/box.h groff-1.19.2/src/preproc/eqn/box.h --- groff-1.19.1/src/preproc/eqn/box.h 2004-04-17 07:23:30.000000000 +0200 +++ groff-1.19.2/src/preproc/eqn/box.h 2005-06-16 07:43:30.000000000 +0200 @@ -1,5 +1,6 @@ // -*- C++ -*- -/* Copyright (C) 1989, 1990, 1991, 1992, 2004 Free Software Foundation, Inc. +/* Copyright (C) 1989, 1990, 1991, 1992, 2004, 2005 + Free Software Foundation, Inc. Written by James Clark (jjc@jclark.com) This file is part of groff. @@ -16,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ class list_box; @@ -62,6 +63,11 @@ friend class list_box; }; +// declarations to avoid friend name injection problems +box *make_script_box(box *, box *, box *); +box *make_mark_box(box *); +box *make_lineup_box(box *); + class list_box : public box { int is_script; box_list list; diff -ruN groff-1.19.1/src/preproc/eqn/delim.cpp groff-1.19.2/src/preproc/eqn/delim.cpp --- groff-1.19.1/src/preproc/eqn/delim.cpp 2003-02-14 19:17:29.000000000 +0100 +++ groff-1.19.2/src/preproc/eqn/delim.cpp 2005-05-26 15:37:20.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "eqn.h" #include "pbox.h" diff -ruN groff-1.19.1/src/preproc/eqn/eqn.h groff-1.19.2/src/preproc/eqn/eqn.h --- groff-1.19.1/src/preproc/eqn/eqn.h 2001-08-19 23:32:29.000000000 +0200 +++ groff-1.19.2/src/preproc/eqn/eqn.h 2005-05-26 15:37:20.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "lib.h" diff -ruN groff-1.19.1/src/preproc/eqn/eqn.man groff-1.19.2/src/preproc/eqn/eqn.man --- groff-1.19.1/src/preproc/eqn/eqn.man 2001-10-05 16:12:21.000000000 +0200 +++ groff-1.19.2/src/preproc/eqn/eqn.man 2005-02-20 11:25:34.000000000 +0100 @@ -1,5 +1,5 @@ .ig -Copyright (C) 1989-2000, 2001 Free Software Foundation, Inc. +Copyright (C) 1989-2000, 2001, 2004, 2005 Free Software Foundation, Inc. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice @@ -16,20 +16,41 @@ translations approved by the Free Software Foundation instead of in the original English. .. -.ie \n(.V<\n(.v .ds tx T\h'-.1667m'\v'.224m'E\v'-.224m'\h'-.125m'X -.el .ds tx TeX +. +. +.ie \n(.V<\n(.v \ +. ds tx T\h'-.1667m'\v'.224m'E\v'-.224m'\h'-.125m'X +.el \ +. ds tx TeX +. +. .\" Like TP, but if specified indent is more than half .\" the current line-length - indent, use the default indent. .de Tp -.ie \\n(.$=0:((0\\$1)*2u>(\\n(.lu-\\n(.iu)) .TP -.el .TP "\\$1" +. ie \\n(.$=0:((0\\$1)*2u>(\\n(.lu-\\n(.iu)) .TP +. el .TP "\\$1" +.. +. +. +.de TQ +. br +. ns +. TP \\$1 .. +. +. .\" The BSD man macros can't handle " in arguments to font change macros, .\" so use \(ts instead of ". .tr \(ts" +. +. .TH @G@EQN @MAN1EXT@ "@MDATE@" "Groff Version @VERSION@" +. +. .SH NAME @g@eqn \- format equations for troff +. +. .SH SYNOPSIS .nr a \n(.j .ad l @@ -38,8 +59,8 @@ .ti \niu .B @g@eqn .de OP -.ie \\n(.$-1 .RI "[\ \fB\\$1\fP" "\\$2" "\ ]" -.el .RB "[\ " "\\$1" "\ ]" +. ie \\n(.$-1 .RI "[\ \fB\\$1\fP" "\\$2" "\ ]" +. el .RB "[\ " "\\$1" "\ ]" .. .OP \-rvCNR .OP \-d xy @@ -52,9 +73,12 @@ .RI "[\ " files\|.\|.\|. "\ ]" .br .ad \na -.PP +. +.LP It is possible to have whitespace between a command line option and its parameter. +. +. .SH DESCRIPTION This manual page describes the GNU version of .BR eqn , @@ -69,13 +93,16 @@ option of .BR groff . The syntax is quite compatible with Unix eqn. -The output of GNU eqn cannot be processed with Unix troff; +The output of GNU +.B eqn +cannot be processed with Unix troff; it must be processed with GNU troff. If no files are given on the command line, the standard input will be read. A filename of .B \- will cause the standard input to be read. +. .LP .B eqn searches for the file @@ -87,25 +114,33 @@ .BR @LOCALMACRODIR@ , and finally in the standard macro directory .BR @MACRODIR@ . -If it exists, eqn will process it before the other input files. +If it exists, +.B eqn +will process it before the other input files. The .B \-R option prevents this. +. .LP -GNU eqn does not provide the functionality of neqn: +GNU +.B eqn +does not provide the functionality of neqn: it does not support low-resolution, typewriter-like devices (although it may work adequately for very simple input). +. +. .SH OPTIONS .TP .BI \-d xy Specify delimiters .I x -and +and\~\c .I y for the left and right end, respectively, of in-line equations. Any .B delim statements in the source file overrides this. +. .TP .B \-C Recognize @@ -119,32 +154,38 @@ This option allows .B eqn to recover better from missing closing delimiters. +. .TP .B \-v Print the version number. +. .TP .B \-r Only one size reduction. +. .TP .BI \-m n -The minimum point-size is +The minimum point-size is\~\c .IR n . -eqn will not reduce the size of subscripts or superscripts to -a smaller size than +.B eqn +will not reduce the size of subscripts or superscripts to +a smaller size than\~\c .IR n . +. .TP .BI \-T name The output is for device .IR name . The only effect of this is to define a macro .I name -with a value of +with a value of\~\c .BR 1 . Typically .B eqnrc will use this to provide definitions appropriate for the output device. The default output device is .BR @DEVICE@ . +. .TP .BI \-M dir Search @@ -152,82 +193,109 @@ for .B eqnrc before the default directories. +. .TP .B \-R Don't load .BR eqnrc . +. .TP .BI \-f F This is equivalent to a .BI gfont\ F command. +. .TP .BI \-s n This is equivalent to a .BI gsize\ n command. This option is deprecated. -eqn will normally set equations at whatever the current point size +.B eqn +will normally set equations at whatever the current point size is when the equation is encountered. +. .TP .BI \-p n This says that subscripts and superscripts should be -.I n +.I n\~\c points smaller than the surrounding text. This option is deprecated. -Normally eqn makes sets subscripts and superscripts at 70% +Normally +.B eqn +makes sets subscripts and superscripts at 70% of the size of the surrounding text. +. +. .SH USAGE -Only the differences between GNU eqn and Unix eqn are described here. +Only the differences between GNU +.B eqn +and Unix eqn are described here. +. .LP -Most of the new features of GNU eqn +Most of the new features of GNU +.B eqn are based on \*(tx. -There are some references to the differences between \*(tx and GNU eqn below; +There are some references to the differences between \*(tx and GNU +.B eqn +below; these may safely be ignored if you do not know \*(tx. +. .SS Automatic spacing -.LP .B eqn gives each component of an equation a type, and adjusts the spacing between components using that type. Possible types are: +. +.RS .TP \w'punctuation'u+2n ordinary -an ordinary character such as 1 or -.IR x ; +an ordinary character such as `1' or `\c +.IR x '; +. .TP operator a large operator such as -.ds Su \s+5\(*S\s0 +.ds Su `\s+5\(*S\s0' .if \n(.g .if !c\(*S .ds Su the summation operator \*(Su; +. .TP binary -a binary operator such as +; +a binary operator such as `\(pl'; +. .TP relation -a relation such as =; +a relation such as `='; +. .TP opening -a opening bracket such as (; +a opening bracket such as `('; +. .TP closing -a closing bracket such as ); +a closing bracket such as `)'; +. .TP punctuation -a punctuation character such as ,; +a punctuation character such as `,'; +. .TP inner a subformula contained within brackets; .TP suppress spacing that suppresses automatic spacing adjustment. +.RE +. .LP Components of an equation get a type in one of two ways. +. .TP .BI type\ t\ e -This yields an equation component that contains +This yields an equation component that contains\~\c .I e -but that has type +but that has type\~\c .IR t , where .I t @@ -235,14 +303,17 @@ For example, .B times is defined as +. .RS .IP .B type "binary" \e(mu .RE +. .IP The name of the type doesn't have to be quoted, but quoting protects from macro expansion. +. .TP .BI chartype\ t\ text Unquoted groups of characters are split up into individual characters, @@ -250,20 +321,20 @@ this changes the type that is stored for each character; it says that the characters in .I text -from now on have type +from now on have type\~\c .IR t . For example, +. .RS .IP .B chartype "punctuation" .,;: .RE +. .IP -would make the characters -.B .,;: -have type punctuation +would make the characters `.,;:' have type punctuation whenever they subsequently appeared in an equation. -The type +The type\~\c .I t can also be .B letter @@ -272,7 +343,10 @@ in these cases .B chartype changes the font type of the characters. -See the Fonts subsection. +See the +.B Fonts +subsection. +. .SS New primitives .TP .IB e1\ smallover\ e2 @@ -297,22 +371,25 @@ corresponds to .B \eover in non-display styles. +. .TP .BI vcenter\ e This vertically centers .I e about the math axis. The math axis is the vertical position about which characters -such as + and - are centered; also it is the vertical position +such as `\(pl' and `\(mi' are centered; also it is the vertical position used for the bar of fractions. For example, .B sum is defined as +. .RS .IP .B { type "operator" vcenter size +5 \e(*S } .RE +. .TP .IB e1\ accent\ e2 This sets @@ -328,21 +405,24 @@ For example, .B hat is defined as +. .RS .IP .B accent { "^" } .RE +. .IP .BR dotdot , .BR dot , .BR tilde , -.B vec +.BR vec , and .B dyad are also defined using the .B accent primitive. +. .TP .IB e1\ uaccent\ e2 This sets @@ -359,13 +439,16 @@ is pre-defined using .B uaccent as a tilde accent below the baseline. +. .TP .BI split\ \(ts text \(ts This has the same effect as simply +. .RS .IP .I text .RE +. .IP but .I text @@ -373,13 +456,16 @@ .I text will be split up and the spacing between individual characters will be adjusted. +. .TP .BI nosplit\ text This has the same effect as +. .RS .IP .BI \(ts text \(ts .RE +. .IP but because .I text @@ -387,11 +473,12 @@ .I text will not be split up and the spacing between individual characters will not be adjusted. +. .TP .IB e\ opprime This is a variant of .B prime -that acts as an operator on +that acts as an operator on\~\c .IR e . It produces a different result from .B prime @@ -399,14 +486,14 @@ .BR A\ opprime\ sub\ 1 : with .B opprime -the +the\~\c .B 1 -will be tucked under the prime as a subscript to the +will be tucked under the prime as a subscript to the\~\c .B A (as is conventional in mathematical typesetting), whereas with .B prime -the +the\~\c .B 1 will be a subscript to the prime character. The precedence of @@ -419,31 +506,32 @@ .B accent and .BR uaccent . -In unquoted text a +In unquoted text a\~\c .B ' that is not the first character will be treated like .BR opprime . +. .TP .BI special\ text\ e -This constructs a new object from +This constructs a new object from\~\c .I e using a -.BR @g@troff (@MAN1EXT@) +.BR @g@troff (@MAN1EXT@) macro named .IR text . When the macro is called, the string .B 0s -will contain the output for +will contain the output for\~\c .IR e , and the number registers .BR 0w , .BR 0h , .BR 0d , -.BR 0skern +.BR 0skern , and .BR 0skew -will contain the width, height, depth, subscript kern, and skew of +will contain the width, height, depth, subscript kern, and skew of\~\c .IR e . (The .I "subscript kern" @@ -459,82 +547,178 @@ of the object. The number registers must also be modified so that they correspond to the result. -.RS -.LP +. +.IP For example, suppose you wanted a construct that `cancels' an expression by drawing a diagonal line through it. +. +.RS .IP -.nf .ft B .if t .ne 6+\n(.Vu +.br \&.EQ +.br define cancel 'special Ca' +.br \&.EN +.br \&.de Ca -\&.ds 0s \eZ'\e\e*(0s'\ev'\e\en(0du'\eD'l \e\en(0wu -\e\en(0hu-\e\en(0du'\ev'\e\en(0hu' +.br +\&.\ \ ds 0s \e +.br +\eZ'\e\e*(0s'\e +.br +\ev'\e\en(0du'\e +.br +\eD'l \e\en(0wu -\e\en(0hu-\e\en(0du'\e +.br +\ev'\e\en(0hu' +.br \&.. .ft -.fi -.LP -Then you could cancel an expression +.RE +. +.IP +Then you could cancel an expression\~\c .I e with -.BI cancel\ {\ e\ } -.LP +.BI \%cancel\ {\ e\ } +. +.IP Here's a more complicated construct that draws a box round an expression: +. +.RS .IP -.nf .ft B .if t .ne 11+\n(.Vu \&.EQ +.br define box 'special Bx' +.br \&.EN +.br \&.de Bx -\&.ds 0s \eZ'\eh'1n'\e\e*(0s'\e -\eZ'\ev'\e\en(0du+1n'\eD'l \e\en(0wu+2n 0'\eD'l 0 -\e\en(0hu-\e\en(0du-2n'\e -\eD'l -\e\en(0wu-2n 0'\eD'l 0 \e\en(0hu+\e\en(0du+2n''\eh'\e\en(0wu+2n' -\&.nr 0w +2n -\&.nr 0d +1n -\&.nr 0h +1n +.br +\&.\ \ ds 0s \e +.br +\eZ'\eh'1n'\e\e*(0s'\e +.br +\eZ'\e +.br +\ev'\e\en(0du+1n'\e +.br +\eD'l \e\en(0wu+2n 0'\e +.br +\eD'l 0 -\e\en(0hu-\e\en(0du-2n'\e +.br +\eD'l -\e\en(0wu-2n 0'\e +.br +\eD'l 0 \e\en(0hu+\e\en(0du+2n'\e +.br +\&'\e +.br +\eh'\e\en(0wu+2n' +.br +\&.\ \ nr 0w +2n +.br +\&.\ \ nr 0d +1n +.br +\&.\ \ nr 0h +1n +.br \&.. .ft -.fi .RE +. +.TP +.BI space\ n +A positive value of the integer\~\c +.I n +(in hundredths of an em) sets the vertical spacing before the equation, +a negative value sets the spacing after the equation, replacing the +default values. +This primitive provides an interface to +.BR groff 's +.B \ex +escape (but with opposite sign). +. +.IP +This keyword has no effect if the equation is part of a +.B pic +picture. +. +.SS Extended primitives +.TP +.BI col\ n\ {\ .\|.\|.\ } +.TQ +.BI ccol\ n\ {\ .\|.\|.\ } +.TQ +.BI lcol\ n\ {\ .\|.\|.\ } +.TQ +.BI rcol\ n\ {\ .\|.\|.\ } +.TQ +.BI pile\ n\ {\ .\|.\|.\ } +.TQ +.BI cpile\ n\ {\ .\|.\|.\ } +.TQ +.BI lpile\ n\ {\ .\|.\|.\ } +.TQ +.BI rpile\ n\ {\ .\|.\|.\ } +The integer value\~\c +.I n +(in hundredths of an em) increases the vertical spacing between rows, +using +.BR groff 's +.B \ex +escape. +Negative values are possible but have no effect. +If there is more than a single value given in a matrix, the biggest one +is used. +. .SS Customization -The appearance of equations is controlled by -a large number of parameters. These can be set using +The appearance of equations is controlled by a large number of parameters. +These can be set using the .B set command. +. .TP .BI set\ p\ n -This sets parameter +This sets parameter\~\c .I p -to value -.I n ; -.I n +to value\~\c +.IR n ; +.I n\~\c is an integer. For example, +. .RS .IP .B set x_height 45 .RE +. .IP says that .B eqn -should assume an x height of 0.45 ems. +should assume an x\~height of 0.45\~ems. +. .RS .LP Possible parameters are as follows. Values are in units of hundredths of an em unless otherwise stated. These descriptions are intended to be expository rather than definitive. -.TP \w'\fBdefault_rule_thickness'u+2n +. +.ie t \ +. TP \w'\fBdefault_rule_thickness'u+2n +.el \ +. TP .B minimum_size .B eqn will not set anything at a smaller point-size than this. The value is in points. +. .TP .B fat_offset The @@ -542,12 +726,14 @@ primitive emboldens an equation by overprinting two copies of the equation horizontally offset by this amount. +. .TP .B over_hang A fraction bar will be longer by twice this amount than the maximum of the widths of the numerator and denominator; in other words, it will overhang the numerator and denominator by at least this amount. +. .TP .B accent_width When @@ -563,6 +749,7 @@ produces a line whose length is the width of the object to which it applies; in the case of a single character, this tends to produce a line that looks too long. +. .TP .B delimiter_factor Extensible delimiters produced with the @@ -572,6 +759,7 @@ primitives will have a combined height and depth of at least this many thousandths of twice the maximum amount by which the sub-equation that the delimiters enclose extends away from the axis. +. .TP .B delimiter_shortfall Extensible delimiters produced with the @@ -583,34 +771,42 @@ twice the maximum amount by which the sub-equation that the delimiters enclose extends away from the axis and this amount. +. .TP .B null_delimiter_space This much horizontal space is inserted on each side of a fraction. +. .TP .B script_space The width of subscripts and superscripts is increased by this amount. +. .TP .B thin_space This amount of space is automatically inserted after punctuation characters. +. .TP .B medium_space This amount of space is automatically inserted on either side of binary operators. +. .TP .B thick_space This amount of space is automatically inserted on either side of relations. +. .TP .B x_height -The height of lowercase letters without ascenders such as x. +The height of lowercase letters without ascenders such as `x'. +. .TP .B axis_height The height above the baseline of the center of characters -such as \(pl and \(mi. +such as `\(pl' and `\(mi'. It is important that this value is correct for the font you are using. +. .TP .B default_rule_thickness This should set to the thickness of the @@ -618,29 +814,35 @@ character, or the thickness of horizontal lines produced with the .B \eD escape sequence. +. .TP .B num1 The .B over command will shift up the numerator by at least this amount. +. .TP .B num2 The .B smallover command will shift up the numerator by at least this amount. +. .TP .B denom1 The .B over command will shift down the denominator by at least this amount. +. .TP .B denom2 The .B smallover command will shift down the denominator by at least this amount. +. .TP .B sup1 Normally superscripts will be shifted up by at least this amount. +. .TP .B sup2 Superscripts within superscripts or upper limits @@ -649,47 +851,58 @@ fractions will be shifted up by at least this amount. This is usually less than sup1. +. .TP .B sup3 Superscripts within denominators or square roots or subscripts or lower limits will be shifted up by at least this amount. This is usually less than sup2. +. .TP .B sub1 Subscripts will normally be shifted down by at least this amount. +. .TP .B sub2 When there is both a subscript and a superscript, the subscript will be shifted down by at least this amount. +. .TP .B sup_drop The baseline of a superscript will be no more than this much amount below the top of the object on which the superscript is set. +. .TP .B sub_drop The baseline of a subscript will be at least this much below the bottom of the object on which the subscript is set. +. .TP .B big_op_spacing1 The baseline of an upper limit will be at least this much above the top of the object on which the limit is set. +. .TP .B big_op_spacing2 The baseline of a lower limit will be at least this much below the bottom of the object on which the limit is set. +. .TP .B big_op_spacing3 The bottom of an upper limit will be at least this much above the top of the object on which the limit is set. +. .TP .B big_op_spacing4 The top of a lower limit will be at least this much below the bottom of the object on which the limit is set. +. .TP .B big_op_spacing5 This much vertical space will be added above and below limits. +. .TP .B baseline_sep The baselines of the rows in a pile or matrix will normally be @@ -698,18 +911,22 @@ .B num1 and .BR denom1 . +. .TP .B shift_down The midpoint between the top baseline and the bottom baseline in a matrix or pile will be shifted down by this much from the axis. In most cases this should be equal to .BR axis_height . +. .TP .B column_sep This much space will be added between columns in a matrix. +. .TP .B matrix_side_sep This much space will be added at each side of a matrix. +. .TP .B draw_lines If this is non-zero, lines will be drawn using the @@ -719,20 +936,23 @@ escape sequence and the .B \e(ru character. +. .TP .B body_height The amount by which the height of the equation exceeds this will be added as extra space before the line containing the equation (using -.BR \ex .) +.BR \ex ). The default value is 85. +. .TP .B body_depth The amount by which the depth of the equation exceeds this will be added as extra space after the line containing the equation (using -.BR \ex .) +.BR \ex ). The default value is 35. +. .TP .B nroff If this is non-zero, @@ -750,8 +970,8 @@ and .B ndefine will be ignored. -The default value is 0 -(This is typically changed to 1 by the +The default value is\~0 +(This is typically changed to\~1 by the .B eqnrc file for the .BR ascii , @@ -760,23 +980,25 @@ and .B cp1047 devices.) +. .LP A more precise description of the role of many of these -parameters can be found in Appendix H of -.IR The\ \*(txbook . +parameters can be found in Appendix\~H of +.IR "The \*(txbook" . .RE +. .SS Macros Macros can take arguments. In a macro body, .BI $ n where .I n -is between 1 and 9, +is between 1 and\~9, will be replaced by the .IR n-th argument if the macro is called with arguments; if there are fewer than -.I n +.I n\~\c arguments, it will be replaced by nothing. A word containing a left parenthesis where the part of the word before the left parenthesis has been defined using the @@ -787,6 +1009,7 @@ up to a matching right parenthesis will be treated as comma-separated arguments; commas inside nested parentheses do not terminate an argument. +. .TP .BI sdefine\ name\ X\ anything\ X This is like the @@ -794,10 +1017,17 @@ command, but .I name will not be recognized if called with arguments. +. .TP .BI include\ \(ts file \(ts +.TQ +.BI copy\ \(ts file \(ts Include the contents of -.IR file . +.I file +.RB ( include +and +.B copy +are synonyms). Lines of .I file beginning with @@ -805,6 +1035,7 @@ or .B .EN will be ignored. +. .TP .BI ifdef\ name\ X\ anything\ X If @@ -821,6 +1052,29 @@ .I X can be any character not appearing in .IR anything . +. +.TP +.BI undef\ name +Remove definition of +.IR name , +making it undefined. +. +.LP +Besides the macros mentioned above, the following definitions are available: +.BR Alpha , +.BR Beta , +\&.\|.\|., +.B Omega +(this is the same as +.BR ALPHA , +.BR BETA , +\&.\|.\|., +.BR OMEGA ), +.B ldots +(three dots on the base line), +and +.BR dollar . +. .SS Fonts .B eqn normally uses at least two fonts to set an equation: @@ -830,16 +1084,18 @@ .B gfont command changes the font that is used as the italic font. -By default this is +By default this is\~\c .BR I . The font that is used as the roman font can be changed using the new .B grfont command. +. .TP .BI grfont\ f -Set the roman font to +Set the roman font to\~\c .IR f . +. .LP The .B italic @@ -867,6 +1123,7 @@ and .B gbfont commands. +. .LP You can control which characters are treated as letters (and therefore set in italics) by using the @@ -878,16 +1135,23 @@ A type of .B digit will cause a character to be set in roman type. +. +. .SH FILES .Tp \w'\fB@MACRODIR@/eqnrc'u+2n .B @MACRODIR@/eqnrc Initialization file. +. +. .SH BUGS Inline equations will be set at the point size that is current at the beginning of the input line. +. +. .SH "SEE ALSO" .BR groff (@MAN1EXT@), .BR @g@troff (@MAN1EXT@), +.BR @g@pic (@MAN1EXT@), .BR groff_font (@MAN5EXT@), .I The\ \*(txbook . diff -ruN groff-1.19.1/src/preproc/eqn/eqn.y groff-1.19.2/src/preproc/eqn/eqn.y --- groff-1.19.1/src/preproc/eqn/eqn.y 2004-04-07 17:36:41.000000000 +0200 +++ groff-1.19.2/src/preproc/eqn/eqn.y 2005-05-26 15:37:20.000000000 +0200 @@ -15,7 +15,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ %{ #include #include diff -ruN groff-1.19.1/src/preproc/eqn/lex.cpp groff-1.19.2/src/preproc/eqn/lex.cpp --- groff-1.19.1/src/preproc/eqn/lex.cpp 2003-02-08 15:48:57.000000000 +0100 +++ groff-1.19.2/src/preproc/eqn/lex.cpp 2005-06-16 07:48:05.000000000 +0200 @@ -1,5 +1,5 @@ // -*- C++ -*- -/* Copyright (C) 1989, 1990, 1991, 1992, 2000, 2001, 2002, 2003 +/* Copyright (C) 1989, 1990, 1991, 1992, 2000, 2001, 2002, 2003, 2005 Free Software Foundation, Inc. Written by James Clark (jjc@jclark.com) @@ -17,13 +17,19 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "eqn.h" #include "eqn_tab.h" #include "stringclass.h" #include "ptable.h" + +// declarations to avoid friend name injection problems +int get_char(); +int peek_char(); +int get_location(char **, int *); + struct definition { char is_macro; char is_simple; diff -ruN groff-1.19.1/src/preproc/eqn/limit.cpp groff-1.19.2/src/preproc/eqn/limit.cpp --- groff-1.19.1/src/preproc/eqn/limit.cpp 2002-04-04 16:04:45.000000000 +0200 +++ groff-1.19.2/src/preproc/eqn/limit.cpp 2005-05-26 15:37:20.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "eqn.h" #include "pbox.h" diff -ruN groff-1.19.1/src/preproc/eqn/list.cpp groff-1.19.2/src/preproc/eqn/list.cpp --- groff-1.19.1/src/preproc/eqn/list.cpp 2000-02-06 10:38:03.000000000 +0100 +++ groff-1.19.2/src/preproc/eqn/list.cpp 2005-05-26 15:37:20.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "eqn.h" #include "pbox.h" diff -ruN groff-1.19.1/src/preproc/eqn/main.cpp groff-1.19.2/src/preproc/eqn/main.cpp --- groff-1.19.1/src/preproc/eqn/main.cpp 2002-02-19 17:28:31.000000000 +0100 +++ groff-1.19.2/src/preproc/eqn/main.cpp 2005-05-26 15:37:20.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "eqn.h" #include "stringclass.h" diff -ruN groff-1.19.1/src/preproc/eqn/Makefile.sub groff-1.19.2/src/preproc/eqn/Makefile.sub --- groff-1.19.1/src/preproc/eqn/Makefile.sub 2004-04-06 16:17:39.000000000 +0200 +++ groff-1.19.2/src/preproc/eqn/Makefile.sub 2005-05-28 07:29:59.000000000 +0200 @@ -1,6 +1,7 @@ PROG=eqn$(EXEEXT) MAN1=eqn.n neqn.n XLIBS=$(LIBGROFF) +MLIB=$(LIBM) OBJS=\ eqn.$(OBJEXT) \ main.$(OBJEXT) \ diff -ruN groff-1.19.1/src/preproc/eqn/mark.cpp groff-1.19.2/src/preproc/eqn/mark.cpp --- groff-1.19.1/src/preproc/eqn/mark.cpp 2000-02-06 10:38:04.000000000 +0100 +++ groff-1.19.2/src/preproc/eqn/mark.cpp 2005-05-26 15:37:20.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "eqn.h" #include "pbox.h" diff -ruN groff-1.19.1/src/preproc/eqn/neqn.sh groff-1.19.2/src/preproc/eqn/neqn.sh --- groff-1.19.1/src/preproc/eqn/neqn.sh 2004-04-06 16:02:49.000000000 +0200 +++ groff-1.19.2/src/preproc/eqn/neqn.sh 2005-05-18 07:33:28.000000000 +0200 @@ -1,4 +1,4 @@ -#!/bin/sh +#! /bin/sh # Provision of this shell script should not be taken to imply that use of # GNU eqn with groff -Tascii|-Tlatin1|-Tutf8|-Tcp1047 is supported. diff -ruN groff-1.19.1/src/preproc/eqn/other.cpp groff-1.19.2/src/preproc/eqn/other.cpp --- groff-1.19.1/src/preproc/eqn/other.cpp 2002-04-04 16:04:45.000000000 +0200 +++ groff-1.19.2/src/preproc/eqn/other.cpp 2005-05-26 15:37:20.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "eqn.h" #include "pbox.h" diff -ruN groff-1.19.1/src/preproc/eqn/over.cpp groff-1.19.2/src/preproc/eqn/over.cpp --- groff-1.19.1/src/preproc/eqn/over.cpp 2002-04-05 13:55:11.000000000 +0200 +++ groff-1.19.2/src/preproc/eqn/over.cpp 2005-05-26 15:37:20.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "eqn.h" #include "pbox.h" diff -ruN groff-1.19.1/src/preproc/eqn/pbox.h groff-1.19.2/src/preproc/eqn/pbox.h --- groff-1.19.1/src/preproc/eqn/pbox.h 2000-02-06 10:38:05.000000000 +0100 +++ groff-1.19.2/src/preproc/eqn/pbox.h 2005-05-26 15:37:20.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ extern int fat_offset; diff -ruN groff-1.19.1/src/preproc/eqn/pile.cpp groff-1.19.2/src/preproc/eqn/pile.cpp --- groff-1.19.1/src/preproc/eqn/pile.cpp 2004-04-07 17:41:34.000000000 +0200 +++ groff-1.19.2/src/preproc/eqn/pile.cpp 2005-05-26 15:37:20.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ // piles and matrices #include "eqn.h" diff -ruN groff-1.19.1/src/preproc/eqn/script.cpp groff-1.19.2/src/preproc/eqn/script.cpp --- groff-1.19.1/src/preproc/eqn/script.cpp 2004-04-07 17:40:07.000000000 +0200 +++ groff-1.19.2/src/preproc/eqn/script.cpp 2005-05-26 15:37:20.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "eqn.h" #include "pbox.h" diff -ruN groff-1.19.1/src/preproc/eqn/special.cpp groff-1.19.2/src/preproc/eqn/special.cpp --- groff-1.19.1/src/preproc/eqn/special.cpp 2000-02-06 10:38:06.000000000 +0100 +++ groff-1.19.2/src/preproc/eqn/special.cpp 2005-05-26 15:37:20.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "eqn.h" #include "pbox.h" diff -ruN groff-1.19.1/src/preproc/eqn/sqrt.cpp groff-1.19.2/src/preproc/eqn/sqrt.cpp --- groff-1.19.1/src/preproc/eqn/sqrt.cpp 2003-01-08 08:23:44.000000000 +0100 +++ groff-1.19.2/src/preproc/eqn/sqrt.cpp 2005-05-26 15:37:20.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "eqn.h" #include "pbox.h" diff -ruN groff-1.19.1/src/preproc/eqn/text.cpp groff-1.19.2/src/preproc/eqn/text.cpp --- groff-1.19.1/src/preproc/eqn/text.cpp 2003-02-08 16:00:18.000000000 +0100 +++ groff-1.19.2/src/preproc/eqn/text.cpp 2005-05-26 15:37:20.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "eqn.h" #include "pbox.h" diff -ruN groff-1.19.1/src/preproc/grn/grn.man groff-1.19.2/src/preproc/grn/grn.man --- groff-1.19.1/src/preproc/grn/grn.man 2003-07-18 09:36:42.000000000 +0200 +++ groff-1.19.2/src/preproc/grn/grn.man 2004-08-07 18:06:13.000000000 +0200 @@ -1,6 +1,6 @@ '\" t .ig -Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc. +Copyright (C) 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice @@ -149,7 +149,7 @@ .B .GS and .B .GE -(resp. +(and .BR .GF ) even when followed by a character other than space or newline. .\".TP @@ -195,7 +195,7 @@ text size number 1 (2, 3, or 4) to .I N points. -The default is 12 (resp. 16, 24, and 36). +The default is 12 (16, 24, and 36, respectively). .TP .BI roman\ f .TQ @@ -209,7 +209,7 @@ font .I f (either a name or number). -The default is R (resp. I, B, and S). +The default is R (I, B, and S, respectively). .TP .BI l\ f .TQ @@ -249,11 +249,11 @@ .BI thick\ N Set the thickness of .IR gremlin 's -narrow (resp. medium and thick) lines to +narrow (medium and thick, respectively) lines to .I N times 0.15pt (this value can be changed at compile time). -The default is 1.0 (resp. 3.0 and 5.0), which corresponds to 0.15pt -(resp. 0.45pt and 0.75pt). +The default is 1.0 (3.0 and 5.0, respectively), which corresponds to 0.15pt +(0.45pt and 0.75pt, respectively). A thickness value of zero selects the smallest available line thickness. Negative values cause the line thickness to be proportional to the current point size. @@ -262,7 +262,10 @@ Scale text to match the picture. Gremlin text is usually printed in the point size specified with the commands -.BR 1 ,\ 2 ,\ 3 ,\ or\ 4 +.BR 1 , +.BR 2 , +.BR 3 , +.RB or\~ 4 , regardless of any scaling factors in the picture. Setting .B pointscale diff -ruN groff-1.19.1/src/preproc/grn/hdb.cpp groff-1.19.2/src/preproc/grn/hdb.cpp --- groff-1.19.1/src/preproc/grn/hdb.cpp 2004-04-18 13:09:44.000000000 +0200 +++ groff-1.19.2/src/preproc/grn/hdb.cpp 2004-08-07 18:06:13.000000000 +0200 @@ -22,6 +22,7 @@ extern int linenum; /* current line number in input file */ extern char gremlinfile[]; /* name of file currently reading */ extern int SUNFILE; /* TRUE if SUN gremlin file */ +extern int compatibility_flag; /* TRUE if in compatibility mode */ extern void savebounds(double x, double y); /* imports from hpoint.cpp */ @@ -146,6 +147,10 @@ (void) sscanf(string, "%lf%lf", &x, &y); if ((x == -1.00 && y == -1.00) && (!SUNFILE)) lastpoint = TRUE; + else { + if (compatibility_flag) + savebounds(xorn(x, y), yorn(x, y)); + } } } while (!lastpoint); #endif /* UW_FASTSCAN */ diff -ruN groff-1.19.1/src/preproc/grn/hgraph.cpp groff-1.19.2/src/preproc/grn/hgraph.cpp --- groff-1.19.1/src/preproc/grn/hgraph.cpp 2004-04-17 07:27:22.000000000 +0200 +++ groff-1.19.2/src/preproc/grn/hgraph.cpp 2005-03-16 09:07:45.000000000 +0100 @@ -8,19 +8,13 @@ #include "gprint.h" -#ifdef NEED_DECLARATION_HYPOT -extern "C" { - double hypot(double, double); -} -#endif /* NEED_DECLARATION_HYPOT */ - #define MAXVECT 40 #define MAXPOINTS 200 #define LINELENGTH 1 #define PointsPerInterval 64 #define pi 3.14159265358979324 #define twopi (2.0 * pi) -#define len(a, b) hypot((double)(b.x-a.x), (double)(b.y-a.y)) +#define len(a, b) groff_hypot((double)(b.x-a.x), (double)(b.y-a.y)) extern int dotshifter; /* for the length of dotted curves */ @@ -600,7 +594,7 @@ length = 0; - resolution = (1.0 + hypot(xs, ys) / res) * PointsPerInterval; + resolution = (1.0 + groff_hypot(xs, ys) / res) * PointsPerInterval; /* mask = (1 << (int) log10(resolution + 1.0)) - 1; */ (void) frexp(resolution, &m); /* A bit more elegant than log10 */ for (mask = 1; mask < m; mask = mask << 1); @@ -671,13 +665,13 @@ for (; npts--; x++, y++) { /* traverse the line segments */ xp = x[0] - x[1]; yp = y[0] - y[1]; - nseg = (int) hypot((double) xp, (double) yp); + nseg = (int) groff_hypot((double) xp, (double) yp); xp = x[1] - x[2]; yp = y[1] - y[2]; /* `nseg' is the number of line */ /* segments that will be drawn for */ /* each curve segment. */ - nseg = (int) ((double) (nseg + (int) hypot((double) xp, (double) yp)) / + nseg = (int) ((double) (nseg + (int) groff_hypot((double) xp, (double) yp)) / res * PointsPerInterval); for (i = 1; i < nseg; i++) { @@ -795,7 +789,7 @@ dy = y[j + 1] - y[j]; /* Here was overflowing, so I changed it. */ /* u[i] += sqrt ((double) (dx * dx + dy * dy)); */ - u[i] += hypot((double) dx, (double) dy); + u[i] += groff_hypot((double) dx, (double) dy); } } for (i = 1; i < n; ++i) diff -ruN groff-1.19.1/src/preproc/grn/main.cpp groff-1.19.2/src/preproc/grn/main.cpp --- groff-1.19.1/src/preproc/grn/main.cpp 2004-04-17 07:28:40.000000000 +0200 +++ groff-1.19.2/src/preproc/grn/main.cpp 2005-05-03 08:07:28.000000000 +0200 @@ -214,7 +214,7 @@ void getres(); -char *doinput(FILE *fp); +int doinput(FILE *fp); void conv(register FILE *fp, int baseline); void savestate(); int has_polygon(register ELT *elist); @@ -317,7 +317,7 @@ } else fp = stdin; - while (doinput(fp) != NULL) { + while (doinput(fp)) { if (*c1 == '.' && *c2 == 'G' && *c3 == 'S') { if (compatibility_flag || *c4 == '\n' || *c4 == ' ' || *c4 == '\0') @@ -391,7 +391,7 @@ /*----------------------------------------------------------------------------* - | Routine: char * doinput (file_pointer) + | Routine: int doinput (file_pointer) | | Results: A line of input is read into `inputline'. | @@ -401,16 +401,14 @@ | updating `linenum'. *----------------------------------------------------------------------------*/ -char * +int doinput(FILE *fp) { - char *k; - - if ((k = fgets(inputline, MAXINLINE, fp)) == NULL) - return k; + if (fgets(inputline, MAXINLINE, fp) == NULL) + return 0; if (strchr(inputline, '\n')) /* ++ only if it's a complete line */ linenum++; - return (char *) !NULL; + return 1; } @@ -490,7 +488,7 @@ strcpy(GScommand, inputline); /* save `.GS' line for later */ do { - done = (doinput(fp) == NULL); /* test for EOF */ + done = !doinput(fp); /* test for EOF */ flyback = (*c3 == 'F'); /* and .GE or .GF */ compat = (compatibility_flag || *c4 == '\n' || *c4 == ' ' || *c4 == '\0'); diff -ruN groff-1.19.1/src/preproc/html/Makefile.sub groff-1.19.2/src/preproc/html/Makefile.sub --- groff-1.19.1/src/preproc/html/Makefile.sub 2003-04-12 15:52:45.000000000 +0200 +++ groff-1.19.2/src/preproc/html/Makefile.sub 2005-05-28 07:30:31.000000000 +0200 @@ -2,5 +2,6 @@ # MAN1=pre-grohtml.n MAN1= XLIBS=$(LIBGROFF) +MLIB=$(LIBM) OBJS=pre-html.$(OBJEXT) pushback.$(OBJEXT) CCSRCS=$(srcdir)/pre-html.cpp $(srcdir)/pushback.cpp diff -ruN groff-1.19.1/src/preproc/html/pre-html.cpp groff-1.19.2/src/preproc/html/pre-html.cpp --- groff-1.19.1/src/preproc/html/pre-html.cpp 2004-05-09 09:02:00.000000000 +0200 +++ groff-1.19.2/src/preproc/html/pre-html.cpp 2005-05-26 15:37:20.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #define PREHTMLC @@ -34,6 +34,7 @@ #include "defs.h" #include "searchpath.h" #include "paper.h" +#include "device.h" #include "font.h" #include @@ -210,6 +211,7 @@ static char *linebuf = NULL; // for scanning devps/DESC static int linebufsize = 0; +static const char *image_gen = NULL; // the `gs' program const char *const FONT_ENV_VAR = "GROFF_FONT_PATH"; static search_path font_path(FONT_ENV_VAR, FONTPATH, 0, 0); @@ -926,11 +928,12 @@ html_system(s, 1); s = make_message("echo showpage | " - "gs%s -q -dBATCH -dSAFER " + "%s%s -q -dBATCH -dSAFER " "-dDEVICEHEIGHTPOINTS=792 " "-dDEVICEWIDTHPOINTS=%d -dFIXEDMEDIA=true " "-sDEVICE=%s -r%d %s " "-sOutputFile=%s %s -\n", + image_gen, EXE_EXT, (getMaxX(pageno) * image_res) / postscriptRes, image_device, @@ -1542,13 +1545,10 @@ { "version", no_argument, 0, 'v' }, { NULL, 0, 0, 0 } }; - while ((c = getopt_long(argc, argv, - "+a:g:o:i:I:j:D:F:vbdhlrnp", long_options, NULL)) + while ((c = getopt_long(argc, argv, "+a:bdD:F:g:hi:I:j:lno:prs:S:v", + long_options, NULL)) != EOF) switch(c) { - case 'v': - printf("GNU pre-grohtml (groff) version %s\n", Version_string); - exit(0); case 'a': textAlphaBits = min(max(MIN_ALPHA_BITS, atoi(optarg)), MAX_ALPHA_BITS); @@ -1557,6 +1557,20 @@ exit(1); } break; + case 'b': + // handled by post-grohtml (set background color to white) + break; + case 'd': +#if defined(DEBUGGING) + debug = TRUE; +#endif + break; + case 'D': + image_dir = optarg; + break; + case 'F': + font_path.command_line_dir(optarg); + break; case 'g': graphicAlphaBits = min(max(MIN_ALPHA_BITS, atoi(optarg)), MAX_ALPHA_BITS); @@ -1565,38 +1579,42 @@ exit(1); } break; - case 'b': - // handled by post-grohtml (set background color to white) - break; - case 'D': - image_dir = optarg; - break; - case 'I': - image_template = optarg; + case 'h': + // handled by post-grohtml break; case 'i': image_res = atoi(optarg); break; - case 'F': - font_path.command_line_dir(optarg); + case 'I': + image_template = optarg; break; case 'j': // handled by post-grohtml (set job name for multiple file output) break; + case 'l': + // handled by post-grohtml (no automatic section links) + break; + case 'n': + // handled by post-grohtml (generate simple heading anchors) + break; case 'o': vertical_offset = atoi(optarg); break; case 'p': show_progress = TRUE; break; - case 'd': -#if defined(DEBUGGING) - debug = TRUE; -#endif + case 'r': + // handled by post-grohtml (no header and footer lines) break; - case 'h': - // handled by post-grohtml + case 's': + // handled by post-grohtml (use font size n as the html base font size) + break; + case 'S': + // handled by post-grohtml (set file split level) break; + case 'v': + printf("GNU pre-grohtml (groff) version %s\n", Version_string); + exit(0); case CHAR_MAX + 1: // --help usage(stdout); exit(0); @@ -1701,6 +1719,12 @@ } exit(1); #endif /* CAPTURE_MODE */ + device = "html"; + if (!font::load_desc()) + fatal("cannot find devhtml/DESC exiting"); + image_gen = font::image_generator; + if (image_gen == NULL || (strcmp(image_gen, "") == 0)) + fatal("devhtml/DESC must set the image_generator field, exiting"); postscriptRes = get_resolution(); i = scanArguments(argc, argv); setupAntiAlias(); diff -ruN groff-1.19.1/src/preproc/html/pre-html.h groff-1.19.2/src/preproc/html/pre-html.h --- groff-1.19.1/src/preproc/html/pre-html.h 2001-01-17 15:58:06.000000000 +0100 +++ groff-1.19.2/src/preproc/html/pre-html.h 2005-05-26 15:37:20.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ /* * defines functions implemented within pre-html.c diff -ruN groff-1.19.1/src/preproc/html/pushback.cpp groff-1.19.2/src/preproc/html/pushback.cpp --- groff-1.19.1/src/preproc/html/pushback.cpp 2004-04-17 07:52:59.000000000 +0200 +++ groff-1.19.2/src/preproc/html/pushback.cpp 2005-06-15 18:00:35.000000000 +0200 @@ -1,5 +1,5 @@ // -*- C++ -*- -/* Copyright (C) 2000, 2001, 2003, 2004 Free Software Foundation, Inc. +/* Copyright (C) 2000, 2001, 2003, 2004, 2005 Free Software Foundation, Inc. Written by Gaius Mulley (gaius@glam.ac.uk). This file is part of groff. @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "lib.h" @@ -83,14 +83,12 @@ pushBackBuffer::~pushBackBuffer () { - int old; - if (charStack != 0) { free(charStack); } close(0); /* restore stdin in file descriptor 0 */ - old = dup(stdIn); + dup(stdIn); close(stdIn); } @@ -162,10 +160,8 @@ void pushBackBuffer::skipToNewline (void) { - char ch; - while ((putPB(getPB()) != '\n') && (! eofFound)) { - ch = getPB(); + getPB(); } } diff -ruN groff-1.19.1/src/preproc/html/pushback.h groff-1.19.2/src/preproc/html/pushback.h --- groff-1.19.1/src/preproc/html/pushback.h 2004-04-17 07:53:31.000000000 +0200 +++ groff-1.19.2/src/preproc/html/pushback.h 2005-05-26 15:37:20.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #define eof (char)-1 diff -ruN groff-1.19.1/src/preproc/pic/common.cpp groff-1.19.2/src/preproc/pic/common.cpp --- groff-1.19.1/src/preproc/pic/common.cpp 2004-01-05 23:38:37.000000000 +0100 +++ groff-1.19.2/src/preproc/pic/common.cpp 2005-05-26 15:37:20.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "pic.h" #include "common.h" diff -ruN groff-1.19.1/src/preproc/pic/common.h groff-1.19.2/src/preproc/pic/common.h --- groff-1.19.1/src/preproc/pic/common.h 2004-01-05 23:38:52.000000000 +0100 +++ groff-1.19.2/src/preproc/pic/common.h 2005-05-26 15:37:20.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ class common_output : public output { private: diff -ruN groff-1.19.1/src/preproc/pic/lex.cpp groff-1.19.2/src/preproc/pic/lex.cpp --- groff-1.19.1/src/preproc/pic/lex.cpp 2003-04-18 20:27:16.000000000 +0200 +++ groff-1.19.2/src/preproc/pic/lex.cpp 2005-05-26 15:37:20.000000000 +0200 @@ -1,5 +1,5 @@ // -*- C++ -*- -/* Copyright (C) 1989, 1990, 1991, 1992, 2000, 2002, 2003 +/* Copyright (C) 1989, 1990, 1991, 1992, 2000, 2002, 2003, 2004 Free Software Foundation, Inc. Written by James Clark (jjc@jclark.com) @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "pic.h" #include "ptable.h" @@ -1329,21 +1329,23 @@ class for_input : public input { char *var; char *body; + double from; double to; int by_is_multiplicative; double by; const char *p; int done_newline; public: - for_input(char *, double, int, double, char *); + for_input(char *, double, double, int, double, char *); ~for_input(); int get(); int peek(); }; -for_input::for_input(char *vr, double t, int bim, double b, char *bd) -: var(vr), body(bd), to(t), by_is_multiplicative(bim), by(b), p(body), - done_newline(0) +for_input::for_input(char *vr, double f, double t, + int bim, double b, char *bd) +: var(vr), body(bd), from(f), to(t), by_is_multiplicative(bim), by(b), + p(body), done_newline(0) { } @@ -1374,7 +1376,8 @@ else val += by; define_variable(var, val); - if (val > to) { + if ((from <= to && val > to) + || (from >= to && val < to)) { p = 0; return EOF; } @@ -1399,7 +1402,8 @@ return EOF; } else { - if (val + by > to) + if ((from <= to && val + by > to) + || (from >= to && val + by < to)) return EOF; } if (*body == '\0') @@ -1411,8 +1415,12 @@ double by, char *body) { define_variable(var, from); - if (from <= to) - input_stack::push(new for_input(var, to, by_is_multiplicative, by, body)); + if ((by_is_multiplicative && by <= 0) + || (by > 0 && from > to) + || (by < 0 && from < to)) + return; + input_stack::push(new for_input(var, from, to, + by_is_multiplicative, by, body)); } diff -ruN groff-1.19.1/src/preproc/pic/main.cpp groff-1.19.2/src/preproc/pic/main.cpp --- groff-1.19.1/src/preproc/pic/main.cpp 2003-04-18 20:21:29.000000000 +0200 +++ groff-1.19.2/src/preproc/pic/main.cpp 2005-05-26 15:37:20.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "pic.h" diff -ruN groff-1.19.1/src/preproc/pic/object.cpp groff-1.19.2/src/preproc/pic/object.cpp --- groff-1.19.1/src/preproc/pic/object.cpp 2004-04-07 17:27:56.000000000 +0200 +++ groff-1.19.2/src/preproc/pic/object.cpp 2005-05-26 15:37:20.000000000 +0200 @@ -1,5 +1,5 @@ // -*- C++ -*- -/* Copyright (C) 1989, 1990, 1991, 1992, 2001, 2002, 2003, 2004 +/* Copyright (C) 1989, 1990, 1991, 1992, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. Written by James Clark (jjc@jclark.com) @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "pic.h" #include "ptable.h" @@ -202,7 +202,7 @@ double hypot(const position &a) { - return hypot(a.x, a.y); + return groff_hypot(a.x, a.y); } struct arrow_head_type { @@ -233,13 +233,14 @@ v[2] = pos + base - n; // fill with outline color out->set_color(outline_color_for_fill, outline_color_for_fill); + // make stroke thin to avoid arrow sticking + slt.thickness = 0.1; out->polygon(v, 3, slt, 1); } else { - position v[2]; - v[0] = pos; - v[1] = pos + base + n; - out->line(pos + base - n, v, 2, slt); + // use two line segments to avoid arrow sticking + out->line(pos + base - n, &pos, 1, slt); + out->line(pos + base + n, &pos, 1, slt); } } @@ -1258,12 +1259,47 @@ if (lt.type == line_type::invisible) return; out->set_color(0, graphic_object::get_outline_color()); - out->line(strt, v, n, lt); - if (arrow_at_start) - draw_arrow(strt, strt-v[0], aht, lt, graphic_object::get_outline_color()); - if (arrow_at_end) - draw_arrow(en, v[n-1] - (n > 1 ? v[n - 2] : strt), aht, lt, - graphic_object::get_outline_color()); + // shorten line length to avoid arrow sticking. + position sp = strt; + if (arrow_at_start) { + position base = v[0] - strt; + double hyp = hypot(base); + if (hyp == 0.0) { + error("cannot draw arrow on object with zero length"); + return; + } + if (aht.solid && out->supports_filled_polygons()) { + base *= aht.height / hyp; + draw_arrow(strt, strt - v[0], aht, lt, + graphic_object::get_outline_color()); + sp = strt + base; + } else { + base *= fabs(lt.thickness) / hyp / 72 / 4; + sp = strt + base; + draw_arrow(sp, sp - v[0], aht, lt, + graphic_object::get_outline_color()); + } + } + if (arrow_at_end) { + position base = v[n-1] - (n > 1 ? v[n-2] : strt); + double hyp = hypot(base); + if (hyp == 0.0) { + error("cannot draw arrow on object with zero length"); + return; + } + if (aht.solid && out->supports_filled_polygons()) { + base *= aht.height / hyp; + draw_arrow(en, v[n-1] - (n > 1 ? v[n-2] : strt), aht, lt, + graphic_object::get_outline_color()); + v[n-1] = en - base; + } else { + base *= fabs(lt.thickness) / hyp / 72 / 4; + v[n-1] = en - base; + draw_arrow(v[n-1], v[n-1] - (n > 1 ? v[n-2] : strt), aht, lt, + graphic_object::get_outline_color()); + } + } + out->line(sp, v, n, lt); out->reset_color(); } @@ -1328,12 +1364,47 @@ if (lt.type == line_type::invisible) return; out->set_color(0, graphic_object::get_outline_color()); - out->spline(strt, v, n, lt); - if (arrow_at_start) - draw_arrow(strt, strt-v[0], aht, lt, graphic_object::get_outline_color()); - if (arrow_at_end) - draw_arrow(en, v[n-1] - (n > 1 ? v[n - 2] : strt), aht, lt, - graphic_object::get_outline_color()); + // shorten line length for spline to avoid arrow sticking + position sp = strt; + if (arrow_at_start) { + position base = v[0] - strt; + double hyp = hypot(base); + if (hyp == 0.0) { + error("cannot draw arrow on object with zero length"); + return; + } + if (aht.solid && out->supports_filled_polygons()) { + base *= aht.height / hyp; + draw_arrow(strt, strt - v[0], aht, lt, + graphic_object::get_outline_color()); + sp = strt + base*0.1; // to reserve spline shape + } else { + base *= fabs(lt.thickness) / hyp / 72 / 4; + sp = strt + base; + draw_arrow(sp, sp - v[0], aht, lt, + graphic_object::get_outline_color()); + } + } + if (arrow_at_end) { + position base = v[n-1] - (n > 1 ? v[n-2] : strt); + double hyp = hypot(base); + if (hyp == 0.0) { + error("cannot draw arrow on object with zero length"); + return; + } + if (aht.solid && out->supports_filled_polygons()) { + base *= aht.height / hyp; + draw_arrow(en, v[n-1] - (n > 1 ? v[n-2] : strt), aht, lt, + graphic_object::get_outline_color()); + v[n-1] = en - base*0.1; // to reserve spline shape + } else { + base *= fabs(lt.thickness) / hyp / 72 / 4; + v[n-1] = en - base; + draw_arrow(v[n-1], v[n-1] - (n > 1 ? v[n-2] : strt), aht, lt, + graphic_object::get_outline_color()); + } + } + out->spline(sp, v, n, lt); out->reset_color(); } @@ -1542,22 +1613,70 @@ if (lt.type == line_type::invisible) return; out->set_color(0, graphic_object::get_outline_color()); - if (clockwise) - out->arc(en, cent, strt, lt); - else - out->arc(strt, cent, en, lt); + // handle arrow direction; make shorter line for arc + position sp, ep, b; + if (clockwise) { + sp = en; + ep = strt; + } else { + sp = strt; + ep = en; + } if (arrow_at_start) { - position c = cent - strt; - draw_arrow(strt, - (clockwise ? position(c.y, -c.x) : position(-c.y, c.x)), - aht, lt, graphic_object::get_outline_color()); + double theta = aht.height / rad; + if (clockwise) + theta = - theta; + b = strt - cent; + b = position(b.x*cos(theta) - b.y*sin(theta), + b.x*sin(theta) + b.y*cos(theta)) + cent; + if (clockwise) + ep = b; + else + sp = b; + if (aht.solid && out->supports_filled_polygons()) { + draw_arrow(strt, strt - b, aht, lt, + graphic_object::get_outline_color()); + } else { + position v = b; + theta = fabs(lt.thickness) / 72 / 4 / rad; + if (clockwise) + theta = - theta; + b = strt - cent; + b = position(b.x*cos(theta) - b.y*sin(theta), + b.x*sin(theta) + b.y*cos(theta)) + cent; + draw_arrow(b, b - v, aht, lt, + graphic_object::get_outline_color()); + out->line(b, &v, 1, lt); + } } if (arrow_at_end) { - position e = en - cent; - draw_arrow(en, - (clockwise ? position(e.y, -e.x) : position(-e.y, e.x)), - aht, lt, graphic_object::get_outline_color()); + double theta = aht.height / rad; + if (!clockwise) + theta = - theta; + b = en - cent; + b = position(b.x*cos(theta) - b.y*sin(theta), + b.x*sin(theta) + b.y*cos(theta)) + cent; + if (clockwise) + sp = b; + else + ep = b; + if (aht.solid && out->supports_filled_polygons()) { + draw_arrow(en, en - b, aht, lt, + graphic_object::get_outline_color()); + } else { + position v = b; + theta = fabs(lt.thickness) / 72 / 4 / rad; + if (!clockwise) + theta = - theta; + b = en - cent; + b = position(b.x*cos(theta) - b.y*sin(theta), + b.x*sin(theta) + b.y*cos(theta)) + cent; + draw_arrow(b, b - v, aht, lt, + graphic_object::get_outline_color()); + out->line(b, &v, 1, lt); + } } + out->arc(sp, cent, ep, lt); out->reset_color(); } @@ -1753,7 +1872,7 @@ obj->set_thickness(th); if (flags & IS_OUTLINED) obj->set_outline_color(outlined); - if (flags & (IS_DEFAULT_FILLED|IS_FILLED)) { + if (flags & (IS_DEFAULT_FILLED | IS_FILLED)) { if (flags & IS_SHADED) obj->set_fill_color(shaded); else { diff -ruN groff-1.19.1/src/preproc/pic/object.h groff-1.19.2/src/preproc/pic/object.h --- groff-1.19.1/src/preproc/pic/object.h 2004-04-17 07:23:06.000000000 +0200 +++ groff-1.19.2/src/preproc/pic/object.h 2005-05-26 15:37:20.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ struct place; diff -ruN groff-1.19.1/src/preproc/pic/output.h groff-1.19.2/src/preproc/pic/output.h --- groff-1.19.1/src/preproc/pic/output.h 2004-01-05 23:39:18.000000000 +0100 +++ groff-1.19.2/src/preproc/pic/output.h 2005-05-26 15:37:20.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ struct line_type { enum { invisible, solid, dotted, dashed } type; diff -ruN groff-1.19.1/src/preproc/pic/pic.cpp groff-1.19.2/src/preproc/pic/pic.cpp --- groff-1.19.1/src/preproc/pic/pic.cpp 2004-05-13 15:31:41.000000000 +0200 +++ groff-1.19.2/src/preproc/pic/pic.cpp 2005-09-04 12:16:14.000000000 +0200 @@ -205,18 +205,19 @@ 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 26, 26, 25, 25, 19, 19, 6, 6, - 6, 6, 6, 6, 45, 45, 5, 5, 13, 13, - 13, 13, 13, 14, 14, 14, 22, 22, 21, 21, - 8, 8, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 11, 11, 12, 12, 12, 10, 10, 10, 10, - 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, + 18, 18, 26, 26, 25, 25, 19, 19, 19, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 45, + 45, 5, 5, 13, 13, 13, 13, 13, 14, 14, + 14, 22, 22, 21, 21, 8, 8, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 11, 11, 12, 12, + 12, 10, 10, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, }; short yylen[] = { 2, 1, 1, 3, 1, 3, 0, 1, 1, 2, 3, @@ -232,30 +233,31 @@ 3, 3, 3, 3, 3, 2, 2, 2, 3, 2, 3, 2, 3, 3, 3, 3, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 3, 2, 1, 5, 0, 3, 1, 1, 1, 3, - 3, 5, 5, 6, 1, 4, 3, 3, 1, 2, - 2, 3, 1, 1, 1, 3, 1, 3, 1, 2, - 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, - 1, 2, 3, 1, 1, 2, 1, 5, 4, 3, - 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, - 2, 1, 1, 2, 2, 2, 2, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, - 2, 3, 3, 3, 3, 3, 3, 2, 3, 4, - 4, 6, 4, 4, 4, 6, 6, 4, 4, 3, - 4, 3, 3, 3, 3, 3, 3, 3, 3, 2, + 3, 2, 1, 5, 0, 3, 1, 1, 3, 1, + 3, 5, 3, 5, 5, 5, 7, 6, 8, 1, + 4, 3, 3, 1, 2, 2, 3, 1, 1, 1, + 3, 1, 3, 1, 2, 2, 2, 1, 1, 1, + 1, 1, 1, 1, 2, 1, 2, 3, 1, 1, + 2, 1, 5, 4, 3, 3, 2, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 2, 2, 2, 2, 1, 1, 2, 2, + 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, + 3, 3, 2, 3, 4, 4, 6, 4, 4, 4, + 6, 6, 4, 4, 3, 4, 3, 3, 3, 3, + 3, 3, 3, 3, 2, }; short yydefred[] = { 0, 8, 0, 2, 0, 0, 0, 0, 133, 17, 13, 14, 15, 16, 74, 75, 76, 77, 78, 79, 80, 81, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 85, 68, 0, 4, 0, 0, 82, 71, 0, - 9, 0, 0, 0, 0, 0, 26, 0, 154, 215, - 216, 157, 159, 196, 197, 153, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 194, 195, - 0, 0, 202, 203, 208, 209, 210, 211, 212, 214, - 213, 0, 0, 0, 0, 0, 139, 137, 155, 0, + 9, 0, 0, 0, 0, 0, 26, 0, 159, 220, + 221, 162, 164, 201, 202, 158, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 199, 200, + 0, 0, 207, 208, 213, 214, 215, 216, 217, 219, + 218, 0, 0, 0, 0, 0, 140, 137, 160, 0, 0, 0, 0, 0, 0, 44, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 32, 3, 0, 121, 122, 123, 0, 0, @@ -264,1577 +266,1629 @@ 129, 130, 124, 125, 0, 0, 0, 0, 0, 132, 0, 126, 39, 0, 0, 11, 0, 37, 36, 10, 23, 0, 21, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 198, 200, 204, 206, 199, 201, - 205, 207, 0, 0, 0, 0, 0, 0, 0, 0, - 145, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 217, - 218, 219, 220, 221, 0, 150, 0, 0, 171, 163, - 164, 165, 166, 167, 168, 169, 0, 162, 160, 161, - 42, 0, 0, 60, 0, 0, 0, 46, 0, 0, - 0, 0, 84, 135, 0, 0, 0, 0, 5, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 103, 0, 177, - 0, 0, 0, 105, 0, 0, 0, 0, 0, 115, - 116, 114, 40, 0, 0, 0, 0, 0, 0, 65, - 0, 12, 0, 27, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 240, 0, 0, 229, 148, 0, 158, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 156, - 140, 141, 170, 0, 0, 56, 0, 0, 0, 0, - 0, 54, 0, 0, 53, 52, 0, 86, 69, 33, - 174, 182, 0, 0, 0, 172, 0, 0, 176, 0, - 0, 24, 0, 230, 231, 0, 233, 234, 235, 0, - 0, 238, 239, 241, 0, 0, 0, 0, 0, 47, - 0, 134, 0, 0, 181, 180, 0, 173, 0, 0, - 28, 0, 0, 0, 142, 146, 0, 0, 0, 0, - 73, 70, 179, 0, 25, 49, 232, 236, 237, 144, - 0, 0, 178, 0, 0, 29, 0, 0, 30, + 0, 0, 0, 0, 203, 205, 209, 211, 204, 206, + 210, 212, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 150, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 222, 223, 224, 225, 226, 0, 155, 0, 0, 176, + 168, 169, 170, 171, 172, 173, 174, 0, 167, 165, + 166, 42, 0, 0, 60, 0, 0, 0, 46, 0, + 0, 0, 0, 84, 135, 0, 0, 0, 0, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 103, 0, + 182, 0, 0, 0, 105, 0, 0, 0, 0, 0, + 115, 116, 114, 40, 0, 0, 0, 0, 0, 0, + 65, 0, 12, 0, 27, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 245, 0, 0, 0, 0, 234, + 153, 139, 0, 0, 0, 163, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 161, 141, 143, 175, 0, + 0, 56, 0, 0, 0, 0, 0, 54, 0, 0, + 53, 52, 0, 86, 69, 33, 179, 187, 0, 0, + 0, 177, 0, 0, 181, 0, 0, 24, 0, 235, + 236, 0, 238, 239, 240, 0, 0, 243, 244, 246, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, + 0, 134, 0, 0, 186, 185, 0, 178, 0, 0, + 28, 0, 0, 0, 0, 0, 145, 142, 144, 151, + 0, 0, 0, 0, 73, 70, 184, 0, 25, 49, + 237, 241, 242, 0, 0, 148, 0, 0, 183, 0, + 147, 0, 0, 29, 149, 0, 0, 30, }; short yydgoto[] = { 2, - 112, 194, 114, 422, 97, 98, 34, 99, 100, 278, - 279, 280, 115, 102, 35, 3, 36, 37, 103, 238, - 104, 105, 170, 401, 357, 116, 107, 108, 256, 5, - 39, 48, 303, 399, 172, 373, 428, 258, 40, 350, - 122, 412, 393, 121, 217, + 112, 194, 114, 438, 97, 98, 34, 99, 100, 279, + 280, 281, 115, 102, 35, 3, 36, 37, 103, 239, + 104, 105, 170, 411, 363, 116, 107, 108, 257, 5, + 39, 48, 304, 409, 172, 379, 447, 259, 40, 356, + 122, 426, 403, 121, 218, }; -short yysindex[] = { -57, - 0, 0, 0, 5015, -24, -4, -8, 0, 0, 0, +short yysindex[] = { -58, + 0, 0, 0, 5077, -43, -21, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -2, -245, 0,12240, -182,12363, -175,12960, 45, -12240, 0, 0, -261, 0, -57,11821, 0, 0, -43, - 0, -57,12363, 42, -103, -214, 0, -125, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 126, 161, 166, - 176, 186, 187, 190, 194, 197, 198, 203, 0, 0, - -199, -147, 0, 0, 0, 0, 0, 0, 0, 0, - 0,12480,12363,12960,12960, 1256, 0, 0, 0, -22, - -223, 867, 21, 191, -1, 0,12240, 0, 183,12363, -12363, 361, -44, -187, -223, -179, 0, 798, -11,12240, - -57, -57, 0, 0,13430, 0, 0, 0,13323,13323, -13323,13323,12960,12960,12960,12960,13083,13083,13083,12720, -13200, 0, 0,13323,13323,13323, 0, 0, 0, 0, - 0, 0, 0, 0,12960,13323, -247, -247, -247, 0, - 1697, 0, 0, -6,11489, 0,12363, 0, 0, 0, - 0, -9, 0,12363,12363,12363,12363,12363,12363,12363, -12363,12363,11938,12363, 0, 0, 0, 0, 0, 0, - 0, 0, 1597, 214, 221, 36, 1, 172, 172, -34, - 0,12960,12960,12960,12960,12960,12960,12960,13083,12960, -12960,12960,12960,12960,12960,12960,13083, -18, 232, 0, - 0, 0, 0, 0, 24, 0,13200,13200, 0, 0, - 0, 0, 0, 0, 0, 0, 192, 0, 0, 0, - 0,12960, 172, 0,12363,12363,12960, 0,12363,12363, - -247, -247, 0, 0, 195, 5015, 162, 27, 0, 1697, - 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1256, 21, 21, - 21, 1783, 428, 428, 43,12123, -22, 0, 467, 0, - 21,12603, 680, 0, 1697, 1697, 1697, 1697, 1697, 0, - 0, 0, 0, -4, -8, 0, 0, 0, -223, 0, - 21, 0, 44, 0, 252, 264, 278, 267, 290, 291, - 289, 301, 294, 0, 310, 312, 0, 0,13083, 0, - 51, -5, -26, 99, 99, 714, 714, 1697, -19, 49, - 714, 337, 337, 172, 172, 172, 172, -38, 232, 0, - 0, 0, 0, 3111, -5, 0, 1733, 11, 714, 96, - -5, 0, 1733, 11, 0, 0, 17, 0, 0, 0, - 0, 0, 191, 927, 927, 0, 323, 113, 0, 1277, - 221, 0, 13, 0, 0,12363, 0, 0, 0,12363, -12363, 0, 0, 0, 6, 66,13083,13083,12960, 0, -12960, 0, 5015, 927, 0, 0, 927, 0, 13, 115, - 0, 332, 339, 340, 0, 0, -14, 21, 2174, 1697, - 0, 0, 0, 344, 0, 0, 0, 0, 0, 0, -12843, 46, 0,12960, 1697, 0, 1697, 125, 0, + 0, 19, -242, 0,12299, -173,12422, -155,13019, 85, +12299, 0, 0, -214, 0, -58,11880, 0, 0, -42, + 0, -58,12422, 76, -160, -195, 0, -118, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 108, 120, 127, + 133, 137, 154, 161, 162, 173, 174, 179, 0, 0, + -193, -119, 0, 0, 0, 0, 0, 0, 0, 0, + 0,12539,12422,13019,13019, -34, 0, 0, 0, -51, + 170, 585, 46, 495, 329, 0,12299, 0, 110,12422, +12422, 1768, -71, -227, 170, -197, 0, -22, -50,12299, + -58, -58, 0, 0,13489, 0, 0, 0,13382,13382, +13382,13382,13019,13019,13019,13019,13142,13142,13142,12779, +13259, 0, 0,13382,13382,13382, 0, 0, 0, 0, + 0, 0, 0, 0,13019,13382, -228, -228, -228, 0, + 1792, 0, 0, -30,11548, 0,12422, 0, 0, 0, + 0, -28, 0,12422,12422,12422,12422,12422,12422,12422, +12422,12422,11997,12422, 0, 0, 0, 0, 0, 0, + 0, 0, 1315, 194, 198, -11, 299, -10, 159, 159, + -47, 0,13019,13019,13019,13019,13019,13019,13019,13142, +13019,13019,13019,13019,13019,13019,13019,13142, -8, 211, + 0, 0, 0, 0, 0, 2, 0,13259,13259, 0, + 0, 0, 0, 0, 0, 0, 0, 177, 0, 0, + 0, 0,13019, 159, 0,12422,12422,13019, 0,12422, +12422, -228, -228, 0, 0, 180, 5077, 147, 25, 0, + 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, -34, 46, + 46, 46, 1842, 318, 318, 29,12182, -51, 0, 525, + 0, 46,12662, 1336, 0, 1792, 1792, 1792, 1792, 1792, + 0, 0, 0, 0, -21, -2, 0, 0, 0, 170, + 0, 46, 0, 27, 0, 251, 264, 262, 292, 293, + 295, 301, 304, 308, 0, 312, 313,13142,13142, 0, + 0, 0,13142,13259,13259, 0, 57, 1194, 6, 1166, + 1166, 506, 506, 1792, -1, 343, 506, 388, 388, 159, + 159, 159, 159, -16, 211, 0, 0, 0, 0, 3170, + 1194, 0, 394, 14, 506, 103, 1194, 0, 394, 14, + 0, 0, 21, 0, 0, 0, 0, 0, 495, 986, + 986, 0, 324, 118, 0, 1756, 198, 0, 12, 0, + 0,12422, 0, 0, 0,12422,12422, 0, 0, 0, + 389, 7, 131, 351, 353, 79,13142,13142,13019, 0, +13019, 0, 5077, 986, 0, 0, 986, 0, 12, 135, + 0, 361, 363, 365,13142,13142, 0, 0, 0, 0, + 56, 46, 2233, 1792, 0, 0, 0, 367, 0, 0, + 0, 0, 0, 205, 296, 0,12902, 64, 0, 370, + 0,13019, 1792, 0, 0, 1792, 151, 0, }; -short yyrindex[] = { 41, - 0, 0, 0, 389, 167, 0, 0, 0, 0, 0, +short yyrindex[] = { 5, + 0, 0, 0, 424, 200, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, + 0, 0, 0, 31, 0, 34, 102, 0, 0, 139, + 0,11744, 0, 0, 0, 639, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, - 0, 0, 0, 117, 0, 8, 135, 0, 0, 236, - 0,11685, 0, 0, 0, 284, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,10124, 0, 0, 0, 0, + 4478, 9516,10459, 0, 0, 0, 691, 0, 0, 0, + 0, 1713, 0, 2171, 0, 0, 0,11366, 0, 692, + 5532, 5532, 0, 0, 136, 0, 0, 0,10701,10765, +10277,10580, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,10829,10955,11019, 0, 0, 0, 0, + 0, 0, 0, 0, 0,11083, 0, 0, 0, 0, + 5277, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0,10065, 0, 0, 0, 0, - 4419, 9457,10400, 0, 0, 0, 633, 0, 0, 0, - 0, 2068, 0, 2113, 0, 0, 0,11307, 0, 661, - 5476, 5476, 0, 0, 9, 0, 0, 0,10642,10706, -10218,10521, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0,10770,10896,10960, 0, 0, 0, 0, - 0, 0, 0, 0, 0,11024, 0, 0, 0, 0, - 5218, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 385, 0, 421, 441, 0, 0, 356, 697, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 350, 0, 84, 0, 0, 297, 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3045, 0, + 0, 0, 0,10627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5394, 5735, 5852, 6193, 6310, 6651, 6768, 7109, 0, 7226, + 7567, 7684, 9818, -213, 169, 0, 0, 9399, 0, 9912, + 0, 8025, 0, 0, 0, 8142, 8483, 8600, 8941, 9058, + 0, 0, 0, 0,11436, 1656, 2507, 2965, 321, 362, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0,10568, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 5335, - 5676, 5793, 6134, 6251, 6592, 6709, 7050, 0, 7167, 7508, - 7625, 9759, -238, 134, 0, 0, 9340, 0, 9853, 0, - 7966, 0, 0, 0, 8083, 8424, 8541, 8882, 8999, 0, - 0, 0, 0,11377, 1711, 2448, 2906, 211, 309, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4020, 4361, 3445, + 3562, 2188, 2529, 4936,10001, 0, 2646, 1730, 2071, 814, + 1155, 1272, 1613, 0, 3903, 0, 0, 0, 0, 0, + 33, 0, 4451, 3118, 2987, 0, 326, 0, 3990, 4906, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3961, 4302, 3386, 3503, 2129, 2470, 4877, 9942, 0, - 2587, 1671, 2012, 755, 1096, 1213, 1554, 0, 3844, 0, - 0, 0, 0, 0, 4392, 0, 4850, 3059, 2928, 0, - 3931, 0, 5305, 5763, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 350, - 0, 0, 676, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 385, 0, 0, 701, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 694, 0, 0, 0, 0, 0, 676, 0, - 0, 0, 0, 0, 0, 0, 0, 4760, 54, 19, + 0, 0, 0, 452, 455, 0, 0, 0, 0, 0, + 0, 0, 720, 0, 0, 0, 0, 0, 701, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 55, 0, 64, 0, 0, + 0, 4819, 92, 32, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 396, 0, 0, 0, 0, 460, + 0, 0, 96, 0, 0, 97, 0, 0, }; short yygindex[] = { 0, - -25, 368, -97, 0, -53, 247, 0, 0, 93, 0, - 0, -133, 31, -73, -122, 97, 0, 0, 1557, -60, - 0, 0, 0, 14, 0, 40, 366, -87, 10, 380, + -25, 401, -104, 0, -78, 280, 0, 0, 1852, 0, + 0, -238, 104, -81, -108, 43, 0, 0, 2253, -44, + 0, 0, 0, 38, 0, 50, 417, -36, 22, 414, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, + 0, 0, 0, 0, 269, }; -#define YYTABLESIZE 13804 +#define YYTABLESIZE 13863 short yytable[] = { 96, - 164, 1, 259, 118, 227, 96, 228, 6, 7, 4, - 215, 161, 8, 244, 46, 213, 211, 215, 212, 241, - 214, 157, 213, 211, 35, 212, 219, 214, 227, 157, - 228, 215, 241, 247, 41, 210, 213, 211, 195, 212, - 6, 214, 300, 38, 240, 124, 405, 420, 227, 44, - 228, 165, 43, 42, 247, 101, 210, 392, 45, 136, - 391, 101, 136, 227, 106, 228, 193, 216, 198, 199, - 106, 185, 186, 93, 216, 109, 162, 93, 227, 319, - 228, 96, 117, 35, 119, 243, 123, 284, 216, 237, - 47, 227, 387, 228, 96, 220, 221, 222, 223, 224, - 6, 7, 167, 260, 261, 262, 263, 264, 265, 266, - 267, 268, 268, 268, 268, 283, 31, 35, 285, 286, - 287, 171, 101, 189, 190, 30, 139, 139, 139, 288, - 289, 6, 6, 7, 64, 215, 173, 101, 362, 268, - 213, 211, 367, 212, 339, 214, 106, 346, 348, 35, - 101, 352, 354, 168, 169, 187, 188, 253, 247, 106, - 210, 249, 250, 6, 38, 174, 7, 101, 101, 101, - 101, 251, 252, 341, 342, 31, 322, 323, 324, 325, - 326, 327, 328, 329, 331, 332, 333, 334, 335, 336, - 337, 268, 216, 64, 226, 299, 290, 291, 292, 7, - 175, 283, 283, 219, 38, 176, 7, 191, 192, 31, - 66, 7, 364, 365, 163, 177, 344, 255, 257, 345, - 347, 349, 195, 351, 353, 178, 179, 64, 371, 180, - 395, 396, 277, 181, 49, 34, 182, 183, 49, 101, - 52, 31, 184, 242, 52, 53, 248, 101, 254, 53, - 193, 293, 304, 137, 317, 137, 370, 7, 229, 64, - 413, 318, 7, 414, 320, 216, 239, 388, 321, 66, - 411, 230, 231, 232, 233, 234, 235, 225, 236, 218, - 340, 237, 200, 22, 343, 201, 359, 358, 360, 7, - 355, 356, 374, 268, 34, 38, 228, 6, 6, 366, - 6, 6, 394, 66, 375, 372, 101, 377, 67, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 376, 202, 6, 204, 205, 206, 207, 34, 228, - 378, 379, 380, 228, 382, 66, 228, 228, 228, 228, - 228, 228, 22, 228, 381, 204, 205, 206, 207, 101, - 383, 138, 384, 138, 386, 228, 228, 390, 228, 249, - 34, 268, 268, 409, 361, 410, 397, 67, 277, 398, - 406, 369, 417, 215, 416, 6, 22, 400, 213, 418, - 419, 6, 6, 214, 423, 6, 429, 6, 1, 228, - 50, 426, 228, 159, 113, 425, 120, 215, 427, 61, - 62, 67, 213, 211, 6, 212, 6, 214, 22, 63, - 166, 298, 415, 6, 6, 125, 0, 101, 101, 0, - 247, 228, 210, 7, 7, 7, 7, 7, 0, 7, - 216, 0, 38, 67, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 0, 0, 7, - 229, 206, 207, 0, 216, 0, 361, 361, 0, 0, - 197, 0, 0, 230, 231, 232, 233, 234, 235, 0, - 236, 0, 0, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 0, 361, 0, 0, 361, + 1, 164, 216, 118, 6, 96, 245, 214, 212, 209, + 213, 161, 215, 195, 216, 41, 260, 46, 220, 214, + 212, 4, 213, 35, 215, 210, 228, 211, 229, 322, + 31, 8, 253, 6, 368, 216, 42, 248, 373, 211, + 214, 212, 216, 213, 93, 215, 162, 214, 212, 228, + 213, 229, 215, 38, 162, 44, 301, 124, 43, 217, + 241, 402, 285, 165, 401, 248, 193, 211, 199, 200, + 242, 217, 136, 253, 106, 136, 253, 185, 186, 45, + 106, 96, 35, 242, 109, 244, 162, 93, 228, 31, + 229, 253, 217, 47, 96, 6, 168, 169, 228, 217, + 229, 64, 117, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 269, 269, 269, 284, 35, 436, 286, 287, + 288, 250, 251, 31, 119, 253, 6, 6, 101, 289, + 290, 405, 406, 123, 101, 7, 167, 345, 34, 269, + 171, 352, 354, 173, 30, 358, 360, 174, 35, 347, + 348, 189, 190, 252, 253, 31, 106, 253, 6, 175, + 64, 187, 188, 256, 258, 427, 176, 254, 428, 106, + 243, 417, 177, 228, 38, 229, 178, 328, 329, 330, + 331, 332, 333, 334, 335, 337, 338, 339, 340, 341, + 342, 343, 269, 179, 64, 196, 220, 34, 195, 7, + 180, 181, 284, 284, 377, 49, 291, 292, 293, 255, + 101, 52, 182, 183, 38, 163, 53, 350, 184, 249, + 351, 353, 355, 101, 357, 359, 64, 294, 7, 370, + 371, 34, 7, 305, 320, 191, 192, 8, 321, 7, + 101, 101, 101, 101, 7, 394, 395, 228, 49, 229, + 219, 193, 217, 326, 52, 327, 226, 376, 346, 53, + 7, 6, 6, 34, 6, 6, 440, 201, 300, 349, + 202, 365, 364, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 372, 366, 6, 378, 398, + 7, 380, 335, 269, 425, 7, 253, 269, 284, 284, + 201, 361, 362, 202, 381, 382, 38, 221, 222, 223, + 224, 225, 416, 101, 203, 204, 205, 206, 207, 208, + 66, 101, 7, 253, 404, 55, 203, 204, 205, 206, + 207, 208, 383, 384, 253, 385, 441, 253, 228, 6, + 229, 324, 323, 325, 386, 6, 6, 387, 388, 6, + 30, 6, 389, 390, 203, 233, 205, 206, 207, 208, + 396, 67, 250, 137, 400, 137, 55, 407, 6, 55, + 6, 269, 269, 423, 408, 424, 410, 6, 6, 66, + 196, 253, 253, 420, 55, 228, 397, 229, 233, 269, + 269, 418, 233, 419, 430, 233, 233, 233, 233, 233, + 233, 431, 233, 432, 138, 433, 138, 439, 238, 444, + 445, 443, 448, 66, 233, 233, 446, 233, 55, 238, + 67, 101, 101, 1, 216, 50, 101, 113, 164, 214, + 216, 228, 415, 229, 215, 214, 212, 61, 213, 146, + 215, 62, 63, 166, 299, 66, 429, 120, 233, 125, + 55, 233, 38, 248, 67, 211, 7, 7, 7, 7, + 7, 319, 7, 140, 140, 140, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 0, 7, 7, 7, 7, 7, 7, 0, - 0, 7, 368, 7, 0, 0, 0, 0, 237, 0, - 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 0, 7, 0, 302, 0, 0, 0, 0, 7, - 7, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 315, 316, 0, 228, 228, 228, 228, 0, 0, 228, - 228, 228, 228, 228, 228, 228, 228, 228, 228, 0, - 0, 0, 0, 0, 0, 0, 0, 228, 228, 0, - 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, - 228, 228, 228, 228, 228, 228, 228, 228, 228, 0, - 0, 228, 228, 228, 228, 228, 228, 228, 228, 228, - 228, 228, 228, 228, 228, 0, 0, 0, 0, 0, + 233, 217, 7, 138, 138, 138, 67, 217, 221, 222, + 223, 224, 225, 198, 141, 141, 141, 143, 143, 143, + 101, 101, 148, 148, 148, 0, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 101, 101, + 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, + 7, 7, 216, 0, 7, 0, 7, 214, 212, 0, + 213, 0, 215, 0, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 0, 7, 0, 303, 0, 0, + 374, 0, 7, 7, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 316, 317, 238, 0, 0, 230, 55, + 231, 232, 233, 234, 235, 236, 240, 237, 0, 217, + 0, 231, 232, 233, 234, 235, 236, 0, 237, 0, + 0, 0, 233, 233, 233, 233, 55, 0, 233, 233, + 233, 233, 233, 233, 233, 233, 233, 233, 0, 0, + 226, 0, 0, 0, 0, 0, 233, 233, 22, 233, + 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, + 233, 233, 233, 233, 233, 233, 233, 233, 0, 0, + 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, + 233, 233, 233, 233, 55, 55, 0, 0, 0, 233, + 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, + 19, 18, 233, 233, 233, 233, 255, 22, 233, 233, + 48, 233, 0, 0, 233, 233, 233, 233, 233, 233, + 233, 233, 233, 233, 233, 233, 233, 233, 233, 72, + 0, 0, 233, 233, 233, 233, 233, 233, 233, 255, + 0, 22, 0, 255, 0, 0, 255, 255, 255, 255, + 255, 255, 246, 255, 205, 206, 207, 208, 0, 19, + 18, 0, 0, 0, 230, 255, 255, 0, 255, 48, + 0, 0, 0, 22, 0, 0, 0, 231, 232, 233, + 234, 235, 236, 0, 237, 0, 0, 0, 72, 0, + 0, 0, 412, 19, 18, 0, 413, 414, 0, 255, + 0, 0, 255, 48, 0, 54, 55, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 72, 229, 0, 19, 18, 0, 0, 0, + 0, 255, 0, 0, 0, 48, 0, 0, 0, 0, + 0, 0, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 0, 72, 0, 229, 0, 0, 0, + 229, 0, 0, 229, 229, 229, 229, 229, 229, 0, + 229, 79, 80, 81, 82, 0, 0, 0, 0, 0, + 0, 0, 229, 229, 0, 229, 0, 0, 0, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 0, 0, + 0, 0, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 0, 0, 0, 229, 0, 0, 229, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 79, 80, 81, 82, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 229, 83, + 84, 85, 86, 87, 88, 89, 90, 91, 0, 0, + 0, 0, 0, 255, 255, 255, 255, 0, 0, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, + 0, 0, 0, 0, 0, 0, 0, 255, 255, 0, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, + 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 276, 0, 255, 255, 255, 255, 0, 0, 255, + 255, 0, 255, 0, 0, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, + 229, 229, 229, 229, 0, 0, 229, 229, 229, 229, + 229, 229, 229, 229, 229, 229, 0, 0, 0, 0, + 0, 0, 0, 0, 229, 229, 0, 229, 229, 229, + 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, + 229, 229, 229, 229, 229, 229, 0, 0, 229, 229, + 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, + 229, 229, 0, 0, 0, 0, 0, 229, 229, 229, + 229, 229, 229, 229, 229, 229, 229, 229, 0, 0, + 229, 229, 229, 229, 230, 0, 229, 229, 0, 229, + 0, 0, 229, 229, 229, 229, 229, 229, 229, 229, + 229, 229, 229, 229, 229, 229, 229, 0, 0, 0, + 229, 229, 229, 229, 229, 229, 229, 230, 0, 0, + 0, 230, 0, 0, 230, 230, 230, 230, 230, 230, + 0, 230, 216, 0, 0, 0, 0, 214, 212, 0, + 213, 0, 215, 230, 230, 0, 230, 0, 0, 0, + 0, 0, 0, 0, 0, 248, 0, 211, 0, 0, + 216, 0, 0, 0, 0, 214, 212, 0, 213, 0, + 215, 0, 0, 0, 0, 0, 0, 230, 0, 0, + 230, 0, 0, 248, 0, 211, 54, 55, 0, 217, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 231, 0, 0, 0, 0, 0, 0, 0, 230, + 0, 0, 0, 0, 0, 0, 0, 217, 0, 0, + 0, 0, 0, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 231, 0, 0, 0, 231, 0, + 0, 231, 231, 231, 231, 231, 231, 0, 231, 0, + 0, 0, 79, 80, 81, 82, 0, 0, 0, 0, + 231, 231, 0, 231, 0, 0, 0, 0, 0, 0, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 0, + 0, 216, 0, 0, 0, 0, 214, 212, 209, 213, + 0, 215, 0, 0, 231, 0, 0, 231, 0, 0, + 0, 0, 216, 0, 318, 0, 211, 214, 212, 209, + 213, 0, 215, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 248, 231, 211, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 217, 0, + 0, 230, 230, 230, 230, 0, 0, 230, 230, 230, + 230, 230, 230, 230, 230, 230, 230, 0, 0, 217, + 0, 0, 0, 0, 0, 230, 230, 0, 230, 230, + 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, + 230, 230, 230, 230, 230, 230, 230, 0, 0, 230, + 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, + 230, 230, 230, 0, 0, 0, 0, 0, 230, 230, + 230, 230, 230, 230, 230, 230, 230, 230, 230, 0, + 0, 230, 230, 230, 230, 0, 0, 230, 230, 0, + 230, 0, 0, 230, 230, 230, 230, 230, 230, 230, + 230, 230, 230, 230, 230, 230, 230, 230, 207, 208, + 0, 230, 230, 230, 230, 230, 230, 230, 231, 231, + 231, 231, 0, 0, 231, 231, 231, 231, 231, 231, + 231, 231, 231, 231, 205, 206, 207, 208, 0, 0, + 0, 0, 231, 231, 0, 231, 231, 231, 231, 231, + 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, + 231, 231, 231, 231, 0, 0, 231, 231, 231, 231, + 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, + 0, 0, 0, 0, 0, 231, 231, 231, 231, 231, + 231, 231, 231, 231, 231, 231, 0, 0, 231, 231, + 231, 231, 232, 0, 231, 231, 201, 231, 0, 202, + 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, + 231, 231, 231, 231, 231, 0, 0, 0, 231, 231, + 231, 231, 231, 231, 231, 232, 0, 0, 0, 232, + 0, 0, 232, 232, 232, 232, 232, 232, 0, 232, + 0, 0, 0, 246, 247, 205, 206, 207, 208, 0, + 0, 232, 232, 0, 232, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 203, 204, 205, 206, 207, 208, + 0, 0, 220, 0, 0, 0, 0, 220, 220, 220, + 220, 0, 220, 0, 0, 232, 0, 0, 232, 0, + 0, 0, 50, 0, 0, 220, 0, 220, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 227, + 0, 0, 0, 0, 0, 0, 0, 232, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, + 0, 0, 0, 50, 0, 0, 50, 0, 0, 0, + 0, 0, 227, 0, 0, 0, 0, 0, 0, 227, + 227, 50, 227, 227, 227, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 227, 227, + 0, 227, 216, 0, 0, 0, 0, 214, 212, 209, + 213, 0, 215, 0, 216, 50, 0, 0, 0, 214, + 212, 0, 213, 0, 215, 248, 0, 211, 0, 0, + 0, 0, 227, 0, 0, 227, 0, 248, 216, 211, + 0, 0, 0, 214, 212, 0, 213, 50, 215, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 217, + 0, 248, 0, 211, 227, 0, 0, 0, 0, 0, + 0, 217, 0, 0, 0, 0, 0, 0, 0, 232, + 232, 232, 232, 0, 0, 232, 232, 232, 232, 232, + 232, 232, 232, 232, 232, 217, 0, 0, 0, 0, + 0, 0, 0, 232, 232, 0, 232, 232, 232, 232, + 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, + 232, 232, 232, 232, 232, 0, 0, 232, 232, 232, + 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, + 232, 0, 0, 0, 0, 0, 232, 232, 232, 232, + 232, 232, 232, 232, 232, 232, 232, 0, 0, 232, + 232, 232, 232, 227, 0, 232, 232, 220, 232, 0, + 220, 232, 232, 232, 232, 232, 232, 232, 232, 232, + 232, 232, 232, 232, 232, 232, 50, 0, 0, 232, + 232, 232, 232, 232, 232, 232, 227, 227, 227, 227, + 0, 278, 227, 227, 227, 227, 227, 227, 227, 227, + 227, 227, 0, 50, 220, 220, 220, 220, 220, 220, + 227, 227, 0, 227, 227, 227, 227, 227, 227, 227, + 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, + 227, 227, 0, 0, 227, 227, 227, 227, 227, 227, + 227, 227, 227, 227, 227, 227, 227, 227, 0, 0, + 0, 0, 0, 227, 227, 227, 227, 227, 227, 227, + 227, 227, 227, 227, 0, 0, 227, 227, 227, 227, + 228, 0, 227, 227, 0, 227, 0, 0, 227, 227, + 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, + 227, 227, 227, 0, 0, 0, 227, 227, 227, 227, + 227, 227, 227, 228, 246, 247, 205, 206, 207, 208, + 228, 228, 0, 228, 228, 228, 246, 247, 205, 206, + 207, 208, 0, 0, 367, 0, 0, 0, 278, 228, + 228, 375, 228, 0, 0, 0, 0, 0, 0, 0, + 203, 204, 205, 206, 207, 208, 0, 0, 0, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 0, 0, 0, 228, 0, 0, 228, 0, 0, 0, + 51, 0, 0, 0, 0, 0, 0, 0, 79, 80, + 81, 82, 0, 0, 0, 0, 0, 248, 0, 0, + 0, 0, 0, 0, 0, 228, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 0, 0, 0, 0, 0, + 0, 51, 0, 0, 51, 0, 0, 0, 0, 0, + 248, 367, 367, 0, 0, 0, 0, 248, 248, 51, + 0, 248, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 248, 248, 0, 248, + 0, 0, 0, 0, 0, 367, 0, 0, 367, 0, + 0, 0, 0, 51, 0, 0, 0, 0, 0, 216, + 0, 0, 0, 0, 214, 212, 0, 213, 0, 215, + 248, 0, 0, 248, 0, 0, 0, 0, 0, 0, + 0, 0, 248, 0, 211, 51, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 248, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 217, 228, 228, 228, + 228, 0, 0, 228, 228, 228, 228, 228, 228, 228, + 228, 228, 228, 0, 197, 0, 0, 0, 0, 0, + 0, 228, 228, 0, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, - 228, 0, 19, 228, 228, 228, 228, 250, 0, 228, - 228, 0, 228, 0, 0, 228, 228, 228, 228, 228, + 228, 228, 228, 0, 0, 228, 228, 228, 228, 228, + 228, 228, 228, 228, 228, 228, 228, 228, 228, 270, + 271, 272, 282, 0, 228, 228, 228, 228, 228, 228, + 228, 228, 228, 228, 228, 0, 0, 228, 228, 228, + 228, 0, 0, 228, 228, 0, 228, 302, 0, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, - 18, 0, 0, 228, 228, 228, 228, 228, 228, 228, - 250, 0, 0, 0, 250, 48, 0, 250, 250, 250, - 250, 250, 250, 0, 250, 0, 0, 0, 0, 0, - 0, 19, 0, 72, 0, 0, 250, 250, 0, 250, - 230, 231, 232, 233, 234, 235, 0, 236, 0, 245, - 246, 204, 205, 206, 207, 0, 215, 0, 0, 18, - 0, 213, 211, 208, 212, 19, 214, 0, 0, 0, - 250, 0, 0, 250, 48, 0, 0, 54, 55, 247, - 0, 210, 0, 402, 0, 0, 0, 403, 404, 0, - 215, 0, 72, 18, 224, 213, 211, 19, 212, 0, - 214, 0, 250, 0, 0, 0, 0, 0, 48, 0, - 0, 0, 0, 216, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 18, 72, 224, 0, 0, - 0, 224, 0, 0, 224, 224, 224, 224, 224, 224, - 48, 224, 0, 79, 80, 81, 82, 216, 0, 0, - 0, 0, 0, 224, 224, 0, 224, 0, 72, 0, - 0, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 0, 0, 0, 0, 215, 0, 0, 0, 0, 213, - 211, 0, 212, 0, 214, 0, 0, 224, 0, 0, - 224, 0, 0, 0, 0, 0, 0, 247, 0, 210, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 216, 0, 0, 250, 250, 250, 250, 0, 0, - 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, - 0, 0, 225, 0, 0, 0, 0, 0, 250, 250, + 228, 228, 228, 228, 51, 0, 0, 228, 228, 228, + 228, 228, 228, 228, 248, 248, 248, 248, 0, 0, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, + 0, 51, 336, 0, 0, 0, 0, 0, 248, 248, + 344, 248, 248, 248, 248, 248, 248, 248, 248, 248, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, + 0, 0, 248, 248, 248, 248, 248, 248, 248, 248, + 248, 248, 248, 248, 248, 248, 15, 0, 0, 0, + 0, 248, 248, 248, 248, 248, 248, 248, 248, 248, + 248, 248, 437, 0, 248, 248, 248, 248, 250, 197, + 248, 248, 0, 248, 0, 0, 248, 248, 248, 248, + 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, + 248, 0, 0, 0, 248, 248, 248, 248, 248, 248, + 248, 250, 0, 0, 0, 15, 0, 0, 250, 250, + 391, 392, 250, 0, 0, 393, 0, 0, 0, 0, + 0, 203, 204, 205, 206, 207, 208, 250, 250, 0, + 250, 0, 0, 0, 0, 0, 0, 0, 0, 15, + 0, 0, 201, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 250, 0, 0, 250, 0, 0, 0, 0, 0, + 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 249, 0, 0, 0, 421, + 422, 0, 0, 250, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 434, 435, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 249, 0, + 0, 0, 0, 0, 0, 249, 249, 0, 0, 249, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 249, 249, 0, 249, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 249, 0, + 0, 249, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 201, 0, 0, 0, 0, 0, 201, + 249, 0, 0, 0, 201, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 250, 250, 250, 250, 0, 0, 250, 250, 250, 250, 250, 250, 250, 250, 250, + 250, 0, 0, 0, 0, 0, 0, 0, 201, 250, + 250, 0, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, + 250, 0, 0, 250, 250, 250, 250, 250, 250, 250, + 250, 250, 250, 250, 250, 250, 250, 0, 0, 0, 0, 0, 250, 250, 250, 250, 250, 250, 250, 250, - 250, 250, 250, 250, 250, 250, 0, 0, 0, 0, - 0, 250, 250, 250, 250, 250, 250, 250, 250, 250, - 250, 250, 275, 0, 250, 250, 250, 250, 0, 0, - 250, 250, 0, 250, 0, 0, 250, 250, 250, 250, + 250, 250, 250, 0, 0, 250, 250, 250, 250, 0, + 0, 250, 250, 0, 250, 0, 0, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, - 250, 0, 0, 0, 250, 250, 250, 250, 250, 250, - 250, 224, 224, 224, 224, 0, 0, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 0, 202, 203, - 204, 205, 206, 207, 0, 224, 224, 0, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 8, 0, 224, - 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 0, 0, 0, 0, 0, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, 224, 0, - 0, 224, 224, 224, 224, 225, 0, 224, 224, 0, - 224, 0, 0, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, 0, 0, - 0, 224, 224, 224, 224, 224, 224, 224, 225, 0, - 0, 0, 225, 0, 0, 225, 225, 225, 225, 225, - 225, 0, 225, 0, 0, 0, 202, 203, 204, 205, - 206, 207, 0, 0, 225, 225, 0, 225, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 30, 0, 0, 0, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 0, 0, 0, 225, 0, - 0, 225, 0, 0, 0, 0, 0, 54, 55, 0, - 0, 0, 0, 79, 80, 81, 82, 0, 0, 0, - 0, 0, 226, 0, 0, 0, 0, 0, 0, 0, - 225, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 0, 0, 0, 0, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 226, 0, 0, 0, 226, - 0, 0, 226, 226, 226, 226, 226, 226, 0, 226, - 0, 0, 0, 79, 80, 81, 82, 0, 0, 0, - 0, 226, 226, 0, 226, 0, 0, 0, 0, 0, - 0, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 0, 0, 215, 0, 0, 0, 0, 213, 211, 208, - 212, 0, 214, 0, 0, 226, 0, 0, 226, 0, - 0, 0, 0, 215, 0, 209, 0, 210, 213, 211, - 208, 212, 0, 214, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 247, 226, 210, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 216, - 0, 0, 225, 225, 225, 225, 0, 0, 225, 225, - 225, 225, 225, 225, 225, 225, 225, 225, 0, 0, - 216, 0, 0, 0, 0, 0, 225, 225, 0, 225, - 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, - 225, 225, 225, 225, 225, 225, 225, 225, 0, 0, - 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, - 225, 225, 225, 225, 0, 0, 0, 0, 0, 225, - 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, - 0, 0, 225, 225, 225, 225, 0, 0, 225, 225, - 0, 225, 0, 0, 225, 225, 225, 225, 225, 225, - 225, 225, 225, 225, 225, 225, 225, 225, 225, 0, - 0, 0, 225, 225, 225, 225, 225, 225, 225, 226, - 226, 226, 226, 0, 0, 226, 226, 226, 226, 226, - 226, 226, 226, 226, 226, 0, 0, 0, 0, 0, - 0, 0, 0, 226, 226, 0, 226, 226, 226, 226, - 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, - 226, 226, 226, 226, 226, 0, 0, 226, 226, 226, - 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, - 226, 0, 0, 0, 0, 0, 226, 226, 226, 226, - 226, 226, 226, 226, 226, 226, 226, 0, 0, 226, - 226, 226, 226, 227, 0, 226, 226, 200, 226, 0, - 201, 226, 226, 226, 226, 226, 226, 226, 226, 226, - 226, 226, 226, 226, 226, 226, 0, 0, 0, 226, - 226, 226, 226, 226, 226, 226, 227, 0, 0, 0, - 227, 0, 0, 227, 227, 227, 227, 227, 227, 0, - 227, 0, 0, 0, 202, 203, 204, 205, 206, 207, - 0, 0, 227, 227, 0, 227, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 245, 246, 204, 205, 206, - 207, 0, 0, 215, 0, 0, 0, 0, 213, 211, - 208, 212, 0, 214, 0, 0, 227, 0, 196, 227, - 0, 0, 0, 0, 0, 0, 209, 0, 210, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 222, 0, 0, 0, 0, 0, 0, 0, 227, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 216, 0, 0, 269, 270, 271, 281, 0, 0, 0, - 0, 0, 0, 222, 0, 0, 0, 0, 0, 0, - 222, 222, 0, 222, 222, 222, 0, 0, 0, 0, - 0, 301, 0, 0, 0, 0, 0, 0, 0, 222, - 222, 0, 222, 215, 0, 0, 0, 0, 213, 211, - 0, 212, 0, 214, 0, 0, 0, 215, 0, 0, - 0, 0, 215, 215, 215, 215, 247, 215, 210, 0, - 0, 0, 0, 222, 0, 330, 222, 0, 0, 215, - 215, 0, 215, 338, 213, 211, 0, 212, 0, 214, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 216, 0, 247, 0, 210, 222, 0, 0, 0, 0, - 0, 0, 0, 0, 215, 0, 0, 0, 0, 0, - 227, 227, 227, 227, 0, 0, 227, 227, 227, 227, - 227, 227, 227, 227, 227, 227, 216, 0, 0, 0, - 0, 0, 196, 0, 227, 227, 0, 227, 227, 227, - 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, - 227, 227, 227, 227, 227, 227, 0, 0, 227, 227, - 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, - 227, 227, 0, 0, 0, 385, 0, 227, 227, 227, - 227, 227, 227, 227, 227, 227, 227, 227, 0, 0, - 227, 227, 227, 227, 0, 0, 227, 227, 200, 227, - 0, 201, 227, 227, 227, 227, 227, 227, 227, 227, - 227, 227, 227, 227, 227, 227, 227, 0, 0, 0, - 227, 227, 227, 227, 227, 227, 227, 222, 222, 222, - 222, 0, 0, 222, 222, 222, 222, 222, 222, 222, - 222, 222, 222, 407, 408, 245, 246, 204, 205, 206, - 207, 222, 222, 0, 222, 222, 222, 222, 222, 222, - 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, - 222, 222, 222, 0, 0, 222, 222, 222, 222, 222, - 222, 222, 222, 222, 222, 222, 222, 222, 222, 0, - 0, 0, 0, 0, 222, 222, 222, 222, 222, 222, - 222, 222, 222, 222, 222, 0, 0, 222, 222, 222, - 222, 223, 215, 222, 222, 215, 222, 0, 0, 222, - 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, - 222, 222, 222, 222, 0, 0, 0, 222, 222, 222, - 222, 222, 222, 222, 223, 202, 203, 204, 205, 206, - 207, 223, 223, 0, 223, 223, 223, 0, 0, 215, - 215, 215, 215, 215, 215, 0, 0, 50, 0, 0, - 223, 223, 0, 223, 0, 0, 0, 0, 0, 0, - 0, 245, 0, 204, 205, 206, 207, 0, 0, 0, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 0, 0, 0, 223, 0, 0, 223, 50, 0, - 0, 50, 51, 0, 0, 0, 0, 0, 0, 79, - 80, 81, 82, 0, 0, 0, 50, 0, 243, 0, - 0, 0, 0, 0, 0, 0, 223, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 0, 0, 0, 0, - 0, 0, 0, 51, 0, 0, 51, 0, 0, 0, - 50, 243, 0, 0, 0, 0, 0, 0, 243, 243, - 0, 51, 243, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 243, 243, 0, - 243, 0, 50, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, - 215, 0, 0, 0, 0, 213, 211, 0, 212, 0, - 214, 243, 0, 0, 243, 0, 0, 0, 0, 0, - 0, 0, 0, 247, 0, 210, 0, 51, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 243, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 216, 223, 223, - 223, 223, 0, 0, 223, 223, 223, 223, 223, 223, - 223, 223, 223, 223, 0, 0, 0, 0, 0, 0, - 0, 0, 223, 223, 0, 223, 223, 223, 223, 223, - 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, - 223, 223, 223, 223, 0, 0, 223, 223, 223, 223, - 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, - 0, 50, 0, 0, 0, 223, 223, 223, 223, 223, - 223, 223, 223, 223, 223, 223, 0, 0, 223, 223, - 223, 223, 0, 0, 223, 223, 0, 223, 50, 0, - 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, - 223, 223, 223, 223, 223, 0, 51, 0, 223, 223, - 223, 223, 223, 223, 223, 243, 243, 243, 243, 0, - 0, 243, 243, 243, 243, 243, 243, 243, 243, 243, - 243, 0, 0, 51, 0, 0, 0, 0, 0, 243, - 243, 0, 243, 243, 243, 243, 243, 243, 243, 243, - 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, - 243, 0, 0, 243, 243, 243, 243, 243, 243, 243, - 243, 243, 243, 243, 243, 243, 243, 15, 0, 0, - 0, 0, 243, 243, 243, 243, 243, 243, 243, 243, - 243, 243, 243, 421, 0, 243, 243, 243, 243, 245, - 0, 243, 243, 0, 243, 0, 0, 243, 243, 243, - 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, - 243, 243, 0, 0, 0, 243, 243, 243, 243, 243, - 243, 243, 245, 0, 0, 0, 15, 0, 0, 245, - 245, 0, 0, 245, 0, 0, 0, 0, 0, 0, - 0, 0, 202, 203, 204, 205, 206, 207, 245, 245, - 0, 245, 0, 0, 0, 0, 0, 0, 0, 0, - 15, 0, 0, 196, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 245, 0, 0, 245, 0, 0, 0, 0, - 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 244, 0, 0, 0, - 0, 0, 0, 0, 245, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, - 0, 0, 0, 0, 0, 0, 244, 244, 0, 0, - 244, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 244, 244, 0, 244, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, - 0, 0, 244, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 196, 0, 0, 0, 0, 0, - 196, 244, 0, 0, 0, 196, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 245, 245, 245, 245, - 0, 0, 245, 245, 245, 245, 245, 245, 245, 245, - 245, 245, 0, 0, 0, 0, 0, 0, 0, 196, - 245, 245, 0, 245, 245, 245, 245, 245, 245, 245, - 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, - 245, 245, 0, 0, 245, 245, 245, 245, 245, 245, - 245, 245, 245, 245, 245, 245, 245, 245, 0, 0, - 0, 0, 0, 245, 245, 245, 245, 245, 245, 245, - 245, 245, 245, 245, 0, 0, 245, 245, 245, 245, - 0, 0, 245, 245, 0, 245, 0, 0, 245, 245, - 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, - 245, 245, 245, 0, 0, 0, 245, 245, 245, 245, - 245, 245, 245, 244, 244, 244, 244, 0, 0, 244, - 244, 244, 244, 244, 244, 244, 244, 244, 244, 0, - 0, 0, 0, 0, 0, 0, 0, 244, 244, 0, - 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, - 244, 244, 244, 244, 244, 244, 244, 244, 244, 0, - 0, 244, 244, 244, 244, 244, 244, 244, 244, 244, - 244, 244, 244, 244, 244, 16, 0, 0, 0, 0, - 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, - 244, 0, 0, 244, 244, 244, 244, 242, 0, 244, - 244, 0, 244, 0, 0, 244, 244, 244, 244, 244, - 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, - 0, 0, 0, 244, 244, 244, 244, 244, 244, 244, - 242, 0, 0, 0, 16, 0, 0, 242, 242, 0, - 0, 242, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 242, 242, 0, 242, - 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, - 0, 197, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 242, 0, 0, 242, 0, 0, 0, 0, 0, 0, - 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 151, 0, 0, 0, 0, 0, - 0, 0, 242, 0, 0, 0, 0, 0, 59, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 151, 0, 0, - 0, 0, 0, 0, 151, 151, 0, 151, 151, 151, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, - 0, 0, 59, 151, 0, 0, 151, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 151, 0, 0, - 151, 0, 0, 0, 0, 0, 0, 215, 0, 0, - 0, 59, 213, 211, 0, 212, 0, 214, 0, 0, - 0, 0, 197, 0, 0, 0, 0, 0, 197, 151, - 247, 0, 210, 197, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 59, 242, 242, 242, 242, 0, 0, - 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, - 0, 0, 0, 0, 216, 0, 0, 197, 242, 242, - 0, 242, 242, 242, 242, 242, 242, 242, 242, 242, - 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, - 0, 0, 242, 242, 242, 242, 242, 242, 242, 242, - 242, 242, 242, 242, 242, 242, 0, 0, 0, 0, - 0, 242, 242, 242, 242, 242, 242, 242, 242, 242, - 242, 242, 0, 0, 242, 242, 242, 242, 0, 0, - 242, 242, 0, 242, 0, 0, 242, 242, 242, 242, - 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, - 242, 0, 0, 0, 242, 242, 242, 242, 242, 242, - 242, 151, 151, 151, 151, 0, 0, 151, 0, 151, - 151, 151, 151, 151, 151, 151, 151, 0, 0, 0, - 0, 0, 59, 0, 0, 151, 151, 0, 151, 151, - 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, - 151, 151, 151, 151, 151, 151, 0, 0, 0, 59, - 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, - 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, - 151, 151, 151, 151, 151, 151, 151, 151, 151, 0, - 0, 151, 151, 151, 151, 247, 0, 151, 151, 0, - 0, 0, 0, 0, 0, 0, 0, 389, 0, 151, - 151, 151, 151, 151, 151, 151, 151, 151, 59, 0, - 0, 151, 151, 151, 151, 151, 151, 151, 247, 0, - 0, 0, 0, 0, 0, 247, 247, 0, 0, 247, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 247, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 202, - 203, 204, 205, 206, 207, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 247, 0, - 0, 247, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 246, 0, 0, 0, 0, 0, 0, 0, + 250, 250, 0, 0, 0, 250, 250, 250, 250, 250, + 250, 250, 249, 249, 249, 249, 0, 0, 249, 249, + 249, 249, 249, 249, 249, 249, 249, 249, 0, 0, + 0, 0, 0, 0, 0, 0, 249, 249, 0, 249, + 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, + 249, 249, 249, 249, 249, 249, 249, 249, 0, 0, + 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, + 249, 249, 249, 249, 16, 0, 0, 0, 0, 249, + 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, + 0, 0, 249, 249, 249, 249, 247, 0, 249, 249, + 0, 249, 0, 0, 249, 249, 249, 249, 249, 249, + 249, 249, 249, 249, 249, 249, 249, 249, 249, 0, + 0, 0, 249, 249, 249, 249, 249, 249, 249, 247, + 0, 0, 0, 16, 0, 0, 247, 247, 0, 0, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 246, 0, 0, 0, 0, - 0, 0, 246, 246, 0, 0, 246, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 246, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 246, 0, 0, 246, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 246, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 247, 247, 247, 247, 0, 0, 247, 247, - 247, 247, 247, 247, 247, 247, 247, 247, 0, 0, - 0, 0, 0, 0, 0, 0, 247, 247, 0, 247, + 0, 0, 0, 0, 0, 247, 247, 0, 247, 0, + 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, + 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 247, + 0, 0, 247, 0, 0, 0, 0, 0, 0, 16, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 156, 0, 0, 0, 0, 0, 0, + 0, 247, 0, 0, 0, 0, 0, 59, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 156, 0, 0, 0, + 0, 0, 0, 156, 156, 0, 156, 156, 156, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 59, 0, + 0, 59, 156, 0, 0, 156, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 59, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 156, 0, 0, 156, + 0, 0, 0, 0, 0, 0, 216, 0, 0, 0, + 59, 214, 212, 0, 213, 0, 215, 0, 0, 0, + 0, 202, 0, 0, 0, 0, 0, 202, 156, 248, + 0, 211, 202, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 59, 247, 247, 247, 247, 0, 0, 247, + 247, 247, 247, 247, 247, 247, 247, 247, 247, 0, + 0, 0, 0, 217, 0, 0, 202, 247, 247, 0, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, - 247, 247, 247, 247, 247, 247, 247, 247, 0, 0, + 247, 247, 247, 247, 247, 247, 247, 247, 247, 0, + 0, 247, 247, 247, 247, 247, 247, 247, 247, 247, + 247, 247, 247, 247, 247, 0, 0, 0, 0, 0, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, - 247, 247, 247, 247, 0, 0, 0, 0, 0, 247, + 247, 0, 0, 247, 247, 247, 247, 0, 0, 247, + 247, 0, 247, 0, 0, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, - 0, 0, 247, 247, 247, 247, 0, 0, 247, 247, - 0, 247, 0, 0, 247, 247, 247, 247, 0, 0, - 247, 247, 247, 247, 247, 247, 247, 247, 247, 0, - 0, 0, 247, 247, 247, 247, 247, 247, 247, 246, - 246, 246, 246, 0, 0, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 0, 0, 0, 0, 0, - 0, 0, 0, 246, 246, 0, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 0, 0, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 0, 0, 0, 0, 0, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 0, 0, 246, - 246, 246, 246, 152, 0, 246, 246, 0, 246, 0, - 0, 246, 246, 246, 246, 0, 0, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 0, 0, 0, 246, - 246, 246, 246, 246, 246, 246, 152, 0, 0, 0, - 0, 0, 0, 152, 152, 0, 152, 152, 152, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 152, 0, 0, 152, 0, 0, 0, 0, + 0, 0, 0, 247, 247, 247, 247, 247, 247, 247, + 156, 156, 156, 156, 0, 0, 156, 0, 156, 156, + 156, 156, 156, 156, 156, 156, 0, 0, 0, 0, + 0, 59, 0, 0, 156, 156, 0, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 0, 0, 0, 59, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 156, 0, 0, + 156, 156, 156, 156, 252, 0, 156, 156, 0, 0, + 0, 0, 0, 0, 0, 0, 399, 0, 156, 156, + 156, 156, 156, 156, 156, 156, 156, 59, 0, 0, + 156, 156, 156, 156, 156, 156, 156, 252, 0, 0, + 0, 0, 0, 0, 252, 252, 0, 0, 252, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 252, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 203, 204, + 205, 206, 207, 208, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 252, 0, 0, + 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 251, 0, 0, 0, 0, 0, 0, 0, 252, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 251, 0, 0, 0, 0, 0, + 0, 251, 251, 0, 0, 251, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 251, 0, 0, 251, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 251, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 252, 252, 252, 252, 0, 0, 252, 252, 252, + 252, 252, 252, 252, 252, 252, 252, 0, 0, 0, + 0, 0, 0, 0, 0, 252, 252, 0, 252, 252, + 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, + 252, 252, 252, 252, 252, 252, 252, 0, 0, 252, + 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, + 252, 252, 252, 0, 0, 0, 0, 0, 252, 252, + 252, 252, 252, 252, 252, 252, 252, 252, 252, 0, + 0, 252, 252, 252, 252, 0, 0, 252, 252, 0, + 252, 0, 0, 252, 252, 252, 252, 0, 0, 252, + 252, 252, 252, 252, 252, 252, 252, 252, 0, 0, + 0, 252, 252, 252, 252, 252, 252, 252, 251, 251, + 251, 251, 0, 0, 251, 251, 251, 251, 251, 251, + 251, 251, 251, 251, 0, 0, 0, 0, 0, 0, + 0, 0, 251, 251, 0, 251, 251, 251, 251, 251, + 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, + 251, 251, 251, 251, 0, 0, 251, 251, 251, 251, + 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, + 0, 0, 0, 0, 0, 251, 251, 251, 251, 251, + 251, 251, 251, 251, 251, 251, 0, 0, 251, 251, + 251, 251, 157, 0, 251, 251, 0, 251, 0, 0, + 251, 251, 251, 251, 0, 0, 251, 251, 251, 251, + 251, 251, 251, 251, 251, 0, 0, 0, 251, 251, + 251, 251, 251, 251, 251, 157, 0, 0, 0, 0, + 0, 0, 157, 157, 0, 157, 157, 157, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 157, 0, 0, 157, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, + 0, 0, 0, 0, 0, 157, 0, 0, 157, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 253, + 0, 0, 0, 0, 0, 0, 0, 157, 0, 0, + 58, 0, 0, 58, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 58, 0, + 0, 0, 253, 0, 0, 0, 0, 0, 0, 253, + 253, 0, 0, 253, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 253, 0, + 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 253, 0, 58, 253, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 253, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 157, + 157, 157, 157, 0, 0, 157, 0, 157, 157, 157, + 157, 157, 157, 157, 157, 0, 0, 0, 0, 0, + 0, 0, 0, 157, 157, 0, 157, 157, 157, 157, + 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, + 157, 157, 157, 157, 0, 0, 0, 0, 157, 157, + 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, + 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, + 157, 157, 157, 157, 157, 157, 157, 0, 0, 157, + 157, 157, 157, 0, 0, 157, 157, 0, 0, 0, + 0, 0, 0, 58, 0, 0, 0, 157, 157, 157, + 157, 157, 157, 157, 157, 157, 0, 0, 0, 157, + 157, 157, 157, 157, 157, 157, 253, 253, 253, 253, + 58, 0, 253, 253, 253, 253, 253, 253, 253, 253, + 253, 253, 0, 0, 0, 0, 0, 0, 0, 0, + 253, 253, 0, 253, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, + 253, 253, 0, 0, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 253, 253, 253, 253, 0, 58, + 0, 0, 0, 253, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 0, 0, 253, 253, 253, 253, + 254, 0, 253, 253, 0, 253, 0, 0, 253, 253, + 0, 0, 0, 0, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 0, 0, 0, 253, 253, 253, 253, + 253, 253, 253, 254, 0, 0, 0, 0, 0, 0, + 254, 254, 0, 0, 254, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 55, 0, 0, 0, 0, 0, 152, 0, 0, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 254, 0, 0, 254, 0, 0, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 248, 0, 0, 0, 0, 0, 0, 0, 152, 0, - 0, 55, 0, 0, 55, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, - 0, 0, 0, 248, 0, 0, 0, 0, 0, 0, - 248, 248, 0, 0, 248, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, - 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 248, 0, 55, 248, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 248, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 152, 152, 152, 152, 0, 0, 152, 0, 152, 152, - 152, 152, 152, 152, 152, 152, 0, 0, 0, 0, - 0, 0, 0, 0, 152, 152, 0, 152, 152, 152, - 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, - 152, 152, 152, 152, 152, 0, 0, 0, 0, 152, - 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, - 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 0, 0, 0, 0, 0, 0, 0, 138, 0, 0, + 0, 0, 0, 0, 0, 254, 0, 0, 0, 0, + 0, 254, 0, 0, 254, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, + 138, 0, 0, 0, 0, 0, 0, 138, 138, 0, + 138, 138, 138, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 138, 0, 0, 138, + 0, 0, 0, 254, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 138, 0, 0, 138, 0, 254, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 138, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 254, 254, 254, + 254, 0, 0, 254, 254, 254, 254, 254, 254, 254, + 254, 254, 254, 0, 0, 0, 0, 0, 0, 0, + 0, 254, 254, 0, 254, 254, 254, 254, 254, 254, + 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, + 254, 254, 254, 0, 0, 254, 254, 254, 254, 254, + 254, 254, 254, 254, 254, 254, 254, 254, 254, 0, + 0, 0, 0, 0, 254, 254, 254, 254, 254, 254, + 254, 254, 254, 254, 254, 0, 0, 254, 254, 254, + 254, 0, 0, 254, 254, 0, 254, 0, 0, 0, + 254, 0, 0, 0, 254, 254, 254, 254, 254, 254, + 254, 254, 254, 254, 0, 0, 0, 254, 254, 254, + 254, 254, 254, 254, 138, 138, 138, 138, 0, 0, + 138, 254, 138, 138, 138, 138, 138, 138, 138, 138, + 0, 0, 254, 0, 0, 254, 0, 0, 138, 138, + 0, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 0, + 0, 0, 0, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 0, 0, 0, 0, + 254, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 0, 0, 138, 138, 138, 138, 146, 0, + 138, 138, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 0, 0, 0, 138, 138, 138, 138, 138, 138, + 138, 146, 0, 0, 0, 0, 0, 0, 146, 146, + 0, 0, 146, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 146, 0, 0, + 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, + 0, 146, 0, 0, 146, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 152, 0, 0, 0, 0, + 0, 0, 0, 146, 0, 0, 57, 0, 0, 57, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 57, 0, 0, 0, 152, 0, + 0, 0, 0, 0, 0, 152, 152, 0, 0, 152, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 152, 0, 0, 0, 57, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 152, 0, + 57, 152, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 146, 146, 146, 146, 0, + 0, 146, 0, 146, 146, 146, 146, 146, 146, 146, + 146, 0, 0, 0, 0, 0, 0, 0, 0, 146, + 146, 0, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 0, 0, 0, 0, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 0, 0, 0, + 0, 0, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 0, 0, 146, 146, 146, 146, 0, + 0, 146, 146, 0, 0, 0, 0, 32, 0, 57, + 0, 0, 0, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 0, 0, 0, 146, 146, 146, 146, 146, + 146, 146, 152, 152, 152, 152, 57, 0, 152, 33, 152, 152, 152, 152, 152, 152, 152, 152, 0, 0, - 152, 152, 152, 152, 0, 0, 152, 152, 0, 0, - 0, 0, 0, 0, 55, 0, 0, 0, 152, 152, + 0, 0, 0, 0, 0, 0, 152, 152, 0, 152, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 0, 0, 0, - 152, 152, 152, 152, 152, 152, 152, 248, 248, 248, - 248, 55, 0, 248, 248, 248, 248, 248, 248, 248, - 248, 248, 248, 0, 0, 0, 0, 0, 0, 0, - 0, 248, 248, 0, 248, 248, 248, 248, 248, 248, - 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, - 248, 248, 248, 0, 0, 248, 248, 248, 248, 248, - 248, 248, 248, 248, 248, 248, 248, 248, 248, 55, - 55, 0, 0, 0, 248, 248, 248, 248, 248, 248, - 248, 248, 248, 248, 248, 0, 0, 248, 248, 248, - 248, 249, 0, 248, 248, 0, 248, 0, 0, 248, - 248, 0, 0, 0, 0, 248, 248, 248, 248, 248, - 248, 248, 248, 248, 0, 0, 0, 248, 248, 248, - 248, 248, 248, 248, 249, 0, 0, 0, 0, 0, - 0, 249, 249, 0, 0, 249, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 248, 0, 0, 249, 0, 0, 249, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 138, 0, - 0, 0, 0, 0, 0, 0, 249, 0, 0, 0, - 0, 0, 248, 0, 0, 248, 0, 0, 0, 0, + 0, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 152, 152, 152, 152, 0, 57, 0, 0, 0, 152, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, + 0, 0, 152, 152, 152, 152, 91, 0, 152, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 248, 138, 0, 0, 0, 0, 0, 0, 138, 138, - 0, 138, 138, 138, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 138, 0, 0, - 138, 0, 0, 0, 248, 0, 0, 0, 0, 0, + 152, 152, 152, 152, 152, 152, 152, 152, 152, 0, + 0, 0, 152, 152, 152, 152, 152, 152, 152, 91, + 0, 0, 0, 0, 0, 0, 91, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 6, 7, 91, 8, 9, 0, 0, + 0, 0, 0, 0, 0, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 0, 0, 22, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, + 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 93, 0, 0, 0, 0, 0, 0, + 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 23, 0, 0, 0, 0, 0, 24, 25, 0, + 0, 26, 0, 27, 0, 0, 93, 0, 0, 0, + 0, 0, 0, 93, 0, 0, 0, 0, 0, 0, + 28, 0, 29, 0, 0, 0, 0, 0, 0, 30, + 31, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 138, 0, 0, 138, 0, 248, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 93, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 138, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 249, 249, - 249, 249, 0, 0, 249, 249, 249, 249, 249, 249, - 249, 249, 249, 249, 0, 0, 0, 0, 0, 0, - 0, 0, 249, 249, 0, 249, 249, 249, 249, 249, - 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, - 249, 249, 249, 249, 0, 0, 249, 249, 249, 249, - 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, - 0, 0, 0, 0, 0, 249, 249, 249, 249, 249, - 249, 249, 249, 249, 249, 249, 0, 0, 249, 249, - 249, 249, 0, 0, 249, 249, 0, 249, 0, 0, - 0, 249, 0, 0, 0, 248, 249, 249, 249, 249, - 249, 249, 249, 249, 249, 0, 0, 0, 249, 249, - 249, 249, 249, 249, 249, 138, 138, 138, 138, 0, - 0, 138, 248, 138, 138, 138, 138, 138, 138, 138, - 138, 0, 0, 248, 0, 0, 248, 0, 0, 138, - 138, 0, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 0, 0, 0, 0, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 0, 0, 0, - 248, 248, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 0, 0, 138, 138, 138, 138, 143, - 0, 138, 138, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 0, 0, 0, 138, 138, 138, 138, 138, - 138, 138, 143, 0, 0, 0, 0, 0, 0, 143, - 143, 0, 0, 143, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 143, 0, - 0, 143, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 249, - 0, 0, 143, 0, 0, 143, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 147, 0, 0, 0, - 0, 0, 0, 0, 143, 0, 0, 0, 0, 0, - 249, 0, 0, 249, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 249, 147, - 0, 0, 0, 0, 0, 0, 147, 147, 0, 0, - 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 147, 0, 0, 0, 0, - 0, 0, 249, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 147, - 0, 0, 147, 0, 249, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 147, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 143, 143, 143, 143, - 0, 0, 143, 0, 143, 143, 143, 143, 143, 143, - 143, 143, 0, 0, 0, 0, 0, 0, 0, 0, - 143, 143, 0, 143, 143, 143, 143, 143, 143, 143, - 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, - 143, 0, 0, 0, 0, 143, 143, 143, 143, 143, - 143, 143, 143, 143, 143, 143, 143, 143, 0, 0, - 0, 0, 0, 143, 143, 143, 143, 143, 143, 143, - 143, 143, 143, 143, 0, 0, 143, 143, 143, 143, - 0, 0, 143, 143, 0, 32, 0, 0, 0, 0, - 0, 0, 0, 249, 143, 143, 143, 143, 143, 143, - 143, 143, 143, 0, 0, 0, 143, 143, 143, 143, - 143, 143, 143, 147, 147, 147, 147, 33, 0, 147, - 249, 147, 147, 147, 147, 147, 147, 147, 147, 0, - 0, 249, 0, 0, 249, 0, 0, 147, 147, 0, - 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, - 147, 147, 147, 147, 147, 147, 147, 147, 0, 0, - 0, 0, 147, 147, 147, 147, 147, 147, 147, 147, - 147, 147, 147, 147, 147, 0, 0, 0, 0, 249, - 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, - 147, 0, 0, 147, 147, 147, 147, 91, 0, 147, - 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 147, 147, 147, 147, 147, 147, 147, 147, 147, - 0, 0, 0, 147, 147, 147, 147, 147, 147, 147, - 91, 0, 0, 0, 0, 0, 0, 91, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 6, 7, 0, 8, 9, 91, 0, 0, 0, - 0, 0, 0, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 0, 0, 22, 0, 0, - 0, 0, 0, 0, 58, 0, 0, 0, 0, 0, - 91, 0, 0, 91, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 93, 0, 0, 0, 0, 0, - 0, 0, 91, 0, 0, 58, 0, 0, 58, 23, - 0, 0, 0, 0, 0, 24, 25, 0, 0, 26, - 0, 27, 0, 58, 0, 0, 0, 93, 0, 0, - 0, 0, 0, 0, 93, 0, 0, 0, 28, 0, - 29, 0, 0, 0, 0, 0, 0, 30, 31, 0, - 0, 0, 0, 93, 0, 0, 0, 58, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 93, 0, 58, - 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 91, 91, 91, 91, 0, 0, - 91, 0, 91, 91, 91, 91, 91, 91, 91, 91, - 0, 0, 0, 0, 0, 0, 0, 0, 91, 91, - 0, 91, 91, 91, 91, 91, 91, 91, 91, 91, - 91, 91, 91, 91, 91, 91, 91, 91, 91, 0, - 0, 0, 0, 0, 91, 91, 91, 91, 91, 91, - 91, 91, 91, 91, 91, 91, 0, 0, 0, 0, + 0, 0, 0, 91, 91, 91, 91, 0, 0, 91, + 0, 91, 91, 91, 91, 91, 91, 91, 91, 0, + 0, 0, 0, 0, 0, 0, 0, 91, 91, 0, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, 0, 0, + 0, 0, 0, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 0, 0, 0, 0, 0, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 0, 0, 91, 91, 91, 91, 0, 0, 91, + 91, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 91, 91, 91, 91, 91, 91, 91, 91, 91, - 91, 91, 0, 0, 91, 91, 91, 91, 0, 0, - 91, 91, 0, 0, 0, 0, 6, 0, 58, 0, - 0, 0, 91, 91, 91, 91, 91, 91, 91, 91, - 91, 0, 0, 0, 91, 91, 91, 91, 91, 91, - 91, 93, 93, 93, 93, 58, 0, 93, 6, 93, - 93, 93, 93, 93, 93, 93, 93, 0, 0, 0, - 0, 0, 0, 0, 0, 93, 93, 0, 93, 93, - 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 0, 0, 0, 91, 91, 91, 91, 91, 91, 91, + 93, 93, 93, 93, 6, 0, 93, 0, 93, 93, 93, 93, 93, 93, 93, 93, 0, 0, 0, 0, - 0, 93, 93, 93, 93, 93, 93, 93, 93, 93, - 93, 93, 93, 0, 58, 0, 0, 0, 93, 93, - 93, 93, 93, 93, 93, 93, 93, 93, 93, 0, - 0, 93, 93, 93, 93, 95, 0, 93, 93, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, + 0, 0, 0, 0, 93, 93, 0, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 0, 0, 0, 0, 0, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 0, 0, 0, 0, 0, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 0, 0, - 0, 93, 93, 93, 93, 93, 93, 93, 95, 0, - 0, 0, 0, 0, 0, 95, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 6, 6, 95, 6, 6, 0, 0, 0, - 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 0, 0, 6, 0, - 0, 0, 57, 0, 0, 0, 0, 0, 95, 0, - 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, + 93, 93, 93, 93, 95, 0, 93, 93, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 0, 0, 0, + 93, 93, 93, 93, 93, 93, 93, 95, 0, 0, + 0, 0, 0, 0, 95, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, + 0, 6, 6, 95, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 0, 0, 6, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 95, 0, 0, + 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, - 95, 0, 0, 57, 0, 0, 57, 0, 0, 0, - 6, 0, 0, 0, 0, 0, 6, 6, 0, 0, - 6, 57, 6, 0, 0, 99, 0, 0, 0, 0, - 0, 0, 99, 0, 0, 0, 0, 0, 0, 6, - 0, 6, 0, 0, 0, 0, 0, 0, 6, 6, - 0, 99, 0, 0, 0, 57, 0, 0, 0, 0, + 0, 99, 0, 0, 0, 0, 0, 0, 0, 95, + 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, + 0, 0, 6, 6, 0, 0, 6, 0, 6, 0, + 0, 0, 0, 0, 99, 0, 0, 0, 0, 0, + 0, 99, 0, 0, 0, 6, 0, 6, 0, 0, + 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, + 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 99, 0, 57, 99, 0, + 0, 0, 0, 0, 99, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 99, 0, 0, + 0, 0, 0, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 95, 95, 95, 95, 0, 0, 95, 0, - 95, 95, 95, 95, 95, 95, 95, 95, 0, 0, - 0, 0, 0, 0, 0, 0, 95, 95, 0, 95, - 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 0, 95, 95, 95, 95, 0, 0, 95, 0, 95, 95, 95, 95, 95, 95, 95, 95, 0, 0, 0, - 0, 0, 95, 95, 95, 95, 95, 95, 95, 95, - 95, 95, 95, 95, 0, 0, 0, 0, 0, 95, + 0, 0, 0, 0, 0, 95, 95, 0, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, - 0, 0, 95, 95, 95, 95, 0, 0, 95, 95, - 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, + 95, 95, 95, 95, 95, 95, 0, 0, 0, 0, + 0, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 0, 0, 0, 0, 0, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 0, - 0, 0, 95, 95, 95, 95, 95, 95, 95, 99, - 99, 99, 99, 57, 0, 99, 0, 99, 99, 99, - 99, 99, 99, 99, 99, 0, 0, 0, 0, 0, - 0, 0, 0, 99, 99, 0, 99, 99, 99, 99, + 0, 95, 95, 95, 95, 0, 0, 95, 95, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 0, 0, + 0, 95, 95, 95, 95, 95, 95, 95, 99, 99, + 99, 99, 0, 0, 99, 0, 99, 99, 99, 99, + 99, 99, 99, 99, 0, 0, 0, 0, 0, 0, + 0, 0, 99, 99, 0, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, - 99, 99, 99, 99, 0, 0, 0, 0, 0, 99, + 99, 99, 99, 0, 0, 0, 0, 0, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, - 99, 0, 57, 0, 0, 0, 99, 99, 99, 99, - 99, 99, 99, 99, 99, 99, 99, 0, 0, 99, - 99, 99, 99, 97, 0, 99, 99, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 99, 99, 99, - 99, 99, 99, 99, 99, 99, 0, 0, 0, 99, - 99, 99, 99, 99, 99, 99, 97, 0, 0, 0, - 0, 0, 0, 97, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 0, 0, 99, 99, + 99, 99, 97, 0, 99, 99, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 0, 0, 0, 99, 99, + 99, 99, 99, 99, 99, 97, 0, 0, 0, 0, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 97, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 97, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 87, 0, 0, 0, 0, 0, 0, 0, 97, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, + 0, 0, 0, 0, 0, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 87, 0, 0, 0, 0, 0, 0, - 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, + 0, 0, 87, 0, 0, 0, 0, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 87, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 87, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 97, 97, 97, 97, 0, 0, 97, 0, 97, 97, - 97, 97, 97, 97, 97, 97, 0, 0, 0, 0, - 0, 0, 0, 0, 97, 97, 0, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 0, 0, 0, 0, 87, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, + 97, 97, 97, 0, 0, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 0, 0, 0, + 0, 0, 0, 97, 97, 0, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 0, 0, 0, 0, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 97, 97, 0, 0, 0, 0, 0, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, - 97, 97, 97, 97, 0, 0, 97, 97, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 0, 0, 0, - 97, 97, 97, 97, 97, 97, 97, 87, 87, 87, - 87, 0, 0, 87, 0, 87, 87, 87, 87, 87, - 87, 87, 87, 0, 0, 0, 0, 0, 0, 0, - 0, 87, 87, 0, 87, 87, 87, 87, 87, 87, + 97, 0, 0, 0, 0, 0, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 0, 0, 97, + 97, 97, 97, 0, 0, 97, 97, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 0, 0, 0, 97, + 97, 97, 97, 97, 97, 97, 87, 87, 87, 87, + 0, 0, 87, 0, 87, 87, 87, 87, 87, 87, + 87, 87, 0, 0, 0, 0, 0, 0, 0, 0, + 87, 87, 0, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 0, 0, 0, 0, 0, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 0, + 87, 0, 0, 0, 0, 0, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 0, 0, + 0, 0, 0, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 0, 0, 87, 87, 87, 87, + 88, 0, 87, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 0, 0, 87, 87, 87, - 87, 88, 0, 87, 87, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 0, 0, 0, 87, 87, 87, - 87, 87, 87, 87, 88, 0, 0, 0, 0, 0, - 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 87, 87, 87, 0, 0, 0, 87, 87, 87, 87, + 87, 87, 87, 88, 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 88, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, - 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, + 0, 0, 0, 88, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, + 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 89, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, + 89, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 89, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 89, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 88, 88, - 88, 88, 0, 0, 88, 0, 88, 88, 88, 88, - 88, 88, 88, 88, 0, 0, 0, 0, 0, 0, - 0, 0, 88, 88, 0, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 0, 0, 0, 0, 0, 88, 88, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 88, 88, 88, + 88, 0, 0, 88, 0, 88, 88, 88, 88, 88, + 88, 88, 88, 0, 0, 0, 0, 0, 0, 0, + 0, 88, 88, 0, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 0, 0, 0, 0, 0, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 0, + 0, 0, 0, 0, 88, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 0, 0, 88, 88, 88, + 88, 0, 0, 88, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 0, 0, 88, 88, - 88, 88, 0, 0, 88, 88, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 0, 0, 0, 88, 88, - 88, 88, 88, 88, 88, 89, 89, 89, 89, 0, - 0, 89, 0, 89, 89, 89, 89, 89, 89, 89, - 89, 0, 0, 0, 0, 0, 0, 0, 0, 89, + 88, 88, 88, 88, 0, 0, 0, 88, 88, 88, + 88, 88, 88, 88, 89, 89, 89, 89, 0, 0, 89, 0, 89, 89, 89, 89, 89, 89, 89, 89, - 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, - 0, 0, 0, 0, 0, 89, 89, 89, 89, 89, - 89, 89, 89, 89, 89, 89, 89, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 89, 89, + 0, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 0, + 0, 0, 0, 0, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 0, 0, 0, 0, + 0, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 0, 0, 89, 89, 89, 89, 90, 0, + 89, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 89, 89, 89, 89, 89, 89, 89, - 89, 89, 89, 0, 0, 89, 89, 89, 89, 90, - 0, 89, 89, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 89, 89, 89, 89, 89, 89, 89, - 89, 89, 0, 0, 0, 89, 89, 89, 89, 89, - 89, 89, 90, 0, 0, 0, 0, 0, 0, 90, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 90, 0, + 89, 0, 0, 0, 89, 89, 89, 89, 89, 89, + 89, 90, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 90, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 100, 0, 0, 0, - 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, - 0, 0, 0, 0, 0, 0, 100, 0, 0, 0, + 0, 90, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, + 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 100, 0, + 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, - 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 100, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 90, 90, 90, 90, - 0, 0, 90, 0, 90, 90, 90, 90, 90, 90, - 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, - 90, 90, 0, 90, 90, 90, 90, 90, 90, 90, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 90, 90, 90, 90, 0, + 0, 90, 0, 90, 90, 90, 90, 90, 90, 90, + 90, 0, 0, 0, 0, 0, 0, 0, 0, 90, + 90, 0, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 0, 0, 0, 0, 0, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 0, 0, + 0, 0, 0, 0, 0, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 0, 0, 0, + 0, 0, 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 0, 0, 90, 90, 90, 90, 0, + 0, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 0, 0, 90, 90, 90, 90, - 0, 0, 90, 90, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 0, 0, 0, 90, 90, 90, 90, - 90, 90, 90, 100, 100, 100, 100, 0, 0, 100, - 0, 100, 100, 100, 100, 100, 100, 100, 100, 0, - 0, 0, 0, 0, 0, 0, 0, 100, 100, 0, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 90, 90, 0, 0, 0, 90, 90, 90, 90, 90, + 90, 90, 100, 100, 100, 100, 0, 0, 100, 0, 100, 100, 100, 100, 100, 100, 100, 100, 0, 0, - 0, 0, 0, 100, 100, 100, 100, 100, 100, 100, - 100, 100, 100, 100, 100, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 100, 100, 0, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, 0, 0, 100, 100, 100, 100, 101, 0, 100, - 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 0, 0, 0, 100, 100, 100, 100, 100, 100, 100, - 101, 0, 0, 0, 0, 0, 0, 101, 0, 0, + 100, 100, 100, 100, 100, 100, 100, 0, 0, 0, + 0, 0, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 0, 0, 0, 0, 0, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 0, 0, 100, 100, 100, 100, 101, 0, 100, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 0, + 0, 0, 100, 100, 100, 100, 100, 100, 100, 101, 0, 0, 0, 0, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 101, 0, 0, 101, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 102, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 101, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 102, 0, 0, - 0, 0, 0, 0, 102, 0, 0, 0, 0, 0, + 0, 0, 0, 102, 0, 0, 0, 0, 0, 0, + 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 102, 0, 0, 0, 0, 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 102, 0, 0, - 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 102, + 0, 0, 0, 0, 0, 0, 102, 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 101, 101, 101, 101, 0, 0, - 101, 0, 101, 101, 101, 101, 101, 101, 101, 101, - 0, 0, 0, 0, 0, 0, 0, 0, 101, 101, - 0, 101, 101, 101, 101, 101, 101, 101, 101, 101, - 101, 101, 101, 101, 101, 101, 101, 101, 101, 0, - 0, 0, 0, 0, 101, 101, 101, 101, 101, 101, - 101, 101, 101, 101, 101, 101, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 102, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 101, 101, 101, 101, 0, 0, 101, + 0, 101, 101, 101, 101, 101, 101, 101, 101, 0, + 0, 0, 0, 0, 0, 0, 0, 101, 101, 0, + 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 101, 101, 101, 0, 0, + 0, 0, 0, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 0, 0, 0, 0, 0, + 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, + 101, 0, 0, 101, 101, 101, 101, 0, 0, 101, + 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 101, 101, 101, 101, 101, 101, 101, 101, 101, - 101, 101, 0, 0, 101, 101, 101, 101, 0, 0, - 101, 101, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 101, 101, 101, 101, 101, 101, 101, 101, - 101, 0, 0, 0, 101, 101, 101, 101, 101, 101, - 101, 102, 102, 102, 102, 0, 0, 102, 0, 102, - 102, 102, 102, 102, 102, 102, 102, 0, 0, 0, - 0, 0, 0, 0, 0, 102, 102, 0, 102, 102, - 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, + 0, 0, 0, 101, 101, 101, 101, 101, 101, 101, + 102, 102, 102, 102, 0, 0, 102, 0, 102, 102, 102, 102, 102, 102, 102, 102, 0, 0, 0, 0, - 0, 102, 102, 102, 102, 102, 102, 102, 102, 102, - 102, 102, 102, 0, 0, 0, 0, 0, 102, 102, - 102, 102, 102, 102, 102, 102, 102, 102, 102, 0, - 0, 102, 102, 102, 102, 104, 0, 102, 102, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 102, + 0, 0, 0, 0, 102, 102, 0, 102, 102, 102, + 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, + 102, 102, 102, 102, 102, 0, 0, 0, 0, 0, + 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, + 102, 102, 0, 0, 0, 0, 0, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 0, 0, - 0, 102, 102, 102, 102, 102, 102, 102, 104, 0, - 0, 0, 0, 0, 0, 104, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 102, 102, 102, 102, 104, 0, 102, 102, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 102, 102, + 102, 102, 102, 102, 102, 102, 102, 0, 0, 0, + 102, 102, 102, 102, 102, 102, 102, 104, 0, 0, 0, 0, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 104, 0, - 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 104, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 109, 0, 0, 0, 0, - 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, + 0, 109, 0, 0, 0, 0, 0, 0, 0, 104, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 109, 0, 0, 0, 0, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 109, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 109, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 104, 104, 104, 104, 0, 0, 104, 0, - 104, 104, 104, 104, 104, 104, 104, 104, 0, 0, - 0, 0, 0, 0, 0, 0, 104, 104, 0, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 0, 0, 0, 0, 0, 0, 109, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 104, 104, 104, 104, 0, 0, 104, 0, 104, 104, 104, 104, 104, 104, 104, 104, 0, 0, 0, - 0, 0, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 0, 0, 0, 0, 0, 104, + 0, 0, 0, 0, 0, 104, 104, 0, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 0, 0, 104, 104, 104, 104, 0, 0, 104, 104, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 104, 104, 104, 104, 104, 104, 0, 0, 0, 0, + 0, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 0, 0, 0, 0, 0, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 0, - 0, 0, 104, 104, 104, 104, 104, 104, 104, 109, - 109, 109, 109, 0, 0, 109, 0, 109, 109, 109, - 109, 109, 109, 109, 109, 0, 0, 0, 0, 0, - 0, 0, 0, 109, 109, 0, 109, 109, 109, 109, + 0, 104, 104, 104, 104, 0, 0, 104, 104, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, + 104, 104, 104, 104, 104, 104, 104, 104, 0, 0, + 0, 104, 104, 104, 104, 104, 104, 104, 109, 109, + 109, 109, 0, 0, 109, 0, 109, 109, 109, 109, + 109, 109, 109, 109, 0, 0, 0, 0, 0, 0, + 0, 0, 109, 109, 0, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, - 109, 109, 109, 109, 0, 0, 0, 0, 0, 109, + 109, 109, 109, 0, 0, 0, 0, 0, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, - 109, 0, 0, 0, 0, 0, 109, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 0, 0, 109, - 109, 109, 109, 111, 0, 109, 109, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 0, 0, 0, 109, - 109, 109, 109, 109, 109, 109, 111, 0, 0, 0, - 0, 0, 0, 111, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 0, 0, 109, 109, + 109, 109, 111, 0, 109, 109, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 0, 0, 0, 109, 109, + 109, 109, 109, 109, 109, 111, 0, 0, 0, 0, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 111, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 111, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 118, 0, 0, 0, 0, 0, 0, 0, 111, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, + 0, 0, 0, 0, 0, 0, 0, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 118, 0, 0, 0, 0, 0, 0, - 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, + 0, 0, 118, 0, 0, 0, 0, 0, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 118, 0, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 118, 0, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 111, 111, 111, 111, 0, 0, 111, 0, 111, 111, - 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, - 0, 0, 0, 0, 111, 111, 0, 111, 111, 111, - 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, + 0, 0, 0, 0, 118, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, + 111, 111, 111, 0, 0, 111, 0, 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, 0, 0, + 0, 0, 0, 111, 111, 0, 111, 111, 111, 111, + 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, + 111, 111, 111, 111, 0, 0, 0, 0, 0, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, - 111, 111, 0, 0, 0, 0, 0, 111, 111, 111, - 111, 111, 111, 111, 111, 111, 111, 111, 0, 0, - 111, 111, 111, 111, 0, 0, 111, 111, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 111, 111, - 111, 111, 111, 111, 111, 111, 111, 0, 0, 0, - 111, 111, 111, 111, 111, 111, 111, 118, 118, 118, - 118, 0, 0, 118, 0, 118, 118, 118, 118, 118, - 118, 118, 118, 0, 0, 0, 0, 0, 0, 0, - 0, 118, 118, 0, 118, 118, 118, 118, 118, 118, + 111, 0, 0, 0, 0, 0, 111, 111, 111, 111, + 111, 111, 111, 111, 111, 111, 111, 0, 0, 111, + 111, 111, 111, 0, 0, 111, 111, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 111, 111, 111, + 111, 111, 111, 111, 111, 111, 0, 0, 0, 111, + 111, 111, 111, 111, 111, 111, 118, 118, 118, 118, + 0, 0, 118, 0, 118, 118, 118, 118, 118, 118, + 118, 118, 0, 0, 0, 0, 0, 0, 0, 0, + 118, 118, 0, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, - 118, 118, 0, 0, 0, 0, 0, 118, 118, 118, - 118, 118, 118, 118, 118, 118, 118, 118, 118, 0, + 118, 0, 0, 0, 0, 0, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 0, 0, + 0, 0, 0, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 0, 0, 118, 118, 118, 118, + 131, 0, 118, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, 118, 118, 118, 118, 118, - 118, 118, 118, 118, 118, 0, 0, 118, 118, 118, - 118, 131, 0, 118, 118, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 118, 118, 118, 118, 118, - 118, 118, 118, 118, 0, 0, 0, 118, 118, 118, - 118, 118, 118, 118, 131, 0, 0, 0, 0, 0, - 0, 131, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 118, 118, 118, 0, 0, 0, 118, 118, 118, 118, + 118, 118, 118, 131, 0, 0, 0, 0, 0, 0, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 131, 0, 0, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 113, 0, - 0, 0, 0, 0, 0, 0, 131, 0, 0, 0, + 0, 0, 0, 131, 0, 0, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 113, 0, 0, + 0, 0, 0, 0, 0, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 113, 0, 0, 0, 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 113, 0, 0, + 113, 0, 0, 0, 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 113, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 113, 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 113, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 131, 131, - 131, 131, 0, 0, 131, 0, 131, 131, 131, 131, - 131, 131, 131, 131, 0, 0, 0, 0, 0, 0, - 0, 0, 131, 131, 0, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 0, 0, 0, 0, 0, 131, 131, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 113, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 131, 131, 131, + 131, 0, 0, 131, 0, 131, 131, 131, 131, 131, + 131, 131, 131, 0, 0, 0, 0, 0, 0, 0, + 0, 131, 131, 0, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 0, 0, 0, 0, 0, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 0, + 0, 0, 0, 0, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 0, 0, 131, 131, 131, + 131, 0, 0, 131, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 0, 0, 131, 131, - 131, 131, 0, 0, 131, 131, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 0, 0, 0, 131, 131, - 131, 131, 131, 131, 131, 113, 113, 113, 113, 0, - 0, 113, 0, 113, 113, 113, 113, 113, 113, 113, - 113, 0, 0, 0, 0, 0, 0, 0, 0, 113, + 131, 131, 131, 131, 0, 0, 0, 131, 131, 131, + 131, 131, 131, 131, 113, 113, 113, 113, 0, 0, 113, 0, 113, 113, 113, 113, 113, 113, 113, 113, - 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, - 0, 0, 0, 0, 0, 113, 113, 113, 113, 113, - 113, 113, 113, 113, 113, 113, 113, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 113, 113, + 0, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 0, + 0, 0, 0, 0, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 113, 113, 113, 0, 0, 0, 0, + 0, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 0, 0, 113, 113, 113, 113, 179, 0, + 113, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 113, 113, 113, 113, 113, 113, 113, 113, - 113, 113, 113, 0, 0, 113, 113, 113, 113, 174, - 0, 113, 113, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 113, 113, 113, 113, 113, 113, 113, - 113, 113, 0, 0, 0, 113, 113, 113, 113, 113, - 113, 113, 174, 0, 0, 0, 0, 0, 0, 174, - 0, 0, 0, 174, 174, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 174, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 174, 0, 0, 0, 0, 0, 0, 0, + 113, 0, 0, 0, 113, 113, 113, 113, 113, 113, + 113, 179, 0, 0, 0, 0, 0, 0, 179, 0, + 0, 0, 179, 179, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 149, 0, 0, 0, - 0, 0, 0, 0, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 149, - 0, 0, 0, 0, 0, 0, 149, 149, 0, 149, - 149, 149, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 149, 0, 0, 149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 149, - 0, 0, 149, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 154, 0, 0, 0, 0, + 0, 0, 0, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 154, 0, + 0, 0, 0, 0, 0, 154, 154, 0, 154, 154, + 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 154, 0, 0, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 149, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 174, 174, 174, - 0, 0, 0, 0, 174, 174, 174, 0, 174, 174, - 174, 174, 0, 0, 0, 0, 0, 0, 0, 0, - 174, 174, 0, 174, 174, 174, 174, 174, 174, 174, - 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, - 174, 0, 0, 0, 0, 0, 174, 174, 174, 174, - 174, 174, 174, 174, 174, 174, 174, 174, 0, 0, - 0, 0, 0, 174, 174, 174, 174, 174, 174, 174, - 174, 174, 174, 174, 0, 0, 174, 174, 174, 174, - 0, 0, 174, 174, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 174, 174, 174, 174, 174, 174, - 174, 174, 174, 0, 0, 0, 174, 174, 174, 174, - 174, 174, 174, 149, 149, 149, 149, 0, 0, 149, - 0, 149, 149, 149, 149, 149, 149, 149, 149, 0, - 0, 0, 0, 0, 0, 0, 0, 149, 149, 0, - 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, - 149, 149, 149, 149, 149, 149, 149, 149, 154, 0, - 0, 0, 149, 149, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 149, 149, 149, 149, 149, - 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, - 149, 154, 0, 0, 0, 0, 0, 0, 154, 149, - 149, 154, 0, 154, 154, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 154, 0, 0, - 0, 0, 0, 149, 149, 149, 149, 149, 149, 149, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 154, 175, 0, 154, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 154, 0, 175, 0, 0, 0, 0, - 0, 0, 175, 175, 0, 0, 175, 175, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 175, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 242, 0, 0, 0, 175, 0, 0, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 154, 0, + 0, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 242, 0, 0, 175, 0, 0, - 0, 242, 242, 0, 0, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 242, 242, 0, 242, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 154, 154, 154, 154, 0, - 0, 154, 0, 154, 154, 154, 154, 154, 154, 154, - 154, 0, 0, 0, 242, 0, 0, 242, 0, 154, - 154, 0, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 179, 179, 179, 0, + 0, 0, 0, 179, 179, 179, 0, 179, 179, 179, + 179, 0, 0, 0, 0, 0, 0, 0, 0, 179, + 179, 0, 179, 179, 179, 179, 179, 179, 179, 179, + 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, + 0, 0, 0, 0, 0, 179, 179, 179, 179, 179, + 179, 179, 179, 179, 179, 179, 179, 0, 0, 0, + 0, 0, 179, 179, 179, 179, 179, 179, 179, 179, + 179, 179, 179, 0, 0, 179, 179, 179, 179, 0, + 0, 179, 179, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 179, 179, 179, 179, 179, 179, 179, + 179, 179, 0, 0, 0, 179, 179, 179, 179, 179, + 179, 179, 154, 154, 154, 154, 0, 0, 154, 0, + 154, 154, 154, 154, 154, 154, 154, 154, 0, 0, + 0, 0, 0, 0, 0, 0, 154, 154, 0, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, - 0, 0, 0, 0, 43, 154, 242, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 154, 154, 154, + 154, 154, 154, 154, 154, 154, 154, 159, 0, 0, + 0, 154, 154, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 0, 0, 0, 0, 43, 0, 0, - 0, 154, 154, 0, 43, 0, 0, 0, 0, 175, - 175, 175, 175, 0, 0, 175, 0, 175, 175, 175, - 175, 175, 175, 43, 0, 154, 154, 154, 154, 154, - 154, 154, 0, 175, 175, 0, 175, 175, 175, 175, - 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, - 175, 175, 175, 175, 0, 0, 0, 43, 0, 175, - 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 175, 175, 175, 175, - 175, 175, 175, 175, 175, 175, 175, 0, 0, 43, - 0, 0, 0, 0, 0, 175, 175, 0, 242, 242, - 242, 242, 0, 0, 242, 0, 0, 0, 0, 242, - 0, 0, 242, 242, 0, 0, 0, 98, 0, 175, - 175, 175, 175, 175, 175, 175, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 242, 242, - 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, - 0, 0, 0, 0, 0, 242, 242, 242, 242, 242, - 242, 242, 242, 242, 242, 242, 98, 0, 242, 242, - 242, 242, 0, 0, 0, 0, 0, 0, 0, 0, - 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, - 242, 242, 242, 242, 242, 0, 0, 0, 0, 0, - 98, 0, 0, 0, 242, 0, 0, 0, 0, 0, - 0, 43, 43, 43, 43, 0, 0, 43, 0, 0, - 0, 0, 43, 0, 0, 43, 43, 0, 0, 0, - 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 0, 0, 0, 0, 0, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 45, - 0, 43, 43, 43, 43, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 0, 0, - 0, 0, 45, 0, 0, 0, 0, 43, 0, 45, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 98, 0, 0, - 0, 0, 98, 98, 98, 0, 98, 98, 98, 98, - 0, 0, 45, 0, 0, 45, 0, 0, 98, 98, - 0, 98, 98, 98, 98, 98, 98, 98, 98, 98, - 98, 98, 98, 98, 98, 98, 98, 98, 98, 196, - 96, 0, 0, 0, 45, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 159, 0, 0, 0, 0, 0, 0, 159, 154, 154, + 159, 0, 159, 159, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 159, 0, 0, 0, + 0, 0, 154, 154, 154, 154, 154, 154, 154, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 159, 180, 0, 159, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 159, 0, 180, 0, 0, 0, 0, 0, + 0, 180, 180, 0, 0, 180, 180, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 247, 0, 0, 0, 180, 0, 0, 180, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 247, 0, 0, 180, 0, 0, 0, + 247, 247, 0, 0, 247, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 247, + 247, 0, 247, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 159, 159, 159, 159, 0, 0, + 159, 0, 159, 159, 159, 159, 159, 159, 159, 159, + 0, 0, 0, 247, 0, 0, 247, 0, 159, 159, + 0, 159, 159, 159, 159, 159, 159, 159, 159, 159, + 159, 159, 159, 159, 159, 159, 159, 159, 159, 0, + 0, 0, 0, 43, 159, 247, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 159, 159, 159, 159, + 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, + 159, 159, 0, 0, 0, 0, 43, 0, 0, 0, + 159, 159, 0, 43, 0, 0, 0, 0, 180, 180, + 180, 180, 0, 0, 180, 0, 180, 180, 180, 180, + 180, 180, 43, 0, 159, 159, 159, 159, 159, 159, + 159, 0, 180, 180, 0, 180, 180, 180, 180, 180, + 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, + 180, 180, 180, 0, 0, 0, 43, 0, 180, 43, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 180, 180, 180, 180, 180, + 180, 180, 180, 180, 180, 180, 0, 0, 43, 0, + 0, 0, 0, 0, 180, 180, 0, 247, 247, 247, + 247, 0, 0, 247, 0, 0, 0, 0, 247, 0, + 0, 247, 247, 0, 0, 0, 98, 0, 180, 180, + 180, 180, 180, 180, 180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 247, 247, 247, + 247, 247, 247, 247, 247, 247, 247, 247, 247, 0, + 0, 0, 0, 0, 247, 247, 247, 247, 247, 247, + 247, 247, 247, 247, 247, 98, 0, 247, 247, 247, + 247, 0, 0, 0, 0, 0, 0, 0, 0, 247, + 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, + 247, 247, 247, 247, 0, 0, 0, 0, 0, 98, + 0, 0, 0, 247, 0, 0, 0, 0, 0, 0, + 43, 43, 43, 43, 0, 0, 43, 0, 0, 0, + 0, 43, 0, 0, 43, 43, 0, 0, 0, 0, + 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 0, 0, 0, 0, 0, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 45, 0, + 43, 43, 43, 43, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 0, 0, 0, + 0, 45, 0, 0, 0, 0, 43, 0, 45, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 98, 0, 0, 0, + 0, 98, 98, 98, 0, 98, 98, 98, 98, 0, + 0, 45, 0, 0, 45, 0, 0, 98, 98, 0, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 201, 96, + 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 98, + 98, 0, 0, 0, 0, 0, 255, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, + 0, 0, 0, 98, 98, 98, 98, 98, 98, 98, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 255, 0, 0, 0, 255, 255, 255, + 255, 255, 96, 255, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 255, 255, 0, 255, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 92, 0, 0, 0, 96, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 45, 45, 45, 45, 255, + 0, 45, 0, 0, 0, 0, 45, 0, 0, 45, + 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 255, 0, 0, 0, 0, 0, 0, 0, 92, + 0, 0, 0, 0, 94, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 0, 0, 0, + 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 92, 0, 45, 45, 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 98, 98, 0, 0, 0, 0, 0, 250, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, - 0, 0, 0, 0, 98, 98, 98, 98, 98, 98, - 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 250, 0, 0, 0, 250, 250, - 250, 250, 250, 96, 250, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 250, 250, 0, 250, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 92, 0, 0, 0, 96, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 45, 45, 45, 45, - 250, 0, 45, 0, 0, 0, 0, 45, 0, 0, - 45, 45, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 250, 0, 0, 0, 0, 0, 0, 0, - 92, 0, 0, 0, 0, 94, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 0, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 92, 0, 45, 45, 45, 45, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 0, 94, 0, 92, 0, 0, 108, - 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, - 96, 0, 0, 0, 0, 96, 96, 96, 0, 96, - 96, 96, 96, 0, 0, 0, 0, 0, 94, 0, - 0, 96, 96, 0, 96, 96, 96, 96, 96, 96, + 45, 45, 0, 94, 0, 92, 0, 0, 108, 0, + 0, 45, 0, 0, 0, 0, 0, 0, 0, 96, + 0, 0, 0, 0, 96, 96, 96, 0, 96, 96, + 96, 96, 0, 0, 0, 0, 0, 94, 0, 0, + 96, 96, 0, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 197, 0, 0, 0, 0, 0, 108, 0, - 94, 250, 0, 0, 0, 0, 0, 0, 0, 0, + 96, 202, 0, 0, 0, 0, 0, 108, 0, 94, + 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 250, 0, - 0, 0, 108, 96, 96, 0, 0, 0, 0, 250, - 0, 0, 250, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 96, 96, 96, - 96, 96, 96, 96, 108, 110, 0, 0, 0, 0, - 0, 92, 0, 0, 0, 0, 92, 92, 92, 0, - 92, 92, 92, 92, 0, 0, 250, 250, 250, 250, - 250, 250, 92, 92, 0, 92, 92, 92, 92, 92, + 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, + 0, 108, 96, 96, 0, 0, 0, 0, 255, 0, + 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 96, 96, 96, 96, + 96, 96, 96, 108, 110, 0, 0, 0, 0, 0, + 92, 0, 0, 0, 0, 92, 92, 92, 0, 92, + 92, 92, 92, 0, 0, 255, 255, 255, 255, 255, + 255, 92, 92, 0, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, - 92, 92, 92, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 110, 0, 0, 0, 0, 117, - 0, 0, 0, 0, 0, 94, 0, 0, 0, 0, - 94, 94, 94, 0, 94, 94, 94, 94, 0, 0, - 0, 0, 0, 0, 92, 92, 94, 94, 110, 94, + 92, 92, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 110, 0, 0, 0, 0, 117, 0, + 0, 0, 0, 0, 94, 0, 0, 0, 0, 94, + 94, 94, 0, 94, 94, 94, 94, 0, 0, 0, + 0, 0, 0, 92, 92, 94, 94, 110, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, - 94, 94, 94, 94, 94, 94, 94, 0, 92, 92, - 92, 92, 92, 92, 92, 0, 0, 0, 117, 0, - 110, 0, 0, 112, 0, 0, 0, 0, 0, 108, - 0, 0, 0, 0, 108, 108, 108, 0, 108, 108, - 108, 108, 0, 0, 0, 0, 0, 0, 94, 94, - 108, 108, 117, 108, 108, 108, 108, 108, 108, 108, + 94, 94, 94, 94, 94, 94, 0, 92, 92, 92, + 92, 92, 92, 92, 0, 0, 0, 117, 0, 110, + 0, 0, 112, 0, 0, 0, 0, 0, 108, 0, + 0, 0, 0, 108, 108, 108, 0, 108, 108, 108, + 108, 0, 0, 0, 0, 0, 0, 94, 94, 108, + 108, 117, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 0, 94, 94, 94, 94, 94, 94, 94, 0, - 0, 0, 112, 0, 117, 0, 0, 0, 0, 0, + 0, 94, 94, 94, 94, 94, 94, 94, 0, 0, + 0, 112, 0, 117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 108, 108, 0, 0, 112, 0, 0, 0, + 0, 108, 108, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 108, 108, 108, 108, - 108, 108, 108, 0, 0, 0, 0, 0, 112, 0, - 0, 0, 0, 0, 0, 110, 0, 0, 0, 0, - 110, 110, 110, 0, 110, 110, 110, 110, 0, 0, - 0, 0, 0, 0, 0, 0, 110, 110, 0, 110, + 0, 0, 0, 0, 0, 108, 108, 108, 108, 108, + 108, 108, 0, 0, 0, 0, 0, 112, 0, 0, + 0, 0, 0, 0, 110, 0, 0, 0, 0, 110, + 110, 110, 0, 110, 110, 110, 110, 0, 0, 0, + 0, 0, 0, 0, 0, 110, 110, 0, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, - 110, 110, 110, 110, 110, 110, 110, 0, 0, 0, + 110, 110, 110, 110, 110, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, - 0, 0, 0, 0, 117, 117, 117, 0, 117, 117, - 117, 117, 0, 0, 0, 0, 0, 0, 110, 110, - 117, 117, 0, 117, 117, 117, 117, 117, 117, 117, + 0, 0, 0, 0, 0, 0, 0, 0, 117, 0, + 0, 0, 0, 117, 117, 117, 0, 117, 117, 117, + 117, 0, 0, 0, 0, 0, 0, 110, 110, 117, + 117, 0, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 0, 110, 110, 110, 110, 110, 110, 110, 0, + 0, 110, 110, 110, 110, 110, 110, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 112, 0, 0, 0, 0, 112, 112, - 112, 0, 112, 112, 112, 112, 0, 0, 0, 0, - 0, 0, 117, 117, 112, 112, 83, 112, 112, 112, + 0, 0, 112, 0, 0, 0, 0, 112, 112, 112, + 0, 112, 112, 112, 112, 0, 0, 0, 0, 0, + 0, 117, 117, 112, 112, 83, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, - 112, 112, 112, 112, 112, 0, 117, 117, 117, 117, - 117, 117, 117, 0, 0, 0, 0, 0, 0, 83, - 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 83, 112, 112, 0, 0, - 0, 0, 0, 0, 0, 0, 154, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 112, 112, 112, 112, 112, 112, 112, 0, 0, 83, - 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 154, - 0, 154, 154, 0, 0, 0, 0, 0, 0, 0, - 0, 83, 0, 0, 0, 154, 0, 0, 0, 0, + 112, 112, 112, 112, 0, 117, 117, 117, 117, 117, + 117, 117, 0, 0, 0, 0, 0, 0, 83, 0, + 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 83, 112, 112, 0, 0, 0, + 0, 0, 0, 0, 0, 159, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, + 112, 112, 112, 112, 112, 112, 0, 0, 83, 0, + 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 159, 0, + 159, 159, 0, 0, 0, 0, 0, 0, 0, 0, + 83, 0, 0, 0, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 95, 0, 0, 0, 0, 0, 0, 92, 0, - 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, + 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 95, 0, 0, 0, 0, 0, 0, 92, 0, 0, + 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 83, 83, 83, 0, 0, 0, 83, - 0, 83, 83, 83, 83, 83, 83, 83, 83, 32, - 0, 0, 0, 0, 93, 0, 0, 83, 83, 0, + 0, 0, 83, 83, 83, 0, 0, 0, 83, 0, + 83, 83, 83, 83, 83, 83, 83, 83, 32, 0, + 0, 0, 0, 93, 0, 0, 83, 83, 0, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, - 83, 83, 83, 83, 83, 83, 83, 83, 0, 0, - 0, 33, 0, 83, 83, 83, 83, 83, 83, 83, - 83, 83, 83, 83, 83, 0, 0, 0, 0, 0, + 83, 83, 83, 83, 83, 83, 83, 0, 0, 0, + 33, 0, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 0, 0, 0, 0, 0, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, - 83, 0, 0, 83, 83, 83, 83, 154, 154, 83, - 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 83, 83, 83, 83, 83, 83, 83, 83, 83, - 0, 0, 0, 83, 83, 83, 83, 83, 83, 0, - 0, 0, 0, 0, 154, 154, 154, 154, 154, 154, - 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 0, 0, 83, 83, 83, 83, 159, 159, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 154, 154, 154, 154, 6, 0, 0, - 0, 0, 0, 0, 6, 0, 0, 0, 0, 6, - 0, 154, 154, 154, 154, 154, 154, 154, 154, 154, - 0, 0, 0, 0, 0, 294, 295, 51, 8, 9, - 0, 52, 0, 0, 0, 0, 53, 10, 11, 296, - 297, 14, 15, 16, 17, 18, 19, 20, 21, 0, - 0, 22, 0, 0, 0, 6, 0, 0, 0, 0, - 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 6, 0, 0, - 0, 0, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 23, 0, 79, 80, 81, 82, 24, - 25, 0, 0, 26, 0, 27, 0, 0, 0, 0, - 0, 0, 0, 83, 84, 85, 86, 87, 88, 89, - 90, 91, 28, 95, 29, 0, 0, 0, 0, 0, - 110, 30, 31, 0, 0, 94, 0, 0, 0, 0, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 0, + 0, 0, 83, 83, 83, 83, 83, 83, 0, 0, + 0, 0, 0, 159, 159, 159, 159, 159, 159, 159, + 159, 159, 159, 159, 159, 159, 159, 159, 159, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 159, 159, 159, 159, 6, 0, 0, 0, + 0, 0, 0, 6, 0, 0, 0, 0, 6, 0, + 159, 159, 159, 159, 159, 159, 159, 159, 159, 0, + 0, 0, 0, 0, 295, 296, 51, 8, 9, 0, + 52, 0, 0, 0, 0, 53, 10, 11, 297, 298, + 14, 15, 16, 17, 18, 19, 20, 21, 0, 0, + 22, 0, 0, 0, 6, 0, 0, 0, 0, 6, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 6, 0, 0, 0, + 0, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 23, 0, 79, 80, 81, 82, 24, 25, + 0, 0, 26, 0, 27, 0, 0, 0, 0, 0, + 0, 0, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 28, 95, 29, 0, 0, 0, 0, 0, 110, + 30, 31, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 93, 0, 0, 0, + 0, 0, 0, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 6, 6, 6, 6, 6, 0, 6, 0, 0, - 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 0, 0, 6, 0, 0, - 111, 0, 0, 0, 0, 0, 0, 110, 314, 0, - 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, + 6, 6, 6, 6, 6, 0, 6, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 0, 0, 0, 0, 0, 6, 6, + 6, 6, 6, 6, 0, 0, 6, 0, 0, 111, + 0, 0, 0, 0, 0, 0, 110, 315, 0, 0, + 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 0, 6, 6, 6, 6, 6, 6, 0, 0, 6, - 0, 6, 0, 93, 0, 0, 0, 0, 0, 6, + 6, 6, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, - 6, 0, 0, 0, 0, 0, 0, 6, 6, 0, + 6, 6, 6, 6, 6, 6, 0, 0, 6, 0, + 6, 0, 93, 0, 0, 0, 0, 0, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 0, 6, + 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 49, 50, 51, 8, + 0, 0, 52, 0, 126, 127, 128, 53, 129, 130, + 131, 132, 0, 0, 0, 0, 0, 0, 0, 0, + 133, 134, 0, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, + 152, 0, 0, 0, 0, 0, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 0, 0, + 0, 0, 0, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 111, 0, 79, 80, 81, 82, + 0, 92, 153, 154, 0, 0, 94, 276, 0, 0, + 0, 0, 0, 0, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 0, 0, 0, 155, 156, 157, 158, + 159, 160, 30, 49, 50, 51, 8, 0, 0, 52, + 0, 0, 0, 0, 53, 0, 0, 54, 55, 0, + 0, 0, 0, 0, 0, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 49, 50, 51, - 8, 0, 0, 52, 0, 126, 127, 128, 53, 129, - 130, 131, 132, 0, 0, 0, 0, 0, 0, 0, - 0, 133, 134, 0, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 152, 0, 0, 0, 0, 0, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 0, - 0, 0, 0, 0, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 111, 0, 79, 80, 81, - 82, 0, 92, 153, 154, 0, 0, 94, 275, 0, - 0, 0, 0, 0, 0, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 0, 0, 0, 155, 156, 157, - 158, 159, 160, 30, 49, 50, 51, 8, 0, 0, - 52, 0, 0, 0, 0, 53, 0, 0, 54, 55, - 0, 0, 0, 0, 0, 0, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 0, 0, 0, 0, 0, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 95, 0, 79, 80, 81, 82, 0, 92, 0, + 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, + 0, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 0, 0, 0, 0, - 0, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 95, 0, 79, 80, 81, 82, 0, 92, - 0, 0, 0, 0, 94, 0, 0, 0, 0, 0, - 0, 0, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 93, 0, 0, 0, 0, + 0, 0, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, - 50, 51, 8, 0, 0, 52, 0, 0, 0, 0, - 53, 0, 0, 54, 55, 111, 0, 0, 0, 0, - 0, 0, 110, 0, 0, 0, 0, 94, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 0, 0, 0, 0, 0, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 0, 93, 79, - 80, 81, 82, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 30, 49, 50, 51, 8, - 0, 0, 52, 0, 0, 0, 0, 53, 0, 0, - 54, 55, 111, 0, 0, 0, 0, 0, 0, 92, - 0, 0, 0, 0, 94, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 49, 50, + 51, 8, 0, 0, 52, 0, 0, 0, 0, 53, + 0, 0, 54, 55, 111, 0, 0, 0, 0, 0, + 0, 110, 0, 0, 0, 0, 94, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 0, 0, 0, 0, 0, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 0, 93, 79, 80, + 81, 82, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 30, 49, 50, 51, 8, 0, + 0, 52, 0, 0, 0, 0, 53, 0, 0, 54, + 55, 111, 0, 0, 0, 0, 0, 0, 92, 0, + 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 0, 0, - 0, 0, 0, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 0, 93, 79, 80, 81, 82, + 0, 0, 0, 0, 0, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 0, 0, 0, + 0, 0, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 0, 93, 79, 80, 81, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 30, 0, 0, 0, 0, 0, 0, 49, - 50, 51, 8, 0, 0, 52, 0, 0, 0, 0, - 53, 0, 0, 54, 55, 111, 0, 0, 0, 0, - 0, 0, 282, 0, 0, 0, 0, 94, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 0, 0, 0, 0, 0, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 0, 93, 79, - 80, 81, 82, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 30, 49, 50, 51, 8, - 0, 0, 52, 0, 0, 0, 0, 53, 0, 0, - 54, 55, 95, 0, 0, 0, 0, 0, 0, 276, - 0, 0, 0, 0, 94, 275, 0, 0, 0, 0, + 0, 0, 0, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 30, 0, 0, 0, 0, 0, 0, 49, 50, + 51, 8, 0, 0, 52, 0, 0, 0, 0, 53, + 0, 0, 54, 55, 111, 0, 0, 0, 0, 0, + 0, 283, 0, 0, 0, 0, 94, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 0, 0, 0, 0, 0, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 0, 93, 79, 80, + 81, 82, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 30, 49, 50, 51, 8, 0, + 0, 52, 0, 0, 0, 0, 53, 0, 0, 54, + 55, 95, 0, 0, 0, 0, 0, 0, 277, 0, + 0, 0, 0, 94, 276, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 0, 0, - 0, 0, 0, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 0, 93, 79, 80, 81, 82, + 0, 0, 0, 0, 0, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 0, 0, 0, + 0, 0, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 0, 93, 79, 80, 81, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 30, 0, 0, 0, 0, 0, 0, 49, - 50, 51, 8, 0, 0, 52, 0, 0, 0, 0, - 53, 0, 0, 54, 55, 95, 0, 0, 0, 0, - 0, 0, 110, 0, 424, 0, 0, 94, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 0, 0, 0, 0, 0, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 0, 93, 79, - 80, 81, 82, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 30, 272, 50, 51, 0, - 0, 0, 273, 0, 0, 0, 0, 274, 0, 0, - 54, 55, 95, 0, 0, 0, 0, 0, 0, 110, - 0, 0, 0, 0, 94, 0, 0, 0, 0, 0, + 0, 0, 0, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 30, 0, 0, 0, 0, 0, 0, 49, 50, + 51, 8, 0, 0, 52, 0, 0, 0, 0, 53, + 0, 0, 54, 55, 95, 0, 0, 0, 0, 0, + 0, 110, 0, 442, 0, 0, 94, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 0, 0, 0, 0, 0, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 0, 93, 79, 80, + 81, 82, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 30, 273, 50, 51, 0, 0, + 0, 274, 0, 0, 0, 0, 275, 0, 0, 54, + 55, 95, 0, 0, 0, 0, 0, 0, 110, 0, + 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 0, 0, - 0, 0, 0, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 0, 93, 79, 80, 81, 82, + 0, 0, 0, 0, 0, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 0, 0, 0, + 0, 0, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 0, 93, 79, 80, 81, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, - 50, 51, 0, 0, 0, 52, 0, 0, 0, 0, - 53, 0, 0, 54, 55, 95, 0, 0, 0, 0, - 0, 0, 92, 0, 0, 0, 0, 94, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 0, 0, 0, 0, 0, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 0, 93, 79, - 80, 81, 82, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 49, 50, 51, 0, - 0, 0, 52, 0, 0, 0, 0, 53, 0, 0, - 54, 55, 95, 0, 0, 0, 0, 0, 0, 282, - 0, 0, 0, 0, 94, 0, 0, 0, 0, 0, + 0, 0, 0, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 49, 50, + 51, 0, 0, 0, 52, 0, 0, 0, 0, 53, + 0, 0, 54, 55, 95, 0, 0, 0, 0, 0, + 0, 92, 0, 0, 0, 0, 94, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 0, 0, 0, 0, 0, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 0, 93, 79, 80, + 81, 82, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 49, 50, 51, 0, 0, + 0, 52, 0, 0, 0, 0, 53, 0, 0, 54, + 55, 95, 0, 0, 0, 0, 0, 0, 283, 0, + 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 0, 0, - 0, 0, 0, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 0, 93, 79, 80, 81, 82, + 0, 0, 0, 0, 0, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 0, 0, 0, + 0, 0, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 0, 93, 79, 80, 81, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, - 50, 51, 0, 0, 0, 52, 0, 0, 0, 0, - 53, 0, 0, 54, 55, 95, 0, 0, 0, 0, - 0, 0, 110, 0, 0, 0, 0, 94, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 0, 0, 0, 0, 0, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 0, 93, 79, - 80, 81, 82, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 49, 50, 51, 0, - 0, 0, 52, 0, 0, 0, 0, 53, 0, 0, - 54, 55, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, + 0, 0, 0, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 49, 50, + 51, 0, 0, 0, 52, 0, 0, 0, 0, 53, + 0, 0, 54, 55, 95, 0, 0, 0, 0, 0, + 0, 110, 0, 0, 0, 0, 94, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 0, 0, 0, 0, 0, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 0, 93, 79, 80, + 81, 82, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 49, 50, 51, 0, 0, + 0, 52, 0, 0, 0, 0, 53, 0, 0, 54, + 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 0, 0, - 32, 0, 0, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 0, 0, 79, 80, 81, 82, + 0, 0, 0, 0, 0, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 0, 0, 32, + 0, 0, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 0, 0, 79, 80, 81, 82, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 33, 0, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 49, 50, + 51, 0, 0, 0, 52, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 33, 0, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, - 50, 51, 0, 0, 0, 52, 0, 0, 0, 0, - 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 0, 0, 0, 0, 0, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 0, 0, 79, - 80, 81, 82, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 6, 7, 0, 8, - 9, 0, 0, 0, 0, 0, 0, 0, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 0, 0, 0, 0, 0, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 0, 0, 79, 80, + 81, 82, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 6, 7, 0, 8, 9, + 0, 0, 0, 0, 0, 0, 0, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 0, + 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 23, 0, 0, 0, 0, 0, - 24, 25, 0, 0, 26, 0, 27, 0, 0, 0, + 0, 0, 0, 23, 0, 0, 0, 0, 0, 24, + 25, 0, 0, 26, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 28, 0, 29, 0, 0, 0, 0, - 0, 0, 30, 31, + 0, 0, 28, 0, 29, 0, 0, 0, 0, 0, + 0, 30, 31, }; short yycheck[] = { 25, - 44, 59, 125, 29, 43, 31, 45, 0, 0, 0, - 37, 37, 260, 111, 260, 42, 43, 37, 45, 107, - 47, 260, 42, 43, 0, 45, 100, 47, 43, 268, - 45, 37, 120, 60, 59, 62, 42, 43, 92, 45, - 0, 47, 165, 4, 105, 36, 41, 62, 43, 58, - 45, 42, 61, 58, 60, 25, 62, 41, 61, 41, - 44, 31, 44, 43, 25, 45, 92, 94, 94, 95, - 31, 271, 272, 96, 94, 258, 37, 96, 43, 44, - 45, 107, 258, 59, 40, 111, 348, 141, 94, 91, - 336, 43, 44, 45, 120, 319, 320, 321, 322, 323, - 93, 93, 61, 129, 130, 131, 132, 133, 134, 135, - 136, 137, 138, 139, 140, 141, 0, 93, 144, 145, - 146, 336, 92, 271, 272, 373, 43, 44, 45, 155, - 156, 91, 125, 125, 0, 37, 262, 107, 272, 165, - 42, 43, 276, 45, 218, 47, 107, 245, 246, 125, - 120, 249, 250, 257, 258, 355, 356, 118, 60, 120, - 62, 349, 350, 123, 125, 40, 0, 137, 138, 139, - 140, 351, 352, 227, 228, 59, 202, 203, 204, 205, + 59, 44, 37, 29, 0, 31, 111, 42, 43, 44, + 45, 37, 47, 92, 37, 59, 125, 260, 100, 42, + 43, 0, 45, 0, 47, 60, 43, 62, 45, 41, + 0, 260, 0, 0, 273, 37, 58, 60, 277, 62, + 42, 43, 37, 45, 96, 47, 260, 42, 43, 43, + 45, 45, 47, 4, 268, 58, 165, 36, 61, 94, + 105, 41, 141, 42, 44, 60, 92, 62, 94, 95, + 107, 94, 41, 41, 25, 44, 44, 271, 272, 61, + 31, 107, 59, 120, 258, 111, 37, 96, 43, 59, + 45, 59, 94, 336, 120, 91, 257, 258, 43, 94, + 45, 0, 258, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 93, 62, 144, 145, + 146, 349, 350, 93, 40, 93, 93, 123, 25, 155, + 156, 370, 371, 348, 31, 0, 61, 219, 0, 165, + 336, 246, 247, 262, 373, 250, 251, 40, 125, 228, + 229, 271, 272, 351, 352, 125, 107, 125, 125, 40, + 59, 355, 356, 121, 122, 404, 40, 118, 407, 120, + 61, 41, 40, 43, 125, 45, 40, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 94, 59, 102, 165, 157, 158, 159, 33, - 40, 227, 228, 277, 165, 40, 40, 355, 356, 93, - 0, 45, 273, 274, 258, 40, 242, 121, 122, 245, - 246, 247, 276, 249, 250, 40, 40, 93, 282, 40, - 364, 365, 140, 40, 257, 0, 40, 40, 257, 209, - 263, 125, 40, 61, 263, 268, 291, 217, 260, 268, - 276, 258, 262, 43, 41, 45, 282, 91, 260, 125, - 394, 41, 96, 397, 264, 94, 268, 306, 303, 59, - 393, 273, 274, 275, 276, 277, 278, 46, 280, 302, - 257, 91, 302, 0, 93, 305, 125, 93, 262, 123, - 251, 252, 41, 319, 59, 256, 0, 257, 258, 257, - 260, 261, 363, 93, 41, 262, 276, 41, 0, 269, - 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, - 280, 44, 349, 283, 351, 352, 353, 354, 93, 33, - 41, 41, 44, 37, 41, 125, 40, 41, 42, 43, - 44, 45, 59, 47, 44, 351, 352, 353, 354, 319, - 41, 43, 41, 45, 304, 59, 60, 262, 62, 349, - 125, 387, 388, 389, 272, 391, 44, 59, 276, 257, - 305, 279, 41, 37, 260, 335, 93, 365, 42, 41, - 41, 341, 342, 47, 41, 345, 262, 347, 0, 93, - 41, 346, 96, 260, 27, 421, 31, 37, 424, 346, - 346, 93, 42, 43, 364, 45, 366, 47, 125, 346, - 43, 165, 399, 373, 374, 36, -1, 387, 388, -1, - 60, 125, 62, 257, 258, 259, 260, 261, -1, 263, - 94, -1, 393, 125, 268, 269, 270, 271, 272, 273, - 274, 275, 276, 277, 278, 279, 280, -1, -1, 283, - 260, 353, 354, -1, 94, -1, 364, 365, -1, -1, - 93, -1, -1, 273, 274, 275, 276, 277, 278, -1, - 280, -1, -1, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, -1, 394, -1, -1, 397, - 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, - 334, 335, -1, 337, 338, 339, 340, 341, 342, -1, - -1, 345, 46, 347, -1, -1, -1, -1, 91, -1, - -1, 355, 356, 357, 358, 359, 360, 361, 362, 363, - 364, -1, 366, -1, 167, -1, -1, -1, -1, 373, - 374, 174, 175, 176, 177, 178, 179, 180, 181, 182, - 183, 184, -1, 257, 258, 259, 260, -1, -1, 263, + 216, 217, 218, 40, 93, 92, 278, 59, 277, 0, + 40, 40, 228, 229, 283, 257, 157, 158, 159, 260, + 107, 263, 40, 40, 165, 258, 268, 243, 40, 291, + 246, 247, 248, 120, 250, 251, 125, 258, 93, 274, + 275, 93, 33, 262, 41, 355, 356, 260, 41, 40, + 137, 138, 139, 140, 45, 324, 325, 43, 257, 45, + 302, 277, 94, 264, 263, 303, 46, 283, 257, 268, + 125, 257, 258, 125, 260, 261, 62, 302, 165, 93, + 305, 125, 93, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 257, 262, 283, 262, 306, + 91, 41, 318, 319, 403, 96, 264, 323, 324, 325, + 302, 252, 253, 305, 41, 44, 257, 319, 320, 321, + 322, 323, 306, 210, 349, 350, 351, 352, 353, 354, + 0, 218, 123, 291, 369, 0, 349, 350, 351, 352, + 353, 354, 41, 41, 302, 41, 41, 305, 43, 335, + 45, 43, 44, 45, 44, 341, 342, 44, 41, 345, + 373, 347, 41, 41, 349, 0, 351, 352, 353, 354, + 304, 0, 349, 43, 262, 45, 41, 44, 364, 44, + 366, 397, 398, 399, 257, 401, 365, 373, 374, 59, + 277, 349, 350, 305, 59, 43, 44, 45, 33, 415, + 416, 41, 37, 41, 260, 40, 41, 42, 43, 44, + 45, 41, 47, 41, 43, 41, 45, 41, 91, 346, + 41, 437, 262, 93, 59, 60, 442, 62, 93, 91, + 59, 318, 319, 0, 37, 41, 323, 27, 260, 42, + 37, 43, 44, 45, 47, 42, 43, 346, 45, 44, + 47, 346, 346, 43, 165, 125, 409, 31, 93, 36, + 125, 96, 403, 60, 93, 62, 257, 258, 259, 260, + 261, 193, 263, 43, 44, 45, -1, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 125, 94, 283, 43, 44, 45, 125, 94, 319, 320, + 321, 322, 323, 93, 43, 44, 45, 43, 44, 45, + 397, 398, 43, 44, 45, -1, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 318, 415, 416, + -1, -1, -1, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, -1, 337, 338, 339, 340, + 341, 342, 37, -1, 345, -1, 347, 42, 43, -1, + 45, -1, 47, -1, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, -1, 366, -1, 167, -1, -1, + 46, -1, 373, 374, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 91, -1, -1, 260, 264, + 273, 274, 275, 276, 277, 278, 268, 280, -1, 94, + -1, 273, 274, 275, 276, 277, 278, -1, 280, -1, + -1, -1, 257, 258, 259, 260, 291, -1, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, -1, -1, + 46, -1, -1, -1, -1, -1, 281, 282, 0, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, -1, -1, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 349, 350, -1, -1, -1, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 0, 0, 337, 338, 339, 340, 0, 59, 343, 344, + 0, 346, -1, -1, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 0, + -1, -1, 367, 368, 369, 370, 371, 372, 373, 33, + -1, 93, -1, 37, -1, -1, 40, 41, 42, 43, + 44, 45, 349, 47, 351, 352, 353, 354, -1, 59, + 59, -1, -1, -1, 260, 59, 60, -1, 62, 59, + -1, -1, -1, 125, -1, -1, -1, 273, 274, 275, + 276, 277, 278, -1, 280, -1, -1, -1, 59, -1, + -1, -1, 382, 93, 93, -1, 386, 387, -1, 93, + -1, -1, 96, 93, -1, 271, 272, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 93, 0, -1, 125, 125, -1, -1, -1, + -1, 125, -1, -1, -1, 125, -1, -1, -1, -1, + -1, -1, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, -1, 125, -1, 33, -1, -1, -1, + 37, -1, -1, 40, 41, 42, 43, 44, 45, -1, + 47, 337, 338, 339, 340, -1, -1, -1, -1, -1, + -1, -1, 59, 60, -1, 62, -1, -1, -1, 355, + 356, 357, 358, 359, 360, 361, 362, 363, -1, -1, + -1, -1, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, -1, -1, -1, 93, -1, -1, 96, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 337, 338, 339, 340, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 125, 355, + 356, 357, 358, 359, 360, 361, 362, 363, -1, -1, + -1, -1, -1, 257, 258, 259, 260, -1, -1, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, -1, -1, -1, -1, -1, -1, -1, -1, 281, 282, -1, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, @@ -1842,594 +1896,594 @@ -1, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, -1, -1, -1, -1, -1, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, - 334, -1, 0, 337, 338, 339, 340, 0, -1, 343, + 334, 46, -1, 337, 338, 339, 340, -1, -1, 343, 344, -1, 346, -1, -1, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, - 0, -1, -1, 367, 368, 369, 370, 371, 372, 373, - 33, -1, -1, -1, 37, 0, -1, 40, 41, 42, - 43, 44, 45, -1, 47, -1, -1, -1, -1, -1, - -1, 59, -1, 0, -1, -1, 59, 60, -1, 62, - 273, 274, 275, 276, 277, 278, -1, 280, -1, 349, - 350, 351, 352, 353, 354, -1, 37, -1, -1, 59, - -1, 42, 43, 44, 45, 93, 47, -1, -1, -1, - 93, -1, -1, 96, 59, -1, -1, 271, 272, 60, - -1, 62, -1, 376, -1, -1, -1, 380, 381, -1, - 37, -1, 59, 93, 0, 42, 43, 125, 45, -1, - 47, -1, 125, -1, -1, -1, -1, -1, 93, -1, - -1, -1, -1, 94, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 125, 93, 33, -1, -1, + -1, -1, -1, 367, 368, 369, 370, 371, 372, 373, + 257, 258, 259, 260, -1, -1, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, -1, -1, -1, -1, + -1, -1, -1, -1, 281, 282, -1, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, -1, -1, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, -1, -1, -1, -1, -1, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, -1, -1, + 337, 338, 339, 340, 0, -1, 343, 344, -1, 346, + -1, -1, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, -1, -1, -1, + 367, 368, 369, 370, 371, 372, 373, 33, -1, -1, -1, 37, -1, -1, 40, 41, 42, 43, 44, 45, - 125, 47, -1, 337, 338, 339, 340, 94, -1, -1, - -1, -1, -1, 59, 60, -1, 62, -1, 125, -1, - -1, 355, 356, 357, 358, 359, 360, 361, 362, 363, - -1, -1, -1, -1, 37, -1, -1, -1, -1, 42, - 43, -1, 45, -1, 47, -1, -1, 93, -1, -1, - 96, -1, -1, -1, -1, -1, -1, 60, -1, 62, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 125, + -1, 47, 37, -1, -1, -1, -1, 42, 43, -1, + 45, -1, 47, 59, 60, -1, 62, -1, -1, -1, + -1, -1, -1, -1, -1, 60, -1, 62, -1, -1, + 37, -1, -1, -1, -1, 42, 43, -1, 45, -1, + 47, -1, -1, -1, -1, -1, -1, 93, -1, -1, + 96, -1, -1, 60, -1, 62, 271, 272, -1, 94, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 94, -1, -1, 257, 258, 259, 260, -1, -1, - 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - -1, -1, 46, -1, -1, -1, -1, -1, 281, 282, - -1, 284, 285, 286, 287, 288, 289, 290, 291, 292, - 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, - -1, -1, 305, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 315, 316, 317, 318, -1, -1, -1, -1, - -1, 324, 325, 326, 327, 328, 329, 330, 331, 332, - 333, 334, 46, -1, 337, 338, 339, 340, -1, -1, - 343, 344, -1, 346, -1, -1, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, - 363, -1, -1, -1, 367, 368, 369, 370, 371, 372, - 373, 257, 258, 259, 260, -1, -1, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, -1, 349, 350, - 351, 352, 353, 354, -1, 281, 282, -1, 284, 285, + -1, 0, -1, -1, -1, -1, -1, -1, -1, 125, + -1, -1, -1, -1, -1, -1, -1, 94, -1, -1, + -1, -1, -1, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 33, -1, -1, -1, 37, -1, + -1, 40, 41, 42, 43, 44, 45, -1, 47, -1, + -1, -1, 337, 338, 339, 340, -1, -1, -1, -1, + 59, 60, -1, 62, -1, -1, -1, -1, -1, -1, + 355, 356, 357, 358, 359, 360, 361, 362, 363, -1, + -1, 37, -1, -1, -1, -1, 42, 43, 44, 45, + -1, 47, -1, -1, 93, -1, -1, 96, -1, -1, + -1, -1, 37, -1, 60, -1, 62, 42, 43, 44, + 45, -1, 47, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 60, 125, 62, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 94, -1, + -1, 257, 258, 259, 260, -1, -1, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, -1, -1, 94, + -1, -1, -1, -1, -1, 281, 282, -1, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, - 296, 297, 298, 299, 300, 301, 302, 260, -1, 305, + 296, 297, 298, 299, 300, 301, 302, -1, -1, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, -1, -1, -1, -1, -1, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, -1, - -1, 337, 338, 339, 340, 0, -1, 343, 344, -1, + -1, 337, 338, 339, 340, -1, -1, 343, 344, -1, 346, -1, -1, 349, 350, 351, 352, 353, 354, 355, - 356, 357, 358, 359, 360, 361, 362, 363, -1, -1, - -1, 367, 368, 369, 370, 371, 372, 373, 33, -1, - -1, -1, 37, -1, -1, 40, 41, 42, 43, 44, - 45, -1, 47, -1, -1, -1, 349, 350, 351, 352, - 353, 354, -1, -1, 59, 60, -1, 62, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 373, -1, -1, -1, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, -1, -1, -1, 93, -1, - -1, 96, -1, -1, -1, -1, -1, 271, 272, -1, - -1, -1, -1, 337, 338, 339, 340, -1, -1, -1, - -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, - 125, 355, 356, 357, 358, 359, 360, 361, 362, 363, - -1, -1, -1, -1, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 33, -1, -1, -1, 37, + 356, 357, 358, 359, 360, 361, 362, 363, 353, 354, + -1, 367, 368, 369, 370, 371, 372, 373, 257, 258, + 259, 260, -1, -1, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 351, 352, 353, 354, -1, -1, + -1, -1, 281, 282, -1, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, -1, -1, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + -1, -1, -1, -1, -1, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, -1, -1, 337, 338, + 339, 340, 0, -1, 343, 344, 302, 346, -1, 305, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, -1, -1, -1, 367, 368, + 369, 370, 371, 372, 373, 33, -1, -1, -1, 37, -1, -1, 40, 41, 42, 43, 44, 45, -1, 47, - -1, -1, -1, 337, 338, 339, 340, -1, -1, -1, + -1, -1, -1, 349, 350, 351, 352, 353, 354, -1, -1, 59, 60, -1, 62, -1, -1, -1, -1, -1, - -1, 355, 356, 357, 358, 359, 360, 361, 362, 363, + -1, -1, -1, -1, 349, 350, 351, 352, 353, 354, -1, -1, 37, -1, -1, -1, -1, 42, 43, 44, 45, -1, 47, -1, -1, 93, -1, -1, 96, -1, - -1, -1, -1, 37, -1, 60, -1, 62, 42, 43, - 44, 45, -1, 47, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 60, 125, 62, -1, + -1, -1, 0, -1, -1, 60, -1, 62, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, + -1, -1, -1, -1, -1, -1, -1, 125, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 94, - -1, -1, 257, 258, 259, 260, -1, -1, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, -1, -1, - 94, -1, -1, -1, -1, -1, 281, 282, -1, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, -1, -1, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, -1, -1, -1, -1, -1, 324, - 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, - -1, -1, 337, 338, 339, 340, -1, -1, 343, 344, - -1, 346, -1, -1, 349, 350, 351, 352, 353, 354, - 355, 356, 357, 358, 359, 360, 361, 362, 363, -1, - -1, -1, 367, 368, 369, 370, 371, 372, 373, 257, + -1, -1, -1, 41, -1, -1, 44, -1, -1, -1, + -1, -1, 33, -1, -1, -1, -1, -1, -1, 40, + 41, 59, 43, 44, 45, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 59, 60, + -1, 62, 37, -1, -1, -1, -1, 42, 43, 44, + 45, -1, 47, -1, 37, 93, -1, -1, -1, 42, + 43, -1, 45, -1, 47, 60, -1, 62, -1, -1, + -1, -1, 93, -1, -1, 96, -1, 60, 37, 62, + -1, -1, -1, 42, 43, -1, 45, 125, 47, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 94, + -1, 60, -1, 62, 125, -1, -1, -1, -1, -1, + -1, 94, -1, -1, -1, -1, -1, -1, -1, 257, 258, 259, 260, -1, -1, 263, 264, 265, 266, 267, - 268, 269, 270, 271, 272, -1, -1, -1, -1, -1, + 268, 269, 270, 271, 272, 94, -1, -1, -1, -1, -1, -1, -1, 281, 282, -1, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, -1, -1, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, -1, -1, -1, -1, -1, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, -1, -1, 337, - 338, 339, 340, 0, -1, 343, 344, 302, 346, -1, + 338, 339, 340, 102, -1, 343, 344, 302, 346, -1, 305, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 360, 361, 362, 363, -1, -1, -1, 367, - 368, 369, 370, 371, 372, 373, 33, -1, -1, -1, - 37, -1, -1, 40, 41, 42, 43, 44, 45, -1, - 47, -1, -1, -1, 349, 350, 351, 352, 353, 354, - -1, -1, 59, 60, -1, 62, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 349, 350, 351, 352, 353, - 354, -1, -1, 37, -1, -1, -1, -1, 42, 43, - 44, 45, -1, 47, -1, -1, 93, -1, 92, 96, - -1, -1, -1, -1, -1, -1, 60, -1, 62, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 0, -1, -1, -1, -1, -1, -1, -1, 125, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 94, -1, -1, 137, 138, 139, 140, -1, -1, -1, - -1, -1, -1, 33, -1, -1, -1, -1, -1, -1, - 40, 41, -1, 43, 44, 45, -1, -1, -1, -1, - -1, 165, -1, -1, -1, -1, -1, -1, -1, 59, - 60, -1, 62, 37, -1, -1, -1, -1, 42, 43, - -1, 45, -1, 47, -1, -1, -1, 37, -1, -1, - -1, -1, 42, 43, 44, 45, 60, 47, 62, -1, - -1, -1, -1, 93, -1, 209, 96, -1, -1, 37, - 60, -1, 62, 217, 42, 43, -1, 45, -1, 47, + 358, 359, 360, 361, 362, 363, 264, -1, -1, 367, + 368, 369, 370, 371, 372, 373, 257, 258, 259, 260, + -1, 140, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, -1, 291, 349, 350, 351, 352, 353, 354, + 281, 282, -1, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, -1, -1, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 318, -1, -1, + -1, -1, -1, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, -1, -1, 337, 338, 339, 340, + 0, -1, 343, 344, -1, 346, -1, -1, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, -1, -1, -1, 367, 368, 369, 370, + 371, 372, 373, 33, 349, 350, 351, 352, 353, 354, + 40, 41, -1, 43, 44, 45, 349, 350, 351, 352, + 353, 354, -1, -1, 273, -1, -1, -1, 277, 59, + 60, 280, 62, -1, -1, -1, -1, -1, -1, -1, + 349, 350, 351, 352, 353, 354, -1, -1, -1, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + -1, -1, -1, 93, -1, -1, 96, -1, -1, -1, + 0, -1, -1, -1, -1, -1, -1, -1, 337, 338, + 339, 340, -1, -1, -1, -1, -1, 0, -1, -1, + -1, -1, -1, -1, -1, 125, 355, 356, 357, 358, + 359, 360, 361, 362, 363, -1, -1, -1, -1, -1, + -1, 41, -1, -1, 44, -1, -1, -1, -1, -1, + 33, 370, 371, -1, -1, -1, -1, 40, 41, 59, + -1, 44, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 59, 60, -1, 62, + -1, -1, -1, -1, -1, 404, -1, -1, 407, -1, + -1, -1, -1, 93, -1, -1, -1, -1, -1, 37, + -1, -1, -1, -1, 42, 43, -1, 45, -1, 47, + 93, -1, -1, 96, -1, -1, -1, -1, -1, -1, + -1, -1, 60, -1, 62, 125, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 94, -1, 60, -1, 62, 125, -1, -1, -1, -1, - -1, -1, -1, -1, 94, -1, -1, -1, -1, -1, - 257, 258, 259, 260, -1, -1, 263, 264, 265, 266, - 267, 268, 269, 270, 271, 272, 94, -1, -1, -1, - -1, -1, 276, -1, 281, 282, -1, 284, 285, 286, - 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, 302, -1, -1, 305, 306, - 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, - 317, 318, -1, -1, -1, 319, -1, 324, 325, 326, - 327, 328, 329, 330, 331, 332, 333, 334, -1, -1, - 337, 338, 339, 340, -1, -1, 343, 344, 302, 346, - -1, 305, 349, 350, 351, 352, 353, 354, 355, 356, - 357, 358, 359, 360, 361, 362, 363, -1, -1, -1, - 367, 368, 369, 370, 371, 372, 373, 257, 258, 259, + -1, -1, 125, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 94, 257, 258, 259, 260, -1, -1, 263, 264, 265, 266, 267, 268, 269, - 270, 271, 272, 387, 388, 349, 350, 351, 352, 353, - 354, 281, 282, -1, 284, 285, 286, 287, 288, 289, + 270, 271, 272, -1, 92, -1, -1, -1, -1, -1, + -1, 281, 282, -1, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, -1, -1, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, -1, - -1, -1, -1, -1, 324, 325, 326, 327, 328, 329, + 310, 311, 312, 313, 314, 315, 316, 317, 318, 137, + 138, 139, 140, -1, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, -1, -1, 337, 338, 339, - 340, 0, 302, 343, 344, 305, 346, -1, -1, 349, + 340, -1, -1, 343, 344, -1, 346, 165, -1, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, - 360, 361, 362, 363, -1, -1, -1, 367, 368, 369, - 370, 371, 372, 373, 33, 349, 350, 351, 352, 353, - 354, 40, 41, -1, 43, 44, 45, -1, -1, 349, - 350, 351, 352, 353, 354, -1, -1, 0, -1, -1, - 59, 60, -1, 62, -1, -1, -1, -1, -1, -1, - -1, 349, -1, 351, 352, 353, 354, -1, -1, -1, - 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, - 318, -1, -1, -1, 93, -1, -1, 96, 41, -1, - -1, 44, 0, -1, -1, -1, -1, -1, -1, 337, - 338, 339, 340, -1, -1, -1, 59, -1, 0, -1, - -1, -1, -1, -1, -1, -1, 125, 355, 356, 357, - 358, 359, 360, 361, 362, 363, -1, -1, -1, -1, - -1, -1, -1, 41, -1, -1, 44, -1, -1, -1, - 93, 33, -1, -1, -1, -1, -1, -1, 40, 41, - -1, 59, 44, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 59, 60, -1, - 62, -1, 125, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 93, -1, -1, -1, -1, - 37, -1, -1, -1, -1, 42, 43, -1, 45, -1, - 47, 93, -1, -1, 96, -1, -1, -1, -1, -1, - -1, -1, -1, 60, -1, 62, -1, 125, -1, -1, + 360, 361, 362, 363, 264, -1, -1, 367, 368, 369, + 370, 371, 372, 373, 257, 258, 259, 260, -1, -1, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + -1, 291, 210, -1, -1, -1, -1, -1, 281, 282, + 218, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + -1, -1, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 0, -1, -1, -1, + -1, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 290, -1, 337, 338, 339, 340, 0, 277, + 343, 344, -1, 346, -1, -1, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, -1, -1, -1, 367, 368, 369, 370, 371, 372, + 373, 33, -1, -1, -1, 59, -1, -1, 40, 41, + 318, 319, 44, -1, -1, 323, -1, -1, -1, -1, + -1, 349, 350, 351, 352, 353, 354, 59, 60, -1, + 62, -1, -1, -1, -1, -1, -1, -1, -1, 93, + -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 125, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 94, 257, 258, - 259, 260, -1, -1, 263, 264, 265, 266, 267, 268, - 269, 270, 271, 272, -1, -1, -1, -1, -1, -1, - -1, -1, 281, 282, -1, 284, 285, 286, 287, 288, - 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, - 299, 300, 301, 302, -1, -1, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, - -1, 264, -1, -1, -1, 324, 325, 326, 327, 328, - 329, 330, 331, 332, 333, 334, -1, -1, 337, 338, - 339, 340, -1, -1, 343, 344, -1, 346, 291, -1, - 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, - 359, 360, 361, 362, 363, -1, 264, -1, 367, 368, - 369, 370, 371, 372, 373, 257, 258, 259, 260, -1, + -1, 93, -1, -1, 96, -1, -1, -1, -1, -1, + -1, 125, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 0, -1, -1, -1, 397, + 398, -1, -1, 125, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 415, 416, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 33, -1, + -1, -1, -1, -1, -1, 40, 41, -1, -1, 44, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 59, 60, -1, 62, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 93, -1, + -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 257, -1, -1, -1, -1, -1, 263, + 125, -1, -1, -1, 268, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 257, 258, 259, 260, -1, -1, 263, 264, 265, 266, 267, 268, 269, 270, 271, - 272, -1, -1, 291, -1, -1, -1, -1, -1, 281, + 272, -1, -1, -1, -1, -1, -1, -1, 302, 281, 282, -1, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, -1, -1, 305, 306, 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, 317, 318, 0, -1, -1, + 312, 313, 314, 315, 316, 317, 318, -1, -1, -1, -1, -1, 324, 325, 326, 327, 328, 329, 330, 331, - 332, 333, 334, 290, -1, 337, 338, 339, 340, 0, + 332, 333, 334, -1, -1, 337, 338, 339, 340, -1, -1, 343, 344, -1, 346, -1, -1, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, -1, -1, -1, 367, 368, 369, 370, 371, - 372, 373, 33, -1, -1, -1, 59, -1, -1, 40, - 41, -1, -1, 44, -1, -1, -1, -1, -1, -1, - -1, -1, 349, 350, 351, 352, 353, 354, 59, 60, - -1, 62, -1, -1, -1, -1, -1, -1, -1, -1, - 93, -1, -1, 96, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 93, -1, -1, 96, -1, -1, -1, -1, - -1, -1, 125, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, - -1, -1, -1, -1, 125, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, - -1, -1, -1, -1, -1, -1, 40, 41, -1, -1, + 372, 373, 257, 258, 259, 260, -1, -1, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, -1, -1, + -1, -1, -1, -1, -1, -1, 281, 282, -1, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, -1, -1, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 0, -1, -1, -1, -1, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + -1, -1, 337, 338, 339, 340, 0, -1, 343, 344, + -1, 346, -1, -1, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, -1, + -1, -1, 367, 368, 369, 370, 371, 372, 373, 33, + -1, -1, -1, 59, -1, -1, 40, 41, -1, -1, 44, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 59, 60, -1, 62, -1, + -1, -1, -1, -1, -1, -1, -1, 93, -1, -1, + 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 93, + -1, -1, 96, -1, -1, -1, -1, -1, -1, 125, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, + -1, 125, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 93, - -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 33, -1, -1, -1, + -1, -1, -1, 40, 41, -1, 43, 44, 45, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 41, -1, + -1, 44, 59, -1, -1, 62, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 257, -1, -1, -1, -1, -1, - 263, 125, -1, -1, -1, 268, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 257, 258, 259, 260, - -1, -1, 263, 264, 265, 266, 267, 268, 269, 270, - 271, 272, -1, -1, -1, -1, -1, -1, -1, 302, - 281, 282, -1, 284, 285, 286, 287, 288, 289, 290, - 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, - 301, 302, -1, -1, 305, 306, 307, 308, 309, 310, - 311, 312, 313, 314, 315, 316, 317, 318, -1, -1, - -1, -1, -1, 324, 325, 326, 327, 328, 329, 330, - 331, 332, 333, 334, -1, -1, 337, 338, 339, 340, - -1, -1, 343, 344, -1, 346, -1, -1, 349, 350, - 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, - 361, 362, 363, -1, -1, -1, 367, 368, 369, 370, - 371, 372, 373, 257, 258, 259, 260, -1, -1, 263, + -1, -1, -1, -1, -1, -1, 93, -1, -1, 96, + -1, -1, -1, -1, -1, -1, 37, -1, -1, -1, + 93, 42, 43, -1, 45, -1, 47, -1, -1, -1, + -1, 257, -1, -1, -1, -1, -1, 263, 125, 60, + -1, 62, 268, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 125, 257, 258, 259, 260, -1, -1, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, -1, - -1, -1, -1, -1, -1, -1, -1, 281, 282, -1, + -1, -1, -1, 94, -1, -1, 302, 281, 282, -1, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, -1, -1, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 0, -1, -1, -1, -1, + 314, 315, 316, 317, 318, -1, -1, -1, -1, -1, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, - 334, -1, -1, 337, 338, 339, 340, 0, -1, 343, + 334, -1, -1, 337, 338, 339, 340, -1, -1, 343, 344, -1, 346, -1, -1, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, -1, -1, -1, 367, 368, 369, 370, 371, 372, 373, - 33, -1, -1, -1, 59, -1, -1, 40, 41, -1, - -1, 44, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 59, 60, -1, 62, - -1, -1, -1, -1, -1, -1, -1, -1, 93, -1, - -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, + 257, 258, 259, 260, -1, -1, 263, -1, 265, 266, + 267, 268, 269, 270, 271, 272, -1, -1, -1, -1, + -1, 264, -1, -1, 281, 282, -1, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, -1, -1, -1, 291, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, -1, -1, + 337, 338, 339, 340, 0, -1, 343, 344, -1, -1, + -1, -1, -1, -1, -1, -1, 287, -1, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 350, -1, -1, + 367, 368, 369, 370, 371, 372, 373, 33, -1, -1, + -1, -1, -1, -1, 40, 41, -1, -1, 44, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 93, -1, -1, 96, -1, -1, -1, -1, -1, -1, - 125, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, - -1, -1, 125, -1, -1, -1, -1, -1, 0, -1, + -1, -1, -1, 59, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 349, 350, + 351, 352, 353, 354, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 93, -1, -1, + 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 33, -1, -1, - -1, -1, -1, -1, 40, 41, -1, 43, 44, 45, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 41, - -1, -1, 44, 59, -1, -1, 62, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 59, -1, -1, + -1, 0, -1, -1, -1, -1, -1, -1, -1, 125, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 93, -1, -1, - 96, -1, -1, -1, -1, -1, -1, 37, -1, -1, - -1, 93, 42, 43, -1, 45, -1, 47, -1, -1, - -1, -1, 257, -1, -1, -1, -1, -1, 263, 125, - 60, -1, 62, 268, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 125, 257, 258, 259, 260, -1, -1, - 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - -1, -1, -1, -1, 94, -1, -1, 302, 281, 282, - -1, 284, 285, 286, 287, 288, 289, 290, 291, 292, - 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, - -1, -1, 305, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 315, 316, 317, 318, -1, -1, -1, -1, - -1, 324, 325, 326, 327, 328, 329, 330, 331, 332, - 333, 334, -1, -1, 337, 338, 339, 340, -1, -1, - 343, 344, -1, 346, -1, -1, 349, 350, 351, 352, - 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, - 363, -1, -1, -1, 367, 368, 369, 370, 371, 372, - 373, 257, 258, 259, 260, -1, -1, 263, -1, 265, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 33, -1, -1, -1, -1, -1, + -1, 40, 41, -1, -1, 44, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 93, -1, -1, 96, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 125, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 257, 258, 259, 260, -1, -1, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, -1, -1, -1, - -1, -1, 264, -1, -1, 281, 282, -1, 284, 285, + -1, -1, -1, -1, -1, 281, 282, -1, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, - 296, 297, 298, 299, 300, 301, -1, -1, -1, 291, + 296, 297, 298, 299, 300, 301, 302, -1, -1, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, - 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 316, 317, 318, -1, -1, -1, -1, -1, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, -1, - -1, 337, 338, 339, 340, 0, -1, 343, 344, -1, - -1, -1, -1, -1, -1, -1, -1, 287, -1, 355, - 356, 357, 358, 359, 360, 361, 362, 363, 350, -1, - -1, 367, 368, 369, 370, 371, 372, 373, 33, -1, - -1, -1, -1, -1, -1, 40, 41, -1, -1, 44, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 59, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 349, - 350, 351, 352, 353, 354, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 93, -1, - -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, - 125, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 337, 338, 339, 340, -1, -1, 343, 344, -1, + 346, -1, -1, 349, 350, 351, 352, -1, -1, 355, + 356, 357, 358, 359, 360, 361, 362, 363, -1, -1, + -1, 367, 368, 369, 370, 371, 372, 373, 257, 258, + 259, 260, -1, -1, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, -1, -1, -1, -1, -1, -1, + -1, -1, 281, 282, -1, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, -1, -1, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + -1, -1, -1, -1, -1, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, -1, -1, 337, 338, + 339, 340, 0, -1, 343, 344, -1, 346, -1, -1, + 349, 350, 351, 352, -1, -1, 355, 356, 357, 358, + 359, 360, 361, 362, 363, -1, -1, -1, 367, 368, + 369, 370, 371, 372, 373, 33, -1, -1, -1, -1, + -1, -1, 40, 41, -1, 43, 44, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 33, -1, -1, -1, -1, - -1, -1, 40, 41, -1, -1, 44, -1, -1, -1, + -1, 59, -1, -1, 62, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 59, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, + -1, -1, -1, -1, -1, 93, -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, + -1, -1, -1, -1, -1, -1, -1, 125, -1, -1, + 41, -1, -1, 44, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 59, -1, + -1, -1, 33, -1, -1, -1, -1, -1, -1, 40, + 41, -1, -1, 44, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 59, -1, + -1, -1, 93, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 93, -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 93, -1, 125, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 125, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 257, 258, 259, 260, -1, -1, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, -1, -1, - -1, -1, -1, -1, -1, -1, 281, 282, -1, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, -1, -1, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, -1, -1, -1, -1, -1, 324, - 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, - -1, -1, 337, 338, 339, 340, -1, -1, 343, 344, - -1, 346, -1, -1, 349, 350, 351, 352, -1, -1, - 355, 356, 357, 358, 359, 360, 361, 362, 363, -1, - -1, -1, 367, 368, 369, 370, 371, 372, 373, 257, - 258, 259, 260, -1, -1, 263, 264, 265, 266, 267, + -1, -1, -1, -1, 125, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 257, + 258, 259, 260, -1, -1, 263, -1, 265, 266, 267, 268, 269, 270, 271, 272, -1, -1, -1, -1, -1, -1, -1, -1, 281, 282, -1, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, - 298, 299, 300, 301, 302, -1, -1, 305, 306, 307, + 298, 299, 300, 301, -1, -1, -1, -1, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, - 318, -1, -1, -1, -1, -1, 324, 325, 326, 327, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, -1, -1, 337, - 338, 339, 340, 0, -1, 343, 344, -1, 346, -1, - -1, 349, 350, 351, 352, -1, -1, 355, 356, 357, + 338, 339, 340, -1, -1, 343, 344, -1, -1, -1, + -1, -1, -1, 264, -1, -1, -1, 355, 356, 357, 358, 359, 360, 361, 362, 363, -1, -1, -1, 367, - 368, 369, 370, 371, 372, 373, 33, -1, -1, -1, - -1, -1, -1, 40, 41, -1, 43, 44, 45, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 59, -1, -1, 62, -1, -1, -1, -1, + 368, 369, 370, 371, 372, 373, 257, 258, 259, 260, + 291, -1, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, -1, -1, -1, -1, -1, -1, -1, -1, + 281, 282, -1, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, -1, -1, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 318, -1, 350, + -1, -1, -1, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, -1, -1, 337, 338, 339, 340, + 0, -1, 343, 344, -1, 346, -1, -1, 349, 350, + -1, -1, -1, -1, 355, 356, 357, 358, 359, 360, + 361, 362, 363, -1, -1, -1, 367, 368, 369, 370, + 371, 372, 373, 33, -1, -1, -1, -1, -1, -1, + 40, 41, -1, -1, 44, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 0, -1, -1, -1, -1, -1, 93, -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 0, -1, -1, 93, -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 0, -1, -1, -1, -1, -1, -1, -1, 125, -1, + -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, + -1, -1, -1, -1, -1, 125, -1, -1, -1, -1, -1, 41, -1, -1, 44, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 59, - -1, -1, -1, 33, -1, -1, -1, -1, -1, -1, - 40, 41, -1, -1, 44, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 59, + 33, -1, -1, -1, -1, -1, -1, 40, 41, -1, + 43, 44, 45, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 59, -1, -1, 62, -1, -1, -1, 93, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 93, -1, 125, 96, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 93, -1, -1, 96, -1, 125, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 125, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 257, 258, 259, 260, -1, -1, 263, -1, 265, 266, - 267, 268, 269, 270, 271, 272, -1, -1, -1, -1, - -1, -1, -1, -1, 281, 282, -1, 284, 285, 286, - 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, -1, -1, -1, -1, 306, - 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, - 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, - 327, 328, 329, 330, 331, 332, 333, 334, -1, -1, - 337, 338, 339, 340, -1, -1, 343, 344, -1, -1, - -1, -1, -1, -1, 264, -1, -1, -1, 355, 356, - 357, 358, 359, 360, 361, 362, 363, -1, -1, -1, - 367, 368, 369, 370, 371, 372, 373, 257, 258, 259, - 260, 291, -1, 263, 264, 265, 266, 267, 268, 269, + -1, -1, 125, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 257, 258, 259, + 260, -1, -1, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, -1, -1, -1, -1, -1, -1, -1, -1, 281, 282, -1, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, -1, -1, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 349, - 350, -1, -1, -1, 324, 325, 326, 327, 328, 329, + 310, 311, 312, 313, 314, 315, 316, 317, 318, -1, + -1, -1, -1, -1, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, -1, -1, 337, 338, 339, - 340, 0, -1, 343, 344, -1, 346, -1, -1, 349, - 350, -1, -1, -1, -1, 355, 356, 357, 358, 359, + 340, -1, -1, 343, 344, -1, 346, -1, -1, -1, + 350, -1, -1, -1, 264, 355, 356, 357, 358, 359, 360, 361, 362, 363, -1, -1, -1, 367, 368, 369, - 370, 371, 372, 373, 33, -1, -1, -1, -1, -1, - -1, 40, 41, -1, -1, 44, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 370, 371, 372, 373, 257, 258, 259, 260, -1, -1, + 263, 291, 265, 266, 267, 268, 269, 270, 271, 272, + -1, -1, 302, -1, -1, 305, -1, -1, 281, 282, + -1, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 298, 299, 300, 301, -1, + -1, -1, -1, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, -1, -1, -1, -1, + 350, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, -1, -1, 337, 338, 339, 340, 0, -1, + 343, 344, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 355, 356, 357, 358, 359, 360, 361, 362, + 363, -1, -1, -1, 367, 368, 369, 370, 371, 372, + 373, 33, -1, -1, -1, -1, -1, -1, 40, 41, + -1, -1, 44, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 59, -1, -1, + 62, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, + -1, 93, -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 0, -1, -1, 93, -1, -1, 96, -1, -1, + -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, + -1, -1, -1, 125, -1, -1, 41, -1, -1, 44, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, - -1, -1, -1, -1, -1, -1, 125, -1, -1, -1, - -1, -1, 41, -1, -1, 44, -1, -1, -1, -1, + -1, -1, -1, -1, 59, -1, -1, -1, 33, -1, + -1, -1, -1, -1, -1, 40, 41, -1, -1, 44, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 59, 33, -1, -1, -1, -1, -1, -1, 40, 41, - -1, 43, 44, 45, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 59, -1, -1, - 62, -1, -1, -1, 93, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 59, -1, -1, -1, 93, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 93, -1, -1, 96, -1, 125, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 93, -1, + 125, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 125, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 257, 258, - 259, 260, -1, -1, 263, 264, 265, 266, 267, 268, - 269, 270, 271, 272, -1, -1, -1, -1, -1, -1, - -1, -1, 281, 282, -1, 284, 285, 286, 287, 288, - 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, - 299, 300, 301, 302, -1, -1, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, - -1, -1, -1, -1, -1, 324, 325, 326, 327, 328, - 329, 330, 331, 332, 333, 334, -1, -1, 337, 338, - 339, 340, -1, -1, 343, 344, -1, 346, -1, -1, - -1, 350, -1, -1, -1, 264, 355, 356, 357, 358, - 359, 360, 361, 362, 363, -1, -1, -1, 367, 368, - 369, 370, 371, 372, 373, 257, 258, 259, 260, -1, - -1, 263, 291, 265, 266, 267, 268, 269, 270, 271, - 272, -1, -1, 302, -1, -1, 305, -1, -1, 281, + 125, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 257, 258, 259, 260, -1, + -1, 263, -1, 265, 266, 267, 268, 269, 270, 271, + 272, -1, -1, -1, -1, -1, -1, -1, -1, 281, 282, -1, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, -1, -1, -1, -1, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, -1, -1, -1, - 349, 350, 324, 325, 326, 327, 328, 329, 330, 331, - 332, 333, 334, -1, -1, 337, 338, 339, 340, 0, - -1, 343, 344, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, -1, -1, 337, 338, 339, 340, -1, + -1, 343, 344, -1, -1, -1, -1, 91, -1, 264, -1, -1, -1, 355, 356, 357, 358, 359, 360, 361, 362, 363, -1, -1, -1, 367, 368, 369, 370, 371, - 372, 373, 33, -1, -1, -1, -1, -1, -1, 40, - 41, -1, -1, 44, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 59, -1, - -1, 62, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, - -1, -1, 93, -1, -1, 96, -1, -1, -1, -1, + 372, 373, 257, 258, 259, 260, 291, -1, 263, 123, + 265, 266, 267, 268, 269, 270, 271, 272, -1, -1, + -1, -1, -1, -1, -1, -1, 281, 282, -1, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, -1, -1, -1, + -1, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, -1, 350, -1, -1, -1, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + -1, -1, 337, 338, 339, 340, 0, -1, 343, 344, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, - -1, -1, -1, -1, 125, -1, -1, -1, -1, -1, - 41, -1, -1, 44, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 59, 33, - -1, -1, -1, -1, -1, -1, 40, 41, -1, -1, - 44, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 59, -1, -1, -1, -1, - -1, -1, 93, -1, -1, -1, -1, -1, -1, -1, + 355, 356, 357, 358, 359, 360, 361, 362, 363, -1, + -1, -1, 367, 368, 369, 370, 371, 372, 373, 33, + -1, -1, -1, -1, -1, -1, 40, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 257, 258, 59, 260, 261, -1, -1, + -1, -1, -1, -1, -1, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, -1, -1, 283, -1, -1, -1, -1, -1, -1, -1, -1, -1, 93, - -1, -1, 96, -1, 125, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, 125, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 257, 258, 259, 260, - -1, -1, 263, -1, 265, 266, 267, 268, 269, 270, - 271, 272, -1, -1, -1, -1, -1, -1, -1, -1, - 281, 282, -1, 284, 285, 286, 287, 288, 289, 290, - 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, - 301, -1, -1, -1, -1, 306, 307, 308, 309, 310, - 311, 312, 313, 314, 315, 316, 317, 318, -1, -1, - -1, -1, -1, 324, 325, 326, 327, 328, 329, 330, - 331, 332, 333, 334, -1, -1, 337, 338, 339, 340, - -1, -1, 343, 344, -1, 91, -1, -1, -1, -1, - -1, -1, -1, 264, 355, 356, 357, 358, 359, 360, - 361, 362, 363, -1, -1, -1, 367, 368, 369, 370, - 371, 372, 373, 257, 258, 259, 260, 123, -1, 263, - 291, 265, 266, 267, 268, 269, 270, 271, 272, -1, - -1, 302, -1, -1, 305, -1, -1, 281, 282, -1, + -1, 335, -1, -1, -1, -1, -1, 341, 342, -1, + -1, 345, -1, 347, -1, -1, 33, -1, -1, -1, + -1, -1, -1, 40, -1, -1, -1, -1, -1, -1, + 364, -1, 366, -1, -1, -1, -1, -1, -1, 373, + 374, -1, 59, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 93, -1, -1, 96, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 125, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 257, 258, 259, 260, -1, -1, 263, + -1, 265, 266, 267, 268, 269, 270, 271, 272, -1, + -1, -1, -1, -1, -1, -1, -1, 281, 282, -1, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, -1, -1, - -1, -1, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, -1, -1, -1, -1, 350, + -1, -1, -1, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, -1, -1, -1, -1, -1, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, - 334, -1, -1, 337, 338, 339, 340, 0, -1, 343, - 344, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 334, -1, -1, 337, 338, 339, 340, -1, -1, 343, + 344, -1, 91, -1, -1, -1, -1, -1, -1, -1, -1, 355, 356, 357, 358, 359, 360, 361, 362, 363, -1, -1, -1, 367, 368, 369, 370, 371, 372, 373, - 33, -1, -1, -1, -1, -1, -1, 40, -1, -1, + 257, 258, 259, 260, 123, -1, 263, -1, 265, 266, + 267, 268, 269, 270, 271, 272, -1, -1, -1, -1, + -1, -1, -1, -1, 281, 282, -1, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, -1, -1, -1, -1, -1, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, -1, -1, -1, -1, -1, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, -1, -1, + 337, 338, 339, 340, 0, -1, 343, 344, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 355, 356, + 357, 358, 359, 360, 361, 362, 363, -1, -1, -1, + 367, 368, 369, 370, 371, 372, 373, 33, -1, -1, + -1, -1, -1, -1, 40, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 257, 258, + -1, 260, 261, 59, -1, -1, -1, -1, -1, -1, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, -1, -1, 283, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 93, -1, -1, + 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 257, 258, -1, 260, 261, 59, -1, -1, -1, - -1, -1, -1, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, -1, -1, 283, -1, -1, - -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, - 93, -1, -1, 96, -1, -1, -1, -1, -1, -1, + -1, 0, -1, -1, -1, -1, -1, -1, -1, 125, + -1, -1, -1, -1, -1, -1, 335, -1, -1, -1, + -1, -1, 341, 342, -1, -1, 345, -1, 347, -1, + -1, -1, -1, -1, 33, -1, -1, -1, -1, -1, + -1, 40, -1, -1, -1, 364, -1, 366, -1, -1, + -1, -1, -1, -1, 373, 374, -1, -1, -1, -1, + 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, - -1, -1, 125, -1, -1, 41, -1, -1, 44, 335, - -1, -1, -1, -1, -1, 341, 342, -1, -1, 345, - -1, 347, -1, 59, -1, -1, -1, 33, -1, -1, - -1, -1, -1, -1, 40, -1, -1, -1, 364, -1, - 366, -1, -1, -1, -1, -1, -1, 373, 374, -1, - -1, -1, -1, 59, -1, -1, -1, 93, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 93, -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 93, -1, 125, - 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 125, + -1, -1, -1, -1, -1, -1, 125, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 257, 258, 259, 260, -1, -1, - 263, -1, 265, 266, 267, 268, 269, 270, 271, 272, - -1, -1, -1, -1, -1, -1, -1, -1, 281, 282, - -1, 284, 285, 286, 287, 288, 289, 290, 291, 292, - 293, 294, 295, 296, 297, 298, 299, 300, 301, -1, - -1, -1, -1, -1, 307, 308, 309, 310, 311, 312, - 313, 314, 315, 316, 317, 318, -1, -1, -1, -1, - -1, 324, 325, 326, 327, 328, 329, 330, 331, 332, - 333, 334, -1, -1, 337, 338, 339, 340, -1, -1, - 343, 344, -1, -1, -1, -1, 91, -1, 264, -1, - -1, -1, 355, 356, 357, 358, 359, 360, 361, 362, - 363, -1, -1, -1, 367, 368, 369, 370, 371, 372, - 373, 257, 258, 259, 260, 291, -1, 263, 123, 265, + -1, 257, 258, 259, 260, -1, -1, 263, -1, 265, 266, 267, 268, 269, 270, 271, 272, -1, -1, -1, -1, -1, -1, -1, -1, 281, 282, -1, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, -1, -1, -1, -1, -1, 307, 308, 309, 310, 311, 312, 313, 314, 315, - 316, 317, 318, -1, 350, -1, -1, -1, 324, 325, + 316, 317, 318, -1, -1, -1, -1, -1, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, -1, - -1, 337, 338, 339, 340, 0, -1, 343, 344, -1, + -1, 337, 338, 339, 340, -1, -1, 343, 344, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 355, 356, 357, 358, 359, 360, 361, 362, 363, -1, -1, - -1, 367, 368, 369, 370, 371, 372, 373, 33, -1, - -1, -1, -1, -1, -1, 40, -1, -1, -1, -1, + -1, 367, 368, 369, 370, 371, 372, 373, 257, 258, + 259, 260, -1, -1, 263, -1, 265, 266, 267, 268, + 269, 270, 271, 272, -1, -1, -1, -1, -1, -1, + -1, -1, 281, 282, -1, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, -1, -1, -1, -1, -1, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + -1, -1, -1, -1, -1, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, -1, -1, 337, 338, + 339, 340, 0, -1, 343, 344, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 355, 356, 357, 358, + 359, 360, 361, 362, 363, -1, -1, -1, 367, 368, + 369, 370, 371, 372, 373, 33, -1, -1, -1, -1, + -1, -1, 40, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 257, 258, 59, 260, 261, -1, -1, -1, - -1, -1, -1, -1, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, 280, -1, -1, 283, -1, - -1, -1, 0, -1, -1, -1, -1, -1, 93, -1, - -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, - 125, -1, -1, 41, -1, -1, 44, -1, -1, -1, - 335, -1, -1, -1, -1, -1, 341, 342, -1, -1, - 345, 59, 347, -1, -1, 33, -1, -1, -1, -1, - -1, -1, 40, -1, -1, -1, -1, -1, -1, 364, - -1, 366, -1, -1, -1, -1, -1, -1, 373, 374, - -1, 59, -1, -1, -1, 93, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 93, -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 93, -1, 125, 96, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, + -1, -1, -1, -1, -1, -1, -1, 125, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 125, -1, -1, + -1, -1, 33, -1, -1, -1, -1, -1, -1, 40, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 257, 258, 259, 260, -1, -1, 263, -1, - 265, 266, 267, 268, 269, 270, 271, 272, -1, -1, - -1, -1, -1, -1, -1, -1, 281, 282, -1, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, -1, -1, -1, - -1, -1, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, -1, -1, -1, -1, -1, 324, - 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, - -1, -1, 337, 338, 339, 340, -1, -1, 343, 344, - -1, -1, -1, -1, -1, -1, 264, -1, -1, -1, - 355, 356, 357, 358, 359, 360, 361, 362, 363, -1, - -1, -1, 367, 368, 369, 370, 371, 372, 373, 257, - 258, 259, 260, 291, -1, 263, -1, 265, 266, 267, + -1, -1, -1, -1, -1, -1, -1, -1, 59, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 93, -1, -1, 96, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 125, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 257, + 258, 259, 260, -1, -1, 263, -1, 265, 266, 267, 268, 269, 270, 271, 272, -1, -1, -1, -1, -1, -1, -1, -1, 281, 282, -1, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, -1, -1, -1, -1, -1, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, - 318, -1, 350, -1, -1, -1, 324, 325, 326, 327, + 318, -1, -1, -1, -1, -1, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, -1, -1, 337, - 338, 339, 340, 0, -1, 343, 344, -1, -1, -1, + 338, 339, 340, -1, -1, 343, 344, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 355, 356, 357, 358, 359, 360, 361, 362, 363, -1, -1, -1, 367, - 368, 369, 370, 371, 372, 373, 33, -1, -1, -1, - -1, -1, -1, 40, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 59, -1, -1, -1, -1, -1, -1, -1, + 368, 369, 370, 371, 372, 373, 257, 258, 259, 260, + -1, -1, 263, -1, 265, 266, 267, 268, 269, 270, + 271, 272, -1, -1, -1, -1, -1, -1, -1, -1, + 281, 282, -1, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, -1, -1, -1, -1, -1, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 318, -1, -1, + -1, -1, -1, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, -1, -1, 337, 338, 339, 340, + 0, -1, 343, 344, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 355, 356, 357, 358, 359, 360, + 361, 362, 363, -1, -1, -1, 367, 368, 369, 370, + 371, 372, 373, 33, -1, -1, -1, -1, -1, -1, + 40, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 93, -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 93, -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 0, -1, -1, -1, -1, -1, -1, -1, 125, -1, + -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, + -1, -1, -1, -1, -1, 125, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 33, -1, -1, -1, -1, -1, -1, - 40, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 59, + 33, -1, -1, -1, -1, -1, -1, 40, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 93, -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 93, -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 125, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 257, 258, 259, 260, -1, -1, 263, -1, 265, 266, - 267, 268, 269, 270, 271, 272, -1, -1, -1, -1, - -1, -1, -1, -1, 281, 282, -1, 284, 285, 286, - 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, -1, -1, -1, -1, -1, - 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, - 317, 318, -1, -1, -1, -1, -1, 324, 325, 326, - 327, 328, 329, 330, 331, 332, 333, 334, -1, -1, - 337, 338, 339, 340, -1, -1, 343, 344, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 355, 356, - 357, 358, 359, 360, 361, 362, 363, -1, -1, -1, - 367, 368, 369, 370, 371, 372, 373, 257, 258, 259, + -1, -1, 125, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 257, 258, 259, 260, -1, -1, 263, -1, 265, 266, 267, 268, 269, 270, 271, 272, -1, -1, -1, -1, -1, -1, -1, -1, 281, 282, -1, 284, 285, 286, 287, 288, 289, @@ -2438,44 +2492,44 @@ 310, 311, 312, 313, 314, 315, 316, 317, 318, -1, -1, -1, -1, -1, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, -1, -1, 337, 338, 339, - 340, 0, -1, 343, 344, -1, -1, -1, -1, -1, + 340, -1, -1, 343, 344, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 355, 356, 357, 358, 359, 360, 361, 362, 363, -1, -1, -1, 367, 368, 369, - 370, 371, 372, 373, 33, -1, -1, -1, -1, -1, - -1, 40, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 370, 371, 372, 373, 257, 258, 259, 260, -1, -1, + 263, -1, 265, 266, 267, 268, 269, 270, 271, 272, + -1, -1, -1, -1, -1, -1, -1, -1, 281, 282, + -1, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 298, 299, 300, 301, -1, + -1, -1, -1, -1, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, -1, -1, -1, -1, + -1, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, -1, -1, 337, 338, 339, 340, 0, -1, + 343, 344, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 355, 356, 357, 358, 359, 360, 361, 362, + 363, -1, -1, -1, 367, 368, 369, 370, 371, 372, + 373, 33, -1, -1, -1, -1, -1, -1, 40, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 93, -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, - -1, -1, -1, -1, -1, -1, 125, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 93, -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 33, -1, -1, -1, -1, -1, -1, 40, -1, + -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, + -1, -1, -1, 125, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 59, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 33, -1, + -1, -1, -1, -1, -1, 40, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 93, -1, -1, 96, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 93, -1, + -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 125, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 257, 258, - 259, 260, -1, -1, 263, -1, 265, 266, 267, 268, - 269, 270, 271, 272, -1, -1, -1, -1, -1, -1, - -1, -1, 281, 282, -1, 284, 285, 286, 287, 288, - 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, - 299, 300, 301, -1, -1, -1, -1, -1, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, - -1, -1, -1, -1, -1, 324, 325, 326, 327, 328, - 329, 330, 331, 332, 333, 334, -1, -1, 337, 338, - 339, 340, -1, -1, 343, 344, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 355, 356, 357, 358, - 359, 360, 361, 362, 363, -1, -1, -1, 367, 368, - 369, 370, 371, 372, 373, 257, 258, 259, 260, -1, + 125, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 257, 258, 259, 260, -1, -1, 263, -1, 265, 266, 267, 268, 269, 270, 271, 272, -1, -1, -1, -1, -1, -1, -1, -1, 281, 282, -1, 284, 285, 286, 287, 288, 289, 290, 291, @@ -2483,45 +2537,45 @@ -1, -1, -1, -1, -1, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, -1, -1, -1, -1, -1, 324, 325, 326, 327, 328, 329, 330, 331, - 332, 333, 334, -1, -1, 337, 338, 339, 340, 0, + 332, 333, 334, -1, -1, 337, 338, 339, 340, -1, -1, 343, 344, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 355, 356, 357, 358, 359, 360, 361, 362, 363, -1, -1, -1, 367, 368, 369, 370, 371, - 372, 373, 33, -1, -1, -1, -1, -1, -1, 40, + 372, 373, 257, 258, 259, 260, -1, -1, 263, -1, + 265, 266, 267, 268, 269, 270, 271, 272, -1, -1, + -1, -1, -1, -1, -1, -1, 281, 282, -1, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, -1, -1, -1, + -1, -1, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, -1, -1, -1, -1, -1, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + -1, -1, 337, 338, 339, 340, 0, -1, 343, 344, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 59, -1, + 355, 356, 357, 358, 359, 360, 361, 362, 363, -1, + -1, -1, 367, 368, 369, 370, 371, 372, 373, 33, + -1, -1, -1, -1, -1, -1, 40, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 93, -1, -1, 96, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 93, + -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, - -1, -1, -1, -1, 125, -1, -1, -1, -1, -1, + -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, + -1, 125, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, - -1, -1, -1, -1, -1, -1, 40, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 33, -1, -1, -1, + -1, -1, -1, 40, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 93, -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 93, - -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 125, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 125, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 257, 258, 259, 260, - -1, -1, 263, -1, 265, 266, 267, 268, 269, 270, - 271, 272, -1, -1, -1, -1, -1, -1, -1, -1, - 281, 282, -1, 284, 285, 286, 287, 288, 289, 290, - 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, - 301, -1, -1, -1, -1, -1, 307, 308, 309, 310, - 311, 312, 313, 314, 315, 316, 317, 318, -1, -1, - -1, -1, -1, 324, 325, 326, 327, 328, 329, 330, - 331, 332, 333, 334, -1, -1, 337, 338, 339, 340, - -1, -1, 343, 344, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 355, 356, 357, 358, 359, 360, - 361, 362, 363, -1, -1, -1, 367, 368, 369, 370, - 371, 372, 373, 257, 258, 259, 260, -1, -1, 263, + -1, -1, -1, 257, 258, 259, 260, -1, -1, 263, -1, 265, 266, 267, 268, 269, 270, 271, 272, -1, -1, -1, -1, -1, -1, -1, -1, 281, 282, -1, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, @@ -2529,45 +2583,45 @@ -1, -1, -1, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, -1, -1, -1, -1, -1, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, - 334, -1, -1, 337, 338, 339, 340, 0, -1, 343, + 334, -1, -1, 337, 338, 339, 340, -1, -1, 343, 344, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 355, 356, 357, 358, 359, 360, 361, 362, 363, -1, -1, -1, 367, 368, 369, 370, 371, 372, 373, - 33, -1, -1, -1, -1, -1, -1, 40, -1, -1, + 257, 258, 259, 260, -1, -1, 263, -1, 265, 266, + 267, 268, 269, 270, 271, 272, -1, -1, -1, -1, + -1, -1, -1, -1, 281, 282, -1, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, -1, -1, -1, -1, -1, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, -1, -1, -1, -1, -1, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, -1, -1, + 337, 338, 339, 340, 0, -1, 343, 344, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 355, 356, + 357, 358, 359, 360, 361, 362, 363, -1, -1, -1, + 367, 368, 369, 370, 371, 372, 373, 33, -1, -1, + -1, -1, -1, -1, 40, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 93, -1, -1, + 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 0, -1, -1, -1, -1, -1, -1, -1, 125, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 93, -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, - -1, -1, 125, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 33, -1, -1, -1, -1, -1, + -1, 40, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 33, -1, -1, - -1, -1, -1, -1, 40, -1, -1, -1, -1, -1, + 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 93, -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 93, -1, -1, - 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 125, + -1, -1, -1, -1, -1, -1, 125, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 257, 258, 259, 260, -1, -1, - 263, -1, 265, 266, 267, 268, 269, 270, 271, 272, - -1, -1, -1, -1, -1, -1, -1, -1, 281, 282, - -1, 284, 285, 286, 287, 288, 289, 290, 291, 292, - 293, 294, 295, 296, 297, 298, 299, 300, 301, -1, - -1, -1, -1, -1, 307, 308, 309, 310, 311, 312, - 313, 314, 315, 316, 317, 318, -1, -1, -1, -1, - -1, 324, 325, 326, 327, 328, 329, 330, 331, 332, - 333, 334, -1, -1, 337, 338, 339, 340, -1, -1, - 343, 344, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 355, 356, 357, 358, 359, 360, 361, 362, - 363, -1, -1, -1, 367, 368, 369, 370, 371, 372, - 373, 257, 258, 259, 260, -1, -1, 263, -1, 265, + -1, 257, 258, 259, 260, -1, -1, 263, -1, 265, 266, 267, 268, 269, 270, 271, 272, -1, -1, -1, -1, -1, -1, -1, -1, 281, 282, -1, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, @@ -2575,44 +2629,44 @@ -1, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, -1, -1, -1, -1, -1, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, -1, - -1, 337, 338, 339, 340, 0, -1, 343, 344, -1, + -1, 337, 338, 339, 340, -1, -1, 343, 344, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 355, 356, 357, 358, 359, 360, 361, 362, 363, -1, -1, - -1, 367, 368, 369, 370, 371, 372, 373, 33, -1, - -1, -1, -1, -1, -1, 40, -1, -1, -1, -1, + -1, 367, 368, 369, 370, 371, 372, 373, 257, 258, + 259, 260, -1, -1, 263, -1, 265, 266, 267, 268, + 269, 270, 271, 272, -1, -1, -1, -1, -1, -1, + -1, -1, 281, 282, -1, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, -1, -1, -1, -1, -1, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + -1, -1, -1, -1, -1, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, -1, -1, 337, 338, + 339, 340, 0, -1, 343, 344, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 355, 356, 357, 358, + 359, 360, 361, 362, 363, -1, -1, -1, 367, 368, + 369, 370, 371, 372, 373, 33, -1, -1, -1, -1, + -1, -1, 40, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 59, -1, -1, -1, -1, -1, + -1, 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 93, -1, - -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 93, -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, - 125, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, + -1, -1, -1, -1, -1, -1, -1, 125, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 33, -1, -1, -1, -1, - -1, -1, 40, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 59, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 33, -1, -1, -1, -1, -1, -1, 40, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 93, -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 125, -1, -1, + -1, -1, 93, -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 257, 258, 259, 260, -1, -1, 263, -1, - 265, 266, 267, 268, 269, 270, 271, 272, -1, -1, - -1, -1, -1, -1, -1, -1, 281, 282, -1, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, -1, -1, -1, - -1, -1, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, -1, -1, -1, -1, -1, 324, - 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, - -1, -1, 337, 338, 339, 340, -1, -1, 343, 344, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 355, 356, 357, 358, 359, 360, 361, 362, 363, -1, - -1, -1, 367, 368, 369, 370, 371, 372, 373, 257, + -1, -1, -1, -1, 125, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 257, 258, 259, 260, -1, -1, 263, -1, 265, 266, 267, 268, 269, 270, 271, 272, -1, -1, -1, -1, -1, -1, -1, -1, 281, 282, -1, 284, 285, 286, 287, @@ -2621,44 +2675,44 @@ 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, -1, -1, -1, -1, -1, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, -1, -1, 337, - 338, 339, 340, 0, -1, 343, 344, -1, -1, -1, + 338, 339, 340, -1, -1, 343, 344, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 355, 356, 357, 358, 359, 360, 361, 362, 363, -1, -1, -1, 367, - 368, 369, 370, 371, 372, 373, 33, -1, -1, -1, - -1, -1, -1, 40, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 59, -1, -1, -1, -1, -1, -1, -1, + 368, 369, 370, 371, 372, 373, 257, 258, 259, 260, + -1, -1, 263, -1, 265, 266, 267, 268, 269, 270, + 271, 272, -1, -1, -1, -1, -1, -1, -1, -1, + 281, 282, -1, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, -1, -1, -1, -1, -1, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 318, -1, -1, + -1, -1, -1, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, -1, -1, 337, 338, 339, 340, + 0, -1, 343, 344, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 355, 356, 357, 358, 359, 360, + 361, 362, 363, -1, -1, -1, 367, 368, 369, 370, + 371, 372, 373, 33, -1, -1, -1, -1, -1, -1, + 40, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 93, -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 93, -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 0, -1, -1, -1, -1, -1, -1, -1, 125, -1, + -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, + -1, -1, -1, -1, -1, 125, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 33, -1, -1, -1, -1, -1, -1, - 40, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 59, + 33, -1, -1, -1, -1, -1, -1, 40, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 93, -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 93, -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 125, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 257, 258, 259, 260, -1, -1, 263, -1, 265, 266, - 267, 268, 269, 270, 271, 272, -1, -1, -1, -1, - -1, -1, -1, -1, 281, 282, -1, 284, 285, 286, - 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, -1, -1, -1, -1, -1, - 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, - 317, 318, -1, -1, -1, -1, -1, 324, 325, 326, - 327, 328, 329, 330, 331, 332, 333, 334, -1, -1, - 337, 338, 339, 340, -1, -1, 343, 344, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 355, 356, - 357, 358, 359, 360, 361, 362, 363, -1, -1, -1, - 367, 368, 369, 370, 371, 372, 373, 257, 258, 259, + -1, -1, 125, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 257, 258, 259, 260, -1, -1, 263, -1, 265, 266, 267, 268, 269, 270, 271, 272, -1, -1, -1, -1, -1, -1, -1, -1, 281, 282, -1, 284, 285, 286, 287, 288, 289, @@ -2667,499 +2721,465 @@ 310, 311, 312, 313, 314, 315, 316, 317, 318, -1, -1, -1, -1, -1, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, -1, -1, 337, 338, 339, - 340, 0, -1, 343, 344, -1, -1, -1, -1, -1, + 340, -1, -1, 343, 344, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 355, 356, 357, 358, 359, 360, 361, 362, 363, -1, -1, -1, 367, 368, 369, - 370, 371, 372, 373, 33, -1, -1, -1, -1, -1, - -1, 40, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 93, -1, -1, 96, -1, -1, + 370, 371, 372, 373, 257, 258, 259, 260, -1, -1, + 263, -1, 265, 266, 267, 268, 269, 270, 271, 272, + -1, -1, -1, -1, -1, -1, -1, -1, 281, 282, + -1, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 298, 299, 300, 301, -1, + -1, -1, -1, -1, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, -1, -1, -1, -1, + -1, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, -1, -1, 337, 338, 339, 340, 0, -1, + 343, 344, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 355, 356, 357, 358, 359, 360, 361, 362, + 363, -1, -1, -1, 367, 368, 369, 370, 371, 372, + 373, 33, -1, -1, -1, -1, -1, -1, 40, -1, + -1, -1, 44, 45, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, - -1, -1, -1, -1, -1, -1, 125, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 33, -1, -1, -1, -1, -1, -1, 40, -1, + -1, 93, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 59, -1, -1, + -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, + -1, -1, -1, 125, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 33, -1, + -1, -1, -1, -1, -1, 40, 41, -1, 43, 44, + 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 59, -1, -1, 62, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 93, -1, -1, 96, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 93, -1, + -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 125, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 257, 258, - 259, 260, -1, -1, 263, -1, 265, 266, 267, 268, - 269, 270, 271, 272, -1, -1, -1, -1, -1, -1, - -1, -1, 281, 282, -1, 284, 285, 286, 287, 288, - 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, - 299, 300, 301, -1, -1, -1, -1, -1, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, - -1, -1, -1, -1, -1, 324, 325, 326, 327, 328, - 329, 330, 331, 332, 333, 334, -1, -1, 337, 338, - 339, 340, -1, -1, 343, 344, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 355, 356, 357, 358, - 359, 360, 361, 362, 363, -1, -1, -1, 367, 368, - 369, 370, 371, 372, 373, 257, 258, 259, 260, -1, - -1, 263, -1, 265, 266, 267, 268, 269, 270, 271, + 125, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 258, 259, 260, -1, + -1, -1, -1, 265, 266, 267, -1, 269, 270, 271, 272, -1, -1, -1, -1, -1, -1, -1, -1, 281, 282, -1, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, -1, -1, -1, -1, -1, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, -1, -1, -1, -1, -1, 324, 325, 326, 327, 328, 329, 330, 331, - 332, 333, 334, -1, -1, 337, 338, 339, 340, 0, + 332, 333, 334, -1, -1, 337, 338, 339, 340, -1, -1, 343, 344, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 355, 356, 357, 358, 359, 360, 361, 362, 363, -1, -1, -1, 367, 368, 369, 370, 371, - 372, 373, 33, -1, -1, -1, -1, -1, -1, 40, - -1, -1, -1, 44, 45, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 59, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 93, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, - -1, -1, -1, -1, 125, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, - -1, -1, -1, -1, -1, -1, 40, 41, -1, 43, - 44, 45, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 59, -1, -1, 62, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 93, - -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 125, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 258, 259, 260, - -1, -1, -1, -1, 265, 266, 267, -1, 269, 270, - 271, 272, -1, -1, -1, -1, -1, -1, -1, -1, - 281, 282, -1, 284, 285, 286, 287, 288, 289, 290, - 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, - 301, -1, -1, -1, -1, -1, 307, 308, 309, 310, - 311, 312, 313, 314, 315, 316, 317, 318, -1, -1, - -1, -1, -1, 324, 325, 326, 327, 328, 329, 330, - 331, 332, 333, 334, -1, -1, 337, 338, 339, 340, - -1, -1, 343, 344, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 355, 356, 357, 358, 359, 360, - 361, 362, 363, -1, -1, -1, 367, 368, 369, 370, - 371, 372, 373, 257, 258, 259, 260, -1, -1, 263, - -1, 265, 266, 267, 268, 269, 270, 271, 272, -1, - -1, -1, -1, -1, -1, -1, -1, 281, 282, -1, - 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, - 294, 295, 296, 297, 298, 299, 300, 301, 0, -1, - -1, -1, 306, 307, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 319, 320, 321, 322, 323, - 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, - 334, 33, -1, -1, -1, -1, -1, -1, 40, 343, - 344, 43, -1, 45, 46, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 59, -1, -1, - -1, -1, -1, 367, 368, 369, 370, 371, 372, 373, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 372, 373, 257, 258, 259, 260, -1, -1, 263, -1, + 265, 266, 267, 268, 269, 270, 271, 272, -1, -1, + -1, -1, -1, -1, -1, -1, 281, 282, -1, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 0, -1, -1, + -1, 306, 307, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 33, -1, -1, -1, -1, -1, -1, 40, 343, 344, + 43, -1, 45, 46, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 59, -1, -1, -1, + -1, -1, 367, 368, 369, 370, 371, 372, 373, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 93, 0, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 93, 0, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 125, -1, 33, -1, -1, -1, -1, - -1, -1, 40, 41, -1, -1, 44, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 59, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 125, -1, 33, -1, -1, -1, -1, -1, + -1, 40, 41, -1, -1, 44, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 0, -1, -1, -1, 93, -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 0, -1, -1, -1, 93, -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 33, -1, -1, 125, -1, -1, - -1, 40, 41, -1, -1, 44, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 59, 60, -1, 62, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 257, 258, 259, 260, -1, - -1, 263, -1, 265, 266, 267, 268, 269, 270, 271, - 272, -1, -1, -1, 93, -1, -1, 96, -1, 281, - 282, -1, 284, 285, 286, 287, 288, 289, 290, 291, - 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - -1, -1, -1, -1, 0, 307, 125, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 319, 320, 321, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, - 332, 333, 334, -1, -1, -1, -1, 33, -1, -1, - -1, 343, 344, -1, 40, -1, -1, -1, -1, 257, - 258, 259, 260, -1, -1, 263, -1, 265, 266, 267, - 268, 269, 270, 59, -1, 367, 368, 369, 370, 371, - 372, 373, -1, 281, 282, -1, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, - 298, 299, 300, 301, -1, -1, -1, 93, -1, 307, - 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 324, 325, 326, 327, - 328, 329, 330, 331, 332, 333, 334, -1, -1, 125, - -1, -1, -1, -1, -1, 343, 344, -1, 257, 258, - 259, 260, -1, -1, 263, -1, -1, -1, -1, 268, - -1, -1, 271, 272, -1, -1, -1, 0, -1, 367, - 368, 369, 370, 371, 372, 373, -1, -1, -1, -1, + -1, -1, -1, 33, -1, -1, 125, -1, -1, -1, + 40, 41, -1, -1, 44, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 59, + 60, -1, 62, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 257, 258, 259, 260, -1, -1, + 263, -1, 265, 266, 267, 268, 269, 270, 271, 272, + -1, -1, -1, 93, -1, -1, 96, -1, 281, 282, + -1, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 298, 299, 300, 301, -1, + -1, -1, -1, 0, 307, 125, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, -1, -1, -1, -1, 33, -1, -1, -1, + 343, 344, -1, 40, -1, -1, -1, -1, 257, 258, + 259, 260, -1, -1, 263, -1, 265, 266, 267, 268, + 269, 270, 59, -1, 367, 368, 369, 370, 371, 372, + 373, -1, 281, 282, -1, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, -1, -1, -1, 93, -1, 307, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, -1, -1, -1, -1, -1, 324, 325, 326, 327, 328, - 329, 330, 331, 332, 333, 334, 59, -1, 337, 338, - 339, 340, -1, -1, -1, -1, -1, -1, -1, -1, - 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, - 359, 360, 361, 362, 363, -1, -1, -1, -1, -1, - 93, -1, -1, -1, 373, -1, -1, -1, -1, -1, - -1, 257, 258, 259, 260, -1, -1, 263, -1, -1, - -1, -1, 268, -1, -1, 271, 272, -1, -1, -1, - -1, -1, 125, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 307, 308, 309, 310, 311, 312, 313, 314, 315, - 316, 317, 318, -1, -1, -1, -1, -1, 324, 325, - 326, 327, 328, 329, 330, 331, 332, 333, 334, 0, - -1, 337, 338, 339, 340, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 355, - 356, 357, 358, 359, 360, 361, 362, 363, -1, -1, - -1, -1, 33, -1, -1, -1, -1, 373, -1, 40, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 59, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 260, -1, -1, - -1, -1, 265, 266, 267, -1, 269, 270, 271, 272, - -1, -1, 93, -1, -1, 96, -1, -1, 281, 282, - -1, 284, 285, 286, 287, 288, 289, 290, 291, 292, - 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, - 0, -1, -1, -1, 125, -1, -1, -1, -1, -1, + 329, 330, 331, 332, 333, 334, -1, -1, 125, -1, + -1, -1, -1, -1, 343, 344, -1, 257, 258, 259, + 260, -1, -1, 263, -1, -1, -1, -1, 268, -1, + -1, 271, 272, -1, -1, -1, 0, -1, 367, 368, + 369, 370, 371, 372, 373, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 318, -1, + -1, -1, -1, -1, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 59, -1, 337, 338, 339, + 340, -1, -1, -1, -1, -1, -1, -1, -1, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, -1, -1, -1, -1, -1, 93, + -1, -1, -1, 373, -1, -1, -1, -1, -1, -1, + 257, 258, 259, 260, -1, -1, 263, -1, -1, -1, + -1, 268, -1, -1, 271, 272, -1, -1, -1, -1, + -1, 125, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 343, 344, -1, -1, -1, -1, -1, 0, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 59, - -1, -1, -1, -1, 367, 368, 369, 370, 371, 372, - 373, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 37, -1, -1, -1, 41, 42, - 43, 44, 45, 93, 47, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 59, 60, -1, 62, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, -1, -1, -1, -1, -1, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 0, -1, + 337, 338, 339, 340, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 355, 356, + 357, 358, 359, 360, 361, 362, 363, -1, -1, -1, + -1, 33, -1, -1, -1, -1, 373, -1, 40, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 0, -1, -1, -1, 125, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 257, 258, 259, 260, - 93, -1, 263, -1, -1, -1, -1, 268, -1, -1, - 271, 272, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 125, -1, -1, -1, -1, -1, -1, -1, - 59, -1, -1, -1, -1, 0, 307, 308, 309, 310, - 311, 312, 313, 314, 315, 316, 317, 318, -1, -1, - -1, -1, -1, 324, 325, 326, 327, 328, 329, 330, - 331, 332, 333, 334, 93, -1, 337, 338, 339, 340, + -1, -1, -1, -1, -1, -1, 260, -1, -1, -1, + -1, 265, 266, 267, -1, 269, 270, 271, 272, -1, + -1, 93, -1, -1, 96, -1, -1, 281, 282, -1, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 0, + -1, -1, -1, 125, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 355, 356, 357, 358, 359, 360, - 361, 362, 363, -1, 59, -1, 125, -1, -1, 0, - -1, -1, 373, -1, -1, -1, -1, -1, -1, -1, - 260, -1, -1, -1, -1, 265, 266, 267, -1, 269, - 270, 271, 272, -1, -1, -1, -1, -1, 93, -1, - -1, 281, 282, -1, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, -1, -1, -1, -1, -1, 59, -1, - 125, 264, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 291, -1, - -1, -1, 93, 343, 344, -1, -1, -1, -1, 302, - -1, -1, 305, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 367, 368, 369, - 370, 371, 372, 373, 125, 0, -1, -1, -1, -1, - -1, 260, -1, -1, -1, -1, 265, 266, 267, -1, - 269, 270, 271, 272, -1, -1, 349, 350, 351, 352, - 353, 354, 281, 282, -1, 284, 285, 286, 287, 288, - 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, - 299, 300, 301, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 59, -1, -1, -1, -1, 0, - -1, -1, -1, -1, -1, 260, -1, -1, -1, -1, - 265, 266, 267, -1, 269, 270, 271, 272, -1, -1, - -1, -1, -1, -1, 343, 344, 281, 282, 93, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, -1, 367, 368, - 369, 370, 371, 372, 373, -1, -1, -1, 59, -1, - 125, -1, -1, 0, -1, -1, -1, -1, -1, 260, - -1, -1, -1, -1, 265, 266, 267, -1, 269, 270, - 271, 272, -1, -1, -1, -1, -1, -1, 343, 344, - 281, 282, 93, 284, 285, 286, 287, 288, 289, 290, - 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, - 301, -1, 367, 368, 369, 370, 371, 372, 373, -1, - -1, -1, 59, -1, 125, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 343, + 344, -1, -1, -1, -1, -1, 0, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 59, -1, + -1, -1, -1, 367, 368, 369, 370, 371, 372, 373, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 37, -1, -1, -1, 41, 42, 43, + 44, 45, 93, 47, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 59, 60, -1, 62, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 343, 344, -1, -1, 93, -1, -1, -1, + 0, -1, -1, -1, 125, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 257, 258, 259, 260, 93, + -1, 263, -1, -1, -1, -1, 268, -1, -1, 271, + 272, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 367, 368, 369, 370, - 371, 372, 373, -1, -1, -1, -1, -1, 125, -1, - -1, -1, -1, -1, -1, 260, -1, -1, -1, -1, - 265, 266, 267, -1, 269, 270, 271, 272, -1, -1, - -1, -1, -1, -1, -1, -1, 281, 282, -1, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, -1, -1, -1, + -1, 125, -1, -1, -1, -1, -1, -1, -1, 59, + -1, -1, -1, -1, 0, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, -1, -1, -1, + -1, -1, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 93, -1, 337, 338, 339, 340, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 260, + -1, -1, -1, 355, 356, 357, 358, 359, 360, 361, + 362, 363, -1, 59, -1, 125, -1, -1, 0, -1, + -1, 373, -1, -1, -1, -1, -1, -1, -1, 260, -1, -1, -1, -1, 265, 266, 267, -1, 269, 270, - 271, 272, -1, -1, -1, -1, -1, -1, 343, 344, + 271, 272, -1, -1, -1, -1, -1, 93, -1, -1, 281, 282, -1, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, - 301, -1, 367, 368, 369, 370, 371, 372, 373, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 260, -1, -1, -1, -1, 265, 266, - 267, -1, 269, 270, 271, 272, -1, -1, -1, -1, - -1, -1, 343, 344, 281, 282, 0, 284, 285, 286, - 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, -1, 367, 368, 369, 370, - 371, 372, 373, -1, -1, -1, -1, -1, -1, 33, - -1, -1, -1, -1, -1, -1, 40, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 59, 343, 344, -1, -1, - -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 367, 368, 369, 370, 371, 372, 373, -1, -1, 93, - -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 43, - -1, 45, 46, -1, -1, -1, -1, -1, -1, -1, - -1, 125, -1, -1, -1, 59, -1, -1, -1, -1, + 301, 302, -1, -1, -1, -1, -1, 59, -1, 125, + 264, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 291, -1, -1, + -1, 93, 343, 344, -1, -1, -1, -1, 302, -1, + -1, 305, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 367, 368, 369, 370, + 371, 372, 373, 125, 0, -1, -1, -1, -1, -1, + 260, -1, -1, -1, -1, 265, 266, 267, -1, 269, + 270, 271, 272, -1, -1, 349, 350, 351, 352, 353, + 354, 281, 282, -1, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 59, -1, -1, -1, -1, 0, -1, + -1, -1, -1, -1, 260, -1, -1, -1, -1, 265, + 266, 267, -1, 269, 270, 271, 272, -1, -1, -1, + -1, -1, -1, 343, 344, 281, 282, 93, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, -1, 367, 368, 369, + 370, 371, 372, 373, -1, -1, -1, 59, -1, 125, + -1, -1, 0, -1, -1, -1, -1, -1, 260, -1, + -1, -1, -1, 265, 266, 267, -1, 269, 270, 271, + 272, -1, -1, -1, -1, -1, -1, 343, 344, 281, + 282, 93, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + -1, 367, 368, 369, 370, 371, 372, 373, -1, -1, + -1, 59, -1, 125, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 93, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 343, 344, -1, -1, 93, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 367, 368, 369, 370, 371, + 372, 373, -1, -1, -1, -1, -1, 125, -1, -1, + -1, -1, -1, -1, 260, -1, -1, -1, -1, 265, + 266, 267, -1, 269, 270, 271, 272, -1, -1, -1, + -1, -1, -1, -1, -1, 281, 282, -1, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 125, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 260, -1, + -1, -1, -1, 265, 266, 267, -1, 269, 270, 271, + 272, -1, -1, -1, -1, -1, -1, 343, 344, 281, + 282, -1, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + -1, 367, 368, 369, 370, 371, 372, 373, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 33, -1, -1, -1, -1, -1, -1, 40, -1, - -1, -1, -1, 45, -1, -1, -1, -1, -1, -1, + -1, -1, 260, -1, -1, -1, -1, 265, 266, 267, + -1, 269, 270, 271, 272, -1, -1, -1, -1, -1, + -1, 343, 344, 281, 282, 0, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, -1, 367, 368, 369, 370, 371, + 372, 373, -1, -1, -1, -1, -1, -1, 33, -1, + -1, -1, -1, -1, -1, 40, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 59, 343, 344, -1, -1, -1, + -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 367, + 368, 369, 370, 371, 372, 373, -1, -1, 93, -1, + -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 43, -1, + 45, 46, -1, -1, -1, -1, -1, -1, -1, -1, + 125, -1, -1, -1, 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 257, 258, 259, -1, -1, -1, 263, - -1, 265, 266, 267, 268, 269, 270, 271, 272, 91, - -1, -1, -1, -1, 96, -1, -1, 281, 282, -1, - 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, - 294, 295, 296, 297, 298, 299, 300, 301, -1, -1, - -1, 123, -1, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, -1, -1, -1, -1, -1, - 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, - 334, -1, -1, 337, 338, 339, 340, 271, 272, 343, - 344, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 355, 356, 357, 358, 359, 360, 361, 362, 363, - -1, -1, -1, 367, 368, 369, 370, 371, 372, -1, - -1, -1, -1, -1, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 337, 338, 339, 340, 33, -1, -1, - -1, -1, -1, -1, 40, -1, -1, -1, -1, 45, - -1, 355, 356, 357, 358, 359, 360, 361, 362, 363, - -1, -1, -1, -1, -1, 257, 258, 259, 260, 261, - -1, 263, -1, -1, -1, -1, 268, 269, 270, 271, - 272, 273, 274, 275, 276, 277, 278, 279, 280, -1, - -1, 283, -1, -1, -1, 91, -1, -1, -1, -1, - 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, 317, 318, 123, -1, -1, - -1, -1, 324, 325, 326, 327, 328, 329, 330, 331, - 332, 333, 334, 335, -1, 337, 338, 339, 340, 341, - 342, -1, -1, 345, -1, 347, -1, -1, -1, -1, - -1, -1, -1, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 33, 366, -1, -1, -1, -1, -1, - 40, 373, 374, -1, -1, 45, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 93, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 125, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 96, -1, -1, -1, + 33, -1, -1, -1, -1, -1, -1, 40, -1, -1, + -1, -1, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 257, 258, 259, 260, 261, -1, 263, -1, -1, - -1, -1, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, -1, -1, 283, -1, -1, - 33, -1, -1, -1, -1, -1, -1, 40, 41, -1, - -1, -1, 45, -1, -1, -1, -1, -1, -1, -1, - -1, 307, 308, 309, 310, 311, 312, 313, 314, 315, - 316, 317, 318, -1, -1, -1, -1, -1, 324, 325, - 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, - -1, 337, 338, 339, 340, 341, 342, -1, -1, 345, - -1, 347, -1, 96, -1, -1, -1, -1, -1, 355, - 356, 357, 358, 359, 360, 361, 362, 363, 364, -1, - 366, -1, -1, -1, -1, -1, -1, 373, 374, -1, + -1, -1, 257, 258, 259, -1, -1, -1, 263, -1, + 265, 266, 267, 268, 269, 270, 271, 272, 91, -1, + -1, -1, -1, 96, -1, -1, 281, 282, -1, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, -1, -1, -1, + 123, -1, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, -1, -1, -1, -1, -1, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + -1, -1, 337, 338, 339, 340, 271, 272, 343, 344, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 257, 258, 259, - 260, -1, -1, 263, -1, 265, 266, 267, 268, 269, - 270, 271, 272, -1, -1, -1, -1, -1, -1, -1, - -1, 281, 282, -1, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, -1, -1, -1, -1, -1, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, -1, - -1, -1, -1, -1, 324, 325, 326, 327, 328, 329, - 330, 331, 332, 333, 334, 33, -1, 337, 338, 339, - 340, -1, 40, 343, 344, -1, -1, 45, 46, -1, - -1, -1, -1, -1, -1, 355, 356, 357, 358, 359, - 360, 361, 362, 363, -1, -1, -1, 367, 368, 369, - 370, 371, 372, 373, 257, 258, 259, 260, -1, -1, - 263, -1, -1, -1, -1, 268, -1, -1, 271, 272, - -1, -1, -1, -1, -1, -1, -1, -1, 96, -1, + 355, 356, 357, 358, 359, 360, 361, 362, 363, -1, + -1, -1, 367, 368, 369, 370, 371, 372, -1, -1, + -1, -1, -1, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 337, 338, 339, 340, 33, -1, -1, -1, + -1, -1, -1, 40, -1, -1, -1, -1, 45, -1, + 355, 356, 357, 358, 359, 360, 361, 362, 363, -1, + -1, -1, -1, -1, 257, 258, 259, 260, 261, -1, + 263, -1, -1, -1, -1, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, -1, -1, + 283, -1, -1, -1, 91, -1, -1, -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 307, 308, 309, 310, 311, 312, - 313, 314, 315, 316, 317, 318, -1, -1, -1, -1, + 313, 314, 315, 316, 317, 318, 123, -1, -1, -1, -1, 324, 325, 326, 327, 328, 329, 330, 331, 332, - 333, 334, 33, -1, 337, 338, 339, 340, -1, 40, - -1, -1, -1, -1, 45, -1, -1, -1, -1, -1, + 333, 334, 335, -1, 337, 338, 339, 340, 341, 342, + -1, -1, 345, -1, 347, -1, -1, -1, -1, -1, -1, -1, 355, 356, 357, 358, 359, 360, 361, 362, - 363, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 373, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 363, 364, 33, 366, -1, -1, -1, -1, -1, 40, + 373, 374, -1, -1, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 257, - 258, 259, 260, -1, -1, 263, -1, -1, -1, -1, - 268, -1, -1, 271, 272, 33, -1, -1, -1, -1, - -1, -1, 40, -1, -1, -1, -1, 45, -1, -1, + -1, -1, -1, -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 307, - 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, - 318, -1, -1, -1, -1, -1, 324, 325, 326, 327, - 328, 329, 330, 331, 332, 333, 334, -1, 96, 337, - 338, 339, 340, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 355, 356, 357, - 358, 359, 360, 361, 362, 363, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 373, 257, 258, 259, 260, - -1, -1, 263, -1, -1, -1, -1, 268, -1, -1, - 271, 272, 33, -1, -1, -1, -1, -1, -1, 40, - -1, -1, -1, -1, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 307, 308, 309, 310, + 257, 258, 259, 260, 261, -1, 263, -1, -1, -1, + -1, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, -1, -1, 283, -1, -1, 33, + -1, -1, -1, -1, -1, -1, 40, 41, -1, -1, + -1, 45, -1, -1, -1, -1, -1, -1, -1, -1, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, -1, -1, -1, -1, -1, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, -1, + 337, 338, 339, 340, 341, 342, -1, -1, 345, -1, + 347, -1, 96, -1, -1, -1, -1, -1, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, -1, 366, + -1, -1, -1, -1, -1, -1, 373, 374, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 257, 258, 259, 260, + -1, -1, 263, -1, 265, 266, 267, 268, 269, 270, + 271, 272, -1, -1, -1, -1, -1, -1, -1, -1, + 281, 282, -1, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, -1, -1, -1, -1, -1, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, -1, -1, -1, -1, -1, 324, 325, 326, 327, 328, 329, 330, - 331, 332, 333, 334, -1, 96, 337, 338, 339, 340, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 331, 332, 333, 334, 33, -1, 337, 338, 339, 340, + -1, 40, 343, 344, -1, -1, 45, 46, -1, -1, -1, -1, -1, -1, 355, 356, 357, 358, 359, 360, - 361, 362, 363, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 373, -1, -1, -1, -1, -1, -1, 257, - 258, 259, 260, -1, -1, 263, -1, -1, -1, -1, - 268, -1, -1, 271, 272, 33, -1, -1, -1, -1, - -1, -1, 40, -1, -1, -1, -1, 45, -1, -1, + 361, 362, 363, -1, -1, -1, 367, 368, 369, 370, + 371, 372, 373, 257, 258, 259, 260, -1, -1, 263, + -1, -1, -1, -1, 268, -1, -1, 271, 272, -1, + -1, -1, -1, -1, -1, -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 307, - 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, - 318, -1, -1, -1, -1, -1, 324, 325, 326, 327, - 328, 329, 330, 331, 332, 333, 334, -1, 96, 337, - 338, 339, 340, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 355, 356, 357, - 358, 359, 360, 361, 362, 363, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 373, 257, 258, 259, 260, - -1, -1, 263, -1, -1, -1, -1, 268, -1, -1, - 271, 272, 33, -1, -1, -1, -1, -1, -1, 40, - -1, -1, -1, -1, 45, 46, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 307, 308, 309, 310, - 311, 312, 313, 314, 315, 316, 317, 318, -1, -1, - -1, -1, -1, 324, 325, 326, 327, 328, 329, 330, - 331, 332, 333, 334, -1, 96, 337, 338, 339, 340, + -1, -1, -1, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, -1, -1, -1, -1, -1, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 33, -1, 337, 338, 339, 340, -1, 40, -1, + -1, -1, -1, 45, -1, -1, -1, -1, -1, -1, + -1, 355, 356, 357, 358, 359, 360, 361, 362, 363, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 373, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 355, 356, 357, 358, 359, 360, - 361, 362, 363, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 373, -1, -1, -1, -1, -1, -1, 257, - 258, 259, 260, -1, -1, 263, -1, -1, -1, -1, - 268, -1, -1, 271, 272, 33, -1, -1, -1, -1, - -1, -1, 40, -1, 42, -1, -1, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 307, - 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, - 318, -1, -1, -1, -1, -1, 324, 325, 326, 327, - 328, 329, 330, 331, 332, 333, 334, -1, 96, 337, - 338, 339, 340, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 355, 356, 357, - 358, 359, 360, 361, 362, 363, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 373, 257, 258, 259, -1, - -1, -1, 263, -1, -1, -1, -1, 268, -1, -1, - 271, 272, 33, -1, -1, -1, -1, -1, -1, 40, - -1, -1, -1, -1, 45, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 307, 308, 309, 310, - 311, 312, 313, 314, 315, 316, 317, 318, -1, -1, - -1, -1, -1, 324, 325, 326, 327, 328, 329, 330, - 331, 332, 333, 334, -1, 96, 337, 338, 339, 340, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 355, 356, 357, 358, 359, 360, - 361, 362, 363, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 257, - 258, 259, -1, -1, -1, 263, -1, -1, -1, -1, - 268, -1, -1, 271, 272, 33, -1, -1, -1, -1, - -1, -1, 40, -1, -1, -1, -1, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 307, - 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, - 318, -1, -1, -1, -1, -1, 324, 325, 326, 327, - 328, 329, 330, 331, 332, 333, 334, -1, 96, 337, - 338, 339, 340, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 355, 356, 357, - 358, 359, 360, 361, 362, 363, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 257, 258, 259, -1, - -1, -1, 263, -1, -1, -1, -1, 268, -1, -1, - 271, 272, 33, -1, -1, -1, -1, -1, -1, 40, - -1, -1, -1, -1, 45, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 257, 258, + 259, 260, -1, -1, 263, -1, -1, -1, -1, 268, + -1, -1, 271, 272, 33, -1, -1, -1, -1, -1, + -1, 40, -1, -1, -1, -1, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 307, 308, 309, 310, - 311, 312, 313, 314, 315, 316, 317, 318, -1, -1, - -1, -1, -1, 324, 325, 326, 327, 328, 329, 330, - 331, 332, 333, 334, -1, 96, 337, 338, 339, 340, + -1, -1, -1, -1, -1, -1, -1, -1, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + -1, -1, -1, -1, -1, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, -1, 96, 337, 338, + 339, 340, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 355, 356, 357, 358, + 359, 360, 361, 362, 363, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 373, 257, 258, 259, 260, -1, + -1, 263, -1, -1, -1, -1, 268, -1, -1, 271, + 272, 33, -1, -1, -1, -1, -1, -1, 40, -1, + -1, -1, -1, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 355, 356, 357, 358, 359, 360, - 361, 362, 363, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 257, - 258, 259, -1, -1, -1, 263, -1, -1, -1, -1, - 268, -1, -1, 271, 272, 33, -1, -1, -1, -1, - -1, -1, 40, -1, -1, -1, -1, 45, -1, -1, + -1, -1, -1, -1, -1, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, -1, -1, -1, + -1, -1, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, -1, 96, 337, 338, 339, 340, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 307, - 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, - 318, -1, -1, -1, -1, -1, 324, 325, 326, 327, - 328, 329, 330, 331, 332, 333, 334, -1, 96, 337, - 338, 339, 340, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 355, 356, 357, - 358, 359, 360, 361, 362, 363, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 257, 258, 259, -1, - -1, -1, 263, -1, -1, -1, -1, 268, -1, -1, - 271, 272, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 59, -1, + -1, -1, -1, 355, 356, 357, 358, 359, 360, 361, + 362, 363, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 373, -1, -1, -1, -1, -1, -1, 257, 258, + 259, 260, -1, -1, 263, -1, -1, -1, -1, 268, + -1, -1, 271, 272, 33, -1, -1, -1, -1, -1, + -1, 40, -1, -1, -1, -1, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 307, 308, 309, 310, - 311, 312, 313, 314, 315, 316, 317, 318, -1, -1, - 91, -1, -1, 324, 325, 326, 327, 328, 329, 330, - 331, 332, 333, 334, -1, -1, 337, 338, 339, 340, + -1, -1, -1, -1, -1, -1, -1, -1, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + -1, -1, -1, -1, -1, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, -1, 96, 337, 338, + 339, 340, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 355, 356, 357, 358, + 359, 360, 361, 362, 363, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 373, 257, 258, 259, 260, -1, + -1, 263, -1, -1, -1, -1, 268, -1, -1, 271, + 272, 33, -1, -1, -1, -1, -1, -1, 40, -1, + -1, -1, -1, 45, 46, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 123, -1, 355, 356, 357, 358, 359, 360, - 361, 362, 363, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 257, - 258, 259, -1, -1, -1, 263, -1, -1, -1, -1, - 268, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, -1, -1, -1, + -1, -1, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, -1, 96, 337, 338, 339, 340, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 355, 356, 357, 358, 359, 360, 361, + 362, 363, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 373, -1, -1, -1, -1, -1, -1, 257, 258, + 259, 260, -1, -1, 263, -1, -1, -1, -1, 268, + -1, -1, 271, 272, 33, -1, -1, -1, -1, -1, + -1, 40, -1, 42, -1, -1, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 307, - 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, - 318, -1, -1, -1, -1, -1, 324, 325, 326, 327, - 328, 329, 330, 331, 332, 333, 334, -1, -1, 337, - 338, 339, 340, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 355, 356, 357, - 358, 359, 360, 361, 362, 363, 257, 258, -1, 260, - 261, -1, -1, -1, -1, -1, -1, -1, 269, 270, - 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, - -1, -1, 283, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + -1, -1, -1, -1, -1, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, -1, 96, 337, 338, + 339, 340, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 355, 356, 357, 358, + 359, 360, 361, 362, 363, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 373, 257, 258, 259, -1, -1, + -1, 263, -1, -1, -1, -1, 268, -1, -1, 271, + 272, 33, -1, -1, -1, -1, -1, -1, 40, -1, + -1, -1, -1, 45, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, -1, -1, -1, + -1, -1, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, -1, 96, 337, 338, 339, 340, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 355, 356, 357, 358, 359, 360, 361, + 362, 363, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 257, 258, + 259, -1, -1, -1, 263, -1, -1, -1, -1, 268, + -1, -1, 271, 272, 33, -1, -1, -1, -1, -1, + -1, 40, -1, -1, -1, -1, 45, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + -1, -1, -1, -1, -1, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, -1, 96, 337, 338, + 339, 340, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 355, 356, 357, 358, + 359, 360, 361, 362, 363, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 257, 258, 259, -1, -1, + -1, 263, -1, -1, -1, -1, 268, -1, -1, 271, + 272, 33, -1, -1, -1, -1, -1, -1, 40, -1, + -1, -1, -1, 45, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, -1, -1, -1, + -1, -1, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, -1, 96, 337, 338, 339, 340, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 355, 356, 357, 358, 359, 360, 361, + 362, 363, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 257, 258, + 259, -1, -1, -1, 263, -1, -1, -1, -1, 268, + -1, -1, 271, 272, 33, -1, -1, -1, -1, -1, + -1, 40, -1, -1, -1, -1, 45, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + -1, -1, -1, -1, -1, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, -1, 96, 337, 338, + 339, 340, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 355, 356, 357, 358, + 359, 360, 361, 362, 363, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 257, 258, 259, -1, -1, + -1, 263, -1, -1, -1, -1, 268, -1, -1, 271, + 272, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 59, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, -1, -1, 91, + -1, -1, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, -1, -1, 337, 338, 339, 340, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 123, -1, 355, 356, 357, 358, 359, 360, 361, + 362, 363, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 257, 258, + 259, -1, -1, -1, 263, -1, -1, -1, -1, 268, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + -1, -1, -1, -1, -1, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, -1, -1, 337, 338, + 339, 340, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 257, 258, -1, 260, 261, + -1, -1, -1, -1, -1, -1, -1, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, -1, + -1, 283, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 335, -1, -1, -1, -1, -1, - 341, 342, -1, -1, 345, -1, 347, -1, -1, -1, + -1, -1, -1, 335, -1, -1, -1, -1, -1, 341, + 342, -1, -1, 345, -1, 347, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 364, -1, 366, -1, -1, -1, -1, - -1, -1, 373, 374, + -1, -1, 364, -1, 366, -1, -1, -1, -1, -1, + -1, 373, 374, }; #define YYFINAL 2 #ifndef YYDEBUG @@ -3331,12 +3351,17 @@ "sprintf_args : sprintf_args ',' expr", "position : position_not_place", "position : place", +"position : '(' place ')'", "position_not_place : expr_pair", "position_not_place : position '+' expr_pair", +"position_not_place : '(' position '+' expr_pair ')'", "position_not_place : position '-' expr_pair", +"position_not_place : '(' position '-' expr_pair ')'", "position_not_place : '(' position ',' position ')'", "position_not_place : expr between position AND position", +"position_not_place : '(' expr between position AND position ')'", "position_not_place : expr '<' position ',' position '>'", +"position_not_place : '(' expr '<' position ',' position '>' ')'", "between : BETWEEN", "between : OF THE WAY BETWEEN", "expr_pair : expr ',' expr", @@ -3467,7 +3492,7 @@ short yyss[YYSTACKSIZE]; YYSTYPE yyvs[YYSTACKSIZE]; #define yystacksize YYSTACKSIZE -#line 1617 "pic.y" +#line 1643 "pic.y" /* bison defines const to be empty unless __STDC__ is defined, which it isn't under cfront */ @@ -3724,7 +3749,7 @@ result += '\0'; return strsave(result.contents()); } -#line 3728 "y.tab.c" +#line 3753 "y.tab.c" #define YYABORT goto yyabort #define YYREJECT goto yyabort #define YYACCEPT goto yyaccept @@ -4921,93 +4946,129 @@ } break; case 139: -#line 1142 "pic.y" -{ yyval.pair = yyvsp[0].pair; } +#line 1139 "pic.y" +{ + position pos = yyvsp[-1].pl; + yyval.pair.x = pos.x; + yyval.pair.y = pos.y; + } break; case 140: -#line 1144 "pic.y" +#line 1148 "pic.y" +{ yyval.pair = yyvsp[0].pair; } +break; +case 141: +#line 1150 "pic.y" { yyval.pair.x = yyvsp[-2].pair.x + yyvsp[0].pair.x; yyval.pair.y = yyvsp[-2].pair.y + yyvsp[0].pair.y; } break; -case 141: -#line 1149 "pic.y" +case 142: +#line 1155 "pic.y" +{ + yyval.pair.x = yyvsp[-3].pair.x + yyvsp[-1].pair.x; + yyval.pair.y = yyvsp[-3].pair.y + yyvsp[-1].pair.y; + } +break; +case 143: +#line 1160 "pic.y" { yyval.pair.x = yyvsp[-2].pair.x - yyvsp[0].pair.x; yyval.pair.y = yyvsp[-2].pair.y - yyvsp[0].pair.y; } break; -case 142: -#line 1154 "pic.y" +case 144: +#line 1165 "pic.y" +{ + yyval.pair.x = yyvsp[-3].pair.x - yyvsp[-1].pair.x; + yyval.pair.y = yyvsp[-3].pair.y - yyvsp[-1].pair.y; + } +break; +case 145: +#line 1170 "pic.y" { yyval.pair.x = yyvsp[-3].pair.x; yyval.pair.y = yyvsp[-1].pair.y; } break; -case 143: -#line 1159 "pic.y" +case 146: +#line 1175 "pic.y" { yyval.pair.x = (1.0 - yyvsp[-4].x)*yyvsp[-2].pair.x + yyvsp[-4].x*yyvsp[0].pair.x; yyval.pair.y = (1.0 - yyvsp[-4].x)*yyvsp[-2].pair.y + yyvsp[-4].x*yyvsp[0].pair.y; } break; -case 144: -#line 1164 "pic.y" +case 147: +#line 1180 "pic.y" { yyval.pair.x = (1.0 - yyvsp[-5].x)*yyvsp[-3].pair.x + yyvsp[-5].x*yyvsp[-1].pair.x; yyval.pair.y = (1.0 - yyvsp[-5].x)*yyvsp[-3].pair.y + yyvsp[-5].x*yyvsp[-1].pair.y; } break; -case 147: -#line 1177 "pic.y" +case 148: +#line 1185 "pic.y" +{ + yyval.pair.x = (1.0 - yyvsp[-5].x)*yyvsp[-3].pair.x + yyvsp[-5].x*yyvsp[-1].pair.x; + yyval.pair.y = (1.0 - yyvsp[-5].x)*yyvsp[-3].pair.y + yyvsp[-5].x*yyvsp[-1].pair.y; + } +break; +case 149: +#line 1190 "pic.y" +{ + yyval.pair.x = (1.0 - yyvsp[-6].x)*yyvsp[-4].pair.x + yyvsp[-6].x*yyvsp[-2].pair.x; + yyval.pair.y = (1.0 - yyvsp[-6].x)*yyvsp[-4].pair.y + yyvsp[-6].x*yyvsp[-2].pair.y; + } +break; +case 152: +#line 1203 "pic.y" { yyval.pair.x = yyvsp[-2].x; yyval.pair.y = yyvsp[0].x; } break; -case 148: -#line 1182 "pic.y" +case 153: +#line 1208 "pic.y" { yyval.pair = yyvsp[-1].pair; } break; -case 149: -#line 1188 "pic.y" +case 154: +#line 1214 "pic.y" { yyval.pl = yyvsp[0].pl; } break; -case 150: -#line 1190 "pic.y" +case 155: +#line 1216 "pic.y" { path pth(yyvsp[0].crn); if (!pth.follow(yyvsp[-1].pl, & yyval.pl)) YYABORT; } break; -case 151: -#line 1196 "pic.y" +case 156: +#line 1222 "pic.y" { path pth(yyvsp[-1].crn); if (!pth.follow(yyvsp[0].pl, & yyval.pl)) YYABORT; } break; -case 152: -#line 1202 "pic.y" +case 157: +#line 1228 "pic.y" { path pth(yyvsp[-2].crn); if (!pth.follow(yyvsp[0].pl, & yyval.pl)) YYABORT; } break; -case 153: -#line 1208 "pic.y" +case 158: +#line 1234 "pic.y" { yyval.pl.x = current_position.x; yyval.pl.y = current_position.y; yyval.pl.obj = 0; } break; -case 154: -#line 1217 "pic.y" +case 159: +#line 1243 "pic.y" { place *p = lookup_label(yyvsp[0].str); if (!p) { @@ -5018,39 +5079,39 @@ a_delete yyvsp[0].str; } break; -case 155: -#line 1227 "pic.y" +case 160: +#line 1253 "pic.y" { yyval.pl.obj = yyvsp[0].obj; } break; -case 156: -#line 1229 "pic.y" +case 161: +#line 1255 "pic.y" { path pth(yyvsp[0].str); if (!pth.follow(yyvsp[-2].pl, & yyval.pl)) YYABORT; } break; -case 157: -#line 1238 "pic.y" +case 162: +#line 1264 "pic.y" { yyval.n = yyvsp[0].n; } break; -case 158: -#line 1240 "pic.y" +case 163: +#line 1266 "pic.y" { /* XXX Check for overflow (and non-integers?).*/ yyval.n = (int)yyvsp[-1].x; } break; -case 159: -#line 1248 "pic.y" +case 164: +#line 1274 "pic.y" { yyval.n = 1; } break; -case 160: -#line 1250 "pic.y" +case 165: +#line 1276 "pic.y" { yyval.n = yyvsp[-1].n; } break; -case 161: -#line 1255 "pic.y" +case 166: +#line 1281 "pic.y" { int count = 0; object *p; @@ -5066,8 +5127,8 @@ } } break; -case 162: -#line 1270 "pic.y" +case 167: +#line 1296 "pic.y" { int count = 0; object *p; @@ -5083,241 +5144,241 @@ } } break; -case 163: -#line 1288 "pic.y" +case 168: +#line 1314 "pic.y" { yyval.obtype = BOX_OBJECT; } break; -case 164: -#line 1290 "pic.y" +case 169: +#line 1316 "pic.y" { yyval.obtype = CIRCLE_OBJECT; } break; -case 165: -#line 1292 "pic.y" +case 170: +#line 1318 "pic.y" { yyval.obtype = ELLIPSE_OBJECT; } break; -case 166: -#line 1294 "pic.y" +case 171: +#line 1320 "pic.y" { yyval.obtype = ARC_OBJECT; } break; -case 167: -#line 1296 "pic.y" +case 172: +#line 1322 "pic.y" { yyval.obtype = LINE_OBJECT; } break; -case 168: -#line 1298 "pic.y" +case 173: +#line 1324 "pic.y" { yyval.obtype = ARROW_OBJECT; } break; -case 169: -#line 1300 "pic.y" +case 174: +#line 1326 "pic.y" { yyval.obtype = SPLINE_OBJECT; } break; -case 170: -#line 1302 "pic.y" +case 175: +#line 1328 "pic.y" { yyval.obtype = BLOCK_OBJECT; } break; -case 171: -#line 1304 "pic.y" +case 176: +#line 1330 "pic.y" { yyval.obtype = TEXT_OBJECT; } break; -case 172: -#line 1309 "pic.y" +case 177: +#line 1335 "pic.y" { yyval.pth = new path(yyvsp[0].str); } break; -case 173: -#line 1311 "pic.y" +case 178: +#line 1337 "pic.y" { yyval.pth = yyvsp[-2].pth; yyval.pth->append(yyvsp[0].str); } break; -case 174: -#line 1319 "pic.y" +case 179: +#line 1345 "pic.y" { yyval.pth = new path(yyvsp[0].crn); } break; -case 175: -#line 1323 "pic.y" +case 180: +#line 1349 "pic.y" { yyval.pth = yyvsp[0].pth; } break; -case 176: -#line 1325 "pic.y" +case 181: +#line 1351 "pic.y" { yyval.pth = yyvsp[-1].pth; yyval.pth->append(yyvsp[0].crn); } break; -case 177: -#line 1333 "pic.y" +case 182: +#line 1359 "pic.y" { yyval.pth = yyvsp[0].pth; } break; -case 178: -#line 1335 "pic.y" +case 183: +#line 1361 "pic.y" { yyval.pth = yyvsp[-3].pth; yyval.pth->set_ypath(yyvsp[-1].pth); } break; -case 179: -#line 1341 "pic.y" +case 184: +#line 1367 "pic.y" { lex_warning("`%1%2 last %3' in `with' argument ignored", yyvsp[-3].n, ordinal_postfix(yyvsp[-3].n), object_type_name(yyvsp[-1].obtype)); yyval.pth = yyvsp[0].pth; } break; -case 180: -#line 1347 "pic.y" +case 185: +#line 1373 "pic.y" { lex_warning("`last %1' in `with' argument ignored", object_type_name(yyvsp[-1].obtype)); yyval.pth = yyvsp[0].pth; } break; -case 181: -#line 1353 "pic.y" +case 186: +#line 1379 "pic.y" { lex_warning("`%1%2 %3' in `with' argument ignored", yyvsp[-2].n, ordinal_postfix(yyvsp[-2].n), object_type_name(yyvsp[-1].obtype)); yyval.pth = yyvsp[0].pth; } break; -case 182: -#line 1359 "pic.y" +case 187: +#line 1385 "pic.y" { lex_warning("initial `%1' in `with' argument ignored", yyvsp[-1].str); a_delete yyvsp[-1].str; yyval.pth = yyvsp[0].pth; } break; -case 183: -#line 1368 "pic.y" +case 188: +#line 1394 "pic.y" { yyval.crn = &object::north; } break; -case 184: -#line 1370 "pic.y" +case 189: +#line 1396 "pic.y" { yyval.crn = &object::east; } break; -case 185: -#line 1372 "pic.y" +case 190: +#line 1398 "pic.y" { yyval.crn = &object::west; } break; -case 186: -#line 1374 "pic.y" +case 191: +#line 1400 "pic.y" { yyval.crn = &object::south; } break; -case 187: -#line 1376 "pic.y" +case 192: +#line 1402 "pic.y" { yyval.crn = &object::north_east; } break; -case 188: -#line 1378 "pic.y" +case 193: +#line 1404 "pic.y" { yyval.crn = &object:: south_east; } break; -case 189: -#line 1380 "pic.y" +case 194: +#line 1406 "pic.y" { yyval.crn = &object::north_west; } break; -case 190: -#line 1382 "pic.y" +case 195: +#line 1408 "pic.y" { yyval.crn = &object::south_west; } break; -case 191: -#line 1384 "pic.y" +case 196: +#line 1410 "pic.y" { yyval.crn = &object::center; } break; -case 192: -#line 1386 "pic.y" +case 197: +#line 1412 "pic.y" { yyval.crn = &object::start; } break; -case 193: -#line 1388 "pic.y" +case 198: +#line 1414 "pic.y" { yyval.crn = &object::end; } break; -case 194: -#line 1390 "pic.y" +case 199: +#line 1416 "pic.y" { yyval.crn = &object::north; } break; -case 195: -#line 1392 "pic.y" +case 200: +#line 1418 "pic.y" { yyval.crn = &object::south; } break; -case 196: -#line 1394 "pic.y" +case 201: +#line 1420 "pic.y" { yyval.crn = &object::west; } break; -case 197: -#line 1396 "pic.y" +case 202: +#line 1422 "pic.y" { yyval.crn = &object::east; } break; -case 198: -#line 1398 "pic.y" +case 203: +#line 1424 "pic.y" { yyval.crn = &object::north_west; } break; -case 199: -#line 1400 "pic.y" +case 204: +#line 1426 "pic.y" { yyval.crn = &object::south_west; } break; -case 200: -#line 1402 "pic.y" +case 205: +#line 1428 "pic.y" { yyval.crn = &object::north_east; } break; -case 201: -#line 1404 "pic.y" +case 206: +#line 1430 "pic.y" { yyval.crn = &object::south_east; } break; -case 202: -#line 1406 "pic.y" +case 207: +#line 1432 "pic.y" { yyval.crn = &object::west; } break; -case 203: -#line 1408 "pic.y" +case 208: +#line 1434 "pic.y" { yyval.crn = &object::east; } break; -case 204: -#line 1410 "pic.y" +case 209: +#line 1436 "pic.y" { yyval.crn = &object::north_west; } break; -case 205: -#line 1412 "pic.y" +case 210: +#line 1438 "pic.y" { yyval.crn = &object::south_west; } break; -case 206: -#line 1414 "pic.y" +case 211: +#line 1440 "pic.y" { yyval.crn = &object::north_east; } break; -case 207: -#line 1416 "pic.y" +case 212: +#line 1442 "pic.y" { yyval.crn = &object::south_east; } break; -case 208: -#line 1418 "pic.y" +case 213: +#line 1444 "pic.y" { yyval.crn = &object::north; } break; -case 209: -#line 1420 "pic.y" +case 214: +#line 1446 "pic.y" { yyval.crn = &object::south; } break; -case 210: -#line 1422 "pic.y" +case 215: +#line 1448 "pic.y" { yyval.crn = &object::east; } break; -case 211: -#line 1424 "pic.y" +case 216: +#line 1450 "pic.y" { yyval.crn = &object::west; } break; -case 212: -#line 1426 "pic.y" +case 217: +#line 1452 "pic.y" { yyval.crn = &object::center; } break; -case 213: -#line 1428 "pic.y" +case 218: +#line 1454 "pic.y" { yyval.crn = &object::start; } break; -case 214: -#line 1430 "pic.y" +case 219: +#line 1456 "pic.y" { yyval.crn = &object::end; } break; -case 215: -#line 1435 "pic.y" +case 220: +#line 1461 "pic.y" { if (!lookup_variable(yyvsp[0].str, & yyval.x)) { lex_error("there is no variable `%1'", yyvsp[0].str); @@ -5326,12 +5387,12 @@ a_delete yyvsp[0].str; } break; -case 216: -#line 1443 "pic.y" +case 221: +#line 1469 "pic.y" { yyval.x = yyvsp[0].x; } break; -case 217: -#line 1445 "pic.y" +case 222: +#line 1471 "pic.y" { if (yyvsp[-1].pl.obj != 0) yyval.x = yyvsp[-1].pl.obj->origin().x; @@ -5339,8 +5400,8 @@ yyval.x = yyvsp[-1].pl.x; } break; -case 218: -#line 1452 "pic.y" +case 223: +#line 1478 "pic.y" { if (yyvsp[-1].pl.obj != 0) yyval.x = yyvsp[-1].pl.obj->origin().y; @@ -5348,8 +5409,8 @@ yyval.x = yyvsp[-1].pl.y; } break; -case 219: -#line 1459 "pic.y" +case 224: +#line 1485 "pic.y" { if (yyvsp[-1].pl.obj != 0) yyval.x = yyvsp[-1].pl.obj->height(); @@ -5357,8 +5418,8 @@ yyval.x = 0.0; } break; -case 220: -#line 1466 "pic.y" +case 225: +#line 1492 "pic.y" { if (yyvsp[-1].pl.obj != 0) yyval.x = yyvsp[-1].pl.obj->width(); @@ -5366,8 +5427,8 @@ yyval.x = 0.0; } break; -case 221: -#line 1473 "pic.y" +case 226: +#line 1499 "pic.y" { if (yyvsp[-1].pl.obj != 0) yyval.x = yyvsp[-1].pl.obj->radius(); @@ -5375,20 +5436,20 @@ yyval.x = 0.0; } break; -case 222: -#line 1480 "pic.y" +case 227: +#line 1506 "pic.y" { yyval.x = yyvsp[-2].x + yyvsp[0].x; } break; -case 223: -#line 1482 "pic.y" +case 228: +#line 1508 "pic.y" { yyval.x = yyvsp[-2].x - yyvsp[0].x; } break; -case 224: -#line 1484 "pic.y" +case 229: +#line 1510 "pic.y" { yyval.x = yyvsp[-2].x * yyvsp[0].x; } break; -case 225: -#line 1486 "pic.y" +case 230: +#line 1512 "pic.y" { if (yyvsp[0].x == 0.0) { lex_error("division by zero"); @@ -5397,8 +5458,8 @@ yyval.x = yyvsp[-2].x/yyvsp[0].x; } break; -case 226: -#line 1494 "pic.y" +case 231: +#line 1520 "pic.y" { if (yyvsp[0].x == 0.0) { lex_error("modulus by zero"); @@ -5407,8 +5468,8 @@ yyval.x = fmod(yyvsp[-2].x, yyvsp[0].x); } break; -case 227: -#line 1502 "pic.y" +case 232: +#line 1528 "pic.y" { errno = 0; yyval.x = pow(yyvsp[-2].x, yyvsp[0].x); @@ -5422,16 +5483,16 @@ } } break; -case 228: -#line 1515 "pic.y" +case 233: +#line 1541 "pic.y" { yyval.x = -yyvsp[0].x; } break; -case 229: -#line 1517 "pic.y" +case 234: +#line 1543 "pic.y" { yyval.x = yyvsp[-1].x; } break; -case 230: -#line 1519 "pic.y" +case 235: +#line 1545 "pic.y" { errno = 0; yyval.x = sin(yyvsp[-1].x); @@ -5441,8 +5502,8 @@ } } break; -case 231: -#line 1528 "pic.y" +case 236: +#line 1554 "pic.y" { errno = 0; yyval.x = cos(yyvsp[-1].x); @@ -5452,8 +5513,8 @@ } } break; -case 232: -#line 1537 "pic.y" +case 237: +#line 1563 "pic.y" { errno = 0; yyval.x = atan2(yyvsp[-3].x, yyvsp[-1].x); @@ -5467,8 +5528,8 @@ } } break; -case 233: -#line 1550 "pic.y" +case 238: +#line 1576 "pic.y" { errno = 0; yyval.x = log10(yyvsp[-1].x); @@ -5478,8 +5539,8 @@ } } break; -case 234: -#line 1559 "pic.y" +case 239: +#line 1585 "pic.y" { errno = 0; yyval.x = pow(10.0, yyvsp[-1].x); @@ -5489,8 +5550,8 @@ } } break; -case 235: -#line 1568 "pic.y" +case 240: +#line 1594 "pic.y" { errno = 0; yyval.x = sqrt(yyvsp[-1].x); @@ -5500,74 +5561,74 @@ } } break; -case 236: -#line 1577 "pic.y" +case 241: +#line 1603 "pic.y" { yyval.x = yyvsp[-3].x > yyvsp[-1].x ? yyvsp[-3].x : yyvsp[-1].x; } break; -case 237: -#line 1579 "pic.y" +case 242: +#line 1605 "pic.y" { yyval.x = yyvsp[-3].x < yyvsp[-1].x ? yyvsp[-3].x : yyvsp[-1].x; } break; -case 238: -#line 1581 "pic.y" +case 243: +#line 1607 "pic.y" { yyval.x = floor(yyvsp[-1].x); } break; -case 239: -#line 1583 "pic.y" +case 244: +#line 1609 "pic.y" { yyval.x = 1.0 + floor(((rand()&0x7fff)/double(0x7fff))*yyvsp[-1].x); } break; -case 240: -#line 1585 "pic.y" +case 245: +#line 1611 "pic.y" { /* return a random number in the range [0,1) */ /* portable, but not very random */ yyval.x = (rand() & 0x7fff) / double(0x8000); } break; -case 241: -#line 1591 "pic.y" +case 246: +#line 1617 "pic.y" { yyval.x = 0; srand((unsigned int)yyvsp[-1].x); } break; -case 242: -#line 1596 "pic.y" +case 247: +#line 1622 "pic.y" { yyval.x = (yyvsp[-2].x < yyvsp[0].x); } break; -case 243: -#line 1598 "pic.y" +case 248: +#line 1624 "pic.y" { yyval.x = (yyvsp[-2].x <= yyvsp[0].x); } break; -case 244: -#line 1600 "pic.y" +case 249: +#line 1626 "pic.y" { yyval.x = (yyvsp[-2].x > yyvsp[0].x); } break; -case 245: -#line 1602 "pic.y" +case 250: +#line 1628 "pic.y" { yyval.x = (yyvsp[-2].x >= yyvsp[0].x); } break; -case 246: -#line 1604 "pic.y" +case 251: +#line 1630 "pic.y" { yyval.x = (yyvsp[-2].x == yyvsp[0].x); } break; -case 247: -#line 1606 "pic.y" +case 252: +#line 1632 "pic.y" { yyval.x = (yyvsp[-2].x != yyvsp[0].x); } break; -case 248: -#line 1608 "pic.y" +case 253: +#line 1634 "pic.y" { yyval.x = (yyvsp[-2].x != 0.0 && yyvsp[0].x != 0.0); } break; -case 249: -#line 1610 "pic.y" +case 254: +#line 1636 "pic.y" { yyval.x = (yyvsp[-2].x != 0.0 || yyvsp[0].x != 0.0); } break; -case 250: -#line 1612 "pic.y" +case 255: +#line 1638 "pic.y" { yyval.x = (yyvsp[0].x == 0.0); } break; -#line 5571 "y.tab.c" +#line 5632 "y.tab.c" } yyssp -= yym; yystate = *yyssp; diff -ruN groff-1.19.1/src/preproc/pic/pic.h groff-1.19.2/src/preproc/pic/pic.h --- groff-1.19.1/src/preproc/pic/pic.h 2003-04-19 08:05:27.000000000 +0200 +++ groff-1.19.2/src/preproc/pic/pic.h 2005-05-26 15:37:20.000000000 +0200 @@ -1,5 +1,5 @@ // -*- C++ -*- -/* Copyright (C) 1989, 1990, 1991, 1992, 2000, 2001, 2003 +/* Copyright (C) 1989, 1990, 1991, 1992, 2000, 2001, 2003, 2005 Free Software Foundation, Inc. Written by James Clark (jjc@jclark.com) @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "lib.h" @@ -25,12 +25,6 @@ #include #include -#ifdef NEED_DECLARATION_HYPOT -extern "C" { - double hypot(double, double); -} -#endif /* NEED_DECLARATION_HYPOT */ - #ifdef NEED_DECLARATION_RAND #undef rand extern "C" { diff -ruN groff-1.19.1/src/preproc/pic/pic.man groff-1.19.2/src/preproc/pic/pic.man --- groff-1.19.1/src/preproc/pic/pic.man 2003-07-10 06:37:20.000000000 +0200 +++ groff-1.19.2/src/preproc/pic/pic.man 2004-07-19 22:04:22.000000000 +0200 @@ -1,5 +1,5 @@ .ig -Copyright (C) 1989-2000, 2001, 2002, 2003 Free Software Foundation, Inc. +Copyright (C) 1989-2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice @@ -322,6 +322,16 @@ .I variable will instead be multiplied by .IR expr3 . +The value of +.I expr3 +can be negative for the additive case; +.I variable +is then tested whether it is greater than or equal to +.IR expr2 . +For the multiplicative case, +.I expr3 +must be greater than zero. +If the constraints aren't met, the loop isn't executed. .I X can be any character not occurring in .IR body . @@ -362,6 +372,25 @@ or .BR \e , but allows the values of variables to be passed through. +For example, +.RS +.IP +.ft B +.nf +\&.PS +x = 14 +command ".ds string x is " x "." +\&.PE +\e*[string] +.ft +.fi +.RE +.IP +prints +.RS +.IP +.B x is 14. +.RE . .TP \fBsh\fR \fIX\fR \fIcommand\fR \fIX\fR @@ -522,7 +551,10 @@ .RE .IP prints -.BR 5\ 3 . +.RS +.IP +.B 5 3 +.RE . .LP Arguments of the form @@ -625,8 +657,10 @@ .I dir is the current direction. For example -.IP +.LP +.RS .B line 2i +.RE .LP means draw a line 2\ inches long in the current direction. The `i' (or `I') character is ignored; to use another measurement unit, @@ -645,6 +679,7 @@ Scientific notation is allowed for numbers. For example .RS +.LP .B x = 5e\-2 .RE @@ -653,21 +688,25 @@ Text attributes can be compounded. For example, .RS +.LP .B "foo" above ljust .RE -is legal. +.LP +is valid. . .LP There is no limit to the depth to which blocks can be examined. For example, .RS +.LP .B [A: [B: [C: box ]]] with .A.B.C.sw at 1,2 .br .B circle at last [\^].A.B.C .RE +.LP is acceptable. . .LP @@ -805,7 +844,7 @@ sets the color of the outline, .B shaded the fill color, and -.BR colo [ u ] r [ ed ] +.B colo\fR[\fPu\fR]\fPr\fR[\fPed\fR] sets both. All three keywords expect a suffix specifying the color, for example .RS @@ -974,6 +1013,7 @@ .RE .LP Call +.LP .RS .B gs --help .RE @@ -1052,7 +1092,7 @@ . Input characters that are invalid for .B groff -(ie those with +(i.e., those with .SM ASCII code 0, or 013 octal, or between 015 and 037 octal, or between 0200 and 0237 octal) are rejected even in \*(tx mode. diff -ruN groff-1.19.1/src/preproc/pic/pic.y groff-1.19.2/src/preproc/pic/pic.y --- groff-1.19.1/src/preproc/pic/pic.y 2004-04-07 17:23:09.000000000 +0200 +++ groff-1.19.2/src/preproc/pic/pic.y 2005-05-26 15:37:20.000000000 +0200 @@ -1,4 +1,4 @@ -/* Copyright (C) 1989, 1990, 1991, 1992, 2000, 2001, 2002, 2003, 2004 +/* Copyright (C) 1989, 1990, 1991, 1992, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. Written by James Clark (jjc@jclark.com) @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ %{ #include "pic.h" #include "ptable.h" @@ -1135,6 +1135,12 @@ $$.x = pos.x; $$.y = pos.y; } + | '(' place ')' + { + position pos = $2; + $$.x = pos.x; + $$.y = pos.y; + } ; position_not_place: @@ -1145,11 +1151,21 @@ $$.x = $1.x + $3.x; $$.y = $1.y + $3.y; } + | '(' position '+' expr_pair ')' + { + $$.x = $2.x + $4.x; + $$.y = $2.y + $4.y; + } | position '-' expr_pair { $$.x = $1.x - $3.x; $$.y = $1.y - $3.y; } + | '(' position '-' expr_pair ')' + { + $$.x = $2.x - $4.x; + $$.y = $2.y - $4.y; + } | '(' position ',' position ')' { $$.x = $2.x; @@ -1160,11 +1176,21 @@ $$.x = (1.0 - $1)*$3.x + $1*$5.x; $$.y = (1.0 - $1)*$3.y + $1*$5.y; } + | '(' expr between position AND position ')' + { + $$.x = (1.0 - $2)*$4.x + $2*$6.x; + $$.y = (1.0 - $2)*$4.y + $2*$6.y; + } | expr '<' position ',' position '>' { $$.x = (1.0 - $1)*$3.x + $1*$5.x; $$.y = (1.0 - $1)*$3.y + $1*$5.y; } + | '(' expr '<' position ',' position '>' ')' + { + $$.x = (1.0 - $2)*$4.x + $2*$6.x; + $$.y = (1.0 - $2)*$4.y + $2*$6.y; + } ; between: diff -ruN groff-1.19.1/src/preproc/pic/position.h groff-1.19.2/src/preproc/pic/position.h --- groff-1.19.1/src/preproc/pic/position.h 2000-02-06 10:38:27.000000000 +0100 +++ groff-1.19.2/src/preproc/pic/position.h 2005-05-26 15:37:20.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ struct place; struct position { diff -ruN groff-1.19.1/src/preproc/pic/tex.cpp groff-1.19.2/src/preproc/pic/tex.cpp --- groff-1.19.1/src/preproc/pic/tex.cpp 2003-07-08 07:33:55.000000000 +0200 +++ groff-1.19.2/src/preproc/pic/tex.cpp 2005-05-26 15:37:20.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "pic.h" diff -ruN groff-1.19.1/src/preproc/pic/troff.cpp groff-1.19.2/src/preproc/pic/troff.cpp --- groff-1.19.1/src/preproc/pic/troff.cpp 2003-10-27 08:45:06.000000000 +0100 +++ groff-1.19.2/src/preproc/pic/troff.cpp 2005-07-03 13:21:17.000000000 +0200 @@ -1,5 +1,5 @@ // -*- C++ -*- -/* Copyright (C) 1989, 1990, 1991, 1992, 2000, 2001, 2002, 2003 +/* Copyright (C) 1989, 1990, 1991, 1992, 2000, 2001, 2002, 2003, 2005 Free Software Foundation, Inc. Written by James Clark (jjc@jclark.com) @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "pic.h" #include "common.h" @@ -488,7 +488,7 @@ if (last_filled) { free(last_filled); last_filled = 0; - printf("\\M[]\n"); + printf(".fcolor\n"); } } @@ -498,14 +498,14 @@ if (last_filled || last_outlined) { reset_color(); } - // \m and \M emit a node in compatibility mode only, + // .gcolor and .fcolor emit a node in compatibility mode only, // but that won't work anyway if (color_fill) { - printf("\\M[%s]\n", color_fill); + printf(".fcolor %s\n", color_fill); last_filled = strsave(color_fill); } if (color_outlined) { - printf("\\m[%s]\n", color_outlined); + printf(".gcolor %s\n", color_outlined); last_outlined = strsave(color_outlined); } } @@ -515,12 +515,12 @@ { if (driver_extension_flag) { if (last_filled) { - printf("\\M[]\n"); + printf(".fcolor\n"); a_delete last_filled; last_filled = 0; } if (last_outlined) { - printf("\\m[]\n"); + printf(".gcolor\n"); a_delete last_outlined; last_outlined = 0; } diff -ruN groff-1.19.1/src/preproc/refer/command.cpp groff-1.19.2/src/preproc/refer/command.cpp --- groff-1.19.1/src/preproc/refer/command.cpp 2004-04-08 16:24:55.000000000 +0200 +++ groff-1.19.2/src/preproc/refer/command.cpp 2005-05-26 15:37:20.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "refer.h" #include "refid.h" diff -ruN groff-1.19.1/src/preproc/refer/command.h groff-1.19.2/src/preproc/refer/command.h --- groff-1.19.1/src/preproc/refer/command.h 2000-02-06 10:38:31.000000000 +0100 +++ groff-1.19.2/src/preproc/refer/command.h 2005-05-26 15:37:20.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ void process_commands(const char *file); void process_commands(string &s, const char *file, int lineno); diff -ruN groff-1.19.1/src/preproc/refer/label.y groff-1.19.2/src/preproc/refer/label.y --- groff-1.19.1/src/preproc/refer/label.y 2004-05-12 11:38:30.000000000 +0200 +++ groff-1.19.2/src/preproc/refer/label.y 2005-05-26 15:37:20.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ %{ diff -ruN groff-1.19.1/src/preproc/refer/ref.cpp groff-1.19.2/src/preproc/refer/ref.cpp --- groff-1.19.1/src/preproc/refer/ref.cpp 2004-01-05 23:40:06.000000000 +0100 +++ groff-1.19.2/src/preproc/refer/ref.cpp 2005-05-26 15:37:20.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "refer.h" #include "refid.h" diff -ruN groff-1.19.1/src/preproc/refer/refer.cpp groff-1.19.2/src/preproc/refer/refer.cpp --- groff-1.19.1/src/preproc/refer/refer.cpp 2002-02-10 02:22:12.000000000 +0100 +++ groff-1.19.2/src/preproc/refer/refer.cpp 2005-05-26 15:37:20.000000000 +0200 @@ -1,5 +1,6 @@ // -*- C++ -*- -/* Copyright (C) 1989-1992, 2000, 2001, 2002 Free Software Foundation, Inc. +/* Copyright (C) 1989-1992, 2000, 2001, 2002, 2004 + Free Software Foundation, Inc. Written by James Clark (jjc@jclark.com) This file is part of groff. @@ -16,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "refer.h" #include "refid.h" @@ -938,6 +939,12 @@ void output_references() { assert(accumulate); + if (!hash_table_size) { + error("nothing to reference (probably `bibliography' before `sort')"); + accumulate = 0; + nreferences = 0; + return; + } if (nreferences > 0) { int j = 0; int i; diff -ruN groff-1.19.1/src/preproc/refer/refer.h groff-1.19.2/src/preproc/refer/refer.h --- groff-1.19.1/src/preproc/refer/refer.h 2004-04-17 07:30:19.000000000 +0200 +++ groff-1.19.2/src/preproc/refer/refer.h 2005-05-26 15:37:20.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "lib.h" diff -ruN groff-1.19.1/src/preproc/refer/refer.man groff-1.19.2/src/preproc/refer/refer.man --- groff-1.19.1/src/preproc/refer/refer.man 2003-01-16 15:16:59.000000000 +0100 +++ groff-1.19.2/src/preproc/refer/refer.man 2005-05-07 07:13:02.000000000 +0200 @@ -1,5 +1,6 @@ .ig -Copyright (C) 1989-2000, 2001, 2002, 2003 Free Software Foundation, Inc. +Copyright (C) 1989-2000, 2001, 2002, 2003, 2004, 2005 + Free Software Foundation, Inc. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice @@ -16,23 +17,37 @@ translations approved by the Free Software Foundation instead of in the original English. .. +. +. .de TQ -.br -.ns -.TP \\$1 +. br +. ns +. TP \\$1 .. +. +. .\" Like TP, but if specified indent is more than half .\" the current line-length - indent, use the default indent. .de Tp -.ie \\n(.$=0:((0\\$1)*2u>(\\n(.lu-\\n(.iu)) .TP -.el .TP "\\$1" +. ie \\n(.$=0:((0\\$1)*2u>(\\n(.lu-\\n(.iu)) .TP +. el .TP "\\$1" +. +. .. .\" The BSD man macros can't handle " in arguments to font change macros, .\" so use \(ts instead of ". .tr \(ts" +. +. .TH @G@REFER @MAN1EXT@ "@MDATE@" "Groff Version @VERSION@" +. +. +. .SH NAME @g@refer \- preprocess bibliographic references for groff +. +. +. .SH SYNOPSIS .nr a \n(.j .ad l @@ -40,10 +55,12 @@ .in +\w'\fB@g@refer 'u .ti \niu .B @g@refer +. .de OP -.ie \\n(.$-1 .RI "[\ \fB\\$1\fP" "\\$2" "\ ]" -.el .RB "[\ " "\\$1" "\ ]" +. ie \\n(.$-1 .RI "[\ \fB\\$1\fP" "\\$2" "\ ]" +. el .RB "[\ " "\\$1" "\ ]" .. +. .OP \-benvCPRS .OP \-a n .OP \-c fields @@ -51,16 +68,20 @@ .OP \-i fields .OP \-k field .OP \-l m,n -.OP \-p filename +.OP \-p \%filename .OP \-s fields .OP \-t n .OP \-B field.macro -.RI [\ filename \|.\|.\|.\ ] +.RI [\ \%filename \|.\|.\|.\ ] .br .ad \na -.PP +. +.LP It is possible to have whitespace between a command line option and its parameter. +. +. +. .SH DESCRIPTION This file documents the GNU version of .BR refer , @@ -72,13 +93,14 @@ except that lines between .B .[ and -.B .] +.B .]\& are interpreted as citations, and lines between .B .R1 and .B .R2 are interpreted as commands about how citations are to be processed. +. .LP Each citation specifies a reference. The citation can specify a reference that is contained in @@ -87,6 +109,7 @@ Alternatively it can specify a reference by supplying a database record in the citation. A combination of these alternatives is also possible. +. .LP For each citation, .B refer @@ -111,14 +134,17 @@ and the commands output at some later point. If the references are accumulated, then multiple citations of the same reference will produce a single formatted reference. +. .LP The interpretation of lines between .B .R1 and .B .R2 -as commands is a new feature of GNU refer. +as commands is a new feature of GNU +.BR refer . Documents making use of this feature can still be processed by Unix refer just by adding the lines +. .RS .LP .nf @@ -129,6 +155,7 @@ .ft .fi .RE +. to the beginning of the document. This will cause .B troff @@ -139,6 +166,7 @@ The effect of some commands can also be achieved by options. These options are supported mainly for compatibility with Unix refer. It is usually more convenient to use commands. +. .LP .B refer generates @@ -154,110 +182,145 @@ lines that it produces will be accurate even if the input has been preprocessed by a command such as .BR @g@soelim (@MAN1EXT@). +. +. +. .SH OPTIONS +. .LP Most options are equivalent to commands (for a description of these commands see the .B Commands subsection): +. +.nr a \n(.j +.ad l .TP .B \-b -.B -no-label-in-text; no-label-in-reference +.B "no-label-in-text; no-label-in-reference" +. .TP .B \-e .B accumulate +. .TP .B \-n .B no-default-database +. .TP .B \-C .B compatible +. .TP .B \-P .B move-punctuation +. .TP .B \-S .B -label "(A.n|Q) ', ' (D.y|D)"; bracket-label " (" ) "; " +label\ "(A.n|Q)\ ',\ '\ (D.y|D)"; \%bracket-label\ "\ ("\ )\ ";\ " +. .TP .BI \-a n .B reverse .BI A n +. .TP .BI \-c fields .B capitalize .I fields +. .TP .BI \-f n .B label .BI % n +. .TP .BI \-i fields .B search-ignore .I fields +. .TP .B \-k .B label .B L\(ti%a +. .TP .BI \-k field .B label .IB field \(ti%a +. .TP .B \-l .B label .BI A.nD.y%a +. .TP .BI \-l m .B label .BI A.n+ m D.y%a +. .TP .BI \-l, n .B label .BI A.nD.y\- n %a +. .TP .BI \-l m , n .B label .BI A.n+ m D.y\- n %a +. .TP .BI \-p filename .B database .I filename +. .TP .BI \-s spec .B sort .I spec +. .TP .BI \-t n .B search-truncate .I n +.ad \na +. .LP These options are equivalent to the following commands with the addition that the filenames specified on the command line are processed as if they were arguments to the .B bibliography command instead of in the normal way: +. .TP .B \-B -.B -annotate X AP; no-label-in-reference +.B "annotate X AP; no-label-in-reference" +. .TP .BI \-B field . macro .B annotate .I field .IB macro ; .B no-label-in-reference +. .LP The following options have no equivalent commands: +. .TP .B \-v Print the version number. +. .TP .B \-R Don't recognize lines beginning with .BR .R1 / .R2 . +. +. +. .SH USAGE +. +. .SS Bibliographic databases The bibliographic database is a text file consisting of records separated by one or more blank lines. @@ -272,11 +335,12 @@ and then by the contents of the field. Empty fields are ignored. The conventional meaning of each field is as follows: +. .TP .B A The name of an author. If the name contains a title such as -.B Jr. +.B Jr.\& at the end, it should be separated from the last name by a comma. There can be multiple occurrences of the @@ -285,15 +349,18 @@ The order is significant. It is a good idea always to supply an .B A -field or a +field or a .B Q field. +. .TP .B B For an article that is part of a book, the title of the book. +. .TP .B C The place (city) of publication. +. .TP .B D The date of publication. @@ -308,6 +375,7 @@ or .B unknown can be used. +. .TP .B E For an article that is part of a book, the name of an editor of the book. @@ -319,33 +387,42 @@ or .B ,\ (eds) should be appended to the last author. +. .TP .B G US Government ordering number. +. .TP .B I The publisher (issuer). +. .TP .B J For an article in a journal, the name of the journal. +. .TP .B K Keywords to be used for searching. +. .TP .B L Label. +. .TP .B N Journal issue number. +. .TP .B O Other information. This is usually printed at the end of the reference. +. .TP .B P Page number. A range of pages can be specified as .IB m \- n\fR. +. .TP .B Q The name of the author, if the author is not a person. @@ -355,23 +432,29 @@ There can only be one .B Q field. +. .TP .B R Technical report number. +. .TP .B S Series name. +. .TP .B T Title. For an article in a book or journal, this should be the title of the article. +. .TP .B V Volume number of the journal or book. +. .TP .B X Annotation. +. .LP For all fields except .B A @@ -379,6 +462,7 @@ .BR E , if there is more than one occurrence of a particular field in a record, only the last such field will be used. +. .LP If accent strings are used, they should follow the character to be accented. This means that the @@ -390,18 +474,21 @@ use one .B \e rather than two. +. +. .SS Citations The format of a citation is +. .RS .BI .[ opening-text .br -.I -flags keywords +.I "flags keywords" .br .I fields .br .BI .] closing-text .RE +. .LP The .IR opening-text , @@ -414,6 +501,7 @@ and .I fields components need be specified. +. .LP The .I keywords @@ -421,6 +509,7 @@ that contains all the words in .IR keywords . It is an error if more than one reference if found. +. .LP The .I fields @@ -432,6 +521,7 @@ then additional fields should be specified only on the first occasion that a particular reference is cited, and will apply to all citations of that reference. +. .LP The .I opening-text @@ -451,6 +541,7 @@ .B ] flags. Note that leading and trailing spaces are significant for these components. +. .LP The .I flags @@ -460,6 +551,7 @@ Unix refer will treat these flags as part of the keywords and so will ignore them since they are non-alphanumeric. The following flags are currently recognized: +. .TP .B # This says to use the label specified by the @@ -474,6 +566,7 @@ the .B # is supposed to be suggestive of a numeric type of label. +. .TP .B [ Precede @@ -481,6 +574,7 @@ with the first string specified in the .B bracket-label command. +. .TP .B ] Follow @@ -488,6 +582,7 @@ with the second string specified in the .B bracket-label command. +. .LP One advantages of using the .B [ @@ -503,6 +598,7 @@ command. Another advantage is that sorting and merging of citations will not necessarily be inhibited if the flags are used. +. .LP If a label is to be inserted into the text, it will be attached to the line preceding the @@ -511,6 +607,7 @@ If there is no such line, then an extra line will be inserted before the .B .[ line and a warning will be given. +. .LP There is no special notation for making a citation to multiple references. Just use a sequence of citations, one for each reference. @@ -546,6 +643,8 @@ (If you wish to prevent this just make the first citation's .I closing-text .BR \e& .) +. +. .SS Commands Commands are contained between lines starting with .B .R1 @@ -564,8 +663,9 @@ lines, nor anything between them is output. +. .LP -Commands are separated by newlines or +Commands are separated by newlines or .BR ; s. .B # introduces a comment that extends to the end of the line @@ -597,6 +697,7 @@ .BR \e ; this works everywhere except after a .BR # . +. .LP .ds n \fR* Each command @@ -609,6 +710,7 @@ .B no-sort command specifies that references should not be sorted. The negative commands take no arguments. +. .LP In the following description each argument must be a single word; .I field @@ -623,6 +725,7 @@ is used for an arbitrary string; .I filename is used for the name of a file. +. .Tp \w'\fBabbreviate-label-ranges'u+2n .BI abbreviate\*n\ fields\ string1\ string2\ string3\ string4 Abbreviate the first names of @@ -647,6 +750,7 @@ result from abbreviation. Names are abbreviated before sorting and before label construction. +. .TP .BI abbreviate-label-ranges\*n\ string Three or more adjacent labels that refer to consecutive references @@ -659,12 +763,14 @@ .I string is omitted it defaults to .BR \- . +. .TP .B accumulate\*n Accumulate references instead of writing out each reference as it is encountered. Accumulated references will be written out whenever a reference of the form +. .RS .IP .B .[ @@ -672,6 +778,7 @@ .B $LIST$ .br .B .] +. .LP is encountered, after all input files hve been processed, @@ -679,14 +786,17 @@ .B .R1 line is recognized. .RE +. .TP .BI annotate\*n\ field\ string .I field is an annotation; print it at the end of the reference as a paragraph preceded by the line +. .RS .IP .BI . string +. .LP If .I macro @@ -698,9 +808,10 @@ .BR X . Only one field can be an annotation. .RE +. .TP -.BI articles\ string \fR\|.\|.\|. -.IR string \|.\|.\|. +.BI articles\ string \fR\|.\|.\|. +.IR string \|.\|.\|.\& are definite or indefinite articles, and should be ignored at the beginning of .B T fields when sorting. @@ -709,11 +820,16 @@ .B a and .B an -are recognized as articles. +are recognized as articles. +. .TP .BI bibliography\ filename \fR\|.\|.\|. Write out all the references contained in the bibliographic databases .IR filename \|.\|.\|. +This command should come last in a +.BR .R1 / .R2 +block. +. .TP .BI bracket-label\ string1\ string2\ string3 In the text, bracket each label @@ -728,16 +844,19 @@ will be turned into .IR string3 . The default behaviour is +. .RS .IP .B bracket-label \e*([. \e*(.] ", " .RE +. .TP .BI capitalize\ fields Convert .I fields to caps and small caps. +. .TP .B compatible\*n Recognize @@ -745,6 +864,7 @@ and .B .R2 even when followed by a character other than space or newline. +. .TP .BI database\ filename \fR\|.\|.\|. Search the bibliographic databases @@ -757,6 +877,7 @@ .BR @g@indxbib (@MAN1EXT@) exists, then it will be searched instead; each index can cover multiple databases. +. .TP .BI date-as-label\*n\ string .I string @@ -775,26 +896,30 @@ .B no-label-in-reference command. For example, +. .RS .IP -.B -date-as-label D.+yD.y%a*D.-y +.B "date-as-label D.+yD.y%a*D.-y" +. .LP would attach a disambiguating letter to the year part of the .B D field in the reference. .RE +. .TP .B default-database\*n The default database should be searched. This is the default behaviour, so the negative version of this command is more useful. -refer determines whether the default database should be searched +.B refer +determines whether the default database should be searched on the first occasion that it needs to do a search. Thus a .B no-default-database command must be given before then, in order to be effective. +. .TP .BI discard\*n\ fields When the reference is read, @@ -807,11 +932,11 @@ .I fields are .BR XYZ . +. .TP .BI et-al\*n\ string\ m\ n Control use of -.B -et al +.B "et al" in the evaluation of .B @ expressions in label expressions. @@ -833,16 +958,19 @@ is not less than .IR n . The default behaviour is +. .RS .IP .B et-al " et al" 2 3 .RE +. .TP .BI include\ filename Include .I filename and interpret the contents as commands. +. .TP .BI join-authors\ string1\ string2\ string3 This says how authors should be joined together. @@ -863,13 +991,16 @@ is also omitted it will also default to .IR string1 . For example, +. .RS .IP .B join-authors " and " ", " ", and " +. .LP will restore the default method for joining authors. .RE +. .TP .B label-in-reference\*n When outputting the reference, @@ -878,6 +1009,7 @@ to be the reference's label. This is the default behaviour; so the negative version of this command is more useful. +. .TP .B label-in-text\*n For each reference output a label in the text. @@ -886,10 +1018,12 @@ command. This is the default behaviour; so the negative version of this command is more useful. +. .TP .BI label\ string .I string is a label expression describing how to label each reference. +. .TP .BI separate-label-second-parts\ string When merging two-part labels, separate the second part of the second @@ -898,11 +1032,13 @@ See the description of the .B <> label expression. +. .TP .B move-punctuation\*n In the text, move any punctuation at the end of line past the label. It is usually a good idea to give this command unless you are using superscripted numbers as labels. +. .TP .BI reverse\*n\ string Reverse the fields whose names @@ -911,6 +1047,7 @@ Each field name can be followed by a number which says how many such fields should be reversed. If no number is given for a field, all such fields will be reversed. +. .TP .BI search-ignore\*n\ fields While searching for keys in databases for which no index exists, @@ -919,6 +1056,7 @@ Initially, fields .B XYZ are ignored. +. .TP .BI search-truncate\*n\ n Only require the first @@ -930,7 +1068,8 @@ and the length of the key. Initially .I n -is 6. +is\ 6. +. .TP .BI short-label\*n\ string .I string @@ -946,6 +1085,7 @@ .B short-label command will typically be used to specify a label containing just a date and possibly a disambiguating letter. +. .TP .BI sort\*n\ string Sort references according to @@ -956,14 +1096,14 @@ indicating how many fields with the name should be used for sorting. .B + can be used to indicate that all the fields with the name should be used. -Also -.B . +Also +.B .\& can be used to indicate the references should be sorted using the (tentative) label. (The -.B -Label expressions +.B "Label expressions" subsection describes the concept of a tentative label.) +. .TP .B sort-adjacent-labels\*n Sort labels that are adjacent in the text according to their @@ -975,13 +1115,15 @@ .B <> expression. This will have no effect unless references are being accumulated. +. +. .SS Label expressions +. .LP -Label expressions can be evaluated both normally and tentatively. -The result of normal evaluation is used for output. +Label expressions can be evaluated both normally and tentatively. +The result of normal evaluation is used for output. The result of tentative evaluation, called the -.I -tentative label, +.IR "tentative label" , is used to gather the information that normal evaluation needs to disambiguate the label. Label expressions specified by the @@ -995,9 +1137,10 @@ .BR * , and .B % -expressions. +expressions. The description below applies to normal evaluation, -except where otherwise specified. +except where otherwise specified. +. .TP .I field .TQ @@ -1005,15 +1148,17 @@ The .IR n -th part of -.IR field . +.IR field . If .I n -is omitted, it defaults to 1. +is omitted, it defaults to\ 1. +. .TP .BI ' string ' The characters in .I string -literally. +literally. +. .TP .B @ All the authors joined as specified by the @@ -1056,6 +1201,7 @@ tentatively evaluates to a canonical representation of the authors, such that authors that compare equally for sorting purpose will have the same representation. +. .TP .BI % n .TQ @@ -1068,10 +1214,11 @@ .B %I The serial number of the reference formatted according to the character following the -.BR % . -The serial number of a reference is 1 plus the number of earlier references +.BR % . +The serial number of a reference is\ 1 plus the number of earlier references with same tentative label as this reference. These expressions tentatively evaluate to an empty string. +. .TP .IB expr * If there is another reference with the same tentative label as @@ -1079,6 +1226,7 @@ .IR expr , otherwise an empty string. It tentatively evaluates to an empty string. +. .TP .IB expr + n .TQ @@ -1094,22 +1242,27 @@ .BR \e('a ) count as a single letter. Accent strings are retained but do not count towards the total. +. .TP .IB expr .l .I expr -converted to lowercase. +converted to lowercase. +. .TP .IB expr .u .I expr -converted to uppercase. +converted to uppercase. +. .TP .IB expr .c .I expr -converted to caps and small caps. +converted to caps and small caps. +. .TP .IB expr .r .I expr reversed so that the last name is first. +. .TP .IB expr .a .I expr @@ -1121,10 +1274,12 @@ .B .a is useful only when you want a field to be abbreviated in a label but not in a reference. +. .TP .IB expr .y The year part of -.IR expr . +.IR expr . +. .TP .IB expr .+y The part of @@ -1132,6 +1287,7 @@ before the year, or the whole of .I expr if it does not contain a year. +. .TP .IB expr .\-y The part of @@ -1139,10 +1295,12 @@ after the year, or an empty string if .I expr does not contain a year. +. .TP .IB expr .n The last name part of -.IR expr . +.IR expr . +. .TP .IB expr1 \(ti expr2 .I expr1 @@ -1151,13 +1309,15 @@ is .B \- then it will be replaced by -.IR expr2 . +.IR expr2 . +. .TP .I expr1\ expr2 The concatenation of .I expr1 and -.IR expr2 . +.IR expr2 . +. .TP .IB expr1 | expr2 If @@ -1165,7 +1325,8 @@ is non-empty then .I expr1 otherwise -.IR expr2 . +.IR expr2 . +. .TP .IB expr1 & expr2 If @@ -1174,6 +1335,7 @@ then .I expr2 otherwise an empty string. +. .TP .IB expr1 ? expr2 : expr3 If @@ -1182,7 +1344,8 @@ then .I expr2 otherwise -.IR expr3 . +.IR expr3 . +. .TP .BI < expr > The label is in two parts, which are separated by @@ -1198,11 +1361,13 @@ this maybe desirable for expressions used in the .B short-label command. +. .TP .BI ( expr ) The same as .IR expr . Used for grouping. +. .LP The above expressions are listed in order of precedence (highest first); @@ -1210,6 +1375,8 @@ and .B | have the same precedence. +. +. .SS Macro interface Each reference starts with a call to the macro .BR ]- . @@ -1227,7 +1394,7 @@ .IR X . The number register .B [P -is set to 1 if the +is set to\ 1 if the .B P field contains a range of pages. The @@ -1235,7 +1402,7 @@ .B [A and .B [O -number registers are set to 1 according as the +number registers are set to\ 1 according as the .BR T , .B A and @@ -1244,7 +1411,7 @@ .BR .?! . The .B [E -number register will be set to 1 if the +number register will be set to\ 1 if the .B [E string contains more than one name. The reference is followed by a call to the @@ -1254,19 +1421,19 @@ the type of the reference. If a reference contains a .B J -field, it will be classified as type 1, +field, it will be classified as type\ 1, otherwise if it contains a .B B -field, it will type 3, +field, it will type\ 3, otherwise if it contains a .B G or .B R -field it will be type 4, +field it will be type\ 4, otherwise if contains a .B I -field it will be type 2, -otherwise it will be type 0. +field it will be type\ 2, +otherwise it will be type\ 0. The second argument is a symbolic name for the type: .BR other , .BR journal-article , @@ -1282,22 +1449,37 @@ macro and followed by a call to the .B ]> macro. +. +. +. .SH FILES +. .Tp \w'\fB@DEFAULT_INDEX@'u+2n .B @DEFAULT_INDEX@ Default database. +. .TP .IB file @INDEX_SUFFIX@ Index files. +. +. +. .SH ENVIRONMENT +. .Tp \w'\fBREFER'u+2n .B REFER If set, overrides the default database. +. +. +. .SH "SEE ALSO" .BR @g@indxbib (@MAN1EXT@), .BR @g@lookbib (@MAN1EXT@), .BR lkbib (@MAN1EXT@) .br +. +. +. .SH BUGS In label expressions, .B <> diff -ruN groff-1.19.1/src/preproc/refer/ref.h groff-1.19.2/src/preproc/refer/ref.h --- groff-1.19.1/src/preproc/refer/ref.h 2000-02-06 10:38:37.000000000 +0100 +++ groff-1.19.2/src/preproc/refer/ref.h 2005-06-16 07:45:45.000000000 +0200 @@ -1,5 +1,5 @@ // -*- C++ -*- -/* Copyright (C) 1989, 1990, 1991, 1992 Free Software Foundation, Inc. +/* Copyright (C) 1989, 1990, 1991, 1992, 2005 Free Software Foundation, Inc. Written by James Clark (jjc@jclark.com) This file is part of groff. @@ -16,7 +16,15 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ + +// declarations to avoid friend name injection problems +int compare_reference(const reference &, const reference &); +int same_reference(const reference &, const reference &); +int same_year(const reference &, const reference &); +int same_date(const reference &, const reference &); +int same_author_last_name(const reference &, const reference &, int); +int same_author_name(const reference &, const reference &, int); struct label_info; diff -ruN groff-1.19.1/src/preproc/refer/token.cpp groff-1.19.2/src/preproc/refer/token.cpp --- groff-1.19.1/src/preproc/refer/token.cpp 2001-04-19 16:01:56.000000000 +0200 +++ groff-1.19.2/src/preproc/refer/token.cpp 2005-05-26 15:37:20.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "refer.h" #include "token.h" diff -ruN groff-1.19.1/src/preproc/refer/token.h groff-1.19.2/src/preproc/refer/token.h --- groff-1.19.1/src/preproc/refer/token.h 2000-02-06 10:38:43.000000000 +0100 +++ groff-1.19.2/src/preproc/refer/token.h 2005-05-26 15:37:20.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ enum token_type { TOKEN_OTHER, diff -ruN groff-1.19.1/src/preproc/soelim/Makefile.sub groff-1.19.2/src/preproc/soelim/Makefile.sub --- groff-1.19.1/src/preproc/soelim/Makefile.sub 2003-04-12 15:53:07.000000000 +0200 +++ groff-1.19.2/src/preproc/soelim/Makefile.sub 2005-05-28 09:08:18.000000000 +0200 @@ -1,6 +1,7 @@ PROG=soelim$(EXEEXT) MAN1=soelim.n XLIBS=$(LIBGROFF) +MLIB=$(LIBM) OBJS=soelim.$(OBJEXT) CCSRCS=$(srcdir)/soelim.cpp NAMEPREFIX=$(g) diff -ruN groff-1.19.1/src/preproc/soelim/soelim.cpp groff-1.19.2/src/preproc/soelim/soelim.cpp --- groff-1.19.1/src/preproc/soelim/soelim.cpp 2004-04-07 17:55:39.000000000 +0200 +++ groff-1.19.2/src/preproc/soelim/soelim.cpp 2005-06-20 21:54:52.000000000 +0200 @@ -1,5 +1,5 @@ // -*- C++ -*- -/* Copyright (C) 1989-1992, 2000, 2001, 2003, 2004 +/* Copyright (C) 1989-1992, 2000, 2001, 2003, 2004, 2005 Free Software Foundation, Inc. Written by James Clark (jjc@jclark.com) @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "lib.h" @@ -159,12 +159,12 @@ &file_name_in_path); int err = errno; string whole_filename(file_name_in_path ? file_name_in_path : filename); + whole_filename += '\0'; a_delete file_name_in_path; if (fp == 0) { error("can't open `%1': %2", whole_filename.contents(), strerror(err)); return 0; } - whole_filename += '\0'; current_filename = whole_filename.contents(); current_lineno = 1; set_location(); diff -ruN groff-1.19.1/src/preproc/soelim/soelim.man groff-1.19.2/src/preproc/soelim/soelim.man --- groff-1.19.1/src/preproc/soelim/soelim.man 2003-10-13 14:26:52.000000000 +0200 +++ groff-1.19.2/src/preproc/soelim/soelim.man 2004-08-07 06:52:54.000000000 +0200 @@ -1,5 +1,6 @@ +'\" p .ig -Copyright (C) 1989-2000, 2001, 2003 Free Software Foundation, Inc. +Copyright (C) 1989-2000, 2001, 2003, 2004 Free Software Foundation, Inc. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice @@ -16,6 +17,9 @@ translations approved by the Free Software Foundation instead of in the original English. .. +. +.mso pic.tmac +. .TH @G@SOELIM @MAN1EXT@ "@MDATE@" "Groff Version @VERSION@" . .SH NAME @@ -99,6 +103,111 @@ .B \-v Print the version number. . +.SH USAGE +The normal processing sequence of groff is this: +. +.PP +.ie t \{\ +.PS +box invisible width 0.5 height 0.4 "input" "file"; +move to last box .bottom; +down; +arrow 0.3; +box invisible width 0.8 height 0.2 "preprocessor"; +move to last box .right +right; +arrow 0.3; +A: box invisible width 0.35 height 0.2 "troff"; +move to last box .top; +up; +move 0.3; +box invisible width 0.6 height 0.4 "sourced" "file"; +line <- up 0.3 from A.top; +move to A.right; +right; +arrow 0.3; +box invisible width 0.85 height 0.2 "postprocessor"; +move to last box .bottom; +down; +arrow 0.3; +box invisible width 0.5 height 0.4 "output" "file" +.PE +.\} +.el \{\ +.nf + input sourced + file file + | | + v v + preprocessor -> troff -> postprocessor + | + v + output + file +.fi +.\} +.PP +. +That is, files sourced with +.B .so +are normally read +.I only +by +.B troff +(the actual formatter). +.B soelim +is +.I not +required for +.B troff +to source files. +. +.PP +If a file to be sourced should also be preprocessed, it must +already be read +.I before +the input file passes through the preprocessor. +This is handled by +.BR soelim : +. +.PP +.ie t \{\ +.PS +box invisible width 0.5 height 0.4 "input" "file"; +move to last box .bottom; +down; +arrow 0.3; +A: box invisible width 0.5 height 0.2 "soelim"; +line <- 0.3; +box invisible width 0.5 height 0.4 "sourced" "file"; +move to A.right; +right; +arrow 0.3; +box invisible width 0.8 height 0.2 "preprocessor"; +arrow 0.3; +box invisible width 0.35 height 0.2 "troff"; +arrow 0.3 +box invisible width 0.85 height 0.2 "postprocessor"; +move to last box .bottom; +down; +arrow 0.3; +box invisible width 0.5 height 0.4 "output" "file" +.PE +.\} +.el \{\ +.nf + input + file + | + v + soelim -> preprocessor -> troff -> postprocessor + ^ | + | v + sourced output + file file +.fi +.\} +. .SH "SEE ALSO" .BR groff (@MAN1EXT@) . diff -ruN groff-1.19.1/src/preproc/tbl/main.cpp groff-1.19.2/src/preproc/tbl/main.cpp --- groff-1.19.1/src/preproc/tbl/main.cpp 2004-04-07 17:21:48.000000000 +0200 +++ groff-1.19.2/src/preproc/tbl/main.cpp 2005-06-15 17:58:30.000000000 +0200 @@ -1,5 +1,5 @@ // -*- C++ -*- -/* Copyright (C) 1989, 1990, 1991, 1992, 2000, 2001, 2002, 2003, 2004 +/* Copyright (C) 1989, 1990, 1991, 1992, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. Written by James Clark (jjc@jclark.com) @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "table.h" @@ -26,11 +26,14 @@ extern "C" const char *Version_string; -static int compatible_flag = 0; +int compatible_flag = 0; class table_input { FILE *fp; - enum { START, MIDDLE, REREAD_T, REREAD_TE, REREAD_E, END, ERROR } state; + enum { START, MIDDLE, + REREAD_T, REREAD_TE, REREAD_E, + LEADER_1, LEADER_2, LEADER_3, LEADER_4, + END, ERROR } state; string unget_stack; public: table_input(FILE *); @@ -117,11 +120,15 @@ } break; case MIDDLE: - // handle line continuation + // handle line continuation and uninterpreted leader character if ((c = getc(fp)) == '\\') { c = getc(fp); if (c == '\n') c = getc(fp); // perhaps state ought to be START now + else if (c == 'a' && compatible_flag) { + state = LEADER_1; + return '\\'; + } else { if (c != EOF) ungetc(c, fp); @@ -152,6 +159,18 @@ case REREAD_E: state = MIDDLE; return 'E'; + case LEADER_1: + state = LEADER_2; + return '*'; + case LEADER_2: + state = LEADER_3; + return '('; + case LEADER_3: + state = LEADER_4; + return PREFIX_CHAR; + case LEADER_4: + state = MIDDLE; + return LEADER_CHAR; case END: case ERROR: return EOF; @@ -1334,13 +1353,19 @@ } break; case GOT_RIGHT_BRACE: + if ((opt->flags & table::NOSPACES)) { + while (c == ' ') + c = in.get(); + if (c == EOF) + break; + } if (c == '\n' || c == tab_char) state = END; else { input_entry += 'T'; input_entry += '}'; input_entry += c; - state = c == '\n' ? START : MIDDLE; + state = MIDDLE; } break; case MIDDLE: @@ -1467,7 +1492,6 @@ void process_table(table_input &in) { - int c; options *opt = 0; format *form = 0; table *tbl = 0; @@ -1479,7 +1503,7 @@ } else { error("giving up on this table"); - while ((c = in.get()) != EOF) + while (in.get() != EOF) ; } delete opt; @@ -1543,10 +1567,8 @@ else { errno = 0; FILE *fp = fopen(argv[i], "r"); - if (fp == 0) { - current_lineno = -1; - error("can't open `%1': %2", argv[i], strerror(errno)); - } + if (fp == 0) + fatal("can't open `%1': %2", argv[i], strerror(errno)); else { current_lineno = 1; current_filename = argv[i]; diff -ruN groff-1.19.1/src/preproc/tbl/Makefile.sub groff-1.19.2/src/preproc/tbl/Makefile.sub --- groff-1.19.1/src/preproc/tbl/Makefile.sub 2003-04-12 15:52:41.000000000 +0200 +++ groff-1.19.2/src/preproc/tbl/Makefile.sub 2005-05-28 07:31:16.000000000 +0200 @@ -1,6 +1,7 @@ PROG=tbl$(EXEEXT) MAN1=tbl.n XLIBS=$(LIBGROFF) +MLIB=$(LIBM) OBJS=\ main.$(OBJEXT) \ table.$(OBJEXT) diff -ruN groff-1.19.1/src/preproc/tbl/table.cpp groff-1.19.2/src/preproc/tbl/table.cpp --- groff-1.19.1/src/preproc/tbl/table.cpp 2004-04-18 12:51:19.000000000 +0200 +++ groff-1.19.2/src/preproc/tbl/table.cpp 2005-05-26 15:37:20.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "table.h" @@ -30,7 +30,6 @@ const int DEFAULT_COLUMN_SEPARATION = 3; #define DELIMITER_CHAR "\\[tbl]" -#define PREFIX "3" #define SEPARATION_FACTOR_REG PREFIX "sep" #define BOTTOM_REG PREFIX "bot" #define RESET_MACRO_NAME PREFIX "init" @@ -64,6 +63,8 @@ // this must be one character #define COMPATIBLE_REG PREFIX "c" +#define LEADER_REG PREFIX LEADER + #define BLOCK_WIDTH_PREFIX PREFIX "tbw" #define BLOCK_DIVERSION_PREFIX PREFIX "tbd" #define BLOCK_HEIGHT_PREFIX PREFIX "tbh" @@ -1695,6 +1696,8 @@ prints(".nr " LINESIZE_REG " \\n[.s]\n"); if (!(flags & CENTER)) prints(".nr " SAVED_CENTER_REG " \\n[.ce]\n"); + if (compatible_flag) + prints(".ds " LEADER_REG " \\a\n"); prints(".de " RESET_MACRO_NAME "\n" ".ft \\n[.f]\n" ".ps \\n[.s]\n" @@ -2604,8 +2607,14 @@ if (e) { if (e->end_row == r && e->start_row == i) { simple_entry *simple = e->to_simple_entry(); - if (simple) + if (simple) { + if (e->end_row != e->start_row) { + prints('\n'); + simple->position_vertically(); + prints("\\&"); + } simple->simple_print(0); + } } c = e->end_col; } diff -ruN groff-1.19.1/src/preproc/tbl/table.h groff-1.19.2/src/preproc/tbl/table.h --- groff-1.19.1/src/preproc/tbl/table.h 2004-04-17 07:20:23.000000000 +0200 +++ groff-1.19.2/src/preproc/tbl/table.h 2005-05-26 15:37:20.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "lib.h" @@ -32,6 +32,14 @@ #include "errarg.h" #include "error.h" +// PREFIX and PREFIX_CHAR must be the same. +#define PREFIX "3" +#define PREFIX_CHAR '3' + +// LEADER and LEADER_CHAR must be the same. +#define LEADER "a" +#define LEADER_CHAR 'a' + struct inc_number { short inc; short val; @@ -153,3 +161,5 @@ }; void set_troff_location(const char *, int); + +extern int compatible_flag; diff -ruN groff-1.19.1/src/preproc/tbl/tbl.man groff-1.19.2/src/preproc/tbl/tbl.man --- groff-1.19.1/src/preproc/tbl/tbl.man 2004-03-11 00:04:29.000000000 +0100 +++ groff-1.19.2/src/preproc/tbl/tbl.man 2004-09-12 08:44:20.000000000 +0200 @@ -63,11 +63,13 @@ .SH OPTIONS .TP .B \-C -Recognize +Enable compatibility mode to +recognize .B .TS and .B .TE even when followed by a character other than space or newline. +Leader characters (\[rs]a) are handled as interpreted. .TP .B \-v Print the version number. @@ -456,7 +458,8 @@ instead of .BR bp . .LP -Using \ea directly in a table to get leaders will not work. +Using \ea directly in a table to get leaders will not work (except in +compatibility mode). This is correct behaviour: \ea is an .B uninterpreted leader. diff -ruN groff-1.19.1/src/roff/groff/groff.cpp groff-1.19.2/src/roff/groff/groff.cpp --- groff-1.19.1/src/roff/groff/groff.cpp 2004-04-07 16:40:23.000000000 +0200 +++ groff-1.19.2/src/roff/groff/groff.cpp 2005-05-26 15:37:20.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ // A front end for groff. diff -ruN groff-1.19.1/src/roff/groff/groff.man groff-1.19.2/src/roff/groff/groff.man --- groff-1.19.1/src/roff/groff/groff.man 2004-01-15 07:39:31.000000000 +0100 +++ groff-1.19.2/src/roff/groff/groff.man 2005-07-03 14:17:00.000000000 +0200 @@ -1,9 +1,9 @@ .ig groff.man -Last update: 13 Jan 2004 +Last update: 01 Jul 2005 -Copyright (C) 1989, 2002, 2003, 2004 Free Software Foundation, Inc. +Copyright (C) 1989, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. Rewritten in 2002 by Bernd Warken Permission is granted to copy, distribute and/or modify this document @@ -461,7 +461,7 @@ because groff does not prepend any dashes before passing it to the postprocessor. . -For example, to pass a title to the gxditview postprocessor, the shell +For example, to pass a title to the \%gxditview postprocessor, the shell command .IP .ShellCommand groff \*[@-]X \*[@-]P \*[@-]title \*[@-]P 'groff it' \f[I]foo\f[] @@ -520,12 +520,21 @@ .OptDef T "" dev Set output device to .IR dev . -Contrary to -.BR @g@troff , +For this device, +.B @g@troff +generates the +.I intermediate +.IR output ; +see +.BR \%groff_out (@MAN5EXT@). +. +Then .B groff calls a postprocessor to convert .BR @g@troff 's -intermediate output to its final format. +.I intermediate output +to its final format. +. Real devices in .B groff are @@ -576,7 +585,7 @@ . .IP The following arguments select -.B gxditview +.B \%gxditview as the `postprocessor' (it is rather a viewing program): . .RS @@ -623,7 +632,7 @@ . .OptDef X Use -.B gxditview +.B \%gxditview instead of using the usual postprocessor to (pre)view a document. . The printing spooler behavior as outlined with options @@ -655,7 +664,7 @@ output is 75\|dpi; this can be changed by passing the .ShortOpt resolution option to -.BR gxditview , +.BR \%gxditview , for example . .IP @@ -669,13 +678,19 @@ . . .OptDef Z -Do not postprocess the output of -.B @g@troff -that is normally -called automatically by -.BR groff . -This will print the intermediate output to standard output; see +Print the +.I groff intermediate output +to standard output; see .BR \%groff_out (@MAN5EXT@). +Normally +.BR groff +calls automatically a postprocessor. +. +With this option, the output of +.B @g@troff +for the device, the so-called +.I intermediate output +is issued without postprocessing. . . .\" -------------------------------------------------------------------- @@ -699,6 +714,10 @@ .OptDef c disable color output. . +Please consult the +.BR \%grotty (@MAN1EXT@) +man page for more details. +. .OptDef C enable compatibility mode. . @@ -776,6 +795,48 @@ . . .\" -------------------------------------------------------------------- +.SS Paper Size +.\" -------------------------------------------------------------------- +. +The +.I virtual +paper size used by +.B troff +to format the input is controlled globally with the requests +.BR .po , +.BR .pl , +and +.BR .ll . +See +.BR groff_tmac (@MAN5EXT@) +for the `papersize' macro package which provides a convenient interface. +. +.P +The +.I physical +paper size, giving the actual dimensions of the paper sheets, is +controlled by output devices like +.BR grops +with the command line options +.B \-p +and +.BR \-l . +See +.BR groff_font (@MAN5EXT@) +and the man pages of the output devices for more details. +.B groff +uses the command line option +.B \-P +to pass options to output devices; for example, the following selects +A4 paper in landscape orientation for the PS device: +. +.RS +.P +groff -Tps -P-pa4 -P-l .\|.\|. +.RE +. +. +.\" -------------------------------------------------------------------- .SS Front-ends .\" -------------------------------------------------------------------- . @@ -939,7 +1000,9 @@ .P Details on the naming of macro files and their placement can be found in -.BR \%groff_tmac (@MAN5EXT@). +.BR \%groff_tmac (@MAN5EXT@); +this man page also documents some other, minor auxiliary macro packages +not mentioned here. . . .\" -------------------------------------------------------------------- @@ -1051,7 +1114,7 @@ .TP .B X75 75dpi X Window System output suitable for the previewers -.BR xditview (1x) +.BR \%xditview (1x) and .BR \%gxditview (@MAN1EXT@). A variant for a 12\|pt document base font is @@ -1060,7 +1123,7 @@ .TP .B X100 100dpi X Window System output suitable for the previewers -.BR xditview (1x) +.BR \%xditview (1x) and .BR \%gxditview (@MAN1EXT@). A variant for a 12\|pt document base font is @@ -1519,7 +1582,7 @@ .SH AUTHORS .\" -------------------------------------------------------------------- . -Copyright \(co 1989, 2002, 2003, 2004 Free Software Foundation, Inc. +Copyright \(co 1989, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. . .P This document is distributed under the terms of the FDL (GNU Free @@ -1534,7 +1597,7 @@ .MTO jjc@jclark.com "James Clark" . . It was rewritten, enhanced, and put under the FDL license by -.MTO bwarken@mayn.de "Bernd Warken" . +\m[blue]Bernd Warken\m[]. . It is maintained by .MTO wl@gnu.org "Werner Lemberg" . @@ -1614,7 +1677,9 @@ .BR ditroff (@MAN7EXT@). . .TP -The intermediate output language: +The +.I intermediate output +language: .BR \%groff_out (@MAN7EXT@). . .TP diff -ruN groff-1.19.1/src/roff/groff/pipeline.c groff-1.19.2/src/roff/groff/pipeline.c --- groff-1.19.1/src/roff/groff/pipeline.c 2004-04-18 08:46:55.000000000 +0200 +++ groff-1.19.2/src/roff/groff/pipeline.c 2005-05-26 15:37:20.000000000 +0200 @@ -1,4 +1,4 @@ -/* Copyright (C) 1989, 1990, 1991, 1992, 2000, 2001, 2002, 2003, 2004 +/* Copyright (C) 1989, 1990, 1991, 1992, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. Written by James Clark (jjc@jclark.com) @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H #include @@ -101,7 +101,6 @@ #include #include -#include #include #include diff -ruN groff-1.19.1/src/roff/groff/pipeline.h groff-1.19.2/src/roff/groff/pipeline.h --- groff-1.19.1/src/roff/groff/pipeline.h 2002-09-22 10:34:04.000000000 +0200 +++ groff-1.19.2/src/roff/groff/pipeline.h 2005-05-26 15:37:20.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef __cplusplus extern "C" { diff -ruN groff-1.19.1/src/roff/grog/grog.pl groff-1.19.2/src/roff/grog/grog.pl --- groff-1.19.1/src/roff/grog/grog.pl 2002-06-08 14:32:00.000000000 +0200 +++ groff-1.19.2/src/roff/grog/grog.pl 2005-05-18 07:33:28.000000000 +0200 @@ -1,4 +1,4 @@ -#!/usr/bin/perl +#! /usr/bin/perl # grog -- guess options for groff command # Inspired by doctype script in Kernighan & Pike, Unix Programming # Environment, pp 306-8. diff -ruN groff-1.19.1/src/roff/grog/grog.sh groff-1.19.2/src/roff/grog/grog.sh --- groff-1.19.1/src/roff/grog/grog.sh 2002-07-09 23:24:39.000000000 +0200 +++ groff-1.19.2/src/roff/grog/grog.sh 2005-05-18 07:33:28.000000000 +0200 @@ -1,4 +1,4 @@ -#!/bin/sh +#! /bin/sh # grog -- guess options for groff command # Like doctype in Kernighan & Pike, Unix Programming Environment, pp 306-8. diff -ruN groff-1.19.1/src/roff/nroff/nroff.man groff-1.19.2/src/roff/nroff/nroff.man --- groff-1.19.1/src/roff/nroff/nroff.man 2004-01-05 23:41:36.000000000 +0100 +++ groff-1.19.2/src/roff/nroff/nroff.man 2005-04-13 07:52:19.000000000 +0200 @@ -1,5 +1,5 @@ .ig -Copyright (C) 1989-2001, 2002, 2003 Free Software Foundation, Inc. +Copyright (C) 1989-2001, 2002, 2003, 2005 Free Software Foundation, Inc. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice @@ -16,9 +16,12 @@ translations approved by the Free Software Foundation instead of in the original English. .. +. .TH @G@NROFF @MAN1EXT@ "@MDATE@" "Groff Version @VERSION@" +. .SH NAME @g@nroff \- emulate nroff command with groff +. .SH SYNOPSIS .nr a \n(.j .ad l @@ -30,8 +33,10 @@ .ie \\n(.$-1 .RI "[\ \fB\\$1\fP" "\\$2" "\ ]" .el .RB "[\ " "\\$1" "\ ]" .. +. .OP \-CchipStUv .OP \-d cs +.OP \-M dir .OP \-m name .OP \-n num .OP \-o list @@ -40,6 +45,7 @@ .RI "[\ " "file" "\ .\|.\|.\ ]" .br .ad \na +. .SH DESCRIPTION The .B @g@nroff @@ -89,6 +95,7 @@ .BR \-d , .BR \-C , .BR \-i , +.BR \-M , .BR \-m , .BR \-n , .BR \-o , @@ -117,6 +124,7 @@ .BR groff . .B \-v shows the version number. +. .SH ENVIRONMENT .TP .SM @@ -130,6 +138,7 @@ so warnings are suppressed. nroff-style character definitions (in the file tty-char.tmac) are also loaded to emulate unrepresentable glyphs. +. .SH "SEE ALSO" .BR groff (@MAN1EXT@), .BR @g@troff (@MAN1EXT@), diff -ruN groff-1.19.1/src/roff/nroff/nroff.sh groff-1.19.2/src/roff/nroff/nroff.sh --- groff-1.19.1/src/roff/nroff/nroff.sh 2004-04-06 16:10:32.000000000 +0200 +++ groff-1.19.2/src/roff/nroff/nroff.sh 2005-06-17 09:19:11.000000000 +0200 @@ -1,4 +1,4 @@ -#!/bin/sh +#! /bin/sh # Emulate nroff with groff. prog="$0" @@ -8,7 +8,7 @@ case "`exec 2>/dev/null ; locale charmap`" in UTF-8) T=-Tutf8 ;; - ISO-8859-1) + ISO-8859-1 | ISO-8859-15) T=-Tlatin1 ;; IBM-1047) T=-Tcp1047 ;; @@ -16,7 +16,8 @@ case "${LC_ALL-${LC_CTYPE-${LANG}}}" in *.UTF-8) T=-Tutf8 ;; - iso_8859_1 | *.ISO-8859-1) + iso_8859_1 | *.ISO-8859-1 | *.ISO8859-1 | \ + iso_8859_15 | *.ISO-8859-15 | *.ISO8859-15) T=-Tlatin1 ;; *.IBM-1047) T=-Tcp1047 ;; @@ -47,10 +48,10 @@ -[eq] | -s*) # ignore these options ;; - -[dmrnoT]) + -[dMmrnoT]) echo "$prog: option $1 requires an argument" >&2 exit 1 ;; - -[iptSUC] | -[dmrno]*) + -[iptSUC] | -[dMmrno]*) opts="$opts $1" ;; -Tascii | -Tlatin1 | -Tutf8 | -Tcp1047) T=$1 ;; @@ -67,8 +68,8 @@ echo "GNU nroff (groff) version @VERSION@" exit 0 ;; --help) - echo "usage: nroff [-CchipStUv] [-dCS] [-mNAME] [-nNUM] [-oLIST] [-rCN]" - echo " [-Tname] [FILE...]" + echo "usage: nroff [-CchipStUv] [-dCS] [-MDIR] [-mNAME] [-nNUM] [-oLIST]" + echo " [-rCN] [-Tname] [FILE...]" exit 0 ;; --) shift diff -ruN groff-1.19.1/src/roff/troff/charinfo.h groff-1.19.2/src/roff/troff/charinfo.h --- groff-1.19.1/src/roff/troff/charinfo.h 2002-12-22 10:26:50.000000000 +0100 +++ groff-1.19.2/src/roff/troff/charinfo.h 2005-05-26 15:37:20.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ class macro; diff -ruN groff-1.19.1/src/roff/troff/column.cpp groff-1.19.2/src/roff/troff/column.cpp --- groff-1.19.1/src/roff/troff/column.cpp 2000-11-13 17:51:31.000000000 +0100 +++ groff-1.19.2/src/roff/troff/column.cpp 2005-05-26 15:37:20.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef COLUMN @@ -666,7 +666,7 @@ node *vjustify_node::copy() { - return new vjustify_node(typ); + return new vjustify_node(typ, div_nest_level); } const char *vjustify_node::type() diff -ruN groff-1.19.1/src/roff/troff/dictionary.cpp groff-1.19.2/src/roff/troff/dictionary.cpp --- groff-1.19.1/src/roff/troff/dictionary.cpp 2004-01-07 00:52:02.000000000 +0100 +++ groff-1.19.2/src/roff/troff/dictionary.cpp 2005-05-26 15:37:20.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "troff.h" diff -ruN groff-1.19.1/src/roff/troff/dictionary.h groff-1.19.2/src/roff/troff/dictionary.h --- groff-1.19.1/src/roff/troff/dictionary.h 2000-02-06 10:36:31.000000000 +0100 +++ groff-1.19.2/src/roff/troff/dictionary.h 2005-05-26 15:37:20.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ diff -ruN groff-1.19.1/src/roff/troff/div.cpp groff-1.19.2/src/roff/troff/div.cpp --- groff-1.19.1/src/roff/troff/div.cpp 2004-04-18 08:59:49.000000000 +0200 +++ groff-1.19.2/src/roff/troff/div.cpp 2005-05-26 15:37:20.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ // diversions @@ -25,6 +25,8 @@ #include "troff.h" #include "dictionary.h" #include "hvunits.h" +#include "stringclass.h" +#include "mtsm.h" #include "env.h" #include "request.h" #include "node.h" @@ -51,7 +53,9 @@ diversion::diversion(symbol s) : prev(0), nm(s), vertical_position(V0), high_water_mark(V0), - no_space_mode(0), marked_place(V0) + any_chars_added(0), no_space_mode(0), needs_push(0), saved_seen_break(0), + saved_seen_space(0), saved_seen_eol(0), saved_suppress_next_eol(0), + marked_place(V0) { } @@ -97,6 +101,10 @@ symbol nm = get_name(); if (nm.is_null()) { if (curdiv->prev) { + curenv->seen_break = curdiv->saved_seen_break; + curenv->seen_space = curdiv->saved_seen_space; + curenv->seen_eol = curdiv->saved_seen_eol; + curenv->suppress_next_eol = curdiv->saved_suppress_next_eol; if (boxing) { curenv->line = curdiv->saved_line; curenv->width_total = curdiv->saved_width_total; @@ -116,6 +124,13 @@ macro_diversion *md = new macro_diversion(nm, append); md->prev = curdiv; curdiv = md; + curdiv->saved_seen_break = curenv->seen_break; + curdiv->saved_seen_space = curenv->seen_space; + curdiv->saved_seen_eol = curenv->seen_eol; + curdiv->saved_suppress_next_eol = curenv->suppress_next_eol; + curenv->seen_break = 0; + curenv->seen_space = 0; + curenv->seen_eol = 0; if (boxing) { curdiv->saved_line = curenv->line; curdiv->saved_width_total = curenv->width_total; @@ -202,7 +217,7 @@ // We can now catch the situation described above by comparing // the length of the charlist in the macro_header with the length // stored in the macro. When we detect this, we copy the contents. - mac = new macro; + mac = new macro(1); if (append) { request_or_macro *rm = (request_or_macro *)request_dictionary.lookup(s); @@ -257,9 +272,8 @@ nd->set_vertical_size(&v); node *temp = nd; nd = nd->next; - if (temp->interpret(mac)) { + if (temp->interpret(mac)) delete temp; - } else { #if 1 temp->freeze_space(); @@ -445,6 +459,9 @@ vunits next_trap_pos; trap *next_trap = find_next_trap(&next_trap_pos); vunits y = vertical_position + n; + if (curenv->get_vertical_spacing().to_units()) + curenv->seen_space += n.to_units() + / curenv->get_vertical_spacing().to_units(); if (vertical_position_traps_flag && next_trap != 0 && y >= next_trap_pos) { vertical_position = next_trap_pos; nl_reg_contents = vertical_position.to_units(); @@ -639,7 +656,7 @@ n = topdiv->prev_page_offset; topdiv->prev_page_offset = topdiv->page_offset; topdiv->page_offset = n; - curenv->add_html_tag(0, ".po", n.to_units()); + topdiv->modified_tag.incl(MTSM_PO); skip_line(); } @@ -732,11 +749,11 @@ skip_line(); } -/* It is necessary to generate a break before before reading the argument, -because otherwise arguments using | will be wrong. But if we just +/* It is necessary to generate a break before reading the argument, +because otherwise arguments using | will be wrong. But if we just generate a break as usual, then the line forced out may spring a trap and thus push a macro onto the input stack before we have had a chance -to read the argument to the sp request. We resolve this dilemma by +to read the argument to the sp request. We resolve this dilemma by setting, before generating the break, a flag which will postpone the actual pushing of the macro associated with the trap sprung by the outputting of the line forced out by the break till after we have read @@ -758,17 +775,15 @@ else // The line might have had line spacing that was truncated. truncated_space += n; - curenv->add_html_tag(1, ".sp", n.to_units()); + tok.next(); } void blank_line() { curenv->do_break(); - if (!trap_sprung_flag && !curdiv->no_space_mode) { + if (!trap_sprung_flag && !curdiv->no_space_mode) curdiv->space(curenv->get_vertical_spacing()); - curenv->add_html_tag(1, ".sp", 1); - } else truncated_space += curenv->get_vertical_spacing(); } @@ -832,7 +847,6 @@ curenv->do_break(); if (the_output) the_output->flush(); - curenv->add_html_tag(1, ".fl"); tok.next(); } diff -ruN groff-1.19.1/src/roff/troff/div.h groff-1.19.2/src/roff/troff/div.h --- groff-1.19.1/src/roff/troff/div.h 2004-04-17 06:51:40.000000000 +0200 +++ groff-1.19.2/src/roff/troff/div.h 2005-06-15 22:16:27.000000000 +0200 @@ -1,5 +1,5 @@ // -*- C++ -*- -/* Copyright (C) 1989, 1990, 1991, 1992, 2001, 2002, 2004 +/* Copyright (C) 1989, 1990, 1991, 1992, 2001, 2002, 2004, 2005 Free Software Foundation, Inc. Written by James Clark (jjc@jclark.com) @@ -17,7 +17,11 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ + +void do_divert(int append, int boxing); +void end_diversions(); +void page_offset(); class diversion { friend void do_divert(int append, int boxing); @@ -34,7 +38,14 @@ vunits vertical_position; vunits high_water_mark; public: + int any_chars_added; int no_space_mode; + int needs_push; + int saved_seen_break; + int saved_seen_space; + int saved_seen_eol; + int saved_suppress_next_eol; + state_set modified_tag; vunits marked_place; diversion(symbol s = NULL_SYMBOL); virtual ~diversion(); @@ -54,6 +65,7 @@ virtual void set_diversion_trap(symbol, vunits) = 0; virtual void clear_diversion_trap() = 0; virtual void copy_file(const char *filename) = 0; + virtual int is_diversion() = 0; }; class macro; @@ -78,6 +90,7 @@ void set_diversion_trap(symbol, vunits); void clear_diversion_trap(); void copy_file(const char *filename); + int is_diversion() { return 1; } }; struct trap { @@ -134,6 +147,7 @@ void set_diversion_trap(symbol, vunits); void clear_diversion_trap(); void set_last_page() { last_page_count = page_count; } + int is_diversion() { return 0; } }; extern top_level_diversion *topdiv; diff -ruN groff-1.19.1/src/roff/troff/env.cpp groff-1.19.2/src/roff/troff/env.cpp --- groff-1.19.1/src/roff/troff/env.cpp 2004-05-05 20:09:05.000000000 +0200 +++ groff-1.19.2/src/roff/troff/env.cpp 2005-05-26 15:37:20.000000000 +0200 @@ -1,5 +1,5 @@ // -*- C++ -*- -/* Copyright (C) 1989, 1990, 1991, 1992, 2000, 2001, 2002, 2003, 2004 +/* Copyright (C) 1989, 1990, 1991, 1992, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. Written by James Clark (jjc@jclark.com) @@ -17,11 +17,13 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "troff.h" #include "dictionary.h" #include "hvunits.h" +#include "stringclass.h" +#include "mtsm.h" #include "env.h" #include "request.h" #include "node.h" @@ -51,6 +53,8 @@ dictionary env_dictionary(10); environment *curenv; static int next_line_number = 0; +extern int suppress_push; +extern statem *get_diversion_state(); charinfo *field_delimiter_char; charinfo *padding_indicator_char; @@ -60,6 +64,7 @@ class pending_output_line { node *nd; int no_fill; + int was_centered; vunits vs; vunits post_vs; hunits width; @@ -69,20 +74,21 @@ public: pending_output_line *next; - pending_output_line(node *, int, vunits, vunits, hunits, + pending_output_line(node *, int, vunits, vunits, hunits, int, pending_output_line * = 0); ~pending_output_line(); int output(); #ifdef WIDOW_CONTROL friend void environment::mark_last_line(); - friend void environment::output(node *, int, vunits, vunits, hunits); + friend void environment::output(node *, int, vunits, vunits, hunits, int); #endif /* WIDOW_CONTROL */ }; pending_output_line::pending_output_line(node *n, int nf, vunits v, vunits pv, - hunits w, pending_output_line *p) -: nd(n), no_fill(nf), vs(v), post_vs(pv), width(w), + hunits w, int ce, + pending_output_line *p) +: nd(n), no_fill(nf), was_centered(ce), vs(v), post_vs(pv), width(w), #ifdef WIDOW_CONTROL last_line(0), #endif /* WIDOW_CONTROL */ @@ -108,6 +114,7 @@ } } #endif + curenv->construct_format_state(nd, was_centered, !no_fill); curdiv->output(nd, no_fill, vs, post_vs, width); nd = 0; return 1; @@ -115,7 +122,7 @@ void environment::output(node *nd, int no_fill_flag, vunits vs, vunits post_vs, - hunits width) + hunits width, int was_centered) { #ifdef WIDOW_CONTROL while (pending_lines) { @@ -135,13 +142,14 @@ && (!widow_control || no_fill_flag) #endif /* WIDOW_CONTROL */ ) { + curenv->construct_format_state(nd, was_centered, !no_fill_flag); curdiv->output(nd, no_fill_flag, vs, post_vs, width); - emitted_node = 1; } else { pending_output_line **p; for (p = &pending_lines; *p; p = &(*p)->next) ; - *p = new pending_output_line(nd, no_fill_flag, vs, post_vs, width); + *p = new pending_output_line(nd, no_fill_flag, vs, post_vs, width, + was_centered); } } @@ -155,7 +163,7 @@ curdiv->output(nd, no_fill_flag, vs, post_vs, width); else pending_lines = new pending_output_line(nd, no_fill_flag, vs, post_vs, - width, pending_lines); + width, 0, pending_lines); } void environment::output_pending_lines() @@ -266,6 +274,7 @@ void environment::add_char(charinfo *ci) { int s; + node *gc_np = 0; if (interrupted) ; // don't allow fields in dummy environments @@ -281,18 +290,40 @@ if (tab_contents == 0) tab_contents = new line_start_node; if (ci != hyphen_indicator_char) - tab_contents = tab_contents->add_char(ci, this, &tab_width, &s); + tab_contents = tab_contents->add_char(ci, this, &tab_width, &s, &gc_np); else tab_contents = tab_contents->add_discretionary_hyphen(); } else { if (line == 0) start_line(); +#if 0 + fprintf(stderr, "current line is\n"); + line->debug_node_list(); +#endif if (ci != hyphen_indicator_char) - line = line->add_char(ci, this, &width_total, &space_total); + line = line->add_char(ci, this, &width_total, &space_total, &gc_np); else line = line->add_discretionary_hyphen(); } +#if 0 + fprintf(stderr, "now after we have added character the line is\n"); + line->debug_node_list(); +#endif + if ((!suppress_push) && gc_np) { + if (gc_np && (gc_np->state == 0)) { + gc_np->state = construct_state(0); + gc_np->push_state = get_diversion_state(); + } + else if (line && (line->state == 0)) { + line->state = construct_state(0); + line->push_state = get_diversion_state(); + } + } +#if 0 + fprintf(stderr, "now we have possibly added the state the line is\n"); + line->debug_node_list(); +#endif } node *environment::make_char_node(charinfo *ci) @@ -304,6 +335,12 @@ { if (n == 0) return; + if (!suppress_push) { + if (n->is_special && n->state == NULL) + n->state = construct_state(0); + n->push_state = get_diversion_state(); + } + if (current_tab || current_field) n->freeze_space(); if (interrupted) { @@ -327,10 +364,10 @@ space_total += n->nspaces(); n->next = line; line = n; + construct_new_line_state(line); } } - void environment::add_hyphen_indicator() { if (current_tab || interrupted || current_field @@ -614,7 +651,6 @@ width_total(0), space_total(0), input_line_start(0), - tabs(units_per_inch/2, TAB_LEFT), line_tabs(0), current_tab(TAB_NONE), leader_node(0), @@ -641,12 +677,15 @@ #ifdef WIDOW_CONTROL widow_control(0), #endif /* WIDOW_CONTROL */ - ignore_next_eol(0), - emitted_node(0), glyph_color(&default_color), prev_glyph_color(&default_color), fill_color(&default_color), prev_fill_color(&default_color), + seen_space(0), + seen_eol(0), + suppress_next_eol(0), + seen_break(0), + tabs(units_per_inch/2, TAB_LEFT), name(nm), control_char('.'), no_break_control_char('\''), @@ -704,7 +743,6 @@ width_total(0), space_total(0), input_line_start(0), - tabs(e->tabs), line_tabs(e->line_tabs), current_tab(TAB_NONE), leader_node(0), @@ -731,12 +769,15 @@ #ifdef WIDOW_CONTROL widow_control(e->widow_control), #endif /* WIDOW_CONTROL */ - ignore_next_eol(0), - emitted_node(0), glyph_color(e->glyph_color), prev_glyph_color(e->prev_glyph_color), fill_color(e->fill_color), prev_fill_color(e->prev_fill_color), + seen_space(e->seen_space), + seen_eol(e->seen_eol), + suppress_next_eol(e->suppress_next_eol), + seen_break(e->seen_break), + tabs(e->tabs), name(e->name), // so that eg `.if "\n[.ev]"0"' works control_char(e->control_char), no_break_control_char(e->no_break_control_char), @@ -818,8 +859,6 @@ hyphenation_space = e->hyphenation_space; hyphenation_margin = e->hyphenation_margin; composite = 0; - ignore_next_eol = e->ignore_next_eol; - emitted_node = e->emitted_node; glyph_color= e->glyph_color; prev_glyph_color = e->prev_glyph_color; fill_color = e->fill_color; @@ -1091,7 +1130,13 @@ error("environment stack underflow"); } else { + int seen_space = curenv->seen_space; + int seen_eol = curenv->seen_eol; + int suppress_next_eol = curenv->suppress_next_eol; curenv = env_stack->env; + curenv->seen_space = seen_space; + curenv->seen_eol = seen_eol; + curenv->suppress_next_eol = suppress_next_eol; env_list *tem = env_stack; env_stack = env_stack->next; delete tem; @@ -1128,6 +1173,26 @@ skip_line(); } +void fill_color_change() +{ + symbol s = get_name(); + if (s.is_null()) + curenv->set_fill_color(curenv->get_prev_fill_color()); + else + do_fill_color(s); + skip_line(); +} + +void glyph_color_change() +{ + symbol s = get_name(); + if (s.is_null()) + curenv->set_glyph_color(curenv->get_prev_glyph_color()); + else + do_glyph_color(s); + skip_line(); +} + static symbol P_symbol("P"); void font_change() @@ -1166,7 +1231,6 @@ if (n <= 0) n = 1; curenv->set_size(n); - curenv->add_html_tag(0, ".ps", n); } else curenv->set_size(0); @@ -1234,8 +1298,6 @@ if (break_flag) curenv->do_break(); curenv->fill = 1; - curenv->add_html_tag(1, ".fi"); - curenv->add_html_tag(0, ".br"); tok.next(); } @@ -1246,9 +1308,7 @@ if (break_flag) curenv->do_break(); curenv->fill = 0; - curenv->add_html_tag(1, ".nf"); - curenv->add_html_tag(0, ".br"); - curenv->add_html_tag(0, ".po", topdiv->get_page_offset().to_units()); + curenv->suppress_next_eol = 1; tok.next(); } @@ -1265,7 +1325,7 @@ curenv->do_break(); curenv->right_justify_lines = 0; curenv->center_lines = n; - curenv->add_html_tag(1, ".ce", n); + curdiv->modified_tag.incl(MTSM_CE); tok.next(); } @@ -1282,7 +1342,7 @@ curenv->do_break(); curenv->center_lines = 0; curenv->right_justify_lines = n; - curenv->add_html_tag(1, ".rj", n); + curdiv->modified_tag.incl(MTSM_RJ); tok.next(); } @@ -1299,7 +1359,7 @@ temp = curenv->prev_line_length; curenv->prev_line_length = curenv->line_length; curenv->line_length = temp; - curenv->add_html_tag(1, ".ll", temp.to_units()); + curdiv->modified_tag.incl(MTSM_LL); skip_line(); } @@ -1386,8 +1446,7 @@ curenv->have_temporary_indent = 0; curenv->prev_indent = curenv->indent; curenv->indent = temp; - if (break_flag) - curenv->add_html_tag(1, ".in", temp.to_units()); + curdiv->modified_tag.incl(MTSM_IN); tok.next(); } @@ -1408,7 +1467,7 @@ if (!err) { curenv->temporary_indent = temp; curenv->have_temporary_indent = 1; - curenv->add_html_tag(1, ".ti", temp.to_units()); + curdiv->modified_tag.incl(MTSM_TI); } tok.next(); } @@ -1625,6 +1684,7 @@ void environment::newline() { + int was_centered = 0; if (underline_lines > 0) { if (--underline_lines == 0) { prev_fontno = fontno; @@ -1663,11 +1723,7 @@ if (x > H0) saved_indent += x/2; to_be_output = line; - if (is_html) { - node *n = make_html_tag("eol.ce"); - n->next = to_be_output; - to_be_output = n; - } + was_centered = 1; to_be_output_width = width_total; line = 0; } @@ -1690,14 +1746,14 @@ input_line_start = line == 0 ? H0 : width_total; if (to_be_output) { if (is_html && !fill) { - if (curdiv == topdiv) { - node *n = make_html_tag("eol"); - - n->next = to_be_output; - to_be_output = n; - } + curdiv->modified_tag.incl(MTSM_EOL); + if (suppress_next_eol) + suppress_next_eol = 0; + else + seen_eol = 1; } - output_line(to_be_output, to_be_output_width); + + output_line(to_be_output, to_be_output_width, was_centered); hyphen_line_count = 0; } if (input_trap_count > 0) { @@ -1707,7 +1763,7 @@ } } -void environment::output_line(node *n, hunits width) +void environment::output_line(node *n, hunits width, int was_centered) { prev_text_length = width; if (margin_character_flags) { @@ -1766,7 +1822,8 @@ width += w; ++next_line_number; } - output(nn, !fill, vertical_spacing, total_post_vertical_spacing(), width); + output(nn, !fill, vertical_spacing, total_post_vertical_spacing(), width, + was_centered); } void environment::start_line() @@ -2014,6 +2071,7 @@ void environment::possibly_break_line(int start_here, int forced) { + int was_centered = center_lines > 0; if (!fill || current_tab || current_field || dummy) return; while (line != 0 @@ -2043,6 +2101,7 @@ break; case ADJUST_CENTER: saved_indent += (target_text_length - bp->width)/2; + was_centered = 1; break; case ADJUST_RIGHT: saved_indent += target_text_length - bp->width; @@ -2080,7 +2139,7 @@ } // Do output_line() here so that line will be 0 iff the // the environment will be empty. - output_line(pre, output_width); + output_line(pre, output_width, was_centered); while (to_be_discarded != 0) { tem = to_be_discarded; to_be_discarded = to_be_discarded->next; @@ -2143,45 +2202,8 @@ do_break(); } -/* - * add_html_tag - emits a special html-tag: to help post-grohtml understand - * the key troff commands - */ - -void environment::add_html_tag(int force, const char *nm) -{ - if (!force && (curdiv != topdiv)) - return; - - if (is_html) { - /* - * need to emit tag for post-grohtml - * but we check to see whether we can emit specials - */ - if (curdiv == topdiv && topdiv->before_first_page) - topdiv->begin_page(); - macro *m = new macro; - m->append_str("html-tag:"); - for (const char *p = nm; *p; p++) - if (!invalid_input_char((unsigned char)*p)) - m->append(*p); - curdiv->output(new special_node(*m), 1, 0, 0, 0); - if (strcmp(nm, ".nf") == 0) - curenv->ignore_next_eol = 1; - } -} - -/* - * add_html_tag - emits a special html-tag: to help post-grohtml understand - * the key troff commands, it appends a string representation - * of i. - */ - -void environment::add_html_tag(int force, const char *nm, int i) +node *environment::make_tag(const char *nm, int i) { - if (!force && (curdiv != topdiv)) - return; - if (is_html) { /* * need to emit tag for post-grohtml @@ -2190,103 +2212,119 @@ if (curdiv == topdiv && topdiv->before_first_page) topdiv->begin_page(); macro *m = new macro; - m->append_str("html-tag:"); + m->append_str("devtag:"); for (const char *p = nm; *p; p++) if (!invalid_input_char((unsigned char)*p)) m->append(*p); m->append(' '); m->append_int(i); - node *n = new special_node(*m); - curdiv->output(n, 1, 0, 0, 0); + return new special_node(*m); } + return 0; } -/* - * add_html_tag_tabs - emits the tab settings for post-grohtml - */ - -void environment::add_html_tag_tabs(int force) +void environment::dump_troff_state() { - if (!force && (curdiv != topdiv)) - return; +#define SPACES " " + fprintf(stderr, SPACES "register `in' = %d\n", curenv->indent.to_units()); + if (curenv->have_temporary_indent) + fprintf(stderr, SPACES "register `ti' = %d\n", + curenv->temporary_indent.to_units()); + fprintf(stderr, SPACES "centered lines `ce' = %d\n", curenv->center_lines); + fprintf(stderr, SPACES "register `ll' = %d\n", + curenv->line_length.to_units()); + fprintf(stderr, SPACES "fill `fi=1/nf=0' = %d\n", curenv->fill); + fprintf(stderr, SPACES "page offset `po' = %d\n", + topdiv->get_page_offset().to_units()); + fprintf(stderr, SPACES "seen_break = %d\n", curenv->seen_break); + fprintf(stderr, SPACES "seen_space = %d\n", curenv->seen_space); + fflush(stderr); +#undef SPACES +} +statem *environment::construct_state(int only_eol) +{ if (is_html) { - /* - * need to emit tag for post-grohtml - * but we check to see whether we can emit specials - */ - if (curdiv == topdiv && topdiv->before_first_page) - topdiv->begin_page(); - macro *m = new macro; - hunits d, l; - enum tab_type t; - m->append_str("html-tag:.ta "); - do { - t = curenv->tabs.distance_to_next_tab(l, &d); - l += d; - switch (t) { - case TAB_LEFT: - m->append_str(" L "); - m->append_int(l.to_units()); - break; - case TAB_CENTER: - m->append_str(" C "); - m->append_int(l.to_units()); - break; - case TAB_RIGHT: - m->append_str(" R "); - m->append_int(l.to_units()); - break; - case TAB_NONE: - break; - } - } while ((t != TAB_NONE) && (l < get_line_length())); - curdiv->output(new special_node(*m), 1, 0, 0, 0); + statem *s = new statem(); + if (!only_eol) { + s->add_tag(MTSM_IN, indent); + s->add_tag(MTSM_LL, line_length); + s->add_tag(MTSM_PO, topdiv->get_page_offset().to_units()); + s->add_tag(MTSM_RJ, right_justify_lines); + if (have_temporary_indent) + s->add_tag(MTSM_TI, temporary_indent); + s->add_tag_ta(); + if (seen_break) + s->add_tag(MTSM_BR); + if (seen_space != 0) + s->add_tag(MTSM_SP, seen_space); + seen_break = 0; + seen_space = 0; + } + if (seen_eol) { + s->add_tag(MTSM_EOL); + s->add_tag(MTSM_CE, center_lines); + } + seen_eol = 0; + return s; } + else + return NULL; } -node *environment::make_html_tag(const char *nm, int i) +void environment::construct_format_state(node *n, int was_centered, + int filling) { if (is_html) { - /* - * need to emit tag for post-grohtml - * but we check to see whether we can emit specials - */ - if (curdiv == topdiv && topdiv->before_first_page) - topdiv->begin_page(); - macro *m = new macro; - m->append_str("html-tag:"); - for (const char *p = nm; *p; p++) - if (!invalid_input_char((unsigned char)*p)) - m->append(*p); - m->append(' '); - m->append_int(i); - return new special_node(*m); + // find first glyph node which has a state. + while (n != 0 && n->state == 0) + n = n->next; + if (n == 0 || (n->state == 0)) + return; + if (seen_space != 0) + n->state->add_tag(MTSM_SP, seen_space); + if (seen_eol && topdiv == curdiv) + n->state->add_tag(MTSM_EOL); + seen_space = 0; + seen_eol = 0; + if (was_centered) + n->state->add_tag(MTSM_CE, center_lines+1); + else + n->state->add_tag_if_unknown(MTSM_CE, 0); + n->state->add_tag_if_unknown(MTSM_FI, filling); + n = n->next; + while (n != 0) { + if (n->state != 0) { + n->state->sub_tag_ce(); + n->state->add_tag_if_unknown(MTSM_FI, filling); + } + n = n->next; + } } - return 0; } -node *environment::make_html_tag(const char *nm) +void environment::construct_new_line_state(node *n) { if (is_html) { - /* - * need to emit tag for post-grohtml - * but we check to see whether we can emit specials - */ - if (curdiv == topdiv && topdiv->before_first_page) - topdiv->begin_page(); - macro *m = new macro; - m->append_str("html-tag:"); - for (const char *p = nm; *p; p++) - if (!invalid_input_char((unsigned char)*p)) - m->append(*p); - return new special_node(*m); + // find first glyph node which has a state. + while (n != 0 && n->state == 0) + n = n->next; + if (n == 0 || n->state == 0) + return; + if (seen_space != 0) + n->state->add_tag(MTSM_SP, seen_space); + if (seen_eol && topdiv == curdiv) + n->state->add_tag(MTSM_EOL); + seen_space = 0; + seen_eol = 0; } - return 0; } +extern int global_diverted_space; + void environment::do_break(int do_spread) { + int was_centered = 0; if (curdiv == topdiv && topdiv->before_first_page) { topdiv->begin_page(); return; @@ -2313,6 +2351,7 @@ switch (adjust_mode) { case ADJUST_CENTER: saved_indent += (target_text_length - width_total)/2; + was_centered = 1; break; case ADJUST_RIGHT: saved_indent += target_text_length - width_total; @@ -2321,7 +2360,7 @@ } node *tem = line; line = 0; - output_line(tem, width_total); + output_line(tem, width_total, was_centered); hyphen_line_count = 0; } prev_line_interrupted = 0; @@ -2329,6 +2368,10 @@ mark_last_line(); output_pending_lines(); #endif /* WIDOW_CONTROL */ + if (!global_diverted_space) { + curdiv->modified_tag.incl(MTSM_BR); + seen_break = 1; + } } int environment::is_empty() @@ -2340,10 +2383,8 @@ { while (!tok.newline() && !tok.eof()) tok.next(); - if (break_flag) { + if (break_flag) curenv->do_break(spread); - curenv->add_html_tag(0, ".br"); - } tok.next(); } @@ -2750,7 +2791,7 @@ } } curenv->tabs = tabs; - curenv->add_html_tag_tabs(1); + curdiv->modified_tag.incl(MTSM_TA); skip_line(); } @@ -2872,14 +2913,14 @@ case TAB_NONE: return; case TAB_LEFT: + add_node(make_tag("tab L", absolute.to_units())); add_node(make_tab_node(d)); - add_node(make_html_tag("tab L", absolute.to_units())); return; case TAB_RIGHT: - add_node(make_html_tag("tab R", absolute.to_units())); + add_node(make_tag("tab R", absolute.to_units())); break; case TAB_CENTER: - add_node(make_html_tag("tab C", absolute.to_units())); + add_node(make_tag("tab C", absolute.to_units())); break; default: assert(0); @@ -3109,6 +3150,12 @@ return f.contents(); } +const char *environment::get_style_name_string() +{ + symbol f = get_style_name(fontno); + return f.contents(); +} + const char *environment::get_name_string() { return name.contents(); @@ -3200,7 +3247,9 @@ init_request("fam", family_change); init_request("fc", field_characters); init_request("fi", fill); + init_request("fcolor", fill_color_change); init_request("ft", font_change); + init_request("gcolor", glyph_color_change); init_request("hc", hyphen_char); init_request("hlm", hyphen_line_max_request); init_request("hy", hyphenate_request); @@ -3271,6 +3320,7 @@ init_int_env_reg(".ss", get_space_size); init_int_env_reg(".sss", get_sentence_space_size); init_string_env_reg(".sr", get_requested_point_size_string); + init_string_env_reg(".sty", get_style_name_string); init_string_env_reg(".tabs", get_tabs); init_int_env_reg(".u", get_fill); init_vunits_env_reg(".v", get_vertical_spacing); diff -ruN groff-1.19.1/src/roff/troff/env.h groff-1.19.2/src/roff/troff/env.h --- groff-1.19.1/src/roff/troff/env.h 2004-04-17 07:08:17.000000000 +0200 +++ groff-1.19.2/src/roff/troff/env.h 2005-06-15 22:30:41.000000000 +0200 @@ -1,5 +1,5 @@ // -*- C++ -*- -/* Copyright (C) 1989, 1990, 1991, 1992, 2000, 2001, 2002, 2004 +/* Copyright (C) 1989, 1990, 1991, 1992, 2000, 2001, 2002, 2004, 2005 Free Software Foundation, Inc. Written by James Clark (jjc@jclark.com) @@ -17,7 +17,9 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ + +class statem; struct size_range { int min; @@ -100,6 +102,47 @@ class font_family; class pending_output_line; +// declarations to avoid friend name injection problems +void title_length(); +void space_size(); +void fill(); +void no_fill(); +void adjust(); +void no_adjust(); +void center(); +void right_justify(); +void vertical_spacing(); +void post_vertical_spacing(); +void line_spacing(); +void line_length(); +void indent(); +void temporary_indent(); +void do_underline(int); +void do_input_trap(int); +void set_tabs(); +void margin_character(); +void no_number(); +void number_lines(); +void leader_character(); +void tab_character(); +void hyphenate_request(); +void no_hyphenate(); +void hyphen_line_max_request(); +void hyphenation_space_request(); +void hyphenation_margin_request(); +void line_width(); +#if 0 +void tabs_save(); +void tabs_restore(); +#endif +void line_tabs_request(); +void title(); +#ifdef WIDOW_CONTROL +void widow_control_request(); +#endif /* WIDOW_CONTROL */ + +void do_divert(int append, int boxing); + class environment { int dummy; // dummy environment used for \w hunits prev_line_length; @@ -147,7 +190,6 @@ hunits width_total; int space_total; hunits input_line_start; - tab_stops tabs; node *tab_contents; hunits tab_width; hunits tab_distance; @@ -183,8 +225,6 @@ #ifdef WIDOW_CONTROL int widow_control; #endif /* WIDOW_CONTROL */ - int ignore_next_eol; - int emitted_node; // have we emitted a node since the last html eol tag? color *glyph_color; color *prev_glyph_color; color *fill_color; @@ -193,9 +233,9 @@ tab_type distance_to_next_tab(hunits *); tab_type distance_to_next_tab(hunits *distance, hunits *leftpos); void start_line(); - void output_line(node *, hunits); + void output_line(node *, hunits, int); void output(node *nd, int retain_size, vunits vs, vunits post_vs, - hunits width); + hunits width, int was_centered); void output_title(node *nd, int retain_size, vunits vs, vunits post_vs, hunits width); #ifdef WIDOW_CONTROL @@ -209,6 +249,11 @@ node *make_tab_node(hunits d, node *next = 0); node *get_prev_char(); public: + int seen_space; + int seen_eol; + int suppress_next_eol; + int seen_break; + tab_stops tabs; const symbol name; unsigned char control_char; unsigned char no_break_control_char; @@ -217,14 +262,15 @@ environment(symbol); environment(const environment *); // for temporary environment ~environment(); + statem *construct_state(int only_eol); void copy(const environment *); int is_dummy() { return dummy; } int is_empty(); int is_composite() { return composite; } void set_composite() { composite = 1; } - vunits get_vertical_spacing(); // .v - vunits get_post_vertical_spacing(); // .pvs - int get_line_spacing(); // .L + vunits get_vertical_spacing(); // .v + vunits get_post_vertical_spacing(); // .pvs + int get_line_spacing(); // .L vunits total_post_vertical_spacing(); int get_point_size() { return size.to_scaled_points(); } font_size get_font_size() { return size; } @@ -233,23 +279,23 @@ int get_char_height() { return char_height; } int get_char_slant() { return char_slant; } hunits get_digit_width(); - int get_font() { return fontno; }; // .f + int get_font() { return fontno; }; // .f font_family *get_family() { return family; } - int get_bold(); // .b - int get_adjust_mode(); // .j - int get_fill(); // .u - hunits get_indent(); // .i + int get_bold(); // .b + int get_adjust_mode(); // .j + int get_fill(); // .u + hunits get_indent(); // .i hunits get_temporary_indent(); - hunits get_line_length(); // .l - hunits get_saved_line_length(); // .ll - hunits get_saved_indent(); // .in + hunits get_line_length(); // .l + hunits get_saved_line_length(); // .ll + hunits get_saved_indent(); // .in hunits get_title_length(); - hunits get_prev_char_width(); // .w + hunits get_prev_char_width(); // .w hunits get_prev_char_skew(); vunits get_prev_char_height(); vunits get_prev_char_depth(); - hunits get_text_length(); // .k - hunits get_prev_text_length(); // .n + hunits get_text_length(); // .k + hunits get_prev_text_length(); // .n hunits get_space_width() { return env_space_width(this); } int get_space_size() { return space_size; } // in ems/36 int get_sentence_space_size() { return sentence_space_size; } @@ -289,13 +335,9 @@ void possibly_break_line(int start_here = 0, int forced = 0); void do_break(int spread = 0); // .br void final_break(); - void add_html_tag(int, const char *); - void add_html_tag(int, const char *, int); - void add_html_tag_tabs(int); - node *make_html_tag(const char *name, int i); - node *make_html_tag(const char *); + node *make_tag(const char *name, int i); void newline(); - void handle_tab(int is_leader = 0); // do a tab or leader + void handle_tab(int is_leader = 0); // do a tab or leader void add_node(node *); void add_char(charinfo *); void add_hyphen_indicator(); @@ -307,10 +349,14 @@ const char *get_fill_color_string(); const char *get_font_family_string(); const char *get_font_name_string(); + const char *get_style_name_string(); const char *get_name_string(); const char *get_point_size_string(); const char *get_requested_point_size_string(); void output_pending_lines(); + void construct_format_state(node *n, int was_centered, int fill); + void construct_new_line_state(node *n); + void dump_troff_state(); friend void title_length(); friend void space_size(); diff -ruN groff-1.19.1/src/roff/troff/hvunits.h groff-1.19.2/src/roff/troff/hvunits.h --- groff-1.19.1/src/roff/troff/hvunits.h 2000-02-06 10:36:40.000000000 +0100 +++ groff-1.19.2/src/roff/troff/hvunits.h 2005-05-26 15:37:20.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ class vunits { diff -ruN groff-1.19.1/src/roff/troff/input.cpp groff-1.19.2/src/roff/troff/input.cpp --- groff-1.19.1/src/roff/troff/input.cpp 2004-05-05 18:41:58.000000000 +0200 +++ groff-1.19.2/src/roff/troff/input.cpp 2005-06-15 22:22:40.000000000 +0200 @@ -1,5 +1,5 @@ // -*- C++ -*- -/* Copyright (C) 1989, 1990, 1991, 1992, 2000, 2001, 2002, 2003, 2004 +/* Copyright (C) 1989, 1990, 1991, 1992, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. Written by James Clark (jjc@jclark.com) @@ -17,23 +17,26 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#define DEBUGGING #include "troff.h" #include "dictionary.h" #include "hvunits.h" +#include "stringclass.h" +#include "mtsm.h" #include "env.h" #include "request.h" #include "node.h" -#include "reg.h" #include "token.h" #include "div.h" +#include "reg.h" #include "charinfo.h" -#include "stringclass.h" -#include "font.h" #include "macropath.h" -#include "defs.h" #include "input.h" +#include "defs.h" +#include "font.h" #include "unicode.h" // Needed for getpid() and isatty() @@ -102,7 +105,7 @@ int ascii_output_flag = 0; int suppress_output_flag = 0; int is_html = 0; -int begin_level = 0; // number of nested .begin requests +int begin_level = 0; // number of nested \O escapes int have_input = 0; // whether \f, \F, \D'F...', \H, \m, \M, // \R, \s, or \S has been processed in @@ -117,6 +120,7 @@ double warn_scale; char warn_scaling_indicator; +int debug_state = 0; // turns on debugging of the html troff state search_path *mac_path = &safer_macro_path; @@ -154,6 +158,9 @@ input_iterator *make_temp_iterator(const char *); const char *input_char_description(int); +void process_input_stack(); +void chop_macro(); // declare to avoid friend name injection + void set_escape_char() { @@ -193,9 +200,12 @@ class input_iterator { public: input_iterator(); + input_iterator(int is_div); virtual ~input_iterator() {} int get(node **); friend class input_stack; + int is_diversion; + statem *diversion_state; protected: const unsigned char *ptr; const unsigned char *eptr; @@ -212,7 +222,6 @@ virtual int next_file(FILE *, const char *) { return 0; } virtual void shift(int) {} virtual int is_boundary() {return 0; } - virtual int internal_level() { return 0; } virtual int is_file() { return 0; } virtual int is_macro() { return 0; } virtual void save_compatible_flag(int) {} @@ -220,7 +229,12 @@ }; input_iterator::input_iterator() -: ptr(0), eptr(0) +: is_diversion(0), ptr(0), eptr(0) +{ +} + +input_iterator::input_iterator(int is_div) +: is_diversion(is_div), ptr(0), eptr(0) { } @@ -414,16 +428,21 @@ static int is_return_boundary(); static void remove_boundary(); static int get_level(); + static int get_div_level(); + static void increase_level(); + static void decrease_level(); static void clear(); static void pop_macro(); static void save_compatible_flag(int); static int get_compatible_flag(); - + static statem *get_diversion_state(); + static void check_end_diversion(input_iterator *t); static int limit; + static int div_level; + static statem *diversion_state; private: static input_iterator *top; static int level; - static int finish_get(node **); static int finish_peek(); }; @@ -431,10 +450,29 @@ input_iterator *input_stack::top = &nil_iterator; int input_stack::level = 0; int input_stack::limit = DEFAULT_INPUT_STACK_LIMIT; +int input_stack::div_level = 0; +statem *input_stack::diversion_state = NULL; +int suppress_push=0; + inline int input_stack::get_level() { - return level + top->internal_level(); + return level; +} + +inline void input_stack::increase_level() +{ + level++; +} + +inline void input_stack::decrease_level() +{ + level--; +} + +inline int input_stack::get_div_level() +{ + return div_level; } inline int input_stack::get(node **np) @@ -456,6 +494,13 @@ if (top == &nil_iterator) break; input_iterator *tem = top; + check_end_diversion(tem); +#if defined(DEBUGGING) + if (debug_state) + if (tem->is_diversion) + fprintf(stderr, + "in diversion level = %d\n", input_stack::get_div_level()); +#endif top = top->next; level--; delete tem; @@ -471,6 +516,14 @@ return (top->ptr < top->eptr) ? *top->ptr : finish_peek(); } +void input_stack::check_end_diversion(input_iterator *t) +{ + if (t->is_diversion) { + div_level--; + diversion_state = t->diversion_state; + } +} + int input_stack::finish_peek() { for (;;) { @@ -480,6 +533,7 @@ if (top == &nil_iterator) break; input_iterator *tem = top; + check_end_diversion(tem); top = top->next; level--; delete tem; @@ -509,6 +563,8 @@ { assert(top->is_boundary()); input_iterator *temp = top->next; + check_end_diversion(top); + delete top; top = temp; level--; @@ -522,6 +578,38 @@ fatal("input stack limit exceeded (probable infinite loop)"); in->next = top; top = in; + if (top->is_diversion) { + div_level++; + in->diversion_state = diversion_state; + diversion_state = curenv->construct_state(0); +#if defined(DEBUGGING) + if (debug_state) { + curenv->dump_troff_state(); + fflush(stderr); + } +#endif + } +#if defined(DEBUGGING) + if (debug_state) + if (top->is_diversion) { + fprintf(stderr, + "in diversion level = %d\n", input_stack::get_div_level()); + fflush(stderr); + } +#endif +} + +statem *get_diversion_state() +{ + return input_stack::get_diversion_state(); +} + +statem *input_stack::get_diversion_state() +{ + if (diversion_state == NULL) + return NULL; + else + return new statem(diversion_state); } input_iterator *input_stack::get_arg(int i) @@ -600,6 +688,7 @@ for (input_iterator **pp = ⊤ *pp != &nil_iterator; pp = &(*pp)->next) if ((*pp)->is_file()) { input_iterator *tem = *pp; + check_end_diversion(tem); *pp = (*pp)->next; delete tem; level--; @@ -614,6 +703,7 @@ if (top->is_boundary()) nboundaries++; input_iterator *tem = top; + check_end_diversion(tem); top = top->next; level--; delete tem; @@ -634,6 +724,7 @@ nboundaries++; is_macro = top->is_macro(); input_iterator *tem = top; + check_end_diversion(tem); top = top->next; level--; delete tem; @@ -834,6 +925,28 @@ { for (;;) { int c = input_stack::get(nd); + if (c == PUSH_GROFF_MODE) { + input_stack::save_compatible_flag(compatible_flag); + compatible_flag = 0; + continue; + } + if (c == PUSH_COMP_MODE) { + input_stack::save_compatible_flag(compatible_flag); + compatible_flag = 1; + continue; + } + if (c == POP_GROFFCOMP_MODE) { + compatible_flag = input_stack::get_compatible_flag(); + continue; + } + if (c == BEGIN_QUOTE) { + input_stack::increase_level(); + continue; + } + if (c == END_QUOTE) { + input_stack::decrease_level(); + continue; + } if (c == ESCAPE_NEWLINE) { if (defining) return c; @@ -996,6 +1109,7 @@ int same(node *); const char *type(); int force_tprint(); + int is_tag(); }; int non_interpreted_char_node::same(node *nd) @@ -1013,6 +1127,11 @@ return 0; } +int non_interpreted_char_node::is_tag() +{ + return 0; +} + non_interpreted_char_node::non_interpreted_char_node(unsigned char n) : c(n) { assert(n != 0); @@ -1460,6 +1579,7 @@ int same(node *); const char *type(); int force_tprint(); + int is_tag(); }; token_node::token_node(const token &t) : tk(t) @@ -1491,6 +1611,11 @@ return 0; } +int token_node::is_tag() +{ + return 0; +} + token::token() : nd(0), type(TOKEN_EMPTY) { } @@ -1557,13 +1682,23 @@ if (cc != escape_char || escape_char == 0) { handle_normal_char: switch(cc) { - case COMPATIBLE_SAVE: + case PUSH_GROFF_MODE: input_stack::save_compatible_flag(compatible_flag); compatible_flag = 0; continue; - case COMPATIBLE_RESTORE: + case PUSH_COMP_MODE: + input_stack::save_compatible_flag(compatible_flag); + compatible_flag = 1; + continue; + case POP_GROFFCOMP_MODE: compatible_flag = input_stack::get_compatible_flag(); continue; + case BEGIN_QUOTE: + input_stack::increase_level(); + continue; + case END_QUOTE: + input_stack::decrease_level(); + continue; case EOF: type = TOKEN_EOF; return; @@ -2534,12 +2669,16 @@ return 0; } +int global_diverted_space = 0; + int diverted_space_node::reread(int *bolp) { + global_diverted_space = 1; if (curenv->get_fill()) trapping_blank_line(); else curdiv->space(n); + global_diverted_space = 0; *bolp = 1; return 1; } @@ -2596,10 +2735,33 @@ tok.next(); } while (tok.white_space()); symbol nm = get_name(); +#if defined(DEBUGGING) + if (debug_state) { + if (! nm.is_null()) { + if (strcmp(nm.contents(), "test") == 0) { + fprintf(stderr, "found it!\n"); + fflush(stderr); + } + fprintf(stderr, "interpreting [%s]", nm.contents()); + if (strcmp(nm.contents(), "di") == 0 && topdiv != curdiv) + fprintf(stderr, " currently in diversion: %s", + curdiv->get_diversion_name()); + fprintf(stderr, "\n"); + fflush(stderr); + } + } +#endif if (nm.is_null()) skip_line(); - else + else { interpolate_macro(nm); +#if defined(DEBUGGING) + if (debug_state) { + fprintf(stderr, "finished interpreting [%s] and environment state is\n", nm.contents()); + curenv->dump_troff_state(); + } +#endif + } suppress_next = 1; } else { @@ -2607,6 +2769,11 @@ ; else { for (;;) { +#if defined(DEBUGGING) + if (debug_state) { + fprintf(stderr, "found [%c]\n", ch); fflush(stderr); + } +#endif curenv->add_char(charset_table[ch]); tok.next(); if (tok.type != token::TOKEN_CHAR) @@ -2984,6 +3151,7 @@ } macro::macro() +: is_a_diversion(0) { if (!input_stack::get_location(1, &filename, &lineno)) { filename = 0; @@ -2995,13 +3163,30 @@ } macro::macro(const macro &m) -: p(m.p), filename(m.filename), lineno(m.lineno), len(m.len), - empty_macro(m.empty_macro) +: filename(m.filename), lineno(m.lineno), len(m.len), + empty_macro(m.empty_macro), is_a_diversion(m.is_a_diversion), p(m.p) { if (p != 0) p->count++; } +macro::macro(int is_div) + : is_a_diversion(is_div) +{ + if (!input_stack::get_location(1, &filename, &lineno)) { + filename = 0; + lineno = 0; + } + len = 0; + empty_macro = 1; + p = 0; +} + +int macro::is_diversion() +{ + return is_a_diversion; +} + macro ¯o::operator=(const macro &m) { // don't assign object @@ -3014,6 +3199,7 @@ lineno = m.lineno; len = m.len; empty_macro = m.empty_macro; + is_a_diversion = m.is_a_diversion; return *this; } @@ -3030,7 +3216,7 @@ } p->cl.append(c); ++len; - if (c != COMPATIBLE_SAVE && c != COMPATIBLE_RESTORE) + if (c != PUSH_GROFF_MODE && c != PUSH_COMP_MODE && c != POP_GROFFCOMP_MODE) empty_macro = 0; } @@ -3164,11 +3350,12 @@ void backtrace(); void save_compatible_flag(int f) { saved_compatible_flag = f; } int get_compatible_flag() { return saved_compatible_flag; } + int is_diversion(); }; string_iterator::string_iterator(const macro &m, const char *p, symbol s) -: mac(m), how_invoked(p), - newline_flag(0), lineno(1), nm(s) +: input_iterator(m.is_a_diversion), mac(m), how_invoked(p), newline_flag(0), + lineno(1), nm(s) { count = mac.len; if (count != 0) { @@ -3194,6 +3381,11 @@ count = 0; } +int string_iterator::is_diversion() +{ + return mac.is_diversion(); +} + int string_iterator::fill(node **np) { if (newline_flag) @@ -3207,8 +3399,13 @@ p = bp->s; } if (*p == '\0') { - if (np) + if (np) { *np = nd->copy(); + if (is_diversion()) + (*np)->div_nest_level = input_stack::get_div_level(); + else + (*np)->div_nest_level = 0; + } nd = nd->next; eptr = ptr = p + 1; count--; @@ -3396,6 +3593,7 @@ void add_arg(const macro &m); void shift(int n); int is_macro() { return 1; } + int is_diversion(); }; input_iterator *macro_iterator::get_arg(int i) @@ -3519,12 +3717,13 @@ macro arg; int quote_input_level = 0; int done_tab_warning = 0; - if (c == '\"') { + if (c == '"') { quote_input_level = input_stack::get_level(); c = get_copy(&n); } + arg.append(compatible_flag ? PUSH_COMP_MODE : PUSH_GROFF_MODE); while (c != EOF && c != '\n' && !(c == ' ' && quote_input_level == 0)) { - if (quote_input_level > 0 && c == '\"' + if (quote_input_level > 0 && c == '"' && (compatible_flag || input_stack::get_level() == quote_input_level)) { c = get_copy(&n); @@ -3548,6 +3747,7 @@ c = get_copy(&n); } } + arg.append(POP_GROFFCOMP_MODE); mi->add_arg(arg); } } @@ -3569,14 +3769,14 @@ macro arg; int quote_input_level = 0; int done_tab_warning = 0; - if (c == '\"') { + if (c == '"') { quote_input_level = input_stack::get_level(); c = get_copy(&n); } while (c != EOF && c != '\n' && !(c == ']' && quote_input_level == 0) && !(c == ' ' && quote_input_level == 0)) { - if (quote_input_level > 0 && c == '\"' + if (quote_input_level > 0 && c == '"' && input_stack::get_level() == quote_input_level) { c = get_copy(&n); if (c == '"') { @@ -3828,7 +4028,7 @@ enum define_mode { DEFINE_NORMAL, DEFINE_APPEND, DEFINE_IGNORE }; enum calling_mode { CALLING_NORMAL, CALLING_INDIRECT }; -enum comp_mode { COMP_IGNORE, COMP_DISABLE }; +enum comp_mode { COMP_IGNORE, COMP_DISABLE, COMP_ENABLE }; void do_define_string(define_mode mode, comp_mode comp) { @@ -3861,7 +4061,9 @@ if (mode == DEFINE_APPEND && mm) mac = *mm; if (comp == COMP_DISABLE) - mac.append(COMPATIBLE_SAVE); + mac.append(PUSH_GROFF_MODE); + else if (comp == COMP_ENABLE) + mac.append(PUSH_COMP_MODE); while (c != '\n' && c != EOF) { if (c == 0) mac.append(n); @@ -3873,15 +4075,16 @@ mm = new macro; request_dictionary.define(nm, mm); } - if (comp == COMP_DISABLE) - mac.append(COMPATIBLE_RESTORE); + if (comp == COMP_DISABLE || comp == COMP_ENABLE) + mac.append(POP_GROFFCOMP_MODE); *mm = mac; tok.next(); } void define_string() { - do_define_string(DEFINE_NORMAL, COMP_IGNORE); + do_define_string(DEFINE_NORMAL, + compatible_flag ? COMP_ENABLE: COMP_IGNORE); } void define_nocomp_string() @@ -3891,7 +4094,8 @@ void append_string() { - do_define_string(DEFINE_APPEND, COMP_IGNORE); + do_define_string(DEFINE_APPEND, + compatible_flag ? COMP_ENABLE : COMP_IGNORE); } void append_nocomp_string() @@ -4003,26 +4207,6 @@ } } -/* This class is used for the implementation of \$@. It is used for -each of the closing double quotes. It artificially increases the -input level by 2, so that the closing double quote will appear to have -the same input level as the opening quote. */ - -class end_quote_iterator : public input_iterator { - unsigned char buf[1]; -public: - end_quote_iterator(); - ~end_quote_iterator() { } - int internal_level() { return 2; } -}; - -end_quote_iterator::end_quote_iterator() -{ - buf[0] = '"'; - ptr = buf; - eptr = buf + 1; -} - static void interpolate_arg(symbol nm) { const char *s = nm.contents(); @@ -4031,17 +4215,39 @@ else if (s[1] == 0 && csdigit(s[0])) input_stack::push(input_stack::get_arg(s[0] - '0')); else if (s[0] == '*' && s[1] == '\0') { - for (int i = input_stack::nargs(); i > 0; i--) { - input_stack::push(input_stack::get_arg(i)); - if (i != 1) - input_stack::push(make_temp_iterator(" ")); + int limit = input_stack::nargs(); + string args; + for (int i = 1; i <= limit; i++) { + input_iterator *p = input_stack::get_arg(i); + int c; + while ((c = p->get(0)) != EOF) + args += c; + if (i != limit) + args += ' '; + } + if (limit > 0) { + args += '\0'; + input_stack::push(make_temp_iterator(args.contents())); } } else if (s[0] == '@' && s[1] == '\0') { - for (int i = input_stack::nargs(); i > 0; i--) { - input_stack::push(new end_quote_iterator); - input_stack::push(input_stack::get_arg(i)); - input_stack::push(make_temp_iterator(i == 1 ? "\"" : " \"")); + int limit = input_stack::nargs(); + string args; + for (int i = 1; i <= limit; i++) { + args += '"'; + args += BEGIN_QUOTE; + input_iterator *p = input_stack::get_arg(i); + int c; + while ((c = p->get(0)) != EOF) + args += c; + args += END_QUOTE; + args += '"'; + if (i != limit) + args += ' '; + } + if (limit > 0) { + args += '\0'; + input_stack::push(make_temp_iterator(args.contents())); } } else { @@ -4148,7 +4354,9 @@ } int bol = 1; if (comp == COMP_DISABLE) - mac.append(COMPATIBLE_SAVE); + mac.append(PUSH_GROFF_MODE); + else if (comp == COMP_ENABLE) + mac.append(PUSH_COMP_MODE); for (;;) { while (c == ESCAPE_NEWLINE) { if (mode == DEFINE_NORMAL || mode == DEFINE_APPEND) @@ -4184,8 +4392,8 @@ mm = new macro; request_dictionary.define(nm, mm); } - if (comp == COMP_DISABLE) - mac.append(COMPATIBLE_RESTORE); + if (comp == COMP_DISABLE || comp == COMP_ENABLE) + mac.append(POP_GROFFCOMP_MODE); *mm = mac; } if (term != dot_symbol) { @@ -4235,7 +4443,8 @@ void define_macro() { - do_define_macro(DEFINE_NORMAL, CALLING_NORMAL, COMP_IGNORE); + do_define_macro(DEFINE_NORMAL, CALLING_NORMAL, + compatible_flag ? COMP_ENABLE : COMP_IGNORE); } void define_nocomp_macro() @@ -4245,7 +4454,8 @@ void define_indirect_macro() { - do_define_macro(DEFINE_NORMAL, CALLING_INDIRECT, COMP_IGNORE); + do_define_macro(DEFINE_NORMAL, CALLING_INDIRECT, + compatible_flag ? COMP_ENABLE : COMP_IGNORE); } void define_indirect_nocomp_macro() @@ -4255,7 +4465,8 @@ void append_macro() { - do_define_macro(DEFINE_APPEND, CALLING_NORMAL, COMP_IGNORE); + do_define_macro(DEFINE_APPEND, CALLING_NORMAL, + compatible_flag ? COMP_ENABLE : COMP_IGNORE); } void append_nocomp_macro() @@ -4265,7 +4476,8 @@ void append_indirect_macro() { - do_define_macro(DEFINE_APPEND, CALLING_INDIRECT, COMP_IGNORE); + do_define_macro(DEFINE_APPEND, CALLING_INDIRECT, + compatible_flag ? COMP_ENABLE : COMP_IGNORE); } void append_indirect_nocomp_macro() @@ -4330,11 +4542,12 @@ // we have to check for additional save/restore pairs which could be // there due to empty am1 requests. for (;;) { - if (m->get(m->len - 1) != COMPATIBLE_RESTORE) + if (m->get(m->len - 1) != POP_GROFFCOMP_MODE) break; have_restore = 1; m->len -= 1; - if (m->get(m->len - 1) != COMPATIBLE_SAVE) + if (m->get(m->len - 1) != PUSH_GROFF_MODE + && m->get(m->len - 1) != PUSH_COMP_MODE) break; have_restore = 0; m->len -= 1; @@ -4345,7 +4558,7 @@ error("cannot chop empty macro"); else { if (have_restore) - m->set(COMPATIBLE_RESTORE, m->len - 1); + m->set(POP_GROFFCOMP_MODE, m->len - 1); else m->len -= 1; } @@ -4370,7 +4583,9 @@ string_iterator iter1(*m); for (int l = 0; l < m->len; l++) { int c = iter1.get(0); - if (c == COMPATIBLE_SAVE || c == COMPATIBLE_RESTORE) + if (c == PUSH_GROFF_MODE + || c == PUSH_COMP_MODE + || c == POP_GROFFCOMP_MODE) continue; if (c == EOF) break; @@ -4412,7 +4627,9 @@ int i; for (i = 0; i < start; i++) { int c = iter.get(0); - while (c == COMPATIBLE_SAVE || c == COMPATIBLE_RESTORE) + while (c == PUSH_GROFF_MODE + || c == PUSH_COMP_MODE + || c == POP_GROFFCOMP_MODE) c = iter.get(0); if (c == EOF) break; @@ -4421,7 +4638,9 @@ for (; i <= end; i++) { node *nd = 0; // pacify compiler int c = iter.get(&nd); - while (c == COMPATIBLE_SAVE || c == COMPATIBLE_RESTORE) + while (c == PUSH_GROFF_MODE + || c == PUSH_COMP_MODE + || c == POP_GROFFCOMP_MODE) c = iter.get(0); if (c == EOF) break; @@ -4887,6 +5106,7 @@ int same(node *); const char *type(); int force_tprint(); + int is_tag(); }; non_interpreted_node::non_interpreted_node(const macro &m) : mac(m) @@ -4913,6 +5133,11 @@ return 0; } +int non_interpreted_node::is_tag() +{ + return 0; +} + node *non_interpreted_node::copy() { return new non_interpreted_node(mac); @@ -5270,6 +5495,24 @@ result = character_exists(ci, curenv); tok.next(); } + else if (c == 'F') { + tok.next(); + symbol nm = get_long_name(1); + if (nm.is_null()) { + skip_alternative(); + return 0; + } + result = check_font(curenv->get_family()->nm, nm); + } + else if (c == 'S') { + tok.next(); + symbol nm = get_long_name(1); + if (nm.is_null()) { + skip_alternative(); + return 0; + } + result = check_style(nm); + } else if (tok.space()) result = 0; else if (tok.delimiter()) { @@ -5279,6 +5522,7 @@ environment env2(curenv); environment *oldenv = curenv; curenv = &env1; + suppress_push = 1; for (int i = 0; i < 2; i++) { for (;;) { tok.next(); @@ -5302,6 +5546,7 @@ delete_node_list(n2); curenv = oldenv; have_input = 0; + suppress_push = 0; tok.next(); } else { @@ -5761,8 +6006,9 @@ case ESCAPE_COLON: buf[1] = ':'; break; - case COMPATIBLE_SAVE: - case COMPATIBLE_RESTORE: + case PUSH_GROFF_MODE: + case PUSH_COMP_MODE: + case POP_GROFFCOMP_MODE: buf[0] = '\0'; break; default: @@ -5813,6 +6059,52 @@ return buf; } +void tag() +{ + if (!tok.newline() && !tok.eof()) { + string s; + int c; + for (;;) { + c = get_copy(0); + if (c == '"') { + c = get_copy(0); + break; + } + if (c != ' ' && c != '\t') + break; + } + s = "x X "; + for (; c != '\n' && c != EOF; c = get_copy(0)) + s += (char)c; + s += '\n'; + curenv->add_node(new tag_node(s, 0)); + } + tok.next(); +} + +void taga() +{ + if (!tok.newline() && !tok.eof()) { + string s; + int c; + for (;;) { + c = get_copy(0); + if (c == '"') { + c = get_copy(0); + break; + } + if (c != ' ' && c != '\t') + break; + } + s = "x X "; + for (; c != '\n' && c != EOF; c = get_copy(0)) + s += (char)c; + s += '\n'; + curenv->add_node(new tag_node(s, 1)); + } + tok.next(); +} + // .tm, .tm1, and .tmc void do_terminal(int newline, int string_like) @@ -6981,8 +7273,12 @@ { "version", no_argument, 0, 'v' }, { 0, 0, 0, 0 } }; - while ((c = getopt_long(argc, argv, "abciI:vw:W:zCEf:m:n:o:r:d:F:M:T:tqs:RU", - long_options, 0)) +#if defined(DEBUGGING) +#define DEBUG_OPTION "D" +#endif + while ((c = getopt_long(argc, argv, + "abciI:vw:W:zCEf:m:n:o:r:d:F:M:T:tqs:RU" + DEBUG_OPTION, long_options, 0)) != EOF) switch(c) { case 'v': @@ -7075,6 +7371,11 @@ case 'U': safer_flag = 0; // unsafe behaviour break; +#if defined(DEBUGGING) + case 'D': + debug_state = 1; + break; +#endif case CHAR_MAX + 1: // --help usage(stdout, argv[0]); exit(0); @@ -7310,6 +7611,8 @@ init_request("spreadwarn", spreadwarn_request); init_request("substring", substring_request); init_request("sy", system_request); + init_request("tag", tag); + init_request("taga", taga); init_request("tm", terminal); init_request("tm1", terminal1); init_request("tmc", terminal_continue); diff -ruN groff-1.19.1/src/roff/troff/input.h groff-1.19.2/src/roff/troff/input.h --- groff-1.19.1/src/roff/troff/input.h 2001-05-07 01:29:21.000000000 +0200 +++ groff-1.19.2/src/roff/troff/input.h 2005-05-26 15:37:21.000000000 +0200 @@ -1,5 +1,5 @@ // -*- C++ -*- -/* Copyright (C) 2001 Free Software Foundation, Inc. +/* Copyright (C) 2001, 2004 Free Software Foundation, Inc. Written by James Clark (jjc@jclark.com) This file is part of groff. @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ /* special character codes */ @@ -54,8 +54,11 @@ const int ESCAPE_RIGHT_PARENTHESIS = 0206; const int ESCAPE_TILDE = 0207; const int ESCAPE_COLON = 0210; -const int COMPATIBLE_SAVE = 0211; -const int COMPATIBLE_RESTORE = 0212; +const int PUSH_GROFF_MODE = 0211; +const int PUSH_COMP_MODE = 0212; +const int POP_GROFFCOMP_MODE = 0213; +const int BEGIN_QUOTE = 0214; +const int END_QUOTE = 0215; #else /* IS_EBCDIC_HOST */ @@ -90,7 +93,13 @@ const int ESCAPE_RIGHT_PARENTHESIS = 066; const int ESCAPE_TILDE = 067; const int ESCAPE_COLON = 070; -const int COMPATIBLE_SAVE = 071; -const int COMPATIBLE_RESTORE = 072; +const int PUSH_GROFF_MODE = 071; +const int PUSH_COMP_MODE = 072; +const int POP_GROFFCOMP_MODE = 073; +const int BEGIN_QUOTE = 074; +const int END_QUOTE = 075; #endif /* IS_EBCDIC_HOST */ + +extern void do_glyph_color(symbol); +extern void do_fill_color(symbol); diff -ruN groff-1.19.1/src/roff/troff/Makefile.sub groff-1.19.2/src/roff/troff/Makefile.sub --- groff-1.19.1/src/roff/troff/Makefile.sub 2004-01-06 23:49:05.000000000 +0100 +++ groff-1.19.2/src/roff/troff/Makefile.sub 2004-10-10 21:57:20.000000000 +0200 @@ -8,6 +8,7 @@ env.$(OBJEXT) \ input.$(OBJEXT) \ majorminor.$(OBJEXT) \ + mtsm.$(OBJEXT) \ node.$(OBJEXT) \ number.$(OBJEXT) \ reg.$(OBJEXT) @@ -17,6 +18,7 @@ $(srcdir)/env.cpp \ $(srcdir)/input.cpp \ majorminor.cpp \ + $(srcdir)/mtsm.cpp \ $(srcdir)/node.cpp \ $(srcdir)/number.cpp \ $(srcdir)/reg.cpp @@ -27,6 +29,7 @@ $(srcdir)/env.h \ $(srcdir)/hvunits.h \ $(srcdir)/input.h \ + $(srcdir)/mtsm.h \ $(srcdir)/node.h \ $(srcdir)/reg.h \ $(srcdir)/request.h \ diff -ruN groff-1.19.1/src/roff/troff/mtsm.cpp groff-1.19.2/src/roff/troff/mtsm.cpp --- groff-1.19.1/src/roff/troff/mtsm.cpp 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/roff/troff/mtsm.cpp 2005-05-26 15:37:21.000000000 +0200 @@ -0,0 +1,632 @@ +// -*- C++ -*- +/* Copyright (C) 2003, 2004 Free Software Foundation, Inc. + Written by Gaius Mulley (gaius@glam.ac.uk) + +This file is part of groff. + +groff 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. + +groff 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 groff; see the file COPYING. If not, write to the Free Software +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#define DEBUGGING + +extern int debug_state; + +#include "troff.h" +#include "hvunits.h" +#include "stringclass.h" +#include "mtsm.h" +#include "env.h" + +static int no_of_statems = 0; // debugging aid + +int_value::int_value() +: value(0), is_known(0) +{ +} + +int_value::~int_value() +{ +} + +void int_value::diff(FILE *fp, const char *s, int_value compare) +{ + if (differs(compare)) { + fputs("x X ", fp); + fputs(s, fp); + fputs(" ", fp); + fputs(i_to_a(compare.value), fp); + fputs("\n", fp); + value = compare.value; + is_known = 1; + if (debug_state) + fflush(fp); + } +} + +void int_value::set(int v) +{ + is_known = 1; + value = v; +} + +void int_value::unset() +{ + is_known = 0; +} + +void int_value::set_if_unknown(int v) +{ + if (!is_known) + set(v); +} + +int int_value::differs(int_value compare) +{ + return compare.is_known + && (!is_known || value != compare.value); +} + +bool_value::bool_value() +{ +} + +bool_value::~bool_value() +{ +} + +void bool_value::diff(FILE *fp, const char *s, bool_value compare) +{ + if (differs(compare)) { + fputs("x X ", fp); + fputs(s, fp); + fputs("\n", fp); + value = compare.value; + is_known = 1; + if (debug_state) + fflush(fp); + } +} + +units_value::units_value() +{ +} + +units_value::~units_value() +{ +} + +void units_value::diff(FILE *fp, const char *s, units_value compare) +{ + if (differs(compare)) { + fputs("x X ", fp); + fputs(s, fp); + fputs(" ", fp); + fputs(i_to_a(compare.value), fp); + fputs("\n", fp); + value = compare.value; + is_known = 1; + if (debug_state) + fflush(fp); + } +} + +void units_value::set(hunits v) +{ + is_known = 1; + value = v.to_units(); +} + +int units_value::differs(units_value compare) +{ + return compare.is_known + && (!is_known || value != compare.value); +} + +string_value::string_value() +: value(string("")), is_known(0) +{ +} + +string_value::~string_value() +{ +} + +void string_value::diff(FILE *fp, const char *s, string_value compare) +{ + if (differs(compare)) { + fputs("x X ", fp); + fputs(s, fp); + fputs(" ", fp); + fputs(compare.value.contents(), fp); + fputs("\n", fp); + value = compare.value; + is_known = 1; + } +} + +void string_value::set(string v) +{ + is_known = 1; + value = v; +} + +void string_value::unset() +{ + is_known = 0; +} + +int string_value::differs(string_value compare) +{ + return compare.is_known + && (!is_known || value != compare.value); +} + +statem::statem() +{ + issue_no = no_of_statems; + no_of_statems++; +} + +statem::statem(statem *copy) +{ + int i; + for (i = 0; i < LAST_BOOL; i++) + bool_values[i] = copy->bool_values[i]; + for (i = 0; i < LAST_INT; i++) + int_values[i] = copy->int_values[i]; + for (i = 0; i < LAST_UNITS; i++) + units_values[i] = copy->units_values[i]; + for (i = 0; i < LAST_STRING; i++) + string_values[i] = copy->string_values[i]; + issue_no = copy->issue_no; +} + +statem::~statem() +{ +} + +void statem::flush(FILE *fp, statem *compare) +{ + int_values[MTSM_FI].diff(fp, "devtag:.fi", + compare->int_values[MTSM_FI]); + int_values[MTSM_RJ].diff(fp, "devtag:.rj", + compare->int_values[MTSM_RJ]); + int_values[MTSM_SP].diff(fp, "devtag:.sp", + compare->int_values[MTSM_SP]); + units_values[MTSM_IN].diff(fp, "devtag:.in", + compare->units_values[MTSM_IN]); + units_values[MTSM_LL].diff(fp, "devtag:.ll", + compare->units_values[MTSM_LL]); + units_values[MTSM_PO].diff(fp, "devtag:.po", + compare->units_values[MTSM_PO]); + string_values[MTSM_TA].diff(fp, "devtag:.ta", + compare->string_values[MTSM_TA]); + units_values[MTSM_TI].diff(fp, "devtag:.ti", + compare->units_values[MTSM_TI]); + int_values[MTSM_CE].diff(fp, "devtag:.ce", + compare->int_values[MTSM_CE]); + bool_values[MTSM_EOL].diff(fp, "devtag:.eol", + compare->bool_values[MTSM_EOL]); + bool_values[MTSM_BR].diff(fp, "devtag:.br", + compare->bool_values[MTSM_BR]); + if (debug_state) { + fprintf(stderr, "compared state %d\n", compare->issue_no); + fflush(stderr); + } +} + +void statem::add_tag(int_value_state t, int v) +{ + int_values[t].set(v); +} + +void statem::add_tag(units_value_state t, hunits v) +{ + units_values[t].set(v); +} + +void statem::add_tag(bool_value_state t) +{ + bool_values[t].set(1); +} + +void statem::add_tag(string_value_state t, string v) +{ + string_values[t].set(v); +} + +void statem::add_tag_if_unknown(int_value_state t, int v) +{ + int_values[t].set_if_unknown(v); +} + +void statem::sub_tag_ce() +{ + int_values[MTSM_CE].unset(); +} + +/* + * add_tag_ta - add the tab settings to the minimum troff state machine + */ + +void statem::add_tag_ta() +{ + if (is_html) { + string s = string(""); + hunits d, l; + enum tab_type t; + do { + t = curenv->tabs.distance_to_next_tab(l, &d); + l += d; + switch (t) { + case TAB_LEFT: + s += " L "; + s += as_string(l.to_units()); + break; + case TAB_CENTER: + s += " C "; + s += as_string(l.to_units()); + break; + case TAB_RIGHT: + s += " R "; + s += as_string(l.to_units()); + break; + case TAB_NONE: + break; + } + } while (t != TAB_NONE && l < curenv->get_line_length()); + s += '\0'; + string_values[MTSM_TA].set(s); + } +} + +void statem::update(statem *older, statem *newer, int_value_state t) +{ + if (newer->int_values[t].differs(older->int_values[t]) + && !newer->int_values[t].is_known) + newer->int_values[t].set(older->int_values[t].value); +} + +void statem::update(statem *older, statem *newer, units_value_state t) +{ + if (newer->units_values[t].differs(older->units_values[t]) + && !newer->units_values[t].is_known) + newer->units_values[t].set(older->units_values[t].value); +} + +void statem::update(statem *older, statem *newer, bool_value_state t) +{ + if (newer->bool_values[t].differs(older->bool_values[t]) + && !newer->bool_values[t].is_known) + newer->bool_values[t].set(older->bool_values[t].value); +} + +void statem::update(statem *older, statem *newer, string_value_state t) +{ + if (newer->string_values[t].differs(older->string_values[t]) + && !newer->string_values[t].is_known) + newer->string_values[t].set(older->string_values[t].value); +} + +void statem::merge(statem *newer, statem *older) +{ + if (newer == 0 || older == 0) + return; + update(older, newer, MTSM_EOL); + update(older, newer, MTSM_BR); + update(older, newer, MTSM_FI); + update(older, newer, MTSM_LL); + update(older, newer, MTSM_PO); + update(older, newer, MTSM_RJ); + update(older, newer, MTSM_SP); + update(older, newer, MTSM_TA); + update(older, newer, MTSM_TI); + update(older, newer, MTSM_CE); +} + +stack::stack() +: next(0), state(0) +{ +} + +stack::stack(statem *s, stack *n) +: next(n), state(s) +{ +} + +stack::~stack() +{ + if (state) + delete state; + if (next) + delete next; +} + +mtsm::mtsm() +: sp(0) +{ + driver = new statem(); +} + +mtsm::~mtsm() +{ + delete driver; + if (sp) + delete sp; +} + +/* + * push_state - push the current troff state and use `n' as + * the new troff state. + */ + +void mtsm::push_state(statem *n) +{ + if (is_html) { +#if defined(DEBUGGING) + if (debug_state) + fprintf(stderr, "--> state %d pushed\n", n->issue_no) ; fflush(stderr); +#endif + sp = new stack(n, sp); + } +} + +void mtsm::pop_state() +{ + if (is_html) { +#if defined(DEBUGGING) + if (debug_state) + fprintf(stderr, "--> state popped\n") ; fflush(stderr); +#endif + if (sp == 0) + fatal("empty state machine stack"); + if (sp->state) + delete sp->state; + sp->state = 0; + stack *t = sp; + sp = sp->next; + t->next = 0; + delete t; + } +} + +/* + * inherit - scan the stack and collects inherited values. + */ + +void mtsm::inherit(statem *s, int reset_bool) +{ + if (sp && sp->state) { + if (s->units_values[MTSM_IN].is_known + && sp->state->units_values[MTSM_IN].is_known) + s->units_values[MTSM_IN].value += sp->state->units_values[MTSM_IN].value; + s->update(sp->state, s, MTSM_FI); + s->update(sp->state, s, MTSM_LL); + s->update(sp->state, s, MTSM_PO); + s->update(sp->state, s, MTSM_RJ); + s->update(sp->state, s, MTSM_TA); + s->update(sp->state, s, MTSM_TI); + s->update(sp->state, s, MTSM_CE); + if (sp->state->bool_values[MTSM_BR].is_known + && sp->state->bool_values[MTSM_BR].value) { + if (reset_bool) + sp->state->bool_values[MTSM_BR].set(0); + s->bool_values[MTSM_BR].set(1); + if (debug_state) + fprintf(stderr, "inherited br from pushed state %d\n", + sp->state->issue_no); + } + else if (s->bool_values[MTSM_BR].is_known + && s->bool_values[MTSM_BR].value) + if (! s->int_values[MTSM_CE].is_known) + s->bool_values[MTSM_BR].unset(); + if (sp->state->bool_values[MTSM_EOL].is_known + && sp->state->bool_values[MTSM_EOL].value) { + if (reset_bool) + sp->state->bool_values[MTSM_EOL].set(0); + s->bool_values[MTSM_EOL].set(1); + } + } +} + +void mtsm::flush(FILE *fp, statem *s, string tag_list) +{ + if (is_html && s) { + inherit(s, 1); + driver->flush(fp, s); + // Set rj, ce, ti to unknown if they were known and + // we have seen an eol or br. This ensures that these values + // are emitted during the next glyph (as they step from n..0 + // at each newline). + if ((driver->bool_values[MTSM_EOL].is_known + && driver->bool_values[MTSM_EOL].value) + || (driver->bool_values[MTSM_BR].is_known + && driver->bool_values[MTSM_BR].value)) { + if (driver->units_values[MTSM_TI].is_known) + driver->units_values[MTSM_TI].is_known = 0; + if (driver->int_values[MTSM_RJ].is_known + && driver->int_values[MTSM_RJ].value > 0) + driver->int_values[MTSM_RJ].is_known = 0; + if (driver->int_values[MTSM_CE].is_known + && driver->int_values[MTSM_CE].value > 0) + driver->int_values[MTSM_CE].is_known = 0; + } + // reset the boolean values + driver->bool_values[MTSM_BR].set(0); + driver->bool_values[MTSM_EOL].set(0); + // reset space value + driver->int_values[MTSM_SP].set(0); + // lastly write out any direct tag entries + if (tag_list != string("")) { + string t = tag_list + '\0'; + fputs(t.contents(), fp); + } + } +} + +/* + * display_state - dump out a synopsis of the state to stderr. + */ + +void statem::display_state() +{ + fprintf(stderr, " "); + fflush(stderr); +} + +int mtsm::has_changed(int_value_state t, statem *s) +{ + return driver->int_values[t].differs(s->int_values[t]); +} + +int mtsm::has_changed(units_value_state t, statem *s) +{ + return driver->units_values[t].differs(s->units_values[t]); +} + +int mtsm::has_changed(bool_value_state t, statem *s) +{ + return driver->bool_values[t].differs(s->bool_values[t]); +} + +int mtsm::has_changed(string_value_state t, statem *s) +{ + return driver->string_values[t].differs(s->string_values[t]); +} + +int mtsm::changed(statem *s) +{ + if (s == 0 || !is_html) + return 0; + s = new statem(s); + inherit(s, 0); + int result = has_changed(MTSM_EOL, s) + || has_changed(MTSM_BR, s) + || has_changed(MTSM_FI, s) + || has_changed(MTSM_IN, s) + || has_changed(MTSM_LL, s) + || has_changed(MTSM_PO, s) + || has_changed(MTSM_RJ, s) + || has_changed(MTSM_SP, s) + || has_changed(MTSM_TA, s) + || has_changed(MTSM_CE, s); + delete s; + return result; +} + +void mtsm::add_tag(FILE *fp, string s) +{ + fflush(fp); + s += '\0'; + fputs(s.contents(), fp); +} + +/* + * state_set class + */ + +state_set::state_set() +: boolset(0), intset(0), unitsset(0), stringset(0) +{ +} + +state_set::~state_set() +{ +} + +void state_set::incl(bool_value_state b) +{ + boolset |= 1 << (int)b; +} + +void state_set::incl(int_value_state i) +{ + intset |= 1 << (int)i; +} + +void state_set::incl(units_value_state u) +{ + unitsset |= 1 << (int)u; +} + +void state_set::incl(string_value_state s) +{ + stringset |= 1 << (int)s; +} + +void state_set::excl(bool_value_state b) +{ + boolset &= ~(1 << (int)b); +} + +void state_set::excl(int_value_state i) +{ + intset &= ~(1 << (int)i); +} + +void state_set::excl(units_value_state u) +{ + unitsset &= ~(1 << (int)u); +} + +void state_set::excl(string_value_state s) +{ + stringset &= ~(1 << (int)s); +} + +int state_set::is_in(bool_value_state b) +{ + return (boolset & (1 << (int)b)) != 0; +} + +int state_set::is_in(int_value_state i) +{ + return (intset & (1 << (int)i)) != 0; +} + +int state_set::is_in(units_value_state u) +{ + return (unitsset & (1 << (int)u) != 0); +} + +int state_set::is_in(string_value_state s) +{ + return (stringset & (1 << (int)s) != 0); +} + +void state_set::add(units_value_state, int n) +{ + unitsset += n; +} + +units state_set::val(units_value_state) +{ + return unitsset; +} diff -ruN groff-1.19.1/src/roff/troff/mtsm.h groff-1.19.2/src/roff/troff/mtsm.h --- groff-1.19.1/src/roff/troff/mtsm.h 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/roff/troff/mtsm.h 2005-05-26 15:37:21.000000000 +0200 @@ -0,0 +1,164 @@ +// -*- C++ -*- +/* Copyright (C) 2003, 2004 Free Software Foundation, Inc. + * + * mtsm.h + * + * written by Gaius Mulley (gaius@glam.ac.uk) + * + * provides a minimal troff state machine which is necessary to + * emit meta tags for the post-grohtml device driver. + */ + +/* +This file is part of groff. + +groff 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. + +groff 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 groff; see the file COPYING. If not, write to the Free Software +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ + +struct int_value { + int value; + int is_known; + int_value(); + ~int_value(); + void diff(FILE *, const char *, int_value); + int differs(int_value); + void set(int); + void unset(); + void set_if_unknown(int); +}; + +struct bool_value : public int_value { + bool_value(); + ~bool_value(); + void diff(FILE *, const char *, bool_value); +}; + +struct units_value : public int_value { + units_value(); + ~units_value(); + void diff(FILE *, const char *, units_value); + int differs(units_value); + void set(hunits); +}; + +struct string_value { + string value; + int is_known; + string_value(); + ~string_value(); + void diff(FILE *, const char *, string_value); + int differs(string_value); + void set(string); + void unset(); +}; + +enum bool_value_state { + MTSM_EOL, + MTSM_BR, + LAST_BOOL +}; +enum int_value_state { + MTSM_FI, + MTSM_RJ, + MTSM_CE, + MTSM_SP, + LAST_INT +}; +enum units_value_state { + MTSM_IN, + MTSM_LL, + MTSM_PO, + MTSM_TI, + LAST_UNITS +}; +enum string_value_state { + MTSM_TA, + LAST_STRING +}; + +struct statem { + int issue_no; + bool_value bool_values[LAST_BOOL]; + int_value int_values[LAST_INT]; + units_value units_values[LAST_UNITS]; + string_value string_values[LAST_STRING]; + statem(); + statem(statem *); + ~statem(); + void flush(FILE *, statem *); + int changed(statem *); + void merge(statem *, statem *); + void add_tag(int_value_state, int); + void add_tag(bool_value_state); + void add_tag(units_value_state, hunits); + void add_tag(string_value_state, string); + void sub_tag_ce(); + void add_tag_if_unknown(int_value_state, int); + void add_tag_ta(); + void display_state(); + void update(statem *, statem *, int_value_state); + void update(statem *, statem *, bool_value_state); + void update(statem *, statem *, units_value_state); + void update(statem *, statem *, string_value_state); +}; + +struct stack { + stack *next; + statem *state; + stack(); + stack(statem *, stack *); + ~stack(); +}; + +class mtsm { + statem *driver; + stack *sp; + int has_changed(int_value_state, statem *); + int has_changed(bool_value_state, statem *); + int has_changed(units_value_state, statem *); + int has_changed(string_value_state, statem *); + void inherit(statem *, int); +public: + mtsm(); + ~mtsm(); + void push_state(statem *); + void pop_state(); + void flush(FILE *, statem *, string); + int changed(statem *); + void add_tag(FILE *, string); +}; + +class state_set { + int boolset; + int intset; + int unitsset; + int stringset; +public: + state_set(); + ~state_set(); + void incl(bool_value_state); + void incl(int_value_state); + void incl(units_value_state); + void incl(string_value_state); + void excl(bool_value_state); + void excl(int_value_state); + void excl(units_value_state); + void excl(string_value_state); + int is_in(bool_value_state); + int is_in(int_value_state); + int is_in(units_value_state); + int is_in(string_value_state); + void add(units_value_state, int); + units val(units_value_state); +}; diff -ruN groff-1.19.1/src/roff/troff/node.cpp groff-1.19.2/src/roff/troff/node.cpp --- groff-1.19.1/src/roff/troff/node.cpp 2004-05-08 19:00:04.000000000 +0200 +++ groff-1.19.2/src/roff/troff/node.cpp 2005-06-15 22:32:54.000000000 +0200 @@ -1,5 +1,5 @@ // -*- C++ -*- -/* Copyright (C) 1989, 1990, 1991, 1992, 2000, 2001, 2002, 2003, 2004 +/* Copyright (C) 1989, 1990, 1991, 1992, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. Written by James Clark (jjc@jclark.com) @@ -17,7 +17,9 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ + +extern int debug_state; #include "troff.h" @@ -27,17 +29,18 @@ #include "dictionary.h" #include "hvunits.h" +#include "stringclass.h" +#include "mtsm.h" #include "env.h" #include "request.h" #include "node.h" #include "token.h" +#include "div.h" +#include "reg.h" #include "charinfo.h" #include "font.h" -#include "reg.h" #include "input.h" -#include "div.h" #include "geometry.h" -#include "stringclass.h" #include "nonposix.h" @@ -58,6 +61,12 @@ #endif /* not _POSIX_VERSION */ +// declarations to avoid friend name injections +class tfont; +class tfont_spec; +tfont *make_tfont(tfont_spec &); + + /* * how many boundaries of images have been written? Useful for * debugging grohtml @@ -111,8 +120,6 @@ conditional_bold(int, hunits, conditional_bold * = 0); }; -class tfont; - class font_info { tfont *last_tfont; int number; @@ -133,7 +140,7 @@ void flush(); public: special_font_list *sf; - font_info(symbol nm, int n, symbol enm, font *f); + font_info(symbol, int, symbol, font *); int contains(charinfo *); void set_bold(hunits); void unbold(); @@ -151,6 +158,7 @@ int is_special(); int is_style(); friend symbol get_font_name(int, environment *); + friend symbol get_style_name(int); }; class tfont_spec { @@ -169,7 +177,7 @@ int height; int slant; public: - tfont_spec(symbol nm, int pos, font *, font_size, int, int); + tfont_spec(symbol, int, font *, font_size, int, int); tfont_spec(const tfont_spec &spec) { *this = spec; } tfont_spec plain(); int operator==(const tfont_spec &); @@ -399,6 +407,14 @@ return f; } +symbol get_style_name(int fontno) +{ + if (font_table[fontno]->is_style()) + return font_table[fontno]->get_name(); + else + return EMPTY_SYMBOL; +} + hunits font_info::get_space_width(font_size fs, int space_sz) { if (is_constant_spaced == CONSTANT_SPACE_NONE) @@ -680,9 +696,8 @@ virtual void really_put_filename(const char *filename); virtual void really_on(); virtual void really_off(); -protected: - FILE *fp; public: + FILE *fp; real_output_file(); ~real_output_file(); void flush(); @@ -750,6 +765,8 @@ int tbuf_len; int tbuf_kern; int begun_page; + int cur_div_level; + string tag_list; void do_motion(); void put(char c); void put(unsigned char c); @@ -786,6 +803,7 @@ void fill_color(color *c); int get_hpos() { return hpos; } int get_vpos() { return vpos; } + void add_to_tag_list(string s); friend void space_char_hmotion_node::tprint(troff_output_file *); friend void unbreakable_space_node::tprint(troff_output_file *); }; @@ -863,6 +881,29 @@ { moveto(x, y); while (n != 0) { + // Check whether we should push the current troff state and use + // the state at the start of the invocation of this diversion. + if (n->div_nest_level > cur_div_level && n->push_state) { + state.push_state(n->push_state); + cur_div_level = n->div_nest_level; + } + // Has the current diversion level decreased? Then we must pop the + // troff state. + while (n->div_nest_level < cur_div_level) { + state.pop_state(); + cur_div_level = n->div_nest_level; + } + // Now check whether the state has changed. + if ((is_on() || n->force_tprint()) + && (state.changed(n->state) || n->is_tag() || n->is_special)) { + flush_tbuf(); + do_motion(); + force_motion = 1; + flush(); + state.flush(fp, n->state, tag_list); + tag_list = string(""); + flush(); + } n->tprint(this); n = n->next; } @@ -1274,6 +1315,16 @@ put('\n'); } +void troff_output_file::add_to_tag_list(string s) +{ + if (tag_list == string("")) + tag_list = s; + else { + tag_list += string("\n"); + tag_list += s; + } +} + // determine_line_limits - works out the smallest box which will contain // the entity, code, built from the point array. void troff_output_file::determine_line_limits(char code, hvpair *point, @@ -1503,7 +1554,8 @@ troff_output_file::troff_output_file() : current_slant(0), current_height(0), current_fill_color(0), - current_glyph_color(0), nfont_positions(10), tbuf_len(0), begun_page(0) + current_glyph_color(0), nfont_positions(10), tbuf_len(0), begun_page(0), + cur_div_level(0) { font_position = new symbol[nfont_positions]; put("x T "); @@ -1726,14 +1778,14 @@ protected: charinfo *ci; public: - charinfo_node(charinfo *, node * = 0); + charinfo_node(charinfo *, statem *, int, node * = 0); int ends_sentence(); int overlaps_vertically(); int overlaps_horizontally(); }; -charinfo_node::charinfo_node(charinfo *c, node *x) -: node(x), ci(c) +charinfo_node::charinfo_node(charinfo *c, statem *s, int pop, node *x) +: node(x, s, pop), ci(c) { } @@ -1765,12 +1817,14 @@ color *fcol; /* this is needed for grotty */ #ifdef STORE_WIDTH hunits wid; - glyph_node(charinfo *, tfont *, color *, color *, hunits, node * = 0); + glyph_node(charinfo *, tfont *, color *, color *, hunits, + statem *, int, node * = 0); #endif public: void *operator new(size_t); void operator delete(void *); - glyph_node(charinfo *, tfont *, color *, color *, node * = 0); + glyph_node(charinfo *, tfont *, color *, color *, + statem *, int, node * = 0); ~glyph_node() {} node *copy(); node *merge_glyph_node(glyph_node *); @@ -1797,6 +1851,8 @@ int same(node *); const char *type(); int force_tprint(); + int is_tag(); + void debug_node(); }; glyph_node *glyph_node::free_list = 0; @@ -1806,13 +1862,13 @@ node *n2; #ifdef STORE_WIDTH ligature_node(charinfo *, tfont *, color *, color *, hunits, - node *, node *, node * = 0); + node *, node *, statem *, int, node * = 0); #endif public: void *operator new(size_t); void operator delete(void *); ligature_node(charinfo *, tfont *, color *, color *, - node *, node *, node * = 0); + node *, node *, statem *, int, node * = 0); ~ligature_node(); node *copy(); node *add_self(node *, hyphen_list **); @@ -1822,6 +1878,7 @@ int same(node *); const char *type(); int force_tprint(); + int is_tag(); }; class kern_pair_node : public node { @@ -1829,7 +1886,7 @@ node *n1; node *n2; public: - kern_pair_node(hunits n, node *first, node *second, node *x = 0); + kern_pair_node(hunits, node *, node *, statem *, int, node * = 0); ~kern_pair_node(); node *copy(); node *merge_glyph_node(glyph_node *); @@ -1848,6 +1905,7 @@ int same(node *); const char *type(); int force_tprint(); + int is_tag(); void vertical_extent(vunits *, vunits *); }; @@ -1856,7 +1914,7 @@ node *pre; node *post; public: - dbreak_node(node *n, node *p, node *x = 0); + dbreak_node(node *, node *, statem *, int, node * = 0); ~dbreak_node(); node *copy(); node *merge_glyph_node(glyph_node *); @@ -1877,6 +1935,7 @@ int same(node *); const char *type(); int force_tprint(); + int is_tag(); }; void *glyph_node::operator new(size_t n) @@ -1913,8 +1972,9 @@ delete[] (char *)p; } -glyph_node::glyph_node(charinfo *c, tfont *t, color *gc, color *fc, node *x) -: charinfo_node(c, x), tf(t), gcol(gc), fcol(fc) +glyph_node::glyph_node(charinfo *c, tfont *t, color *gc, color *fc, + statem *s, int pop, node *x) +: charinfo_node(c, s, pop, x), tf(t), gcol(gc), fcol(fc) { #ifdef STORE_WIDTH wid = tf->get_width(ci); @@ -1923,8 +1983,9 @@ #ifdef STORE_WIDTH glyph_node::glyph_node(charinfo *c, tfont *t, - color *gc, color *fc, hunits w, node *x) -: charinfo_node(c, x), tf(t), gcol(gc), fcol(fc), wid(w) + color *gc, color *fc, hunits w, + statem *s, int pop, node *x) +: charinfo_node(c, s, pop, x), tf(t), gcol(gc), fcol(fc), wid(w) { } #endif @@ -1932,9 +1993,9 @@ node *glyph_node::copy() { #ifdef STORE_WIDTH - return new glyph_node(ci, tf, gcol, fcol, wid); + return new glyph_node(ci, tf, gcol, fcol, wid, state, div_nest_level); #else - return new glyph_node(ci, tf, gcol, fcol); + return new glyph_node(ci, tf, gcol, fcol, state, div_nest_level); #endif } @@ -2018,13 +2079,15 @@ if ((lig = tf->get_lig(ci, gn->ci)) != 0) { node *next1 = next; next = 0; - return new ligature_node(lig, tf, gcol, fcol, this, gn, next1); + return new ligature_node(lig, tf, gcol, fcol, this, gn, state, + gn->div_nest_level, next1); } hunits kern; if (tf->get_kern(ci, gn->ci, &kern)) { node *next1 = next; next = 0; - return new kern_pair_node(kern, this, gn, next1); + return new kern_pair_node(kern, this, gn, state, + gn->div_nest_level, next1); } } return 0; @@ -2087,16 +2150,35 @@ ascii->outs(ci->nm.contents()); } +void glyph_node::debug_node() +{ + unsigned char c = ci->get_ascii_code(); + fprintf(stderr, "{ %s [", type()); + if (c) + fprintf(stderr, "%c", c); + else + fprintf(stderr, ci->nm.contents()); + if (push_state) + fprintf(stderr, " "); + if (state) + state->display_state(); + fprintf(stderr, " nest level %d", div_nest_level); + fprintf(stderr, "]}\n"); + fflush(stderr); +} + ligature_node::ligature_node(charinfo *c, tfont *t, color *gc, color *fc, - node *gn1, node *gn2, node *x) -: glyph_node(c, t, gc, fc, x), n1(gn1), n2(gn2) + node *gn1, node *gn2, statem *s, + int pop, node *x) +: glyph_node(c, t, gc, fc, s, pop, x), n1(gn1), n2(gn2) { } #ifdef STORE_WIDTH ligature_node::ligature_node(charinfo *c, tfont *t, color *gc, color *fc, - hunits w, node *gn1, node *gn2, node *x) -: glyph_node(c, t, gc, fc, w, x), n1(gn1), n2(gn2) + hunits w, node *gn1, node *gn2, statem *s, + int pop, node *x) +: glyph_node(c, t, gc, fc, w, s, pop, x), n1(gn1), n2(gn2) { } #endif @@ -2110,9 +2192,11 @@ node *ligature_node::copy() { #ifdef STORE_WIDTH - return new ligature_node(ci, tf, gcol, fcol, wid, n1->copy(), n2->copy()); + return new ligature_node(ci, tf, gcol, fcol, wid, n1->copy(), n2->copy(), + state, div_nest_level); #else - return new ligature_node(ci, tf, gcol, fcol, n1->copy(), n2->copy()); + return new ligature_node(ci, tf, gcol, fcol, n1->copy(), n2->copy(), + state, div_nest_level); #endif } @@ -2137,13 +2221,14 @@ return n; } -kern_pair_node::kern_pair_node(hunits n, node *first, node *second, node *x) -: node(x), amount(n), n1(first), n2(second) +kern_pair_node::kern_pair_node(hunits n, node *first, node *second, + statem* s, int pop, node *x) +: node(x, s, pop), amount(n), n1(first), n2(second) { } -dbreak_node::dbreak_node(node *n, node *p, node *x) -: node(x), none(n), pre(p), post(0) +dbreak_node::dbreak_node(node *n, node *p, statem *s, int pop, node *x) +: node(x, s, pop), none(n), pre(p), post(0) { } @@ -2219,13 +2304,14 @@ node *next1 = next; next = 0; node *n = copy(); - glyph_node *gn = new glyph_node(soft_hyphen_char, tf, gcol, fcol); + glyph_node *gn = new glyph_node(soft_hyphen_char, tf, gcol, fcol, + state, div_nest_level); node *nn = n->merge_glyph_node(gn); if (nn == 0) { gn->next = n; nn = gn; } - return new dbreak_node(this, nn, next1); + return new dbreak_node(this, nn, state, div_nest_level, next1); } } return this; @@ -2248,7 +2334,8 @@ node *kern_pair_node::copy() { - return new kern_pair_node(amount, n1->copy(), n2->copy()); + return new kern_pair_node(amount, n1->copy(), n2->copy(), state, + div_nest_level); } node *copy_node_list(node *n) @@ -2280,7 +2367,8 @@ node *dbreak_node::copy() { - dbreak_node *p = new dbreak_node(copy_node_list(none), copy_node_list(pre)); + dbreak_node *p = new dbreak_node(copy_node_list(none), copy_node_list(pre), + state, div_nest_level); p->post = copy_node_list(post); return p; } @@ -2298,11 +2386,12 @@ class hyphen_inhibitor_node : public node { public: - hyphen_inhibitor_node(node *nd = 0); + hyphen_inhibitor_node(node * = 0); node *copy(); int same(node *); const char *type(); int force_tprint(); + int is_tag(); hyphenation_type get_hyphenation_type(); }; @@ -2330,6 +2419,11 @@ return 0; } +int hyphen_inhibitor_node::is_tag() +{ + return 0; +} + hyphenation_type hyphen_inhibitor_node::get_hyphenation_type() { return HYPHEN_INHIBIT; @@ -2357,13 +2451,14 @@ node *next1 = next; next = 0; node *n = copy(); - glyph_node *gn = new glyph_node(soft_hyphen_char, tf, gcol, fcol); + glyph_node *gn = new glyph_node(soft_hyphen_char, tf, gcol, fcol, + state, div_nest_level); node *n1 = n->merge_glyph_node(gn); if (n1 == 0) { gn->next = n; n1 = gn; } - return new dbreak_node(this, n1, next1); + return new dbreak_node(this, n1, state, div_nest_level, next1); } return this; } @@ -2403,6 +2498,11 @@ return 0; } +int node::is_tag() +{ + return 0; +} + hunits hmotion_node::width() { return n; @@ -2413,6 +2513,29 @@ return points_to_units(10); } +void node::debug_node() +{ + fprintf(stderr, "{ %s ", type()); + if (push_state) + fprintf(stderr, " "); + if (state) + fprintf(stderr, " "); + fprintf(stderr, " nest level %d", div_nest_level); + fprintf(stderr, " }\n"); + fflush(stderr); +} + +void node::debug_node_list() +{ + node *n = next; + + debug_node(); + while (n != 0) { + n->debug_node(); + n = n->next; + } +} + hunits kern_pair_node::width() { return n1->width() + n2->width() + amount; @@ -2458,7 +2581,7 @@ node *n; hunits x; public: - italic_corrected_node(node *, hunits, node * = 0); + italic_corrected_node(node *, hunits, statem *, int, node * = 0); ~italic_corrected_node(); node *copy(); void ascii_print(ascii_output_file *); @@ -2480,6 +2603,7 @@ node *add_self(node *, hyphen_list **); const char *type(); int force_tprint(); + int is_tag(); }; node *node::add_italic_correction(hunits *wd) @@ -2491,12 +2615,13 @@ node *next1 = next; next = 0; *wd += ic; - return new italic_corrected_node(this, ic, next1); + return new italic_corrected_node(this, ic, state, div_nest_level, next1); } } -italic_corrected_node::italic_corrected_node(node *nn, hunits xx, node *p) -: node(p), n(nn), x(xx) +italic_corrected_node::italic_corrected_node(node *nn, hunits xx, statem *s, + int pop, node *p) +: node(p, s, pop), n(nn), x(xx) { assert(n != 0); } @@ -2508,7 +2633,7 @@ node *italic_corrected_node::copy() { - return new italic_corrected_node(n->copy(), x); + return new italic_corrected_node(n->copy(), x, state, div_nest_level); } hunits italic_corrected_node::width() @@ -2599,6 +2724,7 @@ color *col; public: break_char_node(node *, int, color *, node * = 0); + break_char_node(node *, int, color *, statem *, int, node * = 0); ~break_char_node(); node *copy(); hunits width(); @@ -2620,6 +2746,7 @@ int same(node *); const char *type(); int force_tprint(); + int is_tag(); }; break_char_node::break_char_node(node *n, int bc, color *c, node *x) @@ -2627,6 +2754,12 @@ { } +break_char_node::break_char_node(node *n, int bc, color *c, statem *s, + int pop, node *x) +: node(x, s, pop), ch(n), break_code(bc), col(c) +{ +} + break_char_node::~break_char_node() { delete ch; @@ -2634,7 +2767,8 @@ node *break_char_node::copy() { - return new break_char_node(ch->copy(), break_code, col); + return new break_char_node(ch->copy(), break_code, col, state, + div_nest_level); } hunits break_char_node::width() @@ -2718,27 +2852,57 @@ node *extra_size_node::copy() { - return new extra_size_node(n); + return new extra_size_node(n, state, div_nest_level); +} + +extra_size_node::extra_size_node(vunits i, statem *s, int pop) +: node(0, s, pop), n(i) +{ +} + +extra_size_node::extra_size_node(vunits i) +: n(i) +{ } node *vertical_size_node::copy() { - return new vertical_size_node(n); + return new vertical_size_node(n, state, div_nest_level); +} + +vertical_size_node::vertical_size_node(vunits i, statem *s, int pop) +: node(0, s, pop), n(i) +{ +} + +vertical_size_node::vertical_size_node(vunits i) +: n(i) +{ } node *hmotion_node::copy() { - return new hmotion_node(n, was_tab, unformat, col); + return new hmotion_node(n, was_tab, unformat, col, state, div_nest_level); } node *space_char_hmotion_node::copy() { - return new space_char_hmotion_node(n, col); + return new space_char_hmotion_node(n, col, state, div_nest_level); +} + +vmotion_node::vmotion_node(vunits i, color *c) +: n(i), col(c) +{ +} + +vmotion_node::vmotion_node(vunits i, color *c, statem *s, int pop) +: node(0, s, pop), n(i), col(c) +{ } node *vmotion_node::copy() { - return new vmotion_node(n, col); + return new vmotion_node(n, col, state, div_nest_level); } node *dummy_node::copy() @@ -2757,9 +2921,19 @@ delete n; } +hline_node::hline_node(hunits i, node *c, node *nxt) +: node(nxt), x(i), n(c) +{ +} + +hline_node::hline_node(hunits i, node *c, statem *s, int pop, node *nxt) +: node(nxt, s, pop), x(i), n(c) +{ +} + node *hline_node::copy() { - return new hline_node(x, n ? n->copy() : 0); + return new hline_node(x, n ? n->copy() : 0, state, div_nest_level); } hunits hline_node::width() @@ -2767,6 +2941,16 @@ return x < H0 ? H0 : x; } +vline_node::vline_node(vunits i, node *c, node *nxt) +: node(nxt), x(i), n(c) +{ +} + +vline_node::vline_node(vunits i, node *c, statem *s, int pop, node *nxt) +: node(nxt, s, pop), x(i), n(c) +{ +} + vline_node::~vline_node() { if (n) @@ -2775,7 +2959,7 @@ node *vline_node::copy() { - return new vline_node(x, n ? n->copy() : 0); + return new vline_node(x, n ? n->copy() : 0, state, div_nest_level); } hunits vline_node::width() @@ -2783,7 +2967,13 @@ return n == 0 ? H0 : n->width(); } -zero_width_node::zero_width_node(node *nd) : n(nd) +zero_width_node::zero_width_node(node *nd, statem *s, int pop) +: node(0, s, pop), n(nd) +{ +} + +zero_width_node::zero_width_node(node *nd) +: n(nd) { } @@ -2794,7 +2984,7 @@ node *zero_width_node::copy() { - return new zero_width_node(copy_node_list(n)); + return new zero_width_node(copy_node_list(n), state, div_nest_level); } int node_list_character_type(node *p) @@ -2833,7 +3023,13 @@ node_list_vertical_extent(n, min, max); } -overstrike_node::overstrike_node() : list(0), max_width(H0) +overstrike_node::overstrike_node() +: list(0), max_width(H0) +{ +} + +overstrike_node::overstrike_node(statem *s, int pop) +: node(0, s, pop), list(0), max_width(H0) { } @@ -2844,7 +3040,7 @@ node *overstrike_node::copy() { - overstrike_node *on = new overstrike_node; + overstrike_node *on = new overstrike_node(state, div_nest_level); for (node *tem = list; tem; tem = tem->next) on->overstrike(tem->copy()); return on; @@ -2869,7 +3065,13 @@ return max_width; } -bracket_node::bracket_node() : list(0), max_width(H0) +bracket_node::bracket_node() +: list(0), max_width(H0) +{ +} + +bracket_node::bracket_node(statem *s, int pop) +: node(0, s, pop), list(0), max_width(H0) { } @@ -2880,7 +3082,7 @@ node *bracket_node::copy() { - bracket_node *on = new bracket_node; + bracket_node *on = new bracket_node(state, div_nest_level); node *last_node = 0; node *tem; if (list) @@ -2949,12 +3151,18 @@ #endif space_node::space_node(hunits nn, color *c, node *p) -: node(p), n(nn), set(0), was_escape_colon(0), col(c) +: node(p, 0, 0), n(nn), set(0), was_escape_colon(0), col(c) +{ +} + +space_node::space_node(hunits nn, color *c, statem *s, int pop, node *p) +: node(p, s, pop), n(nn), set(0), was_escape_colon(0), col(c) { } -space_node::space_node(hunits nn, int s, int flag, color *c, node *p) -: node(p), n(nn), set(s), was_escape_colon(flag), col(c) +space_node::space_node(hunits nn, int s, int flag, color *c, statem *st, + int pop, node *p) +: node(p, st, pop), n(nn), set(s), was_escape_colon(flag), col(c) { } @@ -2966,7 +3174,7 @@ node *space_node::copy() { - return new space_node(n, set, was_escape_colon, col); + return new space_node(n, set, was_escape_colon, col, state, div_nest_level); } int space_node::force_tprint() @@ -2974,6 +3182,11 @@ return 0; } +int space_node::is_tag() +{ + return 0; +} + int space_node::nspaces() { return set ? 0 : 1; @@ -3030,6 +3243,12 @@ was_escape_colon = 1; } +diverted_space_node::diverted_space_node(vunits d, statem *s, int pop, + node *p) +: node(p, s, pop), n(d) +{ +} + diverted_space_node::diverted_space_node(vunits d, node *p) : node(p), n(d) { @@ -3037,7 +3256,13 @@ node *diverted_space_node::copy() { - return new diverted_space_node(n); + return new diverted_space_node(n, state, div_nest_level); +} + +diverted_copy_file_node::diverted_copy_file_node(symbol s, statem *st, + int pop, node *p) +: node(p, st, pop), filename(s) +{ } diverted_copy_file_node::diverted_copy_file_node(symbol s, node *p) @@ -3047,7 +3272,7 @@ node *diverted_copy_file_node::copy() { - return new diverted_copy_file_node(filename); + return new diverted_copy_file_node(filename, state, div_nest_level); } int node::ends_sentence() @@ -3338,8 +3563,15 @@ } space_char_hmotion_node::space_char_hmotion_node(hunits i, color *c, + statem *s, int pop, node *nxt) -: hmotion_node(i, c, nxt) +: hmotion_node(i, c, s, pop, nxt) +{ +} + +space_char_hmotion_node::space_char_hmotion_node(hunits i, color *c, + node *nxt) +: hmotion_node(i, c, 0, 0, nxt) { } @@ -3597,12 +3829,16 @@ tf = tf->get_plain(); gcol = curenv->get_glyph_color(); fcol = curenv->get_fill_color(); + is_special = 1; } special_node::special_node(const macro &m, tfont *t, - color *gc, color *fc, int n) -: mac(m), tf(t), gcol(gc), fcol(fc), no_init_string(n) + color *gc, color *fc, + statem *s, int pop, + int n) +: node(0, s, pop), mac(m), tf(t), gcol(gc), fcol(fc), no_init_string(n) { + is_special = 1; } int special_node::same(node *n) @@ -3629,9 +3865,15 @@ return 0; } +int special_node::is_tag() +{ + return 0; +} + node *special_node::copy() { - return new special_node(mac, tf, gcol, fcol, no_init_string); + return new special_node(mac, tf, gcol, fcol, state, div_nest_level, + no_init_string); } void special_node::tprint_start(troff_output_file *out) @@ -3657,20 +3899,22 @@ /* suppress_node */ suppress_node::suppress_node(int on_or_off, int issue_limits) -: is_on(on_or_off), emit_limits(issue_limits), - filename(0), position(0), image_id(0) +: is_on(on_or_off), emit_limits(issue_limits), filename(0), position(0), + image_id(0) { } suppress_node::suppress_node(symbol f, char p, int id) : is_on(2), emit_limits(0), filename(f), position(p), image_id(id) { + is_special = 1; } suppress_node::suppress_node(int issue_limits, int on_or_off, - symbol f, char p, int id) -: is_on(on_or_off), emit_limits(issue_limits), - filename(f), position(p), image_id(id) + symbol f, char p, int id, + statem *s, int pop) +: node(0, s, pop), is_on(on_or_off), emit_limits(issue_limits), filename(f), + position(p), image_id(id) { } @@ -3690,7 +3934,67 @@ node *suppress_node::copy() { - return new suppress_node(emit_limits, is_on, filename, position, image_id); + return new suppress_node(emit_limits, is_on, filename, position, image_id, + state, div_nest_level); +} + +/* tag_node */ + +tag_node::tag_node() +: delayed(0) +{ + is_special = 1; +} + +tag_node::tag_node(string s, int delay) +: tag_string(s), delayed(delay) +{ + is_special = !delay; +} + +tag_node::tag_node(string s, statem *st, int pop, int delay) +: node(0, st, pop), tag_string(s), delayed(delay) +{ + is_special = !delay; +} + +node *tag_node::copy() +{ + return new tag_node(tag_string, state, div_nest_level, delayed); +} + +void tag_node::tprint(troff_output_file *out) +{ + if (delayed) + out->add_to_tag_list(tag_string); + else + out->state.add_tag(out->fp, tag_string); +} + +int tag_node::same(node *nd) +{ + return tag_string == ((tag_node *)nd)->tag_string + && delayed == ((tag_node *)nd)->delayed; +} + +const char *tag_node::type() +{ + return "tag_node"; +} + +int tag_node::force_tprint() +{ + return !delayed; +} + +int tag_node::is_tag() +{ + return !delayed; +} + +int tag_node::ends_sentence() +{ + return 2; } int get_reg_int(const char *p) @@ -3782,15 +4086,15 @@ switch (last_position) { case 'c': out->start_special(); - put(out, "html-tag:.centered-image"); + put(out, "devtag:.centered-image"); break; case 'r': out->start_special(); - put(out, "html-tag:.right-image"); + put(out, "devtag:.right-image"); break; case 'l': out->start_special(); - put(out, "html-tag:.left-image"); + put(out, "devtag:.left-image"); break; case 'i': ; @@ -3799,7 +4103,7 @@ } out->end_special(); out->start_special(); - put(out, "html-tag:.auto-image "); + put(out, "devtag:.auto-image "); put(out, name); out->end_special(); } @@ -3843,6 +4147,11 @@ return is_on; } +int suppress_node::is_tag() +{ + return is_on; +} + hunits suppress_node::width() { return H0; @@ -3854,7 +4163,7 @@ node *n; tfont *tf; public: - composite_node(node *, charinfo *, tfont *, node * = 0); + composite_node(node *, charinfo *, tfont *, statem *, int, node * = 0); ~composite_node(); node *copy(); hunits width(); @@ -3870,12 +4179,14 @@ int same(node *); const char *type(); int force_tprint(); + int is_tag(); void vertical_extent(vunits *, vunits *); vunits vertical_width(); }; -composite_node::composite_node(node *p, charinfo *c, tfont *t, node *x) -: charinfo_node(c, x), n(p), tf(t) +composite_node::composite_node(node *p, charinfo *c, tfont *t, statem *s, + int pop, node *x) +: charinfo_node(c, s, pop, x), n(p), tf(t) { } @@ -3886,7 +4197,7 @@ node *composite_node::copy() { - return new composite_node(copy_node_list(n), ci, tf); + return new composite_node(copy_node_list(n), ci, tf, state, div_nest_level); } hunits composite_node::width() @@ -4009,8 +4320,8 @@ } word_space_node::word_space_node(hunits d, int s, color *c, width_list *w, - int flag, node *x) -: space_node(d, s, 0, c, x), orig_width(w), unformat(flag) + int flag, statem *st, int pop, node *x) +: space_node(d, s, 0, c, st, pop, x), orig_width(w), unformat(flag) { } @@ -4036,7 +4347,8 @@ w_new_curr = w_new_curr->next; w_old_curr = w_old_curr->next; } - return new word_space_node(n, set, col, w_new, unformat); + return new word_space_node(n, set, col, w_new, unformat, state, + div_nest_level); } int word_space_node::set_unformat_flag() @@ -4069,14 +4381,15 @@ } unbreakable_space_node::unbreakable_space_node(hunits d, int s, - color *c, node *x) -: word_space_node(d, s, c, 0, 0, x) + color *c, statem *st, int pop, + node *x) +: word_space_node(d, s, c, 0, 0, st, pop, x) { } node *unbreakable_space_node::copy() { - return new unbreakable_space_node(n, set, col); + return new unbreakable_space_node(n, set, col, state, div_nest_level); } int unbreakable_space_node::force_tprint() @@ -4084,6 +4397,11 @@ return 0; } +int unbreakable_space_node::is_tag() +{ + return 0; +} + breakpoint *unbreakable_space_node::get_breakpoints(hunits, int, breakpoint *rest, int) { @@ -4118,6 +4436,15 @@ point[i] = p[i]; } +draw_node::draw_node(char c, hvpair *p, int np, font_size s, + color *gc, color *fc, statem *st, int pop) +: node(0, st, pop), npoints(np), sz(s), gcol(gc), fcol(fc), code(c) +{ + point = new hvpair[npoints]; + for (int i = 0; i < npoints; i++) + point[i] = p[i]; +} + int draw_node::same(node *n) { draw_node *nd = (draw_node *)n; @@ -4140,6 +4467,11 @@ return 0; } +int draw_node::is_tag() +{ + return 0; +} + draw_node::~draw_node() { if (point) @@ -4166,7 +4498,8 @@ node *draw_node::copy() { - return new draw_node(code, point, npoints, sz, gcol, fcol); + return new draw_node(code, point, npoints, sz, gcol, fcol, state, + div_nest_level); } void draw_node::tprint(troff_output_file *out) @@ -4501,7 +4834,7 @@ fontno); if (env->is_composite()) tf = tf->get_plain(); - return new composite_node(n, s, tf); + return new composite_node(n, s, tf, 0, 0, 0); } node *make_glyph_node(charinfo *s, environment *env, int no_error_message = 0) @@ -4587,7 +4920,7 @@ tf = tf->get_plain(); color *gcol = env->get_glyph_color(); color *fcol = env->get_fill_color(); - return new glyph_node(s, tf, gcol, fcol); + return new glyph_node(s, tf, gcol, fcol, 0, 0); } node *make_node(charinfo *ci, environment *env) @@ -4633,7 +4966,7 @@ } node *node::add_char(charinfo *ci, environment *env, - hunits *widthp, int *spacep) + hunits *widthp, int *spacep, node **glyph_comp_np) { node *res; switch (ci->get_special_translation()) { @@ -4663,9 +4996,14 @@ if (res) { res->next = this; *widthp += res->width(); + if (glyph_comp_np) + *glyph_comp_np = res; } - else + else { + if (glyph_comp_np) + *glyph_comp_np = res; return this; + } } else { node *gn = make_glyph_node(ci, env); @@ -4683,6 +5021,8 @@ *widthp += p->width() - old_width; res = p; } + if (glyph_comp_np) + *glyph_comp_np = res; } } int break_code = 0; @@ -4739,6 +5079,11 @@ return 0; } +int extra_size_node::is_tag() +{ + return 0; +} + int vertical_size_node::same(node *nd) { return n == ((vertical_size_node *)nd)->n; @@ -4759,6 +5104,11 @@ return 0; } +int vertical_size_node::is_tag() +{ + return 0; +} + int hmotion_node::same(node *nd) { return n == ((hmotion_node *)nd)->n @@ -4781,6 +5131,11 @@ return 0; } +int hmotion_node::is_tag() +{ + return 0; +} + node *hmotion_node::add_self(node *nd, hyphen_list **p) { next = nd; @@ -4811,6 +5166,11 @@ return 0; } +int space_char_hmotion_node::is_tag() +{ + return 0; +} + node *space_char_hmotion_node::add_self(node *nd, hyphen_list **p) { next = nd; @@ -4842,6 +5202,11 @@ return 0; } +int vmotion_node::is_tag() +{ + return 0; +} + int hline_node::same(node *nd) { return x == ((hline_node *)nd)->x && same_node(n, ((hline_node *)nd)->n); @@ -4857,6 +5222,11 @@ return 0; } +int hline_node::is_tag() +{ + return 0; +} + int vline_node::same(node *nd) { return x == ((vline_node *)nd)->x && same_node(n, ((vline_node *)nd)->n); @@ -4872,6 +5242,11 @@ return 0; } +int vline_node::is_tag() +{ + return 0; +} + int dummy_node::same(node * /*nd*/) { return 1; @@ -4887,6 +5262,11 @@ return 0; } +int dummy_node::is_tag() +{ + return 0; +} + int transparent_dummy_node::same(node * /*nd*/) { return 1; @@ -4902,6 +5282,11 @@ return 0; } +int transparent_dummy_node::is_tag() +{ + return 0; +} + int transparent_dummy_node::ends_sentence() { return 2; @@ -4922,6 +5307,11 @@ return 0; } +int zero_width_node::is_tag() +{ + return 0; +} + int italic_corrected_node::same(node *nd) { return (x == ((italic_corrected_node *)nd)->x @@ -4938,11 +5328,22 @@ return 0; } +int italic_corrected_node::is_tag() +{ + return 0; +} + left_italic_corrected_node::left_italic_corrected_node(node *xx) : node(xx), n(0) { } +left_italic_corrected_node::left_italic_corrected_node(statem *s, int pop, + node *xx) +: node(xx, s, pop), n(0) +{ +} + left_italic_corrected_node::~left_italic_corrected_node() { delete n; @@ -4971,7 +5372,8 @@ node *left_italic_corrected_node::copy() { - left_italic_corrected_node *nd = new left_italic_corrected_node; + left_italic_corrected_node *nd = + new left_italic_corrected_node(state, div_nest_level); if (n) { nd->n = n->copy(); nd->x = x; @@ -4997,6 +5399,11 @@ return 0; } +int left_italic_corrected_node::is_tag() +{ + return 0; +} + int left_italic_corrected_node::same(node *nd) { return (x == ((left_italic_corrected_node *)nd)->x @@ -5080,7 +5487,7 @@ node *left_italic_corrected_node::add_self(node *nd, hyphen_list **p) { if (n) { - nd = new left_italic_corrected_node(nd); + nd = new left_italic_corrected_node(state, div_nest_level, nd); nd = n->add_self(nd, p); n = 0; delete this; @@ -5108,6 +5515,11 @@ return 0; } +int overstrike_node::is_tag() +{ + return 0; +} + node *overstrike_node::add_self(node *n, hyphen_list **p) { next = n; @@ -5137,6 +5549,11 @@ return 0; } +int bracket_node::is_tag() +{ + return 0; +} + int composite_node::same(node *nd) { return ci == ((composite_node *)nd)->ci @@ -5153,6 +5570,11 @@ return 0; } +int composite_node::is_tag() +{ + return 0; +} + int glyph_node::same(node *nd) { return ci == ((glyph_node *)nd)->ci @@ -5171,6 +5593,11 @@ return 0; } +int glyph_node::is_tag() +{ + return 0; +} + int ligature_node::same(node *nd) { return (same_node(n1, ((ligature_node *)nd)->n1) @@ -5188,6 +5615,11 @@ return 0; } +int ligature_node::is_tag() +{ + return 0; +} + int kern_pair_node::same(node *nd) { return (amount == ((kern_pair_node *)nd)->amount @@ -5205,6 +5637,11 @@ return 0; } +int kern_pair_node::is_tag() +{ + return 0; +} + int dbreak_node::same(node *nd) { return (same_node_list(none, ((dbreak_node *)nd)->none) @@ -5222,6 +5659,11 @@ return 0; } +int dbreak_node::is_tag() +{ + return 0; +} + int break_char_node::same(node *nd) { return break_code == ((break_char_node *)nd)->break_code @@ -5239,6 +5681,11 @@ return 0; } +int break_char_node::is_tag() +{ + return 0; +} + int line_start_node::same(node * /*nd*/) { return 1; @@ -5254,6 +5701,11 @@ return 0; } +int line_start_node::is_tag() +{ + return 0; +} + int space_node::same(node *nd) { return n == ((space_node *)nd)->n @@ -5283,6 +5735,11 @@ return 0; } +int word_space_node::is_tag() +{ + return 0; +} + void unbreakable_space_node::tprint(troff_output_file *out) { out->fill_color(col); @@ -5338,6 +5795,11 @@ return 0; } +int diverted_space_node::is_tag() +{ + return 0; +} + int diverted_copy_file_node::same(node *nd) { return filename == ((diverted_copy_file_node *)nd)->filename; @@ -5353,6 +5815,11 @@ return 0; } +int diverted_copy_file_node::is_tag() +{ + return 0; +} + // Grow the font_table so that its size is > n. static void grow_font_table(int n) @@ -5382,7 +5849,8 @@ dictionary font_dictionary(50); -static int mount_font_no_translate(int n, symbol name, symbol external_name) +static int mount_font_no_translate(int n, symbol name, symbol external_name, + int check_only = 0) { assert(n >= 0); // We store the address of this char in font_dictionary to indicate @@ -5392,7 +5860,9 @@ void *p = font_dictionary.lookup(external_name); if (p == 0) { int not_found; - fm = font::load_font(external_name.contents(), ¬_found); + fm = font::load_font(external_name.contents(), ¬_found, check_only); + if (check_only) + return fm != 0; if (!fm) { if (not_found) warning(WARN_FONT, "can't find font `%1'", external_name.contents()); @@ -5409,6 +5879,8 @@ } else fm = (font*)p; + if (check_only) + return 1; if (n >= font_table_size) { if (n - font_table_size > 1000) { error("font position too much larger than first unused position"); @@ -5434,6 +5906,19 @@ return mount_font_no_translate(n, name, external_name); } +int check_font(symbol fam, symbol name) +{ + if (check_style(name)) + name = concat(fam, name); + return mount_font_no_translate(0, name, name, 1); +} + +int check_style(symbol s) +{ + int i = symbol_fontno(s); + return i < 0 ? 0 : font_table[i]->is_style(); +} + void mount_style(int n, symbol name) { assert(n >= 0); diff -ruN groff-1.19.1/src/roff/troff/node.h groff-1.19.2/src/roff/troff/node.h --- groff-1.19.1/src/roff/troff/node.h 2004-04-17 07:06:50.000000000 +0200 +++ groff-1.19.2/src/roff/troff/node.h 2005-05-26 15:37:21.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ struct hyphen_list { unsigned char hyphen; @@ -50,14 +50,20 @@ struct node { node *next; node *last; + statem *state; + statem *push_state; + int div_nest_level; + int is_special; node(); - node(node *n); - node *add_char(charinfo *c, environment *, hunits *widthp, int *spacep); + node(node *); + node(node *, statem *, int); + node *add_char(charinfo *, environment *, hunits *, int *, node ** = 0); virtual ~node(); virtual node *copy() = 0; virtual int set_unformat_flag(); virtual int force_tprint() = 0; + virtual int is_tag() = 0; virtual hunits width(); virtual hunits subscript_correction(); virtual hunits italic_correction(); @@ -67,7 +73,7 @@ virtual int merge_space(hunits, hunits, hunits); virtual vunits vertical_width(); virtual node *last_char_node(); - virtual void vertical_extent(vunits *min, vunits *max); + virtual void vertical_extent(vunits *, vunits *); virtual int character_type(); virtual void set_vertical_size(vertical_size *); virtual int ends_sentence(); @@ -81,9 +87,7 @@ virtual void spread_space(int *, hunits *); virtual void freeze_space(); virtual void is_escape_colon(); - virtual breakpoint *get_breakpoints(hunits width, int nspaces, - breakpoint *rest = 0, - int is_inner = 0); + virtual breakpoint *get_breakpoints(hunits, int, breakpoint * = 0, int = 0); virtual int nbreaks(); virtual void split(int, node **, node **); virtual hyphenation_type get_hyphenation_type(); @@ -105,18 +109,29 @@ virtual int same(node *) = 0; virtual const char *type() = 0; + virtual void debug_node(); + virtual void debug_node_list(); }; inline node::node() -: next(0), last(0) +: next(0), last(0), state(0), push_state(0), div_nest_level(0), is_special(0) { } inline node::node(node *n) -: next(n), last(0) +: next(n), last(0), state(0), push_state(0), div_nest_level(0), is_special(0) { } +inline node::node(node *n, statem *s, int divlevel) +: next(n), last(0), push_state(0), div_nest_level(divlevel), is_special(0) +{ + if (s) + state = new statem(s); + else + state = 0; +} + inline node::~node() { } @@ -140,6 +155,7 @@ node *copy() { return new line_start_node; } int same(node *); int force_tprint(); + int is_tag(); const char *type(); void asciify(macro *); }; @@ -156,8 +172,9 @@ char set; char was_escape_colon; color *col; /* for grotty */ - space_node(hunits, int, int, color *, node * = 0); + space_node(hunits, int, int, color *, statem *, int, node * = 0); public: + space_node(hunits, color *, statem *, int, node * = 0); space_node(hunits, color *, node * = 0); #if 0 ~space_node(); @@ -172,8 +189,7 @@ void is_escape_colon(); void spread_space(int *, hunits *); void tprint(troff_output_file *); - breakpoint *get_breakpoints(hunits width, int nspaces, breakpoint *rest = 0, - int is_inner = 0); + breakpoint *get_breakpoints(hunits, int, breakpoint * = 0, int = 0); int nbreaks(); void split(int, node **, node **); void ascii_print(ascii_output_file *); @@ -181,6 +197,7 @@ void asciify(macro *); const char *type(); int force_tprint(); + int is_tag(); hyphenation_type get_hyphenation_type(); }; @@ -196,7 +213,8 @@ protected: width_list *orig_width; unsigned char unformat; - word_space_node(hunits, int, color *, width_list *, int, node * = 0); + word_space_node(hunits, int, color *, width_list *, int, statem *, int, + node * = 0); public: word_space_node(hunits, color *, width_list *, node * = 0); ~word_space_node(); @@ -209,10 +227,11 @@ const char *type(); int merge_space(hunits, hunits, hunits); int force_tprint(); + int is_tag(); }; class unbreakable_space_node : public word_space_node { - unbreakable_space_node(hunits, int, color *, node * = 0); + unbreakable_space_node(hunits, int, color *, statem *, int, node * = 0); public: unbreakable_space_node(hunits, color *, node * = 0); node *copy(); @@ -222,8 +241,8 @@ void asciify(macro *); const char *type(); int force_tprint(); - breakpoint *get_breakpoints(hunits width, int nspaces, breakpoint *rest = 0, - int is_inner = 0); + int is_tag(); + breakpoint *get_breakpoints(hunits, int, breakpoint * = 0, int = 0); int nbreaks(); void split(int, node **, node **); int merge_space(hunits, hunits, hunits); @@ -235,41 +254,48 @@ class diverted_space_node : public node { public: vunits n; - diverted_space_node(vunits d, node *p = 0); + diverted_space_node(vunits, node * = 0); + diverted_space_node(vunits, statem *, int, node * = 0); node *copy(); int reread(int *); int same(node *); const char *type(); int force_tprint(); + int is_tag(); }; class diverted_copy_file_node : public node { symbol filename; public: vunits n; - diverted_copy_file_node(symbol s, node *p = 0); + diverted_copy_file_node(symbol, node * = 0); + diverted_copy_file_node(symbol, statem *, int, node * = 0); node *copy(); int reread(int *); int same(node *); const char *type(); int force_tprint(); + int is_tag(); }; class extra_size_node : public node { vunits n; public: - extra_size_node(vunits i) : n(i) {} + extra_size_node(vunits); + extra_size_node(vunits, statem *, int); void set_vertical_size(vertical_size *); node *copy(); int same(node *); const char *type(); int force_tprint(); + int is_tag(); }; class vertical_size_node : public node { vunits n; public: - vertical_size_node(vunits i) : n(i) {} + vertical_size_node(vunits, statem *, int); + vertical_size_node(vunits); void set_vertical_size(vertical_size *); void asciify(macro *); node *copy(); @@ -277,6 +303,7 @@ int same(node *); const char *type(); int force_tprint(); + int is_tag(); }; class hmotion_node : public node { @@ -288,6 +315,12 @@ public: hmotion_node(hunits i, color *c, node *nxt = 0) : node(nxt), n(i), was_tab(0), unformat(0), col(c) {} + hmotion_node(hunits i, color *c, statem *s, int divlevel, node *nxt = 0) + : node(nxt, s, divlevel), n(i), was_tab(0), unformat(0), col(c) {} + hmotion_node(hunits i, int flag1, int flag2, color *c, statem *s, + int divlevel, node *nxt = 0) + : node(nxt, s, divlevel), n(i), was_tab(flag1), unformat(flag2), + col(c) {} hmotion_node(hunits i, int flag1, int flag2, color *c, node *nxt = 0) : node(nxt), n(i), was_tab(flag1), unformat(flag2), col(c) {} node *copy(); @@ -300,6 +333,7 @@ int same(node *); const char *type(); int force_tprint(); + int is_tag(); node *add_self(node *, hyphen_list **); hyphen_list *get_hyphen_list(hyphen_list *, int *); hyphenation_type get_hyphenation_type(); @@ -308,6 +342,7 @@ class space_char_hmotion_node : public hmotion_node { public: space_char_hmotion_node(hunits, color *, node * = 0); + space_char_hmotion_node(hunits, color *, statem *, int, node * = 0); node *copy(); void ascii_print(ascii_output_file *); void asciify(macro *); @@ -315,6 +350,7 @@ int same(node *); const char *type(); int force_tprint(); + int is_tag(); node *add_self(node *, hyphen_list **); hyphen_list *get_hyphen_list(hyphen_list *, int *); hyphenation_type get_hyphenation_type(); @@ -324,20 +360,23 @@ vunits n; color *col; /* for grotty */ public: - vmotion_node(vunits i, color *c) : n(i), col(c) {} + vmotion_node(vunits, color *); + vmotion_node(vunits, color *, statem *, int); void tprint(troff_output_file *); node *copy(); vunits vertical_width(); int same(node *); const char *type(); int force_tprint(); + int is_tag(); }; class hline_node : public node { hunits x; node *n; public: - hline_node(hunits i, node *c, node *nxt = 0) : node(nxt), x(i), n(c) {} + hline_node(hunits, node *, node * = 0); + hline_node(hunits, node *, statem *, int, node * = 0); ~hline_node(); node *copy(); hunits width(); @@ -345,13 +384,15 @@ int same(node *); const char *type(); int force_tprint(); + int is_tag(); }; class vline_node : public node { vunits x; node *n; public: - vline_node(vunits i, node *c, node *nxt = 0) : node(nxt), x(i), n(c) {} + vline_node(vunits, node *, node * = 0); + vline_node(vunits, node *, statem *, int, node * = 0); ~vline_node(); node *copy(); void tprint(troff_output_file *); @@ -361,9 +402,9 @@ int same(node *); const char *type(); int force_tprint(); + int is_tag(); }; - class dummy_node : public node { public: dummy_node(node *nd = 0) : node(nd) {} @@ -371,6 +412,7 @@ int same(node *); const char *type(); int force_tprint(); + int is_tag(); hyphenation_type get_hyphenation_type(); }; @@ -381,6 +423,7 @@ int same(node *); const char *type(); int force_tprint(); + int is_tag(); int ends_sentence(); hyphenation_type get_hyphenation_type(); }; @@ -388,16 +431,18 @@ class zero_width_node : public node { node *n; public: - zero_width_node(node *gn); + zero_width_node(node *); + zero_width_node(node *, statem *, int); ~zero_width_node(); node *copy(); void tprint(troff_output_file *); int same(node *); const char *type(); int force_tprint(); + int is_tag(); void append(node *); int character_type(); - void vertical_extent(vunits *min, vunits *max); + void vertical_extent(vunits *, vunits *); }; class left_italic_corrected_node : public node { @@ -405,6 +450,7 @@ hunits x; public: left_italic_corrected_node(node * = 0); + left_italic_corrected_node(statem *, int, node * = 0); ~left_italic_corrected_node(); void tprint(troff_output_file *); void ascii_print(ascii_output_file *); @@ -413,6 +459,7 @@ int same(node *); const char *type(); int force_tprint(); + int is_tag(); hunits width(); node *last_char_node(); void vertical_extent(vunits *, vunits *); @@ -435,6 +482,7 @@ hunits max_width; public: overstrike_node(); + overstrike_node(statem *, int); ~overstrike_node(); node *copy(); void tprint(troff_output_file *); @@ -443,6 +491,7 @@ int same(node *); const char *type(); int force_tprint(); + int is_tag(); node *add_self(node *, hyphen_list **); hyphen_list *get_hyphen_list(hyphen_list *, int *); hyphenation_type get_hyphenation_type(); @@ -453,6 +502,7 @@ hunits max_width; public: bracket_node(); + bracket_node(statem *, int); ~bracket_node(); node *copy(); void tprint(troff_output_file *); @@ -461,6 +511,7 @@ int same(node *); const char *type(); int force_tprint(); + int is_tag(); }; class special_node : public node { @@ -474,12 +525,14 @@ void tprint_end(troff_output_file *); public: special_node(const macro &, int = 0); - special_node(const macro &, tfont *, color *, color *, int = 0); + special_node(const macro &, tfont *, color *, color *, statem *, int, + int = 0); node *copy(); void tprint(troff_output_file *); int same(node *); const char *type(); int force_tprint(); + int is_tag(); int ends_sentence(); tfont *get_tfont(); }; @@ -492,16 +545,34 @@ int image_id; public: suppress_node(int, int); - suppress_node(symbol f, char p, int id); - suppress_node(int, int, symbol f, char p, int id); + suppress_node(symbol, char, int); + suppress_node(int, int, symbol, char, int, statem *, int); + suppress_node(int, int, symbol, char, int); node *copy(); void tprint(troff_output_file *); hunits width(); int same(node *); const char *type(); int force_tprint(); + int is_tag(); private: - void put(troff_output_file *out, const char *s); + void put(troff_output_file *, const char *); +}; + +class tag_node : public node { +public: + string tag_string; + int delayed; + tag_node(); + tag_node(string, int); + tag_node(string, statem *, int, int); + node *copy(); + void tprint(troff_output_file *); + int same(node *); + const char *type(); + int force_tprint(); + int is_tag(); + int ends_sentence(); }; struct hvpair { @@ -519,6 +590,7 @@ hvpair *point; public: draw_node(char, hvpair *, int, font_size, color *, color *); + draw_node(char, hvpair *, int, font_size, color *, color *, statem *, int); ~draw_node(); hunits width(); vunits vertical_width(); @@ -527,18 +599,19 @@ int same(node *); const char *type(); int force_tprint(); + int is_tag(); }; class charinfo; -node *make_node(charinfo *ci, environment *); +node *make_node(charinfo *, environment *); int character_exists(charinfo *, environment *); -int same_node_list(node *n1, node *n2); -node *reverse_node_list(node *n); +int same_node_list(node *, node *); +node *reverse_node_list(node *); void delete_node_list(node *); node *copy_node_list(node *); -int get_bold_fontno(int f); +int get_bold_fontno(int); inline hyphen_list::hyphen_list(unsigned char code, hyphen_list *p) : hyphen(0), breakable(0), hyphenation_code(code), next(p) @@ -546,9 +619,11 @@ } extern void read_desc(); -extern int mount_font(int n, symbol, symbol = NULL_SYMBOL); -extern void mount_style(int n, symbol); -extern int is_good_fontno(int n); +extern int mount_font(int, symbol, symbol = NULL_SYMBOL); +extern int check_font(symbol, symbol); +extern int check_style(symbol); +extern void mount_style(int, symbol); +extern int is_good_fontno(int); extern int symbol_fontno(symbol); extern int next_available_font_position(); extern void init_size_table(int *); @@ -559,7 +634,7 @@ public: output_file(); virtual ~output_file(); - virtual void trailer(vunits page_length); + virtual void trailer(vunits); virtual void flush() = 0; virtual void transparent_char(unsigned char) = 0; virtual void print_line(hunits x, vunits y, node *n, @@ -567,12 +642,13 @@ virtual void begin_page(int pageno, vunits page_length) = 0; virtual void copy_file(hunits x, vunits y, const char *filename) = 0; virtual int is_printing() = 0; - virtual void put_filename(const char *filename); + virtual void put_filename(const char *); virtual void on(); virtual void off(); #ifdef COLUMN virtual void vjustify(vunits, symbol); #endif /* COLUMN */ + mtsm state; }; #ifndef POPEN_MISSING @@ -581,7 +657,7 @@ extern output_file *the_output; extern void init_output(); -int in_output_page_list(int n); +int in_output_page_list(int); class font_family { int *map; @@ -596,4 +672,5 @@ font_family *lookup_family(symbol); symbol get_font_name(int, environment *); +symbol get_style_name(int); extern search_path include_search_path; diff -ruN groff-1.19.1/src/roff/troff/number.cpp groff-1.19.2/src/roff/troff/number.cpp --- groff-1.19.1/src/roff/troff/number.cpp 2004-01-07 00:55:24.000000000 +0100 +++ groff-1.19.2/src/roff/troff/number.cpp 2005-05-26 15:37:21.000000000 +0200 @@ -17,11 +17,13 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "troff.h" #include "hvunits.h" +#include "stringclass.h" +#include "mtsm.h" #include "env.h" #include "token.h" #include "div.h" diff -ruN groff-1.19.1/src/roff/troff/reg.cpp groff-1.19.2/src/roff/troff/reg.cpp --- groff-1.19.1/src/roff/troff/reg.cpp 2004-01-07 00:55:49.000000000 +0100 +++ groff-1.19.2/src/roff/troff/reg.cpp 2005-05-26 15:37:21.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "troff.h" #include "dictionary.h" diff -ruN groff-1.19.1/src/roff/troff/reg.h groff-1.19.2/src/roff/troff/reg.h --- groff-1.19.1/src/roff/troff/reg.h 2003-02-14 17:52:25.000000000 +0100 +++ groff-1.19.2/src/roff/troff/reg.h 2005-05-26 15:37:21.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ class reg : public object { diff -ruN groff-1.19.1/src/roff/troff/request.h groff-1.19.2/src/roff/troff/request.h --- groff-1.19.1/src/roff/troff/request.h 2004-04-17 07:17:17.000000000 +0200 +++ groff-1.19.2/src/roff/troff/request.h 2005-05-26 15:37:21.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ typedef void (*REQUEST_FUNCP)(); @@ -45,15 +45,17 @@ struct node; class macro : public request_or_macro { - macro_header *p; const char *filename; // where was it defined? int lineno; int len; int empty_macro; + int is_a_diversion; public: + macro_header *p; macro(); ~macro(); macro(const macro &); + macro(int); macro &operator=(const macro &); void append(unsigned char); void append(node *); @@ -67,6 +69,7 @@ macro *to_macro(); void print_size(); int empty(); + int is_diversion(); friend class string_iterator; friend void chop_macro(); friend void substring_request(); diff -ruN groff-1.19.1/src/roff/troff/token.h groff-1.19.2/src/roff/troff/token.h --- groff-1.19.1/src/roff/troff/token.h 2004-04-17 07:06:28.000000000 +0200 +++ groff-1.19.2/src/roff/troff/token.h 2005-05-26 15:37:21.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ class charinfo; diff -ruN groff-1.19.1/src/roff/troff/troff.h groff-1.19.2/src/roff/troff/troff.h --- groff-1.19.1/src/roff/troff/troff.h 2004-04-07 16:48:18.000000000 +0200 +++ groff-1.19.2/src/roff/troff/troff.h 2005-05-26 15:37:21.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "lib.h" diff -ruN groff-1.19.1/src/utils/addftinfo/addftinfo.cpp groff-1.19.2/src/utils/addftinfo/addftinfo.cpp --- groff-1.19.1/src/utils/addftinfo/addftinfo.cpp 2001-08-19 23:32:36.000000000 +0200 +++ groff-1.19.2/src/utils/addftinfo/addftinfo.cpp 2005-05-26 15:37:21.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "lib.h" diff -ruN groff-1.19.1/src/utils/addftinfo/guess.cpp groff-1.19.2/src/utils/addftinfo/guess.cpp --- groff-1.19.1/src/utils/addftinfo/guess.cpp 2000-02-06 10:37:17.000000000 +0100 +++ groff-1.19.2/src/utils/addftinfo/guess.cpp 2005-05-26 15:37:21.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "guess.h" diff -ruN groff-1.19.1/src/utils/addftinfo/guess.h groff-1.19.2/src/utils/addftinfo/guess.h --- groff-1.19.1/src/utils/addftinfo/guess.h 2000-02-06 10:37:18.000000000 +0100 +++ groff-1.19.2/src/utils/addftinfo/guess.h 2005-05-26 15:37:21.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ struct font_params { int italic; diff -ruN groff-1.19.1/src/utils/afmtodit/afmtodit.man groff-1.19.2/src/utils/afmtodit/afmtodit.man --- groff-1.19.1/src/utils/afmtodit/afmtodit.man 2003-12-28 12:08:49.000000000 +0100 +++ groff-1.19.2/src/utils/afmtodit/afmtodit.man 2005-02-14 07:06:11.000000000 +0100 @@ -1,5 +1,5 @@ .ig -Copyright (C) 1989-2000, 2001, 2002, 2003 Free Software Foundation, Inc. +Copyright (C) 1989-2000, 2001, 2002, 2003, 2005 Free Software Foundation, Inc. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice @@ -66,7 +66,7 @@ . .B afmtodit is written in perl; -you must have perl version 3 or newer installed in order to run +you must have perl version 5.004 or newer installed in order to run .BR afmtodit . . .LP diff -ruN groff-1.19.1/src/utils/afmtodit/afmtodit.pl groff-1.19.2/src/utils/afmtodit/afmtodit.pl --- groff-1.19.1/src/utils/afmtodit/afmtodit.pl 2003-12-28 12:15:17.000000000 +0100 +++ groff-1.19.2/src/utils/afmtodit/afmtodit.pl 2005-05-26 15:37:21.000000000 +0200 @@ -1,6 +1,7 @@ -#! /usr/bin/perl +#! /usr/bin/perl -w # -*- Perl -*- -# Copyright (C) 1989-2000, 2001, 2002, 2003 Free Software Foundation, Inc. +# Copyright (C) 1989-2000, 2001, 2002, 2003, 2004, 2005 +# Free Software Foundation, Inc. # Written by James Clark (jjc@jclark.com) # # This file is part of groff. @@ -17,6036 +18,6041 @@ # # You should have received a copy of the GNU General Public License along # with groff; see the file COPYING. If not, write to the Free Software -# Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. -%unicode_decomposed = ( - "u00C0", "u0041_0300", - "u00C1", "u0041_0301", - "u00C2", "u0041_0302", - "u00C3", "u0041_0303", - "u00C4", "u0041_0308", - "u00C5", "u0041_030A", - "u00C7", "u0043_0327", - "u00C8", "u0045_0300", - "u00C9", "u0045_0301", - "u00CA", "u0045_0302", - "u00CB", "u0045_0308", - "u00CC", "u0049_0300", - "u00CD", "u0049_0301", - "u00CE", "u0049_0302", - "u00CF", "u0049_0308", - "u00D1", "u004E_0303", - "u00D2", "u004F_0300", - "u00D3", "u004F_0301", - "u00D4", "u004F_0302", - "u00D5", "u004F_0303", - "u00D6", "u004F_0308", - "u00D9", "u0055_0300", - "u00DA", "u0055_0301", - "u00DB", "u0055_0302", - "u00DC", "u0055_0308", - "u00DD", "u0059_0301", - "u00E0", "u0061_0300", - "u00E1", "u0061_0301", - "u00E2", "u0061_0302", - "u00E3", "u0061_0303", - "u00E4", "u0061_0308", - "u00E5", "u0061_030A", - "u00E7", "u0063_0327", - "u00E8", "u0065_0300", - "u00E9", "u0065_0301", - "u00EA", "u0065_0302", - "u00EB", "u0065_0308", - "u00EC", "u0069_0300", - "u00ED", "u0069_0301", - "u00EE", "u0069_0302", - "u00EF", "u0069_0308", - "u00F1", "u006E_0303", - "u00F2", "u006F_0300", - "u00F3", "u006F_0301", - "u00F4", "u006F_0302", - "u00F5", "u006F_0303", - "u00F6", "u006F_0308", - "u00F9", "u0075_0300", - "u00FA", "u0075_0301", - "u00FB", "u0075_0302", - "u00FC", "u0075_0308", - "u00FD", "u0079_0301", - "u00FF", "u0079_0308", - "u0100", "u0041_0304", - "u0101", "u0061_0304", - "u0102", "u0041_0306", - "u0103", "u0061_0306", - "u0104", "u0041_0328", - "u0105", "u0061_0328", - "u0106", "u0043_0301", - "u0107", "u0063_0301", - "u0108", "u0043_0302", - "u0109", "u0063_0302", - "u010A", "u0043_0307", - "u010B", "u0063_0307", - "u010C", "u0043_030C", - "u010D", "u0063_030C", - "u010E", "u0044_030C", - "u010F", "u0064_030C", - "u0112", "u0045_0304", - "u0113", "u0065_0304", - "u0114", "u0045_0306", - "u0115", "u0065_0306", - "u0116", "u0045_0307", - "u0117", "u0065_0307", - "u0118", "u0045_0328", - "u0119", "u0065_0328", - "u011A", "u0045_030C", - "u011B", "u0065_030C", - "u011C", "u0047_0302", - "u011D", "u0067_0302", - "u011E", "u0047_0306", - "u011F", "u0067_0306", - "u0120", "u0047_0307", - "u0121", "u0067_0307", - "u0122", "u0047_0327", - "u0123", "u0067_0327", - "u0124", "u0048_0302", - "u0125", "u0068_0302", - "u0128", "u0049_0303", - "u0129", "u0069_0303", - "u012A", "u0049_0304", - "u012B", "u0069_0304", - "u012C", "u0049_0306", - "u012D", "u0069_0306", - "u012E", "u0049_0328", - "u012F", "u0069_0328", - "u0130", "u0049_0307", - "u0134", "u004A_0302", - "u0135", "u006A_0302", - "u0136", "u004B_0327", - "u0137", "u006B_0327", - "u0139", "u004C_0301", - "u013A", "u006C_0301", - "u013B", "u004C_0327", - "u013C", "u006C_0327", - "u013D", "u004C_030C", - "u013E", "u006C_030C", - "u0143", "u004E_0301", - "u0144", "u006E_0301", - "u0145", "u004E_0327", - "u0146", "u006E_0327", - "u0147", "u004E_030C", - "u0148", "u006E_030C", - "u014C", "u004F_0304", - "u014D", "u006F_0304", - "u014E", "u004F_0306", - "u014F", "u006F_0306", - "u0150", "u004F_030B", - "u0151", "u006F_030B", - "u0154", "u0052_0301", - "u0155", "u0072_0301", - "u0156", "u0052_0327", - "u0157", "u0072_0327", - "u0158", "u0052_030C", - "u0159", "u0072_030C", - "u015A", "u0053_0301", - "u015B", "u0073_0301", - "u015C", "u0053_0302", - "u015D", "u0073_0302", - "u015E", "u0053_0327", - "u015F", "u0073_0327", - "u0160", "u0053_030C", - "u0161", "u0073_030C", - "u0162", "u0054_0327", - "u0163", "u0074_0327", - "u0164", "u0054_030C", - "u0165", "u0074_030C", - "u0168", "u0055_0303", - "u0169", "u0075_0303", - "u016A", "u0055_0304", - "u016B", "u0075_0304", - "u016C", "u0055_0306", - "u016D", "u0075_0306", - "u016E", "u0055_030A", - "u016F", "u0075_030A", - "u0170", "u0055_030B", - "u0171", "u0075_030B", - "u0172", "u0055_0328", - "u0173", "u0075_0328", - "u0174", "u0057_0302", - "u0175", "u0077_0302", - "u0176", "u0059_0302", - "u0177", "u0079_0302", - "u0178", "u0059_0308", - "u0179", "u005A_0301", - "u017A", "u007A_0301", - "u017B", "u005A_0307", - "u017C", "u007A_0307", - "u017D", "u005A_030C", - "u017E", "u007A_030C", - "u01A0", "u004F_031B", - "u01A1", "u006F_031B", - "u01AF", "u0055_031B", - "u01B0", "u0075_031B", - "u01CD", "u0041_030C", - "u01CE", "u0061_030C", - "u01CF", "u0049_030C", - "u01D0", "u0069_030C", - "u01D1", "u004F_030C", - "u01D2", "u006F_030C", - "u01D3", "u0055_030C", - "u01D4", "u0075_030C", - "u01D5", "u0055_0308_0304", - "u01D6", "u0075_0308_0304", - "u01D7", "u0055_0308_0301", - "u01D8", "u0075_0308_0301", - "u01D9", "u0055_0308_030C", - "u01DA", "u0075_0308_030C", - "u01DB", "u0055_0308_0300", - "u01DC", "u0075_0308_0300", - "u01DE", "u0041_0308_0304", - "u01DF", "u0061_0308_0304", - "u01E0", "u0041_0307_0304", - "u01E1", "u0061_0307_0304", - "u01E2", "u00C6_0304", - "u01E3", "u00E6_0304", - "u01E6", "u0047_030C", - "u01E7", "u0067_030C", - "u01E8", "u004B_030C", - "u01E9", "u006B_030C", - "u01EA", "u004F_0328", - "u01EB", "u006F_0328", - "u01EC", "u004F_0328_0304", - "u01ED", "u006F_0328_0304", - "u01EE", "u01B7_030C", - "u01EF", "u0292_030C", - "u01F0", "u006A_030C", - "u01F4", "u0047_0301", - "u01F5", "u0067_0301", - "u01F8", "u004E_0300", - "u01F9", "u006E_0300", - "u01FA", "u0041_030A_0301", - "u01FB", "u0061_030A_0301", - "u01FC", "u00C6_0301", - "u01FD", "u00E6_0301", - "u01FE", "u00D8_0301", - "u01FF", "u00F8_0301", - "u0200", "u0041_030F", - "u0201", "u0061_030F", - "u0202", "u0041_0311", - "u0203", "u0061_0311", - "u0204", "u0045_030F", - "u0205", "u0065_030F", - "u0206", "u0045_0311", - "u0207", "u0065_0311", - "u0208", "u0049_030F", - "u0209", "u0069_030F", - "u020A", "u0049_0311", - "u020B", "u0069_0311", - "u020C", "u004F_030F", - "u020D", "u006F_030F", - "u020E", "u004F_0311", - "u020F", "u006F_0311", - "u0210", "u0052_030F", - "u0211", "u0072_030F", - "u0212", "u0052_0311", - "u0213", "u0072_0311", - "u0214", "u0055_030F", - "u0215", "u0075_030F", - "u0216", "u0055_0311", - "u0217", "u0075_0311", - "u0218", "u0053_0326", - "u0219", "u0073_0326", - "u021A", "u0054_0326", - "u021B", "u0074_0326", - "u021E", "u0048_030C", - "u021F", "u0068_030C", - "u0226", "u0041_0307", - "u0227", "u0061_0307", - "u0228", "u0045_0327", - "u0229", "u0065_0327", - "u022A", "u004F_0308_0304", - "u022B", "u006F_0308_0304", - "u022C", "u004F_0303_0304", - "u022D", "u006F_0303_0304", - "u022E", "u004F_0307", - "u022F", "u006F_0307", - "u0230", "u004F_0307_0304", - "u0231", "u006F_0307_0304", - "u0232", "u0059_0304", - "u0233", "u0079_0304", - "u0340", "u0300", - "u0341", "u0301", - "u0343", "u0313", - "u0344", "u0308_0301", - "u0374", "u02B9", - "u037E", "u003B", - "u0385", "u00A8_0301", - "u0386", "u0391_0301", - "u0387", "u00B7", - "u0388", "u0395_0301", - "u0389", "u0397_0301", - "u038A", "u0399_0301", - "u038C", "u039F_0301", - "u038E", "u03A5_0301", - "u038F", "u03A9_0301", - "u0390", "u03B9_0308_0301", - "u03AA", "u0399_0308", - "u03AB", "u03A5_0308", - "u03AC", "u03B1_0301", - "u03AD", "u03B5_0301", - "u03AE", "u03B7_0301", - "u03AF", "u03B9_0301", - "u03B0", "u03C5_0308_0301", - "u03CA", "u03B9_0308", - "u03CB", "u03C5_0308", - "u03CC", "u03BF_0301", - "u03CD", "u03C5_0301", - "u03CE", "u03C9_0301", - "u03D3", "u03D2_0301", - "u03D4", "u03D2_0308", - "u0400", "u0415_0300", - "u0401", "u0415_0308", - "u0403", "u0413_0301", - "u0407", "u0406_0308", - "u040C", "u041A_0301", - "u040D", "u0418_0300", - "u040E", "u0423_0306", - "u0419", "u0418_0306", - "u0439", "u0438_0306", - "u0450", "u0435_0300", - "u0451", "u0435_0308", - "u0453", "u0433_0301", - "u0457", "u0456_0308", - "u045C", "u043A_0301", - "u045D", "u0438_0300", - "u045E", "u0443_0306", - "u0476", "u0474_030F", - "u0477", "u0475_030F", - "u04C1", "u0416_0306", - "u04C2", "u0436_0306", - "u04D0", "u0410_0306", - "u04D1", "u0430_0306", - "u04D2", "u0410_0308", - "u04D3", "u0430_0308", - "u04D6", "u0415_0306", - "u04D7", "u0435_0306", - "u04DA", "u04D8_0308", - "u04DB", "u04D9_0308", - "u04DC", "u0416_0308", - "u04DD", "u0436_0308", - "u04DE", "u0417_0308", - "u04DF", "u0437_0308", - "u04E2", "u0418_0304", - "u04E3", "u0438_0304", - "u04E4", "u0418_0308", - "u04E5", "u0438_0308", - "u04E6", "u041E_0308", - "u04E7", "u043E_0308", - "u04EA", "u04E8_0308", - "u04EB", "u04E9_0308", - "u04EC", "u042D_0308", - "u04ED", "u044D_0308", - "u04EE", "u0423_0304", - "u04EF", "u0443_0304", - "u04F0", "u0423_0308", - "u04F1", "u0443_0308", - "u04F2", "u0423_030B", - "u04F3", "u0443_030B", - "u04F4", "u0427_0308", - "u04F5", "u0447_0308", - "u04F8", "u042B_0308", - "u04F9", "u044B_0308", - "u0622", "u0627_0653", - "u0623", "u0627_0654", - "u0624", "u0648_0654", - "u0625", "u0627_0655", - "u0626", "u064A_0654", - "u06C0", "u06D5_0654", - "u06C2", "u06C1_0654", - "u06D3", "u06D2_0654", - "u0929", "u0928_093C", - "u0931", "u0930_093C", - "u0934", "u0933_093C", - "u0958", "u0915_093C", - "u0959", "u0916_093C", - "u095A", "u0917_093C", - "u095B", "u091C_093C", - "u095C", "u0921_093C", - "u095D", "u0922_093C", - "u095E", "u092B_093C", - "u095F", "u092F_093C", - "u09CB", "u09C7_09BE", - "u09CC", "u09C7_09D7", - "u09DC", "u09A1_09BC", - "u09DD", "u09A2_09BC", - "u09DF", "u09AF_09BC", - "u0A33", "u0A32_0A3C", - "u0A36", "u0A38_0A3C", - "u0A59", "u0A16_0A3C", - "u0A5A", "u0A17_0A3C", - "u0A5B", "u0A1C_0A3C", - "u0A5E", "u0A2B_0A3C", - "u0B48", "u0B47_0B56", - "u0B4B", "u0B47_0B3E", - "u0B4C", "u0B47_0B57", - "u0B5C", "u0B21_0B3C", - "u0B5D", "u0B22_0B3C", - "u0B94", "u0B92_0BD7", - "u0BCA", "u0BC6_0BBE", - "u0BCB", "u0BC7_0BBE", - "u0BCC", "u0BC6_0BD7", - "u0C48", "u0C46_0C56", - "u0CC0", "u0CBF_0CD5", - "u0CC7", "u0CC6_0CD5", - "u0CC8", "u0CC6_0CD6", - "u0CCA", "u0CC6_0CC2", - "u0CCB", "u0CC6_0CC2_0CD5", - "u0D4A", "u0D46_0D3E", - "u0D4B", "u0D47_0D3E", - "u0D4C", "u0D46_0D57", - "u0DDA", "u0DD9_0DCA", - "u0DDC", "u0DD9_0DCF", - "u0DDD", "u0DD9_0DCF_0DCA", - "u0DDE", "u0DD9_0DDF", - "u0F43", "u0F42_0FB7", - "u0F4D", "u0F4C_0FB7", - "u0F52", "u0F51_0FB7", - "u0F57", "u0F56_0FB7", - "u0F5C", "u0F5B_0FB7", - "u0F69", "u0F40_0FB5", - "u0F73", "u0F71_0F72", - "u0F75", "u0F71_0F74", - "u0F76", "u0FB2_0F80", - "u0F78", "u0FB3_0F80", - "u0F81", "u0F71_0F80", - "u0F93", "u0F92_0FB7", - "u0F9D", "u0F9C_0FB7", - "u0FA2", "u0FA1_0FB7", - "u0FA7", "u0FA6_0FB7", - "u0FAC", "u0FAB_0FB7", - "u0FB9", "u0F90_0FB5", - "u1026", "u1025_102E", - "u1E00", "u0041_0325", - "u1E01", "u0061_0325", - "u1E02", "u0042_0307", - "u1E03", "u0062_0307", - "u1E04", "u0042_0323", - "u1E05", "u0062_0323", - "u1E06", "u0042_0331", - "u1E07", "u0062_0331", - "u1E08", "u0043_0327_0301", - "u1E09", "u0063_0327_0301", - "u1E0A", "u0044_0307", - "u1E0B", "u0064_0307", - "u1E0C", "u0044_0323", - "u1E0D", "u0064_0323", - "u1E0E", "u0044_0331", - "u1E0F", "u0064_0331", - "u1E10", "u0044_0327", - "u1E11", "u0064_0327", - "u1E12", "u0044_032D", - "u1E13", "u0064_032D", - "u1E14", "u0045_0304_0300", - "u1E15", "u0065_0304_0300", - "u1E16", "u0045_0304_0301", - "u1E17", "u0065_0304_0301", - "u1E18", "u0045_032D", - "u1E19", "u0065_032D", - "u1E1A", "u0045_0330", - "u1E1B", "u0065_0330", - "u1E1C", "u0045_0327_0306", - "u1E1D", "u0065_0327_0306", - "u1E1E", "u0046_0307", - "u1E1F", "u0066_0307", - "u1E20", "u0047_0304", - "u1E21", "u0067_0304", - "u1E22", "u0048_0307", - "u1E23", "u0068_0307", - "u1E24", "u0048_0323", - "u1E25", "u0068_0323", - "u1E26", "u0048_0308", - "u1E27", "u0068_0308", - "u1E28", "u0048_0327", - "u1E29", "u0068_0327", - "u1E2A", "u0048_032E", - "u1E2B", "u0068_032E", - "u1E2C", "u0049_0330", - "u1E2D", "u0069_0330", - "u1E2E", "u0049_0308_0301", - "u1E2F", "u0069_0308_0301", - "u1E30", "u004B_0301", - "u1E31", "u006B_0301", - "u1E32", "u004B_0323", - "u1E33", "u006B_0323", - "u1E34", "u004B_0331", - "u1E35", "u006B_0331", - "u1E36", "u004C_0323", - "u1E37", "u006C_0323", - "u1E38", "u004C_0323_0304", - "u1E39", "u006C_0323_0304", - "u1E3A", "u004C_0331", - "u1E3B", "u006C_0331", - "u1E3C", "u004C_032D", - "u1E3D", "u006C_032D", - "u1E3E", "u004D_0301", - "u1E3F", "u006D_0301", - "u1E40", "u004D_0307", - "u1E41", "u006D_0307", - "u1E42", "u004D_0323", - "u1E43", "u006D_0323", - "u1E44", "u004E_0307", - "u1E45", "u006E_0307", - "u1E46", "u004E_0323", - "u1E47", "u006E_0323", - "u1E48", "u004E_0331", - "u1E49", "u006E_0331", - "u1E4A", "u004E_032D", - "u1E4B", "u006E_032D", - "u1E4C", "u004F_0303_0301", - "u1E4D", "u006F_0303_0301", - "u1E4E", "u004F_0303_0308", - "u1E4F", "u006F_0303_0308", - "u1E50", "u004F_0304_0300", - "u1E51", "u006F_0304_0300", - "u1E52", "u004F_0304_0301", - "u1E53", "u006F_0304_0301", - "u1E54", "u0050_0301", - "u1E55", "u0070_0301", - "u1E56", "u0050_0307", - "u1E57", "u0070_0307", - "u1E58", "u0052_0307", - "u1E59", "u0072_0307", - "u1E5A", "u0052_0323", - "u1E5B", "u0072_0323", - "u1E5C", "u0052_0323_0304", - "u1E5D", "u0072_0323_0304", - "u1E5E", "u0052_0331", - "u1E5F", "u0072_0331", - "u1E60", "u0053_0307", - "u1E61", "u0073_0307", - "u1E62", "u0053_0323", - "u1E63", "u0073_0323", - "u1E64", "u0053_0301_0307", - "u1E65", "u0073_0301_0307", - "u1E66", "u0053_030C_0307", - "u1E67", "u0073_030C_0307", - "u1E68", "u0053_0323_0307", - "u1E69", "u0073_0323_0307", - "u1E6A", "u0054_0307", - "u1E6B", "u0074_0307", - "u1E6C", "u0054_0323", - "u1E6D", "u0074_0323", - "u1E6E", "u0054_0331", - "u1E6F", "u0074_0331", - "u1E70", "u0054_032D", - "u1E71", "u0074_032D", - "u1E72", "u0055_0324", - "u1E73", "u0075_0324", - "u1E74", "u0055_0330", - "u1E75", "u0075_0330", - "u1E76", "u0055_032D", - "u1E77", "u0075_032D", - "u1E78", "u0055_0303_0301", - "u1E79", "u0075_0303_0301", - "u1E7A", "u0055_0304_0308", - "u1E7B", "u0075_0304_0308", - "u1E7C", "u0056_0303", - "u1E7D", "u0076_0303", - "u1E7E", "u0056_0323", - "u1E7F", "u0076_0323", - "u1E80", "u0057_0300", - "u1E81", "u0077_0300", - "u1E82", "u0057_0301", - "u1E83", "u0077_0301", - "u1E84", "u0057_0308", - "u1E85", "u0077_0308", - "u1E86", "u0057_0307", - "u1E87", "u0077_0307", - "u1E88", "u0057_0323", - "u1E89", "u0077_0323", - "u1E8A", "u0058_0307", - "u1E8B", "u0078_0307", - "u1E8C", "u0058_0308", - "u1E8D", "u0078_0308", - "u1E8E", "u0059_0307", - "u1E8F", "u0079_0307", - "u1E90", "u005A_0302", - "u1E91", "u007A_0302", - "u1E92", "u005A_0323", - "u1E93", "u007A_0323", - "u1E94", "u005A_0331", - "u1E95", "u007A_0331", - "u1E96", "u0068_0331", - "u1E97", "u0074_0308", - "u1E98", "u0077_030A", - "u1E99", "u0079_030A", - "u1E9B", "u017F_0307", - "u1EA0", "u0041_0323", - "u1EA1", "u0061_0323", - "u1EA2", "u0041_0309", - "u1EA3", "u0061_0309", - "u1EA4", "u0041_0302_0301", - "u1EA5", "u0061_0302_0301", - "u1EA6", "u0041_0302_0300", - "u1EA7", "u0061_0302_0300", - "u1EA8", "u0041_0302_0309", - "u1EA9", "u0061_0302_0309", - "u1EAA", "u0041_0302_0303", - "u1EAB", "u0061_0302_0303", - "u1EAC", "u0041_0323_0302", - "u1EAD", "u0061_0323_0302", - "u1EAE", "u0041_0306_0301", - "u1EAF", "u0061_0306_0301", - "u1EB0", "u0041_0306_0300", - "u1EB1", "u0061_0306_0300", - "u1EB2", "u0041_0306_0309", - "u1EB3", "u0061_0306_0309", - "u1EB4", "u0041_0306_0303", - "u1EB5", "u0061_0306_0303", - "u1EB6", "u0041_0323_0306", - "u1EB7", "u0061_0323_0306", - "u1EB8", "u0045_0323", - "u1EB9", "u0065_0323", - "u1EBA", "u0045_0309", - "u1EBB", "u0065_0309", - "u1EBC", "u0045_0303", - "u1EBD", "u0065_0303", - "u1EBE", "u0045_0302_0301", - "u1EBF", "u0065_0302_0301", - "u1EC0", "u0045_0302_0300", - "u1EC1", "u0065_0302_0300", - "u1EC2", "u0045_0302_0309", - "u1EC3", "u0065_0302_0309", - "u1EC4", "u0045_0302_0303", - "u1EC5", "u0065_0302_0303", - "u1EC6", "u0045_0323_0302", - "u1EC7", "u0065_0323_0302", - "u1EC8", "u0049_0309", - "u1EC9", "u0069_0309", - "u1ECA", "u0049_0323", - "u1ECB", "u0069_0323", - "u1ECC", "u004F_0323", - "u1ECD", "u006F_0323", - "u1ECE", "u004F_0309", - "u1ECF", "u006F_0309", - "u1ED0", "u004F_0302_0301", - "u1ED1", "u006F_0302_0301", - "u1ED2", "u004F_0302_0300", - "u1ED3", "u006F_0302_0300", - "u1ED4", "u004F_0302_0309", - "u1ED5", "u006F_0302_0309", - "u1ED6", "u004F_0302_0303", - "u1ED7", "u006F_0302_0303", - "u1ED8", "u004F_0323_0302", - "u1ED9", "u006F_0323_0302", - "u1EDA", "u004F_031B_0301", - "u1EDB", "u006F_031B_0301", - "u1EDC", "u004F_031B_0300", - "u1EDD", "u006F_031B_0300", - "u1EDE", "u004F_031B_0309", - "u1EDF", "u006F_031B_0309", - "u1EE0", "u004F_031B_0303", - "u1EE1", "u006F_031B_0303", - "u1EE2", "u004F_031B_0323", - "u1EE3", "u006F_031B_0323", - "u1EE4", "u0055_0323", - "u1EE5", "u0075_0323", - "u1EE6", "u0055_0309", - "u1EE7", "u0075_0309", - "u1EE8", "u0055_031B_0301", - "u1EE9", "u0075_031B_0301", - "u1EEA", "u0055_031B_0300", - "u1EEB", "u0075_031B_0300", - "u1EEC", "u0055_031B_0309", - "u1EED", "u0075_031B_0309", - "u1EEE", "u0055_031B_0303", - "u1EEF", "u0075_031B_0303", - "u1EF0", "u0055_031B_0323", - "u1EF1", "u0075_031B_0323", - "u1EF2", "u0059_0300", - "u1EF3", "u0079_0300", - "u1EF4", "u0059_0323", - "u1EF5", "u0079_0323", - "u1EF6", "u0059_0309", - "u1EF7", "u0079_0309", - "u1EF8", "u0059_0303", - "u1EF9", "u0079_0303", - "u1F00", "u03B1_0313", - "u1F01", "u03B1_0314", - "u1F02", "u03B1_0313_0300", - "u1F03", "u03B1_0314_0300", - "u1F04", "u03B1_0313_0301", - "u1F05", "u03B1_0314_0301", - "u1F06", "u03B1_0313_0342", - "u1F07", "u03B1_0314_0342", - "u1F08", "u0391_0313", - "u1F09", "u0391_0314", - "u1F0A", "u0391_0313_0300", - "u1F0B", "u0391_0314_0300", - "u1F0C", "u0391_0313_0301", - "u1F0D", "u0391_0314_0301", - "u1F0E", "u0391_0313_0342", - "u1F0F", "u0391_0314_0342", - "u1F10", "u03B5_0313", - "u1F11", "u03B5_0314", - "u1F12", "u03B5_0313_0300", - "u1F13", "u03B5_0314_0300", - "u1F14", "u03B5_0313_0301", - "u1F15", "u03B5_0314_0301", - "u1F18", "u0395_0313", - "u1F19", "u0395_0314", - "u1F1A", "u0395_0313_0300", - "u1F1B", "u0395_0314_0300", - "u1F1C", "u0395_0313_0301", - "u1F1D", "u0395_0314_0301", - "u1F20", "u03B7_0313", - "u1F21", "u03B7_0314", - "u1F22", "u03B7_0313_0300", - "u1F23", "u03B7_0314_0300", - "u1F24", "u03B7_0313_0301", - "u1F25", "u03B7_0314_0301", - "u1F26", "u03B7_0313_0342", - "u1F27", "u03B7_0314_0342", - "u1F28", "u0397_0313", - "u1F29", "u0397_0314", - "u1F2A", "u0397_0313_0300", - "u1F2B", "u0397_0314_0300", - "u1F2C", "u0397_0313_0301", - "u1F2D", "u0397_0314_0301", - "u1F2E", "u0397_0313_0342", - "u1F2F", "u0397_0314_0342", - "u1F30", "u03B9_0313", - "u1F31", "u03B9_0314", - "u1F32", "u03B9_0313_0300", - "u1F33", "u03B9_0314_0300", - "u1F34", "u03B9_0313_0301", - "u1F35", "u03B9_0314_0301", - "u1F36", "u03B9_0313_0342", - "u1F37", "u03B9_0314_0342", - "u1F38", "u0399_0313", - "u1F39", "u0399_0314", - "u1F3A", "u0399_0313_0300", - "u1F3B", "u0399_0314_0300", - "u1F3C", "u0399_0313_0301", - "u1F3D", "u0399_0314_0301", - "u1F3E", "u0399_0313_0342", - "u1F3F", "u0399_0314_0342", - "u1F40", "u03BF_0313", - "u1F41", "u03BF_0314", - "u1F42", "u03BF_0313_0300", - "u1F43", "u03BF_0314_0300", - "u1F44", "u03BF_0313_0301", - "u1F45", "u03BF_0314_0301", - "u1F48", "u039F_0313", - "u1F49", "u039F_0314", - "u1F4A", "u039F_0313_0300", - "u1F4B", "u039F_0314_0300", - "u1F4C", "u039F_0313_0301", - "u1F4D", "u039F_0314_0301", - "u1F50", "u03C5_0313", - "u1F51", "u03C5_0314", - "u1F52", "u03C5_0313_0300", - "u1F53", "u03C5_0314_0300", - "u1F54", "u03C5_0313_0301", - "u1F55", "u03C5_0314_0301", - "u1F56", "u03C5_0313_0342", - "u1F57", "u03C5_0314_0342", - "u1F59", "u03A5_0314", - "u1F5B", "u03A5_0314_0300", - "u1F5D", "u03A5_0314_0301", - "u1F5F", "u03A5_0314_0342", - "u1F60", "u03C9_0313", - "u1F61", "u03C9_0314", - "u1F62", "u03C9_0313_0300", - "u1F63", "u03C9_0314_0300", - "u1F64", "u03C9_0313_0301", - "u1F65", "u03C9_0314_0301", - "u1F66", "u03C9_0313_0342", - "u1F67", "u03C9_0314_0342", - "u1F68", "u03A9_0313", - "u1F69", "u03A9_0314", - "u1F6A", "u03A9_0313_0300", - "u1F6B", "u03A9_0314_0300", - "u1F6C", "u03A9_0313_0301", - "u1F6D", "u03A9_0314_0301", - "u1F6E", "u03A9_0313_0342", - "u1F6F", "u03A9_0314_0342", - "u1F70", "u03B1_0300", - "u1F71", "u03B1_0301", - "u1F72", "u03B5_0300", - "u1F73", "u03B5_0301", - "u1F74", "u03B7_0300", - "u1F75", "u03B7_0301", - "u1F76", "u03B9_0300", - "u1F77", "u03B9_0301", - "u1F78", "u03BF_0300", - "u1F79", "u03BF_0301", - "u1F7A", "u03C5_0300", - "u1F7B", "u03C5_0301", - "u1F7C", "u03C9_0300", - "u1F7D", "u03C9_0301", - "u1F80", "u03B1_0313_0345", - "u1F81", "u03B1_0314_0345", - "u1F82", "u03B1_0313_0300_0345", - "u1F83", "u03B1_0314_0300_0345", - "u1F84", "u03B1_0313_0301_0345", - "u1F85", "u03B1_0314_0301_0345", - "u1F86", "u03B1_0313_0342_0345", - "u1F87", "u03B1_0314_0342_0345", - "u1F88", "u0391_0313_0345", - "u1F89", "u0391_0314_0345", - "u1F8A", "u0391_0313_0300_0345", - "u1F8B", "u0391_0314_0300_0345", - "u1F8C", "u0391_0313_0301_0345", - "u1F8D", "u0391_0314_0301_0345", - "u1F8E", "u0391_0313_0342_0345", - "u1F8F", "u0391_0314_0342_0345", - "u1F90", "u03B7_0313_0345", - "u1F91", "u03B7_0314_0345", - "u1F92", "u03B7_0313_0300_0345", - "u1F93", "u03B7_0314_0300_0345", - "u1F94", "u03B7_0313_0301_0345", - "u1F95", "u03B7_0314_0301_0345", - "u1F96", "u03B7_0313_0342_0345", - "u1F97", "u03B7_0314_0342_0345", - "u1F98", "u0397_0313_0345", - "u1F99", "u0397_0314_0345", - "u1F9A", "u0397_0313_0300_0345", - "u1F9B", "u0397_0314_0300_0345", - "u1F9C", "u0397_0313_0301_0345", - "u1F9D", "u0397_0314_0301_0345", - "u1F9E", "u0397_0313_0342_0345", - "u1F9F", "u0397_0314_0342_0345", - "u1FA0", "u03C9_0313_0345", - "u1FA1", "u03C9_0314_0345", - "u1FA2", "u03C9_0313_0300_0345", - "u1FA3", "u03C9_0314_0300_0345", - "u1FA4", "u03C9_0313_0301_0345", - "u1FA5", "u03C9_0314_0301_0345", - "u1FA6", "u03C9_0313_0342_0345", - "u1FA7", "u03C9_0314_0342_0345", - "u1FA8", "u03A9_0313_0345", - "u1FA9", "u03A9_0314_0345", - "u1FAA", "u03A9_0313_0300_0345", - "u1FAB", "u03A9_0314_0300_0345", - "u1FAC", "u03A9_0313_0301_0345", - "u1FAD", "u03A9_0314_0301_0345", - "u1FAE", "u03A9_0313_0342_0345", - "u1FAF", "u03A9_0314_0342_0345", - "u1FB0", "u03B1_0306", - "u1FB1", "u03B1_0304", - "u1FB2", "u03B1_0300_0345", - "u1FB3", "u03B1_0345", - "u1FB4", "u03B1_0301_0345", - "u1FB6", "u03B1_0342", - "u1FB7", "u03B1_0342_0345", - "u1FB8", "u0391_0306", - "u1FB9", "u0391_0304", - "u1FBA", "u0391_0300", - "u1FBB", "u0391_0301", - "u1FBC", "u0391_0345", - "u1FBE", "u03B9", - "u1FC1", "u00A8_0342", - "u1FC2", "u03B7_0300_0345", - "u1FC3", "u03B7_0345", - "u1FC4", "u03B7_0301_0345", - "u1FC6", "u03B7_0342", - "u1FC7", "u03B7_0342_0345", - "u1FC8", "u0395_0300", - "u1FC9", "u0395_0301", - "u1FCA", "u0397_0300", - "u1FCB", "u0397_0301", - "u1FCC", "u0397_0345", - "u1FCD", "u1FBF_0300", - "u1FCE", "u1FBF_0301", - "u1FCF", "u1FBF_0342", - "u1FD0", "u03B9_0306", - "u1FD1", "u03B9_0304", - "u1FD2", "u03B9_0308_0300", - "u1FD3", "u03B9_0308_0301", - "u1FD6", "u03B9_0342", - "u1FD7", "u03B9_0308_0342", - "u1FD8", "u0399_0306", - "u1FD9", "u0399_0304", - "u1FDA", "u0399_0300", - "u1FDB", "u0399_0301", - "u1FDD", "u1FFE_0300", - "u1FDE", "u1FFE_0301", - "u1FDF", "u1FFE_0342", - "u1FE0", "u03C5_0306", - "u1FE1", "u03C5_0304", - "u1FE2", "u03C5_0308_0300", - "u1FE3", "u03C5_0308_0301", - "u1FE4", "u03C1_0313", - "u1FE5", "u03C1_0314", - "u1FE6", "u03C5_0342", - "u1FE7", "u03C5_0308_0342", - "u1FE8", "u03A5_0306", - "u1FE9", "u03A5_0304", - "u1FEA", "u03A5_0300", - "u1FEB", "u03A5_0301", - "u1FEC", "u03A1_0314", - "u1FED", "u00A8_0300", - "u1FEE", "u00A8_0301", - "u1FEF", "u0060", - "u1FF2", "u03C9_0300_0345", - "u1FF3", "u03C9_0345", - "u1FF4", "u03C9_0301_0345", - "u1FF6", "u03C9_0342", - "u1FF7", "u03C9_0342_0345", - "u1FF8", "u039F_0300", - "u1FF9", "u039F_0301", - "u1FFA", "u03A9_0300", - "u1FFB", "u03A9_0301", - "u1FFC", "u03A9_0345", - "u1FFD", "u00B4", - "u2000", "u2002", - "u2001", "u2003", - "u2126", "u03A9", - "u212A", "u004B", - "u212B", "u0041_030A", - "u219A", "u2190_0338", - "u219B", "u2192_0338", - "u21AE", "u2194_0338", - "u21CD", "u21D0_0338", - "u21CE", "u21D4_0338", - "u21CF", "u21D2_0338", - "u2204", "u2203_0338", - "u2209", "u2208_0338", - "u220C", "u220B_0338", - "u2224", "u2223_0338", - "u2226", "u2225_0338", - "u2241", "u223C_0338", - "u2244", "u2243_0338", - "u2247", "u2245_0338", - "u2249", "u2248_0338", - "u2260", "u003D_0338", - "u2262", "u2261_0338", - "u226D", "u224D_0338", - "u226E", "u003C_0338", - "u226F", "u003E_0338", - "u2270", "u2264_0338", - "u2271", "u2265_0338", - "u2274", "u2272_0338", - "u2275", "u2273_0338", - "u2278", "u2276_0338", - "u2279", "u2277_0338", - "u2280", "u227A_0338", - "u2281", "u227B_0338", - "u2284", "u2282_0338", - "u2285", "u2283_0338", - "u2288", "u2286_0338", - "u2289", "u2287_0338", - "u22AC", "u22A2_0338", - "u22AD", "u22A8_0338", - "u22AE", "u22A9_0338", - "u22AF", "u22AB_0338", - "u22E0", "u227C_0338", - "u22E1", "u227D_0338", - "u22E2", "u2291_0338", - "u22E3", "u2292_0338", - "u22EA", "u22B2_0338", - "u22EB", "u22B3_0338", - "u22EC", "u22B4_0338", - "u22ED", "u22B5_0338", - "u2329", "u3008", - "u232A", "u3009", - "u2ADC", "u2ADD_0338", - "u304C", "u304B_3099", - "u304E", "u304D_3099", - "u3050", "u304F_3099", - "u3052", "u3051_3099", - "u3054", "u3053_3099", - "u3056", "u3055_3099", - "u3058", "u3057_3099", - "u305A", "u3059_3099", - "u305C", "u305B_3099", - "u305E", "u305D_3099", - "u3060", "u305F_3099", - "u3062", "u3061_3099", - "u3065", "u3064_3099", - "u3067", "u3066_3099", - "u3069", "u3068_3099", - "u3070", "u306F_3099", - "u3071", "u306F_309A", - "u3073", "u3072_3099", - "u3074", "u3072_309A", - "u3076", "u3075_3099", - "u3077", "u3075_309A", - "u3079", "u3078_3099", - "u307A", "u3078_309A", - "u307C", "u307B_3099", - "u307D", "u307B_309A", - "u3094", "u3046_3099", - "u309E", "u309D_3099", - "u30AC", "u30AB_3099", - "u30AE", "u30AD_3099", - "u30B0", "u30AF_3099", - "u30B2", "u30B1_3099", - "u30B4", "u30B3_3099", - "u30B6", "u30B5_3099", - "u30B8", "u30B7_3099", - "u30BA", "u30B9_3099", - "u30BC", "u30BB_3099", - "u30BE", "u30BD_3099", - "u30C0", "u30BF_3099", - "u30C2", "u30C1_3099", - "u30C5", "u30C4_3099", - "u30C7", "u30C6_3099", - "u30C9", "u30C8_3099", - "u30D0", "u30CF_3099", - "u30D1", "u30CF_309A", - "u30D3", "u30D2_3099", - "u30D4", "u30D2_309A", - "u30D6", "u30D5_3099", - "u30D7", "u30D5_309A", - "u30D9", "u30D8_3099", - "u30DA", "u30D8_309A", - "u30DC", "u30DB_3099", - "u30DD", "u30DB_309A", - "u30F4", "u30A6_3099", - "u30F7", "u30EF_3099", - "u30F8", "u30F0_3099", - "u30F9", "u30F1_3099", - "u30FA", "u30F2_3099", - "u30FE", "u30FD_3099", - "uF900", "u8C48", - "uF901", "u66F4", - "uF902", "u8ECA", - "uF903", "u8CC8", - "uF904", "u6ED1", - "uF905", "u4E32", - "uF906", "u53E5", - "uF907", "u9F9C", - "uF908", "u9F9C", - "uF909", "u5951", - "uF90A", "u91D1", - "uF90B", "u5587", - "uF90C", "u5948", - "uF90D", "u61F6", - "uF90E", "u7669", - "uF90F", "u7F85", - "uF910", "u863F", - "uF911", "u87BA", - "uF912", "u88F8", - "uF913", "u908F", - "uF914", "u6A02", - "uF915", "u6D1B", - "uF916", "u70D9", - "uF917", "u73DE", - "uF918", "u843D", - "uF919", "u916A", - "uF91A", "u99F1", - "uF91B", "u4E82", - "uF91C", "u5375", - "uF91D", "u6B04", - "uF91E", "u721B", - "uF91F", "u862D", - "uF920", "u9E1E", - "uF921", "u5D50", - "uF922", "u6FEB", - "uF923", "u85CD", - "uF924", "u8964", - "uF925", "u62C9", - "uF926", "u81D8", - "uF927", "u881F", - "uF928", "u5ECA", - "uF929", "u6717", - "uF92A", "u6D6A", - "uF92B", "u72FC", - "uF92C", "u90CE", - "uF92D", "u4F86", - "uF92E", "u51B7", - "uF92F", "u52DE", - "uF930", "u64C4", - "uF931", "u6AD3", - "uF932", "u7210", - "uF933", "u76E7", - "uF934", "u8001", - "uF935", "u8606", - "uF936", "u865C", - "uF937", "u8DEF", - "uF938", "u9732", - "uF939", "u9B6F", - "uF93A", "u9DFA", - "uF93B", "u788C", - "uF93C", "u797F", - "uF93D", "u7DA0", - "uF93E", "u83C9", - "uF93F", "u9304", - "uF940", "u9E7F", - "uF941", "u8AD6", - "uF942", "u58DF", - "uF943", "u5F04", - "uF944", "u7C60", - "uF945", "u807E", - "uF946", "u7262", - "uF947", "u78CA", - "uF948", "u8CC2", - "uF949", "u96F7", - "uF94A", "u58D8", - "uF94B", "u5C62", - "uF94C", "u6A13", - "uF94D", "u6DDA", - "uF94E", "u6F0F", - "uF94F", "u7D2F", - "uF950", "u7E37", - "uF951", "u964B", - "uF952", "u52D2", - "uF953", "u808B", - "uF954", "u51DC", - "uF955", "u51CC", - "uF956", "u7A1C", - "uF957", "u7DBE", - "uF958", "u83F1", - "uF959", "u9675", - "uF95A", "u8B80", - "uF95B", "u62CF", - "uF95C", "u6A02", - "uF95D", "u8AFE", - "uF95E", "u4E39", - "uF95F", "u5BE7", - "uF960", "u6012", - "uF961", "u7387", - "uF962", "u7570", - "uF963", "u5317", - "uF964", "u78FB", - "uF965", "u4FBF", - "uF966", "u5FA9", - "uF967", "u4E0D", - "uF968", "u6CCC", - "uF969", "u6578", - "uF96A", "u7D22", - "uF96B", "u53C3", - "uF96C", "u585E", - "uF96D", "u7701", - "uF96E", "u8449", - "uF96F", "u8AAA", - "uF970", "u6BBA", - "uF971", "u8FB0", - "uF972", "u6C88", - "uF973", "u62FE", - "uF974", "u82E5", - "uF975", "u63A0", - "uF976", "u7565", - "uF977", "u4EAE", - "uF978", "u5169", - "uF979", "u51C9", - "uF97A", "u6881", - "uF97B", "u7CE7", - "uF97C", "u826F", - "uF97D", "u8AD2", - "uF97E", "u91CF", - "uF97F", "u52F5", - "uF980", "u5442", - "uF981", "u5973", - "uF982", "u5EEC", - "uF983", "u65C5", - "uF984", "u6FFE", - "uF985", "u792A", - "uF986", "u95AD", - "uF987", "u9A6A", - "uF988", "u9E97", - "uF989", "u9ECE", - "uF98A", "u529B", - "uF98B", "u66C6", - "uF98C", "u6B77", - "uF98D", "u8F62", - "uF98E", "u5E74", - "uF98F", "u6190", - "uF990", "u6200", - "uF991", "u649A", - "uF992", "u6F23", - "uF993", "u7149", - "uF994", "u7489", - "uF995", "u79CA", - "uF996", "u7DF4", - "uF997", "u806F", - "uF998", "u8F26", - "uF999", "u84EE", - "uF99A", "u9023", - "uF99B", "u934A", - "uF99C", "u5217", - "uF99D", "u52A3", - "uF99E", "u54BD", - "uF99F", "u70C8", - "uF9A0", "u88C2", - "uF9A1", "u8AAA", - "uF9A2", "u5EC9", - "uF9A3", "u5FF5", - "uF9A4", "u637B", - "uF9A5", "u6BAE", - "uF9A6", "u7C3E", - "uF9A7", "u7375", - "uF9A8", "u4EE4", - "uF9A9", "u56F9", - "uF9AA", "u5BE7", - "uF9AB", "u5DBA", - "uF9AC", "u601C", - "uF9AD", "u73B2", - "uF9AE", "u7469", - "uF9AF", "u7F9A", - "uF9B0", "u8046", - "uF9B1", "u9234", - "uF9B2", "u96F6", - "uF9B3", "u9748", - "uF9B4", "u9818", - "uF9B5", "u4F8B", - "uF9B6", "u79AE", - "uF9B7", "u91B4", - "uF9B8", "u96B8", - "uF9B9", "u60E1", - "uF9BA", "u4E86", - "uF9BB", "u50DA", - "uF9BC", "u5BEE", - "uF9BD", "u5C3F", - "uF9BE", "u6599", - "uF9BF", "u6A02", - "uF9C0", "u71CE", - "uF9C1", "u7642", - "uF9C2", "u84FC", - "uF9C3", "u907C", - "uF9C4", "u9F8D", - "uF9C5", "u6688", - "uF9C6", "u962E", - "uF9C7", "u5289", - "uF9C8", "u677B", - "uF9C9", "u67F3", - "uF9CA", "u6D41", - "uF9CB", "u6E9C", - "uF9CC", "u7409", - "uF9CD", "u7559", - "uF9CE", "u786B", - "uF9CF", "u7D10", - "uF9D0", "u985E", - "uF9D1", "u516D", - "uF9D2", "u622E", - "uF9D3", "u9678", - "uF9D4", "u502B", - "uF9D5", "u5D19", - "uF9D6", "u6DEA", - "uF9D7", "u8F2A", - "uF9D8", "u5F8B", - "uF9D9", "u6144", - "uF9DA", "u6817", - "uF9DB", "u7387", - "uF9DC", "u9686", - "uF9DD", "u5229", - "uF9DE", "u540F", - "uF9DF", "u5C65", - "uF9E0", "u6613", - "uF9E1", "u674E", - "uF9E2", "u68A8", - "uF9E3", "u6CE5", - "uF9E4", "u7406", - "uF9E5", "u75E2", - "uF9E6", "u7F79", - "uF9E7", "u88CF", - "uF9E8", "u88E1", - "uF9E9", "u91CC", - "uF9EA", "u96E2", - "uF9EB", "u533F", - "uF9EC", "u6EBA", - "uF9ED", "u541D", - "uF9EE", "u71D0", - "uF9EF", "u7498", - "uF9F0", "u85FA", - "uF9F1", "u96A3", - "uF9F2", "u9C57", - "uF9F3", "u9E9F", - "uF9F4", "u6797", - "uF9F5", "u6DCB", - "uF9F6", "u81E8", - "uF9F7", "u7ACB", - "uF9F8", "u7B20", - "uF9F9", "u7C92", - "uF9FA", "u72C0", - "uF9FB", "u7099", - "uF9FC", "u8B58", - "uF9FD", "u4EC0", - "uF9FE", "u8336", - "uF9FF", "u523A", - "uFA00", "u5207", - "uFA01", "u5EA6", - "uFA02", "u62D3", - "uFA03", "u7CD6", - "uFA04", "u5B85", - "uFA05", "u6D1E", - "uFA06", "u66B4", - "uFA07", "u8F3B", - "uFA08", "u884C", - "uFA09", "u964D", - "uFA0A", "u898B", - "uFA0B", "u5ED3", - "uFA0C", "u5140", - "uFA0D", "u55C0", - "uFA10", "u585A", - "uFA12", "u6674", - "uFA15", "u51DE", - "uFA16", "u732A", - "uFA17", "u76CA", - "uFA18", "u793C", - "uFA19", "u795E", - "uFA1A", "u7965", - "uFA1B", "u798F", - "uFA1C", "u9756", - "uFA1D", "u7CBE", - "uFA1E", "u7FBD", - "uFA20", "u8612", - "uFA22", "u8AF8", - "uFA25", "u9038", - "uFA26", "u90FD", - "uFA2A", "u98EF", - "uFA2B", "u98FC", - "uFA2C", "u9928", - "uFA2D", "u9DB4", - "uFA30", "u4FAE", - "uFA31", "u50E7", - "uFA32", "u514D", - "uFA33", "u52C9", - "uFA34", "u52E4", - "uFA35", "u5351", - "uFA36", "u559D", - "uFA37", "u5606", - "uFA38", "u5668", - "uFA39", "u5840", - "uFA3A", "u58A8", - "uFA3B", "u5C64", - "uFA3C", "u5C6E", - "uFA3D", "u6094", - "uFA3E", "u6168", - "uFA3F", "u618E", - "uFA40", "u61F2", - "uFA41", "u654F", - "uFA42", "u65E2", - "uFA43", "u6691", - "uFA44", "u6885", - "uFA45", "u6D77", - "uFA46", "u6E1A", - "uFA47", "u6F22", - "uFA48", "u716E", - "uFA49", "u722B", - "uFA4A", "u7422", - "uFA4B", "u7891", - "uFA4C", "u793E", - "uFA4D", "u7949", - "uFA4E", "u7948", - "uFA4F", "u7950", - "uFA50", "u7956", - "uFA51", "u795D", - "uFA52", "u798D", - "uFA53", "u798E", - "uFA54", "u7A40", - "uFA55", "u7A81", - "uFA56", "u7BC0", - "uFA57", "u7DF4", - "uFA58", "u7E09", - "uFA59", "u7E41", - "uFA5A", "u7F72", - "uFA5B", "u8005", - "uFA5C", "u81ED", - "uFA5D", "u8279", - "uFA5E", "u8279", - "uFA5F", "u8457", - "uFA60", "u8910", - "uFA61", "u8996", - "uFA62", "u8B01", - "uFA63", "u8B39", - "uFA64", "u8CD3", - "uFA65", "u8D08", - "uFA66", "u8FB6", - "uFA67", "u9038", - "uFA68", "u96E3", - "uFA69", "u97FF", - "uFA6A", "u983B", - "uFB1D", "u05D9_05B4", - "uFB1F", "u05F2_05B7", - "uFB2A", "u05E9_05C1", - "uFB2B", "u05E9_05C2", - "uFB2C", "u05E9_05BC_05C1", - "uFB2D", "u05E9_05BC_05C2", - "uFB2E", "u05D0_05B7", - "uFB2F", "u05D0_05B8", - "uFB30", "u05D0_05BC", - "uFB31", "u05D1_05BC", - "uFB32", "u05D2_05BC", - "uFB33", "u05D3_05BC", - "uFB34", "u05D4_05BC", - "uFB35", "u05D5_05BC", - "uFB36", "u05D6_05BC", - "uFB38", "u05D8_05BC", - "uFB39", "u05D9_05BC", - "uFB3A", "u05DA_05BC", - "uFB3B", "u05DB_05BC", - "uFB3C", "u05DC_05BC", - "uFB3E", "u05DE_05BC", - "uFB40", "u05E0_05BC", - "uFB41", "u05E1_05BC", - "uFB43", "u05E3_05BC", - "uFB44", "u05E4_05BC", - "uFB46", "u05E6_05BC", - "uFB47", "u05E7_05BC", - "uFB48", "u05E8_05BC", - "uFB49", "u05E9_05BC", - "uFB4A", "u05EA_05BC", - "uFB4B", "u05D5_05B9", - "uFB4C", "u05D1_05BF", - "uFB4D", "u05DB_05BF", - "uFB4E", "u05E4_05BF", - "u1D15E", "u1D157_1D165", - "u1D15F", "u1D158_1D165", - "u1D160", "u1D158_1D165_1D16E", - "u1D161", "u1D158_1D165_1D16F", - "u1D162", "u1D158_1D165_1D170", - "u1D163", "u1D158_1D165_1D171", - "u1D164", "u1D158_1D165_1D172", - "u1D1BB", "u1D1B9_1D165", - "u1D1BC", "u1D1BA_1D165", - "u1D1BD", "u1D1B9_1D165_1D16E", - "u1D1BE", "u1D1BA_1D165_1D16E", - "u1D1BF", "u1D1B9_1D165_1D16F", - "u1D1C0", "u1D1BA_1D165_1D16F", - "u2F800", "u4E3D", - "u2F801", "u4E38", - "u2F802", "u4E41", - "u2F803", "u20122", - "u2F804", "u4F60", - "u2F805", "u4FAE", - "u2F806", "u4FBB", - "u2F807", "u5002", - "u2F808", "u507A", - "u2F809", "u5099", - "u2F80A", "u50E7", - "u2F80B", "u50CF", - "u2F80C", "u349E", - "u2F80D", "u2063A", - "u2F80E", "u514D", - "u2F80F", "u5154", - "u2F810", "u5164", - "u2F811", "u5177", - "u2F812", "u2051C", - "u2F813", "u34B9", - "u2F814", "u5167", - "u2F815", "u518D", - "u2F816", "u2054B", - "u2F817", "u5197", - "u2F818", "u51A4", - "u2F819", "u4ECC", - "u2F81A", "u51AC", - "u2F81B", "u51B5", - "u2F81C", "u291DF", - "u2F81D", "u51F5", - "u2F81E", "u5203", - "u2F81F", "u34DF", - "u2F820", "u523B", - "u2F821", "u5246", - "u2F822", "u5272", - "u2F823", "u5277", - "u2F824", "u3515", - "u2F825", "u52C7", - "u2F826", "u52C9", - "u2F827", "u52E4", - "u2F828", "u52FA", - "u2F829", "u5305", - "u2F82A", "u5306", - "u2F82B", "u5317", - "u2F82C", "u5349", - "u2F82D", "u5351", - "u2F82E", "u535A", - "u2F82F", "u5373", - "u2F830", "u537D", - "u2F831", "u537F", - "u2F832", "u537F", - "u2F833", "u537F", - "u2F834", "u20A2C", - "u2F835", "u7070", - "u2F836", "u53CA", - "u2F837", "u53DF", - "u2F838", "u20B63", - "u2F839", "u53EB", - "u2F83A", "u53F1", - "u2F83B", "u5406", - "u2F83C", "u549E", - "u2F83D", "u5438", - "u2F83E", "u5448", - "u2F83F", "u5468", - "u2F840", "u54A2", - "u2F841", "u54F6", - "u2F842", "u5510", - "u2F843", "u5553", - "u2F844", "u5563", - "u2F845", "u5584", - "u2F846", "u5584", - "u2F847", "u5599", - "u2F848", "u55AB", - "u2F849", "u55B3", - "u2F84A", "u55C2", - "u2F84B", "u5716", - "u2F84C", "u5606", - "u2F84D", "u5717", - "u2F84E", "u5651", - "u2F84F", "u5674", - "u2F850", "u5207", - "u2F851", "u58EE", - "u2F852", "u57CE", - "u2F853", "u57F4", - "u2F854", "u580D", - "u2F855", "u578B", - "u2F856", "u5832", - "u2F857", "u5831", - "u2F858", "u58AC", - "u2F859", "u214E4", - "u2F85A", "u58F2", - "u2F85B", "u58F7", - "u2F85C", "u5906", - "u2F85D", "u591A", - "u2F85E", "u5922", - "u2F85F", "u5962", - "u2F860", "u216A8", - "u2F861", "u216EA", - "u2F862", "u59EC", - "u2F863", "u5A1B", - "u2F864", "u5A27", - "u2F865", "u59D8", - "u2F866", "u5A66", - "u2F867", "u36EE", - "u2F868", "u2136A", - "u2F869", "u5B08", - "u2F86A", "u5B3E", - "u2F86B", "u5B3E", - "u2F86C", "u219C8", - "u2F86D", "u5BC3", - "u2F86E", "u5BD8", - "u2F86F", "u5BE7", - "u2F870", "u5BF3", - "u2F871", "u21B18", - "u2F872", "u5BFF", - "u2F873", "u5C06", - "u2F874", "u5F33", - "u2F875", "u5C22", - "u2F876", "u3781", - "u2F877", "u5C60", - "u2F878", "u5C6E", - "u2F879", "u5CC0", - "u2F87A", "u5C8D", - "u2F87B", "u21DE4", - "u2F87C", "u5D43", - "u2F87D", "u21DE6", - "u2F87E", "u5D6E", - "u2F87F", "u5D6B", - "u2F880", "u5D7C", - "u2F881", "u5DE1", - "u2F882", "u5DE2", - "u2F883", "u382F", - "u2F884", "u5DFD", - "u2F885", "u5E28", - "u2F886", "u5E3D", - "u2F887", "u5E69", - "u2F888", "u3862", - "u2F889", "u22183", - "u2F88A", "u387C", - "u2F88B", "u5EB0", - "u2F88C", "u5EB3", - "u2F88D", "u5EB6", - "u2F88E", "u5ECA", - "u2F88F", "u2A392", - "u2F890", "u5EFE", - "u2F891", "u22331", - "u2F892", "u22331", - "u2F893", "u8201", - "u2F894", "u5F22", - "u2F895", "u5F22", - "u2F896", "u38C7", - "u2F897", "u232B8", - "u2F898", "u261DA", - "u2F899", "u5F62", - "u2F89A", "u5F6B", - "u2F89B", "u38E3", - "u2F89C", "u5F9A", - "u2F89D", "u5FCD", - "u2F89E", "u5FD7", - "u2F89F", "u5FF9", - "u2F8A0", "u6081", - "u2F8A1", "u393A", - "u2F8A2", "u391C", - "u2F8A3", "u6094", - "u2F8A4", "u226D4", - "u2F8A5", "u60C7", - "u2F8A6", "u6148", - "u2F8A7", "u614C", - "u2F8A8", "u614E", - "u2F8A9", "u614C", - "u2F8AA", "u617A", - "u2F8AB", "u618E", - "u2F8AC", "u61B2", - "u2F8AD", "u61A4", - "u2F8AE", "u61AF", - "u2F8AF", "u61DE", - "u2F8B0", "u61F2", - "u2F8B1", "u61F6", - "u2F8B2", "u6210", - "u2F8B3", "u621B", - "u2F8B4", "u625D", - "u2F8B5", "u62B1", - "u2F8B6", "u62D4", - "u2F8B7", "u6350", - "u2F8B8", "u22B0C", - "u2F8B9", "u633D", - "u2F8BA", "u62FC", - "u2F8BB", "u6368", - "u2F8BC", "u6383", - "u2F8BD", "u63E4", - "u2F8BE", "u22BF1", - "u2F8BF", "u6422", - "u2F8C0", "u63C5", - "u2F8C1", "u63A9", - "u2F8C2", "u3A2E", - "u2F8C3", "u6469", - "u2F8C4", "u647E", - "u2F8C5", "u649D", - "u2F8C6", "u6477", - "u2F8C7", "u3A6C", - "u2F8C8", "u654F", - "u2F8C9", "u656C", - "u2F8CA", "u2300A", - "u2F8CB", "u65E3", - "u2F8CC", "u66F8", - "u2F8CD", "u6649", - "u2F8CE", "u3B19", - "u2F8CF", "u6691", - "u2F8D0", "u3B08", - "u2F8D1", "u3AE4", - "u2F8D2", "u5192", - "u2F8D3", "u5195", - "u2F8D4", "u6700", - "u2F8D5", "u669C", - "u2F8D6", "u80AD", - "u2F8D7", "u43D9", - "u2F8D8", "u6717", - "u2F8D9", "u671B", - "u2F8DA", "u6721", - "u2F8DB", "u675E", - "u2F8DC", "u6753", - "u2F8DD", "u233C3", - "u2F8DE", "u3B49", - "u2F8DF", "u67FA", - "u2F8E0", "u6785", - "u2F8E1", "u6852", - "u2F8E2", "u6885", - "u2F8E3", "u2346D", - "u2F8E4", "u688E", - "u2F8E5", "u681F", - "u2F8E6", "u6914", - "u2F8E7", "u3B9D", - "u2F8E8", "u6942", - "u2F8E9", "u69A3", - "u2F8EA", "u69EA", - "u2F8EB", "u6AA8", - "u2F8EC", "u236A3", - "u2F8ED", "u6ADB", - "u2F8EE", "u3C18", - "u2F8EF", "u6B21", - "u2F8F0", "u238A7", - "u2F8F1", "u6B54", - "u2F8F2", "u3C4E", - "u2F8F3", "u6B72", - "u2F8F4", "u6B9F", - "u2F8F5", "u6BBA", - "u2F8F6", "u6BBB", - "u2F8F7", "u23A8D", - "u2F8F8", "u21D0B", - "u2F8F9", "u23AFA", - "u2F8FA", "u6C4E", - "u2F8FB", "u23CBC", - "u2F8FC", "u6CBF", - "u2F8FD", "u6CCD", - "u2F8FE", "u6C67", - "u2F8FF", "u6D16", - "u2F900", "u6D3E", - "u2F901", "u6D77", - "u2F902", "u6D41", - "u2F903", "u6D69", - "u2F904", "u6D78", - "u2F905", "u6D85", - "u2F906", "u23D1E", - "u2F907", "u6D34", - "u2F908", "u6E2F", - "u2F909", "u6E6E", - "u2F90A", "u3D33", - "u2F90B", "u6ECB", - "u2F90C", "u6EC7", - "u2F90D", "u23ED1", - "u2F90E", "u6DF9", - "u2F90F", "u6F6E", - "u2F910", "u23F5E", - "u2F911", "u23F8E", - "u2F912", "u6FC6", - "u2F913", "u7039", - "u2F914", "u701E", - "u2F915", "u701B", - "u2F916", "u3D96", - "u2F917", "u704A", - "u2F918", "u707D", - "u2F919", "u7077", - "u2F91A", "u70AD", - "u2F91B", "u20525", - "u2F91C", "u7145", - "u2F91D", "u24263", - "u2F91E", "u719C", - "u2F91F", "u43AB", - "u2F920", "u7228", - "u2F921", "u7235", - "u2F922", "u7250", - "u2F923", "u24608", - "u2F924", "u7280", - "u2F925", "u7295", - "u2F926", "u24735", - "u2F927", "u24814", - "u2F928", "u737A", - "u2F929", "u738B", - "u2F92A", "u3EAC", - "u2F92B", "u73A5", - "u2F92C", "u3EB8", - "u2F92D", "u3EB8", - "u2F92E", "u7447", - "u2F92F", "u745C", - "u2F930", "u7471", - "u2F931", "u7485", - "u2F932", "u74CA", - "u2F933", "u3F1B", - "u2F934", "u7524", - "u2F935", "u24C36", - "u2F936", "u753E", - "u2F937", "u24C92", - "u2F938", "u7570", - "u2F939", "u2219F", - "u2F93A", "u7610", - "u2F93B", "u24FA1", - "u2F93C", "u24FB8", - "u2F93D", "u25044", - "u2F93E", "u3FFC", - "u2F93F", "u4008", - "u2F940", "u76F4", - "u2F941", "u250F3", - "u2F942", "u250F2", - "u2F943", "u25119", - "u2F944", "u25133", - "u2F945", "u771E", - "u2F946", "u771F", - "u2F947", "u771F", - "u2F948", "u774A", - "u2F949", "u4039", - "u2F94A", "u778B", - "u2F94B", "u4046", - "u2F94C", "u4096", - "u2F94D", "u2541D", - "u2F94E", "u784E", - "u2F94F", "u788C", - "u2F950", "u78CC", - "u2F951", "u40E3", - "u2F952", "u25626", - "u2F953", "u7956", - "u2F954", "u2569A", - "u2F955", "u256C5", - "u2F956", "u798F", - "u2F957", "u79EB", - "u2F958", "u412F", - "u2F959", "u7A40", - "u2F95A", "u7A4A", - "u2F95B", "u7A4F", - "u2F95C", "u2597C", - "u2F95D", "u25AA7", - "u2F95E", "u25AA7", - "u2F95F", "u7AAE", - "u2F960", "u4202", - "u2F961", "u25BAB", - "u2F962", "u7BC6", - "u2F963", "u7BC9", - "u2F964", "u4227", - "u2F965", "u25C80", - "u2F966", "u7CD2", - "u2F967", "u42A0", - "u2F968", "u7CE8", - "u2F969", "u7CE3", - "u2F96A", "u7D00", - "u2F96B", "u25F86", - "u2F96C", "u7D63", - "u2F96D", "u4301", - "u2F96E", "u7DC7", - "u2F96F", "u7E02", - "u2F970", "u7E45", - "u2F971", "u4334", - "u2F972", "u26228", - "u2F973", "u26247", - "u2F974", "u4359", - "u2F975", "u262D9", - "u2F976", "u7F7A", - "u2F977", "u2633E", - "u2F978", "u7F95", - "u2F979", "u7FFA", - "u2F97A", "u8005", - "u2F97B", "u264DA", - "u2F97C", "u26523", - "u2F97D", "u8060", - "u2F97E", "u265A8", - "u2F97F", "u8070", - "u2F980", "u2335F", - "u2F981", "u43D5", - "u2F982", "u80B2", - "u2F983", "u8103", - "u2F984", "u440B", - "u2F985", "u813E", - "u2F986", "u5AB5", - "u2F987", "u267A7", - "u2F988", "u267B5", - "u2F989", "u23393", - "u2F98A", "u2339C", - "u2F98B", "u8201", - "u2F98C", "u8204", - "u2F98D", "u8F9E", - "u2F98E", "u446B", - "u2F98F", "u8291", - "u2F990", "u828B", - "u2F991", "u829D", - "u2F992", "u52B3", - "u2F993", "u82B1", - "u2F994", "u82B3", - "u2F995", "u82BD", - "u2F996", "u82E6", - "u2F997", "u26B3C", - "u2F998", "u82E5", - "u2F999", "u831D", - "u2F99A", "u8363", - "u2F99B", "u83AD", - "u2F99C", "u8323", - "u2F99D", "u83BD", - "u2F99E", "u83E7", - "u2F99F", "u8457", - "u2F9A0", "u8353", - "u2F9A1", "u83CA", - "u2F9A2", "u83CC", - "u2F9A3", "u83DC", - "u2F9A4", "u26C36", - "u2F9A5", "u26D6B", - "u2F9A6", "u26CD5", - "u2F9A7", "u452B", - "u2F9A8", "u84F1", - "u2F9A9", "u84F3", - "u2F9AA", "u8516", - "u2F9AB", "u273CA", - "u2F9AC", "u8564", - "u2F9AD", "u26F2C", - "u2F9AE", "u455D", - "u2F9AF", "u4561", - "u2F9B0", "u26FB1", - "u2F9B1", "u270D2", - "u2F9B2", "u456B", - "u2F9B3", "u8650", - "u2F9B4", "u865C", - "u2F9B5", "u8667", - "u2F9B6", "u8669", - "u2F9B7", "u86A9", - "u2F9B8", "u8688", - "u2F9B9", "u870E", - "u2F9BA", "u86E2", - "u2F9BB", "u8779", - "u2F9BC", "u8728", - "u2F9BD", "u876B", - "u2F9BE", "u8786", - "u2F9BF", "u4D57", - "u2F9C0", "u87E1", - "u2F9C1", "u8801", - "u2F9C2", "u45F9", - "u2F9C3", "u8860", - "u2F9C4", "u8863", - "u2F9C5", "u27667", - "u2F9C6", "u88D7", - "u2F9C7", "u88DE", - "u2F9C8", "u4635", - "u2F9C9", "u88FA", - "u2F9CA", "u34BB", - "u2F9CB", "u278AE", - "u2F9CC", "u27966", - "u2F9CD", "u46BE", - "u2F9CE", "u46C7", - "u2F9CF", "u8AA0", - "u2F9D0", "u8AED", - "u2F9D1", "u8B8A", - "u2F9D2", "u8C55", - "u2F9D3", "u27CA8", - "u2F9D4", "u8CAB", - "u2F9D5", "u8CC1", - "u2F9D6", "u8D1B", - "u2F9D7", "u8D77", - "u2F9D8", "u27F2F", - "u2F9D9", "u20804", - "u2F9DA", "u8DCB", - "u2F9DB", "u8DBC", - "u2F9DC", "u8DF0", - "u2F9DD", "u208DE", - "u2F9DE", "u8ED4", - "u2F9DF", "u8F38", - "u2F9E0", "u285D2", - "u2F9E1", "u285ED", - "u2F9E2", "u9094", - "u2F9E3", "u90F1", - "u2F9E4", "u9111", - "u2F9E5", "u2872E", - "u2F9E6", "u911B", - "u2F9E7", "u9238", - "u2F9E8", "u92D7", - "u2F9E9", "u92D8", - "u2F9EA", "u927C", - "u2F9EB", "u93F9", - "u2F9EC", "u9415", - "u2F9ED", "u28BFA", - "u2F9EE", "u958B", - "u2F9EF", "u4995", - "u2F9F0", "u95B7", - "u2F9F1", "u28D77", - "u2F9F2", "u49E6", - "u2F9F3", "u96C3", - "u2F9F4", "u5DB2", - "u2F9F5", "u9723", - "u2F9F6", "u29145", - "u2F9F7", "u2921A", - "u2F9F8", "u4A6E", - "u2F9F9", "u4A76", - "u2F9FA", "u97E0", - "u2F9FB", "u2940A", - "u2F9FC", "u4AB2", - "u2F9FD", "u29496", - "u2F9FE", "u980B", - "u2F9FF", "u980B", - "u2FA00", "u9829", - "u2FA01", "u295B6", - "u2FA02", "u98E2", - "u2FA03", "u4B33", - "u2FA04", "u9929", - "u2FA05", "u99A7", - "u2FA06", "u99C2", - "u2FA07", "u99FE", - "u2FA08", "u4BCE", - "u2FA09", "u29B30", - "u2FA0A", "u9B12", - "u2FA0B", "u9C40", - "u2FA0C", "u9CFD", - "u2FA0D", "u4CCE", - "u2FA0E", "u4CED", - "u2FA0F", "u9D67", - "u2FA10", "u2A0CE", - "u2FA11", "u4CF8", - "u2FA12", "u2A105", - "u2FA13", "u2A20E", - "u2FA14", "u2A291", - "u2FA15", "u9EBB", - "u2FA16", "u4D56", - "u2FA17", "u9EF9", - "u2FA18", "u9EFE", - "u2FA19", "u9F05", - "u2FA1A", "u9F0F", - "u2FA1B", "u9F16", - "u2FA1C", "u9F3B", - "u2FA1D", "u2A600", +use strict; + +my %unicode_decomposed = ( + "00C0", "0041_0300", + "00C1", "0041_0301", + "00C2", "0041_0302", + "00C3", "0041_0303", + "00C4", "0041_0308", + "00C5", "0041_030A", + "00C7", "0043_0327", + "00C8", "0045_0300", + "00C9", "0045_0301", + "00CA", "0045_0302", + "00CB", "0045_0308", + "00CC", "0049_0300", + "00CD", "0049_0301", + "00CE", "0049_0302", + "00CF", "0049_0308", + "00D1", "004E_0303", + "00D2", "004F_0300", + "00D3", "004F_0301", + "00D4", "004F_0302", + "00D5", "004F_0303", + "00D6", "004F_0308", + "00D9", "0055_0300", + "00DA", "0055_0301", + "00DB", "0055_0302", + "00DC", "0055_0308", + "00DD", "0059_0301", + "00E0", "0061_0300", + "00E1", "0061_0301", + "00E2", "0061_0302", + "00E3", "0061_0303", + "00E4", "0061_0308", + "00E5", "0061_030A", + "00E7", "0063_0327", + "00E8", "0065_0300", + "00E9", "0065_0301", + "00EA", "0065_0302", + "00EB", "0065_0308", + "00EC", "0069_0300", + "00ED", "0069_0301", + "00EE", "0069_0302", + "00EF", "0069_0308", + "00F1", "006E_0303", + "00F2", "006F_0300", + "00F3", "006F_0301", + "00F4", "006F_0302", + "00F5", "006F_0303", + "00F6", "006F_0308", + "00F9", "0075_0300", + "00FA", "0075_0301", + "00FB", "0075_0302", + "00FC", "0075_0308", + "00FD", "0079_0301", + "00FF", "0079_0308", + "0100", "0041_0304", + "0101", "0061_0304", + "0102", "0041_0306", + "0103", "0061_0306", + "0104", "0041_0328", + "0105", "0061_0328", + "0106", "0043_0301", + "0107", "0063_0301", + "0108", "0043_0302", + "0109", "0063_0302", + "010A", "0043_0307", + "010B", "0063_0307", + "010C", "0043_030C", + "010D", "0063_030C", + "010E", "0044_030C", + "010F", "0064_030C", + "0112", "0045_0304", + "0113", "0065_0304", + "0114", "0045_0306", + "0115", "0065_0306", + "0116", "0045_0307", + "0117", "0065_0307", + "0118", "0045_0328", + "0119", "0065_0328", + "011A", "0045_030C", + "011B", "0065_030C", + "011C", "0047_0302", + "011D", "0067_0302", + "011E", "0047_0306", + "011F", "0067_0306", + "0120", "0047_0307", + "0121", "0067_0307", + "0122", "0047_0327", + "0123", "0067_0327", + "0124", "0048_0302", + "0125", "0068_0302", + "0128", "0049_0303", + "0129", "0069_0303", + "012A", "0049_0304", + "012B", "0069_0304", + "012C", "0049_0306", + "012D", "0069_0306", + "012E", "0049_0328", + "012F", "0069_0328", + "0130", "0049_0307", + "0134", "004A_0302", + "0135", "006A_0302", + "0136", "004B_0327", + "0137", "006B_0327", + "0139", "004C_0301", + "013A", "006C_0301", + "013B", "004C_0327", + "013C", "006C_0327", + "013D", "004C_030C", + "013E", "006C_030C", + "0143", "004E_0301", + "0144", "006E_0301", + "0145", "004E_0327", + "0146", "006E_0327", + "0147", "004E_030C", + "0148", "006E_030C", + "014C", "004F_0304", + "014D", "006F_0304", + "014E", "004F_0306", + "014F", "006F_0306", + "0150", "004F_030B", + "0151", "006F_030B", + "0154", "0052_0301", + "0155", "0072_0301", + "0156", "0052_0327", + "0157", "0072_0327", + "0158", "0052_030C", + "0159", "0072_030C", + "015A", "0053_0301", + "015B", "0073_0301", + "015C", "0053_0302", + "015D", "0073_0302", + "015E", "0053_0327", + "015F", "0073_0327", + "0160", "0053_030C", + "0161", "0073_030C", + "0162", "0054_0327", + "0163", "0074_0327", + "0164", "0054_030C", + "0165", "0074_030C", + "0168", "0055_0303", + "0169", "0075_0303", + "016A", "0055_0304", + "016B", "0075_0304", + "016C", "0055_0306", + "016D", "0075_0306", + "016E", "0055_030A", + "016F", "0075_030A", + "0170", "0055_030B", + "0171", "0075_030B", + "0172", "0055_0328", + "0173", "0075_0328", + "0174", "0057_0302", + "0175", "0077_0302", + "0176", "0059_0302", + "0177", "0079_0302", + "0178", "0059_0308", + "0179", "005A_0301", + "017A", "007A_0301", + "017B", "005A_0307", + "017C", "007A_0307", + "017D", "005A_030C", + "017E", "007A_030C", + "01A0", "004F_031B", + "01A1", "006F_031B", + "01AF", "0055_031B", + "01B0", "0075_031B", + "01CD", "0041_030C", + "01CE", "0061_030C", + "01CF", "0049_030C", + "01D0", "0069_030C", + "01D1", "004F_030C", + "01D2", "006F_030C", + "01D3", "0055_030C", + "01D4", "0075_030C", + "01D5", "0055_0308_0304", + "01D6", "0075_0308_0304", + "01D7", "0055_0308_0301", + "01D8", "0075_0308_0301", + "01D9", "0055_0308_030C", + "01DA", "0075_0308_030C", + "01DB", "0055_0308_0300", + "01DC", "0075_0308_0300", + "01DE", "0041_0308_0304", + "01DF", "0061_0308_0304", + "01E0", "0041_0307_0304", + "01E1", "0061_0307_0304", + "01E2", "00C6_0304", + "01E3", "00E6_0304", + "01E6", "0047_030C", + "01E7", "0067_030C", + "01E8", "004B_030C", + "01E9", "006B_030C", + "01EA", "004F_0328", + "01EB", "006F_0328", + "01EC", "004F_0328_0304", + "01ED", "006F_0328_0304", + "01EE", "01B7_030C", + "01EF", "0292_030C", + "01F0", "006A_030C", + "01F4", "0047_0301", + "01F5", "0067_0301", + "01F8", "004E_0300", + "01F9", "006E_0300", + "01FA", "0041_030A_0301", + "01FB", "0061_030A_0301", + "01FC", "00C6_0301", + "01FD", "00E6_0301", + "01FE", "00D8_0301", + "01FF", "00F8_0301", + "0200", "0041_030F", + "0201", "0061_030F", + "0202", "0041_0311", + "0203", "0061_0311", + "0204", "0045_030F", + "0205", "0065_030F", + "0206", "0045_0311", + "0207", "0065_0311", + "0208", "0049_030F", + "0209", "0069_030F", + "020A", "0049_0311", + "020B", "0069_0311", + "020C", "004F_030F", + "020D", "006F_030F", + "020E", "004F_0311", + "020F", "006F_0311", + "0210", "0052_030F", + "0211", "0072_030F", + "0212", "0052_0311", + "0213", "0072_0311", + "0214", "0055_030F", + "0215", "0075_030F", + "0216", "0055_0311", + "0217", "0075_0311", + "0218", "0053_0326", + "0219", "0073_0326", + "021A", "0054_0326", + "021B", "0074_0326", + "021E", "0048_030C", + "021F", "0068_030C", + "0226", "0041_0307", + "0227", "0061_0307", + "0228", "0045_0327", + "0229", "0065_0327", + "022A", "004F_0308_0304", + "022B", "006F_0308_0304", + "022C", "004F_0303_0304", + "022D", "006F_0303_0304", + "022E", "004F_0307", + "022F", "006F_0307", + "0230", "004F_0307_0304", + "0231", "006F_0307_0304", + "0232", "0059_0304", + "0233", "0079_0304", + "0340", "0300", + "0341", "0301", + "0343", "0313", + "0344", "0308_0301", + "0374", "02B9", + "037E", "003B", + "0385", "00A8_0301", + "0386", "0391_0301", + "0387", "00B7", + "0388", "0395_0301", + "0389", "0397_0301", + "038A", "0399_0301", + "038C", "039F_0301", + "038E", "03A5_0301", + "038F", "03A9_0301", + "0390", "03B9_0308_0301", + "03AA", "0399_0308", + "03AB", "03A5_0308", + "03AC", "03B1_0301", + "03AD", "03B5_0301", + "03AE", "03B7_0301", + "03AF", "03B9_0301", + "03B0", "03C5_0308_0301", + "03CA", "03B9_0308", + "03CB", "03C5_0308", + "03CC", "03BF_0301", + "03CD", "03C5_0301", + "03CE", "03C9_0301", + "03D3", "03D2_0301", + "03D4", "03D2_0308", + "0400", "0415_0300", + "0401", "0415_0308", + "0403", "0413_0301", + "0407", "0406_0308", + "040C", "041A_0301", + "040D", "0418_0300", + "040E", "0423_0306", + "0419", "0418_0306", + "0439", "0438_0306", + "0450", "0435_0300", + "0451", "0435_0308", + "0453", "0433_0301", + "0457", "0456_0308", + "045C", "043A_0301", + "045D", "0438_0300", + "045E", "0443_0306", + "0476", "0474_030F", + "0477", "0475_030F", + "04C1", "0416_0306", + "04C2", "0436_0306", + "04D0", "0410_0306", + "04D1", "0430_0306", + "04D2", "0410_0308", + "04D3", "0430_0308", + "04D6", "0415_0306", + "04D7", "0435_0306", + "04DA", "04D8_0308", + "04DB", "04D9_0308", + "04DC", "0416_0308", + "04DD", "0436_0308", + "04DE", "0417_0308", + "04DF", "0437_0308", + "04E2", "0418_0304", + "04E3", "0438_0304", + "04E4", "0418_0308", + "04E5", "0438_0308", + "04E6", "041E_0308", + "04E7", "043E_0308", + "04EA", "04E8_0308", + "04EB", "04E9_0308", + "04EC", "042D_0308", + "04ED", "044D_0308", + "04EE", "0423_0304", + "04EF", "0443_0304", + "04F0", "0423_0308", + "04F1", "0443_0308", + "04F2", "0423_030B", + "04F3", "0443_030B", + "04F4", "0427_0308", + "04F5", "0447_0308", + "04F8", "042B_0308", + "04F9", "044B_0308", + "0622", "0627_0653", + "0623", "0627_0654", + "0624", "0648_0654", + "0625", "0627_0655", + "0626", "064A_0654", + "06C0", "06D5_0654", + "06C2", "06C1_0654", + "06D3", "06D2_0654", + "0929", "0928_093C", + "0931", "0930_093C", + "0934", "0933_093C", + "0958", "0915_093C", + "0959", "0916_093C", + "095A", "0917_093C", + "095B", "091C_093C", + "095C", "0921_093C", + "095D", "0922_093C", + "095E", "092B_093C", + "095F", "092F_093C", + "09CB", "09C7_09BE", + "09CC", "09C7_09D7", + "09DC", "09A1_09BC", + "09DD", "09A2_09BC", + "09DF", "09AF_09BC", + "0A33", "0A32_0A3C", + "0A36", "0A38_0A3C", + "0A59", "0A16_0A3C", + "0A5A", "0A17_0A3C", + "0A5B", "0A1C_0A3C", + "0A5E", "0A2B_0A3C", + "0B48", "0B47_0B56", + "0B4B", "0B47_0B3E", + "0B4C", "0B47_0B57", + "0B5C", "0B21_0B3C", + "0B5D", "0B22_0B3C", + "0B94", "0B92_0BD7", + "0BCA", "0BC6_0BBE", + "0BCB", "0BC7_0BBE", + "0BCC", "0BC6_0BD7", + "0C48", "0C46_0C56", + "0CC0", "0CBF_0CD5", + "0CC7", "0CC6_0CD5", + "0CC8", "0CC6_0CD6", + "0CCA", "0CC6_0CC2", + "0CCB", "0CC6_0CC2_0CD5", + "0D4A", "0D46_0D3E", + "0D4B", "0D47_0D3E", + "0D4C", "0D46_0D57", + "0DDA", "0DD9_0DCA", + "0DDC", "0DD9_0DCF", + "0DDD", "0DD9_0DCF_0DCA", + "0DDE", "0DD9_0DDF", + "0F43", "0F42_0FB7", + "0F4D", "0F4C_0FB7", + "0F52", "0F51_0FB7", + "0F57", "0F56_0FB7", + "0F5C", "0F5B_0FB7", + "0F69", "0F40_0FB5", + "0F73", "0F71_0F72", + "0F75", "0F71_0F74", + "0F76", "0FB2_0F80", + "0F78", "0FB3_0F80", + "0F81", "0F71_0F80", + "0F93", "0F92_0FB7", + "0F9D", "0F9C_0FB7", + "0FA2", "0FA1_0FB7", + "0FA7", "0FA6_0FB7", + "0FAC", "0FAB_0FB7", + "0FB9", "0F90_0FB5", + "1026", "1025_102E", + "1E00", "0041_0325", + "1E01", "0061_0325", + "1E02", "0042_0307", + "1E03", "0062_0307", + "1E04", "0042_0323", + "1E05", "0062_0323", + "1E06", "0042_0331", + "1E07", "0062_0331", + "1E08", "0043_0327_0301", + "1E09", "0063_0327_0301", + "1E0A", "0044_0307", + "1E0B", "0064_0307", + "1E0C", "0044_0323", + "1E0D", "0064_0323", + "1E0E", "0044_0331", + "1E0F", "0064_0331", + "1E10", "0044_0327", + "1E11", "0064_0327", + "1E12", "0044_032D", + "1E13", "0064_032D", + "1E14", "0045_0304_0300", + "1E15", "0065_0304_0300", + "1E16", "0045_0304_0301", + "1E17", "0065_0304_0301", + "1E18", "0045_032D", + "1E19", "0065_032D", + "1E1A", "0045_0330", + "1E1B", "0065_0330", + "1E1C", "0045_0327_0306", + "1E1D", "0065_0327_0306", + "1E1E", "0046_0307", + "1E1F", "0066_0307", + "1E20", "0047_0304", + "1E21", "0067_0304", + "1E22", "0048_0307", + "1E23", "0068_0307", + "1E24", "0048_0323", + "1E25", "0068_0323", + "1E26", "0048_0308", + "1E27", "0068_0308", + "1E28", "0048_0327", + "1E29", "0068_0327", + "1E2A", "0048_032E", + "1E2B", "0068_032E", + "1E2C", "0049_0330", + "1E2D", "0069_0330", + "1E2E", "0049_0308_0301", + "1E2F", "0069_0308_0301", + "1E30", "004B_0301", + "1E31", "006B_0301", + "1E32", "004B_0323", + "1E33", "006B_0323", + "1E34", "004B_0331", + "1E35", "006B_0331", + "1E36", "004C_0323", + "1E37", "006C_0323", + "1E38", "004C_0323_0304", + "1E39", "006C_0323_0304", + "1E3A", "004C_0331", + "1E3B", "006C_0331", + "1E3C", "004C_032D", + "1E3D", "006C_032D", + "1E3E", "004D_0301", + "1E3F", "006D_0301", + "1E40", "004D_0307", + "1E41", "006D_0307", + "1E42", "004D_0323", + "1E43", "006D_0323", + "1E44", "004E_0307", + "1E45", "006E_0307", + "1E46", "004E_0323", + "1E47", "006E_0323", + "1E48", "004E_0331", + "1E49", "006E_0331", + "1E4A", "004E_032D", + "1E4B", "006E_032D", + "1E4C", "004F_0303_0301", + "1E4D", "006F_0303_0301", + "1E4E", "004F_0303_0308", + "1E4F", "006F_0303_0308", + "1E50", "004F_0304_0300", + "1E51", "006F_0304_0300", + "1E52", "004F_0304_0301", + "1E53", "006F_0304_0301", + "1E54", "0050_0301", + "1E55", "0070_0301", + "1E56", "0050_0307", + "1E57", "0070_0307", + "1E58", "0052_0307", + "1E59", "0072_0307", + "1E5A", "0052_0323", + "1E5B", "0072_0323", + "1E5C", "0052_0323_0304", + "1E5D", "0072_0323_0304", + "1E5E", "0052_0331", + "1E5F", "0072_0331", + "1E60", "0053_0307", + "1E61", "0073_0307", + "1E62", "0053_0323", + "1E63", "0073_0323", + "1E64", "0053_0301_0307", + "1E65", "0073_0301_0307", + "1E66", "0053_030C_0307", + "1E67", "0073_030C_0307", + "1E68", "0053_0323_0307", + "1E69", "0073_0323_0307", + "1E6A", "0054_0307", + "1E6B", "0074_0307", + "1E6C", "0054_0323", + "1E6D", "0074_0323", + "1E6E", "0054_0331", + "1E6F", "0074_0331", + "1E70", "0054_032D", + "1E71", "0074_032D", + "1E72", "0055_0324", + "1E73", "0075_0324", + "1E74", "0055_0330", + "1E75", "0075_0330", + "1E76", "0055_032D", + "1E77", "0075_032D", + "1E78", "0055_0303_0301", + "1E79", "0075_0303_0301", + "1E7A", "0055_0304_0308", + "1E7B", "0075_0304_0308", + "1E7C", "0056_0303", + "1E7D", "0076_0303", + "1E7E", "0056_0323", + "1E7F", "0076_0323", + "1E80", "0057_0300", + "1E81", "0077_0300", + "1E82", "0057_0301", + "1E83", "0077_0301", + "1E84", "0057_0308", + "1E85", "0077_0308", + "1E86", "0057_0307", + "1E87", "0077_0307", + "1E88", "0057_0323", + "1E89", "0077_0323", + "1E8A", "0058_0307", + "1E8B", "0078_0307", + "1E8C", "0058_0308", + "1E8D", "0078_0308", + "1E8E", "0059_0307", + "1E8F", "0079_0307", + "1E90", "005A_0302", + "1E91", "007A_0302", + "1E92", "005A_0323", + "1E93", "007A_0323", + "1E94", "005A_0331", + "1E95", "007A_0331", + "1E96", "0068_0331", + "1E97", "0074_0308", + "1E98", "0077_030A", + "1E99", "0079_030A", + "1E9B", "017F_0307", + "1EA0", "0041_0323", + "1EA1", "0061_0323", + "1EA2", "0041_0309", + "1EA3", "0061_0309", + "1EA4", "0041_0302_0301", + "1EA5", "0061_0302_0301", + "1EA6", "0041_0302_0300", + "1EA7", "0061_0302_0300", + "1EA8", "0041_0302_0309", + "1EA9", "0061_0302_0309", + "1EAA", "0041_0302_0303", + "1EAB", "0061_0302_0303", + "1EAC", "0041_0323_0302", + "1EAD", "0061_0323_0302", + "1EAE", "0041_0306_0301", + "1EAF", "0061_0306_0301", + "1EB0", "0041_0306_0300", + "1EB1", "0061_0306_0300", + "1EB2", "0041_0306_0309", + "1EB3", "0061_0306_0309", + "1EB4", "0041_0306_0303", + "1EB5", "0061_0306_0303", + "1EB6", "0041_0323_0306", + "1EB7", "0061_0323_0306", + "1EB8", "0045_0323", + "1EB9", "0065_0323", + "1EBA", "0045_0309", + "1EBB", "0065_0309", + "1EBC", "0045_0303", + "1EBD", "0065_0303", + "1EBE", "0045_0302_0301", + "1EBF", "0065_0302_0301", + "1EC0", "0045_0302_0300", + "1EC1", "0065_0302_0300", + "1EC2", "0045_0302_0309", + "1EC3", "0065_0302_0309", + "1EC4", "0045_0302_0303", + "1EC5", "0065_0302_0303", + "1EC6", "0045_0323_0302", + "1EC7", "0065_0323_0302", + "1EC8", "0049_0309", + "1EC9", "0069_0309", + "1ECA", "0049_0323", + "1ECB", "0069_0323", + "1ECC", "004F_0323", + "1ECD", "006F_0323", + "1ECE", "004F_0309", + "1ECF", "006F_0309", + "1ED0", "004F_0302_0301", + "1ED1", "006F_0302_0301", + "1ED2", "004F_0302_0300", + "1ED3", "006F_0302_0300", + "1ED4", "004F_0302_0309", + "1ED5", "006F_0302_0309", + "1ED6", "004F_0302_0303", + "1ED7", "006F_0302_0303", + "1ED8", "004F_0323_0302", + "1ED9", "006F_0323_0302", + "1EDA", "004F_031B_0301", + "1EDB", "006F_031B_0301", + "1EDC", "004F_031B_0300", + "1EDD", "006F_031B_0300", + "1EDE", "004F_031B_0309", + "1EDF", "006F_031B_0309", + "1EE0", "004F_031B_0303", + "1EE1", "006F_031B_0303", + "1EE2", "004F_031B_0323", + "1EE3", "006F_031B_0323", + "1EE4", "0055_0323", + "1EE5", "0075_0323", + "1EE6", "0055_0309", + "1EE7", "0075_0309", + "1EE8", "0055_031B_0301", + "1EE9", "0075_031B_0301", + "1EEA", "0055_031B_0300", + "1EEB", "0075_031B_0300", + "1EEC", "0055_031B_0309", + "1EED", "0075_031B_0309", + "1EEE", "0055_031B_0303", + "1EEF", "0075_031B_0303", + "1EF0", "0055_031B_0323", + "1EF1", "0075_031B_0323", + "1EF2", "0059_0300", + "1EF3", "0079_0300", + "1EF4", "0059_0323", + "1EF5", "0079_0323", + "1EF6", "0059_0309", + "1EF7", "0079_0309", + "1EF8", "0059_0303", + "1EF9", "0079_0303", + "1F00", "03B1_0313", + "1F01", "03B1_0314", + "1F02", "03B1_0313_0300", + "1F03", "03B1_0314_0300", + "1F04", "03B1_0313_0301", + "1F05", "03B1_0314_0301", + "1F06", "03B1_0313_0342", + "1F07", "03B1_0314_0342", + "1F08", "0391_0313", + "1F09", "0391_0314", + "1F0A", "0391_0313_0300", + "1F0B", "0391_0314_0300", + "1F0C", "0391_0313_0301", + "1F0D", "0391_0314_0301", + "1F0E", "0391_0313_0342", + "1F0F", "0391_0314_0342", + "1F10", "03B5_0313", + "1F11", "03B5_0314", + "1F12", "03B5_0313_0300", + "1F13", "03B5_0314_0300", + "1F14", "03B5_0313_0301", + "1F15", "03B5_0314_0301", + "1F18", "0395_0313", + "1F19", "0395_0314", + "1F1A", "0395_0313_0300", + "1F1B", "0395_0314_0300", + "1F1C", "0395_0313_0301", + "1F1D", "0395_0314_0301", + "1F20", "03B7_0313", + "1F21", "03B7_0314", + "1F22", "03B7_0313_0300", + "1F23", "03B7_0314_0300", + "1F24", "03B7_0313_0301", + "1F25", "03B7_0314_0301", + "1F26", "03B7_0313_0342", + "1F27", "03B7_0314_0342", + "1F28", "0397_0313", + "1F29", "0397_0314", + "1F2A", "0397_0313_0300", + "1F2B", "0397_0314_0300", + "1F2C", "0397_0313_0301", + "1F2D", "0397_0314_0301", + "1F2E", "0397_0313_0342", + "1F2F", "0397_0314_0342", + "1F30", "03B9_0313", + "1F31", "03B9_0314", + "1F32", "03B9_0313_0300", + "1F33", "03B9_0314_0300", + "1F34", "03B9_0313_0301", + "1F35", "03B9_0314_0301", + "1F36", "03B9_0313_0342", + "1F37", "03B9_0314_0342", + "1F38", "0399_0313", + "1F39", "0399_0314", + "1F3A", "0399_0313_0300", + "1F3B", "0399_0314_0300", + "1F3C", "0399_0313_0301", + "1F3D", "0399_0314_0301", + "1F3E", "0399_0313_0342", + "1F3F", "0399_0314_0342", + "1F40", "03BF_0313", + "1F41", "03BF_0314", + "1F42", "03BF_0313_0300", + "1F43", "03BF_0314_0300", + "1F44", "03BF_0313_0301", + "1F45", "03BF_0314_0301", + "1F48", "039F_0313", + "1F49", "039F_0314", + "1F4A", "039F_0313_0300", + "1F4B", "039F_0314_0300", + "1F4C", "039F_0313_0301", + "1F4D", "039F_0314_0301", + "1F50", "03C5_0313", + "1F51", "03C5_0314", + "1F52", "03C5_0313_0300", + "1F53", "03C5_0314_0300", + "1F54", "03C5_0313_0301", + "1F55", "03C5_0314_0301", + "1F56", "03C5_0313_0342", + "1F57", "03C5_0314_0342", + "1F59", "03A5_0314", + "1F5B", "03A5_0314_0300", + "1F5D", "03A5_0314_0301", + "1F5F", "03A5_0314_0342", + "1F60", "03C9_0313", + "1F61", "03C9_0314", + "1F62", "03C9_0313_0300", + "1F63", "03C9_0314_0300", + "1F64", "03C9_0313_0301", + "1F65", "03C9_0314_0301", + "1F66", "03C9_0313_0342", + "1F67", "03C9_0314_0342", + "1F68", "03A9_0313", + "1F69", "03A9_0314", + "1F6A", "03A9_0313_0300", + "1F6B", "03A9_0314_0300", + "1F6C", "03A9_0313_0301", + "1F6D", "03A9_0314_0301", + "1F6E", "03A9_0313_0342", + "1F6F", "03A9_0314_0342", + "1F70", "03B1_0300", + "1F71", "03B1_0301", + "1F72", "03B5_0300", + "1F73", "03B5_0301", + "1F74", "03B7_0300", + "1F75", "03B7_0301", + "1F76", "03B9_0300", + "1F77", "03B9_0301", + "1F78", "03BF_0300", + "1F79", "03BF_0301", + "1F7A", "03C5_0300", + "1F7B", "03C5_0301", + "1F7C", "03C9_0300", + "1F7D", "03C9_0301", + "1F80", "03B1_0313_0345", + "1F81", "03B1_0314_0345", + "1F82", "03B1_0313_0300_0345", + "1F83", "03B1_0314_0300_0345", + "1F84", "03B1_0313_0301_0345", + "1F85", "03B1_0314_0301_0345", + "1F86", "03B1_0313_0342_0345", + "1F87", "03B1_0314_0342_0345", + "1F88", "0391_0313_0345", + "1F89", "0391_0314_0345", + "1F8A", "0391_0313_0300_0345", + "1F8B", "0391_0314_0300_0345", + "1F8C", "0391_0313_0301_0345", + "1F8D", "0391_0314_0301_0345", + "1F8E", "0391_0313_0342_0345", + "1F8F", "0391_0314_0342_0345", + "1F90", "03B7_0313_0345", + "1F91", "03B7_0314_0345", + "1F92", "03B7_0313_0300_0345", + "1F93", "03B7_0314_0300_0345", + "1F94", "03B7_0313_0301_0345", + "1F95", "03B7_0314_0301_0345", + "1F96", "03B7_0313_0342_0345", + "1F97", "03B7_0314_0342_0345", + "1F98", "0397_0313_0345", + "1F99", "0397_0314_0345", + "1F9A", "0397_0313_0300_0345", + "1F9B", "0397_0314_0300_0345", + "1F9C", "0397_0313_0301_0345", + "1F9D", "0397_0314_0301_0345", + "1F9E", "0397_0313_0342_0345", + "1F9F", "0397_0314_0342_0345", + "1FA0", "03C9_0313_0345", + "1FA1", "03C9_0314_0345", + "1FA2", "03C9_0313_0300_0345", + "1FA3", "03C9_0314_0300_0345", + "1FA4", "03C9_0313_0301_0345", + "1FA5", "03C9_0314_0301_0345", + "1FA6", "03C9_0313_0342_0345", + "1FA7", "03C9_0314_0342_0345", + "1FA8", "03A9_0313_0345", + "1FA9", "03A9_0314_0345", + "1FAA", "03A9_0313_0300_0345", + "1FAB", "03A9_0314_0300_0345", + "1FAC", "03A9_0313_0301_0345", + "1FAD", "03A9_0314_0301_0345", + "1FAE", "03A9_0313_0342_0345", + "1FAF", "03A9_0314_0342_0345", + "1FB0", "03B1_0306", + "1FB1", "03B1_0304", + "1FB2", "03B1_0300_0345", + "1FB3", "03B1_0345", + "1FB4", "03B1_0301_0345", + "1FB6", "03B1_0342", + "1FB7", "03B1_0342_0345", + "1FB8", "0391_0306", + "1FB9", "0391_0304", + "1FBA", "0391_0300", + "1FBB", "0391_0301", + "1FBC", "0391_0345", + "1FBE", "03B9", + "1FC1", "00A8_0342", + "1FC2", "03B7_0300_0345", + "1FC3", "03B7_0345", + "1FC4", "03B7_0301_0345", + "1FC6", "03B7_0342", + "1FC7", "03B7_0342_0345", + "1FC8", "0395_0300", + "1FC9", "0395_0301", + "1FCA", "0397_0300", + "1FCB", "0397_0301", + "1FCC", "0397_0345", + "1FCD", "1FBF_0300", + "1FCE", "1FBF_0301", + "1FCF", "1FBF_0342", + "1FD0", "03B9_0306", + "1FD1", "03B9_0304", + "1FD2", "03B9_0308_0300", + "1FD3", "03B9_0308_0301", + "1FD6", "03B9_0342", + "1FD7", "03B9_0308_0342", + "1FD8", "0399_0306", + "1FD9", "0399_0304", + "1FDA", "0399_0300", + "1FDB", "0399_0301", + "1FDD", "1FFE_0300", + "1FDE", "1FFE_0301", + "1FDF", "1FFE_0342", + "1FE0", "03C5_0306", + "1FE1", "03C5_0304", + "1FE2", "03C5_0308_0300", + "1FE3", "03C5_0308_0301", + "1FE4", "03C1_0313", + "1FE5", "03C1_0314", + "1FE6", "03C5_0342", + "1FE7", "03C5_0308_0342", + "1FE8", "03A5_0306", + "1FE9", "03A5_0304", + "1FEA", "03A5_0300", + "1FEB", "03A5_0301", + "1FEC", "03A1_0314", + "1FED", "00A8_0300", + "1FEE", "00A8_0301", + "1FEF", "0060", + "1FF2", "03C9_0300_0345", + "1FF3", "03C9_0345", + "1FF4", "03C9_0301_0345", + "1FF6", "03C9_0342", + "1FF7", "03C9_0342_0345", + "1FF8", "039F_0300", + "1FF9", "039F_0301", + "1FFA", "03A9_0300", + "1FFB", "03A9_0301", + "1FFC", "03A9_0345", + "1FFD", "00B4", + "2000", "2002", + "2001", "2003", + "2126", "03A9", + "212A", "004B", + "212B", "0041_030A", + "219A", "2190_0338", + "219B", "2192_0338", + "21AE", "2194_0338", + "21CD", "21D0_0338", + "21CE", "21D4_0338", + "21CF", "21D2_0338", + "2204", "2203_0338", + "2209", "2208_0338", + "220C", "220B_0338", + "2224", "2223_0338", + "2226", "2225_0338", + "2241", "223C_0338", + "2244", "2243_0338", + "2247", "2245_0338", + "2249", "2248_0338", + "2260", "003D_0338", + "2262", "2261_0338", + "226D", "224D_0338", + "226E", "003C_0338", + "226F", "003E_0338", + "2270", "2264_0338", + "2271", "2265_0338", + "2274", "2272_0338", + "2275", "2273_0338", + "2278", "2276_0338", + "2279", "2277_0338", + "2280", "227A_0338", + "2281", "227B_0338", + "2284", "2282_0338", + "2285", "2283_0338", + "2288", "2286_0338", + "2289", "2287_0338", + "22AC", "22A2_0338", + "22AD", "22A8_0338", + "22AE", "22A9_0338", + "22AF", "22AB_0338", + "22E0", "227C_0338", + "22E1", "227D_0338", + "22E2", "2291_0338", + "22E3", "2292_0338", + "22EA", "22B2_0338", + "22EB", "22B3_0338", + "22EC", "22B4_0338", + "22ED", "22B5_0338", + "2329", "3008", + "232A", "3009", + "2ADC", "2ADD_0338", + "304C", "304B_3099", + "304E", "304D_3099", + "3050", "304F_3099", + "3052", "3051_3099", + "3054", "3053_3099", + "3056", "3055_3099", + "3058", "3057_3099", + "305A", "3059_3099", + "305C", "305B_3099", + "305E", "305D_3099", + "3060", "305F_3099", + "3062", "3061_3099", + "3065", "3064_3099", + "3067", "3066_3099", + "3069", "3068_3099", + "3070", "306F_3099", + "3071", "306F_309A", + "3073", "3072_3099", + "3074", "3072_309A", + "3076", "3075_3099", + "3077", "3075_309A", + "3079", "3078_3099", + "307A", "3078_309A", + "307C", "307B_3099", + "307D", "307B_309A", + "3094", "3046_3099", + "309E", "309D_3099", + "30AC", "30AB_3099", + "30AE", "30AD_3099", + "30B0", "30AF_3099", + "30B2", "30B1_3099", + "30B4", "30B3_3099", + "30B6", "30B5_3099", + "30B8", "30B7_3099", + "30BA", "30B9_3099", + "30BC", "30BB_3099", + "30BE", "30BD_3099", + "30C0", "30BF_3099", + "30C2", "30C1_3099", + "30C5", "30C4_3099", + "30C7", "30C6_3099", + "30C9", "30C8_3099", + "30D0", "30CF_3099", + "30D1", "30CF_309A", + "30D3", "30D2_3099", + "30D4", "30D2_309A", + "30D6", "30D5_3099", + "30D7", "30D5_309A", + "30D9", "30D8_3099", + "30DA", "30D8_309A", + "30DC", "30DB_3099", + "30DD", "30DB_309A", + "30F4", "30A6_3099", + "30F7", "30EF_3099", + "30F8", "30F0_3099", + "30F9", "30F1_3099", + "30FA", "30F2_3099", + "30FE", "30FD_3099", + "F900", "8C48", + "F901", "66F4", + "F902", "8ECA", + "F903", "8CC8", + "F904", "6ED1", + "F905", "4E32", + "F906", "53E5", + "F907", "9F9C", + "F908", "9F9C", + "F909", "5951", + "F90A", "91D1", + "F90B", "5587", + "F90C", "5948", + "F90D", "61F6", + "F90E", "7669", + "F90F", "7F85", + "F910", "863F", + "F911", "87BA", + "F912", "88F8", + "F913", "908F", + "F914", "6A02", + "F915", "6D1B", + "F916", "70D9", + "F917", "73DE", + "F918", "843D", + "F919", "916A", + "F91A", "99F1", + "F91B", "4E82", + "F91C", "5375", + "F91D", "6B04", + "F91E", "721B", + "F91F", "862D", + "F920", "9E1E", + "F921", "5D50", + "F922", "6FEB", + "F923", "85CD", + "F924", "8964", + "F925", "62C9", + "F926", "81D8", + "F927", "881F", + "F928", "5ECA", + "F929", "6717", + "F92A", "6D6A", + "F92B", "72FC", + "F92C", "90CE", + "F92D", "4F86", + "F92E", "51B7", + "F92F", "52DE", + "F930", "64C4", + "F931", "6AD3", + "F932", "7210", + "F933", "76E7", + "F934", "8001", + "F935", "8606", + "F936", "865C", + "F937", "8DEF", + "F938", "9732", + "F939", "9B6F", + "F93A", "9DFA", + "F93B", "788C", + "F93C", "797F", + "F93D", "7DA0", + "F93E", "83C9", + "F93F", "9304", + "F940", "9E7F", + "F941", "8AD6", + "F942", "58DF", + "F943", "5F04", + "F944", "7C60", + "F945", "807E", + "F946", "7262", + "F947", "78CA", + "F948", "8CC2", + "F949", "96F7", + "F94A", "58D8", + "F94B", "5C62", + "F94C", "6A13", + "F94D", "6DDA", + "F94E", "6F0F", + "F94F", "7D2F", + "F950", "7E37", + "F951", "964B", + "F952", "52D2", + "F953", "808B", + "F954", "51DC", + "F955", "51CC", + "F956", "7A1C", + "F957", "7DBE", + "F958", "83F1", + "F959", "9675", + "F95A", "8B80", + "F95B", "62CF", + "F95C", "6A02", + "F95D", "8AFE", + "F95E", "4E39", + "F95F", "5BE7", + "F960", "6012", + "F961", "7387", + "F962", "7570", + "F963", "5317", + "F964", "78FB", + "F965", "4FBF", + "F966", "5FA9", + "F967", "4E0D", + "F968", "6CCC", + "F969", "6578", + "F96A", "7D22", + "F96B", "53C3", + "F96C", "585E", + "F96D", "7701", + "F96E", "8449", + "F96F", "8AAA", + "F970", "6BBA", + "F971", "8FB0", + "F972", "6C88", + "F973", "62FE", + "F974", "82E5", + "F975", "63A0", + "F976", "7565", + "F977", "4EAE", + "F978", "5169", + "F979", "51C9", + "F97A", "6881", + "F97B", "7CE7", + "F97C", "826F", + "F97D", "8AD2", + "F97E", "91CF", + "F97F", "52F5", + "F980", "5442", + "F981", "5973", + "F982", "5EEC", + "F983", "65C5", + "F984", "6FFE", + "F985", "792A", + "F986", "95AD", + "F987", "9A6A", + "F988", "9E97", + "F989", "9ECE", + "F98A", "529B", + "F98B", "66C6", + "F98C", "6B77", + "F98D", "8F62", + "F98E", "5E74", + "F98F", "6190", + "F990", "6200", + "F991", "649A", + "F992", "6F23", + "F993", "7149", + "F994", "7489", + "F995", "79CA", + "F996", "7DF4", + "F997", "806F", + "F998", "8F26", + "F999", "84EE", + "F99A", "9023", + "F99B", "934A", + "F99C", "5217", + "F99D", "52A3", + "F99E", "54BD", + "F99F", "70C8", + "F9A0", "88C2", + "F9A1", "8AAA", + "F9A2", "5EC9", + "F9A3", "5FF5", + "F9A4", "637B", + "F9A5", "6BAE", + "F9A6", "7C3E", + "F9A7", "7375", + "F9A8", "4EE4", + "F9A9", "56F9", + "F9AA", "5BE7", + "F9AB", "5DBA", + "F9AC", "601C", + "F9AD", "73B2", + "F9AE", "7469", + "F9AF", "7F9A", + "F9B0", "8046", + "F9B1", "9234", + "F9B2", "96F6", + "F9B3", "9748", + "F9B4", "9818", + "F9B5", "4F8B", + "F9B6", "79AE", + "F9B7", "91B4", + "F9B8", "96B8", + "F9B9", "60E1", + "F9BA", "4E86", + "F9BB", "50DA", + "F9BC", "5BEE", + "F9BD", "5C3F", + "F9BE", "6599", + "F9BF", "6A02", + "F9C0", "71CE", + "F9C1", "7642", + "F9C2", "84FC", + "F9C3", "907C", + "F9C4", "9F8D", + "F9C5", "6688", + "F9C6", "962E", + "F9C7", "5289", + "F9C8", "677B", + "F9C9", "67F3", + "F9CA", "6D41", + "F9CB", "6E9C", + "F9CC", "7409", + "F9CD", "7559", + "F9CE", "786B", + "F9CF", "7D10", + "F9D0", "985E", + "F9D1", "516D", + "F9D2", "622E", + "F9D3", "9678", + "F9D4", "502B", + "F9D5", "5D19", + "F9D6", "6DEA", + "F9D7", "8F2A", + "F9D8", "5F8B", + "F9D9", "6144", + "F9DA", "6817", + "F9DB", "7387", + "F9DC", "9686", + "F9DD", "5229", + "F9DE", "540F", + "F9DF", "5C65", + "F9E0", "6613", + "F9E1", "674E", + "F9E2", "68A8", + "F9E3", "6CE5", + "F9E4", "7406", + "F9E5", "75E2", + "F9E6", "7F79", + "F9E7", "88CF", + "F9E8", "88E1", + "F9E9", "91CC", + "F9EA", "96E2", + "F9EB", "533F", + "F9EC", "6EBA", + "F9ED", "541D", + "F9EE", "71D0", + "F9EF", "7498", + "F9F0", "85FA", + "F9F1", "96A3", + "F9F2", "9C57", + "F9F3", "9E9F", + "F9F4", "6797", + "F9F5", "6DCB", + "F9F6", "81E8", + "F9F7", "7ACB", + "F9F8", "7B20", + "F9F9", "7C92", + "F9FA", "72C0", + "F9FB", "7099", + "F9FC", "8B58", + "F9FD", "4EC0", + "F9FE", "8336", + "F9FF", "523A", + "FA00", "5207", + "FA01", "5EA6", + "FA02", "62D3", + "FA03", "7CD6", + "FA04", "5B85", + "FA05", "6D1E", + "FA06", "66B4", + "FA07", "8F3B", + "FA08", "884C", + "FA09", "964D", + "FA0A", "898B", + "FA0B", "5ED3", + "FA0C", "5140", + "FA0D", "55C0", + "FA10", "585A", + "FA12", "6674", + "FA15", "51DE", + "FA16", "732A", + "FA17", "76CA", + "FA18", "793C", + "FA19", "795E", + "FA1A", "7965", + "FA1B", "798F", + "FA1C", "9756", + "FA1D", "7CBE", + "FA1E", "7FBD", + "FA20", "8612", + "FA22", "8AF8", + "FA25", "9038", + "FA26", "90FD", + "FA2A", "98EF", + "FA2B", "98FC", + "FA2C", "9928", + "FA2D", "9DB4", + "FA30", "4FAE", + "FA31", "50E7", + "FA32", "514D", + "FA33", "52C9", + "FA34", "52E4", + "FA35", "5351", + "FA36", "559D", + "FA37", "5606", + "FA38", "5668", + "FA39", "5840", + "FA3A", "58A8", + "FA3B", "5C64", + "FA3C", "5C6E", + "FA3D", "6094", + "FA3E", "6168", + "FA3F", "618E", + "FA40", "61F2", + "FA41", "654F", + "FA42", "65E2", + "FA43", "6691", + "FA44", "6885", + "FA45", "6D77", + "FA46", "6E1A", + "FA47", "6F22", + "FA48", "716E", + "FA49", "722B", + "FA4A", "7422", + "FA4B", "7891", + "FA4C", "793E", + "FA4D", "7949", + "FA4E", "7948", + "FA4F", "7950", + "FA50", "7956", + "FA51", "795D", + "FA52", "798D", + "FA53", "798E", + "FA54", "7A40", + "FA55", "7A81", + "FA56", "7BC0", + "FA57", "7DF4", + "FA58", "7E09", + "FA59", "7E41", + "FA5A", "7F72", + "FA5B", "8005", + "FA5C", "81ED", + "FA5D", "8279", + "FA5E", "8279", + "FA5F", "8457", + "FA60", "8910", + "FA61", "8996", + "FA62", "8B01", + "FA63", "8B39", + "FA64", "8CD3", + "FA65", "8D08", + "FA66", "8FB6", + "FA67", "9038", + "FA68", "96E3", + "FA69", "97FF", + "FA6A", "983B", + "FB1D", "05D9_05B4", + "FB1F", "05F2_05B7", + "FB2A", "05E9_05C1", + "FB2B", "05E9_05C2", + "FB2C", "05E9_05BC_05C1", + "FB2D", "05E9_05BC_05C2", + "FB2E", "05D0_05B7", + "FB2F", "05D0_05B8", + "FB30", "05D0_05BC", + "FB31", "05D1_05BC", + "FB32", "05D2_05BC", + "FB33", "05D3_05BC", + "FB34", "05D4_05BC", + "FB35", "05D5_05BC", + "FB36", "05D6_05BC", + "FB38", "05D8_05BC", + "FB39", "05D9_05BC", + "FB3A", "05DA_05BC", + "FB3B", "05DB_05BC", + "FB3C", "05DC_05BC", + "FB3E", "05DE_05BC", + "FB40", "05E0_05BC", + "FB41", "05E1_05BC", + "FB43", "05E3_05BC", + "FB44", "05E4_05BC", + "FB46", "05E6_05BC", + "FB47", "05E7_05BC", + "FB48", "05E8_05BC", + "FB49", "05E9_05BC", + "FB4A", "05EA_05BC", + "FB4B", "05D5_05B9", + "FB4C", "05D1_05BF", + "FB4D", "05DB_05BF", + "FB4E", "05E4_05BF", + "1D15E", "1D157_1D165", + "1D15F", "1D158_1D165", + "1D160", "1D158_1D165_1D16E", + "1D161", "1D158_1D165_1D16F", + "1D162", "1D158_1D165_1D170", + "1D163", "1D158_1D165_1D171", + "1D164", "1D158_1D165_1D172", + "1D1BB", "1D1B9_1D165", + "1D1BC", "1D1BA_1D165", + "1D1BD", "1D1B9_1D165_1D16E", + "1D1BE", "1D1BA_1D165_1D16E", + "1D1BF", "1D1B9_1D165_1D16F", + "1D1C0", "1D1BA_1D165_1D16F", + "2F800", "4E3D", + "2F801", "4E38", + "2F802", "4E41", + "2F803", "20122", + "2F804", "4F60", + "2F805", "4FAE", + "2F806", "4FBB", + "2F807", "5002", + "2F808", "507A", + "2F809", "5099", + "2F80A", "50E7", + "2F80B", "50CF", + "2F80C", "349E", + "2F80D", "2063A", + "2F80E", "514D", + "2F80F", "5154", + "2F810", "5164", + "2F811", "5177", + "2F812", "2051C", + "2F813", "34B9", + "2F814", "5167", + "2F815", "518D", + "2F816", "2054B", + "2F817", "5197", + "2F818", "51A4", + "2F819", "4ECC", + "2F81A", "51AC", + "2F81B", "51B5", + "2F81C", "291DF", + "2F81D", "51F5", + "2F81E", "5203", + "2F81F", "34DF", + "2F820", "523B", + "2F821", "5246", + "2F822", "5272", + "2F823", "5277", + "2F824", "3515", + "2F825", "52C7", + "2F826", "52C9", + "2F827", "52E4", + "2F828", "52FA", + "2F829", "5305", + "2F82A", "5306", + "2F82B", "5317", + "2F82C", "5349", + "2F82D", "5351", + "2F82E", "535A", + "2F82F", "5373", + "2F830", "537D", + "2F831", "537F", + "2F832", "537F", + "2F833", "537F", + "2F834", "20A2C", + "2F835", "7070", + "2F836", "53CA", + "2F837", "53DF", + "2F838", "20B63", + "2F839", "53EB", + "2F83A", "53F1", + "2F83B", "5406", + "2F83C", "549E", + "2F83D", "5438", + "2F83E", "5448", + "2F83F", "5468", + "2F840", "54A2", + "2F841", "54F6", + "2F842", "5510", + "2F843", "5553", + "2F844", "5563", + "2F845", "5584", + "2F846", "5584", + "2F847", "5599", + "2F848", "55AB", + "2F849", "55B3", + "2F84A", "55C2", + "2F84B", "5716", + "2F84C", "5606", + "2F84D", "5717", + "2F84E", "5651", + "2F84F", "5674", + "2F850", "5207", + "2F851", "58EE", + "2F852", "57CE", + "2F853", "57F4", + "2F854", "580D", + "2F855", "578B", + "2F856", "5832", + "2F857", "5831", + "2F858", "58AC", + "2F859", "214E4", + "2F85A", "58F2", + "2F85B", "58F7", + "2F85C", "5906", + "2F85D", "591A", + "2F85E", "5922", + "2F85F", "5962", + "2F860", "216A8", + "2F861", "216EA", + "2F862", "59EC", + "2F863", "5A1B", + "2F864", "5A27", + "2F865", "59D8", + "2F866", "5A66", + "2F867", "36EE", + "2F868", "2136A", + "2F869", "5B08", + "2F86A", "5B3E", + "2F86B", "5B3E", + "2F86C", "219C8", + "2F86D", "5BC3", + "2F86E", "5BD8", + "2F86F", "5BE7", + "2F870", "5BF3", + "2F871", "21B18", + "2F872", "5BFF", + "2F873", "5C06", + "2F874", "5F33", + "2F875", "5C22", + "2F876", "3781", + "2F877", "5C60", + "2F878", "5C6E", + "2F879", "5CC0", + "2F87A", "5C8D", + "2F87B", "21DE4", + "2F87C", "5D43", + "2F87D", "21DE6", + "2F87E", "5D6E", + "2F87F", "5D6B", + "2F880", "5D7C", + "2F881", "5DE1", + "2F882", "5DE2", + "2F883", "382F", + "2F884", "5DFD", + "2F885", "5E28", + "2F886", "5E3D", + "2F887", "5E69", + "2F888", "3862", + "2F889", "22183", + "2F88A", "387C", + "2F88B", "5EB0", + "2F88C", "5EB3", + "2F88D", "5EB6", + "2F88E", "5ECA", + "2F88F", "2A392", + "2F890", "5EFE", + "2F891", "22331", + "2F892", "22331", + "2F893", "8201", + "2F894", "5F22", + "2F895", "5F22", + "2F896", "38C7", + "2F897", "232B8", + "2F898", "261DA", + "2F899", "5F62", + "2F89A", "5F6B", + "2F89B", "38E3", + "2F89C", "5F9A", + "2F89D", "5FCD", + "2F89E", "5FD7", + "2F89F", "5FF9", + "2F8A0", "6081", + "2F8A1", "393A", + "2F8A2", "391C", + "2F8A3", "6094", + "2F8A4", "226D4", + "2F8A5", "60C7", + "2F8A6", "6148", + "2F8A7", "614C", + "2F8A8", "614E", + "2F8A9", "614C", + "2F8AA", "617A", + "2F8AB", "618E", + "2F8AC", "61B2", + "2F8AD", "61A4", + "2F8AE", "61AF", + "2F8AF", "61DE", + "2F8B0", "61F2", + "2F8B1", "61F6", + "2F8B2", "6210", + "2F8B3", "621B", + "2F8B4", "625D", + "2F8B5", "62B1", + "2F8B6", "62D4", + "2F8B7", "6350", + "2F8B8", "22B0C", + "2F8B9", "633D", + "2F8BA", "62FC", + "2F8BB", "6368", + "2F8BC", "6383", + "2F8BD", "63E4", + "2F8BE", "22BF1", + "2F8BF", "6422", + "2F8C0", "63C5", + "2F8C1", "63A9", + "2F8C2", "3A2E", + "2F8C3", "6469", + "2F8C4", "647E", + "2F8C5", "649D", + "2F8C6", "6477", + "2F8C7", "3A6C", + "2F8C8", "654F", + "2F8C9", "656C", + "2F8CA", "2300A", + "2F8CB", "65E3", + "2F8CC", "66F8", + "2F8CD", "6649", + "2F8CE", "3B19", + "2F8CF", "6691", + "2F8D0", "3B08", + "2F8D1", "3AE4", + "2F8D2", "5192", + "2F8D3", "5195", + "2F8D4", "6700", + "2F8D5", "669C", + "2F8D6", "80AD", + "2F8D7", "43D9", + "2F8D8", "6717", + "2F8D9", "671B", + "2F8DA", "6721", + "2F8DB", "675E", + "2F8DC", "6753", + "2F8DD", "233C3", + "2F8DE", "3B49", + "2F8DF", "67FA", + "2F8E0", "6785", + "2F8E1", "6852", + "2F8E2", "6885", + "2F8E3", "2346D", + "2F8E4", "688E", + "2F8E5", "681F", + "2F8E6", "6914", + "2F8E7", "3B9D", + "2F8E8", "6942", + "2F8E9", "69A3", + "2F8EA", "69EA", + "2F8EB", "6AA8", + "2F8EC", "236A3", + "2F8ED", "6ADB", + "2F8EE", "3C18", + "2F8EF", "6B21", + "2F8F0", "238A7", + "2F8F1", "6B54", + "2F8F2", "3C4E", + "2F8F3", "6B72", + "2F8F4", "6B9F", + "2F8F5", "6BBA", + "2F8F6", "6BBB", + "2F8F7", "23A8D", + "2F8F8", "21D0B", + "2F8F9", "23AFA", + "2F8FA", "6C4E", + "2F8FB", "23CBC", + "2F8FC", "6CBF", + "2F8FD", "6CCD", + "2F8FE", "6C67", + "2F8FF", "6D16", + "2F900", "6D3E", + "2F901", "6D77", + "2F902", "6D41", + "2F903", "6D69", + "2F904", "6D78", + "2F905", "6D85", + "2F906", "23D1E", + "2F907", "6D34", + "2F908", "6E2F", + "2F909", "6E6E", + "2F90A", "3D33", + "2F90B", "6ECB", + "2F90C", "6EC7", + "2F90D", "23ED1", + "2F90E", "6DF9", + "2F90F", "6F6E", + "2F910", "23F5E", + "2F911", "23F8E", + "2F912", "6FC6", + "2F913", "7039", + "2F914", "701E", + "2F915", "701B", + "2F916", "3D96", + "2F917", "704A", + "2F918", "707D", + "2F919", "7077", + "2F91A", "70AD", + "2F91B", "20525", + "2F91C", "7145", + "2F91D", "24263", + "2F91E", "719C", + "2F91F", "43AB", + "2F920", "7228", + "2F921", "7235", + "2F922", "7250", + "2F923", "24608", + "2F924", "7280", + "2F925", "7295", + "2F926", "24735", + "2F927", "24814", + "2F928", "737A", + "2F929", "738B", + "2F92A", "3EAC", + "2F92B", "73A5", + "2F92C", "3EB8", + "2F92D", "3EB8", + "2F92E", "7447", + "2F92F", "745C", + "2F930", "7471", + "2F931", "7485", + "2F932", "74CA", + "2F933", "3F1B", + "2F934", "7524", + "2F935", "24C36", + "2F936", "753E", + "2F937", "24C92", + "2F938", "7570", + "2F939", "2219F", + "2F93A", "7610", + "2F93B", "24FA1", + "2F93C", "24FB8", + "2F93D", "25044", + "2F93E", "3FFC", + "2F93F", "4008", + "2F940", "76F4", + "2F941", "250F3", + "2F942", "250F2", + "2F943", "25119", + "2F944", "25133", + "2F945", "771E", + "2F946", "771F", + "2F947", "771F", + "2F948", "774A", + "2F949", "4039", + "2F94A", "778B", + "2F94B", "4046", + "2F94C", "4096", + "2F94D", "2541D", + "2F94E", "784E", + "2F94F", "788C", + "2F950", "78CC", + "2F951", "40E3", + "2F952", "25626", + "2F953", "7956", + "2F954", "2569A", + "2F955", "256C5", + "2F956", "798F", + "2F957", "79EB", + "2F958", "412F", + "2F959", "7A40", + "2F95A", "7A4A", + "2F95B", "7A4F", + "2F95C", "2597C", + "2F95D", "25AA7", + "2F95E", "25AA7", + "2F95F", "7AAE", + "2F960", "4202", + "2F961", "25BAB", + "2F962", "7BC6", + "2F963", "7BC9", + "2F964", "4227", + "2F965", "25C80", + "2F966", "7CD2", + "2F967", "42A0", + "2F968", "7CE8", + "2F969", "7CE3", + "2F96A", "7D00", + "2F96B", "25F86", + "2F96C", "7D63", + "2F96D", "4301", + "2F96E", "7DC7", + "2F96F", "7E02", + "2F970", "7E45", + "2F971", "4334", + "2F972", "26228", + "2F973", "26247", + "2F974", "4359", + "2F975", "262D9", + "2F976", "7F7A", + "2F977", "2633E", + "2F978", "7F95", + "2F979", "7FFA", + "2F97A", "8005", + "2F97B", "264DA", + "2F97C", "26523", + "2F97D", "8060", + "2F97E", "265A8", + "2F97F", "8070", + "2F980", "2335F", + "2F981", "43D5", + "2F982", "80B2", + "2F983", "8103", + "2F984", "440B", + "2F985", "813E", + "2F986", "5AB5", + "2F987", "267A7", + "2F988", "267B5", + "2F989", "23393", + "2F98A", "2339C", + "2F98B", "8201", + "2F98C", "8204", + "2F98D", "8F9E", + "2F98E", "446B", + "2F98F", "8291", + "2F990", "828B", + "2F991", "829D", + "2F992", "52B3", + "2F993", "82B1", + "2F994", "82B3", + "2F995", "82BD", + "2F996", "82E6", + "2F997", "26B3C", + "2F998", "82E5", + "2F999", "831D", + "2F99A", "8363", + "2F99B", "83AD", + "2F99C", "8323", + "2F99D", "83BD", + "2F99E", "83E7", + "2F99F", "8457", + "2F9A0", "8353", + "2F9A1", "83CA", + "2F9A2", "83CC", + "2F9A3", "83DC", + "2F9A4", "26C36", + "2F9A5", "26D6B", + "2F9A6", "26CD5", + "2F9A7", "452B", + "2F9A8", "84F1", + "2F9A9", "84F3", + "2F9AA", "8516", + "2F9AB", "273CA", + "2F9AC", "8564", + "2F9AD", "26F2C", + "2F9AE", "455D", + "2F9AF", "4561", + "2F9B0", "26FB1", + "2F9B1", "270D2", + "2F9B2", "456B", + "2F9B3", "8650", + "2F9B4", "865C", + "2F9B5", "8667", + "2F9B6", "8669", + "2F9B7", "86A9", + "2F9B8", "8688", + "2F9B9", "870E", + "2F9BA", "86E2", + "2F9BB", "8779", + "2F9BC", "8728", + "2F9BD", "876B", + "2F9BE", "8786", + "2F9BF", "4D57", + "2F9C0", "87E1", + "2F9C1", "8801", + "2F9C2", "45F9", + "2F9C3", "8860", + "2F9C4", "8863", + "2F9C5", "27667", + "2F9C6", "88D7", + "2F9C7", "88DE", + "2F9C8", "4635", + "2F9C9", "88FA", + "2F9CA", "34BB", + "2F9CB", "278AE", + "2F9CC", "27966", + "2F9CD", "46BE", + "2F9CE", "46C7", + "2F9CF", "8AA0", + "2F9D0", "8AED", + "2F9D1", "8B8A", + "2F9D2", "8C55", + "2F9D3", "27CA8", + "2F9D4", "8CAB", + "2F9D5", "8CC1", + "2F9D6", "8D1B", + "2F9D7", "8D77", + "2F9D8", "27F2F", + "2F9D9", "20804", + "2F9DA", "8DCB", + "2F9DB", "8DBC", + "2F9DC", "8DF0", + "2F9DD", "208DE", + "2F9DE", "8ED4", + "2F9DF", "8F38", + "2F9E0", "285D2", + "2F9E1", "285ED", + "2F9E2", "9094", + "2F9E3", "90F1", + "2F9E4", "9111", + "2F9E5", "2872E", + "2F9E6", "911B", + "2F9E7", "9238", + "2F9E8", "92D7", + "2F9E9", "92D8", + "2F9EA", "927C", + "2F9EB", "93F9", + "2F9EC", "9415", + "2F9ED", "28BFA", + "2F9EE", "958B", + "2F9EF", "4995", + "2F9F0", "95B7", + "2F9F1", "28D77", + "2F9F2", "49E6", + "2F9F3", "96C3", + "2F9F4", "5DB2", + "2F9F5", "9723", + "2F9F6", "29145", + "2F9F7", "2921A", + "2F9F8", "4A6E", + "2F9F9", "4A76", + "2F9FA", "97E0", + "2F9FB", "2940A", + "2F9FC", "4AB2", + "2F9FD", "29496", + "2F9FE", "980B", + "2F9FF", "980B", + "2FA00", "9829", + "2FA01", "295B6", + "2FA02", "98E2", + "2FA03", "4B33", + "2FA04", "9929", + "2FA05", "99A7", + "2FA06", "99C2", + "2FA07", "99FE", + "2FA08", "4BCE", + "2FA09", "29B30", + "2FA0A", "9B12", + "2FA0B", "9C40", + "2FA0C", "9CFD", + "2FA0D", "4CCE", + "2FA0E", "4CED", + "2FA0F", "9D67", + "2FA10", "2A0CE", + "2FA11", "4CF8", + "2FA12", "2A105", + "2FA13", "2A20E", + "2FA14", "2A291", + "2FA15", "9EBB", + "2FA16", "4D56", + "2FA17", "9EF9", + "2FA18", "9EFE", + "2FA19", "9F05", + "2FA1A", "9F0F", + "2FA1B", "9F16", + "2FA1C", "9F3B", + "2FA1D", "2A600", ); -%AGL_to_unicode = ( - "A", "u0041", - "AE", "u00C6", - "AEacute", "u01FC", - "AEmacron", "u01E2", - "Aacute", "u00C1", - "Abreve", "u0102", - "Abreveacute", "u1EAE", - "Abrevecyrillic", "u04D0", - "Abrevedotbelow", "u1EB6", - "Abrevegrave", "u1EB0", - "Abrevehookabove", "u1EB2", - "Abrevetilde", "u1EB4", - "Acaron", "u01CD", - "Acircle", "u24B6", - "Acircumflex", "u00C2", - "Acircumflexacute", "u1EA4", - "Acircumflexdotbelow", "u1EAC", - "Acircumflexgrave", "u1EA6", - "Acircumflexhookabove", "u1EA8", - "Acircumflextilde", "u1EAA", - "Acyrillic", "u0410", - "Adblgrave", "u0200", - "Adieresis", "u00C4", - "Adieresiscyrillic", "u04D2", - "Adieresismacron", "u01DE", - "Adotbelow", "u1EA0", - "Adotmacron", "u01E0", - "Agrave", "u00C0", - "Ahookabove", "u1EA2", - "Aiecyrillic", "u04D4", - "Ainvertedbreve", "u0202", - "Alpha", "u0391", - "Alphatonos", "u0386", - "Amacron", "u0100", - "Amonospace", "uFF21", - "Aogonek", "u0104", - "Aring", "u00C5", - "Aringacute", "u01FA", - "Aringbelow", "u1E00", - "Atilde", "u00C3", - "Aybarmenian", "u0531", - "B", "u0042", - "Bcircle", "u24B7", - "Bdotaccent", "u1E02", - "Bdotbelow", "u1E04", - "Becyrillic", "u0411", - "Benarmenian", "u0532", - "Beta", "u0392", - "Bhook", "u0181", - "Blinebelow", "u1E06", - "Bmonospace", "uFF22", - "Btopbar", "u0182", - "C", "u0043", - "Caarmenian", "u053E", - "Cacute", "u0106", - "Ccaron", "u010C", - "Ccedilla", "u00C7", - "Ccedillaacute", "u1E08", - "Ccircle", "u24B8", - "Ccircumflex", "u0108", - "Cdot", "u010A", - "Cdotaccent", "u010A", - "Chaarmenian", "u0549", - "Cheabkhasiancyrillic", "u04BC", - "Checyrillic", "u0427", - "Chedescenderabkhasiancyrillic", "u04BE", - "Chedescendercyrillic", "u04B6", - "Chedieresiscyrillic", "u04F4", - "Cheharmenian", "u0543", - "Chekhakassiancyrillic", "u04CB", - "Cheverticalstrokecyrillic", "u04B8", - "Chi", "u03A7", - "Chook", "u0187", - "Cmonospace", "uFF23", - "Coarmenian", "u0551", - "D", "u0044", - "DZ", "u01F1", - "DZcaron", "u01C4", - "Daarmenian", "u0534", - "Dafrican", "u0189", - "Dcaron", "u010E", - "Dcedilla", "u1E10", - "Dcircle", "u24B9", - "Dcircumflexbelow", "u1E12", - "Dcroat", "u0110", - "Ddotaccent", "u1E0A", - "Ddotbelow", "u1E0C", - "Decyrillic", "u0414", - "Deicoptic", "u03EE", - "Delta", "u2206", - "Deltagreek", "u0394", - "Dhook", "u018A", - "Digammagreek", "u03DC", - "Djecyrillic", "u0402", - "Dlinebelow", "u1E0E", - "Dmonospace", "uFF24", - "Dslash", "u0110", - "Dtopbar", "u018B", - "Dz", "u01F2", - "Dzcaron", "u01C5", - "Dzeabkhasiancyrillic", "u04E0", - "Dzecyrillic", "u0405", - "Dzhecyrillic", "u040F", - "E", "u0045", - "Eacute", "u00C9", - "Ebreve", "u0114", - "Ecaron", "u011A", - "Ecedillabreve", "u1E1C", - "Echarmenian", "u0535", - "Ecircle", "u24BA", - "Ecircumflex", "u00CA", - "Ecircumflexacute", "u1EBE", - "Ecircumflexbelow", "u1E18", - "Ecircumflexdotbelow", "u1EC6", - "Ecircumflexgrave", "u1EC0", - "Ecircumflexhookabove", "u1EC2", - "Ecircumflextilde", "u1EC4", - "Ecyrillic", "u0404", - "Edblgrave", "u0204", - "Edieresis", "u00CB", - "Edot", "u0116", - "Edotaccent", "u0116", - "Edotbelow", "u1EB8", - "Efcyrillic", "u0424", - "Egrave", "u00C8", - "Eharmenian", "u0537", - "Ehookabove", "u1EBA", - "Eightroman", "u2167", - "Einvertedbreve", "u0206", - "Eiotifiedcyrillic", "u0464", - "Elcyrillic", "u041B", - "Elevenroman", "u216A", - "Emacron", "u0112", - "Emacronacute", "u1E16", - "Emacrongrave", "u1E14", - "Emcyrillic", "u041C", - "Emonospace", "uFF25", - "Encyrillic", "u041D", - "Endescendercyrillic", "u04A2", - "Eng", "u014A", - "Enghecyrillic", "u04A4", - "Enhookcyrillic", "u04C7", - "Eogonek", "u0118", - "Eopen", "u0190", - "Epsilon", "u0395", - "Epsilontonos", "u0388", - "Ercyrillic", "u0420", - "Ereversed", "u018E", - "Ereversedcyrillic", "u042D", - "Escyrillic", "u0421", - "Esdescendercyrillic", "u04AA", - "Esh", "u01A9", - "Eta", "u0397", - "Etarmenian", "u0538", - "Etatonos", "u0389", - "Eth", "u00D0", - "Etilde", "u1EBC", - "Etildebelow", "u1E1A", - "Euro", "u20AC", - "Ezh", "u01B7", - "Ezhcaron", "u01EE", - "Ezhreversed", "u01B8", - "F", "u0046", - "Fcircle", "u24BB", - "Fdotaccent", "u1E1E", - "Feharmenian", "u0556", - "Feicoptic", "u03E4", - "Fhook", "u0191", - "Fitacyrillic", "u0472", - "Fiveroman", "u2164", - "Fmonospace", "uFF26", - "Fourroman", "u2163", - "G", "u0047", - "GBsquare", "u3387", - "Gacute", "u01F4", - "Gamma", "u0393", - "Gammaafrican", "u0194", - "Gangiacoptic", "u03EA", - "Gbreve", "u011E", - "Gcaron", "u01E6", - "Gcedilla", "u0122", - "Gcircle", "u24BC", - "Gcircumflex", "u011C", - "Gcommaaccent", "u0122", - "Gdot", "u0120", - "Gdotaccent", "u0120", - "Gecyrillic", "u0413", - "Ghadarmenian", "u0542", - "Ghemiddlehookcyrillic", "u0494", - "Ghestrokecyrillic", "u0492", - "Gheupturncyrillic", "u0490", - "Ghook", "u0193", - "Gimarmenian", "u0533", - "Gjecyrillic", "u0403", - "Gmacron", "u1E20", - "Gmonospace", "uFF27", - "Gsmallhook", "u029B", - "Gstroke", "u01E4", - "H", "u0048", - "H18533", "u25CF", - "H18543", "u25AA", - "H18551", "u25AB", - "H22073", "u25A1", - "HPsquare", "u33CB", - "Haabkhasiancyrillic", "u04A8", - "Hadescendercyrillic", "u04B2", - "Hardsigncyrillic", "u042A", - "Hbar", "u0126", - "Hbrevebelow", "u1E2A", - "Hcedilla", "u1E28", - "Hcircle", "u24BD", - "Hcircumflex", "u0124", - "Hdieresis", "u1E26", - "Hdotaccent", "u1E22", - "Hdotbelow", "u1E24", - "Hmonospace", "uFF28", - "Hoarmenian", "u0540", - "Horicoptic", "u03E8", - "Hzsquare", "u3390", - "I", "u0049", - "IAcyrillic", "u042F", - "IJ", "u0132", - "IUcyrillic", "u042E", - "Iacute", "u00CD", - "Ibreve", "u012C", - "Icaron", "u01CF", - "Icircle", "u24BE", - "Icircumflex", "u00CE", - "Icyrillic", "u0406", - "Idblgrave", "u0208", - "Idieresis", "u00CF", - "Idieresisacute", "u1E2E", - "Idieresiscyrillic", "u04E4", - "Idot", "u0130", - "Idotaccent", "u0130", - "Idotbelow", "u1ECA", - "Iebrevecyrillic", "u04D6", - "Iecyrillic", "u0415", - "Ifraktur", "u2111", - "Igrave", "u00CC", - "Ihookabove", "u1EC8", - "Iicyrillic", "u0418", - "Iinvertedbreve", "u020A", - "Iishortcyrillic", "u0419", - "Imacron", "u012A", - "Imacroncyrillic", "u04E2", - "Imonospace", "uFF29", - "Iniarmenian", "u053B", - "Iocyrillic", "u0401", - "Iogonek", "u012E", - "Iota", "u0399", - "Iotaafrican", "u0196", - "Iotadieresis", "u03AA", - "Iotatonos", "u038A", - "Istroke", "u0197", - "Itilde", "u0128", - "Itildebelow", "u1E2C", - "Izhitsacyrillic", "u0474", - "Izhitsadblgravecyrillic", "u0476", - "J", "u004A", - "Jaarmenian", "u0541", - "Jcircle", "u24BF", - "Jcircumflex", "u0134", - "Jecyrillic", "u0408", - "Jheharmenian", "u054B", - "Jmonospace", "uFF2A", - "K", "u004B", - "KBsquare", "u3385", - "KKsquare", "u33CD", - "Kabashkircyrillic", "u04A0", - "Kacute", "u1E30", - "Kacyrillic", "u041A", - "Kadescendercyrillic", "u049A", - "Kahookcyrillic", "u04C3", - "Kappa", "u039A", - "Kastrokecyrillic", "u049E", - "Kaverticalstrokecyrillic", "u049C", - "Kcaron", "u01E8", - "Kcedilla", "u0136", - "Kcircle", "u24C0", - "Kcommaaccent", "u0136", - "Kdotbelow", "u1E32", - "Keharmenian", "u0554", - "Kenarmenian", "u053F", - "Khacyrillic", "u0425", - "Kheicoptic", "u03E6", - "Khook", "u0198", - "Kjecyrillic", "u040C", - "Klinebelow", "u1E34", - "Kmonospace", "uFF2B", - "Koppacyrillic", "u0480", - "Koppagreek", "u03DE", - "Ksicyrillic", "u046E", - "L", "u004C", - "LJ", "u01C7", - "Lacute", "u0139", - "Lambda", "u039B", - "Lcaron", "u013D", - "Lcedilla", "u013B", - "Lcircle", "u24C1", - "Lcircumflexbelow", "u1E3C", - "Lcommaaccent", "u013B", - "Ldot", "u013F", - "Ldotaccent", "u013F", - "Ldotbelow", "u1E36", - "Ldotbelowmacron", "u1E38", - "Liwnarmenian", "u053C", - "Lj", "u01C8", - "Ljecyrillic", "u0409", - "Llinebelow", "u1E3A", - "Lmonospace", "uFF2C", - "Lslash", "u0141", - "M", "u004D", - "MBsquare", "u3386", - "Macute", "u1E3E", - "Mcircle", "u24C2", - "Mdotaccent", "u1E40", - "Mdotbelow", "u1E42", - "Menarmenian", "u0544", - "Mmonospace", "uFF2D", - "Mturned", "u019C", - "Mu", "u039C", - "N", "u004E", - "NJ", "u01CA", - "Nacute", "u0143", - "Ncaron", "u0147", - "Ncedilla", "u0145", - "Ncircle", "u24C3", - "Ncircumflexbelow", "u1E4A", - "Ncommaaccent", "u0145", - "Ndotaccent", "u1E44", - "Ndotbelow", "u1E46", - "Nhookleft", "u019D", - "Nineroman", "u2168", - "Nj", "u01CB", - "Njecyrillic", "u040A", - "Nlinebelow", "u1E48", - "Nmonospace", "uFF2E", - "Nowarmenian", "u0546", - "Ntilde", "u00D1", - "Nu", "u039D", - "O", "u004F", - "OE", "u0152", - "Oacute", "u00D3", - "Obarredcyrillic", "u04E8", - "Obarreddieresiscyrillic", "u04EA", - "Obreve", "u014E", - "Ocaron", "u01D1", - "Ocenteredtilde", "u019F", - "Ocircle", "u24C4", - "Ocircumflex", "u00D4", - "Ocircumflexacute", "u1ED0", - "Ocircumflexdotbelow", "u1ED8", - "Ocircumflexgrave", "u1ED2", - "Ocircumflexhookabove", "u1ED4", - "Ocircumflextilde", "u1ED6", - "Ocyrillic", "u041E", - "Odblacute", "u0150", - "Odblgrave", "u020C", - "Odieresis", "u00D6", - "Odieresiscyrillic", "u04E6", - "Odotbelow", "u1ECC", - "Ograve", "u00D2", - "Oharmenian", "u0555", - "Ohm", "u2126", - "Ohookabove", "u1ECE", - "Ohorn", "u01A0", - "Ohornacute", "u1EDA", - "Ohorndotbelow", "u1EE2", - "Ohorngrave", "u1EDC", - "Ohornhookabove", "u1EDE", - "Ohorntilde", "u1EE0", - "Ohungarumlaut", "u0150", - "Oi", "u01A2", - "Oinvertedbreve", "u020E", - "Omacron", "u014C", - "Omacronacute", "u1E52", - "Omacrongrave", "u1E50", - "Omega", "u2126", - "Omegacyrillic", "u0460", - "Omegagreek", "u03A9", - "Omegaroundcyrillic", "u047A", - "Omegatitlocyrillic", "u047C", - "Omegatonos", "u038F", - "Omicron", "u039F", - "Omicrontonos", "u038C", - "Omonospace", "uFF2F", - "Oneroman", "u2160", - "Oogonek", "u01EA", - "Oogonekmacron", "u01EC", - "Oopen", "u0186", - "Oslash", "u00D8", - "Oslashacute", "u01FE", - "Ostrokeacute", "u01FE", - "Otcyrillic", "u047E", - "Otilde", "u00D5", - "Otildeacute", "u1E4C", - "Otildedieresis", "u1E4E", - "P", "u0050", - "Pacute", "u1E54", - "Pcircle", "u24C5", - "Pdotaccent", "u1E56", - "Pecyrillic", "u041F", - "Peharmenian", "u054A", - "Pemiddlehookcyrillic", "u04A6", - "Phi", "u03A6", - "Phook", "u01A4", - "Pi", "u03A0", - "Piwrarmenian", "u0553", - "Pmonospace", "uFF30", - "Psi", "u03A8", - "Psicyrillic", "u0470", - "Q", "u0051", - "Qcircle", "u24C6", - "Qmonospace", "uFF31", - "R", "u0052", - "Raarmenian", "u054C", - "Racute", "u0154", - "Rcaron", "u0158", - "Rcedilla", "u0156", - "Rcircle", "u24C7", - "Rcommaaccent", "u0156", - "Rdblgrave", "u0210", - "Rdotaccent", "u1E58", - "Rdotbelow", "u1E5A", - "Rdotbelowmacron", "u1E5C", - "Reharmenian", "u0550", - "Rfraktur", "u211C", - "Rho", "u03A1", - "Rinvertedbreve", "u0212", - "Rlinebelow", "u1E5E", - "Rmonospace", "uFF32", - "Rsmallinverted", "u0281", - "Rsmallinvertedsuperior", "u02B6", - "S", "u0053", - "SF010000", "u250C", - "SF020000", "u2514", - "SF030000", "u2510", - "SF040000", "u2518", - "SF050000", "u253C", - "SF060000", "u252C", - "SF070000", "u2534", - "SF080000", "u251C", - "SF090000", "u2524", - "SF100000", "u2500", - "SF110000", "u2502", - "SF190000", "u2561", - "SF200000", "u2562", - "SF210000", "u2556", - "SF220000", "u2555", - "SF230000", "u2563", - "SF240000", "u2551", - "SF250000", "u2557", - "SF260000", "u255D", - "SF270000", "u255C", - "SF280000", "u255B", - "SF360000", "u255E", - "SF370000", "u255F", - "SF380000", "u255A", - "SF390000", "u2554", - "SF400000", "u2569", - "SF410000", "u2566", - "SF420000", "u2560", - "SF430000", "u2550", - "SF440000", "u256C", - "SF450000", "u2567", - "SF460000", "u2568", - "SF470000", "u2564", - "SF480000", "u2565", - "SF490000", "u2559", - "SF500000", "u2558", - "SF510000", "u2552", - "SF520000", "u2553", - "SF530000", "u256B", - "SF540000", "u256A", - "Sacute", "u015A", - "Sacutedotaccent", "u1E64", - "Sampigreek", "u03E0", - "Scaron", "u0160", - "Scarondotaccent", "u1E66", - "Scedilla", "u015E", - "Schwa", "u018F", - "Schwacyrillic", "u04D8", - "Schwadieresiscyrillic", "u04DA", - "Scircle", "u24C8", - "Scircumflex", "u015C", - "Scommaaccent", "u0218", - "Sdotaccent", "u1E60", - "Sdotbelow", "u1E62", - "Sdotbelowdotaccent", "u1E68", - "Seharmenian", "u054D", - "Sevenroman", "u2166", - "Shaarmenian", "u0547", - "Shacyrillic", "u0428", - "Shchacyrillic", "u0429", - "Sheicoptic", "u03E2", - "Shhacyrillic", "u04BA", - "Shimacoptic", "u03EC", - "Sigma", "u03A3", - "Sixroman", "u2165", - "Smonospace", "uFF33", - "Softsigncyrillic", "u042C", - "Stigmagreek", "u03DA", - "T", "u0054", - "Tau", "u03A4", - "Tbar", "u0166", - "Tcaron", "u0164", - "Tcedilla", "u0162", - "Tcircle", "u24C9", - "Tcircumflexbelow", "u1E70", - "Tcommaaccent", "u0162", - "Tdotaccent", "u1E6A", - "Tdotbelow", "u1E6C", - "Tecyrillic", "u0422", - "Tedescendercyrillic", "u04AC", - "Tenroman", "u2169", - "Tetsecyrillic", "u04B4", - "Theta", "u0398", - "Thook", "u01AC", - "Thorn", "u00DE", - "Threeroman", "u2162", - "Tiwnarmenian", "u054F", - "Tlinebelow", "u1E6E", - "Tmonospace", "uFF34", - "Toarmenian", "u0539", - "Tonefive", "u01BC", - "Tonesix", "u0184", - "Tonetwo", "u01A7", - "Tretroflexhook", "u01AE", - "Tsecyrillic", "u0426", - "Tshecyrillic", "u040B", - "Twelveroman", "u216B", - "Tworoman", "u2161", - "U", "u0055", - "Uacute", "u00DA", - "Ubreve", "u016C", - "Ucaron", "u01D3", - "Ucircle", "u24CA", - "Ucircumflex", "u00DB", - "Ucircumflexbelow", "u1E76", - "Ucyrillic", "u0423", - "Udblacute", "u0170", - "Udblgrave", "u0214", - "Udieresis", "u00DC", - "Udieresisacute", "u01D7", - "Udieresisbelow", "u1E72", - "Udieresiscaron", "u01D9", - "Udieresiscyrillic", "u04F0", - "Udieresisgrave", "u01DB", - "Udieresismacron", "u01D5", - "Udotbelow", "u1EE4", - "Ugrave", "u00D9", - "Uhookabove", "u1EE6", - "Uhorn", "u01AF", - "Uhornacute", "u1EE8", - "Uhorndotbelow", "u1EF0", - "Uhorngrave", "u1EEA", - "Uhornhookabove", "u1EEC", - "Uhorntilde", "u1EEE", - "Uhungarumlaut", "u0170", - "Uhungarumlautcyrillic", "u04F2", - "Uinvertedbreve", "u0216", - "Ukcyrillic", "u0478", - "Umacron", "u016A", - "Umacroncyrillic", "u04EE", - "Umacrondieresis", "u1E7A", - "Umonospace", "uFF35", - "Uogonek", "u0172", - "Upsilon", "u03A5", - "Upsilon1", "u03D2", - "Upsilonacutehooksymbolgreek", "u03D3", - "Upsilonafrican", "u01B1", - "Upsilondieresis", "u03AB", - "Upsilondieresishooksymbolgreek", "u03D4", - "Upsilonhooksymbol", "u03D2", - "Upsilontonos", "u038E", - "Uring", "u016E", - "Ushortcyrillic", "u040E", - "Ustraightcyrillic", "u04AE", - "Ustraightstrokecyrillic", "u04B0", - "Utilde", "u0168", - "Utildeacute", "u1E78", - "Utildebelow", "u1E74", - "V", "u0056", - "Vcircle", "u24CB", - "Vdotbelow", "u1E7E", - "Vecyrillic", "u0412", - "Vewarmenian", "u054E", - "Vhook", "u01B2", - "Vmonospace", "uFF36", - "Voarmenian", "u0548", - "Vtilde", "u1E7C", - "W", "u0057", - "Wacute", "u1E82", - "Wcircle", "u24CC", - "Wcircumflex", "u0174", - "Wdieresis", "u1E84", - "Wdotaccent", "u1E86", - "Wdotbelow", "u1E88", - "Wgrave", "u1E80", - "Wmonospace", "uFF37", - "X", "u0058", - "Xcircle", "u24CD", - "Xdieresis", "u1E8C", - "Xdotaccent", "u1E8A", - "Xeharmenian", "u053D", - "Xi", "u039E", - "Xmonospace", "uFF38", - "Y", "u0059", - "Yacute", "u00DD", - "Yatcyrillic", "u0462", - "Ycircle", "u24CE", - "Ycircumflex", "u0176", - "Ydieresis", "u0178", - "Ydotaccent", "u1E8E", - "Ydotbelow", "u1EF4", - "Yericyrillic", "u042B", - "Yerudieresiscyrillic", "u04F8", - "Ygrave", "u1EF2", - "Yhook", "u01B3", - "Yhookabove", "u1EF6", - "Yiarmenian", "u0545", - "Yicyrillic", "u0407", - "Yiwnarmenian", "u0552", - "Ymonospace", "uFF39", - "Ytilde", "u1EF8", - "Yusbigcyrillic", "u046A", - "Yusbigiotifiedcyrillic", "u046C", - "Yuslittlecyrillic", "u0466", - "Yuslittleiotifiedcyrillic", "u0468", - "Z", "u005A", - "Zaarmenian", "u0536", - "Zacute", "u0179", - "Zcaron", "u017D", - "Zcircle", "u24CF", - "Zcircumflex", "u1E90", - "Zdot", "u017B", - "Zdotaccent", "u017B", - "Zdotbelow", "u1E92", - "Zecyrillic", "u0417", - "Zedescendercyrillic", "u0498", - "Zedieresiscyrillic", "u04DE", - "Zeta", "u0396", - "Zhearmenian", "u053A", - "Zhebrevecyrillic", "u04C1", - "Zhecyrillic", "u0416", - "Zhedescendercyrillic", "u0496", - "Zhedieresiscyrillic", "u04DC", - "Zlinebelow", "u1E94", - "Zmonospace", "uFF3A", - "Zstroke", "u01B5", - "a", "u0061", - "aabengali", "u0986", - "aacute", "u00E1", - "aadeva", "u0906", - "aagujarati", "u0A86", - "aagurmukhi", "u0A06", - "aamatragurmukhi", "u0A3E", - "aarusquare", "u3303", - "aavowelsignbengali", "u09BE", - "aavowelsigndeva", "u093E", - "aavowelsigngujarati", "u0ABE", - "abbreviationmarkarmenian", "u055F", - "abbreviationsigndeva", "u0970", - "abengali", "u0985", - "abopomofo", "u311A", - "abreve", "u0103", - "abreveacute", "u1EAF", - "abrevecyrillic", "u04D1", - "abrevedotbelow", "u1EB7", - "abrevegrave", "u1EB1", - "abrevehookabove", "u1EB3", - "abrevetilde", "u1EB5", - "acaron", "u01CE", - "acircle", "u24D0", - "acircumflex", "u00E2", - "acircumflexacute", "u1EA5", - "acircumflexdotbelow", "u1EAD", - "acircumflexgrave", "u1EA7", - "acircumflexhookabove", "u1EA9", - "acircumflextilde", "u1EAB", - "acute", "u00B4", - "acutebelowcmb", "u0317", - "acutecmb", "u0301", - "acutecomb", "u0301", - "acutedeva", "u0954", - "acutelowmod", "u02CF", - "acutetonecmb", "u0341", - "acyrillic", "u0430", - "adblgrave", "u0201", - "addakgurmukhi", "u0A71", - "adeva", "u0905", - "adieresis", "u00E4", - "adieresiscyrillic", "u04D3", - "adieresismacron", "u01DF", - "adotbelow", "u1EA1", - "adotmacron", "u01E1", - "ae", "u00E6", - "aeacute", "u01FD", - "aekorean", "u3150", - "aemacron", "u01E3", - "afii00208", "u2015", - "afii08941", "u20A4", - "afii10017", "u0410", - "afii10018", "u0411", - "afii10019", "u0412", - "afii10020", "u0413", - "afii10021", "u0414", - "afii10022", "u0415", - "afii10023", "u0401", - "afii10024", "u0416", - "afii10025", "u0417", - "afii10026", "u0418", - "afii10027", "u0419", - "afii10028", "u041A", - "afii10029", "u041B", - "afii10030", "u041C", - "afii10031", "u041D", - "afii10032", "u041E", - "afii10033", "u041F", - "afii10034", "u0420", - "afii10035", "u0421", - "afii10036", "u0422", - "afii10037", "u0423", - "afii10038", "u0424", - "afii10039", "u0425", - "afii10040", "u0426", - "afii10041", "u0427", - "afii10042", "u0428", - "afii10043", "u0429", - "afii10044", "u042A", - "afii10045", "u042B", - "afii10046", "u042C", - "afii10047", "u042D", - "afii10048", "u042E", - "afii10049", "u042F", - "afii10050", "u0490", - "afii10051", "u0402", - "afii10052", "u0403", - "afii10053", "u0404", - "afii10054", "u0405", - "afii10055", "u0406", - "afii10056", "u0407", - "afii10057", "u0408", - "afii10058", "u0409", - "afii10059", "u040A", - "afii10060", "u040B", - "afii10061", "u040C", - "afii10062", "u040E", - "afii10065", "u0430", - "afii10066", "u0431", - "afii10067", "u0432", - "afii10068", "u0433", - "afii10069", "u0434", - "afii10070", "u0435", - "afii10071", "u0451", - "afii10072", "u0436", - "afii10073", "u0437", - "afii10074", "u0438", - "afii10075", "u0439", - "afii10076", "u043A", - "afii10077", "u043B", - "afii10078", "u043C", - "afii10079", "u043D", - "afii10080", "u043E", - "afii10081", "u043F", - "afii10082", "u0440", - "afii10083", "u0441", - "afii10084", "u0442", - "afii10085", "u0443", - "afii10086", "u0444", - "afii10087", "u0445", - "afii10088", "u0446", - "afii10089", "u0447", - "afii10090", "u0448", - "afii10091", "u0449", - "afii10092", "u044A", - "afii10093", "u044B", - "afii10094", "u044C", - "afii10095", "u044D", - "afii10096", "u044E", - "afii10097", "u044F", - "afii10098", "u0491", - "afii10099", "u0452", - "afii10100", "u0453", - "afii10101", "u0454", - "afii10102", "u0455", - "afii10103", "u0456", - "afii10104", "u0457", - "afii10105", "u0458", - "afii10106", "u0459", - "afii10107", "u045A", - "afii10108", "u045B", - "afii10109", "u045C", - "afii10110", "u045E", - "afii10145", "u040F", - "afii10146", "u0462", - "afii10147", "u0472", - "afii10148", "u0474", - "afii10193", "u045F", - "afii10194", "u0463", - "afii10195", "u0473", - "afii10196", "u0475", - "afii10846", "u04D9", - "afii299", "u200E", - "afii300", "u200F", - "afii301", "u200D", - "afii57381", "u066A", - "afii57388", "u060C", - "afii57392", "u0660", - "afii57393", "u0661", - "afii57394", "u0662", - "afii57395", "u0663", - "afii57396", "u0664", - "afii57397", "u0665", - "afii57398", "u0666", - "afii57399", "u0667", - "afii57400", "u0668", - "afii57401", "u0669", - "afii57403", "u061B", - "afii57407", "u061F", - "afii57409", "u0621", - "afii57410", "u0622", - "afii57411", "u0623", - "afii57412", "u0624", - "afii57413", "u0625", - "afii57414", "u0626", - "afii57415", "u0627", - "afii57416", "u0628", - "afii57417", "u0629", - "afii57418", "u062A", - "afii57419", "u062B", - "afii57420", "u062C", - "afii57421", "u062D", - "afii57422", "u062E", - "afii57423", "u062F", - "afii57424", "u0630", - "afii57425", "u0631", - "afii57426", "u0632", - "afii57427", "u0633", - "afii57428", "u0634", - "afii57429", "u0635", - "afii57430", "u0636", - "afii57431", "u0637", - "afii57432", "u0638", - "afii57433", "u0639", - "afii57434", "u063A", - "afii57440", "u0640", - "afii57441", "u0641", - "afii57442", "u0642", - "afii57443", "u0643", - "afii57444", "u0644", - "afii57445", "u0645", - "afii57446", "u0646", - "afii57448", "u0648", - "afii57449", "u0649", - "afii57450", "u064A", - "afii57451", "u064B", - "afii57452", "u064C", - "afii57453", "u064D", - "afii57454", "u064E", - "afii57455", "u064F", - "afii57456", "u0650", - "afii57457", "u0651", - "afii57458", "u0652", - "afii57470", "u0647", - "afii57505", "u06A4", - "afii57506", "u067E", - "afii57507", "u0686", - "afii57508", "u0698", - "afii57509", "u06AF", - "afii57511", "u0679", - "afii57512", "u0688", - "afii57513", "u0691", - "afii57514", "u06BA", - "afii57519", "u06D2", - "afii57534", "u06D5", - "afii57636", "u20AA", - "afii57645", "u05BE", - "afii57658", "u05C3", - "afii57664", "u05D0", - "afii57665", "u05D1", - "afii57666", "u05D2", - "afii57667", "u05D3", - "afii57668", "u05D4", - "afii57669", "u05D5", - "afii57670", "u05D6", - "afii57671", "u05D7", - "afii57672", "u05D8", - "afii57673", "u05D9", - "afii57674", "u05DA", - "afii57675", "u05DB", - "afii57676", "u05DC", - "afii57677", "u05DD", - "afii57678", "u05DE", - "afii57679", "u05DF", - "afii57680", "u05E0", - "afii57681", "u05E1", - "afii57682", "u05E2", - "afii57683", "u05E3", - "afii57684", "u05E4", - "afii57685", "u05E5", - "afii57686", "u05E6", - "afii57687", "u05E7", - "afii57688", "u05E8", - "afii57689", "u05E9", - "afii57690", "u05EA", - "afii57694", "uFB2A", - "afii57695", "uFB2B", - "afii57700", "uFB4B", - "afii57705", "uFB1F", - "afii57716", "u05F0", - "afii57717", "u05F1", - "afii57718", "u05F2", - "afii57723", "uFB35", - "afii57793", "u05B4", - "afii57794", "u05B5", - "afii57795", "u05B6", - "afii57796", "u05BB", - "afii57797", "u05B8", - "afii57798", "u05B7", - "afii57799", "u05B0", - "afii57800", "u05B2", - "afii57801", "u05B1", - "afii57802", "u05B3", - "afii57803", "u05C2", - "afii57804", "u05C1", - "afii57806", "u05B9", - "afii57807", "u05BC", - "afii57839", "u05BD", - "afii57841", "u05BF", - "afii57842", "u05C0", - "afii57929", "u02BC", - "afii61248", "u2105", - "afii61289", "u2113", - "afii61352", "u2116", - "afii61573", "u202C", - "afii61574", "u202D", - "afii61575", "u202E", - "afii61664", "u200C", - "afii63167", "u066D", - "afii64937", "u02BD", - "agrave", "u00E0", - "agujarati", "u0A85", - "agurmukhi", "u0A05", - "ahiragana", "u3042", - "ahookabove", "u1EA3", - "aibengali", "u0990", - "aibopomofo", "u311E", - "aideva", "u0910", - "aiecyrillic", "u04D5", - "aigujarati", "u0A90", - "aigurmukhi", "u0A10", - "aimatragurmukhi", "u0A48", - "ainarabic", "u0639", - "ainfinalarabic", "uFECA", - "aininitialarabic", "uFECB", - "ainmedialarabic", "uFECC", - "ainvertedbreve", "u0203", - "aivowelsignbengali", "u09C8", - "aivowelsigndeva", "u0948", - "aivowelsigngujarati", "u0AC8", - "akatakana", "u30A2", - "akatakanahalfwidth", "uFF71", - "akorean", "u314F", - "alef", "u05D0", - "alefarabic", "u0627", - "alefdageshhebrew", "uFB30", - "aleffinalarabic", "uFE8E", - "alefhamzaabovearabic", "u0623", - "alefhamzaabovefinalarabic", "uFE84", - "alefhamzabelowarabic", "u0625", - "alefhamzabelowfinalarabic", "uFE88", - "alefhebrew", "u05D0", - "aleflamedhebrew", "uFB4F", - "alefmaddaabovearabic", "u0622", - "alefmaddaabovefinalarabic", "uFE82", - "alefmaksuraarabic", "u0649", - "alefmaksurafinalarabic", "uFEF0", - "alefmaksurainitialarabic", "uFEF3", - "alefmaksuramedialarabic", "uFEF4", - "alefpatahhebrew", "uFB2E", - "alefqamatshebrew", "uFB2F", - "aleph", "u2135", - "allequal", "u224C", - "alpha", "u03B1", - "alphatonos", "u03AC", - "amacron", "u0101", - "amonospace", "uFF41", - "ampersand", "u0026", - "ampersandmonospace", "uFF06", - "amsquare", "u33C2", - "anbopomofo", "u3122", - "angbopomofo", "u3124", - "angkhankhuthai", "u0E5A", - "angle", "u2220", - "anglebracketleft", "u3008", - "anglebracketleftvertical", "uFE3F", - "anglebracketright", "u3009", - "anglebracketrightvertical", "uFE40", - "angleleft", "u2329", - "angleright", "u232A", - "angstrom", "u212B", - "anoteleia", "u0387", - "anudattadeva", "u0952", - "anusvarabengali", "u0982", - "anusvaradeva", "u0902", - "anusvaragujarati", "u0A82", - "aogonek", "u0105", - "apaatosquare", "u3300", - "aparen", "u249C", - "apostrophearmenian", "u055A", - "apostrophemod", "u02BC", - "approaches", "u2250", - "approxequal", "u2248", - "approxequalorimage", "u2252", - "approximatelyequal", "u2245", - "araeaekorean", "u318E", - "araeakorean", "u318D", - "arc", "u2312", - "arighthalfring", "u1E9A", - "aring", "u00E5", - "aringacute", "u01FB", - "aringbelow", "u1E01", - "arrowboth", "u2194", - "arrowdashdown", "u21E3", - "arrowdashleft", "u21E0", - "arrowdashright", "u21E2", - "arrowdashup", "u21E1", - "arrowdblboth", "u21D4", - "arrowdbldown", "u21D3", - "arrowdblleft", "u21D0", - "arrowdblright", "u21D2", - "arrowdblup", "u21D1", - "arrowdown", "u2193", - "arrowdownleft", "u2199", - "arrowdownright", "u2198", - "arrowdownwhite", "u21E9", - "arrowheaddownmod", "u02C5", - "arrowheadleftmod", "u02C2", - "arrowheadrightmod", "u02C3", - "arrowheadupmod", "u02C4", - "arrowleft", "u2190", - "arrowleftdbl", "u21D0", - "arrowleftdblstroke", "u21CD", - "arrowleftoverright", "u21C6", - "arrowleftwhite", "u21E6", - "arrowright", "u2192", - "arrowrightdblstroke", "u21CF", - "arrowrightheavy", "u279E", - "arrowrightoverleft", "u21C4", - "arrowrightwhite", "u21E8", - "arrowtableft", "u21E4", - "arrowtabright", "u21E5", - "arrowup", "u2191", - "arrowupdn", "u2195", - "arrowupdnbse", "u21A8", - "arrowupdownbase", "u21A8", - "arrowupleft", "u2196", - "arrowupleftofdown", "u21C5", - "arrowupright", "u2197", - "arrowupwhite", "u21E7", - "asciicircum", "u005E", - "asciicircummonospace", "uFF3E", - "asciitilde", "u007E", - "asciitildemonospace", "uFF5E", - "ascript", "u0251", - "ascriptturned", "u0252", - "asmallhiragana", "u3041", - "asmallkatakana", "u30A1", - "asmallkatakanahalfwidth", "uFF67", - "asterisk", "u002A", - "asteriskaltonearabic", "u066D", - "asteriskarabic", "u066D", - "asteriskmath", "u2217", - "asteriskmonospace", "uFF0A", - "asterisksmall", "uFE61", - "asterism", "u2042", - "asymptoticallyequal", "u2243", - "at", "u0040", - "atilde", "u00E3", - "atmonospace", "uFF20", - "atsmall", "uFE6B", - "aturned", "u0250", - "aubengali", "u0994", - "aubopomofo", "u3120", - "audeva", "u0914", - "augujarati", "u0A94", - "augurmukhi", "u0A14", - "aulengthmarkbengali", "u09D7", - "aumatragurmukhi", "u0A4C", - "auvowelsignbengali", "u09CC", - "auvowelsigndeva", "u094C", - "auvowelsigngujarati", "u0ACC", - "avagrahadeva", "u093D", - "aybarmenian", "u0561", - "ayin", "u05E2", - "ayinaltonehebrew", "uFB20", - "ayinhebrew", "u05E2", - "b", "u0062", - "babengali", "u09AC", - "backslash", "u005C", - "backslashmonospace", "uFF3C", - "badeva", "u092C", - "bagujarati", "u0AAC", - "bagurmukhi", "u0A2C", - "bahiragana", "u3070", - "bahtthai", "u0E3F", - "bakatakana", "u30D0", - "bar", "u007C", - "barmonospace", "uFF5C", - "bbopomofo", "u3105", - "bcircle", "u24D1", - "bdotaccent", "u1E03", - "bdotbelow", "u1E05", - "beamedsixteenthnotes", "u266C", - "because", "u2235", - "becyrillic", "u0431", - "beharabic", "u0628", - "behfinalarabic", "uFE90", - "behinitialarabic", "uFE91", - "behiragana", "u3079", - "behmedialarabic", "uFE92", - "behmeeminitialarabic", "uFC9F", - "behmeemisolatedarabic", "uFC08", - "behnoonfinalarabic", "uFC6D", - "bekatakana", "u30D9", - "benarmenian", "u0562", - "bet", "u05D1", - "beta", "u03B2", - "betasymbolgreek", "u03D0", - "betdagesh", "uFB31", - "betdageshhebrew", "uFB31", - "bethebrew", "u05D1", - "betrafehebrew", "uFB4C", - "bhabengali", "u09AD", - "bhadeva", "u092D", - "bhagujarati", "u0AAD", - "bhagurmukhi", "u0A2D", - "bhook", "u0253", - "bihiragana", "u3073", - "bikatakana", "u30D3", - "bilabialclick", "u0298", - "bindigurmukhi", "u0A02", - "birusquare", "u3331", - "blackcircle", "u25CF", - "blackdiamond", "u25C6", - "blackdownpointingtriangle", "u25BC", - "blackleftpointingpointer", "u25C4", - "blackleftpointingtriangle", "u25C0", - "blacklenticularbracketleft", "u3010", - "blacklenticularbracketleftvertical", "uFE3B", - "blacklenticularbracketright", "u3011", - "blacklenticularbracketrightvertical", "uFE3C", - "blacklowerlefttriangle", "u25E3", - "blacklowerrighttriangle", "u25E2", - "blackrectangle", "u25AC", - "blackrightpointingpointer", "u25BA", - "blackrightpointingtriangle", "u25B6", - "blacksmallsquare", "u25AA", - "blacksmilingface", "u263B", - "blacksquare", "u25A0", - "blackstar", "u2605", - "blackupperlefttriangle", "u25E4", - "blackupperrighttriangle", "u25E5", - "blackuppointingsmalltriangle", "u25B4", - "blackuppointingtriangle", "u25B2", - "blank", "u2423", - "blinebelow", "u1E07", - "block", "u2588", - "bmonospace", "uFF42", - "bobaimaithai", "u0E1A", - "bohiragana", "u307C", - "bokatakana", "u30DC", - "bparen", "u249D", - "bqsquare", "u33C3", - "braceleft", "u007B", - "braceleftmonospace", "uFF5B", - "braceleftsmall", "uFE5B", - "braceleftvertical", "uFE37", - "braceright", "u007D", - "bracerightmonospace", "uFF5D", - "bracerightsmall", "uFE5C", - "bracerightvertical", "uFE38", - "bracketleft", "u005B", - "bracketleftmonospace", "uFF3B", - "bracketright", "u005D", - "bracketrightmonospace", "uFF3D", - "breve", "u02D8", - "brevebelowcmb", "u032E", - "brevecmb", "u0306", - "breveinvertedbelowcmb", "u032F", - "breveinvertedcmb", "u0311", - "breveinverteddoublecmb", "u0361", - "bridgebelowcmb", "u032A", - "bridgeinvertedbelowcmb", "u033A", - "brokenbar", "u00A6", - "bstroke", "u0180", - "btopbar", "u0183", - "buhiragana", "u3076", - "bukatakana", "u30D6", - "bullet", "u2022", - "bulletinverse", "u25D8", - "bulletoperator", "u2219", - "bullseye", "u25CE", - "c", "u0063", - "caarmenian", "u056E", - "cabengali", "u099A", - "cacute", "u0107", - "cadeva", "u091A", - "cagujarati", "u0A9A", - "cagurmukhi", "u0A1A", - "calsquare", "u3388", - "candrabindubengali", "u0981", - "candrabinducmb", "u0310", - "candrabindudeva", "u0901", - "candrabindugujarati", "u0A81", - "capslock", "u21EA", - "careof", "u2105", - "caron", "u02C7", - "caronbelowcmb", "u032C", - "caroncmb", "u030C", - "carriagereturn", "u21B5", - "cbopomofo", "u3118", - "ccaron", "u010D", - "ccedilla", "u00E7", - "ccedillaacute", "u1E09", - "ccircle", "u24D2", - "ccircumflex", "u0109", - "ccurl", "u0255", - "cdot", "u010B", - "cdotaccent", "u010B", - "cdsquare", "u33C5", - "cedilla", "u00B8", - "cedillacmb", "u0327", - "cent", "u00A2", - "centigrade", "u2103", - "centmonospace", "uFFE0", - "chaarmenian", "u0579", - "chabengali", "u099B", - "chadeva", "u091B", - "chagujarati", "u0A9B", - "chagurmukhi", "u0A1B", - "chbopomofo", "u3114", - "cheabkhasiancyrillic", "u04BD", - "checkmark", "u2713", - "checyrillic", "u0447", - "chedescenderabkhasiancyrillic", "u04BF", - "chedescendercyrillic", "u04B7", - "chedieresiscyrillic", "u04F5", - "cheharmenian", "u0573", - "chekhakassiancyrillic", "u04CC", - "cheverticalstrokecyrillic", "u04B9", - "chi", "u03C7", - "chieuchacirclekorean", "u3277", - "chieuchaparenkorean", "u3217", - "chieuchcirclekorean", "u3269", - "chieuchkorean", "u314A", - "chieuchparenkorean", "u3209", - "chochangthai", "u0E0A", - "chochanthai", "u0E08", - "chochingthai", "u0E09", - "chochoethai", "u0E0C", - "chook", "u0188", - "cieucacirclekorean", "u3276", - "cieucaparenkorean", "u3216", - "cieuccirclekorean", "u3268", - "cieuckorean", "u3148", - "cieucparenkorean", "u3208", - "cieucuparenkorean", "u321C", - "circle", "u25CB", - "circlemultiply", "u2297", - "circleot", "u2299", - "circleplus", "u2295", - "circlepostalmark", "u3036", - "circlewithlefthalfblack", "u25D0", - "circlewithrighthalfblack", "u25D1", - "circumflex", "u02C6", - "circumflexbelowcmb", "u032D", - "circumflexcmb", "u0302", - "clear", "u2327", - "clickalveolar", "u01C2", - "clickdental", "u01C0", - "clicklateral", "u01C1", - "clickretroflex", "u01C3", - "club", "u2663", - "clubsuitblack", "u2663", - "clubsuitwhite", "u2667", - "cmcubedsquare", "u33A4", - "cmonospace", "uFF43", - "cmsquaredsquare", "u33A0", - "coarmenian", "u0581", - "colon", "u003A", - "colonmonetary", "u20A1", - "colonmonospace", "uFF1A", - "colonsign", "u20A1", - "colonsmall", "uFE55", - "colontriangularhalfmod", "u02D1", - "colontriangularmod", "u02D0", - "comma", "u002C", - "commaabovecmb", "u0313", - "commaaboverightcmb", "u0315", - "commaarabic", "u060C", - "commaarmenian", "u055D", - "commamonospace", "uFF0C", - "commareversedabovecmb", "u0314", - "commareversedmod", "u02BD", - "commasmall", "uFE50", - "commaturnedabovecmb", "u0312", - "commaturnedmod", "u02BB", - "compass", "u263C", - "congruent", "u2245", - "contourintegral", "u222E", - "control", "u2303", - "controlACK", "u0006", - "controlBEL", "u0007", - "controlBS", "u0008", - "controlCAN", "u0018", - "controlCR", "u000D", - "controlDC1", "u0011", - "controlDC2", "u0012", - "controlDC3", "u0013", - "controlDC4", "u0014", - "controlDEL", "u007F", - "controlDLE", "u0010", - "controlEM", "u0019", - "controlENQ", "u0005", - "controlEOT", "u0004", - "controlESC", "u001B", - "controlETB", "u0017", - "controlETX", "u0003", - "controlFF", "u000C", - "controlFS", "u001C", - "controlGS", "u001D", - "controlHT", "u0009", - "controlLF", "u000A", - "controlNAK", "u0015", - "controlRS", "u001E", - "controlSI", "u000F", - "controlSO", "u000E", - "controlSOT", "u0002", - "controlSTX", "u0001", - "controlSUB", "u001A", - "controlSYN", "u0016", - "controlUS", "u001F", - "controlVT", "u000B", - "copyright", "u00A9", - "cornerbracketleft", "u300C", - "cornerbracketlefthalfwidth", "uFF62", - "cornerbracketleftvertical", "uFE41", - "cornerbracketright", "u300D", - "cornerbracketrighthalfwidth", "uFF63", - "cornerbracketrightvertical", "uFE42", - "corporationsquare", "u337F", - "cosquare", "u33C7", - "coverkgsquare", "u33C6", - "cparen", "u249E", - "cruzeiro", "u20A2", - "cstretched", "u0297", - "curlyand", "u22CF", - "curlyor", "u22CE", - "currency", "u00A4", - "d", "u0064", - "daarmenian", "u0564", - "dabengali", "u09A6", - "dadarabic", "u0636", - "dadeva", "u0926", - "dadfinalarabic", "uFEBE", - "dadinitialarabic", "uFEBF", - "dadmedialarabic", "uFEC0", - "dagesh", "u05BC", - "dageshhebrew", "u05BC", - "dagger", "u2020", - "daggerdbl", "u2021", - "dagujarati", "u0AA6", - "dagurmukhi", "u0A26", - "dahiragana", "u3060", - "dakatakana", "u30C0", - "dalarabic", "u062F", - "dalet", "u05D3", - "daletdagesh", "uFB33", - "daletdageshhebrew", "uFB33", - "dalethatafpatah", "u05D3_05B2", - "dalethatafpatahhebrew", "u05D3_05B2", - "dalethatafsegol", "u05D3_05B1", - "dalethatafsegolhebrew", "u05D3_05B1", - "dalethebrew", "u05D3", - "dalethiriq", "u05D3_05B4", - "dalethiriqhebrew", "u05D3_05B4", - "daletholam", "u05D3_05B9", - "daletholamhebrew", "u05D3_05B9", - "daletpatah", "u05D3_05B7", - "daletpatahhebrew", "u05D3_05B7", - "daletqamats", "u05D3_05B8", - "daletqamatshebrew", "u05D3_05B8", - "daletqubuts", "u05D3_05BB", - "daletqubutshebrew", "u05D3_05BB", - "daletsegol", "u05D3_05B6", - "daletsegolhebrew", "u05D3_05B6", - "daletsheva", "u05D3_05B0", - "daletshevahebrew", "u05D3_05B0", - "dalettsere", "u05D3_05B5", - "dalettserehebrew", "u05D3_05B5", - "dalfinalarabic", "uFEAA", - "dammaarabic", "u064F", - "dammalowarabic", "u064F", - "dammatanaltonearabic", "u064C", - "dammatanarabic", "u064C", - "danda", "u0964", - "dargahebrew", "u05A7", - "dargalefthebrew", "u05A7", - "dasiapneumatacyrilliccmb", "u0485", - "dblanglebracketleft", "u300A", - "dblanglebracketleftvertical", "uFE3D", - "dblanglebracketright", "u300B", - "dblanglebracketrightvertical", "uFE3E", - "dblarchinvertedbelowcmb", "u032B", - "dblarrowleft", "u21D4", - "dblarrowright", "u21D2", - "dbldanda", "u0965", - "dblgravecmb", "u030F", - "dblintegral", "u222C", - "dbllowline", "u2017", - "dbllowlinecmb", "u0333", - "dbloverlinecmb", "u033F", - "dblprimemod", "u02BA", - "dblverticalbar", "u2016", - "dblverticallineabovecmb", "u030E", - "dbopomofo", "u3109", - "dbsquare", "u33C8", - "dcaron", "u010F", - "dcedilla", "u1E11", - "dcircle", "u24D3", - "dcircumflexbelow", "u1E13", - "dcroat", "u0111", - "ddabengali", "u09A1", - "ddadeva", "u0921", - "ddagujarati", "u0AA1", - "ddagurmukhi", "u0A21", - "ddalarabic", "u0688", - "ddalfinalarabic", "uFB89", - "dddhadeva", "u095C", - "ddhabengali", "u09A2", - "ddhadeva", "u0922", - "ddhagujarati", "u0AA2", - "ddhagurmukhi", "u0A22", - "ddotaccent", "u1E0B", - "ddotbelow", "u1E0D", - "decimalseparatorarabic", "u066B", - "decimalseparatorpersian", "u066B", - "decyrillic", "u0434", - "degree", "u00B0", - "dehihebrew", "u05AD", - "dehiragana", "u3067", - "deicoptic", "u03EF", - "dekatakana", "u30C7", - "deleteleft", "u232B", - "deleteright", "u2326", - "delta", "u03B4", - "deltaturned", "u018D", - "denominatorminusonenumeratorbengali", "u09F8", - "dezh", "u02A4", - "dhabengali", "u09A7", - "dhadeva", "u0927", - "dhagujarati", "u0AA7", - "dhagurmukhi", "u0A27", - "dhook", "u0257", - "dialytikatonos", "u0385", - "dialytikatonoscmb", "u0344", - "diamond", "u2666", - "diamondsuitwhite", "u2662", - "dieresis", "u00A8", - "dieresisbelowcmb", "u0324", - "dieresiscmb", "u0308", - "dieresistonos", "u0385", - "dihiragana", "u3062", - "dikatakana", "u30C2", - "dittomark", "u3003", - "divide", "u00F7", - "divides", "u2223", - "divisionslash", "u2215", - "djecyrillic", "u0452", - "dkshade", "u2593", - "dlinebelow", "u1E0F", - "dlsquare", "u3397", - "dmacron", "u0111", - "dmonospace", "uFF44", - "dnblock", "u2584", - "dochadathai", "u0E0E", - "dodekthai", "u0E14", - "dohiragana", "u3069", - "dokatakana", "u30C9", - "dollar", "u0024", - "dollarmonospace", "uFF04", - "dollarsmall", "uFE69", - "dong", "u20AB", - "dorusquare", "u3326", - "dotaccent", "u02D9", - "dotaccentcmb", "u0307", - "dotbelowcmb", "u0323", - "dotbelowcomb", "u0323", - "dotkatakana", "u30FB", - "dotlessi", "u0131", - "dotlessjstrokehook", "u0284", - "dotmath", "u22C5", - "dottedcircle", "u25CC", - "doubleyodpatah", "uFB1F", - "doubleyodpatahhebrew", "uFB1F", - "downtackbelowcmb", "u031E", - "downtackmod", "u02D5", - "dparen", "u249F", - "dtail", "u0256", - "dtopbar", "u018C", - "duhiragana", "u3065", - "dukatakana", "u30C5", - "dz", "u01F3", - "dzaltone", "u02A3", - "dzcaron", "u01C6", - "dzcurl", "u02A5", - "dzeabkhasiancyrillic", "u04E1", - "dzecyrillic", "u0455", - "dzhecyrillic", "u045F", - "e", "u0065", - "eacute", "u00E9", - "earth", "u2641", - "ebengali", "u098F", - "ebopomofo", "u311C", - "ebreve", "u0115", - "ecandradeva", "u090D", - "ecandragujarati", "u0A8D", - "ecandravowelsigndeva", "u0945", - "ecandravowelsigngujarati", "u0AC5", - "ecaron", "u011B", - "ecedillabreve", "u1E1D", - "echarmenian", "u0565", - "echyiwnarmenian", "u0587", - "ecircle", "u24D4", - "ecircumflex", "u00EA", - "ecircumflexacute", "u1EBF", - "ecircumflexbelow", "u1E19", - "ecircumflexdotbelow", "u1EC7", - "ecircumflexgrave", "u1EC1", - "ecircumflexhookabove", "u1EC3", - "ecircumflextilde", "u1EC5", - "ecyrillic", "u0454", - "edblgrave", "u0205", - "edeva", "u090F", - "edieresis", "u00EB", - "edot", "u0117", - "edotaccent", "u0117", - "edotbelow", "u1EB9", - "eegurmukhi", "u0A0F", - "eematragurmukhi", "u0A47", - "efcyrillic", "u0444", - "egrave", "u00E8", - "egujarati", "u0A8F", - "eharmenian", "u0567", - "ehbopomofo", "u311D", - "ehiragana", "u3048", - "ehookabove", "u1EBB", - "eibopomofo", "u311F", - "eight", "u0038", - "eightarabic", "u0668", - "eightbengali", "u09EE", - "eightcircle", "u2467", - "eightcircleinversesansserif", "u2791", - "eightdeva", "u096E", - "eighteencircle", "u2471", - "eighteenparen", "u2485", - "eighteenperiod", "u2499", - "eightgujarati", "u0AEE", - "eightgurmukhi", "u0A6E", - "eighthackarabic", "u0668", - "eighthangzhou", "u3028", - "eighthnotebeamed", "u266B", - "eightideographicparen", "u3227", - "eightinferior", "u2088", - "eightmonospace", "uFF18", - "eightparen", "u247B", - "eightperiod", "u248F", - "eightpersian", "u06F8", - "eightroman", "u2177", - "eightsuperior", "u2078", - "eightthai", "u0E58", - "einvertedbreve", "u0207", - "eiotifiedcyrillic", "u0465", - "ekatakana", "u30A8", - "ekatakanahalfwidth", "uFF74", - "ekonkargurmukhi", "u0A74", - "ekorean", "u3154", - "elcyrillic", "u043B", - "element", "u2208", - "elevencircle", "u246A", - "elevenparen", "u247E", - "elevenperiod", "u2492", - "elevenroman", "u217A", - "ellipsis", "u2026", - "ellipsisvertical", "u22EE", - "emacron", "u0113", - "emacronacute", "u1E17", - "emacrongrave", "u1E15", - "emcyrillic", "u043C", - "emdash", "u2014", - "emdashvertical", "uFE31", - "emonospace", "uFF45", - "emphasismarkarmenian", "u055B", - "emptyset", "u2205", - "enbopomofo", "u3123", - "encyrillic", "u043D", - "endash", "u2013", - "endashvertical", "uFE32", - "endescendercyrillic", "u04A3", - "eng", "u014B", - "engbopomofo", "u3125", - "enghecyrillic", "u04A5", - "enhookcyrillic", "u04C8", - "enspace", "u2002", - "eogonek", "u0119", - "eokorean", "u3153", - "eopen", "u025B", - "eopenclosed", "u029A", - "eopenreversed", "u025C", - "eopenreversedclosed", "u025E", - "eopenreversedhook", "u025D", - "eparen", "u24A0", - "epsilon", "u03B5", - "epsilontonos", "u03AD", - "equal", "u003D", - "equalmonospace", "uFF1D", - "equalsmall", "uFE66", - "equalsuperior", "u207C", - "equivalence", "u2261", - "erbopomofo", "u3126", - "ercyrillic", "u0440", - "ereversed", "u0258", - "ereversedcyrillic", "u044D", - "escyrillic", "u0441", - "esdescendercyrillic", "u04AB", - "esh", "u0283", - "eshcurl", "u0286", - "eshortdeva", "u090E", - "eshortvowelsigndeva", "u0946", - "eshreversedloop", "u01AA", - "eshsquatreversed", "u0285", - "esmallhiragana", "u3047", - "esmallkatakana", "u30A7", - "esmallkatakanahalfwidth", "uFF6A", - "estimated", "u212E", - "eta", "u03B7", - "etarmenian", "u0568", - "etatonos", "u03AE", - "eth", "u00F0", - "etilde", "u1EBD", - "etildebelow", "u1E1B", - "etnahtafoukhhebrew", "u0591", - "etnahtafoukhlefthebrew", "u0591", - "etnahtahebrew", "u0591", - "etnahtalefthebrew", "u0591", - "eturned", "u01DD", - "eukorean", "u3161", - "euro", "u20AC", - "evowelsignbengali", "u09C7", - "evowelsigndeva", "u0947", - "evowelsigngujarati", "u0AC7", - "exclam", "u0021", - "exclamarmenian", "u055C", - "exclamdbl", "u203C", - "exclamdown", "u00A1", - "exclammonospace", "uFF01", - "existential", "u2203", - "ezh", "u0292", - "ezhcaron", "u01EF", - "ezhcurl", "u0293", - "ezhreversed", "u01B9", - "ezhtail", "u01BA", - "f", "u0066", - "fadeva", "u095E", - "fagurmukhi", "u0A5E", - "fahrenheit", "u2109", - "fathaarabic", "u064E", - "fathalowarabic", "u064E", - "fathatanarabic", "u064B", - "fbopomofo", "u3108", - "fcircle", "u24D5", - "fdotaccent", "u1E1F", - "feharabic", "u0641", - "feharmenian", "u0586", - "fehfinalarabic", "uFED2", - "fehinitialarabic", "uFED3", - "fehmedialarabic", "uFED4", - "feicoptic", "u03E5", - "female", "u2640", - "ff", "uFB00", - "ffi", "uFB03", - "ffl", "uFB04", - "fi", "uFB01", - "fifteencircle", "u246E", - "fifteenparen", "u2482", - "fifteenperiod", "u2496", - "figuredash", "u2012", - "filledbox", "u25A0", - "filledrect", "u25AC", - "finalkaf", "u05DA", - "finalkafdagesh", "uFB3A", - "finalkafdageshhebrew", "uFB3A", - "finalkafhebrew", "u05DA", - "finalkafqamats", "u05DA_05B8", - "finalkafqamatshebrew", "u05DA_05B8", - "finalkafsheva", "u05DA_05B0", - "finalkafshevahebrew", "u05DA_05B0", - "finalmem", "u05DD", - "finalmemhebrew", "u05DD", - "finalnun", "u05DF", - "finalnunhebrew", "u05DF", - "finalpe", "u05E3", - "finalpehebrew", "u05E3", - "finaltsadi", "u05E5", - "finaltsadihebrew", "u05E5", - "firsttonechinese", "u02C9", - "fisheye", "u25C9", - "fitacyrillic", "u0473", - "five", "u0035", - "fivearabic", "u0665", - "fivebengali", "u09EB", - "fivecircle", "u2464", - "fivecircleinversesansserif", "u278E", - "fivedeva", "u096B", - "fiveeighths", "u215D", - "fivegujarati", "u0AEB", - "fivegurmukhi", "u0A6B", - "fivehackarabic", "u0665", - "fivehangzhou", "u3025", - "fiveideographicparen", "u3224", - "fiveinferior", "u2085", - "fivemonospace", "uFF15", - "fiveparen", "u2478", - "fiveperiod", "u248C", - "fivepersian", "u06F5", - "fiveroman", "u2174", - "fivesuperior", "u2075", - "fivethai", "u0E55", - "fl", "uFB02", - "florin", "u0192", - "fmonospace", "uFF46", - "fmsquare", "u3399", - "fofanthai", "u0E1F", - "fofathai", "u0E1D", - "fongmanthai", "u0E4F", - "forall", "u2200", - "four", "u0034", - "fourarabic", "u0664", - "fourbengali", "u09EA", - "fourcircle", "u2463", - "fourcircleinversesansserif", "u278D", - "fourdeva", "u096A", - "fourgujarati", "u0AEA", - "fourgurmukhi", "u0A6A", - "fourhackarabic", "u0664", - "fourhangzhou", "u3024", - "fourideographicparen", "u3223", - "fourinferior", "u2084", - "fourmonospace", "uFF14", - "fournumeratorbengali", "u09F7", - "fourparen", "u2477", - "fourperiod", "u248B", - "fourpersian", "u06F4", - "fourroman", "u2173", - "foursuperior", "u2074", - "fourteencircle", "u246D", - "fourteenparen", "u2481", - "fourteenperiod", "u2495", - "fourthai", "u0E54", - "fourthtonechinese", "u02CB", - "fparen", "u24A1", - "fraction", "u2044", - "franc", "u20A3", - "g", "u0067", - "gabengali", "u0997", - "gacute", "u01F5", - "gadeva", "u0917", - "gafarabic", "u06AF", - "gaffinalarabic", "uFB93", - "gafinitialarabic", "uFB94", - "gafmedialarabic", "uFB95", - "gagujarati", "u0A97", - "gagurmukhi", "u0A17", - "gahiragana", "u304C", - "gakatakana", "u30AC", - "gamma", "u03B3", - "gammalatinsmall", "u0263", - "gammasuperior", "u02E0", - "gangiacoptic", "u03EB", - "gbopomofo", "u310D", - "gbreve", "u011F", - "gcaron", "u01E7", - "gcedilla", "u0123", - "gcircle", "u24D6", - "gcircumflex", "u011D", - "gcommaaccent", "u0123", - "gdot", "u0121", - "gdotaccent", "u0121", - "gecyrillic", "u0433", - "gehiragana", "u3052", - "gekatakana", "u30B2", - "geometricallyequal", "u2251", - "gereshaccenthebrew", "u059C", - "gereshhebrew", "u05F3", - "gereshmuqdamhebrew", "u059D", - "germandbls", "u00DF", - "gershayimaccenthebrew", "u059E", - "gershayimhebrew", "u05F4", - "getamark", "u3013", - "ghabengali", "u0998", - "ghadarmenian", "u0572", - "ghadeva", "u0918", - "ghagujarati", "u0A98", - "ghagurmukhi", "u0A18", - "ghainarabic", "u063A", - "ghainfinalarabic", "uFECE", - "ghaininitialarabic", "uFECF", - "ghainmedialarabic", "uFED0", - "ghemiddlehookcyrillic", "u0495", - "ghestrokecyrillic", "u0493", - "gheupturncyrillic", "u0491", - "ghhadeva", "u095A", - "ghhagurmukhi", "u0A5A", - "ghook", "u0260", - "ghzsquare", "u3393", - "gihiragana", "u304E", - "gikatakana", "u30AE", - "gimarmenian", "u0563", - "gimel", "u05D2", - "gimeldagesh", "uFB32", - "gimeldageshhebrew", "uFB32", - "gimelhebrew", "u05D2", - "gjecyrillic", "u0453", - "glottalinvertedstroke", "u01BE", - "glottalstop", "u0294", - "glottalstopinverted", "u0296", - "glottalstopmod", "u02C0", - "glottalstopreversed", "u0295", - "glottalstopreversedmod", "u02C1", - "glottalstopreversedsuperior", "u02E4", - "glottalstopstroke", "u02A1", - "glottalstopstrokereversed", "u02A2", - "gmacron", "u1E21", - "gmonospace", "uFF47", - "gohiragana", "u3054", - "gokatakana", "u30B4", - "gparen", "u24A2", - "gpasquare", "u33AC", - "gradient", "u2207", - "grave", "u0060", - "gravebelowcmb", "u0316", - "gravecmb", "u0300", - "gravecomb", "u0300", - "gravedeva", "u0953", - "gravelowmod", "u02CE", - "gravemonospace", "uFF40", - "gravetonecmb", "u0340", - "greater", "u003E", - "greaterequal", "u2265", - "greaterequalorless", "u22DB", - "greatermonospace", "uFF1E", - "greaterorequivalent", "u2273", - "greaterorless", "u2277", - "greateroverequal", "u2267", - "greatersmall", "uFE65", - "gscript", "u0261", - "gstroke", "u01E5", - "guhiragana", "u3050", - "guillemotleft", "u00AB", - "guillemotright", "u00BB", - "guilsinglleft", "u2039", - "guilsinglright", "u203A", - "gukatakana", "u30B0", - "guramusquare", "u3318", - "gysquare", "u33C9", - "h", "u0068", - "haabkhasiancyrillic", "u04A9", - "haaltonearabic", "u06C1", - "habengali", "u09B9", - "hadescendercyrillic", "u04B3", - "hadeva", "u0939", - "hagujarati", "u0AB9", - "hagurmukhi", "u0A39", - "haharabic", "u062D", - "hahfinalarabic", "uFEA2", - "hahinitialarabic", "uFEA3", - "hahiragana", "u306F", - "hahmedialarabic", "uFEA4", - "haitusquare", "u332A", - "hakatakana", "u30CF", - "hakatakanahalfwidth", "uFF8A", - "halantgurmukhi", "u0A4D", - "hamzaarabic", "u0621", - "hamzadammaarabic", "u0621_064F", - "hamzadammatanarabic", "u0621_064C", - "hamzafathaarabic", "u0621_064E", - "hamzafathatanarabic", "u0621_064B", - "hamzalowarabic", "u0621", - "hamzalowkasraarabic", "u0621_0650", - "hamzalowkasratanarabic", "u0621_064D", - "hamzasukunarabic", "u0621_0652", - "hangulfiller", "u3164", - "hardsigncyrillic", "u044A", - "harpoonleftbarbup", "u21BC", - "harpoonrightbarbup", "u21C0", - "hasquare", "u33CA", - "hatafpatah", "u05B2", - "hatafpatah16", "u05B2", - "hatafpatah23", "u05B2", - "hatafpatah2f", "u05B2", - "hatafpatahhebrew", "u05B2", - "hatafpatahnarrowhebrew", "u05B2", - "hatafpatahquarterhebrew", "u05B2", - "hatafpatahwidehebrew", "u05B2", - "hatafqamats", "u05B3", - "hatafqamats1b", "u05B3", - "hatafqamats28", "u05B3", - "hatafqamats34", "u05B3", - "hatafqamatshebrew", "u05B3", - "hatafqamatsnarrowhebrew", "u05B3", - "hatafqamatsquarterhebrew", "u05B3", - "hatafqamatswidehebrew", "u05B3", - "hatafsegol", "u05B1", - "hatafsegol17", "u05B1", - "hatafsegol24", "u05B1", - "hatafsegol30", "u05B1", - "hatafsegolhebrew", "u05B1", - "hatafsegolnarrowhebrew", "u05B1", - "hatafsegolquarterhebrew", "u05B1", - "hatafsegolwidehebrew", "u05B1", - "hbar", "u0127", - "hbopomofo", "u310F", - "hbrevebelow", "u1E2B", - "hcedilla", "u1E29", - "hcircle", "u24D7", - "hcircumflex", "u0125", - "hdieresis", "u1E27", - "hdotaccent", "u1E23", - "hdotbelow", "u1E25", - "he", "u05D4", - "heart", "u2665", - "heartsuitblack", "u2665", - "heartsuitwhite", "u2661", - "hedagesh", "uFB34", - "hedageshhebrew", "uFB34", - "hehaltonearabic", "u06C1", - "heharabic", "u0647", - "hehebrew", "u05D4", - "hehfinalaltonearabic", "uFBA7", - "hehfinalalttwoarabic", "uFEEA", - "hehfinalarabic", "uFEEA", - "hehhamzaabovefinalarabic", "uFBA5", - "hehhamzaaboveisolatedarabic", "uFBA4", - "hehinitialaltonearabic", "uFBA8", - "hehinitialarabic", "uFEEB", - "hehiragana", "u3078", - "hehmedialaltonearabic", "uFBA9", - "hehmedialarabic", "uFEEC", - "heiseierasquare", "u337B", - "hekatakana", "u30D8", - "hekatakanahalfwidth", "uFF8D", - "hekutaarusquare", "u3336", - "henghook", "u0267", - "herutusquare", "u3339", - "het", "u05D7", - "hethebrew", "u05D7", - "hhook", "u0266", - "hhooksuperior", "u02B1", - "hieuhacirclekorean", "u327B", - "hieuhaparenkorean", "u321B", - "hieuhcirclekorean", "u326D", - "hieuhkorean", "u314E", - "hieuhparenkorean", "u320D", - "hihiragana", "u3072", - "hikatakana", "u30D2", - "hikatakanahalfwidth", "uFF8B", - "hiriq", "u05B4", - "hiriq14", "u05B4", - "hiriq21", "u05B4", - "hiriq2d", "u05B4", - "hiriqhebrew", "u05B4", - "hiriqnarrowhebrew", "u05B4", - "hiriqquarterhebrew", "u05B4", - "hiriqwidehebrew", "u05B4", - "hlinebelow", "u1E96", - "hmonospace", "uFF48", - "hoarmenian", "u0570", - "hohipthai", "u0E2B", - "hohiragana", "u307B", - "hokatakana", "u30DB", - "hokatakanahalfwidth", "uFF8E", - "holam", "u05B9", - "holam19", "u05B9", - "holam26", "u05B9", - "holam32", "u05B9", - "holamhebrew", "u05B9", - "holamnarrowhebrew", "u05B9", - "holamquarterhebrew", "u05B9", - "holamwidehebrew", "u05B9", - "honokhukthai", "u0E2E", - "hookabovecomb", "u0309", - "hookcmb", "u0309", - "hookpalatalizedbelowcmb", "u0321", - "hookretroflexbelowcmb", "u0322", - "hoonsquare", "u3342", - "horicoptic", "u03E9", - "horizontalbar", "u2015", - "horncmb", "u031B", - "hotsprings", "u2668", - "house", "u2302", - "hparen", "u24A3", - "hsuperior", "u02B0", - "hturned", "u0265", - "huhiragana", "u3075", - "huiitosquare", "u3333", - "hukatakana", "u30D5", - "hukatakanahalfwidth", "uFF8C", - "hungarumlaut", "u02DD", - "hungarumlautcmb", "u030B", - "hv", "u0195", - "hyphen", "u002D", - "hyphenmonospace", "uFF0D", - "hyphensmall", "uFE63", - "hyphentwo", "u2010", - "i", "u0069", - "iacute", "u00ED", - "iacyrillic", "u044F", - "ibengali", "u0987", - "ibopomofo", "u3127", - "ibreve", "u012D", - "icaron", "u01D0", - "icircle", "u24D8", - "icircumflex", "u00EE", - "icyrillic", "u0456", - "idblgrave", "u0209", - "ideographearthcircle", "u328F", - "ideographfirecircle", "u328B", - "ideographicallianceparen", "u323F", - "ideographiccallparen", "u323A", - "ideographiccentrecircle", "u32A5", - "ideographicclose", "u3006", - "ideographiccomma", "u3001", - "ideographiccommaleft", "uFF64", - "ideographiccongratulationparen", "u3237", - "ideographiccorrectcircle", "u32A3", - "ideographicearthparen", "u322F", - "ideographicenterpriseparen", "u323D", - "ideographicexcellentcircle", "u329D", - "ideographicfestivalparen", "u3240", - "ideographicfinancialcircle", "u3296", - "ideographicfinancialparen", "u3236", - "ideographicfireparen", "u322B", - "ideographichaveparen", "u3232", - "ideographichighcircle", "u32A4", - "ideographiciterationmark", "u3005", - "ideographiclaborcircle", "u3298", - "ideographiclaborparen", "u3238", - "ideographicleftcircle", "u32A7", - "ideographiclowcircle", "u32A6", - "ideographicmedicinecircle", "u32A9", - "ideographicmetalparen", "u322E", - "ideographicmoonparen", "u322A", - "ideographicnameparen", "u3234", - "ideographicperiod", "u3002", - "ideographicprintcircle", "u329E", - "ideographicreachparen", "u3243", - "ideographicrepresentparen", "u3239", - "ideographicresourceparen", "u323E", - "ideographicrightcircle", "u32A8", - "ideographicsecretcircle", "u3299", - "ideographicselfparen", "u3242", - "ideographicsocietyparen", "u3233", - "ideographicspace", "u3000", - "ideographicspecialparen", "u3235", - "ideographicstockparen", "u3231", - "ideographicstudyparen", "u323B", - "ideographicsunparen", "u3230", - "ideographicsuperviseparen", "u323C", - "ideographicwaterparen", "u322C", - "ideographicwoodparen", "u322D", - "ideographiczero", "u3007", - "ideographmetalcircle", "u328E", - "ideographmooncircle", "u328A", - "ideographnamecircle", "u3294", - "ideographsuncircle", "u3290", - "ideographwatercircle", "u328C", - "ideographwoodcircle", "u328D", - "ideva", "u0907", - "idieresis", "u00EF", - "idieresisacute", "u1E2F", - "idieresiscyrillic", "u04E5", - "idotbelow", "u1ECB", - "iebrevecyrillic", "u04D7", - "iecyrillic", "u0435", - "ieungacirclekorean", "u3275", - "ieungaparenkorean", "u3215", - "ieungcirclekorean", "u3267", - "ieungkorean", "u3147", - "ieungparenkorean", "u3207", - "igrave", "u00EC", - "igujarati", "u0A87", - "igurmukhi", "u0A07", - "ihiragana", "u3044", - "ihookabove", "u1EC9", - "iibengali", "u0988", - "iicyrillic", "u0438", - "iideva", "u0908", - "iigujarati", "u0A88", - "iigurmukhi", "u0A08", - "iimatragurmukhi", "u0A40", - "iinvertedbreve", "u020B", - "iishortcyrillic", "u0439", - "iivowelsignbengali", "u09C0", - "iivowelsigndeva", "u0940", - "iivowelsigngujarati", "u0AC0", - "ij", "u0133", - "ikatakana", "u30A4", - "ikatakanahalfwidth", "uFF72", - "ikorean", "u3163", - "ilde", "u02DC", - "iluyhebrew", "u05AC", - "imacron", "u012B", - "imacroncyrillic", "u04E3", - "imageorapproximatelyequal", "u2253", - "imatragurmukhi", "u0A3F", - "imonospace", "uFF49", - "increment", "u2206", - "infinity", "u221E", - "iniarmenian", "u056B", - "integral", "u222B", - "integralbottom", "u2321", - "integralbt", "u2321", - "integraltop", "u2320", - "integraltp", "u2320", - "intersection", "u2229", - "intisquare", "u3305", - "invbullet", "u25D8", - "invcircle", "u25D9", - "invsmileface", "u263B", - "iocyrillic", "u0451", - "iogonek", "u012F", - "iota", "u03B9", - "iotadieresis", "u03CA", - "iotadieresistonos", "u0390", - "iotalatin", "u0269", - "iotatonos", "u03AF", - "iparen", "u24A4", - "irigurmukhi", "u0A72", - "ismallhiragana", "u3043", - "ismallkatakana", "u30A3", - "ismallkatakanahalfwidth", "uFF68", - "issharbengali", "u09FA", - "istroke", "u0268", - "iterationhiragana", "u309D", - "iterationkatakana", "u30FD", - "itilde", "u0129", - "itildebelow", "u1E2D", - "iubopomofo", "u3129", - "iucyrillic", "u044E", - "ivowelsignbengali", "u09BF", - "ivowelsigndeva", "u093F", - "ivowelsigngujarati", "u0ABF", - "izhitsacyrillic", "u0475", - "izhitsadblgravecyrillic", "u0477", - "j", "u006A", - "jaarmenian", "u0571", - "jabengali", "u099C", - "jadeva", "u091C", - "jagujarati", "u0A9C", - "jagurmukhi", "u0A1C", - "jbopomofo", "u3110", - "jcaron", "u01F0", - "jcircle", "u24D9", - "jcircumflex", "u0135", - "jcrossedtail", "u029D", - "jdotlessstroke", "u025F", - "jecyrillic", "u0458", - "jeemarabic", "u062C", - "jeemfinalarabic", "uFE9E", - "jeeminitialarabic", "uFE9F", - "jeemmedialarabic", "uFEA0", - "jeharabic", "u0698", - "jehfinalarabic", "uFB8B", - "jhabengali", "u099D", - "jhadeva", "u091D", - "jhagujarati", "u0A9D", - "jhagurmukhi", "u0A1D", - "jheharmenian", "u057B", - "jis", "u3004", - "jmonospace", "uFF4A", - "jparen", "u24A5", - "jsuperior", "u02B2", - "k", "u006B", - "kabashkircyrillic", "u04A1", - "kabengali", "u0995", - "kacute", "u1E31", - "kacyrillic", "u043A", - "kadescendercyrillic", "u049B", - "kadeva", "u0915", - "kaf", "u05DB", - "kafarabic", "u0643", - "kafdagesh", "uFB3B", - "kafdageshhebrew", "uFB3B", - "kaffinalarabic", "uFEDA", - "kafhebrew", "u05DB", - "kafinitialarabic", "uFEDB", - "kafmedialarabic", "uFEDC", - "kafrafehebrew", "uFB4D", - "kagujarati", "u0A95", - "kagurmukhi", "u0A15", - "kahiragana", "u304B", - "kahookcyrillic", "u04C4", - "kakatakana", "u30AB", - "kakatakanahalfwidth", "uFF76", - "kappa", "u03BA", - "kappasymbolgreek", "u03F0", - "kapyeounmieumkorean", "u3171", - "kapyeounphieuphkorean", "u3184", - "kapyeounpieupkorean", "u3178", - "kapyeounssangpieupkorean", "u3179", - "karoriisquare", "u330D", - "kashidaautoarabic", "u0640", - "kashidaautonosidebearingarabic", "u0640", - "kasmallkatakana", "u30F5", - "kasquare", "u3384", - "kasraarabic", "u0650", - "kasratanarabic", "u064D", - "kastrokecyrillic", "u049F", - "katahiraprolongmarkhalfwidth", "uFF70", - "kaverticalstrokecyrillic", "u049D", - "kbopomofo", "u310E", - "kcalsquare", "u3389", - "kcaron", "u01E9", - "kcedilla", "u0137", - "kcircle", "u24DA", - "kcommaaccent", "u0137", - "kdotbelow", "u1E33", - "keharmenian", "u0584", - "kehiragana", "u3051", - "kekatakana", "u30B1", - "kekatakanahalfwidth", "uFF79", - "kenarmenian", "u056F", - "kesmallkatakana", "u30F6", - "kgreenlandic", "u0138", - "khabengali", "u0996", - "khacyrillic", "u0445", - "khadeva", "u0916", - "khagujarati", "u0A96", - "khagurmukhi", "u0A16", - "khaharabic", "u062E", - "khahfinalarabic", "uFEA6", - "khahinitialarabic", "uFEA7", - "khahmedialarabic", "uFEA8", - "kheicoptic", "u03E7", - "khhadeva", "u0959", - "khhagurmukhi", "u0A59", - "khieukhacirclekorean", "u3278", - "khieukhaparenkorean", "u3218", - "khieukhcirclekorean", "u326A", - "khieukhkorean", "u314B", - "khieukhparenkorean", "u320A", - "khokhaithai", "u0E02", - "khokhonthai", "u0E05", - "khokhuatthai", "u0E03", - "khokhwaithai", "u0E04", - "khomutthai", "u0E5B", - "khook", "u0199", - "khorakhangthai", "u0E06", - "khzsquare", "u3391", - "kihiragana", "u304D", - "kikatakana", "u30AD", - "kikatakanahalfwidth", "uFF77", - "kiroguramusquare", "u3315", - "kiromeetorusquare", "u3316", - "kirosquare", "u3314", - "kiyeokacirclekorean", "u326E", - "kiyeokaparenkorean", "u320E", - "kiyeokcirclekorean", "u3260", - "kiyeokkorean", "u3131", - "kiyeokparenkorean", "u3200", - "kiyeoksioskorean", "u3133", - "kjecyrillic", "u045C", - "klinebelow", "u1E35", - "klsquare", "u3398", - "kmcubedsquare", "u33A6", - "kmonospace", "uFF4B", - "kmsquaredsquare", "u33A2", - "kohiragana", "u3053", - "kohmsquare", "u33C0", - "kokaithai", "u0E01", - "kokatakana", "u30B3", - "kokatakanahalfwidth", "uFF7A", - "kooposquare", "u331E", - "koppacyrillic", "u0481", - "koreanstandardsymbol", "u327F", - "koroniscmb", "u0343", - "kparen", "u24A6", - "kpasquare", "u33AA", - "ksicyrillic", "u046F", - "ktsquare", "u33CF", - "kturned", "u029E", - "kuhiragana", "u304F", - "kukatakana", "u30AF", - "kukatakanahalfwidth", "uFF78", - "kvsquare", "u33B8", - "kwsquare", "u33BE", - "l", "u006C", - "labengali", "u09B2", - "lacute", "u013A", - "ladeva", "u0932", - "lagujarati", "u0AB2", - "lagurmukhi", "u0A32", - "lakkhangyaothai", "u0E45", - "lamaleffinalarabic", "uFEFC", - "lamalefhamzaabovefinalarabic", "uFEF8", - "lamalefhamzaaboveisolatedarabic", "uFEF7", - "lamalefhamzabelowfinalarabic", "uFEFA", - "lamalefhamzabelowisolatedarabic", "uFEF9", - "lamalefisolatedarabic", "uFEFB", - "lamalefmaddaabovefinalarabic", "uFEF6", - "lamalefmaddaaboveisolatedarabic", "uFEF5", - "lamarabic", "u0644", - "lambda", "u03BB", - "lambdastroke", "u019B", - "lamed", "u05DC", - "lameddagesh", "uFB3C", - "lameddageshhebrew", "uFB3C", - "lamedhebrew", "u05DC", - "lamedholam", "u05DC_05B9", - "lamedholamdagesh", "u05DC_05B9_05BC", - "lamedholamdageshhebrew", "u05DC_05B9_05BC", - "lamedholamhebrew", "u05DC_05B9", - "lamfinalarabic", "uFEDE", - "lamhahinitialarabic", "uFCCA", - "laminitialarabic", "uFEDF", - "lamjeeminitialarabic", "uFCC9", - "lamkhahinitialarabic", "uFCCB", - "lamlamhehisolatedarabic", "uFDF2", - "lammedialarabic", "uFEE0", - "lammeemhahinitialarabic", "uFD88", - "lammeeminitialarabic", "uFCCC", - "lammeemjeeminitialarabic", "uFEDF_FEE4_FEA0", - "lammeemkhahinitialarabic", "uFEDF_FEE4_FEA8", - "largecircle", "u25EF", - "lbar", "u019A", - "lbelt", "u026C", - "lbopomofo", "u310C", - "lcaron", "u013E", - "lcedilla", "u013C", - "lcircle", "u24DB", - "lcircumflexbelow", "u1E3D", - "lcommaaccent", "u013C", - "ldot", "u0140", - "ldotaccent", "u0140", - "ldotbelow", "u1E37", - "ldotbelowmacron", "u1E39", - "leftangleabovecmb", "u031A", - "lefttackbelowcmb", "u0318", - "less", "u003C", - "lessequal", "u2264", - "lessequalorgreater", "u22DA", - "lessmonospace", "uFF1C", - "lessorequivalent", "u2272", - "lessorgreater", "u2276", - "lessoverequal", "u2266", - "lesssmall", "uFE64", - "lezh", "u026E", - "lfblock", "u258C", - "lhookretroflex", "u026D", - "lira", "u20A4", - "liwnarmenian", "u056C", - "lj", "u01C9", - "ljecyrillic", "u0459", - "lladeva", "u0933", - "llagujarati", "u0AB3", - "llinebelow", "u1E3B", - "llladeva", "u0934", - "llvocalicbengali", "u09E1", - "llvocalicdeva", "u0961", - "llvocalicvowelsignbengali", "u09E3", - "llvocalicvowelsigndeva", "u0963", - "lmiddletilde", "u026B", - "lmonospace", "uFF4C", - "lmsquare", "u33D0", - "lochulathai", "u0E2C", - "logicaland", "u2227", - "logicalnot", "u00AC", - "logicalnotreversed", "u2310", - "logicalor", "u2228", - "lolingthai", "u0E25", - "longs", "u017F", - "lowlinecenterline", "uFE4E", - "lowlinecmb", "u0332", - "lowlinedashed", "uFE4D", - "lozenge", "u25CA", - "lparen", "u24A7", - "lslash", "u0142", - "lsquare", "u2113", - "ltshade", "u2591", - "luthai", "u0E26", - "lvocalicbengali", "u098C", - "lvocalicdeva", "u090C", - "lvocalicvowelsignbengali", "u09E2", - "lvocalicvowelsigndeva", "u0962", - "lxsquare", "u33D3", - "m", "u006D", - "mabengali", "u09AE", - "macron", "u00AF", - "macronbelowcmb", "u0331", - "macroncmb", "u0304", - "macronlowmod", "u02CD", - "macronmonospace", "uFFE3", - "macute", "u1E3F", - "madeva", "u092E", - "magujarati", "u0AAE", - "magurmukhi", "u0A2E", - "mahapakhhebrew", "u05A4", - "mahapakhlefthebrew", "u05A4", - "mahiragana", "u307E", - "maichattawathai", "u0E4B", - "maiekthai", "u0E48", - "maihanakatthai", "u0E31", - "maitaikhuthai", "u0E47", - "maithothai", "u0E49", - "maitrithai", "u0E4A", - "maiyamokthai", "u0E46", - "makatakana", "u30DE", - "makatakanahalfwidth", "uFF8F", - "male", "u2642", - "mansyonsquare", "u3347", - "maqafhebrew", "u05BE", - "mars", "u2642", - "masoracirclehebrew", "u05AF", - "masquare", "u3383", - "mbopomofo", "u3107", - "mbsquare", "u33D4", - "mcircle", "u24DC", - "mcubedsquare", "u33A5", - "mdotaccent", "u1E41", - "mdotbelow", "u1E43", - "meemarabic", "u0645", - "meemfinalarabic", "uFEE2", - "meeminitialarabic", "uFEE3", - "meemmedialarabic", "uFEE4", - "meemmeeminitialarabic", "uFCD1", - "meemmeemisolatedarabic", "uFC48", - "meetorusquare", "u334D", - "mehiragana", "u3081", - "meizierasquare", "u337E", - "mekatakana", "u30E1", - "mekatakanahalfwidth", "uFF92", - "mem", "u05DE", - "memdagesh", "uFB3E", - "memdageshhebrew", "uFB3E", - "memhebrew", "u05DE", - "menarmenian", "u0574", - "merkhahebrew", "u05A5", - "merkhakefulahebrew", "u05A6", - "merkhakefulalefthebrew", "u05A6", - "merkhalefthebrew", "u05A5", - "mhook", "u0271", - "mhzsquare", "u3392", - "middledotkatakanahalfwidth", "uFF65", - "middot", "u00B7", - "mieumacirclekorean", "u3272", - "mieumaparenkorean", "u3212", - "mieumcirclekorean", "u3264", - "mieumkorean", "u3141", - "mieumpansioskorean", "u3170", - "mieumparenkorean", "u3204", - "mieumpieupkorean", "u316E", - "mieumsioskorean", "u316F", - "mihiragana", "u307F", - "mikatakana", "u30DF", - "mikatakanahalfwidth", "uFF90", - "minus", "u2212", - "minusbelowcmb", "u0320", - "minuscircle", "u2296", - "minusmod", "u02D7", - "minusplus", "u2213", - "minute", "u2032", - "miribaarusquare", "u334A", - "mirisquare", "u3349", - "mlonglegturned", "u0270", - "mlsquare", "u3396", - "mmcubedsquare", "u33A3", - "mmonospace", "uFF4D", - "mmsquaredsquare", "u339F", - "mohiragana", "u3082", - "mohmsquare", "u33C1", - "mokatakana", "u30E2", - "mokatakanahalfwidth", "uFF93", - "molsquare", "u33D6", - "momathai", "u0E21", - "moverssquare", "u33A7", - "moverssquaredsquare", "u33A8", - "mparen", "u24A8", - "mpasquare", "u33AB", - "mssquare", "u33B3", - "mturned", "u026F", - "mu", "u00B5", - "mu1", "u00B5", - "muasquare", "u3382", - "muchgreater", "u226B", - "muchless", "u226A", - "mufsquare", "u338C", - "mugreek", "u03BC", - "mugsquare", "u338D", - "muhiragana", "u3080", - "mukatakana", "u30E0", - "mukatakanahalfwidth", "uFF91", - "mulsquare", "u3395", - "multiply", "u00D7", - "mumsquare", "u339B", - "munahhebrew", "u05A3", - "munahlefthebrew", "u05A3", - "musicalnote", "u266A", - "musicalnotedbl", "u266B", - "musicflatsign", "u266D", - "musicsharpsign", "u266F", - "mussquare", "u33B2", - "muvsquare", "u33B6", - "muwsquare", "u33BC", - "mvmegasquare", "u33B9", - "mvsquare", "u33B7", - "mwmegasquare", "u33BF", - "mwsquare", "u33BD", - "n", "u006E", - "nabengali", "u09A8", - "nabla", "u2207", - "nacute", "u0144", - "nadeva", "u0928", - "nagujarati", "u0AA8", - "nagurmukhi", "u0A28", - "nahiragana", "u306A", - "nakatakana", "u30CA", - "nakatakanahalfwidth", "uFF85", - "napostrophe", "u0149", - "nasquare", "u3381", - "nbopomofo", "u310B", - "nbspace", "u00A0", - "ncaron", "u0148", - "ncedilla", "u0146", - "ncircle", "u24DD", - "ncircumflexbelow", "u1E4B", - "ncommaaccent", "u0146", - "ndotaccent", "u1E45", - "ndotbelow", "u1E47", - "nehiragana", "u306D", - "nekatakana", "u30CD", - "nekatakanahalfwidth", "uFF88", - "newsheqelsign", "u20AA", - "nfsquare", "u338B", - "ngabengali", "u0999", - "ngadeva", "u0919", - "ngagujarati", "u0A99", - "ngagurmukhi", "u0A19", - "ngonguthai", "u0E07", - "nhiragana", "u3093", - "nhookleft", "u0272", - "nhookretroflex", "u0273", - "nieunacirclekorean", "u326F", - "nieunaparenkorean", "u320F", - "nieuncieuckorean", "u3135", - "nieuncirclekorean", "u3261", - "nieunhieuhkorean", "u3136", - "nieunkorean", "u3134", - "nieunpansioskorean", "u3168", - "nieunparenkorean", "u3201", - "nieunsioskorean", "u3167", - "nieuntikeutkorean", "u3166", - "nihiragana", "u306B", - "nikatakana", "u30CB", - "nikatakanahalfwidth", "uFF86", - "nikhahitthai", "u0E4D", - "nine", "u0039", - "ninearabic", "u0669", - "ninebengali", "u09EF", - "ninecircle", "u2468", - "ninecircleinversesansserif", "u2792", - "ninedeva", "u096F", - "ninegujarati", "u0AEF", - "ninegurmukhi", "u0A6F", - "ninehackarabic", "u0669", - "ninehangzhou", "u3029", - "nineideographicparen", "u3228", - "nineinferior", "u2089", - "ninemonospace", "uFF19", - "nineparen", "u247C", - "nineperiod", "u2490", - "ninepersian", "u06F9", - "nineroman", "u2178", - "ninesuperior", "u2079", - "nineteencircle", "u2472", - "nineteenparen", "u2486", - "nineteenperiod", "u249A", - "ninethai", "u0E59", - "nj", "u01CC", - "njecyrillic", "u045A", - "nkatakana", "u30F3", - "nkatakanahalfwidth", "uFF9D", - "nlegrightlong", "u019E", - "nlinebelow", "u1E49", - "nmonospace", "uFF4E", - "nmsquare", "u339A", - "nnabengali", "u09A3", - "nnadeva", "u0923", - "nnagujarati", "u0AA3", - "nnagurmukhi", "u0A23", - "nnnadeva", "u0929", - "nohiragana", "u306E", - "nokatakana", "u30CE", - "nokatakanahalfwidth", "uFF89", - "nonbreakingspace", "u00A0", - "nonenthai", "u0E13", - "nonuthai", "u0E19", - "noonarabic", "u0646", - "noonfinalarabic", "uFEE6", - "noonghunnaarabic", "u06BA", - "noonghunnafinalarabic", "uFB9F", - "noonhehinitialarabic", "uFEE7_FEEC", - "nooninitialarabic", "uFEE7", - "noonjeeminitialarabic", "uFCD2", - "noonjeemisolatedarabic", "uFC4B", - "noonmedialarabic", "uFEE8", - "noonmeeminitialarabic", "uFCD5", - "noonmeemisolatedarabic", "uFC4E", - "noonnoonfinalarabic", "uFC8D", - "notcontains", "u220C", - "notelement", "u2209", - "notelementof", "u2209", - "notequal", "u2260", - "notgreater", "u226F", - "notgreaternorequal", "u2271", - "notgreaternorless", "u2279", - "notidentical", "u2262", - "notless", "u226E", - "notlessnorequal", "u2270", - "notparallel", "u2226", - "notprecedes", "u2280", - "notsubset", "u2284", - "notsucceeds", "u2281", - "notsuperset", "u2285", - "nowarmenian", "u0576", - "nparen", "u24A9", - "nssquare", "u33B1", - "nsuperior", "u207F", - "ntilde", "u00F1", - "nu", "u03BD", - "nuhiragana", "u306C", - "nukatakana", "u30CC", - "nukatakanahalfwidth", "uFF87", - "nuktabengali", "u09BC", - "nuktadeva", "u093C", - "nuktagujarati", "u0ABC", - "nuktagurmukhi", "u0A3C", - "numbersign", "u0023", - "numbersignmonospace", "uFF03", - "numbersignsmall", "uFE5F", - "numeralsigngreek", "u0374", - "numeralsignlowergreek", "u0375", - "numero", "u2116", - "nun", "u05E0", - "nundagesh", "uFB40", - "nundageshhebrew", "uFB40", - "nunhebrew", "u05E0", - "nvsquare", "u33B5", - "nwsquare", "u33BB", - "nyabengali", "u099E", - "nyadeva", "u091E", - "nyagujarati", "u0A9E", - "nyagurmukhi", "u0A1E", - "o", "u006F", - "oacute", "u00F3", - "oangthai", "u0E2D", - "obarred", "u0275", - "obarredcyrillic", "u04E9", - "obarreddieresiscyrillic", "u04EB", - "obengali", "u0993", - "obopomofo", "u311B", - "obreve", "u014F", - "ocandradeva", "u0911", - "ocandragujarati", "u0A91", - "ocandravowelsigndeva", "u0949", - "ocandravowelsigngujarati", "u0AC9", - "ocaron", "u01D2", - "ocircle", "u24DE", - "ocircumflex", "u00F4", - "ocircumflexacute", "u1ED1", - "ocircumflexdotbelow", "u1ED9", - "ocircumflexgrave", "u1ED3", - "ocircumflexhookabove", "u1ED5", - "ocircumflextilde", "u1ED7", - "ocyrillic", "u043E", - "odblacute", "u0151", - "odblgrave", "u020D", - "odeva", "u0913", - "odieresis", "u00F6", - "odieresiscyrillic", "u04E7", - "odotbelow", "u1ECD", - "oe", "u0153", - "oekorean", "u315A", - "ogonek", "u02DB", - "ogonekcmb", "u0328", - "ograve", "u00F2", - "ogujarati", "u0A93", - "oharmenian", "u0585", - "ohiragana", "u304A", - "ohookabove", "u1ECF", - "ohorn", "u01A1", - "ohornacute", "u1EDB", - "ohorndotbelow", "u1EE3", - "ohorngrave", "u1EDD", - "ohornhookabove", "u1EDF", - "ohorntilde", "u1EE1", - "ohungarumlaut", "u0151", - "oi", "u01A3", - "oinvertedbreve", "u020F", - "okatakana", "u30AA", - "okatakanahalfwidth", "uFF75", - "okorean", "u3157", - "olehebrew", "u05AB", - "omacron", "u014D", - "omacronacute", "u1E53", - "omacrongrave", "u1E51", - "omdeva", "u0950", - "omega", "u03C9", - "omega1", "u03D6", - "omegacyrillic", "u0461", - "omegalatinclosed", "u0277", - "omegaroundcyrillic", "u047B", - "omegatitlocyrillic", "u047D", - "omegatonos", "u03CE", - "omgujarati", "u0AD0", - "omicron", "u03BF", - "omicrontonos", "u03CC", - "omonospace", "uFF4F", - "one", "u0031", - "onearabic", "u0661", - "onebengali", "u09E7", - "onecircle", "u2460", - "onecircleinversesansserif", "u278A", - "onedeva", "u0967", - "onedotenleader", "u2024", - "oneeighth", "u215B", - "onegujarati", "u0AE7", - "onegurmukhi", "u0A67", - "onehackarabic", "u0661", - "onehalf", "u00BD", - "onehangzhou", "u3021", - "oneideographicparen", "u3220", - "oneinferior", "u2081", - "onemonospace", "uFF11", - "onenumeratorbengali", "u09F4", - "oneparen", "u2474", - "oneperiod", "u2488", - "onepersian", "u06F1", - "onequarter", "u00BC", - "oneroman", "u2170", - "onesuperior", "u00B9", - "onethai", "u0E51", - "onethird", "u2153", - "oogonek", "u01EB", - "oogonekmacron", "u01ED", - "oogurmukhi", "u0A13", - "oomatragurmukhi", "u0A4B", - "oopen", "u0254", - "oparen", "u24AA", - "openbullet", "u25E6", - "option", "u2325", - "ordfeminine", "u00AA", - "ordmasculine", "u00BA", - "orthogonal", "u221F", - "oshortdeva", "u0912", - "oshortvowelsigndeva", "u094A", - "oslash", "u00F8", - "oslashacute", "u01FF", - "osmallhiragana", "u3049", - "osmallkatakana", "u30A9", - "osmallkatakanahalfwidth", "uFF6B", - "ostrokeacute", "u01FF", - "otcyrillic", "u047F", - "otilde", "u00F5", - "otildeacute", "u1E4D", - "otildedieresis", "u1E4F", - "oubopomofo", "u3121", - "overline", "u203E", - "overlinecenterline", "uFE4A", - "overlinecmb", "u0305", - "overlinedashed", "uFE49", - "overlinedblwavy", "uFE4C", - "overlinewavy", "uFE4B", - "overscore", "u00AF", - "ovowelsignbengali", "u09CB", - "ovowelsigndeva", "u094B", - "ovowelsigngujarati", "u0ACB", - "p", "u0070", - "paampssquare", "u3380", - "paasentosquare", "u332B", - "pabengali", "u09AA", - "pacute", "u1E55", - "padeva", "u092A", - "pagedown", "u21DF", - "pageup", "u21DE", - "pagujarati", "u0AAA", - "pagurmukhi", "u0A2A", - "pahiragana", "u3071", - "paiyannoithai", "u0E2F", - "pakatakana", "u30D1", - "palatalizationcyrilliccmb", "u0484", - "palochkacyrillic", "u04C0", - "pansioskorean", "u317F", - "paragraph", "u00B6", - "parallel", "u2225", - "parenleft", "u0028", - "parenleftaltonearabic", "uFD3E", - "parenleftinferior", "u208D", - "parenleftmonospace", "uFF08", - "parenleftsmall", "uFE59", - "parenleftsuperior", "u207D", - "parenleftvertical", "uFE35", - "parenright", "u0029", - "parenrightaltonearabic", "uFD3F", - "parenrightinferior", "u208E", - "parenrightmonospace", "uFF09", - "parenrightsmall", "uFE5A", - "parenrightsuperior", "u207E", - "parenrightvertical", "uFE36", - "partialdiff", "u2202", - "paseqhebrew", "u05C0", - "pashtahebrew", "u0599", - "pasquare", "u33A9", - "patah", "u05B7", - "patah11", "u05B7", - "patah1d", "u05B7", - "patah2a", "u05B7", - "patahhebrew", "u05B7", - "patahnarrowhebrew", "u05B7", - "patahquarterhebrew", "u05B7", - "patahwidehebrew", "u05B7", - "pazerhebrew", "u05A1", - "pbopomofo", "u3106", - "pcircle", "u24DF", - "pdotaccent", "u1E57", - "pe", "u05E4", - "pecyrillic", "u043F", - "pedagesh", "uFB44", - "pedageshhebrew", "uFB44", - "peezisquare", "u333B", - "pefinaldageshhebrew", "uFB43", - "peharabic", "u067E", - "peharmenian", "u057A", - "pehebrew", "u05E4", - "pehfinalarabic", "uFB57", - "pehinitialarabic", "uFB58", - "pehiragana", "u307A", - "pehmedialarabic", "uFB59", - "pekatakana", "u30DA", - "pemiddlehookcyrillic", "u04A7", - "perafehebrew", "uFB4E", - "percent", "u0025", - "percentarabic", "u066A", - "percentmonospace", "uFF05", - "percentsmall", "uFE6A", - "period", "u002E", - "periodarmenian", "u0589", - "periodcentered", "u00B7", - "periodhalfwidth", "uFF61", - "periodmonospace", "uFF0E", - "periodsmall", "uFE52", - "perispomenigreekcmb", "u0342", - "perpendicular", "u22A5", - "perthousand", "u2030", - "peseta", "u20A7", - "pfsquare", "u338A", - "phabengali", "u09AB", - "phadeva", "u092B", - "phagujarati", "u0AAB", - "phagurmukhi", "u0A2B", - "phi", "u03C6", - "phi1", "u03D5", - "phieuphacirclekorean", "u327A", - "phieuphaparenkorean", "u321A", - "phieuphcirclekorean", "u326C", - "phieuphkorean", "u314D", - "phieuphparenkorean", "u320C", - "philatin", "u0278", - "phinthuthai", "u0E3A", - "phisymbolgreek", "u03D5", - "phook", "u01A5", - "phophanthai", "u0E1E", - "phophungthai", "u0E1C", - "phosamphaothai", "u0E20", - "pi", "u03C0", - "pieupacirclekorean", "u3273", - "pieupaparenkorean", "u3213", - "pieupcieuckorean", "u3176", - "pieupcirclekorean", "u3265", - "pieupkiyeokkorean", "u3172", - "pieupkorean", "u3142", - "pieupparenkorean", "u3205", - "pieupsioskiyeokkorean", "u3174", - "pieupsioskorean", "u3144", - "pieupsiostikeutkorean", "u3175", - "pieupthieuthkorean", "u3177", - "pieuptikeutkorean", "u3173", - "pihiragana", "u3074", - "pikatakana", "u30D4", - "pisymbolgreek", "u03D6", - "piwrarmenian", "u0583", - "plus", "u002B", - "plusbelowcmb", "u031F", - "pluscircle", "u2295", - "plusminus", "u00B1", - "plusmod", "u02D6", - "plusmonospace", "uFF0B", - "plussmall", "uFE62", - "plussuperior", "u207A", - "pmonospace", "uFF50", - "pmsquare", "u33D8", - "pohiragana", "u307D", - "pointingindexdownwhite", "u261F", - "pointingindexleftwhite", "u261C", - "pointingindexrightwhite", "u261E", - "pointingindexupwhite", "u261D", - "pokatakana", "u30DD", - "poplathai", "u0E1B", - "postalmark", "u3012", - "postalmarkface", "u3020", - "pparen", "u24AB", - "precedes", "u227A", - "prescription", "u211E", - "primemod", "u02B9", - "primereversed", "u2035", - "product", "u220F", - "projective", "u2305", - "prolongedkana", "u30FC", - "propellor", "u2318", - "propersubset", "u2282", - "propersuperset", "u2283", - "proportion", "u2237", - "proportional", "u221D", - "psi", "u03C8", - "psicyrillic", "u0471", - "psilipneumatacyrilliccmb", "u0486", - "pssquare", "u33B0", - "puhiragana", "u3077", - "pukatakana", "u30D7", - "pvsquare", "u33B4", - "pwsquare", "u33BA", - "q", "u0071", - "qadeva", "u0958", - "qadmahebrew", "u05A8", - "qafarabic", "u0642", - "qaffinalarabic", "uFED6", - "qafinitialarabic", "uFED7", - "qafmedialarabic", "uFED8", - "qamats", "u05B8", - "qamats10", "u05B8", - "qamats1a", "u05B8", - "qamats1c", "u05B8", - "qamats27", "u05B8", - "qamats29", "u05B8", - "qamats33", "u05B8", - "qamatsde", "u05B8", - "qamatshebrew", "u05B8", - "qamatsnarrowhebrew", "u05B8", - "qamatsqatanhebrew", "u05B8", - "qamatsqatannarrowhebrew", "u05B8", - "qamatsqatanquarterhebrew", "u05B8", - "qamatsqatanwidehebrew", "u05B8", - "qamatsquarterhebrew", "u05B8", - "qamatswidehebrew", "u05B8", - "qarneyparahebrew", "u059F", - "qbopomofo", "u3111", - "qcircle", "u24E0", - "qhook", "u02A0", - "qmonospace", "uFF51", - "qof", "u05E7", - "qofdagesh", "uFB47", - "qofdageshhebrew", "uFB47", - "qofhatafpatah", "u05E7_05B2", - "qofhatafpatahhebrew", "u05E7_05B2", - "qofhatafsegol", "u05E7_05B1", - "qofhatafsegolhebrew", "u05E7_05B1", - "qofhebrew", "u05E7", - "qofhiriq", "u05E7_05B4", - "qofhiriqhebrew", "u05E7_05B4", - "qofholam", "u05E7_05B9", - "qofholamhebrew", "u05E7_05B9", - "qofpatah", "u05E7_05B7", - "qofpatahhebrew", "u05E7_05B7", - "qofqamats", "u05E7_05B8", - "qofqamatshebrew", "u05E7_05B8", - "qofqubuts", "u05E7_05BB", - "qofqubutshebrew", "u05E7_05BB", - "qofsegol", "u05E7_05B6", - "qofsegolhebrew", "u05E7_05B6", - "qofsheva", "u05E7_05B0", - "qofshevahebrew", "u05E7_05B0", - "qoftsere", "u05E7_05B5", - "qoftserehebrew", "u05E7_05B5", - "qparen", "u24AC", - "quarternote", "u2669", - "qubuts", "u05BB", - "qubuts18", "u05BB", - "qubuts25", "u05BB", - "qubuts31", "u05BB", - "qubutshebrew", "u05BB", - "qubutsnarrowhebrew", "u05BB", - "qubutsquarterhebrew", "u05BB", - "qubutswidehebrew", "u05BB", - "question", "u003F", - "questionarabic", "u061F", - "questionarmenian", "u055E", - "questiondown", "u00BF", - "questiongreek", "u037E", - "questionmonospace", "uFF1F", - "quotedbl", "u0022", - "quotedblbase", "u201E", - "quotedblleft", "u201C", - "quotedblmonospace", "uFF02", - "quotedblprime", "u301E", - "quotedblprimereversed", "u301D", - "quotedblright", "u201D", - "quoteleft", "u2018", - "quoteleftreversed", "u201B", - "quotereversed", "u201B", - "quoteright", "u2019", - "quoterightn", "u0149", - "quotesinglbase", "u201A", - "quotesingle", "u0027", - "quotesinglemonospace", "uFF07", - "r", "u0072", - "raarmenian", "u057C", - "rabengali", "u09B0", - "racute", "u0155", - "radeva", "u0930", - "radical", "u221A", - "radoverssquare", "u33AE", - "radoverssquaredsquare", "u33AF", - "radsquare", "u33AD", - "rafe", "u05BF", - "rafehebrew", "u05BF", - "ragujarati", "u0AB0", - "ragurmukhi", "u0A30", - "rahiragana", "u3089", - "rakatakana", "u30E9", - "rakatakanahalfwidth", "uFF97", - "ralowerdiagonalbengali", "u09F1", - "ramiddlediagonalbengali", "u09F0", - "ramshorn", "u0264", - "ratio", "u2236", - "rbopomofo", "u3116", - "rcaron", "u0159", - "rcedilla", "u0157", - "rcircle", "u24E1", - "rcommaaccent", "u0157", - "rdblgrave", "u0211", - "rdotaccent", "u1E59", - "rdotbelow", "u1E5B", - "rdotbelowmacron", "u1E5D", - "referencemark", "u203B", - "reflexsubset", "u2286", - "reflexsuperset", "u2287", - "registered", "u00AE", - "reharabic", "u0631", - "reharmenian", "u0580", - "rehfinalarabic", "uFEAE", - "rehiragana", "u308C", - "rehyehaleflamarabic", "u0631_FEF3_FE8E_0644", - "rekatakana", "u30EC", - "rekatakanahalfwidth", "uFF9A", - "resh", "u05E8", - "reshdageshhebrew", "uFB48", - "reshhatafpatah", "u05E8_05B2", - "reshhatafpatahhebrew", "u05E8_05B2", - "reshhatafsegol", "u05E8_05B1", - "reshhatafsegolhebrew", "u05E8_05B1", - "reshhebrew", "u05E8", - "reshhiriq", "u05E8_05B4", - "reshhiriqhebrew", "u05E8_05B4", - "reshholam", "u05E8_05B9", - "reshholamhebrew", "u05E8_05B9", - "reshpatah", "u05E8_05B7", - "reshpatahhebrew", "u05E8_05B7", - "reshqamats", "u05E8_05B8", - "reshqamatshebrew", "u05E8_05B8", - "reshqubuts", "u05E8_05BB", - "reshqubutshebrew", "u05E8_05BB", - "reshsegol", "u05E8_05B6", - "reshsegolhebrew", "u05E8_05B6", - "reshsheva", "u05E8_05B0", - "reshshevahebrew", "u05E8_05B0", - "reshtsere", "u05E8_05B5", - "reshtserehebrew", "u05E8_05B5", - "reversedtilde", "u223D", - "reviahebrew", "u0597", - "reviamugrashhebrew", "u0597", - "revlogicalnot", "u2310", - "rfishhook", "u027E", - "rfishhookreversed", "u027F", - "rhabengali", "u09DD", - "rhadeva", "u095D", - "rho", "u03C1", - "rhook", "u027D", - "rhookturned", "u027B", - "rhookturnedsuperior", "u02B5", - "rhosymbolgreek", "u03F1", - "rhotichookmod", "u02DE", - "rieulacirclekorean", "u3271", - "rieulaparenkorean", "u3211", - "rieulcirclekorean", "u3263", - "rieulhieuhkorean", "u3140", - "rieulkiyeokkorean", "u313A", - "rieulkiyeoksioskorean", "u3169", - "rieulkorean", "u3139", - "rieulmieumkorean", "u313B", - "rieulpansioskorean", "u316C", - "rieulparenkorean", "u3203", - "rieulphieuphkorean", "u313F", - "rieulpieupkorean", "u313C", - "rieulpieupsioskorean", "u316B", - "rieulsioskorean", "u313D", - "rieulthieuthkorean", "u313E", - "rieultikeutkorean", "u316A", - "rieulyeorinhieuhkorean", "u316D", - "rightangle", "u221F", - "righttackbelowcmb", "u0319", - "righttriangle", "u22BF", - "rihiragana", "u308A", - "rikatakana", "u30EA", - "rikatakanahalfwidth", "uFF98", - "ring", "u02DA", - "ringbelowcmb", "u0325", - "ringcmb", "u030A", - "ringhalfleft", "u02BF", - "ringhalfleftarmenian", "u0559", - "ringhalfleftbelowcmb", "u031C", - "ringhalfleftcentered", "u02D3", - "ringhalfright", "u02BE", - "ringhalfrightbelowcmb", "u0339", - "ringhalfrightcentered", "u02D2", - "rinvertedbreve", "u0213", - "rittorusquare", "u3351", - "rlinebelow", "u1E5F", - "rlongleg", "u027C", - "rlonglegturned", "u027A", - "rmonospace", "uFF52", - "rohiragana", "u308D", - "rokatakana", "u30ED", - "rokatakanahalfwidth", "uFF9B", - "roruathai", "u0E23", - "rparen", "u24AD", - "rrabengali", "u09DC", - "rradeva", "u0931", - "rragurmukhi", "u0A5C", - "rreharabic", "u0691", - "rrehfinalarabic", "uFB8D", - "rrvocalicbengali", "u09E0", - "rrvocalicdeva", "u0960", - "rrvocalicgujarati", "u0AE0", - "rrvocalicvowelsignbengali", "u09C4", - "rrvocalicvowelsigndeva", "u0944", - "rrvocalicvowelsigngujarati", "u0AC4", - "rtblock", "u2590", - "rturned", "u0279", - "rturnedsuperior", "u02B4", - "ruhiragana", "u308B", - "rukatakana", "u30EB", - "rukatakanahalfwidth", "uFF99", - "rupeemarkbengali", "u09F2", - "rupeesignbengali", "u09F3", - "ruthai", "u0E24", - "rvocalicbengali", "u098B", - "rvocalicdeva", "u090B", - "rvocalicgujarati", "u0A8B", - "rvocalicvowelsignbengali", "u09C3", - "rvocalicvowelsigndeva", "u0943", - "rvocalicvowelsigngujarati", "u0AC3", - "s", "u0073", - "sabengali", "u09B8", - "sacute", "u015B", - "sacutedotaccent", "u1E65", - "sadarabic", "u0635", - "sadeva", "u0938", - "sadfinalarabic", "uFEBA", - "sadinitialarabic", "uFEBB", - "sadmedialarabic", "uFEBC", - "sagujarati", "u0AB8", - "sagurmukhi", "u0A38", - "sahiragana", "u3055", - "sakatakana", "u30B5", - "sakatakanahalfwidth", "uFF7B", - "sallallahoualayhewasallamarabic", "uFDFA", - "samekh", "u05E1", - "samekhdagesh", "uFB41", - "samekhdageshhebrew", "uFB41", - "samekhhebrew", "u05E1", - "saraaathai", "u0E32", - "saraaethai", "u0E41", - "saraaimaimalaithai", "u0E44", - "saraaimaimuanthai", "u0E43", - "saraamthai", "u0E33", - "saraathai", "u0E30", - "saraethai", "u0E40", - "saraiithai", "u0E35", - "saraithai", "u0E34", - "saraothai", "u0E42", - "saraueethai", "u0E37", - "sarauethai", "u0E36", - "sarauthai", "u0E38", - "sarauuthai", "u0E39", - "sbopomofo", "u3119", - "scaron", "u0161", - "scarondotaccent", "u1E67", - "scedilla", "u015F", - "schwa", "u0259", - "schwacyrillic", "u04D9", - "schwadieresiscyrillic", "u04DB", - "schwahook", "u025A", - "scircle", "u24E2", - "scircumflex", "u015D", - "scommaaccent", "u0219", - "sdotaccent", "u1E61", - "sdotbelow", "u1E63", - "sdotbelowdotaccent", "u1E69", - "seagullbelowcmb", "u033C", - "second", "u2033", - "secondtonechinese", "u02CA", - "section", "u00A7", - "seenarabic", "u0633", - "seenfinalarabic", "uFEB2", - "seeninitialarabic", "uFEB3", - "seenmedialarabic", "uFEB4", - "segol", "u05B6", - "segol13", "u05B6", - "segol1f", "u05B6", - "segol2c", "u05B6", - "segolhebrew", "u05B6", - "segolnarrowhebrew", "u05B6", - "segolquarterhebrew", "u05B6", - "segoltahebrew", "u0592", - "segolwidehebrew", "u05B6", - "seharmenian", "u057D", - "sehiragana", "u305B", - "sekatakana", "u30BB", - "sekatakanahalfwidth", "uFF7E", - "semicolon", "u003B", - "semicolonarabic", "u061B", - "semicolonmonospace", "uFF1B", - "semicolonsmall", "uFE54", - "semivoicedmarkkana", "u309C", - "semivoicedmarkkanahalfwidth", "uFF9F", - "sentisquare", "u3322", - "sentosquare", "u3323", - "seven", "u0037", - "sevenarabic", "u0667", - "sevenbengali", "u09ED", - "sevencircle", "u2466", - "sevencircleinversesansserif", "u2790", - "sevendeva", "u096D", - "seveneighths", "u215E", - "sevengujarati", "u0AED", - "sevengurmukhi", "u0A6D", - "sevenhackarabic", "u0667", - "sevenhangzhou", "u3027", - "sevenideographicparen", "u3226", - "seveninferior", "u2087", - "sevenmonospace", "uFF17", - "sevenparen", "u247A", - "sevenperiod", "u248E", - "sevenpersian", "u06F7", - "sevenroman", "u2176", - "sevensuperior", "u2077", - "seventeencircle", "u2470", - "seventeenparen", "u2484", - "seventeenperiod", "u2498", - "seventhai", "u0E57", - "sfthyphen", "u00AD", - "shaarmenian", "u0577", - "shabengali", "u09B6", - "shacyrillic", "u0448", - "shaddaarabic", "u0651", - "shaddadammaarabic", "uFC61", - "shaddadammatanarabic", "uFC5E", - "shaddafathaarabic", "uFC60", - "shaddafathatanarabic", "u0651_064B", - "shaddakasraarabic", "uFC62", - "shaddakasratanarabic", "uFC5F", - "shade", "u2592", - "shadedark", "u2593", - "shadelight", "u2591", - "shademedium", "u2592", - "shadeva", "u0936", - "shagujarati", "u0AB6", - "shagurmukhi", "u0A36", - "shalshelethebrew", "u0593", - "shbopomofo", "u3115", - "shchacyrillic", "u0449", - "sheenarabic", "u0634", - "sheenfinalarabic", "uFEB6", - "sheeninitialarabic", "uFEB7", - "sheenmedialarabic", "uFEB8", - "sheicoptic", "u03E3", - "sheqel", "u20AA", - "sheqelhebrew", "u20AA", - "sheva", "u05B0", - "sheva115", "u05B0", - "sheva15", "u05B0", - "sheva22", "u05B0", - "sheva2e", "u05B0", - "shevahebrew", "u05B0", - "shevanarrowhebrew", "u05B0", - "shevaquarterhebrew", "u05B0", - "shevawidehebrew", "u05B0", - "shhacyrillic", "u04BB", - "shimacoptic", "u03ED", - "shin", "u05E9", - "shindagesh", "uFB49", - "shindageshhebrew", "uFB49", - "shindageshshindot", "uFB2C", - "shindageshshindothebrew", "uFB2C", - "shindageshsindot", "uFB2D", - "shindageshsindothebrew", "uFB2D", - "shindothebrew", "u05C1", - "shinhebrew", "u05E9", - "shinshindot", "uFB2A", - "shinshindothebrew", "uFB2A", - "shinsindot", "uFB2B", - "shinsindothebrew", "uFB2B", - "shook", "u0282", - "sigma", "u03C3", - "sigma1", "u03C2", - "sigmafinal", "u03C2", - "sigmalunatesymbolgreek", "u03F2", - "sihiragana", "u3057", - "sikatakana", "u30B7", - "sikatakanahalfwidth", "uFF7C", - "siluqhebrew", "u05BD", - "siluqlefthebrew", "u05BD", - "similar", "u223C", - "sindothebrew", "u05C2", - "siosacirclekorean", "u3274", - "siosaparenkorean", "u3214", - "sioscieuckorean", "u317E", - "sioscirclekorean", "u3266", - "sioskiyeokkorean", "u317A", - "sioskorean", "u3145", - "siosnieunkorean", "u317B", - "siosparenkorean", "u3206", - "siospieupkorean", "u317D", - "siostikeutkorean", "u317C", - "six", "u0036", - "sixarabic", "u0666", - "sixbengali", "u09EC", - "sixcircle", "u2465", - "sixcircleinversesansserif", "u278F", - "sixdeva", "u096C", - "sixgujarati", "u0AEC", - "sixgurmukhi", "u0A6C", - "sixhackarabic", "u0666", - "sixhangzhou", "u3026", - "sixideographicparen", "u3225", - "sixinferior", "u2086", - "sixmonospace", "uFF16", - "sixparen", "u2479", - "sixperiod", "u248D", - "sixpersian", "u06F6", - "sixroman", "u2175", - "sixsuperior", "u2076", - "sixteencircle", "u246F", - "sixteencurrencydenominatorbengali", "u09F9", - "sixteenparen", "u2483", - "sixteenperiod", "u2497", - "sixthai", "u0E56", - "slash", "u002F", - "slashmonospace", "uFF0F", - "slong", "u017F", - "slongdotaccent", "u1E9B", - "smileface", "u263A", - "smonospace", "uFF53", - "sofpasuqhebrew", "u05C3", - "softhyphen", "u00AD", - "softsigncyrillic", "u044C", - "sohiragana", "u305D", - "sokatakana", "u30BD", - "sokatakanahalfwidth", "uFF7F", - "soliduslongoverlaycmb", "u0338", - "solidusshortoverlaycmb", "u0337", - "sorusithai", "u0E29", - "sosalathai", "u0E28", - "sosothai", "u0E0B", - "sosuathai", "u0E2A", - "space", "u0020", - "spacehackarabic", "u0020", - "spade", "u2660", - "spadesuitblack", "u2660", - "spadesuitwhite", "u2664", - "sparen", "u24AE", - "squarebelowcmb", "u033B", - "squarecc", "u33C4", - "squarecm", "u339D", - "squarediagonalcrosshatchfill", "u25A9", - "squarehorizontalfill", "u25A4", - "squarekg", "u338F", - "squarekm", "u339E", - "squarekmcapital", "u33CE", - "squareln", "u33D1", - "squarelog", "u33D2", - "squaremg", "u338E", - "squaremil", "u33D5", - "squaremm", "u339C", - "squaremsquared", "u33A1", - "squareorthogonalcrosshatchfill", "u25A6", - "squareupperlefttolowerrightfill", "u25A7", - "squareupperrighttolowerleftfill", "u25A8", - "squareverticalfill", "u25A5", - "squarewhitewithsmallblack", "u25A3", - "srsquare", "u33DB", - "ssabengali", "u09B7", - "ssadeva", "u0937", - "ssagujarati", "u0AB7", - "ssangcieuckorean", "u3149", - "ssanghieuhkorean", "u3185", - "ssangieungkorean", "u3180", - "ssangkiyeokkorean", "u3132", - "ssangnieunkorean", "u3165", - "ssangpieupkorean", "u3143", - "ssangsioskorean", "u3146", - "ssangtikeutkorean", "u3138", - "sterling", "u00A3", - "sterlingmonospace", "uFFE1", - "strokelongoverlaycmb", "u0336", - "strokeshortoverlaycmb", "u0335", - "subset", "u2282", - "subsetnotequal", "u228A", - "subsetorequal", "u2286", - "succeeds", "u227B", - "suchthat", "u220B", - "suhiragana", "u3059", - "sukatakana", "u30B9", - "sukatakanahalfwidth", "uFF7D", - "sukunarabic", "u0652", - "summation", "u2211", - "sun", "u263C", - "superset", "u2283", - "supersetnotequal", "u228B", - "supersetorequal", "u2287", - "svsquare", "u33DC", - "syouwaerasquare", "u337C", - "t", "u0074", - "tabengali", "u09A4", - "tackdown", "u22A4", - "tackleft", "u22A3", - "tadeva", "u0924", - "tagujarati", "u0AA4", - "tagurmukhi", "u0A24", - "taharabic", "u0637", - "tahfinalarabic", "uFEC2", - "tahinitialarabic", "uFEC3", - "tahiragana", "u305F", - "tahmedialarabic", "uFEC4", - "taisyouerasquare", "u337D", - "takatakana", "u30BF", - "takatakanahalfwidth", "uFF80", - "tatweelarabic", "u0640", - "tau", "u03C4", - "tav", "u05EA", - "tavdages", "uFB4A", - "tavdagesh", "uFB4A", - "tavdageshhebrew", "uFB4A", - "tavhebrew", "u05EA", - "tbar", "u0167", - "tbopomofo", "u310A", - "tcaron", "u0165", - "tccurl", "u02A8", - "tcedilla", "u0163", - "tcheharabic", "u0686", - "tchehfinalarabic", "uFB7B", - "tchehinitialarabic", "uFB7C", - "tchehmedialarabic", "uFB7D", - "tchehmeeminitialarabic", "uFB7C_FEE4", - "tcircle", "u24E3", - "tcircumflexbelow", "u1E71", - "tcommaaccent", "u0163", - "tdieresis", "u1E97", - "tdotaccent", "u1E6B", - "tdotbelow", "u1E6D", - "tecyrillic", "u0442", - "tedescendercyrillic", "u04AD", - "teharabic", "u062A", - "tehfinalarabic", "uFE96", - "tehhahinitialarabic", "uFCA2", - "tehhahisolatedarabic", "uFC0C", - "tehinitialarabic", "uFE97", - "tehiragana", "u3066", - "tehjeeminitialarabic", "uFCA1", - "tehjeemisolatedarabic", "uFC0B", - "tehmarbutaarabic", "u0629", - "tehmarbutafinalarabic", "uFE94", - "tehmedialarabic", "uFE98", - "tehmeeminitialarabic", "uFCA4", - "tehmeemisolatedarabic", "uFC0E", - "tehnoonfinalarabic", "uFC73", - "tekatakana", "u30C6", - "tekatakanahalfwidth", "uFF83", - "telephone", "u2121", - "telephoneblack", "u260E", - "telishagedolahebrew", "u05A0", - "telishaqetanahebrew", "u05A9", - "tencircle", "u2469", - "tenideographicparen", "u3229", - "tenparen", "u247D", - "tenperiod", "u2491", - "tenroman", "u2179", - "tesh", "u02A7", - "tet", "u05D8", - "tetdagesh", "uFB38", - "tetdageshhebrew", "uFB38", - "tethebrew", "u05D8", - "tetsecyrillic", "u04B5", - "tevirhebrew", "u059B", - "tevirlefthebrew", "u059B", - "thabengali", "u09A5", - "thadeva", "u0925", - "thagujarati", "u0AA5", - "thagurmukhi", "u0A25", - "thalarabic", "u0630", - "thalfinalarabic", "uFEAC", - "thanthakhatthai", "u0E4C", - "theharabic", "u062B", - "thehfinalarabic", "uFE9A", - "thehinitialarabic", "uFE9B", - "thehmedialarabic", "uFE9C", - "thereexists", "u2203", - "therefore", "u2234", - "theta", "u03B8", - "theta1", "u03D1", - "thetasymbolgreek", "u03D1", - "thieuthacirclekorean", "u3279", - "thieuthaparenkorean", "u3219", - "thieuthcirclekorean", "u326B", - "thieuthkorean", "u314C", - "thieuthparenkorean", "u320B", - "thirteencircle", "u246C", - "thirteenparen", "u2480", - "thirteenperiod", "u2494", - "thonangmonthothai", "u0E11", - "thook", "u01AD", - "thophuthaothai", "u0E12", - "thorn", "u00FE", - "thothahanthai", "u0E17", - "thothanthai", "u0E10", - "thothongthai", "u0E18", - "thothungthai", "u0E16", - "thousandcyrillic", "u0482", - "thousandsseparatorarabic", "u066C", - "thousandsseparatorpersian", "u066C", - "three", "u0033", - "threearabic", "u0663", - "threebengali", "u09E9", - "threecircle", "u2462", - "threecircleinversesansserif", "u278C", - "threedeva", "u0969", - "threeeighths", "u215C", - "threegujarati", "u0AE9", - "threegurmukhi", "u0A69", - "threehackarabic", "u0663", - "threehangzhou", "u3023", - "threeideographicparen", "u3222", - "threeinferior", "u2083", - "threemonospace", "uFF13", - "threenumeratorbengali", "u09F6", - "threeparen", "u2476", - "threeperiod", "u248A", - "threepersian", "u06F3", - "threequarters", "u00BE", - "threeroman", "u2172", - "threesuperior", "u00B3", - "threethai", "u0E53", - "thzsquare", "u3394", - "tihiragana", "u3061", - "tikatakana", "u30C1", - "tikatakanahalfwidth", "uFF81", - "tikeutacirclekorean", "u3270", - "tikeutaparenkorean", "u3210", - "tikeutcirclekorean", "u3262", - "tikeutkorean", "u3137", - "tikeutparenkorean", "u3202", - "tilde", "u02DC", - "tildebelowcmb", "u0330", - "tildecmb", "u0303", - "tildecomb", "u0303", - "tildedoublecmb", "u0360", - "tildeoperator", "u223C", - "tildeoverlaycmb", "u0334", - "tildeverticalcmb", "u033E", - "timescircle", "u2297", - "tipehahebrew", "u0596", - "tipehalefthebrew", "u0596", - "tippigurmukhi", "u0A70", - "titlocyrilliccmb", "u0483", - "tiwnarmenian", "u057F", - "tlinebelow", "u1E6F", - "tmonospace", "uFF54", - "toarmenian", "u0569", - "tohiragana", "u3068", - "tokatakana", "u30C8", - "tokatakanahalfwidth", "uFF84", - "tonebarextrahighmod", "u02E5", - "tonebarextralowmod", "u02E9", - "tonebarhighmod", "u02E6", - "tonebarlowmod", "u02E8", - "tonebarmidmod", "u02E7", - "tonefive", "u01BD", - "tonesix", "u0185", - "tonetwo", "u01A8", - "tonos", "u0384", - "tonsquare", "u3327", - "topatakthai", "u0E0F", - "tortoiseshellbracketleft", "u3014", - "tortoiseshellbracketleftsmall", "uFE5D", - "tortoiseshellbracketleftvertical", "uFE39", - "tortoiseshellbracketright", "u3015", - "tortoiseshellbracketrightsmall", "uFE5E", - "tortoiseshellbracketrightvertical", "uFE3A", - "totaothai", "u0E15", - "tpalatalhook", "u01AB", - "tparen", "u24AF", - "trademark", "u2122", - "tretroflexhook", "u0288", - "triagdn", "u25BC", - "triaglf", "u25C4", - "triagrt", "u25BA", - "triagup", "u25B2", - "ts", "u02A6", - "tsadi", "u05E6", - "tsadidagesh", "uFB46", - "tsadidageshhebrew", "uFB46", - "tsadihebrew", "u05E6", - "tsecyrillic", "u0446", - "tsere", "u05B5", - "tsere12", "u05B5", - "tsere1e", "u05B5", - "tsere2b", "u05B5", - "tserehebrew", "u05B5", - "tserenarrowhebrew", "u05B5", - "tserequarterhebrew", "u05B5", - "tserewidehebrew", "u05B5", - "tshecyrillic", "u045B", - "ttabengali", "u099F", - "ttadeva", "u091F", - "ttagujarati", "u0A9F", - "ttagurmukhi", "u0A1F", - "tteharabic", "u0679", - "ttehfinalarabic", "uFB67", - "ttehinitialarabic", "uFB68", - "ttehmedialarabic", "uFB69", - "tthabengali", "u09A0", - "tthadeva", "u0920", - "tthagujarati", "u0AA0", - "tthagurmukhi", "u0A20", - "tturned", "u0287", - "tuhiragana", "u3064", - "tukatakana", "u30C4", - "tukatakanahalfwidth", "uFF82", - "tusmallhiragana", "u3063", - "tusmallkatakana", "u30C3", - "tusmallkatakanahalfwidth", "uFF6F", - "twelvecircle", "u246B", - "twelveparen", "u247F", - "twelveperiod", "u2493", - "twelveroman", "u217B", - "twentycircle", "u2473", - "twentyhangzhou", "u5344", - "twentyparen", "u2487", - "twentyperiod", "u249B", - "two", "u0032", - "twoarabic", "u0662", - "twobengali", "u09E8", - "twocircle", "u2461", - "twocircleinversesansserif", "u278B", - "twodeva", "u0968", - "twodotenleader", "u2025", - "twodotleader", "u2025", - "twodotleadervertical", "uFE30", - "twogujarati", "u0AE8", - "twogurmukhi", "u0A68", - "twohackarabic", "u0662", - "twohangzhou", "u3022", - "twoideographicparen", "u3221", - "twoinferior", "u2082", - "twomonospace", "uFF12", - "twonumeratorbengali", "u09F5", - "twoparen", "u2475", - "twoperiod", "u2489", - "twopersian", "u06F2", - "tworoman", "u2171", - "twostroke", "u01BB", - "twosuperior", "u00B2", - "twothai", "u0E52", - "twothirds", "u2154", - "u", "u0075", - "uacute", "u00FA", - "ubar", "u0289", - "ubengali", "u0989", - "ubopomofo", "u3128", - "ubreve", "u016D", - "ucaron", "u01D4", - "ucircle", "u24E4", - "ucircumflex", "u00FB", - "ucircumflexbelow", "u1E77", - "ucyrillic", "u0443", - "udattadeva", "u0951", - "udblacute", "u0171", - "udblgrave", "u0215", - "udeva", "u0909", - "udieresis", "u00FC", - "udieresisacute", "u01D8", - "udieresisbelow", "u1E73", - "udieresiscaron", "u01DA", - "udieresiscyrillic", "u04F1", - "udieresisgrave", "u01DC", - "udieresismacron", "u01D6", - "udotbelow", "u1EE5", - "ugrave", "u00F9", - "ugujarati", "u0A89", - "ugurmukhi", "u0A09", - "uhiragana", "u3046", - "uhookabove", "u1EE7", - "uhorn", "u01B0", - "uhornacute", "u1EE9", - "uhorndotbelow", "u1EF1", - "uhorngrave", "u1EEB", - "uhornhookabove", "u1EED", - "uhorntilde", "u1EEF", - "uhungarumlaut", "u0171", - "uhungarumlautcyrillic", "u04F3", - "uinvertedbreve", "u0217", - "ukatakana", "u30A6", - "ukatakanahalfwidth", "uFF73", - "ukcyrillic", "u0479", - "ukorean", "u315C", - "umacron", "u016B", - "umacroncyrillic", "u04EF", - "umacrondieresis", "u1E7B", - "umatragurmukhi", "u0A41", - "umonospace", "uFF55", - "underscore", "u005F", - "underscoredbl", "u2017", - "underscoremonospace", "uFF3F", - "underscorevertical", "uFE33", - "underscorewavy", "uFE4F", - "union", "u222A", - "universal", "u2200", - "uogonek", "u0173", - "uparen", "u24B0", - "upblock", "u2580", - "upperdothebrew", "u05C4", - "upsilon", "u03C5", - "upsilondieresis", "u03CB", - "upsilondieresistonos", "u03B0", - "upsilonlatin", "u028A", - "upsilontonos", "u03CD", - "uptackbelowcmb", "u031D", - "uptackmod", "u02D4", - "uragurmukhi", "u0A73", - "uring", "u016F", - "ushortcyrillic", "u045E", - "usmallhiragana", "u3045", - "usmallkatakana", "u30A5", - "usmallkatakanahalfwidth", "uFF69", - "ustraightcyrillic", "u04AF", - "ustraightstrokecyrillic", "u04B1", - "utilde", "u0169", - "utildeacute", "u1E79", - "utildebelow", "u1E75", - "uubengali", "u098A", - "uudeva", "u090A", - "uugujarati", "u0A8A", - "uugurmukhi", "u0A0A", - "uumatragurmukhi", "u0A42", - "uuvowelsignbengali", "u09C2", - "uuvowelsigndeva", "u0942", - "uuvowelsigngujarati", "u0AC2", - "uvowelsignbengali", "u09C1", - "uvowelsigndeva", "u0941", - "uvowelsigngujarati", "u0AC1", - "v", "u0076", - "vadeva", "u0935", - "vagujarati", "u0AB5", - "vagurmukhi", "u0A35", - "vakatakana", "u30F7", - "vav", "u05D5", - "vavdagesh", "uFB35", - "vavdagesh65", "uFB35", - "vavdageshhebrew", "uFB35", - "vavhebrew", "u05D5", - "vavholam", "uFB4B", - "vavholamhebrew", "uFB4B", - "vavvavhebrew", "u05F0", - "vavyodhebrew", "u05F1", - "vcircle", "u24E5", - "vdotbelow", "u1E7F", - "vecyrillic", "u0432", - "veharabic", "u06A4", - "vehfinalarabic", "uFB6B", - "vehinitialarabic", "uFB6C", - "vehmedialarabic", "uFB6D", - "vekatakana", "u30F9", - "venus", "u2640", - "verticalbar", "u007C", - "verticallineabovecmb", "u030D", - "verticallinebelowcmb", "u0329", - "verticallinelowmod", "u02CC", - "verticallinemod", "u02C8", - "vewarmenian", "u057E", - "vhook", "u028B", - "vikatakana", "u30F8", - "viramabengali", "u09CD", - "viramadeva", "u094D", - "viramagujarati", "u0ACD", - "visargabengali", "u0983", - "visargadeva", "u0903", - "visargagujarati", "u0A83", - "vmonospace", "uFF56", - "voarmenian", "u0578", - "voicediterationhiragana", "u309E", - "voicediterationkatakana", "u30FE", - "voicedmarkkana", "u309B", - "voicedmarkkanahalfwidth", "uFF9E", - "vokatakana", "u30FA", - "vparen", "u24B1", - "vtilde", "u1E7D", - "vturned", "u028C", - "vuhiragana", "u3094", - "vukatakana", "u30F4", - "w", "u0077", - "wacute", "u1E83", - "waekorean", "u3159", - "wahiragana", "u308F", - "wakatakana", "u30EF", - "wakatakanahalfwidth", "uFF9C", - "wakorean", "u3158", - "wasmallhiragana", "u308E", - "wasmallkatakana", "u30EE", - "wattosquare", "u3357", - "wavedash", "u301C", - "wavyunderscorevertical", "uFE34", - "wawarabic", "u0648", - "wawfinalarabic", "uFEEE", - "wawhamzaabovearabic", "u0624", - "wawhamzaabovefinalarabic", "uFE86", - "wbsquare", "u33DD", - "wcircle", "u24E6", - "wcircumflex", "u0175", - "wdieresis", "u1E85", - "wdotaccent", "u1E87", - "wdotbelow", "u1E89", - "wehiragana", "u3091", - "weierstrass", "u2118", - "wekatakana", "u30F1", - "wekorean", "u315E", - "weokorean", "u315D", - "wgrave", "u1E81", - "whitebullet", "u25E6", - "whitecircle", "u25CB", - "whitecircleinverse", "u25D9", - "whitecornerbracketleft", "u300E", - "whitecornerbracketleftvertical", "uFE43", - "whitecornerbracketright", "u300F", - "whitecornerbracketrightvertical", "uFE44", - "whitediamond", "u25C7", - "whitediamondcontainingblacksmalldiamond", "u25C8", - "whitedownpointingsmalltriangle", "u25BF", - "whitedownpointingtriangle", "u25BD", - "whiteleftpointingsmalltriangle", "u25C3", - "whiteleftpointingtriangle", "u25C1", - "whitelenticularbracketleft", "u3016", - "whitelenticularbracketright", "u3017", - "whiterightpointingsmalltriangle", "u25B9", - "whiterightpointingtriangle", "u25B7", - "whitesmallsquare", "u25AB", - "whitesmilingface", "u263A", - "whitesquare", "u25A1", - "whitestar", "u2606", - "whitetelephone", "u260F", - "whitetortoiseshellbracketleft", "u3018", - "whitetortoiseshellbracketright", "u3019", - "whiteuppointingsmalltriangle", "u25B5", - "whiteuppointingtriangle", "u25B3", - "wihiragana", "u3090", - "wikatakana", "u30F0", - "wikorean", "u315F", - "wmonospace", "uFF57", - "wohiragana", "u3092", - "wokatakana", "u30F2", - "wokatakanahalfwidth", "uFF66", - "won", "u20A9", - "wonmonospace", "uFFE6", - "wowaenthai", "u0E27", - "wparen", "u24B2", - "wring", "u1E98", - "wsuperior", "u02B7", - "wturned", "u028D", - "wynn", "u01BF", - "x", "u0078", - "xabovecmb", "u033D", - "xbopomofo", "u3112", - "xcircle", "u24E7", - "xdieresis", "u1E8D", - "xdotaccent", "u1E8B", - "xeharmenian", "u056D", - "xi", "u03BE", - "xmonospace", "uFF58", - "xparen", "u24B3", - "xsuperior", "u02E3", - "y", "u0079", - "yaadosquare", "u334E", - "yabengali", "u09AF", - "yacute", "u00FD", - "yadeva", "u092F", - "yaekorean", "u3152", - "yagujarati", "u0AAF", - "yagurmukhi", "u0A2F", - "yahiragana", "u3084", - "yakatakana", "u30E4", - "yakatakanahalfwidth", "uFF94", - "yakorean", "u3151", - "yamakkanthai", "u0E4E", - "yasmallhiragana", "u3083", - "yasmallkatakana", "u30E3", - "yasmallkatakanahalfwidth", "uFF6C", - "yatcyrillic", "u0463", - "ycircle", "u24E8", - "ycircumflex", "u0177", - "ydieresis", "u00FF", - "ydotaccent", "u1E8F", - "ydotbelow", "u1EF5", - "yeharabic", "u064A", - "yehbarreearabic", "u06D2", - "yehbarreefinalarabic", "uFBAF", - "yehfinalarabic", "uFEF2", - "yehhamzaabovearabic", "u0626", - "yehhamzaabovefinalarabic", "uFE8A", - "yehhamzaaboveinitialarabic", "uFE8B", - "yehhamzaabovemedialarabic", "uFE8C", - "yehinitialarabic", "uFEF3", - "yehmedialarabic", "uFEF4", - "yehmeeminitialarabic", "uFCDD", - "yehmeemisolatedarabic", "uFC58", - "yehnoonfinalarabic", "uFC94", - "yehthreedotsbelowarabic", "u06D1", - "yekorean", "u3156", - "yen", "u00A5", - "yenmonospace", "uFFE5", - "yeokorean", "u3155", - "yeorinhieuhkorean", "u3186", - "yerahbenyomohebrew", "u05AA", - "yerahbenyomolefthebrew", "u05AA", - "yericyrillic", "u044B", - "yerudieresiscyrillic", "u04F9", - "yesieungkorean", "u3181", - "yesieungpansioskorean", "u3183", - "yesieungsioskorean", "u3182", - "yetivhebrew", "u059A", - "ygrave", "u1EF3", - "yhook", "u01B4", - "yhookabove", "u1EF7", - "yiarmenian", "u0575", - "yicyrillic", "u0457", - "yikorean", "u3162", - "yinyang", "u262F", - "yiwnarmenian", "u0582", - "ymonospace", "uFF59", - "yod", "u05D9", - "yoddagesh", "uFB39", - "yoddageshhebrew", "uFB39", - "yodhebrew", "u05D9", - "yodyodhebrew", "u05F2", - "yodyodpatahhebrew", "uFB1F", - "yohiragana", "u3088", - "yoikorean", "u3189", - "yokatakana", "u30E8", - "yokatakanahalfwidth", "uFF96", - "yokorean", "u315B", - "yosmallhiragana", "u3087", - "yosmallkatakana", "u30E7", - "yosmallkatakanahalfwidth", "uFF6E", - "yotgreek", "u03F3", - "yoyaekorean", "u3188", - "yoyakorean", "u3187", - "yoyakthai", "u0E22", - "yoyingthai", "u0E0D", - "yparen", "u24B4", - "ypogegrammeni", "u037A", - "ypogegrammenigreekcmb", "u0345", - "yr", "u01A6", - "yring", "u1E99", - "ysuperior", "u02B8", - "ytilde", "u1EF9", - "yturned", "u028E", - "yuhiragana", "u3086", - "yuikorean", "u318C", - "yukatakana", "u30E6", - "yukatakanahalfwidth", "uFF95", - "yukorean", "u3160", - "yusbigcyrillic", "u046B", - "yusbigiotifiedcyrillic", "u046D", - "yuslittlecyrillic", "u0467", - "yuslittleiotifiedcyrillic", "u0469", - "yusmallhiragana", "u3085", - "yusmallkatakana", "u30E5", - "yusmallkatakanahalfwidth", "uFF6D", - "yuyekorean", "u318B", - "yuyeokorean", "u318A", - "yyabengali", "u09DF", - "yyadeva", "u095F", - "z", "u007A", - "zaarmenian", "u0566", - "zacute", "u017A", - "zadeva", "u095B", - "zagurmukhi", "u0A5B", - "zaharabic", "u0638", - "zahfinalarabic", "uFEC6", - "zahinitialarabic", "uFEC7", - "zahiragana", "u3056", - "zahmedialarabic", "uFEC8", - "zainarabic", "u0632", - "zainfinalarabic", "uFEB0", - "zakatakana", "u30B6", - "zaqefgadolhebrew", "u0595", - "zaqefqatanhebrew", "u0594", - "zarqahebrew", "u0598", - "zayin", "u05D6", - "zayindagesh", "uFB36", - "zayindageshhebrew", "uFB36", - "zayinhebrew", "u05D6", - "zbopomofo", "u3117", - "zcaron", "u017E", - "zcircle", "u24E9", - "zcircumflex", "u1E91", - "zcurl", "u0291", - "zdot", "u017C", - "zdotaccent", "u017C", - "zdotbelow", "u1E93", - "zecyrillic", "u0437", - "zedescendercyrillic", "u0499", - "zedieresiscyrillic", "u04DF", - "zehiragana", "u305C", - "zekatakana", "u30BC", - "zero", "u0030", - "zeroarabic", "u0660", - "zerobengali", "u09E6", - "zerodeva", "u0966", - "zerogujarati", "u0AE6", - "zerogurmukhi", "u0A66", - "zerohackarabic", "u0660", - "zeroinferior", "u2080", - "zeromonospace", "uFF10", - "zeropersian", "u06F0", - "zerosuperior", "u2070", - "zerothai", "u0E50", - "zerowidthjoiner", "uFEFF", - "zerowidthnonjoiner", "u200C", - "zerowidthspace", "u200B", - "zeta", "u03B6", - "zhbopomofo", "u3113", - "zhearmenian", "u056A", - "zhebrevecyrillic", "u04C2", - "zhecyrillic", "u0436", - "zhedescendercyrillic", "u0497", - "zhedieresiscyrillic", "u04DD", - "zihiragana", "u3058", - "zikatakana", "u30B8", - "zinorhebrew", "u05AE", - "zlinebelow", "u1E95", - "zmonospace", "uFF5A", - "zohiragana", "u305E", - "zokatakana", "u30BE", - "zparen", "u24B5", - "zretroflexhook", "u0290", - "zstroke", "u01B6", - "zuhiragana", "u305A", - "zukatakana", "u30BA", +my %AGL_to_unicode = ( + "A", "0041", + "AE", "00C6", + "AEacute", "01FC", + "AEmacron", "01E2", + "Aacute", "00C1", + "Abreve", "0102", + "Abreveacute", "1EAE", + "Abrevecyrillic", "04D0", + "Abrevedotbelow", "1EB6", + "Abrevegrave", "1EB0", + "Abrevehookabove", "1EB2", + "Abrevetilde", "1EB4", + "Acaron", "01CD", + "Acircle", "24B6", + "Acircumflex", "00C2", + "Acircumflexacute", "1EA4", + "Acircumflexdotbelow", "1EAC", + "Acircumflexgrave", "1EA6", + "Acircumflexhookabove", "1EA8", + "Acircumflextilde", "1EAA", + "Acyrillic", "0410", + "Adblgrave", "0200", + "Adieresis", "00C4", + "Adieresiscyrillic", "04D2", + "Adieresismacron", "01DE", + "Adotbelow", "1EA0", + "Adotmacron", "01E0", + "Agrave", "00C0", + "Ahookabove", "1EA2", + "Aiecyrillic", "04D4", + "Ainvertedbreve", "0202", + "Alpha", "0391", + "Alphatonos", "0386", + "Amacron", "0100", + "Amonospace", "FF21", + "Aogonek", "0104", + "Aring", "00C5", + "Aringacute", "01FA", + "Aringbelow", "1E00", + "Atilde", "00C3", + "Aybarmenian", "0531", + "B", "0042", + "Bcircle", "24B7", + "Bdotaccent", "1E02", + "Bdotbelow", "1E04", + "Becyrillic", "0411", + "Benarmenian", "0532", + "Beta", "0392", + "Bhook", "0181", + "Blinebelow", "1E06", + "Bmonospace", "FF22", + "Btopbar", "0182", + "C", "0043", + "Caarmenian", "053E", + "Cacute", "0106", + "Ccaron", "010C", + "Ccedilla", "00C7", + "Ccedillaacute", "1E08", + "Ccircle", "24B8", + "Ccircumflex", "0108", + "Cdot", "010A", + "Cdotaccent", "010A", + "Chaarmenian", "0549", + "Cheabkhasiancyrillic", "04BC", + "Checyrillic", "0427", + "Chedescenderabkhasiancyrillic", "04BE", + "Chedescendercyrillic", "04B6", + "Chedieresiscyrillic", "04F4", + "Cheharmenian", "0543", + "Chekhakassiancyrillic", "04CB", + "Cheverticalstrokecyrillic", "04B8", + "Chi", "03A7", + "Chook", "0187", + "Cmonospace", "FF23", + "Coarmenian", "0551", + "D", "0044", + "DZ", "01F1", + "DZcaron", "01C4", + "Daarmenian", "0534", + "Dafrican", "0189", + "Dcaron", "010E", + "Dcedilla", "1E10", + "Dcircle", "24B9", + "Dcircumflexbelow", "1E12", + "Dcroat", "0110", + "Ddotaccent", "1E0A", + "Ddotbelow", "1E0C", + "Decyrillic", "0414", + "Deicoptic", "03EE", + "Delta", "2206", + "Deltagreek", "0394", + "Dhook", "018A", + "Digammagreek", "03DC", + "Djecyrillic", "0402", + "Dlinebelow", "1E0E", + "Dmonospace", "FF24", + "Dslash", "0110", + "Dtopbar", "018B", + "Dz", "01F2", + "Dzcaron", "01C5", + "Dzeabkhasiancyrillic", "04E0", + "Dzecyrillic", "0405", + "Dzhecyrillic", "040F", + "E", "0045", + "Eacute", "00C9", + "Ebreve", "0114", + "Ecaron", "011A", + "Ecedillabreve", "1E1C", + "Echarmenian", "0535", + "Ecircle", "24BA", + "Ecircumflex", "00CA", + "Ecircumflexacute", "1EBE", + "Ecircumflexbelow", "1E18", + "Ecircumflexdotbelow", "1EC6", + "Ecircumflexgrave", "1EC0", + "Ecircumflexhookabove", "1EC2", + "Ecircumflextilde", "1EC4", + "Ecyrillic", "0404", + "Edblgrave", "0204", + "Edieresis", "00CB", + "Edot", "0116", + "Edotaccent", "0116", + "Edotbelow", "1EB8", + "Efcyrillic", "0424", + "Egrave", "00C8", + "Eharmenian", "0537", + "Ehookabove", "1EBA", + "Eightroman", "2167", + "Einvertedbreve", "0206", + "Eiotifiedcyrillic", "0464", + "Elcyrillic", "041B", + "Elevenroman", "216A", + "Emacron", "0112", + "Emacronacute", "1E16", + "Emacrongrave", "1E14", + "Emcyrillic", "041C", + "Emonospace", "FF25", + "Encyrillic", "041D", + "Endescendercyrillic", "04A2", + "Eng", "014A", + "Enghecyrillic", "04A4", + "Enhookcyrillic", "04C7", + "Eogonek", "0118", + "Eopen", "0190", + "Epsilon", "0395", + "Epsilontonos", "0388", + "Ercyrillic", "0420", + "Ereversed", "018E", + "Ereversedcyrillic", "042D", + "Escyrillic", "0421", + "Esdescendercyrillic", "04AA", + "Esh", "01A9", + "Eta", "0397", + "Etarmenian", "0538", + "Etatonos", "0389", + "Eth", "00D0", + "Etilde", "1EBC", + "Etildebelow", "1E1A", + "Euro", "20AC", + "Ezh", "01B7", + "Ezhcaron", "01EE", + "Ezhreversed", "01B8", + "F", "0046", + "Fcircle", "24BB", + "Fdotaccent", "1E1E", + "Feharmenian", "0556", + "Feicoptic", "03E4", + "Fhook", "0191", + "Fitacyrillic", "0472", + "Fiveroman", "2164", + "Fmonospace", "FF26", + "Fourroman", "2163", + "G", "0047", + "GBsquare", "3387", + "Gacute", "01F4", + "Gamma", "0393", + "Gammaafrican", "0194", + "Gangiacoptic", "03EA", + "Gbreve", "011E", + "Gcaron", "01E6", + "Gcedilla", "0122", + "Gcircle", "24BC", + "Gcircumflex", "011C", + "Gcommaaccent", "0122", + "Gdot", "0120", + "Gdotaccent", "0120", + "Gecyrillic", "0413", + "Ghadarmenian", "0542", + "Ghemiddlehookcyrillic", "0494", + "Ghestrokecyrillic", "0492", + "Gheupturncyrillic", "0490", + "Ghook", "0193", + "Gimarmenian", "0533", + "Gjecyrillic", "0403", + "Gmacron", "1E20", + "Gmonospace", "FF27", + "Gsmallhook", "029B", + "Gstroke", "01E4", + "H", "0048", + "H18533", "25CF", + "H18543", "25AA", + "H18551", "25AB", + "H22073", "25A1", + "HPsquare", "33CB", + "Haabkhasiancyrillic", "04A8", + "Hadescendercyrillic", "04B2", + "Hardsigncyrillic", "042A", + "Hbar", "0126", + "Hbrevebelow", "1E2A", + "Hcedilla", "1E28", + "Hcircle", "24BD", + "Hcircumflex", "0124", + "Hdieresis", "1E26", + "Hdotaccent", "1E22", + "Hdotbelow", "1E24", + "Hmonospace", "FF28", + "Hoarmenian", "0540", + "Horicoptic", "03E8", + "Hzsquare", "3390", + "I", "0049", + "IAcyrillic", "042F", + "IJ", "0132", + "IUcyrillic", "042E", + "Iacute", "00CD", + "Ibreve", "012C", + "Icaron", "01CF", + "Icircle", "24BE", + "Icircumflex", "00CE", + "Icyrillic", "0406", + "Idblgrave", "0208", + "Idieresis", "00CF", + "Idieresisacute", "1E2E", + "Idieresiscyrillic", "04E4", + "Idot", "0130", + "Idotaccent", "0130", + "Idotbelow", "1ECA", + "Iebrevecyrillic", "04D6", + "Iecyrillic", "0415", + "Ifraktur", "2111", + "Igrave", "00CC", + "Ihookabove", "1EC8", + "Iicyrillic", "0418", + "Iinvertedbreve", "020A", + "Iishortcyrillic", "0419", + "Imacron", "012A", + "Imacroncyrillic", "04E2", + "Imonospace", "FF29", + "Iniarmenian", "053B", + "Iocyrillic", "0401", + "Iogonek", "012E", + "Iota", "0399", + "Iotaafrican", "0196", + "Iotadieresis", "03AA", + "Iotatonos", "038A", + "Istroke", "0197", + "Itilde", "0128", + "Itildebelow", "1E2C", + "Izhitsacyrillic", "0474", + "Izhitsadblgravecyrillic", "0476", + "J", "004A", + "Jaarmenian", "0541", + "Jcircle", "24BF", + "Jcircumflex", "0134", + "Jecyrillic", "0408", + "Jheharmenian", "054B", + "Jmonospace", "FF2A", + "K", "004B", + "KBsquare", "3385", + "KKsquare", "33CD", + "Kabashkircyrillic", "04A0", + "Kacute", "1E30", + "Kacyrillic", "041A", + "Kadescendercyrillic", "049A", + "Kahookcyrillic", "04C3", + "Kappa", "039A", + "Kastrokecyrillic", "049E", + "Kaverticalstrokecyrillic", "049C", + "Kcaron", "01E8", + "Kcedilla", "0136", + "Kcircle", "24C0", + "Kcommaaccent", "0136", + "Kdotbelow", "1E32", + "Keharmenian", "0554", + "Kenarmenian", "053F", + "Khacyrillic", "0425", + "Kheicoptic", "03E6", + "Khook", "0198", + "Kjecyrillic", "040C", + "Klinebelow", "1E34", + "Kmonospace", "FF2B", + "Koppacyrillic", "0480", + "Koppagreek", "03DE", + "Ksicyrillic", "046E", + "L", "004C", + "LJ", "01C7", + "Lacute", "0139", + "Lambda", "039B", + "Lcaron", "013D", + "Lcedilla", "013B", + "Lcircle", "24C1", + "Lcircumflexbelow", "1E3C", + "Lcommaaccent", "013B", + "Ldot", "013F", + "Ldotaccent", "013F", + "Ldotbelow", "1E36", + "Ldotbelowmacron", "1E38", + "Liwnarmenian", "053C", + "Lj", "01C8", + "Ljecyrillic", "0409", + "Llinebelow", "1E3A", + "Lmonospace", "FF2C", + "Lslash", "0141", + "M", "004D", + "MBsquare", "3386", + "Macute", "1E3E", + "Mcircle", "24C2", + "Mdotaccent", "1E40", + "Mdotbelow", "1E42", + "Menarmenian", "0544", + "Mmonospace", "FF2D", + "Mturned", "019C", + "Mu", "039C", + "N", "004E", + "NJ", "01CA", + "Nacute", "0143", + "Ncaron", "0147", + "Ncedilla", "0145", + "Ncircle", "24C3", + "Ncircumflexbelow", "1E4A", + "Ncommaaccent", "0145", + "Ndotaccent", "1E44", + "Ndotbelow", "1E46", + "Nhookleft", "019D", + "Nineroman", "2168", + "Nj", "01CB", + "Njecyrillic", "040A", + "Nlinebelow", "1E48", + "Nmonospace", "FF2E", + "Nowarmenian", "0546", + "Ntilde", "00D1", + "Nu", "039D", + "O", "004F", + "OE", "0152", + "Oacute", "00D3", + "Obarredcyrillic", "04E8", + "Obarreddieresiscyrillic", "04EA", + "Obreve", "014E", + "Ocaron", "01D1", + "Ocenteredtilde", "019F", + "Ocircle", "24C4", + "Ocircumflex", "00D4", + "Ocircumflexacute", "1ED0", + "Ocircumflexdotbelow", "1ED8", + "Ocircumflexgrave", "1ED2", + "Ocircumflexhookabove", "1ED4", + "Ocircumflextilde", "1ED6", + "Ocyrillic", "041E", + "Odblacute", "0150", + "Odblgrave", "020C", + "Odieresis", "00D6", + "Odieresiscyrillic", "04E6", + "Odotbelow", "1ECC", + "Ograve", "00D2", + "Oharmenian", "0555", + "Ohm", "2126", + "Ohookabove", "1ECE", + "Ohorn", "01A0", + "Ohornacute", "1EDA", + "Ohorndotbelow", "1EE2", + "Ohorngrave", "1EDC", + "Ohornhookabove", "1EDE", + "Ohorntilde", "1EE0", + "Ohungarumlaut", "0150", + "Oi", "01A2", + "Oinvertedbreve", "020E", + "Omacron", "014C", + "Omacronacute", "1E52", + "Omacrongrave", "1E50", + "Omega", "2126", + "Omegacyrillic", "0460", + "Omegagreek", "03A9", + "Omegaroundcyrillic", "047A", + "Omegatitlocyrillic", "047C", + "Omegatonos", "038F", + "Omicron", "039F", + "Omicrontonos", "038C", + "Omonospace", "FF2F", + "Oneroman", "2160", + "Oogonek", "01EA", + "Oogonekmacron", "01EC", + "Oopen", "0186", + "Oslash", "00D8", + "Oslashacute", "01FE", + "Ostrokeacute", "01FE", + "Otcyrillic", "047E", + "Otilde", "00D5", + "Otildeacute", "1E4C", + "Otildedieresis", "1E4E", + "P", "0050", + "Pacute", "1E54", + "Pcircle", "24C5", + "Pdotaccent", "1E56", + "Pecyrillic", "041F", + "Peharmenian", "054A", + "Pemiddlehookcyrillic", "04A6", + "Phi", "03A6", + "Phook", "01A4", + "Pi", "03A0", + "Piwrarmenian", "0553", + "Pmonospace", "FF30", + "Psi", "03A8", + "Psicyrillic", "0470", + "Q", "0051", + "Qcircle", "24C6", + "Qmonospace", "FF31", + "R", "0052", + "Raarmenian", "054C", + "Racute", "0154", + "Rcaron", "0158", + "Rcedilla", "0156", + "Rcircle", "24C7", + "Rcommaaccent", "0156", + "Rdblgrave", "0210", + "Rdotaccent", "1E58", + "Rdotbelow", "1E5A", + "Rdotbelowmacron", "1E5C", + "Reharmenian", "0550", + "Rfraktur", "211C", + "Rho", "03A1", + "Rinvertedbreve", "0212", + "Rlinebelow", "1E5E", + "Rmonospace", "FF32", + "Rsmallinverted", "0281", + "Rsmallinvertedsuperior", "02B6", + "S", "0053", + "SF010000", "250C", + "SF020000", "2514", + "SF030000", "2510", + "SF040000", "2518", + "SF050000", "253C", + "SF060000", "252C", + "SF070000", "2534", + "SF080000", "251C", + "SF090000", "2524", + "SF100000", "2500", + "SF110000", "2502", + "SF190000", "2561", + "SF200000", "2562", + "SF210000", "2556", + "SF220000", "2555", + "SF230000", "2563", + "SF240000", "2551", + "SF250000", "2557", + "SF260000", "255D", + "SF270000", "255C", + "SF280000", "255B", + "SF360000", "255E", + "SF370000", "255F", + "SF380000", "255A", + "SF390000", "2554", + "SF400000", "2569", + "SF410000", "2566", + "SF420000", "2560", + "SF430000", "2550", + "SF440000", "256C", + "SF450000", "2567", + "SF460000", "2568", + "SF470000", "2564", + "SF480000", "2565", + "SF490000", "2559", + "SF500000", "2558", + "SF510000", "2552", + "SF520000", "2553", + "SF530000", "256B", + "SF540000", "256A", + "Sacute", "015A", + "Sacutedotaccent", "1E64", + "Sampigreek", "03E0", + "Scaron", "0160", + "Scarondotaccent", "1E66", + "Scedilla", "015E", + "Schwa", "018F", + "Schwacyrillic", "04D8", + "Schwadieresiscyrillic", "04DA", + "Scircle", "24C8", + "Scircumflex", "015C", + "Scommaaccent", "0218", + "Sdotaccent", "1E60", + "Sdotbelow", "1E62", + "Sdotbelowdotaccent", "1E68", + "Seharmenian", "054D", + "Sevenroman", "2166", + "Shaarmenian", "0547", + "Shacyrillic", "0428", + "Shchacyrillic", "0429", + "Sheicoptic", "03E2", + "Shhacyrillic", "04BA", + "Shimacoptic", "03EC", + "Sigma", "03A3", + "Sixroman", "2165", + "Smonospace", "FF33", + "Softsigncyrillic", "042C", + "Stigmagreek", "03DA", + "T", "0054", + "Tau", "03A4", + "Tbar", "0166", + "Tcaron", "0164", + "Tcedilla", "0162", + "Tcircle", "24C9", + "Tcircumflexbelow", "1E70", + "Tcommaaccent", "0162", + "Tdotaccent", "1E6A", + "Tdotbelow", "1E6C", + "Tecyrillic", "0422", + "Tedescendercyrillic", "04AC", + "Tenroman", "2169", + "Tetsecyrillic", "04B4", + "Theta", "0398", + "Thook", "01AC", + "Thorn", "00DE", + "Threeroman", "2162", + "Tiwnarmenian", "054F", + "Tlinebelow", "1E6E", + "Tmonospace", "FF34", + "Toarmenian", "0539", + "Tonefive", "01BC", + "Tonesix", "0184", + "Tonetwo", "01A7", + "Tretroflexhook", "01AE", + "Tsecyrillic", "0426", + "Tshecyrillic", "040B", + "Twelveroman", "216B", + "Tworoman", "2161", + "U", "0055", + "Uacute", "00DA", + "Ubreve", "016C", + "Ucaron", "01D3", + "Ucircle", "24CA", + "Ucircumflex", "00DB", + "Ucircumflexbelow", "1E76", + "Ucyrillic", "0423", + "Udblacute", "0170", + "Udblgrave", "0214", + "Udieresis", "00DC", + "Udieresisacute", "01D7", + "Udieresisbelow", "1E72", + "Udieresiscaron", "01D9", + "Udieresiscyrillic", "04F0", + "Udieresisgrave", "01DB", + "Udieresismacron", "01D5", + "Udotbelow", "1EE4", + "Ugrave", "00D9", + "Uhookabove", "1EE6", + "Uhorn", "01AF", + "Uhornacute", "1EE8", + "Uhorndotbelow", "1EF0", + "Uhorngrave", "1EEA", + "Uhornhookabove", "1EEC", + "Uhorntilde", "1EEE", + "Uhungarumlaut", "0170", + "Uhungarumlautcyrillic", "04F2", + "Uinvertedbreve", "0216", + "Ukcyrillic", "0478", + "Umacron", "016A", + "Umacroncyrillic", "04EE", + "Umacrondieresis", "1E7A", + "Umonospace", "FF35", + "Uogonek", "0172", + "Upsilon", "03A5", + "Upsilon1", "03D2", + "Upsilonacutehooksymbolgreek", "03D3", + "Upsilonafrican", "01B1", + "Upsilondieresis", "03AB", + "Upsilondieresishooksymbolgreek", "03D4", + "Upsilonhooksymbol", "03D2", + "Upsilontonos", "038E", + "Uring", "016E", + "Ushortcyrillic", "040E", + "Ustraightcyrillic", "04AE", + "Ustraightstrokecyrillic", "04B0", + "Utilde", "0168", + "Utildeacute", "1E78", + "Utildebelow", "1E74", + "V", "0056", + "Vcircle", "24CB", + "Vdotbelow", "1E7E", + "Vecyrillic", "0412", + "Vewarmenian", "054E", + "Vhook", "01B2", + "Vmonospace", "FF36", + "Voarmenian", "0548", + "Vtilde", "1E7C", + "W", "0057", + "Wacute", "1E82", + "Wcircle", "24CC", + "Wcircumflex", "0174", + "Wdieresis", "1E84", + "Wdotaccent", "1E86", + "Wdotbelow", "1E88", + "Wgrave", "1E80", + "Wmonospace", "FF37", + "X", "0058", + "Xcircle", "24CD", + "Xdieresis", "1E8C", + "Xdotaccent", "1E8A", + "Xeharmenian", "053D", + "Xi", "039E", + "Xmonospace", "FF38", + "Y", "0059", + "Yacute", "00DD", + "Yatcyrillic", "0462", + "Ycircle", "24CE", + "Ycircumflex", "0176", + "Ydieresis", "0178", + "Ydotaccent", "1E8E", + "Ydotbelow", "1EF4", + "Yericyrillic", "042B", + "Yerudieresiscyrillic", "04F8", + "Ygrave", "1EF2", + "Yhook", "01B3", + "Yhookabove", "1EF6", + "Yiarmenian", "0545", + "Yicyrillic", "0407", + "Yiwnarmenian", "0552", + "Ymonospace", "FF39", + "Ytilde", "1EF8", + "Yusbigcyrillic", "046A", + "Yusbigiotifiedcyrillic", "046C", + "Yuslittlecyrillic", "0466", + "Yuslittleiotifiedcyrillic", "0468", + "Z", "005A", + "Zaarmenian", "0536", + "Zacute", "0179", + "Zcaron", "017D", + "Zcircle", "24CF", + "Zcircumflex", "1E90", + "Zdot", "017B", + "Zdotaccent", "017B", + "Zdotbelow", "1E92", + "Zecyrillic", "0417", + "Zedescendercyrillic", "0498", + "Zedieresiscyrillic", "04DE", + "Zeta", "0396", + "Zhearmenian", "053A", + "Zhebrevecyrillic", "04C1", + "Zhecyrillic", "0416", + "Zhedescendercyrillic", "0496", + "Zhedieresiscyrillic", "04DC", + "Zlinebelow", "1E94", + "Zmonospace", "FF3A", + "Zstroke", "01B5", + "a", "0061", + "aabengali", "0986", + "aacute", "00E1", + "aadeva", "0906", + "aagujarati", "0A86", + "aagurmukhi", "0A06", + "aamatragurmukhi", "0A3E", + "aarusquare", "3303", + "aavowelsignbengali", "09BE", + "aavowelsigndeva", "093E", + "aavowelsigngujarati", "0ABE", + "abbreviationmarkarmenian", "055F", + "abbreviationsigndeva", "0970", + "abengali", "0985", + "abopomofo", "311A", + "abreve", "0103", + "abreveacute", "1EAF", + "abrevecyrillic", "04D1", + "abrevedotbelow", "1EB7", + "abrevegrave", "1EB1", + "abrevehookabove", "1EB3", + "abrevetilde", "1EB5", + "acaron", "01CE", + "acircle", "24D0", + "acircumflex", "00E2", + "acircumflexacute", "1EA5", + "acircumflexdotbelow", "1EAD", + "acircumflexgrave", "1EA7", + "acircumflexhookabove", "1EA9", + "acircumflextilde", "1EAB", + "acute", "00B4", + "acutebelowcmb", "0317", + "acutecmb", "0301", + "acutecomb", "0301", + "acutedeva", "0954", + "acutelowmod", "02CF", + "acutetonecmb", "0341", + "acyrillic", "0430", + "adblgrave", "0201", + "addakgurmukhi", "0A71", + "adeva", "0905", + "adieresis", "00E4", + "adieresiscyrillic", "04D3", + "adieresismacron", "01DF", + "adotbelow", "1EA1", + "adotmacron", "01E1", + "ae", "00E6", + "aeacute", "01FD", + "aekorean", "3150", + "aemacron", "01E3", + "afii00208", "2015", + "afii08941", "20A4", + "afii10017", "0410", + "afii10018", "0411", + "afii10019", "0412", + "afii10020", "0413", + "afii10021", "0414", + "afii10022", "0415", + "afii10023", "0401", + "afii10024", "0416", + "afii10025", "0417", + "afii10026", "0418", + "afii10027", "0419", + "afii10028", "041A", + "afii10029", "041B", + "afii10030", "041C", + "afii10031", "041D", + "afii10032", "041E", + "afii10033", "041F", + "afii10034", "0420", + "afii10035", "0421", + "afii10036", "0422", + "afii10037", "0423", + "afii10038", "0424", + "afii10039", "0425", + "afii10040", "0426", + "afii10041", "0427", + "afii10042", "0428", + "afii10043", "0429", + "afii10044", "042A", + "afii10045", "042B", + "afii10046", "042C", + "afii10047", "042D", + "afii10048", "042E", + "afii10049", "042F", + "afii10050", "0490", + "afii10051", "0402", + "afii10052", "0403", + "afii10053", "0404", + "afii10054", "0405", + "afii10055", "0406", + "afii10056", "0407", + "afii10057", "0408", + "afii10058", "0409", + "afii10059", "040A", + "afii10060", "040B", + "afii10061", "040C", + "afii10062", "040E", + "afii10065", "0430", + "afii10066", "0431", + "afii10067", "0432", + "afii10068", "0433", + "afii10069", "0434", + "afii10070", "0435", + "afii10071", "0451", + "afii10072", "0436", + "afii10073", "0437", + "afii10074", "0438", + "afii10075", "0439", + "afii10076", "043A", + "afii10077", "043B", + "afii10078", "043C", + "afii10079", "043D", + "afii10080", "043E", + "afii10081", "043F", + "afii10082", "0440", + "afii10083", "0441", + "afii10084", "0442", + "afii10085", "0443", + "afii10086", "0444", + "afii10087", "0445", + "afii10088", "0446", + "afii10089", "0447", + "afii10090", "0448", + "afii10091", "0449", + "afii10092", "044A", + "afii10093", "044B", + "afii10094", "044C", + "afii10095", "044D", + "afii10096", "044E", + "afii10097", "044F", + "afii10098", "0491", + "afii10099", "0452", + "afii10100", "0453", + "afii10101", "0454", + "afii10102", "0455", + "afii10103", "0456", + "afii10104", "0457", + "afii10105", "0458", + "afii10106", "0459", + "afii10107", "045A", + "afii10108", "045B", + "afii10109", "045C", + "afii10110", "045E", + "afii10145", "040F", + "afii10146", "0462", + "afii10147", "0472", + "afii10148", "0474", + "afii10193", "045F", + "afii10194", "0463", + "afii10195", "0473", + "afii10196", "0475", + "afii10846", "04D9", + "afii299", "200E", + "afii300", "200F", + "afii301", "200D", + "afii57381", "066A", + "afii57388", "060C", + "afii57392", "0660", + "afii57393", "0661", + "afii57394", "0662", + "afii57395", "0663", + "afii57396", "0664", + "afii57397", "0665", + "afii57398", "0666", + "afii57399", "0667", + "afii57400", "0668", + "afii57401", "0669", + "afii57403", "061B", + "afii57407", "061F", + "afii57409", "0621", + "afii57410", "0622", + "afii57411", "0623", + "afii57412", "0624", + "afii57413", "0625", + "afii57414", "0626", + "afii57415", "0627", + "afii57416", "0628", + "afii57417", "0629", + "afii57418", "062A", + "afii57419", "062B", + "afii57420", "062C", + "afii57421", "062D", + "afii57422", "062E", + "afii57423", "062F", + "afii57424", "0630", + "afii57425", "0631", + "afii57426", "0632", + "afii57427", "0633", + "afii57428", "0634", + "afii57429", "0635", + "afii57430", "0636", + "afii57431", "0637", + "afii57432", "0638", + "afii57433", "0639", + "afii57434", "063A", + "afii57440", "0640", + "afii57441", "0641", + "afii57442", "0642", + "afii57443", "0643", + "afii57444", "0644", + "afii57445", "0645", + "afii57446", "0646", + "afii57448", "0648", + "afii57449", "0649", + "afii57450", "064A", + "afii57451", "064B", + "afii57452", "064C", + "afii57453", "064D", + "afii57454", "064E", + "afii57455", "064F", + "afii57456", "0650", + "afii57457", "0651", + "afii57458", "0652", + "afii57470", "0647", + "afii57505", "06A4", + "afii57506", "067E", + "afii57507", "0686", + "afii57508", "0698", + "afii57509", "06AF", + "afii57511", "0679", + "afii57512", "0688", + "afii57513", "0691", + "afii57514", "06BA", + "afii57519", "06D2", + "afii57534", "06D5", + "afii57636", "20AA", + "afii57645", "05BE", + "afii57658", "05C3", + "afii57664", "05D0", + "afii57665", "05D1", + "afii57666", "05D2", + "afii57667", "05D3", + "afii57668", "05D4", + "afii57669", "05D5", + "afii57670", "05D6", + "afii57671", "05D7", + "afii57672", "05D8", + "afii57673", "05D9", + "afii57674", "05DA", + "afii57675", "05DB", + "afii57676", "05DC", + "afii57677", "05DD", + "afii57678", "05DE", + "afii57679", "05DF", + "afii57680", "05E0", + "afii57681", "05E1", + "afii57682", "05E2", + "afii57683", "05E3", + "afii57684", "05E4", + "afii57685", "05E5", + "afii57686", "05E6", + "afii57687", "05E7", + "afii57688", "05E8", + "afii57689", "05E9", + "afii57690", "05EA", + "afii57694", "FB2A", + "afii57695", "FB2B", + "afii57700", "FB4B", + "afii57705", "FB1F", + "afii57716", "05F0", + "afii57717", "05F1", + "afii57718", "05F2", + "afii57723", "FB35", + "afii57793", "05B4", + "afii57794", "05B5", + "afii57795", "05B6", + "afii57796", "05BB", + "afii57797", "05B8", + "afii57798", "05B7", + "afii57799", "05B0", + "afii57800", "05B2", + "afii57801", "05B1", + "afii57802", "05B3", + "afii57803", "05C2", + "afii57804", "05C1", + "afii57806", "05B9", + "afii57807", "05BC", + "afii57839", "05BD", + "afii57841", "05BF", + "afii57842", "05C0", + "afii57929", "02BC", + "afii61248", "2105", + "afii61289", "2113", + "afii61352", "2116", + "afii61573", "202C", + "afii61574", "202D", + "afii61575", "202E", + "afii61664", "200C", + "afii63167", "066D", + "afii64937", "02BD", + "agrave", "00E0", + "agujarati", "0A85", + "agurmukhi", "0A05", + "ahiragana", "3042", + "ahookabove", "1EA3", + "aibengali", "0990", + "aibopomofo", "311E", + "aideva", "0910", + "aiecyrillic", "04D5", + "aigujarati", "0A90", + "aigurmukhi", "0A10", + "aimatragurmukhi", "0A48", + "ainarabic", "0639", + "ainfinalarabic", "FECA", + "aininitialarabic", "FECB", + "ainmedialarabic", "FECC", + "ainvertedbreve", "0203", + "aivowelsignbengali", "09C8", + "aivowelsigndeva", "0948", + "aivowelsigngujarati", "0AC8", + "akatakana", "30A2", + "akatakanahalfwidth", "FF71", + "akorean", "314F", + "alef", "05D0", + "alefarabic", "0627", + "alefdageshhebrew", "FB30", + "aleffinalarabic", "FE8E", + "alefhamzaabovearabic", "0623", + "alefhamzaabovefinalarabic", "FE84", + "alefhamzabelowarabic", "0625", + "alefhamzabelowfinalarabic", "FE88", + "alefhebrew", "05D0", + "aleflamedhebrew", "FB4F", + "alefmaddaabovearabic", "0622", + "alefmaddaabovefinalarabic", "FE82", + "alefmaksuraarabic", "0649", + "alefmaksurafinalarabic", "FEF0", + "alefmaksurainitialarabic", "FEF3", + "alefmaksuramedialarabic", "FEF4", + "alefpatahhebrew", "FB2E", + "alefqamatshebrew", "FB2F", + "aleph", "2135", + "allequal", "224C", + "alpha", "03B1", + "alphatonos", "03AC", + "amacron", "0101", + "amonospace", "FF41", + "ampersand", "0026", + "ampersandmonospace", "FF06", + "amsquare", "33C2", + "anbopomofo", "3122", + "angbopomofo", "3124", + "angkhankhuthai", "0E5A", + "angle", "2220", + "anglebracketleft", "3008", + "anglebracketleftvertical", "FE3F", + "anglebracketright", "3009", + "anglebracketrightvertical", "FE40", + "angleleft", "2329", + "angleright", "232A", + "angstrom", "212B", + "anoteleia", "0387", + "anudattadeva", "0952", + "anusvarabengali", "0982", + "anusvaradeva", "0902", + "anusvaragujarati", "0A82", + "aogonek", "0105", + "apaatosquare", "3300", + "aparen", "249C", + "apostrophearmenian", "055A", + "apostrophemod", "02BC", + "approaches", "2250", + "approxequal", "2248", + "approxequalorimage", "2252", + "approximatelyequal", "2245", + "araeaekorean", "318E", + "araeakorean", "318D", + "arc", "2312", + "arighthalfring", "1E9A", + "aring", "00E5", + "aringacute", "01FB", + "aringbelow", "1E01", + "arrowboth", "2194", + "arrowdashdown", "21E3", + "arrowdashleft", "21E0", + "arrowdashright", "21E2", + "arrowdashup", "21E1", + "arrowdblboth", "21D4", + "arrowdbldown", "21D3", + "arrowdblleft", "21D0", + "arrowdblright", "21D2", + "arrowdblup", "21D1", + "arrowdown", "2193", + "arrowdownleft", "2199", + "arrowdownright", "2198", + "arrowdownwhite", "21E9", + "arrowheaddownmod", "02C5", + "arrowheadleftmod", "02C2", + "arrowheadrightmod", "02C3", + "arrowheadupmod", "02C4", + "arrowleft", "2190", + "arrowleftdbl", "21D0", + "arrowleftdblstroke", "21CD", + "arrowleftoverright", "21C6", + "arrowleftwhite", "21E6", + "arrowright", "2192", + "arrowrightdblstroke", "21CF", + "arrowrightheavy", "279E", + "arrowrightoverleft", "21C4", + "arrowrightwhite", "21E8", + "arrowtableft", "21E4", + "arrowtabright", "21E5", + "arrowup", "2191", + "arrowupdn", "2195", + "arrowupdnbse", "21A8", + "arrowupdownbase", "21A8", + "arrowupleft", "2196", + "arrowupleftofdown", "21C5", + "arrowupright", "2197", + "arrowupwhite", "21E7", + "asciicircum", "005E", + "asciicircummonospace", "FF3E", + "asciitilde", "007E", + "asciitildemonospace", "FF5E", + "ascript", "0251", + "ascriptturned", "0252", + "asmallhiragana", "3041", + "asmallkatakana", "30A1", + "asmallkatakanahalfwidth", "FF67", + "asterisk", "002A", + "asteriskaltonearabic", "066D", + "asteriskarabic", "066D", + "asteriskmath", "2217", + "asteriskmonospace", "FF0A", + "asterisksmall", "FE61", + "asterism", "2042", + "asymptoticallyequal", "2243", + "at", "0040", + "atilde", "00E3", + "atmonospace", "FF20", + "atsmall", "FE6B", + "aturned", "0250", + "aubengali", "0994", + "aubopomofo", "3120", + "audeva", "0914", + "augujarati", "0A94", + "augurmukhi", "0A14", + "aulengthmarkbengali", "09D7", + "aumatragurmukhi", "0A4C", + "auvowelsignbengali", "09CC", + "auvowelsigndeva", "094C", + "auvowelsigngujarati", "0ACC", + "avagrahadeva", "093D", + "aybarmenian", "0561", + "ayin", "05E2", + "ayinaltonehebrew", "FB20", + "ayinhebrew", "05E2", + "b", "0062", + "babengali", "09AC", + "backslash", "005C", + "backslashmonospace", "FF3C", + "badeva", "092C", + "bagujarati", "0AAC", + "bagurmukhi", "0A2C", + "bahiragana", "3070", + "bahtthai", "0E3F", + "bakatakana", "30D0", + "bar", "007C", + "barmonospace", "FF5C", + "bbopomofo", "3105", + "bcircle", "24D1", + "bdotaccent", "1E03", + "bdotbelow", "1E05", + "beamedsixteenthnotes", "266C", + "because", "2235", + "becyrillic", "0431", + "beharabic", "0628", + "behfinalarabic", "FE90", + "behinitialarabic", "FE91", + "behiragana", "3079", + "behmedialarabic", "FE92", + "behmeeminitialarabic", "FC9F", + "behmeemisolatedarabic", "FC08", + "behnoonfinalarabic", "FC6D", + "bekatakana", "30D9", + "benarmenian", "0562", + "bet", "05D1", + "beta", "03B2", + "betasymbolgreek", "03D0", + "betdagesh", "FB31", + "betdageshhebrew", "FB31", + "bethebrew", "05D1", + "betrafehebrew", "FB4C", + "bhabengali", "09AD", + "bhadeva", "092D", + "bhagujarati", "0AAD", + "bhagurmukhi", "0A2D", + "bhook", "0253", + "bihiragana", "3073", + "bikatakana", "30D3", + "bilabialclick", "0298", + "bindigurmukhi", "0A02", + "birusquare", "3331", + "blackcircle", "25CF", + "blackdiamond", "25C6", + "blackdownpointingtriangle", "25BC", + "blackleftpointingpointer", "25C4", + "blackleftpointingtriangle", "25C0", + "blacklenticularbracketleft", "3010", + "blacklenticularbracketleftvertical", "FE3B", + "blacklenticularbracketright", "3011", + "blacklenticularbracketrightvertical", "FE3C", + "blacklowerlefttriangle", "25E3", + "blacklowerrighttriangle", "25E2", + "blackrectangle", "25AC", + "blackrightpointingpointer", "25BA", + "blackrightpointingtriangle", "25B6", + "blacksmallsquare", "25AA", + "blacksmilingface", "263B", + "blacksquare", "25A0", + "blackstar", "2605", + "blackupperlefttriangle", "25E4", + "blackupperrighttriangle", "25E5", + "blackuppointingsmalltriangle", "25B4", + "blackuppointingtriangle", "25B2", + "blank", "2423", + "blinebelow", "1E07", + "block", "2588", + "bmonospace", "FF42", + "bobaimaithai", "0E1A", + "bohiragana", "307C", + "bokatakana", "30DC", + "bparen", "249D", + "bqsquare", "33C3", + "braceleft", "007B", + "braceleftmonospace", "FF5B", + "braceleftsmall", "FE5B", + "braceleftvertical", "FE37", + "braceright", "007D", + "bracerightmonospace", "FF5D", + "bracerightsmall", "FE5C", + "bracerightvertical", "FE38", + "bracketleft", "005B", + "bracketleftmonospace", "FF3B", + "bracketright", "005D", + "bracketrightmonospace", "FF3D", + "breve", "02D8", + "brevebelowcmb", "032E", + "brevecmb", "0306", + "breveinvertedbelowcmb", "032F", + "breveinvertedcmb", "0311", + "breveinverteddoublecmb", "0361", + "bridgebelowcmb", "032A", + "bridgeinvertedbelowcmb", "033A", + "brokenbar", "00A6", + "bstroke", "0180", + "btopbar", "0183", + "buhiragana", "3076", + "bukatakana", "30D6", + "bullet", "2022", + "bulletinverse", "25D8", + "bulletoperator", "2219", + "bullseye", "25CE", + "c", "0063", + "caarmenian", "056E", + "cabengali", "099A", + "cacute", "0107", + "cadeva", "091A", + "cagujarati", "0A9A", + "cagurmukhi", "0A1A", + "calsquare", "3388", + "candrabindubengali", "0981", + "candrabinducmb", "0310", + "candrabindudeva", "0901", + "candrabindugujarati", "0A81", + "capslock", "21EA", + "careof", "2105", + "caron", "02C7", + "caronbelowcmb", "032C", + "caroncmb", "030C", + "carriagereturn", "21B5", + "cbopomofo", "3118", + "ccaron", "010D", + "ccedilla", "00E7", + "ccedillaacute", "1E09", + "ccircle", "24D2", + "ccircumflex", "0109", + "ccurl", "0255", + "cdot", "010B", + "cdotaccent", "010B", + "cdsquare", "33C5", + "cedilla", "00B8", + "cedillacmb", "0327", + "cent", "00A2", + "centigrade", "2103", + "centmonospace", "FFE0", + "chaarmenian", "0579", + "chabengali", "099B", + "chadeva", "091B", + "chagujarati", "0A9B", + "chagurmukhi", "0A1B", + "chbopomofo", "3114", + "cheabkhasiancyrillic", "04BD", + "checkmark", "2713", + "checyrillic", "0447", + "chedescenderabkhasiancyrillic", "04BF", + "chedescendercyrillic", "04B7", + "chedieresiscyrillic", "04F5", + "cheharmenian", "0573", + "chekhakassiancyrillic", "04CC", + "cheverticalstrokecyrillic", "04B9", + "chi", "03C7", + "chieuchacirclekorean", "3277", + "chieuchaparenkorean", "3217", + "chieuchcirclekorean", "3269", + "chieuchkorean", "314A", + "chieuchparenkorean", "3209", + "chochangthai", "0E0A", + "chochanthai", "0E08", + "chochingthai", "0E09", + "chochoethai", "0E0C", + "chook", "0188", + "cieucacirclekorean", "3276", + "cieucaparenkorean", "3216", + "cieuccirclekorean", "3268", + "cieuckorean", "3148", + "cieucparenkorean", "3208", + "cieucuparenkorean", "321C", + "circle", "25CB", + "circlemultiply", "2297", + "circleot", "2299", + "circleplus", "2295", + "circlepostalmark", "3036", + "circlewithlefthalfblack", "25D0", + "circlewithrighthalfblack", "25D1", + "circumflex", "02C6", + "circumflexbelowcmb", "032D", + "circumflexcmb", "0302", + "clear", "2327", + "clickalveolar", "01C2", + "clickdental", "01C0", + "clicklateral", "01C1", + "clickretroflex", "01C3", + "club", "2663", + "clubsuitblack", "2663", + "clubsuitwhite", "2667", + "cmcubedsquare", "33A4", + "cmonospace", "FF43", + "cmsquaredsquare", "33A0", + "coarmenian", "0581", + "colon", "003A", + "colonmonetary", "20A1", + "colonmonospace", "FF1A", + "colonsign", "20A1", + "colonsmall", "FE55", + "colontriangularhalfmod", "02D1", + "colontriangularmod", "02D0", + "comma", "002C", + "commaabovecmb", "0313", + "commaaboverightcmb", "0315", + "commaarabic", "060C", + "commaarmenian", "055D", + "commamonospace", "FF0C", + "commareversedabovecmb", "0314", + "commareversedmod", "02BD", + "commasmall", "FE50", + "commaturnedabovecmb", "0312", + "commaturnedmod", "02BB", + "compass", "263C", + "congruent", "2245", + "contourintegral", "222E", + "control", "2303", + "controlACK", "0006", + "controlBEL", "0007", + "controlBS", "0008", + "controlCAN", "0018", + "controlCR", "000D", + "controlDC1", "0011", + "controlDC2", "0012", + "controlDC3", "0013", + "controlDC4", "0014", + "controlDEL", "007F", + "controlDLE", "0010", + "controlEM", "0019", + "controlENQ", "0005", + "controlEOT", "0004", + "controlESC", "001B", + "controlETB", "0017", + "controlETX", "0003", + "controlFF", "000C", + "controlFS", "001C", + "controlGS", "001D", + "controlHT", "0009", + "controlLF", "000A", + "controlNAK", "0015", + "controlRS", "001E", + "controlSI", "000F", + "controlSO", "000E", + "controlSOT", "0002", + "controlSTX", "0001", + "controlSUB", "001A", + "controlSYN", "0016", + "controlUS", "001F", + "controlVT", "000B", + "copyright", "00A9", + "cornerbracketleft", "300C", + "cornerbracketlefthalfwidth", "FF62", + "cornerbracketleftvertical", "FE41", + "cornerbracketright", "300D", + "cornerbracketrighthalfwidth", "FF63", + "cornerbracketrightvertical", "FE42", + "corporationsquare", "337F", + "cosquare", "33C7", + "coverkgsquare", "33C6", + "cparen", "249E", + "cruzeiro", "20A2", + "cstretched", "0297", + "curlyand", "22CF", + "curlyor", "22CE", + "currency", "00A4", + "d", "0064", + "daarmenian", "0564", + "dabengali", "09A6", + "dadarabic", "0636", + "dadeva", "0926", + "dadfinalarabic", "FEBE", + "dadinitialarabic", "FEBF", + "dadmedialarabic", "FEC0", + "dagesh", "05BC", + "dageshhebrew", "05BC", + "dagger", "2020", + "daggerdbl", "2021", + "dagujarati", "0AA6", + "dagurmukhi", "0A26", + "dahiragana", "3060", + "dakatakana", "30C0", + "dalarabic", "062F", + "dalet", "05D3", + "daletdagesh", "FB33", + "daletdageshhebrew", "FB33", + "dalethatafpatah", "05D3_05B2", + "dalethatafpatahhebrew", "05D3_05B2", + "dalethatafsegol", "05D3_05B1", + "dalethatafsegolhebrew", "05D3_05B1", + "dalethebrew", "05D3", + "dalethiriq", "05D3_05B4", + "dalethiriqhebrew", "05D3_05B4", + "daletholam", "05D3_05B9", + "daletholamhebrew", "05D3_05B9", + "daletpatah", "05D3_05B7", + "daletpatahhebrew", "05D3_05B7", + "daletqamats", "05D3_05B8", + "daletqamatshebrew", "05D3_05B8", + "daletqubuts", "05D3_05BB", + "daletqubutshebrew", "05D3_05BB", + "daletsegol", "05D3_05B6", + "daletsegolhebrew", "05D3_05B6", + "daletsheva", "05D3_05B0", + "daletshevahebrew", "05D3_05B0", + "dalettsere", "05D3_05B5", + "dalettserehebrew", "05D3_05B5", + "dalfinalarabic", "FEAA", + "dammaarabic", "064F", + "dammalowarabic", "064F", + "dammatanaltonearabic", "064C", + "dammatanarabic", "064C", + "danda", "0964", + "dargahebrew", "05A7", + "dargalefthebrew", "05A7", + "dasiapneumatacyrilliccmb", "0485", + "dblanglebracketleft", "300A", + "dblanglebracketleftvertical", "FE3D", + "dblanglebracketright", "300B", + "dblanglebracketrightvertical", "FE3E", + "dblarchinvertedbelowcmb", "032B", + "dblarrowleft", "21D4", + "dblarrowright", "21D2", + "dbldanda", "0965", + "dblgravecmb", "030F", + "dblintegral", "222C", + "dbllowline", "2017", + "dbllowlinecmb", "0333", + "dbloverlinecmb", "033F", + "dblprimemod", "02BA", + "dblverticalbar", "2016", + "dblverticallineabovecmb", "030E", + "dbopomofo", "3109", + "dbsquare", "33C8", + "dcaron", "010F", + "dcedilla", "1E11", + "dcircle", "24D3", + "dcircumflexbelow", "1E13", + "dcroat", "0111", + "ddabengali", "09A1", + "ddadeva", "0921", + "ddagujarati", "0AA1", + "ddagurmukhi", "0A21", + "ddalarabic", "0688", + "ddalfinalarabic", "FB89", + "dddhadeva", "095C", + "ddhabengali", "09A2", + "ddhadeva", "0922", + "ddhagujarati", "0AA2", + "ddhagurmukhi", "0A22", + "ddotaccent", "1E0B", + "ddotbelow", "1E0D", + "decimalseparatorarabic", "066B", + "decimalseparatorpersian", "066B", + "decyrillic", "0434", + "degree", "00B0", + "dehihebrew", "05AD", + "dehiragana", "3067", + "deicoptic", "03EF", + "dekatakana", "30C7", + "deleteleft", "232B", + "deleteright", "2326", + "delta", "03B4", + "deltaturned", "018D", + "denominatorminusonenumeratorbengali", "09F8", + "dezh", "02A4", + "dhabengali", "09A7", + "dhadeva", "0927", + "dhagujarati", "0AA7", + "dhagurmukhi", "0A27", + "dhook", "0257", + "dialytikatonos", "0385", + "dialytikatonoscmb", "0344", + "diamond", "2666", + "diamondsuitwhite", "2662", + "dieresis", "00A8", + "dieresisbelowcmb", "0324", + "dieresiscmb", "0308", + "dieresistonos", "0385", + "dihiragana", "3062", + "dikatakana", "30C2", + "dittomark", "3003", + "divide", "00F7", + "divides", "2223", + "divisionslash", "2215", + "djecyrillic", "0452", + "dkshade", "2593", + "dlinebelow", "1E0F", + "dlsquare", "3397", + "dmacron", "0111", + "dmonospace", "FF44", + "dnblock", "2584", + "dochadathai", "0E0E", + "dodekthai", "0E14", + "dohiragana", "3069", + "dokatakana", "30C9", + "dollar", "0024", + "dollarmonospace", "FF04", + "dollarsmall", "FE69", + "dong", "20AB", + "dorusquare", "3326", + "dotaccent", "02D9", + "dotaccentcmb", "0307", + "dotbelowcmb", "0323", + "dotbelowcomb", "0323", + "dotkatakana", "30FB", + "dotlessi", "0131", + "dotlessjstrokehook", "0284", + "dotmath", "22C5", + "dottedcircle", "25CC", + "doubleyodpatah", "FB1F", + "doubleyodpatahhebrew", "FB1F", + "downtackbelowcmb", "031E", + "downtackmod", "02D5", + "dparen", "249F", + "dtail", "0256", + "dtopbar", "018C", + "duhiragana", "3065", + "dukatakana", "30C5", + "dz", "01F3", + "dzaltone", "02A3", + "dzcaron", "01C6", + "dzcurl", "02A5", + "dzeabkhasiancyrillic", "04E1", + "dzecyrillic", "0455", + "dzhecyrillic", "045F", + "e", "0065", + "eacute", "00E9", + "earth", "2641", + "ebengali", "098F", + "ebopomofo", "311C", + "ebreve", "0115", + "ecandradeva", "090D", + "ecandragujarati", "0A8D", + "ecandravowelsigndeva", "0945", + "ecandravowelsigngujarati", "0AC5", + "ecaron", "011B", + "ecedillabreve", "1E1D", + "echarmenian", "0565", + "echyiwnarmenian", "0587", + "ecircle", "24D4", + "ecircumflex", "00EA", + "ecircumflexacute", "1EBF", + "ecircumflexbelow", "1E19", + "ecircumflexdotbelow", "1EC7", + "ecircumflexgrave", "1EC1", + "ecircumflexhookabove", "1EC3", + "ecircumflextilde", "1EC5", + "ecyrillic", "0454", + "edblgrave", "0205", + "edeva", "090F", + "edieresis", "00EB", + "edot", "0117", + "edotaccent", "0117", + "edotbelow", "1EB9", + "eegurmukhi", "0A0F", + "eematragurmukhi", "0A47", + "efcyrillic", "0444", + "egrave", "00E8", + "egujarati", "0A8F", + "eharmenian", "0567", + "ehbopomofo", "311D", + "ehiragana", "3048", + "ehookabove", "1EBB", + "eibopomofo", "311F", + "eight", "0038", + "eightarabic", "0668", + "eightbengali", "09EE", + "eightcircle", "2467", + "eightcircleinversesansserif", "2791", + "eightdeva", "096E", + "eighteencircle", "2471", + "eighteenparen", "2485", + "eighteenperiod", "2499", + "eightgujarati", "0AEE", + "eightgurmukhi", "0A6E", + "eighthackarabic", "0668", + "eighthangzhou", "3028", + "eighthnotebeamed", "266B", + "eightideographicparen", "3227", + "eightinferior", "2088", + "eightmonospace", "FF18", + "eightparen", "247B", + "eightperiod", "248F", + "eightpersian", "06F8", + "eightroman", "2177", + "eightsuperior", "2078", + "eightthai", "0E58", + "einvertedbreve", "0207", + "eiotifiedcyrillic", "0465", + "ekatakana", "30A8", + "ekatakanahalfwidth", "FF74", + "ekonkargurmukhi", "0A74", + "ekorean", "3154", + "elcyrillic", "043B", + "element", "2208", + "elevencircle", "246A", + "elevenparen", "247E", + "elevenperiod", "2492", + "elevenroman", "217A", + "ellipsis", "2026", + "ellipsisvertical", "22EE", + "emacron", "0113", + "emacronacute", "1E17", + "emacrongrave", "1E15", + "emcyrillic", "043C", + "emdash", "2014", + "emdashvertical", "FE31", + "emonospace", "FF45", + "emphasismarkarmenian", "055B", + "emptyset", "2205", + "enbopomofo", "3123", + "encyrillic", "043D", + "endash", "2013", + "endashvertical", "FE32", + "endescendercyrillic", "04A3", + "eng", "014B", + "engbopomofo", "3125", + "enghecyrillic", "04A5", + "enhookcyrillic", "04C8", + "enspace", "2002", + "eogonek", "0119", + "eokorean", "3153", + "eopen", "025B", + "eopenclosed", "029A", + "eopenreversed", "025C", + "eopenreversedclosed", "025E", + "eopenreversedhook", "025D", + "eparen", "24A0", + "epsilon", "03B5", + "epsilontonos", "03AD", + "equal", "003D", + "equalmonospace", "FF1D", + "equalsmall", "FE66", + "equalsuperior", "207C", + "equivalence", "2261", + "erbopomofo", "3126", + "ercyrillic", "0440", + "ereversed", "0258", + "ereversedcyrillic", "044D", + "escyrillic", "0441", + "esdescendercyrillic", "04AB", + "esh", "0283", + "eshcurl", "0286", + "eshortdeva", "090E", + "eshortvowelsigndeva", "0946", + "eshreversedloop", "01AA", + "eshsquatreversed", "0285", + "esmallhiragana", "3047", + "esmallkatakana", "30A7", + "esmallkatakanahalfwidth", "FF6A", + "estimated", "212E", + "eta", "03B7", + "etarmenian", "0568", + "etatonos", "03AE", + "eth", "00F0", + "etilde", "1EBD", + "etildebelow", "1E1B", + "etnahtafoukhhebrew", "0591", + "etnahtafoukhlefthebrew", "0591", + "etnahtahebrew", "0591", + "etnahtalefthebrew", "0591", + "eturned", "01DD", + "eukorean", "3161", + "euro", "20AC", + "evowelsignbengali", "09C7", + "evowelsigndeva", "0947", + "evowelsigngujarati", "0AC7", + "exclam", "0021", + "exclamarmenian", "055C", + "exclamdbl", "203C", + "exclamdown", "00A1", + "exclammonospace", "FF01", + "existential", "2203", + "ezh", "0292", + "ezhcaron", "01EF", + "ezhcurl", "0293", + "ezhreversed", "01B9", + "ezhtail", "01BA", + "f", "0066", + "fadeva", "095E", + "fagurmukhi", "0A5E", + "fahrenheit", "2109", + "fathaarabic", "064E", + "fathalowarabic", "064E", + "fathatanarabic", "064B", + "fbopomofo", "3108", + "fcircle", "24D5", + "fdotaccent", "1E1F", + "feharabic", "0641", + "feharmenian", "0586", + "fehfinalarabic", "FED2", + "fehinitialarabic", "FED3", + "fehmedialarabic", "FED4", + "feicoptic", "03E5", + "female", "2640", + "ff", "FB00", + "ffi", "FB03", + "ffl", "FB04", + "fi", "FB01", + "fifteencircle", "246E", + "fifteenparen", "2482", + "fifteenperiod", "2496", + "figuredash", "2012", + "filledbox", "25A0", + "filledrect", "25AC", + "finalkaf", "05DA", + "finalkafdagesh", "FB3A", + "finalkafdageshhebrew", "FB3A", + "finalkafhebrew", "05DA", + "finalkafqamats", "05DA_05B8", + "finalkafqamatshebrew", "05DA_05B8", + "finalkafsheva", "05DA_05B0", + "finalkafshevahebrew", "05DA_05B0", + "finalmem", "05DD", + "finalmemhebrew", "05DD", + "finalnun", "05DF", + "finalnunhebrew", "05DF", + "finalpe", "05E3", + "finalpehebrew", "05E3", + "finaltsadi", "05E5", + "finaltsadihebrew", "05E5", + "firsttonechinese", "02C9", + "fisheye", "25C9", + "fitacyrillic", "0473", + "five", "0035", + "fivearabic", "0665", + "fivebengali", "09EB", + "fivecircle", "2464", + "fivecircleinversesansserif", "278E", + "fivedeva", "096B", + "fiveeighths", "215D", + "fivegujarati", "0AEB", + "fivegurmukhi", "0A6B", + "fivehackarabic", "0665", + "fivehangzhou", "3025", + "fiveideographicparen", "3224", + "fiveinferior", "2085", + "fivemonospace", "FF15", + "fiveparen", "2478", + "fiveperiod", "248C", + "fivepersian", "06F5", + "fiveroman", "2174", + "fivesuperior", "2075", + "fivethai", "0E55", + "fl", "FB02", + "florin", "0192", + "fmonospace", "FF46", + "fmsquare", "3399", + "fofanthai", "0E1F", + "fofathai", "0E1D", + "fongmanthai", "0E4F", + "forall", "2200", + "four", "0034", + "fourarabic", "0664", + "fourbengali", "09EA", + "fourcircle", "2463", + "fourcircleinversesansserif", "278D", + "fourdeva", "096A", + "fourgujarati", "0AEA", + "fourgurmukhi", "0A6A", + "fourhackarabic", "0664", + "fourhangzhou", "3024", + "fourideographicparen", "3223", + "fourinferior", "2084", + "fourmonospace", "FF14", + "fournumeratorbengali", "09F7", + "fourparen", "2477", + "fourperiod", "248B", + "fourpersian", "06F4", + "fourroman", "2173", + "foursuperior", "2074", + "fourteencircle", "246D", + "fourteenparen", "2481", + "fourteenperiod", "2495", + "fourthai", "0E54", + "fourthtonechinese", "02CB", + "fparen", "24A1", + "fraction", "2044", + "franc", "20A3", + "g", "0067", + "gabengali", "0997", + "gacute", "01F5", + "gadeva", "0917", + "gafarabic", "06AF", + "gaffinalarabic", "FB93", + "gafinitialarabic", "FB94", + "gafmedialarabic", "FB95", + "gagujarati", "0A97", + "gagurmukhi", "0A17", + "gahiragana", "304C", + "gakatakana", "30AC", + "gamma", "03B3", + "gammalatinsmall", "0263", + "gammasuperior", "02E0", + "gangiacoptic", "03EB", + "gbopomofo", "310D", + "gbreve", "011F", + "gcaron", "01E7", + "gcedilla", "0123", + "gcircle", "24D6", + "gcircumflex", "011D", + "gcommaaccent", "0123", + "gdot", "0121", + "gdotaccent", "0121", + "gecyrillic", "0433", + "gehiragana", "3052", + "gekatakana", "30B2", + "geometricallyequal", "2251", + "gereshaccenthebrew", "059C", + "gereshhebrew", "05F3", + "gereshmuqdamhebrew", "059D", + "germandbls", "00DF", + "gershayimaccenthebrew", "059E", + "gershayimhebrew", "05F4", + "getamark", "3013", + "ghabengali", "0998", + "ghadarmenian", "0572", + "ghadeva", "0918", + "ghagujarati", "0A98", + "ghagurmukhi", "0A18", + "ghainarabic", "063A", + "ghainfinalarabic", "FECE", + "ghaininitialarabic", "FECF", + "ghainmedialarabic", "FED0", + "ghemiddlehookcyrillic", "0495", + "ghestrokecyrillic", "0493", + "gheupturncyrillic", "0491", + "ghhadeva", "095A", + "ghhagurmukhi", "0A5A", + "ghook", "0260", + "ghzsquare", "3393", + "gihiragana", "304E", + "gikatakana", "30AE", + "gimarmenian", "0563", + "gimel", "05D2", + "gimeldagesh", "FB32", + "gimeldageshhebrew", "FB32", + "gimelhebrew", "05D2", + "gjecyrillic", "0453", + "glottalinvertedstroke", "01BE", + "glottalstop", "0294", + "glottalstopinverted", "0296", + "glottalstopmod", "02C0", + "glottalstopreversed", "0295", + "glottalstopreversedmod", "02C1", + "glottalstopreversedsuperior", "02E4", + "glottalstopstroke", "02A1", + "glottalstopstrokereversed", "02A2", + "gmacron", "1E21", + "gmonospace", "FF47", + "gohiragana", "3054", + "gokatakana", "30B4", + "gparen", "24A2", + "gpasquare", "33AC", + "gradient", "2207", + "grave", "0060", + "gravebelowcmb", "0316", + "gravecmb", "0300", + "gravecomb", "0300", + "gravedeva", "0953", + "gravelowmod", "02CE", + "gravemonospace", "FF40", + "gravetonecmb", "0340", + "greater", "003E", + "greaterequal", "2265", + "greaterequalorless", "22DB", + "greatermonospace", "FF1E", + "greaterorequivalent", "2273", + "greaterorless", "2277", + "greateroverequal", "2267", + "greatersmall", "FE65", + "gscript", "0261", + "gstroke", "01E5", + "guhiragana", "3050", + "guillemotleft", "00AB", + "guillemotright", "00BB", + "guilsinglleft", "2039", + "guilsinglright", "203A", + "gukatakana", "30B0", + "guramusquare", "3318", + "gysquare", "33C9", + "h", "0068", + "haabkhasiancyrillic", "04A9", + "haaltonearabic", "06C1", + "habengali", "09B9", + "hadescendercyrillic", "04B3", + "hadeva", "0939", + "hagujarati", "0AB9", + "hagurmukhi", "0A39", + "haharabic", "062D", + "hahfinalarabic", "FEA2", + "hahinitialarabic", "FEA3", + "hahiragana", "306F", + "hahmedialarabic", "FEA4", + "haitusquare", "332A", + "hakatakana", "30CF", + "hakatakanahalfwidth", "FF8A", + "halantgurmukhi", "0A4D", + "hamzaarabic", "0621", + "hamzadammaarabic", "0621_064F", + "hamzadammatanarabic", "0621_064C", + "hamzafathaarabic", "0621_064E", + "hamzafathatanarabic", "0621_064B", + "hamzalowarabic", "0621", + "hamzalowkasraarabic", "0621_0650", + "hamzalowkasratanarabic", "0621_064D", + "hamzasukunarabic", "0621_0652", + "hangulfiller", "3164", + "hardsigncyrillic", "044A", + "harpoonleftbarbup", "21BC", + "harpoonrightbarbup", "21C0", + "hasquare", "33CA", + "hatafpatah", "05B2", + "hatafpatah16", "05B2", + "hatafpatah23", "05B2", + "hatafpatah2f", "05B2", + "hatafpatahhebrew", "05B2", + "hatafpatahnarrowhebrew", "05B2", + "hatafpatahquarterhebrew", "05B2", + "hatafpatahwidehebrew", "05B2", + "hatafqamats", "05B3", + "hatafqamats1b", "05B3", + "hatafqamats28", "05B3", + "hatafqamats34", "05B3", + "hatafqamatshebrew", "05B3", + "hatafqamatsnarrowhebrew", "05B3", + "hatafqamatsquarterhebrew", "05B3", + "hatafqamatswidehebrew", "05B3", + "hatafsegol", "05B1", + "hatafsegol17", "05B1", + "hatafsegol24", "05B1", + "hatafsegol30", "05B1", + "hatafsegolhebrew", "05B1", + "hatafsegolnarrowhebrew", "05B1", + "hatafsegolquarterhebrew", "05B1", + "hatafsegolwidehebrew", "05B1", + "hbar", "0127", + "hbopomofo", "310F", + "hbrevebelow", "1E2B", + "hcedilla", "1E29", + "hcircle", "24D7", + "hcircumflex", "0125", + "hdieresis", "1E27", + "hdotaccent", "1E23", + "hdotbelow", "1E25", + "he", "05D4", + "heart", "2665", + "heartsuitblack", "2665", + "heartsuitwhite", "2661", + "hedagesh", "FB34", + "hedageshhebrew", "FB34", + "hehaltonearabic", "06C1", + "heharabic", "0647", + "hehebrew", "05D4", + "hehfinalaltonearabic", "FBA7", + "hehfinalalttwoarabic", "FEEA", + "hehfinalarabic", "FEEA", + "hehhamzaabovefinalarabic", "FBA5", + "hehhamzaaboveisolatedarabic", "FBA4", + "hehinitialaltonearabic", "FBA8", + "hehinitialarabic", "FEEB", + "hehiragana", "3078", + "hehmedialaltonearabic", "FBA9", + "hehmedialarabic", "FEEC", + "heiseierasquare", "337B", + "hekatakana", "30D8", + "hekatakanahalfwidth", "FF8D", + "hekutaarusquare", "3336", + "henghook", "0267", + "herutusquare", "3339", + "het", "05D7", + "hethebrew", "05D7", + "hhook", "0266", + "hhooksuperior", "02B1", + "hieuhacirclekorean", "327B", + "hieuhaparenkorean", "321B", + "hieuhcirclekorean", "326D", + "hieuhkorean", "314E", + "hieuhparenkorean", "320D", + "hihiragana", "3072", + "hikatakana", "30D2", + "hikatakanahalfwidth", "FF8B", + "hiriq", "05B4", + "hiriq14", "05B4", + "hiriq21", "05B4", + "hiriq2d", "05B4", + "hiriqhebrew", "05B4", + "hiriqnarrowhebrew", "05B4", + "hiriqquarterhebrew", "05B4", + "hiriqwidehebrew", "05B4", + "hlinebelow", "1E96", + "hmonospace", "FF48", + "hoarmenian", "0570", + "hohipthai", "0E2B", + "hohiragana", "307B", + "hokatakana", "30DB", + "hokatakanahalfwidth", "FF8E", + "holam", "05B9", + "holam19", "05B9", + "holam26", "05B9", + "holam32", "05B9", + "holamhebrew", "05B9", + "holamnarrowhebrew", "05B9", + "holamquarterhebrew", "05B9", + "holamwidehebrew", "05B9", + "honokhukthai", "0E2E", + "hookabovecomb", "0309", + "hookcmb", "0309", + "hookpalatalizedbelowcmb", "0321", + "hookretroflexbelowcmb", "0322", + "hoonsquare", "3342", + "horicoptic", "03E9", + "horizontalbar", "2015", + "horncmb", "031B", + "hotsprings", "2668", + "house", "2302", + "hparen", "24A3", + "hsuperior", "02B0", + "hturned", "0265", + "huhiragana", "3075", + "huiitosquare", "3333", + "hukatakana", "30D5", + "hukatakanahalfwidth", "FF8C", + "hungarumlaut", "02DD", + "hungarumlautcmb", "030B", + "hv", "0195", + "hyphen", "002D", + "hyphenmonospace", "FF0D", + "hyphensmall", "FE63", + "hyphentwo", "2010", + "i", "0069", + "iacute", "00ED", + "iacyrillic", "044F", + "ibengali", "0987", + "ibopomofo", "3127", + "ibreve", "012D", + "icaron", "01D0", + "icircle", "24D8", + "icircumflex", "00EE", + "icyrillic", "0456", + "idblgrave", "0209", + "ideographearthcircle", "328F", + "ideographfirecircle", "328B", + "ideographicallianceparen", "323F", + "ideographiccallparen", "323A", + "ideographiccentrecircle", "32A5", + "ideographicclose", "3006", + "ideographiccomma", "3001", + "ideographiccommaleft", "FF64", + "ideographiccongratulationparen", "3237", + "ideographiccorrectcircle", "32A3", + "ideographicearthparen", "322F", + "ideographicenterpriseparen", "323D", + "ideographicexcellentcircle", "329D", + "ideographicfestivalparen", "3240", + "ideographicfinancialcircle", "3296", + "ideographicfinancialparen", "3236", + "ideographicfireparen", "322B", + "ideographichaveparen", "3232", + "ideographichighcircle", "32A4", + "ideographiciterationmark", "3005", + "ideographiclaborcircle", "3298", + "ideographiclaborparen", "3238", + "ideographicleftcircle", "32A7", + "ideographiclowcircle", "32A6", + "ideographicmedicinecircle", "32A9", + "ideographicmetalparen", "322E", + "ideographicmoonparen", "322A", + "ideographicnameparen", "3234", + "ideographicperiod", "3002", + "ideographicprintcircle", "329E", + "ideographicreachparen", "3243", + "ideographicrepresentparen", "3239", + "ideographicresourceparen", "323E", + "ideographicrightcircle", "32A8", + "ideographicsecretcircle", "3299", + "ideographicselfparen", "3242", + "ideographicsocietyparen", "3233", + "ideographicspace", "3000", + "ideographicspecialparen", "3235", + "ideographicstockparen", "3231", + "ideographicstudyparen", "323B", + "ideographicsunparen", "3230", + "ideographicsuperviseparen", "323C", + "ideographicwaterparen", "322C", + "ideographicwoodparen", "322D", + "ideographiczero", "3007", + "ideographmetalcircle", "328E", + "ideographmooncircle", "328A", + "ideographnamecircle", "3294", + "ideographsuncircle", "3290", + "ideographwatercircle", "328C", + "ideographwoodcircle", "328D", + "ideva", "0907", + "idieresis", "00EF", + "idieresisacute", "1E2F", + "idieresiscyrillic", "04E5", + "idotbelow", "1ECB", + "iebrevecyrillic", "04D7", + "iecyrillic", "0435", + "ieungacirclekorean", "3275", + "ieungaparenkorean", "3215", + "ieungcirclekorean", "3267", + "ieungkorean", "3147", + "ieungparenkorean", "3207", + "igrave", "00EC", + "igujarati", "0A87", + "igurmukhi", "0A07", + "ihiragana", "3044", + "ihookabove", "1EC9", + "iibengali", "0988", + "iicyrillic", "0438", + "iideva", "0908", + "iigujarati", "0A88", + "iigurmukhi", "0A08", + "iimatragurmukhi", "0A40", + "iinvertedbreve", "020B", + "iishortcyrillic", "0439", + "iivowelsignbengali", "09C0", + "iivowelsigndeva", "0940", + "iivowelsigngujarati", "0AC0", + "ij", "0133", + "ikatakana", "30A4", + "ikatakanahalfwidth", "FF72", + "ikorean", "3163", + "ilde", "02DC", + "iluyhebrew", "05AC", + "imacron", "012B", + "imacroncyrillic", "04E3", + "imageorapproximatelyequal", "2253", + "imatragurmukhi", "0A3F", + "imonospace", "FF49", + "increment", "2206", + "infinity", "221E", + "iniarmenian", "056B", + "integral", "222B", + "integralbottom", "2321", + "integralbt", "2321", + "integraltop", "2320", + "integraltp", "2320", + "intersection", "2229", + "intisquare", "3305", + "invbullet", "25D8", + "invcircle", "25D9", + "invsmileface", "263B", + "iocyrillic", "0451", + "iogonek", "012F", + "iota", "03B9", + "iotadieresis", "03CA", + "iotadieresistonos", "0390", + "iotalatin", "0269", + "iotatonos", "03AF", + "iparen", "24A4", + "irigurmukhi", "0A72", + "ismallhiragana", "3043", + "ismallkatakana", "30A3", + "ismallkatakanahalfwidth", "FF68", + "issharbengali", "09FA", + "istroke", "0268", + "iterationhiragana", "309D", + "iterationkatakana", "30FD", + "itilde", "0129", + "itildebelow", "1E2D", + "iubopomofo", "3129", + "iucyrillic", "044E", + "ivowelsignbengali", "09BF", + "ivowelsigndeva", "093F", + "ivowelsigngujarati", "0ABF", + "izhitsacyrillic", "0475", + "izhitsadblgravecyrillic", "0477", + "j", "006A", + "jaarmenian", "0571", + "jabengali", "099C", + "jadeva", "091C", + "jagujarati", "0A9C", + "jagurmukhi", "0A1C", + "jbopomofo", "3110", + "jcaron", "01F0", + "jcircle", "24D9", + "jcircumflex", "0135", + "jcrossedtail", "029D", + "jdotlessstroke", "025F", + "jecyrillic", "0458", + "jeemarabic", "062C", + "jeemfinalarabic", "FE9E", + "jeeminitialarabic", "FE9F", + "jeemmedialarabic", "FEA0", + "jeharabic", "0698", + "jehfinalarabic", "FB8B", + "jhabengali", "099D", + "jhadeva", "091D", + "jhagujarati", "0A9D", + "jhagurmukhi", "0A1D", + "jheharmenian", "057B", + "jis", "3004", + "jmonospace", "FF4A", + "jparen", "24A5", + "jsuperior", "02B2", + "k", "006B", + "kabashkircyrillic", "04A1", + "kabengali", "0995", + "kacute", "1E31", + "kacyrillic", "043A", + "kadescendercyrillic", "049B", + "kadeva", "0915", + "kaf", "05DB", + "kafarabic", "0643", + "kafdagesh", "FB3B", + "kafdageshhebrew", "FB3B", + "kaffinalarabic", "FEDA", + "kafhebrew", "05DB", + "kafinitialarabic", "FEDB", + "kafmedialarabic", "FEDC", + "kafrafehebrew", "FB4D", + "kagujarati", "0A95", + "kagurmukhi", "0A15", + "kahiragana", "304B", + "kahookcyrillic", "04C4", + "kakatakana", "30AB", + "kakatakanahalfwidth", "FF76", + "kappa", "03BA", + "kappasymbolgreek", "03F0", + "kapyeounmieumkorean", "3171", + "kapyeounphieuphkorean", "3184", + "kapyeounpieupkorean", "3178", + "kapyeounssangpieupkorean", "3179", + "karoriisquare", "330D", + "kashidaautoarabic", "0640", + "kashidaautonosidebearingarabic", "0640", + "kasmallkatakana", "30F5", + "kasquare", "3384", + "kasraarabic", "0650", + "kasratanarabic", "064D", + "kastrokecyrillic", "049F", + "katahiraprolongmarkhalfwidth", "FF70", + "kaverticalstrokecyrillic", "049D", + "kbopomofo", "310E", + "kcalsquare", "3389", + "kcaron", "01E9", + "kcedilla", "0137", + "kcircle", "24DA", + "kcommaaccent", "0137", + "kdotbelow", "1E33", + "keharmenian", "0584", + "kehiragana", "3051", + "kekatakana", "30B1", + "kekatakanahalfwidth", "FF79", + "kenarmenian", "056F", + "kesmallkatakana", "30F6", + "kgreenlandic", "0138", + "khabengali", "0996", + "khacyrillic", "0445", + "khadeva", "0916", + "khagujarati", "0A96", + "khagurmukhi", "0A16", + "khaharabic", "062E", + "khahfinalarabic", "FEA6", + "khahinitialarabic", "FEA7", + "khahmedialarabic", "FEA8", + "kheicoptic", "03E7", + "khhadeva", "0959", + "khhagurmukhi", "0A59", + "khieukhacirclekorean", "3278", + "khieukhaparenkorean", "3218", + "khieukhcirclekorean", "326A", + "khieukhkorean", "314B", + "khieukhparenkorean", "320A", + "khokhaithai", "0E02", + "khokhonthai", "0E05", + "khokhuatthai", "0E03", + "khokhwaithai", "0E04", + "khomutthai", "0E5B", + "khook", "0199", + "khorakhangthai", "0E06", + "khzsquare", "3391", + "kihiragana", "304D", + "kikatakana", "30AD", + "kikatakanahalfwidth", "FF77", + "kiroguramusquare", "3315", + "kiromeetorusquare", "3316", + "kirosquare", "3314", + "kiyeokacirclekorean", "326E", + "kiyeokaparenkorean", "320E", + "kiyeokcirclekorean", "3260", + "kiyeokkorean", "3131", + "kiyeokparenkorean", "3200", + "kiyeoksioskorean", "3133", + "kjecyrillic", "045C", + "klinebelow", "1E35", + "klsquare", "3398", + "kmcubedsquare", "33A6", + "kmonospace", "FF4B", + "kmsquaredsquare", "33A2", + "kohiragana", "3053", + "kohmsquare", "33C0", + "kokaithai", "0E01", + "kokatakana", "30B3", + "kokatakanahalfwidth", "FF7A", + "kooposquare", "331E", + "koppacyrillic", "0481", + "koreanstandardsymbol", "327F", + "koroniscmb", "0343", + "kparen", "24A6", + "kpasquare", "33AA", + "ksicyrillic", "046F", + "ktsquare", "33CF", + "kturned", "029E", + "kuhiragana", "304F", + "kukatakana", "30AF", + "kukatakanahalfwidth", "FF78", + "kvsquare", "33B8", + "kwsquare", "33BE", + "l", "006C", + "labengali", "09B2", + "lacute", "013A", + "ladeva", "0932", + "lagujarati", "0AB2", + "lagurmukhi", "0A32", + "lakkhangyaothai", "0E45", + "lamaleffinalarabic", "FEFC", + "lamalefhamzaabovefinalarabic", "FEF8", + "lamalefhamzaaboveisolatedarabic", "FEF7", + "lamalefhamzabelowfinalarabic", "FEFA", + "lamalefhamzabelowisolatedarabic", "FEF9", + "lamalefisolatedarabic", "FEFB", + "lamalefmaddaabovefinalarabic", "FEF6", + "lamalefmaddaaboveisolatedarabic", "FEF5", + "lamarabic", "0644", + "lambda", "03BB", + "lambdastroke", "019B", + "lamed", "05DC", + "lameddagesh", "FB3C", + "lameddageshhebrew", "FB3C", + "lamedhebrew", "05DC", + "lamedholam", "05DC_05B9", + "lamedholamdagesh", "05DC_05B9_05BC", + "lamedholamdageshhebrew", "05DC_05B9_05BC", + "lamedholamhebrew", "05DC_05B9", + "lamfinalarabic", "FEDE", + "lamhahinitialarabic", "FCCA", + "laminitialarabic", "FEDF", + "lamjeeminitialarabic", "FCC9", + "lamkhahinitialarabic", "FCCB", + "lamlamhehisolatedarabic", "FDF2", + "lammedialarabic", "FEE0", + "lammeemhahinitialarabic", "FD88", + "lammeeminitialarabic", "FCCC", + "lammeemjeeminitialarabic", "FEDF_FEE4_FEA0", + "lammeemkhahinitialarabic", "FEDF_FEE4_FEA8", + "largecircle", "25EF", + "lbar", "019A", + "lbelt", "026C", + "lbopomofo", "310C", + "lcaron", "013E", + "lcedilla", "013C", + "lcircle", "24DB", + "lcircumflexbelow", "1E3D", + "lcommaaccent", "013C", + "ldot", "0140", + "ldotaccent", "0140", + "ldotbelow", "1E37", + "ldotbelowmacron", "1E39", + "leftangleabovecmb", "031A", + "lefttackbelowcmb", "0318", + "less", "003C", + "lessequal", "2264", + "lessequalorgreater", "22DA", + "lessmonospace", "FF1C", + "lessorequivalent", "2272", + "lessorgreater", "2276", + "lessoverequal", "2266", + "lesssmall", "FE64", + "lezh", "026E", + "lfblock", "258C", + "lhookretroflex", "026D", + "lira", "20A4", + "liwnarmenian", "056C", + "lj", "01C9", + "ljecyrillic", "0459", + "lladeva", "0933", + "llagujarati", "0AB3", + "llinebelow", "1E3B", + "llladeva", "0934", + "llvocalicbengali", "09E1", + "llvocalicdeva", "0961", + "llvocalicvowelsignbengali", "09E3", + "llvocalicvowelsigndeva", "0963", + "lmiddletilde", "026B", + "lmonospace", "FF4C", + "lmsquare", "33D0", + "lochulathai", "0E2C", + "logicaland", "2227", + "logicalnot", "00AC", + "logicalnotreversed", "2310", + "logicalor", "2228", + "lolingthai", "0E25", + "longs", "017F", + "lowlinecenterline", "FE4E", + "lowlinecmb", "0332", + "lowlinedashed", "FE4D", + "lozenge", "25CA", + "lparen", "24A7", + "lslash", "0142", + "lsquare", "2113", + "ltshade", "2591", + "luthai", "0E26", + "lvocalicbengali", "098C", + "lvocalicdeva", "090C", + "lvocalicvowelsignbengali", "09E2", + "lvocalicvowelsigndeva", "0962", + "lxsquare", "33D3", + "m", "006D", + "mabengali", "09AE", + "macron", "00AF", + "macronbelowcmb", "0331", + "macroncmb", "0304", + "macronlowmod", "02CD", + "macronmonospace", "FFE3", + "macute", "1E3F", + "madeva", "092E", + "magujarati", "0AAE", + "magurmukhi", "0A2E", + "mahapakhhebrew", "05A4", + "mahapakhlefthebrew", "05A4", + "mahiragana", "307E", + "maichattawathai", "0E4B", + "maiekthai", "0E48", + "maihanakatthai", "0E31", + "maitaikhuthai", "0E47", + "maithothai", "0E49", + "maitrithai", "0E4A", + "maiyamokthai", "0E46", + "makatakana", "30DE", + "makatakanahalfwidth", "FF8F", + "male", "2642", + "mansyonsquare", "3347", + "maqafhebrew", "05BE", + "mars", "2642", + "masoracirclehebrew", "05AF", + "masquare", "3383", + "mbopomofo", "3107", + "mbsquare", "33D4", + "mcircle", "24DC", + "mcubedsquare", "33A5", + "mdotaccent", "1E41", + "mdotbelow", "1E43", + "meemarabic", "0645", + "meemfinalarabic", "FEE2", + "meeminitialarabic", "FEE3", + "meemmedialarabic", "FEE4", + "meemmeeminitialarabic", "FCD1", + "meemmeemisolatedarabic", "FC48", + "meetorusquare", "334D", + "mehiragana", "3081", + "meizierasquare", "337E", + "mekatakana", "30E1", + "mekatakanahalfwidth", "FF92", + "mem", "05DE", + "memdagesh", "FB3E", + "memdageshhebrew", "FB3E", + "memhebrew", "05DE", + "menarmenian", "0574", + "merkhahebrew", "05A5", + "merkhakefulahebrew", "05A6", + "merkhakefulalefthebrew", "05A6", + "merkhalefthebrew", "05A5", + "mhook", "0271", + "mhzsquare", "3392", + "middledotkatakanahalfwidth", "FF65", + "middot", "00B7", + "mieumacirclekorean", "3272", + "mieumaparenkorean", "3212", + "mieumcirclekorean", "3264", + "mieumkorean", "3141", + "mieumpansioskorean", "3170", + "mieumparenkorean", "3204", + "mieumpieupkorean", "316E", + "mieumsioskorean", "316F", + "mihiragana", "307F", + "mikatakana", "30DF", + "mikatakanahalfwidth", "FF90", + "minus", "2212", + "minusbelowcmb", "0320", + "minuscircle", "2296", + "minusmod", "02D7", + "minusplus", "2213", + "minute", "2032", + "miribaarusquare", "334A", + "mirisquare", "3349", + "mlonglegturned", "0270", + "mlsquare", "3396", + "mmcubedsquare", "33A3", + "mmonospace", "FF4D", + "mmsquaredsquare", "339F", + "mohiragana", "3082", + "mohmsquare", "33C1", + "mokatakana", "30E2", + "mokatakanahalfwidth", "FF93", + "molsquare", "33D6", + "momathai", "0E21", + "moverssquare", "33A7", + "moverssquaredsquare", "33A8", + "mparen", "24A8", + "mpasquare", "33AB", + "mssquare", "33B3", + "mturned", "026F", + "mu", "00B5", + "mu1", "00B5", + "muasquare", "3382", + "muchgreater", "226B", + "muchless", "226A", + "mufsquare", "338C", + "mugreek", "03BC", + "mugsquare", "338D", + "muhiragana", "3080", + "mukatakana", "30E0", + "mukatakanahalfwidth", "FF91", + "mulsquare", "3395", + "multiply", "00D7", + "mumsquare", "339B", + "munahhebrew", "05A3", + "munahlefthebrew", "05A3", + "musicalnote", "266A", + "musicalnotedbl", "266B", + "musicflatsign", "266D", + "musicsharpsign", "266F", + "mussquare", "33B2", + "muvsquare", "33B6", + "muwsquare", "33BC", + "mvmegasquare", "33B9", + "mvsquare", "33B7", + "mwmegasquare", "33BF", + "mwsquare", "33BD", + "n", "006E", + "nabengali", "09A8", + "nabla", "2207", + "nacute", "0144", + "nadeva", "0928", + "nagujarati", "0AA8", + "nagurmukhi", "0A28", + "nahiragana", "306A", + "nakatakana", "30CA", + "nakatakanahalfwidth", "FF85", + "napostrophe", "0149", + "nasquare", "3381", + "nbopomofo", "310B", + "nbspace", "00A0", + "ncaron", "0148", + "ncedilla", "0146", + "ncircle", "24DD", + "ncircumflexbelow", "1E4B", + "ncommaaccent", "0146", + "ndotaccent", "1E45", + "ndotbelow", "1E47", + "nehiragana", "306D", + "nekatakana", "30CD", + "nekatakanahalfwidth", "FF88", + "newsheqelsign", "20AA", + "nfsquare", "338B", + "ngabengali", "0999", + "ngadeva", "0919", + "ngagujarati", "0A99", + "ngagurmukhi", "0A19", + "ngonguthai", "0E07", + "nhiragana", "3093", + "nhookleft", "0272", + "nhookretroflex", "0273", + "nieunacirclekorean", "326F", + "nieunaparenkorean", "320F", + "nieuncieuckorean", "3135", + "nieuncirclekorean", "3261", + "nieunhieuhkorean", "3136", + "nieunkorean", "3134", + "nieunpansioskorean", "3168", + "nieunparenkorean", "3201", + "nieunsioskorean", "3167", + "nieuntikeutkorean", "3166", + "nihiragana", "306B", + "nikatakana", "30CB", + "nikatakanahalfwidth", "FF86", + "nikhahitthai", "0E4D", + "nine", "0039", + "ninearabic", "0669", + "ninebengali", "09EF", + "ninecircle", "2468", + "ninecircleinversesansserif", "2792", + "ninedeva", "096F", + "ninegujarati", "0AEF", + "ninegurmukhi", "0A6F", + "ninehackarabic", "0669", + "ninehangzhou", "3029", + "nineideographicparen", "3228", + "nineinferior", "2089", + "ninemonospace", "FF19", + "nineparen", "247C", + "nineperiod", "2490", + "ninepersian", "06F9", + "nineroman", "2178", + "ninesuperior", "2079", + "nineteencircle", "2472", + "nineteenparen", "2486", + "nineteenperiod", "249A", + "ninethai", "0E59", + "nj", "01CC", + "njecyrillic", "045A", + "nkatakana", "30F3", + "nkatakanahalfwidth", "FF9D", + "nlegrightlong", "019E", + "nlinebelow", "1E49", + "nmonospace", "FF4E", + "nmsquare", "339A", + "nnabengali", "09A3", + "nnadeva", "0923", + "nnagujarati", "0AA3", + "nnagurmukhi", "0A23", + "nnnadeva", "0929", + "nohiragana", "306E", + "nokatakana", "30CE", + "nokatakanahalfwidth", "FF89", + "nonbreakingspace", "00A0", + "nonenthai", "0E13", + "nonuthai", "0E19", + "noonarabic", "0646", + "noonfinalarabic", "FEE6", + "noonghunnaarabic", "06BA", + "noonghunnafinalarabic", "FB9F", + "noonhehinitialarabic", "FEE7_FEEC", + "nooninitialarabic", "FEE7", + "noonjeeminitialarabic", "FCD2", + "noonjeemisolatedarabic", "FC4B", + "noonmedialarabic", "FEE8", + "noonmeeminitialarabic", "FCD5", + "noonmeemisolatedarabic", "FC4E", + "noonnoonfinalarabic", "FC8D", + "notcontains", "220C", + "notelement", "2209", + "notelementof", "2209", + "notequal", "2260", + "notgreater", "226F", + "notgreaternorequal", "2271", + "notgreaternorless", "2279", + "notidentical", "2262", + "notless", "226E", + "notlessnorequal", "2270", + "notparallel", "2226", + "notprecedes", "2280", + "notsubset", "2284", + "notsucceeds", "2281", + "notsuperset", "2285", + "nowarmenian", "0576", + "nparen", "24A9", + "nssquare", "33B1", + "nsuperior", "207F", + "ntilde", "00F1", + "nu", "03BD", + "nuhiragana", "306C", + "nukatakana", "30CC", + "nukatakanahalfwidth", "FF87", + "nuktabengali", "09BC", + "nuktadeva", "093C", + "nuktagujarati", "0ABC", + "nuktagurmukhi", "0A3C", + "numbersign", "0023", + "numbersignmonospace", "FF03", + "numbersignsmall", "FE5F", + "numeralsigngreek", "0374", + "numeralsignlowergreek", "0375", + "numero", "2116", + "nun", "05E0", + "nundagesh", "FB40", + "nundageshhebrew", "FB40", + "nunhebrew", "05E0", + "nvsquare", "33B5", + "nwsquare", "33BB", + "nyabengali", "099E", + "nyadeva", "091E", + "nyagujarati", "0A9E", + "nyagurmukhi", "0A1E", + "o", "006F", + "oacute", "00F3", + "oangthai", "0E2D", + "obarred", "0275", + "obarredcyrillic", "04E9", + "obarreddieresiscyrillic", "04EB", + "obengali", "0993", + "obopomofo", "311B", + "obreve", "014F", + "ocandradeva", "0911", + "ocandragujarati", "0A91", + "ocandravowelsigndeva", "0949", + "ocandravowelsigngujarati", "0AC9", + "ocaron", "01D2", + "ocircle", "24DE", + "ocircumflex", "00F4", + "ocircumflexacute", "1ED1", + "ocircumflexdotbelow", "1ED9", + "ocircumflexgrave", "1ED3", + "ocircumflexhookabove", "1ED5", + "ocircumflextilde", "1ED7", + "ocyrillic", "043E", + "odblacute", "0151", + "odblgrave", "020D", + "odeva", "0913", + "odieresis", "00F6", + "odieresiscyrillic", "04E7", + "odotbelow", "1ECD", + "oe", "0153", + "oekorean", "315A", + "ogonek", "02DB", + "ogonekcmb", "0328", + "ograve", "00F2", + "ogujarati", "0A93", + "oharmenian", "0585", + "ohiragana", "304A", + "ohookabove", "1ECF", + "ohorn", "01A1", + "ohornacute", "1EDB", + "ohorndotbelow", "1EE3", + "ohorngrave", "1EDD", + "ohornhookabove", "1EDF", + "ohorntilde", "1EE1", + "ohungarumlaut", "0151", + "oi", "01A3", + "oinvertedbreve", "020F", + "okatakana", "30AA", + "okatakanahalfwidth", "FF75", + "okorean", "3157", + "olehebrew", "05AB", + "omacron", "014D", + "omacronacute", "1E53", + "omacrongrave", "1E51", + "omdeva", "0950", + "omega", "03C9", + "omega1", "03D6", + "omegacyrillic", "0461", + "omegalatinclosed", "0277", + "omegaroundcyrillic", "047B", + "omegatitlocyrillic", "047D", + "omegatonos", "03CE", + "omgujarati", "0AD0", + "omicron", "03BF", + "omicrontonos", "03CC", + "omonospace", "FF4F", + "one", "0031", + "onearabic", "0661", + "onebengali", "09E7", + "onecircle", "2460", + "onecircleinversesansserif", "278A", + "onedeva", "0967", + "onedotenleader", "2024", + "oneeighth", "215B", + "onegujarati", "0AE7", + "onegurmukhi", "0A67", + "onehackarabic", "0661", + "onehalf", "00BD", + "onehangzhou", "3021", + "oneideographicparen", "3220", + "oneinferior", "2081", + "onemonospace", "FF11", + "onenumeratorbengali", "09F4", + "oneparen", "2474", + "oneperiod", "2488", + "onepersian", "06F1", + "onequarter", "00BC", + "oneroman", "2170", + "onesuperior", "00B9", + "onethai", "0E51", + "onethird", "2153", + "oogonek", "01EB", + "oogonekmacron", "01ED", + "oogurmukhi", "0A13", + "oomatragurmukhi", "0A4B", + "oopen", "0254", + "oparen", "24AA", + "openbullet", "25E6", + "option", "2325", + "ordfeminine", "00AA", + "ordmasculine", "00BA", + "orthogonal", "221F", + "oshortdeva", "0912", + "oshortvowelsigndeva", "094A", + "oslash", "00F8", + "oslashacute", "01FF", + "osmallhiragana", "3049", + "osmallkatakana", "30A9", + "osmallkatakanahalfwidth", "FF6B", + "ostrokeacute", "01FF", + "otcyrillic", "047F", + "otilde", "00F5", + "otildeacute", "1E4D", + "otildedieresis", "1E4F", + "oubopomofo", "3121", + "overline", "203E", + "overlinecenterline", "FE4A", + "overlinecmb", "0305", + "overlinedashed", "FE49", + "overlinedblwavy", "FE4C", + "overlinewavy", "FE4B", + "overscore", "00AF", + "ovowelsignbengali", "09CB", + "ovowelsigndeva", "094B", + "ovowelsigngujarati", "0ACB", + "p", "0070", + "paampssquare", "3380", + "paasentosquare", "332B", + "pabengali", "09AA", + "pacute", "1E55", + "padeva", "092A", + "pagedown", "21DF", + "pageup", "21DE", + "pagujarati", "0AAA", + "pagurmukhi", "0A2A", + "pahiragana", "3071", + "paiyannoithai", "0E2F", + "pakatakana", "30D1", + "palatalizationcyrilliccmb", "0484", + "palochkacyrillic", "04C0", + "pansioskorean", "317F", + "paragraph", "00B6", + "parallel", "2225", + "parenleft", "0028", + "parenleftaltonearabic", "FD3E", + "parenleftinferior", "208D", + "parenleftmonospace", "FF08", + "parenleftsmall", "FE59", + "parenleftsuperior", "207D", + "parenleftvertical", "FE35", + "parenright", "0029", + "parenrightaltonearabic", "FD3F", + "parenrightinferior", "208E", + "parenrightmonospace", "FF09", + "parenrightsmall", "FE5A", + "parenrightsuperior", "207E", + "parenrightvertical", "FE36", + "partialdiff", "2202", + "paseqhebrew", "05C0", + "pashtahebrew", "0599", + "pasquare", "33A9", + "patah", "05B7", + "patah11", "05B7", + "patah1d", "05B7", + "patah2a", "05B7", + "patahhebrew", "05B7", + "patahnarrowhebrew", "05B7", + "patahquarterhebrew", "05B7", + "patahwidehebrew", "05B7", + "pazerhebrew", "05A1", + "pbopomofo", "3106", + "pcircle", "24DF", + "pdotaccent", "1E57", + "pe", "05E4", + "pecyrillic", "043F", + "pedagesh", "FB44", + "pedageshhebrew", "FB44", + "peezisquare", "333B", + "pefinaldageshhebrew", "FB43", + "peharabic", "067E", + "peharmenian", "057A", + "pehebrew", "05E4", + "pehfinalarabic", "FB57", + "pehinitialarabic", "FB58", + "pehiragana", "307A", + "pehmedialarabic", "FB59", + "pekatakana", "30DA", + "pemiddlehookcyrillic", "04A7", + "perafehebrew", "FB4E", + "percent", "0025", + "percentarabic", "066A", + "percentmonospace", "FF05", + "percentsmall", "FE6A", + "period", "002E", + "periodarmenian", "0589", + "periodcentered", "00B7", + "periodhalfwidth", "FF61", + "periodmonospace", "FF0E", + "periodsmall", "FE52", + "perispomenigreekcmb", "0342", + "perpendicular", "22A5", + "perthousand", "2030", + "peseta", "20A7", + "pfsquare", "338A", + "phabengali", "09AB", + "phadeva", "092B", + "phagujarati", "0AAB", + "phagurmukhi", "0A2B", + "phi", "03C6", + "phi1", "03D5", + "phieuphacirclekorean", "327A", + "phieuphaparenkorean", "321A", + "phieuphcirclekorean", "326C", + "phieuphkorean", "314D", + "phieuphparenkorean", "320C", + "philatin", "0278", + "phinthuthai", "0E3A", + "phisymbolgreek", "03D5", + "phook", "01A5", + "phophanthai", "0E1E", + "phophungthai", "0E1C", + "phosamphaothai", "0E20", + "pi", "03C0", + "pieupacirclekorean", "3273", + "pieupaparenkorean", "3213", + "pieupcieuckorean", "3176", + "pieupcirclekorean", "3265", + "pieupkiyeokkorean", "3172", + "pieupkorean", "3142", + "pieupparenkorean", "3205", + "pieupsioskiyeokkorean", "3174", + "pieupsioskorean", "3144", + "pieupsiostikeutkorean", "3175", + "pieupthieuthkorean", "3177", + "pieuptikeutkorean", "3173", + "pihiragana", "3074", + "pikatakana", "30D4", + "pisymbolgreek", "03D6", + "piwrarmenian", "0583", + "plus", "002B", + "plusbelowcmb", "031F", + "pluscircle", "2295", + "plusminus", "00B1", + "plusmod", "02D6", + "plusmonospace", "FF0B", + "plussmall", "FE62", + "plussuperior", "207A", + "pmonospace", "FF50", + "pmsquare", "33D8", + "pohiragana", "307D", + "pointingindexdownwhite", "261F", + "pointingindexleftwhite", "261C", + "pointingindexrightwhite", "261E", + "pointingindexupwhite", "261D", + "pokatakana", "30DD", + "poplathai", "0E1B", + "postalmark", "3012", + "postalmarkface", "3020", + "pparen", "24AB", + "precedes", "227A", + "prescription", "211E", + "primemod", "02B9", + "primereversed", "2035", + "product", "220F", + "projective", "2305", + "prolongedkana", "30FC", + "propellor", "2318", + "propersubset", "2282", + "propersuperset", "2283", + "proportion", "2237", + "proportional", "221D", + "psi", "03C8", + "psicyrillic", "0471", + "psilipneumatacyrilliccmb", "0486", + "pssquare", "33B0", + "puhiragana", "3077", + "pukatakana", "30D7", + "pvsquare", "33B4", + "pwsquare", "33BA", + "q", "0071", + "qadeva", "0958", + "qadmahebrew", "05A8", + "qafarabic", "0642", + "qaffinalarabic", "FED6", + "qafinitialarabic", "FED7", + "qafmedialarabic", "FED8", + "qamats", "05B8", + "qamats10", "05B8", + "qamats1a", "05B8", + "qamats1c", "05B8", + "qamats27", "05B8", + "qamats29", "05B8", + "qamats33", "05B8", + "qamatsde", "05B8", + "qamatshebrew", "05B8", + "qamatsnarrowhebrew", "05B8", + "qamatsqatanhebrew", "05B8", + "qamatsqatannarrowhebrew", "05B8", + "qamatsqatanquarterhebrew", "05B8", + "qamatsqatanwidehebrew", "05B8", + "qamatsquarterhebrew", "05B8", + "qamatswidehebrew", "05B8", + "qarneyparahebrew", "059F", + "qbopomofo", "3111", + "qcircle", "24E0", + "qhook", "02A0", + "qmonospace", "FF51", + "qof", "05E7", + "qofdagesh", "FB47", + "qofdageshhebrew", "FB47", + "qofhatafpatah", "05E7_05B2", + "qofhatafpatahhebrew", "05E7_05B2", + "qofhatafsegol", "05E7_05B1", + "qofhatafsegolhebrew", "05E7_05B1", + "qofhebrew", "05E7", + "qofhiriq", "05E7_05B4", + "qofhiriqhebrew", "05E7_05B4", + "qofholam", "05E7_05B9", + "qofholamhebrew", "05E7_05B9", + "qofpatah", "05E7_05B7", + "qofpatahhebrew", "05E7_05B7", + "qofqamats", "05E7_05B8", + "qofqamatshebrew", "05E7_05B8", + "qofqubuts", "05E7_05BB", + "qofqubutshebrew", "05E7_05BB", + "qofsegol", "05E7_05B6", + "qofsegolhebrew", "05E7_05B6", + "qofsheva", "05E7_05B0", + "qofshevahebrew", "05E7_05B0", + "qoftsere", "05E7_05B5", + "qoftserehebrew", "05E7_05B5", + "qparen", "24AC", + "quarternote", "2669", + "qubuts", "05BB", + "qubuts18", "05BB", + "qubuts25", "05BB", + "qubuts31", "05BB", + "qubutshebrew", "05BB", + "qubutsnarrowhebrew", "05BB", + "qubutsquarterhebrew", "05BB", + "qubutswidehebrew", "05BB", + "question", "003F", + "questionarabic", "061F", + "questionarmenian", "055E", + "questiondown", "00BF", + "questiongreek", "037E", + "questionmonospace", "FF1F", + "quotedbl", "0022", + "quotedblbase", "201E", + "quotedblleft", "201C", + "quotedblmonospace", "FF02", + "quotedblprime", "301E", + "quotedblprimereversed", "301D", + "quotedblright", "201D", + "quoteleft", "2018", + "quoteleftreversed", "201B", + "quotereversed", "201B", + "quoteright", "2019", + "quoterightn", "0149", + "quotesinglbase", "201A", + "quotesingle", "0027", + "quotesinglemonospace", "FF07", + "r", "0072", + "raarmenian", "057C", + "rabengali", "09B0", + "racute", "0155", + "radeva", "0930", + "radical", "221A", + "radoverssquare", "33AE", + "radoverssquaredsquare", "33AF", + "radsquare", "33AD", + "rafe", "05BF", + "rafehebrew", "05BF", + "ragujarati", "0AB0", + "ragurmukhi", "0A30", + "rahiragana", "3089", + "rakatakana", "30E9", + "rakatakanahalfwidth", "FF97", + "ralowerdiagonalbengali", "09F1", + "ramiddlediagonalbengali", "09F0", + "ramshorn", "0264", + "ratio", "2236", + "rbopomofo", "3116", + "rcaron", "0159", + "rcedilla", "0157", + "rcircle", "24E1", + "rcommaaccent", "0157", + "rdblgrave", "0211", + "rdotaccent", "1E59", + "rdotbelow", "1E5B", + "rdotbelowmacron", "1E5D", + "referencemark", "203B", + "reflexsubset", "2286", + "reflexsuperset", "2287", + "registered", "00AE", + "reharabic", "0631", + "reharmenian", "0580", + "rehfinalarabic", "FEAE", + "rehiragana", "308C", + "rehyehaleflamarabic", "0631_FEF3_FE8E_0644", + "rekatakana", "30EC", + "rekatakanahalfwidth", "FF9A", + "resh", "05E8", + "reshdageshhebrew", "FB48", + "reshhatafpatah", "05E8_05B2", + "reshhatafpatahhebrew", "05E8_05B2", + "reshhatafsegol", "05E8_05B1", + "reshhatafsegolhebrew", "05E8_05B1", + "reshhebrew", "05E8", + "reshhiriq", "05E8_05B4", + "reshhiriqhebrew", "05E8_05B4", + "reshholam", "05E8_05B9", + "reshholamhebrew", "05E8_05B9", + "reshpatah", "05E8_05B7", + "reshpatahhebrew", "05E8_05B7", + "reshqamats", "05E8_05B8", + "reshqamatshebrew", "05E8_05B8", + "reshqubuts", "05E8_05BB", + "reshqubutshebrew", "05E8_05BB", + "reshsegol", "05E8_05B6", + "reshsegolhebrew", "05E8_05B6", + "reshsheva", "05E8_05B0", + "reshshevahebrew", "05E8_05B0", + "reshtsere", "05E8_05B5", + "reshtserehebrew", "05E8_05B5", + "reversedtilde", "223D", + "reviahebrew", "0597", + "reviamugrashhebrew", "0597", + "revlogicalnot", "2310", + "rfishhook", "027E", + "rfishhookreversed", "027F", + "rhabengali", "09DD", + "rhadeva", "095D", + "rho", "03C1", + "rhook", "027D", + "rhookturned", "027B", + "rhookturnedsuperior", "02B5", + "rhosymbolgreek", "03F1", + "rhotichookmod", "02DE", + "rieulacirclekorean", "3271", + "rieulaparenkorean", "3211", + "rieulcirclekorean", "3263", + "rieulhieuhkorean", "3140", + "rieulkiyeokkorean", "313A", + "rieulkiyeoksioskorean", "3169", + "rieulkorean", "3139", + "rieulmieumkorean", "313B", + "rieulpansioskorean", "316C", + "rieulparenkorean", "3203", + "rieulphieuphkorean", "313F", + "rieulpieupkorean", "313C", + "rieulpieupsioskorean", "316B", + "rieulsioskorean", "313D", + "rieulthieuthkorean", "313E", + "rieultikeutkorean", "316A", + "rieulyeorinhieuhkorean", "316D", + "rightangle", "221F", + "righttackbelowcmb", "0319", + "righttriangle", "22BF", + "rihiragana", "308A", + "rikatakana", "30EA", + "rikatakanahalfwidth", "FF98", + "ring", "02DA", + "ringbelowcmb", "0325", + "ringcmb", "030A", + "ringhalfleft", "02BF", + "ringhalfleftarmenian", "0559", + "ringhalfleftbelowcmb", "031C", + "ringhalfleftcentered", "02D3", + "ringhalfright", "02BE", + "ringhalfrightbelowcmb", "0339", + "ringhalfrightcentered", "02D2", + "rinvertedbreve", "0213", + "rittorusquare", "3351", + "rlinebelow", "1E5F", + "rlongleg", "027C", + "rlonglegturned", "027A", + "rmonospace", "FF52", + "rohiragana", "308D", + "rokatakana", "30ED", + "rokatakanahalfwidth", "FF9B", + "roruathai", "0E23", + "rparen", "24AD", + "rrabengali", "09DC", + "rradeva", "0931", + "rragurmukhi", "0A5C", + "rreharabic", "0691", + "rrehfinalarabic", "FB8D", + "rrvocalicbengali", "09E0", + "rrvocalicdeva", "0960", + "rrvocalicgujarati", "0AE0", + "rrvocalicvowelsignbengali", "09C4", + "rrvocalicvowelsigndeva", "0944", + "rrvocalicvowelsigngujarati", "0AC4", + "rtblock", "2590", + "rturned", "0279", + "rturnedsuperior", "02B4", + "ruhiragana", "308B", + "rukatakana", "30EB", + "rukatakanahalfwidth", "FF99", + "rupeemarkbengali", "09F2", + "rupeesignbengali", "09F3", + "ruthai", "0E24", + "rvocalicbengali", "098B", + "rvocalicdeva", "090B", + "rvocalicgujarati", "0A8B", + "rvocalicvowelsignbengali", "09C3", + "rvocalicvowelsigndeva", "0943", + "rvocalicvowelsigngujarati", "0AC3", + "s", "0073", + "sabengali", "09B8", + "sacute", "015B", + "sacutedotaccent", "1E65", + "sadarabic", "0635", + "sadeva", "0938", + "sadfinalarabic", "FEBA", + "sadinitialarabic", "FEBB", + "sadmedialarabic", "FEBC", + "sagujarati", "0AB8", + "sagurmukhi", "0A38", + "sahiragana", "3055", + "sakatakana", "30B5", + "sakatakanahalfwidth", "FF7B", + "sallallahoualayhewasallamarabic", "FDFA", + "samekh", "05E1", + "samekhdagesh", "FB41", + "samekhdageshhebrew", "FB41", + "samekhhebrew", "05E1", + "saraaathai", "0E32", + "saraaethai", "0E41", + "saraaimaimalaithai", "0E44", + "saraaimaimuanthai", "0E43", + "saraamthai", "0E33", + "saraathai", "0E30", + "saraethai", "0E40", + "saraiithai", "0E35", + "saraithai", "0E34", + "saraothai", "0E42", + "saraueethai", "0E37", + "sarauethai", "0E36", + "sarauthai", "0E38", + "sarauuthai", "0E39", + "sbopomofo", "3119", + "scaron", "0161", + "scarondotaccent", "1E67", + "scedilla", "015F", + "schwa", "0259", + "schwacyrillic", "04D9", + "schwadieresiscyrillic", "04DB", + "schwahook", "025A", + "scircle", "24E2", + "scircumflex", "015D", + "scommaaccent", "0219", + "sdotaccent", "1E61", + "sdotbelow", "1E63", + "sdotbelowdotaccent", "1E69", + "seagullbelowcmb", "033C", + "second", "2033", + "secondtonechinese", "02CA", + "section", "00A7", + "seenarabic", "0633", + "seenfinalarabic", "FEB2", + "seeninitialarabic", "FEB3", + "seenmedialarabic", "FEB4", + "segol", "05B6", + "segol13", "05B6", + "segol1f", "05B6", + "segol2c", "05B6", + "segolhebrew", "05B6", + "segolnarrowhebrew", "05B6", + "segolquarterhebrew", "05B6", + "segoltahebrew", "0592", + "segolwidehebrew", "05B6", + "seharmenian", "057D", + "sehiragana", "305B", + "sekatakana", "30BB", + "sekatakanahalfwidth", "FF7E", + "semicolon", "003B", + "semicolonarabic", "061B", + "semicolonmonospace", "FF1B", + "semicolonsmall", "FE54", + "semivoicedmarkkana", "309C", + "semivoicedmarkkanahalfwidth", "FF9F", + "sentisquare", "3322", + "sentosquare", "3323", + "seven", "0037", + "sevenarabic", "0667", + "sevenbengali", "09ED", + "sevencircle", "2466", + "sevencircleinversesansserif", "2790", + "sevendeva", "096D", + "seveneighths", "215E", + "sevengujarati", "0AED", + "sevengurmukhi", "0A6D", + "sevenhackarabic", "0667", + "sevenhangzhou", "3027", + "sevenideographicparen", "3226", + "seveninferior", "2087", + "sevenmonospace", "FF17", + "sevenparen", "247A", + "sevenperiod", "248E", + "sevenpersian", "06F7", + "sevenroman", "2176", + "sevensuperior", "2077", + "seventeencircle", "2470", + "seventeenparen", "2484", + "seventeenperiod", "2498", + "seventhai", "0E57", + "sfthyphen", "00AD", + "shaarmenian", "0577", + "shabengali", "09B6", + "shacyrillic", "0448", + "shaddaarabic", "0651", + "shaddadammaarabic", "FC61", + "shaddadammatanarabic", "FC5E", + "shaddafathaarabic", "FC60", + "shaddafathatanarabic", "0651_064B", + "shaddakasraarabic", "FC62", + "shaddakasratanarabic", "FC5F", + "shade", "2592", + "shadedark", "2593", + "shadelight", "2591", + "shademedium", "2592", + "shadeva", "0936", + "shagujarati", "0AB6", + "shagurmukhi", "0A36", + "shalshelethebrew", "0593", + "shbopomofo", "3115", + "shchacyrillic", "0449", + "sheenarabic", "0634", + "sheenfinalarabic", "FEB6", + "sheeninitialarabic", "FEB7", + "sheenmedialarabic", "FEB8", + "sheicoptic", "03E3", + "sheqel", "20AA", + "sheqelhebrew", "20AA", + "sheva", "05B0", + "sheva115", "05B0", + "sheva15", "05B0", + "sheva22", "05B0", + "sheva2e", "05B0", + "shevahebrew", "05B0", + "shevanarrowhebrew", "05B0", + "shevaquarterhebrew", "05B0", + "shevawidehebrew", "05B0", + "shhacyrillic", "04BB", + "shimacoptic", "03ED", + "shin", "05E9", + "shindagesh", "FB49", + "shindageshhebrew", "FB49", + "shindageshshindot", "FB2C", + "shindageshshindothebrew", "FB2C", + "shindageshsindot", "FB2D", + "shindageshsindothebrew", "FB2D", + "shindothebrew", "05C1", + "shinhebrew", "05E9", + "shinshindot", "FB2A", + "shinshindothebrew", "FB2A", + "shinsindot", "FB2B", + "shinsindothebrew", "FB2B", + "shook", "0282", + "sigma", "03C3", + "sigma1", "03C2", + "sigmafinal", "03C2", + "sigmalunatesymbolgreek", "03F2", + "sihiragana", "3057", + "sikatakana", "30B7", + "sikatakanahalfwidth", "FF7C", + "siluqhebrew", "05BD", + "siluqlefthebrew", "05BD", + "similar", "223C", + "sindothebrew", "05C2", + "siosacirclekorean", "3274", + "siosaparenkorean", "3214", + "sioscieuckorean", "317E", + "sioscirclekorean", "3266", + "sioskiyeokkorean", "317A", + "sioskorean", "3145", + "siosnieunkorean", "317B", + "siosparenkorean", "3206", + "siospieupkorean", "317D", + "siostikeutkorean", "317C", + "six", "0036", + "sixarabic", "0666", + "sixbengali", "09EC", + "sixcircle", "2465", + "sixcircleinversesansserif", "278F", + "sixdeva", "096C", + "sixgujarati", "0AEC", + "sixgurmukhi", "0A6C", + "sixhackarabic", "0666", + "sixhangzhou", "3026", + "sixideographicparen", "3225", + "sixinferior", "2086", + "sixmonospace", "FF16", + "sixparen", "2479", + "sixperiod", "248D", + "sixpersian", "06F6", + "sixroman", "2175", + "sixsuperior", "2076", + "sixteencircle", "246F", + "sixteencurrencydenominatorbengali", "09F9", + "sixteenparen", "2483", + "sixteenperiod", "2497", + "sixthai", "0E56", + "slash", "002F", + "slashmonospace", "FF0F", + "slong", "017F", + "slongdotaccent", "1E9B", + "smileface", "263A", + "smonospace", "FF53", + "sofpasuqhebrew", "05C3", + "softhyphen", "00AD", + "softsigncyrillic", "044C", + "sohiragana", "305D", + "sokatakana", "30BD", + "sokatakanahalfwidth", "FF7F", + "soliduslongoverlaycmb", "0338", + "solidusshortoverlaycmb", "0337", + "sorusithai", "0E29", + "sosalathai", "0E28", + "sosothai", "0E0B", + "sosuathai", "0E2A", + "space", "0020", + "spacehackarabic", "0020", + "spade", "2660", + "spadesuitblack", "2660", + "spadesuitwhite", "2664", + "sparen", "24AE", + "squarebelowcmb", "033B", + "squarecc", "33C4", + "squarecm", "339D", + "squarediagonalcrosshatchfill", "25A9", + "squarehorizontalfill", "25A4", + "squarekg", "338F", + "squarekm", "339E", + "squarekmcapital", "33CE", + "squareln", "33D1", + "squarelog", "33D2", + "squaremg", "338E", + "squaremil", "33D5", + "squaremm", "339C", + "squaremsquared", "33A1", + "squareorthogonalcrosshatchfill", "25A6", + "squareupperlefttolowerrightfill", "25A7", + "squareupperrighttolowerleftfill", "25A8", + "squareverticalfill", "25A5", + "squarewhitewithsmallblack", "25A3", + "srsquare", "33DB", + "ssabengali", "09B7", + "ssadeva", "0937", + "ssagujarati", "0AB7", + "ssangcieuckorean", "3149", + "ssanghieuhkorean", "3185", + "ssangieungkorean", "3180", + "ssangkiyeokkorean", "3132", + "ssangnieunkorean", "3165", + "ssangpieupkorean", "3143", + "ssangsioskorean", "3146", + "ssangtikeutkorean", "3138", + "sterling", "00A3", + "sterlingmonospace", "FFE1", + "strokelongoverlaycmb", "0336", + "strokeshortoverlaycmb", "0335", + "subset", "2282", + "subsetnotequal", "228A", + "subsetorequal", "2286", + "succeeds", "227B", + "suchthat", "220B", + "suhiragana", "3059", + "sukatakana", "30B9", + "sukatakanahalfwidth", "FF7D", + "sukunarabic", "0652", + "summation", "2211", + "sun", "263C", + "superset", "2283", + "supersetnotequal", "228B", + "supersetorequal", "2287", + "svsquare", "33DC", + "syouwaerasquare", "337C", + "t", "0074", + "tabengali", "09A4", + "tackdown", "22A4", + "tackleft", "22A3", + "tadeva", "0924", + "tagujarati", "0AA4", + "tagurmukhi", "0A24", + "taharabic", "0637", + "tahfinalarabic", "FEC2", + "tahinitialarabic", "FEC3", + "tahiragana", "305F", + "tahmedialarabic", "FEC4", + "taisyouerasquare", "337D", + "takatakana", "30BF", + "takatakanahalfwidth", "FF80", + "tatweelarabic", "0640", + "tau", "03C4", + "tav", "05EA", + "tavdages", "FB4A", + "tavdagesh", "FB4A", + "tavdageshhebrew", "FB4A", + "tavhebrew", "05EA", + "tbar", "0167", + "tbopomofo", "310A", + "tcaron", "0165", + "tccurl", "02A8", + "tcedilla", "0163", + "tcheharabic", "0686", + "tchehfinalarabic", "FB7B", + "tchehinitialarabic", "FB7C", + "tchehmedialarabic", "FB7D", + "tchehmeeminitialarabic", "FB7C_FEE4", + "tcircle", "24E3", + "tcircumflexbelow", "1E71", + "tcommaaccent", "0163", + "tdieresis", "1E97", + "tdotaccent", "1E6B", + "tdotbelow", "1E6D", + "tecyrillic", "0442", + "tedescendercyrillic", "04AD", + "teharabic", "062A", + "tehfinalarabic", "FE96", + "tehhahinitialarabic", "FCA2", + "tehhahisolatedarabic", "FC0C", + "tehinitialarabic", "FE97", + "tehiragana", "3066", + "tehjeeminitialarabic", "FCA1", + "tehjeemisolatedarabic", "FC0B", + "tehmarbutaarabic", "0629", + "tehmarbutafinalarabic", "FE94", + "tehmedialarabic", "FE98", + "tehmeeminitialarabic", "FCA4", + "tehmeemisolatedarabic", "FC0E", + "tehnoonfinalarabic", "FC73", + "tekatakana", "30C6", + "tekatakanahalfwidth", "FF83", + "telephone", "2121", + "telephoneblack", "260E", + "telishagedolahebrew", "05A0", + "telishaqetanahebrew", "05A9", + "tencircle", "2469", + "tenideographicparen", "3229", + "tenparen", "247D", + "tenperiod", "2491", + "tenroman", "2179", + "tesh", "02A7", + "tet", "05D8", + "tetdagesh", "FB38", + "tetdageshhebrew", "FB38", + "tethebrew", "05D8", + "tetsecyrillic", "04B5", + "tevirhebrew", "059B", + "tevirlefthebrew", "059B", + "thabengali", "09A5", + "thadeva", "0925", + "thagujarati", "0AA5", + "thagurmukhi", "0A25", + "thalarabic", "0630", + "thalfinalarabic", "FEAC", + "thanthakhatthai", "0E4C", + "theharabic", "062B", + "thehfinalarabic", "FE9A", + "thehinitialarabic", "FE9B", + "thehmedialarabic", "FE9C", + "thereexists", "2203", + "therefore", "2234", + "theta", "03B8", + "theta1", "03D1", + "thetasymbolgreek", "03D1", + "thieuthacirclekorean", "3279", + "thieuthaparenkorean", "3219", + "thieuthcirclekorean", "326B", + "thieuthkorean", "314C", + "thieuthparenkorean", "320B", + "thirteencircle", "246C", + "thirteenparen", "2480", + "thirteenperiod", "2494", + "thonangmonthothai", "0E11", + "thook", "01AD", + "thophuthaothai", "0E12", + "thorn", "00FE", + "thothahanthai", "0E17", + "thothanthai", "0E10", + "thothongthai", "0E18", + "thothungthai", "0E16", + "thousandcyrillic", "0482", + "thousandsseparatorarabic", "066C", + "thousandsseparatorpersian", "066C", + "three", "0033", + "threearabic", "0663", + "threebengali", "09E9", + "threecircle", "2462", + "threecircleinversesansserif", "278C", + "threedeva", "0969", + "threeeighths", "215C", + "threegujarati", "0AE9", + "threegurmukhi", "0A69", + "threehackarabic", "0663", + "threehangzhou", "3023", + "threeideographicparen", "3222", + "threeinferior", "2083", + "threemonospace", "FF13", + "threenumeratorbengali", "09F6", + "threeparen", "2476", + "threeperiod", "248A", + "threepersian", "06F3", + "threequarters", "00BE", + "threeroman", "2172", + "threesuperior", "00B3", + "threethai", "0E53", + "thzsquare", "3394", + "tihiragana", "3061", + "tikatakana", "30C1", + "tikatakanahalfwidth", "FF81", + "tikeutacirclekorean", "3270", + "tikeutaparenkorean", "3210", + "tikeutcirclekorean", "3262", + "tikeutkorean", "3137", + "tikeutparenkorean", "3202", + "tilde", "02DC", + "tildebelowcmb", "0330", + "tildecmb", "0303", + "tildecomb", "0303", + "tildedoublecmb", "0360", + "tildeoperator", "223C", + "tildeoverlaycmb", "0334", + "tildeverticalcmb", "033E", + "timescircle", "2297", + "tipehahebrew", "0596", + "tipehalefthebrew", "0596", + "tippigurmukhi", "0A70", + "titlocyrilliccmb", "0483", + "tiwnarmenian", "057F", + "tlinebelow", "1E6F", + "tmonospace", "FF54", + "toarmenian", "0569", + "tohiragana", "3068", + "tokatakana", "30C8", + "tokatakanahalfwidth", "FF84", + "tonebarextrahighmod", "02E5", + "tonebarextralowmod", "02E9", + "tonebarhighmod", "02E6", + "tonebarlowmod", "02E8", + "tonebarmidmod", "02E7", + "tonefive", "01BD", + "tonesix", "0185", + "tonetwo", "01A8", + "tonos", "0384", + "tonsquare", "3327", + "topatakthai", "0E0F", + "tortoiseshellbracketleft", "3014", + "tortoiseshellbracketleftsmall", "FE5D", + "tortoiseshellbracketleftvertical", "FE39", + "tortoiseshellbracketright", "3015", + "tortoiseshellbracketrightsmall", "FE5E", + "tortoiseshellbracketrightvertical", "FE3A", + "totaothai", "0E15", + "tpalatalhook", "01AB", + "tparen", "24AF", + "trademark", "2122", + "tretroflexhook", "0288", + "triagdn", "25BC", + "triaglf", "25C4", + "triagrt", "25BA", + "triagup", "25B2", + "ts", "02A6", + "tsadi", "05E6", + "tsadidagesh", "FB46", + "tsadidageshhebrew", "FB46", + "tsadihebrew", "05E6", + "tsecyrillic", "0446", + "tsere", "05B5", + "tsere12", "05B5", + "tsere1e", "05B5", + "tsere2b", "05B5", + "tserehebrew", "05B5", + "tserenarrowhebrew", "05B5", + "tserequarterhebrew", "05B5", + "tserewidehebrew", "05B5", + "tshecyrillic", "045B", + "ttabengali", "099F", + "ttadeva", "091F", + "ttagujarati", "0A9F", + "ttagurmukhi", "0A1F", + "tteharabic", "0679", + "ttehfinalarabic", "FB67", + "ttehinitialarabic", "FB68", + "ttehmedialarabic", "FB69", + "tthabengali", "09A0", + "tthadeva", "0920", + "tthagujarati", "0AA0", + "tthagurmukhi", "0A20", + "tturned", "0287", + "tuhiragana", "3064", + "tukatakana", "30C4", + "tukatakanahalfwidth", "FF82", + "tusmallhiragana", "3063", + "tusmallkatakana", "30C3", + "tusmallkatakanahalfwidth", "FF6F", + "twelvecircle", "246B", + "twelveparen", "247F", + "twelveperiod", "2493", + "twelveroman", "217B", + "twentycircle", "2473", + "twentyhangzhou", "5344", + "twentyparen", "2487", + "twentyperiod", "249B", + "two", "0032", + "twoarabic", "0662", + "twobengali", "09E8", + "twocircle", "2461", + "twocircleinversesansserif", "278B", + "twodeva", "0968", + "twodotenleader", "2025", + "twodotleader", "2025", + "twodotleadervertical", "FE30", + "twogujarati", "0AE8", + "twogurmukhi", "0A68", + "twohackarabic", "0662", + "twohangzhou", "3022", + "twoideographicparen", "3221", + "twoinferior", "2082", + "twomonospace", "FF12", + "twonumeratorbengali", "09F5", + "twoparen", "2475", + "twoperiod", "2489", + "twopersian", "06F2", + "tworoman", "2171", + "twostroke", "01BB", + "twosuperior", "00B2", + "twothai", "0E52", + "twothirds", "2154", + "u", "0075", + "uacute", "00FA", + "ubar", "0289", + "ubengali", "0989", + "ubopomofo", "3128", + "ubreve", "016D", + "ucaron", "01D4", + "ucircle", "24E4", + "ucircumflex", "00FB", + "ucircumflexbelow", "1E77", + "ucyrillic", "0443", + "udattadeva", "0951", + "udblacute", "0171", + "udblgrave", "0215", + "udeva", "0909", + "udieresis", "00FC", + "udieresisacute", "01D8", + "udieresisbelow", "1E73", + "udieresiscaron", "01DA", + "udieresiscyrillic", "04F1", + "udieresisgrave", "01DC", + "udieresismacron", "01D6", + "udotbelow", "1EE5", + "ugrave", "00F9", + "ugujarati", "0A89", + "ugurmukhi", "0A09", + "uhiragana", "3046", + "uhookabove", "1EE7", + "uhorn", "01B0", + "uhornacute", "1EE9", + "uhorndotbelow", "1EF1", + "uhorngrave", "1EEB", + "uhornhookabove", "1EED", + "uhorntilde", "1EEF", + "uhungarumlaut", "0171", + "uhungarumlautcyrillic", "04F3", + "uinvertedbreve", "0217", + "ukatakana", "30A6", + "ukatakanahalfwidth", "FF73", + "ukcyrillic", "0479", + "ukorean", "315C", + "umacron", "016B", + "umacroncyrillic", "04EF", + "umacrondieresis", "1E7B", + "umatragurmukhi", "0A41", + "umonospace", "FF55", + "underscore", "005F", + "underscoredbl", "2017", + "underscoremonospace", "FF3F", + "underscorevertical", "FE33", + "underscorewavy", "FE4F", + "union", "222A", + "universal", "2200", + "uogonek", "0173", + "uparen", "24B0", + "upblock", "2580", + "upperdothebrew", "05C4", + "upsilon", "03C5", + "upsilondieresis", "03CB", + "upsilondieresistonos", "03B0", + "upsilonlatin", "028A", + "upsilontonos", "03CD", + "uptackbelowcmb", "031D", + "uptackmod", "02D4", + "uragurmukhi", "0A73", + "uring", "016F", + "ushortcyrillic", "045E", + "usmallhiragana", "3045", + "usmallkatakana", "30A5", + "usmallkatakanahalfwidth", "FF69", + "ustraightcyrillic", "04AF", + "ustraightstrokecyrillic", "04B1", + "utilde", "0169", + "utildeacute", "1E79", + "utildebelow", "1E75", + "uubengali", "098A", + "uudeva", "090A", + "uugujarati", "0A8A", + "uugurmukhi", "0A0A", + "uumatragurmukhi", "0A42", + "uuvowelsignbengali", "09C2", + "uuvowelsigndeva", "0942", + "uuvowelsigngujarati", "0AC2", + "uvowelsignbengali", "09C1", + "uvowelsigndeva", "0941", + "uvowelsigngujarati", "0AC1", + "v", "0076", + "vadeva", "0935", + "vagujarati", "0AB5", + "vagurmukhi", "0A35", + "vakatakana", "30F7", + "vav", "05D5", + "vavdagesh", "FB35", + "vavdagesh65", "FB35", + "vavdageshhebrew", "FB35", + "vavhebrew", "05D5", + "vavholam", "FB4B", + "vavholamhebrew", "FB4B", + "vavvavhebrew", "05F0", + "vavyodhebrew", "05F1", + "vcircle", "24E5", + "vdotbelow", "1E7F", + "vecyrillic", "0432", + "veharabic", "06A4", + "vehfinalarabic", "FB6B", + "vehinitialarabic", "FB6C", + "vehmedialarabic", "FB6D", + "vekatakana", "30F9", + "venus", "2640", + "verticalbar", "007C", + "verticallineabovecmb", "030D", + "verticallinebelowcmb", "0329", + "verticallinelowmod", "02CC", + "verticallinemod", "02C8", + "vewarmenian", "057E", + "vhook", "028B", + "vikatakana", "30F8", + "viramabengali", "09CD", + "viramadeva", "094D", + "viramagujarati", "0ACD", + "visargabengali", "0983", + "visargadeva", "0903", + "visargagujarati", "0A83", + "vmonospace", "FF56", + "voarmenian", "0578", + "voicediterationhiragana", "309E", + "voicediterationkatakana", "30FE", + "voicedmarkkana", "309B", + "voicedmarkkanahalfwidth", "FF9E", + "vokatakana", "30FA", + "vparen", "24B1", + "vtilde", "1E7D", + "vturned", "028C", + "vuhiragana", "3094", + "vukatakana", "30F4", + "w", "0077", + "wacute", "1E83", + "waekorean", "3159", + "wahiragana", "308F", + "wakatakana", "30EF", + "wakatakanahalfwidth", "FF9C", + "wakorean", "3158", + "wasmallhiragana", "308E", + "wasmallkatakana", "30EE", + "wattosquare", "3357", + "wavedash", "301C", + "wavyunderscorevertical", "FE34", + "wawarabic", "0648", + "wawfinalarabic", "FEEE", + "wawhamzaabovearabic", "0624", + "wawhamzaabovefinalarabic", "FE86", + "wbsquare", "33DD", + "wcircle", "24E6", + "wcircumflex", "0175", + "wdieresis", "1E85", + "wdotaccent", "1E87", + "wdotbelow", "1E89", + "wehiragana", "3091", + "weierstrass", "2118", + "wekatakana", "30F1", + "wekorean", "315E", + "weokorean", "315D", + "wgrave", "1E81", + "whitebullet", "25E6", + "whitecircle", "25CB", + "whitecircleinverse", "25D9", + "whitecornerbracketleft", "300E", + "whitecornerbracketleftvertical", "FE43", + "whitecornerbracketright", "300F", + "whitecornerbracketrightvertical", "FE44", + "whitediamond", "25C7", + "whitediamondcontainingblacksmalldiamond", "25C8", + "whitedownpointingsmalltriangle", "25BF", + "whitedownpointingtriangle", "25BD", + "whiteleftpointingsmalltriangle", "25C3", + "whiteleftpointingtriangle", "25C1", + "whitelenticularbracketleft", "3016", + "whitelenticularbracketright", "3017", + "whiterightpointingsmalltriangle", "25B9", + "whiterightpointingtriangle", "25B7", + "whitesmallsquare", "25AB", + "whitesmilingface", "263A", + "whitesquare", "25A1", + "whitestar", "2606", + "whitetelephone", "260F", + "whitetortoiseshellbracketleft", "3018", + "whitetortoiseshellbracketright", "3019", + "whiteuppointingsmalltriangle", "25B5", + "whiteuppointingtriangle", "25B3", + "wihiragana", "3090", + "wikatakana", "30F0", + "wikorean", "315F", + "wmonospace", "FF57", + "wohiragana", "3092", + "wokatakana", "30F2", + "wokatakanahalfwidth", "FF66", + "won", "20A9", + "wonmonospace", "FFE6", + "wowaenthai", "0E27", + "wparen", "24B2", + "wring", "1E98", + "wsuperior", "02B7", + "wturned", "028D", + "wynn", "01BF", + "x", "0078", + "xabovecmb", "033D", + "xbopomofo", "3112", + "xcircle", "24E7", + "xdieresis", "1E8D", + "xdotaccent", "1E8B", + "xeharmenian", "056D", + "xi", "03BE", + "xmonospace", "FF58", + "xparen", "24B3", + "xsuperior", "02E3", + "y", "0079", + "yaadosquare", "334E", + "yabengali", "09AF", + "yacute", "00FD", + "yadeva", "092F", + "yaekorean", "3152", + "yagujarati", "0AAF", + "yagurmukhi", "0A2F", + "yahiragana", "3084", + "yakatakana", "30E4", + "yakatakanahalfwidth", "FF94", + "yakorean", "3151", + "yamakkanthai", "0E4E", + "yasmallhiragana", "3083", + "yasmallkatakana", "30E3", + "yasmallkatakanahalfwidth", "FF6C", + "yatcyrillic", "0463", + "ycircle", "24E8", + "ycircumflex", "0177", + "ydieresis", "00FF", + "ydotaccent", "1E8F", + "ydotbelow", "1EF5", + "yeharabic", "064A", + "yehbarreearabic", "06D2", + "yehbarreefinalarabic", "FBAF", + "yehfinalarabic", "FEF2", + "yehhamzaabovearabic", "0626", + "yehhamzaabovefinalarabic", "FE8A", + "yehhamzaaboveinitialarabic", "FE8B", + "yehhamzaabovemedialarabic", "FE8C", + "yehinitialarabic", "FEF3", + "yehmedialarabic", "FEF4", + "yehmeeminitialarabic", "FCDD", + "yehmeemisolatedarabic", "FC58", + "yehnoonfinalarabic", "FC94", + "yehthreedotsbelowarabic", "06D1", + "yekorean", "3156", + "yen", "00A5", + "yenmonospace", "FFE5", + "yeokorean", "3155", + "yeorinhieuhkorean", "3186", + "yerahbenyomohebrew", "05AA", + "yerahbenyomolefthebrew", "05AA", + "yericyrillic", "044B", + "yerudieresiscyrillic", "04F9", + "yesieungkorean", "3181", + "yesieungpansioskorean", "3183", + "yesieungsioskorean", "3182", + "yetivhebrew", "059A", + "ygrave", "1EF3", + "yhook", "01B4", + "yhookabove", "1EF7", + "yiarmenian", "0575", + "yicyrillic", "0457", + "yikorean", "3162", + "yinyang", "262F", + "yiwnarmenian", "0582", + "ymonospace", "FF59", + "yod", "05D9", + "yoddagesh", "FB39", + "yoddageshhebrew", "FB39", + "yodhebrew", "05D9", + "yodyodhebrew", "05F2", + "yodyodpatahhebrew", "FB1F", + "yohiragana", "3088", + "yoikorean", "3189", + "yokatakana", "30E8", + "yokatakanahalfwidth", "FF96", + "yokorean", "315B", + "yosmallhiragana", "3087", + "yosmallkatakana", "30E7", + "yosmallkatakanahalfwidth", "FF6E", + "yotgreek", "03F3", + "yoyaekorean", "3188", + "yoyakorean", "3187", + "yoyakthai", "0E22", + "yoyingthai", "0E0D", + "yparen", "24B4", + "ypogegrammeni", "037A", + "ypogegrammenigreekcmb", "0345", + "yr", "01A6", + "yring", "1E99", + "ysuperior", "02B8", + "ytilde", "1EF9", + "yturned", "028E", + "yuhiragana", "3086", + "yuikorean", "318C", + "yukatakana", "30E6", + "yukatakanahalfwidth", "FF95", + "yukorean", "3160", + "yusbigcyrillic", "046B", + "yusbigiotifiedcyrillic", "046D", + "yuslittlecyrillic", "0467", + "yuslittleiotifiedcyrillic", "0469", + "yusmallhiragana", "3085", + "yusmallkatakana", "30E5", + "yusmallkatakanahalfwidth", "FF6D", + "yuyekorean", "318B", + "yuyeokorean", "318A", + "yyabengali", "09DF", + "yyadeva", "095F", + "z", "007A", + "zaarmenian", "0566", + "zacute", "017A", + "zadeva", "095B", + "zagurmukhi", "0A5B", + "zaharabic", "0638", + "zahfinalarabic", "FEC6", + "zahinitialarabic", "FEC7", + "zahiragana", "3056", + "zahmedialarabic", "FEC8", + "zainarabic", "0632", + "zainfinalarabic", "FEB0", + "zakatakana", "30B6", + "zaqefgadolhebrew", "0595", + "zaqefqatanhebrew", "0594", + "zarqahebrew", "0598", + "zayin", "05D6", + "zayindagesh", "FB36", + "zayindageshhebrew", "FB36", + "zayinhebrew", "05D6", + "zbopomofo", "3117", + "zcaron", "017E", + "zcircle", "24E9", + "zcircumflex", "1E91", + "zcurl", "0291", + "zdot", "017C", + "zdotaccent", "017C", + "zdotbelow", "1E93", + "zecyrillic", "0437", + "zedescendercyrillic", "0499", + "zedieresiscyrillic", "04DF", + "zehiragana", "305C", + "zekatakana", "30BC", + "zero", "0030", + "zeroarabic", "0660", + "zerobengali", "09E6", + "zerodeva", "0966", + "zerogujarati", "0AE6", + "zerogurmukhi", "0A66", + "zerohackarabic", "0660", + "zeroinferior", "2080", + "zeromonospace", "FF10", + "zeropersian", "06F0", + "zerosuperior", "2070", + "zerothai", "0E50", + "zerowidthjoiner", "FEFF", + "zerowidthnonjoiner", "200C", + "zerowidthspace", "200B", + "zeta", "03B6", + "zhbopomofo", "3113", + "zhearmenian", "056A", + "zhebrevecyrillic", "04C2", + "zhecyrillic", "0436", + "zhedescendercyrillic", "0497", + "zhedieresiscyrillic", "04DD", + "zihiragana", "3058", + "zikatakana", "30B8", + "zinorhebrew", "05AE", + "zlinebelow", "1E95", + "zmonospace", "FF5A", + "zohiragana", "305E", + "zokatakana", "30BE", + "zparen", "24B5", + "zretroflexhook", "0290", + "zstroke", "01B6", + "zuhiragana", "305A", + "zukatakana", "30BA", ); -$prog = $0; + +my $prog = $0; $prog =~ s@.*/@@; -$groff_sys_fontdir = "@FONTDIR@"; +my $groff_sys_fontdir = "@FONTDIR@"; + +use Getopt::Std; +getopts('a:d:e:i:mnsvx'); -do 'getopts.pl'; -do Getopts('a:d:e:i:mnsvx'); +our ($opt_a, $opt_d, $opt_e, $opt_i, $opt_m, $opt_n, $opt_s, $opt_v, $opt_x); if ($opt_v) { print "GNU afmtodit (groff) version @VERSION@\n"; @@ -6058,20 +6064,32 @@ " [-i n] afmfile mapfile font\n"; } -$afm = $ARGV[0]; -$map = $ARGV[1]; -$font = $ARGV[2]; -$desc = $opt_d || "DESC"; -$sys_map = $groff_sys_fontdir . "/devps/generate/" . $map; -$sys_desc = $groff_sys_fontdir . "/devps/" . $desc; +my $afm = $ARGV[0]; +my $map = $ARGV[1]; +my $font = $ARGV[2]; +my $desc = $opt_d || "DESC"; +my $sys_map = $groff_sys_fontdir . "/devps/generate/" . $map; +my $sys_desc = $groff_sys_fontdir . "/devps/" . $desc; # read the afm file +my $psname; +my $italic_angle = 0; +my (@kern1, @kern2, @kernx); +my (%italic_correction, %left_italic_correction); +my %subscript_correction; +# my %ligs +my %ligatures; +my (@encoding, %in_encoding); +my (%width, %height, %depth); +my (%left_side_bearing, %right_side_bearing); + open(AFM, $afm) || die "$prog: can't open \`$ARGV[0]': $!\n"; while () { chop; - @field = split(' '); + my @field = split(' '); + next if $#field < 0; if ($field[0] eq "FontName") { $psname = $field[1]; } @@ -6080,9 +6098,9 @@ } elsif ($field[0] eq "KPX") { if ($#field == 3) { - push(kern1, $field[1]); - push(kern2, $field[2]); - push(kernx, $field[3]); + push(@kern1, $field[1]); + push(@kern2, $field[2]); + push(@kernx, $field[3]); } } elsif ($field[0] eq "italicCorrection") { @@ -6097,18 +6115,19 @@ elsif ($field[0] eq "StartCharMetrics") { while () { @field = split(' '); + next if $#field < 0; last if ($field[0] eq "EndCharMetrics"); if ($field[0] eq "C") { - $c = -1; - $wx = 0; - $n = ""; + my $w; + my $wx = 0; + my $n = ""; # %ligs = (); - $lly = 0; - $ury = 0; - $llx = 0; - $urx = 0; - $c = $field[1]; - $i = 2; + my $lly = 0; + my $ury = 0; + my $llx = 0; + my $urx = 0; + my $c = $field[1]; + my $i = 2; while ($i <= $#field) { if ($field[$i] eq "WX") { $w = $field[$i + 1]; @@ -6145,7 +6164,7 @@ $depth{$n} = -$lly; $left_side_bearing{$n} = -$llx; $right_side_bearing{$n} = $urx - $w; -# while (($lig, $glyph2) = each %ligs) { +# while ((my $lig, my $glyph2) = each %ligs) { # $ligatures{$lig} = $n . " " . $glyph2; # } } @@ -6156,6 +6175,7 @@ # read the DESC file +my ($sizescale, $resolution, $unitwidth); $sizescale = 1; open(DESC, $desc) || open(DESC, $sys_desc) || @@ -6163,24 +6183,32 @@ while () { next if /^#/; chop; - @field = split(' '); + my @field = split(' '); + next if $#field < 0; last if $field[0] eq "charset"; - if ($field[0] eq "res") { $resolution = $field[1]; } - if ($field[0] eq "unitwidth") { $unitwidth = $field[1]; } - if ($field[0] eq "sizescale") { $sizescale = $field[1]; } + if ($field[0] eq "res") { + $resolution = $field[1]; + } + elsif ($field[0] eq "unitwidth") { + $unitwidth = $field[1]; + } + elsif ($field[0] eq "sizescale") { + $sizescale = $field[1]; + } } close(DESC); if ($opt_e) { # read the encoding file - $sys_opt_e = $groff_sys_fontdir . "/devps/" . $opt_e; + my $sys_opt_e = $groff_sys_fontdir . "/devps/" . $opt_e; open(ENCODING, $opt_e) || open(ENCODING, $sys_opt_e) || die "$prog: can't open \`$opt_e' or \`$sys_opt_e': $!\n"; while () { next if /^#/; chop; - @field = split(' '); + my @field = split(' '); + next if $#field < 0; if ($#field == 1) { if ($field[1] >= 0 && defined $width{$field[0]}) { $encoding[$field[1]] = $field[0]; @@ -6193,29 +6221,41 @@ # read the map file +my (%nmap, %map); + open(MAP, $map) || open(MAP, $sys_map) || die "$prog: can't open \`$map' or \`$sys_map': $!\n"; while () { next if /^#/; chop; - @field = split(' '); + my @field = split(' '); + next if $#field < 0; if ($#field == 1) { - if (defined $mapped{$field[1]}) { - warn "Both $mapped{$field[1]} and $field[0] map to $field[1]"; - } - elsif ($field[1] eq "space") { - # the PostScript character "space" is automatically mapped - # to the groff character "space"; this is for grops - warn "you are not allowed to map to the groff character `space'"; + if ($field[1] eq "space") { + # The PostScript character "space" is automatically mapped + # to the groff character "space"; this is for grops. + warn "you are not allowed to map to " . + "the groff character \`space'"; } elsif ($field[0] eq "space") { - warn "you are not allowed to map the PostScript character `space'"; + warn "you are not allowed to map " . + "the PostScript character \`space'"; } else { $nmap{$field[0]} += 0; - $map{$field[0],$nmap{$field[0]}} = $field[1]; + $map{$field[0], $nmap{$field[0]}} = $field[1]; $nmap{$field[0]} += 1; - $mapped{$field[1]} = $field[0]; + + # There is more then one way to make a PS glyph name; + # let us try unicode names with `uni' and `u' prefixes. + my $utmp = $AGL_to_unicode{$field[0]}; + if (defined $utmp && $utmp =~ /^[0-9A-F]{4}$/) { + foreach my $unicodepsname ("uni" . $utmp, "u" . $utmp) { + $nmap{$unicodepsname} += 0; + $map{$unicodepsname, $nmap{$unicodepsname}} = $field[1]; + $nmap{$unicodepsname} += 1; + } + } } } } @@ -6223,34 +6263,142 @@ $italic_angle = $opt_a if $opt_a; -# add unencoded characters and unmapped characters of the form `uniXXXX' if (!$opt_x) { - $i = ($#encoding > 256) ? ($#encoding + 1) : 256; - while ($ch = each %width) { + my %mapped; + my $i = ($#encoding > 256) ? ($#encoding + 1) : 256; + while (my $ch = each %width) { + # add unencoded characters if (!$in_encoding{$ch}) { $encoding[$i] = $ch; $i++; } - if (!$nmap{$ch}) { - $u1 = $AGL_to_unicode{$ch}; - if (!$u1 && ($ch =~ /^uni([0-9A-F]{4})$/)) { - $u1 = "u" . $1; + if ($nmap{$ch}) { + for (my $j = 0; $j < $nmap{$ch}; $j++) { + if (defined $mapped{$map{$ch, $j}}) { + warn "both $mapped{$map{$ch, $j}} and $ch " . + "map to $map{$ch, $j}"; + } + else { + $mapped{$map{$ch, $j}} = $ch; + } + } + } + else { + my $u = ""; # the resulting groff glyph name + my $ucomp = ""; # Unicode string before decomposition + my $utmp = ""; # temporary value + my $component = ""; + my $nv = 0; + + # Step 1: + # Drop all characters from the glyph name starting with the + # first occurrence of a period (U+002E FULL STOP), if any. + # ?? We avoid mapping of glyphs with periods, since they are + # likely to be variant glyphs, leading to a `many ps glyphs -- + # one groff glyph' conflict. + # + # If multiple glyphs in the font represent the same character + # in the Unicode standard, as do `A' and `A.swash', for example, + # they can be differentiated by using the same base name with + # different suffixes. This suffix (the part of glyph name that + # follows the first period) does not participate in the + # computation of a character sequence. It can be used by font + # designers to indicate some characteristics of the glyph. The + # suffix may contain periods or any other permitted characters. + # Small cap A, for example, could be named `uni0041.sc' or `A.sc'. + + next if $ch =~ /\./; + + # Step 2: + # Split the remaining string into a sequence of components, + # using the underscore character (U+005F LOW LINE) as the + # delimiter. + + while ($ch =~ /([^_]+)/g) { + $component = $1; + + # Step 3: + # Map each component to a character string according to the + # procedure below: + # + # * If the component is in the Adobe Glyph List, then map + # it to the corresponding character in that list. + + $utmp = $AGL_to_unicode{$component}; + if ($utmp) { + $utmp = "U+" . $utmp; + } + + # * Otherwise, if the component is of the form `uni' + # (U+0075 U+006E U+0069) followed by a sequence of + # uppercase hexadecimal digits (0 .. 9, A .. F, i.e., + # U+0030 .. U+0039, U+0041 .. U+0046), the length of + # that sequence is a multiple of four, and each group of + # four digits represents a number in the set {0x0000 .. + # 0xD7FF, 0xE000 .. 0xFFFF}, then interpret each such + # number as a Unicode scalar value and map the component + # to the string made of those scalar values. + + elsif ($component =~ /^uni([0-9A-F]{4})+$/) { + while ($component =~ /([0-9A-F]{4})/g) { + $nv = hex("0x" . $1); + if ($nv <= 0xD7FF || $nv >= 0xE000) { + $utmp .= "U+" . $1; + } + else { + $utmp = ""; + last; + } + } + } + + # * Otherwise, if the component is of the form `u' (U+0075) + # followed by a sequence of four to six uppercase + # hexadecimal digits {0 .. 9, A .. F} (U+0030 .. U+0039, + # U+0041 .. U+0046), and those digits represent a number + # in {0x0000 .. 0xD7FF, 0xE000 .. 0x10FFFF}, then + # interpret this number as a Unicode scalar value and map + # the component to the string made of this scalar value. + + elsif ($component =~ /^u([0-9A-F]{4,6})$/) { + $nv = hex("0x" . $1); + if ($nv <= 0xD7FF || ($nv >= 0xE000 && $nv <= 0x10FFFF)) { + $utmp .= "U+" . $1; + } + } + + # Finally, concatenate those strings; the result is the + # character string to which the glyph name is mapped. + + $ucomp .= $utmp if $utmp; + } + + # Unicode decomposition + while ($ucomp =~ /([0-9A-F]{4,6})/g) { + $component = $1; + $utmp = $unicode_decomposed{$component}; + $u .= "_" . ($utmp ? $utmp : $component); } - if ($u1) { - $u2 = $unicode_decomposed{$u1}; - $u = $u2 ? $u2 : $u1; + $u =~ s/^_/u/; + if ($u) { + if (defined $mapped{$u}) { + warn "both $mapped{$u} and $ch map to $u"; + } + else { + $mapped{$u} = $ch; + } $nmap{$ch} += 1; - $map{$ch,"0"} = $u; + $map{$ch, "0"} = $u; } } } } -# check explicitly for groff's standard ligatures -- many afm files don't -# have proper `L' entries +# Check explicitly for groff's standard ligatures -- many afm files don't +# have proper `L' entries. -%default_ligatures = ( +my %default_ligatures = ( "fi", "f i", "fl", "f l", "ff", "f f", @@ -6258,7 +6406,7 @@ "ffl", "ff l", ); -while (($lig, $components) = each %default_ligatures) { +while (my ($lig, $components) = each %default_ligatures) { if (defined $width{$lig} && !defined $ligatures{$lig}) { $ligatures{$lig} = $components; } @@ -6273,17 +6421,17 @@ print("internalname $psname\n") if $psname; print("special\n") if $opt_s; printf("slant %g\n", $italic_angle) if $italic_angle != 0; -printf("spacewidth %d\n", do conv($width{"space"})) if defined $width{"space"}; +printf("spacewidth %d\n", conv($width{"space"})) if defined $width{"space"}; if ($opt_e) { - $e = $opt_e; + my $e = $opt_e; $e =~ s@.*/@@; print("encoding $e\n"); } if (!$opt_n && %ligatures) { print("ligatures"); - while ($lig = each %ligatures) { + while (my $lig = each %ligatures) { print(" $lig"); } print(" 0\n"); @@ -6292,17 +6440,17 @@ if ($#kern1 >= 0) { print("kernpairs\n"); - for ($i = 0; $i <= $#kern1; $i++) { - $c1 = $kern1[$i]; - $c2 = $kern2[$i]; + for (my $i = 0; $i <= $#kern1; $i++) { + my $c1 = $kern1[$i]; + my $c2 = $kern2[$i]; if ($nmap{$c1} != 0 && $nmap{$c2} != 0) { - for ($j = 0; $j < $nmap{$c1}; $j++) { - for ($k = 0; $k < $nmap{$c2}; $k++) { + for (my $j = 0; $j < $nmap{$c1}; $j++) { + for (my $k = 0; $k < $nmap{$c2}; $k++) { if ($kernx[$i] != 0) { printf("%s %s %d\n", - $map{$c1,$j}, - $map{$c2,$k}, - do conv($kernx[$i])); + $map{$c1, $j}, + $map{$c2, $k}, + conv($kernx[$i])); } } } @@ -6310,17 +6458,22 @@ } } +my ($asc_boundary, $desc_boundary, $xheight, $slant); + # characters not shorter than asc_boundary are considered to have ascenders -$asc_boundary = $height{"t"} - 1; +$asc_boundary = 0; +$asc_boundary = $height{"t"} if defined $height{"t"}; +$asc_boundary -= 1; # likewise for descenders -$desc_boundary = $depth{"g"}; -$desc_boundary = $depth{"j"} if $depth{"j"} < $desc_boundary; -$desc_boundary = $depth{"p"} if $depth{"p"} < $desc_boundary; -$desc_boundary = $depth{"q"} if $depth{"q"} < $desc_boundary; -$desc_boundary = $depth{"y"} if $depth{"y"} < $desc_boundary; +$desc_boundary = 0; +$desc_boundary = $depth{"g"} if defined $depth{"g"}; +$desc_boundary = $depth{"j"} if defined $depth{"g"} && $depth{"j"} < $desc_boundary; +$desc_boundary = $depth{"p"} if defined $depth{"p"} && $depth{"p"} < $desc_boundary; +$desc_boundary = $depth{"q"} if defined $depth{"q"} && $depth{"q"} < $desc_boundary; +$desc_boundary = $depth{"y"} if defined $depth{"y"} && $depth{"y"} < $desc_boundary; $desc_boundary -= 1; if (defined $height{"x"}) { @@ -6338,21 +6491,21 @@ $slant = 0 if $slant < 0; print("charset\n"); -for ($i = 0; $i <= $#encoding; $i++) { - $ch = $encoding[$i]; - if ($ch ne "" && $ch ne "space") { - $map{$ch,"0"} = "---" if $nmap{$ch} == 0; - $type = 0; - $h = $height{$ch}; +for (my $i = 0; $i <= $#encoding; $i++) { + my $ch = $encoding[$i]; + if (defined $ch && $ch ne "" && $ch ne "space") { + $map{$ch, "0"} = "---" if !defined $nmap{$ch} || $nmap{$ch} == 0; + my $type = 0; + my $h = $height{$ch}; $h = 0 if $h < 0; - $d = $depth{$ch}; + my $d = $depth{$ch}; $d = 0 if $d < 0; $type = 1 if $d >= $desc_boundary; $type += 2 if $h >= $asc_boundary; - printf("%s\t%d", $map{$ch,"0"}, do conv($width{$ch})); - $italic_correction = 0; - $left_math_fit = 0; - $subscript_correction = 0; + printf("%s\t%d", $map{$ch, "0"}, conv($width{$ch})); + my $italic_correction = 0; + my $left_math_fit = 0; + my $subscript_correction = 0; if (defined $opt_i) { $italic_correction = $right_side_bearing{$ch} + $opt_i; $italic_correction = 0 if $italic_correction < 0; @@ -6374,35 +6527,37 @@ $subscript_correction = $subscript_correction{$ch}; } if ($subscript_correction != 0) { - printf(",%d,%d", do conv($h), do conv($d)); - printf(",%d,%d,%d", do conv($italic_correction), - do conv($left_math_fit), - do conv($subscript_correction)); + printf(",%d,%d", conv($h), conv($d)); + printf(",%d,%d,%d", conv($italic_correction), + conv($left_math_fit), + conv($subscript_correction)); } elsif ($left_math_fit != 0) { - printf(",%d,%d", do conv($h), do conv($d)); - printf(",%d,%d", do conv($italic_correction), - do conv($left_math_fit)); + printf(",%d,%d", conv($h), conv($d)); + printf(",%d,%d", conv($italic_correction), + conv($left_math_fit)); } elsif ($italic_correction != 0) { - printf(",%d,%d", do conv($h), do conv($d)); - printf(",%d", do conv($italic_correction)); + printf(",%d,%d", conv($h), conv($d)); + printf(",%d", conv($italic_correction)); } elsif ($d != 0) { - printf(",%d,%d", do conv($h), do conv($d)); + printf(",%d,%d", conv($h), conv($d)); } else { # always put the height in to stop groff guessing - printf(",%d", do conv($h)); + printf(",%d", conv($h)); } printf("\t%d", $type); printf("\t%d\t%s\n", $i, $ch); - for ($j = 1; $j < $nmap{$ch}; $j++) { - printf("%s\t\"\n", $map{$ch,$j}); + if (defined $nmap{$ch}) { + for (my $j = 1; $j < $nmap{$ch}; $j++) { + printf("%s\t\"\n", $map{$ch, $j}); + } } } - if ($ch eq "space" && defined $width{"space"}) { - printf("space\t%d\t0\t%d\tspace\n", do conv($width{"space"}), $i); + if (defined $ch && $ch eq "space" && defined $width{"space"}) { + printf("space\t%d\t0\t%d\tspace\n", conv($width{"space"}), $i); } } diff -ruN groff-1.19.1/src/utils/hpftodit/hpftodit.cpp groff-1.19.2/src/utils/hpftodit/hpftodit.cpp --- groff-1.19.1/src/utils/hpftodit/hpftodit.cpp 2004-04-07 18:25:21.000000000 +0200 +++ groff-1.19.2/src/utils/hpftodit/hpftodit.cpp 2005-05-26 15:37:21.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ /* TODO @@ -145,6 +145,7 @@ byte get_byte(); uint16 get_uint16(); uint32 get_uint32(); + uint32 get_uint32(char *orig); void seek(uint32 n); private: unsigned char *buf_; @@ -157,6 +158,7 @@ uint16 type; uint32 count; uint32 value; + char orig_value[4]; entry() : present(0) { } }; @@ -463,6 +465,22 @@ return n; } +uint32 +File::get_uint32(char *orig) +{ + if (end_ - ptr_ < 4) + fatal("unexpected end of file"); + unsigned char v = *ptr_++; + uint32 n = v; + orig[0] = v; + for (int i = 1; i < 4; i++) { + v = *ptr_++; + orig[i] = v; + n += v << i*8; + } + return n; +} + static void read_tags(File &f) { @@ -481,7 +499,7 @@ p->present = 1; p->type = f.get_uint16(); p->count = f.get_uint32(); - p->value = f.get_uint32(); + p->value = f.get_uint32(p->orig_value); } } @@ -547,8 +565,9 @@ while (--n) *p++ = f.get_byte(); } - else // value contains the string - sprintf(font_name, "%.*s", count, (char*)(tag_info(font_name_tag).value)); + else // orig_value contains the string + sprintf(font_name, "%.*s", + count, tag_info(font_name_tag).orig_value); // remove any trailing space p = font_name + count - 1; @@ -717,13 +736,17 @@ { printf("pcltypeface "); require_tag(typeface_tag); - f.seek(tag_info(typeface_tag).value); - for (uint32 i = 0; i < tag_info(typeface_tag).count; i++) { - unsigned char c = f.get_byte(); - if (c == '\0') - break; - putchar(c); + if (tag_info(typeface_tag).count > 4) { + f.seek(tag_info(typeface_tag).value); + for (uint32 i = 0; i < tag_info(typeface_tag).count; i++) { + unsigned char c = f.get_byte(); + if (c == '\0') + break; + putchar(c); + } } + else + printf("%.4s", tag_info(typeface_tag).orig_value); printf("\n"); } @@ -1168,7 +1191,7 @@ printf("%c", f.get_byte()); } else - printf("%.4s", (char*)(tag_info(t).value)); + printf("%.4s", tag_info(t).orig_value); putchar('"'); } diff -ruN groff-1.19.1/src/utils/hpftodit/hpuni.cpp groff-1.19.2/src/utils/hpftodit/hpuni.cpp --- groff-1.19.1/src/utils/hpftodit/hpuni.cpp 2004-04-10 17:48:58.000000000 +0200 +++ groff-1.19.2/src/utils/hpftodit/hpuni.cpp 2005-05-26 15:37:21.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "lib.h" #include "stringclass.h" diff -ruN groff-1.19.1/src/utils/indxbib/indxbib.cpp groff-1.19.2/src/utils/indxbib/indxbib.cpp --- groff-1.19.1/src/utils/indxbib/indxbib.cpp 2004-04-08 13:33:33.000000000 +0200 +++ groff-1.19.2/src/utils/indxbib/indxbib.cpp 2005-05-26 15:37:21.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "lib.h" diff -ruN groff-1.19.1/src/utils/indxbib/Makefile.sub groff-1.19.2/src/utils/indxbib/Makefile.sub --- groff-1.19.1/src/utils/indxbib/Makefile.sub 2003-04-12 15:52:32.000000000 +0200 +++ groff-1.19.2/src/utils/indxbib/Makefile.sub 2004-06-03 08:24:29.000000000 +0200 @@ -11,7 +11,7 @@ $(srcdir)/signal.c NAMEPREFIX=$(g) -install_data: eign +install_data: $(srcdir)/eign -test -d $(datadir) || $(mkinstalldirs) $(datadir) -test -d $(dataprogramdir) || $(mkinstalldirs) $(dataprogramdir) -test -d $(datasubdir) || $(mkinstalldirs) $(datasubdir) diff -ruN groff-1.19.1/src/utils/indxbib/signal.c groff-1.19.2/src/utils/indxbib/signal.c --- groff-1.19.1/src/utils/indxbib/signal.c 2004-04-17 07:34:44.000000000 +0200 +++ groff-1.19.2/src/utils/indxbib/signal.c 2005-05-26 15:37:21.000000000 +0200 @@ -15,7 +15,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ /* Unfortunately vendors seem to have problems writing a that is correct for C++, so we implement all signal handling in C. */ diff -ruN groff-1.19.1/src/utils/lkbib/lkbib.cpp groff-1.19.2/src/utils/lkbib/lkbib.cpp --- groff-1.19.1/src/utils/lkbib/lkbib.cpp 2001-08-19 23:32:39.000000000 +0200 +++ groff-1.19.2/src/utils/lkbib/lkbib.cpp 2005-05-26 15:37:21.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "lib.h" diff -ruN groff-1.19.1/src/utils/lkbib/lkbib.man groff-1.19.2/src/utils/lkbib/lkbib.man --- groff-1.19.1/src/utils/lkbib/lkbib.man 2001-06-27 14:47:27.000000000 +0200 +++ groff-1.19.2/src/utils/lkbib/lkbib.man 2004-11-24 19:35:28.000000000 +0100 @@ -1,5 +1,5 @@ .ig -Copyright (C) 1989-2000, 2001 Free Software Foundation, Inc. +Copyright (C) 1989-2000, 2001, 2004 Free Software Foundation, Inc. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice @@ -16,17 +16,23 @@ translations approved by the Free Software Foundation instead of in the original English. .. -.ds g \" empty -.ds G \" empty +. +. .\" Like TP, but if specified indent is more than half .\" the current line-length - indent, use the default indent. .de Tp -.ie \\n(.$=0:((0\\$1)*2u>(\\n(.lu-\\n(.iu)) .TP -.el .TP "\\$1" +. ie \\n(.$=0:((0\\$1)*2u>(\\n(.lu-\\n(.iu)) .TP +. el .TP "\\$1" .. +. +. .TH LKBIB @MAN1EXT@ "@MDATE@" "Groff Version @VERSION@" +. +. .SH NAME lkbib \- search bibliographic databases +. +. .SH SYNOPSIS .B lkbib [ @@ -42,13 +48,16 @@ .BI \-t n ] .IR key \|.\|.\|. +. .PP It is possible to have whitespace between a command line option and its parameter. +. +. .SH DESCRIPTION .B lkbib searches bibliographic databases for references that contain the keys -.IR key \|.\|.\|. +.IR key \|.\|.\|.\& and prints any references found on the standard output. .B lkbib will search any databases given by @@ -68,10 +77,13 @@ .BR @g@indxbib (@MAN1EXT@) exists, then it will be searched instead; each index can cover multiple databases. +. +. .SH OPTIONS .TP .B \-v Print the version number. +. .TP .BI \-p filename Search @@ -79,11 +91,13 @@ Multiple .B \-p options can be used. +. .TP .BI \-i string When searching files for which no index exists, ignore the contents of fields whose names are in .IR string . +. .TP .BI \-t n Only require the first @@ -91,19 +105,27 @@ characters of keys to be given. Initially .I n -is 6. +is\~6. +. +. .SH ENVIRONMENT .TP \w'\fBREFER'u+2n .SB REFER Default database. +. +. .SH FILES .Tp \w'\fB@DEFAULT_INDEX@'u+2n .B @DEFAULT_INDEX@ Default database to be used if the .SB REFER environment variable is not set. +. +.TP .IB filename @INDEX_SUFFIX@ Index files. +. +. .SH "SEE ALSO" .BR @g@refer (@MAN1EXT@), .BR @g@lookbib (@MAN1EXT@), diff -ruN groff-1.19.1/src/utils/lookbib/lookbib.cpp groff-1.19.2/src/utils/lookbib/lookbib.cpp --- groff-1.19.1/src/utils/lookbib/lookbib.cpp 2003-12-28 23:13:10.000000000 +0100 +++ groff-1.19.2/src/utils/lookbib/lookbib.cpp 2005-05-26 15:37:21.000000000 +0200 @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "lib.h" diff -ruN groff-1.19.1/src/utils/lookbib/lookbib.man groff-1.19.2/src/utils/lookbib/lookbib.man --- groff-1.19.1/src/utils/lookbib/lookbib.man 2001-06-27 14:47:28.000000000 +0200 +++ groff-1.19.2/src/utils/lookbib/lookbib.man 2004-11-24 19:35:56.000000000 +0100 @@ -1,5 +1,5 @@ .ig -Copyright (C) 1989-2000, 2001 Free Software Foundation, Inc. +Copyright (C) 1989-2000, 2001, 2004 Free Software Foundation, Inc. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice @@ -16,9 +16,15 @@ translations approved by the Free Software Foundation instead of in the original English. .. +. +. .TH @G@LOOKBIB @MAN1EXT@ "@MDATE@" "Groff Version @VERSION@" +. +. .SH NAME @g@lookbib \- search bibliographic databases +. +. .SH SYNOPSIS .B @g@lookbib [ @@ -31,14 +37,19 @@ .BI \-t n ] .IR filename \|.\|.\|. +. .PP It is possible to have whitespace between a command line option and its parameter. +. +. .SH DESCRIPTION -@g@lookbib prints a prompt on the standard error (unless the standard input is not a terminal), +.B @g@lookbib +prints a prompt on the standard error (unless the standard input is not +a terminal), reads from the standard input a line containing a set of keywords, searches the bibliographic databases -.IR filename \|.\|.\|. +.IR filename \|.\|.\|.\& for references containing those keywords, prints any references found on the standard output, and repeats this process until the end of input. @@ -51,15 +62,19 @@ .BR @g@indxbib (@MAN1EXT@) exists, then it will be searched instead; each index can cover multiple databases. +. +. .SH OPTIONS .TP .B \-v Print the version number. +. .TP .BI \-i string When searching files for which no index exists, ignore the contents of fields whose names are in .IR string . +. .TP .BI \-t n Only require the first @@ -67,11 +82,15 @@ characters of keys to be given. Initially .I n -is 6. +is\~6. +. +. .SH FILES .TP \w'\fIfilename\fB@INDEX_SUFFIX@'u+2n .IB filename @INDEX_SUFFIX@ Index files. +. +. .SH "SEE ALSO" .BR @g@refer (@MAN1EXT@), .BR lkbib (@MAN1EXT@), diff -ruN groff-1.19.1/src/utils/pfbtops/pfbtops.c groff-1.19.2/src/utils/pfbtops/pfbtops.c --- groff-1.19.1/src/utils/pfbtops/pfbtops.c 2004-04-18 18:06:49.000000000 +0200 +++ groff-1.19.2/src/utils/pfbtops/pfbtops.c 2005-06-23 08:44:39.000000000 +0200 @@ -1,4 +1,4 @@ -/* Copyright (C) 1992, 2001, 2003, 2004 Free Software Foundation, Inc. +/* Copyright (C) 1992, 2001, 2003, 2004, 2005 Free Software Foundation, Inc. Written by James Clark (jjc@jclark.com) This file is part of groff. @@ -15,7 +15,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ /* This translates ps fonts in .pfb format to ASCII ps files. */ @@ -25,9 +25,11 @@ #include #include -#include #include +#define __GETOPT_PREFIX groff_ +#include + #include "nonposix.h" /* Binary bytes per output line. */ diff -ruN groff-1.19.1/src/utils/pfbtops/pfbtops.man groff-1.19.2/src/utils/pfbtops/pfbtops.man --- groff-1.19.1/src/utils/pfbtops/pfbtops.man 2003-03-17 17:33:46.000000000 +0100 +++ groff-1.19.2/src/utils/pfbtops/pfbtops.man 2004-11-24 20:59:03.000000000 +0100 @@ -1,5 +1,5 @@ .ig -Copyright (C) 1989-1995, 2001, 2003 Free Software Foundation, Inc. +Copyright (C) 1989-1995, 2001, 2003, 2004 Free Software Foundation, Inc. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice @@ -16,14 +16,25 @@ translations approved by the Free Software Foundation instead of in the original English. .. +. +. .TH PFBTOPS @MAN1EXT@ "@MDATE@" "Groff Version @VERSION@" +. +. .SH NAME pfbtops \- translate a PostScript font in .pfb format to ASCII +. +. .SH SYNOPSIS .B pfbtops [ +.B \-v +] +[ .I pfb_file ] +. +. .SH DESCRIPTION .B pfbtops translates a PostScript font in @@ -37,10 +48,18 @@ PostScript fonts for MS-DOS are normally supplied in .B .pfb format. +. .LP The resulting ASCII format PostScript font can be used with groff. It must first be listed in .BR @FONTDIR@/devps/download . +. +.SH OPTIONS +.TP +.B \-v +Print the version number. +. +. .SH "SEE ALSO" .BR grops (@MAN1EXT@) . diff -ruN groff-1.19.1/src/utils/tfmtodit/tfmtodit.cpp groff-1.19.2/src/utils/tfmtodit/tfmtodit.cpp --- groff-1.19.1/src/utils/tfmtodit/tfmtodit.cpp 2004-04-18 18:01:36.000000000 +0200 +++ groff-1.19.2/src/utils/tfmtodit/tfmtodit.cpp 2005-05-26 15:37:21.000000000 +0200 @@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */ /* I have tried to incorporate the changes needed for TeX 3.0 tfm files, but I haven't tested them. */ diff -ruN groff-1.19.1/src/utils/xtotroff/Makefile.in groff-1.19.2/src/utils/xtotroff/Makefile.in --- groff-1.19.1/src/utils/xtotroff/Makefile.in 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/utils/xtotroff/Makefile.in 2005-05-26 15:37:21.000000000 +0200 @@ -0,0 +1,62 @@ +# Copyright (C) 2004 +# Free Software Foundation, Inc. +# Written by James Clark (jjc@jclark.com) +# +# This file is part of groff. +# +# groff 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. +# +# groff 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 groff; see the file COPYING. If not, write to the Free Software +# Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. + +builddir=@abs_builddir@ +top_srcdir=@abs_top_srcdir@ +top_builddir=@abs_top_builddir@ +SHELL=@SHELL@ + +devdir=$(top_builddir)/font +driverdir=$(top_srcdir)/src/devices/xditview +mkinstalldirs=$(SHELL) $(top_srcdir)/mkinstalldirs + +xtotroff=$(builddir)/xtotroff +DPIS=75 100 + +all: + @echo "Say \`make fonts' to generate fonts for gxditview." + +fonts: $(xtotroff) $(driverdir)/DESC.in $(driverdir)/FontMap + fonts=`sed -e 's/[ ].*//' $(driverdir)/FontMap`; \ + for dpi in $(DPIS); do \ + echo Making devX$$dpi; \ + test -d $(devdir)/devX$$dpi || \ + $(mkinstalldirs) $(devdir)/devX$$dpi; \ + rm -f $(devdir)/devX$$dpi/DESC; \ + sed -e "s/res 75/res $$dpi/" $(driverdir)/DESC.in \ + >$(devdir)/devX$$dpi/DESC; \ + (cd $(devdir)/devX$$dpi; \ + rm -f Makefile.sub; \ + echo DEV=X$$dpi >Makefile.sub; \ + echo DEVFILES=DESC $$fonts >>Makefile.sub; \ + $(xtotroff) -r $$dpi -s 10 $(driverdir)/FontMap); \ + echo Making devX$$dpi-12; \ + test -d $(devdir)/devX$$dpi-12 || \ + $(mkinstalldirs) $(devdir)/devX$$dpi-12; \ + rm -f $(devdir)/devX$$dpi-12/DESC; \ + sed -e "s/res 75/res $$dpi/" \ + -e 's/unitwidth 10/unitwidth 12/' $(driverdir)/DESC.in \ + >$(devdir)/devX$$dpi-12/DESC; \ + (cd $(devdir)/devX$$dpi-12; \ + rm -f Makefile.sub; \ + echo DEV=X$$dpi-12 >Makefile.sub; \ + echo DEVFILES=DESC $$fonts >>Makefile.sub; \ + $(xtotroff) -r $$dpi -s 12 $(driverdir)/FontMap); \ + done diff -ruN groff-1.19.1/src/utils/xtotroff/Makefile.sub groff-1.19.2/src/utils/xtotroff/Makefile.sub --- groff-1.19.1/src/utils/xtotroff/Makefile.sub 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/utils/xtotroff/Makefile.sub 2004-11-24 20:20:48.000000000 +0100 @@ -0,0 +1,8 @@ +PROG=xtotroff$(EXEEXT) +MAN1=xtotroff.n +MLIB=$(LIBM) +XLIBS=$(LIBXUTIL) $(LIBGROFF) +EXTRA_CFLAGS=$(X_CFLAGS) +EXTRA_LDFLAGS=$(X_LIBS) $(X_PRE_LIBS) -lXaw -lXt -lX11 $(X_EXTRA_LIBS) +OBJS=xtotroff.$(OBJEXT) +CSRCS=$(srcdir)/xtotroff.c diff -ruN groff-1.19.1/src/utils/xtotroff/xtotroff.c groff-1.19.2/src/utils/xtotroff/xtotroff.c --- groff-1.19.1/src/utils/xtotroff/xtotroff.c 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/utils/xtotroff/xtotroff.c 2005-06-23 08:44:35.000000000 +0200 @@ -0,0 +1,299 @@ +/* + * xtotroff + * + * convert X font metrics into troff font metrics + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#define __GETOPT_PREFIX groff_ +#include + +#include "XFontName.h" +#include "DviChar.h" + +#define charWidth(fi,c) \ + ((fi)->per_char[(c) - (fi)->min_char_or_byte2].width) +#define charHeight(fi,c) \ + ((fi)->per_char[(c) - (fi)->min_char_or_byte2].ascent) +#define charDepth(fi,c) \ + ((fi)->per_char[(c) - (fi)->min_char_or_byte2].descent) +#define charLBearing(fi,c) \ + ((fi)->per_char[(c) - (fi)->min_char_or_byte2].lbearing) +#define charRBearing(fi,c) \ + ((fi)->per_char[(c) - (fi)->min_char_or_byte2].rbearing) + +extern const char *Version_string; +static char *program_name; + +Display *dpy; +unsigned resolution = 75; +unsigned point_size = 10; + +int charExists(XFontStruct * fi, int c) +{ + XCharStruct *p; + + /* `c' is always >= 0 */ + if ((unsigned int) c < fi->min_char_or_byte2 + || (unsigned int) c > fi->max_char_or_byte2) + return 0; + p = fi->per_char + (c - fi->min_char_or_byte2); + return p->lbearing != 0 || p->rbearing != 0 || p->width != 0 + || p->ascent != 0 || p->descent != 0 || p->attributes != 0; +} + +/* Canonicalize the font name by replacing scalable parts by *s. */ + +static int CanonicalizeFontName(char *font_name, char *canon_font_name) +{ + unsigned int attributes; + XFontName parsed; + + if (!XParseFontName(font_name, &parsed, &attributes)) { + fprintf(stderr, "not a standard name: %s\n", font_name); + return 0; + } + + attributes &= ~(FontNamePixelSize | FontNameAverageWidth + | FontNamePointSize + | FontNameResolutionX | FontNameResolutionY); + XFormatFontName(&parsed, attributes, canon_font_name); + return 1; +} + +static int +FontNamesAmbiguous(const char *font_name, char **names, int count) +{ + char name1[2048], name2[2048]; + int i; + + if (count == 1) + return 0; + + for (i = 0; i < count; i++) { + if (!CanonicalizeFontName(names[i], i == 0 ? name1 : name2)) { + fprintf(stderr, "bad font name: %s\n", names[i]); + return 1; + } + if (i > 0 && strcmp(name1, name2) != 0) { + fprintf(stderr, "ambiguous font name: %s\n", font_name); + fprintf(stderr, " matches %s\n", names[0]); + fprintf(stderr, " and %s\n", names[i]); + return 1; + } + } + return 0; +} + +static int MapFont(char *font_name, const char *troff_name) +{ + XFontStruct *fi; + int count; + char **names; + FILE *out; + unsigned int c; + unsigned int attributes; + XFontName parsed; + int j, k; + DviCharNameMap *char_map; + char encoding[256]; + char *s; + int wid; + char name_string[2048]; + + if (!XParseFontName(font_name, &parsed, &attributes)) { + fprintf(stderr, "not a standard name: %s\n", font_name); + return 0; + } + + attributes &= ~(FontNamePixelSize | FontNameAverageWidth); + attributes |= FontNameResolutionX; + attributes |= FontNameResolutionY; + attributes |= FontNamePointSize; + parsed.ResolutionX = resolution; + parsed.ResolutionY = resolution; + parsed.PointSize = point_size * 10; + XFormatFontName(&parsed, attributes, name_string); + + names = XListFonts(dpy, name_string, 100000, &count); + if (count < 1) { + fprintf(stderr, "bad font name: %s\n", font_name); + return 0; + } + + if (FontNamesAmbiguous(font_name, names, count)) + return 0; + + XParseFontName(names[0], &parsed, &attributes); + sprintf(encoding, "%s-%s", parsed.CharSetRegistry, + parsed.CharSetEncoding); + for (s = encoding; *s; s++) + if (isupper(*s)) + *s = tolower(*s); + char_map = DviFindMap(encoding); + if (!char_map) { + fprintf(stderr, "not a standard encoding: %s\n", encoding); + return 0; + } + + fi = XLoadQueryFont(dpy, names[0]); + if (!fi) { + fprintf(stderr, "font does not exist: %s\n", names[0]); + return 0; + } + + printf("%s -> %s\n", names[0], troff_name); + + { /* Avoid race while opening file */ + int fd; + (void) unlink(troff_name); + fd = open(troff_name, O_WRONLY | O_CREAT | O_EXCL, 0600); + out = fdopen(fd, "w"); + } + + if (!out) { + perror(troff_name); + return 0; + } + fprintf(out, "name %s\n", troff_name); + if (!strcmp(char_map->encoding, "adobe-fontspecific")) + fprintf(out, "special\n"); + if (charExists(fi, ' ')) { + int w = charWidth(fi, ' '); + if (w > 0) + fprintf(out, "spacewidth %d\n", w); + } + fprintf(out, "charset\n"); + for (c = fi->min_char_or_byte2; c <= fi->max_char_or_byte2; c++) { + const char *name = DviCharName(char_map, c, 0); + if (charExists(fi, c)) { + int param[5]; + + wid = charWidth(fi, c); + + fprintf(out, "%s\t%d", name ? name : "---", wid); + param[0] = charHeight(fi, c); + param[1] = charDepth(fi, c); + param[2] = 0; /* charRBearing (fi, c) - wid */ + param[3] = 0; /* charLBearing (fi, c) */ + param[4] = 0; /* XXX */ + for (j = 0; j < 5; j++) + if (param[j] < 0) + param[j] = 0; + for (j = 4; j >= 0; j--) + if (param[j] != 0) + break; + for (k = 0; k <= j; k++) + fprintf(out, ",%d", param[k]); + fprintf(out, "\t0\t0%o\n", c); + + if (name) { + for (k = 1; DviCharName(char_map, c, k); k++) { + fprintf(out, "%s\t\"\n", DviCharName(char_map, c, k)); + } + } + } + } + XUnloadFont(dpy, fi->fid); + fclose(out); + return 1; +} + +static void usage(FILE *stream) +{ + fprintf(stream, + "usage: %s [-r resolution] [-s pointsize] FontMap\n", + program_name); +} + +int main(int argc, char **argv) +{ + char troff_name[1024]; + char font_name[1024]; + char line[1024]; + char *a, *b, c; + FILE *map; + int opt; + static const struct option long_options[] = { + { "help", no_argument, 0, CHAR_MAX + 1 }, + { "version", no_argument, 0, 'v' }, + { NULL, 0, 0, 0 } + }; + + program_name = argv[0]; + + while ((opt = getopt_long(argc, argv, "gr:s:v", long_options, + NULL)) != EOF) { + switch (opt) { + case 'g': + /* unused; just for compatibility */ + break; + case 'r': + sscanf(optarg, "%u", &resolution); + break; + case 's': + sscanf(optarg, "%u", &point_size); + break; + case 'v': + printf("xtotroff (groff) version %s\n", Version_string); + exit(0); + break; + case CHAR_MAX + 1: /* --help */ + usage(stdout); + exit(0); + break; + case '?': + usage(stderr); + exit(1); + break; + } + } + if (argc - optind != 1) { + usage(stderr); + exit(1); + } + + dpy = XOpenDisplay(0); + if (!dpy) { + fprintf(stderr, "Can't connect to the X server.\n"); + fprintf(stderr, + "Make sure the DISPLAY environment variable is set correctly.\n"); + exit(1); + } + + map = fopen(argv[optind], "r"); + if (map == NULL) { + perror(argv[optind]); + exit(1); + } + + while (fgets(line, sizeof(line), map)) { + for (a = line, b = troff_name; *a; a++, b++) { + c = (*b = *a); + if (c == ' ' || c == '\t') + break; + } + *b = '\0'; + while (*a && (*a == ' ' || *a == '\t')) + ++a; + for (b = font_name; *a; a++, b++) + if ((*b = *a) == '\n') + break; + *b = '\0'; + if (!MapFont(font_name, troff_name)) + exit(1); + } + exit(0); +} diff -ruN groff-1.19.1/src/utils/xtotroff/xtotroff.man groff-1.19.2/src/utils/xtotroff/xtotroff.man --- groff-1.19.1/src/utils/xtotroff/xtotroff.man 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/src/utils/xtotroff/xtotroff.man 2004-11-24 21:12:41.000000000 +0100 @@ -0,0 +1,109 @@ +.ig +Copyright (C) 2004 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. + +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 included in +translations approved by the Free Software Foundation instead of in +the original English. +.. +. +. +.TH XTOTROFF @MAN1EXT@ "@MDATE@" "Groff Version @VERSION@" +. +. +.SH NAME +xtotroff \- convert X font metrics into GNU troff font metrics +. +. +.SH SYNOPSIS +.B xtotroff +[ +.BI \-r \%resolution +] +[ +.BI \-s \%point-size +] +[ +.B \-v +] +.I FontMap +. +.PP +It is possible to have whitespace between a command line option and its +parameter. +. +. +.SH DESCRIPTION +.B xtotroff +takes a +.IR FontMap , +which maps +.B groff +fonts to X11 fonts, +creates GNU +.B troff +metric files for all fonts listed. +Each line in +.I FontMap +consists of GNU +.B troff +font name and an X font name (XLFD) pattern, separated by whitespace. +Example: +. +.PP +.in +2n +.nf +TB -adobe-times-bold-r-normal--*-*-*-*-p-*-iso8859-1 +.fi +.in +. +.PP +The wildcards in the patterns are filled with the arguments to the +.B \-r +and +.B \-s +switches. +If a font name is still ambiguous, +.B xtotroff +aborts. +. +. +.SH OPTIONS +.TP +.BI \-r resolution +Set the resolution for all font patterns in +.IR FontMap . +The value is used for both the horizontal and vertical resolution. +If not specified, a resolution of 75dpi is assumed. +. +.TP +.BI \-s point-size +Set the point size for all font patterns in +.IR FontMap . +If not specified, a size of 10pt is assumed. +. +.TP +.B \-v +Print the version number. +. +. +.SH BUGS +The only supported font encodings are `iso8859-1' and `adobe-fontspecific'. +. +. +.SH "SEE ALSO" +.BR gxditview (@MAN1EXT@) +. +.\" Local Variables: +.\" mode: nroff +.\" End: diff -ruN groff-1.19.1/src/xditview/ad2c groff-1.19.2/src/xditview/ad2c --- groff-1.19.1/src/xditview/ad2c 2000-02-06 10:38:57.000000000 +0100 +++ groff-1.19.2/src/xditview/ad2c 1970-01-01 01:00:00.000000000 +0100 @@ -1,62 +0,0 @@ -#!/bin/sh -# -# ad2c : Convert app-defaults file to C strings decls. -# -# George Ferguson, ferguson@cs.rcohester.edu, 12 Nov 1990. -# 19 Mar 1991: gf -# Made it self-contained. -# 6 Jan 1992: mycroft@gnu.ai.mit.edu (Charles Hannum) -# Removed use of "-n" and ":read" label since Gnu and -# IBM sed print pattern space on "n" command. Still works -# with Sun sed, of course. -# 7 Jan 1992: matthew@sunpix.East.Sun.COM (Matthew Stier) -# Escape quotes after escaping backslashes. -# 8 Jul 1992: Version 1.6 -# Manpage fixes. -# 19 Apr 1993: Version 1.7 -# Remove comments that were inside the sed command since -# some versions of sed don't like them. The comments are -# now given here in the header. -# -# Comments on the script by line: -# /^!/d Remove comments -# /^$/d Remove blanks -# s/\\/\\\\/g Escape backslashes... -# s/\\$//g ...except the line continuation ones -# s/"/\\"/g Escape quotes -# s/^/"/ Add leading quote -# : test Establish label for later branch -# /\\$/b slash Branch to label "slash" if line ends in backslash -# s/$/",/ Otherwise add closing quote and comma... -# p ...output the line... -# d ...and clear the pattern space so it's not printed again -# : slash Branch comes here if line ends in backslash -# n Read next line, append to pattern space -# [...] The "d" and "s" commands that follow just delete -# comments and blank lines and escape control sequences -# b test Branch up to see if the line ends in backslash or not -# - -sed ' -/^!/d -/^$/d -s/\\/\\\\/g -s/\\$//g -s/"/\\"/g -s/^/"/ -: test -/\\$/b slash -s/$/",/ -p -d -: slash -n -/^!/d -/^$/d -s/"/\\"/g -s/\\\\/\\/g -s/\\n/\\\\n/g -s/\\t/\\\\t/g -s/\\f/\\\\f/g -s/\\b/\\\\b/g -b test' "$@" diff -ruN groff-1.19.1/src/xditview/ChangeLog groff-1.19.2/src/xditview/ChangeLog --- groff-1.19.1/src/xditview/ChangeLog 2004-04-19 16:07:33.000000000 +0200 +++ groff-1.19.2/src/xditview/ChangeLog 1970-01-01 01:00:00.000000000 +0100 @@ -1,531 +0,0 @@ -2004-04-17 Werner LEMBERG - - * device.c (scale_round): Round correctly for negative values - (this is the same function as in src/libs/libgroff/font.c). - Found by Paul Eggert. - -2003-11-10 Werner LEMBERG - - * Imakefile.in: s/@top_srcdir@/@abs_top_srcdir@/, - s/@groff_top_builddir@/@abs_top_builddir@/. - -Version 1.19 released -===================== - -2003-03-03 Werner LEMBERG - - * Imakefile.in (extraclean): Added gxditview._man. - -2003-01-28 Werner LEMBERG - - * Imakefile.in (SEP): New variable; set to @PATH_SEPARATOR@. - (GROFF_FONTPATH): Use it. - -2003-01-07 Werner LEMBERG - - * DviChar.c (Adobe_Symbol_map): Add `sqrt'. - -2003-01-06 Werner LEMBERG - - * DviChar.c (Adobe_Symbol_map): Add `integral'. - -2002-12-29 Werner LEMBERG - - * DviChar.c (ISO_8859_1_map): Remove `ap' and `eq'. - -2002-12-20 Werner LEMBERG - - * DviChar.c (Adobe_Symbol_map): Don't include `or'. - * draw.c (AdjustCharDeltas): Apply correction only if nadj > 1. - (DoCharacter): Call FlushCharCache if font size and font number - differ. - Reset `dw->dvi.cache.adjustable' properly. - -2002-12-09 Werner LEMBERG - - * DviChar.c (ISO_8859_1_map): Use `tno' symbol instead of `no'. - -2002-12-01 Werner LEMBERG - - * Imakefile.in: Use `InstallAppDefaultsLong' instead of - `InstallAppDefaults' to make it work if build directory isn't - $srcdir. - -2002-11-24 Werner LEMBERG - - * DviChar.c (Adobe_Symbol_map): Add glyph `braceex'. - -2002-11-14 Werner LEMBERG - - * DviChar.c (ISO_8859_1_map): Don't include `or'. - -Version 1.18.1 released -======================= - -2002-09-16 Werner LEMBERG - - * Imakefile.in (GROFF_LOCALFONTDIR): New variable. - (GROFF_FONTPATH): Use it. - Remove /usr/local/lib/font. - -Version 1.18.0 released -======================= - -2002-06-22 Werner LEMBERG - - * gxditview.c (main): Handle `-help' and `--help' correctly. - -2002-06-17 Colin Watson - - * Imakefile.in: s/@top_builddir@/@groff_top_builddir@/. - -2002-04-06 Werner LEMBERG - - * DviChar.c (ISO_8859_1_map, Adobe_Symbol_map): Remove all - characters > 0x80. - * parse.c (ParseInput): Ignore `m' command. - (ParseDrawFunction): Don't move for unknown drawing functions. - Don't move for `f' drawing function. - -2002-03-25 Werner LEMBERG - - * DviChar.c (ISO_8859_1_map): Use `t+-', `tmu', and `tdi' symbols - instead of `+-', `mu', and `di', respectively. - -2002-02-23 Werner LEMBERG - - * DviChar.c (ISO_8859_1_map): Add `mc' symbol. - -2001-09-22 Werner LEMBERG - - * Imakefile.in: Redefine `ProgramTargetHelper' as - `ProgramTargetHelperNoMan' and add a call to `InstallManPageLong' - to make the `install.man' target work if the build directory isn't - $srcdir. - -Version 1.17.2 released -======================= - -Version 1.17.1 released -======================= - -2001-04-21 Albert Chin-A-Young - - * Imakefile.in: Add support for recent HP architectures. - -Version 1.17 released -===================== - -2001-01-04 Rob Daasch - - * parse.c (ParseInput): Added 'F' to command switch to swallow - filename strings as ignored comments. - -2000-12-02 Werner LEMBERG - - * device.c (find_file): Remove home directory in search path. - -2000-11-14 Werner LEMBERG - - * device.c (open_device_file): Remove `path' parameter. - (find_file): Construct font path similar to groff: First the contents - of GROFF_FONT_PATH, then the home directory, and finally the default - font path. - * Imakefile.in: Fix GROFF_DATAPROGRAMDIR and GROFF_FONTPATH. - -2000-10-23 Werner LEMBERG - - Change installation structure for data files from .../groff/... to - .../groff//... to be conform with other GNU - programs. - - * Imakefile.in: Implement it. - -Version 1.16.1 released -======================= - -Version 1.16 released -===================== - -2000-05-18 Werner LEMBERG - - * DviChar.c: Adding `cq' as an alias for "'" in latin-1 map. - -2000-05-03 Werner LEMBERG - - * DviChar.c: Adding `dq' as an alias for `"' in latin-1 map. - -2000-04-28 Werner LEMBERG - - * DviChar.c: Replacing `md' glyph name with `pc' in latin-1 map to - make it distinct from the `md' glyph in the symbol font. - -2000-03-03 Werner LEMBERG - - * Imakefile replaced with Imakefile.in which will be configured by - the main configure script of groff. This will set the correct font - path, and it will make it possible to build xditview in a directory - different from $srcdir. - -2000-03-01 Colin Phipps - - * Dvi.c (OpenFile): Use tmpdir() for security reasons. - * xtotroff.c (MapFont): Avoid race while opening file. - -2000-02-06 Werner LEMBERG - - * Imakefile: Adapted to new directory structure. - - * README: Updated. - -Version 1.15 released -===================== - -1999-12-21 Werner LEMBERG - - * README: Fixed ftp GNU address. - -1999-12-13 Werner LEMBERG - - * device.c: Use extern declarations of strtok(), strchr(), and - getenv() only if not defined as macros. - -1999-11-18 Larry Jones - - * xditview.c: Add fallback_resources to allow running without - access to the app-defaults file. - - * Imakefile: Added rule to create app-defaults to a C header file. - - * GXditview-ad.h: New file containing fallback default resources. - - * ad2c: New file to do the app-defaults -> C header file - conversion. - -1999-10-27 Larry Jones - - * font.c (DisposeFontSizes): If there's a problem loading a font, - xditview will fall-back and use the default font, but it hasn't - checked before unloading fonts which could result in unloading the - default font (possibly multiple times) and then X errors. - -1999-09-13 Werner LEMBERG - - * Imakefile (extraclean): Added Makefile. - - * xditview.c (main, MakePrompt): Fixing compilation warnings. - - * TODO: Imakefile should be replaced with a configure script. - -1999-09-13 Werner LEMBERG - - * Makefile: Removed. - -1999-09-12 Werner LEMBERG - - * Imakefile (GROFF_FONTPATH): Another addition. - - * device.c (FONTPATH): Update to match current groff version. - -1999-09-11 Larry Jones - - * Imakefile (GROFF_LIBDIR, GROFF_FONTPATH): Update to match - current groff version. - - * Dvi.c (Realize, Destroy), DviP.h, draw.c (setFillGC), gray*.bm: - Allow 8 levels of gray rather than just 1. - - * draw.c (DrawFilledCircle, DrawFilledEllipse, DrawFilledPolygon): - Draw outlines to prevent gaps between abutting figures. - -1999-05-27 Werner LEMBERG - - * xtotroff.c (usage): Fixed typo. - -Mon Sep 11 10:40:33 1995 James Clark - - * device.c (INT_MIN, INT_MAX): Don't define if already defined. - -Mon Aug 8 11:14:11 1994 James Clark (jjc@jclark.com) - - * DviChar.c (Adobe_Symbol_map): Use \(nb for notsubset. - -Tue Apr 19 04:41:16 1994 James Clark (jjc@jclark.com) - - * Dvi.c (resources): Change default for background and foreground - to "XtDefaultBackground" and "XtDefaultForeground". - -Sat Feb 12 10:38:47 1994 James Clark (jjc@jclark.com) - - * DviChar.c (Adobe_Symbol_map): Rename radicalex to rn. - -Thu May 27 20:30:12 1993 James Clark (jjc@jclark.com) - - * device.c (isascii): Define if necessary. - (canonicalize_name): Cast argument to isdigit() to unsigned char. - -Thu Apr 29 18:36:57 1993 James Clark (jjc at jclark.com) - - * xditview.c: Include . - (NewFile): Don't declare rindex(). Use strrchr() rather than - rindex(). - -Tue Mar 30 15:12:09 1993 James Clark (jjc at jclark) - - * draw.c (charExists): Check that fi->per_char is not NULL. - -Sat Dec 12 17:42:40 1992 James Clark (jjc at jclark) - - * Dvi.c (SetGeometry): Cast XtMakeGeometryRequest arguments. - - * draw.c (DrawPolygon, DrawFilledPolygon): Cast Xtfree argument. - - * font.c (DisposeFontSizes): Add declaration. - - * draw.c (FakeCharacter): Add declaration. - -Wed Oct 28 13:24:00 1992 James Clark (jjc at jclark) - - * Imakefile (install.dev): Deleted. - (fonts): New target. - -Mon Oct 12 10:50:44 1992 James Clark (jjc at jclark) - - * Imakefile (install.dev): Say when we're installing devX*-12. - - * Imakefile (install.dev): Depends on DESC and FontMap. - -Thu Oct 1 20:03:45 1992 James Clark (jjc at jclark) - - * xditview.c (Syntax): Mention -filename option. - -Sat Aug 15 12:56:39 1992 James Clark (jjc at jclark) - - * GXditview.ad: Bind space and return to NextPage. Bind backspace - and delete to previous page. - - * DviChar.c (Adobe_Symbol_map): Add `an'. - - * DviChar.c (Adobe_Symbol_map): Add arrowvertex, arrowverttp, and - arrowvertbt. - -Mon Aug 10 11:54:27 1992 James Clark (jjc at jclark) - - * FontMap: Add m/p fields to the fonts names. - -Sat Aug 8 12:00:28 1992 James Clark (jjc at jclark) - - * DESC: Leave font positions 5-9 blank. - -Tue Jul 28 11:37:05 1992 James Clark (jjc at jclark) - - * Imakefile: Don't use gendef. Pass definition of FONTPATH using - DEFINES. - (path.h): Deleted. - (device.c): Don't include path.h. Provide default definition of - FONTPATH. - -Mon Jul 6 14:06:53 1992 James Clark (jjc at jclark) - - * Imakefile: Don't install tmac.X and tmac.Xps. - * tmac.X, tmac.Xps: Moved to ../macros. - - * Imakefile: Don't install eqnchar. - * eqnchar: Deleted. - -Sun Jun 14 12:55:02 1992 James Clark (jjc@jclark) - - * tmac.Xps: Handle OE, oe, lq, rq. - * draw.c (FakeCharacter): Don't handle these. - - * draw.c (FakeCharacter): Don't handle f/. - -Mon Jun 8 11:46:37 1992 James Clark (jjc@jclark) - - * tmac.X: Translate char160 to space. - -Sun Jun 7 14:39:53 1992 James Clark (jjc@jclark) - - * tmac.X: Do `mso tmac.psic' before restoring compatibility mode. - - * tmac.X: Add \(OE, \(oe, \(ah, \(ao, \(ho. - - * tmac.Xps: Make it work in compatibility mode. - Redo existing character definitions with .Xps-char. - Add more character definitions. - (Xps-char): New macro. - -Sat Jun 6 21:46:03 1992 James Clark (jjc@jclark) - - * DviChar.c (Adobe_Symbol_map): Add +h, +f, +p, Fn, lz. - * tmac.X: Add \(bq, \(Bq, \(aq. - * tmac.Xps: Handle \(aq, \(bq, \(Bq, \(Fn. - -Wed Jun 3 11:11:15 1992 James Clark (jjc@jclark) - - * DviChar.c (Adobe_Symbol_map): Add wp. - -Tue Apr 21 09:21:59 1992 James Clark (jjc at jclark) - - * GXditview.ad: Bind n, p, q keys to NextPage, PreviousPage and - Quit actions. - - * xditview.c (RerasterizeAction): New function. - (xditview_actions): Add RerasterizeAction. - * GXditview.ad: Bind r key to Rerasterize action. - -Fri Apr 17 08:25:36 1992 James Clark (jjc at jclark) - - * xditview.c: Add -filename option. - (main): Copy any -filename argument into current_file_name. - -Mon Mar 16 10:21:58 1992 James Clark (jjc at jclark) - - * tmac.X: Load tmac.pspic. - -Sun Mar 8 11:27:19 1992 James Clark (jjc at jclark) - - * Lex.c (GetLine, GetWord, GetNumber): Rewrite. - -Sat Oct 12 22:58:52 1991 James Clark (jjc at jclark) - - * Dvi.c (SetDevice): If the size change request is refused but a - larger geometry is offered, request that. - -Wed Oct 9 12:27:48 1991 James Clark (jjc at jclark) - - * font.c (InstallFontSizes): Ignore FontNameAverageWidth component. - - * Dvi.c (default_font_map): Add `adobe' to font names to avoid - ambiguity. - - * FontMap: New file. - * FontMap.X100, FontMap.X75: Deleted. - * xtotroff.c (main, usage): Add -s and -r options. - (MapFont): Change the font pattern to have the selected resolution and - size. - * Imakefile (install.dev): Use FontMap and supply appropriate -s - and -r options. - - * xtotroff.c (MapFont): Check for ambiguity by comparing canonicalized - font names. - - * DviP.h (DviFontList): Add initialized and scalable members. - (font.c): Add support for scalable fonts based on R5 xditview. - - * DviChar.c: Use xmalloc rather than malloc. - * xditview.c (xmalloc): New function. - * xtotroff.c (xmalloc): New function. - * other files: Use XtMalloc and XtFree instead of malloc and free. - -Thu Aug 29 20:15:31 1991 James Clark (jjc at jclark) - - * draw.c (setGC): Do multiplication in floating point to avoid - overflow. - -Tue Aug 13 12:04:41 1991 James Clark (jjc at jclark) - - * draw.c (FakeCharacter): Remove casts in defintion of pack2. - -Tue Jul 30 11:42:39 1991 James Clark (jjc at jclark) - - * tmac.Xps: New file. - * Imakefile (install): Install tmac.Xps. - -Tue Jul 2 09:31:37 1991 James Clark (jjc at jclark) - - * xtotroff.c (main): Pass argv[0] to usage(). - -Sun Jun 30 12:34:06 1991 James Clark (jjc at jclark) - - * xtotroff.c (MapFont): Handle the case where XLoadQueryFont - returns NULL. - -Sat Jun 29 12:32:52 1991 James Clark (jjc at jclark) - - * Imakefile: Use ../gendef to generate path.h. - -Sun Jun 16 13:26:34 1991 James Clark (jjc at jclark) - - * Imakefile (depend.o): Change to device.o. - -Sun Jun 2 12:17:56 1991 James Clark (jjc at jclark) - - * Imakefile: Remove spaces from the beginning of variable - assignment lines. - -Sun May 26 14:14:01 1991 James Clark (jjc at jclark) - - * xditview.c (Syntax): Update. - - * Dvi.c (DviSaveToFile, SaveToFile): New functions. - (FindPage): Check that we're not readingTmp before checking for - end of file of normal input file. - (ClassPartInitialize): New function. - * Dvi.h: Add declaration of DviSaveToFile. - * DviP.h: Add save method to DviClassPart. Declare - InheritSaveToFile. - * xditview.c (DoPrint, Print, PrintAction): New functions. - * xditview.c: Add print menu entry. - * xditview.c: Provide printCommand application resource. - * lex.c: Don't output EOF to temporary file. - - * Dvi.c (QueryGeometry): Check request->request_mode. - - * Dvi.c (SetDevice): New function. - (SetDeviceResolution): Deleted. - - * Dvi.c: Add resolution resource. - * DviP.h: Add definitions of XtNResolution and XtCResolution. - * xditview.c: Add -resolution argument. - * GXditview.ad: Add default for GXditview.height. - * Dvi.c (Initialize, SetDevice): Use default_resolution. - - * Dvi.c: Make MY_HEIGHT and MY_WIDTH use the paperlength and - paperwidth commands in the DESC file. - - * Dvi.c: Add SS font to default font map. - - * draw.c: Rewritten so as not to assume device and display - resolution is the same. - * DviP.h: Include device.h. Add device_font member to DviFontList. - Add adjustable array to DviCharCache. Add text_x_width, - text_device_width, word_flag, device_font, device_font_number, - device, native, device_resolution, display_resolution, - paperlength, paperwidth, scale_factor, sizescale members. - * Dvi.c (Initialize): Initialize new variable used by draw.c. - (Destroy): Call device_destroy. - * font.c (MaxFontPosition): New function. - (LookupFontSizeBySize): Handle sizescale. - (InstallFont): Load the device font. - (ForgetFonts): New function. - (QueryDeviceFont): New function. - * parse.c (ParseInput): Handle t and u commands. Split off - character output into draw.c. - (ParseDeviceControl): Ignore res command. Use the device argument - to the T command. - - * font.c (MapXNameToDviName): Ifdefed out. - - * path.h: New file. - * device.c, device.h: New files. - - * DviChar.c: Add entries for lB, rB, oq, lC, rC, md. - - * INSTALL: New file. - - * libxdvi: Merged into main directory. - * xtotroff.c, xditview.c: Change includes accordingly. - - * devX75, devX100: Merged into main directory. - * xditview.man: Renamed to gxditview.man. - - * Xditview.ad: Renamed to GXditview.ad. - * xditview.c (main): Use class of GXditview rather than xditview. - - * Imakefile: New file. - * Makefile: Deleted. - - * xtotroff.c (MapFont): Unlink output file before opening it. - - * Started separate ChangeLog. diff -ruN groff-1.19.1/src/xditview/DESC groff-1.19.2/src/xditview/DESC --- groff-1.19.1/src/xditview/DESC 2000-02-06 10:38:53.000000000 +0100 +++ groff-1.19.2/src/xditview/DESC 1970-01-01 01:00:00.000000000 +0100 @@ -1,9 +0,0 @@ -styles R I B BI -fonts 6 0 0 0 0 0 S -sizes 8 10 12 14 18 24 0 -res 75 -X11 -hor 1 -vert 1 -unitwidth 10 -postpro gxditview diff -ruN groff-1.19.1/src/xditview/device.c groff-1.19.2/src/xditview/device.c --- groff-1.19.1/src/xditview/device.c 2004-04-19 15:48:16.000000000 +0200 +++ groff-1.19.2/src/xditview/device.c 1970-01-01 01:00:00.000000000 +0100 @@ -1,604 +0,0 @@ -/* device.c */ - -#include -#include -#include - -#include -#include - -#include "device.h" - -#ifndef FONTPATH -#define FONTPATH "/usr/local/share/groff/font:/usr/local/lib/font:/usr/lib/font" -#endif - -#ifndef isascii -#define isascii(c) (1) -#endif - -extern void exit(); -#ifndef strtok -extern char *strtok(); -#endif -#ifndef strchr -extern char *strchr(); -#endif -#ifndef getenv -extern char *getenv(); -#endif - -/* Name of environment variable containing path to be used for -searching for device and font description files. */ -#define FONTPATH_ENV_VAR "GROFF_FONT_PATH" - -#define WS " \t\r\n" - -#ifndef INT_MIN -/* Minimum and maximum values a `signed int' can hold. */ -#define INT_MIN (-INT_MAX-1) -#define INT_MAX 2147483647 -#endif - -#define CHAR_TABLE_SIZE 307 - -struct _DeviceFont { - char *name; - int special; - DeviceFont *next; - Device *dev; - struct charinfo *char_table[CHAR_TABLE_SIZE]; - struct charinfo *code_table[256]; -}; - -struct charinfo { - int width; - int code; - struct charinfo *next; - struct charinfo *code_next; - char name[1]; -}; - -static char *current_filename = 0; -static int current_lineno = -1; - -static void error(); -static FILE *open_device_file(); -static DeviceFont *load_font(); -static Device *new_device(); -static DeviceFont *new_font(); -static void delete_font(); -static unsigned hash_name(); -static struct charinfo *add_char(); -static int read_charset_section(); -static char *canonicalize_name(); - -static -Device *new_device(name) - char *name; -{ - Device *dev; - - dev = XtNew(Device); - dev->sizescale = 1; - dev->res = 0; - dev->unitwidth = 0; - dev->fonts = 0; - dev->X11 = 0; - dev->paperlength = 0; - dev->paperwidth = 0; - dev->name = XtNewString(name); - return dev; -} - -void device_destroy(dev) - Device *dev; -{ - DeviceFont *f; - - if (!dev) - return; - f = dev->fonts; - while (f) { - DeviceFont *tem = f; - f = f->next; - delete_font(tem); - } - - XtFree(dev->name); - XtFree((char *)dev); -} - -Device *device_load(name) - char *name; -{ - Device *dev; - FILE *fp; - int err = 0; - char buf[256]; - - fp = open_device_file(name, "DESC", ¤t_filename); - if (!fp) - return 0; - dev = new_device(name); - current_lineno = 0; - while (fgets(buf, sizeof(buf), fp)) { - char *p; - current_lineno++; - p = strtok(buf, WS); - if (p) { - int *np = 0; - char *q; - - if (strcmp(p, "charset") == 0) - break; - if (strcmp(p, "X11") == 0) - dev->X11 = 1; - else if (strcmp(p, "sizescale") == 0) - np = &dev->sizescale; - else if (strcmp(p, "res") == 0) - np = &dev->res; - else if (strcmp(p, "unitwidth") == 0) - np = &dev->unitwidth; - else if (strcmp(p, "paperwidth") == 0) - np = &dev->paperwidth; - else if (strcmp(p, "paperlength") == 0) - np = &dev->paperlength; - - if (np) { - q = strtok((char *)0, WS); - if (!q || sscanf(q, "%d", np) != 1 || *np <= 0) { - error("bad argument"); - err = 1; - break; - } - } - } - } - fclose(fp); - current_lineno = -1; - if (!err) { - if (dev->res == 0) { - error("missing res line"); - err = 1; - } - else if (dev->unitwidth == 0) { - error("missing unitwidth line"); - err = 1; - } - } - if (dev->paperlength == 0) - dev->paperlength = dev->res*11; - if (dev->paperwidth == 0) - dev->paperwidth = dev->res*8 + dev->res/2; - if (err) { - device_destroy(dev); - dev = 0; - } - XtFree(current_filename); - current_filename = 0; - return dev; -} - - -DeviceFont *device_find_font(dev, name) - Device *dev; - char *name; -{ - DeviceFont *f; - - if (!dev) - return 0; - for (f = dev->fonts; f; f = f->next) - if (strcmp(f->name, name) == 0) - return f; - return load_font(dev, name); -} - -static -DeviceFont *load_font(dev, name) - Device *dev; - char *name; -{ - FILE *fp; - char buf[256]; - DeviceFont *f; - int special = 0; - - fp = open_device_file(dev->name, name, ¤t_filename); - if (!fp) - return 0; - current_lineno = 0; - for (;;) { - char *p; - - if (!fgets(buf, sizeof(buf), fp)) { - error("no charset line"); - return 0; - } - current_lineno++; - p = strtok(buf, WS); - /* charset must be on a line by itself */ - if (p && strcmp(p, "charset") == 0 && strtok((char *)0, WS) == 0) - break; - if (p && strcmp(p, "special") == 0) - special = 1; - } - f = new_font(name, dev); - f->special = special; - if (!read_charset_section(f, fp)) { - delete_font(f); - f = 0; - } - else { - f->next = dev->fonts; - dev->fonts = f; - } - fclose(fp); - XtFree(current_filename); - current_filename = 0; - return f; -} - -static -DeviceFont *new_font(name, dev) - char *name; - Device *dev; -{ - int i; - DeviceFont *f; - - f = XtNew(DeviceFont); - f->name = XtNewString(name); - f->dev = dev; - f->special = 0; - f->next = 0; - for (i = 0; i < CHAR_TABLE_SIZE; i++) - f->char_table[i] = 0; - for (i = 0; i < 256; i++) - f->code_table[i] = 0; - return f; -} - -static -void delete_font(f) - DeviceFont *f; -{ - int i; - - if (!f) - return; - XtFree(f->name); - for (i = 0; i < CHAR_TABLE_SIZE; i++) { - struct charinfo *ptr = f->char_table[i]; - while (ptr) { - struct charinfo *tem = ptr; - ptr = ptr->next; - XtFree((char *)tem); - } - } - XtFree((char *)f); -} - - -static -unsigned hash_name(name) - char *name; -{ - unsigned n = 0; - /* XXX do better than this */ - while (*name) - n = (n << 1) ^ *name++; - - return n; -} - -static -int scale_round(n, x, y) - int n, x, y; -{ - int y2; - - if (x == 0) - return 0; - y2 = y/2; - if (n >= 0) { - if (n <= (INT_MAX - y2)/x) - return (n*x + y2)/y; - return (int)(n*(double)x/(double)y + .5); - } - else { - if (-(unsigned)n <= (-(unsigned)INT_MIN - y2)/x) - return (n*x - y2)/y; - return (int)(n*(double)x/(double)y + .5); - } -} - -static -char *canonicalize_name(s) - char *s; -{ - static char ch[2]; - if (s[0] == 'c' && s[1] == 'h' && s[2] == 'a' && s[3] == 'r') { - char *p; - int n; - - for (p = s + 4; *p; p++) - if (!isascii(*p) || !isdigit((unsigned char)*p)) - return s; - n = atoi(s + 4); - if (n >= 0 && n <= 0xff) { - ch[0] = (char)n; - return ch; - } - } - return s; -} - -/* Return 1 if the character is present in the font; widthp gets the -width if non-null. */ - -int device_char_width(f, ps, name, widthp) - DeviceFont *f; - int ps; - char *name; - int *widthp; -{ - struct charinfo *p; - - name = canonicalize_name(name); - for (p = f->char_table[hash_name(name) % CHAR_TABLE_SIZE];; p = p->next) { - if (!p) - return 0; - if (strcmp(p->name, name) == 0) - break; - } - *widthp = scale_round(p->width, ps, f->dev->unitwidth); - return 1; -} - -int device_code_width(f, ps, code, widthp) - DeviceFont *f; - int ps; - int code; - int *widthp; -{ - struct charinfo *p; - - for (p = f->code_table[code & 0xff];; p = p->code_next) { - if (!p) - return 0; - if (p->code == code) - break; - } - *widthp = scale_round(p->width, ps, f->dev->unitwidth); - return 1; -} - -char *device_name_for_code(f, code) - DeviceFont *f; - int code; -{ - static struct charinfo *state = 0; - if (f) - state = f->code_table[code & 0xff]; - for (; state; state = state->code_next) - if (state->code == code && state->name[0] != '\0') { - char *name = state->name; - state = state->code_next; - return name; - } - return 0; -} - -int device_font_special(f) - DeviceFont *f; -{ - return f->special; -} - -static -struct charinfo *add_char(f, name, width, code) - DeviceFont *f; - char *name; - int width, code; -{ - struct charinfo **pp; - struct charinfo *ci; - - name = canonicalize_name(name); - if (strcmp(name, "---") == 0) - name = ""; - - ci = (struct charinfo *)XtMalloc(XtOffsetOf(struct charinfo, name[0]) - + strlen(name) + 1); - - strcpy(ci->name, name); - ci->width = width; - ci->code = code; - - if (*name != '\0') { - pp = &f->char_table[hash_name(name) % CHAR_TABLE_SIZE]; - ci->next = *pp; - *pp = ci; - } - pp = &f->code_table[code & 0xff]; - ci->code_next = *pp; - *pp = ci; - return ci; -} - -/* Return non-zero for success. */ - -static -int read_charset_section(f, fp) - DeviceFont *f; - FILE *fp; -{ - struct charinfo *last_charinfo = 0; - char buf[256]; - - while (fgets(buf, sizeof(buf), fp)) { - char *name; - int width; - int code; - char *p; - - current_lineno++; - name = strtok(buf, WS); - if (!name) - continue; /* ignore blank lines */ - p = strtok((char *)0, WS); - if (!p) /* end of charset section */ - break; - if (strcmp(p, "\"") == 0) { - if (!last_charinfo) { - error("first line of charset section cannot use `\"'"); - return 0; - } - else - (void)add_char(f, name, - last_charinfo->width, last_charinfo->code); - } - else { - char *q; - if (sscanf(p, "%d", &width) != 1) { - error("bad width field"); - return 0; - } - p = strtok((char *)0, WS); - if (!p) { - error("missing type field"); - return 0; - } - p = strtok((char *)0, WS); - if (!p) { - error("missing code field"); - return 0; - } - code = (int)strtol(p, &q, 0); - if (q == p) { - error("bad code field"); - return 0; - } - last_charinfo = add_char(f, name, width, code); - } - } - return 1; -} - -static -FILE *find_file(file, result) - char *file, **result; -{ - char *buf = NULL; - int bufsiz = 0; - int flen; - FILE *fp; - char *path; - char *env; - - env = getenv(FONTPATH_ENV_VAR); - path = XtMalloc(((env && *env) ? strlen(env) + 1 : 0) - + strlen(FONTPATH) + 1); - *path = '\0'; - if (env && *env) { - strcat(path, env); - strcat(path, ":"); - } - strcat(path, FONTPATH); - - *result = NULL; - - if (file == NULL) - return NULL; - if (*file == '\0') - return NULL; - - if (*file == '/') { - fp = fopen(file, "r"); - if (fp) - *result = XtNewString(file); - return fp; - } - - flen = strlen(file); - - while (*path) { - int len; - char *start, *end; - - start = path; - end = strchr(path, ':'); - if (end) - path = end + 1; - else - path = end = strchr(path, '\0'); - if (start >= end) - continue; - if (end[-1] == '/') - --end; - len = (end - start) + 1 + flen + 1; - if (len > bufsiz) { - if (buf) - buf = XtRealloc(buf, len); - else - buf = XtMalloc(len); - bufsiz = len; - } - memcpy(buf, start, end - start); - buf[end - start] = '/'; - strcpy(buf + (end - start) + 1, file); - fp = fopen(buf, "r"); - if (fp) { - *result = buf; - return fp; - } - } - XtFree(buf); - return NULL; -} - -static -FILE *open_device_file(device_name, file_name, result) - char *device_name, *file_name, **result; -{ - char *buf; - FILE *fp; - - buf = XtMalloc(3 + strlen(device_name) + 1 + strlen(file_name) + 1); - sprintf(buf, "dev%s/%s", device_name, file_name); - fp = find_file(buf, result); - if (!fp) { - fprintf(stderr, "can't find device file `%s'\n", file_name); - fflush(stderr); - } - XtFree(buf); - return fp; -} - -static -void error(s) - char *s; -{ - if (current_filename) { - fprintf(stderr, "%s:", current_filename); - if (current_lineno > 0) - fprintf(stderr, "%d:", current_lineno); - putc(' ', stderr); - } - fputs(s, stderr); - putc('\n', stderr); - fflush(stderr); -} - -/* -Local Variables: -c-indent-level: 4 -c-continued-statement-offset: 4 -c-brace-offset: -4 -c-argdecl-indent: 4 -c-label-offset: -4 -c-tab-always-indent: nil -End: -*/ diff -ruN groff-1.19.1/src/xditview/device.h groff-1.19.2/src/xditview/device.h --- groff-1.19.1/src/xditview/device.h 2000-02-06 10:38:59.000000000 +0100 +++ groff-1.19.2/src/xditview/device.h 1970-01-01 01:00:00.000000000 +0100 @@ -1,21 +0,0 @@ - -typedef struct _DeviceFont DeviceFont; - -typedef struct _Device { - char *name; - int sizescale; - int res; - int unitwidth; - int paperlength; - int paperwidth; - int X11; - DeviceFont *fonts; -} Device; - -extern void device_destroy(); -extern Device *device_load(); -extern DeviceFont *device_find_font(); -extern int device_char_width(); -extern char *device_name_for_code(); -extern int device_code_width(); -extern int device_font_special(); diff -ruN groff-1.19.1/src/xditview/draw.c groff-1.19.2/src/xditview/draw.c --- groff-1.19.1/src/xditview/draw.c 2003-07-02 16:44:15.000000000 +0200 +++ groff-1.19.2/src/xditview/draw.c 1970-01-01 01:00:00.000000000 +0100 @@ -1,745 +0,0 @@ -/* - * draw.c - * - * accept dvi function calls and translate to X - */ - -#include -#include -#include -#include -#include -#include - -/* math.h on a Sequent doesn't define M_PI, apparently */ -#ifndef M_PI -#define M_PI 3.14159265358979323846 -#endif - -#include "DviP.h" - -#define DeviceToX(dw, n) ((int)((n) * (dw)->dvi.scale_factor + .5)) -#define XPos(dw) (DeviceToX((dw), (dw)->dvi.state->x - \ - (dw)->dvi.text_device_width) + (dw)->dvi.text_x_width) -#define YPos(dw) (DeviceToX((dw), (dw)->dvi.state->y)) - -static int FakeCharacter(); - -/* font.c */ -extern int MaxFontPosition(); - -void -HorizontalMove(dw, delta) - DviWidget dw; - int delta; -{ - dw->dvi.state->x += delta; -} - -void -HorizontalGoto(dw, NewPosition) - DviWidget dw; - int NewPosition; -{ - dw->dvi.state->x = NewPosition; -} - -void -VerticalMove(dw, delta) - DviWidget dw; - int delta; -{ - dw->dvi.state->y += delta; -} - -void -VerticalGoto(dw, NewPosition) - DviWidget dw; - int NewPosition; -{ - dw->dvi.state->y = NewPosition; -} - -void -AdjustCacheDeltas (dw) - DviWidget dw; -{ - int extra; - int nadj; - int i; - - nadj = 0; - extra = DeviceToX(dw, dw->dvi.text_device_width) - - dw->dvi.text_x_width; - if (extra == 0) - return; - for (i = 0; i <= dw->dvi.cache.index; i++) - if (dw->dvi.cache.adjustable[i]) - ++nadj; - dw->dvi.text_x_width += extra; - if (nadj <= 1) - return; - for (i = 0; i <= dw->dvi.cache.index; i++) - if (dw->dvi.cache.adjustable[i]) { - int x; - int *deltap; - - x = extra/nadj; - deltap = &dw->dvi.cache.cache[i].delta; -#define MIN_DELTA 2 - if (*deltap > 0 && x + *deltap < MIN_DELTA) { - x = MIN_DELTA - *deltap; - if (x <= 0) - *deltap = MIN_DELTA; - else - x = 0; - } - else - *deltap += x; - extra -= x; - --nadj; - dw->dvi.cache.adjustable[i] = 0; - } -} - -void -FlushCharCache (dw) - DviWidget dw; -{ - if (dw->dvi.cache.char_index != 0) { - AdjustCacheDeltas (dw); - XDrawText (XtDisplay (dw), XtWindow (dw), dw->dvi.normal_GC, - dw->dvi.cache.start_x, dw->dvi.cache.start_y, - dw->dvi.cache.cache, dw->dvi.cache.index + 1); - } - dw->dvi.cache.index = 0; - dw->dvi.cache.max = DVI_TEXT_CACHE_SIZE; -#if 0 - if (dw->dvi.noPolyText) - dw->dvi.cache.max = 1; -#endif - dw->dvi.cache.char_index = 0; - dw->dvi.cache.cache[0].nchars = 0; - dw->dvi.cache.start_x = dw->dvi.cache.x = XPos (dw); - dw->dvi.cache.start_y = dw->dvi.cache.y = YPos (dw); -} - -void -Newline (dw) - DviWidget dw; -{ - FlushCharCache (dw); - dw->dvi.text_x_width = dw->dvi.text_device_width = 0; - dw->dvi.word_flag = 0; -} - -void -Word (dw) - DviWidget dw; -{ - dw->dvi.word_flag = 1; -} - -#define charWidth(fi,c) (\ - (fi)->per_char ?\ - (fi)->per_char[(c) - (fi)->min_char_or_byte2].width\ - :\ - (fi)->max_bounds.width\ -) - - -static -int charExists (fi, c) - XFontStruct *fi; - int c; -{ - XCharStruct *p; - - if (fi->per_char == NULL || - c < fi->min_char_or_byte2 || c > fi->max_char_or_byte2) - return 0; - p = fi->per_char + (c - fi->min_char_or_byte2); - return (p->lbearing != 0 || p->rbearing != 0 || p->width != 0 - || p->ascent != 0 || p->descent != 0 || p->attributes != 0); -} - -static void -DoCharacter (dw, c, wid) - DviWidget dw; - int c; - int wid; /* width in device units */ -{ - register XFontStruct *font; - register XTextItem *text; - int x, y; - - x = XPos(dw); - y = YPos(dw); - - /* - * quick and dirty extents calculation: - */ - if (!(y + 24 >= dw->dvi.extents.y1 - && y - 24 <= dw->dvi.extents.y2 -#if 0 - && x + 24 >= dw->dvi.extents.x1 - && x - 24 <= dw->dvi.extents.x2 -#endif - )) - return; - - if (y != dw->dvi.cache.y - || dw->dvi.cache.char_index >= DVI_CHAR_CACHE_SIZE) { - FlushCharCache (dw); - x = dw->dvi.cache.x; - dw->dvi.cache.adjustable[dw->dvi.cache.index] = 0; - } - /* - * load a new font, if the current block is not empty, - * step to the next. - */ - if (dw->dvi.cache.font_size != dw->dvi.state->font_size || - dw->dvi.cache.font_number != dw->dvi.state->font_number) - { - FlushCharCache (dw); - x = dw->dvi.cache.x; - dw->dvi.cache.font_size = dw->dvi.state->font_size; - dw->dvi.cache.font_number = dw->dvi.state->font_number; - dw->dvi.cache.font = QueryFont (dw, - dw->dvi.cache.font_number, - dw->dvi.cache.font_size); - if (dw->dvi.cache.cache[dw->dvi.cache.index].nchars != 0) { - ++dw->dvi.cache.index; - if (dw->dvi.cache.index >= dw->dvi.cache.max) - FlushCharCache (dw); - dw->dvi.cache.cache[dw->dvi.cache.index].nchars = 0; - dw->dvi.cache.adjustable[dw->dvi.cache.index] = 0; - } - } - if (x != dw->dvi.cache.x || dw->dvi.word_flag) { - if (dw->dvi.cache.cache[dw->dvi.cache.index].nchars != 0) { - ++dw->dvi.cache.index; - if (dw->dvi.cache.index >= dw->dvi.cache.max) - FlushCharCache (dw); - dw->dvi.cache.cache[dw->dvi.cache.index].nchars = 0; - dw->dvi.cache.adjustable[dw->dvi.cache.index] = 0; - } - dw->dvi.cache.adjustable[dw->dvi.cache.index] - = dw->dvi.word_flag; - dw->dvi.word_flag = 0; - } - font = dw->dvi.cache.font; - text = &dw->dvi.cache.cache[dw->dvi.cache.index]; - if (text->nchars == 0) { - text->chars = &dw->dvi.cache.char_cache[dw->dvi.cache.char_index]; - text->delta = x - dw->dvi.cache.x; - if (font != dw->dvi.font) { - text->font = font->fid; - dw->dvi.font = font; - } else - text->font = None; - dw->dvi.cache.x += text->delta; - } - if (charExists(font, c)) { - int w; - dw->dvi.cache.char_cache[dw->dvi.cache.char_index++] = (char) c; - ++text->nchars; - w = charWidth(font, c); - dw->dvi.cache.x += w; - if (wid != 0) { - dw->dvi.text_x_width += w; - dw->dvi.text_device_width += wid; - } - } -} - -static -int FindCharWidth (dw, buf, widp) - DviWidget dw; - char *buf; - int *widp; -{ - int maxpos; - int i; - - if (dw->dvi.device_font == 0 - || dw->dvi.state->font_number != dw->dvi.device_font_number) { - dw->dvi.device_font_number = dw->dvi.state->font_number; - dw->dvi.device_font - = QueryDeviceFont (dw, dw->dvi.device_font_number); - } - if (dw->dvi.device_font - && device_char_width (dw->dvi.device_font, - dw->dvi.state->font_size, buf, widp)) - return 1; - - maxpos = MaxFontPosition (dw); - for (i = 1; i <= maxpos; i++) { - DeviceFont *f = QueryDeviceFont (dw, i); - if (f && device_font_special (f) - && device_char_width (f, dw->dvi.state->font_size, - buf, widp)) { - dw->dvi.state->font_number = i; - return 1; - } - } - return 0; -} - -/* Return the width of the character in device units. */ - -int PutCharacter (dw, buf) - DviWidget dw; - char *buf; -{ - int prevFont; - int c = -1; - int wid = 0; - DviCharNameMap *map; - - if (!dw->dvi.display_enable) - return 0; /* The width doesn't matter in this case. */ - prevFont = dw->dvi.state->font_number; - if (!FindCharWidth (dw, buf, &wid)) - return 0; - map = QueryFontMap (dw, dw->dvi.state->font_number); - if (map) - c = DviCharIndex (map, buf); - if (c >= 0) - DoCharacter (dw, c, wid); - else - (void) FakeCharacter (dw, buf, wid); - dw->dvi.state->font_number = prevFont; - return wid; -} - -/* Return 1 if we can fake it; 0 otherwise. */ - -static -int FakeCharacter (dw, buf, wid) - DviWidget dw; - char *buf; - int wid; -{ - int oldx, oldw; - char ch[2]; - char *chars = 0; - - if (buf[0] == '\0' || buf[1] == '\0' || buf[2] != '\0') - return 0; -#define pack2(c1, c2) (((c1) << 8) | (c2)) - - switch (pack2(buf[0], buf[1])) { - case pack2('f', 'i'): - chars = "fi"; - break; - case pack2('f', 'l'): - chars = "fl"; - break; - case pack2('f', 'f'): - chars = "ff"; - break; - case pack2('F', 'i'): - chars = "ffi"; - break; - case pack2('F', 'l'): - chars = "ffl"; - break; - } - if (!chars) - return 0; - oldx = dw->dvi.state->x; - oldw = dw->dvi.text_device_width; - ch[1] = '\0'; - for (; *chars; chars++) { - ch[0] = *chars; - dw->dvi.state->x += PutCharacter (dw, ch); - } - dw->dvi.state->x = oldx; - dw->dvi.text_device_width = oldw + wid; - return 1; -} - -void -PutNumberedCharacter (dw, c) - DviWidget dw; - int c; -{ - char *name; - int wid; - DviCharNameMap *map; - - if (!dw->dvi.display_enable) - return; - - if (dw->dvi.device_font == 0 - || dw->dvi.state->font_number != dw->dvi.device_font_number) { - dw->dvi.device_font_number = dw->dvi.state->font_number; - dw->dvi.device_font - = QueryDeviceFont (dw, dw->dvi.device_font_number); - } - - if (dw->dvi.device_font == 0 - || !device_code_width (dw->dvi.device_font, - dw->dvi.state->font_size, c, &wid)) - return; - if (dw->dvi.native) { - DoCharacter (dw, c, wid); - return; - } - map = QueryFontMap (dw, dw->dvi.state->font_number); - if (!map) - return; - for (name = device_name_for_code (dw->dvi.device_font, c); - name; - name = device_name_for_code ((DeviceFont *)0, c)) { - int code = DviCharIndex (map, name); - if (code >= 0) { - DoCharacter (dw, code, wid); - break; - } - if (FakeCharacter (dw, name, wid)) - break; - } -} - -void -ClearPage (dw) - DviWidget dw; -{ - XClearWindow (XtDisplay (dw), XtWindow (dw)); -} - -static void -setGC (dw) - DviWidget dw; -{ - int desired_line_width; - - if (dw->dvi.line_thickness < 0) - desired_line_width = (int)(((double)dw->dvi.device_resolution - * dw->dvi.state->font_size) - / (10.0*72.0*dw->dvi.sizescale)); - else - desired_line_width = dw->dvi.line_thickness; - - if (desired_line_width != dw->dvi.line_width) { - XGCValues values; - values.line_width = DeviceToX(dw, desired_line_width); - if (values.line_width == 0) - values.line_width = 1; - XChangeGC(XtDisplay (dw), dw->dvi.normal_GC, - GCLineWidth, &values); - dw->dvi.line_width = desired_line_width; - } -} - -static void -setFillGC (dw) - DviWidget dw; -{ - int fill_type; - unsigned long mask = GCFillStyle | GCForeground; - - fill_type = (dw->dvi.fill * 10) / (DVI_FILL_MAX + 1); - if (dw->dvi.fill_type != fill_type) { - XGCValues values; - if (fill_type <= 0) { - values.foreground = dw->dvi.background; - values.fill_style = FillSolid; - } else if (fill_type >= 9) { - values.foreground = dw->dvi.foreground; - values.fill_style = FillSolid; - } else { - values.foreground = dw->dvi.foreground; - values.fill_style = FillOpaqueStippled; - values.stipple = dw->dvi.gray[fill_type - 1]; - mask |= GCStipple; - } - XChangeGC(XtDisplay (dw), dw->dvi.fill_GC, mask, &values); - dw->dvi.fill_type = fill_type; - } -} - -void -DrawLine (dw, x, y) - DviWidget dw; - int x, y; -{ - int xp, yp; - - AdjustCacheDeltas (dw); - setGC (dw); - xp = XPos (dw); - yp = YPos (dw); - XDrawLine (XtDisplay (dw), XtWindow (dw), dw->dvi.normal_GC, - xp, yp, - xp + DeviceToX (dw, x), yp + DeviceToX (dw, y)); -} - -void -DrawCircle (dw, diam) - DviWidget dw; - int diam; -{ - int d; - - AdjustCacheDeltas (dw); - setGC (dw); - d = DeviceToX (dw, diam); - XDrawArc (XtDisplay (dw), XtWindow (dw), dw->dvi.normal_GC, - XPos (dw), YPos (dw) - d/2, - d, d, 0, 64*360); -} - -void -DrawFilledCircle (dw, diam) - DviWidget dw; - int diam; -{ - int d; - - AdjustCacheDeltas (dw); - setFillGC (dw); - d = DeviceToX (dw, diam); - XFillArc (XtDisplay (dw), XtWindow (dw), dw->dvi.fill_GC, - XPos (dw), YPos (dw) - d/2, - d, d, 0, 64*360); - XDrawArc (XtDisplay (dw), XtWindow (dw), dw->dvi.fill_GC, - XPos (dw), YPos (dw) - d/2, - d, d, 0, 64*360); -} - -void -DrawEllipse (dw, a, b) - DviWidget dw; - int a, b; -{ - AdjustCacheDeltas (dw); - setGC (dw); - XDrawArc (XtDisplay (dw), XtWindow (dw), dw->dvi.normal_GC, - XPos (dw), YPos (dw) - DeviceToX (dw, b/2), - DeviceToX (dw, a), DeviceToX (dw, b), 0, 64*360); -} - -void -DrawFilledEllipse (dw, a, b) - DviWidget dw; - int a, b; -{ - AdjustCacheDeltas (dw); - setFillGC (dw); - XFillArc (XtDisplay (dw), XtWindow (dw), dw->dvi.fill_GC, - XPos (dw), YPos (dw) - DeviceToX (dw, b/2), - DeviceToX (dw, a), DeviceToX (dw, b), 0, 64*360); - XDrawArc (XtDisplay (dw), XtWindow (dw), dw->dvi.fill_GC, - XPos (dw), YPos (dw) - DeviceToX (dw, b/2), - DeviceToX (dw, a), DeviceToX (dw, b), 0, 64*360); -} - -void -DrawArc (dw, x0, y0, x1, y1) - DviWidget dw; - int x0, y0, x1, y1; -{ - int angle1, angle2; - int rad = (int)((sqrt ((double)x0*x0 + (double)y0*y0) - + sqrt ((double)x1*x1 + (double)y1*y1) + 1.0)/2.0); - if ((x0 == 0 && y0 == 0) || (x1 == 0 && y1 == 0)) - return; - angle1 = (int)(atan2 ((double)y0, (double)-x0)*180.0*64.0/M_PI); - angle2 = (int)(atan2 ((double)-y1, (double)x1)*180.0*64.0/M_PI); - - angle2 -= angle1; - if (angle2 < 0) - angle2 += 64*360; - - AdjustCacheDeltas (dw); - setGC (dw); - - rad = DeviceToX (dw, rad); - XDrawArc (XtDisplay (dw), XtWindow (dw), dw->dvi.normal_GC, - XPos (dw) + DeviceToX (dw, x0) - rad, - YPos (dw) + DeviceToX (dw, y0) - rad, - rad*2, rad*2, angle1, angle2); -} - -void -DrawPolygon (dw, v, n) - DviWidget dw; - int *v; - int n; -{ - XPoint *p; - int i; - int dx, dy; - - n /= 2; - - AdjustCacheDeltas (dw); - setGC (dw); - p = (XPoint *)XtMalloc((n + 2)*sizeof(XPoint)); - p[0].x = XPos (dw); - p[0].y = YPos (dw); - dx = 0; - dy = 0; - for (i = 0; i < n; i++) { - dx += v[2*i]; - p[i + 1].x = DeviceToX (dw, dx) + p[0].x; - dy += v[2*i + 1]; - p[i + 1].y = DeviceToX (dw, dy) + p[0].y; - } - p[n+1].x = p[0].x; - p[n+1].y = p[0].y; - XDrawLines (XtDisplay (dw), XtWindow (dw), dw->dvi.normal_GC, - p, n + 2, CoordModeOrigin); - XtFree((char *)p); -} - -void -DrawFilledPolygon (dw, v, n) - DviWidget dw; - int *v; - int n; -{ - XPoint *p; - int i; - int dx, dy; - - n /= 2; - if (n < 2) - return; - - AdjustCacheDeltas (dw); - setFillGC (dw); - p = (XPoint *)XtMalloc((n + 2)*sizeof(XPoint)); - p[0].x = p[n+1].x = XPos (dw); - p[0].y = p[n+1].y = YPos (dw); - dx = 0; - dy = 0; - for (i = 0; i < n; i++) { - dx += v[2*i]; - p[i + 1].x = DeviceToX (dw, dx) + p[0].x; - dy += v[2*i + 1]; - p[i + 1].y = DeviceToX (dw, dy) + p[0].y; - } - XFillPolygon (XtDisplay (dw), XtWindow (dw), dw->dvi.fill_GC, - p, n + 1, Complex, CoordModeOrigin); - XDrawLines (XtDisplay (dw), XtWindow (dw), dw->dvi.fill_GC, - p, n + 2, CoordModeOrigin); - XtFree((char *)p); -} - -#define POINTS_MAX 10000 - -static void -appendPoint(points, pointi, x, y) - XPoint *points; - int *pointi; - int x, y; -{ - if (*pointi < POINTS_MAX) { - points[*pointi].x = x; - points[*pointi].y = y; - *pointi += 1; - } -} - -#define FLATNESS 1 - -static void -flattenCurve(points, pointi, x2, y2, x3, y3, x4, y4) - XPoint *points; - int *pointi; - int x2, y2, x3, y3, x4, y4; -{ - int x1, y1, dx, dy, n1, n2, n; - - x1 = points[*pointi - 1].x; - y1 = points[*pointi - 1].y; - - dx = x4 - x1; - dy = y4 - y1; - - n1 = dy*(x2 - x1) - dx*(y2 - y1); - n2 = dy*(x3 - x1) - dx*(y3 - y1); - if (n1 < 0) - n1 = -n1; - if (n2 < 0) - n2 = -n2; - n = n1 > n2 ? n1 : n2; - - if (n*n / (dy*dy + dx*dx) <= FLATNESS*FLATNESS) - appendPoint (points, pointi, x4, y4); - else { - flattenCurve (points, pointi, - (x1 + x2)/2, (y1 + y2)/2, - (x1 + x2*2 + x3)/4, (y1 + y2*2 + y3)/4, - (x1 +3*x2 + 3*x3 + x4)/8, (y1 +3*y2 + 3*y3 + y4)/8); - flattenCurve (points, pointi, - (x2 + x3*2 + x4)/4, (y2 + y3*2 + y4)/4, - (x3 + x4)/2, (y3 + y4)/2, - x4, y4); - } -} - -void -DrawSpline (dw, v, n) - DviWidget dw; - int *v; - int n; -{ - int sx, sy, tx, ty; - int ox, oy, dx, dy; - int i; - int pointi; - XPoint points[POINTS_MAX]; - - if (n == 0 || (n & 1) != 0) - return; - AdjustCacheDeltas (dw); - setGC (dw); - ox = XPos (dw); - oy = YPos (dw); - dx = v[0]; - dy = v[1]; - sx = ox; - sy = oy; - tx = sx + DeviceToX (dw, dx); - ty = sy + DeviceToX (dw, dy); - - pointi = 0; - - appendPoint (points, &pointi, sx, sy); - appendPoint (points, &pointi, (sx + tx)/2, (sy + ty)/2); - - for (i = 2; i < n; i += 2) { - int ux = ox + DeviceToX (dw, dx += v[i]); - int uy = oy + DeviceToX (dw, dy += v[i+1]); - flattenCurve (points, &pointi, - (sx + tx*5)/6, (sy + ty*5)/6, - (tx*5 + ux)/6, (ty*5 + uy)/6, - (tx + ux)/2, (ty + uy)/2); - sx = tx; - sy = ty; - tx = ux; - ty = uy; - } - - appendPoint (points, &pointi, tx, ty); - - XDrawLines (XtDisplay (dw), XtWindow (dw), dw->dvi.normal_GC, - points, pointi, CoordModeOrigin); -} - - -/* -Local Variables: -c-indent-level: 8 -c-continued-statement-offset: 8 -c-brace-offset: -8 -c-argdecl-indent: 8 -c-label-offset: -8 -c-tab-always-indent: nil -End: -*/ diff -ruN groff-1.19.1/src/xditview/Dvi.c groff-1.19.2/src/xditview/Dvi.c --- groff-1.19.1/src/xditview/Dvi.c 2003-07-02 16:44:15.000000000 +0200 +++ groff-1.19.2/src/xditview/Dvi.c 1970-01-01 01:00:00.000000000 +0100 @@ -1,588 +0,0 @@ -#ifndef SABER -#ifndef lint -static char Xrcsid[] = "$XConsortium: Dvi.c,v 1.9 89/12/10 16:12:25 rws Exp $"; -#endif /* lint */ -#endif /* SABER */ - -/* - * Dvi.c - Dvi display widget - * - */ - -#define XtStrlen(s) ((s) ? strlen(s) : 0) - - /* The following are defined for the reader's convenience. Any - Xt..Field macro in this code just refers to some field in - one of the substructures of the WidgetRec. */ - -#include -#include -#include -#include -#include -#include "DviP.h" - -/**************************************************************** - * - * Full class record constant - * - ****************************************************************/ - -/* Private Data */ - -static char default_font_map[] = "\ -TR -adobe-times-medium-r-normal--*-100-*-*-*-*-iso8859-1\n\ -TI -adobe-times-medium-i-normal--*-100-*-*-*-*-iso8859-1\n\ -TB -adobe-times-bold-r-normal--*-100-*-*-*-*-iso8859-1\n\ -TBI -adobe-times-bold-i-normal--*-100-*-*-*-*-iso8859-1\n\ -CR -adobe-courier-medium-r-normal--*-100-*-*-*-*-iso8859-1\n\ -CI -adobe-courier-medium-o-normal--*-100-*-*-*-*-iso8859-1\n\ -CB -adobe-courier-bold-r-normal--*-100-*-*-*-*-iso8859-1\n\ -CBI -adobe-courier-bold-o-normal--*-100-*-*-*-*-iso8859-1\n\ -HR -adobe-helvetica-medium-r-normal--*-100-*-*-*-*-iso8859-1\n\ -HI -adobe-helvetica-medium-o-normal--*-100-*-*-*-*-iso8859-1\n\ -HB -adobe-helvetica-bold-r-normal--*-100-*-*-*-*-iso8859-1\n\ -HBI -adobe-helvetica-bold-o-normal--*-100-*-*-*-*-iso8859-1\n\ -NR -adobe-new century schoolbook-medium-r-normal--*-100-*-*-*-*-iso8859-1\n\ -NI -adobe-new century schoolbook-medium-i-normal--*-100-*-*-*-*-iso8859-1\n\ -NB -adobe-new century schoolbook-bold-r-normal--*-100-*-*-*-*-iso8859-1\n\ -NBI -adobe-new century schoolbook-bold-i-normal--*-100-*-*-*-*-iso8859-1\n\ -S -adobe-symbol-medium-r-normal--*-100-*-*-*-*-adobe-fontspecific\n\ -SS -adobe-symbol-medium-r-normal--*-100-*-*-*-*-adobe-fontspecific\n\ -"; - -#define offset(field) XtOffset(DviWidget, field) - -#define MY_WIDTH(dw) ((int)(dw->dvi.paperwidth * dw->dvi.scale_factor + .5)) -#define MY_HEIGHT(dw) ((int)(dw->dvi.paperlength * dw->dvi.scale_factor + .5)) - -static XtResource resources[] = { - {XtNfontMap, XtCFontMap, XtRString, sizeof (char *), - offset(dvi.font_map_string), XtRString, default_font_map}, - {XtNforeground, XtCForeground, XtRPixel, sizeof (unsigned long), - offset(dvi.foreground), XtRString, "XtDefaultForeground"}, - {XtNbackground, XtCBackground, XtRPixel, sizeof (unsigned long), - offset(dvi.background), XtRString, "XtDefaultBackground"}, - {XtNpageNumber, XtCPageNumber, XtRInt, sizeof (int), - offset(dvi.requested_page), XtRString, "1"}, - {XtNlastPageNumber, XtCLastPageNumber, XtRInt, sizeof (int), - offset (dvi.last_page), XtRString, "0"}, - {XtNfile, XtCFile, XtRFile, sizeof (FILE *), - offset (dvi.file), XtRFile, (char *) 0}, - {XtNseek, XtCSeek, XtRBoolean, sizeof (Boolean), - offset(dvi.seek), XtRString, "false"}, - {XtNfont, XtCFont, XtRFontStruct, sizeof (XFontStruct *), - offset(dvi.default_font), XtRString, "xtdefaultfont"}, - {XtNbackingStore, XtCBackingStore, XtRBackingStore, sizeof (int), - offset(dvi.backing_store), XtRString, "default"}, - {XtNnoPolyText, XtCNoPolyText, XtRBoolean, sizeof (Boolean), - offset(dvi.noPolyText), XtRString, "false"}, - {XtNresolution, XtCResolution, XtRInt, sizeof(int), - offset(dvi.default_resolution), XtRString, "75"}, -}; - -#undef offset - -static void ClassInitialize (); -static void ClassPartInitialize(); -static void Initialize(), Realize (), Destroy (), Redisplay (); -static Boolean SetValues (), SetValuesHook (); -static XtGeometryResult QueryGeometry (); -static void ShowDvi (); -static void CloseFile (), OpenFile (); -static void FindPage (); - -static void SaveToFile (); - -/* font.c */ -extern void ParseFontMap(); -extern void DestroyFontMap(); -extern void ForgetFonts(); - -/* page.c */ -extern void DestroyFileMap(); -extern long SearchPagePosition(); -extern void FileSeek(); -extern void ForgetPagePositions(); - -/* parse.c */ -extern int ParseInput(); - -DviClassRec dviClassRec = { -{ - &widgetClassRec, /* superclass */ - "Dvi", /* class_name */ - sizeof(DviRec), /* size */ - ClassInitialize, /* class_initialize */ - ClassPartInitialize, /* class_part_initialize */ - FALSE, /* class_inited */ - Initialize, /* initialize */ - NULL, /* initialize_hook */ - Realize, /* realize */ - NULL, /* actions */ - 0, /* num_actions */ - resources, /* resources */ - XtNumber(resources), /* resource_count */ - NULLQUARK, /* xrm_class */ - FALSE, /* compress_motion */ - TRUE, /* compress_exposure */ - TRUE, /* compress_enterleave */ - FALSE, /* visible_interest */ - Destroy, /* destroy */ - NULL, /* resize */ - Redisplay, /* expose */ - SetValues, /* set_values */ - SetValuesHook, /* set_values_hook */ - NULL, /* set_values_almost */ - NULL, /* get_values_hook */ - NULL, /* accept_focus */ - XtVersion, /* version */ - NULL, /* callback_private */ - 0, /* tm_table */ - QueryGeometry, /* query_geometry */ - NULL, /* display_accelerator */ - NULL /* extension */ -},{ - SaveToFile, /* save */ -}, -}; - -WidgetClass dviWidgetClass = (WidgetClass) &dviClassRec; - -static void ClassInitialize () -{ - XtAddConverter( XtRString, XtRBackingStore, XmuCvtStringToBackingStore, - NULL, 0 ); -} - -/**************************************************************** - * - * Private Procedures - * - ****************************************************************/ - -/* ARGSUSED */ -static void Initialize(request, new) - Widget request, new; -{ - DviWidget dw = (DviWidget) new; - - dw->dvi.current_page = 0; - dw->dvi.font_map = 0; - dw->dvi.cache.index = 0; - dw->dvi.text_x_width = 0; - dw->dvi.text_device_width = 0; - dw->dvi.word_flag = 0; - dw->dvi.file = 0; - dw->dvi.tmpFile = 0; - dw->dvi.state = 0; - dw->dvi.readingTmp = 0; - dw->dvi.cache.char_index = 0; - dw->dvi.cache.font_size = -1; - dw->dvi.cache.font_number = -1; - dw->dvi.cache.adjustable[0] = 0; - dw->dvi.file_map = 0; - dw->dvi.fonts = 0; - dw->dvi.seek = False; - dw->dvi.device_resolution = dw->dvi.default_resolution; - dw->dvi.display_resolution = dw->dvi.default_resolution; - dw->dvi.paperlength = dw->dvi.default_resolution*11; - dw->dvi.paperwidth = (dw->dvi.default_resolution*8 - + dw->dvi.default_resolution/2); - dw->dvi.scale_factor = 1.0; - dw->dvi.sizescale = 1; - dw->dvi.line_thickness = -1; - dw->dvi.line_width = 1; - dw->dvi.fill = DVI_FILL_MAX; - dw->dvi.device_font = 0; - dw->dvi.device_font_number = -1; - dw->dvi.device = 0; - dw->dvi.native = 0; -} - -#include "gray1.bm" -#include "gray2.bm" -#include "gray3.bm" -#include "gray4.bm" -#include "gray5.bm" -#include "gray6.bm" -#include "gray7.bm" -#include "gray8.bm" - -static void -Realize (w, valueMask, attrs) - Widget w; - XtValueMask *valueMask; - XSetWindowAttributes *attrs; -{ - DviWidget dw = (DviWidget) w; - XGCValues values; - - if (dw->dvi.backing_store != Always + WhenMapped + NotUseful) { - attrs->backing_store = dw->dvi.backing_store; - *valueMask |= CWBackingStore; - } - XtCreateWindow (w, (unsigned)InputOutput, (Visual *) CopyFromParent, - *valueMask, attrs); - values.foreground = dw->dvi.foreground; - values.cap_style = CapRound; - values.join_style = JoinRound; - values.line_width = dw->dvi.line_width; - dw->dvi.normal_GC = XCreateGC (XtDisplay (w), XtWindow (w), - GCForeground|GCCapStyle|GCJoinStyle - |GCLineWidth, - &values); - dw->dvi.gray[0] = XCreateBitmapFromData(XtDisplay (w), XtWindow (w), - gray1_bits, - gray1_width, gray1_height); - dw->dvi.gray[1] = XCreateBitmapFromData(XtDisplay (w), XtWindow (w), - gray2_bits, - gray2_width, gray2_height); - dw->dvi.gray[2] = XCreateBitmapFromData(XtDisplay (w), XtWindow (w), - gray3_bits, - gray3_width, gray3_height); - dw->dvi.gray[3] = XCreateBitmapFromData(XtDisplay (w), XtWindow (w), - gray4_bits, - gray4_width, gray4_height); - dw->dvi.gray[4] = XCreateBitmapFromData(XtDisplay (w), XtWindow (w), - gray5_bits, - gray5_width, gray5_height); - dw->dvi.gray[5] = XCreateBitmapFromData(XtDisplay (w), XtWindow (w), - gray6_bits, - gray6_width, gray6_height); - dw->dvi.gray[6] = XCreateBitmapFromData(XtDisplay (w), XtWindow (w), - gray7_bits, - gray7_width, gray7_height); - dw->dvi.gray[7] = XCreateBitmapFromData(XtDisplay (w), XtWindow (w), - gray8_bits, - gray8_width, gray8_height); - values.background = dw->dvi.background; - values.stipple = dw->dvi.gray[5]; - dw->dvi.fill_GC = XCreateGC (XtDisplay (w), XtWindow (w), - GCForeground|GCBackground|GCStipple, - &values); - - dw->dvi.fill_type = 9; - - if (dw->dvi.file) - OpenFile (dw); - ParseFontMap (dw); -} - -static void -Destroy(w) - Widget w; -{ - DviWidget dw = (DviWidget) w; - - XFreeGC (XtDisplay (w), dw->dvi.normal_GC); - XFreeGC (XtDisplay (w), dw->dvi.fill_GC); - XFreePixmap (XtDisplay (w), dw->dvi.gray[0]); - XFreePixmap (XtDisplay (w), dw->dvi.gray[1]); - XFreePixmap (XtDisplay (w), dw->dvi.gray[2]); - XFreePixmap (XtDisplay (w), dw->dvi.gray[3]); - XFreePixmap (XtDisplay (w), dw->dvi.gray[4]); - XFreePixmap (XtDisplay (w), dw->dvi.gray[5]); - XFreePixmap (XtDisplay (w), dw->dvi.gray[6]); - XFreePixmap (XtDisplay (w), dw->dvi.gray[7]); - DestroyFontMap (dw->dvi.font_map); - DestroyFileMap (dw->dvi.file_map); - device_destroy (dw->dvi.device); -} - -/* - * Repaint the widget window - */ - -/* ARGSUSED */ -static void -Redisplay(w, event, region) - Widget w; - XEvent *event; - Region region; -{ - DviWidget dw = (DviWidget) w; - XRectangle extents; - - XClipBox (region, &extents); - dw->dvi.extents.x1 = extents.x; - dw->dvi.extents.y1 = extents.y; - dw->dvi.extents.x2 = extents.x + extents.width; - dw->dvi.extents.y2 = extents.y + extents.height; - ShowDvi (dw); -} - -/* - * Set specified arguments into widget - */ -/* ARGSUSED */ -static Boolean -SetValues (current, request, new) - DviWidget current, request, new; -{ - Boolean redisplay = FALSE; - char *new_map; - int cur, req; - - if (current->dvi.font_map_string != request->dvi.font_map_string) { - new_map = XtMalloc (strlen (request->dvi.font_map_string) + 1); - if (new_map) { - redisplay = TRUE; - strcpy (new_map, request->dvi.font_map_string); - new->dvi.font_map_string = new_map; - if (current->dvi.font_map_string) - XtFree (current->dvi.font_map_string); - current->dvi.font_map_string = 0; - ParseFontMap (new); - } - } - - req = request->dvi.requested_page; - cur = current->dvi.requested_page; - if (cur != req) { - if (!request->dvi.file) - req = 0; - else { - if (req < 1) - req = 1; - if (current->dvi.last_page != 0 && - req > current->dvi.last_page) - req = current->dvi.last_page; - } - if (cur != req) - redisplay = TRUE; - new->dvi.requested_page = req; - if (current->dvi.last_page == 0 && req > cur) - FindPage (new); - } - - return redisplay; -} - -/* - * use the set_values_hook entry to check when - * the file is set - */ - -static Boolean -SetValuesHook (dw, args, num_argsp) - DviWidget dw; - ArgList args; - Cardinal *num_argsp; -{ - Cardinal i; - - for (i = 0; i < *num_argsp; i++) { - if (!strcmp (args[i].name, XtNfile)) { - CloseFile (dw); - OpenFile (dw); - return TRUE; - } - } - return FALSE; -} - -static void CloseFile (dw) - DviWidget dw; -{ - if (dw->dvi.tmpFile) - fclose (dw->dvi.tmpFile); - ForgetPagePositions (dw); -} - -static void OpenFile (dw) - DviWidget dw; -{ - dw->dvi.tmpFile = 0; - if (!dw->dvi.seek) - dw->dvi.tmpFile = tmpfile(); - dw->dvi.requested_page = 1; - dw->dvi.last_page = 0; -} - -static XtGeometryResult -QueryGeometry (w, request, geometry_return) - Widget w; - XtWidgetGeometry *request, *geometry_return; -{ - XtGeometryResult ret; - DviWidget dw = (DviWidget) w; - - ret = XtGeometryYes; - if (((request->request_mode & CWWidth) - && request->width < MY_WIDTH(dw)) - || ((request->request_mode & CWHeight) - && request->height < MY_HEIGHT(dw))) - ret = XtGeometryAlmost; - geometry_return->width = MY_WIDTH(dw); - geometry_return->height = MY_HEIGHT(dw); - geometry_return->request_mode = CWWidth|CWHeight; - return ret; -} - -void -SetDevice (dw, name) - DviWidget dw; - char *name; -{ - XtWidgetGeometry request, reply; - XtGeometryResult ret; - - ForgetFonts (dw); - dw->dvi.device = device_load (name); - if (!dw->dvi.device) - return; - dw->dvi.sizescale = dw->dvi.device->sizescale; - dw->dvi.device_resolution = dw->dvi.device->res; - dw->dvi.native = dw->dvi.device->X11; - dw->dvi.paperlength = dw->dvi.device->paperlength; - dw->dvi.paperwidth = dw->dvi.device->paperwidth; - if (dw->dvi.native) { - dw->dvi.display_resolution = dw->dvi.device_resolution; - dw->dvi.scale_factor = 1.0; - } - else { - dw->dvi.display_resolution = dw->dvi.default_resolution; - dw->dvi.scale_factor = ((double)dw->dvi.display_resolution - / dw->dvi.device_resolution); - } - request.request_mode = CWWidth|CWHeight; - request.width = MY_WIDTH(dw); - request.height = MY_HEIGHT(dw); - ret = XtMakeGeometryRequest ((Widget)dw, &request, &reply); - if (ret == XtGeometryAlmost - && reply.height >= request.height - && reply.width >= request.width) { - request.width = reply.width; - request.height = reply.height; - XtMakeGeometryRequest ((Widget)dw, &request, &reply); - } -} - -static void -ShowDvi (dw) - DviWidget dw; -{ - if (!dw->dvi.file) { - static char Error[] = "No file selected"; - - XSetFont (XtDisplay(dw), dw->dvi.normal_GC, - dw->dvi.default_font->fid); - XDrawString (XtDisplay (dw), XtWindow (dw), dw->dvi.normal_GC, - 20, 20, Error, strlen (Error)); - return; - } - - FindPage (dw); - - dw->dvi.display_enable = 1; - ParseInput (dw); - if (dw->dvi.last_page && dw->dvi.requested_page > dw->dvi.last_page) - dw->dvi.requested_page = dw->dvi.last_page; -} - -static void -FindPage (dw) - DviWidget dw; -{ - int i; - long file_position; - - if (dw->dvi.requested_page < 1) - dw->dvi.requested_page = 1; - - if (dw->dvi.last_page != 0 && dw->dvi.requested_page > dw->dvi.last_page) - dw->dvi.requested_page = dw->dvi.last_page; - - file_position = SearchPagePosition (dw, dw->dvi.requested_page); - if (file_position != -1) { - FileSeek(dw, file_position); - dw->dvi.current_page = dw->dvi.requested_page; - } else { - for (i=dw->dvi.requested_page; i > 0; i--) { - file_position = SearchPagePosition (dw, i); - if (file_position != -1) - break; - } - if (file_position == -1) - file_position = 0; - FileSeek (dw, file_position); - - dw->dvi.current_page = i; - - dw->dvi.display_enable = 0; - while (dw->dvi.current_page != dw->dvi.requested_page) { - dw->dvi.current_page = ParseInput (dw); - /* - * at EOF, seek back to the beginning of this page. - */ - if (!dw->dvi.readingTmp && feof (dw->dvi.file)) { - file_position = SearchPagePosition (dw, - dw->dvi.current_page); - if (file_position != -1) - FileSeek (dw, file_position); - dw->dvi.requested_page = dw->dvi.current_page; - break; - } - } - } -} - -void DviSaveToFile(w, fp) - Widget w; - FILE *fp; -{ - XtCheckSubclass(w, dviWidgetClass, NULL); - (*((DviWidgetClass) XtClass(w))->command_class.save)(w, fp); -} - -static -void SaveToFile(w, fp) - Widget w; - FILE *fp; -{ - DviWidget dw = (DviWidget)w; - long pos; - int c; - - if (dw->dvi.tmpFile) { - pos = ftell(dw->dvi.tmpFile); - if (dw->dvi.ungot) { - pos--; - dw->dvi.ungot = 0; - /* The ungot character is in the tmpFile, so we don't - want to read it from file. */ - (void)getc(dw->dvi.file); - } - } - else - pos = ftell(dw->dvi.file); - FileSeek(dw, 0L); - while (DviGetC(dw, &c) != EOF) - if (putc(c, fp) == EOF) { - /* XXX print error message */ - break; - } - FileSeek(dw, pos); -} - -static -void ClassPartInitialize(widget_class) - WidgetClass widget_class; -{ - DviWidgetClass wc = (DviWidgetClass)widget_class; - DviWidgetClass super = (DviWidgetClass) wc->core_class.superclass; - if (wc->command_class.save == InheritSaveToFile) - wc->command_class.save = super->command_class.save; -} - -/* -Local Variables: -c-indent-level: 8 -c-continued-statement-offset: 8 -c-brace-offset: -8 -c-argdecl-indent: 8 -c-label-offset: -8 -c-tab-always-indent: nil -End: -*/ diff -ruN groff-1.19.1/src/xditview/DviChar.c groff-1.19.2/src/xditview/DviChar.c --- groff-1.19.1/src/xditview/DviChar.c 2003-07-02 16:44:15.000000000 +0200 +++ groff-1.19.2/src/xditview/DviChar.c 1970-01-01 01:00:00.000000000 +0100 @@ -1,664 +0,0 @@ -/* - * DviChar.c - * - * Map DVI (ditroff output) character names to - * font indexes and back - */ - -#include -#include -#include "DviChar.h" - -extern char *xmalloc(); - -#define allocHash() ((DviCharNameHash *) xmalloc (sizeof (DviCharNameHash))) - -struct map_list { - struct map_list *next; - DviCharNameMap *map; -}; - -static struct map_list *world; - -static int standard_maps_loaded = 0; -static void load_standard_maps (); -static int hash_name (); -static void dispose_hash(), compute_hash(); - -DviCharNameMap * -DviFindMap (encoding) - char *encoding; -{ - struct map_list *m; - - if (!standard_maps_loaded) - load_standard_maps (); - for (m = world; m; m=m->next) - if (!strcmp (m->map->encoding, encoding)) - return m->map; - return 0; -} - -void -DviRegisterMap (map) - DviCharNameMap *map; -{ - struct map_list *m; - - if (!standard_maps_loaded) - load_standard_maps (); - for (m = world; m; m = m->next) - if (!strcmp (m->map->encoding, map->encoding)) - break; - if (!m) { - m = (struct map_list *) xmalloc (sizeof *m); - m->next = world; - world = m; - } - dispose_hash (map); - m->map = map; - compute_hash (map); -} - -static void -dispose_hash (map) - DviCharNameMap *map; -{ - DviCharNameHash **buckets; - DviCharNameHash *h, *next; - int i; - - buckets = map->buckets; - for (i = 0; i < DVI_HASH_SIZE; i++) { - for (h = buckets[i]; h; h=next) { - next = h->next; - free (h); - } - } -} - -static int -hash_name (name) - char *name; -{ - int i = 0; - - while (*name) - i = (i << 1) ^ *name++; - if (i < 0) - i = -i; - return i; -} - -static void -compute_hash (map) - DviCharNameMap *map; -{ - DviCharNameHash **buckets; - int c, s, i; - DviCharNameHash *h; - - buckets = map->buckets; - for (i = 0; i < DVI_HASH_SIZE; i++) - buckets[i] = 0; - for (c = 0; c < DVI_MAP_SIZE; c++) - for (s = 0; s < DVI_MAX_SYNONYMS; s++) { - if (!map->dvi_names[c][s]) - break; - i = hash_name (map->dvi_names[c][s]) % DVI_HASH_SIZE; - h = allocHash (); - h->next = buckets[i]; - buckets[i] = h; - h->name = map->dvi_names[c][s]; - h->position = c; - } - -} - -int -DviCharIndex (map, name) - DviCharNameMap *map; - char *name; -{ - int i; - DviCharNameHash *h; - - i = hash_name (name) % DVI_HASH_SIZE; - for (h = map->buckets[i]; h; h=h->next) - if (!strcmp (h->name, name)) - return h->position; - return -1; -} - -static DviCharNameMap ISO8859_1_map = { - "iso8859-1", - 0, -{ -{ 0, /* 0 */}, -{ 0, /* 1 */}, -{ 0, /* 2 */}, -{ 0, /* 3 */}, -{ 0, /* 4 */}, -{ 0, /* 5 */}, -{ 0, /* 6 */}, -{ 0, /* 7 */}, -{ 0, /* 8 */}, -{ 0, /* 9 */}, -{ 0, /* 10 */}, -{ 0, /* 11 */}, -{ 0, /* 12 */}, -{ 0, /* 13 */}, -{ 0, /* 14 */}, -{ 0, /* 15 */}, -{ 0, /* 16 */}, -{ 0, /* 17 */}, -{ 0, /* 18 */}, -{ 0, /* 19 */}, -{ 0, /* 20 */}, -{ 0, /* 21 */}, -{ 0, /* 22 */}, -{ 0, /* 23 */}, -{ 0, /* 24 */}, -{ 0, /* 25 */}, -{ 0, /* 26 */}, -{ 0, /* 27 */}, -{ 0, /* 28 */}, -{ 0, /* 29 */}, -{ 0, /* 30 */}, -{ 0, /* 31 */}, -{ 0, /* 32 */}, -{ "!", /* 33 */}, -{ "\"", "dq", /* 34 */}, -{ "#", "sh", /* 35 */}, -{ "$", "Do", /* 36 */}, -{ "%", /* 37 */}, -{ "&", /* 38 */}, -{ "'", "cq", /* 39 */}, -{ "(", /* 40 */}, -{ ")", /* 41 */}, -{ "*", /* 42 */}, -{ "+", /* 43 */}, -{ ",", /* 44 */}, -{ "\\-", /* 45 */}, -{ ".", /* 46 */}, -{ "/", "sl", /* 47 */}, -{ "0", /* 48 */}, -{ "1", /* 49 */}, -{ "2", /* 50 */}, -{ "3", /* 51 */}, -{ "4", /* 52 */}, -{ "5", /* 53 */}, -{ "6", /* 54 */}, -{ "7", /* 55 */}, -{ "8", /* 56 */}, -{ "9", /* 57 */}, -{ ":", /* 58 */}, -{ ";", /* 59 */}, -{ "<", /* 60 */}, -{ "=", /* 61 */}, -{ ">", /* 62 */}, -{ "?", /* 63 */}, -{ "@", "at", /* 64 */}, -{ "A", /* 65 */}, -{ "B", /* 66 */}, -{ "C", /* 67 */}, -{ "D", /* 68 */}, -{ "E", /* 69 */}, -{ "F", /* 70 */}, -{ "G", /* 71 */}, -{ "H", /* 72 */}, -{ "I", /* 73 */}, -{ "J", /* 74 */}, -{ "K", /* 75 */}, -{ "L", /* 76 */}, -{ "M", /* 77 */}, -{ "N", /* 78 */}, -{ "O", /* 79 */}, -{ "P", /* 80 */}, -{ "Q", /* 81 */}, -{ "R", /* 82 */}, -{ "S", /* 83 */}, -{ "T", /* 84 */}, -{ "U", /* 85 */}, -{ "V", /* 86 */}, -{ "W", /* 87 */}, -{ "X", /* 88 */}, -{ "Y", /* 89 */}, -{ "Z", /* 90 */}, -{ "[", "lB", /* 91 */}, -{ "\\", "rs", /* 92 */}, -{ "]", "rB", /* 93 */}, -{ "^", "a^", "ha", /* 94 */}, -{ "_", /* 95 */}, -{ "`", "oq", /* 96 */}, -{ "a", /* 97 */}, -{ "b", /* 98 */}, -{ "c", /* 99 */}, -{ "d", /* 100 */}, -{ "e", /* 101 */}, -{ "f", /* 102 */}, -{ "g", /* 103 */}, -{ "h", /* 104 */}, -{ "i", /* 105 */}, -{ "j", /* 106 */}, -{ "k", /* 107 */}, -{ "l", /* 108 */}, -{ "m", /* 109 */}, -{ "n", /* 110 */}, -{ "o", /* 111 */}, -{ "p", /* 112 */}, -{ "q", /* 113 */}, -{ "r", /* 114 */}, -{ "s", /* 115 */}, -{ "t", /* 116 */}, -{ "u", /* 117 */}, -{ "v", /* 118 */}, -{ "w", /* 119 */}, -{ "x", /* 120 */}, -{ "y", /* 121 */}, -{ "z", /* 122 */}, -{ "{", "lC", /* 123 */}, -{ "|", "ba", /* 124 */}, -{ "}", "rC", /* 125 */}, -{ "~", "a~", "ti", /* 126 */}, -{ 0, /* 127 */}, -{ 0, /* 128 */}, -{ 0, /* 129 */}, -{ 0, /* 130 */}, -{ 0, /* 131 */}, -{ 0, /* 132 */}, -{ 0, /* 133 */}, -{ 0, /* 134 */}, -{ 0, /* 135 */}, -{ 0, /* 136 */}, -{ 0, /* 137 */}, -{ 0, /* 138 */}, -{ 0, /* 139 */}, -{ 0, /* 140 */}, -{ 0, /* 141 */}, -{ 0, /* 142 */}, -{ 0, /* 143 */}, -{ 0, /* 144 */}, -{ 0, /* 145 */}, -{ 0, /* 146 */}, -{ 0, /* 147 */}, -{ 0, /* 148 */}, -{ 0, /* 149 */}, -{ 0, /* 150 */}, -{ 0, /* 151 */}, -{ 0, /* 152 */}, -{ 0, /* 153 */}, -{ 0, /* 154 */}, -{ 0, /* 155 */}, -{ 0, /* 156 */}, -{ 0, /* 157 */}, -{ 0, /* 158 */}, -{ 0, /* 159 */}, -{ 0, /* 160 */}, -{ "r!", /* 161 */}, -{ "ct", /* 162 */}, -{ "Po", /* 163 */}, -{ "Cs", /* 164 */}, -{ "Ye", /* 165 */}, -{ "bb", /* 166 */}, -{ "sc", /* 167 */}, -{ "ad", /* 168 */}, -{ "co", /* 169 */}, -{ "Of", /* 170 */}, -{ "Fo", /* 171 */}, -{ "tno", /* 172 */}, -{ "-", "hy", /* 173 */}, -{ "rg", /* 174 */}, -{ "a-", /* 175 */}, -{ "de", /* 176 */}, -{ "t+-", /* 177 */}, -{ "S2", /* 178 */}, -{ "S3", /* 179 */}, -{ "aa", /* 180 */}, -{ "mc", /* 181 */}, -{ "ps", /* 182 */}, -{ "pc", /* 183 */}, -{ "ac", /* 184 */}, -{ "S1", /* 185 */}, -{ "Om", /* 186 */}, -{ "Fc", /* 187 */}, -{ "14", /* 188 */}, -{ "12", /* 189 */}, -{ "34", /* 190 */}, -{ "r?", /* 191 */}, -{ "`A", /* 192 */}, -{ "'A", /* 193 */}, -{ "^A", /* 194 */}, -{ "~A", /* 195 */}, -{ ":A", /* 196 */}, -{ "oA", /* 197 */}, -{ "AE", /* 198 */}, -{ ",C", /* 199 */}, -{ "`E", /* 200 */}, -{ "'E", /* 201 */}, -{ "^E", /* 202 */}, -{ ":E", /* 203 */}, -{ "`I", /* 204 */}, -{ "'I", /* 205 */}, -{ "^I", /* 206 */}, -{ ":I", /* 207 */}, -{ "-D", /* 208 */}, -{ "~N", /* 209 */}, -{ "`O", /* 210 */}, -{ "'O", /* 211 */}, -{ "^O", /* 212 */}, -{ "~O", /* 213 */}, -{ ":O", /* 214 */}, -{ "tmu", /* 215 */}, -{ "/O", /* 216 */}, -{ "`U", /* 217 */}, -{ "'U", /* 218 */}, -{ "^U", /* 219 */}, -{ ":U", /* 220 */}, -{ "'Y", /* 221 */}, -{ "TP", /* 222 */}, -{ "ss", /* 223 */}, -{ "`a", /* 224 */}, -{ "'a", /* 225 */}, -{ "^a", /* 226 */}, -{ "~a", /* 227 */}, -{ ":a", /* 228 */}, -{ "oa", /* 229 */}, -{ "ae", /* 230 */}, -{ ",c", /* 231 */}, -{ "`e", /* 232 */}, -{ "'e", /* 233 */}, -{ "^e", /* 234 */}, -{ ":e", /* 235 */}, -{ "`i", /* 236 */}, -{ "'i", /* 237 */}, -{ "^i", /* 238 */}, -{ ":i", /* 239 */}, -{ "Sd", /* 240 */}, -{ "~n", /* 241 */}, -{ "`o", /* 242 */}, -{ "'o", /* 243 */}, -{ "^o", /* 244 */}, -{ "~o", /* 245 */}, -{ ":o", /* 246 */}, -{ "tdi", /* 247 */}, -{ "/o", /* 248 */}, -{ "`u", /* 249 */}, -{ "'u", /* 250 */}, -{ "^u", /* 251 */}, -{ ":u", /* 252 */}, -{ "'y", /* 253 */}, -{ "Tp", /* 254 */}, -{ ":y", /* 255 */}, -}}; - -static DviCharNameMap Adobe_Symbol_map = { - "adobe-fontspecific", - 1, -{ -{ 0, /* 0 */}, -{ 0, /* 1 */}, -{ 0, /* 2 */}, -{ 0, /* 3 */}, -{ 0, /* 4 */}, -{ 0, /* 5 */}, -{ 0, /* 6 */}, -{ 0, /* 7 */}, -{ 0, /* 8 */}, -{ 0, /* 9 */}, -{ 0, /* 10 */}, -{ 0, /* 11 */}, -{ 0, /* 12 */}, -{ 0, /* 13 */}, -{ 0, /* 14 */}, -{ 0, /* 15 */}, -{ 0, /* 16 */}, -{ 0, /* 17 */}, -{ 0, /* 18 */}, -{ 0, /* 19 */}, -{ 0, /* 20 */}, -{ 0, /* 21 */}, -{ 0, /* 22 */}, -{ 0, /* 23 */}, -{ 0, /* 24 */}, -{ 0, /* 25 */}, -{ 0, /* 26 */}, -{ 0, /* 27 */}, -{ 0, /* 28 */}, -{ 0, /* 29 */}, -{ 0, /* 30 */}, -{ 0, /* 31 */}, -{ 0, /* 32 */}, -{ "!", /* 33 */}, -{ "fa", /* 34 */}, -{ "#", "sh", /* 35 */}, -{ "te", /* 36 */}, -{ "%", /* 37 */}, -{ "&", /* 38 */}, -{ "st", /* 39 */}, -{ "(", /* 40 */}, -{ ")", /* 41 */}, -{ "**", /* 42 */}, -{ "+", "pl", /* 43 */}, -{ ",", /* 44 */}, -{ "\\-", "mi", /* 45 */}, -{ ".", /* 46 */}, -{ "/", "sl", /* 47 */}, -{ "0", /* 48 */}, -{ "1", /* 49 */}, -{ "2", /* 50 */}, -{ "3", /* 51 */}, -{ "4", /* 52 */}, -{ "5", /* 53 */}, -{ "6", /* 54 */}, -{ "7", /* 55 */}, -{ "8", /* 56 */}, -{ "9", /* 57 */}, -{ ":", /* 58 */}, -{ ";", /* 59 */}, -{ "<", /* 60 */}, -{ "=", "eq", /* 61 */}, -{ ">", /* 62 */}, -{ "?", /* 63 */}, -{ "=~", /* 64 */}, -{ "*A", /* 65 */}, -{ "*B", /* 66 */}, -{ "*X", /* 67 */}, -{ "*D", /* 68 */}, -{ "*E", /* 69 */}, -{ "*F", /* 70 */}, -{ "*G", /* 71 */}, -{ "*Y", /* 72 */}, -{ "*I", /* 73 */}, -{ "+h", /* 74 */}, -{ "*K", /* 75 */}, -{ "*L", /* 76 */}, -{ "*M", /* 77 */}, -{ "*N", /* 78 */}, -{ "*O", /* 79 */}, -{ "*P", /* 80 */}, -{ "*H", /* 81 */}, -{ "*R", /* 82 */}, -{ "*S", /* 83 */}, -{ "*T", /* 84 */}, -{ 0, /* 85 */}, -{ "ts", /* 86 */}, -{ "*W", /* 87 */}, -{ "*C", /* 88 */}, -{ "*Q", /* 89 */}, -{ "*Z", /* 90 */}, -{ "[", "lB", /* 91 */}, -{ "tf", "3d", /* 92 */}, -{ "]", "rB", /* 93 */}, -{ "pp", /* 94 */}, -{ "_", /* 95 */}, -{ "radicalex", /* 96 */}, -{ "*a", /* 97 */}, -{ "*b", /* 98 */}, -{ "*x", /* 99 */}, -{ "*d", /* 100 */}, -{ "*e", /* 101 */}, -{ "*f", /* 102 */}, -{ "*g", /* 103 */}, -{ "*y", /* 104 */}, -{ "*i", /* 105 */}, -{ "+f", /* 106 */}, -{ "*k", /* 107 */}, -{ "*l", /* 108 */}, -{ "*m", /* 109 */}, -{ "*n", /* 110 */}, -{ "*o", /* 111 */}, -{ "*p", /* 112 */}, -{ "*h", /* 113 */}, -{ "*r", /* 114 */}, -{ "*s", /* 115 */}, -{ "*t", /* 116 */}, -{ "*u", /* 117 */}, -{ "+p", /* 118 */}, -{ "*w", /* 119 */}, -{ "*c", /* 120 */}, -{ "*q", /* 121 */}, -{ "*z", /* 122 */}, -{ "lC", "{", /* 123 */}, -{ "ba", "|", /* 124 */}, -{ "rC", "}", /* 125 */}, -{ "ap", /* 126 */}, -{ 0, /* 127 */}, -{ 0, /* 128 */}, -{ 0, /* 129 */}, -{ 0, /* 130 */}, -{ 0, /* 131 */}, -{ 0, /* 132 */}, -{ 0, /* 133 */}, -{ 0, /* 134 */}, -{ 0, /* 135 */}, -{ 0, /* 136 */}, -{ 0, /* 137 */}, -{ 0, /* 138 */}, -{ 0, /* 139 */}, -{ 0, /* 140 */}, -{ 0, /* 141 */}, -{ 0, /* 142 */}, -{ 0, /* 143 */}, -{ 0, /* 144 */}, -{ 0, /* 145 */}, -{ 0, /* 146 */}, -{ 0, /* 147 */}, -{ 0, /* 148 */}, -{ 0, /* 149 */}, -{ 0, /* 150 */}, -{ 0, /* 151 */}, -{ 0, /* 152 */}, -{ 0, /* 153 */}, -{ 0, /* 154 */}, -{ 0, /* 155 */}, -{ 0, /* 156 */}, -{ 0, /* 157 */}, -{ 0, /* 158 */}, -{ 0, /* 159 */}, -{ 0, /* 160 */}, -{ "*U", /* 161 */}, -{ "fm", /* 162 */}, -{ "<=", /* 163 */}, -{ "f/", /* 164 */}, -{ "if", /* 165 */}, -{ "Fn", /* 166 */}, -{ "CL", /* 167 */}, -{ "DI", /* 168 */}, -{ "HE", /* 169 */}, -{ "SP", /* 170 */}, -{ "<>", /* 171 */}, -{ "<-", /* 172 */}, -{ "ua", "arrowverttp", /* 173 */}, -{ "->", /* 174 */}, -{ "da", "arrowvertbt", /* 175 */}, -{ "de", /* 176 */}, -{ "+-", /* 177 */}, -{ "sd", /* 178 */}, -{ ">=", /* 179 */}, -{ "mu", /* 180 */}, -{ "pt", /* 181 */}, -{ "pd", /* 182 */}, -{ "bu", /* 183 */}, -{ "di", /* 184 */}, -{ "!=", /* 185 */}, -{ "==", /* 186 */}, -{ "~=", "~~", /* 187 */}, -{ 0, /* 188 */}, -{ "arrowvertex", /* 189 */}, -{ "an", /* 190 */}, -{ "CR", /* 191 */}, -{ "Ah", /* 192 */}, -{ "Im", /* 193 */}, -{ "Re", /* 194 */}, -{ "wp", /* 195 */}, -{ "c*", /* 196 */}, -{ "c+", /* 197 */}, -{ "es", /* 198 */}, -{ "ca", /* 199 */}, -{ "cu", /* 200 */}, -{ "sp", /* 201 */}, -{ "ip", /* 202 */}, -{ "nb", /* 203 */}, -{ "sb", /* 204 */}, -{ "ib", /* 205 */}, -{ "mo", /* 206 */}, -{ "nm", /* 207 */}, -{ "/_", /* 208 */}, -{ "gr", /* 209 */}, -{ "rg", /* 210 */}, -{ "co", /* 211 */}, -{ "tm", /* 212 */}, -{ 0, /* 213 */}, -{ "sr", "sqrt", /* 214 */}, -{ "md", /* 215 */}, -{ "no", /* 216 */}, -{ "AN", /* 217 */}, -{ "OR", /* 218 */}, -{ "hA", /* 219 */}, -{ "lA", /* 220 */}, -{ "uA", /* 221 */}, -{ "rA", /* 222 */}, -{ "dA", /* 223 */}, -{ "lz", /* 224 */}, -{ "la", /* 225 */}, -{ 0, /* 226 */}, -{ 0, /* 227 */}, -{ 0, /* 228 */}, -{ 0, /* 229 */}, -{ "parenlefttp", /* 230 */}, -{ "parenleftex", /* 231 */}, -{ "parenleftbt", /* 232 */}, -{ "bracketlefttp", "lc", /* 233 */}, -{ "bracketleftex", /* 234 */}, -{ "bracketleftbt", "lf", /* 235 */}, -{ "bracelefttp", "lt", /* 236 */}, -{ "braceleftmid", "lk", /* 237 */}, -{ "braceleftbt", "lb", /* 238 */}, -{ "bracerightex", "braceleftex", "braceex", "bv", /* 239 */}, -{ 0, /* 240 */}, -{ "ra", /* 241 */}, -{ "is", "integral", /* 242 */}, -{ 0, /* 243 */}, -{ 0, /* 244 */}, -{ 0, /* 245 */}, -{ "parenrighttp", /* 246 */}, -{ "parenrightex", /* 247 */}, -{ "parenrightbt", /* 248 */}, -{ "bracketrighttp", "rc", /* 249 */}, -{ "bracketrightex", /* 250 */}, -{ "bracketrightbt", "rf", /* 251 */}, -{ "bracerighttp", "rt", /* 252 */}, -{ "bracerightmid", "rk", /* 253 */}, -{ "bracerightbt", "rb", /* 254 */}, -{ 0, /* 255 */}, -}}; - - -static void -load_standard_maps () -{ - standard_maps_loaded = 1; - DviRegisterMap (&ISO8859_1_map); - DviRegisterMap (&Adobe_Symbol_map); -} diff -ruN groff-1.19.1/src/xditview/DviChar.h groff-1.19.2/src/xditview/DviChar.h --- groff-1.19.1/src/xditview/DviChar.h 2000-02-06 10:38:57.000000000 +0100 +++ groff-1.19.2/src/xditview/DviChar.h 1970-01-01 01:00:00.000000000 +0100 @@ -1,37 +0,0 @@ -/* - * DviChar.h - * - * descriptions for mapping dvi names to - * font indexes and back. Dvi fonts are all - * 256 elements (actually only 256-32 are usable). - * - * The encoding names are taken from X - - * case insensitive, a dash separating the - * CharSetRegistry from the CharSetEncoding - */ - -# define DVI_MAX_SYNONYMS 10 -# define DVI_MAP_SIZE 256 -# define DVI_HASH_SIZE 256 - -typedef struct _dviCharNameHash { - struct _dviCharNameHash *next; - char *name; - int position; -} DviCharNameHash; - -typedef struct _dviCharNameMap { - char *encoding; - int special; - char *dvi_names[DVI_MAP_SIZE][DVI_MAX_SYNONYMS]; - DviCharNameHash *buckets[DVI_HASH_SIZE]; -} DviCharNameMap; - -extern DviCharNameMap *DviFindMap ( /* char *encoding */ ); -extern void DviRegisterMap ( /* DviCharNameMap *map */ ); -#ifdef NOTDEF -extern char *DviCharName ( /* DviCharNameMap *map, int index, int synonym */ ); -#else -#define DviCharName(map,index,synonym) ((map)->dvi_names[index][synonym]) -#endif -extern int DviCharIndex ( /* DviCharNameMap *map, char *name */ ); diff -ruN groff-1.19.1/src/xditview/Dvi.h groff-1.19.2/src/xditview/Dvi.h --- groff-1.19.1/src/xditview/Dvi.h 2000-02-06 10:38:57.000000000 +0100 +++ groff-1.19.2/src/xditview/Dvi.h 1970-01-01 01:00:00.000000000 +0100 @@ -1,46 +0,0 @@ -/* -* $XConsortium: Dvi.h,v 1.4 89/07/21 14:22:06 jim Exp $ -*/ - -#ifndef _XtDvi_h -#define _XtDvi_h - -/*********************************************************************** - * - * Dvi Widget - * - ***********************************************************************/ - -/* Parameters: - - Name Class RepType Default Value - ---- ----- ------- ------------- - background Background pixel White - foreground Foreground Pixel Black - fontMap FontMap char * ... - pageNumber PageNumber int 1 -*/ - -#define XtNfontMap "fontMap" -#define XtNpageNumber "pageNumber" -#define XtNlastPageNumber "lastPageNumber" -#define XtNnoPolyText "noPolyText" -#define XtNseek "seek" -#define XtNresolution "resolution" - -#define XtCFontMap "FontMap" -#define XtCPageNumber "PageNumber" -#define XtCLastPageNumber "LastPageNumber" -#define XtCNoPolyText "NoPolyText" -#define XtCSeek "Seek" -#define XtCResolution "Resolution" - -typedef struct _DviRec *DviWidget; /* completely defined in DviPrivate.h */ -typedef struct _DviClassRec *DviWidgetClass; /* completely defined in DviPrivate.h */ - -extern WidgetClass dviWidgetClass; - -extern void DviSaveToFile(); - -#endif /* _XtDvi_h */ -/* DON'T ADD STUFF AFTER THIS #endif */ diff -ruN groff-1.19.1/src/xditview/DviP.h groff-1.19.2/src/xditview/DviP.h --- groff-1.19.1/src/xditview/DviP.h 2003-07-02 16:44:15.000000000 +0200 +++ groff-1.19.2/src/xditview/DviP.h 1970-01-01 01:00:00.000000000 +0100 @@ -1,234 +0,0 @@ -/* - * $XConsortium: DviP.h,v 1.5 89/07/22 19:44:08 keith Exp $ - */ - -/* - * DviP.h - Private definitions for Dvi widget - */ - -#ifndef _XtDviP_h -#define _XtDviP_h - -#include "Dvi.h" -#include "DviChar.h" -#include "device.h" - -/*********************************************************************** - * - * Dvi Widget Private Data - * - ***********************************************************************/ - -/************************************ - * - * Class structure - * - ***********************************/ - -/* Type for save method. */ - -typedef void (*DviSaveProc)(); - -/* - * New fields for the Dvi widget class record - */ - - -typedef struct _DviClass { - DviSaveProc save; -} DviClassPart; - -/* - * Full class record declaration - */ - -typedef struct _DviClassRec { - CoreClassPart core_class; - DviClassPart command_class; -} DviClassRec; - -extern DviClassRec dviClassRec; - -/*************************************** - * - * Instance (widget) structure - * - **************************************/ - -/* - * a list of fonts we've used for this widget - */ - -typedef struct _dviFontSizeList { - struct _dviFontSizeList *next; - int size; - char *x_name; - XFontStruct *font; - int doesnt_exist; -} DviFontSizeList; - -typedef struct _dviFontList { - struct _dviFontList *next; - char *dvi_name; - char *x_name; - int dvi_number; - Boolean initialized; - Boolean scalable; - DviFontSizeList *sizes; - DviCharNameMap *char_map; - DeviceFont *device_font; -} DviFontList; - -typedef struct _dviFontMap { - struct _dviFontMap *next; - char *dvi_name; - char *x_name; -} DviFontMap; - -#define DVI_TEXT_CACHE_SIZE 256 -#define DVI_CHAR_CACHE_SIZE 1024 - -typedef struct _dviCharCache { - XTextItem cache[DVI_TEXT_CACHE_SIZE]; - char adjustable[DVI_TEXT_CACHE_SIZE]; - char char_cache[DVI_CHAR_CACHE_SIZE]; - int index; - int max; - int char_index; - int font_size; - int font_number; - XFontStruct *font; - int start_x, start_y; - int x, y; -} DviCharCache; - -typedef struct _dviState { - struct _dviState *next; - int font_size; - int font_number; - int x; - int y; -} DviState; - -typedef struct _dviFileMap { - struct _dviFileMap *next; - long position; - int page_number; -} DviFileMap; - -/* - * New fields for the Dvi widget record - */ - -typedef struct { - /* - * resource specifiable items - */ - char *font_map_string; - unsigned long foreground; - unsigned long background; - int requested_page; - int last_page; - XFontStruct *default_font; - FILE *file; - Boolean noPolyText; - Boolean seek; /* file is "seekable" */ - int default_resolution; - /* - * private state - */ - FILE *tmpFile; /* used when reading stdin */ - char readingTmp; /* reading now from tmp */ - char ungot; /* have ungetc'd a char */ - GC normal_GC; - GC fill_GC; - DviFileMap *file_map; - DviFontList *fonts; - DviFontMap *font_map; - int current_page; - int font_size; - int font_number; - DeviceFont *device_font; - int device_font_number; - Device *device; - int native; - int device_resolution; - int display_resolution; - int paperlength; - int paperwidth; - double scale_factor; /* display res / device res */ - int sizescale; - int line_thickness; - int line_width; - -#define DVI_FILL_MAX 1000 - - int fill; -#define DVI_FILL_WHITE 0 -#define DVI_FILL_GRAY 1 -#define DVI_FILL_BLACK 2 - int fill_type; - Pixmap gray[8]; - int backing_store; - XFontStruct *font; - int display_enable; - struct ExposedExtents { - int x1, y1, x2, y2; - } extents; - DviState *state; - DviCharCache cache; - int text_x_width; - int text_device_width; - int word_flag; -} DviPart; - -extern int DviGetAndPut(); -#define DviGetIn(dw,cp)\ - (dw->dvi.tmpFile ? (\ - DviGetAndPut (dw, cp) \ - ) :\ - (*cp = getc (dw->dvi.file))\ -) - -#define DviGetC(dw, cp)\ - (dw->dvi.readingTmp ? (\ - ((*cp = getc (dw->dvi.tmpFile)) == EOF) ? (\ - fseek (dw->dvi.tmpFile, 0l, 2),\ - (dw->dvi.readingTmp = 0),\ - DviGetIn (dw,cp)\ - ) : (\ - *cp\ - )\ - ) : (\ - DviGetIn(dw,cp)\ - )\ -) - -#define DviUngetC(dw, c)\ - (dw->dvi.readingTmp ? (\ - ungetc (c, dw->dvi.tmpFile)\ - ) : ( \ - (dw->dvi.ungot = 1),\ - ungetc (c, dw->dvi.file))) - -/* - * Full widget declaration - */ - -typedef struct _DviRec { - CorePart core; - DviPart dvi; -} DviRec; - -#define InheritSaveToFile ((DviSaveProc)_XtInherit) - -extern XFontStruct *QueryFont (); - -extern DviCharNameMap *QueryFontMap (); - -extern DeviceFont *QueryDeviceFont (); - -extern char *GetWord(), *GetLine(); -#endif /* _XtDviP_h */ - - diff -ruN groff-1.19.1/src/xditview/font.c groff-1.19.2/src/xditview/font.c --- groff-1.19.1/src/xditview/font.c 2003-07-02 16:44:15.000000000 +0200 +++ groff-1.19.2/src/xditview/font.c 1970-01-01 01:00:00.000000000 +0100 @@ -1,481 +0,0 @@ -/* - * font.c - * - * map dvi fonts to X fonts - */ - -#include -#include -#include -#include -#include -#include -#include "DviP.h" -#include "XFontName.h" - -static void DisposeFontSizes(); -void DestroyFontMap(); - -/* XFontName.c */ -extern Bool XParseFontName(); -extern Bool XFormatFontName(); - -static char * -savestr (s) - char *s; -{ - char *n; - - if (!s) - return 0; - n = XtMalloc (strlen (s) + 1); - if (n) - strcpy (n, s); - return n; -} - -static DviFontList * -LookupFontByPosition (dw, position) - DviWidget dw; - int position; -{ - DviFontList *f; - - for (f = dw->dvi.fonts; f; f = f->next) - if (f->dvi_number == position) - break; - return f; -} - -int -MaxFontPosition (dw) - DviWidget dw; -{ - DviFontList *f; - int n = -1; - - for (f = dw->dvi.fonts; f; f = f->next) - if (f->dvi_number > n) - n = f->dvi_number; - return n; -} - -static DviFontSizeList * -LookupFontSizeBySize (dw, f, size) - DviWidget dw; - DviFontList *f; - int size; -{ - DviFontSizeList *fs, *best = 0, *smallest = 0; - int bestsize = 0; - XFontName fontName; - unsigned int fontNameAttributes; - char fontNameString[2048]; - int decipointsize; - - if (f->scalable) { - decipointsize = (10*size)/dw->dvi.sizescale; - for (best = f->sizes; best; best = best->next) - if (best->size == decipointsize) - return best; - best = (DviFontSizeList *) XtMalloc(sizeof *best); - best->next = f->sizes; - best->size = decipointsize; - f->sizes = best; - XParseFontName (f->x_name, &fontName, &fontNameAttributes); - fontNameAttributes &= ~(FontNamePixelSize|FontNameAverageWidth); - fontNameAttributes |= FontNameResolutionX; - fontNameAttributes |= FontNameResolutionY; - fontNameAttributes |= FontNamePointSize; - fontName.ResolutionX = dw->dvi.display_resolution; - fontName.ResolutionY = dw->dvi.display_resolution; - fontName.PointSize = decipointsize; - XFormatFontName (&fontName, fontNameAttributes, fontNameString); - best->x_name = savestr (fontNameString); - best->doesnt_exist = 0; - best->font = 0; - return best; - } - for (fs = f->sizes; fs; fs=fs->next) { - if (dw->dvi.sizescale*fs->size <= 10*size - && fs->size >= bestsize) { - best = fs; - bestsize = fs->size; - } - if (smallest == 0 || fs->size < smallest->size) - smallest = fs; - } - return best ? best : smallest; -} - -static char * -SkipFontNameElement (n) - char *n; -{ - while (*n != '-') - if (!*++n) - return 0; - return n+1; -} - -# define SizePosition 8 -# define EncodingPosition 13 - -static int -ConvertFontNameToSize (n) - char *n; -{ - int i, size; - - for (i = 0; i < SizePosition; i++) { - n = SkipFontNameElement (n); - if (!n) - return -1; - } - size = atoi (n); - return size; -} - -static char * -ConvertFontNameToEncoding (n) - char *n; -{ - int i; - for (i = 0; i < EncodingPosition; i++) { - n = SkipFontNameElement (n); - if (!n) - return 0; - } - return n; -} - -DviFontSizeList * -InstallFontSizes (dw, x_name, scalablep) - DviWidget dw; - char *x_name; - Boolean *scalablep; -{ - char fontNameString[2048]; - char **fonts; - int i, count; - int size; - DviFontSizeList *sizes, *new; - XFontName fontName; - unsigned int fontNameAttributes; - - *scalablep = FALSE; - if (!XParseFontName (x_name, &fontName, &fontNameAttributes)) - return 0; - fontNameAttributes &= ~(FontNamePixelSize|FontNamePointSize - |FontNameAverageWidth); - fontNameAttributes |= FontNameResolutionX; - fontNameAttributes |= FontNameResolutionY; - fontName.ResolutionX = dw->dvi.display_resolution; - fontName.ResolutionY = dw->dvi.display_resolution; - XFormatFontName (&fontName, fontNameAttributes, fontNameString); - fonts = XListFonts (XtDisplay (dw), fontNameString, 10000000, &count); - sizes = 0; - for (i = 0; i < count; i++) { - size = ConvertFontNameToSize (fonts[i]); - if (size == 0) { - DisposeFontSizes (dw, sizes); - sizes = 0; - *scalablep = TRUE; - break; - } - if (size != -1) { - new = (DviFontSizeList *) XtMalloc (sizeof *new); - new->next = sizes; - new->size = size; - new->x_name = savestr (fonts[i]); - new->doesnt_exist = 0; - new->font = 0; - sizes = new; - } - } - XFreeFontNames (fonts); - return sizes; -} - -static void -DisposeFontSizes (dw, fs) - DviWidget dw; - DviFontSizeList *fs; -{ - DviFontSizeList *next; - - for (; fs; fs=next) { - next = fs->next; - if (fs->x_name) - XtFree (fs->x_name); - if (fs->font && fs->font != dw->dvi.default_font) { - XUnloadFont (XtDisplay (dw), fs->font->fid); - XFree ((char *)fs->font); - } - XtFree ((char *) fs); - } -} - -static DviFontList * -InstallFont (dw, position, dvi_name, x_name) - DviWidget dw; - int position; - char *dvi_name; - char *x_name; -{ - DviFontList *f; - char *encoding; - - if ((f = LookupFontByPosition (dw, position)) != NULL) { - /* - * ignore gratuitous font loading - */ - if (!strcmp (f->dvi_name, dvi_name) && - !strcmp (f->x_name, x_name)) - return f; - - DisposeFontSizes (dw, f->sizes); - if (f->dvi_name) - XtFree (f->dvi_name); - if (f->x_name) - XtFree (f->x_name); - f->device_font = 0; - } else { - f = (DviFontList *) XtMalloc (sizeof (*f)); - f->next = dw->dvi.fonts; - dw->dvi.fonts = f; - } - f->initialized = FALSE; - f->dvi_name = savestr (dvi_name); - f->device_font = device_find_font (dw->dvi.device, dvi_name); - f->x_name = savestr (x_name); - f->dvi_number = position; - f->sizes = 0; - f->scalable = FALSE; - if (f->x_name) { - encoding = ConvertFontNameToEncoding (f->x_name); - f->char_map = DviFindMap (encoding); - } else - f->char_map = 0; - /* - * force requery of fonts - */ - dw->dvi.font = 0; - dw->dvi.font_number = -1; - dw->dvi.cache.font = 0; - dw->dvi.cache.font_number = -1; - dw->dvi.device_font = 0; - dw->dvi.device_font_number = -1; - return f; -} - -void -ForgetFonts (dw) - DviWidget dw; -{ - DviFontList *f = dw->dvi.fonts; - - while (f) { - DviFontList *tem = f; - - if (f->sizes) - DisposeFontSizes (dw, f->sizes); - if (f->dvi_name) - XtFree (f->dvi_name); - if (f->x_name) - XtFree (f->x_name); - f = f->next; - XtFree ((char *) tem); - } - - /* - * force requery of fonts - */ - dw->dvi.font = 0; - dw->dvi.font_number = -1; - dw->dvi.cache.font = 0; - dw->dvi.cache.font_number = -1; - dw->dvi.device_font = 0; - dw->dvi.device_font_number = -1; - dw->dvi.fonts = 0; -} - - -static char * -MapDviNameToXName (dw, dvi_name) - DviWidget dw; - char *dvi_name; -{ - DviFontMap *fm; - - for (fm = dw->dvi.font_map; fm; fm=fm->next) - if (!strcmp (fm->dvi_name, dvi_name)) - return fm->x_name; - return 0; -} - -#if 0 -static char * -MapXNameToDviName (dw, x_name) - DviWidget dw; - char *x_name; -{ - DviFontMap *fm; - - for (fm = dw->dvi.font_map; fm; fm=fm->next) - if (!strcmp (fm->x_name, x_name)) - return fm->dvi_name; - return 0; -} -#endif - -void -ParseFontMap (dw) - DviWidget dw; -{ - char dvi_name[1024]; - char x_name[2048]; - char *m, *s; - DviFontMap *fm, *new; - - if (dw->dvi.font_map) - DestroyFontMap (dw->dvi.font_map); - fm = 0; - m = dw->dvi.font_map_string; - while (*m) { - s = m; - while (*m && !isspace (*m)) - ++m; - strncpy (dvi_name, s, m-s); - dvi_name[m-s] = '\0'; - while (isspace (*m)) - ++m; - s = m; - while (*m && *m != '\n') - ++m; - strncpy (x_name, s, m-s); - x_name[m-s] = '\0'; - new = (DviFontMap *) XtMalloc (sizeof *new); - new->x_name = savestr (x_name); - new->dvi_name = savestr (dvi_name); - new->next = fm; - fm = new; - ++m; - } - dw->dvi.font_map = fm; -} - -void -DestroyFontMap (font_map) - DviFontMap *font_map; -{ - DviFontMap *next; - - for (; font_map; font_map = next) { - next = font_map->next; - if (font_map->x_name) - XtFree (font_map->x_name); - if (font_map->dvi_name) - XtFree (font_map->dvi_name); - XtFree ((char *) font_map); - } -} - -/* ARGSUSED */ - -void -SetFontPosition (dw, position, dvi_name, extra) - DviWidget dw; - int position; - char *dvi_name; - char *extra; /* unused */ -{ - char *x_name; - - x_name = MapDviNameToXName (dw, dvi_name); - if (x_name) - (void) InstallFont (dw, position, dvi_name, x_name); -} - -XFontStruct * -QueryFont (dw, position, size) - DviWidget dw; - int position; - int size; -{ - DviFontList *f; - DviFontSizeList *fs; - - f = LookupFontByPosition (dw, position); - if (!f) - return dw->dvi.default_font; - if (!f->initialized) { - f->sizes = InstallFontSizes (dw, f->x_name, &f->scalable); - f->initialized = TRUE; - } - fs = LookupFontSizeBySize (dw, f, size); - if (!fs) - return dw->dvi.default_font; - if (!fs->font) { - if (fs->x_name) - fs->font = XLoadQueryFont (XtDisplay (dw), fs->x_name); - if (!fs->font) - fs->font = dw->dvi.default_font; - } - return fs->font; -} - -DeviceFont * -QueryDeviceFont (dw, position) - DviWidget dw; - int position; -{ - DviFontList *f; - - f = LookupFontByPosition (dw, position); - if (!f) - return 0; - return f->device_font; -} - -DviCharNameMap * -QueryFontMap (dw, position) - DviWidget dw; - int position; -{ - DviFontList *f; - - f = LookupFontByPosition (dw, position); - if (f) - return f->char_map; - else - return 0; -} - -#if 0 -LoadFont (dw, position, size) - DviWidget dw; - int position; - int size; -{ - XFontStruct *font; - - font = QueryFont (dw, position, size); - dw->dvi.font_number = position; - dw->dvi.font_size = size; - dw->dvi.font = font; - XSetFont (XtDisplay (dw), dw->dvi.normal_GC, font->fid); - return; -} -#endif - -/* -Local Variables: -c-indent-level: 8 -c-continued-statement-offset: 8 -c-brace-offset: -8 -c-argdecl-indent: 8 -c-label-offset: -8 -c-tab-always-indent: nil -End: -*/ diff -ruN groff-1.19.1/src/xditview/FontMap groff-1.19.2/src/xditview/FontMap --- groff-1.19.1/src/xditview/FontMap 2000-02-06 10:38:57.000000000 +0100 +++ groff-1.19.2/src/xditview/FontMap 1970-01-01 01:00:00.000000000 +0100 @@ -1,17 +0,0 @@ -TR -adobe-times-medium-r-normal--*-*-*-*-p-*-iso8859-1 -TI -adobe-times-medium-i-normal--*-*-*-*-p-*-iso8859-1 -TB -adobe-times-bold-r-normal--*-*-*-*-p-*-iso8859-1 -TBI -adobe-times-bold-i-normal--*-*-*-*-p-*-iso8859-1 -CR -adobe-courier-medium-r-normal--*-*-*-*-m-*-iso8859-1 -CI -adobe-courier-medium-o-normal--*-*-*-*-m-*-iso8859-1 -CB -adobe-courier-bold-r-normal--*-*-*-*-m-*-iso8859-1 -CBI -adobe-courier-bold-o-normal--*-*-*-*-m-*-iso8859-1 -HR -adobe-helvetica-medium-r-normal--*-*-*-*-p-*-iso8859-1 -HI -adobe-helvetica-medium-o-normal--*-*-*-*-p-*-iso8859-1 -HB -adobe-helvetica-bold-r-normal--*-*-*-*-p-*-iso8859-1 -HBI -adobe-helvetica-bold-o-normal--*-*-*-*-p-*-iso8859-1 -NR -adobe-new century schoolbook-medium-r-normal--*-*-*-*-p-*-iso8859-1 -NI -adobe-new century schoolbook-medium-i-normal--*-*-*-*-p-*-iso8859-1 -NB -adobe-new century schoolbook-bold-r-normal--*-*-*-*-p-*-iso8859-1 -NBI -adobe-new century schoolbook-bold-i-normal--*-*-*-*-p-*-iso8859-1 -S -adobe-symbol-medium-r-normal--*-*-*-*-p-*-adobe-fontspecific diff -ruN groff-1.19.1/src/xditview/gray1.bm groff-1.19.2/src/xditview/gray1.bm --- groff-1.19.1/src/xditview/gray1.bm 2000-02-06 10:38:53.000000000 +0100 +++ groff-1.19.2/src/xditview/gray1.bm 1970-01-01 01:00:00.000000000 +0100 @@ -1,4 +0,0 @@ -#define gray1_width 3 -#define gray1_height 3 -static char gray1_bits[] = { - 0x00, 0x02, 0x00}; diff -ruN groff-1.19.1/src/xditview/gray2.bm groff-1.19.2/src/xditview/gray2.bm --- groff-1.19.1/src/xditview/gray2.bm 2000-02-06 10:39:04.000000000 +0100 +++ groff-1.19.2/src/xditview/gray2.bm 1970-01-01 01:00:00.000000000 +0100 @@ -1,4 +0,0 @@ -#define gray2_width 3 -#define gray2_height 3 -static char gray2_bits[] = { - 0x00, 0x03, 0x00}; diff -ruN groff-1.19.1/src/xditview/gray3.bm groff-1.19.2/src/xditview/gray3.bm --- groff-1.19.1/src/xditview/gray3.bm 2000-02-06 10:39:04.000000000 +0100 +++ groff-1.19.2/src/xditview/gray3.bm 1970-01-01 01:00:00.000000000 +0100 @@ -1,4 +0,0 @@ -#define gray3_width 3 -#define gray3_height 3 -static char gray3_bits[] = { - 0x00, 0x03, 0x02}; diff -ruN groff-1.19.1/src/xditview/gray4.bm groff-1.19.2/src/xditview/gray4.bm --- groff-1.19.1/src/xditview/gray4.bm 2000-02-06 10:39:04.000000000 +0100 +++ groff-1.19.2/src/xditview/gray4.bm 1970-01-01 01:00:00.000000000 +0100 @@ -1,4 +0,0 @@ -#define gray4_width 3 -#define gray4_height 3 -static char gray4_bits[] = { - 0x00, 0x07, 0x02}; diff -ruN groff-1.19.1/src/xditview/gray5.bm groff-1.19.2/src/xditview/gray5.bm --- groff-1.19.1/src/xditview/gray5.bm 2000-02-06 10:39:04.000000000 +0100 +++ groff-1.19.2/src/xditview/gray5.bm 1970-01-01 01:00:00.000000000 +0100 @@ -1,4 +0,0 @@ -#define gray5_width 3 -#define gray5_height 3 -static char gray5_bits[] = { - 0x04, 0x07, 0x02}; diff -ruN groff-1.19.1/src/xditview/gray6.bm groff-1.19.2/src/xditview/gray6.bm --- groff-1.19.1/src/xditview/gray6.bm 2000-02-06 10:39:04.000000000 +0100 +++ groff-1.19.2/src/xditview/gray6.bm 1970-01-01 01:00:00.000000000 +0100 @@ -1,4 +0,0 @@ -#define gray6_width 3 -#define gray6_height 3 -static char gray6_bits[] = { - 0x04, 0x07, 0x03}; diff -ruN groff-1.19.1/src/xditview/gray7.bm groff-1.19.2/src/xditview/gray7.bm --- groff-1.19.1/src/xditview/gray7.bm 2000-02-06 10:39:04.000000000 +0100 +++ groff-1.19.2/src/xditview/gray7.bm 1970-01-01 01:00:00.000000000 +0100 @@ -1,4 +0,0 @@ -#define gray7_width 3 -#define gray7_height 3 -static char gray7_bits[] = { - 0x05, 0x07, 0x03}; diff -ruN groff-1.19.1/src/xditview/gray8.bm groff-1.19.2/src/xditview/gray8.bm --- groff-1.19.1/src/xditview/gray8.bm 2000-02-06 10:39:04.000000000 +0100 +++ groff-1.19.2/src/xditview/gray8.bm 1970-01-01 01:00:00.000000000 +0100 @@ -1,4 +0,0 @@ -#define gray8_width 3 -#define gray8_height 3 -static char gray8_bits[] = { - 0x05, 0x07, 0x07}; diff -ruN groff-1.19.1/src/xditview/GXditview.ad groff-1.19.2/src/xditview/GXditview.ad --- groff-1.19.1/src/xditview/GXditview.ad 2000-02-06 10:38:57.000000000 +0100 +++ groff-1.19.2/src/xditview/GXditview.ad 1970-01-01 01:00:00.000000000 +0100 @@ -1,57 +0,0 @@ -GXditview.height: 840 - -GXditview.paned.allowResize: true -GXditview.paned.viewport.allowVert: true -GXditview.paned.viewport.allowHoriz: true -GXditview.paned.viewport.skipAdjust: false -GXditview.paned.viewport.width: 600 -GXditview.paned.viewport.height: 800 -GXditview.paned.viewport.showGrip: false -GXditview.paned.label.skipAdjust: true - -GXditview.paned.viewport.dvi.translations: #augment \ - : XawPositionSimpleMenu(menu) MenuPopup(menu)\n\ - Next: NextPage()\n\ - n: NextPage()\n\ - space: NextPage()\n\ - Return: NextPage()\n\ - Prior: PreviousPage()\n\ - p: PreviousPage()\n\ - BackSpace: PreviousPage()\n\ - Delete: PreviousPage()\n\ - Select: SelectPage()\n\ - Find: OpenFile()\n\ - r: Rerasterize()\n\ - q: Quit() -GXditview.paned.label.translations: #augment \ - : XawPositionSimpleMenu(menu) MenuPopup(menu)\n\ - Next: NextPage()\n\ - n: NextPage()\n\ - space: NextPage()\n\ - Return: NextPage()\n\ - Prior: PreviousPage()\n\ - p: PreviousPage()\n\ - BackSpace: PreviousPage()\n\ - Delete: PreviousPage()\n\ - Select: SelectPage()\n\ - Find: OpenFile()\n\ - r: Rerasterize()\n\ - q: Quit() -GXditview.menu.nextPage.label: Next Page -GXditview.menu.previousPage.label: Previous Page -GXditview.menu.selectPage.label: Select Page -GXditview.menu.print.label: Print -GXditview.menu.openFile.label: Open -GXditview.menu.quit.label: Quit - -GXditview.promptShell.allowShellResize: true -GXditview.promptShell.promptDialog.value.translations: #override \ - Return: Accept() - -GXditview.promptShell.promptDialog.accept.label: Accept -GXditview.promptShell.promptDialog.accept.translations: #override \ - : Accept() unset() - -GXditview.promptShell.promptDialog.cancel.label: Cancel -GXditview.promptShell.promptDialog.cancel.translations: #override \ - : Cancel() unset() diff -ruN groff-1.19.1/src/xditview/GXditview-ad.h groff-1.19.2/src/xditview/GXditview-ad.h --- groff-1.19.1/src/xditview/GXditview-ad.h 2000-02-06 10:39:04.000000000 +0100 +++ groff-1.19.2/src/xditview/GXditview-ad.h 1970-01-01 01:00:00.000000000 +0100 @@ -1,52 +0,0 @@ -"GXditview.height: 840", -"GXditview.paned.allowResize: true", -"GXditview.paned.viewport.allowVert: true", -"GXditview.paned.viewport.allowHoriz: true", -"GXditview.paned.viewport.skipAdjust: false", -"GXditview.paned.viewport.width: 600", -"GXditview.paned.viewport.height: 800", -"GXditview.paned.viewport.showGrip: false", -"GXditview.paned.label.skipAdjust: true", -"GXditview.paned.viewport.dvi.translations: #augment \ - : XawPositionSimpleMenu(menu) MenuPopup(menu)\\n\ - Next: NextPage()\\n\ - n: NextPage()\\n\ - space: NextPage()\\n\ - Return: NextPage()\\n\ - Prior: PreviousPage()\\n\ - p: PreviousPage()\\n\ - BackSpace: PreviousPage()\\n\ - Delete: PreviousPage()\\n\ - Select: SelectPage()\\n\ - Find: OpenFile()\\n\ - r: Rerasterize()\\n\ - q: Quit()", -"GXditview.paned.label.translations: #augment \ - : XawPositionSimpleMenu(menu) MenuPopup(menu)\\n\ - Next: NextPage()\\n\ - n: NextPage()\\n\ - space: NextPage()\\n\ - Return: NextPage()\\n\ - Prior: PreviousPage()\\n\ - p: PreviousPage()\\n\ - BackSpace: PreviousPage()\\n\ - Delete: PreviousPage()\\n\ - Select: SelectPage()\\n\ - Find: OpenFile()\\n\ - r: Rerasterize()\\n\ - q: Quit()", -"GXditview.menu.nextPage.label: Next Page", -"GXditview.menu.previousPage.label: Previous Page", -"GXditview.menu.selectPage.label: Select Page", -"GXditview.menu.print.label: Print", -"GXditview.menu.openFile.label: Open", -"GXditview.menu.quit.label: Quit", -"GXditview.promptShell.allowShellResize: true", -"GXditview.promptShell.promptDialog.value.translations: #override \ - Return: Accept()", -"GXditview.promptShell.promptDialog.accept.label: Accept", -"GXditview.promptShell.promptDialog.accept.translations: #override \ - : Accept() unset()", -"GXditview.promptShell.promptDialog.cancel.label: Cancel", -"GXditview.promptShell.promptDialog.cancel.translations: #override \ - : Cancel() unset()", diff -ruN groff-1.19.1/src/xditview/gxditview.man groff-1.19.2/src/xditview/gxditview.man --- groff-1.19.1/src/xditview/gxditview.man 2001-06-27 14:47:29.000000000 +0200 +++ groff-1.19.2/src/xditview/gxditview.man 1970-01-01 01:00:00.000000000 +0100 @@ -1,249 +0,0 @@ -.TH GXDITVIEW 1 "Release 5" "X Version 11" -.SH NAME -gxditview \- display gtroff output files -.SH SYNOPSIS -.B gxditview -.RI [\fB\- toolkitoption\ .\|.\|.\|] -.RI [\fB\- option\ .\|.\|.\|] -.RI [ filename ] -.SH DESCRIPTION -The -.I gxditview -program displays gtroff output on an X display. -It uses the standard X11 fonts, -so it does not require access to the server machine for font loading. -.PP -If -.I filename -is -.BR \- , -.I gxditview -will read the standard input. -.PP -The left mouse button brings up a menu with the following entries: -.TP 8 -.B "Next Page" -Display the next page. -.TP -.B "Previous Page" -Display the previous page. -.TP -.B "Select Page" -Select a particular numbered page specified by a dialog box. -.TP -.B Print -Print the gtroff output using a command specified by a dialog box. -The default command initially displayed is controlled by the -.B printCommand -application resource, and by the -.B \-printCommand -option. -.TP -.B Open -Open for display a new file specified by a dialog box. -The file should contain gtroff output. -If the filename starts with -.B | -it will be taken to be a command to read from. -.TP -.B Quit -Exit from -.IR gxditview . -.PP -The -.BR n , -Space -and Return keys are bound to the -.B Next\ Page -action. -The -.BR p , -BackSpace -and -Delete -keys are bound to the -.B Previous\ Page -action. -The -.B q -key is bound to the -.B Quit -action. -The -.B r -key is bound to the -.B Rerasterize -action which rereads the current file, and redisplays the current page; -if the current file is a command, the command will be reexecuted. -.PP -The -.B paperlength -and -.B paperwidth -commands in the DESC file specify the length and width in machine units -of the virtual page displayed by -.IR gxditview . -.SH OPTIONS -.I Gxditview -accepts all of the standard X Toolkit command line options along with the -additional options listed below: -.TP 8 -.B \-help -This option indicates that a brief summary of the allowed options should be -printed. -.TP -.B \-page -This option specifies the page number of the document to be displayed. -.TP -.BI \-backingStore\ backing-store-type -Redisplay of the gtroff output window can take upto a second or so, -this option causes the server to save the window contents so that when -it is scrolled around the viewport, the window is painted from -contents saved in backing store. -.I backing-store-type -can be one of -.BR Always , -.B WhenMapped -or -.BR NotUseful . -.TP -.BI \-printCommand\ command -The default command displayed in the dialog box for the -.B Print -menu entry will be -.IR command . -.TP -.BI \-resolution\ res -The gtroff output file will be displayed at a resolution of -.I res -dpi, -unless the DESC file contains the -.B X11 -command, in which case the device resolution will be used. -This corresponds the -.I Dvi -widget's -.B resolution -resource. -The default is 75. -.TP -.BI \-filename\ string -The default filename displayed in the dialog box for the -.B Open -menu entry will be -.IR string . -This can be either a filename, or a command starting with -.BR | . -.PP -The following standard X Toolkit command line arguments are commonly used with -.IR gxditview : -.TP 8 -.BI \-bg\ color -This option specifies the color to use for the background of the window. -The default is \fIwhite\fP. -.TP -.BI \-bd\ color -This option specifies the color to use for the border of the window. -The default is \fIblack\fP. -.TP -.BI \-bw\ number -This option specifies the width in pixels of the border surrounding the window. -.TP -.BI \-fg\ color -This option specifies the color to use for displaying text. The default is -\fIblack\fP. -.TP -.BI \-fn\ font -This option specifies the font to be used for displaying widget text. The -default is \fIfixed\fP. -.TP -.B \-rv -This option indicates that reverse video should be simulated by swapping -the foreground and background colors. -.TP -.BI \-geometry\ geometry -This option specifies the preferred size and position of the window. -.TP -.BI \-display\ host : display -This option specifies the X server to contact. -.TP -.BI \-xrm\ resourcestring -This option specifies a resource string to be used. -.SH X DEFAULTS -This program uses the -.I Dvi -widget in the X Toolkit. It understands all of the core resource names and -classes as well as: -.PP -.TP 8 -.BR width\ (class\ Width ) -Specifies the width of the window. -.TP -.BR height\ (class\ Height ) -Specifies the height of the window. -.TP -.BR foreground\ (class\ Foreground ) -Specifies the default foreground color. -.TP -.BR font\ (class\ Font ) -Specifies the font to be used for error messages. -.TP -.BR fontMap\ (class\ FontMap ) -Specifies the mapping from groff font names to X font names. This -must be a string containing a sequence of lines. Each line contains -two whitespace separated fields: first the groff font name, and -secondly the X font name. The default is -.nf -"\e -TR -adobe-times-medium-r-normal--*-100-*-*-*-*-iso8859-1\en\e -TI -adobe-times-medium-i-normal--*-100-*-*-*-*-iso8859-1\en\e -TB -adobe-times-bold-r-normal--*-100-*-*-*-*-iso8859-1\en\e -TBI -adobe-times-bold-i-normal--*-100-*-*-*-*-iso8859-1\en\e -CR -adobe-courier-medium-r-normal--*-100-*-*-*-*-iso8859-1\en\e -CI -adobe-courier-medium-o-normal--*-100-*-*-*-*-iso8859-1\en\e -CB -adobe-courier-bold-r-normal--*-100-*-*-*-*-iso8859-1\en\e -CBI -adobe-courier-bold-o-normal--*-100-*-*-*-*-iso8859-1\en\e -HR -adobe-helvetica-medium-r-normal--*-100-*-*-*-*-iso8859-1\en\e -HI -adobe-helvetica-medium-o-normal--*-100-*-*-*-*-iso8859-1\en\e -HB -adobe-helvetica-bold-r-normal--*-100-*-*-*-*-iso8859-1\en\e -HBI -adobe-helvetica-bold-o-normal--*-100-*-*-*-*-iso8859-1\en\e -NR -adobe-new century schoolbook-medium-r-normal--*-100-*-*-*-*-iso8859-1\en\e -NI -adobe-new century schoolbook-medium-i-normal--*-100-*-*-*-*-iso8859-1\en\e -NB -adobe-new century schoolbook-bold-r-normal--*-100-*-*-*-*-iso8859-1\en\e -NBI -adobe-new century schoolbook-bold-i-normal--*-100-*-*-*-*-iso8859-1\en\e -S -adobe-symbol-medium-r-normal--*-100-*-*-*-*-adobe-fontspecific\en\e -SS -adobe-symbol-medium-r-normal--*-100-*-*-*-*-adobe-fontspecific\en\e -" -.fi - -.SH "SEE ALSO" -.IR X (1), -.IR xrdb (1), -.IR gtroff (1), -.IR groff (1) -.SH ORIGIN -This program is derived from xditview; -portions of xditview originated in xtroff which was derived -from suntroff. -.SH COPYRIGHT -Copyright 1989, Massachusetts Institute of Technology. -.br -See -.IR X (1) -for a full statement of rights and permissions. -.SH AUTHORS -Keith Packard (MIT X Consortium) -.br -Richard L. Hyde (Purdue) -.br -David Slattengren (Berkeley) -.br -Malcolm Slaney (Schlumberger Palo Alto Research) -.br -Mark Moraes (University of Toronto) -.br -James Clark -. -.\" Local Variables: -.\" mode: nroff -.\" End: diff -ruN groff-1.19.1/src/xditview/Imakefile.in groff-1.19.2/src/xditview/Imakefile.in --- groff-1.19.1/src/xditview/Imakefile.in 2003-11-11 08:09:43.000000000 +0100 +++ groff-1.19.2/src/xditview/Imakefile.in 1970-01-01 01:00:00.000000000 +0100 @@ -1,120 +0,0 @@ -srcdir=@srcdir@ -top_srcdir=@abs_top_srcdir@ -VPATH=@srcdir@ -top_builddir=@abs_top_builddir@ -SEP=@PATH_SEPARATOR@ - -version=`cat $(top_srcdir)/VERSION` -# No additional number if revision is zero -revision=`sed -e 's/^0$$//' -e 's/^[1-9].*$$/.&/' $(top_srcdir)/REVISION` - -GROFF_PREFIX = @prefix@ -GROFF_DATADIR = $(GROFF_PREFIX)/share -GROFF_DATAPROGRAMDIR = $(GROFF_DATADIR)/groff -GROFF_DATASUBDIR = $(GROFF_DATAPROGRAMDIR)/$(version)$(revision) -GROFF_FONTDIR = $(GROFF_DATASUBDIR)/font -GROFF_LOCALFONTDIR = $(GROFF_DATAPROGRAMDIR)/site-font -GROFF_FONTPATH = $(GROFF_FONTDIR)$(SEP)$(GROFF_LOCALFONTDIR)$(SEP)/usr/lib/font -DPIS = 75 100 - -PROGRAMS = \ - gxditview \ - xtotroff -DEPLIBS = XawClientDepLibs -#if defined(HPArchitecture) && (OSMajorVersion > 9) -LOCAL_LIBRARIES = -L/usr/contrib/X11R6/lib XawClientLibs -#else -LOCAL_LIBRARIES = XawClientLibs -#endif -SRCS1 = \ - $(srcdir)/xditview.c \ - $(srcdir)/Dvi.c \ - $(srcdir)/draw.c \ - $(srcdir)/font.c \ - $(srcdir)/lex.c \ - $(srcdir)/page.c \ - $(srcdir)/parse.c \ - $(srcdir)/XFontName.c \ - $(srcdir)/DviChar.c \ - $(srcdir)/device.c -OBJS1 = \ - xditview.o \ - Dvi.o \ - draw.o \ - font.o \ - lex.o \ - page.o \ - parse.o \ - XFontName.o \ - DviChar.o \ - device.o -SRCS2 = \ - $(srcdir)/xtotroff.c \ - $(srcdir)/XFontName.c \ - $(srcdir)/DviChar.c -OBJS2 = \ - xtotroff.o \ - XFontName.o \ - DviChar.o -#if defined(HPArchitecture) && (OSMajorVersion > 9) -INCLUDES = \ - -I/usr/contrib/X11R6/include \ - -I$(TOOLKITSRC) \ - -I$(TOP) -#else -INCLUDES = \ - -I$(TOOLKITSRC) \ - -I$(TOP) -#endif -MATHLIB = -lm -DEFINES = \ - $(SIGNAL_DEFINES) \ - -DFONTPATH=\"$(GROFF_FONTPATH)\" # -DX_NOT_STDC_ENV - -DEVDIR = $(top_builddir)/font -MKINSTALLDIRS = $(top_srcdir)/mkinstalldirs - -#undef ProgramTargetHelper -#define ProgramTargetHelper ProgramTargetHelperNoMan -ComplexProgramTarget_1(gxditview,$(LOCAL_LIBRARIES),$(MATHLIB)) -InstallManPageLong($(srcdir)/gxditview,$(MANDIR),gxditview) -NormalProgramTarget(xtotroff,$(OBJS2),$(DEPXLIB),$(XLIB), /**/) - -InstallAppDefaultsLong($(srcdir)/GXditview,GXditview) - -fonts: xtotroff $(srcdir)/DESC $(srcdir)/FontMap - @dir=`pwd`; \ - fonts=`sed -e 's/[ ].*//' $(srcdir)/FontMap`; \ - for dpi in $(DPIS); do \ - echo Making devX$$dpi; \ - test -d $(DEVDIR)/devX$$dpi || \ - $(MKINSTALLDIRS) $(DEVDIR)/devX$$dpi; \ - rm -f $(DEVDIR)/devX$$dpi/DESC; \ - sed -e "s/res 75/res $$dpi/" $(srcdir)/DESC \ - >$(DEVDIR)/devX$$dpi/DESC; \ - (cd $(DEVDIR)/devX$$dpi; \ - rm -f Makefile.sub; \ - echo DEV=X$$dpi >Makefile.sub; \ - echo DEVFILES=DESC $$fonts >>Makefile.sub; \ - $$dir/xtotroff -g -r $$dpi -s 10 $(srcdir)/FontMap); \ - echo Making devX$$dpi-12; \ - test -d $(DEVDIR)/devX$$dpi-12 || \ - $(MKINSTALLDIRS) $(DEVDIR)/devX$$dpi-12; \ - rm -f $(DEVDIR)/devX$$dpi-12/DESC; \ - sed -e "s/res 75/res $$dpi/" \ - -e 's/unitwidth 10/unitwidth 12/' $(srcdir)/DESC \ - >$(DEVDIR)/devX$$dpi-12/DESC; \ - (cd $(DEVDIR)/devX$$dpi-12; \ - rm -f Makefile.sub; \ - echo DEV=X$$dpi-12 >Makefile.sub; \ - echo DEVFILES=DESC $$fonts >>Makefile.sub; \ - $$dir/xtotroff -g -r $$dpi -s 12 $(srcdir)/FontMap); \ - done - -GXditview-ad.h: $(srcdir)/GXditview.ad - /bin/sh $(srcdir)/ad2c $(srcdir)/GXditview.ad >GXditview-ad.h - -extraclean: clean - -rm -f junk tmp grot old Makefile Imakefile $(srcdir)/gxditview._man - -FORCE: diff -ruN groff-1.19.1/src/xditview/INSTALL groff-1.19.2/src/xditview/INSTALL --- groff-1.19.1/src/xditview/INSTALL 2000-02-06 10:38:57.000000000 +0100 +++ groff-1.19.2/src/xditview/INSTALL 1970-01-01 01:00:00.000000000 +0100 @@ -1,20 +0,0 @@ -This version of gxditview uses imake. - -Here are the steps needed to install gxditview: - -- edit the Imakefile if necessary - -- xmkmf - -- make depend - -- make - -- make install - -- make install.man (installs the man page) - -The gxditview binary will be installed in the usual place for X -binaries (eg /usr/bin/X11). Previous versions of gxditview were -installed along with the other groff binaries (eg in /usr/local/bin); -you will need to remove these by hand. diff -ruN groff-1.19.1/src/xditview/lex.c groff-1.19.2/src/xditview/lex.c --- groff-1.19.1/src/xditview/lex.c 2003-07-02 16:44:15.000000000 +0200 +++ groff-1.19.2/src/xditview/lex.c 1970-01-01 01:00:00.000000000 +0100 @@ -1,105 +0,0 @@ -#include -#include -#include -#include -#include "DviP.h" - -int -DviGetAndPut(dw, cp) - DviWidget dw; - int *cp; -{ - if (dw->dvi.ungot) { - dw->dvi.ungot = 0; - *cp = getc (dw->dvi.file); - } - else { - *cp = getc (dw->dvi.file); - if (*cp != EOF) - putc (*cp, dw->dvi.tmpFile); - } - return *cp; -} - -char * -GetLine(dw, Buffer, Length) - DviWidget dw; - char *Buffer; - int Length; -{ - int i = 0, c; - - Length--; /* Save room for final '\0' */ - - while (DviGetC (dw, &c) != EOF) { - if (Buffer && i < Length) - Buffer[i++] = c; - if (c == '\n') { - DviUngetC(dw, c); - break; - } - } - if (Buffer) - Buffer[i] = '\0'; - return Buffer; -} - -char * -GetWord(dw, Buffer, Length) - DviWidget dw; - char *Buffer; - int Length; -{ - int i = 0, c; - - Length--; /* Save room for final '\0' */ - while (DviGetC(dw, &c) == ' ' || c == '\n') - ; - while (c != EOF) { - if (Buffer && i < Length) - Buffer[i++] = c; - if (DviGetC(dw, &c) == ' ' || c == '\n') { - DviUngetC(dw, c); - break; - } - } - if (Buffer) - Buffer[i] = '\0'; - return Buffer; -} - -int -GetNumber(dw) - DviWidget dw; -{ - int i = 0, c; - int negative = 0; - - while (DviGetC(dw, &c) == ' ' || c == '\n') - ; - if (c == '-') { - negative = 1; - DviGetC(dw, &c); - } - - for (; c >= '0' && c <= '9'; DviGetC(dw, &c)) { - if (negative) - i = i*10 - (c - '0'); - else - i = i*10 + c - '0'; - } - if (c != EOF) - DviUngetC(dw, c); - return i; -} - -/* -Local Variables: -c-indent-level: 8 -c-continued-statement-offset: 8 -c-brace-offset: -8 -c-argdecl-indent: 8 -c-label-offset: -8 -c-tab-always-indent: nil -End: -*/ diff -ruN groff-1.19.1/src/xditview/Menu.h groff-1.19.2/src/xditview/Menu.h --- groff-1.19.1/src/xditview/Menu.h 2000-02-06 10:38:57.000000000 +0100 +++ groff-1.19.2/src/xditview/Menu.h 1970-01-01 01:00:00.000000000 +0100 @@ -1,46 +0,0 @@ -/* - * $XConsortium: Menu.h,v 1.2 89/07/21 14:22:10 jim Exp $ - */ - -#ifndef _XtMenu_h -#define _XtMenu_h - -/*********************************************************************** - * - * Menu Widget - * - ***********************************************************************/ - -/* Parameters: - - Name Class RepType Default Value - ---- ----- ------- ------------- - background Background pixel White - border BorderColor pixel Black - borderWidth BorderWidth int 1 - height Height int 120 - mappedWhenManaged MappedWhenManaged Boolean True - reverseVideo ReverseVideo Boolean False - width Width int 120 - x Position int 0 - y Position int 0 - -*/ - -#define XtNmenuEntries "menuEntries" -#define XtNhorizontalPadding "horizontalPadding" -#define XtNverticalPadding "verticalPadding" -#define XtNselection "Selection" - -#define XtCMenuEntries "MenuEntries" -#define XtCPadding "Padding" -#define XtCSelection "Selection" - -typedef struct _MenuRec *MenuWidget; /* completely defined in MenuPrivate.h */ -typedef struct _MenuClassRec *MenuWidgetClass; /* completely defined in MenuPrivate.h */ - -extern WidgetClass menuWidgetClass; - -extern Widget XawMenuCreate (); -#endif /* _XtMenu_h */ -/* DON'T ADD STUFF AFTER THIS #endif */ diff -ruN groff-1.19.1/src/xditview/page.c groff-1.19.2/src/xditview/page.c --- groff-1.19.1/src/xditview/page.c 2003-07-02 16:44:15.000000000 +0200 +++ groff-1.19.2/src/xditview/page.c 1970-01-01 01:00:00.000000000 +0100 @@ -1,93 +0,0 @@ -/* - * page.c - * - * map page numbers to file position - */ - -#include -#include -#include -#include -#include -#include "DviP.h" - -#ifdef X_NOT_STDC_ENV -extern long ftell(); -#endif - -static DviFileMap * -MapPageNumberToFileMap (dw, number) - DviWidget dw; - int number; -{ - DviFileMap *m; - - for (m = dw->dvi.file_map; m; m=m->next) - if (m->page_number == number) - break; - return m; -} - -void -DestroyFileMap (m) - DviFileMap *m; -{ - DviFileMap *next; - - for (; m; m = next) { - next = m->next; - XtFree ((char *) m); - } -} - -void -ForgetPagePositions (dw) - DviWidget dw; -{ - DestroyFileMap (dw->dvi.file_map); - dw->dvi.file_map = 0; -} - -void -RememberPagePosition(dw, number) - DviWidget dw; - int number; -{ - DviFileMap *m; - - if (!(m = MapPageNumberToFileMap (dw, number))) { - m = (DviFileMap *) XtMalloc (sizeof *m); - m->page_number = number; - m->next = dw->dvi.file_map; - dw->dvi.file_map = m; - } - if (dw->dvi.tmpFile) - m->position = ftell (dw->dvi.tmpFile); - else - m->position = ftell (dw->dvi.file); -} - -long -SearchPagePosition (dw, number) - DviWidget dw; - int number; -{ - DviFileMap *m; - - if (!(m = MapPageNumberToFileMap (dw, number))) - return -1; - return m->position; -} - -void -FileSeek(dw, position) -DviWidget dw; -long position; -{ - if (dw->dvi.tmpFile) { - dw->dvi.readingTmp = 1; - fseek (dw->dvi.tmpFile, position, 0); - } else - fseek (dw->dvi.file, position, 0); -} - diff -ruN groff-1.19.1/src/xditview/parse.c groff-1.19.2/src/xditview/parse.c --- groff-1.19.1/src/xditview/parse.c 2003-07-02 16:44:15.000000000 +0200 +++ groff-1.19.2/src/xditview/parse.c 1970-01-01 01:00:00.000000000 +0100 @@ -1,371 +0,0 @@ -/* - * parse.c - * - * parse dvi input - */ - -#include -#include -#include -#include -#include -#include "DviP.h" - -static int StopSeen = 0; -static void ParseDrawFunction(), ParseDeviceControl(); -static void push_env(), pop_env(); - -/* draw.c */ -extern int PutCharacter(); -extern int PutNumberedCharacter(); -extern void HorizontalGoto(); -extern void Word(); -extern void VerticalGoto(); -extern void VerticalMove(); -extern void FlushCharCache(); -extern void Newline(); -extern void DrawLine(); -extern void DrawCircle(); -extern void DrawFilledCircle(); -extern void DrawEllipse(); -extern void DrawFilledEllipse(); -extern void DrawArc(); -extern void DrawPolygon(); -extern void DrawFilledPolygon(); -extern void DrawSpline(); - -/* Dvi.c */ -extern void SetDevice(); - -/* page.c */ -extern void RememberPagePosition(); - -/* font.c */ -extern void SetFontPosition(); - -/* lex.c */ -extern int GetNumber(); - -#define HorizontalMove(dw, delta) ((dw)->dvi.state->x += (delta)) - - -int -ParseInput(dw) - register DviWidget dw; -{ - int n, k; - int c; - char Buffer[BUFSIZ]; - int NextPage; - int otherc; - - StopSeen = 0; - - /* - * make sure some state exists - */ - - if (!dw->dvi.state) - push_env (dw); - for (;;) { - switch (DviGetC(dw, &c)) { - case '\n': - break; - case ' ': /* when input is text */ - case 0: /* occasional noise creeps in */ - break; - case '{': /* push down current environment */ - push_env(dw); - break; - case '}': - pop_env(dw); - break; - /* - * two motion digits plus a character - */ - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - HorizontalMove(dw, (c-'0')*10 + - DviGetC(dw,&otherc)-'0'); - /* fall through */ - case 'c': /* single ascii character */ - DviGetC(dw,&c); - if (c == ' ') - break; - Buffer[0] = c; - Buffer[1] = '\0'; - (void) PutCharacter (dw, Buffer); - break; - case 'C': - GetWord (dw, Buffer, BUFSIZ); - (void) PutCharacter (dw, Buffer); - break; - case 't': - Buffer[1] = '\0'; - while (DviGetC (dw, &c) != EOF - && c != ' ' && c != '\n') { - Buffer[0] = c; - HorizontalMove (dw, PutCharacter (dw, Buffer)); - } - break; - case 'u': - n = GetNumber(dw); - Buffer[1] = '\0'; - while (DviGetC (dw, &c) == ' ') - ; - while (c != EOF && c != ' ' && c != '\n') { - Buffer[0] = c; - HorizontalMove (dw, - PutCharacter (dw, Buffer) + n); - DviGetC (dw, &c); - } - break; - - case 'D': /* draw function */ - (void) GetLine(dw, Buffer, BUFSIZ); - if (dw->dvi.display_enable) - ParseDrawFunction(dw, Buffer); - break; - case 's': /* ignore fractional sizes */ - n = GetNumber(dw); - dw->dvi.state->font_size = n; - break; - case 'f': - n = GetNumber(dw); - dw->dvi.state->font_number = n; - break; - case 'H': /* absolute horizontal motion */ - k = GetNumber(dw); - HorizontalGoto(dw, k); - break; - case 'h': /* relative horizontal motion */ - k = GetNumber(dw); - HorizontalMove(dw, k); - break; - case 'w': /* word space */ - Word (dw); - break; - case 'V': - n = GetNumber(dw); - VerticalGoto(dw, n); - break; - case 'v': - n = GetNumber(dw); - VerticalMove(dw, n); - break; - case 'P': /* new spread */ - break; - case 'p': /* new page */ - (void) GetNumber(dw); - NextPage = dw->dvi.current_page + 1; - RememberPagePosition(dw, NextPage); - FlushCharCache (dw); - return(NextPage); - case 'N': - n = GetNumber(dw); - PutNumberedCharacter (dw, n); - break; - case 'n': /* end of line */ - GetNumber(dw); - GetNumber(dw); - Newline (dw); - HorizontalGoto(dw, 0); - break; - case 'F': /* input files */ - case '+': /* continuation of X device control */ - case 'm': /* color */ - case '#': /* comment */ - GetLine(dw, NULL, 0); - break; - case 'x': /* device control */ - ParseDeviceControl(dw); - break; - case EOF: - dw->dvi.last_page = dw->dvi.current_page; - FlushCharCache (dw); - return dw->dvi.current_page; - default: - break; - } - } -} - -static void -push_env(dw) - DviWidget dw; -{ - DviState *new; - - new = (DviState *) XtMalloc (sizeof (*new)); - if (dw->dvi.state) - *new = *(dw->dvi.state); - else { - new->font_size = 10; - new->font_number = 1; - new->x = 0; - new->y = 0; - } - new->next = dw->dvi.state; - dw->dvi.state = new; -} - -static void -pop_env(dw) - DviWidget dw; -{ - DviState *old; - - old = dw->dvi.state; - dw->dvi.state = old->next; - XtFree ((char *) old); -} - -static void -InitTypesetter (dw) - DviWidget dw; -{ - while (dw->dvi.state) - pop_env (dw); - push_env (dw); - FlushCharCache (dw); -} - -#define DRAW_ARGS_MAX 128 - -static void -ParseDrawFunction(dw, buf) -DviWidget dw; -char *buf; -{ - int v[DRAW_ARGS_MAX]; - int i, no_move = 0; - char *ptr; - - v[0] = v[1] = v[2] = v[3] = 0; - - if (buf[0] == '\0') - return; - ptr = buf+1; - - for (i = 0; i < DRAW_ARGS_MAX; i++) { - if (sscanf(ptr, "%d", v + i) != 1) - break; - while (*ptr == ' ') - ptr++; - while (*ptr != '\0' && *ptr != ' ') - ptr++; - } - - switch (buf[0]) { - case 'l': /* draw a line */ - DrawLine(dw, v[0], v[1]); - break; - case 'c': /* circle */ - DrawCircle(dw, v[0]); - break; - case 'C': - DrawFilledCircle(dw, v[0]); - break; - case 'e': /* ellipse */ - DrawEllipse(dw, v[0], v[1]); - break; - case 'E': - DrawFilledEllipse(dw, v[0], v[1]); - break; - case 'a': /* arc */ - DrawArc(dw, v[0], v[1], v[2], v[3]); - break; - case 'p': - DrawPolygon(dw, v, i); - break; - case 'P': - DrawFilledPolygon(dw, v, i); - break; - case '~': /* wiggly line */ - DrawSpline(dw, v, i); - break; - case 't': - dw->dvi.line_thickness = v[0]; - break; - case 'f': - if (i > 0 && v[0] >= 0 && v[0] <= DVI_FILL_MAX) - dw->dvi.fill = v[0]; - no_move = 1; - break; - default: -#if 0 - warning("unknown drawing function %s", buf); -#endif - no_move = 1; - break; - } - - if (!no_move) { - if (buf[0] == 'e') { - if (i > 0) - dw->dvi.state->x += v[0]; - } - else { - while (--i >= 0) { - if (i & 1) - dw->dvi.state->y += v[i]; - else - dw->dvi.state->x += v[i]; - } - } - } -} - -static void -ParseDeviceControl(dw) /* Parse the x commands */ - DviWidget dw; -{ - char str[20], str1[50]; - int c, n; - - GetWord (dw, str, 20); - switch (str[0]) { /* crude for now */ - case 'T': /* output device */ - GetWord (dw, str, 20); - SetDevice (dw, str); - break; - case 'i': /* initialize */ - InitTypesetter (dw); - break; - case 't': /* trailer */ - break; - case 'p': /* pause -- can restart */ - break; - case 's': /* stop */ - StopSeen = 1; - return; - case 'r': /* resolution when prepared */ - break; - case 'f': /* font used */ - n = GetNumber (dw); - GetWord (dw, str, 20); - GetLine (dw, str1, 50); - SetFontPosition (dw, n, str, str1); - break; - case 'H': /* char height */ - break; - case 'S': /* slant */ - break; - } - while (DviGetC (dw, &c) != '\n') /* skip rest of input line */ - if (c == EOF) - return; - return; -} - - -/* -Local Variables: -c-indent-level: 8 -c-continued-statement-offset: 8 -c-brace-offset: -8 -c-argdecl-indent: 8 -c-label-offset: -8 -c-tab-always-indent: nil -End: -*/ diff -ruN groff-1.19.1/src/xditview/README groff-1.19.2/src/xditview/README --- groff-1.19.1/src/xditview/README 2000-02-06 10:38:58.000000000 +0100 +++ groff-1.19.2/src/xditview/README 1970-01-01 01:00:00.000000000 +0100 @@ -1,14 +0,0 @@ -This is gxditview, a X11 previewer for groff based on MIT's xditview. -This version can be used with the output of gtroff -Tps as well as -with -TX75 and -TX100. You will need X11R5 or newer to install it (it -might work on X11R4, but I haven't tested it.) - -See the file INSTALL in this directory for installation instructions. - -xditview is copyrighted by MIT under the usual X terms (see -gxditview.man); my changes to it are in the public domain. - -Please report bugs to bug-groff@gnu.org. - -James Clark -jjc@jclark.com diff -ruN groff-1.19.1/src/xditview/TODO groff-1.19.2/src/xditview/TODO --- groff-1.19.1/src/xditview/TODO 2000-02-06 10:38:58.000000000 +0100 +++ groff-1.19.2/src/xditview/TODO 1970-01-01 01:00:00.000000000 +0100 @@ -1,17 +0,0 @@ -Replace Imakefile with a configure script. - -Better error handling. - -Resource and command-line option to specify font path. - -Resource to specify name of environment variable from which to get the -font path. - -Have character substitutions (currently done in draw.c:FakeCharacter) -specified in a resource (similar format to FontMap). - -The initial width of the dialog box should expand to accommodate the -default value. - -Option in Print dialog to specify that only the current page should be -printed. diff -ruN groff-1.19.1/src/xditview/xdit.bm groff-1.19.2/src/xditview/xdit.bm --- groff-1.19.1/src/xditview/xdit.bm 2000-02-06 10:39:03.000000000 +0100 +++ groff-1.19.2/src/xditview/xdit.bm 1970-01-01 01:00:00.000000000 +0100 @@ -1,14 +0,0 @@ -#define xdit_width 32 -#define xdit_height 32 -static char xdit_bits[] = { - 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x03, 0x02, 0x00, 0x00, 0x02, - 0x8a, 0xa2, 0xfc, 0x03, 0x52, 0x14, 0x03, 0x04, 0x02, 0x80, 0x00, 0x08, - 0x52, 0x54, 0x00, 0x10, 0x8a, 0x22, 0x8f, 0x23, 0x02, 0x20, 0x06, 0x21, - 0x8a, 0x12, 0x8c, 0x40, 0x52, 0x14, 0x8c, 0x40, 0x02, 0x10, 0x58, 0x40, - 0x52, 0x14, 0x30, 0x40, 0x8a, 0x12, 0x30, 0x40, 0x02, 0x10, 0x70, 0x40, - 0x8a, 0x12, 0xc8, 0x40, 0x52, 0x24, 0xc4, 0xe0, 0x02, 0x20, 0x84, 0xe1, - 0x52, 0x54, 0xce, 0xf3, 0x8a, 0xa2, 0x00, 0xf8, 0x02, 0x00, 0x03, 0xfc, - 0x8a, 0x22, 0xfc, 0xf3, 0x52, 0x14, 0x00, 0xc2, 0x02, 0x00, 0x00, 0x02, - 0x52, 0x14, 0x45, 0x02, 0x8a, 0xa2, 0x28, 0x02, 0x02, 0x00, 0x00, 0x02, - 0x02, 0x00, 0x00, 0x02, 0xfe, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff -ruN groff-1.19.1/src/xditview/xdit_mask.bm groff-1.19.2/src/xditview/xdit_mask.bm --- groff-1.19.1/src/xditview/xdit_mask.bm 2000-02-06 10:39:03.000000000 +0100 +++ groff-1.19.2/src/xditview/xdit_mask.bm 1970-01-01 01:00:00.000000000 +0100 @@ -1,14 +0,0 @@ -#define xdit_mask_width 32 -#define xdit_mask_height 32 -static char xdit_mask_bits[] = { - 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0x07, - 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0x1f, - 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xc7, - 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0x07, - 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0x07, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff -ruN groff-1.19.1/src/xditview/xditview.c groff-1.19.2/src/xditview/xditview.c --- groff-1.19.1/src/xditview/xditview.c 2003-07-02 16:44:15.000000000 +0200 +++ groff-1.19.2/src/xditview/xditview.c 1970-01-01 01:00:00.000000000 +0100 @@ -1,600 +0,0 @@ -/* - * Copyright 1991 Massachusetts Institute of Technology - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation, and that the name of M.I.T. not be used in advertising or - * publicity pertaining to distribution of the software without specific, - * written prior permission. M.I.T. makes no representations about the - * suitability of this software for any purpose. It is provided "as is" - * without express or implied warranty. - * - * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T. - * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - */ -/* - * xditview -- - * - * Display ditroff output in an X window - */ - -#ifndef SABER -#ifndef lint -static char rcsid[] = "$XConsortium: xditview.c,v 1.17 89/12/10 17:05:08 rws Exp $"; -#endif /* lint */ -#endif /* SABER */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "Dvi.h" - -#include "xdit.bm" -#include "xdit_mask.bm" -#include "stdio.h" - -extern FILE *popen(); -extern void exit(); - -static String fallback_resources[] = { -#include "GXditview-ad.h" - NULL -}; - -static struct app_resources { - char *print_command; - char *filename; -} app_resources; - -#define offset(field) XtOffset(struct app_resources *, field) - -/* Application resources. */ - -static XtResource resources[] = { - {"printCommand", "PrintCommand", XtRString, sizeof(char*), - offset(print_command), XtRString, NULL}, - {"filename", "Filename", XtRString, sizeof(char*), - offset(filename), XtRString, NULL}, -}; - -#undef offset - -/* Command line options table. Only resources are entered here...there is a - pass over the remaining options after XtParseCommand is let loose. */ - -static XrmOptionDescRec options[] = { -{"-page", "*dvi.pageNumber", XrmoptionSepArg, NULL}, -{"-backingStore", "*dvi.backingStore", XrmoptionSepArg, NULL}, -{"-resolution", "*dvi.resolution", XrmoptionSepArg, NULL}, -{"-printCommand", ".printCommand", XrmoptionSepArg, NULL}, -{"-filename", ".filename", XrmoptionSepArg, NULL}, -{"-noPolyText", "*dvi.noPolyText", XrmoptionNoArg, "TRUE"}, -}; - -static char current_print_command[1024]; - -static char current_file_name[1024]; -static FILE *current_file; - -/* - * Report the syntax for calling xditview. - */ - -static void -Syntax(call) - char *call; -{ - (void) printf ("Usage: %s [-fg ] [-bg ]\n", call); - (void) printf (" [-bd ] [-bw ] [-help]\n"); - (void) printf (" [-display displayname] [-geometry geom]\n"); - (void) printf (" [-page ] [-backing ]\n"); - (void) printf (" [-resolution ] [-print ]\n"); - (void) printf (" [-filename ] [filename]\n\n"); - exit(1); -} - -static void NewFile (), SetPageNumber (); -static Widget toplevel, paned, viewport, dvi; -static Widget page; -static Widget simpleMenu; - -static void NextPage(), PreviousPage(), SelectPage(), OpenFile(), Quit(); -static void Print(); - -static struct menuEntry { - char *name; - void (*function)(); -} menuEntries[] = { - {"nextPage", NextPage}, - {"previousPage", PreviousPage}, - {"selectPage", SelectPage}, - {"print", Print}, - {"openFile", OpenFile}, - {"quit", Quit}, -}; - -static void NextPageAction(), PreviousPageAction(), SelectPageAction(); -static void OpenFileAction(), QuitAction(); -static void AcceptAction(), CancelAction(); -static void PrintAction(); -static void RerasterizeAction(); -static void MakePrompt(); - -XtActionsRec xditview_actions[] = { - {"NextPage", NextPageAction}, - {"PreviousPage", PreviousPageAction}, - {"SelectPage", SelectPageAction}, - {"Print", PrintAction}, - {"OpenFile", OpenFileAction}, - {"Rerasterize", RerasterizeAction}, - {"Quit", QuitAction}, - {"Accept", AcceptAction}, - {"Cancel", CancelAction}, -}; - -#define MenuNextPage 0 -#define MenuPreviousPage 1 -#define MenuSelectPage 2 -#define MenuPrint 3 -#define MenuOpenFile 4 -#define MenuQuit 5 - -static char pageLabel[256] = "Page "; - -int main(argc, argv) - int argc; - char **argv; -{ - char *file_name = 0; - int i; - static Arg labelArgs[] = { - {XtNlabel, (XtArgVal) pageLabel}, - }; - XtAppContext xtcontext; - Arg topLevelArgs[2]; - Widget entry; - Arg pageNumberArgs[1]; - int page_number; - - toplevel = XtAppInitialize(&xtcontext, "GXditview", - options, XtNumber (options), - &argc, argv, fallback_resources, NULL, 0); - if (argc > 2 - || (argc == 2 && (!strcmp(argv[1], "-help") - || !strcmp(argv[1], "--help")))) - Syntax(argv[0]); - - XtGetApplicationResources(toplevel, (XtPointer)&app_resources, - resources, XtNumber(resources), - NULL, (Cardinal) 0); - if (app_resources.print_command) - strcpy(current_print_command, app_resources.print_command); - - XtAppAddActions(xtcontext, xditview_actions, XtNumber (xditview_actions)); - - XtSetArg (topLevelArgs[0], XtNiconPixmap, - XCreateBitmapFromData (XtDisplay (toplevel), - XtScreen(toplevel)->root, - xdit_bits, xdit_width, xdit_height)); - - XtSetArg (topLevelArgs[1], XtNiconMask, - XCreateBitmapFromData (XtDisplay (toplevel), - XtScreen(toplevel)->root, - xdit_mask_bits, - xdit_mask_width, xdit_mask_height)); - XtSetValues (toplevel, topLevelArgs, 2); - if (argc > 1) - file_name = argv[1]; - - /* - * create the menu and insert the entries - */ - simpleMenu = XtCreatePopupShell ("menu", simpleMenuWidgetClass, toplevel, - NULL, 0); - for (i = 0; i < XtNumber (menuEntries); i++) { - entry = XtCreateManagedWidget(menuEntries[i].name, - smeBSBObjectClass, simpleMenu, - NULL, (Cardinal) 0); - XtAddCallback(entry, XtNcallback, menuEntries[i].function, NULL); - } - - paned = XtCreateManagedWidget("paned", panedWidgetClass, toplevel, - NULL, (Cardinal) 0); - viewport = XtCreateManagedWidget("viewport", viewportWidgetClass, paned, - NULL, (Cardinal) 0); - dvi = XtCreateManagedWidget ("dvi", dviWidgetClass, viewport, NULL, 0); - page = XtCreateManagedWidget ("label", labelWidgetClass, paned, - labelArgs, XtNumber (labelArgs)); - XtSetArg (pageNumberArgs[0], XtNpageNumber, &page_number); - XtGetValues (dvi, pageNumberArgs, 1); - if (file_name) - NewFile (file_name); - /* NewFile modifies current_file_name, so do this here. */ - if (app_resources.filename) - strcpy(current_file_name, app_resources.filename); - XtRealizeWidget (toplevel); - if (file_name) - SetPageNumber (page_number); - XtAppMainLoop(xtcontext); - return 0; -} - -static void -SetPageNumber (number) -{ - Arg arg[2]; - int actual_number, last_page; - - XtSetArg (arg[0], XtNpageNumber, number); - XtSetValues (dvi, arg, 1); - XtSetArg (arg[0], XtNpageNumber, &actual_number); - XtSetArg (arg[1], XtNlastPageNumber, &last_page); - XtGetValues (dvi, arg, 2); - if (actual_number == 0) - sprintf (pageLabel, "Page "); - else if (last_page > 0) - sprintf (pageLabel, "Page %d of %d", actual_number, last_page); - else - sprintf (pageLabel, "Page %d", actual_number); - XtSetArg (arg[0], XtNlabel, pageLabel); - XtSetValues (page, arg, 1); -} - -static void -SelectPageNumber (number_string) -char *number_string; -{ - SetPageNumber (atoi(number_string)); -} - -static int hadFile = 0; - -static void -NewFile (name) -char *name; -{ - Arg arg[2]; - char *n; - FILE *new_file; - Boolean seek = 0; - - if (current_file) { - if (!strcmp (current_file_name, "-")) - ; - else if (current_file_name[0] == '|') - pclose (current_file); - else - fclose (current_file); - } - if (!strcmp (name, "-")) - new_file = stdin; - else if (name[0] == '|') - new_file = popen (name+1, "r"); - else { - new_file = fopen (name, "r"); - seek = 1; - } - if (!new_file) { - /* XXX display error message */ - return; - } - XtSetArg (arg[0], XtNfile, new_file); - XtSetArg (arg[1], XtNseek, seek); - XtSetValues (dvi, arg, 2); - if (hadFile || name[0] != '-' || name[1] != '\0') { - XtSetArg (arg[0], XtNtitle, name); - if (name[0] != '/' && (n = strrchr (name, '/'))) - n = n + 1; - else - n = name; - XtSetArg (arg[1], XtNiconName, n); - XtSetValues (toplevel, arg, 2); - } - hadFile = 1; - SelectPageNumber ("1"); - strcpy (current_file_name, name); - current_file = new_file; -} - -static char fileBuf[1024]; - -static void -ResetMenuEntry (entry) - Widget entry; -{ - Arg arg[1]; - - XtSetArg (arg[0], XtNpopupOnEntry, entry); - XtSetValues (XtParent(entry) , arg, (Cardinal) 1); -} - -/*ARGSUSED*/ - -static void -NextPage (entry, name, data) - Widget entry; - caddr_t name, data; -{ - NextPageAction(); - ResetMenuEntry (entry); -} - -static void -NextPageAction () -{ - Arg args[1]; - int number; - - XtSetArg (args[0], XtNpageNumber, &number); - XtGetValues (dvi, args, 1); - SetPageNumber (number+1); -} - -/*ARGSUSED*/ - -static void -PreviousPage (entry, name, data) - Widget entry; - caddr_t name, data; -{ - PreviousPageAction (); - ResetMenuEntry (entry); -} - -static void -PreviousPageAction () -{ - Arg args[1]; - int number; - - XtSetArg (args[0], XtNpageNumber, &number); - XtGetValues (dvi, args, 1); - SetPageNumber (number-1); -} - -/* ARGSUSED */ - -static void -SelectPage (entry, name, data) - Widget entry; - caddr_t name, data; -{ - SelectPageAction (); - ResetMenuEntry (entry); -} - -static void -SelectPageAction () -{ - MakePrompt (toplevel, "Page number", SelectPageNumber, ""); -} - - -static void -DoPrint (name) - char *name; -{ - FILE *print_file; -#ifdef SIGNALRETURNSINT - int (*handler)(); -#else - void (*handler)(); -#endif - /* Avoid dieing because of an invalid command. */ - handler = signal(SIGPIPE, SIG_IGN); - - print_file = popen(name, "w"); - if (!print_file) - /* XXX print error message */ - return; - DviSaveToFile(dvi, print_file); - pclose(print_file); - signal(SIGPIPE, handler); - strcpy(current_print_command, name); -} - -static void -RerasterizeAction() -{ - Arg args[1]; - int number; - - if (current_file_name[0] == 0) { - /* XXX display an error message */ - return; - } - XtSetArg (args[0], XtNpageNumber, &number); - XtGetValues (dvi, args, 1); - NewFile(current_file_name); - SetPageNumber (number); -} - -/* ARGSUSED */ - -static void -Print (entry, name, data) - Widget entry; - caddr_t name, data; -{ - PrintAction (); - ResetMenuEntry (entry); -} - -static void -PrintAction () -{ - if (current_print_command[0]) - strcpy (fileBuf, current_print_command); - else - fileBuf[0] = '\0'; - MakePrompt (toplevel, "Print command:", DoPrint, fileBuf); -} - - -/* ARGSUSED */ - -static void -OpenFile (entry, name, data) - Widget entry; - caddr_t name, data; -{ - OpenFileAction (); - ResetMenuEntry (entry); -} - -static void -OpenFileAction () -{ - if (current_file_name[0]) - strcpy (fileBuf, current_file_name); - else - fileBuf[0] = '\0'; - MakePrompt (toplevel, "File to open:", NewFile, fileBuf); -} - -/* ARGSUSED */ - -static void -Quit (entry, closure, data) - Widget entry; - caddr_t closure, data; -{ - QuitAction (); -} - -static void -QuitAction () -{ - exit (0); -} - -Widget promptShell, promptDialog; -void (*promptfunction)(); - -/* ARGSUSED */ -static -void CancelAction (widget, event, params, num_params) - Widget widget; - XEvent *event; - String *params; - Cardinal *num_params; -{ - if (promptShell) { - XtSetKeyboardFocus(toplevel, (Widget) None); - XtDestroyWidget(promptShell); - promptShell = (Widget) 0; - } -} - -static -void AcceptAction (widget, event, params, num_params) - Widget widget; - XEvent *event; - String *params; - Cardinal *num_params; -{ - (*promptfunction)(XawDialogGetValueString(promptDialog)); - CancelAction (widget, event, params, num_params); -} - -static void -MakePrompt(centerw, prompt, func, def) -Widget centerw; -char *prompt; -void (*func)(); -char *def; -{ - static Arg dialogArgs[] = { - {XtNlabel, 0}, - {XtNvalue, 0}, - }; - Arg valueArgs[1]; - Arg centerArgs[2]; - Position source_x, source_y; - Position dest_x, dest_y; - Dimension center_width, center_height; - Dimension prompt_width, prompt_height; - Widget valueWidget; - - CancelAction ((Widget)NULL, (XEvent *) 0, (String *) 0, (Cardinal *) 0); - promptShell = XtCreatePopupShell ("promptShell", transientShellWidgetClass, - toplevel, NULL, (Cardinal) 0); - dialogArgs[0].value = (XtArgVal)prompt; - dialogArgs[1].value = (XtArgVal)def; - promptDialog = XtCreateManagedWidget( "promptDialog", dialogWidgetClass, - promptShell, dialogArgs, XtNumber (dialogArgs)); - XawDialogAddButton(promptDialog, "accept", NULL, (caddr_t) 0); - XawDialogAddButton(promptDialog, "cancel", NULL, (caddr_t) 0); - valueWidget = XtNameToWidget (promptDialog, "value"); - if (valueWidget) { - XtSetArg (valueArgs[0], XtNresizable, TRUE); - XtSetValues (valueWidget, valueArgs, 1); - /* - * as resizable isn't set until just above, the - * default value will be displayed incorrectly. - * rectify the situation by resetting the values - */ - XtSetValues (promptDialog, dialogArgs, XtNumber (dialogArgs)); - } - XtSetKeyboardFocus (promptDialog, valueWidget); - XtSetKeyboardFocus (toplevel, valueWidget); - XtRealizeWidget (promptShell); - /* - * place the widget in the center of the "parent" - */ - XtSetArg (centerArgs[0], XtNwidth, ¢er_width); - XtSetArg (centerArgs[1], XtNheight, ¢er_height); - XtGetValues (centerw, centerArgs, 2); - XtSetArg (centerArgs[0], XtNwidth, &prompt_width); - XtSetArg (centerArgs[1], XtNheight, &prompt_height); - XtGetValues (promptShell, centerArgs, 2); - source_x = (center_width - prompt_width) / 2; - source_y = (center_height - prompt_height) / 3; - XtTranslateCoords (centerw, source_x, source_y, &dest_x, &dest_y); - XtSetArg (centerArgs[0], XtNx, dest_x); - XtSetArg (centerArgs[1], XtNy, dest_y); - XtSetValues (promptShell, centerArgs, 2); - XtMapWidget(promptShell); - promptfunction = func; -} - -/* For DviChar.c */ - -char *xmalloc(n) - int n; -{ - return XtMalloc(n); -} - -/* -Local Variables: -c-indent-level: 4 -c-continued-statement-offset: 4 -c-brace-offset: -4 -c-argdecl-indent: 4 -c-label-offset: -4 -c-tab-always-indent: nil -End: -*/ diff -ruN groff-1.19.1/src/xditview/XFontName.c groff-1.19.2/src/xditview/XFontName.c --- groff-1.19.1/src/xditview/XFontName.c 2003-07-02 16:44:15.000000000 +0200 +++ groff-1.19.2/src/xditview/XFontName.c 1970-01-01 01:00:00.000000000 +0100 @@ -1,257 +0,0 @@ -/* - * XFontName.c - * - * build/parse X Font name strings - */ - -#include -#include -#include "XFontName.h" -#include - -static char * -extractStringField (name, buffer, size, attrp, bit) - char *name; - char *buffer; - int size; - unsigned int *attrp; - unsigned int bit; -{ - char *buf = buffer; - - if (!*name) - return 0; - while (*name && *name != '-' && size > 0) { - *buf++ = *name++; - --size; - } - if (size <= 0) - return 0; - *buf = '\0'; - if (buffer[0] != '*' || buffer[1] != '\0') - *attrp |= bit; - if (*name == '-') - return name+1; - return name; -} - -static char * -extractUnsignedField (name, result, attrp, bit) - char *name; - unsigned int *result; - unsigned int *attrp; - unsigned int bit; -{ - char buf[256]; - char *c; - unsigned int i; - - name = extractStringField (name, buf, sizeof (buf), attrp, bit); - if (!name) - return 0; - if (!(*attrp & bit)) - return name; - i = 0; - for (c = buf; *c; c++) { - if (!isdigit (*c)) - return 0; - i = i * 10 + (*c - '0'); - } - *result = i; - return name; -} - -Bool -XParseFontName (fontNameString, fontName, fontNameAttributes) - XFontNameString fontNameString; - XFontName *fontName; - unsigned int *fontNameAttributes; -{ - char *name = fontNameString; - XFontName temp; - unsigned int attributes = 0; - -#define GetString(field,bit)\ - if (!(name = extractStringField \ - (name, temp.field, sizeof (temp.field),\ - &attributes, bit))) \ - return False; - -#define GetUnsigned(field,bit)\ - if (!(name = extractUnsignedField \ - (name, &temp.field, \ - &attributes, bit))) \ - return False; - - GetString (Registry, FontNameRegistry) - GetString (Foundry, FontNameFoundry) - GetString (FamilyName, FontNameFamilyName) - GetString (WeightName, FontNameWeightName) - GetString (Slant, FontNameSlant) - GetString (SetwidthName, FontNameSetwidthName) - GetString (AddStyleName, FontNameAddStyleName) - GetUnsigned (PixelSize, FontNamePixelSize) - GetUnsigned (PointSize, FontNamePointSize) - GetUnsigned (ResolutionX, FontNameResolutionX) - GetUnsigned (ResolutionY, FontNameResolutionY) - GetString (Spacing, FontNameSpacing) - GetUnsigned (AverageWidth, FontNameAverageWidth) - GetString (CharSetRegistry, FontNameCharSetRegistry) - if (!*name) { - temp.CharSetEncoding[0] = '\0'; - attributes |= FontNameCharSetEncoding; - } else { - GetString (CharSetEncoding, FontNameCharSetEncoding) - } - *fontName = temp; - *fontNameAttributes = attributes; - return True; -} - -static char * -utoa (u, s, size) - unsigned int u; - char *s; - int size; -{ - char *t; - - t = s + size; - *--t = '\0'; - do - *--t = (u % 10) + '0'; - while (u /= 10); - return t; -} - -Bool -XFormatFontName (fontName, fontNameAttributes, fontNameString) - XFontName *fontName; - unsigned int fontNameAttributes; - XFontNameString fontNameString; -{ - XFontNameString tmp; - char *name = tmp, *f; - int left = sizeof (tmp) - 1; - char number[32]; - -#define PutString(field, bit)\ - f = (fontNameAttributes & bit) ? \ - fontName->field \ - : "*"; \ - if ((left -= strlen (f)) < 0) \ - return False; \ - while (*f) \ - if ((*name++ = *f++) == '-') \ - return False; -#define PutHyphen()\ - if (--left < 0) \ - return False; \ - *name++ = '-'; - -#define PutUnsigned(field, bit) \ - f = (fontNameAttributes & bit) ? \ - utoa (fontName->field, number, sizeof (number)) \ - : "*"; \ - if ((left -= strlen (f)) < 0) \ - return False; \ - while (*f) \ - *name++ = *f++; - - PutString (Registry, FontNameRegistry) - PutHyphen (); - PutString (Foundry, FontNameFoundry) - PutHyphen (); - PutString (FamilyName, FontNameFamilyName) - PutHyphen (); - PutString (WeightName, FontNameWeightName) - PutHyphen (); - PutString (Slant, FontNameSlant) - PutHyphen (); - PutString (SetwidthName, FontNameSetwidthName) - PutHyphen (); - PutString (AddStyleName, FontNameAddStyleName) - PutHyphen (); - PutUnsigned (PixelSize, FontNamePixelSize) - PutHyphen (); - PutUnsigned (PointSize, FontNamePointSize) - PutHyphen (); - PutUnsigned (ResolutionX, FontNameResolutionX) - PutHyphen (); - PutUnsigned (ResolutionY, FontNameResolutionY) - PutHyphen (); - PutString (Spacing, FontNameSpacing) - PutHyphen (); - PutUnsigned (AverageWidth, FontNameAverageWidth) - PutHyphen (); - PutString (CharSetRegistry, FontNameCharSetRegistry) - PutHyphen (); - PutString (CharSetEncoding, FontNameCharSetEncoding) - *name = '\0'; - strcpy (fontNameString, tmp); - return True; -} - -Bool -XCompareFontName (name1, name2, fontNameAttributes) - XFontName *name1, *name2; - unsigned int fontNameAttributes; -{ -#define CompareString(field,bit) \ - if (fontNameAttributes & bit) \ - if (strcmp (name1->field, name2->field)) \ - return False; - -#define CompareUnsigned(field,bit) \ - if (fontNameAttributes & bit) \ - if (name1->field != name2->field) \ - return False; - - CompareString (Registry, FontNameRegistry) - CompareString (Foundry, FontNameFoundry) - CompareString (FamilyName, FontNameFamilyName) - CompareString (WeightName, FontNameWeightName) - CompareString (Slant, FontNameSlant) - CompareString (SetwidthName, FontNameSetwidthName) - CompareString (AddStyleName, FontNameAddStyleName) - CompareUnsigned (PixelSize, FontNamePixelSize) - CompareUnsigned (PointSize, FontNamePointSize) - CompareUnsigned (ResolutionX, FontNameResolutionX) - CompareUnsigned (ResolutionY, FontNameResolutionY) - CompareString (Spacing, FontNameSpacing) - CompareUnsigned (AverageWidth, FontNameAverageWidth) - CompareString (CharSetRegistry, FontNameCharSetRegistry) - CompareString (CharSetEncoding, FontNameCharSetEncoding) - return True; -} - -Bool -XCopyFontName (name1, name2, fontNameAttributes) - XFontName *name1, *name2; - unsigned int fontNameAttributes; -{ -#define CopyString(field,bit) \ - if (fontNameAttributes & bit) \ - strcpy (name2->field, name1->field); - -#define CopyUnsigned(field,bit) \ - if (fontNameAttributes & bit) \ - name2->field = name1->field; - - CopyString (Registry, FontNameRegistry) - CopyString (Foundry, FontNameFoundry) - CopyString (FamilyName, FontNameFamilyName) - CopyString (WeightName, FontNameWeightName) - CopyString (Slant, FontNameSlant) - CopyString (SetwidthName, FontNameSetwidthName) - CopyString (AddStyleName, FontNameAddStyleName) - CopyUnsigned (PixelSize, FontNamePixelSize) - CopyUnsigned (PointSize, FontNamePointSize) - CopyUnsigned (ResolutionX, FontNameResolutionX) - CopyUnsigned (ResolutionY, FontNameResolutionY) - CopyString (Spacing, FontNameSpacing) - CopyUnsigned (AverageWidth, FontNameAverageWidth) - CopyString (CharSetRegistry, FontNameCharSetRegistry) - CopyString (CharSetEncoding, FontNameCharSetEncoding) - return True; -} diff -ruN groff-1.19.1/src/xditview/XFontName.h groff-1.19.2/src/xditview/XFontName.h --- groff-1.19.1/src/xditview/XFontName.h 2000-02-06 10:38:58.000000000 +0100 +++ groff-1.19.2/src/xditview/XFontName.h 1970-01-01 01:00:00.000000000 +0100 @@ -1,45 +0,0 @@ -typedef struct _xFontName { - char Registry[256]; - char Foundry[256]; - char FamilyName[256]; - char WeightName[256]; - char Slant[3]; - char SetwidthName[256]; - char AddStyleName[256]; - unsigned int PixelSize; - unsigned int PointSize; - unsigned int ResolutionX; - unsigned int ResolutionY; - char Spacing[2]; - unsigned int AverageWidth; - char CharSetRegistry[256]; - char CharSetEncoding[256]; -} XFontName; - -#define FontNameRegistry (1<<0) -#define FontNameFoundry (1<<1) -#define FontNameFamilyName (1<<2) -#define FontNameWeightName (1<<3) -#define FontNameSlant (1<<4) -#define FontNameSetwidthName (1<<5) -#define FontNameAddStyleName (1<<6) -#define FontNamePixelSize (1<<7) -#define FontNamePointSize (1<<8) -#define FontNameResolutionX (1<<9) -#define FontNameResolutionY (1<<10) -#define FontNameSpacing (1<<11) -#define FontNameAverageWidth (1<<12) -#define FontNameCharSetRegistry (1<<13) -#define FontNameCharSetEncoding (1<<14) - -#define SlantRoman "R" -#define SlantItalic "I" -#define SlantOblique "O" -#define SlantReverseItalic "RI" -#define SlantReverseOblique "RO" - -#define SpacingMonoSpaced "M" -#define SpacingProportional "P" -#define SpacingCharacterCell "C" - -typedef char XFontNameString[256]; diff -ruN groff-1.19.1/src/xditview/xtotroff.c groff-1.19.2/src/xditview/xtotroff.c --- groff-1.19.1/src/xditview/xtotroff.c 2003-07-02 16:44:15.000000000 +0200 +++ groff-1.19.2/src/xditview/xtotroff.c 1970-01-01 01:00:00.000000000 +0100 @@ -1,321 +0,0 @@ -/* - * xtotroff - * - * convert X font metrics into troff font metrics - */ - -#include -#include -#include -#include -#include -#include -#include -#include "XFontName.h" -#include "DviChar.h" - -#ifdef X_NOT_STDC_ENV -char *malloc(); -#else -#include -#endif - -/* XFontName.c */ -extern Bool XParseFontName(); -extern Bool XFormatFontName(); - -#define charWidth(fi,c) ((fi)->per_char[(c) - (fi)->min_char_or_byte2].width) -#define charHeight(fi,c) ((fi)->per_char[(c) - (fi)->min_char_or_byte2].ascent) -#define charDepth(fi,c) ((fi)->per_char[(c) - (fi)->min_char_or_byte2].descent) -#define charLBearing(fi,c) ((fi)->per_char[(c) - (fi)->min_char_or_byte2].lbearing) -#define charRBearing(fi,c) ((fi)->per_char[(c) - (fi)->min_char_or_byte2].rbearing) - -Display *dpy; -int groff_flag = 0; -unsigned resolution = 75; -unsigned point_size = 10; - -int charExists (fi, c) - XFontStruct *fi; - int c; -{ - XCharStruct *p; - - if (c < fi->min_char_or_byte2 || c > fi->max_char_or_byte2) - return 0; - p = fi->per_char + (c - fi->min_char_or_byte2); - return (p->lbearing != 0 || p->rbearing != 0 || p->width != 0 - || p->ascent != 0 || p->descent != 0 || p->attributes != 0); -} - -/* Canonicalize the font name by replacing scalable parts by *s. */ - -static int -CanonicalizeFontName (font_name, canon_font_name) - char *font_name, *canon_font_name; -{ - unsigned int attributes; - XFontName parsed; - - if (!XParseFontName(font_name, &parsed, &attributes)) { - fprintf (stderr, "not a standard name: %s\n", font_name); - return 0; - } - - attributes &= ~(FontNamePixelSize|FontNameAverageWidth - |FontNamePointSize - |FontNameResolutionX|FontNameResolutionY); - XFormatFontName(&parsed, attributes, canon_font_name); - return 1; -} - -static int -FontNamesAmbiguous(font_name, names, count) -char *font_name; -char **names; -int count; -{ - char name1[2048], name2[2048]; - int i; - - if (count == 1) - return 0; - - for (i = 0; i < count; i++) { - if (!CanonicalizeFontName(names[i], i == 0 ? name1 : name2)) { - fprintf(stderr, "bad font name: %s\n", names[i]); - return 1; - } - if (i > 0 && strcmp(name1, name2) != 0) { - fprintf(stderr, "ambiguous font name: %s\n", font_name); - fprintf(stderr, " matches %s\n", names[0]); - fprintf(stderr, " and %s\n", names[i]); - return 1; - } - - } - return 0; -} - -static int -MapFont (font_name, troff_name) - char *font_name; - char *troff_name; -{ - XFontStruct *fi; - int count; - char **names; - FILE *out; - int c; - unsigned int attributes; - XFontName parsed; - int j, k; - DviCharNameMap *char_map; - char encoding[256]; - char *s; - int wid; - char name_string[2048]; - - if (!XParseFontName(font_name, &parsed, &attributes)) { - fprintf (stderr, "not a standard name: %s\n", font_name); - return 0; - } - - attributes &= ~(FontNamePixelSize|FontNameAverageWidth); - attributes |= FontNameResolutionX; - attributes |= FontNameResolutionY; - attributes |= FontNamePointSize; - parsed.ResolutionX = resolution; - parsed.ResolutionY = resolution; - parsed.PointSize = point_size*10; - XFormatFontName(&parsed, attributes, name_string); - - names = XListFonts (dpy, name_string, 100000, &count); - if (count < 1) { - fprintf (stderr, "bad font name: %s\n", font_name); - return 0; - } - - if (FontNamesAmbiguous(font_name, names, count)) - return 0; - - XParseFontName(names[0], &parsed, &attributes); - sprintf (encoding, "%s-%s", parsed.CharSetRegistry, - parsed.CharSetEncoding); - for (s = encoding; *s; s++) - if (isupper (*s)) - *s = tolower (*s); - char_map = DviFindMap (encoding); - if (!char_map) { - fprintf (stderr, "not a standard encoding: %s\n", encoding); - return 0; - } - - fi = XLoadQueryFont (dpy, names[0]); - if (!fi) { - fprintf (stderr, "font does not exist: %s\n", names[0]); - return 0; - } - - printf ("%s -> %s\n", names[0], troff_name); - - { /* Avoid race while opening file */ - int fd; - (void) unlink (troff_name); - fd = open (troff_name, O_WRONLY | O_CREAT | O_EXCL, 0600); - out = fdopen (fd, "w"); - } - - if (!out) { - perror (troff_name); - return 0; - } - fprintf (out, "name %s\n", troff_name); - if (!strcmp (char_map->encoding, "adobe-fontspecific")) - fprintf (out, "special\n"); - if (charExists (fi, ' ')) { - int w = charWidth (fi, ' '); - if (w > 0) - fprintf (out, "spacewidth %d\n", w); - } - fprintf (out, "charset\n"); - for (c = fi->min_char_or_byte2; c <= fi->max_char_or_byte2; c++) { - char *name = DviCharName (char_map,c,0); - if (charExists (fi, c) && (groff_flag || name)) { - - wid = charWidth (fi, c); - - fprintf (out, "%s\t%d", - name ? name : "---", - wid); - if (groff_flag) { - int param[5]; - param[0] = charHeight (fi, c); - param[1] = charDepth (fi, c); - param[2] = 0 /* charRBearing (fi, c) - wid */; - param[3] = 0 /* charLBearing (fi, c) */; - param[4] = 0; /* XXX */ - for (j = 0; j < 5; j++) - if (param[j] < 0) - param[j] = 0; - for (j = 4; j >= 0; j--) - if (param[j] != 0) - break; - for (k = 0; k <= j; k++) - fprintf (out, ",%d", param[k]); - } - fprintf (out, "\t0\t0%o\n", c); - - if (name) { - for (k = 1; DviCharName(char_map,c,k); k++) { - fprintf (out, "%s\t\"\n", - DviCharName (char_map,c,k)); - } - } - } - } - XUnloadFont (dpy, fi->fid); - fclose (out); - return 1; -} - -static void -usage(prog) - char *prog; -{ - fprintf (stderr, - "usage: %s [-g] [-r resolution] [-s pointsize] FontMap\n", - prog); - exit (1); -} - - -/* For use by DviChar.c */ - -char *xmalloc(n) -int n; -{ - char *p = malloc(n); - if (!p) { - fprintf(stderr, "Out of memory\n"); - exit(1); - } - return p; -} - -int -main (argc, argv) - char **argv; -{ - char troff_name[1024]; - char font_name[1024]; - char line[1024]; - char *a, *b, c; - int position; - FILE *map; - int opt; - extern int optind; - extern char *optarg; - - while ((opt = getopt(argc, argv, "gr:s:")) != EOF) { - switch (opt) { - case 'g': - groff_flag = 1; - break; - case 'r': - sscanf(optarg, "%u", &resolution); - break; - case 's': - sscanf(optarg, "%u", &point_size); - break; - default: - usage(argv[0]); - } - } - if (argc - optind != 1) - usage(argv[0]); - - dpy = XOpenDisplay (0); - if (!dpy) { - fprintf (stderr, "Can't connect to the X server.\n"); - fprintf (stderr, "Make sure the DISPLAY environment variable is set correctly.\n"); - exit (1); - } - position = 1; - - map = fopen (argv[optind], "r"); - if (map == NULL) { - perror (argv[optind]); - exit (1); - } - - while (fgets (line, sizeof (line), map)) { - for (a=line,b=troff_name; *a; a++,b++) { - c = (*b = *a); - if (c == ' ' || c == '\t') - break; - } - *b = '\0'; - while (*a && (*a == ' ' || *a == '\t')) - ++a; - for (b=font_name; *a; a++,b++) - if ((*b = *a) == '\n') - break; - *b = '\0'; - if (!MapFont (font_name, troff_name)) - exit (1); - ++position; - } - exit (0); -} - -/* -Local Variables: -c-indent-level: 8 -c-continued-statement-offset: 8 -c-brace-offset: -8 -c-argdecl-indent: 8 -c-label-offset: -8 -c-tab-always-indent: nil -End: -*/ diff -ruN groff-1.19.1/test-groff.in groff-1.19.2/test-groff.in --- groff-1.19.1/test-groff.in 2003-12-31 09:26:10.000000000 +0100 +++ groff-1.19.2/test-groff.in 2004-12-16 08:34:52.000000000 +0100 @@ -1,17 +1,9 @@ #! /bin/sh # This script runs groff without requiring that it be installed. -# The current directory must be the top build directory. SEP='@PATH_SEPARATOR@' -EXEEXT=@EXEEXT@ -builddir=./src -srcdir=`echo $0 | sed -e 's;/[^/]*$;;'` - -if test ! -d $builddir/roff/groff || \ - test ! -r $builddir/roff/groff/groff$EXEEXT; then - echo $0 must be run with the top build directory as the current directory 2>&1 - exit 1 -fi +builddir=@abs_top_builddir@/src +srcdir=@abs_top_srcdir@ GROFF_BIN_PATH=\ $builddir/roff/groff$SEP\ @@ -29,11 +21,9 @@ $builddir/devices/grolj4$SEP\ $builddir/devices/grolbp$SEP\ $builddir/devices/grohtml$SEP\ -$srcdir/$builddir/xditview - -test -n "$srcdir" || srcdir=. +$builddir/devices/xditview -XENVIRONMENT=`cd $srcdir; pwd`/src/xditview/GXditview.ad +XENVIRONMENT=$srcdir/src/devices/xditview/GXditview.ad export XENVIRONMENT GROFF_COMMAND_PREFIX= diff -ruN groff-1.19.1/tmac/an-old.tmac groff-1.19.2/tmac/an-old.tmac --- groff-1.19.1/tmac/an-old.tmac 2003-07-21 17:27:05.000000000 +0200 +++ groff-1.19.2/tmac/an-old.tmac 2005-09-02 00:03:45.000000000 +0200 @@ -1,6 +1,6 @@ .\" an-old.tmac .\" -.\" Copyright (C) 1989, 1990, 1991, 1992, 2001, 2002, 2003 +.\" Copyright (C) 1989, 1990, 1991, 1992, 2001, 2002, 2003, 2004, 2005 .\" Free Software Foundation, Inc. .\" Written by James Clark (jjc@jclark.com) .\" @@ -18,7 +18,7 @@ .\" .\" You should have received a copy of the GNU General Public License along .\" with groff; see the file COPYING. If not, write to the Free Software -.\" Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +.\" Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. .\" .\" -rcR=1 => Create a single, very long page instead of multiple pages. .\" Useful for online display. Default in nroff mode. @@ -38,6 +38,8 @@ . .do if d RI .nx . +.do mso devtag.tmac +. .nr _C \n(.C .cp 0 . @@ -58,10 +60,29 @@ . el .nr cR 0 .\} . +.nr need_eo_h 0 +. +.\" set up the line length... +.\" giving precedence to any prior assignment to the \n[LL] register. .if !r LL \{\ -. ie n .nr LL 78n -. el .nr LL 6.5i +. +. \" but if that isn't predefined... +. \" then try to respect any prior `.ll' request. +. nr LL \n[.l] +. +. \" For troff, this is sufficient to give us a default line length of +. \" 6.5i, but for nroff, we prefer a default of 78n to nroff's default +. \" 65n. This has the unfortunate side effect that we will override a +. \" user's `.ll 65n' request, with our preferred 78n default; we can't +. \" possibly know that the 65n came from a `.ll' request, and MUST +. \" assume that it was set by nroff, as its built-in default! If the +. \" user wants to force this setting, then he MUST use the `-rLL=65n' +. \" option, or an equivalent `.nr LL 65n' request. +. if n \ +. if (\n[LL] = 65n) \ +. nr LL 78n .\} +. .if !r LT \ . nr LT \n[LL] . @@ -85,7 +106,7 @@ .if \n[cR] \{\ . de1 ne . ie \\n[.$] \ -. nr an-ne \\$* +. nr an-ne (v;\\$*) . el \ . nr an-ne 1v . if (\\n[an-ne] >= \\n[.t]) \ @@ -107,8 +128,9 @@ .\" .TH title section extra1 extra2 extra3 .de1 TH . if \\n[an-html] \{\ -. HTML-TAG-NS ".tl" +. DEVTAG-TL \\$1 +. DEVTAG-EO-TL . \} . . de an-init \" We have to do it like this to get multiple man pages right. @@ -310,7 +332,8 @@ . fi . in \\n[an-margin]u . ti 0 -. HTML-TAG-NS ".NH \\n[an-level]" +. nr need_eo_h 1 +. DEVTAG-NH \\n[an-level] . it 1 an-trap . nr an-no-space-flag 1 . nr an-break-flag 1 @@ -373,6 +396,8 @@ .. . .de1 an-trap +. if \\n[need_eo_h]>0 .DEVTAG-EO-H +. nr need_eo_h 0 . ft R . ps \\n[PS]u . vs \\n[VS]u @@ -407,9 +432,9 @@ . ti -\\n[an-prevailing-indent]u . chop an-div . ne (1v + 1u) -. HTML-TAG-NS ".col 1" +. DEVTAG-COL 1 \\*[an-div]\\h'|\\n[an-prevailing-indent]u'\c -. HTML-TAG-NS ".col 2" +. DEVTAG-COL-NEXT 2 . \} .. . @@ -456,14 +481,15 @@ . .de1 RI . if \\n[.$] \{\ -. ds an-result \&\\$1 +. ds an-result \&\f[R]\\$1 . shift . while (\\n[.$] >= 2) \{\ . as an-result \,\f[I]\\$1\f[R]\/\\$2\\*[an-empty] . shift 2 . \} -. if \\n[.$] .as an-result \,\f[I]\\$1\f[R] +. if \\n[.$] .as an-result \,\f[I]\\$1 \\*[an-result] +. ft R . \} .. . @@ -477,6 +503,7 @@ . \} . if \\n[.$] .as an-result \/\\$1 \\*[an-result] +. ft R . \} .. . diff -ruN groff-1.19.1/tmac/devtag.tmac groff-1.19.2/tmac/devtag.tmac --- groff-1.19.1/tmac/devtag.tmac 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/tmac/devtag.tmac 2005-05-26 15:37:21.000000000 +0200 @@ -0,0 +1,131 @@ +.ig +devtag.tmac - macro package for adding tags to roff documents. + +File position: /tmac/devtag.tmac +Installed position: groff's main macro directory. + +------------------------------------------------------------------------ + Legalize +------------------------------------------------------------------------ + +This file is part of groff, the GNU roff type-setting system. + +Copyright (C) 2004 Free Software Foundation, Inc. +written by Gaius Mulley . + +groff 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. + +groff 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 groff; see the file COPYING. If not, write to the Free +Software Foundation, 51 Franklin St - Fifth Floor, Boston, MA +02110-1301, USA. + + +------------------------------------------------------------------------ + Description +------------------------------------------------------------------------ + +A simple set of macros to provide markup devices (currently only grohtml) +with tags that define the meaning of the formatted text and also +basic formatting instructions. It generalizes the tag concept used within +grohtml and in the future it is hoped that more markup based devices +can capitalize on this work. It also clearly defines those tags which are +honoured by grohtml. Note that not all tags are included here. Some +of the grohtml specific tags (header specific and jobname, etc.) are +called directly from within www.tmac. The tags defined here are +reasonably generic and could be applied to other devices. +.. +. +.do if d DEVTAG-NH .nx +. +.nr _C \n(.C +.cp 0 +. +.\" -------------------------------------------------------------------- +.\" DEVTAG +.\" +.\" Emit a tag +.\" +.de DEVTAG +. tag devtag:\\$* +.. +.\" -------------------------------------------------------------------- +.\" DEVTAG-NEXT +.\" +.\" When the troff state changes, emit tag +.\" +.de DEVTAG-NEXT +. taga devtag:\\$* +.. +. +.\" -------------------------------------------------------------------- +.\" SH +.\" NH +.\" tell device we are starting a numbered heading +.\" Takes a single parameter . 1 +.\" is the outer most level. +. +.de DEVTAG-NH +. DEVTAG ".NH \\$1" +.. +.als DEVTAG-SH DEVTAG-NH +. +.\" -------------------------------------------------------------------- +.\" COL +.\" indicate that the following text is aligned for the column +.\" n: [1..MAX(n)] +. +.de DEVTAG-COL +. DEVTAG ".col \\$1" +.. +. +.\" -------------------------------------------------------------------- +.\" EO-H +.\" indicate that a header has finished. +. +.de DEVTAG-EO-H +. DEVTAG ".eo.h" +.. +.\" -------------------------------------------------------------------- +.\" EO-TL +.\" indicate that a title has finished. +. +.de DEVTAG-EO-TL +. DEVTAG ".eo.tl" +.. +.\" -------------------------------------------------------------------- +.\" TL +.\" indicate that the following text forms a title. +. +.de DEVTAG-TL +. DEVTAG ".tl" +.. +. +.\" -------------------------------------------------------------------- +.\" COL-NEXT +.\" emit a column tag just before the next glyph. +. +.de DEVTAG-COL-NEXT +. DEVTAG-NEXT ".col \\$1" +.. +. +. +.cp \n[_C] +. +. +.\" -------------------------------------------------------------------- +.\" Emacs settings +.\" -------------------------------------------------------------------- +. +.\" Local Variables: +.\" mode: nroff +.\" End: +.\" EOF diff -ruN groff-1.19.1/tmac/doc-common groff-1.19.2/tmac/doc-common --- groff-1.19.1/tmac/doc-common 2004-04-15 17:09:22.000000000 +0200 +++ groff-1.19.2/tmac/doc-common 2005-03-18 08:53:17.000000000 +0100 @@ -9,10 +9,8 @@ .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. +.\" 3. [Deleted. See +.\" ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change] .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. @@ -434,6 +432,8 @@ .ds doc-operating-system-NetBSD-1.6.1 1.6.1 .ds doc-operating-system-NetBSD-1.6.2 1.6.2 .ds doc-operating-system-NetBSD-2.0 2.0 +.ds doc-operating-system-NetBSD-2.0.1 2.0.1 +.ds doc-operating-system-NetBSD-2.0.2 2.0.2 .ds doc-operating-system-NetBSD-2.1 2.1 . .ds doc-operating-system-FreeBSD-1.0 1.0 @@ -551,10 +551,6 @@ .ds doc-date-12 December . .de Dd -. \" XXX: why do we need gX? -. if "\*[doc-date-string]"" \ -. nr gX 1 -. . ie \n[.$] \{\ . ie (\n[.$] == 3) \ . ds doc-date-string \$1\~\$2 \$3 diff -ruN groff-1.19.1/tmac/doc-ditroff groff-1.19.2/tmac/doc-ditroff --- groff-1.19.1/tmac/doc-ditroff 2003-05-02 20:24:43.000000000 +0200 +++ groff-1.19.2/tmac/doc-ditroff 2005-02-04 01:06:11.000000000 +0100 @@ -9,10 +9,8 @@ .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. +.\" 3. [Deleted. See +.\" ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change] .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. @@ -180,8 +178,6 @@ .ds Ba \f[R]|\f[] .ds Am & . -.nr gX 0 -. . .\" NS doc-header-string global string .\" NS the final string used for the manual page header @@ -203,12 +199,8 @@ . wh 0 doc-header . wh -1.25i doc-footer . -. if \n[gX] \ -. ds doc-command-name -. . br . -. nr gX 0 . e@ doc-end-macro .. . diff -ruN groff-1.19.1/tmac/doc-nroff groff-1.19.2/tmac/doc-nroff --- groff-1.19.1/tmac/doc-nroff 2003-05-02 20:25:06.000000000 +0200 +++ groff-1.19.2/tmac/doc-nroff 2005-02-04 01:06:11.000000000 +0100 @@ -9,10 +9,8 @@ .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. +.\" 3. [Deleted. See +.\" ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change] .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. diff -ruN groff-1.19.1/tmac/doc-old.tmac groff-1.19.2/tmac/doc-old.tmac --- groff-1.19.1/tmac/doc-old.tmac 2000-10-26 16:15:16.000000000 +0200 +++ groff-1.19.2/tmac/doc-old.tmac 2005-02-04 01:06:10.000000000 +0100 @@ -10,10 +10,8 @@ .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. +.\" 3. [Deleted. See +.\" ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change] .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. diff -ruN groff-1.19.1/tmac/doc-syms groff-1.19.2/tmac/doc-syms --- groff-1.19.1/tmac/doc-syms 2004-05-12 00:02:37.000000000 +0200 +++ groff-1.19.2/tmac/doc-syms 2005-02-04 01:06:11.000000000 +0100 @@ -9,10 +9,8 @@ .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. +.\" 3. [Deleted. See +.\" ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change] .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. @@ -567,6 +565,8 @@ .as doc-str-St--p1003.1g-2000 " (\*[Lq]\)\*[Px]\*[doc-str-St].1\*[Rq]) .ds doc-str-St--p1003.1-2001 \*[doc-Tn-font-size]\%IEEE\*[doc-str-St] Std 1003.1-2001 .as doc-str-St--p1003.1-2001 " (\*[Lq]\)\*[Px]\*[doc-str-St].1\*[Rq]) +.ds doc-str-St--p1003.1-2004 \*[doc-Tn-font-size]\%IEEE\*[doc-str-St] Std 1003.1-2004 +.as doc-str-St--p1003.1-2004 " (\*[Lq]\)\*[Px]\*[doc-str-St].1\*[Rq]) . .\" POSIX Part 2: Shell and Utilities .ds doc-str-St--p1003.2 \*[doc-Tn-font-size]\%IEEE\*[doc-str-St] Std 1003.2 @@ -695,6 +695,7 @@ .ds doc-str-Lb-libmagic Magic Number Recognition Library (libmagic, \-lmagic) .ds doc-str-Lb-libmenu Curses Menu Library (libmenu, \-lmenu) .ds doc-str-Lb-libossaudio OSS Audio Emulation Library (libossaudio, \-lossaudio) +.ds doc-str-Lb-libpam Pluggable Authentication Module Library (libpam, \-lpam) .ds doc-str-Lb-libpcap Packet Capture Library (libpcap, \-lpcap) .ds doc-str-Lb-libpci PCI Bus Access Library (libpci, \-lpci) .ds doc-str-Lb-libpmc Performance Counters Library (libpmc, \-lpmc) diff -ruN groff-1.19.1/tmac/doc.tmac groff-1.19.2/tmac/doc.tmac --- groff-1.19.1/tmac/doc.tmac 2003-09-16 08:42:31.000000000 +0200 +++ groff-1.19.2/tmac/doc.tmac 2005-02-04 01:06:10.000000000 +0100 @@ -9,10 +9,8 @@ .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. +.\" 3. [Deleted. See +.\" ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change] .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. @@ -2179,10 +2177,21 @@ . doc-parse-args \$@ . \} . el \{\ -. ie \n[doc-space-mode] \ +. ie \n[doc-space-mode] \{\ +. ds doc-saved-space "\*[doc-space] +. ds doc-space . nr doc-space-mode 0 -. el \ +. \} +. el \{\ +. ds doc-space "\*[doc-saved-space] . nr doc-space-mode 1 +. +. \" finish line only if it is interrupted and `doc-have-space' +. \" isn't set +. if \n[doc-reg-Sm] \ +. if \n[.int] \ +. nop \) +. \} . \}\} . . if !\n[doc-arg-limit] \ @@ -2207,10 +2216,15 @@ . el \{\ . \" no argument for Sm . nr doc-arg-ptr -1 -. ie \n[doc-space-mode] \ +. ie \n[doc-space-mode] \{\ +. ds doc-saved-space "\*[doc-space] +. ds doc-space . nr doc-space-mode 0 -. el \ +. \} +. el \{\ +. ds doc-space "\*[doc-saved-space] . nr doc-space-mode 1 +. \} . \}\} . . ie \n[doc-space-mode] \{\ @@ -2237,18 +2251,13 @@ . \} . . \" do we have parameters to print? -. ie (\n[doc-arg-limit] <= \n[doc-arg-ptr]) \{\ -. \" ignore `.Sm on' and `.Sm off' without additional parameters -. ie (\n[doc-arg-ptr] > 1) \ -. doc-print-and-reset -. el \ -. doc-reset-args -. \} -. el \{\ +. ie (\n[doc-arg-limit] > \n[doc-arg-ptr]) \{\ . \" skip `Sm' argument . nr doc-arg-ptr +1 . doc-print-recursive . \} +. el \ +. doc-reset-args .. . . @@ -2501,7 +2510,9 @@ . nop \)\s[\n[doc-fontmode-size-stack\n[doc-fontmode-depth]]u]\c . . nr doc-fontmode-font-stack\n[doc-fontmode-depth] 0 +. nr doc-curr-font \n[.f] . nr doc-fontmode-size-stack\n[doc-fontmode-depth] 0 +. nr doc-curr-size \n[.ps] . nr doc-fontmode-depth -1 . \} . el \ @@ -5144,6 +5155,10 @@ . ie \n[.$] \ . tm Usage: .Re (does not take arguments) (#\n[.c]) . el \{\ +. if !\n[doc-is-reference] \{\ +. tm mdoc warning: Extraneous .Re (#\n[.c]) +. return +. \} . doc-print-reference . doc-reset-reference . nr doc-is-reference 0 @@ -5222,7 +5237,7 @@ .\" NS doc-reference-count . .de doc-finish-reference -. nr doc-reference-count -1 +. nr doc-reference-count -\$1 . ie \n[doc-reference-count] \ . nop \), . el \ @@ -5252,81 +5267,81 @@ . chop doc-reference-title-name-for-book . ie ((\n[doc-journal-count] == 1) : (\n[doc-book-count] == 1)) \{\ . nop \)\*[q]\)\*[doc-reference-title-name-for-book]\)\*[q]\c -. doc-finish-reference +. doc-finish-reference \n[doc-reference-title-count] . \} . el \{\ . nop \*[doc-reference-title-name]\c -. doc-finish-reference +. doc-finish-reference \n[doc-reference-title-count] . \}\} . . if \n[doc-book-count] \{\ . unformat doc-book-name . chop doc-book-name . nop \*[doc-book-name]\c -. doc-finish-reference +. doc-finish-reference \n[doc-book-count] . \} . . if \n[doc-publisher-count] \{\ . unformat doc-publisher-name . chop doc-publisher-name . nop \*[doc-publisher-name]\c -. doc-finish-reference +. doc-finish-reference \n[doc-publisher-count] . \} . . if \n[doc-journal-count] \{\ . unformat doc-journal-name . chop doc-journal-name . nop \*[doc-journal-name]\c -. doc-finish-reference +. doc-finish-reference \n[doc-journal-count] . \} . . if \n[doc-report-count] \{\ . unformat doc-report-name . chop doc-report-name . nop \*[doc-report-name]\c -. doc-finish-reference +. doc-finish-reference \n[doc-report-count] . \} . . if \n[doc-issue-count] \{\ . unformat doc-issue-name . chop doc-issue-name . nop \*[doc-issue-name]\c -. doc-finish-reference +. doc-finish-reference \n[doc-issue-count] . \} . . if \n[doc-volume-count] \{\ . unformat doc-volume-name . chop doc-volume-name . nop \*[doc-volume-name]\c -. doc-finish-reference +. doc-finish-reference \n[doc-volume-count] . \} . . if \n[doc-page-number-count] \{\ . unformat doc-page-number-string . chop doc-page-number-string . nop \*[doc-page-number-string]\c -. doc-finish-reference +. doc-finish-reference \n[doc-page-number-count] . \} . . if \n[doc-corporate-count] \{\ . unformat doc-corporate-name . chop doc-corporate-name . nop \*[doc-corporate-name]\c -. doc-finish-reference +. doc-finish-reference \n[doc-corporate-count] . \} . . if \n[doc-date-count] \{\ . unformat doc-date . chop doc-date . nop \*[doc-date]\c -. doc-finish-reference +. doc-finish-reference \n[doc-date-count] . \} . . if \n[doc-optional-count] \{\ . unformat doc-optional-string . chop doc-optional-string . nop \*[doc-optional-string]\c -. doc-finish-reference +. doc-finish-reference \n[doc-optional-count] . \} . . if \n[doc-reference-count] \ @@ -6156,7 +6171,7 @@ . \}\}\} . el \{\ . tm1 "Usage: .An {-nosplit | -split} -. tm1 .An author_name ... (#\n[.c]) +. tm1 " .An author_name ... (#\n[.c]) . \}\} . . if \n[doc-in-authors-section] \{\ diff -ruN groff-1.19.1/tmac/groff_man.man groff-1.19.2/tmac/groff_man.man --- groff-1.19.1/tmac/groff_man.man 2003-03-12 07:23:54.000000000 +0100 +++ groff-1.19.2/tmac/groff_man.man 2005-09-02 00:06:31.000000000 +0200 @@ -1,9 +1,10 @@ .ig -Copyright (C) 1999-2000, 2001, 2002, 2003 Free Software Foundation, Inc. +Copyright (C) 1999-2000, 2001, 2002, 2003, 2004, 2005 +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. +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 @@ -63,9 +64,12 @@ . The .B man -macros used to generate man pages with +macros used to generate +.I \%man\~pages +with .I groff were written by James Clark. +. This document provides a brief summary of the use of each macro in that package. . @@ -76,13 +80,14 @@ . The .B man -macros understand the following command line options (which define various -registers). +macros understand the following command line options (which define +various registers). . .TP .B \-rcR=1 -This option (the default if in nroff mode) will create a single, very long -page instead of multiple pages. +This option (the default if in nroff mode) will create a single, very +long page instead of multiple pages. +. Say .B \-rcR=0 to disable it. @@ -95,12 +100,14 @@ .TP .B \-rD1 Double-sided printing. +. Footers for even and odd pages are formatted differently. . .TP .BI \-rFT= dist -Set distance of the footer relative to the bottom of the page if negative -or relative to the top if positive. +Set distance of the footer relative to the bottom of the page if +negative or relative to the top if positive. +. The default is -0.5i. . .TP @@ -130,13 +137,47 @@ .TP .BI \-rLL= line-length Set line length. -If this option is not given, the line length defaults to 78n in nroff mode -and 6.5i in troff mode. +. +If this option is not given, +the line length is set to respect any value set by a prior `.ll' request, +(which +.I must +be in effect when the `.TH' macro is invoked), +if this differs from the built\-in default for the formatter; +otherwise it defaults to 78n in +.I nroff +mode and 6.5i in +.I troff +mode. +. +.IP +Note that the use of a `.ll' request to initialize the line length +is supported for backward compatibility with some versions of the +.B man +program; +direct initialization of the `LL' register should +.I always +be preferred to the use of such a request. +In particular, note that a `.ll\ 65n' request will +.I not +preserve the normal +.I nroff +default line length, +(the +.B man +default initialization to 78n will prevail), +whereas, +the `-rLL=65n' option, or an equivalent `.nr\ LL\ 65n' +request preceding the use of the `TH' macro, +.I will +set a line length of 65n. . .TP .BI \-rLT= title-length Set title length. -If this option is not given, the title length defaults to the line length. +. +If this option is not given, the title length defaults to the line +length. . .TP .BI \-rP nnn @@ -167,8 +208,9 @@ .IR nnn b, .IR nnn c, etc. -For example, the option `\-rX2' will produce the following page numbers: -1, 2, 2a, 2b, 2c, etc. +. +For example, the option `\-rX2' will produce the following page +numbers: 1, 2, 2a, 2b, 2c, etc. . . .\" ----------------------------------------------------------------- @@ -176,23 +218,29 @@ .SH USAGE . This section describes the available macros for manual pages. -For further customization, put additional macros and requests into the file +. +For further customization, put additional macros and requests into the +file .B man.local which will be loaded immediately after the .B man package. . .TP -.BI .TH " title section " [ extra1 "] [" extra2 "] [" extra3 ] -Set the title of the man page to +.BI .TH " title section \fB[\fPextra1\fB]\fP \fB[\fPextra2\fB]\fP \fB[\fPextra3\fB]" +Set the title of the +.I \man\~page +to .I title and the section to .IR section , which must take on a value between 1 and\ 8. +. The value .I section may also have a string appended, e.g. `.pm', to indicate a specific -subsection of the man pages. +subsection of the +.IR \%man\~pages . Both .I title and @@ -214,50 +262,58 @@ For HTML output, headers and footers are completely supressed. . .IP -Additionally, this macro starts a new page; the new line number is\ 1 again -(except if the `-rC1' option is given on the command line) -- this feature -is intended only for formatting multiple man pages; a single man page should -contain exactly one +Additionally, this macro starts a new page; the new line number is\ 1 +again (except if the `-rC1' option is given on the command line) -- +this feature is intended only for formatting multiple +.IR \%man\~pages ; +a single +.I \%man\~page +should contain exactly one .B TH macro at the beginning of the file. . .TP .BI ".SH [" "text for a heading" ] Set up an unnumbered section heading sticking out to the left. +. Prints out all the text following .B SH -up to the end of the line (or the text in the next input line if there is -no argument to +up to the end of the line (or the text in the next input line if there +is no argument to .BR SH ) in bold face (or the font specified by the string .BR HF ), one size larger than the base document size. -Additionally, the left margin and the indentation for the following text -is reset to the default values. +. +Additionally, the left margin and the indentation for the following +text is reset to the default values. . .TP .BI ".SS [" "text for a heading" ] Set up a secondary, unnumbered section heading. +. Prints out all the text following .B SS -up to the end of the line (or the text in the next input line if there is -no argument to +up to the end of the line (or the text in the next input line if there +is no argument to .BR SS ) in bold face (or the font specified by the string .BR HF ), at the same size as the base document size. -Additionally, the left margin and the indentation for the following text -is reset to the default values. +. +Additionally, the left margin and the indentation for the following +text is reset to the default values. . .TP .BI ".TP [" nnn ] Set up an indented paragraph with label. +. The indentation is set to .I nnn -if that argument is supplied (the default unit is `n' if omitted), otherwise -it is set to the previous indentation value specified with +if that argument is supplied (the default unit is `n' if omitted), +otherwise it is set to the previous indentation value specified with .BR TP , .BR IP , or @@ -265,18 +321,22 @@ (or to the default value if none of them have been used yet). . .IP -The first input line of text following this macro is interpreted as a string -to be printed flush-left, as it is appropriate for a label. -It is not interpreted as part of a paragraph, so there is no attempt to fill -the first line with text from the following input lines. +The first input line of text following this macro is interpreted as a +string to be printed flush-left, as it is appropriate for a label. +. +It is not interpreted as part of a paragraph, so there is no attempt +to fill the first line with text from the following input lines. +. Nevertheless, if the label is not as wide as the indentation the paragraph starts at the same line (but indented), continuing on the following lines. +. If the label is wider than the indentation the descriptive part of the paragraph begins on the line following the label, entirely indented. -Note that neither font shape nor font size of the label is set to a default -value; on the other hand, the rest of the text will have default font -settings. +. +Note that neither font shape nor font size of the label is set to a +default value; on the other hand, the rest of the text will have +default font settings. . .IP The @@ -290,11 +350,15 @@ .TQ .B .P These macros are mutual aliases. +. Any of them causes a line break at the current position, followed by a vertical space downwards by the amount specified by the .B PD macro. -The font size and shape are reset to the default value (10pt resp. Roman). +. +The font size and shape are reset to the default value (10pt +resp. Roman). +. Finally, the current left margin and the indentation are restored. . .TP @@ -302,25 +366,29 @@ Set up an indented paragraph, using .I designator as a tag to mark its beginning. +. The indentation is set to .I nnn -if that argument is supplied (the default unit is `n' if omitted), otherwise -it is set to the previous indentation value specified with +if that argument is supplied (the default unit is `n' if omitted), +otherwise it is set to the previous indentation value specified with .BR TP , .BR IP , or .B HP (or to the default value if none of them have been used yet). -Font size and face of the paragraph (but not the designator) are reset to -its default values. +. +Font size and face of the paragraph (but not the designator) are reset +to its default values. . .IP -To start an indented paragraph with a particular indentation but without a -designator, use `""' (two doublequotes) as the second argument. +To start an indented paragraph with a particular indentation but +without a designator, use `""' (two doublequotes) as the second +argument. . .IP -For example, the following paragraphs were all set up with bullets as the -designator, using `.IP\ \\(bu\ 4'. +For example, the following paragraphs were all set up with bullets as +the designator, using `.IP\ \\(bu\ 4'. +. The whole block has been enclosed with `.RS' and `.RE' to set the left margin temporarily to the current indentation value. . @@ -333,50 +401,61 @@ .IP \(bu 4 .B HP is another. +. This macro produces a paragraph with a left hanging indentation. .IP \(bu 4 .B TP is another. -This macro produces an unindented label followed by an indented paragraph. +. +This macro produces an unindented label followed by an indented +paragraph. .RE . .TP .BI ".HP [" nnn ] Set up a paragraph with hanging left indentation. +. The indentation is set to .I nnn -if that argument is supplied (the default unit is `n' if omitted), otherwise -it is set to the previous indentation value specified with +if that argument is supplied (the default unit is `n' if omitted), +otherwise it is set to the previous indentation value specified with .BR TP , .BR IP , or .B HP (or to the default value if none of them have been used yet). +. Font size and face are reset to its default values. -The following paragraph illustrates the effect of this macro with hanging -indentation set to\ 4 (enclosed by `.RS' and `.RE' to set the left margin temporarily to -the current indentation): +. +The following paragraph illustrates the effect of this macro with +hanging indentation set to\ 4 (enclosed by +.B .RS +and +.B .RE +to set the left margin temporarily to the current indentation): . .RS .HP 4 This is a paragraph following an invocation of the .B HP macro. -As you can see, it produces a paragraph where all lines but the first are -indented. +. +As you can see, it produces a paragraph where all lines but the first +are indented. .RE . .TP .BI ".RS [" nnn ] This macro moves the left margin to the right by the value .I nnn -if specified (default unit is `n'); otherwise it is set to the previous -indentation value specified with +if specified (default unit is `n'); otherwise it is set to the +previous indentation value specified with .BR TP , .BR IP , or .B HP (or to the default value if none of them have been used yet). +. The indentation value is then set to the default. . .IP @@ -389,7 +468,9 @@ This macro moves the left margin back to level .IR nnn , restoring the previous left margin. +. If no argument is given, it moves one level back. +. The first level (i.e., no call to .B RS yet) has number\ 1, and each call to @@ -397,8 +478,8 @@ increases the level by\ 1. . .PP -To summarize, the following macros cause a line break with the insertion of -vertical space (which amount can be changed with the +To summarize, the following macros cause a line break with the +insertion of vertical space (which amount can be changed with the .B PD macro): .BR SH , @@ -435,8 +516,11 @@ . .TP .BI ".BI " text -Causes text on the same line to appear alternately in bold face and italic. +Causes text on the same line to appear alternately in bold face and +italic. +. The text must be on the same line as the macro call. +. Thus .RS .IP @@ -449,26 +533,35 @@ .TP .BI ".IB " text Causes text to appear alternately in italic and bold face. +. The text must be on the same line as the macro call. . .TP .BI ".RI " text -Causes text on the same line to appear alternately in roman and italic. +Causes text on the same line to appear alternately in roman and +italic. +. The text must be on the same line as the macro call. . .TP .BI ".IR " text -Causes text on the same line to appear alternately in italic and roman. +Causes text on the same line to appear alternately in italic and +roman. +. The text must be on the same line as the macro call. . .TP .BI ".BR " text -Causes text on the same line to appear alternately in bold face and roman. +Causes text on the same line to appear alternately in bold face and +roman. +. The text must be on the same line as the macro call. . .TP .BI ".RB " text -Causes text on the same line to appear alternately in roman and bold face. +Causes text on the same line to appear alternately in roman and bold +face. +. The text must be on the same line as the macro call. . .TP @@ -476,6 +569,7 @@ Causes .I text to appear in bold face. +. If no text is present on the line where the macro is called the text of the next input line appears in bold face. . @@ -484,6 +578,7 @@ Causes .I text to appear in italic. +. If no text is present on the line where the macro is called the text of the next input line appears in italic. . @@ -492,13 +587,15 @@ . .SH "MISCELLANEOUS" . -The default indentation is 7.2n in troff mode and 7n in nroff mode except for +The default indentation is 7.2n in troff mode and 7n in nroff mode +except for .B grohtml which ignores indentation. . .TP .B .DT Set tabs every 0.5 inches. +. Since this macro is always called during a .B TH request, it makes sense to call it only if the tab positions have been @@ -507,9 +604,11 @@ .TP .BI ".PD [" nnn ] Adjust the empty space before a new paragraph or section. +. The optional argument gives the amount of space (default unit is `v'); without parameter, the value is reset to its default value (1\ line in nroff mode, 0.4v\ otherwise). +. This affects the macros .BR SH , .BR SS , @@ -525,24 +624,34 @@ . .TP .BI ".AT [" system " [" release ]] -Alter the footer for use with AT&T manpages. +Alter the footer for use with \f[CR]AT&T\f[] +.IR \%man\~pages . This command exists only for compatibility; don't use it. -See the groff info manual for more. +. +See the +.I groff +info manual for more. . .TP .BI ".UC [" version ] -Alter the footer for use with BSD manpages. +Alter the footer for use with \f[CR]BSD\f[] +.IR \%man\~pages . This command exists only for compatibility; don't use it. -See the groff info manual for more. +. +See the +.I groff +info manual for more. . .TP .B ".PT" Print the header string. +. Redefine this macro to get control of the header. . .TP .B ".BT" Print the footer string. +. Redefine this macro to get control of the footer. . .PP @@ -564,11 +673,13 @@ .TQ .B \e*(rq Left and right quote. +. This is equal to `\e(lq' and `\e(rq', respectively. . .TP .B \e*(HF The typeface used to print headings and subheadings. +. The default is `B'. . .PP @@ -576,8 +687,9 @@ .B @g@tbl or .B @g@eqn -is needed, it has become usage to make the first line of the man page look -like this: +is needed, it has become usage to make the first line of the +.I \%man\~page +look like this: .PP .RS .BI .\e"\ word @@ -636,22 +748,27 @@ macros with individual .I groff requests where necessary. -See the groff info pages for a complete reference of all requests. +. +See the +.I groff +info pages for a complete reference of all requests. . .PP .BR @g@tbl (@MAN1EXT@), .BR @g@eqn (@MAN1EXT@), .BR @g@refer (@MAN1EXT@), -.BR man (1) +.BR man (1), +.BR man (7), . . .\" ----------------------------------------------------------------- . .SH AUTHOR . -This manual page was originally written for the Debian GNU/Linux system by -Susan G. Kleinmann , corrected and updated by Werner Lemberg -, and is now part of the GNU troff distribution. +This manual page was originally written for the Debian GNU/Linux +system by Susan G. Kleinmann , corrected and updated +by Werner Lemberg , and is now part of the GNU troff +distribution. . .\" Local Variables: .\" mode: nroff diff -ruN groff-1.19.1/tmac/groff_mdoc.man groff-1.19.2/tmac/groff_mdoc.man --- groff-1.19.1/tmac/groff_mdoc.man 2004-05-12 00:10:17.000000000 +0200 +++ groff-1.19.2/tmac/groff_mdoc.man 2005-08-29 14:01:40.000000000 +0200 @@ -19,10 +19,8 @@ .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. +.\" 3. [Deleted. See +.\" ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change] .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. @@ -46,7 +44,7 @@ .\" for an already extremely slow package. .\" . -.Dd May 10, 2004 +.Dd August 28, 2005 .Os .Dt GROFF_MDOC 7 . @@ -865,7 +863,7 @@ .It NetBSD 0.8, 0.8a, 0.9, 0.9a, 1.0, 1.0a, 1.1, 1.2, 1.2a, 1.2b, 1.2c, 1.2d, 1.2e, 1.3, 1.3a, 1.4, 1.4.1, 1.4.2, 1.4.3, 1.5, 1.5.1, 1.5.2, 1.5.3, 1.6, 1.6.1, -1.6.2, 2.0, 2.1 +1.6.2, 2.0, 2.0.1, 2.0.2, 2.1 .It FreeBSD 1.0, 1.1, 1.1.5, 1.1.5.1, 2.0, 2.0.5, 2.1, 2.1.5, 2.1.6, 2.1.7, 2.2, 2.2.1, 2.2.2, 2.2.5, 2.2.6, 2.2.7, 2.2.8, 3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 4.0, 4.1, @@ -917,7 +915,10 @@ .Pp .Dl .Dd January 25, 2001 .Pp -Otherwise, the current date is used, ignoring the parameters. +The month's name shall not be abbreviated. +.Pp +With any other number of arguments, the current date is used, ignoring +the parameters. .Pp This macro is neither callable nor parsed. .El @@ -1677,8 +1678,6 @@ .Lb libcurses .It Li libedit .Lb libedit -.It Li libedit -.Lb libedit .It Li libevent .Lb libevent .It Li libform @@ -1701,6 +1700,8 @@ .Lb libmenu .It Li libossaudio .Lb libossaudio +.It Li libpam +.Lb libpam .It Li libpcap .Lb libpcap .It Li libpci @@ -1851,7 +1852,7 @@ .It Li ".Op word1 word2" .Op word1 word2 .It Li ".Li .Op Oo Ao option Ac Oc ..." -.Li .Op Oo Ao options Ac Oc ... +.Li .Op Oo Ao option Ac Oc ... .El .Pp Here a typical example of the @@ -1964,6 +1965,8 @@ .St -p1003.1i-95 .It Li -p1003.1-2001 .St -p1003.1-2001 +.It Li -p1003.1-2004 +.St -p1003.1-2004 .El .Pp . @@ -2898,10 +2901,13 @@ . .It Li ".Sh AUTHORS" Credits should be placed here. -The +Use the .Ql .An -macro should be used to specify the name(s) of the person(s). -. +macro for names and the +.Ql .Aq +macro for e-mail addresses within optional contact information. +Explicitly indicate whether the person authored the initial manual page +or the software or whatever the person is being credited for. .It Li ".Sh BUGS" Blatant problems with the topic go here. .El diff -ruN groff-1.19.1/tmac/groff_ms.man groff-1.19.2/tmac/groff_ms.man --- groff-1.19.1/tmac/groff_ms.man 2003-07-18 09:45:10.000000000 +0200 +++ groff-1.19.2/tmac/groff_ms.man 2005-09-04 11:42:29.000000000 +0200 @@ -1,6 +1,7 @@ '\" t .ig -Copyright (C) 1989-1995, 2001, 2002, 2003 Free Software Foundation, Inc. +Copyright (C) 1989-1995, 2001, 2002, 2003, 2004, 2005 + Free Software Foundation, Inc. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice @@ -22,9 +23,17 @@ .cp 0 . .TH GROFF_MS @MAN7EXT@ "@MDATE@" "Groff Version @VERSION@" +. +. +. .SH NAME +. groff_ms \- groff ms macros +. +. +. .SH SYNOPSIS +. .B groff .B \-ms [ @@ -42,8 +51,11 @@ [ .IR files .\|.\|.\& ] -.\" ----- +. +. +. .SH DESCRIPTION +. This manual page describes the GNU version of the .I ms macros, @@ -64,8 +76,11 @@ .I ms macros are suitable for reports, letters, books, and technical documentation. -.\" ----- +. +. +. .SH USAGE +. The .I ms macro package expects files to have @@ -74,6 +89,7 @@ and consist of text separated by paragraph macros or even blank lines. Longer documents have a structure as follows: +. .TP .B "Document type" If you use the @@ -88,6 +104,7 @@ are specific to AT&T or Berkeley, and are not supported in .IR "groff ms" . +. .TP .B "Format and layout" By setting number registers, @@ -96,6 +113,7 @@ See .I "Document control registers" below for more details. +. .TP .B "Cover page" A cover page consists of a title, @@ -104,18 +122,22 @@ See .I "Cover page macros" below for more details. +. .TP .B "Body" Following the cover page is your document. It consists of paragraphs, headings, and lists. +. .TP .B "Table of contents" Longer documents usually include a table of contents, which you can add by placing the .B TC macro at the end of your document. -.\" ----- +. +. .SS "Document control registers" +. The following table lists the document control number registers. For the sake of consistency, @@ -123,8 +145,9 @@ or just after the .B RP macro. +. .LP -.ne 9 +.ne 12 .B Margin settings .RS .na @@ -153,8 +176,9 @@ _ .TE .RE +. .LP -.ne 7 +.ne 12 .B Text settings .RS .TS @@ -168,11 +192,22 @@ VS T{ Line spacing (leading) T} next para. 12p +PSINCR T{ +Point size increment +for section headings of +increasing importance +T} next heading 1p +GROWPS T{ +Heading level +beyond which PSINCR +is ignored +T} next heading 0 _ .TE .RE +. .LP -.ne 7 +.ne 11 .B Paragraph settings .RS .TS @@ -189,9 +224,18 @@ QI T{ Quoted paragraph indent T} next para. 5n +PORPHANS T{ +Number of initial lines +to be kept together +T} next para. 1 +HORPHANS T{ +Number of initial lines +to be kept with heading +T} next heading 1 _ .TE .RE +. .LP .ne 7 .B Footnote settings @@ -210,6 +254,7 @@ _ .TE .RE +. .LP .ne 6 .B Other settings @@ -226,12 +271,15 @@ .TE .ad .RE -.\" ----- +. +. .SS "Cover page macros" +. Use the following macros to create a cover page for your document in the order shown. +. .TP -.B \&.RP [no] +.B .RP [no] Specifies the report format for your document. The report format creates a separate cover page. With no @@ -240,6 +288,7 @@ .I groff prints a subset of the cover page on page\~1 of your document. +. .IP If you use the optional .B no @@ -249,45 +298,52 @@ does not repeat any of the title page information (title, author, abstract, etc.\&) on page\~1 of the document. +. .TP -.B \&.P1 +.B .P1 (P-one) Prints the header on page\~1. The default is to suppress the header. +. .TP -.BI "\&.DA [" xxx ] +.BI ".DA [" xxx ] (optional) Print the current date, or the arguments to the macro if any, on the title page (if specified) and in the footers. This is the default for .IR nroff . +. .TP -.BI "\&.ND [" xxx ] +.BI ".ND [" xxx ] (optional) Print the current date, or the arguments to the macro if any, on the title page (if specified) but not in the footers. This is the default for .IR troff . +. .TP -.B \&.TL +.B .TL Specifies the document title. .I Groff collects text following the .B TL macro into the title, until reaching the author name or abstract. +. .TP -.B \&.AU +.B .AU Specifies the author's name. You can specify multiple authors by using an .B AU macro for each author. +. .TP -.B \&.AI +.B .AI Specifies the author's institution. You can specify multiple institutions. +. .TP -.B \&.AB [no] +.B .AB [no] Begins the abstract. The default is to print the word .BR ABSTRACT , @@ -295,17 +351,21 @@ The option .B no suppresses this heading. +. .TP -.B \&.AE +.B .AE End the abstract. -.\" ----- +. +. .SS Paragraphs +. Use the .B PP macro to create indented paragraphs, and the .B LP macro to create paragraphs with no initial indent. +. .PP The .B QP @@ -315,6 +375,7 @@ element. The next paragraph or heading returns margins to normal. +. .PP The .B XP @@ -324,18 +385,68 @@ and subsequent lines are indented (the opposite of .BR PP ). +. +.PP +For each of the above paragraph types, +and also for any list entry introduced by the +.B IP +macro +(described later), +the document control register +.BR PORPHANS , +sets the +.I minimum +number of lines which must be printed, +after the start of the paragraph, +and before any page break occurs. +If there is insufficient space remaining on the current page +to accommodate this number of lines, +then a page break is forced +.I before +the first line of the paragraph is printed. +. +.PP +Similarly, +when a section heading +(see subsection +.I Headings +below) +preceeds any of these paragraph types, +the +.B HORPHANS +document control register specifies the +.I minimum +number of lines of the paragraph +which must be kept on the same page as the heading. +If insufficient space remains on the current page +to accommodate the heading and this number of lines of paragraph text, +then a page break is forced +.I before +the heading is printed. +. +. .SS Headings +. Use headings to create a hierarchical structure for your document. -The +By default, +the .I ms macros print headings in .B bold using the same font family and point size as the body text. +For output devices which support scalable fonts, +this behaviour may be modified, +by defining the document control registers, +.B GROWPS +and +.BR PSINCR . +. .PP The following heading macros are available: +. .TP -.BI \&.NH \0xx +.BI .NH\ xx Numbered heading. The argument .I xx @@ -351,17 +462,166 @@ .BR ".NH\ 1" , .I groff prints a warning on standard error. +. +.IP +If the +.B GROWPS +register is set to a value +greater than the level of the heading, +then the point size of the heading will be increased by +.B PSINCR +units over the text size specified by the +.B PS +register, +for each level by which the heading level is less than +the value of +.BR GROWPS . +For example, +the sequence: +. +.RS +.ne 12 +.nf +.IP +\&.nr PS 10 +\&.nr GROWPS 3 +\&.nr PSINCR 1.5p +\&. +\&.NH 1 +Top Level Heading +\&. +\&.NH 2 +Second Level Heading +\&. +\&.NH 3 +Third Level Heading +.fi +.RE +. +.IP +will cause +.RI \*(lq 1.\ Top\ Level\ Heading \*(rq +to be printed in 13pt +.B bold +text, followed by +.RI \*(lq 1.1.\ Second\ Level\ Heading \*(rq +in 11.5pt +.B bold +text, while +.RI \*(lq 1.1.1.\ Third\ Level\ Heading \*(rq, +and all more deeply nested heading levels, +will remain in the 10pt +.B bold +text which is specified by the +.B PS +register. +. +.IP +Note that the value stored in +.B PSINCR +is interpreted in +.I groff +basic units; +the +.I p +scaling factor should be employed, +when assigning a value specified in points. +. +.IP +After invoking +.BR .NH , +the assigned heading number is available in the strings +.B SN-DOT +(exactly as it appears in the formatted heading), +and +.B SN-NO-DOT +(with its final period omitted). +The string +.B SN +is also defined, +as an alias for +.BR SN-DOT ; +if preferred, +the user may redefine it as an alias for +.BR SN-NO-DOT , +'ne 10 +by including the initialisation: +. +.RS +.nf +.IP +\&.ds SN-NO-DOT +\&.als SN SN-NO-DOT +.fi +.RE +. +.IP +.I before +the first use of +.BR .NH , +or simply: +. +.RS +.nf +.IP +\&.als SN SN-NO-DOT +.fi +.RE +. +.IP +.I after +the first use of +.BR .NH . +. .TP -.B \&.SH +.BI .SH\ [ xx ] Unnumbered subheading. -.\" ----- +The use of the optional +.I xx +argument is a GNU extension, +which adjusts the point size of the unnumbered subheading +to match that of a numbered heading, +introduced using +.BI .NH\ xx +with the same value of +.IR xx . +For example, +given the same settings for +.BR PS , +.B GROWPS +and +.BR PSINCR , +as used in the preceeding +.B .NH +example, +the sequence: +. +.RS +.ne +.nf +.IP +\&.SH 2 +An Unnumbered Subheading +.fi +.RE +. +.IP +will print +.RI \*(lq "An Unnumbered Subheading" \*(rq +in 11.5pt +.B bold +text. +. +. .SS Highlighting +. The .I ms macros provide a variety of methods to highlight or emphasize text: +. .TP -.BI "\&.B [" txt " [" post " [" pre ]]] +.B ".B [\fItxt\fP [\fIpost\fP [\fIpre\fP]]]" Sets its first argument in .BR "bold type" . If you specify a second argument, @@ -377,86 +637,102 @@ the first argument. For example, .RS +. .IP \&.B foo ) ( .RE +. .IP prints .RB ( foo ). +. .IP If you give this macro no arguments, .I groff prints all text following in bold until the next highlighting, paragraph, or heading macro. +. .TP -.BI "\&.R [" txt " [" post " [" pre ]]] +.B ".R [\fItxt\fP [\fIpost\fP [\fIpre\fP]]]" Sets its first argument in roman (or regular) type. It operates similarly to the .B B macro otherwise. +. .TP -.BI "\&.I [" txt " [" post " [" pre ]]] +.B ".I [\fItxt\fP [\fIpost\fP [\fIpre\fP]]]" Sets its first argument in .IR "italic type" . It operates similarly to the .B B macro otherwise. +. .TP -.BI "\&.CW [" txt " [" post " [" pre ]]] +.B ".CW [\fItxt\fP [\fIpost\fP [\fIpre\fP]]]" Sets its first argument in a constant width face. It operates similarly to the .B B macro otherwise. +. .TP -.BI "\&.BI [" txt " [" post " [" pre ]]] +.B ".BI [\fItxt\fP [\fIpost\fP [\fIpre\fP]]]" Sets its first argument in bold italic type. It operates similarly to the .B B macro otherwise. +. .TP -.BI "\&.BX [" txt ] +.BI ".BX [" txt ] Prints its argument and draws a box around it. If you want to box a string that contains spaces, use a digit-width space (\[rs]0). +. .TP -.BI "\&.UL [" txt " [" post ]] +.BI ".UL [" txt " [" post ]] Prints its first argument with an underline. If you specify a second argument, .I groff prints it in the previous font after the underlined text, with no intervening space. +. .TP -.B \&.LG +.B .LG Prints all text following in larger type (2\~points larger than the current point size) until the next font size, highlighting, paragraph, or heading macro. You can specify this macro multiple times to enlarge the point size as needed. +. .TP -.B \&.SM +.B .SM Prints all text following in smaller type (2\~points smaller than the current point size) until the next type size, highlighting, paragraph, or heading macro. You can specify this macro multiple times to reduce the point size as needed. +. .TP -.B \&.NL +.B .NL Prints all text following in the normal point size (that is, the value of the .B PS register). +. .TP .BI \[rs]*{ text \[rs]*} Print the enclosed .I text as a superscript. -.\" ----- +. +. .SS Indents +. You may need to indent sections of text. A typical use for indents is to create nested lists and sublists. +. .PP Use the .B RS @@ -466,20 +742,25 @@ The .B PI register controls the amount of indent. +. .PP You can nest indented sections as deeply as needed by using multiple, nested pairs of .B RS and .BR RE . -.\" ----- +. +. .SS Lists +. The .B IP macro handles duties for all lists. Its syntax is as follows: +. .TP .BI ".IP [" marker " [" width ]] +. .IP The .I marker @@ -488,6 +769,7 @@ for unordered lists, a number (or auto-incrementing number register) for numbered lists, or a word or phrase for indented (glossary-style) lists. +. .IP The .I width @@ -497,7 +779,10 @@ .\" ----- .br .ne 15 +. +. .SS "Tab stops" +. Use the .B ta request to set tab stops as needed. @@ -507,8 +792,10 @@ You can redefine the .B TA macro to create a different set of default tab stops. -.\" ----- +. +. .SS "Displays and keeps" +. Use displays to show text-based examples or figures (such as code listings). Displays turn off filling, so lines of code can be @@ -542,6 +829,7 @@ .TE .RE .ad +. .LP Use the .B DE @@ -550,11 +838,17 @@ .B Ds and .B De -are aliases for +were formerly provided as aliases for .B DS and .BR DE , -respectively. +respectively, but they have been removed, and should no longer be used. +X11 documents which actually use +.B Ds +and +.B De +always load a specific macro file from the X11 distribution (macros.t) +which provides proper definitions for the two macros. .PP To .I keep @@ -572,6 +866,7 @@ and the .B KE macro ends the block. +. .PP You can specify a .I "floating keep" @@ -593,8 +888,23 @@ prints the floating keep at the top of the new page. This is useful for printing large graphics or tables that do not need to appear exactly where specified. -.\" ----- +. +.PP +The macros +.B B1 +and +.B B2 +can be used to enclose a text within a box; +.B .B1 +begins the box, and +.B .B2 +ends it. +Text in the box is automatically placed in a diversion +(keep). +. +. .SS "Tables, figures, equations, and references" +. The .I -ms macros support the standard @@ -607,8 +917,9 @@ .IR refer . Mark text meant for preprocessors by enclosing it in pairs of tags as follows: +. .TP -.BR "\&.TS [H]" " and " \&.TE +.BR ".TS [H]" " and " .TE Denotes a table, to be processed by the .I tbl preprocessor. @@ -625,8 +936,9 @@ if the table runs onto another page, .I groff prints the header on the next page as well. +. .TP -.BR \&.PS " and " \&.PE +.BR .PS " and " .PE Denotes a graphic, to be processed by the .I pic preprocessor. @@ -638,8 +950,9 @@ manual available on the Web as a reference, or by using a graphics program such as .IR xfig . +. .TP -.BR "\&.EQ [\fI\,align\/\fP]" " and " \&.EN +.BR ".EQ [\fI\,align\/\fP]" " and " .EN Denotes an equation, to be processed by the .I eqn preprocessor. @@ -652,8 +965,9 @@ .B I to center (the default), left-justify, or indent the equation. +. .TP -.BR \&.[ " and " \&.] +.BR .[ " and " .] Denotes a reference, to be processed by the .I refer preprocessor. @@ -662,8 +976,10 @@ manual page provides a comprehensive reference to the preprocessor and the format of the bibliographic database. -.\" ----- +. +. .SS Footnotes +. The .I ms macros provide a flexible footnote system. @@ -675,6 +991,7 @@ and .B FE macros. +. .PP You can specify symbolic footnotes by placing the mark character (such as @@ -686,6 +1003,7 @@ and .B FE macros. +. .PP You can control how .I groff @@ -694,19 +1012,24 @@ register as follows: .RS .ne 7 +. .TP 0 Prints the footnote number as a superscript; indents the footnote (default). +. .TP 1 Prints the number followed by a period (like\~1.\&) and indents the footnote. +. .TP 2 Like\~1, without an indent. +. .TP 3 Like\~1, but prints the footnote number as a hanging paragraph. +. .LP .RE You can use footnotes safely within keeps and displays, @@ -727,9 +1050,12 @@ .B .FS are in the same order as the corresponding occurrences of .BR \[rs]** . -.\" ----- +. +. .SS "Headers and footers" +. There are two ways to define headers and footers: +. .IP \(bu 3n Use the strings .BR LH , @@ -744,6 +1070,7 @@ to set the left, center, and right footers. This works best for documents that do not distinguish between odd and even pages. +. .IP \(bu Use the .B OH @@ -757,14 +1084,18 @@ This is more flexible than defining the individual strings. The syntax for these macros is as follows: .RS +. .IP -.BI "\&.OH '" left ' center ' right ' +.B ".OH '\fIleft\fP'\fIcenter\fP'\fIright\fP'" .RE +. .IP You can replace the quote (') marks with any character not appearing in the header or footer text. -.\" ----- +. +. .SS Margins +. You control margins using a set of number registers. The following table lists the register names and defaults: .RS @@ -794,13 +1125,16 @@ .TE .RE .ad +. .PP Note that there is no right margin setting. The combination of page offset and line length provide the information necessary to derive the right margin. -.\" ----- +. +. .SS "Multiple columns" +. The .I ms macros can set text in as many columns as will reasonably @@ -811,14 +1145,17 @@ mode does .I not force a page break. +. .TP -.B \&.1C +.B .1C Single-column mode. +. .TP -.B \&.2C +.B .2C Two-column mode. +. .TP -.BI "\&.MC [" width " [" gutter ]] +.BI ".MC [" width " [" gutter ]] Multi-column mode. If you specify no arguments, it is equivalent to the .B 2C @@ -831,8 +1168,10 @@ The .B MINGW number register is the default gutter width. -.\" ----- +. +. .SS "Creating a table of contents" +. Wrap text that you want to appear in the table of contents in .B XS @@ -845,6 +1184,7 @@ resetting the page number to\~\c .B i (Roman numeral\~1). +. .PP You can manually create a table of contents by specifying a page number as the first argument to @@ -854,6 +1194,7 @@ macro. For example: .RS +. .PP .ne 8 .nf @@ -867,11 +1208,13 @@ \&.XE .fi .RE +. .LP Use the .B PX macro to print a manually-generated table of contents without resetting the page number. +. .PP If you give the argument .B no @@ -884,8 +1227,35 @@ specified by the .B \[rs]*[TOC] string. -.\" ----- +. +. +.SS "Fractional point sizes" +. +Traditionally, the +.I ms +macros only support integer values for the document's font size and +vertical spacing. +To overcome this restriction, values larger than or equal to 1000 are taken +as fractional values, multiplied by 1000. +For example, `.nr\~PS\~10250' sets the font size to 10.25 points. +. +.LP +The following four registers accept fractional point sizes: +.BR PS , +.BR VS , +.BR FPS , +and +.BR FVS . +. +.LP +Due to backwards compatibility, the value of +.B VS +must be smaller than 40000 (this is 40.0 points). +. +. +. .SH "DIFFERENCES FROM troff ms" +. The .I "groff ms" macros are a complete re-implementation, @@ -895,6 +1265,7 @@ they cannot be used with AT&T .IR troff . Other differences include: +. .IP \(bu 3n The internals of .I "groff ms" @@ -904,13 +1275,16 @@ .I ms may not format properly with .IR "groff ms" . +. .IP \(bu The error-handling policy of .I "groff ms" is to detect and report errors, rather than silently to ignore them. +. .IP \(bu Bell Labs localisms are not implemented. +. .IP \(bu Berkeley localisms, in particular the .B TM @@ -918,19 +1292,24 @@ .B CT macros, are not implemented. +. .IP \(bu .I "Groff ms" -does not work in compatibility mode (e.g.\& with the +does not work in compatibility mode (e.g., with the .B \-C option). +. .IP \(bu There is no support for typewriter-like devices. +. .IP \(bu .I "Groff ms" does not provide cut marks. +. .IP \(bu Multiple line spacing is not supported (use a larger vertical spacing instead). +. .IP \(bu Some Unix .I ms @@ -939,11 +1318,13 @@ and .B GW number registers can be used to control the column width and -gutter width respectively. -These number registers are not used in groff ms. +gutter width, respectively. +These number registers are not used in +.IR "groff ms" . +. .IP \(bu Macros that cause a reset -(paragraphs, headings, etc.) +(paragraphs, headings, etc.\&) may change the indent. Macros that change the indent do not increment or decrement the indent, but rather set it absolutely. @@ -956,6 +1337,7 @@ and .B RE macros. +. .IP \(bu The number register .B GS @@ -971,9 +1353,26 @@ or .I "groff ms" should use this number register. +. +.IP \(bu +To make +.I "groff ms" +use the default page offset (which also specifies the left margin), +the +.B PO +number register must stay undefined until the first +.B ms +macro is evaluated. +This implies that +.B PO +should not be used early in the document, unless it is changed also: +Remember that accessing an undefined register automatically defines it. .br -.ne 22 +.ne 23 +. +. .SS Strings +. You can redefine the following strings to adapt the .I "groff ms" macros to languages other than English: @@ -1000,17 +1399,33 @@ MONTH12 December _ .TE +. .PP The .B \[rs]*- string produces an em dash \[em] like this. -.\" ----- +. +.PP +Use +.B \[rs]*Q +and +.B \[rs]*U +to get a left and right typographer's quote, +respectively, in +.I troff +(and plain quotes in +.IR nroff ). + +. +. .SS Text Settings +. The .B FAM string sets the default font family. If this string is undefined at initialization, it is set to Times. +. .LP The point size, vertical spacing, and inter-paragraph spacing for footnotes are controlled by the number registers @@ -1022,10 +1437,11 @@ .BR \[rs]n(PS-2 , .BR \[rs]n[FPS]+2 , and -.B \[rs]n(PD/2 +.BR \[rs]n(PD/2 , respectively. If any of these registers are defined before initialization, the initialization macro does not change them. +. .LP The hyphenation flags (as set by the .B hy @@ -1033,6 +1449,7 @@ .B HY register; the default is\~14. +. .PP Improved accent marks (as originally defined in Berkeley's @@ -1047,52 +1464,73 @@ For example, .B n\[rs]*~ produces an n with a tilde over it. -.\" ----- +. +. +. .SH "NAMING CONVENTIONS" +. +. .LP The following conventions are used for names of macros, strings and number registers. External names available to documents that use the .I "groff ms" macros contain only uppercase letters and digits. +. .LP Internally the macros are divided into modules; naming conventions are as follows: +. .IP \(bu 3n Names used only within one module are of the form .IB \%module * name\fR. +. .IP \(bu Names used outside the module in which they are defined are of the form .IB \%module @ name\fR. +. .IP \(bu Names associated with a particular environment are of the form -.IB \%environment : name; +.IB \%environment : name\fR; these are used only within the .B par module. +. .IP \(bu .I name does not have a module prefix. +. .IP \(bu Constructed names used to implement arrays are of the form .IB \%array ! index\fR. +. .PP Thus the groff ms macros reserve the following names: +. .IP \(bu 3n Names containing the characters .BR * , .BR @ , and\~\c .BR : . +. .IP \(bu Names containing only uppercase letters and digits. +. +. +. .SH FILES +. .B @MACRODIR@/ms.tmac (a wrapper file for .BR s.tmac ) .br .B @MACRODIR@/s.tmac +. +. +. .SH "SEE ALSO" +. .BR groff (@MAN1EXT@), .BR @g@troff (@MAN1EXT@), .BR @g@tbl (@MAN1EXT@), @@ -1101,7 +1539,11 @@ .BR @g@refer (@MAN1EXT@), .I Groff: The GNU Implementation of troff by Trent Fisher and Werner Lemberg. +. +. +. .SH AUTHOR +. Original manual page by James Clark .IR "et al" ; rewritten by Larry Kollar diff -ruN groff-1.19.1/tmac/groff_www.man groff-1.19.2/tmac/groff_www.man --- groff-1.19.1/tmac/groff_www.man 2003-07-18 09:46:38.000000000 +0200 +++ groff-1.19.2/tmac/groff_www.man 2005-05-26 15:37:21.000000000 +0200 @@ -1,5 +1,6 @@ .TH GROFF_WWW @MAN7EXT@ "@MDATE@" "Groff Version @VERSION@" -.\" Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc. +.\" Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005 +.\" Free Software Foundation, Inc. .\" Written by Gaius Mulley (gaius@glam.ac.uk) .\" .\" This file is part of groff. @@ -16,7 +17,7 @@ .\" .\" You should have received a copy of the GNU General Public License along .\" with groff; see the file COPYING. If not, write to the Free Software -.\" Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +.\" Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. .\" .\" user level guide to using the -mwww macroset .\" @@ -35,6 +36,8 @@ .SH NAME groff_www \- groff macros for authoring web pages .HR +. +. .SH SYNOPSIS .B "groff \-mwww" [ options ] @@ -81,12 +84,19 @@ \&.HR produce a horizontal rule \&.NHR suppress automatic generation of rules. \&.HTL only generate HTML title +\&.HEAD add data to block \&.ULS unorder list begin \&.ULE unorder list end +\&.OLS ordered list begin +\&.OLE ordered list end +\&.DLS definition list begin +\&.DLE definition list end \&.LI insert a list item \&.DC generate a drop capital \&.HTML pass an html raw request to the device driver +\&.CDS code example begin +\&.CDE code example end .fi .PP Output of the @@ -100,15 +110,16 @@ . .SH REQUESTS .TP -.B JOBNAME -Split output into multiple files. +.B .JOBNAME filename +Split output into multiple HTML files. +A file is split whenever a .SH or .NH\ 1 is encountered. Its argument is the file stem name for future output files. This option is equivalent to .BR \%grohtml 's .B \-j option. .TP -.B HX +.B .HX n Specify the cut off depth when generating links from section headings. For example, a parameter of\~2 would cause .B \%grohtml @@ -136,22 +147,30 @@ .BR groff . . .TP -.B BCL +.B .BCL foreground background active not-visited visited This macro takes five parameters: foreground, background, active hypertext link, hypertext link not yet visited, and visited hypertext link colour. . .TP -.B BGIMG +.B .BGIMG imagefile the only parameter to this macro is the background image file. . .TP -.B URL +.B .URL url [description] [after] generates .TAG URL -a URL using either two or three arguments. +a URL using either one, two or three arguments. The first parameter is the actual URL, the second is the name of the link, and the third is optional stuff to be printed immediately afterwards. -Hyphenation is disabled while printing the actual URL; explicit breakpoints +If +.B description +and +.B after +are absent then the +.B url +becomes the anchor text. +Hyphenation is disabled while printing the actual URL; +explicit breakpoints should be inserted with the .B \[rs]: escape. @@ -179,11 +198,14 @@ .RE . .TP -.B MTO +.B .MTO address [description] [after] Generate an email html reference. The first argument is mandatory as the email address. -The optional second argument is the text you see in your browser, and -an optional third argument is stuff printed immediately afterwards. +The optional second argument is the text you see in your browser +If an empty argument is given, +.B address +is used instead. +An optional third argument is stuff printed immediately afterwards. Hyphenation is disabled while printing the actual email address. For example, .MTO joe@user.org "Joe User" @@ -203,7 +225,7 @@ .BR \-Thtml ). . .TP -.B FTP +.B .FTP url [description] [after] indicates that data can be obtained via ftp. The first argument is the url and the second is the browser text. A third argument, similar to the macros above, is intended for stuff printed @@ -219,7 +241,7 @@ .RE . .TP -.B TAG +.B .TAG name Generates an html name tag from its argument. This can then be referenced using the .URL #URL URL @@ -244,13 +266,14 @@ .RE . .TP -.B IMG +.B .IMG [-R|-L|-C] filename [width] [height] Include a picture into the document. The first argument is the horizontal location: right, left, or center .RB ( \-R , .BR \-L , or .BR \-C ). +Alignment is centered by default (-C). The second argument is the filename. The optional third and fourth arguments are the width and height. If the width is absent it defaults to 1\~inch. @@ -261,7 +284,7 @@ macro. . .TP -.B PIMG +.B .PIMG [-R|-L|-C] filename [width [height]] Include an image in PNG format. This macro takes exactly the same parameters as the .B IMG @@ -282,22 +305,58 @@ option of groff. . .TP -.B MPIMG +.B .MPIMG [-R|-L] [-G gap] filename [width [height]] Place a PNG image on the margin and wrap text around it. -The first parameter is the alignment: left or right +The first parameters are optional. +The alignment: left or right .RB ( \-L or -.BR \-R ). -The second argument is the filename. -The optional third and fourth arguments are the width and height. +.BR \-R ) +specifies the margin where the picture is placed at. +The default alignment is left +.RB ( -L ). +Optionally, +.BI \-G \~gap +can be used to arrange a gap between the picture +and the text that wraps around it. +The default gap width is zero. +.br +The first non-optional argument is the filename. +The optional following arguments are the width and height. If the width is absent it defaults to 1\~inch. If the height is absent it defaults to the width. +Example: +.RS +.IP +.nf +.ft B +\&.MPIMG -L -G 2c foo.png 3c 1.5c +.ft P +.fi +.RE +.IP +The height and width may also be given as percentages. The PostScript +device calculates the width from the +.B .l +register and the height from the +.B .p +register. For example: +.RS +.IP +.nf +.ft B +\&.MPIMG -L -G 2c foo.png 15% +.ft P +.fi +.RE . .TP -.B HnS +.B .HnS n Begin heading. -The heading level is specified by the first parameter. -Use this macro of your headings contain URLs. +The numeric heading level +.I n +is specified by the first parameter. +Use this macro if your headings contain URL, FTP or MTO macros. Example: .RS .IP @@ -317,13 +376,21 @@ .ft P .fi .RE +.IP +In this case you might wish to +disable automatic links to headings. +This can be done via +.B \-P\-l +from the command line. +.\" or by using a call to `.HX 0'. + . .TP -.B HnE +.B .HnE End heading. . .TP -.B LK +.B .LK .TAG LK Force \%grohtml to place the automatically generated links at this position. If this manual page has been processed with @@ -332,37 +399,48 @@ . .LK . -. -.SH SECTION HEADING LINKS -By default -.B \%grohtml -generates links to all section headings and places these at the top of the -html document. (See -.URL #LK LINKS -for details of how to switch this off or alter the position). -. .TP -.B HR -Generate a full-width horizontal rule. +.B .HR +Generate a full-width horizontal rule for +.BR \-Thtml . +No effect for all other devices. . .TP -.B NHR +.B .NHR Suppress generation of the top and bottom rules which \%grohtml emits by default. . .TP -.B HTL +.B .HTL Generate an HTML title only. This differs from the .B TL macro of the .B ms -macro package which generates both an HTML title and an H1 heading. +macro package which generates both an HTML title and an

    heading. Use it to provide an HTML title as search engine fodder but a graphic title in the document. +The macro terminates when a space or break is seen (.sp, .br). . .TP -.B HTML +.B .HEAD +Add arbitrary HTML data to the block. +Ignored if not processed with +.BR \-Thtml . +Example: +.RS +.IP +.nf +.B ".HEAD" "\[dq]\[dq]" +.fi +.ft P +.RE +. +.TP +.B .HTML All text after this macro is treated as raw html. If the document is processed without .B \-Thtml @@ -385,12 +463,30 @@ .RE . .TP -.B DC +.B .DC l text [color] Produce a drop capital. The first parameter is the letter to be dropped and enlarged, the second -parameter is the ajoining text whose height the first letter should not -exceed. +parameter +.B text +is the ajoining text whose height the first letter should not exceed. The optional third parameter is the color of the dropped letter. +It defaults to black. +. +.TP +.B ".CDS" +Start displaying a code section in constant width font. +. +.TP +.B ".CDE" +End code display +. +.SH SECTION HEADING LINKS +By default +.B \%grohtml +generates links to all section headings and places these at the top of the +html document. (See +.URL #LK LINKS +for details of how to switch this off or alter the position). . . .SH LIMITATIONS OF GROHTML diff -ruN groff-1.19.1/tmac/html.tmac groff-1.19.2/tmac/html.tmac --- groff-1.19.1/tmac/html.tmac 2003-04-08 21:01:15.000000000 +0200 +++ groff-1.19.2/tmac/html.tmac 2004-10-07 13:57:04.000000000 +0200 @@ -42,6 +42,7 @@ .if !c\[arrowvertbt] .tr \[arrowvertbt] .if !c\[arrowvertex] .tr \[arrowvertex] .if !c\[barex] .tr \[barex] +.if !c\[sqrtex] .tr \[sqrtex] . .\" now for the color definitions .\" diff -ruN groff-1.19.1/tmac/Makefile.sub groff-1.19.2/tmac/Makefile.sub --- groff-1.19.1/tmac/Makefile.sub 2003-04-08 19:47:27.000000000 +0200 +++ groff-1.19.2/tmac/Makefile.sub 2005-08-03 09:10:38.000000000 +0200 @@ -19,10 +19,12 @@ dvi.tmac \ tty.tmac tty-char.tmac \ latin1.tmac latin2.tmac latin9.tmac cp1047.tmac \ + unicode.tmac \ X.tmac Xps.tmac \ lj4.tmac \ lbp.tmac \ html.tmac html-end.tmac \ + devtag.tmac \ europs.tmac \ composite.tmac \ eqnrc \ @@ -124,6 +126,7 @@ -rm -f $(tmacdir)/$(tmac_s_prefix)s.tmac -rm -f $(tmacdir)/$(tmac_an_prefix)an.tmac -rm -f $(tmacdir)/man.tmac $(tmacdir)/ms.tmac + -rm -f $(tmacdir)/www.tmac -if cmp -s $(localtmacdir)/man.local $(srcdir)/man.local; then \ rm -f $(localtmacdir)/man.local; \ fi diff -ruN groff-1.19.1/tmac/papersize.tmac groff-1.19.2/tmac/papersize.tmac --- groff-1.19.1/tmac/papersize.tmac 2003-03-12 09:01:50.000000000 +0100 +++ groff-1.19.2/tmac/papersize.tmac 2005-02-28 14:50:03.000000000 +0100 @@ -7,9 +7,9 @@ .\" groff ... -dpaper= ... .\" .\" Possible values for `format' are the same as the predefined `papersize' -.\" values (only lowercase; see the groff_font man page) except a7-d7. -.\" An appended `l' (ell) character denotes landscape orientation. -.\" Examples: `a4', `c3l', `letterl'. +.\" values (see the groff_font man page) except a7-d7. An appended `l' +.\" (ell) character denotes landscape orientation. Examples: `a4', `c3l', +.\" `letterl'. .\" .\" Most output drivers need additional command line switches `-p' and .\" `-l' to override the default paper length and orientation as set in @@ -104,6 +104,18 @@ . ds paper-dl-length 22c . ds paper-dl-width 11c . +. \" We assume that letters a-z and A-Z aren't mapped during start-up. +. tr AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz +. di lowercase +. nop \*[paper] +. br +. di +. asciify lowercase +. chop lowercase +. tr AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ +. ds paper \*[lowercase] +. rm lowercase +. . ds paper-p \*[paper] . ds paper-l \*[paper] . length paper-n \*[paper] diff -ruN groff-1.19.1/tmac/s.tmac groff-1.19.2/tmac/s.tmac --- groff-1.19.1/tmac/s.tmac 2004-04-16 06:34:21.000000000 +0200 +++ groff-1.19.2/tmac/s.tmac 2005-05-26 15:37:21.000000000 +0200 @@ -21,7 +21,7 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free Software -Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. .. .if !\n(.g .ab These ms macros require groff. .if \n(.C \ @@ -31,7 +31,10 @@ .if (\n[.warn] == 65543) .warn .\" See if already loaded. .if r GS .nx +.mso devtag.tmac .nr GS 1 +.nr need_eo_h 0 +.nr need_eo_tl 0 .de @error .tm \\n(.F:\\n(.c: macro error: \\$* .. @@ -169,14 +172,14 @@ .rn @AB AB .rn @AU AU .rn @AI AI -.if !'\*(.T'html' .di cov*tl-div +.di cov*tl-div .par@reset .ft B .ps +2 .vs +3p .ll (u;\\n[LL]*5/6) .nr cov*n-au 0 -.HTML-TAG ".tl" +.DEVTAG-TL .. .de @AU .par@reset @@ -188,10 +191,13 @@ .di cov*au-div!\\n[cov*n-au] .nf .ft I -.ps \\n[PS] +.ie (\\n[PS] >= 1000) \ +. ps (\\n[PS]z / 1000u) +.el \ +. ps \\n[PS] .. .de @AI -.if !'\*(.T'html' .par@reset +.par@reset .if !'\\n(.z'' \{\ . br . di @@ -201,7 +207,10 @@ . di cov*ai-div!\\n[cov*n-au] . nf . ft R -. ps \\n[PS] +. ie (\\n[PS] >= 1000) \ +. ps (\\n[PS]z / 1000u) +. el \ +. ps \\n[PS] .\} .. .de LP @@ -254,10 +263,18 @@ . di .\} .cov*ab-init -.if !'\*(.T'html' .di cov*ab-div +.ie '\*(.T'html' \{\ +. cov*tl-au-print +. als cov*tl-au-print @nop +.\} +.el .di cov*ab-div .par@ab-indent .par@reset .if !'\\$1'no' \{\ +. if '\*(.T'html' \{\ +. nf +. sp +. \} . ft I . ce 1 \\*[ABSTRACT] @@ -318,7 +335,7 @@ .sp 3 .if d cov*ab-div \{\ . if !'\*(.T'html' . nf -. cov*ab-div +. cov*ab-div .\} .sp 3 .par@reset @@ -364,11 +381,15 @@ .rs .sp 3 .ce 9999 -.if d cov*tl-div .cov*tl-div +.if d cov*tl-div \{\ +. cov*tl-div +. DEVTAG-EO-TL +.\} .nr cov*i 1 .nr cov*sp 1v .while \\n[cov*i]<=\\n[cov*n-au] \{\ -. sp \\n[cov*sp]u +. ie '\*(.T'html' .br +. el .sp \\n[cov*sp]u . cov*au-div!\\n[cov*i] . ie d cov*ai-div!\\n[cov*i] \{\ . sp .5v @@ -480,7 +501,7 @@ . nr pg*gutw \\n[LL]-(\\n[pg@ncols]*\\n[pg@colw])/(\\n[pg@ncols]-1) . el .nr pg*gutw 0 .\} -.HTML-TAG ".mc \\n[pg@ncols] \\n[pg@colw] \\n[pg*gutw]" +.DEVTAG ".mc \\n[pg@ncols] \\n[pg@colw] \\n[pg*gutw]" .mk pg*col-top .ns .nr pg*col-num 0 @@ -499,7 +520,6 @@ .nr PN \\n% .nr pg*col-num 0 .nr pg@fn-bottom-margin 0 -.nr pg*saved-po \\n[PO] .po \\n[PO]u .ev h .par@reset @@ -536,12 +556,12 @@ .. .de pg*end-col 'sp |\\n[pg*col-top]u -.po (u;\\n[pg*saved-po]+(\\n[pg@colw]+\\n[pg*gutw]*\\n[pg*col-num])) +.po (u;\\n[PO]+(\\n[pg@colw]+\\n[pg*gutw]*\\n[pg*col-num])) .\"po +(u;\\n[pg@colw]+\\n[pg*gutw]) .pg*start-col .. .de pg*end-page -.po \\n[pg*saved-po]u +.po \\n[PO]u .\" Make sure we don't exit if there are still floats or footnotes left-over. .ie \\n[kp@head]<\\n[kp@tail]:\\n[fn@have-overflow] \{\ . \" Switching environments ensures that we don't get an unnecessary @@ -873,7 +893,6 @@ .ds*end!\\n[\\n[.ev]:ds-type] .nr \\n[.ev]:ds-type 0 .. -.als De DE .de ds@auto-end .if \\n[\\n[.ev]:ds-type] \{\ . @error automatically terminating display @@ -951,7 +970,6 @@ . nr \\n[.ev]:ds-type 3 .\} .. -.als Ds DS .de ds@need .if '\\n(.z'' \{\ . while \\n[.t]<=(\\$1)&(\\n[nl]>\\n[pg@header-bottom]) \{\ @@ -999,10 +1017,23 @@ .\" don't set LT so that it can be defaulted from LL .ie rLT .lt \\n[LT]u .el .lt \\n[LL]u -.ps \\n[PS] +.ie (\\n[PS] >= 1000) \ +. ps (\\n[PS]z / 1000u) +.el \ +. ps \\n[PS] .\" don't set VS so that it can be defaulted from PS -.ie rVS .par*vs \\n[VS] -.el .par*vs \\n[PS]+2 +.ie rVS \{\ +. ie (\\n[VS] >= 1000) \ +. par*vs "(\\n[VS]p / 1000u)" +. el \ +. par*vs \\n[VS] +.\} +.el \{\ +. ie (\\n[PS] >= 1000) \ +. par*vs "((\\n[PS]p / 1000u) + 2p)" +. el \ +. par*vs "(\\n[PS] + 2)" +.\} .if dFAM .fam \\*[FAM] .if !rHY .nr HY 14 .hy \\n[HY] @@ -1034,16 +1065,37 @@ .de par@init .if !rLT .nr LT \\n[LL] .if !rFL .nr FL \\n[LL]*5/6 -.if !rVS .nr VS \\n[PS]+2 +.if !rVS \{\ +. ie (\\n[PS] >= 1000) \ +. nr VS (\\n[PS] + 2000) +. el \ +. nr VS (\\n[PS] + 2) +.\} .if !rDI .nr DI .5i -.if !rFPS .nr FPS \\n[PS]-2 -.if !rFVS .nr FVS \\n[FPS]+2 +.if !rFPS \{\ +. ie (\\n[PS] >= 1000) \ +. nr FPS (\\n[PS] - 2000) +. el \ +. nr FPS (\\n[PS] - 2) +.\} +.if !rFVS \{\ +. ie (\\n[FPS] >= 1000) \ +. nr FVS (\\n[FPS] + 2000) +. el \ +. nr FVS (\\n[FPS] + 2) +.\} .\" don't change environment 0 .ev h -.ps \\n[PS] +.ie (\\n[PS] >= 1000) \ +. ps (\\n[PS]z / 1000u) +.el \ +. ps \\n[PS] .if !rQI .nr QI 5n .if !rPI .nr PI 5n -.par*vs \\n[VS] +.ie (\\n[VS] >= 1000) \ +. par*vs "(\\n[VS]p / 1000u)" +.el \ +. par*vs \\n[VS] .if !rPD .nr PD .3v>?\n(.V .if !rDD .nr DD .5v>?\n(.V .if !rFI .nr FI 2n @@ -1086,6 +1138,10 @@ .\" par@reset .de par@reset .br +.if \\n[need_eo_tl]>0 .DEVTAG-EO-TL +.nr need_eo_tl 0 +.if \\n[need_eo_h]>0 .DEVTAG-EO-H +.nr need_eo_h 0 .ce 0 .rj 0 .ul 0 @@ -1101,8 +1157,14 @@ .in (u;\\n[\\n[.ev]:li]+\\n[\\n[.ev]:pli]) .ft 1 .fam \\*[FAM] -.ps \\n[\\n[.ev]:PS] -.par*vs \\n[\\n[.ev]:VS] +.ie (\\n[\\n[.ev]:PS] >= 1000) \ +. ps (\\n[\\n[.ev]:PS]z / 1000u) +.el \ +. ps \\n[\\n[.ev]:PS] +.ie (\\n[\\n[.ev]:VS] >= 1000) \ +. par*vs "(\\n[\\n[.ev]:VS]p / 1000u)" +.el \ +. par*vs \\n[\\n[.ev]:VS] .ls 1 .TA .hy \\n[HY] @@ -1116,13 +1178,18 @@ .de TA .ta T 5n .. +.\" \n[PORPHANS] sets number of initial lines of any paragraph, +.\" which must be kept together, without any included page break. +.\" Initialise to reproduce original behaviour; user may adjust it. +.if !rPORPHANS .nr PORPHANS 1 +. .de par*start .ds@auto-end .nr \\n[.ev]:pli \\$1 .nr \\n[.ev]:pri \\$2 .par@reset .sp \\n[\\n[.ev]:PD]u -.ne 1v+\\n(.Vu +.ne \\n[PORPHANS]v+\\n(.Vu .. .de par@finish .nr \\n[.ev]:pli 0 @@ -1159,33 +1226,15 @@ . di . chop par*label . ti -\\n[\\n[.ev]:ai]u -. ie \\n[dl]+1n<=\\n[\\n[.ev]:ai] \\*[par*label]\h'|\\n[\\n[.ev]:ai]u'\c -. el \{\ -\\*[par*label] -. br -. \} -. rm par*label -.\} -.. -.de @IP-html -.if \\n[.$]>1 .nr \\n[.ev]:ai (n;\\$2) -.par*start \\n[\\n[.ev]:ai] 0 -.if !'\\$1'' \{\ -. \" Divert the label so as to freeze any spaces. -. di par*label -. par*push-tag-env -\&\\$1 -. par*pop-tag-env -. di -. chop par*label -. ti -\\n[\\n[.ev]:ai]u . ie \\n[dl]+1n<=\\n[\\n[.ev]:ai] \{\ -. HTML-TAG-NS ".col 1" -\\$1\h'|\\n[\\n[.ev]:ai]u'\c -. HTML-TAG-NS ".col 2" +. DEVTAG-COL 1 +\\*[par*label]\h'|\\n[\\n[.ev]:ai]u'\c +. DEVTAG-COL 2 . \} . el \{\ -\\$1 +. DEVTAG-COL 1 +\\*[par*label] +. DEVTAG-COL-NEXT 2 . br . \} . rm par*label @@ -1323,16 +1372,40 @@ .\} .el \!.par*box-draw \\$1 \\$2 .. +.\" \n[HORPHANS] sets how many lines of the following paragraph must be +.\" kept together, with a preceding section header. Initialise it, +.\" to reproduce original behaviour; user may change it. +.if !rHORPHANS .nr HORPHANS 1 +. +.\" \n[GROWPS] and \n[PSINCR] cause auto-increment of header point size. +.\" Initialise them, so they have no effect, unless explicitly set by the user. +.if !rGROWPS .nr GROWPS 0 +.if !rPSINCR .nr PSINCR 1p +. .de SH-NO-TAG .par@finish -.\" Keep together the heading and the first two lines of the next paragraph. -.ne 3v+\\n[\\n[.ev]:PD]u+\\n(.Vu +.\" Keep the heading and the first few lines of the next paragraph together. +.\" (\n[HORPHANS] defines "first few" -- default = 1; user may redefine it). +.nr sh*minvs \\n[HORPHANS]v +.if \\n[sh*psincr]<0 .nr sh*psincr 0 +.ie \\n(VS<1000 .par*vs \\n(VSp+\\n[sh*psincr]u +.el .par*vs \\n(VSp/1000u+\\n[sh*psincr]u +.ne 2v+\\n[sh*minvs]u+\\n[\\n[.ev]:PD]u+\\n(.Vu +.\" Adjust point size for heading text, as specified by \n[GROWPS] and \n[PSINCR]. +.ie \\n(PS<1000 .ps \\n(PS+\\n[sh*psincr]u +.el .ps \\n(PSz/1000u+\\n[sh*psincr]u .sp 1 .ft B .. .de @SH +.\" Standard ms implementation does not expect an argument, +.\" but allow ".SH n" to make heading point size match ".NH n", +.\" for same "n", when \n[GROWPS] and \n[PSINCR] are set. +. nr sh*psincr 0 +. if 0\\$1>0 .nr sh*psincr (\\n[GROWPS]-0\\$1)*\\n[PSINCR] . SH-NO-TAG -. HTML-TAG ".SH 1" +. DEVTAG-SH 1 +. if '\*(.T'html' .nr need_eo_h 1 .. .\" TL, AU, and AI are aliased to these in cov*ab-init. .de par@TL @@ -1342,7 +1415,8 @@ .ps +2 .vs +3p .ce 9999 -.HTML-TAG ".tl" +.DEVTAG-TL +.nr need_eo_tl 1 .. .de par@AU .par@finish @@ -1357,7 +1431,10 @@ .. .\" In paragraph macros. .de NL -.ps \\n[\\n[.ev]:PS] +.ie (\\n[\\n[.ev]:PS] >= 1000) \ +. ps (\\n[\\n[.ev]:PS]z / 1000u) +.el \ +. ps \\n[\\n[.ev]:PS] .. .de SM .ps -2 @@ -1489,15 +1566,19 @@ . \} . nr H\\n[nh*hl] +1 .\} -.ds SN -.nr nh*i 0 +.ds SN-NO-DOT \\n(H1 +.nr nh*i 1 .while \\n[nh*i]<\\n[nh*hl] \{\ . nr nh*i +1 -. as SN \\n[H\\n[nh*i]]. +. as SN-NO-DOT .\\n[H\\n[nh*i]] .\} +.ds SN-DOT \\*[SN-NO-DOT]. +.if !dSN .als SN SN-DOT +.nr sh*psincr (\\n[GROWPS]-\\n[nh*hl])*\\n[PSINCR] .SH-NO-TAG -.HTML-TAG ".NH \\$1" -\\*[SN] +.DEVTAG-NH "\\$1" +. if '\*(.T'html' .nr need_eo_h 1 +\\*[SN-DOT] .. .\" **************************** .\" ******** module toc ******** @@ -1545,7 +1626,10 @@ .1C .if !'\\$1'no' \{\ . ce 1 -. ps \\n[PS]+2 +. ie (\\n[PS] >= 1000) \ +. ps ((\\n[PS]z / 1000u) + 2z) +. el \ +. ps \\n[PS]+2 . ft B \\*[TOC] . ft @@ -1592,7 +1676,7 @@ . HTML-IMAGE-INLINE .\} .if \\n[eqn*type]=2 .HTML-IMAGE -.if !'\*(.T'html' .nf +.nf .. .de @div-end!eqn*div .@EN @@ -1606,7 +1690,7 @@ . nr eqn*have-num 0 . if !'\\*[eqn*num]'' .nr eqn*have-num 1 . ie \\n[dl]:\\n[eqn*have-num] \{\ -. if !'\*(.T'html' .sp \\n[DD]u +. sp \\n[DD]u . par@reset . ds eqn*tabs \\n[.tabs] . nf @@ -1633,7 +1717,8 @@ . ta (u;\\n[.l]-\\n[.i])R \t\\*[eqn*num] . \} -. if !'\*(.T'html' .sp \\n[DD]u +.\". if !'\*(.T'html' .sp \\n[DD]u +. sp \\n[DD]u . ta \\*[eqn*tabs] . \} . el \{ @@ -1665,7 +1750,6 @@ .. .de @TS .sp \\n[DD]u -.\" .if !'\*(.T'html' .sp \\n[DD]u .if '\\$1'H' .di tbl*header-div .HTML-IMAGE .. @@ -1868,6 +1952,12 @@ .ref*field A , .if r [A .nr ref*suppress-period \\n([A .. +.de ref*add-V +.ref*field V "" \fB \fR +.. +.de ref*add-N +.ref*field N \z( "" ")" +.. .de ref*add-dflt .ref*field \\$1 , .. @@ -1983,8 +2073,4 @@ . \} .. .par@load-init -.if '\*(.T'html' \{\ -. rm @IP -. als @IP @IP-html -.\} .\" Make sure that no blank lines creep in at the end of this file. diff -ruN groff-1.19.1/tmac/trace.tmac groff-1.19.2/tmac/trace.tmac --- groff-1.19.1/tmac/trace.tmac 2003-07-24 09:48:38.000000000 +0200 +++ groff-1.19.2/tmac/trace.tmac 2004-10-10 20:29:29.000000000 +0200 @@ -59,10 +59,10 @@ .!!de am . do ecs . ec -. do !!am \$1 +. do !!de \$1 . ie "\$1"\\$0" .do tm1 "\\*[!!sp]*** am trace enter: \\$0 \\$@ . el .do tm1 "\\*[!!sp]*** am trace enter \$1: \\$0 \\$@ -. as !!sp " \" +. do as !!sp " \" . do nop \\*[!!\$1]\\ . do substring !!sp 1 . ie "\$1"\\$0" .do tm1 "\\*[!!sp]*** trace exit: \\$0 \\$@ @@ -79,10 +79,10 @@ .!!de am1 . do ecs . ec -. do !!am \$1 +. do !!de \$1 . ie "\$1"\\$0" .do tm1 "\\*[!!sp]*** am1 trace enter: \\$0 \\$@ . el .do tm1 "\\*[!!sp]*** am1 trace enter \$1: \\$0 \\$@ -. as !!sp " \" +. do as !!sp " \" . do nop \\*[!!\$1]\\ . do substring !!sp 1 . ie "\$1"\\$0" .do tm1 "\\*[!!sp]*** trace exit: \\$0 \\$@ diff -ruN groff-1.19.1/tmac/troffrc-end groff-1.19.2/tmac/troffrc-end --- groff-1.19.1/tmac/troffrc-end 2003-04-08 19:46:58.000000000 +0200 +++ groff-1.19.2/tmac/troffrc-end 2004-12-15 15:29:13.000000000 +0100 @@ -13,8 +13,7 @@ .do if !d HTML-IMAGE-RIGHT .do ds HTML-IMAGE-RIGHT .do if !d HTML-IMAGE-LEFT .do ds HTML-IMAGE-LEFT .do if !d HTML-IMAGE-END .do ds HTML-IMAGE-END -.do if !d HTML-TAG .do ds HTML-TAG -.do if !d HTML-TAG-NS .do ds HTML-TAG-NS +.do if !d DEVTAG .do ds DEVTAG .do if !d HTML-DO-IMAGE .do ds HTML-DO-IMAGE . .\" Don't let blank lines creep in here. diff -ruN groff-1.19.1/tmac/tty.tmac groff-1.19.2/tmac/tty.tmac --- groff-1.19.1/tmac/tty.tmac 2003-03-09 06:17:28.000000000 +0100 +++ groff-1.19.2/tmac/tty.tmac 2005-03-14 07:09:26.000000000 +0100 @@ -65,6 +65,9 @@ .fchar \[.i] i .fchar \[bq] , . +.if '\*[.T]'utf8' \ +. mso unicode.tmac +. .\" color definitions .defcolor black rgb #000000 .defcolor red rgb #ff0000 diff -ruN groff-1.19.1/tmac/unicode.tmac groff-1.19.2/tmac/unicode.tmac --- groff-1.19.1/tmac/unicode.tmac 1970-01-01 01:00:00.000000000 +0100 +++ groff-1.19.2/tmac/unicode.tmac 2005-03-28 06:52:59.000000000 +0200 @@ -0,0 +1,3 @@ +.\" unicode.tmac +.\" +.\" EOF diff -ruN groff-1.19.1/tmac/www.tmac groff-1.19.2/tmac/www.tmac --- groff-1.19.1/tmac/www.tmac 2004-01-14 14:47:49.000000000 +0100 +++ groff-1.19.2/tmac/www.tmac 2005-08-12 10:29:40.000000000 +0200 @@ -10,7 +10,7 @@ This file is part of groff, the GNU roff type-setting system. -Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. +Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. written by Gaius Mulley , with additions by Werner Lemberg and Bernd Warken . @@ -26,8 +26,8 @@ You should have received a copy of the GNU General Public License along with groff; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. +Software Foundation, 51 Franklin St - Fifth Floor, Boston, MA +02110-1301, USA. ------------------------------------------------------------------------ @@ -42,9 +42,14 @@ .\" Setup .\" -------------------------------------------------------------------- . +.do if d www:lenstr .nx +. +.do mso devtag.tmac +. .nr _C \n(.C .cp 0 . +. .nr www-html 0 .if '\*[.T]'html' .nr www-html 1 . @@ -104,6 +109,18 @@ .\" -------------------------------------------------------------------- . .\" -------------------------------------------------------------------- +.\" www:paraspace +.\" +.\" Space before paragraph. Use \n[PD] if it exists. +.\" +.nr www:pd 0.5v +.de www:paraspace +. ie r PD .sp \\n[PD]u +. el .sp \\n[www:pd]u +.. +. +.\" +.\" -------------------------------------------------------------------- .\" www:error (...) .\" .\" Print error message @@ -244,23 +261,36 @@ .\" -------------------------------------------------------------------- . .\" -------------------------------------------------------------------- -.\" HTML (
    []) +.\" HTML .\" .\" the main auxiliary macro for the HTML interface .\" .de HTML . if \\n[www-html] \{\ -. \" the following line makes the vertical mode leave, so to say +. \" was implemented via .nop \&\X^html:\\$*^ but +. \" is now implemented using HTML-NS to utilize code factoring. +. \" +. \" the `\&' makes the vertical mode leave, so to say +. \" +. nop \&\c +. HTML-NS \\$* . nop \& -. nop \X^html:\\$*^ . \} .. .\" .\" an auxiliary macro for HTML (without following space) .\" .de HTML-NS -. if \\n[www-html] \ -. nop \X^html:\\$*^\c +. nop \X^html:\\$*^\c +.. +.\" +.\" emit a HTML tag after shutting down a (possibly open) paragraph +.\" +.de HTML

    +. if \\n[www-html] \{\ +. \" the `\&' makes the vertical mode leave, so to say +. nop \&\X^html

    :\\$*^ +. \} .. .\" -------------------------------------------------------------------- .\" HX n @@ -292,20 +322,50 @@ .\" if description is absent then the url becomes the anchor text .\" .de URL -. ds \\$0:adr \\$1\" -. www:url_breaks \\$0:adr +. ie !'\\$1'' \{\ +. ds \\$0:adr \\$1\" +. www:url_breaks \\$0:adr +. \} . ie \\n[www-html] \{\ +. ie '\\$3'' \ +. ds \\$0:after \& +. el \ +. ds \\$0:after \&\\$3 . ie '\\$2'' \ -. HTML
    \\$1\\$3 +. HTML-NS \\$1 . el \ -. HTML \\$2\\$3 +. HTML-NS \\$2 +. nop \\*[\\$0:after] +. rm \\$0:after . \} . el \{\ . if !r ps4html .ad l -. ie '\\$2'' \ -. nop \%\[la]\m[blue]\f[C]\\*[\\$0:adr]\f[]\m[]\[ra]\\$3 -. el \ -. nop \m[blue]\\$2\m[] \%\[la]\f[C]\\*[\\$0:adr]\f[]\[ra]\\$3 +. ie '\\$2'' \{\ +. ie '\\$1'' \{\ +. ie !'\\$3'' \ +. nop \\$3 +. \} +. el \{\ +. ie \\n[.color] \ +. nop \%\[la]\m[blue]\f[C]\\*[\\$0:adr]\f[]\m[]\[ra]\\$3 +. el \ +. nop \%\[la]\f[CB]\\*[\\$0:adr]\f[]\[ra]\\$3 +. \} +. \} +. el \{\ +. ie '\\$1'' \{\ +. ie \\n[.color] \ +. nop \m[blue]\\$2\m[]\\$3 +. el \ +. nop \f[B]\\$2\f[]\\$3 +. \} +. el \{\ +. ie \\n[.color] \ +. nop \m[blue]\\$2\m[] \%\[la]\f[C]\\*[\\$0:adr]\f[]\[ra]\\$3 +. el \ +. nop \f[B]\\$2\f[] \%\[la]\f[C]\\*[\\$0:adr]\f[]\[ra]\\$3 +. \} +. \} . if !r ps4html .ad . \} . rm \\$0:adr @@ -340,10 +400,32 @@ . URL mailto:\\$1 "\\$2" "\\$3" . \} . el \{\ -. ie '\\$2'' \ -. nop \%\m[blue]\f[C]\\$1\f[]\m[]\\$3 -. el \ -. nop \m[blue]\\$2\m[] \%\[la]\f[C]\\$1\f[]\[ra]\\$3 +. ie '\\$2'' \{\ +. ie '\\$1'' \{\ +. ie !'\\$3'' \ +. nop \\$3 +. \} +. el \{\ +. ie \\n[.color] \ +. nop \%\m[blue]\f[C]\\$1\f[]\m[]\\$3 +. el \ +. nop \%\f[CB]\\$1\f[]\\$3 +. \} +. \} +. el \{\ +. ie '\\$1'' \{\ +. ie \\n[.color] \ +. nop \m[blue]\\$2\m[]\\$3 +. el \ +. nop \f[B]\\$2\f[]\\$3 +. \} +. el \{\ +. ie \\n[.color] \ +. nop \m[blue]\\$2\m[] \%\[la]\f[C]\\$1\f[]\[ra]\\$3 +. el +. nop \f[B]\\$2\f[] \%\[la]\f[C]\\$1\f[]\[ra]\\$3 +. \} +. \} . \} .. .\" -------------------------------------------------------------------- @@ -366,12 +448,12 @@ .de IMG . ie \\n[www-html] \{\ . ie '\\$2'-R' \ -. HTML-TAG ".right-image" +. DEVTAG ".right-image" . el \{\ . ie '\\$2'-L' \ -. HTML-TAG ".left-image" +. DEVTAG ".left-image" . el \ -. HTML-TAG ".centered-image" +. DEVTAG ".centered-image" . \} . nr www-width 100 . if !'\\$3'' \ @@ -379,33 +461,13 @@ . nr www-height \\n[www-width] . if !'\\$4'' \ . nr www-height \\$4 -. HTML +. HTML Image \\$1 . \} . el \ . nop \[la]\f[C]\\$1\f[]\[ra] .. .\" -------------------------------------------------------------------- -.\" HTML-TAG -.\" -.\" Emit a tag for grohtml. This is an internal macro. -.\" -.de HTML-TAG -. if \\n[www-html] \{\ -. \" the following line makes the vertical mode leave, so to say -. nop \& -. nop \X^html-tag:\\$*^ -. \} -.. -.\" -------------------------------------------------------------------- -.\" HTML-TAG-NS -.\" -.\" Emit a tag for grohtml (without a space). This is an internal macro. -.\" -.de HTML-TAG-NS -. if \\n[www-html] \ -. nop \X^html-tag:\\$*^\c -.. -.\" -------------------------------------------------------------------- .\" PIMG [-R|-L|-C] filename [width] [height] .\" .\" Include a png image. It will work for -Tps and -Thtml. @@ -419,12 +481,12 @@ .de PIMG . ie \\n[www-html] \{\ . ie '\\$1'-R' \ -. HTML-TAG ".right-image" +. DEVTAG ".right-image" . el \{\ . ie '\\$1'-L' \ -. HTML-TAG ".left-image" +. DEVTAG ".left-image" . el \ -. HTML-TAG ".centered-image" +. DEVTAG ".centered-image" . \} . nr www-width 0 . nr www-height 0 @@ -434,15 +496,16 @@ . nr www-height (\\$4 * 100 / 240) . ie (\\n[www-width] == 0) \{\ . ie (\\n[www-height] == 0) \ -. HTML +. HTML Image \\$2 . el \ -. HTML +. HTML Image \\$2 . \} . el \{\ . ie (\\n[www-height] == 0) \ -. HTML +. HTML Image \\$2 . el \ -. HTML +. HTML Image \\$2 . \} . \} . el \{\ @@ -507,6 +570,32 @@ . wh \\n[www-left-ll-trap]u . nr www-left-ll-trap 0 .. +. +.\" www-handle-percent arg N1 N2 S1 +.\" arg - input string (number or number%) +.\" output parameters: +.\" N1 - name of number register 1=absolute 0=percentage +.\" N2 - number register name for absolute value +.\" S1 - string register name for percentage value +. +.de www-handle-percent +. ds www-percent \\$1\" +. substring www-percent -1 -1 +. +. ie '\\*[www-percent]'%' \{\ +. ds www-abs \\$1\" +. substring www-abs 0 -2 +. nr \\$2 0 +. nr \\$3 \\*[www-abs] +. ds \\$4 \\$1\" +. \} +. el \{\ +. nr \\$2 1 +. nr \\$3 \\$1 +. ds \\$4 none\" +. \} +.. +. .\" -------------------------------------------------------------------- .\" MPIMG [-R|-L] [-G gap] filename [width [height]] .\" @@ -514,6 +603,10 @@ .\" -Tps and -Thtml. The default value for WIDTH is 1i; default value .\" for HEIGHT is WIDTH; the default alignment is left (-L). .\" -G is used to insert a gap between the text and the image. +.\" The height and width can also be given as a percentage. +.\" The PostScript device converts the percentage width into an +.\" absolute value by using \\n[.l], and the height by using \\n[.p]. +.\" .\" .\" Note: This macro can only be used with the `-U' option of groff, .\" activating unsafe mode, if not used with -Thtml; the PNG image @@ -544,24 +637,74 @@ . \} . break . \} +. . nr www-width 1i -. if !'\\$2'' \ -. nr www-width \\$2 -. nr www-height \\n[www-width] -. if !'\\$3'' \ -. nr www-height \\$3 -. nr www-width (\\n[www-width] * 100 / 240) -. nr www-height (\\n[www-height] * 100 / 240) +. nr www-height 1i +. ds www-size-specs "width=\\n[www-width] height=\\n[www-height]\" +. ie !'\\$2'' \{\ +. nr www-is-absolute 0 +. nr www-absolute 0 +. ds www-percentage none\" +. www-handle-percent \\$2 www-is-absolute www-absolute www-percentage +. ie !\\n[www-is-absolute] \{\ +. \" percentage of linelength requested +. nr www-width (\\n[www-absolute] * \\n[.l] / 100) +. if \\n[www-html] \ +. nr www-width (\\n[www-width] * 100 / 240) +. ds www-size-specs "width=\\*[www-percentage]\" +. \} +. el \{\ +. nr www-width \\n[www-absolute] +. if \\n[www-html] \ +. nr www-width (\\n[www-width] * 100 / 240) +. ds www-size-specs "width=\\n[www-width]\" +. \} +. +. nr www-height \\n[www-width] +. ie !'\\$3'' \{\ +. nr www-is-absolute 0 +. nr www-absolute 0 +. ds www-percentage none\" +. www-handle-percent \\$3 www-is-absolute www-absolute www-percentage +. ie !\\n[www-is-absolute] \{\ +. \" percentage of pagelength requested +. nr www-height (\\n[www-absolute] * \\n[.p] / 100) +. if \\n[www-html] \ +. nr www-height (\\n[www-height] * 100 / 240) +. ds www-size-specs "\\*[www-size-specs] height=\\*[www-percentage]\" +. \} +. el \{\ +. nr www-height \\n[www-absolute] +. if \\n[www-html] \ +. nr www-height (\\n[www-height] * 100 / 240) +. ds www-size-specs "\\*[www-size-specs] height=\\*[www-height]\" +. \} +. \} +. \} +. el \{\ +. \" height not specified; use width value +. ie !\\n[www-is-absolute] \{\ +. \" percentage value +. ds www-size-specs "\\*[www-size-specs] height=\\*[www-percentage]\" +. nr www-height \\n[www-width] +. \} +. el \{\ +. ds www-size-specs "\\*[www-size-specs] height=\\*[www-width]\" +. nr www-height \\n[www-width] +. \} +. \} . . ie \\n[www-html] \{\ . ie !\\n[www-image-just] \ -. HTML +. HTML Image \\$1 . el \ -. HTML +. HTML Image \\$1 . \} . el \{\ +. tm www-width is \\n[www-width] +. tm www-height is \\n[www-height] . if !r ps4html \{\ . www-make-unique-name . sy pngtopnm \\$1 | pnmcrop -white | @PNMTOPS_NOSETPAGE@ -noturn > \\*[www-unique-name].eps @@ -572,7 +715,7 @@ . wh \\n[www-left-ll-trap]u . if (\\n[www-left-po-trap] > 0) \ . wh \\n[www-left-po-trap]u -. PSPIC -R \\*[www-unique-name].eps \\$2 \\$3 +. PSPIC -R \\*[www-unique-name].eps \\n[www-width]u \\n[www-height]u . sp -\\n[ps-desht]u . nr www-right-indent \\n[ps-deswid]u . \" we want to have some space between text and image, @@ -591,7 +734,7 @@ . \" we must now disable a possible right image trap . if (\\n[www-right-ll-trap] > 0) \ . wh \\n[www-right-ll-trap]u -. PSPIC -L \\*[www-unique-name].eps \\$2 \\$3 +. PSPIC -L \\*[www-unique-name].eps \\n[www-width]u \\n[www-height]u . sp -\\n[ps-desht]u . nr www-left-indent \\n[ps-deswid]u . \" increase offset by gap @@ -628,13 +771,13 @@ . nr www-heading-no 1 . el \ . nr www-heading-no \\$1 -. HTML-TAG ".NH \\n[www-heading-no]" +. DEVTAG-NH \\n[www-heading-no] .. . .de HnE . if (\\n[www-heading-no] == -1) \ . www-error "HnE found without a corresponding HnS" -. br +. DEVTAG-EO-H .. .\" -------------------------------------------------------------------- .\" LK @@ -643,20 +786,15 @@ .\" section/numbered headings at this position. .\" .de LK -. HTML-TAG ".links" +. DEVTAG ".links" .. .\" -------------------------------------------------------------------- .\" HR .\" -.\" Produce a horizontal line +.\" Produce a horizontal line. .\" .de HR -. ie \\n[www-html] \{\ -. ti 0 -. HTML-NS
    -. \} -. el \ -. sp +. HTML

    "
    " .. .\" -------------------------------------------------------------------- .\" NHR @@ -665,19 +803,21 @@ .\" emits by default. .\" .de NHR -. HTML-TAG ".no-auto-rule" +. DEVTAG ".no-auto-rule" .. .\" .\" www-end-nowhere - end of input trap called to finish diversion. .\" .de www-end-nowhere -. di +. if !\\n[www-html] \ +. di +. DEVTAG-EO-TL .. .\" -------------------------------------------------------------------- .\" HTL .\" .\" Generate an HTML title only. This differs from the -ms .TL macro -.\" which generates both an HTML title and a H1 heading. +.\" which generates both an HTML title and an H1 heading. .\" .\" This is useful when an author wishes to use a HTML title as search .\" engine fodder but a graphic title in the document. @@ -685,51 +825,108 @@ .\" The macro terminates when a space or break is seen (.sp, .br). .\" .de HTL -. HTML-TAG ".html-tl" -. if !\\n[www-html] \{\ +. DEVTAG ".html-tl" +. if !\\n[www-html] \ . di www-nowhere -. it 2 www-end-nowhere -. \} +. it 2 www-end-nowhere .. . .\" -------------------------------------------------------------------- -.\" auxiliary definitions for ULS / ULE +.\" auxiliary definitions for lists +.\" +.ds www-ul-level1 \[bu]\ \ \" +.ds www-ul-level2 \[sq]\ \ \" +.ds www-ul-level3 \[ci]\ \ \" +.nr www-ul-level 0 +. +.ds www-ol-level1 decimal\" +.ds www-ol-level2 lower-alpha\" +.ds www-ol-level3 lower-roman\" +.ds www-ol-tmp 00\ \ \" +.nr www-ol-ctr1 0 1 +.nr www-ol-ctr2 0 1 +.nr www-ol-ctr3 0 1 +.af www-ol-ctr2 a +.af www-ol-ctr3 i +.nr www-ol-level 0 +. +.nr www-dl-level 0 +.nr www-dl-shift 5n +. +.\" +.\" allow nested lists .\" -.ds www-level1 \[bu]\ \ \" -.ds www-level2 \[sq]\ \ \" -.ds www-level3 \[ci]\ \ \" -.nr www-level 0 .nr www-depth 0 +.nr www-li-indent \n[.i] +.ds www-level0 nop\" +.ds www-level1 +.ds www-level2 +.ds www-level3 +.ds www-level4 +.ds www-level5 +.ds www-level6 +.ds www-level7 +.ds www-level8 +.ds www-level9 +. +.\" which macro to use for LI +.de www-push-li +. nr www-depth +1 +. ds www-level\\n[www-depth] \\$1\" +. als LI \\$1 +.. +. +.de www-pop-li +. nr www-depth -1 +. als LI \\*[www-level\\n[www-depth]] +.. . .\" .\" Auxiliary macro for ULS. .\" -.de www-push-level -. nr www-level +1 -. if (\\n[www-level] > 3) \ -. www-error "too many levels of indentation (\\n[www-level])" +.de www-push-ul-level +. nr www-ul-level +1 +. if (\\n[www-ul-level] > 3) \ +. www-error "ULS: too many levels of indentation (\\n[www-ul-level])" .. .\" .\" Auxiliary macro for ULE. .\" -.de www-pop-level -. if !\\n[www-level] \ -. www-error "trying to terminate a list which does not exist" -. nr www-level -1 +.de www-pop-ul-level +. if !\\n[www-ul-level] \ +. www-error "ULE: trying to terminate a list which does not exist" +. nr www-ul-level -1 .. +. +.\" +.\" Auxiliary macro for OLS. +.\" +.de www-push-ol-level +. nr www-ol-level +1 +. if (\\n[www-ol-level] > 3) \ +. www-error "OLS: too many levels of indentation (\\n[www-ol-level])" +.. +.\" +.\" Auxiliary macro for OLE. +.\" +.de www-pop-ol-level +. if !\\n[www-ol-level] \ +. www-error "OLE: trying to terminate a list which does not exist" +. nr www-ol-level -1 +.. +. .\" -------------------------------------------------------------------- .\" ULS .\" .\" Start an unordered list. .\" .de ULS -. www-push-level +. www-push-li www-li-ul +. www-push-ul-level . ie \\n[www-html] \ -. HTML "
      " +. HTML

      "
        " . el \{\ -. if (\\n[www-level] == 1) \ -. nr www-depth \\n[.i] -. nr www-depth +\w'\\*[www-level\\n[www-level]]'u +. nr www-li-indent +\w'\\*[www-ul-level\\n[www-ul-level]]'u . \} .. .\" -------------------------------------------------------------------- @@ -741,23 +938,116 @@ . ie \\n[www-html] \ . HTML "
      " . el \{\ -. nr www-depth -\w'\\*[www-level\\n[www-level]]'u -. in \\n[www-depth]u +. nr www-li-indent -\w'\\*[www-ul-level\\n[www-ul-level]]'u +. in \\n[www-li-indent]u +. \} +. www-pop-ul-level +. www-pop-li +.. +.\" -------------------------------------------------------------------- +.\" OLS +.\" +.\" Start an ordered list. +.\" +.de OLS +. www-push-li www-li-ol +. www-push-ol-level +. ie \\n[www-html] \ +. HTML

      "
        " +. el \ +. nr www-li-indent +\w'\\*[www-ol-tmp]'u +.. +.\" -------------------------------------------------------------------- +.\" OLE +.\" +.\" End an ordered list. +.\" +.de OLE +. ie \\n[www-html] \ +. HTML "
      " +. el \{\ +. nr www-li-indent -\w'\\*[www-ol-tmp]'u +. in \\n[www-li-indent]u +. nr www-ol-ctr\\n[www-ol-level] 0 1 +. \} +. www-pop-ol-level +. www-pop-li +.. +.\" -------------------------------------------------------------------- +.\" +.\" DLS +.\" Start a definition list. +.\" +.de DLS +. www-push-li www-li-dl +. nr www-dl-level +1 +. ie \\n[www-html] \ +. HTML

      "
      " +. el \{\ +. nr www-li-indent +\\n[www-dl-shift]u +. in \\n[www-li-indent]u +. \} +.. +.\" -------------------------------------------------------------------- +.\" +.\" DLE +.\" End a definition list. +.\" +.de DLE +. ie \\n[www-html] \ +. HTML "
      " +. el \{\ +. nr www-li-indent -\\n[www-dl-shift]u +. in \\n[www-li-indent]u . \} -. www-pop-level +. nr www-dl-level -1 +. www-pop-li .. .\" -------------------------------------------------------------------- .\" LI .\" .\" Insert a list item. .\" -.de LI +.\" ******** +.\" www-li-ul - bulleted list item +.\" +.de www-li-ul . ie \\n[www-html] \ -. HTML "
    • " +. HTML-NS "
    • " . el \{\ -. in \\n[www-depth]u -. ti -\w'\\*[www-level\\n[www-level]]'u -. nop \\*[www-level\\n[www-level]]\c +. www:paraspace +. in \\n[www-li-indent]u +. ti -\w'\\*[www-ul-level\\n[www-ul-level]]'u +. nop \\*[www-ul-level\\n[www-ul-level]]\c +. \} +.. +.\" ******** +.\" www-li-ol - numbered list item +.\" +.de www-li-ol +. ie \\n[www-html] \ +. HTML-NS "
    • " +. el \{\ +. www:paraspace +. in \\n[www-li-indent]u +. ti -\w'\\n[www-ol-ctr\\n[www-ol-level]]\ \ 'u +. nop \\n+[www-ol-ctr\\n[www-ol-level]]\ \ \c +. \} +.. +.\" ******** +.\" www-li-dl - definition list item +.\" +.de www-li-dl +. ie \\n[www-html] \{\ +. HTML "
      \\$1
      " +. HTML-NS "
      " +. \} +. el \{\ +. www:paraspace +. in \\n[www-li-indent]u +. ti -\\n[www-dl-shift]u +. nop \&\\$1 +. br . \} .. .\" -------------------------------------------------------------------- @@ -776,7 +1066,8 @@ . ds www-dropcolor \\$3 . ie '\*(.T'html' \{\ . www-make-unique-name -. MPIMG -L \\*[www-unique-name].png "(\\n[.v] * 2u)" +. nr www-drop-width (100u * \\n[.v]u * 3u / \\n[.l]u) +. MPIMG -L \\*[www-unique-name].png "\\n[www-drop-width]%" . \} . el \{\ . ie r ps4html \{\ @@ -787,9 +1078,9 @@ . \" glyphs overlap. . bp . ev www-DC -. vs 80p +. vs 320p . nop \O[5i\\*[www-unique-name].png]\O[1] -. nop \m[\\*[www-dropcolor]]\s[40]\O[3]\\$1\O[4] +. nop \m[\\*[www-dropcolor]]\s[160]\O[3]\\$1\O[4] . nop \O[2]\O[0] . br . ev @@ -887,7 +1178,16 @@ .\" The argument to JOBNAME is the file stem for future output files. .\" .de JOBNAME -. HTML-TAG .job-name \\$1 +. DEVTAG .job-name \\$1 +.. +.\" -------------------------------------------------------------------- +.\" HEAD +.\" +.\" Adds information to the section of the html +.\" document +.\" -------------------------------------------------------------------- +.de HEAD +. DEVTAG .head "\\$*" .. .\" -------------------------------------------------------------------- .\" Final Setup