Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

v37i099: lout - Lout document formatting system, v2, Part01/30

65 views
Skip to first unread message

Jeff Kingston

unread,
May 30, 1993, 11:50:37 PM5/30/93
to
Submitted-by: je...@joyce.cs.su.oz.au (Jeff Kingston)
Posting-number: Volume 37, Issue 99
Archive-name: lout/part01
Environment: UNIX

This is version 2 of the Lout document formatting system. Lout offers an wide
range of advanced features, including equation formatting, tables, diagrams,
rotation and scaling, sorted indexes, bibliographic databases, running headers
and odd-even pages, automatic cross referencing, and much more, all ready to
go. Furthermore, Lout is easily extended with definitions which are very
much easier to write than troff of TeX macros because Lout is a high-level
language, the outcome of an eight-year research project that went back to
the beginning.

New features introduced by Version 2 include optimal paragraph breaking,
automatic hyphenation, PostScript EPS file inclusion, ligatures, and
many small enhancements and bug fixes. This version has been beta
tested at a number of sites around the world over the last few months.

Lout is written in C, is highly portable to Unix systems, and produces
PostScript output (used by most laser printers). Lout is also available
via ftp from ftp.cs.su.oz.au in jeff/lout.2.03.tar.Z. The FTP distribution
contains formatted outfile.ps files that are not a part of the c.s.misc
posting.

This distribution contains

* Complete C source code
* Standard packages of definitions for tech reports, books, equations,
tables, diagrams, and Pascal prettyprinting (all written in Lout)
* Complete user documentation in the form of seven technical reports
and a Unix manual page
* A makefile and installation instructions

Lout was designed and implemented by Jeffrey H. Kingston (je...@cs.su.oz.au)
of the Basser Department of Computer Science at the University of Sydney.
---------------
#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".
# Contents: lout lout/data lout/doc lout/doc/tr.begin lout/doc/tr.eq
# lout/doc/tr.fig lout/doc/tr.impl lout/doc/tr.lout lout/doc/tr.over
# lout/doc/tr.tab lout/font0 lout/font0/ZapfDin.AFM lout/font1
# lout/include lout/include/dl lout/man
# Wrapped by kent@sparky on Sun May 30 19:43:53 1993
PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
echo If this archive is complete, you will see the following message:
echo ' "shar: End of archive 1 (of 30)."'
if test ! -d 'lout' ; then
echo shar: Creating directory \"'lout'\"
mkdir 'lout'
fi
if test ! -d 'lout/data' ; then
echo shar: Creating directory \"'lout/data'\"
mkdir 'lout/data'
fi
if test ! -d 'lout/doc' ; then
echo shar: Creating directory \"'lout/doc'\"
mkdir 'lout/doc'
fi
if test ! -d 'lout/doc/tr.begin' ; then
echo shar: Creating directory \"'lout/doc/tr.begin'\"
mkdir 'lout/doc/tr.begin'
fi
if test ! -d 'lout/doc/tr.eq' ; then
echo shar: Creating directory \"'lout/doc/tr.eq'\"
mkdir 'lout/doc/tr.eq'
fi
if test ! -d 'lout/doc/tr.fig' ; then
echo shar: Creating directory \"'lout/doc/tr.fig'\"
mkdir 'lout/doc/tr.fig'
fi
if test ! -d 'lout/doc/tr.impl' ; then
echo shar: Creating directory \"'lout/doc/tr.impl'\"
mkdir 'lout/doc/tr.impl'
fi
if test ! -d 'lout/doc/tr.lout' ; then
echo shar: Creating directory \"'lout/doc/tr.lout'\"
mkdir 'lout/doc/tr.lout'
fi
if test ! -d 'lout/doc/tr.over' ; then
echo shar: Creating directory \"'lout/doc/tr.over'\"
mkdir 'lout/doc/tr.over'
fi
if test ! -d 'lout/doc/tr.tab' ; then
echo shar: Creating directory \"'lout/doc/tr.tab'\"
mkdir 'lout/doc/tr.tab'
fi
if test ! -d 'lout/font0' ; then
echo shar: Creating directory \"'lout/font0'\"
mkdir 'lout/font0'
fi
if test -f 'lout/font0/ZapfDin.AFM' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/font0/ZapfDin.AFM'\"
else
echo shar: Extracting \"'lout/font0/ZapfDin.AFM'\" \(9316 characters\)
sed "s/^X//" >'lout/font0/ZapfDin.AFM' <<'END_OF_FILE'
XStartFontMetrics 2.0
XComment Copyright (c) 1984 Adobe Systems Incorporated. All Rights Reserved.
XComment Creation Date:Tue Mar 3 15:22:45 PST 1987
XFontName ZapfDingbats
XEncodingScheme FontSpecific
XFullName ITC Zapf Dingbats
XFamilyName ITC Zapf Dingbats
XWeight Medium
XItalicAngle 0.0
XIsFixedPitch false
XUnderlinePosition -98
XUnderlineThickness 54
XVersion 001.001
XNotice ITC Zapf Dingbats is a registered trademark of International Typeface Corporation.
XFontBBox -1 -143 981 820
XStartCharMetrics 202
XC 32 ; WX 278 ; N space ; B 0 0 0 0 ;
XC 33 ; WX 974 ; N a1 ; B 35 72 939 621 ;
XC 34 ; WX 961 ; N a2 ; B 35 81 927 611 ;
XC 35 ; WX 974 ; N a202 ; B 35 72 939 621 ;
XC 36 ; WX 980 ; N a3 ; B 35 0 945 692 ;
XC 37 ; WX 719 ; N a4 ; B 34 139 685 566 ;
XC 38 ; WX 789 ; N a5 ; B 35 -14 755 705 ;
XC 39 ; WX 790 ; N a119 ; B 35 -14 755 705 ;
XC 40 ; WX 791 ; N a118 ; B 35 -14 761 705 ;
XC 41 ; WX 690 ; N a117 ; B 35 138 655 553 ;
XC 42 ; WX 960 ; N a11 ; B 35 123 925 568 ;
XC 43 ; WX 939 ; N a12 ; B 35 134 904 559 ;
XC 44 ; WX 549 ; N a13 ; B 29 -11 516 705 ;
XC 45 ; WX 855 ; N a14 ; B 34 59 820 632 ;
XC 46 ; WX 911 ; N a15 ; B 35 50 876 642 ;
XC 47 ; WX 933 ; N a16 ; B 35 139 899 550 ;
XC 48 ; WX 911 ; N a105 ; B 35 50 876 642 ;
XC 49 ; WX 945 ; N a17 ; B 35 139 909 553 ;
XC 50 ; WX 974 ; N a18 ; B 35 104 938 586 ;
XC 51 ; WX 755 ; N a19 ; B 34 -14 721 704 ;
XC 52 ; WX 846 ; N a20 ; B 36 -14 811 705 ;
XC 53 ; WX 762 ; N a21 ; B 35 0 727 692 ;
XC 54 ; WX 761 ; N a22 ; B 35 0 727 692 ;
XC 55 ; WX 571 ; N a23 ; B -1 -68 571 661 ;
XC 56 ; WX 677 ; N a24 ; B 36 -14 642 705 ;
XC 57 ; WX 763 ; N a25 ; B 35 0 728 692 ;
XC 58 ; WX 760 ; N a26 ; B 35 0 726 692 ;
XC 59 ; WX 759 ; N a27 ; B 35 0 725 692 ;
XC 60 ; WX 754 ; N a28 ; B 35 0 720 692 ;
XC 61 ; WX 494 ; N a6 ; B 35 0 460 692 ;
XC 62 ; WX 552 ; N a7 ; B 35 0 517 692 ;
XC 63 ; WX 537 ; N a8 ; B 35 0 503 692 ;
XC 64 ; WX 577 ; N a9 ; B 35 96 542 596 ;
XC 65 ; WX 692 ; N a10 ; B 35 -14 657 705 ;
XC 66 ; WX 786 ; N a29 ; B 35 -14 751 705 ;
XC 67 ; WX 788 ; N a30 ; B 35 -14 752 705 ;
XC 68 ; WX 788 ; N a31 ; B 35 -14 753 705 ;
XC 69 ; WX 790 ; N a32 ; B 35 -14 756 705 ;
XC 70 ; WX 793 ; N a33 ; B 35 -14 759 705 ;
XC 71 ; WX 794 ; N a34 ; B 35 -14 759 705 ;
XC 72 ; WX 816 ; N a35 ; B 35 -14 782 705 ;
XC 73 ; WX 823 ; N a36 ; B 35 -14 787 705 ;
XC 74 ; WX 789 ; N a37 ; B 35 -14 754 705 ;
XC 75 ; WX 841 ; N a38 ; B 35 -14 807 705 ;
XC 76 ; WX 823 ; N a39 ; B 35 -14 789 705 ;
XC 77 ; WX 833 ; N a40 ; B 35 -14 798 705 ;
XC 78 ; WX 816 ; N a41 ; B 35 -13 782 705 ;
XC 79 ; WX 831 ; N a42 ; B 35 -14 796 705 ;
XC 80 ; WX 923 ; N a43 ; B 35 -14 888 705 ;
XC 81 ; WX 744 ; N a44 ; B 35 0 710 692 ;
XC 82 ; WX 723 ; N a45 ; B 35 0 688 692 ;
XC 83 ; WX 749 ; N a46 ; B 35 0 714 692 ;
XC 84 ; WX 790 ; N a47 ; B 34 -14 756 705 ;
XC 85 ; WX 792 ; N a48 ; B 35 -14 758 705 ;
XC 86 ; WX 695 ; N a49 ; B 35 -14 661 706 ;
XC 87 ; WX 776 ; N a50 ; B 35 -6 741 699 ;
XC 88 ; WX 768 ; N a51 ; B 35 -7 734 699 ;
XC 89 ; WX 792 ; N a52 ; B 35 -14 757 705 ;
XC 90 ; WX 759 ; N a53 ; B 35 0 725 692 ;
XC 91 ; WX 707 ; N a54 ; B 35 -14 672 705 ;
XC 92 ; WX 708 ; N a55 ; B 35 -14 672 705 ;
XC 93 ; WX 682 ; N a56 ; B 35 -14 647 705 ;
XC 94 ; WX 701 ; N a57 ; B 35 -14 666 705 ;
XC 95 ; WX 826 ; N a58 ; B 35 -14 791 705 ;
XC 96 ; WX 815 ; N a59 ; B 35 -14 780 705 ;
XC 97 ; WX 789 ; N a60 ; B 35 -14 754 705 ;
XC 98 ; WX 789 ; N a61 ; B 35 -14 754 705 ;
XC 99 ; WX 707 ; N a62 ; B 34 -14 673 705 ;
XC 100 ; WX 687 ; N a63 ; B 36 0 651 692 ;
XC 101 ; WX 696 ; N a64 ; B 35 0 661 691 ;
XC 102 ; WX 689 ; N a65 ; B 35 0 655 692 ;
XC 103 ; WX 786 ; N a66 ; B 34 -14 751 705 ;
XC 104 ; WX 787 ; N a67 ; B 35 -14 752 705 ;
XC 105 ; WX 713 ; N a68 ; B 35 -14 678 705 ;
XC 106 ; WX 791 ; N a69 ; B 35 -14 756 705 ;
XC 107 ; WX 785 ; N a70 ; B 36 -14 751 705 ;
XC 108 ; WX 791 ; N a71 ; B 35 -14 757 705 ;
XC 109 ; WX 873 ; N a72 ; B 35 -14 838 705 ;
XC 110 ; WX 761 ; N a73 ; B 35 0 726 692 ;
XC 111 ; WX 762 ; N a74 ; B 35 0 727 692 ;
XC 112 ; WX 762 ; N a203 ; B 35 0 727 692 ;
XC 113 ; WX 759 ; N a75 ; B 35 0 725 692 ;
XC 114 ; WX 759 ; N a204 ; B 35 0 725 692 ;
XC 115 ; WX 892 ; N a76 ; B 35 0 858 705 ;
XC 116 ; WX 892 ; N a77 ; B 35 -14 858 692 ;
XC 117 ; WX 788 ; N a78 ; B 35 -14 754 705 ;
XC 118 ; WX 784 ; N a79 ; B 35 -14 749 705 ;
XC 119 ; WX 438 ; N a81 ; B 35 -14 403 705 ;
XC 120 ; WX 138 ; N a82 ; B 35 0 104 692 ;
XC 121 ; WX 277 ; N a83 ; B 35 0 242 692 ;
XC 122 ; WX 415 ; N a84 ; B 35 0 380 692 ;
XC 123 ; WX 392 ; N a97 ; B 35 263 357 705 ;
XC 124 ; WX 392 ; N a98 ; B 34 263 357 705 ;
XC 125 ; WX 668 ; N a99 ; B 35 263 633 705 ;
XC 126 ; WX 668 ; N a100 ; B 36 263 634 705 ;
XC 161 ; WX 732 ; N a101 ; B 35 -143 697 806 ;
XC 162 ; WX 544 ; N a102 ; B 56 -14 488 706 ;
XC 163 ; WX 544 ; N a103 ; B 34 -14 508 705 ;
XC 164 ; WX 910 ; N a104 ; B 35 40 875 651 ;
XC 165 ; WX 667 ; N a106 ; B 35 -14 633 705 ;
XC 166 ; WX 760 ; N a107 ; B 35 -14 726 705 ;
XC 167 ; WX 760 ; N a108 ; B 0 121 758 569 ;
XC 168 ; WX 776 ; N a112 ; B 35 0 741 705 ;
XC 169 ; WX 595 ; N a111 ; B 34 -14 560 705 ;
XC 170 ; WX 694 ; N a110 ; B 35 -14 659 705 ;
XC 171 ; WX 626 ; N a109 ; B 34 0 591 705 ;
XC 172 ; WX 788 ; N a120 ; B 35 -14 754 705 ;
XC 173 ; WX 788 ; N a121 ; B 35 -14 754 705 ;
XC 174 ; WX 788 ; N a122 ; B 35 -14 754 705 ;
XC 175 ; WX 788 ; N a123 ; B 35 -14 754 705 ;
XC 176 ; WX 788 ; N a124 ; B 35 -14 754 705 ;
XC 177 ; WX 788 ; N a125 ; B 35 -14 754 705 ;
XC 178 ; WX 788 ; N a126 ; B 35 -14 754 705 ;
XC 179 ; WX 788 ; N a127 ; B 35 -14 754 705 ;
XC 180 ; WX 788 ; N a128 ; B 35 -14 754 705 ;
XC 181 ; WX 788 ; N a129 ; B 35 -14 754 705 ;
XC 182 ; WX 788 ; N a130 ; B 35 -14 754 705 ;
XC 183 ; WX 788 ; N a131 ; B 35 -14 754 705 ;
XC 184 ; WX 788 ; N a132 ; B 35 -14 754 705 ;
XC 185 ; WX 788 ; N a133 ; B 35 -14 754 705 ;
XC 186 ; WX 788 ; N a134 ; B 35 -14 754 705 ;
XC 187 ; WX 788 ; N a135 ; B 35 -14 754 705 ;
XC 188 ; WX 788 ; N a136 ; B 35 -14 754 705 ;
XC 189 ; WX 788 ; N a137 ; B 35 -14 754 705 ;
XC 190 ; WX 788 ; N a138 ; B 35 -14 754 705 ;
XC 191 ; WX 788 ; N a139 ; B 35 -14 754 705 ;
XC 192 ; WX 788 ; N a140 ; B 35 -14 754 705 ;
XC 193 ; WX 788 ; N a141 ; B 35 -14 754 705 ;
XC 194 ; WX 788 ; N a142 ; B 35 -14 754 705 ;
XC 195 ; WX 788 ; N a143 ; B 35 -14 754 705 ;
XC 196 ; WX 788 ; N a144 ; B 35 -14 754 705 ;
XC 197 ; WX 788 ; N a145 ; B 35 -14 754 705 ;
XC 198 ; WX 788 ; N a146 ; B 35 -14 754 705 ;
XC 199 ; WX 788 ; N a147 ; B 35 -14 754 705 ;
XC 200 ; WX 788 ; N a148 ; B 35 -14 754 705 ;
XC 201 ; WX 788 ; N a149 ; B 35 -14 754 705 ;
XC 202 ; WX 788 ; N a150 ; B 35 -14 754 705 ;
XC 203 ; WX 788 ; N a151 ; B 35 -14 754 705 ;
XC 204 ; WX 788 ; N a152 ; B 35 -14 754 705 ;
XC 205 ; WX 788 ; N a153 ; B 35 -14 754 705 ;
XC 206 ; WX 788 ; N a154 ; B 35 -14 754 705 ;
XC 207 ; WX 788 ; N a155 ; B 35 -14 754 705 ;
XC 208 ; WX 788 ; N a156 ; B 35 -14 754 705 ;
XC 209 ; WX 788 ; N a157 ; B 35 -14 754 705 ;
XC 210 ; WX 788 ; N a158 ; B 35 -14 754 705 ;
XC 211 ; WX 788 ; N a159 ; B 35 -14 754 705 ;
XC 212 ; WX 894 ; N a160 ; B 35 58 860 634 ;
XC 213 ; WX 838 ; N a161 ; B 35 153 803 539 ;
XC 214 ; WX 1016 ; N a163 ; B 34 151 981 541 ;
XC 215 ; WX 458 ; N a164 ; B 35 -127 422 820 ;
XC 216 ; WX 748 ; N a196 ; B 35 94 698 597 ;
XC 217 ; WX 924 ; N a165 ; B 35 140 890 552 ;
XC 218 ; WX 748 ; N a192 ; B 35 94 698 597 ;
XC 219 ; WX 918 ; N a166 ; B 35 167 884 525 ;
XC 220 ; WX 927 ; N a167 ; B 35 32 892 660 ;
XC 221 ; WX 928 ; N a168 ; B 35 129 891 562 ;
XC 222 ; WX 928 ; N a169 ; B 35 128 893 563 ;
XC 223 ; WX 834 ; N a170 ; B 35 155 799 537 ;
XC 224 ; WX 873 ; N a171 ; B 35 93 838 599 ;
XC 225 ; WX 828 ; N a172 ; B 35 104 791 588 ;
XC 226 ; WX 924 ; N a173 ; B 35 98 889 594 ;
XC 227 ; WX 924 ; N a162 ; B 35 97 889 593 ;
XC 228 ; WX 917 ; N a174 ; B 35 0 882 692 ;
XC 229 ; WX 930 ; N a175 ; B 35 84 896 608 ;
XC 230 ; WX 931 ; N a176 ; B 35 84 896 608 ;
XC 231 ; WX 463 ; N a177 ; B 35 -99 429 791 ;
XC 232 ; WX 883 ; N a178 ; B 35 71 848 623 ;
XC 233 ; WX 836 ; N a179 ; B 35 44 802 648 ;
XC 234 ; WX 836 ; N a193 ; B 35 44 802 648 ;
XC 235 ; WX 867 ; N a180 ; B 35 101 832 591 ;
XC 236 ; WX 867 ; N a199 ; B 35 101 832 591 ;
XC 237 ; WX 696 ; N a181 ; B 35 44 661 648 ;
XC 238 ; WX 696 ; N a200 ; B 35 44 661 648 ;
XC 239 ; WX 874 ; N a182 ; B 35 77 840 619 ;
XC 241 ; WX 874 ; N a201 ; B 35 73 840 615 ;
XC 242 ; WX 760 ; N a183 ; B 35 0 725 692 ;
XC 243 ; WX 946 ; N a184 ; B 35 160 911 533 ;
XC 244 ; WX 771 ; N a197 ; B 34 37 736 655 ;
XC 245 ; WX 865 ; N a185 ; B 35 207 830 481 ;
XC 246 ; WX 771 ; N a194 ; B 34 37 736 655 ;
XC 247 ; WX 888 ; N a198 ; B 34 -19 853 712 ;
XC 248 ; WX 967 ; N a186 ; B 35 124 932 568 ;
XC 249 ; WX 888 ; N a195 ; B 34 -19 853 712 ;
XC 250 ; WX 831 ; N a187 ; B 35 113 796 579 ;
XC 251 ; WX 873 ; N a188 ; B 36 118 838 578 ;
XC 252 ; WX 927 ; N a189 ; B 35 150 891 542 ;
XC 253 ; WX 970 ; N a190 ; B 35 76 931 616 ;
XC 254 ; WX 918 ; N a191 ; B 34 99 884 593 ;
XC -1 ; WX 509 ; N a205 ; B 35 0 475 692 ;
XC -1 ; WX 410 ; N a206 ; B 35 0 375 692 ;
XC -1 ; WX 509 ; N a85 ; B 35 0 475 692 ;
XC -1 ; WX 410 ; N a86 ; B 35 0 375 692 ;
XC -1 ; WX 234 ; N a87 ; B 35 -14 199 705 ;
XC -1 ; WX 234 ; N a88 ; B 35 -14 199 705 ;
XC -1 ; WX 390 ; N a89 ; B 35 -14 356 705 ;
XC -1 ; WX 390 ; N a90 ; B 35 -14 355 705 ;
XC -1 ; WX 276 ; N a91 ; B 35 0 242 692 ;
XC -1 ; WX 276 ; N a92 ; B 35 0 242 692 ;
XC -1 ; WX 317 ; N a93 ; B 35 0 283 692 ;
XC -1 ; WX 317 ; N a94 ; B 35 0 283 692 ;
XC -1 ; WX 334 ; N a95 ; B 35 0 299 692 ;
XC -1 ; WX 334 ; N a96 ; B 35 0 299 692 ;
XEndCharMetrics
XEndFontMetrics
END_OF_FILE
if test 9316 -ne `wc -c <'lout/font0/ZapfDin.AFM'`; then
echo shar: \"'lout/font0/ZapfDin.AFM'\" unpacked with wrong size!
fi
# end of 'lout/font0/ZapfDin.AFM'
fi
if test ! -d 'lout/font1' ; then
echo shar: Creating directory \"'lout/font1'\"
mkdir 'lout/font1'
fi
if test ! -d 'lout/include' ; then
echo shar: Creating directory \"'lout/include'\"
mkdir 'lout/include'
fi
if test -f 'lout/include/dl' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/include/dl'\"
else
echo shar: Extracting \"'lout/include/dl'\" \(67583 characters\)
sed "s/^X//" >'lout/include/dl' <<'END_OF_FILE'
X
X###############################################################################
X# #
X# Lout @DocumentLayout package (Version 2.0) #
X# #
X# Version 1.0 by Jeffrey H. Kingston, 17 July 1991. #
X# Version 2.0 by Jeffrey H. Kingston, 22 December 1992. #
X# #
X# This Lout package contains the basic definitions for documents, such as #
X# simple documents, technical reports, and books. See "A Beginners' Guide #
X# to Lout" for user information. #
X# #
X###############################################################################
X
Xexport
X @InitialFont @InitialBreak @Hyphenate
X @MajorHeadingFont @HeadingFont @MinorHeadingFont @ParaGap @ParaIndent
X @DispGap @DispIndent @DefaultIndent @WideIndent @VeryWideIndent
X
X @Roman @UCRoman @Alpha @UCAlpha @Months @ShortMonths
X @WeekDays @ShortWeekDays
X
X "--" "---" @Bullet @ParSym @SectSym @Dagger @DaggerDbl @CDot @Sterling
X @Yen @Florin @Star @Degree @Minute @Second @Multiply @Divide @Lozenge
X @Register @CopyRight @TradeMark
X
X @R @I @B @S @MajorHeading @Heading @MinorHeading "^" "&-" @Date
X
X associate associates declination obligatory philanthropic present presents
X project projects reciprocity recognizance reformation retribution table
X
X @Runner @PageMark @PageOf @NumberOf
X
X @PP @LP @DP @NP @CNP
X
X @BAD @BeginAlignedDisplays
X @EAD @EndAlignedDisplays
X @BND @BeginNumberedDisplays
X @END @EndNumberedDisplays
X
X @D @Display
X @LD @LeftDisplay
X @ID @IndentedDisplay
X @CD @CentredDisplay @CenteredDisplay
X @AD @AlignedDisplay
X @LAD @LeftAlignedDisplay
X @IAD @IndentedAlignedDisplay
X @CAD @CentredAlignedDisplay @CenteredAlignedDisplay
X @ND @NumberedDisplay
X @LND @LeftNumberedDisplay
X @IND @IndentedNumberedDisplay
X @CND @CentredNumberedDisplay @CenteredNumberedDisplay
X @AND @AlignedNumberedDisplay
X @LAND @LeftAlignedNumberedDisplay
X @IAND @IndentedAlignedNumberedDisplay
X @CAND @CentredAlignedNumberedDisplay @CenteredAlignedNumberedDisplay
X
X @RD @RawDisplay
X @RLD @RawLeftDisplay
X @RID @RawIndentedDisplay
X @RCD @RawCentredDisplay @RawCenteredDisplay
X @RAD @RawAlignedDisplay
X @RLAD @RawLeftAlignedDisplay
X @RIAD @RawIndentedAlignedDisplay
X @RCAD @RawCentredAlignedDisplay @RawCenteredAlignedDisplay
X @RND @RawNumberedDisplay
X @RLND @RawLeftNumberedDisplay
X @RIND @RawIndentedNumberedDisplay
X @RCND @RawCentredNumberedDisplay @RawCenteredNumberedDisplay
X @RAND @RawAlignedNumberedDisplay
X @RLAND @RawLeftAlignedNumberedDisplay
X @RIAND @RawIndentedAlignedNumberedDisplay
X @RCAND @RawCentredAlignedNumberedDisplay
X @RawCenteredAlignedNumberedDisplay
X
X @LI @ListItem
X @EL @EndList
X
X @RLL @RawLeftList
X @RCL @RawCentredList @RawCenteredList
X
X @LL @LeftList
X @CL @CentredList @CenteredList
X
X @RIL @RawIndentedList
X @RNL @RawNumberedList
X @RPNL @RawParenNumberedList
X @RRL @RawRomanList
X @RPRL @RawParenRomanList
X @RUCRL @RawUCRomanList
X @RPUCRL @RawParenUCRomanList
X @RAL @RawAlphaList
X @RPAL @RawParenAlphaList
X @RUCAL @RawUCAlphaList
X @RPUCAL @RawParenUCAlphaList
X @RBL @RawBulletList
X @RSL @RawStarList
X @RDL @RawDashList
X
X @IL @IndentedList
X @NL @NumberedList
X @PNL @ParenNumberedList
X @RL @RomanList
X @PRL @ParenRomanList
X @UCRL @UCRomanList
X @PUCRL @ParenUCRomanList
X @AL @AlphaList
X @PAL @ParenAlphaList
X @UCAL @UCAlphaList
X @PUCAL @ParenUCAlphaList
X @BL @BulletList
X @SL @StarList
X @DL @DashList
X
X @TI @TagItem
X @RTL @RawTaggedList
X @RWTL @RawWideTaggedList
X @RVWTL @RawVeryWideTaggedList
X
X @TL @TaggedList
X @WTL @WideTaggedList
X @VWTL @VeryWideTaggedList
X
X @Document @Doc @Report @Book # root galley objects
X @Abstract @Preface @Introduction # outer level galleys
X @Chapter @Section @Appendix @Text @ColText
X @Figure @EndFigures @Table @EndTables # inner level galleys
X @Reference @RefStyle @RefPrint
X @ReferenceSection @Ref @ChapRefSection @ChapRef
X @IndexSection @Index @SubIndex @SubSubIndex @RawIndex
X @RawSubIndex @RawSubSubIndex @IndexBlanks
X @ContentsSection
X
X
X
Xdef @DocumentLayout
X named @InitialFont { Times Base 12p } # initial font
X named @InitialBreak { adjust 1.20fx } # initial break
X named @Hyphenate { Yes } # Want hyphenation? Yes or No
X named @MajorHeadingFont { Bold 2.0f } # font for major headings
X named @HeadingFont { Bold } # font for ordinary headings
X named @MinorHeadingFont { Bold } # font for minor headings
X named @BookCoverFont { Helvetica Base } # font for book cover
X
X named @ParaGap { 1.30vx } # gap between paragraphs
X named @ParaIndent { 2.00f } # paragraph first-line indent
X
X named @DispGap { 1.00v } # gap above and below displays
X named @DispIndent { 2.00f } # @IndentedDisplay indent
X named @DefaultIndent { 0.5rt } # @Display indent
X named @WideIndent { 4.00f } # @WideTaggedList indent
X named @VeryWideIndent { 8.00f } # @VeryWideTaggedList indent
X
X named @PageWidth { 21.00c } # width of page
X named @PageHeight { 29.70c } # height of page
X named @PageMargin { 2.50c } # size of all four margins
X named @Columns { Single } # Single, Double, Multi
X named @DoubleColWidth { 7.50c } # column width used by Double
X named @MultiColWidth { 4.67c } # column width used by Multi
X named @ColGap { 1.00c } # gap between columns
X named @TopGap { 0.75c } # gap between figures
X named @MidGap { 0.75c } # gap above and below body text
X
X named @FootNoteFont { 0.80f } # font for footnotes
X named @FootNoteBreak { 1.20fx } # break for footnotes
X named @FootLen { 2.00c } # footnote line and indent size
X named @ColFootLen { 1.20c } # @FootLen when Double, Multi
X named @FootGap { 0.20c } # gap between footnotes
X
X named @MakeIndex { No } # Want index? Yes or No
X named @IndexColumns { Double } # Single, Double, Multi
X
X named @TableOfContents { No } # Want contents? Yes or No
X named @MajorContentsGap { 1.30v } # gap above major entry
X named @ContentsGap { 1.00v } # gap above ordinary entry
X
X named @ChapterNumbers { Yes } # Yes or No
X named @SectionNumbers { Yes } # Yes or No
X named @SubSectionNumbers { Yes } # Yes or No
X named @AppendixNumbers { Yes } # Yes or No
X named @SubAppendixNumbers{ Yes } # Yes or No
X named @ChapterGap { 1.10b } # gap before each chapter
X named @SectionGap { 2.00v } # gap before each section
X named @SubSectionGap { 1.50v } # gap before each subsection
X named @AppendixGap { 2.00v } # gap before each appendix
X named @SubAppendixGap { 2.00v } # gap before each subappendix
X
X named @PageNumbers { Yes } # Want page numbers? Yes or No
X named @FirstPageNumber { 1 } # Number of first page
X named @PageOneTopFormat right @PageNum { @Null }
X named @PageOneFootFormat right @PageNum { @Null }
X named @PageTopFormat right @PageNum { |0.5rt - @PageNum - }
X named @PageFootFormat right @PageNum { @Null }
X named @BookTitleFormat right @Title { Bold @Font @Title }
X
X@Begin
X
X ###########################################################################
X # #
X # @Protect x #
X # #
X # Like @CNP, this reserves space on the current page or else makes sure #
X # x appears on the following page. Lookahead is proportional to font #
X # size. #
X # #
X ###########################################################################
X
X def @Protect right x { 3.0f @High //0io // x }
X
X
X ###########################################################################
X # #
X # @HLine #
X # #
X # Draws a horizontal line to fill available space. #
X # #
X ###########################################################################
X
X def @HLine { {0 0 moveto xsize 0 lineto stroke} @Graphic {} }
X
X
X ###########################################################################
X # #
X # Symbols stored in the "standard" database: #
X # #
X # @Roman lower case Roman numerals i, ii, ... , c #
X # @UCRoman upper case Roman numerals I, II, ... , C #
X # @Alpha lower case Roman alphabet a, b, ... , z #
X # @UCAlpha upper case Roman alphabet A, B, ... , Z #
X # @Months months of the year: January, ... , December #
X # @ShortMonths months of the year, abbreviated: Jan, ... , Dec #
X # @WeekDays days of the week: Sunday, ... , Saturday #
X # @ShortWeekDays days of the week, abbreviated: Sun, ... , Sat #
X # #
X ###########################################################################
X
X def @Roman left @Tag right @Val { @Val }
X def @UCRoman left @Tag right @Val { @Val }
X def @Alpha left @Tag right @Val { @Val }
X def @UCAlpha left @Tag right @Val { @Val }
X def @Months left @Tag right @Val { @Val }
X def @ShortMonths left @Tag right @Val { @Val }
X def @WeekDays left @Tag right @Val { @Val }
X def @ShortWeekDays left @Tag right @Val { @Val }
X
X @SysDatabase @Roman @UCRoman @Alpha @UCAlpha @Months
X @ShortMonths @WeekDays @ShortWeekDays
X { "standard" }
X
X
X ###########################################################################
X # #
X # Selected characters from Adobe's fonts. #
X # #
X ###########################################################################
X
X def "--" { "\261" }
X def "---" { "\320" }
X def @Bullet { "\267" }
X def @ParSym { "\266" }
X def @SectSym { "\247" }
X def @Dagger { "\262" }
X def @DaggerDbl { "\263" }
X def @CDot { "\264" }
X def @Sterling { "\243" }
X def @Yen { "\245" }
X def @Florin { "\246" }
X def @Star { { Symbol Base } @Font "\052" }
X def @Degree { { Symbol Base } @Font "\260" }
X def @Minute { { Symbol Base } @Font "\242" }
X def @Second { { Symbol Base } @Font "\262" }
X def @Multiply { { Symbol Base } @Font "\264" }
X def @Divide { { Symbol Base } @Font "\270" }
X def @Lozenge { { Symbol Base } @Font "\340" }
X def @Register { { Symbol Base } @Font "\342" }
X def @CopyRight { { Symbol Base } @Font "\343" }
X def @TradeMark { { Symbol Base } @Font "\344" }
X
X
X ###########################################################################
X # #
X # Miscellaneous. #
X # #
X ###########################################################################
X
X def @R right x { Base @Font x }
X def @I right x { Slope @Font x }
X def @B right x { Bold @Font x }
X def @S right x { @OneRow { //0.04fo 0.8f @Font x } }
X def "^" { {} ^& {} }
X def "&-" left x right y { x &0ch y }
X def @MajorHeading right x { ragged @Break @MajorHeadingFont @Font x }
X def @Heading right x { ragged @Break @HeadingFont @Font x }
X def @MinorHeading right x { ragged @Break @MinorHeadingFont @Font x }
X def @Date { @Moment&&now @Open {@Day {@Months&&@Month}, @Century{@Year}} }
X
X
X ###########################################################################
X # #
X # Exception list for hyphenation. #
X # #
X ###########################################################################
X
X def associate { "as" &- "so" &- "ciate" }
X def associates { "as" &- "so" &- "ciates" }
X def declination { "dec" &- "li" &- "na" &- "tion" }
X def obligatory { "oblig" &- "a" &- "tory" }
X def philanthropic { "phil" &- "an" &- "thropic" }
X def present { "present" }
X def presents { "presents" }
X def project { "project" }
X def projects { "projects" }
X def reciprocity { "reci" &- "procity" }
X def recognizance { "re" &- "cog" &- "ni" &- "zance" }
X def reformation { "ref" &- "or" &- "ma" &- "tion" }
X def retribution { "ret" &- "ri" &- "bu" &- "tion" }
X def table { "ta" &- "ble" }
X
X
X ###########################################################################
X # #
X # Page and item markers. @Runner is used only by books. #
X # #
X ###########################################################################
X
X export @Tag
X def @PageMarker
X right @Tag
X {
X @Null
X }
X
X def @PageMark
X right x
X {
X @PageMarker&&preceding @Tagged x
X }
X
X def @PageOf
X right x
X {
X @PageMarker&&x @Open { @Tag }
X }
X
X export @Tag
X def @NumberMarker
X right @Tag
X {
X @Null
X }
X
X def @NumberOf
X right x
X {
X @NumberMarker&&x @Open { @Tag }
X }
X
X export @TopOdd @TopEven @FootOdd @FootEven
X def @Runner
X named @TopOdd right @PageNum { @Null }
X named @TopEven right @PageNum { @Null }
X named @FootOdd right @PageNum { @Null }
X named @FootEven right @PageNum { @Null }
X named @Tag {}
X { @Null
X }
X
X
X ###########################################################################
X # #
X # @Hyph x #
X # #
X # Return "hyphen" if x is "Yes" or "yes", else "nohyphen". #
X # #
X ###########################################################################
X
X def @Hyph right x
X {
X x @Case {
X {Yes yes} @Yield "hyphen"
X else @Yield "nohyphen"
X }
X }
X
X
X ###########################################################################
X # #
X # x @OrElse y #
X # #
X # This returns x unless its value is "dft", in which case it returns y. #
X # Useful for defaulting the value of one parameter to another. #
X # #
X ###########################################################################
X
X def @OrElse
X left x
X right y
X {
X x @Case {
X dft @Yield y
X else @Yield x
X }
X }
X
X
X ###########################################################################
X # #
X # Paragraphs. #
X # #
X ###########################################################################
X
X macro @PP { //@ParaGap @ParaIndent @Wide &0i }
X macro @LP { //@ParaGap }
X macro @DP { //@DispGap }
X macro @NP { //1.1b }
X macro @CNP { // 3.2v @High //0io // }
X
X
X ###########################################################################
X # #
X # Beginning and ending of aligned displays. #
X # #
X ###########################################################################
X
X def @APlace { @Galley }
X def @EndAlignedPlace { @Galley }
X def @AlignedPlace { @Galley }
X
X def @BAligned into { @APlace&&preceding }
X {
X def @AlignedList { @AlignedPlace /1.1b @AlignedList }
X
X //1.1b @AlignedList
X // @EndAlignedPlace
X }
X
X macro @BAD { // @APlace | @BAligned }
X def @EAD force into { @EndAlignedPlace&&preceding } {}
X
X macro @BeginAlignedDisplays { @BAD }
X macro @EndAlignedDisplays { @EAD }
X
X
X ###########################################################################
X # #
X # Beginning and ending of numbered displays. #
X # #
X ###########################################################################
X
X def @BeginNumberedPlace { @Galley }
X def @EndNumberedPlace { @Galley }
X def @NextNumberPlace { @Galley }
X
X def @NNumber into { @NextNumberPlace&&following } {}
X macro @NN { @NNumber @BeginNumberedPlace }
X
X def @BNumbered into { @BeginNumberedPlace&&preceding }
X named style right tag { (tag) }
X named start { 1 }
X {
X def @NList right num
X {
X |1rt style num & @NumberMarker num & @NextNumberPlace
X // @NList @Next num
X }
X
X // @NList start
X // @EndNumberedPlace
X }
X
X macro @BND { // @BeginNumberedPlace // @BNumbered }
X def @END force into { @EndNumberedPlace&&preceding } {}
X
X macro @BeginNumberedDisplays { @BND }
X macro @EndNumberedDisplays { @END }
X
X
X ###########################################################################
X # #
X # Galleys which carry displays to their places. #
X # #
X ###########################################################################
X
X def @DispPlace { @Galley }
X
X def @Disp into { @DispPlace&&preceding }
X right x
X {
X @OneRow x
X }
X
X def @NDisp into { @DispPlace&&preceding }
X named @Tag {}
X right x
X {
X @OneRow {
X @NumberMarker&&following @Tagged @Tag
X @PageMarker&&preceding @Tagged @Tag
X ^//
X @OneRow x
X }
X }
X
X def @ADisp into { @AlignedPlace&&preceding }
X right x
X {
X @OneRow x
X }
X
X def @ANDisp into { @AlignedPlace&&preceding }
X named @Tag {}
X right x
X {
X @OneRow {
X @NumberMarker&&following @Tagged @Tag
X @PageMarker&&preceding @Tagged @Tag
X ^/
X @OneRow x
X }
X }
X
X
X ###########################################################################
X # #
X # Displays and raw displays. #
X # #
X ###########################################################################
X
X macro @G { |@DefaultIndent }
X macro @LG { | }
X macro @IG { |@DispIndent }
X macro @CG { |0.5rt }
X
X macro @D { @DP @G @DispPlace | @DP // @Disp }
X macro @LD { @DP @LG @DispPlace | @DP // @Disp }
X macro @ID { @DP @IG @DispPlace | @DP // @Disp }
X macro @CD { @DP @CG @DispPlace | @DP // @Disp }
X
X macro @AD { @DP @G @APlace | @DP // @ADisp }
X macro @LAD { @DP @LG @APlace | @DP // @ADisp }
X macro @IAD { @DP @IG @APlace | @DP // @ADisp }
X macro @CAD { @DP @CG @APlace | @DP // @ADisp }
X
X macro @ND { @DP @G @DispPlace |1rt @NN @DP // @NDisp }
X macro @LND { @DP @LG @DispPlace |1rt @NN @DP // @NDisp }
X macro @IND { @DP @IG @DispPlace |1rt @NN @DP // @NDisp }
X macro @CND { @DP @CG @DispPlace |1rt @NN @DP // @NDisp }
X
X macro @AND { @DP @G @APlace |1rt @NN @DP // @ANDisp }
X macro @LAND { @DP @LG @APlace |1rt @NN @DP // @ANDisp }
X macro @IAND { @DP @IG @APlace |1rt @NN @DP // @ANDisp }
X macro @CAND { @DP @CG @APlace |1rt @NN @DP // @ANDisp }
X
X
X macro @RD { @G @DispPlace | @Disp }
X macro @RLD { @LG @DispPlace | @Disp }
X macro @RID { @IG @DispPlace | @Disp }
X macro @RCD { @CG @DispPlace | @Disp }
X
X macro @RAD { @G @APlace | @ADisp }
X macro @RLAD { @LG @APlace | @ADisp }
X macro @RIAD { @IG @APlace | @ADisp }
X macro @RCAD { @CG @APlace | @ADisp }
X
X macro @RND { @G @DispPlace |1rt @NN @NDisp }
X macro @RLND { @LG @DispPlace |1rt @NN @NDisp }
X macro @RIND { @IG @DispPlace |1rt @NN @NDisp }
X macro @RCND { @CG @DispPlace |1rt @NN @NDisp }
X
X macro @RAND { @G @APlace |1rt @NN @ANDisp }
X macro @RLAND { @LG @APlace |1rt @NN @ANDisp }
X macro @RIAND { @IG @APlace |1rt @NN @ANDisp }
X macro @RCAND { @CG @APlace |1rt @NN @ANDisp }
X
X
X macro @Display { @D }
X macro @LeftDisplay { @LD }
X macro @IndentedDisplay { @ID }
X macro @CentredDisplay { @CD }
X macro @CenteredDisplay { @CD }
X
X macro @AlignedDisplay { @AD }
X macro @LeftAlignedDisplay { @LAD }
X macro @IndentedAlignedDisplay { @IAD }
X macro @CentredAlignedDisplay { @CAD }
X macro @CenteredAlignedDisplay { @CAD }
X
X macro @NumberedDisplay { @ND }
X macro @LeftNumberedDisplay { @LND }
X macro @IndentedNumberedDisplay { @IND }
X macro @CentredNumberedDisplay { @CND }
X macro @CenteredNumberedDisplay { @CND }
X
X macro @AlignedNumberedDisplay { @AND }
X macro @LeftAlignedNumberedDisplay { @LAND }
X macro @IndentedAlignedNumberedDisplay { @IAND }
X macro @CentredAlignedNumberedDisplay { @CAND }
X macro @CenteredAlignedNumberedDisplay { @CAND }
X
X
X macro @RawDisplay { @RD }
X macro @RawLeftDisplay { @RLD }
X macro @RawIndentedDisplay { @RID }
X macro @RawCentredDisplay { @RCD }
X macro @RawCenteredDisplay { @RCD }
X
X macro @RawAlignedDisplay { @RAD }
X macro @RawLeftAlignedDisplay { @RLAD }
X macro @RawIndentedAlignedDisplay { @RIAD }
X macro @RawCentredAlignedDisplay { @RCAD }
X macro @RawCenteredAlignedDisplay { @RCAD }
X
X macro @RawNumberedDisplay { @RND }
X macro @RawLeftNumberedDisplay { @RLND }
X macro @RawIndentedNumberedDisplay { @RIND }
X macro @RawCentredNumberedDisplay { @RCND }
X macro @RawCenteredNumberedDisplay { @RCND }
X
X macro @RawAlignedNumberedDisplay { @RAND }
X macro @RawLeftAlignedNumberedDisplay { @RLAND }
X macro @RawIndentedAlignedNumberedDisplay { @RIAND }
X macro @RawCentredAlignedNumberedDisplay { @RCAND }
X macro @RawCenteredAlignedNumberedDisplay { @RCAND }
X
X
X ###########################################################################
X # #
X # Lists and raw lists (except indented lists). #
X # #
X ###########################################################################
X
X def @ItemPlace { @Galley }
X def @ListItem into { @ItemPlace&&preceding } right x { x }
X macro @LI { @ListItem }
X
X def @EndListPlace { @Galley }
X def @EndList force into { @EndListPlace&&preceding } {}
X macro @EL { @EndList }
X
X def @RLL
X named indent { @DispIndent }
X named gap { @DispGap }
X {
X def @List { |indent @ItemPlace | //gap @List }
X
X @List // @EndListPlace
X }
X
X def @RCL { @RLL indent { 0.5rt } }
X macro @LL { @DP @RLL @DP }
X macro @CL { @DP @RCL @DP }
X
X macro @RawLeftList { @RLL }
X macro @RawCentredList { @RCL }
X macro @RawCenteredList { @RCL }
X macro @LeftList { @LL }
X macro @CentredList { @CL }
X macro @CenteredList { @CL }
X
X
X ###########################################################################
X # #
X # Indented lists and raw indented lists, tagged automatically. #
X # #
X ###########################################################################
X
X def @RawIndentedList
X named style right tag { }
X named indent { @DispIndent }
X named gap { @DispGap }
X named start { 1 }
X {
X def @IList right num
X { indent @Wide {style num} | @ItemPlace |
X //gap @IList @Next num
X }
X
X @IList start // @EndListPlace
X }
X
X def @RawNumberedList { @RawIndentedList style { tag. } }
X def @RawParenNumberedList { @RawIndentedList style { (tag) } }
X def @RawRomanList { @RawIndentedList style { {@Roman&&tag}. } }
X def @RawParenRomanList { @RawIndentedList style { ({@Roman&&tag}) } }
X def @RawUCRomanList { @RawIndentedList style { {@UCRoman&&tag}. } }
X def @RawParenUCRomanList { @RawIndentedList style { ({@UCRoman&&tag}) } }
X def @RawAlphaList { @RawIndentedList style { {@Alpha&&tag}. } }
X def @RawParenAlphaList { @RawIndentedList style { ({@Alpha&&tag}) } }
X def @RawUCAlphaList { @RawIndentedList style { {@UCAlpha&&tag}. } }
X def @RawParenUCAlphaList { @RawIndentedList style { ({@UCAlpha&&tag}) } }
X def @RawBulletList { @RawIndentedList style { @Bullet } }
X def @RawStarList { @RawIndentedList style { @Star } }
X def @RawDashList { @RawIndentedList style { -- } }
X
X macro @IndentedList { @DP @RawIndentedList @DP }
X macro @NumberedList { @DP @RawNumberedList @DP }
X macro @ParenNumberedList { @DP @RawParenNumberedList @DP }
X macro @RomanList { @DP @RawRomanList @DP }
X macro @ParenRomanList { @DP @RawParenRomanList @DP }
X macro @UCRomanList { @DP @RawUCRomanList @DP }
X macro @ParenUCRomanList { @DP @RawParenUCRomanList @DP }
X macro @AlphaList { @DP @RawAlphaList @DP }
X macro @ParenAlphaList { @DP @RawParenAlphaList @DP }
X macro @UCAlphaList { @DP @RawUCAlphaList @DP }
X macro @ParenUCAlphaList { @DP @RawParenUCAlphaList @DP }
X macro @BulletList { @DP @RawBulletList @DP }
X macro @StarList { @DP @RawStarList @DP }
X macro @DashList { @DP @RawDashList @DP }
X
X macro @RIL { @RawIndentedList }
X macro @RNL { @RawNumberedList }
X macro @RPNL { @RawParenNumberedList }
X macro @RRL { @RawRomanList }
X macro @RPRL { @RawParenRomanList }
X macro @RUCRL { @RawUCRomanList }
X macro @RPUCRL { @RawParenUCRomanList }
X macro @RAL { @RawAlphaList }
X macro @RPAL { @RawParenAlphaList }
X macro @RUCAL { @RawUCAlphaList }
X macro @RPUCAL { @RawParenUCAlphaList }
X macro @RBL { @RawBulletList }
X macro @RSL { @RawStarList }
X macro @RDL { @RawDashList }
X
X macro @IL { @IndentedList }
X macro @NL { @NumberedList }
X macro @PNL { @ParenNumberedList }
X macro @RL { @RomanList }
X macro @PRL { @ParenRomanList }
X macro @UCRL { @UCRomanList }
X macro @PUCRL { @ParenUCRomanList }
X macro @AL { @AlphaList }
X macro @PAL { @ParenAlphaList }
X macro @UCAL { @UCAlphaList }
X macro @PUCAL { @ParenUCAlphaList }
X macro @BL { @BulletList }
X macro @SL { @StarList }
X macro @DL { @DashList }
X
X
X ###########################################################################
X # #
X # Indented lists and raw indented lists, tagged by the author. #
X # #
X ###########################################################################
X
X def @TagPlace { @Galley }
X
X def @TagItem into { @ItemPlace&&preceding }
X left x
X right y
X {
X def senditem into { @TagPlace&&preceding } { x }
X
X senditem | y
X }
X
X macro @TI { @TagItem }
X
X def @RawTaggedList
X named style right tag { tag }
X named indent { @DispIndent }
X named gap { @DispGap }
X {
X def @LList
X { indent @Wide {style @TagPlace} | @ItemPlace
X //gap @LList
X }
X
X @LList // @EndListPlace
X }
X
X def @RawWideTaggedList { @RawTaggedList indent { @WideIndent } }
X def @RawVeryWideTaggedList { @RawTaggedList indent { @VeryWideIndent } }
X macro @TaggedList { @DP @RawTaggedList @DP }
X macro @WideTaggedList { @DP @RawWideTaggedList @DP }
X macro @VeryWideTaggedList { @DP @RawVeryWideTaggedList @DP }
X
X macro @RTL { @RawTaggedList }
X macro @RWTL { @RawWideTaggedList }
X macro @RVWTL { @RawVeryWideTaggedList }
X macro @TL { @TaggedList }
X macro @WTL { @WideTaggedList }
X macro @VWTL { @VeryWideTaggedList }
X
X
X
X ###########################################################################
X # #
X # Definitions for laying out one general-purpose page. #
X # #
X ###########################################################################
X
X def @FullPlace { @Galley }
X def @ColPlace { @Galley }
X def @IndexPlace { @Galley }
X
X export @Tag
X def @TopList right @Tag
X {
X @Galley
X //@TopGap @TopList @Next @Tag
X }
X
X export @Tag
X def @FootList right @Tag
X {
X @Galley
X //@FootGap @FootList @Next @Tag
X }
X
X def @FootSect
X {
X @FootLen @Wide @HLine
X //@FootGap @FootList 1 ||@FootLen
X }
X
X export @Tag
X def @ColFootList right @Tag
X {
X @Galley
X //@FootGap @ColFootList @Next @Tag
X }
X
X def @ColFootSect
X {
X @ColFootLen @Wide @HLine
X //@FootGap @ColFootList 1 ||@ColFootLen
X }
X
X def @ColList right col
X {
X def @Column
X {
X @VExpand { @ColPlace //1rt @OneRow { //@MidGap @ColFootSect } }
X }
X
X col @Case {
X
X Single @Yield @Column
X
X Double @Yield { @DoubleColWidth @Wide @Column
X ||@ColGap @ColList col }
X
X Multi @Yield { @MultiColWidth @Wide @Column
X ||@ColGap @ColList col }
X
X }
X }
X
X def @IndexColList right col
X {
X col @Case {
X
X Single @Yield @VExpand @IndexPlace
X
X Double @Yield { @DoubleColWidth @Wide @VExpand @IndexPlace
X ||@ColGap @IndexColList col }
X
X Multi @Yield { @MultiColWidth @Wide @VExpand @IndexPlace
X ||@ColGap @IndexColList col }
X
X }
X }
X
X def @Page right x
X { @PageWidth @Wide @PageHeight @High
X { //@PageMargin ||@PageMargin
X @HExpand @VExpand x
X ||@PageMargin //@PageMargin
X }
X }
X
X def @OnePage
X named @Columns {}
X named @PageTop {}
X named @PageFoot {}
X {
X @Page {
X @PageTop
X //@MidGap @TopList
X //@MidGap @FullPlace
X //@MidGap @ColList @Columns
X //@MidGap @IndexColList @IndexColumns
X // //1rt @OneRow { //@MidGap @FootSect //@MidGap @PageFoot }
X }
X }
X
X
X ###########################################################################
X # #
X # Introductory page (with @IntroFullPlace and @IntroColPlace). #
X # #
X ###########################################################################
X
X def @IntroFullPlace { @Galley }
X def @IntroColPlace { @Galley }
X
X def @IntroColList right col
X {
X def @Column
X {
X @VExpand { @IntroColPlace //1rt @OneRow { //@MidGap @ColFootSect } }
X }
X
X col @Case {
X
X Single @Yield @Column
X
X Double @Yield { @DoubleColWidth @Wide @Column
X ||@ColGap @IntroColList col }
X
X Multi @Yield { @MultiColWidth @Wide @Column
X ||@ColGap @IntroColList col }
X
X }
X }
X
X def @OneIntroPage
X named @Columns {}
X named @PageTop {}
X named @PageFoot {}
X {
X @Page {
X @PageTop
X //@MidGap @TopList
X //@MidGap @IntroFullPlace
X //@MidGap @IntroColList @Columns
X //@MidGap @IndexColList @IndexColumns
X // //1rt @OneRow { //@MidGap @FootSect //@MidGap @PageFoot }
X }
X }
X
X
X ###########################################################################
X # #
X # Page layout for documents other than books (simple and tech. reports) #
X # #
X ###########################################################################
X
X def @SimplePageList
X named @Columns {}
X named @PageNumbers {}
X right @PageNum
X {
X @PageMarker @PageNum
X // @OnePage
X @Columns { @Columns }
X @PageTop {
X @PageNumbers @Case
X {
X {Yes yes} @Yield
X {
X @PageNum @Case
X {
X 1 @Yield @PageOneTopFormat @PageNum
X else @Yield @PageTopFormat @PageNum
X }
X }
X else @Yield @Null
X }
X }
X @PageFoot {
X @PageNumbers @Case
X {
X {Yes yes} @Yield
X {
X @PageNum @Case
X {
X 1 @Yield @PageOneFootFormat @PageNum
X else @Yield @PageFootFormat @PageNum
X }
X }
X else @Yield @Null
X }
X }
X // @SimplePageList
X @Columns { @Columns }
X @PageNumbers { @PageNumbers }
X @Next @PageNum
X }
X
X
X ###########################################################################
X # #
X # Page list for ordinary pages of books. #
X # #
X ###########################################################################
X
X def @OddPageList
X named @Columns {}
X right @PageNum
X {
X def @EvenPageList
X named @Columns {}
X right @PageNum
X {
X @PageMarker @PageNum
X // @Runner&&following @Open
X {
X @OnePage
X @Columns { @Columns }
X @PageTop { @TopEven @PageNum }
X @PageFoot { @FootEven @PageNum }
X }
X // @OddPageList
X @Columns { @Columns }
X @Next @PageNum
X }
X
X @PageMarker @PageNum
X // @Runner&&following @Open
X {
X @OnePage
X @Columns { @Columns }
X @PageTop { @TopOdd @PageNum }
X @PageFoot { @FootOdd @PageNum }
X }
X // @EvenPageList
X @Columns { @Columns }
X @Next @PageNum
X }
X
X
X ###########################################################################
X # #
X # Page list for introductory pages of books. #
X # #
X ###########################################################################
X
X def @IntroOddPageList
X named @Columns {}
X right @PageNum
X {
X @PageMarker @Roman&&@PageNum
X // @Runner&&following @Open
X {
X @OneIntroPage
X @Columns { @Columns }
X @PageTop { @TopOdd @Roman&&@PageNum }
X @PageFoot { @FootOdd @Roman&&@PageNum }
X }
X // @PageMarker @Roman&&{@Next @PageNum}
X // @Runner&&following @Open
X {
X @OneIntroPage
X @Columns { @Columns }
X @PageTop { @TopEven @Roman&&{@Next @PageNum} }
X @PageFoot { @FootEven @Roman&&{@Next @PageNum} }
X }
X // @IntroOddPageList
X @Columns { @Columns }
X @Next @Next @PageNum
X }
X
X
X ###########################################################################
X # #
X # Table of contents. #
X # #
X ###########################################################################
X
X def @ContentsPlace { @Galley }
X
X def @ContentsEntry
X left lpart
X named pregap { @ContentsGap }
X right rpart
X {
X def @Leaders { .. &4s @Leaders }
X
X def sendentry into { @ContentsPlace&&preceding }
X {
X //pregap
X lpart |1rt &2s @Leaders & 2f @Wide {|1rt rpart}
X }
X
X @TableOfContents @Case {
X {Yes yes} @Yield sendentry
X else @Yield @Null
X }
X }
X
X def @MajorContentsEntry
X left lpart
X named pregap { @MajorContentsGap }
X right rpart
X {
X {@B lpart} @ContentsEntry pregap { pregap } rpart
X }
X
X def @ContentsSection
X {
X def @ContentsList { @ContentsPlace // @ContentsList }
X
X @TableOfContents @Case {
X {Yes yes} @Yield { @BookTitleFormat Contents // @ContentsList }
X else @Yield @Null
X }
X }
X
X
X ###########################################################################
X # #
X # Footnotes. #
X # #
X ###########################################################################
X
X def @FullFootNote
X named @Tag {}
X right x
X {
X def ftag
X { @OneRow { @FootList&&@Tag @Open { 0.8f @Font @Tag } ^/0.3vo }
X }
X
X def fnote into { @FootList&&following }
X {
X @FootNoteFont @Font @FootNoteBreak @Break
X { @FootList&&preceding @Tagged @Tag ftag & x }
X }
X
X @Null & @FootNoteFont @Font ftag & fnote
X }
X
X def @ColFootNote
X named @Tag {}
X right x
X {
X def ftag
X { @OneRow { @ColFootList&&@Tag @Open { 0.8f @Font @Tag } ^/0.3vo }
X }
X
X def fnote into { @ColFootList&&following }
X {
X @FootNoteFont @Font @FootNoteBreak @Break
X { @ColFootList&&preceding @Tagged @Tag ftag & x }
X }
X
X @Null & @FootNoteFont @Font ftag & fnote
X }
X
X
X ###########################################################################
X # #
X # References. #
X # #
X ###########################################################################
X
X export @Type @Author @Title @Institution
X @Number @Publisher @Year @Proceedings
X @Journal @Volume @Pages @Comment
X
X def @Reference
X named @Tag { TAG? }
X named @Type { TYPE? }
X named @Author { AUTHOR? }
X named @Title { TITLE? }
X named @Institution { INSTITUTION? }
X named @Number { NUMBER? }
X named @Publisher { PUBLISHER? }
X named @Year { YEAR? }
X named @Proceedings { PROCEEDINGS? }
X named @Journal { JOURNAL? }
X named @Volume { VOLUME? }
X named @Pages { PAGES? }
X named @Comment { @Null }
X { @Null }
X
X export @Style
X def @RefStyle
X left @Tag
X named @Style right reftag {}
X {}
X
X @SysDatabase @RefStyle { "refstyles" }
X
X def @RefPrint right reftag
X { @RefStyle&&{ @Reference&&reftag @Open { @Type } }
X @Open { @Style reftag }
X }
X
X
X ###########################################################################
X # #
X # Reference collection at end of chapter. #
X # #
X ###########################################################################
X
X def @ChapRefPlace { @Galley }
X
X def @ChapRefSection
X named @Title { References }
X named style right tag { tag. }
X named indent { @DispIndent }
X named gap { @DispGap }
X named start { 1 }
X {
X def @RefList right num
X {
X @NumberMarker num &
X indent @Wide {style num} | @ChapRefPlace
X //gap @RefList @Next num
X }
X
X @Heading @Protect @Title
X //@DispGap
X @RefList start
X }
X
X def @ChapRef right x
X {
X def sendref into { @ChapRefPlace&&following }
X right @Key
X {
X @NumberMarker&&preceding @Tagged x &
X @PageMarker&&preceding @Tagged x &
X @RefPrint x
X }
X
X @NumberMarker&&x @Open { @Tag } sendref x
X }
X
X
X ###########################################################################
X # #
X # Reference collection at end of document. #
X # #
X ###########################################################################
X
X def @RefPlace { @Galley }
X
X def @Ref right x
X {
X def sendref into { @RefPlace&&following }
X right @Key
X {
X @NumberMarker&&preceding @Tagged x &
X @PageMarker&&preceding @Tagged x &
X @RefPrint x
X }
X
X @NumberMarker&&x @Open { @Tag } sendref x
X }
X
X def @ReferenceSection
X named @Tag {}
X named @Title { References }
X named @RunningTitle { dft }
X named style right tag { tag. }
X named headstyle right @Title { @Heading @Title }
X named indent { @DispIndent }
X named gap { @DispGap }
X named start { 1 }
X {
X def @RefList right num
X {
X @NumberMarker num &
X indent @Wide {style num} | @RefPlace
X //gap @RefList @Next num
X }
X
X @Protect headstyle @Title
X // @PageMarker&&preceding @Tagged @Tag
X // @Title @MajorContentsEntry {@PageOf @Tag}
X // @Runner
X @FootEven { |0.5rt 0.8f @Font @B @PageNum }
X @FootOdd { |0.5rt 0.8f @Font @B @PageNum }
X //@DispGap @RefList start
X // @Runner
X @TopEven { @B @PageNum }
X @TopOdd { @I {@RunningTitle @OrElse @Title} |1rt @B @PageNum }
X }
X
X
X ###########################################################################
X # #
X # Floating figures. #
X # #
X ###########################################################################
X
X def @FigurePlace { @Galley }
X def @EndFigurePlace { @Galley }
X
X def @FigureGalley into { @TopList&&following }
X right prefix
X {
X def @FigureList right x
X {
X @NumberMarker {prefix}x & ||0.5rt @FigurePlace ||
X //@TopGap
X @FigureList @Next x
X }
X
X @FigureList 1
X //
X @EndFigurePlace
X }
X
X def @EndFigures force into { @EndFigurePlace&&following } {}
X
X def @Figure into { @FigurePlace&&following }
X named @Caption {}
X named @Tag {}
X right @Body
X {
X @OneRow
X {
X ||0.5rt @HContract @Body
X //@DispGap
X ||0.5rt
X @NumberMarker&&preceding @Tagged @Tag
X @PageMarker&&preceding @Tagged @Tag
X @B { Figure {@NumberOf @Tag}. } @Caption
X }
X }
X
X
X ###########################################################################
X # #
X # Floating tables. #
X # #
X ###########################################################################
X
X def @TablePlace { @Galley }
X def @EndTablePlace { @Galley }
X
X def @TableGalley into { @TopList&&following }
X right prefix
X {
X def @TableList right x
X {
X @NumberMarker {prefix}x & ||0.5rt @TablePlace ||
X //@TopGap
X @TableList @Next x
X }
X
X @TableList 1
X //
X @EndTablePlace
X }
X
X def @EndTables force into { @EndTablePlace&&following } {}
X
X def @Table into { @TablePlace&&following }
X named @Caption {}
X named @Tag {}
X right @Body
X {
X @OneRow
X {
X ||0.5rt @HContract @Body
X //@DispGap
X ||0.5rt
X @NumberMarker&&preceding @Tagged @Tag
X @PageMarker&&preceding @Tagged @Tag
X @B { Table {@NumberOf @Tag}. } @Caption
X }
X }
X
X
X ###########################################################################
X # #
X # Lists of chapters, sections, subsections, and appendices. #
X # #
X ###########################################################################
X
X export @Tag
X def @ChapterList right @Tag
X {
X @Galley
X //@ChapterGap @ChapterList @Next @Tag
X }
X
X export @Tag
X def @SectionList right @Tag
X {
X @Galley
X //@SectionGap @SectionList @Next @Tag
X }
X
X export @Tag
X def @SubSectionList right @Tag
X {
X @Galley
X //@SubSectionGap @SubSectionList @Next @Tag
X }
X
X export @Tag
X def @AppendixList right @Tag
X {
X @Galley
X //@AppendixGap @AppendixList @Next @Tag
X }
X
X export @Tag
X def @SubAppendixList right @Tag
X {
X @Galley
X //@SubAppendixGap @SubAppendixList @Next @Tag
X }
X
X
X ###########################################################################
X # #
X # Body text. #
X # #
X ###########################################################################
X
X export @ColText @FootNote
X @BeginSections @EndSections @BeginAppendices @EndAppendices
X
X def @Text force into { @FullPlace&&preceding }
X body x
X {
X def @FootNote right x { @FullFootNote x }
X
X def @EndSectionsPlace { @Galley }
X def @EndSections force into { @EndSectionsPlace&&preceding } {}
X macro @BeginSections
X { //@SectionGap @SectionList 1 // @EndSectionsPlace // }
X
X def @EndAppendicesPlace { @Galley }
X def @EndAppendices force into { @EndAppendicesPlace&&preceding } {}
X macro @BeginAppendices
X { //@AppendixGap @AppendixList 1 // @EndAppendicesPlace //}
X
X
X export @FootNote
X def @ColText force into { @ColPlace&&following }
X body x
X {
X def @FootNote right x { @ColFootNote x }
X
X x
X }
X
X x
X }
X
X export @FootNote
X @BeginSections @EndSections @BeginAppendices @EndAppendices
X def @ColText force into { @ColPlace&&preceding }
X body x
X {
X def @FootNote right x { @ColFootNote x }
X
X def @EndSectionsPlace { @Galley }
X def @EndSections force into { @EndSectionsPlace&&preceding } {}
X macro @BeginSections
X { //@SectionGap @SectionList 1 // @EndSectionsPlace // }
X
X def @EndAppendicesPlace { @Galley }
X def @EndAppendices force into { @EndAppendicesPlace&&preceding } {}
X macro @BeginAppendices
X { //@AppendixGap @AppendixList 1 // @EndAppendicesPlace //}
X x
X }
X
X
X ###########################################################################
X # #
X # Abstract. #
X # #
X ###########################################################################
X
X def @AbstractPlace { @Galley }
X
X export @FootNote
X def @Abstract into { @AbstractPlace&&preceding }
X named @Title { ABSTRACT }
X body x
X {
X def @FootNote right x { @FullFootNote x }
X
X |0.5rt @I @Title
X //@DispGap x
X }
X
X
X ###########################################################################
X # #
X # Preface. #
X # #
X ###########################################################################
X
X def @PrefacePlace { @Galley }
X
X export @FootNote @BeginFigures @BeginTables
X def @Preface force into { @PrefacePlace&&preceding }
X named @Tag {}
X named @Title { Preface }
X named @RunningTitle { dft }
X body @Body
X {
X def @FootNote right x { @ColFootNote x }
X macro @BeginFigures { // @FigureGalley {} // }
X macro @BeginTables { // @TableGalley {} // }
X
X ragged @Break @BookTitleFormat @Title
X // @PageMarker&&preceding @Tagged @Tag
X // @Body
X //@SectionGap @ChapRefSection
X }
X
X
X ###########################################################################
X # #
X # Introduction. #
X # #
X ###########################################################################
X
X def @IntroductionPlace { @Galley }
X
X export @FootNote @BeginFigures @BeginTables
X def @Introduction force into { @IntroductionPlace&&preceding }
X named @Tag {}
X named @Title { Introduction }
X named @RunningTitle { dft }
X body @Body
X {
X def @FootNote right x { @ColFootNote x }
X macro @BeginFigures { // @FigureGalley {} // }
X macro @BeginTables { // @TableGalley {} // }
X
X ragged @Break @BookTitleFormat @Title
X // @Runner
X @FootEven { |0.5rt 0.8f @Font @B @PageNum }
X @FootOdd { |0.5rt 0.8f @Font @B @PageNum }
X // @PageMarker&&preceding @Tagged @Tag
X // @Title @MajorContentsEntry {@PageOf @Tag}
X // @Body
X //@SectionGap @ChapRefSection
X // @Runner
X @TopEven { @B @PageNum }
X @TopOdd { @I {@RunningTitle @OrElse @Title} |1rt @B @PageNum }
X }
X
X
X ###########################################################################
X # #
X # Chapters containing sections and subsections. #
X # #
X ###########################################################################
X
X export @FootNote @BeginFigures @BeginTables
X @BeginSections @EndSections @Section
X def @Chapter force into { @ChapterList&&preceding }
X named @Tag {}
X named @Title {}
X named @RunningTitle { dft }
X body @Body
X {
X def @FootNote right x { @ColFootNote x }
X macro @BeginFigures { // @FigureGalley {@NumberOf @Tag}. // }
X macro @BeginTables { // @TableGalley {@NumberOf @Tag}. // }
X
X def @EndSectionsPlace { @Galley }
X def @EndSections force into { @EndSectionsPlace&&preceding } {}
X macro @BeginSections
X { //@SectionGap @SectionList 1 // @EndSectionsPlace // }
X
X export @BeginSubSections @EndSubSections @SubSection
X def @Section force into { @SectionList&&preceding }
X named @Tag {}
X named @Title {}
X named @RunningTitle { dft }
X body @Body
X {
X
X def @EndSubSectsPlace { @Galley }
X def @EndSubSections force into { @EndSubSectsPlace&&preceding } {}
X macro @BeginSubSections
X { //@SubSectionGap @SubSectionList 1// @EndSubSectsPlace//}
X
X def @SubSection force into { @SubSectionList&&preceding }
X named @Tag {}
X named @Title {}
X named @RunningTitle { dft }
X body @Body
X {
X def @SubSectionTitle
X {
X @SubSectionNumbers @Case {
X {Yes yes} @Yield { {@NumberOf @Tag}. |2s @Title }
X else @Yield @Title
X }
X }
X
X @MinorHeading @Protect @SubSectionTitle
X // @NumberMarker {
X {@ChapterList&&@Tag @Open { @Tag }}.{
X @SectionList&&@Tag @Open { @Tag }}.{
X @SubSectionList&&@Tag @Open { @Tag }}
X }
X // @ChapterList&&preceding @Tagged @Tag
X // @SectionList&&preceding @Tagged @Tag
X // @SubSectionList&&preceding @Tagged @Tag
X // @NumberMarker&&preceding @Tagged @Tag
X // @PageMarker&&preceding @Tagged @Tag
X // {&5f @SubSectionTitle} @ContentsEntry {@PageOf @Tag}
X //0io @Body
X }
X
X def @SectionTitle
X {
X @SectionNumbers @Case {
X {Yes yes} @Yield { {@NumberOf @Tag}. |2s @Title }
X else @Yield @Title
X }
X }
X
X @Heading @Protect @SectionTitle
X // @NumberMarker {
X {@ChapterList&&@Tag @Open { @Tag }}.{
X @SectionList&&@Tag @Open { @Tag }}
X }
X // @ChapterList&&preceding @Tagged @Tag
X // @SectionList&&preceding @Tagged @Tag
X // @NumberMarker&&preceding @Tagged @Tag
X // @PageMarker&&preceding @Tagged @Tag
X // { &3f @SectionTitle } @ContentsEntry {@PageOf @Tag}
X //0io @Body
X
X }
X
X def @ChapterTitle
X {
X @ChapterNumbers @Case {
X {Yes yes} @Yield { Chapter {@NumberOf @Tag}. |2s @Title }
X else @Yield @Title
X }
X }
X
X def @ChapterNum
X {
X @ChapterNumbers @Case {
X {Yes yes} @Yield { Chapter {@NumberOf @Tag} }
X else @Yield @Null
X }
X }
X
X ragged @Break @BookTitleFormat @ChapterTitle
X // @NumberMarker {
X @ChapterList&&@Tag @Open { @Tag }
X }
X // @ChapterList&&preceding @Tagged @Tag
X // @NumberMarker&&preceding @Tagged @Tag
X // @PageMarker&&preceding @Tagged @Tag
X // { @ChapterTitle } @MajorContentsEntry {@PageOf @Tag}
X // @Runner
X @FootEven { |0.5rt 0.8f @Font @B @PageNum }
X @FootOdd { |0.5rt 0.8f @Font @B @PageNum }
X // @Body
X //@SectionGap @ChapRefSection
X // @Runner
X @TopEven { @B @PageNum |1rt @I @ChapterNum }
X @TopOdd { @I {@RunningTitle @OrElse @Title} |1rt @B @PageNum }
X }
X
X
X ###########################################################################
X # #
X # Sections containing subsections. #
X # #
X ###########################################################################
X
X export @FootNote @BeginFigures @BeginTables
X @BeginSubSections @SubSection @EndSubSections
X def @Section force into { @SectionList&&preceding }
X named @Tag {}
X named @Title {}
X named @RunningTitle { dft }
X body @Body
X {
X def @FootNote right x { @ColFootNote x }
X macro @BeginFigures { // @FigureGalley {@NumberOf @Tag}. // }
X macro @BeginTables { // @TableGalley {@NumberOf @Tag}. // }
X
X def @EndSubSectsPlace { @Galley }
X def @EndSubSections force into { @EndSubSectsPlace&&preceding } {}
X macro @BeginSubSections
X { //@SubSectionGap @SubSectionList 1 // @EndSubSectsPlace // }
X
X def @SubSection force into { @SubSectionList&&preceding }
X named @Tag {}
X named @Title {}
X named @RunningTitle { dft }
X right @Body
X {
X def @SubSectionTitle
X {
X @SubSectionNumbers @Case {
X {Yes yes} @Yield { {@NumberOf @Tag}. |2s @Title }
X else @Yield @Title
X }
X }
X
X @MinorHeading @Protect @SubSectionTitle
X // @NumberMarker {
X {@SectionList&&@Tag @Open { @Tag }}.{
X @SubSectionList&&@Tag @Open { @Tag }}
X }
X // @SubSectionList&&preceding @Tagged @Tag
X // @SectionList&&preceding @Tagged @Tag
X // @NumberMarker&&preceding @Tagged @Tag
X // @PageMarker&&preceding @Tagged @Tag
X //0io @Body
X }
X
X def @SectionTitle
X {
X @SectionNumbers @Case {
X {Yes yes} @Yield { {@NumberOf @Tag}. |2s @Title }
X else @Yield @Title
X }
X }
X
X @Heading @Protect @SectionTitle
X // @NumberMarker {
X @SectionList&&@Tag @Open { @Tag }
X }
X // @SectionList&&preceding @Tagged @Tag
X // @NumberMarker&&preceding @Tagged @Tag
X // @PageMarker&&preceding @Tagged @Tag
X //0io @Body
X }
X
X
X ###########################################################################
X # #
X # Appendices. #
X # #
X ###########################################################################
X
X export @FootNote @BeginFigures @BeginTables
X @BeginSubAppendices @SubAppendix @EndSubAppendices
X def @Appendix force into { @AppendixList&&preceding }
X named @Tag {}
X named @Title {}
X named @RunningTitle { dft }
X body @Body
X {
X def @FootNote right x { @ColFootNote x }
X macro @BeginFigures { // @FigureGalley {@NumberOf @Tag}. // }
X macro @BeginTables { // @TableGalley {@NumberOf @Tag}. // }
X
X def @EndSubAppendicesPlace { @Galley }
X def @EndSubAppendices force into {@EndSubAppendicesPlace&&preceding} {}
X macro @BeginSubAppendices
X { //@SubAppendixGap @SubAppendixList 1 // @EndSubAppendicesPlace // }
X
X def @SubAppendix force into { @SubAppendixList&&preceding }
X named @Tag {}
X named @Title {}
X named @RunningTitle { dft }
X right @Body
X {
X def @SubAppendixTitle
X {
X @SubAppendixNumbers @Case {
X {Yes yes} @Yield { {@NumberOf @Tag}. |2s @Title }
X else @Yield @Title
X }
X }
X
X @Heading @Protect @SubAppendixTitle
X // @NumberMarker {
X {@AppendixList&&@Tag @Open { @Tag }}.{
X @SubAppendixList&&@Tag @Open { @Tag }}
X }
X // @SubAppendixList&&preceding @Tagged @Tag
X // @AppendixList&&preceding @Tagged @Tag
X // @NumberMarker&&preceding @Tagged @Tag
X // @PageMarker&&preceding @Tagged @Tag
X // @SubAppendixTitle @ContentsEntry {@PageOf @Tag}
X //0io @Body
X }
X
X def @AppendixTitle
X {
X @AppendixNumbers @Case {
X {Yes yes} @Yield { Appendix {@NumberOf @Tag}. |2s @Title }
X else @Yield { Appendix. @Title }
X }
X }
X
X def @AppendixNum
X {
X @AppendixNumbers @Case {
X {Yes yes} @Yield { @NumberOf @Tag }
X else @Yield @Null
X }
X }
X
X ragged @Break @BookTitleFormat @AppendixTitle
X // @NumberMarker {
X @AppendixList&&@Tag @Open { @UCAlpha&&@Tag }
X }
X // @AppendixList&&preceding @Tagged @Tag
X // @NumberMarker&&preceding @Tagged @Tag
X // @PageMarker&&preceding @Tagged @Tag
X // @AppendixTitle @MajorContentsEntry {@PageOf @Tag}
X // @Runner
X @FootEven { |0.5rt 0.8f @Font @B @PageNum }
X @FootOdd { |0.5rt 0.8f @Font @B @PageNum }
X // @Body
X //@SectionGap @ChapRefSection
X // @Runner
X @TopEven { @B @PageNum |1rt @I { Appendix @AppendixNum } }
X @TopOdd { @I {@RunningTitle @OrElse @Title} |1rt @B @PageNum }
X }
X
X
X ###########################################################################
X # #
X # Index. #
X # #
X ###########################################################################
X
X def @IndexList { @Galley //1vx @IndexList }
X
X def @IndexSection
X named @Tag {}
X named @Title { Index }
X named @RunningTitle { dft }
X named headstyle right @Title { @Heading @Title //@DispGap }
X {
X
X def @IndexBody into { @IndexPlace&&following }
X { // @IndexList
X // @Runner
X @TopEven { @B @PageNum }
X @TopOdd { @I {@RunningTitle @OrElse @Title} |1rt @B @PageNum }
X }
X
X def indexsection
X {
X headstyle @Title
X // @PageMarker&&preceding @Tagged @Tag
X // @Title @MajorContentsEntry {@PageOf @Tag}
X // @Runner
X @FootEven { |0.5rt 0.8f @Font @B @PageNum }
X @FootOdd { |0.5rt 0.8f @Font @B @PageNum }
X // @IndexBody
X }
X
X @MakeIndex @Case {
X {Yes yes} @Yield indexsection
X else @Yield @Null
X }
X }
X
X def @SendIndex
X left key
X right @Body
X {
X def sendindex into { @IndexList&&following }
X left @Key
X right @Body
X {
X outdent @Break @Body
X }
X
X @MakeIndex @Case {
X {Yes yes} @Yield {key sendindex @Body}
X else @Yield @Null
X }
X }
X
X def @RawIndex left x right y { {@PageMark x} x @SendIndex { &0f y } }
X def @RawSubIndex left x right y { {@PageMark x} x @SendIndex { &1f y } }
X def @RawSubSubIndex left x right y { {@PageMark x} x @SendIndex { &2f y } }
X
X def @Index left x right y { x @RawIndex { y, {@PageOf x} } }
X def @SubIndex left x right y { x @RawSubIndex { y, {@PageOf x} } }
X def @SubSubIndex left x right y { x @RawSubSubIndex { y, {@PageOf x} } }
X
X def @IndexBlanks
X {
X b @RawIndex {} c @RawIndex {} d @RawIndex {} e @RawIndex {}
X f @RawIndex {} g @RawIndex {} h @RawIndex {} i @RawIndex {}
X j @RawIndex {} k @RawIndex {} l @RawIndex {} m @RawIndex {}
X n @RawIndex {} o @RawIndex {} p @RawIndex {} q @RawIndex {}
X r @RawIndex {} s @RawIndex {} t @RawIndex {} u @RawIndex {}
X v @RawIndex {} w @RawIndex {} x @RawIndex {} y @RawIndex {}
X z @RawIndex {}
X }
X
X
X ###########################################################################
X # #
X # Document. #
X # #
X ###########################################################################
X
X def @Document
X named @InitialFont { @InitialFont }
X named @InitialBreak { @InitialBreak }
X named @Hyphenate { @Hyphenate }
X named @PageNumbers { @PageNumbers }
X named @FirstPageNumber { @FirstPageNumber }
X named @Columns { @Columns }
X {
X { Times Base 12p } @Font @InitialFont @Font
X { {@Hyph @Hyphenate} adjust 1.20fx } @Break @InitialBreak @Break
X {
X // @FigureGalley {}
X // @TableGalley {}
X // @SimplePageList
X @Columns { @Columns }
X @PageNumbers { @PageNumbers }
X @FirstPageNumber
X }
X }
X
X macro @Doc { @Document // }
X
X
X ###########################################################################
X # #
X # Report. #
X # #
X ###########################################################################
X
X def @Report
X named @Title {}
X named @Author {}
X named @Institution {}
X named @DateLine { @Date }
X named @InitialFont { @InitialFont }
X named @InitialBreak { @InitialBreak }
X named @Hyphenate { @Hyphenate }
X named @PageNumbers { @PageNumbers }
X named @Columns { @Columns }
X {
X def @TitleMaterial
X {
X |0.5rt @B {{clines 1.4vx} @Break @Title} |
X //0.25i |0.5rt @I {clines @Break @Author} |
X //0.25i |0.5rt clines @Break @Institution |
X }
X
X def @ReportContent force into { @ColPlace&&following }
X {
X @SectionList 1
X //@AppendixGap @AppendixList 1
X //@SectionGap @ReferenceSection
X }
X
X { Times Base 12p } @Font @InitialFont @Font
X { {@Hyph @Hyphenate} adjust 1.20fx } @Break @InitialBreak @Break
X {
X # cover sheet
X // @PageMarker 0
X // @Page {
X //1i @TitleMaterial
X //0.5i |0.5rt @OneCol { |0.5i @AbstractPlace |0.5i }
X //1i @DateLine
X //1rt @OneRow { //@MidGap @FootSect }
X }
X
X // @FigureGalley {}
X // @TableGalley {}
X // @ReportContent
X
X # first page
X // @PageMarker 1
X // @Page
X {
X @PageNumbers @Case
X {
X {Yes yes} @Yield @PageOneTopFormat num
X else @Yield @Null
X }
X //
X //0.5i @TitleMaterial
X //@MidGap @ColList @Columns
X //1rt @OneRow
X {
X //@MidGap
X @PageNumbers @Case
X {
X {Yes yes} @Yield @PageOneFootFormat num
X else @Yield @Null
X }
X }
X }
X
X # subsequent pages
X // @SimplePageList
X @Columns { @Columns }
X @PageNumbers { @PageNumbers }
X 2
X }
X }
X
X
X ###########################################################################
X # #
X # Book. #
X # #
X ###########################################################################
X
X def @Book
X named @Title {}
X named @Author {}
X named @Edition {}
X named @Publisher {}
X named @InitialFont { @InitialFont }
X named @InitialBreak { @InitialBreak }
X named @Hyphenate { @Hyphenate }
X {
X def @BookIntro force into { @IntroColPlace&&preceding }
X {
X @BookCoverFont @Font
X { //1i |0.5rt 2.5f @Font {1.2fx clines} @Break @Title |
X //2i |0.5rt clines @Break @Author |
X //1i |0.5rt clines @Break @Edition |
X //1rt @OneRow @Publisher
X }
X // @Runner
X //1.1b @PrefacePlace
X //1.1b @ContentsSection
X }
X
X def @BookBody force into { @ColPlace&&preceding }
X {
X @IntroductionPlace
X //@ChapterGap @ChapterList 1
X //@AppendixGap @AppendixList 1
X //1.1b @ReferenceSection
X headstyle { ragged @Break @BookTitleFormat @Title }
X //1.1b @IndexSection
X headstyle { ragged @Break @BookTitleFormat @Title }
X }
X
X { Times Base 12p } @Font @InitialFont @Font
X { {@Hyph @Hyphenate} adjust 1.20fx } @Break @InitialBreak @Break
X {
X @IntroOddPageList @Columns { Single } 1
X // @Runner
X @FootEven { @PageNum }
X @FootOdd { |1rt @PageNum }
X // @OddPageList @Columns { Single } 1
X // @BookIntro
X // @BookBody
X // @Runner
X }
X }
X
X@End @DocumentLayout
END_OF_FILE
if test 67583 -ne `wc -c <'lout/include/dl'`; then
echo shar: \"'lout/include/dl'\" unpacked with wrong size!
fi
# end of 'lout/include/dl'
fi
if test ! -d 'lout/man' ; then
echo shar: Creating directory \"'lout/man'\"
mkdir 'lout/man'
fi
echo shar: End of archive 1 \(of 30\).
cp /dev/null ark1isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 30 archives.
rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
echo You still must unpack the following archives:
echo " " ${MISSING}
fi
exit 0
exit 0 # Just in case...

Jeff Kingston

unread,
May 30, 1993, 11:51:07 PM5/30/93
to
Submitted-by: je...@joyce.cs.su.oz.au (Jeff Kingston)
Posting-number: Volume 37, Issue 100
Archive-name: lout/part02
Environment: UNIX

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: lout/doc/tr.lout/ch3.25 lout/externs


# Wrapped by kent@sparky on Sun May 30 19:43:53 1993
PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 2 (of 30)."'
if test -f 'lout/doc/tr.lout/ch3.25' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch3.25'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch3.25'\" \(1014 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch3.25' <<'END_OF_FILE'
X@Section
X @Tag { prependgraphic }
X @Title { "@PrependGraphic and @SysPrependGraphic" }
X@Begin
X@PP
Xprependgraphic.sym @Index { @@PrependGraphic symbol }
Xsysprependgraphic.sym @Index { @@SysPrependGraphic symbol }
Xpostscript.prependgraphic @SubIndex { used by @@PrependGraphic }
XThese symbols tell Lout to include the contents of a file in the
Xpreamble of its output. For Basser Lout this means that the file must
Xcontain PostScript (and ideally it would begin and end with the
X@Code "%%BeginResource" and @Code "%%EndResource" comments of
XDSC 3.0). For example,
X@ID @Code {
X"@SysPrependGraphic { \"fig_prepend\" }"
X}
Xappears at the start of the Fig package; the file @Code fig_prepend
Xcontains a number of PostScript definitions used by Fig for drawing
Xdiagrams. It saves a lot of space to include them just once at the
Xstart like this, rather than with every diagram. @@PrependGraphic and
X@@SysPrependGraphic search for the file in the same places as @@Include and
X@@SysInclude respectively.
X@End @Section
END_OF_FILE
if test 1014 -ne `wc -c <'lout/doc/tr.lout/ch3.25'`; then
echo shar: \"'lout/doc/tr.lout/ch3.25'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch3.25'
fi
if test -f 'lout/externs' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/externs'\"
else
echo shar: Extracting \"'lout/externs'\" \(79673 characters\)
sed "s/^X//" >'lout/externs' <<'END_OF_FILE'
X/*@externs:External Declarations@*********************************************/
X/* */
X/* LOUT: A HIGH-LEVEL LANGUAGE FOR DOCUMENT FORMATTING (VERSION 2.03) */
X/* COPYRIGHT (C) 1993 Jeffrey H. Kingston */
X/* */
X/* Jeffrey H. Kingston (je...@cs.su.oz.au) */
X/* Basser Department of Computer Science */
X/* The University of Sydney 2006 */
X/* AUSTRALIA */
X/* */
X/* This program is free software; you can redistribute it and/or modify */
X/* it under the terms of the GNU General Public License as published by */
X/* the Free Software Foundation; either version 1, or (at your option) */
X/* any later version. */
X/* */
X/* This program is distributed in the hope that it will be useful, */
X/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
X/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
X/* GNU General Public License for more details. */
X/* */
X/* You should have received a copy of the GNU General Public License */
X/* along with this program; if not, write to the Free Software */
X/* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
X/* */
X/* FILE: externs */
X/* MODULE: External Declarations */
X/* */
X/*****************************************************************************/
X#include <stdio.h>
X#include <string.h>
X
X/*****************************************************************************/
X/* */
X/* Include, font and database directories, and the DEBUG_ON and ASSERT_ON */
X/* flags (defined by -D options on the cc command line in the makefile). */
X/* */
X/* LATIN Non-zero means compile for ISO-LATIN-1 char set. */
X/* INCL_DIR The system directory where @Include files are kept */
X/* FONT_DIR The system directory where .AFM font files are kept */
X/* DATA_DIR The system directory where database files are kept */
X/* DEBUG_ON Non-zero means compile debug code (lout -d) */
X/* ASSERT_ON Non-zero means test assertions */
X/* */
X/* #define LATIN 0 */
X/* #define INCL_DIR "/usr/local/lib/lout/include" */
X/* #define FONT_DIR "/usr/local/lib/lout/font" */
X/* #define DATA_DIR "/usr/local/lib/lout/data" */
X/* #define DEBUG_ON 0 */
X/* #define ASSERT_ON 1 */
X/* */
X/*****************************************************************************/
X
X
X/*****************************************************************************/
X/* */
X/* File naming conventions and version */
X/* */
X/* LOUT_VERSION Version information */
X/* CROSS_DB The default name of the cross reference database */
X/* INDEX_SUFFIX The suffix of database index files */
X/* NEW_INDEX_SUFFIX The additional suffix of new database index files */
X/* DATA_SUFFIX The suffix of database data files */
X/* NEW_DATA_SUFFIX The additional suffix of new database data files */
X/* HYPH_FILENAME The default name of the unpacked hyphenation file */
X/* HYPH_SUFFIX The suffix of the packed hyphenation file */
X/* */
X/*****************************************************************************/
X
X#define LOUT_VERSION "Basser Lout Version 2.03 (April 1993)"
X#define CROSS_DB "lout"
X#define INDEX_SUFFIX ".li"
X#define NEW_INDEX_SUFFIX "x"
X#define DATA_SUFFIX ".ld"
X#define NEW_DATA_SUFFIX "x"
X#define HYPH_FILENAME "lout.hyph"
X#define HYPH_SUFFIX ".packed"
X
X/*****************************************************************************/
X/* */
X/* Significant Limits (other insignificant ones appear in other files) */
X/* */
X/* MAX_LEN The maximum value storable in type LENGTH */
X/* */
X/* MAX_FILES 1 + the maximum number of files. This cannot */
X/* exceed 256 without changing type FILE_NUM; and */
X/* it cannot exceed 255 without increasing MAX_WORD */
X/* (a WORD is used to hold an array indexed by filenum */
X/* in file z10.c). */
X/* */
X/* MAX_LINE 1 + the maximum length of an input line, in files */
X/* of all types. This cannot exceed 256, at least in */
X/* source files, unless the col_num field of FILE_POS */
X/* is enlarged beyond its present 1 byte unsigned */
X/* */
X/* MAX_WORD 1 + the maximum length of a word storable in an */
X/* object record, which includes all file path names */
X/* too. It is reasonable to make this MAX_LINE, since */
X/* a word longer than MAX_LINE cannot be read in */
X/* */
X/* MAX_OBJECT_REC 1 + the maximum size of an object record, measured */
X/* in ALIGNs. The value chosen should exceed */
X/* ceiling( (wr + MAX_WORD - 4) / sizeof(ALIGN) ) */
X/* where wr = sizeof(struct word_rec), so that words of */
X/* length MAX_WORD-1 can be stored in an object record */
X/* */
X/* MAX_FONT 1 + the maximum number of sized fonts. This can be */
X/* increased easily since font metric memory is */
X/* obtained as required from malloc(). */
X/* */
X/* MAX_LEX_STACK The maximum depth of @Includes and @Databases. */
X/* This can be increased easily if desired. */
X/* */
X/*****************************************************************************/
X
X#define MAX_LEN 32767
X#define MAX_FILES 255
X#define MAX_LINE 256
X#define MAX_WORD 256
X#define MAX_OBJECT_REC 73
X#define MAX_FONT 100
X#define MAX_LEX_STACK 5
X
X/*****************************************************************************/
X/* */
X/* Miscellaneous Macros */
X/* */
X/*****************************************************************************/
X
X#define BOOLEAN unsigned /* changed from: short unsigned */
X#define FALSE 0
X#define TRUE 1
X#define bool(x) (x ? "TRUE" : "FALSE")
X#define CHILD 0
X#define PARENT 1
X#define COL 0
X#define ROW 1
X#define dimen(x) (x == COL ? "COL" : "ROW" )
X#define nil ( (OBJECT) NULL )
X#define null ( (FILE *) NULL )
X
X#define max(a, b) ((a) < (b) ? (b) : (a))
X#define min(a, b) ((a) < (b) ? (a) : (b))
X#define ceiling(a, b) ( ((a) - 1)/(b) + 1 ) /* ceiling(a/b) */
X#define is_odd(x) ( (x) & 1 ) /* TRUE if x is odd number */
X
X
X/*****************************************************************************/
X/* */
X/* ALIGN - the most restrictive memory alignment type. */
X/* */
X/*****************************************************************************/
X
Xtypedef int ALIGN;
X
X
X/*****************************************************************************/
X/* */
X/* LENGTH - a distance measured in integral multiples of the basic unit. */
X/* */
X/*****************************************************************************/
X
Xtypedef short int LENGTH;
X
X
X/*****************************************************************************/
X/* */
X/* FONT_NUM - internal name for a font */
X/* */
X/*****************************************************************************/
X
Xtypedef unsigned char FONT_NUM;
X
X
X/*****************************************************************************/
X/* */
X/* GAP - what separates one object from another */
X/* */
X/*****************************************************************************/
X
Xtypedef struct
X{ unsigned char ospare; /* left for other things in STYLE */
X BOOLEAN omark : 1; /* TRUE if this gap is marked */
X BOOLEAN ojoin : 1; /* TRUE if joins exist across gap */
X unsigned ounits : 3; /* units of measurement: fixed, etc */
X unsigned omode : 3; /* spacing mode: edge-to-edge, etc */
X LENGTH owidth; /* width of the gap */
X} GAP;
X
X#define mark(x) (x).omark
X#define join(x) (x).ojoin
X#define units(x) (x).ounits
X#define mode(x) (x).omode
X#define width(x) (x).owidth
X
X#define SetGap(x, xmark, xjoin, xunits, xmode, xwidth) \
X( mark(x) = xmark, join(x) = xjoin, units(x) = xunits, \
X mode(x) = xmode, width(x) = xwidth \
X)
X
X#define GapCopy(x, y) \
X( mark(x) = mark(y), join(x) = join(y), units(x) = units(y), \
X mode(x) = mode(y), width(x) = width(y) \
X)
X
X#define ClearGap(x) SetGap(x, FALSE, TRUE, FIXED_UNIT, NO_MODE, 0)
X
X
X/*****************************************************************************/
X/* */
X/* STYLE - information about how to break text, etc. */
X/* */
X/*****************************************************************************/
X
Xtypedef struct
X{ GAP oline_gap; /* separation between lines */
X union {
X GAP ospace_gap; /* separation indiced by white space */
X struct {
X unsigned ohyph_style : 2; /* hyphenation off or on */
X unsigned ofill_style : 2; /* fill lines with text off/on */
X unsigned odisplay_style : 3; /* display lines adjusted, ragged... */
X } oss;
X } osu;
X} STYLE;
X
X#define line_gap(x) (x).oline_gap
X#define space_gap(x) (x).osu.ospace_gap
X#define font(x) (x).oline_gap.ospare
X#define hyph_style(x) (x).osu.oss.ohyph_style
X#define fill_style(x) (x).osu.oss.ofill_style
X#define display_style(x)(x).osu.oss.odisplay_style
X
X#define StyleCopy(x, y) \
X( GapCopy( line_gap(x), line_gap(y) ), \
X font(x) = font(y), \
X hyph_style(x) = hyph_style(y), \
X fill_style(x) = fill_style(y), \
X display_style(x) = display_style(y), \
X GapCopy( space_gap(x), space_gap(y) ) \
X)
X
X
X/*****************************************************************************/
X/* */
X/* CONSTRAINT - a size constraint */
X/* */
X/*****************************************************************************/
X
Xtypedef struct
X{ LENGTH obc;
X LENGTH obfc;
X LENGTH ofc;
X LENGTH osparec;
X} CONSTRAINT;
X
X#define bc(x) (x).obc
X#define bfc(x) (x).obfc
X#define fc(x) (x).ofc
X#define sparec(x) (x).osparec
X#define constrained(x) (bc(x)!=MAX_LEN || bfc(x)!=MAX_LEN || fc(x)!=MAX_LEN)
X
X#define SetConstraint(c,x,y,z) (bc(c) = (x), bfc(c) = (y), fc(c) = (z))
X#define CopyConstraint(x, y) (bc(x) = bc(y), bfc(x) = bfc(y), fc(x) = fc(y))
X#define FitsConstraint(b, f, c) (b <= bc(c) && b + f <= bfc(c) && f <= fc(c))
X
X#define ig_fnum(x) bc(constraint(x))
X#define ig_xtrans(x) bfc(constraint(x))
X#define ig_ytrans(x) fc(constraint(x))
X
X/*****************************************************************************/
X/* */
X/* FILE_NUM - the internal representation of a file */
X/* FILE_POS - a position in the set of input files */
X/* */
X/*****************************************************************************/
X
Xtypedef unsigned char FILE_NUM;
X#define NO_FILE 0
X
Xtypedef struct
X{ FILE_NUM ofile_num; /* no. of file this record is from */
X unsigned char ocol_num; /* column number this is related to */
X LENGTH oline_num; /* the line number of this record */
X} FILE_POS;
X
X#define file_num(x) (x).ofile_num
X#define col_num(x) (x).ocol_num
X#define line_num(x) (x).oline_num
X
X#define FposCopy(x, y) \
X( file_num(x) = file_num(y), \
X line_num(x) = line_num(y), \
X col_num(x) = col_num(y) \
X)
X
X/*@::declaration of OBJECT@***************************************************/
X/* */
X/* OBJECT - pointer to an arbitrary object (parse tree, symbol table, ...) */
X/* */
X/*****************************************************************************/
X
X#define LIST struct { union rec *opred, *osucc; }
X
Xtypedef union rec
X{
X struct word_type /* all fields of WORD, both token and object */
X { LIST olist[2];
X union
X { struct word_as_token
X { unsigned char otype;
X unsigned char ohspace;
X unsigned char ovspace;
X unsigned char orec_size;
X } oi1;
X
X struct word_as_object
X { unsigned char otype;
X BOOLEAN ogall_rec : 1;
X BOOLEAN obroken : 1;
X BOOLEAN othreaded : 1;
X BOOLEAN oexternal : 1;
X BOOLEAN oblocked : 1;
X BOOLEAN obackward : 1;
X BOOLEAN otrigger_externs : 1;
X BOOLEAN omust_expand : 1;
X FONT_NUM oword_font;
X unsigned char orec_size;
X } oi2;
X } ou1;
X union
X { FILE_POS ofpos;
X int oword_save_mark;
X } ou5;
X union
X { LENGTH oback[2];
X FILE *ofilep;
X /* union rec *ogall_sym; */
X } ou3;
X union
X { LENGTH ofwd[2];
X int ogall_pos;
X } ou4;
X unsigned char ostring[4];
X } os1;
X
X struct closure_type /* CLOSURE, both as token and object */
X { LIST olist[2];
X union
X { struct closure_as_token
X { unsigned char otype;
X unsigned char ohspace;
X unsigned char ovspace;
X unsigned char oprecedence;
X } oi1;
X
X struct closure_as_object
X { unsigned char otype;
X BOOLEAN ogall_rec : 1;
X BOOLEAN obroken : 1;
X BOOLEAN othreaded : 1;
X BOOLEAN oexternal : 1;
X BOOLEAN oblocked : 1;
X BOOLEAN obackward : 1;
X BOOLEAN otrigger_externs : 1;
X BOOLEAN omust_expand : 1;
X unsigned short ocross_type;
X } oi2;
X } ou1;
X FILE_POS ofpos;
X LENGTH oback[2];
X LENGTH ofwd[2];
X union
X { STYLE osave_style;
X CONSTRAINT oconstraint;
X } ou2;
X union rec *oactual;
X union
X { union rec *owhereto;
X LENGTH osave_mark;
X } ou3;
X union rec *oready_galls;
X } os2;
X
X struct object_type /* the general OBJECT */
X { LIST olist[2];
X union
X {
X struct
X { unsigned char otype;
X BOOLEAN ogall_rec : 1;
X BOOLEAN obroken : 1;
X BOOLEAN othreaded : 1;
X BOOLEAN oexternal : 1;
X BOOLEAN oblocked : 1;
X BOOLEAN obackward : 1;
X BOOLEAN otrigger_externs : 1;
X BOOLEAN omust_expand : 1;
X unsigned short ocross_type;
X } oi2;
X } ou1;
X FILE_POS ofpos;
X LENGTH oback[2];
X LENGTH ofwd[2];
X union
X { STYLE osave_style;
X CONSTRAINT oconstraint;
X } ou2;
X } os3;
X
X struct link_type /* LINK */
X { LIST olist[2];
X unsigned char otype;
X unsigned char onumber;
X unsigned char odb_targ;
X } os4;
X
X struct gapobj_type /* GAP_OBJ */
X { LIST olist[2];
X unsigned char otype;
X unsigned char ohspace;
X unsigned char ovspace;
X unsigned char oprecedence;
X FILE_POS ofpos;
X GAP ogap;
X int osave_badness; /* optimum paragraph breaker */
X LENGTH osave_space; /* optimum paragraph breaker */
X LENGTH osave_actual_gap; /* optimum paragraph breaker */
X union rec *osave_prev; /* optimum paragraph breaker */
X } os5;
X
X struct symbol_type
X { LIST olist[2];
X unsigned char otype;
X BOOLEAN ohas_lpar : 1;
X BOOLEAN ohas_rpar : 1;
X BOOLEAN oright_assoc : 1;
X BOOLEAN ois_target : 1;
X BOOLEAN ohas_target : 1;
X BOOLEAN oforce_target : 1;
X BOOLEAN ois_tag : 1;
X BOOLEAN ohas_tag : 1;
X BOOLEAN ohas_body : 1;
X BOOLEAN oindefinite : 1;
X BOOLEAN orecursive : 1;
X BOOLEAN ouses_extern_target : 1;
X BOOLEAN ois_extern_target : 1;
X BOOLEAN ois_key : 1;
X BOOLEAN ohas_key : 1;
X unsigned odirty : 1;
X unsigned char oprecedence;
X FILE_POS ofpos;
X union rec *oenclosing;
X union rec *osym_body;
X union rec *obase_uses;
X union rec *ouses;
X union rec *omarker;
X union rec *ocross_sym;
X union rec *oimports;
X unsigned char ouses_count;
X BOOLEAN ovisible : 1;
X BOOLEAN ohas_mark : 1;
X BOOLEAN ohas_join : 1;
X BOOLEAN ohas_par : 1;
X BOOLEAN ouses_galley : 1;
X short unsigned opredefined;
X } os6;
X
X struct cr_type
X { LIST olist[2];
X unsigned char otype;
X unsigned char otarget_state;
X FILE_NUM otarget_file;
X FILE_NUM ocr_file;
X union rec *otarget_val;
X int otarget_seq;
X int otarget_pos;
X int ocr_seq;
X int ogall_seq;
X union rec *osymb;
X union rec *ogall_tag;
X FILE_NUM ogall_tfile;
X FILE_NUM ogentag_file;
X int ogentag_seq;
X union rec *ogentag_fseq;
X } os7;
X
X struct ext_gall_type
X { LIST olist[2];
X unsigned char otype;
X FILE_NUM oeg_fnum;
X long oeg_fpos;
X long oeg_cont;
X union rec *oeg_symbol;
X } os8;
X
X struct uses_type
X { union rec *oitem;
X union rec *onext;
X } os9;
X
X struct hash_entry_type
X { LIST olist[1];
X } os10;
X
X} *OBJECT;
X
X#define succ(x, dim) (x)->os1.olist[dim].osucc
X#define pred(x, dim) (x)->os1.olist[dim].opred
X#define type(x) (x)->os1.ou1.oi1.otype
X#define gall_rec(x) (x)->os1.ou1.oi2.ogall_rec
X#define non_blocking(x) gall_rec(x)
X#define broken(x) (x)->os1.ou1.oi2.obroken
X#define external(x) (x)->os1.ou1.oi2.oexternal
X#define threaded(x) (x)->os1.ou1.oi2.othreaded
X#define blocked(x) (x)->os1.ou1.oi2.oblocked
X#define backward(x) (x)->os1.ou1.oi2.obackward
X#define sized(x) broken(x)
X#define seen_nojoin(x) blocked(x)
X#define must_expand(x) (x)->os1.ou1.oi2.omust_expand
X#define trigger_externs(x) (x)->os1.ou1.oi2.otrigger_externs
X#define hspace(x) (x)->os1.ou1.oi1.ohspace
X#define vspace(x) (x)->os1.ou1.oi1.ovspace
X#define word_font(x) (x)->os1.ou1.oi2.oword_font
X#define rec_size(x) (x)->os1.ou1.oi2.orec_size
X#define fpos(x) (x)->os2.ofpos
X#define back(x, dim) (x)->os2.oback[dim]
X#define fwd(x, dim) (x)->os2.ofwd[dim]
X#define size(x, dim) (back(x, dim) + fwd(x, dim))
X#define word_save_mark(x) (x)->os1.ou5.oword_save_mark
X#define string(x) (x)->os1.ostring
X
X#define precedence(x) (x)->os2.ou1.oi1.oprecedence
X#define cross_type(x) (x)->os2.ou1.oi2.ocross_type
X#define thr_state(x) cross_type(x)
X#define save_style(x) (x)->os2.ou2.osave_style
X#define constraint(x) (x)->os2.ou2.oconstraint
X#define actual(x) (x)->os2.oactual
X#define whereto(x) (x)->os2.ou3.owhereto
X#define save_mark(x) (x)->os2.ou3.osave_mark
X#define ready_galls(x) (x)->os2.oready_galls
X
X#define number(x) (x)->os4.onumber
X#define db_targ(x) (x)->os4.odb_targ
X#define gap(x) (x)->os5.ogap
X#define save_space(x) (x)->os5.osave_space
X#define save_badness(x) (x)->os5.osave_badness
X#define save_actual_gap(x) (x)->os5.osave_actual_gap
X#define save_prev(x) (x)->os5.osave_prev
X
X#define has_lpar(x) (x)->os6.ohas_lpar
X#define has_rpar(x) (x)->os6.ohas_rpar
X#define right_assoc(x) (x)->os6.oright_assoc
X#define is_target(x) (x)->os6.ois_target
X#define has_target(x) (x)->os6.ohas_target
X#define force_target(x) (x)->os6.oforce_target
X#define is_tag(x) (x)->os6.ois_tag
X#define has_tag(x) (x)->os6.ohas_tag
X#define has_body(x) (x)->os6.ohas_body
X#define indefinite(x) (x)->os6.oindefinite
X#define recursive(x) (x)->os6.orecursive
X#define predefined(x) (x)->os6.opredefined
X#define dirty(x) (x)->os6.odirty
X#define enclosing(x) (x)->os6.oenclosing
X#define sym_body(x) (x)->os6.osym_body
X#define base_uses(x) (x)->os6.obase_uses
X#define uses(x) (x)->os6.ouses
X#define marker(x) (x)->os6.omarker
X#define cross_sym(x) (x)->os6.ocross_sym
X#define imports(x) (x)->os6.oimports
X#define uses_count(x) (x)->os6.ouses_count
X#define visible(x) (x)->os6.ovisible
X#define has_mark(x) (x)->os6.ohas_mark
X#define has_join(x) (x)->os6.ohas_join
X#define has_par(x) (x)->os6.ohas_par
X#define uses_galley(x) (x)->os6.ouses_galley
X#define is_extern_target(x) (x)->os6.ois_extern_target
X#define uses_extern_target(x) (x)->os6.ouses_extern_target
X#define is_key(x) (x)->os6.ois_key
X#define has_key(x) (x)->os6.ohas_key
X
X#define target_state(x) (x)->os7.otarget_state
X#define target_val(x) (x)->os7.otarget_val
X#define target_file(x) (x)->os7.otarget_file
X#define target_seq(x) (x)->os7.otarget_seq
X#define target_pos(x) (x)->os7.otarget_pos
X#define cr_file(x) (x)->os7.ocr_file
X#define cr_seq(x) (x)->os7.ocr_seq
X#define gall_seq(x) (x)->os7.ogall_seq
X#define symb(x) (x)->os7.osymb
X#define gall_tag(x) (x)->os7.ogall_tag
X#define gall_tfile(x) (x)->os7.ogall_tfile
X#define gentag_file(x) (x)->os7.ogentag_file
X#define gentag_seq(x) (x)->os7.ogentag_seq
X#define gentag_fseq(x) (x)->os7.ogentag_fseq
X
X#define filep(x) (x)->os1.ou3.ofilep
X/* #define gall_sym(x) (x)->os1.ou3.ogall_sym */
X#define gall_pos(x) (x)->os1.ou4.ogall_pos
X#define left_pos(x) fwd(x, COL)
X#define save_scope(x) fwd(x, ROW)
X
X#define eg_fnum(x) (x)->os8.oeg_fnum
X#define eg_fpos(x) (x)->os8.oeg_fpos
X#define eg_cont(x) (x)->os8.oeg_cont
X#define eg_symbol(x) (x)->os8.oeg_symbol
X#define eg_scope(x) (x)->os8.oeg_scope
X
X#define item(x) (x)->os9.oitem
X#define next(x) (x)->os9.onext
X
X/*@::object types@************************************************************/
X/* */
X/* OBJECT, TOKEN AND OTHER TYPES inhabiting type(x) and predefined(x) */
X/* */
X/* Key letters in the adjacent comment indicate where the tag is legal: */
X/* */
X/* t a token type, pushed on token stack */
X/* o an object type (returned by reduce(), inserted by Manifest) */
X/* i an index type (a child of a galley header other than an object) */
X/* s a predefined symbol (some symbol table entry has this predefined()) */
X/* n an indefinite object i.e. one which is ignored in catenation ops */
X/* */
X/*****************************************************************************/
X
X#define LINK 0 /* a link between objects */
X#define GAP_OBJ 1 /* o a gap object */
X#define CLOSURE 2 /* to n a closure of a symbol */
X#define NULL_CLOS 3 /* to sn @Null */
X#define CROSS 4 /* to sn && (a cross reference obj) */
X#define HEAD 5 /* o n a galley header */
X#define SPLIT 6 /* o @Split */
X#define PAR 7 /* o a parameter of a closure */
X#define WORD 8 /* o a literal word */
X#define ROW_THR 9 /* o a row thread */
X#define COL_THR 10 /* o a column thread */
X#define ACAT 11 /* to s a sequence of &-ed objs */
X#define HCAT 12 /* to s a sequence of |-ed objs */
X#define VCAT 13 /* to s a sequence of /-ed objs */
X#define ONE_COL 14 /* to s @OneCol */
X#define ONE_ROW 15 /* to s @OneRow */
X#define WIDE 16 /* to s @Wide */
X#define HIGH 17 /* to s @High */
X#define HSCALE 18 /* to s @HScale */
X#define VSCALE 19 /* to s @HScale */
X#define SCALE 20 /* to s @Scale */
X#define HCONTRACT 21 /* to s @HContract */
X#define VCONTRACT 22 /* to s @VContract */
X#define HEXPAND 23 /* to s @HExpand */
X#define VEXPAND 24 /* to s @VExpand */
X#define PADJUST 25 /* to s @PAdjust */
X#define HADJUST 26 /* to s @HAdjust */
X#define VADJUST 27 /* to s @VAdjust */
X#define ROTATE 28 /* to s @Rotate */
X#define CASE 29 /* to s @Case */
X#define YIELD 30 /* to s @Yield */
X#define FONT 31 /* to s @Font */
X#define SPACE 32 /* to s @Space */
X#define BREAK 33 /* to s @Break */
X#define NEXT 34 /* to s @Next */
X#define ENV 35 /* to s @LEnv */
X#define CLOS 36 /* to s @LClos */
X#define LVIS 37 /* to s @LVis */
X#define OPEN 38 /* to s @Open */
X#define TAGGED 39 /* to s @Tagged */
X#define INCGRAPHIC 40 /* to s @IncludeGraphic */
X#define SINCGRAPHIC 41 /* to s @SysIncludeGraphic */
X#define GRAPHIC 42 /* to s @Graphic */
X
X#define TSPACE 43 /* t a space token, parser only */
X#define TJUXTA 44 /* t a juxta token, parser only */
X#define LBR 45 /* t s left brace token */
X#define RBR 46 /* t s right brace token */
X#define BEGIN 47 /* t s @Begin token */
X#define END 48 /* t s @End token */
X#define USE 49 /* t s @Use */
X#define GSTUB_NONE 50 /* t a galley stub, no rpar */
X#define GSTUB_INT 51 /* t galley stub internal rpar */
X#define GSTUB_EXT 52 /* t galley stub external rpar */
X#define INCLUDE 53 /* s @Include */
X#define SYS_INCLUDE 54 /* s @SysInclude */
X#define PREPEND 55 /* s @Prepend */
X#define SYS_PREPEND 56 /* s @SysPrepend */
X#define DATABASE 57 /* s @Database */
X#define SYS_DATABASE 58 /* s @SysDatabase */
X#define START 59 /* s \Start */
X
X#define DEAD 60 /* i a dead galley */
X#define UNATTACHED 61 /* i an inner, unsized galley */
X#define CLOSE_INDEX 62 /* i synchronize galley closing */
X#define RECEPTIVE 63 /* i a receptive object index */
X#define RECEIVING 64 /* i a receiving object index */
X#define RECURSIVE 65 /* i a recursive definite obj. */
X#define PRECEDES 66 /* i an ordering constraint */
X#define FOLLOWS 67 /* i other end of ordering c. */
X#define CROSS_FOLL 68 /* i following type cross-ref */
X#define GALL_FOLL 69 /* i galley with &&following */
X#define CROSS_TARG 70 /* i value of cross-ref */
X#define GALL_TARG 71 /* i target of these galleys */
X#define GALL_PREC 72 /* i galley with &&preceding */
X#define CROSS_PREC 73 /* i preceding type cross-ref */
X#define EXPAND_IND 74 /* i index of HEXPAND or VEXPD */
X#define THREAD 75 /* a sequence of threads */
X#define CROSS_SYM 76 /* cross-ref info */
X#define CR_ROOT 77 /* RootCross */
X#define MACRO 78 /* a macro symbol */
X#define LOCAL 79 /* a local symbol */
X#define LPAR 80 /* a left parameter */
X#define NPAR 81 /* a named parameter */
X#define RPAR 82 /* a right parameter */
X#define EXT_GALL 83 /* an external galley */
X#define CR_LIST 84 /* a list of cross references */
X#define DISPOSED 85 /* a disposed record */
X
X#define is_indefinite(x) ((x) >= CLOSURE && (x) <= HEAD)
X#define is_definite(x) ((x) >= SPLIT && (x) <= GRAPHIC)
X#define is_par(x) ((x) >= LPAR && (x) <= RPAR)
X#define is_index(x) ((x) >= DEAD && (x) <= EXPAND_IND)
X#define is_type(x) ((x) >= LINK && (x) < DISPOSED)
X#define is_filecom(x) ((x) >= INCLUDE && (x) <= SYS_DATABASE)
X
X/*@::miscellaneous constants@*************************************************/
X/* */
X/* Miscellaneous Globally Defined Constants */
X/* */
X/*****************************************************************************/
X
X/* gap modes occupying mode(x) */
X#define NO_MODE 0 /* for error detection: no mode */
X#define EDGE_MODE 1 /* edge-to-edge spacing */
X#define HYPH_MODE 2 /* edge-to-edge with hyphenation */
X#define MARK_MODE 3 /* mark-to-mark spacing */
X#define OVER_MODE 4 /* overstrike spacing */
X#define KERN_MODE 5 /* kerning spacing */
X#define TAB_MODE 6 /* tabulation spacing */
X#define ADD_HYPH 7 /* temp value used by FillObject */
X
X/* hyph_style(style) options */
X#define HYPH_UNDEF 0 /* hyphenation option undefined */
X#define HYPH_OFF 1 /* hyphenation off */
X#define HYPH_ON 2 /* hyphenation on */
X
X/* fill_style(style) options */
X#define FILL_UNDEF 0 /* fill option undefined */
X#define FILL_OFF 1 /* no filling of lines */
X#define FILL_ON 2 /* fill lines with text */
X
X/* display_style(style) options */
X#define DISPLAY_UNDEF 0 /* display option undefined */
X#define DISPLAY_ADJUST 1 /* adjust lines (except last) */
X#define DISPLAY_OUTDENT 2 /* outdent lines (except first) */
X#define DISPLAY_LEFT 3 /* left-justify lines, no adjust */
X#define DISPLAY_CENTRE 4 /* centre lines, no adjust */
X#define DISPLAY_RIGHT 5 /* right-justify lines, no adjust */
X#define DO_ADJUST 6 /* placed in ACATs when adjust need */
X
X/* sides of a mark */
X#define BACK 86 /* means 'lies to left of mark' */
X#define ON 87 /* means 'lies on mark' */
X#define FWD 88 /* means 'lies to right of mark' */
X
X/* statuses of thread objects */
X#define NOTSIZED 0 /* this thread object is not sized */
X#define SIZED 1 /* thread is sized but not printed */
X#define FINALSIZE 2 /* thread object's size is now final */
X
X/* constraint statuses */
X#define PROMOTE 89 /* this component may be promoted */
X#define CLOSE 90 /* must close dest before promoting */
X#define BLOCK 91 /* cannot promote this component */
X#define CLEAR 92 /* this constraint is now satisfied */
X
X/* gap increment types */
X#define ABS 93 /* absolute, e.g. 3p */
X#define INC 94 /* increment, e.g. +3p */
X#define DEC 95 /* decrement, e.g. -3p */
X
X/* file types */
X#define SOURCE_FILE 0 /* input file from command line */
X#define INCLUDE_FILE 1 /* @Include file */
X#define INCGRAPHIC_FILE 2 /* @IncludeGraphic file */
X#define DATABASE_FILE 3 /* database file */
X#define INDEX_FILE 4 /* database index file */
X#define FONT_FILE 5 /* font file */
X#define PREPEND_FILE 6 /* PostScript prologue file */
X#define HYPH_FILE 7 /* hyphenation file */
X#define HYPH_PACKED_FILE 8 /* packed hyphenation file */
X
X/* path types (i.e. sequences of directories for file searching) */
X#define SOURCE_PATH 0 /* path to search for source files */
X#define INCLUDE_PATH 1 /* path for @Include files */
X#define SYSINCLUDE_PATH 2 /* path for @SysInclude files */
X#define DATABASE_PATH 3 /* path for @Database files */
X#define SYSDATABASE_PATH 4 /* path for @SysDatabase files */
X#define FONT_PATH 5 /* path for fontdef files */
X
X/* units of measurement */
X#define NO_UNIT 0 /* no unit - for error detection */
X#define FIXED_UNIT 1 /* inches, cm, points, ems */
X#define FRAME_UNIT 2 /* f's (frame widths) */
X#define AVAIL_UNIT 3 /* a's (available spaces) */
X#define DEG_UNIT 4 /* d's (degrees) */
X#define NEXT_UNIT 5 /* b's (inners) */
X
X/* units of distance as multiples of the basic unit */
X#define CM 567 /* 1 centimetre */
X#define IN 1440 /* 1 inch */
X#define EM 120 /* 1 em (= 1/12 inch) */
X#define PT 20 /* 1 point (= 1/72 inch) */
X#define FR 4096 /* virtual unit for frame units */
X#define DG 128 /* virtual unit for degrees */
X#define SF 128 /* virtual unit for @Scale factors */
X
X/* precedences */
X#define NO_PREC 0 /* lower than any precedence */
X#define BEGIN_PREC 1 /* precedence of '@Begin' */
X#define END_PREC 2 /* precedence of '@End' */
X#define LBR_PREC 3 /* precedence of '{' */
X#define RBR_PREC 4 /* precedence of '}' */
X#define VCAT_PREC 5 /* precedence of / */
X#define HCAT_PREC 6 /* precedence of | */
X#define ACAT_PREC 7 /* precedence of & and white space */
X#define MIN_PREC 10 /* minimum precedence of user ops */
X#define MAX_PREC 100 /* maximim precedence of user ops */
X#define DEFAULT_PREC 100 /* default precedence of user ops */
X#define CROSSOP_PREC 101 /* precedence of cross op && */
X#define GAP_PREC 102 /* precedence of gap op after cat op */
X#define JUXTA_PREC 103 /* precedence of juxtaposition & */
X#define FORCE_PREC 104 /* higher than any precedence */
X
X/* error types */
X#define INTERN 0 /* internal error (i.e. bug) */
X#define FATAL 1 /* fatal error, abort now */
X#define WARN 2 /* warning, non-fatal */
X
X/*@::keywords@****************************************************************/
X/* */
X/* KEYWORDS */
X/* */
X/*****************************************************************************/
X
X#define KW_DEF "def"
X#define KW_FONTDEF "fontdef"
X#define KW_FORCE "force"
X#define KW_INTO "into"
X#define KW_IMPORT "import"
X#define KW_EXPORT "export"
X#define KW_PRECEDENCE "precedence"
X#define KW_ASSOC "associativity"
X#define KW_LEFT "left"
X#define KW_RIGHT "right"
X#define KW_BODY "body"
X#define KW_MACRO "macro"
X#define KW_NAMED "named"
X#define KW_NEXT "@Next"
X#define KW_WIDE "@Wide"
X#define KW_HIGH "@High"
X#define KW_ONE_COL "@OneCol"
X#define KW_ONE_ROW "@OneRow"
X#define KW_HSCALE "@HScale"
X#define KW_VSCALE "@VScale"
X#define KW_SCALE "@Scale"
X#define KW_HCONTRACT "@HContract"
X#define KW_VCONTRACT "@VContract"
X#define KW_HEXPAND "@HExpand"
X#define KW_VEXPAND "@VExpand"
X#define KW_PADJUST "@PAdjust"
X#define KW_HADJUST "@HAdjust"
X#define KW_VADJUST "@VAdjust"
X#define KW_ROTATE "@Rotate"
X#define KW_INCGRAPHIC "@IncludeGraphic"
X#define KW_SINCGRAPHIC "@SysIncludeGraphic"
X#define KW_GRAPHIC "@Graphic"
X#define KW_CASE "@Case"
X#define KW_YIELD "@Yield"
X#define KW_FONT "@Font"
X#define KW_SPACE "@Space"
X#define KW_BREAK "@Break"
X#define KW_ENV "@LEnv"
X#define KW_CLOS "@LClos"
X#define KW_LVIS "@LVis"
X#define KW_OPEN "@Open"
X#define KW_USE "@Use"
X#define KW_TAGGED "@Tagged"
X#define KW_DATABASE "@Database"
X#define KW_SYSDATABASE "@SysDatabase"
X#define KW_INCLUDE "@Include"
X#define KW_SYSINCLUDE "@SysInclude"
X#define KW_PREPEND "@PrependGraphic"
X#define KW_SYSPREPEND "@SysPrependGraphic"
X#define KW_TARGET "@Target"
X#define KW_FOLLOWING "following"
X#define KW_PRECEDING "preceding"
X#define KW_NOW "now"
X#define KW_NULL "@Null"
X#define KW_GALLEY "@Galley"
X#define KW_INPUT "@LInput"
X#define KW_SPLIT "@Split"
X#define KW_TAG "@Tag"
X#define KW_KEY "@Key"
X#define KW_CROSS "&&"
X
X#define KW_LBR "{"
X#define KW_RBR "}"
X#define KW_BEGIN "@Begin"
X#define KW_END "@End"
X
X#define KW_VCAT_NN "//"
X#define KW_VCAT_MN "^//"
X#define KW_VCAT_NJ "/"
X#define KW_VCAT_MJ "^/"
X#define KW_HCAT_NN "||"
X#define KW_HCAT_MN "^||"
X#define KW_HCAT_NJ "|"
X#define KW_HCAT_MJ "^|"
X#define KW_ACAT_NJ "&"
X#define KW_ACAT_MJ "^&"
X
X
X/*@::memory allocation and list macros@***************************************/
X/* */
X/* OBJECT GetMem(siz, pos) */
X/* OBJECT New(typ) */
X/* OBJECT NewWord(len, pos) */
X/* */
X/* Return a pointer to a new record, of appropriate length (in ALIGNs). */
X/* The New and NewWord versions initialise LIST, type and rec_size fields. */
X/* Note that NewWord must be used for WORD objects. */
X/* */
X/*****************************************************************************/
X#define USES_SIZE ceiling( sizeof(struct uses_type), sizeof(ALIGN) )
X
X#if DEBUG_ON
X#define newcount zz_newcount++,
X#else
X#define newcount
X#endif
X
X#define GetMem(siz, pos) \
X( newcount \
X (zz_size=(siz))>=MAX_OBJECT_REC ? \
X (OBJECT) Error(FATAL,pos,"word is too long") \
X : zz_free[zz_size] == nil ? zz_hold = GetMemory(zz_size, pos) \
X : (zz_hold = zz_free[zz_size], \
X zz_free[zz_size] = pred(zz_hold, CHILD), zz_hold) \
X)
X
X#if DEBUG_ON
X#define checknew(typ) \
X !is_type(typ) ? Error(INTERN, no_fpos,"New: type = %s", Image(typ)) : \
X zz_lengths[typ] == 0 ? Error(INTERN, no_fpos, "New: 0 length!") : 0,
X#else
X#define checknew(typ)
X#endif
X
X#define New(typ) \
X( checknew(typ) \
X GetMem(zz_lengths[typ], no_fpos), \
X type(zz_hold) = typ, \
X pred(zz_hold, CHILD) = succ(zz_hold, CHILD) = \
X pred(zz_hold, PARENT) = succ(zz_hold, PARENT) = zz_hold \
X)
X
X#define NewWord(len, pos) \
X( zz_size = sizeof(struct word_type) + (len) - 3, \
X GetMem(ceiling(zz_size, sizeof(ALIGN)), pos), /* RESETS zz_size */ \
X rec_size(zz_hold) = zz_size, type(zz_hold) = WORD, \
X pred(zz_hold, CHILD) = succ(zz_hold, CHILD) = \
X pred(zz_hold, PARENT) = succ(zz_hold, PARENT) = zz_hold \
X)
X
X
X/*****************************************************************************/
X/* */
X/* PutMem(x, siz) */
X/* Dispose(x) */
X/* */
X/* Dispose x, which is of size siz. Dispose works out the size itself. */
X/* */
X/*****************************************************************************/
X
X#if DEBUG_ON
X#define disposecount zz_disposecount++,
X#define setdisposed , type(zz_hold) = DISPOSED
X#else
X#define disposecount
X#define setdisposed
X#endif
X
X#define PutMem(x, siz) \
X( disposecount \
X zz_hold = (x), \
X zz_size = (siz), \
X pred(zz_hold, CHILD) = zz_free[zz_size], \
X zz_free[zz_size] = zz_hold \
X)
X
X#define Dispose(x) \
X( zz_hold = (x), \
X assert( pred(zz_hold, CHILD) == zz_hold, "Dispose: pred(CHILD)!" ), \
X assert( succ(zz_hold, CHILD) == zz_hold, "Dispose: succ(CHILD)!" ), \
X assert( pred(zz_hold, PARENT) == zz_hold, "Dispose: pred(PARENT)!" ), \
X assert( succ(zz_hold, PARENT) == zz_hold, "Dispose: succ(PARENT)!" ), \
X PutMem(zz_hold, type(zz_hold) == WORD ? rec_size(zz_hold) \
X : zz_lengths[type(zz_hold)]) \
X setdisposed \
X)
X
X/*@@**************************************************************************/
X/* */
X/* OBJECT Append(x, y, dir) */
X/* */
X/* Return the append of lists x and y (dir is PARENT or CHILD). */
X/* */
X/*****************************************************************************/
X
X#define Append(x, y, dir) \
X( zz_res = (x), zz_hold = (y), \
X zz_hold == nil ? zz_res : \
X zz_res == nil ? zz_hold : \
X ( zz_tmp = pred(zz_hold, dir), \
X pred(zz_hold, dir) = pred(zz_res, dir), \
X succ(pred(zz_res, dir), dir) = zz_hold, \
X pred(zz_res, dir) = zz_tmp, \
X succ(zz_tmp, dir) = zz_res \
X ) \
X)
X
X
X/*****************************************************************************/
X/* */
X/* OBJECT Delete(x, dir) */
X/* */
X/* Delete x from its dir list, and return succ(x, dir) or nil if none. */
X/* */
X/*****************************************************************************/
X
X#define Delete(x, dir) \
X( zz_hold = (x), \
X succ(zz_hold, dir) == zz_hold ? nil : \
X ( zz_res = succ(zz_hold, dir), \
X pred(zz_res, dir) = pred(zz_hold, dir), \
X succ(pred(zz_hold, dir), dir) = zz_res, \
X pred(zz_hold, dir) = succ(zz_hold, dir) = zz_hold, \
X zz_res \
X ) \
X)
X
X/*****************************************************************************/
X/* */
X/* OBJECT DeleteAndDispose(x, dir) */
X/* */
X/* Delete x as above, dispose it, and return succ(x, dir) or nil if none. */
X/* */
X/*****************************************************************************/
X
X#define DeleteAndDispose(x, dir) \
X( zz_hold = (x), \
X zz_res = succ(zz_hold, dir) == zz_hold ? nil : \
X ( pred(succ(zz_hold, dir), dir) = pred(zz_hold, dir), \
X succ(pred(zz_hold, dir), dir) = succ(zz_hold, dir) ), \
X pred(zz_hold, dir) = succ(zz_hold, dir) = zz_hold, \
X Dispose(zz_hold), \
X zz_res \
X)
X
X#define Down(x) succ(x, CHILD)
X#define NextDown(x) succ(x, CHILD)
X#define LastDown(x) pred(x, CHILD)
X#define PrevDown(x) pred(x, CHILD)
X#define Up(x) succ(x, PARENT)
X#define NextUp(x) succ(x, PARENT)
X#define LastUp(x) pred(x, PARENT)
X#define PrevUp(x) pred(x, PARENT)
X
X#define Child(y, link) \
Xfor( y = pred(link, PARENT); type(y) == LINK; y = pred(y, PARENT) )
X
X#define Parent(y, link) \
Xfor( y = pred(link, CHILD); type(y) == LINK; y = pred(y, CHILD) )
X
X
X/*****************************************************************************/
X/* */
X/* UpDim(x, dim) */
X/* DownDim(x, dim) */
X/* */
X/* Returns the dim'th child or parent link of node x (dim == COL or ROW). */
X/* */
X/*****************************************************************************/
X
X#define UpDim(x, dim) ( (dim) == COL ? succ(x, PARENT) : pred(x, PARENT) )
X#define DownDim(x, dim) ( (dim) == COL ? succ(x, CHILD) : pred(x, CHILD) )
X
X
X/*****************************************************************************/
X/* */
X/* OBJECT Link(x, y) */
X/* */
X/* Make y a child of x in the directed graph, using a new link. */
X/* The link node is returned. */
X/* */
X/*****************************************************************************/
X
X#define Link(x, y) \
X( xx_link = New(LINK), \
X Append(xx_link, (x), CHILD), \
X Append(xx_link, (y), PARENT) \
X)
X
X
X/*****************************************************************************/
X/* */
X/* OBJECT DeleteLink(link) */
X/* */
X/* Cut the link between nodes x and y of the directed graph. */
X/* Returns the link node of the next child of x, or x if none. */
X/* */
X/*****************************************************************************/
X
X#define DeleteLink(link) \
X( xx_link = (link), \
X Delete(xx_link, PARENT), \
X DeleteAndDispose(xx_link, CHILD) \
X)
X
X
X/*@@**************************************************************************/
X/* */
X/* DisposeChild(link) */
X/* */
X/* Delete link, and if its child is thereby unattached, dispose it. */
X/* */
X/*****************************************************************************/
X
X#define DisposeChild(link) \
X( xx_link = (link), \
X xx_tmp = Delete(xx_link, PARENT), \
X DeleteAndDispose(xx_link, CHILD), \
X succ(xx_tmp, PARENT) == xx_tmp ? DisposeObject(xx_tmp) : 0 \
X) /* end DisposeChild */
X
X
X/*****************************************************************************/
X/* */
X/* MoveLink(link, x, dir) */
X/* */
X/* Move the dir end of link from wherever it is now to node x. */
X/* */
X/*****************************************************************************/
X
X#define MoveLink(link, x, dir) \
X( xx_link = (link), \
X Delete(xx_link, 1 - (dir) ), \
X Append(xx_link, (x), 1 - (dir) ) \
X) /* end MoveLink */
X
X
X/*****************************************************************************/
X/* */
X/* TransferLinks(start_link, stop_link, dest_link) */
X/* */
X/* Move parent end of links start_link (inclusive) to stop_link (exclusive) */
X/* to just before dest_link. */
X/* */
X/*****************************************************************************/
X
X#define TransferLinks(start_link, stop_link, dest_link) \
X{ OBJECT xxstart = start_link, xxstop = stop_link, xxdest = dest_link; \
X if( xxstart != xxstop ) \
X { assert( type(xxstart) == LINK, "TransferLinks: start_link!" ); \
X Append(xxstart, xxstop, CHILD); /* actually a split */ \
X Append(xxstart, xxdest, CHILD); \
X } \
X}
X
X
X/*****************************************************************************/
X/* */
X/* DeleteNode(x) */
X/* */
X/* Delete node x and every edge attaching to x. */
X/* */
X/*****************************************************************************/
X
X#define DeleteNode(x) \
X{ xx_hold = (x); \
X while( Up(xx_hold) != xx_hold ) DeleteLink( Up(xx_hold) ); \
X while( Down(xx_hold) != xx_hold ) DeleteLink( Down(xx_hold) ); \
X Dispose(xx_hold); \
X}
X
X
X/*****************************************************************************/
X/* */
X/* MergeNode(x, y) */
X/* */
X/* Take all the children of y and make them children of x. */
X/* Take all the parents of y and make them parents of x. Dispose y. */
X/* */
X/*****************************************************************************/
X
X#define MergeNode(x, y) \
X{ xx_res = (x); xx_hold = (y); \
X xx_tmp = Delete(xx_hold, PARENT); \
X Append(xx_res, xx_tmp, PARENT); \
X xx_tmp = DeleteAndDispose(xx_hold, CHILD); \
X Append(xx_res, xx_tmp, CHILD); \
X} /* end MergeNode */
X
X
X/*****************************************************************************/
X/* */
X/* ReplaceNode(x, y) */
X/* */
X/* Move all the parent links of y to x. */
X/* */
X/*****************************************************************************/
X
X#define ReplaceNode(x, y) \
X( xx_tmp = Delete((y), PARENT), \
X Append((x), xx_tmp, PARENT) \
X) /* end ReplaceNode */
X
X
X/*@::scanning catenation objects@*********************************************/
X/* */
X/* FirstDefinite(x, link, y) */
X/* */
X/* On input, x is an object and link and y are undefined. On output there */
X/* are two cases: */
X/* */
X/* link != x. Then y is first definite child of x and link is its link. */
X/* */
X/* link == x. Then x has no definite child and y is undefined. */
X/* */
X/* A SPLIT object is considered to be definite if both its children are */
X/* definite. This condition is returned by SplitIsDefinite. */
X/* */
X/*****************************************************************************/
X
X#define FirstDefinite(x, link, y) \
X{ for( link = Down(x); link != x; link = NextDown(link) ) \
X { Child(y, link); \
X if( type(y) == SPLIT ? SplitIsDefinite(y) : is_definite(type(y)) ) \
X break; \
X } \
X} /* end FirstDefinite */
X
X
X/*****************************************************************************/
X/* */
X/* NextDefinite(x, link, y) */
X/* */
X/* On input, x is an object and link is a link to one of its children; y */
X/* is undefined. On output there are two cases: */
X/* */
X/* link != x. Then y is the first definite child of x following link, and */
X/* link is changed to be the link of y. */
X/* */
X/* link == x. Then x has no definite child following link, and y remains */
X/* undefined. */
X/* */
X/*****************************************************************************/
X
X#define NextDefinite(x, link, y) \
X{ for( link = NextDown(link); link != x; link = NextDown(link) ) \
X { Child(y, link); \
X if( type(y) == SPLIT ? SplitIsDefinite(y) : is_definite(type(y)) ) \
X break; \
X } \
X} /* end NextDefinite */
X
X
X/*****************************************************************************/
X/* */
X/* NextDefiniteWithGap(x, link, y, g) */
X/* */
X/* On input, x is an object and link is a link to one of its children; y */
X/* and g are undefined. On output there are two cases: */
X/* */
X/* link != x. Then y is the first definite child of x following link, and */
X/* link is changed to be the link of y. Also, g is defined */
X/* to be the gap just before y; this must exist and is tested */
X/* by an assert test. */
X/* */
X/* link == x. Then x has no definite child following link, and y and g */
X/* remain undefined. */
X/* */
X/*****************************************************************************/
X
X#define NextDefiniteWithGap(x, link, y, g) \
X{ g = nil; \
X for( link = NextDown(link); link != x; link = NextDown(link) ) \
X { Child(y, link); \
X if( type(y) == GAP_OBJ ) g = y; \
X else if( type(y)==SPLIT ? SplitIsDefinite(y):is_definite(type(y)) ) \
X { assert( g != nil, "NextDefinite: g == nil!" ); \
X break; \
X } \
X } \
X} /* end NextDefiniteWithGap */
X
X
X/*****************************************************************************/
X/* */
X/* LastDefinite(x, link, y) */
X/* */
X/* On input, x is an object and link and y are undefined. On output there */
X/* are two cases: */
X/* */
X/* link != x. Then y is the last definite child of x and link is its link. */
X/* */
X/* link == x. Then x has no definite child and y is undefined. */
X/* */
X/* A SPLIT object is considered to be definite if both its children are */
X/* definite. This condition is returned by SplitIsDefinite. */
X/* */
X/*****************************************************************************/
X
X#define LastDefinite(x, link, y) \
X{ for( link = LastDown(x); link != x; link = PrevDown(link) ) \
X { Child(y, link); \
X if( type(y) == SPLIT ? SplitIsDefinite(y) : is_definite(type(y)) ) \
X break; \
X } \
X} /* end LastDefinite */
X
X
X/*****************************************************************************/
X/* */
X/* PrevDefinite(x, link, y) */
X/* */
X/* On input, x is an object and link is a link to one of its children; y */
X/* is undefined. On output there are two cases: */
X/* */
X/* link != x. Then y is the first definite child of x preceding link, and */
X/* link is changed to be the link of y. */
X/* */
X/* link == x. Then x has no definite child preceding link, and y remains */
X/* undefined. */
X/* */
X/*****************************************************************************/
X
X#define PrevDefinite(x, link, y) \
X{ for( link = PrevDown(link); link != x; link = PrevDown(link) ) \
X { Child(y, link); \
X if( type(y) == SPLIT ? SplitIsDefinite(y) : is_definite(type(y)) ) \
X break; \
X } \
X} /* end PrevDefinite */
X
X
X/*@::module declarations@*****************************************************/
X/* */
X/* MODULE DECLARATIONS */
X/* */
X/*****************************************************************************/
X
X/***** z01.c Start Up ******************************/
Xextern main(); /* main program */
Xextern OBJECT StartSym; /* sym tab entry for \Start */
Xextern OBJECT GalleySym; /* sym tab entry for @Galley */
Xextern OBJECT InputSym; /* sym tab entry for \Input */
Xextern OBJECT PrintSym; /* sym tab entry for \Print */
Xextern BOOLEAN AllowCrossDb; /* true when -s flag absent */
Xextern BOOLEAN Encapsulated; /* true when eps wanted */
Xextern BOOLEAN StringBeginsWith(); /* string compare */
Xextern BOOLEAN StringContains(); /* string search */
X
X/***** z02.c Lexical Analyser ******************************/
Xextern LexInit(); /* initialise lex. analyser */
Xextern LexPush(); /* switch to new file list */
Xextern LexPop(); /* return to prev. file list */
Xextern BOOLEAN LexLegalName(); /* check identifier format */
Xextern OBJECT LexGetToken(); /* get next token from input */
Xextern long LexNextTokenPos(); /* like ftell() on curr file */
X
X/***** z03.c File Service ******************************/
Xextern FILE_POS *no_fpos; /* a null filepos */
Xextern InitFiles(); /* initialize this module */
Xextern AddToPath(); /* add directory to path */
Xextern FILE_NUM DefineFile(); /* declare input file */
Xextern FILE_NUM FirstFile(); /* first file of given type */
Xextern FILE_NUM NextFile(); /* next file of given type */
Xextern FILE_NUM FileNum(); /* file with given name */
Xextern unsigned char *FileName(); /* file name of file */
Xextern unsigned char *EchoFilePos(); /* string value of FILE_POS */
Xextern FILE_POS *PosOfFile(); /* string of file's FILE_POS */
Xextern FILE *OpenFile(); /* open file for reading */
Xextern FILE *OpenIncGraphicFile(); /* open @IncludeGraphic file */
Xextern OBJECT ReadFromFile(); /* read object from file */
Xextern AppendToFile(); /* append object to file */
Xextern CloseFiles(); /* close database files */
X
X/***** z04.c Token Service ******************************/
Xextern OBJECT NewToken(); /* get a new token */
Xextern OBJECT CopyTokenList(); /* copy a list of tokens */
Xextern unsigned char *EchoCatOp(); /* string value of CAT op */
Xextern unsigned char *EchoToken(); /* returns image of token */
X
X/***** z05.c Definitions Reader ******************************/
Xextern ReadDefinitions(); /* read definitions */
X
X/***** z06.c Parser ******************************/
Xextern InitParser(); /* initialise parser */
Xextern OBJECT Parse(); /* parser */
X
X/***** z07.c Object Service ******************************/
Xextern OBJECT MakeWord(); /* a new WORD object */
Xextern OBJECT MakeWordTwo(); /* a new WORD object */
Xextern OBJECT CopyObject(); /* make a copy of an object */
Xextern DisposeObject(); /* dispose an object */
Xextern BOOLEAN SplitIsDefinite(); /* TRUE if SPLIT is definite */
X
X/***** z08.c Object Manifest ******************************/
Xextern OBJECT ReplaceWithTidy(); /* tidy up an object */
Xextern OBJECT Manifest(); /* manifest an object */
X
X/***** z09.c Closure Expansion ******************************/
Xextern OBJECT SetEnv(); /* build up environment */
Xextern AttachEnv(); /* attach env. to object */
Xextern OBJECT SearchEnv(); /* search environment */
Xextern OBJECT GetEnv(); /* retrieve env. from object */
Xextern OBJECT DetachEnv(); /* retrieve and detach env. */
Xextern OBJECT ClosureExpand(); /* expand a user-def CLOSURE */
X
X/***** z10.c Cross References ******************************/
Xextern CrossInit(); /* initialize cr record */
Xextern OBJECT CrossGenTag(); /* generates a tag */
Xextern OBJECT CrossMake(); /* returns a cross-reference */
Xextern OBJECT GallTargEval(); /* returns the value of a cr */
Xextern OBJECT CrossExpand(); /* returns the value of a cr */
Xextern CrossSequence(); /* record cr off root galley */
Xextern CrossClose(); /* close down this module */
X
X/***** z11.c Style Service ******************************/
Xextern BreakChange(); /* change line spacing */
Xextern SpaceChange(); /* change word spacing */
Xextern unsigned char *EchoStyle(); /* string value of a style */
X
X/***** z12.c Size Finder ******************************/
Xextern OBJECT MinSize(); /* min. possible size of obj */
X
X/***** z13.c Object Breaking ******************************/
Xextern OBJECT BreakObject(); /* break object to fit width */
X
X/***** z14.c Object Filling ******************************/
Xextern OBJECT FillObject(); /* optimal paragraph breaker */
Xextern OBJECT SimpleFillObject(); /* simple paragraph breaker */
X
X/***** z15.c Size Constraints ******************************/
Xextern unsigned char *EchoConstraint(); /* string value of a constr. */
Xextern MinConstraint(); /* take minimum of two const */
Xextern EnlargeToConstraint(); /* enlarge obj to constraint */
Xextern RotateConstraint(); /* rotate constraints */
Xextern InvScaleConstraint(); /* inverse scale a constr. */
Xextern Constrained(); /* finds size constraint */
Xextern DebugConstrained(); /* debug constraint code */
X
X/***** z16.c Size Adjustments ******************************/
Xextern SetNeighbours(); /* locate definite neighbours*/
Xextern AdjustSize(); /* updates sizes if changed */
X
X/***** z17.c Gap Widths ******************************/
Xextern GetGap(); /* convert string gap to num */
Xextern LENGTH MinGap(); /* min. possible gap width */
Xextern LENGTH ExtraGap(); /* extra available gap width */
Xextern LENGTH ActualGap(); /* gap width for output */
Xextern unsigned char *EchoGap(); /* echo gap (cat. operator) */
X
X/***** z18.c Galley Transfer ******************************/
Xextern TransferInit(); /* initialise this module */
Xextern OBJECT TransferBegin(); /* begin transfer of galley */
Xextern TransferComponent(); /* transfer one component */
Xextern TransferEnd(); /* end galley transfer */
Xextern TransferClose(); /* close this module */
X
X/***** z19.c Galley Attaching ******************************/
Xextern OBJECT SearchGalley(); /* search galley for target */
Xextern AttachGalley(); /* start off a galley */
Xextern DetachGalley(); /* detach a galley */
X
X/***** z20.c Galley Flushing ******************************/
Xextern FlushGalley(); /* flush out a galley */
X
X/*** z21.c Galley Maker ******************************/
Xextern SizeGalley(); /* convert object to galley */
X
X/*** z22.c Galley Service ******************************/
Xextern FlushInners(); /* flush a list of galleys. */
Xextern ExpandRecursives(); /* expand recursive definite */
Xextern Promote(); /* promote components */
Xextern KillGalley(); /* destroy a galley */
Xextern FreeGalley(); /* free a galley to flush */
Xextern Interpose(); /* interpose a VCAT */
Xextern BOOLEAN TargetSymbol(); /* find target of galley */
Xextern int CheckConstraint(); /* check ordering constraint */
X
X/***** z23.c Galley Printer ******************************/
Xextern FixAndPrintObject(); /* fix and print component */
X
X/***** z24.c Back End ******************************/
Xextern PrintInit(); /* initialise this module */
Xextern FontStripQuotes(); /* convert quoted string */
Xextern FontDefine(); /* define a font */
Xextern FontChange(); /* change current font */
Xextern FontAtomSize(); /* set sizes of an atom */
Xextern LENGTH FontSize(); /* size of current font */
Xextern PrintPrologue(); /* print output prologue */
Xextern PrintOriginIncrement(); /* reset current o/p origin */
Xextern PrintAtom(); /* print atom at given pos */
Xextern PrintClose(); /* wrapup output stream */
Xextern CoordTranslate(); /* translate coord system */
Xextern CoordRotate(); /* rotate coord system */
Xextern CoordScale(); /* scale coord system */
Xextern SaveGraphicState(); /* save coord system etc. */
Xextern RestoreGraphicState(); /* restore coord system etc. */
Xextern DefineGraphicNames(); /* define xsize, ysize, etc. */
Xextern PrintGraphicObject(); /* print PostScript object */
Xextern PrintGraphicInclude(); /* include PostScript file */
X
X/***** z25.c Object Echo ******************************/
Xextern unsigned char *EchoObject(); /* print object, file or str */
X
X/***** z26.c Echo Service ******************************/
Xextern BeginString(); /* begin string accumulator */
Xextern AppendString(); /* append to current string */
Xextern unsigned char *EndString(); /* return current string */
Xextern unsigned char *EchoLength(); /* echo a length */
Xextern unsigned char *Image(); /* string value of type(x) */
X
X/***** z27.c Debug Service ******************************/
Xextern DebugInit(); /* set debug flag */
Xextern Debug(); /* print debug o/p on stderr */
Xextern ProfileOn(); /* start profiling */
Xextern ProfileOff(); /* stop profiling */
Xextern ProfilePrint(); /* print profiling results */
X
X/***** z28.c Error Service ******************************/
Xextern ErrorInit(); /* initialise log file */
Xextern Error(); /* print error message */
Xextern BOOLEAN ErrorSeen(); /* TRUE after first error */
Xextern EnterErrorBlock(); /* new block of error mess's */
Xextern LeaveErrorBlock(); /* commit or discard block */
X
X/***** z29.c Symbol Table ******************************/
Xextern InitSym(); /* initialize table to empty */
Xextern PushScope(); /* push a new scope on stack */
Xextern PopScope(); /* pop a scope from stack */
Xextern SuppressVisible(); /* suppress visible flag */
Xextern UnSuppressVisible(); /* unsuppress visible flag */
Xextern SuppressScope(); /* suppress all scoping */
Xextern UnSuppressScope(); /* unsuppress scoping */
Xextern SwitchScope(); /* switch to a saved scope */
Xextern UnSwitchScope(); /* switch back from saved s. */
Xextern BodyParAllowed(); /* let body par be invoked */
Xextern BodyParNotAllowed(); /* don't let body par be inv */
Xextern OBJECT SearchSym(); /* search table for symbol */
Xextern OBJECT InsertSym(); /* insert a new symbol */
Xextern DeleteEverySym(); /* dispose all symbols */
Xextern unsigned char *SymName(); /* string name of a symbol */
Xextern unsigned char *FullSymName(); /* full path name of symbol */
Xextern OBJECT ChildSym(); /* return a child of a sym */
Xextern CheckSymSpread(); /* check hash table spread */
X
X/***** z30.c Symbol Uses ******************************/
Xextern InsertUses(); /* record symbol x uses y */
Xextern FlattenUses(); /* massage uses relation */
Xextern BOOLEAN SearchUses(); /* retrieve uses info */
Xextern OBJECT FirstExternTarget(); /* together these return all */
Xextern OBJECT NextExternTarget(); /* targets of extern galls */
X
X/***** z31.c Memory Allocator ******************************/
Xextern MemInit(); /* initialise mem. allocator */
Xextern OBJECT GetMemory(); /* get some fresh memory */
Xextern DebugMemory(); /* print memory usage */
Xextern OBJECT zz_free[]; /* array of free lists */
Xextern unsigned char zz_lengths[]; /* array of record lengths */
Xextern int zz_newcount; /* debug count of New calls */
Xextern int zz_disposecount; /* debug count of Disposes */
Xextern OBJECT zz_hold; /* temporary variable only */
Xextern OBJECT zz_tmp; /* temporary variable only */
Xextern OBJECT zz_res; /* temporary variable only */
Xextern int zz_size; /* temporary variable only */
Xextern OBJECT xx_link, xx_tmp; /* temporary variable only */
Xextern OBJECT xx_hold, xx_res; /* temporary variable only */
X
X/***** z32.c Counter Service ******************************/
Xextern OBJECT Next(); /* increment argument by one */
X
X/***** z33.c Database Service ******************************/
Xextern OBJECT OldCrossDb; /* cross refs from last run */
Xextern OBJECT NewCrossDb; /* cross refs from this run */
Xextern OBJECT DbCreate(); /* create writable database */
Xextern DbInsert(); /* insert into database */
Xextern DbConvert(); /* con. writable to readable */
Xextern OBJECT DbLoad(); /* open readable database */
Xextern BOOLEAN DbRetrieve(); /* retrieve from database */
Xextern BOOLEAN DbRetrieveNext(); /* next entry from database */
X
X/***** z34.c Rotation Service ******************************/
Xextern RotateSize(); /* calculate rotated size */
X
X/***** z35.c Time Keeper ******************************/
Xextern OBJECT MomentSym; /* the @Moment symbol */
Xextern InitTime(); /* initialize this module */
Xextern OBJECT StartMoment(); /* a copy of the init time */
Xextern unsigned char *TimeString(); /* a string containing time */
X
X/***** z36.c Hyphenation ******************************/
Xextern OBJECT Hyphenate(); /* hyphenate a paragraph */
X
X/*@::assert and debug code@***************************************************/
X/* */
X/* ASSERT AND DEBUG CODE */
X/* */
X/*****************************************************************************/
X
X#if ASSERT_ON
X#define assert(c, m) \
X ( (c) ? 0 : Error(INTERN, no_fpos, "Assert failed in %s", m) )
X#else
X#define assert(c, m) 0
X#endif
X
X#if DEBUG_ON
X
Xstruct dbs
X{ unsigned char *flag; /* external names for debug flags */
X BOOLEAN on[3]; /* the debug flags */
X};
Xextern struct dbs dbg[];
X
X/* debug routines */
X#define debug0(cat, urg, str) \
X if( dbg[cat].on[urg] ) Debug(cat, urg, str); else
X#define debug1(cat, urg, str, p1) \
X if( dbg[cat].on[urg] ) Debug(cat, urg, str, p1); else
X#define debug2(cat, urg, str, p1, p2) \
X if( dbg[cat].on[urg] ) Debug(cat, urg, str, p1, p2); else
X#define debug3(cat, urg, str, p1, p2, p3) \
X if( dbg[cat].on[urg] ) Debug(cat, urg, str, p1, p2, p3); else
X#define debug4(cat, urg, str, p1, p2, p3, p4) \
X if( dbg[cat].on[urg] ) Debug(cat, urg, str, p1, p2, p3, p4); else
X#define debug5(cat, urg, str, p1, p2, p3, p4, p5) \
X if( dbg[cat].on[urg] ) Debug(cat, urg, str, p1, p2, p3, p4, p5); else
X#define debug6(cat, urg, str, p1, p2, p3, p4, p5, p6) \
X if( dbg[cat].on[urg] ) Debug(cat, urg, str, p1, p2, p3, p4, p5, p6); else
X#define debug7(cat, urg, str, p1, p2, p3, p4, p5, p6, p7) \
X if( dbg[cat].on[urg] ) Debug(cat, urg, str, p1, p2, p3, p4, p5,p6,p7); else
X#define debug8(cat, urg, str, p1, p2, p3, p4, p5, p6, p7, p8) \
X if( dbg[cat].on[urg] ) Debug(cat, urg, str, p1, p2,p3,p4,p5,p6,p7,p8); else
X#define ifdebug(cat, urg, x) \
X if( dbg[cat].on[urg] ) { x; } else
X#define debug_init(str) \
X DebugInit(str)
X
X/* debug styles */
X#define D 0
X#define DD 1
X#define DDD 2
X
X/* debug flags */
X#define DSP 1 /* z01.c -dsp Supervise */
X#define DLA 2 /* z02.c -dla Lexical Analyser */
X#define DFS 3 /* z03.c -dfs File Service */
X#define DTS 4 /* z04.c -dts Token Service */
X#define DRD 5 /* z05.c -drd Read Definitions */
X#define DOP 6 /* z06.c -dop Object Parser */
X#define DOS 7 /* z07.c -dos Object Service */
X#define DOM 8 /* z08.c -dom Object Manifest */
X#define DCE 9 /* z09.c -dce Closure Expansion */
X#define DCR 10 /* z10.c -dcr Cross References */
X#define DSS 11 /* z11.c -dss Style Service */
X#define DSF 12 /* z12.c -dsf Size Finder */
X#define DOB 13 /* z13.c -dob Object Breaking */
X#define DOF 14 /* z14.c -dof Object Filling */
X#define DSC 15 /* z15.c -dsc Size Constraints */
X#define DSA 16 /* z16.c -dsa Size Adjustments */
X#define DGW 17 /* z17.c -dgw Gap Widths */
X#define DGT 18 /* z18.c -dgt Galley Transfer */
X#define DGA 19 /* z19.c -dgf Galley Attaching */
X#define DGF 20 /* z20.c -dgf Galley Flushing */
X#define DGM 21 /* z21.c -dgm Galley Maker */
X#define DGS 22 /* z22.c -dgs Galley Service */
X#define DGP 23 /* z23.c -dgp Galley Printer */
X#define DFT 24 /* z24.c -dft Font Tables */
X#define DOE 25 /* z25.c -doe Object Echo */
X#define DES 26 /* z26.c -des Echo Service */
X#define DZZ 27 /* z27.c -dzz Debug Service */
X#define DYY 28 /* z28.c -dyy Error Service */
X#define DST 29 /* z29.c -dst Symbol Table */
X#define DSU 30 /* z30.c -dsu Symbol Uses */
X#define DMA 31 /* z31.c -dma Memory Allocator */
X#define DCS 32 /* z32.c -dcs Counter Service */
X#define DBS 33 /* z33.c -dbs Database Service */
X#define DRS 34 /* z34.c -drs Rotation Service */
X#define DTK 35 /* z35.c -dtk Time Keeper */
X#define DHY 36 /* z36.c -dhy Hyphenation */
X#define DPP 37 /* -dpp Profiling */
X#define ANY 38 /* -d any */
X
X#else
X#define ifdebug(cat, urg, x)
X#define debug0(cat, urg, str)
X#define debug1(cat, urg, str, p1)
X#define debug2(cat, urg, str, p1, p2)
X#define debug3(cat, urg, str, p1, p2, p3)
X#define debug4(cat, urg, str, p1, p2, p3, p4)
X#define debug5(cat, urg, str, p1, p2, p3, p4, p5)
X#define debug6(cat, urg, str, p1, p2, p3, p4, p5, p6)
X#define debug7(cat, urg, str, p1, p2, p3, p4, p5, p6, p7)
X#define debug8(cat, urg, str, p1, p2, p3, p4, p5, p6, p7, p8)
X#define debug_init(str) Error(FATAL, no_fpos, \
X "%s - debug flags not implemented", str)
X#endif
END_OF_FILE
if test 79673 -ne `wc -c <'lout/externs'`; then
echo shar: \"'lout/externs'\" unpacked with wrong size!
fi
# end of 'lout/externs'
fi
echo shar: End of archive 2 \(of 30\).
cp /dev/null ark2isdone

Jeff Kingston

unread,
May 30, 1993, 11:51:32 PM5/30/93
to
Submitted-by: je...@joyce.cs.su.oz.au (Jeff Kingston)
Posting-number: Volume 37, Issue 101
Archive-name: lout/part03
Environment: UNIX

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: lout/z20.c lout/z24.c


# Wrapped by kent@sparky on Sun May 30 19:43:53 1993
PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 3 (of 30)."'
if test -f 'lout/z20.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/z20.c'\"
else
echo shar: Extracting \"'lout/z20.c'\" \(22873 characters\)
sed "s/^X//" >'lout/z20.c' <<'END_OF_FILE'
X/*@z20.c:Galley Flushing:FlushGalley()@***************************************/


X/* */
X/* LOUT: A HIGH-LEVEL LANGUAGE FOR DOCUMENT FORMATTING (VERSION 2.03) */
X/* COPYRIGHT (C) 1993 Jeffrey H. Kingston */
X/* */
X/* Jeffrey H. Kingston (je...@cs.su.oz.au) */
X/* Basser Department of Computer Science */
X/* The University of Sydney 2006 */
X/* AUSTRALIA */
X/* */
X/* This program is free software; you can redistribute it and/or modify */
X/* it under the terms of the GNU General Public License as published by */
X/* the Free Software Foundation; either version 1, or (at your option) */
X/* any later version. */
X/* */
X/* This program is distributed in the hope that it will be useful, */
X/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
X/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
X/* GNU General Public License for more details. */
X/* */
X/* You should have received a copy of the GNU General Public License */
X/* along with this program; if not, write to the Free Software */
X/* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
X/* */

X/* FILE: z20.c */
X/* MODULE: Galley Flushing */
X/* EXTERNS: FlushGalley() */
X/* */
X/*****************************************************************************/
X#include "externs"


X
X
X/*****************************************************************************/
X/* */

X/* ParentFlush(dest_index, kill) */
X/* */
X/* Flush the galley which is the parent of dest_index, if likely to flush. */
X/* If kill is TRUE, delete dest_index. */
X/* */
X/*****************************************************************************/
X
X#define ParentFlush(dest_index, kill) \
Xif( prnt_flush ) \
X{ debug0(DGF,D, " ParentFlush calling FlushGalley (prnt)"); \
X Parent(prnt, Up(dest_index)); \
X if( kill ) DeleteNode(dest_index); \
X debug0(DGF, D, " calling FlushGalley from ParentFlush"); \
X FlushGalley(prnt); \
X prnt_flush = FALSE; \
X} \
Xelse if( kill ) DeleteNode(dest_index)


X
X
X/*****************************************************************************/
X/* */

X/* FlushGalley(hd) */
X/* */
X/* Flush galley hd as far as possible. It could be the root galley. */
X/* */
X/*****************************************************************************/
X
XFlushGalley(hd)
XOBJECT hd;
X{ OBJECT dest; /* the target galley hd empties into */
X OBJECT dest_index; /* the index of dest */
X OBJECT inners; /* list of galleys and PRECEDES to flush */
X OBJECT link, y; /* for scanning through the components of hd */
X
X CONSTRAINT dest_constraint; /* the vertical size constraint on dest */
X int f; /* candidate replacement value for dest_fwd */
X
X OBJECT dest_encl; /* the VCAT enclosing dest, if any */
X int dest_side; /* if dest_encl != nil, the side dest is on */
X BOOLEAN need_adjust; /* TRUE as soon as dest_encl needs adjusting */
X LENGTH dest_back, dest_fwd; /* the current size of dest_encl or dest */
X LENGTH frame_size; /* the total constraint of dest_encl */
X OBJECT prec_gap; /* the gap preceding dest, if any, else nil */
X OBJECT prec_def; /* the component preceding dest, if any */
X OBJECT succ_gap; /* the gap following dest, if any, else nil */
X OBJECT succ_def; /* the component following dest, if any */
X OBJECT stop_link; /* most recently seen gap link of hd */
X BOOLEAN prnt_flush; /* TRUE when hd's parent needs a flush */
X OBJECT zlink, z, tmp, prnt;
X
X debug1(DGF, D, "[ FlushGalley %s (hd)", SymName(actual(hd)));
X prnt_flush = FALSE;
X
X RESUME:
X assert( type(hd) == HEAD, "FlushGalley: type(hd) != HEAD!" );
X debug1(DGF, D, " resuming FlushGalley %s, hd =", SymName(actual(hd)));
X ifdebug(DGF, DD, EchoObject(stderr, hd));
X assert( Up(hd) != hd, "FlushGalley: resume found no parent to hd!" );
X
X
X /*@@************************************************************************/
X /* */
X /* The first step is to examine the parent of galley hd to determine the */
X /* status of the galley. If this is not suitable for flushing, we do */
X /* what we can to change the status. If still no good, return; so if */
X /* this code does not return, then the galley is ready to flush into a */
X /* destination in the normal way, and the following variables are set: */
X /* */
X /* dest_index the galley's parent and index of its destination */
X /* dest the galley's destination, a @Galley object */
X /* */
X /***************************************************************************/
X
X Parent(dest_index, Up(hd));
X switch( type(dest_index) )
X {
X
X case DEAD:
X
X /* the galley has been killed off while this process was sleeping */
X debug1(DGF, D, "] FlushGalley %s returning (DEAD)", SymName(actual(hd)));
X debug1(DGF, D, " prnt_flush = %s", bool(prnt_flush));
X return;
X
X
X case UNATTACHED:
X
X /* the galley is currently not attached to a destination */
X AttachGalley(hd, &inners);
X Parent(dest_index, Up(hd));
X if( type(dest_index)!=RECEIVING || actual(actual(dest_index))==InputSym )
X { if( type(dest_index) != DEAD )
X { ParentFlush(dest_index, FALSE);
X if( inners != nil ) FlushInners(inners, nil);
X }
X debug1(DGF,D,"] FlushGalley %s retn, no attach", SymName(actual(hd)));
X debug1(DGF, D, " prnt_flush = %s", bool(prnt_flush));
X return;
X }
X
X /* if hd is a forcing galley, close all predecessors */
X if( actual(hd) != nil && force_target(actual(hd)) )
X { Parent(prnt, Up(dest_index));
X debug0(DGA, DD, " force: prnt =");
X ifdebug(DGA, DD, EchoObject(stderr, prnt));
X debug1(DGA, D," calling FreeGalley from FlushGalley(%s)",
X SymName(actual(hd)));
X FreeGalley(prnt, Up(dest_index), &inners, Up(dest_index), whereto(hd));
X prnt_flush = TRUE;
X debug0(DGA, DD, " force: after FreeGalley, prnt =");
X ifdebug(DGA, DD, EchoObject(stderr, prnt));
X }
X else prnt_flush = prnt_flush || blocked(dest_index);
X debug1(DGF, D, " prnt_flush = %s", bool(prnt_flush));
X
X if( inners != nil ) FlushInners(inners, nil);
X goto RESUME;
X break;
X
X
X case RECEIVING:
X
X if( actual(actual(dest_index)) == InputSym )
X { ParentFlush(dest_index, FALSE);
X debug1(DGF, D, "] FlushGalley %s retn, input", SymName(actual(hd)));
X debug1(DGF, D, " prnt_flush = %s", bool(prnt_flush));
X return;
X }
X break;
X
X
X default:
X
X Error(INTERN, &fpos(hd), "FlushGalley: %s ind!", Image(type(dest_index)));
X break;
X }
X dest = actual(dest_index);
X debug1(DGF, DD, " dest_index: %s", EchoObject(null, dest_index));
X
X
X /*@@************************************************************************/
X /* */
X /* The second step is to examine the components of the galley one by one */
X /* to determine if they can be promoted. Each component has the format */
X /* */
X /* { <index> } <object> */
X /* */
X /* and is always followed by a gap object (except the last component). */
X /* An index indicates that the following object has some interesting */
X /* feature, and it points to that feature inside the object. There are */
X /* two possible actions for each component, in addition to accepting it: */
X /* */
X /* REJECT: The component does not fit, so detach the galley */
X /* SUSPEND: The component is incomplete; go to sleep and wait */
X /* */
X /***************************************************************************/
X
X stop_link = dest_encl = inners = nil;
X need_adjust = FALSE;
X
X /***************************************************************************/
X /* */
X /* Loop invariant */
X /* */
X /* The children of hd up to but not including Child(link) have been */
X /* examined and pronounced to be promotable. */
X /* */
X /* stop_link is the link of the most recently encountered gap object of */
X /* hd, or nil if no gap object has been encountered yet. */
X /* */
X /* if dest_encl is non-nil, then the destination is not external, */
X /* dest_encl is its parent, and the following variables are defined: */
X /* */
X /* prec_gap gap object preceding dest (which must exist) */
X /* prec_def first definite object preceding dest (must exist) */
X /* dest_back back(dest_encl) including effect of accepted compts */
X /* dest_fwd fwd(dest_encl) including effect of accepted compts */
X /* dest_side BACK or FWD indicating dest's side of the mark */
X /* dest_constraint the size constraint on dest */
X /* frame_size size of frame enclosing dest_encl */
X /* */
X /* if dest_encl is nil, these variables are not defined. */
X /* */
X /* need_adjust is true if at least one definite component has been */
X /* accepted for promotion and the destination is internal; hence, */
X /* dest_encl is defined and its size needs to be adjusted. */
X /* */
X /* inners is the set of all PRECEDES and UNATTACHED indexes found. */
X /* */
X /***************************************************************************/
X
X for( link = Down(hd); link != hd; link = NextDown(link) )
X {
X Child(y, link);
X if( type(y) == SPLIT ) Child(y, DownDim(y, ROW));
X debug1(DGF, DD, " try to flush %s", EchoObject(null, y));
X switch( type(y) )
X {
X
X case GAP_OBJ:
X
X prec_gap = y;
X stop_link = link;
X if( !join(gap(y)) ) seen_nojoin(hd) = TRUE;
X break;
X
X
X case EXPAND_IND:
X case GALL_PREC:
X case GALL_FOLL:
X case GALL_TARG:
X case CROSS_PREC:
X case CROSS_FOLL:
X case CROSS_TARG:
X
X break;
X
X
X case PRECEDES:
X case UNATTACHED:
X
X if( inners == nil ) inners = New(ACAT);
X Link(inners, y);
X break;
X
X
X case RECEIVING:
X case RECEPTIVE:
X
X goto SUSPEND;
X
X
X case FOLLOWS:
X
X Child(tmp, Down(y));
X if( Up(tmp) == LastUp(tmp) )
X { link = PrevDown(link);
X DisposeChild(NextDown(link));
X break;
X }
X Parent(tmp, Up(tmp));
X assert(type(tmp) == PRECEDES, "Flush: PRECEDES!");
X switch( CheckConstraint(tmp, dest_index) )
X {
X case CLEAR: DeleteNode(tmp);
X link = PrevDown(link);
X DisposeChild(NextDown(link));
X break;
X
X case PROMOTE: break;
X
X case BLOCK: goto SUSPEND;
X
X case CLOSE: goto REJECT;
X }
X break;
X
X
X case WORD:
X case ONE_COL:
X case ONE_ROW:
X case WIDE:
X case HIGH:
X case HSCALE:
X case VSCALE:
X case HCONTRACT:
X case VCONTRACT:
X case HEXPAND:
X case VEXPAND:
X case PADJUST:
X case HADJUST:
X case VADJUST:
X case ROTATE:
X case SCALE:
X case INCGRAPHIC:
X case SINCGRAPHIC:
X case GRAPHIC:
X case ACAT:
X case HCAT:
X case ROW_THR:
X case CLOSURE:
X case NULL_CLOS:
X case CROSS:
X
X /* make sure y is not joined to a target below */
X for( zlink = NextDown(link); zlink != hd; zlink = NextDown(zlink) )
X { Child(z, zlink);
X switch( type(z) )
X {
X case RECEPTIVE:
X case RECEIVING: y = z;
X goto SUSPEND;
X break;
X
X case GAP_OBJ: if( !join(gap(z)) ) zlink = PrevDown(hd);
X break;
X
X default: break;
X }
X }
X
X /* check size constraint */
X if( !external(dest) )
X {
X /* initialise dest_encl etc if not done yet */
X if( dest_encl == nil )
X { assert( UpDim(dest,COL) == UpDim(dest,ROW), "FlushG: UpDims!" );
X Parent(dest_encl, NextDown(Up(dest)));
X assert( type(dest_encl) == VCAT, "FlushGalley: dest != VCAT!" );
X SetNeighbours(Up(dest), FALSE, &prec_gap, &prec_def,
X &succ_gap, &succ_def, &dest_side);
X assert(prec_gap != nil || is_indefinite(type(y)),
X "FlushGalley: prec_gap == nil && !is_indefinite(type(y))!" );
X assert(succ_gap == nil, "FlushGalley: succ_gap != nil!" );
X assert(dest_side == FWD || is_indefinite(type(y)),
X "FlushGalley: dest_side != FWD || !is_indefinite(type(y))!");
X dest_back = back(dest_encl, ROW);
X dest_fwd = fwd(dest_encl, ROW);
X Constrained(dest_encl, &dest_constraint, ROW);
X frame_size = constrained(dest_constraint) ? bfc(dest_constraint) :0;
X }
X
X if( !is_indefinite(type(y)) )
X { /* calculate effect of adding y to dest */
X f = dest_fwd + fwd(y, ROW) - fwd(prec_def, ROW) +
X ActualGap(fwd(prec_def, ROW), back(y, ROW),
X fwd(y, ROW), &gap(prec_gap), frame_size,
X dest_back + dest_fwd - fwd(prec_def, ROW));
X debug3(DGF, DD, " b,f: %s,%s; dest_encl: %s",
X EchoLength(dest_back), EchoLength(f),
X EchoConstraint(&dest_constraint));
X
X /* check new size against constraint */
X if( !FitsConstraint(dest_back,f,dest_constraint) )
X goto REJECT;
X if( units(gap(prec_gap))==FRAME_UNIT && width(gap(prec_gap)) > FR )
X goto REJECT;
X
X /* accept component */
X dest_fwd = f; prec_def = y;
X need_adjust = TRUE;
X }
X
X } /* end if( !external(dest) ) */
X
X /* accept this component into dest */
X debug1(DGF, D, " accept %s", EchoObject(null, y));
X prnt_flush = prnt_flush || blocked(dest_index);
X debug1(DGF, D, " prnt_flush = %s", bool(prnt_flush));
X if( inners != nil )
X { Promote(hd, NextDown(link), dest_index);
X if( need_adjust )
X { debug0(DSA, D, " calling AdjustSize from FlushGalley (ACCEPT)");
X AdjustSize(dest_encl, dest_back, dest_fwd, ROW);
X }
X FlushInners(inners, hd);
X goto RESUME;
X }
X break;
X
X
X default:
X
X Error(INTERN, &fpos(y), "FlushGalley: %s", Image(type(y)));
X break;
X
X } /* end switch */
X
X } /* end for */
X
X
X /* EMPTY: */
X
X /* galley is now completely accepted; clean up and exit */
X debug0(DGF, DD, " galley empty now");
X if( inners != nil ) DisposeObject(inners);
X if( Down(hd) != hd )
X { Promote(hd, hd, dest_index);
X if( need_adjust )
X { debug0(DSA, D, " calling AdjustSize from FlushGalley (EMPTY)");
X AdjustSize(dest_encl, dest_back, dest_fwd, ROW);
X }
X }
X DetachGalley(hd);
X debug0(DGF, D, " calling KillGalley from FlushGalley");
X KillGalley(hd);
X ParentFlush(dest_index, TRUE);
X debug1(DGF,D,"] FlushGalley %s returning (emptied).", SymName(actual(hd)));
X debug1(DGF, D, " prnt_flush = %s", bool(prnt_flush));
X return;
X
X
X REJECT:
X
X /* reject this component and move to a new dest */
X debug1(DGF, D, " reject %s", EchoObject(null, y));
X assert(actual(dest) != PrintSym, "FlushGalley: reject print!");
X if( inners != nil ) DisposeObject(inners);
X if( stop_link != nil )
X { Promote(hd, stop_link, dest_index);
X if( need_adjust )
X { debug0(DSA, D, " calling AdjustSize from FlushGalley (REJECT)");
X AdjustSize(dest_encl, dest_back, dest_fwd, ROW);
X }
X }
X DetachGalley(hd);
X assert( type(dest_index) == RECEIVING, "FlushGalley/REJECT: dest_index!" );
X prnt_flush = prnt_flush || blocked(dest_index); /* **** bug fix **** */
X DeleteNode(dest_index);
X goto RESUME;
X
X
X SUSPEND:
X
X /* suspend this component */
X debug1(DGF, D, " suspend %s", EchoObject(null, y));
X if( inners != nil ) DisposeObject(inners);
X if( stop_link != nil )
X { Promote(hd, stop_link, dest_index);
X if( need_adjust )
X { debug0(DSA, D, " calling AdjustSize from FlushGalley (SUSPEND)");
X AdjustSize(dest_encl, dest_back, dest_fwd, ROW);
X }
X }
X
X /* check whether external galleys can remove the blockage */
X if( type(y) == RECEPTIVE && ready_galls(hd) != nil && AllowCrossDb )
X { OBJECT eg, val, index2, hd2, tag, seq, newsym;
X BOOLEAN found, gall; unsigned char newtag[MAX_LINE], newseq[MAX_LINE];
X
X /* get first ready galley in from cross reference database */
X Child(eg, Down(ready_galls(hd)));
X val = ReadFromFile(eg_fnum(eg), eg_fpos(eg), nil);
X if( val == nil ) Error(FATAL, &fpos(y),
X "Error in database file %s", FileName(eg_fnum(eg)));
X assert( type(val) == CLOSURE, "AttachG: db CLOSURE!" );
X index2 = New(UNATTACHED);
X hd2 = New(HEAD);
X FposCopy(fpos(hd2), fpos(val));
X actual(hd2) = actual(val);
X backward(hd2) = TargetSymbol(val, &whereto(hd2));
X backward(hd2) = sized(hd2) = FALSE;
X ready_galls(hd2) = nil;
X must_expand(hd2) = TRUE;
X Link(index2, hd2);
X Link(hd2, val);
X Link(Up(y), index2);
X
X /* set up the next ready galley for reading next time */
X Child(tag, Down(eg)); Child(seq, LastDown(eg));
X do /* skip duplicate seq values */
X { found = DbRetrieveNext(OldCrossDb, &gall, &newsym,
X newtag, newseq, &eg_fnum(eg), &eg_fpos(eg), &eg_cont(eg));
X debug2(DGF, D, " ext gall found: %15s gall: %15s",
X bool(gall), bool(found));
X debug2(DGF, D, " ext gall new sym: %15s old sym: %15s",
X SymName(newsym), SymName(eg_symbol(eg)));
X debug2(DGF, D, " ext gall new tag: %15s old tag: %15s",
X newtag, string(tag));
X debug2(DGF, D, " ext gall new seq: %15s old seq: %15s",
X newseq, string(seq));
X if( found ) found = gall && newsym == eg_symbol(eg) &&
X strcmp(newtag, string(tag)) == 0;
X } while( found && strcmp(newseq, string(seq)) == 0 );
X if( found )
X { DisposeChild(Up(tag));
X DisposeChild(Up(seq));
X tag = MakeWord(newtag, no_fpos);
X seq = MakeWord(newseq, no_fpos);
X Link(eg, tag); Link(eg, seq);
X debug1(DGF,D, " another ext gall: into %s", SymName(newsym));
X }
X else
X { DisposeChild(Up(eg));
X debug1(DGF,D, " last ext gall into ", SymName(eg_symbol(eg)));
X if( Down(ready_galls(hd)) == ready_galls(hd) )
X { Dispose(ready_galls(hd));
X ready_galls(hd) = nil;
X debug0(DGF,D, " all ext galls exhausted");
X }
X }
X
X /* flush the ready galley found above, and resume */
X debug2(DGF, D, " ext gall FlushGalley (%s into %s)",
X SymName(actual(hd2)), SymName(whereto(hd2)));
X debug0(DGF, D, " calling FlushGalley from FlushGalley/SUSPEND");
X FlushGalley(hd2);
X goto RESUME;
X }
X else if( type(y) == RECEPTIVE && trigger_externs(y) && AllowCrossDb )
X { OBJECT sym, cr, ins, tag, seq, eg, cnt; BOOLEAN found;
X unsigned char newseq[MAX_LINE]; FILE_NUM tfnum; long tfpos, tcont;
X debug1(DGF, D, " ext gall target %s", SymName(actual(actual(y))));
X for( sym = FirstExternTarget(actual(actual(y)), &cnt);
X sym != nil; sym = NextExternTarget(actual(actual(y)), &cnt) )
X {
X debug1(DGF, D, " ext gall gall_targ %s", SymName(sym));
X cr = GallTargEval(sym, &fpos(actual(y)));
X ins = New(GALL_TARG);
X actual(ins) = cr;
X Link(Up(y), ins);
X Child(tag, LastDown(cr));
X assert( type(tag) == WORD, "FlushGalley: cr tag WORD!" );
X found = DbRetrieve(OldCrossDb, TRUE, sym, string(tag),
X newseq, &tfnum, &tfpos, &tcont);
X if( found )
X { if( ready_galls(hd) == nil ) ready_galls(hd) = New(ACAT);
X eg = New(EXT_GALL);
X debug1(DGF, D, " ext gall retrieved: into %s", SymName(sym));
X eg_fnum(eg) = tfnum;
X eg_fpos(eg) = tfpos;
X eg_symbol(eg) = sym;
X eg_cont(eg) = tcont;
X tag = MakeWord(string(tag), no_fpos);
X Link(eg, tag);
X seq = MakeWord(newseq, no_fpos);
X Link(eg, seq);
X Link(ready_galls(hd), eg);
X }
X }
X trigger_externs(y) = FALSE;
X if( ready_galls(hd) != nil ) goto RESUME;
X } /* end if external galleys */
X
X /* if non-blocking, delete the index and resume */
X if( type(y) == RECEPTIVE && non_blocking(y) )
X { DeleteNode(y);
X goto RESUME;
X }
X else if( type(y) == RECEIVING && non_blocking(y) )
X {
X if( Down(y) == y )
X { DeleteNode(y);
X }
X else
X { Child(z, Down(y));
X DetachGalley(z);
X }
X goto RESUME;
X }
X
X /* if all the above fail to remove the blockage, suspend */
X blocked(y) = TRUE;
X ParentFlush(dest_index, FALSE);
X debug1(DGF, D, " prnt_flush = %s", bool(prnt_flush));
X debug1(DGF, D, "] FlushGalley %s returning (suspend)", SymName(actual(hd)));
X return;
X
X} /* end FlushGalley */
END_OF_FILE
if test 22873 -ne `wc -c <'lout/z20.c'`; then
echo shar: \"'lout/z20.c'\" unpacked with wrong size!
fi
# end of 'lout/z20.c'
fi
if test -f 'lout/z24.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/z24.c'\"
else
echo shar: Extracting \"'lout/z24.c'\" \(56122 characters\)
sed "s/^X//" >'lout/z24.c' <<'END_OF_FILE'
X/*@z24.c:Back End:FontDefine(), FontChange(), FontAtomSize()@*****************/


X/* */
X/* LOUT: A HIGH-LEVEL LANGUAGE FOR DOCUMENT FORMATTING (VERSION 2.03) */
X/* COPYRIGHT (C) 1993 Jeffrey H. Kingston */
X/* */
X/* Jeffrey H. Kingston (je...@cs.su.oz.au) */
X/* Basser Department of Computer Science */
X/* The University of Sydney 2006 */
X/* AUSTRALIA */
X/* */
X/* This program is free software; you can redistribute it and/or modify */
X/* it under the terms of the GNU General Public License as published by */
X/* the Free Software Foundation; either version 1, or (at your option) */
X/* any later version. */
X/* */
X/* This program is distributed in the hope that it will be useful, */
X/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
X/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
X/* GNU General Public License for more details. */
X/* */
X/* You should have received a copy of the GNU General Public License */
X/* along with this program; if not, write to the Free Software */
X/* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
X/* */

X/* FILE: z24.c */
X/* MODULE: PostScript Back End */
X/* EXTERNS: PrintInit(), FontStripQuotes(), FontDefine(), */
X/* FontChange(), FontAtomSize(), FontSize(), */
X/* PrintPrologue(), PrintOriginIncrement(), PrintAtom(), */
X/* PrintClose() */
X/* CoordTranslate(), CoordRotate(), CoordScale(), */
X/* SaveGraphicState(), RestoreGraphicState(), */
X/* DefineGraphicNames, PrintGraphicObject() */
X/* */
X/* This module implements Lout's PostScript back end, by reading Adobe */
X/* font metrics files (.AFM files, version 2) and writing PostScript. */
X/* */
X/*****************************************************************************/
X#include "externs"
X#define DEFAULT_XHEIGHT 500
X
X#define printnum(x, fp) \
X{ unsigned char buff[20]; register int i, y; \
X if( x < 0 ) \
X { y = -x; \
X putc('-', fp); \
X } \
X else y = x; \
X i = 0; \
X do \
X { buff[i++] = (y % 10) + '0'; \
X } while( y = y / 10 ); \
X do \
X { putc(buff[--i], fp); \
X } while( i ); \


X}
X
X
X/*****************************************************************************/
X/* */

X/* FirstChar(str, ch, xfpos) */
X/* NextChar(str, ch, xfpos) */
X/* */
X/* FirstChar sets ch to the true (interpreted) value of the first */
X/* character of Lout string str. NextChar sets ch to the true value of */
X/* the next character, repeatedly. Both set ch to '\0' at end of string. */
X/* */
X/*****************************************************************************/
X
X#define FirstChar(str, ch, xfpos) p = str; NextChar(str, ch, xfpos)
X
X#define NextChar(str, ch, xfpos) \
X while( *p == '"' ) p++; \
X if( *p != '\\' ) ch = *p++; \
X else if( *++p >= '0' && *p <= '7' ) \
X { int count; \
X count = ch = 0; \
X do \
X { ch = ch * 8 + *p++ - '0'; \
X count++; \
X } while( *p >= '0' && *p <= '7' && count < 3 ); \
X if( ch == '\0' ) Error(WARN, xfpos, "null character \\0 in word"); \
X } \
X else if( *p == '"' ) ch = '"', ++p; \
X else if( *p == '\\' ) ch = '\\', ++p; \
X else \
X { Error(WARN, xfpos, "unknown ecape sequence \\%c in word", *p); \
X ch = *p++; \


X }
X
X
X/*****************************************************************************/
X/* */

X/* CheckLigature(str, ch, lig) */
X/* */
X/* Check whether character ch from string str starts a ligature. Use lig */
X/* as the source of information about what ligatures there are. If ch */
X/* does start a ligature, skip it and change ch to the ligature character. */
X/* */
X/* CheckLigature also modifies any ligature it finds to the form \?""" */
X/* where ? denotes the ligature character (assumed to be different from */
X/* the characters which normally may follow a \, i.e. 0123456789"\), and */
X/* " is used to fill up space. */
X/* */
X/*****************************************************************************/
X
X#define CheckLigature(str, ch, lig) \
X if( lig[ch] ) \
X { unsigned char *a, *b; \
X a = &lig[lig[ch] + MAX_CHARS]; \
X debug3(DFT, D, " CheckLigature(%s, %c, %s)", str, ch, a); \
X while( *a++ == ch ) \
X { b = p; \
X debug2(DFT, D, " checking a = %s, b = %s", a, b); \
X while( *a == *b && *(a+1) != '\0' && *b != '\0' ) a++, b++; \
X if( *(a+1) == '\0' ) \
X { *(p-1) = '\\'; \
X *p = ch = *a; \
X while( ++p < b ) *p = '"'; \
X debug1(DFT, D, " success: now str = %s", str); \
X break; \
X } \
X else \
X { while( *++a ); a++; \
X debug0(DFT, D, " failure"); \


X } \
X } \
X }
X
X

X/*****************************************************************************/
X/* */
X/* FontStripQuotes(str, xfpos) */
X/* */
X/* Destructively replace str by its unquoted version. */
X/* */
X/*****************************************************************************/
X
XFontStripQuotes(str, xfpos)
Xunsigned char *str; FILE_POS *xfpos;
X{ unsigned char *p, *q;
X int ch;
X debug1(DFT, D, "FontStripQuotes( %s )", str);
X q = str; FirstChar(str, ch, xfpos);
X while( ch != '\0' )
X { *q++ = ch;
X NextChar(str, ch, xfpos);
X }
X *q++ = '\0';
X debug1(DFT, D, "FontStripQuotes returning, result is %s", str);
X} /* end FontStripQuotes */


X
X
X/*@@**************************************************************************/
X/* */

X/* Definitions for metrics */
X/* */
X/*****************************************************************************/
X
X#define NO_FONT 0 /* the not-a-font font number */
X#define MAX_CHARS 256 /* maximum number of chars in a font */
X#define SZ_DFT 1000 /* default lout size is 50p */
X
X#define font_num(x) word_font(x)
X#define font_size(x) back(x, COL)
X#define font_xheight2(x) fwd(x, COL)
X
Xstruct metrics {
X LENGTH up;
X LENGTH down;
X LENGTH left;
X LENGTH right;
X};
X
Xstatic struct metrics *size_table[MAX_FONT]; /* metrics of sized fonts */
Xstatic unsigned char *lig_table[MAX_FONT]; /* ligatures */
Xstatic OBJECT font_table[MAX_FONT]; /* record of sized fonts */
Xstatic OBJECT font_root; /* root of tree of fonts */
Xstatic FONT_NUM fontcount; /* number of sized fonts */
X
Xstatic FILE *out_fp; /* output file */
Xstatic short currentfont; /* font of most recent atom */
Xstatic BOOLEAN cpexists; /* true if a current point exists */
Xstatic LENGTH currenty; /* if cpexists, its y coordinate */
Xstatic int wordcount; /* atoms printed since last newline */
Xstatic int pagecount; /* total number of pages printed */
Xstatic BOOLEAN prologue_done; /* TRUE after prologue is printed */
Xstatic OBJECT needs; /* Resource needs of included EPSFs */


X
X
X/*****************************************************************************/
X/* */

X/* PrintInit(file_ptr) */
X/* */
X/* Initialise this module. Output is to go to FILE file_ptr. */
X/* */
X/*****************************************************************************/
X
XPrintInit(file_ptr)
XFILE *file_ptr;
X{ debug0(DFT, D, "PrintInit()");
X out_fp = file_ptr;
X prologue_done = FALSE;
X currentfont = NO_FONT;
X cpexists = FALSE;
X wordcount = pagecount = 0;
X fontcount = 0;
X font_root = New(ACAT);
X needs = New(ACAT);
X debug0(DFT, D, "PrintInit returning.");


X}
X
X
X/*****************************************************************************/
X/* */

X/* FontDebug() */
X/* */
X/* Print out font tree. */


X/* */
X/*****************************************************************************/
X
X#if DEBUG_ON

Xstatic FontDebug()
X{ OBJECT family, face, filename, link, flink; int i;
X assert( font_root != nil && type(font_root)==ACAT, "FontDebug: font_root!" );
X for( link = Down(font_root); link != font_root; link = NextDown(link) )
X { Child(family, link);
X assert( type(family) == WORD, "FontDebug: family!" );
X fprintf(stderr, "family %s:\n", string(family));
X for( flink = Down(family); flink != family; flink = NextDown(flink) )
X { Child(face, flink);
X assert( type(face) == WORD, "FontDebug: face!" );
X fprintf(stderr, " face %s in file ", string(face));
X assert( Down(face) != face, "FontDebug: Down(face)!");
X Child(filename, Down(face));
X assert( type(filename) == WORD, "FontDebug: filename!" );
X fprintf(stderr, "%s\n", string(filename));
X }
X }
X for( i = 1; i <= fontcount; i++ )
X fprintf(stderr, " font_table[%d] = %s\n",
X i, EchoObject(null, font_table[i]));
X} /* end FontDebug */
X#endif
X
X/*@@**************************************************************************/
X/* */
X/* FontDefine(family, face, filename) */
X/* */
X/* Insert a font with this family, face and file name into the font tree. */
X/* */
X/*****************************************************************************/
X
XFontDefine(family, face, filename)
XOBJECT family, face, filename;
X{ OBJECT link, y;
X debug3(DFT, D, "FontDefine( %s, %s, %s )",
X string(family), string(face), string(filename) );
X
X /* insert family into font tree if not already present */
X for( link = Down(font_root); link != font_root; link = NextDown(link) )
X { Child(y, link);
X if( strcmp(string(y), string(family)) == 0 )
X { Dispose(family);
X family = y;
X break;
X }
X }
X if( link == font_root ) Link(font_root, family);
X
X /* insert face into family, or error if already present */
X for( link = Down(family); link != family; link = NextDown(link) )
X { Child(y, link);
X if( strcmp(string(y), string(face)) == 0 )
X { Error(WARN, &fpos(face), "font %s %s already defined at%s",
X string(family), string(face), EchoFilePos(&fpos(y)));
X debug0(DFT, D, "FontDefine returning: font already defined");
X return;
X }
X }
X Link(family, face);
X
X assert( type(filename) == WORD, "FontDefine: filename!" );
X Link(face, filename);
X Child(filename, Down(face));
X assert( type(filename) == WORD, "FontDefine: filename!" );
X debug0(DFT, D, "FontDefine returning.");
X /* ifdebug(DFT, DD, FontDebug()); */
X} /* end FontDefine */


X
X
X/*@@**************************************************************************/
X/* */

X/* static ReadFont(face, err) */
X/* */
X/* Read in a font file. Object err is used only for error reporting. */
X/* */
X/*****************************************************************************/
X
X#define is_letter(ch) ( ((ch)>='A' && (ch)<='Z') || ((ch)>='a' && (ch)<='z') )
X
Xstatic int find_ch(str, char_name)
Xunsigned char *str; OBJECT char_name[];
X{ int i;
X for( i = 0; i < MAX_CHARS; i++ )
X if( char_name[i] != nil && strcmp(string(char_name[i]), str) == 0 )
X return i;
X return -1;
X} /* end find_ch */
X
Xstatic ReadFont(face, err)
XOBJECT face, err;
X{ OBJECT filename, fontname;
X unsigned char buff[MAX_LINE], command[MAX_LINE];
X int wx, llx, lly, urx, ury, xheight2, ch, i, lnum, offset;
X BOOLEAN xhfound, chfound, wxfound, bfound;
X FILE *fp;
X struct metrics *fnt;
X unsigned char *lig;
X OBJECT char_name[MAX_CHARS], lig_list[MAX_CHARS];
X OBJECT x, y, z, link, zlink;
X char *malloc();
X assert( type(face) == WORD, "ReadFont: type(face) != WORD!" );
X debug1(DFT, DD, "ReadFont( %s, err )", string(face));
X
X /* initialize font number and font_table entries, char_name and lig_list */
X if( ++fontcount >= MAX_FONT )
X Error(FATAL, &fpos(err), "too many different fonts and sizes (max is %d)",
X MAX_FONT - 1);
X for( i = 0; i < MAX_CHARS; i++ ) char_name[i] = lig_list[i] = nil;
X
X /* open Adobe font metrics (.AFM) file */
X assert( Down(face) != face, "ReadFont: filename missing!" );
X Child(filename, Down(face));
X fp = OpenFile(DefineFile(filename, FONT_FILE, FONT_PATH), FALSE);
X if( fp == NULL ) Error(FATAL, &fpos(filename),
X "Cannot open font file %s", string(filename));
X fnt = (struct metrics *) malloc(MAX_CHARS * sizeof(struct metrics));
X if( ( (unsigned char *) fgets(buff, MAX_LINE, fp) ) != buff ||
X sscanf(buff, "%s", command) != 1 ||
X strcmp(command, "StartFontMetrics") != 0 )
X { Error(FATAL, &fpos(filename),
X "font file %s does not begin with StartFontMetrics", string(filename));
X }
X
X /* read font metrics file */
X xhfound = FALSE; fontname = nil; lnum = 1;
X while ( ( (unsigned char *) fgets(buff, MAX_LINE, fp) ) == buff )
X {
X lnum++;
X sscanf(buff, "%s", command);
X switch( command[0] )
X {
X
X case 'X':
X
X if( strcmp(command, "XHeight") == 0 )
X {
X if( xhfound )
X { Error(FATAL, &fpos(filename),
X "XHeight found twice in font file (line %d)", lnum);
X }
X sscanf(buff, "XHeight %d", &xheight2);
X xheight2 = xheight2 / 2;
X xhfound = TRUE;
X }
X break;
X
X
X case 'F':
X
X if( strcmp(command, "FontName") == 0 )
X { if( fontname != nil )
X { Error(FATAL, &fpos(filename),
X "FontName found twice in font file %s (line %d)",
X string(filename), lnum);
X }
X sscanf(buff, "FontName %s", command);
X fontname = MakeWord(command, &fpos(filename));
X if( string(fontname)[0] == '\0' )
X { Error(FATAL, &fpos(filename),
X "FontName empty in font file %s (line %d)",
X string(filename), lnum);
X }
X }
X break;
X
X
X case 'S':
X
X if( strcmp(command, "StartCharMetrics") == 0 )
X {
X if( fontname == nil ) Error(FATAL, &fpos(filename),
X "FontName missing in file %s", string(filename));
X if( !xhfound ) xheight2 = DEFAULT_XHEIGHT / 2;
X while( ( (unsigned char *) fgets(buff, MAX_LINE, fp) ) == buff )
X {
X debug1(DFT, DD, "ReadFont reading %s", buff);
X lnum++;
X sscanf(buff, "%s", command);
X if( strcmp(command, "EndCharMetrics") == 0 )
X {
X /* make a new font record and insert into font tree */
X font_size(fontname) = SZ_DFT;
X font_xheight2(fontname) = xheight2;
X font_num(fontname) = fontcount;
X font_table[fontcount] = fontname;
X size_table[fontcount] = fnt;
X Link(face, fontname);
X
X /* construct ligature table */
X ifdebug(DFT, D,
X fprintf(stderr, "Ligatures for font %s\n", string(filename));
X for( i = 0; i < MAX_CHARS; i++ )
X { fprintf(stderr, "%3d (%c) %s:\t", i, is_letter(i) ? i : '?',
X char_name[i] != nil ? string(char_name[i])
X : (unsigned char *) "<nil>" );
X x = lig_list[i];
X if( x != nil )


X for( link = Down(x); link != x; link = NextDown(link) )

X { fprintf(stderr, " L ");
X Child(y, link);
X for( zlink= Down(y); zlink != y; zlink = NextDown(zlink) )
X { Child(z, zlink);
X fprintf(stderr, " %s", string(z));
X }
X fprintf(stderr, " ;");
X }
X fprintf(stderr, "\n");
X }
X );
X lig = (unsigned char *) malloc(2*MAX_CHARS);
X if( lig == NULL ) Error(FATAL, &fpos(filename),
X "run out of memory reading font file %s", string(filename));
X for( i = 0; i < MAX_CHARS; i++ ) lig[i] = 0;
X offset = MAX_CHARS+1;
X for( ch = 0; ch < MAX_CHARS; ch++ )
X { if( lig_list[ch] == nil ) continue;
X lig[ch] = offset - MAX_CHARS;
X for( link = Down(lig_list[ch]); link != lig_list[ch]; link =
X NextDown(link) )
X { lig[offset++] = ch;
X Child(y, link);
X for( zlink = Down(y); zlink != y; zlink = NextDown(zlink) )
X { Child(z, zlink);
X if( offset >= 2*MAX_CHARS-3 ) Error(FATAL, &fpos(filename),
X "too many ligatures in font file %s", string(filename));
X i = find_ch(string(z), char_name);
X if( i == -1 ) Error(FATAL, &fpos(filename),
X "unknown character name %s in font file %s", string(z),
X string(filename));
X lig[offset++] = i;
X }
X lig[offset++] = '\0';
X }
X lig[offset++] = '\0';
X }
X lig_table[fontcount] = lig;
X
X /* debug and exit */
X fclose(fp);
X for( i = 0; i < MAX_CHARS; i++ )
X { if( char_name[i] != nil ) Dispose(char_name[i]);
X if( lig_list[i] != nil ) DisposeObject(lig_list[i]);
X }
X debug4(DFT, D, "ReadFont returning: %d, name %s, fs %d, xh2 %d",
X fontcount, string(fontname), font_size(fontname), xheight2);
X return;
X }
X ch = -1;
X chfound = wxfound = bfound = FALSE;
X i = 0; while( buff[i] == ' ' ) i++;
X while( buff[i] != '\n' )
X {
X sscanf(&buff[i], "%s", command);
X if( strcmp(command, "C") == 0 )
X { sscanf(&buff[i], "C %d", &ch);
X chfound = TRUE;
X }
X if( strcmp(command, "N") == 0 )
X { if( !chfound ) Error(FATAL, &fpos(filename),
X "N precedes C in font file %s (line %d)",
X string(filename), lnum);
X sscanf(&buff[i], "N %s", command);
X char_name[ch] = MakeWord(command, no_fpos);
X }
X else if( strcmp(command, "WX") == 0 )
X { sscanf(&buff[i], "WX %d", &wx);
X wxfound = TRUE;
X }
X else if( strcmp(command, "B") == 0 )
X { sscanf(&buff[i], "B %d %d %d %d", &llx, &lly, &urx, &ury);
X bfound = TRUE;
X }
X else if( strcmp(command, "L") == 0 )
X { if( !chfound ) Error(FATAL, &fpos(filename),
X "L precedes C in font file %s (line %d)",
X string(filename), lnum);
X if( lig_list[ch] == nil ) lig_list[ch] = New(ACAT);
X y = New(ACAT);
X Link(lig_list[ch], y);
X i++; /* skip L */
X while( buff[i] == ' ' ) i++;
X while( buff[i] != ';' && buff[i] != '\n' )
X { sscanf(&buff[i], "%s", command);
X z = MakeWord(command, no_fpos);
X Link(y, z);
X while( buff[i] != ' ' && buff[i] != ';' ) i++;
X while( buff[i] == ' ' ) i++;
X }
X }
X while( buff[i] != ';' && buff[i] != '\n' ) i++;
X if( buff[i] == ';' )
X { i++; while( buff[i] == ' ' ) i++;
X }
X }
X if( !chfound )
X { Error(FATAL, &fpos(filename),
X "C missing in font file %s (line %d)", string(filename), lnum);
X }
X if( !wxfound )
X { Error(FATAL, &fpos(filename),
X "WX missing in font file %s (line %d)", string(filename), lnum);
X }
X if( !bfound )
X { Error(FATAL, &fpos(filename),
X "B missing in font file %s (line %d)", string(filename), lnum);
X }
X if( ch >= 0 && ch < MAX_CHARS )
X { fnt[ch].left = llx;
X fnt[ch].down = lly - xheight2;
X fnt[ch].right = wx;
X fnt[ch].up = ury - xheight2;
X debug5(DFT, DD, " fnt[%c] = (%d,%d,%d,%d)", ch, fnt[ch].left,
X fnt[ch].down, fnt[ch].right, fnt[ch].up);
X }
X }
X Error(FATAL, &fpos(filename),
X "EndCharMetrics missing from font file %s", string(filename));
X }
X break;
X
X
X default:
X


X break;
X
X }
X }

X Error(FATAL, &fpos(filename),
X "StartCharMetrics missing from font file %s", string(filename));
X} /* end ReadFont */


X
X
X/*@@**************************************************************************/
X/* */

X/* FontChange(style, x) */
X/* */
X/* Returns an internal font number which is the current font changed */
X/* according to word object x. e.g. if current font is Roman 12p and x is */
X/* "-3p", then FontChange returns the internal font number of Roman 9p. */
X/* */
X/*****************************************************************************/
X
XFontChange(style, x)
XSTYLE *style; OBJECT x;
X{ /* register */ int i;
X OBJECT par[3], family, face, fsize, y, link, new, old, tmpf;
X GAP gp; LENGTH flen; int num, c; unsigned inc;
X struct metrics *newfnt, *oldfnt; char *malloc();
X debug2(DFT, D, "FontChange( %s, %s )", EchoStyle(style), EchoObject(null, x));
X assert( font(*style)>=0 && font(*style)<=fontcount, "FontChange: fontcount!");
X /* ifdebug(DFT, DD, FontDebug()); */
X
X /* set par[0..num-1] to the 1, 2 or 3 parameters of the font operator */
X num = 0;
X if( type(x) == WORD )
X { par[num++] = x;
X FontStripQuotes(string(x), &fpos(x));
X }
X else if( type(x) == ACAT )


X { for( link = Down(x); link != x; link = NextDown(link) )
X { Child(y, link);

X debug1(DFT, DD, " pars examining y = %s", EchoObject(null, y));
X if( type(y) == GAP_OBJ ) continue;
X if( type(y) != WORD || num >= 3 )
X { Error(WARN, &fpos(x), "error in left parameter of %s", KW_FONT);
X debug0(DFT, D, "FontChange returning: ACAT children");
X return;
X }
X par[num++] = y;
X FontStripQuotes(string(y), &fpos(x));
X }
X }
X else
X { Error(WARN, &fpos(x), "error in left parameter of %s", KW_FONT);
X debug0(DFT, D, "FontChange returning: wrong type");
X return;
X }
X debug1(DFT, DD, " found pars, num = %d", num);
X
X /* extract fsize parameter, if any */
X assert( num >= 1 && num <= 3, "FontChange: num!" );
X c = string(par[num-1])[0];
X if( c == '+' || c == '-' || (c >= '0' && c <= '9') )
X { fsize = par[num-1]; num--;
X }
X else fsize = nil;
X
X /* check for initial font case: must have family, face, and size */
X if( font(*style) == NO_FONT && (fsize == nil || num < 2) )
X Error(FATAL, &fpos(x), "initial font must have family, face and size");
X
X /* get font family */
X if( num == 2 )
X {
X /* par[0] contains a new family name */
X for( link = Down(font_root); link != font_root; link = NextDown(link) )
X { Child(family, link);
X if( strcmp(string(family), string(par[0])) == 0 ) break;
X }
X if( link == font_root )
X { Error(WARN,&fpos(par[0]), "font family %s not defined", string(par[0]));
X return;
X }
X }
X else
X { /* preserve current family */
X assert( Up(font_table[font(*style)]) != font_table[font(*style)],
X "FontChange: Up(font_table[font(*style)]) !" );
X Parent(face, Up(font_table[font(*style)]));
X assert( type(face) == WORD, "FontChange: type(face)!" );
X assert( Up(face) != face, "FontChange: Up(face)!" );
X Parent(family, Up(face));
X assert( type(family) == WORD, "FontChange: type(family)!" );
X }
X
X /* get font face */
X if( num != 0 )
X {
X /* par[num-1] contains a new face name */
X for( link = Down(family); link != family; link = NextDown(link) )
X { Child(face, link);
X if( strcmp(string(face), string(par[num-1])) == 0 ) break;
X }
X if( link == family )
X {
X /* missing face name; first check whether a family name was intended */
X for( link = Down(font_root); link != font_root; link = NextDown(link) )
X { Child(tmpf, link);
X if( strcmp(string(tmpf), string(par[num-1])) == 0 ) break;
X }
X if( font_root == Down(font_root) )
X { Error(FATAL, &fpos(par[num-1]), "there are no fonts");
X }
X else if( link != font_root )
X { Error(WARN, &fpos(par[num-1]),
X "font family name %s must be accompanied by a face name",
X string(par[num-1]));
X }
X else Error(WARN, &fpos(par[num-1]),
X "font face name %s not defined in font family %s",
X string(par[num-1]), string(family));
X return;
X }
X }
X else
X {
X /* preserve current face name */
X Parent(face, Up(font_table[font(*style)]));
X assert( type(face) == WORD, "FontChange: type(face)!" );
X assert( Up(face) != face, "FontChange: Up(face)!" );
X }
X
X /* get font size */
X if( fsize == nil ) flen = font_size(font_table[font(*style)]);
X else
X { GetGap(fsize, style, &gp, &inc);
X if( inc == ABS ) flen = width(gp);
X else if( font(*style) == NO_FONT )
X Error(FATAL, &fpos(fsize), "no font encloses this %s", string(fsize));
X else if( inc==INC ) flen = font_size(font_table[font(*style)])+width(gp);
X else if( inc==DEC ) flen = font_size(font_table[font(*style)])-width(gp);
X else Error(INTERN, &fpos(x), "GetGap returned inc = %d!", inc);
X }
X
X if( flen <= 0 )
X { Error(WARN, &fpos(fsize), "%s %s ignored: result is not positive",
X string(fsize), KW_FONT);
X return;
X }
X
X /* if the font file has not been read before, read it now */
X assert( Down(face) != face && type(Down(face)) == LINK, "FontChange: dn!" );
X if( Down(face) == LastDown(face) ) ReadFont(face, x);
X assert( Down(face) != LastDown(face), "FontChange: after ReadFont!" );
X
X /* search fonts of face for desired size; return if already present */
X for( link = NextDown(Down(face)); link != face; link = NextDown(link) )
X { Child(fsize, link);
X if( font_size(fsize) == flen )
X { font(*style) = font_num(fsize);
X SetGap( space_gap(*style), FALSE, TRUE, FIXED_UNIT, EDGE_MODE,
X size_table[font_num(fsize)][' '].right);
X debug2(DFT, D,"FontChange returning (old) %d (XHeight2 = %d)",
X font(*style), font_xheight2(font_table[font(*style)]));
X return;
X }
X }
X
X /* insert new sized font record into tree */
X if( ++fontcount >= MAX_FONT )
X Error(FATAL, &fpos(x), "too many different fonts and sizes (max is %d)",
X MAX_FONT - 1);
X assert( Down(face) != face && NextDown(Down(face)) != face, "FontChange!!" );
X Child(old, NextDown(Down(face)));
X assert( type(old) == WORD, "FontChange: old!" );
X new = MakeWord(string(old), no_fpos);
X Link(face, new);
X font_size(new) = flen;
X font_xheight2(new) = font_xheight2(old) * font_size(new) / font_size(old);
X font_num(new) = fontcount;
X font_table[fontcount] = new;
X size_table[fontcount] =
X (struct metrics *) malloc(MAX_CHARS * sizeof(struct metrics));
X lig_table[fontcount] = (unsigned char *) malloc(2*MAX_CHARS);
X
X /* scale old font to new size */
X newfnt = size_table[font_num(new)];
X oldfnt = size_table[font_num(old)];
X for( i = 0; i < MAX_CHARS; i++ )
X { newfnt[i].left = (oldfnt[i].left * font_size(new)) / font_size(old);
X newfnt[i].right = (oldfnt[i].right * font_size(new)) / font_size(old);
X newfnt[i].down = (oldfnt[i].down * font_size(new)) / font_size(old);
X newfnt[i].up = (oldfnt[i].up * font_size(new)) / font_size(old);
X }
X for( i = 0; i < 2*MAX_CHARS; i++ )
X lig_table[font_num(new)][i] = lig_table[font_num(old)][i];
X
X /* return new font number and exit */
X font(*style) = fontcount;
X SetGap( space_gap(*style), FALSE, TRUE, FIXED_UNIT, EDGE_MODE,
X size_table[fontcount][' '].right);
X debug2(DFT, D,"FontChange returning (scaled) %d (XHeight2 = %d)",
X font(*style), font_xheight2(font_table[font(*style)]));
X /* FontDebug(); */
X} /* end FontChange */
X
X/*@@**************************************************************************/
X/* */
X/* FontAtomSize(x) */
X/* */
X/* Set the horizontal and vertical sizes of literal atom x. */
X/* */
X/*****************************************************************************/
X
XFontAtomSize(x)
XOBJECT x;
X{
X /* register */ unsigned char *p;
X /* register */ int r, u, d, ch, newch;
X struct metrics *fnt; unsigned char *lig;
X
X debug2(DFT, D, "FontAtomSize( %s ), font = %d", string(x), word_font(x));
X FirstChar(string(x), ch, &fpos(x));
X debug1(DFT, DDD, " ch = %d", ch);
X if( ch == '\0' )
X { back(x, COL) = fwd(x, COL) = 0;
X back(x, ROW) = fwd(x, ROW) = 0;
X }
X else
X { if ( word_font(x) < 1 || word_font(x) > fontcount )
X Error(FATAL, &fpos(x), "%s operator missing, word is %s",
X KW_FONT, string(x));
X fnt = size_table[word_font(x)];
X lig = lig_table[word_font(x)];
X CheckLigature(string(x), ch, lig);
X d = fnt[ch].down;
X u = fnt[ch].up;
X r = fnt[ch].right;
X NextChar(string(x), ch, &fpos(x));
X CheckLigature(string(x), ch, lig);
X debug1(DFT, DDD, " ch = %d", ch);
X while( ch )
X { if( fnt[ch].up > u ) u = fnt[ch].up;
X if( fnt[ch].down < d ) d = fnt[ch].down;
X r += fnt[ch].right;
X NextChar(string(x), ch, &fpos(x));
X CheckLigature(string(x), ch, lig);
X debug1(DFT, DDD, " ch = %d", ch);
X }
X back(x, COL) = 0;
X fwd(x, COL) = max(r, 0);
X back(x, ROW) = max(u, 0);
X fwd(x, ROW) = max(-d, 0);
X }
X debug4(DFT, D, "FontAtomSize returning %hd %hd %hd %hd",
X back(x, COL), fwd(x, COL), back(x, ROW), fwd(x, ROW));
X} /* end FontAtomSize */


X
X
X/*****************************************************************************/
X/* */

X/* LENGTH FontSize(fnum, x) */
X/* */
X/* Return the size of this font. x is for error messages only. */
X/* */
X/*****************************************************************************/
X
XLENGTH FontSize(fnum, x)
XFONT_NUM fnum; OBJECT x;
X{
X debug1(DFT, D, "FontSize( %d )", fnum);
X assert( fnum <= fontcount, "FontSize!" );
X if( fnum <= 0 ) Error(FATAL, &fpos(x), "no current font at this point");
X debug1(DFT, D, "FontSize returning %d", font_size(font_table[fnum]));
X return font_size(font_table[fnum]);
X} /* end FontSize */


X
X
X/*@@**************************************************************************/
X/* */

X/* PrintPrologue(h, v) */
X/* */
X/* Generate the standard PostScript prologue, augmented with any @Prologue */
X/* or @SysPrologue files specified by the user. */
X/* The first non-empty page has width h and height v in Lout units. */
X/* The following PostScript operators are defined: */
X/* */
X/* scale_factor fnt scale and set font */
X/* x_coordinate x move to x_coordinate, current y coordinate */
X/* string s show string */
X/* number in result is number inches */
X/* number cm result is number centimetres */
X/* number pt result is number points */
X/* number sp result is number spaces */
X/* number vs result is number v's */
X/* number ft result is number font-sizes */
X/* */
X/* as well as loutgr, for use with Lout's @Graphic operator: */
X/* */
X/* xsize ysize xmark ymark fr vs sp loutgr - */
X/* */
X/* Define xmark, ymark, xsize, ysize to be the positions of */
X/* these features of x, and define symbols ft, vs and sp */
X/* to be the current font size, line separation, and space width. */
X/* */
X/*****************************************************************************/
X
XPrintPrologue(h, v)
XLENGTH h, v;
X{ FILE_NUM fnum;
X debug2(DGP, DD, "PrintPrologue: v = %d h = %d", v, h);
X
X /* print header comments for PostScript DSC 3.0 output */
X if( Encapsulated )
X fprintf(out_fp, "%%%!PS-Adobe-3.0 EPSF-3.0\n");
X else
X fprintf(out_fp, "%%%!PS-Adobe-3.0\n");
X fprintf(out_fp, "%%%%Creator: %s\n", LOUT_VERSION);
X fprintf(out_fp, "%%%%CreationDate: %s", TimeString());
X fprintf(out_fp, "%%%%DocumentNeededResources: (atend)\n");
X fprintf(out_fp, "%%%%Pages: (atend)\n");
X fprintf(out_fp, "%%%%BoundingBox: 0 0 %d %d\n", h/PT, v/PT);
X fprintf(out_fp, "%%%%EndComments\n");
X
X /* print procedure definitions part of header */
X fprintf(out_fp, "%%%%BeginProlog\n");
X fprintf(out_fp, "%%%%BeginResource: procset LoutStartUp\n");
X fprintf(out_fp, "/fnt { exch findfont exch scalefont setfont } def\n");
X fprintf(out_fp, "/x { currentpoint exch pop moveto } def\n");
X fprintf(out_fp, "/s { show } def\n");
X fprintf(out_fp, "/in { %d mul } def\n", IN);
X fprintf(out_fp, "/cm { %d mul } def\n", CM);
X fprintf(out_fp, "/pt { %d mul } def\n", PT);
X fprintf(out_fp, "/em { %d mul } def\n", EM);
X fprintf(out_fp, "/sp { louts mul } def\n");
X fprintf(out_fp, "/vs { loutv mul } def\n");
X fprintf(out_fp, "/ft { loutf mul } def\n");
X fprintf(out_fp, "/dg { } def\n");
X
X fputs("/loutgr {\n", out_fp);
X fputs(" /louts exch def\n", out_fp);
X fputs(" /loutv exch def\n", out_fp);
X fputs(" /loutf exch def\n", out_fp);
X fputs(" /ymark exch def\n", out_fp);
X fputs(" /xmark exch def\n", out_fp);
X fputs(" /ysize exch def\n", out_fp);
X fputs(" /xsize exch def\n} def\n", out_fp);
X
X /* print definitions used by Lout output when including EPSF files */
X /* copied from PostScript Language Reference Manual (2nd Ed.), page 726 */
X fputs("/BeginEPSF {\n", out_fp);
X fputs(" /LoutEPSFState save def\n", out_fp);
X fputs(" /dict_count countdictstack def\n", out_fp);
X fputs(" /op_count count 1 sub def\n", out_fp);
X fputs(" userdict begin\n", out_fp);
X fputs(" /showpage { } def\n", out_fp);
X fputs(" 0 setgray 0 setlinecap\n", out_fp);
X fputs(" 1 setlinewidth 0 setlinejoin\n", out_fp);
X fputs(" 10 setmiterlimit [] 0 setdash newpath\n", out_fp);
X fputs(" /languagelevel where\n", out_fp);
X fputs(" { pop languagelevel\n", out_fp);
X fputs(" 1 ne\n", out_fp);
X fputs(" { false setstrokeadjust false setoverprint\n", out_fp);
X fputs(" } if\n", out_fp);
X fputs(" } if\n", out_fp);
X fputs("} bind def\n", out_fp);
X
X fputs("/EndEPSF {\n", out_fp);
X fputs(" count op_count sub { pop } repeat\n", out_fp);
X fputs(" countdictstack dict_count sub { end } repeat\n", out_fp);
X fputs(" LoutEPSFState restore\n", out_fp);
X fputs("} bind def\n", out_fp);
X
X fputs("%%EndResource\n", out_fp);
X
X /* print prepend files (assumed to be organized as DSC 3.0 Resources) */
X for( fnum=FirstFile(PREPEND_FILE); fnum != NO_FILE; fnum=NextFile(fnum) )
X { char buff[MAX_LINE]; FILE *fp;
X if( (fp = OpenFile(fnum, FALSE)) == null )
X Error(WARN, PosOfFile(fnum), "cannot open %s file %s",
X KW_PREPEND, FileName(fnum));
X else if( fgets(buff, MAX_LINE, fp) == NULL )
X Error(WARN, PosOfFile(fnum), "%s file %s is empty",
X KW_PREPEND, FileName(fnum));
X else
X {
X if( !StringBeginsWith(buff, "%%BeginResource:") )
X Error(WARN, PosOfFile(fnum),
X "%s file %s lacks PostScript DSC 3.0 \"%%%%BeginResource:\" comment",
X KW_PREPEND, FileName(fnum));
X fputs(buff, out_fp);
X fprintf(out_fp, "\n%% %s file %s\n", KW_PREPEND, FileName(fnum));
X while( fgets(buff, MAX_LINE, fp) != NULL ) fputs(buff, out_fp);
X }
X }
X
X fputs("\n%%EndProlog\n\n", out_fp);
X fprintf(out_fp, "%%%%Page: ? %d\n", ++pagecount);
X fprintf(out_fp, "%%%%BeginPageSetup\n");
X fprintf(out_fp, "%.4f dup scale %d setlinewidth\n", 1.0 / PT, PT/2);
X fprintf(out_fp, "/pgsave save def\n");
X fprintf(out_fp, "%%%%EndPageSetup\n");
X prologue_done = TRUE;
X} /* end PrintPrologue */
X
X/*@@**************************************************************************/
X/* */
X/* PrintOriginIncrement(y) */
X/* */
X/* Move current vertical origin down by y. */
X/* */
X/*****************************************************************************/
X
XPrintOriginIncrement(y)
XLENGTH y;
X{ debug1(DGP, D, "PrintOriginIncrement( %d )", y );
X fprintf(out_fp, "\npgsave restore\nshowpage\n");
X cpexists = FALSE;
X currentfont = NO_FONT;
X if( Encapsulated )
X { PrintClose();
X Error(FATAL, no_fpos, "truncating -EPS document at end of first page");
X }
X fprintf(out_fp, "\n%%%%Page: ? %d\n", ++pagecount);
X fprintf(out_fp, "%%%%BeginPageSetup\n");
X fprintf(out_fp, "%.4f dup scale %d setlinewidth\n", 1.0 / PT, PT/2);
X fprintf(out_fp, "/pgsave save def\n");
X fprintf(out_fp, "%%%%EndPageSetup\n");
X wordcount = 0;


X}
X
X
X/*****************************************************************************/
X/* */

X/* PrintAtom(x, hpos, vpos) */
X/* */
X/* Print word x; its marks cross at the point (hpos, vpos). */
X/* */
X/*****************************************************************************/
X
XPrintAtom(x, hpos, vpos)
XOBJECT x; int hpos, vpos;
X{ unsigned char *p;
X
X debug4(DGP, DD, "PrintAtom( %s, %d, %d ) font %d", string(x),
X hpos, vpos, word_font(x));
X
X /* if font is different to previous word then print change */
X if (word_font(x) != currentfont)
X { currentfont = word_font(x);
X assert( type(font_table[currentfont])==WORD, "PrintAtom: font_table!" );
X if( string(font_table[currentfont])[0] == '\0' )
X { Error(INTERN, &fpos(font_table[currentfont]),
X "font bug: font %d, addr %d, string addr %d (hex 0x%x)",
X currentfont, font_table[currentfont],
X string(font_table[currentfont]), string(font_table[currentfont]));
X }
X fprintf(out_fp, "\n/%s %hd fnt\n",
X string(font_table[currentfont]), font_size(font_table[currentfont]));
X }
X
X /* move to coordinate of x */
X debug1(DGP, DDD, " xheight2 = %d", font_xheight2(font_table[currentfont]));
X vpos = vpos - font_xheight2(font_table[currentfont]);
X if( cpexists && currenty == vpos )
X { printnum(hpos, out_fp);
X fputs(" x", out_fp);
X }
X else
X { currenty = vpos;
X printnum(hpos, out_fp);
X putc(' ', out_fp);
X printnum(currenty, out_fp);
X fputs(" moveto", out_fp);
X cpexists = TRUE;
X }
X
X /* show string(x) */
X putc('(', out_fp);
X p = string(x);
X while( *p != '\0' ) switch( *p )
X {
X case '"': p++;
X break;
X
X case '\\': switch( *++p )
X {
X case '\0': break;
X
X case '"': putc(*p++, out_fp);
X break;
X
X case '\\':
X case '0':
X case '1':
X case '2':
X case '3':
X case '4':
X case '5':
X case '6':
X case '7': putc('\\', out_fp);
X putc(*p++, out_fp);
X break;
X
X default: /* denotes print in octal e.g. ligature */
X putc('\\', out_fp);
X fprintf(out_fp, "%03o", *p++);
X }
X break;
X
X case '(':
X case ')': putc('\\', out_fp);
X putc(*p++, out_fp);
X break;
X
X default: putc(*p++, out_fp);
X break;
X }
X if( ++wordcount >= 5 )
X { fputs(")s\n", out_fp); wordcount = 0;
X }
X else fputs(")s ", out_fp);
X
X debug0(DGP, DDD, "PrintAtom returning");
X} /* end PrintAtom */


X
X
X/*@@**************************************************************************/
X/* */

X/* PrintClose() */
X/* */
X/* Clean up this module and close output stream. */
X/* */
X/*****************************************************************************/
X
XPrintClose()
X{ OBJECT family, face, x, link, flink; BOOLEAN first_need;
X if( prologue_done )
X { fprintf(out_fp, "\npgsave restore\nshowpage\n");
X fprintf(out_fp, "%%%%Trailer\n");
X
X /* print document fonts line */
X /* *** obsolete DSC 1.0 version
X fprintf(out_fp, "%%%%DocumentFonts:");
X for( link = Down(font_root); link != font_root; link = NextDown(link) )
X { Child(family, link);
X for( flink = Down(family); flink != family; flink = NextDown(flink) )
X { Child(face, flink);
X if( LastDown(face) != Down(face) )
X { Child(x, LastDown(face));
X fprintf(out_fp, " %s", string(x));
X }
X }
X }
X fprintf(out_fp, "\n");
X *** */
X
X /* print resource requirements (DSC 3.0 version) - fonts */
X first_need = TRUE;
X for( link = Down(font_root); link != font_root; link = NextDown(link) )
X { Child(family, link);
X for( flink = Down(family); flink != family; flink = NextDown(flink) )
X { Child(face, flink);
X if( LastDown(face) != Down(face) )
X { Child(x, LastDown(face));
X fprintf(out_fp, "%s font %s\n",
X first_need ? "%%DocumentNeededResources:" : "%%+", string(x));
X first_need = FALSE;
X }
X }
X }
X
X /* print resource requirements (DSC 3.0 version) - included EPSFs */
X for( link = Down(needs); link != needs; link = NextDown(link) )
X { Child(x, link);
X assert(type(x) == WORD, "PrintClose: needs!" );
X fprintf(out_fp, "%s %s",
X first_need ? "%%DocumentNeededResources:" : "%%+", string(x));
X first_need = FALSE;
X }
X
X fprintf(out_fp, "%%%%Pages: %d\n", pagecount);
X fprintf(out_fp, "%%%%EOF\n");
X }
X DisposeObject(font_root);
X} /* end PrintClose */


X
X
X/*****************************************************************************/
X/* */

X/* CoordTranslate(xdist, ydist) */
X/* */
X/* Translate coordinate system by the given x and y distances. */
X/* */
X/*****************************************************************************/
X
XCoordTranslate(xdist, ydist)
XLENGTH xdist, ydist;
X{ debug2(DRS,D,"CoordTranslate(%s, %s)",
X EchoLength(xdist), EchoLength(ydist));
X fprintf(out_fp, "%d %d translate\n", xdist, ydist);
X cpexists = FALSE;
X currentfont = NO_FONT;
X debug0(DRS, D, "CoordTranslate returning.");
X} /* end CoordTranslate */


X
X
X/*@@**************************************************************************/
X/* */

X/* CoordRotate(amount) */
X/* */
X/* Rotate coordinate system by given amount (in internal DG units) */
X/* */
X/*****************************************************************************/
X
XCoordRotate(amount)
XLENGTH amount;
X{ debug1(DRS, D, "CoordRotate(%.1f degrees)", (float) amount / DG);
X fprintf(out_fp, "%.4f rotate\n", (float) amount / DG);
X cpexists = FALSE;
X currentfont = NO_FONT;
X debug0(DRS, D, "CoordRotate returning.");
X} /* end CoordRotate */


X
X
X/*****************************************************************************/
X/* */

X/* CoordScale(ratio, dim) */
X/* */
X/* Scale coordinate system by ratio in the given dimension. */
X/* */
X/*****************************************************************************/
X
XCoordScale(hfactor, vfactor)
Xfloat hfactor, vfactor;
X{ unsigned char buff[20];
X ifdebug(DRS, D, sprintf(buff, "%.3f, %.3f", hfactor, vfactor));
X debug1(DRS, D, "CoordScale(%s)", buff);
X fprintf(out_fp, "%.4f %.4f scale\n", hfactor, vfactor);
X cpexists = FALSE;
X currentfont = NO_FONT;
X debug0(DRS, D, "CoordScale returning.");
X} /* end CoordScale */


X
X
X/*****************************************************************************/
X/* */

X/* SaveGraphicState() */
X/* */
X/* Save current coord system on stack for later restoration. */
X/* */
X/*****************************************************************************/
X
XSaveGraphicState()
X{ debug0(DRS, D, "SaveGraphicState()");
X fprintf(out_fp, "gsave\n");
X debug0(DRS, D, "SaveGraphicState returning.");
X} /* end SaveGraphicState */


X
X
X/*****************************************************************************/
X/* */

X/* RestoreGraphicState() */
X/* */
X/* Restore previously saved coordinate system. NB we normally assume that */
X/* no white space is needed before any item of output, but since this */
X/* procedure is sometimes called immediately after PrintGraphicObject(), */
X/* which does not append a concluding space, we prepend one here. */
X/* */
X/*****************************************************************************/
X
XRestoreGraphicState()
X{ debug0(DRS, D, "RestoreGraphicState()");
X fprintf(out_fp, "\ngrestore\n");
X cpexists = FALSE;
X currentfont = NO_FONT;
X debug0(DRS, D, "RestoreGraphicState returning.");
X} /* end RestoreGraphicState */


X
X
X/*@@**************************************************************************/
X/* */

X/* PrintGraphicObject(x) */
X/* */
X/* Print object x on out_fp */
X/* */
X/*****************************************************************************/
X
XPrintGraphicObject(x)
XOBJECT x;
X{ OBJECT y, link; unsigned char *p;
X switch( type(x) )
X {
X case WORD:
X
X for( p = string(x); *p != '\0'; p++ )
X { if( *p == '"' )
X continue;
X else if( *p != '\\' )
X putc(*p, out_fp);
X else if( *++p != '\0' )
X { putc('\\', out_fp);
X putc(*p, out_fp);
X }
X }
X break;
X
X
X case ACAT:
X

X for( link = Down(x); link != x; link = NextDown(link) )
X { Child(y, link);

X if( type(y) == GAP_OBJ )
X { if( vspace(y) > 0 ) putc('\n', out_fp);
X else if( hspace(y) > 0 ) putc(' ', out_fp);
X }
X else if( type(y) == WORD || type(y) == ACAT ) PrintGraphicObject(y);
X else if( type(y) != WIDE && !is_index(type(y)) )
X /* @Wide, indexes are sometimes inserted by Manifest */
X { Error(WARN, &fpos(x), "error in left parameter of %s", KW_GRAPHIC);
X debug1(DGP, D, " type(y) = %s, y =", Image(type(y)));
X ifdebug(DGP, D, EchoObject(stderr, y));
X }
X }
X break;
X
X
X default:
X
X Error(WARN, &fpos(x), "error in left parameter of %s", KW_GRAPHIC);
X debug1(DGP, D, " type(x) = %s, x =", Image(type(x)));
X ifdebug(DGP, D, EchoObject(stderr, x));
X break;
X }
X} /* end PrintGraphicObject */


X
X
X/*****************************************************************************/
X/* */

X/* DefineGraphicNames(x) */
X/* */
X/* Generate PostScript for xsize, ysize etc. names of graphic object. */
X/* */
X/*****************************************************************************/
X
XDefineGraphicNames(x)
XOBJECT x;
X{ OBJECT y;
X assert( type(x) == GRAPHIC, "PrintGraphic: type(x) != GRAPHIC!" );
X debug1(DRS, D, "DefineGraphicNames( %s )", EchoObject(null, x));
X debug1(DRS, DD, " style = %s", EchoStyle(&save_style(x)));
X
X fprintf(out_fp, "%d %d %d %d %d %d %d loutgr\n",
X size(x, COL), size(x, ROW), back(x, COL), fwd(x, ROW),
X font(save_style(x)) <= 0 ? 12*PT : FontSize(font(save_style(x)), x),
X width(line_gap(save_style(x))), width(space_gap(save_style(x))));
X
X debug0(DRS, D, "DefineGraphicNames returning.");
X} /* end DefineGraphicNames */


X
X
X/*****************************************************************************/
X/* */

X/* PrintGraphicInclude(x, colmark, rowmark) */
X/* */
X/* Print graphic include file, with appropriate surrounds. This code */
X/* closely follows the PostScript Language Reference Manual, 2n ed., */
X/* pages 733-5, except we don't clip the included EPSF. */
X/* */
X/* Note to porters: Version 3.0 of the EPSF standard is not compatible */
X/* with previous versions. Thus, Lout's output may crash your system. */
X/* If you can find out which comment line(s) are causing the trouble, */
X/* you can add to procedure strip_out to strip them out during the */
X/* file inclusion step. e.g. on my system %%EOF causes problems, so I */
X/* strip it out. */
X/* */
X/*****************************************************************************/
X#define SKIPPING 0
X#define READING_DNR 1
X#define FINISHED 2
X
Xstatic BOOLEAN strip_out(buff)
Xunsigned char *buff;
X{ if( StringBeginsWith(buff, "%%EOF") ) return TRUE;
X return FALSE;
X} /* end strip_out */
X
XPrintGraphicInclude(x, colmark, rowmark)
XOBJECT x; LENGTH colmark, rowmark;
X{ OBJECT y, full_name; unsigned char buff[MAX_LINE];
X FILE *fp; int state;
X debug0(DRS, D, "PrintGraphicInclude(x)");
X assert(type(x)==INCGRAPHIC || type(x)==SINCGRAPHIC, "PrintGraphicInclude!");
X assert(sparec(constraint(x)), "PrintGraphicInclude: sparec(constraint(x))!");
X
X /* open the include file and get its full path name */
X Child(y, Down(x));
X fp = OpenIncGraphicFile(string(y), type(x), &full_name, &fpos(y));
X assert( fp != NULL, "PrintGraphicInclude: fp!" );
X
X /* generate appropriate header code */
X fprintf(out_fp, "BeginEPSF\n");
X CoordTranslate(colmark - back(x, COL), rowmark - fwd(x, ROW));
X CoordScale( (float) PT, (float) PT );
X CoordTranslate(-back(y, COL), -back(y, ROW));
X fprintf(out_fp, "%%%%BeginDocument: %s\n", string(full_name));
X
X /* copy through the include file, except divert resources lines to needs */
X /* and strip out some comment lines that cause problems */
X state = (fgets(buff, MAX_LINE, fp) == NULL) ? FINISHED : SKIPPING;
X while( state != FINISHED ) switch(state)
X {
X case SKIPPING:
X
X if( StringBeginsWith(buff, "%%DocumentNeededResources:") &&
X !StringContains(buff, "(atend)") == NULL )
X { x = MakeWord(&buff[strlen("%%DocumentNeededResources:")], no_fpos);
X Link(needs, x);
X state = (fgets(buff, MAX_LINE, fp) == NULL) ? FINISHED : READING_DNR;
X }
X else
X { if( StringBeginsWith(buff, "%%LanguageLevel:") )
X Error(WARN, &fpos(x), "ignoring \"%%%%LanguageLevel\" in %s file %s",
X KW_INCGRAPHIC, string(full_name));
X if( StringBeginsWith(buff, "%%Extensions:") )
X Error(WARN, &fpos(x), "ignoring \"%%%%Extensions\" in %s file %s",
X KW_INCGRAPHIC, string(full_name));
X if( !strip_out(buff) ) fputs(buff, out_fp);
X state = (fgets(buff, MAX_LINE, fp) == NULL) ? FINISHED : SKIPPING;
X }
X break;
X
X case READING_DNR:
X
X if( StringBeginsWith(buff, "%%+") )
X { x = MakeWord(&buff[strlen("%%+")], no_fpos);
X Link(needs, x);
X state = (fgets(buff, MAX_LINE, fp) == NULL) ? FINISHED : READING_DNR;
X }
X else
X { if( !strip_out(buff) ) fputs(buff, out_fp);
X state = (fgets(buff, MAX_LINE, fp) == NULL) ? FINISHED : SKIPPING;
X }
X break;
X }
X
X /* wrapup */
X DisposeObject(full_name);
X fclose(fp);
X fprintf(out_fp, "%%%%EndDocument\nEndEPSF\n");
X debug0(DRS, D, "PrintGraphicInclude returning.");
X} /* end PrintGraphicInclude */
END_OF_FILE
if test 56122 -ne `wc -c <'lout/z24.c'`; then
echo shar: \"'lout/z24.c'\" unpacked with wrong size!
fi
# end of 'lout/z24.c'
fi
echo shar: End of archive 3 \(of 30\).
cp /dev/null ark3isdone

Jeff Kingston

unread,
May 30, 1993, 11:51:57 PM5/30/93
to
Submitted-by: je...@joyce.cs.su.oz.au (Jeff Kingston)
Posting-number: Volume 37, Issue 102
Archive-name: lout/part04
Environment: UNIX

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: lout/doc/tr.eq/outfile.ps.A lout/doc/tr.impl/s5.0
# lout/z10.c
# Wrapped by kent@sparky on Sun May 30 19:43:54 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 4 (of 30)."'
if test -f 'lout/doc/tr.eq/outfile.ps.A' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.eq/outfile.ps.A'\"
else
echo shar: Extracting \"'lout/doc/tr.eq/outfile.ps.A'\" \(54341 characters\)
sed "s/^X//" >'lout/doc/tr.eq/outfile.ps.A' <<'END_OF_FILE'
X%!PS-Adobe-3.0
X%%Creator: Basser Lout Version 2.03 (April 1993)
X%%CreationDate: Fri Apr 23 09:09:42 1993
X%%DocumentNeededResources: (atend)
X%%Pages: (atend)
X%%BoundingBox: 0 0 595 841
X%%EndComments
X%%BeginProlog
X%%BeginResource: procset LoutStartUp
X/fnt { exch findfont exch scalefont setfont } def
X/x { currentpoint exch pop moveto } def
X/s { show } def
X/in { 1440 mul } def
X/cm { 567 mul } def
X/pt { 20 mul } def
X/em { 120 mul } def
X/sp { louts mul } def
X/vs { loutv mul } def
X/ft { loutf mul } def
X/dg { } def
X/loutgr {
X /louts exch def
X /loutv exch def
X /loutf exch def
X /ymark exch def
X /xmark exch def
X /ysize exch def
X /xsize exch def
X} def
X/BeginEPSF {
X /LoutEPSFState save def
X /dict_count countdictstack def
X /op_count count 1 sub def
X userdict begin
X /showpage { } def
X 0 setgray 0 setlinecap
X 1 setlinewidth 0 setlinejoin
X 10 setmiterlimit [] 0 setdash newpath
X /languagelevel where
X { pop languagelevel
X 1 ne
X { false setstrokeadjust false setoverprint
X } if
X } if
X} bind def
X/EndEPSF {
X count op_count sub { pop } repeat
X countdictstack dict_count sub { end } repeat
X LoutEPSFState restore
X} bind def
X%%EndResource
X%%BeginResource: procset LoutTabPrependGraphic
X
X% @PrependGraphic file /usr/staff/jeff/lout.lib/include/tab_prepend
X%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
X% %
X% PostScript @SysPrependGraphic file for @Tab %
X% %
X% To assist in avoiding name clashes, the names %
X% of all these symbols begin with "ltab". %
X% %
X% Jeffrey H. Kingston %
X% 24 September 1991 %
X% 22 December 1992 %
X% %
X%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
X
X% linewidth ltabhs -
X% horizontal single line
X/ltabhs
X{ 0 0 moveto xsize 0 lineto
X setlinewidth 0 setlinecap stroke
X} def
X
X% linewidth ltabhsp -
X% horizontal single line with projecting ends
X/ltabhsp
X{ 0 0 moveto xsize 0 lineto
X setlinewidth 2 setlinecap stroke
X} def
X
X% linewidth ltabhd -
X% horizontal double line
X/ltabhd
X{ dup dup
X 0 0 moveto xsize 0 lineto
X 0 exch 3 mul moveto xsize exch 3 mul lineto
X setlinewidth 0 setlinecap stroke
X} def
X
X% linewidth ltabhdb -
X% horizontal double line below mark
X/ltabhdb
X{ dup dup
X 0 0 moveto xsize 0 lineto
X 0 exch -3 mul moveto xsize exch -3 mul lineto
X setlinewidth 0 setlinecap stroke
X} def
X
X% linewidth ltabhdnw -
X% horizontal double line with northwest corner
X/ltabhdnw
X{ dup dup dup dup
X 0 0 moveto xsize 0 lineto
X xsize exch 3 mul moveto
X -3 mul exch 3 mul lineto
X -3 mul 0 lineto
X setlinewidth 0 setlinejoin 2 setlinecap stroke
X} def
X
X% linewidth ltabhdne -
X% horizontal double line with northeast corner
X/ltabhdne
X{ dup dup dup dup
X 0 0 moveto xsize 0 lineto
X 0 exch 3 mul moveto
X 3 mul xsize add exch 3 mul lineto
X 3 mul xsize add 0 lineto
X setlinewidth 0 setlinejoin 2 setlinecap stroke
X} def
X
X% linewidth ltabhdsw -
X% horizontal double line with southwest corner
X/ltabhdsw
X{ dup dup dup dup
X 0 0 moveto xsize 0 lineto
X xsize exch -3 mul moveto
X -3 mul exch -3 mul lineto
X -3 mul 0 lineto
X setlinewidth 0 setlinejoin 2 setlinecap stroke
X} def
X
X% linewidth ltabhdse -
X% horizontal double line with southeast corner
X/ltabhdse
X{ dup dup dup dup
X 0 0 moveto xsize 0 lineto
X 0 exch -3 mul moveto
X 3 mul xsize add exch -3 mul lineto
X 3 mul xsize add 0 lineto
X setlinewidth 0 setlinejoin 2 setlinecap stroke
X} def
X
X% linewidth ltabvs -
X% vertical single line
X/ltabvs
X{ 0 0 moveto 0 ysize lineto
X setlinewidth 0 setlinecap stroke
X} def
X
X% linewidth ltabvd -
X% vertical double line
X/ltabvd
X{ dup dup
X 0 0 moveto 0 ysize lineto
X -3 mul 0 moveto -3 mul ysize lineto
X setlinewidth 0 setlinecap stroke
X} def
X
X% linewidth ltabvdr -
X% vertical double line to right of mark
X/ltabvdr
X{ dup dup
X 0 0 moveto 0 ysize lineto
X 3 mul 0 moveto 3 mul ysize lineto
X setlinewidth 0 setlinecap stroke
X} def
X%%EndResource
X%%BeginResource: procset LoutFigPrependGraphic
X
X% @PrependGraphic file /usr/staff/jeff/lout.lib/include/fig_prepend
X%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
X% %
X% PostScript @SysPrependGraphic file for @Fig Jeffrey H. Kingston %
X% Version 2.0 (includes CIRCUM label) January 1992 %
X% %
X% To assist in avoiding name clashes, the names of all symbols %
X% defined here begin with "lfig". However, this is not feasible %
X% with user-defined labels and some labels used by users. %
X% %
X% <point> is two numbers, a point. %
X% <length> is one number, a length %
X% <angle> is one number, an angle in degrees %
X% <dashlength> is one number, the preferred length of a dash %
X% %
X%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
X
Xerrordict begin
X /handleerror
X {
X { /Times-Roman findfont 8 pt scalefont setfont
X 0 setgray 4 pt 4 pt moveto
X $error /errorname get
X dup lfigdict exch known
X { lfigdict exch get }
X { 30 string cvs } ifelse
X show
X ( Command: ) show
X $error /command get 30 string cvs show
X } stopped {} if
X showpage stop
X } def
Xend
X
X% concat strings: <string> <string> lfigconcat <string>
X% must be defined outside lfigdict since used in lfigpromotelabels
X/lfigconcat
X{ 2 copy length exch length add string
X dup 0 4 index putinterval
X dup 3 index length 3 index putinterval
X 3 1 roll pop pop
X} def
X
X% <string> lfigdebugprint -
X% must be defined outside lfigdict since used in arbitrary places
X% /lfigdebugprint
X% { print
X% (; operand stack:\n) print
X% count copy
X% count 2 idiv
X% { ==
X% (\n) print
X% } repeat
X% (\n) print
X% } def
X
X/lfigdict 120 dict def
Xlfigdict begin
X
X% error messages
X/dictfull (dictfull error: too many labels?) def
X/dictstackoverflow (dictstackoverflow error: labels nested too deeply?) def
X/execstackoverflow (execstackoverflow error: figure nested too deeply?) def
X/limitcheck (limitcheck error: figure nested too deeply or too large?) def
X/syntaxerror (syntaxerror error: syntax error in text of figure?) def
X/typecheck (typecheck error: syntax error in text of figure?) def
X/undefined (undefined error: unknown or misspelt label?) def
X/VMError (VMError error: run out of memory?) def
X
X% push pi onto stack: - lfigpi <num>
X/lfigpi 3.14159 def
X
X% arc directions
X/clockwise false def
X/anticlockwise true def
X
X% maximum of two numbers: <num> <num> lfigmax <num>
X/lfigmax { 2 copy gt { pop } { exch pop } ifelse } def
X
X% minimum of two numbers: <num> <num> lfigmin <num>
X/lfigmin { 2 copy lt { pop } { exch pop } ifelse } def
X
X% add two points: <point> <point> lfigpadd <point>
X/lfigpadd { exch 3 1 roll add 3 1 roll add exch } def
X
X% subtract first point from second: <point> <point> lfigpsub <point>
X/lfigpsub { 3 2 roll sub 3 1 roll exch sub exch } def
X
X% max two points: <point> <point> lfigpmax <point>
X/lfigpmax { exch 3 1 roll lfigmax 3 1 roll lfigmax exch } def
X
X% min two points: <point> <point> lfigpmin <point>
X/lfigpmin { exch 3 1 roll lfigmin 3 1 roll lfigmin exch } def
X
X% scalar multiplication: <point> <num> lfigpmul <point>
X/lfigpmul { dup 3 1 roll mul 3 1 roll mul exch } def
X
X% point at angle and distance: <point> <length> <angle> lfigatangle <point>
X/lfigatangle { 2 copy cos mul 3 1 roll sin mul lfigpadd } def
X
X% angle from one point to another: <point> <point> lfigangle <angle>
X/lfigangle { lfigpsub 2 copy 0 eq exch 0 eq and {pop} {exch atan} ifelse } def
X
X% distance between two points: <point> <point> lfigdistance <length>
X/lfigdistance { lfigpsub dup mul exch dup mul add sqrt } def
X
X% difference in x coords: <point> <point> lfigxdistance <length>
X/lfigxdistance { pop 3 1 roll pop sub } def
X
X%difference in y coords: <point> <point> lfigydistance <length>
X/lfigydistance { 3 1 roll pop sub exch pop } def
X
X% stroke a solid line: <length> <dashlength> lfigsolid -
X/lfigsolid
X{ pop pop [] 0 setdash stroke
X} def
X
X% stroke a lfigdashed line: <length> <dashlength> lfigdashed -
X/lfigdashed
X{ 2 copy div 2 le 1 index 0 le or
X { exch pop 1 pt lfigmax [ exch dup ] 0 setdash }
X { dup [ exch 4 2 roll 2 copy div
X 1 sub 2 div ceiling dup 4 1 roll
X 1 add mul sub exch div ] 0 setdash
X } ifelse stroke
X} def
X
X% stroke a lfigcdashed line: <length> <dashlength> lfigcdashed -
X/lfigcdashed
X{ 2 copy le 1 index 0 le or
X { exch pop 1 pt lfigmax [ exch dup ] copy 0 get 2 div setdash }
X { dup [ 4 2 roll exch 2 copy exch div
X 2 div ceiling div 1 index sub
X ] exch 2 div setdash
X } ifelse stroke
X} def
X
X% stroke a dotted line: <length> <dashlength> lfigdotted -
X/lfigdotted
X{ dup 0 le
X { exch pop 1 pt lfigmax [ exch 0 exch ] 0 setdash }
X { 1 index exch div ceiling div
X [ 0 3 2 roll ] 0 setdash
X } ifelse stroke
X} def
X
X% stroke a noline line: <length> <dashlength> lfignoline -
X/lfignoline
X{ pop pop
X} def
X
X% painting (i.e. filling): - lfigwhite - (etc.)
X/lfigwhite { 1.0 setgray fill } def
X/lfiglight { 0.95 setgray fill } def
X/lfiggrey { 0.9 setgray fill } def
X/lfiggray { 0.9 setgray fill } def
X/lfigdark { 0.7 setgray fill } def
X/lfigblack { 0.0 setgray fill } def
X/lfignopaint { } def
X
X% line caps (and joins, not currently used)
X/lfigbutt 0 def
X/lfiground 1 def
X/lfigprojecting 2 def
X/lfigmiter 0 def
X/lfigbevel 2 def
X
X% shape and labels of the @Box symbol
X/lfigbox
X{
X 0 0 /SW lfigpointdef
X xsize 0 /SE lfigpointdef
X xsize ysize /NE lfigpointdef
X 0 ysize /NW lfigpointdef
X SE 0.5 lfigpmul /S lfigpointdef
X NW 0.5 lfigpmul /W lfigpointdef
X W SE lfigpadd /E lfigpointdef
X S NW lfigpadd /N lfigpointdef
X NE 0.5 lfigpmul /CTR lfigpointdef
X [ CTR NE lfigpsub /lfigboxcircum cvx ] lfigcircumdef
X SW SE NE NW SW
X} def
X
X% shape and labels of the @Square symbol
X/lfigsquare
X{
X xsize ysize 0.5 lfigpmul /CTR lfigpointdef
X CTR xsize xsize ysize ysize lfigpmax 0.5 lfigpmul lfigpadd /NE lfigpointdef
X CTR 0 0 CTR NE lfigdistance 135 lfigatangle lfigpadd /NW lfigpointdef
X CTR 0 0 CTR NE lfigdistance 225 lfigatangle lfigpadd /SW lfigpointdef
X CTR 0 0 CTR NE lfigdistance 315 lfigatangle lfigpadd /SE lfigpointdef
X SW 0.5 lfigpmul SE 0.5 lfigpmul lfigpadd /S lfigpointdef
X NW 0.5 lfigpmul NE 0.5 lfigpmul lfigpadd /N lfigpointdef
X SW 0.5 lfigpmul NW 0.5 lfigpmul lfigpadd /W lfigpointdef
X SE 0.5 lfigpmul NE 0.5 lfigpmul lfigpadd /E lfigpointdef
X [ CTR NE lfigpsub /lfigboxcircum cvx ] lfigcircumdef
X SW SE NE NW SW
X} def
X
X% shape and labels of the @Diamond symbol
X/lfigdiamond
X{
X xsize 0 0.5 lfigpmul /S lfigpointdef
X 0 ysize 0.5 lfigpmul /W lfigpointdef
X S W lfigpadd /CTR lfigpointdef
X CTR W lfigpadd /N lfigpointdef
X CTR S lfigpadd /E lfigpointdef
X [ xsize ysize 0.5 lfigpmul /lfigdiamondcircum cvx ] lfigcircumdef
X S E N W S
X} def
X
X% shape and labels of the @Ellipse symbol
X/lfigellipse
X{
X xsize 0 0.5 lfigpmul /S lfigpointdef
X 0 ysize 0.5 lfigpmul /W lfigpointdef
X S W lfigpadd /CTR lfigpointdef
X CTR W lfigpadd /N lfigpointdef
X CTR S lfigpadd /E lfigpointdef
X CTR xsize 0 0.3536 lfigpmul lfigpadd 0 ysize 0.3536 lfigpmul lfigpadd /NE lfigpointdef
X 0 ysize 0.3536 lfigpmul CTR xsize 0 0.3536 lfigpmul lfigpadd lfigpsub /SE lfigpointdef
X xsize 0 0.3536 lfigpmul CTR lfigpsub 0 ysize 0.3536 lfigpmul lfigpadd /NW lfigpointdef
X 0 ysize 0.3536 lfigpmul xsize 0 0.3536 lfigpmul CTR lfigpsub lfigpsub /SW lfigpointdef
X [ xsize ysize 0.5 lfigpmul /lfigellipsecircum cvx ] lfigcircumdef
X S [ CTR ] E [ CTR ] N [ CTR ] W [ CTR ] S
X} def
X
X% shape and labels of the @Circle symbol
X/lfigcircle
X{
X xsize ysize 0.5 lfigpmul /CTR lfigpointdef
X CTR xsize 0 ysize 0 lfigpmax 0.5 lfigpmul lfigpadd /E lfigpointdef
X CTR 0 0 CTR E lfigdistance 45 lfigatangle lfigpadd /NE lfigpointdef
X CTR 0 0 CTR E lfigdistance 90 lfigatangle lfigpadd /N lfigpointdef
X CTR 0 0 CTR E lfigdistance 135 lfigatangle lfigpadd /NW lfigpointdef
X CTR 0 0 CTR E lfigdistance 180 lfigatangle lfigpadd /W lfigpointdef
X CTR 0 0 CTR E lfigdistance 225 lfigatangle lfigpadd /SW lfigpointdef
X CTR 0 0 CTR E lfigdistance 270 lfigatangle lfigpadd /S lfigpointdef
X CTR 0 0 CTR E lfigdistance 315 lfigatangle lfigpadd /SE lfigpointdef
X [ S E lfigpsub /lfigellipsecircum cvx ] lfigcircumdef
X S [ CTR ] E [ CTR ] N [ CTR ] W [ CTR ] S
X} def
X
X% shape and labels of the @HLine and @HArrow symbols
X/lfighline
X{
X 0 ymark lfigprevious /FROM lfigpointdef
X xsize ymark lfigprevious /TO lfigpointdef
X} def
X
X% shape and labels of the @VLine and @VArrow symbols
X/lfigvline
X{
X xmark ysize lfigprevious /FROM lfigpointdef
X xmark 0 lfigprevious /TO lfigpointdef
X} def
X
X% points of a polygon around base with given no of sides, vert init angle:
X% <sides> <angle> figpolygon <point> ... <point>
X/lfigpolygon
X{ xsize ysize 0.5 lfigpmul /CTR lfigpointdef
X 90 sub CTR 2 copy lfigmax 5 3 roll
X [ 4 copy pop /lfigpolycircum cvx ] lfigcircumdef
X exch dup 360 exch div exch
X 1 1 3 2 roll
X { 4 string cvs (P) exch lfigconcat cvn
X 6 copy pop pop lfigatangle 2 copy 10 2 roll
X 3 2 roll lfigpointdef
X dup 3 1 roll add exch
X } for
X pop lfigatangle
X} def
X
X% next array element: <array> <index> lfiggetnext <array> <index> <any> true
X% or <array> <index> false
X/lfiggetnext
X{ 2 copy exch length ge
X { false }
X { 2 copy get exch 1 add exch true } ifelse
X} def
X
X% check whether thing is number: <any> lfigisnumbertype <any> <bool>
X/lfigisnumbertype
X{ dup type dup
X /integertype eq exch /realtype eq or
X} def
X
X% check whether thing is an array: <any> lfigisarraytype <any> <bool>
X/lfigisarraytype { dup type /arraytype eq } def
X
X% get next item: <array> <index> lfiggetnextitem <array> <index> 0
X% or <array> <index> <array> 1
X% or <array> <index> <point> 2
X/lfiggetnextitem
X{ lfiggetnext
X { lfigisarraytype
X { 1
X }
X { lfigisnumbertype
X { 3 1 roll
X lfiggetnext
X { lfigisnumbertype
X { 4 3 roll exch 2
X }
X { pop 3 2 roll pop 0
X } ifelse
X }
X { 3 2 roll pop 0
X } ifelse
X }
X { pop 0
X } ifelse
X } ifelse
X }
X { 0
X } ifelse
X} def
X
X% set arc path: bool x1 y1 x2 y2 x0 y0 lfigsetarc <angle> <angle> <dist>
X% the path goes from x1 y1 to x2 y2 about centre x0 y0,
X% anticlockwise if bool is true else clockwise.
X% The orientations of backwards pointing and forwards pointing
X% arrowheads are returned in the two angles, and
X% the length of the arc is returned in <dist>.
X/lfigsetarc
X{
X 20 dict begin
X matrix currentmatrix 8 1 roll
X 2 copy translate 2 copy 8 2 roll
X 4 2 roll lfigpsub 6 2 roll lfigpsub
X dup /y1 exch def dup mul /y1s exch def
X dup /x1 exch def dup mul /x1s exch def
X dup /y2 exch def dup mul /y2s exch def
X dup /x2 exch def dup mul /x2s exch def
X
X y1s y2s eq
X { -1
X }
X { y1s x2s mul y2s x1s mul sub y1s y2s sub div
X } ifelse
X /da exch def
X
X x1s x2s eq
X { -1
X }
X { x1s y2s mul x2s y1s mul sub x1s x2s sub div
X } ifelse
X /db exch def
X
X da 0 gt db 0 gt and
X { /LMax da sqrt db sqrt lfigmax def
X /scalex da sqrt LMax div def
X /scaley db sqrt LMax div def
X scalex scaley scale
X 0 0 LMax
X 0 0 x1 scalex mul y1 scaley mul lfigangle
X 0 0 x2 scalex mul y2 scaley mul lfigangle
X 2 copy eq { 360 add } if
X 2 copy 8 2 roll
X 5 index { arc } { arcn } ifelse
X 2 index 1 index
X { 90 sub } { 90 add } ifelse
X dup sin scaley mul exch cos scalex mul atan
X 2 index 2 index
X { 90 add } { 90 sub } ifelse
X dup sin scaley mul exch cos scalex mul atan
X 5 2 roll % res1 res2 ang1 ang2 anticlockwise
X { exch sub } { sub } ifelse
X dup 0 le { 360 add } if lfigpi mul LMax mul 180 div
X }
X { 0 0 x1 y1 lfigdistance 0 0 x2 y2 lfigdistance eq
X 0 0 x1 y1 lfigdistance 0 gt and
X { 0 0
X 0 0 x1 y1 lfigdistance
X 0 0 x1 y1 lfigangle
X 0 0 x2 y2 lfigangle
X 2 copy eq { 360 add } if
X 2 copy 8 2 roll
X 5 index { arc } { arcn } ifelse
X 2 index 1 index
X { 90 sub } { 90 add } ifelse
X 2 index 2 index
X { 90 add } { 90 sub } ifelse
X 5 2 roll % res1 res2 ang1 ang2 clockwise
X { exch sub } { sub } ifelse
X dup 0 le { 360 add } if lfigpi mul 0 0 x1 y1 lfigdistance mul 180 div
X }
X { x2 y2 lineto pop
X x2 y2 x1 y1 lfigangle
X x1 y1 x2 y2 lfigangle
X x1 y1 x2 y2 lfigdistance
X } ifelse
X } ifelse
X 4 -1 roll setmatrix
X end
X} def
X
X% lfigsetcurve: set up a Bezier curve from x0 y0 to x3 y3
X% and return arrowhead angles and length of curve (actually 0)
X% x0 y0 x1 y1 x2 y2 x3 y3 lfigsetcurve <angle> <angle> <length>
X/lfigsetcurve
X{ 8 copy curveto pop pop
X lfigangle
X 5 1 roll
X 4 2 roll lfigangle
X exch
X 0
X} def
X
X% lfigpaintpath: paint a path of the given shape
X% /paint [ shape ] lfigpaintpath -
X/lfigpaintpath
X{
X 10 dict begin
X 0 newpath
X /prevseen false def
X /curveseen false def
X { lfiggetnextitem
X dup 0 eq { pop exit }
X { 1 eq
X { /curveseen true def
X /curve exch def
X curve length 0 eq { /curveseen false def } if
X }
X { /ycurr exch def
X /xcurr exch def
X prevseen
X { curveseen
X { curve length 4 eq
X { xprev yprev
X curve 0 get curve 1 get
X curve 2 get curve 3 get
X xcurr ycurr
X lfigsetcurve pop pop pop
X }
X { xprev yprev xcurr ycurr
X curve length 1 ge { curve 0 get } { 0 } ifelse
X curve length 2 ge { curve 1 get } { 0 } ifelse
X curve length 3 ge { curve 2 get } { true } ifelse
X 7 1 roll
X lfigsetarc pop pop pop
X } ifelse
X }
X { xcurr ycurr lineto
X } ifelse
X }
X { xcurr ycurr moveto
X } ifelse
X /xprev xcurr def
X /yprev ycurr def
X /prevseen true def
X /curveseen false def
X } ifelse
X } ifelse
X } loop pop pop cvx exec
X end
X} def
X
X% stroke a path of the given shape in the given linestyle and dash length.
X% Return the origin and angle of the backward and forward arrow heads.
X% dashlength /linestyle [shape] lfigdopath [<point> <angle>] [<point> <angle>]
X/lfigdopath
X{
X 10 dict begin
X 0
X /prevseen false def
X /curveseen false def
X /backarrow [] def
X /fwdarrow [] def
X {
X lfiggetnextitem
X dup 0 eq { pop exit }
X {
X 1 eq
X { /curveseen true def
X /curve exch def
X curve length 0 eq { /prevseen false def } if
X }
X { /ycurr exch def
X /xcurr exch def
X prevseen
X { newpath xprev yprev moveto
X curveseen
X { curve length 4 eq
X { xprev yprev
X curve 0 get curve 1 get
X curve 2 get curve 3 get
X xcurr ycurr lfigsetcurve
X }
X { xprev yprev xcurr ycurr
X curve length 1 ge { curve 0 get } { 0 } ifelse
X curve length 2 ge { curve 1 get } { 0 } ifelse
X curve length 3 ge { curve 2 get } { true } ifelse
X 7 1 roll
X lfigsetarc
X } ifelse
X }
X { xcurr ycurr lineto
X xcurr ycurr xprev yprev lfigangle dup 180 sub
X xprev yprev xcurr ycurr lfigdistance
X } ifelse
X 6 index 6 index cvx exec
X [ xprev yprev 5 -1 roll ]
X backarrow length 0 eq
X { /backarrow exch def }
X { pop } ifelse
X [ xcurr ycurr 4 -1 roll ] /fwdarrow exch def
X } if
X /xprev xcurr def
X /yprev ycurr def
X /prevseen true def
X /curveseen false def
X } ifelse
X } ifelse
X } loop
X pop pop pop pop
X backarrow length 0 eq { [ 0 0 0 ] } { backarrow } ifelse
X fwdarrow length 0 eq { [ 0 0 0 ] } { fwdarrow } ifelse
X end
X} def
X
X% lfigdoarrow: draw an arrow head of given form
X% dashlength /lstyle /pstyle hfrac height width [ <point> <angle> ] lfigdoarrow -
X/lfigdoarrow
X{ matrix currentmatrix 8 1 roll
X dup 0 get 1 index 1 get translate
X 2 get rotate
X [ 2 index neg 2 index 0 0
X 3 index 3 index neg
X 1 index 10 index mul 0
X 7 index 7 index ]
X 4 1 roll pop pop pop
X dup 3 1 roll
X gsave lfigpaintpath grestore lfigdopath pop pop
X setmatrix
X} def
X
X% arrow head styles
X/lfigopen 0.0 def
X/lfighalfopen 0.5 def
X/lfigclosed 1.0 def
X
X% stroke no arrows, forward, back, and both
X/lfignoarrow { pop pop pop pop pop pop pop pop } def
X/lfigforward { 7 -1 roll lfigdoarrow pop } def
X/lfigback { 8 -2 roll pop lfigdoarrow } def
X/lfigboth { 8 -1 roll 7 copy lfigdoarrow pop 7 -1 roll lfigdoarrow } def
X
X% lfigprevious: return previous point on path
X/lfigprevious
X{ lfigisnumbertype
X { 2 copy }
X { lfigisarraytype
X { 2 index 2 index }
X { 0 0 }
X ifelse
X } ifelse
X} def
X
X% label a point in 2nd top dictionary: <point> /name lfigpointdef -
X/lfigpointdef
X{
X % (Entering lfigpointdef) lfigdebugprint
X [ 4 2 roll transform
X /itransform cvx ] cvx
X currentdict end
X 3 1 roll
X % currentdict length currentdict maxlength lt
X % { def }
X % { exec moveto (too many labels) show stop }
X % ifelse
X def
X begin
X % (Leaving lfigpointdef) lfigdebugprint
X} def
X
X% promote labels from second top to third top dictionary
X% <string> lfigpromotelabels -
X/lfigpromotelabels
X{
X % (Entering lfigpromotelabels) lfigdebugprint
X currentdict end exch currentdict end
X { exch 20 string cvs 2 index
X (@) lfigconcat exch lfigconcat cvn exch def
X } forall pop begin
X % (Leaving lfigpromotelabels) lfigdebugprint
X} def
X
X% show labels (except CIRCUM): - lfigshowlabels -
X/lfigshowlabels
X{
X % (Entering lfigshowlabels) lfigdebugprint
X currentdict end
X currentdict
X { 1 index 20 string cvs (CIRCUM) search % if CIRCUM in key
X { pop pop pop pop pop }
X { pop cvx exec 2 copy
X newpath 1.5 pt 0 360 arc
X 0 setgray fill
X /Times-Roman findfont 8 pt scalefont setfont
X moveto 0.2 cm 0.1 cm rmoveto 20 string cvs show
X }
X ifelse
X } forall
X begin
X % (Leaving lfigshowlabels) lfigdebugprint
X} def
X
X% fix an angle to between 0 and 360 degrees: <angle> lfigfixangle <angle>
X/lfigfixangle
X{
X % (Entering lfigfixangle) lfigdebugprint
X { dup 0 ge { exit } if
X 360 add
X } loop
X { dup 360 lt { exit } if
X 360 sub
X } loop
X % (Leaving lfigfixangle) lfigdebugprint
X} def
X
X% find point on circumference of box: alpha a b lfigboxcircum x y
X/lfigboxcircum
X{
X % (Entering lfigboxcircum) lfigdebugprint
X 4 dict begin
X /b exch def
X /a exch def
X lfigfixangle /alpha exch def
X 0 0 a b lfigangle /theta exch def
X
X % if alpha <= theta, return (a, a*tan(alpha))
X alpha theta le
X { a a alpha sin mul alpha cos div }
X {
X % else if alpha <= 180 - theta, return (b*cot(alpha), b)
X alpha 180 theta sub le
X { b alpha cos mul alpha sin div b }
X {
X % else if alpha <= 180 + theta, return (-a, -a*tan(alpha))
X alpha 180 theta add le
X { a neg a neg alpha sin mul alpha cos div }
X {
X % else if alpha <= 360 - theta, return (-b*cot(alpha), -b)
X alpha 360 theta sub le
X { b neg alpha cos mul alpha sin div b neg }
X {
X % else 360 - theta <= alpha, return (a, a*tan(alpha))
X a a alpha sin mul alpha cos div
X } ifelse
X } ifelse
X } ifelse
X } ifelse
X end
X % (Leaving lfigboxcircum) lfigdebugprint
X} def
X
X% find point on circumference of diamond: alpha a b lfigdiamondcircum x y
X/lfigdiamondcircum
X{
X % (Entering lfigdiamondcircum) lfigdebugprint
X 4 dict begin
X /b exch def
X /a exch def
X lfigfixangle /alpha exch def
X b alpha cos abs mul a alpha sin abs mul add /denom exch def
X a b mul alpha cos mul denom div
X a b mul alpha sin mul denom div
X end
X % (Leaving lfigdiamondcircum) lfigdebugprint
X} def
X
X% find point on circumference of ellipse: alpha a b lfigellipsecircum x y
X/lfigellipsecircum
X{
X % (Entering lfigellipsecircum) lfigdebugprint
X 4 dict begin
X /b exch def
X /a exch def
X lfigfixangle /alpha exch def
X b alpha cos mul dup mul a alpha sin mul dup mul add sqrt /denom exch def
X a b mul alpha cos mul denom div
X a b mul alpha sin mul denom div
X end
X % (Leaving lfigellipsecircum) lfigdebugprint
X} def
X
X% find point of intersection of two lines each defined by two points
X% x1 y1 x2 y2 x3 y3 x4 y4 lfiglineintersect x y
X/lfiglineintersect
X{
X % (Entering lfiglineintersect) lfigdebugprint
X 13 dict begin
X /y4 exch def
X /x4 exch def
X /y3 exch def
X /x3 exch def
X /y2 exch def
X /x2 exch def
X /y1 exch def
X /x1 exch def
X x2 x1 sub /x21 exch def
X x4 x3 sub /x43 exch def
X y2 y1 sub /y21 exch def
X y4 y3 sub /y43 exch def
X y21 x43 mul y43 x21 mul sub /det exch def
X
X % calculate x
X y21 x43 mul x1 mul
X y43 x21 mul x3 mul sub
X y3 y1 sub x21 mul x43 mul add
X det div
X
X % calculate y
X x21 y43 mul y1 mul
X x43 y21 mul y3 mul sub
X x3 x1 sub y21 mul y43 mul add
X det neg div
X
X end
X % (Leaving lfiglineintersect) lfigdebugprint
X} def
X
X% find point on circumference of polygon
X% alpha radius num theta lfigpolycircum x y
X/lfigpolycircum
X{
X % (Entering lfigpolycircum) lfigdebugprint
X 13 dict begin
X /theta exch def
X /num exch def
X /radius exch def
X /alpha exch def
X
X % calculate delta, the angle from theta to alpha
X alpha theta sub lfigfixangle
X
X % calculate the angle which is the multiple of 360/num closest to delta
X 360 num div div truncate 360 num div mul theta add /anglea exch def
X
X % calculate the next multiple of 360/num after anglea
X anglea 360 num div add /angleb exch def
X
X % intersect the line through these two points with the alpha line
X anglea cos anglea sin angleb cos angleb sin
X 0 0 alpha cos 2 mul alpha sin 2 mul
X lfiglineintersect radius lfigpmul
X
X end
X % (Leaving lfigpolycircum) lfigdebugprint
X} def
X
X% add CIRCUM operator with this body: <array> lfigcircumdef -
X/lfigcircumdef
X{ % (Entering lfigcircumdef) lfigdebugprint
X /CIRCUM exch cvx
X currentdict end
X 3 1 roll
X % currentdict length currentdict maxlength lt
X % { def }
X % { exec moveto (too many labels) show stop }
X % ifelse
X def
X begin
X % (Leaving lfigcircumdef) lfigdebugprint
X} def
X
Xend
X%%EndResource
X
X%%EndProlog
X
X%%Page: ? 1
X%%BeginPageSetup
X0.0500 dup scale 10 setlinewidth
X/pgsave save def
X%%EndPageSetup
X
X/Times-Bold 240 fnt
X3365 13817 moveto(Eq)s 3718 x(\261)s 3898 x(A)s 4131 x(Lout)s 4683 x(Package)s
X5594 x(for)s 5959 x(Typesetting)s 7214 x(Mathematics)s
X/Times-Italic 240 fnt
X5020 13243 moveto(Jeffrey)s 5729 x(H.)s
X6022 x(Kingston)s
X/Times-Roman 240 fnt
X4001 12671 moveto(Basser)s 4698 x(Department)s 5886 x(of)s 6145 x(Computer)s
X7162 x(Science)s 4659 12383 moveto(University)s 5728 x(of)s 5987 x(Sydney)s 6766 x(2006)s
X5515 12095 moveto(Australia)s
X/Times-Italic 240 fnt
X5388 11211 moveto(ABSTRACT)s
X/Times-Roman 240 fnt
X2137 10755 moveto(This)s 2660 x(report)s 3328 x(describes)s
X4315 x(the)s 4705 x(use)s 5122 x(of)s 5419 x(Eq,)s 5843 x(a)s
X6047 x(package)s 6929 x(of)s 7226 x(de\256nitions)s 8334 x(for)s 8710 x(typesetting)s
X2137 10467 moveto(mathematics)s 3404 x(with)s 3889 x(the)s 4241 x(Lout)s 4753 x(document)s
X5757 x(formatter.)s 6824 x(For)s 7216 x(example,)s
X/Helvetica 220 fnt
X2617 9966 moveto(@Eq { big int supp 1 on 0 ` dx over sqrt {1 - x sup 2} = pi over 2 })s
X/Times-Roman 240 fnt
X2137 9467 moveto(produces)s
X3061 x(the)s 3413 x(output)s gsave
X2617 8850 translate
X-180.0000 rotate
Xgsave
X0 -206 translate
X180.0000 rotate
X
X/Symbol 405 fnt
X0 -370 moveto(\362)s
Xgrestore
X
Xgrestore
X
X/Symbol 405 fnt
X2617 8687 moveto(\362)s
X/Symbol 168 fnt
X2727 9014 moveto(\061)s
X2727 8602 moveto(\060)s
X/Times-Italic 240 fnt
X3105 8901 moveto(dx)s gsave
X2854 8850 translate
X729 0 0 0 240 288 0 loutgr
Xgsave
X0 0 moveto xsize 0 lineto 0.05 ft setlinewidth stroke
Xgrestore
X
Xgrestore
Xgsave
X0 8582 translate
X1.0000 1.3755 scale
X
X/Symbol 240 fnt
X2854 -60 moveto(\326)s
Xgrestore
Xgsave
X2985 8802 translate
X598 0 0 0 240 288 0 loutgr
Xgsave
X0 0 moveto xsize 0 lineto 0.03 ft setlinewidth 2 setlinecap stroke
Xgrestore
X
Xgrestore
X
X/Symbol 240 fnt
X3028 8530 moveto(\061)s 3205 x(-)s
X
X/Symbol 168 fnt
X3499 8644 moveto(\062)s
X/Times-Italic 240 fnt
X3393 8537 moveto(x)s
X/Symbol 240 fnt
X3655 8790 moveto(\075)s 3858 8902 moveto(\160)s gsave
X3858 8850 translate
X131 0 0 0 240 288 0 loutgr
Xgsave
X0 0 moveto xsize 0 lineto 0.05 ft setlinewidth stroke
Xgrestore
X
Xgrestore
X
X/Symbol 240 fnt
X3863 8638 moveto(\062)s
X
X/Times-Roman 240 fnt
X2137 8037 moveto(The)s 2568 x(advantages)s 3690 x(of)s 3948 x(Eq)s 4273 x(include)s
X5036 x(careful)s 5757 x(attention)s 6652 x(to)s 6897 x(details)s 7579 x(of)s
X7837 x(spacing,)s 8687 x(a)s 8852 x(repertoire)s 2137 7749 moveto(of)s 2382 x(several)s
X3104 x(hundred)s 3935 x(mathematical)s 5267 x(symbols,)s 6171 x(a)s 6323 x(simple)s
X7006 x(syntax)s 7677 x(extensible)s 8692 x(by)s 8978 x(the)s 9316 x(user,)s
X2137 7461 moveto(and)s 2543 x(complete)s 3479 x(integration)s 4574 x(with)s 5059 x(the)s
X5411 x(rest)s 5815 x(of)s 6074 x(Lout.)s 2617 7087 moveto(In)s 2898 x(addition,)s
X3824 x(this)s 4251 x(report)s 4903 x(contains)s 5782 x(an)s 6090 x(appendix)s
X7050 x(describing)s 8128 x(the)s 8502 x(use)s 8903 x(of)s 9184 x(Pas,)s
X9658 x(a)s 2137 6799 moveto(package)s 2981 x(of)s 3240 x(de\256nitions)s 4310 x(for)s
X4648 x(printing)s 5465 x(Pascal)s 6135 x(programs.)s 1417 5145 moveto(22)s 1717 x(December,)s
X2819 x(1992)s
Xpgsave restore
Xshowpage
X
X%%Page: ? 2
X%%BeginPageSetup
X0.0500 dup scale 10 setlinewidth
X/pgsave save def
X%%EndPageSetup
X
X/Times-Bold 240 fnt
X3365 14537 moveto(Eq)s 3718 x(\261)s 3898 x(A)s 4131 x(Lout)s 4683 x(Package)s
X5594 x(for)s 5959 x(Typesetting)s 7214 x(Mathematics)s
X/Times-Italic 240 fnt
X5020 13963 moveto(Jeffrey)s 5729 x(H.)s
X6022 x(Kingston)s
X/Times-Roman 240 fnt
X4001 13391 moveto(Basser)s 4698 x(Department)s 5886 x(of)s 6145 x(Computer)s
X7162 x(Science)s 4659 13103 moveto(University)s 5728 x(of)s 5987 x(Sydney)s 6766 x(2006)s
X5515 12815 moveto(Australia)s
X/Times-Bold 240 fnt
X1417 12222 moveto(1.)s 1717 x(Introduction)s
X/Times-Roman 240 fnt
X1897 11850 moveto(Eq)s 2205 x(is)s
X2406 x(a)s 2554 x(package)s 3380 x(of)s 3621 x(de\256nitions)s 4673 x(for)s
X4993 x(typesetting)s 6084 x(mathematics)s 7333 x(with)s 7800 x(the)s 8134 x(Lout)s
X8628 x(document)s 9614 x(formatter)s 1417 11562 moveto([)s 1496 x(4)s 1616 x(].)s
X1874 x(It)s 2078 x(includes)s 2934 x(several)s 3669 x(hundred)s 4513 x(mathematical)s
X5858 x(and)s 6263 x(other)s 6813 x(special)s 7535 x(characters)s 8561 x(\(including)s
X9603 x(the)s 9954 x(entire)s 1417 11274 moveto(PostScript)s
X/Times-Roman 153 fnt
X2399 11379 moveto(1)s
X/Times-Roman 240 fnt
X2545 11274 moveto(Symbol)s
X3360 x(font)s 3815 x([)s 3894 x(1)s 4014 x(]\),)s 4302 x(and)s
X4718 x(a)s 4894 x(smaller)s 5666 x(number)s 6467 x(of)s 6736 x(symbols)s
X7604 x(for)s 7952 x(joining)s 8700 x(objects)s 9447 x(together)s 10300 x(in)s
X1417 10986 moveto(mathematical)s 2753 x(ways.)s 3415 x(Eq)s 3731 x(is)s 3940 x(based)s
X4535 x(on)s 4825 x(the)s 5167 x(eqn)s 5563 x(language)s 6477 x(of)s
X6726 x(Kernighan)s 7786 x(and)s 8182 x(Cherry)s 8896 x([)s 8975 x(3)s
X9095 x(],)s 9284 x(with)s 9759 x(spacing)s 1417 10698 moveto(rules)s 1941 x(similar)s
X2663 x(to)s 2909 x(Knuth's)s 3740 x(T)s 3886 10650 moveto(E)s 4032 10698 moveto(X)s
X4265 x(formatter)s 5212 x([)s 5291 x(6)s 5411 x(].)s 1897 10324 moveto(To)s
X2226 x(use)s 2608 x(Eq)s 2937 x(in)s 3186 x(a)s 3355 x(Lout)s
X3870 x(document,)s 4937 x(\256rst)s 5371 x(ensure)s 6058 x(that)s 6479 x(its)s
X6767 x(de\256nition)s 7747 x(is)s 7969 x(included,)s 8916 x(either)s 9522 x(by)s
X9825 x(having)s
X/Helvetica 220 fnt
X1417 10032 moveto(@SysInclude { eq })s
X/Times-Roman 240 fnt
X3367 10036 moveto(in)s 3634 x(the)s 4007 x(setup)s
X4593 x(\256le,)s 5039 x(or)s
X/Helvetica 220 fnt
X5319 10032 moveto(-ieq)s
X/Times-Roman 240 fnt
X5765 10036 moveto(on)s 6086 x(the)s
X6459 x(command)s 7484 x(line.)s 8043 x(Then,)s 8676 x(at)s 8929 x(any)s
X9356 x(point)s 9929 x(in)s 10196 x(the)s 1417 9748 moveto(document,)s 2479 x(write)s
X
X/Helvetica 220 fnt
X3027 9744 moveto(@Eq { ... })s
X/Times-Roman 240 fnt
X4271 9748 moveto(and)s 4675 x(the)s 5025 x(symbols)s 5881 x(of)s
X6138 x(Eq)s 6462 x(will)s 6891 x(be)s 7175 x(available)s 8095 x(between)s
X8950 x(the)s 9300 x(braces.)s 10088 x(Any)s 1417 9460 moveto(symbols)s 2290 x(available)s
X3227 x(outside)s 3993 x(continue)s 4892 x(to)s 5153 x(be)s 5454 x(available)s
X6391 x(inside,)s 7097 x(which)s 7757 x(means)s 8443 x(that)s 8876 x(Eq)s
X9217 x(can)s 9624 x(be)s 9925 x(freely)s 1417 9172 moveto(mixed)s 2075 x(with)s
X2560 x(standard)s 3430 x(Lout)s 3942 x(and)s 4348 x(with)s 4833 x(symbols)s
X5691 x(from)s 6215 x(other)s 6766 x(packages,)s 7763 x(without)s 8554 x(restriction.)s
X1897 8798 moveto(In)s 2156 x(this)s 2561 x(report)s 3191 x(we)s 3530 x(show)s
X4096 x(the)s 4448 x(Lout)s 4960 x(input)s 5512 x(at)s 5744 x(the)s
X6096 x(left,)s 6533 x(and)s 6939 x(its)s 7224 x(result)s 7814 x(at)s
X8046 x(the)s 8398 x(right:)s
X/Helvetica 220 fnt
X1897 8081 moveto(@Eq { {x sup 2 + y sup 2} over 2 })s
X/Symbol 168 fnt
X5972 8343 moveto(\062)s
X/Times-Italic 240 fnt
X5866 8236 moveto(x)s
X
X/Symbol 240 fnt
X6113 8229 moveto(+)s
X/Symbol 168 fnt
X6407 8343 moveto(\062)s
X/Times-Italic 240 fnt
X6301 8236 moveto(y)s gsave
X5866 8138 translate
X625 0 0 0 240 288 0 loutgr
Xgsave
X0 0 moveto xsize 0 lineto 0.05 ft setlinewidth stroke
Xgrestore
X
Xgrestore
X
X/Symbol 240 fnt
X6118 7926 moveto(\062)s
X/Times-Roman 240 fnt
X1417 7476 moveto(Subsequent)s
X2581 x(examples)s 3544 x(will)s 3975 x(omit)s 4473 x(the)s 4825 x(enclosing)s
X
X/Helvetica 220 fnt
X5802 7472 moveto(@Eq { ... })s
X/Times-Roman 240 fnt
X6805 7476 moveto(.)s
X/Times-Bold 240 fnt
X1417 6683 moveto(2.)s 1717 x(Symbols)s
X/Times-Roman 240 fnt
X1897 6311 moveto(Eq)s
X2223 x(prints)s 2827 x(characters)s 3854 x(in)s 4100 x(the)s 4452 x(fonts)s
X4990 x(appropriate)s 6138 x(for)s 6476 x(mathematics:)s
X/Helvetica 220 fnt
X1897 5810 moveto(x - 2)s
X/Times-Italic 240 fnt
X5866 5814 moveto(x)s
X
X/Symbol 240 fnt
X6029 5807 moveto(-)s 6217 x(\062)s
X/Times-Roman 240 fnt
X1417 5356 moveto(Here)s
X/Times-Italic 240 fnt
X1923 x(x)s
X/Times-Roman 240 fnt
X2071 x(is)s
X2272 x(in)s 2500 x(Italic,)s
X/Symbol 240 fnt
X3091 5349 moveto(\062)s
X/Times-Roman 240 fnt
X3253 5356 moveto(is)s 3454 x(in)s
X3682 x(Roman,)s 4476 x(and)s
X/Symbol 240 fnt
X4864 5349 moveto(-)s
X/Times-Roman 240 fnt
X5037 5356 moveto(is)s 5238 x(from)s
X5744 x(the)s 6078 x(Symbol)s 6865 x(font.)s 7412 x(The)s 7826 x(character)s
X
X/Helvetica 220 fnt
X8742 5352 moveto(-)s
X/Times-Roman 240 fnt
X8857 5356 moveto(is)s 9058 x(a)s
X/Times-Italic 240 fnt
X9206 x(symbol)s
X/Times-Roman 240 fnt
X9926 x(which)s
X1417 5068 moveto(stands)s 2075 x(for)s
X/Symbol 240 fnt
X2413 5061 moveto(-)s
X/Times-Roman 240 fnt
X2544 5068 moveto(,)s 2664 x(and)s
X
X/Helvetica 220 fnt
X3070 5064 moveto(2)s
X/Times-Roman 240 fnt
X3252 5068 moveto(is)s 3471 x(also)s 3916 x(a)s 4082 x(symbol,)s
X4907 x(standing)s 5778 x(for)s
X/Symbol 240 fnt
X6116 5061 moveto(\062)s
X/Times-Roman 240 fnt
X6236 5068 moveto(.)s 6416 x(Eq)s
X6742 x(includes)s 7599 x(a)s 7765 x(vast)s 8210 x(number)s 9001 x(of)s
X9260 x(symbols:)s
X/Helvetica 220 fnt
X1897 4512 moveto(Omega delta int partial club)s
X/Symbol 240 fnt
X5866 4509 moveto(\127)s 6050 x(\144)s gsave
X6168 4569 translate
X-180.0000 rotate
Xgsave
X0 -159 translate
X180.0000 rotate
X
X/Symbol 312 fnt
X0 -285 moveto(\362)s
X
Xgrestore
X
Xgrestore
X
X/Symbol 312 fnt
X6168 4443 moveto(\362)s
X/Symbol 240 fnt
X6253 4509 moveto(\266)s 6371 x(\247)s
X/Times-Roman 240 fnt
X1417 3960 moveto(The)s 1849 x(summary)s
X2799 x(at)s 3031 x(the)s 3383 x(end)s 3789 x(of)s 4048 x(this)s
X4453 x(report)s 5083 x(has)s 5462 x(the)s 5814 x(complete)s 6750 x(list.)s
X1897 3586 moveto(Symbols)s 2813 x(whose)s 3503 x(names)s 4192 x(are)s 4561 x(made)s
X5157 x(from)s 5699 x(letters)s 6359 x(should)s 7076 x(be)s 7380 x(separated)s
X8360 x(from)s 8902 x(each)s 9418 x(other)s 9987 x(by)s 10305 x(at)s
X1417 3298 moveto(least)s 1914 x(one)s 2320 x(space)s 2911 x(or)s 3170 x(end)s
X3576 x(of)s 3835 x(line,)s 4313 x(as)s 4572 x(was)s 5004 x(done)s
X5530 x(above,)s 6222 x(or)s 6481 x(else)s 6912 x(Eq)s 7238 x(will)s
X7669 x(become)s 8473 x(confused:)s
X/Helvetica 220 fnt
X1897 2791 moveto(Omegadelta)s
X/Times-Italic 240 fnt
X5866 2795 moveto(Omegadelta)s
X/Times-Roman 240 fnt
X1417 2292 moveto(Symbols)s
X2327 x(whose)s 3011 x(names)s 3694 x(are)s 4057 x(made)s 4647 x(from)s
X5183 x(digits)s 5786 x(and)s 6204 x(punctuation)s 7406 x(characters)s 8445 x(can,)s
X8909 x(however,)s 9865 x(be)s 10163 x(run)s gsave
X1417 1752 translate
X680 0 0 0 240 288 60 loutgr
Xgsave
X0 0 moveto xsize 0 lineto stroke
Xgrestore
X
Xgrestore
X
X/Times-Roman 153 fnt
X1417 1536 moveto(1)s
X/Times-Roman 192 fnt
X1493 1458 moveto(PostScript)s
X2326 x(is)s 2501 x(a)s 2634 x(trademark)s 3457 x(of)s 3664 x(Adobe)s
X4223 x(Systems,)s 4956 x(Incorporated.)s
Xpgsave restore
Xshowpage
X
X%%Page: ? 3
X%%BeginPageSetup
X0.0500 dup scale 10 setlinewidth
X/pgsave save def
X%%EndPageSetup
X
X/Times-Roman 240 fnt
X5754 15261 moveto(-)s 5893 x(2)s 6073 x(-)s 1417 14674 moveto(together)s 2260 x(with)s
X2745 x(each)s 3243 x(other)s 3794 x(and)s 4200 x(with)s 4685 x(symbols)s
X5543 x(made)s 6121 x(from)s 6645 x(letters:)s
X/Helvetica 220 fnt
X1897 14160 moveto(Omega-delta<=2)s
X/Symbol 240 fnt
X5866 14157 moveto(\127)s
X6107 x(-)s 6295 x(\144)s 6485 x(\243)s 6688 x(\062)s
X/Times-Roman 240 fnt
X1417 13661 moveto(This)s
X1902 x(rule)s 2333 x(applies)s 3070 x(throughout)s 4181 x(the)s 4533 x(Lout)s
X5045 x(world.)s 1897 13287 moveto(Some)s 2502 x(symbols)s 3360 x(join)s 3792 x(objects)s
X4529 x(together)s 5372 x(in)s 5618 x(mathematical)s 6964 x(ways:)s
X/Helvetica 220 fnt
X1897 12788 moveto(x sub 2)s
X
X/Times-Italic 240 fnt
X5866 12792 moveto(x)s
X/Symbol 168 fnt
X5972 12707 moveto(\062)s
X/Times-Roman 240 fnt
X1417 12257 moveto(Here)s 1930 x(the)s
X/Helvetica 220 fnt
X2271 12253 moveto(sub)s
X
X/Times-Roman 240 fnt
X2674 12257 moveto(symbol)s 3428 x(has)s 3796 x(taken)s 4363 x(the)s 4704 x(object)s
X5337 x(just)s 5731 x(to)s 5966 x(its)s 6240 x(left,)s 6666 x(and)s
X7061 x(the)s 7402 x(object)s 8035 x(just)s 8429 x(to)s 8664 x(its)s
X8938 x(right,)s 9498 x(and)s 9893 x(joined)s 1417 11969 moveto(them)s 1972 x(into)s
X2421 x(one)s 2844 x(object)s 3505 x(in)s 3768 x(the)s 4137 x(form)s
X4678 x(of)s 4954 x(a)s 5137 x(subscript.)s 6197 x(The)s 6646 x(two)s
X7082 x(objects)s 7836 x(are)s 8204 x(called)s 8851 x(the)s 9220 x(left)s
X9614 x(and)s 10037 x(right)s 1417 11681 moveto(parameters)s 2524 x(of)s
X/Helvetica 220 fnt
X2783 11677 moveto(sub)s
X
X/Times-Roman 240 fnt
X3137 11681 moveto(,)s 3257 x(and)s 3663 x(they)s 4135 x(may)s 4607 x(be)s
X4893 x(arbitrary)s 5774 x(Lout)s 6286 x(objects.)s 1897 11307 moveto(Other)s 2499 x(symbols)s
X3355 x(of)s 3612 x(a)s 3776 x(similar)s 4496 x(kind)s 4980 x(include)s
X
X/Helvetica 220 fnt
X5742 11303 moveto(sup)s
X/Times-Roman 240 fnt
X6154 11307 moveto(for)s 6490 x(superscripting,)s
X/Helvetica 220 fnt
X7962 11303 moveto(over)s
X/Times-Roman 240 fnt
X8447 11307 moveto(for)s
X8783 x(built-up)s 9598 x(fractions,)s 1417 11019 moveto(and)s
X/Helvetica 220 fnt
X1831 11015 moveto(from)s
X/Times-Roman 240 fnt
X2338 11019 moveto(and)s
X
X/Helvetica 220 fnt
X2752 11015 moveto(to)s
X/Times-Roman 240 fnt
X3003 11019 moveto(for)s 3349 x(the)s 3709 x(lower)s 4321 x(and)s
X4735 x(upper)s 5348 x(limits)s 5959 x(of)s 6226 x(sums,)s 6846 x(products,)s
X7798 x(etc.)s 8264 x(These)s 8903 x(symbols)s 9769 x(may)s 10249 x(be)s
X1417 10731 moveto(used)s 1916 x(together)s 2759 x(to)s 3005 x(produce)s 3836 x(complicated)s
X5064 x(equations)s 6041 x(with)s 6526 x(astonishing)s 7676 x(ease:)s
X/Helvetica 220 fnt
X1897 10231 moveto(big sum from i=0 to n r sup i)s
X1897 9943 moveto(= {r sup n+1 - 1} over r-1)s
X/Times-Italic 168 fnt
X5943 10317 moveto(n)s
X/Symbol 312 fnt
X5874 10038 moveto(\345)s
X/Times-Italic 168 fnt
X5866 9852 moveto(i)s
X/Symbol 168 fnt
X5920 9847 moveto(\075)s
X6020 x(\060)s
X/Times-Italic 168 fnt
X6197 10175 moveto(i)s
X/Times-Italic 240 fnt
X6104 10063 moveto(r)s
X/Symbol 240 fnt
X6315 10056 moveto(\075)s
X/Times-Italic 168 fnt
X6611 10283 moveto(n)s
X
X/Symbol 168 fnt
X6701 10278 moveto(+)s 6799 x(\061)s
X/Times-Italic 240 fnt
X6518 10171 moveto(r)s
X/Symbol 240 fnt
X6940 10164 moveto(-)s 7128 x(\061)s
Xgsave
X6518 10116 translate
X730 0 0 0 240 288 0 loutgr
Xgsave
X0 0 moveto xsize 0 lineto 0.05 ft setlinewidth stroke
Xgrestore
X
Xgrestore
X
X/Times-Italic 240 fnt
X6654 9914 moveto(r)s
X/Symbol 240 fnt
X6804 9907 moveto(-)s 6992 x(\061)s
X/Times-Roman 240 fnt
X1417 9384 moveto(Here)s
X/Helvetica 220 fnt
X1937 9380 moveto(sum)s
X
X/Times-Roman 240 fnt
X2408 9384 moveto(is)s 2623 x(just)s 3024 x(the)s
X/Symbol 240 fnt
X3372 9377 moveto(\345)s
X/Times-Roman 240 fnt
X3599 9384 moveto(symbol;)s
X
X/Helvetica 220 fnt
X4426 9380 moveto(from)s
X/Times-Roman 240 fnt
X4921 9384 moveto(and)s
X/Helvetica 220 fnt
X5323 9380 moveto(to)s
X/Times-Roman 240 fnt
X5562 9384 moveto(do)s 5858 x(all)s
X6152 x(the)s 6500 x(work)s 7048 x(of)s 7303 x(placing)s 8063 x(the)s
X8411 x(limits.)s 9130 x(They)s 9678 x(are)s 10025 x(quite)s 1417 9096 moveto(independent,)s
X2718 x(so)s 3002 x(either)s 3616 x(or)s 3886 x(both)s 4383 x(may)s
X4866 x(be)s 5163 x(omitted.)s 6084 x(To)s 6421 x(get)s 6784 x(a)s
X6961 x(superscript)s 8080 x(directly)s 8880 x(over)s 9376 x(a)s 9553 x(subscript,)s
X1417 8808 moveto(use)s 1796 x(the)s
X/Helvetica 220 fnt
X2148 8804 moveto(supp)s
X/Times-Roman 240 fnt
X2684 8808 moveto(and)s
X/Helvetica 220 fnt
X3090 8804 moveto(on)s
X
X/Times-Roman 240 fnt
X3394 8808 moveto(symbols:)s
X/Helvetica 220 fnt
X1897 8231 moveto(A supp 2 on 1)s
X/Times-Italic 240 fnt
X5866 8235 moveto(A)s
X/Symbol 168 fnt
X6012 8353 moveto(\062)s 6012 8150 moveto(\061)s
X
X/Times-Roman 240 fnt
X1417 7700 moveto(These)s 2048 x(two)s 2467 x(symbols)s 3325 x(should)s 4024 x(always)s
X4748 x(be)s 5034 x(used)s 5533 x(together)s 6376 x(as)s 6635 x(shown.)s
X1897 7326 moveto(As)s 2230 x(usual)s 2802 x(in)s 3055 x(Lout,)s 3634 x(braces)s
X4311 x(are)s 4669 x(used)s 5175 x(to)s 5428 x(group)s 6054 x(something)s
X7118 x(into)s 7557 x(an)s 7850 x(indivisible)s 8926 x(object.)s 9697 x(Leaving)s
X1417 7038 moveto(them)s 1955 x(out)s 2321 x(creates)s 3043 x(ambiguities:)s
X/Helvetica 220 fnt
X1897 6539 moveto(a sup b over c)s
X
X/Times-Roman 240 fnt
X1417 6041 moveto(There)s 2034 x(are)s 2385 x(two)s 2804 x(possible)s 3648 x(interpretations)s
X5087 x(for)s 5425 x(this:)s
X/Helvetica 220 fnt
X1897 5367 moveto({a sup b} over c)s
X/Times-Italic 168 fnt
X5986 5587 moveto(b)s
X/Times-Italic 240 fnt
X5866 5475 moveto(a)s
Xgsave
X5866 5424 translate
X204 0 0 0 240 288 0 loutgr
Xgsave
X0 0 moveto xsize 0 lineto 0.05 ft setlinewidth stroke
Xgrestore
X
Xgrestore
X
X/Times-Italic 240 fnt
X5915 5270 moveto(c)s
X/Helvetica 220 fnt
X1897 4664 moveto(a sup {b over c})s
X/Times-Italic 168 fnt
X5986 4865 moveto(b)s gsave
X5986 4830 translate
X84 0 0 0 168 33 0 loutgr
Xgsave
X0 0 moveto xsize 0 lineto 0.05 ft setlinewidth stroke
Xgrestore
X
Xgrestore
X
X/Times-Italic 168 fnt
X5991 4723 moveto(c)s
X/Times-Italic 240 fnt
X5866 4668 moveto(a)s
X
X/Times-Roman 240 fnt
X1417 4166 moveto(Eq)s 1746 x(chooses)s 2567 x(between)s 3427 x(them)s 3968 x(in)s
X4217 x(the)s 4572 x(following)s 5565 x(way.)s 6147 x(Every)s 6781 x(symbol)s
X7549 x(that)s 7970 x(takes)s 8524 x(a)s 8693 x(parameter)s 9710 x(also)s
X10158 x(has)s 1417 3878 moveto(a)s
X/Times-Italic 240 fnt
X1574 x(precedence)s
X/Times-Roman 240 fnt
X2663 x(,)s 2774 x(which)s
X3410 x(is)s 3620 x(a)s 3777 x(number.)s 4679 x(For)s 5062 x(example,)s
X
X/Helvetica 220 fnt
X5983 3874 moveto(sup)s
X/Times-Roman 240 fnt
X6388 3878 moveto(has)s 6758 x(precedence)s 7884 x(60)s 8175 x(and)s
X
X/Helvetica 220 fnt
X8572 3874 moveto(over)s
X/Times-Roman 240 fnt
X9050 3878 moveto(has)s 9420 x(precedence)s 1417 3590 moveto(54.)s 1823 x(The)s
X2241 x(symbol)s 2992 x(with)s 3463 x(the)s 3801 x(highest)s 4538 x(precedence)s
X5659 x(wins)s 6157 x(the)s 6495 x(object)s 7125 x(lying)s 7663 x(between)s
X8506 x(them,)s 9090 x(so)s 9349 x(in)s 9581 x(the)s 9919 x(above)s
X1417 3302 moveto(case)s 1875 x(the)s 2214 x(\256rst)s 2632 x(interpretation)s 3965 x(is)s
X4171 x(chosen.)s 5003 x(If)s 5208 x(two)s 5614 x(symbols)s 6459 x(of)s
X6705 x(equal)s 7270 x(precedence)s 8392 x(compete)s 9249 x(for)s 9574 x(an)s
X9847 x(object,)s 1417 3014 moveto(the)s 1769 x(association)s 2891 x(is)s 3110 x(towards)s
X3927 x(the)s 4279 x(left:)s
X/Helvetica 220 fnt
X1897 2492 moveto(a sup b sub 2)s
X/Times-Italic 168 fnt
X5986 2608 moveto(b)s
X/Times-Italic 240 fnt
X5866 2496 moveto(a)s
X
X/Symbol 168 fnt
X6070 2411 moveto(\062)s
X/Times-Roman 240 fnt
X1417 1961 moveto(In)s 1676 x(this)s 2081 x(case)s 2552 x(it)s
X2744 x(is)s 2963 x(more)s 3514 x(probable)s 4411 x(that)s 4829 x(the)s
X5181 x(following)s 6171 x(right)s 6682 x(association)s 7804 x(was)s 8236 x(actually)s
X9052 x(wanted:)s
Xpgsave restore
Xshowpage
X
X%%Page: ? 4
X%%BeginPageSetup
X0.0500 dup scale 10 setlinewidth
X/pgsave save def
X%%EndPageSetup
X
X/Times-Roman 240 fnt
X5754 15261 moveto(-)s 5893 x(3)s 6073 x(-)s
X/Helvetica 220 fnt
X1897 14602 moveto(a sup { b sub 2 })s
X/Times-Italic 168 fnt
X5986 14718 moveto(b)s
X
X/Symbol 117 fnt
X6070 14659 moveto(\062)s
X/Times-Italic 240 fnt
X5866 14606 moveto(a)s
X/Times-Roman 240 fnt
X1897 13839 moveto(White)s 2549 x(space)s 3148 x(between)s
X4013 x(two)s 4440 x(objects)s 5185 x(is)s 5412 x(considered)s 6516 x(to)s
X6770 x(be)s 7064 x(a)s 7238 x(symbol)s 8011 x(with)s 8504 x(precedence)s
X9647 x(7,)s 9895 x(which)s 1417 13551 moveto(is)s 1636 x(lower)s 2240 x(than)s
X2712 x(the)s 3064 x(precedence)s 4199 x(of)s 4458 x(any)s 4864 x(Eq)s
X5190 x(symbol;)s 6021 x(but)s 6387 x(if)s 6592 x(the)s 6944 x(two)s
X7363 x(objects)s 8100 x(are)s 8451 x(immediately)s 9705 x(adjacent)s 1417 13263 moveto(the)s
X1774 x(precedence)s 2914 x(is)s 3138 x(102,)s 3623 x(which)s 4273 x(is)s
X4497 x(higher)s 5173 x(than)s 5650 x(the)s 6007 x(precedence)s 7147 x(of)s
X7411 x(any)s 7822 x(Eq)s 8153 x(symbol.)s 9043 x(Compare)s 9985 x(these)s
X1417 12975 moveto(three)s 1954 x(examples:)s
X/Helvetica 220 fnt
X1897 12303 moveto(big sum from i=0 to n)s
X/Times-Italic 168 fnt
X5943 12561 moveto(n)s
X/Symbol 312 fnt
X5874 12282 moveto(\345)s
X
X/Times-Italic 168 fnt
X5866 12096 moveto(i)s
X/Symbol 168 fnt
X5920 12091 moveto(\075)s 6020 x(\060)s
X/Helvetica 220 fnt
X1897 11469 moveto(big sum from {i = 0} to n)s
X/Times-Italic 168 fnt
X5943 11727 moveto(n)s
X
X/Symbol 312 fnt
X5874 11448 moveto(\345)s
X/Times-Italic 168 fnt
X5866 11262 moveto(i)s
X/Symbol 168 fnt
X5920 11257 moveto(\075)s 6020 x(\060)s
X/Helvetica 220 fnt
X1897 10687 moveto(big sum from i = 0 to n)s
X
X/Symbol 312 fnt
X5866 10666 moveto(\345)s
X/Times-Italic 168 fnt
X5954 10480 moveto(i)s
X/Symbol 240 fnt
X6160 10684 moveto(\075)s
X/Times-Italic 168 fnt
X6381 10893 moveto(n)s
X/Symbol 240 fnt
X6363 10684 moveto(\060)s
X
X/Times-Roman 240 fnt
X1417 10028 moveto(and)s 1824 x(you)s 2245 x(will)s 2677 x(see)s 3043 x(that)s
X3462 x(some)s 4028 x(care)s 4486 x(is)s 4706 x(needed)s 5445 x(on)s
X5746 x(this)s 6152 x(point.)s 6825 x(Braces)s 7536 x(can)s 7929 x(always)s
X8654 x(be)s 8941 x(used)s 9441 x(to)s 9688 x(override)s 1417 9740 moveto(precedence)s
X2554 x(and)s 2962 x(associativity,)s 4278 x(and)s 4686 x(when)s 5267 x(in)s
X5515 x(doubt)s 6123 x(the)s 6477 x(easiest)s 7175 x(course)s 7861 x(is)s
X8082 x(to)s 8330 x(insert)s 8922 x(them.)s 9582 x(Although)s 1417 9452 moveto(Lout)s
X1980 x(allows)s 2715 x(symbols)s 3624 x(to)s 3921 x(as)s 4120 x(so)s
X4333 x(ciate)s 4894 x(towards)s 5762 x(the)s 6165 x(left)s 6593 x(or)s
X6903 x(right,)s 7525 x(Eq)s 7902 x(chooses)s 8771 x(to)s 9068 x(have)s
X9631 x(only)s 10168 x(left)s 1417 9164 moveto(associative)s 2559 x(symbols.)s 3571 x(The)s
X4037 x(summary)s 5021 x(at)s 5287 x(the)s 5673 x(end)s 6113 x(of)s
X6406 x(this)s 6845 x(report)s 7509 x(gives)s 8108 x(the)s 8494 x(precedence)s
X9663 x(of)s 9956 x(every)s 1417 8876 moveto(symbol.)s 1897 8502 moveto(The)s
X/Times-Italic 240 fnt
X2329 x(matrix)s
X
X/Times-Roman 240 fnt
X3013 x(symbol)s 3778 x(builds)s 4423 x(an)s 4709 x(array)s 5259 x(of)s
X5518 x(objects:)s
X/Helvetica 220 fnt
X1897 8003 moveto(matrix)s 1897 7715 moveto( atleft { blpar })s 1897 7427 moveto( atright { brpar })s 1897 7139 moveto({ x sup 2 above x above 1)s
X1897 6851 moveto( nextcol)s 1897 6563 moveto( y sup 2 above y above 1)s 1897 6275 moveto( nextcol)s 1897 5987 moveto( z sup 2 above z above 1)s 1897 5699 moveto(})s
Xgsave
X5866 7691 translate
X-180.0000 rotate
Xgsave
X0 -471 translate
X180.0000 rotate
Xgsave
X0 -518 translate
X1.0000 1.1416 scale
X
X/Symbol 240 fnt
X0 232 moveto(\346)s 0 -60 moveto(\347)s 0 -302 moveto(\350)s
Xgrestore
X
X/Symbol 168 fnt
X241 -172 moveto(\062)s
X/Times-Italic 240 fnt
X135 -279 moveto(x)s
X194 -555 moveto(x)s
X/Symbol 240 fnt
X187 -886 moveto(\061)s
X/Symbol 168 fnt
X623 -172 moveto(\062)s
X/Times-Italic 240 fnt
X517 -279 moveto(y)s 576 -555 moveto(y)s
X
X/Symbol 240 fnt
X569 -886 moveto(\061)s
X/Symbol 168 fnt
X992 -172 moveto(\062)s
X/Times-Italic 240 fnt
X899 -279 moveto(z)s 955 -555 moveto(z)s
X/Symbol 240 fnt
X941 -886 moveto(\061)s
Xgsave
X0 -518 translate
X1.0000 1.1416 scale
X
X/Symbol 240 fnt
X1119 232 moveto(\366)s 1119 -60 moveto(\367)s 1119 -302 moveto(\370)s
Xgrestore
X
Xgrestore
X
Xgrestore
Xgsave
X0 7645 translate
X1.0000 1.1416 scale
X
X/Symbol 240 fnt
X5866 232 moveto(\346)s 5866 -60 moveto(\347)s
X5866 -302 moveto(\350)s
Xgrestore
X
X/Symbol 168 fnt
X6107 7991 moveto(\062)s
X/Times-Italic 240 fnt
X6001 7884 moveto(x)s 6060 7608 moveto(x)s
X/Symbol 240 fnt
X6053 7277 moveto(\061)s
X
X/Symbol 168 fnt
X6489 7991 moveto(\062)s
X/Times-Italic 240 fnt
X6383 7884 moveto(y)s 6442 7608 moveto(y)s
X/Symbol 240 fnt
X6435 7277 moveto(\061)s
X/Symbol 168 fnt
X6858 7991 moveto(\062)s
X
X/Times-Italic 240 fnt
X6765 7884 moveto(z)s 6821 7608 moveto(z)s
X/Symbol 240 fnt
X6807 7277 moveto(\061)s gsave
X0 7645 translate
X1.0000 1.1416 scale
X
X/Symbol 240 fnt
X6985 232 moveto(\366)s 6985 -60 moveto(\367)s
X6985 -302 moveto(\370)s
Xgrestore
X
X/Times-Roman 240 fnt
X1417 5202 moveto(The)s
X/Helvetica 220 fnt
X1876 5198 moveto(atleft)s
X/Times-Roman 240 fnt
X2438 5202 moveto(and)s
X/Helvetica 220 fnt
X2871 5198 moveto(atright)s
X
X/Times-Roman 240 fnt
X3567 5202 moveto(options)s 4359 x(place)s 4950 x(vertically)s 5938 x(scaled)s 6622 x(versions)s
X7506 x(of)s 7792 x(their)s 8316 x(values)s 9014 x(at)s 9273 x(each)s
X9798 x(side;)s 10336 x(if)s 1417 4914 moveto(either)s 2034 x(is)s 2267 x(omitted)s
X3071 x(the)s 3437 x(value)s 4029 x(is)s 4262 x(taken)s 4854 x(to)s
X5114 x(be)s 5414 x(an)s 5714 x(empty)s 6386 x(object)s 7044 x(of)s
X7317 x(zero)s 7802 x(width)s 8421 x(by)s 8735 x(default.)s 9592 x(The)s
X10038 x(right)s 1417 4626 moveto(parameter)s 2421 x(of)s
X/Helvetica 220 fnt
X2670 4622 moveto(matrix)s
X/Times-Roman 240 fnt
X3317 4626 moveto(is)s
X3526 x(the)s 3868 x(array)s 4408 x(itself.)s 5054 x(It)s 5249 x(is)s
X5458 x(a)s 5614 x(sequence)s 6541 x(of)s 6790 x(columns)s 7651 x(separated)s
X8603 x(by)s
X/Helvetica 220 fnt
X8893 4622 moveto(nextcol)s
X/Times-Roman 240 fnt
X9638 4626 moveto(symbols;)s 1417 4338 moveto(each)s 1915 x(column)s
X2693 x(is)s 2912 x(a)s 3078 x(sequence)s 4015 x(of)s 4274 x(objects)s
X5011 x(separated)s 5973 x(by)s
X/Helvetica 220 fnt
X6273 4334 moveto(above)s
X/Times-Roman 240 fnt
X6931 4338 moveto(symbols.)s 1897 3964 moveto(The)s
X
X/Helvetica 220 fnt
X2310 3960 moveto(nextcol)s
X/Times-Roman 240 fnt
X3046 3964 moveto(and)s
X/Helvetica 220 fnt
X3433 3960 moveto(above)s
X/Times-Roman 240 fnt
X4072 3964 moveto(symbols)s 4911 x(have)s
X5404 x(low)s 5804 x(precedence,)s 6980 x(but)s 7327 x(not)s 7674 x(as)s
X7914 x(low)s 8314 x(as)s 8554 x(white)s 9126 x(space)s 9698 x(between)s
X1417 3676 moveto(two)s 1826 x(objects.)s 2673 x(Therefore,)s 3724 x(unless)s 4372 x(the)s
X4714 x(entries)s 5400 x(in)s 5636 x(the)s 5978 x(array)s 6518 x(are)s
X6859 x(very)s 7334 x(simple,)s 8081 x(it)s 8263 x(is)s 8472 x(safest)s
X9065 x(to)s 9301 x(enclose)s 10068 x(each)s 1417 3388 moveto(of)s 1676 x(them)s
X2214 x(in)s 2460 x(braces.)s 1897 3014 moveto(Columns)s 2856 x(built)s 3388 x(with)s
X3907 x(the)s
X/Helvetica 220 fnt
X4293 3010 moveto(above)s
X/Times-Roman 240 fnt
X4985 3014 moveto(symbol)s 5784 x(have)s 6330 x(their)s
X6861 x(objects)s 7632 x(centred)s 8429 x(in)s 8709 x(the)s 9095 x(column.)s
X10027 x(Also)s 1417 2726 moveto(available)s 2343 x(are)s
X/Helvetica 220 fnt
X2698 2722 moveto(labove)s
X/Times-Roman 240 fnt
X3408 2726 moveto(for)s
X3750 x(left-justi\256ed)s 4980 x(columns,)s
X/Helvetica 220 fnt
X5915 2722 moveto(cabove)s
X/Times-Roman 240 fnt
X6687 2726 moveto(meaning)s 7575 x(the)s
X7931 x(same)s 8486 x(as)s
X/Helvetica 220 fnt
X8749 2722 moveto(above)s
X/Times-Roman 240 fnt
X9347 2726 moveto(,)s
X/Helvetica 220 fnt
X9471 2722 moveto(rabove)s
X
X/Times-Roman 240 fnt
X10206 2726 moveto(for)s 1417 2438 moveto(right-justi\256ed)s 2785 x(columns,)s 3724 x(and)s
X/Helvetica 220 fnt
X4138 2434 moveto(mabove)s
X
X/Times-Roman 240 fnt
X4987 2438 moveto(for)s 5333 x(alignment)s 6357 x(along)s 6957 x(column)s 7743 x(marks.)s
X8515 x(Each)s 9061 x(column)s 9847 x(should)s 1417 2150 moveto(contain)s 2182 x(only)s
X2669 x(one)s 3076 x(kind)s 3563 x(of)s
X/Helvetica 220 fnt
X3823 2146 moveto(above)s
X/Times-Roman 240 fnt
X4482 2150 moveto(symbol)s
X5248 x(\(although)s 6226 x(adventurous)s 7457 x(users)s 8009 x(might)s 8628 x(be)s
X8915 x(able)s 9374 x(to)s 9621 x(get)s 9974 x(some)s 1417 1862 moveto(mixtures)s
X2313 x(to)s 2559 x(work\),)s 3250 x(but)s 3616 x(different)s 4497 x(columns)s
X5368 x(may)s 5840 x(differ.)s 6549 x(For)s 6941 x(example,)s
Xpgsave restore
Xshowpage
X
X%%Page: ? 5
X%%BeginPageSetup
X0.0500 dup scale 10 setlinewidth
X/pgsave save def
X%%EndPageSetup
X
X/Times-Roman 240 fnt
X5754 15261 moveto(-)s 5893 x(4)s 6073 x(-)s
X/Helvetica 220 fnt
X1897 14674 moveto(@R "Chain rule:" labove @R "Product rule:")s 1897 14386 moveto(nextcol)s
X1897 14098 moveto({df over dx ^= df over dy cdot dy over dx})s 1897 13810 moveto(mabove)s 1897 13522 moveto({dfg over dy ^= f ` dg over dx + g df over dx})s
X/Times-Roman 240 fnt
X1417 13023 moveto(has)s 1796 x(result)s
X1897 12418 moveto(Chain rule:)s 1897 11776 moveto(Product rule:)s
X/Times-Italic 240 fnt
X3430 12569 moveto(df)s gsave
X3410 12471 translate
X226 0 0 0 240 288 0 loutgr
Xgsave
X0 0 moveto xsize 0 lineto 0.05 ft setlinewidth stroke
Xgrestore
X
Xgrestore
X
X/Times-Italic 240 fnt
X3410 12260 moveto(dx)s
END_OF_FILE
if test 54341 -ne `wc -c <'lout/doc/tr.eq/outfile.ps.A'`; then
echo shar: \"'lout/doc/tr.eq/outfile.ps.A'\" unpacked with wrong size!
elif test -f 'lout/doc/tr.eq/outfile.ps.B' && test -f 'lout/doc/tr.eq/outfile.ps.C'; then
echo shar: Combining \"'lout/doc/tr.eq/outfile.ps'\" \(157394 characters\)
cat 'lout/doc/tr.eq/outfile.ps.A' 'lout/doc/tr.eq/outfile.ps.B' 'lout/doc/tr.eq/outfile.ps.C' > 'lout/doc/tr.eq/outfile.ps'
if test 157394 -ne `wc -c <'lout/doc/tr.eq/outfile.ps'`; then
echo shar: \"'lout/doc/tr.eq/outfile.ps'\" combined with wrong size!
else
rm lout/doc/tr.eq/outfile.ps.A lout/doc/tr.eq/outfile.ps.B
rm lout/doc/tr.eq/outfile.ps.C
fi
fi
# end of 'lout/doc/tr.eq/outfile.ps.A'
fi
if test -f 'lout/doc/tr.impl/s5.0' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.impl/s5.0'\"
else
echo shar: Extracting \"'lout/doc/tr.impl/s5.0'\" \(476 characters\)
sed "s/^X//" >'lout/doc/tr.impl/s5.0' <<'END_OF_FILE'
X@Section
X @Title { Galleys }
X@Begin
X@PP
XWith objects and definitions under control, the author faced the problem
Xof getting body text, footnotes, floating figures and tables,
Xreferences, index entries, and entries in the table of contents into
Xtheir places. The resulting investigation occupied three months of
Xfull-time design work, and proceeded approximately as described in
XSection {@NumberOf galleys}; the implementation occupied the years 1987-89.
X@BeginSubSections
END_OF_FILE
if test 476 -ne `wc -c <'lout/doc/tr.impl/s5.0'`; then
echo shar: \"'lout/doc/tr.impl/s5.0'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.impl/s5.0'
fi
if test -f 'lout/z10.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/z10.c'\"
else
echo shar: Extracting \"'lout/z10.c'\" \(24737 characters\)
sed "s/^X//" >'lout/z10.c' <<'END_OF_FILE'
X/*@z10.c:Cross References:CrossExpand(), CrossSequence()@*********************/


X/* */
X/* LOUT: A HIGH-LEVEL LANGUAGE FOR DOCUMENT FORMATTING (VERSION 2.03) */
X/* COPYRIGHT (C) 1993 Jeffrey H. Kingston */
X/* */
X/* Jeffrey H. Kingston (je...@cs.su.oz.au) */
X/* Basser Department of Computer Science */
X/* The University of Sydney 2006 */
X/* AUSTRALIA */
X/* */
X/* This program is free software; you can redistribute it and/or modify */
X/* it under the terms of the GNU General Public License as published by */
X/* the Free Software Foundation; either version 1, or (at your option) */
X/* any later version. */
X/* */
X/* This program is distributed in the hope that it will be useful, */
X/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
X/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
X/* GNU General Public License for more details. */
X/* */
X/* You should have received a copy of the GNU General Public License */
X/* along with this program; if not, write to the Free Software */
X/* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
X/* */

X/* FILE: z10.c */
X/* MODULE: Cross References */
X/* EXTERNS: CrossInit(), CrossMake(), GallTargEval(), CrossExpand(), */
X/* CrossSequence(), CrossClose() */


X/* */
X/*****************************************************************************/
X#include "externs"

X#define CROSS_LIT CROSS_TARG
X#define NO_TARGET 0
X#define SEEN_TARGET 1
X#define WRITTEN_TARGET 2
X
Xstatic OBJECT RootCross = nil; /* header for all crs */


X
X
X/*****************************************************************************/
X/* */

X/* CrossInit(sym) */
X/* */
X/* Initialize cross_sym(sym). */
X/* */
X/*****************************************************************************/
X
XCrossInit(sym)
XOBJECT sym;
X{ OBJECT cs; int i;
X cs = New(CROSS_SYM);
X target_state(cs) = NO_TARGET;
X target_seq(cs) = 0;
X cr_file(cs) = NO_FILE;
X gall_seq(cs) = 0;
X gall_tag(cs) = nil;
X gall_tfile(cs) = NO_FILE;
X gentag_file(cs) = NO_FILE;
X symb(cs) = sym;
X cross_sym(sym) = cs;
X gentag_fseq(cs) = NewWord(MAX_FILES, no_fpos);
X for( i = 0; i < MAX_FILES; i++ ) string(gentag_fseq(cs))[i] = 0;
X if( RootCross == nil ) RootCross = New(CR_ROOT);
X Link(RootCross, cs);


X}
X
X
X/*****************************************************************************/
X/* */

X/* OBJECT CrossGenTag(x) */
X/* */
X/* Generate a tag suitable for labelling closure x, in such a way that */
X/* the same tag is likely to be generated on subsequent runs. */
X/* */
X/*****************************************************************************/
X
XOBJECT CrossGenTag(x)
XOBJECT x;
X{ unsigned char buff[MAX_LINE], *str1, *str2;
X OBJECT sym, cs, gt, res; FILE_NUM fnum;
X unsigned char *sgt;
X int seq;
X debug1(DCR, D, "CrossGenTag( %s )", SymName(actual(x)));
X sym = actual(x);
X if( cross_sym(sym) == nil ) CrossInit(sym);
X cs = cross_sym(sym);
X fnum = file_num(fpos(x));
X /* ***
X if( fnum != gentag_file(cs) )
X { gentag_file(cs) = fnum;
X gentag_seq(cs) = 0;
X }
X *** */
X str1 = FullSymName(sym, ".");
X str2 = FileName(fnum);
X gt = gentag_fseq(cs);
X sgt = string(gt);
X seq = ++(sgt[fnum]);
X if( strlen(str1) + strlen(str2) + 10 >= MAX_LINE )
X Error(FATAL,no_fpos, "automatically generated tag \"%s.%s.%d\" is too long",
X str1, str2, seq);
X sprintf(buff, "\"%s.%s.%d\"", str1, str2, seq);
X res = MakeWord(buff, &fpos(x));
X debug1(DCR, DD, "CrossGenTag returning %s", string(res));
X return res;
X} /* end CrossGenTag */


X
X
X/*@@**************************************************************************/
X/* */

X/* OBJECT CrossMake(sym, val, ctype) */
X/* */
X/* Make a cross-reference with the given sym and tag value. */
X/* NB The fpos fields are not set, so we cannot EchofilePos from this. */
X/* */
X/*****************************************************************************/
X
XOBJECT CrossMake(sym, val, ctype)
XOBJECT sym, val; int ctype;
X{ OBJECT v1, res;
X debug3(DCR, DD, "CrossMake(%s, %s, %s)", SymName(sym),
X EchoObject(null, val), Image(ctype));
X res = New(CROSS);
X cross_type(res) = ctype; threaded(res) = FALSE;
X v1 = New(CLOSURE); actual(v1) = sym;
X Link(res, v1); Link(res, val);
X debug1(DCR, DD, "CrossMake returning %s", EchoObject(null, res));
X return res;


X}
X
X
X/*****************************************************************************/
X/* */

X/* OBJECT GallTargEval(sym, dfpos) */
X/* */
X/* Produce a suitable cross-reference for a galley target. */
X/* */
X/*****************************************************************************/
X
XOBJECT GallTargEval(sym, dfpos)
XOBJECT sym; FILE_POS *dfpos;
X{ OBJECT cs, res;
X unsigned char buff[MAX_LINE], *str;
X debug2(DCR, DD, "GallTargEval( %s,%s )", SymName(sym), EchoFilePos(dfpos));
X if( cross_sym(sym) == nil ) CrossInit(sym);
X cs = cross_sym(sym);
X if( file_num(*dfpos) != gall_tfile(cs) )
X { gall_tfile(cs) = file_num(*dfpos);
X gall_seq(cs) = 0;
X }
X str = FileName(gall_tfile(cs));
X if( strlen(str) + 6 >= MAX_LINE )
X Error(FATAL, dfpos, "automatically generated tag %s&%d is too long",
X str, ++gall_seq(cs));
X sprintf(buff, "%s&%d", str, ++gall_seq(cs));
X res = CrossMake(sym, MakeWord(buff, dfpos), GALL_TARG);
X debug1(DCR, DD, "GallTargEval returning %s", EchoObject(null, res));
X return res;
X} /* end GallTargEval */


X
X
X/*@@**************************************************************************/
X/* */

X/* OBJECT CrossExpand(x, env, style, crs_wanted, crs, res_env) */
X/* */
X/* Return the value of cross-reference x, with environment *res_env. If x */
X/* has a non-literal tag, it must be tracked, so an object is added to *crs */
X/* for this purpose if crs_wanted. Result replaces x, which is disposed. */
X/* */
X/*****************************************************************************/
Xstatic OBJECT nbt[2] = { nil, nil };
Xstatic OBJECT nft[2] = { nil, nil };
Xstatic OBJECT ntarget = nil;
X
XOBJECT CrossExpand(x, env, style, crs_wanted, crs, res_env)
XOBJECT x, env; STYLE *style; BOOLEAN crs_wanted; OBJECT *crs, *res_env;
X{ OBJECT sym, res, tag, y, cs, link, db, tmp, index;
X int ctype; unsigned char buff[MAX_LINE], seq[MAX_LINE], *str;
X FILE_NUM fnum, dfnum;
X long cont, dfpos;
X assert( type(x) == CROSS, "CrossExpand: x!" );
X debug2(DCR, DD, "CrossExpand( %s, %s )",
X EchoObject(null, x), EchoObject(null, *crs));
X assert( NextDown(Down(x)) == LastDown(x), "CrossExpand: #args!" );
X
X /* manifest and tidy the right parameter */
X Child(tag, LastDown(x));
X tag = Manifest(tag, env, style, nbt, nft, &ntarget, crs, FALSE, FALSE);
X tag = ReplaceWithTidy(tag);
X
X /* extract sym (the symbol name) and tag (the tag value) from x */
X Child(y, Down(x));
X if( type(y) == CLOSURE ) sym = actual(y);
X ctype = type(y) != CLOSURE ? 1 :
X type(tag) != WORD ? 2 :
X string(tag)[0] == '\0' ? 3 :
X strcmp(string(tag), KW_PRECEDING) == 0 ? CROSS_PREC :
X strcmp(string(tag), KW_FOLLOWING) == 0 ? CROSS_FOLL : CROSS_LIT;
X
X res = nil;
X switch( ctype )
X {
X
X case 1:
X
X Error(WARN, &fpos(y), "left parameter of %s is not a symbol", KW_CROSS);
X break;
X
X
X case 2:
X
X Error(WARN, &fpos(tag),
X "value of right parameter of %s is not a simple word", KW_CROSS);
X break;
X
X
X case 3:
X
X Error(WARN, &fpos(tag),
X "value of right parameter of %s is an empty word", KW_CROSS);
X break;
X
X
X case CROSS_LIT:
X
X if( cross_sym(sym) == nil ) CrossInit(sym);
X cs = cross_sym(sym);
X if( sym == MomentSym && strcmp(string(tag), KW_NOW) == 0 )
X { /* this is a request for the current time */
X res = StartMoment();
X }
X else for( link = NextUp(Up(cs)); link != cs; link = NextUp(link) )
X { Parent(db, link);
X assert( type(db) == WORD, "CrossExpand: db!" );
X if( DbRetrieve(db, FALSE, sym, string(tag), seq, &dfnum,&dfpos,&cont) )
X { res = ReadFromFile(dfnum, dfpos, sym);
X if( db != OldCrossDb ) AttachEnv(env, res);


X break;
X }
X }
X break;
X
X

X case CROSS_PREC:
X case CROSS_FOLL:
X

X if( cross_sym(sym) == nil ) CrossInit(sym);
X cs = cross_sym(sym);
X assert( cs != nil, "CrossExpand/CROSS_FOLL: cs == nil!" );
X assert( type(cs) == CROSS_SYM, "CrossExpand/CROSS_FOLL: type(cs)!" );
X fnum = file_num(fpos(tag));
X if( fnum != cr_file(cs) )
X { cr_file(cs) = fnum;
X cr_seq(cs) = 0;
X }
X str = FileName(fnum);
X if( strlen(str) + 5 >= MAX_LINE )
X Error(FATAL, &fpos(x), "automatically generated tag %s_%d is too long",
X str, ++cr_seq(cs));
X sprintf(buff, "%s_%d", str, ++cr_seq(cs));
X tmp = CrossMake(sym, MakeWord(buff, &fpos(tag)), ctype);
X index = New(ctype);
X actual(index) = tmp;
X Link(index, tmp);
X if( crs_wanted )
X { if( *crs == nil ) *crs = New(CR_LIST);
X link = Link(*crs, index);
X }
X else Error(FATAL, &fpos(x), "%s or %s tag not allowed here",
X KW_PRECEDING, KW_FOLLOWING);
X if( AllowCrossDb &&
X DbRetrieve(OldCrossDb, FALSE, sym, buff, seq, &dfnum, &dfpos,&cont) )
X res = ReadFromFile(dfnum, dfpos, nil);


X break;
X
X
X default:
X

X Error(INTERN, no_fpos, "CrossExpand switch!");
X break;
X
X
X } /* end switch */
X if( res == nil )
X { OBJECT envt;
X if( ctype > 1 ) Error(WARN, &fpos(x), "%s%s%s unknown",
X SymName(sym), KW_CROSS, string(tag));
X
X /* build dummy result with environment attached */
X /* nb at present we are not adding dummy import closures to this! */
X res = New(CLOSURE); actual(res) = sym;
X y = res;
X debug1(DCR, DD, "First y = %s", SymName(actual(y)));
X while( enclosing(actual(y)) != StartSym )
X { tmp = New(CLOSURE);
X actual(tmp) = enclosing(actual(y));
X envt = SetEnv(tmp, nil);
X AttachEnv(envt, y);
X y = tmp;
X debug1(DCR, DD, "Later y = %s", SymName(actual(y)));
X }
X envt = New(ENV); Link(y, envt);
X }
X
X /* set environment, replace x by res, debug and exit */
X *res_env = DetachEnv(res);
X ReplaceNode(res, x);
X DisposeObject(x);
X debug1(DCR, DD, "CrossExpand returning %s", EchoObject(null, res));
X debug1(DCR, DD, " *crs = %s", EchoObject(null, *crs));
X debug1(DCR, DD, " *res_env = %s", EchoObject(null, *res_env));
X return res;
X} /* end CrossExpand */


X
X
X/*@@**************************************************************************/
X/* */

X/* CrossSequence(x) */
X/* */
X/* Object x is an insinuated cross-reference that has just been popped off */
X/* the top of the root galley. Resolve it with the sequence of others. */
X/* */
X/*****************************************************************************/
X
XCrossSequence(x)
XOBJECT x;
X{ OBJECT sym, tag, val, tmp, cs, par, key, link, y;
X unsigned ctype; unsigned char buff[MAX_LINE], *str, *seq;
X FILE_NUM dfnum; int dfpos;
X
X /* if suppressing cross-referencing, dispose x and quit */
X if( !AllowCrossDb )
X { if( Up(x) == x ) DisposeObject(x);
X debug0(DCR, D, "CrossSequence returning (!AllowCrossDb).");
X return;
X }
X
X /* get interesting fragments from x */
X assert( type(x) == CROSS, "CrossSequence: type(x)!" );
X ctype = cross_type(x);
X Child(tmp, Down(x));
X assert( type(tmp) == CLOSURE, "CrossSequence: type(tmp)!" );
X sym = actual(tmp);
X if( cross_sym(sym) == nil ) CrossInit(sym);
X cs = cross_sym(sym);
X assert( type(cs) == CROSS_SYM, "CrossSequence: cs!" );
X
X /* debug output */
X debug2(DCR, D, "CrossSequence %s %s", Image(ctype), SymName(sym));
X debug1(DCR, DD, " x = %s", EchoObject(null, x));
X ifdebug(DCR, DD, EchoObject(stderr, cs));
X
X /* delete as much of x as possible */
X Child(tag, NextDown(Down(x)));
X DeleteLink(NextDown(Down(x)));
X if( Up(x) == x ) DisposeObject(x);
X
X switch( ctype )
X {
X case GALL_FOLL:
X case GALL_PREC:
X
X /* find key of the galley, if any */
X val = tag; key = nil;
X for( link = Down(val); link != val; link = NextDown(link) )
X { Child(par, link);
X if( type(par) == PAR && (is_key(actual(par)) || is_tag(actual(par))) )
X { assert( Down(par) != par, "CrossSequence: PAR child!" );
X Child(key, Down(par));
X key = ReplaceWithTidy(key);
X }
X }
X
X /* write out the galley */
X str = FileName(file_num(fpos(val)));
X if( strlen(str) + strlen(DATA_SUFFIX) >= MAX_LINE )
X Error(FATAL, &fpos(val), "database file name %s%s is too long",
X str, DATA_SUFFIX);
X sprintf(buff, "%s%s", str, DATA_SUFFIX);
X dfnum = FileNum(buff);
X if( dfnum == NO_FILE )
X dfnum = DefineFile(MakeWord(buff, &fpos(val)),
X DATABASE_FILE, SOURCE_PATH);
X AppendToFile(val, dfnum, &dfpos);
X
X /* determine the sequence number or string of this galley */
X if( key == nil )
X { sprintf(buff, "%.5d", ++gall_seq(cs));
X seq = buff;
X }
X else if( type(key) != WORD )
X { Error(WARN, &fpos(key), "%s parameter is not a word", KW_KEY);
X seq = (unsigned char *) "badkey";
X }
X else if( string(key)[0] == '\0' )
X { Error(WARN, &fpos(key), "%s parameter is empty word", KW_KEY);
X seq = (unsigned char *) "badkey";
X }
X else seq = string(key);
X
X /* either write out the index immediately or store it for later */
X if( ctype == GALL_PREC )
X { if( gall_tag(cs) == nil )
X { Error(WARN, &fpos(val), "no %s precedes this %s%s%s",
X SymName(sym), SymName(sym), KW_CROSS, KW_PRECEDING);
X debug0(DCR, DD, " ... so substituting \"none\"");
X gall_tag(cs) = MakeWord("none", &fpos(val));
X }
X assert( type(gall_tag(cs)) == WORD && string(gall_tag(cs))[0] != '\0',
X "CrossSequence: gall_tag!" );
X debug3(DCR, D, " inserting galley (prec) %s&%s %s", SymName(sym),
X string(gall_tag(cs)), seq);
X DbInsert(NewCrossDb, TRUE, sym, string(gall_tag(cs)), seq,
X dfnum, (long) dfpos);
X }
X else
X { tmp = MakeWord(seq, &fpos(val));
X gall_rec(tmp) = TRUE;
X file_num(fpos(tmp)) = dfnum;
X gall_pos(tmp) = dfpos;
X Link(cs, tmp);
X debug2(DCR, D, " saving galley (foll) %s&? %s", SymName(sym), seq);
X }
X DisposeObject(val);
X break;
X
X
X case GALL_TARG:
X
X if( gall_tag(cs) != nil ) DisposeObject(gall_tag(cs));
X if( type(tag) != WORD || string(tag)[0] == '\0' )
X {
X debug2(DCR, DD, " GALL_TARG %s put none for %s",
X SymName(sym), EchoObject(null, tag));
X DisposeObject(tag);
X gall_tag(cs) = MakeWord("none", no_fpos);
X }
X else gall_tag(cs) = tag;
X debug2(DCR, D, " have new %s gall_targ %s", SymName(sym),
X EchoObject(null, gall_tag(cs)));
X for( link = Down(cs); link != cs; link = NextDown(link) )
X { Child(y, link);
X assert( type(y) == WORD && string(y)[0] != '\0',
X "CrossSequence: GALL_TARG y!" );
X if( gall_rec(y) )
X {
X debug3(DCR, D, " inserting galley (foll) %s&%s %s", SymName(sym),
X string(gall_tag(cs)), string(y));
X DbInsert(NewCrossDb, TRUE, sym, string(gall_tag(cs)), string(y),
X file_num(fpos(y)), (long) gall_pos(y));


X link = PrevDown(link);
X DisposeChild(NextDown(link));
X }

X }
X break;
X
X

X case CROSS_PREC:
X
X if( target_state(cs) == NO_TARGET )
X { Error(WARN, &fpos(tag), "no invokation of %s precedes this %s%s%s",
X SymName(sym), SymName(sym), KW_CROSS, KW_PRECEDING);
X break;
X }
X if( target_state(cs) == SEEN_TARGET )
X {
X debug2(DCR, D, " inserting %s cross_targ %s",
X SymName(sym), target_val(cs));
X AppendToFile(target_val(cs), target_file(cs), &target_pos(cs));
X DisposeObject(target_val(cs));
X target_val(cs) = nil;
X target_state(cs) = WRITTEN_TARGET;
X }
X if( type(tag) != WORD || string(tag)[0] == '\0' )
X {
X debug2(DCR, DD, " GALL_TARG %s put none for %s", SymName(sym),
X EchoObject(null, tag));
X DisposeObject(tag);
X tag = MakeWord("none", no_fpos);
X }
X debug3(DCR, D, " inserting cross (prec) %s&%s %s", SymName(sym),
X string(tag), "0");
X DbInsert(NewCrossDb, FALSE, sym, string(tag), "0", target_file(cs),
X (long) target_pos(cs));
X DisposeObject(tag);
X break;
X
X
X case CROSS_FOLL:
X
X if( type(tag) != WORD )
X { Error(WARN, &fpos(tag), "tag of %s is not a simple word",
X SymName(symb(cs)));
X debug1(DCR, DD, " tag = %s", EchoObject(null, tag));
X }
X else if( string(tag)[0] == '\0' )
X {
X debug1(DCR, D, " ignoring cross (foll) %s (empty tag)", SymName(sym));
X }
X else
X { Link(cs, tag);
X gall_rec(tag) = FALSE;
X debug3(DCR, D, " storing cross (foll) %s&%s %s", SymName(sym),
X string(tag), "?");


X }
X break;
X
X

X case CROSS_TARG:
X
X /* get rid of old target, if any, and add new one */
X if( target_state(cs) == SEEN_TARGET )
X {
X debug2(DCR, D, " disposing unused %s cross_targ %s", SymName(sym),
X target_val(cs));
X DisposeObject(target_val(cs));
X }
X debug2(DCR, D, " remembering new %s cross_targ %s", SymName(sym),
X EchoObject(null, tag));
X target_val(cs) = tag;
X assert( Up(tag) == tag, "CrossSeq: Up(tag)!" );
X str = FileName(file_num(fpos(tag)));
X if( strlen(str) + strlen(DATA_SUFFIX) >= MAX_LINE )
X Error(FATAL, &fpos(tag), "database file name %s%s is too long",
X str, DATA_SUFFIX);
X sprintf(buff, "%s%s", str, DATA_SUFFIX);
X target_file(cs) = FileNum(buff);
X if( target_file(cs) == NO_FILE )
X target_file(cs) = DefineFile(MakeWord(buff, &fpos(tag)),
X DATABASE_FILE, SOURCE_PATH);
X target_state(cs) = SEEN_TARGET;
X
X /* store tag of the galley, if any */
X tag = nil;
X assert( type(target_val(cs)) == CLOSURE, "CrossSequence: target_val!" );
X link = Down(target_val(cs));
X for( ; link != target_val(cs); link = NextDown(link) )
X { Child(par, link);
X if( type(par) == PAR && is_tag(actual(par)) )
X { assert( Down(par) != par, "CrossSequence: Down(PAR)!" );
X Child(tag, Down(par));
X tag = ReplaceWithTidy(tag);
X if( type(tag) != WORD )
X { Error(WARN, &fpos(tag), "%s tag is not a simple word",
X SymName(actual(target_val(cs))));
X debug1(DCR, DD, " tag = %s", EchoObject(null, tag));
X }
X else if( string(tag)[0] == '\0' )
X {
X debug1(DCR, D, " ignoring cross (own tag) %s (empty tag)",
X SymName(sym));
X }
X else
X { Link(cs, tag);
X gall_rec(tag) = FALSE;
X debug3(DCR, D, " storing cross (own tag) %s&%s %s", SymName(sym),
X string(tag), "?");


X }
X break;
X }
X }
X

X /* if new target is already writable, write it */
X if( Down(cs) != cs )
X {
X debug2(DCR, D, " writing %s cross_targ %s", SymName(sym),
X EchoObject(null, target_val(cs)));
X AppendToFile(target_val(cs), target_file(cs), &target_pos(cs));
X DisposeObject(target_val(cs));
X for( link = Down(cs); link != cs; link = NextDown(link) )
X { Child(tag, link);
X assert( type(tag) == WORD && string(tag)[0] != '\0',
X "CrossSeq: non-WORD or empty tag!" );
X if( !gall_rec(tag) )
X {
X debug3(DCR, D, " inserting cross (foll) %s&%s %s", SymName(sym),
X string(tag), "0");
X DbInsert(NewCrossDb, FALSE, sym, string(tag),
X "0", target_file(cs), (long) target_pos(cs));


X link = PrevDown(link);
X DisposeChild(NextDown(link));
X }

X }
X target_state(cs) = WRITTEN_TARGET;


X }
X break;
X
X
X default:
X

X Error(INTERN, &fpos(tag), "CrossSequence: ctype = %s", Image(ctype));


X break;
X
X } /* end switch */

X debug0(DCR, D, "CrossSequence returning.");
X debug0(DCR, DD, " cs =");
X ifdebug(DCR, DD, EchoObject(stderr, cs));
X} /* end CrossSequence */


X
X
X/*@@**************************************************************************/
X/* */

X/* CrossClose() */
X/* */
X/* Check for dangling forward references, and convert old cross reference */
X/* database to new one. */
X/* */
X/*****************************************************************************/
X
XCrossClose()
X{ OBJECT link, cs, ylink, y, sym; BOOLEAN g; int len, count;
X FILE_NUM dfnum; long dfpos, cont;
X unsigned char buff[MAX_LINE], seq[MAX_LINE], tag[MAX_LINE];
X debug0(DCR, D, "CrossClose()");
X ifdebug(DCR, DD, if( RootCross != nil ) EchoObject(stderr, RootCross));
X
X /* if suppressing cross referencing, return */
X if( !AllowCrossDb )
X { debug0(DCR, D, "CrossClose returning (!AllowCrossDb).");
X return;
X }
X
X /* check for dangling forward references and dispose cross ref structures */
X if( RootCross != nil )
X { for( link = Down(RootCross); link != RootCross; link = NextDown(link) )
X { Child(cs, link);
X assert( type(cs) == CROSS_SYM, "CrossClose: type(cs)!" );
X count = 0; ylink = Down(cs);
X while( ylink != cs && count <= 5 )
X { Child(y, ylink);
X Error(WARN, &fpos(y), "no invokation of %s follows this %s%s%s",
X SymName(symb(cs)), SymName(symb(cs)), KW_CROSS, KW_FOLLOWING);
X debug2(DCR, D, "gall_rec(y) = %s, y = %s",
X bool(gall_rec(y)), EchoObject(null, y));
X if( gall_rec(y) ) DbInsert(NewCrossDb, TRUE, symb(cs), "none",
X string(y), file_num(fpos(y)), (long) gall_pos(y));
X count++; ylink = NextDown(ylink);
X }
X if( ylink != cs ) Error(WARN, no_fpos, "and more undefined %s%s%s",
X SymName(symb(cs)), KW_CROSS, KW_FOLLOWING);
X ifdebug(ANY, D,
X if( target_state(cs) == SEEN_TARGET ) DisposeObject(target_val(cs));
X if( gall_tag(cs) != nil ) DisposeObject(gall_tag(cs));
X );
X }
X ifdebug(ANY, D, DisposeObject(RootCross); );
X }
X
X /* add to NewCrossDb those entries of OldCrossDb from other source files */
X if( AllowCrossDb )
X cont = 0L; len = strlen(DATA_SUFFIX);
X while( DbRetrieveNext(OldCrossDb, &g, &sym, tag, seq, &dfnum, &dfpos, &cont) )
X { if( g ) continue;
X strcpy(buff, FileName(dfnum));
X buff[strlen(buff) - len] = '\0';
X if( FileNum(buff) == NO_FILE )
X DbInsert(NewCrossDb, FALSE, sym, tag, seq, dfnum, dfpos);
X }
X
X /* make NewCrossDb readable, for next run */
X DbConvert(NewCrossDb, TRUE);
X
X debug0(DCR, D, "CrossClose returning.");
X} /* end CrossClose */
END_OF_FILE
if test 24737 -ne `wc -c <'lout/z10.c'`; then
echo shar: \"'lout/z10.c'\" unpacked with wrong size!
fi
# end of 'lout/z10.c'
fi
echo shar: End of archive 4 \(of 30\).
cp /dev/null ark4isdone

Jeff Kingston

unread,
May 30, 1993, 11:52:27 PM5/30/93
to
Submitted-by: je...@joyce.cs.su.oz.au (Jeff Kingston)
Posting-number: Volume 37, Issue 103
Archive-name: lout/part05
Environment: UNIX

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: lout/data/refstyles.ld lout/doc/tr.eq/outfile.ps.C
# lout/include/tab
# Wrapped by kent@sparky on Sun May 30 19:43:54 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 5 (of 30)."'
if test -f 'lout/data/refstyles.ld' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/data/refstyles.ld'\"
else
echo shar: Extracting \"'lout/data/refstyles.ld'\" \(911 characters\)
sed "s/^X//" >'lout/data/refstyles.ld' <<'END_OF_FILE'
X{ Book @RefStyle @Style
X { @Reference&&reftag @Open
X { @Author, {Slope @Font @Title}. @Publisher, @Year. @Comment }
X }
X}
X
X{ JournalArticle @RefStyle @Style
X { @Reference&&reftag @Open
X { @Author, @Title. {Slope @Font @Journal} {Bold @Font @Volume},
X@Pages (@Year). @Comment
X }
X }
X}
X
X{ ConferencePaper @RefStyle @Style
X { @Reference&&reftag @Open
X { @Author, @Title. {Slope @Font @Proceedings},
X@Year, @Pages. @Comment
X }
X }
X}
X
X{ TechReport @RefStyle @Style
X { @Reference&&reftag @Open
X { @Author, {Slope @Font @Title}. Tech. Rep. @Number (@Year),
X@Institution. @Comment
X }
X }
X}
X
X{ PhD @RefStyle @Style
X { @Reference&&reftag @Open
X { @Author, {Slope @Font @Title}. Ph.D. thesis,
X@Institution (@Year). @Comment
X }
X }
X}
X
X{ Software @RefStyle @Style
X { @Reference&&reftag @Open
X { @Author, {Slope @Font @Title}, @Year. @Comment
X }
X }
X}
END_OF_FILE
if test 911 -ne `wc -c <'lout/data/refstyles.ld'`; then
echo shar: \"'lout/data/refstyles.ld'\" unpacked with wrong size!
fi
# end of 'lout/data/refstyles.ld'
fi
if test -f 'lout/doc/tr.eq/outfile.ps.C' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.eq/outfile.ps.C'\"
else
echo shar: Extracting \"'lout/doc/tr.eq/outfile.ps.C'\" \(53998 characters\)
sed "s/^X//" >'lout/doc/tr.eq/outfile.ps.C' <<'END_OF_FILE'
X
Xgrestore
X
X/Helvetica 220 fnt
X2791 5509 moveto(vee)s
X/Symbol 240 fnt
X3490 5506 moveto(\332)s
X/Helvetica 220 fnt
X5367 5509 moveto(wedge)s
X/Symbol 240 fnt
X6358 5506 moveto(\331)s
X/Helvetica 220 fnt
X8357 5509 moveto(oplus)s
X
X/Symbol 240 fnt
X9226 5506 moveto(\305)s
X/Helvetica 220 fnt
X2438 5221 moveto(ominus)s gsave
X3490 5206 translate
X168 144 0 72 240 288 0 loutgr
Xgsave
Xxsize ysize 2 div moveto
Xxsize 2 div ysize 2 div xsize 2 div 0 360 arc
X0.04 ft setlinewidth stroke


Xgrestore
X
Xgrestore
X
X/Symbol 240 fnt

X3508 5218 moveto(-)s
X/Helvetica 220 fnt
X5367 5221 moveto(otimes)s
X/Symbol 240 fnt
X6358 5218 moveto(\304)s
X
X/Helvetica 220 fnt
X8247 5221 moveto(oslash)s gsave
X9274 5278 translate
X-180.0000 rotate
Xgsave
X0 -94 translate
X180.0000 rotate
Xgsave
X0 -186 translate
X60.0000 rotate
Xgsave
X0 -72 translate
X168 144 0 72 240 288 0 loutgr
Xgsave
Xxsize ysize 2 div moveto
Xxsize 2 div ysize 2 div xsize 2 div 0 360 arc
X0.04 ft setlinewidth stroke


Xgrestore
X
Xgrestore
X
X/Symbol 240 fnt

X21 -60 moveto(-)s

Xgrestore
X
Xgrestore
X
Xgrestore
Xgsave

X9274 5186 translate
X60.0000 rotate
Xgsave
X0 -72 translate
X168 144 0 72 240 288 0 loutgr
Xgsave
Xxsize ysize 2 div moveto
Xxsize 2 div ysize 2 div xsize 2 div 0 360 arc
X0.04 ft setlinewidth stroke


Xgrestore
X
Xgrestore
X
X/Symbol 240 fnt

X21 -60 moveto(-)s
Xgrestore
X
X/Helvetica 220 fnt
X2718 4933 moveto(odot)s gsave
X3490 4918 translate
X168 144 0 72 240 288 0 loutgr
Xgsave
Xxsize ysize 2 div moveto
Xxsize 2 div ysize 2 div xsize 2 div 0 360 arc
X0.04 ft setlinewidth stroke


Xgrestore
X
Xgrestore
X
X/Symbol 240 fnt

X3544 4930 moveto(\327)s
X
X/Helvetica 220 fnt
X5330 4933 moveto(dagger)s
X/Times-Roman 240 fnt
X6358 4937 moveto(\262)s
X/Helvetica 220 fnt
X7906 4933 moveto(daggerdbl)s
X/Times-Roman 240 fnt
X9226 4937 moveto(\263)s
X/Helvetica 220 fnt
X2548 4645 moveto(amalg)s
Xgsave
X3687 4702 translate
X180.0000 rotate
Xgsave
X0 0 translate
X-180.0000 rotate
Xgsave
X0 -102 translate
X180.0000 rotate
X
X/Symbol 240 fnt
X0 -180 moveto(\325)s

Xgrestore
X
Xgrestore
X
X/Symbol 240 fnt

X0 -78 moveto(\325)s

Xgrestore
X
X/Times-Roman 240 fnt

X1417 4146 moveto(The)s 1849 x(following)s 2839 x(names)s
X3510 x(de\256ne)s 4155 x(punctuation)s 5345 x(symbols)s 6203 x(\(thin)s 6714 x(space)s
X7305 x(on)s 7605 x(the)s 7957 x(right-hand)s 9013 x(side\):)s
X/Helvetica 220 fnt
X3084 3647 moveto(;)s
X
X/Symbol 240 fnt
X3433 3644 moveto(\073)s
X/Helvetica 220 fnt
X5952 3647 moveto(,)s
X/Symbol 240 fnt
X6301 3644 moveto(\054)s
X/Helvetica 220 fnt
X8601 3647 moveto(col)s
X/Symbol 240 fnt
X9169 3644 moveto(\072)s
X
X/Times-Roman 240 fnt
X1417 3158 moveto(The)s 1871 x(following)s 2883 x(symbols)s 3763 x(are)s 4136 x(used)s
X4657 x(in)s 4925 x(ways)s 5499 x(typi\256ed)s 6312 x(by)s 6634 x(the)s
X7008 x(large)s 7567 x(sum)s 8048 x(and)s 8476 x(product)s 9289 x(symbols.)s
X10289 x(In)s 1417 2870 moveto(display)s 2168 x(equations)s 3145 x(they)s 3617 x(should)s
X4316 x(be)s 4602 x(preceded)s 5525 x(by)s 5825 x(the)s
X/Helvetica 220 fnt
X6177 2866 moveto(big)s
X
X/Times-Roman 240 fnt
X6529 2870 moveto(symbol:)s
X/Helvetica 220 fnt
X2730 2352 moveto(sum)s
X/Symbol 240 fnt
X3433 2349 moveto(\345)s
X/Helvetica 220 fnt
X5574 2352 moveto(prod)s
X/Symbol 240 fnt
X6301 2349 moveto(\325)s
X
X/Helvetica 220 fnt
X8210 2352 moveto(coprod)s gsave
X9366 2409 translate
X180.0000 rotate
Xgsave
X0 0 translate
X-180.0000 rotate
Xgsave
X0 -102 translate
X180.0000 rotate
X
X/Symbol 240 fnt
X0 -180 moveto(\325)s

Xgrestore
X
Xgrestore
X
X/Symbol 240 fnt

X0 -78 moveto(\325)s
Xgrestore
X
X/Helvetica 220 fnt
X2914 1978 moveto(int)s gsave
X3433 2035 translate


X-180.0000 rotate
Xgsave
X0 -159 translate
X180.0000 rotate
X
X/Symbol 312 fnt
X0 -285 moveto(\362)s
X
Xgrestore
X
Xgrestore
X
X/Symbol 312 fnt

X3433 1909 moveto(\362)s
X/Helvetica 220 fnt
X5660 1978 moveto(oint)s gsave
X6301 2035 translate
X-180.0000 rotate
Xgsave
X0 -52 translate
X180.0000 rotate
X
X/Symbol 240 fnt
X0 -164 moveto(\260)s

Xgrestore
X
Xgrestore
X
X/Symbol 240 fnt

X6301 1923 moveto(\260)s gsave
X6304 2035 translate


X-180.0000 rotate
Xgsave
X0 -159 translate
X180.0000 rotate
X
X/Symbol 312 fnt
X0 -285 moveto(\362)s
X
Xgrestore
X
Xgrestore
X
X/Symbol 312 fnt

X6304 1909 moveto(\362)s
X/Helvetica 220 fnt
X8405 1978 moveto(bcap)s
X/Symbol 312 fnt
X9169 1957 moveto(\307)s
X/Helvetica 220 fnt
X2669 1604 moveto(bcup)s
X/Symbol 312 fnt
X3433 1583 moveto(\310)s
X
X/Helvetica 220 fnt
X5537 1604 moveto(bvee)s
X/Symbol 312 fnt
X6301 1583 moveto(\332)s
X/Helvetica 220 fnt
X8113 1604 moveto(bwedge)s
X/Symbol 312 fnt
X9169 1583 moveto(\331)s
Xpgsave restore
Xshowpage
X
X%%Page: ? 11


X%%BeginPageSetup
X0.0500 dup scale 10 setlinewidth
X/pgsave save def
X%%EndPageSetup
X
X/Times-Roman 240 fnt

X5694 15261 moveto(-)s 5833 x(10)s 6133 x(-)s
X/Helvetica 220 fnt
X2596 14643 moveto(bodot)s gsave
X3433 14607 translate
X218 186 0 93 312 288 78 loutgr
Xgsave
Xxsize ysize 2 div moveto
Xxsize 2 div ysize 2 div xsize 2 div 0 360 arc
X0.04 ft setlinewidth stroke
Xgrestore
X
Xgrestore
X
X/Symbol 312 fnt
X3503 14622 moveto(\327)s
X
X/Helvetica 220 fnt
X5245 14643 moveto(botimes)s
X/Symbol 312 fnt
X6301 14622 moveto(\304)s
X/Helvetica 220 fnt
X8235 14643 moveto(boplus)s
X/Symbol 312 fnt
X9169 14622 moveto(\305)s
X/Helvetica 220 fnt
X2499 14269 moveto(buplus)s
X
X/Symbol 218 fnt
X3493 14334 moveto(+)s
X/Symbol 312 fnt
X3433 14248 moveto(\310)s
X/Times-Roman 240 fnt
X1417 13771 moveto(The)s 1867 x(following)s 2875 x(symbols)s
X3751 x(are)s 4120 x(de\256ned)s 4903 x(so)s 5194 x(that)s 5630 x(they)s
X6120 x(will)s 6569 x(appear)s 7284 x(in)s 7548 x(Roman,)s 8378 x(as)s
X8655 x(is)s 8892 x(con)s 9238 x(vent)s 9650 x(ional)s 10206 x(for)s
X1417 13483 moveto(them)s 1955 x(in)s 2201 x(equations:)s
X/Helvetica 220 fnt
X2498 12977 moveto(arccos)s
X/Times-Roman 240 fnt
X3433 12981 moveto(arccos)s
X
X/Helvetica 220 fnt
X5428 12977 moveto(arcsin)s
X/Times-Roman 240 fnt
X6301 12981 moveto(arcsin)s
X/Helvetica 220 fnt
X8271 12977 moveto(arctan)s
X/Times-Roman 240 fnt
X9169 12981 moveto(arctan)s
X/Helvetica 220 fnt
X2828 12689 moveto(arg)s
X
X/Times-Roman 240 fnt
X3433 12693 moveto(arg)s
X/Helvetica 220 fnt
X5671 12689 moveto(cos)s
X/Times-Roman 240 fnt
X6301 12693 moveto(cos)s
X/Helvetica 220 fnt
X8417 12689 moveto(cosh)s
X/Times-Roman 240 fnt
X9169 12693 moveto(cosh)s
X
X/Helvetica 220 fnt
X2852 12401 moveto(cot)s
X/Times-Roman 240 fnt
X3433 12405 moveto(cot)s
X/Helvetica 220 fnt
X5598 12401 moveto(coth)s
X/Times-Roman 240 fnt
X6301 12405 moveto(coth)s
X/Helvetica 220 fnt
X8551 12401 moveto(csc)s
X
X/Times-Roman 240 fnt
X9169 12405 moveto(csc)s
X/Helvetica 220 fnt
X2779 12113 moveto(deg)s
X/Times-Roman 240 fnt
X3433 12117 moveto(deg)s
X/Helvetica 220 fnt
X5708 12113 moveto(det)s
X/Times-Roman 240 fnt
X6301 12117 moveto(det)s
X
X/Helvetica 220 fnt
X8528 12113 moveto(dim)s
X/Times-Roman 240 fnt
X9169 12117 moveto(dim)s
X/Helvetica 220 fnt
X2791 11825 moveto(exp)s
X/Times-Roman 240 fnt
X3433 11829 moveto(exp)s
X/Helvetica 220 fnt
X5659 11825 moveto(gcd)s
X
X/Times-Roman 240 fnt
X6301 11829 moveto(gcd)s
X/Helvetica 220 fnt
X8454 11825 moveto(hom)s
X/Times-Roman 240 fnt
X9169 11829 moveto(hom)s
X/Helvetica 220 fnt
X2914 11537 moveto(inf)s
X/Times-Roman 240 fnt
X3433 11541 moveto(inf)s
X
X/Helvetica 220 fnt
X5708 11537 moveto(ker)s
X/Times-Roman 240 fnt
X6301 11541 moveto(ker)s
X/Helvetica 220 fnt
X8711 11537 moveto(lg)s
X/Times-Roman 240 fnt
X9169 11541 moveto(lg)s
X/Helvetica 220 fnt
X2866 11249 moveto(lim)s
X
X/Times-Roman 240 fnt
X3433 11253 moveto(lim)s
X/Helvetica 220 fnt
X5503 11249 moveto(liminf)s
X/Times-Roman 240 fnt
X6301 11253 moveto(lim)s 6662 x(inf)s
X/Helvetica 220 fnt
X8248 11249 moveto(limsup)s
X
X/Times-Roman 240 fnt
X9169 11253 moveto(lim)s 9530 x(sup)s
X/Helvetica 220 fnt
X2975 10961 moveto(ln)s
X/Times-Roman 240 fnt
X3433 10965 moveto(ln)s
X/Helvetica 220 fnt
X5721 10961 moveto(log)s
X
X/Times-Roman 240 fnt
X6301 10965 moveto(log)s
X/Helvetica 220 fnt
X8466 10961 moveto(max)s
X/Times-Roman 240 fnt
X9169 10965 moveto(max)s
X/Helvetica 220 fnt
X2792 10673 moveto(min)s
X/Times-Roman 240 fnt
X3433 10677 moveto(min)s
X
X/Helvetica 220 fnt
X5794 10673 moveto(Pr)s
X/Times-Roman 240 fnt
X6301 10677 moveto(Pr)s
X/Helvetica 220 fnt
X8539 10673 moveto(sec)s
X/Times-Roman 240 fnt
X9169 10677 moveto(sec)s
X/Helvetica 220 fnt
X2865 10385 moveto(sin)s
X
X/Times-Roman 240 fnt
X3433 10389 moveto(sin)s
X/Helvetica 220 fnt
X5611 10385 moveto(sinh)s
X/Times-Roman 240 fnt
X6301 10389 moveto(sinh)s
X/Helvetica 220 fnt
X8454 10385 moveto(supr)s
X/Times-Roman 240 fnt
X9169 10389 moveto(sup)s
X
X/Helvetica 220 fnt
X2840 10097 moveto(tan)s
X/Times-Roman 240 fnt
X3433 10101 moveto(tan)s
X/Helvetica 220 fnt
X5586 10097 moveto(tanh)s
X/Times-Roman 240 fnt
X6301 10101 moveto(tanh)s
X/Helvetica 220 fnt
X8454 10097 moveto(mod)s
X
X/Times-Roman 240 fnt
X9169 10101 moveto(mod)s 1417 9642 moveto(The)s 1849 x(following)s 2839 x(symbols)s 3697 x(are)s
X4048 x(also)s 4493 x(de\256ned)s 5258 x(to)s 5504 x(ensure)s 6188 x(that)s
X6606 x(they)s 7078 x(will)s 7509 x(appear)s 8206 x(in)s 8452 x(Roman:)s
X
X/Helvetica 220 fnt
X3023 9141 moveto(0)s
X/Symbol 240 fnt
X3433 9138 moveto(\060)s
X/Helvetica 220 fnt
X5891 9141 moveto(1)s
X/Symbol 240 fnt
X6301 9138 moveto(\061)s
X/Helvetica 220 fnt
X8759 9141 moveto(2)s
X
X/Symbol 240 fnt
X9169 9138 moveto(\062)s
X/Helvetica 220 fnt
X3023 8853 moveto(3)s
X/Symbol 240 fnt
X3433 8850 moveto(\063)s
X/Helvetica 220 fnt
X5891 8853 moveto(4)s
X/Symbol 240 fnt
X6301 8850 moveto(\064)s
X
X/Helvetica 220 fnt
X8759 8853 moveto(5)s
X/Symbol 240 fnt
X9169 8850 moveto(\065)s
X/Helvetica 220 fnt
X3023 8565 moveto(6)s
X/Symbol 240 fnt
X3433 8562 moveto(\066)s
X/Helvetica 220 fnt
X5891 8565 moveto(7)s
X
X/Symbol 240 fnt
X6301 8562 moveto(\067)s
X/Helvetica 220 fnt
X8759 8565 moveto(8)s
X/Symbol 240 fnt
X9169 8562 moveto(\070)s
X/Helvetica 220 fnt
X3023 8277 moveto(9)s
X/Symbol 240 fnt
X3433 8274 moveto(\071)s
X
X/Helvetica 220 fnt
X5952 8277 moveto(!)s
X/Symbol 240 fnt
X6301 8274 moveto(\041)s
X/Helvetica 220 fnt
X8759 8277 moveto(?)s
X/Symbol 240 fnt
X9169 8274 moveto(\077)s
X/Helvetica 220 fnt
X2950 7989 moveto(%)s
X
X/Symbol 240 fnt
X3433 7986 moveto(\045)s
X/Helvetica 220 fnt
X5940 7989 moveto(\()s
X/Symbol 240 fnt
X6301 7986 moveto(\050)s
X/Helvetica 220 fnt
X8808 7989 moveto(\))s
X/Symbol 240 fnt
X9169 7986 moveto(\051)s
X
X/Helvetica 220 fnt
X3084 7701 moveto([)s
X/Symbol 240 fnt
X3433 7698 moveto(\133)s
X/Helvetica 220 fnt
X5952 7701 moveto(])s
X/Symbol 240 fnt
X6301 7698 moveto(\135)s
X/Times-Roman 240 fnt
X1417 7204 moveto(The)s
X1849 x(following)s 2839 x(symbols)s 3697 x(make)s 4275 x(good)s
X/Helvetica 220 fnt
X4815 7200 moveto(atleft)s
X
X/Times-Roman 240 fnt
X5350 7204 moveto(and)s
X/Helvetica 220 fnt
X5756 7200 moveto(atright)s
X/Times-Roman 240 fnt
X6425 7204 moveto(parameters)s 7532 x(of)s 7791 x(the)s
X
X/Helvetica 220 fnt
X8143 7200 moveto(matrix)s
X/Times-Roman 240 fnt
X8800 7204 moveto(symbol:)s
X/Helvetica 220 fnt
X2780 6372 moveto(lpar)s
X/Symbol 240 fnt
X3433 6369 moveto(\050)s
X/Helvetica 220 fnt
X5526 6372 moveto(blpar)s
X
X/Symbol 240 fnt
X6301 6661 moveto(\346)s 6301 6369 moveto(\347)s 6301 6127 moveto(\350)s
X/Helvetica 220 fnt
X8491 6372 moveto(rpar)s
X/Symbol 240 fnt
X9169 6369 moveto(\051)s
X
X/Helvetica 220 fnt
X2633 5546 moveto(brpar)s
X/Symbol 240 fnt
X3433 5835 moveto(\366)s 3433 5543 moveto(\367)s 3433 5301 moveto(\370)s
X/Helvetica 220 fnt
X5428 5546 moveto(lbrack)s
X
X/Symbol 240 fnt
X6301 5543 moveto(\133)s
X/Helvetica 220 fnt
X8174 5546 moveto(blbrack)s
X/Symbol 240 fnt
X9169 5784 moveto(\351)s 9169 5543 moveto(\352)s 9169 5303 moveto(\353)s
X
X/Helvetica 220 fnt
X2535 4771 moveto(rbrack)s
X/Symbol 240 fnt
X3433 4768 moveto(\135)s
X/Helvetica 220 fnt
X5281 4771 moveto(brbrack)s
X/Symbol 240 fnt
X6301 5009 moveto(\371)s 6301 4768 moveto(\372)s
X6301 4528 moveto(\373)s
X/Helvetica 220 fnt
X8284 4771 moveto(lbrace)s
X/Symbol 240 fnt
X9169 4768 moveto(\173)s
X/Helvetica 220 fnt
X2426 4048 moveto(blbrace)s
X/Symbol 240 fnt
X3433 4287 moveto(\354)s
X3433 4045 moveto(\355)s 3433 3803 moveto(\356)s
X/Helvetica 220 fnt
X5391 4048 moveto(rbrace)s
X/Symbol 240 fnt
X6301 4045 moveto(\175)s
X/Helvetica 220 fnt
X8137 4048 moveto(brbrace)s
X
X/Symbol 240 fnt
X9169 4287 moveto(\374)s 9169 4045 moveto(\375)s 9169 3803 moveto(\376)s
X/Helvetica 220 fnt
X2670 3328 moveto(l\257oor)s
X/Symbol 240 fnt
X3433 3325 moveto(\353)s
X
X/Helvetica 220 fnt
X5416 3328 moveto(bl\257oor)s
X/Symbol 240 fnt
X6301 3565 moveto(\352)s 6301 3325 moveto(\352)s 6301 3085 moveto(\353)s
X/Helvetica 220 fnt
X8381 3328 moveto(r\257oor)s
X
X/Symbol 240 fnt
X9169 3325 moveto(\373)s
X/Helvetica 220 fnt
X2523 2606 moveto(br\257oor)s
X/Symbol 240 fnt
X3433 2843 moveto(\372)s 3433 2603 moveto(\372)s 3433 2363 moveto(\373)s
X
X/Helvetica 220 fnt
X5637 2606 moveto(lceil)s
X/Symbol 240 fnt
X6301 2603 moveto(\351)s
X/Helvetica 220 fnt
X8383 2606 moveto(blceil)s
X/Symbol 240 fnt
X9169 2844 moveto(\351)s 9169 2603 moveto(\352)s
X9169 2363 moveto(\352)s
X/Helvetica 220 fnt
X2744 1884 moveto(rceil)s
X/Symbol 240 fnt
X3433 1881 moveto(\371)s
X/Helvetica 220 fnt
X5490 1884 moveto(brceil)s
X/Symbol 240 fnt
X6301 2122 moveto(\371)s
X6301 1881 moveto(\372)s 6301 1641 moveto(\372)s
X/Helvetica 220 fnt
X8297 1884 moveto(langle)s
X/Symbol 240 fnt
X9169 1881 moveto(\341)s
Xpgsave restore
Xshowpage
X
X%%Page: ? 12


X%%BeginPageSetup
X0.0500 dup scale 10 setlinewidth
X/pgsave save def
X%%EndPageSetup
X
X/Times-Roman 240 fnt

X5694 15261 moveto(-)s 5833 x(11)s 6133 x(-)s
X/Helvetica 220 fnt
X2439 14299 moveto(blangle)s gsave
X3433 13876 translate
X120 960 0 480 240 288 0 loutgr
Xgsave
Xxsize 0 moveto
X0 ysize 2 div lineto
Xxsize ysize lineto
X0.04 ft setlinewidth stroke
Xgrestore
X
Xgrestore
X
X/Helvetica 220 fnt
X5404 14299 moveto(rangle)s
X
X/Symbol 240 fnt
X6301 14296 moveto(\361)s
X/Helvetica 220 fnt
X8150 14299 moveto(brangle)s gsave
X9169 13876 translate
X120 960 0 480 240 288 0 loutgr
Xgsave
X0 0 moveto
Xxsize ysize 2 div lineto
X0 ysize lineto
X0.04 ft setlinewidth stroke
Xgrestore
X
Xgrestore
X
X/Times-Roman 240 fnt
X1417 13449 moveto(Here)s 1941 x(are)s 2292 x(some)s
X2857 x(miscellaneous)s 4271 x(symbols:)s
X/Helvetica 220 fnt
X2706 12890 moveto(hbar)s
X/Times-Roman 240 fnt
X3457 12954 moveto(-)s
X/Times-Italic 240 fnt
X3433 12894 moveto(h)s
X
X/Helvetica 220 fnt
X5733 12890 moveto(Re)s
X/Symbol 240 fnt
X6301 12887 moveto(\302)s
X/Helvetica 220 fnt
X8637 12890 moveto(Im)s
X/Symbol 240 fnt
X9169 12887 moveto(\301)s
X/Helvetica 220 fnt
X2549 12602 moveto(partial)s
X
X/Symbol 240 fnt
X3433 12599 moveto(\266)s
X/Helvetica 220 fnt
X5611 12602 moveto(infty)s
X/Symbol 240 fnt
X6301 12599 moveto(\245)s
X/Helvetica 220 fnt
X8333 12602 moveto(prime)s
X/Symbol 240 fnt
X9169 12599 moveto(\242)s
X
X/Helvetica 220 fnt
X2609 12314 moveto(nabla)s
X/Symbol 240 fnt
X3433 12311 moveto(\321)s
X/Helvetica 220 fnt
X5586 12314 moveto(surd)s
X/Symbol 240 fnt
X6301 12311 moveto(\326)s
X/Helvetica 220 fnt
X8576 12314 moveto(top)s
Xgsave
X9326 12371 translate
X180.0000 rotate
X
X/Symbol 240 fnt
X0 -60 moveto(\136)s
Xgrestore
X
X/Helvetica 220 fnt
X2840 12026 moveto(bot)s
X/Symbol 240 fnt
X3433 12023 moveto(\136)s
X/Helvetica 220 fnt
X5574 12026 moveto(dbar)s
X/Times-Roman 240 fnt
X6301 12030 moveto(||)s
X
X/Helvetica 220 fnt
X8163 12026 moveto(triangle)s gsave
X9169 12011 translate
X144 144 72 72 240 288 0 loutgr
Xgsave
X0 0 moveto xsize 0 lineto
Xxsize 2 div ysize lineto closepath
X0.04 ft setlinewidth stroke
Xgrestore
X
Xgrestore
X
X/Helvetica 220 fnt
X2169 11738 moveto(backslash)s
X/Times-Italic 240 fnt
X3433 11742 moveto(\\)s
X/Helvetica 220 fnt
X5539 11738 moveto(forall)s
X/Symbol 240 fnt
X6301 11735 moveto(\042)s
X
X/Helvetica 220 fnt
X8320 11738 moveto(exists)s
X/Symbol 240 fnt
X9169 11735 moveto(\044)s
X/Helvetica 220 fnt
X2779 11450 moveto(neg)s
X/Symbol 240 fnt
X3433 11447 moveto(\330)s
X/Helvetica 220 fnt
X5502 11450 moveto(circle)s
Xgsave
X6301 11435 translate
X168 144 0 72 240 288 0 loutgr
Xgsave
Xxsize ysize 2 div moveto
Xxsize 2 div ysize 2 div xsize 2 div 0 360 arc
X0.04 ft setlinewidth stroke
Xgrestore
X
Xgrestore
X
X/Helvetica 220 fnt
X8210 11450 moveto(square)s gsave
X9169 11435 translate
X144 144 0 72 240 288 0 loutgr
Xgsave
X0 0 moveto xsize 0 lineto xsize ysize lineto
X0 ysize lineto closepath
X0.04 ft setlinewidth stroke
Xgrestore
X
Xgrestore
X
X/Helvetica 220 fnt
X2682 11162 moveto(ldots)s
X/Times-Italic 240 fnt
X3433 11166 moveto(.)s 3565 x(.)s 3697 x(.)s
X
X/Helvetica 220 fnt
X5488 11162 moveto(cdots)s
X/Symbol 240 fnt
X6301 11159 moveto(\327)s 6433 x(\327)s 6565 x(\327)s
X/Helvetica 220 fnt
X8356 11162 moveto(vdots)s
X
X/Symbol 240 fnt
X9169 11254 moveto(\327)s 9169 11159 moveto(\327)s 9169 11064 moveto(\327)s
X/Helvetica 220 fnt
X2608 10874 moveto(ddots)s
X/Symbol 240 fnt
X3433 10966 moveto(\327)s
X3565 10871 moveto(\327)s 3697 10776 moveto(\327)s
X/Helvetica 220 fnt
X5721 10874 moveto(del)s
X/Symbol 240 fnt
X6301 10871 moveto(\321)s
X/Helvetica 220 fnt
X8442 10874 moveto(grad)s
X
X/Symbol 240 fnt
X9169 10871 moveto(\321)s
X/Helvetica 220 fnt
X2962 10586 moveto(...)s
X/Symbol 240 fnt
X3433 10583 moveto(\274)s
X/Helvetica 220 fnt
X5708 10586 moveto(,...,)s
X/Symbol 240 fnt
X6301 10583 moveto(\054)s
X6404 x(\274)s 6644 x(\054)s
X/Helvetica 220 fnt
X8528 10586 moveto(half)s
X/Symbol 168 fnt
X9169 10672 moveto(\061)s 9253 10601 moveto(\244)s
X9281 10528 moveto(\062)s
X/Helvetica 220 fnt
X2719 10298 moveto(third)s
X/Symbol 168 fnt
X3433 10384 moveto(\061)s 3517 10313 moveto(\244)s 3545 10240 moveto(\063)s
X
X/Helvetica 220 fnt
X5965 10298 moveto(')s
X/Symbol 240 fnt
X6301 10295 moveto(\242)s
X/Helvetica 220 fnt
X8283 10298 moveto(empty)s
X/Symbol 240 fnt
X9169 10295 moveto(\306)s
X/Times-Roman 240 fnt
X1417 9788 moveto(Finally,)s
X2214 x(here)s 2685 x(is)s 2904 x(the)s 3256 x(long)s 3742 x(list)s
X4093 x(of)s 4352 x(full)s 4743 x(names)s 5414 x(from)s 5938 x(the)s
X6290 x(Adobe)s 6989 x(Symbol)s 7794 x(font:)s
X/Helvetica 220 fnt
X2559 9282 moveto(space)s
X/Symbol 240 fnt
X3433 9279 moveto(\040)s
X
X/Helvetica 220 fnt
X5318 9282 moveto(exclam)s
X/Symbol 240 fnt
X6301 9279 moveto(\041)s
X/Helvetica 220 fnt
X8004 9282 moveto(universal)s
X/Symbol 240 fnt
X9169 9279 moveto(\042)s
X/Helvetica 220 fnt
X1999 8994 moveto(numbersign)s
X
X/Symbol 240 fnt
X3433 8991 moveto(\043)s
X/Helvetica 220 fnt
X5039 8994 moveto(existential)s
X/Symbol 240 fnt
X6301 8991 moveto(\044)s
X/Helvetica 220 fnt
X8149 8994 moveto(percent)s
X/Symbol 240 fnt
X9169 8991 moveto(\045)s
X
X/Helvetica 220 fnt
X2047 8706 moveto(ampersand)s
X/Symbol 240 fnt
X3433 8703 moveto(\046)s
X/Helvetica 220 fnt
X5183 8706 moveto(suchthat)s
X/Symbol 240 fnt
X6301 8703 moveto(\047)s
X/Helvetica 220 fnt
X8028 8706 moveto(parenleft)s
X
X/Symbol 240 fnt
X9169 8703 moveto(\050)s
X/Helvetica 220 fnt
X2158 8418 moveto(parenright)s
X/Symbol 240 fnt
X3433 8415 moveto(\051)s
X/Helvetica 220 fnt
X4769 8418 moveto(asteriskmath)s
X/Symbol 240 fnt
X6301 8415 moveto(\052)s
X
X/Helvetica 220 fnt
X8479 8418 moveto(plus)s
X/Symbol 240 fnt
X9169 8415 moveto(+)s
X/Helvetica 220 fnt
X2425 8130 moveto(comma)s
X/Symbol 240 fnt
X3433 8127 moveto(\054)s
X/Helvetica 220 fnt
X5428 8130 moveto(minus)s
X
X/Symbol 240 fnt
X6301 8127 moveto(-)s
X/Helvetica 220 fnt
X8272 8130 moveto(period)s
X/Symbol 240 fnt
X9169 8127 moveto(\056)s
X/Helvetica 220 fnt
X2633 7842 moveto(slash)s
X/Symbol 240 fnt
X3433 7839 moveto(\057)s
X
X/Helvetica 220 fnt
X5586 7842 moveto(zero)s
X/Symbol 240 fnt
X6301 7839 moveto(\060)s
X/Helvetica 220 fnt
X8515 7842 moveto(one)s
X/Symbol 240 fnt
X9169 7839 moveto(\061)s
X/Helvetica 220 fnt
X2804 7554 moveto(two)s
X
X/Symbol 240 fnt
X3433 7551 moveto(\062)s
X/Helvetica 220 fnt
X5513 7554 moveto(three)s
X/Symbol 240 fnt
X6301 7551 moveto(\063)s
X/Helvetica 220 fnt
X8503 7554 moveto(four)s
X/Symbol 240 fnt
X9169 7551 moveto(\064)s
X
X/Helvetica 220 fnt
X2803 7266 moveto(\256ve)s
X/Symbol 240 fnt
X3433 7263 moveto(\065)s
X/Helvetica 220 fnt
X5745 7266 moveto(six)s
X/Symbol 240 fnt
X6301 7263 moveto(\066)s
X/Helvetica 220 fnt
X8295 7266 moveto(seven)s
X
X/Symbol 240 fnt
X9169 7263 moveto(\067)s
X/Helvetica 220 fnt
X2670 6978 moveto(eight)s
X/Symbol 240 fnt
X3433 6975 moveto(\070)s
X/Helvetica 220 fnt
X5599 6978 moveto(nine)s
X/Symbol 240 fnt
X6301 6975 moveto(\071)s
X
X/Helvetica 220 fnt
X8357 6978 moveto(colon)s
X/Symbol 240 fnt
X9169 6975 moveto(\072)s
X/Helvetica 220 fnt
X2158 6690 moveto(semicolon)s
X/Symbol 240 fnt
X3433 6687 moveto(\073)s
X/Helvetica 220 fnt
X5623 6690 moveto(less)s
X
X/Symbol 240 fnt
X6301 6687 moveto(\074)s
X/Helvetica 220 fnt
X8345 6690 moveto(equal)s
X/Symbol 240 fnt
X9169 6687 moveto(\075)s
X/Helvetica 220 fnt
X2450 6402 moveto(greater)s
X/Symbol 240 fnt
X3433 6399 moveto(\076)s
X
X/Helvetica 220 fnt
X5184 6402 moveto(question)s
X/Symbol 240 fnt
X6301 6399 moveto(\077)s
X/Helvetica 220 fnt
X7905 6402 moveto(congruent)s
X/Symbol 240 fnt
X9169 6399 moveto(\100)s
X/Helvetica 220 fnt
X2585 6114 moveto(Alpha)s
X
X/Symbol 240 fnt
X3433 6111 moveto(\101)s
X/Helvetica 220 fnt
X5562 6114 moveto(Beta)s
X/Symbol 240 fnt
X6301 6111 moveto(\102)s
X/Helvetica 220 fnt
X8553 6114 moveto(Chi)s
X/Symbol 240 fnt
X9169 6111 moveto(\103)s
X
X/Helvetica 220 fnt
X2634 5826 moveto(Delta)s
X/Symbol 240 fnt
X3433 5823 moveto(\104)s
X/Helvetica 220 fnt
X5295 5826 moveto(Epsilon)s
X/Symbol 240 fnt
X6301 5823 moveto(\105)s
X/Helvetica 220 fnt
X8565 5826 moveto(Phi)s
X
X/Symbol 240 fnt
X9169 5823 moveto(\106)s
X/Helvetica 220 fnt
X2364 5538 moveto(Gamma)s
X/Symbol 240 fnt
X3433 5535 moveto(\107)s
X/Helvetica 220 fnt
X5684 5538 moveto(Eta)s
X/Symbol 240 fnt
X6301 5535 moveto(\110)s
X
X/Helvetica 220 fnt
X8515 5538 moveto(Iota)s
X/Symbol 240 fnt
X9169 5535 moveto(\111)s
X/Helvetica 220 fnt
X2291 5250 moveto(thetaone)s
X/Symbol 240 fnt
X3433 5247 moveto(\112)s
X/Helvetica 220 fnt
X5379 5250 moveto(Kappa)s
X
X/Symbol 240 fnt
X6301 5247 moveto(\113)s
X/Helvetica 220 fnt
X8088 5250 moveto(Lambda)s
X/Symbol 240 fnt
X9169 5247 moveto(\114)s
X/Helvetica 220 fnt
X2840 4962 moveto(Mu)s
X/Symbol 240 fnt
X3433 4959 moveto(\115)s
X
X/Helvetica 220 fnt
X5733 4962 moveto(Nu)s
X/Symbol 240 fnt
X6301 4959 moveto(\116)s
X/Helvetica 220 fnt
X8052 4962 moveto(Omicron)s
X/Symbol 240 fnt
X9169 4959 moveto(\117)s
X/Helvetica 220 fnt
X2951 4674 moveto(Pi)s
X
X/Symbol 240 fnt
X3433 4671 moveto(\120)s
X/Helvetica 220 fnt
X5452 4674 moveto(Theta)s
X/Symbol 240 fnt
X6301 4671 moveto(\121)s
X/Helvetica 220 fnt
X8479 4674 moveto(Rho)s
X/Symbol 240 fnt
X9169 4671 moveto(\122)s
X
X/Helvetica 220 fnt
X2524 4386 moveto(Sigma)s
X/Symbol 240 fnt
X3433 4383 moveto(\123)s
X/Helvetica 220 fnt
X5635 4386 moveto(Tau)s
X/Symbol 240 fnt
X6301 4383 moveto(\124)s
X/Helvetica 220 fnt
X8151 4386 moveto(Upsilon)s
X
X/Symbol 240 fnt
X9169 4383 moveto(\125)s
X/Helvetica 220 fnt
X2194 4098 moveto(sigmaone)s
X/Symbol 240 fnt
X3433 4095 moveto(\126)s
X/Helvetica 220 fnt
X5293 4098 moveto(Omega)s
X/Symbol 240 fnt
X6301 4095 moveto(\127)s
X
X/Helvetica 220 fnt
X8687 4098 moveto(Xi)s
X/Symbol 240 fnt
X9169 4095 moveto(\130)s
X/Helvetica 220 fnt
X2841 3810 moveto(Psi)s
X/Symbol 240 fnt
X3433 3807 moveto(\131)s
X/Helvetica 220 fnt
X5574 3810 moveto(Zeta)s
X
X/Symbol 240 fnt
X6301 3807 moveto(\132)s
X/Helvetica 220 fnt
X7869 3810 moveto(bracketleft)s
X/Symbol 240 fnt
X9169 3807 moveto(\133)s
X/Helvetica 220 fnt
X2267 3522 moveto(therefore)s
X/Symbol 240 fnt
X3433 3519 moveto(\134)s
X
X/Helvetica 220 fnt
X4867 3522 moveto(bracketright)s
X/Symbol 240 fnt
X6301 3519 moveto(\135)s
X/Helvetica 220 fnt
X7553 3522 moveto(perpendicular)s
X/Symbol 240 fnt
X9169 3519 moveto(\136)s
X/Helvetica 220 fnt
X2047 3234 moveto(underscore)s
X
X/Symbol 240 fnt
X3433 3231 moveto(\137)s
X/Helvetica 220 fnt
X5136 3234 moveto(radicalex)s
X/Symbol 240 fnt
X6301 3231 moveto(\140)s
X/Helvetica 220 fnt
X8345 3234 moveto(alpha)s
X/Symbol 240 fnt
X9169 3231 moveto(\141)s
X
X/Helvetica 220 fnt
X2718 2946 moveto(beta)s
X/Symbol 240 fnt
X3433 2943 moveto(\142)s
X/Helvetica 220 fnt
X5733 2946 moveto(chi)s
X/Symbol 240 fnt
X6301 2943 moveto(\143)s
X/Helvetica 220 fnt
X8406 2946 moveto(delta)s
X
X/Symbol 240 fnt
X9169 2943 moveto(\144)s
X/Helvetica 220 fnt
X2451 2658 moveto(epsilon)s
X/Symbol 240 fnt
X3433 2655 moveto(\145)s
X/Helvetica 220 fnt
X5721 2658 moveto(phi)s
X/Symbol 240 fnt
X6301 2655 moveto(\146)s
X
X/Helvetica 220 fnt
X8149 2658 moveto(gamma)s
X/Symbol 240 fnt
X9169 2655 moveto(\147)s
X/Helvetica 220 fnt
X2840 2370 moveto(eta)s
X/Symbol 240 fnt
X3433 2367 moveto(\150)s
X/Helvetica 220 fnt
X5660 2370 moveto(iota)s
X
X/Symbol 240 fnt
X6301 2367 moveto(\151)s
X/Helvetica 220 fnt
X8223 2370 moveto(phione)s
X/Symbol 240 fnt
X9169 2367 moveto(\152)s
X/Helvetica 220 fnt
X2547 2082 moveto(kappa)s
X/Symbol 240 fnt
X3433 2079 moveto(\153)s
X
X/Helvetica 220 fnt
X5294 2082 moveto(lambda)s
X/Symbol 240 fnt
X6301 2079 moveto(\154)s
X/Helvetica 220 fnt
X8576 2082 moveto(mu)s
X/Symbol 240 fnt
X9169 2079 moveto(\155)s
X/Helvetica 220 fnt
X2901 1794 moveto(nu)s
X
X/Symbol 240 fnt
X3433 1791 moveto(\156)s
X/Helvetica 220 fnt
X5233 1794 moveto(omicron)s
X/Symbol 240 fnt
X6301 1791 moveto(\157)s
X/Helvetica 220 fnt
X8711 1794 moveto(pi)s
X/Symbol 240 fnt
X9169 1791 moveto(\160)s
X
X/Helvetica 220 fnt
X2657 1506 moveto(theta)s
X/Symbol 240 fnt
X3433 1503 moveto(\161)s
X/Helvetica 220 fnt
X5696 1506 moveto(rho)s
X/Symbol 240 fnt
X6301 1503 moveto(\162)s
X/Helvetica 220 fnt
X8296 1506 moveto(sigma)s
X
X/Symbol 240 fnt
X9169 1503 moveto(\163)s
Xpgsave restore
Xshowpage
X
X%%Page: ? 13


X%%BeginPageSetup
X0.0500 dup scale 10 setlinewidth
X/pgsave save def
X%%EndPageSetup
X
X/Times-Roman 240 fnt

X5694 15261 moveto(-)s 5833 x(12)s 6133 x(-)s
X/Helvetica 220 fnt
X2840 14677 moveto(tau)s
X/Symbol 240 fnt
X3433 14674 moveto(\164)s
X
X/Helvetica 220 fnt
X5319 14677 moveto(upsilon)s
X/Symbol 240 fnt
X6301 14674 moveto(\165)s
X/Helvetica 220 fnt
X7844 14677 moveto(omegaone)s
X/Symbol 240 fnt
X9169 14674 moveto(\166)s
X/Helvetica 220 fnt
X2474 14389 moveto(omega)s
X
X/Symbol 240 fnt
X3433 14386 moveto(\167)s
X/Helvetica 220 fnt
X5855 14389 moveto(xi)s
X/Symbol 240 fnt
X6301 14386 moveto(\170)s
X/Helvetica 220 fnt
X8601 14389 moveto(psi)s
X/Symbol 240 fnt
X9169 14386 moveto(\171)s
X
X/Helvetica 220 fnt
X2730 14101 moveto(zeta)s
X/Symbol 240 fnt
X3433 14098 moveto(\172)s
X/Helvetica 220 fnt
X5172 14101 moveto(braceleft)s
X/Symbol 240 fnt
X6301 14098 moveto(\173)s
X/Helvetica 220 fnt
X8564 14101 moveto(bar)s
X
X/Symbol 240 fnt
X9169 14098 moveto(\174)s
X/Helvetica 220 fnt
X2170 13813 moveto(braceright)s
X/Symbol 240 fnt
X3433 13810 moveto(\175)s
X/Helvetica 220 fnt
X5381 13813 moveto(similar)s
X/Symbol 240 fnt
X6301 13810 moveto(\176)s
X
X/Helvetica 220 fnt
X7785 13813 moveto(Upsilonone)s
X/Symbol 240 fnt
X9169 13810 moveto(\241)s
X/Helvetica 220 fnt
X2487 13525 moveto(minute)s
X/Symbol 240 fnt
X3433 13522 moveto(\242)s
X/Helvetica 220 fnt
X5087 13525 moveto(lessequal)s
X
X/Symbol 240 fnt
X6301 13522 moveto(\243)s
X/Helvetica 220 fnt
X8162 13525 moveto(fraction)s
X/Symbol 240 fnt
X9169 13522 moveto(\244)s
X/Helvetica 220 fnt
X2524 13237 moveto(in\256nity)s
X/Symbol 240 fnt
X3433 13234 moveto(\245)s
X
X/Helvetica 220 fnt
X5538 13237 moveto(\257orin)s
X/Symbol 240 fnt
X6301 13234 moveto(\246)s
X/Helvetica 220 fnt
X8479 13237 moveto(club)s
X/Symbol 240 fnt
X9169 13234 moveto(\247)s
X/Helvetica 220 fnt
X2304 12949 moveto(diamond)s
X
X/Symbol 240 fnt
X3433 12946 moveto(\250)s
X/Helvetica 220 fnt
X5513 12949 moveto(heart)s
X/Symbol 240 fnt
X6301 12946 moveto(\251)s
X/Helvetica 220 fnt
X8283 12949 moveto(spade)s
X/Symbol 240 fnt
X9169 12946 moveto(\252)s
X
X/Helvetica 220 fnt
X2170 12661 moveto(arrowboth)s
X/Symbol 240 fnt
X3433 12658 moveto(\253)s
X/Helvetica 220 fnt
X5173 12661 moveto(arrowleft)s
X/Symbol 240 fnt
X6301 12658 moveto(\254)s
X/Helvetica 220 fnt
X8089 12661 moveto(arrowup)s
X
X/Symbol 240 fnt
X9169 12658 moveto(\255)s
X/Helvetica 220 fnt
X2171 12373 moveto(arrowright)s
X/Symbol 240 fnt
X3433 12370 moveto(\256)s
X/Helvetica 220 fnt
X4941 12373 moveto(arrowdown)s
X/Symbol 240 fnt
X6301 12370 moveto(\257)s
X
X/Helvetica 220 fnt
X8198 12373 moveto(degree)s
X/Symbol 240 fnt
X9169 12370 moveto(\260)s
X/Helvetica 220 fnt
X2158 12085 moveto(plusminus)s
X/Symbol 240 fnt
X3433 12082 moveto(\261)s
X/Helvetica 220 fnt
X5305 12085 moveto(second)s
X
X/Symbol 240 fnt
X6301 12082 moveto(\262)s
X/Helvetica 220 fnt
X7650 12085 moveto(greaterequal)s
X/Symbol 240 fnt
X9169 12082 moveto(\263)s
X/Helvetica 220 fnt
X2403 11797 moveto(multiply)s
X/Symbol 240 fnt
X3433 11794 moveto(\264)s
X
X/Helvetica 220 fnt
X4856 11797 moveto(proportional)s
X/Symbol 240 fnt
X6301 11794 moveto(\265)s
X/Helvetica 220 fnt
X7993 11797 moveto(partialdiff)s
X/Symbol 240 fnt
X9169 11794 moveto(\266)s
X/Helvetica 220 fnt
X2622 11509 moveto(bullet)s
X
X/Symbol 240 fnt
X3433 11506 moveto(\267)s
X/Helvetica 220 fnt
X5441 11509 moveto(divide)s
X/Symbol 240 fnt
X6301 11506 moveto(\270)s
X/Helvetica 220 fnt
X8040 11509 moveto(notequal)s
X/Symbol 240 fnt
X9169 11506 moveto(\271)s
X
X/Helvetica 220 fnt
X1975 11221 moveto(equivalence)s
X/Symbol 240 fnt
X3433 11218 moveto(\272)s
X/Helvetica 220 fnt
X4806 11221 moveto(approxequal)s
X/Symbol 240 fnt
X6301 11218 moveto(\273)s
X/Helvetica 220 fnt
X8225 11221 moveto(ellipsis)s
X
X/Symbol 240 fnt
X9169 11218 moveto(\274)s
X/Helvetica 220 fnt
X1999 10933 moveto(arrowvertex)s
X/Symbol 240 fnt
X3433 10930 moveto(\275)s
X/Helvetica 220 fnt
X4758 10933 moveto(arrowhorizex)s
X/Symbol 240 fnt
X6301 10930 moveto(\276)s
X
X/Helvetica 220 fnt
X7516 10933 moveto(carriagereturn)s
X/Symbol 240 fnt
X9169 10930 moveto(\277)s
X/Helvetica 220 fnt
X2609 10645 moveto(aleph)s
X/Symbol 240 fnt
X3433 10642 moveto(\300)s
X/Helvetica 220 fnt
X5330 10645 moveto(Ifraktur)s
X
X/Symbol 240 fnt
X6301 10642 moveto(\301)s
X/Helvetica 220 fnt
X8101 10645 moveto(Rfraktur)s
X/Symbol 240 fnt
X9169 10642 moveto(\302)s
X/Helvetica 220 fnt
X2036 10357 moveto(weierstrass)s
X/Symbol 240 fnt
X3433 10354 moveto(\303)s
X
X/Helvetica 220 fnt
X4760 10357 moveto(circlemultiply)s
X/Symbol 240 fnt
X6301 10354 moveto(\304)s
X/Helvetica 220 fnt
X7968 10357 moveto(circleplus)s
X/Symbol 240 fnt
X9169 10354 moveto(\305)s
X/Helvetica 220 fnt
X2254 10069 moveto(emptyset)s
X
X/Symbol 240 fnt
X3433 10066 moveto(\306)s
X/Helvetica 220 fnt
X4892 10069 moveto(intersection)s
X/Symbol 240 fnt
X6301 10066 moveto(\307)s
X/Helvetica 220 fnt
X8345 10069 moveto(union)s
X/Symbol 240 fnt
X9169 10066 moveto(\310)s
X
X/Helvetica 220 fnt
X1669 9781 moveto(propersuperset)s
X/Symbol 240 fnt
X3433 9778 moveto(\311)s
X/Helvetica 220 fnt
X4634 9781 moveto(re\257exsuperset)s
X/Symbol 240 fnt
X6301 9778 moveto(\312)s
X/Helvetica 220 fnt
X7929 9781 moveto(notsubset)s
X
X/Symbol 240 fnt
X9169 9778 moveto(\313)s
X/Helvetica 220 fnt
X1864 9493 moveto(propersubset)s
X/Symbol 240 fnt
X3433 9490 moveto(\314)s
X/Helvetica 220 fnt
X4829 9493 moveto(re\257exsubset)s
X/Symbol 240 fnt
X6301 9490 moveto(\315)s
X
X/Helvetica 220 fnt
X8101 9493 moveto(element)s
X/Symbol 240 fnt
X9169 9490 moveto(\316)s
X/Helvetica 220 fnt
X2060 9205 moveto(notelement)s
X/Symbol 240 fnt
X3433 9202 moveto(\317)s
X/Helvetica 220 fnt
X5477 9205 moveto(angle)s
X
X/Symbol 240 fnt
X6301 9202 moveto(\320)s
X/Helvetica 220 fnt
X8089 9205 moveto(gradient)s
X/Symbol 240 fnt
X9169 9202 moveto(\321)s
X/Helvetica 220 fnt
X2000 8917 moveto(registerserif)s
X/Symbol 240 fnt
X3433 8914 moveto(\322)s
X
X/Helvetica 220 fnt
X4709 8917 moveto(copyrightserif)s
X/Symbol 240 fnt
X6301 8914 moveto(\323)s
X/Helvetica 220 fnt
X7479 8917 moveto(trademarkserif)s
X/Symbol 240 fnt
X9169 8914 moveto(\324)s
X/Helvetica 220 fnt
X2413 8629 moveto(product)s
X
X/Symbol 240 fnt
X3433 8626 moveto(\325)s
X/Helvetica 220 fnt
X5368 8629 moveto(radical)s
X/Symbol 240 fnt
X6301 8626 moveto(\326)s
X/Helvetica 220 fnt
X8088 8629 moveto(dotmath)s
X/Symbol 240 fnt
X9169 8626 moveto(\327)s
X
X/Helvetica 220 fnt
X2220 8341 moveto(logicalnot)s
X/Symbol 240 fnt
X3433 8338 moveto(\330)s
X/Helvetica 220 fnt
X5027 8341 moveto(logicaland)s
X/Symbol 240 fnt
X6301 8338 moveto(\331)s
X/Helvetica 220 fnt
X8066 8341 moveto(logicalor)s
X
X/Symbol 240 fnt
X9169 8338 moveto(\332)s
X/Helvetica 220 fnt
X1878 8053 moveto(arrowdblboth)s
X/Symbol 240 fnt
X3433 8050 moveto(\333)s
X/Helvetica 220 fnt
X4881 8053 moveto(arrowdblleft)s
X/Symbol 240 fnt
X6301 8050 moveto(\334)s
X
X/Helvetica 220 fnt
X7797 8053 moveto(arrowdblup)s
X/Symbol 240 fnt
X9169 8050 moveto(\335)s
X/Helvetica 220 fnt
X1879 7765 moveto(arrowdblright)s
X/Symbol 240 fnt
X3433 7762 moveto(\336)s
X/Helvetica 220 fnt
X4649 7765 moveto(arrowdbldown)s
X
X/Symbol 240 fnt
X6301 7762 moveto(\337)s
X/Helvetica 220 fnt
X8113 7765 moveto(lozenge)s
X/Symbol 240 fnt
X9169 7762 moveto(\340)s
X/Helvetica 220 fnt
X2317 7477 moveto(angleleft)s
X/Symbol 240 fnt
X3433 7474 moveto(\341)s
X
X/Helvetica 220 fnt
X4818 7477 moveto(registersans)s
X/Symbol 240 fnt
X6301 7474 moveto(\342)s
X/Helvetica 220 fnt
X7527 7477 moveto(copyrightsans)s
X/Symbol 240 fnt
X9169 7474 moveto(\343)s
X/Helvetica 220 fnt
X1693 7189 moveto(trademarksans)s
X
X/Symbol 240 fnt
X3433 7186 moveto(\344)s
X/Helvetica 220 fnt
X4940 7189 moveto(summation)s
X/Symbol 240 fnt
X6301 7186 moveto(\345)s
X/Helvetica 220 fnt
X7845 7189 moveto(parenlefttp)s
X/Symbol 240 fnt
X9169 7186 moveto(\346)s
X
X/Helvetica 220 fnt
X2060 6897 moveto(parenleftex)s
X/Symbol 240 fnt
X3433 6894 moveto(\347)s
X/Helvetica 220 fnt
X4977 6897 moveto(parenleftbt)s
X/Symbol 240 fnt
X6301 6894 moveto(\350)s
X/Helvetica 220 fnt
X7686 6897 moveto(bracketlefttp)s
X
X/Symbol 240 fnt
X9169 6894 moveto(\351)s
X/Helvetica 220 fnt
X1901 6605 moveto(bracketleftex)s
X/Symbol 240 fnt
X3433 6602 moveto(\352)s
X/Helvetica 220 fnt
X4818 6605 moveto(bracketleftbt)s
X/Symbol 240 fnt
X6301 6602 moveto(\353)s
X
X/Helvetica 220 fnt
X7857 6605 moveto(bracelefttp)s
X/Symbol 240 fnt
X9169 6602 moveto(\354)s
X/Helvetica 220 fnt
X1951 6317 moveto(braceleftmid)s
X/Symbol 240 fnt
X3433 6314 moveto(\355)s
X/Helvetica 220 fnt
X4989 6317 moveto(braceleftbt)s
X
X/Symbol 240 fnt
X6301 6314 moveto(\356)s
X/Helvetica 220 fnt
X8100 6317 moveto(braceex)s
X/Symbol 240 fnt
X9169 6314 moveto(\357)s
X/Helvetica 220 fnt
X2183 6029 moveto(angleright)s
X/Symbol 240 fnt
X3433 6026 moveto(\361)s
X
X/Helvetica 220 fnt
X5295 6029 moveto(integral)s
X/Symbol 240 fnt
X6301 6026 moveto(\362)s
X/Helvetica 220 fnt
X7980 6029 moveto(integraltp)s
X/Symbol 240 fnt
X9169 6026 moveto(\363)s
X/Helvetica 220 fnt
X2195 5741 moveto(integralex)s
X
X/Symbol 240 fnt
X3433 5738 moveto(\364)s
X/Helvetica 220 fnt
X5112 5741 moveto(integralbt)s
X/Symbol 240 fnt
X6301 5738 moveto(\365)s
X/Helvetica 220 fnt
X7711 5741 moveto(parenrighttp)s
X/Symbol 240 fnt
X9169 5738 moveto(\366)s
X
X/Helvetica 220 fnt
X1926 5449 moveto(parenrightex)s
X/Symbol 240 fnt
X3433 5446 moveto(\367)s
X/Helvetica 220 fnt
X4843 5449 moveto(parenrightbt)s
X/Symbol 240 fnt
X6301 5446 moveto(\370)s
X/Helvetica 220 fnt
X7552 5449 moveto(bracketrighttp)s
X
X/Symbol 240 fnt
X9169 5446 moveto(\371)s
X/Helvetica 220 fnt
X1767 5157 moveto(bracketrightex)s
X/Symbol 240 fnt
X3433 5154 moveto(\372)s
X/Helvetica 220 fnt
X4684 5157 moveto(bracketrightbt)s
X/Symbol 240 fnt
X6301 5154 moveto(\373)s
X
X/Helvetica 220 fnt
X7723 5157 moveto(bracerighttp)s
X/Symbol 240 fnt
X9169 5154 moveto(\374)s
X/Helvetica 220 fnt
X1817 4869 moveto(bracerightmid)s
X/Symbol 240 fnt
X3433 4866 moveto(\375)s
X/Helvetica 220 fnt
X4855 4869 moveto(bracerightbt)s
X
X/Symbol 240 fnt
X6301 4866 moveto(\376)s
X/Times-Roman 240 fnt
X1417 4370 moveto(The)s 1835 x(names)s 2492 x(given)s 3070 x(are)s
X3407 x(the)s 3745 x(same)s 4282 x(as)s 4527 x(Adobe's)s 5384 x(except)s
X6054 x(in)s 6286 x(a)s 6438 x(few)s 6842 x(places)s 7485 x(where)s
X8115 x(the)s 8453 x(Adobe)s 9138 x(name)s 9702 x(contains)s 1417 4082 moveto(a)s
X1583 x(digit,)s 2141 x(which)s 2786 x(is)s 3005 x(not)s 3371 x(possible)s
X4215 x(in)s 4461 x(Lout.)s
Xpgsave restore
Xshowpage
X
X%%Page: ? 14


X%%BeginPageSetup
X0.0500 dup scale 10 setlinewidth
X/pgsave save def
X%%EndPageSetup
X
X/Times-Roman 240 fnt

X5694 15261 moveto(-)s 5833 x(13)s 6133 x(-)s
X/Times-Bold 240 fnt
X1417 14667 moveto(Appendix)s 2474 x(A.)s
X2827 x(Pas)s 3246 x(\261)s 3426 x(a)s 3606 x(Lout)s 4158 x(Package)s
X5069 x(for)s 5434 x(Printing)s 6343 x(Pascal)s 7054 x(Programs)s
X/Times-Roman 240 fnt
X1897 14190 moveto(Pas)s
X2330 x(is)s 2590 x(a)s 2797 x(package)s 3682 x(of)s 3982 x(de\256nitions)s
X5093 x(for)s 5472 x(printing)s 6330 x(Pascal)s 7041 x(programs)s 8045 x([)s
X8124 x(2)s 8244 x(])s 8424 x(neatly)s 9109 x(with)s 9635 x(the)s
X10028 x(Lout)s 1417 13902 moveto(document)s 2450 x(formatter)s 3426 x([)s 3505 x(4)s
X3625 x(].)s 3913 x(No)s 4295 x(attempt)s 5100 x(is)s 5348 x(made)s
X5955 x(to)s 6230 x(follow)s 6943 x(any)s 7378 x(particular)s 8381 x(printing)s
X9227 x(standard;)s 10192 x(the)s 1417 13614 moveto(design)s 2102 x(simply)s 2813 x(re\257ects)s
X3562 x(the)s 3914 x(author's)s 4757 x(taste.)s 1897 13240 moveto(The)s 2375 x(package)s
X3265 x(is)s 3530 x(so)s 3849 x(simple)s 4592 x(that)s 5056 x(there)s
X5639 x(is)s 5904 x(very)s 6435 x(little)s 6977 x(to)s 7269 x(say)s
X7694 x(about)s 8332 x(it.)s 8690 x(To)s 9062 x(use)s 9487 x(Pas,)s
X9985 x(place)s
X/Helvetica 220 fnt
X1417 12948 moveto(@SysInclude { pas })s
X/Times-Roman 240 fnt
X3463 12952 moveto(in)s 3716 x(the)s 4075 x(setup)s
X4647 x(\256le,)s 5079 x(or)s 5345 x(type)s
X/Helvetica 220 fnt
X5824 12948 moveto(-ipas)s
X/Times-Roman 240 fnt
X6366 12952 moveto(in)s
X6619 x(the)s 6978 x(command)s 7989 x(line.)s 8534 x(A)s 8774 x(Pascal)s
X9451 x(program)s 10328 x(is)s 1417 12664 moveto(entered)s 2182 x(like)s 2602 x(this,)s
X3069 x(where)s 3715 x(the)s
X/Helvetica 220 fnt
X4069 12660 moveto(@ID)s
X/Times-Roman 240 fnt
X4573 12664 moveto(symbol)s 5340 x(from)s
X5866 x(the)s 6220 x(DocumentLayout)s 7957 x(package)s 8803 x([)s 8882 x(5)s
X9002 x(])s 9143 x(has)s 9524 x(been)s 10038 x(used)s 1417 12376 moveto(to)s
X1663 x(obtain)s 2321 x(an)s 2607 x(indented)s 3491 x(display:)s
X/Helvetica 220 fnt
X1897 11875 moveto(@ID @Pas {)s
X1897 11587 moveto(procedure PriDelete\(x: PriEntry; var Q: PriorityQueue\);)s 1897 11299 moveto( var i: integer;)s 1897 11011 moveto(begin)s 1897 10723 moveto( with Q^ do begin)s 1897 10435 moveto( size := size - 1;)s
X1897 10147 moveto( if x^.back <= size then)s 1897 9859 moveto( begin)s 1897 9571 moveto( i := x^.back;)s 1897 9283 moveto( A[i] := A[size + 1];)s 1897 8995 moveto( A[i]^.back := i;)s
X1897 8707 moveto( PriAddRoot\(i, Q\);)s 1897 8419 moveto( PriAddLeaf\(i, Q\))s 1897 8131 moveto( end)s 1897 7843 moveto( end)s 1897 7555 moveto(end;)s
X1897 7267 moveto(})s
X/Times-Roman 240 fnt
X1417 6770 moveto(The)s 1849 x(result)s 2439 x(will)s 2870 x(come)s
X3448 x(out)s 3814 x(like)s 4232 x(this:)s
X/Times-Bold 240 fnt
X1897 6313 moveto(procedure)s
X/Times-Italic 240 fnt
X3006 6315 moveto(PriDelete)s
X
X/Times-Roman 240 fnt
X3934 x(\()s
X/Times-Italic 240 fnt
X4013 x(x)s
X/Times-Roman 240 fnt
X4119 x(:)s
X/Times-Italic 240 fnt
X4245 x(PriEntry)s
X/Times-Roman 240 fnt
X5081 x(;)s
X
X/Times-Bold 240 fnt
X5207 6313 moveto(var)s
X/Times-Italic 240 fnt
X5613 6315 moveto(Q)s
X/Times-Roman 240 fnt
X5786 x(:)s
X/Times-Italic 240 fnt
X5912 x(PriorityQueue)s
X/Times-Roman 240 fnt
X7293 x(\);)s
X
X/Times-Bold 240 fnt
X2137 6025 moveto(var)s
X/Times-Italic 240 fnt
X2543 6027 moveto(i)s
X/Times-Roman 240 fnt
X2609 x(:)s
X/Times-Italic 240 fnt
X2735 x(integer)s
X/Times-Roman 240 fnt
X3412 x(;)s
X
X/Times-Bold 240 fnt
X1897 5737 moveto(begin)s 2137 5449 moveto(with)s
X/Times-Italic 240 fnt
X2648 5451 moveto(Q)s
X/Symbol 192 fnt
X2821 5456 moveto(\255)s
X/Times-Bold 240 fnt
X2996 5449 moveto(do)s
X3309 x(begin)s
X/Times-Italic 240 fnt
X2377 5163 moveto(size)s
X/Times-Roman 240 fnt
X2795 x(:)s
X/Symbol 240 fnt
X2861 5149 moveto(\075)s
X/Times-Italic 240 fnt
X3052 5163 moveto(size)s
X
X/Symbol 240 fnt
X3470 5156 moveto(-)s
X/Times-Roman 240 fnt
X3661 5163 moveto(1;)s
X/Times-Bold 240 fnt
X2377 4873 moveto(if)s
X/Times-Italic 240 fnt
X2582 4875 moveto(x)s
X/Symbol 192 fnt
X2688 4880 moveto(\255)s
X
X/Times-Roman 240 fnt
X2803 4875 moveto(.)s
X/Times-Italic 240 fnt
X2863 x(back)s
X/Symbol 240 fnt
X3375 4868 moveto(\243)s
X/Times-Italic 240 fnt
X3566 4875 moveto(size)s
X/Times-Bold 240 fnt
X3984 4873 moveto(then)s
X2377 4585 moveto(begin)s
X/Times-Italic 240 fnt
X2617 4299 moveto(i)s
X/Times-Roman 240 fnt
X2743 x(:)s
X/Symbol 240 fnt
X2809 4285 moveto(\075)s
X/Times-Italic 240 fnt
X3000 4299 moveto(x)s
X
X/Symbol 192 fnt
X3106 4304 moveto(\255)s
X/Times-Roman 240 fnt
X3221 4299 moveto(.)s
X/Times-Italic 240 fnt
X3281 x(back)s
X/Times-Roman 240 fnt
X3733 x(;)s
X/Times-Italic 240 fnt
X2617 4011 moveto(A)s
X
X/Times-Roman 240 fnt
X2763 x([)s
X/Times-Italic 240 fnt
X2842 x(i)s
X/Times-Roman 240 fnt
X2908 x(])s 3047 x(:)s
X/Symbol 240 fnt
X3113 3997 moveto(\075)s
X
X/Times-Italic 240 fnt
X3304 4011 moveto(A)s
X/Times-Roman 240 fnt
X3450 x([)s
X/Times-Italic 240 fnt
X3529 x(size)s
X/Symbol 240 fnt
X3947 4004 moveto(+)s
X/Times-Roman 240 fnt
X4138 4011 moveto(1];)s
X
X/Times-Italic 240 fnt
X2617 3723 moveto(A)s
X/Times-Roman 240 fnt
X2763 x([)s
X/Times-Italic 240 fnt
X2842 x(i)s
X/Times-Roman 240 fnt
X2908 x(])s
X/Symbol 192 fnt
X2987 3728 moveto(\255)s
X
X/Times-Roman 240 fnt
X3102 3723 moveto(.)s
X/Times-Italic 240 fnt
X3162 x(back)s
X/Times-Roman 240 fnt
X3674 x(:)s
X/Symbol 240 fnt
X3740 3709 moveto(\075)s
X/Times-Italic 240 fnt
X3931 3723 moveto(i)s
X
X/Times-Roman 240 fnt
X3997 x(;)s
X/Times-Italic 240 fnt
X2617 3435 moveto(PriAddRoot)s
X/Times-Roman 240 fnt
X3760 x(\()s
X/Times-Italic 240 fnt
X3839 x(i)s
X/Times-Roman 240 fnt
X3905 x(,)s
X
X/Times-Italic 240 fnt
X4025 x(Q)s
X/Times-Roman 240 fnt
X4198 x(\);)s
X/Times-Italic 240 fnt
X2617 3147 moveto(PriAddLeaf)s
X/Times-Roman 240 fnt
X3733 x(\()s
X/Times-Italic 240 fnt
X3812 x(i)s
X
X/Times-Roman 240 fnt
X3878 x(,)s
X/Times-Italic 240 fnt
X3998 x(Q)s
X/Times-Roman 240 fnt
X4171 x(\))s
X/Times-Bold 240 fnt
X2377 2857 moveto(end)s 2137 2569 moveto(end)s
X1897 2281 moveto(end)s
X/Times-Roman 240 fnt
X2269 2283 moveto(;)s 1417 1798 moveto(Blank)s 2032 x(lines,)s 2586 x(line)s
X2987 x(breaks,)s 3714 x(indents)s 4448 x(and)s 4837 x(spaces)s 5504 x(in)s
X5733 x(the)s 6068 x(input)s 6603 x(are)s 6937 x(respected,)s 7942 x(with)s
X8410 x(a)s 8559 x(tab)s 8894 x(being)s 9469 x(considered)s 1417 1510 moveto(equal)s
X1999 x(to)s 2249 x(eight)s 2791 x(spaces.)s
X/Helvetica 220 fnt
X3599 1506 moveto(@Pas)s
X/Times-Roman 240 fnt
X4264 1510 moveto(can)s
X4660 x(also)s 5109 x(be)s 5399 x(used)s 5902 x(within)s 6577 x(a)s
X6747 x(paragraph)s 7767 x(to)s 8017 x(produce)s 8852 x(Pascal)s 9526 x(fragments)s
X
Xpgsave restore
Xshowpage
X
X%%Page: ? 15


X%%BeginPageSetup
X0.0500 dup scale 10 setlinewidth
X/pgsave save def
X%%EndPageSetup
X
X/Times-Roman 240 fnt

X5694 15261 moveto(-)s 5833 x(14)s 6133 x(-)s 1417 14674 moveto(like)s
X/Times-Italic 240 fnt
X1835 x(A)s
X
X/Times-Roman 240 fnt
X1981 x([)s
X/Times-Italic 240 fnt
X2060 x(i)s
X/Times-Roman 240 fnt
X2126 x(..)s
X/Times-Italic 240 fnt
X2246 x(j)s
X/Times-Roman 240 fnt
X2312 x(])s
X2391 x(.)s 2571 x(Use)s
X/Helvetica 220 fnt
X3003 14670 moveto(@OneCol @Pas { ... })s
X/Times-Roman 240 fnt
X5203 14674 moveto(to)s 5449 x(prevent)s
X6226 x(the)s 6578 x(result)s 7168 x(from)s 7692 x(breaking)s 8589 x(over)s
X9074 x(two)s 9493 x(lines.)s
X/Helvetica 220 fnt
X1897 14296 moveto(@Pas)s
X/Times-Roman 240 fnt
X2558 14300 moveto(does)s 3057 x(not)s
X3423 x(attempt)s 4199 x(to)s 4445 x(rearrange)s 5406 x(the)s 5758 x(program)s
X6628 x(in)s 6874 x(any)s 7280 x(way.)s 7859 x(Each)s 8397 x(item)s
X8881 x(is)s 9100 x(simply)s 9811 x(printed)s 1417 14012 moveto(according)s 2420 x(to)s
X2666 x(the)s 3018 x(following)s 4008 x(plan:)s
X/Helvetica 220 fnt
X1897 13507 moveto(and)s
X/Times-Bold 240 fnt
X3314 13509 moveto(and)s
X
X/Helvetica 220 fnt
X1897 13219 moveto(array)s
X/Times-Bold 240 fnt
X3314 13221 moveto(array)s
X/Helvetica 220 fnt
X1897 12931 moveto(begin)s
X/Times-Bold 240 fnt
X3314 12933 moveto(begin)s
X/Helvetica 220 fnt
X1897 12643 moveto(case)s
X
X/Times-Bold 240 fnt
X3314 12645 moveto(case)s
X/Helvetica 220 fnt
X1897 12355 moveto(const)s
X/Times-Bold 240 fnt
X3314 12357 moveto(const)s
X/Helvetica 220 fnt
X1897 12067 moveto(div)s
X/Times-Bold 240 fnt
X3314 12069 moveto(div)s
X
X/Helvetica 220 fnt
X1897 11779 moveto(do)s
X/Times-Bold 240 fnt
X3314 11781 moveto(do)s
X/Helvetica 220 fnt
X1897 11491 moveto(downto)s
X/Times-Bold 240 fnt
X3314 11493 moveto(downto)s
X/Helvetica 220 fnt
X1897 11203 moveto(else)s
X
X/Times-Bold 240 fnt
X3314 11205 moveto(else)s
X/Helvetica 220 fnt
X1897 10915 moveto(end)s
X/Times-Bold 240 fnt
X3314 10917 moveto(end)s
X/Helvetica 220 fnt
X1897 10627 moveto(\256le)s
X/Times-Bold 240 fnt
X3314 10629 moveto(\256le)s
X
X/Helvetica 220 fnt
X1897 10339 moveto(for)s
X/Times-Bold 240 fnt
X3314 10341 moveto(for)s
X/Helvetica 220 fnt
X1897 10051 moveto(forward)s
X/Times-Bold 240 fnt
X3314 10053 moveto(forward)s
X/Helvetica 220 fnt
X1897 9763 moveto(function)s
X
X/Times-Bold 240 fnt
X3314 9765 moveto(function)s
X/Helvetica 220 fnt
X1897 9475 moveto(goto)s
X/Times-Bold 240 fnt
X3314 9477 moveto(goto)s
X/Helvetica 220 fnt
X1897 9187 moveto(if)s
X/Times-Bold 240 fnt
X3314 9189 moveto(if)s
X
X/Helvetica 220 fnt
X1897 8899 moveto(in)s
X/Times-Bold 240 fnt
X3314 8901 moveto(in)s
X/Helvetica 220 fnt
X1897 8611 moveto(label)s
X/Times-Bold 240 fnt
X3314 8613 moveto(label)s
X/Helvetica 220 fnt
X1897 8323 moveto(mod)s
X
X/Times-Bold 240 fnt
X3314 8325 moveto(mod)s
X/Helvetica 220 fnt
X1897 8035 moveto(nil)s
X/Times-Bold 240 fnt
X3314 8037 moveto(nil)s
X/Helvetica 220 fnt
X1897 7747 moveto(not)s
X/Times-Bold 240 fnt
X3314 7749 moveto(not)s
X
X/Helvetica 220 fnt
X1897 7459 moveto(of)s
X/Times-Bold 240 fnt
X3314 7461 moveto(of)s
X/Helvetica 220 fnt
X1897 7171 moveto(or)s
X/Times-Bold 240 fnt
X3314 7173 moveto(or)s
X/Helvetica 220 fnt
X1897 6883 moveto(otherwise)s
X
X/Times-Bold 240 fnt
X3314 6885 moveto(otherwise)s
X/Helvetica 220 fnt
X1897 6595 moveto(packed)s
X/Times-Bold 240 fnt
X3314 6597 moveto(packed)s
X/Helvetica 220 fnt
X1897 6307 moveto(procedure)s
X/Times-Bold 240 fnt
X3314 6309 moveto(procedure)s
X
X/Helvetica 220 fnt
X1897 6019 moveto(program)s
X/Times-Bold 240 fnt
X3314 6021 moveto(program)s
X/Helvetica 220 fnt
X1897 5731 moveto(record)s
X/Times-Bold 240 fnt
X3314 5733 moveto(record)s
X/Helvetica 220 fnt
X1897 5443 moveto(repeat)s
X
X/Times-Bold 240 fnt
X3314 5445 moveto(repeat)s
X/Helvetica 220 fnt
X1897 5155 moveto(set)s
X/Times-Bold 240 fnt
X3314 5157 moveto(set)s
X/Helvetica 220 fnt
X1897 4867 moveto(then)s
X/Times-Bold 240 fnt
X3314 4869 moveto(then)s
X
X/Helvetica 220 fnt
X1897 4579 moveto(to)s
X/Times-Bold 240 fnt
X3314 4581 moveto(to)s
X/Helvetica 220 fnt
X1897 4291 moveto(type)s
X/Times-Bold 240 fnt
X3314 4293 moveto(type)s
X/Helvetica 220 fnt
X1897 4003 moveto(until)s
X
X/Times-Bold 240 fnt
X3314 4005 moveto(until)s
X/Helvetica 220 fnt
X1897 3715 moveto(var)s
X/Times-Bold 240 fnt
X3314 3717 moveto(var)s
X/Helvetica 220 fnt
X1897 3427 moveto(while)s
X/Times-Bold 240 fnt
X3314 3429 moveto(while)s
X
X/Helvetica 220 fnt
X1897 3139 moveto(with)s
X/Times-Bold 240 fnt
X3314 3141 moveto(with)s
X/Helvetica 220 fnt
X5866 13507 moveto(0)s
X/Times-Roman 240 fnt
X7283 13511 moveto(0)s
X/Helvetica 220 fnt
X5866 13219 moveto(1)s
X
X/Times-Roman 240 fnt
X7283 13223 moveto(1)s
X/Helvetica 220 fnt
X5866 12931 moveto(2)s
X/Times-Roman 240 fnt
X7283 12935 moveto(2)s
X/Helvetica 220 fnt
X5866 12643 moveto(3)s
X/Times-Roman 240 fnt
X7283 12647 moveto(3)s
X
X/Helvetica 220 fnt
X5866 12355 moveto(4)s
X/Times-Roman 240 fnt
X7283 12359 moveto(4)s
X/Helvetica 220 fnt
X5866 12067 moveto(5)s
X/Times-Roman 240 fnt
X7283 12071 moveto(5)s
X/Helvetica 220 fnt
X5866 11779 moveto(6)s
X
X/Times-Roman 240 fnt
X7283 11783 moveto(6)s
X/Helvetica 220 fnt
X5866 11491 moveto(7)s
X/Times-Roman 240 fnt
X7283 11495 moveto(7)s
X/Helvetica 220 fnt
X5866 11203 moveto(8)s
X/Times-Roman 240 fnt
X7283 11207 moveto(8)s
X
X/Helvetica 220 fnt
X5866 10915 moveto(9)s
X/Times-Roman 240 fnt
X7283 10919 moveto(9)s
X/Helvetica 220 fnt
X5866 10627 moveto(.)s
X/Times-Roman 240 fnt
X7283 10631 moveto(.)s
X/Helvetica 220 fnt
X5866 10339 moveto(,)s
X
X/Times-Roman 240 fnt
X7283 10343 moveto(,)s
X/Helvetica 220 fnt
X5866 10051 moveto(:)s
X/Times-Roman 240 fnt
X7283 10055 moveto(:)s
X/Helvetica 220 fnt
X5866 9763 moveto(;)s
X/Times-Roman 240 fnt
X7283 9767 moveto(;)s
X
X/Helvetica 220 fnt
X5866 9475 moveto(')s
X/Times-Roman 240 fnt
X7283 9479 moveto(')s
X/Helvetica 220 fnt
X5866 9187 moveto(`)s
X/Times-Roman 240 fnt
X7283 9191 moveto(`)s
X/Helvetica 220 fnt
X5866 8899 moveto(+)s
X
X/Symbol 240 fnt
X7283 8896 moveto(+)s
X/Helvetica 220 fnt
X5866 8611 moveto(-)s
X/Symbol 240 fnt
X7283 8608 moveto(-)s
X/Helvetica 220 fnt
X5866 8323 moveto(*)s
X/Symbol 240 fnt
X7283 8320 moveto(\052)s
X
X/Helvetica 220 fnt
X5866 8035 moveto(/)s
X/Times-Roman 240 fnt
X7283 8039 moveto(\057)s
X/Helvetica 220 fnt
X5866 7747 moveto(\()s
X/Times-Roman 240 fnt
X7283 7751 moveto(\()s
X/Helvetica 220 fnt
X5866 7459 moveto(\))s
X
X/Times-Roman 240 fnt
X7283 7463 moveto(\))s
X/Helvetica 220 fnt
X5866 7171 moveto([)s
X/Times-Roman 240 fnt
X7283 7175 moveto([)s
X/Helvetica 220 fnt
X5866 6883 moveto(])s
X/Times-Roman 240 fnt
X7283 6887 moveto(])s
X
X/Helvetica 220 fnt
X5866 6595 moveto(^)s
X/Symbol 192 fnt
X7283 6604 moveto(\255)s
X/Helvetica 220 fnt
X5866 6307 moveto(..)s
X/Times-Roman 240 fnt
X7283 6311 moveto(..)s
X/Helvetica 220 fnt
X5866 6019 moveto(=)s
X
X/Symbol 240 fnt
X7283 6016 moveto(\075)s
X/Helvetica 220 fnt
X5866 5731 moveto(<)s
X/Symbol 240 fnt
X7283 5728 moveto(\074)s
X/Helvetica 220 fnt
X5866 5443 moveto(>)s
X/Symbol 240 fnt
X7283 5440 moveto(\076)s
X
X/Helvetica 220 fnt
X5866 5155 moveto(<>)s
X/Symbol 240 fnt
X7283 5152 moveto(\271)s
X/Helvetica 220 fnt
X5866 4867 moveto(<=)s
X/Symbol 240 fnt
X7283 4864 moveto(\243)s
X/Helvetica 220 fnt
X5866 4579 moveto(>=)s
X
X/Symbol 240 fnt
X7283 4576 moveto(\263)s
X/Helvetica 220 fnt
X5866 4291 moveto(:=)s
X/Times-Roman 240 fnt
X7283 4295 moveto(:)s
X/Symbol 240 fnt
X7349 4281 moveto(\075)s
X/Times-Roman 240 fnt
X1417 2684 moveto(Anything)s
X2382 x(not)s 2748 x(mentioned)s 3818 x(here)s 4289 x(will)s 4720 x(appear)s
X5417 x(in)s 5663 x(italic)s 6199 x(font.)s 1897 2310 moveto(Pascal)s 2592 x(character)s
X3551 x(strings)s 4273 x(need)s 4810 x(a)s 5001 x(little)s 5522 x(attention)s
X6443 x(before)s 7138 x(formatting)s 8231 x(by)s 8556 x(Pas.)s 9093 x(Their)s
X9695 x(interiors)s 1417 2022 moveto(are)s 1775 x(best)s 2227 x(enclosed)s 3131 x(in)s
X3384 x(double)s 4103 x(quotes)s 4795 x(to)s 5048 x(prevent)s 5832 x(the)s
X6191 x(above)s 6830 x(transformations)s 8396 x(from)s 8927 x(occurring)s 9910 x(inside)s
X1417 1734 moveto(them.)s 2076 x(Any)s
X/Helvetica 220 fnt
X2550 1730 moveto(\\)s
X/Times-Roman 240 fnt
X2672 1734 moveto(or)s
X/Helvetica 220 fnt
X2932 1730 moveto(")s
X
X/Times-Roman 240 fnt
X3071 1734 moveto(characters)s 4099 x(inside)s 4731 x(strings)s 5429 x(will)s 5861 x(need)s
X6374 x(to)s 6621 x(be)s 6908 x(replaced)s 7778 x(by)s
X/Helvetica 220 fnt
X8079 1730 moveto(\\\\)s
X
X/Times-Roman 240 fnt
X8262 1734 moveto(and)s
X/Helvetica 220 fnt
X8669 1730 moveto(\\")s
X/Times-Roman 240 fnt
X8869 1734 moveto(respectively,)s 10144 x(and)s
Xpgsave restore
Xshowpage
X
X%%Page: ? 16


X%%BeginPageSetup
X0.0500 dup scale 10 setlinewidth
X/pgsave save def
X%%EndPageSetup
X
X/Times-Roman 240 fnt

X5694 15258 moveto(-)s 5833 x(15)s 6133 x(-)s 1417 14667 moveto(the)s 1769 x(opening)s
X2601 x(quote)s 3193 x(should)s 3892 x(be)s 4178 x(replaced)s 5047 x(by)s
X
X/Helvetica 220 fnt
X5347 14663 moveto(`)s
X/Times-Roman 240 fnt
X5395 14667 moveto(.)s 1897 14293 moveto(Similar)s 2672 x(remarks)s 3514 x(apply)s
X4119 x(to)s 4378 x(Pascal)s 5061 x(comments;)s 6183 x(don't)s 6761 x(forget)s
X7404 x(that)s
X/Helvetica 220 fnt
X7835 14289 moveto({)s
X/Times-Roman 240 fnt
X7981 14293 moveto(and)s
X/Helvetica 220 fnt
X8400 14289 moveto(})s
X/Times-Roman 240 fnt
X8546 14293 moveto(must)s
X9084 x(be)s 9383 x(enclosed)s 10293 x(in)s 1417 14005 moveto(double)s 2123 x(quotes.)s
X2922 x(Alternatively,)s 4296 x(a)s
X/Helvetica 220 fnt
X4456 14001 moveto(@Com)s
X/Times-Roman 240 fnt
X5196 14005 moveto(symbol)s 5955 x(can)s
X6341 x(be)s 6621 x(placed)s 7299 x(in)s 7539 x(front)s 8057 x(of)s
X8310 x(a)s 8470 x(comment)s 9414 x(enclosed)s 10305 x(in)s 1417 13717 moveto(braces.)s
X2207 x(It)s 2412 x(will)s 2843 x(add)s 3249 x(literal)s 3864 x(braces:)s
X
X/Helvetica 220 fnt
X1897 13263 moveto(@Com { A Pascal comment })s
X/Times-Roman 240 fnt
X1417 12766 moveto(has)s 1796 x(result)s 1897 12312 moveto({)s
X/Times-Italic 240 fnt
X2072 x(A)s
X2278 x(Pascal)s 2989 x(comment)s
X/Times-Roman 240 fnt
X3913 x(})s 1417 11822 moveto(It)s 1622 x(may)s
X2094 x(still)s 2511 x(be)s 2797 x(necessary)s 3786 x(to)s 4032 x(enclose)s
X4809 x(the)s 5161 x(interior)s 5923 x(in)s 6169 x(double)s 6881 x(quotes.)s
X
X/Times-Bold 240 fnt
X1417 11029 moveto(References)s
X/Times-Roman 240 fnt
X1417 10574 moveto(1.)s 1897 x(Adobe)s 2716 x(Systems,)s 3753 x(Inc.)s
X4118 x(,)s
X/Times-Italic 240 fnt
X4418 x(PostScript)s 5594 x(Language)s 6733 x(Reference)s 7868 x(Manual,)s
X8853 x(Second)s 9725 x(Edition)s
X/Times-Roman 240 fnt
X10429 x(.)s 1897 10286 moveto(Addison-Wesley)s 3505 x(,)s
X3625 x(1990)s 4105 x(.)s 1417 9782 moveto(2.)s 1897 x(Jensen,)s 2655 x(K.)s
X2948 x(and)s 3354 x(Wirth,)s 4031 x(N.)s 4264 x(,)s
X/Times-Italic 240 fnt
X4444 x(Pascal)s
X5155 x(User)s 5680 x(Manual)s 6485 x(and)s 6905 x(Report)s
X/Times-Roman 240 fnt
X7556 x(.)s
X7736 x(Springer-Verlag)s 9288 x(,)s 9408 x(1975)s 9888 x(.)s 1417 9280 moveto(3.)s
X1897 x(Kernighan,)s 3069 x(Brian)s 3702 x(W.)s 4090 x(and)s 4538 x(Cherry,)s
X5364 x(Lorinda)s 6223 x(L.)s 6429 x(,)s 6651 x(A)s 6926 x(system)s
X7692 x(for)s 8072 x(typesetting)s 9223 x(mathematics)s 10430 x(.)s
X/Times-Italic 240 fnt
X1897 8992 moveto(Communications)s
X3580 x(of)s 3826 x(the)s 4178 x(ACM)s
X/Times-Bold 240 fnt
X4743 8990 moveto(18)s
X/Times-Roman 240 fnt
X4983 8992 moveto(,)s
X5103 x(182\261193)s 6003 x(\()s 6082 x(1975)s 6562 x(\).)s 1417 8491 moveto(4.)s
X1897 x(Kingston,)s 2940 x(Jeffrey)s 3707 x(H.)s 3940 x(,)s
X/Times-Italic 240 fnt
X4165 x(Document)s
X5254 x(Formatting)s 6449 x(with)s 6966 x(Lout)s 7510 x(\(Second)s 8386 x(Edition\))s
X
X/Times-Roman 240 fnt
X9169 x(.)s 9394 x(Tech.)s 10037 x(Rep.)s 1897 8203 moveto(449)s 2345 x(\()s
X2424 x(1992)s 2904 x(\),)s 3131 x(Basser)s 3856 x(Department)s 5072 x(of)s
X5359 x(Computer)s 6404 x(Science)s 7235 x(F09,)s 7756 x(University)s 8853 x(of)s
X9140 x(Sydney)s 9947 x(2006,)s 1897 7915 moveto(Australia)s 2772 x(.)s 1417 7459 moveto(5.)s
X1897 x(Kingston,)s 2961 x(Jeffrey)s 3749 x(H.)s 3982 x(,)s
X/Times-Italic 240 fnt
X4228 x(A)s
X4500 x(beginners')s 5649 x(guide)s 6307 x(to)s 6619 x(Lout)s
X/Times-Roman 240 fnt
X7058 x(.)s
X7304 x(Tech.)s 7968 x(Rep.)s 8540 x(450)s 9026 x(\()s 9105 x(1992)s
X9585 x(\),)s 9850 x(Basser)s 1897 7171 moveto(Department)s 3085 x(of)s 3344 x(Computer)s
X4361 x(Science)s 5164 x(F09,)s 5657 x(University)s 6726 x(of)s 6985 x(Sydney)s
X7764 x(2006,)s 8364 x(Australia)s 9239 x(.)s 1417 6668 moveto(6.)s 1897 x(Knuth,)s
X2616 x(Donald)s 3381 x(E.)s 3587 x(,)s
X/Times-Italic 240 fnt
X3767 x(The)s 4186 x(T)s
X4319 6620 moveto(E)s 4465 6668 moveto(XBook)s
X/Times-Roman 240 fnt
X5103 x(.)s 5283 x(Addison-Wesley)s 6891 x(,)s
X7011 x(1984)s 7491 x(.)s
Xpgsave restore
Xshowpage
X%%Trailer
X%%DocumentNeededResources: font Helvetica
X%%+ font Symbol
X%%+ font Times-Roman
X%%+ font Times-Italic
X%%+ font Times-Bold
X%%Pages: 16
X%%EOF
END_OF_FILE
if test 53998 -ne `wc -c <'lout/doc/tr.eq/outfile.ps.C'`; then
echo shar: \"'lout/doc/tr.eq/outfile.ps.C'\" unpacked with wrong size!
elif test -f 'lout/doc/tr.eq/outfile.ps.A' && test -f 'lout/doc/tr.eq/outfile.ps.B'; then


echo shar: Combining \"'lout/doc/tr.eq/outfile.ps'\" \(157394 characters\)
cat 'lout/doc/tr.eq/outfile.ps.A' 'lout/doc/tr.eq/outfile.ps.B' 'lout/doc/tr.eq/outfile.ps.C' > 'lout/doc/tr.eq/outfile.ps'
if test 157394 -ne `wc -c <'lout/doc/tr.eq/outfile.ps'`; then
echo shar: \"'lout/doc/tr.eq/outfile.ps'\" combined with wrong size!
else
rm lout/doc/tr.eq/outfile.ps.A lout/doc/tr.eq/outfile.ps.B
rm lout/doc/tr.eq/outfile.ps.C
fi
fi

# end of 'lout/doc/tr.eq/outfile.ps.C'
fi
if test -f 'lout/include/tab' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/include/tab'\"
else
echo shar: Extracting \"'lout/include/tab'\" \(25208 characters\)
sed "s/^X//" >'lout/include/tab' <<'END_OF_FILE'
X
X###############################################################################
X# #
X# Lout @Tab package for formatting tables (Version 2.0) #
X# #
X# Version 1.0 by Jeffrey H. Kingston, September 1991. #


X# Version 2.0 by Jeffrey H. Kingston, 22 December 1992. #
X# #

X# See "Tab - A Lout package for formatting tables" for user information. #
X# #
X###############################################################################
X
X@SysPrependGraphic { "tab_prepend" }
X
Xexport @CC @RR @Rule @DoubleRule @Line @DoubleLine @NP
X @Rowa @Rowb @Rowc @Rowd @Rowe @Rowf @Rowg @Rowh @Rowi @Rowj
X @MarkRowa @MarkRowb @MarkRowc @MarkRowd @MarkRowe @MarkRowf
X @MarkRowg @MarkRowh @MarkRowi @MarkRowj
X
Xdef @Tab
X
X named above { no }
X named below { no }
X named between { no }
X named side { no }
X named hmargin { 0.3c }
X named vmargin { 0.2v }
X named linewidth { 0.5 pt }
X
X named @Fmta
X named A {} named B {} named C {} named D {} named E {}
X named F {} named G {} named H {} named I {} named J {}
X named K {} named L {} named M {} named N {} named O {}
X named P {} named Q {} named R {} named S {} named T {}
X named U {} named V {} named W {} named X {} named Y {}
X named Z {}
X named "!" precedence 10 left x named between { dft } right y {}
X named "!!" precedence 10 left x right y {}
X named "!!!" precedence 10 left x right y {}
X named "@Over" precedence 11 left x right y { x // y }
X named "," precedence 12 left x right y {}
X named @Col precedence 12 right x {}
X named @CC right x { clines @Break { & x } }
X named @RR right x { rlines @Break { & x } }
X {}
X
X named @Fmtb
X named A {} named B {} named C {} named D {} named E {}
X named F {} named G {} named H {} named I {} named J {}
X named K {} named L {} named M {} named N {} named O {}
X named P {} named Q {} named R {} named S {} named T {}
X named U {} named V {} named W {} named X {} named Y {}
X named Z {}
X named "!" precedence 10 left x named between { dft } right y {}
X named "!!" precedence 10 left x right y {}
X named "!!!" precedence 10 left x right y {}
X named "@Over" precedence 11 left x right y { x // y }
X named "," precedence 12 left x right y {}
X named @Col precedence 12 right x {}
X named @CC right x { clines @Break { & x } }
X named @RR right x { rlines @Break { & x } }
X {}
X
X named @Fmtc
X named A {} named B {} named C {} named D {} named E {}
X named F {} named G {} named H {} named I {} named J {}
X named K {} named L {} named M {} named N {} named O {}
X named P {} named Q {} named R {} named S {} named T {}
X named U {} named V {} named W {} named X {} named Y {}
X named Z {}
X named "!" precedence 10 left x named between { dft } right y {}
X named "!!" precedence 10 left x right y {}
X named "!!!" precedence 10 left x right y {}
X named "@Over" precedence 11 left x right y { x // y }
X named "," precedence 12 left x right y {}
X named @Col precedence 12 right x {}
X named @CC right x { clines @Break { & x } }
X named @RR right x { rlines @Break { & x } }
X {}
X
X named @Fmtd
X named A {} named B {} named C {} named D {} named E {}
X named F {} named G {} named H {} named I {} named J {}
X named K {} named L {} named M {} named N {} named O {}
X named P {} named Q {} named R {} named S {} named T {}
X named U {} named V {} named W {} named X {} named Y {}
X named Z {}
X named "!" precedence 10 left x named between { dft } right y {}
X named "!!" precedence 10 left x right y {}
X named "!!!" precedence 10 left x right y {}
X named "@Over" precedence 11 left x right y { x // y }
X named "," precedence 12 left x right y {}
X named @Col precedence 12 right x {}
X named @CC right x { clines @Break { & x } }
X named @RR right x { rlines @Break { & x } }
X {}
X
X named @Fmte
X named A {} named B {} named C {} named D {} named E {}
X named F {} named G {} named H {} named I {} named J {}
X named K {} named L {} named M {} named N {} named O {}
X named P {} named Q {} named R {} named S {} named T {}
X named U {} named V {} named W {} named X {} named Y {}
X named Z {}
X named "!" precedence 10 left x named between { dft } right y {}
X named "!!" precedence 10 left x right y {}
X named "!!!" precedence 10 left x right y {}
X named "@Over" precedence 11 left x right y { x // y }
X named "," precedence 12 left x right y {}
X named @Col precedence 12 right x {}
X named @CC right x { clines @Break { & x } }
X named @RR right x { rlines @Break { & x } }
X {}
X
X named @Fmtf
X named A {} named B {} named C {} named D {} named E {}
X named F {} named G {} named H {} named I {} named J {}
X named K {} named L {} named M {} named N {} named O {}
X named P {} named Q {} named R {} named S {} named T {}
X named U {} named V {} named W {} named X {} named Y {}
X named Z {}
X named "!" precedence 10 left x named between { dft } right y {}
X named "!!" precedence 10 left x right y {}
X named "!!!" precedence 10 left x right y {}
X named "@Over" precedence 11 left x right y { x // y }
X named "," precedence 12 left x right y {}
X named @Col precedence 12 right x {}
X named @CC right x { clines @Break { & x } }
X named @RR right x { rlines @Break { & x } }
X {}
X
X named @Fmtg
X named A {} named B {} named C {} named D {} named E {}
X named F {} named G {} named H {} named I {} named J {}
X named K {} named L {} named M {} named N {} named O {}
X named P {} named Q {} named R {} named S {} named T {}
X named U {} named V {} named W {} named X {} named Y {}
X named Z {}
X named "!" precedence 10 left x named between { dft } right y {}
X named "!!" precedence 10 left x right y {}
X named "!!!" precedence 10 left x right y {}
X named "@Over" precedence 11 left x right y { x // y }
X named "," precedence 12 left x right y {}
X named @Col precedence 12 right x {}
X named @CC right x { clines @Break { & x } }
X named @RR right x { rlines @Break { & x } }
X {}
X
X named @Fmth
X named A {} named B {} named C {} named D {} named E {}
X named F {} named G {} named H {} named I {} named J {}
X named K {} named L {} named M {} named N {} named O {}
X named P {} named Q {} named R {} named S {} named T {}
X named U {} named V {} named W {} named X {} named Y {}
X named Z {}
X named "!" precedence 10 left x named between { dft } right y {}
X named "!!" precedence 10 left x right y {}
X named "!!!" precedence 10 left x right y {}
X named "@Over" precedence 11 left x right y { x // y }
X named "," precedence 12 left x right y {}
X named @Col precedence 12 right x {}
X named @CC right x { clines @Break { & x } }
X named @RR right x { rlines @Break { & x } }
X {}
X
X named @Fmti
X named A {} named B {} named C {} named D {} named E {}
X named F {} named G {} named H {} named I {} named J {}
X named K {} named L {} named M {} named N {} named O {}
X named P {} named Q {} named R {} named S {} named T {}
X named U {} named V {} named W {} named X {} named Y {}
X named Z {}
X named "!" precedence 10 left x named between { dft } right y {}
X named "!!" precedence 10 left x right y {}
X named "!!!" precedence 10 left x right y {}
X named "@Over" precedence 11 left x right y { x // y }
X named "," precedence 12 left x right y {}
X named @Col precedence 12 right x {}
X named @CC right x { clines @Break { & x } }
X named @RR right x { rlines @Break { & x } }
X {}
X
X named @Fmtj
X named A {} named B {} named C {} named D {} named E {}
X named F {} named G {} named H {} named I {} named J {}
X named K {} named L {} named M {} named N {} named O {}
X named P {} named Q {} named R {} named S {} named T {}
X named U {} named V {} named W {} named X {} named Y {}
X named Z {}
X named "!" precedence 10 left x named between { dft } right y {}
X named "!!" precedence 10 left x right y {}
X named "!!!" precedence 10 left x right y {}
X named "@Over" precedence 11 left x right y { x // y }
X named "," precedence 12 left x right y {}
X named @Col precedence 12 right x {}
X named @CC right x { clines @Break { & x } }
X named @RR right x { rlines @Break { & x } }
X {}
X
X body @Body
X
X@Begin
X
X macro @NP { /1.1b }
X
X def @CC right x { clines @Break { & x } }
X def @RR right x { rlines @Break { & x } }
X
X def @HSingle { linewidth ltabhs }
X def @HSingleProject { linewidth ltabhsp }
X def @HDouble { linewidth ltabhd }
X def @HDoubleBelow { linewidth ltabhdb }
X def @HDoubleNW { linewidth ltabhdnw }
X def @HDoubleNE { linewidth ltabhdne }
X def @HDoubleSW { linewidth ltabhdsw }
X def @HDoubleSE { linewidth ltabhdse }
X def @VSingle { linewidth ltabvs }
X def @VDouble { linewidth ltabvd }
X def @VDoubleRight { linewidth ltabvdr }
X
X def @MidHRule
X left rule
X right x
X {
X rule @Case
X {
X no @Yield { @OneCol x }
X { yes single } @Yield { @HSingle @Graphic x }
X { double doubleboxabove } @Yield { @HDouble @Graphic x }
X doubleboxbelow @Yield { @HDoubleBelow @Graphic x }
X }
X }
X
X def @LeftHRule
X left rule
X right x
X {
X rule @Case
X {
X no @Yield { @OneCol x }
X { yes single } @Yield { @HSingleProject @Graphic x }
X double @Yield { @HDouble @Graphic x }
X doubleboxabove @Yield { @HDoubleNW @Graphic x }
X doubleboxbelow @Yield { @HDoubleSW @Graphic x }
X }
X }
X
X def @RightHRule
X left rule
X right x
X {
X rule @Case
X {
X no @Yield { @OneCol x }
X { yes single } @Yield { @HSingleProject @Graphic x }
X double @Yield { @HDouble @Graphic x }
X doubleboxabove @Yield { @HDoubleNE @Graphic x }
X doubleboxbelow @Yield { @HDoubleSE @Graphic x }
X }
X }
X
X def @HSRule
X left rule
X {
X rule @Case
X {
X no @Yield {}
X { yes single } @Yield { @HSingle @Graphic {} }
X double @Yield { @HDouble @Graphic {} }
X doubleboxabove @Yield { @HDouble @Graphic {} }
X doubleboxbelow @Yield { @HDoubleBelow @Graphic {} }
X }
X }
X
X def @ZeroWidth
X right x
X { @OneCol { |0io x |0io }
X }
X
X def @Line
X { single @HSRule
X }
X
X def @DoubleLine
X { double @HSRule
X }
X
X def @Rule
X {
X @OneRow
X {
X @ZeroWidth @HSingle @Graphic { ^|hmargin }
X / @Line /
X &1rt @ZeroWidth @HSingle @Graphic { |hmargin }
X }
X }
X
X def @DoubleRule
X {
X @OneRow
X {
X @ZeroWidth @HDouble @Graphic { ^|hmargin }
X / @DoubleLine /
X &1rt @ZeroWidth @HDouble @Graphic { |hmargin }
X }
X }
X
X def @VRule
X left rule
X right x
X {
X rule @Case
X {
X no @Yield {}
X { yes single } @Yield @OneRow { /0io @VSingle @Graphic x /0io }
X double @Yield @OneRow { /0io @VDouble @Graphic x /0io }
X }
X }
X
X def @VRuleRight
X left rule
X right x
X {
X rule @Case
X {
X no @Yield {}
X {yes single} @Yield @OneRow { /0io @VSingle @Graphic x /0io }
X double @Yield @OneRow { /0io @VDoubleRight @Graphic x /0io }
X }
X }
X
X def @VSRule
X left rule
X {
X rule @Case
X {
X no @Yield {}
X { yes single } @Yield { @VSingle @Graphic {} }
X double @Yield { @VDouble @Graphic {} }
X }
X }
X
X def @VSRuleRight
X left rule
X {
X rule @Case
X {
X no @Yield {}
X {yes single} @Yield { @VSingle @Graphic {} }
X double @Yield { @VDoubleRight @Graphic {} }
X }
X }
X
X def @Wrap
X named ur { no } # Rule up above entry
X named dr { no } # Rule down below entry
X named vm { vmargin } # Vertical margin
X right x # The object to be wrapped
X {
X ur @HSRule
X ^/vm @OneCol @OneRow x
X /vm dr @HSRule
X }
X
X def @Sep
X left x
X named ur { no } # Rule up above entry
X named dr { no } # Rule down below entry
X named sr { no } # Rule separating x from y
X named hm { hmargin } # Horizontal margin
X named vm { vmargin } # Vertical margin
X right y
X {
X def vr
X {
X sr @Case
X { dft @Yield between
X else @Yield sr
X }
X }
X
X x | @OneCol
X { ur @MidHRule {|hm}
X /vm
X /vm dr @MidHRule {|hm}
X }
X | @OneCol
X { vr @VRule { /vm } | ur @MidHRule {|hm}
X /vm vr @VSRule |
X /vm vr @VRule {^/vm } | dr @MidHRule {|hm}
X }
X | y
X }
X
X def @NSep
X left x
X named hm { hmargin }
X right y
X {
X x | @OneCol { |hm } | @OneCol { |hm } | y
X }
X
X def @LeftEdge
X named ur { no } # Rule up above entry
X named dr { no } # Rule down below entry
X named sr { no } # Rule separating x from y
X named hm { hmargin } # Horizontal margin
X named vm { vmargin } # Vertical margin
X right x
X {
X sr @Case
X {
X no @Yield { x }
X else @Yield
X { @OneCol
X {
X sr @VRule { /vm } | ur @LeftHRule { |hm }
X ^/vm sr @VSRule |
X /vm sr @VRule { ^/vm } | dr @LeftHRule { |hm }


X }
X | x
X }
X }
X }

X
X def @RightEdge
X left x
X named ur { no } # Rule up above entry
X named dr { no } # Rule down below entry
X named sr { no } # Rule separating x from y
X named hm { hmargin } # Horizontal margin
X named vm { vmargin } # Vertical margin
X {
X sr @Case
X {
X no @Yield { x }
X else @Yield
X {
X x | @OneCol
X {
X ur @RightHRule { |hm }
X /vm
X /vm dr @RightHRule { |hm }
X }
X | @OneCol
X {
X sr @VRuleRight { /vm }
X /vm sr @VSRuleRight
X /vm sr @VRuleRight { ^/vm }


X }
X }
X }
X }
X

X def @DoRowa
X named A {} named B {} named C {} named D {} named E {}
X named F {} named G {} named H {} named I {} named J {}
X named K {} named L {} named M {} named N {} named O {}
X named P {} named Q {} named R {} named S {} named T {}
X named U {} named V {} named W {} named X {} named Y {}
X named Z {}
X named above { above }
X named below { below }
X named side { side }
X named vmargin { vmargin }
X {
X @LeftEdge ur { above } dr { below } sr { side } vm { vmargin }
X @Fmta
X A { A } B { B } C { C } D { D } E { E }
X F { F } G { G } H { H } I { I } J { J }
X K { K } L { L } M { M } N { N } O { O }
X P { P } Q { Q } R { R } S { S } T { T }
X U { U } V { V } W { W } X { X } Y { Y }
X Z { Z }
X @Col { @Wrap ur {above} dr {below} vm {vmargin} x}
X ! { x @Sep ur {above} dr {below} sr { between } vm {vmargin} y}
X !! { x @Sep ur {above} dr {below} sr { single } vm {vmargin} y}
X !!! { x @Sep ur {above} dr {below} sr { double } vm {vmargin} y}
X , { x @NSep y }
X @RightEdge ur { above } dr { below } sr { side } vm { vmargin }
X }
X
X def @DoRowb
X named A {} named B {} named C {} named D {} named E {}
X named F {} named G {} named H {} named I {} named J {}
X named K {} named L {} named M {} named N {} named O {}
X named P {} named Q {} named R {} named S {} named T {}
X named U {} named V {} named W {} named X {} named Y {}
X named Z {}
X named above { above }
X named below { below }
X named side { side }
X named vmargin { vmargin }
X {
X @LeftEdge ur { above } dr { below } sr { side } vm { vmargin }
X @Fmtb
X A { A } B { B } C { C } D { D } E { E }
X F { F } G { G } H { H } I { I } J { J }
X K { K } L { L } M { M } N { N } O { O }
X P { P } Q { Q } R { R } S { S } T { T }
X U { U } V { V } W { W } X { X } Y { Y }
X Z { Z }
X @Col { @Wrap ur {above} dr {below} vm {vmargin} x}
X ! { x @Sep ur {above} dr {below} sr { between } vm {vmargin} y}
X !! { x @Sep ur {above} dr {below} sr { single } vm {vmargin} y}
X !!! { x @Sep ur {above} dr {below} sr { double } vm {vmargin} y}
X , { x @NSep y }
X @RightEdge ur { above } dr { below } sr { side } vm { vmargin }
X }
X
X def @DoRowc
X named A {} named B {} named C {} named D {} named E {}
X named F {} named G {} named H {} named I {} named J {}
X named K {} named L {} named M {} named N {} named O {}
X named P {} named Q {} named R {} named S {} named T {}
X named U {} named V {} named W {} named X {} named Y {}
X named Z {}
X named above { above }
X named below { below }
X named side { side }
X named vmargin { vmargin }
X {
X @LeftEdge ur { above } dr { below } sr { side } vm { vmargin }
X @Fmtc
X A { A } B { B } C { C } D { D } E { E }
X F { F } G { G } H { H } I { I } J { J }
X K { K } L { L } M { M } N { N } O { O }
X P { P } Q { Q } R { R } S { S } T { T }
X U { U } V { V } W { W } X { X } Y { Y }
X Z { Z }
X @Col { @Wrap ur {above} dr {below} vm {vmargin} x}
X ! { x @Sep ur {above} dr {below} sr { between } vm {vmargin} y}
X !! { x @Sep ur {above} dr {below} sr { single } vm {vmargin} y}
X !!! { x @Sep ur {above} dr {below} sr { double } vm {vmargin} y}
X , { x @NSep y }
X @RightEdge ur { above } dr { below } sr { side } vm { vmargin }
X }
X
X def @DoRowd
X named A {} named B {} named C {} named D {} named E {}
X named F {} named G {} named H {} named I {} named J {}
X named K {} named L {} named M {} named N {} named O {}
X named P {} named Q {} named R {} named S {} named T {}
X named U {} named V {} named W {} named X {} named Y {}
X named Z {}
X named above { above }
X named below { below }
X named side { side }
X named vmargin { vmargin }
X {
X @LeftEdge ur { above } dr { below } sr { side } vm { vmargin }
X @Fmtd
X A { A } B { B } C { C } D { D } E { E }
X F { F } G { G } H { H } I { I } J { J }
X K { K } L { L } M { M } N { N } O { O }
X P { P } Q { Q } R { R } S { S } T { T }
X U { U } V { V } W { W } X { X } Y { Y }
X Z { Z }
X @Col { @Wrap ur {above} dr {below} vm {vmargin} x}
X ! { x @Sep ur {above} dr {below} sr { between } vm {vmargin} y}
X !! { x @Sep ur {above} dr {below} sr { single } vm {vmargin} y}
X !!! { x @Sep ur {above} dr {below} sr { double } vm {vmargin} y}
X , { x @NSep y }
X @RightEdge ur { above } dr { below } sr { side } vm { vmargin }
X }
X
X def @DoRowe
X named A {} named B {} named C {} named D {} named E {}
X named F {} named G {} named H {} named I {} named J {}
X named K {} named L {} named M {} named N {} named O {}
X named P {} named Q {} named R {} named S {} named T {}
X named U {} named V {} named W {} named X {} named Y {}
X named Z {}
X named above { above }
X named below { below }
X named side { side }
X named vmargin { vmargin }
X {
X @LeftEdge ur { above } dr { below } sr { side } vm { vmargin }
X @Fmte
X A { A } B { B } C { C } D { D } E { E }
X F { F } G { G } H { H } I { I } J { J }
X K { K } L { L } M { M } N { N } O { O }
X P { P } Q { Q } R { R } S { S } T { T }
X U { U } V { V } W { W } X { X } Y { Y }
X Z { Z }
X @Col { @Wrap ur {above} dr {below} vm {vmargin} x}
X ! { x @Sep ur {above} dr {below} sr { between } vm {vmargin} y}
X !! { x @Sep ur {above} dr {below} sr { single } vm {vmargin} y}
X !!! { x @Sep ur {above} dr {below} sr { double } vm {vmargin} y}
X , { x @NSep y }
X @RightEdge ur { above } dr { below } sr { side } vm { vmargin }
X }
X
X def @DoRowf
X named A {} named B {} named C {} named D {} named E {}
X named F {} named G {} named H {} named I {} named J {}
X named K {} named L {} named M {} named N {} named O {}
X named P {} named Q {} named R {} named S {} named T {}
X named U {} named V {} named W {} named X {} named Y {}
X named Z {}
X named above { above }
X named below { below }
X named side { side }
X named vmargin { vmargin }
X {
X @LeftEdge ur { above } dr { below } sr { side } vm { vmargin }
X @Fmtf
X A { A } B { B } C { C } D { D } E { E }
X F { F } G { G } H { H } I { I } J { J }
X K { K } L { L } M { M } N { N } O { O }
X P { P } Q { Q } R { R } S { S } T { T }
X U { U } V { V } W { W } X { X } Y { Y }
X Z { Z }
X @Col { @Wrap ur {above} dr {below} vm {vmargin} x}
X ! { x @Sep ur {above} dr {below} sr { between } vm {vmargin} y}
X !! { x @Sep ur {above} dr {below} sr { single } vm {vmargin} y}
X !!! { x @Sep ur {above} dr {below} sr { double } vm {vmargin} y}
X , { x @NSep y }
X @RightEdge ur { above } dr { below } sr { side } vm { vmargin }
X }
X
X def @DoRowg
X named A {} named B {} named C {} named D {} named E {}
X named F {} named G {} named H {} named I {} named J {}
X named K {} named L {} named M {} named N {} named O {}
X named P {} named Q {} named R {} named S {} named T {}
X named U {} named V {} named W {} named X {} named Y {}
X named Z {}
X named above { above }
X named below { below }
X named side { side }
X named vmargin { vmargin }
X {
X @LeftEdge ur { above } dr { below } sr { side } vm { vmargin }
X @Fmtg
X A { A } B { B } C { C } D { D } E { E }
X F { F } G { G } H { H } I { I } J { J }
X K { K } L { L } M { M } N { N } O { O }
X P { P } Q { Q } R { R } S { S } T { T }
X U { U } V { V } W { W } X { X } Y { Y }
X Z { Z }
X @Col { @Wrap ur {above} dr {below} vm {vmargin} x}
X ! { x @Sep ur {above} dr {below} sr { between } vm {vmargin} y}
X !! { x @Sep ur {above} dr {below} sr { single } vm {vmargin} y}
X !!! { x @Sep ur {above} dr {below} sr { double } vm {vmargin} y}
X , { x @NSep y }
X @RightEdge ur { above } dr { below } sr { side } vm { vmargin }
X }
X
X def @DoRowh
X named A {} named B {} named C {} named D {} named E {}
X named F {} named G {} named H {} named I {} named J {}
X named K {} named L {} named M {} named N {} named O {}
X named P {} named Q {} named R {} named S {} named T {}
X named U {} named V {} named W {} named X {} named Y {}
X named Z {}
X named above { above }
X named below { below }
X named side { side }
X named vmargin { vmargin }
X {
X @LeftEdge ur { above } dr { below } sr { side } vm { vmargin }
X @Fmth
X A { A } B { B } C { C } D { D } E { E }
X F { F } G { G } H { H } I { I } J { J }
X K { K } L { L } M { M } N { N } O { O }
X P { P } Q { Q } R { R } S { S } T { T }
X U { U } V { V } W { W } X { X } Y { Y }
X Z { Z }
X @Col { @Wrap ur {above} dr {below} vm {vmargin} x}
X ! { x @Sep ur {above} dr {below} sr { between } vm {vmargin} y}
X !! { x @Sep ur {above} dr {below} sr { single } vm {vmargin} y}
X !!! { x @Sep ur {above} dr {below} sr { double } vm {vmargin} y}
X , { x @NSep y }
X @RightEdge ur { above } dr { below } sr { side } vm { vmargin }
X }
X
X def @DoRowi
X named A {} named B {} named C {} named D {} named E {}
X named F {} named G {} named H {} named I {} named J {}
X named K {} named L {} named M {} named N {} named O {}
X named P {} named Q {} named R {} named S {} named T {}
X named U {} named V {} named W {} named X {} named Y {}
X named Z {}
X named above { above }
X named below { below }
X named side { side }
X named vmargin { vmargin }
X {
X @LeftEdge ur { above } dr { below } sr { side } vm { vmargin }
X @Fmti
X A { A } B { B } C { C } D { D } E { E }
X F { F } G { G } H { H } I { I } J { J }
X K { K } L { L } M { M } N { N } O { O }
X P { P } Q { Q } R { R } S { S } T { T }
X U { U } V { V } W { W } X { X } Y { Y }
X Z { Z }
X @Col { @Wrap ur {above} dr {below} vm {vmargin} x}
X ! { x @Sep ur {above} dr {below} sr { between } vm {vmargin} y}
X !! { x @Sep ur {above} dr {below} sr { single } vm {vmargin} y}
X !!! { x @Sep ur {above} dr {below} sr { double } vm {vmargin} y}
X , { x @NSep y }
X @RightEdge ur { above } dr { below } sr { side } vm { vmargin }
X }
X
X def @DoRowj
X named A {} named B {} named C {} named D {} named E {}
X named F {} named G {} named H {} named I {} named J {}
X named K {} named L {} named M {} named N {} named O {}
X named P {} named Q {} named R {} named S {} named T {}
X named U {} named V {} named W {} named X {} named Y {}
X named Z {}
X named above { above }
X named below { below }
X named side { side }
X named vmargin { vmargin }
X {
X @LeftEdge ur { above } dr { below } sr { side } vm { vmargin }
X @Fmtj
X A { A } B { B } C { C } D { D } E { E }
X F { F } G { G } H { H } I { I } J { J }
X K { K } L { L } M { M } N { N } O { O }
X P { P } Q { Q } R { R } S { S } T { T }
X U { U } V { V } W { W } X { X } Y { Y }
X Z { Z }
X @Col { @Wrap ur {above} dr {below} vm {vmargin} x}
X ! { x @Sep ur {above} dr {below} sr { between } vm {vmargin} y}
X !! { x @Sep ur {above} dr {below} sr { single } vm {vmargin} y}
X !!! { x @Sep ur {above} dr {below} sr { double } vm {vmargin} y}
X , { x @NSep y }
X @RightEdge ur { above } dr { below } sr { side } vm { vmargin }
X }
X
X macro @Rowa { / @DoRowa }
X macro @Rowb { / @DoRowb }
X macro @Rowc { / @DoRowc }
X macro @Rowd { / @DoRowd }
X macro @Rowe { / @DoRowe }
X macro @Rowf { / @DoRowf }
X macro @Rowg { / @DoRowg }
X macro @Rowh { / @DoRowh }
X macro @Rowi { / @DoRowi }
X macro @Rowj { / @DoRowj }
X
X macro @MarkRowa { ^/ @DoRowa }
X macro @MarkRowb { ^/ @DoRowb }
X macro @MarkRowc { ^/ @DoRowc }
X macro @MarkRowd { ^/ @DoRowd }
X macro @MarkRowe { ^/ @DoRowe }
X macro @MarkRowf { ^/ @DoRowf }
X macro @MarkRowg { ^/ @DoRowg }
X macro @MarkRowh { ^/ @DoRowh }
X macro @MarkRowi { ^/ @DoRowi }
X macro @MarkRowj { ^/ @DoRowj }
X
X
X @Body
X
X@End @Tab
END_OF_FILE
if test 25208 -ne `wc -c <'lout/include/tab'`; then
echo shar: \"'lout/include/tab'\" unpacked with wrong size!
fi
# end of 'lout/include/tab'
fi
echo shar: End of archive 5 \(of 30\).
cp /dev/null ark5isdone

Jeff Kingston

unread,
Jun 1, 1993, 1:17:13 AM6/1/93
to
Submitted-by: je...@joyce.cs.su.oz.au (Jeff Kingston)
Posting-number: Volume 37, Issue 104
Archive-name: lout/part06
Environment: UNIX

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: lout/doc/tr.eq/outfile.ps.B lout/doc/tr.over/s2 lout/z22.c
# Wrapped by kent@sparky on Sun May 30 19:43:54 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 6 (of 30)."'
if test -f 'lout/doc/tr.eq/outfile.ps.B' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.eq/outfile.ps.B'\"
else
echo shar: Extracting \"'lout/doc/tr.eq/outfile.ps.B'\" \(49055 characters\)
sed "s/^X//" >'lout/doc/tr.eq/outfile.ps.B' <<'END_OF_FILE'
X/Symbol 240 fnt
X3708 12411 moveto(\075)s
X
X/Times-Italic 240 fnt
X3931 12569 moveto(df)s gsave
X3911 12471 translate
X226 0 0 0 240 288 0 loutgr
Xgsave
X0 0 moveto xsize 0 lineto 0.05 ft setlinewidth stroke
Xgrestore
X
Xgrestore
X
X/Times-Italic 240 fnt
X3911 12260 moveto(dy)s
X/Symbol 240 fnt
X4194 12411 moveto(\327)s
X/Times-Italic 240 fnt
X4311 12569 moveto(dy)s gsave
X4311 12471 translate
X226 0 0 0 240 288 0 loutgr
Xgsave
X0 0 moveto xsize 0 lineto 0.05 ft setlinewidth stroke
Xgrestore
X
Xgrestore
X
X/Times-Italic 240 fnt
X4311 12260 moveto(dx)s
X3330 11927 moveto(dfg)s gsave
X3330 11829 translate
X306 0 0 0 240 288 0 loutgr
Xgsave
X0 0 moveto xsize 0 lineto 0.05 ft setlinewidth stroke
Xgrestore
X
Xgrestore
X
X/Times-Italic 240 fnt
X3370 11618 moveto(dy)s
X/Symbol 240 fnt
X3708 11769 moveto(\075)s
X/Times-Italic 240 fnt
X3911 11776 moveto(f)s 4020 11927 moveto(dg)s
Xgsave
X4020 11829 translate
X240 0 0 0 240 288 0 loutgr
Xgsave
X0 0 moveto xsize 0 lineto 0.05 ft setlinewidth stroke
Xgrestore
X
Xgrestore
X
X/Times-Italic 240 fnt
X4027 11618 moveto(dx)s
X/Symbol 240 fnt
X4317 11769 moveto(+)s
X/Times-Italic 240 fnt
X4505 11776 moveto(g)s 4645 11927 moveto(df)s gsave
X4625 11829 translate
X226 0 0 0 240 288 0 loutgr
Xgsave
X0 0 moveto xsize 0 lineto 0.05 ft setlinewidth stroke
Xgrestore
X
Xgrestore
X
X/Times-Italic 240 fnt
X4625 11618 moveto(dx)s
X
X/Times-Roman 240 fnt
X1417 11118 moveto(As)s 1749 x(this)s 2160 x(last)s 2557 x(example)s 3433 x(shows,)s
X4158 x(it)s 4356 x(is)s
X/Helvetica 220 fnt
X4581 11114 moveto(nextcol)s
X/Times-Roman 240 fnt
X5342 11118 moveto(and)s 5754 x(the)s
X6112 x(various)s
X/Helvetica 220 fnt
X6882 11114 moveto(above)s
X/Times-Roman 240 fnt
X7546 11118 moveto(symbols)s 8410 x(that)s 8834 x(lay)s
X9192 x(out)s 9564 x(the)s 9922 x(array;)s
X/Helvetica 220 fnt
X1417 10826 moveto(matrix)s
X/Times-Roman 240 fnt
X2096 10830 moveto(attaches)s
X2947 x(the)s
X/Helvetica 220 fnt
X3321 10826 moveto(atleft)s
X/Times-Roman 240 fnt
X3878 10830 moveto(and)s
X/Helvetica 220 fnt
X4306 10826 moveto(atright)s
X/Times-Roman 240 fnt
X4997 10830 moveto(options)s
X5784 x(and)s 6212 x(makes)s 6905 x(sure)s 7385 x(the)s 7759 x(result)s
X8371 x(appears)s 9183 x(in)s 9451 x(the)s 9825 x(correct)s 1417 10542 moveto(vertical)s
X2185 x(position)s 3009 x(relative)s 3777 x(to)s 4016 x(the)s 4361 x(rest)s
X4758 x(of)s 5010 x(the)s 5355 x(equation.)s 6352 x(So)s 6658 x(the)s
X7003 x(right)s 7507 x(parameter)s 8514 x(of)s
X/Helvetica 220 fnt
X8766 10538 moveto(matrix)s
X/Times-Roman 240 fnt
X9416 10542 moveto(may)s
X9881 x(be)s 10160 x(any)s 1417 10254 moveto(object.)s 1897 9880 moveto(Each)s 2452 x(of)s
X2728 x(the)s 3097 x(Eq)s 3440 x(symbols)s 4315 x(that)s 4750 x(takes)s
X5318 x(parameters)s 6442 x(also)s 6904 x(has)s 7300 x(a)s
X/Helvetica 220 fnt
X7483 9876 moveto(gap)s
X
X/Times-Roman 240 fnt
X7926 9880 moveto(option,)s 8675 x(which)s 9337 x(controls)s 10184 x(the)s 1417 9592 moveto(amount)s
X2195 x(of)s 2454 x(space)s 3045 x(inserted)s 3861 x(by)s 4161 x(the)s
X4513 x(symbol:)s
X/Helvetica 220 fnt
X1897 9039 moveto(x over y)s
X/Times-Italic 240 fnt
X5866 9146 moveto(x)s gsave
X5866 9096 translate
X106 0 0 0 240 288 0 loutgr
Xgsave
X0 0 moveto xsize 0 lineto 0.05 ft setlinewidth stroke
Xgrestore
X
Xgrestore
X
X/Times-Italic 240 fnt
X5866 8942 moveto(y)s
X/Helvetica 220 fnt
X1897 8379 moveto(x over gap { 3p } y)s
X
X/Times-Italic 240 fnt
X5866 8498 moveto(x)s gsave
X5866 8436 translate
X106 0 0 0 240 288 0 loutgr
Xgsave
X0 0 moveto xsize 0 lineto 0.05 ft setlinewidth stroke
Xgrestore
X
Xgrestore
X
X/Times-Italic 240 fnt
X5866 8270 moveto(y)s
X/Times-Roman 240 fnt
X1417 7770 moveto(Eq)s 1743 x(usually)s 2494 x(gets)s
X2939 x(the)s 3291 x(spacing)s 4082 x(right)s 4593 x(without)s 5384 x(help.)s
X
X/Times-Bold 240 fnt
X1417 6977 moveto(3.)s 1717 x(Spacing)s
X/Times-Roman 240 fnt
X1897 6605 moveto(There)s 2514 x(is)s 2733 x(a)s
X2899 x(basic)s 3450 x(rule)s 3881 x(governing)s 4912 x(the)s 5264 x(use)s
X5643 x(of)s 5902 x(white)s 6493 x(space)s 7084 x(characters)s 8111 x(\(space,)s
X8841 x(tab,)s 9253 x(and)s 9659 x(newline\))s 1417 6317 moveto(in)s 1663 x(the)s
X2015 x(input)s 2567 x(to)s 2813 x(Lout:)s 3451 x(white)s 4042 x(space)s
X4633 x(between)s 5490 x(two)s 5909 x(objects)s 6646 x(affects)s 7341 x(the)s
X7693 x(result;)s 8349 x(white)s 8940 x(space)s 9531 x(between)s 10388 x(a)s
X1417 6029 moveto(symbol)s 2182 x(and)s 2588 x(its)s 2873 x(parameter)s 3887 x(does)s
X4386 x(not.)s 1897 5655 moveto(Although)s 2862 x(this)s 3267 x(rule)s 3698 x(is)s
X3917 x(just)s 4322 x(right)s 4833 x(most)s 5358 x(of)s 5617 x(the)s
X5969 x(time,)s 6513 x(it)s 6705 x(is)s 6924 x(not)s 7290 x(adequate)s
X8200 x(for)s 8538 x(equation)s 9422 x(formatting.)s 1417 5367 moveto(Getting)s 2239 x(the)s
X2636 x(horizontal)s 3710 x(spacing)s 4546 x(right)s 5102 x(in)s 5393 x(equations)s
X6415 x(is)s 6679 x(a)s 6890 x(very)s 7420 x(\256ddly)s 8084 x(business,)s
X9060 x(involving)s 10083 x(four)s 1417 5079 moveto(different)s 2310 x(sizes)s 2846 x(of)s
X3117 x(space)s 3720 x(\(zero,)s 4342 x(thin,)s 4846 x(medium,)s 5762 x(and)s
X6180 x(thick\),)s 6869 x(and)s 7287 x(different)s 8180 x(rules)s 8716 x(for)s
X9066 x(spacing)s 9869 x(within)s 1417 4791 moveto(superscripts)s 2626 x(and)s 3040 x(subscripts)s
X4064 x(to)s 4318 x(those)s 4891 x(applying)s 5797 x(outside,)s 6616 x(according)s
X7627 x(to)s 7881 x(a)s 8055 x(leading)s 8827 x(authority)s 9758 x([)s
X9837 x(6)s 9957 x(].)s 10224 x(Eq)s 1417 4503 moveto(therefore)s 2344 x(takes)s
X2901 x(the)s 3259 x(spacing)s 4056 x(decisions)s 5012 x(upon)s 5558 x(itself,)s
X6160 x(and)s 6572 x(con)s 6918 x(sequently)s 7901 x(chooses)s 8725 x(to)s
X8977 x(ignore)s 9654 x(all)s 9958 x(white)s 1417 4215 moveto(space)s 2008 x(in)s
X2254 x(its)s 2539 x(input,)s 3151 x(even)s 3663 x(between)s 4520 x(two)s
X4939 x(objects.)s
X/Times-Roman 153 fnt
X5676 4320 moveto(1)s
X/Times-Roman 240 fnt
X1897 3841 moveto(Every)s 2516 x(symbol)s 3269 x(provided)s
X4168 x(by)s 4456 x(Eq)s 4770 x(has)s 5137 x(a)s
X/Times-Italic 240 fnt
X5291 x(full)s
X5657 x(name)s
X/Times-Roman 240 fnt
X6176 x(,)s 6284 x(which)s 6917 x(denotes)s 7696 x(the)s
X8036 x(symbol)s 8789 x(without)s 9568 x(any)s 9962 x(space)s 1417 3553 moveto(attached.)s
X2389 x(Many)s 3004 x(symbols)s 3858 x(also)s 4299 x(have)s 4807 x(a)s
X
X/Times-Italic 240 fnt
X4969 x(short)s 5517 x(name)s
X/Times-Roman 240 fnt
X6036 x(,)s 6152 x(which)s 6793 x(denotes)s
X7580 x(the)s 7928 x(same)s 8475 x(symbol)s 9236 x(with)s 9717 x(what)s
X10238 x(Eq)s 1417 3265 moveto(considers)s 2388 x(to)s 2642 x(be)s 2936 x(an)s
X3230 x(appropriate)s 4386 x(amount)s 5172 x(of)s 5439 x(space)s 6038 x(for)s
X6384 x(that)s 6810 x(symbol)s 7583 x(attached)s 8447 x(to)s 8701 x(it.)s
X9021 x(For)s 9421 x(example,)s
X/Symbol 240 fnt
X10359 3258 moveto(\243)s
X/Times-Roman 240 fnt
X1417 2977 moveto(has)s 1796 x(full)s
X2187 x(name)s
X/Helvetica 220 fnt
X2765 2973 moveto(lessequal)s
X/Times-Roman 240 fnt
X3751 2977 moveto(and)s 4157 x(short)s 4695 x(name)s
X
X/Helvetica 220 fnt
X5273 2973 moveto(<=)s
X/Times-Roman 240 fnt
X5529 2977 moveto(:)s gsave
X1417 2442 translate


X680 0 0 0 240 288 60 loutgr
Xgsave

X0 0 moveto xsize 0 lineto stroke
Xgrestore
X
Xgrestore
X
X/Times-Roman 153 fnt
X1417 2226 moveto(1)s
X/Times-Roman 192 fnt
X1493 2148 moveto(This)s 1876 x(effect)s
X2353 x(is)s 2523 x(produced)s 3279 x(by)s 3514 x(enclosing)s 4291 x(the)s
X4568 x(entire)s 5046 x(equation)s 5749 x(in)s
X/Helvetica 172 fnt
X5941 2146 moveto(0c @Space)s
X/Times-Roman 192 fnt
X6828 2148 moveto(.)s
X6967 x(The)s 7308 x(simplest)s 7988 x(way)s 8350 x(to)s 8542 x(restore)s
X9104 x(the)s 9381 x(effect)s 1417 1918 moveto(of)s 1628 x(white)s 2105 x(space)s
X2582 x(to)s 2783 x(part)s 3132 x(of)s 3343 x(an)s 3576 x(equation)s
X4288 x(is)s 4467 x(to)s 4668 x(enclose)s 5294 x(that)s 5633 x(part)s
X5982 x(in)s 6183 x(a)s
X/Helvetica 172 fnt
X6320 1916 moveto(@Font)s
X/Times-Roman 192 fnt
X6888 1918 moveto(symbol.)s 7600 x(Eq)s
X7865 x(also)s 8225 x(changes)s 8894 x(the)s 9180 x(value)s 9647 x(of)s
X1417 1688 moveto(the)s
X/Helvetica 172 fnt
X1706 1686 moveto(v)s
X/Times-Roman 192 fnt
X1847 1688 moveto(unit,)s 2248 x(so)s 2473 x(if)s
X2644 x(a)s 2784 x(paragraph)s 3604 x(of)s 3818 x(\256lled)s 4266 x(text)s
X4608 x(is)s 4790 x(desired)s 5397 x(within)s 5941 x(an)s 6177 x(equation,)s
X6940 x(it)s 7101 x(may)s 7486 x(be)s 7722 x(necessary)s 8520 x(to)s
X8724 x(enclose)s 9353 x(it)s 9514 x(in)s 9718 x(a)s
X/Helvetica 172 fnt
X1417 1456 moveto(@Break)s
X
X/Times-Roman 192 fnt
X2086 1458 moveto(symbol.)s
Xpgsave restore
Xshowpage
X
X%%Page: ? 6


X%%BeginPageSetup
X0.0500 dup scale 10 setlinewidth
X/pgsave save def
X%%EndPageSetup
X
X/Times-Roman 240 fnt

X5754 15258 moveto(-)s 5893 x(5)s 6073 x(-)s
X/Helvetica 220 fnt
X1897 14662 moveto(a lessequal b)s
X/Times-Italic 240 fnt
X5866 14666 moveto(a)s
X
X/Symbol 240 fnt
X5986 14659 moveto(\243)s
X/Times-Italic 240 fnt
X6117 14666 moveto(b)s
X/Helvetica 220 fnt
X1897 14159 moveto(a <= b)s
X/Times-Italic 240 fnt
X5866 14163 moveto(a)s
X/Symbol 240 fnt
X6058 14156 moveto(\243)s
X
X/Times-Italic 240 fnt
X6261 14163 moveto(b)s
X/Times-Roman 240 fnt
X1417 13704 moveto(Eq)s 1745 x(puts)s 2206 x(a)s 2374 x(thick)s
X2914 x(space)s 3507 x(around)s 4234 x(relation)s 5025 x(symbols)s 5885 x(like)s
X
X/Helvetica 220 fnt
X6305 13700 moveto(<=)s
X/Times-Roman 240 fnt
X6561 13704 moveto(,)s 6683 x(a)s 6851 x(medium)s 7697 x(space)s
X8290 x(around)s 9017 x(binary)s 9690 x(operator)s 1417 13416 moveto(symbols)s 2272 x(like)s
X
X/Helvetica 220 fnt
X2687 13412 moveto(+)s
X/Times-Roman 240 fnt
X2815 13416 moveto(,)s 2932 x(and)s 3335 x(a)s 3498 x(thin)s
X3927 x(space)s 4515 x(after)s 5008 x(punctuation)s 6195 x(symbols)s 7050 x(\()s
X
X/Helvetica 220 fnt
X7129 13412 moveto(;)s
X/Times-Roman 240 fnt
X7247 13416 moveto(and)s
X/Helvetica 220 fnt
X7650 13412 moveto(,)s
X/Times-Roman 240 fnt
X7711 13416 moveto(\);)s 7913 x(except)s
X8594 x(that)s 9009 x(in)s 9252 x(places)s 9906 x(where)s 1417 13128 moveto(the)s
X1786 x(symbols)s 2661 x(appear)s 3375 x(in)s 3638 x(a)s 3821 x(smaller)s
X4600 x(size)s 5048 x(\(superscripts,)s 6405 x(subscripts,)s 7498 x(etc.\),)s 8052 x(these)s
X8620 x(spaces)s 9321 x(are)s 9689 x(omitted.)s 1417 12840 moveto(No)s 1770 x(other)s
X2321 x(horizontal)s 3350 x(space)s 3941 x(is)s 4160 x(ever)s 4631 x(inserted.)s
X1897 12466 moveto(The)s 2325 x(short)s 2859 x(names)s 3526 x(have)s 4034 x(been)s
X4542 x(carefully)s 5446 x(designed)s 6353 x(to)s 6595 x(produce)s 7422 x(good-looking)s
X8769 x(mathematics)s 10032 x(most)s 1417 12178 moveto(of)s 1689 x(the)s 2054 x(time.)s
X2671 x(It)s 2889 x(is)s 3121 x(best)s 3579 x(to)s 3838 x(rely)s
X4282 x(on)s 4595 x(them)s 5146 x(in)s 5405 x(the)s 5770 x(\256rst)s
X6214 x(instance)s 7070 x(and)s 7489 x(only)s 7988 x(think)s 8553 x(about)s
X9158 x(spacing)s 9962 x(when)s 1417 11890 moveto(the)s 1769 x(result)s 2359 x(is)s
X2578 x(not)s 2944 x(pleasing.)s 3921 x(In)s 4180 x(that)s 4598 x(case,)s
X5129 x(Eq's)s 5627 x(space)s 6218 x(can)s 6610 x(be)s 6896 x(removed)s
X7793 x(by)s 8093 x(using)s 8672 x(the)s 9024 x(full)s 9415 x(names,)s
X10146 x(and)s 1417 11602 moveto(thin,)s 1909 x(medium)s 2753 x(and)s 3159 x(thick)s
X3697 x(space)s 4288 x(can)s 4680 x(be)s 4966 x(added)s 5598 x(using)s
X6177 x(the)s 6529 x(following)s 7519 x(symbols:)s
X/Helvetica 220 fnt
X1897 11061 moveto(`)s 2381 x(0.18f)s
X
X/Times-Roman 240 fnt
X2989 11065 moveto(\()s
X/Helvetica 220 fnt
X3068 11061 moveto(0.018f)s
X/Times-Roman 240 fnt
X3738 11065 moveto(in)s 3984 x(subscripts,)s 5060 x(etc.\))s
X
X/Helvetica 220 fnt
X1897 10773 moveto(``)s 2381 x(0.24f)s
X/Times-Roman 240 fnt
X2989 10777 moveto(\()s
X/Helvetica 220 fnt
X3068 10773 moveto(0.024f)s
X/Times-Roman 240 fnt
X3738 10777 moveto(in)s
X3984 x(subscripts,)s 5060 x(etc.\))s
X/Helvetica 220 fnt
X1897 10485 moveto(```)s 2381 x(0.30f)s
X/Times-Roman 240 fnt
X2989 10489 moveto(\()s
X
X/Helvetica 220 fnt
X3068 10485 moveto(0.030f)s
X/Times-Roman 240 fnt
X3738 10489 moveto(in)s 3984 x(subscripts,)s 5060 x(etc.\))s 1417 9948 moveto(where)s
X
X/Helvetica 220 fnt
X2083 9944 moveto(1f)s
X/Times-Roman 240 fnt
X2348 9948 moveto(is)s 2589 x(the)s 2963 x(current)s 3721 x(font)s
X4188 x(size.)s 4761 x(These)s 5414 x(symbols)s 6294 x(have)s 6828 x(low)s
X7269 x(precedence.)s 8546 x(The)s
X/Helvetica 220 fnt
X9000 9944 moveto(&)s
X/Times-Roman 240 fnt
X9228 9948 moveto(symbol)s 10015 x(from)s
X1417 9660 moveto(standard)s 2307 x(Lout)s 2839 x(is)s 3078 x(also)s 3543 x(available;)s
X4551 x(the)s
X/Helvetica 220 fnt
X4923 9656 moveto(s)s
X/Times-Roman 240 fnt
X5113 9660 moveto(unit)s 5565 x(has)s 5964 x(value)s
X6562 x(0)s 6762 x(and)s 7188 x(so)s 7481 x(is)s 7720 x(not)s
X8106 x(very)s 8611 x(useful,)s 9335 x(but)s 9721 x(one)s 10147 x(can)s
X1417 9372 moveto(write)s
X/Helvetica 220 fnt
X1973 9368 moveto(&2m)s
X/Times-Roman 240 fnt
X2490 9372 moveto(for)s 2834 x(example)s 3710 x(for)s
X4054 x(a)s 4226 x(two)s 4651 x(em)s 5009 x(space.)s 5726 x(Since)s
X6323 x(the)s 6681 x(full)s 7078 x(names)s 7755 x(are)s 8112 x(tedious)s
X8869 x(to)s 9121 x(remember,)s 10215 x(Eq)s 1417 9084 moveto(provides)s 2288 x(a)s
X2441 x(symbol)s
X/Helvetica 220 fnt
X3193 9080 moveto(non)s
X/Times-Roman 240 fnt
X3606 9084 moveto(which)s 4238 x(removes)s 5095 x(spaces)s
X5766 x(from)s 6277 x(its)s 6549 x(right)s 7047 x(parameter;)s 8114 x(thus)s
X
X/Helvetica 220 fnt
X8560 9080 moveto(non <=)s
X/Times-Roman 240 fnt
X9290 9084 moveto(is)s 9496 x(equivalent)s 1417 8796 moveto(to)s
X/Helvetica 220 fnt
X1657 8792 moveto(lessequal)s
X
X/Times-Roman 240 fnt
X2583 8796 moveto(,)s 2697 x(for)s 3029 x(example.)s 4013 x(There)s 4624 x(are)s
X4969 x(also)s 5408 x(symbols)s
X/Helvetica 220 fnt
X6260 8792 moveto(rel)s
X/Times-Roman 240 fnt
X6503 8796 moveto(,)s
X/Helvetica 220 fnt
X6617 8792 moveto(bin)s
X
X/Times-Roman 240 fnt
X6909 8796 moveto(,)s 7023 x(and)s
X/Helvetica 220 fnt
X7423 8792 moveto(punct)s
X/Times-Roman 240 fnt
X8014 8796 moveto(for)s 8346 x(telling)s
X9010 x(Eq)s 9330 x(to)s 9570 x(add)s 9970 x(space)s 1417 8508 moveto(to)s
X1688 x(the)s 2065 x(following)s 3080 x(symbol)s 3870 x(as)s 4154 x(though)s
X4905 x(it)s 5122 x(was)s 5579 x(a)s 5770 x(relation)s 6584 x(symbol,)s
X7434 x(binary)s 8130 x(operator,)s 9071 x(or)s 9355 x(punctuation)s 1417 8220 moveto(symbol.)s
X
X/Times-Bold 240 fnt
X1417 7427 moveto(4.)s 1717 x(Features)s 2666 x(from)s 3230 x(Standard)s 4247 x(Lout)s
X
X/Times-Roman 240 fnt
X1897 7055 moveto(In)s 2149 x(this)s 2547 x(section)s 3277 x(we)s 3609 x(summarize)s
X4710 x(those)s 5268 x(features)s 6076 x(of)s 6328 x(standard)s 7191 x(Lout)s
X7696 x(of)s 7948 x(most)s 8466 x(relevance)s 9434 x(to)s 9673 x(equation)s
X1417 6767 moveto(formatting.)s 2627 x(All)s 3014 x(are)s 3387 x(freely)s 4025 x(available)s
X4969 x(within)s 5662 x(equations.)s 6781 x(Full)s 7248 x(details)s 7953 x(may)s
X8447 x(be)s 8755 x(found)s 9396 x(in)s 9664 x(the)s 10038 x(Lout)s
X1417 6479 moveto(reference)s 2364 x(manual)s 3128 x([)s 3207 x(4)s 3327 x(].)s
X1897 6105 moveto(Standard)s 2808 x(Lout)s 3321 x(uses)s 3794 x(the)s 4147 x(symbols)s
X
X/Helvetica 220 fnt
X5006 6101 moveto(#)s
X/Times-Roman 240 fnt
X5128 6105 moveto(,)s
X/Helvetica 220 fnt
X5249 6101 moveto({)s
X/Times-Roman 240 fnt
X5322 6105 moveto(,)s
X/Helvetica 220 fnt
X5443 6101 moveto(})s
X
X/Times-Roman 240 fnt
X5516 6105 moveto(,)s
X/Helvetica 220 fnt
X5637 6101 moveto(&)s
X/Times-Roman 240 fnt
X5783 6105 moveto(,)s
X/Helvetica 220 fnt
X5904 6101 moveto(|)s
X/Times-Roman 240 fnt
X5961 6105 moveto(,)s
X6082 x(and)s
X/Helvetica 220 fnt
X6489 6101 moveto(/)s
X/Times-Roman 240 fnt
X6611 6105 moveto(for)s 6950 x(special)s 7674 x(purposes)s
X8586 x(\(the)s 9018 x(braces)s 9689 x(are)s 10041 x(used)s 1417 5817 moveto(for)s
X1738 x(grouping,)s 2706 x(for)s 3027 x(example\).)s 4079 x(To)s 4388 x(get)s
X4723 x(these)s 5257 x(characters)s 6267 x(into)s 6682 x(equations)s 7642 x(without)s
X8416 x(using)s 8978 x(their)s 9458 x(full)s 9832 x(names,)s 1417 5529 moveto(enclose)s
X2186 x(them)s 2716 x(in)s 2954 x(double)s 3658 x(quotes:)s
X/Helvetica 220 fnt
X4401 5525 moveto("{")s
X
X/Times-Roman 240 fnt
X4630 5529 moveto(,)s
X/Helvetica 220 fnt
X4742 5525 moveto("}")s
X/Times-Roman 240 fnt
X4971 5529 moveto(,)s 5083 x(etc.)s 5533 x(Any)s
X5998 x(sequence)s 6927 x(of)s 7178 x(characters)s 8197 x(including)s 9153 x(spaces)s
X9829 x(but)s 10187 x(not)s 1417 5241 moveto(newlines)s 2327 x(may)s 2799 x(be)s
X3085 x(so)s 3358 x(enclosed,)s 4315 x(and)s 4721 x(the)s 5073 x(effect)s
X5675 x(is)s 5894 x(to)s 6140 x(turn)s 6585 x(off)s 6923 x(any)s
X7329 x(special)s 8052 x(meaning)s 8936 x(that)s 9354 x(the)s 9706 x(symbols)s
X1417 4953 moveto(within)s 2088 x(it)s 2280 x(might)s 2898 x(have.)s 1897 4579 moveto(Eq)s
X2250 x(sets)s 2695 x(letters)s 3364 x(in)s 3637 x(Slope)s 4269 x(\(Lout's)s
X5059 x(name)s 5664 x(for)s 6029 x(Italic\),)s 6744 x(digits)s 7362 x(in)s
X7635 x(Base)s 8187 x(\(i.e.)s 8645 x(Roman\),)s 9563 x(and)s 9996 x(other)s
X1417 4291 moveto(symbols)s 2275 x(in)s 2521 x(various)s 3285 x(fonts,)s 3883 x(mostly)s
X4594 x(the)s 4946 x(Symbol)s 5751 x(font.)s 6316 x(To)s 6642 x(change)s
X7380 x(fonts,)s 7978 x(use)s 8357 x(the)s
X/Helvetica 220 fnt
X8709 4287 moveto(@Font)s
X/Times-Roman 240 fnt
X9431 4291 moveto(symbol:)s
X
X/Helvetica 220 fnt
X1897 3784 moveto(Slope @Font "2")s
X/Times-Italic 240 fnt
X5866 3788 moveto(2)s
X/Times-Roman 240 fnt
X1417 3286 moveto(In)s 1696 x(Eq)s 2042 x(it)s
X2254 x(will)s 2705 x(often)s 3276 x(be)s 3582 x(necessary)s 4591 x(to)s
X4857 x(enclose)s 5654 x(the)s 6026 x(right)s 6557 x(parameter)s 7591 x(in)s
X7857 x(double)s 8589 x(quotes,)s 9354 x(because)s 10191 x(the)s 1417 2998 moveto(symbol)s
X2212 x(2)s 2422 x(includes)s 3309 x(a)s 3505 x(built-in)s 4298 x(change)s
X5066 x(back)s 5608 x(to)s 5884 x(Base)s 6439 x(font.)s 7034 x(Changing)s
X8056 x(fonts)s 8624 x(makes)s 9325 x(white)s 9946 x(space)s 1417 2710 moveto(between)s
X2275 x(objects)s 3013 x(in)s 3260 x(the)s 3613 x(right)s 4125 x(parameter)s
X5140 x(appear)s 5838 x(in)s 6085 x(the)s 6438 x(result.)s 7149 x(The)s
X
X/Helvetica 220 fnt
X7582 2706 moveto(@Font)s
X/Times-Roman 240 fnt
X8305 2710 moveto(operator)s 9162 x(also)s 9608 x(does)s 10108 x(size)s
X1417 2422 moveto(changes:)s
X/Helvetica 220 fnt
X1897 1905 moveto(sum)s
X/Symbol 240 fnt
X5866 1902 moveto(\345)s
Xpgsave restore
Xshowpage
X
X%%Page: ? 7


X%%BeginPageSetup
X0.0500 dup scale 10 setlinewidth
X/pgsave save def
X%%EndPageSetup
X
X/Times-Roman 240 fnt

X5754 15260 moveto(-)s 5893 x(6)s 6073 x(-)s
X/Helvetica 220 fnt
X1897 14634 moveto("+2p" @Font sum)s
X/Symbol 280 fnt
X5866 14621 moveto(\345)s
X
X/Helvetica 220 fnt
X1897 14001 moveto(2.0f @Font sum)s
X/Symbol 480 fnt
X5866 13938 moveto(\345)s
X/Times-Roman 240 fnt
X1417 13437 moveto(Here)s
X/Helvetica 220 fnt
X1923 13433 moveto("+2p" @Font)s
X/Times-Roman 240 fnt
X3216 13437 moveto(sets)s
X3616 x(its)s 3883 x(right)s 4376 x(parameter)s 5372 x(in)s 5600 x(a)s
X5748 x(font)s 6175 x(two)s 6576 x(points)s 7203 x(larger)s 7801 x(than)s
X8255 x(it)s 8429 x(would)s 9070 x(otherwise)s 10041 x(have)s 1417 13149 moveto(been;)s
X
X/Helvetica 220 fnt
X1998 13145 moveto(2.0f @Font)s
X/Times-Roman 240 fnt
X3150 13149 moveto(sets)s 3571 x(its)s 3859 x(right)s 4373 x(parameter)s
X5390 x(in)s 5639 x(a)s 5808 x(font)s 6256 x(twice)s 6836 x(the)s
X7191 x(original)s 7997 x(size.)s 8551 x(Sizes)s 9118 x(should)s 9820 x(always)s
X1417 12861 moveto(be)s 1713 x(speci\256ed)s 2633 x(relative)s 3418 x(to)s 3674 x(the)s
X4036 x(enclosing)s 5023 x(size)s 5464 x(as)s 5733 x(we)s 6082 x(have)s
X6604 x(done)s 7140 x(here,)s 7681 x(since)s 8242 x(then)s 8724 x(they)s
X9206 x(don't)s 9781 x(need)s 10303 x(to)s 1417 12573 moveto(be)s 1700 x(changed)s
X2555 x(if)s 2757 x(a)s 2920 x(decision)s 3774 x(is)s 3990 x(made)s
X4565 x(to)s 4808 x(set)s 5130 x(the)s 5479 x(entire)s 6079 x(document)s
X7080 x(in)s 7323 x(a)s 7486 x(different)s 8364 x(size.)s 8912 x(It)s
X9114 x(is)s 9330 x(necessary)s 10316 x(to)s 1417 12285 moveto(enclose)s
X/Helvetica 220 fnt
X2187 12281 moveto(+2p)s
X
X/Times-Roman 240 fnt
X2612 12285 moveto(in)s 2851 x(double)s 3556 x(quotes)s 4234 x(within)s 4898 x(Eq,)s
X5277 x(because)s 6087 x(otherwise)s 7069 x(the)s
X/Helvetica 220 fnt
X7414 12281 moveto(+)s
X/Times-Roman 240 fnt
X7595 12285 moveto(will)s
X8019 x(be)s 8298 x(taken)s 8869 x(as)s 9121 x(the)s 9466 x(Eq)s
X9785 x(symbol)s 1417 11997 moveto(for)s
X/Symbol 240 fnt
X1812 11990 moveto(+)s
X/Times-Roman 240 fnt
X2000 11997 moveto(.)s 2180 x(The)s
X2612 x(right)s 3123 x(parameter)s 4137 x(may)s 4609 x(be)s 4895 x(any)s
X5301 x(object.)s 1897 11623 moveto(Whenever)s 2956 x(similar)s 3694 x(equations)s 4687 x(or)s
X4962 x(parts)s 5502 x(of)s 5777 x(equations)s 6770 x(are)s 7137 x(being)s
X7745 x(typed)s 8353 x(repeatedly,)s
X/Times-Italic 240 fnt
X9484 x(de\256nitions)s
X/Times-Roman 240 fnt
X1417 11335 moveto(should)s 2116 x(be)s
X2402 x(used)s 2901 x(to)s 3147 x(save)s 3632 x(time.)s 4236 x(Suppose)s
X5108 x(for)s 5446 x(example)s 6316 x(that)s
X/Times-Italic 240 fnt
X6734 x(p)s
X/Times-Italic 168 fnt
X6854 11249 moveto(i)s
X
X/Times-Roman 240 fnt
X6943 11335 moveto(log)s
X/Symbol 168 fnt
X7249 11241 moveto(\062)s
X/Times-Italic 240 fnt
X7376 11335 moveto(p)s
X/Times-Italic 168 fnt
X7496 11249 moveto(i)s
X/Times-Roman 240 fnt
X7602 11335 moveto(occurs)s
X8286 x(frequently.)s 9448 x(Then)s
X/Helvetica 220 fnt
X1897 10793 moveto(def epi { p sub i ` log sub 2 ` p sub i })s
X/Times-Roman 240 fnt
X1417 10294 moveto(makes)s 2088 x(the)s
X2440 x(symbol)s
X/Helvetica 220 fnt
X3205 10290 moveto(epi)s
X/Times-Roman 240 fnt
X3557 10294 moveto(stand)s 4122 x(for)s 4460 x(the)s
X4812 x(object)s 5456 x(between)s 6313 x(the)s 6665 x(braces:)s
X/Helvetica 220 fnt
X1897 9622 moveto(big sum from i=1 to n ` epi)s
X
X/Times-Italic 168 fnt
X5943 9880 moveto(n)s
X/Symbol 312 fnt
X5874 9601 moveto(\345)s
X/Times-Italic 168 fnt
X5866 9415 moveto(i)s
X/Symbol 168 fnt
X5920 9410 moveto(\075)s 6020 x(\061)s
X
X/Times-Italic 240 fnt
X6147 9626 moveto(p)s
X/Times-Italic 168 fnt
X6267 9540 moveto(i)s
X/Times-Roman 240 fnt
X6356 9626 moveto(log)s
X/Symbol 168 fnt
X6662 9532 moveto(\062)s
X/Times-Italic 240 fnt
X6789 9626 moveto(p)s
X
X/Times-Italic 168 fnt
X6909 9540 moveto(i)s
X/Times-Roman 240 fnt
X1417 8960 moveto(Symbols)s 2315 x(may)s 2787 x(be)s 3073 x(given)s
X3665 x(parameters:)s
X/Helvetica 220 fnt
X1897 8460 moveto(def ep)s 1897 8172 moveto( right x)s 1897 7884 moveto({ p sub x ` log sub 2 ` p sub x)s 1897 7596 moveto(})s
X
X/Times-Roman 240 fnt
X1417 7099 moveto(The)s 1849 x(parameter)s
X/Helvetica 220 fnt
X2863 7095 moveto(x)s
X/Times-Roman 240 fnt
X3033 7099 moveto(will)s 3464 x(be)s
X3750 x(replaced)s 4619 x(by)s 4919 x(the)s 5271 x(object)s 5915 x(just)s
X6320 x(to)s 6566 x(the)s 6918 x(right)s 7429 x(of)s
X/Helvetica 220 fnt
X7688 7095 moveto(ep)s
X
X/Times-Roman 240 fnt
X7932 7099 moveto(:)s
X/Helvetica 220 fnt
X1897 6599 moveto(big sum from j=1 to k ` ep i +)s 1897 6311 moveto(big sum from j=k+1 to n ep j)s
X/Times-Italic 168 fnt
X5948 6645 moveto(k)s
X/Symbol 312 fnt
X5874 6366 moveto(\345)s
X
X/Times-Italic 168 fnt
X5866 6180 moveto(j)s
X/Symbol 168 fnt
X5920 6175 moveto(\075)s 6020 x(\061)s
X/Times-Italic 240 fnt
X6147 6391 moveto(p)s
X/Times-Italic 168 fnt
X6267 6305 moveto(i)s
X
X/Times-Roman 240 fnt
X6356 6391 moveto(log)s
X/Symbol 168 fnt
X6662 6297 moveto(\062)s
X/Times-Italic 240 fnt
X6789 6391 moveto(p)s
X/Times-Italic 168 fnt
X6909 6305 moveto(i)s
X/Symbol 240 fnt
X7012 6384 moveto(+)s
X
X/Times-Italic 168 fnt
X7366 6645 moveto(n)s
X/Symbol 312 fnt
X7297 6366 moveto(\345)s
X/Times-Italic 168 fnt
X7200 6176 moveto(j)s
X/Symbol 168 fnt
X7254 6171 moveto(\075)s
X/Times-Italic 168 fnt
X7354 6176 moveto(k)s
X
X/Symbol 168 fnt
X7434 6171 moveto(+)s 7532 x(\061)s
X/Times-Italic 240 fnt
X7616 6391 moveto(p)s
X/Times-Italic 168 fnt
X7736 6305 moveto(j)s
X/Times-Roman 240 fnt
X7825 6391 moveto(log)s
X
X/Symbol 168 fnt
X8131 6297 moveto(\062)s
X/Times-Italic 240 fnt
X8258 6391 moveto(p)s
X/Times-Italic 168 fnt
X8378 6305 moveto(j)s
X/Times-Roman 240 fnt
X1417 5691 moveto(The)s 1849 x(precedence)s
X2984 x(of)s 3243 x(such)s 3742 x(symbols)s 4600 x(will)s 5031 x(be)s
X5317 x(100)s 5737 x(by)s 6037 x(default.)s 1897 5317 moveto(To)s 2237 x(make)s
X2829 x(the)s 3195 x(symbols)s 4067 x(of)s 4340 x(Eq)s 4680 x(available)s
X5616 x(within)s 6301 x(such)s 6814 x(de\256nitions,)s 7958 x(each)s 8470 x(must)s
X9009 x(be)s 9309 x(preceded)s 10246 x(by)s
X/Helvetica 220 fnt
X1417 5025 moveto(import @Eq)s
X/Times-Roman 240 fnt
X2578 5029 moveto(.)s
X2758 x(The)s 3190 x(best)s 3635 x(place)s 4199 x(to)s 4445 x(keep)s
X4957 x(them)s 5495 x(is)s 5714 x(in)s 5960 x(the)s 6312 x(setup)s
X6877 x(\256le,)s 7302 x(which)s 7947 x(might)s 8565 x(then)s 9037 x(look)s
X9523 x(like)s 9941 x(this:)s
X/Helvetica 220 fnt
X1897 4527 moveto(@SysInclude { ft })s 1897 4239 moveto(@SysInclude { dl })s 1897 3951 moveto(@SysInclude { eq })s
X1897 3663 moveto()s 1897 3375 moveto(import @Eq)s 1897 3087 moveto(def epi { p sub i ` log sub 2 ` p sub i })s 1897 2799 moveto()s 1897 2511 moveto(import @Eq)s
X1897 2223 moveto(def ep right x { p sub x ` log sub 2 ` p sub x })s 1897 1935 moveto()s 1897 1647 moveto(@Use { @DocumentLayout })s
Xpgsave restore
Xshowpage
X
X%%Page: ? 8


X%%BeginPageSetup
X0.0500 dup scale 10 setlinewidth
X/pgsave save def
X%%EndPageSetup
X
X/Times-Roman 240 fnt

X5754 15264 moveto(-)s 5893 x(7)s 6073 x(-)s 1417 14673 moveto(Use)s 1849 x(of)s
X
X/Helvetica 220 fnt
X2108 14669 moveto(epi)s
X/Times-Roman 240 fnt
X2460 14673 moveto(and)s
X/Helvetica 220 fnt
X2866 14669 moveto(ep)s
X/Times-Roman 240 fnt
X3170 14673 moveto(outside)s 3921 x(equations)s
X4898 x(will)s 5329 x(cause)s 5920 x(an)s 6206 x(error.)s 1897 14299 moveto(Equations)s
X2921 x(can)s 3320 x(appear)s 4024 x(within)s 4702 x(a)s 4875 x(paragraph)s
X5898 x(of)s 6164 x(text,)s 6649 x(or)s 6915 x(they)s 7394 x(can)s
X7793 x(be)s 8086 x(displayed.)s 9190 x(Eq's)s 9695 x(job)s 10068 x(is)s
X10294 x(to)s 1417 14011 moveto(produce)s 2258 x(a)s 2434 x(Lout)s 2956 x(object)s
X3610 x(containing)s 4690 x(the)s 5052 x(equation;)s 6012 x(it)s 6214 x(neither)s
X6947 x(knows)s 7643 x(nor)s 8032 x(cares)s 8592 x(where)s 9246 x(this)s
X9661 x(equation)s 1417 13723 moveto(goes.)s 2041 x(To)s 2372 x(get)s 2729 x(an)s
X3020 x(equation)s 3909 x(within)s 4585 x(a)s 4756 x(paragraph,)s 5837 x(simply)s
X6553 x(place)s
X/Helvetica 220 fnt
X7122 13719 moveto(@Eq { ... })s
X/Times-Roman 240 fnt
X8190 13723 moveto(at)s 8427 x(the)s 8784 x(desired)s
X9539 x(point.)s 10216 x(To)s 1417 13435 moveto(prevent)s 2213 x(it)s 2424 x(spreading)s
X3433 x(over)s 3937 x(two)s 4375 x(lines,)s 4965 x(use)s
X/Helvetica 220 fnt
X5363 13431 moveto(@OneCol @Eq { ... })s
X
X/Times-Roman 240 fnt
X7393 13435 moveto(.)s 7592 x(To)s 7937 x(display)s 8707 x(an)s 9012 x(equation,)s
X9975 x(use)s 10373 x(a)s 1417 13147 moveto(display)s 2190 x(symbol)s 2977 x(from)s
X3523 x(some)s 4110 x(other)s 4683 x(Lout)s 5217 x(package.)s 6203 x(For)s
X6617 x(example,)s 7569 x(the)s 7943 x(DocumentLayout)s 9700 x(package)s 1417 12859 moveto([)s
X1496 x(5)s 1616 x(])s 1762 x(has)s
X/Helvetica 220 fnt
X2148 12855 moveto(@IndentedDisplay)s
X/Times-Roman 240 fnt
X4010 12859 moveto(or)s
X
X/Helvetica 220 fnt
X4276 12855 moveto(@ID)s
X/Times-Roman 240 fnt
X4785 12859 moveto(for)s 5130 x(an)s 5423 x(indented)s 6314 x(display,)s
X7132 x(and)s
X/Helvetica 220 fnt
X7545 12855 moveto(@CentredDisplay)s
X/Times-Roman 240 fnt
X9333 12859 moveto(or)s
X/Helvetica 220 fnt
X9599 12855 moveto(@CD)s
X/Times-Roman 240 fnt
X10205 12859 moveto(for)s
X1417 12571 moveto(a)s 1583 x(centred)s 2346 x(display,)s 3157 x(so)s
X/Helvetica 220 fnt
X1897 12069 moveto(@CD @Eq { int supp pi on 0 sin ` x = 0 })s
X
X/Times-Roman 240 fnt
X1417 11571 moveto(produces)s gsave
X5453 11033 translate


X-180.0000 rotate
Xgsave
X0 -159 translate
X180.0000 rotate
X
X/Symbol 312 fnt
X0 -285 moveto(\362)s

Xgrestore
X
Xgrestore
X
X/Symbol 312 fnt

X5453 10907 moveto(\362)s
X/Symbol 168 fnt
X5538 11150 moveto(\160)s 5538 10832 moveto(\060)s
X
X/Times-Roman 240 fnt
X5630 10980 moveto(sin)s
X/Times-Italic 240 fnt
X5952 x(x)s
X/Symbol 240 fnt
X6130 10973 moveto(\075)s 6333 x(\060)s
X/Times-Roman 240 fnt
X1417 10380 moveto(DocumentLayout)s
X3197 x(also)s 3687 x(provides)s 4616 x(display)s 5412 x(symbols)s 6315 x(that)s
X6778 x(make)s 7401 x(it)s 7638 x(easy)s 8168 x(to)s 8459 x(produce)s
X9335 x(aligned)s 10144 x(and)s 1417 10092 moveto(numbered)s 2434 x(equations.)s
X/Times-Bold 240 fnt
X1417 9299 moveto(5.)s
X1717 x(Summary)s
X/Times-Roman 240 fnt
X1897 8927 moveto(This)s 2422 x(section)s 3199 x(is)s 3458 x(a)s
X3664 x(complete)s 4640 x(list)s 5031 x(of)s 5330 x(the)s 5722 x(symbols)s
X6620 x(provided)s 7571 x(by)s 7911 x(Eq.)s 8397 x(We)s 8829 x(divide)s
X9527 x(them)s 10105 x(into)s 1417 8639 moveto(auxiliary,)s 2431 x(parameterized,)s 3948 x(short)s
X4531 x(names)s 5247 x(\(further)s 6080 x(divided)s 6903 x(into)s 7380 x(relations,)s
X8367 x(binary)s 9083 x(operators,)s 10137 x(and)s 1417 8351 moveto(punctuation\),)s 2746 x(and)s
X3152 x(full)s 3543 x(names.)s 4334 x(The)s 4766 x(auxiliary)s 5675 x(symbols)s
X6533 x(are:)s
X/Helvetica 220 fnt
X1897 7810 moveto(`)s
X/Times-Roman 240 fnt
X2945 7814 moveto(Thin)s 3457 x(space)s
X/Helvetica 220 fnt
X1897 7522 moveto(``)s
X
X/Times-Roman 240 fnt
X2945 7526 moveto(Medium)s 3816 x(space)s
X/Helvetica 220 fnt
X1897 7234 moveto(```)s
X/Times-Roman 240 fnt
X2945 7238 moveto(Thick)s 3563 x(space)s
X
X/Helvetica 220 fnt
X1897 6946 moveto(bin x)s
X/Times-Roman 240 fnt
X2945 6950 moveto(Treat)s
X/Helvetica 220 fnt
X3508 6946 moveto(x)s
X/Times-Roman 240 fnt
X3678 6950 moveto(as)s 3937 x(a)s
X4103 x(binary)s 4774 x(operator)s
X/Helvetica 220 fnt
X1897 6658 moveto(rel x)s
X/Times-Roman 240 fnt
X2945 6662 moveto(Treat)s
X/Helvetica 220 fnt
X3508 6658 moveto(x)s
X
X/Times-Roman 240 fnt
X3678 6662 moveto(as)s 3937 x(a)s 4103 x(relation)s
X/Helvetica 220 fnt
X1897 6370 moveto(punct x)s
X/Times-Roman 240 fnt
X2945 6374 moveto(Treat)s
X
X/Helvetica 220 fnt
X3508 6370 moveto(x)s
X/Times-Roman 240 fnt
X3678 6374 moveto(as)s 3937 x(a)s 4103 x(punctuation)s 5293 x(symbol)s
X
X/Helvetica 220 fnt
X1897 6082 moveto(non x)s
X/Times-Roman 240 fnt
X2945 6086 moveto(Remove)s 3803 x(spaces)s 4487 x(normally)s 5410 x(put)s
X5776 x(into)s
X/Helvetica 220 fnt
X6208 6082 moveto(x)s 1897 5794 moveto(vctr x)s
X/Times-Roman 240 fnt
X2945 5798 moveto(Centre)s
X/Helvetica 220 fnt
X3642 5794 moveto(x)s
X
X/Times-Roman 240 fnt
X3812 5798 moveto(vertically)s
X/Helvetica 220 fnt
X1897 5506 moveto(big x)s
X/Times-Roman 240 fnt
X2945 5510 moveto(Make)s
X/Helvetica 220 fnt
X3550 5506 moveto(x)s
X/Times-Roman 240 fnt
X3720 5510 moveto(larger)s
X1417 4969 moveto(Here)s 1999 x(are)s 2408 x(all)s 2764 x(the)s 3174 x(parameterized)s
X4644 x(symbols,)s 5620 x(shown)s 6364 x(in)s 6668 x(groups)s 7438 x(of)s
X7755 x(equal)s 8391 x(precedence,)s 9644 x(with)s 10187 x(the)s 1417 4681 moveto(precedence)s
X2552 x(itself)s 3088 x(at)s 3320 x(right:)s
X/Helvetica 220 fnt
X1897 4176 moveto(matrix not)s
X/Times-Roman 240 fnt
X2920 4180 moveto(\(100\))s
X
X/Helvetica 220 fnt
X1897 3888 moveto(dot dotdot hat tilde vec dyad overbar underbar)s
X/Times-Roman 240 fnt
X6445 3892 moveto(\(62\))s
X/Helvetica 220 fnt
X1897 3600 moveto(sup sub supp)s
X/Times-Roman 240 fnt
X3263 3604 moveto(\(60\))s 3841 x(on)s
X4141 x(\(61\))s
X/Helvetica 220 fnt
X1897 3312 moveto(from to widefrom wideto)s
X/Times-Roman 240 fnt
X4284 3316 moveto(\(58\))s
X/Helvetica 220 fnt
X1897 3024 moveto(sqrt root)s
X/Times-Roman 240 fnt
X2762 3028 moveto(\(56\))s
X
X/Helvetica 220 fnt
X1897 2736 moveto(over)s
X/Times-Roman 240 fnt
X2384 2740 moveto(frac)s 2814 x(\(54\))s
X/Helvetica 220 fnt
X1897 2448 moveto(above labove cabove rabove mabove)s
X/Times-Roman 240 fnt
X5605 2452 moveto(\(52\))s
X
X/Helvetica 220 fnt
X1897 2160 moveto(nextcol)s
X/Times-Roman 240 fnt
X2652 2164 moveto(\(50\))s 1417 1671 moveto(See)s 1822 x(page)s 2334 x(3)s
X2514 x(for)s 2852 x(examples)s 3815 x(of)s 4074 x(matrices.)s 5062 x(Here)s
X5586 x(are)s 5937 x(some)s 6502 x(examples)s 7465 x(of)s 7724 x(the)s
X8076 x(other)s 8627 x(symbols:)s
Xpgsave restore
Xshowpage
X
X%%Page: ? 9


X%%BeginPageSetup
X0.0500 dup scale 10 setlinewidth
X/pgsave save def
X%%EndPageSetup
X
X/Times-Roman 240 fnt

X5754 15261 moveto(-)s 5893 x(8)s 6073 x(-)s
X/Helvetica 220 fnt
X1897 14640 moveto(x dot)s
X/Times-Italic 168 fnt
X5904 14795 moveto(.)s
X
X/Times-Italic 240 fnt
X5866 14644 moveto(x)s
X/Helvetica 220 fnt
X1897 14155 moveto(x dotdot)s
X/Times-Italic 168 fnt
X5883 14310 moveto(..)s
X/Times-Italic 240 fnt
X5866 14159 moveto(x)s
X/Helvetica 220 fnt
X1897 13636 moveto(x hat)s
X
X/Times-Roman 168 fnt
X5886 13752 moveto(^)s
X/Times-Italic 240 fnt
X5866 13640 moveto(x)s
X/Helvetica 220 fnt
X1897 13162 moveto(x tilde)s
X/Times-Roman 168 fnt
X5880 13286 moveto(~)s
X/Times-Italic 240 fnt
X5866 13166 moveto(x)s
X
X/Helvetica 220 fnt
X1897 12629 moveto(x vec)s
X/Symbol 168 fnt
X5878 12784 moveto(\256)s
X/Times-Italic 240 fnt
X5901 12633 moveto(x)s
X/Helvetica 220 fnt
X1897 12096 moveto(x dyad)s
X/Symbol 168 fnt
X5878 12251 moveto(\253)s
X
X/Times-Italic 240 fnt
X5906 12100 moveto(x)s
X/Helvetica 220 fnt
X1897 11580 moveto(x+y overbar)s gsave
X5866 0 translate
X3.4885 1.0000 scale
X
X/Symbol 240 fnt
X0 11691 moveto(-)s

Xgrestore
X
X/Times-Italic 240 fnt

X5866 11584 moveto(x)s
X/Symbol 240 fnt
X6029 11577 moveto(+)s
X
X/Times-Italic 240 fnt
X6217 11584 moveto(y)s
X/Helvetica 220 fnt
X1897 11085 moveto(x+y underbar)s
X/Times-Italic 240 fnt
X5866 11089 moveto(x)s
X/Symbol 240 fnt
X6029 11082 moveto(+)s
X/Times-Italic 240 fnt
X6217 11089 moveto(y)s
Xgsave
X5866 0 translate
X3.4885 1.0000 scale
X
X/Symbol 240 fnt
X0 10927 moveto(-)s

Xgrestore
X
X/Times-Roman 240 fnt

X1417 10533 moveto(These)s 2053 x(marks)s 2702 x(are)s 3058 x(centred)s
X3826 x(over)s 4316 x(the)s 4673 x(left)s 5055 x(parameter,)s 6134 x(except)s
X6823 x(the)s 7180 x(last)s 7576 x(two)s 8000 x(which)s 8650 x(are)s
X9006 x(extended)s 9935 x(to)s 10186 x(the)s 1417 10245 moveto(width)s 2022 x(of)s
X2281 x(the)s 2633 x(object.)s
X/Helvetica 220 fnt
X1897 9675 moveto(a sup b)s
X/Times-Italic 168 fnt
X5986 9791 moveto(b)s
X/Times-Italic 240 fnt
X5866 9679 moveto(a)s
X
X/Helvetica 220 fnt
X1897 9180 moveto(a sub b)s
X/Times-Italic 240 fnt
X5866 9184 moveto(a)s
X/Times-Italic 168 fnt
X5986 9104 moveto(b)s
X/Helvetica 220 fnt
X1897 8584 moveto(a supp b on c)s
X/Times-Italic 240 fnt
X5866 8588 moveto(a)s
X
X/Times-Italic 168 fnt
X5986 8700 moveto(b)s 5986 8508 moveto(c)s
X/Times-Roman 240 fnt
X1417 8056 moveto(Note)s 1942 x(that)s
X/Helvetica 220 fnt
X2360 8052 moveto(supp)s
X
X/Times-Roman 240 fnt
X2896 8056 moveto(and)s
X/Helvetica 220 fnt
X3302 8052 moveto(on)s
X/Times-Roman 240 fnt
X3606 8056 moveto(must)s 4131 x(be)s 4417 x(used)s
X4916 x(together)s 5759 x(as)s 6018 x(shown.)s
X/Helvetica 220 fnt
X1897 7503 moveto(big sum from i)s
X/Symbol 312 fnt
X5866 7482 moveto(\345)s
X
X/Times-Italic 168 fnt
X5954 7296 moveto(i)s
X/Helvetica 220 fnt
X1897 6605 moveto(big prod to j)s
X/Times-Italic 168 fnt
X5971 6896 moveto(j)s
X/Symbol 312 fnt
X5866 6584 moveto(\325)s
X/Helvetica 220 fnt
X1897 6105 moveto({a, ... , z} widefrom)s
X1897 5817 moveto({90d @Rotate blbrace})s
X/Times-Italic 240 fnt
X5866 6109 moveto(a)s
X/Symbol 240 fnt
X5986 6102 moveto(\054)s 6089 x(\274)s 6329 x(\054)s
X
X/Times-Italic 240 fnt
X6432 6109 moveto(z)s gsave
X6235 0 translate
X0.9140 1.0000 scale
Xgsave
X0 5905 translate
X90.0000 rotate
X
X/Symbol 240 fnt
X0 182 moveto(\354)s 0 -60 moveto(\355)s 0 -302 moveto(\356)s

Xgrestore
X
Xgrestore
X
X/Helvetica 220 fnt

X1897 5316 moveto({a, ... , z} wideto minus)s
Xgsave
X5866 0 translate
X5.0305 1.0000 scale
X
X/Symbol 240 fnt
X0 5413 moveto(-)s

Xgrestore
X
X/Times-Italic 240 fnt

X5866 5320 moveto(a)s
X/Symbol 240 fnt
X5986 5313 moveto(\054)s 6089 x(\274)s 6329 x(\054)s
X
X/Times-Italic 240 fnt
X6432 5320 moveto(z)s
X/Helvetica 220 fnt
X1417 4815 moveto(widefrom)s
X/Times-Roman 240 fnt
X2364 4819 moveto(and)s
X/Helvetica 220 fnt
X2768 4815 moveto(wideto)s
X/Times-Roman 240 fnt
X3459 4819 moveto(are)s
X3808 x(like)s
X/Helvetica 220 fnt
X4224 4815 moveto(from)s
X/Times-Roman 240 fnt
X4721 4819 moveto(and)s
X/Helvetica 220 fnt
X5125 4815 moveto(to)s
X/Times-Roman 240 fnt
X5366 4819 moveto(except)s
X6048 x(that)s 6464 x(they)s 6934 x(horizontally)s 8147 x(scale)s 8682 x(the)s
X9032 x(right)s 9541 x(parameter)s 1417 4531 moveto(to)s 1663 x(the)s 2015 x(width)s
X2620 x(of)s 2879 x(the)s 3231 x(left.)s
X/Helvetica 220 fnt
X1897 3983 moveto(sqrt {x over y})s gsave
X0 3928 translate
X1.0000 1.9476 scale
X
X/Symbol 240 fnt
X5866 -60 moveto(\326)s
X
Xgrestore
Xgsave
X5997 4239 translate
X149 0 0 0 240 288 0 loutgr
Xgsave
X0 0 moveto xsize 0 lineto 0.03 ft setlinewidth 2 setlinecap stroke
Xgrestore
X
Xgrestore
X
X/Times-Italic 240 fnt
X6040 4090 moveto(x)s gsave
X6040 4040 translate
X106 0 0 0 240 288 0 loutgr
Xgsave
X0 0 moveto xsize 0 lineto 0.05 ft setlinewidth stroke
Xgrestore
X
Xgrestore
X
X/Times-Italic 240 fnt
X6040 3886 moveto(y)s
X/Helvetica 220 fnt
X1897 3249 moveto(3 root {x over y})s
X/Symbol 168 fnt
X5866 3360 moveto(\063)s
X/Times-Italic 240 fnt
X5866 3253 moveto()s
Xgsave
X0 3194 translate
X1.0000 1.9476 scale
X
X/Symbol 240 fnt
X5866 -60 moveto(\326)s
Xgrestore
Xgsave
X5997 3505 translate
X149 0 0 0 240 288 0 loutgr
Xgsave
X0 0 moveto xsize 0 lineto 0.03 ft setlinewidth 2 setlinecap stroke
Xgrestore
X
Xgrestore
X
X/Times-Italic 240 fnt
X6040 3356 moveto(x)s gsave
X6040 3306 translate
X106 0 0 0 240 288 0 loutgr
Xgsave
X0 0 moveto xsize 0 lineto 0.05 ft setlinewidth stroke
Xgrestore
X
Xgrestore
X
X/Times-Italic 240 fnt
X6040 3152 moveto(y)s
X/Times-Roman 240 fnt
X1417 2609 moveto(The)s 1849 x(left)s
X2226 x(parameter)s 3240 x(of)s
X/Helvetica 220 fnt
X3499 2605 moveto(root)s
X/Times-Roman 240 fnt
X3937 2609 moveto(may)s 4409 x(be)s
X4695 x(any)s 5101 x(object.)s
X/Helvetica 220 fnt
X1897 2000 moveto(2 over 3)s
X/Symbol 240 fnt
X5866 2105 moveto(\062)s gsave
X5866 2057 translate
X120 0 0 0 240 288 0 loutgr
Xgsave
X0 0 moveto xsize 0 lineto 0.05 ft setlinewidth stroke


Xgrestore
X
Xgrestore
X
X/Symbol 240 fnt

X5866 1845 moveto(\063)s


X
Xpgsave restore
Xshowpage
X

X%%Page: ? 10


X%%BeginPageSetup
X0.0500 dup scale 10 setlinewidth
X/pgsave save def
X%%EndPageSetup
X
X/Times-Roman 240 fnt

X5754 15261 moveto(-)s 5893 x(9)s 6073 x(-)s
X/Helvetica 220 fnt
X1897 14629 moveto(2 frac 3)s
X/Symbol 168 fnt
X5866 14715 moveto(\062)s
X5950 14644 moveto(\244)s 5978 14571 moveto(\063)s
X/Times-Roman 240 fnt
X1417 14119 moveto(The)s 1849 x(following)s 2839 x(short)s
X3377 x(names)s 4048 x(de\256ne)s 4693 x(relations)s 5575 x(\(that)s 6072 x(is,)s
X6351 x(they)s 6823 x(have)s 7335 x(a)s 7501 x(thick)s 8039 x(space)s
X8630 x(on)s 8930 x(each)s 9428 x(side\):)s
X/Helvetica 220 fnt
X3017 13657 moveto(<)s
X/Symbol 240 fnt
X3505 13654 moveto(\074)s
X
X/Helvetica 220 fnt
X5885 13657 moveto(>)s
X/Symbol 240 fnt
X6373 13654 moveto(\076)s
X/Helvetica 220 fnt
X8753 13657 moveto(=)s
X/Symbol 240 fnt
X9241 13654 moveto(\075)s
X/Helvetica 220 fnt
X2889 13369 moveto(<=)s
X
X/Symbol 240 fnt
X3505 13366 moveto(\243)s
X/Helvetica 220 fnt
X5586 13369 moveto(prec)s gsave
X6430 13426 translate
X-90.0000 rotate
X
X/Symbol 108 fnt
X-41 -27 moveto(\366)s 0 x(\346)s

Xgrestore
X
X/Helvetica 220 fnt

X8210 13369 moveto(preceq)s
Xgsave
X9298 13426 translate
X-90.0000 rotate
X
X/Symbol 108 fnt
X-41 -27 moveto(\366)s 0 x(\346)s

Xgrestore
X
X/Symbol 240 fnt

X9241 13292 moveto(-)s
X/Helvetica 220 fnt
X2889 13081 moveto(<<)s
X/Symbol 240 fnt
X3505 13078 moveto(\074)s
X3636 x(\074)s
X/Helvetica 220 fnt
X5366 13081 moveto(subset)s
X/Symbol 240 fnt
X6373 13078 moveto(\314)s
X/Helvetica 220 fnt
X7990 13081 moveto(subseteq)s
X/Symbol 240 fnt
X9241 13078 moveto(\315)s
X
X/Helvetica 220 fnt
X2022 12793 moveto(sqsubseteq)s gsave
X3505 12790 translate
X131 120 0 60 240 288 0 loutgr
Xgsave
Xxsize 0 moveto
X0 0 lineto
X0 ysize lineto


Xxsize ysize lineto
X0.04 ft setlinewidth stroke
Xgrestore
X
Xgrestore
X

X/Symbol 240 fnt
X3505 12697 moveto(-)s
X/Helvetica 220 fnt
X5843 12793 moveto(in)s
X/Symbol 240 fnt
X6373 12790 moveto(\316)s
X/Helvetica 220 fnt
X8295 12793 moveto(vdash)s
Xgsave
X9301 12850 translate
X-180.0000 rotate
Xgsave
X0 -78 translate


X180.0000 rotate
Xgsave
X0 0 translate

X-90.0000 rotate


X
X/Symbol 240 fnt
X0 -60 moveto(\136)s
Xgrestore
X

Xgrestore
X
Xgrestore
Xgsave
X9301 12929 translate
X-90.0000 rotate


X
X/Symbol 240 fnt
X0 -60 moveto(\136)s
Xgrestore
X
X/Helvetica 220 fnt

X2634 12505 moveto(smile)s gsave
X3606 12562 translate
X-180.0000 rotate
Xgsave
X0 -39 translate
X180.0000 rotate
Xgsave
X0 -79 translate
X90.0000 rotate
X
X/Symbol 240 fnt
X0 -60 moveto(\050)s

Xgrestore
X
Xgrestore
X
Xgrestore
Xgsave

X3606 12523 translate
X90.0000 rotate
X
X/Symbol 240 fnt
X0 -60 moveto(\050)s


X
Xgrestore
X
X/Helvetica 220 fnt

X5477 12505 moveto(frown)s gsave
X6474 12562 translate
X-180.0000 rotate
Xgsave
X0 -39 translate
X180.0000 rotate
Xgsave
X0 -79 translate
X90.0000 rotate
X
X/Symbol 240 fnt
X0 -60 moveto(\051)s

Xgrestore
X
Xgrestore
X
Xgrestore
Xgsave

X6474 12523 translate
X90.0000 rotate
X
X/Symbol 240 fnt
X0 -60 moveto(\051)s

Xgrestore
X
X/Helvetica 220 fnt

X8625 12505 moveto(>=)s
X/Symbol 240 fnt
X9241 12502 moveto(\263)s
X
X/Helvetica 220 fnt
X2693 12217 moveto(succ)s gsave
X3577 12274 translate
X90.0000 rotate
X
X/Symbol 108 fnt
X-41 -27 moveto(\366)s 0 x(\346)s

Xgrestore
X
X/Helvetica 220 fnt

X5317 12217 moveto(succeq)s gsave
X6445 12274 translate
X90.0000 rotate
X
X/Symbol 108 fnt
X-41 -27 moveto(\366)s
X0 x(\346)s

Xgrestore
X
X/Symbol 240 fnt

X6373 12140 moveto(-)s
X/Helvetica 220 fnt
X8625 12217 moveto(>>)s
X/Symbol 240 fnt
X9241 12214 moveto(\076)s 9372 x(\076)s
X
X/Helvetica 220 fnt
X2498 11929 moveto(supset)s
X/Symbol 240 fnt
X3505 11926 moveto(\311)s
X/Helvetica 220 fnt
X5122 11929 moveto(supseteq)s
X/Symbol 240 fnt
X6373 11926 moveto(\312)s
X/Helvetica 220 fnt
X7758 11929 moveto(sqsupseteq)s
Xgsave
X9241 11926 translate
X131 120 0 60 240 288 0 loutgr
Xgsave
X0 0 moveto xsize 0 lineto
Xxsize ysize lineto
X0 ysize lineto


X0.04 ft setlinewidth stroke
Xgrestore
X
Xgrestore
X
X/Symbol 240 fnt

X9241 11833 moveto(-)s
X/Helvetica 220 fnt
X2975 11641 moveto(ni)s gsave
X3676 11698 translate


X180.0000 rotate
X
X/Symbol 240 fnt

X0 -60 moveto(\316)s

Xgrestore
X
X/Helvetica 220 fnt

X5427 11641 moveto(dashv)s gsave
X6474 11698 translate
X-180.0000 rotate
Xgsave
X0 -78 translate
X180.0000 rotate
Xgsave
X0 -157 translate
X90.0000 rotate


X
X/Symbol 240 fnt
X0 -60 moveto(\136)s

X
Xgrestore
X
Xgrestore
X

Xgrestore
Xgsave
X6474 11620 translate
X90.0000 rotate


X
X/Symbol 240 fnt
X0 -60 moveto(\136)s
Xgrestore
X
X/Helvetica 220 fnt

X8528 11641 moveto(mid)s
X/Times-Roman 240 fnt
X9241 11645 moveto(|)s
X/Helvetica 220 fnt
X2440 11353 moveto(parallel)s
X/Times-Roman 240 fnt
X3505 11357 moveto(||)s
X
X/Helvetica 220 fnt
X5757 11353 moveto(==)s
X/Symbol 240 fnt
X6373 11350 moveto(\272)s
X/Helvetica 220 fnt
X8753 11353 moveto(~)s
X/Symbol 240 fnt
X9241 11350 moveto(\176)s
X/Helvetica 220 fnt
X2944 11065 moveto(-~)s
X
X/Symbol 240 fnt
X3505 11089 moveto(\176)s 3505 11037 moveto(-)s
X/Helvetica 220 fnt
X5366 11065 moveto(asymp)s gsave
X6444 11123 translate
X90.0000 rotate
X
X/Symbol 168 fnt
X0 -42 moveto(\050)s
Xgrestore
Xgsave
X6444 11066 translate
X90.0000 rotate
X
X/Symbol 168 fnt
X0 -42 moveto(\051)s


X
Xgrestore
X
X/Helvetica 220 fnt

X8625 11065 moveto(~~)s
X/Symbol 240 fnt
X9241 11062 moveto(\273)s
X/Helvetica 220 fnt
X2889 10777 moveto(=~)s
X/Symbol 240 fnt
X3505 10774 moveto(\100)s
X/Helvetica 220 fnt
X5380 10777 moveto(bowtie)s
Xgsave
X6430 10834 translate
X-90.0000 rotate
Xgsave
X-57 -57 translate
X114 114 57 57 192 0 48 loutgr


Xgsave
X0 0 moveto xsize 0 lineto
Xxsize 2 div ysize lineto closepath
X0.04 ft setlinewidth stroke
Xgrestore
X
Xgrestore
X

Xgrestore
Xgsave
X6544 10834 translate
X90.0000 rotate
Xgsave
X-57 -57 translate
X114 114 57 57 192 0 48 loutgr


Xgsave
X0 0 moveto xsize 0 lineto
Xxsize 2 div ysize lineto closepath
X0.04 ft setlinewidth stroke
Xgrestore
X
Xgrestore
X

Xgrestore
X
X/Helvetica 220 fnt

X8259 10777 moveto(propto)s
X/Symbol 240 fnt
X9241 10774 moveto(\265)s
X/Helvetica 220 fnt
X2438 10489 moveto(models)s gsave
X3505 10546 translate
X-180.0000 rotate
Xgsave
X0 -81 translate
X180.0000 rotate
X
X/Times-Roman 240 fnt
X0 -162 moveto(|)s

Xgrestore
X
Xgrestore
X
X/Times-Roman 240 fnt

X3505 10465 moveto(|)s
Xgsave
X3517 10546 translate
X-180.0000 rotate
Xgsave
X0 -29 translate


X180.0000 rotate
X
X/Symbol 240 fnt

X0 -93 moveto(\075)s

Xgrestore
X
Xgrestore
X
X/Symbol 240 fnt

X3517 10483 moveto(\075)s
X/Helvetica 220 fnt
X5464 10489 moveto(doteq)s
X/Symbol 240 fnt
X6408 10564 moveto(\327)s 6373 10486 moveto(\075)s
X
X/Helvetica 220 fnt
X8442 10489 moveto(perp)s
X/Symbol 240 fnt
X9241 10486 moveto(\136)s
X/Helvetica 220 fnt
X2486 10201 moveto(notsub)s
X/Symbol 240 fnt
X3505 10198 moveto(\313)s
X/Helvetica 220 fnt
X5538 10201 moveto(notin)s
X
X/Symbol 240 fnt
X6373 10198 moveto(\317)s
X/Helvetica 220 fnt
X8692 10201 moveto(!=)s
X/Symbol 240 fnt
X9241 10198 moveto(\271)s
X/Helvetica 220 fnt
X2816 9913 moveto(<->)s
X/Symbol 240 fnt
X3505 9910 moveto(\253)s
X
X/Helvetica 220 fnt
X5739 9913 moveto(<--)s
X/Symbol 240 fnt
X6373 9910 moveto(\254)s
X/Helvetica 220 fnt
X8607 9913 moveto(-->)s
X/Symbol 240 fnt
X9241 9910 moveto(\256)s
X/Helvetica 220 fnt
X2901 9625 moveto(up)s
X
X/Symbol 240 fnt
X3505 9622 moveto(\255)s
X/Helvetica 220 fnt
X5489 9625 moveto(down)s
X/Symbol 240 fnt
X6373 9622 moveto(\257)s
X/Helvetica 220 fnt
X8497 9625 moveto(<=>)s
X/Symbol 240 fnt
X9241 9622 moveto(\333)s
X
X/Helvetica 220 fnt
X2761 9337 moveto(<==)s
X/Symbol 240 fnt
X3505 9334 moveto(\334)s
X/Helvetica 220 fnt
X5629 9337 moveto(==>)s
X/Symbol 240 fnt
X6373 9334 moveto(\336)s
X/Helvetica 220 fnt
X8345 9337 moveto(dblup)s
X
X/Symbol 240 fnt
X9241 9334 moveto(\335)s
X/Helvetica 220 fnt
X2329 9049 moveto(dbldown)s
X/Symbol 240 fnt
X3505 9046 moveto(\337)s
X/Helvetica 220 fnt
X5952 9049 moveto(:)s
X/Symbol 240 fnt
X6373 9046 moveto(\072)s
X
X/Helvetica 220 fnt
X8759 9049 moveto(::)s
X/Symbol 240 fnt
X9241 9046 moveto(\072)s 9350 x(\072)s
X/Helvetica 220 fnt
X2956 8761 moveto(:=)s
X/Symbol 240 fnt
X3505 8758 moveto(\072)s
X3571 8746 moveto(\075)s
X/Times-Roman 240 fnt
X1417 8304 moveto(These)s 2053 x(can)s 2450 x(be)s 2741 x(negated)s
X3550 x(by)s 3855 x(preceding)s 4863 x(them)s 5406 x(with)s
X/Helvetica 220 fnt
X5896 8300 moveto(not)s
X
X/Times-Roman 240 fnt
X6201 8304 moveto(,)s 6326 x(as)s 6590 x(in)s
X/Helvetica 220 fnt
X6841 8300 moveto(not ==)s
X/Times-Roman 240 fnt
X7463 8304 moveto(,)s
X7588 x(for)s 7931 x(example,)s 8866 x(which)s 9516 x(yields)s
X/Symbol 240 fnt
X10224 8297 moveto(\272)s
X10256 x(\057)s
X/Times-Roman 240 fnt
X10427 8304 moveto(.)s 1417 8016 moveto(The)s 1849 x(following)s 2839 x(short)s
X3377 x(names)s 4048 x(de\256ne)s 4693 x(binary)s 5364 x(operators)s 6313 x(\(medium)s
X7236 x(space)s 7827 x(on)s 8127 x(each)s 8625 x(side\):)s
X/Helvetica 220 fnt
X3017 7525 moveto(+)s
X
X/Symbol 240 fnt
X3490 7522 moveto(+)s
X/Helvetica 220 fnt
X5940 7525 moveto(-)s
X/Symbol 240 fnt
X6358 7522 moveto(-)s
X/Helvetica 220 fnt
X8680 7525 moveto(+-)s
X/Symbol 240 fnt
X9226 7522 moveto(\261)s
X
X/Helvetica 220 fnt
X2944 7237 moveto(-+)s gsave
X3621 7294 translate


X180.0000 rotate
X
X/Symbol 240 fnt

X0 -60 moveto(\261)s

Xgrestore
X
X/Helvetica 220 fnt

X5135 7237 moveto(setminus)s
X/Times-Italic 240 fnt
X6358 7241 moveto(\\)s
X/Helvetica 220 fnt
X8466 7237 moveto(cdot)s
X
X/Symbol 240 fnt
X9226 7234 moveto(\327)s
X/Helvetica 220 fnt
X2621 6949 moveto(times)s
X/Symbol 240 fnt
X3490 6946 moveto(\264)s
X/Helvetica 220 fnt
X5928 6949 moveto(*)s
X/Symbol 240 fnt
X6358 6946 moveto(\052)s
X
X/Helvetica 220 fnt
X8540 6949 moveto(circ)s gsave
X9226 6934 translate


X168 144 0 72 240 288 0 loutgr
Xgsave
Xxsize ysize 2 div moveto
Xxsize 2 div ysize 2 div xsize 2 div 0 360 arc
X0.04 ft setlinewidth stroke
Xgrestore
X
Xgrestore
X
X/Helvetica 220 fnt

X2865 6661 moveto(div)s
X/Symbol 240 fnt
X3490 6658 moveto(\270)s
X/Helvetica 220 fnt
X5659 6661 moveto(cap)s
X/Symbol 240 fnt
X6358 6658 moveto(\307)s
X
X/Helvetica 220 fnt
X8527 6661 moveto(cup)s
X/Symbol 240 fnt
X9226 6658 moveto(\310)s
X/Helvetica 220 fnt
X2621 6373 moveto(uplus)s
X/Symbol 168 fnt
X3536 6436 moveto(+)s
X/Symbol 240 fnt
X3490 6370 moveto(\310)s
X
X/Helvetica 220 fnt
X5427 6373 moveto(sqcap)s gsave
X6358 6358 translate


X144 144 72 72 240 288 0 loutgr
Xgsave

X0 0 moveto 0 ysize lineto xsize ysize lineto
Xxsize 0 lineto


X0.04 ft setlinewidth stroke
Xgrestore
X
Xgrestore
X
X/Helvetica 220 fnt

X8295 6373 moveto(sqcup)s gsave
X9427 6430 translate
X180.0000 rotate
Xgsave
X57 -72 translate


X144 144 72 72 240 288 0 loutgr
Xgsave

X0 0 moveto 0 ysize lineto xsize ysize lineto
Xxsize 0 lineto


X0.04 ft setlinewidth stroke
Xgrestore
X
Xgrestore
X

Xgrestore
X
X/Helvetica 220 fnt

X2135 6085 moveto(triangleleft)s gsave
X3547 6142 translate
X90.0000 rotate
Xgsave
X-57 -57 translate
X114 114 57 57 192 288 48 loutgr


Xgsave
X0 0 moveto xsize 0 lineto
Xxsize 2 div ysize lineto closepath
X0.04 ft setlinewidth stroke
Xgrestore
X
Xgrestore
X

Xgrestore
X
X/Helvetica 220 fnt

X4869 6085 moveto(triangleright)s gsave
X6415 6142 translate
X-90.0000 rotate
Xgsave
X-57 -57 translate
X114 114 57 57 192 288 48 loutgr


Xgsave
X0 0 moveto xsize 0 lineto
Xxsize 2 div ysize lineto closepath
X0.04 ft setlinewidth stroke
Xgrestore
X
Xgrestore
X

Xgrestore
X
X/Helvetica 220 fnt

X8650 6085 moveto(wr)s
Xgsave
X9239 6142 translate
X-180.0000 rotate
Xgsave
X0 -65 translate
X180.0000 rotate
Xgsave
X0 -131 translate
X90.0000 rotate
X
X/Symbol 240 fnt
X0 -60 moveto(\176)s

Xgrestore
X
Xgrestore
X
Xgrestore
Xgsave

X9239 6077 translate
X90.0000 rotate
X
X/Symbol 240 fnt
X0 -60 moveto(\176)s

Xgrestore
X
X/Helvetica 220 fnt

X2512 5797 moveto(bigcirc)s gsave
X3490 5768 translate
X201 172 0 86 288 288 72 loutgr


Xgsave
Xxsize ysize 2 div moveto
Xxsize 2 div ysize 2 div xsize 2 div 0 360 arc
X0.04 ft setlinewidth stroke
Xgrestore
X
Xgrestore
X
X/Helvetica 220 fnt

X4759 5797 moveto(bigtriangleup)s gsave
X6358 5768 translate
X172 172 86 86 288 288 72 loutgr


Xgsave
X0 0 moveto xsize 0 lineto
Xxsize 2 div ysize lineto closepath
X0.04 ft setlinewidth stroke
Xgrestore
X
Xgrestore
X
X/Helvetica 220 fnt

X7347 5797 moveto(bigtriangledown)s
Xgsave
X9312 5854 translate
X180.0000 rotate
Xgsave
X-86 -86 translate
X172 172 86 86 288 288 72 loutgr


Xgsave
X0 0 moveto xsize 0 lineto
Xxsize 2 div ysize lineto closepath
X0.04 ft setlinewidth stroke
Xgrestore
X
Xgrestore

END_OF_FILE
if test 49055 -ne `wc -c <'lout/doc/tr.eq/outfile.ps.B'`; then
echo shar: \"'lout/doc/tr.eq/outfile.ps.B'\" unpacked with wrong size!
elif test -f 'lout/doc/tr.eq/outfile.ps.A' && test -f 'lout/doc/tr.eq/outfile.ps.C'; then


echo shar: Combining \"'lout/doc/tr.eq/outfile.ps'\" \(157394 characters\)
cat 'lout/doc/tr.eq/outfile.ps.A' 'lout/doc/tr.eq/outfile.ps.B' 'lout/doc/tr.eq/outfile.ps.C' > 'lout/doc/tr.eq/outfile.ps'
if test 157394 -ne `wc -c <'lout/doc/tr.eq/outfile.ps'`; then
echo shar: \"'lout/doc/tr.eq/outfile.ps'\" combined with wrong size!
else
rm lout/doc/tr.eq/outfile.ps.A lout/doc/tr.eq/outfile.ps.B
rm lout/doc/tr.eq/outfile.ps.C
fi
fi

# end of 'lout/doc/tr.eq/outfile.ps.B'
fi
if test -f 'lout/doc/tr.over/s2' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.over/s2'\"
else
echo shar: Extracting \"'lout/doc/tr.over/s2'\" \(1739 characters\)
sed "s/^X//" >'lout/doc/tr.over/s2' <<'END_OF_FILE'
X@Section
X @Title { The non-expert's view }
X@Begin
X@PP
XThe non-expert user perceives Lout as text interspersed with special
Xsymbols, in a style reminiscent of many other batch formatters:
X@ID @Code {
X"@Doc @Text @Begin"
X"@Heading { Standard Integrals }"
X"@PP"
X"The following list of standard"
X"integrals should be memorized:"
X"@NumberList"
X"@Item @Eq {int e sup x dx = e sup x}"
X"@Item @Eq {int dx over"
X" sqrt { 1 - x sup 2 } = arc sin x}"
X"@EndList"
X"@End @Text"
X}
XBraces are used for grouping parameters to the features. The symbols
Xare all taken from two of the standard packages: DocumentLayout, which
Xprovides headings, paragraphs, lists, footnotes, sections, and so on,
Xand Eq, which provides mathematical typesetting in a style copied from
Xthe eqn language of Kernighan and Cherry [{@Ref kernighan75}].
X@PP
XAt the time of writing, packages exist for formatting general documents,
Xtechnical reports, and books, the latter providing an automatic table of
Xcontents, running page headers and footers, access to bibliographic
Xdatabases, and a sorted index, among many other features. Specialized
Xpackages exist for mathematical typesetting, drawing figures, and
Xformatting Pascal programs.
X@PP
XThe advanced features maintain the simple style established above. To
Xproduce a footnote, for example, one simply types
X@ID @Code "@FootNote { ... }"
Xat the appropriate point, and it will be numbered and placed at the
Xbottom of the page; to add an item to the index,
X@ID @Code "expert @Index { Expert user }"
Xis typed, and the right parameter will appear in the index, with a page
Xnumber, at a place determined by the alphabetical ranking of the left
Xparameter. No technical knowledge is required to use these features.
X@End @Section
END_OF_FILE
if test 1739 -ne `wc -c <'lout/doc/tr.over/s2'`; then
echo shar: \"'lout/doc/tr.over/s2'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.over/s2'
fi
if test -f 'lout/z22.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/z22.c'\"
else
echo shar: Extracting \"'lout/z22.c'\" \(28732 characters\)
sed "s/^X//" >'lout/z22.c' <<'END_OF_FILE'
X/*@z22.c:Galley Service:FlushInners(), Promote(), KillGalley()@***************/


X/* */
X/* LOUT: A HIGH-LEVEL LANGUAGE FOR DOCUMENT FORMATTING (VERSION 2.03) */
X/* COPYRIGHT (C) 1993 Jeffrey H. Kingston */
X/* */
X/* Jeffrey H. Kingston (je...@cs.su.oz.au) */
X/* Basser Department of Computer Science */
X/* The University of Sydney 2006 */
X/* AUSTRALIA */
X/* */
X/* This program is free software; you can redistribute it and/or modify */
X/* it under the terms of the GNU General Public License as published by */
X/* the Free Software Foundation; either version 1, or (at your option) */
X/* any later version. */
X/* */
X/* This program is distributed in the hope that it will be useful, */
X/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
X/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
X/* GNU General Public License for more details. */
X/* */
X/* You should have received a copy of the GNU General Public License */
X/* along with this program; if not, write to the Free Software */
X/* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
X/* */

X/* FILE: z22.c */
X/* MODULE: Galley Service */
X/* EXTERNS: FlushInners(), ExpandRecursives(), Promote(), */
X/* KillGalley(), FreeGalley(), Interpose(), */
X/* TargetSymbol(), CheckConstraint() */


X/* */
X/*****************************************************************************/
X#include "externs"

X#define LAST_ADJUST 1
X#define ALL_ADJUST 2


X
X
X/*****************************************************************************/
X/* */

X/* static MakeDead(y) */
X/* */
X/* Convert object y into a DEAD object and remove it to the dead store. */
X/* */
X/*****************************************************************************/
X
Xstatic MakeDead(y)
XOBJECT y;
X{ static int dead_count = 0; /* number of DEAD objects seen */
X static OBJECT dead_store = nil; /* where DEAD objects are kept */
X
X debug1(DGS, DDD, "MakeDead( %s )", Image(type(y)));
X if( dead_store == nil ) dead_store = New(ACAT);
X type(y) = DEAD;
X MoveLink(Up(y), dead_store, PARENT);
X if( dead_count >= 100 ) DisposeChild(Down(dead_store));
X else dead_count++;
X debug1(DGS, DDD, "MakeDead returning (dead_count = %d).", dead_count);
X} /* end MakeDead */
X
X/*****************************************************************************/
X/* */
X/* FlushInners(inners, hd) */
X/* */
X/* Flush each galley on the list inners. These have become flushable */
X/* by being promoted off the top of galley hd; if hd is the root galley, */
X/* identifiable by having PrintSym as target, don't flush inners at all. */
X/* */
X/*****************************************************************************/
X
XFlushInners(inners, hd)
XOBJECT inners, hd;
X{ OBJECT y, z, tmp, dest_index;
X
X /* check for root galley case */
X if( hd != nil )
X { assert( Up(hd) != hd, "FlushInners: Up(hd)!" );
X Parent(dest_index, Up(hd));
X if( actual(actual(dest_index)) == PrintSym )
X { DisposeObject(inners);


X return;
X }
X }
X

X while( Down(inners) != inners )
X { Child(y, Down(inners));
X DeleteLink(Down(inners));
X switch( type(y) )
X {
X
X case DEAD:


X
X break;
X
X

X case RECEIVING:
X case UNATTACHED:
X
X assert( Down(y) != y, "FlushInners: UNATTACHED!");
X Child(z, Down(y));
X debug0(DGF, D, " calling FlushGalley from FlushInners (a)");
X FlushGalley(z);
X break;
X
X
X case PRECEDES:
X
X Child(tmp, Down(y));
X if( Up(tmp) != LastUp(tmp) )
X { Parent(tmp, LastUp(tmp));
X assert(type(tmp)==FOLLOWS, "FlushInners: FOLLOWS!");
X if( blocked(tmp) )
X { blocked(tmp) = FALSE;
X Parent(z, Up(tmp));
X debug0(DGF, D, " calling FlushGalley from FlushInners (b)");
X FlushGalley(z);


X }
X }
X break;
X
X

X default:
X
X Error(INTERN,&fpos(y),"FlushInners %s", Image(type(y)));
X break;
X }
X }
X Dispose(inners);
X} /* end FlushInners */


X
X
X/*@@**************************************************************************/
X/* */

X/* ExpandRecursives(recs) */
X/* */
X/* Expand each of the recursive definite objects in the list recs. */
X/* */
X/*****************************************************************************/
X
XExpandRecursives(recs)
XOBJECT recs;
X{ CONSTRAINT non_c, hc, vc;
X OBJECT target_index, target, z, n1, inners, newrecs, hd, tmp, env;
X debug0(DCR, D, "ExpandRecursives(recs)");
X SetConstraint(non_c, MAX_LEN, MAX_LEN, MAX_LEN); n1 = nil;
X assert(recs != nil, "ExpandRecursives: recs == nil!");
X while( Down(recs) != recs )
X { Child(target_index, Down(recs));
X DeleteLink( Down(recs) );
X assert( type(target_index) == RECURSIVE, "ExpandRecursives: index!" );
X target = actual(target_index);
X debug2(DCR, DD, " expanding %s %s", Image(type(target_index)),
X EchoObject(null, target));
X
X /* expand body of target, convert to galley, and check size */
X hd = New(HEAD); actual(hd) = actual(target);
X whereto(hd) = ready_galls(hd) = nil; must_expand(hd) = TRUE;
X backward(hd) = sized(hd) = FALSE;
X tmp = CopyObject(target, &fpos(target));
X env = DetachEnv(tmp);
X Link(hd, tmp); Link(target_index, hd);
X SizeGalley(hd, env, external(target), threaded(target), FALSE, FALSE,
X &save_style(target), &non_c, nil, &n1, &newrecs, &inners);
X debug0(DCR, DDD, " as galley:");
X ifdebug(DCR, DDD, EchoObject(stderr, hd));
X Constrained(target, &hc, COL);
X debug2(DSC, D, "Constrained( %s, COL ) = %s",
X EchoObject(null, target), EchoConstraint(&hc));
X debug3(DCR, DD, " horizontal size: (%s, %s); constraint: %s",
X EchoLength(back(hd, COL)), EchoLength(fwd(hd, COL)), EchoConstraint(&hc));
X if( !FitsConstraint(back(hd, COL), fwd(hd, COL), hc) )
X { DisposeChild(Up(hd));


X if( inners != nil ) DisposeObject(inners);

X if( newrecs != nil ) DisposeObject(newrecs);
X DeleteNode(target_index);
X debug0(DCR, DD, " rejecting (too wide)");
X continue;
X }
X if( !external(target) )
X { Constrained(target, &vc, ROW);
X debug2(DSC, D, "Constrained( %s, ROW ) = %s",
X EchoObject(null, target), EchoConstraint(&vc));
X Child(z, LastDown(hd));
X debug3(DCR, DD, " vsize: (%s, %s); constraint: %s",
X EchoLength(back(z, ROW)), EchoLength(fwd(z, ROW)), EchoConstraint(&vc));
X if( !FitsConstraint(back(z, ROW), fwd(z, ROW), vc) )
X { DisposeChild(Up(hd));


X if( inners != nil ) DisposeObject(inners);

X if( newrecs != nil ) DisposeObject(newrecs);
X DeleteNode(target_index);
X debug0(DCR, DD, " rejecting (too high)");
X continue;
X }
X }
X
X /* object fits; adjust sizes and promote */
X debug0(DSA, D, "calling AdjustSize from ExpandRecursives (a)");
X AdjustSize(target, back(hd, COL), fwd(hd, COL), COL);
X if( !external(target) )
X { debug0(DSA, D, "calling AdjustSize from ExpandRecursives (b)");
X AdjustSize(target, back(z, ROW), fwd(z, ROW), ROW);
X Interpose(target, VCAT, z, z);
X }
X Promote(hd, hd, target_index); DeleteNode(hd);
X DeleteNode(target_index);


X if( inners != nil ) FlushInners(inners, nil);

X if( newrecs != nil ) MergeNode(recs, newrecs);
X } /* end while */
X Dispose(recs);
X debug0(DCR, D, "ExpandRecursives returning.");
X} /* end ExpandRecursives */


X
X
X/*****************************************************************************/
X/* */

X/* OBJECT FindSplitInGalley(hd) */
X/* */
X/* Search simply joined galley hd for a SPLIT object, which must be there. */
X/* */
X/*****************************************************************************/
X
Xstatic OBJECT FindSplitInGalley(hd)
XOBJECT hd;
X{ OBJECT link, y;
X debug0(DGF, D, "FindSplitInGalley(hd)");
X for( link = Down(hd); link != hd; link = NextDown(link) )
X { Child(y, link);
X if( is_definite(type(y)) ) break;
X }
X if( link == hd )
X { debug0(DGF, D, "FindSplitInGalley failing, no definite component; hd =");
X ifdebug(DGF, D, EchoObject(stderr, hd));
X Error(INTERN, &fpos(hd), "missing galley component");
X }
X while( type(y) != SPLIT ) switch( type(y) )
X {
X case VCAT:


X case ONE_ROW:
X case WIDE:
X case HIGH:

X case VCONTRACT:


X case VEXPAND:
X case PADJUST:

X case VADJUST:
X
X Child(y, Down(y));
X break;
X
X


X case CLOSURE:
X case NULL_CLOS:

X case HCAT:
X case WORD:
X case ACAT:
X case ROW_THR:
X case COL_THR:
X case ONE_COL:
X case SCALE:


X case HSCALE:
X case VSCALE:
X case HCONTRACT:

X case HEXPAND:
X case HADJUST:
X case ROTATE:


X case INCGRAPHIC:
X case SINCGRAPHIC:
X case GRAPHIC:
X

X debug0(DGF, D, "FindSplitInGalley(hd) failing, hd =");
X ifdebug(DGF, D, EchoObject(stderr, hd));
X Error(INTERN, &fpos(y), "FindSplitInGalley failed", Image(type(y)));


X break;
X
X
X default:
X

X Error(INTERN, &fpos(y), "FindSplitInGalley found %s", Image(type(y)));
X break;
X
X }
X debug0(DGF, D, "FindSplitInGalley returning.");
X return y;
X} /* end FindSplitInGalley */
X
X/*@@**************************************************************************/
X/* */
X/* Promote(x, stop_link, dest_index) */
X/* */
X/* Promote components of galley x into its destination (dest), up to but */
X/* not including the one linked to x by link stop_link, which always */
X/* follows a component. No size adjustments are made, except that when */
X/* two col_thr nodes are merged, a COL adjustment is made to the result. */
X/* */
X/*****************************************************************************/
X
XPromote(x, stop_link, dest_index)
XOBJECT x, stop_link, dest_index;
X{
X /* these four variables refer to the root galley only */
X static BOOLEAN first = TRUE; /* TRUE when the first component not written */
X static int prec_back; /* back value of preceding component */
X static int prec_fwd; /* fwd value of preceding component */
X static GAP prec_gap; /* preceding gap */
X
X OBJECT dest, link, y, z, tmp1, tmp2;
X int dim; CONSTRAINT c;
X debug1(DGS, D, "Promote(%s, stop_link)", SymName(actual(x)));
X
X assert( type(x) == HEAD, "Promote: x!" );
X assert( type(stop_link) == LINK || stop_link == x, "Promote: stop_link!" );
X assert( stop_link != Down(x), "Promote: stop_link == Down(x)!" );
X type(dest_index) = RECEIVING;


X dest = actual(dest_index);
X

X /* insert final gap if galley is ending */
X if( stop_link != x )
X { Child(y, stop_link);
X assert( type(y) == GAP_OBJ, "Promote: missing GAP_OBJ!" );
X stop_link = NextDown(stop_link);
X }
X else
X { y = New(GAP_OBJ);
X FposCopy(fpos(y), fpos(x));
X hspace(y) = 0; vspace(y) = 1;
X ClearGap(gap(y));
X Link(stop_link, y);
X }
X
X /* error if promoting a seen_nojoin galley into a threaded destination */
X if( seen_nojoin(x) && threaded(dest) )
X Error(FATAL, &fpos(x), "galley %s must have a single column mark",
X SymName(actual(x)));
X if( seen_nojoin(x) ) join(gap(y)) = FALSE; /* to make nojoin status clear */
X
X /* if promoting out of root galley, do special things */
X if( actual(dest) == PrintSym )
X { CONSTRAINT c;
X link = x;
X while( NextDown(link) != stop_link )
X { Child(y, NextDown(link));
X debug1(DGS, D, "root promote %s", EchoObject(null, y));


X if( type(y) == SPLIT ) Child(y, DownDim(y, ROW));

X switch( type(y) )
X {
X
X case PRECEDES:
X
X DisposeChild(NextDown(link));
X break;
X
X
X case UNATTACHED:
X
X assert( Down(y) != y, "FlushRootGalley: UNATTACHED!" );
X Child(z, Down(y));
X assert( type(z) == HEAD, "FlushRootGalley: unattached HEAD!" );
X if( sized(z) )
X {
X /* galley is part flushed, leave it here */
X link = NextDown(link);
X }
X else if( backward(z) )
X {
X /* galley is preceding, send to CrossSequence */
X OBJECT t;
X type(y) = GALL_PREC;
X Child(t, Down(z));
X actual(y) = CrossMake(whereto(z), t, GALL_PREC);
X DisposeChild(Down(y));
X CrossSequence(actual(y));
X DisposeChild(NextDown(link));
X }
X else
X {
X /* galley was never attached, print message and kill it */
X Error(WARN, &fpos(z), "Galley %s deleted - never attached",
X SymName(actual(z)));
X KillGalley(z);


X }
X break;
X
X

X case EXPAND_IND:
X
X /* expand @HExpand or @VExpand to occupy everything possible */
X dim = type(actual(y)) == HEXPAND ? COL : ROW;
X debug1(DGP, D, " flushing %s", EchoObject(null, y));
X Constrained(actual(y), &c, dim);
X if( constrained(c) )
X { LENGTH b = back(actual(y), dim);
X LENGTH f = fwd(actual(y), dim);
X EnlargeToConstraint(&b, &f, &c);
X debug2(DGP, D, "FlushRoot call AdjustSize(x, %s,%s, dim)",
X EchoLength(b), EchoLength(f));
X debug1(DSA, D, "Promote %s AdjustSize", Image(type(actual(y))));
X AdjustSize(actual(y), b, f, dim);
X }
X DisposeChild(NextDown(link));
X break;
X
X
X case GALL_PREC:
X case GALL_FOLL:
X case GALL_TARG:


X case CROSS_PREC:
X case CROSS_FOLL:

X case CROSS_TARG:
X
X CrossSequence(actual(y));
X DisposeChild(NextDown(link));
X break;
X
X

X /* print this component */
X debug0(DCR, D, "Promote --");
X if( !is_indefinite(type(y)) && size(y, ROW) != 0 )
X {
X /* move down as specified by the gap */
X if( first )
X { PrintPrologue(size(x, COL), size(y, ROW));
X first = FALSE;
X }
X else PrintOriginIncrement(prec_back - back(y, ROW)
X + MinGap(prec_fwd, back(y, ROW), fwd(y, ROW), &prec_gap));
X debug1(DGF,D, " Promote calling FixAndPrint %s", Image(type(y)));
X /* old interface ***
X SetConstraint(c, back(x, COL), size(x, COL), fwd(x, COL));
X FixAndPrintObject(y, back(x, COL), &c, COL, FALSE, 0, 0);
X SetConstraint(c, back(y, ROW), size(y, ROW), fwd(y, ROW));
X FixAndPrintObject(y, back(y,ROW), &c, ROW, FALSE, size(y,ROW), 0);
X *** */
X FixAndPrintObject(y, back(x, COL), back(x, COL), fwd(x, COL),
X COL, LAST_ADJUST, FALSE, LAST_ADJUST, 0, 0);
X FixAndPrintObject(y, back(y,ROW), back(y, ROW), fwd(y, ROW),
X ROW, LAST_ADJUST, FALSE, LAST_ADJUST, size(y,ROW), 0);
X prec_back = back(y, ROW); prec_fwd = fwd(y, ROW);
X }
X DisposeChild(NextDown(link));
X break;
X
X
X case GAP_OBJ:
X
X GapCopy(prec_gap, gap(y));
X DisposeChild(NextDown(link));


X break;
X
X
X default:
X

X Error(INTERN, &fpos(y), "Promote (root): %s", Image(type(y)));


X break;
X
X }
X }

X debug0(DGS, D, "Promote returning (root galley).");
X return;
X }
X
X /* prepare the promotion */
X if( external(dest) )
X { if( threaded(dest) )
X { Parent(tmp1, UpDim(dest, COL));
X assert( type(tmp1) == COL_THR, "Promote: tmp1 not COL_THR!" );
X y = FindSplitInGalley(x);
X assert( type(y) == SPLIT, "Promote: FindSplitInGalley!" );
X Child(tmp2, DownDim(y, COL));
X assert( type(tmp2) == COL_THR, "Promote: tmp2 not COL_THR!" );
X if( tmp1 != tmp2 )
X { LENGTH b = max(back(tmp1, COL), back(tmp2, COL));
X LENGTH f = max(fwd(tmp1, COL), fwd(tmp2, COL));
X debug0(DSA, D, "calling AdjustSize(tmp1) from Promote (node merging)");
X AdjustSize(tmp1, b, f, COL);
X debug0(DSA, D, "calling AdjustSize(tmp2) from Promote (node merging)");
X AdjustSize(tmp2, b, f, COL);
X MergeNode(tmp1, tmp2);
X }
X }
X link = Up(dest_index);
X }
X else
X { for( link = x; NextDown(link) != stop_link; )
X { Child(y, NextDown(link));
X if( is_index(type(y)) ) MoveLink(NextDown(link), Up(dest_index), PARENT);
X else link = NextDown(link);
X }
X assert( Down(x) != stop_link, "Promote: Down(x) == stop_link!" );
X assert( UpDim(dest, ROW) == UpDim(dest, COL), "Promote: dims!" );
X link = Up(dest);
X }
X
X /* promote components */
X TransferLinks(Down(x), stop_link, link);
X
X debug0(DGS, D, "Promote returning.");
X} /* end Promote */


X
X
X/*@@**************************************************************************/
X/* */

X/* KillGalley(hd) */
X/* */
X/* Kill galley hd, which may be sized or unsized. The galley's index must */
X/* be UNATTACHED; it is moved out of its present location to a secret spot. */
X/* */
X/*****************************************************************************/
X
XKillGalley(hd)
XOBJECT hd;
X{ OBJECT prnt, link, y, z;
X debug2(DGA, D, "[ KillGalley(Galley %s into %s)",
X SymName(actual(hd)), SymName(whereto(hd)));
X assert( type(hd) == HEAD && Up(hd) != hd, "KillGalley: precondition!" );
X Parent(prnt, Up(hd));
X assert( type(prnt) == UNATTACHED, "KillGalley: UNATTACHED precondition!" );
X assert( Up(prnt) != prnt, "KillGalley: prnt!" );
X


X if( ready_galls(hd) != nil )

X { DisposeObject(ready_galls(hd));


X ready_galls(hd) = nil;
X }

X link = hd;
X while( NextDown(link) != hd )
X { Child(y, NextDown(link));


X switch( type(y) )
X {

X case RECEIVING: while( Down(y) != y )


X { Child(z, Down(y));
X DetachGalley(z);
X }

X DeleteNode(y);
X break;
X
X case RECEPTIVE: assert( Down(y) == y, "KillGalley: RECEPTIVE!" );
X DeleteNode(y);
X break;
X
X case UNATTACHED: assert( Down(y) != y, "KillGalley: UNATTACHED!" );
X Child(z, Down(y));
X KillGalley(z);
X break;
X
X case HEAD: Error(INTERN, &fpos(y), "KillGalley: HEAD!");
X break;
X
X default: DisposeChild(NextDown(link));


X break;
X }
X }
X

X /* move index into dead_store */
X MakeDead(prnt);
X debug0(DGA, D, "] KillGalley returning.");
X} /* end KillGalley */


X
X
X/*@@**************************************************************************/
X/* */

X/* FreeGalley(hd, stop_link, inners, relocate_link, sym) */
X/* */
X/* Free galley hd up to but not including stop_link. *Inners is well- */
X/* defined, either nil or an ACAT of galleys to be flushed. */
X/* */
X/* Relocate_link defines what to do any galley attached to one of the */
X/* freed targets. If it is non-nil, galley hd is searched onwards from */
X/* it to see if a target can be found there. If so, the galley is */
X/* relocated to just before that point. If not, or if relocate_link is */
X/* nil, the galley is freed and added to *inners for flushing. If such */
X/* galley's whereto() is sym, it is freed, not relocated, because the */
X/* cause of this call to FreeGalley is also targeted to sym, and it will */
X/* consume all possible targets of sym. */
X/* */
X/*****************************************************************************/
X
XFreeGalley(hd, stop_link, inners, relocate_link, sym)
XOBJECT hd, stop_link, *inners, relocate_link, sym;
X{ OBJECT link, y, z, zlink, srch, index;
X assert( type(hd) == HEAD && sized(hd), "FreeGalley: pre!");
X assert( Up(hd) != hd, "FreeGalley: Up(hd)!" );
X assert( *inners == nil || type(*inners) == ACAT, "FreeGalley: ACAT!" );
X debug3(DGA, D, "[ FreeGalley(Galley %s into %s); rl %s nil",
X SymName(actual(hd)), SymName(whereto(hd)), relocate_link==nil ? "==":"!=");
X
X /* close targets and move or flush any inner galleys */
X for( link = Down(hd); link != stop_link; link = NextDown(link) )
X { Child(y, link);
X if( type(y) == RECEIVING && actual(actual(y)) == InputSym )
X Error(WARN, &fpos(actual(y)), "forcing galley past input point");
X else if( type(y) == RECEIVING )
X {
X /* either relocate or free each galley */
X for( zlink = Down(y); zlink != y; )
X { Child(z, zlink);
X zlink = NextDown(zlink);
X assert( type(z) == HEAD, "FreeGalley/RECEIVING: type(z) != HEAD!" );
X debug1(DGA, D, "FreeGalley examining galley %s", SymName(actual(z)));
X if( relocate_link != nil && whereto(z) != sym &&
X (srch = SearchGalley(relocate_link, whereto(z), TRUE,
X FALSE, TRUE, FALSE)) != nil )
X { DetachGalley(z);
X Parent(index, Up(z));
X MoveLink(Up(index), Up(srch), PARENT); /* just before new dest */
X }
X else
X { debug0(DGA, D, " calling FreeGalley from FreeGalley");
X FreeGalley(z, z, inners, nil, sym);
X if( *inners == nil ) *inners = New(ACAT);
X Link(*inners, y);
X }
X }
X non_blocking(y) = TRUE;
X }
X else if( type(y) == RECEPTIVE ) non_blocking(y) = TRUE;
X }
X debug0(DGA, D, "] FreeGalley returning.");
X} /* end FreeGalley */


X
X
X/*****************************************************************************/
X/* */

X/* Interpose(z, typ, x, y) */
X/* */
X/* Insert a new typ object above z. Its sizes are to be taken from x */
X/* (column) and y (row). */
X/* */
X/*****************************************************************************/
X
XInterpose(z, typ, x, y)
XOBJECT z; int typ; OBJECT x, y;
X{ OBJECT encl = New(typ);
X FposCopy(fpos(encl), fpos(y));
X ReplaceNode(encl, z); Link(encl, z);
X back(encl, COL) = back(x, COL);
X fwd(encl, COL) = fwd(x, COL);
X back(encl, ROW) = back(y, ROW);
X fwd(encl, ROW) = fwd(y, ROW);
X} /* end Interpose */
X
X/*@@**************************************************************************/
X/* */
X/* BOOLEAN TargetSymbol(x, sym) */
X/* */
X/* Examine the parameters of closure x, which is known to have a @Target. */
X/* Return TRUE if the target is preceding, and set sym to the symbol value. */
X/* */
X/*****************************************************************************/
X
XBOOLEAN TargetSymbol(x, sym)
XOBJECT x, *sym;
X{ OBJECT y, link, cr, lpar, rpar;
X debug1(DGS, D, "TargetSymbol( %s )", EchoObject(null, x));
X assert( type(x) == CLOSURE, "TargetSymbol: type(x) != CLOSURE!" );
X assert( has_target(actual(x)), "TargetSymbol: x has no target!" );
X
X /* search the free variable list of x for @Target */
X cr = nil;
X for( link = Down(x); link != x; link = NextDown(link) )
X { Child(y, link);
X if( type(y) == PAR && is_target(actual(y)) )
X { assert( Down(y) != y, "TargetSymbol: Down(PAR)!" );
X Child(cr, Down(y));


X break;
X }
X }
X

X /* search the children list of actual(x) for a default value of @Target */
X if( cr == nil )
X for( link = Down(actual(x)); link != actual(x); link = NextDown(link) )
X { Child(y, link);
X if( is_target(y) )
X { cr = sym_body(y);


X break;
X }
X }
X

X if( cr != nil )
X {
X /* check that cr is indeed a cross-reference object */
X debug1(DGS, DD, "TargetSymbol examining %s", EchoObject(null, cr));
X debug1(DGS, DD, " type(cr) = %s", Image( (int) type(cr)) );
X if( type(cr) != CROSS )
X Error(FATAL, &fpos(cr), "target of %s is not a cross-reference",
X SymName(actual(x)));
X
X /* extract *sym from the left parameter */
X Child(lpar, Down(cr));
X if( type(lpar) != CLOSURE )
X Error(FATAL,&fpos(lpar),"left parameter of %s is not a symbol",KW_CROSS);
X *sym = actual(lpar);
X
X /* extract direction from the right parameter */
X Child(rpar, NextDown(Down(cr)));
X if( type(rpar) != WORD || (strcmp(string(rpar), KW_PRECEDING) != 0 &&
X strcmp(string(rpar), KW_FOLLOWING) != 0) )
X Error(WARN, &fpos(rpar), "replacing %s%s? by %s%s%s",
X SymName(actual(lpar)), KW_CROSS, SymName(actual(lpar)),
X KW_CROSS, KW_FOLLOWING);
X return type(rpar) == WORD && strcmp(string(rpar), KW_PRECEDING) == 0;
X }
X else
X { Error(INTERN, &fpos(x), "TargetSymbol: couldn't find x's @Target");
X return FALSE;
X }
X} /* end TargetSymbol */


X
X
X/*@@**************************************************************************/
X/* */

X/* int CheckConstraint(preceder, follower) */
X/* */
X/* Check the ordering relation between components preceder and follower, */
X/* and return its current status: */
X/* */
X/* CLEAR follower definitely follows preceder, and always will; */
X/* PROMOTE follower is not prevented from following preceder; */
X/* CLOSE follower must move down its galley to follow preceder; */
X/* BLOCK follower cannot be guaranteed to follow preceder. */
X/* */
X/*****************************************************************************/
X
Xint CheckConstraint(preceder, follower)
XOBJECT preceder, follower;
X{ OBJECT prec_galley, foll_galley, z; int res;
X debug2(DGS, D, "CheckConstraint( %s, %s )",
X EchoObject(null, preceder), EchoObject(null, follower));
X Parent(prec_galley, Up(preceder));
X Parent(foll_galley, Up(follower));
X if( prec_galley == foll_galley )
X { res = CLOSE;
X for( z = Up(follower); z != foll_galley; z = pred(z, CHILD) )
X if( z == Up(preceder) )
X { res = CLEAR;
X break;
X }
X }
X else
X { res = PROMOTE;
X while( Up(prec_galley) != prec_galley )
X { Parent(z, Up(prec_galley)); /* index of galley */
X Parent(prec_galley, Up(z)); /* enclosing galley */
X if( prec_galley == foll_galley )
X { res = BLOCK;


X break;
X }
X }
X }

X debug1(DGS, D, "CheckConstraint returning %s", Image(res));
X return res;
X} /* end CheckConstraint */
END_OF_FILE
if test 28732 -ne `wc -c <'lout/z22.c'`; then
echo shar: \"'lout/z22.c'\" unpacked with wrong size!
fi
# end of 'lout/z22.c'
fi
echo shar: End of archive 6 \(of 30\).
cp /dev/null ark6isdone

Jeff Kingston

unread,
Jun 1, 1993, 1:17:36 AM6/1/93
to
Submitted-by: je...@joyce.cs.su.oz.au (Jeff Kingston)
Posting-number: Volume 37, Issue 105
Archive-name: lout/part07
Environment: UNIX

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: lout/doc/tr.eq/s2 lout/z03.c lout/z08.c
# Wrapped by kent@sparky on Sun May 30 19:43:55 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 7 (of 30)."'
if test -f 'lout/doc/tr.eq/s2' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.eq/s2'\"
else
echo shar: Extracting \"'lout/doc/tr.eq/s2'\" \(6731 characters\)
sed "s/^X//" >'lout/doc/tr.eq/s2' <<'END_OF_FILE'
X@Section
X @Title { Symbols }
X@Begin
X@PP
XEq prints characters in the fonts appropriate for mathematics:
X@ID {
X@Code "x - 2"
X|7ct
X@Eq { x-2 }
X}
XHere @Eq {x} is in Italic, @Eq { 2 } is in Roman, and @Eq { minus } is
Xfrom the Symbol font. The character @Code "-" is a @I symbol which
Xstands for {@Eq {minus}}, and @Code "2" is also a symbol, standing for
X{@Eq { 2 }}. Eq includes a vast number of symbols:
X@ID {
X@Code "Omega delta int partial club"
X|7ct
X@Eq { Omega delta int partial club }
X}
XThe summary at the end of this report has the complete list.
X@PP
XSymbols whose names are made from letters should be separated from each
Xother by at least one space or end of line, as was done above, or else
XEq will become confused:
X@ID {
X@Code "Omegadelta"
X|7ct
X@Eq { Omegadelta }
X}
XSymbols whose names are made from digits and punctuation characters can,
Xhowever, be run together with each other and with symbols made from
Xletters:
X@ID {
X@Code "Omega-delta<=2"
X|7ct
X@Eq { Omega-delta<=2 }
X}
XThis rule applies throughout the Lout world.
X@PP
XSome symbols join objects together in mathematical ways:
X@ID {
X@Code "x sub 2"
X|7ct
X@Eq { x sub 2 }
X}
XHere the @Code "sub" symbol has taken the object just to its left, and
Xthe object just to its right, and joined them into one object in the
Xform of a subscript. The two objects are called the left and right
Xparameters of {@Code "sub"}, and they may be arbitrary Lout objects.
X@PP
XOther symbols of a similar kind include {@Code "sup"} for
Xsuperscripting, @Code "over" for built-up fractions, and @Code "from"
Xand @Code "to" for the lower and upper limits of sums, products,
Xetc. These symbols may be used together to produce complicated
Xequations with astonishing ease:
X@ID {
X@Code {
X"big sum from i=0 to n r sup i"
X"= {r sup n+1 - 1} over r-1"
X}
X||7ct
X@Eq { big sum from i=0 to n r sup i
X= {r sup n+1 - 1} over r-1
X}
X}
XHere @Code "sum" is just the @Eq { summation } symbol; @Code "from" and
X@Code "to" do all the work of placing the limits. They are quite
Xindependent, so either or both may be omitted. To get a superscript
Xdirectly over a subscript, use the @Code "supp" and @Code "on" symbols:
X@ID {
X@Code "A supp 2 on 1"
X|7ct
X@Eq { A supp 2 on 1 }
X}
XThese two symbols should always be used together as shown.
X@PP
XAs usual in Lout, braces are used to group something into an indivisible
Xobject. Leaving them out creates ambiguities:
X@ID @Code "a sup b over c"
XThere are two possible interpretations for this:
X@IndentedList
X@LI {
X@Code "{a sup b} over c"
X|7ct
X@Eq { {a sup b} over c }
X}
X@LI {
X@Code "a sup {b over c}"
X|7ct
X@Eq { a sup {b over c} }
X}
X@EndList
XEq chooses between them in the following way. Every symbol that takes a
Xparameter also has a {@I precedence}, which is a number. For example,
X@Code "sup" has precedence 60 and @Code "over" has precedence 54. The
Xsymbol with the highest precedence wins the object lying between them,
Xso in the above case the first interpretation is chosen. If two symbols
Xof equal precedence compete for an object, the association is towards
Xthe left:
X@ID {
X@Code "a sup b sub 2"
X|7ct
X@Eq { a sup b sub 2 }
X}
XIn this case it is more probable that the following right association
Xwas actually wanted:
X@ID {
X@Code "a sup { b sub 2 }"
X|7ct
X@Eq { a sup { b sub 2 } }
X}
X@PP
XWhite space between two objects is considered to be a symbol with
Xprecedence 7, which is lower than the precedence of any Eq symbol; but
Xif the two objects are immediately adjacent the precedence is 102, which
Xis higher than the precedence of any Eq symbol. Compare these three
Xexamples:
X@IL
X@LI {
X@Code "big sum from i=0 to n"
X|7ct
X@Eq { big sum from i=0 to n }
X}
X@LI {
X@Code "big sum from {i = 0} to n"
X|7ct
X@Eq { big sum from {i = 0} to n }
X}
X@LI {
X@Code "big sum from i = 0 to n"
X|7ct
X@Eq { big sum from i = 0 to n }
X}
X@EL
Xand you will see that some care is needed on this point. Braces can
Xalways be used to override precedence and associativity,
Xand when in doubt the easiest course is to insert them. Although
XLout allows symbols to associate towards the left or right, Eq chooses
Xto have only left associative symbols. The summary at the end of this
Xreport gives the precedence of every symbol.
X@PP
XThe @I matrix symbol {@PageMark matrix} builds an array of objects:
X@ID {
X@Code {
X"matrix"
X" atleft { blpar }"
X" atright { brpar }"
X"{ x sup 2 above x above 1"
X" nextcol"
X" y sup 2 above y above 1"
X" nextcol"
X" z sup 2 above z above 1"
X"}"
X}
X||7ct
X@Eq {
Xmatrix
X atleft { blpar }
X atright { brpar }
X{ x sup 2 above x above 1
X nextcol
X y sup 2 above y above 1
X nextcol
X z sup 2 above z above 1
X}
X}
X}
XThe @Code atleft and @Code atright options place vertically scaled
Xversions of their
Xvalues at each side; if either is omitted the value is taken to be an
Xempty object of zero width by default. The right parameter of @Code
Xmatrix is the array itself. It is a sequence of columns separated by
X@Code nextcol symbols; each column is a sequence of objects separated by
X@Code above symbols.
X@PP
XThe @Code nextcol and @Code above symbols have low precedence, but not
Xas low as white space between two objects. Therefore, unless the
Xentries in the array are very simple, it is safest to enclose each of
Xthem in braces.
X@PP
XColumns built with the @Code above symbol have their objects centred in
Xthe column. Also available are @Code labove for left-justified columns,
X@Code cabove meaning the same as {@Code above}, @Code rabove for
Xright-justified columns, and @Code mabove for alignment along column
Xmarks. Each column should contain only one kind of @Code above symbol
X(although adventurous users might be able to get some mixtures to work), but
Xdifferent columns may differ. For example,
X@ID @Code {
X"@R \"Chain rule:\" labove @R \"Product rule:\""
X"nextcol"
X"{df over dx ^= df over dy cdot dy over dx}"
X"mabove"
X"{dfg over dy ^= f ` dg over dx + g df over dx}"
X}
Xhas result
X@ID @Eq {
X @R "Chain rule:" labove @R "Product rule:"
X nextcol
X {df over dx ^= df over dy cdot dy over dx}
X mabove
X {dfg over dy ^= f ` dg over dx + g df over dx}
X}
XAs this last example shows, it is @Code nextcol and the various @Code
Xabove symbols that lay out the array; @Code matrix attaches the @Code
Xatleft and @Code atright options and makes sure the result appears in
Xthe correct vertical position relative to the rest of the equation. So
Xthe right parameter of @Code matrix may be any object.
X@PP
XEach of the Eq symbols that takes parameters also has a @Code gap
Xoption, which controls the amount of space inserted by the symbol:
X@IL
X@LI {
X@Code "x over y"
X|7ct
X@Eq { x over y }
X}
X@LI {
X6c @Wide @Code "x over gap { 3p } y"
X|7ct
X@Eq { x over gap { 3p } y }
X}
X@EL
XEq usually gets the spacing right without help.
X@End @Section
END_OF_FILE
if test 6731 -ne `wc -c <'lout/doc/tr.eq/s2'`; then
echo shar: \"'lout/doc/tr.eq/s2'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.eq/s2'
fi
if test -f 'lout/z03.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/z03.c'\"
else
echo shar: Extracting \"'lout/z03.c'\" \(35079 characters\)
sed "s/^X//" >'lout/z03.c' <<'END_OF_FILE'
X/*@z03.c:File Service:DefineFile(), FirstFile()@**************************** */


X/* */
X/* LOUT: A HIGH-LEVEL LANGUAGE FOR DOCUMENT FORMATTING (VERSION 2.03) */
X/* COPYRIGHT (C) 1993 Jeffrey H. Kingston */
X/* */
X/* Jeffrey H. Kingston (je...@cs.su.oz.au) */
X/* Basser Department of Computer Science */
X/* The University of Sydney 2006 */
X/* AUSTRALIA */
X/* */
X/* This program is free software; you can redistribute it and/or modify */
X/* it under the terms of the GNU General Public License as published by */
X/* the Free Software Foundation; either version 1, or (at your option) */
X/* any later version. */
X/* */
X/* This program is distributed in the hope that it will be useful, */
X/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
X/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
X/* GNU General Public License for more details. */
X/* */
X/* You should have received a copy of the GNU General Public License */
X/* along with this program; if not, write to the Free Software */
X/* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
X/* */

X/* FILE: z03.c */
X/* MODULE: File Service */
X/* EXTERNS: InitFiles(), AddToPath(), DefineFile(), FirstFile(), */
X/* NextFile(), FileNum(), FileName(), EchoFilePos(), */
X/* OpenFile(), ReadFromFile(), AppendToFile(), CloseFiles() */


X/* */
X/*****************************************************************************/
X#include "externs"

X#define MAX_TYPES 9 /* number of file types */
X#define MAX_PATHS 6 /* number of search paths */
X#define TAB_MASK 0xFF /* mask forces <= MAX_FILES */
X
X#define file_number(x) word_font(x) /* file number of file x */
X#define updated(x) broken(x) /* TRUE when x is updated */
X#define path(x) back(x, COL) /* search path for file x */
X
Xstatic int file_count; /* total number of files */
Xstatic OBJECT fvec[MAX_FILES] = { nil }; /* the file table */
Xstatic OBJECT file_list[MAX_TYPES]; /* files of each type */
Xstatic OBJECT file_path[MAX_PATHS]; /* the search paths */
X#ifdef DEBUG_ON
Xstatic char *file_types[] /* the type names for debug */
X = { "source", "include", "incgraphic", "database",
X "index", "font", "prepend", "hyph", "hyphpacked" };
X#endif


X
X
X/*****************************************************************************/
X/* */

X/* no_fpos */
X/* */
X/* A null file position value. */
X/* */
X/*****************************************************************************/
X
Xstatic FILE_POS no_file_pos = {0, 0, 0};
XFILE_POS *no_fpos = &no_file_pos;


X
X
X/*****************************************************************************/
X/* */

X/* #define hash(str, val) */
X/* */
X/* Hash the string str and return its value in val. */
X/* */
X/*****************************************************************************/
X
X#define hash(str, val) \
X{ p = str; \
X val = *p++; \
X while( *p ) val += *p++; \
X val = (val * 8) & TAB_MASK; \
X}


X
X
X/*****************************************************************************/
X/* */

X/* InitFiles() */
X/* */
X/* Initialize this module. */
X/* */
X/*****************************************************************************/
X
XInitFiles()
X{ int i;
X for( i = 0; i < MAX_TYPES; i++ ) file_list[i] = New(ACAT);
X for( i = 0; i < MAX_PATHS; i++ ) file_path[i] = New(ACAT);
X fvec[0] = file_list[0]; /* so that no files will be given slot 0 */
X file_count = 1;
X} /* end InitFiles */


X
X
X/*@@**************************************************************************/
X/* */

X/* AddToPath(fpath, dirname) */
X/* */
X/* Add the directory dirname to the end of search path fpath. */
X/* */
X/*****************************************************************************/
X
XAddToPath(fpath, dirname)
Xint fpath; unsigned char *dirname;
X{ OBJECT x;
X x = MakeWord(dirname, no_fpos);
X Link(file_path[fpath], x);
X} /* end AddToPath */


X
X
X/*****************************************************************************/
X/* */

X/* FILE_NUM DefineFile(x, ftype, fpath) */
X/* */
X/* Declare file x, which is a WORD object containing the file name. */
X/* ftype is the file's type; fpath is its search path. */
X/* */
X/*****************************************************************************/
X
XFILE_NUM DefineFile(x, ftype, fpath)
XOBJECT x; int ftype, fpath;
X{ register unsigned char *p;
X register int i;
X assert( type(x) == WORD, "DefineFile: type(x) != WORD!" );
X assert( ftype < MAX_TYPES, "DefineFile: ftype!" );
X debug3(DFS, D, "DefineFile( %s, %s, %d )",
X EchoObject(null,x), file_types[ftype], fpath);
X if( ftype == SOURCE_FILE && (i = strlen(string(x))) >= 3 )
X {
X /* check that file name does not end in ".li" or ".ld" */
X if( strcmp(&string(x)[i-strlen(DATA_SUFFIX)], DATA_SUFFIX) == 0 )
X Error(FATAL, &fpos(x),
X "database file %s where source file expected", string(x));
X if( strcmp(&string(x)[i-strlen(INDEX_SUFFIX)], INDEX_SUFFIX) == 0 )
X Error(FATAL, &fpos(x),
X "database index file %s where source file expected", string(x));
X }
X if( ++file_count >= MAX_FILES ) Error(FATAL, &fpos(x), "too many file names");
X hash(string(x), i);
X while( fvec[i] != nil )
X if( ++i >= MAX_FILES ) i = 0;
X fvec[i] = x;
X Link(file_list[ftype], x);
X file_number(x) = i;
X path(x) = fpath;
X debug1(DFS, D, "DefineFile returning %s",
X i == NO_FILE ? (unsigned char *) "none" : FileName( (FILE_NUM) i));
X return (FILE_NUM) i;
X} /* end DefineFile */


X
X
X/*****************************************************************************/
X/* */

X/* FILE_NUM FirstFile(ftype) */
X/* */
X/* Returns first file of type ftype, else NO_FILE. */
X/* */
X/*****************************************************************************/
X
XFILE_NUM FirstFile(ftype)
Xint ftype;
X{ FILE_NUM i;
X OBJECT link, y;
X debug1(DFS, D, "FirstFile( %s )", file_types[ftype]);
X link = Down(file_list[ftype]);
X if( type(link) == ACAT ) i = NO_FILE;
X else
X { Child(y, link);
X i = file_number(y);
X }
X debug1(DFS, D, "FirstFile returning %s",
X i == NO_FILE ? (unsigned char *) "none" : FileName(i));
X return i;
X} /* end FirstFile */


X
X
X/*@@**************************************************************************/
X/* */

X/* FILE_NUM NextFile(i) */
X/* */
X/* Returns the next file after file i of i's type, else NO_FILE. */
X/* */
X/*****************************************************************************/
X
XFILE_NUM NextFile(i)
XFILE_NUM i;
X{ OBJECT link, y;
X debug1(DFS, D, "NextFile( %s )", EchoObject(null, fvec[i]));
X link = NextDown(Up(fvec[i]));
X if( type(link) == ACAT ) i = NO_FILE;
X else
X { Child(y, link);
X i = file_number(y);
X }
X debug1(DFS, D, "NextFile returning %s",
X i == NO_FILE ? (unsigned char *) "none" : FileName(i));
X return i;
X} /* end NextFile */


X
X
X/*****************************************************************************/
X/* */

X/* FILE_NUM FileNum(str) */
X/* */
X/* Return the file number of the file with name str, else NO_FILE. */
X/* */
X/*****************************************************************************/
X
XFILE_NUM FileNum(str)
Xunsigned char *str;
X{ register unsigned char *p;
X register int i;
X debug1(DFS, D, "FileNum( %s )", str);
X hash(str, i);
X while( fvec[i] != nil && strcmp(string(fvec[i]), str) != 0 )
X if( ++i >= MAX_FILES ) i = 0;
X if( fvec[i] == nil ) i = 0;
X debug1(DFS, D, "FileNum returning %s",
X i == NO_FILE ? (unsigned char *) "none" : FileName( (FILE_NUM) i));
X return (FILE_NUM) i;
X} /* end FileNum */


X
X
X/*****************************************************************************/
X/* */

X/* unsigned char *FileName(fnum) */
X/* */
X/* Return the string name of the file with this number. This is the name */
X/* provided by DefineFile until OpenFile is called, after which it is the */
X/* full path name. */
X/* */
X/*****************************************************************************/
X
Xunsigned char *FileName(fnum)
XFILE_NUM fnum;
X{ OBJECT x;
X assert( fnum > 0 , "FileName: num!" );
X assert( fvec[fnum] != nil, "FileName: fvec[fnum] == nil!" );
X x = fvec[fnum];
X if( Down(x) != x ) Child(x, Down(x));
X return string(x);
X} /* end FileName */


X
X
X/*@@**************************************************************************/
X/* */

X/* unsigned char *EchoFilePos(pos) */
X/* */
X/* Returns a string reporting the value of file position pos. */
X/* */
X/*****************************************************************************/
X
Xstatic unsigned char buff[2][MAX_LINE]; static bp = 1;
X
Xstatic append_fpos(pos)
XFILE_POS *pos;
X{ OBJECT x;
X x = fvec[file_num(*pos)];
X assert( x != nil, "EchoFilePos: fvec[] entry is nil!" );
X if( file_num(fpos(x)) > 0 )
X { append_fpos( &fpos(x) );
X if( strlen(buff[bp]) + 2 >= MAX_LINE )
X Error(FATAL,no_fpos,"file position %s... is too long to print", buff[bp]);
X strcat(buff[bp], " /");
X }
X if( strlen(buff[bp]) + strlen(string(x)) + 13 >= MAX_LINE )
X Error(FATAL, no_fpos, "file position %s... is too long to print", buff[bp]);
X sprintf(&buff[bp][strlen(buff[bp])], " \"%s\"", string(x));
X if( line_num(*pos) != 0 )
X sprintf(&buff[bp][strlen(buff[bp])]," %d,%d",line_num(*pos), col_num(*pos));
X} /* end append_fpos */
X
Xunsigned char *EchoFilePos(pos)
XFILE_POS *pos;
X{ bp = (bp + 1) % 2;
X strcpy(buff[bp], "");
X if( file_num(*pos) > 0 ) append_fpos(pos);
X return buff[bp];
X} /* end EchoFilePos */


X
X
X/*****************************************************************************/
X/* */

X/* FILE_POS *PosOfFile(fnum) */
X/* */
X/* Returns a pointer to the file position where file fnum was encountered. */
X/* */
X/*****************************************************************************/
X
XFILE_POS *PosOfFile(fnum)
XFILE_NUM fnum;
X{ OBJECT x;
X x = fvec[fnum];
X assert( x != nil, "PosOfFile: fvec[] entry is nil!" );
X return &fpos(x);
X}


X
X
X/*****************************************************************************/
X/* */

X/* FILE *SearchPath(str, fpath, check_ld, full_name, xfpos) */
X/* */
X/* Search the given path for a file whose name is str. If found, open */
X/* it; return the resulting FILE *. */
X/* */
X/* If check_ld is TRUE, it means that the file to be opened is a .li file */
X/* and OpenFile() is required to check whether the corresponding .ld file */
X/* is present. If it is, then the search must stop. */
X/* */
X/* Also return the full path name in object *full_name if reqd, else nil. */
X/* */
X/*****************************************************************************/
X
Xstatic FILE *SearchPath(str, fpath, check_ld, full_name, xfpos)
Xunsigned char *str; OBJECT fpath; BOOLEAN check_ld;
XOBJECT *full_name; FILE_POS *xfpos;
X{
X unsigned char buff[MAX_LINE]; OBJECT link, y; FILE *fp;
X debug3(DFS, DD, "SearchPath(%s, %s, %s, -)", str, EchoObject(null, fpath),
X bool(check_ld));
X *full_name = nil;
X if( strcmp(str, "-") == 0 )
X { fp = stdin;
X debug0(DFS, DD, " opened stdin");
X }
X else if( str[0] == '/' )
X { fp = fopen(str, "r");
X debug1(DFS, DD, fp==null ? " failed on %s" : " succeeded on %s", str);
X }
X else
X { fp = null;
X for( link = Down(fpath); fp==null && link != fpath; link = NextDown(link) )
X { Child(y, link);
X if( string(y)[0] == '\0' )
X { strcpy(buff, str);
X fp = fopen(str, "r");
X debug1(DFS, DD, fp==null ? " failed on %s" : " succeeded on %s", str);
X }
X else
X { if( strlen(string(y)) + 1 + strlen(str) >= MAX_LINE )
X Error(FATAL, &fpos(y), "file path name %s/%s is too long",
X string(y), str);
X sprintf(buff, "%s/%s", string(y), str);
X fp = fopen(buff, "r");
X debug1(DFS, DD, fp==null ? " failed on %s" : " succeeded on %s",buff);
X if( fp != null ) *full_name = MakeWord(buff, xfpos);
X }
X if( fp == null && check_ld )
X { strcpy(&buff[strlen(buff) - strlen(INDEX_SUFFIX)], DATA_SUFFIX);
X fp = fopen(buff, "r");
X debug1(DFS,DD,fp==null ? " failed on %s" : " succeeded on %s", buff);
X if( fp != null )
X { fclose(fp);
X debug0(DFS, D, "SearchPath returning null (adjacent .ld file)");
X return null;
X }
X }
X }
X }
X debug1(DFS, DD, "SearchPath returning (fp %s null)", fp==null ? "==" : "!=");
X return fp;
X} /* end SearchPath */


X
X
X/*****************************************************************************/
X/* */

X/* FILE *OpenFile(fnum, check_ld) */
X/* */
X/* Open for reading the file whose number is fnum. This involves */
X/* searching for it along its path if not previously opened. */
X/* */
X/* If check_ld is TRUE, it means that the file to be opened is a .li file */
X/* and OpenFile() is required to check whether the corresponding .ld file */
X/* is present. If it is, then the search must stop. */
X/* */
X/*****************************************************************************/
X
XFILE *OpenFile(fnum, check_ld)
XFILE_NUM fnum; BOOLEAN check_ld;
X{ FILE *fp; OBJECT full_name, y;
X ifdebug(DPP, D, ProfileOn("OpenFile"));
X debug2(DFS, D, "OpenFile(%s, %s)", FileName(fnum), bool(check_ld));
X if( Down(fvec[fnum]) != fvec[fnum] )
X { Child(y, Down(fvec[fnum]));
X fp = fopen(string(y), "r");
X debug1(DFS,DD,fp==null ? " failed on %s" : " succeeded on %s", string(y));
X }
X else
X { fp = SearchPath(string(fvec[fnum]), file_path[path(fvec[fnum])],
X check_ld, &full_name, &fpos(fvec[fnum]));
X if( full_name != nil ) Link(fvec[fnum], full_name);
X }
X ifdebug(DPP, D, ProfileOff("OpenFile"));
X debug1(DFS, D, "OpenFile returning (fp %s null)", fp==null ? "==" : "!=");
X return fp;
X} /* end OpenFile */


X
X
X/*****************************************************************************/
X/* */

X/* FILE *OpenIncGraphicFile(str, typ, full_name, xfpos) */
X/* */
X/* Open for reading the @IncludeGraphic file str; typ is INCGRAPHIC or */
X/* SINCGRAPHIC. Return the full name in full_name. */
X/* */
X/*****************************************************************************/
X
XFILE *OpenIncGraphicFile(str, typ, full_name, xfpos)
Xunsigned char *str; unsigned char typ; OBJECT *full_name; FILE_POS *xfpos;
X{ FILE *fp; int p;
X debug2(DFS, D, "OpenIncGraphicFile(%s, %s, -)", str, Image(typ));
X assert( typ == INCGRAPHIC || typ == SINCGRAPHIC, "OpenIncGraphicFile!" );
X p = (typ == INCGRAPHIC ? INCLUDE_PATH : SYSINCLUDE_PATH);
X fp = SearchPath(str, file_path[p], FALSE, full_name, xfpos);
X if( *full_name == nil ) *full_name = MakeWord(str, xfpos);
X debug2(DFS, D, "OpenIncGraphicFile returning (fp %s null, *full_name = %s)",
X fp==null ? "==" : "!=", string(*full_name));
X return fp;
X} /* end OpenIncGraphicFile */


X
X
X/*@@**************************************************************************/
X/* */

X/* OBJECT ReadFromFile(fnum, pos, sym) */
X/* */
X/* Read an object from file fnum starting at position pos. */
X/* The object may include @Env operators defining its environment. */
X/* If sym != nil, sym is the symbol which is to be read in. */
X/* */
X/*****************************************************************************/
X
XOBJECT ReadFromFile(fnum, pos, sym)
XFILE_NUM fnum; long pos; OBJECT sym;
X{ OBJECT t, res; int ipos;
X ifdebug(DPP, D, ProfileOn("ReadFromFile"));
X ifdebug(DFS, D, ipos = (int) pos);
X debug3(DFS, D, "ReadFromFile(%s, %d, %s)", FileName(fnum), ipos,SymName(sym));
X LexPush(fnum, (int) pos, DATABASE_FILE);
X SwitchScope(sym);
X t = LexGetToken();
X if( type(t) != LBR )
X { debug1(DFS, D, " following because type(t) = %s", Image(type(t)));
X Error(FATAL, &fpos(t),"syntax error (missing %s) in database file", KW_LBR);
X }
X res = Parse(&t, StartSym, FALSE, FALSE);
X if( t != nil || type(res) != CLOSURE )
X { debug1(DFS, D, " following because of %s", t != nil ? "t" : "type(res)");
X Error(FATAL, &fpos(res), "syntax error in database file");
X }
X UnSwitchScope(sym);
X LexPop();
X debug1(DFS, D, "ReadFromFile returning %s", EchoObject(null, res));
X ifdebug(DPP, D, ProfileOff("ReadFromFile"));
X return res;
X} /* end ReadFromFile */
X
X
Xstatic FILE_NUM last_write_fnum = NO_FILE;
Xstatic FILE *last_write_fp = null;


X
X
X/*****************************************************************************/
X/* */

X/* static WriteClosure(x) */
X/* */
X/* Write closure x to file last_write_fp, without enclosing braces and */
X/* without any environment attached. */
X/* */
X/*****************************************************************************/
X
Xstatic BOOLEAN need_lvis(sym) /* true if @LVis needed before sym */
XOBJECT sym;
X{ return !visible(sym) &&
X enclosing(sym) != StartSym &&
X type(enclosing(sym)) == LOCAL;
X} /* end need_lvis */
X
Xstatic WriteClosure(x)
XOBJECT x;
X{ OBJECT y, link, z, sym;
X BOOLEAN npar_seen, name_printed;
X static WriteObject();
X
X sym = actual(x); npar_seen = FALSE; name_printed = FALSE;


X for( link = Down(x); link != x; link = NextDown(link) )
X { Child(y, link);

X if( type(y) == PAR ) switch( type(actual(y)) )
X {
X case LPAR:
X
X assert( Down(y) != y, "WriteObject/CLOSURE: LPAR!" );
X Child(z, Down(y));
X WriteObject(z, (int) precedence(sym));
X fputs(" ", last_write_fp);
X break;
X
X
X case NPAR:
X
X assert( Down(y) != y, "WriteObject/CLOSURE: NPAR!" );
X Child(z, Down(y));
X if( !name_printed )
X { if( need_lvis(sym) )
X { fputs(KW_LVIS, last_write_fp);
X fputs(" ", last_write_fp);
X }
X fputs(SymName(sym), last_write_fp);
X name_printed = TRUE;
X }
X fputs("\n ", last_write_fp);
X fputs(SymName(actual(y)), last_write_fp);
X fprintf(last_write_fp, " %s ", KW_LBR);
X WriteObject(z, NO_PREC);
X fprintf(last_write_fp, " %s", KW_RBR);
X npar_seen = TRUE;
X break;
X
X
X case RPAR:
X
X assert( Down(y) != y, "WriteObject/CLOSURE: RPAR!" );
X Child(z, Down(y));
X if( !name_printed )
X { if( need_lvis(sym) )
X { fputs(KW_LVIS, last_write_fp);
X fputs(" ", last_write_fp);
X }
X fputs(SymName(sym), last_write_fp);
X name_printed = TRUE;
X }
X fputs(npar_seen ? "\n" : " ", last_write_fp);
X if( has_body(sym) )
X { fputs(KW_LBR, last_write_fp);
X fputs(" ", last_write_fp);
X WriteObject(z, NO_PREC);
X fputs(" ", last_write_fp);
X fputs(KW_RBR, last_write_fp);
X }
X else WriteObject(z, (int) precedence(sym));


X break;
X
X
X default:
X

X Error(INTERN, &fpos(y), "WriteClosure: %s", Image(type(actual(y))) );
X break;
X


X } /* end switch */

X } /* end for each parameter */
X if( !name_printed )
X { if( need_lvis(sym) )
X { fputs(KW_LVIS, last_write_fp);
X fputs(" ", last_write_fp);
X }
X fputs(SymName(sym), last_write_fp);
X name_printed = TRUE;
X }
X} /* end WriteClosure */
X
X/*****************************************************************************/
X/* */
X/* static WriteObject(x, outer_prec) */
X/* */
X/* Write object x to file last_write_fp, assuming it is a subobject of an */
X/* object and the precedence of operators enclosing it is outer_prec. */
X/* */
X/*****************************************************************************/
X
Xstatic WriteObject(x, outer_prec)
XOBJECT x; int outer_prec;
X{ OBJECT link, y, gap_obj, sym, env; unsigned char *name;
X int prec, i, last_prec; BOOLEAN braces_needed;
X switch( type(x) )
X {
X
X case WORD:
X
X if( strlen(string(x)) == 0 && outer_prec > ACAT_PREC )
X { fputs(KW_LBR, last_write_fp);
X fputs(KW_RBR, last_write_fp);
X }
X else fputs(string(x), last_write_fp);
X break;
X
X
X case VCAT: prec = VCAT_PREC; goto ETC;
X case HCAT: prec = HCAT_PREC; goto ETC;
X case ACAT: prec = ACAT_PREC; goto ETC;
X
X ETC:
X if( prec < outer_prec ) fputs(KW_LBR, last_write_fp);
X last_prec = prec;


X for( link = Down(x); link != x; link = NextDown(link) )
X { Child(y, link);

X if( type(y) == GAP_OBJ )


X { if( Down(y) == y )

X { assert( type(x) == ACAT, "WriteObject: Down(y) == y!" );
X for( i = 1; i <= vspace(y); i++ ) fputs("\n", last_write_fp);
X for( i = 1; i <= hspace(y); i++ ) fputs(" ", last_write_fp);
X last_prec = (vspace(y) + hspace(y) == 0) ? JUXTA_PREC : ACAT_PREC;
X }
X else
X { Child(gap_obj, Down(y));
X fprintf(last_write_fp, type(x) == ACAT ? " %s" : "\n%s",
X EchoCatOp( (unsigned) type(x), mark(gap(y)), join(gap(y))));
X if( type(gap_obj) != WORD || strlen(string(gap_obj)) != 0 )
X WriteObject(gap_obj, FORCE_PREC);
X fputs(" ", last_write_fp);
X last_prec = prec;
X }
X }
X else
X { if( type(x) == ACAT )
X { OBJECT next_gap; int next_prec;
X if( NextDown(link) != x )
X { Child(next_gap, NextDown(link));
X assert( type(next_gap) == GAP_OBJ, "WriteObject: next_gap!" );
X next_prec = (vspace(next_gap) + hspace(next_gap) == 0)
X ? JUXTA_PREC : ACAT_PREC;
X }
X else next_prec = prec;
X WriteObject(y, max(last_prec, next_prec));
X }
X else WriteObject(y, prec);
X }
X }
X if( prec < outer_prec ) fputs(KW_RBR, last_write_fp);
X break;
X
X
X case ENV:
X
X if( Down(x) == x )
X { /* do nothing */
X }
X else if( Down(x) == LastDown(x) )
X { Child(y, Down(x));
X assert( type(y) == CLOSURE, "WriteObject: ENV/CLOSURE!" );
X assert( LastDown(y) != y, "WriteObject: ENV/LastDown(y)!" );
X Child(env, LastDown(y));
X assert( type(env) == ENV, "WriteObject: ENV/env!" );
X WriteObject(env, NO_PREC);
X fputs(KW_LBR, last_write_fp);
X WriteClosure(y);
X fputs(KW_RBR, last_write_fp);
X fputs("\n", last_write_fp);
X }
X else
X { Child(env, LastDown(x));
X assert( type(env) == ENV, "WriteObject: ENV/ENV!" );
X WriteObject(env, NO_PREC);
X Child(y, Down(x));
X assert( type(y) == CLOSURE, "WriteObject: ENV/ENV+CLOSURE!" );
X WriteObject(y, NO_PREC);


X }
X break;
X
X

X case CLOSURE:
X
X sym = actual(x); env = nil;
X if( LastDown(x) != x )
X { Child(y, LastDown(x));
X if( type(y) == ENV ) env = y;
X }
X
X braces_needed = env != nil ||
X (precedence(sym) <= outer_prec && (has_lpar(sym) || has_rpar(sym)));
X
X /* print environment */
X if( env != nil )
X { fputs(KW_ENV, last_write_fp);
X fputs("\n", last_write_fp);
X WriteObject(env, NO_PREC);
X }
X
X /* print left brace if needed */
X if( braces_needed ) fputs(KW_LBR, last_write_fp);
X
X /* print the closure proper */
X WriteClosure(x);
X
X /* print closing brace if needed */
X if( braces_needed ) fputs(KW_RBR, last_write_fp);
X
X /* print closing environment if needed */
X if( env != nil )
X { fputs("\n", last_write_fp);
X fputs(KW_CLOS, last_write_fp);
X fputs("\n", last_write_fp);


X }
X break;
X
X

X case CROSS:
X
X Child(y, Down(x));
X assert( type(y) == CLOSURE, "WriteObject/CROSS: type(y) != CLOSURE!" );
X fputs(SymName(actual(y)), last_write_fp);
X fputs(KW_CROSS, last_write_fp);
X Child(y, LastDown(x));
X WriteObject(y, FORCE_PREC);
X break;
X
X
X case NULL_CLOS: name = (unsigned char *) KW_NULL; goto SETC;
X case ONE_COL: name = (unsigned char *) KW_ONE_COL; goto SETC;
X case ONE_ROW: name = (unsigned char *) KW_ONE_ROW; goto SETC;
X case WIDE: name = (unsigned char *) KW_WIDE; goto SETC;
X case HIGH: name = (unsigned char *) KW_HIGH; goto SETC;
X case HSCALE: name = (unsigned char *) KW_HSCALE; goto SETC;
X case VSCALE: name = (unsigned char *) KW_VSCALE; goto SETC;
X case SCALE: name = (unsigned char *) KW_SCALE; goto SETC;
X case HCONTRACT: name = (unsigned char *) KW_HCONTRACT; goto SETC;
X case VCONTRACT: name = (unsigned char *) KW_VCONTRACT; goto SETC;
X case HEXPAND: name = (unsigned char *) KW_HEXPAND; goto SETC;
X case VEXPAND: name = (unsigned char *) KW_VEXPAND; goto SETC;
X case PADJUST: name = (unsigned char *) KW_PADJUST; goto SETC;
X case HADJUST: name = (unsigned char *) KW_HADJUST; goto SETC;
X case VADJUST: name = (unsigned char *) KW_VADJUST; goto SETC;
X case ROTATE: name = (unsigned char *) KW_ROTATE; goto SETC;
X case CASE: name = (unsigned char *) KW_CASE; goto SETC;
X case YIELD: name = (unsigned char *) KW_YIELD; goto SETC;
X case FONT: name = (unsigned char *) KW_FONT; goto SETC;
X case SPACE: name = (unsigned char *) KW_SPACE; goto SETC;
X case BREAK: name = (unsigned char *) KW_BREAK; goto SETC;
X case NEXT: name = (unsigned char *) KW_NEXT; goto SETC;
X case OPEN: name = (unsigned char *) KW_OPEN; goto SETC;
X case TAGGED: name = (unsigned char *) KW_TAGGED; goto SETC;
X case INCGRAPHIC: name = (unsigned char *) KW_INCGRAPHIC; goto SETC;
X case SINCGRAPHIC: name = (unsigned char *) KW_SINCGRAPHIC;goto SETC;
X case GRAPHIC: name = (unsigned char *) KW_GRAPHIC; goto SETC;
X
X /* print left parameter, if present */
X SETC:
X if( DEFAULT_PREC <= outer_prec ) fputs(KW_LBR, last_write_fp);
X if( Down(x) != LastDown(x) )
X { Child(y, Down(x));
X WriteObject(y, DEFAULT_PREC);
X fputs(" ", last_write_fp);
X }
X
X /* print the symbol's name */
X fputs(name, last_write_fp);
X
X /* print right parameter, if present */
X if( LastDown(x) != x )
X { Child(y, LastDown(x));
X fputs(" ", last_write_fp);
X if( type(x) == OPEN )
X { fputs(KW_LBR, last_write_fp);
X WriteObject(y, NO_PREC);
X fputs(KW_RBR, last_write_fp);
X }
X else WriteObject(y, DEFAULT_PREC);
X }
X if( DEFAULT_PREC <= outer_prec ) fputs(KW_RBR, last_write_fp);


X break;
X
X
X default:
X

X Error(INTERN, &fpos(x), "WriteObject: type(x) = %s", Image(type(x)));


X break;
X
X } /* end switch */

X} /* end WriteObject */


X
X
X/*****************************************************************************/
X/* */

X/* AppendToFile(x, fnum, pos) */
X/* */
X/* Append object x to file fnum, returning its fseek position in *pos. */
X/* Record the fact that this file has been updated. */
X/* */
X/*****************************************************************************/
X
XAppendToFile(x, fnum, pos)
XOBJECT x; FILE_NUM fnum; int *pos;


X{ unsigned char buff[MAX_LINE], *str;

X ifdebug(DPP, D, ProfileOn("AppendToFile"));
X debug2(DFS, D, "AppendToFile( %s, %s )", EchoObject(null, x), FileName(fnum));
X
X /* open file fnum for writing */
X if( last_write_fnum != fnum )
X { if( last_write_fnum != NO_FILE ) fclose(last_write_fp);
X str = FileName(fnum);
X if( strlen(str) + strlen(NEW_DATA_SUFFIX) >= MAX_LINE )
X Error(FATAL, PosOfFile(fnum), "file name %s%s is too long",
X str, NEW_DATA_SUFFIX);
X sprintf(buff, "%s%s", str, NEW_DATA_SUFFIX);
X last_write_fp = fopen(buff, "a");
X if( last_write_fp == null ) Error(FATAL, &fpos(fvec[fnum]),
X "cannot append to database file %s", buff);
X last_write_fnum = fnum;
X }
X
X /* write x out */
X *pos = (int) ftell(last_write_fp);
X fputs(KW_LBR, last_write_fp);
X WriteObject(x, NO_PREC);
X fprintf(last_write_fp, "%s\n\n", KW_RBR);
X
X /* record the fact that fnum has changed */
X updated(fvec[fnum]) = TRUE;
X ifdebug(DPP, D, ProfileOff("AppendToFile"));
X debug0(DFS, D, "AppendToFile returning.");
X} /* end AppendToFile */


X
X
X/*@@**************************************************************************/
X/* */

X/* CloseFiles() */
X/* */
X/* Close all files and move new versions to the names of old versions. */
X/* */
X/*****************************************************************************/
X
XCloseFiles()
X{ FILE_NUM fnum;
X unsigned char buff[MAX_LINE];
X ifdebug(DPP, D, ProfileOn("CloseFiles"));
X debug0(DFS, D, "CloseFiles()");
X
X /* close off last file opened by AppendToFile above */
X if( last_write_fnum != NO_FILE ) fclose(last_write_fp);
X
X /* get rid of old database files */
X for( fnum = FirstFile(SOURCE_FILE); fnum != NO_FILE; fnum = NextFile(fnum) )
X { sprintf(buff, "%s%s", FileName(fnum), DATA_SUFFIX);
X unlink(buff);
X }
X
X /* move any new database files to the old names, if updated */
X for( fnum = FirstFile(DATABASE_FILE); fnum != NO_FILE; fnum = NextFile(fnum) )
X { if( updated(fvec[fnum]) )
X { sprintf(buff, "%s%s", string(fvec[fnum]), NEW_DATA_SUFFIX);
X debug1(DFS, D, "unlink(%s)", string(fvec[fnum]));
X unlink(string(fvec[fnum])); /* may fail if old version does not exist */
X debug2(DFS, D, "link(%s, %s)", buff, string(fvec[fnum]));
X if( link(buff, string(fvec[fnum])) != 0 )
X Error(INTERN, no_fpos, "link(%s, %s) failed", buff, string(fvec[fnum]));
X debug1(DFS, D, "unlink(%s)", buff);
X if( unlink(buff) != 0 )
X Error(INTERN, no_fpos, "unlink(%s) failed", buff);
X }
X }
X debug0(DFS, D, "CloseFiles returning.");
X ifdebug(DPP, D, ProfileOff("CloseFiles"));
X} /* end CloseFiles */
END_OF_FILE
if test 35079 -ne `wc -c <'lout/z03.c'`; then
echo shar: \"'lout/z03.c'\" unpacked with wrong size!
fi
# end of 'lout/z03.c'
fi
if test -f 'lout/z08.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/z08.c'\"
else
echo shar: Extracting \"'lout/z08.c'\" \(36495 characters\)
sed "s/^X//" >'lout/z08.c' <<'END_OF_FILE'
X/*@z08.c:Object Manifest:Manifest()@******************************************/


X/* */
X/* LOUT: A HIGH-LEVEL LANGUAGE FOR DOCUMENT FORMATTING (VERSION 2.03) */
X/* COPYRIGHT (C) 1993 Jeffrey H. Kingston */
X/* */
X/* Jeffrey H. Kingston (je...@cs.su.oz.au) */
X/* Basser Department of Computer Science */
X/* The University of Sydney 2006 */
X/* AUSTRALIA */
X/* */
X/* This program is free software; you can redistribute it and/or modify */
X/* it under the terms of the GNU General Public License as published by */
X/* the Free Software Foundation; either version 1, or (at your option) */
X/* any later version. */
X/* */
X/* This program is distributed in the hope that it will be useful, */
X/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
X/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
X/* GNU General Public License for more details. */
X/* */
X/* You should have received a copy of the GNU General Public License */
X/* along with this program; if not, write to the Free Software */
X/* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
X/* */

X/* FILE: z08.c */
X/* MODULE: Object Manifest */
X/* EXTERNS: Manifest() */


X/* */
X/*****************************************************************************/
X#include "externs"
X

X#define errorcase() \
X \
X y = MakeWord("", &fpos(x)); \
X ReplaceNode(y, x); \
X DisposeObject(x); \
X x = Manifest(y, env, style, bthr, fthr, target, crs, ok, FALSE); \
X break;


X
X
X/*****************************************************************************/
X/* */

X/* static ReplaceWithSplit(x, bthr, fthr) */
X/* */
X/* Replace object x with a SPLIT object, if threads for this object are */
X/* requested by bthr and/or fthr. */
X/* */
X/*****************************************************************************/
X
X#define ReplaceWithSplit(x, bthr, fthr) \
X if( bthr[ROW] || bthr[COL] || fthr[ROW] || fthr[COL] ) \
X x = insert_split(x, bthr, fthr)
X
Xstatic OBJECT insert_split(x, bthr, fthr)
XOBJECT x; OBJECT bthr[2], fthr[2];
X{ OBJECT res, new_op; int dim;
X debug1(DOM, DD, "ReplaceWithSplit(%s, -)", EchoObject(null, x));
X assert( type(x) != SPLIT, "ReplaceWithSplit: type(x) already SPLIT!" );
X res = New(SPLIT);
X FposCopy(fpos(res), fpos(x));
X ReplaceNode(res, x);
X for( dim = COL; dim <= ROW; dim++ )
X { if( bthr[dim] || fthr[dim] )
X { new_op = New(dim == COL ? COL_THR : ROW_THR);
X thr_state(new_op) = NOTSIZED;
X fwd(new_op, 1-dim) = 0; /* will hold max frame_size */
X back(new_op, 1-dim) = 0; /* will hold max frame_origin */
X FposCopy(fpos(new_op), fpos(x));
X Link(res, new_op);
X Link(new_op, x);
X if( bthr[dim] ) Link(bthr[dim], new_op);
X if( fthr[dim] ) Link(fthr[dim], new_op);
X }
X else Link(res, x);
X }
X
X debug1(DOM, DD, "ReplaceWithSplit returning %s", EchoObject(null, res));
X return res;
X} /* end insert_split */


X
X
X/*@@**************************************************************************/
X/* */

X/* OBJECT ReplaceWithTidy(x) */
X/* */
X/* Replace object x with a tidier version in which juxtapositions are */
X/* folded, etc. If this is not possible, return the original object. */
X/* */
X/*****************************************************************************/
X
XOBJECT ReplaceWithTidy(x)
XOBJECT x;
X{
X static unsigned char buff[MAX_LINE];
X static int buff_len;
X static FILE_POS buff_pos;
X
X OBJECT link, y, tmp, res;
X debug1(DOM, DD, "ReplaceWithTidy( %s )", EchoObject(null, x));


X switch( type(x) )
X {

X case ACAT:
X
X /* flatten any sub-acats, recursively */


X for( link = Down(x); link != x; link = NextDown(link) )
X { Child(y, link);

X if( type(y) == ACAT )
X { tmp = Down(y);
X TransferLinks(tmp, y, link);
X DisposeChild(link);
X link = PrevDown(tmp);
X }
X }
X
X /* now scan along and do the tidying */
X res = nil;
X buff_len = 0;
X FposCopy(buff_pos, fpos(x));


X for( link = Down(x); link != x; link = NextDown(link) )
X { Child(y, link);

X if( type(y) == WORD )
X { if( buff_len + strlen(string(y)) >= MAX_LINE )
X Error(WARN, &fpos(y),"word is too long");
X else
X { if( buff_len == 0 ) FposCopy(buff_pos, fpos(y));
X strcpy(&buff[buff_len], string(y));
X buff_len += strlen(string(y));
X }
X }
X else if( type(y) == GAP_OBJ )
X { if( Down(y) != y || hspace(y) + vspace(y) > 0 )
X { FontStripQuotes(buff, &buff_pos);
X if( strlen(buff) > 0 )
X { tmp = MakeWord(buff, &buff_pos);
X buff_len = 0;


X if( res == nil )

X { res = New(ACAT);
X FposCopy(fpos(res), fpos(x));
X }
X Link(res, tmp);
X Link(res, y);
X }
X }
X }
X else /* error */
X { if( res != nil ) DisposeObject(res);
X debug1(DOM, DD, "ReplaceWithTidy returning %s (unchanged)",
X EchoObject(null, x));
X return x;
X }
X }
X FontStripQuotes(buff, &buff_pos);
X tmp = MakeWord(buff, &buff_pos);
X if( res == nil ) res = tmp;
X else Link(res, tmp);


X ReplaceNode(res, x);
X DisposeObject(x);

X debug1(DOM, DD, "ReplaceWithTidy returning %s", EchoObject(null, res));
X return res;


X
X
X case WORD:
X

X FontStripQuotes(string(x), &fpos(x));
X debug1(DOM, DD, "ReplaceWithTidy returning %s", EchoObject(null, x));
X return x;


X
X
X default:
X

X debug1(DOM, DD, "ReplaceWithTidy returning %s (unchanged)",
X EchoObject(null, x));
X return x;
X
X }
X} /* end ReplaceWithTidy */


X
X
X/*@@**************************************************************************/
X/* */

X/* static float GetScaleFactor(x, str) */
X/* */
X/* Find a scale factor in object x and return it as a float, after checks. */
X/* Incorporate str in any error messages generated. */
X/* */
X/*****************************************************************************/
X
Xstatic float GetScaleFactor(x, str)
XOBJECT x; unsigned char *str;
X{ float scale_factor;
X if( type(x) != WORD )
X { Error(WARN, &fpos(x), "replacing invalid %s by 1.0", str);
X scale_factor = 1.0;
X }
X else if( sscanf(string(x), "%f", &scale_factor) != 1 )
X { Error(WARN, &fpos(x), "replacing invalid %s %s by 1.0", str, string(x));
X scale_factor = 1.0;
X }
X else if( scale_factor < 0.01 )
X { Error(WARN, &fpos(x), "replacing undersized %s %s by 1.0", str, string(x));
X scale_factor = 1.0;
X }
X else if( scale_factor > 100 )
X { Error(WARN, &fpos(x), "replacing oversized %s %s by 1.0", str, string(x));
X scale_factor = 1.0;
X }
X return scale_factor;
X} /* GetScaleFactor */
X
X
Xstatic OBJECT nbt[2] = { nil, nil }; /* constant nil threads */
Xstatic OBJECT nft[2] = { nil, nil }; /* constant nil threads */
Xstatic OBJECT ntarget = nil; /* constant nil target */
X
X/*@@**************************************************************************/
X/* */
X/* OBJECT Manifest(x, env, style, bthr, fthr, target, crs, ok, need_expand) */
X/* */
X/* Manifest object x, interpreted in environment env and style style. */
X/* The result replaces x, and is returned also. */
X/* The manifesting operation converts x from a pure parse tree object */
X/* containing closures and no threads, to an object ready for sizing, */
X/* with fonts propagated to the words, fill styles propagated to the */
X/* ACATs, and line spacings propagated to all interested parties. */
X/* All non-recursive, non-indefinite closures are expanded. */
X/* Threads joining objects on a mark are constructed, and SPLIT objects */
X/* inserted, so that sizing becomes a trivial operation. */
X/* */
X/* Manifest will construct threads and pass them up as children of bthr[] */
X/* and fthr[] whenever non-nil values of these variables are passed in: */
X/* */
X/* bthr[COL] protrudes upwards from x */
X/* fthr[COL] protrudes downwards from x */
X/* bthr[ROW] protrudes leftwards from x */
X/* fthr[ROW] protrudes rightwards from x */
X/* */
X/* If *target != nil, Manifest will expand indefinite closures leading to */
X/* the first @Galley lying within an object of type *target. */
X/* */
X/* Some objects x are not "real" in the sense that they do not give rise */
X/* to rectangles in the final printed document. The left parameter of */
X/* @Wide and similar operators, and the gap following a concatenation */
X/* operator, are examples of such non-real objects. The ok flag is true */
X/* when x is part of a real object. This is needed because some things, */
X/* such as the insinuation of cross references and the breaking of */
X/* lines @Break ACAT objects, only apply to real objects. */
X/* */
X/* If *crs != nil, it points to a list of indexes to cross-references */
X/* which are to be insinuated into the manifested form of x if x is real. */
X/* */
X/* If need_expand is TRUE it forces closure x to expand. */
X/* */
X/*****************************************************************************/
X
XOBJECT Manifest(x, env, style, bthr, fthr, target, crs, ok, need_expand)


XOBJECT x, env; STYLE *style;

XOBJECT bthr[2], fthr[2]; OBJECT *target, *crs;
XBOOLEAN ok, need_expand;
X{ OBJECT bt[2], ft[2], y, link, sym, tag, gaplink, g, ylink, yield, ytag, zlink;
X OBJECT res, res_env, res_env2, hold_env, hold_env2, first_bt, last_ft, z;
X OBJECT firsttag, firstres, prev; float scale_factor;
X int par, perp; GAP res_gap; unsigned res_inc; STYLE new_style;
X BOOLEAN still_backing, done, multiline, symbol_free;
X
X debug2(DOM, D, "[Manifest(%s %s )", Image(type(x)), EchoObject(null, x));
X debug1(DOM, DD, " environment: %s", EchoObject(null, env));
X debug6(DOM, DD, " style: %s; target: %s; threads: %s%s%s%s",
X EchoStyle(style), SymName(*target),
X bthr[COL] ? " up" : "", fthr[COL] ? " down" : "",
X bthr[ROW] ? " left" : "", fthr[ROW] ? " right" : "");
X
X if( type(x) <= ACAT ) switch( type(x) ) /* breaks up oversize switch */


X {
X
X case CLOSURE:
X

X sym = actual(x);
X StyleCopy(save_style(x), *style);
X debug1(DOM, DD, " closure; sym = %s", SymName(sym));
X
X /* expand parameters where possible, and find if they are all free */
X symbol_free = TRUE;


X for( link = Down(x); link != x; link = NextDown(link) )
X { Child(y, link);

X assert( type(y) == PAR, "Manifest/CLOSURE: type(y) != PAR!" );
X Child(z, Down(y));
X if( type(z) != WORD && !has_par(actual(y)) )
X { if( is_tag(actual(y)) || is_key(actual(y)) || type(z) == NEXT )
X { z = Manifest(z, env, style, nbt, nft, &ntarget, crs, FALSE, FALSE);
X z = ReplaceWithTidy(z);
X }
X }
X if( type(z) != WORD ) symbol_free = FALSE;
X }
X
X /* if all parameters are free of symbols, optimize environment */
X if( symbol_free && imports(sym) == nil && enclosing(sym) != StartSym )
X { y = SearchEnv(env, enclosing(sym));
X if( y != nil && type(y) == CLOSURE )
X { env = SetEnv(y, nil);
X hold_env2 = New(ACAT); Link(hold_env2, env);
X }
X else
X { Error(WARN, &fpos(x), "symbol %s used outside %s",
X SymName(sym), SymName(enclosing(sym)));
X hold_env2 = nil;
X }
X }
X else hold_env2 = nil;
X
X if( has_target(sym) && !need_expand )
X {
X /* convert symbols with targets to unsized galleys */
X OBJECT hd = New(HEAD);
X FposCopy(fpos(hd), fpos(x));
X actual(hd) = sym;
X backward(hd) = TargetSymbol(x, &whereto(hd));
X ready_galls(hd) = nil;
X must_expand(hd) = TRUE;
X sized(hd) = FALSE;
X ReplaceNode(hd, x);
X Link(hd, x);
X AttachEnv(env, x);
X x = hd;
X threaded(x) = bthr[COL] != nil || fthr[COL] != nil;
X ReplaceWithSplit(x, bthr, fthr);
X }
X else if(
X *target == sym ? (*target = nil, TRUE) :
X need_expand ? TRUE :
X uses_galley(sym) && !recursive(sym) ? TRUE :
X !indefinite(sym) && !recursive(sym) ? TRUE :
X indefinite(sym) && *target != nil ? SearchUses(sym, *target)
X : FALSE
X )
X {
X /* expand the closure and manifest the result */
X debug1(DOM, DD, "expanding; style: %s", EchoStyle(style));
X x = ClosureExpand(x, env, style, TRUE, crs, &res_env);
X hold_env = New(ACAT); Link(hold_env, res_env);
X debug1(DOM, DD, "recursive call; style: %s", EchoStyle(style));
X x = Manifest(x, res_env, style, bthr, fthr, target, crs, ok, FALSE);
X DisposeObject(hold_env);
X }
X else
X {
X /* indefinite symbol, leave unexpanded */
X AttachEnv(env, x);
X threaded(x) = bthr[COL] != nil || fthr[COL] != nil;
X debug0(DOM, DD, " closure; calling ReplaceWithSplit");
X ReplaceWithSplit(x, bthr, fthr);
X }
X if( hold_env2 != nil ) DisposeObject(hold_env2);
X break;
X
X
X case NULL_CLOS:
X
X StyleCopy(save_style(x), *style);
X ReplaceWithSplit(x, bthr, fthr);
X break;
X
X
X case CROSS:
X
X assert( Down(x) != x && LastDown(x) != Down(x), "Manifest: CROSS child!");
X debug0(DCR, DD, " calling CrossExpand from Manifest/CROSS");
X x = CrossExpand(x, env, style, TRUE, crs, &res_env);
X assert( type(x) == CLOSURE, "Manifest/CROSS: type(x)!" );
X hold_env = New(ACAT); Link(hold_env, res_env);
X /* expand here (calling Manifest immediately makes unwanted cr) */
X x = ClosureExpand(x, res_env, style, FALSE, crs, &res_env2);
X hold_env2 = New(ACAT); Link(hold_env2, res_env2);
X x = Manifest(x, res_env2, style, bthr, fthr, target, crs, ok, TRUE);
X DisposeObject(hold_env);
X DisposeObject(hold_env2);


X break;
X
X
X case WORD:
X

X if( !ok || *crs == nil )
X { word_font(x) = font(*style);
X ReplaceWithSplit(x, bthr, fthr);
X break;
X }
X y = New(ACAT);
X FposCopy(fpos(y), fpos(x));
X ReplaceNode(y, x);
X Link(y, x); x = y;
X /* NB NO BREAK! */


X
X
X case ACAT:
X

X StyleCopy(save_style(x), *style);
X assert(Down(x) != x, "Manifest: ACAT!" );
X link = Down(x); Child(y, link);
X assert( type(y) != GAP_OBJ, "Manifest ACAT: GAP_OBJ is first!" );
X multiline = FALSE;
X
X /* manifest first child and insert any cross references */
X if( type(y) == WORD ) word_font(y) = font(*style);
X else y = Manifest(y, env, style, nbt, nft, target, crs, ok, FALSE);
X if( ok && *crs != nil )
X {
X debug1(DCR, D, " insinuating %s", EchoObject(null, *crs));
X TransferLinks(Down(*crs), *crs, link);
X DisposeObject(*crs);
X *crs = nil;
X }
X prev = y;
X
X for( gaplink = Down(link); gaplink != x; gaplink = NextDown(link) )
X {
X Child(g, gaplink);
X assert( type(g) == GAP_OBJ, "Manifest ACAT: no GAP_OBJ!" );
X link = NextDown(gaplink);
X assert( link != x, "Manifest ACAT: GAP_OBJ is last!" );
X Child(y, link);
X assert( type(y) != GAP_OBJ, "Manifest ACAT: double GAP_OBJ!" );
X
X /* manifest the next child */
X debug1(DOM, DD, " in ACAT (3), style = %s", EchoStyle(style));
X if( type(y) == WORD ) word_font(y) = font(*style);
X else y = Manifest(y, env, style, nbt, nft, target, crs, ok, FALSE);
X
X /* manifest the gap object */
X if( Down(g) != g )
X {
X /* explicit & operator whose value is g's child */
X Child(z, Down(g));
X z = Manifest(z, env, style, nbt, nft, &ntarget, crs, FALSE, FALSE);
X z = ReplaceWithTidy(z);
X GetGap(z, style, &gap(g), &res_inc);
X vspace(g) = hspace(g) = 0;
X }
X else
X {
X /* implicit & operator */
X GapCopy(gap(g), space_gap(*style));
X width(gap(g)) = width(gap(g)) * (vspace(g) + hspace(g));
X if( vspace(g) > 0 && is_definite(type(y)) ) multiline = TRUE;
X }
X debug1(DOM, DD, " in ACAT, gap = %s", EchoLength(width(gap(g))));
X
X /* compress adjacent juxtaposed words of equal font */
X if( type(y) == WORD && width(gap(g)) == 0 && vspace(g)+hspace(g) == 0 )
X { if( units(gap(g)) == FIXED_UNIT && mode(gap(g)) == EDGE_MODE )
X { if( prev!=nil && type(prev)==WORD && word_font(prev)==word_font(y) )
X { if( !mark(gap(g)) )
X { if( strlen(string(prev)) + strlen(string(y)) >= MAX_LINE )
X Error(FATAL, &fpos(prev), "word %s%s is too long",
X string(prev), string(y));
X z = y;
X y = MakeWordTwo(string(prev), string(y), &fpos(prev));
X word_font(y) = word_font(prev);
X MoveLink(link, y, CHILD);
X DisposeObject(z);
X DisposeChild(Up(prev));
X DisposeChild(gaplink);
X }
X }
X }
X }
X prev = y;
X
X /* insinuate any cross-references */
X if( ok && *crs != nil )
X {
X debug1(DCR, D, " insinuating %s", EchoObject(null, *crs));
X TransferLinks(Down(*crs), *crs, link);
X DisposeObject(*crs);
X *crs = nil;
X }
X
X }
X
X /* implement FILL_OFF break option if required */
X if( ok && multiline && fill_style(*style) == FILL_UNDEF )
X Error(FATAL, &fpos(x), "missing %s operator or option", KW_BREAK);
X if( ok && multiline && fill_style(*style) == FILL_OFF )
X { OBJECT last_acat = x, new_acat;
X x = New(VCAT);
X ReplaceNode(x, last_acat);
X Link(x, last_acat);
X for( link = Down(last_acat); link != last_acat; link = NextDown(link) )
X { Child(g, link);
X if( type(g) == GAP_OBJ && mode(gap(g)) != NO_MODE && vspace(g) > 0 )
X { link = PrevDown(link);
X MoveLink(NextDown(link), x, PARENT);
X GapCopy(gap(g), line_gap(*style));
X width(gap(g)) *= vspace(g);
X new_acat = New(ACAT);
X if( hspace(g) > 0 )
X { z = MakeWord("", &fpos(g));
X Link(new_acat, z);
X z = New(GAP_OBJ);
X hspace(z) = hspace(g);
X vspace(z) = 0;
X GapCopy(gap(z), space_gap(*style));
X width(gap(z)) *= hspace(z);
X Link(new_acat, z);
X }
X TransferLinks(NextDown(link), last_acat, new_acat);
X StyleCopy(save_style(new_acat), *style);
X Link(x, new_acat);
X last_acat = new_acat;
X link = last_acat;
X }
X }
X }
X
X ReplaceWithSplit(x, bthr, fthr);


X break;
X
X
X default:
X

X Error(INTERN, &fpos(x), "Manifest: no case for type %s", Image(type(x)));
X break;
X
X } /* end <= ACAT */
X else if( type(x) <= VCAT ) switch( type(x) )
X {
X
X case HCAT:
X case VCAT:
X
X par = type(x) == HCAT ? ROW : COL;
X perp = 1 - par;
X link = Down(x);
X gaplink = NextDown(link);
X assert( link!=x && gaplink!=x, "Manifest/VCAT: less than two children!" );
X Child(y, link); Child(g, gaplink);
X
X /* set bt and ft threads for y */
X bt[perp] = bthr[perp];
X ft[perp] = fthr[perp];
X first_bt = bt[par] = bthr[par] ? New(THREAD) : nil;
X ft[par] = join(gap(g)) ? New(THREAD) : nil;
X still_backing = first_bt != nil;
X
X /* manifest y and insinuate any cross-references */
X y = Manifest(y, env, style, bt, ft, target, crs, ok, FALSE);
X if( type(x) == VCAT && ok && *crs != nil )
X {
X debug1(DCR, D, " insinuating %s", EchoObject(null, *crs));
X TransferLinks(Down(*crs), *crs, link);
X DisposeObject(*crs);
X *crs = nil;
X }
X
X /* manifest the remaining children */
X while( g != nil )
X {
X /* manifest the gap object, store it in gap(g), add perp threads */
X assert( type(g) == GAP_OBJ, "Manifest/VCAT: type(g) != GAP_OBJECT!" );
X assert( Down(g) != g, "Manifest/VCAT: GAP_OBJ has no child!" );
X Child(z, Down(g));
X debug1(DOM, DD, "manifesting gap, style = %s", EchoStyle(style));
X z = Manifest(z, env, style, nbt, nft, &ntarget, crs, FALSE, FALSE);
X debug1(DOM, DD, "replacing with tidy, style = %s", EchoStyle(style));
X z = ReplaceWithTidy(z);
X debug1(DOM, DD, "calling GetGap, style = %s", EchoStyle(style));
X GetGap(z, style, &gap(g), &res_inc);
X if( bt[perp] ) Link(bt[perp], g);
X if( ft[perp] ) Link(ft[perp], g);
X
X /* find the next child y, and following gap if any */
X link = NextDown(gaplink);
X assert( link != x, "Manifest/VCAT: GAP_OBJ is last child!" );
X Child(y, link);
X gaplink = NextDown(link);
X if( gaplink == x ) g = nil;
X else Child(g, gaplink);
X
X /* set bt and ft threads for y */
X last_ft = ft[par];
X bt[par] = ft[par] ? New(THREAD) : nil;
X ft[par] = g != nil ? join(gap(g)) ? New(THREAD) : nil
X : fthr[par] ? New(THREAD) : nil;
X
X /* manifest y and insinuate any cross references */
X y = Manifest(y, env, style, bt, ft, target, crs, ok, FALSE);
X if( type(x) == VCAT && ok && *crs != nil )
X {
X debug1(DCR, D, " insinuating %s", EchoObject(null, *crs));
X TransferLinks(Down(*crs), *crs, link);
X DisposeObject(*crs);
X *crs = nil;
X }
X
X if( bt[par] ) /* then thread lists last_ft and bt[par] must merge */
X { OBJECT llink, rlink, lthread, rthread; BOOLEAN goes_through;
X assert( Down(bt[par]) != bt[par], "Manifest: bt[par] no children!" );
X assert( last_ft!=nil && Down(last_ft)!=last_ft, "Manifest:last_ft!" );
X
X /* check whether marks run right through y in par direction */
X goes_through = FALSE;
X if( ft[par] )
X { assert( Down(ft[par]) != ft[par], "Manifest: ft[par] child!" );
X Child(lthread, LastDown(bt[par]));
X Child(rthread, LastDown(ft[par]));
X goes_through = lthread == rthread;
X }
X
X /* merge the thread lists */
X llink = Down(last_ft); rlink = Down(bt[par]);
X while( llink != last_ft && rlink != bt[par] )
X { Child(lthread, llink);
X Child(rthread, rlink);
X assert( lthread != rthread, "Manifest: lthread == rthread!" );
X MergeNode(lthread, rthread);
X llink = NextDown(llink);
X rlink = NextDown(rlink);
X }
X
X /* attach leftover back threads to first_bt if required */
X if( rlink != bt[par] )
X {
X /* ***
X Error(WARN, &fpos(y), type(x) == VCAT ?
X "number of columns above exceeds number here" :
X "number of rows to left exceeds number here");
X *** */
X if( still_backing ) TransferLinks(rlink, bt[par], first_bt);
X }
X DisposeObject(bt[par]);
X
X /* attach leftover forward threads to ft[par] if required */
X if( llink != last_ft )
X {
X /* ***
X Error(WARN, &fpos(y), type(x) == VCAT ?
X "number of columns here exceeds number above" :
X "number of rows here exceeds number to left");
X *** */
X if( goes_through ) TransferLinks(llink, last_ft, ft[par]);
X }
X DisposeObject(last_ft);
X
X if( !goes_through ) still_backing = FALSE;
X
X }
X else still_backing = FALSE;
X
X } /* end while */
X
X /* export par threads */
X if( fthr[par] ) MergeNode(fthr[par], ft[par]);
X if( bthr[par] ) MergeNode(bthr[par], first_bt);


X break;
X
X
X default:
X

X Error(INTERN, &fpos(x), "Manifest: no case for type %s", Image(type(x)));
X break;
X
X }
X else switch( type(x) )
X {
X


X case WIDE:
X case HIGH:
X

X Child(y, Down(x));
X y = Manifest(y, env, style, nbt, nft, &ntarget, crs, FALSE, FALSE);
X y = ReplaceWithTidy(y);
X GetGap(y, style, &res_gap, &res_inc);
X if( res_inc != ABS || mode(res_gap) != EDGE_MODE ||
X units(res_gap) != FIXED_UNIT )
X { Error(WARN, &fpos(y), "replacing invalid left parameter of %s by 2i",
X Image(type(x)) );
X units(res_gap) = FIXED_UNIT;
X width(res_gap) = 2*IN;
X }
X SetConstraint(constraint(x), MAX_LEN, width(res_gap), MAX_LEN);
X DisposeChild(Down(x));
X /* NB NO BREAK! */
X
X


X case HCONTRACT:
X case VCONTRACT:
X case HEXPAND:
X case VEXPAND:
X case PADJUST:
X case HADJUST:
X case VADJUST:

X case ONE_COL:
X case ONE_ROW:
X

X par = (type(x)==ONE_COL || type(x)==HEXPAND || type(x) == HCONTRACT ||
X type(x)==PADJUST || type(x)==HADJUST || type(x)==WIDE) ? COL : ROW;
X Child(y, Down(x));
X
X /* manifest the child, propagating perp threads and suppressing pars */
X bt[par] = ft[par] = nil;
X bt[1-par] = bthr[1-par]; ft[1-par] = fthr[1-par];
X y = Manifest(y, env, style, bt, ft, target, crs, ok, FALSE);
X
X /* replace with split object if par threads needed */
X bt[par] = bthr[par]; ft[par] = fthr[par];
X bt[1-par] = ft[1-par] = nil;
X ReplaceWithSplit(x, bt, ft);
X break;
X
X
X case ROTATE:
X
X Child(y, Down(x));
X y = Manifest(y, env, style, nbt, nft, &ntarget, crs, FALSE, FALSE);
X y = ReplaceWithTidy(y);
X GetGap(y, style, &res_gap, &res_inc);
X if( res_inc != ABS || mode(res_gap) != EDGE_MODE ||
X units(res_gap) != DEG_UNIT )
X { Error(WARN, &fpos(y), "replacing invalid left parameter of %s by 0d",
X Image(type(x)) );
X units(res_gap) = DEG_UNIT;
X width(res_gap) = 0;
X }
X sparec(constraint(x)) = width(res_gap);
X DisposeChild(Down(x));
X Child(y, Down(x));
X y = Manifest(y, env, style, nbt, nft, target, crs, ok, FALSE);
X ReplaceWithSplit(x, bthr, fthr);
X break;
X
X


X case HSCALE:
X case VSCALE:
X

X Child(y, Down(x));
X y = Manifest(y, env, style, nbt, nft, target, crs, ok, FALSE);
X ReplaceWithSplit(x, bthr, fthr);
X break;
X
X
X case SCALE:
X
X Child(y, Down(x));
X y = Manifest(y, env, style, nbt, nft, &ntarget, crs, FALSE, FALSE);
X y = ReplaceWithTidy(y);
X if( type(y) != ACAT )
X { scale_factor = GetScaleFactor(y, "scale factor");
X bc(constraint(x)) = fc(constraint(x)) = scale_factor * SF;
X }
X else
X {
X /* get horizontal scale factor */
X Child(z, Down(y));
X scale_factor = GetScaleFactor(z, "horizontal scale factor");
X bc(constraint(x)) = scale_factor * SF;
X
X /* get vertical scale factor */
X Child(z, LastDown(y));
X scale_factor = GetScaleFactor(z, "vertical scale factor");
X fc(constraint(x)) = scale_factor * SF;
X }
X DisposeChild(Down(x));
X Child(y, LastDown(x));
X y = Manifest(y, env, style, nbt, nft, target, crs, ok, FALSE);
X ReplaceWithSplit(x, bthr, fthr);
X break;
X
X
X case YIELD:
X
X Error(FATAL, &fpos(x), "%s outside of %s", KW_YIELD, KW_CASE);
X break;
X
X
X case CASE:
X
X /* make sure left parameter (the tag) is in order */
X debug0(DOM, DD, " manifesting CASE now");
X Child(tag, Down(x));
X debug1(DOM, DD, " manifesting CASE tag %s now", EchoObject(null, tag));


X tag = Manifest(tag, env, style, nbt, nft, &ntarget, crs, FALSE, FALSE);
X tag = ReplaceWithTidy(tag);

X /* *** allowing this now; non-word matches "else" only ***


X if( type(tag) != WORD )

X { Error(WARN, &fpos(tag), "%s deleted: left parameter is not a word",
X KW_CASE);
X errorcase();


X }
X *** */
X

X /* make sure the right parameter is an ACAT */
X Child(y, LastDown(x));
X if( type(y) == YIELD )
X { z = New(ACAT);
X MoveLink(Up(y), z, PARENT);
X Link(x, z);
X y = z;
X }
X if( type(y) != ACAT )
X { Error(WARN, &fpos(y), "%s deleted: right parameter is malformed",
X KW_CASE);
X errorcase();
X }
X
X /* hunt through right parameter for res, the selected case */
X res = nil; firsttag = nil;
X for( ylink = Down(y); ylink != y && res == nil; ylink = NextDown(ylink) )
X { Child(yield, ylink);
X if( type(yield) == GAP_OBJ ) continue;
X if( type(yield) != YIELD )
X { Error(WARN, &fpos(yield), "%s contains non-%s", KW_CASE, KW_YIELD);
X break;
X }
X Child(ytag, Down(yield));
X ytag = Manifest(ytag, env, style, nbt, nft, &ntarget, crs, FALSE,FALSE);
X ytag = ReplaceWithTidy(ytag);
X if( type(ytag) == WORD )
X { if( firsttag == nil )
X { firsttag = ytag;
X Child(firstres, LastDown(yield));
X }
X if( (type(tag) == WORD && strcmp(string(ytag), string(tag)) == 0) ||
X strcmp(string(ytag), "else" ) == 0 )
X { Child(res, LastDown(yield));
X break;
X }
X }
X else if( type(ytag) == ACAT )
X { z = ytag;
X for( zlink = Down(z); zlink != z; zlink = NextDown(zlink) )
X { Child(ytag, zlink);
X if( type(ytag) == GAP_OBJ ) continue;
X if( type(ytag) != WORD )
X { Error(WARN,&fpos(ytag),"error in left parameter of %s",KW_YIELD);
X break;
X }
X if( firsttag == nil )
X { firsttag = ytag;
X Child(firstres, LastDown(yield));
X }
X if( (type(tag) == WORD && strcmp(string(ytag), string(tag)) == 0) ||
X strcmp(string(ytag), "else" ) == 0 )
X { Child(res, LastDown(yield));


X break;
X }
X }
X }

X else Error(WARN,&fpos(ytag),"error in left parameter of %s",KW_YIELD);
X }


X if( res == nil )

X { if( firsttag != nil )
X { Error(WARN, &fpos(tag), "replacing unkown %s option %s by %s",
X KW_CASE, string(tag), string(firsttag));
X res = firstres;
X }
X else
X { Error(WARN, &fpos(tag), "%s deleted: selection %s unknown",
X KW_CASE, string(tag));
X errorcase();
X }
X }
X
X /* now manifest the result and replace x with it */
X DeleteLink(Up(res));


X ReplaceNode(res, x);
X DisposeObject(x);

X x = Manifest(res, env, style, bthr, fthr, target, crs, ok, FALSE);
X break;
X
X
X case FONT:
X case SPACE:
X case BREAK:
X
X assert( Down(x) != x && NextDown(Down(x)) != x, "Manifest: FONT!" );
X StyleCopy(new_style, *style);
X Child(y, Down(x));
X y = Manifest(y, env, style, nbt, nft, &ntarget, crs, FALSE, FALSE);
X y = ReplaceWithTidy(y);
X if( type(x) == FONT ) FontChange(&new_style, y);
X else if( type(x) == SPACE ) SpaceChange(&new_style, y);
X else BreakChange(&new_style, y);
X DisposeChild(Down(x));
X Child(y, Down(x));
X y = Manifest(y, env, &new_style, bthr, fthr, target, crs, ok, FALSE);
X DeleteLink(Down(x));
X MergeNode(y, x); x = y;
X break;
X
X
X case NEXT:
X
X assert( Down(x) != x, "Manifest/NEXT: Down(x) == x!" );
X Child(y, Down(x));
X debug1(DCS, D, " Manifesting Next( %s, 1 )", EchoObject(null, y));
X y = Manifest(y, env, style, bthr, fthr, target, crs, FALSE, FALSE);
X debug1(DCS, D, " calling Next( %s, 1 )", EchoObject(null, y));
X done = FALSE;
X y = Next(y, 1, &done);
X debug2(DCS, D, " Next(done = %s) returning %s",
X bool(done), EchoObject(null, y));
X DeleteLink(Down(x));
X MergeNode(y, x); x = y;
X break;
X
X
X case OPEN:
X
X Child(y, Down(x));
X Child(res, LastDown(x));


X if( type(y) == CLOSURE )

X { AttachEnv(env, y);
X StyleCopy(save_style(y), *style);
X res_env = SetEnv(y, nil);
X hold_env = New(ACAT); Link(hold_env, res_env);
X res = Manifest(res, res_env, style, bthr, fthr, target, crs, ok, FALSE);
X DisposeObject(hold_env);
X }
X else if( type(y) == CROSS )
X { debug0(DCR, DD, " calling CrossExpand from Manifest/OPEN");
X y = CrossExpand(y, env, style, TRUE, crs, &res_env);
X AttachEnv(res_env, y);
X res_env = SetEnv(y, env);
X hold_env = New(ACAT); Link(hold_env, res_env);
X res = Manifest(res, res_env, style, bthr, fthr, target, crs, ok, FALSE);
X DisposeObject(hold_env);
X }
X else
X { Error(WARN, &fpos(y), "invalid left parameter of %s", KW_OPEN);
X res = Manifest(res, env, style, bthr, fthr, target, crs, ok, FALSE);
X }


X ReplaceNode(res, x);
X DisposeObject(x);

X x = res;
X break;
X
X
X case TAGGED:
X
X /* make sure first argument is a cross-reference */
X assert( Down(x) != x && NextDown(Down(x)) != x &&
X NextDown(NextDown(Down(x))) == x, "Manifest TAGGED: children!" );
X Child(y, Down(x));
X if( type(y) != CROSS )
X { Error(WARN, &fpos(y), "left parameter of %s is not a cross-reference",
X KW_TAGGED);
X errorcase();
X }
X
X /* make sure the arguments of the cross-reference are OK */
X Child(z, Down(y));
X if( type(z) != CLOSURE )
X { Error(WARN,&fpos(y),"left parameter of %s must be a symbol", KW_TAGGED);
X errorcase();
X }
X if( !has_tag(actual(z)) )
X { Error(WARN, &fpos(z), "symbol %s illegal with %s since it has no %s",
X SymName(actual(z)), KW_TAGGED, KW_TAG);
X errorcase();
X }
X Child(z, NextDown(Down(y)));
X z = Manifest(z, env, style, nbt, nft, &ntarget, crs, FALSE, FALSE);
X if( type(z) == WORD && strcmp(string(z), KW_PRECEDING) == 0 )
X cross_type(y) = CROSS_PREC;
X else if( type(z) == WORD && strcmp(string(z), KW_FOLLOWING) == 0 )
X cross_type(y) = CROSS_FOLL;
X else
X { Error(WARN, &fpos(z), "%s of left parameter of %s must be %s or %s",
X KW_TAG, KW_TAGGED, KW_PRECEDING, KW_FOLLOWING);
X errorcase();
X }
X
X /* make sure second argument (the new key) is ok */


X Child(tag, LastDown(x));
X tag = Manifest(tag, env, style, nbt, nft, &ntarget, crs, FALSE, FALSE);
X tag = ReplaceWithTidy(tag);

X if( type(tag) != WORD )

X { Error(WARN, &fpos(tag), "right parameter of %s must be a simple word",
X KW_TAGGED);
X ifdebug(DOM, D, EchoObject(stderr, tag));
X errorcase();
X }
X
X /* assemble insinuated cross reference which replaces x */
X ReplaceNode(tag, z);
X DisposeObject(z);
X ReplaceNode(y, x);
X DisposeObject(x);
X x = y;
X ReplaceWithSplit(x, bthr, fthr);
X break;
X
X
X case GRAPHIC:
X
X debug1(DRS, DD, " graphic style in Manifest = %s", EchoStyle(style));
X Child(y, LastDown(x));
X y = Manifest(y, env, style, nbt, nft, target, crs, ok, FALSE);
X StyleCopy(save_style(x), *style);
X Child(y, Down(x));
X y = Manifest(y, env, style, nbt, nft, &ntarget, crs, FALSE, FALSE);
X ReplaceWithSplit(x, bthr, fthr);
X break;
X
X


X case INCGRAPHIC:
X case SINCGRAPHIC:
X

X Child(y, Down(x));
X y = Manifest(y, env, style, nbt, nft, &ntarget, crs, FALSE, FALSE);
X y = ReplaceWithTidy(y);
X if( type(y) != WORD )
X { Error(WARN, &fpos(y), "%s deleted: invalid right parameter",
X type(x) == INCGRAPHIC ? KW_INCGRAPHIC : KW_SINCGRAPHIC);
X errorcase();
X }
X /* *** no longer defining these files (uses too many file numbers) ***
X sparec(constraint(x)) = DefineFile(MakeWord(string(y), &fpos(y)),
X INCGRAPHIC_FILE, type(x)==INCGRAPHIC ? INCLUDE_PATH : SYSINCLUDE_PATH);
X *** */
X ReplaceWithSplit(x, bthr, fthr);


X break;
X
X
X default:
X

X Error(INTERN, &fpos(x), "Manifest: no case for type %s", Image(type(x)));


X break;
X
X } /* end switch */
X

X debug2(DOM,D,"]Manifest returning %s %s",Image(type(x)),EchoObject(null, x));
X debug1(DOM, DD, " at exit, style = %s", EchoStyle(style));
X debug1(DOM, DDD, "up: ", EchoObject(null, bthr[COL]) );
X debug1(DOM, DDD, "down: ", EchoObject(null, fthr[COL]) );
X debug1(DOM, DDD, "left: ", EchoObject(null, bthr[ROW]) );
X debug1(DOM, DDD, "right: ", EchoObject(null, fthr[ROW]) );
X return x;
X} /* end Manifest */
END_OF_FILE
if test 36495 -ne `wc -c <'lout/z08.c'`; then
echo shar: \"'lout/z08.c'\" unpacked with wrong size!
fi
# end of 'lout/z08.c'
fi
echo shar: End of archive 7 \(of 30\).
cp /dev/null ark7isdone

Jeff Kingston

unread,
Jun 1, 1993, 1:18:02 AM6/1/93
to
Submitted-by: je...@joyce.cs.su.oz.au (Jeff Kingston)
Posting-number: Volume 37, Issue 106
Archive-name: lout/part08
Environment: UNIX

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: lout/doc/tr.impl/s2.3 lout/include/eq lout/z36.c
# Wrapped by kent@sparky on Sun May 30 19:43:55 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 8 (of 30)."'
if test -f 'lout/doc/tr.impl/s2.3' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.impl/s2.3'\"
else
echo shar: Extracting \"'lout/doc/tr.impl/s2.3'\" \(12558 characters\)
sed "s/^X//" >'lout/doc/tr.impl/s2.3' <<'END_OF_FILE'
X@SubSection
X @Tag { objects }
X @Title { Basic structural operators }
X@Begin
X@PP
XA programming language may be considered complete when it attains the
Xpower of a Turing machine, but no such criterion seems relevant to
Xdocument formatting. Instead, as the language develops and new
Xapplications are attempted, deficiencies are exposed and the operator set is
Xrevised to overcome them.
X@PP
XLout has a repertoire of 23 primitive operators
X(Figure {@NumberOf primitives}),
X
X@Figure
X @Caption { The 23 primitive operators of Lout, in order of
Xincreasing precedence. }
X @Tag { primitives }
X@Tab
X vmargin { 0.5vx }
X @Fmta { @Col @I A ! @Col B }
X{
X@Rowa
X A { object {@Code "/"}gap object }
X B { Vertical concatenation with mark alignment }
X@Rowa
X A { object {@Code "//"}gap object }
X B { Vertical concatenation with left justification }
X@Rowa
X A { object {@Code "|"}gap object }
X B { Horizontal concatenation with mark alignment }
X@Rowa
X A { object {@Code "||"}gap object }
X B { Horizontal concatenation with top-justification }
X@Rowa
X A { object {@Code "&"}gap object }
X B { Horizontal concatenation within paragraphs }
X@Rowa
X A { {@Code "@OneCol"} object }
X B { Hide all but one column mark of @I object }
X@Rowa
X A { {@Code "@OneRow"} object }
X B { Hide all but one row mark of @I object }
X@Rowa
X A { font @Code "@Font" object }
X B { Render @I object in nominated font }
X@Rowa
X A { breakstyle @Code "@Break" object}
X B { Break paragraphs of @I object in nominated style }
X@Rowa
X A { spacestyle @Code "@Space" object }
X B { Render spaces between words in nominated style }
X@Rowa
X A { length {@Code "@Wide"} object }
X B { Render @I object to width @I length }
X@Rowa
X A { length {@Code "@High"} object }
X B { Render @I object to height @I length }
X@Rowa
X A { {@Code "@HExpand"} object}
X B { Expand horizontal gaps to fill available space }
X@Rowa
X A { {@Code "@VExpand"} object}
X B { Expand vertical gaps to fill available space }
X@Rowa
X A { {@Code "@HScale"} object }
X B { Horizontal geometrical scaling to fill available space }
X@Rowa
X A { {@Code "@VScale"} object }
X B { Vertical geometrical scaling to fill available space }
X@Rowa
X A { angle {@Code "@Rotate"} object }
X B { Rotate @I object by @I angle }
X@Rowa
X A { PostScript {@Code "@Graphic"} object }
X B { Escape to graphics language }
X@Rowa
X A { @Code "@Next" object }
X B { Add 1 to an object denoting a number }
X@Rowa
X A { object @Code "@Case" alternatives }
X B { Select from a set of alternative objects }
X@Rowa
X A { identifier @Code "&&" object }
X B { Cross reference }
X@Rowa
X A { cross-reference @Code "@Open" object }
X B { Retrieve value from cross reference }
X@Rowa
X A { cross-reference @Code "@Tagged" object}
X B { Attach cross referencing tag to object }
X}
X
Xwhich has proven adequate for a wide variety of features, including equations,
Xtables, and page layout, and so seems to be reasonably complete in this
Xpragmatic sense. In this section we introduce the eight concatenation and
Xmark-hiding operators. To them falls the basic task of assembling complex
Xobjects from simple ones, and they were the first
Xto be designed and implemented.
X@PP
XMany of the operators of Eqn can be viewed as building small tables. A
Xbuilt-up fraction, for example, has one column and three rows
X(numerator, line, and denominator). Numerous investigations of this
Xkind convinced the author that operators capable of assembling the rows
Xand columns of tables would suffice for building all kinds of objects.
X@PP
XThe simplest objects are empty objects and literal words like
X{@Code metempsychosis}, which have one column mark and one row mark:
X@ID {
X@ShowMarks metempsychosis
X}
XTo place two arbitrary objects side by side, we use the infix
Xoperator {@Code "|"}, denoting horizontal concatenation. For
Xexample,
X@ID {
X@Code "USA |0.2i Australia"
X}
Xproduces the object
X@ID {
X@ShowMarks USA |0.2i @ShowMarks Australia
X}
XThe row marks are merged into one, fixing the vertical position of
Xthe objects relative to each other; their horizontal separation is
Xdetermined by the @I gap attached to the operator, in this case 0.2
Xinches. We think of the gap as part of the operator, although
Xstrictly it is a third parameter. It may be omitted, defaulting to
X{@Code "0i"}.
X@PP
X@I {Vertical concatenation} & , denoted by the infix operator {@Code "/"},
Xis the same apart from the change of direction:
X@ID {
X@Code "Australia /0.1i USA"
X}
Xproduces the object
X@ID {
X@ShowMarks Australia /0.1i
X@ShowMarks USA
X}
Xwith column marks merged and a 0.1 inch gap.
X@PP
XConsider now what happens when horizontal and vertical are combined:
X@ID @Code {
X |1m "{" USA |1m "|0.2i" |1m Australia "}"
X/1vx "/0.1i" | "{" Washington | "|" | Canberra "}"
X}
XThe two parameters of @Code "/" now have two column marks each, and
Xthey will be merged with the corresponding marks in the other
Xparameter, yielding the object
X@ID {
X @ShowMarks USA &
X { 0 ymark moveto xsize 10 pt add ymark lineto [ 3 pt ] 0 setdash stroke }
X @Graphic {1c @Wide }
X |0.2i @ShowMarks Australia
X/0.1i @ShowMarks Washington | @ShowMarks Canberra
X}
XThe @Code "0.2i" gap separates columns, not individual items in
Xcolumns, so a gap attached to the second @Code "|" would serve no
Xpurpose; any such gap is ignored. If the number of marks to be merged
Xdiffers, empty columns are added at the right to equalize the number. The
Xfour marks protruding from the result are all available for merging
Xwith neighbouring marks by other concatenation operators. The precedence
Xof @Code "|" is higher than the precedence of {@Code "/"}, so the braces
Xcould be omitted.
X@PP
XWhen lines of text are concatenated, it is conventional to measure
Xtheir separation from baseline to baseline (mark to mark in Lout),
Xrather than from edge to edge as above. This idea of different
Xreference points for measurement evolved over the years into a
Xsystem of six @I {gap modes} (Figure {@NumberOf gapmodes}), expressed
Xby appending a letter to the length. For example, @Code "|0.2i" is
Xan abbreviation for {@Code "|0.2ie"}, meaning 0.2 inches measured
Xfrom edge to edge; @Code "|0.3ix"
Xproduces a 0.3 inch gap measured from mark to mark and widened if
Xnecessary to prevent overstriking; and @Code "|2.5it" places its right
Xparameter 2.5 inches from the current left margin, irrespective of
Xthe position of the left parameter. There is also a choice of
Xeleven units of measurement (inches, centimetres, multiples of the
Xcurrent font size, etc.), the most interesting being
Xthe @Code r unit: one @Code r is the column width minus the width of
Xthe following object, so that @Code "|1rt" produces sufficient space
Xto right justify the following object, and @Code "|0.5rt" to center
Xit. These features implement spacings needed in practice rather
Xthan suggested by theory. They work with all five concatenation
Xoperators, horizontal and vertical.
X
X@Figure
X @Tag { gapmodes }
X @Caption { The six gap modes (@I length is any length). Hyphenation
Xmode has an extra property not shown here. }
X@Fig {
X{ /2.5vx Edge-to-edge |0.3i {@Code "|"} &1p {@I length} &1p {@Code e}
X /4.2vx Hyphenation |0.3i {@Code "|"} &1p {@I length} &1p {@Code h}
X /4.2vx Overstrike |0.3i {@Code "|"} &1p {@I length} &1p {@Code o}
X /4.2vx Mark-to-mark |0.3i {@Code "|"} &1p {@I length} &1p {@Code x}
X /4.2vx Kerning |0.3i {@Code "|"} &1p {@I length} &1p {@Code k}
X /4.2vx Tabulation |0.3i {@Code "|"} &1p {@I length} &1p {@Code t}
X}
X||0.5i
X@Box margin { 0c } 6c @Wide 13.5c @High 9p @Font
X{
X @OneRow {
X @At { 1c @Wide 0.5c @High } @Put { @LBox 0.2co }
X @At { 4c @Wide 0.5c @High } @Put { @LBox 0.5co }
X @At { 2.2c @Wide 1.4c @High } @Put { @DoubleArrow 1.8c }
X @At { 2.2c @Wide 1.6c @High } @Put { 1.8c @Wide { &0.5rt @I length } }
X }
X //4vx
X @OneRow {
X @At { 1c @Wide 0.5c @High } @Put { @LBox 0.2co }
X @At { 4c @Wide 0.5c @High } @Put { @LBox 0.5co }
X @At { 2.2c @Wide 1.4c @High } @Put { @DoubleArrow 1.8c }
X @At { 2.2c @Wide 1.6c @High } @Put { 1.8c @Wide { &0.5rt @I length } }
X }
X //4vx
X @OneRow {
X @At { 1c @Wide 0.5c @High } @Put { @LBox 0.2co }
X @At { 4c @Wide 0.5c @High } @Put { @LBox 0.5co }
X @At { 1.2c @Wide 1.5c @High } @Put { @DoubleArrow 3.3c }
X @At { 1.2c @Wide 1.7c @High } @Put { 3.3c @Wide { &0.5rt @I length } }
X }
X //4vx
X @OneRow {
X @At { 1c @Wide 0.5c @High } @Put { @LBox 0.2co }
X @At { 4c @Wide 0.5c @High } @Put { @LBox 0.5co }
X @At { 1.2c @Wide 1.5c @High } @Put { @DoubleArrow 3.3c }
X @At { 1.2c @Wide 1.7c @High }
X @Put 3.3c @Wide { |0.5rt @Eq { max(length, a+b) } }
X @At { 1.2c @Wide 0.4c @High } @Put { @DoubleArrow 1.0c }
X @At { 1.2c @Wide 0.2c @High } @Put { 1.0c @Wide { &0.5rt @I a } }
X @At { 4c @Wide 0.4c @High } @Put { @DoubleArrow 0.5c }
X @At { 4c @Wide 0.2c @High } @Put { 0.5c @Wide { &0.5rt @I b } }
X }
X //4.5vx
X @OneRow {
X @At { 1c @Wide 0.5c @High } @Put { @LBox 0.2co }
X @At { 4c @Wide 0.5c @High } @Put { @LBox 0.5co }
X @At { 1.2c @Wide 1.5c @High } @Put { @DoubleArrow 3.3c }
X @At { 1.2c @Wide 1.7c @High }
X @Put { 3.3c @Wide { |0.5rt @Eq { max(length, a, b) } } }
X @At { 1.2c @Wide 0.4c @High } @Put { @DoubleArrow 1.0c }
X @At { 1.2c @Wide 0.2c @High } @Put { 1.0c @Wide { &0.5rt @I a } }
X @At { 4c @Wide 0.4c @High } @Put { @DoubleArrow 0.5c }
X @At { 4c @Wide 0.2c @High } @Put { 0.5c @Wide { &0.5rt @I b } }
X }
X //4vx
X @OneRow {
X @At { 1c @Wide 0.5c @High } @Put { @LBox 0.2co }
X @At { 4c @Wide 0.5c @High } @Put { @LBox 0.5co }
X @At { 0.0c @Wide 1.6c @High } @Put { @DoubleArrow 4.0c }
X @At { 2.8c @Wide 1.8c @High } @Put { @I length }
X }
X //5vx
X @DoubleArrow 6c
X //0.1c |0.5rt @I { current bound }
X}
X}
X
X@PP
XWhen we construct a built-up fraction, the result has three row marks, but
Xonly the second should be visible outside the object:
X@ID @Eq { @ShowMarks { X over Y } }
XThis is a common problem, and accordingly a @Code "@OneRow" operator was
Xintroduced for hiding all but one of the row marks of its
Xparameter. Normally, the first mark is the survivor, but a later mark can
Xbe chosen by prefixing @Code "^" to the preceding concatenation operator:
X@ID @Code "@OneRow { X ^/2p @HLine /2p Y }"
Xhas the desired result, where {@Code "2p"} is two points and @Code "@HLine"
Xis an easy combination of Lout's graphics operators. A similar operator,
X{@Code "@OneCol"}, hides column marks.
X@PP
XA variant of @Code "/" called @Code "//" is provided which performs
Xvertical concatenation but ignores all column marks and simply
Xleft-justifies its two parameters:
X@ID @Code {
X"Heading //0.1i"
X"A |0.2i B /0.1i"
X"C | D"
X}
Xhas result
X@ID { Heading //0.1i A |0.2i B /0.1i C | D }
Xshowing that spanning columns in tables motivate the inclusion of this
Xoperator. There is an analogous @Code "||" operator. The author
Xwould have preferred to leave out these operators, since they
Xcomplicate the implementation, and it is interesting to examine the
Xprospects of doing so.
X@PP
XThe @Code "//" operator is formally redundant, because in general
Xthe expression @Code "x // y" can be replaced by
X@ID @Code {
X"@OneCol { | x } /"
X"@OneCol { | y }"
X}
Xfor any objects {@Code x} and {@Code y}. By concatenating an empty
Xobject at the left of @Code x and hiding all but that empty object's
Xcolumn mark, we effectively shift {@Code x}'s column mark to its left
Xedge. The same goes for {@Code y}, so the @Code "/" operator has just
Xone column mark to merge, at the extreme left, and its effect is
Xindistinguishable from {@Code "//"}.
X@PP
XUnfortunately, if @Code y consists of two rows separated by {@Code "/"},
Xas in the example above, both rows must be placed inside the
X{@Code "@OneCol"}, and the table cannot be entered in the simple
Xrow-by-row manner that non-expert users naturally expect. Another
Xadvantage of @Code "//" is that its left parameter can be printed
Xbefore its right parameter is known; this is important when the left
Xparameter is an entire page.
X@PP
XThe fifth and final concatenation operator, {@Code "&"}, is an explicit
Xversion of the horizontal concatenation operator interpolated when
Xobjects are separated by white space. It is formally identical to
X@Code "|" except for taking higher precedence and being subject to
Xreplacement by @Code "//1vx" during paragraph breaking
X(Section {@NumberOf style}).
X@End @SubSection
END_OF_FILE
if test 12558 -ne `wc -c <'lout/doc/tr.impl/s2.3'`; then
echo shar: \"'lout/doc/tr.impl/s2.3'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.impl/s2.3'
fi
if test -f 'lout/include/eq' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/include/eq'\"
else
echo shar: Extracting \"'lout/include/eq'\" \(35135 characters\)
sed "s/^X//" >'lout/include/eq' <<'END_OF_FILE'
X
X###############################################################################
X# #
X# Lout @Eq package for equation formatting (Version 2.0) #
X# #
X# Version 1.0 by Jeffrey H. Kingston, December 1990. #


X# Version 2.0 by Jeffrey H. Kingston, 22 December 1992. #
X# #

X# See "Eq - a Lout package for typesetting mathematics" for user #
X# information. Acknowledgement: the @Eq language is based closely on #
X# the Eqn language of B. W. Kernighan and L. L. Cherry; the spacing rules #
X# are similar to those of the TeX system by D. E. Knuth. #
X# #
X###############################################################################
X
Xexport "`" "``" "```" bin rel punct non vctr big
X
X space exclam universal numbersign existential percent
X ampersand suchthat parenleft parenright asteriskmath
X plus comma minus period slash zero one two three four
X five six seven eight nine colon semicolon less equal
X greater question congruent Alpha Beta Chi Delta Epsilon
X Phi Gamma Eta Iota thetaone Kappa Lambda Mu Nu Omicron
X Pi Theta Rho Sigma Tau Upsilon sigmaone Omega Xi Psi Zeta
X bracketleft therefore bracketright perpendicular underscore
X radicalex alpha beta chi delta epsilon phi gamma eta iota
X phione kappa lambda mu nu omicron pi theta rho sigma tau
X upsilon omegaone omega xi psi zeta braceleft bar braceright
X similar Upsilonone minute lessequal fraction infinity florin
X club diamond heart spade arrowboth arrowleft arrowup
X arrowright arrowdown degree plusminus second greaterequal
X multiply proportional partialdiff bullet divide notequal
X equivalence approxequal ellipsis arrowvertex arrowhorizex
X carriagereturn aleph Ifraktur Rfraktur weierstrass
X circlemultiply circleplus emptyset intersection union
X propersuperset reflexsuperset notsubset propersubset
X reflexsubset element notelement angle gradient registerserif
X copyrightserif trademarkserif product radical dotmath
X logicalnot logicaland logicalor arrowdblboth arrowdblleft
X arrowdblup arrowdblright arrowdbldown lozenge angleleft
X registersans copyrightsans trademarksans summation parenlefttp
X parenleftex parenleftbt bracketlefttp bracketleftex
X bracketleftbt bracelefttp braceleftmid braceleftbt braceex
X angleright integral integraltp integralex integralbt
X parenrighttp parenrightex parenrightbt bracketrighttp
X bracketrightex bracketrightbt bracerighttp bracerightmid
X bracerightbt
X
X hbar Re Im partial infty prime nabla surd top bot dbar
X triangle backslash forall exists neg circle square
X
X "0" "1" "2" "3" "4" "5" "6" "7" "8" "9"
X
X sum prod coprod int oint bcap bcup bvee bwedge bodot botimes
X boplus buplus
X
X "+" "-" "+-" "-+" setminus cdot times "*" circ div cap cup uplus
X sqcap sqcup triangleleft triangleright wr bigcirc bigtriangleup
X bigtriangledown vee wedge oplus ominus otimes oslash odot dagger
X daggerdbl amalg
X
X "<" ">" "=" "<=" prec preceq "<<" subset subseteq sqsubseteq
X in vdash smile frown ">=" succ succeq ">>" supset supseteq
X sqsupseteq ni dashv mid parallel "==" "~" "-~" asymp "~~"
X "=~" bowtie propto models doteq perp notsub notin "!=" not
X "<->" "<--" "-->" up down "<=>" "<==" "==>" dblup dbldown
X ":" "::" ":="
X
X lpar blpar rpar brpar lbrack blbrack rbrack brbrack lbrace blbrace
X rbrace brbrace lfloor blfloor rfloor brfloor lceil blceil
X rceil brceil langle blangle rangle brangle
X
X ";" "," col
X
X "!" "?" "%" "(" ")" "[" "]"
X
X arccos arcsin arctan arg cos cosh cot coth csc deg det dim exp
X gcd hom inf ker lg lim liminf limsup ln log max min Pr sec sin
X sinh supr tan tanh mod ldots cdots vdots ddots del grad
X "..." "'" empty
X
X sup sub supp on frac half third over from to widefrom wideto
X dot dotdot hat tilde vec dyad overbar underbar sqrt root above
X labove cabove rabove mabove nextcol matrix
X
Xdef @Eq
X body @Body
X@Begin
X
X def @SkewGap { 0.05f }
X def @SupGap { 0.40fk }
X def @ThinGap { 0.15v }
X def @MedGap { 0.20v }
X def @ThickGap { 0.25v }
X def @ColGap { 0.8f }
X def @RowGap { 0.5f }
X def @FontRed { 0.7f }
X def @FontInc { 1.3f }
X
X def "`" { &@ThinGap }
X def "``" { &@MedGap }
X def "```" { &@ThickGap }
X
X def bin right x { `` x `` }
X def rel right x { ``` x ``` }
X def punct right x { x ` }
X def non right x { 0c @Break x }
X def big right x { @FontInc @Font 0c @Space @FontInc @Break x }
X
X def @Base right x { Base @Font x }
X def @Smaller right x { @FontRed @Font 0c @Space 0.2f @Break x }
X def @Sym right x { {Symbol Base} @Font x }
X
X def @HLine
X named line { "0.05 ft setlinewidth" }
X {
X { "0 0 moveto xsize 0 lineto" line "stroke" } @Graphic {}
X }
X
X def @VLine
X {
X "0 0 moveto 0 ysize lineto 0.05 ft setlinewidth stroke" @Graphic {}
X }
X
X def vctr
X right x
X { @OneRow { -180d @Rotate { /0.5wo 180d @Rotate { / @OneRow @OneCol x } }
X ^/ @OneRow { /0.5wo @OneRow { @OneRow @OneCol x ^/ } }
X }
X }
X
X ###################################################################
X # #
X # Full names #
X # #
X # These symbols and their names are taken directly from the #
X # Adobe Systems Inc. Symbol font (see PostScript Language #
X # Reference Manual, pp. 256-257). The only differences are: #
X # #
X # Adobe: theta1 Eq: thetaone #
X # sigma1 sigmaone #
X # phi1 phione #
X # omega1 omegaone #
X # #
X # These were needed since Lout identifiers do not have digits. #
X # #
X ###################################################################
X
X def space { @Sym "\040" }
X def exclam { @Sym "\041" }
X def universal { @Sym "\042" }
X def numbersign { @Sym "\043" }
X def existential { @Sym "\044" }
X def percent { @Sym "\045" }
X def ampersand { @Sym "\046" }
X def suchthat { @Sym "\047" }
X def parenleft { @Sym "\050" }
X def parenright { @Sym "\051" }
X def asteriskmath { @Sym "\052" }
X def plus { @Sym "+" }
X def comma { @Sym "\054" }
X def minus { @Sym "-" }
X def period { @Sym "\056" }
X def slash { @Sym "\057" }
X def zero { @Sym "\060" }
X def one { @Sym "\061" }
X def two { @Sym "\062" }
X def three { @Sym "\063" }
X def four { @Sym "\064" }
X def five { @Sym "\065" }
X def six { @Sym "\066" }
X def seven { @Sym "\067" }
X def eight { @Sym "\070" }
X def nine { @Sym "\071" }
X def colon { @Sym "\072" }
X def semicolon { @Sym "\073" }
X def less { @Sym "\074" }
X def equal { @Sym "\075" }
X def greater { @Sym "\076" }
X def question { @Sym "\077" }
X def congruent { @Sym "\100" }
X def Alpha { @Sym "\101" }
X def Beta { @Sym "\102" }
X def Chi { @Sym "\103" }
X def Delta { @Sym "\104" }
X def Epsilon { @Sym "\105" }
X def Phi { @Sym "\106" }
X def Gamma { @Sym "\107" }
X def Eta { @Sym "\110" }
X def Iota { @Sym "\111" }
X def thetaone { @Sym "\112" }
X def Kappa { @Sym "\113" }
X
X def Lambda { @Sym "\114" }
X def Mu { @Sym "\115" }
X def Nu { @Sym "\116" }
X def Omicron { @Sym "\117" }
X def Pi { @Sym "\120" }
X def Theta { @Sym "\121" }
X def Rho { @Sym "\122" }
X def Sigma { @Sym "\123" }
X def Tau { @Sym "\124" }
X def Upsilon { @Sym "\125" }
X def sigmaone { @Sym "\126" }
X def Omega { @Sym "\127" }
X def Xi { @Sym "\130" }
X def Psi { @Sym "\131" }
X def Zeta { @Sym "\132" }
X def bracketleft { @Sym "\133" }
X def therefore { @Sym "\134" }
X def bracketright { @Sym "\135" }
X def perpendicular { @Sym "\136" }
X def underscore { @Sym "\137" }
X def radicalex { @Sym "\140" }
X def alpha { @Sym "\141" }
X def beta { @Sym "\142" }
X def chi { @Sym "\143" }
X def delta { @Sym "\144" }
X def epsilon { @Sym "\145" }
X def phi { @Sym "\146" }
X def gamma { @Sym "\147" }
X def eta { @Sym "\150" }
X def iota { @Sym "\151" }
X def phione { @Sym "\152" }
X def kappa { @Sym "\153" }
X def lambda { @Sym "\154" }
X def mu { @Sym "\155" }
X def nu { @Sym "\156" }
X
X def omicron { @Sym "\157" }
X def pi { @Sym "\160" }
X def theta { @Sym "\161" }
X def rho { @Sym "\162" }
X def sigma { @Sym "\163" }
X def tau { @Sym "\164" }
X def upsilon { @Sym "\165" }
X def omegaone { @Sym "\166" }
X def omega { @Sym "\167" }
X def xi { @Sym "\170" }
X def psi { @Sym "\171" }
X def zeta { @Sym "\172" }
X def braceleft { @Sym "\173" }
X def bar { @Sym "\174" }
X def braceright { @Sym "\175" }
X def similar { @Sym "\176" }
X def Upsilonone { @Sym "\241" }
X def minute { @Sym "\242" }
X def lessequal { @Sym "\243" }
X def fraction { @Sym "\244" }
X def infinity { @Sym "\245" }
X def florin { @Sym "\246" }
X def club { @Sym "\247" }
X def diamond { @Sym "\250" }
X def heart { @Sym "\251" }
X def spade { @Sym "\252" }
X def arrowboth { @Sym "\253" }
X def arrowleft { @Sym "\254" }
X def arrowup { @Sym "\255" }
X def arrowright { @Sym "\256" }
X def arrowdown { @Sym "\257" }
X def degree { @Sym "\260" }
X def plusminus { @Sym "\261" }
X def second { @Sym "\262" }
X def greaterequal { @Sym "\263" }
X
X def multiply { @Sym "\264" }
X def proportional { @Sym "\265" }
X def partialdiff { @Sym "\266" }
X def bullet { @Sym "\267" }
X def divide { @Sym "\270" }
X def notequal { @Sym "\271" }
X def equivalence { @Sym "\272" }
X def approxequal { @Sym "\273" }
X def ellipsis { @Sym "\274" }
X def arrowvertex { @Sym "\275" }
X def arrowhorizex { @Sym "\276" }
X def carriagereturn { @Sym "\277" }
X def aleph { @Sym "\300" }
X def Ifraktur { @Sym "\301" }
X def Rfraktur { @Sym "\302" }
X def weierstrass { @Sym "\303" }
X def circlemultiply { @Sym "\304" }
X def circleplus { @Sym "\305" }
X def emptyset { @Sym "\306" }
X def intersection { @Sym "\307" }
X def union { @Sym "\310" }
X def propersuperset { @Sym "\311" }
X def reflexsuperset { @Sym "\312" }
X def notsubset { @Sym "\313" }
X def propersubset { @Sym "\314" }
X def reflexsubset { @Sym "\315" }
X def element { @Sym "\316" }
X def notelement { @Sym "\317" }
X def angle { @Sym "\320" }
X def gradient { @Sym "\321" }
X def registerserif { @Sym "\322" }
X def copyrightserif { @Sym "\323" }
X def trademarkserif { @Sym "\324" }
X def product { @Sym "\325" }
X def radical { @Sym "\326" }
X def dotmath { @Sym "\327" }
X
X def logicalnot { @Sym "\330" }
X def logicaland { @Sym "\331" }
X def logicalor { @Sym "\332" }
X def arrowdblboth { @Sym "\333" }
X def arrowdblleft { @Sym "\334" }
X def arrowdblup { @Sym "\335" }
X def arrowdblright { @Sym "\336" }
X def arrowdbldown { @Sym "\337" }
X def lozenge { @Sym "\340" }
X def angleleft { @Sym "\341" }
X def registersans { @Sym "\342" }
X def copyrightsans { @Sym "\343" }
X def trademarksans { @Sym "\344" }
X def summation { @Sym "\345" }
X def parenlefttp { @Sym "\346" }
X def parenleftex { @Sym "\347" }
X def parenleftbt { @Sym "\350" }
X def bracketlefttp { @Sym "\351" }
X def bracketleftex { @Sym "\352" }
X def bracketleftbt { @Sym "\353" }
X def bracelefttp { @Sym "\354" }
X def braceleftmid { @Sym "\355" }
X def braceleftbt { @Sym "\356" }
X def braceex { @Sym "\357" }
X def angleright { @Sym "\361" }
X def integral { @Sym "\362" }
X def integraltp { @Sym "\363" }
X def integralex { @Sym "\364" }
X def integralbt { @Sym "\365" }
X def parenrighttp { @Sym "\366" }
X def parenrightex { @Sym "\367" }
X def parenrightbt { @Sym "\370" }
X def bracketrighttp { @Sym "\371" }
X def bracketrightex { @Sym "\372" }
X def bracketrightbt { @Sym "\373" }
X def bracerighttp { @Sym "\374" }
X def bracerightmid { @Sym "\375" }
X def bracerightbt { @Sym "\376" }
X
X
X ###################################################################
X # #
X # Short names #
X # #
X # These symbols, their names, and their spacing, are based on #
X # the list in Appendix F of Donald E. Knuth's The TeXBook. #
X # #
X # Group 1 (lowercase Greek letters): see full names above #
X # Group 2 (uppercase Greek letters): see full names above #
X # Group 3 (calligraphic capitals): not provided by Eq #
X # #
X ###################################################################
X
X ###################################################################
X # #
X # Group 4 (miscellaneous Ord symbols) #
X # #
X # Not all of Knuth's symbols are available. The four suits #
X # (heartsuit, etc.), have definitions above. #
X # #
X ###################################################################
X
X def hbar { @OneCol { &0.1f @Base "-" ^/0.25fo h } }
X def Re { Rfraktur }
X def Im { Ifraktur }
X def partial { partialdiff }
X def infty { infinity }
X def prime { minute }
X #def emptyset { defined above }
X def nabla { gradient }
X def surd { radical }
X def top { 180d @Rotate perpendicular }
X def bot { perpendicular }
X def dbar { @Base "||" }
X #def angle { defined above }
X def backslash { "\\" }
X def forall { universal }
X def exists { existential }
X def neg { logicalnot }
X
X def circle { @HContract @VContract
X { "xsize ysize 2 div moveto"
X "xsize 2 div ysize 2 div xsize 2 div 0 360 arc"


X "0.04 ft setlinewidth stroke"
X }

X @Graphic { 0.7f @Wide 0.3f @High ^/ 0.3f @High }
X }
X
X def square { @HContract @VContract
X { "0 0 moveto xsize 0 lineto xsize ysize lineto"
X "0 ysize lineto closepath"
X "0.04 ft setlinewidth stroke"
X }
X @Graphic { 0.6f @Wide 0.3f @High ^/ 0.3f @High }
X }
X
X def triangle { @HContract @VContract
X { "0 0 moveto xsize 0 lineto"
X "xsize 2 div ysize lineto closepath"


X "0.04 ft setlinewidth stroke"
X }

X @Graphic
X { 0.3f @Wide 0.3f @High ^| ^/
X 0.3f @Wide 0.3f @High
X }
X }
X
X ###################################################################
X # #
X # Group 5 (digits) #
X # #
X ###################################################################
X
X def "0" { zero }
X def "1" { one }
X def "2" { two }
X def "3" { three }
X def "4" { four }
X def "5" { five }
X def "6" { six }
X def "7" { seven }
X def "8" { eight }
X def "9" { nine }
X
X
X ###################################################################
X # #
X # Group 6 ("Large" operators) #
X # #
X # Knuth's large operators automatically change size depending #
X # on whether the equation is display or inline. Eq does not #
X # do this; instead, the `big' operator must be used. #
X # #
X ###################################################################
X
X def sum { summation }
X def prod { product }
X def coprod { 180d @Rotate vctr product }
X def int { 1.3f @Font vctr integral }
X def oint { @OneCol { vctr degree |0.015fo int } }
X def bcap { 1.3f @Font intersection }
X def bcup { 1.3f @Font union }
X def bvee { 1.3f @Font logicalor }
X def bwedge { 1.3f @Font logicaland }
X def bodot { & 1.3f @Font @HContract { circle /0io &0.5rt dotmath } }
X def botimes { 1.3f @Font circlemultiply }
X def boplus { 1.3f @Font circleplus }
X def buplus { & 1.3f @Font @HContract { &0.5rt 0.7f @Font plus ^/0.2fo union } }
X
X ###################################################################
X # #
X # Group 7 (binary operations) #
X # #
X # All of Knuth's symbols are available except \star, \diamond #
X # and \bullet; a few have been given more mnemonic names. #
X # #
X ###################################################################
X
X def "+" { bin plus }
X def "-" { bin minus }
X def "+-" { bin plusminus }
X def "-+" { bin 180d @Rotate plusminus }
X def setminus { bin backslash }
X def cdot { bin dotmath }
X def times { bin multiply }
X def "*" { bin asteriskmath }
X #def diamond { name used above }
X def circ { bin circle }
X #def bullet { name used above }
X def div { bin divide }
X def cap { bin intersection }
X def cup { bin union }
X def uplus { bin @OneRow @HContract { &0.5rt 0.7f @Font plus ^/0.2fo union}}
X def sqcap { bin
X { @HContract @VContract
X { "0 0 moveto 0 ysize lineto xsize ysize lineto"
X "xsize 0 lineto"
X "0.04 ft setlinewidth stroke"
X }
X @Graphic
X { 0.3f @Wide 0.3f @High ^| ^/
X 0.3f @Wide 0.3f @High
X }
X }
X }
X def sqcup { 180d @Rotate sqcap }
X def triangleleft { bin 90d @Rotate 0.8f @Font triangle }
X def triangleright { bin "-90d" @Rotate 0.8f @Font triangle}
X def wr { bin vctr {90d @Rotate similar} }
X def bigcirc { bin 1.2f @Font circle }
X def bigtriangleup { bin 1.2f @Font triangle }
X def bigtriangledown { bin 180d @Rotate 1.2f @Font triangle }
X def vee { bin logicalor }
X def wedge { bin logicaland }
X def oplus { bin circleplus }
X def ominus { bin @OneRow @HContract { circle /0io &0.5rt minus}}
X def otimes { bin circlemultiply }
X def oslash {`vctr 60d @Rotate @HContract {circle/0io &0.5rt minus`}}
X def odot { bin @OneRow @HContract {circle/0io &0.5rt dotmath}}
X def dagger { bin @Base "\262" }
X def daggerdbl { bin @Base "\263" }
X def amalg { bin 180d @Rotate vctr product }
X
X ###################################################################
X # #
X # Group 8 (relations) #
X # #
X # All Knuth's operators are available, but many have been #
X # given different, more mnemonic names. Also included is #
X # a not operator for negating the relations. #
X # #
X ###################################################################
X
X def "<" { rel less }
X def ">" { rel greater }
X def "=" { rel equal }
X def "<=" { rel lessequal }
X def prec { rel { 0.45f @Font "-90d" @Rotate
X { parenrighttp ^| parenlefttp }
X }
X }
X def preceq { rel { @OneRow non prec /0.1f minus } }
X def "<<" { rel {less less} }
X def subset { rel propersubset }
X def subseteq { rel reflexsubset }
X def sqsubseteq { rel @HContract @VContract
X { { "xsize 0 moveto"
X "0 0 lineto"
X "0 ysize lineto"
X "xsize ysize lineto"
X "0.04 ft setlinewidth stroke"
X }
X @Graphic
X { 0.5f @Wide 0.25f @High ^/
X 0.25f @High
X }
X /0.1f minus
X }
X }
X
X def in { rel element }
X def vdash { rel vctr{"-90d" @Rotate perpendicular}}
X def smile { rel vctr 90d @Rotate parenleft }
X def frown { rel vctr 90d @Rotate parenright }
X
X def ">=" { rel greaterequal }
X def succ { rel { 0.45f @Font 90d @Rotate
X { parenrighttp ^| parenlefttp }
X }
X }
X def succeq { rel { @OneRow non succ /0.1f minus } }
X def ">>" { rel {greater greater} }
X def supset { rel propersuperset }
X def supseteq { rel reflexsuperset }
X def sqsupseteq { rel @HContract @VContract
X { { "0 0 moveto xsize 0 lineto"
X "xsize ysize lineto"
X "0 ysize lineto"
X "0.04 ft setlinewidth stroke"
X }
X @Graphic
X { 0.5f @Wide 0.25f @High ^/
X 0.25f @High
X }
X /0.1f minus
X }
X }
X def ni { rel 180d @Rotate element }
X def dashv { rel vctr {90d @Rotate perpendicular} }
X def mid { rel @Base "|" }
X def parallel { rel @Base "||" }
X
X def "==" { rel equivalence }
X def "~" { rel similar }
X def "-~" { rel @OneRow{similar^/0.07f/0.07f minus}}
X def asymp { rel 0.7f @Font @OneRow
X { 90d @Rotate parenleft ^/0.008f
X /0.008f 90d @Rotate parenright }
X }
X def "~~" { rel approxequal }
X def "=~" { rel congruent }
X def bowtie { rel{non triangleright non triangleleft}}
X def propto { rel proportional }
X def models { rel{@Base vctr "|" &0.05fo vctr equal}}
X def doteq { rel @OneRow @HContract {&0.5rt dotmath^/0.15f equal}}
X def perp { rel perpendicular }
X
X def notsub { rel notsubset }
X def notin { rel notelement }
X def "!=" { rel notequal }
X
X def "<->" { rel arrowboth }
X def "<--" { rel arrowleft }
X def "-->" { rel arrowright }
X def up { rel arrowup }
X def down { rel arrowdown }
X def "<=>" { rel arrowdblboth }
X def "<==" { rel arrowdblleft }
X def "==>" { rel arrowdblright }
X def dblup { rel arrowdblup }
X def dbldown { rel arrowdbldown }
X
X def ":" { rel colon }
X def "::" { rel @OneCol {colon ` colon} }
X def ":=" { rel { colon{ //0.05fo equal} } }
X
X def not right x { @HContract {@OneCol x /0co &0.5rt slash}}
X
X
X ###################################################################
X # #
X # Groups 11 and 12 - openings and closings. #
X # #
X ###################################################################
X
X def lpar { parenleft }
X def rpar { parenright }
X def lbrack { bracketleft }
X def rbrack { bracketright }
X def lbrace { braceleft }
X def rbrace { braceright }
X def lfloor { bracketleftbt }
X def rfloor { bracketrightbt }
X def lceil { bracketlefttp }
X def rceil { bracketrighttp }
X def langle { angleleft }
X def rangle { angleright }
X
X def blpar { @OneRow {parenlefttp ^/ parenleftex / parenleftbt } }
X def brpar { @OneRow {parenrighttp ^/ parenrightex / parenrightbt } }
X def blbrack { @OneRow {bracketlefttp ^/ bracketleftex / bracketleftbt } }
X def brbrack { @OneRow {bracketrighttp ^/ bracketrightex / bracketrightbt} }
X def blbrace { @OneRow {bracelefttp ^/ braceleftmid / braceleftbt } }
X def brbrace { @OneRow {bracerighttp ^/ bracerightmid / bracerightbt } }
X def blfloor { @OneRow {bracketleftex ^/ bracketleftex / bracketleftbt } }
X def brfloor { @OneRow {bracketrightex ^/ bracketrightex / bracketrightbt} }
X def blceil { @OneRow {bracketlefttp ^/ bracketleftex / bracketleftex } }
X def brceil { @OneRow {bracketrighttp ^/ bracketrightex / bracketrightex} }
X def blangle { @HContract @VContract
X { "xsize 0 moveto"
X "0 ysize 2 div lineto"
X "xsize ysize lineto"
X "0.04 ft setlinewidth stroke"
X }
X @Graphic { 0.5f @Wide 2f @High ^/ 2f @High }
X }
X def brangle { @HContract @VContract
X { "0 0 moveto"
X "xsize ysize 2 div lineto"
X "0 ysize lineto"
X "0.04 ft setlinewidth stroke"
X }
X @Graphic { 0.5f @Wide 2f @High ^/ 2f @High }
X }
X
X
X ###################################################################
X # #
X # Group 13 - punctuation. #
X # #
X ###################################################################
X
X def ";" { punct semicolon }
X def "," { punct comma }
X def col { punct colon }
X
X
X ###################################################################
X # #
X # Additional short symbols (Knuth p. 132) #
X # #
X ###################################################################
X
X def "!" { exclam }
X def "?" { question }
X def "%" { percent }
X def "(" { parenleft }
X def ")" { parenright }
X def "[" { bracketleft }
X def "]" { bracketright }
X
X
X ###################################################################
X # #
X # Common mathematical functions (from Knuth p. 162). #
X # mod is included, since @Rel mod is easily typed if needed. #
X # #
X ###################################################################
X
X def arccos { @Base "arccos" }
X def arcsin { @Base "arcsin" }
X def arctan { @Base "arctan" }
X def arg { @Base "arg" }
X def cos { @Base "cos" }
X def cosh { @Base "cosh" }
X def cot { @Base "cot" }
X def coth { @Base "coth" }
X def csc { @Base "csc" }
X def deg { @Base "deg" }
X def det { @Base "det" }
X def dim { @Base "dim" }
X def exp { @Base "exp" }
X def gcd { @Base "gcd" }
X def hom { @Base "hom" }
X def inf { @Base "inf" }
X def ker { @Base "ker" }
X def lg { @Base "lg" }
X def lim { @Base "lim" }
X def liminf { @OneCol { @Base "lim" ` @Base "inf" } }
X def limsup { @OneCol { @Base "lim" ` @Base "sup" } }
X def ln { @Base "ln" }
X def log { @Base "log" }
X def max { @Base "max" }
X def min { @Base "min" }
X def Pr { @Base "Pr" }
X def sec { @Base "sec" }
X def sin { @Base "sin" }
X def sinh { @Base "sinh" }
X def supr { @Base "sup" }
X def tan { @Base "tan" }
X def tanh { @Base "tanh" }
X def mod { @Base "mod" }
X
X
X ###################################################################
X # #
X # Other symbols taken from TeX. #
X # #
X ###################################################################
X
X def ldots { . &0.3f . &0.3f . }
X def cdots { dotmath &0.3f dotmath &0.3f dotmath }
X def vdots { @OneRow { dotmath ^/0.3f dotmath /0.3f dotmath } }
X def ddots { @OneCol @OneRow
X { dotmath
X ^/0.3f |0.3f dotmath
X /0.3f | |0.3f dotmath


X }
X }
X
X
X ###################################################################

X # #
X # Symbols taken from eqn (Kernighan and Cherry 1975). #
X # #
X ###################################################################
X
X def del { gradient }
X def grad { gradient }
X def "..." { ellipsis }
X def ",...," { , ellipsis ``` , }
X def "'" { minute }
X def empty { emptyset }
X
X
X
X ###################################################################
X # #
X # Symbols with parameters. #
X # #
X # These symbols are essentially those of eqn, with some #
X # changes and additions. #
X # #
X ###################################################################
X
X def sup
X precedence 60
X associativity left
X left x
X named gap { @SupGap }
X right y
X { @HContract @VContract
X { | @Smaller y
X ^/gap x
X }
X }
X
X def sub
X precedence 60
X associativity left
X left x
X named gap { @SupGap }
X right y
X { @HContract @VContract
X {
X x
X /gap | @Smaller y
X }
X }
X
X def supp
X precedence 60
X associativity left
X left x
X named gap { @SupGap }
X right y
X { @HContract @VContract
X { { ^/gap x /gap } | @Smaller y
X }
X }
X
X def on
X precedence 61
X associativity left
X left x
X named gap { @SupGap }
X right y
X { x ^/ / y
X }
X
X def frac
X precedence 54
X associativity left
X left x
X named gap { 0ik }
X right y
X { @HContract @VContract @Smaller
X { x ^/gap | fraction /gap | | y }
X }
X
X def half { 1 frac 2 }
X def third { 1 frac 3 }
X
X def over
X precedence 54
X associativity left
X left x
X named gap { 0.2f }
X right y
X {
X @HContract @VContract
X { |0.5rt @OneCol x
X ^//gap @HLine
X //gap |0.5rt @OneCol y
X }
X }
X
X def from
X precedence 58
X associativity left
X left x
X named gap { @ThinGap }
X named skew { 0c }
X right y
X {
X @HContract @VContract
X { |0.5rt x
X //gap |0.5rt &skew @Smaller y
X }
X }
X
X def to
X precedence 58
X associativity left
X left x
X named gap { @ThinGap }
X named skew { 0c }
X right y
X {
X @HContract @VContract
X { |0.5rt &skew @Smaller y
X ^//gap |0.5rt x
X }
X }
X
X def widefrom
X precedence 58
X associativity left
X left x
X named gap { @ThinGap }
X right y
X {
X @HContract @VContract
X { x //gap @HScale y
X }
X }
X
X def wideto
X precedence 58
X associativity left
X left x
X named gap { @ThinGap }
X right y
X {
X @HContract @VContract
X { @HScale y ^//gap x
X }
X }
X
X def dot
X precedence 62
X left x
X named gap { @ThinGap }
X { x to gap { gap } skew { @SkewGap } .
X }
X
X def dotdot
X precedence 62
X left x
X named gap { @ThinGap }
X { x to gap { gap } skew { @SkewGap } ..
X }
X
X def hat
X precedence 62
X left x
X named gap { @ThinGap }
X { x to gap { gap } skew { @SkewGap } @Base "^"
X }
X
X def tilde
X precedence 62
X left x
X named gap { @ThinGap }
X { x to gap { gap } skew { @SkewGap } @Base "~"
X }
X
X def vec
X precedence 62
X left x
X named gap { @ThinGap }
X { x to gap { gap } skew { @SkewGap } arrowright
X }
X
X def dyad
X precedence 62
X left x
X named gap { @ThinGap }
X { x to gap { gap } skew { @SkewGap } arrowboth
X }
X
X def overbar
X precedence 62
X left x
X named gap { @ThinGap }
X { x wideto gap { gap } minus
X }
X
X def underbar
X precedence 62
X left x
X named gap { @ThinGap }
X { x widefrom gap { gap } minus
X }
X
X def sqrt
X precedence 56
X named gap { @ThinGap }
X right x
X {
X @HContract @VContract
X { @VScale surd | @OneRow
X { @HLine line { "0.03 ft setlinewidth 2 setlinecap" }
X ^//gap |gap x //gap
X }
X }
X }
X
X def root
X precedence 56


X left x
X right y

X { "" sup x &0io sqrt y
X }
X
X def above
X precedence 52
X left x
X named gap { @RowGap }
X right y
X { |0.5rt x //gap |0.5rt y
X }
X
X def labove
X precedence 52
X left x
X named gap { @RowGap }
X right y
X { x //gap y
X }
X
X def cabove
X precedence 52
X left x
X named gap { @RowGap }
X right y
X { |0.5rt x //gap |0.5rt y
X }
X
X def rabove
X precedence 52
X left x
X named gap { @RowGap }
X right y
X { |1rt x //gap |1rt y
X }
X
X def mabove
X precedence 52
X left x
X named gap { @RowGap }
X right y
X { x /gap y
X }
X
X def nextcol
X precedence 50
X left x
X named gap { @ColGap }
X right y
X { x |gap y
X }
X
X def matrix
X precedence 100
X named gap { @MedGap }
X named atleft {}
X named atright {}
X right x
X { vctr @HContract @VContract
X { @VScale atleft
X ||@ThinGap { //gap x //gap } ||@ThinGap
X @VScale atright
X }
X }
X
X Slope @Font 1.2f @Break 0c @Space @Body
X
X@End @Eq
END_OF_FILE
if test 35135 -ne `wc -c <'lout/include/eq'`; then
echo shar: \"'lout/include/eq'\" unpacked with wrong size!
fi
# end of 'lout/include/eq'
fi
if test -f 'lout/z36.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/z36.c'\"
else
echo shar: Extracting \"'lout/z36.c'\" \(31731 characters\)
sed "s/^X//" >'lout/z36.c' <<'END_OF_FILE'
X/*@z36.c:Hyphenation: Hyphenate()@********************************************/


X/* */
X/* LOUT: A HIGH-LEVEL LANGUAGE FOR DOCUMENT FORMATTING (VERSION 2.03) */
X/* COPYRIGHT (C) 1993 Jeffrey H. Kingston */
X/* */
X/* Jeffrey H. Kingston (je...@cs.su.oz.au) */
X/* Basser Department of Computer Science */
X/* The University of Sydney 2006 */
X/* AUSTRALIA */
X/* */
X/* This program is free software; you can redistribute it and/or modify */
X/* it under the terms of the GNU General Public License as published by */
X/* the Free Software Foundation; either version 1, or (at your option) */
X/* any later version. */
X/* */
X/* This program is distributed in the hope that it will be useful, */
X/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
X/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
X/* GNU General Public License for more details. */
X/* */
X/* You should have received a copy of the GNU General Public License */
X/* along with this program; if not, write to the Free Software */
X/* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
X/* */

X/* FILE: z36.c */
X/* MODULE: Hyphenation */
X/* EXTERNS: Hyphenate() */


X/* */
X/*****************************************************************************/
X#include "externs"

X#define MAX_CHAR 256 /* max chars represented in one char */
X#define TRIE_MAGIC 5361534
X#define KILL_CLASS 0 /* characters which prevent hyphen'n */
X#define PUNCT_CLASS 1 /* characters which delimit hyphen'n */
X
Xtypedef struct trie_rec
X{ int magic; /* a magic number to make sure ok */
X int class_count; /* the number of character classes */
X unsigned char class[MAX_CHAR]; /* the character classes */
X short *node_mem; /* the node memory */
X int node_lim; /* top of node memory */
X int node_free; /* first free space in node memory */
X unsigned char *string_mem; /* the string memory */
X int string_lim; /* top of string memory */
X int string_first; /* the first (last inserted) string */
X} *TRIE;
X
X
X#ifdef DEBUG_ON
X/*****************************************************************************/
X/* */
X/* findrep(i, T) Returns one character whose class in T is i. */
X/* */
X/*****************************************************************************/
X
Xstatic unsigned char findrep(i, T)
Xint i; TRIE T;
X{ int ch;
X for( ch = 0; ch < MAX_CHAR; ch++ ) if( T->class[ch] == i ) return ch;
X Error(INTERN, no_fpos, "hyph DoTriePrint: findrep failed");
X} /* end findrep */


X#endif
X
X
X/*****************************************************************************/
X/* */

X/* TRIE T */
X/* */
X/* The packed hyphenation table, or NULL if not yet read in. */
X/* */
X/*****************************************************************************/
X
Xstatic TRIE T = (TRIE) NULL; /* the compressed hyphenation table */
X
X/*@@**************************************************************************/
X/* */
X/* TRIE NewTrie(node_lim, string_lim) */
X/* */
X/* Initialize a new trie with the given amount of space for nodes and */
X/* strings. */
X/* */
X/*****************************************************************************/
X
Xstatic TRIE NewTrie(node_lim, string_lim)
Xint node_lim, string_lim;
X{ TRIE T; int i; char *malloc();
X debug2(DHY, D, "NewTrie(%d, %d)", node_lim, string_lim);
X T = (TRIE) malloc( sizeof(struct trie_rec)
X + node_lim*sizeof(short) + string_lim*sizeof(char));
X T->magic = TRIE_MAGIC; T->class_count = 1;
X for( i = 0; i < MAX_CHAR; i++ ) T->class[i] = 0;
X T->node_mem = (short *) ( (char *) T + sizeof(struct trie_rec));
X T->node_lim = node_lim; T->node_free = 0;
X T->string_mem = (unsigned char *) &(T->node_mem[node_lim]);
X T->string_lim = T->string_first = string_lim;
X debug0(DHY, D, "NewTrie returning.");
X return T;
X} /* end NewTrie */


X
X
X/*****************************************************************************/
X/* */

X/* ClassConvert(in, out, T) */
X/* */
X/* Set out[i] to the character class of in[i] in T, for all i. */
X/* */
X/*****************************************************************************/
X
X#define ClassConvert(in, out, T) \
X{ int i; \
X for( i = 0; in[i] != '\0'; i++ ) \
X if( T->class[in[i]] != 0 ) out[i] = T->class[in[i]]; \
X else Error(INTERN, no_fpos, "hyph: \"%s\" has illegal class", in); \
X out[i] = '\0'; \
X} /* end ClassConvert */


X
X
X/*****************************************************************************/
X/* */

X/* short NewTrieString(str, T) */
X/* */
X/* Copy a new string into T, and return its offset in string_mem; */
X/* */
X/*****************************************************************************/
X
Xstatic short NewTrieString(str, T)
Xunsigned char *str; TRIE T;
X{ int i; short res = T->string_first - strlen(str) - 1;
X if( res < 0 ) Error(INTERN, no_fpos, "hyph: trie string limit exceeded");
X T->string_first = res; strcpy(&(T->string_mem[res]), str);
X return res;
X} /* end NewTrieString */


X
X
X/*****************************************************************************/
X/* */

X/* int NewTrieNode(T) */
X/* */
X/* Allocate a new empty trie node in T, and return its offset in node_mem. */
X/* */
X/*****************************************************************************/
X
Xstatic int NewTrieNode(T)
XTRIE T;
X{ int i; int res;
X if( T->node_free + T->class_count > T->node_lim )
X Error(INTERN, no_fpos, "hyph: trie node limit exceeded");
X res = T->node_free; T->node_free += T->class_count;
X for( i = res; i < T->node_free; i++ ) T->node_mem[i] = 0;
X return res;
X} /* end NewTrieNode */


X
X
X/*@@**************************************************************************/
X/* */

X/* AddClassToTrie(str, T) */
X/* */
X/* Add a new character class, whose members are the characters of str, to */
X/* trie T. This cannot occur after the first insertion. */
X/* */
X/*****************************************************************************/
X
Xstatic AddClassToTrie(str, T)
Xunsigned char *str; TRIE T;
X{ int i;
X if( T->string_first != T-> string_lim )
X Error(INTERN, no_fpos, "hyph AddClassToTrie after first insertion!");
X for( i = 0; str[i] != '\0'; i++ )
X if( T->class[str[i]] == 0 ) T->class[str[i]] = T->class_count;
X else Error(INTERN,no_fpos, "hyph: class of %c may not be changed!", str[i]);
X T->class_count++;
X} /* end AddClassToTrie */


X
X
X/*****************************************************************************/
X/* */

X/* TrieInsert(key, value, T) */
X/* */
X/* Insert a new key and value into trie T. */
X/* */
X/*****************************************************************************/
X
XTrieInsert(key, value, T)
Xunsigned char *key, *value; TRIE T;
X{ unsigned char str[MAX_LINE]; int i, curr_node, next_node, pos, ch;
X debug2(DHY, D, "TrieInsert(%s, %s, T)", key, value);
X
X /* if first insertion, add one node after making sure class_count is even */
X if( T->node_free == 0 )
X { T->class_count = 2 * ceiling(T->class_count, 2);
X ch = NewTrieNode(T);
X }
X
X /* invariant: curr_node is an existing node of T with prefix str[0..i-1] */
X ClassConvert(key, str, T);
X curr_node = i = 0;
X for(;;)
X {
X /* if str is ended, add value only to string memory */
X if( str[i] == '\0' )
X { if( T->node_mem[curr_node] != 0 )
X Error(INTERN, no_fpos, "hyph string %s already inserted", key);
X else T->node_mem[curr_node] = - NewTrieString(value, T);
X debug0(DHY, D, "TrieInsert returning (empty suffix).");
X return;
X }
X
X /* if next position is unoccupied, store remainder of str and value */
X next_node = T->node_mem[curr_node + str[i]];
X if( next_node == 0 )
X { ch = NewTrieString(value, T);
X T->node_mem[curr_node + str[i]] = - NewTrieString(&str[i+1], T);
X debug0(DHY, D, "TrieInsert returning (non-empty suffix).");
X return;
X }
X
X /* if next position is occupied by a non-empty string, move that */
X /* string down one level and replace it by a trie node */
X if( next_node < 0 )
X { pos = - next_node;
X ch = T->string_mem[pos];
X if( T->string_first == pos ) T->string_first++;
X T->node_mem[curr_node + str[i]] = next_node = NewTrieNode(T)/2;
X T->node_mem[2*next_node + ch] = -(pos+1);
X }
X
X /* now next is the offset of the next node to be searched */
X curr_node = 2*next_node; i++;
X }
X} /* end TrieInsert */


X
X
X/*@@**************************************************************************/
X/* */

X/* BeGetChar(fp, pv) */
X/* BePutChar(fp, v) */
X/* BeGetShort(fp, pv) */
X/* BePutShort(fp, v) */
X/* BeGetInt(fp, pv) */
X/* BePutInt(fp, v) */
X/* */
X/* Get char, short, or int pv from file fp, and put char, short, or int */
X/* onto file fp. These routines are designed so that the file can be */
X/* written or read safely by big-endian and little-endian architectures; */
X/* this is accomplished by reading and writing one byte at a time to and */
X/* from a big-endian format file. All return 0 on success, -1 on failure. */
X/* Thanks to David W. Sanderson for this code. */
X/* */
X/*****************************************************************************/
X
X#define BeGetChar(fp, pv) ( (c = getc(fp)) == EOF ? -1 : (*pv = c & 0xFF, 0) )
X#define BePutChar(fp, v) ( putc(v & 0xFF, fp), 0 )
X
X#define BeGetShort(fp, pv) \
X( (c = getc(fp)) == EOF ? -1 : \
X ( *pv = (c & 0xFF) << 8, \
X (c = getc(fp)) == EOF ? -1 : (*pv |= c & 0xFF, 0) \
X ) \
X)
X
X#define BePutShort(fp, v) \
X( putc((v >> 8) & 0xFF, fp), putc(v & 0xFF, fp), 0 )
X
Xint BeGetInt(fp, pv)
XFILE *fp; int *pv;
X{ int c;
X if ((c = getc(fp)) == EOF) return -1;
X *pv = (c & 0xFF) << 24;
X if ((c = getc(fp)) == EOF) return -1;
X *pv |= (c & 0xFF) << 16;
X if ((c = getc(fp)) == EOF) return -1;
X *pv |= (c & 0xFF) << 8;
X if ((c = getc(fp)) == EOF) return -1;
X *pv |= c & 0xFF;
X return 0;
X}
X
Xint BePutInt(fp, v)
XFILE *fp; int v;
X{
X putc((v >> 24) & 0xFF, fp);
X putc((v >> 16) & 0xFF, fp);
X putc((v >> 8) & 0xFF, fp);
X putc(v & 0xFF, fp);
X return 0;
X}


X
X
X/*@@**************************************************************************/
X/* */

X/* TRIE TrieRead() */
X/* */
X/* Read in a packed trie if possible, otherwise pack an unpacked one. */
X/* */
X/*****************************************************************************/
X
XTRIE TrieRead()
X{ TRIE T; FILE_NUM unpacked_fnum, packed_fnum;
X FILE *unpacked_fp, *packed_fp; int len, prev, i, j, c;
X char *malloc();
X debug0(DHY, D, "TrieRead()");
X
X /* open file, using name stored in file handler */
X packed_fnum = FirstFile(HYPH_PACKED_FILE);
X assert( packed_fnum != NO_FILE, "TrieRead: packed_fnum!" );
X packed_fp = OpenFile(packed_fnum, FALSE);
X if( packed_fp == NULL )
X {
X /* no packed file, so open unpacked one instead */
X unsigned char str[MAX_LINE], key[MAX_LINE], value[MAX_LINE],
X buff[MAX_LINE+10];
X unpacked_fnum = FirstFile(HYPH_FILE);
X assert( unpacked_fnum != NO_FILE, "TrieRead: unpacked unpacked_fnum!" );
X unpacked_fp = OpenFile(unpacked_fnum, FALSE);
X if( unpacked_fp == NULL )
X { Error(WARN, no_fpos, "cannot open hyphenation file %s",
X FileName(unpacked_fnum));
X return (TRIE) NULL;
X }
X
X /* read in unpacked hyphenation trie from unpacked_fp and compress it */
X T = NewTrie(60000, 32767);
X while( fgets(str, MAX_LINE, unpacked_fp) != NULL && str[0] != '\n' )
X { str[strlen(str)-1] = '\0';
X debug1(DHY, D, "adding class %s", str);
X AddClassToTrie(str, T);
X }
X while( fgets(str, MAX_LINE, unpacked_fp) != NULL && str[0] != '\n' )
X { prev = '0'; j = 0;
X for( i = 0; str[i] != '\n' && str[i] != '\0'; i++ )
X { if( str[i] >= '0' && str[i] <= '9' ) prev = str[i];
X else key[j] = str[i], value[j++] = prev, prev = '0';
X }
X key[j] = '\0'; value[j] = prev; value[j+1] = '\0';
X TrieInsert(key, value, T);
X }
X fclose(unpacked_fp);
X len = CompressTrie(T);
X
X /* write the compressed trie out to the packed file */
X strcpy(buff, FileName(unpacked_fnum));
X strcat(buff, HYPH_SUFFIX);
X packed_fp = fopen(buff, "w");
X if( packed_fp == NULL ) Error(FATAL, no_fpos,
X "cannot write to hyphenation file %s", buff);
X BePutInt(packed_fp, T->magic);
X BePutInt(packed_fp, T->class_count);
X for( i = 0; i < MAX_CHAR; i++ ) BePutChar(packed_fp, T->class[i]);
X BePutInt(packed_fp, 0); /* placeholder for node_mem */
X BePutInt(packed_fp, T->node_lim);
X BePutInt(packed_fp, T->node_free);
X BePutInt(packed_fp, 0); /* placeholder for string_mem */
X BePutInt(packed_fp, T->string_lim);
X BePutInt(packed_fp, T->string_first);
X for( i = 0; i < T->node_free; i++ ) BePutShort(packed_fp, T->node_mem[i]);
X for( i = 0; i < T->string_lim; i++) BePutChar(packed_fp, T->string_mem[i]);
X fclose(packed_fp);
X /***OLD*VERSION*********************************************************
X if( fwrite( (char *) T, len, 1, packed_fp) != 1 ) Error(FATAL, no_fpos,
X "error on write to hyphenation file %s", buff);
X ***********************************************************************/
X
X /* now try again to open packed_fnum, the file just written */
X packed_fp = OpenFile(packed_fnum, FALSE);
X if( packed_fp == NULL ) Error(FATAL, no_fpos,
X "cannot open hyphenation file %s", FileName(packed_fnum));
X }
X
X /* now packed hyphenation file is open, read it in */
X fseek(packed_fp, 0L, 2); len = (int) ftell(packed_fp); rewind(packed_fp);
X T = (TRIE) malloc(len);
X /***OLD*VERSION**********************************************************
X if( fread( (char *) T, len, 1, packed_fp) != 1 ) Error(FATAL, no_fpos,
X "error on read of hyphenation file %s", FileName(packed_fnum));
X ************************************************************************/
X if( BeGetInt(packed_fp, &T->magic) != 0 ) Error(FATAL, no_fpos,
X "error on read from packed hyphenation file %s", FileName(packed_fnum));
X if( T->magic != TRIE_MAGIC ) Error(FATAL, no_fpos,
X "bad magic number in hyphenation file %s", FileName(packed_fnum));
X BeGetInt(packed_fp, &T->class_count);
X for( i = 0; i < MAX_CHAR; i++ ) BeGetChar(packed_fp, &T->class[i]);
X BeGetInt(packed_fp, &i); /* placeholder for node_mem */
X BeGetInt(packed_fp, &T->node_lim);
X BeGetInt(packed_fp, &T->node_free);
X BeGetInt(packed_fp, &i); /* placeholder for string_mem */
X BeGetInt(packed_fp, &T->string_lim);
X BeGetInt(packed_fp, &T->string_first);
X T->node_mem = (short *) ( (char *) T + sizeof(struct trie_rec) );
X T->string_mem = (unsigned char *) &(T->node_mem[T->node_lim]);
X for( i = 0; i < T->node_free; i++ ) BeGetShort(packed_fp, &T->node_mem[i]);
X for( i = 0; i < T->string_lim; i++ ) BeGetChar(packed_fp, &T->string_mem[i]);
X
X /* debug and exit */
X debug0(DHY, D, "TrieRead returning, T =");
X ifdebug(DHY, DD, TriePrint(T, stderr));
X return T;
X} /* end TrieRead */


X
X
X/*@@**************************************************************************/
X/* */

X/* int CompressTrie(T) */
X/* */
X/* Compress trie T and return its length in characters. */
X/* */
X/*****************************************************************************/
X
Xint CompressTrie(T)
XTRIE T;
X{ unsigned char *p, *q; int len, i;
X debug0(DHY, D, "CompressTrie(T), T =");
X ifdebug(DHY, DD, TriePrint(T, stderr));
X T->node_lim = T->node_free;
X for( i = 0; i < T->node_lim; i++ )
X if( T->node_mem[i] < 0 )
X T->node_mem[i] = - ( -T->node_mem[i] - T->string_first);
X p = (unsigned char *) &(T->node_mem[T->node_free]);
X q = &(T->string_mem[T->string_first]);
X len = T->string_lim - T->string_first;
X for( i = 0; i < len; i++ ) *p++ = *q++;
X T->string_mem = (unsigned char *) &(T->node_mem[T->node_lim]);
X T->string_first = 0;
X T->string_lim = len;
X len = sizeof(struct trie_rec) + T->node_lim * sizeof(short)
X + T->string_lim * sizeof(unsigned char);
X debug1(DHY, D, "CompressTrie returning %d, T =", len);
X ifdebug(DHY, DD, TriePrint(T, stderr));
X return len;
X} /* end CompressTrie */


X
X
X/*****************************************************************************/
X/* */

X/* AccumulateRating(x, y) */
X/* */
X/* Accumulate the hyphenation rating string x into y. */
X/* */
X/*****************************************************************************/
X
X#define AccumulateRating(x, y) \
X{ unsigned char *p = x, *q = y; \
X while( *p ) \
X { if( *p > *q ) *q = *p; \
X p++, q++; \
X } \
X} /* end AccumulateRating */


X
X
X/*@@**************************************************************************/
X/* */

X/* OBJECT Hyphenate(x) */
X/* */
X/* Hyphenate ACAT object x, returning the hyphenated result. */
X/* */
X/*****************************************************************************/
X
XOBJECT Hyphenate(x)
XOBJECT x;
X{ OBJECT link, y, z, next_link;
X unsigned char str[MAX_LINE+2], rate[MAX_LINE+3],
X *class, *key, *ss, *s, *rem, *p, *q;
X int start, stop, i, j, curr_node, next_node, pos;
X BOOLEAN hyphenated; static ShowRate();
X static BOOLEAN tried_file = FALSE;
X assert( type(x) == ACAT, "Hyphenate: type(x) != ACAT!" );
X debug1(DHY, DD, "Hyphenate(%s)", EchoObject(null, x));
X
X /* if no trie is present, try to get it from a file */
X if( T == (TRIE) NULL )
X { if( !tried_file ) T = TrieRead();
X tried_file = TRUE;
X if( T == (TRIE) NULL )
X { debug0(DHY, DD, "Hyphenate returning (no trie).");
X return x;
X }
X }
X
X /* for each word y of x, try to hyphenate it */


X for( link = Down(x); link != x; link = NextDown(link) )
X { Child(y, link);

X if( type(y) != WORD ) continue;
X debug1(DHY, DD, "Hyphenate() examining %s", EchoObject(null, y));
X
X /* start := index of y's first letter, stop := index following last */
X key = string(y); class = T->class;
X for( start = 0; class[key[start]] == PUNCT_CLASS; start++ );
X for( stop = start; class[key[stop]] > PUNCT_CLASS; stop++ );
X
X /* if a - ended the run, hyphenate there only */
X if( key[stop] == '-' )
X { next_link = NextDown(link);
X z = MakeWord(&key[stop+1], &fpos(y));
X word_font(z) = word_font(y);
X FontAtomSize(z);
X Link(NextDown(link), z);
X z = New(GAP_OBJ);
X SetGap(gap(z), FALSE, TRUE, FIXED_UNIT, HYPH_MODE, 0);
X Link(NextDown(link), z);
X Link(z, MakeWord("0ch", &fpos(y)));
X key[stop + 1] = '\0';
X FontAtomSize(y);
X link = PrevDown(next_link);
X continue;
X }
X
X /* don't hyphenate if less than 5 letters, or a kill char is nearby */
X if( stop - start < 5 ) continue;
X if( key[stop] != '\0' && class[key[stop]] == KILL_CLASS ) continue;
X
X /* let str[] be the converted substring, let rate[] be all '0' */
X str[0] = PUNCT_CLASS; rate[0] = '0';
X for( i = 0; i < stop - start; i++ )
X { str[i+1] = class[key[start + i]];
X rate[i+1] = '0';
X }
X str[i+1] = PUNCT_CLASS; rate[i+1] = '0';
X str[i+2] = '\0'; rate[i+2] = '0';
X rate[i+3] = '\0';
X ifdebug(DHY, DD, ShowRate(key, start, stop, rate, stderr));
X
X /* for each suffix of str[], accumulate patterns matching its prefixes */
X ss = str;
X do
X {
X ifdebug(DHY, DD,
X fprintf(stderr, "trying suffix \"");
X for( p = ss; *p != 0; p++ ) fprintf(stderr, "%c", findrep(*p, T));
X fprintf(stderr, "\"\n");
X );
X
X /* accumulate all prefixes of ss */
X curr_node = 0; s = ss;
X for(;;)
X {
X /* if curr_node has empty string, that is one prefix */
X pos = T->node_mem[curr_node];
X if( pos < 0 )
X { AccumulateRating(&T->string_mem[- pos], rate+(ss-str));
X debug1(DHY, DD, " found %s", &(T->string_mem[- pos]));
X }
X
X /* if ss is finished, no other prefixes are possible */
X if( *s == '\0' ) break;
X
X /* determine next_node and break if empty */
X next_node = T->node_mem[curr_node + *s];
X if( next_node == 0 ) break;
X
X /* if next_node is a string, check whether it is a prefix of ss */
X if( next_node < 0 )
X { rem = &(T->string_mem[-next_node]);
X do
X { if( *rem == '\0' )
X { AccumulateRating(rem+1, rate+(ss-str));
X debug1(DHY, DD, " found %s", rem+1);
X break;
X }
X } while( *++s == *rem++ );
X break;
X }
X
X /* otherwise go on to the next trie node */
X curr_node = 2*next_node; s++;
X }
X } while( *(++ss + 2) != PUNCT_CLASS );
X ifdebug(DHY, DD, ShowRate(key, start, stop, rate, stderr));
X
X /* now rate[] has accumulated ratings; use it to perform hyphenations */
X hyphenated = FALSE;
X /* hyphenate after any concluding - */
X /* *** now doing this at start only (see above)
X if( key[stop] == '-' )
X {
X z = MakeWord(&key[stop+1], &fpos(y));
X word_font(z) = word_font(y);
X FontAtomSize(z);
X Link(NextDown(link), z);
X z = New(GAP_OBJ);
X SetGap(gap(z), FALSE, TRUE, FIXED_UNIT, HYPH_MODE, 0);
X Link(NextDown(link), z);
X Link(z, MakeWord("0ch", &fpos(y)));
X key[stop + 1] = '\0';
X hyphenated = TRUE;
X }
X *** */
X next_link = NextDown(link);
X for( i = stop - start - 1; i >= 3; i-- )
X {
X /* hyphenate at i if rate[i] is odd */
X if( is_odd(rate[i]) )
X { z = MakeWord(&key[start+i-1], &fpos(y));
X word_font(z) = word_font(y);
X FontAtomSize(z);
X Link(NextDown(link), z);
X z = New(GAP_OBJ);
X SetGap(gap(z), FALSE, TRUE, FIXED_UNIT, HYPH_MODE, 0);
X Link(NextDown(link), z);
X Link(z, MakeWord("0ch", &fpos(y)));
X key[start + i - 1] = '\0';
X hyphenated = TRUE;
X }
X }
X if( hyphenated )
X { FontAtomSize(y);
X link = PrevDown(next_link);
X }
X
X } /* end for each word */
X
X debug1(DHY, DD, "Hyphenate returning %s", EchoObject(null, x));
X return x;
X} /* end Hyphenate */


X
X
X/*@@**************************************************************************/
X/* */

X/* unsigned char *TrieRetrieve(key, T) */
X/* */
X/* Retrieve the value associated with key in T, or NULL if not present. */
X/* */
X/*****************************************************************************/
X#if DEBUG_ON
X
Xunsigned char *TrieRetrieve(key, T)
Xunsigned char *key; TRIE T;
X{ unsigned char str[MAX_LINE]; int i, curr_node, next_node, pos;
X debug1(DHY, DD, "TrieRetrieve(%s, T)", key);
X ClassConvert(key, str, T);
X
X /* invariant: curr_node is an existing node of T with prefix str[0..i-1] */
X curr_node = i = 0;
X for(;;)
X {
X /* if next_node is 0, the string was never inserted */
X next_node = T->node_mem[curr_node + str[i]];
X if( next_node == 0 ) return (unsigned char *) NULL;
X
X /* if next_node < 0 it represents an offset into the string memory */
X if( next_node < 0 )
X { pos = - next_node;
X if( str[i] != '\0' )
X { do
X { if( str[++i] != T->string_mem[pos++] ) return (unsigned char *) NULL;
X } while( str[i] != '\0' );
X }
X return &(T->string_mem[pos]);
X }
X
X /* otherwise next_node is the trie node to be searched next */
X curr_node = 2*next_node; i++;
X }
X} /* end TrieRetrieve */


X
X
X/*****************************************************************************/
X/* */

X/* ShowRate(key, start, stop, rate, fp) */
X/* */
X/* Debug print of key[] and rate[] on file fp. */
X/* */
X/*****************************************************************************/
X
Xstatic ShowRate(key, start, stop, rate, fp)
Xunsigned char *key; int start, stop; unsigned char *rate; FILE *fp;
X{ int i;
X fprintf(fp, "key: ");
X for( i = start; i < stop; i++ ) fprintf(fp, " %c", key[i]);
X fprintf(fp, "\nrate:");
X for( i = 0; rate[i] != '\0'; i++ ) fprintf(fp, " %c", rate[i]);
X fprintf(fp, "\n");
X} /* end ShowRate */


X
X
X/*@@**************************************************************************/
X/* */

X/* DoTriePrint(T, node, len, fp) */
X/* */
X/* Print on file fp the subset of the entries of trie T stored in node and */
X/* its descendants. The node has prefix prefix[0..len-1]. */
X/* */
X/*****************************************************************************/
X
Xstatic unsigned char prefix[MAX_LINE];
X
Xstatic DoTriePrint(T, node, len, fp)
XTRIE T; int node, len; FILE *fp;
X{ int i, next_node, pos;
X for( i = 0; i < T->class_count; i++ )
X {
X /* if next_node < 0, have string to print */
X next_node = T->node_mem[node + i];
X if( next_node < 0 )
X {
X prefix[len] = '\0';
X fprintf(fp, "%s", prefix);
X pos = - next_node;
X if( i != 0 )
X {
X fprintf(fp, "%c", findrep(i, T));
X while( T->string_mem[pos] != '\0' )
X { fprintf(fp, "%c", findrep(T->string_mem[pos], T));
X pos++;
X }
X pos++;
X }
X fprintf(fp, " %s\n", &(T->string_mem[pos]));
X }
X
X /* else if next_node > 0 have a child node to explore */
X else if( next_node > 0 )
X { assert( i > 0, "DoTriePrint: i == 0!" );
X prefix[len] = findrep(i, T);
X prefix[len+1] = '\0';
X DoTriePrint(T, 2*next_node, len+1, fp);
X }
X }
X} /* end DoTriePrint */


X
X
X/*****************************************************************************/
X/* */

X/* TriePrint(T, fp) */
X/* */
X/* Print trie T on file fp. */
X/* */
X/*****************************************************************************/
X
XTriePrint(T, fp)
XTRIE T; FILE *fp;
X{ int i, j, ch;
X assert( T-> magic == TRIE_MAGIC, "TriePrint: magic!" );
X fprintf(fp, "Classes:");
X for( i = 1; i < T->class_count; i++ )
X { fprintf(fp, " ");
X for( ch = 0; ch < MAX_CHAR; ch++ )
X if( T->class[ch] == i ) fprintf(fp, "%c", ch);
X }
X fprintf(fp, "\n");
X fprintf(fp, "Node space: %d capacity, %d used\n", T->node_lim, T->node_free);
X fprintf(fp, "String space: %d capacity, %d used\n", T->string_lim,
X T->string_lim - T->string_first);
X prefix[0] = '\0';
X DoTriePrint(T, 0, 0, fp);
X} /* end TriePrint */
X#endif
END_OF_FILE
if test 31731 -ne `wc -c <'lout/z36.c'`; then
echo shar: \"'lout/z36.c'\" unpacked with wrong size!
fi
# end of 'lout/z36.c'
fi
echo shar: End of archive 8 \(of 30\).
cp /dev/null ark8isdone

Jeff Kingston

unread,
Jun 1, 1993, 1:18:15 AM6/1/93
to
Submitted-by: je...@joyce.cs.su.oz.au (Jeff Kingston)
Posting-number: Volume 37, Issue 107
Archive-name: lout/part09
Environment: UNIX

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: lout/z14.c lout/z19.c lout/z23.c
# Wrapped by kent@sparky on Sun May 30 19:43:55 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 9 (of 30)."'
if test -f 'lout/z14.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/z14.c'\"
else
echo shar: Extracting \"'lout/z14.c'\" \(27879 characters\)
sed "s/^X//" >'lout/z14.c' <<'END_OF_FILE'
X/*@z14.c:Fill Service:FillObject()@*******************************************/


X/* */
X/* LOUT: A HIGH-LEVEL LANGUAGE FOR DOCUMENT FORMATTING (VERSION 2.03) */
X/* COPYRIGHT (C) 1993 Jeffrey H. Kingston */
X/* */
X/* Jeffrey H. Kingston (je...@cs.su.oz.au) */
X/* Basser Department of Computer Science */
X/* The University of Sydney 2006 */
X/* AUSTRALIA */
X/* */
X/* This program is free software; you can redistribute it and/or modify */
X/* it under the terms of the GNU General Public License as published by */
X/* the Free Software Foundation; either version 1, or (at your option) */
X/* any later version. */
X/* */
X/* This program is distributed in the hope that it will be useful, */
X/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
X/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
X/* GNU General Public License for more details. */
X/* */
X/* You should have received a copy of the GNU General Public License */
X/* along with this program; if not, write to the Free Software */
X/* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
X/* */

X/* FILE: z14.c */
X/* MODULE: Fill Service */
X/* EXTERNS: FillObject() */


X/* */
X/*****************************************************************************/
X#include "externs"

X#define TOO_TIGHT_BAD 1048576 /* 2^20; badness of a too tight line */
X#define TOO_LOOSE_BAD 65536 /* 2^16; the max badness of a too loose line */
X#define TIGHT_BAD 4096 /* 2^12; the max badness of a tight line */
X#define LOOSE_BAD 4096 /* 2^12; the max badness of a loose line */
X#define HYPH_BAD 2048 /* 2^11; threshold for calling hyphenation */
X#define SQRT_TOO_LOOSE 256 /* 2^ 8; sqrt(TOO_LOOSE_BAD) */
X#define SQRT_TIGHT_BAD 64 /* 2^ 6; sqrt(TIGHT_BAD) */
X#define SQRT_LOOSE_BAD 64 /* 2^ 6; sqrt(LOOSE_BAD) */
X#define MAX_EXPAND 1
X#define MAX_SHRINK 3
X
X
Xtypedef struct {
X OBJECT llink; /* link to gap before left end of interval */
X OBJECT rlink; /* link to gap before right end of interval */
X LENGTH nat_width; /* natural width of interval */
X LENGTH space_width; /* natural width of spaces in the interval */
X int badness; /* badness of this interval */
X unsigned char class; /* badness class of this interval */
X unsigned char tab_count; /* number of gaps with tab mode in interval */
X LENGTH tab_pos; /* if tab_count > 0, this holds the position */
X /* of the left edge of the object following */
X /* the rightmost tab gap in the interval */
X LENGTH width_to_tab; /* if tab_count > 0, the interval's width up */
X /* to but not including the rightmost tab */
X} INTERVAL;
X
X#define unbreakable(g, hyph_allowed) \
X(width(g)==0 && (!hyph_allowed || (mode(g)!=HYPH_MODE && mode(g)!=ADD_HYPH)))


X
X
X/*****************************************************************************/
X/* */

X/* Badness classes */
X/* */
X/*****************************************************************************/
X
X#define TOO_LOOSE 0 /* interval is too loose */
X#define LOOSE 1 /* interval is loose but not too loose */
X#define TIGHT 2 /* interval is tight but not too tight */
X#define TOO_TIGHT 3 /* interval is too tight */
X#define TAB_OVERLAP 4 /* interval has a tab and left part overlaps */
X#define AT_END 5 /* interval ends at right end of paragraph */
X#define ZERO_AT_LEFT 6 /* interval has a zero-width gap at left */
X#define ZERO_AT_RIGHT 7 /* interval has a zero-width gap at right */
X#define EMPTY_INTERVAL 8 /* interval is empty */


X
X
X/*@@**************************************************************************/
X/* */

X/* SetIntervalBadness(I) */
X/* */
X/* Private, calculates the badness and badness class of an interval. */
X/* Does not take into account any zero-width gap at either end. */
X/* */
X/*****************************************************************************/
X
X#define SetIntervalBadness(I, max_width, etc_width) \
X{ OBJECT g; int badness; \
X LENGTH col_width; \
X if( I.llink == x ) \
X { col_width = max_width; \
X I.badness = 0; \
X } \
X else \
X { col_width = etc_width; \
X Child(g, I.llink); \
X I.badness = save_badness(g); \
X } \
X \
X if( I.tab_count > 0 && I.width_to_tab > I.tab_pos ) \
X { I.class = TAB_OVERLAP; \
X I.badness += TOO_TIGHT_BAD; \
X } \
X else if( MAX_EXPAND*(col_width-I.nat_width) > 2*I.space_width ) \
X { I.class = I.tab_count > 0 ? LOOSE : TOO_LOOSE; \
X badness = (SQRT_TOO_LOOSE*(col_width - I.nat_width)) / col_width; \
X I.badness += badness * badness; \
X } \
X else if( I.nat_width <= col_width ) \
X { I.class = LOOSE; \
X badness = (SQRT_LOOSE_BAD*(col_width - I.nat_width)) / col_width; \
X I.badness += badness * badness; \
X } \
X else if( MAX_SHRINK*(I.nat_width-col_width) <= I.space_width ) \
X { I.class = TIGHT; \
X badness = (SQRT_TIGHT_BAD*(col_width - I.nat_width)) / col_width; \
X I.badness += badness * badness; \
X } \
X else \
X { I.class = TOO_TIGHT; \
X I.badness += TOO_TIGHT_BAD; \
X } \
X} /* end macro SetIntervalBadness */
X
X/*@@**************************************************************************/
X/* */
X/* CorrectOversizeError(x, link, y, etc_width) */
X/* */
X/* Child y of x, whose link is link, has caused an oversize error, either */
X/* because it is wider than etc_width, or because it is joined by zero- */
X/* width gaps on the left to other objects with oversize total size. */
X/* In the first case, the correction is to replace the object by an */
X/* empty object; in the second case, the correction is to widen the gap. */
X/* */
X/*****************************************************************************/
X
Xstatic CorrectOversizeError(x, link, y, etc_width, hyph_allowed)
XOBJECT x, link, y; LENGTH etc_width; BOOLEAN hyph_allowed;
X{ OBJECT tmp, g; BOOLEAN done;
X
X /* if there is a preceding unbreakable gap, make it breakable */
X done = FALSE;
X if( PrevDown(link) != x )
X { Child(g, PrevDown(link));
X assert( type(g) == GAP_OBJ, "CorrectOversizeError: left gap!" );
X if( unbreakable(gap(g), hyph_allowed) )
X { SetGap(gap(g), FALSE, TRUE, FIXED_UNIT, EDGE_MODE, 1);
X Error(WARN, &fpos(g), "line break may occur here due to wide object");
X done = TRUE;
X }
X }
X
X /* else replace the wide object by an empty object */
X if( !done )
X { Error(WARN, &fpos(y), "%s object deleted (too wide for %s paragraph)",
X EchoLength(size(y, COL)), EchoLength(etc_width));
X tmp = MakeWord("", &fpos(x));
X back(tmp, COL) = fwd(tmp, COL) = 0;
X back(tmp, ROW) = fwd(tmp, ROW) = 0;
X word_font(tmp) = 0;
X Link(link, tmp);
X DisposeChild(link);
X }
X
X} /* end CorrectOversizeError */


X
X
X/*@@**************************************************************************/
X/* */

X/* MoveRightToGap(I, x, rlink, right, max_width, etc_width, hyph_word) */
X/* */
X/* Private. Shared by IntervalInit and IntervalShiftRightEnd, for moving */
X/* to the next gap to the right, setting save_space(newg), checking for */
X/* hyphenation case, and setting the interval badness. */
X/* */
X/*****************************************************************************/
X
X#define MoveRightToGap(I,x,rlink,right,max_width,etc_width,hyph_word) \
X{ OBJECT newg, foll; \
X BOOLEAN zero_at_right = FALSE; \
X \
X /* search onwards to find newg, the next true breakpoint */ \
X NextDefiniteWithGap(x, rlink, foll, newg); \
X \
X /* set right link and calculate badness of the new interval */ \
X if( rlink != x ) \
X { \
X /* set save_space(newg) now so that it's OK to forget right */ \
X if( mode(gap(newg)) == TAB_MODE ) \
X { save_space(newg) = ActualGap(0, back(foll,COL), fwd(foll,COL), \
X &gap(newg), etc_width, 0) - back(foll, COL); \
X } \
X else \
X { save_space(newg) = ActualGap(fwd(right, COL), back(foll, COL), \
X fwd(foll,COL), &gap(newg), etc_width, \
X I.nat_width - fwd(right,COL)) \
X - back(foll, COL) - fwd(right, COL); \
X } \
X \
X /* if interval ends with hyphen, add hyph_word to nat_width */ \
X /* NB ADD_HYPH is possible after a restart */ \
X if( hyph_allowed && \
X (mode(gap(newg)) == HYPH_MODE || mode(gap(newg)) == ADD_HYPH) ) \
X { if( type(right) == WORD && \
X !(string(right)[strlen(string(right))-1] == '-' || \
X (string(right)[strlen(string(right))-1] == '"' && \
X string(right)[strlen(string(right))-2] == '-' )) ) \
X { \
X /* make sure hyph_word exists and is of the right font */ \
X if( hyph_word == nil ) \
X { hyph_word = MakeWord("-", &fpos(x)); \
X word_font(hyph_word) = 0; \
X } \
X if( word_font(hyph_word) != font(save_style(x)) ) \
X { word_font(hyph_word) = font(save_style(x)); \
X FposCopy(fpos(hyph_word), fpos(x)); \
X FontAtomSize(hyph_word); \
X } \
X \
X mode(gap(newg)) = ADD_HYPH; \
X I.nat_width += size(hyph_word, COL); \
X debug0(DOF, DD, " adding hyph_word from nat_width\n"); \
X } \
X } \
X else if( unbreakable(gap(newg), hyph_allowed) ) zero_at_right=TRUE; \
X \
X I.rlink = Up(newg); \
X } \
X else I.rlink = x; \
X SetIntervalBadness(I, max_width, etc_width); \
X if( zero_at_right ) I.class = ZERO_AT_RIGHT; \


X}
X
X/*@@**************************************************************************/
X/* */

X/* IntervalInit(I, x, max_width, etc_width, hyph_word) */
X/* */
X/* Set I to the first interval of x. */
X/* */
X/*****************************************************************************/
X
X#define IntervalInit(I, x, max_width, etc_width, hyph_word) \
X{ OBJECT rlink, right, newg, foll; \
X I.llink = x; \
X \
X FirstDefinite(x, rlink, right); \
X if( rlink == x ) I.class = AT_END, I.rlink = x; \
X else \
X { \
X /* have first definite object, so set interval width etc. */ \
X I.nat_width = size(right, COL); \
X I.space_width = 0; \
X I.tab_count = 0; \
X \
X /* move to gap, check hyphenation there etc. */ \
X MoveRightToGap(I,x,rlink,right,max_width,etc_width,hyph_word); \
X } \
X} /* end macro IntervalInit */


X
X
X/*****************************************************************************/
X/* */

X/* IntervalShiftRightEnd(I, x, hyph_word, max_width, etc_width) */
X/* */
X/* Shift the right end of interval I one place to the right. */
X/* */
X/*****************************************************************************/
X
X#define IntervalShiftRightEnd(I, x, hyph_word, max_width, etc_width) \
X{ OBJECT rlink, g, right; \
X assert( I.class != AT_END, "IntervalShiftRightEnd: AT_END!" ); \
X rlink = I.rlink; \
X if( rlink == x ) I.class = AT_END; \
X else \
X { \
X /* I is optimal here so save its badness and left endpoint */ \
X Child(g, rlink); \
X assert( type(g) == GAP_OBJ, "IntervalShiftRightEnd: type(g)!" ); \
X save_badness(g) = I.badness; \
X save_prev(g) = I.llink; \
X \
X /* if hyphenation case, must take away width of hyph_word */ \
X if( mode(gap(g)) == ADD_HYPH ) \
X { I.nat_width -= size(hyph_word,COL); \
X debug0(DOF, DD, " subtracting hyph_word from nat_width"); \
X } \
X \
X /* find definite object which must lie just to the right of g */ \
X NextDefinite(x, rlink, right); \
X assert( rlink != x, "IntervalShiftRightEnd: rlink == x!" ); \
X \
X /* modify I to reflect the addition of g and right */ \
X if( mode(gap(g)) == TAB_MODE ) \
X { I.tab_count++; \
X I.tab_pos = save_space(g); \
X I.width_to_tab = I.nat_width; \
X I.nat_width = save_space(g) + size(right, COL); \
X I.space_width = 0; \
X } \
X else \
X { I.nat_width += save_space(g) + size(right, COL); \
X I.space_width += save_space(g); \
X } \
X \
X /* now shift one step to the right */ \
X MoveRightToGap(I, x, rlink, right, max_width, etc_width,hyph_word); \
X } \
X} /* end macro IntervalShiftRightEnd */
X
X/*@@**************************************************************************/
X/* */
X/* IntervalShiftLeftEnd(I, x, max_width, etc_width) */
X/* */
X/* Shift the left end of interval I one place to the right. */
X/* */
X/*****************************************************************************/
X
X#define IntervalShiftLeftEnd(I, x, max_width, etc_width) \
X{ OBJECT llink, left, lgap, y; \
X debug1(DOF, DDD, "IntervalShiftLeftEnd(%s)", IntervalPrint(I, x)); \
X assert( I.class != AT_END, "IntervalShiftLeftEnd: AT_END!" ); \
X \
X /* find left, the leftmost definite object of I */ \
X llink = I.llink; \
X NextDefinite(x, llink, left); \
X assert( llink != x, "IntervalShiftLeftEnd: llink == x!" ); \
X \
X /* find lgap, the first true breakpoint following left */ \
X NextDefiniteWithGap(x, llink, y, lgap); \
X assert( llink != x, "IntervalShiftLeftEnd: llink == x!" ); \
X \
X /* calculate width and badness of interval minus left and lgap */ \
X if( mode(gap(lgap)) == TAB_MODE ) \
X { assert( I.tab_count > 0 || Up(lgap) == I.rlink, \
X "IntervalShiftLeftEnd: tab_count <= 0!" ); \
X I.tab_count--; \
X if( I.tab_count == 0 ) I.nat_width -= save_space(lgap); \
X } \
X else /* take from nat_width, or if tab, from width_to_tab */ \
X { if( I.tab_count == 0 ) \
X { I.nat_width -= save_space(lgap) + size(left, COL); \
X I.space_width -= save_space(lgap); \
X } \
X else if( I.tab_count == 1 ) \
X { I.width_to_tab -= save_space(lgap) + size(left, COL); \
X } \
X /* else no changes since tabs hide them */ \
X } \
X I.llink = Up(lgap); \
X if( I.llink == I.rlink ) I.class = EMPTY_INTERVAL; \
X else \
X { SetIntervalBadness(I, max_width, etc_width); \
X if( unbreakable(gap(lgap), hyph_allowed) ) I.class = ZERO_AT_LEFT; \
X } \
X debug1(DOF, DDD, "IShiftLeftEnd returning %s", IntervalPrint(I, x)); \
X} /* end macro IntervalShiftLeftEnd */


X
X
X/*****************************************************************************/
X/* */

X/* IntervalBadness(I) */
X/* */
X/* Return the badness of interval I. */
X/* */
X/*****************************************************************************/
X
X#define IntervalBadness(I) (I.badness)


X
X
X/*@@**************************************************************************/
X/* */

X/* IntervalClass(I) */
X/* */
X/* Return the badness class of interval I. */
X/* */
X/*****************************************************************************/
X
X#define IntervalClass(I) (I.class)
X
X
X#if DEBUG_ON
X/*****************************************************************************/
X/* */
X/* IntervalPrint(I, x) */
X/* */
X/* Return string image of the contents of interval I of ACAT x. */
X/* */
X/*****************************************************************************/
X
Xunsigned char *IntervalPrint(I, x)
XINTERVAL I; OBJECT x;
X{ static char *class_name[] =
X { "TOO_LOOSE", "LOOSE", "TIGHT", "TOO_TIGHT", "TAB_OVERLAP", "AT_END",
X "ZERO_AT_LEFT", "ZERO_AT_RIGHT" };
X unsigned char buff[100]; static unsigned char res[300];
X OBJECT link, y, g, prev, z; int i;
X if( I.llink == I.rlink ) return (unsigned char *) "[]";
X strcpy(res, "[");
X g = nil;
X for( link = NextDown(I.llink); link != I.rlink; link = NextDown(link) )
X { assert(link != x, "IntervalPrint: link == x!");
X Child(y, link);
X assert(y != x, "IntervalPrint: y == x!");


X if( type(y) == GAP_OBJ )

X { g = y;


X if( Down(g) != g )

X { Child(z, Down(g));
X sprintf(buff, " %s%s ", EchoCatOp(ACAT, mark(gap(g)), join(gap(g))),
X type(z) == WORD ? string(z) : Image(type(z)));
X }
X else sprintf(buff, "%*s", hspace(g) + vspace(g), "");
X strcat(res, buff);
X }
X else strcat(res, type(y) == WORD ? string(y) : Image(type(y)));
X }
X sprintf(buff, "] n%s, s%s (%s %d)", EchoLength(I.nat_width),
X EchoLength(I.space_width), class_name[I.class], I.badness);
X strcat(res, buff);
X if( I.tab_count > 0 )
X { sprintf(buff, " <%d %s:%s>", I.tab_count,
X EchoLength(I.width_to_tab), EchoLength(I.tab_pos));
X strcat(res, buff);
X }
X return res;
X} /* end IntervalPrint */
X#endif


X
X
X/*@@**************************************************************************/
X/* */

X/* FillObject(x, c) */
X/* */
X/* Break ACAT x into lines using optimal breakpoints. */
X/* */
X/*****************************************************************************/
X
XOBJECT FillObject(x, c)
XOBJECT x; CONSTRAINT *c;
X{ INTERVAL I, BestI; OBJECT res, gp, tmp, z, y, link, prev;
X LENGTH max_width, etc_width, outdent_margin, f;
X static OBJECT hyph_word = nil;
X BOOLEAN can_hyphenate; /* TRUE when it is possible to call Hyphenate() */
X BOOLEAN hyph_allowed; /* TRUE when hyphenation of words is permitted */
X
X assert( type(x) == ACAT, "FillObject: type(x) != ACAT!" );
X
X /* set max_width (width of 1st line) and etc_width (width of later lines) */
X max_width = min(fc(*c), bfc(*c));
X if( display_style(save_style(x)) == DISPLAY_OUTDENT )
X { outdent_margin = 2 * FontSize(font(save_style(x)), x);
X etc_width = max_width - outdent_margin;
X }
X else etc_width = max_width;
X assert( size(x, COL) > max_width, "FillObject: initial size!" );
X
X /* add &1rt {} to end of paragraph */
X gp = New(GAP_OBJ);
X hspace(gp) = 1; vspace(gp) = 0;
X SetGap(gap(gp), FALSE, TRUE, AVAIL_UNIT, TAB_MODE, 1*FR);
X tmp = MakeWord("1rt", &fpos(x));
X Link(gp, tmp);
X Link(x, gp);
X tmp = MakeWord("", &fpos(x));
X back(tmp, COL) = fwd(tmp, COL) = 0;
X back(tmp, ROW) = fwd(tmp, ROW) = 0;
X word_font(tmp) = 0;
X Link(x, tmp);
X debug2(DOF, D, "FillObject(x, %s); %s",
X EchoConstraint(c), EchoStyle(&save_style(x)));
X ifdebug(DOF, DD, EchoObject(stderr, x); fprintf(stderr, "\n\n") );
X
X /* initially we can hyphenate if hyphenation is on, but not first pass */
X if( hyph_style(save_style(x)) == HYPH_UNDEF )
X Error(FATAL, &fpos(x), "hyphen or nohyphen option missing");
X can_hyphenate = (hyph_style(save_style(x)) == HYPH_ON);
X hyph_allowed = FALSE;
X
X /* initialize I to first interval, BestI to best ending here, and run */
X RESTART:
X IntervalInit(I, x, max_width, etc_width, hyph_word);
X BestI = I;
X while( IntervalClass(I) != AT_END )
X {
X debug1(DOF, D, "loop: %s", IntervalPrint(I, x));
X switch( IntervalClass(I) )
X {
X
X case TOO_LOOSE:
X
X /* too loose, so save best and shift right end */
X if( IntervalBadness(BestI) < IntervalBadness(I) ) I = BestI;
X debug1(DOF, D, "BestI: %s\n", IntervalPrint(I, x));
X /* NB no break */
X
X
X case ZERO_AT_RIGHT:
X
X IntervalShiftRightEnd(I, x, hyph_word, max_width, etc_width);
X BestI = I;
X break;
X
X
X case LOOSE:
X case TIGHT:
X
X /* reasonable, so check best and shift left end */
X if( IntervalBadness(I) < IntervalBadness(BestI) ) BestI = I;
X /* NB no break */
X
X
X case ZERO_AT_LEFT:
X case TAB_OVERLAP:
X case TOO_TIGHT:
X
X /* too tight, or zero-width gap at left end, so shift left end */
X IntervalShiftLeftEnd(I, x, max_width, etc_width);
X break;
X
X
X case EMPTY_INTERVAL:
X
X PrevDefinite(x, I.llink, y);
X if( can_hyphenate )
X { x = Hyphenate(x);
X can_hyphenate = FALSE;
X hyph_allowed = TRUE;
X }
X else
X CorrectOversizeError(x, I.llink, y, etc_width, hyph_allowed);
X goto RESTART;
X break;
X
X
X default:
X
X Error(INTERN, &fpos(x), "FillObject: unknown interval class!");
X break;
X
X }
X }
X
X /* do end processing */
X ifdebug(DOF, D,
X debug0(DOF, D, "final result:");
X debug1(DOF, D, "%s", IntervalPrint(BestI, x));
X while( BestI.llink != x )
X { BestI.rlink = BestI.llink;
X Child(gp, BestI.rlink);
X BestI.llink = save_prev(gp);
X debug1(DOF, D, "%s", IntervalPrint(BestI, x));
X }
X );
X
X if( I.llink == x )
X { /* since line did not fit initally, this must mean either that a large */
X /* word was discarded, or else that the line was only slightly tight */
X res = x;
X back(res, COL) = 0;
X fwd(res, COL) = max_width;
X }
X else if( can_hyphenate && IntervalBadness(BestI) > HYPH_BAD )
X { x = Hyphenate(x);
X can_hyphenate = FALSE;
X hyph_allowed = TRUE;
X goto RESTART;
X }
X else
X { OBJECT lgap, llink;
X res = New(VCAT);
X back(res, COL) = 0;
X fwd(res, COL) = max_width;
X ReplaceNode(res, x);
X llink = I.llink;
X
X /* break the lines of x */
X while( llink != x )


X { y = New(ACAT);
X FposCopy(fpos(y), fpos(x));

X StyleCopy(save_style(y), save_style(x));
X if( Down(res) != res &&
X (display_style(save_style(y)) == DISPLAY_ADJUST ||
X display_style(save_style(y)) == DISPLAY_OUTDENT) )
X display_style(save_style(y)) = DO_ADJUST;
X back(y, COL) = 0;
X fwd(y, COL) = max_width;
X
X /* if outdented paragraphs, add 2.0f @Wide & to front of new line */
X if( display_style(save_style(x)) == DISPLAY_OUTDENT )
X {
X OBJECT t1, t2, z;
X t1 = MakeWord("", &fpos(x));
X back(t1, COL) = fwd(t1, COL) = 0;
X back(t1, ROW) = fwd(t1, ROW) = 0;
X word_font(t1) = 0;
X t2 = New(WIDE);
X SetConstraint(constraint(t2), MAX_LEN, outdent_margin, MAX_LEN);
X back(t2, COL) = 0; fwd(t2, COL) = outdent_margin;
X Link(t2, t1);
X Link(y, t2);
X z = New(GAP_OBJ);
X hspace(z) = vspace(z) = 0;
X SetGap(gap(z), FALSE, TRUE, FIXED_UNIT, EDGE_MODE, 0);
X Link(y, z);
X }
X
X /* move the line to below y */
X TransferLinks(NextDown(llink), x, y);
X
X /* add hyphen to end of previous line, if lgap is ADD_HYPH */
X Child(lgap, llink);
X if( mode(gap(lgap)) == ADD_HYPH )
X {
X OBJECT z = New(GAP_OBJ);
X debug0(DOF, DD, " adding hyphen\n");
X hspace(z) = vspace(z) = 0;
X SetGap(gap(z), FALSE, TRUE, FIXED_UNIT, EDGE_MODE, 0);
X Link(x, z);
X z = MakeWord("-", &fpos(y));
X word_font(z) = font(save_style(x));
X FontAtomSize(z);
X Link(x, z);
X }
X
X /* attach y to res, recycle lgap for gap separating the two lines */
X Link(NextDown(res), y);
X MoveLink(llink, NextDown(res), PARENT);
X hspace(lgap) = 0;
X vspace(lgap) = 1;
X GapCopy(gap(lgap), line_gap(save_style(x)));
X
X /* move on to previous line */
X llink = save_prev(lgap);
X }
X
X /* attach first line, x, to res */
X Link(NextDown(res), x);


X back(x, COL) = 0;

X fwd(x, COL) = max_width;
X if( display_style(save_style(x)) == DISPLAY_ADJUST ||
X display_style(save_style(x)) == DISPLAY_OUTDENT )
X display_style(save_style(x)) = DO_ADJUST;
X
X /* delete the final &1rt {} from the last line, to help clines */
X Child(y, LastDown(res));
X assert( Down(y) != LastDown(y), "FillObject: empty last line!" );
X Child(z, LastDown(y));
X assert( type(z)==WORD && string(z)[0] == '\0', "FillObject: last word!" );
X DisposeChild(LastDown(y));
X Child(z, LastDown(y));
X assert( type(z) == GAP_OBJ, "FillObject: last gap_obj!" );
X DisposeChild(LastDown(y));
X
X /* recalculate the width of the last line, since it's smaller */
X FirstDefinite(y, link, z);
X assert( link != y, "FillObject: last line is empty!" );
X f = back(z, COL); prev = z;
X NextDefiniteWithGap(y, link, z, gp);
X while( link != y )
X {
X f += MinGap(fwd(prev, COL), back(y, COL), fwd(y, COL), &gap(gp));
X prev = z;
X NextDefiniteWithGap(y, link, z, gp);
X }
X fwd(y, COL) = f + fwd(prev, COL);
X
X /* make last line DO_ADJUST if it's oversize */
X if( size(y, COL) > max_width ) display_style(save_style(y)) = DO_ADJUST;
X }
X
X debug0(DOF, D, "FillObject exiting");
X return res;
X} /* end FillObject */
END_OF_FILE
if test 27879 -ne `wc -c <'lout/z14.c'`; then
echo shar: \"'lout/z14.c'\" unpacked with wrong size!
fi
# end of 'lout/z14.c'
fi
if test -f 'lout/z19.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/z19.c'\"
else
echo shar: Extracting \"'lout/z19.c'\" \(22219 characters\)
sed "s/^X//" >'lout/z19.c' <<'END_OF_FILE'
X/*@z19.c:Galley Attaching:AttachGalley(), DetachGalley()@*********************/


X/* */
X/* LOUT: A HIGH-LEVEL LANGUAGE FOR DOCUMENT FORMATTING (VERSION 2.03) */
X/* COPYRIGHT (C) 1993 Jeffrey H. Kingston */
X/* */
X/* Jeffrey H. Kingston (je...@cs.su.oz.au) */
X/* Basser Department of Computer Science */
X/* The University of Sydney 2006 */
X/* AUSTRALIA */
X/* */
X/* This program is free software; you can redistribute it and/or modify */
X/* it under the terms of the GNU General Public License as published by */
X/* the Free Software Foundation; either version 1, or (at your option) */
X/* any later version. */
X/* */
X/* This program is distributed in the hope that it will be useful, */
X/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
X/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
X/* GNU General Public License for more details. */
X/* */
X/* You should have received a copy of the GNU General Public License */
X/* along with this program; if not, write to the Free Software */
X/* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
X/* */

X/* FILE: z19.c */
X/* MODULE: Galley Attaching */
X/* EXTERNS: AttachGalley(), DetachGalley() */


X/* */
X/*****************************************************************************/
X#include "externs"

X
X
X/*****************************************************************************/
X/* */

X/* OBJECT SearchGalley(start, sym, forwards, subgalleys, closures, input) */
X/* */
X/* Search a galley and its sub-galleys for a target which uses sym. The */
X/* meanings of the flags are as follows: */
X/* */
X/* forwards If TRUE, search forwards from just after start, else */
X/* search backwards from just before start */
X/* subgalleys If TRUE, search down into sub-galleys of this galley */
X/* closures If TRUE, closures in this galley are acceptable results */
X/* input If TRUE, InputSym is an acceptable result */
X/* */
X/*****************************************************************************/
X
XOBJECT SearchGalley(start, sym, forwards, subgalleys, closures, input)
XOBJECT start, sym; BOOLEAN forwards, subgalleys, closures, input;
X{ OBJECT y, res, z, zlink, link;
X debug5(DGA, D, "[SearchGalley( start, %s, %s, %s, %s, %s )", SymName(sym),
X forwards ? "fwd" : "back", subgalleys ? "subgalleys" : "nosubgalleys",
X closures ? "closures" : "noclosures", input ? "input" : "noinput");
X assert( type(start) == LINK || type(start) == HEAD, "SearchGalley: start!" );
X
X link = forwards ? NextDown(start) : PrevDown(start);
X res = nil;
X while( res == nil && type(link) != HEAD )
X { Child(y, link);
X debug1(DGA, DD, " examining %s", EchoObject(null, y));
X switch( type(y) )
X {
X case UNATTACHED:
X case RECEIVING:
X
X if( subgalleys )
X for( zlink = Down(y); zlink!=y && res==nil; zlink = NextDown(zlink) )
X { Child(z, zlink);
X res = SearchGalley(z, sym, TRUE, TRUE, TRUE, input);
X }
X if( !res && input && type(y)==RECEIVING && actual(actual(y))==InputSym )
X res = y;
X break;
X
X
X case RECEPTIVE:
X
X if( closures && type(actual(y)) == CLOSURE
X && SearchUses(actual(actual(y)), sym) ) res = y;
X else if( input && actual(actual(y)) == InputSym ) res = y;
X break;
X
X
X default:
X
X break;
X
X }
X link = forwards ? NextDown(link) : PrevDown(link);
X }
X debug1(DGA, D, "]SearchGalley returning %s", EchoObject(null, res));
X return res;
X} /* end SearchGalley */


X
X
X/*@@**************************************************************************/
X/* */

X/* AttachGalley(hd, inners) */
X/* */
X/* Attach galley hd, which may be unsized, to a destination. This involves */
X/* searching for a destination forward or back from hd's attachment point, */
X/* and promoting up to and including the first definite component of hd. */
X/* */
X/* Although AttachGalley never flushes any galleys, it may identify some */
X/* galleys which should be flushed, even if the attach is itself not */
X/* successful. These are returned in *inners, or nil if none. */
X/* */
X/*****************************************************************************/
X
XAttachGalley(hd, inners)
XOBJECT hd, *inners;
X{ OBJECT index; /* the index of hd in the enclosing galley */
X OBJECT hd_inners; /* inner galleys of hd, if unsized */
X OBJECT dest; /* the target @Galley hd empties into */


X OBJECT dest_index; /* the index of dest */

X OBJECT target; /* the target indefinite containing dest */
X OBJECT target_index; /* the index of target */
X OBJECT target_galley; /* the body of target, made into a galley */
X OBJECT tg_inners; /* inner galleys of target_galley */
X BOOLEAN need_precedes; /* true if destination lies before galley */
X OBJECT recs; /* list of recursive definite objects */


X OBJECT link, y; /* for scanning through the components of hd */

X CONSTRAINT c; /* temporary variable holding a constraint */
X OBJECT env, n1, tmp, zlink, z, sym; /* placeholders and temporaries */
X BOOLEAN was_sized; /* true if sized(hd) initially */
X
X debug2(DGA, D, "[AttachGalley(Galley %s into %s)",
X SymName(actual(hd)), SymName(whereto(hd)));
X ifdebug(DGA, DD, EchoObject(stderr, hd));
X assert( Up(hd) != hd, "AttachGalley: no index!" );
X Parent(index, Up(hd));
X assert( type(index) == UNATTACHED, "AttachGalley: not UNATTACHED!" );
X *inners = hd_inners = tg_inners = nil;
X was_sized = sized(hd);
X
X for(;;)
X {
X /*************************************************************************/
X /* */
X /* Search for a destination for hd. If hd is unsized, search for */
X /* inner galleys preceding it first of all, then for receptive objects */
X /* following it, possibly in inner galleys. If no luck, exit. */
X /* If hd is sized, search only for receptive objects in the current */
X /* galley below the current spot, and fail if can't find any. */
X /* */
X /*************************************************************************/
X
X sym = whereto(hd);
X if( sized(hd) )
X {
X /* sized galley case: search on from current spot */
X target_index = SearchGalley(Up(index), sym, TRUE, FALSE, TRUE, TRUE);
X if( target_index == nil )
X {
X /* search failed to find any new target, so kill the galley */
X for( link = Down(hd); link != hd; link = NextDown(link) )
X { Child(y, link);


X if( type(y) == SPLIT ) Child(y, DownDim(y, ROW));

X if( is_definite(type(y)) ) break;
X }

X if( link != hd )
X Error(WARN, &fpos(y), "galley %s deleted from here: no target",
X SymName(actual(hd)));
X debug0(DGA, D, "calling KillGalley from AttachGalley (a)");
X KillGalley(hd);
X debug0(DGA, D, "]AttachGalley returning: no target for sized galley");
X return;
X }
X else if( actual(actual(target_index)) == InputSym )
X {
X /* search found input object, so suspend on that */
X DeleteNode(index);
X Link(target_index, hd);
X debug0(DGA, D, "]AttachGalley returning: InputSym");


X return;
X }
X
X }

X else /* unsized galley, either backwards or normal */
X {
X if( backward(hd) )
X { target_index= SearchGalley(Up(index), sym, FALSE, TRUE, TRUE, FALSE);
X need_precedes = FALSE;
X }
X else
X { target_index = SearchGalley(Up(index), sym, FALSE, TRUE, FALSE, FALSE);
X need_precedes = (target_index != nil);
X if( target_index == nil )
X target_index = SearchGalley(Up(index), sym, TRUE, TRUE, TRUE, FALSE);
X }
X
X /* if no luck, exit without error */
X if( target_index == nil )
X { debug0(DGA, D, "]AttachGalley returning: no target for unsized galley");
X return;
X }
X }
X assert( type(target_index) == RECEPTIVE, "AttachGalley: target_index!" );
X target = actual(target_index);
X assert( type(target) == CLOSURE, "AttachGalley: target!" );
X
X /* set target_galley to the expanded value of target */
X EnterErrorBlock(FALSE);
X target_galley = New(HEAD);
X FposCopy(fpos(target_galley), fpos(target));
X actual(target_galley) = actual(target);
X whereto(target_galley) = ready_galls(target_galley) = nil;
X backward(target_galley) = must_expand(target_galley) = FALSE;
X sized(target_galley) = FALSE;
X Constrained(target, &c, COL);
X if( !constrained(c) ) Error(FATAL, &fpos(target),
X "receptive symbol %s has unconstrained width", SymName(actual(target)));


X debug2(DSC, D, "Constrained( %s, COL ) = %s",

X EchoObject(null, target), EchoConstraint(&c));
X debug1(DGA, DD, " expanding %s", EchoObject(null, target));
X tmp = CopyObject(target, no_fpos);
X Link(target_galley, tmp);
X if( !FitsConstraint(0, 0, c) )
X { debug0(DGA, D, " reject: target_galley horizontal constraint is -1");
X goto REJECT;
X }
X env = DetachEnv(tmp);
X SizeGalley(target_galley, env, external(target), threaded(target),
X non_blocking(target_index), trigger_externs(target_index),
X &save_style(target), &c, whereto(hd), &dest_index, &recs, &tg_inners);
X if( recs != nil ) ExpandRecursives(recs);


X dest = actual(dest_index);
X

X /* verify that hd satisfies any horizontal constraint on dest */
X debug1(DGA, DD, " checking COL fit of hd in %s", SymName(actual(dest)));
X Constrained(dest, &c, COL);


X debug2(DSC, D, "Constrained( %s, COL ) = %s",

X EchoObject(null, dest), EchoConstraint(&c));
X assert( constrained(c), "AttachGalley: dest unconstrained!" );
X if( !sized(hd) )
X { EnterErrorBlock(TRUE);
X if( !FitsConstraint(0, 0, c) )
X { debug0(DGA, D, " reject: hd horizontal constraint is -1");
X goto REJECT;
X }
X n1 = nil;
X Child(y, Down(hd));
X env = DetachEnv(y);
X /*** to set non_blocking() to FALSE seems doubtful!
X SizeGalley(hd, env, TRUE, threaded(dest), FALSE, TRUE,
X &save_style(dest), &c, nil, &n1, &recs, &hd_inners);
X *** */
X SizeGalley(hd, env, TRUE, threaded(dest), non_blocking(target_index),
X TRUE, &save_style(dest), &c, nil, &n1, &recs, &hd_inners);
X if( recs != nil ) ExpandRecursives(recs);
X if( need_precedes ) /* need an ordering constraint */
X { OBJECT index1 = New(PRECEDES);
X OBJECT index2 = New(FOLLOWS);
X blocked(index2) = FALSE;
X tmp = MakeWord("", no_fpos);
X Link(index1, tmp); Link(index2, tmp);
X Link(Up(index), index1);
X Link(Down(hd), index2);
X debug0(DGA, D, " inserting PRECEDES and FOLLOWS");
X }
X LeaveErrorBlock(TRUE);
X }
X if( !FitsConstraint(back(hd, COL), fwd(hd, COL), c) )
X { debug3(DGA, D, " reject: hd %s,%s does not fit target_galley %s",


X EchoLength(back(hd, COL)), EchoLength(fwd(hd, COL)),

X EchoConstraint(&c));
X Error(WARN, &fpos(hd),"too little horizontal space for galley %s at %s",
X SymName(actual(hd)), SymName(actual(dest)));
X goto REJECT;
X }
X
X /* check status of first component of hd */
X debug0(DGA, DD, " now ready to attach; hd =");
X ifdebug(DGA, DD, EchoObject(stderr, hd));
X for( link = Down(hd); link != hd; link = NextDown(link) )
X {
X Child(y, link);
X debug1(DGA, DD, " examining %s", EchoObject(null, y));


X if( type(y) == SPLIT ) Child(y, DownDim(y, ROW));

X switch( type(y) )
X {
X
X case EXPAND_IND:


X case GALL_PREC:
X case GALL_FOLL:
X case GALL_TARG:
X case CROSS_PREC:
X case CROSS_FOLL:
X case CROSS_TARG:
X

X break;
X
X
X case PRECEDES:
X case UNATTACHED:
X
X if( was_sized )
X { /* SizeGalley was not called, so hd_inners was not set by it */
X if( hd_inners == nil ) hd_inners = New(ACAT);
X Link(hd_inners, y);
X }
X break;
X
X
X case RECEPTIVE:
X
X if( non_blocking(y) )
X { link = PrevDown(link);
X DeleteNode(y);
X }
X else goto SUSPEND;
X break;
X
X
X case RECEIVING:
X
X if( non_blocking(y) )
X { while( Down(y) != y )
X { Child(z, Down(y));
X DetachGalley(z);
X KillGalley(z);
X }
X link = PrevDown(link);
X DeleteNode(y);
X }
X else goto SUSPEND;
X break;
X
X
X case FOLLOWS:
X
X Child(tmp, Down(y));


X if( Up(tmp) == LastUp(tmp) )

X { link = pred(link, CHILD);
X debug0(DGA, DD, " disposing FOLLOWS");


X DisposeChild(NextDown(link));
X break;
X }

X Parent(tmp, Up(tmp));
X assert(type(tmp) == PRECEDES, "Attach: PRECEDES!");
X switch( CheckConstraint(tmp, target_index) )


X {
X case CLEAR: DeleteNode(tmp);

X link = pred(link, CHILD);


X DisposeChild(NextDown(link));
X break;
X

X case PROMOTE: break;
X

X case BLOCK: debug0(DGA, DD, "CheckContraint: BLOCK");
X goto SUSPEND;
X
X case CLOSE: debug0(DGA, D, " reject: CheckContraint");
X goto REJECT;
X }
X break;
X
X
X case GAP_OBJ:
X


X if( !join(gap(y)) ) seen_nojoin(hd) = TRUE;

X break;
X
X


X case CLOSURE:
X case NULL_CLOS:
X case CROSS:
X

X break;
X
X
X case WORD:


X case ONE_COL:
X case ONE_ROW:

X case WIDE:
X case HIGH:

X case HSCALE:
X case VSCALE:

X case HCONTRACT:
X case VCONTRACT:
X case HEXPAND:
X case VEXPAND:
X case PADJUST:
X case HADJUST:
X case VADJUST:

X case ROTATE:
X case SCALE:


X case INCGRAPHIC:
X case SINCGRAPHIC:

X case GRAPHIC:
X case ACAT:

X case HCAT:
X case ROW_THR:
X

X /* make sure y is not joined to a target below */
X for( zlink = NextDown(link); zlink != hd; zlink = NextDown(zlink) )
X { Child(z, zlink);
X switch( type(z) )
X {

X case RECEPTIVE: if( non_blocking(z) )
X { zlink = PrevDown(zlink);
X DeleteNode(z);
X }
X else
X { y = z;
X goto SUSPEND;
X }
X break;
X
X case RECEIVING: if( non_blocking(z) )
X { zlink = PrevDown(zlink);
X while( Down(z) != z )
X { Child(tmp, Down(y));
X DetachGalley(tmp);
X KillGalley(tmp);
X }
X DeleteNode(z);
X }
X else
X { y = z;
X goto SUSPEND;
X }
X break;
X


X case GAP_OBJ: if( !join(gap(z)) ) zlink = PrevDown(hd);

X break;
X
X default: break;
X }
X }
X
X /* check availability of vertical space for the first component */
X if( !external(dest) )
X { Constrained(dest, &c, ROW);


X debug2(DSC, D, "Constrained( %s, ROW ) = %s",

X EchoObject(null, dest), EchoConstraint(&c));
X if( !FitsConstraint(back(y, ROW), fwd(y, ROW), c) )
X { Error(WARN, &fpos(y),
X "insufficient vertical space for this component of %s in %s",
X SymName(actual(hd)), SymName(actual(dest)));
X debug3(DGA, D, " reject: vsize %s,%s in %s; y=",
X EchoLength(back(y, ROW)), EchoLength(fwd(y, ROW)),
X EchoConstraint(&c));
X ifdebug(DGA, D, EchoObject(stderr, y));
X goto REJECT;
X }
X debug0(DSA, D, "calling AdjustSize from AttachGalley (a)");
X AdjustSize(dest, back(y, ROW), fwd(y, ROW), ROW);


X }
X if( !external(target) )

X { Constrained(target, &c, ROW);


X debug2(DSC, D, "Constrained( %s, ROW ) = %s",

X EchoObject(null, target), EchoConstraint(&c));
X Child(z, LastDown(target_galley));
X assert( !is_index(type(z)), "AttachGalley: is_index(z)!" );
X assert( back(z, ROW) >= 0 && fwd(z, ROW) >= 0,
X "AttachGalley: negative z sizes!" );
X if( !FitsConstraint(back(z, ROW), fwd(z, ROW), c) )
X { Error(WARN, &fpos(y),
X "insufficient vertical space for this component of %s in %s",
X SymName(actual(hd)), SymName(actual(target)));
X debug3(DGA, D, " reject: size was %s,%s in %s; y =",


X EchoLength(back(z, ROW)), EchoLength(fwd(z, ROW)),

X EchoConstraint(&c));
X ifdebug(DGA, D, EchoObject(stderr, y));
X goto REJECT;
X }
X debug0(DSA, D, "calling AdjustSize from AttachGalley (b)");


X AdjustSize(target, back(z, ROW), fwd(z, ROW), ROW);
X }

X goto ACCEPT;


X
X
X default:
X

X Error(INTERN, &fpos(y), "AttachGalley: %s", Image(type(y)));


X break;
X
X } /* end switch */

X } /* end for */
X
X /* empty galley; promote any indexes, kill the galley, and exit */
X /* this bypasses target_galley, which is not expanded in the empty case */
X debug0(DGA, D, " empty galley");
X if( tg_inners != nil ) DisposeObject(tg_inners), tg_inners = nil;
X DisposeObject(target_galley);
X LeaveErrorBlock(FALSE);
X if( LastDown(hd) != hd ) Promote(hd, hd, target_index);
X debug0(DGA, D, "calling KillGalley from AttachGalley (b)");
X KillGalley(hd);
X
X /* return; only hd_inners needs to be flushed now */
X *inners = hd_inners;
X debug0(DGA, D, "]AttachGalley returning killed: empty galley");
X return;
X
X
X REJECT:
X
X /* reject first component */
X LeaveErrorBlock(TRUE);
X if( tg_inners != nil ) DisposeObject(tg_inners), tg_inners = nil;
X DisposeObject(target_galley);
X if( backward(hd) && !sized(hd) )
X {
X /* move to just before the failed target */
X MoveLink(Up(index), Up(target_index), PARENT);
X }
X else
X {
X /* move to just after the failed target */
X MoveLink(Up(index), NextDown(Up(target_index)), PARENT);
X }
X continue;
X
X
X SUSPEND:
X
X /* suspend at first component */
X debug1(DGA, D, " suspend %s", EchoObject(null, y));
X blocked(y) = TRUE;
X LeaveErrorBlock(FALSE);
X if( tg_inners != nil ) DisposeObject(tg_inners), tg_inners = nil;
X DisposeObject(target_galley);
X MoveLink(Up(index), Up(target_index), PARENT);
X if( was_sized )
X { /* nothing new to flush if suspending and already sized */
X if( hd_inners != nil ) DisposeObject(hd_inners), hd_inners = nil;
X }
X else
X { /* flush newly discovered inners if not sized before */
X *inners = hd_inners;
X }
X debug0(DGA, D, "]AttachGalley returning: suspending.");
X return;
X
X
X ACCEPT:
X
X /* accept first component; now committed to the attach */
X debug1(DGA, D, " accept %s", EchoObject(null, y));
X LeaveErrorBlock(TRUE);
X
X /* adjust horizontal sizes */
X debug0(DSA, D, "calling AdjustSize from AttachGalley (c)");
X AdjustSize(dest, back(hd, COL), fwd(hd, COL), COL);
X debug0(DSA, D, "calling AdjustSize from AttachGalley (d)");
X AdjustSize(target, back(target_galley, COL),
X fwd(target_galley, COL), COL);
X
X /* attach hd to dest */
X MoveLink(Up(hd), dest_index, PARENT);
X assert( type(index) == UNATTACHED, "AttachGalley: type(index)!" );
X DeleteNode(index);
X
X /* move first component of hd into dest */
X /* nb Interpose must be done after all AdjustSize calls */
X if( !external(dest) ) Interpose(dest, VCAT, hd, y);


X Promote(hd, NextDown(link), dest_index);
X

X /* move target_galley into target */
X /* nb Interpose must be done after all AdjustSize calls */
X if( !external(target) )
X { Child(z, LastDown(target_galley));


X Interpose(target, VCAT, z, z);
X }

X Promote(target_galley, target_galley, target_index);
X DeleteNode(target_galley);
X assert(Down(target_index)==target_index, "AttachGalley: target_ind");
X if( blocked(target_index) ) blocked(dest_index) = TRUE;
X DeleteNode(target_index);
X
X /* return; both tg_inners and hd_inners need to be flushed now; */
X /* if was_sized, hd_inners contains the inners of the first component; */
X /* otherwise it contains the inners of all components, from SizeGalley */
X if( tg_inners == nil ) *inners = hd_inners;
X else if( hd_inners == nil ) *inners = tg_inners;
X else
X { TransferLinks(Down(hd_inners), hd_inners, tg_inners);
X DeleteNode(hd_inners);
X *inners = tg_inners;
X }
X debug0(DGA, D, "]AttachGalley returning (accept)");
X return;
X


X } /* end for */

X} /* end AttachGalley */


X
X
X/*****************************************************************************/
X/* */

X/* DetachGalley(hd) */
X/* */
X/* Detach galley hd from its target. */
X/* */
X/*****************************************************************************/
X
XDetachGalley(hd)
XOBJECT hd;
X{ OBJECT prnt, index;
X debug1(DGA, D, "DetachGalley( %s )", EchoObject(null, hd));
X assert( type(hd) == HEAD && Up(hd) != hd, "DetachGalley: precondition!" );
X Parent(prnt, Up(hd));
X assert( Up(prnt) != prnt, "DetachGalley: parent!" );
X index = New(UNATTACHED);
X MoveLink(Up(hd), index, PARENT);
X Link(NextDown(Up(prnt)), index);
X debug0(DGA, D, "DetachGalley returning.");
X} /* end DetachGalley */
END_OF_FILE
if test 22219 -ne `wc -c <'lout/z19.c'`; then
echo shar: \"'lout/z19.c'\" unpacked with wrong size!
fi
# end of 'lout/z19.c'
fi
if test -f 'lout/z23.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/z23.c'\"
else
echo shar: Extracting \"'lout/z23.c'\" \(28465 characters\)
sed "s/^X//" >'lout/z23.c' <<'END_OF_FILE'
X/*@z23.c:Galley Printer:FixAndPrintObject@************************************/


X/* */
X/* LOUT: A HIGH-LEVEL LANGUAGE FOR DOCUMENT FORMATTING (VERSION 2.03) */
X/* COPYRIGHT (C) 1993 Jeffrey H. Kingston */
X/* */
X/* Jeffrey H. Kingston (je...@cs.su.oz.au) */
X/* Basser Department of Computer Science */
X/* The University of Sydney 2006 */
X/* AUSTRALIA */
X/* */
X/* This program is free software; you can redistribute it and/or modify */
X/* it under the terms of the GNU General Public License as published by */
X/* the Free Software Foundation; either version 1, or (at your option) */
X/* any later version. */
X/* */
X/* This program is distributed in the hope that it will be useful, */
X/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
X/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
X/* GNU General Public License for more details. */
X/* */
X/* You should have received a copy of the GNU General Public License */
X/* along with this program; if not, write to the Free Software */
X/* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
X/* */

X/* FILE: z23.c */
X/* MODULE: Galley Printer */
X/* EXTERNS: FixAndPrintObject() */


X/* */
X/*****************************************************************************/
X#include "externs"

X#define NO_SUPPRESS FALSE
X#define SUPPRESS TRUE
X#define ALL_ADJUST 2


X#define LAST_ADJUST 1
X#define ALL_ADJUST 2
X

X#define CountChild(y, link, i) \
Xfor( y=pred(link, PARENT), i=1; type(y)==LINK; y = pred(y, PARENT), i++ )


X
X
X/*****************************************************************************/
X/* */

X/* static float ScaleFactor(avail_size, inner_size) */
X/* */
X/* Return the scale factor for this scaling, or 0 if impossible. */
X/* */
X/*****************************************************************************/
X
Xstatic float ScaleFactor(avail_size, inner_size)
XLENGTH avail_size, inner_size;
X{ float scale_factor;
X scale_factor = avail_size <= 0 ? 0 :
X inner_size <= 0 ? 0 : (float) avail_size / inner_size;
X return scale_factor;
X}


X
X
X/*****************************************************************************/
X/* */

X/* static LENGTH FindAdjustIncrement(x, frame_size, dim) */
X/* */
X/* Find the amount by which to increase the width of the subobjects of */
X/* concatenation object x so that it is adjusted to fill size frame_size. */
X/* */
X/*****************************************************************************/
X
Xstatic LENGTH FindAdjustIncrement(x, frame_size, dim)
XOBJECT x; LENGTH frame_size; int dim;
X{ OBJECT y, link, prev, g;
X int adjustable_gaps;
X LENGTH inc, mk, actual_size;
X
X debug2(DGP, D, "FindAdjustIncrement(x, %s, %s)",
X EchoLength(frame_size), dimen(dim));
X FirstDefinite(x, link, prev);
X if( link != x )
X { adjustable_gaps = 0;
X mk = back(prev, dim);
X NextDefiniteWithGap(x, link, y, g);
X while( link != x )
X { if ( mode(gap(g)) == TAB_MODE || units(gap(g)) == AVAIL_UNIT
X || units(gap(g)) == FRAME_UNIT )
X { debug0(DGP, D, "FindAdjustIncrement returning 0 (tab gap)");
X return 0;
X }
X mk += ActualGap(fwd(prev, dim), back(y, dim), fwd(y, dim), &gap(g),
X frame_size, mk);
X prev = y;
X adjustable_gaps++;
X NextDefiniteWithGap(x, link, y, g);
X }
X actual_size = mk + fwd(prev, dim);
X debug2(DGP, DD, " actual_size = %s, adjustable_gaps = %d",
X EchoLength(actual_size), adjustable_gaps);
X inc = adjustable_gaps==0 ? 0 : (frame_size - actual_size) / adjustable_gaps;
X }
X else inc = 0;
X debug1(DGP, D, "FindAdjustIncrement returning %s", EchoLength(inc));
X return inc;
X} /* end FindAdjustIncrement *.


X
X
X/*****************************************************************************/
X/* */

X/* FixAndPrintObject(x, xmk, xb, xf, dim, adjust, suppress, padj, pg,count) */
X/* */
X/* Fix the absolute position of object x in dimension dim, in such a way */
X/* that the principal mark of x has coordinate xmk, and x has actual size */
X/* (xb, xf), where xb >= back(x, dim) and xf >= fwd(x, dim). */
X/* */
X/* Actually, in the case where x includes an object lying on a thread */
X/* leading outside x, the final size of x may be different. Because */
X/* of this, the procedure sets back(x, dim) and fwd(x, dim) to the actual */
X/* size of x upon return. The caller assumes that x will exactly occupy */
X/* this space back(x, dim), fwd(x, dim). */
X/* */
X/* If x does not fill the forward part of the space allocated to it, the */
X/* adjust parameter determines what, if anything, to do about this. The */
X/* two possible values of this parameter are: */
X/* */
X/* LAST_ADJUST Adjust x to fill the forward space available to */
X/* it, by adjusting the last component if x is a */
X/* CAT object, or adjusting the child otherwise. */
X/* */
X/* ALL_ADJUST Adjust x to fill the forward space available to */
X/* it, by adjusting all the components if x is a */
X/* CAT object, or adjusting the child otherwise. */
X/* */
X/* The suppress parameter is true if a temporary suppression of adjustment */
X/* is in effect (because a neighbouring adjustment has already been done). */
X/* */
X/* The padj parameter is analogous to the adjust parameter, but it */
X/* applies only to & adjustment, not to | or / adjustment. */
X/* */
X/* If dim == COL, the coordinate information is merely stored; but if */
X/* dim == ROW, it is used to generate PostScript for printing x. */
X/* */
X/* Parameter pg records the height of the current page. This is used */
X/* to correct for the fact that Lout's origin is at the top left, while */
X/* PostScript's is at the bottom left. This correction cannot be made by */
X/* transforming user space. */
X/* */
X/* x is the count'th child of its parent (used by COL_THR and ROW_THR only) */
X/* */
X/*****************************************************************************/
X
XFixAndPrintObject(x, xmk, xb, xf, dim, adjust, suppress, padj, pg, count)
XOBJECT x; LENGTH xmk, xb, xf; int dim, adjust; BOOLEAN suppress;
Xint padj; LENGTH pg; int count;
X{ OBJECT y, link, prev, g, uplink, z, p;
X LENGTH mk, frame_size, back_edge, tb, tf, yb, yf, inc;
X int i; float scale_factor;
X debug8(DGP, D, "[ FixAndPrintObject(%s, %s, %s,%s, %s, %s, %s, %s, pg ), x =",
X Image(type(x)), EchoLength(xmk), EchoLength(xb), EchoLength(xf), dimen(dim),
X (adjust == LAST_ADJUST ? "last_adjust" : "all_adjust"),
X (suppress == SUPPRESS ? "suppress" : "no_suppress"),
X (padj == LAST_ADJUST ? "last_adjust" : "all_adjust"));
X ifdebug(DGP, DD, EchoObject(stderr, x));
X


X switch( type(x) )
X {
X

X case CLOSURE:
X case NULL_CLOS:
X case CROSS:
X
X back(x, dim) = xb; fwd(x, dim) = xf;
X break;
X
X
X case WORD:
X
X if( dim == COL ) word_save_mark(x) = xmk;
X else if( string(x)[0] != '\0' ) PrintAtom(x, word_save_mark(x), pg-xmk);
X back(x, dim) = xb; fwd(x, dim) = xf;
X break;
X
X


X case WIDE:
X case HIGH:
X

X CountChild(y, Down(x), count);
X if( (dim == COL) == (type(x) == WIDE) )
X { yf = bfc(constraint(x)) - back(y, dim);
X FixAndPrintObject(y, xmk, back(y,dim), yf, dim, LAST_ADJUST,
X NO_SUPPRESS, padj, pg, count);
X back(x, dim) = xb; fwd(x, dim) = xf;
X }
X else
X { FixAndPrintObject(y, xmk, xb, xf, dim, adjust, suppress,
X padj, pg, count);
X back(x, dim) = back(y, dim); fwd(x, dim) = fwd(y, dim);
X }
X break;
X
X


X case HCONTRACT:
X case VCONTRACT:
X

X CountChild(y, Down(x), count);
X if( (dim == COL) == (type(x) == HCONTRACT) )
X { FixAndPrintObject(y, xmk, back(y,dim), fwd(y,dim), dim, LAST_ADJUST,
X NO_SUPPRESS, padj, pg, count);
X back(x, dim) = xb; fwd(x, dim) = xf;
X }
X else
X { FixAndPrintObject(y, xmk, xb, xf, dim, adjust, suppress, padj,pg,count);
X back(x, dim) = back(y, dim); fwd(x, dim) = fwd(y, dim);
X }
X break;
X
X


X case ONE_COL:
X case ONE_ROW:

X case HEXPAND:
X case VEXPAND:
X

X CountChild(y, Down(x), count);
X if( (dim == COL) == (type(x) == ONE_COL || type(x) == HEXPAND) )
X { FixAndPrintObject(y, xmk, xb, xf, dim, LAST_ADJUST,
X NO_SUPPRESS, padj, pg, count);
X back(x, dim) = xb; fwd(x, dim) = xf;
X }
X else
X { FixAndPrintObject(y, xmk, xb, xf, dim, adjust, suppress, padj,pg,count);
X back(x, dim) = back(y, dim); fwd(x, dim) = fwd(y, dim);
X }
X break;
X
X
X case PADJUST:
X
X CountChild(y, Down(x), count);
X FixAndPrintObject(y, xmk, xb, xf, dim, adjust, suppress,
X ALL_ADJUST, pg, count);
X back(x, dim) = back(y, dim); fwd(x, dim) = fwd(y, dim);
X break;
X
X


X case HADJUST:
X case VADJUST:
X

X CountChild(y, Down(x), count);
X if( (dim == COL) == (type(x) == HADJUST) )
X { FixAndPrintObject(y, xmk, xb, xf, dim, ALL_ADJUST, suppress,
X padj, pg, count);
X back(x, dim) = xb; fwd(x, dim) = xf;
X }
X else
X { FixAndPrintObject(y, xmk, xb, xf, dim, adjust, suppress,
X padj, pg, count);
X back(x, dim) = back(y, dim); fwd(x, dim) = fwd(y, dim);
X }
X break;
X
X
X case VSCALE:
X
X debug0(DRS, D, "FixAndPrintObject at VSCALE");
X CountChild(y, Down(x), count);
X if( dim == COL )
X { FixAndPrintObject(y, xmk, xb, xf, dim, LAST_ADJUST, NO_SUPPRESS,
X padj,pg,count);
X }
X else if( (scale_factor = ScaleFactor(xb+xf, size(y, ROW))) > 0 )
X { SaveGraphicState();
X CoordTranslate(0, pg - (xmk-xb + (LENGTH) (back(y, ROW)*scale_factor)));
X CoordScale(1.0, scale_factor);
X FixAndPrintObject(y, 0, back(y, ROW), fwd(y, ROW), dim, LAST_ADJUST,
X NO_SUPPRESS, padj, 0, count);
X RestoreGraphicState();
X }
X else if( type(y) != WORD || string(y)[0] != '\0' )
X { Error(WARN, &fpos(x), "object deleted: cannot %s", KW_VSCALE);
X }
X back(x, dim) = xb; fwd(x, dim) = xf;
X break;
X
X
X case HSCALE:
X
X debug0(DRS, DD, "FixAndPrintObject at HSCALE");
X CountChild(y, Down(x), count);
X if( dim == COL )
X { save_mark(x) = xmk;
X bc(constraint(x)) = xb;
X fc(constraint(x)) = xf;
X if( (scale_factor = ScaleFactor(xb+xf, size(y, COL))) > 0 )
X FixAndPrintObject(y, 0, back(y, COL), fwd(y, COL), dim, LAST_ADJUST,
X NO_SUPPRESS, LAST_ADJUST, pg, count);
X else if( type(y) != WORD || string(y)[0] != '\0' )
X Error(WARN, &fpos(y), "object deleted: cannot %s", KW_HSCALE);
X }
X else if( (scale_factor =
X ScaleFactor(bc(constraint(x))+fc(constraint(x)), size(y, COL))) > 0 )
X { SaveGraphicState();
X CoordTranslate(save_mark(x) - bc(constraint(x))
X + (LENGTH) (back(y, COL)*scale_factor), 0);
X CoordScale(scale_factor, 1.0);
X FixAndPrintObject(y, xmk, xb, xf, dim, LAST_ADJUST,
X NO_SUPPRESS, padj, pg, count);
X RestoreGraphicState();
X }
X back(x, dim) = xb; fwd(x, dim) = xf;
X break;
X
X
X case SCALE:
X
X CountChild(y, Down(x), count);
X if( dim == COL )
X {
X assert( bc(constraint(x)) > 0, "FAPO: horizontal scale factor!" );
X save_mark(x) = xmk;
X yb = xb * SF / bc(constraint(x));
X yf = xf * SF / bc(constraint(x));
X FixAndPrintObject(y, 0, yb, yf, dim, LAST_ADJUST, NO_SUPPRESS,
X padj, pg, count);
X }
X else
X {
X assert( fc(constraint(x)) > 0, "FAPO: vertical scale factor!" );
X yb = xb * SF / fc(constraint(x));
X yf = xf * SF / fc(constraint(x));
X SaveGraphicState();
X CoordTranslate(save_mark(x), pg - xmk);
X CoordScale( (float) bc(constraint(x))/SF, (float) fc(constraint(x))/SF);
X FixAndPrintObject(y, 0, yb, yf, dim, LAST_ADJUST, NO_SUPPRESS,
X padj,0,count);
X RestoreGraphicState();
X }
X back(x, dim) = xb; fwd(x, dim) = xf;
X break;
X
X
X case ROTATE:
X
X CountChild(y, Down(x), count);
X if( dim == COL )
X { save_mark(x) = xmk;
X back(x, dim) = xb;
X fwd(x, dim) = xf;
X }
X else
X {
X CONSTRAINT colc, rowc, yc;
X back(x, dim) = xb;
X fwd(x, dim) = xf;
X SetConstraint(colc, back(x,COL), MAX_LEN, fwd(x,COL));
X SetConstraint(rowc, back(x,ROW), MAX_LEN, fwd(x,ROW));
X RotateConstraint(&yc, y, sparec(constraint(x)), &colc, &rowc, COL);
X FixAndPrintObject(y, 0, bc(yc), fc(yc), COL, LAST_ADJUST,
X NO_SUPPRESS, padj, pg, count);
X SaveGraphicState();
X CoordTranslate(save_mark(x), pg - xmk);
X CoordRotate(sparec(constraint(x)));
X RotateConstraint(&yc, y, sparec(constraint(x)), &colc, &rowc, ROW);
X FixAndPrintObject(y, 0, bc(yc), fc(yc), ROW, LAST_ADJUST,
X NO_SUPPRESS, padj, 0, count);
X RestoreGraphicState();
X }
X back(x, dim) = xb; fwd(x, dim) = xf;
X break;
X
X
X case GRAPHIC:
X
X CountChild(y, LastDown(x), count);
X if( dim == COL )
X {
X back(x, dim) = xb;
X fwd(x, dim) = xf;
X debug2(DGP, DD, "GRAPHIC COL storing size %s, %s",
X EchoLength(back(x, dim)), EchoLength(fwd(x, dim)));
X save_mark(x) = xmk - back(x, COL);
X FixAndPrintObject(y, xb, xb, xf, dim, LAST_ADJUST,
X NO_SUPPRESS, padj, pg, count);
X }
X else
X { OBJECT tmp, pre, post;
X Child(tmp, Down(x));
X if( type(tmp) == VCAT )
X { Child(pre, Down(tmp));
X Child(post, LastDown(tmp));
X }
X else pre = tmp, post = nil;
X back(x, dim) = xb;
X fwd(x, dim) = xf;
X SaveGraphicState();
X CoordTranslate(save_mark(x), pg - (xmk + fwd(x, ROW)));
X debug4(DGP, DD, "GRAPHIC ROW calling %s,%s %s,%s",
X EchoLength(back(x, COL)), EchoLength(fwd(x, COL)),
X EchoLength(back(x, ROW)), EchoLength(fwd(x, ROW)));
X DefineGraphicNames(x);
X SaveGraphicState();
X PrintGraphicObject(pre);
X RestoreGraphicState();
X FixAndPrintObject(y, xb, xb, xf, dim, LAST_ADJUST,
X NO_SUPPRESS, padj, xb + xf, count);
X if( post != nil ) PrintGraphicObject(post);
X RestoreGraphicState();
X }
X back(x, dim) = xb; fwd(x, dim) = xf;
X break;
X
X


X case INCGRAPHIC:
X case SINCGRAPHIC:
X

X CountChild(y, Down(x), count);
X if( dim == COL )
X { save_mark(x) = xmk;
X }
X else if( sparec(constraint(x)) )
X {
X PrintGraphicInclude(x, save_mark(x), pg - xmk);
X }
X back(x, dim) = xb; fwd(x, dim) = xf;
X break;
X
X
X case SPLIT:
X
X link = DownDim(x, dim); CountChild(y, link, count);
X FixAndPrintObject(y, xmk, xb, xf, dim, adjust, suppress, padj, pg, count);
X back(x, dim) = back(y, dim); fwd(x, dim) = fwd(y, dim);
X break;
X
X
X case VCAT:
X case HCAT:
X
X if( (type(x) == VCAT) == (dim == ROW) )
X {
X /* find adjustment increment if required */
X frame_size = xb + xf;
X if( adjust == ALL_ADJUST && !suppress )
X inc = FindAdjustIncrement(x, frame_size, dim);
X else inc = 0;
X
X FirstDefinite(x, link, prev);
X if( link != x )
X { back_edge = xmk - back(x, dim);
X mk = back_edge + back(prev, dim);
X NextDefiniteWithGap(x, link, y, g);
X while( link != x )
X {
X FixAndPrintObject(prev, mk, back(prev, dim), fwd(prev, dim) + inc,
X dim, adjust, NO_SUPPRESS, padj, pg, count);
X /* NB fwd(prev, dim) may be changed by the call to FAPO */
X mk += ActualGap(fwd(prev, dim), back(y, dim), fwd(y, dim), &gap(g),
X frame_size, mk - back_edge);
X prev = y;
X NextDefiniteWithGap(x, link, y, g);
X }
X if( suppress )
X FixAndPrintObject(prev, mk, back(prev, dim), fwd(prev, dim),
X dim, adjust, NO_SUPPRESS, padj, pg, count);
X else
X FixAndPrintObject(prev, mk, back(prev,dim),
X max(fwd(prev, dim), back_edge+frame_size-mk),
X dim, adjust, NO_SUPPRESS, padj, pg, count);
X back(x, dim) = max(back(x, dim), xb);
X fwd(x, dim) = mk + fwd(prev, dim) - back_edge - back(x, dim);
X }
X else back(x, dim) = xb, fwd(x, dim) = xf;
X }
X else
X { OBJECT start_group, zlink, m; BOOLEAN dble_found; LENGTH b, f, dlen;
X start_group = nil; dble_found = FALSE; dlen = 0;
X debug0(DGP, DD, " groups beginning.");


X for( link = Down(x); link != x; link = NextDown(link) )
X {

X Child(y, link);
X debug1(DGP, DD, " examining %s", EchoObject(null, y));
X if( is_index(type(y)) ) continue;


X if( type(y) == GAP_OBJ )
X {

X assert( start_group != nil, "FAPO: start_group!" );
X if( !join(gap(y)) )
X {
X /* finish off and fix this group */
X debug2(DGP, DD, " finishing group: b = %s, f = %s",
X EchoLength(b), EchoLength(f));
X FixAndPrintObject(m, xmk+b, b, xf-b, dim, adjust,
X NO_SUPPRESS, padj, pg, count);
X b = back(m, dim); f = fwd(m, dim);
X for( zlink = start_group; zlink != link; zlink=NextDown(zlink) )
X { CountChild(z, zlink, count);
X if( !is_definite(type(z)) || z == m ) continue;
X FixAndPrintObject(z, xmk + b, b, xf - b, dim,
X adjust, SUPPRESS, padj, pg, count);
X b = max(b, back(z, dim)); f = max(f, fwd(z, dim));
X }
X dlen = max(dlen, b + f);
X dble_found = TRUE;
X start_group = nil;
X }
X }
X else if( start_group == nil )
X {
X /* start new group */
X b = back(y, dim);
X f = fwd(y, dim);
X m = y;
X start_group = link;
X debug2(DGP, DD, " starting group: b = %s, f = %s",
X EchoLength(b), EchoLength(f));
X }
X else
X {
X /* continue with current group */
X b = max(b, back(y, dim));
X f = max(f, fwd(y, dim));
X if( fwd(y, dim) > fwd(m, dim) ) m = y;
X debug2(DGP, DD, " continuing group: b = %s, f = %s",
X EchoLength(b), EchoLength(f));
X }
X }
X assert( start_group != nil, "FAPO: final start_group!" );
X
X if( dble_found )
X {
X /* finish off and fix this last group */
X debug2(DGP, DD, " finishing last group: b = %s, f = %s",
X EchoLength(b), EchoLength(f));
X FixAndPrintObject(m, xmk + b, b, xf - b, dim, adjust,
X NO_SUPPRESS, padj, pg, count);
X b = back(m, dim); f = fwd(m, dim);
X for( zlink = start_group; zlink != link; zlink = NextDown(zlink) )
X { CountChild(z, zlink, count);
X if( !is_definite(type(z)) || z == m ) continue;
X FixAndPrintObject(z, xmk + b, b, xf - b, dim, adjust,
X SUPPRESS, padj, pg, count);
X b = max(b, back(z, dim)); f = max(f, fwd(z, dim));
X }
X dlen = max(dlen, b + f);
X back(x, dim) = 0; fwd(x, dim) = dlen;
X }
X else
X {
X /* finish off and fix this last and only group */
X debug2(DGP, DD, " finishing last and only group: b = %s, f = %s",
X EchoLength(b), EchoLength(f));
X FixAndPrintObject(m, xmk, xb, xf, dim, adjust,
X NO_SUPPRESS, padj, pg, count);
X b = back(m, dim); f = fwd(m, dim);
X for( zlink = start_group; zlink != link; zlink = NextDown(zlink) )
X { CountChild(z, zlink, count);
X if( !is_definite(type(z)) || z == m ) continue;
X FixAndPrintObject(z, xmk, xb, xf, dim, adjust,
X SUPPRESS, padj, pg, count);
X b = max(b, back(z, dim)); f = max(f, fwd(z, dim));
X }
X back(x, dim) = b; fwd(x, dim) = f;
X }
X }
X break;
X
X
X case ACAT:
X
X if( dim == COL )
X { BOOLEAN bad_gap;
X LENGTH actual_size,
X adjust_indent, frame_size, back_edge, adjust_inc, inc;
X int adjustable_gaps;
X
X
X /*********************************************************************/
X /* */
X /* The first step is to calculate the following values: */
X /* */
X /* bad_gap TRUE if an adjust-preventing gap is found */
X /* */
X /* actual_size the actual size of x; */
X /* */
X /* adjustable_gaps the number of gaps to the right of the */
X /* right-most tab gap. */
X /* */
X /* These make it easy to perform adjustment on a second pass, if */
X /* required. */
X /* */
X /*********************************************************************/
X
X FirstDefinite(x, link, y);
X if( link == x ) break; /* no definite children, nothing to print */
X bad_gap = FALSE;
X adjustable_gaps = 0;
X back_edge = xmk - xb;
X mk = back_edge + back(y, dim);
X frame_size = xb + xf;
X prev = y;
X NextDefiniteWithGap(x, link, y, g);
X while( link != x )
X {
X save_actual_gap(g) = ActualGap(fwd(prev, dim), back(y, dim),
X fwd(y, dim), &gap(g), frame_size, mk - back_edge);
X mk += save_actual_gap(g);
X if( mode(gap(g)) == TAB_MODE || units(gap(g)) == AVAIL_UNIT
X || units(gap(g)) == FRAME_UNIT )
X { bad_gap = TRUE;
X }
X else if( width(gap(g)) > 0 ) adjustable_gaps += 1;
X prev = y;
X NextDefiniteWithGap(x, link, y, g);
X }
X actual_size = mk + fwd(prev, dim) - back_edge;
X
X /*********************************************************************/
X /* */
X /* The second step is to work out whether adjusting is required */
X /* or not, and if so by how much, using the following variables: */
X /* */
X /* adjust_inc The amount of adjustment to apply initially. */
X /* */
X /* adjust_indent initial indent for centring etc. */
X /* */
X /* NB adjust_inc may be negative, if the optimal paragraph */
X /* breaker has chosen to shrink some gaps. */
X /* */
X /*********************************************************************/
X
X adjust_indent = 0;
X switch( display_style(save_style(x)) )
X {
X case DO_ADJUST: padj = ALL_ADJUST;
X break;
X
X case DISPLAY_CENTRE: if( actual_size <= frame_size )
X { adjust_indent = (frame_size - actual_size)/2;
X padj = LAST_ADJUST;
X }
X else padj = ALL_ADJUST;
X debug1(DGP,DD, "cdisp %s", EchoObject(null,x));
X break;
X
X case DISPLAY_RIGHT: if( actual_size <= frame_size )
X { adjust_indent = frame_size - actual_size;
X padj = LAST_ADJUST;
X }
X else padj = ALL_ADJUST;
X debug1(DGP,DD, "rdisp %s", EchoObject(null,x));
X break;
X }
X
X if( padj == ALL_ADJUST && adjustable_gaps > 0 && !bad_gap )
X { adjust_inc = (frame_size - actual_size) / adjustable_gaps;
X inc = max(adjust_inc, 0);
X }
X else adjust_inc = inc = 0;
X
X debug2(DGP, DD, "ACAT %s %s",
X EchoStyle(&save_style(x)), EchoObject(null, x));
X debug3(DGP,DD,"frame_size = %s, actual_size = %s, adjustable_gaps = %d",
X EchoLength(frame_size), EchoLength(actual_size), adjustable_gaps);
X debug2(DGP,DD,"bad_gap = %s, adjust_inc = %s",
X bool(bad_gap), EchoLength(adjust_inc));
X
X /*********************************************************************/
X /* */
X /* The third and final step is to traverse x, fixing subobjects. */
X /* */
X /*********************************************************************/
X
X FirstDefinite(x, link, y);
X prev = y;
X mk = xmk - back(x, dim) + back(y, dim) + adjust_indent;
X NextDefiniteWithGap(x, link, y, g);
X while( link != x )
X {
X /* fix previous definite now we know it isn't the last one */
X if( width(gap(g)) > 0 )
X { FixAndPrintObject(prev, mk, back(prev, dim), fwd(prev, dim) + inc,
X dim, adjust, NO_SUPPRESS, LAST_ADJUST, pg, count);
X mk += save_actual_gap(g) + adjust_inc;
X }
X else
X { FixAndPrintObject(prev, mk, back(prev, dim), fwd(prev, dim),
X dim, adjust, NO_SUPPRESS, LAST_ADJUST, pg, count);
X mk += save_actual_gap(g);
X }
X
X /* move on to next subobject */
X prev = y;
X NextDefiniteWithGap(x, link, y, g);
X }
X
X /* fix the last definite subobject, prev, which must exist */
X FixAndPrintObject(prev, mk, back(prev, dim),
X frame_size - (mk - xmk) - back(x, dim),
X dim, adjust, NO_SUPPRESS, LAST_ADJUST, pg, count);
X }
X else for( link = Down(x); link != x; link = NextDown(link) )
X { Child(y, link);
X if( !is_definite(type(y)) ) continue;
X FixAndPrintObject(y, xmk, xb, xf, dim, adjust, NO_SUPPRESS,
X padj,pg,count);
X }
X back(x, dim) = xb; fwd(x, dim) = xf;
X break;
X
X
X case COL_THR:
X case ROW_THR:
X
X /* find and delete the count'th child y */
X assert( (type(x) == COL_THR) == (dim == COL), "FixAndPrintObject: thr!" );
X for( link = Down(x), uplink = Up(x), i = 1;
X link != x && uplink != x && i < count;
X link = NextDown(link), uplink = NextUp(uplink), i++ );
X assert( link != x && uplink != x, "FixAndPrintObject: link or uplink!" );
X CountChild(y, link, count);
X MoveLink(uplink, link, CHILD); DeleteLink(link); /* IMPORTANT!!! */
X assert( type(y) != GAP_OBJ, "FAPO: THR!");
X
X /* assign size if not done previously */
X if( thr_state(x) != FINALSIZE )
X { back(x, dim) = xb; fwd(x, dim) = xf;
X thr_state(x) = FINALSIZE;
X }
X
X /* *** else been here before, size is already decided; do nothing
X { if( back(x, dim) > xb || fwd(x, dim) > xf )
X { Error(WARN, &fpos(y), "wrong %s chosen (sorry!)",
X dim == COL ? "column width" : "row height");
X if( back(x, dim) > xb ) back(x, dim) = xb;
X if( fwd(x, dim) > xf ) fwd(x, dim) = xf;
X }


X }
X *** */
X

X /* fix y */
X FixAndPrintObject(y, xmk, back(x, dim), fwd(x, dim), dim, LAST_ADJUST,
X NO_SUPPRESS, padj, pg, count);
X if( Up(x) == x ) Dispose(x);
X break;
X
X
X default:
X
X Error(INTERN, no_fpos, "FixAndPrint: found %s", Image(type(x)));


X break;
X
X } /* end switch */

X debug2(DGP, D, "] FixAndPrintObject returning (size now %s,%s).",
X EchoLength(back(x, dim)), EchoLength(fwd(x, dim)));
X} /* end FixAndPrintObject */
END_OF_FILE
if test 28465 -ne `wc -c <'lout/z23.c'`; then
echo shar: \"'lout/z23.c'\" unpacked with wrong size!
fi
# end of 'lout/z23.c'
fi
echo shar: End of archive 9 \(of 30\).
cp /dev/null ark9isdone

Jeff Kingston

unread,
Jun 1, 1993, 1:18:42 AM6/1/93
to
Submitted-by: je...@joyce.cs.su.oz.au (Jeff Kingston)
Posting-number: Volume 37, Issue 108
Archive-name: lout/part10
Environment: UNIX

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: lout/include/lout.hyph lout/z06.c lout/z33.c
# Wrapped by kent@sparky on Sun May 30 19:43:56 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 10 (of 30)."'
if test -f 'lout/include/lout.hyph' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/include/lout.hyph'\"
else
echo shar: Extracting \"'lout/include/lout.hyph'\" \(27421 characters\)
sed "s/^X//" >'lout/include/lout.hyph' <<'END_OF_FILE'
X@!$%^&*()_-+=~`{[}]:;'|<,.>?/0123456789
XaA
XbB
XcC
XdD
XeE
XfF
XgG
XhH
XiI
XjJ
XkK
XlL
XmM
XnN
XoO
XpP
XqQ
XrR
XsS
XtT
XuU
XvV
XwW
XxX
XyY
XzZ
X
X.ach4
X.ad4der
X.af1t
X.al3t
X.am5at
X.an5c
X.ang4
X.ani5m
X.ant4
X.an3te
X.anti5s
X.ar5s
X.ar4tie
X.ar4ty
X.as3c
X.as1p
X.as1s
X.aster5
X.atom5
X.au1d
X.av4i
X.awn4
X.ba4g
X.ba5na
X.bas4e
X.ber4
X.be5ra
X.be3sm
X.be5sto
X.bri2
X.but4ti
X.cam4pe
X.can5c
X.capa5b
X.car5ol
X.ca4t
X.ce4la
X.ch4
X.chill5i
X.ci2
X.cit5r
X.co3e
X.co4r
X.cor5ner
X.de4moi
X.de3o
X.de3ra
X.de3ri
X.des4c
X.dictio5
X.do4t
X.du4c
X.dumb5
X.earth5
X.eas3i
X.eb4
X.eer4
X.eg2
X.el5d
X.el3em
X.enam3
X.en3g
X.en3s
X.eq5ui5t
X.er4ri
X.es3
X.eu3
X.eye5
X.fes3
X.for5mer
X.ga2
X.ge2
X.gen3t4
X.ge5og
X.gi5a
X.gi4b
X.go4r
X.hand5i
X.han5k
X.he2
X.hero5i
X.hes3
X.het3
X.hi3b
X.hi3er
X.hon5ey
X.hon3o
X.hov5
X.id4l
X.idol3
X.im3m
X.im5pin
X.in1
X.in3ci
X.ine2
X.in2k
X.in3s
X.ir5r
X.is4i
X.ju3r
X.la4cy
X.la4m
X.lat5er
X.lath5
X.le2
X.leg5e
X.len4
X.lep5
X.lev1
X.li4g
X.lig5a
X.li2n
X.li3o
X.li4t
X.mag5a5
X.mal5o
X.man5a
X.mar5ti
X.me2
X.mer3c
X.me5ter
X.mis1
X.mist5i
X.mon3e
X.mo3ro
X.mu5ta
X.muta5b
X.ni4c
X.od2
X.odd5
X.of5te
X.or5ato
X.or3c
X.or1d
X.or3t
X.os3
X.os4tl
X.oth3
X.out3
X.ped5al
X.pe5te
X.pe5tit
X.pi4e
X.pio5n
X.pi2t
X.pre3m
X.ra4c
X.ran4t
X.ratio5na
X.ree2
X.re5mit
X.res2
X.re5stat
X.ri4g
X.rit5u
X.ro4q
X.ros5t
X.row5d
X.ru4d
X.sci3e
X.self5
X.sell5
X.se2n
X.se5rie
X.sh2
X.si2
X.sing4
X.st4
X.sta5bl
X.sy2
X.ta4
X.te4
X.ten5an
X.th2
X.ti2
X.til4
X.tim5o5
X.ting4
X.tin5k
X.ton4a
X.to4p
X.top5i
X.tou5s
X.trib5ut
X.un1a
X.un3ce
X.under5
X.un1e
X.un5k
X.un5o
X.un3u
X.up3
X.ure3
X.us5a
X.ven4de
X.ve5ra
X.wil5i
X.ye4
X4ab.
Xa5bal
Xa5ban
Xabe2
Xab5erd
Xabi5a
Xab5it5ab
Xab5lat
Xab5o5liz
X4abr
Xab5rog
Xab3ul
Xa4car
Xac5ard
Xac5aro
Xa5ceou
Xac1er
Xa5chet
X4a2ci
Xa3cie
Xac1in
Xa3cio
Xac5rob
Xact5if
Xac3ul
Xac4um
Xa2d
Xad4din
Xad5er.
X2adi
Xa3dia
Xad3ica
Xadi4er
Xa3dio
Xa3dit
Xa5diu
Xad4le
Xad3ow
Xad5ran
Xad4su
X4adu
Xa3duc
Xad5um
Xae4r
Xaeri4e
Xa2f
Xaff4
Xa4gab
Xaga4n
Xag5ell
Xage4o
X4ageu
Xag1i
X4ag4l
Xag1n
Xa2go
X3agog
Xag3oni
Xa5guer
Xag5ul
Xa4gy
Xa3ha
Xa3he
Xah4l
Xa3ho
Xai2
Xa5ia
Xa3ic.
Xai5ly
Xa4i4n
Xain5in
Xain5o
Xait5en
Xa1j
Xak1en
Xal5ab
Xal3ad
Xa4lar
X4aldi
X2ale
Xal3end
Xa4lenti
Xa5le5o
Xal1i
Xal4ia.
Xali4e
Xal5lev
X4allic
X4alm
Xa5log.
Xa4ly.
X4alys
X5a5lyst
X5alyt
X3alyz
X4ama
Xam5ab
Xam3ag
Xama5ra
Xam5asc
Xa4matis
Xa4m5ato
Xam5era
Xam3ic
Xam5if
Xam5ily
Xam1in
Xami4no
Xa2mo
Xa5mon
Xamor5i
Xamp5en
Xa2n
Xan3age
X3analy
Xa3nar
Xan3arc
Xanar4i
Xa3nati
X4and
Xande4s
Xan3dis
Xan1dl
Xan4dow
Xa5nee
Xa3nen
Xan5est.
Xa3neu
X2ang
Xang5ie
Xan1gl
Xa4n1ic
Xa3nies
Xan3i3f
Xan4ime
Xa5nimi
Xa5nine
Xan3io
Xa3nip
Xan3ish
Xan3it
Xa3niu
Xan4kli
X5anniz
Xano4
Xan5ot
Xanoth5
Xan2sa
Xan4sco
Xan4sn
Xan2sp
Xans3po
Xan4st
Xan4sur
Xantal4
Xan4tie
X4anto
Xan2tr
Xan4tw
Xan3ua
Xan3ul
Xa5nur
X4ao
Xapar4
Xap5at
Xap5ero
Xa3pher
X4aphi
Xa4pilla
Xap5illar
Xap3in
Xap3ita
Xa3pitu
Xa2pl
Xapoc5
Xap5ola
Xapor5i
Xapos3t
Xaps5es
Xa3pu
Xaque5
X2a2r
Xar3act
Xa5rade
Xar5adis
Xar3al
Xa5ramete
Xaran4g
Xara3p
Xar4at
Xa5ratio
Xar5ativ
Xa5rau
Xar5av4
Xaraw4
Xarbal4
Xar4chan
Xar5dine
Xar4dr
Xar5eas
Xa3ree
Xar3ent
Xa5ress
Xar4fi
Xar4fl
Xar1i
Xar5ial
Xar3ian
Xa3riet
Xar4im
Xar5inat
Xar3io
Xar2iz
Xar2mi
Xar5o5d
Xa5roni
Xa3roo
Xar2p
Xar3q
Xarre4
Xar4sa
Xar2sh
X4as.
Xas4ab
Xas3ant
Xashi4
Xa5sia.
Xa3sib
Xa3sic
X5a5si4t
Xask3i
Xas4l
Xa4soc
Xas5ph
Xas4sh
Xas3ten
Xas1tr
Xasur5a
Xa2ta
Xat3abl
Xat5ac
Xat3alo
Xat5ap
Xate5c
Xat5ech
Xat3ego
Xat3en.
Xat3era
Xater5n
Xa5terna
Xat3est
Xat5ev
X4ath
Xath5em
Xa5then
Xat4ho
Xath5om
X4ati.
Xa5tia
Xat5i5b
Xat1ic
Xat3if
Xation5ar
Xat3itu
Xa4tog
Xa2tom
Xat5omiz
Xa4top
Xa4tos
Xa1tr
Xat5rop
Xat4sk
Xat4tag
Xat5te
Xat4th
Xa2tu
Xat5ua
Xat5ue
Xat3ul
Xat3ura
Xa2ty
Xau4b
Xaugh3
Xau3gu
Xau4l2
Xaun5d
Xau3r
Xau5sib
Xaut5en
Xau1th
Xa2va
Xav3ag
Xa5van
Xave4no
Xav3era
Xav5ern
Xav5ery
Xav1i
Xavi4er
Xav3ig
Xav5oc
Xa1vor
X3away
Xaw3i
Xaw4ly
Xaws4
Xax4ic
Xax4id
Xay5al
Xaye4
Xays4
Xazi4er
Xazz5i
X5ba.
Xbad5ger
Xba4ge
Xbal1a
Xban5dag
Xban4e
Xban3i
Xbarbi5
Xbari4a
Xbas4si
X1bat
Xba4z
X2b1b
Xb2be
Xb3ber
Xbbi4na
X4b1d
X4be.
Xbeak4
Xbeat3
X4be2d
Xbe3da
Xbe3de
Xbe3di
Xbe3gi
Xbe5gu
X1bel
Xbe1li
Xbe3lo
X4be5m
Xbe5nig
Xbe5nu
X4bes4
Xbe3sp
Xbe5str
X3bet
Xbet5iz
Xbe5tr
Xbe3tw
Xbe3w
Xbe5yo
X2bf
X4b3h
Xbi2b
Xbi4d
X3bie
Xbi5en
Xbi4er
X2b3if
X1bil
Xbi3liz
Xbina5r4
Xbin4d
Xbi5net
Xbi3ogr
Xbi5ou
Xbi2t
X3bi3tio
Xbi3tr
X3bit5ua
Xb5itz
Xb1j
Xbk4
Xb2l2
Xblath5
Xb4le.
Xblen4
X5blesp
Xb3lis
Xb4lo
Xblun4t
X4b1m
X4b3n
Xbne5g
X3bod
Xbod3i
Xbo4e
Xbol3ic
Xbom4bi
Xbon4a
Xbon5at
X3boo
X5bor.
X4b1ora
Xbor5d
X5bore
X5bori
X5bos4
Xb5ota
Xboth5
Xbo4to
Xbound3
X4bp
X4brit
Xbroth3
X2b5s2
Xbsor4
X2bt
Xbt4l
Xb4to
Xb3tr
Xbuf4fer
Xbu4ga
Xbu3li
Xbumi4
Xbu4n
Xbunt4i
Xbu3re
Xbus5ie
Xbuss4e
X5bust
X4buta
X3butio
Xb5uto
Xb1v
X4b5w
X5by.
Xbys4
X1ca
Xcab3in
Xca1bl
Xcach4
Xca5den
X4cag4
X2c5ah
Xca3lat
Xcal4la
Xcall5in
X4calo
Xcan5d
Xcan4e
Xcan4ic
Xcan5is
Xcan3iz
Xcan4ty
Xcany4
Xca5per
Xcar5om
Xcast5er
Xcas5tig
X4casy
Xca4th
X4cativ
Xcav5al
Xc3c
Xccha5
Xcci4a
Xccompa5
Xccon4
Xccou3t
X2ce.
X4ced.
X4ceden
X3cei
X5cel.
X3cell
X1cen
X3cenc
X2cen4e
X4ceni
X3cent
X3cep
Xce5ram
X4cesa
X3cessi
Xces5si5b
Xces5t
Xcet4
Xc5e4ta
Xcew4
X2ch
X4ch.
X4ch3ab
X5chanic
Xch5a5nis
Xche2
Xcheap3
X4ched
Xche5lo
X3chemi
Xch5ene
Xch3er.
Xch3ers
X4ch1in
X5chine.
Xch5iness
X5chini
X5chio
X3chit
Xchi2z
X3cho2
Xch4ti
X1ci
X3cia
Xci2a5b
Xcia5r
Xci5c
X4cier
X5cific.
X4cii
Xci4la
X3cili
X2cim
X2cin
Xc4ina
X3cinat
Xcin3em
Xc1ing
Xc5ing.
X5cino
Xcion4
X4cipe
Xci3ph
X4cipic
X4cista
X4cisti
X2c1it
Xcit3iz
X5ciz
Xck1
Xck3i
X1c4l4
X4clar
Xc5laratio
X5clare
Xcle4m
X4clic
Xclim4
Xcly4
Xc5n
X1co
Xco5ag
Xcoe2
X2cog
Xco4gr
Xcoi4
Xco3inc
Xcol5i
X5colo
Xcol3or
Xcom5er
Xcon4a
Xc4one
Xcon3g
Xcon5t
Xco3pa
Xcop3ic
Xco4pl
X4corb
Xcoro3n
Xcos4e
Xcov1
Xcove4
Xcow5a
Xcoz5e
Xco5zi
Xc1q
Xcras5t
X5crat.
X5cratic
Xcre3at
X5cred
X4c3reta
Xcre4v
Xcri2
Xcri5f
Xc4rin
Xcris4
X5criti
Xcro4pl
Xcrop5o
Xcros4e
Xcru4d
X4c3s2
X2c1t
Xcta4b
Xct5ang
Xc5tant
Xc2te
Xc3ter
Xc4ticu
Xctim3i
Xctu4r
Xc4tw
Xcud5
Xc4uf
Xc4ui
Xcu5ity
X5culi
Xcul4tis
X3cultu
Xcu2ma
Xc3ume
Xcu4mi
X3cun
Xcu3pi
Xcu5py
Xcur5a4b
Xcu5ria
X1cus
Xcuss4i
X3c4ut
Xcu4tie
X4c5utiv
X4cutr
X1cy
Xcze4
X1d2a
X5da.
X2d3a4b
Xdach4
X4daf
X2dag
Xda2m2
Xdan3g
Xdard5
Xdark5
X4dary
X3dat
X4dativ
X4dato
X5dav4
Xdav5e
X5day
Xd1b
Xd5c
Xd1d4
X2de.
Xdeaf5
Xdeb5it
Xde4bon
Xdecan4
Xde4cil
Xde5com
X2d1ed
X4dee.
Xde5if
Xdeli4e
Xdel5i5q
Xde5lo
Xd4em
X5dem.
X3demic
Xdem5ic.
Xde5mil
Xde4mons
Xdemor5
X1den
Xde4nar
Xde3no
Xdenti5f
Xde3nu
Xde1p
Xde3pa
Xdepi4
Xde2pu
Xd3eq
Xd4erh
X5derm
Xdern5iz
Xder5s
Xdes2
Xd2es.
Xde1sc
Xde2s5o
Xdes3ti
Xde3str
Xde4su
Xde1t
Xde2to
Xde1v
Xdev3il
X4dey
X4d1f
Xd4ga
Xd3ge4t
Xdg1i
Xd2gy
Xd1h2
X5di.
X1d4i3a
Xdia5b
Xdi4cam
Xd4ice
X3dict
X3did
X5di3en
Xd1if
Xdi3ge
Xdi4lato
Xd1in
X1dina
X3dine.
X5dini
Xdi5niz
X1dio
Xdio5g
Xdi4pl
Xdir2
Xdi1re
Xdirt5i
Xdis1
X5disi
Xd4is3t
Xd2iti
X1di1v
Xd1j
Xd5k2
X4d5la
X3dle.
X3dled
X3dles.
X4dless
X2d3lo
X4d5lu
X2dly
Xd1m
X4d1n4
X1do
X3do.
Xdo5de
X5doe
X2d5of
Xd4og
Xdo4la
Xdoli4
Xdo5lor
Xdom5iz
Xdo3nat
Xdoni4
Xdoo3d
Xdop4p
Xd4or
X3dos
X4d5out
Xdo4v
X3dox
Xd1p
X1dr
Xdrag5on
X4drai
Xdre4
Xdrea5r
X5dren
Xdri4b
Xdril4
Xdro4p
X4drow
X5drupli
X4dry
X2d1s2
Xds4p
Xd4sw
Xd4sy
Xd2th
X1du
Xd1u1a
Xdu2c
Xd1uca
Xduc5er
X4duct.
X4ducts
Xdu5el
Xdu4g
Xd3ule
Xdum4be
Xdu4n
X4dup
Xdu4pe
Xd1v
Xd1w
Xd2y
X5dyn
Xdy4se
Xdys5p
Xe1a4b
Xe3act
Xead1
Xead5ie
Xea4ge
Xea5ger
Xea4l
Xeal5er
Xeal3ou
Xeam3er
Xe5and
Xear3a
Xear4c
Xear5es
Xear4ic
Xear4il
Xear5k
Xear2t
Xeart3e
Xea5sp
Xe3ass
Xeast3
Xea2t
Xeat5en
Xeath3i
Xe5atif
Xe4a3tu
Xea2v
Xeav3en
Xeav5i
Xeav5o
X2e1b
Xe4bel.
Xe4bels
Xe4ben
Xe4bit
Xe3br
Xe4cad
Xecan5c
Xecca5
Xe1ce
Xec5essa
Xec2i
Xe4cib
Xec5ificat
Xec5ifie
Xec5ify
Xec3im
Xeci4t
Xe5cite
Xe4clam
Xe4clus
Xe2col
Xe4comm
Xe4compe
Xe4conc
Xe2cor
Xec3ora
Xeco5ro
Xe1cr
Xe4crem
Xec4tan
Xec4te
Xe1cu
Xe4cul
Xec3ula
X2e2da
X4ed3d
Xe4d1er
Xede4s
X4edi
Xe3dia
Xed3ib
Xed3ica
Xed3im
Xed1it
Xedi5z
X4edo
Xe4dol
Xedon2
Xe4dri
Xe4dul
Xed5ulo
Xee2c
Xeed3i
Xee2f
Xeel3i
Xee4ly
Xee2m
Xee4na
Xee4p1
Xee2s4
Xeest4
Xee4ty
Xe5ex
Xe1f
Xe4f3ere
X1eff
Xe4fic
X5efici
Xefil4
Xe3fine
Xef5i5nite
X3efit
Xefor5es
Xe4fuse.
X4egal
Xeger4
Xeg5ib
Xeg4ic
Xeg5ing
Xe5git5
Xeg5n
Xe4go.
Xe4gos
Xeg1ul
Xe5gur
X5egy
Xe1h4
Xeher4
Xei2
Xe5ic
Xei5d
Xeig2
Xei5gl
Xe3imb
Xe3inf
Xe1ing
Xe5inst
Xeir4d
Xeit3e
Xei3th
Xe5ity
Xe1j
Xe4jud
Xej5udi
Xeki4n
Xek4la
Xe1la
Xe4la.
Xe4lac
Xelan4d
Xel5ativ
Xe4law
Xelaxa4
Xe3lea
Xel5ebra
X5elec
Xe4led
Xel3ega
Xe5len
Xe4l1er
Xe1les
Xel2f
Xel2i
Xe3libe
Xe4l5ic.
Xel3ica
Xe3lier
Xel5igib
Xe5lim
Xe4l3ing
Xe3lio
Xe2lis
Xel5ish
Xe3liv3
X4ella
Xel4lab
Xello4
Xe5loc
Xel5og
Xel3op.
Xel2sh
Xel4ta
Xe5lud
Xel5ug
Xe4mac
Xe4mag
Xe5man
Xem5ana
Xem5b
Xe1me
Xe2mel
Xe4met
Xem3ica
Xemi4e
Xem5igra
Xem1in2
Xem5ine
Xem3i3ni
Xe4mis
Xem5ish
Xe5miss
Xem3iz
X5emniz
Xemo4g
Xemoni5o
Xem3pi
Xe4mul
Xem5ula
Xemu3n
Xe3my
Xen5amo
Xe4nant
Xench4er
Xen3dic
Xe5nea
Xe5nee
Xen3em
Xen5ero
Xen5esi
Xen5est
Xen3etr
Xe3new
Xen5ics
Xe5nie
Xe5nil
Xe3nio
Xen3ish
Xen3it
Xe5niu
X5eniz
X4enn
X4eno
Xeno4g
Xe4nos
Xen3ov
Xen4sw
Xent5age
X4enthes
Xen3ua
Xen5uf
Xe3ny.
X4en3z
Xe5of
Xeo2g
Xe4oi4
Xe3ol
Xeop3ar
Xe1or
Xeo3re
Xeo5rol
Xeos4
Xe4ot
Xeo4to
Xe5out
Xe5ow
Xe2pa
Xe3pai
Xep5anc
Xe5pel
Xe3pent
Xep5etitio
Xephe4
Xe4pli
Xe1po
Xe4prec
Xep5reca
Xe4pred
Xep3reh
Xe3pro
Xe4prob
Xep4sh
Xep5ti5b
Xe4put
Xep5uta
Xe1q
Xequi3l
Xe4q3ui3s
Xer1a
Xera4b
X4erand
Xer3ar
X4erati.
X2erb
Xer4bl
Xer3ch
Xer4che
X2ere.
Xe3real
Xere5co
Xere3in
Xer5el.
Xer3emo
Xer5ena
Xer5ence
X4erene
Xer3ent
Xere4q
Xer5ess
Xer3est
Xeret4
Xer1h
Xer1i
Xe1ria4
X5erick
Xe3rien
Xeri4er
Xer3ine
Xe1rio
X4erit
Xer4iu
Xeri4v
Xe4riva
Xer3m4
Xer4nis
X4ernit
X5erniz
Xer3no
X2ero
Xer5ob
Xe5roc
Xero4r
Xer1ou
Xer1s
Xer3set
Xert3er
X4ertl
Xer3tw
X4eru
Xeru4t
X5erwau
Xe1s4a
Xe4sage.
Xe4sages
Xes2c
Xe2sca
Xes5can
Xe3scr
Xes5cu
Xe1s2e
Xe2sec
Xes5ecr
Xes5enc
Xe4sert.
Xe4serts
Xe4serva
X4esh
Xe3sha
Xesh5en
Xe1si
Xe2sic
Xe2sid
Xes5iden
Xes5igna
Xe2s5im
Xes4i4n
Xesis4te
Xesi4u
Xe5skin
Xes4mi
Xe2sol
Xes3olu
Xe2son
Xes5ona
Xe1sp
Xes3per
Xes5pira
Xes4pre
X2ess
Xes4si4b
Xestan4
Xes3tig
Xes5tim
X4es2to
Xe3ston
X2estr
Xe5stro
Xestruc5
Xe2sur
Xes5urr
Xes4w
Xeta4b
Xeten4d
Xe3teo
Xethod3
Xet1ic
Xe5tide
Xetin4
Xeti4no
Xe5tir
Xe5titio
Xet5itiv
X4etn
Xet5ona
Xe3tra
Xe3tre
Xet3ric
Xet5rif
Xet3rog
Xet5ros
Xet3ua
Xet5ym
Xet5z
X4eu
Xe5un
Xe3up
Xeu3ro
Xeus4
Xeute4
Xeuti5l
Xeu5tr
Xeva2p5
Xe2vas
Xev5ast
Xe5vea
Xev3ell
Xevel3o
Xe5veng
Xeven4i
Xev1er
Xe5verb
Xe1vi
Xev3id
Xevi4l
Xe4vin
Xevi4v
Xe5voc
Xe5vu
Xe1wa
Xe4wag
Xe5wee
Xe3wh
Xewil5
Xew3ing
Xe3wit
X1exp
X5eyc
X5eye.
Xeys4
X1fa
Xfa3bl
Xfab3r
Xfa4ce
X4fag
Xfain4
Xfall5e
X4fa4ma
Xfam5is
X5far
Xfar5th
Xfa3ta
Xfa3the
X4fato
Xfault5
X4f5b
X4fd
X4fe.
Xfeas4
Xfeath3
Xfe4b
X4feca
X5fect
X2fed
Xfe3li
Xfe4mo
Xfen2d
Xfend5e
Xfer1
X5ferr
Xfev4
X4f1f
Xf4fes
Xf4fie
Xf5fin.
Xf2f5is
Xf4fly
Xf2fy
X4fh
X1fi
Xfi3a
X2f3ic.
X4f3ical
Xf3ican
X4ficate
Xf3icen
Xfi3cer
Xfic4i
X5ficia
X5ficie
X4fics
Xfi3cu
Xfi5del
Xfight5
Xfil5i
Xfill5in
X4fily
X2fin
X5fina
Xfin2d5
Xfi2ne
Xf1in3g
Xfin4n
Xfis4ti
Xf4l2
Xf5less
Xflin4
Xflo3re
Xf2ly5
X4fm
X4fn
X1fo
X5fon
Xfon4de
Xfon4t
Xfo2r
Xfo5rat
Xfor5ay
Xfore5t
Xfor4i
Xfort5a
Xfos5
X4f5p
Xfra4t
Xf5rea
Xfres5c
Xfri2
Xfril4
Xfrol5
X2f3s
X2ft
Xf4to
Xf2ty
X3fu
Xfu5el
X4fug
Xfu4min
Xfu5ne
Xfu3ri
Xfusi4
Xfus4s
X4futa
X1fy
X1ga
Xgaf4
X5gal.
X3gali
Xga3lo
X2gam
Xga5met
Xg5amo
Xgan5is
Xga3niz
Xgani5za
X4gano
Xgar5n4
Xgass4
Xgath3
X4gativ
X4gaz
Xg3b
Xgd4
X2ge.
X2ged
Xgeez4
Xgel4in
Xge5lis
Xge5liz
X4gely
X1gen
Xge4nat
Xge5niz
X4geno
X4geny
X1geo
Xge3om
Xg4ery
X5gesi
Xgeth5
X4geto
Xge4ty
Xge4v
X4g1g2
Xg2ge
Xg3ger
Xgglu5
Xggo4
Xgh3in
Xgh5out
Xgh4to
X5gi.
X1gi4a
Xgia5r
Xg1ic
X5gicia
Xg4ico
Xgien5
X5gies.
Xgil4
Xg3imen
X3g4in.
Xgin5ge
X5g4ins
X5gio
X3gir
Xgir4l
Xg3isl
Xgi4u
X5giv
X3giz
Xgl2
Xgla4
Xglad5i
X5glas
X1gle
Xgli4b
Xg3lig
X3glo
Xglo3r
Xg1m
Xg4my
Xgn4a
Xg4na.
Xgnet4t
Xg1ni
Xg2nin
Xg4nio
Xg1no
Xg4non
X1go
X3go.
Xgob5
X5goe
X3g4o4g
Xgo3is
Xgon2
X4g3o3na
Xgondo5
Xgo3ni
X5goo
Xgo5riz
Xgor5ou
X5gos.
Xgov1
Xg3p
X1gr
X4grada
Xg4rai
Xgran2
X5graph.
Xg5rapher
X5graphic
X4graphy
X4gray
Xgre4n
X4gress.
X4grit
Xg4ro
Xgruf4
Xgs2
Xg5ste
Xgth3
Xgu4a
X3guard
X2gue
X5gui5t
X3gun
X3gus
X4gu4t
Xg3w
X1gy
X2g5y3n
Xgy5ra
Xh3ab4l
Xhach4
Xhae4m
Xhae4t
Xh5agu
Xha3la
Xhala3m
Xha4m
Xhan4ci
Xhan4cy
X5hand.
Xhan4g
Xhang5er
Xhang5o
Xh5a5niz
Xhan4k
Xhan4te
Xhap3l
Xhap5t
Xha3ran
Xha5ras
Xhar2d
Xhard3e
Xhar4le
Xharp5en
Xhar5ter
Xhas5s
Xhaun4
X5haz
Xhaz3a
Xh1b
X1head
X3hear
Xhe4can
Xh5ecat
Xh4ed
Xhe5do5
Xhe3l4i
Xhel4lis
Xhel4ly
Xh5elo
Xhem4p
Xhe2n
Xhena4
Xhen5at
Xheo5r
Xhep5
Xh4era
Xhera3p
Xher4ba
Xhere5a
Xh3ern
Xh5erou
Xh3ery
Xh1es
Xhe2s5p
Xhe4t
Xhet4ed
Xheu4
Xh1f
Xh1h
Xhi5an
Xhi4co
Xhigh5
Xh4il2
Xhimer4
Xh4ina
Xhion4e
Xhi4p
Xhir4l
Xhi3ro
Xhir4p
Xhir4r
Xhis3el
Xhis4s
Xhith5er
Xhi2v
X4hk
X4h1l4
Xhlan4
Xh2lo
Xhlo3ri
X4h1m
Xhmet4
X2h1n
Xh5odiz
Xh5ods
Xho4g
Xhoge4
Xhol5ar
X3hol4e
Xho4ma
Xhome3
Xhon4a
Xho5ny
X3hood
Xhoon4
Xhor5at
Xho5ris
Xhort3e
Xho5ru
Xhos4e
Xho5sen
Xhos1p
X1hous
Xhouse3
Xhov5el
X4h5p
X4hr4
Xhree5
Xhro5niz
Xhro3po
X4h1s2
Xh4sh
Xh4tar
Xht1en
Xht5es
Xh4ty
Xhu4g
Xhu4min
Xhun5ke
Xhun4t
Xhus3t4
Xhu4t
Xh1w
Xh4wart
Xhy3pe
Xhy3ph
Xhy2s
X2i1a
Xi2al
Xiam4
Xiam5ete
Xi2an
X4ianc
Xian3i
X4ian4t
Xia5pe
Xiass4
Xi4ativ
Xia4tric
Xi4atu
Xibe4
Xib3era
Xib5ert
Xib5ia
Xib3in
Xib5it.
Xib5ite
Xi1bl
Xib3li
Xi5bo
Xi1br
Xi2b5ri
Xi5bun
X4icam
X5icap
X4icar
Xi4car.
Xi4cara
Xicas5
Xi4cay
Xiccu4
X4iceo
X4ich
X2ici
Xi5cid
Xic5ina
Xi2cip
Xic3ipa
Xi4cly
Xi2c5oc
X4i1cr
X5icra
Xi4cry
Xic4te
Xictu2
Xic4t3ua
Xic3ula
Xic4um
Xic5uo
Xi3cur
X2id
Xi4dai
Xid5anc
Xid5d
Xide3al
Xide4s
Xi2di
Xid5ian
Xidi4ar
Xi5die
Xid3io
Xidi5ou
Xid1it
Xid5iu
Xi3dle
Xi4dom
Xid3ow
Xi4dr
Xi2du
Xid5uo
X2ie4
Xied4e
X5ie5ga
Xield3
Xien5a4
Xien4e
Xi5enn
Xi3enti
Xi1er.
Xi3esc
Xi1est
Xi3et
X4if.
Xif5ero
Xiff5en
Xif4fr
X4ific.
Xi3fie
Xi3fl
X4ift
X2ig
Xiga5b
Xig3era
Xight3i
X4igi
Xi3gib
Xig3il
Xig3in
Xig3it
Xi4g4l
Xi2go
Xig3or
Xig5ot
Xi5gre
Xigu5i
Xig1ur
Xi3h
X4i5i4
Xi3j
X4ik
Xi1la
Xil3a4b
Xi4lade
Xi2l5am
Xila5ra
Xi3leg
Xil1er
Xilev4
Xil5f
Xil1i
Xil3ia
Xil2ib
Xil3io
Xil4ist
X2ilit
Xil2iz
Xill5ab
X4iln
Xil3oq
Xil4ty
Xil5ur
Xil3v
Xi4mag
Xim3age
Xima5ry
Ximenta5r
X4imet
Xim1i
Xim5ida
Ximi5le
Xi5mini
X4imit
Xim4ni
Xi3mon
Xi2mu
Xim3ula
X2in.
Xi4n3au
X4inav
Xincel4
Xin3cer
X4ind
Xin5dling
X2ine
Xi3nee
Xiner4ar
Xi5ness
X4inga
X4inge
Xin5gen
X4ingi
Xin5gling
X4ingo
X4ingu
X2ini
Xi5ni.
Xi4nia
Xin3io
Xin1is
Xi5nite.
X5initio
Xin3ity
X4ink
X4inl
X2inn
X2i1no
Xi4no4c
Xino4s
Xi4not
X2ins
Xin3se
Xinsur5a
X2int.
X2in4th
Xin1u
Xi5nus
X4iny
X2io
X4io.
Xioge4
Xio2gr
Xi1ol
Xio4m
Xion3at
Xion4ery
Xion3i
Xio5ph
Xior3i
Xi4os
Xio5th
Xi5oti
Xio4to
Xi4our
X2ip
Xipe4
Xiphras4
Xip3i
Xip4ic
Xip4re4
Xip3ul
Xi3qua
Xiq5uef
Xiq3uid
Xiq3ui3t
X4ir
Xi1ra
Xira4b
Xi4rac
Xird5e
Xire4de
Xi4ref
Xi4rel4
Xi4res
Xir5gi
Xir1i
Xiri5de
Xir4is
Xiri3tu
X5i5r2iz
Xir4min
Xiro4g
X5iron.
Xir5ul
X2is.
Xis5ag
Xis3ar
Xisas5
X2is1c
Xis3ch
X4ise
Xis3er
X3isf
Xis5han
Xis3hon
Xish5op
Xis3ib
Xisi4d
Xi5sis
Xis5itiv
X4is4k
Xislan4
X4isms
Xi2so
Xiso5mer
Xis1p
Xis2pi
Xis4py
X4is1s
Xis4sal
Xissen4
Xis4ses
Xis4ta.
Xis1te
Xis1ti
Xist4ly
X4istral
Xi2su
Xis5us
X4ita.
Xita4bi
Xi4tag
X4ita5m
Xi3tan
Xi3tat
X2ite
Xit3era
Xi5teri
Xit4es
X2ith
Xi1ti
X4itia
X4i2tic
Xit3ica
X5i5tick
Xit3ig
Xit5ill
Xi2tim
X2itio
X4itis
Xi4tism
Xi2t5o5m
X4iton
Xi4tram
Xit5ry
X4itt
Xit3uat
Xi5tud
Xit3ul
X4itz.
Xi1u
X2iv
Xiv3ell
Xiv3en.
Xi4v3er.
Xi4vers.
Xiv5il.
Xiv5io
Xiv1it
Xi5vore
Xiv3o3ro
Xi4v3ot
X4i5w
Xix4o
X4iy
X4izar
Xizi4
X5izont
X5ja
Xjac4q
Xja4p
X1je
Xjer5s
X4jestie
X4jesty
Xjew3
Xjo4p
X5judg
X3ka.
Xk3ab
Xk5ag
Xkais4
Xkal4
Xk1b
Xk2ed
X1kee
Xke4g
Xke5li
Xk3en4d
Xk1er
Xkes4
Xk3est.
Xke4ty
Xk3f
Xkh4
Xk1i
X5ki.
X5k2ic
Xk4ill
Xkilo5
Xk4im
Xk4in.
Xkin4de
Xk5iness
Xkin4g
Xki4p
Xkis4
Xk5ish
Xkk4
Xk1l
X4kley
X4kly
Xk1m
Xk5nes
X1k2no
Xko5r
Xkosh4
Xk3ou
Xkro5n
X4k1s2
Xk4sc
Xks4l
Xk4sy
Xk5t
Xk1w
Xlab3ic
Xl4abo
Xlaci4
Xl4ade
Xla3dy
Xlag4n
Xlam3o
X3land
Xlan4dl
Xlan5et
Xlan4te
Xlar4g
Xlar3i
Xlas4e
Xla5tan
X4lateli
X4lativ
X4lav
Xla4v4a
X2l1b
Xlbin4
X4l1c2
Xlce4
Xl3ci
X2ld
Xl2de
Xld4ere
Xld4eri
Xldi4
Xld5is
Xl3dr
Xl4dri
Xle2a
Xle4bi
Xleft5
X5leg.
X5legg
Xle4mat
Xlem5atic
X4len.
X3lenc
X5lene.
X1lent
Xle3ph
Xle4pr
Xlera5b
Xler4e
X3lerg
X3l4eri
Xl4ero
Xles2
Xle5sco
X5lesq
X3less
X5less.
Xl3eva
Xlev4er.
Xlev4era
Xlev4ers
X3ley
X4leye
X2lf
Xl5fr
X4l1g4
Xl5ga
Xlgar3
Xl4ges
Xlgo3
X2l3h
Xli4ag
Xli2am
Xliar5iz
Xli4as
Xli4ato
Xli5bi
X5licio
Xli4cor
X4lics
X4lict.
Xl4icu
Xl3icy
Xl3ida
Xlid5er
X3lidi
Xlif3er
Xl4iff
Xli4fl
X5ligate
X3ligh
Xli4gra
X3lik
X4l4i4l
Xlim4bl
Xlim3i
Xli4mo
Xl4im4p
Xl4ina
X1l4ine
Xlin3ea
Xlin3i
Xlink5er
Xli5og
X4l4iq
Xlis4p
Xl1it
Xl2it.
X5litica
Xl5i5tics
Xliv3er
Xl1iz
X4lj
Xlka3
Xl3kal
Xlka4t
Xl1l
Xl4law
Xl2le
Xl5lea
Xl3lec
Xl3leg
Xl3lel
Xl3le4n
Xl3le4t
Xll2i
Xl2lin4
Xl5lina
Xll4o
Xlloqui5
Xll5out
Xl5low
X2lm
Xl5met
Xlm3ing
Xl4mod
Xlmon4
X2l1n2
X3lo.
Xlob5al
Xlo4ci
X4lof
X3logic
Xl5ogo
X3logu
Xlom3er
X5long
Xlon4i
Xl3o3niz
Xlood5
X5lope.
Xlop3i
Xl3opm
Xlora4
Xlo4rato
Xlo5rie
Xlor5ou
X5los.
Xlos5et
X5losophiz
X5losophy
Xlos4t
Xlo4ta
Xloun5d
X2lout
X4lov
X2lp
Xlpa5b
Xl3pha
Xl5phi
Xlp5ing
Xl3pit
Xl4pl
Xl5pr
X4l1r
X2l1s2
Xl4sc
Xl2se
Xl4sie
X4lt
Xlt5ag
Xltane5
Xl1te
Xlten4
Xltera4
Xlth3i
Xl5ties.
Xltis4
Xl1tr
Xltu2
Xltur3a
Xlu5a
Xlu3br
Xluch4
Xlu3ci
Xlu3en
Xluf4
Xlu5id
Xlu4ma
X5lumi
Xl5umn.
X5lumnia
Xlu3o
Xluo3r
X4lup
Xluss4
Xlus3te
X1lut
Xl5ven
Xl5vet4
X2l1w
X1ly
X4lya
X4lyb
Xly5me
Xly3no
X2lys4
Xl5yse
X1ma
X2mab
Xma2ca
Xma5chine
Xma4cl
Xmag5in
X5magn
X2mah
Xmaid5
X4mald
Xma3lig
Xma5lin
Xmal4li
Xmal4ty
X5mania
Xman5is
Xman3iz
X4map
Xma5rine.
Xma5riz
Xmar4ly
Xmar3v
Xma5sce
Xmas4e
Xmas1t
X5mate
Xmath3
Xma3tis
X4matiza
X4m1b
Xmba4t5
Xm5bil
Xm4b3ing
Xmbi4v
X4m5c
X4me.
X2med
X4med.
X5media
Xme3die
Xm5e5dy
Xme2g
Xmel5on
Xmel4t
Xme2m
Xmem1o3
X1men
Xmen4a
Xmen5ac
Xmen4de
X4mene
Xmen4i
Xmens4
Xmensu5
X3ment
Xmen4te
Xme5on
Xm5ersa
X2mes
X3mesti
Xme4ta
Xmet3al
Xme1te
Xme5thi
Xm4etr
X5metric
Xme5trie
Xme3try
Xme4v
X4m1f
X2mh
X5mi.
Xmi3a
Xmid4a
Xmid4g
Xmig4
X3milia
Xm5i5lie
Xm4ill
Xmin4a
X3mind
Xm5inee
Xm4ingl
Xmin5gli
Xm5ingly
Xmin4t
Xm4inu
Xmiot4
Xm2is
Xmis4er.
Xmis5l
Xmis4ti
Xm5istry
X4mith
Xm2iz
X4mk
X4m1l
Xm1m
Xmma5ry
X4m1n
Xmn4a
Xm4nin
Xmn4o
X1mo
X4mocr
X5mocratiz
Xmo2d1
Xmo4go
Xmois2
Xmoi5se
X4mok
Xmo5lest
Xmo3me
Xmon5et
Xmon5ge
Xmoni3a
Xmon4ism
Xmon4ist
Xmo3niz
Xmonol4
Xmo3ny.
Xmo2r
X4mora.
Xmos2
Xmo5sey
Xmo3sp
Xmoth3
Xm5ouf
X3mous
Xmo2v
X4m1p
Xmpara5
Xmpa5rab
Xmpar5i
Xm3pet
Xmphas4
Xm2pi
Xmpi4a
Xmp5ies
Xm4p1in
Xm5pir
Xmp5is
Xmpo3ri
Xmpos5ite
Xm4pous
Xmpov5
Xmp4tr
Xm2py
X4m3r
X4m1s2
Xm4sh
Xm5si
X4mt
X1mu
Xmula5r4
X5mult
Xmulti3
X3mum
Xmun2
X4mup
Xmu4u
X4mw
X1na
X2n1a2b
Xn4abu
X4nac.
Xna4ca
Xn5act
Xnag5er.
Xnak4
Xna4li
Xna5lia
X4nalt
Xna5mit
Xn2an
Xnanci4
Xnan4it
Xnank4
Xnar3c
X4nare
Xnar3i
Xnar4l
Xn5arm
Xn4as
Xnas4c
Xnas5ti
Xn2at
Xna3tal
Xnato5miz
Xn2au
Xnau3se
X3naut
Xnav4e
X4n1b4
Xncar5
Xn4ces.
Xn3cha
Xn5cheo
Xn5chil
Xn3chis
Xnc1in
Xnc4it
Xncour5a
Xn1cr
Xn1cu
Xn4dai
Xn5dan
Xn1de
Xnd5est.
Xndi4b
Xn5d2if
Xn1dit
Xn3diz
Xn5duc
Xndu4r
Xnd2we
X2ne.
Xn3ear
Xne2b
Xneb3u
Xne2c
X5neck
X2ned
Xne4gat
Xneg5ativ
X5nege
Xne4la
Xnel5iz
Xne5mi
Xne4mo
X1nen
X4nene
X3neo
Xne4po
Xne2q
Xn1er
Xnera5b
Xn4erar
Xn2ere
Xn4er5i
Xner4r
X1nes
X2nes.
X4nesp
X2nest
X4nesw
X3netic
Xne4v
Xn5eve
Xne4w
Xn3f
Xn4gab
Xn3gel
Xnge4n4e
Xn5gere
Xn3geri
Xng5ha
Xn3gib
Xng1in
Xn5git
Xn4gla
Xngov4
Xng5sh
Xn1gu
Xn4gum
Xn2gy
X4n1h4
Xnha4
Xnhab3
Xnhe4
X3n4ia
Xni3an
Xni4ap
Xni3ba
Xni4bl
Xni4d
Xni5di
Xni4er
Xni2fi
Xni5ficat
Xn5igr
Xnik4
Xn1im
Xni3miz
Xn1in
X5nine.
Xnin4g
Xni4o
X5nis.
Xnis4ta
Xn2it
Xn4ith
X3nitio
Xn3itor
Xni3tr
Xn1j
X4nk2
Xn5kero
Xn3ket
Xnk3in
Xn1kl
X4n1l
Xn5m
Xnme4
Xnmet4
X4n1n2
Xnne4
Xnni3al
Xnni4v
Xnob4l
Xno3ble
Xn5ocl
X4n3o2d
X3noe
X4nog
Xnoge4
Xnois5i
Xno5l4i
X5nologis
X3nomic
Xn5o5miz
Xno4mo
Xno3my
Xno4n
Xnon4ag
Xnon5i
Xn5oniz
X4nop
X5nop5o5li
Xnor5ab
Xno4rary
X4nosc
Xnos4e
Xnos5t
Xno5ta
X1nou
X3noun
Xnov3el3
Xnowl3
Xn1p4
Xnpi4
Xnpre4c
Xn1q
Xn1r
Xnru4
X2n1s2
Xns5ab
Xnsati4
Xns4c
Xn2se
Xn4s3es
Xnsid1
Xnsig4
Xn2sl
Xns3m
Xn4soc
Xns4pe
Xn5spi
Xnsta5bl
Xn1t
Xnta4b
Xnter3s
Xnt2i
Xn5tib
Xnti4er
Xnti2f
Xn3tine
Xn4t3ing
Xnti4p
Xntrol5li
Xnt4s
Xntu3me
Xnu1a
Xnu4d
Xnu5en
Xnuf4fe
Xn3uin
X3nu3it
Xn4um
Xnu1me
Xn5umi
X3nu4n
Xn3uo
Xnu3tr
Xn1v2
Xn1w4
Xnym4
Xnyp4
X4nz
Xn3za
X4oa
Xoad3
Xo5a5les
Xoard3
Xoas4e
Xoast5e
Xoat5i
Xob3a3b
Xo5bar
Xobe4l
Xo1bi
Xo2bin
Xob5ing
Xo3br
Xob3ul
Xo1ce
Xoch4
Xo3chet
Xocif3
Xo4cil
Xo4clam
Xo4cod
Xoc3rac
Xoc5ratiz
Xocre3
X5ocrit
Xoctor5a
Xoc3ula
Xo5cure
Xod5ded
Xod3ic
Xodi3o
Xo2do4
Xodor3
Xod5uct.
Xod5ucts
Xo4el
Xo5eng
Xo3er
Xoe4ta
Xo3ev
Xo2fi
Xof5ite
Xofit4t
Xo2g5a5r
Xog5ativ
Xo4gato
Xo1ge
Xo5gene
Xo5geo
Xo4ger
Xo3gie
X1o1gis
Xog3it
Xo4gl
Xo5g2ly
X3ogniz
Xo4gro
Xogu5i
X1ogy
X2ogyn
Xo1h2
Xohab5
Xoi2
Xoic3es
Xoi3der
Xoiff4
Xoig4
Xoi5let
Xo3ing
Xoint5er
Xo5ism
Xoi5son
Xoist5en
Xoi3ter
Xo5j
X2ok
Xo3ken
Xok5ie
Xo1la
Xo4lan
Xolass4
Xol2d
Xold1e
Xol3er
Xo3lesc
Xo3let
Xol4fi
Xol2i
Xo3lia
Xo3lice
Xol5id.
Xo3li4f
Xo5lil
Xol3ing
Xo5lio
Xo5lis.
Xol3ish
Xo5lite
Xo5litio
Xo5liv
Xolli4e
Xol5ogiz
Xolo4r
Xol5pl
Xol2t
Xol3ub
Xol3ume
Xol3un
Xo5lus
Xol2v
Xo2ly
Xom5ah
Xoma5l
Xom5atiz
Xom2be
Xom4bl
Xo2me
Xom3ena
Xom5erse
Xo4met
Xom5etry
Xo3mia
Xom3ic.
Xom3ica
Xo5mid
Xom1in
Xo5mini
X5ommend
Xomo4ge
Xo4mon
Xom3pi
Xompro5
Xo2n
Xon1a
Xon4ac
Xo3nan
Xon1c
X3oncil
X2ond
Xon5do
Xo3nen
Xon5est
Xon4gu
Xon1ic
Xo3nio
Xon1is
Xo5niu
Xon3key
Xon4odi
Xon3omy
Xon3s
Xonspi4
Xonspir5a
Xonsu4
Xonten4
Xon3t4i
Xontif5
Xon5um
Xonva5
Xoo2
Xood5e
Xood5i
Xoo4k
Xoop3i
Xo3ord
Xoost5
Xo2pa
Xope5d
Xop1er
X3opera
X4operag
X2oph
Xo5phan
Xo5pher
Xop3ing
Xo3pit
Xo5pon
Xo4posi
Xo1pr
Xop1u
Xopy5
Xo1q
Xo1ra
Xo5ra.
Xo4r3ag
Xor5aliz
Xor5ange
Xore5a
Xo5real
Xor3ei
Xore5sh
Xor5est.
Xorew4
Xor4gu
X4o5ria
Xor3ica
Xo5ril
Xor1in
Xo1rio
Xor3ity
Xo3riu
Xor2mi
Xorn2e
Xo5rof
Xor3oug
Xor5pe
X3orrh
Xor4se
Xors5en
Xorst4
Xor3thi
Xor3thy
Xor4ty
Xo5rum
Xo1ry
Xos3al
Xos2c
Xos4ce
Xo3scop
X4oscopi
Xo5scr
Xos4i4e
Xos5itiv
Xos3ito
Xos3ity
Xosi4u
Xos4l
Xo2so
Xos4pa
Xos4po
Xos2ta
Xo5stati
Xos5til
Xos5tit
Xo4tan
Xotele4g
Xot3er.
Xot5ers
Xo4tes
X4oth
Xoth5esi
Xoth3i4
Xot3ic.
Xot5ica
Xo3tice
Xo3tif
Xo3tis
Xoto5s
Xou2
Xou3bl
Xouch5i
Xou5et
Xou4l
Xounc5er
Xoun2d
Xou5v
Xov4en
Xover4ne
Xover3s
Xov4ert
Xo3vis
Xoviti4
Xo5v4ol
Xow3der
Xow3el
Xow5est
Xow1i
Xown5i
Xo4wo
Xoy1a
X1pa
Xpa4ca
Xpa4ce
Xpac4t
Xp4ad
X5pagan
Xp3agat
Xp4ai
Xpain4
Xp4al
Xpan4a
Xpan3el
Xpan4ty
Xpa3ny
Xpa1p
Xpa4pu
Xpara5bl
Xpar5age
Xpar5di
X3pare
Xpar5el
Xp4a4ri
Xpar4is
Xpa2te
Xpa5ter
X5pathic
Xpa5thy
Xpa4tric
Xpav4
X3pay
X4p1b
Xpd4
X4pe.
X3pe4a
Xpear4l
Xpe2c
X2p2ed
X3pede
X3pedi
Xpedia4
Xped4ic
Xp4ee
Xpee4d
Xpek4
Xpe4la
Xpeli4e
Xpe4nan
Xp4enc
Xpen4th
Xpe5on
Xp4era.
Xpera5bl
Xp4erag
Xp4eri
Xperi5st
Xper4mal
Xperme5
Xp4ern
Xper3o
Xper3ti
Xpe5ru
Xper1v
Xpe2t
Xpe5ten
Xpe5tiz
X4pf
X4pg
X4ph.
Xphar5i
Xphe3no
Xph4er
Xph4es.
Xph1ic
X5phie
Xph5ing
X5phisti
X3phiz
Xph2l
X3phob
X3phone
X5phoni
Xpho4r
X4phs
Xph3t
X5phu
X1phy
Xpi3a
Xpian4
Xpi4cie
Xpi4cy
Xp4id
Xp5ida
Xpi3de
X5pidi
X3piec
Xpi3en
Xpi4grap
Xpi3lo
Xpi2n
Xp4in.
Xpind4
Xp4ino
X3pi1o
Xpion4
Xp3ith
Xpi5tha
Xpi2tu
X2p3k2
X1p2l2
X3plan
Xplas5t
Xpli3a
Xpli5er
X4plig
Xpli4n
Xploi4
Xplu4m
Xplum4b
X4p1m
X2p3n
Xpo4c
X5pod.
Xpo5em
Xpo3et5
X5po4g
Xpoin2
X5point
Xpoly5t
Xpo4ni
Xpo4p
X1p4or
Xpo4ry
X1pos
Xpos1s
Xp4ot
Xpo4ta
X5poun
X4p1p
Xppa5ra
Xp2pe
Xp4ped
Xp5pel
Xp3pen
Xp3per
Xp3pet
Xppo5site
Xpr2
Xpray4e
X5preci
Xpre5co
Xpre3em
Xpref5ac
Xpre4la
Xpre3r
Xp3rese
X3press
Xpre5ten
Xpre3v
X5pri4e
Xprin4t3
Xpri4s
Xpris3o
Xp3roca
Xprof5it
Xpro3l
Xpros3e
Xpro1t
X2p1s2
Xp2se
Xps4h
Xp4sib
X2p1t
Xpt5a4b
Xp2te
Xp2th
Xpti3m
Xptu4r
Xp4tw
Xpub3
Xpue4
Xpuf4
Xpul3c
Xpu4m
Xpu2n
Xpur4r
X5pus
Xpu2t
X5pute
Xput3er
Xpu3tr
Xput4ted
Xput4tin
Xp3w
Xqu2
Xqua5v
X2que.
X3quer
X3quet
X2rab
Xra3bi
Xrach4e
Xr5acl
Xraf5fi
Xraf4t
Xr2ai
Xra4lo
Xram3et
Xr2ami
Xrane5o
Xran4ge
Xr4ani
Xra5no
Xrap3er
X3raphy
Xrar5c
Xrare4
Xrar5ef
X4raril
Xr2as
Xration4
Xrau4t
Xra5vai
Xrav3el
Xra5zie
Xr1b
Xr4bab
Xr4bag
Xrbi2
Xrbi4f
Xr2bin
Xr5bine
Xrb5ing.
Xrb4o
Xr1c
Xr2ce
Xrcen4
Xr3cha
Xrch4er
Xr4ci4b
Xrc4it
Xrcum3
Xr4dal
Xrd2i
Xrdi4a
Xrdi4er
Xrdin4
Xrd3ing
X2re.
Xre1al
Xre3an
Xre5arr
X5reav
Xre4aw
Xr5ebrat
Xrec5oll
Xrec5ompe
Xre4cre
X2r2ed
Xre1de
Xre3dis
Xred5it
Xre4fac
Xre2fe
Xre5fer.
Xre3fi
Xre4fy
Xreg3is
Xre5it
Xre1li
Xre5lu
Xr4en4ta
Xren4te
Xre1o
Xre5pin
Xre4posi
Xre1pu
Xr1er4
Xr4eri
Xrero4
Xre5ru
Xr4es.
Xre4spi
Xress5ib
Xres2t
Xre5stal
Xre3str
Xre4ter
Xre4ti4z
Xre3tri
Xreu2
Xre5uti
Xrev2
Xre4val
Xrev3el
Xr5ev5er.
Xre5vers
Xre5vert
Xre5vil
Xrev5olu
Xre4wh
Xr1f
Xrfu4
Xr4fy
Xrg2
Xrg3er
Xr3get
Xr3gic
Xrgi4n
Xrg3ing
Xr5gis
Xr5git
Xr1gl
Xrgo4n
Xr3gu
Xrh4
X4rh.
X4rhal
Xri3a
Xria4b
Xri4ag
Xr4ib
Xrib3a
Xric5as
Xr4ice
X4rici
X5ricid
Xri4cie
Xr4ico
Xrid5er
Xri3enc
Xri3ent
Xri1er
Xri5et
Xrig5an
X5rigi
Xril3iz
X5riman
Xrim5i
X3rimo
Xrim4pe
Xr2ina
X5rina.
Xrin4d
Xrin4e
Xrin4g
Xri1o
X5riph
Xriph5e
Xri2pl
Xrip5lic
Xr4iq
Xr2is
Xr4is.
Xris4c
Xr3ish
Xris4p
Xri3ta3b
Xr5ited.
Xrit5er.
Xrit5ers
Xrit3ic
Xri2tu
Xrit5ur
Xriv5el
Xriv3et
Xriv3i
Xr3j
Xr3ket
Xrk4le
Xrk4lin
Xr1l
Xrle4
Xr2led
Xr4lig
Xr4lis
Xrl5ish
Xr3lo4
Xr1m
Xrma5c
Xr2me
Xr3men
Xrm5ers
Xrm3ing
Xr4ming.
Xr4mio
Xr3mit
Xr4my
Xr4nar
Xr3nel
Xr4ner
Xr5net
Xr3ney
Xr5nic
Xr1nis4
Xr3nit
Xr3niv
Xrno4
Xr4nou
Xr3nu
Xrob3l
Xr2oc
Xro3cr
Xro4e
Xro1fe
Xro5fil
Xrok2
Xro5ker
X5role.
Xrom5ete
Xrom4i
Xrom4p
Xron4al
Xron4e
Xro5n4is
Xron4ta
X1room
X5root
Xro3pel
Xrop3ic
Xror3i
Xro5ro
Xros5per
Xros4s
Xro4the
Xro4ty
Xro4va
Xrov5el
Xrox5
Xr1p
Xr4pea
Xr5pent
Xrp5er.
Xr3pet
Xrp4h4
Xrp3ing
Xr3po
Xr1r4
Xrre4c
Xrre4f
Xr4reo
Xrre4st
Xrri4o
Xrri4v
Xrron4
Xrros4
Xrrys4
X4rs2
Xr1sa
Xrsa5ti
Xrs4c
Xr2se
Xr3sec
Xrse4cr
Xrs5er.
Xrs3es
Xrse5v2
Xr1sh
Xr5sha
Xr1si
Xr4si4b
Xrson3
Xr1sp
Xr5sw
Xrtach4
Xr4tag
Xr3teb
Xrten4d
Xrte5o
Xr1ti
Xrt5ib
Xrti4d
Xr4tier
Xr3tig
Xrtil3i
Xrtil4l
Xr4tily
Xr4tist
Xr4tiv
Xr3tri
Xrtroph4
Xrt4sh
Xru3a
Xru3e4l
Xru3en
Xru4gl
Xru3in
Xrum3pl
Xru2n
Xrunk5
Xrun4ty
Xr5usc
Xruti5n
Xrv4e
Xrvel4i
Xr3ven
Xrv5er.
Xr5vest
Xr3vey
Xr3vic
Xrvi4v
Xr3vo
Xr1w
Xry4c
X5rynge
Xry3t
Xsa2
X2s1ab
X5sack
Xsac3ri
Xs3act
X5sai
Xsalar4
Xsal4m
Xsa5lo
Xsal4t
X3sanc
Xsan4de
Xs1ap
Xsa5ta
X5sa3tio
Xsat3u
Xsau4
Xsa5vor
X5saw
X4s5b
Xscan4t5
Xsca4p
Xscav5
Xs4ced
X4scei
Xs4ces
Xsch2
Xs4cho
X3s4cie
X5scin4d
Xscle5
Xs4cli
Xscof4
X4scopy
Xscour5a
Xs1cu
X4s5d
X4se.
Xse4a
Xseas4
Xsea5w
Xse2c3o
X3sect
X4s4ed
Xse4d4e
Xs5edl
Xse2g
Xseg3r
X5sei
Xse1le
X5self
X5selv
X4seme
Xse4mol
Xsen5at
X4senc
Xsen4d
Xs5ened
Xsen5g
Xs5enin
X4sentd
X4sentl
Xsep3a3
X4s1er.
Xs4erl
Xser4o
X4servo
Xs1e4s
Xse5sh
Xses5t
X5se5um
X5sev
Xsev3en
Xsew4i
X5sex
X4s3f
X2s3g
Xs2h
X2sh.
Xsh1er
X5shev
Xsh1in
Xsh3io
X3ship
Xshiv5
Xsho4
Xsh5old
Xshon3
Xshor4
Xshort5
X4shw
Xsi1b
Xs5icc
X3side.
X5sides
X5sidi
Xsi5diz
X4signa
Xsil4e
X4sily
X2s1in
Xs2ina
X5sine.
Xs3ing
X1sio
X5sion
Xsion5a
Xsi2r
Xsir5a
X1sis
X3sitio
X5siu
X1siv
X5siz
Xsk2
X4ske
Xs3ket
Xsk5ine
Xsk5ing
Xs1l2
Xs3lat
Xs2le
Xslith5
X2s1m
Xs3ma
Xsmall3
Xsman3
Xsmel4
Xs5men
X5smith
Xsmol5d4
Xs1n4
X1so
Xso4ce
Xsoft3
Xso4lab
Xsol3d2
Xso3lic
X5solv
X3som
X3s4on.
Xsona4
Xson4g
Xs4op
X5sophic
Xs5ophiz
Xs5ophy
Xsor5c
Xsor5d
X4sov
Xso5vi
X2spa
X5spai
Xspa4n
Xspen4d
X2s5peo
X2sper
Xs2phe
X3spher
Xspho5
Xspil4
Xsp5ing
X4spio
Xs4ply
Xs4pon
Xspor4
X4spot
Xsqual4l
Xs1r
X2ss
Xs1sa
Xssas3
Xs2s5c
Xs3sel
Xs5seng
Xs4ses.
Xs5set
Xs1si
Xs4sie
Xssi4er
Xss5ily
Xs4sl
Xss4li
Xs4sn
Xsspend4
Xss2t
Xssur5a
Xss5w
X2st.
Xs2tag
Xs2tal
Xstam4i
X5stand
Xs4ta4p
X5stat.
Xs4ted
Xstern5i
Xs5tero
Xste2w
Xstew5a
Xs3the
Xst2i
Xs4ti.
Xs5tia
Xs1tic
X5stick
Xs4tie
Xs3tif
Xst3ing
X5stir
Xs1tle
X5stock
Xstom3a
X5stone
Xs4top
X3store
Xst4r
Xs4trad
X5stratu
Xs4tray
Xs4trid
X4stry
X4st3w
Xs2ty
X1su
Xsu1al
Xsu4b3
Xsu2g3
Xsu5is
Xsuit3
Xs4ul
Xsu2m
Xsum3i
Xsu2n
Xsu2r
X4sv
Xsw2
X4swo
Xs4y
X4syc
X3syl
Xsyn5o
Xsy5rin
X1ta
X3ta.
X2tab
Xta5bles
X5taboliz
X4taci
Xta5do
X4taf4
Xtai5lo
Xta2l
Xta5la
Xtal5en
Xtal3i
X4talk
Xtal4lis
Xta5log
Xta5mo
Xtan4de
Xtanta3
Xta5per
Xta5pl
Xtar4a
X4tarc
X4tare
Xta3riz
Xtas4e
Xta5sy
X4tatic
Xta4tur
Xtaun4
Xtav4
X2taw
Xtax4is
X2t1b
X4tc
Xt4ch
Xtch5et
X4t1d
X4te.
Xtead4i
X4teat
Xtece4
X5tect
X2t1ed
Xte5di
X1tee
Xteg4
Xte5ger
Xte5gi
X3tel.
Xteli4
X5tels
Xte2ma2
Xtem3at
X3tenan
X3tenc
X3tend
X4tenes
X1tent
Xten4tag
X1teo
Xte4p
Xte5pe
Xter3c
X5ter3d
X1teri
Xter5ies
Xter3is
Xteri5za
X5ternit
Xter5v
X4tes.
X4tess
Xt3ess.
Xteth5e
X3teu
X3tex
X4tey
X2t1f
X4t1g
X2th.
Xthan4
Xth2e
X4thea
Xth3eas
Xthe5at
Xthe3is
X3thet
Xth5ic.
Xth5ica
X4thil
X5think
X4thl
Xth5ode
X5thodic
X4thoo
Xthor5it
Xtho5riz
X2ths
X1tia
Xti4ab
Xti4ato
X2ti2b
X4tick
Xt4ico
Xt4ic1u
X5tidi
X3tien
Xtif2
Xti5fy
X2tig
X5tigu
Xtill5in
X1tim
X4timp
Xtim5ul
X2t1in
Xt2ina
X3tine.
X3tini
X1tio
Xti5oc
Xtion5ee
X5tiq
Xti3sa
X3tise
Xtis4m
Xti5so
Xtis4p
X5tistica
Xti3tl
Xti4u
X1tiv
Xtiv4a
X1tiz
Xti3za
Xti3zen
X2tl
Xt5la
Xtlan4
X3tle.
X3tled
X3tles.
Xt5let.
Xt5lo
X4t1m
Xtme4
X2t1n2
X1to
Xto3b
Xto5crat
X4todo
X2tof
Xto2gr
Xto5ic
Xto2ma
Xtom4b
Xto3my
Xton4ali
Xto3nat
X4tono
X4tony
Xto2ra
Xto3rie
Xtor5iz
Xtos2
X5tour
X4tout
Xto3war
X4t1p
X1tra
Xtra3b
Xtra5ch
Xtraci4
Xtrac4it
Xtrac4te
Xtras4
Xtra5ven
Xtrav5es5
Xtre5f
Xtre4m
Xtrem5i
X5tria
Xtri5ces
X5tricia
X4trics
X2trim
Xtri4v
Xtro5mi
Xtron5i
X4trony
Xtro5phe
Xtro3sp
Xtro3v
Xtru5i
Xtrus4
X4t1s2
Xt4sc
Xtsh4
Xt4sw
X4t3t2
Xt4tes
Xt5to
Xttu4
X1tu
Xtu1a
Xtu3ar
Xtu4bi
Xtud2
X4tue
X4tuf4
X5tu3i
X3tum
Xtu4nis
X2t3up.
X3ture
X5turi
Xtur3is
Xtur5o
Xtu5ry
X3tus
X4tv
Xtw4
X4t1wa
Xtwis4
X4two
X1ty
X4tya
X2tyl
Xtype3
Xty5ph
X4tz
Xtz4e
X4uab
Xuac4
Xua5na
Xuan4i
Xuar5ant
Xuar2d
Xuar3i
Xuar3t
Xu1at
Xuav4
Xub4e
Xu4bel
Xu3ber
Xu4bero
Xu1b4i
Xu4b5ing
Xu3ble.
Xu3ca
Xuci4b
Xuc4it
Xucle3
Xu3cr
Xu3cu
Xu4cy
Xud5d
Xud3er
Xud5est
Xudev4
Xu1dic
Xud3ied
Xud3ies
Xud5is
Xu5dit
Xu4don
Xud4si
Xu4du
Xu4ene
Xuens4
Xuen4te
Xuer4il
X3ufa
Xu3fl
Xugh3en
Xug5in
X2ui2
Xuil5iz
Xui4n
Xu1ing
Xuir4m
Xuita4
Xuiv3
Xuiv4er.
Xu5j
X4uk
Xu1la
Xula5b
Xu5lati
Xulch4
X5ulche
Xul3der
Xul4e
Xu1len
Xul4gi
Xul2i
Xu5lia
Xul3ing
Xul5ish
Xul4lar
Xul4li4b
Xul4lis
X4ul3m
Xu1l4o
X4uls
Xuls5es
Xul1ti
Xultra3
X4ultu
Xu3lu
Xul5ul
Xul5v
Xum5ab
Xum4bi
Xum4bly
Xu1mi
Xu4m3ing
Xumor5o
Xum2p
Xunat4
Xu2ne
Xun4er
Xu1ni
Xun4im
Xu2nin
Xun5ish
Xuni3v
Xun3s4
Xun4sw
Xunt3ab
Xun4ter.
Xun4tes
Xunu4
Xun5y
Xun5z
Xu4ors
Xu5os
Xu1ou
Xu1pe
Xuper5s
Xu5pia
Xup3ing
Xu3pl
Xup3p
Xupport5
Xupt5ib
Xuptu4
Xu1ra
X4ura.
Xu4rag
Xu4ras
Xur4be
Xurc4
Xur1d
Xure5at
Xur4fer
Xur4fr
Xu3rif
Xuri4fic
Xur1in
Xu3rio
Xu1rit
Xur3iz
Xur2l
Xurl5ing.
Xur4no
Xuros4
Xur4pe
Xur4pi
Xurs5er
Xur5tes
Xur3the
Xurti4
Xur4tie
Xu3ru
X2us
Xu5sad
Xu5san
Xus4ap
Xusc2
Xus3ci
Xuse5a
Xu5sia
Xu3sic
Xus4lin
Xus1p
Xus5sl
Xus5tere
Xus1tr
Xu2su
Xusur4
Xuta4b
Xu3tat
X4ute.
X4utel
X4uten
Xuten4i
X4u1t2i
Xuti5liz
Xu3tine
Xut3ing
Xution5a
Xu4tis
X5u5tiz
Xu4t1l
Xut5of
Xuto5g
Xuto5matic
Xu5ton
Xu4tou
Xuts4
Xu3u
Xuu4m
Xu1v2
Xuxu3
Xuz4e
X1va
X5va.
X2v1a4b
Xvac5il
Xvac3u
Xvag4
Xva4ge
Xva5lie
Xval5o
Xval1u
Xva5mo
Xva5niz
Xva5pi
Xvar5ied
X3vat
X4ve.
X4ved
Xveg3
Xv3el.
Xvel3li
Xve4lo
Xv4ely
Xven3om
Xv5enue
Xv4erd
X5vere.
Xv4erel
Xv3eren
Xver5enc
Xv4eres
Xver3ie
Xvermi4n
X3verse
Xver3th
Xv4e2s
X4ves.
Xves4te
Xve4te
Xvet3er
Xve4ty
Xvi5ali
X5vian
X5vide.
X5vided
X4v3iden
X5vides
X5vidi
Xv3if
Xvi5gn
Xvik4
X2vil
X5vilit
Xv3i3liz
Xv1in
X4vi4na
Xv2inc
Xvin5d
X4ving
Xvio3l
Xv3io4r
Xvi1ou
Xvi4p
Xvi5ro
Xvis3it
Xvi3so
Xvi3su
X4viti
Xvit3r
X4vity
X3viv
X5vo.
Xvoi4
X3vok
Xvo4la
Xv5ole
X5volt
X3volv
Xvom5i
Xvor5ab
Xvori4
Xvo4ry
Xvo4ta
X4votee
X4vv4
Xv4y
Xw5abl
X2wac
Xwa5ger
Xwag5o
Xwait5
Xw5al.
Xwam4
Xwar4t
Xwas4t
Xwa1te
Xwa5ver
Xw1b
Xwea5rie
Xweath3
Xwed4n
Xweet3
Xwee5v
Xwel4l
Xw1er
Xwest3
Xw3ev
Xwhi4
Xwi2
Xwil2
Xwill5in
Xwin4de
Xwin4g
Xwir4
X3wise
Xwith3
Xwiz5
Xw4k
Xwl4es
Xwl3in
Xw4no
X1wo2
Xwom1
Xwo5ven
Xw5p
Xwra4
Xwri4
Xwrita4
Xw3sh
Xws4l
Xws4pe
Xw5s4t
X4wt
Xwy4
Xx1a
Xxac5e
Xx4ago
Xxam3
Xx4ap
Xxas5
Xx3c2
Xx1e
Xxe4cuto
Xx2ed
Xxer4i
Xxe5ro
Xx1h
Xxhi2
Xxhil5
Xxhu4
Xx3i
Xxi5a
Xxi5c
Xxi5di
Xx4ime
Xxi5miz
Xx3o
Xx4ob
Xx3p
Xxpan4d
Xxpecto5
Xxpe3d
Xx1t2
Xx3ti
Xx1u
Xxu3a
Xxx4
Xy5ac
X3yar4
Xy5at
Xy1b
Xy1c
Xy2ce
Xyc5er
Xy3ch
Xych4e
Xycom4
Xycot4
Xy1d
Xy5ee
Xy1er
Xy4erf
Xyes4
Xye4t
Xy5gi
X4y3h
Xy1i
Xy3la
Xylla5bl
Xy3lo
Xy5lu
Xymbol5
Xyme4
Xympa3
Xyn3chr
Xyn5d
Xyn5g
Xyn5ic
X5ynx
Xy1o4
Xyo5d
Xy4o5g
Xyom4
Xyo5net
Xy4ons
Xy4os
Xy4ped
Xyper5
Xyp3i
Xy3po
Xy4poc
Xyp2ta
Xy5pu
Xyra5m
Xyr5ia
Xy3ro
Xyr4r
Xys4c
Xy3s2e
Xys3ica
Xys3io
X3ysis
Xy4so
Xyss4
Xys1t
Xys3ta
Xysur4
Xy3thin
Xyt3ic
Xy1w
Xza1
Xz5a2b
Xzar2
X4zb
X2ze
Xze4n
Xze4p
Xz1er
Xze3ro
Xzet4
X2z1i
Xz4il
Xz4is
X5zl
X4zm
X1zo
Xzo4m
Xzo5ol
Xzte4
X4z1z2
Xz4zy
END_OF_FILE
if test 27421 -ne `wc -c <'lout/include/lout.hyph'`; then
echo shar: \"'lout/include/lout.hyph'\" unpacked with wrong size!
fi
# end of 'lout/include/lout.hyph'
fi
if test -f 'lout/z06.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/z06.c'\"
else
echo shar: Extracting \"'lout/z06.c'\" \(27162 characters\)
sed "s/^X//" >'lout/z06.c' <<'END_OF_FILE'
X/*@z06.c:Parser:InitParser(), Parse()@****************************************/


X/* */
X/* LOUT: A HIGH-LEVEL LANGUAGE FOR DOCUMENT FORMATTING (VERSION 2.03) */
X/* COPYRIGHT (C) 1993 Jeffrey H. Kingston */
X/* */
X/* Jeffrey H. Kingston (je...@cs.su.oz.au) */
X/* Basser Department of Computer Science */
X/* The University of Sydney 2006 */
X/* AUSTRALIA */
X/* */
X/* This program is free software; you can redistribute it and/or modify */
X/* it under the terms of the GNU General Public License as published by */
X/* the Free Software Foundation; either version 1, or (at your option) */
X/* any later version. */
X/* */
X/* This program is distributed in the hope that it will be useful, */
X/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
X/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
X/* GNU General Public License for more details. */
X/* */
X/* You should have received a copy of the GNU General Public License */
X/* along with this program; if not, write to the Free Software */
X/* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
X/* */

X/* FILE: z06.c */
X/* MODULE: Parser */
X/* EXTERNS: InitParser(), Parse() */


X/* */
X/*****************************************************************************/
X#include "externs"

X#define is_cat_op(x) ((x) >= ACAT && (x) <= TJUXTA)
X#define LEFT_ASSOC 0
X#define RIGHT_ASSOC 1
Xstatic OBJECT cross_name; /* name of the cr database */


X
X
X/*****************************************************************************/
X/* */

X/* static Stack Handler ADT: */
X/* */
X/* DebugStacks() Print debug output of the stacks state */
X/* Shift() Shift one token onto the stacks */
X/* ShiftObj() Optimized shift for object with no parameters */
X/* Reduce() Perform one reduction of the stacks */
X/* */
X/*****************************************************************************/
X
X#define MAX_STACK 50 /* size of parser stacks */
Xstatic OBJECT obj_stack[MAX_STACK]; /* stack of objects */
Xstatic int otop = -1; /* top of obj_stack */
Xstatic OBJECT tok_stack[MAX_STACK]; /* stack of tokens */
Xstatic int ttop = -1; /* top of tok_stack */
Xstatic BOOLEAN obj_prev; /* TRUE when object is prev */


X
X
X/*****************************************************************************/
X/* */

X/* PushObj(x) */
X/* PushToken(t) */
X/* OBJECT PopObj() */
X/* OBJECT PopToken() */
X/* OBJECT TokenTop */
X/* OBJECT ObjTop */
X/* */
X/* Push and pop from the object and token stacks; examine top item. */
X/* */
X/*****************************************************************************/
X
X#define PushObj(x) \
X{ zz_hold = x; \
X if( ++otop < MAX_STACK ) obj_stack[otop] = zz_hold; \
X else Error(FATAL, &fpos(obj_stack[otop-1]), \
X "object stack overflow: need to simplify expression"); \
X}
X
X#define PushToken(t) \
X{ if( ++ttop < MAX_STACK ) tok_stack[ttop] = t; \
X else Error(FATAL, &fpos(tok_stack[ttop-1]), \
X "operator stack overflow: need to simplify expression"); \
X}
X
X#define PopObj() obj_stack[otop--]
X#define PopToken() tok_stack[ttop--]
X#define TokenTop tok_stack[ttop]
X#define ObjTop obj_stack[otop]
X
X
X#if DEBUG_ON
Xstatic DebugStacks(initial_ttop)
Xint initial_ttop;
X{ int i;
X fprintf(stderr, "obj_prev: %s; otop: %d; ttop: %d\n",
X bool(obj_prev), otop, ttop);
X for( i = 0; i <= otop; i++ )
X fprintf(stderr, "obj[%d] = %s\n", i, EchoObject(null, obj_stack[i]));
X for( i = 0; i <= ttop; i++ )
X { if( i == initial_ttop+1 ) fprintf(stderr, "$\n");
X fprintf(stderr, "tok[%d] = %s.%d\n", i, type(tok_stack[i]) == CLOSURE ?
X SymName(actual(tok_stack[i])) : Image(type(tok_stack[i])),
X precedence(tok_stack[i]));
X }
X}
X#endif
X
X/*****************************************************************************/
X/* */
X/* insert_space(t) */
X/* */
X/* Add any missing catenation operator in front of token t. */
X/* */
X/*****************************************************************************/
X
X#define insert_space(t) \
Xif( obj_prev ) \
X{ int typ, prec; \
X if( hspace(t) + vspace(t) > 0 ) \
X { typ = TSPACE; \
X prec = ACAT_PREC; \
X } \
X else \
X { typ = TJUXTA; \
X prec = JUXTA_PREC; \
X } \
X while( obj_prev && precedence(TokenTop) >= prec ) Reduce(); \
X if( obj_prev ) \
X { tmp = New(typ); \
X precedence(tmp) = prec; \
X vspace(tmp) = vspace(t); \
X hspace(tmp) = hspace(t); \
X mark(gap(tmp)) = FALSE; \
X join(gap(tmp)) = TRUE; \
X FposCopy( fpos(tmp), fpos(t) ); \
X PushToken(tmp); \
X } \
X} /* end insert_space */
X
X#define Shift(t, prec, rassoc, leftpar, rightpar) \
X{ if( leftpar ) \
X { for(;;) \
X { if( !obj_prev ) \
X { PushObj( MakeWord("", &fpos(t)) ); \
X obj_prev = TRUE; \
X } \
X else if( precedence(TokenTop) >= prec + rassoc ) \
X { Reduce(); \
X } \
X else break; \
X } \
X } \
X else insert_space(t); \
X PushToken(t); \
X if( rightpar ) obj_prev = FALSE; \
X else \
X { obj_prev = TRUE; \
X Reduce(); \
X } \
X} /* end Shift */
X
X#define ShiftObj(t) \
X{ insert_space(t); \
X PushObj(t); \
X obj_prev = TRUE; \
X}
X
Xstatic Reduce()
X{ OBJECT p1, p2, p3, s1, s2, tmp;
X OBJECT op;
X assert( obj_prev, "Reduce: obj_prev!" );
X
X op = PopToken();
X obj_prev = TRUE;
X switch( type(op) )
X {
X
X case GSTUB_INT:
X case GSTUB_EXT:
X
X TransferEnd( PopObj() );
X obj_prev = TRUE;
X PushObj(New(NULL_CLOS));
X Dispose(op);
X break;
X
X
X case GSTUB_NONE:
X
X PushObj(New(NULL_CLOS));
X Dispose(op);
X break;
X
X


X case NULL_CLOS:
X case CROSS:

X case ONE_ROW:
X case ONE_COL:


X case WIDE:
X case HIGH:
X case HSCALE:
X case VSCALE:

X case SCALE:


X case HCONTRACT:
X case VCONTRACT:
X case HEXPAND:
X case VEXPAND:
X case PADJUST:
X case HADJUST:
X case VADJUST:
X case ROTATE:

X case CASE:
X case YIELD:


X case FONT:
X case SPACE:
X case BREAK:

X case NEXT:
X case TAGGED:


X case INCGRAPHIC:
X case SINCGRAPHIC:
X case GRAPHIC:

X case OPEN:
X
X if( has_rpar(actual(op)) )
X { s2 = PopObj();
X Link(op, s2);
X }
X if( has_lpar(actual(op)) )
X { s1 = PopObj();
X Link(Down(op), s1);
X if( type(op)==CROSS && type(s1)!=CLOSURE ) Error(WARN, &fpos(s1),
X "left parameter of %s is not a symbol (or not visible)", KW_CROSS);
X }
X PushObj(op);
X break;
X
X
X case CLOSURE:
X
X if( has_rpar(actual(op)) )
X { s2 = New(PAR);
X tmp = PopObj();
X Link(s2, tmp);
X FposCopy(fpos(s2), fpos(tmp));
X actual(s2) = ChildSym(actual(op), RPAR);
X Link(op, s2);
X }
X if( has_lpar(actual(op)) )
X { s1 = New(PAR);
X tmp = PopObj();
X Link(s1, tmp);
X FposCopy(fpos(s1), fpos(tmp));
X actual(s1) = ChildSym(actual(op), LPAR);
X Link(Down(op), s1);
X }
X PushObj(op);
X break;
X
X
X case LBR:
X
X Error(WARN, &fpos(op), "unmatched %s - inserted %s", KW_LBR, KW_RBR);
X Dispose(op);
X break;
X
X
X case BEGIN:
X
X Error(INTERN, &fpos(op), "Reduce: unmatched BEGIN");
X break;
X
X
X case RBR:
X
X if( type(TokenTop) == LBR )
X { /* *** FposCopy(fpos(ObjTop), fpos(TokenTop)); *** */
X Dispose( PopToken() );
X }
X else if( type(TokenTop) == BEGIN )
X Error(WARN, &fpos(op), "unmatched %s; inserted %s at%s (after %s)",
X KW_RBR, KW_LBR, EchoFilePos(&fpos(TokenTop)), KW_BEGIN);
X else Error(INTERN, &fpos(op), "Reduce: unmatched RBR");
X Dispose(op);
X break;
X
X
X case END:
X
X if( type(TokenTop) != BEGIN )
X Error(INTERN, &fpos(op), "Reduce: unmatched END");
X else
X { if( actual(op) != actual(TokenTop) )
X if( actual(op) == StartSym )
X Error(WARN, &fpos(op),
X "%s %s appended at end of file to match %s at%s",
X KW_END, SymName(actual(TokenTop)),
X KW_BEGIN, EchoFilePos(&fpos(TokenTop)) );
X else if( actual(op) == nil )
X Error(WARN, &fpos(op),
X "%s replaced by %s %s to match %s at%s",
X KW_END, KW_END, SymName(actual(TokenTop)),
X KW_BEGIN, EchoFilePos(&fpos(TokenTop)) );
X else
X Error(WARN, &fpos(op),
X "%s %s replaced by %s %s to match %s at%s",
X KW_END, SymName(actual(op)),
X KW_END, SymName(actual(TokenTop)),
X KW_BEGIN, EchoFilePos(&fpos(TokenTop)) );
X Dispose( PopToken() );
X }
X Dispose(op);


X break;
X
X
X case GAP_OBJ:
X

X p1 = PopObj();
X Link(op, p1);
X PushObj(op);
X obj_prev = FALSE;


X break;
X
X
X case VCAT:
X case HCAT:

X case ACAT:
X
X p3 = PopObj(); p2 = PopObj(); p1 = PopObj();
X if( type(p1) == type(op) ) Dispose(op);
X else
X { Link(op, p1);
X p1 = op;
X }
X Link(p1, p2);
X Link(p1, p3);
X PushObj(p1);
X break;
X
X
X case TSPACE:
X case TJUXTA:
X
X p2 = PopObj(); p1 = PopObj();
X if( type(p1) != ACAT )
X { tmp = New(ACAT);
X Link(tmp, p1);
X FposCopy(fpos(tmp), fpos(p1));
X p1 = tmp;
X }
X type(op) = GAP_OBJ;
X Link(p1, op);
X Link(p1, p2);
X PushObj(p1);


X break;
X
X
X default:
X

X Error(INTERN, &fpos(op), "Reduce: %s", Image(type(op)) );
X break;
X


X } /* end switch */

X debug0(DOP, DD, "Reduce returning; ");
X ifdebug(DOP, DD, DebugStacks(0) );
X} /* end Reduce */


X
X
X/*@@**************************************************************************/
X/* */

X/* static SetScope(env, count) */
X/* */
X/* Push scopes required to parse object whose environment is env. */
X/* Add to *count the number of scope pushes made. */
X/* */
X/*****************************************************************************/
X
Xstatic SetScope(env, count)
XOBJECT env; int *count;
X{ OBJECT link, y, yenv;
X debug2(DOP, D, "SetScope( %s, %d )", EchoObject(null, env), *count);
X assert( env != nil && type(env) == ENV, "SetScope: type(env) != ENV!" );
X if( Down(env) != env )
X { Child(y, Down(env));
X assert( LastDown(y) != y, "SetScope: LastDown(y)!" );
X link = LastDown(env) != Down(env) ? LastDown(env) : LastDown(y);
X Child(yenv, link);
X assert( type(yenv) == ENV, "SetScope: type(yenv) != ENV!" );
X SetScope(yenv, count);
X PushScope(actual(y), FALSE, FALSE); (*count)++;
X }
X debug1(DOP, D, "SetScope returning, count = %d", *count);
X} /* end SetScope */


X
X
X/*****************************************************************************/
X/* */

X/* InitParser() */
X/* */
X/* Initialise the parser to contain just GstubExt. */
X/* Remember cross_db, the name of the cross reference database, for Parse. */
X/* */
X/*****************************************************************************/
X
XInitParser(cross_db)
Xunsigned char *cross_db;
X{ if( strlen(cross_db) + strlen(INDEX_SUFFIX) >= MAX_LINE )
X Error(FATAL, no_fpos, "cross reference database file name %s%s is too long",
X cross_db, INDEX_SUFFIX);
X cross_name = MakeWordTwo(cross_db, INDEX_SUFFIX, no_fpos);
X PushToken( NewToken(GSTUB_EXT, no_fpos, 0, 0, DEFAULT_PREC, StartSym) );
X} /* end InitParser */


X
X
X/*@@**************************************************************************/
X/* */

X/* static OBJECT ParseEnvClosure(t, encl) */
X/* */
X/* Parse an object which is a closure with environment. Consume the */
X/* concluding @Clos. */
X/* */
X/*****************************************************************************/
X
Xstatic OBJECT ParseEnvClosure(t, encl)
XOBJECT t, encl;
X{ OBJECT env, res, y; int count, i;
X debug0(DOP, DD, "ParseEnvClosure(t, encl)");
X assert( type(t) == ENV, "ParseEnvClosure: type(t) != ENV!" );
X env = t; t = LexGetToken();
X while( type(t) != CLOS ) switch( type(t) )
X {
X case LBR: count = 0;
X SetScope(env, &count);
X y = Parse(&t, encl, FALSE, FALSE);
X if( type(y) != CLOSURE ) Error(FATAL, &fpos(y),
X "syntax error in cross reference database");
X for( i = 1; i <= count; i++ ) PopScope();
X AttachEnv(env, y);


X env = SetEnv(y, nil);

X t = LexGetToken();
X break;
X
X case ENV: y = ParseEnvClosure(t, encl);
X env = SetEnv(y, env);
X t = LexGetToken();
X break;
X
X default: Error(FATAL, &fpos(t), "error in cross reference database");
X break;
X }
X Dispose(t);
X if( Down(env) == env || Down(env) != LastDown(env) )
X Error(FATAL, &fpos(env), "error in cross reference database");
X Child(res, Down(env));
X DeleteNode(env);
X debug1(DOP, DD, "ParseEnvClosure returning %s", EchoObject(null, res));
X assert( type(res) == CLOSURE, "ParseEnvClosure: type(res) != CLOSURE!" );
X return res;
X} /* end ParseEnvClosure */
X


X
X
X/*@@**************************************************************************/
X/* */

X/* OBJECT Parse(token, encl, defs_allowed, transfer_allowed) */
X/* */
X/* Parse input tokens, beginning with *token, looking for an object of the */
X/* form { ... } or @Begin ... @End <sym>, and return the object. */
X/* The parent definition is encl, and scope has been set appropriately. */
X/* Parse reads up to and including the last token of the object */
X/* (the right brace or <sym>), and returns nil in *token. */
X/* */
X/* If defs_allowed == TRUE, there may be local definitions in the object. */
X/* In this case, encl is guaranteed to be the enclosing definition. */
X/* */
X/* If transfer_allowed == TRUE, the parser may transfer components to the */
X/* galley handler as they are read. */
X/* */
X/* Note: the lexical analyser returns "@End \Input" at end of input, so the */
X/* parser does not have to handle end of input separately. */
X/* */
X/*****************************************************************************/
X
XOBJECT Parse(token, encl, defs_allowed, transfer_allowed)
XOBJECT *token, encl; BOOLEAN defs_allowed, transfer_allowed;
X{ OBJECT t, x, tmp, xsym, env, y, res;
X int i, initial_ttop = ttop;
X unsigned char buff[MAX_LINE]; FILE_NUM index_fnum;
X
X debug4(DOP, D, "[ Parse(%s, %s, %s, %s)", EchoToken(*token), SymName(encl),
X bool(defs_allowed), bool(transfer_allowed));
X assert( type(*token) == LBR || type(*token) == BEGIN, "Parse: *token!" );
X
X obj_prev = FALSE;
X Shift(*token, precedence(*token), 0, FALSE, TRUE);
X t = LexGetToken();
X if( defs_allowed )
X { ReadDefinitions(&t, encl, LOCAL);
X if( encl == StartSym ) /* transition point from defs to content */
X {
X /* if error in definitions, stop now */
X if( ErrorSeen() ) Error(FATAL, &fpos(t), "Exiting now");
X
X /* load cross-references from previous run, open new cross refs */
X if( AllowCrossDb )
X { index_fnum = DefineFile(cross_name, INDEX_FILE, SOURCE_PATH);
X OldCrossDb = DbLoad(index_fnum,string(cross_name),&fpos(t),FALSE,nil);
X NewCrossDb = DbCreate(string(cross_name), &fpos(t));
X }
X else OldCrossDb = NewCrossDb = nil;
X
X /* tidy up and possibly print symbol table */
X FlattenUses();
X ifdebug(DST, D, EchoObject(stderr, StartSym) );
X
X /* read @Use commands and construct env */
X env = New(ENV);
X while( type(t) == USE )
X {
X OBJECT crs, res_env; STYLE style;
X Dispose(t); t = LexGetToken();


X if( type(t) != LBR )

X Error(FATAL, &fpos(t), "%s expected after %s", KW_LBR, KW_USE);
X y = Parse(&t, encl, FALSE, FALSE);
X if( type(y) == CROSS )
X { y = CrossExpand(y, env, &style, FALSE, &crs, &res_env);
X AttachEnv(res_env, y);
X env = SetEnv(y, env);
X }
X else if( type(y) == CLOSURE )
X { AttachEnv(env, y);
X env = SetEnv(y, nil);
X }
X else Error(FATAL, &fpos(y), "invalid parameter of %s", KW_USE);
X
X PushScope(actual(y), FALSE, TRUE);


X t = LexGetToken();
X }

X TransferInit(env);
X }
X }


X
X for(;;)
X {

X ifdebug(DOP, DD, DebugStacks(initial_ttop) );
X debug2(DOP, DD, ">> %s.%d", EchoToken(t), precedence(t) );
X
X switch( type(t) )
X {
X
X case WORD:
X
X if( string(t)[0] == '@' )
X Error(WARN, &fpos(t), "symbol %s unknown or misspelt", string(t));
X ShiftObj(t);
X t = LexGetToken();


X break;
X
X
X case VCAT:
X case HCAT:

X case ACAT:
X
X /* clean up left context */
X Shift(t, precedence(t), LEFT_ASSOC, TRUE, TRUE);
X
X /* invoke transfer subroutines if appropriate */
X if( type(t) == VCAT && !has_join(actual(t))
X && type(tok_stack[ttop-2]) == GSTUB_EXT )
X { TransferComponent( PopObj() );
X obj_prev = FALSE;
X tmp = New(NULL_CLOS);
X FposCopy( fpos(tmp), fpos(t) );
X PushObj(tmp);
X }
X
X /* push GAP_OBJ token, to cope with 3 parameters */
X x = New(GAP_OBJ);
X mark(gap(x)) = has_mark(actual(t));
X join(gap(x)) = has_join(actual(t));
X precedence(x) = GAP_PREC;
X FposCopy( fpos(x), fpos(t) );
X Shift(x, GAP_PREC, LEFT_ASSOC, FALSE, TRUE);
X
X /* if op is followed by space, insert {} */
X t = LexGetToken();
X if( hspace(t) + vspace(t) > 0 )
X { ShiftObj(MakeWord("", &fpos(x)));


X }
X break;
X
X

X case CROSS:
X case NULL_CLOS:


X case ONE_COL:
X case ONE_ROW:
X case WIDE:
X case HIGH:
X case HSCALE:
X case VSCALE:

X case SCALE:


X case HCONTRACT:
X case VCONTRACT:
X case HEXPAND:
X case VEXPAND:
X case PADJUST:
X case HADJUST:
X case VADJUST:
X case ROTATE:

X case CASE:
X case YIELD:


X case FONT:
X case SPACE:
X case BREAK:

X case NEXT:
X case TAGGED:


X case INCGRAPHIC:
X case SINCGRAPHIC:
X case GRAPHIC:
X

X /* clean up left context of t (these ops are all right associative) */
X Shift(t, precedence(t), RIGHT_ASSOC,
X has_lpar(actual(t)), has_rpar(actual(t)));
X t = LexGetToken();
X break;
X
X
X case BEGIN:
X
X if( actual(t) == nil )
X { Error(WARN, &fpos(t), "%s replaced by %s", KW_BEGIN, KW_LBR);
X type(t) = LBR;
X }
X /* NB NO BREAK! */
X
X
X case LBR:
X
X Shift(t, LBR_PREC, 0, FALSE, TRUE);
X t = LexGetToken();
X break;
X
X
X case END:
X
X x = LexGetToken();
X if( type(x) == CLOSURE )
X { actual(t) = actual(x);
X Dispose(x);
X x = nil;
X }
X else if( type(x) == WORD && string(x)[0] == '@' )
X { Error(WARN,&fpos(x),"unknown or misspelt symbol %s after %s deleted",
X string(x), KW_END);
X actual(t) = nil;
X Dispose(x);
X x = nil;
X }
X else
X { Error(WARN, &fpos(x), "symbol expected after %s", KW_END);
X actual(t) = nil;
X }
X Shift(t, precedence(t), 0, TRUE, FALSE);
X if( ttop == initial_ttop )
X { ifdebug(DOP, DD, DebugStacks(initial_ttop));
X *token = x;
X debug0(DOP, D, "] Parse returning");
X ifdebug(DOP, D, EchoObject(stderr, ObjTop));
X obj_prev = FALSE;
X return PopObj();
X }
X t = (x != nil) ? x : LexGetToken();
X break;
X
X
X case RBR:
X
X Shift(t, precedence(t), 0, TRUE, FALSE);
X if( ttop == initial_ttop )
X { ifdebug(DOP, DD, DebugStacks(initial_ttop));
X *token = nil;
X debug0(DOP, D, "] Parse returning");
X ifdebug(DOP, D, EchoObject(stderr, ObjTop));
X obj_prev = FALSE;
X return PopObj();
X }
X t = LexGetToken();
X break;
X
X
X case USE:
X
X Error(FATAL, &fpos(t), "%s symbol out of place", SymName(actual(t)));
X break;
X
X
X case ENV:
X
X /* only occurs in cross reference databases */
X res = ParseEnvClosure(t, encl);
X ShiftObj(res);
X t = LexGetToken();
X break;
X
X
X case LVIS:
X
X /* only occurs in cross-reference databases */
X SuppressVisible();
X Dispose(t); t = LexGetToken();
X UnSuppressVisible();
X if( type(t) != CLOSURE )
X Error(FATAL, &fpos(t), "symbol expected following %s", KW_LVIS);
X /* NB NO BREAK! */
X
X
X case CLOSURE:
X
X x = t; xsym = actual(x);
X
X /* look ahead one token, which could be an NPAR */
X PushScope(xsym, TRUE, FALSE);
X t = LexGetToken();
X PopScope();
X
X /* if x starts a cross-reference, make it a CLOSURE */
X if( type(t) == CROSS )
X { ShiftObj(x);
X break;
X }
X
X /* clean up left context of x */
X Shift(x, precedence(x),right_assoc(xsym),has_lpar(xsym),has_rpar(xsym));
X
X /* update uses relation if required */
X if( encl != StartSym )
X { if( !has_target(xsym) ) InsertUses(encl, xsym);
X else uses_galley(encl) = TRUE;
X }
X
X /* read named parameters */
X while( type(t) == CLOSURE && enclosing(actual(t)) == xsym
X && type(actual(t)) == NPAR )
X {
X /* check syntax and attach the named parameter to x */
X OBJECT new_par = t;


X t = LexGetToken();
X if( type(t) != LBR )

X { Error(WARN, &fpos(new_par), "%s must follow named parameter %s",
X KW_LBR, SymName(actual(new_par)) );
X Dispose(new_par);
X break;
X }
X
X /* read the named parameter's body */
X PushScope(actual(new_par), FALSE, FALSE);
X tmp = Parse(&t, encl, FALSE, FALSE);
X type(new_par) = PAR;
X Link(x, new_par);
X Link(new_par, tmp);
X PopScope();
X
X /* get next token, possibly another NPAR */
X PushScope(xsym, TRUE, FALSE); /* allow NPARs only */
X if( t == nil ) t = LexGetToken();
X PopScope();


X
X } /* end while */

X obj_prev = !has_rpar(xsym);
X
X /* record symbol name in BEGIN following, if any */
X if( type(t) == BEGIN )
X { if( !has_rpar(xsym) )
X Error(WARN, &fpos(x), "%s takes no right parameter", SymName(xsym));
X else actual(t) = xsym;
X }
X
X /* if x can be transferred, do so */
X if( transfer_allowed && has_target(xsym) && !has_key(xsym) )
X {
X if( !has_rpar(xsym) || uses_count(ChildSym(xsym, RPAR)) <= 1 )
X {
X debug1(DGT, DD, "examining transfer of %s", SymName(xsym));
X ifdebug(DGT, DD, DebugStacks(initial_ttop));
X i = has_rpar(xsym) ? ttop -1 : ttop;
X while( is_cat_op(type(tok_stack[i])) ) i--;
X if( (type(tok_stack[i])==LBR || type(tok_stack[i])==BEGIN)
X && type(tok_stack[i-1]) == GSTUB_EXT )
X {
X /* at this point it is likely that x is transferable */
X if( has_rpar(xsym) )
X { tmp = New(CLOSURE);
X actual(tmp) = InputSym;
X FposCopy( fpos(tmp), fpos(t) );
X PushObj(tmp); obj_prev = TRUE;
X Reduce();
X }
X x = PopObj();
X x = TransferBegin(x);
X if( type(x) == CLOSURE ) /* failure: unReduce */
X { if( has_rpar(xsym) )
X { Child(tmp, LastDown(x));
X assert(type(tmp)==PAR && type(actual(tmp))==RPAR,
X "Parse: can't undo rpar" );
X DisposeChild(LastDown(x));
X if( has_lpar(xsym) )
X { Child(tmp, Down(x));
X assert(type(tmp)==PAR && type(actual(tmp))==LPAR,
X "Parse: can't undo lpar" );
X Child(tmp, Down(tmp));
X PushObj(tmp);
X DeleteLink(Up(tmp));
X DisposeChild(Down(x));
X }
X PushToken(x); obj_prev = FALSE;
X }
X else
X { PushObj(x);
X obj_prev = TRUE;
X }
X }
X else /* success */
X { obj_prev = FALSE;
X Shift(x, NO_PREC, 0, FALSE, has_rpar(xsym));
X }
X }
X }
X } /* end if has_target */
X
X if( has_body(xsym) )
X { if( type(t) == BEGIN || type(t) == LBR )
X { PushScope(xsym, FALSE, TRUE);
X PushScope(ChildSym(xsym, RPAR), FALSE, FALSE);
X PushObj( Parse(&t, encl, FALSE, TRUE) );
X obj_prev = TRUE;
X Reduce();
X PopScope();
X PopScope();
X if( t == nil ) t = LexGetToken();
X }
X else
X { Error(WARN, &fpos(t),
X "%s parameter of %s must be enclosed in %s .. %s",
X KW_BODY, SymName(xsym), KW_LBR, KW_RBR);


X }
X }
X break;
X
X

X case OPEN:
X
X x = t; xsym = nil;
X Shift(t, precedence(t), RIGHT_ASSOC, TRUE, TRUE);
X if( type(ObjTop) == CLOSURE ) xsym = actual(ObjTop);
X else if( type(ObjTop) == CROSS && Down(ObjTop) != ObjTop )
X { Child(tmp, Down(ObjTop));
X if( type(tmp) == CLOSURE ) xsym = actual(tmp);
X }


X t = LexGetToken();
X

X if( xsym == nil )
X Error(WARN, &fpos(x), "invalid left parameter of %s", KW_OPEN);
X else if( type(t) != BEGIN && type(t) != LBR )
X Error(WARN, &fpos(t), "%s parameter of %s not enclosed in %s .. %s",
X KW_RIGHT, KW_OPEN, KW_LBR, KW_RBR);
X else
X { PushScope(xsym, FALSE, TRUE);
X tmp = Parse(&t, encl, FALSE, FALSE);
X ShiftObj(tmp);
X PopScope();
X if( t == nil ) t = LexGetToken();
X Reduce();


X }
X break;
X
X

X default:
X
X Error(INTERN, &fpos(t), "Parse: type %s", Image(type(t)) );
X break;
X


X } /* end switch */
X } /* end for */
X

X} /* end Parse */
END_OF_FILE
if test 27162 -ne `wc -c <'lout/z06.c'`; then
echo shar: \"'lout/z06.c'\" unpacked with wrong size!
fi
# end of 'lout/z06.c'
fi
if test -f 'lout/z33.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/z33.c'\"
else
echo shar: Extracting \"'lout/z33.c'\" \(24078 characters\)
sed "s/^X//" >'lout/z33.c' <<'END_OF_FILE'
X/*@z33.c:Database Service:DbCreate(), DbRetrieve()@***************************/


X/* */
X/* LOUT: A HIGH-LEVEL LANGUAGE FOR DOCUMENT FORMATTING (VERSION 2.03) */
X/* COPYRIGHT (C) 1993 Jeffrey H. Kingston */
X/* */
X/* Jeffrey H. Kingston (je...@cs.su.oz.au) */
X/* Basser Department of Computer Science */
X/* The University of Sydney 2006 */
X/* AUSTRALIA */
X/* */
X/* This program is free software; you can redistribute it and/or modify */
X/* it under the terms of the GNU General Public License as published by */
X/* the Free Software Foundation; either version 1, or (at your option) */
X/* any later version. */
X/* */
X/* This program is distributed in the hope that it will be useful, */
X/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
X/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
X/* GNU General Public License for more details. */
X/* */
X/* You should have received a copy of the GNU General Public License */
X/* along with this program; if not, write to the Free Software */
X/* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
X/* */

X/* FILE: z33.c */
X/* MODULE: Database Service */
X/* EXTERNS: OldCrossDb, NewCrossDb, DbCreate(), DbInsert(), */
X/* DbConvert(), DbLoad(), DbRetrieve(), DbRetrieveNext() */


X/* */
X/*****************************************************************************/
X#include "externs"

X#define reading(x) threaded(x)


X
X
X/*****************************************************************************/
X/* */

X/* OldCrossDb Database containing cross references from previous run. */
X/* NewCrossDb Writable database of cross references from this run. */
X/* */
X/*****************************************************************************/
X
XOBJECT OldCrossDb, NewCrossDb;


X
X
X/*****************************************************************************/
X/* */

X/* OBJECT DbCreate(str, fpos) */
X/* */
X/* Create a new writable database with name (i.e. file stem) str and file */
X/* position fpos for error messages. */
X/* */
X/*****************************************************************************/
X
XOBJECT DbCreate(str, fposn)
Xunsigned char *str; FILE_POS *fposn;
X{ OBJECT db;
X debug2(DBS, D, "DbCreate( %s,%s )", str, EchoFilePos(fposn));
X db = MakeWord(str, fposn);
X reading(db) = FALSE;
X filep(db) = null;
X debug1(DBS, D, "DbCreate returning %s", EchoObject(null, db));
X return db;
X} /* end DbCreate */


X
X
X/*****************************************************************************/
X/* */

X/* #define SymToNum(db, sym, num, gall) */
X/* */
X/* Set num to the number used to refer to sym in database db. If sym is */
X/* not currently referred to in db, create a new number and record sym. */
X/* If gall is true, sym is the target of galleys stored in this database. */
X/* Store in boolean fields db_targ(link) and is_extern_target(sym). */
X/* */
X/*****************************************************************************/
X
X#define SymToNum(db, sym, num, gall) \
X{ OBJECT link, yy; int count; \
X count = 0; \
X for( link = Down(db); link != db; link = NextDown(link) ) \
X { Child(yy, link); \
X assert(type(yy)==CROSS_SYM || type(yy)==ACAT, "SymToNum: yy!"); \
X if( type(yy) != CROSS_SYM ) continue; \
X if( symb(yy) == sym ) break; \
X if( number(link) > count ) count = number(link); \
X } \
X if( link == db ) \


X { if( cross_sym(sym) == nil ) CrossInit(sym); \

X link = Link(db, cross_sym(sym)); \
X number(link) = count + 1; \
X db_targ(link) = FALSE; \
X } \
X num = number(link); \
X if( gall ) db_targ(link) = is_extern_target(sym) = \
X uses_extern_target(sym) = TRUE; \
X} /* end SymToNum */


X
X
X/*@@**************************************************************************/
X/* */

X/* #define NumToSym(db, num, sym) */
X/* */
X/* Set sym to the symbol which is referred to in database db by num. */
X/* */
X/*****************************************************************************/
X
X#define NumToSym(db, num, sym) \
X{ OBJECT link, y; \
X for( link = Down(db); link != db; link = NextDown(link) ) \
X { Child(y, link); \
X if( type(y) == CROSS_SYM && number(link) == num ) break; \
X } \
X if( link == db ) Error(INTERN, &fpos(db), "NumToSym: no sym!"); \
X assert( type(y) == CROSS_SYM, "NumToSym: y!" ); \
X sym = symb(y); \
X} /* end NumToSym */


X
X
X/*****************************************************************************/
X/* */

X/* DbInsert(db, gall, sym, tag, seq, dfnum, dfpos) */
X/* */
X/* Insert a new entry into writable database db. The primary key of the */
X/* entry has these three parts: */
X/* */
X/* gall TRUE if inserting a galley */
X/* sym The symbol which is the target of this entry */
X/* tag The tag of this target (must be a non-null string) */
X/* */
X/* There is also an auxiliary key, seq, which enforces an ordering on */
X/* entries with equal primary keys. This is used for sorted galleys. */
X/* The value of the entry has the following parts: */
X/* */
X/* dfnum The file containing the object */
X/* dfpos The position of the object in that file */
X/* */
X/*****************************************************************************/
X
XDbInsert(db, gall, sym, tag, seq, dfnum, dfpos)
XOBJECT db; BOOLEAN gall; OBJECT sym; unsigned char *tag, *seq;
XFILE_NUM dfnum; long dfpos;
X{ int symnum;


X unsigned char buff[MAX_LINE];

X assert( type(db) == WORD, "DbInsert: db!" );
X assert( tag[0] != '\0', "DbInsert: null tag!" );
X assert( seq[0] != '\0', "DbInsert: null seq!" );
X ifdebug(DPP, D, ProfileOn("DbInsert"));
X debug6(DBS, D, "DbInsert(%s, %s, %s, %s, %s, %s, dfpos)",
X string(db), bool(gall), SymName(sym), tag, seq,
X dfnum == NO_FILE ? (unsigned char *) "." : FileName(dfnum));
X if( reading(db) ) Error(INTERN, &fpos(db), "insert into reading database!");
X if( filep(db) == null )
X { if( strlen(string(db)) + strlen(NEW_INDEX_SUFFIX) >= MAX_LINE )
X Error(FATAL, no_fpos, "database file name %s%s is too long",
X string(db), NEW_INDEX_SUFFIX);
X sprintf(buff, "%s%s", string(db), NEW_INDEX_SUFFIX);
X filep(db) = fopen(buff, "w");
X if( filep(db) == null )
X Error(FATAL, &fpos(db), "cannot write to database file %s", buff);
X }
X SymToNum(db, sym, symnum, gall);
X fprintf(filep(db), "%s%d&%s\t%s\t%ld\t%s\n", gall ? "&" : "", symnum,
X tag, seq, dfpos, dfnum==NO_FILE ? (unsigned char *) "." : FileName(dfnum));
X debug0(DBS, D, "DbInsert returning.");
X ifdebug(DPP, D, ProfileOff("DbInsert"));
X} /* end DbInsert */


X
X
X/*@@**************************************************************************/
X/* */

X/* DbConvert(db, full_name) */
X/* */
X/* Convert database db from writable to readable, then dispose it. */
X/* full_name is TRUE if symbols are to be known by their full path name. */
X/* */
X/*****************************************************************************/
X
XDbConvert(db, full_name)
XOBJECT db; BOOLEAN full_name;
X{ unsigned char buff[2*MAX_LINE + 20], oldname[MAX_LINE+10], newname[MAX_LINE];
X OBJECT link, y;
X ifdebug(DPP, D, ProfileOn("DbConvert"));
X debug2(DBS, D, "DbConvert( %d %s )", (int) db,string(db));
X if( reading(db) ) Error(INTERN, &fpos(db), "DbConvert: reading database!");
X sprintf(newname, "%s", string(db));
X sprintf(oldname, "%s%s", string(db), NEW_INDEX_SUFFIX);
X if( filep(db) != null )
X { for( link = Down(db); link != db; link = NextDown(link) )
X { Child(y, link);
X assert( type(y) == CROSS_SYM || type(y) == ACAT, "DbConvert: y!" );
X if( type(y) != CROSS_SYM ) continue;
X fprintf(filep(db), "%s %d %s\n", db_targ(link) ? "#target" : "#symbol",
X number(link), full_name ? FullSymName(symb(y)," ") : SymName(symb(y)));
X }
X fclose(filep(db));
X sprintf(buff, "sort -o %s %s", newname, oldname);
X system(buff);
X }
X else unlink(newname);
X unlink(oldname);
X DeleteNode(db);
X debug0(DBS, D, "DbConvert returning.");
X ifdebug(DPP, D, ProfileOff("DbConvert"));
X} /* end DbConvert */


X
X
X/*****************************************************************************/
X/* */

X/* OBJECT DbLoad(index_fnum, str, fpos, create, symbs) */
X/* */
X/* Open the database whose name (i.e. <stem>.li) is str for reading. */
X/* This file has already been defined; its internal name is index_fnum. */
X/* If it won't open and create is true, try to create it from <stem>.ld. */
X/* */
X/* symbs is an ACAT of CLOSUREs showing the symbols that the database may */
X/* contain; or nil if the database may contain any symbol. */
X/* */
X/*****************************************************************************/
X
XOBJECT DbLoad(index_fnum, str, fposn, create, symbs)
XFILE_NUM index_fnum; unsigned char *str; FILE_POS *fposn;
XBOOLEAN create; OBJECT symbs;
X{ FILE *fp; OBJECT db, t, res, tag, par, sym, link, y;
X int i, lnum, num, count; unsigned char line[MAX_LINE];
X unsigned char indexname[MAX_LINE], dataname[MAX_LINE], sym_name[MAX_LINE];
X FILE_NUM dfnum; long dfpos; BOOLEAN gall;
X ifdebug(DPP, D, ProfileOn("DbLoad"));
X debug4(DBS, D, "DbLoad(%s, %s, %s, %s, symbs)", FileName(index_fnum),
X str, EchoFilePos(fposn), bool(create));
X
X /* open or else create index file fp */
X fp = OpenFile(index_fnum, create);
X if( fp == null && create )
X { db = nil;
X strcpy(dataname, str);
X strcpy(&dataname[strlen(dataname) - strlen(INDEX_SUFFIX)], DATA_SUFFIX);
X dfnum = DefineFile(MakeWord(dataname, fposn), DATABASE_FILE, DATABASE_PATH);
X dfpos = 0L;
X LexPush(dfnum, 0, DATABASE_FILE);
X t = LexGetToken();
X while( type(t) == LBR )


X { res = Parse(&t, StartSym, FALSE, FALSE);
X if( t != nil || type(res) != CLOSURE )

X Error(FATAL, &fpos(res), "syntax error in database file %s", dataname);
X assert( symbs != nil, "DbLoad: create && symbs == nil!" );
X if( symbs != nil )
X { for( link = Down(symbs); link != symbs; link = NextDown(link) )
X { Child(y, link);
X if( type(y) == CLOSURE && actual(y) == actual(res) ) break;
X }
X if( link == symbs ) Error(FATAL, &fpos(res),
X "%s found in database but not declared in %s line",
X SymName(actual(res)), KW_DATABASE);
X }
X tag = nil;
X for( link = Down(res); link != res; link = NextDown(link) )
X { Child(par, link);
X if( type(par) == PAR && is_tag(actual(par)) && Down(par) != par )
X { Child(tag, Down(par));
X break;
X }
X }
X if( tag == nil )
X Error(FATAL, &fpos(res), "database symbol %s has no tag", SymName(res));


X tag = ReplaceWithTidy(tag);
X if( type(tag) != WORD )

X Error(FATAL, &fpos(res), "database symbol's tag is not a simple word");
X if( string(tag)[0] == '\0' )
X Error(FATAL, &fpos(res), "database symbol's tag is an empty word");
X if( db == nil )
X { strcpy(indexname, FileName(dfnum));
X strcpy(&indexname[strlen(indexname)-strlen(DATA_SUFFIX)], INDEX_SUFFIX);
X db = DbCreate(indexname, fposn);
X }
X DbInsert(db, FALSE, actual(res), string(tag), "0", NO_FILE, dfpos);
X DisposeObject(res);
X dfpos = LexNextTokenPos();


X t = LexGetToken();
X }

X if( type(t) != END )
X Error(FATAL, &fpos(t), "%s or end of file expected here", KW_LBR);
X LexPop();
X if( db == nil )
X { strcpy(indexname, FileName(dfnum));
X strcpy(&indexname[strlen(indexname)-strlen(DATA_SUFFIX)], INDEX_SUFFIX);
X db = DbCreate(indexname, fposn);
X }
X DbConvert(db, FALSE);
X fp = OpenFile(index_fnum, FALSE);
X if( fp == null )
X Error(FATAL, &fpos(db), "cannot open database file %s", indexname);
X }
X else strcpy(indexname, str);
X
X /* set up database record */
X db = MakeWord(FileName(index_fnum), fposn);
X reading(db) = TRUE;
X filep(db) = fp;
X if( symbs != nil )
X { assert( type(symbs) = ACAT, "DbLoad: type(symbs)!" );
X Link(db, symbs);
X }
X if( fp == null )
X { debug1(DBS, D, "DbLoad returning (empty) %s", string(db));
X ifdebug(DPP, D, ProfileOff("DbLoad"));
X return db;
X }
X
X /* read header lines of index file, find its symbols */
X left_pos(db) = 0;
X lnum = 0;
X while( fgets(line, MAX_LINE, fp) != NULL && line[0] == '#' )
X { lnum++;
X left_pos(db) = (int) ftell(fp);
X gall = line[1] == 't';
X sscanf(line, gall ? "#target %d" : "#symbol %d", &num);
X for( i = 8; line[i] != ' ' && line[i] != '\0'; i++ );
X if( symbs == nil )
X {
X /* any symbols are possible, full path names in index file required */
X count = 0; sym = StartSym;
X while( line[i] != '\n' && line[i] != '\0' )
X { PushScope(sym, FALSE, FALSE); count++;
X sscanf(&line[i+1], "%s", sym_name);
X sym = SearchSym(sym_name, strlen(sym_name));
X i += strlen(sym_name) + 1;
X }
X for( i = 1; i <= count; i++ ) PopScope();
X }
X else
X {
X /* only symbs symbols possible, full path names not required */
X sym = nil;
X sscanf(&line[i+1], "%s", sym_name);
X for( link = Down(symbs); link != symbs; link = NextDown(link) )
X { Child(y, link);
X assert( type(y) == CLOSURE, "DbLoad: type(y) != CLOSURE!" );
X if( strcmp(sym_name, SymName(actual(y))) == 0 )
X { sym = actual(y);


X break;
X }
X }
X }

X if( sym != nil && sym != StartSym )


X { if( cross_sym(sym) == nil ) CrossInit(sym);

X link = Link(db, cross_sym(sym));
X number(link) = num;
X db_targ(link) = gall;
X if( gall ) is_extern_target(sym) = uses_extern_target(sym) = TRUE;
X }
X else
X { Error(WARN, &fpos(db), "undefined symbol in database file %s (line %d)",
X indexname, lnum);
X debug1(DBS, D, "DbLoad returning %s (error)", string(db));
X fclose(filep(db)); /* effectively an empty database */
X filep(db) = null;
X ifdebug(DPP, D, ProfileOff("DbLoad"));
X return db;
X }
X }
X debug1(DBS, D, "DbLoad returning %s", string(db));
X ifdebug(DPP, D, ProfileOff("DbLoad"));
X return db;
X} /* end DbLoad */


X
X
X/*@@**************************************************************************/
X/* */

X/* static BOOLEAN SearchFile(fp, left, right, str, line) */
X/* */
X/* File fp is a text file. left is the beginning of a line, right is the */
X/* end of a line. Search the file by binary search for a line beginning */
X/* with str. If found, return it in line, else return FALSE. */
X/* */
X/*****************************************************************************/
X
Xstatic BOOLEAN SearchFile(fp, left, right, str, line)
XFILE *fp; int left, right; unsigned char *str, *line;
X{ int l, r, mid, mid_end; unsigned char buff[MAX_LINE]; BOOLEAN res;
X ifdebug(DPP, D, ProfileOn("SearchFile"));
X debug3(DBS, DD, "SearchFile(fp, %d, %d, %s, line)", left, right, str);
X
X l = left; r = right;
X while( l <= r )
X {
X /* loop invt: (l==0 or fp[l-1]=='\n') and (fp[r] == '\n') */
X /* and first key >= str lies in the range fp[l..r+1] */
X
X /* find line near middle of the range; mid..mid_end brackets it */
X debug2(DBS, DD, " start loop: l = %d, r = %d", l, r);
X mid = (l + r)/2;
X fseek(fp, (long) mid, 0);
X do { mid++; } while( getc(fp) != '\n' );
X if( mid == r + 1 )
X { mid = l;
X fseek(fp, (long) mid, 0);
X }
X fgets(line, MAX_LINE, fp);
X mid_end = (int) ftell(fp) - 1;
X debug3(DBS, DD, " mid: %d, mid_end: %d, line: %s", mid, mid_end, line);
X assert( l <= mid, "SearchFile: l > mid!" );
X assert( mid < mid_end, "SearchFile: mid >= mid_end!" );
X assert( mid_end <= r, "SearchFile: mid_end > r!" );
X
X /* compare str with this line and prepare next step */
X debug2(DBS, DD, " comparing key %s with line %s", str, line);
X if( strcmp(str, line) <= 0 ) r = mid - 1;
X else l = mid_end + 1;


X } /* end while */
X

X /* now first key >= str lies in fp[l]; compare it with str */
X if( l < right )
X { fseek(fp, (long) l, 0);
X fgets(line, MAX_LINE, fp);
X sscanf(line, "%s", buff);
X res = strcmp(str, buff) == 0;
X }
X else res = FALSE;
X debug1(DBS, DD, "SearchFile returning %s", bool(res));
X ifdebug(DPP, D, ProfileOff("SearchFile"));
X return res;
X} /* end SearchFile */


X
X
X/*@@**************************************************************************/
X/* */

X/* BOOLEAN DbRetrieve(db, gall, sym, tag, seq, dfnum, dfpos, cont) */
X/* */
X/* Retrieve the first entry of database db with the given gall, sym and */
X/* tag. Set *seq, *dfnum, *dfpos to the associated value. */
X/* Set *cont to a private value for passing to DbRetrieveNext. */
X/* */
X/*****************************************************************************/
X
XBOOLEAN DbRetrieve(db, gall, sym, tag, seq, dfnum, dfpos, cont)
XOBJECT db; BOOLEAN gall; OBJECT sym; unsigned char *tag, *seq;
XFILE_NUM *dfnum; long *dfpos; long *cont;
X{ int symnum; unsigned char line[MAX_LINE], buff[MAX_LINE]; OBJECT y;
X ifdebug(DPP, D, ProfileOn("DbRetrieve"));
X debug4(DBS, D, "DbRetrieve(%s, %s%s&%s)", string(db), gall ? "&" : "",
X SymName(sym), tag);
X if( !reading(db) || filep(db) == null )
X { debug0(DBS, D, "DbRetrieve returning FALSE (empty or not reading)");
X ifdebug(DPP, D, ProfileOff("DbRetrieve"));
X return FALSE;
X }
X SymToNum(db, sym, symnum, FALSE);
X sprintf(buff, "%s%d&%s", gall ? "&" : "", symnum, tag);
X fseek(filep(db), 0L, 2);
X if( !SearchFile(filep(db), left_pos(db), (int) ftell(filep(db))-1,buff,line) )
X { debug0(DBS, D, "DbRetrieve returning FALSE (key not present)");
X ifdebug(DPP, D, ProfileOff("DbRetrieve"));
X return FALSE;
X }
X sscanf(line, "%*s\t%s\t%ld\t%[^\n]", seq, dfpos, buff);
X if( strcmp(buff, ".") == 0 )
X { strcpy(buff, string(db));


X strcpy(&buff[strlen(buff) - strlen(INDEX_SUFFIX)], DATA_SUFFIX);
X }

X *dfnum = FileNum(buff);
X if( *dfnum == NO_FILE ) /* can only occur in cross reference database */
X *dfnum = DefineFile(MakeWord(buff, &fpos(db)), DATABASE_FILE, SOURCE_PATH);
X *cont = ftell(filep(db));
X Child(y, Down(db));
X debug2(DBS, D, "DbRetrieve returning TRUE (in %s at %ld)",
X FileName(*dfnum), *dfpos);
X ifdebug(DPP, D, ProfileOff("DbRetrieve"));
X return TRUE;
X} /* end DbRetrieve */


X
X
X/*****************************************************************************/
X/* */

X/* BOOLEAN DbRetrieveNext(db, gall, sym, tag, seq, dfnum, dfpos, cont) */
X/* */
X/* Retrieve the entry of database db pointed to by *cont. */
X/* Set *gall, *sym, *tag, *seq, *dfnum, *dfpos to the entry's value. */
X/* Reset *cont to the next entry for passing to the next DbRetrieveNext. */
X/* */
X/*****************************************************************************/
X
XBOOLEAN DbRetrieveNext(db, gall, sym, tag, seq, dfnum, dfpos, cont)
XOBJECT db; BOOLEAN *gall; OBJECT *sym; unsigned char *tag, *seq;
XFILE_NUM *dfnum; long *dfpos; long *cont;
X{ unsigned char line[MAX_LINE], fname[MAX_LINE]; int symnum;
X ifdebug(DPP, D, ProfileOn("DbRetrieveNext"));
X debug2(DBS, D, "DbRetrieveNext( %s, %ld )", string(db), *cont);
X if( !reading(db) ) Error(INTERN, &fpos(db), "DbRetrieveNext: writing!");
X if( filep(db) == null )
X { debug0(DBS, D, "DbRetrieveNext returning FALSE (empty database)");
X ifdebug(DPP, D, ProfileOff("DbRetrieveNext"));
X return FALSE;
X }
X fseek(filep(db), *cont == 0L ? left_pos(db) : *cont, 0);
X if( fgets(line, MAX_LINE, filep(db)) == NULL )
X { debug0(DBS, D, "DbRetrieveNext returning FALSE (no successor)");
X ifdebug(DPP, D, ProfileOff("DbRetrieveNext"));
X return FALSE;
X }
X *gall = (line[0] == '&' ? 1 : 0);
X sscanf(&line[*gall], "%d&%s\t%s\t%ld\t%[^\n]", &symnum, tag, seq,dfpos,fname);
X if( strcmp(fname, ".") == 0 )
X { strcpy(fname, string(db));
X strcpy(&fname[strlen(fname) - strlen(INDEX_SUFFIX)], DATA_SUFFIX);
X }
X *dfnum = FileNum(fname);
X if( *dfnum == NO_FILE ) /* can only occur in cross reference database */
X *dfnum = DefineFile(MakeWord(fname, &fpos(db)), DATABASE_FILE, SOURCE_PATH);
X NumToSym(db, symnum, *sym); *cont = ftell(filep(db));
X debug2(DBS, D, "DbRetrieveNext returning TRUE (in %s at %ld)",
X FileName(*dfnum), *dfpos);
X ifdebug(DPP, D, ProfileOff("DbRetrieveNext"));
X return TRUE;
X} /* end DbRetrieveNext */
END_OF_FILE
if test 24078 -ne `wc -c <'lout/z33.c'`; then
echo shar: \"'lout/z33.c'\" unpacked with wrong size!
fi
# end of 'lout/z33.c'
fi
echo shar: End of archive 10 \(of 30\).
cp /dev/null ark10isdone

Jeff Kingston

unread,
Jun 1, 1993, 1:18:59 AM6/1/93
to
Submitted-by: je...@joyce.cs.su.oz.au (Jeff Kingston)
Posting-number: Volume 37, Issue 109
Archive-name: lout/part11
Environment: UNIX

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: lout/doc/tr.lout/ch1.01 lout/z02.c lout/z15.c lout/z29.c
# Wrapped by kent@sparky on Sun May 30 19:43:56 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 11 (of 30)."'
if test -f 'lout/doc/tr.lout/ch1.01' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch1.01'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch1.01'\" \(6589 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch1.01' <<'END_OF_FILE'
X@Section
X @Title { Objects }
X @Tag { objects }
X@Begin
X@PP
XSince our aim is to produce neatly formatted documents, we should begin by
Xlooking at a typical example of such a document:
X@ID {
Xnohyphen @Break @LittleDocument
X//
X@LittleText {
X@DP
X|0.5rt {@B PURCELL}{ 0.8f @Font 1 ^//0.2v}
X@LittleFootNote
X{ { 0.8f @Font 1 ^//0.2v}Blom, Eric. @I {Some Great Composers.} Oxford, 1944.
X}
X@DP
XIn the world of music England is supposed to be a mere province. If she
Xproduces an indifferent composer or performer, that is regarded
Xelsewhere as perfectly normal and natural; but if foreign students of
Xmusical history have to acknowledge a British musical genius, he is
Xconsidered a freak.
X@PP
XSuch a freak is Henry Purcell. Yet if we make a choice of fifteen of
Xthe world's musical classics, as here, we find that we cannot omit this
XEnglish master.
X}
X//
X@LittleEndRun
X}
XIt is a large rectangle made from three smaller rectangles -- its
Xpages. Each page is made of lines; each line is made of words,
Xalthough it makes sense for any rectangle (even a complete document) to
Xbe part of a line, provided it is not too large.
X@PP
XLout deals with something a little more complicated than rectangles:
X@I objects. An object
Xobjec @Index { Object }
Xis a rectangle with at least one @I {column mark}
Xcolumn.mark @Index { Column mark }
Xmark.alignment @Index { Mark alignment }
Xalignment @RawIndex { Alignment @I see mark alignment }
Xprotruding above and below it, and at least one @I {row mark}
Xrow.mark @Index { Row mark }
Xprotruding to the left and right. The simplest objects contain words like
Xmetempsychosis, and have one mark of each type:
X@ID {
X@ShowMarks metempsychosis
X}
XThe rectangle exactly encloses the word; its column mark is at the left
Xedge, and its row mark passes through the middle of the lower-case
Xletters. The rectangle and marks do not appear on the printed page, but
Xto understand what Lout is doing you have to imagine them.
X@PP
XTo place two objects side by side, we separate them by the
Xsymbol @Code "|", which denotes the act of @I {horizontal
Xconcatenation}. So, if we write
X@ID {
X@Code "USA | Australia"
X}
Xthe result will be the object
X@ID {
X@ShowMarks USA | @ShowMarks Australia
X}
XNotice that this object has two column marks, but still only one row mark,
Xbecause @Code "|" merges the two row marks
Xtogether. This merging of row marks fixes the vertical
Xposition of each object with respect to the other, but it does not
Xdetermine how far apart they are. This distance, or {@I gap},
Xmay be given just after the symbol, as in @Code "|0.5i" for example,
Xwhich specifies horizontal concatenation with a gap of half an inch. If
Xno gap is given, it is assumed to be {@Code "0i"}.
X@PP
X@I {Vertical concatenation} & , denoted by the symbol {@Code "/"},


Xis the same apart from the change of direction:
X@ID {
X@Code "Australia /0.1i USA"
X}

Xhas result


X@ID {
X@ShowMarks Australia /0.1i
X@ShowMarks USA
X}

XThe usual merging of marks occurs, and now the gap determines the
Xvertical separation. Horizontal and vertical can be combined:


X@ID @Code {
X |1m USA |1m "|0.2i" |1m Australia
X/1vx "/0.1i" | Washington | "|" | Canberra
X}

Xhas result


X@ID {
X @ShowMarks USA &
X { 0 ymark moveto xsize 10 pt add ymark lineto [ 3 pt ] 0 setdash stroke }
X @Graphic {1c @Wide }
X |0.2i @ShowMarks Australia
X/0.1i @ShowMarks Washington | @ShowMarks Canberra
X}

Xtables @Index { Tables }
XThere are several things to note carefully here. White space (including
Xtabs and newlines) adjacent to a concatenation symbol is ignored, so
Xit may be used freely to lay out the expression clearly. The symbol
X@Code "|" takes precedence over {@Code "/"}, which means that the rows
Xare formed first, then vertically concatenated. The symbol @Code "/" will
Xmerge two or more column marks, creating multiple
Xcolumns (and @Code "|" will merge two or more row marks). This
Ximplies that the gap @Code "0.2i" used above is between
Xcolumns, not individual items in columns; a gap in the second row
Xwould therefore be redundant, and so is omitted.
X@PP
XA variant of @Code "/" called @Code "//" left-justifies
Xtwo objects instead of merging their marks.
X@PP
XBy enclosing an object in braces, it is possible to override the
Xbraces @Index { Braces }
Xset precedences. Here is another expression for the table
Xabove, in which the columns are formed first:
X@ID @Code {
X |1m "{ USA" |1m "/0.1i" |1m "Washington }"
X/1vx "|0.2i" | "{ Australia" | "/" | "Canberra }"
X}
XBraces have no effect other than to alter the grouping.
X@PP
X@I {Paragraph breaking} occurs when an object is too wide to fit
Xparagraph.breaking @Index { Paragraph breaking }
Xinto the space available to it; by breaking its paragraphs into lines,
Xits width is reduced to an acceptable amount. The available
Xspace is determined by the @@Wide symbol, whose form is
X@ID {
X@I length @@Wide @I object
X}
Xand whose result is the given object modified to have exactly the given
Xlength. For example, the expression
X@ID @Code {
X"5i @Wide {"
X"Macbeth was very ambitious. This led him to wish to become"
X"king of Scotland. The witches told him that this wish of"
X"his would come true. The king of Scotland at this time was"
X"Duncan. Encouraged by his wife, Macbeth murdered Duncan. He"
X"was thus enabled to succeed Duncan as king. (51 words)"
X"|0.5i"
X"Encouraged by his wife, Macbeth achieved his ambition and"
X"realized the prediction of the witches by murdering Duncan"
X"and becoming king of Scotland in his place. (26 words)"
X"}"
X}
Xhas for its result the following five inch wide object [{@Ref strunk79}]:
X@ID {
X5i @Wide {
XMacbeth was very ambitious. This led him to wish to become king
Xof Scotland. The witches told him that this wish of his would
Xcome true. The king of Scotland at this time was Duncan. Encouraged
Xby his wife, Macbeth murdered Duncan. He was thus enabled to succeed
XDuncan as king. (51 words)
X|0.5i
XEncouraged by his wife, Macbeth achieved his ambition and realized
Xthe prediction of the witches by murdering Duncan and becoming king of
XScotland in his place. (26 words)
X}
X}
XA paragraph of text can be included anywhere, and it will be broken
Xautomatically if necessary to fit the available space. The spaces
Xbetween words are converted by Lout into concatenation symbols.
X@PP
XThese are the most significant of Lout's object-building symbols. There
Xare others, for changing fonts, controlling paragraph breaking, printing
Xgraphical objects like boxes and circles, and so on, but
Xthey do not add anything new in principle.
X@End @Section
END_OF_FILE
if test 6589 -ne `wc -c <'lout/doc/tr.lout/ch1.01'`; then
echo shar: \"'lout/doc/tr.lout/ch1.01'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch1.01'
fi
if test -f 'lout/z02.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/z02.c'\"
else
echo shar: Extracting \"'lout/z02.c'\" \(23481 characters\)
sed "s/^X//" >'lout/z02.c' <<'END_OF_FILE'
X/*@z02.c:Lexical Analyser:LexInit(), LexGetToken()@***************************/


X/* */
X/* LOUT: A HIGH-LEVEL LANGUAGE FOR DOCUMENT FORMATTING (VERSION 2.03) */
X/* COPYRIGHT (C) 1993 Jeffrey H. Kingston */
X/* */
X/* Jeffrey H. Kingston (je...@cs.su.oz.au) */
X/* Basser Department of Computer Science */
X/* The University of Sydney 2006 */
X/* AUSTRALIA */
X/* */
X/* This program is free software; you can redistribute it and/or modify */
X/* it under the terms of the GNU General Public License as published by */
X/* the Free Software Foundation; either version 1, or (at your option) */
X/* any later version. */
X/* */
X/* This program is distributed in the hope that it will be useful, */
X/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
X/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
X/* GNU General Public License for more details. */
X/* */
X/* You should have received a copy of the GNU General Public License */
X/* along with this program; if not, write to the Free Software */
X/* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
X/* */

X/* FILE: z02.c */
X/* MODULE: Lexical Analyser */
X/* EXTERNS: LexLegalName(), LexInit(), LexPush(), LexPop(), */
X/* LexNextTokenPos(), LexGetToken() */
X/* */
X/* Implementation note: this fast and cryptic lexical analyser is adapted */
X/* from Waite, W. M.: The Cost of Lexical Analysis, in Software - Practice */
X/* and Experience, v16, pp473-488 (May 1986). */


X/* */
X/*****************************************************************************/
X#include "externs"
X

X#define BUFFER_SIZE 8192 /* size of buffer for block read */
X
X#define WEIRD 0 /* unknown character type */
X#define LETTER 1 /* letter type */
X#define SPECIAL 2 /* special type */
X#define QUOTE 3 /* quoted string delimiter type */
X#define ESCAPE 4 /* escape character inside strings */
X#define COMMENT 5 /* comment delimiter type */
X#define CSPACE 6 /* space character type */
X#define TAB 7 /* tab character type */
X#define NEWLINE 8 /* newline character type */
X#define ENDFILE 9 /* end of file character type */
X
Xstatic unsigned char chtbl[256]; /* character type table */
X
X/* state variables of lexical analyser */
Xstatic unsigned char *chpt; /* pointer to current text character */
Xstatic unsigned char *frst; /* address of buffer's 1st character */
Xstatic unsigned char *limit; /* just past last char in buffer */
Xstatic unsigned char *buf; /* the character buffer start pos */
Xstatic int blksize; /* size of block read; others too */
Xstatic unsigned char *startline; /* position in buff of last newline */
Xstatic FILE_NUM this_file; /* number of currently open file */
Xstatic FILE *fp; /* current input file */
Xstatic FILE_POS file_pos; /* current file position */
Xstatic short ftype; /* the type of the current file */
Xstatic OBJECT next_token; /* next token if already read */
Xstatic int offset; /* where to start reading in file */
Xstatic unsigned char *mem_block; /* file buffer */
X
Xstatic int top_stack; /* top of lexical analyser stack */
Xstatic struct {
X unsigned char *chpt; /* pointer to current text character */
X unsigned char *frst; /* address of buffer's 1st character */
X unsigned char *limit; /* just past last char in buffer */
X unsigned char *buf; /* the character buffer start pos */
X int blksize; /* size of block read; others too */
X unsigned char *startline; /* position in buff of last newline */
X FILE_NUM this_file; /* number of currently open file */
X FILE *fp; /* current input file */
X FILE_POS file_pos; /* current file position */
X short ftype; /* the type of the current file */
X OBJECT next_token; /* next token if already read */
X int offset; /* where to start reading in file */
X unsigned char *mem_block; /* file buffer */
X} lex_stack[MAX_LEX_STACK];


X
X
X/*@@**************************************************************************/
X/* */

X/* BOOLEAN LexLegalName(str) */
X/* */
X/* Check whether str is a valid name for a symbol table entry. */
X/* Valid names have the BNF form */
X/* */
X/* <name> ::= <letter> { <letter> } */
X/* <name> ::= <special> { <special> } */
X/* <name> ::= <escape> { <letter> } */
X/* */
X/* The third form is inaccessible to users and is for internal use only. */
X/* */
X/*****************************************************************************/
X
XBOOLEAN LexLegalName(str)
Xunsigned char *str;
X{ int i; BOOLEAN res;
X debug1(DLA, DDD, "LexLegalName( %s )", str);
X if( chtbl[str[0]] == QUOTE ) FontStripQuotes(str, no_fpos);
X switch( chtbl[str[0]] )
X {
X case ESCAPE:
X case LETTER:
X
X for( i = 1; chtbl[str[i]] == LETTER; i++ );
X res = str[i] == '\0';
X break;
X
X
X case SPECIAL:
X
X for( i = 1; chtbl[str[i]] == SPECIAL; i++ );
X res = str[i] == '\0';


X break;
X
X
X default:
X

X res = FALSE;
X break;
X
X }
X debug1(DLA, DDD, "LexLegalName returning %s", bool(res));
X return res;
X} /* end LexLegalName */


X
X
X/*****************************************************************************/
X/* */

X/* LexInit() */
X/* */
X/* Initialise character types. Those not touched are 0 (WEIRD). */
X/* The function initchtbl() assists in initializing the chtbl. */
X/* */
X/*****************************************************************************/
X
Xstatic initchtbl(val, str)
Xint val; unsigned char *str;
X{ int i;
X for( i = 0; str[i] != '\0'; i++ )
X chtbl[ str[i] ] = val;
X} /* end initchtbl */
X
XLexInit()
X{ initchtbl( LETTER, "abcdefghijklmnopqrstuvwxyz" );
X initchtbl( LETTER, "ABCDEFGHIJKLMNOPQRSTUVWXYZ" );
X initchtbl( LETTER, "@" );
X initchtbl( SPECIAL, "!$%^&*()_-+=~`{[}]:;'|<,.>?/" );
X initchtbl( SPECIAL, "0123456789" );
X initchtbl( QUOTE, "\"" );
X initchtbl( ESCAPE, "\\" );
X initchtbl( COMMENT, "#" );
X initchtbl( CSPACE, " " );
X initchtbl( TAB, "\t" );
X initchtbl( NEWLINE, "\n" );
X chtbl['\0'] = ENDFILE;
X} /* end LexInit */


X
X
X/*@@**************************************************************************/
X/* */

X/* setword(res, file_pos, str, len) */
X/* */
X/* Set variable res to a WORD token containing string str, etc. */
X/* */
X/*****************************************************************************/
X
X#define setword(res, file_pos, str, len) \
X{ res = NewWord(len, &file_pos); \
X FposCopy(fpos(res), file_pos); \
X for( c = 0; c < len; c++ ) string(res)[c] = str[c]; \
X string(res)[c] = '\0'; \
X}


X
X
X/*****************************************************************************/
X/* */

X/* LexPush(x, offs, ftype) */
X/* LexPop() */
X/* */
X/* Switch lexical analyser to or from (LexPop) reading from the file */
X/* sequence whose first file is x (the other files are obtained from */
X/* NextFile). The first file of the sequence is to be fseeked to offs. */
X/* When the sequence is exhausted, ftype determines how to continue: */
X/* */
X/* ftype action */
X/* */
X/* SOURCE_FILE last input file ends, return @End \Input */
X/* DATABASE_FILE database file, return @End \Input */
X/* INCLUDE_FILE include file, must pop lexical analyser and continue */
X/* */
X/*****************************************************************************/
X
XLexPush(x, offs, ftyp)
XFILE_NUM x; int offs; int ftyp;
X{ char *malloc();
X debug3(DLA, D, "LexPush(%s, %d, %s)", FileName(x), offs,
X ftyp==SOURCE_FILE ? "source" : ftyp==INCLUDE_FILE ? "include" : "database");
X if( top_stack >= MAX_LEX_STACK - 1 )
X Error(FATAL, PosOfFile(x), "%s or %s file %s too deeply nested",
X KW_INCLUDE, KW_DATABASE, FileName(x));
X if( top_stack >= 0 ) /* save current state */
X { lex_stack[top_stack].chpt = chpt;
X lex_stack[top_stack].frst = frst;
X lex_stack[top_stack].limit = limit;
X lex_stack[top_stack].buf = buf;
X lex_stack[top_stack].blksize = blksize;
X lex_stack[top_stack].startline = startline;
X lex_stack[top_stack].this_file = this_file;
X lex_stack[top_stack].fp = fp;
X lex_stack[top_stack].ftype = ftype;
X lex_stack[top_stack].next_token = next_token;
X lex_stack[top_stack].offset = offset;
X lex_stack[top_stack].mem_block = mem_block;
X FposCopy( lex_stack[top_stack].file_pos, file_pos );
X }
X top_stack += 1;
X mem_block = (unsigned char *) malloc(MAX_LINE + BUFFER_SIZE + 2);
X if( mem_block == NULL ) Error(FATAL, PosOfFile(x),
X "run out of memory when opening file %s", FileName(x));
X buf = chpt = &mem_block[MAX_LINE];
X this_file = x;
X offset = offs;
X ftype = ftyp;
X next_token = nil;
X *chpt = '\0';
X fp = null;
X} /* end LexPush */
X
XLexPop()
X{ debug0(DLA, D, "LexPop()");
X assert( top_stack > 0, "LexPop: top_stack <= 0!" );
X if( fp != null ) fclose(fp);
X top_stack--;
X free(mem_block);
X mem_block = lex_stack[top_stack].mem_block;
X chpt = lex_stack[top_stack].chpt;
X frst = lex_stack[top_stack].frst;
X limit = lex_stack[top_stack].limit;
X buf = lex_stack[top_stack].buf;
X blksize = lex_stack[top_stack].blksize;
X startline = lex_stack[top_stack].startline;
X this_file = lex_stack[top_stack].this_file;
X fp = lex_stack[top_stack].fp;
X ftype = lex_stack[top_stack].ftype;
X next_token = lex_stack[top_stack].next_token;
X offset = lex_stack[top_stack].offset;
X FposCopy( file_pos, lex_stack[top_stack].file_pos );
X} /* end LexPop */


X
X
X/*@@**************************************************************************/
X/* */

X/* long LexNextTokenPos() */
X/* */
X/* Equivalent to ftell() on the current lex file. Complicated because */
X/* the file is buffered. */
X/* */
X/*****************************************************************************/
X
Xlong LexNextTokenPos()
X{ long res;
X if( next_token != nil )
X Error(FATAL, &fpos(next_token), "illegal macro invokation in database");
X res = ftell(fp) - (limit - chpt) - (buf - frst);
X debug1(DLA, D, "LexNextTokenPos() returning %ld", res);
X return res;
X}


X
X
X/*****************************************************************************/
X/* */

X/* static srcnext() */
X/* */
X/* Move to new line of input file. May need to recharge buffer. */
X/* */
X/*****************************************************************************/
X
Xstatic srcnext()
X{ register unsigned char *col;
X debug4(DLA, DDD, "srcnext(); buf: %d, chpt: %d, frst: %d, limit: %d",
X buf - mem_block, chpt - mem_block, frst - mem_block, limit - mem_block);
X
X /* if time to transfer last line to area preceding buffer, do so */
X if( blksize != 0 && chpt < limit )
X { debug0(DLA, DDD, "srcnext: transferring.");
X col = buf;
X while( (*--col = *--limit) != '\n' );
X frst = col + 1;
X limit++;
X blksize = 0;
X }
X
X /* if buffer is empty, read next block */
X /*** changed by JK 9/92 from "if( chpt == limit )" to fix long lines bug */
X if( chpt >= limit )
X { if( chpt > limit )
X { col_num(file_pos) = 1;
X Error(FATAL, &file_pos, "line is too long (or final newline missing)");
X }
X chpt = frst;
X blksize = fread( (char *) buf, sizeof(char), BUFFER_SIZE, fp);
X debug4(DLA, D, "srcnext: %d = fread(0x%x, %d, %d, fp)",
X blksize, buf, sizeof(char), BUFFER_SIZE);
X frst = buf;
X limit = buf + blksize;
X *limit = '\n';
X }
X
X /* if nothing more to read, make this clear */
X if( chpt >= limit )
X { debug0(DLA, DDD, "srcnext: nothing more to read");
X chpt = limit = buf;
X *limit = '\0';
X }
X debug4(DLA, DDD, "srcnext returning; buf: %d, chpt: %d, frst: %d, limit: %d",
X buf - mem_block, chpt - mem_block, frst - mem_block, limit - mem_block);
X} /* end srcnext */


X
X
X/*@@**************************************************************************/
X/* */

X/* OBJECT LexGetToken() */
X/* */
X/* Get next token from input. Look it up in symbol table. */
X/* */
X/*****************************************************************************/
X
XOBJECT LexGetToken()
X{
X unsigned char *startpos; /* where the latest token started */
X register unsigned char *p; /* pointer to current input char */
X register int c; /* temporary character (really char) */
X OBJECT res; /* result token */
X int vcount, hcount; /* no. of newlines and spaces seen */
X
X if( next_token != nil )
X { next_token = Delete(res = next_token, PARENT);
X debug2(DLA, DD, "LexGetToken%s (in macro) returning %s",
X EchoFilePos(&file_pos), EchoToken(res));


X return res;
X }
X

X res = nil; p = chpt;
X vcount = hcount = 0;
X do switch( chtbl[*p++] )
X {
X case WEIRD:
X
X debug1(DLA, DDD, "LexGetToken%s: WEIRD", EchoFilePos(&file_pos) );
X col_num(file_pos) = (startpos = p-1) - startline;
X Error(WARN, &file_pos, "unknown character (%o octal)", *startpos);
X break;
X
X
X case ESCAPE:
X
X col_num(file_pos) = (startpos = p-1) - startline;
X Error(WARN, &file_pos, "character %c outside quoted string", *startpos);
X break;
X
X
X case COMMENT:
X
X debug1(DLA, DDD, "LexGetToken%s: comment", EchoFilePos(&file_pos));
X while( (c = *p++) != '\n' && c != '\0' );
X --p;
X break;
X
X
X case CSPACE:
X
X hcount++;
X break;
X
X
X case TAB:
X
X hcount += 8;
X break;
X
X
X case NEWLINE:
X
X chpt = p; srcnext();
X line_num(file_pos)++;
X col_num(file_pos) = 0;
X vcount++; hcount = 0;
X startline = (p = chpt) - 1;
X break;
X
X
X case ENDFILE:
X
X /* close current file, if any */
X debug0(DLA, DDD, "LexGetToken: endfile");


X if( fp != null )

X { fclose(fp); fp = null;
X this_file = ftype == SOURCE_FILE ? NextFile(this_file) : NO_FILE;
X }
X
X /* open next file */
X while( this_file != NO_FILE )
X { file_num(file_pos) = this_file;
X line_num(file_pos) = 1;
X col_num(file_pos) = 0;
X fp = OpenFile(this_file, FALSE);
X if( fp != null ) break;
X Error(WARN, &file_pos, "cannot open %s", FileName(this_file));
X this_file = ftype == SOURCE_FILE ? NextFile(this_file) : NO_FILE;
X }


X if( fp != null )

X { if( offset != 0 )
X { fseek(fp, (long) offset, 0);
X offset = 0L;
X }
X frst = limit = chpt = buf;
X blksize = 0; srcnext();
X startline = (p = chpt) - 1;
X hcount = 0;
X }
X
X /* no next file, so take continuation */
X else switch( ftype )
X {
X case SOURCE_FILE:
X case DATABASE_FILE:
X
X /* input ends with "@End \Input" */
X res = NewToken(END, &file_pos, 0, 0, END_PREC, nil);
X next_token = NewToken(CLOSURE, &file_pos, 0,0, NO_PREC, StartSym);
X --p; startline = p;
X break;
X
X case INCLUDE_FILE:
X
X LexPop();
X (p = chpt) - 1;
X hcount = 0;
X break;
X
X default: Error(INTERN, no_fpos, "ftype!");


X
X } /* end switch */

X break;
X
X
X case SPECIAL:
X
X col_num(file_pos) = (startpos = p-1) - startline;
X while( chtbl[*p++] == SPECIAL );
X c = p - startpos - 1;
X do
X { res = SearchSym(startpos, c);
X --c; --p;
X } while( c > 0 && res == nil );
X goto MORE; /* 7 lines down */
X break;
X
X
X case LETTER:
X
X col_num(file_pos) = (startpos = p-1) - startline;
X while( chtbl[*p++] == LETTER ); --p;
X res = SearchSym(startpos, p - startpos);
X
X MORE: if( res == nil )
X { setword(res, file_pos, startpos, p-startpos);
X }
X else if( type(res) == MACRO )
X { if( recursive(res) )
X { Error(WARN, &file_pos, "recursion in macro");
X setword(res, file_pos, startpos, p-startpos);
X }
X else
X { res = CopyTokenList( sym_body(res), &file_pos );
X if( res != nil ) next_token = Delete(res, PARENT);
X else hcount = 0;
X }
X }
X else if( predefined(res) == 0 )
X { res = NewToken(CLOSURE, &file_pos, 0, 0, precedence(res), res);
X }
X else if( is_filecom(predefined(res)) )
X { OBJECT t, fname, symbs = nil; FILE_NUM fnum;
X chpt = p;
X t = LexGetToken();
X p = chpt;
X if( predefined(res)==DATABASE || predefined(res) == SYS_DATABASE )
X { symbs = New(ACAT);
X while( type(t) == CLOSURE )
X { Link(symbs, t);
X chpt = p; t = LexGetToken(); p = chpt;
X }
X }
X if( type(t) != LBR )
X { Error(WARN, &fpos(t), "%s expected after %s", KW_LBR, SymName(res));
X Dispose(t);
X res = nil;


X break;
X }
X Dispose(t);

X chpt = p; fname = LexGetToken(); p = chpt;
X if( type(fname) != WORD )
X { Error(WARN, &fpos(fname), "name of %s file expected here",
X SymName(res));
X Dispose(fname);
X res = nil;
X break;
X }
X chpt = p; t = LexGetToken(); p = chpt;
X if( type(t) != RBR )
X { Error(WARN, &fpos(t), "%s expected here", KW_RBR);
X Dispose(t);
X res = nil;


X break;
X }
X Dispose(t);

X if( string(fname)[0] == '"' )
X FontStripQuotes(string(fname), &fpos(fname));
X if( predefined(res)==INCLUDE || predefined(res) == SYS_INCLUDE )
X { fnum = DefineFile(fname, INCLUDE_FILE,
X predefined(res)==INCLUDE ? INCLUDE_PATH : SYSINCLUDE_PATH);
X chpt = p;
X LexPush(fnum, 0, INCLUDE_FILE);
X res = LexGetToken();
X p = chpt;
X }
X else if( predefined(res)==DATABASE || predefined(res)==SYS_DATABASE )
X { OBJECT db, ifname;
X if( Down(symbs) == symbs )
X Error(FATAL, &fpos(fname), "symbols missing after %s",
X predefined(res) == DATABASE ? KW_DATABASE : KW_SYSDATABASE);
X if( strlen(string(fname)) + strlen(INDEX_SUFFIX) >= MAX_LINE )
X Error(FATAL,&file_pos, "file name %s is too long", string(fname));
X ifname = MakeWordTwo(string(fname), INDEX_SUFFIX, &fpos(fname));
X Dispose(fname);
X fnum = DefineFile(ifname, INDEX_FILE,
X predefined(res)==DATABASE ? DATABASE_PATH : SYSDATABASE_PATH );
X db = DbLoad(fnum, string(ifname), &fpos(ifname), TRUE, symbs);
X res = nil;
X }
X else if( predefined(res)==PREPEND || predefined(res)==SYS_PREPEND )
X { fnum = DefineFile(fname, PREPEND_FILE,
X predefined(res) == PREPEND ? INCLUDE_PATH : SYSINCLUDE_PATH);
X res = nil;
X }
X else Error(INTERN, &file_pos, "filecom!");
X }
X else res = NewToken(predefined(res), &file_pos,0,0,precedence(res),res);
X break;
X
X
X case QUOTE:
X
X col_num(file_pos) = (startpos = p-1) - startline;
X do switch( chtbl[*p++] )
X {
X case WEIRD: Error(FATAL, &file_pos, "unknown character (%c octal)",
X *(p-1));
X break;
X
X case ESCAPE: if( chtbl[*p] == NEWLINE || chtbl[*p] == ENDFILE )
X { Error(WARN, &file_pos, "unterminated string");
X *(p-1) = '"';
X setword(res, file_pos, startpos, p-startpos);
X }
X else p++;
X break;
X
X case NEWLINE:
X case ENDFILE: --p;
X Error(WARN, &file_pos, "unterminated string");
X setword(res, file_pos, startpos, p-startpos);
X break;
X
X case TAB: Error(WARN, &file_pos, "tab character in string");
X *(p-1) = ' ';
X break;
X
X case CSPACE:
X case COMMENT:
X case SPECIAL:
X case LETTER: break;
X
X case QUOTE: setword(res, file_pos, startpos, p-startpos);
X break;
X
X default: Error(INTERN, &file_pos, "LexGetToken: quoted string");
X break;
X
X } while( res == nil );
X break;
X
X
X default:
X
X Error(INTERN, &file_pos, "LexGetToken: bad chtbl[]");
X break;
X
X } while( res == nil );
X
X if( p - startline >= MAX_LINE )
X { col_num(file_pos) = 1;
X Error(FATAL, &file_pos, "line is too long (or final newline missing)");
X }
X
X chpt = p;
X vspace(res) = vcount;
X hspace(res) = hcount;
X debug4(DLA, DD, "LexGetToken%s returning %s %s (@%d)",
X EchoFilePos(&file_pos), Image(type(res)), EchoToken(res), (int) res);
X return res;
X} /* end LexGetToken */
END_OF_FILE
if test 23481 -ne `wc -c <'lout/z02.c'`; then
echo shar: \"'lout/z02.c'\" unpacked with wrong size!
fi
# end of 'lout/z02.c'
fi
if test -f 'lout/z15.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/z15.c'\"
else
echo shar: Extracting \"'lout/z15.c'\" \(23826 characters\)
sed "s/^X//" >'lout/z15.c' <<'END_OF_FILE'
X/*@z15.c:Size Constraints:EchoConstraint(), Constrained()@********************/


X/* */
X/* LOUT: A HIGH-LEVEL LANGUAGE FOR DOCUMENT FORMATTING (VERSION 2.03) */
X/* COPYRIGHT (C) 1993 Jeffrey H. Kingston */
X/* */
X/* Jeffrey H. Kingston (je...@cs.su.oz.au) */
X/* Basser Department of Computer Science */
X/* The University of Sydney 2006 */
X/* AUSTRALIA */
X/* */
X/* This program is free software; you can redistribute it and/or modify */
X/* it under the terms of the GNU General Public License as published by */
X/* the Free Software Foundation; either version 1, or (at your option) */
X/* any later version. */
X/* */
X/* This program is distributed in the hope that it will be useful, */
X/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
X/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
X/* GNU General Public License for more details. */
X/* */
X/* You should have received a copy of the GNU General Public License */
X/* along with this program; if not, write to the Free Software */
X/* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
X/* */

X/* FILE: z15.c */
X/* MODULE: Size Constraints */
X/* EXTERNS: EchoConstraint(), Constrained(), DebugConstrained() */
X/* */
X/*****************************************************************************/
X#include <math.h>
X#ifndef M_PI
X#define M_PI 3.1415926535897931160E0
X#endif
X
X#include "externs"


X
X
X/*****************************************************************************/
X/* */

X/* MinConstraint(xc, yc) */
X/* */
X/* Replace *xc by the minimum of the two constraints *xc and *yc. */
X/* */
X/*****************************************************************************/
X
XMinConstraint(xc, yc)
XCONSTRAINT *xc, *yc;
X{ bc(*xc) = min(bc(*xc), bc(*yc));
X bfc(*xc) = min(bfc(*xc), bfc(*yc));
X fc(*xc) = min(fc(*xc), fc(*yc));
X} /* end MinConstraint */


X
X
X/*****************************************************************************/
X/* */

X/* EnlargeToConstraint(b, f, c) */
X/* */
X/* Enlarge *b,*f to its largest possible value within constraint *c. */
X/* */
X/*****************************************************************************/
X
XEnlargeToConstraint(b, f, c)
XLENGTH *b, *f; CONSTRAINT *c;
X{
X *f = min(bfc(*c) - *b, fc(*c));
X} /* end EnlargeToConstraint */


X
X
X/*****************************************************************************/
X/* */

X/* ReflectConstraint(xc, yc) */
X/* */
X/* Set xc to the constraint which is yc with its back and forward reversed. */
X/* */
X/*****************************************************************************/
X
X#define ReflectConstraint(xc, yc) SetConstraint(xc, fc(yc), bfc(yc), bc(yc))


X
X
X/*@@**************************************************************************/
X/* */

X/* static SemiRotateConstraint(xc, u, v, angle, yc) */
X/* */
X/* Used by RotateConstraint to calculate one rotated constraint. */
X/* */
X/*****************************************************************************/
X
Xstatic SemiRotateConstraint(xc, u, v, angle, yc)
XCONSTRAINT *xc; LENGTH u, v; float angle; CONSTRAINT *yc;
X{ float cs, sn; unsigned char buff[20];
X ifdebug(DSC, D, sprintf(buff, "%.1f", angle * 360.0 / (2 * M_PI)));
X debug4(DSC, D, "SemiRotateConstraint(xc, %s, %s, %sd, %s",
X EchoLength(u), EchoLength(v), buff, EchoConstraint(yc));
X cs = cos(angle); sn = sin(angle);
X if( fabs(cs) < 1e-6 )
X SetConstraint(*xc, MAX_LEN, MAX_LEN, MAX_LEN);
X else
X SetConstraint(*xc,
X min(MAX_LEN, (bc(*yc) - u * sn) / cs),
X min(MAX_LEN, (bfc(*yc) - u * sn - v * sn) / cs),
X min(MAX_LEN, (fc(*yc) - v * sn) / cs) );
X debug1(DSC, D, "SemiRotateConstraint returning %s", EchoConstraint(xc));
X} /* end SemiRotateConstraint */


X
X
X/*@@**************************************************************************/
X/* */

X/* RotateConstraint(c, y, angle, hc, vc, dim) */
X/* */
X/* Take the object angle @Rotate y, which is supposed to be constrained */
X/* horizontally by hc and vertically by vc, and determine a constraint */
X/* (either horizontal or vertical, depending on dim) for y. */
X/* */
X/* The constraint returned is a trigonometric function of all these */
X/* parameters, including the present size of y in dimension 1-dim. */
X/* */
X/*****************************************************************************/
X
XRotateConstraint(c, y, angle, hc, vc, dim)
XCONSTRAINT *c; OBJECT y; LENGTH angle; CONSTRAINT *hc, *vc; int dim;
X{ CONSTRAINT c1, c2, c3, dc; float theta, psi;


X unsigned char buff[20];

X ifdebug(DSC, D, sprintf(buff, "%.1f", (float) angle / DG ));
X debug4(DSC, D, "RotateConstraint(c, y, %sd, %s, %s, %s)",
X buff, EchoConstraint(hc), EchoConstraint(vc), dimen(dim));
X
X /* work out angle in radians between 0 and 2*PI */
X theta = (float) angle * 2 * M_PI / (float) (DG * 360);
X while( theta < 0 ) theta += 2 * M_PI;
X while( theta >= 2 * M_PI ) theta -= 2 * M_PI;
X assert( 0 <= theta && theta <= 2 * M_PI, "RotateConstraint: theta!" );
X
X /* determine theta, c1, and c2 depending on which quadrant we're in */
X if( theta <= M_PI / 2.0 ) /* first quadrant */
X { theta = theta;
X CopyConstraint(c1, *hc);
X CopyConstraint(c2, *vc);
X }
X else if ( theta <= M_PI ) /* second quadrant */
X { theta -= M_PI / 2.0;
X ReflectConstraint(c1, *vc);
X CopyConstraint(c2, *hc);
X }
X else if ( theta <= 3.0 * M_PI / 2.0 ) /* third quadrant */
X { theta -= M_PI;
X ReflectConstraint(c1, *hc);
X ReflectConstraint(c2, *vc);
X }
X else /* fourth quadrant */
X { theta -= 3.0 * M_PI / 2.0;
X CopyConstraint(c1, *vc);
X ReflectConstraint(c2, *hc);
X }
X psi = M_PI / 2.0 - theta;
X debug2(DSC, D, " c1: %s; c2: %s", EchoConstraint(&c1), EchoConstraint(&c2));
X
X /* return the minimum of the two constraints, rotated */


X if( dim == COL )

X { SemiRotateConstraint(c, back(y, ROW), fwd(y, ROW), theta, &c1);
X ReflectConstraint(c3, c2);
X SemiRotateConstraint(&dc, fwd(y, ROW), back(y, ROW), psi, &c3);
X MinConstraint(c, &dc);
X }
X else
X { SemiRotateConstraint(c, back(y, COL), fwd(y, COL), psi, &c1);
X SemiRotateConstraint(&dc, fwd(y, COL), back(y, COL), theta, &c2);
X MinConstraint(c, &dc);
X }
X
X debug1(DSC, D, "RotateConstraint returning %s", EchoConstraint(c));
X} /* end RotateConstraint */


X
X
X/*****************************************************************************/
X/* */

X/* InvScaleConstraint(yc, sf, xc) */
X/* */
X/* Scale constraint xc to the inverse of the scale factor sf. */
X/* */
X/*****************************************************************************/
X
XInvScaleConstraint(yc, sf, xc)
XCONSTRAINT *yc; LENGTH sf; CONSTRAINT *xc;
X{ unsigned char buff[10];
X ifdebug(DSC, D, sprintf(buff, "%.3f", (float) sf / SF));
X debug2(DSC, D, "InvScaleConstraint(yc, %s, %s)", buff, EchoConstraint(xc));
X assert( sf > 0, "InvScaleConstraint: sf <= 0!" );
X bc(*yc) = bc(*xc) == MAX_LEN ? MAX_LEN : min(MAX_LEN, bc(*xc) * SF / sf);
X bfc(*yc) = bfc(*xc) == MAX_LEN ? MAX_LEN : min(MAX_LEN, bfc(*xc) * SF / sf);
X fc(*yc) = fc(*xc) == MAX_LEN ? MAX_LEN : min(MAX_LEN, fc(*xc) * SF / sf);
X debug1(DSC, D, "InvScaleConstraint returning %s", EchoConstraint(yc));
X} /* end InvScaleConstraint */


X
X
X/*@@**************************************************************************/
X/* */

X/* static CatConstrained(x, xc, ratm, y, dim) */
X/* */
X/* Calculate the size constraint of object x, as for Constrained below. */
X/* y is the enclosing VCAT etc. object; ratm is TRUE if a ^ lies after */
X/* x anywhere. dim is COL or ROW. */
X/* */
X/* The meaning of the key variables is as follows: */
X/* */
X/* be The amount by which back(x, dim) can increase from zero */
X/* without having any impact on size(y, dim). Thereafter, */
X/* any increase causes an equal increase in size(y, dim). */
X/* */
X/* fe The amount by which fwd(x, dim) can increase from zero */
X/* without having any impact on size(y, dim). Thereafter, */
X/* any increase causes an equal increase in size(y, dim). */
X/* */
X/* backy, The value that back(y, dim) and fwd(y, dim) would have if x */
X/* fwdy was definite with size 0,0. They will in general be larger */
X/* than the present values if x is indefinite, and smaller */
X/* if x is definite, although it depends on marks and gaps. */
X/* */
X/*****************************************************************************/
X
Xstatic CatConstrained(x, xc, ratm, y, dim)
XOBJECT x; CONSTRAINT *xc; BOOLEAN ratm; OBJECT y; int dim;
X{ int side; /* x's side of add-set y: BACK, ON or FWD */
X CONSTRAINT yc; /* constraints on y */
X LENGTH backy, fwdy; /* back(y), fwd(y) would be if x was (0, 0) */
X LENGTH be, fe; /* amount back(x), fwd(x) can be for free */
X LENGTH beffect, feffect; /* scratch variables for calculations */
X LENGTH seffect; /* scratch variables for calculations */
X OBJECT link, sg, pg; /* link to x, its successor and predecessor */
X OBJECT prec_def, sd; /* definite object preceding (succeeding) x */
X int tb, tbf, tf, tbc, tbfc, tfc, mxy, myz;
X
X Constrained(y, &yc, dim);
X if( constrained(yc) )
X {
X /* find x's link, and its neighbours and their links */
X link = UpDim(x, dim);
X
X /* find neighbouring definite objects, if any */
X SetNeighbours(link, ratm, &pg, &prec_def, &sg, &sd, &side);
X
X /* amount of space available at x without changing the size of y */
X be = pg == nil ? 0 : ExtraGap(fwd(prec_def, dim), 0, &gap(pg), BACK);
X fe = sg == nil ? 0 : ExtraGap(0, back(sd, dim), &gap(sg), FWD);
X
X if( is_indefinite(type(x)) )
X {
X /* insert two lengths and delete one */
X beffect = pg == nil ? 0 : MinGap(fwd(prec_def, dim), 0, 0, &gap(pg));
X feffect = sg == nil ? 0 : MinGap(0, back(sd,dim), fwd(sd,dim), &gap(sg));
X seffect = pg == nil ?
X sg == nil ? 0 : back(sd, dim) :
X sg == nil ? fwd(prec_def, dim) :
X MinGap(fwd(prec_def, dim), back(sd, dim), fwd(sd, dim), &gap(sg));
X
X switch( side )
X {
X case BACK: backy = back(y, dim) + beffect + feffect - seffect;
X fwdy = fwd(y, dim);
X break;
X
X case ON: /* must be first, other cases prohibited */
X backy = 0;
X fwdy = fwd(y, dim) + feffect;
X break;
X
X case FWD: backy = back(y, dim);
X fwdy = fwd(y, dim) + beffect + feffect - seffect;


X break;
X }
X }
X

X else /* x is definite */
X
X { beffect = pg == nil ? back(x, dim) :
X MinGap(fwd(prec_def, dim), back(x,dim), fwd(x,dim), &gap(pg)) -
X MinGap(fwd(prec_def, dim), 0, 0, &gap(pg));
X
X feffect = sg == nil ? fwd(x, dim) :
X MinGap(fwd(x, dim), back(sd, dim), fwd(sd, dim), &gap(sg)) -
X MinGap(0, back(sd, dim), fwd(sd, dim), &gap(sg));
X
X switch( side )
X {
X case BACK: backy = back(y, dim) - beffect - feffect;
X fwdy = fwd(y, dim);
X break;
X
X case ON: backy = back(y, dim) - beffect;
X fwdy = fwd(y, dim) - feffect;
X break;
X
X case FWD: backy = back(y, dim);
X fwdy = fwd(y, dim) - beffect - feffect;


X break;
X }
X }
X

X debug5(DSC, DDD, "side: %s, backy: %s, fwdy: %s, be: %s, fe: %s",
X Image(side), EchoLength(backy), EchoLength(fwdy),
X EchoLength(be), EchoLength(fe) );
X
X if( !FitsConstraint(backy, fwdy, yc) )
X SetConstraint(*xc, -1, -1, -1);
X else switch( side )
X {
X
X case BACK:
X
X tbc = bc(yc) == MAX_LEN ? MAX_LEN : bc(yc) - backy;
X tbfc = bfc(yc) == MAX_LEN ? MAX_LEN : bfc(yc) - backy - fwdy;
X mxy = min(tbc, tbfc);
X tb = min(MAX_LEN, be + mxy);
X tbf = min(MAX_LEN, be + fe + mxy);
X tf = min(MAX_LEN, fe + mxy);
X SetConstraint(*xc, tb, tbf, tf);
X break;
X
X
X case ON:
X
X tbc = bc(yc) == MAX_LEN ? MAX_LEN : bc(yc) - backy;
X tbfc = bfc(yc) == MAX_LEN ? MAX_LEN : bfc(yc) - backy - fwdy;
X tfc = fc(yc) == MAX_LEN ? MAX_LEN : fc(yc) - fwdy;
X mxy = min(tbc, tbfc);
X myz = min(tfc, tbfc);
X tb = min(MAX_LEN, be + mxy);
X tbf = min(MAX_LEN, be + fe + tbfc);
X tf = min(MAX_LEN, fe + myz);
X SetConstraint(*xc, tb, tbf, tf);
X break;
X
X
X case FWD:
X
X tfc = fc(yc) == MAX_LEN ? MAX_LEN : fc(yc) - fwdy;
X tbfc = bfc(yc) == MAX_LEN ? MAX_LEN : bfc(yc) - backy - fwdy;
X mxy = min(tfc, tbfc);
X tb = min(MAX_LEN, be + mxy);
X tbf = min(MAX_LEN, be + fe + mxy);
X tf = min(MAX_LEN, fe + mxy);
X SetConstraint(*xc, tb, tbf, tf);
X break;
X
X }
X } /* end if( constrained ) */
X else SetConstraint(*xc, MAX_LEN, MAX_LEN, MAX_LEN);
X} /* end CatConstrained */


X
X
X/*@@**************************************************************************/
X/* */

X/* Constrained(x, xc, dim) */
X/* */
X/* Calculate the size constraint of object x, and return it in *xc. */
X/* */
X/*****************************************************************************/
X
XConstrained(x, xc, dim)
XOBJECT x; CONSTRAINT *xc; int dim;
X{ OBJECT y, link, lp, rp, z, tlink, g;
X CONSTRAINT yc, hc, vc;
X BOOLEAN ratm;
X LENGTH xback, xfwd;
X int tb, tf, tbf, tbc, tfc;
X debug2(DSC, DD, "[ Constrained( %s, xc, %s )", EchoObject(null,x),dimen(dim));
X assert( Up(x) != x, "Constrained: x has no parent!" );
X
X /* find x's parent, y */
X link = UpDim(x, dim); ratm = FALSE;
X for( tlink = NextDown(link); type(tlink) == LINK; tlink = NextDown(tlink) )
X { Child(g, tlink);
X if( type(g) == GAP_OBJ && mark(gap(g)) ) ratm = TRUE;
X }
X y = tlink;
X debug1(DSC, DDD, "x's parent y = %s", Image(type(y)));
X ifdebug(DSC, DDD, EchoObject(stderr, y));
X
X switch( type(y) )
X {
X
X case GRAPHIC:


X case ONE_COL:
X case ONE_ROW:

X case HCONTRACT:
X case VCONTRACT:
X case HEXPAND:
X case VEXPAND:
X case PADJUST:
X case HADJUST:
X case VADJUST:

X case SPLIT:
X
X Constrained(y, xc, dim);
X break;
X
X
X case VSCALE:
X case HSCALE:
X
X if( (dim == COL) == (type(y) == HSCALE) )
X SetConstraint(*xc, MAX_LEN, MAX_LEN, MAX_LEN);
X else Constrained(y, xc, dim);
X break;
X
X
X case SCALE:
X
X Constrained(y, &yc, dim);
X InvScaleConstraint(xc,
X dim == COL ? bc(constraint(y)) : fc(constraint(y)), &yc);
X break;
X
X
X case ROTATE:
X
X Constrained(y, &hc, COL);
X Constrained(y, &vc, ROW);
X RotateConstraint(xc, x, sparec(constraint(y)), &hc, &vc, dim);
X break;
X
X


X case WIDE:
X case HIGH:
X

X Constrained(y, xc, dim);
X if( (type(y)==WIDE) == (dim==COL) )
X MinConstraint(xc, &constraint(y));
X break;
X
X
X case HEAD:
X
X if( dim == ROW ) SetConstraint(*xc, MAX_LEN, MAX_LEN, MAX_LEN);
X else
X { CopyConstraint(yc, constraint(y));
X debug1(DSC, DD, " head: %s; val is:", EchoConstraint(&yc));
X ifdebug(DSC, DD, EchoObject(stderr, y));
X goto REST_OF_HEAD; /* a few lines down */


X }
X break;
X
X

X case COL_THR:
X case ROW_THR:
X

X assert( (type(y)==COL_THR) == (dim==COL), "Constrained: COL_THR!" );
X Constrained(y, &yc, dim);
X tb = bfc(yc) == MAX_LEN ? MAX_LEN : bfc(yc) - fwd(y, dim);
X tb = min(bc(yc), tb);
X tf = bfc(yc) == MAX_LEN ? MAX_LEN : bfc(yc) - back(y, dim);
X tf = min(fc(yc), tf);
X SetConstraint(*xc, tb, bfc(yc), tf);


X break;
X
X
X case VCAT:
X case HCAT:
X case ACAT:
X

X if( (type(y)==VCAT) == (dim==ROW) )
X { CatConstrained(x, xc, ratm, y, dim);
X break;
X }
X Constrained(y, &yc, dim);
X if( !constrained(yc) ) SetConstraint(*xc, MAX_LEN, MAX_LEN, MAX_LEN);
X else
X {
X REST_OF_HEAD:
X /* let lp and rp be the links of the gaps delimiting */
X /* the components joined to x (or parent if no such) */
X for( lp = PrevDown(link); lp != y; lp = PrevDown(lp) )
X { Child(z, lp);
X if( type(z) == GAP_OBJ && !join(gap(z)) ) break;
X }
X for( rp = NextDown(link); rp != y; rp = NextDown(rp) )
X { Child(z, rp);
X if( type(z) == GAP_OBJ && !join(gap(z)) ) break;
X }
X if( lp == y && rp == y && !(type(y) == HEAD && seen_nojoin(y)) )
X {
X /* if whole object is joined, do this */
X tb = bfc(yc) == MAX_LEN ? MAX_LEN : bfc(yc) - fwd(y, dim);
X tb = min(bc(yc), tb);
X tf = bfc(yc) == MAX_LEN ? MAX_LEN : bfc(yc) - back(y, dim);
X tf = min(fc(yc), tf);
X SetConstraint(*xc, tb, bfc(yc), tf);
X }
X else
X {
X /* if // or || is present, do this */
X xback = xfwd = 0;
X for(link = NextDown(lp); link != rp; link = NextDown(link) )
X { Child(z, link);
X if( type(z) == GAP_OBJ || is_index(type(z)) ) continue;
X xback = max(xback, back(z, dim));
X xfwd = max(xfwd, fwd(z, dim));
X }
X debug2(DSC, DD, " lp != rp; xback,xfwd = %s,%s",
X EchoLength(xback), EchoLength(xfwd));
X tbf = min(bfc(yc), fc(yc));
X tbc = tbf == MAX_LEN ? MAX_LEN : tbf - xfwd;
X tfc = tbf == MAX_LEN ? MAX_LEN : tbf - xback;
X SetConstraint(*xc, tbc, tbf, tfc);


X }
X }
X break;
X
X

X default:
X
X Error(INTERN, &fpos(y), "Constrained: %s", Image(type(y)) );


X break;
X
X }
X

X debug1(DSC, DD, "] Constrained returning %s", EchoConstraint(xc));
X} /* end Constrained */


X
X
X/*@@**************************************************************************/
X/* */

X/* unsigned char *EchoConstraint(c) */
X/* */
X/* Returns a string showing constraint *c, in centimetres. */


X/* */
X/*****************************************************************************/
X#if DEBUG_ON
X

Xunsigned char *EchoConstraint(c)
XCONSTRAINT *c;
X{ static unsigned char str[2][40];
X static int i = 0;
X i = (i+1) % 2;
X sprintf(str[i], "<");
X if( bc(*c)==MAX_LEN ) sprintf(&str[i][strlen(str[i])], "INF, ");
X else sprintf(&str[i][strlen(str[i])], "%.3fc, ", (float) bc(*c)/CM);
X if( bfc(*c)==MAX_LEN ) sprintf(&str[i][strlen(str[i])], "INF, ");
X else sprintf(&str[i][strlen(str[i])], "%.3fc, ", (float) bfc(*c)/CM);
X if( fc(*c)==MAX_LEN ) sprintf(&str[i][strlen(str[i])], "INF>");
X else sprintf(&str[i][strlen(str[i])], "%.3fc>", (float) fc(*c)/CM);
X return str[i];
X} /* end EchoConstraint */


X
X
X/*****************************************************************************/
X/* */

X/* DebugConstrained(x) */
X/* */
X/* Calculate and print the constraints of all closures lying within */
X/* object x. */
X/* */
X/*****************************************************************************/
X
XDebugConstrained(x)
XOBJECT x;
X{ OBJECT y, link;
X CONSTRAINT c;
X debug1(DSC, DDD, "DebugConstrained( %s )", EchoObject(null, x) );
X switch( type(x) )
X {
X
X case CROSS:
X case ROTATE:


X case INCGRAPHIC:
X case SINCGRAPHIC:
X case GRAPHIC:

X case WORD:


X
X break;
X
X

X case CLOSURE:
X
X Constrained(x, &c, COL);
X debug2(DSC, D, "Constrained( %s, &c, COL ) = %s",
X EchoObject(null, x), EchoConstraint(&c));
X Constrained(x, &c, ROW);
X debug2(DSC, D, "Constrained( %s, &c, ROW ) = %s",
X EchoObject(null, x), EchoConstraint(&c));
X break;
X
X
X case SPLIT:
X
X link = DownDim(x, COL); Child(y, link);
X DebugConstrained(y);
X break;
X
X
X case HEAD:


X case ONE_COL:
X case ONE_ROW:

X case HCONTRACT:
X case VCONTRACT:
X case HEXPAND:
X case VEXPAND:
X case PADJUST:
X case HADJUST:
X case VADJUST:
X case HSCALE:
X case VSCALE:
X case SCALE:

X case WIDE:
X case HIGH:
X

X link = Down(x); Child(y, link);

X DebugConstrained(y);
X break;
X
X
X case COL_THR:


X case VCAT:
X case HCAT:
X case ACAT:
X

X for( link = Down(x); link != x; link =NextDown(link) )
X { Child(y, link);
X if( type(y) != GAP_OBJ && !is_index(type(y)) ) DebugConstrained(y);


X }
X break;
X
X
X default:
X

X Error(INTERN, &fpos(x), "DebugConstrained: type(x)= %s", Image(type(x)) );
X break;
X
X }
X debug0(DSC, DDD, "DebugConstrained returning.");
X} /* end DebugConstrained */
X#endif
END_OF_FILE
if test 23826 -ne `wc -c <'lout/z15.c'`; then
echo shar: \"'lout/z15.c'\" unpacked with wrong size!
fi
# end of 'lout/z15.c'
fi
if test -f 'lout/z29.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/z29.c'\"
else
echo shar: Extracting \"'lout/z29.c'\" \(23936 characters\)
sed "s/^X//" >'lout/z29.c' <<'END_OF_FILE'
X/*@z29.c:Symbol Table:SearchSym(), InsertSym(), PushScope()@******************/


X/* */
X/* LOUT: A HIGH-LEVEL LANGUAGE FOR DOCUMENT FORMATTING (VERSION 2.03) */
X/* COPYRIGHT (C) 1993 Jeffrey H. Kingston */
X/* */
X/* Jeffrey H. Kingston (je...@cs.su.oz.au) */
X/* Basser Department of Computer Science */
X/* The University of Sydney 2006 */
X/* AUSTRALIA */
X/* */
X/* This program is free software; you can redistribute it and/or modify */
X/* it under the terms of the GNU General Public License as published by */
X/* the Free Software Foundation; either version 1, or (at your option) */
X/* any later version. */
X/* */
X/* This program is distributed in the hope that it will be useful, */
X/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
X/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
X/* GNU General Public License for more details. */
X/* */
X/* You should have received a copy of the GNU General Public License */
X/* along with this program; if not, write to the Free Software */
X/* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
X/* */

X/* FILE: z29.c */
X/* MODULE: Symbol Table */
X/* EXTERNS: PushScope(), PopScope(), BodyParAllowed(), BodyParNotAll() */
X/* InitSym(), SearchSym(), InsertSym(), DeleteEverySym(), */
X/* SymName(), FullSymName(), ChildSym() */


X/* */
X/*****************************************************************************/
X#include "externs"
X

X#define MAX_STACK 40 /* size of scope stack */
X#define MAX_TAB 1024 /* size of hash table */
X#define TAB_MASK 0x3FF /* i & TAB_MASK == i % MAX_TAB */
X
X#define length(x) word_font(x)
X
Xstatic OBJECT scope[MAX_STACK]; /* the scope stack */
Xstatic BOOLEAN npars_only[MAX_STACK]; /* look for NPAR exc */
Xstatic BOOLEAN vis_only[MAX_STACK]; /* look for visibles */
Xstatic BOOLEAN body_ok[MAX_STACK]; /* look for body par */
Xstatic BOOLEAN suppress_scope; /* suppress scoping */
Xstatic BOOLEAN suppress_visible; /* suppress visible */
Xstatic int scope_top; /* scope stack top */
Xstatic struct { OBJECT f1, f2; } symtab[MAX_TAB]; /* the hash table */
X#if DEBUG_ON
Xstatic int sym_spread[MAX_TAB] = { 0 }; /* hash table spread */
Xstatic int sym_count = 0; /* symbol count */
X#endif


X
X
X/*****************************************************************************/
X/* */

X/* #define hash(str, len, val) */
X/* */
X/* Set val to the hash value of string str, which has length len. */
X/* The hash function is just the character sum mod MAX_TAB. */
X/* This definition assumes that working variables rlen and x exist. */
X/* */
X/*****************************************************************************/
X
X#define hash(str, len, val) \
X{ rlen = len; \
X x = str; \
X val = *x++; \
X while( --rlen ) val += *x++; \
X val &= TAB_MASK; \
X}


X
X
X/*****************************************************************************/
X/* */

X/* InitSym() */
X/* */
X/* Initialize the symbol table to empty. */
X/* */
X/*****************************************************************************/
X
XInitSym()
X{ int i;
X scope_top = 0;
X suppress_scope = FALSE;
X suppress_visible = FALSE;
X for( i = 0; i < MAX_TAB; i++ )
X symtab[i].f1 = symtab[i].f2 = (OBJECT) &symtab[i];
X} /* end InitSym */


X
X
X/*@@**************************************************************************/
X/* */

X/* PushScope(x, npars, vis) */
X/* PopScope() */
X/* */
X/* Add or remove an OBJECT x (which must be in the symbol table) to or from */
X/* the scope stack. If npars is TRUE, only the named parameters of x are */
X/* added to scope. If vis is TRUE, only visible locals and parameters are */
X/* added. */
X/* */
X/*****************************************************************************/
X
XPushScope(x, npars, vis)
XOBJECT x; BOOLEAN npars, vis;
X{ debug2(DST, DD, "[ PushScope( %s, %s )", SymName(x), bool(npars));
X assert( suppress_scope == FALSE, "PushScope: suppress_scope!" );
X if( scope_top >= MAX_STACK )
X { int i;
X for( i = 0; i < scope_top; i++ )
X debug2(DST, D, " scope[%2d] = %s", i, SymName(scope[i]));
X Error(INTERN, &fpos(x), "scope depth limit exceeded");
X }
X scope[scope_top] = x;
X npars_only[scope_top] = npars;
X vis_only[scope_top] = vis;
X body_ok[scope_top] = FALSE;
X scope_top++;
X} /* end PushScope */
X
XPopScope()
X{ debug0(DST, DD, "] PopScope()");
X assert( scope_top > 0, "tried to pop empty scope stack");
X assert( suppress_scope == FALSE, "PopScope: suppress_scope!" );
X scope_top--;
X} /* end PopScope */


X
X
X/*****************************************************************************/
X/* */

X/* SuppressVisible() */
X/* UnSuppressVisible() */
X/* */
X/* Suppress all scopes (so that all calls to SearchSym fail); and undo it. */
X/* */
X/*****************************************************************************/
X
XSuppressVisible()
X{ debug0(DST, DD, "[ SuppressVisible()");
X suppress_visible = TRUE;
X} /* end SuppressVisible */
X
XUnSuppressVisible()
X{ debug0(DST, DD, "] UnSuppressVisible()");
X suppress_visible = FALSE;
X} /* end UnSuppressVisible */


X
X
X/*****************************************************************************/
X/* */

X/* SuppressScope() */
X/* UnSuppressScope() */
X/* */
X/* Suppress all scopes (so that all calls to SearchSym fail); and undo it. */


X/* */
X/*****************************************************************************/
X
X

XSuppressScope()
X{ debug0(DST, DD, "[ SuppressScope()");
X suppress_scope = TRUE;
X} /* end SuppressScope */
X
XUnSuppressScope()
X{ debug0(DST, DD, "] UnSuppressScope()");
X suppress_scope = FALSE;
X} /* end UnSuppressScope */


X
X
X/*****************************************************************************/
X/* */

X/* SwitchScope(sym) */
X/* UnSwitchScope(sym) */
X/* */
X/* Switch to the scope of sym (if nil, StartSym); and switch back again. */
X/* */
X/*****************************************************************************/
X
XSwitchScope(sym)
XOBJECT sym;
X{ int i;
X OBJECT new_scopes[MAX_STACK];
X if( sym == nil ) PushScope(StartSym, FALSE, FALSE);
X else
X { i = 0;
X while( sym != StartSym )
X { new_scopes[i++] = enclosing(sym);
X sym = enclosing(sym);
X }
X while( i > 0 ) PushScope(new_scopes[--i], FALSE, FALSE);
X }
X}
X
XUnSwitchScope(sym)
XOBJECT sym;
X{ if( sym == nil ) PopScope();
X else
X { while( sym != StartSym )
X { PopScope();
X sym = enclosing(sym);


X }
X }
X}
X
X

X/*****************************************************************************/
X/* */
X/* BodyParAllowed() */
X/* BodyParNotAllowed() */
X/* */
X/* Allow or disallow invokations of the body parameter of the current tos. */
X/* */
X/*****************************************************************************/
X
XBodyParAllowed()
X{ debug0(DST, DD, "BodyParAllowed()");
X body_ok[scope_top-1] = TRUE;
X} /* end BodyParAllowed */
X
XBodyParNotAllowed()
X{ debug0(DST, DD, "BodyParNotAllowed()");
X body_ok[scope_top-1] = FALSE;
X} /* end BodyParNotAllowed */


X
X
X/*@@**************************************************************************/
X/* */

X/* OBJECT InsertSym(str, xtype, xfpos, xprecedence, indefinite, xrecursive, */
X/* xpredefined, xenclosing, xbody) */
X/* */
X/* Insert a new symbol into the table. Its string value is str. */
X/* Initialise the symbol as the parameters indicate. */
X/* Return a pointer to the new symbol. */
X/* If str is not a valid symbol name, InsertSym prints an error */
X/* message and does not insert the symbol. */
X/* */
X/*****************************************************************************/
X
XOBJECT InsertSym(str, xtype, xfpos, xprecedence, xindefinite, xrecursive,
X xpredefined, xenclosing, xbody)
Xunsigned char *str; unsigned char xtype;
XFILE_POS *xfpos; unsigned char xprecedence;
XBOOLEAN xindefinite, xrecursive; unsigned xpredefined;
XOBJECT xenclosing, xbody;
X{ register int sum, rlen;
X register unsigned char *x;
X OBJECT p, q, s, link, entry, plink; int len;
X
X debug3(DST, DD, "InsertSym( %s, %s, in %s )",
X Image(xtype), str, SymName(xenclosing));
X if( !LexLegalName(str) ) Error(WARN, xfpos, "invalid symbol name %s", str);
X
X s = New(xtype);
X FposCopy(fpos(s), *xfpos);
X has_body(s) = FALSE;
X right_assoc(s) = TRUE;
X precedence(s) = xprecedence;
X indefinite(s) = xindefinite;
X recursive(s) = xrecursive;
X predefined(s) = xpredefined;
X enclosing(s) = xenclosing;
X sym_body(s) = xbody;
X base_uses(s) = nil;
X uses(s) = nil;
X marker(s) = nil;
X cross_sym(s) = nil;
X is_extern_target(s) = FALSE;
X uses_extern_target(s) = FALSE;
X visible(s) = FALSE;
X uses_galley(s) = FALSE;
X
X uses_count(s) = 0;
X dirty(s) = FALSE;
X if( enclosing(s) != nil && type(enclosing(s)) == NPAR )
X dirty(enclosing(s)) = TRUE;
X
X has_par(s) = FALSE;
X has_lpar(s) = FALSE;
X has_rpar(s) = FALSE;
X if( is_par(type(s)) ) has_par(enclosing(s)) = TRUE;
X if( type(s) == LPAR ) has_lpar(enclosing(s)) = TRUE;
X if( type(s) == RPAR ) has_rpar(enclosing(s)) = TRUE;
X
X has_target(s) = FALSE;
X force_target(s) = FALSE;
X if( strcmp(str, KW_TARGET) != 0 ) is_target(s) = FALSE;
X else
X { is_target(s) = has_target(enclosing(s)) = TRUE;
X if( has_key(enclosing(s)) && xbody != nil && type(xbody) == CROSS )
X { if( LastDown(xbody) != Down(xbody) )
X { OBJECT sym;
X Child(sym, Down(xbody));
X if( type(sym) == CLOSURE )
X { is_extern_target(actual(sym)) = TRUE;
X uses_extern_target(actual(sym)) = TRUE;


X }
X }
X }
X }
X

X has_tag(s) = FALSE;
X if( strcmp(str, KW_TAG) != 0 ) is_tag(s) = FALSE;
X else is_tag(s) = has_tag(enclosing(s)) = dirty(enclosing(s)) = TRUE;
X
X has_key(s) = FALSE;
X if( strcmp(str, KW_KEY) != 0 ) is_key(s) = FALSE;
X else is_key(s) = has_key(enclosing(s)) = TRUE;
X
X if( type(s) == RPAR && has_body(enclosing(s)) && (is_tag(s) || is_key(s)) )
X Error(WARN, &fpos(s), "a body parameter may not be named %s", str);
X
X len = strlen(str);
X hash(str, len, sum);
X
X ifdebug(DST, D, sym_spread[sum]++; sym_count++);
X entry = (OBJECT) &symtab[sum];
X for( plink = Down(entry); plink != entry; plink = NextDown(plink) )
X { Child(p, plink);
X if( length(p) == len && strcmp(str, string(p)) == 0 )
X { for( link = Down(p); link != p; link = NextDown(link) )
X { Child(q, link);
X if( enclosing(s) == enclosing(q) )
X { Error(WARN, &fpos(s), "symbol %s previously defined at%s",
X str, EchoFilePos(&fpos(q)) );
X break;
X }
X }
X goto wrapup;
X }
X }
X
X /* need a new OBJECT as well as s */
X p = NewWord(len, xfpos);
X length(p) = len;
X strcpy(string(p), str);
X Link(entry, p);
X
X wrapup:
X Link(p, s);
X if( enclosing(s) != nil ) Link(enclosing(s), s);
X debug2(DST, DD, "InsertSym Link(%s, %s) and returning.",
X SymName(enclosing(s)), SymName(s));
X return s;
X} /* end InsertSym */


X
X
X/*****************************************************************************/
X/* */

X/* OBJECT SearchSym(str, len) */
X/* */
X/* Search the symbol table for str, with length len, and return an */
X/* OBJECT referencing the entry if found. Otherwise return nil. */
X/* */
X/*****************************************************************************/
X
XOBJECT SearchSym(str, len)
Xunsigned char *str; int len;
X{ register int rlen, sum;
X register unsigned char *x, *y;
X OBJECT p, q, link, plink, entry;
X int s;
X
X debug2(DST, DDD, "SearchSym( %c..., %d )", str[0], len);
X
X hash(str, len, sum);
X rlen = len;
X entry = (OBJECT) &symtab[sum];
X for( plink = Down(entry); plink != entry; plink = NextDown(plink) )
X { Child(p, plink);
X if( rlen == length(p) )
X { x = str; y = string(p);
X do; while( *x++ == *y++ && --rlen );
X if( rlen == 0 )
X { s = scope_top;
X do
X { s--;
X for( link = Down(p); link != p; link = NextDown(link) )
X { Child(q, link);
X if( enclosing(q) == scope[s]
X && (!npars_only[s] || type(q) == NPAR)
X && (!vis_only[s] || visible(q) || suppress_visible )
X && (body_ok[s] || type(q)!=RPAR || !has_body(enclosing(q)) )
X && !suppress_scope )
X { debug1(DST, DDD, "SearchSym returning %s", Image(type(q)));
X return q;
X }
X }
X } while( scope[s] != StartSym );
X }
X }
X rlen = len;
X }
X debug0(DST, DDD, "SearchSym returning <nil>");
X return nil;
X} /* end SearchSym */


X
X
X/*@@**************************************************************************/
X/* */

X/* unsigned char *SymName(s) */
X/* */
X/* Return the string value of the name of symbol s. */
X/* */
X/*****************************************************************************/
X
Xunsigned char *SymName(s)
XOBJECT s;
X{ OBJECT p;
X if( s == nil ) return (unsigned char *) "<nil>";
X Parent(p, Up(s));
X assert( type(p) == WORD, "SymName: type(p) != WORD!" );
X return string(p);
X} /* end SymName */


X
X
X/*****************************************************************************/
X/* */

X/* unsigned char *FullSymName(x, str) */
X/* */
X/* Return the path name of symbol x. with str separating each entry. */
X/* */
X/*****************************************************************************/
X
Xunsigned char *FullSymName(x, str)


XOBJECT x; unsigned char *str;

X{ OBJECT stack[20]; int i;
X static unsigned char buff[MAX_LINE], *sname;
X if( x == nil ) return (unsigned char *) "<nil>";
X assert( enclosing(x) != nil, "FullSymName: enclosing(x) == nil!" );
X for( i = 0; enclosing(x) != nil && i < 20; i++ )
X { stack[i] = x;
X x = enclosing(x);
X }
X strcpy(buff, "");
X for( i--; i > 0; i-- )
X { sname = SymName(stack[i]);
X if( strlen(sname) + strlen(str) + strlen(buff) >= MAX_LINE )
X Error(FATAL, &fpos(x), "full name of symbol is too long");
X strcat(buff, sname);
X strcat(buff, str);
X }
X sname = SymName(stack[0]);
X if( strlen(sname) + strlen(buff) >= MAX_LINE )
X Error(FATAL, &fpos(x), "full name of symbol is too long");
X strcat(buff, sname);
X return buff;
X} /* end FullSymName */


X
X
X/*****************************************************************************/
X/* */

X/* OBJECT ChildSym(s, typ) */
X/* */
X/* Find the child of symbol s of type typ, either LPAR or RPAR. */
X/* */
X/*****************************************************************************/
X
XOBJECT ChildSym(s, typ)
XOBJECT s; unsigned typ;
X{ OBJECT link, y;
X for( link = Down(s); link != s; link = NextDown(link) )
X { Child(y, link);
X if( type(y) == typ && enclosing(y) == s ) return y;
X }
X Error(INTERN, &fpos(s), "Symbol %s has missing %s", SymName(s), Image(typ));
X return nil;
X} /* end ChildSym */


X
X
X#if DEBUG_ON
X/*****************************************************************************/
X/* */

X/* CheckSymSpread() */
X/* */
X/* Check the spread of symbols through the hash table. */
X/* */
X/*****************************************************************************/
X
XCheckSymSpread()
X{ int i, j, sum, usum; OBJECT entry, plink;
X debug2(DST, D, "Symbol table spread (table size = %d, symbols = %d):",
X MAX_TAB, sym_count);
X usum = sum = 0;
X for( i = 0; i < MAX_TAB; i++ )
X { fprintf(stderr, "%4d: ", i);
X for( j = 1; j <= sym_spread[i]; j++ )
X { fprintf(stderr, ".");
X sum += j;
X }
X entry = (OBJECT) &symtab[i];
X for( plink=Down(entry), j=1; plink != entry; plink=NextDown(plink), j++ )
X { fprintf(stderr, "+");
X usum += j;
X }


X fprintf(stderr, "\n");
X }

X fprintf(stderr, "average length counting duplicate names = %.1f\n",
X (float) sum / sym_count);
X fprintf(stderr, "average length not counting duplicate names = %.1f\n",
X (float) usum / sym_count);
X} /* end CheckSymSpread */


X
X
X/*****************************************************************************/
X/* */

X/* static DeleteSymBody(s) */
X/* */
X/* Delete the body of symbol s. */
X/* */
X/*****************************************************************************/
X
Xstatic DeleteSymBody(s)
XOBJECT s;
X{ debug1(DST, DDD, "DeleteSymBody( %s )", SymName(s));
X switch( type(s) )
X {
X case MACRO: while( sym_body(s) != nil )
X sym_body(s) = DeleteAndDispose(sym_body(s), PARENT);
X break;
X
X case LPAR:
X case NPAR:
X case RPAR:
X case LOCAL: if( sym_body(s) != nil ) DisposeObject(sym_body(s));
X break;
X
X default: Error(INTERN,no_fpos, "unknown symbol type %s",Image(type(s)));
X break;
X }
X debug0(DST, DDD, "DeleteSymBody returning.");
X} /* end DeleteSymBody */


X
X
X/*****************************************************************************/
X/* */

X/* DeleteEverySym() */
X/* */
X/* Delete every symbol in the symbol table. */
X/* Note that we first delete all bodies, then the symbols themselves. */
X/* This is so that the closures within the bodies have well-defined */
X/* actual() pointers, even while the symbol table is being disposed. */
X/* If this is not done, debug output during the disposal gets confused. */
X/* */
X/*****************************************************************************/
X
XDeleteEverySym()
X{ int i, j, load, cost; OBJECT p, plink, link, x, entry;
X debug0(DST, D, "DeleteEverySym()");
X
X /* dispose the bodies of all symbols */
X for( i = 0; i < MAX_TAB; i++ )
X { entry = (OBJECT) &symtab[i];
X for( plink = Down(entry); plink != entry; plink = NextDown(plink) )
X { Child(p, plink);
X for( link = Down(p); link != p; link = NextDown(link) )
X { Child(x, link); DeleteSymBody(x);
X /* *** won't work now
X while( base_uses(x) != nil )
X { tmp = base_uses(x); base_uses(x) = next(tmp);
X PutMem(tmp, USES_SIZE);
X }
X while( uses(x) != nil )
X { tmp = uses(x); uses(x) = next(tmp);
X PutMem(tmp, USES_SIZE);
X }
X *** */
X }
X }
X }
X
X /* dispose the symbol name strings, gather statistics, and print them */
X load = cost = 0;
X for( i = 0; i < MAX_TAB; i++ )
X { j = 1; entry = (OBJECT) &symtab[i];
X while( Down(entry) != entry )
X { load += 1; cost += j; j += 1;
X DisposeChild(Down(entry));
X }
X }
X if( load > 0 ) debug4(DST, D, "size = %d, items = %d (%d%%), probes = %.1f",
X MAX_TAB, load, (100*load)/MAX_TAB, (float) cost/load);
X else debug1(DST, D, "table size = %d, no entries in table", MAX_TAB);
X debug0(DST, D, "DeleteEverySym returning.");
X} /* end DeleteEverySym */
X#endif
END_OF_FILE
if test 23936 -ne `wc -c <'lout/z29.c'`; then
echo shar: \"'lout/z29.c'\" unpacked with wrong size!
fi
# end of 'lout/z29.c'
fi
echo shar: End of archive 11 \(of 30\).
cp /dev/null ark11isdone

Jeff Kingston

unread,
Jun 1, 1993, 1:19:16 AM6/1/93
to
Submitted-by: je...@joyce.cs.su.oz.au (Jeff Kingston)
Posting-number: Volume 37, Issue 110
Archive-name: lout/part12
Environment: UNIX

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: lout/font0/TimesIta.AFM lout/include/fig_prepend
# lout/z13.c lout/z25.c
# Wrapped by kent@sparky on Sun May 30 19:43:56 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 12 (of 30)."'
if test -f 'lout/font0/TimesIta.AFM' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/font0/TimesIta.AFM'\"
else
echo shar: Extracting \"'lout/font0/TimesIta.AFM'\" \(15725 characters\)
sed "s/^X//" >'lout/font0/TimesIta.AFM' <<'END_OF_FILE'


XStartFontMetrics 2.0
XComment Copyright (c) 1984 Adobe Systems Incorporated. All Rights Reserved.

XComment Creation Date:Sun Feb 8 03:54:53 PST 1987
XFontName Times-Italic
XEncodingScheme AdobeStandardEncoding
XFullName Times Italic
XFamilyName Times
XWeight Medium
XItalicAngle -15.5
XIsFixedPitch false
XUnderlinePosition -96
XUnderlineThickness 48
XVersion 001.002
XNotice Times is a trademark of Allied Corporation.
XFontBBox -176 -252 990 930
XCapHeight 660
XXHeight 446
XDescender -206
XAscender 684
XStartCharMetrics 228
XC 32 ; WX 250 ; N space ; B 0 0 0 0 ;
XC 33 ; WX 333 ; N exclam ; B 46 -10 296 670 ;
XC 34 ; WX 420 ; N quotedbl ; B 107 442 402 673 ;
XC 35 ; WX 500 ; N numbersign ; B -7 -6 508 683 ;
XC 36 ; WX 500 ; N dollar ; B 13 -102 481 735 ;
XC 37 ; WX 833 ; N percent ; B 63 -14 770 682 ;
XC 38 ; WX 778 ; N ampersand ; B 60 -22 698 673 ;
XC 39 ; WX 333 ; N quoteright ; B 69 458 206 678 ;
XC 40 ; WX 333 ; N parenleft ; B 41 -180 312 662 ;
XC 41 ; WX 333 ; N parenright ; B 19 -178 286 664 ;
XC 42 ; WX 500 ; N asterisk ; B 60 268 434 684 ;
XC 43 ; WX 675 ; N plus ; B 85 0 589 505 ;
XC 44 ; WX 250 ; N comma ; B 57 -126 194 94 ;
XC 45 ; WX 333 ; N hyphen ; B 55 192 276 254 ;
XC 46 ; WX 250 ; N period ; B 75 -10 175 90 ;
XC 47 ; WX 278 ; N slash ; B 2 -14 252 641 ;
XC 48 ; WX 500 ; N zero ; B 19 -9 470 683 ;
XC 49 ; WX 500 ; N one ; B 31 0 390 684 ;
XC 50 ; WX 500 ; N two ; B -7 0 429 682 ;
XC 51 ; WX 500 ; N three ; B -7 -12 443 682 ;
XC 52 ; WX 500 ; N four ; B -8 0 454 681 ;
XC 53 ; WX 500 ; N five ; B -12 -15 462 666 ;
XC 54 ; WX 500 ; N six ; B 24 -8 497 685 ;
XC 55 ; WX 500 ; N seven ; B 56 -12 512 666 ;
XC 56 ; WX 500 ; N eight ; B 12 -7 475 681 ;
XC 57 ; WX 500 ; N nine ; B 10 -18 470 684 ;
XC 58 ; WX 333 ; N colon ; B 86 -10 284 444 ;
XC 59 ; WX 333 ; N semicolon ; B 63 -124 292 441 ;
XC 60 ; WX 675 ; N less ; B 83 -7 592 515 ;
XC 61 ; WX 675 ; N equal ; B 85 125 589 383 ;
XC 62 ; WX 675 ; N greater ; B 82 -7 591 515 ;
XC 63 ; WX 500 ; N question ; B 105 -10 439 670 ;
XC 64 ; WX 920 ; N at ; B 39 -191 866 648 ;
XC 65 ; WX 611 ; N A ; B -45 0 564 672 ;
XC 66 ; WX 611 ; N B ; B -28 0 562 660 ;
XC 67 ; WX 667 ; N C ; B 33 -23 653 672 ;
XC 68 ; WX 722 ; N D ; B -27 0 671 660 ;
XC 69 ; WX 611 ; N E ; B -17 0 609 660 ;
XC 70 ; WX 611 ; N F ; B -17 0 609 660 ;
XC 71 ; WX 722 ; N G ; B 31 -23 701 672 ;
XC 72 ; WX 722 ; N H ; B -26 0 742 660 ;
XC 73 ; WX 333 ; N I ; B -26 0 357 660 ;
XC 74 ; WX 444 ; N J ; B -36 -22 479 660 ;
XC 75 ; WX 667 ; N K ; B -15 0 702 660 ;
XC 76 ; WX 556 ; N L ; B -32 0 535 660 ;
XC 77 ; WX 833 ; N M ; B -24 0 850 660 ;
XC 78 ; WX 667 ; N N ; B -36 -12 698 660 ;
XC 79 ; WX 722 ; N O ; B 42 -23 676 671 ;
XC 80 ; WX 611 ; N P ; B -16 0 582 660 ;
XC 81 ; WX 722 ; N Q ; B 41 -186 681 671 ;
XC 82 ; WX 611 ; N R ; B -32 0 566 660 ;
XC 83 ; WX 500 ; N S ; B 9 -22 483 674 ;
XC 84 ; WX 556 ; N T ; B 32 0 602 660 ;
XC 85 ; WX 722 ; N U ; B 77 -21 747 660 ;
XC 86 ; WX 611 ; N V ; B 44 -20 659 660 ;
XC 87 ; WX 833 ; N W ; B 35 -20 875 660 ;
XC 88 ; WX 611 ; N X ; B -45 0 633 660 ;
XC 89 ; WX 556 ; N Y ; B 44 0 600 660 ;
XC 90 ; WX 556 ; N Z ; B -19 0 581 660 ;
XC 91 ; WX 389 ; N bracketleft ; B 22 -170 391 654 ;
XC 92 ; WX 278 ; N backslash ; B 2 -12 252 651 ;
XC 93 ; WX 389 ; N bracketright ; B -31 -170 341 654 ;
XC 94 ; WX 422 ; N asciicircum ; B 0 254 503 660 ;
XC 95 ; WX 500 ; N underscore ; B -9 -252 510 -206 ;
XC 96 ; WX 333 ; N quoteleft ; B 149 457 286 677 ;
XC 97 ; WX 500 ; N a ; B 15 -11 474 446 ;
XC 98 ; WX 500 ; N b ; B 24 -12 475 682 ;
XC 99 ; WX 444 ; N c ; B 32 -11 420 446 ;
XC 100 ; WX 500 ; N d ; B 15 -11 521 684 ;
XC 101 ; WX 444 ; N e ; B 34 -13 412 446 ;
XC 102 ; WX 278 ; N f ; B -148 -207 415 684 ; L i fi ; L l fl ;
XC 103 ; WX 500 ; N g ; B 10 -209 471 445 ;
XC 104 ; WX 500 ; N h ; B 23 -10 473 684 ;
XC 105 ; WX 278 ; N i ; B 43 -10 263 660 ;
XC 106 ; WX 278 ; N j ; B -109 -207 287 660 ;
XC 107 ; WX 444 ; N k ; B 16 -12 460 685 ;
XC 108 ; WX 278 ; N l ; B 41 -10 276 685 ;
XC 109 ; WX 722 ; N m ; B 11 -10 698 447 ;
XC 110 ; WX 500 ; N n ; B 23 -10 471 447 ;
XC 111 ; WX 500 ; N o ; B 27 -13 467 448 ;
XC 112 ; WX 500 ; N p ; B -75 -206 465 446 ;
XC 113 ; WX 500 ; N q ; B 20 -206 483 445 ;
XC 114 ; WX 389 ; N r ; B 24 0 392 446 ;
XC 115 ; WX 389 ; N s ; B 16 -14 367 446 ;
XC 116 ; WX 278 ; N t ; B 38 -10 288 548 ;
XC 117 ; WX 500 ; N u ; B 42 -11 472 447 ;
XC 118 ; WX 444 ; N v ; B 24 -11 423 444 ;
XC 119 ; WX 667 ; N w ; B 14 -10 650 447 ;
XC 120 ; WX 444 ; N x ; B -31 -10 450 446 ;
XC 121 ; WX 444 ; N y ; B -27 -209 420 445 ;
XC 122 ; WX 389 ; N z ; B 2 0 380 434 ;
XC 123 ; WX 400 ; N braceleft ; B 65 -179 411 675 ;
XC 124 ; WX 275 ; N bar ; B -22 -188 251 670 ;
XC 125 ; WX 400 ; N braceright ; B -66 -179 300 675 ;
XC 126 ; WX 541 ; N asciitilde ; B 18 169 522 340 ;
XC 161 ; WX 389 ; N exclamdown ; B 59 -213 317 468 ;
XC 162 ; WX 500 ; N cent ; B 62 -146 449 564 ;
XC 163 ; WX 500 ; N sterling ; B -5 -9 498 672 ;
XC 164 ; WX 167 ; N fraction ; B -176 -15 338 672 ;
XC 165 ; WX 500 ; N yen ; B 13 0 609 684 ;
XC 166 ; WX 500 ; N florin ; B 3 -189 492 688 ;
XC 167 ; WX 500 ; N section ; B 42 -96 455 743 ;
XC 168 ; WX 500 ; N currency ; B 3 105 498 604 ;
XC 169 ; WX 214 ; N quotesingle ; B 99 453 247 678 ;
XC 170 ; WX 556 ; N quotedblleft ; B 166 457 510 677 ;
XC 171 ; WX 500 ; N guillemotleft ; B 54 39 444 400 ;
XC 172 ; WX 333 ; N guilsinglleft ; B 60 39 285 400 ;
XC 173 ; WX 333 ; N guilsinglright ; B 49 34 269 406 ;
XC 174 ; WX 500 ; N fi ; B -136 -207 468 684 ;
XC 175 ; WX 500 ; N fl ; B -140 -207 509 684 ;
XC 177 ; WX 500 ; N endash ; B -3 194 501 242 ;
XC 178 ; WX 500 ; N dagger ; B 92 -93 480 734 ;
XC 179 ; WX 500 ; N daggerdbl ; B 20 -93 482 743 ;
XC 180 ; WX 250 ; N periodcentered ; B 75 192 199 316 ;
XC 182 ; WX 523 ; N paragraph ; B 87 -196 533 675 ;
XC 183 ; WX 350 ; N bullet ; B 50 175 300 425 ;
XC 184 ; WX 333 ; N quotesinglbase ; B 83 -126 220 94 ;
XC 185 ; WX 556 ; N quotedblbase ; B 63 -126 407 94 ;
XC 186 ; WX 556 ; N quotedblright ; B 68 458 412 678 ;
XC 187 ; WX 500 ; N guillemotright ; B 59 34 442 406 ;
XC 188 ; WX 889 ; N ellipsis ; B 62 -10 828 90 ;
XC 189 ; WX 1000 ; N perthousand ; B 9 -65 990 690 ;
XC 191 ; WX 500 ; N questiondown ; B 55 -215 395 462 ;
XC 193 ; WX 333 ; N grave ; B 160 491 333 659 ;
XC 194 ; WX 333 ; N acute ; B 154 501 375 680 ;
XC 195 ; WX 333 ; N circumflex ; B 96 495 374 669 ;
XC 196 ; WX 333 ; N tilde ; B 114 518 386 639 ;
XC 197 ; WX 333 ; N macron ; B 120 543 380 603 ;
XC 198 ; WX 333 ; N breve ; B 140 512 401 645 ;
XC 199 ; WX 333 ; N dotaccent ; B 112 515 222 625 ;
XC 200 ; WX 333 ; N dieresis ; B 117 534 389 634 ;
XC 202 ; WX 333 ; N ring ; B 239 509 433 703 ;
XC 203 ; WX 333 ; N cedilla ; B -30 -206 214 0 ;
XC 205 ; WX 333 ; N hungarumlaut ; B 62 532 348 749 ;
XC 206 ; WX 333 ; N ogonek ; B -44 -159 169 40 ;
XC 207 ; WX 333 ; N caron ; B 138 495 422 669 ;
XC 208 ; WX 889 ; N emdash ; B -65 194 945 242 ;
XC 225 ; WX 889 ; N AE ; B -46 0 889 660 ;
XC 227 ; WX 276 ; N ordfeminine ; B 32 300 310 677 ;
XC 232 ; WX 556 ; N Lslash ; B 0 0 567 660 ;
XC 233 ; WX 722 ; N Oslash ; B 40 -110 683 738 ;
XC 234 ; WX 944 ; N OE ; B 30 -10 943 668 ;
XC 235 ; WX 310 ; N ordmasculine ; B 45 301 310 679 ;
XC 241 ; WX 667 ; N ae ; B 24 -12 638 448 ;
XC 245 ; WX 278 ; N dotlessi ; B 47 -10 226 447 ;
XC 248 ; WX 278 ; N lslash ; B 0 -10 264 685 ;
XC 249 ; WX 500 ; N oslash ; B 28 -132 468 560 ;
XC 250 ; WX 667 ; N oe ; B 26 -15 643 445 ;
XC 251 ; WX 500 ; N germandbls ; B -167 -209 492 684 ;
XC -1 ; WX 611 ; N Aacute ; B -45 0 564 907 ;
XC -1 ; WX 611 ; N Acircumflex ; B -45 0 564 896 ;
XC -1 ; WX 611 ; N Adieresis ; B -45 0 564 861 ;
XC -1 ; WX 611 ; N Agrave ; B -45 0 564 886 ;
XC -1 ; WX 611 ; N Aring ; B -45 0 564 930 ;
XC -1 ; WX 611 ; N Atilde ; B -45 0 564 866 ;
XC -1 ; WX 667 ; N Ccedilla ; B 33 -206 653 672 ;
XC -1 ; WX 611 ; N Eacute ; B -17 0 609 907 ;
XC -1 ; WX 611 ; N Ecircumflex ; B -17 0 609 896 ;
XC -1 ; WX 611 ; N Edieresis ; B -17 0 609 861 ;
XC -1 ; WX 611 ; N Egrave ; B -17 0 609 886 ;
XC -1 ; WX 722 ; N Eth ; B -27 0 671 660 ;
XC -1 ; WX 333 ; N Iacute ; B -26 0 389 907 ;
XC -1 ; WX 333 ; N Icircumflex ; B -26 0 388 896 ;
XC -1 ; WX 333 ; N Idieresis ; B -26 0 403 861 ;
XC -1 ; WX 333 ; N Igrave ; B -26 0 357 886 ;
XC -1 ; WX 667 ; N Ntilde ; B -36 -12 698 866 ;
XC -1 ; WX 722 ; N Oacute ; B 42 -23 676 907 ;
XC -1 ; WX 722 ; N Ocircumflex ; B 42 -23 676 896 ;
XC -1 ; WX 722 ; N Odieresis ; B 42 -23 676 861 ;
XC -1 ; WX 722 ; N Ograve ; B 42 -23 676 886 ;
XC -1 ; WX 722 ; N Otilde ; B 42 -23 676 866 ;
XC -1 ; WX 500 ; N Scaron ; B 9 -22 506 896 ;
XC -1 ; WX 611 ; N Thorn ; B -16 0 547 660 ;
XC -1 ; WX 722 ; N Uacute ; B 77 -21 747 907 ;
XC -1 ; WX 722 ; N Ucircumflex ; B 77 -21 747 896 ;
XC -1 ; WX 722 ; N Udieresis ; B 77 -21 747 861 ;
XC -1 ; WX 722 ; N Ugrave ; B 77 -21 747 886 ;
XC -1 ; WX 556 ; N Yacute ; B 44 0 600 894 ;
XC -1 ; WX 556 ; N Ydieresis ; B 44 0 600 861 ;
XC -1 ; WX 556 ; N Zcaron ; B -19 0 581 896 ;
XC -1 ; WX 500 ; N aacute ; B 15 -11 474 680 ;
XC -1 ; WX 500 ; N acircumflex ; B 15 -11 474 669 ;
XC -1 ; WX 500 ; N adieresis ; B 15 -11 479 634 ;
XC -1 ; WX 500 ; N agrave ; B 15 -11 474 659 ;
XC -1 ; WX 500 ; N aring ; B 15 -11 474 703 ;
XC -1 ; WX 500 ; N atilde ; B 15 -11 476 639 ;
XC -1 ; WX 275 ; N brokenbar ; B -22 -188 251 670 ;
XC -1 ; WX 444 ; N ccedilla ; B 32 -206 420 446 ;
XC -1 ; WX 760 ; N copyright ; B 40 -22 719 672 ;
XC -1 ; WX 400 ; N degree ; B 70 384 370 684 ;
XC -1 ; WX 675 ; N divide ; B 85 0 589 505 ;
XC -1 ; WX 444 ; N eacute ; B 34 -13 444 680 ;
XC -1 ; WX 444 ; N ecircumflex ; B 34 -13 443 669 ;
XC -1 ; WX 444 ; N edieresis ; B 34 -13 458 634 ;
XC -1 ; WX 444 ; N egrave ; B 34 -13 412 659 ;
XC -1 ; WX 500 ; N eth ; B 27 -13 487 682 ;
XC -1 ; WX 278 ; N iacute ; B 47 -10 341 680 ;
XC -1 ; WX 278 ; N icircumflex ; B 47 -10 340 669 ;
XC -1 ; WX 278 ; N idieresis ; B 47 -10 355 634 ;
XC -1 ; WX 278 ; N igrave ; B 47 -10 299 659 ;
XC -1 ; WX 675 ; N logicalnot ; B 85 113 589 383 ;
XC -1 ; WX 675 ; N minus ; B 85 222 589 286 ;
XC -1 ; WX 500 ; N mu ; B -60 -206 472 446 ;
XC -1 ; WX 675 ; N multiply ; B 85 0 589 504 ;
XC -1 ; WX 500 ; N ntilde ; B 23 -10 471 639 ;
XC -1 ; WX 500 ; N oacute ; B 27 -13 467 680 ;
XC -1 ; WX 500 ; N ocircumflex ; B 27 -13 467 669 ;
XC -1 ; WX 500 ; N odieresis ; B 27 -13 479 634 ;
XC -1 ; WX 500 ; N ograve ; B 27 -13 467 659 ;
XC -1 ; WX 750 ; N onehalf ; B 30 -15 720 684 ;
XC -1 ; WX 750 ; N onequarter ; B 30 -15 720 684 ;
XC -1 ; WX 300 ; N onesuperior ; B 43 274 277 683 ;
XC -1 ; WX 500 ; N otilde ; B 27 -13 476 639 ;
XC -1 ; WX 675 ; N plusminus ; B 85 0 589 645 ;
XC -1 ; WX 760 ; N registered ; B 40 -22 719 672 ;
XC -1 ; WX 389 ; N scaron ; B 16 -14 450 669 ;
XC -1 ; WX 500 ; N thorn ; B -75 -206 465 682 ;
XC -1 ; WX 750 ; N threequarters ; B 30 -15 720 684 ;
XC -1 ; WX 300 ; N threesuperior ; B 13 267 306 684 ;
XC -1 ; WX 980 ; N trademark ; B 35 268 945 672 ;
XC -1 ; WX 300 ; N twosuperior ; B 8 274 292 684 ;
XC -1 ; WX 500 ; N uacute ; B 42 -11 472 680 ;
XC -1 ; WX 500 ; N ucircumflex ; B 42 -11 472 669 ;
XC -1 ; WX 500 ; N udieresis ; B 42 -11 473 634 ;
XC -1 ; WX 500 ; N ugrave ; B 42 -11 472 659 ;
XC -1 ; WX 444 ; N yacute ; B -27 -209 431 680 ;
XC -1 ; WX 444 ; N ydieresis ; B -27 -209 445 634 ;
XC -1 ; WX 389 ; N zcaron ; B 2 0 450 669 ;
XEndCharMetrics
XStartKernData
XStartKernPairs 120
X
XKPX A y -55
XKPX A w -55
XKPX A v -55
XKPX A space -18
XKPX A quoteright -37
XKPX A Y -55
XKPX A W -37
XKPX A V -50
XKPX A T -37
X
XKPX F period -129
XKPX F comma -129
XKPX F A -129
X
XKPX L y -30
XKPX L space -18
XKPX L quoteright -37
XKPX L Y -20
XKPX L W -37
XKPX L V -37
XKPX L T -20
X
XKPX P space -18
XKPX P period -129
XKPX P comma -129
XKPX P A -129
X
XKPX R y -18
XKPX R Y -18
XKPX R W -18
XKPX R V -18
XKPX R T 0
X
XKPX T y -74
XKPX T w -74
XKPX T u -55
XKPX T space -18
XKPX T semicolon -65
XKPX T s -92
XKPX T r -55
XKPX T period -74
XKPX T o -92
XKPX T i -55
XKPX T hyphen -74
XKPX T e -92
XKPX T comma -74
XKPX T colon -55
XKPX T c -92
XKPX T a -92
XKPX T O -18
XKPX T A -74
X
XKPX V y -92
XKPX V u -74
XKPX V space -18
XKPX V semicolon -74
XKPX V r -74
XKPX V period -129
XKPX V o -111
XKPX V i -74
XKPX V hyphen -55
XKPX V e -111
XKPX V comma -129
XKPX V colon -65
XKPX V a -111
XKPX V O -30
XKPX V A -74
X
XKPX W y -92
XKPX W u -55
XKPX W semicolon -65
XKPX W r -55
XKPX W period -92
XKPX W o -92
XKPX W i -55
XKPX W hyphen -37
XKPX W e -92
XKPX W comma -92
XKPX W colon -65
XKPX W a -92
XKPX W A -70
X
XKPX Y v -92
XKPX Y u -92
XKPX Y semicolon -65
XKPX Y q -111
XKPX Y period -92
XKPX Y p -92
XKPX Y o -92
XKPX Y i -74
XKPX Y hyphen -74
XKPX Y e -92
XKPX Y comma -92
XKPX Y colon -65
XKPX Y a -92
XKPX Y A -70
X
XKPX f quoteright 92
X
XKPX one one -74
X
XKPX quoteleft quoteleft -111
X
XKPX quoteright t -111
XKPX quoteright space -111
XKPX quoteright s -129
XKPX quoteright quoteright -111
X
XKPX r y 0
XKPX r x 0
XKPX r w 0
XKPX r v 0
XKPX r u 0
XKPX r t 0
XKPX r r 0
XKPX r quoteright 37
XKPX r q -37
XKPX r period -111
XKPX r o -37
XKPX r hyphen -20
XKPX r h -18
XKPX r g -37
XKPX r e -37
XKPX r d -37
XKPX r comma -111
XKPX r c -37
X
XKPX space A -18
X
XKPX v period -74
XKPX v comma -74
X
XKPX w period -74
XKPX w comma -74
X
XKPX y period -55
XKPX y comma -55
XEndKernPairs
XEndKernData
XStartComposites 58
XCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 111 227 ;
XCC zcaron 2 ; PCC z 0 0 ; PCC caron 28 0 ;
XCC Scaron 2 ; PCC S 0 0 ; PCC caron 83 227 ;
XCC scaron 2 ; PCC s 0 0 ; PCC caron 28 0 ;
XCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 188 0 ;
XCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 61 0 ;
XCC Yacute 2 ; PCC Y 0 0 ; PCC acute 111 214 ;
XCC yacute 2 ; PCC y 0 0 ; PCC acute 55 0 ;
XCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 111 227 ;
XCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 55 0 ;
XCC Uacute 2 ; PCC U 0 0 ; PCC acute 228 227 ;
XCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 228 227 ;
XCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 228 227 ;
XCC Ugrave 2 ; PCC U 0 0 ; PCC grave 228 227 ;
XCC uacute 2 ; PCC u 0 0 ; PCC acute 83 0 ;
XCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 83 0 ;
XCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 83 0 ;
XCC ugrave 2 ; PCC u 0 0 ; PCC grave 83 0 ;
XCC Iacute 2 ; PCC I 0 0 ; PCC acute 14 227 ;
XCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex 14 227 ;
XCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis 14 227 ;
XCC Igrave 2 ; PCC I 0 0 ; PCC grave 14 227 ;
XCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -34 0 ;
XCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -34 0 ;
XCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -34 0 ;
XCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -34 0 ;
XCC Eacute 2 ; PCC E 0 0 ; PCC acute 160 227 ;
XCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 160 227 ;
XCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 160 227 ;
XCC Egrave 2 ; PCC E 0 0 ; PCC grave 160 227 ;
XCC eacute 2 ; PCC e 0 0 ; PCC acute 68 0 ;
XCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 68 0 ;
XCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 68 0 ;
XCC egrave 2 ; PCC e 0 0 ; PCC grave 68 0 ;
XCC Aacute 2 ; PCC A 0 0 ; PCC acute 146 227 ;
XCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 146 227 ;
XCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 146 227 ;
XCC Agrave 2 ; PCC A 0 0 ; PCC grave 146 227 ;
XCC aacute 2 ; PCC a 0 0 ; PCC acute 89 0 ;
XCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 89 0 ;
XCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 89 0 ;
XCC agrave 2 ; PCC a 0 0 ; PCC grave 89 0 ;
XCC Oacute 2 ; PCC O 0 0 ; PCC acute 221 227 ;
XCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 221 227 ;
XCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 221 227 ;
XCC Ograve 2 ; PCC O 0 0 ; PCC grave 221 227 ;
XCC oacute 2 ; PCC o 0 0 ; PCC acute 89 0 ;
XCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 89 0 ;
XCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 89 0 ;
XCC ograve 2 ; PCC o 0 0 ; PCC grave 89 0 ;
XCC Atilde 2 ; PCC A 0 0 ; PCC tilde 146 227 ;
XCC atilde 2 ; PCC a 0 0 ; PCC tilde 89 0 ;
XCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 181 227 ;
XCC ntilde 2 ; PCC n 0 0 ; PCC tilde 76 0 ;
XCC Otilde 2 ; PCC O 0 0 ; PCC tilde 221 227 ;
XCC otilde 2 ; PCC o 0 0 ; PCC tilde 89 0 ;
XCC Aring 2 ; PCC A 0 0 ; PCC ring 80 227 ;
XCC aring 2 ; PCC a 0 0 ; PCC ring 29 0 ;
XEndComposites
XEndFontMetrics
END_OF_FILE
if test 15725 -ne `wc -c <'lout/font0/TimesIta.AFM'`; then
echo shar: \"'lout/font0/TimesIta.AFM'\" unpacked with wrong size!
fi
# end of 'lout/font0/TimesIta.AFM'
fi
if test -f 'lout/include/fig_prepend' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/include/fig_prepend'\"
else
echo shar: Extracting \"'lout/include/fig_prepend'\" \(22299 characters\)
sed "s/^X//" >'lout/include/fig_prepend' <<'END_OF_FILE'
X%%BeginResource: procset LoutFigPrependGraphic

X dup 3 1 roll add exch
X } for


X pop lfigatangle
X} def
X
X% next array element: <array> <index> lfiggetnext <array> <index> <any> true
X% or <array> <index> false
X/lfiggetnext
X{ 2 copy exch length ge
X { false }

X { 2 copy get exch 1 add exch true } ifelse
X} def

END_OF_FILE
if test 22299 -ne `wc -c <'lout/include/fig_prepend'`; then
echo shar: \"'lout/include/fig_prepend'\" unpacked with wrong size!
fi
# end of 'lout/include/fig_prepend'
fi
if test -f 'lout/z13.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/z13.c'\"
else
echo shar: Extracting \"'lout/z13.c'\" \(20116 characters\)
sed "s/^X//" >'lout/z13.c' <<'END_OF_FILE'
X/*@z13.c:Object Breaking:BreakObject()@***************************************/


X/* */
X/* LOUT: A HIGH-LEVEL LANGUAGE FOR DOCUMENT FORMATTING (VERSION 2.03) */
X/* COPYRIGHT (C) 1993 Jeffrey H. Kingston */
X/* */
X/* Jeffrey H. Kingston (je...@cs.su.oz.au) */
X/* Basser Department of Computer Science */
X/* The University of Sydney 2006 */
X/* AUSTRALIA */
X/* */
X/* This program is free software; you can redistribute it and/or modify */
X/* it under the terms of the GNU General Public License as published by */
X/* the Free Software Foundation; either version 1, or (at your option) */
X/* any later version. */
X/* */
X/* This program is distributed in the hope that it will be useful, */
X/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
X/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
X/* GNU General Public License for more details. */
X/* */
X/* You should have received a copy of the GNU General Public License */
X/* along with this program; if not, write to the Free Software */
X/* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
X/* */

X/* FILE: z13.c */
X/* MODULE: Object Breaking */
X/* EXTERNS: BreakObject() */


X/* */
X/*****************************************************************************/
X#include "externs"
X

X
X/*****************************************************************************/
X/* */
X/* static BreakJoinedGroup(start, stop, m, c, res_back, res_fwd) */
X/* */
X/* Break joined group of components of a VCAT, beginning from Child(start) */
X/* inclusive and ending at Child(stop) inclusive. Break component m first */
X/* because it is the widest. */
X/* */
X/*****************************************************************************/
X
Xstatic BreakJoinedGroup(start, stop, m, c, res_back, res_fwd)
XOBJECT start, stop, m; CONSTRAINT *c; LENGTH *res_back, *res_fwd;
X{ OBJECT y, z, link; LENGTH b, f, mb, mf; CONSTRAINT yc;
X ifdebug(DOB, D, Child(y, start));
X ifdebug(DOB, D, Child(z, stop));
X debug3(DOB, D, "BreakJoinedGroup( -> %s, -> %s, %s, -, -)",
X EchoObject(null, y), EchoObject(null, z), EchoConstraint(c));
X CopyConstraint(yc, *c);
X if( m != nil )
X { m = BreakObject(m, &yc);
X b = back(m, COL);
X f = fwd(m, COL);
X SetConstraint(yc, min(bc(yc), bfc(yc)-f), bfc(yc), min(fc(yc), bfc(yc)-b));
X }
X else b = f = 0;
X for( link = start; link != NextDown(stop); link = NextDown(link) )
X { Child(y, link);
X if( !is_definite(type(y)) || y == m ) continue;
X y = BreakObject(y, &yc);
X b = max(b, back(y, COL));
X f = max(f, fwd(y, COL));
X SetConstraint(yc, min(bc(yc), bfc(yc)-f), bfc(yc), min(fc(yc), bfc(yc)-b));
X }
X assert( FitsConstraint(b, f, *c), "BreakJoinedGroup: result doesn't fit!" );
X *res_back = b; *res_fwd = f;
X debug2(DOB,D,"BreakJoinedGroup returning (%s, %s)",
X EchoLength(b), EchoLength(f));
X} /* end BreakJoinedGroup */


X
X
X/*@@**************************************************************************/
X/* */

X/* static OBJECT BreakVcat(x, c) */
X/* */
X/* Break a VCAT to satisfy constraint c. This is tedious because every */
X/* group of components between // ... // must be broken separately. */
X/* */
X/*****************************************************************************/
X
XOBJECT BreakVcat(x, c)
XOBJECT x; CONSTRAINT *c;
X{ OBJECT y, link, start_group, m; LENGTH b, f; int dble_fwd; CONSTRAINT tc;
X BOOLEAN dble_found;
X debug2(DOB, D, "[ BreakVcat(%s, %s)", EchoObject(null, x), EchoConstraint(c));
X assert(Down(x) != x, "BreakVcat: Down(x) == x!" );
X SetConstraint(tc, MAX_LEN, min(bfc(*c), fc(*c)), MAX_LEN);
X
X dble_found = FALSE; dble_fwd = 0; start_group = nil;


X for( link = Down(x); link != x; link = NextDown(link) )
X {
X Child(y, link);

X if( is_index(type(y)) ) continue;
X if( type(y) == GAP_OBJ )

X { assert( start_group != nil, "BreakVcat: start_group == nil!" );


X if( !join(gap(y)) )
X {

X /* finish off and break this group */
X if( !FitsConstraint(b, f, tc) )
X BreakJoinedGroup(start_group, link, m, &tc, &b, &f);
X dble_found = TRUE;
X dble_fwd = max(dble_fwd, b + f);
X start_group = nil;
X debug1(DOB, D, " end group, dble_fwd: %s", EchoLength(dble_fwd));
X }
X }
X else if( start_group == nil )
X {

X /* start new group */

X b = back(y, COL);
X f = fwd(y, COL);
X start_group = link;
X m = y;
X debug3(DOB, D, " starting group: %s (%s, %s)",
X EchoObject(null, y), EchoLength(b), EchoLength(f));
X }
X else
X {


X /* continue with current group */

X b = max(b, back(y, COL));
X f = max(f, fwd(y, COL));
X if( fwd(y, COL) > fwd(m, COL) ) m = y;
X debug4(DOB, D, " in group: %s%s (%s, %s)", m == y ? "new max " : "",
X EchoObject(null, y), EchoLength(b), EchoLength(f));
X }
X }
X assert( start_group != nil, "BreakVcat: start_group == nil (2)!" );


X
X if( dble_found )
X {

X /* finish off and break this last group, and set sizes of x */
X if( !FitsConstraint(b, f, tc) )
X BreakJoinedGroup(start_group, LastDown(x), m, &tc, &b, &f);
X dble_fwd = max(dble_fwd, b + f);
X debug1(DOB, D, " ending last group, dble_fwd: %s",EchoLength(dble_fwd));
X back(x, COL) = 0; fwd(x, COL) = min(MAX_LEN, dble_fwd);
X }
X else
X {
X /* finish off and break this last and only group, and set sizes of x */
X debug2(DOB, D, " BreakVcat ending last and only group (%s, %s)",
X EchoLength(b), EchoLength(f));
X BreakJoinedGroup(start_group, LastDown(x), m, c, &b, &f);
X back(x, COL) = b; fwd(x, COL) = f;
X }
X
X debug1(DOB, D, "] BreakVcat returning %s", EchoObject(null, x));
X debug2(DOB, D, " (size is %s, %s)",
X EchoLength(back(x, COL)), EchoLength(fwd(x, COL)));
X return x;
X} /* end BreakVcat */
X
X/*@@**************************************************************************/
X/* */
X/* static OBJECT BreakTable(x, c) */
X/* */
X/* Break table (HCAT) x to satisfy constraint c. */
X/* */
X/* Outline of algorithm: */
X/* */
X/* bcount = number of components to left of mark; */
X/* fcount = no. of components on and right of mark; */
X/* bwidth = what back(x) would be if all components had size (0, 0); */
X/* fwidth = what fwd(x) would be if all components had size (0, 0); */
X/* Set all components of x to Unbroken (broken(y) holds this flag); */
X/* while( an Unbroken component of x exists ) */
X/* { my = the Unbroken component of x of minimum width; */
X/* mc = desirable constraint for my (see below); */
X/* BreakObject(my, &mc); */
X/* Set my to Broken and update bcount, fcount, bwidth, fwidth */
X/* to reflect the actual size of my, now broken; */
X/* } */
X/* */
X/* The constraint mc is chosen in an attempt to ensure that: */
X/* */
X/* a) Any sufficiently narrow components will not break; */
X/* b) All broken components will have the same bfc(mc), if possible; */
X/* c) All available space is used. */
X/* */
X/*****************************************************************************/
X
Xstatic OBJECT BreakTable(x, c)
XOBJECT x; CONSTRAINT *c;
X{ LENGTH bwidth, fwidth; /* running back(x) and fwd(x) */
X int bcount, fcount; /* running no. of components */
X OBJECT mlink, my; /* minimum-width unbroken component */
X BOOLEAN ratm; /* TRUE when my has a mark to its right */
X int mside; /* my's side of the mark: BACK, ON or FWD */
X LENGTH msize; /* my's size (minimal among unbroken) */
X CONSTRAINT mc; /* desirable constraint for my */
X OBJECT pg, prec_def; /* preceding definite object of my */
X OBJECT sg, succ_def; /* succeeding definite object of my */
X LENGTH pd_extra, sd_extra; /* space availiable for free each side of my */
X LENGTH av_colsize; /* the size of each unbroken component */
X /* if they are all assigned equal width */
X LENGTH fwd_max, back_max; /* maximum space available forward of or */
X /* back of the mark, when columns are even */
X LENGTH col_size; /* the column size actually used in breaking */
X LENGTH beffect, feffect; /* the amount bwidth, fwidth must increase */
X /* when my is broken */
X OBJECT link, y, prev, g; LENGTH tmp, tmp2;
X
X debug2(DOB,DD,"[ BreakTable( %s, %s )", EchoObject(null,x),EchoConstraint(c));
X
X /* Initialise csize, bcount, fcount, bwidth, fwidth and broken(y) */
X bcount = fcount = 0; bwidth = fwidth = 0; prev = nil;
X Child(y, Down(x));
X assert( type(y) != GAP_OBJ, "BreakTable: GAP_OBJ!" );
X assert( !is_index(type(y)), "BreakTable: index!" );
X broken(y) = is_indefinite(type(y));
X if( !broken(y) ) prev = y, fcount = 1;
X
X for( link = NextDown(Down(x)); link != x; link = NextDown(NextDown(link)) )
X {
X /* find the next gap g and following child y */
X Child(g, link);
X assert( type(g) == GAP_OBJ, "BreakTable: GAP_OBJ!" );
X assert( NextDown(link) != x, "BreakTable: GAP_OBJ is last!" );
X Child(y, NextDown(link));
X
X assert( type(y) != GAP_OBJ, "BreakTable: GAP_OBJ!" );
X assert( !is_index(type(y)), "BreakTable: index!" );
X broken(y) = is_indefinite(type(y));
X if( !broken(y) )
X { if( prev == nil ) fcount = 1;
X else if( mark(gap(g)) )
X { bcount += fcount;
X bwidth += fwidth + MinGap(0, 0, 0, &gap(g));
X fcount = 1; fwidth = 0;
X }
X else
X { fwidth += MinGap(0, 0, 0, &gap(g));
X fcount += 1;


X }
X prev = y;

X }
X }
X
X /* if column gaps alone are too wide, kill them all */
X if( !FitsConstraint(bwidth, fwidth, *c) )
X { Error(WARN, &fpos(x), "object too wide: reducing column gaps to 0i");
X for( link = Down(x); link != x; link = NextDown(link) )
X { Child(g, link);
X if( type(g) == GAP_OBJ )
X { SetGap(gap(g), mark(gap(g)), join(gap(g)), FIXED_UNIT, EDGE_MODE, 0);
X }
X }
X bwidth = fwidth = 0;
X }
X
X /* break each column, from smallest to largest */
X while( bcount + fcount > 0 && FitsConstraint(bwidth, fwidth, *c) )
X {
X debug2(DOB,DD, "bcount: %d; bwidth: %s", bcount, EchoLength(bwidth));
X debug2(DOB,DD, "fcount: %d; fwidth: %s", fcount, EchoLength(fwidth));
X
X /* find a minimal-width unbroken component my */
X my = nil; msize = size(x, COL); /* an upper bound for size(y) */
X for( link = Down(x); ; link = NextDown(link) )
X { Child(y, link);
X assert( type(y) != GAP_OBJ, "BreakTable: type(y) == GAP_OBJ!" );
X if( !broken(y) && (size(y, COL) < msize || my == nil) )
X { msize = size(y, COL);
X my = y; mlink = link;
X ratm = FALSE;
X }
X
X /* next gap */
X link = NextDown(link);


X if( link == x ) break;

X Child(g, link);
X assert( type(g) == GAP_OBJ, "BreakTable: type(g) != GAP_OBJ!" );
X if( mark(gap(g)) ) ratm = TRUE;
X }
X debug2(DOB, DD, "my (%s): %s", Image(mside), EchoObject(null, my));
X
X /* find neighbouring definite objects and resulting pd_extra and sd_extra */
X SetNeighbours(mlink, ratm, &pg, &prec_def, &sg, &succ_def, &mside);
X pd_extra = pg == nil ? 0 :
X ExtraGap(broken(prec_def) ? fwd(prec_def,COL) : 0, 0, &gap(pg), BACK);
X sd_extra = sg == nil ? 0 :
X ExtraGap(0, broken(succ_def) ? back(succ_def,COL) : 0, &gap(sg), FWD);
X debug2(DOB, DD, "pd_extra: %s; sd_extra: %s",
X EchoLength(pd_extra), EchoLength(sd_extra) );
X
X /* calculate desirable constraints for my */
X av_colsize = (bfc(*c) - bwidth - fwidth) / (bcount + fcount);
X debug1(DOB, DD, "av_colsize = %s", EchoLength(av_colsize));
X switch( mside )


X {
X
X case BACK:
X

X back_max = min(bc(*c), bwidth + av_colsize * bcount);
X col_size = (back_max - bwidth) / bcount;
X SetConstraint(mc, col_size + pd_extra, col_size + pd_extra + sd_extra,
X col_size + sd_extra );
X break;
X
X
X case ON:
X
X fwd_max = min(fc(*c), fwidth + av_colsize * fcount);
X col_size = (fwd_max - fwidth) / fcount;
X SetConstraint(mc, pd_extra, MAX_LEN, col_size + sd_extra);


X break;
X
X
X case FWD:
X

X fwd_max = min(fc(*c), fwidth + av_colsize * fcount);
X col_size = (fwd_max - fwidth) / fcount;
X SetConstraint(mc, col_size + pd_extra, col_size + pd_extra + sd_extra,
X col_size + sd_extra );


X break;
X
X
X default:
X

X Error(INTERN, no_fpos, "BreakTable found illegal side");
X break;
X }
X
X /* now break my according to these constraints, and accept it */
X my = BreakObject(my, &mc); broken(my) = TRUE;
X
X /* calculate the effect of accepting my on bwidth and fwidth */
X if( pg != nil )
X { tmp = broken(prec_def) ? fwd(prec_def, COL) : 0;
X beffect = MinGap(tmp, back(my, COL), fwd(my, COL), &gap(pg)) -
X MinGap(tmp, 0, 0, &gap(pg));
X }
X else beffect = back(my, COL);
X
X if( sg != nil )
X { tmp = broken(succ_def) ? back(succ_def, COL) : 0;
X tmp2 = broken(succ_def) ? fwd(succ_def, COL) : 0;
X feffect = MinGap(fwd(my, COL), tmp, tmp2, &gap(sg)) -
X MinGap(0, tmp, tmp2, &gap(sg));
X }
X else feffect = fwd(my, COL);
X
X switch( mside )
X {
X case BACK: bwidth += beffect + feffect;
X bcount--;
X break;
X
X case ON: bwidth += beffect; fwidth += feffect;
X fcount--;
X break;
X
X case FWD: fwidth += beffect + feffect;
X fcount--;
X break;
X
X default: Error(INTERN, no_fpos, "BreakTable found illegal side");
X break;
X }
X


X } /* end while */
X

X back(x, COL) = bwidth;
X fwd(x, COL) = fwidth;
X
X debug1(DOB, DD, "] BreakTable returning %s", EchoObject(null, x));
X debug2(DOB, DD, " (size is %s, %s)",
X EchoLength(bwidth), EchoLength(fwidth));
X return x;
X} /* end BreakTable */


X
X
X/*@@**************************************************************************/
X/* */

X/* OBJECT BreakObject(x, c) */
X/* */
X/* Break lines of object x so that it satisfies constraint c. */
X/* */
X/*****************************************************************************/
X
XOBJECT BreakObject(x, c)
XOBJECT x; CONSTRAINT *c;
X{ OBJECT y; CONSTRAINT yc, tc;
X /***
X debug1(DOB, DD, "[ BreakObject( %s )", EchoObject(null, x));
X debug3(DOB, DD, " (size %s,%s; constraint %s)",
X EchoLength(back(x, COL)), EchoLength(fwd(x, COL)), EchoConstraint(c));
X ***/
X debug3(DOB, DD, "[ BreakObject(x (%s,%s), %s), x =",
X EchoLength(back(x, COL)), EchoLength(fwd(x, COL)), EchoConstraint(c));
X ifdebug(DOB, DD, EchoObject(stderr, x));
X
X if( FitsConstraint(back(x, COL), fwd(x, COL), *c) )
X { debug0(DOB, DD, "] BreakObject returning (fits).");
X return x;
X }


X switch( type(x) )
X {
X

X case ROTATE:
X
X Error(WARN, &fpos(x), "%s deleted (too wide; cannot break %s)",
X KW_ROTATE, KW_ROTATE);
X y = MakeWord("", &fpos(x));
X back(y, COL) = fwd(y, COL) = 0;


X ReplaceNode(y, x);
X DisposeObject(x);
X x = y;

X break;
X
X
X case SCALE:
X

X InvScaleConstraint(&yc, bc(constraint(x)), c);
X Child(y, Down(x));
X y = BreakObject(y, &yc);
X back(x, COL) = (back(y, COL) * bc(constraint(x))) / SF;
X fwd(x, COL) = (fwd(y, COL) * bc(constraint(x))) / SF;
X break;
X
X
X case WORD:
X
X Error(WARN, &fpos(x), "word %s deleted (too wide)",string(x));
X y = MakeWord("", &fpos(x));
X back(y, COL) = fwd(y, COL) = 0;


X ReplaceNode(y, x);
X DisposeObject(x);
X x = y;

X break;
X
X
X case WIDE:
X

X Error(WARN, &fpos(x), "%s %s reduced (too wide)",
X EchoLength(bfc(constraint(x))), KW_WIDE);
X MinConstraint(&constraint(x), c);
X Child(y, Down(x));
X y = BreakObject(y, &constraint(x));
X back(x, COL) = back(y, COL);
X fwd(x, COL) = fwd(y, COL);
X EnlargeToConstraint(&back(x, COL), &fwd(x, COL), &constraint(x));
X break;
X
X


X case INCGRAPHIC:
X case SINCGRAPHIC:
X

X Error(WARN, &fpos(x), "%s or %s deleted (too wide)", KW_INCGRAPHIC,
X KW_SINCGRAPHIC);
X y = MakeWord("", &fpos(x));
X back(y, COL) = fwd(y, COL) = 0;


X ReplaceNode(y, x);
X DisposeObject(x);
X x = y;

X break;
X
X
X case HIGH:
X case VSCALE:


X case HCONTRACT:
X case VCONTRACT:
X case HEXPAND:
X case VEXPAND:
X case PADJUST:
X case HADJUST:
X case VADJUST:

X case ONE_ROW:
X case ONE_COL:
X

X assert( Down(x) == LastDown(x), "BreakObject: downs!" );
X Child(y, Down(x));
X y = BreakObject(y, c);
X back(x, COL) = back(y, COL);
X fwd(x, COL) = fwd(y, COL);
X break;
X
X
X case GRAPHIC:
X
X Child(y, LastDown(x));
X y = BreakObject(y, c);
X back(x, COL) = back(y, COL);
X fwd(x, COL) = fwd(y, COL);


X break;
X
X
X case SPLIT:
X

X Child(y, DownDim(x, COL));
X y = BreakObject(y, c);
X back(x, COL) = back(y, COL);
X fwd(x, COL) = fwd(y, COL);
X break;
X
X
X case ACAT:
X
X x = FillObject(x, c);
X break;
X
X
X case HCAT:
X
X x = BreakTable(x, c);


X break;
X
X
X case COL_THR:
X

X BreakJoinedGroup(Down(x), LastDown(x), nil, c, &back(x,COL), &fwd(x,COL));


X break;
X
X
X case VCAT:
X

X x = BreakVcat(x, c);


X break;
X
X
X default:
X

X Error(INTERN, &fpos(x), "BreakObject: %s!", Image(type(x)) );
X break;
X
X }
X assert( back(x, COL) >= 0, "BreakObject: back(x, COL) < 0!" );
X assert( fwd(x, COL) >= 0, "BreakObject: fwd(x, COL) < 0!" );
X debug1(DOB, DD, "] BreakObject returning %s", EchoObject(null, x));
X debug2(DOB, DD, " (size is %s, %s)",
X EchoLength(back(x, COL)), EchoLength(fwd(x, COL)));
X return x;
X} /* end BreakObject */
END_OF_FILE
if test 20116 -ne `wc -c <'lout/z13.c'`; then
echo shar: \"'lout/z13.c'\" unpacked with wrong size!
fi
# end of 'lout/z13.c'
fi
if test -f 'lout/z25.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/z25.c'\"
else
echo shar: Extracting \"'lout/z25.c'\" \(20719 characters\)
sed "s/^X//" >'lout/z25.c' <<'END_OF_FILE'
X/*@z25.c:Object Echo:EchoObject()@********************************************/


X/* */
X/* LOUT: A HIGH-LEVEL LANGUAGE FOR DOCUMENT FORMATTING (VERSION 2.03) */
X/* COPYRIGHT (C) 1993 Jeffrey H. Kingston */
X/* */
X/* Jeffrey H. Kingston (je...@cs.su.oz.au) */
X/* Basser Department of Computer Science */
X/* The University of Sydney 2006 */
X/* AUSTRALIA */
X/* */
X/* This program is free software; you can redistribute it and/or modify */
X/* it under the terms of the GNU General Public License as published by */
X/* the Free Software Foundation; either version 1, or (at your option) */
X/* any later version. */
X/* */
X/* This program is distributed in the hope that it will be useful, */
X/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
X/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
X/* GNU General Public License for more details. */
X/* */
X/* You should have received a copy of the GNU General Public License */
X/* along with this program; if not, write to the Free Software */
X/* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
X/* */

X/* FILE: z25.c */
X/* MODULE: Object Echo */
X/* EXTERNS: EchoObject() */


X/* */
X/*****************************************************************************/
X#include "externs"

X#if DEBUG_ON
X
Xstatic int limit; /* column where newline is needed */
Xstatic int indent; /* current indent */
Xstatic int col; /* current output column */
Xstatic FILE *fp; /* current output file */
X
X#define moveright() (indent += 3)
X#define moveleft() (indent -= 3)


X
X
X/*****************************************************************************/
X/* */

X/* static print(x) */
X/* */
X/* Print the string x onto the appropriate output. */
X/* */
X/*****************************************************************************/
X
Xstatic print(x)
Xunsigned char *x;
X{ col += strlen(x);
X if( fp == null ) AppendString(x);
X else fputs(x, fp);
X} /* end print */


X
X
X/*****************************************************************************/
X/* */

X/* static printnum(x) */
X/* */
X/* Print the number x onto the appropriate output. */
X/* */
X/*****************************************************************************/
X
Xstatic printnum(x)
Xint x;
X{ static unsigned char buff[20];
X sprintf(buff, "%d", x);
X print(buff);
X} /* end printnum */


X
X
X/*****************************************************************************/
X/* */

X/* static tab(x) */
X/* */
X/* Tab to column x, or anyway insert at least one space. */
X/* */
X/*****************************************************************************/
X
Xstatic tab(x)
Xint x;
X{ do
X print(" ");
X while( col < x );
X} /* end tab */


X
X
X/*@@**************************************************************************/
X/* */

X/* static newline() */
X/* */
X/* Echo a newline to the appropriate output (unless output is a string). */
X/* Correct indenting and right limits are maintained, if possible. */
X/* */
X/*****************************************************************************/
X
Xstatic newline()
X{ if( fp == null ) AppendString(" ");
X else
X { fputs("\n", fp);
X fflush(fp);
X for( col = 0; col < indent; col++ ) fputs(" ", fp);
X }
X} /* end newline */


X
X
X/*****************************************************************************/
X/* */

X/* static space(n) */
X/* */
X/* Echo n spaces to the appropriate output. */
X/* Correct indenting and right limits are maintained, if possible. */
X/* */
X/*****************************************************************************/
X
Xstatic space(n)
Xint n;
X{ int i;
X if( fp == null )
X for( i = 0; i < n; i++ ) AppendString(" ");
X else if( col + n > limit )
X { fputs("\n", fp);
X for( col = 0; col < n-1; col++ ) fputs(" ", fp);
X }
X else for( i = 0; i < n; col++, i++ ) fputs(" ", fp);
X} /* end space */


X
X
X/*@@**************************************************************************/
X/* */

X/* static echo(x, outer_prec) */
X/* */
X/* Echo x. The result will be enclosed in braces only if its precedence */
X/* is less than or equal to outer_prec (words and parameterless closures */
X/* are taken to have infinite precedence, i.e. never enclosed in braces). */
X/* */
X/*****************************************************************************/
X
Xstatic echo(x, outer_prec)
XOBJECT x; unsigned outer_prec;
X{ OBJECT link, y, tmp, sym;
X unsigned char str[10], *op; int prec, i;
X BOOLEAN npar_seen, name_printed, lbr_printed, braces_needed;
X


X switch( type(x) )
X {
X

X case DEAD:
X
X print("#dead");
X break;
X
X case UNATTACHED:
X
X print( "#unattached " );
X moveright();


X if( Down(x) != x )

X { Child(y, Down(x));
X if( y != x ) echo(y, NO_PREC);
X else print("<child is self!>");
X }
X else print("<no child!>");
X moveleft();
X break;
X
X


X case EXPAND_IND:
X case GALL_PREC:
X case GALL_FOLL:
X case GALL_TARG:
X case CROSS_PREC:
X case CROSS_FOLL:
X case CROSS_TARG:

X case RECURSIVE:
X
X print("#"); print(Image(type(x))); print(" ");
X echo(actual(x), NO_PREC);
X break;
X
X
X case RECEPTIVE:
X case RECEIVING:
X
X print(type(x) == RECEIVING ? "#receiving " : "#receptive ");
X if( external(actual(x)) ) print("(external) ");
X if( threaded(actual(x)) ) print("(threaded) ");
X if( blocked(x) ) print("(blocked) " );
X if( trigger_externs(x) ) print("(trigger_externs) " );
X if( non_blocking(x) ) print("(non_blocking) " );
X print( type(actual(x)) == CLOSURE ?
X SymName(actual(actual(x))) : Image(type(actual(x))) );
X print(" ");
X for( link = Down(x); link != x; link = NextDown(link) )
X { Child(y, link);
X moveright();
X echo(y, NO_PREC);
X moveleft();


X }
X break;
X
X

X case PRECEDES:
X
X print("#precedes");
X break;
X
X
X case FOLLOWS:
X
X print("#follows");
X if( blocked(x) ) print(" (blocked)");
X Child(y, Down(x));
X if( Up(y) == LastUp(y) ) print(" (no precedes!)");
X break;
X
X
X case HEAD:
X
X print("Galley "); print(SymName(actual(x)));
X print(" into "); print(SymName(whereto(x)));
X for( link = Down(x); link != x; link = NextDown(link) )
X { Child(y, link);
X newline();
X echo(y, type(y) == GAP_OBJ ? VCAT : VCAT_PREC);


X }
X break;
X
X

X case ROW_THR:
X
X print("{R ");
X for( link = Down(x); link != x; link = NextDown(link) )
X { Child(y, link);
X echo(y, VCAT_PREC);
X newline();
X if( NextDown(link) != x ) print("/R ");
X }
X print("R}");
X break;
X
X
X case COL_THR:
X
X print("{C ");
X for( link = Down(x); link != x; link = NextDown(link) )
X { Child(y, link);
X echo(y, HCAT_PREC);
X newline();
X if( NextDown(link) != x ) print("|C ");
X }
X print("C}");
X break;
X
X
X case VCAT: op = (unsigned char *) "/", prec = VCAT_PREC; goto ETC;
X case HCAT: op = (unsigned char *) "|", prec = HCAT_PREC; goto ETC;
X case ACAT: op = (unsigned char *) "&", prec = ACAT_PREC; goto ETC;
X
X ETC:


X if( Down(x) == x )

X { print(op);
X print("<empty>");
X break;
X }
X if( prec <= outer_prec ) print("{ ");
X /* *** if( Down(x) == LastDown(x) ) print(op); must be manifested */
X for( link = Down(x); link != x; link = NextDown(link) )
X { Child(y, link);
X if( is_index(type(y)) )
X newline();
X else if( (type(y) == GAP_OBJ && type(x) != ACAT) )
X newline();
X if( type(y) == GAP_OBJ ) echo(y, type(x));
X else echo(y, prec);
X }
X if( prec <= outer_prec ) print(" }");
X break;
X
X
X case GAP_OBJ:
X
X /* in this case the outer_prec argument is VCAT, HCAT or ACAT */


X if( Down(x) != x )

X { if( outer_prec == ACAT ) print(" ");
X print( EchoCatOp(outer_prec, mark(gap(x)), join(gap(x))) );
X Child(y, Down(x));
X echo(y, FORCE_PREC);
X print(" ");
X }
X else if( outer_prec == ACAT )
X { for( i = 1; i <= vspace(x); i++ ) newline();
X for( i = 1; i <= hspace(x); i++ ) print(" ");
X }
X else
X { print( EchoCatOp(outer_prec, mark(gap(x)), join(gap(x))) );
X print( EchoGap(&gap(x)) );
X print(" ");


X }
X break;
X
X

X case WORD:
X
X if( strlen(string(x)) == 0 )
X { print(KW_LBR);
X print(KW_RBR);
X }
X else print( string(x) );
X break;
X
X
X case ENV:
X
X /* debug only */
X print("<");
X for( link = Down(x); link != x; link = NextDown(link) )
X { Child(y, link);
X if( type(y) == CLOSURE )
X { print( SymName(actual(y)) );
X echo(GetEnv(y), NO_PREC);
X }
X else if( type(y) == ENV ) echo(y, NO_PREC);
X else print(Image(type(y)));
X if( NextDown(link) != x ) print(" ");
X }
X print(">");
X break;
X
X
X case CROSS:
X
X assert( Down(x) != x, "echo: CROSS Down(x)!" );
X Child(y, Down(x));
X if( type(y) == CLOSURE ) print(SymName(actual(y)));
X else
X { print(KW_LBR);
X echo(y, NO_PREC);
X print(KW_RBR);
X }
X print(KW_CROSS);
X if( NextDown(Down(x)) != x )
X { Child(y, NextDown(Down(x)));
X echo(y, NO_PREC);
X }
X else print("??");
X break;
X
X


X case CLOSURE:
X
X sym = actual(x);

X braces_needed =
X precedence(sym) <= outer_prec && (has_lpar(sym) || has_rpar(sym));
X
X /* print brace if needed */
X if( braces_needed ) print(KW_LBR), print(" ");
X
X npar_seen = FALSE; name_printed = FALSE;
X for( link = Down(x); link != x; link = NextDown(link) )
X { Child(y, link);
X if( type(y) == PAR )
X { assert( Down(y) != y, "EchoObject: Down(PAR)!" );
X switch( type(actual(y)) )
X {
X case LPAR: Child(tmp, Down(y));
X echo(tmp, (unsigned) precedence(sym));
X print(" ");
X break;
X
X case NPAR: if( !name_printed )
X { print(SymName(sym));
X if( external(x) || threaded(x) )
X { print(" #");
X if( external(x) ) print(" external");
X if( threaded(x) ) print(" threaded");
X newline();
X }


X name_printed = TRUE;
X }

X newline(); print(" ");
X print( SymName(actual(y)) );
X print(" "); print(KW_LBR); print(" ");
X Child(tmp, Down(y));
X echo(tmp, NO_PREC);
X print(" "); print(KW_RBR);
X npar_seen = TRUE;
X break;
X
X case RPAR: if( !name_printed )
X { print(SymName(sym));
X if( external(x) || threaded(x) )
X { print(" #");
X if( external(x) ) print(" external");
X if( threaded(x) ) print(" threaded");
X newline();
X }
X name_printed = TRUE;
X }
X if( npar_seen ) newline();
X else print(" ");
X Child(tmp, Down(y));
X if( has_body(sym) )
X { print(KW_LBR); print(" ");
X echo(tmp, NO_PREC);
X print(" "); print(KW_RBR);
X }
X else echo(tmp, (unsigned) precedence(sym));
X break;
X
X default: Error(INTERN, &fpos(y), "echo: %s",
X Image(type(actual(y))) );
X break;
X
X }
X }
X }
X if( !name_printed )
X { print( SymName(sym) );
X if( external(x) || threaded(x) )
X { print(" #");
X if( external(x) ) print(" external");
X if( threaded(x) ) print(" threaded");
X newline();
X }
X }
X


X /* print closing brace if needed */

X if( braces_needed ) print(" "), print(KW_RBR);


X break;
X
X
X case SPLIT:
X

X /* this should occur only in debug output case */
X print(KW_SPLIT); moveright();
X Child(y, DownDim(x, COL));
X print(" ");
X echo(y, FORCE_PREC);
X moveleft();
X break;
X
X
X case PAR:
X
X /* this should occur only in debug output case */
X print("par "); print(SymName(actual(x)));
X break;
X
X
X case CR_LIST:
X
X print("(");
X for( link = Down(x); link != x; link = NextDown(link) )
X { Child(y, link);
X echo(y, NO_PREC);
X if( NextDown(link) != x ) print(", ");
X }
X print(")");
X break;
X
X
X case MACRO:
X
X newline(); print(KW_MACRO);
X print(" "); print(SymName(x));
X if( sym_body(x) != nil )
X { newline(); print(KW_LBR);
X y = sym_body(x);
X do
X { for( i = 1; i <= vspace(y); i++ ) newline();
X for( i = 1; i <= hspace(y); i++ ) print(" ");
X print(EchoToken(y));
X y = succ(y, PARENT);
X } while( y != sym_body(x) );
X newline(); print(KW_RBR);
X }
X else print(" "), print(KW_LBR), print(KW_RBR);
X if( visible(x) ) print(" # (visible)");
X break;
X
X
X case NPAR:
X case LOCAL:
X
X /* print predefined operators in abbreviated form */
X if( sym_body(x) == nil && enclosing(x) != nil )
X { tab(3); print("# sys ");
X print(SymName(x));
X break;
X }
X
X /* print def line and miscellaneous debug info */
X if( type(x) == LOCAL ) newline();
X print(type(x) == NPAR ? KW_NAMED : KW_DEF);
X print(" "); print( SymName(x) );
X if( recursive(x) || indefinite(x) || visible(x) ||
X is_extern_target(x) || uses_extern_target(x) || uses_galley(x) )
X { tab(25); print("#");
X if( visible(x) ) print(" visible");
X if( recursive(x) ) print(" recursive");
X if( indefinite(x) ) print(" indefinite");
X if( is_extern_target(x) ) print(" is_extern_target");
X if( uses_extern_target(x) ) print(" uses_extern_target");
X if( uses_galley(x) ) print(" uses_galley");
X }
X
X /* print uses list, if necessary */
X if( uses(x) != nil || dirty(x) )
X { newline(); print(" # ");
X if( dirty(x) ) print("dirty, ");
X print("uses");
X if( uses(x) != nil )
X { tmp = next(uses(x));
X do
X { print(" "), print( SymName(item(tmp)) );
X tmp = next(tmp);
X } while( tmp != next(uses(x)) );
X }
X /* ***
X for( tmp = uses(x); tmp != nil; tmp = next(tmp) )
X { print(" "), print( SymName(item(tmp)) );


X }
X *** */
X }
X

X /* print precedence, if necessary */
X if( precedence(x) != DEFAULT_PREC )
X { newline(); print(" "); print(KW_PRECEDENCE);
X sprintf(str, " %d", precedence(x));
X print(str);
X }
X
X /* print associativity, if necessary */
X if( !right_assoc(x) )
X { newline(); print(" ");
X print(KW_ASSOC); print(" "); print(KW_LEFT);
X }
X
X /* print named parameters and local objects */
X lbr_printed = FALSE;
X for( link = Down(x); link != x; link = NextDown(link) )
X { Child(y, link);
X assert( enclosing(y) == x, "echo: enclosing(y) != x!" );


X switch( type(y) )
X {

X case LPAR:
X case RPAR: newline(); print(" ");
X print( type(y) == LPAR ? KW_LEFT :
X has_body(x) ? KW_BODY : KW_RIGHT);
X print(" ");
X print( SymName(y) );
X print(" # uses_count = ");
X printnum(uses_count(y));
X if( visible(y) ) print(" (visible)");
X break;
X
X case NPAR: moveright(); newline();
X echo(y, NO_PREC);
X print(" # uses_count = ");
X printnum(uses_count(y));
X moveleft();
X break;
X
X case MACRO:
X case LOCAL: if( !lbr_printed )
X { newline();
X print(KW_LBR);
X lbr_printed = TRUE;
X }
X moveright();
X echo(y, NO_PREC);
X moveleft(); newline();
X break;
X
X default: Error(FATAL, &fpos(y), "echo: type(y) = %s",
X Image(type(y)));
X break;
X }
X }
X if( type(x) == NPAR && Down(x) == x ) print(" ");
X else newline();
X if( !lbr_printed )
X { print(KW_LBR); print(" ");
X lbr_printed = TRUE;
X }
X else print(" ");
X
X /* print body */
X moveright();
X if( sym_body(x) != nil ) echo(sym_body(x), NO_PREC);
X moveleft(); if( type(x) == LOCAL ) newline();
X print(KW_RBR);
X break;
X
X


X case ONE_COL:
X case ONE_ROW:
X case HCONTRACT:
X case VCONTRACT:
X case HEXPAND:
X case VEXPAND:
X case PADJUST:
X case HADJUST:
X case VADJUST:
X case HSCALE:
X case VSCALE:

X case NEXT:


X case WIDE:
X case HIGH:

X case INCGRAPHIC:
X case SINCGRAPHIC:
X case GRAPHIC:

X case ROTATE:
X case SCALE:


X case CASE:
X case YIELD:
X case FONT:
X case SPACE:
X case BREAK:

X case OPEN:
X case TAGGED:
X
X /* print enclosing left brace if needed */
X braces_needed = (DEFAULT_PREC <= outer_prec);
X if( braces_needed ) print(KW_LBR), print(" ");
X
X /* print left parameter */


X if( Down(x) != LastDown(x) )
X { Child(y, Down(x));

X echo(y, max(outer_prec, DEFAULT_PREC));
X print(" ");
X }
X
X print(Image(type(x)));
X
X /* print right parameter */
X assert( LastDown(x) != x, "echo: right parameter of predefined!" );
X print(" ");
X Child(y, LastDown(x));
X echo(y, type(x)==OPEN ? FORCE_PREC : max(outer_prec,DEFAULT_PREC));
X if( braces_needed ) print(" "), print(KW_RBR);
X break;
X
X
X case NULL_CLOS:
X
X print(Image(type(x)));
X break;
X
X
X case CR_ROOT:
X
X for( link = Down(x); link != x; link = NextDown(link) )
X { Child(y, link);
X echo(y, NO_PREC); newline();


X }
X break;
X
X

X case CROSS_SYM:
X
X print("Cross-references for ");
X print(SymName(symb(x))); newline();
X switch( target_state(x) )
X {
X case 0: print("NO_TARGET");
X break;
X
X case 1: print("SEEN_TARGET ");
X printnum(target_seq(x));
X print(": ");
X echo(target_val(x), NO_PREC);
X break;
X
X case 2: print("WRITTEN_TARGET ");
X printnum(target_seq(x));
X print(": to file ");
X print(FileName(target_file(x)));
X print(" at ");
X printnum(target_pos(x));
X break;
X
X default: print("ILLEGAL!");
X break;
X }
X newline();
X for( link = Down(x); link != x; link = NextDown(link) )
X { Child(y, link);
X print(" ");
X if( gall_rec(y) ) print("gall_rec!");
X else print(string(y));
X newline();


X }
X break;
X
X
X default:
X

X Error(INTERN, no_fpos, "echo found %s", Image(type(x)));
X break;


X
X } /* end switch */

X} /* end echo */


X
X
X/*@@**************************************************************************/
X/* */

X/* unsigned char *EchoObject(file_ptr, x) */
X/* */
X/* Send an image of unsized object x to result (if file_ptr is null) or to */
X/* file file_ptr if file_ptr is not null. */
X/* */
X/*****************************************************************************/
X
Xunsigned char *EchoObject(file_ptr, x)
XFILE *file_ptr; OBJECT x;
X{ debug0(DOE, D, "EchoObject()");
X fp = file_ptr;
X col = 0;
X indent = 0;
X limit = 60;


X if( fp == null )

X { BeginString();
X if( x == nil ) AppendString("<nil>");
X else echo(x, type(x) == GAP_OBJ ? VCAT : 0);
X return EndString();
X }
X else
X { if( x != nil )
X { echo(x, type(x) == GAP_OBJ ? VCAT : 0);
X fprintf(file_ptr, "\n");
X }
X else fprintf(file_ptr, "<nil>\n");
X debug0(DOE, D, "EchoObject returning");
X return (unsigned char *) "";
X }
X} /* end EchoObject */
X#endif
END_OF_FILE
if test 20719 -ne `wc -c <'lout/z25.c'`; then
echo shar: \"'lout/z25.c'\" unpacked with wrong size!
fi
# end of 'lout/z25.c'
fi
echo shar: End of archive 12 \(of 30\).
cp /dev/null ark12isdone

Jeff Kingston

unread,
Jun 1, 1993, 1:19:42 AM6/1/93
to
Submitted-by: je...@joyce.cs.su.oz.au (Jeff Kingston)
Posting-number: Volume 37, Issue 111
Archive-name: lout/part13
Environment: UNIX

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: lout/z01.c lout/z04.c lout/z05.c lout/z12.c lout/z18.c
# Wrapped by kent@sparky on Sun May 30 19:43:57 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 13 (of 30)."'
if test -f 'lout/z01.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/z01.c'\"
else
echo shar: Extracting \"'lout/z01.c'\" \(16696 characters\)
sed "s/^X//" >'lout/z01.c' <<'END_OF_FILE'
X/*@z01.c:Supervise:main()@****************************************************/


X/* */
X/* LOUT: A HIGH-LEVEL LANGUAGE FOR DOCUMENT FORMATTING (VERSION 2.03) */
X/* COPYRIGHT (C) 1993 Jeffrey H. Kingston */
X/* */
X/* Jeffrey H. Kingston (je...@cs.su.oz.au) */
X/* Basser Department of Computer Science */
X/* The University of Sydney 2006 */
X/* AUSTRALIA */
X/* */
X/* This program is free software; you can redistribute it and/or modify */
X/* it under the terms of the GNU General Public License as published by */
X/* the Free Software Foundation; either version 1, or (at your option) */
X/* any later version. */
X/* */
X/* This program is distributed in the hope that it will be useful, */
X/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
X/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
X/* GNU General Public License for more details. */
X/* */
X/* You should have received a copy of the GNU General Public License */
X/* along with this program; if not, write to the Free Software */
X/* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
X/* */

X/* FILE: z01.c */
X/* MODULE: Supervise */
X/* EXTERNS: main() */


X/* */
X/*****************************************************************************/
X#include "externs"
X

X/*****************************************************************************/
X/* */
X/* BOOLEAN StringBeginsWith(str, pattern) */
X/* BOOLEAN StringContains(str, pattern) */
X/* */
X/* Check whether str begins with (or contains within it) pattern. This */
X/* could be done by the standard function "strstr" except that not all */
X/* systems have it and in at least one case the implementation has a bug. */
X/* */
X/*****************************************************************************/
X
XBOOLEAN StringBeginsWith(str, pattern)
Xunsigned char *str, *pattern;
X{ unsigned char *sp, *pp;
X sp = str; pp = pattern;
X while( *sp != '\0' && *pp != '\0' )
X { if( *sp++ != *pp++ ) return FALSE;
X }
X return (*pp == '\0');
X} /* end StringBeginsWith */
X
XBOOLEAN StringContains(str, pattern)
Xunsigned char *str, *pattern;
X{ unsigned char *sp;
X for( sp = str; *sp != '\0'; sp++ )
X { if( StringBeginsWith(sp, pattern) ) return TRUE;
X }
X return FALSE;
X} /* end StringContains */


X
X
X/*****************************************************************************/
X/* */

X/* StartSym the symbol table entry for \Start (overall scope) */
X/* GalleySym the symbol table entry for @Galley */
X/* InputSym the symbol table entry for @Input@ */
X/* PrintSym the symbol table entry for \Print (root target) */
X/* */
X/*****************************************************************************/
X
XOBJECT StartSym, GalleySym, InputSym, PrintSym;
X
X/*****************************************************************************/
X/* */
X/* AllowCrossDb Allow references to OldCrossDb and NewCrossDb */
X/* */
X/*****************************************************************************/
X
XBOOLEAN AllowCrossDb;
X
X/*****************************************************************************/
X/* */
X/* Encapsulated Produce a one-page encapsulated PostScript file */
X/* */
X/*****************************************************************************/
X
XBOOLEAN Encapsulated;


X
X
X/*****************************************************************************/
X/* */

X/* OBJECT load(xstr, xpredefined, xleft, xright, xindef, xprec) */
X/* */
X/* Load a predefined operator with these attributes into the symbol table. */
X/* If the operator has parameters, load symbols for those also. */
X/* */
X/*****************************************************************************/
X
Xstatic OBJECT load(xstr, xpre, xleft, xright, xindef, xprec)
Xunsigned char *xstr; unsigned xpre; BOOLEAN xleft, xright, xindef;
Xunsigned char xprec;
X{ OBJECT s;
X s = InsertSym(xstr, LOCAL, no_fpos, xprec, xindef, FALSE, xpre, StartSym,nil);
X if( xleft )
X InsertSym("pa", LPAR, no_fpos, DEFAULT_PREC, FALSE, FALSE, 0, s, nil);
X if( xright )
X InsertSym("pb", RPAR, no_fpos, DEFAULT_PREC, FALSE, FALSE, 0, s, nil);
X if( xleft && xright ) right_assoc(s) = TRUE;
X return s;
X} /* end load */


X
X
X/*@@**************************************************************************/
X/* */

X/* main(argc, argv) */
X/* */
X/* Read command line, initialise everything, read definitions, read */
X/* galleys, clean up and exit. */
X/* */
X/*****************************************************************************/
X
Xmain(argc, argv)
Xint argc; unsigned char *argv[];
X{ int i;
X OBJECT t, res, s; /* current token, parser o/p */
X BOOLEAN stdin_seen; /* TRUE when stdin file seen */
X unsigned char *cross_db; /* name of cross ref database*/
X unsigned char *outfile; /* name of output file */
X FILE *out_fp;
X
X /* initialise various modules, add current directory to search paths */
X AllowCrossDb = TRUE;
X Encapsulated = FALSE;
X InitSym();
X LexInit();
X MemInit();
X InitFiles();
X AddToPath(FONT_PATH, "");
X AddToPath(SOURCE_PATH, "");
X AddToPath(DATABASE_PATH, "");
X AddToPath(INCLUDE_PATH, "");
X
X /* read command line */
X stdin_seen = FALSE;
X cross_db = (unsigned char *) CROSS_DB;
X outfile = (unsigned char *) "-";
X for( i = 1; i < argc; i++ )
X { if( *argv[i] == '-' ) switch( *(argv[i]+1) )
X {
X case 'o': /* read name of output file */
X if( *(argv[i]+2) == '\0' )
X Error(FATAL, no_fpos, "usage: -o<filename>");
X outfile = argv[i]+2;
X break;
X
X case 's': /* suppress references to OldCrossDb and NewCrossDb */
X AllowCrossDb = FALSE;
X break;
X
X case 'c': /* read name of cross reference database */
X cross_db = argv[i]+2;
X break;
X
X case 'e': /* read log file name */
X if( *(argv[i]+2) == '\0' )
X Error(FATAL, no_fpos, "usage: -e<filename>");
X ErrorInit(argv[i]+2);
X break;
X
X case 'E': /* -EPS produces encapsulated PostScript output */
X if( strcmp(argv[i]+1, "EPS") != 0 )
X Error(FATAL, no_fpos, "usage: -EPS");
X Encapsulated = TRUE;
X break;
X
X case 'D': /* add directory to database and sysdatabase paths */
X if( *(argv[i]+2) == '\0' )
X Error(FATAL, no_fpos, "usage: -D<dirname>");
X AddToPath(DATABASE_PATH, argv[i]+2);
X AddToPath(SYSDATABASE_PATH, argv[i]+2);
X break;
X
X case 'F': /* add directory to font path */
X if( *(argv[i]+2) == '\0' )
X Error(FATAL, no_fpos, "usage: -F<dirname>");
X AddToPath(FONT_PATH, argv[i]+2);
X break;
X
X case 'I': /* add directory to include and sysinclude paths */
X if( *(argv[i]+2) == '\0' )
X Error(FATAL, no_fpos, "usage: -I<dirname>");
X AddToPath(INCLUDE_PATH, argv[i]+2);
X AddToPath(SYSINCLUDE_PATH, argv[i]+2);
X break;
X
X case 'i': /* read sysinclude file */
X if( *(argv[i]+2) == '\0' )
X Error(FATAL, no_fpos, "usage: -i<filename>");
X t = MakeWord(argv[i]+2, no_fpos);
X DefineFile(t, SOURCE_FILE, SYSINCLUDE_PATH);
X break;
X
X case 'h': /* declare hyphenation file */
X if( FirstFile(HYPH_FILE) != NO_FILE )
X Error(FATAL, no_fpos, "two -h options illegal");
X if( *(argv[i]+2) == '\0' )
X Error(FATAL, no_fpos, "usage: -h<filename>");
X if( strlen(argv[i]+2) + strlen(HYPH_SUFFIX) >= MAX_LINE) Error(FATAL, no_fpos, "-h option too long");
X t = MakeWord(argv[i] + 2, no_fpos);
X DefineFile(t, HYPH_FILE, INCLUDE_PATH);
X t = MakeWordTwo(string(t), HYPH_SUFFIX, no_fpos);
X DefineFile(t, HYPH_PACKED_FILE, INCLUDE_PATH);
X break;
X
X case 'V': fprintf(stderr, "%s\n", LOUT_VERSION);
X break;
X
X case 'd': debug_init(argv[i]);
X break;
X
X case '\0': /* read stdin as file name */
X if( stdin_seen )
X Error(FATAL, no_fpos, "stdin read twice!");
X stdin_seen = TRUE;
X t = MakeWord("-", no_fpos);
X DefineFile(t, SOURCE_FILE, SOURCE_PATH);
X break;
X
X default: Error(FATAL, no_fpos,
X "unknown command line flag %s", argv[i]);
X break;
X }
X else DefineFile(MakeWord(argv[i], no_fpos), SOURCE_FILE, SOURCE_PATH);
X } /* for */
X
X /* define hyphenation file if not done already by -h flag */
X if( FirstFile(HYPH_FILE) == NO_FILE )
X { t = MakeWord(HYPH_FILENAME, no_fpos);
X DefineFile(t, HYPH_FILE, SYSINCLUDE_PATH);
X t = MakeWordTwo(HYPH_FILENAME, HYPH_SUFFIX, no_fpos);
X DefineFile(t, HYPH_PACKED_FILE, SYSINCLUDE_PATH);
X }
X
X /* start timing if required */
X ifdebug(DPP, D, ProfileOn("main"));
X
X /* open output file, or stdout if none specified, and initialize printer */
X if( strcmp(outfile, "-") == 0 ) out_fp = stdout;
X else if( (out_fp = fopen(outfile, "w")) == null )
X Error(FATAL, no_fpos, "cannot open output file %s", outfile);
X PrintInit(out_fp);
X
X /* append default directories to file search paths */
X AddToPath(FONT_PATH, FONT_DIR);
X AddToPath(SYSDATABASE_PATH, DATA_DIR);
X AddToPath(DATABASE_PATH, DATA_DIR);
X AddToPath(SYSINCLUDE_PATH, INCL_DIR);
X AddToPath(INCLUDE_PATH, INCL_DIR);
X
X /* use stdin if no source files were mentioned */
X if( FirstFile(SOURCE_FILE) == NO_FILE )
X DefineFile(MakeWord("-", no_fpos), SOURCE_FILE, SOURCE_PATH);
X
X /* load predefined symbols into symbol table */
X StartSym = nil;
X StartSym = load("\\Start", 0, FALSE, FALSE, TRUE, NO_PREC );
X GalleySym = load(KW_GALLEY, 0, FALSE, FALSE, TRUE, NO_PREC );
X InputSym = load(KW_INPUT, 0, FALSE, FALSE, TRUE, NO_PREC );
X PrintSym = load("\\Print", 0, FALSE, FALSE, TRUE, NO_PREC );
X
X load(KW_BEGIN, BEGIN, FALSE, FALSE, FALSE, BEGIN_PREC );
X load(KW_END, END, FALSE, FALSE, FALSE, END_PREC );
X load(KW_ENV, ENV, FALSE, FALSE, FALSE, NO_PREC );
X load(KW_CLOS, CLOS, FALSE, FALSE, FALSE, NO_PREC );
X load(KW_LVIS, LVIS, FALSE, FALSE, FALSE, NO_PREC );
X load(KW_LBR, LBR, FALSE, FALSE, FALSE, LBR_PREC );
X load(KW_RBR, RBR, FALSE, FALSE, FALSE, RBR_PREC );
X load(KW_INCLUDE, INCLUDE, FALSE, FALSE, FALSE, NO_PREC );
X load(KW_SYSINCLUDE, SYS_INCLUDE, FALSE, FALSE, FALSE, NO_PREC );
X load(KW_PREPEND, PREPEND, FALSE, FALSE, FALSE, NO_PREC );
X load(KW_SYSPREPEND, SYS_PREPEND, FALSE, FALSE, FALSE, NO_PREC );
X load(KW_DATABASE, DATABASE, FALSE, FALSE, FALSE, NO_PREC );
X load(KW_SYSDATABASE, SYS_DATABASE, FALSE, FALSE, FALSE, NO_PREC );
X load(KW_USE, USE, FALSE, FALSE, FALSE, NO_PREC );
X load(KW_CASE, CASE, TRUE, TRUE, FALSE, DEFAULT_PREC);
X load(KW_YIELD, YIELD, TRUE, TRUE, FALSE, DEFAULT_PREC);
X load(KW_FONT, FONT, TRUE, TRUE, FALSE, DEFAULT_PREC);
X load(KW_SPACE, SPACE, TRUE, TRUE, FALSE, DEFAULT_PREC);
X load(KW_BREAK, BREAK, TRUE, TRUE, FALSE, DEFAULT_PREC);
X load(KW_NEXT, NEXT, FALSE, TRUE, FALSE, DEFAULT_PREC);
X load(KW_OPEN, OPEN, TRUE, TRUE, FALSE, DEFAULT_PREC);
X load(KW_TAGGED, TAGGED, TRUE, TRUE, FALSE, DEFAULT_PREC);
X load(KW_HIGH, HIGH, TRUE, TRUE, FALSE, DEFAULT_PREC);
X load(KW_WIDE, WIDE, TRUE, TRUE, FALSE, DEFAULT_PREC);
X load(KW_ONE_COL, ONE_COL, FALSE, TRUE, FALSE, DEFAULT_PREC);
X load(KW_ONE_ROW, ONE_ROW, FALSE, TRUE, FALSE, DEFAULT_PREC);
X load(KW_HSCALE, HSCALE, FALSE, TRUE, FALSE, DEFAULT_PREC);
X load(KW_VSCALE, VSCALE, FALSE, TRUE, FALSE, DEFAULT_PREC);
X load(KW_SCALE, SCALE, TRUE, TRUE, FALSE, DEFAULT_PREC);
X load(KW_HCONTRACT, HCONTRACT, FALSE, TRUE, FALSE, DEFAULT_PREC);
X load(KW_VCONTRACT, VCONTRACT, FALSE, TRUE, FALSE, DEFAULT_PREC);
X load(KW_HEXPAND, HEXPAND, FALSE, TRUE, FALSE, DEFAULT_PREC);
X load(KW_VEXPAND, VEXPAND, FALSE, TRUE, FALSE, DEFAULT_PREC);
X load(KW_PADJUST, PADJUST, FALSE, TRUE, FALSE, DEFAULT_PREC);
X load(KW_HADJUST, HADJUST, FALSE, TRUE, FALSE, DEFAULT_PREC);
X load(KW_VADJUST, VADJUST, FALSE, TRUE, FALSE, DEFAULT_PREC);
X load(KW_ROTATE, ROTATE, TRUE, TRUE, FALSE, DEFAULT_PREC);
X load(KW_INCGRAPHIC, INCGRAPHIC, FALSE, TRUE, FALSE, DEFAULT_PREC);
X load(KW_SINCGRAPHIC, SINCGRAPHIC, FALSE, TRUE, FALSE, DEFAULT_PREC);
X load(KW_GRAPHIC, GRAPHIC, TRUE, TRUE, FALSE, DEFAULT_PREC);
X load(KW_CROSS, CROSS, TRUE, TRUE, FALSE, CROSSOP_PREC);
X load(KW_NULL, NULL_CLOS, FALSE, FALSE, TRUE, NO_PREC );
X
X#define setcat(s, mk, jn) has_mark(s)=mk, has_join(s)=jn
X
X s=load(KW_VCAT_NN, VCAT, TRUE, TRUE, FALSE, VCAT_PREC); setcat(s,FALSE,FALSE);
X s=load(KW_VCAT_MN, VCAT, TRUE, TRUE, FALSE, VCAT_PREC); setcat(s,TRUE, FALSE);
X s=load(KW_VCAT_NJ, VCAT, TRUE, TRUE, FALSE, VCAT_PREC); setcat(s,FALSE,TRUE);
X s=load(KW_VCAT_MJ, VCAT, TRUE, TRUE, FALSE, VCAT_PREC); setcat(s,TRUE, TRUE);
X s=load(KW_HCAT_NN, HCAT, TRUE, TRUE, FALSE, HCAT_PREC); setcat(s,FALSE,FALSE);
X s=load(KW_HCAT_MN, HCAT, TRUE, TRUE, FALSE, HCAT_PREC); setcat(s,TRUE, FALSE);
X s=load(KW_HCAT_NJ, HCAT, TRUE, TRUE, FALSE, HCAT_PREC); setcat(s,FALSE,TRUE);
X s=load(KW_HCAT_MJ, HCAT, TRUE, TRUE, FALSE, HCAT_PREC); setcat(s,TRUE, TRUE);
X s=load(KW_ACAT_NJ, ACAT, TRUE, TRUE, FALSE, ACAT_PREC); setcat(s,FALSE,TRUE);
X s=load(KW_ACAT_MJ, ACAT, TRUE, TRUE, FALSE, ACAT_PREC); setcat(s,TRUE, TRUE);
X
X /* intialize current time and load @Moment symbol */
X InitTime();
X
X /* initialise scope chain to <StartSym> */
X PushScope(StartSym, FALSE, FALSE);
X
X /* initialise lexical analyser */
X LexPush(FirstFile(SOURCE_FILE), 0, SOURCE_FILE);
X
X /* process input files */
X InitParser(cross_db);
X t = NewToken(BEGIN, no_fpos, 0, 0, BEGIN_PREC, StartSym);
X res = Parse(&t, StartSym, TRUE, TRUE);
X TransferEnd(res);
X TransferClose();
X
X /* close various modules */
X PrintClose();
X CrossClose();
X CloseFiles();


X
X /* wrapup */

X ifdebug(DST, D, CheckSymSpread() );
X debug0(ANY, D, "commencing deletes");
X ifdebug(ANY, D, DeleteEverySym() );
X ifdebug(DMA, D, DebugMemory() );
X ifdebug(DPP, D, ProfileOff("main"));
X ifdebug(DPP, D, ProfilePrint());
X exit(0);
X return 0;
X} /* end main */
END_OF_FILE
if test 16696 -ne `wc -c <'lout/z01.c'`; then
echo shar: \"'lout/z01.c'\" unpacked with wrong size!
fi
# end of 'lout/z01.c'
fi
if test -f 'lout/z04.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/z04.c'\"
else
echo shar: Extracting \"'lout/z04.c'\" \(7382 characters\)
sed "s/^X//" >'lout/z04.c' <<'END_OF_FILE'
X/*@z04.c:Token Service:NewToken(), CopyTokenList(), EchoToken()@**************/


X/* */
X/* LOUT: A HIGH-LEVEL LANGUAGE FOR DOCUMENT FORMATTING (VERSION 2.03) */
X/* COPYRIGHT (C) 1993 Jeffrey H. Kingston */
X/* */
X/* Jeffrey H. Kingston (je...@cs.su.oz.au) */
X/* Basser Department of Computer Science */
X/* The University of Sydney 2006 */
X/* AUSTRALIA */
X/* */
X/* This program is free software; you can redistribute it and/or modify */
X/* it under the terms of the GNU General Public License as published by */
X/* the Free Software Foundation; either version 1, or (at your option) */
X/* any later version. */
X/* */
X/* This program is distributed in the hope that it will be useful, */
X/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
X/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
X/* GNU General Public License for more details. */
X/* */
X/* You should have received a copy of the GNU General Public License */
X/* along with this program; if not, write to the Free Software */
X/* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
X/* */

X/* FILE: z04.c */
X/* MODULE: Token Service */
X/* EXTERNS: NewToken(), CopyTokenList(), EchoCatOp(), EchoToken() */


X/* */
X/*****************************************************************************/
X#include "externs"
X
X
X/*****************************************************************************/
X/* */

X/* OBJECT NewToken(xtype, xfpos, xvspace, xhspace, xprec, xactual) */
X/* */
X/* Returns a new non-WORD token initialised as the parameters indicate. */
X/* */
X/*****************************************************************************/
X
XOBJECT NewToken(xtype, xfpos, xvspace, xhspace, xprec, xactual)
Xunsigned char xtype; FILE_POS *xfpos; unsigned char xvspace, xhspace; unsigned char xprec;
XOBJECT xactual;
X{ OBJECT res;
X debug1(DTS, DDD, "NewToken(%s, ...)", Image(xtype));
X res = New(xtype);
X FposCopy(fpos(res), *xfpos);
X vspace(res) = xvspace;
X hspace(res) = xhspace;
X precedence(res) = xprec;
X actual(res) = xactual;
X debug1(DTS, DDD, "NewToken returning %s", EchoToken(res));
X return res;
X} /* end NewToken */


X
X
X/*****************************************************************************/
X/* */

X/* OBJECT CopyTokenList(x, pos) */
X/* */
X/* Returns a copy of the list of tokens pointed to by x. */
X/* All file positions in the copy are set to *pos. */
X/* */
X/*****************************************************************************/
X
XOBJECT CopyTokenList(x, pos)
XOBJECT x; FILE_POS *pos;
X{ OBJECT y, z, res;
X res = nil;
X y = x;


X if( x != nil )

X do


X { if( type(y) == WORD )

X { z = MakeWord(string(y), pos);
X vspace(z) = vspace(y);
X hspace(z) = hspace(y);
X }
X else z = NewToken(type(y), pos,vspace(y),hspace(y),precedence(y),actual(y));
X res = Append(res, z, PARENT);


X y = succ(y, PARENT);

X } while( y != x );
X return res;
X} /* end CopyTokenList */


X
X
X/*@@**************************************************************************/
X/* */

X/* unsigned char *EchoCatOp(xtype, xmark, xjoin) */
X/* */
X/* Return the catenation operator with this type, mark and join. */
X/* */
X/*****************************************************************************/
X
Xunsigned char *EchoCatOp(xtype, xmark, xjoin)
Xunsigned xtype; BOOLEAN xmark, xjoin;
X{ switch( xtype )
X {
X case VCAT: return (unsigned char *)
X (xmark ? xjoin ? KW_VCAT_MJ : KW_VCAT_MN
X : xjoin ? KW_VCAT_NJ : KW_VCAT_NN);
X
X case HCAT: return (unsigned char *)
X (xmark ? xjoin ? KW_HCAT_MJ : KW_HCAT_MN
X : xjoin ? KW_HCAT_NJ : KW_HCAT_NN);
X
X case ACAT: return (unsigned char *)
X (xmark ? xjoin ? KW_ACAT_MJ : "??"
X : xjoin ? KW_ACAT_NJ : "??");
X
X default: Error(INTERN, no_fpos, "EchoCatOp: xtype = %d", xtype);


X return (unsigned char *) "";
X

X } /* end switch */

X} /* end EchoCatOp */


X
X
X#if DEBUG_ON
X/*****************************************************************************/

X/* */
X/* unsigned char *EchoToken(x) */
X/* */
X/* Return an image of token x. Do not worry about preceding space. */
X/* */
X/*****************************************************************************/
X
Xunsigned char *EchoToken(x)
XOBJECT x;


X{ switch( type(x) )
X {

X case WORD:
X
X return string(x);
X break;
X
X


X case TSPACE:
X case TJUXTA:

X case USE:
X case GSTUB_EXT:
X case GSTUB_INT:
X case GSTUB_NONE:
X
X return Image(type(x));
X break;
X
X
X case BEGIN:
X case END:
X case ENV:
X case CLOS:
X case LBR:
X case RBR:


X case NULL_CLOS:
X case CROSS:

X case ONE_COL:
X case ONE_ROW:

X case WIDE:
X case HIGH:

X case HSCALE:
X case VSCALE:

X case SCALE:


X case HCONTRACT:
X case VCONTRACT:
X case HEXPAND:
X case VEXPAND:
X case PADJUST:
X case HADJUST:
X case VADJUST:

X case ROTATE:


X case CASE:
X case YIELD:
X case FONT:
X case SPACE:
X case BREAK:

X case NEXT:


X case OPEN:
X case TAGGED:

X case INCGRAPHIC:
X case SINCGRAPHIC:
X case GRAPHIC:

X case ACAT:
X case HCAT:
X case VCAT:
X case CLOSURE:
X
X return SymName(actual(x));


X break;
X
X
X default:
X

X Error(INTERN, &fpos(x), "EchoToken: %s", Image(type(x)));
X break;
X }


X return (unsigned char *) "";

X} /* end EchoToken */
X#endif
END_OF_FILE
if test 7382 -ne `wc -c <'lout/z04.c'`; then
echo shar: \"'lout/z04.c'\" unpacked with wrong size!
fi
# end of 'lout/z04.c'
fi
if test -f 'lout/z05.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/z05.c'\"
else
echo shar: Extracting \"'lout/z05.c'\" \(18300 characters\)
sed "s/^X//" >'lout/z05.c' <<'END_OF_FILE'
X/*@z05.c:Read Definitions:ReadDefinitions()@**********************************/


X/* */
X/* LOUT: A HIGH-LEVEL LANGUAGE FOR DOCUMENT FORMATTING (VERSION 2.03) */
X/* COPYRIGHT (C) 1993 Jeffrey H. Kingston */
X/* */
X/* Jeffrey H. Kingston (je...@cs.su.oz.au) */
X/* Basser Department of Computer Science */
X/* The University of Sydney 2006 */
X/* AUSTRALIA */
X/* */
X/* This program is free software; you can redistribute it and/or modify */
X/* it under the terms of the GNU General Public License as published by */
X/* the Free Software Foundation; either version 1, or (at your option) */
X/* any later version. */
X/* */
X/* This program is distributed in the hope that it will be useful, */
X/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
X/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
X/* GNU General Public License for more details. */
X/* */
X/* You should have received a copy of the GNU General Public License */
X/* along with this program; if not, write to the Free Software */
X/* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
X/* */

X/* FILE: z05.c */
X/* MODULE: Read Definitions */
X/* EXTERNS: ReadDefinitions() */


X/* */
X/*****************************************************************************/
X#include "externs"
X

X/*****************************************************************************/
X/* */
X/* check(typ, str, arg1, arg2) */
X/* */
X/* If type(t) != typ, exit with error message. */
X/* */
X/*****************************************************************************/
X
X#define check(typ, str, arg1, arg2) \
Xif( type(t) != typ ) \
X{ Error(WARN, &fpos(t), str, arg1, arg2); \
X debug1(ANY, D, "offending type is %s", Image(type(t))); \
X UnSuppressScope(); \
X *token = t; \
X return; \
X} else


X
X
X/*****************************************************************************/
X/* */

X/* word_check(word, str, arg1, arg2) */
X/* */
X/* If t is not the given word, exit with error message. */
X/* */
X/*****************************************************************************/
X
X#define word_check(word, str, arg1, arg2) \
Xif( type(t) != WORD || strcmp(string(t), word) != 0 ) \
X{ Error(WARN, &fpos(t), str, arg1, arg2); \
X debug1(ANY, D, "offending object is %s", \
X type(t) == WORD ? string(t) : Image(type(t))); \
X UnSuppressScope(); \
X *token = t; \
X return; \
X} else


X
X
X/*****************************************************************************/
X/* */

X/* is_word(t, str) */
X/* */
X/* If t is a token denoting word str, return TRUE. */
X/* */
X/*****************************************************************************/
X
X#define is_word(t, str) (type(t) == WORD && strcmp(string(t), str) == 0)


X
X
X/*****************************************************************************/
X/* */

X/* static ReadFontDef(token, encl) */
X/* */
X/* Read one font definition and pass it on to the font module. The */
X/* syntax is fontdef <family> <face> { <word> }. */
X/* */
X/*****************************************************************************/
X
Xstatic ReadFontDef(token, encl)
XOBJECT *token, encl;
X{ OBJECT t, res[5]; int i;
X
X Dispose(*token);
X SuppressScope();
X for( i = 0; i < 5; i++ )
X { t = LexGetToken();
X check(WORD, "syntax error in %s", KW_FONTDEF, 0);
X if( type(t) == WORD && string(t)[0] == '"' )
X FontStripQuotes(string(t), &fpos(t));
X res[i] = t;
X }
X if( strcmp(string(res[2]), KW_LBR) != 0 )
X Error(WARN, &fpos(res[2]), "missing %s in fontdef", KW_LBR);
X if( strcmp(string(res[4]), KW_RBR) != 0 )
X Error(WARN, &fpos(res[4]), "missing %s in fontdef", KW_RBR);
X Dispose(res[2]); Dispose(res[4]);
X FontDefine(res[0], res[1], res[3]);
X *token = nil;
X UnSuppressScope();
X return;
X} /* end ReadFontDef */


X
X
X/*@@**************************************************************************/
X/* */

X/* static ReadTokenList(res) */
X/* */
X/* Read a list of tokens from input and append them to sym_body(res). */
X/* The list is assumed to begin immediately after an LBR, and input is */
X/* to be read up to and including the matching RBR. */
X/* */
X/*****************************************************************************/
X#define NextToken(t, res) \
X t = LexGetToken(); sym_body(res) = Append(sym_body(res), t, PARENT);
X
Xstatic ReadTokenList(res)
XOBJECT res;
X{ OBJECT t, xsym, new_par;
X NextToken(t, res);
X for(;;) switch(type(t))


X {
X case WORD:
X

X if( string(t)[0] == '@' )

X Error(WARN, &fpos(t), "symbol %s unknown", string(t));
X NextToken(t, res);


X break;
X
X
X case VCAT:

X case HCAT:
X case ACAT:

X case CROSS:
X case NULL_CLOS:

X case ONE_COL:
X case ONE_ROW:

X case WIDE:
X case HIGH:

X case HSCALE:
X case VSCALE:

X case SCALE:


X case HCONTRACT:
X case VCONTRACT:
X case HEXPAND:
X case VEXPAND:
X case PADJUST:
X case HADJUST:
X case VADJUST:

X case ROTATE:


X case CASE:
X case YIELD:
X case FONT:
X case SPACE:
X case BREAK:

X case NEXT:
X case TAGGED:


X case INCGRAPHIC:
X case SINCGRAPHIC:
X case GRAPHIC:
X

X NextToken(t, res);
X break;
X
X
X case LVIS:
X case ENV:
X case USE:
X case BEGIN:
X case END:
X case OPEN:
X
X Error(WARN,&fpos(t),"symbol %s not allowed in macro", SymName(actual(t)));
X NextToken(t, res);
X break;
X
X
X case LBR:
X
X ReadTokenList(res);
X NextToken(t, res);
X break;
X
X
X case RBR:
X
X return;


X
X
X case CLOSURE:
X

X xsym = actual(t);
X PushScope(xsym, TRUE, FALSE);
X NextToken(t, res);
X PopScope();


X if( type(t) == CROSS )

X { NextToken(t, res);
X break;
X }
X
X /* read named parameters */
X while( type(t) == CLOSURE && enclosing(actual(t)) == xsym &&
X type(actual(t)) == NPAR )
X { new_par = t;
X NextToken(t, res);


X if( type(t) != LBR )

X { Error(WARN, &fpos(new_par), "%s must follow name parameter %s",
X KW_LBR, SymName(actual(new_par)));
X break;
X }
X PushScope(actual(new_par), FALSE, FALSE);
X ReadTokenList(res);
X PopScope();
X
X /* get next token, possibly another named parameter */
X PushScope(xsym, TRUE, FALSE);
X NextToken(t, res);
X PopScope();
X }
X
X /* read body parameter, if any */
X if( has_body(xsym) )
X { if( type(t) == LBR )


X { PushScope(xsym, FALSE, TRUE);
X PushScope(ChildSym(xsym, RPAR), FALSE, FALSE);

X ReadTokenList(res);
X PopScope();
X PopScope();
X NextToken(t, res);
X }
X else Error(WARN, &fpos(t), "right parameter of %s must begin with %s",
X SymName(xsym), KW_LBR);
X }
X break;
X
X default:
X
X
X Error(INTERN, &fpos(t), "unknown token type %s", Image(type(t)));
X break;
X
X }
X} /* end ReadTokenList */


X
X
X/*@@**************************************************************************/
X/* */

X/* static ReadMacro(token, encl) */
X/* */
X/* Read a macro from input and insert into symbol table. */
X/* Token *token contains the "macro" keyword. Input is read up to and */
X/* including the closing right brace, and nil is returned in *token if OK. */
X/* The proper scope for reading the macro body is open at entry and exit. */
X/* */
X/*****************************************************************************/
X
Xstatic OBJECT ReadMacro(token, encl)
XOBJECT *token, encl;
X{ OBJECT t, res; int depth;
X
X /* find macro name and insert into symbol table */
X SuppressScope();
X Dispose(*token); t = LexGetToken();
X check(WORD, "%s ignored - can't find name", KW_MACRO, 0);
X res = InsertSym(string(t), MACRO, &fpos(t), 0, FALSE, TRUE, 0, encl, nil);
X
X /* find opening left brace */
X t = LexGetToken();
X word_check(KW_LBR, "%s ignored - can't find opening %s", KW_MACRO, KW_LBR);
X Dispose(t);
X
X /* read macro body */
X UnSuppressScope();
X ReadTokenList(res);
X
X /* clean up (kill final RBR, dispose macro name) and exit */
X sym_body(res) = DeleteAndDispose(pred(sym_body(res), PARENT), PARENT);
X recursive(res) = FALSE;
X *token = nil;
X return res;
X} /* end ReadMacro */


X
X
X/*@@**************************************************************************/
X/* */

X/* ReadDefinitions(token, encl, res_type) */
X/* */
X/* Read a sequence of definitions and insert them into the symbol table. */
X/* Either a sequence of local definitions (res_type == LOCAL) or named */
X/* parameters (res_type == NPAR) is expected; *token is the first def etc. */
X/* A scope appropriate for reading the bodies of the definitions is open. */
X/* The parent definition is encl. */
X/* */
X/*****************************************************************************/
X
XReadDefinitions(token, encl, res_type)
XOBJECT *token, encl; unsigned char res_type;
X{ OBJECT t, res, res_target, export_list, import_list, link, y, z;
X t = *token;
X
X
X while( res_type != LOCAL ? is_word(t, KW_NAMED) :
X is_word(t, KW_DEF) || is_word(t, KW_MACRO) || is_word(t, KW_FONTDEF)
X || is_word(t, KW_IMPORT) || is_word(t, KW_EXPORT) )
X {
X if( is_word(t, KW_FONTDEF) )
X { ReadFontDef(&t, encl);


X if( t == nil ) t = LexGetToken();

X continue; /* next definition */
X }
X
X /* get import list and change scope appropriately */
X BodyParNotAllowed();
X import_list = New(ACAT);
X if( is_word(t, KW_IMPORT) )
X { Dispose(t);
X t = LexGetToken();
X while( type(t) == CLOSURE ||
X (type(t)==WORD && !is_word(t,KW_EXPORT) && !is_word(t,KW_DEF)
X && !is_word(t, KW_MACRO)) )
X { if( type(t) == CLOSURE )
X { if( type(actual(t)) == LOCAL )
X { PushScope(actual(t), FALSE, TRUE);
X Link(import_list, t);
X }
X else
X { Error(WARN, &fpos(t), "import name expected here");
X Dispose(t);
X }
X }
X else
X { Error(WARN, &fpos(t), "import %s not in scope", string(t));
X Dispose(t);


X }
X t = LexGetToken();

X }
X }
X
X /* get export list and store for setting visible flags below */
X export_list = New(ACAT);
X if( is_word(t, KW_EXPORT) )
X { Dispose(t);
X SuppressScope();
X t = LexGetToken();
X while( type(t) == WORD && !is_word(t, KW_DEF) )
X { if( string(t)[0] == '"' ) FontStripQuotes(string(t), &fpos(t));
X Link(export_list, t);


X t = LexGetToken();
X }

X UnSuppressScope();
X }
X
X
X if( res_type == LOCAL && !is_word(t, KW_DEF) && !is_word(t, KW_MACRO) )
X { Error(WARN,&fpos(t),"keyword %s or %s expected here", KW_DEF, KW_MACRO);
X break;
X }
X if( res_type == NPAR && !is_word(t, KW_NAMED) )
X { Error(WARN, &fpos(t), "keyword %s expected here", KW_NAMED);
X break;
X }
X
X if( is_word(t, KW_MACRO) )
X { if( Down(export_list) != export_list )
X Error(WARN, &fpos(t), "ignoring %s list of %s", KW_EXPORT, KW_MACRO);
X res = ReadMacro(&t, encl);
X }
X else
X {
X SuppressScope(); Dispose(t); t = LexGetToken();
X
X /* find name of symbol and insert it */
X check(WORD, "can't find symbol name", 0, 0);
X res = InsertSym(string(t), res_type, &fpos(t), DEFAULT_PREC,
X FALSE, FALSE, 0, encl, nil);


X t = LexGetToken();
X

X /* find force, if any */
X if( is_word(t, KW_FORCE) )
X { force_target(res) = TRUE;


X Dispose(t); t = LexGetToken();

X if( !is_word(t, KW_INTO) )
X Error(WARN, &fpos(t), "%s expected after %s", KW_INTO, KW_FORCE);
X }
X
X /* find into clause, if any */
X res_target = nil;
X if( is_word(t, KW_INTO) )
X { UnSuppressScope();


X Dispose(t); t = LexGetToken();

X check(LBR, "%s expected after %s", KW_LBR, KW_INTO);
X res_target = Parse(&t, encl, FALSE, FALSE);
X SuppressScope();


X if( t == nil ) t = LexGetToken();
X }
X

X /* find precedence clause, if any */
X if( is_word(t, KW_PRECEDENCE) )
X { int prec = 0;
X Dispose(t);
X t = LexGetToken();
X while( type(t) == WORD && string(t)[0] >= '0' && string(t)[0] <= '9' )
X {
X /* check(WORD, "can't find value of %s", KW_PRECEDENCE, 0); */
X prec = prec * 10 + string(t)[0] - '0';


X Dispose(t); t = LexGetToken();
X }

X
X if( prec < MIN_PREC )
X { Error(WARN, &fpos(t), "%s is too low - %d substituted",
X KW_PRECEDENCE, MIN_PREC );
X prec = MIN_PREC;
X }
X else if( prec > MAX_PREC )
X { Error(WARN, &fpos(t), "%s is too high - %d substituted",
X KW_PRECEDENCE, MAX_PREC );
X prec = MAX_PREC;
X }
X precedence(res) = prec;
X }
X
X /* find associativity clause, if any */
X if( is_word(t, KW_ASSOC) )


X { Dispose(t); t = LexGetToken();

X if( is_word(t, KW_LEFT) ) right_assoc(res) = FALSE;
X else if( !is_word(t, KW_RIGHT) )
X Error(WARN, &fpos(t), "%s replaced by %s", KW_ASSOC, KW_RIGHT);


X Dispose(t); t = LexGetToken();
X }

X
X /* find left parameter, if any */
X if( is_word(t, KW_LEFT) )


X { Dispose(t); t = LexGetToken();

X check(WORD, "can't find %s parameter name", KW_LEFT, 0);
X InsertSym(string(t), LPAR, &fpos(t), DEFAULT_PREC,
X FALSE, FALSE, 0, res, nil);


X Dispose(t); t = LexGetToken();
X }

X
X /* find named parameters, if any */
X UnSuppressScope();
X ReadDefinitions(&t, res, NPAR);
X
X /* find right or body parameter, if any */
X if( is_word(t, KW_RIGHT) || is_word(t, KW_BODY) )
X { has_body(res) = is_word(t, KW_BODY);
X SuppressScope();


X Dispose(t); t = LexGetToken();

X check(WORD, "can't find %s parameter name", KW_RIGHT, 0);
X InsertSym(string(t), RPAR, &fpos(t), DEFAULT_PREC,
X FALSE, FALSE, 0, res, nil);
X UnSuppressScope();


X Dispose(t); t = LexGetToken();
X }

X
X /* read local definitions and body */
X if( res_target != nil )
X InsertSym(KW_TARGET, LOCAL, &fpos(res_target), DEFAULT_PREC,
X FALSE, FALSE, 0, res, res_target);
X if( type(t) == WORD && strcmp(string(t), KW_LBR) == 0 )
X { z = NewToken(LBR, &fpos(t), 0, 0, LBR_PREC, StartSym);
X Dispose(t);
X t = z;
X }
X else if( type(t) == WORD && strcmp(string(t), KW_BEGIN) == 0 )
X { z = NewToken(BEGIN, &fpos(t), 0, 0, BEGIN_PREC, StartSym);
X Dispose(t);
X t = z;
X }
X else if( type(t) != LBR && type(t) != BEGIN )
X Error(FATAL, &fpos(t), "opening %s or %s of %s expected",
X KW_LBR, KW_BEGIN, SymName(res));
X if( type(t) == BEGIN ) actual(t) = res;
X PushScope(res, FALSE, FALSE);
X BodyParAllowed();
X sym_body(res) = Parse(&t, res, TRUE, FALSE);
X
X /* set visible flag of the exported symbols */
X for( link=Down(export_list); link != export_list; link=NextDown(link) )
X { Child(y, link);
X z = SearchSym(string(y), strlen(string(y)));
X if( z == nil || enclosing(z) != res )
X Error(WARN, &fpos(y), "exported symbol %s not defined in %s",
X string(y), SymName(res));
X else if( has_body(res) && type(z) == RPAR )
X Error(WARN, &fpos(y), "body parameter %s may not be exported",
X string(y));
X else if( visible(z) )
X Error(WARN, &fpos(y), "symbol %s exported twice", string(y));
X else visible(z) = TRUE;
X }
X DisposeObject(export_list);
X
X /* pop scope of res */
X PopScope();
X }
X
X /* pop import scopes and store imports in sym tab */
X for( link=Down(import_list); link != import_list; link=NextDown(link) )
X PopScope();
X if( Down(import_list) == import_list )
X { Dispose(import_list);
X import_list = nil;
X }
X imports(res) = import_list;
X
X BodyParAllowed();


X if( t == nil ) t = LexGetToken();

X
X } /* end while */
X

X *token = t;
X return;
X} /* end ReadDefinitions */
END_OF_FILE
if test 18300 -ne `wc -c <'lout/z05.c'`; then
echo shar: \"'lout/z05.c'\" unpacked with wrong size!
fi
# end of 'lout/z05.c'
fi
if test -f 'lout/z12.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/z12.c'\"
else
echo shar: Extracting \"'lout/z12.c'\" \(18672 characters\)
sed "s/^X//" >'lout/z12.c' <<'END_OF_FILE'
X/*@z12.c:Size Finder:MinSize()@***********************************************/


X/* */
X/* LOUT: A HIGH-LEVEL LANGUAGE FOR DOCUMENT FORMATTING (VERSION 2.03) */
X/* COPYRIGHT (C) 1993 Jeffrey H. Kingston */
X/* */
X/* Jeffrey H. Kingston (je...@cs.su.oz.au) */
X/* Basser Department of Computer Science */
X/* The University of Sydney 2006 */
X/* AUSTRALIA */
X/* */
X/* This program is free software; you can redistribute it and/or modify */
X/* it under the terms of the GNU General Public License as published by */
X/* the Free Software Foundation; either version 1, or (at your option) */
X/* any later version. */
X/* */
X/* This program is distributed in the hope that it will be useful, */
X/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
X/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
X/* GNU General Public License for more details. */
X/* */
X/* You should have received a copy of the GNU General Public License */
X/* along with this program; if not, write to the Free Software */
X/* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
X/* */

X/* FILE: z12.c */
X/* MODULE: Size Finder */
X/* EXTERNS: MinSize() */


X/* */
X/*****************************************************************************/
X#include "externs"

X#define IG_LOOKING 0
X#define IG_NOFILE 1
X#define IG_BADFILE 2
X#define IG_BADSIZE 3
X#define IG_OK 4


X
X
X/*****************************************************************************/
X/* */

X/* OBJECT MinSize(x, dim, extras) */
X/* */
X/* Set fwd(x, dim) and back(x, dim) to their minimum possible values. */
X/* If dim == ROW, construct an extras list and return it in *extras. */
X/* */
X/*****************************************************************************/
X
XOBJECT MinSize(x, dim, extras)
XOBJECT x; int dim; OBJECT *extras;
X{ OBJECT y, z, link, prev, t, g, full_name;
X int b, f, dble_fwd, llx, lly, urx, ury, status;
X float fllx, flly, furx, fury;
X BOOLEAN dble_found, found, will_expand, first_line;
X FILE *fp; float scale_factor; unsigned char buff[MAX_LINE];
X
X debug2(DSF, DD, "[ MinSize( %s, %s, extras )", EchoObject(null,x),dimen(dim));
X ifdebug(DSF, DDD, EchoObject(stderr, x));


X
X switch( type(x) )
X {
X

X case WORD:
X
X if( dim == COL ) FontAtomSize(x);


X break;
X
X
X case CROSS:
X

X /* add index to the cross-ref */
X if( dim == ROW )
X { z = New( (int) cross_type(x));
X actual(z) = x;
X Link(*extras, z);
X debug1(DCR, DDD, " MinSize: %s", EchoObject(null, z));
X }
X back(x, dim) = fwd(x, dim) = 0;


X break;
X
X
X case NULL_CLOS:
X

X back(x, dim) = fwd(x, dim) = 0;


X break;
X
X
X case HEAD:
X

X if( dim == ROW )

X {
X /* replace the galley x by a dummy closure y */
X y = New(NULL_CLOS);


X FposCopy(fpos(y), fpos(x));
X ReplaceNode(y, x);
X

X if( has_key(actual(x)) )
X {
X /* galley is sorted, make insinuated cross-reference */
X z = backward(x) ? New(GALL_PREC) : New(GALL_FOLL);
X Child(t, Down(x));
X actual(z) = CrossMake(whereto(x), t, (int) type(z));
X Link(*extras, z);
X DisposeObject(x);
X debug1(DCR, DDD, " MinSize: %s", EchoObject(null, z));
X }
X else
X {
X /* galley is following, make UNATTACHED */
X z = New(UNATTACHED); Link(z, x);
X Link(*extras, z);
X debug1(DCR, DDD, " MinSize: %s", EchoObject(null, z));
X }
X x = y; /* now sizing y, not x */
X }
X else external(x) = FALSE;
X back(x, dim) = fwd(x, dim) = 0;


X break;
X
X
X case CLOSURE:
X

X assert( !has_target(actual(x)), "MinSize: CLOSURE has target!" );


X if( dim == ROW )

X { if( indefinite(actual(x)) )
X { z = New(RECEPTIVE);
X actual(z) = x;
X Link(*extras, z);
X debug1(DCR, DDD, " MinSize: %s", EchoObject(null, z));
X }
X else if( recursive(actual(x)) )
X { z = New(RECURSIVE);
X actual(z) = x;
X Link(*extras, z);
X debug1(DCR, DDD, " MinSize: %s", EchoObject(null, z));
X }
X else Error(INTERN,&fpos(x), "MinSize: definite non-recursive CLOSURE!");
X }
X else external(x) = FALSE; /* nb must be done just here! */
X back(x, dim) = fwd(x, dim) = 0;


X break;
X
X
X case ONE_COL:
X case ONE_ROW:

X case PADJUST:
X case HADJUST:
X case VADJUST:

X case HCONTRACT:
X case VCONTRACT:
X

X Child(y, Down(x));
X y = MinSize(y, dim, extras);


X back(x, dim) = back(y, dim);

X fwd(x, dim) = fwd(y, dim);
X break;
X
X


X case HEXPAND:
X case VEXPAND:
X

X Child(y, Down(x));
X y = MinSize(y, dim, extras);


X back(x, dim) = back(y, dim);

X fwd(x, dim) = fwd(y, dim);
X
X /* insert index into *extras for expanding later */
X if( dim == ROW )
X { z = New(EXPAND_IND);
X actual(z) = x;
X Link(*extras, z);
X debug1(DCR, DDD, " MinSize: %s", EchoObject(null, z));


X }
X break;
X
X

X case GRAPHIC:
X
X Child(y, LastDown(x));

X y = MinSize(y, dim, extras);


X back(x, dim) = back(y, dim);

X fwd(x, dim) = fwd(y, dim);
X break;
X
X


X case HSCALE:
X case VSCALE:
X

X /* work out size and set to 0 if parallel */
X Child(y, Down(x));
X y = MinSize(y, dim, extras);
X if( (dim == COL) == (type(x) == HSCALE) )
X back(x, dim) = fwd(x, dim) = 0;
X else


X { back(x, dim) = back(y, dim);

X fwd(x, dim) = fwd(y, dim);


X }
X break;
X
X

X case ROTATE:
X
X Child(y, Down(x));


X if( dim == COL )

X { y = MinSize(y, COL, extras);
X whereto(x) = New(ACAT);
X y = MinSize(y, ROW, &whereto(x));
X RotateSize(&back(x, COL), &fwd(x, COL), &back(x, ROW), &fwd(x, ROW),
X y, sparec(constraint(x)));
X }
X else
X { TransferLinks(Down(whereto(x)), whereto(x), *extras);
X Dispose(whereto(x));


X }
X break;
X
X

X case SCALE:
X
X Child(y, Down(x));
X y = MinSize(y, dim, extras);


X if( dim == COL )

X { back(x, dim) = (back(y, dim) * bc(constraint(x))) / SF;
X fwd(x, dim) = (fwd(y, dim) * bc(constraint(x))) / SF;
X }
X else
X { back(x, dim) = (back(y, dim) * fc(constraint(x))) / SF;
X fwd(x, dim) = (fwd(y, dim) * fc(constraint(x))) / SF;


X }
X break;
X
X

X case WIDE:
X
X Child(y, Down(x));
X y = MinSize(y, dim, extras);


X if( dim == COL )

X { y = BreakObject(y, &constraint(x));

X assert( FitsConstraint(back(y, dim), fwd(y, dim), constraint(x)),
X "MinSize: BreakObject failed to fit!" );
X back(x, dim) = back(y, dim);
X fwd(x, dim) = fwd(y, dim);
X EnlargeToConstraint(&back(x, dim), &fwd(x, dim), &constraint(x));
X }
X else


X { back(x, dim) = back(y, dim);

X fwd(x, dim) = fwd(y, dim);


X }
X break;
X
X

X case HIGH:
X
X Child(y, Down(x));
X y = MinSize(y, dim, extras);


X if( dim == ROW )

X { if( !FitsConstraint(back(y, dim), fwd(y, dim), constraint(x)) )
X { Error(WARN, &fpos(x), "forced to enlarge %s", KW_HIGH);
X debug0(DSF, D, "offending object was:");
X ifdebug(DSF, D, EchoObject(stderr, y));
X SetConstraint(constraint(x), MAX_LEN, size(y, dim), MAX_LEN);
X }
X back(x, dim) = back(y, dim);
X fwd(x, dim) = fwd(y, dim);
X EnlargeToConstraint(&back(x, dim), &fwd(x, dim), &constraint(x));
X }
X else


X { back(x, dim) = back(y, dim);

X fwd(x, dim) = fwd(y, dim);


X }
X break;
X
X

X case SPLIT:
X
X link = DownDim(x, dim); Child(y, link);
X y = MinSize(y, dim, extras);


X back(x, dim) = back(y, dim);

X fwd(x, dim) = fwd(y, dim);


X break;
X
X
X case ACAT:

X case HCAT:
X case VCAT:
X
X if( (dim == ROW) == (type(x) == VCAT) )
X {
X /********************************************************************/
X /* */
X /* Calculate sizes parallel to join direction; loop invariant is: */
X /* */
X /* If prev == nil, there are no definite children equal to or */
X /* to the left of Child(link). */
X /* If prev != nil, prev is the rightmost definite child to the */
X /* left of Child(link), and (b, f) is the total size up to */
X /* the mark of prev i.e. not including fwd(prev). */
X /* g is the most recent gap, or nil if none found yet. */
X /* will_expand == TRUE when a gap is found that is likely to */
X /* enlarge when ActualGap is called later on. */
X /* */
X /********************************************************************/
X
X prev = g = nil; will_expand = FALSE; must_expand(x) = FALSE;


X for( link = Down(x); link != x; link = NextDown(link) )
X { Child(y, link);

X if( is_index(type(y)) )


X { if( dim == ROW )

X { link = PrevDown(link);
X MoveLink(NextDown(link), *extras, PARENT);
X }
X continue;
X }
X else if( type(y) == type(x) )
X { link = PrevDown(link);
X TransferLinks(Down(y), y, NextDown(link));
X DisposeChild(Up(y));
X continue;
X }
X else if( type(y) == GAP_OBJ ) g = y;
X else /* calculate size of y and accumulate it */


X { if( type(y) == WORD )

X { if( dim == COL )

X { FontAtomSize(y);
X debug4(DSF, DD, "FontAtomSize( %s ) font %d = %s,%s",
X EchoObject(null, y), word_font(y),
X EchoLength(back(y, COL)), EchoLength(fwd(y, COL)));
X }
X }
X else y = MinSize(y, dim, extras);
X
X if( is_indefinite(type(y)) )
X {
X /* error if preceding gap has mark */
X if( g != nil && mark(gap(g)) )
X { Error(WARN, &fpos(y), "catenation modifier ^ deleted (%s)",
X "it may not precede this object");
X mark(gap(g)) = FALSE;
X }
X
X /* error if next unit is used in preceding gap */
X if( g != nil && units(gap(g)) == NEXT_UNIT )
X { Error(WARN, &fpos(y), "gap replaced by 0i (%s)",
X "unit n may not precede this object");
X units(gap(g)) = FIXED_UNIT;
X width(gap(g)) = 0;
X }
X }
X else
X {
X /* calculate running total length */
X if( prev == nil ) b = back(y, dim), f = 0;
X else
X {
X assert( g!=nil && mode(gap(g))!=NO_MODE, "MinSize: NO_MODE!" );
X f += MinGap(fwd(prev, dim), back(y, dim), fwd(y, dim), &gap(g));
X if( units(gap(g)) == FRAME_UNIT && width(gap(g)) > FR )
X will_expand = TRUE;
X if( mark(gap(g)) ) b += f, f = 0;


X }
X prev = y;
X }

X debug2(DSF,DD," b = %s, f = %s",EchoLength(b),EchoLength(f));
X }


X } /* end for */
X

X if( prev == nil ) b = f = 0;
X else f += fwd(prev, dim);
X back(x, dim) = min(MAX_LEN, b);
X fwd(x, dim) = min(MAX_LEN, f);
X
X if( type(x) == ACAT && will_expand ) fwd(x, COL) = MAX_LEN;
X }
X else
X {
X /********************************************************************/
X /* */
X /* Calculate sizes perpendicular to join direction */
X /* */
X /* Loop invariant: */
X /* */
X /* if found, (b, f) is the size of x, from the last // or from */
X /* the start, up to link exclusive. Else no children yet. */
X /* If dble_found, a previous // exists, and (0, dble_fwd) is */
X /* the size of x from the start up to that //. */
X /* */
X /********************************************************************/
X
X dble_found = found = FALSE; dble_fwd = 0;


X for( link = Down(x); link != x; link = NextDown(link) )
X { Child(y, link);
X if( is_index(type(y)) )

X { if( dim == ROW )
X { link = PrevDown(link);
X MoveLink(NextDown(link), *extras, PARENT);
X }
X continue;
X }
X else if( type(y) == type(x) )
X { link = PrevDown(link);
X TransferLinks(Down(y), y, NextDown(link));
X DisposeChild(Up(y));
X continue;
X }
X else if( type(y) == GAP_OBJ )
X { assert( found, "MinSize/VCAT/perp: !found!" );


X if( !join(gap(y)) )
X {

X /* found // or || operator, so end current group */


X dble_found = TRUE;
X dble_fwd = max(dble_fwd, b + f);

X debug1(DSF, DD, " endgroup, dble_fwd: %s", EchoLength(dble_fwd));
X found = FALSE;
X }
X }
X else /* found object */
X {
X /* calculate size of subobject y */


X if( type(y) == WORD )

X { if( dim == COL ) FontAtomSize(y);
X }
X else y = MinSize(y, dim, extras);
X if( found )
X { b = max(b, back(y, dim));
X f = max(f, fwd(y, dim));
X }
X else


X { b = back(y, dim);
X f = fwd(y, dim);

X found = TRUE;
X }
X debug2(DSF,DD, " b: %s, f: %s", EchoLength(b), EchoLength(f));
X }


X } /* end for */

X assert( found, "MinSize/VCAT/perp: !found (2)!" );
X
X /* finish off last group */
X if( dble_found )
X { back(x, dim) = 0;


X dble_fwd = max(dble_fwd, b + f);

X fwd(x, dim) = min(MAX_LEN, dble_fwd);
X debug1(DSF, DD, " end group, dble_fwd: %s", EchoLength(dble_fwd));
X }
X else


X { back(x, dim) = b;

X fwd(x, dim) = f;
X }
X } /* end else */


X break;
X
X
X case COL_THR:

X case ROW_THR:
X
X assert( (type(x) == COL_THR) == (dim == COL), "Manifest/COL_THR: dim!" );
X if( thr_state(x) == NOTSIZED )
X { assert( Down(x) != x, "Manifest/COL_THR: Down(x)!" );
X Child(y, Down(x));
X y = MinSize(y, dim, extras);


X b = back(y, dim);
X f = fwd(y, dim);

X for( link = NextDown(Down(x)); link != x; link = NextDown(link) )
X { Child(y, link);
X assert( type(y) != GAP_OBJ, "Manifest/COL_THR: GAP_OBJ!" );
X y = MinSize(y, dim, extras);
X b = max(b, back(y, dim));
X f = max(f, fwd(y, dim));


X }
X back(x, dim) = b;

X fwd(x, dim) = f;
X thr_state(x) = SIZED;


X }
X break;
X
X

X case INCGRAPHIC:
X case SINCGRAPHIC:
X

X /* open file, check for initial %!, and hunt for %%BoundingBox line */
X /* according to DSC Version 3.0, the BoundingBox parameters must be */
X /* integers; but we read them as floats and truncate since files */
X /* with fractional values seem to be common in the real world */
X if( dim == ROW ) break;
X status = IG_LOOKING;


X Child(y, Down(x));
X fp = OpenIncGraphicFile(string(y), type(x), &full_name, &fpos(y));

X /* *** fp = OpenFile(fnum = sparec(constraint(x)), FALSE); */
X if( fp == NULL ) status = IG_NOFILE;
X first_line = TRUE;
X while( status == IG_LOOKING && fgets(buff, MAX_LINE, fp) != NULL )
X {
X if( first_line && (buff[0] != '%' || buff[1] != '!') )
X status = IG_BADFILE;
X else
X { first_line = FALSE;
X if( buff[0] == '%' &&
X StringBeginsWith(buff, (unsigned char *) "%%BoundingBox:") &&
X !StringContains(buff, "(atend)") )
X { if( sscanf(buff, "%%%%BoundingBox: %f %f %f %f",
X &fllx, &flly, &furx, &fury) == 4 )
X {
X status = IG_OK;
X llx = fllx;
X lly = flly;
X urx = furx;
X ury = fury;
X }
X else status = IG_BADSIZE;
X }
X }
X }
X
X /* report error or calculate true size, depending on status */
X switch( status )
X {
X case IG_LOOKING:
X
X Error(WARN, &fpos(x), "%s given zero size: format error in file %s%s",
X type(x) == INCGRAPHIC ? KW_INCGRAPHIC : KW_SINCGRAPHIC,
X string(full_name), " (missing %%BoundingBox: line)");
X back(y, COL) = fwd(y, COL) = back(y, ROW) = fwd(y, ROW) = 0;
X back(x, COL) = fwd(x, COL) = back(x, ROW) = fwd(x, ROW) = 0;
X sparec(constraint(x)) = TRUE;
X fclose(fp);
X break;
X
X case IG_NOFILE:
X
X Error(WARN, &fpos(x), "%s deleted: cannot open file %s",
X type(x) == INCGRAPHIC ? KW_INCGRAPHIC : KW_SINCGRAPHIC,
X string(full_name));
X sparec(constraint(x)) = FALSE;
X back(x, COL) = fwd(x, COL) = back(x, ROW) = fwd(x, ROW) = 0;
X break;
X
X case IG_BADFILE:
X
X Error(WARN, &fpos(x), "%s deleted: format error in file %s %s",
X type(x) == INCGRAPHIC ? KW_INCGRAPHIC : KW_SINCGRAPHIC,
X string(full_name), "(bad first line)");
X sparec(constraint(x)) = FALSE;
X back(x, COL) = fwd(x, COL) = back(x, ROW) = fwd(x, ROW) = 0;
X fclose(fp);
X break;
X
X case IG_BADSIZE:
X
X Error(WARN, &fpos(x), "%s given zero size: format error in file %s%s",
X type(x) == INCGRAPHIC ? KW_INCGRAPHIC : KW_SINCGRAPHIC,
X string(full_name), " (bad %%BoundingBox: line)");
X back(y, COL) = fwd(y, COL) = back(y, ROW) = fwd(y, ROW) = 0;
X back(x, COL) = fwd(x, COL) = back(x, ROW) = fwd(x, ROW) = 0;
X sparec(constraint(x)) = TRUE;
X fclose(fp);
X break;
X
X case IG_OK:
X
X Child(y, Down(x));
X back(y, COL) = llx; fwd(y, COL) = urx;
X back(y, ROW) = lly; fwd(y, ROW) = ury;
X b = (urx - llx) * PT;
X b = max(0, min(b, MAX_LEN));
X back(x, COL) = fwd(x, COL) = b / 2;
X b = (ury - lly) * PT;
X b = max(0, min(b, MAX_LEN));
X back(x, ROW) = fwd(x, ROW) = b / 2;
X sparec(constraint(x)) = TRUE;
X fclose(fp);
X break;
X
X }
X DisposeObject(full_name);


X break;
X
X
X default:
X

X Error(INTERN, &fpos(x), "MinSize: type(x): %s", Image(type(x)));


X break;
X
X
X } /* end switch */

X debug1(DSF, DD, "] MinSize returning, x = %s", EchoObject(null, x));
X debug3(DSF, DD, " (%s size is %s, %s)", dimen(dim),
X EchoLength(back(x, dim)), EchoLength(fwd(x, dim)) );
X ifdebug(DSF, DDD, EchoObject(stderr, x));
X
X assert( type(x) == WORD || back(x, dim) >= 0, "MinSize: back(x, dim) < 0!" );
X assert( type(x) == WORD || fwd(x, dim) >= 0, "MinSize: fwd(x, dim) < 0!" );
X
X return x;
X} /* end MinSize */
END_OF_FILE
if test 18672 -ne `wc -c <'lout/z12.c'`; then
echo shar: \"'lout/z12.c'\" unpacked with wrong size!
fi
# end of 'lout/z12.c'
fi
if test -f 'lout/z18.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/z18.c'\"
else
echo shar: Extracting \"'lout/z18.c'\" \(16726 characters\)
sed "s/^X//" >'lout/z18.c' <<'END_OF_FILE'
X/*@z18.c:Galley Transfer:TransferBegin(), TransferComponent()@****************/


X/* */
X/* LOUT: A HIGH-LEVEL LANGUAGE FOR DOCUMENT FORMATTING (VERSION 2.03) */
X/* COPYRIGHT (C) 1993 Jeffrey H. Kingston */
X/* */
X/* Jeffrey H. Kingston (je...@cs.su.oz.au) */
X/* Basser Department of Computer Science */
X/* The University of Sydney 2006 */
X/* AUSTRALIA */
X/* */
X/* This program is free software; you can redistribute it and/or modify */
X/* it under the terms of the GNU General Public License as published by */
X/* the Free Software Foundation; either version 1, or (at your option) */
X/* any later version. */
X/* */
X/* This program is distributed in the hope that it will be useful, */
X/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
X/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
X/* GNU General Public License for more details. */
X/* */
X/* You should have received a copy of the GNU General Public License */
X/* along with this program; if not, write to the Free Software */
X/* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
X/* */

X/* FILE: z18.c */
X/* MODULE: Galley Transfer */
X/* EXTERNS: TransferInit(), TransferBegin(), TransferComponent(), */
X/* TransferEnd(), TransferClose() */


X/* */
X/*****************************************************************************/
X#include "externs"
X

X#define MAX_DEPTH 30 /* max depth of galleys */
Xstatic OBJECT root_galley = nil; /* the root galley */
Xstatic OBJECT targets[MAX_DEPTH]; /* currently open \Inputs */
Xstatic CONSTRAINT constraints[MAX_DEPTH]; /* their COL constraints */
Xstatic int itop; /* stack top */
Xstatic CONSTRAINT initial_constraint; /* initial COL constraint */
Xstatic STYLE InitialStyle; /* initial style */
X
X#if DEBUG_ON
Xstatic debug_targets()
X{ int i; OBJECT tmp;
X for( i = 0; i <= itop; i++ )
X { if( targets[i] == nil || Down(targets[i]) == targets[i] ) tmp = nil;
X else Child(tmp, Down(targets[i]));
X debug3(DGT, D, " target[%d] %s = %s", i,
X EchoConstraint(&constraints[i]), EchoObject(null, tmp));
X }
X} /* end debug_targets */
X#endif


X
X
X/*@@**************************************************************************/
X/* */

X/* TransferInit(InitEnv) */
X/* */
X/* Initialise this module. The initial environment is InitEnv. */
X/* */
X/*****************************************************************************/
X
XTransferInit(InitEnv)
XOBJECT InitEnv;
X{ OBJECT dest, x, y, recs, inners, nothing, dest_index, up_hd;
X debug1(DGT, D, "TransferInit( %s )", EchoObject(null, InitEnv));
X SetConstraint(initial_constraint, MAX_LEN-1, MAX_LEN-1, MAX_LEN-1);
X
X /* save initial environment and style */
X SetGap( line_gap(InitialStyle), FALSE, FALSE, FIXED_UNIT, MARK_MODE, 18*PT);
X SetGap(space_gap(InitialStyle), FALSE, TRUE, FIXED_UNIT, EDGE_MODE, 1*EM);
X font(InitialStyle) = 0;
X hyph_style(InitialStyle) = HYPH_UNDEF;
X fill_style(InitialStyle) = FILL_UNDEF;
X display_style(InitialStyle) = DISPLAY_UNDEF;
X
X /* construct destination for root galley */
X up_hd = New(HEAD);
X dest_index = New(RECEIVING);
X dest = New(CLOSURE); actual(dest) = PrintSym;
X actual(dest_index) = dest;
X external(dest) = TRUE;
X threaded(dest) = FALSE;
X blocked(dest_index) = FALSE;
X Link(up_hd, dest_index);
X
X /* construct root galley */
X root_galley = New(HEAD);
X FposCopy(fpos(root_galley), *no_fpos);
X actual(root_galley) = whereto(root_galley) = ready_galls(root_galley) = nil;
X backward(root_galley) = must_expand(root_galley) = sized(root_galley) = FALSE;
X x = New(CLOSURE); actual(x) = InputSym;
X Link(root_galley, x);
X SizeGalley(root_galley, InitEnv, TRUE, FALSE, FALSE, FALSE, &InitialStyle,
X &initial_constraint, nil, &nothing, &recs, &inners);
X assert( recs == nil , "TransferInit: recs != nil!" );
X assert( inners == nil , "TransferInit: inners != nil!" );
X Link(dest_index, root_galley);
X
X /* initialise target and constraint stacks */
X Child(y, Down(root_galley));
X assert( type(y) == RECEPTIVE && type(actual(y)) == CLOSURE &&
X actual(actual(y)) == InputSym, "TransferInit: initial galley!" );
X assert( external(actual(y)), "TransferInit: input sym not external!" );
X blocked(y) = TRUE;
X targets[itop = 0] = New(ACAT);
X Link(targets[itop], y);
X Constrained(actual(y), &constraints[itop], COL);
X debug2(DSC, D, "Constrained( %s, COL ) = %s",
X EchoObject(null, y), EchoConstraint(&constraints[itop]));
X
X debug0(DGT, D, "TransferInit returning.");
X ifdebug(DGT, DD, debug_targets());
X} /* end TransferInit */


X
X
X/*@@**************************************************************************/
X/* */

X/* OBJECT TransferBegin(x) */
X/* */
X/* Commence the transfer of a new galley whose header is invokation x. */
X/* */
X/*****************************************************************************/
X
XOBJECT TransferBegin(x)
XOBJECT x;
X{ OBJECT xsym, index, y, link, env, new_env, hold_env, res, hd, target;
X CONSTRAINT c;
X debug1(DGT, D, "TransferBegin( %s )", EchoObject(null, x));
X ifdebug(DGT, DD, debug_targets());
X assert( type(x) == CLOSURE, "TransferBegin: non-CLOSURE!" );
X
X /* construct new (inner) env chain */
X if( Down(targets[itop]) == targets[itop] )
X Error(FATAL, &fpos(x), "cannot attach galley %s", SymName(actual(x)));
X Child(target, Down(targets[itop]));
X xsym = actual(x);
X env = GetEnv(actual(target));
X debug1(DGT, DD, " current env chain: %s", EchoObject(null, env));


X if( has_body(xsym) )
X {

X /* prepare a copy of x for inclusion in environment */
X y = CopyObject(x, no_fpos);
X
X /* attach its environment */
X AttachEnv(env, y);
X
X /* now the new environment is y catenated with the old one */
X new_env = SetEnv(y, nil);
X }
X else new_env = env;
X hold_env = New(ACAT); Link(hold_env, new_env);
X debug1(DGT, DD, " new env chain: %s", EchoObject(null, new_env));
X
X /* convert x into an unsized galley called hd */
X index = New(UNATTACHED);
X hd = New(HEAD);
X FposCopy(fpos(hd), fpos(x));
X actual(hd) = xsym;


X backward(hd) = TargetSymbol(x, &whereto(hd));
X ready_galls(hd) = nil;
X must_expand(hd) = TRUE;
X sized(hd) = FALSE;

X Link(index, hd);


X Link(hd, x);
X AttachEnv(env, x);
X

X /* search for destination for hd and release it */
X Link(Up(target), index);
X debug0(DGF, D, " calling FlushGalley from TransferBegin");
X FlushGalley(hd);
X
X /* if failed to flush, undo everything and exit */
X Parent(index, Up(hd));
X if( type(index) == UNATTACHED && !sized(hd) )
X { DeleteNode(index);
X DisposeObject(hold_env);


X if( LastDown(x) != x )

X { Child(env, LastDown(x));
X if( type(env) == ENV ) DisposeChild(LastDown(x));
X }
X debug1(DGT,D, "TransferBegin returning failed, x: %s", EchoObject(null, x));


X return x;
X }
X

X if( has_rpar(actual(hd)) )
X {
X /* set up new target to be inner \InputSym, or nil if none */
X if( ++itop >= MAX_DEPTH ) Error(FATAL, &fpos(x),
X "galley nested too deeply (max is %d)", MAX_DEPTH);
X targets[itop] = New(ACAT); target = nil;
X for( link = Down(hd); link != hd; link = NextDown(link) )
X { Child(y, link);
X if( type(y) == RECEPTIVE && actual(actual(y)) == InputSym )
X {
X Constrained(actual(y), &constraints[itop], COL);
X if( FitsConstraint(0, 0, constraints[itop]) )
X { Link(targets[itop], y); target = y;
X debug2(DSC, D, "Constrained( %s, COL ) = %s",
X EchoObject(null, y), EchoConstraint(&constraints[itop]));
X env = DetachEnv(actual(y));
X AttachEnv(new_env, actual(y));
X }
X else
X { Error(WARN, &fpos(hd), "galley %s deleted (target too narrow)",
X SymName(actual(hd)));


X }
X break;
X }
X }
X

X /* return a token appropriate to the new target */
X if( target == nil || external(actual(target)) )
X res = NewToken(GSTUB_EXT, no_fpos, 0, 0, precedence(xsym), nil);
X else
X { Constrained(actual(target), &c, ROW);
X if( constrained(c) ) Error(FATAL, &fpos(target),
X "right parameter of %s is vertically constrained", SymName(xsym));
X else res = NewToken(GSTUB_INT, no_fpos, 0, 0, precedence(xsym), nil);
X }
X }
X else res = NewToken(GSTUB_NONE, no_fpos, 0, 0, precedence(xsym), nil);
X
X DisposeObject(hold_env);
X debug1(DGT, D, "TransferBegin returning %s", Image(type(res)));
X ifdebug(DGT, DD, debug_targets());
X return res;
X} /* end TransferBegin */


X
X
X/*@@**************************************************************************/
X/* */

X/* TransferComponent(x) */
X/* */
X/* Transfer component x of a galley. */
X/* */
X/*****************************************************************************/
X
XTransferComponent(x)
XOBJECT x;
X{ OBJECT y, env, start_search, recs, inners, nothing, hd, dest, dest_index;
X debug1(DGT, D, "TransferComponent( %s )", EchoObject(null, x));
X ifdebug(DGT, DD, debug_targets());
X
X /* if no dest_index, discard x and exit */
X if( Down(targets[itop]) == targets[itop] )
X { DisposeObject(x);
X debug0(DGT, D, "TransferComponent returning (no target).");
X return;
X }
X Child(dest_index, Down(targets[itop]));
X assert( external(actual(dest_index)), "TransferComponent: internal!" );
X
X /* make the component into a galley */
X hd = New(HEAD);
X FposCopy(fpos(hd), fpos(x));
X actual(hd) = whereto(hd) = ready_galls(hd) = nil;
X backward(hd) = must_expand(hd) = sized(hd) = FALSE;
X Link(hd, x);
X dest = actual(dest_index);
X env = GetEnv(dest);
X debug1(DGT, DD, " current env chain: %s", EchoObject(null, env));
X SizeGalley(hd, env, TRUE, threaded(dest), FALSE, TRUE, &save_style(dest),
X &constraints[itop], nil, &nothing, &recs, &inners);


X if( recs != nil ) ExpandRecursives(recs);
X

X /* promote the components, remembering where old spot was */
X start_search = PrevDown(Up(dest_index));
X debug0(DSA, D, " calling AdjustSize from TransferComponent");


X AdjustSize(dest, back(hd, COL), fwd(hd, COL), COL);

X Promote(hd, hd, dest_index);
X DeleteNode(hd);
X
X /* flush any widowed galleys attached to \Input */
X if( Down(dest_index) != dest_index )
X { OBJECT tinners, index;
X tinners = New(ACAT);
X while( Down(dest_index) != dest_index )
X { Child(y, Down(dest_index));
X assert( type(y) == HEAD, "TransferComponent: input child!" );
X DetachGalley(y);
X Parent(index, Up(y));
X MoveLink(Up(index), NextDown(start_search), PARENT);
X Link(tinners, index);
X }
X FlushInners(tinners, nil);
X }
X
X /* flush any galleys inside hd */


X if( inners != nil ) FlushInners(inners, nil);
X

X /* flush parent galley, if needed */
X if( blocked(dest_index) )
X { blocked(dest_index) = FALSE;
X Parent(y, Up(dest_index));
X debug0(DGF, D, " calling FlushGalley from TransferComponent");
X FlushGalley(y);
X }
X
X debug0(DGT, D, "TransferComponent returning.");
X ifdebug(DGT, DD, debug_targets());
X} /* end TransferComponent */


X
X
X/*@@**************************************************************************/
X/* */

X/* TransferEnd(x) */
X/* */
X/* End the transfer of a galley. */
X/* */
X/*****************************************************************************/
X
XTransferEnd(x)
XOBJECT x;
X{ OBJECT recs, inners, nothing, z, env, dest, hd, dest_index, y, start_search;
X debug1(DGT, D, "TransferEnd( %s )", EchoObject(null, x));
X ifdebug(DGT, DD, debug_targets());
X
X /* if no dest_index, discard x and exit */
X if( Down(targets[itop]) == targets[itop] )
X { DisposeObject(x); DisposeObject(targets[itop--]);
X debug0(DGT, D, "TransferEnd returning: no dest_index");
X return;
X }
X Child(dest_index, Down(targets[itop]));
X
X /* make the component into a galley */
X hd = New(HEAD); FposCopy(fpos(hd), fpos(x));
X actual(hd) = whereto(hd) = ready_galls(hd) = nil;
X backward(hd) = must_expand(hd) = sized(hd) = FALSE;
X Link(hd, x); dest = actual(dest_index); env = GetEnv(dest);
X debug1(DGT, DD, " current env chain: %s", EchoObject(null, env));
X SizeGalley(hd, env, external(dest), threaded(dest), FALSE, TRUE,
X &save_style(dest), &constraints[itop], nil, &nothing, &recs, &inners);


X if( recs != nil ) ExpandRecursives(recs);
X

X /* promote the components, remembering where old spot was */
X start_search = PrevDown(Up(dest_index));
X debug0(DSA, D, "calling AdjustSize from TransferEnd (a)");


X AdjustSize(dest, back(hd, COL), fwd(hd, COL), COL);

X if( !external(dest) )
X { Child(z, LastDown(hd));
X debug0(DSA, D, "calling AdjustSize from TransferEnd (b)");
X AdjustSize(dest, back(z, ROW), fwd(z, ROW), ROW);
X Interpose(dest, VCAT, hd, z);
X }
X Promote(hd, hd, dest_index); DeleteNode(hd);
X
X /* flush any widowed galleys attached to \Input */
X if( Down(dest_index) != dest_index )
X { OBJECT tinners, index;
X tinners = New(ACAT);
X while( Down(dest_index) != dest_index )
X { Child(y, Down(dest_index));
X assert( type(y) == HEAD, "TransferComponent: input child!" );
X DetachGalley(y);
X Parent(index, Up(y));
X MoveLink(Up(index), NextDown(start_search), PARENT);
X Link(tinners, index);
X }
X FlushInners(tinners, nil);
X }
X
X /* flush any galleys inside hd */


X if( inners != nil ) FlushInners(inners, nil);
X

X /* close dest_index, and flush parent galley if needed */
X if( blocked(dest_index) )
X { Parent(y, Up(dest_index));
X DeleteNode(dest_index);
X debug0(DGF, D, " calling FlushGalley from TransferEnd");
X FlushGalley(y);
X }
X else DeleteNode(dest_index);
X
X /* pop target stack and exit */
X DisposeObject(targets[itop--]);
X debug0(DGT, D, "TransferEnd returning.");
X ifdebug(DGT, DD, debug_targets());
X} /* end TransferEnd */


X
X
X/*****************************************************************************/
X/* */

X/* TransferClose() */
X/* */
X/* Close this module. */
X/* */
X/*****************************************************************************/
X
XTransferClose()
X{ OBJECT inners;
X debug0(DGT, D, "TransferClose()");
X debug0(DGA, D, " calling FreeGalley from TransferClose");
X if( LastDown(root_galley) != root_galley )
X { inners = nil;
X FreeGalley(root_galley, root_galley, &inners, nil, nil);


X if( inners != nil ) FlushInners(inners, nil);

X debug0(DGF, D, " calling FlushGalley from TransferClose");
X FlushGalley(root_galley);
X }
X debug0(DGT, D, "TransferClose returning.");
X}
END_OF_FILE
if test 16726 -ne `wc -c <'lout/z18.c'`; then
echo shar: \"'lout/z18.c'\" unpacked with wrong size!
fi
# end of 'lout/z18.c'
fi
echo shar: End of archive 13 \(of 30\).
cp /dev/null ark13isdone

Jeff Kingston

unread,
Jun 1, 1993, 1:20:03 AM6/1/93
to
Submitted-by: je...@joyce.cs.su.oz.au (Jeff Kingston)
Posting-number: Volume 37, Issue 112
Archive-name: lout/part14
Environment: UNIX

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: lout/doc/tr.eq/s5 lout/doc/tr.impl/setup
# lout/font0/NewCenSchBolIta.AFM lout/include/fig lout/z16.c
# Wrapped by kent@sparky on Sun May 30 19:43:57 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 14 (of 30)."'
if test -f 'lout/doc/tr.eq/s5' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.eq/s5'\"
else
echo shar: Extracting \"'lout/doc/tr.eq/s5'\" \(16617 characters\)
sed "s/^X//" >'lout/doc/tr.eq/s5' <<'END_OF_FILE'
X@Section
X @Title { Summary }
X@Begin
X@PP
XThis section is a complete list of the symbols provided by Eq. We
Xdivide them into auxiliary, parameterized, short names (further divided
Xinto relations, binary operators, and punctuation), and full names. The
Xauxiliary symbols are:
X@ID @Tab
X vmargin { 0.5vx }
X @Fmta { @Col A ! @Col B }
X{
X@Rowa
X A { @Code "`" }
X B { Thin space }
X@Rowa
X A { @Code "``" }
X B { Medium space }
X@Rowa
X A { @Code "```" }
X B { Thick space }
X@Rowa
X A { @Code "bin x" }
X B { Treat @Code x as a binary operator }
X@Rowa
X A { @Code "rel x" }
X B { Treat @Code x as a relation }
X@Rowa
X A { @Code "punct x" }
X B { Treat @Code x as a punctuation symbol }
X@Rowa
X A { @Code "non x" }
X B { Remove spaces normally put into @Code x }
X@Rowa
X A { @Code "vctr x" }
X B { Centre @Code x vertically }
X@Rowa
X A { @Code "big x" }
X B { Make @Code x larger }
X}
XHere are all the parameterized symbols, shown in groups of equal
Xprecedence, with the precedence itself at right:
X@ID lines @Break {
X@Code "matrix not" (100)
X@Code "dot dotdot hat tilde vec dyad overbar underbar" (62)
X@Code "sup sub supp" (60) "on" (61)
X@Code "from to widefrom wideto" (58)
X@Code "sqrt root" (56)
X@Code "over" "frac" (54)
X@Code "above labove cabove rabove mabove" (52)
X@Code "nextcol" (50)
X}
XSee page {@PageOf matrix} for examples of matrices. Here are some
Xexamples of the other symbols:
X@IL
X
X@LI {
X@Code "x dot"
X|7ct
X@Eq { x dot }
X}
X
X@LI {
X@Code "x dotdot"
X|7ct
X@Eq { x dotdot }
X}
X
X@LI {
X@Code "x hat"
X|7ct
X@Eq { x hat }
X}
X
X@LI {
X@Code "x tilde"
X|7ct
X@Eq { x tilde }
X}
X
X@LI {
X@Code "x vec"
X|7ct
X@Eq { x vec }
X}
X
X@LI {
X@Code "x dyad"
X|7ct
X@Eq { x dyad }
X}
X
X@LI {
X@Code "x+y overbar"
X|7ct
X@Eq { x+y overbar }
X}
X
X@LI {
X@Code "x+y underbar"
X|7ct
X@Eq { x+y underbar }
X}
X
X@EL
XThese marks are centred over the left parameter, except the last two which are
Xextended to the width of the object.
X@IL


X
X@LI {
X@Code "a sup b"

X|7ct
X@Eq {a sup b}

X}
X
X@LI {
X@Code "a sub b"
X|7ct
X@Eq {a sub b}
X}
X
X@LI {
X@Code "a supp b on c"
X|7ct
X@Eq {a supp b on c}
X}
X
X@EL
XNote that @Code "supp" and @Code "on" must be used together as shown.
X@IL


X
X@LI {
X@Code "big sum from i"

X|7ct
X@Eq {big sum from i}

X}
X
X@LI {
X@Code "big prod to j"
X|7ct
X@Eq {big prod to j}
X}
X
X@LI {
X@Code { "{a, ... , z} widefrom"
X"{90d @Rotate blbrace}" }
X|7ct
X@Eq { {a, ... , z} widefrom {90d @Rotate blbrace} }
X}
X
X@LI {
X@Code "{a, ... , z} wideto minus"
X|7ct
X@Eq { {a, ... , z} wideto minus }
X}
X
X@EL
X@Code "widefrom" and @Code "wideto" are like @Code "from" and
X@Code "to" except that they horizontally scale the right parameter
Xto the width of the left.
X@IL
X
X@LI {
X@Code "sqrt {x over y}"
X|7ct
X@Eq { sqrt {x over y} }
X}
X
X@LI {
X@Code "3 root {x over y}"
X|7ct
X@Eq { 3 root {x over y} }
X}
X
X@EL
XThe left parameter of @Code "root" may be any object.
X@IL
X
X@LI {
X@Code "2 over 3"
X|7ct
X@Eq { 2 over 3 }
X}
X
X@LI {
X@Code "2 frac 3"
X|7ct
X@Eq { 2 frac 3 }
X}
X
X@EL
XThe following short names define relations (that is, they have a thick
Xspace on each side):
X@DP
Xragged @Break {
X"<" @Dbl @Eq { < }
X">" @Dbl @Eq { > }
X"=" @Dbl @Eq { = }
X"<=" @Dbl @Eq { <= }
X"prec" @Dbl @Eq { prec }
X"preceq" @Dbl @Eq { preceq }
X"<<" @Dbl @Eq { << }
X"subset" @Dbl @Eq { subset }
X"subseteq" @Dbl @Eq { subseteq }
X"sqsubseteq" @Dbl @Eq { sqsubseteq }
X"in" @Dbl @Eq { in }
X"vdash" @Dbl @Eq { vdash }
X"smile" @Dbl @Eq { smile }
X"frown" @Dbl @Eq { frown }
X">=" @Dbl @Eq { >= }
X"succ" @Dbl @Eq { succ }
X"succeq" @Dbl @Eq { succeq }
X">>" @Dbl @Eq { >> }
X"supset" @Dbl @Eq { supset }
X"supseteq" @Dbl @Eq { supseteq }
X"sqsupseteq" @Dbl @Eq { sqsupseteq }
X"ni" @Dbl @Eq { ni }
X"dashv" @Dbl @Eq { dashv }
X"mid" @Dbl @Eq { mid }
X"parallel" @Dbl @Eq { parallel }
X"==" @Dbl @Eq { == }
X"~" @Dbl @Eq { ~ }
X"-~" @Dbl @Eq { -~ }
X"asymp" @Dbl @Eq { asymp }
X"~~" @Dbl @Eq { ~~ }
X"=~" @Dbl @Eq { =~ }
X"bowtie" @Dbl @Eq { bowtie }
X"propto" @Dbl @Eq { propto }
X"models" @Dbl @Eq { models }
X"doteq" @Dbl @Eq { doteq }
X"perp" @Dbl @Eq { perp }
X"notsub" @Dbl @Eq { notsub }
X"notin" @Dbl @Eq { notin }
X"!=" @Dbl @Eq { != }
X"<->" @Dbl @Eq { <-> }
X"<--" @Dbl @Eq { <-- }
X"-->" @Dbl @Eq { --> }
X"up" @Dbl @Eq { up }
X"down" @Dbl @Eq { down }
X"<=>" @Dbl @Eq { <=> }
X"<==" @Dbl @Eq { <== }
X"==>" @Dbl @Eq { ==> }
X"dblup" @Dbl @Eq { dblup }
X"dbldown" @Dbl @Eq { dbldown }
X":" @Dbl @Eq { : }
X"::" @Dbl @Eq { :: }
X":=" @Dbl @Eq { := }
X}
X@DP
XThese can be negated by preceding them with {@Code "not"}, as in
X{@Code "not =="}, for example, which yields {@Eq { not == }}. The
Xfollowing short names define binary operators (medium space on each side):
X@DP
Xragged @Break {
X"+" @Dbl @Eq { + }
X"-" @Dbl @Eq { - }
X"+-" @Dbl @Eq { +- }
X"-+" @Dbl @Eq { -+ }
X"setminus" @Dbl @Eq { setminus }
X"cdot" @Dbl @Eq { cdot }
X"times" @Dbl @Eq { times }
X"*" @Dbl @Eq { * }
X"circ" @Dbl @Eq { circ }
X"div" @Dbl @Eq { div }
X"cap" @Dbl @Eq { cap }
X"cup" @Dbl @Eq { cup }
X"uplus" @Dbl @Eq { uplus }
X"sqcap" @Dbl @Eq { sqcap }
X"sqcup" @Dbl @Eq { sqcup }
X"triangleleft" @Dbl @Eq { triangleleft }
X"triangleright" @Dbl @Eq { triangleright }
X"wr" @Dbl @Eq { wr }
X"bigcirc" @Dbl @Eq { bigcirc }
X"bigtriangleup" @Dbl @Eq { bigtriangleup }
X"bigtriangledown"@Dbl @Eq { bigtriangledown }
X"vee" @Dbl @Eq { vee }
X"wedge" @Dbl @Eq { wedge }
X"oplus" @Dbl @Eq { oplus }
X"ominus" @Dbl @Eq { ominus }
X"otimes" @Dbl @Eq { otimes }
X"oslash" @Dbl @Eq { oslash }
X"odot" @Dbl @Eq { odot }
X"dagger" @Dbl @Eq { dagger }
X"daggerdbl" @Dbl @Eq { daggerdbl }
X"amalg" @Dbl @Eq { amalg }
X}
X@DP
XThe following names define punctuation symbols (thin space on the
Xright-hand side):
X@DP
Xragged @Break {
X";" @Dbl @Eq { ; }
X"," @Dbl @Eq { , }
X"col" @Dbl @Eq { col }
X}
X@DP
XThe following symbols are used in ways typified by the large sum and
Xproduct symbols. In display equations they should be preceded by the
X@Code "big" symbol:
X@DP
Xragged @Break {
X"sum" @Dbl @Eq { sum }
X"prod" @Dbl @Eq { prod }
X"coprod" @Dbl @Eq { coprod }
X@LP
X"int" @Dbl @Eq { int }
X"oint" @Dbl @Eq { oint }
X"bcap" @Dbl @Eq { bcap }
X@LP
X"bcup" @Dbl @Eq { bcup }
X"bvee" @Dbl @Eq { bvee }
X"bwedge" @Dbl @Eq { bwedge }
X@LP
X"bodot" @Dbl @Eq { bodot }
X"botimes" @Dbl @Eq { botimes }
X"boplus" @Dbl @Eq { boplus }
X@LP
X"buplus" @Dbl @Eq { buplus }
X}
X@DP
XThe following symbols are defined so that they will appear in Roman,
Xas is con&-vent&-ional for them in equations:
X@DP
Xragged @Break {
X"arccos" @Dbl @Eq { arccos }
X"arcsin" @Dbl @Eq { arcsin }
X"arctan" @Dbl @Eq { arctan }
X"arg" @Dbl @Eq { arg }
X"cos" @Dbl @Eq { cos }
X"cosh" @Dbl @Eq { cosh }
X"cot" @Dbl @Eq { cot }
X"coth" @Dbl @Eq { coth }
X"csc" @Dbl @Eq { csc }
X"deg" @Dbl @Eq { deg }
X"det" @Dbl @Eq { det }
X"dim" @Dbl @Eq { dim }
X"exp" @Dbl @Eq { exp }
X"gcd" @Dbl @Eq { gcd }
X"hom" @Dbl @Eq { hom }
X"inf" @Dbl @Eq { inf }
X"ker" @Dbl @Eq { ker }
X"lg" @Dbl @Eq { lg }
X"lim" @Dbl @Eq { lim }
X"liminf" @Dbl @Eq { liminf }
X"limsup" @Dbl @Eq { limsup }
X"ln" @Dbl @Eq { ln }
X"log" @Dbl @Eq { log }
X"max" @Dbl @Eq { max }
X"min" @Dbl @Eq { min }
X"Pr" @Dbl @Eq { Pr }
X"sec" @Dbl @Eq { sec }
X"sin" @Dbl @Eq { sin }
X"sinh" @Dbl @Eq { sinh }
X"supr" @Dbl @Eq { supr }
X"tan" @Dbl @Eq { tan }
X"tanh" @Dbl @Eq { tanh }
X"mod" @Dbl @Eq { mod }
X}
X@DP
XThe following symbols are also defined to ensure that they will appear
Xin Roman:
X@DP
Xragged @Break {
X"0" @Dbl @Eq { 0 }
X"1" @Dbl @Eq { 1 }
X"2" @Dbl @Eq { 2 }
X"3" @Dbl @Eq { 3 }
X"4" @Dbl @Eq { 4 }
X"5" @Dbl @Eq { 5 }
X"6" @Dbl @Eq { 6 }
X"7" @Dbl @Eq { 7 }
X"8" @Dbl @Eq { 8 }
X"9" @Dbl @Eq { 9 }
X"!" @Dbl @Eq { ! }
X"?" @Dbl @Eq { ? }
X"%" @Dbl @Eq { % }
X"(" @Dbl @Eq { ( }
X")" @Dbl @Eq { ) }
X"[" @Dbl @Eq { [ }
X"]" @Dbl @Eq { ] }
X}
X@DP
XThe following symbols make good @Code atleft and
X@Code atright parameters of the @Code matrix symbol:
X@LP
X@LP
Xragged @Break {
X"lpar" @Dbl @Eq { lpar }
X"blpar" @Dbl @Eq { blpar }
X"rpar" @Dbl @Eq { rpar }
X"brpar" @Dbl @Eq { brpar }
X"lbrack" @Dbl @Eq { lbrack }
X"blbrack" @Dbl @Eq { blbrack }
X"rbrack" @Dbl @Eq { rbrack }
X"brbrack" @Dbl @Eq { brbrack }
X"lbrace" @Dbl @Eq { lbrace }
X"blbrace" @Dbl @Eq { blbrace }
X"rbrace" @Dbl @Eq { rbrace }
X"brbrace" @Dbl @Eq { brbrace }
X"lfloor" @Dbl @Eq { lfloor }
X"blfloor" @Dbl @Eq { blfloor }
X"rfloor" @Dbl @Eq { rfloor }
X"brfloor" @Dbl @Eq { brfloor }
X"lceil" @Dbl @Eq { lceil }
X"blceil" @Dbl @Eq { blceil }
X"rceil" @Dbl @Eq { rceil }
X"brceil" @Dbl @Eq { brceil }
X"langle" @Dbl @Eq { langle }
X"blangle" @Dbl @Eq { blangle }
X"rangle" @Dbl @Eq { rangle }
X"brangle" @Dbl @Eq { brangle }
X}
X@LP
X@LP
XHere are some miscellaneous symbols:
X@DP
Xragged @Break {
X"hbar" @Dbl @Eq { hbar }
X"Re" @Dbl @Eq { Re }
X"Im" @Dbl @Eq { Im }
X"partial" @Dbl @Eq { partial }
X"infty" @Dbl @Eq { infty }
X"prime" @Dbl @Eq { prime }
X"nabla" @Dbl @Eq { nabla }
X"surd" @Dbl @Eq { surd }
X"top" @Dbl @Eq { top }
X"bot" @Dbl @Eq { bot }
X"dbar" @Dbl @Eq { dbar }
X"triangle" @Dbl @Eq { triangle }
X"backslash" @Dbl @Eq { backslash }
X"forall" @Dbl @Eq { forall }
X"exists" @Dbl @Eq { exists }
X"neg" @Dbl @Eq { neg }
X"circle" @Dbl @Eq { circle }
X"square" @Dbl @Eq { square }
X"ldots" @Dbl @Eq { ldots }
X"cdots" @Dbl @Eq { cdots }
X"vdots" @Dbl @Eq { vdots }
X"ddots" @Dbl @Eq { ddots }
X"del" @Dbl @Eq { del }
X"grad" @Dbl @Eq { grad }
X"..." @Dbl @Eq { ... }
X",...," @Dbl @Eq { ,..., }
X"half" @Dbl @Eq { half }
X"third" @Dbl @Eq { third }
X"'" @Dbl @Eq { ' }
X"empty" @Dbl @Eq { empty }
X}
X@DP
XFinally, here is the long list of full names from the Adobe Symbol font:
X@DP
Xragged @Break {
X"space" @Dbl @Eq { space }
X"exclam" @Dbl @Eq { exclam }
X"universal" @Dbl @Eq { universal }
X"numbersign" @Dbl @Eq { numbersign }
X"existential" @Dbl @Eq { existential }
X"percent" @Dbl @Eq { percent }
X"ampersand" @Dbl @Eq { ampersand }
X"suchthat" @Dbl @Eq { suchthat }
X"parenleft" @Dbl @Eq { parenleft }
X"parenright" @Dbl @Eq { parenright }
X"asteriskmath" @Dbl @Eq { asteriskmath }
X"plus" @Dbl @Eq { plus }
X"comma" @Dbl @Eq { comma }
X"minus" @Dbl @Eq { minus }
X"period" @Dbl @Eq { period }
X"slash" @Dbl @Eq { slash }
X"zero" @Dbl @Eq { zero }
X"one" @Dbl @Eq { one }
X"two" @Dbl @Eq { two }
X"three" @Dbl @Eq { three }
X"four" @Dbl @Eq { four }
X"five" @Dbl @Eq { five }
X"six" @Dbl @Eq { six }
X"seven" @Dbl @Eq { seven }
X"eight" @Dbl @Eq { eight }
X"nine" @Dbl @Eq { nine }
X"colon" @Dbl @Eq { colon }
X"semicolon" @Dbl @Eq { semicolon }
X"less" @Dbl @Eq { less }
X"equal" @Dbl @Eq { equal }
X"greater" @Dbl @Eq { greater }
X"question" @Dbl @Eq { question }
X"congruent" @Dbl @Eq { congruent }
X"Alpha" @Dbl @Eq { Alpha }
X"Beta" @Dbl @Eq { Beta }
X"Chi" @Dbl @Eq { Chi }
X"Delta" @Dbl @Eq { Delta }
X"Epsilon" @Dbl @Eq { Epsilon }
X"Phi" @Dbl @Eq { Phi }
X"Gamma" @Dbl @Eq { Gamma }
X"Eta" @Dbl @Eq { Eta }
X"Iota" @Dbl @Eq { Iota }
X"thetaone" @Dbl @Eq { thetaone }
X"Kappa" @Dbl @Eq { Kappa }
X"Lambda" @Dbl @Eq { Lambda }
X"Mu" @Dbl @Eq { Mu }
X"Nu" @Dbl @Eq { Nu }
X"Omicron" @Dbl @Eq { Omicron }
X"Pi" @Dbl @Eq { Pi }
X"Theta" @Dbl @Eq { Theta }
X"Rho" @Dbl @Eq { Rho }
X"Sigma" @Dbl @Eq { Sigma }
X"Tau" @Dbl @Eq { Tau }
X"Upsilon" @Dbl @Eq { Upsilon }
X"sigmaone" @Dbl @Eq { sigmaone }
X"Omega" @Dbl @Eq { Omega }
X"Xi" @Dbl @Eq { Xi }
X"Psi" @Dbl @Eq { Psi }
X"Zeta" @Dbl @Eq { Zeta }
X"bracketleft" @Dbl @Eq { bracketleft }
X"therefore" @Dbl @Eq { therefore }
X"bracketright" @Dbl @Eq { bracketright }
X"perpendicular" @Dbl @Eq { perpendicular }
X"underscore" @Dbl @Eq { underscore }
X"radicalex" @Dbl @Eq { radicalex }
X"alpha" @Dbl @Eq { alpha }
X"beta" @Dbl @Eq { beta }
X"chi" @Dbl @Eq { chi }
X"delta" @Dbl @Eq { delta }
X"epsilon" @Dbl @Eq { epsilon }
X"phi" @Dbl @Eq { phi }
X"gamma" @Dbl @Eq { gamma }
X"eta" @Dbl @Eq { eta }
X"iota" @Dbl @Eq { iota }
X"phione" @Dbl @Eq { phione }
X"kappa" @Dbl @Eq { kappa }
X"lambda" @Dbl @Eq { lambda }
X"mu" @Dbl @Eq { mu }
X"nu" @Dbl @Eq { nu }
X"omicron" @Dbl @Eq { omicron }
X"pi" @Dbl @Eq { pi }
X"theta" @Dbl @Eq { theta }
X"rho" @Dbl @Eq { rho }
X"sigma" @Dbl @Eq { sigma }
X"tau" @Dbl @Eq { tau }
X"upsilon" @Dbl @Eq { upsilon }
X"omegaone" @Dbl @Eq { omegaone }
X"omega" @Dbl @Eq { omega }
X"xi" @Dbl @Eq { xi }
X"psi" @Dbl @Eq { psi }
X"zeta" @Dbl @Eq { zeta }
X"braceleft" @Dbl @Eq { braceleft }
X"bar" @Dbl @Eq { bar }
X"braceright" @Dbl @Eq { braceright }
X"similar" @Dbl @Eq { similar }
X"Upsilonone" @Dbl @Eq { Upsilonone }
X"minute" @Dbl @Eq { minute }
X"lessequal" @Dbl @Eq { lessequal }
X"fraction" @Dbl @Eq { fraction }
X"infinity" @Dbl @Eq { infinity }
X"florin" @Dbl @Eq { florin }
X"club" @Dbl @Eq { club }
X"diamond" @Dbl @Eq { diamond }
X"heart" @Dbl @Eq { heart }
X"spade" @Dbl @Eq { spade }
X"arrowboth" @Dbl @Eq { arrowboth }
X"arrowleft" @Dbl @Eq { arrowleft }
X"arrowup" @Dbl @Eq { arrowup }
X"arrowright" @Dbl @Eq { arrowright }
X"arrowdown" @Dbl @Eq { arrowdown }
X"degree" @Dbl @Eq { degree }
X"plusminus" @Dbl @Eq { plusminus }
X"second" @Dbl @Eq { second }
X"greaterequal" @Dbl @Eq { greaterequal }
X"multiply" @Dbl @Eq { multiply }
X"proportional" @Dbl @Eq { proportional }
X"partialdiff" @Dbl @Eq { partialdiff }
X"bullet" @Dbl @Eq { bullet }
X"divide" @Dbl @Eq { divide }
X"notequal" @Dbl @Eq { notequal }
X"equivalence" @Dbl @Eq { equivalence }
X"approxequal" @Dbl @Eq { approxequal }
X"ellipsis" @Dbl @Eq { ellipsis }
X"arrowvertex" @Dbl @Eq { arrowvertex }
X"arrowhorizex" @Dbl @Eq { arrowhorizex }
X"carriagereturn"@Dbl @Eq { carriagereturn }
X"aleph" @Dbl @Eq { aleph }
X"Ifraktur" @Dbl @Eq { Ifraktur }
X"Rfraktur" @Dbl @Eq { Rfraktur }
X"weierstrass" @Dbl @Eq { weierstrass }
X"circlemultiply"@Dbl @Eq { circlemultiply }
X"circleplus" @Dbl @Eq { circleplus }
X"emptyset" @Dbl @Eq { emptyset }
X"intersection" @Dbl @Eq { intersection }
X"union" @Dbl @Eq { union }
X"propersuperset"@Dbl @Eq { propersuperset }
X"reflexsuperset"@Dbl @Eq { reflexsuperset }
X"notsubset" @Dbl @Eq { notsubset }
X"propersubset" @Dbl @Eq { propersubset }
X"reflexsubset" @Dbl @Eq { reflexsubset }
X"element" @Dbl @Eq { element }
X"notelement" @Dbl @Eq { notelement }
X"angle" @Dbl @Eq { angle }
X"gradient" @Dbl @Eq { gradient }
X"registerserif" @Dbl @Eq { registerserif }
X"copyrightserif"@Dbl @Eq { copyrightserif }
X"trademarkserif"@Dbl @Eq { trademarkserif }
X"product" @Dbl @Eq { product }
X"radical" @Dbl @Eq { radical }
X"dotmath" @Dbl @Eq { dotmath }
X"logicalnot" @Dbl @Eq { logicalnot }
X"logicaland" @Dbl @Eq { logicaland }
X"logicalor" @Dbl @Eq { logicalor }
X"arrowdblboth" @Dbl @Eq { arrowdblboth }
X"arrowdblleft" @Dbl @Eq { arrowdblleft }
X"arrowdblup" @Dbl @Eq { arrowdblup }
X"arrowdblright" @Dbl @Eq { arrowdblright }
X"arrowdbldown" @Dbl @Eq { arrowdbldown }
X"lozenge" @Dbl @Eq { lozenge }
X"angleleft" @Dbl @Eq { angleleft }
X"registersans" @Dbl @Eq { registersans }
X"copyrightsans" @Dbl @Eq { copyrightsans }
X"trademarksans" @Dbl @Eq { trademarksans }
X"summation" @Dbl @Eq { summation }
X"parenlefttp" @Dbl @Eq { parenlefttp }
X"parenleftex" @Dbl @Eq { parenleftex }
X"parenleftbt" @Dbl @Eq { parenleftbt }
X"bracketlefttp" @Dbl @Eq { bracketlefttp }
X"bracketleftex" @Dbl @Eq { bracketleftex }
X"bracketleftbt" @Dbl @Eq { bracketleftbt }
X"bracelefttp" @Dbl @Eq { bracelefttp }
X"braceleftmid" @Dbl @Eq { braceleftmid }
X"braceleftbt" @Dbl @Eq { braceleftbt }
X"braceex" @Dbl @Eq { braceex }
X"angleright" @Dbl @Eq { angleright }
X"integral" @Dbl @Eq { integral }
X"integraltp" @Dbl @Eq { integraltp }
X"integralex" @Dbl @Eq { integralex }
X"integralbt" @Dbl @Eq { integralbt }
X"parenrighttp" @Dbl @Eq { parenrighttp }
X"parenrightex" @Dbl @Eq { parenrightex }
X"parenrightbt" @Dbl @Eq { parenrightbt }
X"bracketrighttp"@Dbl @Eq { bracketrighttp }
X"bracketrightex"@Dbl @Eq { bracketrightex }
X"bracketrightbt"@Dbl @Eq { bracketrightbt }
X"bracerighttp" @Dbl @Eq { bracerighttp }
X"bracerightmid" @Dbl @Eq { bracerightmid }
X"bracerightbt" @Dbl @Eq { bracerightbt }
X}
X@DP
XThe names given are the same as Adobe's except in a few places where
Xthe Adobe name contains a digit, which is not possible in Lout.
X@End @Section
END_OF_FILE
if test 16617 -ne `wc -c <'lout/doc/tr.eq/s5'`; then
echo shar: \"'lout/doc/tr.eq/s5'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.eq/s5'
fi
if test -f 'lout/doc/tr.impl/setup' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.impl/setup'\"
else
echo shar: Extracting \"'lout/doc/tr.impl/setup'\" \(13292 characters\)
sed "s/^X//" >'lout/doc/tr.impl/setup' <<'END_OF_FILE'
X
X######################################################
X# #
X# Lout setup file for design and imp. paper #
X# #
X# Jeffrey H. Kingston #
X# 13 January 1992 #
X# #
X######################################################
X
X@SysInclude { ft }
X@SysInclude { dl }
X@SysInclude { tab }
X@SysInclude { eq }
X@SysInclude { pas }
X@SysInclude { fig }
X
Xdef @TeX { T{ /0.2fo E}X }
X
Xdef @Code
X right x
X{ { Helvetica Base -1p } @Font lines @Break x
X}
X
X######################################################
X# #
X# Nodes and trees. #
X# #
X######################################################
X
Ximport @Fig
Xdef @FBox
X named width { 0.6c }
X named height { 0.4c }
X named margin { 0.1c }
X right x
X{
X @Box margin { margin }
X { width @Wide height @High
X { /0.5rt |0.5rt @OneCol @OneRow 0.8f @Font x
X }
X }
X}
X
Ximport @Fig
Xdef @FEllipse
X named width { 0.6c }
X named height { 0.4c }
X named margin { 0.1c }
X right x
X{
X @Ellipse margin { margin }
X { height @High
X { /0.5rt |0.5rt @OneCol @OneRow 0.8f @Font x
X }
X }
X}
X
Ximport @Fig
Xdef @FCircle
X named width { 0.4c }
X named height { 0.4c }
X named margin { 0.1c }
X right x
X{
X @Circle margin { margin }
X { width @Wide height @High
X { /0.5rt |0.5rt @OneCol @OneRow 0.8f @Font x
X }
X }
X}
X
Ximport @Fig
Xdef @JoinFigures
X left A
X named linestyle { solid }


X named linewidth { 0.5 pt }

X named linecap { round }
X named dashlength { 0.15 cm }
X named arrow { noarrow }
X named headstyle { open }
X named headwidth { 0.05 cm }
X named headlength { 0.15 cm }
X right B
X{
X @Line
X from { {A"@CTR"} ++ {{A"@CTR"} @Angle {B"@CTR"} A"@CIRCUM"} }
X to { {B"@CTR"} ++ {{B"@CTR"} @Angle {A"@CTR"} B"@CIRCUM"} }
X linestyle { linestyle }
X linewidth { linewidth }
X linecap { linecap }
X dashlength { dashlength }
X arrow { arrow }
X headstyle { headstyle }
X headwidth { headwidth }
X headlength { headlength }
X {}
X}
X
Ximport @Fig
Xexport @LeftSub @RightSub @FirstSub @NextSub @StubSub @Node
Xdef @Tree
X named hmargin { 0.2c }
X named vmargin { 0.3c }
X named linestyle { solid }


X named linewidth { 0.5 pt }

X named linecap { round }
X named dashlength { 0.15 cm }
X named arrow { noarrow }
X named headstyle { open }
X named headwidth { 0.05 cm }
X named headlength { 0.15 cm }
X body x
X@Begin
X
X def @LeftSub
X precedence 90
X associativity left
X left root
X named hmargin { hmargin }
X named linestyle { linestyle }
X named linewidth { linewidth }
X named linecap { linecap }
X named dashlength { dashlength }
X named arrow { arrow }
X named headstyle { headstyle }
X named headwidth { headwidth }
X named headlength { headlength }
X right x
X {
X { /vmargin {L::x} } |hmargin root |
X L@T @JoinFigures
X linestyle { linestyle }
X linewidth { linewidth }
X linecap { linecap }
X dashlength { dashlength }
X arrow { arrow }
X headstyle { headstyle }
X headwidth { headwidth }
X headlength { headlength }
X T
X }
X
X def fixroot
X precedence 90
X left root
X {
X |0.5rt root
X }
X
X def firstsub
X precedence 90
X associativity left
X named hmargin { hmargin }
X named linestyle { linestyle }
X named linewidth { linewidth }
X named linecap { linecap }
X named dashlength { dashlength }
X named arrow { arrow }
X named headstyle { headstyle }
X named headwidth { headwidth }
X named headlength { headlength }
X right x
X {
X S::x &
X S@T @JoinFigures
X linestyle { linestyle }
X linewidth { linewidth }
X linecap { linecap }
X dashlength { dashlength }
X arrow { arrow }
X headstyle { headstyle }
X headwidth { headwidth }
X headlength { headlength }
X T
X }
X
X macro @FirstSub { fixroot //vmargin |0.5rt firstsub }
X
X def @NextSub
X precedence 90
X associativity left
X left others
X named hmargin { hmargin }
X named linestyle { linestyle }
X named linewidth { linewidth }
X named linecap { linecap }
X named dashlength { dashlength }
X named arrow { arrow }
X named headstyle { headstyle }
X named headwidth { headwidth }
X named headlength { headlength }
X right x
X {
X others &hmargin S::x &
X S@T @JoinFigures
X linestyle { linestyle }
X linewidth { linewidth }
X linecap { linecap }
X dashlength { dashlength }
X arrow { arrow }
X headstyle { headstyle }
X headwidth { headwidth }
X headlength { headlength }
X T
X }
X
X def @RightSub
X precedence 90
X associativity left
X left root
X named hmargin { hmargin }
X named linestyle { linestyle }
X named linewidth { linewidth }
X named linecap { linecap }
X named dashlength { dashlength }
X named arrow { arrow }
X named headstyle { headstyle }
X named headwidth { headwidth }
X named headlength { headlength }
X right x
X {
X root |hmargin { /vmargin {R::x} } |
X R@T @JoinFigures
X linestyle { linestyle }
X linewidth { linewidth }
X linecap { linecap }
X dashlength { dashlength }
X arrow { arrow }
X headstyle { headstyle }
X headwidth { headwidth }
X headlength { headlength }
X T
X }
X
X def @StubSub
X precedence 90
X associativity left
X left root
X named linestyle { linestyle }
X named linewidth { linewidth }
X named linecap { linecap }
X named dashlength { dashlength }
X {
X root |
X @Figure
X shape { T@SW
X T@W -- { 0.1 cm 0.7 cm }
X T@E -- {-0.1 cm 0.7 cm }
X T@SE
X }
X linestyle { linestyle }
X linewidth { linewidth }
X linecap { linecap }
X dashlength { dashlength }
X { @Null }
X }
X
X def @Node
X # named mark {}
X right root
X {
X T:: root
X # & T@W ++ { -0.2 cm 0.1 cm } @BaseOf mark
X }
X
X @OneCol @OneRow x
X
X@End @Tree
X
X
Xdef @ShowMarks
X named linewidth { 0.015 cm }
X named linestyle { dashed }
X named dashlength { 0.15 cm }
X named paint { light }
X named marks { both } # none, horizontal, vertical, or both
X right x
X{
X @Fig
X { @Box margin { 0c } linewidth { linewidth } paint { paint }
X { @Figure
X shape {
X marks @Case {
X { horizontal both } @Yield
X { -0.3 cm ymark {xsize ymark} ++ {0.3 cm 0} }
X else @Yield {}
X }
X marks @Case {
X both @Yield []
X else @Yield {}
X }
X marks @Case {
X { vertical both } @Yield
X { xmark -0.3 cm {xmark ysize} ++ {0 0.3 cm} }


X else @Yield {}
X }
X }

X linewidth { linewidth }
X linestyle { linestyle }
X dashlength { dashlength }


X x
X }
X }
X}
X

X import @Fig
X def @DagBox
X named top {}
X named mid {}
X named base {}
X {
X @OneRow {
X TOP:: @FBox top
X // MID:: @FBox mid
X // BASE:: @FBox base
X }
X }
X
X import @Fig
X def @BlackDot
X named diameter { 0.07c }
X {
X @Circle
X margin { 0c }
X paint { black }
X { diameter @Wide diameter @High {}
X }
X }
X
X import @Fig
X def @TVShape # television shape enclosing points ne, nw, se, sw
X named nw {}
X named ne {}
X named sw {}
X named se {}
X named delta { 0.5 cm }
X {
X @Figure
X shape {
X { {nw @Min sw @Min ne @Min se} -- { delta 0 } } @Label BL
X { {nw @Max sw @Max ne @Max se} ++ { delta 0 } } @Label TR
X BL ++ { 0 BL @YDistance TR } @Label TL
X BL ++ { BL @XDistance TR 0 } @Label BR
X BL
X BR [ BR ++ {0 delta} ]
X BR ++ {delta delta}
X TR ++ {delta -delta} [ TR -- {0 delta} ]
X TR
X TL [ TL -- {0 delta} ]
X TL -- {delta delta}
X BL ++ {-delta delta} [ BL ++ {0 delta} ]
X BL
X }
X {}
X }
X
X import @Fig
X def @FunnyArrow
X named from {}
X named to {}
X named arrow { forward }
X {
X @Figure
X shape {from from ++ {0 from @YDistance to} to}
X arrow { arrow }
X {}
X }
X
X def "->" { {Symbol Base} @Font "\256" } #174 decimal
X def "=>" { {Symbol Base} @Font "\336" } #222 decimal
X macro @JP { /0.5v }
X
X ###################################################
X # #
X # Lout keywords. #
X # #
X ###################################################
X
X def @@Begin { @Code "@Begin" }
X def @@Break { @Code "@Break" }
X def @@Case { @Code "@Case" }
X def @@Database { @Code "@Database" }
X def @@End { @Code "@End" }
X def @@Font { @Code "@Font" }
X def @@Galley { @Code "@Galley" }
X def @@Graphic { @Code "@Graphic" }
X def @@HExpand { @Code "@HExpand" }
X def @@HScale { @Code "@HScale" }
X def @@High { @Code "@High" }
X def @@Include { @Code "@Include" }
X def @@Key { @Code "@Key" }
X def @@LClos { @Code "@LClos" }
X def @@LEnv { @Code "@LEnv" }
X def @@LInput { @Code "@LInput" }
X def @@Moment { @Code "@Moment" }
X def @@Next { @Code "@Next" }
X def @@Null { @Code "@Null" }
X def @@OneCol { @Code "@OneCol" }
X def @@OneRow { @Code "@OneRow" }
X def @@Open { @Code "@Open" }
X def @@Prepend { @Code "@Prepend" }
X def @@Rotate { @Code "@Rotate" }
X def @@Space { @Code "@Space" }
X def @@SysDatabase { @Code "@SysDatabase" }
X def @@SysInclude { @Code "@SysInclude" }
X def @@SysPrepend { @Code "@SysPrepend" }
X def @@Tag { @Code "@Tag" }
X def @@Tagged { @Code "@Tagged" }
X def @@Use { @Code "@Use" }
X def @@VExpand { @Code "@VExpand" }
X def @@VScale { @Code "@VScale" }
X def @@Yield { @Code "@Yield" }
X def @@Wide { @Code "@Wide" }
X
X
X ###################################################
X # #
X # Miscellaneous, mostly graphical definitions. #
X # #
X ###################################################
X
X def @Leaders
X { .. @Leaders
X }
X
X def @HLine {
X { 0 0 moveto xsize 0 lineto stroke }
X @Graphic {}
X }
X
X def @VDashLine
X right length
X {
X length @High
X { 0 0 moveto 0 ysize lineto [ 3 pt ] 0 setdash stroke }
X @Graphic {}
X }
X
X def @LBox
X right offset
X { @OneCol @OneRow
X {
X { //0.2c
X 0.6c @High 1.2c @Wide
X { 0 0 moveto xsize 0 lineto
X xsize ysize lineto 0 ysize lineto closepath
X gsave 0.9 setgray fill grestore stroke }
X @Graphic {}
X }
X ||offset @VDashLine 1c
X }
X }
X
X def @Arrow
X right length
X { @OneCol @OneRow
X {
X 30d @Rotate {0.12c @Wide @HLine}
X //
X length @Wide @HLine
X //
X "-30d" @Rotate {0.12c @Wide @HLine}
X }
X }
X
X def @DoubleArrow
X right length
X { @OneCol @OneRow
X {
X & 180d @Rotate @Arrow length
X |0io @Arrow length
X }
X }
X
X def @Put
X left coord
X right x
X { @OneCol @OneRow
X { coord / | @OneCol @OneRow x
X }
X }
X
X macro @At { //0io }
X
X
X ###################################################
X # #
X # Interpolated example documents. #
X # #
X ###################################################
X
X def @LittleEndRunPlace { @Galley }
X def @LittleEndRun
X force into { @LittleEndRunPlace&&preceding }
X {}
X
X def @LittleTextPlace { @Galley }
X def @LittleText into { @LittleTextPlace&&preceding }
X right x
X { x
X }
X
X def @LittleFootPlace { @Galley }
X def @LittleFootNote into { @LittleFootPlace&&following }
X right x
X { x
X }
X
X def @LittlePageColumn
X right x
X {
X 9px @Break 8p @Font
X 2.8c @Wide x
X }
X
X def @LittlePage
X right x
X {
X @HContract @VContract


X { 0 0 moveto xsize 0 lineto xsize ysize lineto

X 0 ysize lineto closepath stroke } @Graphic
X { //0.3c ||0.3c
X 9px @Break 8p @Font
X 2.8c @Wide 3.8c @High x
X ||0.3c //0.3c
X }
X }
X
X def @LittleFootSect
X { 1c @Wide @HLine
X //0.3v @LittleFootPlace ||0.5c
X }
X
X def @LittlePageList
X right @PageNum
X {
X @LittlePage { # |0.5rt @PageNum //0.8v
X //0.3v @LittleTextPlace
X //1rt @LittleFootSect
X }
X //
X @LittlePageList @Next @PageNum
X }
X
X def @LittleDocument
X { @LittlePage
X { @LittleTextPlace
X //1rt @LittleFootSect
X }
X // @LittlePageList 2
X // @LittleEndRunPlace
X }
X
X def @Strange
X named @Format right @Val { [@Val] }
X right x
X { @Format x
X }
X
X
X@Use { @DocumentLayout
X @MinorHeadingFont { Slope }
X}
X
X@Database @Reference { "oldrefs" }
END_OF_FILE
if test 13292 -ne `wc -c <'lout/doc/tr.impl/setup'`; then
echo shar: \"'lout/doc/tr.impl/setup'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.impl/setup'
fi
if test -f 'lout/font0/NewCenSchBolIta.AFM' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/font0/NewCenSchBolIta.AFM'\"
else
echo shar: Extracting \"'lout/font0/NewCenSchBolIta.AFM'\" \(15704 characters\)
sed "s/^X//" >'lout/font0/NewCenSchBolIta.AFM' <<'END_OF_FILE'
XStartFontMetrics 2.0
XComment Copyright (c) 1985, 1987 Adobe Systems Incorporated. All rights reserved.
XComment Creation Date:Fri Jul 17 18:25:22 PDT 1987
XFontName NewCenturySchlbk-BoldItalic
XEncodingScheme AdobeStandardEncoding
XFullName New Century Schoolbook Bold Italic
XFamilyName New Century Schoolbook
XWeight Bold
XItalicAngle -16.0
XIsFixedPitch false
XUnderlinePosition -102
XUnderlineThickness 54
XVersion 001.004
XNotice Copyright (c) 1985, 1987 Adobe Systems Incorporated. All rights reserved. New Century Schoolbook is a trademark of Linotype Company.
XFontBBox -170 -220 1151 990
XCapHeight 722
XXHeight 477
XDescender -205
XAscender 737
XStartCharMetrics 228
XC 32 ; WX 287 ; N space ; B 0 0 0 0 ;
XC 33 ; WX 333 ; N exclam ; B 3 -15 336 737 ;
XC 34 ; WX 400 ; N quotedbl ; B 100 410 507 736 ;
XC 35 ; WX 574 ; N numbersign ; B 41 0 533 705 ;
XC 36 ; WX 574 ; N dollar ; B 3 -143 559 799 ;
XC 37 ; WX 889 ; N percent ; B 51 -34 836 721 ;
XC 38 ; WX 889 ; N ampersand ; B 31 -15 823 737 ;
XC 39 ; WX 259 ; N quoteright ; B 70 389 301 739 ;
XC 40 ; WX 407 ; N parenleft ; B 71 -123 452 740 ;
XC 41 ; WX 407 ; N parenright ; B -70 -123 308 740 ;
XC 42 ; WX 500 ; N asterisk ; B 32 268 472 704 ;
XC 43 ; WX 606 ; N plus ; B 41 0 545 505 ;
XC 44 ; WX 287 ; N comma ; B -48 -190 180 159 ;
XC 45 ; WX 333 ; N hyphen ; B 10 178 272 297 ;
XC 46 ; WX 287 ; N period ; B 12 -15 186 159 ;
XC 47 ; WX 278 ; N slash ; B -25 -15 311 737 ;
XC 48 ; WX 574 ; N zero ; B 21 -15 553 705 ;
XC 49 ; WX 574 ; N one ; B 25 0 489 705 ;
XC 50 ; WX 574 ; N two ; B -40 0 538 705 ;
XC 51 ; WX 574 ; N three ; B -5 -15 538 705 ;
XC 52 ; WX 574 ; N four ; B -13 0 544 705 ;
XC 53 ; WX 574 ; N five ; B 0 -15 573 705 ;
XC 54 ; WX 574 ; N six ; B 30 -15 573 705 ;
XC 55 ; WX 574 ; N seven ; B 64 -15 593 705 ;
XC 56 ; WX 574 ; N eight ; B 0 -15 551 705 ;
XC 57 ; WX 574 ; N nine ; B 1 -15 544 705 ;
XC 58 ; WX 287 ; N colon ; B -2 -15 257 477 ;
XC 59 ; WX 287 ; N semicolon ; B -39 -190 257 477 ;
XC 60 ; WX 606 ; N less ; B 14 -15 523 524 ;
XC 61 ; WX 606 ; N equal ; B 41 109 545 402 ;
XC 62 ; WX 606 ; N greater ; B 38 -15 547 524 ;
XC 63 ; WX 481 ; N question ; B 79 -15 452 737 ;
XC 64 ; WX 747 ; N at ; B 22 -15 722 737 ;
XC 65 ; WX 741 ; N A ; B -75 0 716 737 ;
XC 66 ; WX 759 ; N B ; B -50 0 720 722 ;
XC 67 ; WX 759 ; N C ; B 35 -15 759 737 ;
XC 68 ; WX 833 ; N D ; B -49 0 796 722 ;
XC 69 ; WX 741 ; N E ; B -41 0 728 722 ;
XC 70 ; WX 704 ; N F ; B -41 0 726 722 ;
XC 71 ; WX 815 ; N G ; B 34 -15 802 737 ;
XC 72 ; WX 870 ; N H ; B -41 0 912 722 ;
XC 73 ; WX 444 ; N I ; B -41 0 486 722 ;
XC 74 ; WX 667 ; N J ; B -9 -15 718 722 ;
XC 75 ; WX 778 ; N K ; B -41 0 832 722 ;
XC 76 ; WX 704 ; N L ; B -41 0 670 722 ;
XC 77 ; WX 944 ; N M ; B -24 0 988 722 ;
XC 78 ; WX 852 ; N N ; B -57 -16 912 722 ;
XC 79 ; WX 833 ; N O ; B 36 -15 797 737 ;
XC 80 ; WX 741 ; N P ; B -38 0 731 722 ;
XC 81 ; WX 833 ; N Q ; B 35 -186 796 737 ;
XC 82 ; WX 796 ; N R ; B -41 -15 751 722 ;
XC 83 ; WX 685 ; N S ; B 1 -15 666 737 ;
XC 84 ; WX 722 ; N T ; B 44 0 762 722 ;
XC 85 ; WX 833 ; N U ; B 88 -15 895 722 ;
XC 86 ; WX 741 ; N V ; B 32 -15 802 722 ;
XC 87 ; WX 944 ; N W ; B 40 -15 994 722 ;
XC 88 ; WX 741 ; N X ; B -72 0 811 722 ;
XC 89 ; WX 704 ; N Y ; B 15 0 777 722 ;
XC 90 ; WX 704 ; N Z ; B -29 0 715 722 ;
XC 91 ; WX 407 ; N bracketleft ; B -31 -110 432 737 ;
XC 92 ; WX 606 ; N backslash ; B 81 0 545 737 ;
XC 93 ; WX 407 ; N bracketright ; B -49 -110 414 737 ;
XC 94 ; WX 606 ; N asciicircum ; B 52 319 554 722 ;
XC 95 ; WX 500 ; N underscore ; B 0 -129 500 -75 ;
XC 96 ; WX 259 ; N quoteleft ; B 39 397 270 747 ;
XC 97 ; WX 667 ; N a ; B 15 -15 646 477 ;
XC 98 ; WX 611 ; N b ; B 28 -15 557 737 ;
XC 99 ; WX 537 ; N c ; B 3 -15 487 477 ;
XC 100 ; WX 667 ; N d ; B 0 -15 663 737 ;
XC 101 ; WX 519 ; N e ; B -2 -15 478 477 ;
XC 102 ; WX 389 ; N f ; B -48 -205 550 737 ; L i fi ; L l fl ;
XC 103 ; WX 611 ; N g ; B -66 -205 602 529 ;
XC 104 ; WX 685 ; N h ; B 0 -15 637 737 ;
XC 105 ; WX 389 ; N i ; B 28 -15 343 737 ;
XC 106 ; WX 370 ; N j ; B -170 -205 381 737 ;
XC 107 ; WX 648 ; N k ; B -5 -15 584 737 ;
XC 108 ; WX 389 ; N l ; B 26 -15 370 737 ;
XC 109 ; WX 944 ; N m ; B 9 -15 920 477 ;
XC 110 ; WX 685 ; N n ; B 3 -15 642 477 ;
XC 111 ; WX 574 ; N o ; B 10 -15 540 477 ;
XC 112 ; WX 648 ; N p ; B -118 -205 590 477 ;
XC 113 ; WX 630 ; N q ; B 0 -205 587 477 ;
XC 114 ; WX 519 ; N r ; B 3 0 524 486 ;
XC 115 ; WX 481 ; N s ; B 2 -15 437 477 ;
XC 116 ; WX 407 ; N t ; B 24 -15 404 650 ;
XC 117 ; WX 685 ; N u ; B 38 -15 639 477 ;
XC 118 ; WX 556 ; N v ; B 32 -15 500 477 ;
XC 119 ; WX 833 ; N w ; B 22 -15 788 477 ;
XC 120 ; WX 574 ; N x ; B -49 -15 571 477 ;
XC 121 ; WX 519 ; N y ; B -66 -205 492 477 ;
XC 122 ; WX 519 ; N z ; B -18 -15 472 477 ;
XC 123 ; WX 407 ; N braceleft ; B 51 -115 401 738 ;
XC 124 ; WX 606 ; N bar ; B 262 0 343 737 ;
XC 125 ; WX 407 ; N braceright ; B -30 -115 322 738 ;
XC 126 ; WX 606 ; N asciitilde ; B 51 158 555 353 ;
XC 161 ; WX 333 ; N exclamdown ; B -39 -205 289 544 ;
XC 162 ; WX 574 ; N cent ; B 30 -124 514 600 ;
XC 163 ; WX 574 ; N sterling ; B -18 -15 566 705 ;
XC 164 ; WX 167 ; N fraction ; B -166 -15 333 705 ;
XC 165 ; WX 574 ; N yen ; B 23 0 635 705 ;
XC 166 ; WX 574 ; N florin ; B -27 -205 588 737 ;
XC 167 ; WX 500 ; N section ; B -40 -145 505 737 ;
XC 168 ; WX 574 ; N currency ; B 40 110 546 612 ;
XC 169 ; WX 287 ; N quotesingle ; B 100 409 269 735 ;
XC 170 ; WX 481 ; N quotedblleft ; B 52 397 522 747 ;
XC 171 ; WX 481 ; N guillemotleft ; B -35 68 427 409 ;
XC 172 ; WX 278 ; N guilsinglleft ; B -35 68 224 409 ;
XC 173 ; WX 278 ; N guilsinglright ; B -5 67 254 408 ;
XC 174 ; WX 685 ; N fi ; B -70 -205 646 737 ;
XC 175 ; WX 685 ; N fl ; B -70 -205 681 737 ;
XC 177 ; WX 500 ; N endash ; B -18 189 518 286 ;
XC 178 ; WX 500 ; N dagger ; B 50 -146 510 737 ;
XC 179 ; WX 500 ; N daggerdbl ; B -48 -147 514 737 ;
XC 180 ; WX 287 ; N periodcentered ; B 41 168 215 342 ;
XC 182 ; WX 650 ; N paragraph ; B 67 0 661 737 ;
XC 183 ; WX 606 ; N bullet ; B 109 200 446 537 ;
XC 184 ; WX 259 ; N quotesinglbase ; B -43 -191 188 159 ;
XC 185 ; WX 481 ; N quotedblbase ; B -70 -191 402 159 ;
XC 186 ; WX 481 ; N quotedblright ; B 61 389 533 739 ;
XC 187 ; WX 481 ; N guillemotright ; B -5 67 457 408 ;
XC 188 ; WX 1000 ; N ellipsis ; B 20 -15 860 159 ;
XC 189 ; WX 1167 ; N perthousand ; B 26 -34 1151 721 ;
XC 191 ; WX 481 ; N questiondown ; B 1 -205 368 544 ;
XC 193 ; WX 333 ; N grave ; B 74 535 294 719 ;
XC 194 ; WX 333 ; N acute ; B 123 535 371 719 ;
XC 195 ; WX 333 ; N circumflex ; B 23 535 365 709 ;
XC 196 ; WX 333 ; N tilde ; B 34 557 404 683 ;
XC 197 ; WX 333 ; N macron ; B 32 573 387 649 ;
XC 198 ; WX 333 ; N breve ; B 67 534 390 698 ;
XC 199 ; WX 333 ; N dotaccent ; B 145 542 288 685 ;
XC 200 ; WX 333 ; N dieresis ; B 34 542 392 685 ;
XC 202 ; WX 333 ; N ring ; B 217 530 432 745 ;
XC 203 ; WX 333 ; N cedilla ; B -87 -220 157 3 ;
XC 205 ; WX 333 ; N hungarumlaut ; B 23 535 472 719 ;
XC 206 ; WX 333 ; N ogonek ; B 68 -155 245 -10 ;
XC 207 ; WX 333 ; N caron ; B 60 535 403 709 ;
XC 208 ; WX 1000 ; N emdash ; B -18 189 1018 286 ;
XC 225 ; WX 889 ; N AE ; B -81 0 906 722 ;
XC 227 ; WX 412 ; N ordfeminine ; B 29 327 449 737 ;
XC 232 ; WX 704 ; N Lslash ; B -41 0 670 722 ;
XC 233 ; WX 833 ; N Oslash ; B 17 -82 797 775 ;
XC 234 ; WX 963 ; N OE ; B 19 0 980 722 ;
XC 235 ; WX 356 ; N ordmasculine ; B 29 327 383 737 ;
XC 241 ; WX 815 ; N ae ; B -19 -15 774 477 ;
XC 245 ; WX 389 ; N dotlessi ; B 38 -15 353 477 ;
XC 248 ; WX 389 ; N lslash ; B 26 -15 397 737 ;
XC 249 ; WX 574 ; N oslash ; B 10 -126 540 578 ;
XC 250 ; WX 852 ; N oe ; B -5 -15 810 477 ;
XC 251 ; WX 574 ; N germandbls ; B -66 -205 523 737 ;
XC -1 ; WX 741 ; N Aacute ; B -75 0 716 964 ;
XC -1 ; WX 741 ; N Acircumflex ; B -75 0 716 954 ;
XC -1 ; WX 741 ; N Adieresis ; B -75 0 716 930 ;
XC -1 ; WX 741 ; N Agrave ; B -75 0 716 964 ;
XC -1 ; WX 741 ; N Aring ; B -75 0 716 990 ;
XC -1 ; WX 741 ; N Atilde ; B -75 0 716 928 ;
XC -1 ; WX 759 ; N Ccedilla ; B 35 -220 759 737 ;
XC -1 ; WX 741 ; N Eacute ; B -41 0 728 964 ;
XC -1 ; WX 741 ; N Ecircumflex ; B -41 0 728 954 ;
XC -1 ; WX 741 ; N Edieresis ; B -41 0 728 930 ;
XC -1 ; WX 741 ; N Egrave ; B -41 0 728 964 ;
XC -1 ; WX 833 ; N Eth ; B -49 0 796 722 ;
XC -1 ; WX 444 ; N Iacute ; B -41 0 486 964 ;
XC -1 ; WX 444 ; N Icircumflex ; B -41 0 486 954 ;
XC -1 ; WX 444 ; N Idieresis ; B -41 0 498 930 ;
XC -1 ; WX 444 ; N Igrave ; B -41 0 486 964 ;
XC -1 ; WX 852 ; N Ntilde ; B -57 -16 912 928 ;
XC -1 ; WX 833 ; N Oacute ; B 36 -15 797 964 ;
XC -1 ; WX 833 ; N Ocircumflex ; B 36 -15 797 954 ;
XC -1 ; WX 833 ; N Odieresis ; B 36 -15 797 930 ;
XC -1 ; WX 833 ; N Ograve ; B 36 -15 797 964 ;
XC -1 ; WX 833 ; N Otilde ; B 36 -15 797 928 ;
XC -1 ; WX 685 ; N Scaron ; B 1 -15 666 954 ;
XC -1 ; WX 741 ; N Thorn ; B -38 0 690 722 ;
XC -1 ; WX 833 ; N Uacute ; B 88 -15 895 964 ;
XC -1 ; WX 833 ; N Ucircumflex ; B 88 -15 895 954 ;
XC -1 ; WX 833 ; N Udieresis ; B 88 -15 895 930 ;
XC -1 ; WX 833 ; N Ugrave ; B 88 -15 895 964 ;
XC -1 ; WX 704 ; N Yacute ; B 15 0 777 964 ;
XC -1 ; WX 704 ; N Ydieresis ; B 15 0 777 930 ;
XC -1 ; WX 704 ; N Zcaron ; B -29 0 715 954 ;
XC -1 ; WX 667 ; N aacute ; B 15 -15 646 719 ;
XC -1 ; WX 667 ; N acircumflex ; B 15 -15 646 709 ;
XC -1 ; WX 667 ; N adieresis ; B 15 -15 646 685 ;
XC -1 ; WX 667 ; N agrave ; B 15 -15 646 719 ;
XC -1 ; WX 667 ; N aring ; B 15 -15 646 745 ;
XC -1 ; WX 667 ; N atilde ; B 15 -15 646 683 ;
XC -1 ; WX 606 ; N brokenbar ; B 262 0 343 737 ;
XC -1 ; WX 537 ; N ccedilla ; B 3 -220 487 477 ;
XC -1 ; WX 747 ; N copyright ; B 23 -15 723 737 ;
XC -1 ; WX 400 ; N degree ; B 70 405 370 705 ;
XC -1 ; WX 606 ; N divide ; B 41 0 545 505 ;
XC -1 ; WX 519 ; N eacute ; B -2 -15 478 719 ;
XC -1 ; WX 519 ; N ecircumflex ; B -2 -15 478 709 ;
XC -1 ; WX 519 ; N edieresis ; B -2 -15 495 685 ;
XC -1 ; WX 519 ; N egrave ; B -2 -15 478 719 ;
XC -1 ; WX 574 ; N eth ; B 10 -15 540 737 ;
XC -1 ; WX 389 ; N iacute ; B 38 -15 399 719 ;
XC -1 ; WX 389 ; N icircumflex ; B 38 -15 383 709 ;
XC -1 ; WX 389 ; N idieresis ; B 38 -15 410 685 ;
XC -1 ; WX 389 ; N igrave ; B 38 -15 353 719 ;
XC -1 ; WX 606 ; N logicalnot ; B 41 120 545 402 ;
XC -1 ; WX 606 ; N minus ; B 41 206 545 304 ;
XC -1 ; WX 685 ; N mu ; B -90 -205 639 477 ;
XC -1 ; WX 606 ; N multiply ; B 41 0 547 506 ;
XC -1 ; WX 685 ; N ntilde ; B 3 -15 642 683 ;
XC -1 ; WX 574 ; N oacute ; B 10 -15 540 719 ;
XC -1 ; WX 574 ; N ocircumflex ; B 10 -15 540 709 ;
XC -1 ; WX 574 ; N odieresis ; B 10 -15 540 685 ;
XC -1 ; WX 574 ; N ograve ; B 10 -15 540 719 ;
XC -1 ; WX 861 ; N onehalf ; B 21 -15 857 705 ;
XC -1 ; WX 861 ; N onequarter ; B 21 -15 826 705 ;
XC -1 ; WX 344 ; N onesuperior ; B 21 282 323 705 ;
XC -1 ; WX 574 ; N otilde ; B 10 -15 540 683 ;
XC -1 ; WX 606 ; N plusminus ; B 41 0 545 505 ;
XC -1 ; WX 747 ; N registered ; B 23 -15 723 737 ;
XC -1 ; WX 481 ; N scaron ; B 2 -15 477 709 ;
XC -1 ; WX 648 ; N thorn ; B -118 -205 590 650 ;
XC -1 ; WX 861 ; N threequarters ; B -4 -15 826 705 ;
XC -1 ; WX 344 ; N threesuperior ; B -4 273 348 705 ;
XC -1 ; WX 950 ; N trademark ; B 42 318 982 722 ;
XC -1 ; WX 344 ; N twosuperior ; B -16 282 360 705 ;
XC -1 ; WX 685 ; N uacute ; B 38 -15 639 719 ;
XC -1 ; WX 685 ; N ucircumflex ; B 38 -15 639 709 ;
XC -1 ; WX 685 ; N udieresis ; B 38 -15 639 685 ;
XC -1 ; WX 685 ; N ugrave ; B 38 -15 639 719 ;
XC -1 ; WX 519 ; N yacute ; B -66 -205 492 719 ;
XC -1 ; WX 519 ; N ydieresis ; B -66 -205 492 685 ;
XC -1 ; WX 519 ; N zcaron ; B -18 -15 496 709 ;
XEndCharMetrics
XStartKernData
XStartKernPairs 102
X
XKPX A y -50
XKPX A w -20
XKPX A v -20
XKPX A space -18
XKPX A quoteright -74
XKPX A Y -74
XKPX A W -92
XKPX A V -111
XKPX A T -74


X
XKPX F period -129

XKPX F f -18
XKPX F comma -129
XKPX F A -74
X
XKPX L y -55
XKPX L space -18
XKPX L quoteright -55
XKPX L Y -55
XKPX L W -55
XKPX L V -74
XKPX L T -55


X
XKPX P space -18
XKPX P period -129
XKPX P comma -129

XKPX P A -92
X
XKPX R y -50
XKPX R Y -20
XKPX R W -20
XKPX R V -20
XKPX R T -20
X
XKPX T y -89
XKPX T w -89
XKPX T u -89
XKPX T semicolon -72
XKPX T s -89
XKPX T r -89
XKPX T period -111
XKPX T o -109
XKPX T i -71
XKPX T hyphen -129
XKPX T e -109
XKPX T comma -111
XKPX T colon -62
XKPX T c -89
XKPX T a -74
XKPX T A -50
X
XKPX V y -89
XKPX V u -89
XKPX V semicolon -74
XKPX V r -109
XKPX V period -111
XKPX V o -129
XKPX V i -72
XKPX V hyphen -74
XKPX V e -129
XKPX V comma -111
XKPX V colon -74
XKPX V a -129
XKPX V A -129
X
XKPX W y -74
XKPX W u -74
XKPX W semicolon -37
XKPX W r -74
XKPX W period -55
XKPX W o -74
XKPX W i -74
XKPX W hyphen -37
XKPX W e -74
XKPX W comma -55
XKPX W colon -37
XKPX W a -74
XKPX W A -89
X
XKPX Y v -129
XKPX Y u -129
XKPX Y semicolon -111
XKPX Y q -129
XKPX Y period -129
XKPX Y p -129
XKPX Y o -129
XKPX Y i -90
XKPX Y hyphen -129
XKPX Y e -129
XKPX Y comma -129
XKPX Y colon -111
XKPX Y a -129
XKPX Y A -111
X
XKPX f quoteright 74


X
XKPX one one -74
X

XKPX quoteleft quoteleft -18
X
XKPX quoteright t -37
XKPX quoteright space -55
XKPX quoteright s -37
XKPX quoteright quoteright -18
X
XKPX r quoteright 55
XKPX r period -129
XKPX r hyphen 0
XKPX r comma -129
X
XKPX v period -37
XKPX v comma -37
X
XKPX w period -37
XKPX w comma -37


X
XKPX y period -55
XKPX y comma -55
XEndKernPairs
XEndKernData
XStartComposites 58

XCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 205 245 ;
XCC zcaron 2 ; PCC z 0 0 ; PCC caron 93 0 ;
XCC Scaron 2 ; PCC S 0 0 ; PCC caron 196 245 ;
XCC scaron 2 ; PCC s 0 0 ; PCC caron 74 0 ;
XCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 293 0 ;
XCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 142 0 ;
XCC Yacute 2 ; PCC Y 0 0 ; PCC acute 185 245 ;
XCC yacute 2 ; PCC y 0 0 ; PCC acute 93 0 ;
XCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 215 245 ;
XCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 83 0 ;
XCC Uacute 2 ; PCC U 0 0 ; PCC acute 290 245 ;
XCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 310 245 ;
XCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 320 245 ;
XCC Ugrave 2 ; PCC U 0 0 ; PCC grave 280 245 ;
XCC uacute 2 ; PCC u 0 0 ; PCC acute 176 0 ;
XCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 176 0 ;
XCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 166 0 ;
XCC ugrave 2 ; PCC u 0 0 ; PCC grave 176 0 ;
XCC Iacute 2 ; PCC I 0 0 ; PCC acute 75 245 ;
XCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex 95 245 ;
XCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis 105 245 ;
XCC Igrave 2 ; PCC I 0 0 ; PCC grave 85 245 ;
XCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute 28 0 ;
XCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex 18 0 ;
XCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis 18 0 ;
XCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave 28 0 ;
XCC Eacute 2 ; PCC E 0 0 ; PCC acute 234 245 ;
XCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 244 245 ;
XCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 244 245 ;
XCC Egrave 2 ; PCC E 0 0 ; PCC grave 234 245 ;
XCC eacute 2 ; PCC e 0 0 ; PCC acute 93 0 ;
XCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 103 0 ;
XCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 103 0 ;
XCC egrave 2 ; PCC e 0 0 ; PCC grave 103 0 ;
XCC Aacute 2 ; PCC A 0 0 ; PCC acute 204 245 ;
XCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 244 245 ;
XCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 224 245 ;
XCC Agrave 2 ; PCC A 0 0 ; PCC grave 234 245 ;
XCC aacute 2 ; PCC a 0 0 ; PCC acute 167 0 ;
XCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 167 0 ;
XCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 157 0 ;
XCC agrave 2 ; PCC a 0 0 ; PCC grave 167 0 ;
XCC Oacute 2 ; PCC O 0 0 ; PCC acute 270 245 ;
XCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 290 245 ;
XCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 300 245 ;
XCC Ograve 2 ; PCC O 0 0 ; PCC grave 280 245 ;
XCC oacute 2 ; PCC o 0 0 ; PCC acute 120 0 ;
XCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 110 0 ;
XCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 110 0 ;
XCC ograve 2 ; PCC o 0 0 ; PCC grave 120 0 ;
XCC Atilde 2 ; PCC A 0 0 ; PCC tilde 244 245 ;
XCC atilde 2 ; PCC a 0 0 ; PCC tilde 167 0 ;
XCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 299 245 ;
XCC ntilde 2 ; PCC n 0 0 ; PCC tilde 156 0 ;
XCC Otilde 2 ; PCC O 0 0 ; PCC tilde 270 245 ;
XCC otilde 2 ; PCC o 0 0 ; PCC tilde 120 0 ;
XCC Aring 2 ; PCC A 0 0 ; PCC ring 124 245 ;
XCC aring 2 ; PCC a 0 0 ; PCC ring 57 0 ;
XEndComposites
XEndFontMetrics
END_OF_FILE
if test 15704 -ne `wc -c <'lout/font0/NewCenSchBolIta.AFM'`; then
echo shar: \"'lout/font0/NewCenSchBolIta.AFM'\" unpacked with wrong size!
fi
# end of 'lout/font0/NewCenSchBolIta.AFM'
fi
if test -f 'lout/include/fig' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/include/fig'\"
else
echo shar: Extracting \"'lout/include/fig'\" \(16471 characters\)
sed "s/^X//" >'lout/include/fig' <<'END_OF_FILE'
X
X###############################################################################
X# #
X# Lout @Fig package for drawing figures (Version 2.0) #
X# #
X# Version 1.0 by Jeffrey H. Kingston, October 1991. #


X# Version 2.0 by Jeffrey H. Kingston, 22 December 1992. #

X# Symbol names changed by JHK 5 March 1993 to avoid clashes with EPS files. #
X# #
X# See "Fig - a Lout package for drawing figures" for user information. #
X# #
X###############################################################################
X
X@SysPrependGraphic { "fig_prepend" }
X
Xexport in cm pt em sp vs ft dg
X "<<" "**" "++" "--" @Max @Min
X @Distance @XDistance @YDistance @Angle
X @Prev "::" @Label @BaseOf @MarkOf @ShowLabels
X @Colour @Color @RGBColour @RGBColor @HSBColour @HSBColor
X @Figure @Frame @Box @Square @Diamond @Polygon @Ellipse
X @Circle @HLine @VLine @Line @HArrow @VArrow @Arrow @Arc
X
Xdef @Fig
X named maxlabels { 200 }
X named linestyle { solid }


X named linewidth { 0.5 pt }

X named linecap { round }
X named dashlength { 0.15 cm }
X named paint { nopaint }
X named margin { 0.4c }
X named arrow { noarrow }
X named headstyle { open }
X named headwidth { 0.05 cm }
X named headlength { 0.15 cm }


X body @Body
X@Begin
X

X # Like @Graphic, but affects the graphics state of right parameter
X def @InnerGraphic
X left ps
X right x
X {
X { ps gsave // grestore } @Graphic x
X }
X
X def in precedence 39 left x { x "in" }
X def cm precedence 39 left x { x "cm" }
X def pt precedence 39 left x { x "pt" }
X def em precedence 39 left x { x "em" }
X def sp precedence 39 left x { x "sp" }
X def vs precedence 39 left x { x "vs" }
X def ft precedence 39 left x { x "ft" }
X def dg precedence 39 left x { x "dg" }
X
X def "<<"
X precedence 38
X left length
X right angle
X {
X 0 0 length angle "lfigatangle"
X }
X
X def "**"
X precedence 37
X left point
X right length
X {
X point length "lfigpmul"
X }
X
X def "++"
X precedence 36
X associativity left


X left x
X right y
X {

X x y "lfigpadd"
X }
X
X def "--"
X precedence 36
X associativity left


X left x
X right y
X {

X y x "lfigpsub"
X }
X
X def @Max
X precedence 36


X left x
X right y
X {

X x y "lfigpmax"
X }
X
X def @Min
X precedence 36


X left x
X right y
X {

X x y "lfigpmin"
X }
X
X def @Distance
X precedence 35


X left x
X right y
X {

X x y "lfigdistance"
X }
X
X def @XDistance
X precedence 35


X left x
X right y
X {

X x y "lfigxdistance"
X }
X
X def @YDistance
X precedence 35


X left x
X right y
X {

X x y "lfigydistance"
X }
X
X def @Angle
X precedence 35


X left x
X right y
X {

X x y "lfigangle"
X }
X
X def @Prev
X {
X "lfigprevious"
X }
X
X def "::"
X precedence 33
X left name
X right x
X {
X { "currentdict end" maxlabels "dict begin begin"
X // "("name") lfigpromotelabels" } @Graphic x
X }
X
X def @Label
X right name
X {
X "/"name "lfigpointdef"
X }
X
X def @MarkOf
X precedence 32
X left point
X right x
X {
X { point "translate" } @InnerGraphic
X {
X /0io |0io @OneCol @OneRow x |0io /0io
X }
X }
X
X def @BaseOf
X precedence 32
X left point
X right x
X {
X { point "translate" } @InnerGraphic
X {
X /0io |0io @OneRow @OneCol {
X | @OneCol @OneRow x ^/
X } |0io /0io
X }
X }
X
X def @ShowLabels
X {
X "lfigshowlabels" @Graphic
X }
X
X def @Colour
X left col
X right x
X {
X {
X col @Case
X {
X black @Yield "0.00 0.0 0.0"
X grey @Yield "0.00 0.0 0.9"
X white @Yield "0.00 0.0 1.0"
X red @Yield "0.00 1.0 1.0"
X green @Yield "0.33 1.0 1.0"
X blue @Yield "0.66 1.0 1.0"
X } sethsbcolor
X } @InnerGraphic x
X }
X
X def @Color
X left col
X right x
X {
X col @Colour x
X }
X
X def @RGBColour
X left col
X right x
X {
X { col setrgbcolor } @InnerGraphic x
X }
X
X def @RGBColor
X left col
X right x
X {
X col @RGBColour x
X }
X
X def @HSBColour
X left col
X right x
X {
X { col sethsbcolor } @InnerGraphic x
X }
X
X def @HSBColor
X left col
X right x
X {
X col @HSBColour x
X }
X
X def @Figure
X named shape { }
X named linestyle { linestyle }
X named linewidth { linewidth }
X named linecap { linecap }
X named dashlength { dashlength }
X named arrow { arrow }
X named headstyle { headstyle }
X named headwidth { headwidth }
X named headlength { headlength }
X named paint { paint }
X named margin { 0c }
X right x
X {
X @HContract @VContract
X {
X #fill the shape
X paint @Case
X {
X nopaint @Yield {}
X
X { white light grey gray dark black } @Yield
X { "/lfig"paint "[" shape "] gsave lfigpaintpath grestore" }
X }
X
X # stroke the path and add any arrowheads
X linestyle @Case
X {
X { solid dashed cdashed dotted noline } @Yield
X {
X linewidth "setlinewidth" "lfig"linecap "setlinecap"
X dashlength "/lfig"linestyle "[" shape "] lfigdopath"
X arrow @Case
X {
X noarrow @Yield { pop pop }
X { forward back both } @Yield
X { dashlength "/lfig"linestyle "/"lfigblack
X headstyle @Case
X { { open halfopen closed } @Yield "lfig"headstyle }
X headlength headwidth "lfig"arrow


X }
X }
X }
X }
X }

X @Graphic
X {
X ^/margin ^|margin @OneCol @OneRow x |margin
X /margin
X }
X }
X
X def @Frame
X right x
X {
X @Figure
X shape {xsize 0 @Label X 0 ysize @Label Y}
X { x }
X }
X
X def @Box
X named linestyle { linestyle }
X named linewidth { linewidth }
X named linecap { linecap }
X named dashlength { dashlength }
X named paint { paint }
X named margin { margin }
X right x
X {
X @Figure
X shape {
X # 0 0 @Label SW
X # xsize 0 @Label SE
X # xsize ysize @Label NE
X # 0 ysize @Label NW
X # SE ** 0.5 @Label S
X # NW ** 0.5 @Label W
X # W ++ SE @Label E
X # S ++ NW @Label N
X # NE ** 0.5 @Label CTR
X # SW SE NE NW SW
X lfigbox
X }
X linestyle { linestyle }
X linewidth { linewidth }
X linecap { linecap }
X dashlength { dashlength }
X paint { paint }
X margin { margin }
X x
X }
X
X def @Square
X named linestyle { linestyle }
X named linewidth { linewidth }
X named linecap { linecap }
X named dashlength { dashlength }
X named paint { paint }
X named margin { margin }
X right x
X {
X @Figure
X shape {
X # {xsize ysize} ** 0.5 @Label CTR
X # CTR ++ {{xsize xsize} @Max {ysize ysize}}**0.5 @Label NE
X # CTR ++ { {CTR @Distance NE} << 135 } @Label NW
X # CTR ++ { {CTR @Distance NE} << 225 } @Label SW
X # CTR ++ { {CTR @Distance NE} << 315 } @Label SE
X # SW ** 0.5 ++ SE ** 0.5 @Label S
X # NW ** 0.5 ++ NE ** 0.5 @Label N
X # SW ** 0.5 ++ NW ** 0.5 @Label W
X # SE ** 0.5 ++ NE ** 0.5 @Label E
X # SW SE NE NW SW
X lfigsquare
X }
X linestyle { linestyle }
X linewidth { linewidth }
X linecap { linecap }
X dashlength { dashlength }
X paint { paint }
X margin { margin }
X x
X }
X
X def @Diamond
X named linestyle { linestyle }
X named linewidth { linewidth }
X named linecap { linecap }
X named dashlength { dashlength }
X named paint { paint }
X named margin { margin }
X right x
X {
X @Figure
X shape {
X # {xsize 0} ** 0.5 @Label S
X # {0 ysize} ** 0.5 @Label W
X # S ++ W @Label CTR
X # CTR ++ W @Label N
X # CTR ++ S @Label E
X # S E N W S
X lfigdiamond
X }
X linestyle { linestyle }
X linewidth { linewidth }
X linecap { linecap }
X dashlength { dashlength }
X paint { paint }
X margin { margin }
X x
X }
X
X def @Polygon
X named linestyle { linestyle }
X named linewidth { linewidth }
X named linecap { linecap }
X named dashlength { dashlength }
X named paint { paint }
X named margin { margin }
X named sides { 3 }
X named angle { "dup 180 exch div" }
X right x
X {
X @Figure
X shape { sides angle lfigpolygon }
X linestyle { linestyle }
X linewidth { linewidth }
X linecap { linecap }
X dashlength { dashlength }
X paint { paint }
X margin { margin }
X x
X }
X
X def @Ellipse
X named linestyle { linestyle }
X named linewidth { linewidth }
X named linecap { linecap }
X named dashlength { dashlength }
X named paint { paint }
X named margin { margin }
X right x
X {
X @Figure
X shape {
X # {xsize 0} ** 0.5 @Label S
X # {0 ysize} ** 0.5 @Label W
X # S ++ W @Label CTR
X # CTR ++ W @Label N
X # CTR ++ S @Label E
X # CTR ++ {xsize 0} ** 0.3536 ++ {0 ysize} ** 0.3536 @Label NE
X # CTR ++ {xsize 0} ** 0.3536 -- {0 ysize} ** 0.3536 @Label SE
X # CTR -- {xsize 0} ** 0.3536 ++ {0 ysize} ** 0.3536 @Label NW
X # CTR -- {xsize 0} ** 0.3536 -- {0 ysize} ** 0.3536 @Label SW
X # S [ CTR ] E [ CTR ] N [ CTR ] W [ CTR ] S
X lfigellipse
X }
X linestyle { linestyle }
X linewidth { linewidth }
X linecap { linecap }
X dashlength { dashlength }
X paint { paint }
X margin { margin }
X x
X }
X
X def @Circle
X named linestyle { linestyle }
X named linewidth { linewidth }
X named linecap { linecap }
X named dashlength { dashlength }
X named paint { paint }
X named margin { margin }
X right x
X {
X @Figure
X shape {
X # {xsize ysize} **0.5 @Label CTR
X # CTR ++ {{xsize 0} @Max {ysize 0}}**0.5 @Label E
X # CTR ++ { {CTR @Distance E} << 45 } @Label NE
X # CTR ++ { {CTR @Distance E} << 90 } @Label N
X # CTR ++ { {CTR @Distance E} << 135 } @Label NW
X # CTR ++ { {CTR @Distance E} << 180 } @Label W
X # CTR ++ { {CTR @Distance E} << 225 } @Label SW
X # CTR ++ { {CTR @Distance E} << 270 } @Label S
X # CTR ++ { {CTR @Distance E} << 315 } @Label SE
X # S [ CTR ] E [ CTR ] N [ CTR ] W [ CTR ] S
X lfigcircle
X }
X linestyle { linestyle }
X linewidth { linewidth }
X linecap { linecap }
X dashlength { dashlength }
X paint { paint }
X margin { margin }
X x
X }
X
X def @HLine
X named linestyle { linestyle }
X named linewidth { linewidth }
X named linecap { linecap }
X named dashlength { dashlength }
X named paint { paint }
X named margin { 0c }
X named arrow { arrow }
X named headstyle { headstyle }
X named headwidth { headwidth }
X named headlength { headlength }
X right x
X {
X @Figure
X shape {
X # 0 ymark @Prev @Label FROM
X # xsize ymark @Prev @Label TO
X lfighline
X }
X linestyle { linestyle }
X linewidth { linewidth }
X linecap { linecap }
X dashlength { dashlength }
X paint { paint }
X margin { margin }
X arrow { arrow }
X headstyle { headstyle }
X headwidth { headwidth }
X headlength { headlength }
X x
X }
X
X def @VLine
X named linestyle { linestyle }
X named linewidth { linewidth }
X named linecap { linecap }
X named dashlength { dashlength }
X named paint { paint }
X named margin { 0c }
X named arrow { arrow }
X named headstyle { headstyle }
X named headwidth { headwidth }
X named headlength { headlength }
X right x
X {
X @Figure
X shape {
X # xmark ysize @Prev @Label FROM
X # xmark 0 @Prev @Label TO
X lfigvline
X }
X linestyle { linestyle }
X linewidth { linewidth }
X linecap { linecap }
X dashlength { dashlength }
X paint { paint }
X margin { margin }
X arrow { arrow }
X headstyle { headstyle }
X headwidth { headwidth }
X headlength { headlength }
X x
X }
X
X def @HArrow
X named linestyle { linestyle }
X named linewidth { linewidth }
X named linecap { linecap }
X named dashlength { dashlength }
X named paint { paint }
X named margin { 0c }
X named arrow { forward }
X named headstyle { headstyle }
X named headwidth { headwidth }
X named headlength { headlength }
X right x
X {
X @Figure
X shape {
X # 0 ymark @Prev @Label FROM
X # xsize ymark @Prev @Label TO
X lfighline
X }
X linestyle { linestyle }
X linewidth { linewidth }
X linecap { linecap }
X dashlength { dashlength }
X paint { paint }
X margin { margin }
X arrow { arrow }
X headstyle { headstyle }
X headwidth { headwidth }
X headlength { headlength }
X x
X }
X
X def @VArrow
X named linestyle { linestyle }
X named linewidth { linewidth }
X named linecap { linecap }
X named dashlength { dashlength }
X named paint { paint }
X named margin { 0c }
X named arrow { forward }
X named headstyle { headstyle }
X named headwidth { headwidth }
X named headlength { headlength }
X right x
X {
X @Figure
X shape {
X # xmark ysize @Prev @Label FROM
X # xmark 0 @Prev @Label TO
X lfigvline
X }
X linestyle { linestyle }
X linewidth { linewidth }
X linecap { linecap }
X dashlength { dashlength }
X paint { paint }
X margin { margin }
X arrow { arrow }
X headstyle { headstyle }
X headwidth { headwidth }
X headlength { headlength }
X x
X }
X
X def @Line
X named from { 0 ysize }
X named to { xsize 0 }
X named linestyle { linestyle }
X named linewidth { linewidth }
X named linecap { linecap }
X named dashlength { dashlength }
X named paint { paint }
X named margin { 0c }
X named arrow { arrow }
X named headstyle { headstyle }
X named headwidth { headwidth }
X named headlength { headlength }
X right x
X {
X @Figure
X shape {
X from @Prev @Label FROM
X to @Prev @Label TO
X }
X linestyle { linestyle }
X linewidth { linewidth }
X linecap { linecap }
X dashlength { dashlength }
X paint { paint }
X margin { margin }
X arrow { arrow }
X headstyle { headstyle }
X headwidth { headwidth }
X headlength { headlength }
X x
X }
X
X def @Arrow
X named from { 0 ysize }
X named to { xsize 0 }
X named linestyle { linestyle }
X named linewidth { linewidth }
X named linecap { linecap }
X named dashlength { dashlength }
X named paint { paint }
X named margin { 0c }
X named arrow { forward }
X named headstyle { headstyle }
X named headwidth { headwidth }
X named headlength { headlength }
X right x
X {
X @Figure
X shape {
X from @Prev @Label FROM
X to @Prev @Label TO
X }
X linestyle { linestyle }
X linewidth { linewidth }
X linecap { linecap }
X dashlength { dashlength }
X paint { paint }
X margin { margin }
X arrow { arrow }
X headstyle { headstyle }
X headwidth { headwidth }
X headlength { headlength }
X x
X }
X
X def @Arc
X named from { 0 ysize }
X named to { xsize 0 }
X named ctr { 0 0 }
X named direction { clockwise }
X named linestyle { linestyle }
X named linewidth { linewidth }
X named linecap { linecap }
X named dashlength { dashlength }
X named paint { paint }
X named margin { 0c }
X named arrow { noarrow }
X named headstyle { headstyle }
X named headwidth { headwidth }
X named headlength { headlength }
X right x
X {
X @Figure
X shape {
X from @Label FROM
X to @Label TO
X ctr @Label CTR
X FROM [ CTR
X direction @Case { {clockwise anticlockwise} @Yield direction }
X ] TO
X }
X linestyle { linestyle }
X linewidth { linewidth }
X linecap { linecap }
X dashlength { dashlength }
X paint { paint }
X margin { margin }
X arrow { arrow }
X headstyle { headstyle }
X headwidth { headwidth }
X headlength { headlength }
X x
X }
X
X { "grestore save gsave" maxlabels "dict begin lfigdict begin"
X // "end end restore"
X } @Graphic @Body
X
X@End @Fig
END_OF_FILE
if test 16471 -ne `wc -c <'lout/include/fig'`; then
echo shar: \"'lout/include/fig'\" unpacked with wrong size!
fi
# end of 'lout/include/fig'
fi
if test -f 'lout/z16.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/z16.c'\"
else
echo shar: Extracting \"'lout/z16.c'\" \(16571 characters\)
sed "s/^X//" >'lout/z16.c' <<'END_OF_FILE'
X/*@z16.c:Size Adjustment:SetNeighbours(), AdjustSize()@***********************/


X/* */
X/* LOUT: A HIGH-LEVEL LANGUAGE FOR DOCUMENT FORMATTING (VERSION 2.03) */
X/* COPYRIGHT (C) 1993 Jeffrey H. Kingston */
X/* */
X/* Jeffrey H. Kingston (je...@cs.su.oz.au) */
X/* Basser Department of Computer Science */
X/* The University of Sydney 2006 */
X/* AUSTRALIA */
X/* */
X/* This program is free software; you can redistribute it and/or modify */
X/* it under the terms of the GNU General Public License as published by */
X/* the Free Software Foundation; either version 1, or (at your option) */
X/* any later version. */
X/* */
X/* This program is distributed in the hope that it will be useful, */
X/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
X/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
X/* GNU General Public License for more details. */
X/* */
X/* You should have received a copy of the GNU General Public License */
X/* along with this program; if not, write to the Free Software */
X/* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
X/* */

X/* FILE: z16.c */
X/* MODULE: Size Adjustment */
X/* EXTERNS: SetNeighbours(), AdjustSize() */


X/* */
X/*****************************************************************************/
X#include "externs"
X
X
X/*****************************************************************************/
X/* */

X/* SetNeighbours(link, ratm, pg, pdef, sg, sdef, side) */
X/* */
X/* This is a utility routine used by CatConstrained(), AdjustSize(), */
X/* BreakTable() and FlushGalley() for calculating size updates in objects. */
X/* Assuming that link is the link of a component of a VCAT etc., and that */
X/* ratm is TRUE if there is a marked component to the right of link, set */
X/* */
X/* pg to the gap separating link from the first definite object */
X/* to the left, or nil if none. If pg != nil, set pdef to */
X/* the preceding definite object; else pdef is undefined. */
X/* */
X/* sg to the gap separating link from the first definite object */
X/* to the right, or nil if none. if sg != nil, set sdef to */
X/* the succeeding definite object; else sdef is undefined. */
X/* */
X/* side to the side of the mark link is on; either BACK, ON or FWD. */
X/* */
X/*****************************************************************************/
X
XSetNeighbours(link, ratm, pg, pdef, sg, sdef, side)
XOBJECT link; BOOLEAN ratm;
XOBJECT *pg, *pdef, *sg, *sdef; int *side;
X{ OBJECT plink, slink;
X
X /* find preceding definite; if it exists, set *pg */
X *pg = nil;
X for( plink = PrevDown(link); type(plink) == LINK; plink = PrevDown(plink) )
X { Child(*pdef, plink);
X if( type(*pdef) == SPLIT ? SplitIsDefinite(*pdef) : is_definite(type(*pdef)) )
X { Child(*pg, PrevDown(link));
X while( is_index(type(*pg)) )
X { link = PrevDown(link);
X Child(*pg, PrevDown(link));
X }
X assert( type(*pg) == GAP_OBJ, "SetNeighbours: type(*pg)!" );
X break;
X }
X }
X
X /* find succeeding definite; if it exists, set *sg */
X *sg = nil;
X for( slink = NextDown(link); type(slink) == LINK; slink = NextDown(slink) )
X { Child(*sdef, slink);
X if( type(*sdef) == SPLIT ? SplitIsDefinite(*sdef) : is_definite(type(*sdef)) )
X { Child(*sg, PrevDown(slink));
X while( is_index(type(*sg)) )
X { slink = PrevDown(slink);
X Child(*sg, PrevDown(slink));
X }
X assert( type(*sg) == GAP_OBJ, "SetNeighbours: type(*sg)!" );
X break;
X }
X }
X
X *side = ratm ? BACK : *pg == nil || mark(gap(*pg)) ? ON : FWD;
X debug4(DSA,DD, "SetNeighbours: ratm == %s, pg %s nil, sg %s nil, side == %s",
X bool(ratm), *pg == nil ? "==" : "!=", *sg == nil ? "==" : "!=",
X *side == BACK ? "BACK" : *side == ON ? "ON" : "FWD");
X} /* end SetNeighbours */


X
X
X/*@@**************************************************************************/
X/* */

X/* static CatAdjustSize(x, b, f, ratm, y, dim) */
X/* */
X/* Adjust the size of x to be *b, *f. Object x is known to lie in add-set */
X/* y; ratm is TRUE iff there is a mark to the right of x. Return the */
X/* new size of y in *b, *f. */
X/* */
X/*****************************************************************************/
X
Xstatic CatAdjustSize(x, b, f, ratm, y, dim)
XOBJECT x; LENGTH *b, *f; BOOLEAN ratm; OBJECT y; int dim;
X{ OBJECT link;
X OBJECT pg, prec_def, sg, sd;
X LENGTH beffect, feffect, seffect; int side;
X int bb, ff;
X
X debug6(DSA, D, "CatAdjustSize(%s x, %s, %s, %s, %s y, %s)", Image(type(x)),
X EchoLength(*b), EchoLength(*f), bool(ratm), Image(type(y)), dimen(dim));
X debug2(DSA,DD, "x(%s,%s) =", EchoLength(back(x,dim)), EchoLength(fwd(x,dim)));
X ifdebug(DSA, DD, EchoObject(stderr, x));
X debug2(DSA,DD, "y(%s,%s) =", EchoLength(back(y,dim)), EchoLength(fwd(y,dim)));
X ifdebug(DSA, DD, EchoObject(stderr, y));
X
X /* DO_ADJUST ACAT is a special case because adjustment affects its size */
X if( dim==COL && type(y)==ACAT && display_style(save_style(y)) == DO_ADJUST )
X { back(x, dim) = *b; fwd(x, dim) = *f;
X *b = back(y, dim); *f = fwd(y, dim);
X debug2(DSA, D, "CatAdjustSize ACAT %s,%s", EchoLength(*b), EchoLength(*f));
X return;
X }
X


X link = UpDim(x, dim);

X SetNeighbours(link, ratm, &pg, &prec_def, &sg, &sd, &side);

X { ifdebug(DSA, D,
X if( pg != nil && mode(gap(pg)) == NO_MODE )
X { debug1(DSA, D, "NO_MODE gap pg, is_indefinite(x) == %s, y =",
X bool(is_indefinite(type(x))) );
X ifdebug(DSA, D, EchoObject(stderr, y));
X }
X if( sg != nil && mode(gap(sg)) == NO_MODE )
X { debug1(DSA, D, "NO_MODE gap sg, is_indefinite(x) == %s, y =",
X bool(is_indefinite(type(x))) );
X ifdebug(DSA, D, EchoObject(stderr, y));
X }
X ); }


X if( is_indefinite(type(x)) )
X {

X beffect = pg == nil ? *b :
X MinGap(fwd(prec_def, dim), *b, *f, &gap(pg));
X
X feffect = sg == nil ? *f :
X MinGap(*f, back(sd, dim), fwd(sd, dim), &gap(sg));
X
X seffect = pg == nil ? sg == nil ? 0 : back(sd, dim) :


X sg == nil ? fwd(prec_def, dim) :
X MinGap(fwd(prec_def, dim), back(sd,dim), fwd(sd,dim), &gap(sg));
X }

X else /* !is_indefinite(type(x)) */
X {
X beffect = pg == nil ? *b - back(x, dim) :
X MinGap(fwd(prec_def, dim), *b, *f, &gap(pg)) -
X MinGap(fwd(prec_def, dim), back(x, dim), fwd(x, dim), &gap(pg));
X
X feffect = sg == nil ? *f - fwd(x, dim) :
X MinGap(*f, back(sd, dim), fwd(sd, dim), &gap(sg)) -
X MinGap(fwd(x, dim), back(sd, dim), fwd(sd, dim), &gap(sg));
X
X seffect = 0;
X }
X
X back(x, dim) = *b; fwd(x, dim) = *f;
X switch( side )
X {
X case BACK: bb = back(y, dim) + beffect + feffect - seffect;
X ff = fwd(y, dim);
X break;
X
X case ON: bb = back(y, dim) + beffect - seffect;
X ff = fwd(y, dim) + feffect;
X break;
X
X case FWD: bb = back(y, dim);
X ff = fwd(y, dim) + beffect + feffect - seffect;
X break;
X }
X if( bb > MAX_LEN || ff > MAX_LEN )
X { debug2(DSA, D, "bb = %s, ff = %s, y =", EchoLength(bb), EchoLength(ff));
X ifdebug(DSA, D, EchoObject(stderr, y));
X debug0(DSA, D, "x was");
X ifdebug(DSA, D, EchoObject(stderr, x));
X Error(FATAL,&fpos(y),"maximum size (%s) exceeded", EchoLength(MAX_LEN));
X }
X *b = bb; *f = ff;
X debug2(DSA, D, "CatAdjustSize returning %s,%s", EchoLength(*b), EchoLength(*f));
X} /* end CatAdjustSize */


X
X
X/*@@**************************************************************************/
X/* */

X/* AdjustSize(x, b, f, dim) */
X/* */
X/* Adjust the size of object x, in dimension dim, to be b, f. If x is a */
X/* CLOSURE, the adjustment is from a CLOSURE to a definite object of size */
X/* b, f. */
X/* */
X/*****************************************************************************/
X
XAdjustSize(x, b, f, dim)
XOBJECT x; LENGTH b, f; int dim;
X{ OBJECT y, link, tlink, lp, rp, z, index;
X BOOLEAN ratm; LENGTH tb, tf, cby, cfy, rby, rfy;
X
X debug6(DSA, D, "[ AdjustSize( %s(%s,%s), %s, %s, %s ), x =",
X Image(type(x)), EchoLength(back(x, dim)), EchoLength(fwd(x, dim)),
X EchoLength(b), EchoLength(f), dimen(dim));
X ifdebug(DSA, DD, EchoObject(stderr, x) );
X
X while( b != back(x, dim) || f != fwd(x, dim) || is_indefinite(type(x)) )
X { assert( Up(x) != x, "AdjustSize: Up(x) == x!" );
X assert( b >= 0, "AdjustSize: b < 0!" );
X assert( f >= 0, "AdjustSize: f < 0!" );
X
X /* these cases are unique because they have multiple parents */
X if( type(x) == COL_THR || type(x) == ROW_THR )
X { assert( (type(x)==COL_THR) == (dim==COL), "AdjustSize: COL_THR!" );
X back(x, dim) = b; fwd(x, dim) = f;
X for( link = Up(x); link != x; link = NextUp(link) )
X { Parent(y, link);
X assert( type(y) == SPLIT, "AdjustSize: type(y) != SPLIT!") ;
X AdjustSize(y, b, f, dim);
X }
X debug0(DSA, D, "[ AdjustSize (thread case) returning.");
X return;
X }
X


X link = UpDim(x, dim); ratm = FALSE;
X for( tlink=NextDown(link); type(tlink) == LINK; tlink=NextDown(tlink) )

X { Child(y, tlink);
X if( type(y) == GAP_OBJ && mark(gap(y)) ) ratm = TRUE;
X }
X y = tlink;
X
X debug5(DSA, DD, " b = %s, f = %s, y = %s(%s,%s), x =",
X EchoLength(b), EchoLength(f), Image(type(y)),
X EchoLength(back(y, dim)), EchoLength(fwd(y, dim)));
X ifdebug(DSA, DD, EchoObject(stderr, x) );
X
X switch( type(y) )
X {
X


X case HEAD:
X
X if( dim == ROW )

X { back(x, dim) = b, fwd(x, dim) = f;
X debug0(DSA, D, "] AdjustSize ROW returning at HEAD");
X return;
X }
X else
X {
X /* let lp and rp be the gaps delimiting the */
X /* components joined to x */


X for( lp = PrevDown(link); lp != y; lp = PrevDown(lp) )
X { Child(z, lp);
X if( type(z) == GAP_OBJ && !join(gap(z)) ) break;
X }
X for( rp = NextDown(link); rp != y; rp = NextDown(rp) )
X { Child(z, rp);
X if( type(z) == GAP_OBJ && !join(gap(z)) ) break;
X }

X
X back(x, dim) = b; fwd(x, dim) = f;
X if( lp == y && rp == y && !seen_nojoin(y) )


X {
X /* if whole object is joined, do this */

X b = max(b, back(y, dim));
X f = max(f, fwd(y, dim));
X }
X else
X {

X /* if // or || is present, do this */

X tb = tf = 0;
X for( link = NextDown(lp); link != rp; link = NextDown(link) )


X { Child(z, link);
X if( type(z) == GAP_OBJ || is_index(type(z)) ) continue;

X tb = max(tb, back(z, dim));
X tf = max(tf, fwd(z, dim));
X }
X b = 0; f = max(tb + tf, fwd(y, dim));
X }
X if( back(y, dim) == b && fwd(y, dim) == f )
X {
X debug0(DSA, D, "] AdjustSize (COL) returning at HEAD (no wider)");
X return;
X }
X debug3(DGF, D, "AdjustSize widening %s to %s,%s",
X SymName(actual(y)), EchoLength(b), EchoLength(f));
X back(y, dim) = b; fwd(y, dim) = f;
X if( Up(y) == y )
X {
X debug0(DSA, D, "] AdjustSize ret. at HEAD (no parent)" );
X return;
X }
X Parent(index, Up(y));
X if( type(index) != RECEIVING )
X {
X debug1(DSA,D, "] AdjustSize ret. at HEAD (%s)", Image(type(index)));
X return;
X }
X assert( actual(index) != nil, "AdjustSize: actual(index) == nil!" );
X assert( type(actual(index)) == CLOSURE, "AdjustSize: index non-C!" );
X if( actual(actual(index)) != GalleySym )
X {
X debug0(DSA, D, "] AdjustSize ret. at HEAD (not @Galley, so root)" );
X return;
X }
X y = actual(index);


X }
X break;
X
X
X case SPLIT:

X case HCONTRACT:
X case VCONTRACT:
X case HEXPAND:
X case VEXPAND:
X case PADJUST:
X case HADJUST:
X case VADJUST:

X case ONE_COL:
X case ONE_ROW:

X case GRAPHIC:
X
X back(x, dim) = b; fwd(x, dim) = f;


X break;
X
X
X case HSCALE:
X case VSCALE:
X

X back(x, dim) = b; fwd(x, dim) = f;
X if( (dim==COL) == (type(y)==HSCALE) )
X { debug0(DSA, D, "] AdjustSize returning at HSCALE or VSCALE");
X return;
X }


X break;
X
X
X case SCALE:
X

X back(x, dim) = b; fwd(x, dim) = f;


X if( dim == COL )

X { b *= bc(constraint(y)) / SF;
X f *= bc(constraint(y)) / SF;
X }
X else
X { b *= fc(constraint(y)) / SF;
X f *= fc(constraint(y)) / SF;


X }
X break;
X
X

X case ROTATE:
X
X back(x, dim) = b; fwd(x, dim) = f;
X RotateSize(&cby, &cfy, &rby, &rfy, x, sparec(constraint(y)));
X if( cby != back(y, COL) || cfy != fwd(y, COL) )
X AdjustSize(y, cby, cfy, COL);
X if( rby != back(y, ROW) || rfy != fwd(y, ROW) )
X AdjustSize(y, rby, rfy, ROW);
X debug1(DSA, D, "] AdjustSize returning at %s.", Image(type(y)));
X return;
X
X


X case WIDE:
X case HIGH:
X

X if( (type(y) == WIDE) == (dim == COL) )
X { if( !FitsConstraint(b, f, constraint(y)) )
X { Error(WARN, &fpos(y), "size constraint %s,%s,%s broken by %s,%s",
X EchoLength(bc(constraint(y))), EchoLength(bfc(constraint(y))),
X EchoLength(fc(constraint(y))), EchoLength(b), EchoLength(f));
X SetConstraint(constraint(y), MAX_LEN, b+f, MAX_LEN);
X }
X back(x, dim) = b; fwd(x, dim) = f;
X EnlargeToConstraint(&b, &f, &constraint(y));


X }
X else
X { back(x, dim) = b;
X fwd(x, dim) = f;
X }

X break;
X
X
X case COL_THR:
X case ROW_THR:
X

X assert( (type(y)==COL_THR) == (dim==COL), "AdjustSize: COL_THR!" );
X back(x, dim) = b; fwd(x, dim) = f;
X b = max(b, back(y, dim));


X f = max(f, fwd(y, dim));

X break;
X
X
X case VCAT:
X case HCAT:
X case ACAT:
X

X if( (type(y) == VCAT) == (dim == ROW) )
X CatAdjustSize(x, &b, &f, ratm, y, dim);
X else
X {
X /* let lp and rp be the gaps bracketing the components joined to x */


X for( lp = PrevDown(link); lp != y; lp = PrevDown(lp) )
X { Child(z, lp);
X if( type(z) == GAP_OBJ && !join(gap(z)) ) break;
X }
X for( rp = NextDown(link); rp != y; rp = NextDown(rp) )
X { Child(z, rp);
X if( type(z) == GAP_OBJ && !join(gap(z)) ) break;
X }

X
X back(x, dim) = b; fwd(x, dim) = f;
X if( lp == y && rp == y )


X {
X /* if whole object is joined, do this */

X b = max(b, back(y, dim));
X f = max(f, fwd(y, dim));
X }
X else

X { /* if // or || is present, do this */
X tb = tf = 0;
X for( link = NextDown(lp); link != rp; link = NextDown(link) )


X { Child(z, link);
X if( type(z) == GAP_OBJ || is_index(type(z)) ) continue;

X tb = max(tb, back(z, dim));
X tf = max(tf, fwd(z, dim));
X }
X b = 0; f = max(tb + tf, fwd(y, dim));
X }


X }
X break;
X
X

X case WORD:
X case CLOSURE:


X case NULL_CLOS:
X case CROSS:

X default:
X
X Error(INTERN, &fpos(y), "AdjustSize: %s", Image(type(y)));
X break;


X
X } /* end switch */

X x = y;


X } /* end while */

X debug0(DSA, D, "] AdjustSize returning.");
X} /* end AdjustSize */
END_OF_FILE
if test 16571 -ne `wc -c <'lout/z16.c'`; then
echo shar: \"'lout/z16.c'\" unpacked with wrong size!
fi
# end of 'lout/z16.c'
fi
echo shar: End of archive 14 \(of 30\).
cp /dev/null ark14isdone

Jeff Kingston

unread,
Jun 1, 1993, 1:20:20 AM6/1/93
to
Submitted-by: je...@joyce.cs.su.oz.au (Jeff Kingston)
Posting-number: Volume 37, Issue 113
Archive-name: lout/part15
Environment: UNIX

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: lout/doc/tr.lout/ch3.18 lout/font0/HelveConBol.AFM
# lout/font0/HelveConBolObl.AFM lout/font0/NewCenSchIta.AFM
# lout/font0/PalatBolIta.AFM lout/font0/TimesBol.AFM
# Wrapped by kent@sparky on Sun May 30 19:43:57 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 15 (of 30)."'
if test -f 'lout/doc/tr.lout/ch3.18' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch3.18'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch3.18'\" \(248 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch3.18' <<'END_OF_FILE'
X@Section
X @Title { "@Galley" }
X @Tag { galley }
X@Begin
X@PP
XThis symbol
Xgalley.sym @Index { @@Galley symbol }
Xis a placeholder for a galley. That is, it may be replaced
Xby components of a galley (see Section {@NumberOf targets}).
X@End @Section
END_OF_FILE
if test 248 -ne `wc -c <'lout/doc/tr.lout/ch3.18'`; then
echo shar: \"'lout/doc/tr.lout/ch3.18'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch3.18'
fi
if test -f 'lout/font0/HelveConBol.AFM' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/font0/HelveConBol.AFM'\"
else
echo shar: Extracting \"'lout/font0/HelveConBol.AFM'\" \(15576 characters\)
sed "s/^X//" >'lout/font0/HelveConBol.AFM' <<'END_OF_FILE'
XStartFontMetrics 2.0


XComment Copyright (c) 1985, 1987 Adobe Systems Incorporated. All rights reserved.

XComment Creation Date:Thu Aug 13 15:58:23 PDT 1987
XFontName Helvetica-Condensed-Bold
XEncodingScheme AdobeStandardEncoding
XFullName Helvetica Condensed Bold
XFamilyName Helvetica
XWeight BoldCondensed
XItalicAngle 0.0
XIsFixedPitch false
XUnderlinePosition -90
XUnderlineThickness 58
XVersion 001.002
XNotice Copyright (c) 1985, 1987 Adobe Systems Incorporated. All rights reserved. Helvetica is a trademark of Allied Corporation.
XFontBBox -169 -228 1091 971
XCapHeight 750
XXHeight 564
XDescender -189
XAscender 750
XStartCharMetrics 228
XC 32 ; WX 250 ; N space ; B 0 0 0 0 ;
XC 33 ; WX 333 ; N exclam ; B 101 0 232 750 ;
XC 34 ; WX 333 ; N quotedbl ; B 16 468 318 739 ;
XC 35 ; WX 500 ; N numbersign ; B 31 0 469 738 ;
XC 36 ; WX 500 ; N dollar ; B 34 -124 465 803 ;
XC 37 ; WX 833 ; N percent ; B 31 -15 803 750 ;
XC 38 ; WX 667 ; N ampersand ; B 63 -18 615 768 ;
XC 39 ; WX 278 ; N quoteright ; B 81 479 202 750 ;
XC 40 ; WX 333 ; N parenleft ; B 52 -198 281 768 ;
XC 41 ; WX 333 ; N parenright ; B 52 -198 281 768 ;
XC 42 ; WX 500 ; N asterisk ; B 79 412 422 738 ;
XC 43 ; WX 500 ; N plus ; B 26 0 475 492 ;
XC 44 ; WX 333 ; N comma ; B 101 -145 233 132 ;
XC 45 ; WX 333 ; N hyphen ; B 48 255 286 370 ;
XC 46 ; WX 333 ; N period ; B 101 0 233 132 ;
XC 47 ; WX 278 ; N slash ; B -11 -94 312 750 ;
XC 48 ; WX 500 ; N zero ; B 48 -15 453 753 ;
XC 49 ; WX 500 ; N one ; B 44 0 353 750 ;
XC 50 ; WX 500 ; N two ; B 32 0 453 753 ;
XC 51 ; WX 500 ; N three ; B 28 -15 453 753 ;
XC 52 ; WX 500 ; N four ; B 23 0 470 738 ;
XC 53 ; WX 500 ; N five ; B 37 -15 458 738 ;
XC 54 ; WX 500 ; N six ; B 42 -15 459 753 ;
XC 55 ; WX 500 ; N seven ; B 32 0 454 738 ;
XC 56 ; WX 500 ; N eight ; B 41 -15 460 753 ;
XC 57 ; WX 500 ; N nine ; B 42 -15 459 753 ;
XC 58 ; WX 278 ; N colon ; B 73 0 205 556 ;
XC 59 ; WX 278 ; N semicolon ; B 73 -145 205 556 ;
XC 60 ; WX 500 ; N less ; B 42 -24 459 527 ;
XC 61 ; WX 500 ; N equal ; B 26 96 475 401 ;
XC 62 ; WX 500 ; N greater ; B 42 -24 459 527 ;
XC 63 ; WX 500 ; N question ; B 51 0 440 768 ;
XC 64 ; WX 833 ; N at ; B 38 -18 795 768 ;
XC 65 ; WX 556 ; N A ; B 9 0 547 750 ;
XC 66 ; WX 556 ; N B ; B 65 0 506 750 ;
XC 67 ; WX 556 ; N C ; B 55 -18 512 768 ;
XC 68 ; WX 611 ; N D ; B 72 0 550 750 ;
XC 69 ; WX 500 ; N E ; B 64 0 458 750 ;
XC 70 ; WX 500 ; N F ; B 73 0 470 750 ;
XC 71 ; WX 611 ; N G ; B 55 -18 542 768 ;
XC 72 ; WX 611 ; N H ; B 68 0 544 750 ;
XC 73 ; WX 278 ; N I ; B 69 0 209 750 ;
XC 74 ; WX 444 ; N J ; B 7 -18 384 750 ;
XC 75 ; WX 556 ; N K ; B 68 0 547 750 ;
XC 76 ; WX 500 ; N L ; B 68 0 468 750 ;
XC 77 ; WX 778 ; N M ; B 67 0 712 750 ;
XC 78 ; WX 611 ; N N ; B 68 0 543 750 ;
XC 79 ; WX 611 ; N O ; B 61 -18 551 768 ;
XC 80 ; WX 556 ; N P ; B 68 0 529 750 ;
XC 81 ; WX 611 ; N Q ; B 61 -71 587 768 ;
XC 82 ; WX 611 ; N R ; B 66 0 567 750 ;
XC 83 ; WX 556 ; N S ; B 49 -18 508 768 ;
XC 84 ; WX 500 ; N T ; B 17 0 484 750 ;
XC 85 ; WX 611 ; N U ; B 68 -18 544 750 ;
XC 86 ; WX 556 ; N V ; B 21 0 536 750 ;
XC 87 ; WX 833 ; N W ; B 24 0 810 750 ;
XC 88 ; WX 556 ; N X ; B 11 0 545 750 ;
XC 89 ; WX 556 ; N Y ; B 12 0 545 750 ;
XC 90 ; WX 500 ; N Z ; B 33 0 468 750 ;
XC 91 ; WX 333 ; N bracketleft ; B 81 -94 280 750 ;
XC 92 ; WX 250 ; N backslash ; B -89 0 340 750 ;
XC 93 ; WX 333 ; N bracketright ; B 53 -94 252 750 ;
XC 94 ; WX 500 ; N asciicircum ; B 10 326 490 750 ;
XC 95 ; WX 500 ; N underscore ; B 0 -119 500 -61 ;
XC 96 ; WX 278 ; N quoteleft ; B 76 495 197 766 ;
XC 97 ; WX 500 ; N a ; B 42 -15 440 579 ;
XC 98 ; WX 500 ; N b ; B 64 -15 444 750 ;
XC 99 ; WX 444 ; N c ; B 48 -15 402 579 ;
XC 100 ; WX 500 ; N d ; B 53 -15 433 750 ;
XC 101 ; WX 500 ; N e ; B 52 -15 442 579 ;
XC 102 ; WX 278 ; N f ; B 21 0 257 750 ; L i fi ; L l fl ;
XC 103 ; WX 500 ; N g ; B 53 -190 433 579 ;
XC 104 ; WX 500 ; N h ; B 61 0 440 750 ;
XC 105 ; WX 278 ; N i ; B 74 0 204 750 ;
XC 106 ; WX 278 ; N j ; B 31 -192 210 750 ;
XC 107 ; WX 444 ; N k ; B 48 0 443 750 ;
XC 108 ; WX 278 ; N l ; B 74 0 204 750 ;
XC 109 ; WX 778 ; N m ; B 66 0 712 579 ;
XC 110 ; WX 500 ; N n ; B 61 0 440 579 ;
XC 111 ; WX 500 ; N o ; B 53 -15 447 579 ;
XC 112 ; WX 500 ; N p ; B 58 -189 438 579 ;
XC 113 ; WX 500 ; N q ; B 50 -188 430 579 ;
XC 114 ; WX 333 ; N r ; B 60 0 319 574 ;
XC 115 ; WX 444 ; N s ; B 27 -15 406 579 ;
XC 116 ; WX 278 ; N t ; B 14 -7 252 719 ;
XC 117 ; WX 500 ; N u ; B 58 -15 431 564 ;
XC 118 ; WX 444 ; N v ; B 10 0 434 564 ;
XC 119 ; WX 667 ; N w ; B 11 0 645 564 ;
XC 120 ; WX 444 ; N x ; B 8 0 436 564 ;
XC 121 ; WX 444 ; N y ; B 5 -195 429 564 ;
XC 122 ; WX 389 ; N z ; B 23 0 367 564 ;
XC 123 ; WX 274 ; N braceleft ; B -32 -92 240 750 ;
XC 124 ; WX 250 ; N bar ; B 75 0 175 750 ;
XC 125 ; WX 274 ; N braceright ; B 34 -94 306 750 ;
XC 126 ; WX 500 ; N asciitilde ; B 26 153 475 359 ;
XC 161 ; WX 333 ; N exclamdown ; B 101 -170 232 579 ;
XC 162 ; WX 500 ; N cent ; B 72 -122 428 671 ;
XC 163 ; WX 500 ; N sterling ; B 35 -15 487 768 ;
XC 164 ; WX 167 ; N fraction ; B -169 0 331 738 ;
XC 165 ; WX 500 ; N yen ; B -18 0 518 750 ;
XC 166 ; WX 500 ; N florin ; B 9 -185 492 763 ;
XC 167 ; WX 500 ; N section ; B 37 -183 463 768 ;
XC 168 ; WX 500 ; N currency ; B 9 58 492 560 ;
XC 169 ; WX 250 ; N quotesingle ; B 66 468 185 739 ;
XC 170 ; WX 500 ; N quotedblleft ; B 87 495 405 766 ;
XC 171 ; WX 500 ; N guillemotleft ; B 74 62 419 447 ;
XC 172 ; WX 278 ; N guilsinglleft ; B 58 62 215 447 ;
XC 173 ; WX 278 ; N guilsinglright ; B 63 62 220 447 ;
XC 174 ; WX 500 ; N fi ; B 10 0 446 750 ;
XC 175 ; WX 500 ; N fl ; B 10 0 443 750 ;
XC 177 ; WX 500 ; N endash ; B 0 259 500 369 ;
XC 178 ; WX 500 ; N dagger ; B 37 -155 463 768 ;
XC 179 ; WX 500 ; N daggerdbl ; B 35 -161 466 768 ;
XC 180 ; WX 333 ; N periodcentered ; B 101 183 233 315 ;
XC 182 ; WX 550 ; N paragraph ; B 23 -116 526 750 ;
XC 183 ; WX 420 ; N bullet ; B 22 186 398 562 ;
XC 184 ; WX 278 ; N quotesinglbase ; B 87 -138 207 132 ;
XC 185 ; WX 500 ; N quotedblbase ; B 96 -138 413 132 ;
XC 186 ; WX 500 ; N quotedblright ; B 95 479 413 750 ;
XC 187 ; WX 500 ; N guillemotright ; B 81 62 426 447 ;
XC 188 ; WX 1000 ; N ellipsis ; B 101 0 899 132 ;
XC 189 ; WX 1111 ; N perthousand ; B 21 -18 1091 748 ;
XC 191 ; WX 500 ; N questiondown ; B 60 -190 449 579 ;
XC 193 ; WX 333 ; N grave ; B 1 629 250 775 ;
XC 194 ; WX 333 ; N acute ; B 83 629 332 775 ;
XC 195 ; WX 333 ; N circumflex ; B -10 644 343 790 ;
XC 196 ; WX 333 ; N tilde ; B -16 636 350 764 ;
XC 197 ; WX 333 ; N macron ; B -6 666 340 740 ;
XC 198 ; WX 333 ; N breve ; B -1 635 335 780 ;
XC 199 ; WX 333 ; N dotaccent ; B 103 644 230 759 ;
XC 200 ; WX 333 ; N dieresis ; B 5 644 328 759 ;
XC 202 ; WX 333 ; N ring ; B 60 632 273 845 ;
XC 203 ; WX 333 ; N cedilla ; B 39 -228 275 0 ;
XC 205 ; WX 333 ; N hungarumlaut ; B -17 634 447 780 ;
XC 206 ; WX 333 ; N ogonek ; B 88 -205 278 0 ;
XC 207 ; WX 333 ; N caron ; B -10 634 343 780 ;
XC 208 ; WX 1000 ; N emdash ; B 0 259 1000 369 ;
XC 225 ; WX 778 ; N AE ; B -22 0 750 750 ;
XC 227 ; WX 300 ; N ordfeminine ; B 20 291 281 768 ;
XC 232 ; WX 500 ; N Lslash ; B 0 0 474 750 ;
XC 233 ; WX 611 ; N Oslash ; B 36 -38 578 779 ;
XC 234 ; WX 833 ; N OE ; B 60 -18 791 768 ;
XC 235 ; WX 300 ; N ordmasculine ; B 22 291 278 768 ;
XC 241 ; WX 722 ; N ae ; B 44 -15 672 579 ;
XC 245 ; WX 278 ; N dotlessi ; B 74 0 204 564 ;
XC 248 ; WX 278 ; N lslash ; B 2 0 272 750 ;
XC 249 ; WX 500 ; N oslash ; B 7 -58 492 617 ;
XC 250 ; WX 722 ; N oe ; B 46 -15 678 579 ;
XC 251 ; WX 500 ; N germandbls ; B 60 -15 445 768 ;
XC -1 ; WX 556 ; N Aacute ; B 9 0 547 961 ;
XC -1 ; WX 556 ; N Acircumflex ; B 9 0 547 956 ;
XC -1 ; WX 556 ; N Adieresis ; B 9 0 547 945 ;
XC -1 ; WX 556 ; N Agrave ; B 9 0 547 961 ;
XC -1 ; WX 556 ; N Aring ; B 9 0 547 971 ;
XC -1 ; WX 556 ; N Atilde ; B 9 0 547 930 ;
XC -1 ; WX 556 ; N Ccedilla ; B 55 -228 512 768 ;
XC -1 ; WX 500 ; N Eacute ; B 64 0 458 961 ;
XC -1 ; WX 500 ; N Ecircumflex ; B 64 0 458 956 ;
XC -1 ; WX 500 ; N Edieresis ; B 64 0 458 945 ;
XC -1 ; WX 500 ; N Egrave ; B 64 0 458 961 ;
XC -1 ; WX 611 ; N Eth ; B -6 0 550 750 ;
XC -1 ; WX 278 ; N Iacute ; B 56 0 305 961 ;
XC -1 ; WX 278 ; N Icircumflex ; B -37 0 316 956 ;
XC -1 ; WX 278 ; N Idieresis ; B -22 0 301 945 ;
XC -1 ; WX 278 ; N Igrave ; B -26 0 223 961 ;
XC -1 ; WX 611 ; N Ntilde ; B 68 0 543 930 ;
XC -1 ; WX 611 ; N Oacute ; B 61 -18 551 961 ;
XC -1 ; WX 611 ; N Ocircumflex ; B 61 -18 551 956 ;
XC -1 ; WX 611 ; N Odieresis ; B 61 -18 551 945 ;
XC -1 ; WX 611 ; N Ograve ; B 61 -18 551 961 ;
XC -1 ; WX 611 ; N Otilde ; B 61 -18 551 930 ;
XC -1 ; WX 556 ; N Scaron ; B 49 -18 508 946 ;
XC -1 ; WX 556 ; N Thorn ; B 68 0 529 750 ;
XC -1 ; WX 611 ; N Uacute ; B 68 -18 544 961 ;
XC -1 ; WX 611 ; N Ucircumflex ; B 68 -18 544 956 ;
XC -1 ; WX 611 ; N Udieresis ; B 68 -18 544 945 ;
XC -1 ; WX 611 ; N Ugrave ; B 68 -18 544 961 ;
XC -1 ; WX 556 ; N Yacute ; B 12 0 545 961 ;
XC -1 ; WX 556 ; N Ydieresis ; B 12 0 545 945 ;
XC -1 ; WX 500 ; N Zcaron ; B 33 0 468 946 ;
XC -1 ; WX 500 ; N aacute ; B 42 -15 440 775 ;
XC -1 ; WX 500 ; N acircumflex ; B 42 -15 440 770 ;
XC -1 ; WX 500 ; N adieresis ; B 42 -15 440 759 ;
XC -1 ; WX 500 ; N agrave ; B 42 -15 440 775 ;
XC -1 ; WX 500 ; N aring ; B 42 -15 440 845 ;
XC -1 ; WX 500 ; N atilde ; B 42 -15 440 744 ;
XC -1 ; WX 250 ; N brokenbar ; B 75 0 175 750 ;
XC -1 ; WX 444 ; N ccedilla ; B 48 -228 402 579 ;
XC -1 ; WX 830 ; N copyright ; B 22 -18 808 768 ;
XC -1 ; WX 400 ; N degree ; B 50 450 350 750 ;
XC -1 ; WX 500 ; N divide ; B 26 6 475 492 ;
XC -1 ; WX 500 ; N eacute ; B 52 -15 442 775 ;
XC -1 ; WX 500 ; N ecircumflex ; B 52 -15 442 770 ;
XC -1 ; WX 500 ; N edieresis ; B 52 -15 442 759 ;
XC -1 ; WX 500 ; N egrave ; B 52 -15 442 775 ;
XC -1 ; WX 500 ; N eth ; B 46 -15 443 777 ;
XC -1 ; WX 278 ; N iacute ; B 56 0 305 775 ;
XC -1 ; WX 278 ; N icircumflex ; B -47 0 306 770 ;
XC -1 ; WX 278 ; N idieresis ; B -22 0 301 759 ;
XC -1 ; WX 278 ; N igrave ; B -26 0 223 775 ;
XC -1 ; WX 500 ; N logicalnot ; B 26 105 475 401 ;
XC -1 ; WX 500 ; N minus ; B 26 194 475 304 ;
XC -1 ; WX 500 ; N mu ; B 58 -189 431 564 ;
XC -1 ; WX 500 ; N multiply ; B 26 22 475 476 ;
XC -1 ; WX 500 ; N ntilde ; B 61 0 440 744 ;
XC -1 ; WX 500 ; N oacute ; B 53 -15 447 775 ;
XC -1 ; WX 500 ; N ocircumflex ; B 53 -15 447 770 ;
XC -1 ; WX 500 ; N odieresis ; B 53 -15 447 759 ;
XC -1 ; WX 500 ; N ograve ; B 53 -15 447 775 ;
XC -1 ; WX 750 ; N onehalf ; B 12 0 739 750 ;
XC -1 ; WX 750 ; N onequarter ; B 20 0 729 750 ;
XC -1 ; WX 300 ; N onesuperior ; B 50 300 251 750 ;
XC -1 ; WX 500 ; N otilde ; B 53 -15 447 744 ;
XC -1 ; WX 500 ; N plusminus ; B 26 -15 475 513 ;
XC -1 ; WX 830 ; N registered ; B 22 -18 808 768 ;
XC -1 ; WX 444 ; N scaron ; B 27 -15 406 760 ;
XC -1 ; WX 500 ; N thorn ; B 58 -189 438 750 ;
XC -1 ; WX 750 ; N threequarters ; B 12 0 739 750 ;
XC -1 ; WX 300 ; N threesuperior ; B 12 290 288 750 ;
XC -1 ; WX 860 ; N trademark ; B 1 346 774 750 ;
XC -1 ; WX 300 ; N twosuperior ; B 13 300 287 752 ;
XC -1 ; WX 500 ; N uacute ; B 58 -15 431 775 ;
XC -1 ; WX 500 ; N ucircumflex ; B 58 -15 431 780 ;
XC -1 ; WX 500 ; N udieresis ; B 58 -15 431 759 ;
XC -1 ; WX 500 ; N ugrave ; B 58 -15 431 775 ;
XC -1 ; WX 444 ; N yacute ; B 5 -195 429 775 ;
XC -1 ; WX 444 ; N ydieresis ; B 5 -195 429 759 ;
XC -1 ; WX 389 ; N zcaron ; B 18 0 371 760 ;
XEndCharMetrics
XStartKernData
XStartKernPairs 115
X
XKPX A y -18
XKPX A w -18
XKPX A v -18
XKPX A quoteright -55


XKPX A Y -55
XKPX A W -37

XKPX A V -37
XKPX A T -55
X
XKPX F period -111
XKPX F comma -111
XKPX F A -37
X
XKPX L y -37
XKPX L quoteright -92
XKPX L Y -92
XKPX L W -74
XKPX L V -74
XKPX L T -74
X


XKPX P period -129
XKPX P comma -129

XKPX P A -37
X
XKPX R y 0
XKPX R Y -18
XKPX R W 0
XKPX R V 0
XKPX R T -18
X
XKPX T y -55
XKPX T w -74
XKPX T u -74
XKPX T semicolon -74
XKPX T s -74
XKPX T r -74
XKPX T period -92
XKPX T o -74
XKPX T i -18
XKPX T hyphen -55
XKPX T e -74
XKPX T comma -92
XKPX T colon -74
XKPX T c -74
XKPX T a -74
XKPX T A -55
X
XKPX V y 0
XKPX V u -18
XKPX V semicolon -18
XKPX V r -18
XKPX V period -92
XKPX V o -18
XKPX V i 0
XKPX V hyphen -18
XKPX V e -18
XKPX V comma -92
XKPX V colon -18
XKPX V a -18
XKPX V A -37
X
XKPX W y 0
XKPX W u 0
XKPX W semicolon 0
XKPX W r 0
XKPX W period -74
XKPX W o -18
XKPX W i 0
XKPX W hyphen -18
XKPX W e -18
XKPX W comma -74
XKPX W colon 0
XKPX W a -18
XKPX W A -18
X
XKPX Y v -18
XKPX Y u -37
XKPX Y semicolon -37
XKPX Y q -55
XKPX Y period -111
XKPX Y p -37
XKPX Y o -55
XKPX Y i -18
XKPX Y hyphen -74
XKPX Y e -55
XKPX Y comma -111
XKPX Y colon -37
XKPX Y a -55
XKPX Y A -55
X
XKPX f quoteright 18
XKPX f f 0


X
XKPX quoteleft quoteleft -18
X

XKPX quoteright t 0
XKPX quoteright s -55


XKPX quoteright quoteright -18
X

XKPX r z 20
XKPX r y 18
XKPX r x 20
XKPX r w 18
XKPX r v 18


XKPX r u 0
XKPX r t 0
XKPX r r 0

XKPX r quoteright 0
XKPX r q 0
XKPX r period -74
XKPX r o 0
XKPX r n 0
XKPX r m 0
XKPX r hyphen -37
XKPX r h 0
XKPX r g 0
XKPX r f 0
XKPX r e 0
XKPX r d 0
XKPX r comma -74
XKPX r c 0
X
XKPX v period -55
XKPX v comma -55


X
XKPX w period -37
XKPX w comma -37
X
XKPX y period -55
XKPX y comma -55
XEndKernPairs
XEndKernData
XStartComposites 58

XCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 83 166 ;
XCC zcaron 2 ; PCC z 0 0 ; PCC caron 28 -20 ;
XCC Scaron 2 ; PCC S 0 0 ; PCC caron 111 166 ;
XCC scaron 2 ; PCC s 0 0 ; PCC caron 45 -20 ;
XCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 111 0 ;
XCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 55 0 ;
XCC Yacute 2 ; PCC Y 0 0 ; PCC acute 111 186 ;
XCC yacute 2 ; PCC y 0 0 ; PCC acute 55 0 ;
XCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 111 186 ;
XCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 55 0 ;
XCC Uacute 2 ; PCC U 0 0 ; PCC acute 139 186 ;
XCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 139 166 ;
XCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 139 186 ;
XCC Ugrave 2 ; PCC U 0 0 ; PCC grave 139 186 ;
XCC uacute 2 ; PCC u 0 0 ; PCC acute 83 0 ;
XCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 83 -10 ;
XCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 83 0 ;
XCC ugrave 2 ; PCC u 0 0 ; PCC grave 83 0 ;
XCC Iacute 2 ; PCC I 0 0 ; PCC acute -27 186 ;
XCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex -27 166 ;
XCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis -27 186 ;
XCC Igrave 2 ; PCC I 0 0 ; PCC grave -27 186 ;
XCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -27 0 ;
XCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -37 -20 ;
XCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -27 0 ;
XCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -27 0 ;
XCC Eacute 2 ; PCC E 0 0 ; PCC acute 83 186 ;
XCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 83 166 ;
XCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 83 186 ;
XCC Egrave 2 ; PCC E 0 0 ; PCC grave 83 186 ;
XCC eacute 2 ; PCC e 0 0 ; PCC acute 83 0 ;
XCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 83 -20 ;
XCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 83 0 ;
XCC egrave 2 ; PCC e 0 0 ; PCC grave 83 0 ;
XCC Aacute 2 ; PCC A 0 0 ; PCC acute 111 186 ;
XCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 101 166 ;
XCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 111 186 ;
XCC Agrave 2 ; PCC A 0 0 ; PCC grave 111 186 ;
XCC aacute 2 ; PCC a 0 0 ; PCC acute 83 0 ;
XCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 83 -20 ;
XCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 83 0 ;
XCC agrave 2 ; PCC a 0 0 ; PCC grave 83 0 ;
XCC Oacute 2 ; PCC O 0 0 ; PCC acute 139 186 ;
XCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 139 166 ;
XCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 139 186 ;
XCC Ograve 2 ; PCC O 0 0 ; PCC grave 139 186 ;
XCC oacute 2 ; PCC o 0 0 ; PCC acute 83 0 ;
XCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 83 -20 ;
XCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 83 0 ;
XCC ograve 2 ; PCC o 0 0 ; PCC grave 83 0 ;
XCC Atilde 2 ; PCC A 0 0 ; PCC tilde 111 166 ;
XCC atilde 2 ; PCC a 0 0 ; PCC tilde 83 -20 ;
XCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 139 166 ;
XCC ntilde 2 ; PCC n 0 0 ; PCC tilde 83 -20 ;
XCC Otilde 2 ; PCC O 0 0 ; PCC tilde 139 166 ;
XCC otilde 2 ; PCC o 0 0 ; PCC tilde 83 -20 ;
XCC Aring 2 ; PCC A 0 0 ; PCC ring 111 126 ;
XCC aring 2 ; PCC a 0 0 ; PCC ring 83 0 ;
XEndComposites
XEndFontMetrics
END_OF_FILE
if test 15576 -ne `wc -c <'lout/font0/HelveConBol.AFM'`; then
echo shar: \"'lout/font0/HelveConBol.AFM'\" unpacked with wrong size!
fi
# end of 'lout/font0/HelveConBol.AFM'
fi
if test -f 'lout/font0/HelveConBolObl.AFM' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/font0/HelveConBolObl.AFM'\"
else
echo shar: Extracting \"'lout/font0/HelveConBolObl.AFM'\" \(15630 characters\)
sed "s/^X//" >'lout/font0/HelveConBolObl.AFM' <<'END_OF_FILE'
XStartFontMetrics 2.0


XComment Copyright (c) 1985, 1987 Adobe Systems Incorporated. All rights reserved.

XComment Creation Date:Thu Aug 13 17:42:03 PDT 1987
XFontName Helvetica-Condensed-BoldObl
XEncodingScheme AdobeStandardEncoding
XFullName Helvetica.Condensed Bold Oblique
XFamilyName Helvetica
XWeight BoldCondensed
XItalicAngle -12.0
XIsFixedPitch false
XUnderlinePosition -90
XUnderlineThickness 58
XVersion 001.002
XNotice Copyright (c) 1985, 1987 Adobe Systems Incorporated. All rights reserved. Helvetica is a trademark of Allied Corporation.
XFontBBox -169 -228 1141 971
XCapHeight 750
XXHeight 564
XDescender -189
XAscender 750
XStartCharMetrics 228
XC 32 ; WX 250 ; N space ; B 0 0 0 0 ;
XC 33 ; WX 333 ; N exclam ; B 102 0 390 750 ;
XC 34 ; WX 333 ; N quotedbl ; B 115 468 475 739 ;
XC 35 ; WX 500 ; N numbersign ; B 81 0 580 738 ;
XC 36 ; WX 500 ; N dollar ; B 67 -124 575 803 ;
XC 37 ; WX 833 ; N percent ; B 138 -15 853 750 ;
XC 38 ; WX 667 ; N ampersand ; B 101 -18 676 768 ;
XC 39 ; WX 278 ; N quoteright ; B 183 479 361 750 ;
XC 40 ; WX 333 ; N parenleft ; B 91 -198 442 768 ;
XC 41 ; WX 333 ; N parenright ; B 12 -198 363 768 ;
XC 42 ; WX 500 ; N asterisk ; B 203 412 546 738 ;
XC 43 ; WX 500 ; N plus ; B 67 0 540 492 ;
XC 44 ; WX 333 ; N comma ; B 70 -145 261 132 ;
XC 45 ; WX 333 ; N hyphen ; B 102 255 365 370 ;
XC 46 ; WX 333 ; N period ; B 101 0 261 132 ;
XC 47 ; WX 278 ; N slash ; B -31 -94 471 750 ;
XC 48 ; WX 500 ; N zero ; B 82 -15 576 753 ;
XC 49 ; WX 500 ; N one ; B 155 0 512 750 ;
XC 50 ; WX 500 ; N two ; B 32 0 577 753 ;
XC 51 ; WX 500 ; N three ; B 61 -15 563 753 ;
XC 52 ; WX 500 ; N four ; B 55 0 563 738 ;
XC 53 ; WX 500 ; N five ; B 72 -15 581 738 ;
XC 54 ; WX 500 ; N six ; B 83 -15 575 753 ;
XC 55 ; WX 500 ; N seven ; B 126 0 611 738 ;
XC 56 ; WX 500 ; N eight ; B 76 -15 570 753 ;
XC 57 ; WX 500 ; N nine ; B 84 -15 575 753 ;
XC 58 ; WX 278 ; N colon ; B 73 0 323 556 ;
XC 59 ; WX 278 ; N semicolon ; B 42 -145 323 556 ;
XC 60 ; WX 500 ; N less ; B 85 -24 571 527 ;
XC 61 ; WX 500 ; N equal ; B 46 96 560 401 ;
XC 62 ; WX 500 ; N greater ; B 37 -24 523 527 ;
XC 63 ; WX 500 ; N question ; B 147 0 569 768 ;
XC 64 ; WX 833 ; N at ; B 109 -18 897 768 ;
XC 65 ; WX 556 ; N A ; B 9 0 547 750 ;
XC 66 ; WX 556 ; N B ; B 65 0 615 750 ;
XC 67 ; WX 556 ; N C ; B 99 -18 630 768 ;
XC 68 ; WX 611 ; N D ; B 72 0 662 750 ;
XC 69 ; WX 500 ; N E ; B 64 0 617 750 ;
XC 70 ; WX 500 ; N F ; B 73 0 629 750 ;
XC 71 ; WX 611 ; N G ; B 99 -18 664 768 ;
XC 72 ; WX 611 ; N H ; B 68 0 703 750 ;
XC 73 ; WX 278 ; N I ; B 69 0 368 750 ;
XC 74 ; WX 444 ; N J ; B 36 -18 543 750 ;
XC 75 ; WX 556 ; N K ; B 68 0 697 750 ;
XC 76 ; WX 500 ; N L ; B 68 0 491 750 ;
XC 77 ; WX 778 ; N M ; B 67 0 871 750 ;
XC 78 ; WX 611 ; N N ; B 68 0 702 750 ;
XC 79 ; WX 611 ; N O ; B 105 -18 664 768 ;
XC 80 ; WX 556 ; N P ; B 68 0 651 750 ;
XC 81 ; WX 611 ; N Q ; B 105 -71 664 768 ;
XC 82 ; WX 611 ; N R ; B 66 0 671 750 ;
XC 83 ; WX 556 ; N S ; B 85 -18 613 768 ;
XC 84 ; WX 500 ; N T ; B 153 0 643 750 ;
XC 85 ; WX 611 ; N U ; B 105 -18 703 750 ;
XC 86 ; WX 556 ; N V ; B 180 0 695 750 ;
XC 87 ; WX 833 ; N W ; B 167 0 969 750 ;
XC 88 ; WX 556 ; N X ; B 11 0 698 750 ;
XC 89 ; WX 556 ; N Y ; B 171 0 704 750 ;
XC 90 ; WX 500 ; N Z ; B 33 0 618 750 ;
XC 91 ; WX 333 ; N bracketleft ; B 61 -94 439 750 ;
XC 92 ; WX 250 ; N backslash ; B 70 0 340 750 ;
XC 93 ; WX 333 ; N bracketright ; B 33 -94 411 750 ;
XC 94 ; WX 500 ; N asciicircum ; B 89 326 569 750 ;
XC 95 ; WX 500 ; N underscore ; B -25 -119 487 -61 ;
XC 96 ; WX 278 ; N quoteleft ; B 181 495 360 766 ;
XC 97 ; WX 500 ; N a ; B 68 -15 525 579 ;
XC 98 ; WX 500 ; N b ; B 64 -15 534 750 ;
XC 99 ; WX 444 ; N c ; B 78 -15 494 579 ;
XC 100 ; WX 500 ; N d ; B 83 -15 592 750 ;
XC 101 ; WX 500 ; N e ; B 87 -15 529 579 ;
XC 102 ; WX 278 ; N f ; B 71 0 416 750 ; L i fi ; L l fl ;
XC 103 ; WX 500 ; N g ; B 44 -190 553 579 ;
XC 104 ; WX 500 ; N h ; B 61 0 539 750 ;
XC 105 ; WX 278 ; N i ; B 74 0 363 750 ;
XC 106 ; WX 278 ; N j ; B -9 -192 368 750 ;
XC 107 ; WX 444 ; N k ; B 48 0 563 750 ;
XC 108 ; WX 278 ; N l ; B 74 0 363 750 ;
XC 109 ; WX 778 ; N m ; B 66 0 812 579 ;
XC 110 ; WX 500 ; N n ; B 61 0 539 579 ;
XC 111 ; WX 500 ; N o ; B 88 -15 531 579 ;
XC 112 ; WX 500 ; N p ; B 18 -189 528 579 ;
XC 113 ; WX 500 ; N q ; B 80 -188 550 579 ;
XC 114 ; WX 333 ; N r ; B 60 0 441 574 ;
XC 115 ; WX 444 ; N s ; B 55 -15 497 579 ;
XC 116 ; WX 278 ; N t ; B 83 -7 372 719 ;
XC 117 ; WX 500 ; N u ; B 78 -15 551 564 ;
XC 118 ; WX 444 ; N v ; B 130 0 554 564 ;
XC 119 ; WX 667 ; N w ; B 127 0 765 564 ;
XC 120 ; WX 444 ; N x ; B 8 0 553 564 ;
XC 121 ; WX 444 ; N y ; B 36 -195 549 564 ;
XC 122 ; WX 389 ; N z ; B 23 0 487 564 ;
XC 123 ; WX 274 ; N braceleft ; B 37 -92 399 750 ;
XC 124 ; WX 250 ; N bar ; B 75 0 334 750 ;
XC 125 ; WX 274 ; N braceright ; B 14 -94 375 750 ;
XC 126 ; WX 500 ; N asciitilde ; B 74 153 536 359 ;
XC 161 ; WX 333 ; N exclamdown ; B 66 -170 355 579 ;
XC 162 ; WX 500 ; N cent ; B 103 -122 521 671 ;
XC 163 ; WX 500 ; N sterling ; B 52 -15 603 768 ;
XC 164 ; WX 167 ; N fraction ; B -169 0 488 738 ;
XC 165 ; WX 500 ; N yen ; B 89 0 677 750 ;
XC 166 ; WX 500 ; N florin ; B -28 -185 651 763 ;
XC 167 ; WX 500 ; N section ; B 48 -183 572 768 ;
XC 168 ; WX 500 ; N currency ; B 38 58 594 560 ;
XC 169 ; WX 250 ; N quotesingle ; B 165 468 342 739 ;
XC 170 ; WX 500 ; N quotedblleft ; B 192 495 568 766 ;
XC 171 ; WX 500 ; N guillemotleft ; B 117 62 514 447 ;
XC 172 ; WX 278 ; N guilsinglleft ; B 101 62 310 447 ;
XC 173 ; WX 278 ; N guilsinglright ; B 76 62 285 447 ;
XC 174 ; WX 500 ; N fi ; B 60 0 605 750 ;
XC 175 ; WX 500 ; N fl ; B 60 0 602 750 ;
XC 177 ; WX 500 ; N endash ; B 55 259 578 369 ;
XC 178 ; WX 500 ; N dagger ; B 127 -155 577 768 ;
XC 179 ; WX 500 ; N daggerdbl ; B 51 -161 579 768 ;
XC 180 ; WX 333 ; N periodcentered ; B 140 183 300 315 ;
XC 182 ; WX 550 ; N paragraph ; B 139 -116 685 750 ;
XC 183 ; WX 420 ; N bullet ; B 97 186 482 562 ;
XC 184 ; WX 278 ; N quotesinglbase ; B 58 -138 235 132 ;
XC 185 ; WX 500 ; N quotedblbase ; B 67 -138 441 132 ;
XC 186 ; WX 500 ; N quotedblright ; B 197 479 572 750 ;
XC 187 ; WX 500 ; N guillemotright ; B 94 62 491 447 ;
XC 188 ; WX 1000 ; N ellipsis ; B 101 0 927 132 ;
XC 189 ; WX 1111 ; N perthousand ; B 128 -18 1141 748 ;
XC 191 ; WX 500 ; N questiondown ; B 54 -190 476 579 ;
XC 193 ; WX 333 ; N grave ; B 166 629 384 775 ;
XC 194 ; WX 333 ; N acute ; B 217 629 497 775 ;
XC 195 ; WX 333 ; N circumflex ; B 127 644 480 790 ;
XC 196 ; WX 333 ; N tilde ; B 119 636 512 764 ;
XC 197 ; WX 333 ; N macron ; B 136 666 497 740 ;
XC 198 ; WX 333 ; N breve ; B 161 635 501 780 ;
XC 199 ; WX 333 ; N dotaccent ; B 240 644 391 759 ;
XC 200 ; WX 333 ; N dieresis ; B 142 644 489 759 ;
XC 202 ; WX 333 ; N ring ; B 215 632 432 845 ;
XC 203 ; WX 333 ; N cedilla ; B -4 -228 248 0 ;
XC 205 ; WX 333 ; N hungarumlaut ; B 118 634 613 780 ;
XC 206 ; WX 333 ; N ogonek ; B 63 -205 256 0 ;
XC 207 ; WX 333 ; N caron ; B 156 634 509 780 ;
XC 208 ; WX 1000 ; N emdash ; B 55 259 1078 369 ;
XC 225 ; WX 778 ; N AE ; B -22 0 909 750 ;
XC 227 ; WX 300 ; N ordfeminine ; B 82 291 421 768 ;
XC 232 ; WX 500 ; N Lslash ; B 49 0 497 750 ;
XC 233 ; WX 611 ; N Oslash ; B 34 -38 736 779 ;
XC 234 ; WX 833 ; N OE ; B 110 -18 950 768 ;
XC 235 ; WX 300 ; N ordmasculine ; B 84 291 417 768 ;
XC 241 ; WX 722 ; N ae ; B 69 -15 762 579 ;
XC 245 ; WX 278 ; N dotlessi ; B 74 0 324 564 ;
XC 248 ; WX 278 ; N lslash ; B 68 0 391 750 ;
XC 249 ; WX 500 ; N oslash ; B 2 -58 616 617 ;
XC 250 ; WX 722 ; N oe ; B 81 -15 763 579 ;
XC 251 ; WX 500 ; N germandbls ; B 60 -15 561 768 ;
XC -1 ; WX 556 ; N Aacute ; B 9 0 649 961 ;
XC -1 ; WX 556 ; N Acircumflex ; B 9 0 617 956 ;
XC -1 ; WX 556 ; N Adieresis ; B 9 0 641 945 ;
XC -1 ; WX 556 ; N Agrave ; B 9 0 547 961 ;
XC -1 ; WX 556 ; N Aring ; B 9 0 571 971 ;
XC -1 ; WX 556 ; N Atilde ; B 9 0 659 930 ;
XC -1 ; WX 556 ; N Ccedilla ; B 99 -228 630 768 ;
XC -1 ; WX 500 ; N Eacute ; B 64 0 621 961 ;
XC -1 ; WX 500 ; N Ecircumflex ; B 64 0 617 956 ;
XC -1 ; WX 500 ; N Edieresis ; B 64 0 617 945 ;
XC -1 ; WX 500 ; N Egrave ; B 64 0 617 961 ;
XC -1 ; WX 611 ; N Eth ; B 64 0 662 750 ;
XC -1 ; WX 278 ; N Iacute ; B 69 0 510 961 ;
XC -1 ; WX 278 ; N Icircumflex ; B 69 0 488 956 ;
XC -1 ; WX 278 ; N Idieresis ; B 69 0 502 945 ;
XC -1 ; WX 278 ; N Igrave ; B 69 0 397 961 ;
XC -1 ; WX 611 ; N Ntilde ; B 68 0 702 930 ;
XC -1 ; WX 611 ; N Oacute ; B 105 -18 676 961 ;
XC -1 ; WX 611 ; N Ocircumflex ; B 105 -18 664 956 ;
XC -1 ; WX 611 ; N Odieresis ; B 105 -18 668 945 ;
XC -1 ; WX 611 ; N Ograve ; B 105 -18 664 961 ;
XC -1 ; WX 611 ; N Otilde ; B 105 -18 686 930 ;
XC -1 ; WX 556 ; N Scaron ; B 85 -18 656 946 ;
XC -1 ; WX 556 ; N Thorn ; B 68 0 618 750 ;
XC -1 ; WX 611 ; N Uacute ; B 105 -18 703 961 ;
XC -1 ; WX 611 ; N Ucircumflex ; B 105 -18 703 956 ;
XC -1 ; WX 611 ; N Udieresis ; B 105 -18 703 945 ;
XC -1 ; WX 611 ; N Ugrave ; B 105 -18 703 961 ;
XC -1 ; WX 556 ; N Yacute ; B 171 0 704 961 ;
XC -1 ; WX 556 ; N Ydieresis ; B 171 0 704 945 ;
XC -1 ; WX 500 ; N Zcaron ; B 33 0 628 946 ;
XC -1 ; WX 500 ; N aacute ; B 68 -15 581 775 ;
XC -1 ; WX 500 ; N acircumflex ; B 68 -15 560 770 ;
XC -1 ; WX 500 ; N adieresis ; B 68 -15 573 759 ;
XC -1 ; WX 500 ; N agrave ; B 68 -15 525 775 ;
XC -1 ; WX 500 ; N aring ; B 68 -15 525 845 ;
XC -1 ; WX 500 ; N atilde ; B 68 -15 592 744 ;
XC -1 ; WX 250 ; N brokenbar ; B 75 0 334 750 ;
XC -1 ; WX 444 ; N ccedilla ; B 52 -228 494 579 ;
XC -1 ; WX 830 ; N copyright ; B 93 -18 897 768 ;
XC -1 ; WX 400 ; N degree ; B 174 450 481 750 ;
XC -1 ; WX 500 ; N divide ; B 67 6 540 492 ;
XC -1 ; WX 500 ; N eacute ; B 87 -15 581 775 ;
XC -1 ; WX 500 ; N ecircumflex ; B 87 -15 560 770 ;
XC -1 ; WX 500 ; N edieresis ; B 87 -15 573 759 ;
XC -1 ; WX 500 ; N egrave ; B 87 -15 529 775 ;
XC -1 ; WX 500 ; N eth ; B 81 -15 538 777 ;
XC -1 ; WX 278 ; N iacute ; B 74 0 470 775 ;
XC -1 ; WX 278 ; N icircumflex ; B 74 0 439 770 ;
XC -1 ; WX 278 ; N idieresis ; B 74 0 462 759 ;
XC -1 ; WX 278 ; N igrave ; B 74 0 357 775 ;
XC -1 ; WX 500 ; N logicalnot ; B 88 105 560 401 ;
XC -1 ; WX 500 ; N minus ; B 67 194 540 304 ;
XC -1 ; WX 500 ; N mu ; B 18 -189 551 564 ;
XC -1 ; WX 500 ; N multiply ; B 48 22 560 476 ;
XC -1 ; WX 500 ; N ntilde ; B 61 0 592 744 ;
XC -1 ; WX 500 ; N oacute ; B 88 -15 581 775 ;
XC -1 ; WX 500 ; N ocircumflex ; B 88 -15 560 770 ;
XC -1 ; WX 500 ; N odieresis ; B 88 -15 573 759 ;
XC -1 ; WX 500 ; N ograve ; B 88 -15 531 775 ;
XC -1 ; WX 750 ; N onehalf ; B 108 0 813 750 ;
XC -1 ; WX 750 ; N onequarter ; B 131 0 788 750 ;
XC -1 ; WX 300 ; N onesuperior ; B 180 300 410 750 ;
XC -1 ; WX 500 ; N otilde ; B 88 -15 592 744 ;
XC -1 ; WX 500 ; N plusminus ; B 23 -15 556 513 ;
XC -1 ; WX 830 ; N registered ; B 93 -18 897 768 ;
XC -1 ; WX 444 ; N scaron ; B 55 -15 551 760 ;
XC -1 ; WX 500 ; N thorn ; B 18 -189 528 750 ;
XC -1 ; WX 750 ; N threequarters ; B 96 0 816 750 ;
XC -1 ; WX 300 ; N threesuperior ; B 96 290 416 750 ;
XC -1 ; WX 860 ; N trademark ; B 144 346 933 750 ;
XC -1 ; WX 300 ; N twosuperior ; B 77 300 425 752 ;
XC -1 ; WX 500 ; N uacute ; B 78 -15 581 775 ;
XC -1 ; WX 500 ; N ucircumflex ; B 78 -15 562 780 ;
XC -1 ; WX 500 ; N udieresis ; B 78 -15 573 759 ;
XC -1 ; WX 500 ; N ugrave ; B 78 -15 551 775 ;
XC -1 ; WX 444 ; N yacute ; B 36 -195 553 775 ;
XC -1 ; WX 444 ; N ydieresis ; B 36 -195 549 759 ;
XC -1 ; WX 389 ; N zcaron ; B 23 0 533 760 ;
XEndCharMetrics
XStartKernData
XStartKernPairs 115
X
XKPX A y -18
XKPX A w -18
XKPX A v -18
XKPX A quoteright -55


XKPX A Y -55
XKPX A W -37

XKPX A V -37
XKPX A T -55
X
XKPX F period -111
XKPX F comma -111
XKPX F A -37
X
XKPX L y -37
XKPX L quoteright -92
XKPX L Y -92
XKPX L W -74
XKPX L V -74
XKPX L T -74
X


XKPX P period -129
XKPX P comma -129

XKPX P A -37
X
XKPX R y 0
XKPX R Y -18
XKPX R W 0
XKPX R V 0
XKPX R T -18
X
XKPX T y -55
XKPX T w -74
XKPX T u -74
XKPX T semicolon -74
XKPX T s -74
XKPX T r -74
XKPX T period -92
XKPX T o -74
XKPX T i -18
XKPX T hyphen -55
XKPX T e -74
XKPX T comma -92
XKPX T colon -74
XKPX T c -74
XKPX T a -74
XKPX T A -55
X
XKPX V y 0
XKPX V u -18
XKPX V semicolon -18
XKPX V r -18
XKPX V period -92
XKPX V o -18
XKPX V i 0
XKPX V hyphen -18
XKPX V e -18
XKPX V comma -92
XKPX V colon -18
XKPX V a -18
XKPX V A -37
X
XKPX W y 0
XKPX W u 0
XKPX W semicolon 0
XKPX W r 0
XKPX W period -74
XKPX W o -18
XKPX W i 0
XKPX W hyphen -18
XKPX W e -18
XKPX W comma -74
XKPX W colon 0
XKPX W a -18
XKPX W A -18
X
XKPX Y v -18
XKPX Y u -37
XKPX Y semicolon -37
XKPX Y q -55
XKPX Y period -111
XKPX Y p -37
XKPX Y o -55
XKPX Y i -18
XKPX Y hyphen -74
XKPX Y e -55
XKPX Y comma -111
XKPX Y colon -37
XKPX Y a -55
XKPX Y A -55
X
XKPX f quoteright 18
XKPX f f 0


X
XKPX quoteleft quoteleft -18
X

XKPX quoteright t 0
XKPX quoteright s -55


XKPX quoteright quoteright -18
X

XKPX r z 20
XKPX r y 18
XKPX r x 20
XKPX r w 18
XKPX r v 18


XKPX r u 0
XKPX r t 0
XKPX r r 0

XKPX r quoteright 0
XKPX r q 0
XKPX r period -74
XKPX r o 0
XKPX r n 0
XKPX r m 0
XKPX r hyphen -37
XKPX r h 0
XKPX r g 0
XKPX r f 0
XKPX r e 0
XKPX r d 0
XKPX r comma -74
XKPX r c 0
X
XKPX v period -55
XKPX v comma -55


X
XKPX w period -37
XKPX w comma -37
X
XKPX y period -55
XKPX y comma -55
XEndKernPairs
XEndKernData
XStartComposites 58

XCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 83 190 ;
XCC zcaron 2 ; PCC z 0 0 ; PCC caron 28 0 ;
XCC Scaron 2 ; PCC S 0 0 ; PCC caron 111 190 ;
XCC scaron 2 ; PCC s 0 0 ; PCC caron 55 0 ;
XCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 124 0 ;
XCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 61 0 ;
XCC Yacute 2 ; PCC Y 0 0 ; PCC acute 111 186 ;
XCC yacute 2 ; PCC y 0 0 ; PCC acute 55 0 ;
XCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 111 190 ;
XCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 55 0 ;
XCC Uacute 2 ; PCC U 0 0 ; PCC acute 142 190 ;
XCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 142 190 ;
XCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 142 190 ;
XCC Ugrave 2 ; PCC U 0 0 ; PCC grave 142 190 ;
XCC uacute 2 ; PCC u 0 0 ; PCC acute 83 0 ;
XCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 83 0 ;
XCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 83 0 ;
XCC ugrave 2 ; PCC u 0 0 ; PCC grave 83 0 ;
XCC Iacute 2 ; PCC I 0 0 ; PCC acute -27 190 ;
XCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex -27 190 ;
XCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis -27 190 ;
XCC Igrave 2 ; PCC I 0 0 ; PCC grave -27 190 ;
XCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -27 0 ;
XCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -27 0 ;
XCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -27 0 ;
XCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -27 0 ;
XCC Eacute 2 ; PCC E 0 0 ; PCC acute 104 190 ;
XCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 104 190 ;
XCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 104 190 ;
XCC Egrave 2 ; PCC E 0 0 ; PCC grave 104 190 ;
XCC eacute 2 ; PCC e 0 0 ; PCC acute 83 0 ;
XCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 83 0 ;
XCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 83 0 ;
XCC egrave 2 ; PCC e 0 0 ; PCC grave 83 0 ;
XCC Aacute 2 ; PCC A 0 0 ; PCC acute 114 190 ;
XCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 114 190 ;
XCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 114 190 ;
XCC Agrave 2 ; PCC A 0 0 ; PCC grave 114 190 ;
XCC aacute 2 ; PCC a 0 0 ; PCC acute 83 0 ;
XCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 83 0 ;
XCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 83 0 ;
XCC agrave 2 ; PCC a 0 0 ; PCC grave 83 0 ;
XCC Oacute 2 ; PCC O 0 0 ; PCC acute 139 190 ;
XCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 139 190 ;
XCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 139 190 ;
XCC Ograve 2 ; PCC O 0 0 ; PCC grave 139 190 ;
XCC oacute 2 ; PCC o 0 0 ; PCC acute 83 0 ;
XCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 83 0 ;
XCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 83 0 ;
XCC ograve 2 ; PCC o 0 0 ; PCC grave 83 0 ;
XCC Atilde 2 ; PCC A 0 0 ; PCC tilde 114 190 ;
XCC atilde 2 ; PCC a 0 0 ; PCC tilde 83 0 ;
XCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 145 190 ;
XCC ntilde 2 ; PCC n 0 0 ; PCC tilde 90 0 ;
XCC Otilde 2 ; PCC O 0 0 ; PCC tilde 139 190 ;
XCC otilde 2 ; PCC o 0 0 ; PCC tilde 83 0 ;
XCC Aring 2 ; PCC A 0 0 ; PCC ring 114 190 ;
XCC aring 2 ; PCC a 0 0 ; PCC ring 83 0 ;
XEndComposites
XEndFontMetrics
END_OF_FILE
if test 15630 -ne `wc -c <'lout/font0/HelveConBolObl.AFM'`; then
echo shar: \"'lout/font0/HelveConBolObl.AFM'\" unpacked with wrong size!
fi
# end of 'lout/font0/HelveConBolObl.AFM'
fi
if test -f 'lout/font0/NewCenSchIta.AFM' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/font0/NewCenSchIta.AFM'\"
else
echo shar: Extracting \"'lout/font0/NewCenSchIta.AFM'\" \(15672 characters\)
sed "s/^X//" >'lout/font0/NewCenSchIta.AFM' <<'END_OF_FILE'
XStartFontMetrics 2.0


XComment Copyright (c) 1985, 1987 Adobe Systems Incorporated. All rights reserved.

XComment Creation Date:Fri Jul 17 17:26:38 PDT 1987
XFontName NewCenturySchlbk-Italic
XEncodingScheme AdobeStandardEncoding
XFullName New Century Schoolbook Italic
XFamilyName New Century Schoolbook
XWeight Medium


XItalicAngle -16.0
XIsFixedPitch false
XUnderlinePosition -102

XUnderlineThickness 42
XVersion 001.003


XNotice Copyright (c) 1985, 1987 Adobe Systems Incorporated. All rights reserved. New Century Schoolbook is a trademark of Linotype Company.

XFontBBox -166 -227 1018 968
XCapHeight 722
XXHeight 466


XDescender -205
XAscender 737
XStartCharMetrics 228

XC 32 ; WX 278 ; N space ; B 0 0 0 0 ;

XC 33 ; WX 333 ; N exclam ; B 30 -15 316 737 ;
XC 34 ; WX 400 ; N quotedbl ; B 100 506 395 737 ;
XC 35 ; WX 556 ; N numbersign ; B 33 0 524 705 ;
XC 36 ; WX 556 ; N dollar ; B 3 -133 536 800 ;
XC 37 ; WX 833 ; N percent ; B 46 -17 792 705 ;
XC 38 ; WX 852 ; N ampersand ; B 24 -15 773 737 ;
XC 39 ; WX 204 ; N quoteright ; B 39 461 230 737 ;
XC 40 ; WX 333 ; N parenleft ; B 40 -124 399 737 ;
XC 41 ; WX 333 ; N parenright ; B -93 -124 265 737 ;
XC 42 ; WX 500 ; N asterisk ; B 33 286 452 705 ;
XC 43 ; WX 606 ; N plus ; B 37 0 540 504 ;
XC 44 ; WX 278 ; N comma ; B -39 -165 151 109 ;
XC 45 ; WX 333 ; N hyphen ; B 32 201 259 273 ;
XC 46 ; WX 278 ; N period ; B 17 -15 141 109 ;
XC 47 ; WX 606 ; N slash ; B 140 -102 466 737 ;
XC 48 ; WX 556 ; N zero ; B 29 -15 527 705 ;
XC 49 ; WX 556 ; N one ; B 50 0 459 705 ;
XC 50 ; WX 556 ; N two ; B -35 0 508 705 ;
XC 51 ; WX 556 ; N three ; B -2 -15 506 705 ;
XC 52 ; WX 556 ; N four ; B -8 0 512 705 ;
XC 53 ; WX 556 ; N five ; B 4 -15 540 705 ;
XC 54 ; WX 556 ; N six ; B 36 -15 547 705 ;
XC 55 ; WX 556 ; N seven ; B 69 -15 561 705 ;
XC 56 ; WX 556 ; N eight ; B 8 -15 527 705 ;
XC 57 ; WX 556 ; N nine ; B 7 -15 519 705 ;
XC 58 ; WX 278 ; N colon ; B 42 -15 254 466 ;
XC 59 ; WX 278 ; N semicolon ; B -14 -165 261 466 ;
XC 60 ; WX 606 ; N less ; B 34 -10 543 518 ;
XC 61 ; WX 606 ; N equal ; B 36 127 540 381 ;
XC 62 ; WX 606 ; N greater ; B 53 -10 562 518 ;
XC 63 ; WX 444 ; N question ; B 102 -15 417 737 ;
XC 64 ; WX 747 ; N at ; B 28 -15 728 737 ;
XC 65 ; WX 704 ; N A ; B -82 0 668 737 ;
XC 66 ; WX 722 ; N B ; B -31 0 668 722 ;
XC 67 ; WX 722 ; N C ; B 40 -15 713 737 ;
XC 68 ; WX 778 ; N D ; B -38 0 735 722 ;
XC 69 ; WX 722 ; N E ; B -37 0 701 722 ;
XC 70 ; WX 667 ; N F ; B -34 0 698 722 ;
XC 71 ; WX 778 ; N G ; B 39 -15 763 737 ;
XC 72 ; WX 833 ; N H ; B -38 0 867 722 ;
XC 73 ; WX 407 ; N I ; B -33 0 431 722 ;
XC 74 ; WX 611 ; N J ; B -13 -17 646 722 ;
XC 75 ; WX 741 ; N K ; B -40 0 814 722 ;
XC 76 ; WX 667 ; N L ; B -37 0 630 722 ;
XC 77 ; WX 944 ; N M ; B -26 0 973 722 ;
XC 78 ; WX 815 ; N N ; B -48 -17 859 722 ;
XC 79 ; WX 778 ; N O ; B 40 -15 735 737 ;
XC 80 ; WX 667 ; N P ; B -33 0 663 722 ;
XC 81 ; WX 778 ; N Q ; B 40 -190 735 737 ;
XC 82 ; WX 741 ; N R ; B -41 -17 691 722 ;
XC 83 ; WX 667 ; N S ; B 0 -15 632 737 ;
XC 84 ; WX 685 ; N T ; B 40 0 726 722 ;
XC 85 ; WX 815 ; N U ; B 93 -15 860 722 ;
XC 86 ; WX 704 ; N V ; B 36 -15 772 722 ;
XC 87 ; WX 926 ; N W ; B 53 -15 973 722 ;
XC 88 ; WX 704 ; N X ; B -73 0 770 722 ;
XC 89 ; WX 685 ; N Y ; B 32 0 758 722 ;
XC 90 ; WX 667 ; N Z ; B -25 0 667 722 ;
XC 91 ; WX 333 ; N bracketleft ; B -33 -109 410 737 ;
XC 92 ; WX 606 ; N backslash ; B 89 0 522 737 ;
XC 93 ; WX 333 ; N bracketright ; B -83 -109 359 737 ;
XC 94 ; WX 606 ; N asciicircum ; B 52 317 554 722 ;
XC 95 ; WX 500 ; N underscore ; B 0 -123 500 -81 ;
XC 96 ; WX 204 ; N quoteleft ; B 61 473 252 749 ;
XC 97 ; WX 574 ; N a ; B 1 -15 523 466 ;
XC 98 ; WX 556 ; N b ; B 32 -15 488 737 ;
XC 99 ; WX 444 ; N c ; B 5 -15 401 466 ;
XC 100 ; WX 611 ; N d ; B 3 -15 586 737 ;
XC 101 ; WX 444 ; N e ; B -6 -15 391 466 ;
XC 102 ; WX 333 ; N f ; B -68 -205 470 737 ; L i fi ; L l fl ;
XC 103 ; WX 537 ; N g ; B -79 -205 523 499 ;
XC 104 ; WX 611 ; N h ; B 0 -15 557 737 ;
XC 105 ; WX 333 ; N i ; B 27 -15 282 715 ;
XC 106 ; WX 315 ; N j ; B -166 -205 317 715 ;
XC 107 ; WX 556 ; N k ; B -5 -15 492 737 ;
XC 108 ; WX 333 ; N l ; B 16 -15 294 737 ;
XC 109 ; WX 889 ; N m ; B 15 -15 837 466 ;
XC 110 ; WX 611 ; N n ; B 14 -15 563 466 ;
XC 111 ; WX 500 ; N o ; B 5 -15 450 466 ;
XC 112 ; WX 574 ; N p ; B -101 -205 506 466 ;
XC 113 ; WX 556 ; N q ; B 0 -205 499 466 ;
XC 114 ; WX 444 ; N r ; B 9 0 433 466 ;
XC 115 ; WX 444 ; N s ; B -1 -15 392 466 ;
XC 116 ; WX 352 ; N t ; B 25 -15 329 619 ;
XC 117 ; WX 611 ; N u ; B 41 -15 556 466 ;
XC 118 ; WX 519 ; N v ; B 34 -15 445 466 ;
XC 119 ; WX 778 ; N w ; B 32 -15 708 466 ;
XC 120 ; WX 500 ; N x ; B -33 -15 471 466 ;
XC 121 ; WX 500 ; N y ; B -79 -205 454 466 ;
XC 122 ; WX 463 ; N z ; B -33 -15 417 466 ;
XC 123 ; WX 333 ; N braceleft ; B 52 -116 381 737 ;
XC 124 ; WX 606 ; N bar ; B 269 0 337 737 ;
XC 125 ; WX 333 ; N braceright ; B -98 -116 232 737 ;
XC 126 ; WX 606 ; N asciitilde ; B 41 172 545 335 ;
XC 161 ; WX 333 ; N exclamdown ; B -7 -205 280 542 ;
XC 162 ; WX 556 ; N cent ; B 61 -129 486 595 ;
XC 163 ; WX 556 ; N sterling ; B -8 -15 545 705 ;
XC 164 ; WX 167 ; N fraction ; B -104 -17 333 705 ;
XC 165 ; WX 556 ; N yen ; B 40 0 623 705 ;
XC 166 ; WX 556 ; N florin ; B -57 -205 563 737 ;
XC 167 ; WX 500 ; N section ; B -11 -147 480 737 ;
XC 168 ; WX 556 ; N currency ; B 25 102 530 603 ;
XC 169 ; WX 278 ; N quotesingle ; B 114 511 262 736 ;
XC 170 ; WX 389 ; N quotedblleft ; B 63 473 432 749 ;
XC 171 ; WX 426 ; N guillemotleft ; B -15 72 402 399 ;
XC 172 ; WX 333 ; N guilsinglleft ; B 42 72 261 399 ;
XC 173 ; WX 333 ; N guilsinglright ; B 40 67 259 394 ;
XC 174 ; WX 611 ; N fi ; B -60 -205 564 737 ;
XC 175 ; WX 611 ; N fl ; B -60 -205 594 737 ;
XC 177 ; WX 500 ; N endash ; B -18 206 518 260 ;
XC 178 ; WX 500 ; N dagger ; B 64 -147 518 737 ;
XC 179 ; WX 500 ; N daggerdbl ; B -30 -148 528 737 ;
XC 180 ; WX 278 ; N periodcentered ; B 77 192 201 316 ;
XC 182 ; WX 650 ; N paragraph ; B 87 0 644 737 ;
XC 183 ; WX 606 ; N bullet ; B 114 200 451 537 ;
XC 184 ; WX 204 ; N quotesinglbase ; B -79 -167 112 109 ;
XC 185 ; WX 389 ; N quotedblbase ; B -79 -167 289 109 ;
XC 186 ; WX 389 ; N quotedblright ; B 38 461 407 737 ;
XC 187 ; WX 426 ; N guillemotright ; B -17 67 400 394 ;
XC 188 ; WX 1000 ; N ellipsis ; B 55 -15 845 109 ;
XC 189 ; WX 1000 ; N perthousand ; B -6 -15 1003 705 ;
XC 191 ; WX 444 ; N questiondown ; B 7 -205 323 542 ;
XC 193 ; WX 333 ; N grave ; B 73 518 263 690 ;
XC 194 ; WX 333 ; N acute ; B 132 519 355 689 ;
XC 195 ; WX 333 ; N circumflex ; B 37 519 331 688 ;
XC 196 ; WX 333 ; N tilde ; B 52 544 380 650 ;
XC 197 ; WX 333 ; N macron ; B 51 559 363 610 ;
XC 198 ; WX 333 ; N breve ; B 69 518 370 677 ;
XC 199 ; WX 333 ; N dotaccent ; B 118 546 216 644 ;
XC 200 ; WX 333 ; N dieresis ; B 59 546 359 644 ;
XC 202 ; WX 333 ; N ring ; B 230 513 429 712 ;
XC 203 ; WX 333 ; N cedilla ; B 3 -227 215 -10 ;
XC 205 ; WX 333 ; N hungarumlaut ; B 134 519 520 689 ;


XC 206 ; WX 333 ; N ogonek ; B 68 -155 245 -10 ;

XC 207 ; WX 333 ; N caron ; B 73 519 378 688 ;
XC 208 ; WX 1000 ; N emdash ; B -18 206 1018 260 ;
XC 225 ; WX 870 ; N AE ; B -92 0 870 722 ;
XC 227 ; WX 422 ; N ordfeminine ; B 83 333 422 737 ;
XC 232 ; WX 667 ; N Lslash ; B -37 0 630 722 ;
XC 233 ; WX 778 ; N Oslash ; B 1 -87 735 755 ;
XC 234 ; WX 981 ; N OE ; B 36 0 963 722 ;
XC 235 ; WX 372 ; N ordmasculine ; B 83 333 372 737 ;
XC 241 ; WX 722 ; N ae ; B -18 -15 667 466 ;
XC 245 ; WX 333 ; N dotlessi ; B 27 -15 282 466 ;
XC 248 ; WX 333 ; N lslash ; B 16 -15 342 737 ;
XC 249 ; WX 500 ; N oslash ; B -5 -121 440 549 ;
XC 250 ; WX 778 ; N oe ; B 0 -17 720 466 ;
XC 251 ; WX 556 ; N germandbls ; B -76 -205 525 737 ;
XC -1 ; WX 704 ; N Aacute ; B -82 0 668 945 ;
XC -1 ; WX 704 ; N Acircumflex ; B -82 0 668 944 ;
XC -1 ; WX 704 ; N Adieresis ; B -82 0 668 900 ;
XC -1 ; WX 704 ; N Agrave ; B -82 0 668 946 ;
XC -1 ; WX 704 ; N Aring ; B -82 0 668 968 ;
XC -1 ; WX 704 ; N Atilde ; B -82 0 668 906 ;
XC -1 ; WX 722 ; N Ccedilla ; B 40 -227 713 737 ;
XC -1 ; WX 722 ; N Eacute ; B -37 0 701 945 ;
XC -1 ; WX 722 ; N Ecircumflex ; B -37 0 701 944 ;
XC -1 ; WX 722 ; N Edieresis ; B -37 0 701 900 ;
XC -1 ; WX 722 ; N Egrave ; B -37 0 701 946 ;
XC -1 ; WX 778 ; N Eth ; B -38 0 735 722 ;
XC -1 ; WX 407 ; N Iacute ; B -33 0 431 945 ;
XC -1 ; WX 407 ; N Icircumflex ; B -33 0 431 944 ;
XC -1 ; WX 407 ; N Idieresis ; B -33 0 446 900 ;
XC -1 ; WX 407 ; N Igrave ; B -33 0 431 946 ;
XC -1 ; WX 815 ; N Ntilde ; B -48 -17 859 906 ;
XC -1 ; WX 778 ; N Oacute ; B 40 -15 735 945 ;
XC -1 ; WX 778 ; N Ocircumflex ; B 40 -15 735 944 ;
XC -1 ; WX 778 ; N Odieresis ; B 40 -15 735 900 ;
XC -1 ; WX 778 ; N Ograve ; B 40 -15 735 946 ;
XC -1 ; WX 778 ; N Otilde ; B 40 -15 735 906 ;
XC -1 ; WX 667 ; N Scaron ; B 0 -15 632 944 ;
XC -1 ; WX 667 ; N Thorn ; B -33 0 624 722 ;
XC -1 ; WX 815 ; N Uacute ; B 93 -15 860 945 ;
XC -1 ; WX 815 ; N Ucircumflex ; B 93 -15 860 944 ;
XC -1 ; WX 815 ; N Udieresis ; B 93 -15 860 900 ;
XC -1 ; WX 815 ; N Ugrave ; B 93 -15 860 946 ;
XC -1 ; WX 685 ; N Yacute ; B 32 0 758 945 ;
XC -1 ; WX 685 ; N Ydieresis ; B 32 0 758 900 ;
XC -1 ; WX 667 ; N Zcaron ; B -25 0 667 944 ;
XC -1 ; WX 574 ; N aacute ; B 1 -15 523 689 ;
XC -1 ; WX 574 ; N acircumflex ; B 1 -15 523 688 ;
XC -1 ; WX 574 ; N adieresis ; B 1 -15 523 644 ;
XC -1 ; WX 574 ; N agrave ; B 1 -15 523 690 ;
XC -1 ; WX 574 ; N aring ; B 1 -15 523 712 ;
XC -1 ; WX 574 ; N atilde ; B 1 -15 523 650 ;
XC -1 ; WX 606 ; N brokenbar ; B 269 0 337 737 ;
XC -1 ; WX 444 ; N ccedilla ; B 5 -227 401 466 ;
XC -1 ; WX 747 ; N copyright ; B 24 -15 724 737 ;


XC -1 ; WX 400 ; N degree ; B 70 405 370 705 ;

XC -1 ; WX 606 ; N divide ; B 37 0 540 504 ;
XC -1 ; WX 444 ; N eacute ; B -6 -15 411 689 ;
XC -1 ; WX 444 ; N ecircumflex ; B -6 -15 391 688 ;
XC -1 ; WX 444 ; N edieresis ; B -6 -15 405 644 ;
XC -1 ; WX 444 ; N egrave ; B -6 -15 391 690 ;
XC -1 ; WX 500 ; N eth ; B 5 -15 450 737 ;
XC -1 ; WX 333 ; N iacute ; B 27 -15 355 689 ;
XC -1 ; WX 333 ; N icircumflex ; B -3 -15 291 688 ;
XC -1 ; WX 333 ; N idieresis ; B 27 -15 349 644 ;
XC -1 ; WX 333 ; N igrave ; B 27 -15 282 690 ;
XC -1 ; WX 606 ; N logicalnot ; B 41 111 545 381 ;
XC -1 ; WX 606 ; N minus ; B 41 220 545 287 ;
XC -1 ; WX 611 ; N mu ; B -70 -205 556 466 ;
XC -1 ; WX 606 ; N multiply ; B 37 0 540 504 ;
XC -1 ; WX 611 ; N ntilde ; B 14 -15 563 650 ;
XC -1 ; WX 500 ; N oacute ; B 5 -15 450 689 ;
XC -1 ; WX 500 ; N ocircumflex ; B 5 -15 450 688 ;
XC -1 ; WX 500 ; N odieresis ; B 5 -15 450 644 ;
XC -1 ; WX 500 ; N ograve ; B 5 -15 450 690 ;
XC -1 ; WX 834 ; N onehalf ; B 33 -17 844 705 ;
XC -1 ; WX 834 ; N onequarter ; B 33 -17 833 705 ;
XC -1 ; WX 333 ; N onesuperior ; B 43 282 309 705 ;
XC -1 ; WX 500 ; N otilde ; B 5 -15 454 650 ;
XC -1 ; WX 606 ; N plusminus ; B 37 0 540 504 ;


XC -1 ; WX 747 ; N registered ; B 23 -15 723 737 ;

XC -1 ; WX 444 ; N scaron ; B -1 -15 434 688 ;
XC -1 ; WX 574 ; N thorn ; B -101 -205 506 656 ;
XC -1 ; WX 834 ; N threequarters ; B 1 -17 833 705 ;
XC -1 ; WX 333 ; N threesuperior ; B 1 273 331 705 ;
XC -1 ; WX 950 ; N trademark ; B 48 318 971 722 ;
XC -1 ; WX 333 ; N twosuperior ; B 0 282 353 705 ;
XC -1 ; WX 611 ; N uacute ; B 41 -15 556 689 ;
XC -1 ; WX 611 ; N ucircumflex ; B 41 -15 556 688 ;
XC -1 ; WX 611 ; N udieresis ; B 41 -15 556 644 ;
XC -1 ; WX 611 ; N ugrave ; B 41 -15 556 690 ;
XC -1 ; WX 500 ; N yacute ; B -79 -205 454 689 ;
XC -1 ; WX 500 ; N ydieresis ; B -79 -205 454 644 ;
XC -1 ; WX 463 ; N zcaron ; B -33 -15 443 688 ;


XEndCharMetrics
XStartKernData
XStartKernPairs 102
X

XKPX A y -54

XKPX R y -54
XKPX R Y -74
XKPX R W -55


XKPX R V -20
XKPX R T -20
X
XKPX T y -89
XKPX T w -89
XKPX T u -89

XKPX T semicolon -92


XKPX T s -89
XKPX T r -89
XKPX T period -111

XKPX T o -89


XKPX T i -71
XKPX T hyphen -129

XKPX T e -89
XKPX T comma -111
XKPX T colon -92


XKPX T c -89
XKPX T a -74

XKPX T A -18
X
XKPX V y -109
XKPX V u -109


XKPX V semicolon -74
XKPX V r -109
XKPX V period -111
XKPX V o -129

XKPX V i -62


XKPX V hyphen -74
XKPX V e -129

XKPX V comma -140


XKPX V colon -74
XKPX V a -129

XKPX V A -111


X
XKPX W y -74
XKPX W u -74
XKPX W semicolon -37
XKPX W r -74
XKPX W period -55
XKPX W o -74
XKPX W i -74
XKPX W hyphen -37
XKPX W e -74
XKPX W comma -55
XKPX W colon -37
XKPX W a -74

XKPX W A -74
X
XKPX Y v -99
XKPX Y u -99


XKPX Y semicolon -111
XKPX Y q -129
XKPX Y period -129
XKPX Y p -129
XKPX Y o -129

XKPX Y i -70


XKPX Y hyphen -129
XKPX Y e -129
XKPX Y comma -129
XKPX Y colon -111
XKPX Y a -129

XKPX Y A -74
X
XKPX f quoteright 94

XCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 182 256 ;
XCC zcaron 2 ; PCC z 0 0 ; PCC caron 65 0 ;
XCC Scaron 2 ; PCC S 0 0 ; PCC caron 182 256 ;
XCC scaron 2 ; PCC s 0 0 ; PCC caron 55 0 ;
XCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 194 0 ;
XCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 55 0 ;
XCC Yacute 2 ; PCC Y 0 0 ; PCC acute 176 256 ;
XCC yacute 2 ; PCC y 0 0 ; PCC acute 83 0 ;
XCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 201 256 ;
XCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 73 0 ;
XCC Uacute 2 ; PCC U 0 0 ; PCC acute 241 256 ;
XCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 271 256 ;
XCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 271 256 ;
XCC Ugrave 2 ; PCC U 0 0 ; PCC grave 281 256 ;
XCC uacute 2 ; PCC u 0 0 ; PCC acute 139 0 ;
XCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 129 0 ;
XCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 129 0 ;
XCC ugrave 2 ; PCC u 0 0 ; PCC grave 139 0 ;
XCC Iacute 2 ; PCC I 0 0 ; PCC acute 37 256 ;
XCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex 87 256 ;
XCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis 87 256 ;
XCC Igrave 2 ; PCC I 0 0 ; PCC grave 57 256 ;
XCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute 0 0 ;
XCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -40 0 ;
XCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -10 0 ;
XCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave 0 0 ;
XCC Eacute 2 ; PCC E 0 0 ; PCC acute 194 256 ;
XCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 224 256 ;
XCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 224 256 ;
XCC Egrave 2 ; PCC E 0 0 ; PCC grave 214 256 ;
XCC eacute 2 ; PCC e 0 0 ; PCC acute 55 0 ;
XCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 55 0 ;
XCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 45 0 ;
XCC egrave 2 ; PCC e 0 0 ; PCC grave 65 0 ;
XCC Aacute 2 ; PCC A 0 0 ; PCC acute 185 256 ;
XCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 215 256 ;
XCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 215 256 ;
XCC Agrave 2 ; PCC A 0 0 ; PCC grave 205 256 ;
XCC aacute 2 ; PCC a 0 0 ; PCC acute 120 0 ;
XCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 110 0 ;
XCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 110 0 ;
XCC agrave 2 ; PCC a 0 0 ; PCC grave 120 0 ;
XCC Oacute 2 ; PCC O 0 0 ; PCC acute 222 256 ;
XCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 252 256 ;
XCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 252 256 ;
XCC Ograve 2 ; PCC O 0 0 ; PCC grave 242 256 ;
XCC oacute 2 ; PCC o 0 0 ; PCC acute 83 0 ;
XCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 73 0 ;
XCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 73 0 ;
XCC ograve 2 ; PCC o 0 0 ; PCC grave 88 0 ;
XCC Atilde 2 ; PCC A 0 0 ; PCC tilde 195 256 ;
XCC atilde 2 ; PCC a 0 0 ; PCC tilde 110 0 ;
XCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 241 256 ;
XCC ntilde 2 ; PCC n 0 0 ; PCC tilde 129 0 ;
XCC Otilde 2 ; PCC O 0 0 ; PCC tilde 232 256 ;
XCC otilde 2 ; PCC o 0 0 ; PCC tilde 73 0 ;
XCC Aring 2 ; PCC A 0 0 ; PCC ring 110 256 ;
XCC aring 2 ; PCC a 0 0 ; PCC ring -19 0 ;
XEndComposites
XEndFontMetrics
END_OF_FILE
if test 15672 -ne `wc -c <'lout/font0/NewCenSchIta.AFM'`; then
echo shar: \"'lout/font0/NewCenSchIta.AFM'\" unpacked with wrong size!
fi
# end of 'lout/font0/NewCenSchIta.AFM'
fi
if test -f 'lout/font0/PalatBolIta.AFM' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/font0/PalatBolIta.AFM'\"
else
echo shar: Extracting \"'lout/font0/PalatBolIta.AFM'\" \(15599 characters\)
sed "s/^X//" >'lout/font0/PalatBolIta.AFM' <<'END_OF_FILE'


XStartFontMetrics 2.0
XComment Copyright (c) 1984 Adobe Systems Incorporated. All Rights Reserved.

XComment Creation Date:Thu Mar 12 16:59:30 PST 1987
XFontName Palatino-BoldItalic
XEncodingScheme AdobeStandardEncoding
XFullName Palatino Bold Italic
XFamilyName Palatino
XWeight Bold
XItalicAngle -10.0


XIsFixedPitch false
XUnderlinePosition -98
XUnderlineThickness 54

XVersion 001.002
XNotice Palatino is a trademark of Allied Corporation.
XFontBBox -166 -281 1073 952
XCapHeight 683
XXHeight 469
XDescender -271
XAscender 726
XStartCharMetrics 228
XC 32 ; WX 250 ; N space ; B 0 0 0 0 ;
XC 33 ; WX 333 ; N exclam ; B 48 -17 322 695 ;
XC 34 ; WX 500 ; N quotedbl ; B 90 367 497 693 ;
XC 35 ; WX 500 ; N numbersign ; B 4 0 496 671 ;
XC 36 ; WX 500 ; N dollar ; B 21 -108 477 737 ;
XC 37 ; WX 889 ; N percent ; B 82 -10 764 683 ;
XC 38 ; WX 833 ; N ampersand ; B 74 -17 811 695 ;
XC 39 ; WX 278 ; N quoteright ; B 76 408 300 695 ;
XC 40 ; WX 333 ; N parenleft ; B 79 -126 389 726 ;
XC 41 ; WX 333 ; N parenright ; B -34 -126 276 726 ;
XC 42 ; WX 444 ; N asterisk ; B 109 326 457 685 ;
XC 43 ; WX 606 ; N plus ; B 50 -5 556 501 ;
XC 44 ; WX 250 ; N comma ; B -33 -164 208 147 ;
XC 45 ; WX 389 ; N hyphen ; B 37 198 361 300 ;
XC 46 ; WX 250 ; N period ; B 54 -17 193 135 ;
XC 47 ; WX 315 ; N slash ; B -4 0 323 726 ;
XC 48 ; WX 500 ; N zero ; B 42 -17 487 683 ;
XC 49 ; WX 500 ; N one ; B 41 -5 434 683 ;
XC 50 ; WX 500 ; N two ; B 1 -5 454 683 ;
XC 51 ; WX 500 ; N three ; B 8 -17 450 683 ;
XC 52 ; WX 500 ; N four ; B 3 -5 487 685 ;
XC 53 ; WX 500 ; N five ; B 7 -17 475 671 ;
XC 54 ; WX 500 ; N six ; B 39 -17 488 683 ;
XC 55 ; WX 500 ; N seven ; B 69 -5 544 671 ;
XC 56 ; WX 500 ; N eight ; B 26 -17 484 683 ;
XC 57 ; WX 500 ; N nine ; B 27 -17 491 683 ;
XC 58 ; WX 250 ; N colon ; B 69 -5 284 452 ;
XC 59 ; WX 250 ; N semicolon ; B -12 -152 265 452 ;
XC 60 ; WX 606 ; N less ; B 49 -21 558 517 ;
XC 61 ; WX 606 ; N equal ; B 51 107 555 390 ;
XC 62 ; WX 606 ; N greater ; B 48 -21 557 517 ;
XC 63 ; WX 444 ; N question ; B 91 -17 450 695 ;
XC 64 ; WX 833 ; N at ; B 42 -17 705 695 ;
XC 65 ; WX 722 ; N A ; B -35 -5 685 683 ;
XC 66 ; WX 667 ; N B ; B 8 -5 629 683 ;
XC 67 ; WX 685 ; N C ; B 72 -17 698 695 ;
XC 68 ; WX 778 ; N D ; B 0 -5 747 683 ;
XC 69 ; WX 611 ; N E ; B 7 -5 606 683 ;
XC 70 ; WX 556 ; N F ; B -1 -5 593 683 ;
XC 71 ; WX 778 ; N G ; B 73 -17 750 695 ;
XC 72 ; WX 778 ; N H ; B -12 -5 818 683 ;
XC 73 ; WX 389 ; N I ; B 0 -5 425 683 ;
XC 74 ; WX 389 ; N J ; B -13 -207 435 683 ;
XC 75 ; WX 722 ; N K ; B 3 -5 758 683 ;
XC 76 ; WX 611 ; N L ; B 23 -5 582 683 ;
XC 77 ; WX 944 ; N M ; B -23 -17 985 683 ;
XC 78 ; WX 778 ; N N ; B -2 -5 829 683 ;
XC 79 ; WX 833 ; N O ; B 73 -17 791 695 ;
XC 80 ; WX 667 ; N P ; B 9 -5 673 683 ;
XC 81 ; WX 833 ; N Q ; B 74 -222 792 695 ;
XC 82 ; WX 722 ; N R ; B 7 -5 700 683 ;
XC 83 ; WX 556 ; N S ; B 42 -17 530 695 ;
XC 84 ; WX 611 ; N T ; B 57 -5 674 683 ;
XC 85 ; WX 778 ; N U ; B 80 -17 822 683 ;
XC 86 ; WX 667 ; N V ; B 67 -5 745 683 ;
XC 87 ; WX 1000 ; N W ; B 68 -5 1073 689 ;
XC 88 ; WX 722 ; N X ; B -9 -5 772 683 ;
XC 89 ; WX 611 ; N Y ; B 54 -5 675 692 ;
XC 90 ; WX 667 ; N Z ; B 1 -5 674 683 ;
XC 91 ; WX 333 ; N bracketleft ; B 42 -102 394 726 ;
XC 92 ; WX 606 ; N backslash ; B 67 0 538 726 ;
XC 93 ; WX 333 ; N bracketright ; B -34 -102 316 726 ;
XC 94 ; WX 606 ; N asciicircum ; B 63 275 543 678 ;
XC 95 ; WX 500 ; N underscore ; B 0 -169 500 -101 ;
XC 96 ; WX 278 ; N quoteleft ; B 65 406 291 695 ;
XC 97 ; WX 556 ; N a ; B 47 -17 521 470 ;
XC 98 ; WX 537 ; N b ; B 44 -17 494 726 ;
XC 99 ; WX 444 ; N c ; B 38 -17 442 469 ;
XC 100 ; WX 556 ; N d ; B 38 -17 553 726 ;
XC 101 ; WX 444 ; N e ; B 31 -17 421 469 ;
XC 102 ; WX 333 ; N f ; B -56 -271 411 726 ; L i fi ; L l fl ;
XC 103 ; WX 500 ; N g ; B -50 -271 529 469 ;
XC 104 ; WX 556 ; N h ; B 24 -17 522 726 ;
XC 105 ; WX 333 ; N i ; B 28 -17 315 695 ;
XC 106 ; WX 333 ; N j ; B -67 -271 321 695 ;
XC 107 ; WX 556 ; N k ; B 38 -17 529 726 ;
XC 108 ; WX 333 ; N l ; B 67 -17 319 726 ;
XC 109 ; WX 833 ; N m ; B 19 -13 804 469 ;
XC 110 ; WX 556 ; N n ; B 17 -17 528 469 ;
XC 111 ; WX 556 ; N o ; B 48 -17 506 469 ;
XC 112 ; WX 556 ; N p ; B -21 -271 517 469 ;
XC 113 ; WX 537 ; N q ; B 32 -271 513 469 ;
XC 114 ; WX 389 ; N r ; B 23 -17 414 468 ;
XC 115 ; WX 444 ; N s ; B 25 -17 406 469 ;
XC 116 ; WX 389 ; N t ; B 45 -16 412 636 ;
XC 117 ; WX 556 ; N u ; B 22 -18 521 467 ;
XC 118 ; WX 556 ; N v ; B 19 -17 513 469 ;
XC 119 ; WX 833 ; N w ; B 15 -17 792 469 ;
XC 120 ; WX 500 ; N x ; B -8 -17 500 469 ;
XC 121 ; WX 556 ; N y ; B 14 -271 541 464 ;
XC 122 ; WX 500 ; N z ; B 58 -17 497 469 ;
XC 123 ; WX 333 ; N braceleft ; B 9 -101 325 726 ;
XC 124 ; WX 606 ; N bar ; B 258 0 347 726 ;
XC 125 ; WX 333 ; N braceright ; B 9 -101 324 726 ;
XC 126 ; WX 606 ; N asciitilde ; B 51 151 555 346 ;
XC 161 ; WX 333 ; N exclamdown ; B 2 -235 257 469 ;
XC 162 ; WX 500 ; N cent ; B 59 -105 463 546 ;
XC 163 ; WX 500 ; N sterling ; B 45 -5 514 683 ;
XC 164 ; WX 167 ; N fraction ; B -166 -17 333 685 ;
XC 165 ; WX 500 ; N yen ; B -11 -5 548 695 ;
XC 166 ; WX 500 ; N florin ; B 15 -250 477 695 ;
XC 167 ; WX 556 ; N section ; B 47 -151 497 695 ;
XC 168 ; WX 500 ; N currency ; B 16 106 483 568 ;
XC 169 ; WX 250 ; N quotesingle ; B 140 367 309 693 ;
XC 170 ; WX 500 ; N quotedblleft ; B 65 406 510 695 ;
XC 171 ; WX 500 ; N guillemotleft ; B 35 43 458 446 ;
XC 172 ; WX 333 ; N guilsinglleft ; B 60 43 292 446 ;
XC 173 ; WX 333 ; N guilsinglright ; B 35 42 266 446 ;
XC 174 ; WX 611 ; N fi ; B -59 -270 602 726 ;
XC 175 ; WX 611 ; N fl ; B -56 -271 612 726 ;
XC 177 ; WX 500 ; N endash ; B -7 214 507 282 ;
XC 178 ; WX 556 ; N dagger ; B 67 -5 499 683 ;
XC 179 ; WX 556 ; N daggerdbl ; B 29 -153 537 693 ;
XC 180 ; WX 250 ; N periodcentered ; B 87 172 226 324 ;
XC 182 ; WX 556 ; N paragraph ; B 14 -204 629 680 ;
XC 183 ; WX 606 ; N bullet ; B 134 171 471 508 ;
XC 184 ; WX 250 ; N quotesinglbase ; B 13 -144 238 145 ;
XC 185 ; WX 500 ; N quotedblbase ; B -20 -144 424 145 ;
XC 186 ; WX 500 ; N quotedblright ; B 75 406 517 695 ;
XC 187 ; WX 500 ; N guillemotright ; B 35 43 457 446 ;
XC 188 ; WX 1000 ; N ellipsis ; B 97 -5 902 147 ;
XC 189 ; WX 1000 ; N perthousand ; B 17 -15 985 678 ;
XC 191 ; WX 444 ; N questiondown ; B -8 -235 348 469 ;
XC 193 ; WX 333 ; N grave ; B 110 531 322 712 ;
XC 194 ; WX 333 ; N acute ; B 164 531 403 712 ;
XC 195 ; WX 333 ; N circumflex ; B 65 531 392 705 ;
XC 196 ; WX 333 ; N tilde ; B 73 551 432 670 ;
XC 197 ; WX 333 ; N macron ; B 76 568 418 638 ;
XC 198 ; WX 333 ; N breve ; B 96 531 412 693 ;
XC 199 ; WX 333 ; N dotaccent ; B 202 541 331 670 ;
XC 200 ; WX 333 ; N dieresis ; B 80 541 422 670 ;
XC 202 ; WX 556 ; N ring ; B 267 525 480 738 ;
XC 203 ; WX 333 ; N cedilla ; B 0 -218 236 5 ;
XC 205 ; WX 333 ; N hungarumlaut ; B -46 531 378 712 ;
XC 206 ; WX 333 ; N ogonek ; B 32 -206 238 -17 ;
XC 207 ; WX 333 ; N caron ; B 104 531 436 705 ;
XC 208 ; WX 1000 ; N emdash ; B -16 214 1015 282 ;
XC 225 ; WX 944 ; N AE ; B -29 -5 933 683 ;
XC 227 ; WX 333 ; N ordfeminine ; B 44 305 355 726 ;
XC 232 ; WX 611 ; N Lslash ; B 23 -5 582 683 ;
XC 233 ; WX 833 ; N Oslash ; B 54 -53 795 732 ;
XC 234 ; WX 944 ; N OE ; B 39 -17 963 695 ;
XC 235 ; WX 333 ; N ordmasculine ; B 48 305 346 726 ;
XC 241 ; WX 738 ; N ae ; B 47 -17 715 469 ;
XC 245 ; WX 333 ; N dotlessi ; B 28 -15 296 468 ;
XC 248 ; WX 333 ; N lslash ; B -1 -17 384 726 ;
XC 249 ; WX 556 ; N oslash ; B 14 -53 522 506 ;
XC 250 ; WX 778 ; N oe ; B 46 -17 755 469 ;
XC 251 ; WX 556 ; N germandbls ; B -58 -281 535 726 ;
XC -1 ; WX 722 ; N Aacute ; B -35 -5 685 926 ;
XC -1 ; WX 722 ; N Acircumflex ; B -35 -5 685 919 ;
XC -1 ; WX 722 ; N Adieresis ; B -35 -5 685 884 ;
XC -1 ; WX 722 ; N Agrave ; B -35 -5 685 926 ;
XC -1 ; WX 722 ; N Aring ; B -35 -5 685 952 ;
XC -1 ; WX 722 ; N Atilde ; B -35 -5 685 884 ;
XC -1 ; WX 685 ; N Ccedilla ; B 72 -218 698 695 ;
XC -1 ; WX 611 ; N Eacute ; B 7 -5 606 926 ;
XC -1 ; WX 611 ; N Ecircumflex ; B 7 -5 606 919 ;
XC -1 ; WX 611 ; N Edieresis ; B 7 -5 606 884 ;
XC -1 ; WX 611 ; N Egrave ; B 7 -5 606 926 ;
XC -1 ; WX 778 ; N Eth ; B 0 -5 747 683 ;
XC -1 ; WX 389 ; N Iacute ; B 0 -5 431 926 ;
XC -1 ; WX 389 ; N Icircumflex ; B 0 -5 425 919 ;
XC -1 ; WX 389 ; N Idieresis ; B 0 -5 450 884 ;
XC -1 ; WX 389 ; N Igrave ; B 0 -5 425 926 ;
XC -1 ; WX 778 ; N Ntilde ; B -2 -5 829 884 ;
XC -1 ; WX 833 ; N Oacute ; B 73 -17 791 926 ;
XC -1 ; WX 833 ; N Ocircumflex ; B 73 -17 791 919 ;
XC -1 ; WX 833 ; N Odieresis ; B 73 -17 791 884 ;
XC -1 ; WX 833 ; N Ograve ; B 73 -17 791 926 ;
XC -1 ; WX 833 ; N Otilde ; B 73 -17 791 884 ;
XC -1 ; WX 556 ; N Scaron ; B 42 -17 548 919 ;
XC -1 ; WX 667 ; N Thorn ; B 9 -5 649 682 ;
XC -1 ; WX 778 ; N Uacute ; B 80 -17 822 926 ;
XC -1 ; WX 778 ; N Ucircumflex ; B 80 -17 822 919 ;
XC -1 ; WX 778 ; N Udieresis ; B 80 -17 822 884 ;
XC -1 ; WX 778 ; N Ugrave ; B 80 -17 822 926 ;
XC -1 ; WX 611 ; N Yacute ; B 54 -5 675 926 ;
XC -1 ; WX 611 ; N Ydieresis ; B 54 -5 675 884 ;
XC -1 ; WX 667 ; N Zcaron ; B 1 -5 674 919 ;
XC -1 ; WX 556 ; N aacute ; B 47 -17 521 712 ;
XC -1 ; WX 556 ; N acircumflex ; B 47 -17 521 705 ;
XC -1 ; WX 556 ; N adieresis ; B 47 -17 534 670 ;
XC -1 ; WX 556 ; N agrave ; B 47 -17 521 712 ;
XC -1 ; WX 556 ; N aring ; B 47 -17 521 738 ;
XC -1 ; WX 556 ; N atilde ; B 47 -17 544 670 ;
XC -1 ; WX 606 ; N brokenbar ; B 258 0 347 726 ;
XC -1 ; WX 444 ; N ccedilla ; B 38 -218 442 469 ;
XC -1 ; WX 747 ; N copyright ; B 76 -17 770 695 ;
XC -1 ; WX 400 ; N degree ; B 130 383 430 683 ;
XC -1 ; WX 606 ; N divide ; B 50 -5 556 501 ;
XC -1 ; WX 444 ; N eacute ; B 31 -17 459 712 ;
XC -1 ; WX 444 ; N ecircumflex ; B 31 -17 448 705 ;
XC -1 ; WX 444 ; N edieresis ; B 31 -17 478 670 ;
XC -1 ; WX 444 ; N egrave ; B 31 -17 421 712 ;
XC -1 ; WX 556 ; N eth ; B 48 -17 508 742 ;
XC -1 ; WX 333 ; N iacute ; B 28 -15 403 712 ;
XC -1 ; WX 333 ; N icircumflex ; B 28 -15 392 705 ;
XC -1 ; WX 333 ; N idieresis ; B 28 -15 422 670 ;
XC -1 ; WX 333 ; N igrave ; B 28 -15 322 712 ;
XC -1 ; WX 606 ; N logicalnot ; B 51 113 555 395 ;
XC -1 ; WX 606 ; N minus ; B 51 205 555 292 ;
XC -1 ; WX 556 ; N mu ; B -15 -232 521 467 ;
XC -1 ; WX 606 ; N multiply ; B 72 17 534 479 ;
XC -1 ; WX 556 ; N ntilde ; B 17 -17 544 670 ;
XC -1 ; WX 556 ; N oacute ; B 48 -17 515 712 ;
XC -1 ; WX 556 ; N ocircumflex ; B 48 -17 506 705 ;
XC -1 ; WX 556 ; N odieresis ; B 48 -17 534 670 ;
XC -1 ; WX 556 ; N ograve ; B 48 -17 506 712 ;
XC -1 ; WX 750 ; N onehalf ; B 14 -17 736 685 ;
XC -1 ; WX 750 ; N onequarter ; B 18 -17 732 685 ;
XC -1 ; WX 300 ; N onesuperior ; B 41 271 296 684 ;
XC -1 ; WX 556 ; N otilde ; B 48 -17 544 670 ;
XC -1 ; WX 606 ; N plusminus ; B 50 0 556 501 ;
XC -1 ; WX 747 ; N registered ; B 77 -17 770 695 ;
XC -1 ; WX 444 ; N scaron ; B 25 -17 492 705 ;
XC -1 ; WX 556 ; N thorn ; B -21 -271 517 726 ;
XC -1 ; WX 750 ; N threequarters ; B 18 -17 732 685 ;
XC -1 ; WX 300 ; N threesuperior ; B 23 263 310 683 ;
XC -1 ; WX 1000 ; N trademark ; B 42 279 982 683 ;
XC -1 ; WX 300 ; N twosuperior ; B 26 271 320 684 ;
XC -1 ; WX 556 ; N uacute ; B 22 -18 521 712 ;
XC -1 ; WX 556 ; N ucircumflex ; B 22 -18 521 705 ;
XC -1 ; WX 556 ; N udieresis ; B 22 -18 534 670 ;
XC -1 ; WX 556 ; N ugrave ; B 22 -18 521 712 ;
XC -1 ; WX 556 ; N yacute ; B 14 -271 541 712 ;
XC -1 ; WX 556 ; N ydieresis ; B 14 -271 541 670 ;
XC -1 ; WX 500 ; N zcaron ; B 58 -17 520 705 ;
XEndCharMetrics
XStartKernData
XStartKernPairs 108


X
XKPX A y -55

XKPX A w -37
XKPX A v -55
XKPX A space -55
XKPX A quoteright -55
XKPX A Y -74
XKPX A W -74
XKPX A V -74
XKPX A T -55
X
XKPX F space -18
XKPX F period -111
XKPX F comma -111


XKPX F A -74
X

XKPX L y -37


XKPX L space -18
XKPX L quoteright -55

XKPX L Y -74
XKPX L W -74
XKPX L V -74
XKPX L T -74
X
XKPX P space -55


XKPX P period -129
XKPX P comma -129
XKPX P A -92
X

XKPX R y -20
XKPX R Y -37
XKPX R W -55
XKPX R V -55
XKPX R T -37
X
XKPX T y -80
XKPX T w -50
XKPX T u -92
XKPX T semicolon -55
XKPX T s -92
XKPX T r -92
XKPX T period -55
XKPX T o -111
XKPX T i -74
XKPX T hyphen -92
XKPX T e -111
XKPX T comma -55


XKPX T colon -55
XKPX T c -92

XKPX T a -111
XKPX T O -18
XKPX T A -55
X
XKPX V y -50
XKPX V u -50
XKPX V semicolon -37
XKPX V r -74
XKPX V period -111
XKPX V o -74
XKPX V i -50
XKPX V hyphen -37
XKPX V e -74
XKPX V comma -111
XKPX V colon -37
XKPX V a -92


XKPX V A -74
X

XKPX W y -30
XKPX W u -30
XKPX W semicolon -18
XKPX W r -30
XKPX W period -55
XKPX W o -55
XKPX W i -30
XKPX W e -55
XKPX W comma -55
XKPX W colon -28
XKPX W a -74
XKPX W A -74
X
XKPX Y v -30
XKPX Y u -50
XKPX Y semicolon -55
XKPX Y q -92
XKPX Y period -55
XKPX Y p -74
XKPX Y o -111
XKPX Y i -54
XKPX Y hyphen -55
XKPX Y e -92
XKPX Y comma -55
XKPX Y colon -55
XKPX Y a -111
XKPX Y A -55
X
XKPX f quoteright 37
XKPX f f -37
X
XKPX one one -55
X
XKPX quoteleft quoteleft -55
X
XKPX quoteright t -18
XKPX quoteright space -37
XKPX quoteright s -37
XKPX quoteright quoteright -55


X
XKPX r quoteright 55

XKPX r q -18
XKPX r period -55
XKPX r o -18
XKPX r h -18
XKPX r g -18
XKPX r e -18
XKPX r comma -55
XKPX r c -18
X
XKPX v period -55
XKPX v comma -55
X
XKPX w period -55
XKPX w comma -55
X
XKPX y period -37
XKPX y comma -37
XEndKernPairs
XEndKernData
XStartComposites 58
XCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 167 214 ;
XCC zcaron 2 ; PCC z 0 0 ; PCC caron 83 0 ;
XCC Scaron 2 ; PCC S 0 0 ; PCC caron 111 214 ;
XCC scaron 2 ; PCC s 0 0 ; PCC caron 55 0 ;
XCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 176 0 ;
XCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 55 0 ;
XCC Yacute 2 ; PCC Y 0 0 ; PCC acute 139 214 ;
XCC yacute 2 ; PCC y 0 0 ; PCC acute 111 0 ;
XCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 139 214 ;
XCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 111 0 ;
XCC Uacute 2 ; PCC U 0 0 ; PCC acute 222 214 ;
XCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 222 214 ;
XCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 222 214 ;
XCC Ugrave 2 ; PCC U 0 0 ; PCC grave 222 214 ;
XCC uacute 2 ; PCC u 0 0 ; PCC acute 111 0 ;
XCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 111 0 ;
XCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 111 0 ;
XCC ugrave 2 ; PCC u 0 0 ; PCC grave 111 0 ;
XCC Iacute 2 ; PCC I 0 0 ; PCC acute 28 214 ;
XCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex 28 214 ;
XCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis 28 214 ;
XCC Igrave 2 ; PCC I 0 0 ; PCC grave 28 214 ;
XCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute 0 0 ;
XCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex 0 0 ;
XCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis 0 0 ;
XCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave 0 0 ;
XCC Eacute 2 ; PCC E 0 0 ; PCC acute 139 214 ;
XCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 139 214 ;
XCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 139 214 ;
XCC Egrave 2 ; PCC E 0 0 ; PCC grave 139 214 ;
XCC eacute 2 ; PCC e 0 0 ; PCC acute 55 0 ;
XCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 55 0 ;
XCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 55 0 ;
XCC egrave 2 ; PCC e 0 0 ; PCC grave 55 0 ;
XCC Aacute 2 ; PCC A 0 0 ; PCC acute 194 214 ;
XCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 194 214 ;
XCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 194 214 ;
XCC Agrave 2 ; PCC A 0 0 ; PCC grave 194 214 ;
XCC aacute 2 ; PCC a 0 0 ; PCC acute 111 0 ;
XCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 111 0 ;
XCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 111 0 ;
XCC agrave 2 ; PCC a 0 0 ; PCC grave 111 0 ;
XCC Oacute 2 ; PCC O 0 0 ; PCC acute 250 214 ;
XCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 250 214 ;
XCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 250 214 ;
XCC Ograve 2 ; PCC O 0 0 ; PCC grave 250 214 ;
XCC oacute 2 ; PCC o 0 0 ; PCC acute 111 0 ;
XCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 111 0 ;
XCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 111 0 ;
XCC ograve 2 ; PCC o 0 0 ; PCC grave 111 0 ;
XCC Atilde 2 ; PCC A 0 0 ; PCC tilde 194 214 ;
XCC atilde 2 ; PCC a 0 0 ; PCC tilde 111 0 ;
XCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 222 214 ;
XCC ntilde 2 ; PCC n 0 0 ; PCC tilde 111 0 ;
XCC Otilde 2 ; PCC O 0 0 ; PCC tilde 250 214 ;
XCC otilde 2 ; PCC o 0 0 ; PCC tilde 111 0 ;
XCC Aring 2 ; PCC A 0 0 ; PCC ring 83 214 ;
XCC aring 2 ; PCC a 0 0 ; PCC ring 0 0 ;
XEndComposites
XEndFontMetrics
END_OF_FILE
if test 15599 -ne `wc -c <'lout/font0/PalatBolIta.AFM'`; then
echo shar: \"'lout/font0/PalatBolIta.AFM'\" unpacked with wrong size!
fi
# end of 'lout/font0/PalatBolIta.AFM'
fi
if test -f 'lout/font0/TimesBol.AFM' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/font0/TimesBol.AFM'\"
else
echo shar: Extracting \"'lout/font0/TimesBol.AFM'\" \(15712 characters\)
sed "s/^X//" >'lout/font0/TimesBol.AFM' <<'END_OF_FILE'


XStartFontMetrics 2.0
XComment Copyright (c) 1984 Adobe Systems Incorporated. All Rights Reserved.

XComment Creation Date:Sun Feb 8 02:56:11 PST 1987
XFontName Times-Bold
XEncodingScheme AdobeStandardEncoding
XFullName Times Bold
XFamilyName Times
XWeight Bold
XItalicAngle 0.0
XIsFixedPitch false
XUnderlinePosition -99
XUnderlineThickness 95


XVersion 001.002
XNotice Times is a trademark of Allied Corporation.

XFontBBox -172 -256 1008 965
XCapHeight 681
XXHeight 460
XDescender -210
XAscender 670
XStartCharMetrics 228
XC 32 ; WX 250 ; N space ; B 0 0 0 0 ;
XC 33 ; WX 333 ; N exclam ; B 84 -18 248 690 ;
XC 34 ; WX 555 ; N quotedbl ; B 67 371 425 690 ;
XC 35 ; WX 500 ; N numbersign ; B -13 -17 514 684 ;
XC 36 ; WX 500 ; N dollar ; B 28 -116 474 732 ;
XC 37 ; WX 1000 ; N percent ; B 122 -11 881 692 ;
XC 38 ; WX 833 ; N ampersand ; B 54 -17 773 690 ;
XC 39 ; WX 333 ; N quoteright ; B 77 347 257 680 ;
XC 40 ; WX 333 ; N parenleft ; B 49 -169 301 699 ;
XC 41 ; WX 333 ; N parenright ; B 26 -169 278 699 ;
XC 42 ; WX 500 ; N asterisk ; B 57 262 445 690 ;
XC 43 ; WX 570 ; N plus ; B 50 -10 520 460 ;
XC 44 ; WX 250 ; N comma ; B 37 -181 214 157 ;
XC 45 ; WX 333 ; N hyphen ; B 48 170 283 285 ;
XC 46 ; WX 250 ; N period ; B 43 -19 207 145 ;
XC 47 ; WX 278 ; N slash ; B 1 -17 279 750 ;
XC 48 ; WX 500 ; N zero ; B 26 -18 472 690 ;
XC 49 ; WX 500 ; N one ; B 61 0 448 690 ;
XC 50 ; WX 500 ; N two ; B 18 0 473 683 ;
XC 51 ; WX 500 ; N three ; B 17 -19 463 683 ;
XC 52 ; WX 500 ; N four ; B 23 0 472 681 ;
XC 53 ; WX 500 ; N five ; B 23 -17 465 681 ;
XC 54 ; WX 500 ; N six ; B 30 -18 470 684 ;
XC 55 ; WX 500 ; N seven ; B 23 0 468 679 ;
XC 56 ; WX 500 ; N eight ; B 22 -17 470 685 ;
XC 57 ; WX 500 ; N nine ; B 26 -18 468 684 ;
XC 58 ; WX 333 ; N colon ; B 83 -18 247 473 ;
XC 59 ; WX 333 ; N semicolon ; B 85 -181 262 472 ;
XC 60 ; WX 570 ; N less ; B 45 -10 520 460 ;
XC 61 ; WX 570 ; N equal ; B 50 91 520 375 ;
XC 62 ; WX 570 ; N greater ; B 50 -10 525 460 ;
XC 63 ; WX 500 ; N question ; B 57 -17 438 681 ;
XC 64 ; WX 930 ; N at ; B 50 -147 889 677 ;
XC 65 ; WX 722 ; N A ; B 22 0 696 681 ;
XC 66 ; WX 667 ; N B ; B 24 0 609 681 ;
XC 67 ; WX 722 ; N C ; B 42 -17 669 690 ;
XC 68 ; WX 722 ; N D ; B 22 0 684 681 ;
XC 69 ; WX 667 ; N E ; B 21 0 637 681 ;
XC 70 ; WX 611 ; N F ; B 17 0 582 681 ;
XC 71 ; WX 778 ; N G ; B 41 -17 748 690 ;
XC 72 ; WX 778 ; N H ; B 26 0 748 681 ;
XC 73 ; WX 389 ; N I ; B 17 0 366 680 ;
XC 74 ; WX 500 ; N J ; B 9 -89 475 681 ;
XC 75 ; WX 778 ; N K ; B 29 0 761 681 ;
XC 76 ; WX 667 ; N L ; B 21 0 633 681 ;
XC 77 ; WX 944 ; N M ; B 21 0 914 681 ;
XC 78 ; WX 722 ; N N ; B 20 -10 697 681 ;
XC 79 ; WX 778 ; N O ; B 43 -18 733 690 ;
XC 80 ; WX 611 ; N P ; B 24 0 593 681 ;
XC 81 ; WX 778 ; N Q ; B 24 -182 751 690 ;
XC 82 ; WX 722 ; N R ; B 26 0 695 681 ;
XC 83 ; WX 556 ; N S ; B 43 -19 506 690 ;
XC 84 ; WX 667 ; N T ; B 30 0 629 681 ;
XC 85 ; WX 722 ; N U ; B 20 -19 700 681 ;
XC 86 ; WX 722 ; N V ; B 22 -18 696 681 ;
XC 87 ; WX 1000 ; N W ; B 19 -18 979 680 ;
XC 88 ; WX 722 ; N X ; B 23 0 695 681 ;
XC 89 ; WX 722 ; N Y ; B 19 0 697 680 ;
XC 90 ; WX 667 ; N Z ; B 37 0 624 681 ;
XC 91 ; WX 333 ; N bracketleft ; B 73 -142 296 674 ;
XC 92 ; WX 278 ; N backslash ; B 1 -17 279 750 ;
XC 93 ; WX 333 ; N bracketright ; B 38 -142 261 674 ;
XC 94 ; WX 581 ; N asciicircum ; B 102 290 486 690 ;
XC 95 ; WX 500 ; N underscore ; B -2 -256 502 -182 ;
XC 96 ; WX 333 ; N quoteleft ; B 72 357 252 691 ;
XC 97 ; WX 500 ; N a ; B 25 -19 484 472 ;
XC 98 ; WX 556 ; N b ; B 29 -18 512 670 ;
XC 99 ; WX 444 ; N c ; B 24 -17 423 472 ;
XC 100 ; WX 556 ; N d ; B 31 -17 523 670 ;
XC 101 ; WX 444 ; N e ; B 25 -18 415 474 ;
XC 102 ; WX 333 ; N f ; B 20 0 386 690 ; L i fi ; L l fl ;
XC 103 ; WX 500 ; N g ; B 25 -210 474 472 ;
XC 104 ; WX 556 ; N h ; B 29 0 523 670 ;
XC 105 ; WX 278 ; N i ; B 27 0 249 690 ;
XC 106 ; WX 333 ; N j ; B -57 -212 256 690 ;
XC 107 ; WX 556 ; N k ; B 24 0 528 670 ;
XC 108 ; WX 278 ; N l ; B 25 0 247 670 ;
XC 109 ; WX 833 ; N m ; B 28 0 804 471 ;
XC 110 ; WX 556 ; N n ; B 28 0 523 473 ;
XC 111 ; WX 500 ; N o ; B 25 -18 473 472 ;
XC 112 ; WX 556 ; N p ; B 30 -210 513 473 ;
XC 113 ; WX 556 ; N q ; B 32 -210 535 472 ;
XC 114 ; WX 444 ; N r ; B 29 0 417 473 ;
XC 115 ; WX 389 ; N s ; B 29 -17 359 472 ;
XC 116 ; WX 333 ; N t ; B 22 -19 320 627 ;
XC 117 ; WX 556 ; N u ; B 23 -17 524 460 ;
XC 118 ; WX 500 ; N v ; B 20 -14 479 460 ;
XC 119 ; WX 722 ; N w ; B 10 -14 709 460 ;
XC 120 ; WX 500 ; N x ; B 11 0 488 460 ;
XC 121 ; WX 500 ; N y ; B 19 -212 475 460 ;
XC 122 ; WX 444 ; N z ; B 25 0 414 460 ;
XC 123 ; WX 394 ; N braceleft ; B 44 -142 342 674 ;
XC 124 ; WX 220 ; N bar ; B 77 -195 151 720 ;
XC 125 ; WX 394 ; N braceright ; B 38 -142 336 674 ;
XC 126 ; WX 520 ; N asciitilde ; B 19 237 493 461 ;
XC 161 ; WX 333 ; N exclamdown ; B 85 -210 249 498 ;
XC 162 ; WX 500 ; N cent ; B 44 -148 460 586 ;
XC 163 ; WX 500 ; N sterling ; B 25 -17 471 682 ;
XC 164 ; WX 167 ; N fraction ; B -172 -17 335 690 ;
XC 165 ; WX 500 ; N yen ; B -20 0 521 681 ;
XC 166 ; WX 500 ; N florin ; B 2 -157 496 713 ;
XC 167 ; WX 500 ; N section ; B 63 -148 438 677 ;


XC 168 ; WX 500 ; N currency ; B 3 105 498 604 ;

XC 169 ; WX 278 ; N quotesingle ; B 69 371 205 690 ;
XC 170 ; WX 500 ; N quotedblleft ; B 33 346 479 679 ;
XC 171 ; WX 500 ; N guillemotleft ; B 25 44 471 436 ;
XC 172 ; WX 333 ; N guilsinglleft ; B 51 44 302 436 ;
XC 173 ; WX 333 ; N guilsinglright ; B 26 44 277 436 ;
XC 174 ; WX 556 ; N fi ; B 24 0 532 690 ;
XC 175 ; WX 556 ; N fl ; B 25 0 529 691 ;
XC 177 ; WX 500 ; N endash ; B -4 179 500 270 ;
XC 178 ; WX 500 ; N dagger ; B 52 -141 446 690 ;
XC 179 ; WX 500 ; N daggerdbl ; B 57 -138 451 681 ;
XC 180 ; WX 250 ; N periodcentered ; B 43 270 167 394 ;
XC 182 ; WX 540 ; N paragraph ; B 30 -190 533 681 ;


XC 183 ; WX 350 ; N bullet ; B 50 175 300 425 ;

XC 184 ; WX 333 ; N quotesinglbase ; B 77 -179 257 154 ;
XC 185 ; WX 500 ; N quotedblbase ; B 31 -179 477 154 ;
XC 186 ; WX 500 ; N quotedblright ; B 31 347 477 680 ;
XC 187 ; WX 500 ; N guillemotright ; B 24 44 470 436 ;
XC 188 ; WX 1000 ; N ellipsis ; B 85 -18 915 146 ;
XC 189 ; WX 1000 ; N perthousand ; B 1 -55 993 718 ;
XC 191 ; WX 500 ; N questiondown ; B 56 -210 437 488 ;
XC 193 ; WX 333 ; N grave ; B 26 523 242 695 ;
XC 194 ; WX 333 ; N acute ; B 83 523 299 695 ;
XC 195 ; WX 333 ; N circumflex ; B 28 520 304 690 ;
XC 196 ; WX 333 ; N tilde ; B 34 559 298 671 ;
XC 197 ; WX 333 ; N macron ; B 34 543 297 600 ;
XC 198 ; WX 333 ; N breve ; B 32 529 300 667 ;
XC 199 ; WX 333 ; N dotaccent ; B 112 515 222 625 ;
XC 200 ; WX 333 ; N dieresis ; B 33 556 297 652 ;
XC 202 ; WX 333 ; N ring ; B 55 522 279 746 ;
XC 203 ; WX 333 ; N cedilla ; B 42 -211 293 -10 ;
XC 205 ; WX 333 ; N hungarumlaut ; B 32 539 320 753 ;
XC 206 ; WX 333 ; N ogonek ; B 60 -179 277 70 ;
XC 207 ; WX 333 ; N caron ; B 32 520 298 690 ;
XC 208 ; WX 1000 ; N emdash ; B -2 185 1008 280 ;
XC 225 ; WX 1000 ; N AE ; B 19 0 954 681 ;
XC 227 ; WX 300 ; N ordfeminine ; B 12 286 288 685 ;
XC 232 ; WX 667 ; N Lslash ; B 0 0 612 681 ;
XC 233 ; WX 778 ; N Oslash ; B 45 -75 735 740 ;
XC 234 ; WX 1000 ; N OE ; B 24 -7 979 683 ;
XC 235 ; WX 330 ; N ordmasculine ; B 31 286 299 685 ;
XC 241 ; WX 722 ; N ae ; B 30 -17 691 474 ;
XC 245 ; WX 278 ; N dotlessi ; B 28 0 250 460 ;
XC 248 ; WX 278 ; N lslash ; B 0 0 326 670 ;
XC 249 ; WX 500 ; N oslash ; B 27 -95 474 550 ;
XC 250 ; WX 722 ; N oe ; B 26 -17 689 473 ;
XC 251 ; WX 556 ; N germandbls ; B 22 -18 513 689 ;
XC -1 ; WX 722 ; N Aacute ; B 22 0 696 914 ;
XC -1 ; WX 722 ; N Acircumflex ; B 22 0 696 909 ;
XC -1 ; WX 722 ; N Adieresis ; B 22 0 696 871 ;
XC -1 ; WX 722 ; N Agrave ; B 22 0 696 914 ;
XC -1 ; WX 722 ; N Aring ; B 22 0 696 965 ;
XC -1 ; WX 722 ; N Atilde ; B 22 0 696 890 ;
XC -1 ; WX 722 ; N Ccedilla ; B 42 -211 669 690 ;
XC -1 ; WX 667 ; N Eacute ; B 21 0 637 914 ;
XC -1 ; WX 667 ; N Ecircumflex ; B 21 0 637 909 ;
XC -1 ; WX 667 ; N Edieresis ; B 21 0 637 871 ;
XC -1 ; WX 667 ; N Egrave ; B 21 0 637 914 ;
XC -1 ; WX 722 ; N Eth ; B 22 0 685 681 ;
XC -1 ; WX 389 ; N Iacute ; B 17 0 366 914 ;
XC -1 ; WX 389 ; N Icircumflex ; B 17 0 366 909 ;
XC -1 ; WX 389 ; N Idieresis ; B 17 0 366 871 ;
XC -1 ; WX 389 ; N Igrave ; B 17 0 366 914 ;
XC -1 ; WX 722 ; N Ntilde ; B 20 -10 697 890 ;
XC -1 ; WX 778 ; N Oacute ; B 43 -18 733 914 ;
XC -1 ; WX 778 ; N Ocircumflex ; B 43 -18 733 909 ;
XC -1 ; WX 778 ; N Odieresis ; B 43 -18 733 871 ;
XC -1 ; WX 778 ; N Ograve ; B 43 -18 733 914 ;
XC -1 ; WX 778 ; N Otilde ; B 43 -18 733 890 ;
XC -1 ; WX 556 ; N Scaron ; B 43 -19 506 909 ;
XC -1 ; WX 611 ; N Thorn ; B 24 0 594 681 ;
XC -1 ; WX 722 ; N Uacute ; B 20 -19 700 914 ;
XC -1 ; WX 722 ; N Ucircumflex ; B 20 -19 700 909 ;
XC -1 ; WX 722 ; N Udieresis ; B 20 -19 700 871 ;
XC -1 ; WX 722 ; N Ugrave ; B 20 -19 700 914 ;
XC -1 ; WX 722 ; N Yacute ; B 19 0 697 916 ;
XC -1 ; WX 722 ; N Ydieresis ; B 19 0 697 871 ;
XC -1 ; WX 667 ; N Zcaron ; B 37 0 624 909 ;
XC -1 ; WX 500 ; N aacute ; B 25 -19 484 695 ;
XC -1 ; WX 500 ; N acircumflex ; B 25 -19 484 690 ;
XC -1 ; WX 500 ; N adieresis ; B 25 -19 484 652 ;
XC -1 ; WX 500 ; N agrave ; B 25 -19 484 695 ;
XC -1 ; WX 500 ; N aring ; B 25 -19 484 746 ;
XC -1 ; WX 500 ; N atilde ; B 25 -19 484 671 ;
XC -1 ; WX 220 ; N brokenbar ; B 77 -195 151 720 ;
XC -1 ; WX 444 ; N ccedilla ; B 24 -211 423 472 ;
XC -1 ; WX 747 ; N copyright ; B 16 -17 730 690 ;
XC -1 ; WX 400 ; N degree ; B 50 390 350 690 ;
XC -1 ; WX 570 ; N divide ; B 50 -10 520 460 ;
XC -1 ; WX 444 ; N eacute ; B 25 -18 415 695 ;
XC -1 ; WX 444 ; N ecircumflex ; B 25 -18 415 690 ;
XC -1 ; WX 444 ; N edieresis ; B 25 -18 415 652 ;
XC -1 ; WX 444 ; N egrave ; B 25 -18 415 695 ;
XC -1 ; WX 500 ; N eth ; B 26 -17 474 670 ;
XC -1 ; WX 278 ; N iacute ; B 28 0 265 695 ;
XC -1 ; WX 278 ; N icircumflex ; B -6 0 270 690 ;
XC -1 ; WX 278 ; N idieresis ; B -1 0 263 652 ;
XC -1 ; WX 278 ; N igrave ; B -8 0 250 695 ;
XC -1 ; WX 570 ; N logicalnot ; B 50 94 520 375 ;
XC -1 ; WX 570 ; N minus ; B 50 188 520 262 ;
XC -1 ; WX 556 ; N mu ; B 23 -210 524 460 ;
XC -1 ; WX 570 ; N multiply ; B 50 -10 520 460 ;
XC -1 ; WX 556 ; N ntilde ; B 28 0 523 671 ;
XC -1 ; WX 500 ; N oacute ; B 25 -18 473 695 ;
XC -1 ; WX 500 ; N ocircumflex ; B 25 -18 473 690 ;
XC -1 ; WX 500 ; N odieresis ; B 25 -18 473 652 ;
XC -1 ; WX 500 ; N ograve ; B 25 -18 473 695 ;
XC -1 ; WX 750 ; N onehalf ; B 30 -18 720 690 ;
XC -1 ; WX 750 ; N onequarter ; B 30 -18 720 690 ;
XC -1 ; WX 300 ; N onesuperior ; B 24 276 275 690 ;
XC -1 ; WX 500 ; N otilde ; B 25 -18 473 671 ;
XC -1 ; WX 570 ; N plusminus ; B 50 0 520 600 ;
XC -1 ; WX 747 ; N registered ; B 16 -17 730 690 ;
XC -1 ; WX 389 ; N scaron ; B 29 -17 359 690 ;
XC -1 ; WX 556 ; N thorn ; B 30 -210 513 670 ;
XC -1 ; WX 750 ; N threequarters ; B 30 -18 720 690 ;
XC -1 ; WX 300 ; N threesuperior ; B 5 269 294 690 ;
XC -1 ; WX 1000 ; N trademark ; B 30 277 970 681 ;
XC -1 ; WX 300 ; N twosuperior ; B 2 276 298 686 ;
XC -1 ; WX 556 ; N uacute ; B 23 -17 524 695 ;
XC -1 ; WX 556 ; N ucircumflex ; B 23 -17 524 690 ;
XC -1 ; WX 556 ; N udieresis ; B 23 -17 524 652 ;
XC -1 ; WX 556 ; N ugrave ; B 23 -17 524 695 ;
XC -1 ; WX 500 ; N yacute ; B 19 -212 475 695 ;
XC -1 ; WX 500 ; N ydieresis ; B 19 -212 475 652 ;
XC -1 ; WX 444 ; N zcaron ; B 25 0 414 690 ;
XEndCharMetrics
XStartKernData
XStartKernPairs 124
X
XKPX A y -74
XKPX A w -74
XKPX A v -74
XKPX A space -55
XKPX A quoteright -74
XKPX A Y -92
XKPX A W -111
XKPX A V -129


XKPX A T -74
X

XKPX F space -37
XKPX F period -92
XKPX F comma -92


XKPX F A -74
X
XKPX L y -55

XKPX L space -55
XKPX L quoteright -92
XKPX L Y -92
XKPX L W -92
XKPX L V -92
XKPX L T -92
X
XKPX P space -55
XKPX P period -92
XKPX P comma -92
XKPX P A -74
X
XKPX R y -35
XKPX R Y -35
XKPX R W -35
XKPX R V -35
XKPX R T -35


X
XKPX T y -74
XKPX T w -74

XKPX T u -92
XKPX T space -18
XKPX T semicolon -74
XKPX T s -92
XKPX T r -74


XKPX T period -74
XKPX T o -92

XKPX T i -18
XKPX T hyphen -92


XKPX T e -92
XKPX T comma -74

XKPX T colon -74


XKPX T c -92
XKPX T a -92
XKPX T O -18
XKPX T A -74
X
XKPX V y -92

XKPX V u -92
XKPX V space -18
XKPX V semicolon -92


XKPX V r -74
XKPX V period -129

XKPX V o -92
XKPX V i -37
XKPX V hyphen -74
XKPX V e -92
XKPX V comma -129
XKPX V colon -92
XKPX V a -92
XKPX V O -20


XKPX V A -129
X

XKPX W y -37
XKPX W u -18
XKPX W space -18
XKPX W semicolon -55
XKPX W r -18
XKPX W period -92
XKPX W o -55
XKPX W i -18
XKPX W hyphen -37
XKPX W e -55
XKPX W comma -92
XKPX W colon -55
XKPX W a -55
XKPX W A -111
X
XKPX Y v -111
XKPX Y u -92
XKPX Y space -37
XKPX Y semicolon -92


XKPX Y q -111
XKPX Y period -92
XKPX Y p -92

XKPX Y o -111
XKPX Y i -37
XKPX Y hyphen -92
XKPX Y e -111
XKPX Y comma -92
XKPX Y colon -92
XKPX Y a -111
XKPX Y A -92
X
XKPX f quoteright 55
XKPX f f 0
X
XKPX one one -55
X
XKPX quoteleft quoteleft -74
X
XKPX quoteright space -74
XKPX quoteright s -37
XKPX quoteright quoteright -74
X
XKPX r z 0


XKPX r y 0
XKPX r x 0
XKPX r w 0

XKPX r t 0
XKPX r space -18
XKPX r quoteright 18
XKPX r q -18
XKPX r period -92
XKPX r o -18
XKPX r hyphen -37
XKPX r h 0
XKPX r e -18
XKPX r comma -92
XKPX r c -18
X
XKPX space Y -37
XKPX space W -18
XKPX space V -18
XKPX space T -18
XKPX space A -55
X
XKPX v period -55
XKPX v comma -55
X
XKPX w period -55
XKPX w comma -55


X
XKPX y period -55
XKPX y comma -55
XEndKernPairs
XEndKernData
XStartComposites 58

XCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 167 219 ;
XCC zcaron 2 ; PCC z 0 0 ; PCC caron 55 0 ;
XCC Scaron 2 ; PCC S 0 0 ; PCC caron 111 219 ;
XCC scaron 2 ; PCC s 0 0 ; PCC caron 28 0 ;
XCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 207 0 ;
XCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 68 0 ;
XCC Yacute 2 ; PCC Y 0 0 ; PCC acute 194 221 ;
XCC yacute 2 ; PCC y 0 0 ; PCC acute 83 0 ;
XCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 194 219 ;


XCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 83 0 ;

XCC Uacute 2 ; PCC U 0 0 ; PCC acute 221 219 ;
XCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 221 219 ;
XCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 221 219 ;
XCC Ugrave 2 ; PCC U 0 0 ; PCC grave 221 219 ;
XCC uacute 2 ; PCC u 0 0 ; PCC acute 104 0 ;
XCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 104 0 ;
XCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 104 0 ;
XCC ugrave 2 ; PCC u 0 0 ; PCC grave 104 0 ;
XCC Iacute 2 ; PCC I 0 0 ; PCC acute 28 219 ;
XCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex 28 219 ;
XCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis 28 219 ;
XCC Igrave 2 ; PCC I 0 0 ; PCC grave 28 219 ;
XCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -34 0 ;
XCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -34 0 ;
XCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -34 0 ;
XCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -34 0 ;
XCC Eacute 2 ; PCC E 0 0 ; PCC acute 174 219 ;
XCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 174 219 ;
XCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 174 219 ;
XCC Egrave 2 ; PCC E 0 0 ; PCC grave 174 219 ;
XCC eacute 2 ; PCC e 0 0 ; PCC acute 61 0 ;
XCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 61 0 ;
XCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 61 0 ;
XCC egrave 2 ; PCC e 0 0 ; PCC grave 61 0 ;
XCC Aacute 2 ; PCC A 0 0 ; PCC acute 187 219 ;
XCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 187 219 ;
XCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 187 219 ;
XCC Agrave 2 ; PCC A 0 0 ; PCC grave 187 219 ;
XCC aacute 2 ; PCC a 0 0 ; PCC acute 76 0 ;
XCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 76 0 ;
XCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 76 0 ;
XCC agrave 2 ; PCC a 0 0 ; PCC grave 76 0 ;
XCC Oacute 2 ; PCC O 0 0 ; PCC acute 222 219 ;
XCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 222 219 ;
XCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 222 219 ;
XCC Ograve 2 ; PCC O 0 0 ; PCC grave 222 219 ;
XCC oacute 2 ; PCC o 0 0 ; PCC acute 83 0 ;
XCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 83 0 ;
XCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 83 0 ;
XCC ograve 2 ; PCC o 0 0 ; PCC grave 83 0 ;
XCC Atilde 2 ; PCC A 0 0 ; PCC tilde 187 219 ;
XCC atilde 2 ; PCC a 0 0 ; PCC tilde 76 0 ;
XCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 194 219 ;
XCC ntilde 2 ; PCC n 0 0 ; PCC tilde 111 0 ;
XCC Otilde 2 ; PCC O 0 0 ; PCC tilde 222 219 ;
XCC otilde 2 ; PCC o 0 0 ; PCC tilde 83 0 ;
XCC Aring 2 ; PCC A 0 0 ; PCC ring 187 219 ;
XCC aring 2 ; PCC a 0 0 ; PCC ring 76 0 ;
XEndComposites
XEndFontMetrics
END_OF_FILE
if test 15712 -ne `wc -c <'lout/font0/TimesBol.AFM'`; then
echo shar: \"'lout/font0/TimesBol.AFM'\" unpacked with wrong size!
fi
# end of 'lout/font0/TimesBol.AFM'
fi
echo shar: End of archive 15 \(of 30\).
cp /dev/null ark15isdone

Jeff Kingston

unread,
Jun 1, 1993, 1:21:26 AM6/1/93
to
Submitted-by: je...@joyce.cs.su.oz.au (Jeff Kingston)
Posting-number: Volume 37, Issue 114
Archive-name: lout/part16
Environment: UNIX

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: lout/doc/tr.over/README lout/font0/HelveConObl.AFM
# lout/font0/HelveNarBolObl.AFM lout/font0/NewCenSchBol.AFM
# lout/font0/PalatRom.AFM lout/font0/TimesRom.AFM
# Wrapped by kent@sparky on Sun May 30 19:43:58 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 16 (of 30)."'
if test -f 'lout/doc/tr.over/README' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.over/README'\"
else
echo shar: Extracting \"'lout/doc/tr.over/README'\" \(665 characters\)
sed "s/^X//" >'lout/doc/tr.over/README' <<'END_OF_FILE'
XDirectory lout/doc/tr.over
X
XThis directory contains the Lout source files for the
Xreport entitled `A new approach to document formatting',
Xwhich has so far been submitted to two journals without
Xsuccess. I still think it's worth reading! To produce
Xthe report, type the command
X
X lout setup s? > outfile.ps
X
Xin this directory. This must be done three times to
Xcompletely resolve all cross references, although
Xthe PostScript file outfile.ps is printable after
Xthe first run. Auxiliary files with .li and .ld
Xsuffixes will be created in this directory. A copy
Xof the final outfile.ps is included.
X
XJeffrey H. Kingston
X15 August 1991
XReformatted 23 December 1992
END_OF_FILE
if test 665 -ne `wc -c <'lout/doc/tr.over/README'`; then
echo shar: \"'lout/doc/tr.over/README'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.over/README'
fi
if test -f 'lout/font0/HelveConObl.AFM' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/font0/HelveConObl.AFM'\"
else
echo shar: Extracting \"'lout/font0/HelveConObl.AFM'\" \(15569 characters\)
sed "s/^X//" >'lout/font0/HelveConObl.AFM' <<'END_OF_FILE'


XStartFontMetrics 2.0
XComment Copyright (c) 1984 Adobe Systems Incorporated. All Rights Reserved.

XComment Creation Date:Mon Mar 30 17:13:40 PST 1987
XFontName Helvetica-Condensed-Oblique
XEncodingScheme AdobeStandardEncoding
XFullName Helvetica.Condensed Oblique
XFamilyName Helvetica
XWeight MediumCondensed


XItalicAngle -12.0
XIsFixedPitch false
XUnderlinePosition -90
XUnderlineThickness 58

XVersion 001.001
XNotice Helvetica is a trademark of Allied Corporation.
XFontBBox -174 -224 1118 990
XCapHeight 750
XXHeight 556
XDescender -188
XAscender 750
XStartCharMetrics 228
XC 32 ; WX 250 ; N space ; B 0 0 0 0 ;
XC 33 ; WX 333 ; N exclam ; B 121 0 371 750 ;
XC 34 ; WX 250 ; N quotedbl ; B 153 513 364 739 ;
XC 35 ; WX 500 ; N numbersign ; B 33 0 621 750 ;
XC 36 ; WX 500 ; N dollar ; B 69 -116 569 815 ;
XC 37 ; WX 833 ; N percent ; B 164 -15 803 750 ;
XC 38 ; WX 667 ; N ampersand ; B 111 -18 648 750 ;
XC 39 ; WX 222 ; N quoteright ; B 171 504 317 750 ;
XC 40 ; WX 333 ; N parenleft ; B 116 -215 443 750 ;
XC 41 ; WX 333 ; N parenright ; B 3 -215 331 750 ;
XC 42 ; WX 500 ; N asterisk ; B 229 455 537 750 ;
XC 43 ; WX 500 ; N plus ; B 91 0 518 505 ;
XC 44 ; WX 250 ; N comma ; B 49 -146 192 100 ;
XC 45 ; WX 333 ; N hyphen ; B 103 275 364 358 ;
XC 46 ; WX 250 ; N period ; B 80 0 192 100 ;
XC 47 ; WX 278 ; N slash ; B -19 -27 450 750 ;
XC 48 ; WX 500 ; N zero ; B 98 -15 563 750 ;
XC 49 ; WX 500 ; N one ; B 190 0 476 750 ;
XC 50 ; WX 500 ; N two ; B 44 0 562 750 ;
XC 51 ; WX 500 ; N three ; B 73 -15 552 750 ;
XC 52 ; WX 500 ; N four ; B 68 0 543 750 ;
XC 53 ; WX 500 ; N five ; B 75 -15 575 735 ;
XC 54 ; WX 500 ; N six ; B 91 -15 566 750 ;
XC 55 ; WX 500 ; N seven ; B 116 0 612 735 ;
XC 56 ; WX 500 ; N eight ; B 83 -15 559 750 ;
XC 57 ; WX 500 ; N nine ; B 91 -15 566 750 ;
XC 58 ; WX 250 ; N colon ; B 80 0 287 547 ;
XC 59 ; WX 250 ; N semicolon ; B 49 -146 287 547 ;
XC 60 ; WX 500 ; N less ; B 89 -10 569 518 ;
XC 61 ; WX 500 ; N equal ; B 70 124 539 384 ;
XC 62 ; WX 500 ; N greater ; B 40 -10 520 518 ;
XC 63 ; WX 500 ; N question ; B 169 0 586 750 ;
XC 64 ; WX 800 ; N at ; B 106 -15 863 750 ;
XC 65 ; WX 556 ; N A ; B 11 0 546 750 ;
XC 66 ; WX 556 ; N B ; B 80 0 610 750 ;
XC 67 ; WX 556 ; N C ; B 106 -18 624 765 ;
XC 68 ; WX 611 ; N D ; B 82 0 653 750 ;
XC 69 ; WX 500 ; N E ; B 74 0 608 750 ;
XC 70 ; WX 444 ; N F ; B 74 0 585 750 ;
XC 71 ; WX 611 ; N G ; B 109 -18 646 765 ;
XC 72 ; WX 611 ; N H ; B 79 0 691 750 ;
XC 73 ; WX 278 ; N I ; B 98 0 340 750 ;
XC 74 ; WX 444 ; N J ; B 52 -15 527 750 ;
XC 75 ; WX 556 ; N K ; B 79 0 698 750 ;
XC 76 ; WX 500 ; N L ; B 83 0 488 750 ;
XC 77 ; WX 778 ; N M ; B 76 0 861 750 ;
XC 78 ; WX 611 ; N N ; B 77 0 693 750 ;
XC 79 ; WX 611 ; N O ; B 116 -18 658 765 ;
XC 80 ; WX 556 ; N P ; B 86 0 641 750 ;
XC 81 ; WX 611 ; N Q ; B 116 -34 659 765 ;
XC 82 ; WX 611 ; N R ; B 86 0 655 750 ;
XC 83 ; WX 556 ; N S ; B 86 -18 611 765 ;
XC 84 ; WX 500 ; N T ; B 158 0 645 750 ;
XC 85 ; WX 611 ; N U ; B 114 -18 690 750 ;
XC 86 ; WX 556 ; N V ; B 170 0 704 750 ;
XC 87 ; WX 833 ; N W ; B 176 0 975 750 ;
XC 88 ; WX 556 ; N X ; B 17 0 692 750 ;
XC 89 ; WX 556 ; N Y ; B 170 0 705 750 ;
XC 90 ; WX 500 ; N Z ; B 28 0 627 750 ;
XC 91 ; WX 333 ; N bracketleft ; B 56 -209 434 750 ;
XC 92 ; WX 250 ; N backslash ; B 128 0 281 750 ;
XC 93 ; WX 333 ; N bracketright ; B 14 -209 392 750 ;
XC 94 ; WX 500 ; N asciicircum ; B 141 333 502 750 ;


XC 95 ; WX 500 ; N underscore ; B -25 -119 487 -61 ;

XC 96 ; WX 222 ; N quoteleft ; B 175 521 321 767 ;
XC 97 ; WX 444 ; N a ; B 55 -15 465 571 ;
XC 98 ; WX 500 ; N b ; B 75 -15 525 750 ;
XC 99 ; WX 444 ; N c ; B 85 -15 488 571 ;
XC 100 ; WX 500 ; N d ; B 88 -15 583 750 ;
XC 101 ; WX 444 ; N e ; B 86 -15 476 571 ;
XC 102 ; WX 278 ; N f ; B 93 0 418 752 ; L i fi ; L l fl ;
XC 103 ; WX 500 ; N g ; B 53 -189 544 571 ;
XC 104 ; WX 500 ; N h ; B 73 0 524 750 ;
XC 105 ; WX 222 ; N i ; B 72 0 310 750 ;
XC 106 ; WX 222 ; N j ; B -27 -190 313 750 ;
XC 107 ; WX 444 ; N k ; B 69 0 552 750 ;
XC 108 ; WX 222 ; N l ; B 72 0 310 750 ;
XC 109 ; WX 778 ; N m ; B 76 0 799 571 ;
XC 110 ; WX 500 ; N n ; B 73 0 524 571 ;
XC 111 ; WX 500 ; N o ; B 96 -15 524 571 ;
XC 112 ; WX 500 ; N p ; B 32 -188 524 571 ;
XC 113 ; WX 500 ; N q ; B 100 -184 544 571 ;
XC 114 ; WX 333 ; N r ; B 81 0 441 563 ;
XC 115 ; WX 444 ; N s ; B 68 -15 473 571 ;
XC 116 ; WX 278 ; N t ; B 101 0 375 707 ;
XC 117 ; WX 500 ; N u ; B 99 -15 542 556 ;
XC 118 ; WX 444 ; N v ; B 131 0 549 556 ;
XC 119 ; WX 667 ; N w ; B 137 0 767 556 ;
XC 120 ; WX 444 ; N x ; B 9 0 548 556 ;
XC 121 ; WX 444 ; N y ; B -13 -190 543 556 ;
XC 122 ; WX 389 ; N z ; B 24 0 482 556 ;
XC 123 ; WX 274 ; N braceleft ; B 77 -95 425 750 ;
XC 124 ; WX 250 ; N bar ; B 93 0 316 750 ;
XC 125 ; WX 274 ; N braceright ; B -12 -95 337 750 ;
XC 126 ; WX 500 ; N asciitilde ; B 89 166 520 345 ;
XC 161 ; WX 333 ; N exclamdown ; B 83 -179 333 571 ;
XC 162 ; WX 500 ; N cent ; B 94 -137 499 667 ;
XC 163 ; WX 500 ; N sterling ; B 40 -15 589 750 ;
XC 164 ; WX 167 ; N fraction ; B -174 0 500 750 ;
XC 165 ; WX 500 ; N yen ; B 88 0 677 750 ;
XC 166 ; WX 500 ; N florin ; B -28 -192 645 750 ;
XC 167 ; WX 500 ; N section ; B 51 -208 552 750 ;
XC 168 ; WX 500 ; N currency ; B 51 50 576 553 ;
XC 169 ; WX 250 ; N quotesingle ; B 208 513 308 739 ;
XC 170 ; WX 389 ; N quotedblleft ; B 173 521 490 767 ;
XC 171 ; WX 500 ; N guillemotleft ; B 145 125 520 495 ;
XC 172 ; WX 278 ; N guilsinglleft ; B 124 125 320 495 ;
XC 173 ; WX 278 ; N guilsinglright ; B 90 125 286 495 ;
XC 174 ; WX 500 ; N fi ; B 93 0 584 752 ;
XC 175 ; WX 500 ; N fl ; B 93 0 584 752 ;
XC 177 ; WX 500 ; N endash ; B 58 275 573 345 ;
XC 178 ; WX 500 ; N dagger ; B 137 -176 573 750 ;
XC 179 ; WX 500 ; N daggerdbl ; B 50 -176 572 750 ;
XC 180 ; WX 250 ; N periodcentered ; B 123 204 236 304 ;
XC 182 ; WX 440 ; N paragraph ; B 113 -116 550 750 ;
XC 183 ; WX 333 ; N bullet ; B 91 222 401 529 ;
XC 184 ; WX 222 ; N quotesinglbase ; B 33 -146 179 100 ;
XC 185 ; WX 389 ; N quotedblbase ; B 31 -146 348 100 ;
XC 186 ; WX 389 ; N quotedblright ; B 169 504 486 750 ;
XC 187 ; WX 500 ; N guillemotright ; B 112 125 487 495 ;
XC 188 ; WX 1000 ; N ellipsis ; B 121 0 899 100 ;
XC 189 ; WX 1111 ; N perthousand ; B 157 -16 1118 750 ;
XC 191 ; WX 500 ; N questiondown ; B 33 -190 450 559 ;
XC 193 ; WX 333 ; N grave ; B 198 624 366 765 ;
XC 194 ; WX 333 ; N acute ; B 233 624 461 765 ;
XC 195 ; WX 333 ; N circumflex ; B 154 624 446 765 ;
XC 196 ; WX 333 ; N tilde ; B 132 634 496 750 ;
XC 197 ; WX 333 ; N macron ; B 150 657 475 715 ;
XC 198 ; WX 333 ; N breve ; B 172 629 484 765 ;
XC 199 ; WX 250 ; N dotaccent ; B 224 650 324 750 ;
XC 200 ; WX 333 ; N dieresis ; B 190 650 440 750 ;
XC 202 ; WX 250 ; N ring ; B 168 593 377 796 ;
XC 203 ; WX 333 ; N cedilla ; B 23 -224 255 0 ;
XC 205 ; WX 333 ; N hungarumlaut ; B 194 624 603 765 ;
XC 206 ; WX 333 ; N ogonek ; B -23 -191 188 13 ;
XC 207 ; WX 333 ; N caron ; B 184 624 476 765 ;
XC 208 ; WX 1000 ; N emdash ; B 58 275 1073 345 ;
XC 225 ; WX 833 ; N AE ; B 0 0 944 750 ;
XC 227 ; WX 300 ; N ordfeminine ; B 90 305 392 765 ;
XC 232 ; WX 500 ; N Lslash ; B 39 0 488 750 ;
XC 233 ; WX 611 ; N Oslash ; B 25 -43 738 796 ;
XC 234 ; WX 833 ; N OE ; B 113 -18 946 765 ;
XC 235 ; WX 300 ; N ordmasculine ; B 85 305 413 765 ;
XC 241 ; WX 667 ; N ae ; B 50 -15 711 571 ;
XC 245 ; WX 222 ; N dotlessi ; B 72 0 269 556 ;
XC 248 ; WX 222 ; N lslash ; B 59 0 347 750 ;
XC 249 ; WX 500 ; N oslash ; B 19 -46 591 582 ;
XC 250 ; WX 722 ; N oe ; B 81 -15 758 571 ;
XC 251 ; WX 500 ; N germandbls ; B 71 -5 548 765 ;
XC -1 ; WX 556 ; N Aacute ; B 11 0 614 959 ;
XC -1 ; WX 556 ; N Acircumflex ; B 11 0 599 959 ;
XC -1 ; WX 556 ; N Adieresis ; B 11 0 593 944 ;
XC -1 ; WX 556 ; N Agrave ; B 11 0 546 959 ;
XC -1 ; WX 556 ; N Aring ; B 11 0 571 990 ;
XC -1 ; WX 556 ; N Atilde ; B 11 0 649 944 ;
XC -1 ; WX 556 ; N Ccedilla ; B 106 -224 624 765 ;
XC -1 ; WX 500 ; N Eacute ; B 74 0 608 959 ;
XC -1 ; WX 500 ; N Ecircumflex ; B 74 0 608 959 ;
XC -1 ; WX 500 ; N Edieresis ; B 74 0 608 944 ;
XC -1 ; WX 500 ; N Egrave ; B 74 0 608 959 ;
XC -1 ; WX 611 ; N Eth ; B 67 0 653 750 ;
XC -1 ; WX 278 ; N Iacute ; B 98 0 475 959 ;
XC -1 ; WX 278 ; N Icircumflex ; B 98 0 460 959 ;
XC -1 ; WX 278 ; N Idieresis ; B 98 0 454 944 ;
XC -1 ; WX 278 ; N Igrave ; B 98 0 380 959 ;
XC -1 ; WX 611 ; N Ntilde ; B 77 0 693 944 ;
XC -1 ; WX 611 ; N Oacute ; B 116 -18 658 959 ;
XC -1 ; WX 611 ; N Ocircumflex ; B 116 -18 658 959 ;
XC -1 ; WX 611 ; N Odieresis ; B 116 -18 658 944 ;
XC -1 ; WX 611 ; N Ograve ; B 116 -18 658 959 ;
XC -1 ; WX 611 ; N Otilde ; B 116 -18 676 944 ;
XC -1 ; WX 556 ; N Scaron ; B 86 -18 629 959 ;
XC -1 ; WX 556 ; N Thorn ; B 86 0 607 750 ;
XC -1 ; WX 611 ; N Uacute ; B 114 -18 690 959 ;
XC -1 ; WX 611 ; N Ucircumflex ; B 114 -18 690 959 ;
XC -1 ; WX 611 ; N Udieresis ; B 114 -18 690 944 ;
XC -1 ; WX 611 ; N Ugrave ; B 114 -18 690 959 ;
XC -1 ; WX 556 ; N Yacute ; B 170 0 705 959 ;
XC -1 ; WX 556 ; N Ydieresis ; B 170 0 705 944 ;
XC -1 ; WX 500 ; N Zcaron ; B 28 0 627 959 ;
XC -1 ; WX 444 ; N aacute ; B 55 -15 517 765 ;
XC -1 ; WX 444 ; N acircumflex ; B 55 -15 502 765 ;
XC -1 ; WX 444 ; N adieresis ; B 55 -15 496 750 ;
XC -1 ; WX 444 ; N agrave ; B 55 -15 465 765 ;
XC -1 ; WX 444 ; N aring ; B 55 -15 474 796 ;
XC -1 ; WX 444 ; N atilde ; B 55 -15 552 750 ;
XC -1 ; WX 250 ; N brokenbar ; B 93 0 316 750 ;
XC -1 ; WX 444 ; N ccedilla ; B 79 -224 488 571 ;
XC -1 ; WX 800 ; N copyright ; B 79 -18 880 765 ;


XC -1 ; WX 400 ; N degree ; B 174 450 481 750 ;

XC -1 ; WX 500 ; N divide ; B 91 3 518 505 ;
XC -1 ; WX 444 ; N eacute ; B 86 -15 517 765 ;
XC -1 ; WX 444 ; N ecircumflex ; B 86 -15 502 765 ;
XC -1 ; WX 444 ; N edieresis ; B 86 -15 496 750 ;
XC -1 ; WX 444 ; N egrave ; B 86 -15 476 765 ;
XC -1 ; WX 500 ; N eth ; B 87 -15 548 770 ;
XC -1 ; WX 222 ; N iacute ; B 72 0 406 765 ;
XC -1 ; WX 222 ; N icircumflex ; B 72 0 391 765 ;
XC -1 ; WX 222 ; N idieresis ; B 72 0 385 750 ;
XC -1 ; WX 222 ; N igrave ; B 72 0 311 765 ;
XC -1 ; WX 500 ; N logicalnot ; B 111 117 539 384 ;
XC -1 ; WX 500 ; N minus ; B 91 219 518 289 ;
XC -1 ; WX 500 ; N mu ; B 35 -189 540 556 ;
XC -1 ; WX 500 ; N multiply ; B 65 48 544 461 ;
XC -1 ; WX 500 ; N ntilde ; B 73 0 580 750 ;
XC -1 ; WX 500 ; N oacute ; B 96 -15 545 765 ;
XC -1 ; WX 500 ; N ocircumflex ; B 96 -15 530 765 ;
XC -1 ; WX 500 ; N odieresis ; B 96 -15 524 750 ;
XC -1 ; WX 500 ; N ograve ; B 96 -15 524 765 ;
XC -1 ; WX 750 ; N onehalf ; B 91 0 777 750 ;
XC -1 ; WX 750 ; N onequarter ; B 143 0 817 750 ;
XC -1 ; WX 300 ; N onesuperior ; B 200 300 392 750 ;
XC -1 ; WX 500 ; N otilde ; B 96 -15 580 750 ;
XC -1 ; WX 500 ; N plusminus ; B 44 0 531 505 ;
XC -1 ; WX 800 ; N registered ; B 79 -18 881 765 ;
XC -1 ; WX 444 ; N scaron ; B 68 -15 532 765 ;
XC -1 ; WX 500 ; N thorn ; B 32 -188 524 750 ;
XC -1 ; WX 750 ; N threequarters ; B 106 0 831 750 ;
XC -1 ; WX 300 ; N threesuperior ; B 102 291 409 750 ;
XC -1 ; WX 750 ; N trademark ; B 147 329 878 750 ;
XC -1 ; WX 300 ; N twosuperior ; B 83 300 413 750 ;
XC -1 ; WX 500 ; N uacute ; B 99 -15 545 765 ;
XC -1 ; WX 500 ; N ucircumflex ; B 99 -15 542 765 ;
XC -1 ; WX 500 ; N udieresis ; B 99 -15 542 750 ;
XC -1 ; WX 500 ; N ugrave ; B 99 -15 542 765 ;
XC -1 ; WX 444 ; N yacute ; B -13 -190 543 765 ;
XC -1 ; WX 444 ; N ydieresis ; B -13 -190 543 750 ;
XC -1 ; WX 389 ; N zcaron ; B 24 0 504 765 ;

XKPX r f 20


XKPX r e 0
XKPX r d 0
XKPX r comma -74

XKPX r c -20


X
XKPX v period -55
XKPX v comma -55
X
XKPX w period -37
XKPX w comma -37
X
XKPX y period -55
XKPX y comma -55
XEndKernPairs
XEndKernData
XStartComposites 58

XCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 83 194 ;


XCC zcaron 2 ; PCC z 0 0 ; PCC caron 28 0 ;

XCC Scaron 2 ; PCC S 0 0 ; PCC caron 111 194 ;


XCC scaron 2 ; PCC s 0 0 ; PCC caron 55 0 ;

XCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 111 0 ;
XCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 55 0 ;

XCC Yacute 2 ; PCC Y 0 0 ; PCC acute 111 194 ;


XCC yacute 2 ; PCC y 0 0 ; PCC acute 55 0 ;

XCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 111 194 ;


XCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 55 0 ;

XCC Uacute 2 ; PCC U 0 0 ; PCC acute 139 194 ;
XCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 139 194 ;
XCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 139 194 ;
XCC Ugrave 2 ; PCC U 0 0 ; PCC grave 139 194 ;


XCC uacute 2 ; PCC u 0 0 ; PCC acute 83 0 ;
XCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 83 0 ;
XCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 83 0 ;
XCC ugrave 2 ; PCC u 0 0 ; PCC grave 83 0 ;

XCC Iacute 2 ; PCC I 0 0 ; PCC acute -27 194 ;
XCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex -27 194 ;
XCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis -27 194 ;
XCC Igrave 2 ; PCC I 0 0 ; PCC grave -27 194 ;
XCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -55 0 ;
XCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -55 0 ;
XCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -55 0 ;
XCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -55 0 ;
XCC Eacute 2 ; PCC E 0 0 ; PCC acute 83 194 ;
XCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 83 194 ;
XCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 83 194 ;
XCC Egrave 2 ; PCC E 0 0 ; PCC grave 83 194 ;


XCC eacute 2 ; PCC e 0 0 ; PCC acute 55 0 ;
XCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 55 0 ;
XCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 55 0 ;
XCC egrave 2 ; PCC e 0 0 ; PCC grave 55 0 ;

XCC Aacute 2 ; PCC A 0 0 ; PCC acute 111 194 ;
XCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 111 194 ;
XCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 111 194 ;
XCC Agrave 2 ; PCC A 0 0 ; PCC grave 111 194 ;
XCC aacute 2 ; PCC a 0 0 ; PCC acute 55 0 ;
XCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 55 0 ;
XCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 55 0 ;
XCC agrave 2 ; PCC a 0 0 ; PCC grave 55 0 ;
XCC Oacute 2 ; PCC O 0 0 ; PCC acute 139 194 ;
XCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 139 194 ;
XCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 139 194 ;
XCC Ograve 2 ; PCC O 0 0 ; PCC grave 139 194 ;


XCC oacute 2 ; PCC o 0 0 ; PCC acute 83 0 ;
XCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 83 0 ;
XCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 83 0 ;
XCC ograve 2 ; PCC o 0 0 ; PCC grave 83 0 ;

XCC Atilde 2 ; PCC A 0 0 ; PCC tilde 111 194 ;
XCC atilde 2 ; PCC a 0 0 ; PCC tilde 55 0 ;
XCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 139 194 ;
XCC ntilde 2 ; PCC n 0 0 ; PCC tilde 83 0 ;
XCC Otilde 2 ; PCC O 0 0 ; PCC tilde 139 194 ;


XCC otilde 2 ; PCC o 0 0 ; PCC tilde 83 0 ;

XCC Aring 2 ; PCC A 0 0 ; PCC ring 153 194 ;
XCC aring 2 ; PCC a 0 0 ; PCC ring 97 0 ;
XEndComposites
XEndFontMetrics
END_OF_FILE
if test 15569 -ne `wc -c <'lout/font0/HelveConObl.AFM'`; then
echo shar: \"'lout/font0/HelveConObl.AFM'\" unpacked with wrong size!
fi
# end of 'lout/font0/HelveConObl.AFM'
fi
if test -f 'lout/font0/HelveNarBolObl.AFM' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/font0/HelveNarBolObl.AFM'\"
else
echo shar: Extracting \"'lout/font0/HelveNarBolObl.AFM'\" \(15540 characters\)
sed "s/^X//" >'lout/font0/HelveNarBolObl.AFM' <<'END_OF_FILE'
XStartFontMetrics 2.0


XComment Copyright (c) 1985, 1987 Adobe Systems Incorporated. All rights reserved.

XComment Creation Date:Tue Apr 12 08:39:54 PDT 1988
XFontName Helvetica-Narrow-BoldOblique
XEncodingScheme AdobeStandardEncoding
XFullName Helvetica Narrow Bold Oblique
XFamilyName Helvetica
XWeight Bold
XItalicAngle -12.0
XIsFixedPitch false
XUnderlinePosition -106
XUnderlineThickness 73
XVersion 001.002
XNotice Copyright (c) 1985, 1987 Adobe Systems Incorporated. All rights reserved.Helvetica is a registered trademark of Allied Corporation.
XFontBBox -145 -221 907 936
XCapHeight 729
XXHeight 542
XDescender -219
XAscender 729
XStartCharMetrics 228
XC 32 ; WX 228 ; N space ; B 0 0 0 0 ;
XC 33 ; WX 273 ; N exclam ; B 92 0 342 729 ;
XC 34 ; WX 389 ; N quotedbl ; B 145 470 475 729 ;
XC 35 ; WX 456 ; N numbersign ; B 27 -30 541 696 ;
XC 36 ; WX 456 ; N dollar ; B 48 -125 515 765 ;
XC 37 ; WX 729 ; N percent ; B 106 -18 741 708 ;
XC 38 ; WX 592 ; N ampersand ; B 72 -20 589 729 ;
XC 39 ; WX 228 ; N quoteright ; B 136 469 292 729 ;
XC 40 ; WX 273 ; N parenleft ; B 69 -202 376 729 ;
XC 41 ; WX 273 ; N parenright ; B -17 -202 292 729 ;
XC 42 ; WX 319 ; N asterisk ; B 119 385 392 730 ;
XC 43 ; WX 479 ; N plus ; B 71 -10 488 474 ;
XC 44 ; WX 228 ; N comma ; B 22 -174 200 146 ;
XC 45 ; WX 273 ; N hyphen ; B 58 208 304 344 ;
XC 46 ; WX 228 ; N period ; B 52 0 200 146 ;
XC 47 ; WX 228 ; N slash ; B -1 -14 350 715 ;
XC 48 ; WX 456 ; N zero ; B 66 -23 503 725 ;
XC 49 ; WX 456 ; N one ; B 141 0 433 709 ;
XC 50 ; WX 456 ; N two ; B 25 0 515 726 ;
XC 51 ; WX 456 ; N three ; B 56 -23 503 726 ;
XC 52 ; WX 456 ; N four ; B 46 0 490 709 ;
XC 53 ; WX 456 ; N five ; B 48 -24 525 709 ;
XC 54 ; WX 456 ; N six ; B 69 -23 512 727 ;
XC 55 ; WX 456 ; N seven ; B 108 0 557 709 ;
XC 56 ; WX 456 ; N eight ; B 48 -23 507 726 ;
XC 57 ; WX 456 ; N nine ; B 56 -23 501 728 ;
XC 58 ; WX 273 ; N colon ; B 93 0 307 521 ;
XC 59 ; WX 273 ; N semicolon ; B 63 -174 307 521 ;
XC 60 ; WX 479 ; N less ; B 63 -10 516 474 ;
XC 61 ; WX 479 ; N equal ; B 50 52 510 412 ;
XC 62 ; WX 479 ; N greater ; B 31 -10 485 474 ;
XC 63 ; WX 501 ; N question ; B 138 0 551 744 ;
XC 64 ; WX 800 ; N at ; B 60 -136 847 746 ;
XC 65 ; WX 592 ; N A ; B 21 0 576 729 ;
XC 66 ; WX 592 ; N B ; B 67 0 625 729 ;
XC 67 ; WX 592 ; N C ; B 88 -23 650 741 ;
XC 68 ; WX 592 ; N D ; B 63 0 637 729 ;
XC 69 ; WX 547 ; N E ; B 65 0 625 729 ;
XC 70 ; WX 501 ; N F ; B 61 0 608 729 ;
XC 71 ; WX 638 ; N G ; B 87 -24 671 741 ;
XC 72 ; WX 592 ; N H ; B 56 0 666 729 ;
XC 73 ; WX 228 ; N I ; B 52 0 302 729 ;
XC 74 ; WX 456 ; N J ; B 49 -23 526 729 ;
XC 75 ; WX 592 ; N K ; B 61 0 692 729 ;
XC 76 ; WX 501 ; N L ; B 66 0 497 729 ;
XC 77 ; WX 683 ; N M ; B 54 0 764 729 ;
XC 78 ; WX 592 ; N N ; B 56 0 669 729 ;
XC 79 ; WX 638 ; N O ; B 87 -23 679 741 ;
XC 80 ; WX 547 ; N P ; B 62 0 613 729 ;
XC 81 ; WX 638 ; N Q ; B 89 -54 682 741 ;
XC 82 ; WX 592 ; N R ; B 66 0 644 729 ;
XC 83 ; WX 547 ; N S ; B 62 -23 595 741 ;
XC 84 ; WX 501 ; N T ; B 117 0 618 729 ;
XC 85 ; WX 592 ; N U ; B 97 -23 663 729 ;
XC 86 ; WX 547 ; N V ; B 147 0 658 729 ;
XC 87 ; WX 774 ; N W ; B 138 0 891 729 ;
XC 88 ; WX 547 ; N X ; B 18 0 658 729 ;
XC 89 ; WX 547 ; N Y ; B 149 0 660 729 ;
XC 90 ; WX 501 ; N Z ; B 25 0 601 729 ;
XC 91 ; WX 273 ; N bracketleft ; B 19 -202 379 729 ;
XC 92 ; WX 228 ; N backslash ; B 114 -21 233 708 ;
XC 93 ; WX 273 ; N bracketright ; B -20 -202 340 729 ;
XC 94 ; WX 479 ; N asciicircum ; B 97 271 475 696 ;
XC 95 ; WX 456 ; N underscore ; B -53 -200 451 -130 ;
XC 96 ; WX 228 ; N quoteleft ; B 137 469 293 729 ;
XC 97 ; WX 456 ; N a ; B 42 -24 474 551 ;
XC 98 ; WX 501 ; N b ; B 48 -23 525 729 ;
XC 99 ; WX 456 ; N c ; B 63 -23 489 551 ;
XC 100 ; WX 501 ; N d ; B 65 -23 574 729 ;
XC 101 ; WX 456 ; N e ; B 53 -23 485 551 ;
XC 102 ; WX 273 ; N f ; B 74 0 381 729 ; L i fi ; L l fl ;
XC 103 ; WX 501 ; N g ; B 21 -220 538 551 ;
XC 104 ; WX 501 ; N h ; B 55 0 516 729 ;
XC 105 ; WX 228 ; N i ; B 55 0 297 729 ;
XC 106 ; WX 228 ; N j ; B -35 -219 299 729 ;
XC 107 ; WX 456 ; N k ; B 48 0 534 729 ;
XC 108 ; WX 228 ; N l ; B 55 0 297 729 ;
XC 109 ; WX 729 ; N m ; B 49 0 747 553 ;
XC 110 ; WX 501 ; N n ; B 52 0 516 551 ;
XC 111 ; WX 501 ; N o ; B 67 -23 520 551 ;
XC 112 ; WX 501 ; N p ; B 9 -219 522 551 ;
XC 113 ; WX 501 ; N q ; B 59 -219 540 551 ;
XC 114 ; WX 319 ; N r ; B 52 0 400 553 ;
XC 115 ; WX 456 ; N s ; B 49 -23 483 551 ;
XC 116 ; WX 273 ; N t ; B 83 -23 339 678 ;
XC 117 ; WX 501 ; N u ; B 72 -23 538 542 ;
XC 118 ; WX 456 ; N v ; B 106 0 534 542 ;
XC 119 ; WX 638 ; N w ; B 99 0 723 542 ;
XC 120 ; WX 456 ; N x ; B 13 0 532 542 ;
XC 121 ; WX 456 ; N y ; B 31 -219 536 542 ;
XC 122 ; WX 410 ; N z ; B 17 0 472 542 ;
XC 123 ; WX 319 ; N braceleft ; B 69 -202 387 729 ;
XC 124 ; WX 230 ; N bar ; B 47 -202 275 729 ;
XC 125 ; WX 319 ; N braceright ; B 24 -202 343 729 ;
XC 126 ; WX 479 ; N asciitilde ; B 80 144 477 322 ;
XC 161 ; WX 273 ; N exclamdown ; B 21 -187 271 542 ;
XC 162 ; WX 456 ; N cent ; B 63 -122 490 637 ;
XC 163 ; WX 456 ; N sterling ; B 41 -20 516 717 ;
XC 164 ; WX 137 ; N fraction ; B -145 -20 401 715 ;
XC 165 ; WX 456 ; N yen ; B 88 0 576 705 ;
XC 166 ; WX 456 ; N florin ; B -17 -221 566 745 ;
XC 167 ; WX 456 ; N section ; B 46 -201 489 728 ;
XC 168 ; WX 456 ; N currency ; B 54 105 528 604 ;
XC 169 ; WX 195 ; N quotesingle ; B 145 469 281 729 ;
XC 170 ; WX 410 ; N quotedblleft ; B 140 469 482 729 ;
XC 171 ; WX 456 ; N guillemotleft ; B 110 71 468 484 ;
XC 172 ; WX 273 ; N guilsinglleft ; B 105 73 288 476 ;
XC 173 ; WX 273 ; N guilsinglright ; B 79 73 262 476 ;
XC 174 ; WX 501 ; N fi ; B 70 0 576 729 ;
XC 175 ; WX 501 ; N fl ; B 72 0 575 729 ;
XC 177 ; WX 456 ; N endash ; B 29 208 511 313 ;
XC 178 ; WX 456 ; N dagger ; B 90 -195 514 708 ;
XC 179 ; WX 456 ; N daggerdbl ; B 29 -195 511 708 ;
XC 180 ; WX 228 ; N periodcentered ; B 117 318 221 442 ;
XC 182 ; WX 456 ; N paragraph ; B 99 -195 560 729 ;
XC 183 ; WX 287 ; N bullet ; B 91 175 301 425 ;
XC 184 ; WX 228 ; N quotesinglbase ; B 31 -135 187 125 ;
XC 185 ; WX 410 ; N quotedblbase ; B 31 -164 378 141 ;
XC 186 ; WX 410 ; N quotedblright ; B 142 469 488 729 ;
XC 187 ; WX 456 ; N guillemotright ; B 84 71 437 482 ;
XC 188 ; WX 820 ; N ellipsis ; B 75 0 769 146 ;
XC 189 ; WX 820 ; N perthousand ; B 59 -20 837 745 ;
XC 191 ; WX 501 ; N questiondown ; B 43 -192 456 542 ;
XC 193 ; WX 273 ; N grave ; B 144 595 279 745 ;
XC 194 ; WX 273 ; N acute ; B 203 595 390 745 ;
XC 195 ; WX 273 ; N circumflex ; B 110 598 371 745 ;
XC 196 ; WX 273 ; N tilde ; B 96 595 410 729 ;
XC 197 ; WX 273 ; N macron ; B 123 629 383 717 ;
XC 198 ; WX 273 ; N breve ; B 154 593 373 736 ;
XC 199 ; WX 273 ; N dotaccent ; B 198 607 309 729 ;
XC 200 ; WX 273 ; N dieresis ; B 121 609 385 731 ;
XC 202 ; WX 273 ; N ring ; B 176 565 327 745 ;
XC 203 ; WX 273 ; N cedilla ; B -11 -220 222 -9 ;
XC 205 ; WX 273 ; N hungarumlaut ; B 68 595 409 745 ;
XC 206 ; WX 273 ; N ogonek ; B 19 -195 204 38 ;
XC 207 ; WX 273 ; N caron ; B 137 598 398 745 ;
XC 208 ; WX 820 ; N emdash ; B 31 208 877 313 ;
XC 225 ; WX 820 ; N AE ; B 1 0 905 729 ;
XC 227 ; WX 303 ; N ordfeminine ; B 78 277 369 746 ;
XC 232 ; WX 501 ; N Lslash ; B 44 0 512 729 ;
XC 233 ; WX 638 ; N Oslash ; B 27 -34 743 754 ;
XC 234 ; WX 820 ; N OE ; B 73 -20 907 741 ;
XC 235 ; WX 299 ; N ordmasculine ; B 75 276 385 745 ;
XC 241 ; WX 729 ; N ae ; B 44 -20 760 555 ;
XC 245 ; WX 228 ; N dotlessi ; B 55 0 264 542 ;
XC 248 ; WX 228 ; N lslash ; B 41 0 304 729 ;
XC 249 ; WX 501 ; N oslash ; B 9 -34 581 561 ;
XC 250 ; WX 774 ; N oe ; B 58 -21 809 554 ;
XC 251 ; WX 501 ; N germandbls ; B 55 -16 536 730 ;
XC -1 ; WX 592 ; N Aacute ; B 21 0 586 936 ;
XC -1 ; WX 592 ; N Acircumflex ; B 21 0 576 936 ;
XC -1 ; WX 592 ; N Adieresis ; B 21 0 581 922 ;
XC -1 ; WX 592 ; N Agrave ; B 21 0 576 936 ;
XC -1 ; WX 592 ; N Aring ; B 21 0 576 936 ;
XC -1 ; WX 592 ; N Atilde ; B 21 0 606 920 ;
XC -1 ; WX 592 ; N Ccedilla ; B 88 -220 650 741 ;
XC -1 ; WX 547 ; N Eacute ; B 65 0 625 936 ;
XC -1 ; WX 547 ; N Ecircumflex ; B 65 0 625 936 ;
XC -1 ; WX 547 ; N Edieresis ; B 65 0 625 922 ;
XC -1 ; WX 547 ; N Egrave ; B 65 0 625 936 ;
XC -1 ; WX 592 ; N Eth ; B 43 0 637 729 ;
XC -1 ; WX 228 ; N Iacute ; B 52 0 401 936 ;
XC -1 ; WX 228 ; N Icircumflex ; B 52 0 382 936 ;
XC -1 ; WX 228 ; N Idieresis ; B 52 0 396 922 ;
XC -1 ; WX 228 ; N Igrave ; B 52 0 302 936 ;
XC -1 ; WX 592 ; N Ntilde ; B 56 0 669 920 ;
XC -1 ; WX 638 ; N Oacute ; B 87 -23 679 936 ;
XC -1 ; WX 638 ; N Ocircumflex ; B 87 -23 679 936 ;
XC -1 ; WX 638 ; N Odieresis ; B 87 -23 679 922 ;
XC -1 ; WX 638 ; N Ograve ; B 87 -23 679 936 ;
XC -1 ; WX 638 ; N Otilde ; B 87 -23 679 920 ;
XC -1 ; WX 547 ; N Scaron ; B 62 -23 595 936 ;
XC -1 ; WX 547 ; N Thorn ; B 62 0 599 729 ;
XC -1 ; WX 592 ; N Uacute ; B 97 -23 663 936 ;
XC -1 ; WX 592 ; N Ucircumflex ; B 97 -23 663 936 ;
XC -1 ; WX 592 ; N Udieresis ; B 97 -23 663 922 ;
XC -1 ; WX 592 ; N Ugrave ; B 97 -23 663 936 ;
XC -1 ; WX 547 ; N Yacute ; B 149 0 660 932 ;
XC -1 ; WX 547 ; N Ydieresis ; B 149 0 660 922 ;
XC -1 ; WX 501 ; N Zcaron ; B 25 0 601 936 ;
XC -1 ; WX 456 ; N aacute ; B 42 -24 482 745 ;
XC -1 ; WX 456 ; N acircumflex ; B 42 -24 474 745 ;
XC -1 ; WX 456 ; N adieresis ; B 42 -24 477 731 ;
XC -1 ; WX 456 ; N agrave ; B 42 -24 474 745 ;
XC -1 ; WX 456 ; N aring ; B 42 -24 474 745 ;
XC -1 ; WX 456 ; N atilde ; B 42 -24 502 729 ;
XC -1 ; WX 230 ; N brokenbar ; B 47 -202 275 729 ;
XC -1 ; WX 456 ; N ccedilla ; B 63 -220 489 551 ;
XC -1 ; WX 604 ; N copyright ; B 45 -20 686 745 ;
XC -1 ; WX 328 ; N degree ; B 138 425 390 725 ;
XC -1 ; WX 479 ; N divide ; B 71 -10 488 474 ;
XC -1 ; WX 456 ; N eacute ; B 53 -23 485 745 ;
XC -1 ; WX 456 ; N ecircumflex ; B 53 -23 485 745 ;
XC -1 ; WX 456 ; N edieresis ; B 53 -23 485 731 ;
XC -1 ; WX 456 ; N egrave ; B 53 -23 485 745 ;
XC -1 ; WX 501 ; N eth ; B 68 -23 519 730 ;
XC -1 ; WX 228 ; N iacute ; B 55 0 368 745 ;
XC -1 ; WX 228 ; N icircumflex ; B 55 0 349 745 ;
XC -1 ; WX 228 ; N idieresis ; B 55 0 363 731 ;
XC -1 ; WX 228 ; N igrave ; B 55 0 264 745 ;
XC -1 ; WX 479 ; N logicalnot ; B 85 121 518 412 ;
XC -1 ; WX 479 ; N minus ; B 63 174 497 290 ;
XC -1 ; WX 501 ; N mu ; B 9 -219 538 542 ;
XC -1 ; WX 479 ; N multiply ; B 54 -10 506 474 ;
XC -1 ; WX 501 ; N ntilde ; B 52 0 530 729 ;
XC -1 ; WX 501 ; N oacute ; B 67 -23 520 745 ;
XC -1 ; WX 501 ; N ocircumflex ; B 67 -23 520 745 ;
XC -1 ; WX 501 ; N odieresis ; B 67 -23 520 731 ;
XC -1 ; WX 501 ; N ograve ; B 67 -23 520 745 ;
XC -1 ; WX 684 ; N onehalf ; B 99 -20 714 715 ;
XC -1 ; WX 684 ; N onequarter ; B 123 -20 694 715 ;
XC -1 ; WX 273 ; N onesuperior ; B 138 284 326 709 ;
XC -1 ; WX 501 ; N otilde ; B 67 -23 524 729 ;
XC -1 ; WX 479 ; N plusminus ; B 32 0 523 674 ;
XC -1 ; WX 604 ; N registered ; B 45 -20 686 745 ;
XC -1 ; WX 456 ; N scaron ; B 49 -23 490 745 ;
XC -1 ; WX 501 ; N thorn ; B 9 -219 526 729 ;
XC -1 ; WX 684 ; N threequarters ; B 94 -20 707 725 ;
XC -1 ; WX 273 ; N threesuperior ; B 75 271 363 720 ;
XC -1 ; WX 820 ; N trademark ; B 175 341 892 745 ;
XC -1 ; WX 273 ; N twosuperior ; B 57 284 370 719 ;
XC -1 ; WX 501 ; N uacute ; B 72 -23 538 745 ;
XC -1 ; WX 501 ; N ucircumflex ; B 72 -23 538 745 ;
XC -1 ; WX 501 ; N udieresis ; B 72 -23 538 731 ;
XC -1 ; WX 501 ; N ugrave ; B 72 -23 538 745 ;
XC -1 ; WX 456 ; N yacute ; B 31 -219 536 745 ;
XC -1 ; WX 456 ; N ydieresis ; B 31 -219 536 731 ;
XC -1 ; WX 410 ; N zcaron ; B 17 0 472 745 ;
XEndCharMetrics
XStartKernData
XStartKernPairs 99
X
XKPX A space -30
XKPX A quoteright -45
XKPX A Y -60
XKPX A W -45
XKPX A V -60


XKPX A T -60
X

XKPX F period -91
XKPX F comma -91
XKPX F A -45
X
XKPX L space -14
XKPX L quoteright -75
XKPX L Y -60
XKPX L W -45
XKPX L V -45
XKPX L T -60
X
XKPX P space -30
XKPX P period -105
XKPX P comma -105
XKPX P A -60
X
XKPX R Y -14
XKPX R W -14
XKPX R T -14
X
XKPX T y -30
XKPX T w -30
XKPX T u -6
XKPX T semicolon -60
XKPX T s -30
XKPX T r -6
XKPX T period -60
XKPX T o -30
XKPX T i -6
XKPX T hyphen -45
XKPX T e -30
XKPX T comma -60
XKPX T colon -60
XKPX T c -30
XKPX T a -30
XKPX T O -14
XKPX T A -60
X
XKPX V y -14
XKPX V u -14
XKPX V semicolon -30
XKPX V r -14
XKPX V period -75
XKPX V o -30
XKPX V i -30
XKPX V hyphen -30
XKPX V e -30
XKPX V comma -75
XKPX V colon -30
XKPX V a -30
XKPX V A -60
X
XKPX W y -14
XKPX W u -14
XKPX W semicolon -30
XKPX W r -14
XKPX W period -60
XKPX W o -14
XKPX W i -7
XKPX W hyphen -30
XKPX W e -14
XKPX W comma -60
XKPX W colon -30
XKPX W a -14
XKPX W A -45


X
XKPX Y v -30

XKPX Y u -30
XKPX Y space -14
XKPX Y semicolon -45
XKPX Y q -30
XKPX Y period -75
XKPX Y p -30
XKPX Y i -30
XKPX Y o -30
XKPX Y hyphen -60
XKPX Y e -30
XKPX Y comma -75
XKPX Y colon -45
XKPX Y a -30
XKPX Y A -60
X
XKPX f quoteright 14
XKPX f f -14
X
XKPX one one -60
X
XKPX quoteleft quoteleft -30
X
XKPX quoteright t 14
XKPX quoteright space -30
XKPX quoteright s -14
XKPX quoteright quoteright -30
X
XKPX r quoteright 30
XKPX r period -45
XKPX r comma -45
X
XKPX space Y -14
XKPX space A -30
X
XKPX v period -45
XKPX v comma -45
X
XKPX w period -30
XKPX w comma -30
X
XKPX y period -30
XKPX y comma -30
XEndKernPairs
XEndKernData
XStartComposites 58
XCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 113 191 ;
XCC zcaron 2 ; PCC z 0 0 ; PCC caron 68 0 ;
XCC Scaron 2 ; PCC S 0 0 ; PCC caron 136 191 ;
XCC scaron 2 ; PCC s 0 0 ; PCC caron 91 0 ;
XCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 172 0 ;
XCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 97 0 ;
XCC Yacute 2 ; PCC Y 0 0 ; PCC acute 136 187 ;
XCC yacute 2 ; PCC y 0 0 ; PCC acute 91 0 ;
XCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 136 191 ;
XCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 91 0 ;
XCC Uacute 2 ; PCC U 0 0 ; PCC acute 162 191 ;
XCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 162 191 ;
XCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 162 191 ;
XCC Ugrave 2 ; PCC U 0 0 ; PCC grave 162 191 ;
XCC uacute 2 ; PCC u 0 0 ; PCC acute 113 0 ;
XCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 113 0 ;
XCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 113 0 ;
XCC ugrave 2 ; PCC u 0 0 ; PCC grave 113 0 ;
XCC Iacute 2 ; PCC I 0 0 ; PCC acute -22 191 ;
XCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex -22 191 ;
XCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis -22 191 ;
XCC Igrave 2 ; PCC I 0 0 ; PCC grave -22 191 ;
XCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -22 0 ;
XCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -22 0 ;
XCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -22 0 ;
XCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -22 0 ;
XCC Eacute 2 ; PCC E 0 0 ; PCC acute 157 191 ;
XCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 157 191 ;
XCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 157 191 ;
XCC Egrave 2 ; PCC E 0 0 ; PCC grave 157 191 ;
XCC eacute 2 ; PCC e 0 0 ; PCC acute 91 0 ;
XCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 91 0 ;
XCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 91 0 ;
XCC egrave 2 ; PCC e 0 0 ; PCC grave 91 0 ;
XCC Aacute 2 ; PCC A 0 0 ; PCC acute 162 191 ;
XCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 162 191 ;
XCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 162 191 ;
XCC Agrave 2 ; PCC A 0 0 ; PCC grave 162 191 ;
XCC aacute 2 ; PCC a 0 0 ; PCC acute 91 0 ;
XCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 91 0 ;
XCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 91 0 ;
XCC agrave 2 ; PCC a 0 0 ; PCC grave 91 0 ;
XCC Oacute 2 ; PCC O 0 0 ; PCC acute 182 191 ;
XCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 182 191 ;
XCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 182 191 ;
XCC Ograve 2 ; PCC O 0 0 ; PCC grave 182 191 ;
XCC oacute 2 ; PCC o 0 0 ; PCC acute 113 0 ;
XCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 113 0 ;
XCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 113 0 ;
XCC ograve 2 ; PCC o 0 0 ; PCC grave 113 0 ;
XCC Atilde 2 ; PCC A 0 0 ; PCC tilde 162 191 ;
XCC atilde 2 ; PCC a 0 0 ; PCC tilde 91 0 ;
XCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 165 191 ;
XCC ntilde 2 ; PCC n 0 0 ; PCC tilde 120 0 ;
XCC Otilde 2 ; PCC O 0 0 ; PCC tilde 182 191 ;
XCC otilde 2 ; PCC o 0 0 ; PCC tilde 113 0 ;
XCC Aring 2 ; PCC A 0 0 ; PCC ring 162 191 ;
XCC aring 2 ; PCC a 0 0 ; PCC ring 91 0 ;
XEndComposites
XEndFontMetrics
END_OF_FILE
if test 15540 -ne `wc -c <'lout/font0/HelveNarBolObl.AFM'`; then
echo shar: \"'lout/font0/HelveNarBolObl.AFM'\" unpacked with wrong size!
fi
# end of 'lout/font0/HelveNarBolObl.AFM'
fi
if test -f 'lout/font0/NewCenSchBol.AFM' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/font0/NewCenSchBol.AFM'\"
else
echo shar: Extracting \"'lout/font0/NewCenSchBol.AFM'\" \(15554 characters\)
sed "s/^X//" >'lout/font0/NewCenSchBol.AFM' <<'END_OF_FILE'
XStartFontMetrics 2.0


XComment Copyright (c) 1985, 1987 Adobe Systems Incorporated. All rights reserved.

XComment Creation Date:Thu Nov 19 14:23:15 PST 1987
XFontName NewCenturySchlbk-Bold
XEncodingScheme AdobeStandardEncoding
XFullName New Century Schoolbook Bold
XFamilyName New Century Schoolbook
XWeight Bold
XItalicAngle 0.0
XIsFixedPitch false
XUnderlinePosition -103
XUnderlineThickness 106
XVersion 001.005
XNotice Copyright (c) 1985, 1987 Adobe Systems Incorporated. All rights reserved.New Century Schoolbook is a trademark of Linotype Company.
XFontBBox -166 -221 1000 1007
XCapHeight 722
XXHeight 475


XDescender -205
XAscender 737
XStartCharMetrics 228

XC 32 ; WX 287 ; N space ; B 0 0 0 0 ;
XC 33 ; WX 296 ; N exclam ; B 57 -15 244 737 ;
XC 34 ; WX 333 ; N quotedbl ; B -11 418 347 737 ;
XC 35 ; WX 574 ; N numbersign ; B 41 0 533 705 ;
XC 36 ; WX 574 ; N dollar ; B 25 -140 549 801 ;
XC 37 ; WX 833 ; N percent ; B 17 -18 821 704 ;
XC 38 ; WX 852 ; N ampersand ; B 39 -15 822 737 ;
XC 39 ; WX 241 ; N quoteright ; B 22 379 219 737 ;
XC 40 ; WX 389 ; N parenleft ; B 72 -122 338 737 ;
XC 41 ; WX 389 ; N parenright ; B 50 -122 316 737 ;
XC 42 ; WX 500 ; N asterisk ; B 56 300 447 737 ;
XC 43 ; WX 606 ; N plus ; B 51 9 555 514 ;
XC 44 ; WX 278 ; N comma ; B 39 -189 236 169 ;
XC 45 ; WX 333 ; N hyphen ; B 42 179 291 309 ;
XC 46 ; WX 278 ; N period ; B 45 -15 233 172 ;
XC 47 ; WX 278 ; N slash ; B -23 -15 302 737 ;
XC 48 ; WX 574 ; N zero ; B 27 -15 546 705 ;
XC 49 ; WX 574 ; N one ; B 83 0 491 705 ;
XC 50 ; WX 574 ; N two ; B 19 -4 531 705 ;
XC 51 ; WX 574 ; N three ; B 24 -15 530 705 ;
XC 52 ; WX 574 ; N four ; B 19 0 546 705 ;
XC 53 ; WX 574 ; N five ; B 31 -15 535 705 ;
XC 54 ; WX 574 ; N six ; B 29 -15 549 705 ;
XC 55 ; WX 574 ; N seven ; B 45 -15 546 705 ;
XC 56 ; WX 574 ; N eight ; B 27 -15 546 705 ;
XC 57 ; WX 574 ; N nine ; B 25 -15 545 705 ;
XC 58 ; WX 278 ; N colon ; B 57 -15 244 485 ;
XC 59 ; WX 278 ; N semicolon ; B 47 -189 244 485 ;
XC 60 ; WX 606 ; N less ; B 49 -13 558 538 ;
XC 61 ; WX 606 ; N equal ; B 51 89 555 399 ;
XC 62 ; WX 606 ; N greater ; B 48 -13 557 538 ;
XC 63 ; WX 500 ; N question ; B 23 -15 476 737 ;
XC 64 ; WX 747 ; N at ; B 24 -15 722 737 ;
XC 65 ; WX 759 ; N A ; B -18 0 778 737 ;
XC 66 ; WX 778 ; N B ; B 17 0 736 722 ;
XC 67 ; WX 778 ; N C ; B 40 -15 723 737 ;
XC 68 ; WX 833 ; N D ; B 19 0 793 722 ;
XC 69 ; WX 759 ; N E ; B 16 0 707 722 ;
XC 70 ; WX 722 ; N F ; B 22 0 690 722 ;
XC 71 ; WX 833 ; N G ; B 39 -15 817 737 ;
XC 72 ; WX 870 ; N H ; B 20 0 850 722 ;
XC 73 ; WX 444 ; N I ; B 28 0 417 722 ;
XC 74 ; WX 648 ; N J ; B 4 -15 639 722 ;
XC 75 ; WX 815 ; N K ; B 15 0 818 722 ;
XC 76 ; WX 722 ; N L ; B 19 0 701 722 ;
XC 77 ; WX 981 ; N M ; B 9 0 965 722 ;
XC 78 ; WX 833 ; N N ; B 16 -8 833 722 ;
XC 79 ; WX 833 ; N O ; B 39 -15 794 737 ;
XC 80 ; WX 759 ; N P ; B 24 0 735 722 ;
XC 81 ; WX 833 ; N Q ; B 38 -189 808 737 ;
XC 82 ; WX 815 ; N R ; B 20 -15 817 722 ;
XC 83 ; WX 667 ; N S ; B 51 -15 633 737 ;
XC 84 ; WX 722 ; N T ; B 15 0 707 722 ;
XC 85 ; WX 833 ; N U ; B 15 -15 824 722 ;
XC 86 ; WX 759 ; N V ; B -18 -15 778 722 ;
XC 87 ; WX 981 ; N W ; B 6 -15 973 722 ;
XC 88 ; WX 722 ; N X ; B -12 0 735 722 ;
XC 89 ; WX 722 ; N Y ; B -12 0 735 722 ;
XC 90 ; WX 667 ; N Z ; B 24 0 634 722 ;
XC 91 ; WX 389 ; N bracketleft ; B 84 -113 339 722 ;
XC 92 ; WX 606 ; N backslash ; B 50 0 555 737 ;
XC 93 ; WX 389 ; N bracketright ; B 31 -113 286 722 ;
XC 94 ; WX 606 ; N asciicircum ; B 52 322 554 722 ;
XC 95 ; WX 500 ; N underscore ; B 0 -148 500 -58 ;
XC 96 ; WX 241 ; N quoteleft ; B 22 388 219 747 ;
XC 97 ; WX 611 ; N a ; B 36 -15 597 485 ;
XC 98 ; WX 648 ; N b ; B 0 -15 612 737 ;
XC 99 ; WX 556 ; N c ; B 31 -15 527 485 ;
XC 100 ; WX 667 ; N d ; B 37 -15 654 737 ;
XC 101 ; WX 574 ; N e ; B 32 -15 540 485 ;
XC 102 ; WX 389 ; N f ; B 14 0 464 737 ; L i fi ; L l fl ;
XC 103 ; WX 611 ; N g ; B 30 -205 623 536 ;
XC 104 ; WX 685 ; N h ; B 16 0 666 737 ;
XC 105 ; WX 370 ; N i ; B 28 0 341 737 ;
XC 106 ; WX 352 ; N j ; B -82 -205 275 737 ;
XC 107 ; WX 667 ; N k ; B 12 0 660 737 ;
XC 108 ; WX 352 ; N l ; B 16 0 331 737 ;
XC 109 ; WX 963 ; N m ; B 21 0 942 485 ;
XC 110 ; WX 685 ; N n ; B 20 0 668 485 ;
XC 111 ; WX 611 ; N o ; B 31 -15 579 485 ;
XC 112 ; WX 667 ; N p ; B 18 -205 632 485 ;
XC 113 ; WX 648 ; N q ; B 34 -205 640 485 ;
XC 114 ; WX 519 ; N r ; B 18 0 517 485 ;
XC 115 ; WX 500 ; N s ; B 38 -15 466 485 ;
XC 116 ; WX 426 ; N t ; B 23 -15 405 675 ;
XC 117 ; WX 685 ; N u ; B 21 -15 667 475 ;
XC 118 ; WX 611 ; N v ; B 12 -8 598 475 ;
XC 119 ; WX 889 ; N w ; B 19 -8 876 475 ;
XC 120 ; WX 611 ; N x ; B 13 0 598 475 ;
XC 121 ; WX 611 ; N y ; B 10 -208 598 475 ;
XC 122 ; WX 537 ; N z ; B 35 0 495 475 ;
XC 123 ; WX 389 ; N braceleft ; B 84 -111 343 722 ;
XC 124 ; WX 606 ; N bar ; B 243 0 362 737 ;
XC 125 ; WX 389 ; N braceright ; B 31 -111 290 722 ;
XC 126 ; WX 606 ; N asciitilde ; B 51 141 555 347 ;
XC 161 ; WX 296 ; N exclamdown ; B 53 -205 241 547 ;
XC 162 ; WX 574 ; N cent ; B 36 -108 534 566 ;
XC 163 ; WX 574 ; N sterling ; B 20 -15 561 705 ;
XC 164 ; WX 167 ; N fraction ; B -166 0 333 705 ;
XC 165 ; WX 574 ; N yen ; B 3 0 571 705 ;
XC 166 ; WX 574 ; N florin ; B 14 -205 549 737 ;
XC 167 ; WX 500 ; N section ; B 63 -86 438 737 ;
XC 168 ; WX 574 ; N currency ; B 33 86 540 591 ;
XC 169 ; WX 241 ; N quotesingle ; B 52 418 188 737 ;
XC 170 ; WX 481 ; N quotedblleft ; B 22 388 457 747 ;
XC 171 ; WX 500 ; N guillemotleft ; B 49 86 442 405 ;
XC 172 ; WX 333 ; N guilsinglleft ; B 72 86 266 405 ;
XC 173 ; WX 333 ; N guilsinglright ; B 73 89 268 408 ;
XC 174 ; WX 685 ; N fi ; B 15 0 667 737 ;
XC 175 ; WX 685 ; N fl ; B 15 0 666 737 ;
XC 177 ; WX 500 ; N endash ; B 0 191 500 296 ;
XC 178 ; WX 500 ; N dagger ; B 44 -88 451 737 ;
XC 179 ; WX 500 ; N daggerdbl ; B 47 -89 458 736 ;
XC 180 ; WX 278 ; N periodcentered ; B 46 150 234 338 ;
XC 182 ; WX 747 ; N paragraph ; B 35 0 713 722 ;
XC 183 ; WX 606 ; N bullet ; B 131 170 475 511 ;
XC 184 ; WX 241 ; N quotesinglbase ; B 22 -189 219 169 ;
XC 185 ; WX 481 ; N quotedblbase ; B 23 -189 458 169 ;
XC 186 ; WX 481 ; N quotedblright ; B 23 379 458 737 ;
XC 187 ; WX 500 ; N guillemotright ; B 56 86 451 405 ;
XC 188 ; WX 1000 ; N ellipsis ; B 73 -15 927 172 ;
XC 189 ; WX 1000 ; N perthousand ; B 8 -27 994 694 ;
XC 191 ; WX 500 ; N questiondown ; B 23 -205 476 547 ;
XC 193 ; WX 333 ; N grave ; B 2 545 249 734 ;
XC 194 ; WX 333 ; N acute ; B 84 548 331 737 ;
XC 195 ; WX 333 ; N circumflex ; B -8 544 343 722 ;
XC 196 ; WX 333 ; N tilde ; B -23 565 358 704 ;
XC 197 ; WX 333 ; N macron ; B -5 583 339 663 ;
XC 198 ; WX 333 ; N breve ; B 9 545 324 712 ;
XC 199 ; WX 333 ; N dotaccent ; B 96 552 237 693 ;
XC 200 ; WX 333 ; N dieresis ; B -11 552 345 693 ;
XC 202 ; WX 333 ; N ring ; B 59 545 274 760 ;
XC 203 ; WX 333 ; N cedilla ; B 17 -221 251 0 ;
XC 205 ; WX 333 ; N hungarumlaut ; B 68 550 365 737 ;
XC 206 ; WX 333 ; N ogonek ; B 68 -163 246 0 ;
XC 207 ; WX 333 ; N caron ; B -8 544 343 722 ;
XC 208 ; WX 1000 ; N emdash ; B 0 191 1000 296 ;
XC 225 ; WX 981 ; N AE ; B -29 0 963 722 ;
XC 227 ; WX 367 ; N ordfeminine ; B 1 294 365 737 ;
XC 232 ; WX 722 ; N Lslash ; B 19 0 701 722 ;
XC 233 ; WX 833 ; N Oslash ; B 39 -60 793 768 ;
XC 234 ; WX 1000 ; N OE ; B 5 0 987 722 ;
XC 235 ; WX 367 ; N ordmasculine ; B 1 294 357 737 ;
XC 241 ; WX 870 ; N ae ; B 30 -15 837 485 ;
XC 245 ; WX 370 ; N dotlessi ; B 28 0 341 475 ;
XC 248 ; WX 352 ; N lslash ; B 16 0 331 737 ;
XC 249 ; WX 611 ; N oslash ; B 31 -111 579 565 ;
XC 250 ; WX 907 ; N oe ; B 35 -15 872 485 ;
XC 251 ; WX 611 ; N germandbls ; B 6 -15 575 737 ;
XC -1 ; WX 759 ; N Aacute ; B -18 0 778 984 ;
XC -1 ; WX 759 ; N Acircumflex ; B -18 0 778 969 ;
XC -1 ; WX 759 ; N Adieresis ; B -18 0 778 940 ;
XC -1 ; WX 759 ; N Agrave ; B -18 0 778 981 ;
XC -1 ; WX 759 ; N Aring ; B -18 0 778 1007 ;
XC -1 ; WX 759 ; N Atilde ; B -18 0 778 951 ;
XC -1 ; WX 778 ; N Ccedilla ; B 40 -221 723 737 ;
XC -1 ; WX 759 ; N Eacute ; B 16 0 707 984 ;
XC -1 ; WX 759 ; N Ecircumflex ; B 16 0 707 969 ;
XC -1 ; WX 759 ; N Edieresis ; B 16 0 707 940 ;
XC -1 ; WX 759 ; N Egrave ; B 16 0 707 981 ;
XC -1 ; WX 833 ; N Eth ; B 19 0 793 722 ;
XC -1 ; WX 444 ; N Iacute ; B 28 0 417 984 ;
XC -1 ; WX 444 ; N Icircumflex ; B 28 0 417 969 ;
XC -1 ; WX 444 ; N Idieresis ; B 28 0 417 940 ;
XC -1 ; WX 444 ; N Igrave ; B 28 0 417 981 ;
XC -1 ; WX 833 ; N Ntilde ; B 16 -8 833 951 ;
XC -1 ; WX 833 ; N Oacute ; B 39 -15 794 984 ;
XC -1 ; WX 833 ; N Ocircumflex ; B 39 -15 794 969 ;
XC -1 ; WX 833 ; N Odieresis ; B 39 -15 794 940 ;
XC -1 ; WX 833 ; N Ograve ; B 39 -15 794 981 ;
XC -1 ; WX 833 ; N Otilde ; B 39 -15 794 951 ;
XC -1 ; WX 667 ; N Scaron ; B 51 -15 633 969 ;
XC -1 ; WX 759 ; N Thorn ; B 24 0 735 722 ;
XC -1 ; WX 833 ; N Uacute ; B 15 -15 824 984 ;
XC -1 ; WX 833 ; N Ucircumflex ; B 15 -15 824 969 ;
XC -1 ; WX 833 ; N Udieresis ; B 15 -15 824 940 ;
XC -1 ; WX 833 ; N Ugrave ; B 15 -15 824 981 ;
XC -1 ; WX 722 ; N Yacute ; B -12 0 735 984 ;
XC -1 ; WX 722 ; N Ydieresis ; B -12 0 735 940 ;
XC -1 ; WX 667 ; N Zcaron ; B 24 0 634 969 ;
XC -1 ; WX 611 ; N aacute ; B 36 -15 597 737 ;
XC -1 ; WX 611 ; N acircumflex ; B 36 -15 597 722 ;
XC -1 ; WX 611 ; N adieresis ; B 36 -15 597 693 ;
XC -1 ; WX 611 ; N agrave ; B 36 -15 597 734 ;
XC -1 ; WX 611 ; N aring ; B 36 -15 597 760 ;
XC -1 ; WX 611 ; N atilde ; B 36 -15 597 704 ;
XC -1 ; WX 606 ; N brokenbar ; B 243 0 362 737 ;
XC -1 ; WX 556 ; N ccedilla ; B 31 -221 527 485 ;
XC -1 ; WX 747 ; N copyright ; B 5 -15 741 737 ;
XC -1 ; WX 400 ; N degree ; B 50 405 350 705 ;
XC -1 ; WX 606 ; N divide ; B 51 9 555 514 ;
XC -1 ; WX 574 ; N eacute ; B 32 -15 540 737 ;
XC -1 ; WX 574 ; N ecircumflex ; B 32 -15 540 722 ;
XC -1 ; WX 574 ; N edieresis ; B 32 -15 540 693 ;
XC -1 ; WX 574 ; N egrave ; B 32 -15 540 734 ;
XC -1 ; WX 611 ; N eth ; B 31 -15 579 737 ;
XC -1 ; WX 370 ; N iacute ; B 28 0 350 737 ;
XC -1 ; WX 370 ; N icircumflex ; B 11 0 362 722 ;
XC -1 ; WX 370 ; N idieresis ; B 8 0 364 693 ;
XC -1 ; WX 370 ; N igrave ; B 21 0 341 734 ;
XC -1 ; WX 606 ; N logicalnot ; B 51 108 555 399 ;
XC -1 ; WX 606 ; N minus ; B 51 186 555 302 ;
XC -1 ; WX 685 ; N mu ; B 21 -205 667 475 ;
XC -1 ; WX 606 ; N multiply ; B 51 0 555 504 ;
XC -1 ; WX 685 ; N ntilde ; B 20 0 668 704 ;
XC -1 ; WX 611 ; N oacute ; B 31 -15 579 737 ;
XC -1 ; WX 611 ; N ocircumflex ; B 31 -15 579 722 ;
XC -1 ; WX 611 ; N odieresis ; B 31 -15 579 693 ;
XC -1 ; WX 611 ; N ograve ; B 31 -15 579 734 ;
XC -1 ; WX 861 ; N onehalf ; B 39 -2 832 705 ;
XC -1 ; WX 861 ; N onequarter ; B 39 0 822 705 ;
XC -1 ; WX 344 ; N onesuperior ; B 39 282 304 705 ;
XC -1 ; WX 611 ; N otilde ; B 31 -15 579 704 ;
XC -1 ; WX 606 ; N plusminus ; B 51 0 555 514 ;
XC -1 ; WX 747 ; N registered ; B 5 -15 741 737 ;
XC -1 ; WX 500 ; N scaron ; B 38 -15 466 722 ;
XC -1 ; WX 667 ; N thorn ; B 18 -205 632 675 ;
XC -1 ; WX 861 ; N threequarters ; B 8 0 822 705 ;
XC -1 ; WX 344 ; N threesuperior ; B 8 273 336 705 ;
XC -1 ; WX 1000 ; N trademark ; B 30 318 970 722 ;
XC -1 ; WX 344 ; N twosuperior ; B 5 280 338 705 ;
XC -1 ; WX 685 ; N uacute ; B 21 -15 667 737 ;
XC -1 ; WX 685 ; N ucircumflex ; B 21 -15 667 722 ;
XC -1 ; WX 685 ; N udieresis ; B 21 -15 667 693 ;
XC -1 ; WX 685 ; N ugrave ; B 21 -15 667 734 ;
XC -1 ; WX 611 ; N yacute ; B 10 -208 598 737 ;
XC -1 ; WX 611 ; N ydieresis ; B 10 -208 598 693 ;
XC -1 ; WX 537 ; N zcaron ; B 35 0 495 722 ;
XEndCharMetrics
XStartKernData
XStartKernPairs 101


X
XKPX A y -74
XKPX A w -74
XKPX A v -74
XKPX A space -55
XKPX A quoteright -74
XKPX A Y -92

XKPX A W -74
XKPX A V -92


XKPX A T -55
X
XKPX F period -111
XKPX F comma -111

XKPX F A -74
X
XKPX L y -55
XKPX L space -18
XKPX L quoteright -55

XKPX L Y -92
XKPX L W -74

XKPX L V -92


XKPX L T -55
X
XKPX P space -18
XKPX P period -129
XKPX P comma -129

XKPX P A -74
X

XKPX R y -18
XKPX R Y -37
XKPX R W -37
XKPX R V -37
X
XKPX T y -52
XKPX T w -71
XKPX T u -71
XKPX T semicolon -55
XKPX T s -62
XKPX T r -62
XKPX T period -92
XKPX T o -92
XKPX T i -25


XKPX T hyphen -92
XKPX T e -92

XKPX T comma -92
XKPX T colon -55
XKPX T c -81
XKPX T a -62


XKPX T A -55
X

XKPX V y -92
XKPX V u -74

XKPX V semicolon -74


XKPX V r -74
XKPX V period -129
XKPX V o -92

XKPX V i -44
XKPX V hyphen -92
XKPX V e -92
XKPX V colon -74
XKPX V a -92
XKPX V A -92


X
XKPX W y -74

XKPX W u -55
XKPX W semicolon -37
XKPX W r -55
XKPX W period -111
XKPX W o -55
XKPX W i -37


XKPX W hyphen -37
XKPX W e -55

XKPX W comma -111


XKPX W colon -37
XKPX W a -74
XKPX W A -74
X

XKPX Y v -81
XKPX Y u -92


XKPX Y semicolon -92
XKPX Y q -111

XKPX Y period -111
XKPX Y p -81
XKPX Y o -111
XKPX Y i -44
XKPX Y hyphen -111
XKPX Y e -111
XKPX Y comma -111


XKPX Y colon -92
XKPX Y a -111
XKPX Y A -92
X

XKPX f quoteright 94
X

XKPX one one -55
X

XKPX quoteleft quoteleft -18
X

XKPX quoteright t -18


XKPX quoteright space -55
XKPX quoteright s -37
XKPX quoteright quoteright -18
X
XKPX r quoteright 55

XKPX r period -74
XKPX r hyphen -18
XKPX r comma -74


X
XKPX space Y -37

XKPX space A -55
X

XKPX v period -111
XKPX v comma -111
X
XKPX w period -92
XKPX w comma -92
X
XKPX y period -111
XKPX y comma -111
XEndKernPairs
XEndKernData
XStartComposites 58
XCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 167 247 ;
XCC zcaron 2 ; PCC z 0 0 ; PCC caron 102 0 ;
XCC Scaron 2 ; PCC S 0 0 ; PCC caron 167 247 ;
XCC scaron 2 ; PCC s 0 0 ; PCC caron 83 0 ;
XCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 222 0 ;
XCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 111 0 ;
XCC Yacute 2 ; PCC Y 0 0 ; PCC acute 194 247 ;
XCC yacute 2 ; PCC y 0 0 ; PCC acute 139 0 ;
XCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 194 247 ;
XCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 139 0 ;


XCC Uacute 2 ; PCC U 0 0 ; PCC acute 250 247 ;

XCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 250 247 ;
XCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 250 247 ;
XCC Ugrave 2 ; PCC U 0 0 ; PCC grave 250 247 ;
XCC uacute 2 ; PCC u 0 0 ; PCC acute 176 0 ;
XCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 176 0 ;
XCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 176 0 ;
XCC ugrave 2 ; PCC u 0 0 ; PCC grave 176 0 ;
XCC Iacute 2 ; PCC I 0 0 ; PCC acute 55 247 ;
XCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex 55 247 ;
XCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis 55 247 ;
XCC Igrave 2 ; PCC I 0 0 ; PCC grave 55 247 ;
XCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute 18 0 ;
XCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex 18 0 ;
XCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis 18 0 ;
XCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave 18 0 ;
XCC Eacute 2 ; PCC E 0 0 ; PCC acute 213 247 ;
XCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 213 247 ;
XCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 213 247 ;
XCC Egrave 2 ; PCC E 0 0 ; PCC grave 213 247 ;
XCC eacute 2 ; PCC e 0 0 ; PCC acute 120 0 ;
XCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 120 0 ;
XCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 120 0 ;
XCC egrave 2 ; PCC e 0 0 ; PCC grave 120 0 ;
XCC Aacute 2 ; PCC A 0 0 ; PCC acute 213 247 ;
XCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 213 247 ;
XCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 213 247 ;
XCC Agrave 2 ; PCC A 0 0 ; PCC grave 213 247 ;
XCC aacute 2 ; PCC a 0 0 ; PCC acute 139 0 ;
XCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 139 0 ;
XCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 139 0 ;
XCC agrave 2 ; PCC a 0 0 ; PCC grave 139 0 ;
XCC Oacute 2 ; PCC O 0 0 ; PCC acute 250 247 ;
XCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 250 247 ;
XCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 250 247 ;
XCC Ograve 2 ; PCC O 0 0 ; PCC grave 250 247 ;
XCC oacute 2 ; PCC o 0 0 ; PCC acute 139 0 ;
XCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 139 0 ;
XCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 139 0 ;
XCC ograve 2 ; PCC o 0 0 ; PCC grave 139 0 ;
XCC Atilde 2 ; PCC A 0 0 ; PCC tilde 213 247 ;
XCC atilde 2 ; PCC a 0 0 ; PCC tilde 139 0 ;


XCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 250 247 ;

XCC ntilde 2 ; PCC n 0 0 ; PCC tilde 176 0 ;
XCC Otilde 2 ; PCC O 0 0 ; PCC tilde 250 247 ;
XCC otilde 2 ; PCC o 0 0 ; PCC tilde 139 0 ;
XCC Aring 2 ; PCC A 0 0 ; PCC ring 213 247 ;
XCC aring 2 ; PCC a 0 0 ; PCC ring 139 0 ;
XEndComposites
XEndFontMetrics
END_OF_FILE
if test 15554 -ne `wc -c <'lout/font0/NewCenSchBol.AFM'`; then
echo shar: \"'lout/font0/NewCenSchBol.AFM'\" unpacked with wrong size!
fi
# end of 'lout/font0/NewCenSchBol.AFM'
fi
if test -f 'lout/font0/PalatRom.AFM' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/font0/PalatRom.AFM'\"
else
echo shar: Extracting \"'lout/font0/PalatRom.AFM'\" \(15565 characters\)
sed "s/^X//" >'lout/font0/PalatRom.AFM' <<'END_OF_FILE'


XStartFontMetrics 2.0
XComment Copyright (c) 1984 Adobe Systems Incorporated. All Rights Reserved.

XComment Creation Date:Thu Feb 5 18:08:32 PST 1987
XFontName Palatino-Roman
XEncodingScheme AdobeStandardEncoding
XFullName Palatino Roman
XFamilyName Palatino
XWeight Roman
XItalicAngle 0.0
XIsFixedPitch false
XUnderlinePosition -141
XUnderlineThickness 38
XVersion 001.001


XNotice Palatino is a trademark of Allied Corporation.

XFontBBox -166 -283 1072 925
XCapHeight 694
XXHeight 468
XDescender -283
XAscender 723
XStartCharMetrics 228
XC 32 ; WX 250 ; N space ; B 0 0 0 0 ;
XC 33 ; WX 278 ; N exclam ; B 81 -5 197 694 ;
XC 34 ; WX 371 ; N quotedbl ; B 52 454 319 694 ;
XC 35 ; WX 500 ; N numbersign ; B 4 0 495 684 ;
XC 36 ; WX 500 ; N dollar ; B 30 -116 471 731 ;
XC 37 ; WX 840 ; N percent ; B 79 -20 761 689 ;
XC 38 ; WX 778 ; N ampersand ; B 43 -20 753 689 ;
XC 39 ; WX 278 ; N quoteright ; B 22 431 210 694 ;
XC 40 ; WX 333 ; N parenleft ; B 60 -116 301 731 ;
XC 41 ; WX 333 ; N parenright ; B 32 -116 273 731 ;
XC 42 ; WX 389 ; N asterisk ; B 30 337 369 689 ;
XC 43 ; WX 606 ; N plus ; B 51 7 555 512 ;
XC 44 ; WX 250 ; N comma ; B 16 -155 218 123 ;
XC 45 ; WX 333 ; N hyphen ; B 17 215 312 287 ;
XC 46 ; WX 250 ; N period ; B 67 -5 183 111 ;
XC 47 ; WX 606 ; N slash ; B 87 -116 519 731 ;
XC 48 ; WX 500 ; N zero ; B 29 -20 465 689 ;
XC 49 ; WX 500 ; N one ; B 60 -5 395 684 ;
XC 50 ; WX 500 ; N two ; B 16 -5 468 689 ;
XC 51 ; WX 500 ; N three ; B 15 -16 462 689 ;
XC 52 ; WX 500 ; N four ; B 5 -5 472 689 ;
XC 53 ; WX 500 ; N five ; B 13 -20 459 689 ;
XC 54 ; WX 500 ; N six ; B 32 -20 468 689 ;
XC 55 ; WX 500 ; N seven ; B 44 -5 497 689 ;
XC 56 ; WX 500 ; N eight ; B 30 -20 464 689 ;
XC 57 ; WX 500 ; N nine ; B 24 -20 461 689 ;
XC 58 ; WX 250 ; N colon ; B 66 -5 182 457 ;
XC 59 ; WX 250 ; N semicolon ; B 16 -153 218 457 ;
XC 60 ; WX 606 ; N less ; B 57 2 558 524 ;
XC 61 ; WX 606 ; N equal ; B 51 136 555 386 ;
XC 62 ; WX 606 ; N greater ; B 48 0 549 522 ;
XC 63 ; WX 444 ; N question ; B 43 -5 395 694 ;
XC 64 ; WX 747 ; N at ; B 29 -20 729 694 ;
XC 65 ; WX 778 ; N A ; B 15 -5 756 700 ;
XC 66 ; WX 611 ; N B ; B 26 -6 577 694 ;
XC 67 ; WX 709 ; N C ; B 22 -20 673 709 ;
XC 68 ; WX 774 ; N D ; B 25 -6 751 694 ;
XC 69 ; WX 611 ; N E ; B 26 -5 572 694 ;
XC 70 ; WX 556 ; N F ; B 26 -5 558 694 ;
XC 71 ; WX 763 ; N G ; B 22 -20 723 709 ;
XC 72 ; WX 832 ; N H ; B 26 -5 806 694 ;
XC 73 ; WX 337 ; N I ; B 26 -5 311 694 ;
XC 74 ; WX 333 ; N J ; B -13 -194 307 694 ;
XC 75 ; WX 726 ; N K ; B 26 -5 723 694 ;
XC 76 ; WX 611 ; N L ; B 26 -5 586 694 ;
XC 77 ; WX 946 ; N M ; B 16 -13 922 694 ;
XC 78 ; WX 831 ; N N ; B 11 -20 809 694 ;
XC 79 ; WX 786 ; N O ; B 22 -20 764 709 ;
XC 80 ; WX 604 ; N P ; B 26 -5 584 694 ;
XC 81 ; WX 786 ; N Q ; B 22 -177 764 709 ;
XC 82 ; WX 668 ; N R ; B 26 -5 665 694 ;
XC 83 ; WX 525 ; N S ; B 22 -20 503 709 ;
XC 84 ; WX 613 ; N T ; B 18 -5 595 694 ;
XC 85 ; WX 778 ; N U ; B 16 -20 765 694 ;
XC 86 ; WX 722 ; N V ; B 8 -9 706 694 ;
XC 87 ; WX 1000 ; N W ; B 8 -9 984 700 ;
XC 88 ; WX 667 ; N X ; B 14 -5 648 694 ;
XC 89 ; WX 667 ; N Y ; B 9 -5 654 701 ;
XC 90 ; WX 667 ; N Z ; B 15 -5 638 694 ;
XC 91 ; WX 333 ; N bracketleft ; B 82 -116 286 731 ;
XC 92 ; WX 606 ; N backslash ; B 81 0 525 731 ;
XC 93 ; WX 333 ; N bracketright ; B 47 -116 251 731 ;
XC 94 ; WX 606 ; N asciicircum ; B 51 325 554 731 ;
XC 95 ; WX 500 ; N underscore ; B 0 -160 500 -122 ;
XC 96 ; WX 278 ; N quoteleft ; B 68 431 256 694 ;
XC 97 ; WX 500 ; N a ; B 30 -20 469 469 ;
XC 98 ; WX 553 ; N b ; B -2 -12 521 723 ;
XC 99 ; WX 444 ; N c ; B 32 -20 419 469 ;
XC 100 ; WX 611 ; N d ; B 32 -12 574 723 ;
XC 101 ; WX 479 ; N e ; B 32 -20 454 469 ;
XC 102 ; WX 333 ; N f ; B 23 -5 341 723 ; L i fi ; L l fl ;
XC 103 ; WX 556 ; N g ; B 32 -283 544 469 ;
XC 104 ; WX 582 ; N h ; B 23 -5 566 723 ;
XC 105 ; WX 291 ; N i ; B 23 -5 273 687 ;
XC 106 ; WX 234 ; N j ; B -14 -283 194 689 ;
XC 107 ; WX 556 ; N k ; B 23 -12 551 723 ;
XC 108 ; WX 291 ; N l ; B 23 -5 273 723 ;
XC 109 ; WX 883 ; N m ; B 23 -5 867 469 ;
XC 110 ; WX 582 ; N n ; B 23 -5 566 469 ;
XC 111 ; WX 546 ; N o ; B 32 -20 514 469 ;
XC 112 ; WX 601 ; N p ; B 23 -283 569 469 ;
XC 113 ; WX 560 ; N q ; B 32 -283 557 469 ;
XC 114 ; WX 395 ; N r ; B 23 -5 379 469 ;
XC 115 ; WX 424 ; N s ; B 33 -20 391 469 ;
XC 116 ; WX 326 ; N t ; B 24 -12 314 621 ;
XC 117 ; WX 603 ; N u ; B 15 -12 581 469 ;
XC 118 ; WX 565 ; N v ; B 16 -7 549 459 ;
XC 119 ; WX 834 ; N w ; B 16 -7 818 464 ;
XC 120 ; WX 516 ; N x ; B 20 -5 496 468 ;
XC 121 ; WX 556 ; N y ; B 12 -283 544 459 ;
XC 122 ; WX 500 ; N z ; B 16 -5 466 464 ;
XC 123 ; WX 333 ; N braceleft ; B 58 -116 289 731 ;
XC 124 ; WX 606 ; N bar ; B 275 0 331 731 ;
XC 125 ; WX 333 ; N braceright ; B 44 -116 275 731 ;
XC 126 ; WX 606 ; N asciitilde ; B 51 176 555 347 ;
XC 161 ; WX 278 ; N exclamdown ; B 75 -225 192 469 ;
XC 162 ; WX 500 ; N cent ; B 64 -101 451 562 ;
XC 163 ; WX 500 ; N sterling ; B 10 -13 478 694 ;
XC 164 ; WX 167 ; N fraction ; B -166 -13 333 692 ;
XC 165 ; WX 500 ; N yen ; B -40 -5 525 701 ;
XC 166 ; WX 500 ; N florin ; B 3 -262 476 706 ;
XC 167 ; WX 500 ; N section ; B 26 -197 465 694 ;
XC 168 ; WX 500 ; N currency ; B 17 113 483 575 ;
XC 169 ; WX 208 ; N quotesingle ; B 61 454 147 694 ;
XC 170 ; WX 500 ; N quotedblleft ; B 77 431 475 694 ;
XC 171 ; WX 500 ; N guillemotleft ; B 50 71 450 428 ;
XC 172 ; WX 331 ; N guilsinglleft ; B 66 71 265 428 ;
XC 173 ; WX 331 ; N guilsinglright ; B 66 71 265 428 ;
XC 174 ; WX 605 ; N fi ; B 23 -5 587 723 ;
XC 175 ; WX 608 ; N fl ; B 23 -5 590 723 ;
XC 177 ; WX 500 ; N endash ; B 0 219 500 277 ;
XC 178 ; WX 500 ; N dagger ; B 34 -5 466 694 ;
XC 179 ; WX 500 ; N daggerdbl ; B 34 -249 466 694 ;
XC 180 ; WX 250 ; N periodcentered ; B 67 203 184 319 ;
XC 182 ; WX 628 ; N paragraph ; B 39 -150 589 694 ;
XC 183 ; WX 606 ; N bullet ; B 131 172 475 516 ;
XC 184 ; WX 278 ; N quotesinglbase ; B 22 -153 210 110 ;
XC 185 ; WX 500 ; N quotedblbase ; B 22 -153 423 110 ;
XC 186 ; WX 500 ; N quotedblright ; B 25 431 423 694 ;
XC 187 ; WX 500 ; N guillemotright ; B 50 71 450 428 ;
XC 188 ; WX 1000 ; N ellipsis ; B 109 -5 891 111 ;
XC 189 ; WX 1144 ; N perthousand ; B 79 -50 1072 709 ;
XC 191 ; WX 444 ; N questiondown ; B 43 -230 392 469 ;
XC 193 ; WX 333 ; N grave ; B 14 524 238 695 ;
XC 194 ; WX 333 ; N acute ; B 88 524 313 696 ;
XC 195 ; WX 333 ; N circumflex ; B 7 522 319 689 ;
XC 196 ; WX 333 ; N tilde ; B -1 549 329 654 ;
XC 197 ; WX 333 ; N macron ; B 7 564 319 617 ;
XC 198 ; WX 333 ; N breve ; B 22 523 304 681 ;
XC 199 ; WX 250 ; N dotaccent ; B 75 539 175 639 ;
XC 200 ; WX 333 ; N dieresis ; B 17 576 316 676 ;
XC 202 ; WX 333 ; N ring ; B 94 66 344 720 ;
XC 203 ; WX 333 ; N cedilla ; B 36 -206 244 9 ;
XC 205 ; WX 380 ; N hungarumlaut ; B 8 528 372 700 ;
XC 206 ; WX 313 ; N ogonek ; B 68 -155 245 -10 ;
XC 207 ; WX 333 ; N caron ; B 7 523 319 689 ;
XC 208 ; WX 1000 ; N emdash ; B 0 219 1000 277 ;
XC 225 ; WX 944 ; N AE ; B 13 -5 908 694 ;
XC 227 ; WX 333 ; N ordfeminine ; B 24 312 309 694 ;
XC 232 ; WX 611 ; N Lslash ; B 26 -5 586 694 ;
XC 233 ; WX 833 ; N Oslash ; B 30 -20 797 709 ;
XC 234 ; WX 998 ; N OE ; B 22 -20 962 709 ;
XC 235 ; WX 333 ; N ordmasculine ; B 10 312 324 694 ;
XC 241 ; WX 758 ; N ae ; B 30 -20 732 469 ;
XC 245 ; WX 287 ; N dotlessi ; B 23 -5 273 469 ;
XC 248 ; WX 291 ; N lslash ; B 23 -5 274 723 ;
XC 249 ; WX 556 ; N oslash ; B 16 -23 530 474 ;
XC 250 ; WX 827 ; N oe ; B 32 -20 800 469 ;
XC 251 ; WX 556 ; N germandbls ; B 23 -9 519 731 ;
XC -1 ; WX 778 ; N Aacute ; B 15 -5 756 922 ;
XC -1 ; WX 778 ; N Acircumflex ; B 15 -5 756 915 ;
XC -1 ; WX 778 ; N Adieresis ; B 15 -5 756 902 ;
XC -1 ; WX 778 ; N Agrave ; B 15 -5 756 921 ;
XC -1 ; WX 778 ; N Aring ; B 15 -5 756 925 ;
XC -1 ; WX 778 ; N Atilde ; B 15 -5 756 880 ;
XC -1 ; WX 709 ; N Ccedilla ; B 22 -206 673 709 ;
XC -1 ; WX 611 ; N Eacute ; B 26 -5 572 922 ;
XC -1 ; WX 611 ; N Ecircumflex ; B 26 -5 572 915 ;
XC -1 ; WX 611 ; N Edieresis ; B 26 -5 572 902 ;
XC -1 ; WX 611 ; N Egrave ; B 26 -5 572 921 ;
XC -1 ; WX 774 ; N Eth ; B 12 -6 751 694 ;
XC -1 ; WX 337 ; N Iacute ; B 26 -5 315 922 ;
XC -1 ; WX 337 ; N Icircumflex ; B 9 -5 321 915 ;
XC -1 ; WX 337 ; N Idieresis ; B 19 -5 318 902 ;
XC -1 ; WX 337 ; N Igrave ; B 16 -5 311 921 ;
XC -1 ; WX 831 ; N Ntilde ; B 11 -20 809 880 ;
XC -1 ; WX 786 ; N Oacute ; B 22 -20 764 922 ;
XC -1 ; WX 786 ; N Ocircumflex ; B 22 -20 764 915 ;
XC -1 ; WX 786 ; N Odieresis ; B 22 -20 764 902 ;
XC -1 ; WX 786 ; N Ograve ; B 22 -20 764 921 ;
XC -1 ; WX 786 ; N Otilde ; B 22 -20 764 880 ;
XC -1 ; WX 525 ; N Scaron ; B 22 -20 503 915 ;
XC -1 ; WX 604 ; N Thorn ; B 26 -5 584 694 ;
XC -1 ; WX 778 ; N Uacute ; B 16 -20 765 922 ;
XC -1 ; WX 778 ; N Ucircumflex ; B 16 -20 765 915 ;
XC -1 ; WX 778 ; N Udieresis ; B 16 -20 765 902 ;
XC -1 ; WX 778 ; N Ugrave ; B 16 -20 765 921 ;
XC -1 ; WX 667 ; N Yacute ; B 9 -5 654 922 ;
XC -1 ; WX 667 ; N Ydieresis ; B 9 -5 654 902 ;
XC -1 ; WX 667 ; N Zcaron ; B 15 -5 638 915 ;
XC -1 ; WX 500 ; N aacute ; B 30 -20 469 696 ;
XC -1 ; WX 500 ; N acircumflex ; B 30 -20 469 689 ;
XC -1 ; WX 500 ; N adieresis ; B 30 -20 469 676 ;
XC -1 ; WX 500 ; N agrave ; B 30 -20 469 695 ;
XC -1 ; WX 500 ; N aring ; B 30 -20 469 720 ;
XC -1 ; WX 500 ; N atilde ; B 30 -20 469 654 ;
XC -1 ; WX 606 ; N brokenbar ; B 275 0 331 731 ;
XC -1 ; WX 444 ; N ccedilla ; B 32 -206 419 469 ;
XC -1 ; WX 747 ; N copyright ; B 24 -20 724 694 ;
XC -1 ; WX 400 ; N degree ; B 50 389 350 689 ;
XC -1 ; WX 606 ; N divide ; B 51 10 555 512 ;
XC -1 ; WX 479 ; N eacute ; B 32 -20 454 696 ;
XC -1 ; WX 479 ; N ecircumflex ; B 32 -20 454 689 ;
XC -1 ; WX 479 ; N edieresis ; B 32 -20 454 676 ;
XC -1 ; WX 479 ; N egrave ; B 32 -20 454 695 ;
XC -1 ; WX 546 ; N eth ; B 32 -20 514 732 ;
XC -1 ; WX 287 ; N iacute ; B 23 -5 280 696 ;
XC -1 ; WX 287 ; N icircumflex ; B -16 -5 296 689 ;
XC -1 ; WX 287 ; N idieresis ; B -6 -5 293 676 ;
XC -1 ; WX 287 ; N igrave ; B 1 -5 273 695 ;
XC -1 ; WX 606 ; N logicalnot ; B 51 120 551 386 ;
XC -1 ; WX 606 ; N minus ; B 51 233 555 289 ;
XC -1 ; WX 603 ; N mu ; B 15 -241 581 469 ;
XC -1 ; WX 606 ; N multiply ; B 83 34 523 474 ;
XC -1 ; WX 582 ; N ntilde ; B 23 -5 566 654 ;
XC -1 ; WX 546 ; N oacute ; B 32 -20 514 696 ;
XC -1 ; WX 546 ; N ocircumflex ; B 32 -20 514 689 ;
XC -1 ; WX 546 ; N odieresis ; B 32 -20 514 676 ;
XC -1 ; WX 546 ; N ograve ; B 32 -20 514 695 ;
XC -1 ; WX 750 ; N onehalf ; B 15 -13 735 692 ;
XC -1 ; WX 750 ; N onequarter ; B 30 -13 721 692 ;
XC -1 ; WX 300 ; N onesuperior ; B 37 276 263 689 ;
XC -1 ; WX 546 ; N otilde ; B 32 -20 514 654 ;
XC -1 ; WX 606 ; N plusminus ; B 51 0 555 512 ;
XC -1 ; WX 747 ; N registered ; B 24 -20 724 694 ;
XC -1 ; WX 424 ; N scaron ; B 33 -20 391 689 ;
XC -1 ; WX 601 ; N thorn ; B 23 -283 569 731 ;
XC -1 ; WX 750 ; N threequarters ; B 21 -13 730 692 ;
XC -1 ; WX 300 ; N threesuperior ; B 5 266 295 689 ;
XC -1 ; WX 979 ; N trademark ; B 35 285 945 689 ;
XC -1 ; WX 300 ; N twosuperior ; B 3 273 297 689 ;
XC -1 ; WX 603 ; N uacute ; B 15 -12 581 696 ;
XC -1 ; WX 603 ; N ucircumflex ; B 15 -12 581 689 ;
XC -1 ; WX 603 ; N udieresis ; B 15 -12 581 676 ;
XC -1 ; WX 603 ; N ugrave ; B 15 -12 581 695 ;
XC -1 ; WX 556 ; N yacute ; B 12 -283 544 696 ;
XC -1 ; WX 556 ; N ydieresis ; B 12 -283 544 676 ;
XC -1 ; WX 500 ; N zcaron ; B 16 -5 466 689 ;
XEndCharMetrics
XStartKernData
XStartKernPairs 111


X
XKPX A y -74
XKPX A w -74

XKPX A v -92


XKPX A space -55
XKPX A quoteright -74

XKPX A Y -111
XKPX A W -74


XKPX A V -111
XKPX A T -74
X

XKPX F period -92
XKPX F comma -92
XKPX F A -74
X
XKPX L y -55

XKPX L space -37
XKPX L quoteright -74


XKPX L Y -92
XKPX L W -74

XKPX L V -92


XKPX L T -74
X

XKPX P space -18
XKPX P period -129
XKPX P comma -129
XKPX P A -92
X

XKPX R y -37
XKPX R Y -37
XKPX R W -37


XKPX R V -55
XKPX R T -37
X

XKPX T y -90
XKPX T w -90
XKPX T u -90
XKPX T semicolon -55
XKPX T s -90
XKPX T r -90


XKPX T period -74
XKPX T o -92

XKPX T i -55
XKPX T hyphen -55


XKPX T e -92
XKPX T comma -74

XKPX T colon -55
XKPX T c -111


XKPX T a -92
XKPX T O -18
XKPX T A -74
X
XKPX V y -92
XKPX V u -92

XKPX V semicolon -55
XKPX V r -92
XKPX V period -129
XKPX V o -111
XKPX V i -55
XKPX V hyphen -74
XKPX V e -111
XKPX V comma -129
XKPX V colon -55
XKPX V a -92


XKPX V A -111
X

XKPX W y -50
XKPX W u -50
XKPX W semicolon -18
XKPX W r -74
XKPX W period -92


XKPX W o -92
XKPX W i -55

XKPX W hyphen -55
XKPX W e -92
XKPX W comma -92
XKPX W colon -18
XKPX W a -92
XKPX W A -92
X
XKPX Y v -90
XKPX Y u -90
XKPX Y space -18
XKPX Y semicolon -74
XKPX Y q -90
XKPX Y period -111
XKPX Y p -111
XKPX Y o -92
XKPX Y i -55
XKPX Y hyphen -92
XKPX Y e -92
XKPX Y comma -111
XKPX Y colon -74
XKPX Y a -92


XKPX Y A -92
X
XKPX f quoteright 55

XKPX f f -18


X
XKPX one one -55
X

XKPX quoteleft quoteleft -37
X
XKPX quoteright quoteright -37
X
XKPX r u -8
XKPX r quoteright 74
XKPX r q -18
XKPX r period -74
XKPX r o -18
XKPX r hyphen -18


XKPX r h -18
XKPX r g -18
XKPX r e -18

XKPX r d -18
XKPX r comma -74


XKPX r c -18
X

XKPX space Y -18
XKPX space A -37
X
XKPX v period -111
XKPX v comma -111
X
XKPX w period -92
XKPX w comma -92
X
XKPX y period -111
XKPX y comma -111
XEndKernPairs
XEndKernData
XStartComposites 58
XCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 167 226 ;


XCC zcaron 2 ; PCC z 0 0 ; PCC caron 83 0 ;

XCC Scaron 2 ; PCC S 0 0 ; PCC caron 96 226 ;
XCC scaron 2 ; PCC s 0 0 ; PCC caron 45 0 ;
XCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 290 0 ;
XCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 146 0 ;
XCC Yacute 2 ; PCC Y 0 0 ; PCC acute 167 226 ;


XCC yacute 2 ; PCC y 0 0 ; PCC acute 111 0 ;

XCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 167 226 ;


XCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 111 0 ;

XCC Uacute 2 ; PCC U 0 0 ; PCC acute 222 226 ;
XCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 222 226 ;
XCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 222 226 ;
XCC Ugrave 2 ; PCC U 0 0 ; PCC grave 222 226 ;
XCC uacute 2 ; PCC u 0 0 ; PCC acute 135 0 ;
XCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 135 0 ;
XCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 135 0 ;
XCC ugrave 2 ; PCC u 0 0 ; PCC grave 135 0 ;
XCC Iacute 2 ; PCC I 0 0 ; PCC acute 2 226 ;
XCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex 2 226 ;
XCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis 2 226 ;
XCC Igrave 2 ; PCC I 0 0 ; PCC grave 2 226 ;
XCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -33 0 ;
XCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -23 0 ;
XCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -23 0 ;
XCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -13 0 ;
XCC Eacute 2 ; PCC E 0 0 ; PCC acute 139 226 ;
XCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 139 226 ;
XCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 139 226 ;
XCC Egrave 2 ; PCC E 0 0 ; PCC grave 139 226 ;
XCC eacute 2 ; PCC e 0 0 ; PCC acute 73 0 ;


XCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 83 0 ;
XCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 83 0 ;
XCC egrave 2 ; PCC e 0 0 ; PCC grave 83 0 ;

XCC Aacute 2 ; PCC A 0 0 ; PCC acute 222 226 ;
XCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 222 226 ;
XCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 222 226 ;
XCC Agrave 2 ; PCC A 0 0 ; PCC grave 222 226 ;
XCC aacute 2 ; PCC a 0 0 ; PCC acute 63 0 ;
XCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 63 0 ;
XCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 73 0 ;


XCC agrave 2 ; PCC a 0 0 ; PCC grave 83 0 ;

XCC Oacute 2 ; PCC O 0 0 ; PCC acute 226 226 ;
XCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 226 226 ;
XCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 226 226 ;
XCC Ograve 2 ; PCC O 0 0 ; PCC grave 226 226 ;
XCC oacute 2 ; PCC o 0 0 ; PCC acute 96 0 ;
XCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 106 0 ;
XCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 106 0 ;
XCC ograve 2 ; PCC o 0 0 ; PCC grave 106 0 ;
XCC Atilde 2 ; PCC A 0 0 ; PCC tilde 222 226 ;
XCC atilde 2 ; PCC a 0 0 ; PCC tilde 73 0 ;
XCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 249 226 ;
XCC ntilde 2 ; PCC n 0 0 ; PCC tilde 124 0 ;
XCC Otilde 2 ; PCC O 0 0 ; PCC tilde 226 226 ;
XCC otilde 2 ; PCC o 0 0 ; PCC tilde 106 0 ;
XCC Aring 2 ; PCC A 0 0 ; PCC ring 163 205 ;
XCC aring 2 ; PCC a 0 0 ; PCC ring 24 0 ;
XEndComposites
XEndFontMetrics
END_OF_FILE
if test 15565 -ne `wc -c <'lout/font0/PalatRom.AFM'`; then
echo shar: \"'lout/font0/PalatRom.AFM'\" unpacked with wrong size!
fi
# end of 'lout/font0/PalatRom.AFM'
fi
if test -f 'lout/font0/TimesRom.AFM' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/font0/TimesRom.AFM'\"
else
echo shar: Extracting \"'lout/font0/TimesRom.AFM'\" \(15580 characters\)
sed "s/^X//" >'lout/font0/TimesRom.AFM' <<'END_OF_FILE'


XStartFontMetrics 2.0
XComment Copyright (c) 1984 Adobe Systems Incorporated. All Rights Reserved.

XComment Creation Date:Sun Feb 8 01:48:39 PST 1987
XFontName Times-Roman
XEncodingScheme AdobeStandardEncoding
XFullName Times Roman
XFamilyName Times
XWeight Roman
XItalicAngle 0.0
XIsFixedPitch false
XUnderlinePosition -109
XUnderlineThickness 49
XVersion 001.002
XNotice Times Roman is a trademark of Allied Corporation.
XFontBBox -170 -223 1024 896
XCapHeight 662
XXHeight 448
XDescender -217
XAscender 682
XStartCharMetrics 228
XC 32 ; WX 250 ; N space ; B 0 0 0 0 ;
XC 33 ; WX 333 ; N exclam ; B 109 -14 224 676 ;
XC 34 ; WX 408 ; N quotedbl ; B 70 445 337 685 ;
XC 35 ; WX 500 ; N numbersign ; B 4 0 495 662 ;
XC 36 ; WX 500 ; N dollar ; B 44 -87 456 727 ;
XC 37 ; WX 833 ; N percent ; B 61 -14 772 676 ;
XC 38 ; WX 778 ; N ampersand ; B 42 -14 750 676 ;
XC 39 ; WX 333 ; N quoteright ; B 103 432 242 676 ;
XC 40 ; WX 333 ; N parenleft ; B 49 -177 304 676 ;
XC 41 ; WX 333 ; N parenright ; B 29 -177 284 676 ;
XC 42 ; WX 500 ; N asterisk ; B 64 265 437 683 ;
XC 43 ; WX 564 ; N plus ; B 30 7 534 512 ;
XC 44 ; WX 250 ; N comma ; B 63 -143 202 101 ;
XC 45 ; WX 333 ; N hyphen ; B 43 194 289 257 ;
XC 46 ; WX 250 ; N period ; B 68 -14 183 101 ;
XC 47 ; WX 278 ; N slash ; B -12 -108 302 682 ;
XC 48 ; WX 500 ; N zero ; B 24 -14 476 676 ;
XC 49 ; WX 500 ; N one ; B 111 0 394 676 ;
XC 50 ; WX 500 ; N two ; B 30 0 475 676 ;
XC 51 ; WX 500 ; N three ; B 44 -14 431 676 ;
XC 52 ; WX 500 ; N four ; B 12 0 472 676 ;
XC 53 ; WX 500 ; N five ; B 32 -14 438 688 ;
XC 54 ; WX 500 ; N six ; B 35 -14 468 682 ;
XC 55 ; WX 500 ; N seven ; B 20 -14 449 662 ;
XC 56 ; WX 500 ; N eight ; B 53 -14 442 676 ;
XC 57 ; WX 500 ; N nine ; B 30 -22 460 676 ;
XC 58 ; WX 278 ; N colon ; B 81 -14 196 458 ;
XC 59 ; WX 278 ; N semicolon ; B 63 -143 202 458 ;
XC 60 ; WX 564 ; N less ; B 27 0 536 522 ;
XC 61 ; WX 564 ; N equal ; B 30 132 534 390 ;
XC 62 ; WX 564 ; N greater ; B 27 0 536 522 ;
XC 63 ; WX 444 ; N question ; B 49 -14 395 676 ;
XC 64 ; WX 921 ; N at ; B 0 -155 819 675 ;
XC 65 ; WX 722 ; N A ; B 15 0 706 676 ;
XC 66 ; WX 667 ; N B ; B 20 0 596 662 ;
XC 67 ; WX 667 ; N C ; B 33 -14 637 676 ;
XC 68 ; WX 722 ; N D ; B 20 0 689 662 ;
XC 69 ; WX 611 ; N E ; B 12 0 597 662 ;
XC 70 ; WX 556 ; N F ; B 12 0 544 662 ;
XC 71 ; WX 722 ; N G ; B 27 -14 704 676 ;
XC 72 ; WX 722 ; N H ; B 20 0 703 662 ;
XC 73 ; WX 333 ; N I ; B 18 0 316 662 ;
XC 74 ; WX 389 ; N J ; B 10 -14 376 662 ;
XC 75 ; WX 722 ; N K ; B 20 0 709 662 ;
XC 76 ; WX 611 ; N L ; B 12 0 598 662 ;
XC 77 ; WX 889 ; N M ; B 19 0 871 662 ;
XC 78 ; WX 722 ; N N ; B 12 -14 709 662 ;
XC 79 ; WX 722 ; N O ; B 33 -14 688 676 ;
XC 80 ; WX 556 ; N P ; B 11 0 542 662 ;
XC 81 ; WX 722 ; N Q ; B 33 -177 701 676 ;
XC 82 ; WX 667 ; N R ; B 12 0 654 662 ;
XC 83 ; WX 556 ; N S ; B 42 -14 491 676 ;
XC 84 ; WX 611 ; N T ; B 18 0 594 662 ;
XC 85 ; WX 722 ; N U ; B 16 -14 705 662 ;
XC 86 ; WX 722 ; N V ; B 20 -14 701 662 ;
XC 87 ; WX 944 ; N W ; B 9 -14 936 662 ;
XC 88 ; WX 722 ; N X ; B 12 0 706 662 ;
XC 89 ; WX 722 ; N Y ; B 22 0 703 662 ;
XC 90 ; WX 611 ; N Z ; B 7 0 597 662 ;
XC 91 ; WX 333 ; N bracketleft ; B 88 -156 299 662 ;
XC 92 ; WX 278 ; N backslash ; B -83 0 361 682 ;
XC 93 ; WX 333 ; N bracketright ; B 34 -156 245 662 ;
XC 94 ; WX 469 ; N asciicircum ; B 13 256 456 662 ;
XC 95 ; WX 500 ; N underscore ; B 0 -133 500 -84 ;
XC 96 ; WX 333 ; N quoteleft ; B 91 432 230 676 ;
XC 97 ; WX 444 ; N a ; B 37 -10 442 458 ;
XC 98 ; WX 500 ; N b ; B 9 -10 474 682 ;
XC 99 ; WX 444 ; N c ; B 25 -10 412 458 ;
XC 100 ; WX 500 ; N d ; B 26 -13 491 682 ;
XC 101 ; WX 444 ; N e ; B 22 -10 421 458 ;
XC 102 ; WX 333 ; N f ; B 20 0 383 682 ; L i fi ; L l fl ;
XC 103 ; WX 500 ; N g ; B 27 -217 470 458 ;
XC 104 ; WX 500 ; N h ; B 9 0 490 682 ;
XC 105 ; WX 278 ; N i ; B 22 0 259 682 ;
XC 106 ; WX 278 ; N j ; B -54 -217 212 682 ;
XC 107 ; WX 500 ; N k ; B 1 0 500 682 ;
XC 108 ; WX 278 ; N l ; B 20 0 259 682 ;
XC 109 ; WX 778 ; N m ; B 13 0 764 458 ;
XC 110 ; WX 500 ; N n ; B 9 0 490 458 ;
XC 111 ; WX 500 ; N o ; B 30 -10 470 458 ;
XC 112 ; WX 500 ; N p ; B 2 -217 470 458 ;
XC 113 ; WX 500 ; N q ; B 24 -217 498 459 ;
XC 114 ; WX 333 ; N r ; B 4 0 335 458 ;
XC 115 ; WX 389 ; N s ; B 51 -10 348 458 ;
XC 116 ; WX 278 ; N t ; B 13 -10 279 580 ;
XC 117 ; WX 500 ; N u ; B 9 -10 479 448 ;
XC 118 ; WX 500 ; N v ; B 10 -10 468 448 ;
XC 119 ; WX 722 ; N w ; B 21 -10 694 448 ;
XC 120 ; WX 500 ; N x ; B 17 0 479 448 ;
XC 121 ; WX 500 ; N y ; B 15 -217 476 448 ;
XC 122 ; WX 444 ; N z ; B 25 0 418 448 ;
XC 123 ; WX 480 ; N braceleft ; B 110 -165 341 682 ;
XC 124 ; WX 200 ; N bar ; B 68 0 132 682 ;
XC 125 ; WX 480 ; N braceright ; B 139 -165 370 682 ;
XC 126 ; WX 541 ; N asciitilde ; B 18 176 522 347 ;
XC 161 ; WX 333 ; N exclamdown ; B 109 -217 224 458 ;
XC 162 ; WX 500 ; N cent ; B 53 -138 448 579 ;
XC 163 ; WX 500 ; N sterling ; B 11 -14 491 676 ;
XC 164 ; WX 167 ; N fraction ; B -170 -14 346 676 ;
XC 165 ; WX 500 ; N yen ; B -43 0 502 662 ;
XC 166 ; WX 500 ; N florin ; B 6 -185 490 676 ;
XC 167 ; WX 500 ; N section ; B 72 -148 426 676 ;
XC 168 ; WX 500 ; N currency ; B -2 99 503 600 ;
XC 169 ; WX 180 ; N quotesingle ; B 47 445 133 685 ;
XC 170 ; WX 444 ; N quotedblleft ; B 27 432 399 676 ;
XC 171 ; WX 500 ; N guillemotleft ; B 32 35 449 422 ;
XC 172 ; WX 333 ; N guilsinglleft ; B 45 35 271 422 ;
XC 173 ; WX 333 ; N guilsinglright ; B 62 36 288 423 ;
XC 174 ; WX 556 ; N fi ; B 33 0 521 678 ;
XC 175 ; WX 556 ; N fl ; B 29 0 521 682 ;
XC 177 ; WX 500 ; N endash ; B -7 201 507 250 ;
XC 178 ; WX 500 ; N dagger ; B 54 -149 440 676 ;
XC 179 ; WX 500 ; N daggerdbl ; B 54 -153 439 676 ;
XC 180 ; WX 250 ; N periodcentered ; B 68 204 183 319 ;
XC 182 ; WX 453 ; N paragraph ; B 0 -207 373 662 ;


XC 183 ; WX 350 ; N bullet ; B 50 175 300 425 ;

XC 184 ; WX 333 ; N quotesinglbase ; B 103 -143 242 101 ;
XC 185 ; WX 444 ; N quotedblbase ; B 45 -143 417 101 ;
XC 186 ; WX 444 ; N quotedblright ; B 45 432 417 676 ;
XC 187 ; WX 500 ; N guillemotright ; B 51 35 468 422 ;
XC 188 ; WX 1000 ; N ellipsis ; B 110 -14 891 101 ;
XC 189 ; WX 1000 ; N perthousand ; B 3 -14 1024 676 ;
XC 191 ; WX 444 ; N questiondown ; B 49 -217 395 458 ;
XC 193 ; WX 333 ; N grave ; B 16 507 243 678 ;
XC 194 ; WX 333 ; N acute ; B 93 507 317 678 ;
XC 195 ; WX 333 ; N circumflex ; B 11 507 323 674 ;
XC 196 ; WX 333 ; N tilde ; B 1 532 332 638 ;
XC 197 ; WX 333 ; N macron ; B 11 547 323 601 ;
XC 198 ; WX 333 ; N breve ; B 26 507 308 664 ;
XC 199 ; WX 333 ; N dotaccent ; B 116 523 216 623 ;
XC 200 ; WX 333 ; N dieresis ; B 18 523 316 623 ;
XC 202 ; WX 333 ; N ring ; B 67 483 266 682 ;
XC 203 ; WX 333 ; N cedilla ; B 53 -215 262 0 ;
XC 205 ; WX 333 ; N hungarumlaut ; B 8 528 372 700 ;


XC 206 ; WX 333 ; N ogonek ; B 68 -155 245 -10 ;

XC 207 ; WX 333 ; N caron ; B 11 507 323 674 ;
XC 208 ; WX 1000 ; N emdash ; B -8 201 1007 250 ;
XC 225 ; WX 889 ; N AE ; B 5 0 869 662 ;
XC 227 ; WX 276 ; N ordfeminine ; B 15 307 278 676 ;
XC 232 ; WX 611 ; N Lslash ; B 12 0 598 662 ;
XC 233 ; WX 722 ; N Oslash ; B 33 -80 688 734 ;
XC 234 ; WX 889 ; N OE ; B 21 -7 877 669 ;
XC 235 ; WX 310 ; N ordmasculine ; B 15 307 301 676 ;
XC 241 ; WX 667 ; N ae ; B 38 -10 634 458 ;
XC 245 ; WX 278 ; N dotlessi ; B 22 0 259 458 ;
XC 248 ; WX 278 ; N lslash ; B 20 0 259 682 ;
XC 249 ; WX 500 ; N oslash ; B 30 -108 470 549 ;
XC 250 ; WX 722 ; N oe ; B 30 -10 690 458 ;
XC 251 ; WX 500 ; N germandbls ; B 12 -10 468 682 ;
XC -1 ; WX 722 ; N Aacute ; B 15 0 706 892 ;
XC -1 ; WX 722 ; N Acircumflex ; B 15 0 706 888 ;
XC -1 ; WX 722 ; N Adieresis ; B 15 0 706 837 ;
XC -1 ; WX 722 ; N Agrave ; B 15 0 706 892 ;
XC -1 ; WX 722 ; N Aring ; B 15 0 706 896 ;
XC -1 ; WX 722 ; N Atilde ; B 15 0 706 852 ;
XC -1 ; WX 667 ; N Ccedilla ; B 33 -215 637 676 ;
XC -1 ; WX 611 ; N Eacute ; B 12 0 597 892 ;
XC -1 ; WX 611 ; N Ecircumflex ; B 12 0 597 888 ;
XC -1 ; WX 611 ; N Edieresis ; B 12 0 597 837 ;
XC -1 ; WX 611 ; N Egrave ; B 12 0 597 892 ;
XC -1 ; WX 722 ; N Eth ; B 20 0 689 662 ;
XC -1 ; WX 333 ; N Iacute ; B 18 0 317 892 ;
XC -1 ; WX 333 ; N Icircumflex ; B 11 0 323 888 ;
XC -1 ; WX 333 ; N Idieresis ; B 18 0 316 837 ;
XC -1 ; WX 333 ; N Igrave ; B 16 0 316 892 ;
XC -1 ; WX 722 ; N Ntilde ; B 12 -14 709 852 ;
XC -1 ; WX 722 ; N Oacute ; B 33 -14 688 892 ;
XC -1 ; WX 722 ; N Ocircumflex ; B 33 -14 688 888 ;
XC -1 ; WX 722 ; N Odieresis ; B 33 -14 688 837 ;
XC -1 ; WX 722 ; N Ograve ; B 33 -14 688 892 ;
XC -1 ; WX 722 ; N Otilde ; B 33 -14 688 852 ;
XC -1 ; WX 556 ; N Scaron ; B 42 -14 491 888 ;
XC -1 ; WX 556 ; N Thorn ; B 11 0 542 662 ;
XC -1 ; WX 722 ; N Uacute ; B 16 -14 705 892 ;
XC -1 ; WX 722 ; N Ucircumflex ; B 16 -14 705 888 ;
XC -1 ; WX 722 ; N Udieresis ; B 16 -14 705 837 ;
XC -1 ; WX 722 ; N Ugrave ; B 16 -14 705 892 ;
XC -1 ; WX 722 ; N Yacute ; B 22 0 703 892 ;
XC -1 ; WX 722 ; N Ydieresis ; B 22 0 703 837 ;
XC -1 ; WX 611 ; N Zcaron ; B 7 0 597 888 ;
XC -1 ; WX 444 ; N aacute ; B 37 -10 442 678 ;
XC -1 ; WX 444 ; N acircumflex ; B 37 -10 442 674 ;
XC -1 ; WX 444 ; N adieresis ; B 37 -10 442 623 ;
XC -1 ; WX 444 ; N agrave ; B 37 -10 442 678 ;
XC -1 ; WX 444 ; N aring ; B 37 -10 442 682 ;
XC -1 ; WX 444 ; N atilde ; B 37 -10 442 638 ;
XC -1 ; WX 200 ; N brokenbar ; B 68 0 132 682 ;
XC -1 ; WX 444 ; N ccedilla ; B 25 -215 412 458 ;
XC -1 ; WX 760 ; N copyright ; B 42 -14 717 676 ;
XC -1 ; WX 400 ; N degree ; B 50 376 350 676 ;
XC -1 ; WX 564 ; N divide ; B 30 10 534 512 ;
XC -1 ; WX 444 ; N eacute ; B 22 -10 421 678 ;
XC -1 ; WX 444 ; N ecircumflex ; B 22 -10 421 674 ;
XC -1 ; WX 444 ; N edieresis ; B 22 -10 421 623 ;
XC -1 ; WX 444 ; N egrave ; B 22 -10 421 678 ;
XC -1 ; WX 500 ; N eth ; B 30 -10 470 682 ;
XC -1 ; WX 278 ; N iacute ; B 22 0 290 678 ;
XC -1 ; WX 278 ; N icircumflex ; B -16 0 296 674 ;
XC -1 ; WX 278 ; N idieresis ; B -9 0 289 623 ;
XC -1 ; WX 278 ; N igrave ; B -11 0 259 678 ;
XC -1 ; WX 564 ; N logicalnot ; B 30 120 534 390 ;
XC -1 ; WX 564 ; N minus ; B 30 229 534 293 ;
XC -1 ; WX 500 ; N mu ; B 9 -223 479 448 ;
XC -1 ; WX 564 ; N multiply ; B 30 8 534 512 ;
XC -1 ; WX 500 ; N ntilde ; B 9 0 490 638 ;
XC -1 ; WX 500 ; N oacute ; B 30 -10 470 678 ;
XC -1 ; WX 500 ; N ocircumflex ; B 30 -10 470 674 ;
XC -1 ; WX 500 ; N odieresis ; B 30 -10 470 623 ;
XC -1 ; WX 500 ; N ograve ; B 30 -10 470 678 ;
XC -1 ; WX 750 ; N onehalf ; B 30 -14 720 676 ;
XC -1 ; WX 750 ; N onequarter ; B 30 -14 720 676 ;
XC -1 ; WX 300 ; N onesuperior ; B 58 270 242 676 ;
XC -1 ; WX 500 ; N otilde ; B 30 -10 470 638 ;
XC -1 ; WX 564 ; N plusminus ; B 30 0 534 612 ;
XC -1 ; WX 760 ; N registered ; B 43 -14 718 676 ;
XC -1 ; WX 389 ; N scaron ; B 39 -10 351 674 ;
XC -1 ; WX 500 ; N thorn ; B 2 -217 470 682 ;
XC -1 ; WX 750 ; N threequarters ; B 30 -14 720 676 ;
XC -1 ; WX 300 ; N threesuperior ; B 24 262 275 676 ;
XC -1 ; WX 980 ; N trademark ; B 35 258 945 662 ;
XC -1 ; WX 300 ; N twosuperior ; B 5 270 294 676 ;
XC -1 ; WX 500 ; N uacute ; B 9 -10 479 678 ;
XC -1 ; WX 500 ; N ucircumflex ; B 9 -10 479 674 ;
XC -1 ; WX 500 ; N udieresis ; B 9 -10 479 623 ;
XC -1 ; WX 500 ; N ugrave ; B 9 -10 479 678 ;
XC -1 ; WX 500 ; N yacute ; B 15 -217 476 678 ;
XC -1 ; WX 500 ; N ydieresis ; B 15 -217 476 623 ;
XC -1 ; WX 444 ; N zcaron ; B 25 0 418 674 ;
XEndCharMetrics
XStartKernData
XStartKernPairs 113
X
XKPX A y -92
XKPX A w -92


XKPX A v -74
XKPX A space -55

XKPX A quoteright -111
XKPX A Y -92
XKPX A W -80
XKPX A V -129
XKPX A T -111
X
XKPX F period -80
XKPX F comma -80


XKPX F A -74
X
XKPX L y -55

XKPX L space -37
XKPX L quoteright -92
XKPX L Y -100
XKPX L W -74


XKPX L V -92
XKPX L T -92
X

XKPX P space -37
XKPX P period -111
XKPX P comma -111


XKPX P A -92
X

XKPX R y -40
XKPX R Y -55
XKPX R W -55
XKPX R V -80
XKPX R T -60
X
XKPX T y -70
XKPX T w -70
XKPX T u -35
XKPX T space -18
XKPX T semicolon -55
XKPX T s -70
XKPX T r -35
XKPX T period -74
XKPX T o -70
XKPX T i -35
XKPX T hyphen -92
XKPX T e -70
XKPX T comma -74
XKPX T colon -50
XKPX T c -70
XKPX T a -70
XKPX T O -18
XKPX T A -80
X
XKPX V y -111
XKPX V u -60
XKPX V space -18
XKPX V semicolon -74
XKPX V r -60
XKPX V period -129
XKPX V o -129
XKPX V i -60
XKPX V hyphen -92
XKPX V e -111
XKPX V comma -129
XKPX V colon -74
XKPX V a -111


XKPX V A -129
X

XKPX W y -60
XKPX W u -40
XKPX W space -18
XKPX W semicolon -37
XKPX W r -40
XKPX W period -92
XKPX W o -80
XKPX W i -40
XKPX W hyphen -55
XKPX W e -80
XKPX W comma -92
XKPX W colon -37
XKPX W a -80


XKPX W A -111
X

XKPX Y v -100
XKPX Y u -111


XKPX Y space -37
XKPX Y semicolon -92
XKPX Y q -111

XKPX Y period -129
XKPX Y p -92
XKPX Y o -100
XKPX Y i -55
XKPX Y hyphen -111
XKPX Y e -100
XKPX Y comma -129
XKPX Y colon -92
XKPX Y a -100
XKPX Y A -111


X
XKPX f quoteright 55

XKPX f f -18
X
XKPX one one -37


X
XKPX quoteleft quoteleft -74
X

XKPX quoteright t -18
XKPX quoteright space -74
XKPX quoteright s -55
XKPX quoteright quoteright -74
X
XKPX r quoteright 37
XKPX r period -55
XKPX r hyphen -20
XKPX r g -18
XKPX r comma -40


X
XKPX space Y -37
XKPX space W -18
XKPX space V -18
XKPX space T -18
XKPX space A -55
X

XKPX v period -65
XKPX v comma -65
X
XKPX w period -65
XKPX w comma -65
X
XKPX y period -65
XKPX y comma -65
XEndKernPairs
XEndKernData
XStartComposites 58
XCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 139 214 ;


XCC zcaron 2 ; PCC z 0 0 ; PCC caron 55 0 ;

XCC Scaron 2 ; PCC S 0 0 ; PCC caron 111 214 ;

XCC scaron 2 ; PCC s 0 0 ; PCC caron 28 0 ;

XCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 167 0 ;


XCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 55 0 ;

XCC Yacute 2 ; PCC Y 0 0 ; PCC acute 194 214 ;


XCC yacute 2 ; PCC y 0 0 ; PCC acute 83 0 ;

XCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 194 214 ;


XCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 83 0 ;

XCC Uacute 2 ; PCC U 0 0 ; PCC acute 194 214 ;
XCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 194 214 ;
XCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 194 214 ;
XCC Ugrave 2 ; PCC U 0 0 ; PCC grave 194 214 ;


XCC uacute 2 ; PCC u 0 0 ; PCC acute 83 0 ;
XCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 83 0 ;
XCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 83 0 ;
XCC ugrave 2 ; PCC u 0 0 ; PCC grave 83 0 ;

XCC Iacute 2 ; PCC I 0 0 ; PCC acute 0 214 ;
XCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex 0 214 ;
XCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis 0 214 ;
XCC Igrave 2 ; PCC I 0 0 ; PCC grave 0 214 ;


XCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -27 0 ;
XCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -27 0 ;
XCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -27 0 ;
XCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -27 0 ;

XCC Eacute 2 ; PCC E 0 0 ; PCC acute 139 214 ;
XCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 139 214 ;
XCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 139 214 ;
XCC Egrave 2 ; PCC E 0 0 ; PCC grave 139 214 ;
XCC eacute 2 ; PCC e 0 0 ; PCC acute 55 0 ;
XCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 55 0 ;
XCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 55 0 ;
XCC egrave 2 ; PCC e 0 0 ; PCC grave 55 0 ;
XCC Aacute 2 ; PCC A 0 0 ; PCC acute 194 214 ;
XCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 194 214 ;
XCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 194 214 ;
XCC Agrave 2 ; PCC A 0 0 ; PCC grave 194 214 ;

XCC aacute 2 ; PCC a 0 0 ; PCC acute 55 0 ;
XCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 55 0 ;
XCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 55 0 ;
XCC agrave 2 ; PCC a 0 0 ; PCC grave 55 0 ;
XCC Oacute 2 ; PCC O 0 0 ; PCC acute 194 214 ;
XCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 194 214 ;
XCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 194 214 ;
XCC Ograve 2 ; PCC O 0 0 ; PCC grave 194 214 ;


XCC oacute 2 ; PCC o 0 0 ; PCC acute 83 0 ;
XCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 83 0 ;
XCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 83 0 ;
XCC ograve 2 ; PCC o 0 0 ; PCC grave 83 0 ;

XCC Atilde 2 ; PCC A 0 0 ; PCC tilde 194 214 ;

XCC atilde 2 ; PCC a 0 0 ; PCC tilde 55 0 ;
XCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 194 214 ;
XCC ntilde 2 ; PCC n 0 0 ; PCC tilde 83 0 ;
XCC Otilde 2 ; PCC O 0 0 ; PCC tilde 194 214 ;


XCC otilde 2 ; PCC o 0 0 ; PCC tilde 83 0 ;

XCC Aring 2 ; PCC A 0 0 ; PCC ring 194 214 ;
XCC aring 2 ; PCC a 0 0 ; PCC ring 55 0 ;
XEndComposites
XEndFontMetrics
END_OF_FILE
if test 15580 -ne `wc -c <'lout/font0/TimesRom.AFM'`; then
echo shar: \"'lout/font0/TimesRom.AFM'\" unpacked with wrong size!
fi
# end of 'lout/font0/TimesRom.AFM'
fi
echo shar: End of archive 16 \(of 30\).
cp /dev/null ark16isdone

Jeff Kingston

unread,
Jun 1, 1993, 1:21:41 AM6/1/93
to
Submitted-by: je...@joyce.cs.su.oz.au (Jeff Kingston)
Posting-number: Volume 37, Issue 115
Archive-name: lout/part17
Environment: UNIX

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: lout/doc/tr.lout/ch3.01 lout/font0/HelveBolObl.AFM
# lout/font0/HelveNar.AFM lout/font0/HelveNarObl.AFM
# lout/font0/PalatBol.AFM lout/font0/PalatIta.AFM
# Wrapped by kent@sparky on Sun May 30 19:43:58 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 17 (of 30)."'
if test -f 'lout/doc/tr.lout/ch3.01' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch3.01'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch3.01'\" \(894 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch3.01' <<'END_OF_FILE'
X@Section
X @Title { "@Begin" and "@End" }
X @Tag { begin }
X@Begin
X@PP
XThe body of a symbol @Code "@Sym" may be enclosed in @@Begin and
Xbegin. @Index { @@Begin symbol }
Xend. @Index { @@End symbol }
X@@End @Code "@Sym" instead of the more usual braces:
X@ID @Code {
X"def @Section"
X" named @Title {}"
X" right @Body"
X"@Begin"
X" @Title //2v @Body"
X"@End @Section"
X}
XThey may also enclose the right or body parameter of a symbol invocation:
X@ID @Code {
X"@Chapter"
X" @Title { Introduction }"
X"@Begin"
X"This subject needs no introduction."
X"@End @Chapter"
X}
XApart from their utility as documentation aids, these forms allow Basser
XLout to pinpoint mismatched braces, which can otherwise create total
Xhavoc. For this reason, they should enclose the major parts of documents,
Xsuch as chapters and sections. Note that braces cannot be
Xreplaced by @@Begin and @@End in general.
X@End @Section
END_OF_FILE
if test 894 -ne `wc -c <'lout/doc/tr.lout/ch3.01'`; then
echo shar: \"'lout/doc/tr.lout/ch3.01'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch3.01'
fi
if test -f 'lout/font0/HelveBolObl.AFM' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/font0/HelveBolObl.AFM'\"
else
echo shar: Extracting \"'lout/font0/HelveBolObl.AFM'\" \(15511 characters\)
sed "s/^X//" >'lout/font0/HelveBolObl.AFM' <<'END_OF_FILE'


XStartFontMetrics 2.0
XComment Copyright (c) 1984 Adobe Systems Incorporated. All Rights Reserved.

XComment Creation Date:Sun Feb 8 20:39:16 PST 1987
XFontName Helvetica-BoldOblique
XEncodingScheme AdobeStandardEncoding
XFullName Helvetica Bold Oblique


XFamilyName Helvetica
XWeight Bold
XItalicAngle -12.0
XIsFixedPitch false
XUnderlinePosition -106

XUnderlineThickness 105
XVersion 001.002
XNotice Helvetica is a registered trademark of Allied Corporation
XFontBBox -177 -221 1107 936


XCapHeight 729
XXHeight 542
XDescender -219
XAscender 729
XStartCharMetrics 228

XC 32 ; WX 278 ; N space ; B 0 0 0 0 ;

XC 33 ; WX 333 ; N exclam ; B 112 0 417 729 ;
XC 34 ; WX 474 ; N quotedbl ; B 177 470 579 729 ;
XC 35 ; WX 556 ; N numbersign ; B 33 -30 660 696 ;
XC 36 ; WX 556 ; N dollar ; B 59 -125 628 765 ;
XC 37 ; WX 889 ; N percent ; B 129 -18 903 708 ;
XC 38 ; WX 722 ; N ampersand ; B 89 -20 720 729 ;
XC 39 ; WX 278 ; N quoteright ; B 166 469 356 729 ;
XC 40 ; WX 333 ; N parenleft ; B 84 -202 458 729 ;
XC 41 ; WX 333 ; N parenright ; B -21 -202 356 729 ;
XC 42 ; WX 389 ; N asterisk ; B 145 385 478 730 ;
XC 43 ; WX 584 ; N plus ; B 87 -10 596 474 ;
XC 44 ; WX 278 ; N comma ; B 27 -174 245 146 ;
XC 45 ; WX 333 ; N hyphen ; B 70 208 371 344 ;
XC 46 ; WX 278 ; N period ; B 64 0 245 146 ;
XC 47 ; WX 278 ; N slash ; B -1 -14 427 715 ;
XC 48 ; WX 556 ; N zero ; B 81 -23 614 725 ;
XC 49 ; WX 556 ; N one ; B 172 0 529 709 ;
XC 50 ; WX 556 ; N two ; B 30 0 628 726 ;
XC 51 ; WX 556 ; N three ; B 67 -23 613 726 ;
XC 52 ; WX 556 ; N four ; B 57 0 599 709 ;
XC 53 ; WX 556 ; N five ; B 59 -24 641 709 ;
XC 54 ; WX 556 ; N six ; B 85 -23 625 727 ;
XC 55 ; WX 556 ; N seven ; B 131 0 679 709 ;
XC 56 ; WX 556 ; N eight ; B 60 -23 620 726 ;
XC 57 ; WX 556 ; N nine ; B 68 -23 611 728 ;
XC 58 ; WX 333 ; N colon ; B 113 0 374 521 ;
XC 59 ; WX 333 ; N semicolon ; B 76 -174 374 521 ;
XC 60 ; WX 584 ; N less ; B 77 -10 630 474 ;
XC 61 ; WX 584 ; N equal ; B 61 52 622 412 ;
XC 62 ; WX 584 ; N greater ; B 38 -10 591 474 ;
XC 63 ; WX 611 ; N question ; B 168 0 672 744 ;
XC 64 ; WX 975 ; N at ; B 73 -136 1032 746 ;
XC 65 ; WX 722 ; N A ; B 26 0 703 729 ;
XC 66 ; WX 722 ; N B ; B 82 0 762 729 ;
XC 67 ; WX 722 ; N C ; B 107 -23 793 741 ;
XC 68 ; WX 722 ; N D ; B 77 0 776 729 ;
XC 69 ; WX 667 ; N E ; B 79 0 762 729 ;
XC 70 ; WX 611 ; N F ; B 74 0 741 729 ;
XC 71 ; WX 778 ; N G ; B 107 -24 819 741 ;
XC 72 ; WX 722 ; N H ; B 68 0 812 729 ;
XC 73 ; WX 278 ; N I ; B 63 0 368 729 ;
XC 74 ; WX 556 ; N J ; B 59 -23 641 729 ;
XC 75 ; WX 722 ; N K ; B 74 0 843 729 ;
XC 76 ; WX 611 ; N L ; B 80 0 606 729 ;
XC 77 ; WX 833 ; N M ; B 66 0 931 729 ;
XC 78 ; WX 722 ; N N ; B 68 0 816 729 ;
XC 79 ; WX 778 ; N O ; B 106 -23 828 741 ;
XC 80 ; WX 667 ; N P ; B 76 0 747 729 ;
XC 81 ; WX 778 ; N Q ; B 109 -54 831 741 ;
XC 82 ; WX 722 ; N R ; B 80 0 785 729 ;
XC 83 ; WX 667 ; N S ; B 76 -23 725 741 ;
XC 84 ; WX 611 ; N T ; B 142 0 753 729 ;
XC 85 ; WX 722 ; N U ; B 119 -23 809 729 ;
XC 86 ; WX 667 ; N V ; B 179 0 802 729 ;
XC 87 ; WX 944 ; N W ; B 168 0 1087 729 ;
XC 88 ; WX 667 ; N X ; B 22 0 802 729 ;
XC 89 ; WX 667 ; N Y ; B 182 0 805 729 ;
XC 90 ; WX 611 ; N Z ; B 30 0 733 729 ;
XC 91 ; WX 333 ; N bracketleft ; B 23 -202 463 729 ;
XC 92 ; WX 278 ; N backslash ; B 138 -21 285 708 ;
XC 93 ; WX 333 ; N bracketright ; B -25 -202 415 729 ;
XC 94 ; WX 584 ; N asciicircum ; B 119 271 580 696 ;
XC 95 ; WX 556 ; N underscore ; B -65 -200 550 -130 ;
XC 96 ; WX 278 ; N quoteleft ; B 167 469 357 729 ;
XC 97 ; WX 556 ; N a ; B 50 -24 578 551 ;
XC 98 ; WX 611 ; N b ; B 59 -23 640 729 ;
XC 99 ; WX 556 ; N c ; B 77 -23 597 551 ;
XC 100 ; WX 611 ; N d ; B 79 -23 700 729 ;
XC 101 ; WX 556 ; N e ; B 64 -23 591 551 ;
XC 102 ; WX 333 ; N f ; B 90 0 464 729 ; L i fi ; L l fl ;
XC 103 ; WX 611 ; N g ; B 26 -220 656 551 ;
XC 104 ; WX 611 ; N h ; B 67 0 629 729 ;
XC 105 ; WX 278 ; N i ; B 67 0 362 729 ;
XC 106 ; WX 278 ; N j ; B -43 -219 365 729 ;
XC 107 ; WX 556 ; N k ; B 59 0 651 729 ;
XC 108 ; WX 278 ; N l ; B 67 0 362 729 ;
XC 109 ; WX 889 ; N m ; B 60 0 911 553 ;
XC 110 ; WX 611 ; N n ; B 63 0 629 551 ;
XC 111 ; WX 611 ; N o ; B 82 -23 634 551 ;
XC 112 ; WX 611 ; N p ; B 11 -219 637 551 ;
XC 113 ; WX 611 ; N q ; B 72 -219 659 551 ;
XC 114 ; WX 389 ; N r ; B 63 0 487 553 ;
XC 115 ; WX 556 ; N s ; B 60 -23 589 551 ;
XC 116 ; WX 333 ; N t ; B 101 -23 414 678 ;
XC 117 ; WX 611 ; N u ; B 88 -23 656 542 ;
XC 118 ; WX 556 ; N v ; B 129 0 651 542 ;
XC 119 ; WX 778 ; N w ; B 120 0 881 542 ;
XC 120 ; WX 556 ; N x ; B 16 0 648 542 ;
XC 121 ; WX 556 ; N y ; B 37 -219 653 542 ;
XC 122 ; WX 500 ; N z ; B 21 0 575 542 ;
XC 123 ; WX 389 ; N braceleft ; B 84 -202 472 729 ;
XC 124 ; WX 280 ; N bar ; B 57 -202 335 729 ;
XC 125 ; WX 389 ; N braceright ; B 29 -202 419 729 ;
XC 126 ; WX 584 ; N asciitilde ; B 97 144 581 322 ;
XC 161 ; WX 333 ; N exclamdown ; B 26 -187 331 542 ;
XC 162 ; WX 556 ; N cent ; B 79 -122 598 637 ;
XC 163 ; WX 556 ; N sterling ; B 49 -20 629 717 ;
XC 164 ; WX 167 ; N fraction ; B -177 -20 489 715 ;
XC 165 ; WX 556 ; N yen ; B 107 0 702 705 ;
XC 166 ; WX 556 ; N florin ; B -21 -221 690 745 ;
XC 167 ; WX 556 ; N section ; B 56 -201 596 728 ;
XC 168 ; WX 556 ; N currency ; B 66 105 644 604 ;
XC 169 ; WX 238 ; N quotesingle ; B 177 469 343 729 ;
XC 170 ; WX 500 ; N quotedblleft ; B 171 469 588 729 ;
XC 171 ; WX 556 ; N guillemotleft ; B 135 71 571 484 ;
XC 172 ; WX 333 ; N guilsinglleft ; B 128 73 351 476 ;
XC 173 ; WX 333 ; N guilsinglright ; B 96 73 319 476 ;
XC 174 ; WX 611 ; N fi ; B 85 0 703 729 ;
XC 175 ; WX 611 ; N fl ; B 88 0 701 729 ;
XC 177 ; WX 556 ; N endash ; B 35 208 624 313 ;
XC 178 ; WX 556 ; N dagger ; B 109 -195 626 708 ;
XC 179 ; WX 556 ; N daggerdbl ; B 35 -195 623 708 ;
XC 180 ; WX 278 ; N periodcentered ; B 143 318 270 442 ;
XC 182 ; WX 556 ; N paragraph ; B 121 -195 684 729 ;
XC 183 ; WX 350 ; N bullet ; B 111 175 367 425 ;
XC 184 ; WX 278 ; N quotesinglbase ; B 37 -135 228 125 ;
XC 185 ; WX 500 ; N quotedblbase ; B 37 -164 462 141 ;
XC 186 ; WX 500 ; N quotedblright ; B 173 469 595 729 ;
XC 187 ; WX 556 ; N guillemotright ; B 103 71 533 482 ;
XC 188 ; WX 1000 ; N ellipsis ; B 92 0 939 146 ;
XC 189 ; WX 1000 ; N perthousand ; B 72 -20 1021 745 ;
XC 191 ; WX 611 ; N questiondown ; B 52 -192 556 542 ;
XC 193 ; WX 333 ; N grave ; B 175 595 339 745 ;
XC 194 ; WX 333 ; N acute ; B 247 595 475 745 ;
XC 195 ; WX 333 ; N circumflex ; B 135 598 453 745 ;
XC 196 ; WX 333 ; N tilde ; B 117 595 500 729 ;
XC 197 ; WX 333 ; N macron ; B 150 629 467 717 ;
XC 198 ; WX 333 ; N breve ; B 188 593 455 736 ;
XC 199 ; WX 333 ; N dotaccent ; B 241 607 377 729 ;
XC 200 ; WX 333 ; N dieresis ; B 147 609 469 731 ;
XC 202 ; WX 333 ; N ring ; B 214 565 398 745 ;
XC 203 ; WX 333 ; N cedilla ; B -13 -220 270 -9 ;
XC 205 ; WX 333 ; N hungarumlaut ; B 82 595 498 745 ;
XC 206 ; WX 333 ; N ogonek ; B 23 -195 248 38 ;
XC 207 ; WX 333 ; N caron ; B 167 598 485 745 ;
XC 208 ; WX 1000 ; N emdash ; B 37 208 1070 313 ;
XC 225 ; WX 1000 ; N AE ; B 1 0 1104 729 ;
XC 227 ; WX 370 ; N ordfeminine ; B 96 277 451 746 ;
XC 232 ; WX 611 ; N Lslash ; B 54 0 624 729 ;
XC 233 ; WX 778 ; N Oslash ; B 34 -34 906 754 ;
XC 234 ; WX 1000 ; N OE ; B 90 -20 1107 741 ;
XC 235 ; WX 365 ; N ordmasculine ; B 92 276 471 745 ;
XC 241 ; WX 889 ; N ae ; B 54 -20 927 555 ;
XC 245 ; WX 278 ; N dotlessi ; B 67 0 322 542 ;
XC 248 ; WX 278 ; N lslash ; B 50 0 372 729 ;
XC 249 ; WX 611 ; N oslash ; B 12 -34 709 561 ;
XC 250 ; WX 944 ; N oe ; B 71 -21 986 554 ;
XC 251 ; WX 611 ; N germandbls ; B 67 -16 654 730 ;
XC -1 ; WX 722 ; N Aacute ; B 26 0 714 936 ;
XC -1 ; WX 722 ; N Acircumflex ; B 26 0 703 936 ;
XC -1 ; WX 722 ; N Adieresis ; B 26 0 708 922 ;
XC -1 ; WX 722 ; N Agrave ; B 26 0 703 936 ;
XC -1 ; WX 722 ; N Aring ; B 26 0 703 936 ;
XC -1 ; WX 722 ; N Atilde ; B 26 0 739 920 ;
XC -1 ; WX 722 ; N Ccedilla ; B 107 -220 793 741 ;
XC -1 ; WX 667 ; N Eacute ; B 79 0 762 936 ;
XC -1 ; WX 667 ; N Ecircumflex ; B 79 0 762 936 ;
XC -1 ; WX 667 ; N Edieresis ; B 79 0 762 922 ;
XC -1 ; WX 667 ; N Egrave ; B 79 0 762 936 ;
XC -1 ; WX 722 ; N Eth ; B 53 0 776 729 ;
XC -1 ; WX 278 ; N Iacute ; B 63 0 489 936 ;
XC -1 ; WX 278 ; N Icircumflex ; B 63 0 467 936 ;
XC -1 ; WX 278 ; N Idieresis ; B 63 0 483 922 ;
XC -1 ; WX 278 ; N Igrave ; B 63 0 368 936 ;
XC -1 ; WX 722 ; N Ntilde ; B 68 0 816 920 ;
XC -1 ; WX 778 ; N Oacute ; B 106 -23 828 936 ;
XC -1 ; WX 778 ; N Ocircumflex ; B 106 -23 828 936 ;
XC -1 ; WX 778 ; N Odieresis ; B 106 -23 828 922 ;
XC -1 ; WX 778 ; N Ograve ; B 106 -23 828 936 ;
XC -1 ; WX 778 ; N Otilde ; B 106 -23 828 920 ;
XC -1 ; WX 667 ; N Scaron ; B 76 -23 725 936 ;
XC -1 ; WX 667 ; N Thorn ; B 76 0 730 729 ;
XC -1 ; WX 722 ; N Uacute ; B 119 -23 809 936 ;
XC -1 ; WX 722 ; N Ucircumflex ; B 119 -23 809 936 ;
XC -1 ; WX 722 ; N Udieresis ; B 119 -23 809 922 ;
XC -1 ; WX 722 ; N Ugrave ; B 119 -23 809 936 ;
XC -1 ; WX 667 ; N Yacute ; B 182 0 805 932 ;
XC -1 ; WX 667 ; N Ydieresis ; B 182 0 805 922 ;
XC -1 ; WX 611 ; N Zcaron ; B 30 0 733 936 ;
XC -1 ; WX 556 ; N aacute ; B 50 -24 587 745 ;
XC -1 ; WX 556 ; N acircumflex ; B 50 -24 578 745 ;
XC -1 ; WX 556 ; N adieresis ; B 50 -24 581 731 ;
XC -1 ; WX 556 ; N agrave ; B 50 -24 578 745 ;
XC -1 ; WX 556 ; N aring ; B 50 -24 578 745 ;
XC -1 ; WX 556 ; N atilde ; B 50 -24 612 729 ;
XC -1 ; WX 280 ; N brokenbar ; B 57 -202 335 729 ;
XC -1 ; WX 556 ; N ccedilla ; B 77 -220 597 551 ;
XC -1 ; WX 737 ; N copyright ; B 54 -20 837 745 ;
XC -1 ; WX 400 ; N degree ; B 169 425 476 725 ;
XC -1 ; WX 584 ; N divide ; B 87 -10 596 474 ;
XC -1 ; WX 556 ; N eacute ; B 64 -23 591 745 ;
XC -1 ; WX 556 ; N ecircumflex ; B 64 -23 591 745 ;
XC -1 ; WX 556 ; N edieresis ; B 64 -23 591 731 ;
XC -1 ; WX 556 ; N egrave ; B 64 -23 591 745 ;
XC -1 ; WX 611 ; N eth ; B 82 -23 633 730 ;
XC -1 ; WX 278 ; N iacute ; B 67 0 448 745 ;
XC -1 ; WX 278 ; N icircumflex ; B 67 0 426 745 ;
XC -1 ; WX 278 ; N idieresis ; B 67 0 442 731 ;
XC -1 ; WX 278 ; N igrave ; B 67 0 322 745 ;
XC -1 ; WX 584 ; N logicalnot ; B 103 121 632 412 ;
XC -1 ; WX 584 ; N minus ; B 77 174 606 290 ;
XC -1 ; WX 611 ; N mu ; B 11 -219 656 542 ;
XC -1 ; WX 584 ; N multiply ; B 66 -10 617 474 ;
XC -1 ; WX 611 ; N ntilde ; B 63 0 646 729 ;
XC -1 ; WX 611 ; N oacute ; B 82 -23 634 745 ;
XC -1 ; WX 611 ; N ocircumflex ; B 82 -23 634 745 ;
XC -1 ; WX 611 ; N odieresis ; B 82 -23 634 731 ;
XC -1 ; WX 611 ; N ograve ; B 82 -23 634 745 ;
XC -1 ; WX 834 ; N onehalf ; B 120 -20 871 715 ;
XC -1 ; WX 834 ; N onequarter ; B 151 -20 846 715 ;
XC -1 ; WX 333 ; N onesuperior ; B 169 284 398 709 ;
XC -1 ; WX 611 ; N otilde ; B 82 -23 639 729 ;
XC -1 ; WX 584 ; N plusminus ; B 40 0 639 674 ;
XC -1 ; WX 737 ; N registered ; B 55 -20 837 745 ;
XC -1 ; WX 556 ; N scaron ; B 60 -23 597 745 ;
XC -1 ; WX 611 ; N thorn ; B 11 -219 641 729 ;
XC -1 ; WX 834 ; N threequarters ; B 116 -20 863 725 ;
XC -1 ; WX 333 ; N threesuperior ; B 92 271 442 720 ;
XC -1 ; WX 1000 ; N trademark ; B 213 341 1087 745 ;
XC -1 ; WX 333 ; N twosuperior ; B 69 284 452 719 ;
XC -1 ; WX 611 ; N uacute ; B 88 -23 656 745 ;
XC -1 ; WX 611 ; N ucircumflex ; B 88 -23 656 745 ;
XC -1 ; WX 611 ; N udieresis ; B 88 -23 656 731 ;
XC -1 ; WX 611 ; N ugrave ; B 88 -23 656 745 ;
XC -1 ; WX 556 ; N yacute ; B 37 -219 653 745 ;
XC -1 ; WX 556 ; N ydieresis ; B 37 -219 653 731 ;
XC -1 ; WX 500 ; N zcaron ; B 21 0 575 745 ;


XEndCharMetrics
XStartKernData
XStartKernPairs 99
X

XKPX A space -37
XKPX A quoteright -55
XKPX A Y -74
XKPX A W -55
XKPX A V -74


XKPX A T -74
X

XKPX F period -111
XKPX F comma -111

XKPX F A -55
X
XKPX L space -18
XKPX L quoteright -74
XKPX L Y -74
XKPX L W -55
XKPX L V -55


XKPX L T -74
X

XKPX P space -37


XKPX P period -129
XKPX P comma -129
XKPX P A -74
X

XKPX R Y -18
XKPX R W -18


XKPX R T -18
X

XKPX T y -37
XKPX T w -37


XKPX T u -18
XKPX T semicolon -74

XKPX T s -37
XKPX T r -18
XKPX T period -74
XKPX T o -37


XKPX T i -18
XKPX T hyphen -55

XKPX T e -37
XKPX T comma -74
XKPX T colon -74
XKPX T c -37
XKPX T a -37


XKPX T O -18
XKPX T A -74
X

XKPX V y -18
XKPX V u -18
XKPX V semicolon -37


XKPX V r -18
XKPX V period -92

XKPX V o -37
XKPX V i -37
XKPX V hyphen -37
XKPX V e -37
XKPX V comma -92
XKPX V colon -37
XKPX V a -37


XKPX V A -74
X

XKPX W y -18
XKPX W u -18
XKPX W semicolon -37
XKPX W r -18


XKPX W period -74
XKPX W o -18

XKPX W i -9
XKPX W hyphen -37


XKPX W e -18
XKPX W comma -74

XKPX W colon -37
XKPX W a -18
XKPX W A -55
X
XKPX Y v -37
XKPX Y u -37
XKPX Y space -18
XKPX Y semicolon -55
XKPX Y q -37
XKPX Y period -92
XKPX Y p -37
XKPX Y i -37
XKPX Y o -37
XKPX Y hyphen -74
XKPX Y e -37
XKPX Y comma -92
XKPX Y colon -55
XKPX Y a -37
XKPX Y A -74


X
XKPX f quoteright 18

XKPX f f -18
X

XKPX one one -74


X
XKPX quoteleft quoteleft -37
X

XKPX quoteright t 18
XKPX quoteright space -37
XKPX quoteright s -18


XKPX quoteright quoteright -37
X

XKPX r quoteright 37
XKPX r period -55

XKPX r comma -55


X
XKPX space Y -18
XKPX space A -37
X

XKPX v period -55
XKPX v comma -55
X
XKPX w period -37
XKPX w comma -37
X

XKPX y period -37
XKPX y comma -37

XEndKernPairs
XEndKernData
XStartComposites 58
XCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 139 187 ;


XCC zcaron 2 ; PCC z 0 0 ; PCC caron 83 0 ;

XCC Scaron 2 ; PCC S 0 0 ; PCC caron 167 187 ;
XCC scaron 2 ; PCC s 0 0 ; PCC caron 111 0 ;
XCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 194 0 ;


XCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 111 0 ;

XCC Yacute 2 ; PCC Y 0 0 ; PCC acute 167 187 ;


XCC yacute 2 ; PCC y 0 0 ; PCC acute 111 0 ;

XCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 167 187 ;


XCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 111 0 ;

XCC Uacute 2 ; PCC U 0 0 ; PCC acute 194 187 ;
XCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 194 187 ;
XCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 194 187 ;
XCC Ugrave 2 ; PCC U 0 0 ; PCC grave 194 187 ;
XCC uacute 2 ; PCC u 0 0 ; PCC acute 139 0 ;
XCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 139 0 ;
XCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 139 0 ;
XCC ugrave 2 ; PCC u 0 0 ; PCC grave 139 0 ;
XCC Iacute 2 ; PCC I 0 0 ; PCC acute -27 187 ;
XCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex -27 187 ;
XCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis -27 187 ;
XCC Igrave 2 ; PCC I 0 0 ; PCC grave -27 187 ;


XCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -27 0 ;
XCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -27 0 ;
XCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -27 0 ;
XCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -27 0 ;

XCC Eacute 2 ; PCC E 0 0 ; PCC acute 167 187 ;
XCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 167 187 ;
XCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 167 187 ;
XCC Egrave 2 ; PCC E 0 0 ; PCC grave 167 187 ;
XCC eacute 2 ; PCC e 0 0 ; PCC acute 111 0 ;
XCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 111 0 ;
XCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 111 0 ;
XCC egrave 2 ; PCC e 0 0 ; PCC grave 111 0 ;
XCC Aacute 2 ; PCC A 0 0 ; PCC acute 194 187 ;
XCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 194 187 ;
XCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 194 187 ;
XCC Agrave 2 ; PCC A 0 0 ; PCC grave 194 187 ;
XCC aacute 2 ; PCC a 0 0 ; PCC acute 111 0 ;
XCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 111 0 ;
XCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 111 0 ;
XCC agrave 2 ; PCC a 0 0 ; PCC grave 111 0 ;
XCC Oacute 2 ; PCC O 0 0 ; PCC acute 222 187 ;
XCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 222 187 ;
XCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 222 187 ;
XCC Ograve 2 ; PCC O 0 0 ; PCC grave 222 187 ;


XCC oacute 2 ; PCC o 0 0 ; PCC acute 139 0 ;
XCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 139 0 ;
XCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 139 0 ;
XCC ograve 2 ; PCC o 0 0 ; PCC grave 139 0 ;

XCC Atilde 2 ; PCC A 0 0 ; PCC tilde 194 187 ;
XCC atilde 2 ; PCC a 0 0 ; PCC tilde 111 0 ;
XCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 194 187 ;
XCC ntilde 2 ; PCC n 0 0 ; PCC tilde 139 0 ;
XCC Otilde 2 ; PCC O 0 0 ; PCC tilde 222 187 ;


XCC otilde 2 ; PCC o 0 0 ; PCC tilde 139 0 ;

XCC Aring 2 ; PCC A 0 0 ; PCC ring 194 187 ;
XCC aring 2 ; PCC a 0 0 ; PCC ring 111 0 ;
XEndComposites
XEndFontMetrics
END_OF_FILE
if test 15511 -ne `wc -c <'lout/font0/HelveBolObl.AFM'`; then
echo shar: \"'lout/font0/HelveBolObl.AFM'\" unpacked with wrong size!
fi
# end of 'lout/font0/HelveBolObl.AFM'
fi
if test -f 'lout/font0/HelveNar.AFM' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/font0/HelveNar.AFM'\"
else
echo shar: Extracting \"'lout/font0/HelveNar.AFM'\" \(15538 characters\)
sed "s/^X//" >'lout/font0/HelveNar.AFM' <<'END_OF_FILE'
XStartFontMetrics 2.0


XComment Copyright (c) 1985, 1987 Adobe Systems Incorporated. All rights reserved.

XComment Creation Date:Sun Dec 13 14:16:16 PST 1987
XFontName Helvetica-Narrow


XEncodingScheme AdobeStandardEncoding
XFullName Helvetica Narrow

XFamilyName Helvetica


XWeight Medium
XItalicAngle 0.0
XIsFixedPitch false

XUnderlinePosition -97
XUnderlineThickness 73
XVersion 001.002
XNotice Copyright (c) 1985, 1987 Adobe Systems Incorporated. All rights reserved.Helvetica is a registered trademark of Linotype Company.
XFontBBox -143 -220 821 944
XCapHeight 729
XXHeight 525


XDescender -219
XAscender 729
XStartCharMetrics 228

XC 32 ; WX 228 ; N space ; B 0 0 0 0 ;
XC 33 ; WX 228 ; N exclam ; B 102 0 171 729 ;
XC 34 ; WX 291 ; N quotedbl ; B 43 462 250 708 ;
XC 35 ; WX 456 ; N numbersign ; B 12 -20 444 698 ;
XC 36 ; WX 456 ; N dollar ; B 28 -125 425 770 ;
XC 37 ; WX 729 ; N percent ; B 23 -20 704 708 ;
XC 38 ; WX 547 ; N ampersand ; B 42 -23 522 710 ;
XC 39 ; WX 182 ; N quoteright ; B 53 476 130 708 ;
XC 40 ; WX 273 ; N parenleft ; B 60 -213 239 729 ;
XC 41 ; WX 273 ; N parenright ; B 31 -213 210 729 ;
XC 42 ; WX 319 ; N asterisk ; B 33 452 281 740 ;
XC 43 ; WX 479 ; N plus ; B 41 -10 438 474 ;
XC 44 ; WX 228 ; N comma ; B 71 -150 157 104 ;
XC 45 ; WX 273 ; N hyphen ; B 38 240 233 313 ;
XC 46 ; WX 228 ; N period ; B 71 0 156 104 ;
XC 47 ; WX 228 ; N slash ; B -7 -21 233 708 ;
XC 48 ; WX 456 ; N zero ; B 35 -23 416 709 ;
XC 49 ; WX 456 ; N one ; B 84 0 285 709 ;
XC 50 ; WX 456 ; N two ; B 28 0 419 710 ;
XC 51 ; WX 456 ; N three ; B 26 -23 415 709 ;
XC 52 ; WX 456 ; N four ; B 23 0 426 709 ;
XC 53 ; WX 456 ; N five ; B 29 -23 421 709 ;
XC 54 ; WX 456 ; N six ; B 35 -23 421 709 ;
XC 55 ; WX 456 ; N seven ; B 38 0 426 709 ;
XC 56 ; WX 456 ; N eight ; B 32 -23 421 709 ;
XC 57 ; WX 456 ; N nine ; B 31 -23 417 709 ;
XC 58 ; WX 228 ; N colon ; B 90 0 175 525 ;
XC 59 ; WX 228 ; N semicolon ; B 90 -150 176 516 ;
XC 60 ; WX 479 ; N less ; B 37 -10 438 474 ;
XC 61 ; WX 479 ; N equal ; B 41 112 438 352 ;
XC 62 ; WX 479 ; N greater ; B 41 -10 442 474 ;
XC 63 ; WX 456 ; N question ; B 63 0 417 738 ;
XC 64 ; WX 832 ; N at ; B 27 -146 779 737 ;
XC 65 ; WX 547 ; N A ; B 14 0 535 729 ;
XC 66 ; WX 547 ; N B ; B 65 0 511 729 ;
XC 67 ; WX 592 ; N C ; B 39 -23 555 741 ;
XC 68 ; WX 592 ; N D ; B 73 0 547 729 ;
XC 69 ; WX 547 ; N E ; B 74 0 503 729 ;
XC 70 ; WX 501 ; N F ; B 74 0 475 729 ;
XC 71 ; WX 638 ; N G ; B 36 -23 581 741 ;
XC 72 ; WX 592 ; N H ; B 68 0 528 729 ;
XC 73 ; WX 228 ; N I ; B 82 0 159 729 ;
XC 74 ; WX 410 ; N J ; B 14 -26 349 729 ;
XC 75 ; WX 547 ; N K ; B 65 0 540 729 ;
XC 76 ; WX 456 ; N L ; B 66 0 437 729 ;
XC 77 ; WX 683 ; N M ; B 61 0 624 729 ;
XC 78 ; WX 592 ; N N ; B 62 0 530 729 ;
XC 79 ; WX 638 ; N O ; B 31 -23 608 741 ;
XC 80 ; WX 547 ; N P ; B 75 0 506 730 ;
XC 81 ; WX 638 ; N Q ; B 31 -59 608 741 ;
XC 82 ; WX 592 ; N R ; B 76 0 557 729 ;
XC 83 ; WX 547 ; N S ; B 40 -23 509 741 ;
XC 84 ; WX 501 ; N T ; B 17 0 486 729 ;
XC 85 ; WX 592 ; N U ; B 70 -23 529 729 ;
XC 86 ; WX 547 ; N V ; B 25 0 529 729 ;
XC 87 ; WX 774 ; N W ; B 18 0 762 729 ;
XC 88 ; WX 547 ; N X ; B 18 0 532 729 ;
XC 89 ; WX 547 ; N Y ; B 10 0 542 729 ;
XC 90 ; WX 501 ; N Z ; B 23 0 478 729 ;
XC 91 ; WX 228 ; N bracketleft ; B 52 -214 205 729 ;
XC 92 ; WX 228 ; N backslash ; B -7 -20 233 729 ;
XC 93 ; WX 228 ; N bracketright ; B 19 -215 172 729 ;
XC 94 ; WX 385 ; N asciicircum ; B 36 333 349 713 ;
XC 95 ; WX 456 ; N underscore ; B -18 -175 474 -125 ;
XC 96 ; WX 182 ; N quoteleft ; B 54 459 130 708 ;
XC 97 ; WX 456 ; N a ; B 33 -23 438 540 ;
XC 98 ; WX 456 ; N b ; B 44 -23 429 729 ;
XC 99 ; WX 410 ; N c ; B 25 -23 391 540 ;
XC 100 ; WX 456 ; N d ; B 21 -23 406 729 ;
XC 101 ; WX 456 ; N e ; B 33 -23 421 541 ;
XC 102 ; WX 228 ; N f ; B 15 0 212 733 ; L i fi ; L l fl ;
XC 103 ; WX 456 ; N g ; B 23 -220 400 540 ;
XC 104 ; WX 456 ; N h ; B 57 0 399 729 ;
XC 105 ; WX 182 ; N i ; B 54 0 123 729 ;
XC 106 ; WX 182 ; N j ; B -14 -220 126 729 ;
XC 107 ; WX 410 ; N k ; B 48 0 412 729 ;
XC 108 ; WX 182 ; N l ; B 56 0 125 729 ;
XC 109 ; WX 683 ; N m ; B 58 0 625 540 ;
XC 110 ; WX 456 ; N n ; B 57 0 399 540 ;
XC 111 ; WX 456 ; N o ; B 29 -23 418 540 ;
XC 112 ; WX 456 ; N p ; B 44 -219 429 540 ;
XC 113 ; WX 456 ; N q ; B 21 -219 406 540 ;
XC 114 ; WX 273 ; N r ; B 57 0 264 540 ;
XC 115 ; WX 410 ; N s ; B 27 -24 376 540 ;
XC 116 ; WX 228 ; N t ; B 11 -24 208 667 ;
XC 117 ; WX 456 ; N u ; B 53 -23 395 525 ;
XC 118 ; WX 410 ; N v ; B 8 0 398 525 ;
XC 119 ; WX 592 ; N w ; B 5 0 581 525 ;
XC 120 ; WX 410 ; N x ; B 14 0 388 525 ;
XC 121 ; WX 410 ; N y ; B 16 -219 392 525 ;
XC 122 ; WX 410 ; N z ; B 25 0 375 525 ;
XC 123 ; WX 274 ; N braceleft ; B 35 -214 226 731 ;
XC 124 ; WX 213 ; N bar ; B 82 -215 131 729 ;
XC 125 ; WX 274 ; N braceright ; B 24 -214 215 731 ;
XC 126 ; WX 479 ; N asciitilde ; B 62 267 415 438 ;
XC 161 ; WX 273 ; N exclamdown ; B 99 -214 168 525 ;
XC 162 ; WX 456 ; N cent ; B 42 -120 418 628 ;
XC 163 ; WX 456 ; N sterling ; B 21 -21 439 726 ;
XC 164 ; WX 137 ; N fraction ; B -143 -21 276 708 ;
XC 165 ; WX 456 ; N yen ; B 9 0 447 710 ;
XC 166 ; WX 456 ; N florin ; B 9 -214 444 742 ;
XC 167 ; WX 456 ; N section ; B 36 -215 415 729 ;
XC 168 ; WX 456 ; N currency ; B 55 126 401 554 ;
XC 169 ; WX 157 ; N quotesingle ; B 39 462 116 708 ;
XC 170 ; WX 273 ; N quotedblleft ; B 40 459 245 708 ;
XC 171 ; WX 456 ; N guillemotleft ; B 80 106 373 438 ;
XC 172 ; WX 273 ; N guilsinglleft ; B 75 112 200 436 ;
XC 173 ; WX 273 ; N guilsinglright ; B 70 112 196 436 ;
XC 174 ; WX 410 ; N fi ; B 10 0 358 733 ;
XC 175 ; WX 410 ; N fl ; B 14 0 353 733 ;
XC 177 ; WX 456 ; N endash ; B -4 240 460 313 ;
XC 178 ; WX 456 ; N dagger ; B 31 -178 421 710 ;
XC 179 ; WX 456 ; N daggerdbl ; B 31 -178 420 710 ;
XC 180 ; WX 228 ; N periodcentered ; B 71 318 173 442 ;
XC 182 ; WX 440 ; N paragraph ; B 39 -178 428 729 ;
XC 183 ; WX 287 ; N bullet ; B 41 220 246 470 ;
XC 184 ; WX 182 ; N quotesinglbase ; B 53 -129 130 103 ;
XC 185 ; WX 273 ; N quotedblbase ; B 39 -129 246 103 ;
XC 186 ; WX 273 ; N quotedblright ; B 40 476 248 708 ;
XC 187 ; WX 456 ; N guillemotright ; B 80 106 370 438 ;
XC 188 ; WX 820 ; N ellipsis ; B 94 0 725 104 ;
XC 189 ; WX 820 ; N perthousand ; B 7 -20 814 740 ;
XC 191 ; WX 501 ; N questiondown ; B 78 -213 433 525 ;
XC 193 ; WX 273 ; N grave ; B 18 592 189 740 ;
XC 194 ; WX 273 ; N acute ; B 75 592 247 740 ;
XC 195 ; WX 273 ; N circumflex ; B 16 591 251 741 ;
XC 196 ; WX 273 ; N tilde ; B 4 589 262 716 ;
XC 197 ; WX 273 ; N macron ; B 23 621 248 694 ;
XC 198 ; WX 273 ; N breve ; B 12 594 259 729 ;
XC 199 ; WX 273 ; N dotaccent ; B 94 605 179 709 ;
XC 200 ; WX 273 ; N dieresis ; B 25 605 243 708 ;
XC 202 ; WX 273 ; N ring ; B 65 566 209 741 ;
XC 203 ; WX 273 ; N cedilla ; B 32 -214 236 0 ;
XC 205 ; WX 273 ; N hungarumlaut ; B -29 592 285 740 ;
XC 206 ; WX 273 ; N ogonek ; B 46 -189 217 15 ;
XC 207 ; WX 273 ; N caron ; B 15 590 251 740 ;
XC 208 ; WX 820 ; N emdash ; B -7 240 821 313 ;
XC 225 ; WX 820 ; N AE ; B 9 0 779 729 ;
XC 227 ; WX 303 ; N ordfeminine ; B 30 301 273 740 ;
XC 232 ; WX 456 ; N Lslash ; B 0 0 453 729 ;
XC 233 ; WX 638 ; N Oslash ; B 25 -23 610 742 ;
XC 234 ; WX 820 ; N OE ; B 35 -20 787 739 ;
XC 235 ; WX 299 ; N ordmasculine ; B 33 301 266 741 ;
XC 241 ; WX 729 ; N ae ; B 28 -20 693 546 ;
XC 245 ; WX 228 ; N dotlessi ; B 77 0 146 525 ;
XC 248 ; WX 182 ; N lslash ; B 0 0 173 729 ;
XC 249 ; WX 501 ; N oslash ; B 15 -27 434 548 ;
XC 250 ; WX 774 ; N oe ; B 33 -22 737 540 ;
XC 251 ; WX 501 ; N germandbls ; B 103 -20 463 729 ;
XC -1 ; WX 547 ; N Aacute ; B 14 0 535 939 ;
XC -1 ; WX 547 ; N Acircumflex ; B 14 0 535 940 ;
XC -1 ; WX 547 ; N Adieresis ; B 14 0 535 907 ;
XC -1 ; WX 547 ; N Agrave ; B 14 0 535 939 ;
XC -1 ; WX 547 ; N Aring ; B 14 0 535 940 ;
XC -1 ; WX 547 ; N Atilde ; B 14 0 535 915 ;
XC -1 ; WX 592 ; N Ccedilla ; B 39 -214 555 741 ;
XC -1 ; WX 547 ; N Eacute ; B 74 0 503 939 ;
XC -1 ; WX 547 ; N Ecircumflex ; B 74 0 503 940 ;
XC -1 ; WX 547 ; N Edieresis ; B 74 0 503 907 ;
XC -1 ; WX 547 ; N Egrave ; B 74 0 503 939 ;
XC -1 ; WX 592 ; N Eth ; B 0 0 547 729 ;
XC -1 ; WX 228 ; N Iacute ; B 58 0 230 939 ;
XC -1 ; WX 228 ; N Icircumflex ; B -1 0 234 940 ;
XC -1 ; WX 228 ; N Idieresis ; B 8 0 226 907 ;
XC -1 ; WX 228 ; N Igrave ; B 1 0 172 939 ;
XC -1 ; WX 592 ; N Ntilde ; B 62 0 530 915 ;
XC -1 ; WX 638 ; N Oacute ; B 31 -23 608 939 ;
XC -1 ; WX 638 ; N Ocircumflex ; B 31 -23 608 940 ;
XC -1 ; WX 638 ; N Odieresis ; B 31 -23 608 907 ;
XC -1 ; WX 638 ; N Ograve ; B 31 -23 608 939 ;
XC -1 ; WX 638 ; N Otilde ; B 31 -23 608 915 ;
XC -1 ; WX 547 ; N Scaron ; B 40 -23 509 939 ;
XC -1 ; WX 547 ; N Thorn ; B 75 0 506 729 ;
XC -1 ; WX 592 ; N Uacute ; B 70 -23 529 939 ;
XC -1 ; WX 592 ; N Ucircumflex ; B 70 -23 529 940 ;
XC -1 ; WX 592 ; N Udieresis ; B 70 -23 529 907 ;
XC -1 ; WX 592 ; N Ugrave ; B 70 -23 529 939 ;
XC -1 ; WX 547 ; N Yacute ; B 10 0 542 944 ;
XC -1 ; WX 547 ; N Ydieresis ; B 10 0 542 907 ;
XC -1 ; WX 501 ; N Zcaron ; B 23 0 478 939 ;
XC -1 ; WX 456 ; N aacute ; B 33 -23 438 740 ;
XC -1 ; WX 456 ; N acircumflex ; B 33 -23 438 741 ;
XC -1 ; WX 456 ; N adieresis ; B 33 -23 438 708 ;
XC -1 ; WX 456 ; N agrave ; B 33 -23 438 740 ;
XC -1 ; WX 456 ; N aring ; B 33 -23 438 741 ;
XC -1 ; WX 456 ; N atilde ; B 33 -23 438 716 ;
XC -1 ; WX 213 ; N brokenbar ; B 82 -215 131 729 ;
XC -1 ; WX 410 ; N ccedilla ; B 25 -214 391 540 ;
XC -1 ; WX 604 ; N copyright ; B -11 -23 616 741 ;
XC -1 ; WX 328 ; N degree ; B 41 409 287 709 ;
XC -1 ; WX 479 ; N divide ; B 41 -10 438 474 ;
XC -1 ; WX 456 ; N eacute ; B 33 -23 421 740 ;
XC -1 ; WX 456 ; N ecircumflex ; B 33 -23 421 741 ;
XC -1 ; WX 456 ; N edieresis ; B 33 -23 421 708 ;
XC -1 ; WX 456 ; N egrave ; B 33 -23 421 740 ;
XC -1 ; WX 456 ; N eth ; B 29 -23 418 729 ;
XC -1 ; WX 228 ; N iacute ; B 53 0 225 740 ;
XC -1 ; WX 228 ; N icircumflex ; B -6 0 229 741 ;
XC -1 ; WX 228 ; N idieresis ; B 3 0 221 708 ;
XC -1 ; WX 228 ; N igrave ; B -4 0 167 740 ;
XC -1 ; WX 479 ; N logicalnot ; B 33 82 446 352 ;
XC -1 ; WX 479 ; N minus ; B 33 194 446 270 ;
XC -1 ; WX 456 ; N mu ; B 53 -219 395 525 ;
XC -1 ; WX 479 ; N multiply ; B 41 -10 438 476 ;
XC -1 ; WX 456 ; N ntilde ; B 57 0 399 716 ;
XC -1 ; WX 456 ; N oacute ; B 29 -23 418 740 ;
XC -1 ; WX 456 ; N ocircumflex ; B 29 -23 418 741 ;
XC -1 ; WX 456 ; N odieresis ; B 29 -23 418 708 ;
XC -1 ; WX 456 ; N ograve ; B 29 -23 418 740 ;
XC -1 ; WX 684 ; N onehalf ; B 25 -21 659 709 ;
XC -1 ; WX 684 ; N onequarter ; B 25 -21 659 709 ;
XC -1 ; WX 273 ; N onesuperior ; B 49 284 179 709 ;
XC -1 ; WX 456 ; N otilde ; B 29 -23 418 716 ;
XC -1 ; WX 479 ; N plusminus ; B 33 0 446 618 ;
XC -1 ; WX 604 ; N registered ; B -11 -23 616 741 ;
XC -1 ; WX 410 ; N scaron ; B 27 -24 376 740 ;
XC -1 ; WX 456 ; N thorn ; B 44 -219 429 729 ;
XC -1 ; WX 684 ; N threequarters ; B 25 -21 659 709 ;
XC -1 ; WX 273 ; N threesuperior ; B 10 270 263 709 ;
XC -1 ; WX 820 ; N trademark ; B 51 320 769 741 ;
XC -1 ; WX 273 ; N twosuperior ; B 9 284 263 710 ;
XC -1 ; WX 456 ; N uacute ; B 53 -23 395 740 ;
XC -1 ; WX 456 ; N ucircumflex ; B 53 -23 395 741 ;
XC -1 ; WX 456 ; N udieresis ; B 53 -23 395 708 ;
XC -1 ; WX 456 ; N ugrave ; B 53 -23 395 740 ;
XC -1 ; WX 410 ; N yacute ; B 16 -219 392 740 ;
XC -1 ; WX 410 ; N ydieresis ; B 16 -219 392 708 ;
XC -1 ; WX 410 ; N zcaron ; B 25 0 375 740 ;
XEndCharMetrics
XStartKernData
XStartKernPairs 105
X
XKPX A y -14
XKPX A w -14
XKPX A v -14
XKPX A space -45
XKPX A quoteright -60
XKPX A Y -60
XKPX A W -30


XKPX A V -60
XKPX A T -60
X
XKPX F period -91
XKPX F comma -91
XKPX F A -45
X

XKPX L y -30
XKPX L space -30
XKPX L quoteright -45
XKPX L Y -60
XKPX L W -60
XKPX L V -60


XKPX L T -60
X

XKPX P space -14


XKPX P period -105
XKPX P comma -105
XKPX P A -60
X
XKPX R Y -14
XKPX R W -14

XKPX R V -14


XKPX R T -14
X

XKPX T y -45
XKPX T w -45
XKPX T u -30
XKPX T space -14
XKPX T semicolon -91
XKPX T s -70
XKPX T r -30
XKPX T period -91
XKPX T o -91
XKPX T i -18
XKPX T hyphen -45
XKPX T e -91
XKPX T comma -91
XKPX T colon -91
XKPX T c -91
XKPX T a -91


XKPX T O -14
XKPX T A -60
X

XKPX V y -30
XKPX V u -30
XKPX V semicolon -30
XKPX V r -30
XKPX V period -75
XKPX V o -45
XKPX V i -14
XKPX V hyphen -45
XKPX V e -45


XKPX V comma -75
XKPX V colon -30

XKPX V a -60


XKPX V A -60
X

XKPX W y -7
XKPX W u -14
XKPX W semicolon -14
XKPX W r -14
XKPX W period -45
XKPX W o -14
XKPX W i 0
XKPX W hyphen -14
XKPX W e -14
XKPX W comma -45
XKPX W colon -14
XKPX W a -30
XKPX W A -30
X
XKPX Y v -45
XKPX Y u -45
XKPX Y space -14
XKPX Y semicolon -53
XKPX Y q -75
XKPX Y period -105
XKPX Y p -60
XKPX Y o -75
XKPX Y i -30
XKPX Y hyphen -75
XKPX Y e -75
XKPX Y comma -105
XKPX Y colon -45
XKPX Y a -60


XKPX Y A -60
X
XKPX f quoteright 14
XKPX f f -14
X
XKPX one one -60
X

XKPX quoteleft quoteleft -14
X


XKPX quoteright space -30
XKPX quoteright s -14

XKPX quoteright quoteright -14


X
XKPX r quoteright 30
XKPX r period -45
XKPX r comma -45
X
XKPX space Y -14

XKPX space T -14
XKPX space A -45
X
XKPX v period -60
XKPX v comma -60
X
XKPX w period -45
XKPX w comma -45
X
XKPX y period -60
XKPX y comma -60
XEndKernPairs
XEndKernData
XStartComposites 58
XCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 113 199 ;


XCC zcaron 2 ; PCC z 0 0 ; PCC caron 68 0 ;

XCC Scaron 2 ; PCC S 0 0 ; PCC caron 136 199 ;
XCC scaron 2 ; PCC s 0 0 ; PCC caron 68 0 ;


XCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 172 0 ;

XCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 81 0 ;
XCC Yacute 2 ; PCC Y 0 0 ; PCC acute 136 204 ;
XCC yacute 2 ; PCC y 0 0 ; PCC acute 68 0 ;
XCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 136 199 ;
XCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 68 0 ;
XCC Uacute 2 ; PCC U 0 0 ; PCC acute 159 199 ;
XCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 159 199 ;
XCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 159 199 ;
XCC Ugrave 2 ; PCC U 0 0 ; PCC grave 159 199 ;
XCC uacute 2 ; PCC u 0 0 ; PCC acute 91 0 ;
XCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 91 0 ;
XCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 91 0 ;
XCC ugrave 2 ; PCC u 0 0 ; PCC grave 91 0 ;
XCC Iacute 2 ; PCC I 0 0 ; PCC acute -16 199 ;
XCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex -16 199 ;
XCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis -16 199 ;
XCC Igrave 2 ; PCC I 0 0 ; PCC grave -16 199 ;


XCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -22 0 ;
XCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -22 0 ;
XCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -22 0 ;
XCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -22 0 ;

XCC Eacute 2 ; PCC E 0 0 ; PCC acute 157 199 ;
XCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 157 199 ;
XCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 157 199 ;
XCC Egrave 2 ; PCC E 0 0 ; PCC grave 157 199 ;
XCC eacute 2 ; PCC e 0 0 ; PCC acute 97 0 ;
XCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 97 0 ;
XCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 97 0 ;
XCC egrave 2 ; PCC e 0 0 ; PCC grave 97 0 ;
XCC Aacute 2 ; PCC A 0 0 ; PCC acute 136 199 ;
XCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 136 199 ;
XCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 136 199 ;
XCC Agrave 2 ; PCC A 0 0 ; PCC grave 136 199 ;


XCC aacute 2 ; PCC a 0 0 ; PCC acute 91 0 ;
XCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 91 0 ;
XCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 91 0 ;
XCC agrave 2 ; PCC a 0 0 ; PCC grave 91 0 ;

XCC Oacute 2 ; PCC O 0 0 ; PCC acute 182 199 ;
XCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 182 199 ;
XCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 182 199 ;
XCC Ograve 2 ; PCC O 0 0 ; PCC grave 182 199 ;
XCC oacute 2 ; PCC o 0 0 ; PCC acute 91 0 ;
XCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 91 0 ;
XCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 91 0 ;
XCC ograve 2 ; PCC o 0 0 ; PCC grave 91 0 ;
XCC Atilde 2 ; PCC A 0 0 ; PCC tilde 136 199 ;


XCC atilde 2 ; PCC a 0 0 ; PCC tilde 91 0 ;

XCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 165 199 ;
XCC ntilde 2 ; PCC n 0 0 ; PCC tilde 97 0 ;
XCC Otilde 2 ; PCC O 0 0 ; PCC tilde 182 199 ;
XCC otilde 2 ; PCC o 0 0 ; PCC tilde 91 0 ;
XCC Aring 2 ; PCC A 0 0 ; PCC ring 136 199 ;


XCC aring 2 ; PCC a 0 0 ; PCC ring 91 0 ;
XEndComposites
XEndFontMetrics
END_OF_FILE

if test 15538 -ne `wc -c <'lout/font0/HelveNar.AFM'`; then
echo shar: \"'lout/font0/HelveNar.AFM'\" unpacked with wrong size!
fi
# end of 'lout/font0/HelveNar.AFM'
fi
if test -f 'lout/font0/HelveNarObl.AFM' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/font0/HelveNarObl.AFM'\"
else
echo shar: Extracting \"'lout/font0/HelveNarObl.AFM'\" \(15510 characters\)
sed "s/^X//" >'lout/font0/HelveNarObl.AFM' <<'END_OF_FILE'
XStartFontMetrics 2.0


XComment Copyright (c) 1985, 1987 Adobe Systems Incorporated. All rights reserved.

XComment Creation Date:Tue Apr 12 08:20:16 PDT 1988
XFontName Helvetica-Narrow-Oblique
XEncodingScheme AdobeStandardEncoding
XFullName Helvetica Narrow Oblique
XFamilyName Helvetica
XWeight Medium
XItalicAngle -12.0
XIsFixedPitch false
XUnderlinePosition -97
XUnderlineThickness 73
XVersion 001.002
XNotice Copyright (c) 1985, 1987 Adobe Systems Incorporated. All rights reserved.Helvetica is a registered trademark of Linotype Company.
XFontBBox -146 -220 909 944
XCapHeight 729
XXHeight 525


XDescender -219
XAscender 729
XStartCharMetrics 228

XC 32 ; WX 228 ; N space ; B 0 0 0 0 ;
XC 33 ; WX 228 ; N exclam ; B 102 0 298 729 ;
XC 34 ; WX 291 ; N quotedbl ; B 146 462 374 708 ;
XC 35 ; WX 456 ; N numbersign ; B 45 -20 532 698 ;
XC 36 ; WX 456 ; N dollar ; B 57 -125 503 770 ;
XC 37 ; WX 729 ; N percent ; B 110 -20 734 708 ;
XC 38 ; WX 547 ; N ampersand ; B 68 -23 528 710 ;
XC 39 ; WX 182 ; N quoteright ; B 136 476 253 708 ;
XC 40 ; WX 273 ; N parenleft ; B 93 -213 366 729 ;
XC 41 ; WX 273 ; N parenright ; B -6 -213 267 729 ;
XC 42 ; WX 319 ; N asterisk ; B 139 452 386 740 ;
XC 43 ; WX 479 ; N plus ; B 75 -10 484 474 ;
XC 44 ; WX 228 ; N comma ; B 45 -150 175 104 ;
XC 45 ; WX 273 ; N hyphen ; B 80 240 287 313 ;
XC 46 ; WX 228 ; N period ; B 71 0 174 104 ;
XC 47 ; WX 228 ; N slash ; B -10 -21 356 708 ;
XC 48 ; WX 456 ; N zero ; B 80 -23 490 709 ;
XC 49 ; WX 456 ; N one ; B 171 0 409 709 ;
XC 50 ; WX 456 ; N two ; B 28 0 508 710 ;
XC 51 ; WX 456 ; N three ; B 58 -23 491 709 ;
XC 52 ; WX 456 ; N four ; B 52 0 470 709 ;
XC 53 ; WX 456 ; N five ; B 58 -23 516 709 ;
XC 54 ; WX 456 ; N six ; B 76 -23 502 709 ;
XC 55 ; WX 456 ; N seven ; B 112 0 550 709 ;
XC 56 ; WX 456 ; N eight ; B 61 -23 495 709 ;
XC 57 ; WX 456 ; N nine ; B 68 -23 491 709 ;
XC 58 ; WX 228 ; N colon ; B 90 0 267 525 ;
XC 59 ; WX 228 ; N semicolon ; B 64 -150 266 516 ;
XC 60 ; WX 479 ; N less ; B 71 -10 521 474 ;
XC 61 ; WX 479 ; N equal ; B 61 112 499 352 ;
XC 62 ; WX 479 ; N greater ; B 39 -10 489 474 ;
XC 63 ; WX 456 ; N question ; B 151 0 516 738 ;
XC 64 ; WX 832 ; N at ; B 64 -146 849 737 ;
XC 65 ; WX 547 ; N A ; B 14 0 535 729 ;
XC 66 ; WX 547 ; N B ; B 65 0 584 729 ;
XC 67 ; WX 592 ; N C ; B 92 -23 631 741 ;
XC 68 ; WX 592 ; N D ; B 73 0 622 729 ;
XC 69 ; WX 547 ; N E ; B 74 0 616 729 ;
XC 70 ; WX 501 ; N F ; B 74 0 602 729 ;
XC 71 ; WX 638 ; N G ; B 89 -23 663 741 ;
XC 72 ; WX 592 ; N H ; B 68 0 655 729 ;
XC 73 ; WX 228 ; N I ; B 82 0 286 729 ;
XC 74 ; WX 410 ; N J ; B 39 -26 476 729 ;
XC 75 ; WX 547 ; N K ; B 65 0 667 729 ;
XC 76 ; WX 456 ; N L ; B 66 0 452 729 ;
XC 77 ; WX 683 ; N M ; B 61 0 751 729 ;
XC 78 ; WX 592 ; N N ; B 62 0 657 729 ;
XC 79 ; WX 638 ; N O ; B 85 -23 679 741 ;
XC 80 ; WX 547 ; N P ; B 75 0 601 730 ;
XC 81 ; WX 638 ; N Q ; B 85 -59 679 741 ;
XC 82 ; WX 592 ; N R ; B 76 0 632 729 ;
XC 83 ; WX 547 ; N S ; B 73 -23 585 741 ;
XC 84 ; WX 501 ; N T ; B 130 0 613 729 ;
XC 85 ; WX 592 ; N U ; B 102 -23 656 729 ;
XC 86 ; WX 547 ; N V ; B 152 0 656 729 ;
XC 87 ; WX 774 ; N W ; B 145 0 889 729 ;
XC 88 ; WX 547 ; N X ; B 18 0 651 729 ;
XC 89 ; WX 547 ; N Y ; B 137 0 669 729 ;
XC 90 ; WX 501 ; N Z ; B 23 0 604 729 ;
XC 91 ; WX 228 ; N bracketleft ; B 15 -214 332 729 ;
XC 92 ; WX 228 ; N backslash ; B 121 -20 229 729 ;
XC 93 ; WX 228 ; N bracketright ; B -18 -215 299 729 ;
XC 94 ; WX 385 ; N asciicircum ; B 94 333 407 713 ;
XC 95 ; WX 456 ; N underscore ; B -49 -175 452 -125 ;
XC 96 ; WX 182 ; N quoteleft ; B 134 459 253 708 ;
XC 97 ; WX 456 ; N a ; B 52 -23 465 540 ;
XC 98 ; WX 456 ; N b ; B 44 -23 482 729 ;
XC 99 ; WX 410 ; N c ; B 62 -23 454 540 ;
XC 100 ; WX 456 ; N d ; B 60 -23 533 729 ;
XC 101 ; WX 456 ; N e ; B 69 -23 475 541 ;
XC 102 ; WX 228 ; N f ; B 73 0 339 733 ; L i fi ; L l fl ;
XC 103 ; WX 456 ; N g ; B 26 -220 491 540 ;
XC 104 ; WX 456 ; N h ; B 57 0 471 729 ;
XC 105 ; WX 182 ; N i ; B 54 0 250 729 ;
XC 106 ; WX 182 ; N j ; B -52 -220 253 729 ;
XC 107 ; WX 410 ; N k ; B 48 0 479 729 ;
XC 108 ; WX 182 ; N l ; B 56 0 252 729 ;
XC 109 ; WX 683 ; N m ; B 58 0 698 540 ;
XC 110 ; WX 456 ; N n ; B 57 0 470 540 ;
XC 111 ; WX 456 ; N o ; B 66 -23 472 540 ;
XC 112 ; WX 456 ; N p ; B 6 -219 481 540 ;
XC 113 ; WX 456 ; N q ; B 58 -219 497 540 ;
XC 114 ; WX 273 ; N r ; B 57 0 358 540 ;
XC 115 ; WX 410 ; N s ; B 48 -24 426 540 ;
XC 116 ; WX 228 ; N t ; B 80 -24 300 667 ;
XC 117 ; WX 456 ; N u ; B 72 -23 486 525 ;
XC 118 ; WX 410 ; N v ; B 99 0 490 525 ;
XC 119 ; WX 592 ; N w ; B 97 0 673 525 ;
XC 120 ; WX 410 ; N x ; B 14 0 478 525 ;
XC 121 ; WX 410 ; N y ; B 6 -219 483 525 ;
XC 122 ; WX 410 ; N z ; B 25 0 456 525 ;
XC 123 ; WX 274 ; N braceleft ; B 74 -214 353 731 ;
XC 124 ; WX 213 ; N bar ; B 44 -215 258 729 ;
XC 125 ; WX 274 ; N braceright ; B -14 -214 266 731 ;
XC 126 ; WX 479 ; N asciitilde ; B 113 267 487 438 ;
XC 161 ; WX 273 ; N exclamdown ; B 62 -214 259 525 ;
XC 162 ; WX 456 ; N cent ; B 78 -120 480 628 ;
XC 163 ; WX 456 ; N sterling ; B 36 -21 515 726 ;
XC 164 ; WX 137 ; N fraction ; B -146 -21 399 708 ;
XC 165 ; WX 456 ; N yen ; B 82 0 571 710 ;
XC 166 ; WX 456 ; N florin ; B -27 -214 570 742 ;
XC 167 ; WX 456 ; N section ; B 51 -215 483 729 ;
XC 168 ; WX 456 ; N currency ; B 90 126 486 554 ;
XC 169 ; WX 157 ; N quotesingle ; B 142 462 239 708 ;
XC 170 ; WX 273 ; N quotedblleft ; B 120 459 368 708 ;
XC 171 ; WX 456 ; N guillemotleft ; B 120 106 449 438 ;
XC 172 ; WX 273 ; N guilsinglleft ; B 115 112 276 436 ;
XC 173 ; WX 273 ; N guilsinglright ; B 89 112 252 436 ;
XC 174 ; WX 410 ; N fi ; B 68 0 485 733 ;
XC 175 ; WX 410 ; N fl ; B 72 0 480 733 ;
XC 177 ; WX 456 ; N endash ; B 38 240 515 313 ;
XC 178 ; WX 456 ; N dagger ; B 105 -178 509 710 ;
XC 179 ; WX 456 ; N daggerdbl ; B 42 -178 508 710 ;
XC 180 ; WX 228 ; N periodcentered ; B 136 318 240 442 ;
XC 182 ; WX 440 ; N paragraph ; B 118 -178 555 729 ;
XC 183 ; WX 287 ; N bullet ; B 99 220 308 470 ;
XC 184 ; WX 182 ; N quotesinglbase ; B 30 -129 148 103 ;
XC 185 ; WX 273 ; N quotedblbase ; B 16 -129 264 103 ;
XC 186 ; WX 273 ; N quotedblright ; B 123 476 371 708 ;
XC 187 ; WX 456 ; N guillemotright ; B 99 106 425 438 ;
XC 188 ; WX 820 ; N ellipsis ; B 94 0 743 104 ;
XC 189 ; WX 820 ; N perthousand ; B 76 -20 840 740 ;
XC 191 ; WX 501 ; N questiondown ; B 70 -213 436 525 ;
XC 193 ; WX 273 ; N grave ; B 147 592 293 740 ;
XC 194 ; WX 273 ; N acute ; B 179 592 376 740 ;
XC 195 ; WX 273 ; N circumflex ; B 119 591 354 741 ;
XC 196 ; WX 273 ; N tilde ; B 107 589 387 716 ;
XC 197 ; WX 273 ; N macron ; B 131 621 369 694 ;
XC 198 ; WX 273 ; N breve ; B 135 594 386 729 ;
XC 199 ; WX 273 ; N dotaccent ; B 199 605 303 709 ;
XC 200 ; WX 273 ; N dieresis ; B 130 605 367 708 ;
XC 202 ; WX 273 ; N ring ; B 177 566 324 741 ;
XC 203 ; WX 273 ; N cedilla ; B 1 -214 217 0 ;
XC 205 ; WX 273 ; N hungarumlaut ; B 74 592 414 740 ;
XC 206 ; WX 273 ; N ogonek ; B 28 -189 201 15 ;
XC 207 ; WX 273 ; N caron ; B 144 590 380 740 ;
XC 208 ; WX 820 ; N emdash ; B 34 240 875 313 ;
XC 225 ; WX 820 ; N AE ; B 9 0 891 729 ;
XC 227 ; WX 303 ; N ordfeminine ; B 88 301 362 740 ;
XC 232 ; WX 456 ; N Lslash ; B 51 0 467 729 ;
XC 233 ; WX 638 ; N Oslash ; B 26 -23 710 742 ;
XC 234 ; WX 820 ; N OE ; B 82 -20 909 739 ;
XC 235 ; WX 299 ; N ordmasculine ; B 94 301 371 741 ;
XC 241 ; WX 729 ; N ae ; B 48 -20 750 546 ;
XC 245 ; WX 228 ; N dotlessi ; B 77 0 237 525 ;
XC 248 ; WX 182 ; N lslash ; B 51 0 255 729 ;
XC 249 ; WX 501 ; N oslash ; B 15 -27 524 548 ;
XC 250 ; WX 774 ; N oe ; B 69 -22 792 540 ;
XC 251 ; WX 501 ; N germandbls ; B 103 -20 536 729 ;
XC -1 ; WX 547 ; N Aacute ; B 14 0 548 939 ;
XC -1 ; WX 547 ; N Acircumflex ; B 14 0 535 940 ;
XC -1 ; WX 547 ; N Adieresis ; B 14 0 539 907 ;
XC -1 ; WX 547 ; N Agrave ; B 14 0 535 939 ;
XC -1 ; WX 547 ; N Aring ; B 14 0 535 940 ;
XC -1 ; WX 547 ; N Atilde ; B 14 0 559 915 ;
XC -1 ; WX 592 ; N Ccedilla ; B 92 -214 631 741 ;
XC -1 ; WX 547 ; N Eacute ; B 74 0 616 939 ;
XC -1 ; WX 547 ; N Ecircumflex ; B 74 0 616 940 ;
XC -1 ; WX 547 ; N Edieresis ; B 74 0 616 907 ;
XC -1 ; WX 547 ; N Egrave ; B 74 0 616 939 ;
XC -1 ; WX 592 ; N Eth ; B 60 0 623 729 ;
XC -1 ; WX 228 ; N Iacute ; B 82 0 393 939 ;
XC -1 ; WX 228 ; N Icircumflex ; B 82 0 371 940 ;
XC -1 ; WX 228 ; N Idieresis ; B 82 0 384 907 ;
XC -1 ; WX 228 ; N Igrave ; B 82 0 310 939 ;
XC -1 ; WX 592 ; N Ntilde ; B 62 0 657 915 ;
XC -1 ; WX 638 ; N Oacute ; B 85 -23 679 939 ;
XC -1 ; WX 638 ; N Ocircumflex ; B 85 -23 679 940 ;
XC -1 ; WX 638 ; N Odieresis ; B 85 -23 679 907 ;
XC -1 ; WX 638 ; N Ograve ; B 85 -23 679 939 ;
XC -1 ; WX 638 ; N Otilde ; B 85 -23 679 915 ;
XC -1 ; WX 547 ; N Scaron ; B 73 -23 585 939 ;
XC -1 ; WX 547 ; N Thorn ; B 75 0 580 729 ;
XC -1 ; WX 592 ; N Uacute ; B 102 -23 656 939 ;
XC -1 ; WX 592 ; N Ucircumflex ; B 102 -23 656 940 ;
XC -1 ; WX 592 ; N Udieresis ; B 102 -23 656 907 ;
XC -1 ; WX 592 ; N Ugrave ; B 102 -23 656 939 ;
XC -1 ; WX 547 ; N Yacute ; B 137 0 669 944 ;
XC -1 ; WX 547 ; N Ydieresis ; B 137 0 669 907 ;
XC -1 ; WX 501 ; N Zcaron ; B 23 0 604 939 ;
XC -1 ; WX 456 ; N aacute ; B 52 -23 468 740 ;
XC -1 ; WX 456 ; N acircumflex ; B 52 -23 465 741 ;
XC -1 ; WX 456 ; N adieresis ; B 52 -23 465 708 ;
XC -1 ; WX 456 ; N agrave ; B 52 -23 465 740 ;
XC -1 ; WX 456 ; N aring ; B 52 -23 465 741 ;
XC -1 ; WX 456 ; N atilde ; B 52 -23 479 716 ;
XC -1 ; WX 213 ; N brokenbar ; B 44 -215 258 729 ;
XC -1 ; WX 410 ; N ccedilla ; B 62 -214 454 540 ;
XC -1 ; WX 604 ; N copyright ; B 45 -23 686 741 ;
XC -1 ; WX 328 ; N degree ; B 136 409 387 709 ;
XC -1 ; WX 479 ; N divide ; B 75 -10 484 474 ;
XC -1 ; WX 456 ; N eacute ; B 69 -23 475 740 ;
XC -1 ; WX 456 ; N ecircumflex ; B 69 -23 475 741 ;
XC -1 ; WX 456 ; N edieresis ; B 69 -23 475 708 ;
XC -1 ; WX 456 ; N egrave ; B 69 -23 475 740 ;
XC -1 ; WX 456 ; N eth ; B 66 -23 469 729 ;
XC -1 ; WX 228 ; N iacute ; B 77 0 354 740 ;
XC -1 ; WX 228 ; N icircumflex ; B 77 0 332 741 ;
XC -1 ; WX 228 ; N idieresis ; B 77 0 345 708 ;
XC -1 ; WX 228 ; N igrave ; B 77 0 271 740 ;
XC -1 ; WX 479 ; N logicalnot ; B 81 82 508 352 ;
XC -1 ; WX 479 ; N minus ; B 67 194 493 270 ;
XC -1 ; WX 456 ; N mu ; B 15 -219 486 525 ;
XC -1 ; WX 479 ; N multiply ; B 48 -10 512 476 ;
XC -1 ; WX 456 ; N ntilde ; B 57 0 484 716 ;
XC -1 ; WX 456 ; N oacute ; B 66 -23 472 740 ;
XC -1 ; WX 456 ; N ocircumflex ; B 66 -23 472 741 ;
XC -1 ; WX 456 ; N odieresis ; B 66 -23 472 708 ;
XC -1 ; WX 456 ; N ograve ; B 66 -23 472 740 ;
XC -1 ; WX 684 ; N onehalf ; B 95 -21 713 709 ;
XC -1 ; WX 684 ; N onequarter ; B 120 -21 685 709 ;
XC -1 ; WX 273 ; N onesuperior ; B 151 284 303 709 ;
XC -1 ; WX 456 ; N otilde ; B 66 -23 479 716 ;
XC -1 ; WX 479 ; N plusminus ; B 33 0 510 618 ;
XC -1 ; WX 604 ; N registered ; B 45 -23 686 741 ;
XC -1 ; WX 410 ; N scaron ; B 48 -24 449 740 ;
XC -1 ; WX 456 ; N thorn ; B 6 -219 482 729 ;
XC -1 ; WX 684 ; N threequarters ; B 94 -21 712 709 ;
XC -1 ; WX 273 ; N threesuperior ; B 79 270 357 709 ;
XC -1 ; WX 820 ; N trademark ; B 170 320 898 741 ;
XC -1 ; WX 273 ; N twosuperior ; B 58 284 366 710 ;
XC -1 ; WX 456 ; N uacute ; B 72 -23 486 740 ;
XC -1 ; WX 456 ; N ucircumflex ; B 72 -23 486 741 ;
XC -1 ; WX 456 ; N udieresis ; B 72 -23 486 708 ;
XC -1 ; WX 456 ; N ugrave ; B 72 -23 486 740 ;
XC -1 ; WX 410 ; N yacute ; B 6 -219 483 740 ;
XC -1 ; WX 410 ; N ydieresis ; B 6 -219 483 708 ;
XC -1 ; WX 410 ; N zcaron ; B 25 0 456 740 ;
XEndCharMetrics
XStartKernData
XStartKernPairs 98
X
XKPX A y -7
XKPX A w -14
XKPX A v -14
XKPX A space -30
XKPX A quoteright -40
XKPX A Y -60
XKPX A W -30


XKPX A V -60
XKPX A T -60
X

XKPX F space -14
XKPX F period -105
XKPX F comma -105
XKPX F A -60
X
XKPX L y -14
XKPX L space -14
XKPX L quoteright -45
XKPX L Y -75
XKPX L W -30


XKPX L V -45
XKPX L T -60
X
XKPX P space -30
XKPX P period -105
XKPX P comma -105
XKPX P A -60
X

XKPX R Y -30
XKPX R W -14
XKPX R V -14


XKPX R T -14
X

XKPX T y -60
XKPX T w -60
XKPX T u -60
XKPX T semicolon -60
XKPX T s -75
XKPX T r -45
XKPX T period -75
XKPX T o -75
XKPX T i 0
XKPX T hyphen -75
XKPX T e -75
XKPX T comma -75
XKPX T colon -60
XKPX T c -75
XKPX T a -75


XKPX T O -14
XKPX T A -60
X
XKPX V y -14
XKPX V u -14

XKPX V semicolon -14
XKPX V r -14
XKPX V period -60
XKPX V o -30
XKPX V i -14


XKPX V hyphen -30
XKPX V e -30

XKPX V comma -60
XKPX V colon -14


XKPX V a -30
XKPX V A -60
X

XKPX W period -30
XKPX W i -7
XKPX W hyphen -14
XKPX W e -14
XKPX W comma -30
XKPX W a -14
XKPX W A -14


X
XKPX Y v -30
XKPX Y u -30
XKPX Y space -14

XKPX Y semicolon -30
XKPX Y q -45
XKPX Y period -75
XKPX Y p -45
XKPX Y o -45
XKPX Y i -14
XKPX Y hyphen -60
XKPX Y e -45
XKPX Y comma -75
XKPX Y colon -30
XKPX Y a -60
XKPX Y A -45
X
XKPX f quoteright 30


X
XKPX one one -60
X
XKPX quoteleft quoteleft -30
X

XKPX quoteright space -45


XKPX quoteright s -14
XKPX quoteright quoteright -30
X
XKPX r quoteright 30

XKPX r period -30
XKPX r hyphen -14


XKPX r comma -45
X
XKPX space Y -14
XKPX space A -30
X

XKPX v period -60
XKPX v comma -60
X
XKPX w period -45
XKPX w comma -45
X
XKPX y period -60
XKPX y comma -60
XEndKernPairs
XEndKernData
XStartComposites 58
XCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 113 199 ;


XCC zcaron 2 ; PCC z 0 0 ; PCC caron 68 0 ;

XCC Scaron 2 ; PCC S 0 0 ; PCC caron 136 199 ;
XCC scaron 2 ; PCC s 0 0 ; PCC caron 68 0 ;


XCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 172 0 ;

XCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 81 0 ;
XCC Yacute 2 ; PCC Y 0 0 ; PCC acute 136 204 ;
XCC yacute 2 ; PCC y 0 0 ; PCC acute 68 0 ;
XCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 136 199 ;
XCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 68 0 ;
XCC Uacute 2 ; PCC U 0 0 ; PCC acute 159 199 ;
XCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 159 199 ;
XCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 159 199 ;
XCC Ugrave 2 ; PCC U 0 0 ; PCC grave 159 199 ;
XCC uacute 2 ; PCC u 0 0 ; PCC acute 91 0 ;
XCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 91 0 ;
XCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 91 0 ;
XCC ugrave 2 ; PCC u 0 0 ; PCC grave 91 0 ;
XCC Iacute 2 ; PCC I 0 0 ; PCC acute -16 199 ;
XCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex -16 199 ;
XCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis -16 199 ;
XCC Igrave 2 ; PCC I 0 0 ; PCC grave -16 199 ;


XCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -22 0 ;
XCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -22 0 ;
XCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -22 0 ;
XCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -22 0 ;

XCC Eacute 2 ; PCC E 0 0 ; PCC acute 157 199 ;
XCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 157 199 ;
XCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 157 199 ;
XCC Egrave 2 ; PCC E 0 0 ; PCC grave 157 199 ;
XCC eacute 2 ; PCC e 0 0 ; PCC acute 97 0 ;
XCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 97 0 ;
XCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 97 0 ;
XCC egrave 2 ; PCC e 0 0 ; PCC grave 97 0 ;
XCC Aacute 2 ; PCC A 0 0 ; PCC acute 136 199 ;
XCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 136 199 ;
XCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 136 199 ;
XCC Agrave 2 ; PCC A 0 0 ; PCC grave 136 199 ;


XCC aacute 2 ; PCC a 0 0 ; PCC acute 91 0 ;
XCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 91 0 ;
XCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 91 0 ;
XCC agrave 2 ; PCC a 0 0 ; PCC grave 91 0 ;

XCC Oacute 2 ; PCC O 0 0 ; PCC acute 182 199 ;
XCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 182 199 ;
XCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 182 199 ;
XCC Ograve 2 ; PCC O 0 0 ; PCC grave 182 199 ;
XCC oacute 2 ; PCC o 0 0 ; PCC acute 91 0 ;
XCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 91 0 ;
XCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 91 0 ;
XCC ograve 2 ; PCC o 0 0 ; PCC grave 91 0 ;
XCC Atilde 2 ; PCC A 0 0 ; PCC tilde 136 199 ;


XCC atilde 2 ; PCC a 0 0 ; PCC tilde 91 0 ;

XCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 165 199 ;
XCC ntilde 2 ; PCC n 0 0 ; PCC tilde 97 0 ;
XCC Otilde 2 ; PCC O 0 0 ; PCC tilde 182 199 ;
XCC otilde 2 ; PCC o 0 0 ; PCC tilde 91 0 ;
XCC Aring 2 ; PCC A 0 0 ; PCC ring 136 199 ;


XCC aring 2 ; PCC a 0 0 ; PCC ring 91 0 ;
XEndComposites
XEndFontMetrics
END_OF_FILE

if test 15510 -ne `wc -c <'lout/font0/HelveNarObl.AFM'`; then
echo shar: \"'lout/font0/HelveNarObl.AFM'\" unpacked with wrong size!
fi
# end of 'lout/font0/HelveNarObl.AFM'
fi
if test -f 'lout/font0/PalatBol.AFM' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/font0/PalatBol.AFM'\"
else
echo shar: Extracting \"'lout/font0/PalatBol.AFM'\" \(15541 characters\)
sed "s/^X//" >'lout/font0/PalatBol.AFM' <<'END_OF_FILE'
XStartFontMetrics 2.0


XComment Copyright (c) 1985, 1987 Adobe Systems Incorporated. All rights reserved.

XComment Creation Date:Fri Jul 17 15:16:52 PDT 1987
XFontName Palatino-Bold


XEncodingScheme AdobeStandardEncoding
XFullName Palatino Bold

XFamilyName Palatino
XWeight Bold


XItalicAngle 0.0
XIsFixedPitch false
XUnderlinePosition -98

XUnderlineThickness 44
XVersion 001.002
XNotice Copyright (c) 1985, 1987 Adobe Systems Incorporated. All rights reserved. Palatino is a trademark of Allied Corporation.
XFontBBox -156 -266 1000 966
XCapHeight 683
XXHeight 471
XDescender -258
XAscender 719
XStartCharMetrics 228
XC 32 ; WX 250 ; N space ; B 0 0 0 0 ;
XC 33 ; WX 278 ; N exclam ; B 61 -12 219 688 ;
XC 34 ; WX 402 ; N quotedbl ; B 22 376 380 695 ;
XC 35 ; WX 500 ; N numbersign ; B 4 0 496 672 ;
XC 36 ; WX 500 ; N dollar ; B 28 -115 472 721 ;
XC 37 ; WX 889 ; N percent ; B 82 -17 764 678 ;
XC 38 ; WX 833 ; N ampersand ; B 52 -17 813 684 ;
XC 39 ; WX 278 ; N quoteright ; B 31 405 251 695 ;
XC 40 ; WX 333 ; N parenleft ; B 63 -104 303 723 ;
XC 41 ; WX 333 ; N parenright ; B 29 -105 271 723 ;
XC 42 ; WX 444 ; N asterisk ; B 44 332 399 695 ;
XC 43 ; WX 606 ; N plus ; B 51 0 555 505 ;
XC 44 ; WX 250 ; N comma ; B -6 -166 227 141 ;
XC 45 ; WX 333 ; N hyphen ; B 16 195 317 305 ;
XC 46 ; WX 250 ; N period ; B 47 -12 203 144 ;
XC 47 ; WX 296 ; N slash ; B -1 -17 293 695 ;
XC 48 ; WX 500 ; N zero ; B 34 -17 469 660 ;
XC 49 ; WX 500 ; N one ; B 35 -5 455 671 ;
XC 50 ; WX 500 ; N two ; B 25 -2 472 662 ;
XC 51 ; WX 500 ; N three ; B 22 -17 458 660 ;
XC 52 ; WX 500 ; N four ; B 12 -3 473 670 ;
XC 53 ; WX 500 ; N five ; B 42 -17 472 657 ;
XC 54 ; WX 500 ; N six ; B 38 -17 470 664 ;
XC 55 ; WX 500 ; N seven ; B 47 -2 493 656 ;
XC 56 ; WX 500 ; N eight ; B 35 -17 468 660 ;
XC 57 ; WX 500 ; N nine ; B 31 -17 463 662 ;
XC 58 ; WX 250 ; N colon ; B 46 -12 203 454 ;
XC 59 ; WX 250 ; N semicolon ; B -6 -166 227 454 ;
XC 60 ; WX 606 ; N less ; B 49 -15 558 519 ;
XC 61 ; WX 606 ; N equal ; B 51 114 555 396 ;
XC 62 ; WX 606 ; N greater ; B 48 -15 557 519 ;
XC 63 ; WX 444 ; N question ; B 44 -12 412 687 ;
XC 64 ; WX 747 ; N at ; B 42 -12 704 681 ;
XC 65 ; WX 778 ; N A ; B 24 -5 757 686 ;
XC 66 ; WX 667 ; N B ; B 37 -5 611 683 ;
XC 67 ; WX 722 ; N C ; B 50 -17 698 695 ;
XC 68 ; WX 833 ; N D ; B 29 0 782 683 ;
XC 69 ; WX 611 ; N E ; B 29 -5 568 683 ;
XC 70 ; WX 556 ; N F ; B 26 -5 538 683 ;
XC 71 ; WX 833 ; N G ; B 57 -17 786 695 ;
XC 72 ; WX 833 ; N H ; B 33 -5 809 683 ;
XC 73 ; WX 389 ; N I ; B 41 -5 352 683 ;
XC 74 ; WX 389 ; N J ; B -5 -213 356 683 ;
XC 75 ; WX 778 ; N K ; B 40 -5 763 683 ;
XC 76 ; WX 611 ; N L ; B 39 -5 577 683 ;
XC 77 ; WX 1000 ; N M ; B 34 -10 970 683 ;
XC 78 ; WX 833 ; N N ; B 41 -16 804 683 ;
XC 79 ; WX 833 ; N O ; B 49 -17 791 695 ;
XC 80 ; WX 611 ; N P ; B 31 -5 586 678 ;
XC 81 ; WX 833 ; N Q ; B 46 -188 788 695 ;
XC 82 ; WX 722 ; N R ; B 39 -5 708 683 ;
XC 83 ; WX 611 ; N S ; B 57 -17 559 695 ;
XC 84 ; WX 667 ; N T ; B 25 -5 653 683 ;
XC 85 ; WX 778 ; N U ; B 26 -17 760 683 ;
XC 86 ; WX 778 ; N V ; B 20 -3 763 683 ;
XC 87 ; WX 1000 ; N W ; B 17 -3 988 686 ;
XC 88 ; WX 667 ; N X ; B 17 0 650 695 ;
XC 89 ; WX 667 ; N Y ; B 15 -5 660 695 ;
XC 90 ; WX 667 ; N Z ; B 24 -5 627 683 ;
XC 91 ; WX 333 ; N bracketleft ; B 67 -104 301 720 ;
XC 92 ; WX 606 ; N backslash ; B 77 0 529 723 ;
XC 93 ; WX 333 ; N bracketright ; B 32 -104 266 720 ;
XC 94 ; WX 606 ; N asciicircum ; B 52 275 554 678 ;
XC 95 ; WX 500 ; N underscore ; B 0 -148 500 -72 ;
XC 96 ; WX 278 ; N quoteleft ; B 29 405 250 695 ;
XC 97 ; WX 500 ; N a ; B 42 -15 480 471 ;
XC 98 ; WX 611 ; N b ; B 17 -17 560 719 ;
XC 99 ; WX 444 ; N c ; B 44 -17 421 471 ;
XC 100 ; WX 611 ; N d ; B 52 -17 575 719 ;
XC 101 ; WX 500 ; N e ; B 45 -17 465 471 ;
XC 102 ; WX 389 ; N f ; B 34 -5 381 725 ; L i fi ; L l fl ;
XC 103 ; WX 556 ; N g ; B 26 -266 535 471 ;
XC 104 ; WX 611 ; N h ; B 18 -5 586 720 ;
XC 105 ; WX 333 ; N i ; B 36 -5 312 706 ;
XC 106 ; WX 333 ; N j ; B 17 -265 250 705 ;
XC 107 ; WX 611 ; N k ; B 28 -5 601 720 ;
XC 108 ; WX 333 ; N l ; B 32 -5 307 720 ;
XC 109 ; WX 889 ; N m ; B 28 -5 868 471 ;
XC 110 ; WX 611 ; N n ; B 29 -5 592 471 ;
XC 111 ; WX 556 ; N o ; B 41 -17 518 471 ;
XC 112 ; WX 611 ; N p ; B 28 -258 565 471 ;
XC 113 ; WX 611 ; N q ; B 52 -258 591 471 ;
XC 114 ; WX 389 ; N r ; B 18 -5 392 471 ;
XC 115 ; WX 444 ; N s ; B 45 -17 411 471 ;
XC 116 ; WX 333 ; N t ; B 22 -17 324 632 ;
XC 117 ; WX 611 ; N u ; B 25 -17 585 471 ;
XC 118 ; WX 556 ; N v ; B 12 -3 546 459 ;
XC 119 ; WX 833 ; N w ; B 15 -3 822 472 ;
XC 120 ; WX 500 ; N x ; B 20 0 483 471 ;
XC 121 ; WX 556 ; N y ; B 10 -263 546 459 ;
XC 122 ; WX 500 ; N z ; B 16 0 464 459 ;
XC 123 ; WX 310 ; N braceleft ; B 5 -116 288 725 ;
XC 124 ; WX 606 ; N bar ; B 265 0 340 720 ;
XC 125 ; WX 310 ; N braceright ; B 12 -116 295 725 ;
XC 126 ; WX 606 ; N asciitilde ; B 51 155 555 342 ;
XC 161 ; WX 278 ; N exclamdown ; B 60 -230 216 471 ;
XC 162 ; WX 500 ; N cent ; B 73 -106 450 554 ;
XC 163 ; WX 500 ; N sterling ; B 17 -19 480 676 ;
XC 164 ; WX 167 ; N fraction ; B -156 0 307 623 ;
XC 165 ; WX 500 ; N yen ; B 5 -3 495 670 ;
XC 166 ; WX 500 ; N florin ; B 29 -246 478 697 ;
XC 167 ; WX 500 ; N section ; B 30 -217 471 695 ;
XC 168 ; WX 500 ; N currency ; B 16 104 483 568 ;
XC 169 ; WX 227 ; N quotesingle ; B 45 376 181 695 ;
XC 170 ; WX 500 ; N quotedblleft ; B 41 403 472 693 ;
XC 171 ; WX 500 ; N guillemotleft ; B 36 44 463 438 ;
XC 172 ; WX 389 ; N guilsinglleft ; B 83 44 308 438 ;
XC 173 ; WX 389 ; N guilsinglright ; B 81 44 306 438 ;
XC 174 ; WX 611 ; N fi ; B 22 -5 601 722 ;
XC 175 ; WX 611 ; N fl ; B 27 -5 599 722 ;
XC 177 ; WX 500 ; N endash ; B 0 208 500 291 ;
XC 178 ; WX 500 ; N dagger ; B 29 -6 473 682 ;
XC 179 ; WX 500 ; N daggerdbl ; B 34 -244 470 683 ;
XC 180 ; WX 250 ; N periodcentered ; B 46 180 202 336 ;
XC 182 ; WX 641 ; N paragraph ; B 19 -161 599 683 ;
XC 183 ; WX 606 ; N bullet ; B 160 216 446 502 ;
XC 184 ; WX 333 ; N quotesinglbase ; B 55 -160 275 130 ;
XC 185 ; WX 500 ; N quotedblbase ; B 30 -160 462 130 ;
XC 186 ; WX 500 ; N quotedblright ; B 31 405 462 695 ;
XC 187 ; WX 500 ; N guillemotright ; B 37 44 464 438 ;
XC 188 ; WX 1000 ; N ellipsis ; B 89 -12 911 144 ;
XC 189 ; WX 1000 ; N perthousand ; B 9 -17 985 678 ;
XC 191 ; WX 444 ; N questiondown ; B 32 -230 402 471 ;
XC 193 ; WX 333 ; N grave ; B 28 534 266 719 ;
XC 194 ; WX 333 ; N acute ; B 87 534 325 719 ;
XC 195 ; WX 333 ; N circumflex ; B -1 534 336 709 ;
XC 196 ; WX 333 ; N tilde ; B -15 552 350 678 ;
XC 197 ; WX 333 ; N macron ; B 1 571 332 642 ;
XC 198 ; WX 333 ; N breve ; B 15 534 318 697 ;
XC 199 ; WX 333 ; N dotaccent ; B 107 544 241 678 ;
XC 200 ; WX 333 ; N dieresis ; B -7 544 341 678 ;
XC 202 ; WX 333 ; N ring ; B 59 527 274 742 ;
XC 203 ; WX 333 ; N cedilla ; B 100 -218 327 0 ;
XC 205 ; WX 333 ; N hungarumlaut ; B -25 534 421 719 ;
XC 206 ; WX 333 ; N ogonek ; B 82 -228 297 0 ;
XC 207 ; WX 333 ; N caron ; B -1 534 336 709 ;
XC 208 ; WX 1000 ; N emdash ; B 0 208 1000 291 ;
XC 225 ; WX 1000 ; N AE ; B 12 -5 953 683 ;
XC 227 ; WX 438 ; N ordfeminine ; B 68 294 370 678 ;
XC 232 ; WX 611 ; N Lslash ; B 24 -5 577 683 ;
XC 233 ; WX 833 ; N Oslash ; B 32 -20 808 698 ;
XC 234 ; WX 1000 ; N OE ; B 43 -17 984 695 ;
XC 235 ; WX 488 ; N ordmasculine ; B 93 294 395 678 ;
XC 241 ; WX 778 ; N ae ; B 46 -17 735 471 ;
XC 245 ; WX 333 ; N dotlessi ; B 36 -5 312 471 ;
XC 248 ; WX 333 ; N lslash ; B 2 -5 336 720 ;
XC 249 ; WX 556 ; N oslash ; B 23 -18 534 471 ;
XC 250 ; WX 833 ; N oe ; B 43 -17 798 471 ;
XC 251 ; WX 611 ; N germandbls ; B 34 -17 565 720 ;
XC -1 ; WX 778 ; N Aacute ; B 24 -5 757 943 ;
XC -1 ; WX 778 ; N Acircumflex ; B 24 -5 757 933 ;
XC -1 ; WX 778 ; N Adieresis ; B 24 -5 757 902 ;
XC -1 ; WX 778 ; N Agrave ; B 24 -5 757 943 ;
XC -1 ; WX 778 ; N Aring ; B 24 -5 757 966 ;
XC -1 ; WX 778 ; N Atilde ; B 24 -5 757 902 ;
XC -1 ; WX 722 ; N Ccedilla ; B 50 -218 698 695 ;
XC -1 ; WX 611 ; N Eacute ; B 29 -5 568 943 ;
XC -1 ; WX 611 ; N Ecircumflex ; B 29 -5 568 933 ;
XC -1 ; WX 611 ; N Edieresis ; B 29 -5 568 902 ;
XC -1 ; WX 611 ; N Egrave ; B 29 -5 568 943 ;
XC -1 ; WX 833 ; N Eth ; B 28 0 782 683 ;
XC -1 ; WX 389 ; N Iacute ; B 41 -5 353 943 ;
XC -1 ; WX 389 ; N Icircumflex ; B 27 -5 364 933 ;
XC -1 ; WX 389 ; N Idieresis ; B 21 -5 369 902 ;
XC -1 ; WX 389 ; N Igrave ; B 41 -5 352 943 ;
XC -1 ; WX 833 ; N Ntilde ; B 41 -16 804 902 ;
XC -1 ; WX 833 ; N Oacute ; B 49 -17 791 943 ;
XC -1 ; WX 833 ; N Ocircumflex ; B 49 -17 791 933 ;
XC -1 ; WX 833 ; N Odieresis ; B 49 -17 791 902 ;
XC -1 ; WX 833 ; N Ograve ; B 49 -17 791 943 ;
XC -1 ; WX 833 ; N Otilde ; B 49 -17 791 902 ;
XC -1 ; WX 611 ; N Scaron ; B 57 -17 559 933 ;
XC -1 ; WX 611 ; N Thorn ; B 31 -5 586 683 ;
XC -1 ; WX 778 ; N Uacute ; B 26 -17 760 943 ;
XC -1 ; WX 778 ; N Ucircumflex ; B 26 -17 760 933 ;
XC -1 ; WX 778 ; N Udieresis ; B 26 -17 760 902 ;
XC -1 ; WX 778 ; N Ugrave ; B 26 -17 760 943 ;
XC -1 ; WX 667 ; N Yacute ; B 15 -5 660 943 ;
XC -1 ; WX 667 ; N Ydieresis ; B 15 -5 660 902 ;
XC -1 ; WX 667 ; N Zcaron ; B 24 -5 627 933 ;
XC -1 ; WX 500 ; N aacute ; B 42 -15 480 719 ;
XC -1 ; WX 500 ; N acircumflex ; B 42 -15 480 709 ;
XC -1 ; WX 500 ; N adieresis ; B 42 -15 480 678 ;
XC -1 ; WX 500 ; N agrave ; B 42 -15 480 719 ;
XC -1 ; WX 500 ; N aring ; B 42 -15 480 742 ;
XC -1 ; WX 500 ; N atilde ; B 42 -15 480 678 ;
XC -1 ; WX 606 ; N brokenbar ; B 265 0 340 720 ;
XC -1 ; WX 444 ; N ccedilla ; B 44 -218 421 471 ;
XC -1 ; WX 747 ; N copyright ; B 26 -17 720 695 ;
XC -1 ; WX 400 ; N degree ; B 50 360 350 660 ;
XC -1 ; WX 606 ; N divide ; B 51 0 555 508 ;
XC -1 ; WX 500 ; N eacute ; B 45 -17 465 719 ;
XC -1 ; WX 500 ; N ecircumflex ; B 45 -17 465 709 ;
XC -1 ; WX 500 ; N edieresis ; B 45 -17 465 678 ;
XC -1 ; WX 500 ; N egrave ; B 45 -17 465 719 ;
XC -1 ; WX 556 ; N eth ; B 26 -17 518 732 ;
XC -1 ; WX 333 ; N iacute ; B 36 -5 325 719 ;
XC -1 ; WX 333 ; N icircumflex ; B -1 -5 336 709 ;
XC -1 ; WX 333 ; N idieresis ; B -7 -5 341 678 ;
XC -1 ; WX 333 ; N igrave ; B 28 -5 312 719 ;
XC -1 ; WX 606 ; N logicalnot ; B 51 114 555 396 ;
XC -1 ; WX 606 ; N minus ; B 51 212 555 298 ;
XC -1 ; WX 611 ; N mu ; B 25 -225 585 471 ;
XC -1 ; WX 606 ; N multiply ; B 73 21 535 483 ;
XC -1 ; WX 611 ; N ntilde ; B 29 -5 592 678 ;
XC -1 ; WX 556 ; N oacute ; B 41 -17 518 719 ;
XC -1 ; WX 556 ; N ocircumflex ; B 41 -17 518 709 ;
XC -1 ; WX 556 ; N odieresis ; B 41 -17 518 678 ;
XC -1 ; WX 556 ; N ograve ; B 41 -17 518 719 ;
XC -1 ; WX 750 ; N onehalf ; B 4 0 746 623 ;
XC -1 ; WX 750 ; N onequarter ; B 15 -2 736 623 ;
XC -1 ; WX 300 ; N onesuperior ; B 49 255 330 660 ;
XC -1 ; WX 556 ; N otilde ; B 41 -17 518 678 ;
XC -1 ; WX 606 ; N plusminus ; B 51 0 555 505 ;
XC -1 ; WX 747 ; N registered ; B 28 -17 722 695 ;
XC -1 ; WX 444 ; N scaron ; B 45 -17 411 709 ;
XC -1 ; WX 611 ; N thorn ; B 28 -258 565 720 ;
XC -1 ; WX 750 ; N threequarters ; B 16 -2 734 623 ;
XC -1 ; WX 300 ; N threesuperior ; B 8 254 292 660 ;
XC -1 ; WX 998 ; N trademark ; B 38 274 961 678 ;
XC -1 ; WX 300 ; N twosuperior ; B 5 261 296 660 ;
XC -1 ; WX 611 ; N uacute ; B 25 -17 585 719 ;
XC -1 ; WX 611 ; N ucircumflex ; B 25 -17 585 709 ;
XC -1 ; WX 611 ; N udieresis ; B 25 -17 585 678 ;
XC -1 ; WX 611 ; N ugrave ; B 25 -17 585 719 ;
XC -1 ; WX 556 ; N yacute ; B 10 -263 546 719 ;
XC -1 ; WX 556 ; N ydieresis ; B 10 -263 546 678 ;
XC -1 ; WX 500 ; N zcaron ; B 16 0 464 709 ;


XEndCharMetrics
XStartKernData
XStartKernPairs 101
X

XKPX A y -70
XKPX A w -70
XKPX A v -70
XKPX A space -18
XKPX A quoteright -92
XKPX A Y -111
XKPX A W -90
XKPX A V -129
XKPX A T -92


X
XKPX F period -111
XKPX F comma -111

XKPX F A -55
X
XKPX L y -74
XKPX L space -18


XKPX L quoteright -74
XKPX L Y -92

XKPX L W -92


XKPX L V -92
XKPX L T -74
X

XKPX P period -129
XKPX P comma -129
XKPX P A -74
X

XKPX R y -30
XKPX R Y -55
XKPX R W -37
XKPX R V -74
XKPX R T -55


X
XKPX T y -90
XKPX T w -90

XKPX T u -129
XKPX T semicolon -74
XKPX T s -111
XKPX T r -111
XKPX T period -92
XKPX T o -111
XKPX T i -55


XKPX T hyphen -92
XKPX T e -111

XKPX T comma -92
XKPX T colon -74

XKPX T c -129
XKPX T a -111
XKPX T A -92
X
XKPX V y -90
XKPX V u -92
XKPX V semicolon -74
XKPX V r -111


XKPX V period -129
XKPX V o -111
XKPX V i -55

XKPX V hyphen -92
XKPX V e -111
XKPX V comma -129
XKPX V colon -74
XKPX V a -111
XKPX V A -129
X

XKPX W y -74
XKPX W u -74

XKPX W semicolon -37
XKPX W r -74
XKPX W period -37
XKPX W o -74


XKPX W i -37
XKPX W hyphen -37

XKPX W e -74


XKPX W comma -92
XKPX W colon -37

XKPX W a -74
XKPX W A -90
X
XKPX Y v -74
XKPX Y u -74


XKPX Y semicolon -55
XKPX Y q -92

XKPX Y period -74
XKPX Y p -74
XKPX Y o -74
XKPX Y i -55
XKPX Y hyphen -74
XKPX Y e -74
XKPX Y comma -74
XKPX Y colon -55
XKPX Y a -74


XKPX Y A -55
X

XKPX f quoteright 37


XKPX f f -18
X
XKPX one one -37
X

XKPX quoteleft quoteleft -55


X
XKPX quoteright t -18
XKPX quoteright space -55

XKPX quoteright s -55
XKPX quoteright quoteright -55


X
XKPX r quoteright 55

XKPX r period -55
XKPX r hyphen -18
XKPX r comma -55


X
XKPX v period -111
XKPX v comma -111
X
XKPX w period -92
XKPX w comma -92
X

XKPX y period -92
XKPX y comma -92
XEndKernPairs
XEndKernData
XStartComposites 58
XCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 167 224 ;


XCC zcaron 2 ; PCC z 0 0 ; PCC caron 83 0 ;

XCC Scaron 2 ; PCC S 0 0 ; PCC caron 139 224 ;


XCC scaron 2 ; PCC s 0 0 ; PCC caron 55 0 ;

XCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 194 0 ;


XCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 55 0 ;

XCC Yacute 2 ; PCC Y 0 0 ; PCC acute 167 224 ;


XCC yacute 2 ; PCC y 0 0 ; PCC acute 111 0 ;

XCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 167 224 ;


XCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 111 0 ;

XCC Uacute 2 ; PCC U 0 0 ; PCC acute 222 224 ;
XCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 222 224 ;
XCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 222 224 ;
XCC Ugrave 2 ; PCC U 0 0 ; PCC grave 222 224 ;
XCC uacute 2 ; PCC u 0 0 ; PCC acute 139 0 ;
XCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 139 0 ;
XCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 139 0 ;
XCC ugrave 2 ; PCC u 0 0 ; PCC grave 139 0 ;
XCC Iacute 2 ; PCC I 0 0 ; PCC acute 28 224 ;
XCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex 28 224 ;
XCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis 28 224 ;
XCC Igrave 2 ; PCC I 0 0 ; PCC grave 28 224 ;
XCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute 0 0 ;
XCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex 0 0 ;
XCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis 0 0 ;
XCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave 0 0 ;
XCC Eacute 2 ; PCC E 0 0 ; PCC acute 139 224 ;
XCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 139 224 ;
XCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 139 224 ;
XCC Egrave 2 ; PCC E 0 0 ; PCC grave 139 224 ;
XCC eacute 2 ; PCC e 0 0 ; PCC acute 83 0 ;


XCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 83 0 ;
XCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 83 0 ;
XCC egrave 2 ; PCC e 0 0 ; PCC grave 83 0 ;

XCC Aacute 2 ; PCC A 0 0 ; PCC acute 222 224 ;
XCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 222 224 ;
XCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 222 224 ;
XCC Agrave 2 ; PCC A 0 0 ; PCC grave 222 224 ;
XCC aacute 2 ; PCC a 0 0 ; PCC acute 83 0 ;
XCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 83 0 ;
XCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 83 0 ;


XCC agrave 2 ; PCC a 0 0 ; PCC grave 83 0 ;

XCC Oacute 2 ; PCC O 0 0 ; PCC acute 250 224 ;
XCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 250 224 ;
XCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 250 224 ;
XCC Ograve 2 ; PCC O 0 0 ; PCC grave 250 224 ;
XCC oacute 2 ; PCC o 0 0 ; PCC acute 111 0 ;
XCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 111 0 ;
XCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 111 0 ;
XCC ograve 2 ; PCC o 0 0 ; PCC grave 111 0 ;
XCC Atilde 2 ; PCC A 0 0 ; PCC tilde 222 224 ;
XCC atilde 2 ; PCC a 0 0 ; PCC tilde 83 0 ;
XCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 250 224 ;
XCC ntilde 2 ; PCC n 0 0 ; PCC tilde 139 0 ;
XCC Otilde 2 ; PCC O 0 0 ; PCC tilde 250 224 ;
XCC otilde 2 ; PCC o 0 0 ; PCC tilde 111 0 ;
XCC Aring 2 ; PCC A 0 0 ; PCC ring 222 224 ;
XCC aring 2 ; PCC a 0 0 ; PCC ring 83 0 ;
XEndComposites
XEndFontMetrics
END_OF_FILE
if test 15541 -ne `wc -c <'lout/font0/PalatBol.AFM'`; then
echo shar: \"'lout/font0/PalatBol.AFM'\" unpacked with wrong size!
fi
# end of 'lout/font0/PalatBol.AFM'
fi
if test -f 'lout/font0/PalatIta.AFM' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/font0/PalatIta.AFM'\"
else
echo shar: Extracting \"'lout/font0/PalatIta.AFM'\" \(15549 characters\)
sed "s/^X//" >'lout/font0/PalatIta.AFM' <<'END_OF_FILE'


XStartFontMetrics 2.0
XComment Copyright (c) 1984 Adobe Systems Incorporated. All Rights Reserved.

XComment Creation Date:Thu Mar 12 16:20:11 PST 1987
XFontName Palatino-Italic
XEncodingScheme AdobeStandardEncoding
XFullName Palatino Italic
XFamilyName Palatino
XWeight Medium
XItalicAngle -10.0
XIsFixedPitch false
XUnderlinePosition -138
XUnderlineThickness 50
XVersion 001.002


XNotice Palatino is a trademark of Allied Corporation.

XFontBBox -166 -277 1020 946
XCapHeight 693
XXHeight 480
XDescender -276
XAscender 733
XStartCharMetrics 228
XC 32 ; WX 250 ; N space ; B 0 0 0 0 ;
XC 33 ; WX 333 ; N exclam ; B 76 -5 292 733 ;
XC 34 ; WX 500 ; N quotedbl ; B 170 475 465 706 ;
XC 35 ; WX 500 ; N numbersign ; B 4 0 495 693 ;
XC 36 ; WX 500 ; N dollar ; B 15 -113 453 737 ;
XC 37 ; WX 889 ; N percent ; B 79 -16 761 693 ;
XC 38 ; WX 778 ; N ampersand ; B 47 -18 766 693 ;
XC 39 ; WX 278 ; N quoteright ; B 59 488 244 733 ;
XC 40 ; WX 333 ; N parenleft ; B 54 -103 330 733 ;
XC 41 ; WX 333 ; N parenright ; B 6 -101 282 733 ;
XC 42 ; WX 389 ; N asterisk ; B 76 367 400 705 ;
XC 43 ; WX 606 ; N plus ; B 51 2 555 504 ;
XC 44 ; WX 250 ; N comma ; B 28 -143 223 123 ;
XC 45 ; WX 333 ; N hyphen ; B 19 223 304 281 ;
XC 46 ; WX 250 ; N period ; B 73 -5 178 112 ;
XC 47 ; WX 296 ; N slash ; B 1 -181 302 733 ;
XC 48 ; WX 500 ; N zero ; B 24 -11 468 699 ;
XC 49 ; WX 500 ; N one ; B 42 -5 387 699 ;
XC 50 ; WX 500 ; N two ; B 0 -5 425 699 ;
XC 51 ; WX 500 ; N three ; B 0 -11 425 699 ;
XC 52 ; WX 500 ; N four ; B -1 -5 466 699 ;
XC 53 ; WX 500 ; N five ; B 2 -11 479 693 ;
XC 54 ; WX 500 ; N six ; B 37 -11 457 702 ;
XC 55 ; WX 500 ; N seven ; B 41 -5 490 693 ;
XC 56 ; WX 500 ; N eight ; B 24 -11 457 699 ;
XC 57 ; WX 500 ; N nine ; B 20 -11 456 699 ;
XC 58 ; WX 250 ; N colon ; B 44 -3 207 460 ;
XC 59 ; WX 250 ; N semicolon ; B 11 -143 239 459 ;
XC 60 ; WX 606 ; N less ; B 57 -6 558 516 ;
XC 61 ; WX 606 ; N equal ; B 51 128 555 378 ;
XC 62 ; WX 606 ; N greater ; B 48 -6 549 516 ;
XC 63 ; WX 500 ; N question ; B 107 -6 420 705 ;
XC 64 ; WX 747 ; N at ; B 27 -18 718 705 ;
XC 65 ; WX 722 ; N A ; B -4 -5 692 705 ;
XC 66 ; WX 611 ; N B ; B 31 -5 563 693 ;
XC 67 ; WX 667 ; N C ; B 45 -18 651 705 ;
XC 68 ; WX 778 ; N D ; B 31 -5 744 693 ;
XC 69 ; WX 611 ; N E ; B 36 -5 572 693 ;
XC 70 ; WX 556 ; N F ; B -10 -5 553 693 ;
XC 71 ; WX 722 ; N G ; B 50 -18 694 705 ;
XC 72 ; WX 778 ; N H ; B -14 -5 810 693 ;
XC 73 ; WX 333 ; N I ; B -10 -5 367 693 ;
XC 74 ; WX 333 ; N J ; B -35 -208 363 693 ;
XC 75 ; WX 667 ; N K ; B 9 -5 683 693 ;
XC 76 ; WX 556 ; N L ; B 20 -5 522 693 ;
XC 77 ; WX 944 ; N M ; B -21 -19 940 693 ;
XC 78 ; WX 778 ; N N ; B 2 -11 814 693 ;
XC 79 ; WX 778 ; N O ; B 56 -18 751 705 ;
XC 80 ; WX 611 ; N P ; B 3 -5 594 693 ;
XC 81 ; WX 778 ; N Q ; B 56 -201 751 705 ;
XC 82 ; WX 667 ; N R ; B 9 -5 639 693 ;
XC 83 ; WX 556 ; N S ; B 49 -18 513 705 ;
XC 84 ; WX 611 ; N T ; B 53 -5 637 693 ;
XC 85 ; WX 778 ; N U ; B 84 -18 814 693 ;
XC 86 ; WX 722 ; N V ; B 63 -8 742 693 ;
XC 87 ; WX 944 ; N W ; B 111 -8 1020 700 ;
XC 88 ; WX 722 ; N X ; B 20 -5 734 693 ;
XC 89 ; WX 667 ; N Y ; B 52 -5 675 705 ;
XC 90 ; WX 667 ; N Z ; B 20 -5 637 693 ;
XC 91 ; WX 333 ; N bracketleft ; B 17 -101 326 733 ;
XC 92 ; WX 606 ; N backslash ; B 81 0 525 693 ;
XC 93 ; WX 333 ; N bracketright ; B 7 -102 317 733 ;
XC 94 ; WX 606 ; N asciicircum ; B 51 287 554 693 ;
XC 95 ; WX 500 ; N underscore ; B 0 -163 500 -113 ;
XC 96 ; WX 278 ; N quoteleft ; B 94 488 274 733 ;
XC 97 ; WX 444 ; N a ; B 1 -11 402 481 ;
XC 98 ; WX 463 ; N b ; B 37 -11 433 733 ;
XC 99 ; WX 407 ; N c ; B 25 -11 387 480 ;
XC 100 ; WX 500 ; N d ; B 14 -11 476 733 ;
XC 101 ; WX 389 ; N e ; B 15 -11 374 480 ;
XC 102 ; WX 278 ; N f ; B -71 -276 360 729 ; L i fi ; L l fl ;
XC 103 ; WX 500 ; N g ; B -27 -276 490 480 ;
XC 104 ; WX 500 ; N h ; B 10 -11 465 733 ;
XC 105 ; WX 278 ; N i ; B 35 -10 264 712 ;
XC 106 ; WX 278 ; N j ; B -67 -276 269 712 ;
XC 107 ; WX 444 ; N k ; B 9 -11 449 733 ;
XC 108 ; WX 278 ; N l ; B 38 -10 251 733 ;
XC 109 ; WX 778 ; N m ; B 20 -11 735 483 ;
XC 110 ; WX 556 ; N n ; B 28 -11 508 483 ;
XC 111 ; WX 444 ; N o ; B 17 -11 411 480 ;
XC 112 ; WX 500 ; N p ; B 3 -276 475 483 ;
XC 113 ; WX 463 ; N q ; B 17 -276 425 480 ;
XC 114 ; WX 389 ; N r ; B 26 -11 384 483 ;
XC 115 ; WX 389 ; N s ; B 9 -11 345 480 ;
XC 116 ; WX 333 ; N t ; B 41 -10 310 646 ;
XC 117 ; WX 556 ; N u ; B 32 -11 507 483 ;
XC 118 ; WX 500 ; N v ; B 16 -11 477 480 ;
XC 119 ; WX 722 ; N w ; B 17 -11 699 480 ;
XC 120 ; WX 500 ; N x ; B 9 -11 484 480 ;
XC 121 ; WX 500 ; N y ; B -8 -276 490 484 ;
XC 122 ; WX 444 ; N z ; B -1 -5 416 480 ;
XC 123 ; WX 333 ; N braceleft ; B 15 -116 319 713 ;
XC 124 ; WX 606 ; N bar ; B 270 0 336 733 ;
XC 125 ; WX 333 ; N braceright ; B 15 -116 317 713 ;
XC 126 ; WX 606 ; N asciitilde ; B 51 168 555 339 ;
XC 161 ; WX 333 ; N exclamdown ; B 35 -276 251 467 ;
XC 162 ; WX 500 ; N cent ; B 76 -96 440 551 ;
XC 163 ; WX 500 ; N sterling ; B 7 -18 481 705 ;
XC 164 ; WX 167 ; N fraction ; B -166 0 333 693 ;
XC 165 ; WX 500 ; N yen ; B 0 -5 561 699 ;
XC 166 ; WX 500 ; N florin ; B 13 -276 486 705 ;
XC 167 ; WX 500 ; N section ; B 14 -221 463 705 ;
XC 168 ; WX 500 ; N currency ; B 17 116 483 577 ;
XC 169 ; WX 333 ; N quotesingle ; B 160 479 308 704 ;
XC 170 ; WX 500 ; N quotedblleft ; B 98 487 475 733 ;
XC 171 ; WX 500 ; N guillemotleft ; B 54 68 438 438 ;
XC 172 ; WX 333 ; N guilsinglleft ; B 57 68 270 438 ;
XC 173 ; WX 333 ; N guilsinglright ; B 58 68 271 438 ;
XC 174 ; WX 528 ; N fi ; B -71 -276 511 733 ;
XC 175 ; WX 545 ; N fl ; B -71 -277 516 733 ;
XC 177 ; WX 500 ; N endash ; B -8 228 509 278 ;
XC 178 ; WX 500 ; N dagger ; B 38 0 459 693 ;
XC 179 ; WX 500 ; N daggerdbl ; B 9 -162 494 693 ;
XC 180 ; WX 250 ; N periodcentered ; B 73 195 178 312 ;
XC 182 ; WX 500 ; N paragraph ; B 36 -226 611 690 ;
XC 183 ; WX 500 ; N bullet ; B 126 177 480 530 ;
XC 184 ; WX 278 ; N quotesinglbase ; B 47 -122 231 120 ;
XC 185 ; WX 500 ; N quotedblbase ; B 69 -122 444 120 ;
XC 186 ; WX 500 ; N quotedblright ; B 72 488 446 733 ;
XC 187 ; WX 500 ; N guillemotright ; B 54 68 441 438 ;
XC 188 ; WX 1000 ; N ellipsis ; B 114 -4 885 113 ;
XC 189 ; WX 1000 ; N perthousand ; B 6 -41 992 714 ;
XC 191 ; WX 500 ; N questiondown ; B 73 -276 387 437 ;
XC 193 ; WX 333 ; N grave ; B 116 531 306 704 ;
XC 194 ; WX 333 ; N acute ; B 175 530 398 700 ;
XC 195 ; WX 333 ; N circumflex ; B 80 530 374 699 ;
XC 196 ; WX 333 ; N tilde ; B 93 558 420 661 ;
XC 197 ; WX 333 ; N macron ; B 94 571 406 622 ;
XC 198 ; WX 333 ; N breve ; B 112 564 413 723 ;
XC 199 ; WX 333 ; N dotaccent ; B 169 551 278 659 ;
XC 200 ; WX 333 ; N dieresis ; B 102 546 402 645 ;
XC 202 ; WX 333 ; N ring ; B 166 534 366 733 ;
XC 203 ; WX 333 ; N cedilla ; B 51 -207 262 9 ;
XC 205 ; WX 333 ; N hungarumlaut ; B 183 546 463 741 ;
XC 206 ; WX 333 ; N ogonek ; B 138 -207 296 -18 ;
XC 207 ; WX 333 ; N caron ; B 116 564 421 733 ;
XC 208 ; WX 1000 ; N emdash ; B -15 228 1016 278 ;
XC 225 ; WX 941 ; N AE ; B -4 -5 902 693 ;
XC 227 ; WX 333 ; N ordfeminine ; B 81 301 380 705 ;
XC 232 ; WX 556 ; N Lslash ; B 20 -5 522 693 ;
XC 233 ; WX 778 ; N Oslash ; B 35 -39 765 721 ;
XC 234 ; WX 1028 ; N OE ; B 56 -18 989 705 ;
XC 235 ; WX 333 ; N ordmasculine ; B 83 301 362 705 ;
XC 241 ; WX 638 ; N ae ; B 1 -11 623 480 ;
XC 245 ; WX 278 ; N dotlessi ; B 35 -10 237 483 ;
XC 248 ; WX 278 ; N lslash ; B 7 -10 291 733 ;
XC 249 ; WX 444 ; N oslash ; B -18 -29 457 506 ;
XC 250 ; WX 669 ; N oe ; B 17 -11 654 480 ;
XC 251 ; WX 500 ; N germandbls ; B -80 -274 480 733 ;
XC -1 ; WX 722 ; N Aacute ; B -4 -5 692 913 ;
XC -1 ; WX 722 ; N Acircumflex ; B -4 -5 692 912 ;
XC -1 ; WX 722 ; N Adieresis ; B -4 -5 692 858 ;
XC -1 ; WX 722 ; N Agrave ; B -4 -5 692 917 ;
XC -1 ; WX 722 ; N Aring ; B -4 -5 692 946 ;
XC -1 ; WX 722 ; N Atilde ; B -4 -5 692 874 ;
XC -1 ; WX 667 ; N Ccedilla ; B 45 -207 651 705 ;
XC -1 ; WX 611 ; N Eacute ; B 36 -5 572 913 ;
XC -1 ; WX 611 ; N Ecircumflex ; B 36 -5 572 912 ;
XC -1 ; WX 611 ; N Edieresis ; B 36 -5 572 858 ;
XC -1 ; WX 611 ; N Egrave ; B 36 -5 572 917 ;
XC -1 ; WX 778 ; N Eth ; B 29 -5 744 693 ;
XC -1 ; WX 333 ; N Iacute ; B -10 -5 398 913 ;
XC -1 ; WX 333 ; N Icircumflex ; B -10 -5 374 912 ;
XC -1 ; WX 333 ; N Idieresis ; B -10 -5 402 858 ;
XC -1 ; WX 333 ; N Igrave ; B -10 -5 367 917 ;
XC -1 ; WX 778 ; N Ntilde ; B 2 -11 814 874 ;
XC -1 ; WX 778 ; N Oacute ; B 56 -18 751 913 ;
XC -1 ; WX 778 ; N Ocircumflex ; B 56 -18 751 912 ;
XC -1 ; WX 778 ; N Odieresis ; B 56 -18 751 858 ;
XC -1 ; WX 778 ; N Ograve ; B 56 -18 751 917 ;
XC -1 ; WX 778 ; N Otilde ; B 56 -18 751 874 ;
XC -1 ; WX 556 ; N Scaron ; B 49 -18 533 946 ;
XC -1 ; WX 611 ; N Thorn ; B 3 -5 567 693 ;
XC -1 ; WX 778 ; N Uacute ; B 84 -18 814 913 ;
XC -1 ; WX 778 ; N Ucircumflex ; B 84 -18 814 912 ;
XC -1 ; WX 778 ; N Udieresis ; B 84 -18 814 858 ;
XC -1 ; WX 778 ; N Ugrave ; B 84 -18 814 917 ;
XC -1 ; WX 667 ; N Yacute ; B 52 -5 675 913 ;
XC -1 ; WX 667 ; N Ydieresis ; B 52 -5 675 858 ;
XC -1 ; WX 667 ; N Zcaron ; B 20 -5 637 946 ;
XC -1 ; WX 444 ; N aacute ; B 1 -11 454 700 ;
XC -1 ; WX 444 ; N acircumflex ; B 1 -11 430 699 ;
XC -1 ; WX 444 ; N adieresis ; B 1 -11 458 645 ;
XC -1 ; WX 444 ; N agrave ; B 1 -11 402 704 ;
XC -1 ; WX 444 ; N aring ; B 1 -11 422 733 ;
XC -1 ; WX 444 ; N atilde ; B 1 -11 476 661 ;
XC -1 ; WX 606 ; N brokenbar ; B 270 0 336 733 ;
XC -1 ; WX 407 ; N ccedilla ; B 25 -207 387 480 ;
XC -1 ; WX 747 ; N copyright ; B 12 -18 735 705 ;
XC -1 ; WX 400 ; N degree ; B 110 399 410 699 ;
XC -1 ; WX 606 ; N divide ; B 51 2 555 504 ;
XC -1 ; WX 389 ; N eacute ; B 15 -11 426 700 ;
XC -1 ; WX 389 ; N ecircumflex ; B 15 -11 402 699 ;
XC -1 ; WX 389 ; N edieresis ; B 15 -11 430 645 ;
XC -1 ; WX 389 ; N egrave ; B 15 -11 374 704 ;
XC -1 ; WX 444 ; N eth ; B 17 -11 436 735 ;
XC -1 ; WX 278 ; N iacute ; B 35 -10 371 700 ;
XC -1 ; WX 278 ; N icircumflex ; B 35 -10 347 699 ;
XC -1 ; WX 278 ; N idieresis ; B 35 -10 375 645 ;
XC -1 ; WX 278 ; N igrave ; B 35 -10 279 704 ;
XC -1 ; WX 606 ; N logicalnot ; B 51 118 555 378 ;
XC -1 ; WX 606 ; N minus ; B 51 225 555 281 ;
XC -1 ; WX 556 ; N mu ; B 15 -226 507 483 ;
XC -1 ; WX 606 ; N multiply ; B 82 33 525 475 ;
XC -1 ; WX 556 ; N ntilde ; B 28 -11 532 661 ;
XC -1 ; WX 444 ; N oacute ; B 17 -11 454 700 ;
XC -1 ; WX 444 ; N ocircumflex ; B 17 -11 430 699 ;
XC -1 ; WX 444 ; N odieresis ; B 17 -11 458 645 ;
XC -1 ; WX 444 ; N ograve ; B 17 -11 411 704 ;
XC -1 ; WX 750 ; N onehalf ; B 30 -3 720 693 ;
XC -1 ; WX 750 ; N onequarter ; B 36 -3 715 693 ;
XC -1 ; WX 300 ; N onesuperior ; B 82 277 314 699 ;
XC -1 ; WX 444 ; N otilde ; B 17 -11 476 661 ;
XC -1 ; WX 606 ; N plusminus ; B 51 0 555 504 ;
XC -1 ; WX 747 ; N registered ; B 12 -18 735 705 ;
XC -1 ; WX 389 ; N scaron ; B 9 -11 449 733 ;
XC -1 ; WX 500 ; N thorn ; B 3 -276 475 687 ;
XC -1 ; WX 750 ; N threequarters ; B 32 -3 719 693 ;
XC -1 ; WX 300 ; N threesuperior ; B 58 273 334 699 ;
XC -1 ; WX 1000 ; N trademark ; B 52 289 948 693 ;
XC -1 ; WX 300 ; N twosuperior ; B 50 277 326 699 ;
XC -1 ; WX 556 ; N uacute ; B 32 -11 510 700 ;
XC -1 ; WX 556 ; N ucircumflex ; B 32 -11 507 699 ;
XC -1 ; WX 556 ; N udieresis ; B 32 -11 514 645 ;
XC -1 ; WX 556 ; N ugrave ; B 32 -11 507 704 ;
XC -1 ; WX 500 ; N yacute ; B -8 -276 490 700 ;
XC -1 ; WX 500 ; N ydieresis ; B -8 -276 490 645 ;
XC -1 ; WX 444 ; N zcaron ; B -1 -5 477 733 ;
XEndCharMetrics
XStartKernData
XStartKernPairs 106


X
XKPX A y -55
XKPX A w -37

XKPX A v -37
XKPX A space -37


XKPX A quoteright -55
XKPX A Y -55

XKPX A W -55
XKPX A V -74


XKPX A T -55
X
XKPX F period -111
XKPX F comma -111

XKPX F A -111


X
XKPX L y -37

XKPX L space -18
XKPX L quoteright -37
XKPX L Y -74


XKPX L W -74
XKPX L V -74
XKPX L T -74
X
XKPX P period -129
XKPX P comma -129

XKPX P A -129


X
XKPX R y -37

XKPX R Y -55
XKPX R W -55

XKPX R V -74
XKPX R T -55
X
XKPX T y -92
XKPX T w -92
XKPX T u -111
XKPX T semicolon -74
XKPX T s -111
XKPX T r -111
XKPX T period -74
XKPX T o -111


XKPX T i -55
XKPX T hyphen -55

XKPX T e -111
XKPX T comma -74
XKPX T colon -74
XKPX T c -111
XKPX T a -111
XKPX T O -18
XKPX T A -92
X
XKPX V y -74
XKPX V u -74
XKPX V semicolon -37
XKPX V r -92
XKPX V period -129
XKPX V o -74
XKPX V i -74
XKPX V hyphen -55
XKPX V e -92
XKPX V comma -129
XKPX V colon -37
XKPX V a -74
XKPX V A -210


X
XKPX W y -20

XKPX W u -20
XKPX W semicolon -18
XKPX W r -20
XKPX W period -55
XKPX W o -20
XKPX W i -20
XKPX W hyphen -18
XKPX W e -20
XKPX W comma -55
XKPX W colon -18
XKPX W a -20


XKPX W A -92
X

XKPX Y v -74
XKPX Y u -92
XKPX Y semicolon -74
XKPX Y q -92
XKPX Y period -92
XKPX Y p -74
XKPX Y o -111
XKPX Y i -55
XKPX Y hyphen -74


XKPX Y e -111
XKPX Y comma -92

XKPX Y colon -74
XKPX Y a -92
XKPX Y A -92
X
XKPX f quoteright 55

X
XKPX one one -55
X

XKPX quoteleft quoteleft -74
X

XKPX quoteright t -37
XKPX quoteright space -55


XKPX quoteright s -55
XKPX quoteright quoteright -74
X
XKPX r quoteright 37

XKPX r q -18
XKPX r period -74
XKPX r o -18

XKPX r h -18
XKPX r g -18
XKPX r e -18

XKPX r comma -74
XKPX r c -18
X

XKPX v period -55
XKPX v comma -55
X

XKPX w period -55
XKPX w comma -55
X
XKPX y period -37
XKPX y comma -37

XEndKernPairs
XEndKernData
XStartComposites 58
XCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 167 213 ;


XCC zcaron 2 ; PCC z 0 0 ; PCC caron 55 0 ;

XCC Scaron 2 ; PCC S 0 0 ; PCC caron 111 213 ;


XCC scaron 2 ; PCC s 0 0 ; PCC caron 28 0 ;
XCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 167 0 ;

XCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 37 0 ;
XCC Yacute 2 ; PCC Y 0 0 ; PCC acute 167 213 ;


XCC yacute 2 ; PCC y 0 0 ; PCC acute 83 0 ;

XCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 167 213 ;


XCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 83 0 ;

XCC Uacute 2 ; PCC U 0 0 ; PCC acute 222 213 ;
XCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 222 213 ;
XCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 222 213 ;
XCC Ugrave 2 ; PCC U 0 0 ; PCC grave 222 213 ;
XCC uacute 2 ; PCC u 0 0 ; PCC acute 111 0 ;
XCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 111 0 ;
XCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 111 0 ;
XCC ugrave 2 ; PCC u 0 0 ; PCC grave 111 0 ;
XCC Iacute 2 ; PCC I 0 0 ; PCC acute 0 213 ;
XCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex 0 213 ;
XCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis 0 213 ;
XCC Igrave 2 ; PCC I 0 0 ; PCC grave 0 213 ;


XCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -27 0 ;
XCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -27 0 ;
XCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -27 0 ;
XCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -27 0 ;

XCC Eacute 2 ; PCC E 0 0 ; PCC acute 139 213 ;
XCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 139 213 ;
XCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 139 213 ;
XCC Egrave 2 ; PCC E 0 0 ; PCC grave 139 213 ;
XCC eacute 2 ; PCC e 0 0 ; PCC acute 28 0 ;
XCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 28 0 ;
XCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 28 0 ;
XCC egrave 2 ; PCC e 0 0 ; PCC grave 28 0 ;
XCC Aacute 2 ; PCC A 0 0 ; PCC acute 194 213 ;
XCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 194 213 ;
XCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 194 213 ;
XCC Agrave 2 ; PCC A 0 0 ; PCC grave 194 213 ;


XCC aacute 2 ; PCC a 0 0 ; PCC acute 55 0 ;
XCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 55 0 ;
XCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 55 0 ;
XCC agrave 2 ; PCC a 0 0 ; PCC grave 55 0 ;

XCC Oacute 2 ; PCC O 0 0 ; PCC acute 222 213 ;
XCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 222 213 ;
XCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 222 213 ;
XCC Ograve 2 ; PCC O 0 0 ; PCC grave 222 213 ;
XCC oacute 2 ; PCC o 0 0 ; PCC acute 55 0 ;
XCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 55 0 ;
XCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 55 0 ;
XCC ograve 2 ; PCC o 0 0 ; PCC grave 55 0 ;
XCC Atilde 2 ; PCC A 0 0 ; PCC tilde 194 213 ;


XCC atilde 2 ; PCC a 0 0 ; PCC tilde 55 0 ;

XCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 222 213 ;
XCC ntilde 2 ; PCC n 0 0 ; PCC tilde 111 0 ;
XCC Otilde 2 ; PCC O 0 0 ; PCC tilde 222 213 ;
XCC otilde 2 ; PCC o 0 0 ; PCC tilde 55 0 ;
XCC Aring 2 ; PCC A 0 0 ; PCC ring 194 213 ;


XCC aring 2 ; PCC a 0 0 ; PCC ring 55 0 ;
XEndComposites
XEndFontMetrics
END_OF_FILE

if test 15549 -ne `wc -c <'lout/font0/PalatIta.AFM'`; then
echo shar: \"'lout/font0/PalatIta.AFM'\" unpacked with wrong size!
fi
# end of 'lout/font0/PalatIta.AFM'
fi
echo shar: End of archive 17 \(of 30\).
cp /dev/null ark17isdone

Jeff Kingston

unread,
Jun 1, 1993, 11:02:17 PM6/1/93
to
Submitted-by: je...@joyce.cs.su.oz.au (Jeff Kingston)
Posting-number: Volume 37, Issue 116
Archive-name: lout/part18
Environment: UNIX

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: lout/doc/tr.fig/s4 lout/font0/CouriBol.AFM
# lout/font0/CouriBolObl.AFM lout/font0/HelveNarBol.AFM
# lout/font0/NewCenSchRom.AFM lout/font0/ZapfChaMedIta.AFM
# Wrapped by kent@sparky on Sun May 30 19:43:58 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 18 (of 30)."'
if test -f 'lout/doc/tr.fig/s4' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.fig/s4'\"
else
echo shar: Extracting \"'lout/doc/tr.fig/s4'\" \(1043 characters\)
sed "s/^X//" >'lout/doc/tr.fig/s4' <<'END_OF_FILE'
X@Section
X @Title { Colour }
X@Begin
X@PP
XAn arbitrary Lout object may be printed in colour, like this:
X@ID {
X@Code "red @Colour hello"
X||7ct
X@Fig {
Xred @Colour hello
X}
X}
X@Code "@Colour" may also be spelt {@Code "@Color"}. Of course, a colour
Xprinting device is needed to see the effect. The @Code "@Colour" symbol
Xis intended to provide a fixed palette of colours indicated by names,
Xincluding {@Code "white"}, {@Code "grey"}, {@Code "gray"}, {@Code "black"},
X{@Code "red"}, {@Code "green"}, and {@Code "blue"} at least.
X@PP
XAn unlimited range of colours can be obtained with the
X{@Code "@RGBColour"} (or {@Code "@RGBColor"}) symbol, which is given
Xthree numbers in the range 0 to 1 specifying the required intensity of
Xred, green and blue colour in that order. For example,
X@ID @Code "{1.0 0.0 0.0} @RGBColour hello"
Xis equivalent to {@Code "red @Colour hello"}. There is also
X{@Code "@HSBColour"} (or {@Code "@HSBColor"}) for specifying colour
Xusing the hue-saturation-brightness model (see [{@Ref adobe90}],
XSection 4.8).
X@End @Section
END_OF_FILE
if test 1043 -ne `wc -c <'lout/doc/tr.fig/s4'`; then
echo shar: \"'lout/doc/tr.fig/s4'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.fig/s4'
fi
if test -f 'lout/font0/CouriBol.AFM' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/font0/CouriBol.AFM'\"
else
echo shar: Extracting \"'lout/font0/CouriBol.AFM'\" \(15509 characters\)
sed "s/^X//" >'lout/font0/CouriBol.AFM' <<'END_OF_FILE'
XStartFontMetrics 2.0
XComment Copyright (c) 1985 Adobe Systems Incorporated. All rights reserved.
XComment Creation Date:Tue Dec 15 16:10:40 PST 1987
XFontName Courier-Bold
XEncodingScheme AdobeStandardEncoding
XFullName Courier Bold
XFamilyName Courier
XWeight Bold
XItalicAngle 0.0
XIsFixedPitch true
XUnderlinePosition -85
XUnderlineThickness 100
XVersion 001.005
XNotice Copyright (c) 1985 Adobe Systems Incorporated. All rights reserved.
XFontBBox -200 -451 800 900
XCapHeight 633
XXHeight 487
XDescender -257
XAscender 674
XStartCharMetrics 260
XC 32 ; WX 600 ; N space ; B 500 -100 700 100 ;
XC 33 ; WX 600 ; N exclam ; B 170 -65 430 689 ;
XC 34 ; WX 600 ; N quotedbl ; B 66 254 534 663 ;
XC 35 ; WX 600 ; N numbersign ; B 12 -142 588 725 ;
XC 36 ; WX 600 ; N dollar ; B 33 -173 567 735 ;
XC 37 ; WX 600 ; N percent ; B 7 -65 593 689 ;
XC 38 ; WX 600 ; N ampersand ; B 25 -65 558 600 ;
XC 39 ; WX 600 ; N quoteright ; B 75 244 400 674 ;
XC 40 ; WX 600 ; N parenleft ; B 214 -204 538 683 ;
XC 41 ; WX 600 ; N parenright ; B 67 -204 391 683 ;
XC 42 ; WX 600 ; N asterisk ; B 33 150 567 674 ;
XC 43 ; WX 600 ; N plus ; B -8 -48 608 610 ;
XC 44 ; WX 600 ; N comma ; B 75 -215 400 215 ;
XC 45 ; WX 600 ; N hyphen ; B -8 181 608 381 ;
XC 46 ; WX 600 ; N period ; B 190 -50 410 150 ;
XC 47 ; WX 600 ; N slash ; B 33 -163 567 746 ;
XC 48 ; WX 600 ; N zero ; B 33 -65 567 689 ;
XC 49 ; WX 600 ; N one ; B 33 -50 567 674 ;
XC 50 ; WX 600 ; N two ; B 4 -50 558 689 ;
XC 51 ; WX 600 ; N three ; B 16 -65 579 689 ;
XC 52 ; WX 600 ; N four ; B 25 -50 558 674 ;
XC 53 ; WX 600 ; N five ; B 16 -65 579 674 ;
XC 54 ; WX 600 ; N six ; B 56 -65 590 689 ;
XC 55 ; WX 600 ; N seven ; B 25 -50 558 674 ;
XC 56 ; WX 600 ; N eight ; B 33 -65 567 689 ;
XC 57 ; WX 600 ; N nine ; B 56 -65 590 689 ;
XC 58 ; WX 600 ; N colon ; B 190 -50 410 472 ;
XC 59 ; WX 600 ; N semicolon ; B 79 -176 410 472 ;
XC 60 ; WX 600 ; N less ; B -8 -48 608 610 ;
XC 61 ; WX 600 ; N equal ; B -29 88 629 474 ;
XC 62 ; WX 600 ; N greater ; B -8 -48 608 610 ;
XC 63 ; WX 600 ; N question ; B 54 -65 567 648 ;
XC 64 ; WX 600 ; N at ; B 26 -142 559 705 ;
XC 65 ; WX 600 ; N A ; B -71 -50 671 633 ;
XC 66 ; WX 600 ; N B ; B -37 -50 621 633 ;
XC 67 ; WX 600 ; N C ; B -17 -65 614 648 ;
XC 68 ; WX 600 ; N D ; B -37 -50 600 633 ;
XC 69 ; WX 600 ; N E ; B -37 -50 600 633 ;
XC 70 ; WX 600 ; N F ; B -37 -50 600 633 ;
XC 71 ; WX 600 ; N G ; B -17 -65 642 648 ;
XC 72 ; WX 600 ; N H ; B -27 -50 631 633 ;
XC 73 ; WX 600 ; N I ; B 33 -50 567 633 ;
XC 74 ; WX 600 ; N J ; B 4 -65 663 633 ;
XC 75 ; WX 600 ; N K ; B -37 -50 652 633 ;
XC 76 ; WX 600 ; N L ; B -17 -50 621 633 ;
XC 77 ; WX 600 ; N M ; B -69 -50 673 633 ;
XC 78 ; WX 600 ; N N ; B -58 -50 642 633 ;
XC 79 ; WX 600 ; N O ; B -29 -65 629 648 ;
XC 80 ; WX 600 ; N P ; B -37 -50 579 633 ;
XC 81 ; WX 600 ; N Q ; B -29 -196 629 648 ;
XC 82 ; WX 600 ; N R ; B -37 -50 669 633 ;
XC 83 ; WX 600 ; N S ; B 12 -65 588 648 ;
XC 84 ; WX 600 ; N T ; B -8 -50 608 633 ;
XC 85 ; WX 600 ; N U ; B -40 -65 640 633 ;
XC 86 ; WX 600 ; N V ; B -71 -50 671 633 ;
XC 87 ; WX 600 ; N W ; B -60 -50 660 633 ;
XC 88 ; WX 600 ; N X ; B -40 -50 640 633 ;
XC 89 ; WX 600 ; N Y ; B -29 -50 629 633 ;
XC 90 ; WX 600 ; N Z ; B 23 -50 577 633 ;
XC 91 ; WX 600 ; N bracketleft ; B 200 -204 525 674 ;
XC 92 ; WX 600 ; N backslash ; B 33 -163 567 746 ;
XC 93 ; WX 600 ; N bracketright ; B 75 -204 400 674 ;
XC 94 ; WX 600 ; N asciicircum ; B 33 275 567 674 ;
XC 95 ; WX 600 ; N underscore ; B -92 -350 692 -150 ;
XC 96 ; WX 600 ; N quoteleft ; B 200 244 525 674 ;
XC 97 ; WX 600 ; N a ; B -8 -65 621 502 ;
XC 98 ; WX 600 ; N b ; B -58 -65 621 674 ;
XC 99 ; WX 600 ; N c ; B 4 -65 615 502 ;
XC 100 ; WX 600 ; N d ; B -17 -65 663 674 ;
XC 101 ; WX 600 ; N e ; B -17 -65 600 502 ;
XC 102 ; WX 600 ; N f ; B 25 -50 621 674 ;
XC 103 ; WX 600 ; N g ; B -17 -257 642 502 ;
XC 104 ; WX 600 ; N h ; B -37 -50 631 674 ;
XC 105 ; WX 600 ; N i ; B 12 -50 588 725 ;
XC 106 ; WX 600 ; N j ; B 67 -257 538 725 ;
XC 107 ; WX 600 ; N k ; B -17 -50 621 674 ;
XC 108 ; WX 600 ; N l ; B 12 -50 588 674 ;
XC 109 ; WX 600 ; N m ; B -69 -50 673 502 ;
XC 110 ; WX 600 ; N n ; B -27 -50 621 502 ;
XC 111 ; WX 600 ; N o ; B -8 -65 608 502 ;
XC 112 ; WX 600 ; N p ; B -58 -257 621 502 ;
XC 113 ; WX 600 ; N q ; B -17 -257 663 502 ;
XC 114 ; WX 600 ; N r ; B 4 -50 621 501 ;
XC 115 ; WX 600 ; N s ; B 23 -65 577 502 ;
XC 116 ; WX 600 ; N t ; B -37 -65 579 642 ;
XC 117 ; WX 600 ; N u ; B -37 -65 621 487 ;
XC 118 ; WX 600 ; N v ; B -50 -50 650 487 ;
XC 119 ; WX 600 ; N w ; B -50 -50 650 487 ;
XC 120 ; WX 600 ; N x ; B -29 -50 629 487 ;
XC 121 ; WX 600 ; N y ; B -29 -257 629 487 ;
XC 122 ; WX 600 ; N z ; B 35 -50 569 487 ;
XC 123 ; WX 600 ; N braceleft ; B 117 -204 483 674 ;
XC 124 ; WX 600 ; N bar ; B 200 -204 400 674 ;
XC 125 ; WX 600 ; N braceright ; B 117 -204 483 674 ;
XC 126 ; WX 600 ; N asciitilde ; B 12 129 588 433 ;
XC 161 ; WX 600 ; N exclamdown ; B 170 -257 430 475 ;
XC 162 ; WX 600 ; N cent ; B 33 -79 549 725 ;
XC 163 ; WX 600 ; N sterling ; B -17 -50 600 648 ;
XC 164 ; WX 600 ; N fraction ; B -29 60 629 552 ;
XC 165 ; WX 600 ; N yen ; B -29 -50 629 633 ;
XC 166 ; WX 600 ; N florin ; B 7 -173 598 689 ;
XC 167 ; WX 600 ; N section ; B -14 -147 614 689 ;
XC 168 ; WX 600 ; N currency ; B 23 15 577 569 ;
XC 169 ; WX 600 ; N quotesingle ; B 170 244 430 674 ;
XC 170 ; WX 600 ; N quotedblleft ; B 33 280 567 678 ;
XC 171 ; WX 600 ; N guillemotleft ; B -17 -50 621 487 ;
XC 172 ; WX 600 ; N guilsinglleft ; B -17 -50 392 487 ;
XC 173 ; WX 600 ; N guilsinglright ; B 213 -50 621 487 ;
XC 174 ; WX 600 ; N fi ; B -70 -50 670 725 ;
XC 175 ; WX 600 ; N fl ; B -70 -50 670 674 ;
XC 177 ; WX 600 ; N endash ; B -8 181 608 381 ;
XC 178 ; WX 600 ; N dagger ; B 44 -142 556 674 ;
XC 179 ; WX 600 ; N daggerdbl ; B 44 -142 556 674 ;
XC 180 ; WX 600 ; N periodcentered ; B 190 206 410 406 ;
XC 182 ; WX 600 ; N paragraph ; B -1 -147 605 689 ;
XC 183 ; WX 600 ; N bullet ; B 200 206 400 406 ;
XC 184 ; WX 600 ; N quotesinglbase ; B 75 -225 400 204 ;
XC 185 ; WX 600 ; N quotedblbase ; B 33 -199 567 199 ;
XC 186 ; WX 600 ; N quotedblright ; B 33 280 567 678 ;
XC 187 ; WX 600 ; N guillemotright ; B -17 -50 621 487 ;
XC 188 ; WX 600 ; N ellipsis ; B 0 -65 600 135 ;
XC 189 ; WX 600 ; N perthousand ; B -50 -65 650 689 ;
XC 191 ; WX 600 ; N questiondown ; B 33 -257 546 475 ;
XC 193 ; WX 600 ; N grave ; B 75 390 400 689 ;
XC 194 ; WX 600 ; N acute ; B 200 390 525 689 ;
XC 195 ; WX 600 ; N circumflex ; B 75 390 525 674 ;
XC 196 ; WX 600 ; N tilde ; B 65 381 535 640 ;
XC 197 ; WX 600 ; N macron ; B 75 416 525 616 ;
XC 198 ; WX 600 ; N breve ; B 75 390 525 674 ;
XC 199 ; WX 600 ; N dotaccent ; B 200 431 400 631 ;
XC 200 ; WX 600 ; N dieresis ; B 96 431 504 631 ;
XC 202 ; WX 600 ; N ring ; B 127 353 473 694 ;
XC 203 ; WX 600 ; N cedilla ; B 130 -246 457 100 ;
XC 205 ; WX 600 ; N hungarumlaut ; B 75 390 525 689 ;
XC 206 ; WX 600 ; N ogonek ; B 200 -225 513 100 ;
XC 207 ; WX 600 ; N caron ; B 75 390 525 674 ;
XC 208 ; WX 600 ; N emdash ; B -79 181 679 381 ;
XC 225 ; WX 600 ; N AE ; B -70 -50 670 633 ;
XC 227 ; WX 600 ; N ordfeminine ; B 68 120 539 649 ;
XC 232 ; WX 600 ; N Lslash ; B -37 -50 621 633 ;
XC 233 ; WX 600 ; N Oslash ; B -40 -121 640 683 ;
XC 234 ; WX 600 ; N OE ; B -70 -50 670 633 ;
XC 235 ; WX 600 ; N ordmasculine ; B 72 120 530 649 ;
XC 241 ; WX 600 ; N ae ; B -70 -65 660 502 ;
XC 245 ; WX 600 ; N dotlessi ; B 12 -50 588 487 ;
XC 248 ; WX 600 ; N lslash ; B 12 -50 588 674 ;
XC 249 ; WX 600 ; N oslash ; B -27 -121 623 538 ;
XC 250 ; WX 600 ; N oe ; B -70 -65 660 502 ;
XC 251 ; WX 600 ; N germandbls ; B -37 -65 579 674 ;
XC -1 ; WX 600 ; N Aacute ; B -71 -50 671 839 ;
XC -1 ; WX 600 ; N Acircumflex ; B -71 -50 671 824 ;
XC -1 ; WX 600 ; N Adieresis ; B -71 -50 671 781 ;
XC -1 ; WX 600 ; N Agrave ; B -71 -50 671 839 ;
XC -1 ; WX 600 ; N Aring ; B -71 -50 671 855 ;
XC -1 ; WX 600 ; N Atilde ; B -71 -50 671 790 ;
XC -1 ; WX 600 ; N Ccedilla ; B -17 -246 614 648 ;
XC -1 ; WX 600 ; N Eacute ; B -37 -50 600 839 ;
XC -1 ; WX 600 ; N Ecircumflex ; B -37 -50 600 824 ;
XC -1 ; WX 600 ; N Edieresis ; B -37 -50 600 781 ;
XC -1 ; WX 600 ; N Egrave ; B -37 -50 600 839 ;
XC -1 ; WX 600 ; N Eth ; B -37 -50 600 633 ;
XC -1 ; WX 600 ; N Gcaron ; B -17 -65 642 824 ;
XC -1 ; WX 600 ; N IJ ; B -70 -65 670 633 ;
XC -1 ; WX 600 ; N Iacute ; B 33 -50 567 839 ;
XC -1 ; WX 600 ; N Icircumflex ; B 33 -50 567 824 ;
XC -1 ; WX 600 ; N Idieresis ; B 33 -50 567 781 ;
XC -1 ; WX 600 ; N Idot ; B 33 -50 567 781 ;
XC -1 ; WX 600 ; N Igrave ; B 33 -50 567 839 ;
XC -1 ; WX 600 ; N LL ; B -80 -50 680 633 ;
XC -1 ; WX 600 ; N Ntilde ; B -58 -50 642 790 ;
XC -1 ; WX 600 ; N Oacute ; B -29 -65 629 839 ;
XC -1 ; WX 600 ; N Ocircumflex ; B -29 -65 629 824 ;
XC -1 ; WX 600 ; N Odieresis ; B -29 -65 629 781 ;
XC -1 ; WX 600 ; N Ograve ; B -29 -65 629 839 ;
XC -1 ; WX 600 ; N Otilde ; B -29 -65 629 790 ;
XC -1 ; WX 600 ; N Scaron ; B 12 -65 588 824 ;
XC -1 ; WX 600 ; N Scedilla ; B 12 -246 588 648 ;
XC -1 ; WX 600 ; N Thorn ; B -37 -50 599 633 ;
XC -1 ; WX 600 ; N Uacute ; B -40 -65 640 839 ;
XC -1 ; WX 600 ; N Ucircumflex ; B -40 -65 640 824 ;
XC -1 ; WX 600 ; N Udieresis ; B -40 -65 640 781 ;
XC -1 ; WX 600 ; N Ugrave ; B -40 -65 640 839 ;
XC -1 ; WX 600 ; N Yacute ; B -29 -50 629 839 ;
XC -1 ; WX 600 ; N Ydieresis ; B -29 -50 629 781 ;
XC -1 ; WX 600 ; N Zcaron ; B 23 -50 577 824 ;
XC -1 ; WX 600 ; N aacute ; B -8 -65 621 710 ;
XC -1 ; WX 600 ; N acircumflex ; B -8 -65 621 703 ;
XC -1 ; WX 600 ; N adieresis ; B -8 -65 621 652 ;
XC -1 ; WX 600 ; N agrave ; B -8 -65 621 710 ;
XC -1 ; WX 600 ; N aring ; B -8 -65 621 746 ;
XC -1 ; WX 600 ; N arrowboth ; B -100 50 700 550 ;
XC -1 ; WX 600 ; N arrowdown ; B 50 -50 550 689 ;
XC -1 ; WX 600 ; N arrowleft ; B -100 50 700 550 ;
XC -1 ; WX 600 ; N arrowright ; B -100 50 700 550 ;
XC -1 ; WX 600 ; N arrowup ; B 50 -50 550 689 ;
XC -1 ; WX 600 ; N atilde ; B -8 -65 621 678 ;
XC -1 ; WX 600 ; N brokenbar ; B 200 -204 400 674 ;
XC -1 ; WX 600 ; N ccedilla ; B 4 -246 615 502 ;
XC -1 ; WX 600 ; N center ; B -60 -50 660 684 ;
XC -1 ; WX 600 ; N copyright ; B -80 -65 680 648 ;
XC -1 ; WX 600 ; N dectab ; B -65 -50 665 308 ;
XC -1 ; WX 600 ; N degree ; B 75 234 525 674 ;
XC -1 ; WX 600 ; N divide ; B -8 -9 608 591 ;
XC -1 ; WX 600 ; N down ; B 94 -50 506 502 ;
XC -1 ; WX 600 ; N eacute ; B -17 -65 600 714 ;
XC -1 ; WX 600 ; N ecircumflex ; B -17 -65 600 703 ;
XC -1 ; WX 600 ; N edieresis ; B -17 -65 600 652 ;
XC -1 ; WX 600 ; N egrave ; B -17 -65 600 714 ;
XC -1 ; WX 600 ; N eth ; B -8 -65 608 689 ;
XC -1 ; WX 600 ; N format ; B -75 -257 125 674 ;
XC -1 ; WX 600 ; N gcaron ; B -17 -257 642 695 ;
XC -1 ; WX 600 ; N graybox ; B -25 -100 625 700 ;
XC -1 ; WX 600 ; N iacute ; B 12 -50 588 710 ;
XC -1 ; WX 600 ; N icircumflex ; B 12 -50 588 684 ;
XC -1 ; WX 600 ; N idieresis ; B 12 -50 588 652 ;
XC -1 ; WX 600 ; N igrave ; B 12 -50 588 706 ;
XC -1 ; WX 600 ; N ij ; B -50 -257 610 725 ;
XC -1 ; WX 600 ; N indent ; B -6 0 606 412 ;
XC -1 ; WX 600 ; N largebullet ; B 201 207 401 407 ;
XC -1 ; WX 600 ; N left ; B -6 0 606 412 ;
XC -1 ; WX 600 ; N lira ; B -17 -50 600 648 ;
XC -1 ; WX 600 ; N ll ; B -60 -50 660 674 ;
XC -1 ; WX 600 ; N logicalnot ; B -8 94 608 454 ;
XC -1 ; WX 600 ; N merge ; B 94 -50 506 502 ;
XC -1 ; WX 600 ; N minus ; B -8 181 608 381 ;
XC -1 ; WX 600 ; N mu ; B -37 -257 621 487 ;
XC -1 ; WX 600 ; N multiply ; B 22 -48 578 530 ;
XC -1 ; WX 600 ; N notegraphic ; B 80 -65 520 689 ;
XC -1 ; WX 600 ; N ntilde ; B -27 -50 621 678 ;
XC -1 ; WX 600 ; N oacute ; B -8 -65 608 699 ;
XC -1 ; WX 600 ; N ocircumflex ; B -8 -65 608 703 ;
XC -1 ; WX 600 ; N odieresis ; B -8 -65 608 652 ;
XC -1 ; WX 600 ; N ograve ; B -8 -65 608 699 ;
XC -1 ; WX 600 ; N onehalf ; B -70 -65 670 674 ;
XC -1 ; WX 600 ; N onequarter ; B -70 -50 670 674 ;
XC -1 ; WX 600 ; N onesuperior ; B 100 140 500 674 ;
XC -1 ; WX 600 ; N otilde ; B -8 -65 608 657 ;
XC -1 ; WX 600 ; N overscore ; B -92 489 692 689 ;
XC -1 ; WX 600 ; N plusminus ; B -8 -50 608 610 ;
XC -1 ; WX 600 ; N prescription ; B -37 -50 669 633 ;
XC -1 ; WX 600 ; N registered ; B -80 -65 680 648 ;
XC -1 ; WX 600 ; N return ; B -84 -50 684 668 ;
XC -1 ; WX 600 ; N scaron ; B 23 -65 577 695 ;
XC -1 ; WX 600 ; N scedilla ; B 23 -246 577 502 ;
XC -1 ; WX 600 ; N square ; B -84 -50 684 668 ;
XC -1 ; WX 600 ; N stop ; B -84 -50 684 668 ;
XC -1 ; WX 600 ; N tab ; B -84 -50 684 668 ;
XC -1 ; WX 600 ; N thorn ; B -58 -257 621 674 ;
XC -1 ; WX 600 ; N threequarters ; B -70 -50 670 689 ;
XC -1 ; WX 600 ; N threesuperior ; B 95 131 512 689 ;
XC -1 ; WX 600 ; N trademark ; B -80 170 680 633 ;
XC -1 ; WX 600 ; N twosuperior ; B 80 140 491 689 ;
XC -1 ; WX 600 ; N uacute ; B -37 -65 621 706 ;
XC -1 ; WX 600 ; N ucircumflex ; B -37 -65 621 684 ;
XC -1 ; WX 600 ; N udieresis ; B -37 -65 621 652 ;
XC -1 ; WX 600 ; N ugrave ; B -37 -65 621 706 ;
XC -1 ; WX 600 ; N up ; B 94 -50 506 502 ;
XC -1 ; WX 600 ; N yacute ; B -29 -257 629 706 ;
XC -1 ; WX 600 ; N ydieresis ; B -29 -257 629 631 ;
XC -1 ; WX 600 ; N zcaron ; B 35 -50 569 695 ;
XEndCharMetrics
XStartComposites 58
XCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 0 146 ;
XCC zcaron 2 ; PCC z 0 0 ; PCC caron 0 0 ;
XCC Scaron 2 ; PCC S 0 0 ; PCC caron 0 146 ;
XCC scaron 2 ; PCC s 0 0 ; PCC caron 0 0 ;
XCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 0 0 ;
XCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 0 0 ;
XCC Yacute 2 ; PCC Y 0 0 ; PCC acute 0 146 ;
XCC yacute 2 ; PCC y 0 0 ; PCC acute 0 0 ;
XCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 0 146 ;
XCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 0 0 ;
XCC Uacute 2 ; PCC U 0 0 ; PCC acute 0 146 ;
XCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 0 146 ;
XCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 0 146 ;
XCC Ugrave 2 ; PCC U 0 0 ; PCC grave 0 146 ;
XCC uacute 2 ; PCC u 0 0 ; PCC acute 0 0 ;
XCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 0 0 ;
XCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 0 0 ;
XCC ugrave 2 ; PCC u 0 0 ; PCC grave 0 0 ;
XCC Iacute 2 ; PCC I 0 0 ; PCC acute 0 146 ;
XCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex 0 146 ;
XCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis 0 146 ;
XCC Igrave 2 ; PCC I 0 0 ; PCC grave 0 146 ;


XCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute 0 0 ;
XCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex 0 0 ;
XCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis 0 0 ;
XCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave 0 0 ;

XCC Eacute 2 ; PCC E 0 0 ; PCC acute 0 146 ;
XCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 0 146 ;
XCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 0 146 ;
XCC Egrave 2 ; PCC E 0 0 ; PCC grave 0 146 ;
XCC eacute 2 ; PCC e 0 0 ; PCC acute 0 0 ;
XCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 0 0 ;
XCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 0 0 ;
XCC egrave 2 ; PCC e 0 0 ; PCC grave 0 0 ;
XCC Aacute 2 ; PCC A 0 0 ; PCC acute 0 146 ;
XCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 0 146 ;
XCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 0 146 ;
XCC Agrave 2 ; PCC A 0 0 ; PCC grave 0 146 ;
XCC aacute 2 ; PCC a 0 0 ; PCC acute 0 0 ;
XCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 0 0 ;
XCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 0 0 ;
XCC agrave 2 ; PCC a 0 0 ; PCC grave 0 0 ;
XCC Oacute 2 ; PCC O 0 0 ; PCC acute 0 146 ;
XCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 0 146 ;
XCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 0 146 ;
XCC Ograve 2 ; PCC O 0 0 ; PCC grave 0 146 ;
XCC oacute 2 ; PCC o 0 0 ; PCC acute 0 0 ;
XCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 0 0 ;
XCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 0 0 ;
XCC ograve 2 ; PCC o 0 0 ; PCC grave 0 0 ;
XCC Atilde 2 ; PCC A 0 0 ; PCC tilde 0 146 ;
XCC atilde 2 ; PCC a 0 0 ; PCC tilde 0 0 ;
XCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 0 146 ;
XCC ntilde 2 ; PCC n 0 0 ; PCC tilde 0 0 ;
XCC Otilde 2 ; PCC O 0 0 ; PCC tilde 0 146 ;
XCC otilde 2 ; PCC o 0 0 ; PCC tilde 0 0 ;
XCC Aring 2 ; PCC A 0 0 ; PCC ring 0 146 ;
XCC aring 2 ; PCC a 0 0 ; PCC ring 0 0 ;
XEndComposites
XEndFontMetrics
END_OF_FILE
if test 15509 -ne `wc -c <'lout/font0/CouriBol.AFM'`; then
echo shar: \"'lout/font0/CouriBol.AFM'\" unpacked with wrong size!
fi
# end of 'lout/font0/CouriBol.AFM'
fi
if test -f 'lout/font0/CouriBolObl.AFM' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/font0/CouriBolObl.AFM'\"
else
echo shar: Extracting \"'lout/font0/CouriBolObl.AFM'\" \(15500 characters\)
sed "s/^X//" >'lout/font0/CouriBolObl.AFM' <<'END_OF_FILE'
XStartFontMetrics 2.0
XComment Copyright (c) 1985 Adobe Systems Incorporated. All rights reserved.
XComment Creation Date:Tue Dec 15 16:46:08 PST 1987
XFontName Courier-BoldOblique
XEncodingScheme AdobeStandardEncoding
XFullName Courier Bold Oblique
XFamilyName Courier
XWeight Bold
XItalicAngle -12.0
XIsFixedPitch true
XUnderlinePosition -85
XUnderlineThickness 100
XVersion 001.005
XNotice Copyright (c) 1985 Adobe Systems Incorporated. All rights reserved.
XFontBBox -200 -451 800 900
XCapHeight 633
XXHeight 487
XDescender -257
XAscender 674
XStartCharMetrics 260
XC 32 ; WX 600 ; N space ; B 500 -100 700 100 ;
XC 33 ; WX 600 ; N exclam ; B 197 -65 549 689 ;
XC 34 ; WX 600 ; N quotedbl ; B 171 254 654 663 ;
XC 35 ; WX 600 ; N numbersign ; B 52 -142 672 725 ;
XC 36 ; WX 600 ; N dollar ; B 51 -173 659 735 ;
XC 37 ; WX 600 ; N percent ; B 58 -65 671 689 ;
XC 38 ; WX 600 ; N ampersand ; B 52 -65 607 600 ;
XC 39 ; WX 600 ; N quoteright ; B 148 244 522 674 ;
XC 40 ; WX 600 ; N parenleft ; B 255 -204 662 683 ;
XC 41 ; WX 600 ; N parenright ; B 45 -204 452 683 ;
XC 42 ; WX 600 ; N asterisk ; B 131 150 665 674 ;
XC 43 ; WX 600 ; N plus ; B 52 -48 668 610 ;
XC 44 ; WX 600 ; N comma ; B 51 -215 424 215 ;
XC 45 ; WX 600 ; N hyphen ; B 52 181 668 381 ;
XC 46 ; WX 600 ; N period ; B 201 -50 421 150 ;
XC 47 ; WX 600 ; N slash ; B 20 -163 704 746 ;
XC 48 ; WX 600 ; N zero ; B 82 -65 649 689 ;
XC 49 ; WX 600 ; N one ; B 44 -50 578 674 ;
XC 50 ; WX 600 ; N two ; B 15 -50 656 689 ;
XC 51 ; WX 600 ; N three ; B 30 -65 659 689 ;
XC 52 ; WX 600 ; N four ; B 65 -50 618 674 ;
XC 53 ; WX 600 ; N five ; B 33 -65 660 674 ;
XC 54 ; WX 600 ; N six ; B 108 -65 712 689 ;
XC 55 ; WX 600 ; N seven ; B 136 -50 680 674 ;
XC 56 ; WX 600 ; N eight ; B 64 -65 655 689 ;
XC 57 ; WX 600 ; N nine ; B 67 -65 665 689 ;
XC 58 ; WX 600 ; N colon ; B 201 -50 489 472 ;
XC 59 ; WX 600 ; N semicolon ; B 63 -176 489 472 ;
XC 60 ; WX 600 ; N less ; B 52 -48 716 610 ;
XC 61 ; WX 600 ; N equal ; B 11 88 708 474 ;
XC 62 ; WX 600 ; N greater ; B 3 -48 668 610 ;
XC 63 ; WX 600 ; N question ; B 148 -65 657 648 ;
XC 64 ; WX 600 ; N at ; B 61 -142 640 705 ;
XC 65 ; WX 600 ; N A ; B -60 -50 682 633 ;
XC 66 ; WX 600 ; N B ; B -26 -50 670 633 ;
XC 67 ; WX 600 ; N C ; B 31 -65 713 648 ;
XC 68 ; WX 600 ; N D ; B -26 -50 670 633 ;
XC 69 ; WX 600 ; N E ; B -26 -50 692 633 ;
XC 70 ; WX 600 ; N F ; B -26 -50 713 633 ;
XC 71 ; WX 600 ; N G ; B 29 -65 713 648 ;
XC 72 ; WX 600 ; N H ; B -16 -50 723 633 ;
XC 73 ; WX 600 ; N I ; B 44 -50 680 633 ;
XC 74 ; WX 600 ; N J ; B 22 -65 776 633 ;
XC 75 ; WX 600 ; N K ; B -26 -50 744 633 ;
XC 76 ; WX 600 ; N L ; B -6 -50 665 633 ;
XC 77 ; WX 600 ; N M ; B -58 -50 776 633 ;
XC 78 ; WX 600 ; N N ; B -26 -50 755 633 ;
XC 79 ; WX 600 ; N O ; B 26 -65 696 648 ;
XC 80 ; WX 600 ; N P ; B -26 -50 666 633 ;
XC 81 ; WX 600 ; N Q ; B 26 -196 696 648 ;
XC 82 ; WX 600 ; N R ; B -26 -50 680 633 ;
XC 83 ; WX 600 ; N S ; B 23 -65 680 648 ;
XC 84 ; WX 600 ; N T ; B 72 -50 721 633 ;
XC 85 ; WX 600 ; N U ; B 61 -65 753 633 ;
XC 86 ; WX 600 ; N V ; B 42 -50 784 633 ;
XC 87 ; WX 600 ; N W ; B 50 -50 773 633 ;
XC 88 ; WX 600 ; N X ; B -29 -50 742 633 ;
XC 89 ; WX 600 ; N Y ; B 76 -50 742 633 ;
XC 90 ; WX 600 ; N Z ; B 34 -50 669 633 ;
XC 91 ; WX 600 ; N bracketleft ; B 178 -204 647 674 ;
XC 92 ; WX 600 ; N backslash ; B 170 -163 554 746 ;
XC 93 ; WX 600 ; N bracketright ; B 53 -204 522 674 ;
XC 94 ; WX 600 ; N asciicircum ; B 113 275 647 674 ;
XC 95 ; WX 600 ; N underscore ; B -145 -350 639 -150 ;
XC 96 ; WX 600 ; N quoteleft ; B 322 244 598 674 ;
XC 97 ; WX 600 ; N a ; B 16 -65 632 502 ;
XC 98 ; WX 600 ; N b ; B -47 -65 670 674 ;
XC 99 ; WX 600 ; N c ; B 44 -65 672 502 ;
XC 100 ; WX 600 ; N d ; B 23 -65 701 674 ;
XC 101 ; WX 600 ; N e ; B 25 -65 650 502 ;
XC 102 ; WX 600 ; N f ; B 36 -50 740 674 ;
XC 103 ; WX 600 ; N g ; B 25 -257 724 502 ;
XC 104 ; WX 600 ; N h ; B -16 -50 642 674 ;
XC 105 ; WX 600 ; N i ; B 23 -50 599 725 ;
XC 106 ; WX 600 ; N j ; B 34 -257 620 725 ;
XC 107 ; WX 600 ; N k ; B -6 -50 661 674 ;
XC 108 ; WX 600 ; N l ; B 23 -50 599 674 ;
XC 109 ; WX 600 ; N m ; B -58 -50 684 502 ;
XC 110 ; WX 600 ; N n ; B -16 -50 632 502 ;
XC 111 ; WX 600 ; N o ; B 34 -65 656 502 ;
XC 112 ; WX 600 ; N p ; B -91 -257 671 502 ;
XC 113 ; WX 600 ; N q ; B 27 -257 745 502 ;
XC 114 ; WX 600 ; N r ; B 15 -50 699 501 ;
XC 115 ; WX 600 ; N s ; B 34 -65 638 502 ;
XC 116 ; WX 600 ; N t ; B 45 -65 599 642 ;
XC 117 ; WX 600 ; N u ; B 45 -65 640 487 ;
XC 118 ; WX 600 ; N v ; B 32 -50 732 487 ;
XC 119 ; WX 600 ; N w ; B 32 -50 732 487 ;
XC 120 ; WX 600 ; N x ; B -18 -50 690 487 ;
XC 121 ; WX 600 ; N y ; B -62 -257 711 487 ;
XC 122 ; WX 600 ; N z ; B 46 -50 640 487 ;
XC 123 ; WX 600 ; N braceleft ; B 168 -204 605 674 ;
XC 124 ; WX 600 ; N bar ; B 178 -204 522 674 ;
XC 125 ; WX 600 ; N braceright ; B 95 -204 534 674 ;
XC 126 ; WX 600 ; N asciitilde ; B 67 129 652 433 ;
XC 161 ; WX 600 ; N exclamdown ; B 143 -257 490 475 ;
XC 162 ; WX 600 ; N cent ; B 96 -79 643 725 ;
XC 163 ; WX 600 ; N sterling ; B 15 -50 620 648 ;
XC 164 ; WX 600 ; N fraction ; B 5 60 725 552 ;
XC 165 ; WX 600 ; N yen ; B 77 -50 742 633 ;
XC 166 ; WX 600 ; N florin ; B -6 -173 720 689 ;
XC 167 ; WX 600 ; N section ; B 18 -147 697 689 ;
XC 168 ; WX 600 ; N currency ; B 47 15 677 569 ;
XC 169 ; WX 600 ; N quotesingle ; B 273 244 552 674 ;
XC 170 ; WX 600 ; N quotedblleft ; B 156 280 648 678 ;
XC 171 ; WX 600 ; N guillemotleft ; B 27 -50 703 487 ;
XC 172 ; WX 600 ; N guilsinglleft ; B 27 -50 474 487 ;
XC 173 ; WX 600 ; N guilsinglright ; B 224 -50 665 487 ;
XC 174 ; WX 600 ; N fi ; B -59 -50 681 725 ;
XC 175 ; WX 600 ; N fl ; B -59 -50 687 674 ;
XC 177 ; WX 600 ; N endash ; B 52 181 668 381 ;
XC 178 ; WX 600 ; N dagger ; B 126 -142 638 674 ;
XC 179 ; WX 600 ; N daggerdbl ; B 75 -142 638 674 ;
XC 180 ; WX 600 ; N periodcentered ; B 255 206 475 406 ;
XC 182 ; WX 600 ; N paragraph ; B 72 -147 730 689 ;
XC 183 ; WX 600 ; N bullet ; B 265 206 465 406 ;
XC 184 ; WX 600 ; N quotesinglbase ; B 48 -225 422 204 ;
XC 185 ; WX 600 ; N quotedblbase ; B 12 -199 588 199 ;
XC 186 ; WX 600 ; N quotedblright ; B 114 280 690 678 ;
XC 187 ; WX 600 ; N guillemotright ; B -6 -50 665 487 ;
XC 188 ; WX 600 ; N ellipsis ; B 7 -65 607 135 ;
XC 189 ; WX 600 ; N perthousand ; B 55 -65 679 689 ;
XC 191 ; WX 600 ; N questiondown ; B 26 -257 533 475 ;
XC 193 ; WX 600 ; N grave ; B 200 390 504 689 ;
XC 194 ; WX 600 ; N acute ; B 304 390 650 689 ;
XC 195 ; WX 600 ; N circumflex ; B 179 390 629 674 ;
XC 196 ; WX 600 ; N tilde ; B 171 381 646 640 ;
XC 197 ; WX 600 ; N macron ; B 185 416 635 616 ;
XC 198 ; WX 600 ; N breve ; B 196 390 647 674 ;
XC 199 ; WX 600 ; N dotaccent ; B 313 431 513 631 ;
XC 200 ; WX 600 ; N dieresis ; B 209 431 617 631 ;
XC 202 ; WX 600 ; N ring ; B 237 353 586 694 ;
XC 203 ; WX 600 ; N cedilla ; B 103 -246 436 100 ;
XC 205 ; WX 600 ; N hungarumlaut ; B 179 390 650 689 ;
XC 206 ; WX 600 ; N ogonek ; B 184 -225 490 100 ;
XC 207 ; WX 600 ; N caron ; B 197 390 647 674 ;
XC 208 ; WX 600 ; N emdash ; B -19 181 739 381 ;
XC 225 ; WX 600 ; N AE ; B -59 -50 763 633 ;
XC 227 ; WX 600 ; N ordfeminine ; B 114 120 590 649 ;
XC 232 ; WX 600 ; N Lslash ; B -6 -50 665 633 ;
XC 233 ; WX 600 ; N Oslash ; B -44 -121 764 683 ;
XC 234 ; WX 600 ; N OE ; B -16 -50 763 633 ;
XC 235 ; WX 600 ; N ordmasculine ; B 118 120 623 649 ;
XC 241 ; WX 600 ; N ae ; B -39 -65 711 502 ;
XC 245 ; WX 600 ; N dotlessi ; B 23 -50 599 487 ;
XC 248 ; WX 600 ; N lslash ; B 23 -50 604 674 ;
XC 249 ; WX 600 ; N oslash ; B -31 -121 716 538 ;
XC 250 ; WX 600 ; N oe ; B -30 -65 711 502 ;
XC 251 ; WX 600 ; N germandbls ; B -26 -65 618 674 ;
XC -1 ; WX 600 ; N Aacute ; B -60 -50 682 839 ;
XC -1 ; WX 600 ; N Acircumflex ; B -60 -50 682 824 ;
XC -1 ; WX 600 ; N Adieresis ; B -60 -50 682 781 ;
XC -1 ; WX 600 ; N Agrave ; B -60 -50 682 839 ;
XC -1 ; WX 600 ; N Aring ; B -60 -50 682 855 ;
XC -1 ; WX 600 ; N Atilde ; B -60 -50 682 790 ;
XC -1 ; WX 600 ; N Ccedilla ; B 31 -246 713 648 ;
XC -1 ; WX 600 ; N Eacute ; B -26 -50 692 839 ;
XC -1 ; WX 600 ; N Ecircumflex ; B -26 -50 692 824 ;
XC -1 ; WX 600 ; N Edieresis ; B -26 -50 692 781 ;
XC -1 ; WX 600 ; N Egrave ; B -26 -50 692 839 ;
XC -1 ; WX 600 ; N Eth ; B -26 -50 670 633 ;
XC -1 ; WX 600 ; N Gcaron ; B 29 -65 713 824 ;
XC -1 ; WX 600 ; N IJ ; B -59 -65 783 633 ;
XC -1 ; WX 600 ; N Iacute ; B 44 -50 680 839 ;
XC -1 ; WX 600 ; N Icircumflex ; B 44 -50 680 824 ;
XC -1 ; WX 600 ; N Idieresis ; B 44 -50 680 781 ;
XC -1 ; WX 600 ; N Idot ; B 44 -50 680 781 ;
XC -1 ; WX 600 ; N Igrave ; B 44 -50 680 839 ;
XC -1 ; WX 600 ; N LL ; B -69 -50 712 633 ;
XC -1 ; WX 600 ; N Ntilde ; B -26 -50 755 790 ;
XC -1 ; WX 600 ; N Oacute ; B 26 -65 696 839 ;
XC -1 ; WX 600 ; N Ocircumflex ; B 26 -65 696 824 ;
XC -1 ; WX 600 ; N Odieresis ; B 26 -65 696 781 ;
XC -1 ; WX 600 ; N Ograve ; B 26 -65 696 839 ;
XC -1 ; WX 600 ; N Otilde ; B 26 -65 696 790 ;
XC -1 ; WX 600 ; N Scaron ; B 23 -65 680 824 ;
XC -1 ; WX 600 ; N Scedilla ; B 23 -246 680 648 ;
XC -1 ; WX 600 ; N Thorn ; B -26 -50 663 633 ;
XC -1 ; WX 600 ; N Uacute ; B 61 -65 753 839 ;
XC -1 ; WX 600 ; N Ucircumflex ; B 61 -65 753 824 ;
XC -1 ; WX 600 ; N Udieresis ; B 61 -65 753 781 ;
XC -1 ; WX 600 ; N Ugrave ; B 61 -65 753 839 ;
XC -1 ; WX 600 ; N Yacute ; B 76 -50 742 839 ;
XC -1 ; WX 600 ; N Ydieresis ; B 76 -50 742 781 ;
XC -1 ; WX 600 ; N Zcaron ; B 34 -50 679 824 ;
XC -1 ; WX 600 ; N aacute ; B 16 -65 632 710 ;
XC -1 ; WX 600 ; N acircumflex ; B 16 -65 635 703 ;
XC -1 ; WX 600 ; N adieresis ; B 16 -65 632 652 ;
XC -1 ; WX 600 ; N agrave ; B 16 -65 632 710 ;
XC -1 ; WX 600 ; N aring ; B 16 -65 632 746 ;
XC -1 ; WX 600 ; N arrowboth ; B -36 50 764 550 ;
XC -1 ; WX 600 ; N arrowdown ; B 93 -50 593 689 ;
XC -1 ; WX 600 ; N arrowleft ; B -36 50 764 550 ;
XC -1 ; WX 600 ; N arrowright ; B -36 50 764 550 ;
XC -1 ; WX 600 ; N arrowup ; B 143 -50 643 689 ;
XC -1 ; WX 600 ; N atilde ; B 16 -65 654 678 ;
XC -1 ; WX 600 ; N brokenbar ; B 178 -204 522 674 ;
XC -1 ; WX 600 ; N ccedilla ; B 44 -246 672 502 ;
XC -1 ; WX 600 ; N center ; B 2 -50 722 684 ;
XC -1 ; WX 600 ; N copyright ; B -27 -65 743 648 ;
XC -1 ; WX 600 ; N dectab ; B -54 -50 676 308 ;
XC -1 ; WX 600 ; N degree ; B 171 234 624 674 ;
XC -1 ; WX 600 ; N divide ; B 52 -9 668 591 ;
XC -1 ; WX 600 ; N down ; B 127 -50 539 502 ;
XC -1 ; WX 600 ; N eacute ; B 25 -65 650 714 ;
XC -1 ; WX 600 ; N ecircumflex ; B 25 -65 650 703 ;
XC -1 ; WX 600 ; N edieresis ; B 25 -65 650 652 ;
XC -1 ; WX 600 ; N egrave ; B 25 -65 650 714 ;
XC -1 ; WX 600 ; N eth ; B 28 -65 695 689 ;
XC -1 ; WX 600 ; N format ; B -108 -257 247 674 ;
XC -1 ; WX 600 ; N gcaron ; B 25 -257 724 695 ;
XC -1 ; WX 600 ; N graybox ; B -25 -100 753 700 ;
XC -1 ; WX 600 ; N iacute ; B 23 -50 599 710 ;
XC -1 ; WX 600 ; N icircumflex ; B 23 -50 599 684 ;
XC -1 ; WX 600 ; N idieresis ; B 23 -50 599 652 ;
XC -1 ; WX 600 ; N igrave ; B 23 -50 599 706 ;
XC -1 ; WX 600 ; N ij ; B -39 -257 692 725 ;
XC -1 ; WX 600 ; N indent ; B 38 0 650 412 ;
XC -1 ; WX 600 ; N largebullet ; B 266 207 466 407 ;
XC -1 ; WX 600 ; N left ; B 38 0 650 412 ;
XC -1 ; WX 600 ; N lira ; B 15 -50 620 648 ;
XC -1 ; WX 600 ; N ll ; B -49 -50 682 674 ;
XC -1 ; WX 600 ; N logicalnot ; B 67 94 683 454 ;
XC -1 ; WX 600 ; N merge ; B 127 -50 569 502 ;
XC -1 ; WX 600 ; N minus ; B 52 181 668 381 ;
XC -1 ; WX 600 ; N mu ; B 13 -257 640 487 ;
XC -1 ; WX 600 ; N multiply ; B 33 -48 669 530 ;
XC -1 ; WX 600 ; N notegraphic ; B 107 -65 639 689 ;
XC -1 ; WX 600 ; N ntilde ; B -16 -50 632 678 ;
XC -1 ; WX 600 ; N oacute ; B 34 -65 656 699 ;
XC -1 ; WX 600 ; N ocircumflex ; B 34 -65 656 703 ;
XC -1 ; WX 600 ; N odieresis ; B 34 -65 656 652 ;
XC -1 ; WX 600 ; N ograve ; B 34 -65 656 699 ;
XC -1 ; WX 600 ; N onehalf ; B -14 -65 725 674 ;
XC -1 ; WX 600 ; N onequarter ; B -14 -50 741 674 ;
XC -1 ; WX 600 ; N onesuperior ; B 151 140 551 674 ;
XC -1 ; WX 600 ; N otilde ; B 34 -65 656 657 ;
XC -1 ; WX 600 ; N overscore ; B 33 489 817 689 ;
XC -1 ; WX 600 ; N plusminus ; B 3 -50 677 610 ;
XC -1 ; WX 600 ; N prescription ; B -26 -50 680 633 ;
XC -1 ; WX 600 ; N registered ; B -27 -65 743 648 ;
XC -1 ; WX 600 ; N return ; B -24 -50 805 668 ;
XC -1 ; WX 600 ; N scaron ; B 34 -65 651 695 ;
XC -1 ; WX 600 ; N scedilla ; B 34 -246 638 502 ;
XC -1 ; WX 600 ; N square ; B -73 -50 805 668 ;
XC -1 ; WX 600 ; N stop ; B -73 -50 805 668 ;
XC -1 ; WX 600 ; N tab ; B -73 -50 744 668 ;
XC -1 ; WX 600 ; N thorn ; B -91 -257 671 674 ;
XC -1 ; WX 600 ; N threequarters ; B -3 -50 711 689 ;
XC -1 ; WX 600 ; N threesuperior ; B 155 131 612 689 ;
XC -1 ; WX 600 ; N trademark ; B 18 170 793 633 ;
XC -1 ; WX 600 ; N twosuperior ; B 131 140 601 689 ;
XC -1 ; WX 600 ; N uacute ; B 45 -65 640 706 ;
XC -1 ; WX 600 ; N ucircumflex ; B 45 -65 640 684 ;
XC -1 ; WX 600 ; N udieresis ; B 45 -65 640 652 ;
XC -1 ; WX 600 ; N ugrave ; B 45 -65 640 706 ;
XC -1 ; WX 600 ; N up ; B 157 -50 569 502 ;
XC -1 ; WX 600 ; N yacute ; B -62 -257 711 706 ;
XC -1 ; WX 600 ; N ydieresis ; B -62 -257 711 631 ;
XC -1 ; WX 600 ; N zcaron ; B 46 -50 651 695 ;
XEndCharMetrics
XStartComposites 58
XCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 0 146 ;
XCC zcaron 2 ; PCC z 0 0 ; PCC caron 0 0 ;
XCC Scaron 2 ; PCC S 0 0 ; PCC caron 0 146 ;
XCC scaron 2 ; PCC s 0 0 ; PCC caron 0 0 ;
XCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 0 0 ;
XCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 0 0 ;
XCC Yacute 2 ; PCC Y 0 0 ; PCC acute 0 146 ;
XCC yacute 2 ; PCC y 0 0 ; PCC acute 0 0 ;
XCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 0 146 ;
XCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 0 0 ;
XCC Uacute 2 ; PCC U 0 0 ; PCC acute 0 146 ;
XCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 0 146 ;
XCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 0 146 ;
XCC Ugrave 2 ; PCC U 0 0 ; PCC grave 0 146 ;
XCC uacute 2 ; PCC u 0 0 ; PCC acute 0 0 ;
XCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 0 0 ;
XCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 0 0 ;
XCC ugrave 2 ; PCC u 0 0 ; PCC grave 0 0 ;
XCC Iacute 2 ; PCC I 0 0 ; PCC acute 0 146 ;
XCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex 0 146 ;
XCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis 0 146 ;
XCC Igrave 2 ; PCC I 0 0 ; PCC grave 0 146 ;


XCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute 0 0 ;
XCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex 0 0 ;
XCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis 0 0 ;
XCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave 0 0 ;

XCC Eacute 2 ; PCC E 0 0 ; PCC acute 0 146 ;
XCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 0 146 ;
XCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 0 146 ;
XCC Egrave 2 ; PCC E 0 0 ; PCC grave 0 146 ;
XCC eacute 2 ; PCC e 0 0 ; PCC acute 0 0 ;
XCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 0 0 ;
XCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 0 0 ;
XCC egrave 2 ; PCC e 0 0 ; PCC grave 0 0 ;
XCC Aacute 2 ; PCC A 0 0 ; PCC acute 0 146 ;
XCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 0 146 ;
XCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 0 146 ;
XCC Agrave 2 ; PCC A 0 0 ; PCC grave 0 146 ;
XCC aacute 2 ; PCC a 0 0 ; PCC acute 0 0 ;
XCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 0 0 ;
XCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 0 0 ;
XCC agrave 2 ; PCC a 0 0 ; PCC grave 0 0 ;
XCC Oacute 2 ; PCC O 0 0 ; PCC acute 0 146 ;
XCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 0 146 ;
XCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 0 146 ;
XCC Ograve 2 ; PCC O 0 0 ; PCC grave 0 146 ;
XCC oacute 2 ; PCC o 0 0 ; PCC acute 0 0 ;
XCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 0 0 ;
XCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 0 0 ;
XCC ograve 2 ; PCC o 0 0 ; PCC grave 0 0 ;
XCC Atilde 2 ; PCC A 0 0 ; PCC tilde 0 146 ;
XCC atilde 2 ; PCC a 0 0 ; PCC tilde 0 0 ;
XCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 0 146 ;
XCC ntilde 2 ; PCC n 0 0 ; PCC tilde 0 0 ;
XCC Otilde 2 ; PCC O 0 0 ; PCC tilde 0 146 ;
XCC otilde 2 ; PCC o 0 0 ; PCC tilde 0 0 ;
XCC Aring 2 ; PCC A 0 0 ; PCC ring 0 146 ;
XCC aring 2 ; PCC a 0 0 ; PCC ring 0 0 ;
XEndComposites
XEndFontMetrics
END_OF_FILE
if test 15500 -ne `wc -c <'lout/font0/CouriBolObl.AFM'`; then
echo shar: \"'lout/font0/CouriBolObl.AFM'\" unpacked with wrong size!
fi
# end of 'lout/font0/CouriBolObl.AFM'
fi
if test -f 'lout/font0/HelveNarBol.AFM' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/font0/HelveNarBol.AFM'\"
else
echo shar: Extracting \"'lout/font0/HelveNarBol.AFM'\" \(15497 characters\)
sed "s/^X//" >'lout/font0/HelveNarBol.AFM' <<'END_OF_FILE'
XStartFontMetrics 2.0


XComment Copyright (c) 1985, 1987 Adobe Systems Incorporated. All rights reserved.

XComment Creation Date:Mon Dec 14 12:58:56 PST 1987
XFontName Helvetica-Narrow-Bold
XEncodingScheme AdobeStandardEncoding
XFullName Helvetica Narrow Bold
XFamilyName Helvetica
XWeight Bold
XItalicAngle 0.0
XIsFixedPitch false
XUnderlinePosition -106
XUnderlineThickness 73
XVersion 001.002
XNotice Copyright (c) 1985, 1987 Adobe Systems Incorporated. All rights reserved.Helvetica is a registered trademark of Allied Corporation.
XFontBBox -141 -221 822 936


XCapHeight 729
XXHeight 542
XDescender -219
XAscender 729
XStartCharMetrics 228

XC 32 ; WX 228 ; N space ; B 0 0 0 0 ;
XC 33 ; WX 273 ; N exclam ; B 92 0 215 729 ;
XC 34 ; WX 389 ; N quotedbl ; B 41 470 348 729 ;
XC 35 ; WX 456 ; N numbersign ; B 3 -30 454 696 ;
XC 36 ; WX 456 ; N dollar ; B 18 -125 431 765 ;
XC 37 ; WX 729 ; N percent ; B 18 -18 708 708 ;
XC 38 ; WX 592 ; N ampersand ; B 44 -20 568 729 ;
XC 39 ; WX 228 ; N quoteright ; B 54 469 165 729 ;
XC 40 ; WX 273 ; N parenleft ; B 33 -202 249 729 ;
XC 41 ; WX 273 ; N parenright ; B 18 -202 234 729 ;
XC 42 ; WX 319 ; N asterisk ; B 19 385 292 730 ;
XC 43 ; WX 479 ; N plus ; B 41 -10 437 474 ;
XC 44 ; WX 228 ; N comma ; B 52 -174 175 146 ;
XC 45 ; WX 273 ; N hyphen ; B 21 208 244 344 ;
XC 46 ; WX 228 ; N period ; B 52 0 175 146 ;
XC 47 ; WX 228 ; N slash ; B 1 -14 225 715 ;
XC 48 ; WX 456 ; N zero ; B 23 -23 423 725 ;
XC 49 ; WX 456 ; N one ; B 56 0 310 709 ;
XC 50 ; WX 456 ; N two ; B 25 0 422 726 ;
XC 51 ; WX 456 ; N three ; B 24 -23 424 726 ;
XC 52 ; WX 456 ; N four ; B 19 0 428 709 ;
XC 53 ; WX 456 ; N five ; B 22 -24 423 709 ;
XC 54 ; WX 456 ; N six ; B 25 -23 425 727 ;
XC 55 ; WX 456 ; N seven ; B 24 0 433 709 ;
XC 56 ; WX 456 ; N eight ; B 17 -23 430 726 ;
XC 57 ; WX 456 ; N nine ; B 23 -23 422 728 ;
XC 58 ; WX 273 ; N colon ; B 93 0 216 521 ;
XC 59 ; WX 273 ; N semicolon ; B 93 -174 216 521 ;
XC 60 ; WX 479 ; N less ; B 33 -10 434 474 ;
XC 61 ; WX 479 ; N equal ; B 41 52 438 412 ;
XC 62 ; WX 479 ; N greater ; B 33 -10 434 474 ;
XC 63 ; WX 501 ; N question ; B 53 0 455 744 ;
XC 64 ; WX 800 ; N at ; B 22 -136 777 746 ;


XC 65 ; WX 592 ; N A ; B 21 0 576 729 ;

XC 66 ; WX 592 ; N B ; B 67 0 546 729 ;
XC 67 ; WX 592 ; N C ; B 36 -23 562 741 ;
XC 68 ; WX 592 ; N D ; B 63 0 559 729 ;
XC 69 ; WX 547 ; N E ; B 65 0 512 729 ;
XC 70 ; WX 501 ; N F ; B 61 0 481 729 ;
XC 71 ; WX 638 ; N G ; B 33 -24 582 741 ;
XC 72 ; WX 592 ; N H ; B 56 0 539 729 ;
XC 73 ; WX 228 ; N I ; B 52 0 175 729 ;
XC 74 ; WX 456 ; N J ; B 20 -23 399 729 ;
XC 75 ; WX 592 ; N K ; B 61 0 588 729 ;
XC 76 ; WX 501 ; N L ; B 66 0 475 729 ;
XC 77 ; WX 683 ; N M ; B 54 0 637 729 ;
XC 78 ; WX 592 ; N N ; B 56 0 542 729 ;
XC 79 ; WX 638 ; N O ; B 33 -23 608 741 ;
XC 80 ; WX 547 ; N P ; B 62 0 519 729 ;
XC 81 ; WX 638 ; N Q ; B 35 -54 611 741 ;
XC 82 ; WX 592 ; N R ; B 66 0 555 729 ;
XC 83 ; WX 547 ; N S ; B 27 -23 519 741 ;
XC 84 ; WX 501 ; N T ; B 12 0 491 729 ;
XC 85 ; WX 592 ; N U ; B 62 -23 536 729 ;
XC 86 ; WX 547 ; N V ; B 20 0 531 729 ;
XC 87 ; WX 774 ; N W ; B 11 0 764 729 ;
XC 88 ; WX 547 ; N X ; B 18 0 535 729 ;
XC 89 ; WX 547 ; N Y ; B 22 0 533 729 ;
XC 90 ; WX 501 ; N Z ; B 25 0 474 729 ;
XC 91 ; WX 273 ; N bracketleft ; B 54 -202 252 729 ;
XC 92 ; WX 228 ; N backslash ; B -10 -21 237 708 ;
XC 93 ; WX 273 ; N bracketright ; B 15 -202 213 729 ;
XC 94 ; WX 479 ; N asciicircum ; B 50 271 428 696 ;
XC 95 ; WX 456 ; N underscore ; B -18 -200 474 -130 ;
XC 96 ; WX 228 ; N quoteleft ; B 55 469 166 729 ;
XC 97 ; WX 456 ; N a ; B 22 -24 429 551 ;
XC 98 ; WX 501 ; N b ; B 48 -23 472 729 ;
XC 99 ; WX 456 ; N c ; B 28 -23 428 551 ;
XC 100 ; WX 501 ; N d ; B 24 -23 447 729 ;
XC 101 ; WX 456 ; N e ; B 18 -23 431 551 ;
XC 102 ; WX 273 ; N f ; B 12 0 257 729 ; L i fi ; L l fl ;
XC 103 ; WX 501 ; N g ; B 28 -220 444 551 ;
XC 104 ; WX 501 ; N h ; B 55 0 444 729 ;
XC 105 ; WX 228 ; N i ; B 55 0 170 729 ;
XC 106 ; WX 228 ; N j ; B 3 -219 172 729 ;
XC 107 ; WX 456 ; N k ; B 48 0 449 729 ;
XC 108 ; WX 228 ; N l ; B 55 0 170 729 ;
XC 109 ; WX 729 ; N m ; B 49 0 676 553 ;
XC 110 ; WX 501 ; N n ; B 52 0 448 551 ;
XC 111 ; WX 501 ; N o ; B 29 -23 467 551 ;
XC 112 ; WX 501 ; N p ; B 47 -219 471 551 ;
XC 113 ; WX 501 ; N q ; B 23 -219 446 551 ;
XC 114 ; WX 319 ; N r ; B 52 0 304 553 ;
XC 115 ; WX 456 ; N s ; B 24 -23 426 551 ;
XC 116 ; WX 273 ; N t ; B 12 -23 247 678 ;
XC 117 ; WX 501 ; N u ; B 47 -23 444 542 ;
XC 118 ; WX 456 ; N v ; B 11 0 439 542 ;
XC 119 ; WX 638 ; N w ; B 4 0 628 542 ;
XC 120 ; WX 456 ; N x ; B 13 0 439 542 ;
XC 121 ; WX 456 ; N y ; B 7 -219 441 542 ;
XC 122 ; WX 410 ; N z ; B 17 0 384 542 ;
XC 123 ; WX 319 ; N braceleft ; B 31 -202 260 729 ;
XC 124 ; WX 230 ; N bar ; B 82 -202 148 729 ;
XC 125 ; WX 319 ; N braceright ; B 59 -202 288 729 ;
XC 126 ; WX 479 ; N asciitilde ; B 49 144 426 322 ;
XC 161 ; WX 273 ; N exclamdown ; B 54 -187 177 542 ;
XC 162 ; WX 456 ; N cent ; B 29 -122 427 637 ;
XC 163 ; WX 456 ; N sterling ; B 26 -20 441 717 ;
XC 164 ; WX 137 ; N fraction ; B -141 -20 277 715 ;
XC 165 ; WX 456 ; N yen ; B 4 0 453 705 ;
XC 166 ; WX 456 ; N florin ; B 17 -221 439 745 ;
XC 167 ; WX 456 ; N section ; B 27 -201 425 728 ;
XC 168 ; WX 456 ; N currency ; B 21 105 435 604 ;
XC 169 ; WX 195 ; N quotesingle ; B 41 469 154 729 ;
XC 170 ; WX 410 ; N quotedblleft ; B 58 469 355 729 ;
XC 171 ; WX 456 ; N guillemotleft ; B 72 71 384 484 ;
XC 172 ; WX 273 ; N guilsinglleft ; B 68 73 205 476 ;
XC 173 ; WX 273 ; N guilsinglright ; B 66 73 203 476 ;
XC 174 ; WX 501 ; N fi ; B 8 0 449 729 ;
XC 175 ; WX 501 ; N fl ; B 10 0 448 729 ;
XC 177 ; WX 456 ; N endash ; B -7 208 457 313 ;
XC 178 ; WX 456 ; N dagger ; B 26 -195 429 708 ;
XC 179 ; WX 456 ; N daggerdbl ; B 23 -195 426 708 ;
XC 180 ; WX 228 ; N periodcentered ; B 52 318 154 442 ;
XC 182 ; WX 456 ; N paragraph ; B 16 -195 433 729 ;
XC 183 ; WX 287 ; N bullet ; B 41 175 246 425 ;
XC 184 ; WX 228 ; N quotesinglbase ; B 54 -135 165 125 ;
XC 185 ; WX 410 ; N quotedblbase ; B 59 -164 354 141 ;
XC 186 ; WX 410 ; N quotedblright ; B 60 469 361 729 ;
XC 187 ; WX 456 ; N guillemotright ; B 72 71 379 482 ;
XC 188 ; WX 820 ; N ellipsis ; B 75 0 744 146 ;
XC 189 ; WX 820 ; N perthousand ; B 9 -20 812 745 ;
XC 191 ; WX 501 ; N questiondown ; B 42 -192 447 542 ;
XC 193 ; WX 273 ; N grave ; B 14 595 175 745 ;
XC 194 ; WX 273 ; N acute ; B 99 595 260 745 ;
XC 195 ; WX 273 ; N circumflex ; B 6 598 267 745 ;
XC 196 ; WX 273 ; N tilde ; B -8 595 283 729 ;
XC 197 ; WX 273 ; N macron ; B 13 629 258 717 ;
XC 198 ; WX 273 ; N breve ; B 29 593 245 736 ;
XC 199 ; WX 273 ; N dotaccent ; B 92 607 182 729 ;
XC 200 ; WX 273 ; N dieresis ; B 15 609 257 731 ;
XC 202 ; WX 273 ; N ring ; B 63 565 211 745 ;
XC 203 ; WX 273 ; N cedilla ; B 22 -220 241 -9 ;
XC 205 ; WX 273 ; N hungarumlaut ; B -36 595 279 745 ;
XC 206 ; WX 273 ; N ogonek ; B 37 -195 220 38 ;
XC 207 ; WX 273 ; N caron ; B 7 598 268 745 ;
XC 208 ; WX 820 ; N emdash ; B -6 208 822 313 ;
XC 225 ; WX 820 ; N AE ; B 1 0 792 729 ;
XC 227 ; WX 303 ; N ordfeminine ; B 25 277 270 746 ;
XC 232 ; WX 501 ; N Lslash ; B 0 0 490 729 ;
XC 233 ; WX 638 ; N Oslash ; B 25 -34 619 754 ;
XC 234 ; WX 820 ; N OE ; B 22 -20 795 741 ;
XC 235 ; WX 299 ; N ordmasculine ; B 19 276 281 745 ;
XC 241 ; WX 729 ; N ae ; B 22 -20 703 555 ;
XC 245 ; WX 228 ; N dotlessi ; B 55 0 170 542 ;
XC 248 ; WX 228 ; N lslash ; B 0 0 206 729 ;
XC 249 ; WX 501 ; N oslash ; B 9 -34 490 561 ;
XC 250 ; WX 774 ; N oe ; B 19 -21 754 554 ;
XC 251 ; WX 501 ; N germandbls ; B 55 -16 471 730 ;
XC -1 ; WX 592 ; N Aacute ; B 21 0 576 936 ;


XC -1 ; WX 592 ; N Acircumflex ; B 21 0 576 936 ;

XC -1 ; WX 592 ; N Adieresis ; B 21 0 576 922 ;


XC -1 ; WX 592 ; N Agrave ; B 21 0 576 936 ;
XC -1 ; WX 592 ; N Aring ; B 21 0 576 936 ;

XC -1 ; WX 592 ; N Atilde ; B 21 0 576 920 ;
XC -1 ; WX 592 ; N Ccedilla ; B 36 -220 562 741 ;
XC -1 ; WX 547 ; N Eacute ; B 65 0 512 936 ;
XC -1 ; WX 547 ; N Ecircumflex ; B 65 0 512 936 ;
XC -1 ; WX 547 ; N Edieresis ; B 65 0 512 922 ;
XC -1 ; WX 547 ; N Egrave ; B 65 0 512 936 ;
XC -1 ; WX 592 ; N Eth ; B -15 0 559 729 ;
XC -1 ; WX 228 ; N Iacute ; B 52 0 238 936 ;
XC -1 ; WX 228 ; N Icircumflex ; B -16 0 245 936 ;
XC -1 ; WX 228 ; N Idieresis ; B -7 0 235 922 ;
XC -1 ; WX 228 ; N Igrave ; B -8 0 175 936 ;
XC -1 ; WX 592 ; N Ntilde ; B 56 0 542 920 ;
XC -1 ; WX 638 ; N Oacute ; B 33 -23 608 936 ;
XC -1 ; WX 638 ; N Ocircumflex ; B 33 -23 608 936 ;
XC -1 ; WX 638 ; N Odieresis ; B 33 -23 608 922 ;
XC -1 ; WX 638 ; N Ograve ; B 33 -23 608 936 ;
XC -1 ; WX 638 ; N Otilde ; B 33 -23 608 920 ;
XC -1 ; WX 547 ; N Scaron ; B 27 -23 519 936 ;
XC -1 ; WX 547 ; N Thorn ; B 62 0 519 729 ;
XC -1 ; WX 592 ; N Uacute ; B 62 -23 536 936 ;
XC -1 ; WX 592 ; N Ucircumflex ; B 62 -23 536 936 ;
XC -1 ; WX 592 ; N Udieresis ; B 62 -23 536 922 ;
XC -1 ; WX 592 ; N Ugrave ; B 62 -23 536 936 ;
XC -1 ; WX 547 ; N Yacute ; B 22 0 533 932 ;
XC -1 ; WX 547 ; N Ydieresis ; B 22 0 533 922 ;
XC -1 ; WX 501 ; N Zcaron ; B 25 0 474 936 ;
XC -1 ; WX 456 ; N aacute ; B 22 -24 429 745 ;
XC -1 ; WX 456 ; N acircumflex ; B 22 -24 429 745 ;
XC -1 ; WX 456 ; N adieresis ; B 22 -24 429 731 ;
XC -1 ; WX 456 ; N agrave ; B 22 -24 429 745 ;
XC -1 ; WX 456 ; N aring ; B 22 -24 429 745 ;
XC -1 ; WX 456 ; N atilde ; B 22 -24 429 729 ;
XC -1 ; WX 230 ; N brokenbar ; B 82 -202 148 729 ;
XC -1 ; WX 456 ; N ccedilla ; B 28 -220 428 551 ;
XC -1 ; WX 604 ; N copyright ; B -11 -20 616 745 ;
XC -1 ; WX 328 ; N degree ; B 41 425 287 725 ;
XC -1 ; WX 479 ; N divide ; B 41 -10 437 474 ;
XC -1 ; WX 456 ; N eacute ; B 18 -23 431 745 ;
XC -1 ; WX 456 ; N ecircumflex ; B 18 -23 431 745 ;
XC -1 ; WX 456 ; N edieresis ; B 18 -23 431 731 ;
XC -1 ; WX 456 ; N egrave ; B 18 -23 431 745 ;
XC -1 ; WX 501 ; N eth ; B 29 -23 467 730 ;
XC -1 ; WX 228 ; N iacute ; B 55 0 238 745 ;
XC -1 ; WX 228 ; N icircumflex ; B -16 0 245 745 ;
XC -1 ; WX 228 ; N idieresis ; B -7 0 235 731 ;
XC -1 ; WX 228 ; N igrave ; B -8 0 170 745 ;
XC -1 ; WX 479 ; N logicalnot ; B 33 121 446 412 ;
XC -1 ; WX 479 ; N minus ; B 33 174 446 290 ;
XC -1 ; WX 501 ; N mu ; B 47 -219 444 542 ;
XC -1 ; WX 479 ; N multiply ; B 41 -10 438 474 ;
XC -1 ; WX 501 ; N ntilde ; B 52 0 448 729 ;
XC -1 ; WX 501 ; N oacute ; B 29 -23 467 745 ;
XC -1 ; WX 501 ; N ocircumflex ; B 29 -23 467 745 ;
XC -1 ; WX 501 ; N odieresis ; B 29 -23 467 731 ;
XC -1 ; WX 501 ; N ograve ; B 29 -23 467 745 ;
XC -1 ; WX 684 ; N onehalf ; B 24 -20 658 715 ;
XC -1 ; WX 684 ; N onequarter ; B 24 -20 659 715 ;
XC -1 ; WX 273 ; N onesuperior ; B 37 284 203 709 ;
XC -1 ; WX 501 ; N otilde ; B 29 -23 467 729 ;
XC -1 ; WX 479 ; N plusminus ; B 32 0 446 674 ;
XC -1 ; WX 604 ; N registered ; B -11 -20 616 745 ;
XC -1 ; WX 456 ; N scaron ; B 24 -23 426 745 ;
XC -1 ; WX 501 ; N thorn ; B 47 -219 470 729 ;
XC -1 ; WX 684 ; N threequarters ; B 24 -20 659 725 ;
XC -1 ; WX 273 ; N threesuperior ; B 6 271 266 720 ;
XC -1 ; WX 820 ; N trademark ; B 58 341 762 745 ;
XC -1 ; WX 273 ; N twosuperior ; B 7 284 265 719 ;
XC -1 ; WX 501 ; N uacute ; B 47 -23 444 745 ;
XC -1 ; WX 501 ; N ucircumflex ; B 47 -23 444 745 ;
XC -1 ; WX 501 ; N udieresis ; B 47 -23 444 731 ;
XC -1 ; WX 501 ; N ugrave ; B 47 -23 444 745 ;
XC -1 ; WX 456 ; N yacute ; B 7 -219 441 745 ;
XC -1 ; WX 456 ; N ydieresis ; B 7 -219 441 731 ;
XC -1 ; WX 410 ; N zcaron ; B 17 0 384 745 ;


XEndCharMetrics
XStartKernData
XStartKernPairs 101
X

XKPX A y -30
XKPX A w -14
XKPX A v -30
XKPX A space -30
XKPX A quoteright -45
XKPX A Y -75
XKPX A W -45


XKPX A V -60
XKPX A T -60
X
XKPX F period -91
XKPX F comma -91
XKPX F A -45
X
XKPX L y -30

XKPX L space -14
XKPX L quoteright -45
XKPX L Y -75

XKPX L W -45


XKPX L V -60
XKPX L T -60
X
XKPX P space -14
XKPX P period -105
XKPX P comma -105
XKPX P A -60
X

XKPX R Y -30
XKPX R W -14
XKPX R V -14

X
XKPX T y -60
XKPX T w -60
XKPX T u -60

XKPX T semicolon -91
XKPX T s -60
XKPX T r -45
XKPX T period -91
XKPX T o -60
XKPX T i -14
XKPX T hyphen -45
XKPX T e -60


XKPX T comma -91
XKPX T colon -91

XKPX T c -60
XKPX T a -60


XKPX T O -14
XKPX T A -60
X
XKPX V y -30
XKPX V u -30

XKPX V semicolon -45
XKPX V r -45
XKPX V period -75
XKPX V o -60


XKPX V i -14
XKPX V hyphen -45
XKPX V e -45
XKPX V comma -75

XKPX V colon -45
XKPX V a -45


XKPX V A -60
X

XKPX W y -14


XKPX W u -14
XKPX W semicolon -14
XKPX W r -14
XKPX W period -45
XKPX W o -14

XKPX W i -7
XKPX W hyphen -16


XKPX W e -14
XKPX W comma -45
XKPX W colon -14
XKPX W a -30

XKPX W A -45


X
XKPX Y v -45
XKPX Y u -45
XKPX Y space -14

XKPX Y semicolon -60
XKPX Y q -60
XKPX Y period -91
XKPX Y p -45
XKPX Y o -60
XKPX Y i -30
XKPX Y hyphen -45
XKPX Y e -45
XKPX Y comma -91
XKPX Y colon -60
XKPX Y a -45
XKPX Y A -75


X
XKPX f quoteright 14
X

XKPX one one -45


X
XKPX quoteleft quoteleft -30
X
XKPX quoteright space -45

XKPX quoteright s -30


XKPX quoteright quoteright -30
X
XKPX r quoteright 30

XKPX r period -45
XKPX r comma -45
X
XKPX space Y -14

XKPX space A -30
X
XKPX v period -60
XKPX v comma -60
X

XKPX w period -30
XKPX w comma -30

X
XKPX y period -60
XKPX y comma -60
XEndKernPairs
XEndKernData
XStartComposites 58

XCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 113 191 ;


XCC zcaron 2 ; PCC z 0 0 ; PCC caron 68 0 ;

XCC Scaron 2 ; PCC S 0 0 ; PCC caron 136 191 ;
XCC scaron 2 ; PCC s 0 0 ; PCC caron 91 0 ;


XCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 172 0 ;

XCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 97 0 ;
XCC Yacute 2 ; PCC Y 0 0 ; PCC acute 136 187 ;
XCC yacute 2 ; PCC y 0 0 ; PCC acute 91 0 ;
XCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 136 191 ;
XCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 91 0 ;
XCC Uacute 2 ; PCC U 0 0 ; PCC acute 162 191 ;
XCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 162 191 ;
XCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 162 191 ;
XCC Ugrave 2 ; PCC U 0 0 ; PCC grave 162 191 ;
XCC uacute 2 ; PCC u 0 0 ; PCC acute 113 0 ;
XCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 113 0 ;
XCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 113 0 ;
XCC ugrave 2 ; PCC u 0 0 ; PCC grave 113 0 ;
XCC Iacute 2 ; PCC I 0 0 ; PCC acute -22 191 ;
XCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex -22 191 ;
XCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis -22 191 ;
XCC Igrave 2 ; PCC I 0 0 ; PCC grave -22 191 ;


XCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -22 0 ;
XCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -22 0 ;
XCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -22 0 ;
XCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -22 0 ;

XCC Eacute 2 ; PCC E 0 0 ; PCC acute 157 191 ;
XCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 157 191 ;
XCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 157 191 ;
XCC Egrave 2 ; PCC E 0 0 ; PCC grave 157 191 ;
XCC eacute 2 ; PCC e 0 0 ; PCC acute 91 0 ;
XCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 91 0 ;
XCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 91 0 ;
XCC egrave 2 ; PCC e 0 0 ; PCC grave 91 0 ;
XCC Aacute 2 ; PCC A 0 0 ; PCC acute 162 191 ;
XCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 162 191 ;
XCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 162 191 ;
XCC Agrave 2 ; PCC A 0 0 ; PCC grave 162 191 ;


XCC aacute 2 ; PCC a 0 0 ; PCC acute 91 0 ;
XCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 91 0 ;
XCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 91 0 ;
XCC agrave 2 ; PCC a 0 0 ; PCC grave 91 0 ;

XCC Oacute 2 ; PCC O 0 0 ; PCC acute 182 191 ;
XCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 182 191 ;
XCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 182 191 ;
XCC Ograve 2 ; PCC O 0 0 ; PCC grave 182 191 ;
XCC oacute 2 ; PCC o 0 0 ; PCC acute 113 0 ;
XCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 113 0 ;
XCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 113 0 ;
XCC ograve 2 ; PCC o 0 0 ; PCC grave 113 0 ;
XCC Atilde 2 ; PCC A 0 0 ; PCC tilde 162 191 ;


XCC atilde 2 ; PCC a 0 0 ; PCC tilde 91 0 ;

XCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 165 191 ;
XCC ntilde 2 ; PCC n 0 0 ; PCC tilde 120 0 ;
XCC Otilde 2 ; PCC O 0 0 ; PCC tilde 182 191 ;
XCC otilde 2 ; PCC o 0 0 ; PCC tilde 113 0 ;
XCC Aring 2 ; PCC A 0 0 ; PCC ring 162 191 ;


XCC aring 2 ; PCC a 0 0 ; PCC ring 91 0 ;
XEndComposites
XEndFontMetrics
END_OF_FILE

if test 15497 -ne `wc -c <'lout/font0/HelveNarBol.AFM'`; then
echo shar: \"'lout/font0/HelveNarBol.AFM'\" unpacked with wrong size!
fi
# end of 'lout/font0/HelveNarBol.AFM'
fi
if test -f 'lout/font0/NewCenSchRom.AFM' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/font0/NewCenSchRom.AFM'\"
else
echo shar: Extracting \"'lout/font0/NewCenSchRom.AFM'\" \(15495 characters\)
sed "s/^X//" >'lout/font0/NewCenSchRom.AFM' <<'END_OF_FILE'


XStartFontMetrics 2.0
XComment Copyright (c) 1984 Adobe Systems Incorporated. All Rights Reserved.

XComment Creation Date:Fri Apr 10 13:22:29 PST 1987
XFontName NewCenturySchlbk-Roman
XEncodingScheme AdobeStandardEncoding
XFullName New Century Schoolbook Roman
XFamilyName New Century Schoolbook
XWeight Roman
XItalicAngle 0.0
XIsFixedPitch false
XUnderlinePosition -103
XUnderlineThickness 61
XVersion 001.004
XNotice New Century Schoobook is a trademark of Allied Corporation.
XFontBBox -217 -215 1000 980
XCapHeight 722
XXHeight 464


XDescender -205
XAscender 737
XStartCharMetrics 228

XC 32 ; WX 278 ; N space ; B 0 0 0 0 ;

XC 33 ; WX 296 ; N exclam ; B 87 -15 212 737 ;
XC 34 ; WX 389 ; N quotedbl ; B 61 497 328 737 ;
XC 35 ; WX 556 ; N numbersign ; B 33 0 524 690 ;
XC 36 ; WX 556 ; N dollar ; B 45 -129 510 804 ;
XC 37 ; WX 833 ; N percent ; B 45 -17 792 707 ;
XC 38 ; WX 815 ; N ampersand ; B 51 -15 775 737 ;
XC 39 ; WX 204 ; N quoteright ; B 24 443 178 737 ;
XC 40 ; WX 333 ; N parenleft ; B 36 -124 279 737 ;
XC 41 ; WX 333 ; N parenright ; B 54 -124 297 737 ;
XC 42 ; WX 500 ; N asterisk ; B 56 306 443 737 ;
XC 43 ; WX 606 ; N plus ; B 51 -13 555 492 ;
XC 44 ; WX 278 ; N comma ; B 64 -184 218 109 ;
XC 45 ; WX 333 ; N hyphen ; B 42 197 291 279 ;
XC 46 ; WX 278 ; N period ; B 74 -15 199 109 ;


XC 47 ; WX 278 ; N slash ; B -23 -15 302 737 ;

XC 48 ; WX 556 ; N zero ; B 42 -15 514 705 ;
XC 49 ; WX 556 ; N one ; B 102 0 494 705 ;
XC 50 ; WX 556 ; N two ; B 35 -4 505 705 ;
XC 51 ; WX 556 ; N three ; B 42 -15 498 705 ;
XC 52 ; WX 556 ; N four ; B 28 0 527 705 ;
XC 53 ; WX 556 ; N five ; B 45 -15 502 705 ;
XC 54 ; WX 556 ; N six ; B 42 -15 516 705 ;
XC 55 ; WX 556 ; N seven ; B 59 -15 508 705 ;
XC 56 ; WX 556 ; N eight ; B 41 -15 513 705 ;
XC 57 ; WX 556 ; N nine ; B 39 -15 513 705 ;
XC 58 ; WX 278 ; N colon ; B 86 -15 211 475 ;
XC 59 ; WX 278 ; N semicolon ; B 72 -189 226 475 ;
XC 60 ; WX 606 ; N less ; B 49 -25 558 503 ;
XC 61 ; WX 606 ; N equal ; B 51 104 555 374 ;
XC 62 ; WX 606 ; N greater ; B 48 -25 557 503 ;
XC 63 ; WX 444 ; N question ; B 25 -15 411 737 ;
XC 64 ; WX 737 ; N at ; B 43 -15 705 737 ;
XC 65 ; WX 722 ; N A ; B -8 0 731 737 ;
XC 66 ; WX 722 ; N B ; B 30 0 670 722 ;
XC 67 ; WX 722 ; N C ; B 45 -15 668 737 ;
XC 68 ; WX 778 ; N D ; B 29 0 732 722 ;
XC 69 ; WX 722 ; N E ; B 29 0 663 722 ;
XC 70 ; WX 667 ; N F ; B 29 0 638 722 ;
XC 71 ; WX 778 ; N G ; B 42 -15 772 737 ;
XC 72 ; WX 833 ; N H ; B 29 0 804 722 ;
XC 73 ; WX 407 ; N I ; B 38 0 369 722 ;
XC 74 ; WX 556 ; N J ; B 5 -15 537 722 ;
XC 75 ; WX 778 ; N K ; B 30 0 803 722 ;
XC 76 ; WX 667 ; N L ; B 35 0 646 722 ;
XC 77 ; WX 944 ; N M ; B 22 0 913 722 ;
XC 78 ; WX 815 ; N N ; B 19 -15 794 722 ;
XC 79 ; WX 778 ; N O ; B 45 -15 733 737 ;
XC 80 ; WX 667 ; N P ; B 28 0 649 722 ;
XC 81 ; WX 778 ; N Q ; B 45 -189 748 737 ;
XC 82 ; WX 722 ; N R ; B 26 -15 713 722 ;
XC 83 ; WX 630 ; N S ; B 51 -15 590 737 ;
XC 84 ; WX 667 ; N T ; B 19 0 648 722 ;
XC 85 ; WX 815 ; N U ; B 17 -15 799 722 ;
XC 86 ; WX 722 ; N V ; B -8 -15 731 722 ;
XC 87 ; WX 981 ; N W ; B 6 -15 976 722 ;
XC 88 ; WX 704 ; N X ; B -6 0 716 722 ;
XC 89 ; WX 704 ; N Y ; B -13 0 713 722 ;
XC 90 ; WX 611 ; N Z ; B 24 0 575 722 ;
XC 91 ; WX 333 ; N bracketleft ; B 66 -109 297 722 ;
XC 92 ; WX 606 ; N backslash ; B 74 0 532 737 ;
XC 93 ; WX 333 ; N bracketright ; B 36 -108 266 723 ;
XC 94 ; WX 606 ; N asciicircum ; B 52 317 554 722 ;
XC 95 ; WX 500 ; N underscore ; B 0 -134 500 -73 ;
XC 96 ; WX 204 ; N quoteleft ; B 26 443 181 737 ;
XC 97 ; WX 556 ; N a ; B 44 -15 543 479 ;
XC 98 ; WX 556 ; N b ; B 8 -15 520 737 ;
XC 99 ; WX 444 ; N c ; B 34 -15 426 479 ;
XC 100 ; WX 574 ; N d ; B 43 -15 554 737 ;
XC 101 ; WX 500 ; N e ; B 35 -15 465 479 ;
XC 102 ; WX 333 ; N f ; B 19 0 433 737 ; L i fi ; L l fl ;
XC 103 ; WX 537 ; N g ; B 23 -205 542 494 ;
XC 104 ; WX 611 ; N h ; B 15 0 593 737 ;
XC 105 ; WX 315 ; N i ; B 18 0 289 716 ;
XC 106 ; WX 296 ; N j ; B -82 -205 218 716 ;
XC 107 ; WX 593 ; N k ; B 14 0 587 737 ;
XC 108 ; WX 315 ; N l ; B 19 0 287 737 ;
XC 109 ; WX 889 ; N m ; B 23 0 868 479 ;
XC 110 ; WX 611 ; N n ; B 27 0 593 479 ;
XC 111 ; WX 500 ; N o ; B 34 -15 466 479 ;
XC 112 ; WX 574 ; N p ; B 28 -205 535 479 ;
XC 113 ; WX 556 ; N q ; B 36 -205 548 479 ;
XC 114 ; WX 444 ; N r ; B 21 0 435 479 ;
XC 115 ; WX 463 ; N s ; B 51 -15 421 479 ;
XC 116 ; WX 389 ; N t ; B 18 -15 374 666 ;
XC 117 ; WX 611 ; N u ; B 21 -15 594 464 ;
XC 118 ; WX 537 ; N v ; B 8 -15 528 464 ;
XC 119 ; WX 778 ; N w ; B 15 -15 763 464 ;
XC 120 ; WX 537 ; N x ; B 9 0 529 464 ;
XC 121 ; WX 537 ; N y ; B 3 -205 531 464 ;
XC 122 ; WX 481 ; N z ; B 39 0 435 464 ;
XC 123 ; WX 333 ; N braceleft ; B 66 -109 297 722 ;
XC 124 ; WX 606 ; N bar ; B 264 0 342 737 ;
XC 125 ; WX 333 ; N braceright ; B 36 -109 267 722 ;
XC 126 ; WX 606 ; N asciitilde ; B 51 150 555 329 ;
XC 161 ; WX 296 ; N exclamdown ; B 86 -205 211 547 ;
XC 162 ; WX 556 ; N cent ; B 71 -141 479 584 ;
XC 163 ; WX 556 ; N sterling ; B 17 -15 537 705 ;
XC 164 ; WX 167 ; N fraction ; B -217 0 339 705 ;
XC 165 ; WX 556 ; N yen ; B -1 0 557 705 ;
XC 166 ; WX 556 ; N florin ; B 3 -205 541 737 ;
XC 167 ; WX 500 ; N section ; B 58 -147 448 737 ;
XC 168 ; WX 556 ; N currency ; B 26 101 530 603 ;
XC 169 ; WX 204 ; N quotesingle ; B 59 497 145 737 ;
XC 170 ; WX 389 ; N quotedblleft ; B 26 443 365 737 ;
XC 171 ; WX 426 ; N guillemotleft ; B 38 81 388 398 ;
XC 172 ; WX 259 ; N guilsinglleft ; B 38 81 221 398 ;
XC 173 ; WX 259 ; N guilsinglright ; B 39 81 221 399 ;
XC 174 ; WX 611 ; N fi ; B 16 0 588 737 ;
XC 175 ; WX 611 ; N fl ; B 16 0 590 737 ;
XC 177 ; WX 556 ; N endash ; B 0 208 556 269 ;
XC 178 ; WX 500 ; N dagger ; B 44 -147 460 737 ;
XC 179 ; WX 500 ; N daggerdbl ; B 47 -151 462 737 ;
XC 180 ; WX 278 ; N periodcentered ; B 76 177 201 302 ;
XC 182 ; WX 606 ; N paragraph ; B 49 -147 557 722 ;
XC 183 ; WX 606 ; N bullet ; B 134 217 471 554 ;
XC 184 ; WX 204 ; N quotesinglbase ; B 24 -189 178 104 ;
XC 185 ; WX 389 ; N quotedblbase ; B 24 -189 362 104 ;
XC 186 ; WX 389 ; N quotedblright ; B 24 443 362 737 ;
XC 187 ; WX 426 ; N guillemotright ; B 39 80 388 399 ;
XC 188 ; WX 1000 ; N ellipsis ; B 104 -15 895 109 ;
XC 189 ; WX 1000 ; N perthousand ; B 2 0 991 699 ;
XC 191 ; WX 444 ; N questiondown ; B 30 -205 416 547 ;
XC 193 ; WX 333 ; N grave ; B 17 528 242 699 ;
XC 194 ; WX 333 ; N acute ; B 91 528 316 699 ;
XC 195 ; WX 333 ; N circumflex ; B 10 528 323 694 ;
XC 196 ; WX 333 ; N tilde ; B 1 553 332 659 ;
XC 197 ; WX 333 ; N macron ; B 10 568 323 622 ;
XC 198 ; WX 333 ; N breve ; B 25 528 308 685 ;
XC 199 ; WX 333 ; N dotaccent ; B 117 544 217 644 ;
XC 200 ; WX 333 ; N dieresis ; B 17 544 316 644 ;
XC 202 ; WX 333 ; N ring ; B 67 523 266 722 ;
XC 203 ; WX 333 ; N cedilla ; B 29 -215 237 0 ;
XC 205 ; WX 333 ; N hungarumlaut ; B 45 554 288 714 ;
XC 206 ; WX 333 ; N ogonek ; B 68 -163 246 0 ;
XC 207 ; WX 333 ; N caron ; B 10 528 323 694 ;
XC 208 ; WX 1000 ; N emdash ; B 0 208 1000 269 ;
XC 225 ; WX 1000 ; N AE ; B 0 0 963 722 ;
XC 227 ; WX 334 ; N ordfeminine ; B 5 324 329 722 ;
XC 232 ; WX 667 ; N Lslash ; B 34 0 645 722 ;
XC 233 ; WX 778 ; N Oslash ; B 30 -74 733 760 ;
XC 234 ; WX 1000 ; N OE ; B 19 0 981 722 ;
XC 235 ; WX 300 ; N ordmasculine ; B 10 324 291 722 ;
XC 241 ; WX 796 ; N ae ; B 36 -15 759 479 ;
XC 245 ; WX 315 ; N dotlessi ; B 18 0 289 464 ;
XC 248 ; WX 315 ; N lslash ; B 19 0 287 737 ;
XC 249 ; WX 500 ; N oslash ; B 34 -102 466 556 ;
XC 250 ; WX 833 ; N oe ; B 34 -15 800 479 ;
XC 251 ; WX 574 ; N germandbls ; B 29 -15 535 737 ;
XC -1 ; WX 722 ; N Aacute ; B -8 0 731 957 ;
XC -1 ; WX 722 ; N Acircumflex ; B -8 0 731 952 ;
XC -1 ; WX 722 ; N Adieresis ; B -8 0 731 902 ;
XC -1 ; WX 722 ; N Agrave ; B -8 0 731 957 ;
XC -1 ; WX 722 ; N Aring ; B -8 0 731 980 ;
XC -1 ; WX 722 ; N Atilde ; B -8 0 731 917 ;
XC -1 ; WX 722 ; N Ccedilla ; B 45 -215 668 737 ;
XC -1 ; WX 722 ; N Eacute ; B 29 0 663 957 ;
XC -1 ; WX 722 ; N Ecircumflex ; B 29 0 663 952 ;
XC -1 ; WX 722 ; N Edieresis ; B 29 0 663 902 ;
XC -1 ; WX 722 ; N Egrave ; B 29 0 663 957 ;
XC -1 ; WX 778 ; N Eth ; B 29 0 732 722 ;
XC -1 ; WX 407 ; N Iacute ; B 38 0 369 957 ;
XC -1 ; WX 407 ; N Icircumflex ; B 38 0 369 952 ;
XC -1 ; WX 407 ; N Idieresis ; B 38 0 369 902 ;
XC -1 ; WX 407 ; N Igrave ; B 38 0 369 957 ;
XC -1 ; WX 815 ; N Ntilde ; B 19 -15 794 917 ;
XC -1 ; WX 778 ; N Oacute ; B 45 -15 733 957 ;
XC -1 ; WX 778 ; N Ocircumflex ; B 45 -15 733 952 ;
XC -1 ; WX 778 ; N Odieresis ; B 45 -15 733 902 ;
XC -1 ; WX 778 ; N Ograve ; B 45 -15 733 957 ;
XC -1 ; WX 778 ; N Otilde ; B 45 -15 733 917 ;
XC -1 ; WX 630 ; N Scaron ; B 51 -15 590 952 ;
XC -1 ; WX 667 ; N Thorn ; B 28 0 649 722 ;
XC -1 ; WX 815 ; N Uacute ; B 17 -15 799 957 ;
XC -1 ; WX 815 ; N Ucircumflex ; B 17 -15 799 952 ;
XC -1 ; WX 815 ; N Udieresis ; B 17 -15 799 902 ;
XC -1 ; WX 815 ; N Ugrave ; B 17 -15 799 957 ;
XC -1 ; WX 704 ; N Yacute ; B -13 0 713 957 ;
XC -1 ; WX 704 ; N Ydieresis ; B -13 0 713 902 ;
XC -1 ; WX 611 ; N Zcaron ; B 24 0 575 952 ;
XC -1 ; WX 556 ; N aacute ; B 44 -15 543 699 ;
XC -1 ; WX 556 ; N acircumflex ; B 44 -15 543 694 ;
XC -1 ; WX 556 ; N adieresis ; B 44 -15 543 644 ;
XC -1 ; WX 556 ; N agrave ; B 44 -15 543 699 ;
XC -1 ; WX 556 ; N aring ; B 44 -15 543 722 ;
XC -1 ; WX 556 ; N atilde ; B 44 -15 543 659 ;
XC -1 ; WX 606 ; N brokenbar ; B 264 0 342 737 ;
XC -1 ; WX 444 ; N ccedilla ; B 34 -215 426 479 ;
XC -1 ; WX 737 ; N copyright ; B -8 -15 744 737 ;
XC -1 ; WX 400 ; N degree ; B 50 405 350 705 ;
XC -1 ; WX 606 ; N divide ; B 51 -13 555 492 ;
XC -1 ; WX 500 ; N eacute ; B 35 -15 465 699 ;
XC -1 ; WX 500 ; N ecircumflex ; B 35 -15 465 694 ;
XC -1 ; WX 500 ; N edieresis ; B 35 -15 465 644 ;
XC -1 ; WX 500 ; N egrave ; B 35 -15 465 699 ;
XC -1 ; WX 500 ; N eth ; B 34 -15 466 740 ;
XC -1 ; WX 315 ; N iacute ; B 18 0 307 699 ;
XC -1 ; WX 315 ; N icircumflex ; B 1 0 314 694 ;
XC -1 ; WX 315 ; N idieresis ; B 8 0 307 644 ;
XC -1 ; WX 315 ; N igrave ; B 8 0 289 699 ;
XC -1 ; WX 606 ; N logicalnot ; B 51 104 555 374 ;
XC -1 ; WX 606 ; N minus ; B 51 201 555 277 ;
XC -1 ; WX 611 ; N mu ; B 21 -205 594 464 ;
XC -1 ; WX 606 ; N multiply ; B 51 -13 555 491 ;
XC -1 ; WX 611 ; N ntilde ; B 27 0 593 659 ;
XC -1 ; WX 500 ; N oacute ; B 34 -15 466 699 ;
XC -1 ; WX 500 ; N ocircumflex ; B 34 -15 466 694 ;
XC -1 ; WX 500 ; N odieresis ; B 34 -15 466 644 ;
XC -1 ; WX 500 ; N ograve ; B 34 -15 466 699 ;
XC -1 ; WX 834 ; N onehalf ; B 39 -2 821 705 ;
XC -1 ; WX 834 ; N onequarter ; B 39 0 795 705 ;
XC -1 ; WX 333 ; N onesuperior ; B 39 282 294 705 ;
XC -1 ; WX 500 ; N otilde ; B 34 -15 466 659 ;
XC -1 ; WX 606 ; N plusminus ; B 51 0 555 492 ;
XC -1 ; WX 737 ; N registered ; B -8 -15 744 737 ;
XC -1 ; WX 463 ; N scaron ; B 51 -15 421 694 ;
XC -1 ; WX 574 ; N thorn ; B 28 -205 535 666 ;
XC -1 ; WX 834 ; N threequarters ; B 28 0 795 705 ;
XC -1 ; WX 333 ; N threesuperior ; B 18 273 314 705 ;
XC -1 ; WX 1000 ; N trademark ; B 45 333 955 737 ;
XC -1 ; WX 333 ; N twosuperior ; B 13 280 319 705 ;
XC -1 ; WX 611 ; N uacute ; B 21 -15 594 699 ;
XC -1 ; WX 611 ; N ucircumflex ; B 21 -15 594 694 ;
XC -1 ; WX 611 ; N udieresis ; B 21 -15 594 644 ;
XC -1 ; WX 611 ; N ugrave ; B 21 -15 594 699 ;
XC -1 ; WX 537 ; N yacute ; B 3 -205 531 699 ;
XC -1 ; WX 537 ; N ydieresis ; B 3 -205 531 644 ;
XC -1 ; WX 481 ; N zcaron ; B 39 0 435 694 ;
XEndCharMetrics
XStartKernData
XStartKernPairs 102


X
XKPX A y -74
XKPX A w -74
XKPX A v -74
XKPX A space -55
XKPX A quoteright -74
XKPX A Y -92

XKPX A W -92
XKPX A V -111

XKPX A T -55
X
XKPX F period -111
XKPX F comma -111

XKPX F A -74
X
XKPX L y -55

XKPX L space -18
XKPX L quoteright -55
XKPX L Y -92


XKPX L W -74
XKPX L V -92
XKPX L T -55
X
XKPX P space -18

XKPX P period -129
XKPX P comma -129
XKPX P A -74
X

XKPX R y -18
XKPX R Y -37

XKPX R W -37


XKPX R V -37
X
XKPX T y -52
XKPX T w -71
XKPX T u -71
XKPX T semicolon -55
XKPX T s -62
XKPX T r -62

XKPX T period -92


XKPX T o -92
XKPX T i -25

XKPX T hyphen -92
XKPX T e -92
XKPX T comma -92


XKPX T colon -55
XKPX T c -81
XKPX T a -62
XKPX T A -55
X

XKPX V y -92
XKPX V u -74
XKPX V semicolon -74
XKPX V r -74
XKPX V period -129
XKPX V o -92
XKPX V i -44
XKPX V hyphen -92


XKPX V e -92
XKPX V comma -129

XKPX V colon -74
XKPX V a -92
XKPX V A -111


X
XKPX W y -74

XKPX W u -55
XKPX W semicolon -37


XKPX W r -55
XKPX W period -111
XKPX W o -55

XKPX W i -37
XKPX W hyphen -37

XKPX W e -55
XKPX W comma -111

XKPX W colon -37
XKPX W a -74

XKPX W A -92
X

XKPX Y v -111
XKPX Y u -92


XKPX Y semicolon -92
XKPX Y q -111
XKPX Y period -111

XKPX Y p -111
XKPX Y o -111


XKPX Y i -44
XKPX Y hyphen -111

XKPX Y e -111


XKPX Y comma -111
XKPX Y colon -92
XKPX Y a -111

XKPX Y A -92
X

XKPX f quoteright 114


X
XKPX one one -55
X

XKPX quoteleft quoteleft -18


X
XKPX quoteright t -18
XKPX quoteright space -55

XKPX quoteright s -37
XKPX quoteright quoteright -18

X
XKPX r quoteright 55

XKPX r period -74
XKPX r hyphen -18


XKPX r comma -74
X
XKPX space Y -37

XKPX space A -55
X


XKPX v period -111
XKPX v comma -111
X
XKPX w period -92
XKPX w comma -92
X

XKPX y period -111
XKPX y comma -111

XEndKernPairs
XEndKernData
XStartComposites 58
XCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 139 258 ;
XCC zcaron 2 ; PCC z 0 0 ; PCC caron 74 0 ;
XCC Scaron 2 ; PCC S 0 0 ; PCC caron 148 258 ;
XCC scaron 2 ; PCC s 0 0 ; PCC caron 65 0 ;


XCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 194 0 ;
XCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 55 0 ;

XCC Yacute 2 ; PCC Y 0 0 ; PCC acute 185 258 ;
XCC yacute 2 ; PCC y 0 0 ; PCC acute 102 0 ;
XCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 185 258 ;
XCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 102 0 ;
XCC Uacute 2 ; PCC U 0 0 ; PCC acute 241 258 ;
XCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 241 258 ;
XCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 241 258 ;
XCC Ugrave 2 ; PCC U 0 0 ; PCC grave 241 258 ;


XCC uacute 2 ; PCC u 0 0 ; PCC acute 139 0 ;
XCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 139 0 ;
XCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 139 0 ;
XCC ugrave 2 ; PCC u 0 0 ; PCC grave 139 0 ;

XCC Iacute 2 ; PCC I 0 0 ; PCC acute 37 258 ;
XCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex 37 258 ;
XCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis 37 258 ;
XCC Igrave 2 ; PCC I 0 0 ; PCC grave 37 258 ;
XCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -9 0 ;
XCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -9 0 ;
XCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -9 0 ;
XCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -9 0 ;
XCC Eacute 2 ; PCC E 0 0 ; PCC acute 194 258 ;
XCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 194 258 ;
XCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 194 258 ;
XCC Egrave 2 ; PCC E 0 0 ; PCC grave 194 258 ;


XCC eacute 2 ; PCC e 0 0 ; PCC acute 83 0 ;
XCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 83 0 ;
XCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 83 0 ;
XCC egrave 2 ; PCC e 0 0 ; PCC grave 83 0 ;

XCC Aacute 2 ; PCC A 0 0 ; PCC acute 194 258 ;
XCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 194 258 ;
XCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 194 258 ;
XCC Agrave 2 ; PCC A 0 0 ; PCC grave 194 258 ;


XCC aacute 2 ; PCC a 0 0 ; PCC acute 111 0 ;
XCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 111 0 ;
XCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 111 0 ;
XCC agrave 2 ; PCC a 0 0 ; PCC grave 111 0 ;

XCC Oacute 2 ; PCC O 0 0 ; PCC acute 222 258 ;
XCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 222 258 ;
XCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 222 258 ;
XCC Ograve 2 ; PCC O 0 0 ; PCC grave 222 258 ;
XCC oacute 2 ; PCC o 0 0 ; PCC acute 83 0 ;
XCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 83 0 ;
XCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 83 0 ;
XCC ograve 2 ; PCC o 0 0 ; PCC grave 83 0 ;
XCC Atilde 2 ; PCC A 0 0 ; PCC tilde 194 258 ;


XCC atilde 2 ; PCC a 0 0 ; PCC tilde 111 0 ;

XCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 241 258 ;


XCC ntilde 2 ; PCC n 0 0 ; PCC tilde 139 0 ;

XCC Otilde 2 ; PCC O 0 0 ; PCC tilde 222 258 ;
XCC otilde 2 ; PCC o 0 0 ; PCC tilde 83 0 ;
XCC Aring 2 ; PCC A 0 0 ; PCC ring 194 258 ;


XCC aring 2 ; PCC a 0 0 ; PCC ring 111 0 ;
XEndComposites
XEndFontMetrics
END_OF_FILE

if test 15495 -ne `wc -c <'lout/font0/NewCenSchRom.AFM'`; then
echo shar: \"'lout/font0/NewCenSchRom.AFM'\" unpacked with wrong size!
fi
# end of 'lout/font0/NewCenSchRom.AFM'
fi
if test -f 'lout/font0/ZapfChaMedIta.AFM' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/font0/ZapfChaMedIta.AFM'\"
else
echo shar: Extracting \"'lout/font0/ZapfChaMedIta.AFM'\" \(15474 characters\)
sed "s/^X//" >'lout/font0/ZapfChaMedIta.AFM' <<'END_OF_FILE'


XStartFontMetrics 2.0
XComment Copyright (c) 1984 Adobe Systems Incorporated. All Rights Reserved.

XComment Creation Date:Tue Apr 21 09:12:34 PST 1987
XFontName ZapfChancery-MediumItalic
XEncodingScheme AdobeStandardEncoding
XFullName ITC Zapf Chancery Medium Italic
XFamilyName ITC Zapf Chancery
XWeight Medium
XItalicAngle -14.0
XIsFixedPitch false
XUnderlinePosition -120
XUnderlineThickness 50
XVersion 001.003
XNotice ITC Zapf Chancery is a registered trademark of International Typeface Corporation.
XFontBBox -133 -257 1078 811
XCapHeight 587
XXHeight 408
XDescender -248
XAscender 678
XStartCharMetrics 228
XC 32 ; WX 220 ; N space ; B 0 0 0 0 ;
XC 33 ; WX 280 ; N exclam ; B 109 -9 347 588 ;
XC 34 ; WX 220 ; N quotedbl ; B 170 494 333 681 ;
XC 35 ; WX 440 ; N numbersign ; B 63 -1 596 575 ;
XC 36 ; WX 440 ; N dollar ; B 60 -145 461 675 ;
XC 37 ; WX 680 ; N percent ; B 162 -7 701 585 ;
XC 38 ; WX 780 ; N ampersand ; B 121 -15 855 558 ;
XC 39 ; WX 240 ; N quoteright ; B 228 455 358 675 ;
XC 40 ; WX 260 ; N parenleft ; B 116 -165 412 667 ;
XC 41 ; WX 220 ; N parenright ; B 17 -164 313 668 ;
XC 42 ; WX 420 ; N asterisk ; B 220 376 512 676 ;
XC 43 ; WX 520 ; N plus ; B 103 0 513 410 ;
XC 44 ; WX 220 ; N comma ; B 30 -98 215 171 ;
XC 45 ; WX 280 ; N hyphen ; B 115 173 300 236 ;
XC 46 ; WX 220 ; N period ; B 107 -9 228 127 ;
XC 47 ; WX 340 ; N slash ; B -6 -168 535 677 ;
XC 48 ; WX 440 ; N zero ; B 94 -7 489 576 ;
XC 49 ; WX 440 ; N one ; B 82 1 434 584 ;
XC 50 ; WX 440 ; N two ; B 47 -17 469 572 ;
XC 51 ; WX 440 ; N three ; B 36 -6 457 576 ;
XC 52 ; WX 440 ; N four ; B 69 -26 455 585 ;
XC 53 ; WX 440 ; N five ; B 67 -8 565 641 ;
XC 54 ; WX 440 ; N six ; B 95 -8 532 585 ;
XC 55 ; WX 440 ; N seven ; B 165 -18 541 612 ;
XC 56 ; WX 440 ; N eight ; B 75 -9 494 573 ;
XC 57 ; WX 440 ; N nine ; B 42 -8 480 576 ;
XC 58 ; WX 260 ; N colon ; B 98 -9 289 408 ;
XC 59 ; WX 240 ; N semicolon ; B 29 -98 277 408 ;
XC 60 ; WX 520 ; N less ; B 120 -17 557 429 ;
XC 61 ; WX 520 ; N equal ; B 108 113 518 297 ;
XC 62 ; WX 520 ; N greater ; B 119 -17 556 429 ;
XC 63 ; WX 380 ; N question ; B 130 -9 497 583 ;
XC 64 ; WX 700 ; N at ; B 102 -15 765 690 ;
XC 65 ; WX 620 ; N A ; B 23 -16 687 593 ;
XC 66 ; WX 600 ; N B ; B 75 0 642 618 ;
XC 67 ; WX 520 ; N C ; B 88 -73 635 592 ;
XC 68 ; WX 700 ; N D ; B 86 0 759 618 ;
XC 69 ; WX 620 ; N E ; B 76 -8 668 587 ;
XC 70 ; WX 580 ; N F ; B 60 -114 733 621 ;
XC 71 ; WX 620 ; N G ; B 118 -236 670 592 ;
XC 72 ; WX 680 ; N H ; B 33 -7 908 681 ;
XC 73 ; WX 380 ; N I ; B 81 0 481 573 ;
XC 74 ; WX 400 ; N J ; B 1 -122 491 573 ;
XC 75 ; WX 660 ; N K ; B 88 -143 851 578 ;
XC 76 ; WX 580 ; N L ; B 33 -6 631 577 ;
XC 77 ; WX 840 ; N M ; B 58 -9 1009 671 ;
XC 78 ; WX 700 ; N N ; B 40 -158 915 682 ;
XC 79 ; WX 600 ; N O ; B 104 -13 652 589 ;
XC 80 ; WX 540 ; N P ; B 37 2 645 602 ;
XC 81 ; WX 600 ; N Q ; B 104 -189 851 589 ;
XC 82 ; WX 600 ; N R ; B 38 -147 826 615 ;
XC 83 ; WX 460 ; N S ; B 0 -67 517 590 ;
XC 84 ; WX 500 ; N T ; B 58 0 718 650 ;
XC 85 ; WX 740 ; N U ; B 116 -10 778 581 ;
XC 86 ; WX 640 ; N V ; B 104 -8 809 689 ;
XC 87 ; WX 880 ; N W ; B 104 -17 1035 677 ;
XC 88 ; WX 560 ; N X ; B 0 -13 671 580 ;
XC 89 ; WX 560 ; N Y ; B 31 -152 763 608 ;
XC 90 ; WX 620 ; N Z ; B 62 -18 675 598 ;
XC 91 ; WX 240 ; N bracketleft ; B 47 -164 404 667 ;
XC 92 ; WX 480 ; N backslash ; B 185 0 484 578 ;
XC 93 ; WX 320 ; N bracketright ; B 23 -164 381 667 ;
XC 94 ; WX 520 ; N asciicircum ; B 212 447 472 681 ;
XC 95 ; WX 500 ; N underscore ; B 0 -145 500 -95 ;
XC 96 ; WX 240 ; N quoteleft ; B 229 435 384 675 ;
XC 97 ; WX 420 ; N a ; B 87 -11 492 415 ;
XC 98 ; WX 420 ; N b ; B 87 -17 466 678 ;
XC 99 ; WX 340 ; N c ; B 87 -13 383 411 ;
XC 100 ; WX 440 ; N d ; B 87 -12 629 678 ;
XC 101 ; WX 340 ; N e ; B 87 -12 380 412 ;
XC 102 ; WX 320 ; N f ; B -99 -247 541 680 ; L i fi ; L l fl ;
XC 103 ; WX 400 ; N g ; B -78 -248 481 409 ;
XC 104 ; WX 440 ; N h ; B 75 -15 506 679 ;
XC 105 ; WX 240 ; N i ; B 81 -12 311 617 ;
XC 106 ; WX 220 ; N j ; B -133 -247 303 617 ;
XC 107 ; WX 440 ; N k ; B 87 -148 655 675 ;
XC 108 ; WX 240 ; N l ; B 87 -11 434 681 ;
XC 109 ; WX 620 ; N m ; B 81 -10 693 413 ;
XC 110 ; WX 460 ; N n ; B 81 -15 520 411 ;
XC 111 ; WX 400 ; N o ; B 87 -13 449 411 ;
XC 112 ; WX 440 ; N p ; B -8 -248 482 411 ;
XC 113 ; WX 400 ; N q ; B 87 -250 485 480 ;
XC 114 ; WX 300 ; N r ; B 81 -10 409 411 ;
XC 115 ; WX 320 ; N s ; B 41 -15 377 410 ;
XC 116 ; WX 320 ; N t ; B 96 -12 392 504 ;
XC 117 ; WX 460 ; N u ; B 82 -12 518 416 ;
XC 118 ; WX 440 ; N v ; B 87 -13 510 438 ;
XC 119 ; WX 680 ; N w ; B 87 -13 757 445 ;
XC 120 ; WX 420 ; N x ; B 70 -159 583 408 ;
XC 121 ; WX 400 ; N y ; B 11 -249 473 415 ;
XC 122 ; WX 440 ; N z ; B 46 -12 475 426 ;
XC 123 ; WX 240 ; N braceleft ; B 105 -164 405 668 ;
XC 124 ; WX 520 ; N bar ; B 314 0 363 578 ;
XC 125 ; WX 240 ; N braceright ; B 10 -164 307 668 ;
XC 126 ; WX 520 ; N asciitilde ; B 86 146 526 261 ;
XC 161 ; WX 280 ; N exclamdown ; B 57 -187 295 410 ;
XC 162 ; WX 440 ; N cent ; B 127 -76 453 647 ;
XC 163 ; WX 440 ; N sterling ; B 4 -54 436 578 ;
XC 164 ; WX 60 ; N fraction ; B -115 -4 280 585 ;
XC 165 ; WX 440 ; N yen ; B -11 0 623 578 ;
XC 166 ; WX 440 ; N florin ; B -49 -247 587 682 ;
XC 167 ; WX 420 ; N section ; B 63 -165 464 576 ;
XC 168 ; WX 440 ; N currency ; B 50 106 480 532 ;
XC 169 ; WX 160 ; N quotesingle ; B 170 494 259 681 ;
XC 170 ; WX 340 ; N quotedblleft ; B 229 435 500 675 ;
XC 171 ; WX 340 ; N guillemotleft ; B 98 -9 404 414 ;
XC 172 ; WX 240 ; N guilsinglleft ; B 98 -9 285 415 ;
XC 173 ; WX 260 ; N guilsinglright ; B 86 -2 284 424 ;
XC 174 ; WX 520 ; N fi ; B -104 -248 606 681 ;
XC 175 ; WX 520 ; N fl ; B -105 -247 710 690 ;
XC 177 ; WX 500 ; N endash ; B 31 173 578 236 ;
XC 178 ; WX 460 ; N dagger ; B 98 -138 529 607 ;
XC 179 ; WX 480 ; N daggerdbl ; B 98 -138 529 608 ;
XC 180 ; WX 220 ; N periodcentered ; B 108 147 229 283 ;
XC 182 ; WX 500 ; N paragraph ; B 29 -247 650 585 ;
XC 183 ; WX 600 ; N bullet ; B 228 117 568 458 ;
XC 184 ; WX 180 ; N quotesinglbase ; B 40 -109 170 111 ;
XC 185 ; WX 280 ; N quotedblbase ; B 41 -109 286 111 ;
XC 186 ; WX 360 ; N quotedblright ; B 228 455 473 675 ;
XC 187 ; WX 380 ; N guillemotright ; B 87 -2 407 424 ;
XC 188 ; WX 1000 ; N ellipsis ; B 106 -9 893 127 ;
XC 189 ; WX 960 ; N perthousand ; B 162 -7 975 585 ;
XC 191 ; WX 400 ; N questiondown ; B 57 -181 425 410 ;
XC 193 ; WX 220 ; N grave ; B 173 444 281 639 ;
XC 194 ; WX 300 ; N acute ; B 205 444 388 639 ;
XC 195 ; WX 340 ; N circumflex ; B 183 442 397 640 ;
XC 196 ; WX 440 ; N tilde ; B 183 481 513 602 ;
XC 197 ; WX 440 ; N macron ; B 183 513 515 569 ;
XC 198 ; WX 440 ; N breve ; B 183 486 516 597 ;
XC 199 ; WX 220 ; N dotaccent ; B 206 480 309 602 ;
XC 200 ; WX 360 ; N dieresis ; B 183 480 419 602 ;
XC 202 ; WX 300 ; N ring ; B 228 452 409 631 ;
XC 203 ; WX 300 ; N cedilla ; B 41 -189 216 6 ;
XC 205 ; WX 400 ; N hungarumlaut ; B 183 444 463 639 ;
XC 206 ; WX 280 ; N ogonek ; B 58 -193 216 -41 ;
XC 207 ; WX 340 ; N caron ; B 234 442 447 640 ;
XC 208 ; WX 1000 ; N emdash ; B 31 173 1078 236 ;
XC 225 ; WX 740 ; N AE ; B 32 -5 798 571 ;
XC 227 ; WX 260 ; N ordfeminine ; B 81 253 324 576 ;
XC 232 ; WX 580 ; N Lslash ; B 33 -6 631 577 ;
XC 233 ; WX 660 ; N Oslash ; B 110 -128 707 687 ;
XC 234 ; WX 820 ; N OE ; B 104 -12 870 588 ;
XC 235 ; WX 260 ; N ordmasculine ; B 98 253 323 576 ;
XC 241 ; WX 540 ; N ae ; B 87 -13 588 441 ;
XC 245 ; WX 240 ; N dotlessi ; B 81 -11 311 412 ;
XC 248 ; WX 300 ; N lslash ; B 87 -11 491 681 ;
XC 249 ; WX 440 ; N oslash ; B 92 -147 467 545 ;
XC 250 ; WX 560 ; N oe ; B 88 -13 602 409 ;
XC 251 ; WX 420 ; N germandbls ; B -127 -248 506 681 ;
XC -1 ; WX 620 ; N Aacute ; B 23 -16 687 810 ;
XC -1 ; WX 620 ; N Acircumflex ; B 23 -16 687 811 ;
XC -1 ; WX 620 ; N Adieresis ; B 23 -16 699 773 ;
XC -1 ; WX 620 ; N Agrave ; B 23 -16 687 810 ;
XC -1 ; WX 620 ; N Aring ; B 23 -16 687 802 ;
XC -1 ; WX 620 ; N Atilde ; B 23 -16 753 773 ;
XC -1 ; WX 520 ; N Ccedilla ; B 88 -257 635 592 ;
XC -1 ; WX 620 ; N Eacute ; B 76 -8 668 810 ;
XC -1 ; WX 620 ; N Ecircumflex ; B 76 -8 668 811 ;
XC -1 ; WX 620 ; N Edieresis ; B 76 -8 668 773 ;
XC -1 ; WX 620 ; N Egrave ; B 76 -8 668 810 ;
XC -1 ; WX 700 ; N Eth ; B 86 0 759 618 ;
XC -1 ; WX 380 ; N Iacute ; B 81 0 528 810 ;
XC -1 ; WX 380 ; N Icircumflex ; B 81 0 487 811 ;
XC -1 ; WX 380 ; N Idieresis ; B 81 0 481 773 ;
XC -1 ; WX 380 ; N Igrave ; B 81 0 481 810 ;
XC -1 ; WX 700 ; N Ntilde ; B 40 -158 915 773 ;
XC -1 ; WX 600 ; N Oacute ; B 104 -13 652 810 ;
XC -1 ; WX 600 ; N Ocircumflex ; B 104 -13 652 811 ;
XC -1 ; WX 600 ; N Odieresis ; B 104 -13 652 773 ;
XC -1 ; WX 600 ; N Ograve ; B 104 -13 652 810 ;
XC -1 ; WX 600 ; N Otilde ; B 104 -13 678 773 ;
XC -1 ; WX 460 ; N Scaron ; B 0 -67 607 811 ;
XC -1 ; WX 540 ; N Thorn ; B 37 2 619 573 ;
XC -1 ; WX 740 ; N Uacute ; B 116 -10 778 810 ;
XC -1 ; WX 740 ; N Ucircumflex ; B 116 -10 778 811 ;
XC -1 ; WX 740 ; N Udieresis ; B 116 -10 778 773 ;
XC -1 ; WX 740 ; N Ugrave ; B 116 -10 778 810 ;
XC -1 ; WX 560 ; N Yacute ; B 31 -152 763 810 ;
XC -1 ; WX 560 ; N Ydieresis ; B 31 -152 763 773 ;
XC -1 ; WX 620 ; N Zcaron ; B 62 -18 675 811 ;
XC -1 ; WX 420 ; N aacute ; B 87 -11 492 639 ;
XC -1 ; WX 420 ; N acircumflex ; B 87 -11 492 640 ;
XC -1 ; WX 420 ; N adieresis ; B 87 -11 492 602 ;
XC -1 ; WX 420 ; N agrave ; B 87 -11 492 639 ;
XC -1 ; WX 420 ; N aring ; B 87 -11 492 631 ;
XC -1 ; WX 420 ; N atilde ; B 87 -11 503 602 ;
XC -1 ; WX 520 ; N brokenbar ; B 314 0 363 578 ;
XC -1 ; WX 340 ; N ccedilla ; B 61 -189 383 411 ;
XC -1 ; WX 740 ; N copyright ; B 136 -10 830 683 ;
XC -1 ; WX 400 ; N degree ; B 190 336 430 576 ;
XC -1 ; WX 520 ; N divide ; B 103 0 513 410 ;
XC -1 ; WX 340 ; N eacute ; B 87 -12 408 639 ;
XC -1 ; WX 340 ; N ecircumflex ; B 87 -12 397 640 ;
XC -1 ; WX 340 ; N edieresis ; B 87 -12 409 602 ;
XC -1 ; WX 340 ; N egrave ; B 87 -12 380 639 ;
XC -1 ; WX 400 ; N eth ; B 87 -13 557 681 ;
XC -1 ; WX 240 ; N iacute ; B 81 -11 358 639 ;
XC -1 ; WX 240 ; N icircumflex ; B 81 -11 347 640 ;
XC -1 ; WX 240 ; N idieresis ; B 81 -11 359 602 ;
XC -1 ; WX 240 ; N igrave ; B 81 -11 311 639 ;
XC -1 ; WX 520 ; N logicalnot ; B 55 33 559 297 ;
XC -1 ; WX 520 ; N minus ; B 55 180 559 230 ;
XC -1 ; WX 460 ; N mu ; B 15 -249 518 416 ;
XC -1 ; WX 520 ; N multiply ; B 103 0 513 410 ;
XC -1 ; WX 460 ; N ntilde ; B 81 -15 523 602 ;
XC -1 ; WX 400 ; N oacute ; B 87 -13 449 639 ;
XC -1 ; WX 400 ; N ocircumflex ; B 87 -13 449 640 ;
XC -1 ; WX 400 ; N odieresis ; B 87 -13 449 602 ;
XC -1 ; WX 400 ; N ograve ; B 87 -13 449 639 ;
XC -1 ; WX 660 ; N onehalf ; B 96 -9 659 585 ;
XC -1 ; WX 660 ; N onequarter ; B 96 -16 653 585 ;
XC -1 ; WX 264 ; N onesuperior ; B 86 230 314 579 ;
XC -1 ; WX 400 ; N otilde ; B 87 -13 493 602 ;
XC -1 ; WX 520 ; N plusminus ; B 103 0 513 410 ;
XC -1 ; WX 740 ; N registered ; B 135 -10 828 683 ;
XC -1 ; WX 320 ; N scaron ; B 41 -15 437 640 ;
XC -1 ; WX 440 ; N thorn ; B -8 -248 482 678 ;
XC -1 ; WX 660 ; N threequarters ; B 79 -16 663 585 ;
XC -1 ; WX 264 ; N threesuperior ; B 69 224 343 573 ;
XC -1 ; WX 1000 ; N trademark ; B 165 269 1050 673 ;
XC -1 ; WX 264 ; N twosuperior ; B 80 219 354 572 ;
XC -1 ; WX 460 ; N uacute ; B 82 -12 518 639 ;
XC -1 ; WX 460 ; N ucircumflex ; B 82 -12 518 640 ;
XC -1 ; WX 460 ; N udieresis ; B 82 -12 518 602 ;
XC -1 ; WX 460 ; N ugrave ; B 82 -12 518 639 ;
XC -1 ; WX 400 ; N yacute ; B 11 -249 473 639 ;
XC -1 ; WX 400 ; N ydieresis ; B 11 -249 473 602 ;
XC -1 ; WX 440 ; N zcaron ; B 46 -12 497 640 ;
XEndCharMetrics
XStartKernData
XStartKernPairs 104
X
XKPX A y 3
XKPX A w -12
XKPX A v -10
XKPX A Y 19
XKPX A W -21
XKPX A V -20
XKPX A T 25
X
XKPX F period -137
XKPX F comma -63
XKPX F A -64
X
XKPX L y 0
XKPX L Y -20
XKPX L W -40
XKPX L V -40


XKPX L T -20
X

XKPX P period -66
XKPX P comma -69
XKPX P A 16
X
XKPX R y 32
XKPX R Y 70
XKPX R W 6
XKPX R V 6
XKPX R T 51
X
XKPX S t -20
XKPX S p -10
X
XKPX T y 2
XKPX T w 0
XKPX T u -1
XKPX T semicolon 50
XKPX T s 0
XKPX T r -2
XKPX T period -2
XKPX T o -19
XKPX T i 40
XKPX T hyphen -10
XKPX T e -15
XKPX T comma 29
XKPX T colon 34
XKPX T c -6
XKPX T a -8
XKPX T A 15


X
XKPX V y 0

XKPX V u 0
XKPX V r 0
XKPX V o -50
XKPX V i 21
XKPX V e -50
XKPX V a -50
XKPX V semicolon 27
XKPX V period -72
XKPX V hyphen -10
XKPX V comma -16
XKPX V colon -11
XKPX V A -14
X
XKPX W y 15
XKPX W u 15
XKPX W semicolon 4
XKPX W r 15
XKPX W period -96
XKPX W o -25
XKPX W i 15
XKPX W hyphen -10
XKPX W e -25
XKPX W comma -38
XKPX W colon -24
XKPX W a -25
XKPX W A -7
X
XKPX Y v -22
XKPX Y u -8
XKPX Y semicolon 25
XKPX Y q -64
XKPX Y period -65
XKPX Y p -4
XKPX Y o -65
XKPX Y i 40
XKPX Y hyphen -10
XKPX Y e -60
XKPX Y comma 0
XKPX Y colon -4
XKPX Y a -63
XKPX Y A -24
X
XKPX a t -10
X
XKPX d t -10
X
XKPX f f -57
X
XKPX g g 20
X
XKPX o t -20
X
XKPX r r 20
XKPX r q 0
XKPX r period -45
XKPX r o -8
XKPX r n 45
XKPX r m 45
XKPX r l 10
XKPX r hyphen 10
XKPX r h 3
XKPX r g -30
XKPX r f 11
XKPX r e -12
XKPX r d -25
XKPX r comma -40
XKPX r c -16
X
XKPX s t -20
X
XKPX v y 20
X
XKPX w e 20
XEndKernPairs
XEndKernData
XStartComposites 58
XCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 195 172 ;
XCC zcaron 2 ; PCC z 0 0 ; PCC caron 50 0 ;
XCC Scaron 2 ; PCC S 0 0 ; PCC caron 160 172 ;
XCC scaron 2 ; PCC s 0 0 ; PCC caron -10 0 ;
XCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 137 -68 ;
XCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 20 0 ;
XCC Yacute 2 ; PCC Y 0 0 ; PCC acute 130 172 ;
XCC yacute 2 ; PCC y 0 0 ; PCC acute 50 0 ;
XCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 250 172 ;
XCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 20 0 ;
XCC Uacute 2 ; PCC U 0 0 ; PCC acute 320 172 ;
XCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 300 172 ;
XCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 320 172 ;
XCC Ugrave 2 ; PCC U 0 0 ; PCC grave 330 172 ;
XCC uacute 2 ; PCC u 0 0 ; PCC acute 80 0 ;
XCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 60 0 ;
XCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 50 0 ;
XCC ugrave 2 ; PCC u 0 0 ; PCC grave 120 0 ;
XCC Iacute 2 ; PCC I 0 0 ; PCC acute 140 172 ;
XCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex 90 172 ;
XCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis 60 172 ;
XCC Igrave 2 ; PCC I 0 0 ; PCC grave 120 172 ;
XCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -30 0 ;
XCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -50 0 ;
XCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -60 0 ;
XCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave 10 0 ;
XCC Eacute 2 ; PCC E 0 0 ; PCC acute 260 172 ;
XCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 210 172 ;
XCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 205 172 ;
XCC Egrave 2 ; PCC E 0 0 ; PCC grave 255 172 ;
XCC eacute 2 ; PCC e 0 0 ; PCC acute 20 0 ;
XCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 0 0 ;
XCC edieresis 2 ; PCC e 0 0 ; PCC dieresis -10 0 ;
XCC egrave 2 ; PCC e 0 0 ; PCC grave 60 0 ;
XCC Aacute 2 ; PCC A 0 0 ; PCC acute 260 172 ;
XCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 255 172 ;
XCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 280 172 ;
XCC Agrave 2 ; PCC A 0 0 ; PCC grave 300 172 ;
XCC aacute 2 ; PCC a 0 0 ; PCC acute 60 0 ;
XCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 40 0 ;
XCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 30 0 ;
XCC agrave 2 ; PCC a 0 0 ; PCC grave 100 0 ;
XCC Oacute 2 ; PCC O 0 0 ; PCC acute 250 172 ;
XCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 200 172 ;
XCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 225 172 ;
XCC Ograve 2 ; PCC O 0 0 ; PCC grave 245 172 ;
XCC oacute 2 ; PCC o 0 0 ; PCC acute 50 0 ;
XCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 30 0 ;
XCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 20 0 ;
XCC ograve 2 ; PCC o 0 0 ; PCC grave 90 0 ;
XCC Atilde 2 ; PCC A 0 0 ; PCC tilde 240 172 ;
XCC atilde 2 ; PCC a 0 0 ; PCC tilde -10 0 ;
XCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 280 172 ;
XCC ntilde 2 ; PCC n 0 0 ; PCC tilde 10 0 ;
XCC Otilde 2 ; PCC O 0 0 ; PCC tilde 165 172 ;
XCC otilde 2 ; PCC o 0 0 ; PCC tilde -20 0 ;
XCC Aring 2 ; PCC A 0 0 ; PCC ring 275 172 ;
XCC aring 2 ; PCC a 0 0 ; PCC ring 60 0 ;
XEndComposites
XEndFontMetrics
END_OF_FILE
if test 15474 -ne `wc -c <'lout/font0/ZapfChaMedIta.AFM'`; then
echo shar: \"'lout/font0/ZapfChaMedIta.AFM'\" unpacked with wrong size!
fi
# end of 'lout/font0/ZapfChaMedIta.AFM'
fi
echo shar: End of archive 18 \(of 30\).
cp /dev/null ark18isdone

Jeff Kingston

unread,
Jun 1, 1993, 11:02:59 PM6/1/93
to
Submitted-by: je...@joyce.cs.su.oz.au (Jeff Kingston)
Posting-number: Volume 37, Issue 117
Archive-name: lout/part19
Environment: UNIX

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: lout/doc/tr.lout/ch3.19 lout/font0/Couri.AFM
# lout/font0/CouriObl.AFM lout/font0/Helve.AFM
# lout/font0/HelveCon.AFM lout/font0/HelveObl.AFM
# Wrapped by kent@sparky on Sun May 30 19:43:59 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 19 (of 30)."'
if test -f 'lout/doc/tr.lout/ch3.19' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch3.19'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch3.19'\" \(1144 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch3.19' <<'END_OF_FILE'
X@Section
X @Title { The cross reference symbol "&&" }
X @Tag { crossref }
X@Begin
X@PP
XThe cross reference symbol @Code "&&" takes the name of a symbol (not an
Xobject) for its left parameter, and an object whose value must be a
Xsimple word for its right parameter. The result is a cross reference,
Xwhich may be thought of as an arrow pointing from the cross reference
Xsymbol to the beginning of an invocation of the named symbol.
X@PP
XThe invocation pointed to, known as the @I target of the cross
Xreference, is generally one whose @@Tag parameter has value equal
Xto the right parameter of the cross reference symbol. Two special tags,
X@Code preceding and {@Code following}, point respectively
Xto the first invocation preceding the cross reference in the final
Xprinted document, and the first following it.
X@PP
XA cross reference may be used in four ways: where an object is
Xexpected, in which case its value is a copy of the target; with the
X@@Open and @@Use symbols; with the @@Tagged
Xsymbol; and in the @Code into clause of a galley definition, in which
Xcase the value of the tag must be @Code preceding or {@Code following}.
X@End @Section
END_OF_FILE
if test 1144 -ne `wc -c <'lout/doc/tr.lout/ch3.19'`; then
echo shar: \"'lout/doc/tr.lout/ch3.19'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch3.19'
fi
if test -f 'lout/font0/Couri.AFM' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/font0/Couri.AFM'\"
else
echo shar: Extracting \"'lout/font0/Couri.AFM'\" \(15500 characters\)
sed "s/^X//" >'lout/font0/Couri.AFM' <<'END_OF_FILE'
XStartFontMetrics 2.0


XComment Copyright (c) 1985 Adobe Systems Incorporated. All rights reserved.

XComment Creation Date:Tue Dec 15 15:45:40 PST 1987
XComment ERRONEOUS LIGATURE INSTRUCTIONS REMOVED BY JEFF KINGSTON 1 MARCH 1993
XFontName Courier
XEncodingScheme AdobeStandardEncoding
XFullName Courier
XFamilyName Courier
XWeight Medium
XItalicAngle 0.0
XIsFixedPitch true
XUnderlinePosition -82
XUnderlineThickness 40


XVersion 001.005
XNotice Copyright (c) 1985 Adobe Systems Incorporated. All rights reserved.
XFontBBox -200 -451 800 900

XCapHeight 583
XXHeight 437
XDescender -207
XAscender 624
XStartCharMetrics 260
XC 32 ; WX 600 ; N space ; B 560 -40 640 40 ;
XC 33 ; WX 600 ; N exclam ; B 240 -5 360 639 ;
XC 34 ; WX 600 ; N quotedbl ; B 126 314 474 603 ;
XC 35 ; WX 600 ; N numbersign ; B 72 -82 528 665 ;
XC 36 ; WX 600 ; N dollar ; B 93 -113 507 675 ;
XC 37 ; WX 600 ; N percent ; B 67 -35 533 639 ;
XC 38 ; WX 600 ; N ampersand ; B 85 -35 498 540 ;
XC 39 ; WX 600 ; N quoteright ; B 135 304 340 613 ;
XC 40 ; WX 600 ; N parenleft ; B 274 -144 478 623 ;
XC 41 ; WX 600 ; N parenright ; B 127 -144 331 623 ;
XC 42 ; WX 600 ; N asterisk ; B 93 210 507 624 ;
XC 43 ; WX 600 ; N plus ; B 52 12 548 550 ;
XC 44 ; WX 600 ; N comma ; B 135 -155 340 155 ;
XC 45 ; WX 600 ; N hyphen ; B 52 241 548 321 ;
XC 46 ; WX 600 ; N period ; B 250 10 350 90 ;
XC 47 ; WX 600 ; N slash ; B 93 -103 507 686 ;
XC 48 ; WX 600 ; N zero ; B 93 -35 507 639 ;
XC 49 ; WX 600 ; N one ; B 93 -20 507 624 ;
XC 50 ; WX 600 ; N two ; B 64 -20 498 639 ;
XC 51 ; WX 600 ; N three ; B 76 -35 519 639 ;
XC 52 ; WX 600 ; N four ; B 85 -20 498 624 ;
XC 53 ; WX 600 ; N five ; B 76 -35 519 624 ;
XC 54 ; WX 600 ; N six ; B 116 -35 530 639 ;
XC 55 ; WX 600 ; N seven ; B 85 -20 498 624 ;
XC 56 ; WX 600 ; N eight ; B 93 -35 507 639 ;
XC 57 ; WX 600 ; N nine ; B 116 -35 530 639 ;
XC 58 ; WX 600 ; N colon ; B 250 10 350 392 ;
XC 59 ; WX 600 ; N semicolon ; B 139 -116 350 392 ;
XC 60 ; WX 600 ; N less ; B 52 12 548 550 ;
XC 61 ; WX 600 ; N equal ; B 31 168 569 394 ;
XC 62 ; WX 600 ; N greater ; B 52 12 548 550 ;
XC 63 ; WX 600 ; N question ; B 114 -5 507 598 ;
XC 64 ; WX 600 ; N at ; B 85 -82 498 644 ;
XC 65 ; WX 600 ; N A ; B -11 -20 611 583 ;
XC 66 ; WX 600 ; N B ; B 23 -20 561 583 ;
XC 67 ; WX 600 ; N C ; B 43 -35 554 598 ;
XC 68 ; WX 600 ; N D ; B 23 -20 540 583 ;
XC 69 ; WX 600 ; N E ; B 23 -20 540 583 ;
XC 70 ; WX 600 ; N F ; B 23 -20 540 583 ;
XC 71 ; WX 600 ; N G ; B 43 -35 582 598 ;
XC 72 ; WX 600 ; N H ; B 33 -20 571 583 ;
XC 73 ; WX 600 ; N I ; B 93 -20 507 583 ;
XC 74 ; WX 600 ; N J ; B 64 -35 603 583 ;
XC 75 ; WX 600 ; N K ; B 23 -20 592 583 ;
XC 76 ; WX 600 ; N L ; B 43 -20 561 583 ;
XC 77 ; WX 600 ; N M ; B -9 -20 613 583 ;
XC 78 ; WX 600 ; N N ; B 2 -20 582 583 ;
XC 79 ; WX 600 ; N O ; B 31 -35 569 598 ;
XC 80 ; WX 600 ; N P ; B 23 -20 519 583 ;
XC 81 ; WX 600 ; N Q ; B 31 -136 569 598 ;
XC 82 ; WX 600 ; N R ; B 23 -20 609 583 ;
XC 83 ; WX 600 ; N S ; B 72 -35 528 598 ;
XC 84 ; WX 600 ; N T ; B 52 -20 548 583 ;
XC 85 ; WX 600 ; N U ; B 20 -35 580 583 ;
XC 86 ; WX 600 ; N V ; B -11 -20 611 583 ;
XC 87 ; WX 600 ; N W ; B 0 -20 600 583 ;
XC 88 ; WX 600 ; N X ; B 20 -20 580 583 ;
XC 89 ; WX 600 ; N Y ; B 31 -20 569 583 ;
XC 90 ; WX 600 ; N Z ; B 83 -20 517 583 ;
XC 91 ; WX 600 ; N bracketleft ; B 260 -144 465 624 ;
XC 92 ; WX 600 ; N backslash ; B 93 -103 507 686 ;
XC 93 ; WX 600 ; N bracketright ; B 135 -144 340 624 ;
XC 94 ; WX 600 ; N asciicircum ; B 93 335 507 624 ;
XC 95 ; WX 600 ; N underscore ; B -32 -290 632 -210 ;
XC 96 ; WX 600 ; N quoteleft ; B 260 304 465 613 ;
XC 97 ; WX 600 ; N a ; B 52 -35 561 452 ;
XC 98 ; WX 600 ; N b ; B 2 -35 561 624 ;
XC 99 ; WX 600 ; N c ; B 64 -35 555 452 ;
XC 100 ; WX 600 ; N d ; B 43 -35 603 624 ;
XC 101 ; WX 600 ; N e ; B 43 -35 540 452 ;
XC 102 ; WX 600 ; N f ; B 85 -20 561 624 ;
XC 103 ; WX 600 ; N g ; B 43 -207 582 452 ;
XC 104 ; WX 600 ; N h ; B 23 -20 571 624 ;
XC 105 ; WX 600 ; N i ; B 72 -20 528 665 ;
XC 106 ; WX 600 ; N j ; B 127 -207 478 665 ;
XC 107 ; WX 600 ; N k ; B 43 -20 561 624 ;
XC 108 ; WX 600 ; N l ; B 72 -20 528 624 ;
XC 109 ; WX 600 ; N m ; B -9 -20 613 452 ;
XC 110 ; WX 600 ; N n ; B 33 -20 561 452 ;
XC 111 ; WX 600 ; N o ; B 52 -35 548 452 ;
XC 112 ; WX 600 ; N p ; B 2 -207 561 452 ;
XC 113 ; WX 600 ; N q ; B 43 -207 603 452 ;
XC 114 ; WX 600 ; N r ; B 64 -20 561 448 ;
XC 115 ; WX 600 ; N s ; B 83 -35 517 452 ;
XC 116 ; WX 600 ; N t ; B 23 -35 519 582 ;
XC 117 ; WX 600 ; N u ; B 23 -35 561 437 ;
XC 118 ; WX 600 ; N v ; B 10 -20 590 437 ;
XC 119 ; WX 600 ; N w ; B 10 -20 590 437 ;
XC 120 ; WX 600 ; N x ; B 31 -20 569 437 ;
XC 121 ; WX 600 ; N y ; B 31 -207 569 437 ;
XC 122 ; WX 600 ; N z ; B 95 -20 509 437 ;
XC 123 ; WX 600 ; N braceleft ; B 177 -144 423 624 ;
XC 124 ; WX 600 ; N bar ; B 260 -144 340 624 ;
XC 125 ; WX 600 ; N braceright ; B 177 -144 423 624 ;
XC 126 ; WX 600 ; N asciitilde ; B 72 189 528 373 ;
XC 161 ; WX 600 ; N exclamdown ; B 240 -207 360 415 ;
XC 162 ; WX 600 ; N cent ; B 93 -19 489 665 ;
XC 163 ; WX 600 ; N sterling ; B 43 -20 540 598 ;
XC 164 ; WX 600 ; N fraction ; B 31 120 569 492 ;
XC 165 ; WX 600 ; N yen ; B 31 -20 569 583 ;
XC 166 ; WX 600 ; N florin ; B 67 -113 538 639 ;
XC 167 ; WX 600 ; N section ; B 46 -87 554 629 ;
XC 168 ; WX 600 ; N currency ; B 83 75 517 509 ;
XC 169 ; WX 600 ; N quotesingle ; B 230 304 370 613 ;
XC 170 ; WX 600 ; N quotedblleft ; B 93 340 507 619 ;
XC 171 ; WX 600 ; N guillemotleft ; B 43 -20 561 437 ;
XC 172 ; WX 600 ; N guilsinglleft ; B 43 -20 332 437 ;
XC 173 ; WX 600 ; N guilsinglright ; B 273 -20 561 437 ;
XC 174 ; WX 600 ; N fi ; B -10 -20 610 665 ;
XC 175 ; WX 600 ; N fl ; B -10 -20 610 624 ;
XC 177 ; WX 600 ; N endash ; B 52 241 548 321 ;
XC 178 ; WX 600 ; N dagger ; B 104 -82 496 624 ;
XC 179 ; WX 600 ; N daggerdbl ; B 104 -82 496 624 ;
XC 180 ; WX 600 ; N periodcentered ; B 250 266 350 346 ;
XC 182 ; WX 600 ; N paragraph ; B 59 -87 545 629 ;
XC 183 ; WX 600 ; N bullet ; B 260 266 340 346 ;
XC 184 ; WX 600 ; N quotesinglbase ; B 135 -165 340 144 ;
XC 185 ; WX 600 ; N quotedblbase ; B 93 -139 507 139 ;
XC 186 ; WX 600 ; N quotedblright ; B 93 340 507 619 ;
XC 187 ; WX 600 ; N guillemotright ; B 43 -20 561 437 ;
XC 188 ; WX 600 ; N ellipsis ; B 60 -5 540 75 ;
XC 189 ; WX 600 ; N perthousand ; B 10 -35 590 639 ;
XC 191 ; WX 600 ; N questiondown ; B 93 -207 486 415 ;
XC 193 ; WX 600 ; N grave ; B 135 450 340 639 ;
XC 194 ; WX 600 ; N acute ; B 260 450 465 639 ;
XC 195 ; WX 600 ; N circumflex ; B 135 450 465 624 ;
XC 196 ; WX 600 ; N tilde ; B 125 441 475 580 ;
XC 197 ; WX 600 ; N macron ; B 135 476 465 556 ;
XC 198 ; WX 600 ; N breve ; B 135 450 465 624 ;
XC 199 ; WX 600 ; N dotaccent ; B 260 491 340 571 ;
XC 200 ; WX 600 ; N dieresis ; B 156 491 444 571 ;
XC 202 ; WX 600 ; N ring ; B 187 413 413 634 ;
XC 203 ; WX 600 ; N cedilla ; B 190 -186 397 40 ;
XC 205 ; WX 600 ; N hungarumlaut ; B 135 450 465 639 ;
XC 206 ; WX 600 ; N ogonek ; B 260 -165 453 40 ;
XC 207 ; WX 600 ; N caron ; B 135 450 465 624 ;
XC 208 ; WX 600 ; N emdash ; B -19 241 619 321 ;
XC 225 ; WX 600 ; N AE ; B -10 -20 610 583 ;
XC 227 ; WX 600 ; N ordfeminine ; B 127 179 478 598 ;
XC 232 ; WX 600 ; N Lslash ; B 23 -20 561 583 ;
XC 233 ; WX 600 ; N Oslash ; B 20 -61 580 623 ;
XC 234 ; WX 600 ; N OE ; B -10 -20 610 583 ;
XC 235 ; WX 600 ; N ordmasculine ; B 131 179 469 598 ;
XC 241 ; WX 600 ; N ae ; B -10 -35 600 452 ;
XC 245 ; WX 600 ; N dotlessi ; B 72 -20 528 437 ;
XC 248 ; WX 600 ; N lslash ; B 72 -20 528 624 ;
XC 249 ; WX 600 ; N oslash ; B 33 -61 563 478 ;
XC 250 ; WX 600 ; N oe ; B -10 -35 600 452 ;
XC 251 ; WX 600 ; N germandbls ; B 23 -35 519 624 ;
XC -1 ; WX 600 ; N Aacute ; B -11 -20 611 789 ;
XC -1 ; WX 600 ; N Acircumflex ; B -11 -20 611 774 ;
XC -1 ; WX 600 ; N Adieresis ; B -11 -20 611 721 ;
XC -1 ; WX 600 ; N Agrave ; B -11 -20 611 789 ;
XC -1 ; WX 600 ; N Aring ; B -11 -20 611 795 ;
XC -1 ; WX 600 ; N Atilde ; B -11 -20 611 730 ;
XC -1 ; WX 600 ; N Ccedilla ; B 43 -186 554 598 ;
XC -1 ; WX 600 ; N Eacute ; B 23 -20 540 789 ;
XC -1 ; WX 600 ; N Ecircumflex ; B 23 -20 540 774 ;
XC -1 ; WX 600 ; N Edieresis ; B 23 -20 540 721 ;
XC -1 ; WX 600 ; N Egrave ; B 23 -20 540 789 ;
XC -1 ; WX 600 ; N Eth ; B 23 -20 540 583 ;
XC -1 ; WX 600 ; N Gcaron ; B 43 -35 582 774 ;
XC -1 ; WX 600 ; N IJ ; B -10 -35 610 583 ;
XC -1 ; WX 600 ; N Iacute ; B 93 -20 507 789 ;
XC -1 ; WX 600 ; N Icircumflex ; B 93 -20 507 774 ;
XC -1 ; WX 600 ; N Idieresis ; B 93 -20 507 721 ;
XC -1 ; WX 600 ; N Idot ; B 93 -20 507 721 ;
XC -1 ; WX 600 ; N Igrave ; B 93 -20 507 789 ;
XC -1 ; WX 600 ; N LL ; B -20 -20 620 583 ;
XC -1 ; WX 600 ; N Ntilde ; B 2 -20 582 730 ;
XC -1 ; WX 600 ; N Oacute ; B 31 -35 569 789 ;
XC -1 ; WX 600 ; N Ocircumflex ; B 31 -35 569 774 ;
XC -1 ; WX 600 ; N Odieresis ; B 31 -35 569 721 ;
XC -1 ; WX 600 ; N Ograve ; B 31 -35 569 789 ;
XC -1 ; WX 600 ; N Otilde ; B 31 -35 569 730 ;
XC -1 ; WX 600 ; N Scaron ; B 72 -35 528 774 ;
XC -1 ; WX 600 ; N Scedilla ; B 72 -186 528 598 ;
XC -1 ; WX 600 ; N Thorn ; B 23 -20 539 583 ;
XC -1 ; WX 600 ; N Uacute ; B 20 -35 580 789 ;
XC -1 ; WX 600 ; N Ucircumflex ; B 20 -35 580 774 ;
XC -1 ; WX 600 ; N Udieresis ; B 20 -35 580 721 ;
XC -1 ; WX 600 ; N Ugrave ; B 20 -35 580 789 ;
XC -1 ; WX 600 ; N Yacute ; B 31 -20 569 789 ;
XC -1 ; WX 600 ; N Ydieresis ; B 31 -20 569 721 ;
XC -1 ; WX 600 ; N Zcaron ; B 83 -20 517 774 ;
XC -1 ; WX 600 ; N aacute ; B 52 -35 561 660 ;
XC -1 ; WX 600 ; N acircumflex ; B 52 -35 561 653 ;
XC -1 ; WX 600 ; N adieresis ; B 52 -35 561 592 ;
XC -1 ; WX 600 ; N agrave ; B 52 -35 561 660 ;
XC -1 ; WX 600 ; N aring ; B 52 -35 561 686 ;
XC -1 ; WX 600 ; N arrowboth ; B -40 110 640 490 ;
XC -1 ; WX 600 ; N arrowdown ; B 110 -20 490 639 ;
XC -1 ; WX 600 ; N arrowleft ; B -40 110 640 490 ;
XC -1 ; WX 600 ; N arrowright ; B -40 110 640 490 ;
XC -1 ; WX 600 ; N arrowup ; B 110 -20 490 639 ;
XC -1 ; WX 600 ; N atilde ; B 52 -35 561 618 ;
XC -1 ; WX 600 ; N brokenbar ; B 260 -144 340 624 ;
XC -1 ; WX 600 ; N ccedilla ; B 64 -186 555 452 ;
XC -1 ; WX 600 ; N center ; B 0 -20 600 624 ;
XC -1 ; WX 600 ; N copyright ; B -20 -35 620 598 ;
XC -1 ; WX 600 ; N dectab ; B -5 -20 605 248 ;
XC -1 ; WX 600 ; N degree ; B 135 294 465 624 ;
XC -1 ; WX 600 ; N divide ; B 52 51 548 531 ;
XC -1 ; WX 600 ; N down ; B 154 -20 446 452 ;
XC -1 ; WX 600 ; N eacute ; B 43 -35 540 664 ;
XC -1 ; WX 600 ; N ecircumflex ; B 43 -35 540 653 ;
XC -1 ; WX 600 ; N edieresis ; B 43 -35 540 592 ;
XC -1 ; WX 600 ; N egrave ; B 43 -35 540 664 ;
XC -1 ; WX 600 ; N eth ; B 52 -35 548 639 ;
XC -1 ; WX 600 ; N format ; B -15 -207 65 624 ;
XC -1 ; WX 600 ; N gcaron ; B 43 -207 582 645 ;
XC -1 ; WX 600 ; N graybox ; B 35 -40 565 640 ;
XC -1 ; WX 600 ; N iacute ; B 72 -20 528 660 ;
XC -1 ; WX 600 ; N icircumflex ; B 72 -20 528 634 ;
XC -1 ; WX 600 ; N idieresis ; B 72 -20 528 592 ;
XC -1 ; WX 600 ; N igrave ; B 72 -20 528 656 ;
XC -1 ; WX 600 ; N ij ; B 10 -207 550 665 ;
XC -1 ; WX 600 ; N indent ; B 54 60 546 352 ;
XC -1 ; WX 600 ; N largebullet ; B 260 266 340 346 ;
XC -1 ; WX 600 ; N left ; B 54 60 546 352 ;
XC -1 ; WX 600 ; N lira ; B 43 -20 540 598 ;
XC -1 ; WX 600 ; N ll ; B 0 -20 600 624 ;
XC -1 ; WX 600 ; N logicalnot ; B 52 154 548 394 ;
XC -1 ; WX 600 ; N merge ; B 154 -20 446 452 ;
XC -1 ; WX 600 ; N minus ; B 52 241 548 321 ;
XC -1 ; WX 600 ; N mu ; B 23 -207 561 437 ;
XC -1 ; WX 600 ; N multiply ; B 82 12 518 470 ;
XC -1 ; WX 600 ; N notegraphic ; B 150 -5 450 639 ;
XC -1 ; WX 600 ; N ntilde ; B 33 -20 561 618 ;
XC -1 ; WX 600 ; N oacute ; B 52 -35 548 649 ;
XC -1 ; WX 600 ; N ocircumflex ; B 52 -35 548 653 ;
XC -1 ; WX 600 ; N odieresis ; B 52 -35 548 592 ;
XC -1 ; WX 600 ; N ograve ; B 52 -35 548 649 ;
XC -1 ; WX 600 ; N onehalf ; B -10 -20 610 624 ;
XC -1 ; WX 600 ; N onequarter ; B -10 -20 610 624 ;
XC -1 ; WX 600 ; N onesuperior ; B 160 200 440 624 ;
XC -1 ; WX 600 ; N otilde ; B 52 -35 548 597 ;
XC -1 ; WX 600 ; N overscore ; B -32 559 632 639 ;
XC -1 ; WX 600 ; N plusminus ; B 52 -20 548 550 ;
XC -1 ; WX 600 ; N prescription ; B 23 -20 609 583 ;
XC -1 ; WX 600 ; N registered ; B -20 -35 620 598 ;
XC -1 ; WX 600 ; N return ; B -24 -20 624 608 ;
XC -1 ; WX 600 ; N scaron ; B 83 -35 517 645 ;
XC -1 ; WX 600 ; N scedilla ; B 83 -186 517 452 ;
XC -1 ; WX 600 ; N square ; B -24 -20 624 608 ;
XC -1 ; WX 600 ; N stop ; B -24 -20 624 608 ;
XC -1 ; WX 600 ; N tab ; B -24 -20 624 608 ;
XC -1 ; WX 600 ; N thorn ; B 2 -207 561 624 ;
XC -1 ; WX 600 ; N threequarters ; B -10 -20 610 639 ;
XC -1 ; WX 600 ; N threesuperior ; B 155 191 452 639 ;
XC -1 ; WX 600 ; N trademark ; B -20 230 620 583 ;
XC -1 ; WX 600 ; N twosuperior ; B 140 200 431 639 ;
XC -1 ; WX 600 ; N uacute ; B 23 -35 561 656 ;
XC -1 ; WX 600 ; N ucircumflex ; B 23 -35 561 634 ;
XC -1 ; WX 600 ; N udieresis ; B 23 -35 561 592 ;
XC -1 ; WX 600 ; N ugrave ; B 23 -35 561 656 ;
XC -1 ; WX 600 ; N up ; B 154 -20 446 452 ;
XC -1 ; WX 600 ; N yacute ; B 31 -207 569 656 ;
XC -1 ; WX 600 ; N ydieresis ; B 31 -207 569 571 ;
XC -1 ; WX 600 ; N zcaron ; B 95 -20 509 645 ;

if test 15500 -ne `wc -c <'lout/font0/Couri.AFM'`; then
echo shar: \"'lout/font0/Couri.AFM'\" unpacked with wrong size!
fi
# end of 'lout/font0/Couri.AFM'
fi
if test -f 'lout/font0/CouriObl.AFM' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/font0/CouriObl.AFM'\"
else
echo shar: Extracting \"'lout/font0/CouriObl.AFM'\" \(15467 characters\)
sed "s/^X//" >'lout/font0/CouriObl.AFM' <<'END_OF_FILE'
XStartFontMetrics 2.0


XComment Copyright (c) 1985 Adobe Systems Incorporated. All rights reserved.

XComment Creation Date:Tue Dec 15 16:28:34 PST 1987
XFontName Courier-Oblique
XEncodingScheme AdobeStandardEncoding
XFullName Courier Oblique
XFamilyName Courier
XWeight Medium
XItalicAngle -12.0
XIsFixedPitch true
XUnderlinePosition -82
XUnderlineThickness 40


XVersion 001.005
XNotice Copyright (c) 1985 Adobe Systems Incorporated. All rights reserved.
XFontBBox -200 -451 800 900

XCapHeight 583
XXHeight 437
XDescender -207
XAscender 624
XStartCharMetrics 260
XC 32 ; WX 600 ; N space ; B 560 -40 640 40 ;
XC 33 ; WX 600 ; N exclam ; B 257 -5 483 639 ;
XC 34 ; WX 600 ; N quotedbl ; B 231 314 594 603 ;
XC 35 ; WX 600 ; N numbersign ; B 116 -82 608 665 ;
XC 36 ; WX 600 ; N dollar ; B 111 -113 601 675 ;
XC 37 ; WX 600 ; N percent ; B 118 -35 611 639 ;
XC 38 ; WX 600 ; N ampersand ; B 112 -35 547 540 ;
XC 39 ; WX 600 ; N quoteright ; B 208 304 462 613 ;
XC 40 ; WX 600 ; N parenleft ; B 315 -144 602 623 ;
XC 41 ; WX 600 ; N parenright ; B 105 -144 392 623 ;
XC 42 ; WX 600 ; N asterisk ; B 191 210 605 624 ;
XC 43 ; WX 600 ; N plus ; B 112 12 608 550 ;
XC 44 ; WX 600 ; N comma ; B 111 -155 364 155 ;
XC 45 ; WX 600 ; N hyphen ; B 112 241 608 321 ;
XC 46 ; WX 600 ; N period ; B 261 10 361 90 ;
XC 47 ; WX 600 ; N slash ; B 80 -103 644 686 ;
XC 48 ; WX 600 ; N zero ; B 139 -35 590 639 ;
XC 49 ; WX 600 ; N one ; B 97 -20 511 624 ;
XC 50 ; WX 600 ; N two ; B 68 -20 596 639 ;
XC 51 ; WX 600 ; N three ; B 90 -35 599 639 ;
XC 52 ; WX 600 ; N four ; B 125 -20 560 624 ;
XC 53 ; WX 600 ; N five ; B 93 -35 602 624 ;
XC 54 ; WX 600 ; N six ; B 167 -35 654 639 ;
XC 55 ; WX 600 ; N seven ; B 196 -20 622 624 ;
XC 56 ; WX 600 ; N eight ; B 124 -35 595 639 ;
XC 57 ; WX 600 ; N nine ; B 120 -35 606 639 ;
XC 58 ; WX 600 ; N colon ; B 261 10 425 392 ;
XC 59 ; WX 600 ; N semicolon ; B 123 -116 425 392 ;
XC 60 ; WX 600 ; N less ; B 112 12 656 550 ;
XC 61 ; WX 600 ; N equal ; B 75 168 644 394 ;
XC 62 ; WX 600 ; N greater ; B 63 12 608 550 ;
XC 63 ; WX 600 ; N question ; B 211 -5 597 598 ;
XC 64 ; WX 600 ; N at ; B 120 -82 580 644 ;
XC 65 ; WX 600 ; N A ; B -7 -20 615 583 ;
XC 66 ; WX 600 ; N B ; B 27 -20 610 583 ;
XC 67 ; WX 600 ; N C ; B 91 -35 655 598 ;
XC 68 ; WX 600 ; N D ; B 27 -20 610 583 ;
XC 69 ; WX 600 ; N E ; B 27 -20 634 583 ;
XC 70 ; WX 600 ; N F ; B 27 -20 655 583 ;
XC 71 ; WX 600 ; N G ; B 89 -35 655 598 ;
XC 72 ; WX 600 ; N H ; B 37 -20 665 583 ;
XC 73 ; WX 600 ; N I ; B 97 -20 622 583 ;
XC 74 ; WX 600 ; N J ; B 82 -35 718 583 ;
XC 75 ; WX 600 ; N K ; B 27 -20 686 583 ;
XC 76 ; WX 600 ; N L ; B 47 -20 605 583 ;
XC 77 ; WX 600 ; N M ; B -5 -20 718 583 ;
XC 78 ; WX 600 ; N N ; B 27 -20 697 583 ;
XC 79 ; WX 600 ; N O ; B 83 -35 636 598 ;
XC 80 ; WX 600 ; N P ; B 27 -20 606 583 ;
XC 81 ; WX 600 ; N Q ; B 84 -136 636 598 ;
XC 82 ; WX 600 ; N R ; B 27 -20 613 583 ;
XC 83 ; WX 600 ; N S ; B 76 -35 622 598 ;
XC 84 ; WX 600 ; N T ; B 129 -20 663 583 ;
XC 85 ; WX 600 ; N U ; B 119 -35 695 583 ;
XC 86 ; WX 600 ; N V ; B 104 -20 726 583 ;
XC 87 ; WX 600 ; N W ; B 103 -20 715 583 ;
XC 88 ; WX 600 ; N X ; B 24 -20 684 583 ;
XC 89 ; WX 600 ; N Y ; B 129 -20 684 583 ;
XC 90 ; WX 600 ; N Z ; B 87 -20 611 583 ;
XC 91 ; WX 600 ; N bracketleft ; B 238 -144 589 624 ;
XC 92 ; WX 600 ; N backslash ; B 230 -103 494 686 ;
XC 93 ; WX 600 ; N bracketright ; B 113 -144 464 624 ;
XC 94 ; WX 600 ; N asciicircum ; B 173 335 587 624 ;
XC 95 ; WX 600 ; N underscore ; B -85 -290 579 -210 ;
XC 96 ; WX 600 ; N quoteleft ; B 382 304 538 613 ;
XC 97 ; WX 600 ; N a ; B 74 -35 565 452 ;
XC 98 ; WX 600 ; N b ; B 6 -35 610 624 ;
XC 99 ; WX 600 ; N c ; B 104 -35 614 452 ;
XC 100 ; WX 600 ; N d ; B 83 -35 643 624 ;
XC 101 ; WX 600 ; N e ; B 85 -35 590 452 ;
XC 102 ; WX 600 ; N f ; B 89 -20 682 624 ;
XC 103 ; WX 600 ; N g ; B 85 -207 666 452 ;
XC 104 ; WX 600 ; N h ; B 37 -20 575 624 ;
XC 105 ; WX 600 ; N i ; B 76 -20 532 665 ;
XC 106 ; WX 600 ; N j ; B 92 -207 562 665 ;
XC 107 ; WX 600 ; N k ; B 47 -20 603 624 ;
XC 108 ; WX 600 ; N l ; B 76 -20 532 624 ;
XC 109 ; WX 600 ; N m ; B -5 -20 621 452 ;
XC 110 ; WX 600 ; N n ; B 37 -20 565 452 ;
XC 111 ; WX 600 ; N o ; B 91 -35 597 452 ;
XC 112 ; WX 600 ; N p ; B -33 -207 612 452 ;
XC 113 ; WX 600 ; N q ; B 85 -207 687 452 ;
XC 114 ; WX 600 ; N r ; B 68 -20 639 448 ;
XC 115 ; WX 600 ; N s ; B 87 -35 580 452 ;
XC 116 ; WX 600 ; N t ; B 107 -35 541 582 ;
XC 117 ; WX 600 ; N u ; B 107 -35 582 437 ;
XC 118 ; WX 600 ; N v ; B 94 -20 674 437 ;
XC 119 ; WX 600 ; N w ; B 94 -20 674 437 ;
XC 120 ; WX 600 ; N x ; B 35 -20 632 437 ;
XC 121 ; WX 600 ; N y ; B -4 -207 653 437 ;
XC 122 ; WX 600 ; N z ; B 99 -20 582 437 ;
XC 123 ; WX 600 ; N braceleft ; B 228 -144 547 624 ;
XC 124 ; WX 600 ; N bar ; B 238 -144 464 624 ;
XC 125 ; WX 600 ; N braceright ; B 155 -144 474 624 ;
XC 126 ; WX 600 ; N asciitilde ; B 127 189 592 373 ;
XC 161 ; WX 600 ; N exclamdown ; B 209 -207 430 415 ;
XC 162 ; WX 600 ; N cent ; B 156 -19 583 665 ;
XC 163 ; WX 600 ; N sterling ; B 68 -20 560 598 ;
XC 164 ; WX 600 ; N fraction ; B 65 120 665 492 ;
XC 165 ; WX 600 ; N yen ; B 137 -20 684 583 ;
XC 166 ; WX 600 ; N florin ; B 54 -113 663 639 ;
XC 167 ; WX 600 ; N section ; B 78 -87 637 629 ;
XC 168 ; WX 600 ; N currency ; B 107 75 617 509 ;
XC 169 ; WX 600 ; N quotesingle ; B 333 304 492 613 ;
XC 170 ; WX 600 ; N quotedblleft ; B 216 340 588 619 ;
XC 171 ; WX 600 ; N guillemotleft ; B 87 -20 645 437 ;
XC 172 ; WX 600 ; N guilsinglleft ; B 87 -20 416 437 ;
XC 173 ; WX 600 ; N guilsinglright ; B 277 -20 605 437 ;
XC 174 ; WX 600 ; N fi ; B -6 -20 628 665 ;
XC 175 ; WX 600 ; N fl ; B -6 -20 629 624 ;
XC 177 ; WX 600 ; N endash ; B 112 241 608 321 ;
XC 178 ; WX 600 ; N dagger ; B 188 -82 580 624 ;
XC 179 ; WX 600 ; N daggerdbl ; B 135 -82 580 624 ;
XC 180 ; WX 600 ; N periodcentered ; B 315 266 415 346 ;
XC 182 ; WX 600 ; N paragraph ; B 132 -87 670 629 ;
XC 183 ; WX 600 ; N bullet ; B 325 266 405 346 ;
XC 184 ; WX 600 ; N quotesinglbase ; B 108 -165 362 144 ;
XC 185 ; WX 600 ; N quotedblbase ; B 72 -139 528 139 ;
XC 186 ; WX 600 ; N quotedblright ; B 174 340 630 619 ;
XC 187 ; WX 600 ; N guillemotright ; B 47 -20 605 437 ;
XC 188 ; WX 600 ; N ellipsis ; B 67 -5 547 75 ;
XC 189 ; WX 600 ; N perthousand ; B 117 -35 619 639 ;
XC 191 ; WX 600 ; N questiondown ; B 85 -207 470 415 ;
XC 193 ; WX 600 ; N grave ; B 262 450 444 639 ;
XC 194 ; WX 600 ; N acute ; B 364 450 592 639 ;
XC 195 ; WX 600 ; N circumflex ; B 239 450 569 624 ;
XC 196 ; WX 600 ; N tilde ; B 231 441 586 580 ;
XC 197 ; WX 600 ; N macron ; B 245 476 575 556 ;
XC 198 ; WX 600 ; N breve ; B 258 450 589 624 ;
XC 199 ; WX 600 ; N dotaccent ; B 373 491 453 571 ;
XC 200 ; WX 600 ; N dieresis ; B 269 491 557 571 ;
XC 202 ; WX 600 ; N ring ; B 297 413 526 634 ;
XC 203 ; WX 600 ; N cedilla ; B 163 -186 376 40 ;
XC 205 ; WX 600 ; N hungarumlaut ; B 239 450 592 639 ;
XC 206 ; WX 600 ; N ogonek ; B 244 -165 430 40 ;
XC 207 ; WX 600 ; N caron ; B 259 450 589 624 ;
XC 208 ; WX 600 ; N emdash ; B 41 241 679 321 ;
XC 225 ; WX 600 ; N AE ; B -6 -20 705 583 ;
XC 227 ; WX 600 ; N ordfeminine ; B 174 179 529 598 ;
XC 232 ; WX 600 ; N Lslash ; B 47 -20 605 583 ;
XC 233 ; WX 600 ; N Oslash ; B 16 -61 704 623 ;
XC 234 ; WX 600 ; N OE ; B 42 -20 705 583 ;
XC 235 ; WX 600 ; N ordmasculine ; B 178 179 563 598 ;
XC 241 ; WX 600 ; N ae ; B 19 -35 651 452 ;
XC 245 ; WX 600 ; N dotlessi ; B 76 -20 532 437 ;
XC 248 ; WX 600 ; N lslash ; B 76 -20 544 624 ;
XC 249 ; WX 600 ; N oslash ; B 29 -61 656 478 ;
XC 250 ; WX 600 ; N oe ; B 28 -35 651 452 ;
XC 251 ; WX 600 ; N germandbls ; B 27 -35 558 624 ;
XC -1 ; WX 600 ; N Aacute ; B -7 -20 615 789 ;
XC -1 ; WX 600 ; N Acircumflex ; B -7 -20 615 774 ;
XC -1 ; WX 600 ; N Adieresis ; B -7 -20 615 721 ;
XC -1 ; WX 600 ; N Agrave ; B -7 -20 615 789 ;
XC -1 ; WX 600 ; N Aring ; B -7 -20 615 795 ;
XC -1 ; WX 600 ; N Atilde ; B -7 -20 615 730 ;
XC -1 ; WX 600 ; N Ccedilla ; B 91 -186 655 598 ;
XC -1 ; WX 600 ; N Eacute ; B 27 -20 634 789 ;
XC -1 ; WX 600 ; N Ecircumflex ; B 27 -20 634 774 ;
XC -1 ; WX 600 ; N Edieresis ; B 27 -20 634 721 ;
XC -1 ; WX 600 ; N Egrave ; B 27 -20 634 789 ;
XC -1 ; WX 600 ; N Eth ; B 27 -20 610 583 ;
XC -1 ; WX 600 ; N Gcaron ; B 89 -35 655 774 ;
XC -1 ; WX 600 ; N IJ ; B -6 -35 725 583 ;
XC -1 ; WX 600 ; N Iacute ; B 97 -20 622 789 ;
XC -1 ; WX 600 ; N Icircumflex ; B 97 -20 622 774 ;
XC -1 ; WX 600 ; N Idieresis ; B 97 -20 622 721 ;
XC -1 ; WX 600 ; N Idot ; B 97 -20 622 721 ;
XC -1 ; WX 600 ; N Igrave ; B 97 -20 622 789 ;
XC -1 ; WX 600 ; N LL ; B -16 -20 652 583 ;
XC -1 ; WX 600 ; N Ntilde ; B 27 -20 697 730 ;
XC -1 ; WX 600 ; N Oacute ; B 83 -35 636 789 ;
XC -1 ; WX 600 ; N Ocircumflex ; B 83 -35 636 774 ;
XC -1 ; WX 600 ; N Odieresis ; B 83 -35 636 721 ;
XC -1 ; WX 600 ; N Ograve ; B 83 -35 636 789 ;
XC -1 ; WX 600 ; N Otilde ; B 83 -35 636 730 ;
XC -1 ; WX 600 ; N Scaron ; B 76 -35 622 774 ;
XC -1 ; WX 600 ; N Scedilla ; B 76 -186 622 598 ;
XC -1 ; WX 600 ; N Thorn ; B 27 -20 603 583 ;
XC -1 ; WX 600 ; N Uacute ; B 119 -35 695 789 ;
XC -1 ; WX 600 ; N Ucircumflex ; B 119 -35 695 774 ;
XC -1 ; WX 600 ; N Udieresis ; B 119 -35 695 721 ;
XC -1 ; WX 600 ; N Ugrave ; B 119 -35 695 789 ;
XC -1 ; WX 600 ; N Yacute ; B 129 -20 684 789 ;
XC -1 ; WX 600 ; N Ydieresis ; B 129 -20 684 721 ;
XC -1 ; WX 600 ; N Zcaron ; B 87 -20 621 774 ;
XC -1 ; WX 600 ; N aacute ; B 74 -35 565 660 ;
XC -1 ; WX 600 ; N acircumflex ; B 74 -35 575 653 ;
XC -1 ; WX 600 ; N adieresis ; B 74 -35 565 592 ;
XC -1 ; WX 600 ; N agrave ; B 74 -35 565 660 ;
XC -1 ; WX 600 ; N aring ; B 74 -35 565 686 ;
XC -1 ; WX 600 ; N arrowboth ; B 24 110 704 490 ;
XC -1 ; WX 600 ; N arrowdown ; B 146 -20 526 639 ;
XC -1 ; WX 600 ; N arrowleft ; B 24 110 704 490 ;
XC -1 ; WX 600 ; N arrowright ; B 24 110 704 490 ;
XC -1 ; WX 600 ; N arrowup ; B 205 -20 585 639 ;
XC -1 ; WX 600 ; N atilde ; B 74 -35 594 618 ;
XC -1 ; WX 600 ; N brokenbar ; B 238 -144 464 624 ;
XC -1 ; WX 600 ; N ccedilla ; B 104 -186 614 452 ;
XC -1 ; WX 600 ; N center ; B 62 -20 662 624 ;
XC -1 ; WX 600 ; N copyright ; B 33 -35 683 598 ;
XC -1 ; WX 600 ; N dectab ; B -1 -20 609 248 ;
XC -1 ; WX 600 ; N degree ; B 231 294 564 624 ;
XC -1 ; WX 600 ; N divide ; B 112 51 608 531 ;
XC -1 ; WX 600 ; N down ; B 181 -20 473 452 ;
XC -1 ; WX 600 ; N eacute ; B 85 -35 590 664 ;
XC -1 ; WX 600 ; N ecircumflex ; B 85 -35 590 653 ;
XC -1 ; WX 600 ; N edieresis ; B 85 -35 590 592 ;
XC -1 ; WX 600 ; N egrave ; B 85 -35 590 664 ;
XC -1 ; WX 600 ; N eth ; B 87 -35 637 639 ;
XC -1 ; WX 600 ; N format ; B -50 -207 189 624 ;
XC -1 ; WX 600 ; N gcaron ; B 85 -207 666 645 ;
XC -1 ; WX 600 ; N graybox ; B 35 -40 693 640 ;
XC -1 ; WX 600 ; N iacute ; B 76 -20 532 660 ;
XC -1 ; WX 600 ; N icircumflex ; B 76 -20 532 634 ;
XC -1 ; WX 600 ; N idieresis ; B 76 -20 532 592 ;
XC -1 ; WX 600 ; N igrave ; B 76 -20 532 656 ;
XC -1 ; WX 600 ; N ij ; B 14 -207 634 665 ;
XC -1 ; WX 600 ; N indent ; B 98 60 590 352 ;
XC -1 ; WX 600 ; N largebullet ; B 325 266 405 346 ;
XC -1 ; WX 600 ; N left ; B 98 60 590 352 ;
XC -1 ; WX 600 ; N lira ; B 68 -20 560 598 ;
XC -1 ; WX 600 ; N ll ; B 4 -20 624 624 ;
XC -1 ; WX 600 ; N logicalnot ; B 127 154 623 394 ;
XC -1 ; WX 600 ; N merge ; B 181 -20 511 452 ;
XC -1 ; WX 600 ; N minus ; B 112 241 608 321 ;
XC -1 ; WX 600 ; N mu ; B 71 -207 582 437 ;
XC -1 ; WX 600 ; N multiply ; B 93 12 609 470 ;
XC -1 ; WX 600 ; N notegraphic ; B 167 -5 573 639 ;
XC -1 ; WX 600 ; N ntilde ; B 37 -20 569 618 ;
XC -1 ; WX 600 ; N oacute ; B 91 -35 597 649 ;
XC -1 ; WX 600 ; N ocircumflex ; B 91 -35 597 653 ;
XC -1 ; WX 600 ; N odieresis ; B 91 -35 597 592 ;
XC -1 ; WX 600 ; N ograve ; B 91 -35 597 649 ;
XC -1 ; WX 600 ; N onehalf ; B 46 -20 665 624 ;
XC -1 ; WX 600 ; N onequarter ; B 46 -20 681 624 ;
XC -1 ; WX 600 ; N onesuperior ; B 211 200 491 624 ;
XC -1 ; WX 600 ; N otilde ; B 91 -35 597 597 ;
XC -1 ; WX 600 ; N overscore ; B 95 559 759 639 ;
XC -1 ; WX 600 ; N plusminus ; B 56 -20 617 550 ;
XC -1 ; WX 600 ; N prescription ; B 27 -20 613 583 ;
XC -1 ; WX 600 ; N registered ; B 33 -35 683 598 ;
XC -1 ; WX 600 ; N return ; B 36 -20 745 608 ;
XC -1 ; WX 600 ; N scaron ; B 87 -35 593 645 ;
XC -1 ; WX 600 ; N scedilla ; B 87 -186 580 452 ;
XC -1 ; WX 600 ; N square ; B -20 -20 745 608 ;
XC -1 ; WX 600 ; N stop ; B -20 -20 745 608 ;
XC -1 ; WX 600 ; N tab ; B -20 -20 684 608 ;
XC -1 ; WX 600 ; N thorn ; B -33 -207 612 624 ;
XC -1 ; WX 600 ; N threequarters ; B 57 -20 651 639 ;
XC -1 ; WX 600 ; N threesuperior ; B 215 191 552 639 ;
XC -1 ; WX 600 ; N trademark ; B 78 230 735 583 ;
XC -1 ; WX 600 ; N twosuperior ; B 191 200 541 639 ;
XC -1 ; WX 600 ; N uacute ; B 107 -35 582 656 ;
XC -1 ; WX 600 ; N ucircumflex ; B 107 -35 582 634 ;
XC -1 ; WX 600 ; N udieresis ; B 107 -35 582 592 ;
XC -1 ; WX 600 ; N ugrave ; B 107 -35 582 656 ;
XC -1 ; WX 600 ; N up ; B 219 -20 511 452 ;
XC -1 ; WX 600 ; N yacute ; B -4 -207 653 656 ;
XC -1 ; WX 600 ; N ydieresis ; B -4 -207 653 571 ;
XC -1 ; WX 600 ; N zcaron ; B 99 -20 593 645 ;

if test 15467 -ne `wc -c <'lout/font0/CouriObl.AFM'`; then
echo shar: \"'lout/font0/CouriObl.AFM'\" unpacked with wrong size!
fi
# end of 'lout/font0/CouriObl.AFM'
fi
if test -f 'lout/font0/Helve.AFM' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/font0/Helve.AFM'\"
else
echo shar: Extracting \"'lout/font0/Helve.AFM'\" \(15499 characters\)
sed "s/^X//" >'lout/font0/Helve.AFM' <<'END_OF_FILE'


XStartFontMetrics 2.0
XComment Copyright (c) 1984 Adobe Systems Incorporated. All Rights Reserved.

XComment Creation Date:Sun Feb 8 18:48:01 PST 1987
XFontName Helvetica
XEncodingScheme AdobeStandardEncoding
XFullName Helvetica
XFamilyName Helvetica


XWeight Medium
XItalicAngle 0.0
XIsFixedPitch false

XUnderlinePosition -97
XUnderlineThickness 73
XVersion 001.002
XNotice Helvetica is a registered trademark of Allied Corporation.
XFontBBox -174 -220 1001 944
XCapHeight 729
XXHeight 525


XDescender -219
XAscender 729
XStartCharMetrics 228

XC 32 ; WX 278 ; N space ; B 0 0 0 0 ;

XC 33 ; WX 278 ; N exclam ; B 124 0 208 729 ;
XC 34 ; WX 355 ; N quotedbl ; B 52 462 305 708 ;
XC 35 ; WX 556 ; N numbersign ; B 14 -20 542 698 ;
XC 36 ; WX 556 ; N dollar ; B 33 -125 518 770 ;
XC 37 ; WX 889 ; N percent ; B 29 -20 859 708 ;
XC 38 ; WX 667 ; N ampersand ; B 52 -23 637 710 ;
XC 39 ; WX 222 ; N quoteright ; B 64 476 158 708 ;
XC 40 ; WX 333 ; N parenleft ; B 73 -213 291 729 ;
XC 41 ; WX 333 ; N parenright ; B 38 -213 256 729 ;
XC 42 ; WX 389 ; N asterisk ; B 40 452 343 740 ;
XC 43 ; WX 584 ; N plus ; B 50 -10 534 474 ;
XC 44 ; WX 278 ; N comma ; B 87 -150 192 104 ;
XC 45 ; WX 333 ; N hyphen ; B 46 240 284 313 ;
XC 46 ; WX 278 ; N period ; B 87 0 191 104 ;
XC 47 ; WX 278 ; N slash ; B -8 -21 284 708 ;
XC 48 ; WX 556 ; N zero ; B 43 -23 507 709 ;
XC 49 ; WX 556 ; N one ; B 102 0 347 709 ;
XC 50 ; WX 556 ; N two ; B 34 0 511 710 ;
XC 51 ; WX 556 ; N three ; B 32 -23 506 709 ;
XC 52 ; WX 556 ; N four ; B 28 0 520 709 ;
XC 53 ; WX 556 ; N five ; B 35 -23 513 709 ;
XC 54 ; WX 556 ; N six ; B 43 -23 513 709 ;
XC 55 ; WX 556 ; N seven ; B 46 0 520 709 ;
XC 56 ; WX 556 ; N eight ; B 37 -23 513 709 ;
XC 57 ; WX 556 ; N nine ; B 38 -23 509 709 ;
XC 58 ; WX 278 ; N colon ; B 110 0 214 525 ;
XC 59 ; WX 278 ; N semicolon ; B 110 -150 215 516 ;
XC 60 ; WX 584 ; N less ; B 45 -10 534 474 ;
XC 61 ; WX 584 ; N equal ; B 50 112 534 352 ;
XC 62 ; WX 584 ; N greater ; B 50 -10 539 474 ;
XC 63 ; WX 556 ; N question ; B 77 0 509 738 ;
XC 64 ; WX 1015 ; N at ; B 34 -146 951 737 ;
XC 65 ; WX 667 ; N A ; B 17 0 653 729 ;
XC 66 ; WX 667 ; N B ; B 79 0 623 729 ;
XC 67 ; WX 722 ; N C ; B 48 -23 677 741 ;
XC 68 ; WX 722 ; N D ; B 89 0 667 729 ;
XC 69 ; WX 667 ; N E ; B 90 0 613 729 ;
XC 70 ; WX 611 ; N F ; B 90 0 579 729 ;
XC 71 ; WX 778 ; N G ; B 44 -23 709 741 ;
XC 72 ; WX 722 ; N H ; B 83 0 644 729 ;
XC 73 ; WX 278 ; N I ; B 100 0 194 729 ;
XC 74 ; WX 500 ; N J ; B 17 -26 426 729 ;
XC 75 ; WX 667 ; N K ; B 79 0 658 729 ;
XC 76 ; WX 556 ; N L ; B 80 0 533 729 ;
XC 77 ; WX 833 ; N M ; B 75 0 761 729 ;
XC 78 ; WX 722 ; N N ; B 76 0 646 729 ;
XC 79 ; WX 778 ; N O ; B 38 -23 742 741 ;
XC 80 ; WX 667 ; N P ; B 91 0 617 730 ;
XC 81 ; WX 778 ; N Q ; B 38 -59 742 741 ;
XC 82 ; WX 722 ; N R ; B 93 0 679 729 ;
XC 83 ; WX 667 ; N S ; B 48 -23 621 741 ;
XC 84 ; WX 611 ; N T ; B 21 0 593 729 ;
XC 85 ; WX 722 ; N U ; B 85 -23 645 729 ;
XC 86 ; WX 667 ; N V ; B 30 0 645 729 ;
XC 87 ; WX 944 ; N W ; B 22 0 929 729 ;
XC 88 ; WX 667 ; N X ; B 22 0 649 729 ;
XC 89 ; WX 667 ; N Y ; B 13 0 661 729 ;
XC 90 ; WX 611 ; N Z ; B 28 0 583 729 ;
XC 91 ; WX 278 ; N bracketleft ; B 64 -214 250 729 ;
XC 92 ; WX 278 ; N backslash ; B -8 -20 284 729 ;
XC 93 ; WX 278 ; N bracketright ; B 23 -215 209 729 ;
XC 94 ; WX 469 ; N asciicircum ; B 44 333 425 713 ;
XC 95 ; WX 556 ; N underscore ; B -22 -175 578 -125 ;
XC 96 ; WX 222 ; N quoteleft ; B 65 459 158 708 ;
XC 97 ; WX 556 ; N a ; B 42 -23 535 540 ;
XC 98 ; WX 556 ; N b ; B 54 -23 523 729 ;
XC 99 ; WX 500 ; N c ; B 31 -23 477 540 ;
XC 100 ; WX 556 ; N d ; B 26 -23 495 729 ;
XC 101 ; WX 556 ; N e ; B 40 -23 513 541 ;
XC 102 ; WX 278 ; N f ; B 18 0 258 733 ; L i fi ; L l fl ;
XC 103 ; WX 556 ; N g ; B 29 -220 489 540 ;
XC 104 ; WX 556 ; N h ; B 70 0 486 729 ;
XC 105 ; WX 222 ; N i ; B 66 0 150 729 ;
XC 106 ; WX 222 ; N j ; B -18 -220 153 729 ;
XC 107 ; WX 500 ; N k ; B 58 0 502 729 ;
XC 108 ; WX 222 ; N l ; B 68 0 152 729 ;
XC 109 ; WX 833 ; N m ; B 71 0 763 540 ;
XC 110 ; WX 556 ; N n ; B 70 0 487 540 ;
XC 111 ; WX 556 ; N o ; B 36 -23 510 540 ;
XC 112 ; WX 556 ; N p ; B 54 -219 523 540 ;
XC 113 ; WX 556 ; N q ; B 26 -219 495 540 ;
XC 114 ; WX 333 ; N r ; B 69 0 321 540 ;
XC 115 ; WX 500 ; N s ; B 34 -24 459 540 ;
XC 116 ; WX 278 ; N t ; B 14 -24 254 667 ;
XC 117 ; WX 556 ; N u ; B 65 -23 482 525 ;
XC 118 ; WX 500 ; N v ; B 10 0 486 525 ;
XC 119 ; WX 722 ; N w ; B 6 0 708 525 ;
XC 120 ; WX 500 ; N x ; B 17 0 473 525 ;
XC 121 ; WX 500 ; N y ; B 20 -219 478 525 ;
XC 122 ; WX 500 ; N z ; B 31 0 457 525 ;
XC 123 ; WX 334 ; N braceleft ; B 43 -214 276 731 ;
XC 124 ; WX 260 ; N bar ; B 100 -215 160 729 ;
XC 125 ; WX 334 ; N braceright ; B 29 -214 262 731 ;
XC 126 ; WX 584 ; N asciitilde ; B 75 267 508 438 ;
XC 161 ; WX 333 ; N exclamdown ; B 121 -214 205 525 ;
XC 162 ; WX 556 ; N cent ; B 52 -120 510 628 ;
XC 163 ; WX 556 ; N sterling ; B 26 -21 535 726 ;
XC 164 ; WX 167 ; N fraction ; B -174 -21 336 708 ;
XC 165 ; WX 556 ; N yen ; B 11 0 545 710 ;
XC 166 ; WX 556 ; N florin ; B 11 -214 542 742 ;
XC 167 ; WX 556 ; N section ; B 44 -215 506 729 ;
XC 168 ; WX 556 ; N currency ; B 67 126 489 554 ;
XC 169 ; WX 191 ; N quotesingle ; B 48 462 142 708 ;
XC 170 ; WX 333 ; N quotedblleft ; B 48 459 299 708 ;
XC 171 ; WX 556 ; N guillemotleft ; B 98 106 455 438 ;
XC 172 ; WX 333 ; N guilsinglleft ; B 91 112 243 436 ;
XC 173 ; WX 333 ; N guilsinglright ; B 85 112 239 436 ;
XC 174 ; WX 500 ; N fi ; B 12 0 436 733 ;
XC 175 ; WX 500 ; N fl ; B 17 0 430 733 ;
XC 177 ; WX 556 ; N endash ; B -5 240 561 313 ;
XC 178 ; WX 556 ; N dagger ; B 38 -178 513 710 ;
XC 179 ; WX 556 ; N daggerdbl ; B 38 -178 513 710 ;
XC 180 ; WX 278 ; N periodcentered ; B 87 318 211 442 ;
XC 182 ; WX 537 ; N paragraph ; B 48 -178 522 729 ;
XC 183 ; WX 350 ; N bullet ; B 50 220 300 470 ;
XC 184 ; WX 222 ; N quotesinglbase ; B 64 -129 158 103 ;
XC 185 ; WX 333 ; N quotedblbase ; B 47 -129 300 103 ;
XC 186 ; WX 333 ; N quotedblright ; B 49 476 302 708 ;
XC 187 ; WX 556 ; N guillemotright ; B 98 106 451 438 ;
XC 188 ; WX 1000 ; N ellipsis ; B 115 0 885 104 ;
XC 189 ; WX 1000 ; N perthousand ; B 9 -20 993 740 ;
XC 191 ; WX 611 ; N questiondown ; B 95 -213 528 525 ;
XC 193 ; WX 333 ; N grave ; B 22 592 231 740 ;
XC 194 ; WX 333 ; N acute ; B 92 592 301 740 ;
XC 195 ; WX 333 ; N circumflex ; B 20 591 307 741 ;
XC 196 ; WX 333 ; N tilde ; B 5 589 319 716 ;
XC 197 ; WX 333 ; N macron ; B 28 621 302 694 ;
XC 198 ; WX 333 ; N breve ; B 15 594 316 729 ;
XC 199 ; WX 333 ; N dotaccent ; B 115 605 219 709 ;
XC 200 ; WX 333 ; N dieresis ; B 30 605 296 708 ;
XC 202 ; WX 333 ; N ring ; B 79 566 255 741 ;
XC 203 ; WX 333 ; N cedilla ; B 39 -214 287 0 ;
XC 205 ; WX 333 ; N hungarumlaut ; B -35 592 348 740 ;
XC 206 ; WX 333 ; N ogonek ; B 57 -189 265 15 ;
XC 207 ; WX 333 ; N caron ; B 19 590 306 740 ;
XC 208 ; WX 1000 ; N emdash ; B -9 240 1001 313 ;
XC 225 ; WX 1000 ; N AE ; B 11 0 950 729 ;
XC 227 ; WX 370 ; N ordfeminine ; B 37 301 333 740 ;
XC 232 ; WX 556 ; N Lslash ; B 0 0 552 729 ;
XC 233 ; WX 778 ; N Oslash ; B 30 -23 744 742 ;
XC 234 ; WX 1000 ; N OE ; B 43 -20 959 739 ;
XC 235 ; WX 365 ; N ordmasculine ; B 40 301 324 741 ;
XC 241 ; WX 889 ; N ae ; B 34 -20 845 546 ;
XC 245 ; WX 278 ; N dotlessi ; B 94 0 178 525 ;
XC 248 ; WX 222 ; N lslash ; B 0 0 212 729 ;
XC 249 ; WX 611 ; N oslash ; B 18 -27 529 548 ;
XC 250 ; WX 944 ; N oe ; B 40 -22 899 540 ;
XC 251 ; WX 611 ; N germandbls ; B 126 -20 566 729 ;
XC -1 ; WX 667 ; N Aacute ; B 17 0 653 939 ;
XC -1 ; WX 667 ; N Acircumflex ; B 17 0 653 940 ;
XC -1 ; WX 667 ; N Adieresis ; B 17 0 653 907 ;
XC -1 ; WX 667 ; N Agrave ; B 17 0 653 939 ;
XC -1 ; WX 667 ; N Aring ; B 17 0 653 940 ;
XC -1 ; WX 667 ; N Atilde ; B 17 0 653 915 ;
XC -1 ; WX 722 ; N Ccedilla ; B 48 -214 677 741 ;
XC -1 ; WX 667 ; N Eacute ; B 90 0 613 939 ;
XC -1 ; WX 667 ; N Ecircumflex ; B 90 0 613 940 ;
XC -1 ; WX 667 ; N Edieresis ; B 90 0 613 907 ;
XC -1 ; WX 667 ; N Egrave ; B 90 0 613 939 ;
XC -1 ; WX 722 ; N Eth ; B 0 0 667 729 ;
XC -1 ; WX 278 ; N Iacute ; B 71 0 280 939 ;
XC -1 ; WX 278 ; N Icircumflex ; B -1 0 286 940 ;
XC -1 ; WX 278 ; N Idieresis ; B 9 0 275 907 ;
XC -1 ; WX 278 ; N Igrave ; B 1 0 210 939 ;
XC -1 ; WX 722 ; N Ntilde ; B 76 0 646 915 ;
XC -1 ; WX 778 ; N Oacute ; B 38 -23 742 939 ;
XC -1 ; WX 778 ; N Ocircumflex ; B 38 -23 742 940 ;
XC -1 ; WX 778 ; N Odieresis ; B 38 -23 742 907 ;
XC -1 ; WX 778 ; N Ograve ; B 38 -23 742 939 ;
XC -1 ; WX 778 ; N Otilde ; B 38 -23 742 915 ;
XC -1 ; WX 667 ; N Scaron ; B 48 -23 621 939 ;
XC -1 ; WX 667 ; N Thorn ; B 91 0 617 729 ;
XC -1 ; WX 722 ; N Uacute ; B 85 -23 645 939 ;
XC -1 ; WX 722 ; N Ucircumflex ; B 85 -23 645 940 ;
XC -1 ; WX 722 ; N Udieresis ; B 85 -23 645 907 ;
XC -1 ; WX 722 ; N Ugrave ; B 85 -23 645 939 ;
XC -1 ; WX 667 ; N Yacute ; B 13 0 661 944 ;
XC -1 ; WX 667 ; N Ydieresis ; B 13 0 661 907 ;
XC -1 ; WX 611 ; N Zcaron ; B 28 0 583 939 ;
XC -1 ; WX 556 ; N aacute ; B 42 -23 535 740 ;
XC -1 ; WX 556 ; N acircumflex ; B 42 -23 535 741 ;
XC -1 ; WX 556 ; N adieresis ; B 42 -23 535 708 ;
XC -1 ; WX 556 ; N agrave ; B 42 -23 535 740 ;
XC -1 ; WX 556 ; N aring ; B 42 -23 535 741 ;
XC -1 ; WX 556 ; N atilde ; B 42 -23 535 716 ;
XC -1 ; WX 260 ; N brokenbar ; B 100 -215 160 729 ;
XC -1 ; WX 500 ; N ccedilla ; B 31 -214 477 540 ;
XC -1 ; WX 737 ; N copyright ; B -13 -23 751 741 ;
XC -1 ; WX 400 ; N degree ; B 50 409 350 709 ;
XC -1 ; WX 584 ; N divide ; B 50 -10 534 474 ;
XC -1 ; WX 556 ; N eacute ; B 40 -23 513 740 ;
XC -1 ; WX 556 ; N ecircumflex ; B 40 -23 513 741 ;
XC -1 ; WX 556 ; N edieresis ; B 40 -23 513 708 ;
XC -1 ; WX 556 ; N egrave ; B 40 -23 513 740 ;
XC -1 ; WX 556 ; N eth ; B 36 -23 510 729 ;
XC -1 ; WX 278 ; N iacute ; B 65 0 274 740 ;
XC -1 ; WX 278 ; N icircumflex ; B -7 0 280 741 ;
XC -1 ; WX 278 ; N idieresis ; B 3 0 269 708 ;
XC -1 ; WX 278 ; N igrave ; B -5 0 204 740 ;
XC -1 ; WX 584 ; N logicalnot ; B 40 82 544 352 ;
XC -1 ; WX 584 ; N minus ; B 40 194 544 270 ;
XC -1 ; WX 556 ; N mu ; B 65 -219 482 525 ;
XC -1 ; WX 584 ; N multiply ; B 50 -10 534 476 ;
XC -1 ; WX 556 ; N ntilde ; B 70 0 487 716 ;
XC -1 ; WX 556 ; N oacute ; B 36 -23 510 740 ;
XC -1 ; WX 556 ; N ocircumflex ; B 36 -23 510 741 ;
XC -1 ; WX 556 ; N odieresis ; B 36 -23 510 708 ;
XC -1 ; WX 556 ; N ograve ; B 36 -23 510 740 ;
XC -1 ; WX 834 ; N onehalf ; B 30 -21 804 709 ;
XC -1 ; WX 834 ; N onequarter ; B 30 -21 804 709 ;
XC -1 ; WX 333 ; N onesuperior ; B 60 284 219 709 ;
XC -1 ; WX 556 ; N otilde ; B 36 -23 510 716 ;
XC -1 ; WX 584 ; N plusminus ; B 40 0 544 618 ;
XC -1 ; WX 737 ; N registered ; B -13 -23 751 741 ;
XC -1 ; WX 500 ; N scaron ; B 34 -24 459 740 ;
XC -1 ; WX 556 ; N thorn ; B 54 -219 523 729 ;
XC -1 ; WX 834 ; N threequarters ; B 30 -21 804 709 ;
XC -1 ; WX 333 ; N threesuperior ; B 12 270 320 709 ;
XC -1 ; WX 1000 ; N trademark ; B 63 320 938 741 ;
XC -1 ; WX 333 ; N twosuperior ; B 11 284 321 710 ;
XC -1 ; WX 556 ; N uacute ; B 65 -23 482 740 ;
XC -1 ; WX 556 ; N ucircumflex ; B 65 -23 482 741 ;
XC -1 ; WX 556 ; N udieresis ; B 65 -23 482 708 ;
XC -1 ; WX 556 ; N ugrave ; B 65 -23 482 740 ;
XC -1 ; WX 500 ; N yacute ; B 20 -219 478 740 ;
XC -1 ; WX 500 ; N ydieresis ; B 20 -219 478 708 ;
XC -1 ; WX 500 ; N zcaron ; B 31 0 457 740 ;


XEndCharMetrics
XStartKernData
XStartKernPairs 105
X

XKPX A y -18


XKPX A w -18
XKPX A v -18

XKPX A space -55
XKPX A quoteright -74

XKPX A Y -74
XKPX A W -37


XKPX A V -74
XKPX A T -74

X
XKPX F period -111
XKPX F comma -111

XKPX F A -55
X

XKPX L y -37
XKPX L space -37
XKPX L quoteright -55
XKPX L Y -74
XKPX L W -74


XKPX L V -74
XKPX L T -74

X
XKPX P space -18
XKPX P period -129
XKPX P comma -129
XKPX P A -74
X

XKPX R Y -18
XKPX R W -18

XKPX R V -18


XKPX R T -18
X
XKPX T y -55

XKPX T w -55
XKPX T u -37
XKPX T space -18
XKPX T semicolon -111
XKPX T s -111
XKPX T r -37
XKPX T period -111
XKPX T o -111
XKPX T i -37


XKPX T hyphen -55
XKPX T e -111

XKPX T comma -111
XKPX T colon -111


XKPX T c -111
XKPX T a -111

XKPX T O -18
XKPX T A -74
X
XKPX V y -37
XKPX V u -37
XKPX V semicolon -37
XKPX V r -37
XKPX V period -92
XKPX V o -55
XKPX V i -18
XKPX V hyphen -55
XKPX V e -55
XKPX V comma -92
XKPX V colon -37
XKPX V a -74
XKPX V A -74
X
XKPX W y -9
XKPX W u -18
XKPX W semicolon -18
XKPX W r -18
XKPX W period -55
XKPX W o -18
XKPX W i 0
XKPX W hyphen -18
XKPX W e -18


XKPX W comma -55
XKPX W colon -18

XKPX W a -37


XKPX W A -37
X

XKPX Y v -55
XKPX Y u -55
XKPX Y space -18
XKPX Y semicolon -65
XKPX Y q -92
XKPX Y period -129


XKPX Y p -74
XKPX Y o -92

XKPX Y i -37


XKPX Y hyphen -92
XKPX Y e -92

XKPX Y comma -129


XKPX Y colon -55
XKPX Y a -74

XKPX Y A -74
X
XKPX f quoteright 18
XKPX f f -18
X
XKPX one one -74

X
XKPX quoteleft quoteleft -18
X

XKPX quoteright space -37
XKPX quoteright s -18

XKPX quoteright quoteright -18
X

XKPX r quoteright 37
XKPX r period -55
XKPX r comma -55
X
XKPX space Y -18

XKPX space T -18


XKPX space A -55
X

XKPX v period -74
XKPX v comma -74

X
XKPX w period -55
XKPX w comma -55
X

XKPX y period -74
XKPX y comma -74
XEndKernPairs
XEndKernData
XStartComposites 58
XCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 139 199 ;
XCC zcaron 2 ; PCC z 0 0 ; PCC caron 83 0 ;
XCC Scaron 2 ; PCC S 0 0 ; PCC caron 167 199 ;
XCC scaron 2 ; PCC s 0 0 ; PCC caron 83 0 ;
XCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 207 0 ;
XCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 96 0 ;
XCC Yacute 2 ; PCC Y 0 0 ; PCC acute 167 204 ;
XCC yacute 2 ; PCC y 0 0 ; PCC acute 83 0 ;
XCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 167 199 ;
XCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 83 0 ;
XCC Uacute 2 ; PCC U 0 0 ; PCC acute 194 199 ;
XCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 194 199 ;
XCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 194 199 ;
XCC Ugrave 2 ; PCC U 0 0 ; PCC grave 194 199 ;
XCC uacute 2 ; PCC u 0 0 ; PCC acute 111 0 ;
XCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 111 0 ;
XCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 111 0 ;
XCC ugrave 2 ; PCC u 0 0 ; PCC grave 111 0 ;
XCC Iacute 2 ; PCC I 0 0 ; PCC acute -21 199 ;
XCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex -21 199 ;
XCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis -21 199 ;
XCC Igrave 2 ; PCC I 0 0 ; PCC grave -21 199 ;
XCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -27 0 ;
XCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -27 0 ;
XCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -27 0 ;
XCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -27 0 ;
XCC Eacute 2 ; PCC E 0 0 ; PCC acute 188 199 ;
XCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 188 199 ;
XCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 188 199 ;
XCC Egrave 2 ; PCC E 0 0 ; PCC grave 188 199 ;
XCC eacute 2 ; PCC e 0 0 ; PCC acute 117 0 ;
XCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 117 0 ;
XCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 117 0 ;
XCC egrave 2 ; PCC e 0 0 ; PCC grave 117 0 ;
XCC Aacute 2 ; PCC A 0 0 ; PCC acute 167 199 ;
XCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 167 199 ;
XCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 167 199 ;
XCC Agrave 2 ; PCC A 0 0 ; PCC grave 167 199 ;


XCC aacute 2 ; PCC a 0 0 ; PCC acute 111 0 ;
XCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 111 0 ;
XCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 111 0 ;
XCC agrave 2 ; PCC a 0 0 ; PCC grave 111 0 ;

XCC Oacute 2 ; PCC O 0 0 ; PCC acute 222 199 ;
XCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 222 199 ;
XCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 222 199 ;
XCC Ograve 2 ; PCC O 0 0 ; PCC grave 222 199 ;
XCC oacute 2 ; PCC o 0 0 ; PCC acute 111 0 ;
XCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 111 0 ;
XCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 111 0 ;
XCC ograve 2 ; PCC o 0 0 ; PCC grave 111 0 ;
XCC Atilde 2 ; PCC A 0 0 ; PCC tilde 167 199 ;


XCC atilde 2 ; PCC a 0 0 ; PCC tilde 111 0 ;

XCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 200 199 ;
XCC ntilde 2 ; PCC n 0 0 ; PCC tilde 117 0 ;
XCC Otilde 2 ; PCC O 0 0 ; PCC tilde 222 199 ;
XCC otilde 2 ; PCC o 0 0 ; PCC tilde 111 0 ;
XCC Aring 2 ; PCC A 0 0 ; PCC ring 167 199 ;


XCC aring 2 ; PCC a 0 0 ; PCC ring 111 0 ;
XEndComposites
XEndFontMetrics
END_OF_FILE

if test 15499 -ne `wc -c <'lout/font0/Helve.AFM'`; then
echo shar: \"'lout/font0/Helve.AFM'\" unpacked with wrong size!
fi
# end of 'lout/font0/Helve.AFM'
fi
if test -f 'lout/font0/HelveCon.AFM' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/font0/HelveCon.AFM'\"
else
echo shar: Extracting \"'lout/font0/HelveCon.AFM'\" \(15475 characters\)
sed "s/^X//" >'lout/font0/HelveCon.AFM' <<'END_OF_FILE'


XStartFontMetrics 2.0
XComment Copyright (c) 1984 Adobe Systems Incorporated. All Rights Reserved.

XComment Creation Date:Mon Mar 30 16:27:29 PST 1987
XFontName Helvetica-Condensed
XEncodingScheme AdobeStandardEncoding
XFullName Helvetica Condensed Medium
XFamilyName Helvetica
XWeight MediumCondensed
XItalicAngle 0.0
XIsFixedPitch false


XUnderlinePosition -90
XUnderlineThickness 58
XVersion 001.001

XNotice Helvetica is a trademark of Allied Corporation.
XFontBBox -174 -224 1071 990


XCapHeight 750
XXHeight 556
XDescender -188
XAscender 750

XStartCharMetrics 228


XC 32 ; WX 250 ; N space ; B 0 0 0 0 ;

XC 33 ; WX 333 ; N exclam ; B 121 0 212 750 ;
XC 34 ; WX 250 ; N quotedbl ; B 44 513 207 739 ;
XC 35 ; WX 500 ; N numbersign ; B 5 0 495 750 ;
XC 36 ; WX 500 ; N dollar ; B 35 -116 465 815 ;
XC 37 ; WX 833 ; N percent ; B 55 -15 756 750 ;
XC 38 ; WX 667 ; N ampersand ; B 75 -18 620 750 ;
XC 39 ; WX 222 ; N quoteright ; B 64 504 158 750 ;
XC 40 ; WX 333 ; N parenleft ; B 76 -215 289 750 ;
XC 41 ; WX 333 ; N parenright ; B 44 -215 257 750 ;
XC 42 ; WX 500 ; N asterisk ; B 96 455 405 750 ;
XC 43 ; WX 500 ; N plus ; B 44 0 457 505 ;
XC 44 ; WX 250 ; N comma ; B 80 -146 171 100 ;
XC 45 ; WX 333 ; N hyphen ; B 45 275 288 358 ;
XC 46 ; WX 250 ; N period ; B 80 0 171 100 ;
XC 47 ; WX 278 ; N slash ; B -13 -27 291 750 ;
XC 48 ; WX 500 ; N zero ; B 46 -15 455 750 ;
XC 49 ; WX 500 ; N one ; B 74 0 317 750 ;
XC 50 ; WX 500 ; N two ; B 44 0 447 750 ;
XC 51 ; WX 500 ; N three ; B 38 -15 447 750 ;
XC 52 ; WX 500 ; N four ; B 28 0 451 750 ;
XC 53 ; WX 500 ; N five ; B 43 -15 446 735 ;
XC 54 ; WX 500 ; N six ; B 43 -15 458 750 ;
XC 55 ; WX 500 ; N seven ; B 44 0 456 735 ;
XC 56 ; WX 500 ; N eight ; B 46 -15 454 750 ;
XC 57 ; WX 500 ; N nine ; B 43 -15 458 750 ;
XC 58 ; WX 250 ; N colon ; B 80 0 171 547 ;
XC 59 ; WX 250 ; N semicolon ; B 80 -146 171 547 ;
XC 60 ; WX 500 ; N less ; B 42 -10 459 518 ;
XC 61 ; WX 500 ; N equal ; B 44 124 457 384 ;
XC 62 ; WX 500 ; N greater ; B 42 -10 459 518 ;
XC 63 ; WX 500 ; N question ; B 60 0 462 750 ;
XC 64 ; WX 800 ; N at ; B 36 -15 764 750 ;
XC 65 ; WX 556 ; N A ; B 11 0 546 750 ;
XC 66 ; WX 556 ; N B ; B 80 0 503 750 ;
XC 67 ; WX 556 ; N C ; B 53 -18 503 765 ;
XC 68 ; WX 611 ; N D ; B 82 0 548 750 ;
XC 69 ; WX 500 ; N E ; B 74 0 451 750 ;
XC 70 ; WX 444 ; N F ; B 74 0 426 750 ;
XC 71 ; WX 611 ; N G ; B 54 -18 532 765 ;
XC 72 ; WX 611 ; N H ; B 79 0 532 750 ;
XC 73 ; WX 278 ; N I ; B 98 0 181 750 ;
XC 74 ; WX 444 ; N J ; B 21 -15 368 750 ;
XC 75 ; WX 556 ; N K ; B 79 0 546 750 ;
XC 76 ; WX 500 ; N L ; B 83 0 472 750 ;
XC 77 ; WX 778 ; N M ; B 76 0 702 750 ;
XC 78 ; WX 611 ; N N ; B 77 0 534 750 ;
XC 79 ; WX 611 ; N O ; B 59 -18 553 765 ;
XC 80 ; WX 556 ; N P ; B 86 0 519 750 ;
XC 81 ; WX 611 ; N Q ; B 59 -34 582 765 ;
XC 82 ; WX 611 ; N R ; B 86 0 565 750 ;
XC 83 ; WX 556 ; N S ; B 51 -18 505 765 ;
XC 84 ; WX 500 ; N T ; B 15 0 486 750 ;
XC 85 ; WX 611 ; N U ; B 81 -18 531 750 ;
XC 86 ; WX 556 ; N V ; B 11 0 545 750 ;
XC 87 ; WX 833 ; N W ; B 17 0 816 750 ;
XC 88 ; WX 556 ; N X ; B 17 0 539 750 ;
XC 89 ; WX 556 ; N Y ; B 11 0 546 750 ;
XC 90 ; WX 500 ; N Z ; B 28 0 473 750 ;
XC 91 ; WX 333 ; N bracketleft ; B 100 -209 275 750 ;
XC 92 ; WX 250 ; N backslash ; B -31 0 281 750 ;
XC 93 ; WX 333 ; N bracketright ; B 58 -209 233 750 ;
XC 94 ; WX 500 ; N asciicircum ; B 70 333 431 750 ;
XC 95 ; WX 500 ; N underscore ; B 0 -119 500 -61 ;
XC 96 ; WX 222 ; N quoteleft ; B 64 521 158 767 ;
XC 97 ; WX 444 ; N a ; B 31 -15 417 571 ;
XC 98 ; WX 500 ; N b ; B 75 -15 447 750 ;
XC 99 ; WX 444 ; N c ; B 44 -15 405 571 ;
XC 100 ; WX 500 ; N d ; B 48 -15 424 750 ;
XC 101 ; WX 444 ; N e ; B 43 -15 395 571 ;
XC 102 ; WX 278 ; N f ; B 12 0 259 752 ; L i fi ; L l fl ;
XC 103 ; WX 500 ; N g ; B 45 -189 426 571 ;
XC 104 ; WX 500 ; N h ; B 73 0 428 750 ;
XC 105 ; WX 222 ; N i ; B 72 0 151 750 ;
XC 106 ; WX 222 ; N j ; B 13 -190 154 750 ;
XC 107 ; WX 444 ; N k ; B 69 0 439 750 ;
XC 108 ; WX 222 ; N l ; B 72 0 151 750 ;
XC 109 ; WX 778 ; N m ; B 76 0 703 571 ;
XC 110 ; WX 500 ; N n ; B 73 0 428 571 ;
XC 111 ; WX 500 ; N o ; B 51 -15 449 571 ;
XC 112 ; WX 500 ; N p ; B 72 -188 447 571 ;
XC 113 ; WX 500 ; N q ; B 55 -184 426 571 ;
XC 114 ; WX 333 ; N r ; B 81 0 322 563 ;
XC 115 ; WX 444 ; N s ; B 43 -15 400 571 ;
XC 116 ; WX 278 ; N t ; B 9 0 257 707 ;
XC 117 ; WX 500 ; N u ; B 77 -15 424 556 ;
XC 118 ; WX 444 ; N v ; B 13 0 431 556 ;
XC 119 ; WX 667 ; N w ; B 19 0 649 556 ;
XC 120 ; WX 444 ; N x ; B 9 0 436 556 ;
XC 121 ; WX 444 ; N y ; B 5 -190 425 556 ;
XC 122 ; WX 389 ; N z ; B 24 0 366 556 ;
XC 123 ; WX 274 ; N braceleft ; B 7 -95 266 750 ;
XC 124 ; WX 250 ; N bar ; B 93 0 157 750 ;
XC 125 ; WX 274 ; N braceright ; B 8 -95 267 750 ;
XC 126 ; WX 500 ; N asciitilde ; B 44 166 457 345 ;
XC 161 ; WX 333 ; N exclamdown ; B 121 -179 212 571 ;
XC 162 ; WX 500 ; N cent ; B 58 -137 418 667 ;
XC 163 ; WX 500 ; N sterling ; B 30 -15 485 750 ;
XC 164 ; WX 167 ; N fraction ; B -174 0 341 750 ;
XC 165 ; WX 500 ; N yen ; B -17 0 518 750 ;
XC 166 ; WX 500 ; N florin ; B 10 -192 488 750 ;
XC 167 ; WX 500 ; N section ; B 35 -208 466 750 ;
XC 168 ; WX 500 ; N currency ; B 24 50 475 553 ;
XC 169 ; WX 250 ; N quotesingle ; B 99 513 151 739 ;
XC 170 ; WX 389 ; N quotedblleft ; B 62 521 327 767 ;
XC 171 ; WX 500 ; N guillemotleft ; B 85 125 415 495 ;
XC 172 ; WX 278 ; N guilsinglleft ; B 64 125 215 495 ;
XC 173 ; WX 278 ; N guilsinglright ; B 63 125 214 495 ;
XC 174 ; WX 500 ; N fi ; B 12 0 427 752 ;
XC 175 ; WX 500 ; N fl ; B 12 0 425 752 ;
XC 177 ; WX 500 ; N endash ; B 0 275 500 345 ;
XC 178 ; WX 500 ; N dagger ; B 40 -176 461 750 ;
XC 179 ; WX 500 ; N daggerdbl ; B 39 -176 462 750 ;
XC 180 ; WX 250 ; N periodcentered ; B 80 204 171 304 ;
XC 182 ; WX 440 ; N paragraph ; B 0 -116 391 750 ;
XC 183 ; WX 333 ; N bullet ; B 15 222 318 529 ;
XC 184 ; WX 222 ; N quotesinglbase ; B 64 -146 158 100 ;
XC 185 ; WX 389 ; N quotedblbase ; B 62 -146 327 100 ;
XC 186 ; WX 389 ; N quotedblright ; B 62 504 327 750 ;
XC 187 ; WX 500 ; N guillemotright ; B 85 125 415 495 ;
XC 188 ; WX 1000 ; N ellipsis ; B 121 0 878 100 ;
XC 189 ; WX 1111 ; N perthousand ; B 47 -16 1071 750 ;
XC 191 ; WX 500 ; N questiondown ; B 38 -190 440 559 ;
XC 193 ; WX 333 ; N grave ; B 35 624 233 765 ;
XC 194 ; WX 333 ; N acute ; B 100 624 298 765 ;
XC 195 ; WX 333 ; N circumflex ; B 21 624 313 765 ;
XC 196 ; WX 333 ; N tilde ; B -3 634 337 750 ;
XC 197 ; WX 333 ; N macron ; B 10 657 323 715 ;
XC 198 ; WX 333 ; N breve ; B 12 629 321 765 ;
XC 199 ; WX 250 ; N dotaccent ; B 86 650 165 750 ;
XC 200 ; WX 333 ; N dieresis ; B 52 650 281 750 ;
XC 202 ; WX 250 ; N ring ; B 23 593 227 796 ;
XC 203 ; WX 333 ; N cedilla ; B 66 -224 281 0 ;
XC 205 ; WX 333 ; N hungarumlaut ; B 61 624 440 765 ;
XC 206 ; WX 333 ; N ogonek ; B 0 -191 208 13 ;
XC 207 ; WX 333 ; N caron ; B 21 624 313 765 ;
XC 208 ; WX 1000 ; N emdash ; B 0 275 1000 345 ;
XC 225 ; WX 833 ; N AE ; B 0 0 785 750 ;
XC 227 ; WX 300 ; N ordfeminine ; B 25 305 276 765 ;
XC 232 ; WX 500 ; N Lslash ; B -13 0 472 750 ;
XC 233 ; WX 611 ; N Oslash ; B 29 -43 573 796 ;
XC 234 ; WX 833 ; N OE ; B 56 -18 787 765 ;
XC 235 ; WX 300 ; N ordmasculine ; B 20 305 279 765 ;
XC 241 ; WX 667 ; N ae ; B 26 -15 630 571 ;
XC 245 ; WX 222 ; N dotlessi ; B 72 0 151 556 ;
XC 248 ; WX 222 ; N lslash ; B -8 0 231 750 ;
XC 249 ; WX 500 ; N oslash ; B 25 -46 472 582 ;
XC 250 ; WX 722 ; N oe ; B 40 -15 676 571 ;
XC 251 ; WX 500 ; N germandbls ; B 71 -5 445 765 ;
XC -1 ; WX 556 ; N Aacute ; B 11 0 546 959 ;
XC -1 ; WX 556 ; N Acircumflex ; B 11 0 546 959 ;
XC -1 ; WX 556 ; N Adieresis ; B 11 0 546 944 ;


XC -1 ; WX 556 ; N Agrave ; B 11 0 546 959 ;

XC -1 ; WX 556 ; N Aring ; B 11 0 546 990 ;
XC -1 ; WX 556 ; N Atilde ; B 11 0 546 944 ;
XC -1 ; WX 556 ; N Ccedilla ; B 53 -224 503 765 ;
XC -1 ; WX 500 ; N Eacute ; B 74 0 451 959 ;
XC -1 ; WX 500 ; N Ecircumflex ; B 74 0 451 959 ;
XC -1 ; WX 500 ; N Edieresis ; B 74 0 451 944 ;
XC -1 ; WX 500 ; N Egrave ; B 74 0 451 959 ;
XC -1 ; WX 611 ; N Eth ; B -6 0 548 750 ;
XC -1 ; WX 278 ; N Iacute ; B 73 0 271 959 ;
XC -1 ; WX 278 ; N Icircumflex ; B -6 0 286 959 ;
XC -1 ; WX 278 ; N Idieresis ; B 25 0 254 944 ;
XC -1 ; WX 278 ; N Igrave ; B 8 0 206 959 ;
XC -1 ; WX 611 ; N Ntilde ; B 77 0 534 944 ;
XC -1 ; WX 611 ; N Oacute ; B 59 -18 553 959 ;
XC -1 ; WX 611 ; N Ocircumflex ; B 59 -18 553 959 ;
XC -1 ; WX 611 ; N Odieresis ; B 59 -18 553 944 ;
XC -1 ; WX 611 ; N Ograve ; B 59 -18 553 959 ;
XC -1 ; WX 611 ; N Otilde ; B 59 -18 553 944 ;
XC -1 ; WX 556 ; N Scaron ; B 51 -18 505 959 ;
XC -1 ; WX 556 ; N Thorn ; B 86 0 519 750 ;
XC -1 ; WX 611 ; N Uacute ; B 81 -18 531 959 ;
XC -1 ; WX 611 ; N Ucircumflex ; B 81 -18 531 959 ;
XC -1 ; WX 611 ; N Udieresis ; B 81 -18 531 944 ;
XC -1 ; WX 611 ; N Ugrave ; B 81 -18 531 959 ;
XC -1 ; WX 556 ; N Yacute ; B 11 0 546 959 ;
XC -1 ; WX 556 ; N Ydieresis ; B 11 0 546 944 ;
XC -1 ; WX 500 ; N Zcaron ; B 28 0 473 959 ;
XC -1 ; WX 444 ; N aacute ; B 31 -15 417 765 ;
XC -1 ; WX 444 ; N acircumflex ; B 31 -15 417 765 ;
XC -1 ; WX 444 ; N adieresis ; B 31 -15 417 750 ;
XC -1 ; WX 444 ; N agrave ; B 31 -15 417 765 ;
XC -1 ; WX 444 ; N aring ; B 31 -15 417 796 ;
XC -1 ; WX 444 ; N atilde ; B 31 -15 417 750 ;
XC -1 ; WX 250 ; N brokenbar ; B 93 0 157 750 ;
XC -1 ; WX 444 ; N ccedilla ; B 44 -224 405 571 ;
XC -1 ; WX 800 ; N copyright ; B 8 -18 792 765 ;
XC -1 ; WX 400 ; N degree ; B 50 450 350 750 ;
XC -1 ; WX 500 ; N divide ; B 44 3 457 505 ;
XC -1 ; WX 444 ; N eacute ; B 43 -15 395 765 ;
XC -1 ; WX 444 ; N ecircumflex ; B 43 -15 395 765 ;
XC -1 ; WX 444 ; N edieresis ; B 43 -15 395 750 ;
XC -1 ; WX 444 ; N egrave ; B 43 -15 395 765 ;
XC -1 ; WX 500 ; N eth ; B 42 -15 440 770 ;
XC -1 ; WX 222 ; N iacute ; B 45 0 243 765 ;
XC -1 ; WX 222 ; N icircumflex ; B -34 0 258 765 ;
XC -1 ; WX 222 ; N idieresis ; B -3 0 226 750 ;
XC -1 ; WX 222 ; N igrave ; B -20 0 178 765 ;
XC -1 ; WX 500 ; N logicalnot ; B 44 117 457 384 ;
XC -1 ; WX 500 ; N minus ; B 44 219 457 289 ;
XC -1 ; WX 500 ; N mu ; B 75 -189 422 556 ;
XC -1 ; WX 500 ; N multiply ; B 44 48 457 461 ;
XC -1 ; WX 500 ; N ntilde ; B 73 0 428 750 ;
XC -1 ; WX 500 ; N oacute ; B 51 -15 449 765 ;
XC -1 ; WX 500 ; N ocircumflex ; B 51 -15 449 765 ;
XC -1 ; WX 500 ; N odieresis ; B 51 -15 449 750 ;
XC -1 ; WX 500 ; N ograve ; B 51 -15 449 765 ;
XC -1 ; WX 750 ; N onehalf ; B 42 0 709 750 ;
XC -1 ; WX 750 ; N onequarter ; B 34 0 716 750 ;
XC -1 ; WX 300 ; N onesuperior ; B 67 300 233 750 ;
XC -1 ; WX 500 ; N otilde ; B 51 -15 449 750 ;
XC -1 ; WX 500 ; N plusminus ; B 44 0 457 505 ;
XC -1 ; WX 800 ; N registered ; B 8 -18 792 765 ;
XC -1 ; WX 444 ; N scaron ; B 43 -15 400 765 ;
XC -1 ; WX 500 ; N thorn ; B 72 -188 447 750 ;
XC -1 ; WX 750 ; N threequarters ; B 21 0 730 750 ;
XC -1 ; WX 300 ; N threesuperior ; B 17 291 283 750 ;
XC -1 ; WX 750 ; N trademark ; B 0 329 719 750 ;
XC -1 ; WX 300 ; N twosuperior ; B 19 300 281 750 ;
XC -1 ; WX 500 ; N uacute ; B 77 -15 424 765 ;
XC -1 ; WX 500 ; N ucircumflex ; B 77 -15 424 765 ;
XC -1 ; WX 500 ; N udieresis ; B 77 -15 424 750 ;
XC -1 ; WX 500 ; N ugrave ; B 77 -15 424 765 ;
XC -1 ; WX 444 ; N yacute ; B 5 -190 425 765 ;
XC -1 ; WX 444 ; N ydieresis ; B 5 -190 425 750 ;
XC -1 ; WX 389 ; N zcaron ; B 24 0 366 765 ;


XEndCharMetrics
XStartKernData
XStartKernPairs 115
X

XKPX A y -18


XKPX A w -18
XKPX A v -18

XKPX A quoteright -55
XKPX A Y -55

XKPX A W -37
XKPX A V -37

XKPX A T -55
X
XKPX F period -111
XKPX F comma -111

XKPX F A -37


X
XKPX L y -37

XKPX L quoteright -92


XKPX L Y -92
XKPX L W -74

XKPX L V -74
XKPX L T -74
X

XKPX P period -129
XKPX P comma -129

XKPX P A -37
X
XKPX R y 0

XKPX R Y -18


XKPX R W 0
XKPX R V 0

XKPX R T -18
X

XKPX T y -55
XKPX T w -74
XKPX T u -74

XKPX T semicolon -74


XKPX T s -74
XKPX T r -74

XKPX T period -92
XKPX T o -74


XKPX T i -18
XKPX T hyphen -55

XKPX T e -74
XKPX T comma -92


XKPX T colon -74
XKPX T c -74
XKPX T a -74

XKPX T A -55
X

XKPX V y 0
XKPX V u -18
XKPX V semicolon -18
XKPX V r -18
XKPX V period -92
XKPX V o -18


XKPX V i 0
XKPX V hyphen -18

XKPX V e -18
XKPX V comma -92


XKPX V colon -18
XKPX V a -18
XKPX V A -37
X
XKPX W y 0
XKPX W u 0
XKPX W semicolon 0
XKPX W r 0
XKPX W period -74

XKPX W o -18
XKPX W i 0
XKPX W hyphen -18


XKPX W e -18
XKPX W comma -74

XKPX W colon 0
XKPX W a -18


XKPX W A -18
X
XKPX Y v -18

XKPX Y u -37
XKPX Y semicolon -37
XKPX Y q -55
XKPX Y period -111


XKPX Y p -37
XKPX Y o -55
XKPX Y i -18

XKPX Y hyphen -74
XKPX Y e -55
XKPX Y comma -111
XKPX Y colon -37
XKPX Y a -55


XKPX Y A -55
X

XKPX f quoteright 18
XKPX f f 0

X
XKPX quoteleft quoteleft -18
X

XKPX quoteright t 0
XKPX quoteright s -55

XKPX quoteright quoteright -18
X

XKPX r z 20
XKPX r y 18
XKPX r x 20
XKPX r w 18
XKPX r v 18
XKPX r u 0
XKPX r t 0
XKPX r r 0
XKPX r quoteright 0

XKPX r q 0


XKPX r period -74
XKPX r o 0
XKPX r n 0
XKPX r m 0
XKPX r hyphen -37
XKPX r h 0
XKPX r g 0
XKPX r f 20
XKPX r e 0
XKPX r d 0

XKPX r comma -74
XKPX r c -20


X
XKPX v period -55
XKPX v comma -55
X
XKPX w period -37
XKPX w comma -37
X

XKPX y period -55
XKPX y comma -55

XEndKernPairs
XEndKernData
XStartComposites 58
XCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 83 194 ;
XCC zcaron 2 ; PCC z 0 0 ; PCC caron 28 0 ;
XCC Scaron 2 ; PCC S 0 0 ; PCC caron 111 194 ;
XCC scaron 2 ; PCC s 0 0 ; PCC caron 55 0 ;
XCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 111 0 ;


XCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 55 0 ;

XCC Yacute 2 ; PCC Y 0 0 ; PCC acute 111 194 ;
XCC yacute 2 ; PCC y 0 0 ; PCC acute 55 0 ;
XCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 111 194 ;
XCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 55 0 ;
XCC Uacute 2 ; PCC U 0 0 ; PCC acute 139 194 ;
XCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 139 194 ;
XCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 139 194 ;
XCC Ugrave 2 ; PCC U 0 0 ; PCC grave 139 194 ;
XCC uacute 2 ; PCC u 0 0 ; PCC acute 83 0 ;
XCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 83 0 ;
XCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 83 0 ;
XCC ugrave 2 ; PCC u 0 0 ; PCC grave 83 0 ;
XCC Iacute 2 ; PCC I 0 0 ; PCC acute -27 194 ;
XCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex -27 194 ;
XCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis -27 194 ;
XCC Igrave 2 ; PCC I 0 0 ; PCC grave -27 194 ;
XCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -55 0 ;
XCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -55 0 ;
XCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -55 0 ;
XCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -55 0 ;
XCC Eacute 2 ; PCC E 0 0 ; PCC acute 83 194 ;
XCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 83 194 ;
XCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 83 194 ;
XCC Egrave 2 ; PCC E 0 0 ; PCC grave 83 194 ;
XCC eacute 2 ; PCC e 0 0 ; PCC acute 55 0 ;
XCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 55 0 ;
XCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 55 0 ;
XCC egrave 2 ; PCC e 0 0 ; PCC grave 55 0 ;
XCC Aacute 2 ; PCC A 0 0 ; PCC acute 111 194 ;
XCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 111 194 ;
XCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 111 194 ;
XCC Agrave 2 ; PCC A 0 0 ; PCC grave 111 194 ;
XCC aacute 2 ; PCC a 0 0 ; PCC acute 55 0 ;
XCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 55 0 ;
XCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 55 0 ;
XCC agrave 2 ; PCC a 0 0 ; PCC grave 55 0 ;
XCC Oacute 2 ; PCC O 0 0 ; PCC acute 139 194 ;
XCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 139 194 ;
XCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 139 194 ;
XCC Ograve 2 ; PCC O 0 0 ; PCC grave 139 194 ;


XCC oacute 2 ; PCC o 0 0 ; PCC acute 83 0 ;
XCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 83 0 ;
XCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 83 0 ;
XCC ograve 2 ; PCC o 0 0 ; PCC grave 83 0 ;

XCC Atilde 2 ; PCC A 0 0 ; PCC tilde 111 194 ;
XCC atilde 2 ; PCC a 0 0 ; PCC tilde 55 0 ;
XCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 139 194 ;
XCC ntilde 2 ; PCC n 0 0 ; PCC tilde 83 0 ;
XCC Otilde 2 ; PCC O 0 0 ; PCC tilde 139 194 ;


XCC otilde 2 ; PCC o 0 0 ; PCC tilde 83 0 ;

XCC Aring 2 ; PCC A 0 0 ; PCC ring 153 194 ;
XCC aring 2 ; PCC a 0 0 ; PCC ring 97 0 ;
XEndComposites
XEndFontMetrics
END_OF_FILE
if test 15475 -ne `wc -c <'lout/font0/HelveCon.AFM'`; then
echo shar: \"'lout/font0/HelveCon.AFM'\" unpacked with wrong size!
fi
# end of 'lout/font0/HelveCon.AFM'
fi
if test -f 'lout/font0/HelveObl.AFM' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/font0/HelveObl.AFM'\"
else
echo shar: Extracting \"'lout/font0/HelveObl.AFM'\" \(15486 characters\)
sed "s/^X//" >'lout/font0/HelveObl.AFM' <<'END_OF_FILE'


XStartFontMetrics 2.0
XComment Copyright (c) 1984 Adobe Systems Incorporated. All Rights Reserved.

XComment Creation Date:Sun Feb 8 20:00:37 PST 1987
XFontName Helvetica-Oblique
XEncodingScheme AdobeStandardEncoding
XFullName Helvetica Oblique


XFamilyName Helvetica
XWeight Medium
XItalicAngle -12.0

XIsFixedPitch false
XUnderlinePosition -106
XUnderlineThickness 73
XVersion 001.002

XNotice Helvetica is a registered trademark of Allied Corporation.
XFontBBox -178 -220 1108 944
XCapHeight 729
XXHeight 525


XDescender -219
XAscender 729
XStartCharMetrics 228

XC 32 ; WX 278 ; N space ; B 0 0 0 0 ;

XC 33 ; WX 278 ; N exclam ; B 124 0 363 729 ;
XC 34 ; WX 355 ; N quotedbl ; B 177 462 455 708 ;
XC 35 ; WX 556 ; N numbersign ; B 54 -20 649 698 ;
XC 36 ; WX 556 ; N dollar ; B 69 -125 613 770 ;
XC 37 ; WX 889 ; N percent ; B 134 -20 895 708 ;
XC 38 ; WX 667 ; N ampersand ; B 83 -23 644 710 ;
XC 39 ; WX 222 ; N quoteright ; B 165 476 308 708 ;
XC 40 ; WX 333 ; N parenleft ; B 113 -213 446 729 ;
XC 41 ; WX 333 ; N parenright ; B -7 -213 325 729 ;
XC 42 ; WX 389 ; N asterisk ; B 169 452 471 740 ;
XC 43 ; WX 584 ; N plus ; B 92 -10 591 474 ;
XC 44 ; WX 278 ; N comma ; B 55 -150 214 104 ;
XC 45 ; WX 333 ; N hyphen ; B 97 240 351 313 ;
XC 46 ; WX 278 ; N period ; B 87 0 213 104 ;
XC 47 ; WX 278 ; N slash ; B -12 -21 434 708 ;
XC 48 ; WX 556 ; N zero ; B 98 -23 598 709 ;
XC 49 ; WX 556 ; N one ; B 208 0 498 709 ;
XC 50 ; WX 556 ; N two ; B 34 0 620 710 ;
XC 51 ; WX 556 ; N three ; B 71 -23 599 709 ;
XC 52 ; WX 556 ; N four ; B 63 0 573 709 ;
XC 53 ; WX 556 ; N five ; B 70 -23 629 709 ;
XC 54 ; WX 556 ; N six ; B 93 -23 611 709 ;
XC 55 ; WX 556 ; N seven ; B 137 0 671 709 ;
XC 56 ; WX 556 ; N eight ; B 74 -23 604 709 ;
XC 57 ; WX 556 ; N nine ; B 83 -23 599 709 ;
XC 58 ; WX 278 ; N colon ; B 110 0 326 525 ;
XC 59 ; WX 278 ; N semicolon ; B 78 -150 325 516 ;
XC 60 ; WX 584 ; N less ; B 87 -10 635 474 ;
XC 61 ; WX 584 ; N equal ; B 74 112 609 352 ;
XC 62 ; WX 584 ; N greater ; B 48 -10 596 474 ;
XC 63 ; WX 556 ; N question ; B 184 0 630 738 ;
XC 64 ; WX 1015 ; N at ; B 80 -146 1036 737 ;
XC 65 ; WX 667 ; N A ; B 17 0 653 729 ;
XC 66 ; WX 667 ; N B ; B 79 0 711 729 ;
XC 67 ; WX 722 ; N C ; B 112 -23 770 741 ;
XC 68 ; WX 722 ; N D ; B 89 0 759 729 ;
XC 69 ; WX 667 ; N E ; B 90 0 751 729 ;
XC 70 ; WX 611 ; N F ; B 90 0 734 729 ;
XC 71 ; WX 778 ; N G ; B 109 -23 809 741 ;
XC 72 ; WX 722 ; N H ; B 83 0 799 729 ;
XC 73 ; WX 278 ; N I ; B 100 0 349 729 ;
XC 74 ; WX 500 ; N J ; B 47 -26 581 729 ;
XC 75 ; WX 667 ; N K ; B 79 0 813 729 ;
XC 76 ; WX 556 ; N L ; B 80 0 551 729 ;
XC 77 ; WX 833 ; N M ; B 75 0 916 729 ;
XC 78 ; WX 722 ; N N ; B 76 0 801 729 ;
XC 79 ; WX 778 ; N O ; B 104 -23 828 741 ;
XC 80 ; WX 667 ; N P ; B 91 0 733 730 ;
XC 81 ; WX 778 ; N Q ; B 104 -59 828 741 ;
XC 82 ; WX 722 ; N R ; B 93 0 770 729 ;
XC 83 ; WX 667 ; N S ; B 89 -23 714 741 ;
XC 84 ; WX 611 ; N T ; B 158 0 748 729 ;
XC 85 ; WX 722 ; N U ; B 124 -23 800 729 ;
XC 86 ; WX 667 ; N V ; B 185 0 800 729 ;
XC 87 ; WX 944 ; N W ; B 177 0 1084 729 ;
XC 88 ; WX 667 ; N X ; B 22 0 794 729 ;
XC 89 ; WX 667 ; N Y ; B 168 0 816 729 ;
XC 90 ; WX 611 ; N Z ; B 28 0 737 729 ;
XC 91 ; WX 278 ; N bracketleft ; B 19 -214 405 729 ;
XC 92 ; WX 278 ; N backslash ; B 147 -20 280 729 ;
XC 93 ; WX 278 ; N bracketright ; B -23 -215 364 729 ;
XC 94 ; WX 469 ; N asciicircum ; B 115 333 496 713 ;
XC 95 ; WX 556 ; N underscore ; B -59 -175 551 -125 ;
XC 96 ; WX 222 ; N quoteleft ; B 163 459 308 708 ;
XC 97 ; WX 556 ; N a ; B 65 -23 568 540 ;
XC 98 ; WX 556 ; N b ; B 54 -23 588 729 ;
XC 99 ; WX 500 ; N c ; B 76 -23 554 540 ;
XC 100 ; WX 556 ; N d ; B 73 -23 650 729 ;
XC 101 ; WX 556 ; N e ; B 84 -23 580 541 ;
XC 102 ; WX 278 ; N f ; B 89 0 413 733 ; L i fi ; L l fl ;
XC 103 ; WX 556 ; N g ; B 32 -220 601 540 ;
XC 104 ; WX 556 ; N h ; B 70 0 574 729 ;
XC 105 ; WX 222 ; N i ; B 66 0 305 729 ;
XC 106 ; WX 222 ; N j ; B -65 -220 308 729 ;
XC 107 ; WX 500 ; N k ; B 58 0 584 729 ;
XC 108 ; WX 222 ; N l ; B 68 0 307 729 ;
XC 109 ; WX 833 ; N m ; B 71 0 852 540 ;
XC 110 ; WX 556 ; N n ; B 70 0 574 540 ;
XC 111 ; WX 556 ; N o ; B 80 -23 576 540 ;
XC 112 ; WX 556 ; N p ; B 7 -219 586 540 ;
XC 113 ; WX 556 ; N q ; B 71 -219 607 540 ;
XC 114 ; WX 333 ; N r ; B 69 0 436 540 ;
XC 115 ; WX 500 ; N s ; B 61 -24 520 540 ;
XC 116 ; WX 278 ; N t ; B 97 -24 366 667 ;
XC 117 ; WX 556 ; N u ; B 88 -23 594 525 ;
XC 118 ; WX 500 ; N v ; B 122 0 598 525 ;
XC 119 ; WX 722 ; N w ; B 118 0 820 525 ;
XC 120 ; WX 500 ; N x ; B 17 0 583 525 ;
XC 121 ; WX 500 ; N y ; B 8 -219 590 525 ;
XC 122 ; WX 500 ; N z ; B 31 0 557 525 ;
XC 123 ; WX 334 ; N braceleft ; B 91 -214 431 731 ;
XC 124 ; WX 260 ; N bar ; B 54 -215 315 729 ;
XC 125 ; WX 334 ; N braceright ; B -16 -214 324 731 ;
XC 126 ; WX 584 ; N asciitilde ; B 137 267 594 438 ;
XC 161 ; WX 333 ; N exclamdown ; B 76 -214 317 525 ;
XC 162 ; WX 556 ; N cent ; B 96 -120 585 628 ;
XC 163 ; WX 556 ; N sterling ; B 44 -21 628 726 ;
XC 164 ; WX 167 ; N fraction ; B -178 -21 486 708 ;
XC 165 ; WX 556 ; N yen ; B 100 0 696 710 ;
XC 166 ; WX 556 ; N florin ; B -32 -214 696 742 ;
XC 167 ; WX 556 ; N section ; B 63 -215 589 729 ;
XC 168 ; WX 556 ; N currency ; B 110 126 593 554 ;
XC 169 ; WX 191 ; N quotesingle ; B 173 462 292 708 ;
XC 170 ; WX 333 ; N quotedblleft ; B 146 459 449 708 ;
XC 171 ; WX 556 ; N guillemotleft ; B 147 106 548 438 ;
XC 172 ; WX 333 ; N guilsinglleft ; B 140 112 336 436 ;
XC 173 ; WX 333 ; N guilsinglright ; B 109 112 307 436 ;
XC 174 ; WX 500 ; N fi ; B 83 0 591 733 ;
XC 175 ; WX 500 ; N fl ; B 88 0 585 733 ;
XC 177 ; WX 556 ; N endash ; B 46 240 628 313 ;
XC 178 ; WX 556 ; N dagger ; B 127 -178 620 710 ;
XC 179 ; WX 556 ; N daggerdbl ; B 51 -178 620 710 ;
XC 180 ; WX 278 ; N periodcentered ; B 166 318 293 442 ;
XC 182 ; WX 537 ; N paragraph ; B 145 -178 677 729 ;
XC 183 ; WX 350 ; N bullet ; B 120 220 376 470 ;
XC 184 ; WX 222 ; N quotesinglbase ; B 37 -129 180 103 ;
XC 185 ; WX 333 ; N quotedblbase ; B 20 -129 322 103 ;
XC 186 ; WX 333 ; N quotedblright ; B 150 476 452 708 ;
XC 187 ; WX 556 ; N guillemotright ; B 121 106 518 438 ;
XC 188 ; WX 1000 ; N ellipsis ; B 115 0 907 104 ;
XC 189 ; WX 1000 ; N perthousand ; B 93 -20 1024 740 ;
XC 191 ; WX 611 ; N questiondown ; B 86 -213 531 525 ;
XC 193 ; WX 333 ; N grave ; B 179 592 357 740 ;
XC 194 ; WX 333 ; N acute ; B 218 592 458 740 ;
XC 195 ; WX 333 ; N circumflex ; B 146 591 433 741 ;
XC 196 ; WX 333 ; N tilde ; B 130 589 471 716 ;
XC 197 ; WX 333 ; N macron ; B 160 621 450 694 ;
XC 198 ; WX 333 ; N breve ; B 165 594 471 729 ;
XC 199 ; WX 333 ; N dotaccent ; B 244 605 370 709 ;
XC 200 ; WX 333 ; N dieresis ; B 159 605 446 708 ;
XC 202 ; WX 333 ; N ring ; B 216 566 396 741 ;
XC 203 ; WX 333 ; N cedilla ; B 1 -214 264 0 ;
XC 205 ; WX 333 ; N hungarumlaut ; B 91 592 505 740 ;
XC 206 ; WX 333 ; N ogonek ; B 35 -189 246 15 ;
XC 207 ; WX 333 ; N caron ; B 176 590 463 740 ;
XC 208 ; WX 1000 ; N emdash ; B 42 240 1068 313 ;
XC 225 ; WX 1000 ; N AE ; B 11 0 1087 729 ;
XC 227 ; WX 370 ; N ordfeminine ; B 107 301 441 740 ;
XC 232 ; WX 556 ; N Lslash ; B 61 0 570 729 ;
XC 233 ; WX 778 ; N Oslash ; B 32 -23 867 742 ;
XC 234 ; WX 1000 ; N OE ; B 101 -20 1108 739 ;
XC 235 ; WX 365 ; N ordmasculine ; B 114 301 452 741 ;
XC 241 ; WX 889 ; N ae ; B 59 -20 915 546 ;
XC 245 ; WX 278 ; N dotlessi ; B 94 0 290 525 ;
XC 248 ; WX 222 ; N lslash ; B 62 0 312 729 ;
XC 249 ; WX 611 ; N oslash ; B 19 -27 639 548 ;
XC 250 ; WX 944 ; N oe ; B 85 -22 966 540 ;
XC 251 ; WX 611 ; N germandbls ; B 126 -20 655 729 ;
XC -1 ; WX 667 ; N Aacute ; B 17 0 667 939 ;
XC -1 ; WX 667 ; N Acircumflex ; B 17 0 653 940 ;
XC -1 ; WX 667 ; N Adieresis ; B 17 0 655 907 ;
XC -1 ; WX 667 ; N Agrave ; B 17 0 653 939 ;
XC -1 ; WX 667 ; N Aring ; B 17 0 653 940 ;
XC -1 ; WX 667 ; N Atilde ; B 17 0 680 915 ;
XC -1 ; WX 722 ; N Ccedilla ; B 112 -214 770 741 ;
XC -1 ; WX 667 ; N Eacute ; B 90 0 751 939 ;
XC -1 ; WX 667 ; N Ecircumflex ; B 90 0 751 940 ;
XC -1 ; WX 667 ; N Edieresis ; B 90 0 751 907 ;
XC -1 ; WX 667 ; N Egrave ; B 90 0 751 939 ;
XC -1 ; WX 722 ; N Eth ; B 73 0 759 729 ;
XC -1 ; WX 278 ; N Iacute ; B 100 0 479 939 ;
XC -1 ; WX 278 ; N Icircumflex ; B 100 0 454 940 ;
XC -1 ; WX 278 ; N Idieresis ; B 100 0 467 907 ;
XC -1 ; WX 278 ; N Igrave ; B 100 0 378 939 ;
XC -1 ; WX 722 ; N Ntilde ; B 76 0 801 915 ;
XC -1 ; WX 778 ; N Oacute ; B 104 -23 828 939 ;
XC -1 ; WX 778 ; N Ocircumflex ; B 104 -23 828 940 ;
XC -1 ; WX 778 ; N Odieresis ; B 104 -23 828 907 ;
XC -1 ; WX 778 ; N Ograve ; B 104 -23 828 939 ;
XC -1 ; WX 778 ; N Otilde ; B 104 -23 828 915 ;
XC -1 ; WX 667 ; N Scaron ; B 89 -23 714 939 ;
XC -1 ; WX 667 ; N Thorn ; B 91 0 707 729 ;
XC -1 ; WX 722 ; N Uacute ; B 124 -23 800 939 ;
XC -1 ; WX 722 ; N Ucircumflex ; B 124 -23 800 940 ;
XC -1 ; WX 722 ; N Udieresis ; B 124 -23 800 907 ;
XC -1 ; WX 722 ; N Ugrave ; B 124 -23 800 939 ;
XC -1 ; WX 667 ; N Yacute ; B 168 0 816 944 ;
XC -1 ; WX 667 ; N Ydieresis ; B 168 0 816 907 ;
XC -1 ; WX 611 ; N Zcaron ; B 28 0 737 939 ;
XC -1 ; WX 556 ; N aacute ; B 65 -23 570 740 ;
XC -1 ; WX 556 ; N acircumflex ; B 65 -23 568 741 ;
XC -1 ; WX 556 ; N adieresis ; B 65 -23 568 708 ;
XC -1 ; WX 556 ; N agrave ; B 65 -23 568 740 ;
XC -1 ; WX 556 ; N aring ; B 65 -23 568 741 ;
XC -1 ; WX 556 ; N atilde ; B 65 -23 583 716 ;
XC -1 ; WX 260 ; N brokenbar ; B 54 -215 315 729 ;
XC -1 ; WX 500 ; N ccedilla ; B 76 -214 554 540 ;
XC -1 ; WX 737 ; N copyright ; B 55 -23 836 741 ;
XC -1 ; WX 400 ; N degree ; B 165 409 472 709 ;
XC -1 ; WX 584 ; N divide ; B 92 -10 591 474 ;
XC -1 ; WX 556 ; N eacute ; B 84 -23 580 740 ;
XC -1 ; WX 556 ; N ecircumflex ; B 84 -23 580 741 ;
XC -1 ; WX 556 ; N edieresis ; B 84 -23 580 708 ;
XC -1 ; WX 556 ; N egrave ; B 84 -23 580 740 ;
XC -1 ; WX 556 ; N eth ; B 80 -23 572 729 ;
XC -1 ; WX 278 ; N iacute ; B 94 0 431 740 ;
XC -1 ; WX 278 ; N icircumflex ; B 94 0 406 741 ;
XC -1 ; WX 278 ; N idieresis ; B 94 0 419 708 ;
XC -1 ; WX 278 ; N igrave ; B 94 0 330 740 ;
XC -1 ; WX 584 ; N logicalnot ; B 99 82 619 352 ;
XC -1 ; WX 584 ; N minus ; B 81 194 601 270 ;
XC -1 ; WX 556 ; N mu ; B 18 -219 594 525 ;
XC -1 ; WX 584 ; N multiply ; B 59 -10 625 476 ;
XC -1 ; WX 556 ; N ntilde ; B 70 0 589 716 ;
XC -1 ; WX 556 ; N oacute ; B 80 -23 576 740 ;
XC -1 ; WX 556 ; N ocircumflex ; B 80 -23 576 741 ;
XC -1 ; WX 556 ; N odieresis ; B 80 -23 576 708 ;
XC -1 ; WX 556 ; N ograve ; B 80 -23 576 740 ;
XC -1 ; WX 834 ; N onehalf ; B 116 -21 869 709 ;
XC -1 ; WX 834 ; N onequarter ; B 147 -21 836 709 ;
XC -1 ; WX 333 ; N onesuperior ; B 184 284 370 709 ;
XC -1 ; WX 556 ; N otilde ; B 80 -23 583 716 ;
XC -1 ; WX 584 ; N plusminus ; B 40 0 621 618 ;
XC -1 ; WX 737 ; N registered ; B 55 -23 836 741 ;
XC -1 ; WX 500 ; N scaron ; B 61 -24 547 740 ;
XC -1 ; WX 556 ; N thorn ; B 7 -219 588 729 ;
XC -1 ; WX 834 ; N threequarters ; B 114 -21 868 709 ;
XC -1 ; WX 333 ; N threesuperior ; B 96 270 435 709 ;
XC -1 ; WX 1000 ; N trademark ; B 208 320 1096 741 ;
XC -1 ; WX 333 ; N twosuperior ; B 71 284 447 710 ;
XC -1 ; WX 556 ; N uacute ; B 88 -23 594 740 ;
XC -1 ; WX 556 ; N ucircumflex ; B 88 -23 594 741 ;
XC -1 ; WX 556 ; N udieresis ; B 88 -23 594 708 ;
XC -1 ; WX 556 ; N ugrave ; B 88 -23 594 740 ;
XC -1 ; WX 500 ; N yacute ; B 8 -219 590 740 ;
XC -1 ; WX 500 ; N ydieresis ; B 8 -219 590 708 ;
XC -1 ; WX 500 ; N zcaron ; B 31 0 557 740 ;


XEndCharMetrics
XStartKernData
XStartKernPairs 98
X

XKPX A y -9


XKPX A w -18
XKPX A v -18

XKPX A space -37
XKPX A quoteright -37
XKPX A Y -74
XKPX A W -18
XKPX A V -55
XKPX A T -74


X
XKPX F space -18

XKPX F period -129
XKPX F comma -129

XKPX F A -74
X

XKPX L y -18


XKPX L space -18
XKPX L quoteright -55
XKPX L Y -92

XKPX L W -37


XKPX L V -55
XKPX L T -74
X
XKPX P space -37

XKPX P period -129
XKPX P comma -129
XKPX P A -74
X

XKPX R Y -37
XKPX R W -18
XKPX R V -18
XKPX R T -18


X
XKPX T y -74

XKPX T w -74
XKPX T u -74

XKPX T semicolon -74


XKPX T s -92
XKPX T r -74

XKPX T period -92
XKPX T o -92

XKPX T i -9


XKPX T hyphen -92
XKPX T e -92
XKPX T comma -92

XKPX T colon -74
XKPX T c -92
XKPX T a -92


XKPX T O -18
XKPX T A -74
X
XKPX V y -18
XKPX V u -18

XKPX V semicolon -18
XKPX V r -18
XKPX V period -74
XKPX V o -37
XKPX V i -18


XKPX V hyphen -37
XKPX V e -37

XKPX V comma -74
XKPX V colon -18
XKPX V a -37


XKPX V A -55
X

XKPX W period -37
XKPX W i -9
XKPX W hyphen -18
XKPX W e -18
XKPX W comma -37
XKPX W a -18
XKPX W A -18


X
XKPX Y v -37
XKPX Y u -37
XKPX Y space -18
XKPX Y semicolon -37

XKPX Y q -55
XKPX Y period -92
XKPX Y p -55


XKPX Y o -55
XKPX Y i -18

XKPX Y hyphen -74
XKPX Y e -55
XKPX Y comma -92
XKPX Y colon -37


XKPX Y a -74
XKPX Y A -55
X
XKPX f quoteright 37

X
XKPX one one -74
X
XKPX quoteleft quoteleft -37
X

XKPX quoteright space -55


XKPX quoteright s -18
XKPX quoteright quoteright -37
X
XKPX r quoteright 37

XKPX r period -37
XKPX r hyphen -18


XKPX r comma -55
X
XKPX space Y -18

XKPX space A -37
X


XKPX v period -74
XKPX v comma -74

X
XKPX w period -55
XKPX w comma -55
X

XKPX y period -74
XKPX y comma -74
XEndKernPairs
XEndKernData
XStartComposites 58
XCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 139 204 ;
XCC zcaron 2 ; PCC z 0 0 ; PCC caron 83 0 ;
XCC Scaron 2 ; PCC S 0 0 ; PCC caron 167 204 ;
XCC scaron 2 ; PCC s 0 0 ; PCC caron 83 0 ;


XCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 194 0 ;

XCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 83 0 ;
XCC Yacute 2 ; PCC Y 0 0 ; PCC acute 167 204 ;
XCC yacute 2 ; PCC y 0 0 ; PCC acute 83 0 ;
XCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 167 204 ;
XCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 83 0 ;
XCC Uacute 2 ; PCC U 0 0 ; PCC acute 194 204 ;
XCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 194 204 ;
XCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 194 204 ;
XCC Ugrave 2 ; PCC U 0 0 ; PCC grave 194 204 ;
XCC uacute 2 ; PCC u 0 0 ; PCC acute 111 0 ;
XCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 111 0 ;
XCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 111 0 ;
XCC ugrave 2 ; PCC u 0 0 ; PCC grave 111 0 ;
XCC Iacute 2 ; PCC I 0 0 ; PCC acute -27 204 ;
XCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex -27 204 ;
XCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis -27 204 ;
XCC Igrave 2 ; PCC I 0 0 ; PCC grave -27 204 ;
XCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -27 0 ;
XCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -27 0 ;
XCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -27 0 ;
XCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -27 0 ;
XCC Eacute 2 ; PCC E 0 0 ; PCC acute 167 204 ;
XCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 167 204 ;
XCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 167 204 ;
XCC Egrave 2 ; PCC E 0 0 ; PCC grave 167 204 ;
XCC eacute 2 ; PCC e 0 0 ; PCC acute 111 0 ;
XCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 111 0 ;
XCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 111 0 ;
XCC egrave 2 ; PCC e 0 0 ; PCC grave 111 0 ;
XCC Aacute 2 ; PCC A 0 0 ; PCC acute 167 204 ;
XCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 167 204 ;
XCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 167 204 ;
XCC Agrave 2 ; PCC A 0 0 ; PCC grave 167 204 ;


XCC aacute 2 ; PCC a 0 0 ; PCC acute 111 0 ;
XCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 111 0 ;
XCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 111 0 ;
XCC agrave 2 ; PCC a 0 0 ; PCC grave 111 0 ;

XCC Oacute 2 ; PCC O 0 0 ; PCC acute 222 204 ;
XCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 222 204 ;
XCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 222 204 ;
XCC Ograve 2 ; PCC O 0 0 ; PCC grave 222 204 ;
XCC oacute 2 ; PCC o 0 0 ; PCC acute 111 0 ;
XCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 111 0 ;
XCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 111 0 ;
XCC ograve 2 ; PCC o 0 0 ; PCC grave 111 0 ;
XCC Atilde 2 ; PCC A 0 0 ; PCC tilde 167 204 ;


XCC atilde 2 ; PCC a 0 0 ; PCC tilde 111 0 ;

XCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 194 204 ;
XCC ntilde 2 ; PCC n 0 0 ; PCC tilde 111 0 ;
XCC Otilde 2 ; PCC O 0 0 ; PCC tilde 222 204 ;
XCC otilde 2 ; PCC o 0 0 ; PCC tilde 111 0 ;
XCC Aring 2 ; PCC A 0 0 ; PCC ring 167 204 ;


XCC aring 2 ; PCC a 0 0 ; PCC ring 111 0 ;
XEndComposites
XEndFontMetrics
END_OF_FILE

if test 15486 -ne `wc -c <'lout/font0/HelveObl.AFM'`; then
echo shar: \"'lout/font0/HelveObl.AFM'\" unpacked with wrong size!
fi
# end of 'lout/font0/HelveObl.AFM'
fi
echo shar: End of archive 19 \(of 30\).
cp /dev/null ark19isdone

Jeff Kingston

unread,
Jun 1, 1993, 11:03:26 PM6/1/93
to
Submitted-by: je...@joyce.cs.su.oz.au (Jeff Kingston)
Posting-number: Volume 37, Issue 118
Archive-name: lout/part20
Environment: UNIX

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: lout/doc/tr.lout/ch3.15 lout/font0/AvantGarBooObl.AFM
# lout/font0/AvantGarDem.AFM lout/font0/AvantGarDemObl.AFM
# lout/font0/BookmDemIta.AFM lout/font0/HelveBol.AFM
# Wrapped by kent@sparky on Sun May 30 19:43:59 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 20 (of 30)."'
if test -f 'lout/doc/tr.lout/ch3.15' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch3.15'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch3.15'\" \(1859 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch3.15' <<'END_OF_FILE'
X@Section
X @Title { "@Case" }
X @Tag { case }
X@Begin
X@PP
Xcase.sym @Index { @@Case symbol }
Xyield.sym @Index { @@Yield symbol }
XThe @@Case symbol selects its result from a list of alternatives,
Xdepending on a tag:
X@ID @Code {
X"@Day @Case {"
X" { 1 21 31 } @Yield st"
X" { 2 22 } @Yield nd"
X" { 3 23 } @Yield rd"
X" else @Yield th"
X"}"
X}
XIn this example the result will be st if @Code "@Day" is 1, 21, or 31,
Xand nd if @Code "@Day" is 2 or 22, etc. The effect is similar to
Xaccessing a database, though in a more compact form. The right parameter
Xis a sequence of @@Yield symbols, each with a left parameter whose value is
Xa sequence of one or more juxtapositions of simple words, and a right
Xparameter which may be any object.
X@PP
XWe first describe the behaviour when the value of the left parameter of
X@@Case is a juxtaposition of one or more simple words. Then the result of
Xthe @@Case is the right parameter of the first @@Yield whose left parameter
Xcontains either the value of the left parameter of the @@Case, or the special
Xvalue {@Code else}. If there is no such @@Yield it is an error.
X@PP
XWhen the left parameter of @@Case is not a juxtaposition of simple
Xwords, the result is the right parameter of the first @@Yield whose
Xleft parameter is {@Code else}, or an error otherwise. This permits
Xexamples like
X@ID @Code {
X"@RunningTitle @Case {"
X" dft @Yield @Title"
X" else @Yield @RunningTitle"
X"}"
X}
Xwhere a running title is returned unless it has the value {@Code dft}
X(which presumably means that no running title was supplied), in which
Xcase an ordinary title is returned instead.
X@PP
XWhen a receptive symbol is placed within a @@Case, it should be included
Xin each alternative, since otherwise Basser Lout may become confused when
Xtrying to predict whether the symbol will be a part of the result or not.
X@End @Section
END_OF_FILE
if test 1859 -ne `wc -c <'lout/doc/tr.lout/ch3.15'`; then
echo shar: \"'lout/doc/tr.lout/ch3.15'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch3.15'
fi
if test -f 'lout/font0/AvantGarBooObl.AFM' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/font0/AvantGarBooObl.AFM'\"
else
echo shar: Extracting \"'lout/font0/AvantGarBooObl.AFM'\" \(15273 characters\)
sed "s/^X//" >'lout/font0/AvantGarBooObl.AFM' <<'END_OF_FILE'


XStartFontMetrics 2.0
XComment Copyright (c) 1984 Adobe Systems Incorporated. All Rights Reserved.

XComment Creation Date:Thu Feb 5 16:53:37 PST 1987
XFontName AvantGarde-BookOblique
XEncodingScheme AdobeStandardEncoding
XFullName ITC Avant Garde Gothic Book Oblique
XFamilyName ITC Avant Garde Gothic
XWeight Book
XItalicAngle -10.5
XIsFixedPitch false
XUnderlinePosition -96
XUnderlineThickness 58
XVersion 001.002
XNotice ITC Avant Garde Gothic is a registered trademark of International Typeface Corporation.
XFontBBox -115 -223 1275 989
XCapHeight 739
XXHeight 547
XDescender -192
XAscender 739
XStartCharMetrics 228
XC 32 ; WX 277 ; N space ; B 0 0 0 0 ;
XC 33 ; WX 295 ; N exclam ; B 111 0 322 739 ;
XC 34 ; WX 309 ; N quotedbl ; B 169 513 374 739 ;
XC 35 ; WX 554 ; N numbersign ; B 51 0 640 739 ;
XC 36 ; WX 554 ; N dollar ; B 112 -54 575 808 ;
XC 37 ; WX 775 ; N percent ; B 117 -13 785 751 ;
XC 38 ; WX 757 ; N ampersand ; B 93 -13 774 751 ;
XC 39 ; WX 351 ; N quoteright ; B 192 546 390 739 ;
XC 40 ; WX 369 ; N parenleft ; B 106 -127 472 739 ;
XC 41 ; WX 369 ; N parenright ; B 10 -127 377 739 ;
XC 42 ; WX 425 ; N asterisk ; B 172 466 477 751 ;
XC 43 ; WX 606 ; N plus ; B 100 49 618 554 ;
XC 44 ; WX 277 ; N comma ; B 79 -67 276 126 ;
XC 45 ; WX 332 ; N hyphen ; B 80 267 364 334 ;
XC 46 ; WX 277 ; N period ; B 101 0 198 126 ;
XC 47 ; WX 437 ; N slash ; B 16 -128 534 739 ;
XC 48 ; WX 554 ; N zero ; B 71 -13 621 751 ;
XC 49 ; WX 554 ; N one ; B 280 0 491 739 ;
XC 50 ; WX 554 ; N two ; B 33 0 607 751 ;
XC 51 ; WX 554 ; N three ; B 71 -13 564 751 ;
XC 52 ; WX 554 ; N four ; B 37 0 597 739 ;
XC 53 ; WX 554 ; N five ; B 67 -13 604 739 ;
XC 54 ; WX 554 ; N six ; B 66 -13 579 739 ;
XC 55 ; WX 554 ; N seven ; B 108 0 627 739 ;
XC 56 ; WX 554 ; N eight ; B 78 -13 580 751 ;
XC 57 ; WX 554 ; N nine ; B 112 0 625 751 ;
XC 58 ; WX 277 ; N colon ; B 101 0 270 510 ;
XC 59 ; WX 277 ; N semicolon ; B 29 -67 298 510 ;
XC 60 ; WX 606 ; N less ; B 99 37 663 565 ;
XC 61 ; WX 606 ; N equal ; B 82 166 636 436 ;
XC 62 ; WX 606 ; N greater ; B 55 37 619 565 ;
XC 63 ; WX 591 ; N question ; B 159 0 627 751 ;
XC 64 ; WX 867 ; N at ; B 133 -12 883 752 ;
XC 65 ; WX 740 ; N A ; B 11 0 729 739 ;
XC 66 ; WX 574 ; N B ; B 76 0 607 739 ;
XC 67 ; WX 813 ; N C ; B 106 -13 869 751 ;
XC 68 ; WX 744 ; N D ; B 76 0 774 739 ;
XC 69 ; WX 536 ; N E ; B 76 0 617 739 ;
XC 70 ; WX 485 ; N F ; B 76 0 588 739 ;
XC 71 ; WX 872 ; N G ; B 107 -13 894 751 ;
XC 72 ; WX 683 ; N H ; B 76 0 744 739 ;
XC 73 ; WX 226 ; N I ; B 76 0 287 739 ;
XC 74 ; WX 482 ; N J ; B 41 -13 543 739 ;
XC 75 ; WX 591 ; N K ; B 76 0 722 739 ;
XC 76 ; WX 462 ; N L ; B 76 0 468 739 ;
XC 77 ; WX 919 ; N M ; B 76 0 980 739 ;
XC 78 ; WX 740 ; N N ; B 76 0 801 739 ;
XC 79 ; WX 869 ; N O ; B 106 -13 900 750 ;
XC 80 ; WX 592 ; N P ; B 76 0 665 739 ;
XC 81 ; WX 871 ; N Q ; B 105 -13 913 751 ;
XC 82 ; WX 607 ; N R ; B 76 0 673 739 ;
XC 83 ; WX 498 ; N S ; B 56 -13 564 751 ;
XC 84 ; WX 426 ; N T ; B 132 0 556 739 ;
XC 85 ; WX 655 ; N U ; B 119 -13 716 739 ;
XC 86 ; WX 702 ; N V ; B 147 0 829 739 ;
XC 87 ; WX 960 ; N W ; B 147 0 1087 739 ;
XC 88 ; WX 609 ; N X ; B 8 0 723 739 ;
XC 89 ; WX 592 ; N Y ; B 139 0 727 739 ;
XC 90 ; WX 480 ; N Z ; B 17 0 600 739 ;
XC 91 ; WX 351 ; N bracketleft ; B 132 -127 450 739 ;
XC 92 ; WX 605 ; N backslash ; B 221 0 464 739 ;
XC 93 ; WX 351 ; N bracketright ; B 14 -127 332 739 ;
XC 94 ; WX 606 ; N asciicircum ; B 51 180 621 739 ;
XC 95 ; WX 500 ; N underscore ; B -23 -125 488 -67 ;
XC 96 ; WX 351 ; N quoteleft ; B 235 546 361 739 ;
XC 97 ; WX 683 ; N a ; B 88 -13 721 559 ;
XC 98 ; WX 682 ; N b ; B 63 -13 696 739 ;
XC 99 ; WX 647 ; N c ; B 88 -13 679 559 ;
XC 100 ; WX 685 ; N d ; B 88 -13 759 739 ;
XC 101 ; WX 650 ; N e ; B 88 -13 665 559 ;
XC 102 ; WX 314 ; N f ; B 101 0 447 739 ; L i fi ; L l fl ;
XC 103 ; WX 673 ; N g ; B 60 -214 711 559 ;
XC 104 ; WX 610 ; N h ; B 63 0 609 739 ;
XC 105 ; WX 200 ; N i ; B 63 0 274 739 ;
XC 106 ; WX 203 ; N j ; B -81 -192 277 739 ;
XC 107 ; WX 502 ; N k ; B 63 0 584 739 ;
XC 108 ; WX 200 ; N l ; B 63 0 274 739 ;
XC 109 ; WX 938 ; N m ; B 63 0 941 559 ;
XC 110 ; WX 610 ; N n ; B 63 0 609 559 ;
XC 111 ; WX 655 ; N o ; B 87 -13 669 559 ;
XC 112 ; WX 682 ; N p ; B 27 -192 695 559 ;
XC 113 ; WX 682 ; N q ; B 87 -192 720 559 ;
XC 114 ; WX 301 ; N r ; B 63 0 396 559 ;
XC 115 ; WX 388 ; N s ; B 43 -13 425 559 ;
XC 116 ; WX 339 ; N t ; B 101 0 428 739 ;
XC 117 ; WX 608 ; N u ; B 99 -13 646 547 ;
XC 118 ; WX 554 ; N v ; B 109 0 647 547 ;
XC 119 ; WX 831 ; N w ; B 108 0 925 547 ;
XC 120 ; WX 480 ; N x ; B 8 0 573 547 ;
XC 121 ; WX 536 ; N y ; B 97 -192 628 547 ;
XC 122 ; WX 425 ; N z ; B 10 0 497 547 ;
XC 123 ; WX 351 ; N braceleft ; B 94 -127 408 739 ;
XC 124 ; WX 672 ; N bar ; B 304 0 505 739 ;
XC 125 ; WX 351 ; N braceright ; B 14 -127 326 739 ;
XC 126 ; WX 606 ; N asciitilde ; B 99 212 619 391 ;
XC 161 ; WX 295 ; N exclamdown ; B 75 -192 286 547 ;
XC 162 ; WX 554 ; N cent ; B 113 62 595 705 ;
XC 163 ; WX 554 ; N sterling ; B 58 0 655 751 ;
XC 164 ; WX 166 ; N fraction ; B -115 0 418 739 ;
XC 165 ; WX 554 ; N yen ; B 97 0 726 739 ;
XC 166 ; WX 554 ; N florin ; B -21 -214 685 751 ;
XC 167 ; WX 615 ; N section ; B 114 -139 596 751 ;
XC 168 ; WX 554 ; N currency ; B 51 50 615 553 ;
XC 169 ; WX 198 ; N quotesingle ; B 169 513 261 739 ;
XC 170 ; WX 502 ; N quotedblleft ; B 233 546 507 739 ;
XC 171 ; WX 425 ; N guillemotleft ; B 96 101 472 500 ;
XC 172 ; WX 251 ; N guilsinglleft ; B 96 101 298 500 ;
XC 173 ; WX 251 ; N guilsinglright ; B 65 101 267 500 ;
XC 174 ; WX 487 ; N fi ; B 98 0 561 739 ;
XC 175 ; WX 485 ; N fl ; B 98 0 559 739 ;
XC 177 ; WX 500 ; N endash ; B 49 267 562 334 ;
XC 178 ; WX 553 ; N dagger ; B 146 -127 594 739 ;
XC 179 ; WX 553 ; N daggerdbl ; B 121 -128 598 739 ;
XC 180 ; WX 277 ; N periodcentered ; B 145 238 242 364 ;
XC 182 ; WX 564 ; N paragraph ; B 135 -127 628 739 ;
XC 183 ; WX 606 ; N bullet ; B 171 116 547 486 ;
XC 184 ; WX 354 ; N quotesinglbase ; B 77 -67 274 126 ;
XC 185 ; WX 502 ; N quotedblbase ; B 77 -67 421 126 ;
XC 186 ; WX 484 ; N quotedblright ; B 188 546 530 739 ;
XC 187 ; WX 425 ; N guillemotright ; B 65 101 441 500 ;
XC 188 ; WX 1000 ; N ellipsis ; B 130 0 893 126 ;
XC 189 ; WX 1174 ; N perthousand ; B 117 -13 1184 751 ;
XC 191 ; WX 591 ; N questiondown ; B 64 -214 532 547 ;
XC 193 ; WX 378 ; N grave ; B 207 613 428 779 ;
XC 194 ; WX 375 ; N acute ; B 198 613 436 785 ;
XC 195 ; WX 502 ; N circumflex ; B 188 613 542 739 ;
XC 196 ; WX 439 ; N tilde ; B 200 613 486 715 ;
XC 197 ; WX 485 ; N macron ; B 188 613 537 680 ;
XC 198 ; WX 453 ; N breve ; B 207 613 511 716 ;
XC 199 ; WX 222 ; N dotaccent ; B 188 613 285 739 ;
XC 200 ; WX 369 ; N dieresis ; B 188 613 432 739 ;
XC 202 ; WX 332 ; N ring ; B 203 613 390 797 ;
XC 203 ; WX 324 ; N cedilla ; B 46 -223 228 0 ;
XC 205 ; WX 552 ; N hungarumlaut ; B 197 613 615 785 ;
XC 206 ; WX 302 ; N ogonek ; B 53 -190 203 0 ;
XC 207 ; WX 502 ; N caron ; B 211 613 565 739 ;
XC 208 ; WX 1000 ; N emdash ; B 49 267 1062 334 ;
XC 225 ; WX 992 ; N AE ; B 11 0 1073 739 ;
XC 227 ; WX 369 ; N ordfeminine ; B 91 325 477 751 ;
XC 232 ; WX 517 ; N Lslash ; B 70 0 514 739 ;
XC 233 ; WX 868 ; N Oslash ; B 72 -83 925 821 ;
XC 234 ; WX 1194 ; N OE ; B 106 -13 1275 751 ;
XC 235 ; WX 369 ; N ordmasculine ; B 92 325 450 751 ;
XC 241 ; WX 1157 ; N ae ; B 88 -13 1172 559 ;
XC 245 ; WX 200 ; N dotlessi ; B 63 0 238 547 ;
XC 248 ; WX 300 ; N lslash ; B 94 0 370 739 ;
XC 249 ; WX 653 ; N oslash ; B 76 -45 687 594 ;
XC 250 ; WX 1137 ; N oe ; B 88 -13 1153 559 ;
XC 251 ; WX 554 ; N germandbls ; B 59 -13 576 751 ;
XC -1 ; WX 740 ; N Aacute ; B 11 0 729 977 ;
XC -1 ; WX 740 ; N Acircumflex ; B 11 0 729 931 ;
XC -1 ; WX 740 ; N Adieresis ; B 11 0 729 931 ;
XC -1 ; WX 740 ; N Agrave ; B 11 0 729 971 ;
XC -1 ; WX 740 ; N Aring ; B 11 0 729 989 ;
XC -1 ; WX 740 ; N Atilde ; B 11 0 729 907 ;
XC -1 ; WX 813 ; N Ccedilla ; B 106 -223 869 751 ;
XC -1 ; WX 536 ; N Eacute ; B 76 0 617 977 ;
XC -1 ; WX 536 ; N Ecircumflex ; B 76 0 617 931 ;
XC -1 ; WX 536 ; N Edieresis ; B 76 0 617 931 ;
XC -1 ; WX 536 ; N Egrave ; B 76 0 617 971 ;
XC -1 ; WX 790 ; N Eth ; B 93 0 820 739 ;
XC -1 ; WX 226 ; N Iacute ; B 76 0 398 977 ;
XC -1 ; WX 226 ; N Icircumflex ; B 76 0 440 931 ;
XC -1 ; WX 226 ; N Idieresis ; B 76 0 397 931 ;
XC -1 ; WX 226 ; N Igrave ; B 76 0 388 971 ;
XC -1 ; WX 740 ; N Ntilde ; B 76 0 801 907 ;
XC -1 ; WX 869 ; N Oacute ; B 106 -13 900 977 ;
XC -1 ; WX 869 ; N Ocircumflex ; B 106 -13 900 931 ;
XC -1 ; WX 869 ; N Odieresis ; B 106 -13 900 931 ;
XC -1 ; WX 869 ; N Ograve ; B 106 -13 900 971 ;
XC -1 ; WX 869 ; N Otilde ; B 106 -13 900 907 ;
XC -1 ; WX 498 ; N Scaron ; B 56 -13 599 931 ;
XC -1 ; WX 592 ; N Thorn ; B 76 0 637 739 ;
XC -1 ; WX 655 ; N Uacute ; B 119 -13 716 977 ;
XC -1 ; WX 655 ; N Ucircumflex ; B 119 -13 716 931 ;
XC -1 ; WX 655 ; N Udieresis ; B 119 -13 716 931 ;
XC -1 ; WX 655 ; N Ugrave ; B 119 -13 716 971 ;
XC -1 ; WX 592 ; N Yacute ; B 139 0 727 977 ;
XC -1 ; WX 592 ; N Ydieresis ; B 139 0 727 931 ;
XC -1 ; WX 480 ; N Zcaron ; B 17 0 600 931 ;
XC -1 ; WX 683 ; N aacute ; B 88 -13 721 785 ;
XC -1 ; WX 683 ; N acircumflex ; B 88 -13 721 739 ;
XC -1 ; WX 683 ; N adieresis ; B 88 -13 721 739 ;
XC -1 ; WX 683 ; N agrave ; B 88 -13 721 779 ;
XC -1 ; WX 683 ; N aring ; B 88 -13 721 797 ;
XC -1 ; WX 683 ; N atilde ; B 88 -13 721 715 ;
XC -1 ; WX 672 ; N brokenbar ; B 304 0 505 739 ;
XC -1 ; WX 647 ; N ccedilla ; B 88 -223 679 559 ;
XC -1 ; WX 747 ; N copyright ; B 53 -13 830 751 ;
XC -1 ; WX 400 ; N degree ; B 157 439 462 739 ;
XC -1 ; WX 606 ; N divide ; B 100 49 618 553 ;
XC -1 ; WX 650 ; N eacute ; B 88 -13 665 785 ;
XC -1 ; WX 650 ; N ecircumflex ; B 88 -13 665 739 ;
XC -1 ; WX 650 ; N edieresis ; B 88 -13 665 739 ;
XC -1 ; WX 650 ; N egrave ; B 88 -13 665 779 ;
XC -1 ; WX 655 ; N eth ; B 87 -13 673 758 ;
XC -1 ; WX 200 ; N iacute ; B 63 0 349 785 ;
XC -1 ; WX 200 ; N icircumflex ; B 37 0 391 739 ;
XC -1 ; WX 200 ; N idieresis ; B 63 0 348 739 ;
XC -1 ; WX 200 ; N igrave ; B 63 0 339 779 ;
XC -1 ; WX 606 ; N logicalnot ; B 118 166 636 436 ;
XC -1 ; WX 606 ; N minus ; B 100 263 618 339 ;
XC -1 ; WX 608 ; N mu ; B 27 -192 646 547 ;
XC -1 ; WX 606 ; N multiply ; B 70 51 648 555 ;
XC -1 ; WX 610 ; N ntilde ; B 63 0 609 715 ;
XC -1 ; WX 655 ; N oacute ; B 87 -13 669 785 ;
XC -1 ; WX 655 ; N ocircumflex ; B 87 -13 669 739 ;
XC -1 ; WX 655 ; N odieresis ; B 87 -13 669 739 ;
XC -1 ; WX 655 ; N ograve ; B 87 -13 669 779 ;
XC -1 ; WX 831 ; N onehalf ; B 207 0 874 739 ;
XC -1 ; WX 831 ; N onequarter ; B 217 0 841 739 ;
XC -1 ; WX 332 ; N onesuperior ; B 227 296 370 739 ;
XC -1 ; WX 655 ; N otilde ; B 87 -13 669 715 ;
XC -1 ; WX 606 ; N plusminus ; B 51 0 628 554 ;
XC -1 ; WX 747 ; N registered ; B 53 -13 830 751 ;
XC -1 ; WX 388 ; N scaron ; B 43 -13 508 739 ;
XC -1 ; WX 682 ; N thorn ; B 27 -192 695 739 ;
XC -1 ; WX 831 ; N threequarters ; B 91 0 841 747 ;
XC -1 ; WX 332 ; N threesuperior ; B 91 289 410 747 ;
XC -1 ; WX 1000 ; N trademark ; B 189 318 1075 739 ;
XC -1 ; WX 332 ; N twosuperior ; B 67 296 435 746 ;
XC -1 ; WX 608 ; N uacute ; B 99 -13 646 785 ;
XC -1 ; WX 608 ; N ucircumflex ; B 99 -13 646 739 ;
XC -1 ; WX 608 ; N udieresis ; B 99 -13 646 739 ;
XC -1 ; WX 608 ; N ugrave ; B 99 -13 646 779 ;
XC -1 ; WX 536 ; N yacute ; B 97 -192 628 785 ;
XC -1 ; WX 536 ; N ydieresis ; B 97 -192 628 739 ;
XC -1 ; WX 425 ; N zcaron ; B 10 0 527 739 ;
XEndCharMetrics
XStartKernData
XStartKernPairs 93
X
XKPX A y -72
XKPX A w -65
XKPX A v -73
XKPX A Y -122
XKPX A W -73
XKPX A V -122
XKPX A T -81
X
XKPX F period -79
XKPX F comma -122


XKPX F A -60
X

XKPX L y -23
XKPX L Y -91
XKPX L W -67
XKPX L V -113
XKPX L T -46
X
XKPX P period -91
XKPX P comma -123


XKPX P A -74
X

XKPX R y 32
XKPX R Y -20
XKPX R W 2
XKPX R V -39
XKPX R T 6
X
XKPX T y 5
XKPX T w 7
XKPX T u -20
XKPX T semicolon -29
XKPX T s -23
XKPX T r -20
XKPX T period -71
XKPX T o -49
XKPX T i 40
XKPX T hyphen 0
XKPX T e -49
XKPX T comma -102
XKPX T colon 3
XKPX T c -51
XKPX T a -52


XKPX T A -60
X

XKPX V y -25
XKPX V u -40
XKPX V semicolon -33
XKPX V r -20
XKPX V period -75
XKPX V o -80
XKPX V i 15
XKPX V hyphen 0
XKPX V e -80
XKPX V comma -106
XKPX V colon -1
XKPX V a -80
XKPX V A -122
X
XKPX W y -2
XKPX W u -30
XKPX W r -29
XKPX W o -46
XKPX W i 12
XKPX W e -47
XKPX W a -50
XKPX W semicolon -33
XKPX W period -74
XKPX W hyphen 0
XKPX W comma -106
XKPX W colon -1
XKPX W A -73
X
XKPX Y v -17
XKPX Y u -55
XKPX Y semicolon -40
XKPX Y q -93
XKPX Y period -75
XKPX Y p -67
XKPX Y o -89
XKPX Y i 13
XKPX Y hyphen 0
XKPX Y e -89
XKPX Y comma -110
XKPX Y colon -10
XKPX Y a -93
XKPX Y A -122
X
XKPX f f 3
X
XKPX r q -8
XKPX r period -73
XKPX r o -4
XKPX r n 35
XKPX r m 35
XKPX r hyphen 0
XKPX r h 29
XKPX r g 1
XKPX r f 48
XKPX r e -4
XKPX r d -6
XKPX r comma -105
XKPX r c -7
XEndKernPairs
XEndKernData
XStartComposites 58
XCC Zcaron 2 ; PCC Z 0 0 ; PCC caron -11 192 ;
XCC zcaron 2 ; PCC z 0 0 ; PCC caron -38 0 ;
XCC Scaron 2 ; PCC S 0 0 ; PCC caron -2 192 ;
XCC scaron 2 ; PCC s 0 0 ; PCC caron -57 0 ;
XCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 244 0 ;
XCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 161 0 ;
XCC Yacute 2 ; PCC Y 0 0 ; PCC acute 108 192 ;
XCC yacute 2 ; PCC y 0 0 ; PCC acute 80 0 ;
XCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 111 192 ;


XCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 83 0 ;

XCC Uacute 2 ; PCC U 0 0 ; PCC acute 140 192 ;
XCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 76 192 ;
XCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 143 192 ;
XCC Ugrave 2 ; PCC U 0 0 ; PCC grave 138 192 ;
XCC uacute 2 ; PCC u 0 0 ; PCC acute 116 0 ;
XCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 53 0 ;
XCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 119 0 ;
XCC ugrave 2 ; PCC u 0 0 ; PCC grave 115 0 ;
XCC Iacute 2 ; PCC I 0 0 ; PCC acute -74 192 ;
XCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex -138 192 ;
XCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis -71 192 ;
XCC Igrave 2 ; PCC I 0 0 ; PCC grave -76 192 ;
XCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -87 0 ;
XCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -151 0 ;
XCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -84 0 ;
XCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -89 0 ;
XCC Eacute 2 ; PCC E 0 0 ; PCC acute 80 192 ;
XCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 17 192 ;
XCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 83 192 ;
XCC Egrave 2 ; PCC E 0 0 ; PCC grave 79 192 ;
XCC eacute 2 ; PCC e 0 0 ; PCC acute 137 0 ;
XCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 74 0 ;
XCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 140 0 ;
XCC egrave 2 ; PCC e 0 0 ; PCC grave 136 0 ;
XCC Aacute 2 ; PCC A 0 0 ; PCC acute 182 192 ;
XCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 119 192 ;
XCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 185 192 ;
XCC Agrave 2 ; PCC A 0 0 ; PCC grave 181 192 ;
XCC aacute 2 ; PCC a 0 0 ; PCC acute 154 0 ;
XCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 90 0 ;
XCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 157 0 ;
XCC agrave 2 ; PCC a 0 0 ; PCC grave 152 0 ;
XCC Oacute 2 ; PCC O 0 0 ; PCC acute 247 192 ;
XCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 183 192 ;
XCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 250 192 ;
XCC Ograve 2 ; PCC O 0 0 ; PCC grave 245 192 ;
XCC oacute 2 ; PCC o 0 0 ; PCC acute 140 0 ;
XCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 76 0 ;
XCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 143 0 ;
XCC ograve 2 ; PCC o 0 0 ; PCC grave 138 0 ;
XCC Atilde 2 ; PCC A 0 0 ; PCC tilde 150 192 ;
XCC atilde 2 ; PCC a 0 0 ; PCC tilde 122 0 ;
XCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 150 192 ;
XCC ntilde 2 ; PCC n 0 0 ; PCC tilde 85 0 ;
XCC Otilde 2 ; PCC O 0 0 ; PCC tilde 215 192 ;
XCC otilde 2 ; PCC o 0 0 ; PCC tilde 108 0 ;
XCC Aring 2 ; PCC A 0 0 ; PCC ring 204 192 ;
XCC aring 2 ; PCC a 0 0 ; PCC ring 175 0 ;
XEndComposites
XEndFontMetrics
END_OF_FILE
if test 15273 -ne `wc -c <'lout/font0/AvantGarBooObl.AFM'`; then
echo shar: \"'lout/font0/AvantGarBooObl.AFM'\" unpacked with wrong size!
fi
# end of 'lout/font0/AvantGarBooObl.AFM'
fi
if test -f 'lout/font0/AvantGarDem.AFM' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/font0/AvantGarDem.AFM'\"
else
echo shar: Extracting \"'lout/font0/AvantGarDem.AFM'\" \(15258 characters\)
sed "s/^X//" >'lout/font0/AvantGarDem.AFM' <<'END_OF_FILE'
XStartFontMetrics 2.0
XComment Copyright (c) 1985, 1987 Adobe Systems Incorporated. All rights reserved.
XComment Creation Date:Mon Aug 10 17:32:45 PDT 1987
XFontName AvantGarde-Demi
XEncodingScheme AdobeStandardEncoding
XFullName ITC Avant Garde Gothic Demi
XFamilyName ITC Avant Garde Gothic
XWeight Demi
XItalicAngle 0.0
XIsFixedPitch false
XUnderlinePosition -92
XUnderlineThickness 90
XVersion 001.003
XNotice Copyright (c) 1985, 1987 Adobe Systems Incorporated. All rights reserved. ITC Avant Garde Gothic is a registered trademark of International Typeface Corporation.
XFontBBox -121 -251 1248 1025
XCapHeight 739
XXHeight 554
XDescender -185
XAscender 739
XStartCharMetrics 228
XC 32 ; WX 280 ; N space ; B 0 0 0 0 ;
XC 33 ; WX 280 ; N exclam ; B 72 0 205 739 ;
XC 34 ; WX 360 ; N quotedbl ; B 74 513 283 739 ;
XC 35 ; WX 560 ; N numbersign ; B 34 0 526 740 ;
XC 36 ; WX 560 ; N dollar ; B 59 -85 494 855 ;
XC 37 ; WX 860 ; N percent ; B 21 -18 835 753 ;
XC 38 ; WX 680 ; N ampersand ; B 35 -18 664 753 ;
XC 39 ; WX 280 ; N quoteright ; B 72 466 205 739 ;
XC 40 ; WX 380 ; N parenleft ; B 74 -128 349 739 ;
XC 41 ; WX 380 ; N parenright ; B 37 -128 312 739 ;
XC 42 ; WX 440 ; N asterisk ; B 70 456 371 753 ;
XC 43 ; WX 600 ; N plus ; B 51 65 555 570 ;
XC 44 ; WX 280 ; N comma ; B 72 -140 205 133 ;
XC 45 ; WX 420 ; N hyphen ; B 74 259 351 377 ;
XC 46 ; WX 280 ; N period ; B 72 0 205 133 ;
XC 47 ; WX 460 ; N slash ; B 26 -128 443 739 ;
XC 48 ; WX 560 ; N zero ; B 30 -18 525 753 ;
XC 49 ; WX 560 ; N one ; B 153 0 379 739 ;
XC 50 ; WX 560 ; N two ; B 34 0 520 753 ;
XC 51 ; WX 560 ; N three ; B 15 -18 518 753 ;
XC 52 ; WX 560 ; N four ; B 0 0 530 739 ;
XC 53 ; WX 560 ; N five ; B 12 -18 520 739 ;
XC 54 ; WX 560 ; N six ; B 21 -18 533 739 ;
XC 55 ; WX 560 ; N seven ; B 65 0 500 739 ;
XC 56 ; WX 560 ; N eight ; B 31 -18 523 753 ;
XC 57 ; WX 560 ; N nine ; B 22 0 532 753 ;
XC 58 ; WX 280 ; N colon ; B 72 0 205 502 ;
XC 59 ; WX 280 ; N semicolon ; B 72 -140 205 502 ;
XC 60 ; WX 600 ; N less ; B 49 42 558 593 ;
XC 61 ; WX 600 ; N equal ; B 51 163 555 473 ;
XC 62 ; WX 600 ; N greater ; B 48 42 557 593 ;
XC 63 ; WX 560 ; N question ; B 32 0 485 753 ;
XC 64 ; WX 740 ; N at ; B 3 -18 745 753 ;
XC 65 ; WX 740 ; N A ; B 7 0 733 739 ;
XC 66 ; WX 580 ; N B ; B 68 0 548 739 ;
XC 67 ; WX 780 ; N C ; B 30 -18 760 753 ;
XC 68 ; WX 700 ; N D ; B 68 0 660 739 ;
XC 69 ; WX 520 ; N E ; B 68 0 465 739 ;
XC 70 ; WX 480 ; N F ; B 68 0 444 739 ;
XC 71 ; WX 840 ; N G ; B 30 -18 818 753 ;
XC 72 ; WX 680 ; N H ; B 68 0 606 739 ;
XC 73 ; WX 280 ; N I ; B 68 0 205 739 ;
XC 74 ; WX 480 ; N J ; B 9 -18 414 739 ;
XC 75 ; WX 620 ; N K ; B 68 0 599 739 ;
XC 76 ; WX 440 ; N L ; B 68 0 431 739 ;
XC 77 ; WX 900 ; N M ; B 68 0 840 739 ;
XC 78 ; WX 740 ; N N ; B 68 0 667 739 ;
XC 79 ; WX 840 ; N O ; B 30 -18 800 753 ;
XC 80 ; WX 560 ; N P ; B 68 0 540 739 ;
XC 81 ; WX 840 ; N Q ; B 30 -18 828 753 ;
XC 82 ; WX 580 ; N R ; B 68 0 568 739 ;
XC 83 ; WX 520 ; N S ; B 14 -18 493 753 ;
XC 84 ; WX 420 ; N T ; B 7 0 418 739 ;
XC 85 ; WX 640 ; N U ; B 68 -18 567 739 ;
XC 86 ; WX 700 ; N V ; B 8 0 694 739 ;
XC 87 ; WX 900 ; N W ; B 7 0 898 739 ;
XC 88 ; WX 680 ; N X ; B 5 0 676 739 ;
XC 89 ; WX 620 ; N Y ; B 3 0 626 739 ;
XC 90 ; WX 500 ; N Z ; B 18 0 480 739 ;
XC 91 ; WX 320 ; N bracketleft ; B 74 -127 292 739 ;
XC 92 ; WX 640 ; N backslash ; B 84 0 503 739 ;
XC 93 ; WX 320 ; N bracketright ; B 37 -127 255 739 ;
XC 94 ; WX 600 ; N asciicircum ; B 63 315 543 739 ;
XC 95 ; WX 500 ; N underscore ; B 0 -138 500 -48 ;
XC 96 ; WX 280 ; N quoteleft ; B 72 480 205 753 ;
XC 97 ; WX 660 ; N a ; B 30 -18 615 572 ;
XC 98 ; WX 660 ; N b ; B 54 -18 638 739 ;
XC 99 ; WX 640 ; N c ; B 30 -18 601 572 ;
XC 100 ; WX 660 ; N d ; B 30 -18 613 739 ;
XC 101 ; WX 640 ; N e ; B 30 -18 608 572 ;
XC 102 ; WX 280 ; N f ; B 10 0 274 753 ; L i fi ; L l fl ;
XC 103 ; WX 660 ; N g ; B 30 -225 611 572 ;
XC 104 ; WX 600 ; N h ; B 54 0 545 739 ;
XC 105 ; WX 240 ; N i ; B 54 0 187 739 ;
XC 106 ; WX 260 ; N j ; B 17 -185 205 739 ;
XC 107 ; WX 580 ; N k ; B 54 0 555 739 ;
XC 108 ; WX 240 ; N l ; B 54 0 187 739 ;
XC 109 ; WX 940 ; N m ; B 54 0 885 572 ;
XC 110 ; WX 600 ; N n ; B 54 0 546 572 ;
XC 111 ; WX 640 ; N o ; B 30 -18 619 572 ;
XC 112 ; WX 660 ; N p ; B 54 -185 634 572 ;
XC 113 ; WX 660 ; N q ; B 30 -185 611 572 ;
XC 114 ; WX 320 ; N r ; B 54 0 306 572 ;
XC 115 ; WX 440 ; N s ; B 19 -18 420 572 ;
XC 116 ; WX 300 ; N t ; B 9 0 287 739 ;
XC 117 ; WX 600 ; N u ; B 54 -18 547 554 ;
XC 118 ; WX 560 ; N v ; B 1 0 553 554 ;
XC 119 ; WX 800 ; N w ; B 10 0 785 554 ;
XC 120 ; WX 560 ; N x ; B 1 0 553 554 ;
XC 121 ; WX 580 ; N y ; B 6 -185 568 554 ;
XC 122 ; WX 460 ; N z ; B 20 0 442 554 ;
XC 123 ; WX 340 ; N braceleft ; B 37 -127 302 738 ;
XC 124 ; WX 600 ; N bar ; B 243 0 362 739 ;
XC 125 ; WX 340 ; N braceright ; B 38 -127 303 738 ;
XC 126 ; WX 600 ; N asciitilde ; B 51 215 555 421 ;
XC 161 ; WX 280 ; N exclamdown ; B 72 -185 205 554 ;
XC 162 ; WX 560 ; N cent ; B 39 39 511 713 ;
XC 163 ; WX 560 ; N sterling ; B 0 0 563 753 ;
XC 164 ; WX 160 ; N fraction ; B -121 0 280 739 ;
XC 165 ; WX 560 ; N yen ; B -35 0 589 739 ;
XC 166 ; WX 560 ; N florin ; B -17 -150 494 822 ;
XC 167 ; WX 560 ; N section ; B 40 -141 529 768 ;
XC 168 ; WX 560 ; N currency ; B 27 148 534 653 ;
XC 169 ; WX 220 ; N quotesingle ; B 74 513 150 739 ;
XC 170 ; WX 480 ; N quotedblleft ; B 70 480 410 753 ;
XC 171 ; WX 460 ; N guillemotleft ; B 36 136 388 498 ;
XC 172 ; WX 240 ; N guilsinglleft ; B 36 136 175 498 ;
XC 173 ; WX 240 ; N guilsinglright ; B 73 136 212 498 ;
XC 174 ; WX 520 ; N fi ; B 8 0 461 753 ;
XC 175 ; WX 520 ; N fl ; B 8 0 461 753 ;
XC 177 ; WX 500 ; N endash ; B 0 259 500 377 ;
XC 178 ; WX 560 ; N dagger ; B 48 -128 505 739 ;
XC 179 ; WX 560 ; N daggerdbl ; B 48 -128 505 739 ;
XC 180 ; WX 280 ; N periodcentered ; B 72 251 205 384 ;
XC 182 ; WX 600 ; N paragraph ; B 37 -128 527 739 ;
XC 183 ; WX 600 ; N bullet ; B 134 149 471 486 ;
XC 184 ; WX 280 ; N quotesinglbase ; B 70 -140 203 133 ;
XC 185 ; WX 480 ; N quotedblbase ; B 70 -140 410 133 ;
XC 186 ; WX 480 ; N quotedblright ; B 70 466 410 739 ;
XC 187 ; WX 460 ; N guillemotright ; B 73 136 425 498 ;
XC 188 ; WX 1000 ; N ellipsis ; B 100 0 899 133 ;
XC 189 ; WX 1280 ; N perthousand ; B 21 -18 1248 753 ;
XC 191 ; WX 560 ; N questiondown ; B 69 -199 522 554 ;
XC 193 ; WX 420 ; N grave ; B 74 613 353 840 ;
XC 194 ; WX 420 ; N acute ; B 74 613 352 838 ;
XC 195 ; WX 540 ; N circumflex ; B 74 620 473 758 ;
XC 196 ; WX 480 ; N tilde ; B 74 620 405 749 ;
XC 197 ; WX 420 ; N macron ; B 74 620 351 730 ;
XC 198 ; WX 480 ; N breve ; B 74 620 404 756 ;
XC 199 ; WX 280 ; N dotaccent ; B 74 620 207 753 ;
XC 200 ; WX 500 ; N dieresis ; B 74 620 417 753 ;
XC 202 ; WX 360 ; N ring ; B 74 620 280 826 ;
XC 203 ; WX 340 ; N cedilla ; B 74 -251 270 0 ;
XC 205 ; WX 700 ; N hungarumlaut ; B 74 620 629 845 ;
XC 206 ; WX 340 ; N ogonek ; B 74 -203 256 0 ;
XC 207 ; WX 540 ; N caron ; B 74 620 473 758 ;
XC 208 ; WX 1000 ; N emdash ; B 0 259 1000 377 ;
XC 225 ; WX 900 ; N AE ; B 17 0 843 739 ;
XC 227 ; WX 360 ; N ordfeminine ; B 28 316 342 753 ;
XC 232 ; WX 480 ; N Lslash ; B 14 0 473 739 ;
XC 233 ; WX 840 ; N Oslash ; B 30 -70 803 813 ;
XC 234 ; WX 1060 ; N OE ; B 38 -14 1004 753 ;
XC 235 ; WX 360 ; N ordmasculine ; B 31 316 338 753 ;
XC 241 ; WX 1080 ; N ae ; B 30 -18 1051 572 ;
XC 245 ; WX 240 ; N dotlessi ; B 54 0 187 554 ;
XC 248 ; WX 320 ; N lslash ; B 17 0 312 739 ;
XC 249 ; WX 660 ; N oslash ; B 30 -50 620 606 ;
XC 250 ; WX 1080 ; N oe ; B 30 -18 1048 572 ;
XC 251 ; WX 600 ; N germandbls ; B 51 -18 584 753 ;
XC -1 ; WX 740 ; N Aacute ; B 7 0 733 1023 ;
XC -1 ; WX 740 ; N Acircumflex ; B 7 0 733 943 ;
XC -1 ; WX 740 ; N Adieresis ; B 7 0 733 938 ;
XC -1 ; WX 740 ; N Agrave ; B 7 0 733 1025 ;
XC -1 ; WX 740 ; N Aring ; B 7 0 733 1011 ;
XC -1 ; WX 740 ; N Atilde ; B 7 0 733 934 ;
XC -1 ; WX 780 ; N Ccedilla ; B 30 -251 760 753 ;
XC -1 ; WX 520 ; N Eacute ; B 68 0 465 1023 ;
XC -1 ; WX 520 ; N Ecircumflex ; B 64 0 465 943 ;
XC -1 ; WX 520 ; N Edieresis ; B 68 0 465 938 ;
XC -1 ; WX 520 ; N Egrave ; B 68 0 465 1025 ;
XC -1 ; WX 742 ; N Eth ; B 14 0 702 739 ;
XC -1 ; WX 280 ; N Iacute ; B 4 0 282 1023 ;
XC -1 ; WX 280 ; N Icircumflex ; B -56 0 343 943 ;
XC -1 ; WX 280 ; N Idieresis ; B -36 0 307 938 ;
XC -1 ; WX 280 ; N Igrave ; B 4 0 283 1025 ;
XC -1 ; WX 740 ; N Ntilde ; B 68 0 667 934 ;
XC -1 ; WX 840 ; N Oacute ; B 30 -18 800 1023 ;
XC -1 ; WX 840 ; N Ocircumflex ; B 30 -18 800 943 ;
XC -1 ; WX 840 ; N Odieresis ; B 30 -18 800 938 ;
XC -1 ; WX 840 ; N Ograve ; B 30 -18 800 1025 ;
XC -1 ; WX 840 ; N Otilde ; B 30 -18 800 934 ;
XC -1 ; WX 520 ; N Scaron ; B 14 -18 493 943 ;
XC -1 ; WX 560 ; N Thorn ; B 68 0 540 739 ;
XC -1 ; WX 640 ; N Uacute ; B 68 -18 567 1023 ;
XC -1 ; WX 640 ; N Ucircumflex ; B 68 -18 567 943 ;
XC -1 ; WX 640 ; N Udieresis ; B 68 -18 567 938 ;
XC -1 ; WX 640 ; N Ugrave ; B 68 -18 567 1025 ;
XC -1 ; WX 620 ; N Yacute ; B 3 0 626 1023 ;
XC -1 ; WX 620 ; N Ydieresis ; B 3 0 626 938 ;
XC -1 ; WX 500 ; N Zcaron ; B 18 0 480 943 ;
XC -1 ; WX 660 ; N aacute ; B 30 -18 615 838 ;
XC -1 ; WX 660 ; N acircumflex ; B 30 -18 615 758 ;
XC -1 ; WX 660 ; N adieresis ; B 30 -18 615 753 ;
XC -1 ; WX 660 ; N agrave ; B 30 -18 615 840 ;
XC -1 ; WX 660 ; N aring ; B 30 -18 615 826 ;
XC -1 ; WX 660 ; N atilde ; B 30 -18 615 749 ;
XC -1 ; WX 600 ; N brokenbar ; B 243 0 362 739 ;
XC -1 ; WX 640 ; N ccedilla ; B 30 -251 601 572 ;
XC -1 ; WX 740 ; N copyright ; B -12 -18 759 753 ;
XC -1 ; WX 400 ; N degree ; B 50 439 350 739 ;
XC -1 ; WX 600 ; N divide ; B 51 65 555 570 ;
XC -1 ; WX 640 ; N eacute ; B 30 -18 608 838 ;
XC -1 ; WX 640 ; N ecircumflex ; B 30 -18 608 758 ;
XC -1 ; WX 640 ; N edieresis ; B 30 -18 608 753 ;
XC -1 ; WX 640 ; N egrave ; B 30 -18 608 840 ;
XC -1 ; WX 640 ; N eth ; B 30 -18 619 770 ;
XC -1 ; WX 240 ; N iacute ; B -16 0 262 838 ;
XC -1 ; WX 240 ; N icircumflex ; B -76 0 323 758 ;
XC -1 ; WX 240 ; N idieresis ; B -56 0 287 753 ;
XC -1 ; WX 240 ; N igrave ; B -16 0 263 840 ;
XC -1 ; WX 600 ; N logicalnot ; B 51 182 555 473 ;
XC -1 ; WX 600 ; N minus ; B 51 260 555 376 ;
XC -1 ; WX 576 ; N mu ; B 54 -185 547 554 ;
XC -1 ; WX 600 ; N multiply ; B 51 66 555 570 ;
XC -1 ; WX 600 ; N ntilde ; B 54 0 546 749 ;
XC -1 ; WX 640 ; N oacute ; B 30 -18 619 838 ;
XC -1 ; WX 640 ; N ocircumflex ; B 30 -18 619 758 ;
XC -1 ; WX 640 ; N odieresis ; B 30 -18 619 753 ;
XC -1 ; WX 640 ; N ograve ; B 30 -18 619 840 ;
XC -1 ; WX 840 ; N onehalf ; B 94 0 830 739 ;
XC -1 ; WX 840 ; N onequarter ; B 94 0 836 739 ;
XC -1 ; WX 336 ; N onesuperior ; B 94 296 241 739 ;
XC -1 ; WX 640 ; N otilde ; B 30 -18 619 749 ;
XC -1 ; WX 600 ; N plusminus ; B 51 0 555 570 ;
XC -1 ; WX 740 ; N registered ; B -12 -18 759 753 ;
XC -1 ; WX 440 ; N scaron ; B 19 -18 423 758 ;
XC -1 ; WX 660 ; N thorn ; B 54 -185 634 739 ;
XC -1 ; WX 840 ; N threequarters ; B 4 0 836 748 ;
XC -1 ; WX 336 ; N threesuperior ; B 4 286 331 748 ;
XC -1 ; WX 1000 ; N trademark ; B 71 335 929 739 ;
XC -1 ; WX 336 ; N twosuperior ; B 10 296 326 748 ;
XC -1 ; WX 600 ; N uacute ; B 54 -18 547 838 ;
XC -1 ; WX 600 ; N ucircumflex ; B 54 -18 547 758 ;
XC -1 ; WX 600 ; N udieresis ; B 54 -18 547 753 ;
XC -1 ; WX 600 ; N ugrave ; B 54 -18 547 840 ;
XC -1 ; WX 580 ; N yacute ; B 6 -185 568 838 ;
XC -1 ; WX 580 ; N ydieresis ; B 6 -185 568 753 ;
XC -1 ; WX 460 ; N zcaron ; B 20 0 442 758 ;
XEndCharMetrics
XStartKernData
XStartKernPairs 93
X
XKPX A y -50
XKPX A w -50
XKPX A v -50
XKPX A Y -139
XKPX A W -96
XKPX A V -127
XKPX A T -73
X
XKPX F period -42
XKPX F comma -42
XKPX F A -95
X
XKPX L y -75
XKPX L Y -90
XKPX L W -90
XKPX L V -90
XKPX L T -50
X
XKPX P period -16
XKPX P comma -16
XKPX P A -100
X
XKPX R y 31


XKPX R Y -20
XKPX R W -20

XKPX R V -26
XKPX R T 16
X
XKPX T y -12
XKPX T w -15
XKPX T u -56
XKPX T semicolon -12
XKPX T s -43
XKPX T r -42
XKPX T period 4
XKPX T o -50
XKPX T i -5
XKPX T hyphen -10
XKPX T e -50
XKPX T comma 4
XKPX T colon -12
XKPX T c -50
XKPX T a -40
XKPX T A -70
X
XKPX V y -15
XKPX V u -68
XKPX V semicolon -13
XKPX V r -40
XKPX V period -13
XKPX V o -80
XKPX V i -9
XKPX V hyphen -20
XKPX V e -80
XKPX V comma -13
XKPX V colon -13
XKPX V a -80
XKPX V A -125
X
XKPX W y 1
XKPX W u -40
XKPX W semicolon -12
XKPX W r -39
XKPX W period -12
XKPX W o -50
XKPX W i -7
XKPX W hyphen -10
XKPX W e -50
XKPX W comma -12
XKPX W colon -12
XKPX W a -50
XKPX W A -94
X
XKPX Y v -25
XKPX Y u -82
XKPX Y semicolon -8
XKPX Y q -100
XKPX Y period -8
XKPX Y p -60
XKPX Y o -100
XKPX Y i -5
XKPX Y hyphen -60
XKPX Y e -100
XKPX Y comma -8
XKPX Y colon -8
XKPX Y a -100
XKPX Y A -138
X
XKPX f f 38
X
XKPX r q -18
XKPX r period 9
XKPX r o -18
XKPX r n 5
XKPX r m 5
XKPX r hyphen -10
XKPX r h 0
XKPX r g -8
XKPX r f 38
XKPX r e -8
XKPX r d -8
XKPX r comma 9
XKPX r c -27
XEndKernPairs
XEndKernData
XStartComposites 58
XCC Zcaron 2 ; PCC Z 0 0 ; PCC caron -20 185 ;
XCC zcaron 2 ; PCC z 0 0 ; PCC caron -40 0 ;
XCC Scaron 2 ; PCC S 0 0 ; PCC caron -10 185 ;
XCC scaron 2 ; PCC s 0 0 ; PCC caron -50 0 ;
XCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 220 0 ;
XCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 150 0 ;
XCC Yacute 2 ; PCC Y 0 0 ; PCC acute 100 185 ;
XCC yacute 2 ; PCC y 0 0 ; PCC acute 80 0 ;
XCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 60 185 ;
XCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 40 0 ;
XCC Uacute 2 ; PCC U 0 0 ; PCC acute 110 185 ;
XCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 50 185 ;
XCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 70 185 ;
XCC Ugrave 2 ; PCC U 0 0 ; PCC grave 110 185 ;
XCC uacute 2 ; PCC u 0 0 ; PCC acute 90 0 ;
XCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 30 0 ;
XCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 50 0 ;
XCC ugrave 2 ; PCC u 0 0 ; PCC grave 90 0 ;
XCC Iacute 2 ; PCC I 0 0 ; PCC acute -70 185 ;
XCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex -130 185 ;
XCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis -110 185 ;
XCC Igrave 2 ; PCC I 0 0 ; PCC grave -70 185 ;
XCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -90 0 ;
XCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -150 0 ;
XCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -130 0 ;
XCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -90 0 ;
XCC Eacute 2 ; PCC E 0 0 ; PCC acute 50 185 ;
XCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex -10 185 ;
XCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 10 185 ;
XCC Egrave 2 ; PCC E 0 0 ; PCC grave 50 185 ;
XCC eacute 2 ; PCC e 0 0 ; PCC acute 110 0 ;
XCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 50 0 ;
XCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 70 0 ;
XCC egrave 2 ; PCC e 0 0 ; PCC grave 110 0 ;
XCC Aacute 2 ; PCC A 0 0 ; PCC acute 160 185 ;
XCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 100 185 ;


XCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 120 185 ;

XCC Agrave 2 ; PCC A 0 0 ; PCC grave 160 185 ;
XCC aacute 2 ; PCC a 0 0 ; PCC acute 120 0 ;
XCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 60 0 ;
XCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 80 0 ;
XCC agrave 2 ; PCC a 0 0 ; PCC grave 120 0 ;
XCC Oacute 2 ; PCC O 0 0 ; PCC acute 210 185 ;
XCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 150 185 ;
XCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 170 185 ;
XCC Ograve 2 ; PCC O 0 0 ; PCC grave 210 185 ;
XCC oacute 2 ; PCC o 0 0 ; PCC acute 110 0 ;
XCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 50 0 ;
XCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 70 0 ;
XCC ograve 2 ; PCC o 0 0 ; PCC grave 110 0 ;
XCC Atilde 2 ; PCC A 0 0 ; PCC tilde 130 185 ;
XCC atilde 2 ; PCC a 0 0 ; PCC tilde 90 0 ;
XCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 130 185 ;
XCC ntilde 2 ; PCC n 0 0 ; PCC tilde 60 0 ;
XCC Otilde 2 ; PCC O 0 0 ; PCC tilde 180 185 ;
XCC otilde 2 ; PCC o 0 0 ; PCC tilde 80 0 ;
XCC Aring 2 ; PCC A 0 0 ; PCC ring 190 185 ;
XCC aring 2 ; PCC a 0 0 ; PCC ring 150 0 ;
XEndComposites
XEndFontMetrics
END_OF_FILE
if test 15258 -ne `wc -c <'lout/font0/AvantGarDem.AFM'`; then
echo shar: \"'lout/font0/AvantGarDem.AFM'\" unpacked with wrong size!
fi
# end of 'lout/font0/AvantGarDem.AFM'
fi
if test -f 'lout/font0/AvantGarDemObl.AFM' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/font0/AvantGarDemObl.AFM'\"
else
echo shar: Extracting \"'lout/font0/AvantGarDemObl.AFM'\" \(15350 characters\)
sed "s/^X//" >'lout/font0/AvantGarDemObl.AFM' <<'END_OF_FILE'
XStartFontMetrics 2.0
XComment Copyright (c) 1985, 1987 Adobe Systems Incorporated. All rights reserved.
XComment Creation Date:Mon Aug 10 17:55:01 PDT 1987
XFontName AvantGarde-DemiOblique
XEncodingScheme AdobeStandardEncoding
XFullName ITC Avant Garde Gothic Demi Oblique
XFamilyName ITC Avant Garde Gothic
XWeight Demi
XItalicAngle -10.5
XIsFixedPitch false
XUnderlinePosition -92
XUnderlineThickness 90
XVersion 001.003
XNotice Copyright (c) 1985, 1987 Adobe Systems Incorporated. All rights reserved. ITC Avant Garde Gothic is a registered trademark of International Typeface Corporation.
XFontBBox -121 -251 1281 1025
XCapHeight 739
XXHeight 554
XDescender -185
XAscender 739
XStartCharMetrics 228
XC 32 ; WX 280 ; N space ; B 0 0 0 0 ;
XC 33 ; WX 280 ; N exclam ; B 72 0 342 739 ;
XC 34 ; WX 360 ; N quotedbl ; B 169 513 420 739 ;
XC 35 ; WX 560 ; N numbersign ; B 77 0 623 740 ;
XC 36 ; WX 560 ; N dollar ; B 100 -85 575 855 ;
XC 37 ; WX 860 ; N percent ; B 124 -18 868 753 ;
XC 38 ; WX 680 ; N ampersand ; B 71 -18 741 753 ;
XC 39 ; WX 280 ; N quoteright ; B 159 466 342 739 ;
XC 40 ; WX 380 ; N parenleft ; B 122 -128 486 739 ;
XC 41 ; WX 380 ; N parenright ; B 13 -128 377 739 ;
XC 42 ; WX 440 ; N asterisk ; B 176 456 490 753 ;
XC 43 ; WX 600 ; N plus ; B 100 65 625 570 ;
XC 44 ; WX 280 ; N comma ; B 47 -140 230 133 ;
XC 45 ; WX 420 ; N hyphen ; B 122 259 421 377 ;
XC 46 ; WX 280 ; N period ; B 72 0 230 133 ;
XC 47 ; WX 460 ; N slash ; B 2 -128 580 739 ;
XC 48 ; WX 560 ; N zero ; B 68 -18 623 753 ;
XC 49 ; WX 560 ; N one ; B 246 0 516 739 ;
XC 50 ; WX 560 ; N two ; B 42 0 619 753 ;
XC 51 ; WX 560 ; N three ; B 53 -18 571 753 ;
XC 52 ; WX 560 ; N four ; B 20 0 589 739 ;
XC 53 ; WX 560 ; N five ; B 50 -18 586 739 ;
XC 54 ; WX 560 ; N six ; B 62 -18 584 739 ;
XC 55 ; WX 560 ; N seven ; B 85 0 637 739 ;
XC 56 ; WX 560 ; N eight ; B 69 -18 582 753 ;
XC 57 ; WX 560 ; N nine ; B 108 0 628 753 ;
XC 58 ; WX 280 ; N colon ; B 72 0 298 502 ;
XC 59 ; WX 280 ; N semicolon ; B 47 -140 298 502 ;
XC 60 ; WX 600 ; N less ; B 98 42 668 593 ;
XC 61 ; WX 600 ; N equal ; B 81 163 643 473 ;
XC 62 ; WX 600 ; N greater ; B 56 42 625 593 ;
XC 63 ; WX 560 ; N question ; B 129 0 586 753 ;
XC 64 ; WX 740 ; N at ; B 64 -18 831 753 ;
XC 65 ; WX 740 ; N A ; B 7 0 733 739 ;
XC 66 ; WX 580 ; N B ; B 68 0 607 739 ;
XC 67 ; WX 780 ; N C ; B 92 -18 858 753 ;
XC 68 ; WX 700 ; N D ; B 68 0 734 739 ;
XC 69 ; WX 520 ; N E ; B 68 0 602 739 ;
XC 70 ; WX 480 ; N F ; B 68 0 581 739 ;
XC 71 ; WX 840 ; N G ; B 91 -18 888 753 ;
XC 72 ; WX 680 ; N H ; B 68 0 743 739 ;
XC 73 ; WX 280 ; N I ; B 68 0 342 739 ;
XC 74 ; WX 480 ; N J ; B 38 -18 551 739 ;
XC 75 ; WX 620 ; N K ; B 68 0 736 739 ;
XC 76 ; WX 440 ; N L ; B 68 0 456 739 ;
XC 77 ; WX 900 ; N M ; B 68 0 977 739 ;
XC 78 ; WX 740 ; N N ; B 68 0 804 739 ;
XC 79 ; WX 840 ; N O ; B 91 -18 875 753 ;
XC 80 ; WX 560 ; N P ; B 68 0 639 739 ;
XC 81 ; WX 840 ; N Q ; B 91 -18 889 753 ;
XC 82 ; WX 580 ; N R ; B 68 0 657 739 ;
XC 83 ; WX 520 ; N S ; B 49 -18 579 753 ;
XC 84 ; WX 420 ; N T ; B 119 0 555 739 ;
XC 85 ; WX 640 ; N U ; B 109 -18 704 739 ;
XC 86 ; WX 700 ; N V ; B 145 0 831 739 ;
XC 87 ; WX 900 ; N W ; B 144 0 1035 739 ;
XC 88 ; WX 680 ; N X ; B 5 0 813 739 ;
XC 89 ; WX 620 ; N Y ; B 140 0 763 739 ;
XC 90 ; WX 500 ; N Z ; B 18 0 598 739 ;
XC 91 ; WX 320 ; N bracketleft ; B 100 -127 429 739 ;
XC 92 ; WX 640 ; N backslash ; B 221 0 503 739 ;
XC 93 ; WX 320 ; N bracketright ; B 13 -127 346 739 ;
XC 94 ; WX 600 ; N asciicircum ; B 130 315 610 739 ;
XC 95 ; WX 500 ; N underscore ; B -26 -138 491 -48 ;
XC 96 ; WX 280 ; N quoteleft ; B 161 480 343 753 ;
XC 97 ; WX 660 ; N a ; B 75 -18 718 572 ;
XC 98 ; WX 660 ; N b ; B 54 -18 695 739 ;
XC 99 ; WX 640 ; N c ; B 77 -18 670 572 ;
XC 100 ; WX 660 ; N d ; B 76 -18 750 739 ;
XC 101 ; WX 640 ; N e ; B 76 -18 665 572 ;
XC 102 ; WX 280 ; N f ; B 57 0 413 753 ; L i fi ; L l fl ;
XC 103 ; WX 660 ; N g ; B 30 -225 714 572 ;
XC 104 ; WX 600 ; N h ; B 54 0 613 739 ;
XC 105 ; WX 240 ; N i ; B 54 0 324 739 ;
XC 106 ; WX 260 ; N j ; B -17 -185 342 739 ;
XC 107 ; WX 580 ; N k ; B 54 0 625 739 ;
XC 108 ; WX 240 ; N l ; B 54 0 324 739 ;
XC 109 ; WX 940 ; N m ; B 54 0 952 572 ;
XC 110 ; WX 600 ; N n ; B 54 0 613 572 ;
XC 111 ; WX 640 ; N o ; B 76 -18 675 572 ;
XC 112 ; WX 660 ; N p ; B 20 -185 691 572 ;
XC 113 ; WX 660 ; N q ; B 77 -185 714 572 ;
XC 114 ; WX 320 ; N r ; B 54 0 412 572 ;
XC 115 ; WX 440 ; N s ; B 49 -18 482 572 ;
XC 116 ; WX 300 ; N t ; B 74 0 390 739 ;
XC 117 ; WX 600 ; N u ; B 88 -18 650 554 ;
XC 118 ; WX 560 ; N v ; B 104 0 656 554 ;
XC 119 ; WX 800 ; N w ; B 113 0 888 554 ;
XC 120 ; WX 560 ; N x ; B 1 0 629 554 ;
XC 121 ; WX 580 ; N y ; B 73 -185 671 554 ;
XC 122 ; WX 460 ; N z ; B 20 0 528 554 ;
XC 123 ; WX 340 ; N braceleft ; B 94 -127 439 738 ;
XC 124 ; WX 600 ; N bar ; B 243 0 499 739 ;
XC 125 ; WX 340 ; N braceright ; B 14 -127 360 738 ;
XC 126 ; WX 600 ; N asciitilde ; B 105 215 619 421 ;
XC 161 ; WX 280 ; N exclamdown ; B 38 -185 308 554 ;
XC 162 ; WX 560 ; N cent ; B 106 39 593 713 ;
XC 163 ; WX 560 ; N sterling ; B 40 0 616 753 ;
XC 164 ; WX 160 ; N fraction ; B -121 0 417 739 ;
XC 165 ; WX 560 ; N yen ; B 51 0 726 739 ;
XC 166 ; WX 560 ; N florin ; B -44 -150 646 822 ;
XC 167 ; WX 560 ; N section ; B 68 -141 608 768 ;
XC 168 ; WX 560 ; N currency ; B 69 148 640 653 ;
XC 169 ; WX 220 ; N quotesingle ; B 169 513 287 739 ;
XC 170 ; WX 480 ; N quotedblleft ; B 159 480 548 753 ;
XC 171 ; WX 460 ; N guillemotleft ; B 85 136 480 498 ;
XC 172 ; WX 240 ; N guilsinglleft ; B 85 136 267 498 ;
XC 173 ; WX 240 ; N guilsinglright ; B 98 136 280 498 ;
XC 174 ; WX 520 ; N fi ; B 55 0 598 753 ;
XC 175 ; WX 520 ; N fl ; B 55 0 598 753 ;
XC 177 ; WX 500 ; N endash ; B 48 259 570 377 ;
XC 178 ; WX 560 ; N dagger ; B 129 -128 608 739 ;
XC 179 ; WX 560 ; N daggerdbl ; B 96 -128 615 739 ;
XC 180 ; WX 280 ; N periodcentered ; B 119 251 276 384 ;
XC 182 ; WX 600 ; N paragraph ; B 133 -128 664 739 ;
XC 183 ; WX 600 ; N bullet ; B 190 149 533 486 ;
XC 184 ; WX 280 ; N quotesinglbase ; B 46 -140 228 133 ;
XC 185 ; WX 480 ; N quotedblbase ; B 45 -140 435 133 ;
XC 186 ; WX 480 ; N quotedblright ; B 157 466 547 739 ;
XC 187 ; WX 460 ; N guillemotright ; B 98 136 493 498 ;
XC 188 ; WX 1000 ; N ellipsis ; B 100 0 924 133 ;
XC 189 ; WX 1280 ; N perthousand ; B 124 -18 1281 753 ;
XC 191 ; WX 560 ; N questiondown ; B 71 -199 528 554 ;
XC 193 ; WX 420 ; N grave ; B 211 613 484 840 ;
XC 194 ; WX 420 ; N acute ; B 205 613 488 838 ;
XC 195 ; WX 540 ; N circumflex ; B 189 620 588 758 ;
XC 196 ; WX 480 ; N tilde ; B 206 620 528 749 ;
XC 197 ; WX 420 ; N macron ; B 189 620 486 730 ;
XC 198 ; WX 480 ; N breve ; B 214 620 544 756 ;
XC 199 ; WX 280 ; N dotaccent ; B 189 620 347 753 ;
XC 200 ; WX 500 ; N dieresis ; B 189 620 557 753 ;
XC 202 ; WX 360 ; N ring ; B 206 620 416 826 ;
XC 203 ; WX 340 ; N cedilla ; B 42 -251 244 0 ;
XC 205 ; WX 700 ; N hungarumlaut ; B 204 620 768 845 ;
XC 206 ; WX 340 ; N ogonek ; B 52 -203 235 0 ;
XC 207 ; WX 540 ; N caron ; B 214 620 613 758 ;
XC 208 ; WX 1000 ; N emdash ; B 48 259 1070 377 ;
XC 225 ; WX 900 ; N AE ; B 17 0 980 739 ;
XC 227 ; WX 360 ; N ordfeminine ; B 90 316 480 753 ;
XC 232 ; WX 480 ; N Lslash ; B 49 0 498 739 ;
XC 233 ; WX 840 ; N Oslash ; B 91 -70 887 813 ;
XC 234 ; WX 1060 ; N OE ; B 100 -14 1141 753 ;
XC 235 ; WX 360 ; N ordmasculine ; B 90 316 451 753 ;
XC 241 ; WX 1080 ; N ae ; B 76 -18 1108 572 ;
XC 245 ; WX 240 ; N dotlessi ; B 54 0 290 554 ;
XC 248 ; WX 320 ; N lslash ; B 59 0 420 739 ;
XC 249 ; WX 660 ; N oslash ; B 76 -50 680 606 ;
XC 250 ; WX 1080 ; N oe ; B 76 -18 1105 572 ;
XC 251 ; WX 600 ; N germandbls ; B 51 -18 628 753 ;
XC -1 ; WX 740 ; N Aacute ; B 7 0 733 1023 ;
XC -1 ; WX 740 ; N Acircumflex ; B 7 0 733 943 ;
XC -1 ; WX 740 ; N Adieresis ; B 7 0 733 938 ;
XC -1 ; WX 740 ; N Agrave ; B 7 0 733 1025 ;
XC -1 ; WX 740 ; N Aring ; B 7 0 733 1011 ;
XC -1 ; WX 740 ; N Atilde ; B 7 0 733 934 ;
XC -1 ; WX 780 ; N Ccedilla ; B 92 -251 858 753 ;
XC -1 ; WX 520 ; N Eacute ; B 68 0 602 1023 ;
XC -1 ; WX 520 ; N Ecircumflex ; B 68 0 612 943 ;
XC -1 ; WX 520 ; N Edieresis ; B 68 0 602 938 ;
XC -1 ; WX 520 ; N Egrave ; B 68 0 602 1025 ;
XC -1 ; WX 742 ; N Eth ; B 73 0 776 739 ;
XC -1 ; WX 280 ; N Iacute ; B 68 0 452 1023 ;
XC -1 ; WX 280 ; N Icircumflex ; B 68 0 492 943 ;
XC -1 ; WX 280 ; N Idieresis ; B 68 0 481 938 ;
XC -1 ; WX 280 ; N Igrave ; B 68 0 448 1025 ;
XC -1 ; WX 740 ; N Ntilde ; B 68 0 804 934 ;
XC -1 ; WX 840 ; N Oacute ; B 91 -18 875 1023 ;
XC -1 ; WX 840 ; N Ocircumflex ; B 91 -18 875 943 ;
XC -1 ; WX 840 ; N Odieresis ; B 91 -18 875 938 ;
XC -1 ; WX 840 ; N Ograve ; B 91 -18 875 1025 ;
XC -1 ; WX 840 ; N Otilde ; B 91 -18 875 934 ;
XC -1 ; WX 520 ; N Scaron ; B 49 -18 637 943 ;
XC -1 ; WX 560 ; N Thorn ; B 68 0 613 739 ;
XC -1 ; WX 640 ; N Uacute ; B 109 -18 704 1023 ;
XC -1 ; WX 640 ; N Ucircumflex ; B 109 -18 704 943 ;
XC -1 ; WX 640 ; N Udieresis ; B 109 -18 704 938 ;
XC -1 ; WX 640 ; N Ugrave ; B 109 -18 704 1025 ;
XC -1 ; WX 620 ; N Yacute ; B 140 0 763 1023 ;
XC -1 ; WX 620 ; N Ydieresis ; B 140 0 763 938 ;
XC -1 ; WX 500 ; N Zcaron ; B 18 0 627 943 ;
XC -1 ; WX 660 ; N aacute ; B 75 -18 718 838 ;
XC -1 ; WX 660 ; N acircumflex ; B 75 -18 718 758 ;
XC -1 ; WX 660 ; N adieresis ; B 75 -18 718 753 ;
XC -1 ; WX 660 ; N agrave ; B 75 -18 718 840 ;
XC -1 ; WX 660 ; N aring ; B 75 -18 718 826 ;
XC -1 ; WX 660 ; N atilde ; B 75 -18 718 749 ;
XC -1 ; WX 600 ; N brokenbar ; B 243 0 499 739 ;
XC -1 ; WX 640 ; N ccedilla ; B 77 -251 670 572 ;
XC -1 ; WX 740 ; N copyright ; B 50 -18 834 753 ;
XC -1 ; WX 400 ; N degree ; B 157 439 462 739 ;
XC -1 ; WX 600 ; N divide ; B 100 65 625 570 ;
XC -1 ; WX 640 ; N eacute ; B 76 -18 665 838 ;
XC -1 ; WX 640 ; N ecircumflex ; B 76 -18 665 758 ;
XC -1 ; WX 640 ; N edieresis ; B 76 -18 665 753 ;
XC -1 ; WX 640 ; N egrave ; B 76 -18 665 840 ;
XC -1 ; WX 640 ; N eth ; B 76 -18 680 770 ;
XC -1 ; WX 240 ; N iacute ; B 54 0 398 838 ;
XC -1 ; WX 240 ; N icircumflex ; B 39 0 438 758 ;
XC -1 ; WX 240 ; N idieresis ; B 54 0 427 753 ;
XC -1 ; WX 240 ; N igrave ; B 54 0 394 840 ;
XC -1 ; WX 600 ; N logicalnot ; B 117 182 643 473 ;
XC -1 ; WX 600 ; N minus ; B 99 260 625 376 ;
XC -1 ; WX 576 ; N mu ; B 20 -185 650 554 ;
XC -1 ; WX 600 ; N multiply ; B 78 66 645 570 ;
XC -1 ; WX 600 ; N ntilde ; B 54 0 613 749 ;
XC -1 ; WX 640 ; N oacute ; B 76 -18 675 838 ;
XC -1 ; WX 640 ; N ocircumflex ; B 76 -18 675 758 ;
XC -1 ; WX 640 ; N odieresis ; B 76 -18 675 753 ;
XC -1 ; WX 640 ; N ograve ; B 76 -18 675 840 ;
XC -1 ; WX 840 ; N onehalf ; B 205 0 889 739 ;
XC -1 ; WX 840 ; N onequarter ; B 209 0 867 739 ;
XC -1 ; WX 336 ; N onesuperior ; B 209 296 378 739 ;
XC -1 ; WX 640 ; N otilde ; B 76 -18 675 749 ;
XC -1 ; WX 600 ; N plusminus ; B 51 0 635 570 ;
XC -1 ; WX 740 ; N registered ; B 50 -18 834 753 ;
XC -1 ; WX 440 ; N scaron ; B 49 -18 563 758 ;
XC -1 ; WX 660 ; N thorn ; B 20 -185 691 739 ;
XC -1 ; WX 840 ; N threequarters ; B 82 0 867 748 ;
XC -1 ; WX 336 ; N threesuperior ; B 82 286 415 748 ;
XC -1 ; WX 1000 ; N trademark ; B 194 335 1066 739 ;
XC -1 ; WX 336 ; N twosuperior ; B 70 296 440 748 ;
XC -1 ; WX 600 ; N uacute ; B 88 -18 650 838 ;
XC -1 ; WX 600 ; N ucircumflex ; B 88 -18 650 758 ;
XC -1 ; WX 600 ; N udieresis ; B 88 -18 650 753 ;
XC -1 ; WX 600 ; N ugrave ; B 88 -18 650 840 ;
XC -1 ; WX 580 ; N yacute ; B 73 -185 671 838 ;
XC -1 ; WX 580 ; N ydieresis ; B 73 -185 671 753 ;
XC -1 ; WX 460 ; N zcaron ; B 20 0 573 758 ;
XEndCharMetrics
XStartKernData
XStartKernPairs 93
X
XKPX A y -60
XKPX A w -60
XKPX A v -60
XKPX A Y -139
XKPX A W -96
XKPX A V -127
XKPX A T -73
X
XKPX F period -42
XKPX F comma -42
XKPX F A -95
X
XKPX L y -60
XKPX L Y -90
XKPX L W -90
XKPX L V -90
XKPX L T -50
X
XKPX P period -15
XKPX P comma -15
XKPX P A -100
X
XKPX R y 31
XKPX R Y -10
XKPX R W -10
XKPX R V -10
XKPX R T 16
X
XKPX T y -12
XKPX T w -15
XKPX T u -40
XKPX T semicolon -12
XKPX T s -35
XKPX T r -42
XKPX T period 4
XKPX T o -35
XKPX T i 5
XKPX T hyphen -10
XKPX T e -35
XKPX T comma 4
XKPX T colon -12
XKPX T c -35
XKPX T a -35
XKPX T A -70
X
XKPX V y -15
XKPX V u -68
XKPX V semicolon -13
XKPX V r -40
XKPX V period -30
XKPX V o -80
XKPX V i -9
XKPX V hyphen -20
XKPX V e -80
XKPX V comma -30
XKPX V colon -13
XKPX V a -80
XKPX V A -125
X
XKPX W y 1
XKPX W u -40
XKPX W semicolon -12
XKPX W r -39
XKPX W period -12
XKPX W o -50
XKPX W i -7
XKPX W hyphen -10
XKPX W e -50
XKPX W comma -12
XKPX W colon -12
XKPX W a -50
XKPX W A -94
X
XKPX Y v -25
XKPX Y u -82
XKPX Y semicolon -8
XKPX Y q -100
XKPX Y period -8
XKPX Y p -60
XKPX Y o -100
XKPX Y i -5
XKPX Y hyphen -60
XKPX Y e -100
XKPX Y comma -20
XKPX Y colon -8
XKPX Y a -100
XKPX Y A -138
X
XKPX f f 38
X
XKPX r q -18
XKPX r period 9
XKPX r o -25
XKPX r n 15
XKPX r m 15
XKPX r hyphen -10
XKPX r h 0
XKPX r g -8
XKPX r f 38
XKPX r e -8
XKPX r d -8
XKPX r comma 9
XKPX r c -27
XEndKernPairs
XEndKernData
XStartComposites 58
XCC Zcaron 2 ; PCC Z 0 0 ; PCC caron -20 185 ;
XCC zcaron 2 ; PCC z 0 0 ; PCC caron -40 0 ;
XCC Scaron 2 ; PCC S 0 0 ; PCC caron -10 185 ;
XCC scaron 2 ; PCC s 0 0 ; PCC caron -50 0 ;
XCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 220 0 ;
XCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 150 0 ;
XCC Yacute 2 ; PCC Y 0 0 ; PCC acute 100 185 ;
XCC yacute 2 ; PCC y 0 0 ; PCC acute 80 0 ;
XCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 60 185 ;
XCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 40 0 ;
XCC Uacute 2 ; PCC U 0 0 ; PCC acute 110 185 ;
XCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 50 185 ;
XCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 70 185 ;
XCC Ugrave 2 ; PCC U 0 0 ; PCC grave 110 185 ;
XCC uacute 2 ; PCC u 0 0 ; PCC acute 90 0 ;
XCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 30 0 ;
XCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 50 0 ;
XCC ugrave 2 ; PCC u 0 0 ; PCC grave 90 0 ;
XCC Iacute 2 ; PCC I 0 0 ; PCC acute -70 185 ;
XCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex -130 185 ;
XCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis -110 185 ;
XCC Igrave 2 ; PCC I 0 0 ; PCC grave -70 185 ;
XCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -90 0 ;
XCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -150 0 ;
XCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -130 0 ;
XCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -90 0 ;
XCC Eacute 2 ; PCC E 0 0 ; PCC acute 50 185 ;
XCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex -10 185 ;
XCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 10 185 ;
XCC Egrave 2 ; PCC E 0 0 ; PCC grave 50 185 ;
XCC eacute 2 ; PCC e 0 0 ; PCC acute 110 0 ;
XCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 50 0 ;
XCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 70 0 ;
XCC egrave 2 ; PCC e 0 0 ; PCC grave 110 0 ;
XCC Aacute 2 ; PCC A 0 0 ; PCC acute 160 185 ;
XCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 100 185 ;


XCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 120 185 ;

XCC Agrave 2 ; PCC A 0 0 ; PCC grave 160 185 ;
XCC aacute 2 ; PCC a 0 0 ; PCC acute 120 0 ;
XCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 60 0 ;
XCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 80 0 ;
XCC agrave 2 ; PCC a 0 0 ; PCC grave 120 0 ;
XCC Oacute 2 ; PCC O 0 0 ; PCC acute 210 185 ;
XCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 150 185 ;
XCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 170 185 ;
XCC Ograve 2 ; PCC O 0 0 ; PCC grave 210 185 ;
XCC oacute 2 ; PCC o 0 0 ; PCC acute 110 0 ;
XCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 50 0 ;
XCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 70 0 ;
XCC ograve 2 ; PCC o 0 0 ; PCC grave 110 0 ;
XCC Atilde 2 ; PCC A 0 0 ; PCC tilde 130 185 ;
XCC atilde 2 ; PCC a 0 0 ; PCC tilde 90 0 ;
XCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 130 185 ;
XCC ntilde 2 ; PCC n 0 0 ; PCC tilde 60 0 ;
XCC Otilde 2 ; PCC O 0 0 ; PCC tilde 180 185 ;
XCC otilde 2 ; PCC o 0 0 ; PCC tilde 80 0 ;
XCC Aring 2 ; PCC A 0 0 ; PCC ring 190 185 ;
XCC aring 2 ; PCC a 0 0 ; PCC ring 150 0 ;
XEndComposites
XEndFontMetrics
END_OF_FILE
if test 15350 -ne `wc -c <'lout/font0/AvantGarDemObl.AFM'`; then
echo shar: \"'lout/font0/AvantGarDemObl.AFM'\" unpacked with wrong size!
fi
# end of 'lout/font0/AvantGarDemObl.AFM'
fi
if test -f 'lout/font0/BookmDemIta.AFM' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/font0/BookmDemIta.AFM'\"
else
echo shar: Extracting \"'lout/font0/BookmDemIta.AFM'\" \(15226 characters\)
sed "s/^X//" >'lout/font0/BookmDemIta.AFM' <<'END_OF_FILE'


XStartFontMetrics 2.0
XComment Copyright (c) 1984 Adobe Systems Incorporated. All Rights Reserved.

XComment Creation Date:Sat Feb 7 21:22:00 PST 1987
XFontName Bookman-DemiItalic
XEncodingScheme AdobeStandardEncoding
XFullName ITC Bookman Demi Italic
XFamilyName ITC Bookman
XWeight Demi
XItalicAngle -10.0
XIsFixedPitch false
XUnderlinePosition -125
XUnderlineThickness 60
XVersion 001.001
XNotice ITC Bookman is a registered trademark of International Typeface Corporation.
XFontBBox -231 -220 1333 941
XCapHeight 681
XXHeight 515
XDescender -213
XAscender 732
XStartCharMetrics 228
XC 32 ; WX 340 ; N space ; B 0 0 0 0 ;
XC 33 ; WX 320 ; N exclam ; B 86 -8 366 698 ;
XC 34 ; WX 380 ; N quotedbl ; B 140 372 507 698 ;
XC 35 ; WX 680 ; N numbersign ; B 157 0 649 681 ;
XC 36 ; WX 680 ; N dollar ; B 45 -164 697 790 ;
XC 37 ; WX 880 ; N percent ; B 106 -17 899 698 ;
XC 38 ; WX 980 ; N ampersand ; B 48 -17 1016 698 ;
XC 39 ; WX 320 ; N quoteright ; B 171 420 349 698 ;
XC 40 ; WX 260 ; N parenleft ; B 31 -134 388 741 ;
XC 41 ; WX 260 ; N parenright ; B -35 -134 322 741 ;
XC 42 ; WX 460 ; N asterisk ; B 126 346 508 698 ;
XC 43 ; WX 600 ; N plus ; B 91 9 595 514 ;
XC 44 ; WX 340 ; N comma ; B 100 -124 298 185 ;
XC 45 ; WX 280 ; N hyphen ; B 59 218 319 313 ;
XC 46 ; WX 340 ; N period ; B 106 -8 296 177 ;
XC 47 ; WX 360 ; N slash ; B 9 -106 502 741 ;
XC 48 ; WX 680 ; N zero ; B 87 -17 703 698 ;
XC 49 ; WX 680 ; N one ; B 123 0 565 681 ;
XC 50 ; WX 680 ; N two ; B 67 0 674 698 ;
XC 51 ; WX 680 ; N three ; B 72 -17 683 698 ;
XC 52 ; WX 680 ; N four ; B 63 0 708 681 ;
XC 53 ; WX 680 ; N five ; B 78 -17 669 681 ;
XC 54 ; WX 680 ; N six ; B 88 -17 704 698 ;
XC 55 ; WX 680 ; N seven ; B 123 0 739 681 ;
XC 56 ; WX 680 ; N eight ; B 68 -17 686 698 ;
XC 57 ; WX 680 ; N nine ; B 71 -17 712 698 ;
XC 58 ; WX 340 ; N colon ; B 106 -8 356 515 ;
XC 59 ; WX 340 ; N semicolon ; B 100 -124 352 515 ;
XC 60 ; WX 620 ; N less ; B 79 -9 588 540 ;
XC 61 ; WX 600 ; N equal ; B 91 109 595 421 ;
XC 62 ; WX 620 ; N greater ; B 89 -9 598 540 ;
XC 63 ; WX 620 ; N question ; B 145 -8 668 698 ;
XC 64 ; WX 780 ; N at ; B 80 -17 790 698 ;
XC 65 ; WX 720 ; N A ; B -27 0 769 681 ;
XC 66 ; WX 720 ; N B ; B 14 0 762 681 ;
XC 67 ; WX 700 ; N C ; B 78 -17 754 698 ;
XC 68 ; WX 760 ; N D ; B 14 0 805 681 ;
XC 69 ; WX 720 ; N E ; B 14 0 777 681 ;
XC 70 ; WX 660 ; N F ; B 14 0 763 681 ;
XC 71 ; WX 760 ; N G ; B 77 -17 828 698 ;
XC 72 ; WX 800 ; N H ; B 14 0 910 681 ;
XC 73 ; WX 380 ; N I ; B 14 0 485 681 ;
XC 74 ; WX 620 ; N J ; B 8 -17 721 681 ;
XC 75 ; WX 780 ; N K ; B 14 0 879 681 ;
XC 76 ; WX 640 ; N L ; B 14 0 725 681 ;
XC 77 ; WX 860 ; N M ; B 14 0 970 681 ;
XC 78 ; WX 740 ; N N ; B 14 0 845 681 ;
XC 79 ; WX 760 ; N O ; B 78 -17 806 698 ;
XC 80 ; WX 640 ; N P ; B -6 0 724 681 ;
XC 81 ; WX 760 ; N Q ; B 37 -213 805 698 ;
XC 82 ; WX 740 ; N R ; B 14 0 765 681 ;
XC 83 ; WX 700 ; N S ; B 59 -17 731 698 ;
XC 84 ; WX 700 ; N T ; B 70 0 802 681 ;
XC 85 ; WX 740 ; N U ; B 112 -17 855 681 ;
XC 86 ; WX 660 ; N V ; B 72 0 819 681 ;
XC 87 ; WX 1000 ; N W ; B 72 0 1090 681 ;
XC 88 ; WX 740 ; N X ; B -7 0 835 681 ;
XC 89 ; WX 660 ; N Y ; B 72 0 817 681 ;
XC 90 ; WX 680 ; N Z ; B 23 0 740 681 ;
XC 91 ; WX 260 ; N bracketleft ; B 9 -118 374 741 ;
XC 92 ; WX 580 ; N backslash ; B 73 0 575 741 ;
XC 93 ; WX 260 ; N bracketright ; B -18 -118 347 741 ;
XC 94 ; WX 620 ; N asciicircum ; B 92 281 594 681 ;
XC 95 ; WX 500 ; N underscore ; B 0 -155 500 -95 ;
XC 96 ; WX 320 ; N quoteleft ; B 155 420 333 698 ;
XC 97 ; WX 680 ; N a ; B 84 -8 735 515 ;
XC 98 ; WX 600 ; N b ; B 57 -8 633 732 ;
XC 99 ; WX 560 ; N c ; B 58 -8 597 515 ;
XC 100 ; WX 680 ; N d ; B 60 -8 714 732 ;
XC 101 ; WX 560 ; N e ; B 59 -8 596 515 ;
XC 102 ; WX 420 ; N f ; B -192 -213 641 741 ; L i fi ; L l fl ;
XC 103 ; WX 620 ; N g ; B 21 -213 669 515 ;
XC 104 ; WX 700 ; N h ; B 93 -8 736 732 ;
XC 105 ; WX 380 ; N i ; B 83 -8 420 755 ;
XC 106 ; WX 320 ; N j ; B -160 -213 392 755 ;
XC 107 ; WX 700 ; N k ; B 97 -8 732 732 ;
XC 108 ; WX 380 ; N l ; B 109 -8 410 732 ;
XC 109 ; WX 960 ; N m ; B 83 -8 996 515 ;
XC 110 ; WX 680 ; N n ; B 83 -8 715 515 ;
XC 111 ; WX 600 ; N o ; B 59 -8 627 515 ;
XC 112 ; WX 660 ; N p ; B -24 -213 682 515 ;
XC 113 ; WX 620 ; N q ; B 60 -213 640 515 ;
XC 114 ; WX 500 ; N r ; B 84 0 582 515 ;
XC 115 ; WX 540 ; N s ; B 32 -8 573 515 ;
XC 116 ; WX 440 ; N t ; B 106 -8 488 658 ;
XC 117 ; WX 680 ; N u ; B 83 -8 720 507 ;
XC 118 ; WX 540 ; N v ; B 56 -8 572 515 ;
XC 119 ; WX 860 ; N w ; B 56 -8 891 515 ;
XC 120 ; WX 620 ; N x ; B 10 -8 654 515 ;
XC 121 ; WX 600 ; N y ; B 25 -213 642 507 ;
XC 122 ; WX 560 ; N z ; B 36 -8 586 515 ;
XC 123 ; WX 300 ; N braceleft ; B 53 -123 409 742 ;
XC 124 ; WX 620 ; N bar ; B 303 0 422 741 ;
XC 125 ; WX 300 ; N braceright ; B -4 -123 352 742 ;
XC 126 ; WX 620 ; N asciitilde ; B 101 162 605 368 ;
XC 161 ; WX 320 ; N exclamdown ; B 64 -191 344 515 ;
XC 162 ; WX 680 ; N cent ; B 161 25 616 718 ;
XC 163 ; WX 680 ; N sterling ; B 0 -17 787 698 ;
XC 164 ; WX 120 ; N fraction ; B -144 0 382 681 ;
XC 165 ; WX 680 ; N yen ; B 92 0 782 681 ;
XC 166 ; WX 680 ; N florin ; B -28 -199 743 741 ;
XC 167 ; WX 620 ; N section ; B 46 -137 638 698 ;
XC 168 ; WX 680 ; N currency ; B 148 85 637 571 ;
XC 169 ; WX 180 ; N quotesingle ; B 126 370 295 696 ;
XC 170 ; WX 520 ; N quotedblleft ; B 156 420 545 698 ;
XC 171 ; WX 380 ; N guillemotleft ; B 62 84 406 503 ;
XC 172 ; WX 220 ; N guilsinglleft ; B 62 84 249 503 ;
XC 173 ; WX 220 ; N guilsinglright ; B 62 84 249 503 ;
XC 174 ; WX 820 ; N fi ; B -191 -213 850 741 ;
XC 175 ; WX 820 ; N fl ; B -191 -213 850 741 ;
XC 177 ; WX 500 ; N endash ; B 40 219 573 311 ;
XC 178 ; WX 420 ; N dagger ; B 89 -137 466 698 ;
XC 179 ; WX 420 ; N daggerdbl ; B 79 -137 486 698 ;
XC 180 ; WX 340 ; N periodcentered ; B 126 173 316 358 ;
XC 182 ; WX 680 ; N paragraph ; B 70 -204 726 681 ;
XC 183 ; WX 360 ; N bullet ; B 60 170 404 511 ;
XC 184 ; WX 300 ; N quotesinglbase ; B 106 -112 284 166 ;
XC 185 ; WX 520 ; N quotedblbase ; B 106 -112 495 166 ;
XC 186 ; WX 520 ; N quotedblright ; B 171 420 560 698 ;
XC 187 ; WX 380 ; N guillemotright ; B 62 84 406 503 ;
XC 188 ; WX 1000 ; N ellipsis ; B 86 -8 942 177 ;
XC 189 ; WX 1360 ; N perthousand ; B 106 -17 1333 698 ;
XC 191 ; WX 620 ; N questiondown ; B 83 -189 606 515 ;
XC 193 ; WX 380 ; N grave ; B 193 566 424 771 ;
XC 194 ; WX 340 ; N acute ; B 176 566 407 771 ;
XC 195 ; WX 480 ; N circumflex ; B 183 582 523 749 ;
XC 196 ; WX 480 ; N tilde ; B 178 587 533 709 ;
XC 197 ; WX 480 ; N macron ; B 177 603 531 691 ;
XC 198 ; WX 460 ; N breve ; B 177 577 516 707 ;
XC 199 ; WX 380 ; N dotaccent ; B 180 570 345 734 ;
XC 200 ; WX 520 ; N dieresis ; B 180 570 569 734 ;
XC 202 ; WX 360 ; N ring ; B 185 558 406 775 ;
XC 203 ; WX 360 ; N cedilla ; B 68 -220 289 -8 ;
XC 205 ; WX 560 ; N hungarumlaut ; B 181 560 616 775 ;
XC 206 ; WX 320 ; N ogonek ; B 68 -182 253 0 ;
XC 207 ; WX 480 ; N caron ; B 183 582 523 749 ;
XC 208 ; WX 1000 ; N emdash ; B 40 219 1073 311 ;
XC 225 ; WX 1140 ; N AE ; B -27 0 1207 681 ;
XC 227 ; WX 440 ; N ordfeminine ; B 55 302 495 685 ;
XC 232 ; WX 640 ; N Lslash ; B 14 0 724 681 ;
XC 233 ; WX 760 ; N Oslash ; B 21 -29 847 725 ;
XC 234 ; WX 1180 ; N OE ; B 94 -17 1245 698 ;
XC 235 ; WX 440 ; N ordmasculine ; B 47 302 467 685 ;
XC 241 ; WX 880 ; N ae ; B 39 -8 913 515 ;
XC 245 ; WX 380 ; N dotlessi ; B 83 -8 420 507 ;
XC 248 ; WX 380 ; N lslash ; B 63 -8 412 732 ;
XC 249 ; WX 600 ; N oslash ; B 17 -54 661 571 ;
XC 250 ; WX 920 ; N oe ; B 48 -8 961 515 ;
XC 251 ; WX 660 ; N germandbls ; B -231 -213 702 741 ;
XC -1 ; WX 720 ; N Aacute ; B -27 0 769 937 ;
XC -1 ; WX 720 ; N Acircumflex ; B -27 0 769 915 ;
XC -1 ; WX 720 ; N Adieresis ; B -27 0 769 900 ;
XC -1 ; WX 720 ; N Agrave ; B -27 0 769 937 ;
XC -1 ; WX 720 ; N Aring ; B -27 0 769 941 ;
XC -1 ; WX 720 ; N Atilde ; B -27 0 769 875 ;
XC -1 ; WX 700 ; N Ccedilla ; B 78 -220 754 698 ;
XC -1 ; WX 720 ; N Eacute ; B 14 0 777 937 ;
XC -1 ; WX 720 ; N Ecircumflex ; B 14 0 777 915 ;
XC -1 ; WX 720 ; N Edieresis ; B 14 0 777 900 ;
XC -1 ; WX 720 ; N Egrave ; B 14 0 777 937 ;
XC -1 ; WX 760 ; N Eth ; B 14 0 805 681 ;
XC -1 ; WX 380 ; N Iacute ; B 14 0 485 937 ;
XC -1 ; WX 380 ; N Icircumflex ; B 14 0 493 915 ;
XC -1 ; WX 380 ; N Idieresis ; B 14 0 499 900 ;
XC -1 ; WX 380 ; N Igrave ; B 14 0 485 937 ;
XC -1 ; WX 740 ; N Ntilde ; B 14 0 845 875 ;
XC -1 ; WX 760 ; N Oacute ; B 78 -17 806 937 ;
XC -1 ; WX 760 ; N Ocircumflex ; B 78 -17 806 915 ;
XC -1 ; WX 760 ; N Odieresis ; B 78 -17 806 900 ;
XC -1 ; WX 760 ; N Ograve ; B 78 -17 806 937 ;
XC -1 ; WX 760 ; N Otilde ; B 78 -17 806 875 ;
XC -1 ; WX 700 ; N Scaron ; B 59 -17 731 915 ;
XC -1 ; WX 640 ; N Thorn ; B -6 0 701 681 ;
XC -1 ; WX 740 ; N Uacute ; B 112 -17 855 937 ;
XC -1 ; WX 740 ; N Ucircumflex ; B 112 -17 855 915 ;
XC -1 ; WX 740 ; N Udieresis ; B 112 -17 855 900 ;
XC -1 ; WX 740 ; N Ugrave ; B 112 -17 855 937 ;
XC -1 ; WX 660 ; N Yacute ; B 72 0 817 937 ;
XC -1 ; WX 660 ; N Ydieresis ; B 72 0 817 900 ;
XC -1 ; WX 680 ; N Zcaron ; B 23 0 740 915 ;
XC -1 ; WX 680 ; N aacute ; B 84 -8 735 771 ;
XC -1 ; WX 680 ; N acircumflex ; B 84 -8 735 749 ;
XC -1 ; WX 680 ; N adieresis ; B 84 -8 735 734 ;
XC -1 ; WX 680 ; N agrave ; B 84 -8 735 771 ;
XC -1 ; WX 680 ; N aring ; B 84 -8 735 775 ;
XC -1 ; WX 680 ; N atilde ; B 84 -8 735 709 ;
XC -1 ; WX 620 ; N brokenbar ; B 303 0 422 741 ;
XC -1 ; WX 560 ; N ccedilla ; B 58 -220 597 515 ;
XC -1 ; WX 780 ; N copyright ; B 83 -17 783 698 ;
XC -1 ; WX 400 ; N degree ; B 130 398 430 698 ;
XC -1 ; WX 600 ; N divide ; B 91 9 595 521 ;
XC -1 ; WX 560 ; N eacute ; B 59 -8 596 771 ;
XC -1 ; WX 560 ; N ecircumflex ; B 59 -8 596 749 ;
XC -1 ; WX 560 ; N edieresis ; B 59 -8 596 734 ;
XC -1 ; WX 560 ; N egrave ; B 59 -8 596 771 ;
XC -1 ; WX 600 ; N eth ; B 59 -8 662 741 ;
XC -1 ; WX 380 ; N iacute ; B 83 -8 420 771 ;
XC -1 ; WX 380 ; N icircumflex ; B 83 -8 433 749 ;
XC -1 ; WX 380 ; N idieresis ; B 83 -8 479 734 ;
XC -1 ; WX 380 ; N igrave ; B 83 -8 424 771 ;
XC -1 ; WX 620 ; N logicalnot ; B 81 129 585 421 ;
XC -1 ; WX 600 ; N minus ; B 91 207 595 323 ;
XC -1 ; WX 680 ; N mu ; B 54 -213 720 507 ;
XC -1 ; WX 600 ; N multiply ; B 91 11 595 515 ;
XC -1 ; WX 680 ; N ntilde ; B 83 -8 715 709 ;
XC -1 ; WX 600 ; N oacute ; B 59 -8 627 771 ;
XC -1 ; WX 600 ; N ocircumflex ; B 59 -8 627 749 ;
XC -1 ; WX 600 ; N odieresis ; B 59 -8 627 734 ;
XC -1 ; WX 600 ; N ograve ; B 59 -8 627 771 ;
XC -1 ; WX 1020 ; N onehalf ; B 118 0 1036 681 ;
XC -1 ; WX 1020 ; N onequarter ; B 118 0 1054 681 ;
XC -1 ; WX 408 ; N onesuperior ; B 118 279 406 688 ;
XC -1 ; WX 600 ; N otilde ; B 59 -8 627 709 ;
XC -1 ; WX 600 ; N plusminus ; B 91 0 595 515 ;
XC -1 ; WX 780 ; N registered ; B 83 -17 783 698 ;
XC -1 ; WX 540 ; N scaron ; B 32 -8 573 749 ;
XC -1 ; WX 660 ; N thorn ; B -24 -213 682 732 ;
XC -1 ; WX 1020 ; N threequarters ; B 86 0 1054 691 ;
XC -1 ; WX 408 ; N threesuperior ; B 86 269 483 698 ;
XC -1 ; WX 940 ; N trademark ; B 42 277 982 681 ;
XC -1 ; WX 408 ; N twosuperior ; B 91 279 485 698 ;
XC -1 ; WX 680 ; N uacute ; B 83 -8 720 771 ;
XC -1 ; WX 680 ; N ucircumflex ; B 83 -8 720 749 ;
XC -1 ; WX 680 ; N udieresis ; B 83 -8 720 734 ;
XC -1 ; WX 680 ; N ugrave ; B 83 -8 720 771 ;
XC -1 ; WX 600 ; N yacute ; B 25 -213 642 771 ;
XC -1 ; WX 600 ; N ydieresis ; B 25 -213 642 734 ;
XC -1 ; WX 560 ; N zcaron ; B 36 -8 586 749 ;
XEndCharMetrics
XStartKernData
XStartKernPairs 93
X
XKPX A y 20
XKPX A w 20
XKPX A v 20
XKPX A Y -25
XKPX A W -35
XKPX A V -40
XKPX A T -17
X
XKPX F period -105
XKPX F comma -98
XKPX F A -35
X
XKPX L y 62
XKPX L Y -5
XKPX L W -15
XKPX L V -19
XKPX L T -26
X
XKPX P period -105
XKPX P comma -98
XKPX P A -31
X
XKPX R y 27
XKPX R Y 4
XKPX R W -4
XKPX R V -8
XKPX R T -3
X
XKPX T y 56
XKPX T w 69
XKPX T u 42
XKPX T semicolon 31
XKPX T s -1
XKPX T r 41
XKPX T period -107
XKPX T o -5
XKPX T i 42
XKPX T hyphen -20
XKPX T e -10
XKPX T comma -100
XKPX T colon 26
XKPX T c -8
XKPX T a -8
XKPX T A -42
X
XKPX V y 17
XKPX V u -1
XKPX V semicolon -22
XKPX V r 2
XKPX V period -115
XKPX V o -50
XKPX V i 32
XKPX V hyphen -20
XKPX V e -50
XKPX V comma -137
XKPX V colon -28
XKPX V a -50
XKPX V A -50
X
XKPX W y -51
XKPX W u -69
XKPX W semicolon -81
XKPX W r -66
XKPX W period -183
XKPX W o -100
XKPX W i -36
XKPX W hyphen -22
XKPX W e -100
XKPX W comma -201
XKPX W colon -86
XKPX W a -100
XKPX W A -77
X
XKPX Y v 26
XKPX Y u -1
XKPX Y semicolon -4
XKPX Y q -43
XKPX Y period -113
XKPX Y p 0
XKPX Y o -41
XKPX Y i 20
XKPX Y hyphen -20
XKPX Y e -46
XKPX Y comma -106
XKPX Y colon -9
XKPX Y a -45
XKPX Y A -30
X
XKPX f f 10
X
XKPX r q -3
XKPX r period -120
XKPX r o -1
XKPX r n 39
XKPX r m 39
XKPX r hyphen -20
XKPX r h -35
XKPX r g -23
XKPX r f 42
XKPX r e -6
XKPX r d -3
XKPX r comma -113
XKPX r c -5
XEndKernPairs
XEndKernData
XStartComposites 58
XCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 100 166 ;
XCC zcaron 2 ; PCC z 0 0 ; PCC caron 40 0 ;
XCC Scaron 2 ; PCC S 0 0 ; PCC caron 110 166 ;
XCC scaron 2 ; PCC s 0 0 ; PCC caron 30 0 ;
XCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 170 0 ;
XCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 100 0 ;
XCC Yacute 2 ; PCC Y 0 0 ; PCC acute 160 166 ;
XCC yacute 2 ; PCC y 0 0 ; PCC acute 130 0 ;
XCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 70 166 ;
XCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 40 0 ;
XCC Uacute 2 ; PCC U 0 0 ; PCC acute 200 166 ;
XCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 130 166 ;
XCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 130 166 ;
XCC Ugrave 2 ; PCC U 0 0 ; PCC grave 180 166 ;
XCC uacute 2 ; PCC u 0 0 ; PCC acute 170 0 ;
XCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 100 0 ;
XCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 80 0 ;
XCC ugrave 2 ; PCC u 0 0 ; PCC grave 150 0 ;
XCC Iacute 2 ; PCC I 0 0 ; PCC acute 20 166 ;
XCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex -30 166 ;
XCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis -70 166 ;
XCC Igrave 2 ; PCC I 0 0 ; PCC grave 0 166 ;


XCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute 0 0 ;

XCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -90 0 ;
XCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -90 0 ;


XCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave 0 0 ;

XCC Eacute 2 ; PCC E 0 0 ; PCC acute 190 166 ;
XCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 120 166 ;
XCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 100 166 ;
XCC Egrave 2 ; PCC E 0 0 ; PCC grave 170 166 ;
XCC eacute 2 ; PCC e 0 0 ; PCC acute 110 0 ;
XCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 60 0 ;
XCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 20 0 ;
XCC egrave 2 ; PCC e 0 0 ; PCC grave 90 0 ;
XCC Aacute 2 ; PCC A 0 0 ; PCC acute 190 166 ;
XCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 120 166 ;
XCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 100 166 ;
XCC Agrave 2 ; PCC A 0 0 ; PCC grave 170 166 ;
XCC aacute 2 ; PCC a 0 0 ; PCC acute 170 0 ;
XCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 100 0 ;
XCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 80 0 ;
XCC agrave 2 ; PCC a 0 0 ; PCC grave 150 0 ;
XCC Oacute 2 ; PCC O 0 0 ; PCC acute 210 166 ;
XCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 140 166 ;
XCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 140 166 ;
XCC Ograve 2 ; PCC O 0 0 ; PCC grave 190 166 ;
XCC oacute 2 ; PCC o 0 0 ; PCC acute 130 0 ;
XCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 60 0 ;
XCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 40 0 ;
XCC ograve 2 ; PCC o 0 0 ; PCC grave 110 0 ;
XCC Atilde 2 ; PCC A 0 0 ; PCC tilde 120 166 ;
XCC atilde 2 ; PCC a 0 0 ; PCC tilde 100 0 ;
XCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 130 166 ;
XCC ntilde 2 ; PCC n 0 0 ; PCC tilde 60 0 ;
XCC Otilde 2 ; PCC O 0 0 ; PCC tilde 140 166 ;
XCC otilde 2 ; PCC o 0 0 ; PCC tilde 60 0 ;
XCC Aring 2 ; PCC A 0 0 ; PCC ring 200 166 ;
XCC aring 2 ; PCC a 0 0 ; PCC ring 160 0 ;
XEndComposites
XEndFontMetrics
END_OF_FILE
if test 15226 -ne `wc -c <'lout/font0/BookmDemIta.AFM'`; then
echo shar: \"'lout/font0/BookmDemIta.AFM'\" unpacked with wrong size!
fi
# end of 'lout/font0/BookmDemIta.AFM'
fi
if test -f 'lout/font0/HelveBol.AFM' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/font0/HelveBol.AFM'\"
else
echo shar: Extracting \"'lout/font0/HelveBol.AFM'\" \(15443 characters\)
sed "s/^X//" >'lout/font0/HelveBol.AFM' <<'END_OF_FILE'


XStartFontMetrics 2.0
XComment Copyright (c) 1984 Adobe Systems Incorporated. All Rights Reserved.

XComment Creation Date:Sun Feb 8 19:34:17 PST 1987
XFontName Helvetica-Bold
XEncodingScheme AdobeStandardEncoding
XFullName Helvetica Bold
XFamilyName Helvetica
XWeight Bold
XItalicAngle 0.0
XIsFixedPitch false


XUnderlinePosition -106
XUnderlineThickness 73
XVersion 001.002

XNotice Helvetica is a registered trademark of Allied Corporation.
XFontBBox -173 -221 1003 936
XCapHeight 729
XXHeight 542


XDescender -219
XAscender 729
XStartCharMetrics 228

XC 32 ; WX 278 ; N space ; B 0 0 0 0 ;

XC 33 ; WX 333 ; N exclam ; B 112 0 262 729 ;
XC 34 ; WX 474 ; N quotedbl ; B 50 470 424 729 ;
XC 35 ; WX 556 ; N numbersign ; B 3 -30 553 696 ;
XC 36 ; WX 556 ; N dollar ; B 22 -125 526 765 ;
XC 37 ; WX 889 ; N percent ; B 22 -18 863 708 ;
XC 38 ; WX 722 ; N ampersand ; B 55 -20 694 729 ;
XC 39 ; WX 278 ; N quoteright ; B 66 469 201 729 ;
XC 40 ; WX 333 ; N parenleft ; B 40 -202 303 729 ;
XC 41 ; WX 333 ; N parenright ; B 22 -202 285 729 ;
XC 42 ; WX 389 ; N asterisk ; B 23 385 356 730 ;


XC 43 ; WX 584 ; N plus ; B 50 -10 534 474 ;

XC 44 ; WX 278 ; N comma ; B 64 -174 214 146 ;
XC 45 ; WX 333 ; N hyphen ; B 26 208 298 344 ;
XC 46 ; WX 278 ; N period ; B 64 0 214 146 ;
XC 47 ; WX 278 ; N slash ; B 2 -14 275 715 ;
XC 48 ; WX 556 ; N zero ; B 29 -23 517 725 ;
XC 49 ; WX 556 ; N one ; B 68 0 378 709 ;
XC 50 ; WX 556 ; N two ; B 30 0 515 726 ;
XC 51 ; WX 556 ; N three ; B 29 -23 516 726 ;
XC 52 ; WX 556 ; N four ; B 24 0 522 709 ;
XC 53 ; WX 556 ; N five ; B 27 -24 517 709 ;
XC 54 ; WX 556 ; N six ; B 32 -23 519 727 ;
XC 55 ; WX 556 ; N seven ; B 29 0 528 709 ;
XC 56 ; WX 556 ; N eight ; B 22 -23 525 726 ;
XC 57 ; WX 556 ; N nine ; B 28 -23 516 728 ;
XC 58 ; WX 333 ; N colon ; B 113 0 263 521 ;
XC 59 ; WX 333 ; N semicolon ; B 113 -174 263 521 ;
XC 60 ; WX 584 ; N less ; B 40 -10 529 474 ;
XC 61 ; WX 584 ; N equal ; B 50 52 534 412 ;
XC 62 ; WX 584 ; N greater ; B 40 -10 529 474 ;
XC 63 ; WX 611 ; N question ; B 64 0 556 744 ;
XC 64 ; WX 975 ; N at ; B 27 -136 947 746 ;


XC 65 ; WX 722 ; N A ; B 26 0 703 729 ;

XC 66 ; WX 722 ; N B ; B 82 0 666 729 ;
XC 67 ; WX 722 ; N C ; B 44 -23 685 741 ;
XC 68 ; WX 722 ; N D ; B 77 0 681 729 ;
XC 69 ; WX 667 ; N E ; B 79 0 624 729 ;
XC 70 ; WX 611 ; N F ; B 74 0 586 729 ;
XC 71 ; WX 778 ; N G ; B 42 -24 711 741 ;
XC 72 ; WX 722 ; N H ; B 68 0 657 729 ;
XC 73 ; WX 278 ; N I ; B 63 0 213 729 ;
XC 74 ; WX 556 ; N J ; B 24 -23 486 729 ;
XC 75 ; WX 722 ; N K ; B 74 0 717 729 ;
XC 76 ; WX 611 ; N L ; B 80 0 579 729 ;
XC 77 ; WX 833 ; N M ; B 66 0 776 729 ;
XC 78 ; WX 722 ; N N ; B 68 0 661 729 ;
XC 79 ; WX 778 ; N O ; B 40 -23 742 741 ;
XC 80 ; WX 667 ; N P ; B 76 0 633 729 ;
XC 81 ; WX 778 ; N Q ; B 43 -54 745 741 ;
XC 82 ; WX 722 ; N R ; B 80 0 677 729 ;
XC 83 ; WX 667 ; N S ; B 32 -23 633 741 ;
XC 84 ; WX 611 ; N T ; B 14 0 598 729 ;
XC 85 ; WX 722 ; N U ; B 76 -23 654 729 ;
XC 86 ; WX 667 ; N V ; B 24 0 647 729 ;
XC 87 ; WX 944 ; N W ; B 13 0 932 729 ;
XC 88 ; WX 667 ; N X ; B 22 0 653 729 ;
XC 89 ; WX 667 ; N Y ; B 27 0 650 729 ;
XC 90 ; WX 611 ; N Z ; B 30 0 578 729 ;
XC 91 ; WX 333 ; N bracketleft ; B 66 -202 308 729 ;
XC 92 ; WX 278 ; N backslash ; B -12 -21 289 708 ;
XC 93 ; WX 333 ; N bracketright ; B 18 -202 260 729 ;
XC 94 ; WX 584 ; N asciicircum ; B 61 271 522 696 ;
XC 95 ; WX 556 ; N underscore ; B -22 -200 578 -130 ;
XC 96 ; WX 278 ; N quoteleft ; B 67 469 202 729 ;
XC 97 ; WX 556 ; N a ; B 27 -24 524 551 ;
XC 98 ; WX 611 ; N b ; B 59 -23 575 729 ;
XC 99 ; WX 556 ; N c ; B 34 -23 522 551 ;
XC 100 ; WX 611 ; N d ; B 29 -23 545 729 ;
XC 101 ; WX 556 ; N e ; B 22 -23 525 551 ;
XC 102 ; WX 333 ; N f ; B 14 0 313 729 ; L i fi ; L l fl ;
XC 103 ; WX 611 ; N g ; B 34 -220 541 551 ;
XC 104 ; WX 611 ; N h ; B 67 0 541 729 ;
XC 105 ; WX 278 ; N i ; B 67 0 207 729 ;
XC 106 ; WX 278 ; N j ; B 4 -219 210 729 ;
XC 107 ; WX 556 ; N k ; B 59 0 548 729 ;
XC 108 ; WX 278 ; N l ; B 67 0 207 729 ;
XC 109 ; WX 889 ; N m ; B 60 0 824 553 ;
XC 110 ; WX 611 ; N n ; B 63 0 546 551 ;
XC 111 ; WX 611 ; N o ; B 35 -23 569 551 ;
XC 112 ; WX 611 ; N p ; B 58 -219 574 551 ;
XC 113 ; WX 611 ; N q ; B 28 -219 544 551 ;
XC 114 ; WX 389 ; N r ; B 63 0 370 553 ;
XC 115 ; WX 556 ; N s ; B 29 -23 520 551 ;
XC 116 ; WX 333 ; N t ; B 14 -23 301 678 ;
XC 117 ; WX 611 ; N u ; B 58 -23 541 542 ;
XC 118 ; WX 556 ; N v ; B 14 0 536 542 ;
XC 119 ; WX 778 ; N w ; B 5 0 766 542 ;
XC 120 ; WX 556 ; N x ; B 16 0 535 542 ;
XC 121 ; WX 556 ; N y ; B 9 -219 538 542 ;
XC 122 ; WX 500 ; N z ; B 21 0 468 542 ;
XC 123 ; WX 389 ; N braceleft ; B 37 -202 317 729 ;
XC 124 ; WX 280 ; N bar ; B 100 -202 180 729 ;
XC 125 ; WX 389 ; N braceright ; B 72 -202 352 729 ;
XC 126 ; WX 584 ; N asciitilde ; B 60 144 519 322 ;
XC 161 ; WX 333 ; N exclamdown ; B 66 -187 216 542 ;
XC 162 ; WX 556 ; N cent ; B 37 -122 522 637 ;
XC 163 ; WX 556 ; N sterling ; B 31 -20 537 717 ;
XC 164 ; WX 167 ; N fraction ; B -173 -20 337 715 ;
XC 165 ; WX 556 ; N yen ; B 5 0 552 705 ;
XC 166 ; WX 556 ; N florin ; B 21 -221 535 745 ;
XC 167 ; WX 556 ; N section ; B 33 -201 518 728 ;
XC 168 ; WX 556 ; N currency ; B 26 105 530 604 ;
XC 169 ; WX 238 ; N quotesingle ; B 50 469 188 729 ;
XC 170 ; WX 500 ; N quotedblleft ; B 71 469 433 729 ;
XC 171 ; WX 556 ; N guillemotleft ; B 88 71 468 484 ;
XC 172 ; WX 333 ; N guilsinglleft ; B 83 73 250 476 ;
XC 173 ; WX 333 ; N guilsinglright ; B 80 73 247 476 ;
XC 174 ; WX 611 ; N fi ; B 9 0 548 729 ;
XC 175 ; WX 611 ; N fl ; B 12 0 546 729 ;
XC 177 ; WX 556 ; N endash ; B -9 208 557 313 ;
XC 178 ; WX 556 ; N dagger ; B 31 -195 523 708 ;
XC 179 ; WX 556 ; N daggerdbl ; B 28 -195 520 708 ;
XC 180 ; WX 278 ; N periodcentered ; B 64 318 188 442 ;
XC 182 ; WX 556 ; N paragraph ; B 20 -195 529 729 ;
XC 183 ; WX 350 ; N bullet ; B 50 175 300 425 ;
XC 184 ; WX 278 ; N quotesinglbase ; B 66 -135 201 125 ;
XC 185 ; WX 500 ; N quotedblbase ; B 72 -164 432 141 ;
XC 186 ; WX 500 ; N quotedblright ; B 73 469 440 729 ;
XC 187 ; WX 556 ; N guillemotright ; B 88 71 462 482 ;
XC 188 ; WX 1000 ; N ellipsis ; B 92 0 908 146 ;
XC 189 ; WX 1000 ; N perthousand ; B 11 -20 990 745 ;
XC 191 ; WX 611 ; N questiondown ; B 51 -192 544 542 ;
XC 193 ; WX 333 ; N grave ; B 17 595 213 745 ;
XC 194 ; WX 333 ; N acute ; B 121 595 317 745 ;
XC 195 ; WX 333 ; N circumflex ; B 8 598 326 745 ;
XC 196 ; WX 333 ; N tilde ; B -9 595 345 729 ;
XC 197 ; WX 333 ; N macron ; B 16 629 315 717 ;
XC 198 ; WX 333 ; N breve ; B 35 593 299 736 ;
XC 199 ; WX 333 ; N dotaccent ; B 112 607 222 729 ;
XC 200 ; WX 333 ; N dieresis ; B 18 609 314 731 ;
XC 202 ; WX 333 ; N ring ; B 77 565 257 745 ;
XC 203 ; WX 333 ; N cedilla ; B 27 -220 294 -9 ;
XC 205 ; WX 333 ; N hungarumlaut ; B -44 595 340 745 ;
XC 206 ; WX 333 ; N ogonek ; B 45 -195 268 38 ;
XC 207 ; WX 333 ; N caron ; B 9 598 327 745 ;
XC 208 ; WX 1000 ; N emdash ; B -7 208 1003 313 ;
XC 225 ; WX 1000 ; N AE ; B 1 0 966 729 ;
XC 227 ; WX 370 ; N ordfeminine ; B 31 277 329 746 ;
XC 232 ; WX 611 ; N Lslash ; B 0 0 597 729 ;
XC 233 ; WX 778 ; N Oslash ; B 31 -34 755 754 ;
XC 234 ; WX 1000 ; N OE ; B 28 -20 970 741 ;
XC 235 ; WX 365 ; N ordmasculine ; B 23 276 343 745 ;
XC 241 ; WX 889 ; N ae ; B 27 -20 857 555 ;
XC 245 ; WX 278 ; N dotlessi ; B 67 0 207 542 ;
XC 248 ; WX 278 ; N lslash ; B 0 0 252 729 ;
XC 249 ; WX 611 ; N oslash ; B 11 -34 598 561 ;
XC 250 ; WX 944 ; N oe ; B 23 -21 920 554 ;
XC 251 ; WX 611 ; N germandbls ; B 67 -16 575 730 ;
XC -1 ; WX 722 ; N Aacute ; B 26 0 703 936 ;


XC -1 ; WX 722 ; N Acircumflex ; B 26 0 703 936 ;

XC -1 ; WX 722 ; N Adieresis ; B 26 0 703 922 ;


XC -1 ; WX 722 ; N Agrave ; B 26 0 703 936 ;

XC -1 ; WX 722 ; N Aring ; B 26 0 703 936 ;
XC -1 ; WX 722 ; N Atilde ; B 26 0 703 920 ;
XC -1 ; WX 722 ; N Ccedilla ; B 44 -220 685 741 ;
XC -1 ; WX 667 ; N Eacute ; B 79 0 624 936 ;
XC -1 ; WX 667 ; N Ecircumflex ; B 79 0 624 936 ;
XC -1 ; WX 667 ; N Edieresis ; B 79 0 624 922 ;
XC -1 ; WX 667 ; N Egrave ; B 79 0 624 936 ;
XC -1 ; WX 722 ; N Eth ; B -18 0 681 729 ;
XC -1 ; WX 278 ; N Iacute ; B 63 0 290 936 ;
XC -1 ; WX 278 ; N Icircumflex ; B -19 0 299 936 ;
XC -1 ; WX 278 ; N Idieresis ; B -9 0 287 922 ;
XC -1 ; WX 278 ; N Igrave ; B -10 0 213 936 ;
XC -1 ; WX 722 ; N Ntilde ; B 68 0 661 920 ;
XC -1 ; WX 778 ; N Oacute ; B 40 -23 742 936 ;
XC -1 ; WX 778 ; N Ocircumflex ; B 40 -23 742 936 ;
XC -1 ; WX 778 ; N Odieresis ; B 40 -23 742 922 ;
XC -1 ; WX 778 ; N Ograve ; B 40 -23 742 936 ;
XC -1 ; WX 778 ; N Otilde ; B 40 -23 742 920 ;
XC -1 ; WX 667 ; N Scaron ; B 32 -23 633 936 ;
XC -1 ; WX 667 ; N Thorn ; B 76 0 633 729 ;
XC -1 ; WX 722 ; N Uacute ; B 76 -23 654 936 ;
XC -1 ; WX 722 ; N Ucircumflex ; B 76 -23 654 936 ;
XC -1 ; WX 722 ; N Udieresis ; B 76 -23 654 922 ;
XC -1 ; WX 722 ; N Ugrave ; B 76 -23 654 936 ;
XC -1 ; WX 667 ; N Yacute ; B 27 0 650 932 ;
XC -1 ; WX 667 ; N Ydieresis ; B 27 0 650 922 ;
XC -1 ; WX 611 ; N Zcaron ; B 30 0 578 936 ;
XC -1 ; WX 556 ; N aacute ; B 27 -24 524 745 ;
XC -1 ; WX 556 ; N acircumflex ; B 27 -24 524 745 ;
XC -1 ; WX 556 ; N adieresis ; B 27 -24 524 731 ;
XC -1 ; WX 556 ; N agrave ; B 27 -24 524 745 ;
XC -1 ; WX 556 ; N aring ; B 27 -24 524 745 ;
XC -1 ; WX 556 ; N atilde ; B 27 -24 524 729 ;
XC -1 ; WX 280 ; N brokenbar ; B 100 -202 180 729 ;
XC -1 ; WX 556 ; N ccedilla ; B 34 -220 522 551 ;
XC -1 ; WX 737 ; N copyright ; B -14 -20 751 745 ;
XC -1 ; WX 400 ; N degree ; B 50 425 350 725 ;


XC -1 ; WX 584 ; N divide ; B 50 -10 534 474 ;

XC -1 ; WX 556 ; N eacute ; B 22 -23 525 745 ;
XC -1 ; WX 556 ; N ecircumflex ; B 22 -23 525 745 ;
XC -1 ; WX 556 ; N edieresis ; B 22 -23 525 731 ;
XC -1 ; WX 556 ; N egrave ; B 22 -23 525 745 ;
XC -1 ; WX 611 ; N eth ; B 35 -23 569 730 ;
XC -1 ; WX 278 ; N iacute ; B 67 0 290 745 ;
XC -1 ; WX 278 ; N icircumflex ; B -19 0 299 745 ;
XC -1 ; WX 278 ; N idieresis ; B -9 0 287 731 ;
XC -1 ; WX 278 ; N igrave ; B -10 0 207 745 ;
XC -1 ; WX 584 ; N logicalnot ; B 40 121 544 412 ;
XC -1 ; WX 584 ; N minus ; B 40 174 544 290 ;
XC -1 ; WX 611 ; N mu ; B 58 -219 541 542 ;
XC -1 ; WX 584 ; N multiply ; B 50 -10 534 474 ;
XC -1 ; WX 611 ; N ntilde ; B 63 0 546 729 ;
XC -1 ; WX 611 ; N oacute ; B 35 -23 569 745 ;
XC -1 ; WX 611 ; N ocircumflex ; B 35 -23 569 745 ;
XC -1 ; WX 611 ; N odieresis ; B 35 -23 569 731 ;
XC -1 ; WX 611 ; N ograve ; B 35 -23 569 745 ;
XC -1 ; WX 834 ; N onehalf ; B 30 -20 803 715 ;
XC -1 ; WX 834 ; N onequarter ; B 30 -20 804 715 ;
XC -1 ; WX 333 ; N onesuperior ; B 46 284 247 709 ;
XC -1 ; WX 611 ; N otilde ; B 35 -23 569 729 ;
XC -1 ; WX 584 ; N plusminus ; B 40 0 544 674 ;
XC -1 ; WX 737 ; N registered ; B -14 -20 751 745 ;
XC -1 ; WX 556 ; N scaron ; B 29 -23 520 745 ;
XC -1 ; WX 611 ; N thorn ; B 58 -219 574 729 ;
XC -1 ; WX 834 ; N threequarters ; B 30 -20 804 725 ;
XC -1 ; WX 333 ; N threesuperior ; B 8 271 325 720 ;
XC -1 ; WX 1000 ; N trademark ; B 71 341 929 745 ;
XC -1 ; WX 333 ; N twosuperior ; B 9 284 324 719 ;
XC -1 ; WX 611 ; N uacute ; B 58 -23 541 745 ;
XC -1 ; WX 611 ; N ucircumflex ; B 58 -23 541 745 ;
XC -1 ; WX 611 ; N udieresis ; B 58 -23 541 731 ;
XC -1 ; WX 611 ; N ugrave ; B 58 -23 541 745 ;
XC -1 ; WX 556 ; N yacute ; B 9 -219 538 745 ;
XC -1 ; WX 556 ; N ydieresis ; B 9 -219 538 731 ;
XC -1 ; WX 500 ; N zcaron ; B 21 0 468 745 ;


XEndCharMetrics
XStartKernData
XStartKernPairs 101
X

XKPX A y -37
XKPX A w -18
XKPX A v -37
XKPX A space -37
XKPX A quoteright -55
XKPX A Y -92
XKPX A W -55


XKPX A V -74
XKPX A T -74
X
XKPX F period -111
XKPX F comma -111
XKPX F A -55
X
XKPX L y -37

XKPX L space -18
XKPX L quoteright -55
XKPX L Y -92

XKPX L W -55


XKPX L V -74
XKPX L T -74
X
XKPX P space -18
XKPX P period -129
XKPX P comma -129
XKPX P A -74
X

XKPX R Y -37
XKPX R W -18
XKPX R V -18

X
XKPX T y -74
XKPX T w -74
XKPX T u -74

XKPX T semicolon -111
XKPX T s -74
XKPX T r -55
XKPX T period -111


XKPX T o -74
XKPX T i -18
XKPX T hyphen -55
XKPX T e -74

XKPX T comma -111
XKPX T colon -111

XKPX T c -74
XKPX T a -74

XKPX T O -18
XKPX T A -74
X
XKPX V y -37
XKPX V u -37

XKPX V semicolon -55
XKPX V r -55
XKPX V period -92
XKPX V o -74


XKPX V i -18
XKPX V hyphen -55
XKPX V e -55
XKPX V comma -92

XKPX V colon -55
XKPX V a -55


XKPX V A -74
X

XKPX W y -18


XKPX W u -18
XKPX W semicolon -18
XKPX W r -18
XKPX W period -55
XKPX W o -18

XKPX W i -9
XKPX W hyphen -20


XKPX W e -18
XKPX W comma -55
XKPX W colon -18
XKPX W a -37

XKPX W A -55


X
XKPX Y v -55
XKPX Y u -55
XKPX Y space -18

XKPX Y semicolon -74
XKPX Y q -74
XKPX Y period -111
XKPX Y p -55
XKPX Y o -74
XKPX Y i -37
XKPX Y hyphen -55


XKPX Y e -55
XKPX Y comma -111

XKPX Y colon -74
XKPX Y a -55
XKPX Y A -92


X
XKPX f quoteright 18

X
XKPX one one -55

X
XKPX quoteleft quoteleft -37
X
XKPX quoteright space -55

XKPX quoteright s -37


XKPX quoteright quoteright -37
X
XKPX r quoteright 37

XKPX r period -55
XKPX r comma -55
X
XKPX space Y -18

XKPX space A -37
X
XKPX v period -74
XKPX v comma -74
X

XKPX w period -37
XKPX w comma -37
X

XKPX y period -74
XKPX y comma -74
XEndKernPairs
XEndKernData
XStartComposites 58

XCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 139 191 ;


XCC zcaron 2 ; PCC z 0 0 ; PCC caron 83 0 ;

XCC Scaron 2 ; PCC S 0 0 ; PCC caron 167 191 ;
XCC scaron 2 ; PCC s 0 0 ; PCC caron 111 0 ;


XCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 207 0 ;

XCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 117 0 ;
XCC Yacute 2 ; PCC Y 0 0 ; PCC acute 167 187 ;
XCC yacute 2 ; PCC y 0 0 ; PCC acute 111 0 ;
XCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 167 191 ;
XCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 111 0 ;
XCC Uacute 2 ; PCC U 0 0 ; PCC acute 197 191 ;
XCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 197 191 ;
XCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 197 191 ;
XCC Ugrave 2 ; PCC U 0 0 ; PCC grave 197 191 ;
XCC uacute 2 ; PCC u 0 0 ; PCC acute 139 0 ;
XCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 139 0 ;
XCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 139 0 ;
XCC ugrave 2 ; PCC u 0 0 ; PCC grave 139 0 ;
XCC Iacute 2 ; PCC I 0 0 ; PCC acute -27 191 ;
XCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex -27 191 ;
XCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis -27 191 ;
XCC Igrave 2 ; PCC I 0 0 ; PCC grave -27 191 ;


XCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -27 0 ;
XCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -27 0 ;
XCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -27 0 ;
XCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -27 0 ;

XCC Eacute 2 ; PCC E 0 0 ; PCC acute 188 191 ;
XCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 188 191 ;
XCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 188 191 ;
XCC Egrave 2 ; PCC E 0 0 ; PCC grave 188 191 ;


XCC eacute 2 ; PCC e 0 0 ; PCC acute 111 0 ;
XCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 111 0 ;
XCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 111 0 ;
XCC egrave 2 ; PCC e 0 0 ; PCC grave 111 0 ;

XCC Aacute 2 ; PCC A 0 0 ; PCC acute 197 191 ;
XCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 197 191 ;
XCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 197 191 ;
XCC Agrave 2 ; PCC A 0 0 ; PCC grave 197 191 ;


XCC aacute 2 ; PCC a 0 0 ; PCC acute 111 0 ;
XCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 111 0 ;
XCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 111 0 ;
XCC agrave 2 ; PCC a 0 0 ; PCC grave 111 0 ;

XCC Oacute 2 ; PCC O 0 0 ; PCC acute 222 191 ;
XCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 222 191 ;
XCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 222 191 ;
XCC Ograve 2 ; PCC O 0 0 ; PCC grave 222 191 ;
XCC oacute 2 ; PCC o 0 0 ; PCC acute 139 0 ;
XCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 139 0 ;
XCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 139 0 ;
XCC ograve 2 ; PCC o 0 0 ; PCC grave 139 0 ;
XCC Atilde 2 ; PCC A 0 0 ; PCC tilde 197 191 ;


XCC atilde 2 ; PCC a 0 0 ; PCC tilde 111 0 ;

XCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 200 191 ;
XCC ntilde 2 ; PCC n 0 0 ; PCC tilde 146 0 ;
XCC Otilde 2 ; PCC O 0 0 ; PCC tilde 222 191 ;
XCC otilde 2 ; PCC o 0 0 ; PCC tilde 139 0 ;
XCC Aring 2 ; PCC A 0 0 ; PCC ring 197 191 ;


XCC aring 2 ; PCC a 0 0 ; PCC ring 111 0 ;
XEndComposites
XEndFontMetrics
END_OF_FILE

if test 15443 -ne `wc -c <'lout/font0/HelveBol.AFM'`; then
echo shar: \"'lout/font0/HelveBol.AFM'\" unpacked with wrong size!
fi
# end of 'lout/font0/HelveBol.AFM'
fi
echo shar: End of archive 20 \(of 30\).
cp /dev/null ark20isdone

Jeff Kingston

unread,
Jun 1, 1993, 11:03:46 PM6/1/93
to
Submitted-by: je...@joyce.cs.su.oz.au (Jeff Kingston)
Posting-number: Volume 37, Issue 119
Archive-name: lout/part21
Environment: UNIX

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: lout/doc/tr.lout/ch2.02 lout/font0/AvantGarBoo.AFM
# lout/font0/BookmDem.AFM lout/font0/BookmLig.AFM
# lout/font0/BookmLigIta.AFM lout/z17.c
# Wrapped by kent@sparky on Sun May 30 19:44:00 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 21 (of 30)."'
if test -f 'lout/doc/tr.lout/ch2.02' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch2.02'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch2.02'\" \(3082 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch2.02' <<'END_OF_FILE'
X@Section
X @Tag { visibility }
X @Title { Nested definitions, body parameters, and import and export }
X@Begin
X@PP
XA definition may contain
Xnested.def @Index { Nested definitions }
Xother definitions at the beginning of its body:
X@ID @Code {
X"def @NineSquare"
X" right x"
X"{"
X" def @Three { x |0.2i x |0.2i x }"
X""
X" @Three /0.2i @Three /0.2i @Three"
X"}"
X}
XA parameter like @Code x may be invoked anywhere within the body of the
Xsymbol it is a parameter of, including within nested definitions. A
Xnested symbol like @Code "@Three" may be invoked anywhere from the
Xbeginning of its own body to the end of the body of the symbol it is
Xdefined within. So, assuming an appropriate definition of
X{@Code "@Box"},
X@ID @Code {
X"@NineSquare @Box"
X}
Xhas result
X@ID @Fig {
X@NineSquare @Box { 0.2i @Wide 0.2i @High }
X}
XNested definitions may themselves contain nested definitions, to
Xarbitrary depth.
X@PP
XThere are three special features which permit a nested symbol or
Xparameter to be invoked outside its normal range; that is, outside the
Xbody of the enclosing symbol. The first and simplest of these features
Xis the {@I {body parameter}},
Xparameter.body @SubIndex { @Code body parameter }
Xbody.par @Index { @Code body parameter }
Xan alternative form of right parameter. The Eq equation formatting
Xpackage [{@Ref kingston92eq}] is a classic example of the use of a body
Xparameter. In outline, it looks like this:
X@ID @Code {
X"export \"+\" sup over"
X""
X"def @Eq"
X" body x"
X"{"
X" def \"+\" ..."
X" def sup ..."
X" def over ..."
X" ..."
X""
X" Slope @Font x"
X"}"
X}
XFirst we list those nested symbols and parameters that we intend to
Xrefer to outside the body of @Code "@Eq" in an @Code export clause,
Xexport @Index { @Code export clause }
Xpreceding the definition as shown. Only exported symbols may be
Xinvoked outside the body of {@Code "@Eq"}. A body parameter may not be
Xexported. The body parameter is like a right parameter except that the
Xexported symbols are visible within it:
X@ID @Code {
X"@Eq { {x sup 2 + y sup 2} over 2 }"
X}
Xcalls on the nested definitions of @Code "@Eq" to produce the result
X@ID {
X@Eq { {x sup 2 + y sup 2} over 2 }
X}
XThe body parameter's value must be enclosed in braces. The term `body
Xparameter' is a reminder that the value is interpreted as if it was
Xwithin the body of the symbol.
X@PP
XThe second place where exported symbols may be used is in the right
Xparameter of the @@Open symbol, and following its alternative form,
X@@Use (Section {@NumberOf open}).
X@PP
XFinally, exported nested symbols and parameters may be made visible within
Xa subsequent definition or macro by preceding it with an @Code import
Ximport @Index { @Code import clause }
Xclause, like this:
X@ID @Code {
X"import @Eq"
X"def pythag { sqrt { x sup 2 + y sup 2 } }"
X}
XNote however that @Code pythag can only be used with some invocation of
X{@Code "@Eq"}: within the body parameter of an invocation of {@Code "@Eq"},
Xwithin the right parameter of an {@Code "@Eq&&tag @Open"}, or following
Xa @@Use. There may be several symbols in the @Code import clause.
X@End @Section
END_OF_FILE
if test 3082 -ne `wc -c <'lout/doc/tr.lout/ch2.02'`; then
echo shar: \"'lout/doc/tr.lout/ch2.02'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch2.02'
fi
if test -f 'lout/font0/AvantGarBoo.AFM' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/font0/AvantGarBoo.AFM'\"
else
echo shar: Extracting \"'lout/font0/AvantGarBoo.AFM'\" \(15173 characters\)
sed "s/^X//" >'lout/font0/AvantGarBoo.AFM' <<'END_OF_FILE'


XStartFontMetrics 2.0
XComment Copyright (c) 1984 Adobe Systems Incorporated. All Rights Reserved.

XComment Creation Date:Thu Feb 5 14:33:05 PST 1987
XFontName AvantGarde-Book


XEncodingScheme AdobeStandardEncoding
XFullName ITC Avant Garde Gothic Book

XFamilyName ITC Avant Garde Gothic
XWeight Book

XItalicAngle 0.0
XIsFixedPitch false


XUnderlinePosition -96
XUnderlineThickness 58
XVersion 001.002

XNotice ITC Avant Garde Gothic is a registered trademark of International Typeface Corporation.
XFontBBox -115 -223 1151 989


XCapHeight 739
XXHeight 547
XDescender -192
XAscender 739
XStartCharMetrics 228
XC 32 ; WX 277 ; N space ; B 0 0 0 0 ;

XC 33 ; WX 295 ; N exclam ; B 111 0 185 739 ;
XC 34 ; WX 309 ; N quotedbl ; B 74 513 237 739 ;
XC 35 ; WX 554 ; N numbersign ; B 5 0 549 739 ;
XC 36 ; WX 554 ; N dollar ; B 75 -54 479 808 ;
XC 37 ; WX 775 ; N percent ; B 13 -13 752 751 ;
XC 38 ; WX 757 ; N ampersand ; B 57 -13 735 751 ;
XC 39 ; WX 351 ; N quoteright ; B 91 546 253 739 ;
XC 40 ; WX 369 ; N parenleft ; B 57 -127 335 739 ;
XC 41 ; WX 369 ; N parenright ; B 34 -127 312 739 ;
XC 42 ; WX 425 ; N asterisk ; B 64 466 360 751 ;
XC 43 ; WX 606 ; N plus ; B 51 49 555 554 ;
XC 44 ; WX 277 ; N comma ; B 91 -67 253 126 ;
XC 45 ; WX 332 ; N hyphen ; B 31 267 302 334 ;
XC 46 ; WX 277 ; N period ; B 101 0 175 126 ;
XC 47 ; WX 437 ; N slash ; B 40 -128 397 739 ;
XC 48 ; WX 554 ; N zero ; B 30 -13 525 751 ;
XC 49 ; WX 554 ; N one ; B 155 0 354 739 ;
XC 50 ; WX 554 ; N two ; B 33 0 506 751 ;
XC 51 ; WX 554 ; N three ; B 33 -13 504 751 ;
XC 52 ; WX 554 ; N four ; B 12 0 527 739 ;
XC 53 ; WX 554 ; N five ; B 26 -13 528 739 ;
XC 54 ; WX 554 ; N six ; B 25 -13 529 739 ;
XC 55 ; WX 554 ; N seven ; B 64 0 490 739 ;
XC 56 ; WX 554 ; N eight ; B 42 -13 512 751 ;
XC 57 ; WX 554 ; N nine ; B 25 0 529 751 ;
XC 58 ; WX 277 ; N colon ; B 101 0 175 510 ;
XC 59 ; WX 277 ; N semicolon ; B 41 -67 203 510 ;
XC 60 ; WX 606 ; N less ; B 49 37 558 565 ;
XC 61 ; WX 606 ; N equal ; B 51 166 555 436 ;
XC 62 ; WX 606 ; N greater ; B 48 37 557 565 ;
XC 63 ; WX 591 ; N question ; B 65 0 525 751 ;
XC 64 ; WX 867 ; N at ; B 71 -12 797 752 ;


XC 65 ; WX 740 ; N A ; B 11 0 729 739 ;

XC 66 ; WX 574 ; N B ; B 76 0 544 739 ;
XC 67 ; WX 813 ; N C ; B 44 -13 770 751 ;
XC 68 ; WX 744 ; N D ; B 76 0 700 739 ;
XC 69 ; WX 536 ; N E ; B 76 0 480 739 ;
XC 70 ; WX 485 ; N F ; B 76 0 451 739 ;
XC 71 ; WX 872 ; N G ; B 44 -13 831 751 ;
XC 72 ; WX 683 ; N H ; B 76 0 607 739 ;
XC 73 ; WX 226 ; N I ; B 76 0 150 739 ;
XC 74 ; WX 482 ; N J ; B 11 -13 406 739 ;
XC 75 ; WX 591 ; N K ; B 76 0 585 739 ;
XC 76 ; WX 462 ; N L ; B 76 0 456 739 ;
XC 77 ; WX 919 ; N M ; B 76 0 843 739 ;
XC 78 ; WX 740 ; N N ; B 76 0 664 739 ;
XC 79 ; WX 869 ; N O ; B 44 -13 825 750 ;
XC 80 ; WX 592 ; N P ; B 76 0 565 739 ;
XC 81 ; WX 871 ; N Q ; B 44 -13 839 751 ;
XC 82 ; WX 607 ; N R ; B 76 0 577 739 ;
XC 83 ; WX 498 ; N S ; B 22 -13 476 751 ;
XC 84 ; WX 426 ; N T ; B 7 0 419 739 ;
XC 85 ; WX 655 ; N U ; B 76 -13 579 739 ;
XC 86 ; WX 702 ; N V ; B 10 0 692 739 ;
XC 87 ; WX 960 ; N W ; B 10 0 950 739 ;
XC 88 ; WX 609 ; N X ; B 8 0 601 739 ;
XC 89 ; WX 592 ; N Y ; B 2 0 590 739 ;
XC 90 ; WX 480 ; N Z ; B 17 0 474 739 ;
XC 91 ; WX 351 ; N bracketleft ; B 112 -127 313 739 ;
XC 92 ; WX 605 ; N backslash ; B 84 0 464 739 ;
XC 93 ; WX 351 ; N bracketright ; B 38 -127 239 739 ;
XC 94 ; WX 606 ; N asciicircum ; B 18 180 588 739 ;
XC 95 ; WX 500 ; N underscore ; B 0 -125 500 -67 ;
XC 96 ; WX 351 ; N quoteleft ; B 98 546 260 739 ;
XC 97 ; WX 683 ; N a ; B 42 -13 620 559 ;
XC 98 ; WX 682 ; N b ; B 63 -13 640 739 ;
XC 99 ; WX 647 ; N c ; B 42 -13 608 559 ;
XC 100 ; WX 685 ; N d ; B 42 -13 622 739 ;
XC 101 ; WX 650 ; N e ; B 42 -13 611 559 ;
XC 102 ; WX 314 ; N f ; B 16 0 311 739 ; L i fi ; L l fl ;
XC 103 ; WX 673 ; N g ; B 42 -214 610 559 ;
XC 104 ; WX 610 ; N h ; B 63 0 547 739 ;
XC 105 ; WX 200 ; N i ; B 63 0 137 739 ;
XC 106 ; WX 203 ; N j ; B -45 -192 140 739 ;
XC 107 ; WX 502 ; N k ; B 63 0 497 739 ;
XC 108 ; WX 200 ; N l ; B 63 0 137 739 ;
XC 109 ; WX 938 ; N m ; B 63 0 875 559 ;
XC 110 ; WX 610 ; N n ; B 63 0 547 559 ;
XC 111 ; WX 655 ; N o ; B 42 -13 613 559 ;
XC 112 ; WX 682 ; N p ; B 63 -192 640 559 ;
XC 113 ; WX 682 ; N q ; B 42 -192 619 559 ;
XC 114 ; WX 301 ; N r ; B 63 0 292 559 ;
XC 115 ; WX 388 ; N s ; B 18 -13 361 559 ;
XC 116 ; WX 339 ; N t ; B 12 0 327 739 ;
XC 117 ; WX 608 ; N u ; B 63 -13 545 547 ;
XC 118 ; WX 554 ; N v ; B 8 0 546 547 ;
XC 119 ; WX 831 ; N w ; B 7 0 824 547 ;
XC 120 ; WX 480 ; N x ; B 8 0 472 547 ;
XC 121 ; WX 536 ; N y ; B 9 -192 527 547 ;
XC 122 ; WX 425 ; N z ; B 10 0 415 547 ;
XC 123 ; WX 351 ; N braceleft ; B 37 -127 271 739 ;
XC 124 ; WX 672 ; N bar ; B 304 0 368 739 ;
XC 125 ; WX 351 ; N braceright ; B 38 -127 269 739 ;
XC 126 ; WX 606 ; N asciitilde ; B 51 212 555 391 ;
XC 161 ; WX 295 ; N exclamdown ; B 111 -192 185 547 ;
XC 162 ; WX 554 ; N cent ; B 45 62 509 705 ;
XC 163 ; WX 554 ; N sterling ; B 18 0 592 751 ;
XC 164 ; WX 166 ; N fraction ; B -115 0 281 739 ;
XC 165 ; WX 554 ; N yen ; B 0 0 589 739 ;
XC 166 ; WX 554 ; N florin ; B 18 -214 546 751 ;
XC 167 ; WX 615 ; N section ; B 87 -139 529 751 ;
XC 168 ; WX 554 ; N currency ; B 26 50 528 553 ;
XC 169 ; WX 198 ; N quotesingle ; B 74 513 124 739 ;
XC 170 ; WX 502 ; N quotedblleft ; B 96 546 406 739 ;
XC 171 ; WX 425 ; N guillemotleft ; B 40 101 385 500 ;
XC 172 ; WX 251 ; N guilsinglleft ; B 40 101 211 500 ;
XC 173 ; WX 251 ; N guilsinglright ; B 40 101 211 500 ;
XC 174 ; WX 487 ; N fi ; B 13 0 424 739 ;
XC 175 ; WX 485 ; N fl ; B 13 0 422 739 ;
XC 177 ; WX 500 ; N endash ; B 0 267 500 334 ;
XC 178 ; WX 553 ; N dagger ; B 59 -127 494 739 ;
XC 179 ; WX 553 ; N daggerdbl ; B 59 -128 494 739 ;
XC 180 ; WX 277 ; N periodcentered ; B 101 238 175 364 ;
XC 182 ; WX 564 ; N paragraph ; B 37 -127 491 739 ;
XC 183 ; WX 606 ; N bullet ; B 118 116 488 486 ;
XC 184 ; WX 354 ; N quotesinglbase ; B 89 -67 251 126 ;
XC 185 ; WX 502 ; N quotedblbase ; B 89 -67 398 126 ;
XC 186 ; WX 484 ; N quotedblright ; B 87 546 393 739 ;
XC 187 ; WX 425 ; N guillemotright ; B 40 101 385 500 ;
XC 188 ; WX 1000 ; N ellipsis ; B 130 0 870 126 ;
XC 189 ; WX 1174 ; N perthousand ; B 13 -13 1151 751 ;
XC 191 ; WX 591 ; N questiondown ; B 66 -214 526 547 ;
XC 193 ; WX 378 ; N grave ; B 74 613 304 779 ;
XC 194 ; WX 375 ; N acute ; B 74 613 301 785 ;
XC 195 ; WX 502 ; N circumflex ; B 74 613 428 739 ;
XC 196 ; WX 439 ; N tilde ; B 75 613 365 715 ;
XC 197 ; WX 485 ; N macron ; B 74 613 411 680 ;
XC 198 ; WX 453 ; N breve ; B 74 613 378 716 ;
XC 199 ; WX 222 ; N dotaccent ; B 74 613 148 739 ;
XC 200 ; WX 369 ; N dieresis ; B 74 613 295 739 ;
XC 202 ; WX 332 ; N ring ; B 74 613 258 797 ;
XC 203 ; WX 324 ; N cedilla ; B 74 -223 250 0 ;
XC 205 ; WX 552 ; N hungarumlaut ; B 74 613 479 785 ;
XC 206 ; WX 302 ; N ogonek ; B 74 -190 228 0 ;
XC 207 ; WX 502 ; N caron ; B 74 613 428 739 ;
XC 208 ; WX 1000 ; N emdash ; B 0 267 1000 334 ;
XC 225 ; WX 992 ; N AE ; B 11 0 936 739 ;
XC 227 ; WX 369 ; N ordfeminine ; B 31 325 339 751 ;
XC 232 ; WX 517 ; N Lslash ; B 26 0 502 739 ;
XC 233 ; WX 868 ; N Oslash ; B 44 -83 824 821 ;
XC 234 ; WX 1194 ; N OE ; B 44 -13 1138 751 ;
XC 235 ; WX 369 ; N ordmasculine ; B 32 325 337 751 ;
XC 241 ; WX 1157 ; N ae ; B 42 -13 1118 559 ;
XC 245 ; WX 200 ; N dotlessi ; B 63 0 137 547 ;
XC 248 ; WX 300 ; N lslash ; B 36 0 270 739 ;
XC 249 ; WX 653 ; N oslash ; B 42 -45 611 594 ;
XC 250 ; WX 1137 ; N oe ; B 42 -13 1098 559 ;
XC 251 ; WX 554 ; N germandbls ; B 59 -13 524 751 ;


XC -1 ; WX 740 ; N Aacute ; B 11 0 729 977 ;
XC -1 ; WX 740 ; N Acircumflex ; B 11 0 729 931 ;
XC -1 ; WX 740 ; N Adieresis ; B 11 0 729 931 ;
XC -1 ; WX 740 ; N Agrave ; B 11 0 729 971 ;
XC -1 ; WX 740 ; N Aring ; B 11 0 729 989 ;
XC -1 ; WX 740 ; N Atilde ; B 11 0 729 907 ;

XC -1 ; WX 813 ; N Ccedilla ; B 44 -223 770 751 ;
XC -1 ; WX 536 ; N Eacute ; B 76 0 480 977 ;
XC -1 ; WX 536 ; N Ecircumflex ; B 76 0 480 931 ;
XC -1 ; WX 536 ; N Edieresis ; B 76 0 480 931 ;
XC -1 ; WX 536 ; N Egrave ; B 76 0 480 971 ;
XC -1 ; WX 790 ; N Eth ; B 26 0 746 739 ;
XC -1 ; WX 226 ; N Iacute ; B 0 0 227 977 ;
XC -1 ; WX 226 ; N Icircumflex ; B -64 0 290 931 ;
XC -1 ; WX 226 ; N Idieresis ; B 3 0 224 931 ;
XC -1 ; WX 226 ; N Igrave ; B -2 0 228 971 ;
XC -1 ; WX 740 ; N Ntilde ; B 76 0 664 907 ;
XC -1 ; WX 869 ; N Oacute ; B 44 -13 825 977 ;
XC -1 ; WX 869 ; N Ocircumflex ; B 44 -13 825 931 ;
XC -1 ; WX 869 ; N Odieresis ; B 44 -13 825 931 ;
XC -1 ; WX 869 ; N Ograve ; B 44 -13 825 971 ;
XC -1 ; WX 869 ; N Otilde ; B 44 -13 825 907 ;
XC -1 ; WX 498 ; N Scaron ; B 22 -13 476 931 ;
XC -1 ; WX 592 ; N Thorn ; B 76 0 565 739 ;
XC -1 ; WX 655 ; N Uacute ; B 76 -13 579 977 ;
XC -1 ; WX 655 ; N Ucircumflex ; B 76 -13 579 931 ;
XC -1 ; WX 655 ; N Udieresis ; B 76 -13 579 931 ;
XC -1 ; WX 655 ; N Ugrave ; B 76 -13 579 971 ;
XC -1 ; WX 592 ; N Yacute ; B 2 0 590 977 ;
XC -1 ; WX 592 ; N Ydieresis ; B 2 0 590 931 ;
XC -1 ; WX 480 ; N Zcaron ; B 17 0 474 931 ;
XC -1 ; WX 683 ; N aacute ; B 42 -13 620 785 ;
XC -1 ; WX 683 ; N acircumflex ; B 42 -13 620 739 ;
XC -1 ; WX 683 ; N adieresis ; B 42 -13 620 739 ;
XC -1 ; WX 683 ; N agrave ; B 42 -13 620 779 ;
XC -1 ; WX 683 ; N aring ; B 42 -13 620 797 ;
XC -1 ; WX 683 ; N atilde ; B 42 -13 620 715 ;
XC -1 ; WX 672 ; N brokenbar ; B 304 0 368 739 ;
XC -1 ; WX 647 ; N ccedilla ; B 42 -223 608 559 ;
XC -1 ; WX 747 ; N copyright ; B -9 -13 755 751 ;


XC -1 ; WX 400 ; N degree ; B 50 439 350 739 ;

XC -1 ; WX 606 ; N divide ; B 51 49 555 553 ;
XC -1 ; WX 650 ; N eacute ; B 42 -13 611 785 ;
XC -1 ; WX 650 ; N ecircumflex ; B 42 -13 611 739 ;
XC -1 ; WX 650 ; N edieresis ; B 42 -13 611 739 ;
XC -1 ; WX 650 ; N egrave ; B 42 -13 611 779 ;
XC -1 ; WX 655 ; N eth ; B 42 -13 613 758 ;
XC -1 ; WX 200 ; N iacute ; B -13 0 214 785 ;
XC -1 ; WX 200 ; N icircumflex ; B -77 0 277 739 ;
XC -1 ; WX 200 ; N idieresis ; B -10 0 211 739 ;
XC -1 ; WX 200 ; N igrave ; B -15 0 215 779 ;
XC -1 ; WX 606 ; N logicalnot ; B 51 166 555 436 ;
XC -1 ; WX 606 ; N minus ; B 51 263 555 339 ;
XC -1 ; WX 608 ; N mu ; B 63 -192 545 547 ;
XC -1 ; WX 606 ; N multiply ; B 51 51 555 555 ;
XC -1 ; WX 610 ; N ntilde ; B 63 0 547 715 ;
XC -1 ; WX 655 ; N oacute ; B 42 -13 613 785 ;
XC -1 ; WX 655 ; N ocircumflex ; B 42 -13 613 739 ;
XC -1 ; WX 655 ; N odieresis ; B 42 -13 613 739 ;
XC -1 ; WX 655 ; N ograve ; B 42 -13 613 779 ;
XC -1 ; WX 831 ; N onehalf ; B 96 0 814 739 ;
XC -1 ; WX 831 ; N onequarter ; B 101 0 803 739 ;
XC -1 ; WX 332 ; N onesuperior ; B 98 296 233 739 ;
XC -1 ; WX 655 ; N otilde ; B 42 -13 613 715 ;
XC -1 ; WX 606 ; N plusminus ; B 51 0 555 554 ;
XC -1 ; WX 747 ; N registered ; B -9 -13 755 751 ;
XC -1 ; WX 388 ; N scaron ; B 17 -13 371 739 ;
XC -1 ; WX 682 ; N thorn ; B 63 -192 640 739 ;
XC -1 ; WX 831 ; N threequarters ; B 13 0 803 747 ;
XC -1 ; WX 332 ; N threesuperior ; B 13 289 319 747 ;
XC -1 ; WX 1000 ; N trademark ; B 63 318 938 739 ;
XC -1 ; WX 332 ; N twosuperior ; B 12 296 320 746 ;
XC -1 ; WX 608 ; N uacute ; B 63 -13 545 785 ;
XC -1 ; WX 608 ; N ucircumflex ; B 63 -13 545 739 ;
XC -1 ; WX 608 ; N udieresis ; B 63 -13 545 739 ;
XC -1 ; WX 608 ; N ugrave ; B 63 -13 545 779 ;
XC -1 ; WX 536 ; N yacute ; B 9 -192 527 785 ;
XC -1 ; WX 536 ; N ydieresis ; B 9 -192 527 739 ;
XC -1 ; WX 425 ; N zcaron ; B 10 0 415 739 ;


XEndCharMetrics
XStartKernData
XStartKernPairs 93
X
XKPX A y -72
XKPX A w -65
XKPX A v -73
XKPX A Y -122

XKPX A W -95

XKPX T u -46


XKPX T semicolon -29
XKPX T s -23

XKPX T r -30


XKPX T period -71
XKPX T o -49

XKPX T i 31


XKPX T hyphen 0
XKPX T e -49
XKPX T comma -102
XKPX T colon 3
XKPX T c -51
XKPX T a -52

XKPX T A -81


X
XKPX V y -25
XKPX V u -40
XKPX V semicolon -33

XKPX V r -40
XKPX V period -75
XKPX V o -101
XKPX V i 5
XKPX V hyphen 0
XKPX V e -101


XKPX V comma -106
XKPX V colon -1

XKPX V a -104


XKPX V A -122
X
XKPX W y -2
XKPX W u -30
XKPX W r -29
XKPX W o -46

XKPX W i 6


XKPX W e -47
XKPX W a -50
XKPX W semicolon -33
XKPX W period -74
XKPX W hyphen 0
XKPX W comma -106
XKPX W colon -1
XKPX W A -73
X
XKPX Y v -17

XKPX Y u -69
XKPX Y semicolon -23
XKPX Y q -93
XKPX Y period -65


XKPX Y p -67
XKPX Y o -89
XKPX Y i 13
XKPX Y hyphen 0
XKPX Y e -89

XKPX Y comma -97
XKPX Y colon 9


XKPX Y a -93
XKPX Y A -122
X
XKPX f f 3
X
XKPX r q -8
XKPX r period -73
XKPX r o -4

XKPX r n 21
XKPX r m 28

if test 15173 -ne `wc -c <'lout/font0/AvantGarBoo.AFM'`; then
echo shar: \"'lout/font0/AvantGarBoo.AFM'\" unpacked with wrong size!
fi
# end of 'lout/font0/AvantGarBoo.AFM'
fi
if test -f 'lout/font0/BookmDem.AFM' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/font0/BookmDem.AFM'\"
else
echo shar: Extracting \"'lout/font0/BookmDem.AFM'\" \(15128 characters\)
sed "s/^X//" >'lout/font0/BookmDem.AFM' <<'END_OF_FILE'


XStartFontMetrics 2.0
XComment Copyright (c) 1984 Adobe Systems Incorporated. All Rights Reserved.

XComment Creation Date:Sat Feb 7 20:12:52 PST 1987
XFontName Bookman-Demi


XEncodingScheme AdobeStandardEncoding
XFullName ITC Bookman Demi

XFamilyName ITC Bookman
XWeight Demi

XItalicAngle 0.0
XIsFixedPitch false


XUnderlinePosition -125
XUnderlineThickness 60
XVersion 001.001

XNotice ITC Bookman is a registered trademark of International Typeface Corporation.
XFontBBox -194 -243 1346 934
XCapHeight 681
XXHeight 502
XDescender -212
XAscender 725
XStartCharMetrics 228
XC 32 ; WX 340 ; N space ; B 0 0 0 0 ;
XC 33 ; WX 360 ; N exclam ; B 82 -8 282 698 ;
XC 34 ; WX 420 ; N quotedbl ; B 11 379 369 698 ;
XC 35 ; WX 660 ; N numbersign ; B 84 0 576 681 ;
XC 36 ; WX 660 ; N dollar ; B 48 -119 620 805 ;
XC 37 ; WX 940 ; N percent ; B 12 -8 924 698 ;
XC 38 ; WX 800 ; N ampersand ; B 21 -17 772 698 ;
XC 39 ; WX 320 ; N quoteright ; B 82 440 242 698 ;
XC 40 ; WX 320 ; N parenleft ; B 48 -150 289 749 ;
XC 41 ; WX 320 ; N parenright ; B 20 -150 262 749 ;
XC 42 ; WX 460 ; N asterisk ; B 62 317 405 697 ;
XC 43 ; WX 600 ; N plus ; B 51 9 555 514 ;
XC 44 ; WX 340 ; N comma ; B 78 -124 257 162 ;
XC 45 ; WX 360 ; N hyphen ; B 20 210 340 318 ;
XC 46 ; WX 340 ; N period ; B 76 -8 258 172 ;
XC 47 ; WX 600 ; N slash ; B 50 -149 555 725 ;
XC 48 ; WX 660 ; N zero ; B 30 -17 639 698 ;
XC 49 ; WX 660 ; N one ; B 137 0 568 681 ;
XC 50 ; WX 660 ; N two ; B 41 0 628 698 ;
XC 51 ; WX 660 ; N three ; B 37 -17 631 698 ;
XC 52 ; WX 660 ; N four ; B 19 0 649 681 ;
XC 53 ; WX 660 ; N five ; B 44 -17 623 723 ;
XC 54 ; WX 660 ; N six ; B 34 -17 634 698 ;
XC 55 ; WX 660 ; N seven ; B 36 0 632 681 ;
XC 56 ; WX 660 ; N eight ; B 36 -17 633 698 ;
XC 57 ; WX 660 ; N nine ; B 33 -17 636 698 ;
XC 58 ; WX 340 ; N colon ; B 76 -8 258 515 ;
XC 59 ; WX 340 ; N semicolon ; B 75 -124 259 515 ;
XC 60 ; WX 600 ; N less ; B 49 -9 558 542 ;
XC 61 ; WX 600 ; N equal ; B 51 109 555 421 ;
XC 62 ; WX 600 ; N greater ; B 48 -9 557 542 ;
XC 63 ; WX 660 ; N question ; B 61 -8 608 698 ;
XC 64 ; WX 820 ; N at ; B 60 -17 758 698 ;
XC 65 ; WX 720 ; N A ; B -34 0 763 681 ;
XC 66 ; WX 720 ; N B ; B 20 0 693 681 ;
XC 67 ; WX 740 ; N C ; B 35 -17 724 698 ;
XC 68 ; WX 780 ; N D ; B 20 0 748 681 ;
XC 69 ; WX 720 ; N E ; B 20 0 724 681 ;
XC 70 ; WX 680 ; N F ; B 20 0 686 681 ;
XC 71 ; WX 780 ; N G ; B 35 -17 773 698 ;
XC 72 ; WX 820 ; N H ; B 20 0 800 681 ;
XC 73 ; WX 400 ; N I ; B 20 0 379 681 ;
XC 74 ; WX 640 ; N J ; B -12 -17 622 681 ;
XC 75 ; WX 800 ; N K ; B 20 0 796 681 ;
XC 76 ; WX 640 ; N L ; B 20 0 668 681 ;
XC 77 ; WX 940 ; N M ; B 20 0 924 681 ;
XC 78 ; WX 740 ; N N ; B 20 0 724 681 ;
XC 79 ; WX 800 ; N O ; B 35 -17 769 698 ;
XC 80 ; WX 660 ; N P ; B 20 0 658 681 ;
XC 81 ; WX 800 ; N Q ; B 35 -226 775 698 ;
XC 82 ; WX 780 ; N R ; B 20 0 783 681 ;
XC 83 ; WX 660 ; N S ; B 21 -17 639 698 ;
XC 84 ; WX 700 ; N T ; B -4 0 703 681 ;
XC 85 ; WX 740 ; N U ; B 15 -17 724 681 ;
XC 86 ; WX 720 ; N V ; B -20 0 730 681 ;
XC 87 ; WX 940 ; N W ; B -20 0 963 681 ;
XC 88 ; WX 780 ; N X ; B 1 0 770 681 ;
XC 89 ; WX 700 ; N Y ; B -20 0 718 681 ;
XC 90 ; WX 640 ; N Z ; B 6 0 635 681 ;
XC 91 ; WX 300 ; N bracketleft ; B 75 -138 285 725 ;
XC 92 ; WX 600 ; N backslash ; B 50 0 555 725 ;
XC 93 ; WX 300 ; N bracketright ; B 21 -138 231 725 ;
XC 94 ; WX 600 ; N asciicircum ; B 52 281 554 681 ;


XC 95 ; WX 500 ; N underscore ; B 0 -155 500 -95 ;

XC 96 ; WX 320 ; N quoteleft ; B 82 440 242 698 ;
XC 97 ; WX 580 ; N a ; B 28 -8 588 515 ;
XC 98 ; WX 600 ; N b ; B -20 -8 568 725 ;
XC 99 ; WX 580 ; N c ; B 31 -8 550 515 ;
XC 100 ; WX 640 ; N d ; B 31 -8 622 725 ;
XC 101 ; WX 580 ; N e ; B 31 -8 548 515 ;
XC 102 ; WX 380 ; N f ; B 22 0 461 741 ; L i fi ; L l fl ;
XC 103 ; WX 580 ; N g ; B 9 -243 583 595 ;
XC 104 ; WX 680 ; N h ; B 22 0 654 725 ;
XC 105 ; WX 360 ; N i ; B 22 0 335 729 ;
XC 106 ; WX 340 ; N j ; B -94 -221 278 729 ;
XC 107 ; WX 660 ; N k ; B 22 0 643 725 ;
XC 108 ; WX 340 ; N l ; B 9 0 322 725 ;
XC 109 ; WX 1000 ; N m ; B 22 0 980 515 ;
XC 110 ; WX 680 ; N n ; B 22 0 652 515 ;
XC 111 ; WX 620 ; N o ; B 31 -8 585 515 ;
XC 112 ; WX 640 ; N p ; B 22 -212 611 515 ;
XC 113 ; WX 620 ; N q ; B 31 -212 633 515 ;
XC 114 ; WX 460 ; N r ; B 22 0 462 502 ;
XC 115 ; WX 520 ; N s ; B 22 -8 492 515 ;
XC 116 ; WX 460 ; N t ; B 22 -8 445 660 ;
XC 117 ; WX 660 ; N u ; B 22 -8 653 502 ;
XC 118 ; WX 600 ; N v ; B -6 0 593 502 ;
XC 119 ; WX 800 ; N w ; B -6 0 810 502 ;
XC 120 ; WX 600 ; N x ; B 8 0 591 502 ;
XC 121 ; WX 620 ; N y ; B 6 -221 613 502 ;
XC 122 ; WX 560 ; N z ; B 22 0 547 502 ;
XC 123 ; WX 320 ; N braceleft ; B 34 -139 280 726 ;
XC 124 ; WX 600 ; N bar ; B 243 0 362 725 ;
XC 125 ; WX 320 ; N braceright ; B 35 -139 280 726 ;
XC 126 ; WX 600 ; N asciitilde ; B 51 162 555 368 ;
XC 161 ; WX 360 ; N exclamdown ; B 84 -191 284 515 ;
XC 162 ; WX 660 ; N cent ; B 133 17 535 674 ;
XC 163 ; WX 660 ; N sterling ; B 10 -17 659 698 ;
XC 164 ; WX 120 ; N fraction ; B -194 0 312 681 ;
XC 165 ; WX 660 ; N yen ; B -28 0 696 681 ;
XC 166 ; WX 660 ; N florin ; B -46 -209 674 749 ;
XC 167 ; WX 600 ; N section ; B 36 -153 560 698 ;
XC 168 ; WX 660 ; N currency ; B 77 88 584 593 ;
XC 169 ; WX 240 ; N quotesingle ; B 42 379 178 698 ;
XC 170 ; WX 540 ; N quotedblleft ; B 82 439 449 698 ;
XC 171 ; WX 400 ; N guillemotleft ; B 34 101 360 457 ;
XC 172 ; WX 220 ; N guilsinglleft ; B 34 101 188 457 ;
XC 173 ; WX 220 ; N guilsinglright ; B 34 101 188 457 ;
XC 174 ; WX 740 ; N fi ; B 22 0 710 741 ;
XC 175 ; WX 740 ; N fl ; B 22 0 710 741 ;
XC 177 ; WX 500 ; N endash ; B -25 212 525 318 ;
XC 178 ; WX 440 ; N dagger ; B 33 -156 398 698 ;
XC 179 ; WX 380 ; N daggerdbl ; B 8 -156 380 698 ;
XC 180 ; WX 340 ; N periodcentered ; B 76 175 258 355 ;
XC 182 ; WX 800 ; N paragraph ; B 14 -101 757 681 ;
XC 183 ; WX 460 ; N bullet ; B 60 170 404 511 ;
XC 184 ; WX 320 ; N quotesinglbase ; B 82 -114 242 144 ;
XC 185 ; WX 540 ; N quotedblbase ; B 82 -114 450 144 ;
XC 186 ; WX 540 ; N quotedblright ; B 82 440 449 698 ;
XC 187 ; WX 400 ; N guillemotright ; B 34 101 360 457 ;
XC 188 ; WX 1000 ; N ellipsis ; B 76 -8 924 172 ;
XC 189 ; WX 1360 ; N perthousand ; B 12 -8 1346 698 ;
XC 191 ; WX 660 ; N questiondown ; B 62 -191 609 515 ;
XC 193 ; WX 400 ; N grave ; B 68 547 327 730 ;
XC 194 ; WX 400 ; N acute ; B 68 547 327 731 ;
XC 195 ; WX 500 ; N circumflex ; B 68 555 430 731 ;
XC 196 ; WX 480 ; N tilde ; B 69 556 421 691 ;
XC 197 ; WX 460 ; N macron ; B 68 577 383 663 ;
XC 198 ; WX 500 ; N breve ; B 68 553 429 722 ;
XC 199 ; WX 320 ; N dotaccent ; B 68 536 259 730 ;
XC 200 ; WX 500 ; N dieresis ; B 68 560 441 698 ;
XC 202 ; WX 340 ; N ring ; B 68 552 275 755 ;
XC 203 ; WX 360 ; N cedilla ; B 68 -213 284 0 ;
XC 205 ; WX 440 ; N hungarumlaut ; B 68 554 365 741 ;
XC 206 ; WX 320 ; N ogonek ; B 68 -163 246 0 ;
XC 207 ; WX 500 ; N caron ; B 68 541 430 717 ;
XC 208 ; WX 1000 ; N emdash ; B -25 212 1025 318 ;
XC 225 ; WX 1140 ; N AE ; B -34 0 1149 681 ;
XC 227 ; WX 400 ; N ordfeminine ; B 27 302 396 698 ;
XC 232 ; WX 640 ; N Lslash ; B 20 0 668 681 ;
XC 233 ; WX 800 ; N Oslash ; B 35 -110 771 781 ;
XC 234 ; WX 1220 ; N OE ; B 35 -17 1219 698 ;
XC 235 ; WX 400 ; N ordmasculine ; B 17 302 383 698 ;
XC 241 ; WX 880 ; N ae ; B 28 -8 852 515 ;
XC 245 ; WX 360 ; N dotlessi ; B 22 0 335 502 ;
XC 248 ; WX 340 ; N lslash ; B 9 0 322 725 ;
XC 249 ; WX 620 ; N oslash ; B 31 -40 586 551 ;
XC 250 ; WX 940 ; N oe ; B 31 -8 908 515 ;
XC 251 ; WX 660 ; N germandbls ; B -61 -91 644 699 ;
XC -1 ; WX 720 ; N Aacute ; B -34 0 763 910 ;
XC -1 ; WX 720 ; N Acircumflex ; B -34 0 763 910 ;
XC -1 ; WX 720 ; N Adieresis ; B -34 0 763 877 ;
XC -1 ; WX 720 ; N Agrave ; B -34 0 763 909 ;
XC -1 ; WX 720 ; N Aring ; B -34 0 763 934 ;
XC -1 ; WX 720 ; N Atilde ; B -34 0 763 870 ;
XC -1 ; WX 740 ; N Ccedilla ; B 35 -213 724 698 ;
XC -1 ; WX 720 ; N Eacute ; B 20 0 724 910 ;
XC -1 ; WX 720 ; N Ecircumflex ; B 20 0 724 910 ;
XC -1 ; WX 720 ; N Edieresis ; B 20 0 724 877 ;
XC -1 ; WX 720 ; N Egrave ; B 20 0 724 909 ;
XC -1 ; WX 780 ; N Eth ; B 20 0 748 681 ;
XC -1 ; WX 400 ; N Iacute ; B 20 0 379 910 ;
XC -1 ; WX 400 ; N Icircumflex ; B 18 0 380 910 ;
XC -1 ; WX 400 ; N Idieresis ; B 18 0 391 877 ;
XC -1 ; WX 400 ; N Igrave ; B 20 0 379 909 ;
XC -1 ; WX 740 ; N Ntilde ; B 20 0 724 870 ;
XC -1 ; WX 800 ; N Oacute ; B 35 -17 769 910 ;
XC -1 ; WX 800 ; N Ocircumflex ; B 35 -17 769 910 ;
XC -1 ; WX 800 ; N Odieresis ; B 35 -17 769 877 ;
XC -1 ; WX 800 ; N Ograve ; B 35 -17 769 909 ;
XC -1 ; WX 800 ; N Otilde ; B 35 -17 769 870 ;
XC -1 ; WX 660 ; N Scaron ; B 21 -17 639 896 ;
XC -1 ; WX 660 ; N Thorn ; B 20 0 658 681 ;
XC -1 ; WX 740 ; N Uacute ; B 15 -17 724 910 ;
XC -1 ; WX 740 ; N Ucircumflex ; B 15 -17 724 910 ;
XC -1 ; WX 740 ; N Udieresis ; B 15 -17 724 877 ;
XC -1 ; WX 740 ; N Ugrave ; B 15 -17 724 909 ;
XC -1 ; WX 700 ; N Yacute ; B -20 0 718 910 ;
XC -1 ; WX 700 ; N Ydieresis ; B -20 0 718 877 ;
XC -1 ; WX 640 ; N Zcaron ; B 6 0 635 896 ;
XC -1 ; WX 580 ; N aacute ; B 28 -8 588 731 ;
XC -1 ; WX 580 ; N acircumflex ; B 28 -8 588 731 ;
XC -1 ; WX 580 ; N adieresis ; B 28 -8 588 698 ;
XC -1 ; WX 580 ; N agrave ; B 28 -8 588 730 ;
XC -1 ; WX 580 ; N aring ; B 28 -8 588 755 ;
XC -1 ; WX 580 ; N atilde ; B 28 -8 588 691 ;
XC -1 ; WX 600 ; N brokenbar ; B 243 0 362 725 ;
XC -1 ; WX 580 ; N ccedilla ; B 31 -213 550 515 ;
XC -1 ; WX 740 ; N copyright ; B 23 -17 723 698 ;
XC -1 ; WX 400 ; N degree ; B 50 398 350 698 ;
XC -1 ; WX 600 ; N divide ; B 51 9 555 521 ;
XC -1 ; WX 580 ; N eacute ; B 31 -8 548 731 ;
XC -1 ; WX 580 ; N ecircumflex ; B 31 -8 548 731 ;
XC -1 ; WX 580 ; N edieresis ; B 31 -8 548 698 ;
XC -1 ; WX 580 ; N egrave ; B 31 -8 548 730 ;
XC -1 ; WX 620 ; N eth ; B 31 -8 585 741 ;
XC -1 ; WX 360 ; N iacute ; B 22 0 335 731 ;
XC -1 ; WX 360 ; N icircumflex ; B -2 0 360 731 ;
XC -1 ; WX 360 ; N idieresis ; B -2 0 371 698 ;
XC -1 ; WX 360 ; N igrave ; B 22 0 335 730 ;
XC -1 ; WX 600 ; N logicalnot ; B 51 129 555 421 ;
XC -1 ; WX 600 ; N minus ; B 51 207 555 323 ;
XC -1 ; WX 660 ; N mu ; B 22 -221 653 502 ;
XC -1 ; WX 600 ; N multiply ; B 48 11 552 515 ;
XC -1 ; WX 680 ; N ntilde ; B 22 0 652 691 ;
XC -1 ; WX 620 ; N oacute ; B 31 -8 585 731 ;
XC -1 ; WX 620 ; N ocircumflex ; B 31 -8 585 731 ;
XC -1 ; WX 620 ; N odieresis ; B 31 -8 585 698 ;
XC -1 ; WX 620 ; N ograve ; B 31 -8 585 730 ;
XC -1 ; WX 990 ; N onehalf ; B 65 0 980 681 ;
XC -1 ; WX 990 ; N onequarter ; B 65 0 967 681 ;
XC -1 ; WX 396 ; N onesuperior ; B 65 279 345 687 ;
XC -1 ; WX 620 ; N otilde ; B 31 -8 585 691 ;
XC -1 ; WX 600 ; N plusminus ; B 51 0 555 515 ;
XC -1 ; WX 740 ; N registered ; B 23 -17 723 698 ;
XC -1 ; WX 520 ; N scaron ; B 22 -8 492 717 ;
XC -1 ; WX 640 ; N thorn ; B 22 -212 611 725 ;
XC -1 ; WX 990 ; N threequarters ; B 15 0 967 692 ;
XC -1 ; WX 396 ; N threesuperior ; B 5 269 391 698 ;
XC -1 ; WX 980 ; N trademark ; B 42 277 982 681 ;
XC -1 ; WX 396 ; N twosuperior ; B 14 279 396 698 ;
XC -1 ; WX 660 ; N uacute ; B 22 -8 653 731 ;
XC -1 ; WX 660 ; N ucircumflex ; B 22 -8 653 731 ;
XC -1 ; WX 660 ; N udieresis ; B 22 -8 653 698 ;
XC -1 ; WX 660 ; N ugrave ; B 22 -8 653 730 ;
XC -1 ; WX 620 ; N yacute ; B 6 -221 613 731 ;
XC -1 ; WX 620 ; N ydieresis ; B 6 -221 613 698 ;
XC -1 ; WX 560 ; N zcaron ; B 22 0 547 717 ;


XEndCharMetrics
XStartKernData
XStartKernPairs 93
X

XKPX A y -1
XKPX A w -9
XKPX A v -8
XKPX A Y -52
XKPX A W -20
XKPX A V -68
XKPX A T -40
X
XKPX F period -132
XKPX F comma -130
XKPX F A -59
X
XKPX L y 19
XKPX L Y -35
XKPX L W -41
XKPX L V -50
XKPX L T -4
X
XKPX P period -128
XKPX P comma -129
XKPX P A -46
X
XKPX R y -8
XKPX R Y -20
XKPX R W -24
XKPX R V -29
XKPX R T -4
X
XKPX T y 0
XKPX T w 0
XKPX T u 0
XKPX T semicolon 5
XKPX T s -10
XKPX T r 27
XKPX T period -122
XKPX T o -28
XKPX T i 27
XKPX T hyphen -10
XKPX T e -29
XKPX T comma -122
XKPX T colon 7
XKPX T c -29
XKPX T a -24


XKPX T A -42
X

XKPX V y 12
XKPX V u -11
XKPX V semicolon -38
XKPX V r -15
XKPX V period -105
XKPX V o -79
XKPX V i 15
XKPX V hyphen -10
XKPX V e -80
XKPX V comma -103
XKPX V colon -37
XKPX V a -74
XKPX V A -88
X
XKPX W y 12
XKPX W u -11
XKPX W semicolon -38
XKPX W r -15
XKPX W period -105
XKPX W o -78
XKPX W i 15
XKPX W hyphen -10
XKPX W e -79
XKPX W comma -103
XKPX W colon -37
XKPX W a -73
XKPX W A -60
X
XKPX Y v 24
XKPX Y u -13
XKPX Y semicolon -34
XKPX Y q -66
XKPX Y period -105
XKPX Y p -23
XKPX Y o -66
XKPX Y i 2
XKPX Y hyphen -10
XKPX Y e -67
XKPX Y comma -103
XKPX Y colon -32
XKPX Y a -60
XKPX Y A -56
X
XKPX f f 21
X
XKPX r q -9
XKPX r period -102
XKPX r o -9
XKPX r n 20
XKPX r m 20
XKPX r hyphen -10
XKPX r h -23
XKPX r g -9
XKPX r f 20
XKPX r e -10
XKPX r d -10
XKPX r comma -101
XKPX r c -9
XEndKernPairs
XEndKernData
XStartComposites 58
XCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 70 179 ;
XCC zcaron 2 ; PCC z 0 0 ; PCC caron 30 0 ;
XCC Scaron 2 ; PCC S 0 0 ; PCC caron 80 179 ;
XCC scaron 2 ; PCC s 0 0 ; PCC caron 10 0 ;
XCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 190 0 ;
XCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 110 0 ;
XCC Yacute 2 ; PCC Y 0 0 ; PCC acute 150 179 ;
XCC yacute 2 ; PCC y 0 0 ; PCC acute 110 0 ;
XCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 100 179 ;
XCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 60 0 ;
XCC Uacute 2 ; PCC U 0 0 ; PCC acute 170 179 ;
XCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 120 179 ;
XCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 120 179 ;
XCC Ugrave 2 ; PCC U 0 0 ; PCC grave 170 179 ;
XCC uacute 2 ; PCC u 0 0 ; PCC acute 130 0 ;
XCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 80 0 ;


XCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 80 0 ;

XCC ugrave 2 ; PCC u 0 0 ; PCC grave 130 0 ;
XCC Iacute 2 ; PCC I 0 0 ; PCC acute 0 179 ;
XCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex -50 179 ;
XCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis -50 179 ;
XCC Igrave 2 ; PCC I 0 0 ; PCC grave 0 179 ;
XCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -20 0 ;
XCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -70 0 ;
XCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -70 0 ;
XCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -20 0 ;
XCC Eacute 2 ; PCC E 0 0 ; PCC acute 160 179 ;
XCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 110 179 ;
XCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 110 179 ;
XCC Egrave 2 ; PCC E 0 0 ; PCC grave 160 179 ;
XCC eacute 2 ; PCC e 0 0 ; PCC acute 90 0 ;
XCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 40 0 ;
XCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 40 0 ;


XCC egrave 2 ; PCC e 0 0 ; PCC grave 90 0 ;

XCC Aacute 2 ; PCC A 0 0 ; PCC acute 160 179 ;
XCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 110 179 ;
XCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 110 179 ;
XCC Agrave 2 ; PCC A 0 0 ; PCC grave 160 179 ;
XCC aacute 2 ; PCC a 0 0 ; PCC acute 90 0 ;
XCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 40 0 ;
XCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 40 0 ;
XCC agrave 2 ; PCC a 0 0 ; PCC grave 90 0 ;
XCC Oacute 2 ; PCC O 0 0 ; PCC acute 200 179 ;
XCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 150 179 ;
XCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 150 179 ;
XCC Ograve 2 ; PCC O 0 0 ; PCC grave 200 179 ;


XCC oacute 2 ; PCC o 0 0 ; PCC acute 110 0 ;

XCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 60 0 ;

XCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 60 0 ;


XCC ograve 2 ; PCC o 0 0 ; PCC grave 110 0 ;

XCC Atilde 2 ; PCC A 0 0 ; PCC tilde 120 179 ;
XCC atilde 2 ; PCC a 0 0 ; PCC tilde 30 0 ;
XCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 130 179 ;
XCC ntilde 2 ; PCC n 0 0 ; PCC tilde 80 0 ;
XCC Otilde 2 ; PCC O 0 0 ; PCC tilde 160 179 ;
XCC otilde 2 ; PCC o 0 0 ; PCC tilde 50 0 ;
XCC Aring 2 ; PCC A 0 0 ; PCC ring 190 179 ;
XCC aring 2 ; PCC a 0 0 ; PCC ring 100 0 ;
XEndComposites
XEndFontMetrics
END_OF_FILE
if test 15128 -ne `wc -c <'lout/font0/BookmDem.AFM'`; then
echo shar: \"'lout/font0/BookmDem.AFM'\" unpacked with wrong size!
fi
# end of 'lout/font0/BookmDem.AFM'
fi
if test -f 'lout/font0/BookmLig.AFM' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/font0/BookmLig.AFM'\"
else
echo shar: Extracting \"'lout/font0/BookmLig.AFM'\" \(15093 characters\)
sed "s/^X//" >'lout/font0/BookmLig.AFM' <<'END_OF_FILE'


XStartFontMetrics 2.0
XComment Copyright (c) 1984 Adobe Systems Incorporated. All Rights Reserved.

XComment Creation Date:Sat Feb 7 18:03:28 PST 1987
XFontName Bookman-Light
XEncodingScheme AdobeStandardEncoding
XFullName ITC Bookman Light
XFamilyName ITC Bookman
XWeight Light
XItalicAngle 0.0
XIsFixedPitch false


XUnderlinePosition -125
XUnderlineThickness 60
XVersion 001.001

XNotice ITC Bookman is a registered trademark of International Typeface Corporation.
XFontBBox -188 -251 1266 928
XCapHeight 681
XXHeight 484
XDescender -228
XAscender 717
XStartCharMetrics 228
XC 32 ; WX 320 ; N space ; B 0 0 0 0 ;
XC 33 ; WX 300 ; N exclam ; B 75 -8 219 698 ;
XC 34 ; WX 380 ; N quotedbl ; B 56 458 323 698 ;
XC 35 ; WX 620 ; N numbersign ; B 65 0 556 681 ;
XC 36 ; WX 620 ; N dollar ; B 34 -109 593 791 ;
XC 37 ; WX 900 ; N percent ; B 22 -8 873 698 ;
XC 38 ; WX 800 ; N ampersand ; B 45 -17 787 698 ;
XC 39 ; WX 220 ; N quoteright ; B 46 480 178 698 ;
XC 40 ; WX 300 ; N parenleft ; B 76 -145 278 727 ;
XC 41 ; WX 300 ; N parenright ; B 17 -146 219 727 ;
XC 42 ; WX 440 ; N asterisk ; B 54 325 391 698 ;
XC 43 ; WX 600 ; N plus ; B 51 8 555 513 ;
XC 44 ; WX 320 ; N comma ; B 90 -114 223 114 ;
XC 45 ; WX 400 ; N hyphen ; B 50 232 350 292 ;
XC 46 ; WX 320 ; N period ; B 92 -8 220 123 ;
XC 47 ; WX 600 ; N slash ; B 74 -149 532 717 ;
XC 48 ; WX 620 ; N zero ; B 40 -17 586 698 ;
XC 49 ; WX 620 ; N one ; B 160 0 501 681 ;
XC 50 ; WX 620 ; N two ; B 42 0 576 698 ;
XC 51 ; WX 620 ; N three ; B 40 -17 576 698 ;
XC 52 ; WX 620 ; N four ; B 25 0 600 681 ;
XC 53 ; WX 620 ; N five ; B 60 -17 584 717 ;
XC 54 ; WX 620 ; N six ; B 45 -17 590 698 ;
XC 55 ; WX 620 ; N seven ; B 60 0 586 681 ;
XC 56 ; WX 620 ; N eight ; B 44 -17 583 698 ;
XC 57 ; WX 620 ; N nine ; B 37 -17 576 698 ;
XC 58 ; WX 320 ; N colon ; B 92 -8 220 494 ;
XC 59 ; WX 320 ; N semicolon ; B 90 -114 223 494 ;
XC 60 ; WX 600 ; N less ; B 49 -2 558 526 ;
XC 61 ; WX 600 ; N equal ; B 51 126 555 398 ;
XC 62 ; WX 600 ; N greater ; B 48 -2 557 526 ;
XC 63 ; WX 540 ; N question ; B 27 -8 514 698 ;
XC 64 ; WX 820 ; N at ; B 55 -17 755 698 ;
XC 65 ; WX 680 ; N A ; B -37 0 714 681 ;
XC 66 ; WX 740 ; N B ; B 31 0 702 681 ;
XC 67 ; WX 740 ; N C ; B 44 -17 702 698 ;
XC 68 ; WX 800 ; N D ; B 31 0 752 681 ;
XC 69 ; WX 720 ; N E ; B 31 0 705 681 ;
XC 70 ; WX 640 ; N F ; B 31 0 654 681 ;
XC 71 ; WX 800 ; N G ; B 44 -17 778 698 ;
XC 72 ; WX 800 ; N H ; B 31 0 769 681 ;
XC 73 ; WX 340 ; N I ; B 31 0 301 681 ;
XC 74 ; WX 600 ; N J ; B -23 -17 567 681 ;
XC 75 ; WX 720 ; N K ; B 31 0 750 681 ;
XC 76 ; WX 600 ; N L ; B 31 0 629 681 ;
XC 77 ; WX 920 ; N M ; B 26 0 894 681 ;
XC 78 ; WX 740 ; N N ; B 26 0 722 681 ;
XC 79 ; WX 800 ; N O ; B 44 -17 758 698 ;
XC 80 ; WX 620 ; N P ; B 31 0 613 681 ;
XC 81 ; WX 820 ; N Q ; B 44 -189 769 698 ;
XC 82 ; WX 720 ; N R ; B 31 0 757 681 ;
XC 83 ; WX 660 ; N S ; B 28 -17 634 698 ;
XC 84 ; WX 620 ; N T ; B -37 0 656 681 ;
XC 85 ; WX 780 ; N U ; B 25 -17 754 681 ;
XC 86 ; WX 700 ; N V ; B -30 0 725 681 ;
XC 87 ; WX 960 ; N W ; B -30 0 984 681 ;
XC 88 ; WX 720 ; N X ; B -30 0 755 681 ;
XC 89 ; WX 640 ; N Y ; B -30 0 666 681 ;
XC 90 ; WX 640 ; N Z ; B 10 0 656 681 ;
XC 91 ; WX 300 ; N bracketleft ; B 92 -136 258 717 ;
XC 92 ; WX 600 ; N backslash ; B 74 0 532 717 ;
XC 93 ; WX 300 ; N bracketright ; B 41 -136 207 717 ;
XC 94 ; WX 600 ; N asciicircum ; B 52 276 554 681 ;


XC 95 ; WX 500 ; N underscore ; B 0 -155 500 -95 ;

XC 96 ; WX 220 ; N quoteleft ; B 46 479 178 698 ;
XC 97 ; WX 580 ; N a ; B 35 -8 587 494 ;
XC 98 ; WX 620 ; N b ; B -2 -8 582 717 ;
XC 99 ; WX 520 ; N c ; B 37 -8 498 494 ;
XC 100 ; WX 620 ; N d ; B 37 -8 591 717 ;
XC 101 ; WX 520 ; N e ; B 37 -8 491 494 ;
XC 102 ; WX 320 ; N f ; B 20 0 414 734 ; L i fi ; L l fl ;
XC 103 ; WX 540 ; N g ; B 17 -243 542 567 ;
XC 104 ; WX 660 ; N h ; B 20 0 643 717 ;
XC 105 ; WX 300 ; N i ; B 20 0 288 654 ;
XC 106 ; WX 300 ; N j ; B -109 -251 214 654 ;
XC 107 ; WX 620 ; N k ; B 20 0 628 717 ;
XC 108 ; WX 300 ; N l ; B 20 0 286 717 ;
XC 109 ; WX 940 ; N m ; B 17 0 928 494 ;
XC 110 ; WX 660 ; N n ; B 20 0 649 494 ;
XC 111 ; WX 560 ; N o ; B 37 -8 526 494 ;
XC 112 ; WX 620 ; N p ; B 20 -228 583 494 ;
XC 113 ; WX 580 ; N q ; B 37 -228 589 494 ;
XC 114 ; WX 440 ; N r ; B 20 0 447 494 ;
XC 115 ; WX 520 ; N s ; B 40 -8 487 494 ;
XC 116 ; WX 380 ; N t ; B 20 -8 388 667 ;
XC 117 ; WX 680 ; N u ; B 20 -8 653 484 ;
XC 118 ; WX 520 ; N v ; B -23 0 534 484 ;
XC 119 ; WX 780 ; N w ; B -19 0 804 484 ;
XC 120 ; WX 560 ; N x ; B -16 0 576 484 ;
XC 121 ; WX 540 ; N y ; B -23 -236 549 484 ;
XC 122 ; WX 480 ; N z ; B 7 0 476 484 ;
XC 123 ; WX 280 ; N braceleft ; B 35 -136 248 717 ;
XC 124 ; WX 600 ; N bar ; B 264 0 342 717 ;
XC 125 ; WX 280 ; N braceright ; B 35 -136 248 717 ;
XC 126 ; WX 600 ; N asciitilde ; B 52 173 556 352 ;
XC 161 ; WX 300 ; N exclamdown ; B 75 -214 219 494 ;
XC 162 ; WX 620 ; N cent ; B 116 20 511 651 ;
XC 163 ; WX 620 ; N sterling ; B 8 -17 631 698 ;
XC 164 ; WX 140 ; N fraction ; B -188 0 335 681 ;
XC 165 ; WX 620 ; N yen ; B -22 0 647 681 ;
XC 166 ; WX 620 ; N florin ; B -29 -155 633 749 ;
XC 167 ; WX 520 ; N section ; B 33 -178 486 698 ;
XC 168 ; WX 620 ; N currency ; B 58 89 563 591 ;
XC 169 ; WX 220 ; N quotesingle ; B 67 458 153 698 ;
XC 170 ; WX 400 ; N quotedblleft ; B 46 479 348 698 ;
XC 171 ; WX 360 ; N guillemotleft ; B 51 89 312 437 ;
XC 172 ; WX 240 ; N guilsinglleft ; B 51 89 189 437 ;
XC 173 ; WX 240 ; N guilsinglright ; B 51 89 189 437 ;
XC 174 ; WX 620 ; N fi ; B 20 0 608 734 ;
XC 175 ; WX 620 ; N fl ; B 20 0 606 734 ;
XC 177 ; WX 500 ; N endash ; B -15 232 515 292 ;
XC 178 ; WX 540 ; N dagger ; B 79 -156 455 698 ;
XC 179 ; WX 540 ; N daggerdbl ; B 79 -156 455 698 ;
XC 180 ; WX 320 ; N periodcentered ; B 92 196 220 327 ;
XC 182 ; WX 600 ; N paragraph ; B 14 0 577 681 ;
XC 183 ; WX 460 ; N bullet ; B 60 170 404 511 ;
XC 184 ; WX 220 ; N quotesinglbase ; B 46 -108 178 110 ;
XC 185 ; WX 400 ; N quotedblbase ; B 46 -108 348 110 ;
XC 186 ; WX 400 ; N quotedblright ; B 46 480 348 698 ;
XC 187 ; WX 360 ; N guillemotright ; B 51 89 312 437 ;
XC 188 ; WX 1000 ; N ellipsis ; B 101 -8 898 123 ;
XC 189 ; WX 1280 ; N perthousand ; B 22 -8 1266 698 ;
XC 191 ; WX 540 ; N questiondown ; B 23 -217 510 494 ;
XC 193 ; WX 340 ; N grave ; B 68 571 274 689 ;
XC 194 ; WX 340 ; N acute ; B 68 571 274 689 ;
XC 195 ; WX 420 ; N circumflex ; B 68 567 352 685 ;
XC 196 ; WX 440 ; N tilde ; B 68 572 375 661 ;
XC 197 ; WX 440 ; N macron ; B 68 587 364 635 ;
XC 198 ; WX 460 ; N breve ; B 68 568 396 687 ;
XC 199 ; WX 260 ; N dotaccent ; B 68 552 186 672 ;
XC 200 ; WX 420 ; N dieresis ; B 68 552 349 674 ;
XC 202 ; WX 320 ; N ring ; B 68 546 252 731 ;
XC 203 ; WX 320 ; N cedilla ; B 68 -200 257 0 ;
XC 205 ; WX 380 ; N hungarumlaut ; B 68 538 311 698 ;
XC 206 ; WX 320 ; N ogonek ; B 68 -145 245 0 ;
XC 207 ; WX 420 ; N caron ; B 68 554 352 672 ;
XC 208 ; WX 1000 ; N emdash ; B -15 232 1015 292 ;
XC 225 ; WX 1260 ; N AE ; B -36 0 1250 681 ;
XC 227 ; WX 420 ; N ordfeminine ; B 49 302 393 698 ;
XC 232 ; WX 600 ; N Lslash ; B 31 0 629 681 ;
XC 233 ; WX 800 ; N Oslash ; B 44 -53 758 733 ;
XC 234 ; WX 1240 ; N OE ; B 44 -17 1214 698 ;
XC 235 ; WX 420 ; N ordmasculine ; B 56 302 361 698 ;
XC 241 ; WX 860 ; N ae ; B 35 -8 832 494 ;
XC 245 ; WX 300 ; N dotlessi ; B 20 0 288 484 ;
XC 248 ; WX 320 ; N lslash ; B 20 0 291 717 ;
XC 249 ; WX 560 ; N oslash ; B 37 -40 526 534 ;
XC 250 ; WX 900 ; N oe ; B 37 -8 876 494 ;
XC 251 ; WX 660 ; N germandbls ; B -109 -110 614 698 ;
XC -1 ; WX 680 ; N Aacute ; B -37 0 714 886 ;
XC -1 ; WX 680 ; N Acircumflex ; B -37 0 714 882 ;
XC -1 ; WX 680 ; N Adieresis ; B -37 0 714 871 ;
XC -1 ; WX 680 ; N Agrave ; B -37 0 714 886 ;
XC -1 ; WX 680 ; N Aring ; B -37 0 714 928 ;
XC -1 ; WX 680 ; N Atilde ; B -37 0 714 858 ;
XC -1 ; WX 740 ; N Ccedilla ; B 44 -200 702 698 ;
XC -1 ; WX 720 ; N Eacute ; B 31 0 705 886 ;
XC -1 ; WX 720 ; N Ecircumflex ; B 31 0 705 882 ;
XC -1 ; WX 720 ; N Edieresis ; B 31 0 705 871 ;
XC -1 ; WX 720 ; N Egrave ; B 31 0 705 886 ;
XC -1 ; WX 800 ; N Eth ; B 31 0 752 681 ;
XC -1 ; WX 340 ; N Iacute ; B 31 0 301 886 ;
XC -1 ; WX 340 ; N Icircumflex ; B 28 0 312 882 ;
XC -1 ; WX 340 ; N Idieresis ; B 28 0 309 871 ;
XC -1 ; WX 340 ; N Igrave ; B 31 0 301 886 ;
XC -1 ; WX 740 ; N Ntilde ; B 26 0 722 858 ;
XC -1 ; WX 800 ; N Oacute ; B 44 -17 758 886 ;
XC -1 ; WX 800 ; N Ocircumflex ; B 44 -17 758 882 ;
XC -1 ; WX 800 ; N Odieresis ; B 44 -17 758 871 ;
XC -1 ; WX 800 ; N Ograve ; B 44 -17 758 886 ;
XC -1 ; WX 800 ; N Otilde ; B 44 -17 758 858 ;
XC -1 ; WX 660 ; N Scaron ; B 28 -17 634 869 ;
XC -1 ; WX 620 ; N Thorn ; B 31 0 613 681 ;
XC -1 ; WX 780 ; N Uacute ; B 25 -17 754 886 ;
XC -1 ; WX 780 ; N Ucircumflex ; B 25 -17 754 882 ;
XC -1 ; WX 780 ; N Udieresis ; B 25 -17 754 871 ;
XC -1 ; WX 780 ; N Ugrave ; B 25 -17 754 886 ;
XC -1 ; WX 640 ; N Yacute ; B -30 0 666 886 ;
XC -1 ; WX 640 ; N Ydieresis ; B -30 0 666 871 ;
XC -1 ; WX 640 ; N Zcaron ; B 10 0 656 869 ;
XC -1 ; WX 580 ; N aacute ; B 35 -8 587 689 ;
XC -1 ; WX 580 ; N acircumflex ; B 35 -8 587 685 ;
XC -1 ; WX 580 ; N adieresis ; B 35 -8 587 674 ;
XC -1 ; WX 580 ; N agrave ; B 35 -8 587 689 ;
XC -1 ; WX 580 ; N aring ; B 35 -8 587 731 ;
XC -1 ; WX 580 ; N atilde ; B 35 -8 587 661 ;
XC -1 ; WX 600 ; N brokenbar ; B 264 0 342 717 ;
XC -1 ; WX 520 ; N ccedilla ; B 37 -200 498 494 ;
XC -1 ; WX 740 ; N copyright ; B 24 -17 724 698 ;
XC -1 ; WX 400 ; N degree ; B 50 398 350 698 ;
XC -1 ; WX 600 ; N divide ; B 51 10 555 514 ;
XC -1 ; WX 520 ; N eacute ; B 37 -8 491 689 ;
XC -1 ; WX 520 ; N ecircumflex ; B 37 -8 491 685 ;
XC -1 ; WX 520 ; N edieresis ; B 37 -8 491 674 ;
XC -1 ; WX 520 ; N egrave ; B 37 -8 491 689 ;
XC -1 ; WX 560 ; N eth ; B 37 -8 526 734 ;
XC -1 ; WX 300 ; N iacute ; B 20 0 288 689 ;
XC -1 ; WX 300 ; N icircumflex ; B 8 0 292 685 ;
XC -1 ; WX 300 ; N idieresis ; B 8 0 289 674 ;
XC -1 ; WX 300 ; N igrave ; B 20 0 288 689 ;
XC -1 ; WX 600 ; N logicalnot ; B 51 128 555 398 ;
XC -1 ; WX 600 ; N minus ; B 51 224 555 300 ;
XC -1 ; WX 680 ; N mu ; B 20 -251 653 484 ;
XC -1 ; WX 600 ; N multiply ; B 51 9 555 513 ;
XC -1 ; WX 660 ; N ntilde ; B 20 0 649 661 ;
XC -1 ; WX 560 ; N oacute ; B 37 -8 526 689 ;
XC -1 ; WX 560 ; N ocircumflex ; B 37 -8 526 685 ;
XC -1 ; WX 560 ; N odieresis ; B 37 -8 526 674 ;
XC -1 ; WX 560 ; N ograve ; B 37 -8 526 689 ;
XC -1 ; WX 930 ; N onehalf ; B 80 0 885 681 ;
XC -1 ; WX 930 ; N onequarter ; B 80 0 869 681 ;
XC -1 ; WX 372 ; N onesuperior ; B 80 279 302 688 ;
XC -1 ; WX 560 ; N otilde ; B 37 -8 526 661 ;
XC -1 ; WX 600 ; N plusminus ; B 51 0 555 513 ;
XC -1 ; WX 740 ; N registered ; B 23 -17 723 698 ;
XC -1 ; WX 520 ; N scaron ; B 40 -8 487 672 ;
XC -1 ; WX 620 ; N thorn ; B 20 -228 583 717 ;
XC -1 ; WX 930 ; N threequarters ; B 52 0 889 691 ;
XC -1 ; WX 372 ; N threesuperior ; B 12 269 360 698 ;
XC -1 ; WX 980 ; N trademark ; B 34 277 930 681 ;
XC -1 ; WX 372 ; N twosuperior ; B 20 279 367 698 ;
XC -1 ; WX 680 ; N uacute ; B 20 -8 653 689 ;
XC -1 ; WX 680 ; N ucircumflex ; B 20 -8 653 685 ;
XC -1 ; WX 680 ; N udieresis ; B 20 -8 653 674 ;
XC -1 ; WX 680 ; N ugrave ; B 20 -8 653 689 ;
XC -1 ; WX 540 ; N yacute ; B -23 -236 549 689 ;
XC -1 ; WX 540 ; N ydieresis ; B -23 -236 549 674 ;
XC -1 ; WX 480 ; N zcaron ; B 7 0 476 672 ;


XEndCharMetrics
XStartKernData
XStartKernPairs 93
X

XKPX A y 32
XKPX A w 4
XKPX A v 7
XKPX A Y -35
XKPX A W -40
XKPX A V -56
XKPX A T 1
X
XKPX F period -46
XKPX F comma -41
XKPX F A -21
X
XKPX L y 79
XKPX L Y 13
XKPX L W 1
XKPX L V -4
XKPX L T 28
X
XKPX P period -60
XKPX P comma -55
XKPX P A -8
X
XKPX R y 59
XKPX R Y 26
XKPX R W 13
XKPX R V 8
XKPX R T 71
X
XKPX T y 0
XKPX T w 0
XKPX T u 0
XKPX T semicolon 0
XKPX T s 16
XKPX T r 38
XKPX T period -33
XKPX T o 15
XKPX T i 42
XKPX T hyphen 90
XKPX T e 13
XKPX T comma -28
XKPX T colon 0
XKPX T c 14
XKPX T a 17
XKPX T A 1
X
XKPX V y 15
XKPX V u -38
XKPX V semicolon 0
XKPX V r -41
XKPX V period -40
XKPX V o -71
XKPX V i -20
XKPX V hyphen 11
XKPX V e -72
XKPX V comma -34
XKPX V colon 0
XKPX V a -69
XKPX V A -66


X
XKPX W y 15

XKPX W u -38
XKPX W semicolon 0
XKPX W r -41
XKPX W period -40
XKPX W o -68
XKPX W i -20
XKPX W hyphen 11
XKPX W e -69
XKPX W comma -34
XKPX W colon 0
XKPX W a -66
XKPX W A -64
X
XKPX Y v 15
XKPX Y u -38
XKPX Y semicolon 0
XKPX Y q -55
XKPX Y period -40
XKPX Y p -31
XKPX Y o -57
XKPX Y i -37
XKPX Y hyphen 11
XKPX Y e -58
XKPX Y comma -34
XKPX Y colon 0
XKPX Y a -54
XKPX Y A -53
X
XKPX f f 29
X
XKPX r q 9
XKPX r period -64
XKPX r o 8
XKPX r n 31
XKPX r m 31
XKPX r hyphen 70
XKPX r h -21
XKPX r g -4
XKPX r f 33
XKPX r e 7
XKPX r d 7
XKPX r comma -58
XKPX r c 7
XEndKernPairs
XEndKernData
XStartComposites 58
XCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 110 197 ;
XCC zcaron 2 ; PCC z 0 0 ; PCC caron 30 0 ;
XCC Scaron 2 ; PCC S 0 0 ; PCC caron 120 197 ;
XCC scaron 2 ; PCC s 0 0 ; PCC caron 50 0 ;
XCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 210 0 ;


XCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 100 0 ;

XCC Yacute 2 ; PCC Y 0 0 ; PCC acute 150 197 ;
XCC yacute 2 ; PCC y 0 0 ; PCC acute 100 0 ;
XCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 110 197 ;
XCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 60 0 ;
XCC Uacute 2 ; PCC U 0 0 ; PCC acute 220 197 ;
XCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 180 197 ;
XCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 180 197 ;
XCC Ugrave 2 ; PCC U 0 0 ; PCC grave 220 197 ;


XCC uacute 2 ; PCC u 0 0 ; PCC acute 170 0 ;

XCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 130 0 ;
XCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 130 0 ;
XCC ugrave 2 ; PCC u 0 0 ; PCC grave 170 0 ;
XCC Iacute 2 ; PCC I 0 0 ; PCC acute 0 197 ;
XCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex -40 197 ;
XCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis -40 197 ;
XCC Igrave 2 ; PCC I 0 0 ; PCC grave 0 197 ;
XCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -20 0 ;
XCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -60 0 ;
XCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -60 0 ;
XCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -20 0 ;
XCC Eacute 2 ; PCC E 0 0 ; PCC acute 190 197 ;
XCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 150 197 ;
XCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 150 197 ;
XCC Egrave 2 ; PCC E 0 0 ; PCC grave 190 197 ;
XCC eacute 2 ; PCC e 0 0 ; PCC acute 90 0 ;


XCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 50 0 ;

XCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 50 0 ;


XCC egrave 2 ; PCC e 0 0 ; PCC grave 90 0 ;

XCC Aacute 2 ; PCC A 0 0 ; PCC acute 170 197 ;
XCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 130 197 ;
XCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 130 197 ;
XCC Agrave 2 ; PCC A 0 0 ; PCC grave 170 197 ;


XCC aacute 2 ; PCC a 0 0 ; PCC acute 120 0 ;

XCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 80 0 ;


XCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 80 0 ;
XCC agrave 2 ; PCC a 0 0 ; PCC grave 120 0 ;

XCC Oacute 2 ; PCC O 0 0 ; PCC acute 230 197 ;
XCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 190 197 ;
XCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 190 197 ;
XCC Ograve 2 ; PCC O 0 0 ; PCC grave 230 197 ;


XCC oacute 2 ; PCC o 0 0 ; PCC acute 110 0 ;

XCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 70 0 ;


XCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 70 0 ;
XCC ograve 2 ; PCC o 0 0 ; PCC grave 110 0 ;

XCC Atilde 2 ; PCC A 0 0 ; PCC tilde 120 197 ;
XCC atilde 2 ; PCC a 0 0 ; PCC tilde 70 0 ;
XCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 150 197 ;
XCC ntilde 2 ; PCC n 0 0 ; PCC tilde 110 0 ;
XCC Otilde 2 ; PCC O 0 0 ; PCC tilde 180 197 ;


XCC otilde 2 ; PCC o 0 0 ; PCC tilde 60 0 ;

XCC Aring 2 ; PCC A 0 0 ; PCC ring 180 197 ;
XCC aring 2 ; PCC a 0 0 ; PCC ring 130 0 ;
XEndComposites
XEndFontMetrics
END_OF_FILE
if test 15093 -ne `wc -c <'lout/font0/BookmLig.AFM'`; then
echo shar: \"'lout/font0/BookmLig.AFM'\" unpacked with wrong size!
fi
# end of 'lout/font0/BookmLig.AFM'
fi
if test -f 'lout/font0/BookmLigIta.AFM' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/font0/BookmLigIta.AFM'\"
else
echo shar: Extracting \"'lout/font0/BookmLigIta.AFM'\" \(15196 characters\)
sed "s/^X//" >'lout/font0/BookmLigIta.AFM' <<'END_OF_FILE'


XStartFontMetrics 2.0
XComment Copyright (c) 1984 Adobe Systems Incorporated. All Rights Reserved.

XComment Creation Date:Sat Feb 7 19:08:21 PST 1987
XFontName Bookman-LightItalic
XEncodingScheme AdobeStandardEncoding
XFullName ITC Bookman Light Italic
XFamilyName ITC Bookman
XWeight Light


XItalicAngle -10.0
XIsFixedPitch false
XUnderlinePosition -125
XUnderlineThickness 60
XVersion 001.001

XNotice ITC Bookman is a registered trademark of International Typeface Corporation.
XFontBBox -228 -222 1269 893
XCapHeight 681
XXHeight 494
XDescender -212
XAscender 717
XStartCharMetrics 228
XC 32 ; WX 300 ; N space ; B 0 0 0 0 ;
XC 33 ; WX 320 ; N exclam ; B 103 -8 342 698 ;
XC 34 ; WX 360 ; N quotedbl ; B 107 468 402 699 ;
XC 35 ; WX 620 ; N numbersign ; B 107 0 598 681 ;
XC 36 ; WX 620 ; N dollar ; B 78 -85 619 762 ;
XC 37 ; WX 800 ; N percent ; B 56 -8 811 691 ;
XC 38 ; WX 820 ; N ampersand ; B 65 -18 848 698 ;
XC 39 ; WX 280 ; N quoteright ; B 148 470 288 698 ;
XC 40 ; WX 280 ; N parenleft ; B 96 -146 383 727 ;
XC 41 ; WX 280 ; N parenright ; B -8 -146 279 727 ;
XC 42 ; WX 440 ; N asterisk ; B 139 324 505 698 ;
XC 43 ; WX 600 ; N plus ; B 91 43 595 548 ;
XC 44 ; WX 300 ; N comma ; B 88 -115 227 112 ;
XC 45 ; WX 320 ; N hyphen ; B 78 269 336 325 ;
XC 46 ; WX 300 ; N period ; B 96 -8 231 127 ;
XC 47 ; WX 600 ; N slash ; B 104 -149 562 717 ;
XC 48 ; WX 620 ; N zero ; B 86 -17 646 698 ;
XC 49 ; WX 620 ; N one ; B 154 0 500 681 ;
XC 50 ; WX 620 ; N two ; B 66 0 636 698 ;
XC 51 ; WX 620 ; N three ; B 55 -17 622 698 ;
XC 52 ; WX 620 ; N four ; B 69 0 634 681 ;
XC 53 ; WX 620 ; N five ; B 70 -17 614 681 ;
XC 54 ; WX 620 ; N six ; B 89 -17 657 698 ;
XC 55 ; WX 620 ; N seven ; B 143 0 672 681 ;
XC 56 ; WX 620 ; N eight ; B 61 -17 655 698 ;
XC 57 ; WX 620 ; N nine ; B 77 -17 649 698 ;
XC 58 ; WX 300 ; N colon ; B 96 -8 292 494 ;
XC 59 ; WX 300 ; N semicolon ; B 88 -114 292 494 ;
XC 60 ; WX 600 ; N less ; B 79 33 588 561 ;
XC 61 ; WX 600 ; N equal ; B 91 161 595 433 ;
XC 62 ; WX 600 ; N greater ; B 93 33 602 561 ;
XC 63 ; WX 540 ; N question ; B 114 -8 604 698 ;
XC 64 ; WX 780 ; N at ; B 102 -17 802 698 ;
XC 65 ; WX 700 ; N A ; B -25 0 720 681 ;
XC 66 ; WX 720 ; N B ; B 21 0 746 681 ;
XC 67 ; WX 720 ; N C ; B 88 -17 746 698 ;
XC 68 ; WX 740 ; N D ; B 21 0 782 681 ;
XC 69 ; WX 680 ; N E ; B 21 0 736 681 ;
XC 70 ; WX 620 ; N F ; B 21 0 743 681 ;
XC 71 ; WX 760 ; N G ; B 88 -17 813 698 ;
XC 72 ; WX 800 ; N H ; B 21 0 888 681 ;
XC 73 ; WX 320 ; N I ; B 21 0 412 681 ;
XC 74 ; WX 560 ; N J ; B -2 -17 666 681 ;
XC 75 ; WX 720 ; N K ; B 21 0 804 681 ;
XC 76 ; WX 580 ; N L ; B 21 0 656 681 ;
XC 77 ; WX 860 ; N M ; B 18 0 956 681 ;
XC 78 ; WX 720 ; N N ; B 18 0 823 681 ;
XC 79 ; WX 760 ; N O ; B 88 -17 799 698 ;
XC 80 ; WX 600 ; N P ; B 21 0 681 681 ;
XC 81 ; WX 780 ; N Q ; B 61 -191 812 698 ;
XC 82 ; WX 700 ; N R ; B 21 0 736 681 ;
XC 83 ; WX 640 ; N S ; B 61 -17 668 698 ;
XC 84 ; WX 600 ; N T ; B 50 0 725 681 ;
XC 85 ; WX 720 ; N U ; B 118 -17 842 681 ;
XC 86 ; WX 680 ; N V ; B 87 0 815 681 ;
XC 87 ; WX 960 ; N W ; B 87 0 1095 681 ;
XC 88 ; WX 700 ; N X ; B -25 0 815 681 ;
XC 89 ; WX 660 ; N Y ; B 87 0 809 681 ;
XC 90 ; WX 580 ; N Z ; B 8 0 695 681 ;
XC 91 ; WX 260 ; N bracketleft ; B 56 -136 351 717 ;
XC 92 ; WX 600 ; N backslash ; B 84 0 542 717 ;
XC 93 ; WX 260 ; N bracketright ; B 15 -136 309 717 ;
XC 94 ; WX 600 ; N asciicircum ; B 97 276 599 681 ;


XC 95 ; WX 500 ; N underscore ; B 0 -155 500 -95 ;

XC 96 ; WX 280 ; N quoteleft ; B 191 470 330 698 ;
XC 97 ; WX 620 ; N a ; B 71 -8 686 494 ;
XC 98 ; WX 600 ; N b ; B 88 -8 621 717 ;
XC 99 ; WX 480 ; N c ; B 65 -8 522 494 ;
XC 100 ; WX 640 ; N d ; B 65 -8 695 717 ;
XC 101 ; WX 540 ; N e ; B 65 -8 575 494 ;
XC 102 ; WX 340 ; N f ; B -160 -218 557 725 ; L i fi ; L l fl ;
XC 103 ; WX 560 ; N g ; B 4 -221 581 494 ;
XC 104 ; WX 620 ; N h ; B 88 -8 689 717 ;
XC 105 ; WX 280 ; N i ; B 88 -8 351 663 ;
XC 106 ; WX 280 ; N j ; B -200 -221 308 663 ;
XC 107 ; WX 600 ; N k ; B 88 -8 657 717 ;
XC 108 ; WX 280 ; N l ; B 100 -8 342 717 ;
XC 109 ; WX 880 ; N m ; B 88 -8 952 494 ;
XC 110 ; WX 620 ; N n ; B 88 -8 673 494 ;
XC 111 ; WX 540 ; N o ; B 65 -8 572 494 ;
XC 112 ; WX 600 ; N p ; B -24 -212 620 494 ;
XC 113 ; WX 560 ; N q ; B 65 -212 584 494 ;
XC 114 ; WX 400 ; N r ; B 88 0 481 494 ;
XC 115 ; WX 540 ; N s ; B 65 -8 547 494 ;
XC 116 ; WX 340 ; N t ; B 88 -8 411 664 ;
XC 117 ; WX 620 ; N u ; B 88 -8 686 484 ;
XC 118 ; WX 540 ; N v ; B 88 -8 562 494 ;
XC 119 ; WX 880 ; N w ; B 88 -8 893 494 ;
XC 120 ; WX 540 ; N x ; B 9 -8 626 494 ;
XC 121 ; WX 600 ; N y ; B 60 -221 609 484 ;
XC 122 ; WX 520 ; N z ; B 38 -8 561 494 ;
XC 123 ; WX 360 ; N braceleft ; B 125 -191 439 717 ;
XC 124 ; WX 600 ; N bar ; B 294 0 372 717 ;
XC 125 ; WX 380 ; N braceright ; B 15 -191 330 717 ;
XC 126 ; WX 600 ; N asciitilde ; B 91 207 595 386 ;
XC 161 ; WX 320 ; N exclamdown ; B 73 -213 301 494 ;
XC 162 ; WX 620 ; N cent ; B 148 -29 596 715 ;
XC 163 ; WX 620 ; N sterling ; B 4 -17 702 698 ;
XC 164 ; WX 20 ; N fraction ; B -228 0 323 681 ;
XC 165 ; WX 620 ; N yen ; B 71 0 735 681 ;
XC 166 ; WX 620 ; N florin ; B -26 -218 692 725 ;
XC 167 ; WX 620 ; N section ; B 38 -178 638 698 ;
XC 168 ; WX 620 ; N currency ; B 100 89 605 591 ;
XC 169 ; WX 200 ; N quotesingle ; B 99 473 247 698 ;
XC 170 ; WX 440 ; N quotedblleft ; B 191 470 493 698 ;
XC 171 ; WX 300 ; N guillemotleft ; B 70 129 313 434 ;
XC 172 ; WX 180 ; N guilsinglleft ; B 75 129 208 434 ;
XC 173 ; WX 180 ; N guilsinglright ; B 70 129 203 434 ;
XC 174 ; WX 640 ; N fi ; B -159 -222 709 725 ;
XC 175 ; WX 660 ; N fl ; B -159 -218 713 725 ;
XC 177 ; WX 500 ; N endash ; B 33 269 561 325 ;
XC 178 ; WX 620 ; N dagger ; B 192 -130 570 698 ;
XC 179 ; WX 620 ; N daggerdbl ; B 144 -122 566 698 ;
XC 180 ; WX 300 ; N periodcentered ; B 137 229 272 364 ;
XC 182 ; WX 620 ; N paragraph ; B 112 0 718 681 ;
XC 183 ; WX 460 ; N bullet ; B 100 170 444 511 ;
XC 184 ; WX 320 ; N quotesinglbase ; B 87 -114 226 113 ;
XC 185 ; WX 480 ; N quotedblbase ; B 87 -114 390 113 ;
XC 186 ; WX 440 ; N quotedblright ; B 148 470 451 698 ;
XC 187 ; WX 300 ; N guillemotright ; B 60 129 303 434 ;
XC 188 ; WX 1000 ; N ellipsis ; B 99 -8 900 127 ;
XC 189 ; WX 1180 ; N perthousand ; B 56 -8 1199 691 ;
XC 191 ; WX 540 ; N questiondown ; B 18 -212 508 494 ;
XC 193 ; WX 340 ; N grave ; B 182 551 377 706 ;
XC 194 ; WX 320 ; N acute ; B 178 551 373 706 ;
XC 195 ; WX 440 ; N circumflex ; B 176 571 479 685 ;
XC 196 ; WX 440 ; N tilde ; B 180 586 488 671 ;
XC 197 ; WX 440 ; N macron ; B 178 599 484 658 ;
XC 198 ; WX 440 ; N breve ; B 191 577 500 680 ;
XC 199 ; WX 260 ; N dotaccent ; B 169 543 290 664 ;
XC 200 ; WX 420 ; N dieresis ; B 185 569 467 688 ;
XC 202 ; WX 300 ; N ring ; B 178 551 334 706 ;
XC 203 ; WX 320 ; N cedilla ; B 45 -178 240 0 ;
XC 205 ; WX 340 ; N hungarumlaut ; B 167 547 402 738 ;
XC 206 ; WX 260 ; N ogonek ; B 51 -173 184 0 ;
XC 207 ; WX 440 ; N caron ; B 178 571 481 684 ;
XC 208 ; WX 1000 ; N emdash ; B 33 269 1061 325 ;
XC 225 ; WX 1220 ; N AE ; B -45 0 1269 681 ;
XC 227 ; WX 440 ; N ordfeminine ; B 94 307 513 698 ;
XC 232 ; WX 580 ; N Lslash ; B 21 0 656 681 ;
XC 233 ; WX 760 ; N Oslash ; B 88 -95 799 777 ;
XC 234 ; WX 1180 ; N OE ; B 88 -17 1237 698 ;
XC 235 ; WX 400 ; N ordmasculine ; B 94 307 455 698 ;
XC 241 ; WX 880 ; N ae ; B 71 -8 918 494 ;
XC 245 ; WX 280 ; N dotlessi ; B 88 -8 351 484 ;
XC 248 ; WX 340 ; N lslash ; B 50 -8 398 717 ;
XC 249 ; WX 540 ; N oslash ; B 65 -49 571 532 ;
XC 250 ; WX 900 ; N oe ; B 65 -8 948 494 ;
XC 251 ; WX 620 ; N germandbls ; B -121 -111 653 698 ;
XC -1 ; WX 700 ; N Aacute ; B -25 0 720 893 ;
XC -1 ; WX 700 ; N Acircumflex ; B -25 0 720 872 ;
XC -1 ; WX 700 ; N Adieresis ; B -25 0 720 875 ;
XC -1 ; WX 700 ; N Agrave ; B -25 0 720 893 ;
XC -1 ; WX 700 ; N Aring ; B -25 0 720 893 ;
XC -1 ; WX 700 ; N Atilde ; B -25 0 720 858 ;
XC -1 ; WX 720 ; N Ccedilla ; B 88 -178 746 698 ;
XC -1 ; WX 680 ; N Eacute ; B 21 0 736 893 ;
XC -1 ; WX 680 ; N Ecircumflex ; B 21 0 736 872 ;
XC -1 ; WX 680 ; N Edieresis ; B 21 0 736 875 ;
XC -1 ; WX 680 ; N Egrave ; B 21 0 736 893 ;
XC -1 ; WX 740 ; N Eth ; B 21 0 782 681 ;
XC -1 ; WX 320 ; N Iacute ; B 21 0 412 893 ;
XC -1 ; WX 320 ; N Icircumflex ; B 21 0 419 872 ;
XC -1 ; WX 320 ; N Idieresis ; B 21 0 417 875 ;
XC -1 ; WX 320 ; N Igrave ; B 21 0 412 893 ;
XC -1 ; WX 720 ; N Ntilde ; B 18 0 823 858 ;
XC -1 ; WX 760 ; N Oacute ; B 88 -17 799 893 ;
XC -1 ; WX 760 ; N Ocircumflex ; B 88 -17 799 872 ;
XC -1 ; WX 760 ; N Odieresis ; B 88 -17 799 875 ;
XC -1 ; WX 760 ; N Ograve ; B 88 -17 799 893 ;
XC -1 ; WX 760 ; N Otilde ; B 88 -17 799 858 ;
XC -1 ; WX 640 ; N Scaron ; B 61 -17 668 871 ;
XC -1 ; WX 600 ; N Thorn ; B 21 0 656 681 ;
XC -1 ; WX 720 ; N Uacute ; B 118 -17 842 893 ;
XC -1 ; WX 720 ; N Ucircumflex ; B 118 -17 842 872 ;
XC -1 ; WX 720 ; N Udieresis ; B 118 -17 842 875 ;
XC -1 ; WX 720 ; N Ugrave ; B 118 -17 842 893 ;
XC -1 ; WX 660 ; N Yacute ; B 87 0 809 893 ;
XC -1 ; WX 660 ; N Ydieresis ; B 87 0 809 875 ;
XC -1 ; WX 580 ; N Zcaron ; B 8 0 695 871 ;
XC -1 ; WX 620 ; N aacute ; B 71 -8 686 706 ;
XC -1 ; WX 620 ; N acircumflex ; B 71 -8 686 685 ;
XC -1 ; WX 620 ; N adieresis ; B 71 -8 686 688 ;
XC -1 ; WX 620 ; N agrave ; B 71 -8 686 706 ;
XC -1 ; WX 620 ; N aring ; B 71 -8 686 706 ;
XC -1 ; WX 620 ; N atilde ; B 71 -8 686 671 ;
XC -1 ; WX 600 ; N brokenbar ; B 294 0 372 717 ;
XC -1 ; WX 480 ; N ccedilla ; B 65 -178 522 494 ;
XC -1 ; WX 740 ; N copyright ; B 84 -17 784 698 ;
XC -1 ; WX 400 ; N degree ; B 120 398 420 698 ;
XC -1 ; WX 600 ; N divide ; B 91 46 595 548 ;
XC -1 ; WX 540 ; N eacute ; B 65 -8 575 706 ;
XC -1 ; WX 540 ; N ecircumflex ; B 65 -8 575 685 ;
XC -1 ; WX 540 ; N edieresis ; B 65 -8 575 688 ;
XC -1 ; WX 540 ; N egrave ; B 65 -8 575 706 ;
XC -1 ; WX 540 ; N eth ; B 65 -8 642 725 ;
XC -1 ; WX 280 ; N iacute ; B 88 -8 351 706 ;
XC -1 ; WX 280 ; N icircumflex ; B 76 -8 379 685 ;
XC -1 ; WX 280 ; N idieresis ; B 88 -8 377 688 ;
XC -1 ; WX 280 ; N igrave ; B 88 -8 351 706 ;
XC -1 ; WX 600 ; N logicalnot ; B 91 163 595 433 ;
XC -1 ; WX 600 ; N minus ; B 91 259 595 335 ;
XC -1 ; WX 620 ; N mu ; B 53 -221 686 484 ;
XC -1 ; WX 600 ; N multiply ; B 91 44 595 548 ;
XC -1 ; WX 620 ; N ntilde ; B 88 -8 673 671 ;
XC -1 ; WX 540 ; N oacute ; B 65 -8 572 706 ;
XC -1 ; WX 540 ; N ocircumflex ; B 65 -8 572 685 ;
XC -1 ; WX 540 ; N odieresis ; B 65 -8 572 688 ;
XC -1 ; WX 540 ; N ograve ; B 65 -8 572 706 ;
XC -1 ; WX 930 ; N onehalf ; B 91 0 925 681 ;
XC -1 ; WX 930 ; N onequarter ; B 91 0 913 681 ;
XC -1 ; WX 372 ; N onesuperior ; B 114 279 339 688 ;
XC -1 ; WX 540 ; N otilde ; B 65 -8 572 671 ;
XC -1 ; WX 600 ; N plusminus ; B 91 0 595 548 ;
XC -1 ; WX 740 ; N registered ; B 84 -17 784 698 ;
XC -1 ; WX 540 ; N scaron ; B 65 -8 547 684 ;
XC -1 ; WX 600 ; N thorn ; B -24 -212 620 717 ;
XC -1 ; WX 930 ; N threequarters ; B 99 0 913 691 ;
XC -1 ; WX 372 ; N threesuperior ; B 70 269 439 698 ;
XC -1 ; WX 980 ; N trademark ; B 69 277 965 681 ;
XC -1 ; WX 372 ; N twosuperior ; B 68 279 439 698 ;
XC -1 ; WX 620 ; N uacute ; B 88 -8 686 706 ;
XC -1 ; WX 620 ; N ucircumflex ; B 88 -8 686 685 ;
XC -1 ; WX 620 ; N udieresis ; B 88 -8 686 688 ;
XC -1 ; WX 620 ; N ugrave ; B 88 -8 686 706 ;
XC -1 ; WX 600 ; N yacute ; B 60 -221 609 706 ;
XC -1 ; WX 600 ; N ydieresis ; B 60 -221 609 688 ;
XC -1 ; WX 520 ; N zcaron ; B 38 -8 561 684 ;


XEndCharMetrics
XStartKernData
XStartKernPairs 93
X

XKPX A y 0
XKPX A w 0
XKPX A v 0
XKPX A Y -62
XKPX A W -73
XKPX A V -78
XKPX A T -5
X
XKPX F period -97
XKPX F comma -98
XKPX F A -16
X
XKPX L y 20
XKPX L Y 7
XKPX L W 9
XKPX L V 4
XKPX L T 0


X
XKPX P period -105

XKPX P comma -106
XKPX P A -30


X
XKPX R y 0

XKPX R Y 11
XKPX R W 2
XKPX R V 2
XKPX R T 65
X
XKPX T y 0
XKPX T w 0
XKPX T u 0
XKPX T semicolon 48
XKPX T s -7
XKPX T r 67
XKPX T period -78
XKPX T o 14
XKPX T i 71
XKPX T hyphen 20
XKPX T e 10
XKPX T comma -79
XKPX T colon 48
XKPX T c 16
XKPX T a 9
XKPX T A -14


X
XKPX V y -14

XKPX V u -10
XKPX V semicolon -44
XKPX V r -20
XKPX V period -100
XKPX V o -70
XKPX V i 3
XKPX V hyphen 20
XKPX V e -70
XKPX V comma -109
XKPX V colon -35
XKPX V a -70
XKPX V A -70


X
XKPX W y -14

XKPX W u -20
XKPX W r -30
XKPX W o -60
XKPX W i 3
XKPX W semicolon -42
XKPX W period -100
XKPX W hyphen 20
XKPX W e -60
XKPX W comma -109
XKPX W colon -35
XKPX W a -60
XKPX W A -60
X
XKPX Y v -19
XKPX Y u -31
XKPX Y semicolon -40
XKPX Y q -72
XKPX Y period -100
XKPX Y p -37
XKPX Y o -75
XKPX Y i -11
XKPX Y hyphen 20
XKPX Y e -78
XKPX Y comma -109
XKPX Y colon -35
XKPX Y a -79
XKPX Y A -82
X
XKPX f f -19
X
XKPX r q -14
XKPX r period -134
XKPX r o -10
XKPX r n 38
XKPX r m 37
XKPX r hyphen 20
XKPX r h -20
XKPX r g -3
XKPX r f -9
XKPX r e -15
XKPX r d -9
XKPX r comma -143
XKPX r c -8
XEndKernPairs
XEndKernData
XStartComposites 58
XCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 70 187 ;
XCC zcaron 2 ; PCC z 0 0 ; PCC caron 20 0 ;
XCC Scaron 2 ; PCC S 0 0 ; PCC caron 100 187 ;


XCC scaron 2 ; PCC s 0 0 ; PCC caron 30 0 ;

XCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 200 0 ;


XCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 100 0 ;

XCC Yacute 2 ; PCC Y 0 0 ; PCC acute 170 187 ;
XCC yacute 2 ; PCC y 0 0 ; PCC acute 140 0 ;
XCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 100 187 ;
XCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 70 0 ;
XCC Uacute 2 ; PCC U 0 0 ; PCC acute 200 187 ;
XCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 140 187 ;
XCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 150 187 ;
XCC Ugrave 2 ; PCC U 0 0 ; PCC grave 170 187 ;
XCC uacute 2 ; PCC u 0 0 ; PCC acute 120 0 ;
XCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 60 0 ;
XCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 70 0 ;
XCC ugrave 2 ; PCC u 0 0 ; PCC grave 110 0 ;
XCC Iacute 2 ; PCC I 0 0 ; PCC acute 0 187 ;
XCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex -60 187 ;
XCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis -50 187 ;
XCC Igrave 2 ; PCC I 0 0 ; PCC grave -30 187 ;
XCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -40 0 ;
XCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -100 0 ;


XCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -90 0 ;

XCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -60 0 ;
XCC Eacute 2 ; PCC E 0 0 ; PCC acute 180 187 ;
XCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 100 187 ;
XCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 110 187 ;
XCC Egrave 2 ; PCC E 0 0 ; PCC grave 150 187 ;
XCC eacute 2 ; PCC e 0 0 ; PCC acute 90 0 ;
XCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 30 0 ;
XCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 40 0 ;
XCC egrave 2 ; PCC e 0 0 ; PCC grave 80 0 ;
XCC Aacute 2 ; PCC A 0 0 ; PCC acute 190 187 ;
XCC Acircumflex 2 ; PCC A 0 0 ; PCC circumflex 130 187 ;
XCC Adieresis 2 ; PCC A 0 0 ; PCC dieresis 140 187 ;
XCC Agrave 2 ; PCC A 0 0 ; PCC grave 160 187 ;


XCC aacute 2 ; PCC a 0 0 ; PCC acute 120 0 ;

XCC acircumflex 2 ; PCC a 0 0 ; PCC circumflex 70 0 ;


XCC adieresis 2 ; PCC a 0 0 ; PCC dieresis 80 0 ;

XCC agrave 2 ; PCC a 0 0 ; PCC grave 110 0 ;
XCC Oacute 2 ; PCC O 0 0 ; PCC acute 220 187 ;
XCC Ocircumflex 2 ; PCC O 0 0 ; PCC circumflex 160 187 ;
XCC Odieresis 2 ; PCC O 0 0 ; PCC dieresis 170 187 ;
XCC Ograve 2 ; PCC O 0 0 ; PCC grave 210 187 ;
XCC oacute 2 ; PCC o 0 0 ; PCC acute 80 0 ;
XCC ocircumflex 2 ; PCC o 0 0 ; PCC circumflex 20 0 ;


XCC odieresis 2 ; PCC o 0 0 ; PCC dieresis 40 0 ;

XCC ograve 2 ; PCC o 0 0 ; PCC grave 80 0 ;
XCC Atilde 2 ; PCC A 0 0 ; PCC tilde 130 187 ;
XCC atilde 2 ; PCC a 0 0 ; PCC tilde 60 0 ;
XCC Ntilde 2 ; PCC N 0 0 ; PCC tilde 130 187 ;


XCC ntilde 2 ; PCC n 0 0 ; PCC tilde 60 0 ;

XCC Otilde 2 ; PCC O 0 0 ; PCC tilde 160 187 ;
XCC otilde 2 ; PCC o 0 0 ; PCC tilde 30 0 ;
XCC Aring 2 ; PCC A 0 0 ; PCC ring 200 187 ;
XCC aring 2 ; PCC a 0 0 ; PCC ring 140 0 ;
XEndComposites
XEndFontMetrics
END_OF_FILE
if test 15196 -ne `wc -c <'lout/font0/BookmLigIta.AFM'`; then
echo shar: \"'lout/font0/BookmLigIta.AFM'\" unpacked with wrong size!
fi
# end of 'lout/font0/BookmLigIta.AFM'
fi
if test -f 'lout/z17.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/z17.c'\"
else
echo shar: Extracting \"'lout/z17.c'\" \(14449 characters\)
sed "s/^X//" >'lout/z17.c' <<'END_OF_FILE'
X/*@z17.c:Gap Widths:GetGap(), MinGap(), ExtraGap(), ActualGap()@**************/


X/* */
X/* LOUT: A HIGH-LEVEL LANGUAGE FOR DOCUMENT FORMATTING (VERSION 2.03) */
X/* COPYRIGHT (C) 1993 Jeffrey H. Kingston */
X/* */
X/* Jeffrey H. Kingston (je...@cs.su.oz.au) */
X/* Basser Department of Computer Science */
X/* The University of Sydney 2006 */
X/* AUSTRALIA */
X/* */
X/* This program is free software; you can redistribute it and/or modify */
X/* it under the terms of the GNU General Public License as published by */
X/* the Free Software Foundation; either version 1, or (at your option) */
X/* any later version. */
X/* */
X/* This program is distributed in the hope that it will be useful, */
X/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
X/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
X/* GNU General Public License for more details. */
X/* */
X/* You should have received a copy of the GNU General Public License */
X/* along with this program; if not, write to the Free Software */
X/* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
X/* */

X/* FILE: z17.c */
X/* MODULE: Gap Widths */
X/* EXTERNS: GetGap(), MinGap(), ExtraGap(), ActualGap(), EchoGap() */
X/* */
X/*****************************************************************************/
X/* #include <math.h> */


X#include "externs"
X
X
X/*****************************************************************************/
X/* */

X/* GetGap(x, style, res_gap, res_inc) */
X/* */
X/* Object x is expected to be a WORD containing a gap: */
X/* */
X/* <gap> ::= [ <increment> ] <width> [ <mode> ] */
X/* ::= */
X/* <width> ::= <unsigned number> <units> */
X/* <units> ::= c | i | p | m | f | s */
X/* ::= v | w | b | r | d */
X/* <mode> ::= e | h | x | o | k | t */
X/* <increment> ::= + | - */
X/* */
X/* Set *res_gap to the gap in the strings of x; *res_inc is the increment. */
X/* The gap is calculated using the given style. */
X/* If the gap is empty, this is a synonym for 0ie. */
X/* If there is an error, GetGap prints a message and returns 0ie. */
X/* */
X/*****************************************************************************/
X#define setwidths(x, y) w = x; units(*res_gap) = y; break;
X
XGetGap(x, style, res_gap, res_inc)
XOBJECT x; STYLE *style; GAP *res_gap; unsigned *res_inc;
X{ int w; float num;
X unsigned char *str;
X
X debug2(DGW, D, "GetGap( %s, %s, res_gap, res_inc )",
X EchoObject(null, x), EchoStyle(style));
X
X width(*res_gap) = 0; units(*res_gap) = FIXED_UNIT;
X mode(*res_gap) = EDGE_MODE; *res_inc = ABS;
X
X /* make sure we have a WORD argument */
X if( type(x) != WORD )
X { Error(WARN, &fpos(x), "gap is not a simple word");
X debug1(DGW, D, "GetGap failing (type(x) = %s)", Image(type(x)));
X return;
X }
X str = string(x);
X
X /* if word is empty, return 0ie */
X if( *str == '\0' )
X { debug0(DGW, D, "GetGap returning (null word)");
X return;
X }
X
X /* find the gap increment */
X if( *str == '+' ) *res_inc = INC, str++;
X else if( *str == '-' ) *res_inc = DEC, str++;
X
X /* read the gap width */
X if( sscanf(str, "%f", &num) != 1 )
X { Error(WARN, &fpos(x), "width missing from %s", string(x));
X Error(WARN, &fpos(x), "reminder: /, | and & characters %s",
X "must be enclosed in double quotes");
X debug0(DGW, D, "GetGap failing (width missing)");
X return;
X }
X while( (*str >= '0' && *str <= '9') || *str == '.' ) str++;
X
X /* find the units, calculate length, and check for reasonableness */
X switch( *str )
X {
X case 'c': setwidths( num * CM, FIXED_UNIT );
X case 'i': setwidths( num * IN, FIXED_UNIT );
X case 'p': setwidths( num * PT, FIXED_UNIT );
X case 'm': setwidths( num * EM, FIXED_UNIT );
X case 'f': setwidths( num * FontSize(font(*style), x), FIXED_UNIT );
X case 's': setwidths( num * width(space_gap(*style)), FIXED_UNIT );
X case 'v': setwidths( num * width(line_gap(*style)), FIXED_UNIT );
X case 'w': setwidths( num * FR, NEXT_UNIT );
X case 'b': setwidths( num * FR, FRAME_UNIT );
X case 'r': setwidths( num * FR, AVAIL_UNIT );
X
X case 'd': if( *res_inc == DEC ) num = - num;
X *res_inc = ABS;
X while( num >= 360.0 ) num -= 360.0;
X while( num <= -360.0 ) num += 360.0;
X assert( (num >= -360) && (num <= 360), "GetGap: degrees!" );
X setwidths( num * DG, DEG_UNIT );
X
X default: Error(WARN, &fpos(x), "units letter missing from %s",string(x));
X debug0(DGW, D, "GetGap failing (units letter missing)");
X return;
X }
X
X if( units(*res_gap) == AVAIL_UNIT && w > FR )
X { Error(WARN, &fpos(x), "%.1fr too large; replaced with 1.0r", num);
X w = FR;
X }
X else if( w > MAX_LEN )
X { assert( units(*res_gap) != DEG_UNIT, "GetGap: oversize degrees!" );
X Error(WARN, &fpos(x), "length %s is too large - max (%dc) substituted",
X string(x), MAX_LEN/CM);
X w = MAX_LEN;
X }
X width(*res_gap) = w;
X
X /* find the gap mode */
X switch( *++str )
X {
X case 'e':
X case '\0': mode(*res_gap) = EDGE_MODE; break;
X case 'h': mode(*res_gap) = HYPH_MODE; break;
X case 'x': mode(*res_gap) = MARK_MODE; break;
X case 'o': mode(*res_gap) = OVER_MODE; break;
X case 'k': mode(*res_gap) = KERN_MODE; break;
X case 't': mode(*res_gap) = TAB_MODE; break;
X
X default: Error(WARN, &fpos(x), "unknown gap mode in %s",string(x));
X debug0(DGW, D, "GetGap failing (spacing mode)");
X return;
X }
X
X if( *str != '\0' && *++str != '\0' )
X Error(WARN, &fpos(x), "invalid width or gap %s", string(x));
X
X debug2(DGW, D, "GetGap returning (res_gap = %s, res_inc = %s)",
X EchoGap(res_gap), Image( (int) *res_inc) );
X} /* end GetGap */


X
X
X/*@@**************************************************************************/
X/* */

X/* LENGTH MinGap(a, b, c, xgap) */
X/* */
X/* Returns the minimum possible separation between the marks of two */
X/* objects with the given intervening gap. */
X/* The first object has fwd value a, the second has back value b and fwd c. */
X/* */
X/*****************************************************************************/
X
XLENGTH MinGap(a, b, c, xgap)
XLENGTH a, b, c; GAP *xgap;
X{ LENGTH res; int w;
X switch( units(*xgap) )
X {
X case FIXED_UNIT: w = width(*xgap);
X break;
X
X case FRAME_UNIT: w = 0;
X break;
X
X case AVAIL_UNIT: w = 0;
X break;
X
X case NEXT_UNIT: w = width(*xgap) * (b + c) / FR;
X break;
X
X default: Error(INTERN, no_fpos, "MinGap: units = %d",
X units(*xgap));
X break;
X }
X switch( mode(*xgap) )
X {
X case NO_MODE: Error(INTERN, no_fpos, "MinGap: NO_MODE");
X res = 0;
X break;
X
X case ADD_HYPH:
X case HYPH_MODE:
X case EDGE_MODE: res = min(MAX_LEN, a + w + b);
X break;
X
X case MARK_MODE: res = max(w, a + b);
X break;
X
X case OVER_MODE: res = w;
X break;
X
X case KERN_MODE: res = max(max(a, b), w);
X break;
X
X case TAB_MODE: res = a + b;
X break;
X
X default: Error(INTERN, no_fpos, "MinGap: %d", mode(*xgap));
X res = 0;
X break;
X
X }
X debug5(DGW, D, "MinGap( _,%s %s %s,%s ) = %s", EchoLength(a),
X EchoGap(xgap), EchoLength(b), EchoLength(c), EchoLength(res) );
X return res;
X} /* end MinGap */


X
X
X/*@@**************************************************************************/
X/* */

X/* LENGTH ExtraGap(a, b, xgap, dir) */
X/* */
X/* Consider two objects, the first with forward length a, the second with */
X/* back length b. The objects are separated by the given gap. */
X/* If dir == FWD, ExtraGap returns the maximum amount that a could be */
X/* increased without increasing MinGap(a, b, c, xgap). */
X/* If dir == BACK, similarly for b. */
X/* */
X/*****************************************************************************/
X
XLENGTH ExtraGap(a, b, xgap, dir)
XLENGTH a, b; GAP *xgap; int dir;
X{ LENGTH tmp, res;
X LENGTH w = units(*xgap) == FIXED_UNIT ? width(*xgap) : 0;
X switch( mode(*xgap) )
X {
X case NO_MODE: Error(INTERN, no_fpos, "ExtraGap: NO_MODE");
X res = 0;
X break;
X
X case ADD_HYPH:
X case HYPH_MODE:
X case EDGE_MODE: res = 0;
X break;
X
X case MARK_MODE: res = max(0, w - a - b);
X break;
X
X case OVER_MODE: res = MAX_LEN;
X break;
X
X case KERN_MODE: tmp = max(a, max(b, w));
X res = dir == BACK ? tmp - b : tmp - a;
X break;
X
X case TAB_MODE: res = 0;
X break;
X
X default: Error(INTERN, no_fpos, "ExtraGap: %d", mode(*xgap));
X res = 0;
X break;
X
X }
X debug5(DGW, DD, "ExtraGap( %s, %s, %s, %s ) = %s", EchoLength(a),
X EchoLength(b), EchoGap(xgap), Image(dir), EchoLength(res));
X return res;
X} /* end ExtraGap */


X
X
X/*@@**************************************************************************/
X/* */

X/* LENGTH ActualGap(a, b, c, xgap, f, mk) */
X/* */
X/* Returns the actual separation between the marks of an object of size */
X/* (?, a) and an object of size (b, c) separated by gap *xgap in a frame */
X/* of size f; the first object lies at mk in the frame (0 <= mk <= f). */
X/* */
X/*****************************************************************************/
X
XLENGTH ActualGap(a, b, c, xgap, f, mk)
XLENGTH a, b, c; GAP *xgap; LENGTH f, mk;
X{ LENGTH res; int w, w2;
X switch( units(*xgap) )
X {
X case FIXED_UNIT: w = width(*xgap);
X break;
X
X case FRAME_UNIT: w = (width(*xgap) * f) / FR;
X break;
X
X case AVAIL_UNIT: w = (width(*xgap) * (f - b - c)) / FR;
X w = max(w, 0);
X break;
X
X case NEXT_UNIT: w = width(*xgap) * (b + c) / FR;
X break;
X
X default: Error(INTERN, no_fpos, "ActualGap: units = %d",
X units(*xgap));
X break;
X }
X switch( mode(*xgap) )
X {
X case NO_MODE: Error(INTERN, no_fpos, "ActualGap: NO_MODE");
X w2 = 0;
X break;
X
X case ADD_HYPH:
X case HYPH_MODE:
X case EDGE_MODE: w2 = a + w + b;
X break;
X
X case MARK_MODE: w2 = max( w, a + b );
X break;
X
X case OVER_MODE: w2 = w;
X break;
X
X case KERN_MODE: w2 = max( max(a, b), w);
X break;
X
X case TAB_MODE: w2 = w + b - mk;
X w2 = max( w2, a + b );
X break;
X
X default: Error(INTERN,no_fpos,"ActualGap: mode %d", mode(*xgap));
X w2 = 0;
X break;
X }
X res = min(MAX_LEN, w2);
X debug6(DGW, D, "ActualGap( _,%s %s %s,%s; %s ) = %s",
X EchoLength(a), EchoGap(xgap), EchoLength(b),
X EchoLength(c), EchoLength(f), EchoLength(res) );
X return res;
X} /* end ActualGap */


X
X
X/*@@**************************************************************************/
X/* */

X/* unsigned char *EchoGap(xgap) */
X/* */
X/* Returns a static string showing the indicated xgap. */


X/* */
X/*****************************************************************************/
X#if DEBUG_ON
X

Xunsigned char *EchoGap(xgap)
XGAP *xgap;
X{ unsigned char *letter = (unsigned char *) "?ehxokt"; unsigned char c;


X static unsigned char buff[20];

X assert( mode(*xgap) <= 6, "EchoGap: mode(*xgap)" );
X c = letter[mode(*xgap)];
X switch( units(*xgap) )
X {
X case 0: sprintf(buff, "(none)%c", c);
X break;
X
X case FIXED_UNIT: sprintf(buff, "%.1fc%c", (float) width(*xgap) / CM, c);
X break;
X
X case NEXT_UNIT: sprintf(buff, "%.1fw%c", (float) width(*xgap) / FR, c);
X break;
X
X case FRAME_UNIT: sprintf(buff, "%.1fb%c", (float) width(*xgap) / FR, c);
X break;
X
X case AVAIL_UNIT: sprintf(buff, "%.1fr%c", (float) width(*xgap) / FR, c);
X break;
X
X case DEG_UNIT: sprintf(buff, "%.1fd", (float) width(*xgap) / DG);
X break;
X
X default: Error(INTERN, no_fpos, "EchoGap: %d", units(*xgap));
X break;
X
X }
X return buff;
X} /* end EchoGap */
X#endif
END_OF_FILE
if test 14449 -ne `wc -c <'lout/z17.c'`; then
echo shar: \"'lout/z17.c'\" unpacked with wrong size!
fi
# end of 'lout/z17.c'
fi
echo shar: End of archive 21 \(of 30\).
cp /dev/null ark21isdone

Jeff Kingston

unread,
Jun 1, 1993, 11:04:09 PM6/1/93
to
Submitted-by: je...@joyce.cs.su.oz.au (Jeff Kingston)
Posting-number: Volume 37, Issue 120
Archive-name: lout/part22
Environment: UNIX

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: lout/doc/tr.impl/s5.2 lout/font0/TimesBolIta.AFM
# lout/gnu.gpl lout/z09.c lout/z21.c lout/z26.c
# Wrapped by kent@sparky on Sun May 30 19:44:00 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 22 (of 30)."'
if test -f 'lout/doc/tr.impl/s5.2' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.impl/s5.2'\"
else
echo shar: Extracting \"'lout/doc/tr.impl/s5.2'\" \(14105 characters\)
sed "s/^X//" >'lout/doc/tr.impl/s5.2' <<'END_OF_FILE'
X@SubSection
X @Tag { flushing }
X @Title { The galley flushing algorithm }
X@Begin
X@PP
XGalley components are promoted one by one into the point of appearance in
Xthe dynamic parent galley, then carried along with it, ultimately to the
Xroot galley and the output file. This process is called @I galley
X{@I flushing}: the galleys are rivers running together to the sea, and
Xeach component is a drop of water.
X@PP
XHere is a snapshot of a small dynamic tree, based on the @Code "@PageList"
Xdefinitions of Section {@NumberOf recursion}:
X@ID @Fig {
X
X@I 10p @Font { output file } A:: @Box linestyle { noline } margin { 0c }
X
X||2c
X
X{
X@I 10p @Font { root galley }
X//0.2c
XB:: @Box margin { 0c } linestyle { noline }
X//
X@LittlePage {
X|0.5rt - 1 -
X//1.2vx &2m A small
X//1.2vx @Code "@Galley" * C:: @Box margin { 0.01c } linestyle { noline }
X//1rt @Code "@FootSect"
X}
X//
X@Box margin { 0.3c } 2.8c @Wide 8p @Font @Code "@PageList 2"
X}
X
X||2c
X
X{
X//0.9c @I 10p @Font { body text }
X//0.2c D:: @Box margin { 0.3c } 2.8c @Wide 8p @Font paragraph
X// @Box margin { 0.3c } 2.8c @Wide 8p @Font { of text. }
X// @Box margin { 0.3c } 2.8c @Wide @Code 8p @Font "@Input"
X}
X
X// @Arrow from { B@W } to { A@E }
X// @Arrow from { D@W } to { C@E }
X
X}
XThe components of the body text galley are lines, except for the special
Xreceptive symbol @Code "@Input" which is a placeholder for as yet unread
Xinput (Section {@NumberOf lookahead}). The components of the root galley are
Xpages, except for the concluding unexpanded invocation of {@Code "@PageList"},
Xwhich is an inexhaustible source of more pages, expanded on demand.
X@PP
XThe concrete data structure used by Basser Lout permits the galley
Xflushing algorithm to navigate the dynamic tree and find significant
Xfeatures quickly:
X@ID 10p @Font @Fig maxlabels { 100 } {
X
XA:: @Ellipse @I { HEAD }
X
X||1.5c
X
X@OneCol @OneRow {
XB:: @Ellipse @I { RECEIVING * }
X// @Arrow from { A@CTR ++ {A@CTR @Angle B@W A@CIRCUM} } to { B@W }
X//0.6c
XC:: @Ellipse @I { RECEPTIVE }
X// @Arrow from { A@CTR ++ {A@CTR @Angle C@W A@CIRCUM} } to { C@W }
X//0.6c
XD:: @Box margin { 0c } linestyle { noline }
X// @Arrow from { A@CTR ++ {A@CTR @Angle D@NW A@CIRCUM} } to { D@NW }
X//
X@LittlePage {
X|0.5rt - 1 -
X//1.2vx &2m A small
X//1.2vx E:: @Box margin { 0c } linestyle { noline } @Code "@Galley "
X//1rt F:: @Box margin { 0c } linestyle { noline } @Code "@FootSect "
X}
X// @FunnyArrow arrow { forward } from { B@E } to { E@E }
X// @FunnyArrow arrow { forward } from { C@E } to { F@E }
X//0.6c
XC:: @Ellipse @I { GAP }
X// @Arrow from { A@CTR ++ {A@CTR @Angle C@W A@CIRCUM} } to { C@W }
X//0.6c
XC:: @Ellipse @I { RECEPTIVE }
X// @Arrow from { A@CTR ++ {A@CTR @Angle C@W A@CIRCUM} } to { C@W }
X//0.6c
XD:: @Box margin { 0.3c } 2.8c @Wide 8p @Font @Code "@PageList 2"
X// @Arrow from { A@CTR ++ {A@CTR @Angle D@NW A@CIRCUM} } to { D@NW }
X// @FunnyArrow from { C@E } to { D@W ++ { 1.8 cm 0 } }
X}
X
X||1.0c
X
XA:: @Ellipse @I { HEAD }
X& @Arrow from { B@E } to { A@W }
X
X||1.5c
X
X@OneCol @OneRow {
XB:: @Box margin { 0.3c } 2.8c @Wide 8p @Font paragraph
X// @Arrow from { A@CTR ++ {A@CTR @Angle B@W A@CIRCUM} } to { B@W }
X//0.6c
XB:: @Ellipse @I { GAP }
X// @Arrow from { A@CTR ++ {A@CTR @Angle B@W A@CIRCUM} } to { B@W }
X//0.6c
XB:: @Box margin { 0.3c } 2.8c @Wide 8p @Font { of text. }
X// @Arrow from { A@CTR ++ {A@CTR @Angle B@NW A@CIRCUM} } to { B@NW }
X//0.6c
XB:: @Ellipse @I { GAP }
X// @Arrow from { A@CTR ++ {A@CTR @Angle B@W A@CIRCUM} } to { B@W }
X//0.6c
XB:: @Ellipse @I { RECEPTIVE }
X// @Arrow from { A@CTR ++ {A@CTR @Angle B@W A@CIRCUM} } to { B@W }
X//0.6c
XC:: @Box margin { 0.3c } 2.8c @Wide 8p @Font @Code "@Input"
X// @Arrow from { A@CTR ++ {A@CTR @Angle C@NW A@CIRCUM} } to { C@NW }
X// @FunnyArrow from { B@E } to { C@W ++ { 1.2 cm 0 } }
X}
X
X}
XEach galley has a @Eq { HEAD } node whose children are its component
Xobjects, separated by @Eq { GAP } nodes recording the inter-component
Xgaps.
X@PP
XEach component is preceded by zero or more @I {galley index nodes} of
Xvarious types. Every receptive symbol has a @Eq { RECEPTIVE } index pointing
Xto it, so that it can be found without searching through its
Xcomponent. If the symbol is currently the target of a galley, it has a
X@Eq { RECEIVING } index instead which is also linked to the incoming
Xgalley. Galleys that are currently without a target are linked to the
Xdynamic tree by @Eq { UNATTACHED } galley indexes, either just after their
Xmost recent target if there has been one, or else at their point of
Xinvocation.
X@PP
XEach galley should be thought of as a concurrent process, although the
Ximplementation in C uses coroutines implemented by procedures. A galley
Xmay promote its first component only if it has a target, sufficient space
Xis available at the target to receive the component, and the component
Xcontains no receptive symbols. This last condition seems to be the key
Xto galley synchronization: it forces a bottom-up promotion regime,
Xpreventing pages from flushing to output before text flushes into them,
Xfor example.
X@PP
XEach galley contains a number of binary semaphores, shown as asterisks
Xin our snapshots when set. At any given moment, a galley process is
Xeither running or else is suspended on one of its own semaphores. The
X@Eq { HEAD } node contains a semaphore which is set when the galley has tried
Xto find a target and failed. Each receptive symbol has a semaphore
Xwhich is set when that symbol is preventing the first component from
Xbeing promoted.
X@PP
XFor example, in the snapshot at the beginning of this section, the root
Xgalley is suspended on the @Code "@Galley" symbol, but the text galley
Xis running. It will suspend on the @Code "@Input" symbol after the
Xfirst two components are promoted.
X@PP
XEvery galley {@I G}, be it a list of pages, body text, a footnote, or
Xwhatever, executes the following algorithm in parallel with every other
Xgalley:
X@DP
X1. Initially @I G is unattached. Search forwards or backwards from its
X@Eq { UNATTACHED } index as required, to find a receptive symbol @I S which
Xcan expand to reveal a target for {@I G}.
X@DP
X2. If no @I S can be found, suspend on the attachment semaphore. Resume
Xlater from step 1.
X@DP
X3. Expand @I S to reveal the target of {@I G}. Preserve {@I S}'s
Xsemaphore by moving it to the first receptive symbol within the
Xexpansion of {@I S}.
X@DP
X4. Calculate the available width and height at the target, and if
X@I G is still a pure parse tree, use the environment attached to @I G
Xand the style information from the target to evaluate @I G as in
XSection {@NumberOf functional}.
X@DP
X5. Examine the components of @I G one by one. For each component there
Xare three possibilities:
X@PP
X@I ACCEPT. If the component fits into the available space, and has
Xno other problems, then promote it into the target. If this is the
Xfirst component promoted into this target, and @I G is a forcing
Xgalley (Section {@NumberOf lookahead}), delete every receptive symbol
Xpreceding the target in the parent galley. If @I G is the root galley,
Xrender the component on the output file and dispose it;
X@PP
X@I REJECT. If the component is too large for the available space, or a
X@Eq { FOLLOWS } index (described below) forbids its promotion into this
Xtarget, then detach @I G from the target. If this was the first component
Xat this target, @I S has been a complete failure, so undo step 3 (Basser
XLout is not able to undo step 4); otherwise delete the target. Return to
Xstep 1 and continue immediately;
X@PP
X@I SUSPEND. If the component contains a receptive symbol, it cannot be
Xpromoted yet. If this symbol is the target of a galley that was written
Xto an auxiliary file on a previous run, read in that galley and flush
Xit. Otherwise suspend on the receptive symbol's semaphore; resume later
Xfrom step 4.
X@DP
X6. Terminate when the galley is empty.
X@DP
XAt various points in this algorithm, receptive symbols (and their
Xsemaphores) are deleted in the dynamic parent galley, possibly
Xpermitting it to resume flushing. When this happens, Basser Lout resumes
Xthe parent immediately after @I G suspends or terminates. Also,
Xwhenever a component is promoted, any child galleys connected to
Xit by @Eq { UNATTACHED } indexes must be resumed, since these
Xgalleys may be able to find a target now. A good example of this
Xsituation occurs when a line of body text with one or more footnotes
Xis promoted onto a page. Basser Lout gives priority to such children,
Xsuspending @I G while each is given a chance to flush.
X@PP
XBasser Lout searches for the first target of @I G only in regions of the
Xdynamic tree that will clearly precede or follow {@I G}'s invocation
Xpoint in the final printed document, whichever is specified in the
X@Code into clause; subsequent targets are sought later in the same
Xgalley as the first. An exception to this rule, whose necessity will
Xbe made clear later, is that a first @Code following target will be
Xsought within a dynamic sibling galley preceding {@I G}'s invocation
Xpoint:
X@ID 10p @Font @Fig {
X
X{
X@I { dynamic parent }
X//0.2c
X@Box 2.8c @Wide 4.5c @High
X{
X //0.5c A:: @Box margin { 0c } linestyle { noline } @Code "@XTarget"
X //1.0c C:: @Box margin { 0c } linestyle { noline } @Eq { UNATTACHED }
X //1.3c @Code "@XTarget"
X}
X}
X
X||1.5c
X
X{
X//0.6c
XB:: @Box margin {0c} linestyle {noline} @Code "X into { @XTarget&&following }"
X//0.2c
X@Box 2.8c @Wide 1.5c @High { //0.8c @Code "@GTarget" }
X//1.0c
XD:: @Box margin {0c} linestyle {noline} @Code "G into { @GTarget&&following }"
X//0.2c
X@Box 2.8c @Wide 2.5c @High {}
X}
X
X// @Arrow from { A@E ++ {0.2 cm 0} } to { B@W -- {0.2 cm 0} }
X// @Arrow from { C@E ++ {0.2 cm 0} } to { D@W -- {0.2 cm 0} }
X
X}
XHere @I G will find the @Code "@GTarget" target within {@I X}. This is
Xdangerous, since if the first component of @I G is then promoted via
X@I X into the first {@Code "@XTarget"} rather than into the second,
X{@I G}'s target will not appear later in the final printed document than
Xits invocation point, as required by the @Code into clause.
X@PP
XAccordingly, when such a target is chosen, two special galley indexes
Xare inserted and linked together: a @Eq { PRECEDES } index at {@I G}'s
Xinvocation point, and a @Eq { FOLLOWS } index at the first component of
X{@I G}. The algorithm checks before promoting any @Eq { FOLLOWS } index
Xthat its promotion would not place it earlier than the corresponding
X@Eq { PRECEDES } index in the same galley, and rejects the component if
Xit would. Since @Eq { PRECEDES } and @Eq { FOLLOWS } indexes are rarely used,
Xthis check can be implemented by linear search.
X@PP
XWhen two components are separated by {@Code "/"}, as opposed to the more
Xusual {@Code "//"}, each influences the horizontal position of the
Xother. Because of this, the @I SUSPEND action is in fact taken if a
Xreceptive symbol occurs in any component separated from the first by
X{@Code "/"} operators only. Again, linear search forwards to the first
X{@Code "//"} suffices for this check.
X@PP
XA good illustration of these unusual cases is afforded by the
X@Code "@Align" symbols from the standard DocumentLayout package. These
Xare used to produce displayed equations, aligned on their equals signs
Xdespite being separated by arbitrary body text.
X@PP
XThe @Code "@Align" symbols are packaged neatly for the convenience of
Xthe non-expert user, but we will show just the essence of the
Ximplementation here. First, an @Code "@AlignList" galley is created
Xwhich contains an infinite supply of @Code "@AlignPlace" receptive
Xsymbols separated by @Code "/" operators:
X@ID @Fig {
X
X{
X@I { body text galley }
X//0.2c
X@Box 2.8c @Wide 4.0c @High
X{ //1.5c
X A:: @Box margin { 0c } linestyle { noline } @Code "@Galley"
X}
X}
X
X||1.5c
X
X{
X//2.4c
XB:: @Box margin { 0c } linestyle { noline } @Code "@AlignList"
X//0.2c
X@Box {
X @Code "@AlignPlace"
X//1vx @Code "@AlignPlace"
X//1vx @Code "..."
X//1vx @Code "@EndAlignList"
X}
X
X}
X
X// @Arrow from { A@E ++ {0.2 cm 0} } to { B@W -- {0.2 cm 0} }
X}
XThen equations like
X@ID @ShowMarks @Eq { f(x) ^= g(x) + 2 }
Xare created and sent to @Code "@AlignPlace&&following" targets. They
Xcollect in the @Code "@AlignList" galley and are aligned there:
X@ID @Fig {
X
X{
X@I { body text galley }
X//0.2c
X@Box 2.8c @Wide 4.0c @High
X{ //1.5c
X A:: @Box margin { 0c } linestyle { noline } @Code "@Galley"
X}
X}
X
X||1.5c
X
X{
X//2.4c
XB:: @Box margin { 0c } linestyle { noline } @Code "@AlignList"
X//0.2c
X@Box {
X @Line linestyle { dashed } from { xmark ysize } to { xmark 0 }
X {
X @Eq { f(x) ^= g(x) + 2 }
X /1vx @Eq { f(x) - g(x) ^= 2 }
X /1vx @Code "..."
X /1vx @Code "@EndAlignList"


X }
X}
X
X}
X

X// @Arrow from { A@E ++ {0.2 cm 0} } to { B@W -- {0.2 cm 0} }
X}
XThe @Code "@AlignList" galley does not flush, because its first
Xcomponent is connected to a receptive symbol by @Code "/" operators.
X@PP
XAfter the last equation, an empty forcing galley is sent to
X{@Code "@EndAlignList"}, deleting the two remaining receptive symbols from
Xthe @Code "@AlignList" galley and permitting it to flush. @Eq { FOLLOWS }
Xindexes ensure that each equation finds a target placed in the body text
Xjust after its point of invocation, so the equations return, aligned, to
Xapproximately the points where they were invoked. Notice that the flushing
Xof body text is suspended until the list of equations is completed, as it
Xmust be, since the horizontal position of the first equation cannot
Xbe known until the last equation is added to the list.
X@PP
XLayout quality can occasionally be improved by rejecting a component
Xthat could be promoted -- for example, a component of body text that
Xcarries a footnote too large to fit on the current page. Since Lout
Xdoes not specify how breaking decisions are made, beyond the basic
Xconstraints imposed by available space and @Code into clauses, in
Xprinciple such high quality breaking could be added to the
Ximplementation with no change to the language. However, the
Xgenerality of the galley flushing algorithm, and its already
Xconsiderable complexity, make this a daunting problem in practice,
Xalthough a fascinating one. @TeX [9], with its unnested
Xset of `floating insertions' clearly identifiable as each page is begun,
Xhas the advantage in this respect.
X@End @SubSection
END_OF_FILE
if test 14105 -ne `wc -c <'lout/doc/tr.impl/s5.2'`; then
echo shar: \"'lout/doc/tr.impl/s5.2'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.impl/s5.2'
fi
if test -f 'lout/font0/TimesBolIta.AFM' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/font0/TimesBolIta.AFM'\"
else
echo shar: Extracting \"'lout/font0/TimesBolIta.AFM'\" \(14435 characters\)
sed "s/^X//" >'lout/font0/TimesBolIta.AFM' <<'END_OF_FILE'


XStartFontMetrics 2.0
XComment Copyright (c) 1984 Adobe Systems Incorporated. All Rights Reserved.

XComment Creation Date:Wed May 27 16:42:35 PDT 1987
XFontName Times-BoldItalic
XEncodingScheme AdobeStandardEncoding
XFullName Times Bold Italic
XFamilyName Times
XWeight Bold
XItalicAngle -15.0


XIsFixedPitch false
XUnderlinePosition -98
XUnderlineThickness 54

XVersion 001.004
XNotice Times is a registered trademark of Allied Corporation.
XFontBBox -168 -232 1014 894
XCapHeight 662
XXHeight 458
XDescender -203
XAscender 682
XStartCharMetrics 228
XC 32 ; WX 250 ; N space ; B 0 0 0 0 ;
XC 33 ; WX 389 ; N exclam ; B 66 -13 367 676 ;
XC 34 ; WX 555 ; N quotedbl ; B 142 367 549 693 ;
XC 35 ; WX 500 ; N numbersign ; B 4 0 496 662 ;
XC 36 ; WX 500 ; N dollar ; B -20 -101 492 723 ;
XC 37 ; WX 833 ; N percent ; B 39 -8 784 685 ;
XC 38 ; WX 778 ; N ampersand ; B 41 -19 727 676 ;
XC 39 ; WX 333 ; N quoteright ; B 80 362 282 675 ;
XC 40 ; WX 333 ; N parenleft ; B 28 -179 340 676 ;
XC 41 ; WX 333 ; N parenright ; B -44 -179 268 676 ;
XC 42 ; WX 500 ; N asterisk ; B 56 244 445 676 ;
XC 43 ; WX 570 ; N plus ; B 33 0 537 505 ;
XC 44 ; WX 250 ; N comma ; B -10 -181 192 132 ;
XC 45 ; WX 333 ; N hyphen ; B 33 167 299 282 ;
XC 46 ; WX 250 ; N period ; B 23 -13 170 133 ;
XC 47 ; WX 278 ; N slash ; B -11 -18 289 682 ;
XC 48 ; WX 500 ; N zero ; B 17 -13 472 676 ;
XC 49 ; WX 500 ; N one ; B 5 0 415 676 ;
XC 50 ; WX 500 ; N two ; B -27 0 441 676 ;
XC 51 ; WX 500 ; N three ; B -15 -13 445 676 ;
XC 52 ; WX 500 ; N four ; B -15 0 498 676 ;
XC 53 ; WX 500 ; N five ; B -11 -13 482 662 ;
XC 54 ; WX 500 ; N six ; B 23 -13 504 676 ;
XC 55 ; WX 500 ; N seven ; B 51 0 519 662 ;
XC 56 ; WX 500 ; N eight ; B 3 -13 471 676 ;
XC 57 ; WX 500 ; N nine ; B -12 -13 470 676 ;
XC 58 ; WX 333 ; N colon ; B 52 -13 291 458 ;
XC 59 ; WX 333 ; N semicolon ; B 13 -181 291 458 ;
XC 60 ; WX 570 ; N less ; B 31 -14 540 524 ;
XC 61 ; WX 570 ; N equal ; B 33 116 537 401 ;
XC 62 ; WX 570 ; N greater ; B 31 -14 540 524 ;
XC 63 ; WX 500 ; N question ; B 78 -13 465 676 ;
XC 64 ; WX 832 ; N at ; B -9 -150 838 691 ;
XC 65 ; WX 667 ; N A ; B -51 0 602 676 ;
XC 66 ; WX 667 ; N B ; B -24 0 618 662 ;
XC 67 ; WX 667 ; N C ; B 22 -18 660 677 ;
XC 68 ; WX 722 ; N D ; B -31 0 693 662 ;
XC 69 ; WX 667 ; N E ; B -27 0 646 662 ;
XC 70 ; WX 667 ; N F ; B -20 0 646 662 ;
XC 71 ; WX 722 ; N G ; B 21 -18 699 676 ;
XC 72 ; WX 778 ; N H ; B -24 0 791 662 ;
XC 73 ; WX 389 ; N I ; B -22 0 412 662 ;
XC 74 ; WX 500 ; N J ; B -45 -98 519 662 ;
XC 75 ; WX 667 ; N K ; B -31 0 685 662 ;
XC 76 ; WX 611 ; N L ; B -22 0 584 662 ;
XC 77 ; WX 889 ; N M ; B -29 -12 907 662 ;
XC 78 ; WX 722 ; N N ; B -27 -18 740 662 ;
XC 79 ; WX 722 ; N O ; B 27 -18 684 676 ;
XC 80 ; WX 611 ; N P ; B -27 0 608 662 ;
XC 81 ; WX 722 ; N Q ; B 27 -203 684 676 ;
XC 82 ; WX 667 ; N R ; B -29 0 616 662 ;
XC 83 ; WX 556 ; N S ; B 6 -18 524 676 ;
XC 84 ; WX 611 ; N T ; B 39 0 632 662 ;
XC 85 ; WX 722 ; N U ; B 66 -18 736 662 ;
XC 86 ; WX 667 ; N V ; B 48 -18 692 662 ;
XC 87 ; WX 889 ; N W ; B 48 -18 914 662 ;
XC 88 ; WX 667 ; N X ; B -24 0 687 662 ;
XC 89 ; WX 611 ; N Y ; B 46 0 625 662 ;
XC 90 ; WX 611 ; N Z ; B -1 0 594 662 ;
XC 91 ; WX 333 ; N bracketleft ; B -7 -157 388 682 ;
XC 92 ; WX 278 ; N backslash ; B 1 0 465 682 ;
XC 93 ; WX 333 ; N bracketright ; B -65 -157 330 682 ;
XC 94 ; WX 570 ; N asciicircum ; B 34 259 536 662 ;
XC 95 ; WX 500 ; N underscore ; B 0 -127 500 -89 ;
XC 96 ; WX 333 ; N quoteleft ; B 117 363 319 676 ;
XC 97 ; WX 500 ; N a ; B 9 -14 480 458 ;
XC 98 ; WX 500 ; N b ; B 20 -13 473 682 ;
XC 99 ; WX 444 ; N c ; B 25 -13 418 458 ;
XC 100 ; WX 500 ; N d ; B 9 -13 541 682 ;
XC 101 ; WX 444 ; N e ; B 25 -13 413 458 ;
XC 102 ; WX 333 ; N f ; B -146 -203 460 682 ; L i fi ; L l fl ;
XC 103 ; WX 500 ; N g ; B -27 -203 498 458 ;
XC 104 ; WX 556 ; N h ; B 12 -13 518 682 ;
XC 105 ; WX 278 ; N i ; B 24 -13 283 676 ;
XC 106 ; WX 278 ; N j ; B -152 -203 311 676 ;
XC 107 ; WX 500 ; N k ; B 10 -13 511 682 ;
XC 108 ; WX 278 ; N l ; B 30 -13 311 682 ;
XC 109 ; WX 778 ; N m ; B 16 -13 744 458 ;
XC 110 ; WX 556 ; N n ; B 24 -13 518 458 ;
XC 111 ; WX 500 ; N o ; B 27 -13 467 458 ;
XC 112 ; WX 500 ; N p ; B -79 -203 481 458 ;
XC 113 ; WX 500 ; N q ; B 21 -203 486 459 ;
XC 114 ; WX 389 ; N r ; B 9 0 415 458 ;
XC 115 ; WX 389 ; N s ; B 16 -13 364 459 ;
XC 116 ; WX 278 ; N t ; B 15 -14 304 592 ;
XC 117 ; WX 556 ; N u ; B 47 -13 520 458 ;
XC 118 ; WX 444 ; N v ; B 50 -13 432 458 ;
XC 119 ; WX 667 ; N w ; B 50 -13 642 458 ;
XC 120 ; WX 500 ; N x ; B -5 -13 498 458 ;
XC 121 ; WX 444 ; N y ; B -60 -203 423 458 ;
XC 122 ; WX 389 ; N z ; B -24 -58 394 448 ;
XC 123 ; WX 348 ; N braceleft ; B 30 -154 380 686 ;
XC 124 ; WX 220 ; N bar ; B 70 0 151 682 ;
XC 125 ; WX 348 ; N braceright ; B -31 -161 319 679 ;
XC 126 ; WX 570 ; N asciitilde ; B 33 158 537 353 ;
XC 161 ; WX 389 ; N exclamdown ; B 20 -232 320 458 ;
XC 162 ; WX 500 ; N cent ; B 50 -142 443 570 ;
XC 163 ; WX 500 ; N sterling ; B -32 -13 505 676 ;
XC 164 ; WX 167 ; N fraction ; B -161 0 327 662 ;
XC 165 ; WX 500 ; N yen ; B -15 0 565 662 ;
XC 166 ; WX 500 ; N florin ; B -86 -154 530 682 ;
XC 167 ; WX 500 ; N section ; B 36 -143 454 676 ;
XC 168 ; WX 500 ; N currency ; B -3 110 503 612 ;
XC 169 ; WX 278 ; N quotesingle ; B 126 367 295 693 ;
XC 170 ; WX 500 ; N quotedblleft ; B 57 363 513 676 ;
XC 171 ; WX 500 ; N guillemotleft ; B 21 33 474 416 ;
XC 172 ; WX 333 ; N guilsinglleft ; B 42 33 310 416 ;
XC 173 ; WX 333 ; N guilsinglright ; B 22 38 290 421 ;
XC 174 ; WX 556 ; N fi ; B -157 -203 538 682 ;
XC 175 ; WX 556 ; N fl ; B -149 -203 577 682 ;
XC 177 ; WX 500 ; N endash ; B -11 176 511 266 ;
XC 178 ; WX 500 ; N dagger ; B 90 -146 489 676 ;
XC 179 ; WX 500 ; N daggerdbl ; B 11 -143 487 675 ;
XC 180 ; WX 250 ; N periodcentered ; B 51 179 200 328 ;
XC 182 ; WX 500 ; N paragraph ; B 61 -189 592 682 ;
XC 183 ; WX 350 ; N bullet ; B 50 175 300 425 ;
XC 184 ; WX 333 ; N quotesinglbase ; B 66 -181 268 132 ;
XC 185 ; WX 500 ; N quotedblbase ; B -57 -181 398 132 ;
XC 186 ; WX 500 ; N quotedblright ; B 56 362 509 675 ;
XC 187 ; WX 500 ; N guillemotright ; B 20 38 473 421 ;
XC 188 ; WX 1000 ; N ellipsis ; B 93 -13 906 133 ;
XC 189 ; WX 1000 ; N perthousand ; B 7 -49 985 699 ;
XC 191 ; WX 500 ; N questiondown ; B 30 -203 417 487 ;
XC 193 ; WX 333 ; N grave ; B 115 511 325 690 ;
XC 194 ; WX 333 ; N acute ; B 168 511 405 690 ;
XC 195 ; WX 333 ; N circumflex ; B 70 510 394 682 ;
XC 196 ; WX 333 ; N tilde ; B 69 530 424 648 ;
XC 197 ; WX 333 ; N macron ; B 81 547 420 616 ;
XC 198 ; WX 333 ; N breve ; B 98 511 413 671 ;
XC 199 ; WX 333 ; N dotaccent ; B 180 519 308 648 ;
XC 200 ; WX 333 ; N dieresis ; B 85 519 424 648 ;
XC 202 ; WX 333 ; N ring ; B 141 466 352 676 ;
XC 203 ; WX 333 ; N cedilla ; B 32 -216 264 5 ;
XC 205 ; WX 333 ; N hungarumlaut ; B 28 538 339 750 ;
XC 206 ; WX 333 ; N ogonek ; B -36 -173 193 44 ;
XC 207 ; WX 333 ; N caron ; B 109 511 437 683 ;
XC 208 ; WX 1000 ; N emdash ; B -14 176 1014 266 ;
XC 225 ; WX 944 ; N AE ; B -41 0 931 662 ;
XC 227 ; WX 266 ; N ordfeminine ; B -24 286 291 676 ;
XC 232 ; WX 611 ; N Lslash ; B -22 0 584 662 ;
XC 233 ; WX 722 ; N Oslash ; B 27 -124 684 754 ;
XC 234 ; WX 944 ; N OE ; B 23 -8 936 670 ;
XC 235 ; WX 300 ; N ordmasculine ; B 1 286 300 676 ;
XC 241 ; WX 722 ; N ae ; B 15 -13 685 458 ;
XC 245 ; WX 278 ; N dotlessi ; B 27 -13 260 458 ;
XC 248 ; WX 278 ; N lslash ; B 12 -13 326 682 ;
XC 249 ; WX 500 ; N oslash ; B 27 -118 467 556 ;
XC 250 ; WX 722 ; N oe ; B 26 -13 687 458 ;
XC 251 ; WX 500 ; N germandbls ; B -168 -203 497 682 ;
XC -1 ; WX 667 ; N Aacute ; B -51 0 602 894 ;
XC -1 ; WX 667 ; N Acircumflex ; B -51 0 602 886 ;
XC -1 ; WX 667 ; N Adieresis ; B -51 0 602 852 ;
XC -1 ; WX 667 ; N Agrave ; B -51 0 602 894 ;
XC -1 ; WX 667 ; N Aring ; B -51 0 602 880 ;
XC -1 ; WX 667 ; N Atilde ; B -51 0 602 852 ;
XC -1 ; WX 667 ; N Ccedilla ; B 22 -216 660 677 ;
XC -1 ; WX 667 ; N Eacute ; B -27 0 646 894 ;
XC -1 ; WX 667 ; N Ecircumflex ; B -27 0 646 886 ;
XC -1 ; WX 667 ; N Edieresis ; B -27 0 646 852 ;
XC -1 ; WX 667 ; N Egrave ; B -27 0 646 894 ;
XC -1 ; WX 722 ; N Eth ; B -31 0 693 662 ;
XC -1 ; WX 389 ; N Iacute ; B -22 0 433 894 ;
XC -1 ; WX 389 ; N Icircumflex ; B -22 0 422 886 ;
XC -1 ; WX 389 ; N Idieresis ; B -22 0 452 852 ;
XC -1 ; WX 389 ; N Igrave ; B -22 0 412 894 ;
XC -1 ; WX 722 ; N Ntilde ; B -27 -18 740 852 ;
XC -1 ; WX 722 ; N Oacute ; B 27 -18 684 894 ;
XC -1 ; WX 722 ; N Ocircumflex ; B 27 -18 684 886 ;
XC -1 ; WX 722 ; N Odieresis ; B 27 -18 684 852 ;
XC -1 ; WX 722 ; N Ograve ; B 27 -18 684 894 ;
XC -1 ; WX 722 ; N Otilde ; B 27 -18 684 852 ;
XC -1 ; WX 556 ; N Scaron ; B 6 -18 549 887 ;
XC -1 ; WX 611 ; N Thorn ; B -27 0 572 662 ;
XC -1 ; WX 722 ; N Uacute ; B 66 -18 736 894 ;
XC -1 ; WX 722 ; N Ucircumflex ; B 66 -18 736 886 ;
XC -1 ; WX 722 ; N Udieresis ; B 66 -18 736 852 ;
XC -1 ; WX 722 ; N Ugrave ; B 66 -18 736 894 ;
XC -1 ; WX 611 ; N Yacute ; B 46 0 625 894 ;
XC -1 ; WX 611 ; N Ydieresis ; B 46 0 625 852 ;
XC -1 ; WX 611 ; N Zcaron ; B -1 0 594 887 ;
XC -1 ; WX 500 ; N aacute ; B 9 -14 489 690 ;
XC -1 ; WX 500 ; N acircumflex ; B 9 -14 480 682 ;
XC -1 ; WX 500 ; N adieresis ; B 9 -14 508 648 ;
XC -1 ; WX 500 ; N agrave ; B 9 -14 480 690 ;
XC -1 ; WX 500 ; N aring ; B 9 -14 480 676 ;
XC -1 ; WX 500 ; N atilde ; B 9 -14 508 648 ;
XC -1 ; WX 220 ; N brokenbar ; B 70 0 151 682 ;
XC -1 ; WX 444 ; N ccedilla ; B 25 -216 418 458 ;
XC -1 ; WX 747 ; N copyright ; B 23 -18 723 676 ;
XC -1 ; WX 400 ; N degree ; B 70 376 370 676 ;
XC -1 ; WX 570 ; N divide ; B 33 0 537 505 ;
XC -1 ; WX 444 ; N eacute ; B 25 -13 461 690 ;
XC -1 ; WX 444 ; N ecircumflex ; B 25 -13 450 682 ;
XC -1 ; WX 444 ; N edieresis ; B 25 -13 480 648 ;
XC -1 ; WX 444 ; N egrave ; B 25 -13 413 690 ;
XC -1 ; WX 500 ; N eth ; B 27 -13 498 682 ;
XC -1 ; WX 278 ; N iacute ; B 27 -13 378 690 ;
XC -1 ; WX 278 ; N icircumflex ; B 27 -13 367 682 ;
XC -1 ; WX 278 ; N idieresis ; B 27 -13 397 648 ;
XC -1 ; WX 278 ; N igrave ; B 27 -13 298 690 ;
XC -1 ; WX 606 ; N logicalnot ; B 51 120 555 401 ;
XC -1 ; WX 606 ; N minus ; B 51 210 555 300 ;
XC -1 ; WX 576 ; N mu ; B -62 -210 522 458 ;
XC -1 ; WX 570 ; N multiply ; B 33 0 537 504 ;
XC -1 ; WX 556 ; N ntilde ; B 24 -13 536 648 ;
XC -1 ; WX 500 ; N oacute ; B 27 -13 489 690 ;
XC -1 ; WX 500 ; N ocircumflex ; B 27 -13 478 682 ;
XC -1 ; WX 500 ; N odieresis ; B 27 -13 508 648 ;
XC -1 ; WX 500 ; N ograve ; B 27 -13 467 690 ;
XC -1 ; WX 750 ; N onehalf ; B 30 0 720 676 ;
XC -1 ; WX 750 ; N onequarter ; B 30 0 720 676 ;
XC -1 ; WX 300 ; N onesuperior ; B 17 270 283 676 ;
XC -1 ; WX 500 ; N otilde ; B 27 -13 508 648 ;
XC -1 ; WX 570 ; N plusminus ; B 33 0 537 665 ;
XC -1 ; WX 747 ; N registered ; B 23 -18 723 676 ;
XC -1 ; WX 389 ; N scaron ; B 16 -13 465 683 ;
XC -1 ; WX 500 ; N thorn ; B -79 -203 474 682 ;
XC -1 ; WX 750 ; N threequarters ; B 30 0 720 676 ;
XC -1 ; WX 300 ; N threesuperior ; B 0 263 299 676 ;
XC -1 ; WX 1000 ; N trademark ; B 40 272 980 676 ;
XC -1 ; WX 300 ; N twosuperior ; B -2 270 302 676 ;
XC -1 ; WX 556 ; N uacute ; B 47 -13 520 690 ;
XC -1 ; WX 556 ; N ucircumflex ; B 47 -13 520 682 ;
XC -1 ; WX 556 ; N udieresis ; B 47 -13 536 648 ;
XC -1 ; WX 556 ; N ugrave ; B 47 -13 520 690 ;
XC -1 ; WX 444 ; N yacute ; B -60 -203 461 690 ;
XC -1 ; WX 444 ; N ydieresis ; B -60 -203 480 648 ;
XC -1 ; WX 389 ; N zcaron ; B -24 -58 465 683 ;
XEndCharMetrics
XStartKernData
XStartKernPairs 108


X
XKPX A y -74

XKPX A w -74
XKPX A v -74


XKPX A space -55
XKPX A quoteright -74

XKPX A Y -55
XKPX A W -92
XKPX A V -74
XKPX A T -55


X
XKPX F space -18
XKPX F period -129
XKPX F comma -129

XKPX F A -92


X
XKPX L y -37

XKPX L space -37
XKPX L quoteright -55
XKPX L Y -37
XKPX L W -37
XKPX L V -37
XKPX L T -18


X
XKPX P space -37
XKPX P period -129

XKPX P comma -129


XKPX P A -74
X

XKPX R y -18
XKPX R Y -18


XKPX R W -18
XKPX R V -18
X

XKPX T y -37
XKPX T w -37
XKPX T u -37
XKPX T semicolon -74
XKPX T s -92
XKPX T r -37


XKPX T period -92
XKPX T o -92

XKPX T i -37


XKPX T hyphen -92
XKPX T e -92

XKPX T comma -92
XKPX T colon -74
XKPX T c -92
XKPX T a -92
XKPX T O -18


XKPX T A -55
X

XKPX V y -74
XKPX V u -55


XKPX V space -18
XKPX V semicolon -74

XKPX V r -55


XKPX V period -129
XKPX V o -111
XKPX V i -55

XKPX V hyphen -55
XKPX V e -111


XKPX V comma -129
XKPX V colon -74

XKPX V a -111


XKPX V A -74
X

XKPX W y -55
XKPX W u -55
XKPX W space -18
XKPX W semicolon -55
XKPX W r -74
XKPX W period -74
XKPX W o -74


XKPX W i -37
XKPX W hyphen -37

XKPX W e -74
XKPX W comma -74
XKPX W colon -55
XKPX W a -74


XKPX W A -74
X

XKPX Y v -92
XKPX Y u -92
XKPX Y space -37


XKPX Y semicolon -92
XKPX Y q -111

XKPX Y period -74
XKPX Y p -74


XKPX Y o -111
XKPX Y i -55

XKPX Y hyphen -92
XKPX Y e -111
XKPX Y comma -92
XKPX Y colon -92
XKPX Y a -92
XKPX Y A -74


X
XKPX f quoteright 55

XKPX f f -18


X
XKPX one one -55
X

XKPX quoteleft quoteleft -74
X
XKPX quoteright t -37

XKPX quoteright space -74
XKPX quoteright s -74


XKPX quoteright quoteright -74
X

XKPX r quoteright 37
XKPX r period -55
XKPX r comma -55
X
XKPX space Y -18

XKPX space W -18


XKPX space A -37
X

XKPX v period -37
XKPX v comma -37

X
XKPX w period -37
XKPX w comma -37
X

XKPX y period -37
XKPX y comma -37

XEndKernPairs
XEndKernData
XStartComposites 58
XCC Zcaron 2 ; PCC Z 0 0 ; PCC caron 139 204 ;
XCC zcaron 2 ; PCC z 0 0 ; PCC caron 28 0 ;
XCC Scaron 2 ; PCC S 0 0 ; PCC caron 111 204 ;
XCC scaron 2 ; PCC s 0 0 ; PCC caron 28 0 ;
XCC Ccedilla 2 ; PCC C 0 0 ; PCC cedilla 167 0 ;
XCC ccedilla 2 ; PCC c 0 0 ; PCC cedilla 55 0 ;
XCC Yacute 2 ; PCC Y 0 0 ; PCC acute 139 204 ;
XCC yacute 2 ; PCC y 0 0 ; PCC acute 55 0 ;
XCC Ydieresis 2 ; PCC Y 0 0 ; PCC dieresis 139 204 ;
XCC ydieresis 2 ; PCC y 0 0 ; PCC dieresis 55 0 ;
XCC Uacute 2 ; PCC U 0 0 ; PCC acute 194 204 ;
XCC Ucircumflex 2 ; PCC U 0 0 ; PCC circumflex 194 204 ;
XCC Udieresis 2 ; PCC U 0 0 ; PCC dieresis 194 204 ;
XCC Ugrave 2 ; PCC U 0 0 ; PCC grave 194 204 ;
XCC uacute 2 ; PCC u 0 0 ; PCC acute 111 0 ;
XCC ucircumflex 2 ; PCC u 0 0 ; PCC circumflex 111 0 ;
XCC udieresis 2 ; PCC u 0 0 ; PCC dieresis 111 0 ;
XCC ugrave 2 ; PCC u 0 0 ; PCC grave 111 0 ;
XCC Iacute 2 ; PCC I 0 0 ; PCC acute 28 204 ;
XCC Icircumflex 2 ; PCC I 0 0 ; PCC circumflex 28 204 ;
XCC Idieresis 2 ; PCC I 0 0 ; PCC dieresis 28 204 ;
XCC Igrave 2 ; PCC I 0 0 ; PCC grave 28 204 ;
XCC iacute 2 ; PCC dotlessi 0 0 ; PCC acute -27 0 ;
XCC icircumflex 2 ; PCC dotlessi 0 0 ; PCC circumflex -27 0 ;
XCC idieresis 2 ; PCC dotlessi 0 0 ; PCC dieresis -27 0 ;
XCC igrave 2 ; PCC dotlessi 0 0 ; PCC grave -27 0 ;
XCC Eacute 2 ; PCC E 0 0 ; PCC acute 167 204 ;
XCC Ecircumflex 2 ; PCC E 0 0 ; PCC circumflex 167 204 ;
XCC Edieresis 2 ; PCC E 0 0 ; PCC dieresis 167 204 ;
XCC Egrave 2 ; PCC E 0 0 ; PCC grave 167 204 ;
XCC eacute 2 ; PCC e 0 0 ; PCC acute 55 0 ;
XCC ecircumflex 2 ; PCC e 0 0 ; PCC circumflex 55 0 ;
XCC edieresis 2 ; PCC e 0 0 ; PCC dieresis 55 0 ;
XCC eg
END_OF_FILE
echo shar: appended 1 NEWLINEs to \"'lout/font0/TimesBolIta.AFM'\"
if test 14436 -ne `wc -c <'lout/font0/TimesBolIta.AFM'`; then
echo shar: \"'lout/font0/TimesBolIta.AFM'\" unpacked with wrong size!
fi
# end of 'lout/font0/TimesBolIta.AFM'
fi
if test -f 'lout/gnu.gpl' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/gnu.gpl'\"
else
echo shar: Extracting \"'lout/gnu.gpl'\" \(12487 characters\)
sed "s/^X//" >'lout/gnu.gpl' <<'END_OF_FILE'
X GNU GENERAL PUBLIC LICENSE
X Version 1, February 1989
X
X Copyright (C) 1989 Free Software Foundation, Inc.
X 675 Mass Ave, Cambridge, MA 02139, USA
X Everyone is permitted to copy and distribute verbatim copies
X of this license document, but changing it is not allowed.
X
X Preamble
X
X The license agreements of most software companies try to keep users
Xat the mercy of those companies. By contrast, our General Public
XLicense is intended to guarantee your freedom to share and change free
Xsoftware--to make sure the software is free for all its users. The
XGeneral Public License applies to the Free Software Foundation's
Xsoftware and to any other program whose authors commit to using it.
XYou can use it for your programs, too.
X
X When we speak of free software, we are referring to freedom, not
Xprice. Specifically, the General Public License is designed to make
Xsure that you have the freedom to give away or sell copies of free
Xsoftware, that you receive source code or can get it if you want it,
Xthat you can change the software or use pieces of it in new free
Xprograms; and that you know you can do these things.
X
X To protect your rights, we need to make restrictions that forbid
Xanyone to deny you these rights or to ask you to surrender the rights.
XThese restrictions translate to certain responsibilities for you if you
Xdistribute copies of the software, or if you modify it.
X
X For example, if you distribute copies of a such a program, whether
Xgratis or for a fee, you must give the recipients all the rights that
Xyou have. You must make sure that they, too, receive or can get the
Xsource code. And you must tell them their rights.
X
X We protect your rights with two steps: (1) copyright the software, and
X(2) offer you this license which gives you legal permission to copy,
Xdistribute and/or modify the software.
X
X Also, for each author's protection and ours, we want to make certain
Xthat everyone understands that there is no warranty for this free
Xsoftware. If the software is modified by someone else and passed on, we
Xwant its recipients to know that what they have is not the original, so
Xthat any problems introduced by others will not reflect on the original
Xauthors' reputations.
X
X The precise terms and conditions for copying, distribution and
Xmodification follow.
X
X GNU GENERAL PUBLIC LICENSE
X TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
X
X 0. This License Agreement applies to any program or other work which
Xcontains a notice placed by the copyright holder saying it may be
Xdistributed under the terms of this General Public License. The
X"Program", below, refers to any such program or work, and a "work based
Xon the Program" means either the Program or any work containing the
XProgram or a portion of it, either verbatim or with modifications. Each
Xlicensee is addressed as "you".
X
X 1. You may copy and distribute verbatim copies of the Program's source
Xcode as you receive it, in any medium, provided that you conspicuously and
Xappropriately publish on each copy an appropriate copyright notice and
Xdisclaimer of warranty; keep intact all the notices that refer to this
XGeneral Public License and to the absence of any warranty; and give any
Xother recipients of the Program a copy of this General Public License
Xalong with the Program. You may charge a fee for the physical act of
Xtransferring a copy.
X
X 2. You may modify your copy or copies of the Program or any portion of
Xit, and copy and distribute such modifications under the terms of Paragraph
X1 above, provided that you also do the following:
X
X a) cause the modified files to carry prominent notices stating that
X you changed the files and the date of any change; and
X
X b) cause the whole of any work that you distribute or publish, that
X in whole or in part contains the Program or any part thereof, either
X with or without modifications, to be licensed at no charge to all
X third parties under the terms of this General Public License (except
X that you may choose to grant warranty protection to some or all
X third parties, at your option).
X
X c) If the modified program normally reads commands interactively when
X run, you must cause it, when started running for such interactive use
X in the simplest and most usual way, to print or display an
X announcement including an appropriate copyright notice and a notice
X that there is no warranty (or else, saying that you provide a
X warranty) and that users may redistribute the program under these
X conditions, and telling the user how to view a copy of this General
X Public License.
X
X d) You may charge a fee for the physical act of transferring a
X copy, and you may at your option offer warranty protection in
X exchange for a fee.
X
XMere aggregation of another independent work with the Program (or its
Xderivative) on a volume of a storage or distribution medium does not bring
Xthe other work under the scope of these terms.
X
X 3. You may copy and distribute the Program (or a portion or derivative of
Xit, under Paragraph 2) in object code or executable form under the terms of
XParagraphs 1 and 2 above provided that you also do one of the following:
X
X a) accompany it with the complete corresponding machine-readable
X source code, which must be distributed under the terms of
X Paragraphs 1 and 2 above; or,
X
X b) accompany it with a written offer, valid for at least three
X years, to give any third party free (except for a nominal charge
X for the cost of distribution) a complete machine-readable copy of the
X corresponding source code, to be distributed under the terms of
X Paragraphs 1 and 2 above; or,
X
X c) accompany it with the information you received as to where the
X corresponding source code may be obtained. (This alternative is
X allowed only for noncommercial distribution and only if you
X received the program in object code or executable form alone.)
X
XSource code for a work means the preferred form of the work for making
Xmodifications to it. For an executable file, complete source code means
Xall the source code for all modules it contains; but, as a special
Xexception, it need not include source code for modules which are standard
Xlibraries that accompany the operating system on which the executable
Xfile runs, or for standard header files or definitions files that
Xaccompany that operating system.
X
X 4. You may not copy, modify, sublicense, distribute or transfer the
XProgram except as expressly provided under this General Public License.
XAny attempt otherwise to copy, modify, sublicense, distribute or transfer
Xthe Program is void, and will automatically terminate your rights to use
Xthe Program under this License. However, parties who have received
Xcopies, or rights to use copies, from you under this General Public
XLicense will not have their licenses terminated so long as such parties
Xremain in full compliance.
X
X 5. By copying, distributing or modifying the Program (or any work based
Xon the Program) you indicate your acceptance of this license to do so,
Xand all its terms and conditions.
X
X 6. Each time you redistribute the Program (or any work based on the
XProgram), the recipient automatically receives a license from the original
Xlicensor to copy, distribute or modify the Program subject to these
Xterms and conditions. You may not impose any further restrictions on the
Xrecipients' exercise of the rights granted herein.
X
X 7. The Free Software Foundation may publish revised and/or new versions
Xof the General Public License from time to time. Such new versions will
Xbe similar in spirit to the present version, but may differ in detail to
Xaddress new problems or concerns.
X
XEach version is given a distinguishing version number. If the Program
Xspecifies a version number of the license which applies to it and "any
Xlater version", you have the option of following the terms and conditions
Xeither of that version or of any later version published by the Free
XSoftware Foundation. If the Program does not specify a version number of
Xthe license, you may choose any version ever published by the Free Software
XFoundation.
X
X 8. If you wish to incorporate parts of the Program into other free
Xprograms whose distribution conditions are different, write to the author
Xto ask for permission. For software which is copyrighted by the Free
XSoftware Foundation, write to the Free Software Foundation; we sometimes
Xmake exceptions for this. Our decision will be guided by the two goals
Xof preserving the free status of all derivatives of our free software and
Xof promoting the sharing and reuse of software generally.
X
X NO WARRANTY
X
X 9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
XFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
XOTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
XPROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
XOR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
XMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
XTO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
XPROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
XREPAIR OR CORRECTION.
X
X 10. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
XWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
XREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
XINCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
XOUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
XTO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
XYOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
XPROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
XPOSSIBILITY OF SUCH DAMAGES.
X
X END OF TERMS AND CONDITIONS
X
X Appendix: How to Apply These Terms to Your New Programs
X
X If you develop a new program, and you want it to be of the greatest
Xpossible use to humanity, the best way to achieve this is to make it
Xfree software which everyone can redistribute and change under these
Xterms.
X
X To do so, attach the following notices to the program. It is safest to
Xattach them to the start of each source file to most effectively convey
Xthe exclusion of warranty; and each file should have at least the
X"copyright" line and a pointer to where the full notice is found.
X
X <one line to give the program's name and a brief idea of what it does.>
X Copyright (C) 19yy <name of author>
X
X This program is free software; you can redistribute it and/or modify
X it under the terms of the GNU General Public License as published by
X the Free Software Foundation; either version 1, or (at your option)
X any later version.
X
X This program is distributed in the hope that it will be useful,
X but WITHOUT ANY WARRANTY; without even the implied warranty of
X MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
X GNU General Public License for more details.
X
X You should have received a copy of the GNU General Public License
X along with this program; if not, write to the Free Software
X Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
X
XAlso add information on how to contact you by electronic and paper mail.
X
XIf the program is interactive, make it output a short notice like this
Xwhen it starts in an interactive mode:
X
X Gnomovision version 69, Copyright (C) 19xx name of author
X Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
X This is free software, and you are welcome to redistribute it
X under certain conditions; type `show c' for details.
X
XThe hypothetical commands `show w' and `show c' should show the
Xappropriate parts of the General Public License. Of course, the
Xcommands you use may be called something other than `show w' and `show
Xc'; they could even be mouse-clicks or menu items--whatever suits your
Xprogram.
X
XYou should also get your employer (if you work as a programmer) or your
Xschool, if any, to sign a "copyright disclaimer" for the program, if
Xnecessary. Here a sample; alter the names:
X
X Yoyodyne, Inc., hereby disclaims all copyright interest in the
X program `Gnomovision' (a program to direct compilers to make passes
X at assemblers) written by James Hacker.
X
X <signature of Ty Coon>, 1 April 1989
X Ty Coon, President of Vice
X
XThat's all there is to it!
END_OF_FILE
if test 12487 -ne `wc -c <'lout/gnu.gpl'`; then
echo shar: \"'lout/gnu.gpl'\" unpacked with wrong size!
fi
# end of 'lout/gnu.gpl'
fi
if test -f 'lout/z09.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/z09.c'\"
else
echo shar: Extracting \"'lout/z09.c'\" \(14080 characters\)
sed "s/^X//" >'lout/z09.c' <<'END_OF_FILE'
X/*@z09.c:Closure Expansion:ClosureExpand()@***********************************/


X/* */
X/* LOUT: A HIGH-LEVEL LANGUAGE FOR DOCUMENT FORMATTING (VERSION 2.03) */
X/* COPYRIGHT (C) 1993 Jeffrey H. Kingston */
X/* */
X/* Jeffrey H. Kingston (je...@cs.su.oz.au) */
X/* Basser Department of Computer Science */
X/* The University of Sydney 2006 */
X/* AUSTRALIA */
X/* */
X/* This program is free software; you can redistribute it and/or modify */
X/* it under the terms of the GNU General Public License as published by */
X/* the Free Software Foundation; either version 1, or (at your option) */
X/* any later version. */
X/* */
X/* This program is distributed in the hope that it will be useful, */
X/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
X/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
X/* GNU General Public License for more details. */
X/* */
X/* You should have received a copy of the GNU General Public License */
X/* along with this program; if not, write to the Free Software */
X/* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
X/* */

X/* FILE: z09.c */
X/* MODULE: Closure Expansion */
X/* EXTERNS: SetEnv(), AttachEnv(), GetEnv(), SearchEnv(), */
X/* ClosureExpand() */
X/* */
X/*****************************************************************************/


X#include "externs"
X
X
X/*****************************************************************************/
X/* */

X/* OBJECT SearchEnv(env, sym) */
X/* */
X/* Search environment env for a symbol such that actual() == sym. */
X/* */
X/*****************************************************************************/
X
XOBJECT SearchEnv(env, sym)
XOBJECT env, sym;
X{ OBJECT link, y;
X debug2(DCE, DD, "SearchEnv(%s, %s)", EchoObject(null, env), SymName(sym));
X for(;;)
X {
X debug1(DCE, DDD, " searching env %s", EchoObject(null, env));
X assert( env != nil && type(env) == ENV, "SearchEnv: env!" );
X if( Down(env) == env )
X { debug0(DCE, DD, "SearchEnv returning <nil>");
X return nil;
X }
X Child(y, Down(env));
X assert( type(y) == CLOSURE, "SearchEnv: type(y) != CLOSURE!" );
X if( actual(y) == sym )
X { debug1(DCE, DD, "SearchEnv returning %s", EchoObject(null, y));
X return y;
X }
X assert( LastDown(y) != y, "SearchEnv: LastDown(y) == y!" );


X link = LastDown(env) != Down(env) ? LastDown(env) : LastDown(y);

X Child(env, link);
X }
X} /* end SearchEnv */


X
X
X/*@@**************************************************************************/
X/* */

X/* static OBJECT EvalNext(x, env) */
X/* */
X/* Evaluate x, which is a @Next something object, in environment env. */
X/* */
X/*****************************************************************************/
X
Xstatic OBJECT EvalNext(x, env)
XOBJECT x, env;
X{ OBJECT y, prnt, link, par, py;
X BOOLEAN done;
X assert( type(x) == NEXT, "EvalNext: x is not NEXT!" );
X assert( Down(x) != x, "EvalNext: x has no child!" );
X assert( env == nil || type(env) == ENV, "EvalNext: env!" );
X debug2(DCE,DD, "EvalNext(%s, %s)", EchoObject(null,x), EchoObject(null,env));
X Child(y, Down(x));
X
X /* if argument of @Next can be evaluated, do so */
X if( type(y) == NEXT ) y = EvalNext(y, env);
X else if( type(y) == CLOSURE && is_par(type(actual(y))) )
X { prnt = SearchEnv(env, enclosing(actual(y)));
X if( prnt == nil )
X { Error(WARN,&fpos(y),"environment missing when evaluating %s", KW_NEXT);
X }
X else
X { assert( prnt != nil, "EvalNext: prnt == nil!" );
X for( link = Down(prnt); link != prnt; link = NextDown(link) )
X { Child(par, link);
X if( type(par) == PAR && actual(par) == actual(y) )
X { assert( Down(par) != par, "AttachEnv: par!" );
X Child(py, Down(par));
X if( type(py) == WORD )
X { y = CopyObject(py, &fpos(py));
X DisposeChild(Down(x));
X Link(x, y);
X }
X break;


X }
X }
X }
X }
X

X /* if argument of @Next is a WORD, increment it */


X if( type(y) == WORD )

X { done = FALSE;


X y = Next(y, 1, &done);

X ReplaceNode(y, x);
X DisposeObject(x);

X x = y;
X }

X
X debug1(DCE, DD, "EvalNext returning %s", EchoObject(null, x));
X return x;
X} /* end EvalNext */


X
X
X/*****************************************************************************/
X/* */

X/* OBJECT SetEnv(x, y) */
X/* */
X/* Create a new environment containing x and possibly y. */
X/* */
X/*****************************************************************************/
X
XOBJECT SetEnv(x, y)
XOBJECT x, y;
X{ OBJECT res;
X debug2(DCE, D, "SetEnv( %s, %s )", EchoObject(null, x), EchoObject(null, y));
X assert( x != nil && type(x) == CLOSURE, "SetEnv: x == nil or not CLOSURE!" );
X assert( y == nil || type(y) == ENV, "SetEnv: y != nil && type(y) != ENV!" );
X res = New(ENV);
X Link(res, x);
X if( y != nil ) Link(res, y);
X debug1(DCE, D, "SetEnv returning %s", EchoObject(null, res));
X return res;
X} /* end SetEnv */


X
X
X/*@@**************************************************************************/
X/* */

X/* AttachEnv(env, x) */
X/* */
X/* Attach environment env to CLOSURE x. */
X/* */
X/*****************************************************************************/
X
XAttachEnv(env, x)
XOBJECT env, x;
X{ debug2(DCE,D,"AttachEnv( %s, %s )", EchoObject(null,env), EchoObject(null,x));
X assert( env != nil && type(env) == ENV, "AttachEnv: type(env) != ENV!" );
X assert( type(x) == CLOSURE, "AttachEnv: type(x) != CLOSURE!" );
X Link(x, env);
X debug0(DCE, D, "AttachEnv returning.");
X} /* end AttachEnv */


X
X
X/*****************************************************************************/
X/* */

X/* OBJECT GetEnv(x) */
X/* */
X/* Get from CLOSURE x the environment previously attached. */
X/* */
X/*****************************************************************************/
X
XOBJECT GetEnv(x)
XOBJECT x;
X{ OBJECT env;
X debug1(DCE, DD, "GetEnv( %s )", EchoObject(null, x));
X assert( type(x) == CLOSURE, "GetEnv: type(x) != CLOSURE!" );
X assert( LastDown(x) != x, "GetEnv: LastDown(x) == x!" );
X Child(env, LastDown(x));
X assert( type(env) == ENV, "GetEnv: type(env) != ENV!" );
X debug1(DCE, DD, "GetEnv resturning %s", EchoObject(null, env));
X return env;
X} /* end GetEnv */


X
X
X/*****************************************************************************/
X/* */

X/* OBJECT DetachEnv(x) */
X/* */
X/* Detach from CLOSURE x the environment previously attached. */
X/* */
X/*****************************************************************************/
X
XOBJECT DetachEnv(x)
XOBJECT x;
X{ OBJECT env;
X debug1(DCE, DD, "DetachEnv( %s )", EchoObject(null, x));
X assert( type(x) == CLOSURE, "DetachEnv: type(x) != CLOSURE!" );
X assert( LastDown(x) != x, "DetachEnv: LastDown(x) == x!" );
X Child(env, LastDown(x));
X DeleteLink(LastDown(x));
X assert( type(env) == ENV, "DetachEnv: type(env) != ENV!" );
X debug1(DCE, DD, "DetachEnv resturning %s", EchoObject(null, env));
X return env;
X} /* end DetachEnv */


X
X
X/*@@**************************************************************************/
X/* */

X/* OBJECT ClosureExpand(x, env, style, crs_wanted, crs, res_env) */
X/* */
X/* Return expansion of closure x in environment env and style style. */
X/* The body comes from x's environment if x is a parameter, else from the */
X/* symbol table. The original x is pushed into the environments. */
X/* */
X/* If crs_wanted and x has a tag, a cross-reference is added to crs. */
X/* */
X/*****************************************************************************/
X
XOBJECT ClosureExpand(x, env, style, crs_wanted, crs, res_env)


XOBJECT x, env; STYLE *style; BOOLEAN crs_wanted; OBJECT *crs, *res_env;

X{ OBJECT link, y, res, prnt_env, par, prnt, ppar;
X debug3(DCE, D, "ClosureExpand( %s, crs, %s, %s, res_env )",
X EchoObject(null, x), bool(crs_wanted), EchoObject(null, env));
X assert( type(x) == CLOSURE, "ClosureExpand given non-CLOSURE!");
X assert( predefined(actual(x)) == FALSE, "ClosureExpand given predefined!" );
X
X /* add a tag to x if needed but none provided */
X if( has_tag(actual(x)) )
X { for( link = Down(x); link != x; link = NextDown(link) )
X { Child(par, link);
X if( type(par) == PAR && is_tag(actual(par)) ) break;
X }


X if( link == x )

X { ppar = nil;
X for( link=Down(actual(x)); link != actual(x); link = NextDown(link) )
X { Child(y, link);
X if( is_par(type(y)) && is_tag(y) )
X { ppar = y;
X break;
X }
X }
X if( ppar != nil )
X {
X /* prepare new PAR containing generated tag */
X par = New(PAR);
X actual(par) = ppar;
X y = CrossGenTag(x);
X Link(par, y);
X
X /* find the right spot, then link it to x */
X switch( type(ppar) )
X {
X case LPAR: link = Down(x);
X break;
X
X case NPAR: link = Down(x);
X if( Down(x) != x )
X { Child(y, Down(x));
X if( type(y) == PAR && type(actual(par)) == LPAR )


X link = NextDown(link);
X }

X break;
X
X case RPAR: for( link = Down(x); link != x; link = NextDown(link) )
X { Child(y, link);
X if( type(y) != PAR ) break;
X }
X break;
X }
X Link(link, par);
X }
X }
X }
X
X /* add cross-reference to crs if needed */
X if( crs_wanted && has_tag(actual(x)) )
X { OBJECT tmp;
X tmp = CopyObject(x, no_fpos); AttachEnv(env, tmp);
X y = CrossMake(actual(x), tmp, CROSS_TARG);
X tmp = New(CROSS_TARG);
X actual(tmp) = y;
X Link(tmp, y);


X if( *crs == nil ) *crs = New(CR_LIST);

X Link(*crs, tmp);
X }
X
X
X /* case x is a parameter */
X res = *res_env = nil;
X if( is_par(type(actual(x))) )
X {
X prnt = SearchEnv(env, enclosing(actual(x)));
X if( prnt == nil )
X Error(FATAL, &fpos(x), "symbol with import list used illegally");
X assert( prnt != nil, "ClosureExpand: is_par but prnt == nil!" );
X prnt_env = GetEnv(prnt);
X for( link = Down(prnt); link != prnt; link = NextDown(link) )
X { Child(par, link);
X if( type(par) == PAR && actual(par) == actual(x) )
X { assert( Down(par) != par, "ExpandCLosure: Down(par)!");
X Child(res, Down(par));
X if( dirty(enclosing(actual(par))) )
X { debug2(DSU, DD, " copying %s %s",
X SymName(actual(par)), EchoObject(null, res));
X res = CopyObject(res, no_fpos);
X }
X else
X { debug2(DSU, DD, " linking %s %s",
X SymName(actual(par)), EchoObject(null, res));
X DeleteLink(Down(par));
X y = MakeWord("??", &fpos(res));
X Link(par, y);
X }
X ReplaceNode(res, x);
X if( type(actual(x)) == RPAR && has_body(enclosing(actual(x))) )
X { *res_env = SetEnv(prnt, nil);
X DisposeObject(x);
X }
X else
X { AttachEnv(env, x);
X *res_env = SetEnv(x, prnt_env);
X }
X break;
X }
X }
X }
X
X /* case x is a user-defined symbol or default parameter */
X if( res == nil )
X { if( sym_body(actual(x)) == nil ) res = MakeWord("??", &fpos(x));
X else res = CopyObject(sym_body(actual(x)), &fpos(x));
X ReplaceNode(res, x);
X AttachEnv(env, x);
X *res_env = SetEnv(x, nil);
X }
X
X assert( *res_env != nil && type(*res_env) == ENV, "ClosureExpand: *res_env!");
X debug0(DCE, D, "ClosureExpand returning, res =");
X ifdebug(DCE, D, EchoObject(stderr, res));
X debug1(DCE, DD, " environment = %s", EchoObject(null, *res_env));
X return res;
X} /* end ClosureExpand */
END_OF_FILE
if test 14080 -ne `wc -c <'lout/z09.c'`; then
echo shar: \"'lout/z09.c'\" unpacked with wrong size!
fi
# end of 'lout/z09.c'
fi
if test -f 'lout/z21.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/z21.c'\"
else
echo shar: Extracting \"'lout/z21.c'\" \(10867 characters\)
sed "s/^X//" >'lout/z21.c' <<'END_OF_FILE'
X/*@z21.c:Galley Maker:SizeGalley()@*******************************************/


X/* */
X/* LOUT: A HIGH-LEVEL LANGUAGE FOR DOCUMENT FORMATTING (VERSION 2.03) */
X/* COPYRIGHT (C) 1993 Jeffrey H. Kingston */
X/* */
X/* Jeffrey H. Kingston (je...@cs.su.oz.au) */
X/* Basser Department of Computer Science */
X/* The University of Sydney 2006 */
X/* AUSTRALIA */
X/* */
X/* This program is free software; you can redistribute it and/or modify */
X/* it under the terms of the GNU General Public License as published by */
X/* the Free Software Foundation; either version 1, or (at your option) */
X/* any later version. */
X/* */
X/* This program is distributed in the hope that it will be useful, */
X/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
X/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
X/* GNU General Public License for more details. */
X/* */
X/* You should have received a copy of the GNU General Public License */
X/* along with this program; if not, write to the Free Software */
X/* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
X/* */

X/* FILE: z21.c */
X/* MODULE: Galley Maker */
X/* EXTERNS: SizeGalley() */
X/* */
X/*****************************************************************************/


X#include "externs"
X
X
X/*****************************************************************************/
X/* */

X/* SizeGalley(hd, env, rows, joined, nonblock, trig, style, c, target, */
X/* dest_index, recs, inners) */
X/* */
X/* Convert unsized galley hd into sized format. The input parameters are: */
X/* */
X/* hd the galley to be converted */
X/* env its environment */
X/* rows TRUE if the resulting galley may have more than one row */
X/* joined TRUE if the resulting galley must be simply joined */
X/* nonblock Set the non_blocking() field of RECEPTIVEs to this value */
X/* trig TRUE if galley's indefinites may trigger external galleys */
X/* *style The initial style */
X/* *c the width constraint hd should conform to */
X/* target if non-nil, expand indefinite objects to reveal a */
X/* @Galley within this symbol */
X/* */
X/* The output parameters, in addition to the converted hd, are: */
X/* */
X/* dest_index the index of the @Galley found within target, if any */
X/* recs list of all RECURSIVE indexes found (or nil if none) */
X/* inners list of all UNATTACHED indexes found (or nil if none) */
X/* */
X/*****************************************************************************/
X
XSizeGalley(hd, env, rows, joined, nonblock, trig, style, c, target,
X dest_index, recs, inners)
XOBJECT hd, env; BOOLEAN rows, joined, nonblock, trig; STYLE *style;
XCONSTRAINT *c; OBJECT target, *dest_index, *recs, *inners;
X{ OBJECT y, link, z, crs, t, tlink, zlink, tmp;
X OBJECT extras, tmp1, tmp2, bt[2], ft[2];
X
X assert( type(hd) == HEAD && Down(hd) != hd, "SizeGalley: precondition!" );
X assert( !sized(hd), "SizeGalley: already sized!" );
X debug6(DGM, D, "SizeGalley(hd, -, %s, %s, %s, %s, %s, %s, -, -, -), hd =",
X bool(joined), bool(nonblock), bool(trig), EchoStyle(style),
X EchoConstraint(c), SymName(target));
X ifdebug(DGM, DD, EchoObject(stderr, hd));
X
X /* manifest hd's child, making sure it is simply joined if required */
X tmp1 = target;
X Child(y, Down(hd));
X crs = nil;
X bt[COL] = ft[COL] = bt[ROW] = ft[ROW] = nil;
X if( joined )
X { bt[COL] = New(THREAD); ft[COL] = New(THREAD);
X y = Manifest(y, env, style, bt, ft, &tmp1, &crs, TRUE, must_expand(hd));
X assert( Down(bt[COL]) != bt[COL] && Down(ft[COL]) != ft[COL],
X "SizeGalley: threads!" );
X Child(tmp1, Down(bt[COL])); Child(tmp2, Down(ft[COL]));
X if( Down(bt[COL]) != LastDown(bt[COL]) ||
X Down(ft[COL]) != LastDown(ft[COL]) || tmp1 != tmp2 )
X Error(FATAL, &fpos(y), "galley %s must have just one column mark",
X SymName(actual(hd)) );
X DisposeObject(bt[COL]); DisposeObject(ft[COL]);
X }
X else y = Manifest(y, env, style, bt, ft, &tmp1, &crs, TRUE, must_expand(hd));
X
X /* horizontally size and break hd */
X debug0(DGM, DD, "SizeGalley: after manifesting, hd =");
X ifdebug(DGM, DD, EchoObject(stderr, hd));
X debug0(DGM, DD, "SizeGalley horizontally sizing and breaking hd:");
X CopyConstraint(constraint(hd), *c);
X y = MinSize(y, COL, &extras);
X debug0(DOB, DD, " calling BreakObject from SizeGalley");
X y = BreakObject(y, c);
X back(hd, COL) = back(y, COL);
X fwd(hd, COL) = fwd(y, COL);
X assert( FitsConstraint(back(hd, COL), fwd(hd, COL), *c),
X "SizeGalley: BreakObject failed to fit!" );
X debug2(DSF, D, "MinSize(hd, COL) = %s,%s",
X EchoLength(back(hd, COL)), EchoLength(fwd(hd, COL)) );
X
X /* get the rows of hd to the top level, if required */
X seen_nojoin(hd) = FALSE;
X if( rows )
X { /* OBJECT prev_gap = nil; */
X debug0(DGM, DD, "SizeGalley cleaning up rows of hd:");
X for( link = hd; NextDown(link) != hd; link = NextDown(link) )
X { Child(y, NextDown(link));
X debug2(DGM,DD," cleaning %s: %s", Image(type(y)), EchoObject(null,y));


X switch( type(y) )
X {

X case GAP_OBJ:
X
X /* prev_gap = y; */


X if( !join(gap(y)) ) seen_nojoin(hd) = TRUE;

X break;
X
X
X case VCAT:
X
X TransferLinks(Down(y), y, Up(y));
X DisposeChild(Up(y));
X link = PrevDown(link);
X break;
X
X
X case SPLIT:
X
X assert(Up(y)==LastUp(y), "SizeGalley COL_THR: Up(y)!=LastUp(y)!");
X Child(z, DownDim(y, ROW));
X if( is_indefinite(type(z)) ) external(z) = TRUE;
X else if( type(z) == VCAT )
X { OBJECT hor, thor, clink, dlink;
X Child(hor, DownDim(y, COL));
X assert( type(hor) == COL_THR, "SizeGalley: missing COL_THR!" );
X Parent(thor, UpDim(z, COL));
X assert( hor == thor, "SizeGalley/SPLIT: hor != thor!" );
X clink = DownDim(y, COL);
X dlink = UpDim(z, COL);
X for( tlink = LastDown(z); tlink != z; tlink = PrevDown(tlink) )
X { Child(t, tlink);
X if( type(t) == GAP_OBJ ) Link(NextDown(link), t);
X else
X { tmp = New(SPLIT);
X back(tmp, COL) = back(hor, COL);
X fwd(tmp, COL) = fwd(hor, COL);
X Link(NextDown(link), tmp);
X Link(tmp, NextUp(clink));
X Link(NextDown(dlink), t);
X Link(tmp, t);
X }
X }
X DeleteLink(dlink);
X assert(Up(y)==LastUp(y), "SizeGalley COL_THR: Up(y) != LastUp(y)!");
X DisposeChild(Up(y));


X link = PrevDown(link);
X }

X break;
X
X
X case CLOSURE:
X case HEAD:
X
X external(y) = TRUE;
X break;
X
X
X default:
X
X break;
X }
X }
X }
X
X /* size the rows of hd and attach indices where needed */
X debug0(DGM, DD, "SizeGalley sizing rows of hd =");
X ifdebug(DGM, DD, EchoObject(stderr, hd));
X *recs = *inners = *dest_index = nil;
X for( link = Down(hd); link != hd; link = NextDown(link) )
X { Child(y, link);
X if( type(y) == GAP_OBJ || is_index(type(y)) ) continue;
X debug0(DGM, DDD, " ROW sizing:");
X ifdebug(DGM, DDD, EchoObject(stderr, y));
X extras = New(ACAT);
X y = MinSize(y, ROW, &extras);
X debug3(DSF, D, "MinSize( %s , ROW ) = %s,%s", EchoObject(null, y),
X EchoLength(back(y, ROW)), EchoLength(fwd(y, ROW)) );
X debug0(DGM, DDD, " ROW result:");
X ifdebug(DGM, DDD, EchoObject(stderr, y));
X
X /* now attach indexes in front of y */
X for( zlink = Down(extras); zlink != extras; zlink = NextDown(zlink) )
X { Child(z, zlink);
X blocked(z) = FALSE;
X /* debug1(DCR, D, " extra: %s", EchoObject(null, z)); */
X debug1(DGM, DD, " extra: %s", EchoObject(null, z));
X switch( type(z) )


X {
X case RECEPTIVE:
X

X /* debug2(DCR, D, " ... uses_ext = %s, trig = %s",
X bool(uses_extern_target(actual(actual(z)))), bool(trig)); */
X trigger_externs(z) = uses_extern_target(actual(actual(z))) && trig;
X non_blocking(z) = nonblock;
X if( actual(actual(z)) == GalleySym ) *dest_index = z;
X break;
X
X
X case RECURSIVE:
X
X if( *recs == nil ) *recs = New(ACAT);
X Link(*recs, z);
X break;
X
X
X case UNATTACHED:
X
X if( *inners == nil ) *inners = New(ACAT);
X Link(*inners, z);
X break;
X
X

X case EXPAND_IND:
X case GALL_PREC:
X case GALL_FOLL:
X case GALL_TARG:
X case CROSS_PREC:
X case CROSS_FOLL:
X case CROSS_TARG:
X

X debug1(DCR, DD, " SizeGalley: %s", EchoObject(null, z));
X break;
X
X
X default:
X
X Error(INTERN, no_fpos, "SizeGalley: %s", Image(type(z)) );
X break;
X
X }
X }
X TransferLinks(Down(extras), extras, link);
X assert( Down(extras) == extras && Up(extras) == extras, "SizeG: extras!");
X Dispose(extras);
X }
X
X /* insinuate cross references */
X if( crs != nil )
X {
X debug1(DCR, D, "SizeGalley insinuating %s", crs);
X TransferLinks(Down(crs), crs, Down(hd));
X DisposeObject(crs);
X }
X
X /* check that *dest_index was found if it was required, and exit */
X if( target != nil && *dest_index == nil )
X Error(FATAL, &fpos(hd), "Unexpected absence of %s from the body of %s",
X SymName(target), SymName(actual(hd)));
X debug3(DGM, D, "SizeGalley returning %s,%s %s; hd =",


X EchoLength(back(hd, COL)), EchoLength(fwd(hd, COL)),

X EchoConstraint(&constraint(hd)));
X ifdebug(DGM, DD, EchoObject(stderr, hd));
X sized(hd) = TRUE;
X
X} /* end SizeGalley */
END_OF_FILE
if test 10867 -ne `wc -c <'lout/z21.c'`; then
echo shar: \"'lout/z21.c'\" unpacked with wrong size!
fi
# end of 'lout/z21.c'
fi
if test -f 'lout/z26.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/z26.c'\"


else
echo shar: Extracting \"'lout/z26.c'\" \(12088 characters\)

sed "s/^X//" >'lout/z26.c' <<'END_OF_FILE'
X/*@z26.c:Echo Service:BeginString(), AppendString(), EndString(), Image()@****/


X/* */
X/* LOUT: A HIGH-LEVEL LANGUAGE FOR DOCUMENT FORMATTING (VERSION 2.03) */
X/* COPYRIGHT (C) 1993 Jeffrey H. Kingston */
X/* */
X/* Jeffrey H. Kingston (je...@cs.su.oz.au) */
X/* Basser Department of Computer Science */
X/* The University of Sydney 2006 */
X/* AUSTRALIA */
X/* */
X/* This program is free software; you can redistribute it and/or modify */
X/* it under the terms of the GNU General Public License as published by */
X/* the Free Software Foundation; either version 1, or (at your option) */
X/* any later version. */
X/* */
X/* This program is distributed in the hope that it will be useful, */
X/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
X/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
X/* GNU General Public License for more details. */
X/* */
X/* You should have received a copy of the GNU General Public License */
X/* along with this program; if not, write to the Free Software */
X/* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
X/* */

X/* FILE: z26.c */
X/* MODULE: Echo Service */
X/* EXTERNS: BeginString(), AppendString(), EndString(), Image() */


X/* */
X/*****************************************************************************/
X#include "externs"
X

X#if DEBUG_ON
X#define MULTI 7 /* max no of simultaneous calls */
X
Xstatic unsigned char buff[MULTI][MAX_LINE]; /* buffers for strings */
Xstatic int curr = 1; /* current buffer in use */
Xstatic int bp; /* next free space in buff[curr] */
Xstatic BOOLEAN instring = FALSE; /* TRUE while making a string */


X
X
X/*****************************************************************************/
X/* */

X/* BeginString() */
X/* */
X/* Locate a clear buffer into which debug output may be accumulated. */
X/* */
X/*****************************************************************************/
X
XBeginString()
X{ if( instring ) Error(INTERN, no_fpos, "BeginString: currently in string!");
X instring = TRUE; curr = (curr + 1) % MULTI;
X assert( 0 <= curr && curr < MULTI, "BeginString: curr!" );
X strcpy(buff[curr], ""); bp = 0;
X}


X
X
X/*****************************************************************************/
X/* */

X/* AppendString(str, p1, p2, p3, p4, p5, p6) */
X/* */
X/* Sprintf str to the current buffer, if space is available there. */
X/* */
X/*****************************************************************************/
X
X/*VARARGS1*/
XAppendString(str, p1, p2, p3, p4, p5, p6)
Xunsigned char *str; int p1, p2, p3, p4, p5, p6;
X{ int len;
X if( !instring ) Error(INTERN, no_fpos, "AppendString: no current string!");
X assert( 0 <= curr && curr < MULTI, "BeginString: curr!" );
X if( bp == MAX_LINE ) return; /* no space, do nothing */


X
X len = strlen(str);

X if( len + bp >= MAX_LINE )
X { strcpy( &buff[curr][MAX_LINE/2], " ... <too long to print>" );
X bp = MAX_LINE;
X }
X else
X { sprintf( &buff[curr][bp], str, p1, p2, p3, p4, p5, p6 );
X while( buff[curr][bp] != '\0' ) bp++;
X if( bp >= MAX_LINE ) Error(INTERN, no_fpos, "AppendString abort");
X }
X} /* end AppendString */


X
X
X/*****************************************************************************/
X/* */

X/* unsigned char *EndString() */
X/* */
X/* Return the string constructed by previous AppendString operations. */
X/* */
X/*****************************************************************************/
X
Xunsigned char *EndString()
X{ if( !instring ) Error(INTERN, no_fpos, "EndString: no current string!");
X assert( 0 <= curr && curr < MULTI, "BeginString: curr!" );
X instring = FALSE;
X return buff[curr];
X} /* end Endstring */
X#endif


X
X
X/*****************************************************************************/
X/* */

X/* unsigned char *EchoLength(len) */
X/* */
X/* Echo a length. */
X/* */
X/*****************************************************************************/
X
Xunsigned char *EchoLength(len)
Xint len;
X{ static unsigned char buff[6][20];


X static int i = 0;

X i = (i + 1) % 6;
X sprintf(buff[i], "%.3fc", (float) len/CM);
X return buff[i];
X} /* end EchoLength */


X
X
X/*@@**************************************************************************/
X/* */

X/* unsigned char *Image(c) */
X/* */
X/* Returns the string value of type c. */
X/* */
X/*****************************************************************************/
X
Xunsigned char *Image(c)
Xunsigned int c;
X{ static unsigned char b[20];
X switch(c)
X {
X
X case LINK: return (unsigned char *) "link";
X
X case SPLIT: return (unsigned char *) "split";
X case HEAD: return (unsigned char *) "head";
X case PAR: return (unsigned char *) "par";
X case WORD: return (unsigned char *) "word";
X case GAP_OBJ: return (unsigned char *) "gap_obj";
X case ROW_THR: return (unsigned char *) "row_thr";
X case COL_THR: return (unsigned char *) "col_thr";
X case CLOSURE: return (unsigned char *) "closure";
X case NULL_CLOS: return (unsigned char *) KW_NULL;
X case CROSS: return (unsigned char *) KW_CROSS;
X case ONE_COL: return (unsigned char *) KW_ONE_COL;
X case ONE_ROW: return (unsigned char *) KW_ONE_ROW;
X case WIDE: return (unsigned char *) KW_WIDE;
X case HIGH: return (unsigned char *) KW_HIGH;
X case HSCALE: return (unsigned char *) KW_HSCALE;
X case VSCALE: return (unsigned char *) KW_VSCALE;
X case HCONTRACT: return (unsigned char *) KW_HCONTRACT;
X case VCONTRACT: return (unsigned char *) KW_VCONTRACT;
X case HEXPAND: return (unsigned char *) KW_HEXPAND;
X case VEXPAND: return (unsigned char *) KW_VEXPAND;
X case PADJUST: return (unsigned char *) KW_PADJUST;
X case HADJUST: return (unsigned char *) KW_HADJUST;
X case VADJUST: return (unsigned char *) KW_VADJUST;
X case ROTATE: return (unsigned char *) KW_ROTATE;
X case SCALE: return (unsigned char *) KW_SCALE;
X case CASE: return (unsigned char *) KW_CASE;
X case YIELD: return (unsigned char *) KW_YIELD;
X case FONT: return (unsigned char *) KW_FONT;
X case SPACE: return (unsigned char *) KW_SPACE;
X case BREAK: return (unsigned char *) KW_BREAK;
X case NEXT: return (unsigned char *) KW_NEXT;
X case ENV: return (unsigned char *) KW_ENV;
X case CLOS: return (unsigned char *) KW_CLOS;
X case LVIS: return (unsigned char *) KW_LVIS;
X case OPEN: return (unsigned char *) KW_OPEN;
X case TAGGED: return (unsigned char *) KW_TAGGED;
X case INCGRAPHIC: return (unsigned char *) KW_INCGRAPHIC;
X case SINCGRAPHIC: return (unsigned char *) KW_SINCGRAPHIC;
X case GRAPHIC: return (unsigned char *) KW_GRAPHIC;
X case ACAT: return (unsigned char *) "acat";
X case HCAT: return (unsigned char *) "hcat";
X case VCAT: return (unsigned char *) "vcat";
X
X case TSPACE: return (unsigned char *) "tspace";
X case TJUXTA: return (unsigned char *) "tjuxta";
X case LBR: return (unsigned char *) "lbr";
X case RBR: return (unsigned char *) "rbr";
X case BEGIN: return (unsigned char *) KW_BEGIN;
X case END: return (unsigned char *) KW_END;
X case USE: return (unsigned char *) KW_USE;
X case GSTUB_NONE: return (unsigned char *) "gstub_none";
X case GSTUB_INT: return (unsigned char *) "gstub_int";
X case GSTUB_EXT: return (unsigned char *) "gstub_ext";
X case INCLUDE: return (unsigned char *) KW_INCLUDE;
X case SYS_INCLUDE: return (unsigned char *) KW_SYSINCLUDE;
X case PREPEND: return (unsigned char *) KW_PREPEND;
X case SYS_PREPEND: return (unsigned char *) KW_SYSPREPEND;
X case DATABASE: return (unsigned char *) KW_DATABASE;
X case SYS_DATABASE: return (unsigned char *) KW_SYSDATABASE;
X case START: return (unsigned char *) "start";
X
X case DEAD: return (unsigned char *) "dead";
X case UNATTACHED: return (unsigned char *) "unattached";
X case RECEPTIVE: return (unsigned char *) "receptive";
X case RECEIVING: return (unsigned char *) "receiving";
X case RECURSIVE: return (unsigned char *) "recursive";
X case PRECEDES: return (unsigned char *) "precedes";
X case FOLLOWS: return (unsigned char *) "follows";
X case CROSS_FOLL: return (unsigned char *) "cross_foll";
X case GALL_FOLL: return (unsigned char *) "gall_foll";
X case CROSS_TARG: return (unsigned char *) "cross_targ";
X case GALL_TARG: return (unsigned char *) "gall_targ";
X case GALL_PREC: return (unsigned char *) "gall_prec";
X case CROSS_PREC: return (unsigned char *) "cross_prec";
X case EXPAND_IND: return (unsigned char *) "expand_ind";
X case THREAD: return (unsigned char *) "thread";
X case CROSS_SYM: return (unsigned char *) "cross_sym";
X case CR_ROOT: return (unsigned char *) "cr_root";
X case MACRO: return (unsigned char *) KW_MACRO;
X case LOCAL: return (unsigned char *) "local";
X case LPAR: return (unsigned char *) "lpar";
X case NPAR: return (unsigned char *) "npar";
X case RPAR: return (unsigned char *) "rpar";
X case CR_LIST: return (unsigned char *) "cr_list";
X case EXT_GALL: return (unsigned char *) "ext_gall";
X case DISPOSED: return (unsigned char *) "disposed";
X
X case BACK: return (unsigned char *) "back";
X case ON: return (unsigned char *) "on";
X case FWD: return (unsigned char *) "fwd";
X
X case PROMOTE: return (unsigned char *) "promote";
X case CLOSE: return (unsigned char *) "close";
X case BLOCK: return (unsigned char *) "block";
X case CLEAR: return (unsigned char *) "clear";
X
X case ABS: return (unsigned char *) "abs";
X case INC: return (unsigned char *) "inc";
X case DEC: return (unsigned char *) "dec";
X
X default: sprintf(b, "??(%d)", c);
X return b;


X } /* end switch */

X} /* end Image */
END_OF_FILE
if test 12088 -ne `wc -c <'lout/z26.c'`; then
echo shar: \"'lout/z26.c'\" unpacked with wrong size!
fi
# end of 'lout/z26.c'
fi
echo shar: End of archive 22 \(of 30\).
cp /dev/null ark22isdone

Jeff Kingston

unread,
Jun 1, 1993, 11:04:36 PM6/1/93
to
Submitted-by: je...@joyce.cs.su.oz.au (Jeff Kingston)
Posting-number: Volume 37, Issue 121
Archive-name: lout/part23
Environment: UNIX

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: lout/doc/tr.fig/s8 lout/doc/tr.impl/s2.4
# lout/doc/tr.lout/ch1.04 lout/doc/tr.lout/ch3.02
# lout/doc/tr.lout/ch4.04 lout/font0/Symbo.AFM lout/z27.c
# Wrapped by kent@sparky on Sun May 30 19:44:00 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 23 (of 30)."'
if test -f 'lout/doc/tr.fig/s8' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.fig/s8'\"
else
echo shar: Extracting \"'lout/doc/tr.fig/s8'\" \(12131 characters\)
sed "s/^X//" >'lout/doc/tr.fig/s8' <<'END_OF_FILE'
X@Section
X @Title { A Concise Reference for Fig }
X@Begin
X@PP
XThe options to the @Code "@Fig" symbol, and their
Xdefault values, are as follows. The complete range of options is shown
Xat right:
X@ID @Tab
X hmargin { 1s }
X vmargin { 0.5vx }
X @Fmth { @Col @Code A ! @Col @Code " " ! @Col @Code B ! @Col @Code " " !
X @Col 1.0c @Wide ! @Col C }
X @Fmta { @Col @Code A ! @Col @Code "{" ! @Col @Code B ! @Col @Code "}" !
X @Col 1.0c @Wide ! @Col C }
X{
X@Rowh
X A { "@Fig" }
X@Rowa
X A { " maxlabels" }
X B { 200 }
X C { any whole number }
X@Rowa
X A { " linestyle" }
X B { solid }
X C { @Code "solid dashed cdashed dotted noline" }
X@Rowa
X A { " linewidth" }
X B { 0.5 pt }
X C { any Fig length (see below) }
X@Rowa
X A { " linecap" }
X B { round }
X C { @Code "butt round project" }
X@Rowa
X A { " dashlength"}
X B { 0.15 cm }
X C { any Fig length }
X@Rowa
X A { " paint" }
X B { nopaint }
X C { @Code "nopaint white light grey gray dark black" }
X@Rowa
X A { " margin" }
X B { 0.4c }
X C { any Lout length }
X@Rowa
X A { " arrow" }
X B { noarrow }
X C { @Code "noarrow forward back both" }
X@Rowa
X A { " headstyle" }
X B { open }
X C { @Code "open halfopen closed" }
X@Rowa
X A { " headwidth" }
X B { 0.05 cm }
X C { any Fig length }
X@Rowa
X A { " headlength"}
X B { 0.15 cm }
X C { any Fig length }
X}
XThe @Code "linecap" option determines the shape of the ends of lines:
X@Code "round" puts a round cap on them, which is the most useful in
XFig; @Code "butt" is a square end; and @Code "project" is a square end
Xprojecting half a line width past the end of the line; it is useful for
Xgetting sharp corners on rectangles and square dots in dotted lines.
X@FootNote {
XThe line joining options of PostScript are not reflected in Fig options
Xbecause Fig strokes paths segment by segment, not all at once, and so
Xthere are no line joins in the PostScript sense. This was done to
Ximprove the appearance of dashed and dotted lines.
X}
X@PP
XThe following standard shapes take the same options as {@Code "@Fig"},
Xexcept that they do not have @Code "maxlabels" or the last four
X(arrow-drawing) options,
Xand occasionally they have other options. In most cases the default
Xvalues of these options are taken from the enclosing {@Code "@Fig"}.
XWhere there are extra options, or where a different default value is
Xused, the option and its default value are shown. The list also shows
Xthe shape's labels, and how it is superimposed on its right parameter
X(shown as a grey rectangle). A larger margin will enlarge the right
Xparameter and hence the shape as well. Squares, polygons and circles
Xhave a diameter equal to the larger of @Code xsize and {@Code ysize}.
X@LP
X@ID {
X5c @Wide @Code "@Box"
X||7ct
X@Fig {
X@Figure shape { 0 0 xsize 0 xsize ysize 0 ysize 0 0 } paint { grey }
Xlinestyle { noline } margin { 0c }
X@Box margin { 0c }
X{ 2c @Wide 1c @High }
X// @ShowLabels
X}
X}
X
X@LP
X@ID {
X5c @Wide @Code "@Square"
X||7ct
X@Fig {
X@Figure shape { 0 0 xsize 0 xsize ysize 0 ysize 0 0 } paint { grey }
Xlinestyle { noline } margin { 0c }
X@Square margin { 0c }
X{ 2c @Wide 1c @High }
X// @ShowLabels
X}
X}
X@LP
X
X@ID {
X5c @Wide @Code "@Diamond"
X||7ct
X@Fig {
X@Figure shape { 0 0 xsize 0 xsize ysize 0 ysize 0 0 } paint { grey }
Xlinestyle { noline } margin { 0c }
X@Diamond margin { 0c }
X{ 2c @Wide 1c @High }
X// @ShowLabels
X}
X}
X
X@LP
X@ID {
X5c @Wide @Code {
X"@Polygon"
X" sides { 3 }"
X" angle { 180/sides }"
X}
X||7ct
X@Fig {
X@Figure shape { 0 0 xsize 0 xsize ysize 0 ysize 0 0 } paint { grey }
Xlinestyle { noline } margin { 0c }
X@Polygon margin { 0c }
X{ 2c @Wide 1c @High }
X|| @ShowLabels ||0.5c ... ||0.5c
X@Figure shape { 0 0 xsize 0 xsize ysize 0 ysize 0 0 } paint { grey }
Xlinestyle { noline } margin { 0c }
X@Polygon sides { 12 } margin { 0c }
X{ 2c @Wide 1c @High }
X||1c ...
X// @ShowLabels
X}
X}
X
X@ID {
X5c @Wide @Code "@Ellipse"
X||7ct
X@Fig {
X@Figure shape { 0 0 xsize 0 xsize ysize 0 ysize 0 0 } paint { grey }
Xlinestyle { noline } margin { 0c }
X@Ellipse margin { 0c }
X{ 2c @Wide 1c @High }
X// @ShowLabels
X}
X}
X
X@LP
X@ID {
X5c @Wide @Code "@Circle"
X||7ct
X@Fig {
X@Figure shape { 0 0 xsize 0 xsize ysize 0 ysize 0 0 } paint { grey }
Xlinestyle { noline } margin { 0c }
X@Circle margin { 0c }
X{ 2c @Wide 1c @High }
X// @ShowLabels
X}
X}
X@LP
X
XThe following standard shapes have the same options as
X{@Code "@Fig"}, including the four arrow-drawing options,
Xand occasionally they have others. In each case the only difference
Xbetween the line and arrow symbols is the default value of
X{@Code "arrow"}, which lines take from {@Code "@Fig"} and arrows set
Xto {@Code "forward"}. The first four draw a line along the mark of the
Xright parameter, which is not necessarily the same as its left or top
Xedge.
X@LP
X@ID {
X5c @Wide @Code {
X"@HLine"
X" margin { 0c }"
X}
X||7ct
X@Fig {
X@Figure shape { 0 0 xsize 0 xsize ysize 0 ysize 0 0 } paint { grey }
Xlinestyle { noline } margin { 0c }
X@HLine
X{ 2c @Wide 1c @High }
X// @ShowLabels
X}
X}
X
X@ID {
X5c @Wide @Code {
X"@HArrow"
X" margin { 0c }"
X" arrow { forward }"
X}
X||7ct
X@Fig {
X@Figure shape { 0 0 xsize 0 xsize ysize 0 ysize 0 0 } paint { grey }
Xlinestyle { noline } margin { 0c }
X@HArrow
X{ 2c @Wide 1c @High }
X// @ShowLabels
X}
X}
X
X@ID {
X5c @Wide @Code {
X"@VLine"
X" margin { 0c }"
X}
X||7ct
X@Fig {
X@Figure shape { 0 0 xsize 0 xsize ysize 0 ysize 0 0 } paint { grey }
Xlinestyle { noline } margin { 0c }
X@VLine
X{ 2c @Wide 1c @High }
X// @ShowLabels
X}
X}
X
X@ID {
X5c @Wide @Code {
X"@VArrow"
X" margin { 0c }"
X" arrow { forward }"
X}
X||7ct
X@Fig {
X@Figure shape { 0 0 xsize 0 xsize ysize 0 ysize 0 0 } paint { grey }
Xlinestyle { noline } margin { 0c }
X@VArrow
X{ 2c @Wide 1c @High }
X// @ShowLabels
X}
X}
X
X@ID {
X5c @Wide @Code {
X"@Line"
X" from { 0 ysize }"
X" to { xsize 0 }"
X" margin { 0c }"
X}
X||7ct
X@Fig {
X@Figure shape { 0 0 xsize 0 xsize ysize 0 ysize 0 0 } paint { grey }
Xlinestyle { noline } margin { 0c }
X@Line
X{ 2c @Wide 1c @High }
X// @ShowLabels
X}
X}
X
X@ID {
X5c @Wide @Code {
X"@Arrow"
X" from { 0 ysize }"
X" to { xsize 0 }"
X" margin { 0c }"
X" arrow { forward }"
X}
X||7ct
X@Fig {
X@Figure shape { 0 0 xsize 0 xsize ysize 0 ysize 0 0 } paint { grey }
Xlinestyle { noline } margin { 0c }
X@Arrow
X{ 2c @Wide 1c @High }
X// @ShowLabels
X}
X}
X
X@ID {
X5c @Wide @Code {
X"@Arc"
X" from { 0 ysize }"
X" to { xsize 0 }"
X" ctr { 0 0 }"
X" direction { clockwise }"
X" margin { 0c }"
X}
X||7ct
X@Fig {
X@Figure shape { 0 0 xsize 0 xsize ysize 0 ysize 0 0 } paint { grey }
Xlinestyle { noline } margin { 0c }
X@Arc
X{ 2c @Wide 1c @High }
X// @ShowLabels
X}
X}
X
XMore generally, the @Code "@Figure" symbol takes all the options of
X@Code "@Fig" except {@Code "maxlabels"}, together with a @Code shape
Xoption containing a sequence of points, and it connects each pair of
Xpoints by a line or curve as specified by the following:


X@ID @Tab
X vmargin { 0.5vx }

X @Fmta { @Col A ! @Col B }
X{
X@Rowa
X A { @I { point point } }
X B { Straight line }
X@Rowa
X A { @I { point } @Code "[" &0.5s @Code "]" @I { point } }
X B { Draw nothing }
X@Rowa
X A { @I { point } @Code "[" @I point @Code "]" @I { point } }
X B { Anticlockwise circular or elliptical arc }
X@Rowa
X A { @I { point } @Code "[" @I point @Code "clockwise ]" @I { point } }
X B { Clockwise circular or elliptical arc }
X@Rowa
X A { @I { point } @Code "[" @I {point point} @Code "]" @I { point } }
X B { Bezier curve with two control points }
X}
X@LP
XThe remaining symbols do not draw shapes. They are
X@ID lines @Break {
X@I colour @Code "@Colour" @I object
X@I colour @Code "@Color" @I object
X}
XPrint @I object in {@I colour}, which may be {@Code "white"},
X{@Code "grey"}, {@Code "gray"}, {@Code "black"}, {@Code "red"},
X{@Code "green"}, or {@Code "blue"} at least.
X@ID lines @Break {
X@Code "{" @I {number number number} @Code "} @RGBColour" @I object
X@Code "{" @I {number number number} @Code "} @RGBColor" @I object
X@Code "{" @I {number number number} @Code "} @HSBColour" @I object
X@Code "{" @I {number number number} @Code "} @HSBColor" @I object
X}
XPrint @I object in the colour defined by the three numbers, using the
Xred-green-blue or hue-saturation-brightness colour models.
X@ID {
X@I point @Code "@Label" @I label
X}
XWithin a shape, makes @I label stand for the point on the page denoted
Xby {@I point}, which is not made part of the shape. The label applies
Xfrom here onwards until some other point is given this label, a
Xrelabelling occurs, or the figure ends.
X@ID {
X@I label @Code "::" @I object
X}
XRelabel every labelled point in the right parameter (which may be an
Xarbitrary Lout object), by adding {@I label}{@Code "@"} to the front of
Xeach label.
X@ID {
X@Code "@Frame" @I object
X}
XEquivalent to @Code "@Figure shape {xsize 0 @Label X 0 ysize @Label Y}"
X@I object & .
X@ID {
X@I point @Code "@BaseOf" @I object
X}
XTranslate @I object so that its bottom left-hand corner appears at
X{@I point}. Lout thinks that the result is an empty object.
X@ID {
X@I point @Code "@MarkOf" @I object
X}
XTranslate @I object so that the point where its marks cross appears at
X{@I point}. Lout thinks that the result is an empty object.
X@ID {
X@Code "@ShowLabels"
X}
XDisplay all the labels of the figure created up to this point.
X@PP
XThe following lists define all the ways to specify lengths, angles and
Xpoints.
X@FootNote {
XA length is represented in PostScript by a single number on the operand
Xstack; so is an angle. A point is represented by two numbers on the
Xstack. Those familiar with PostScript and willing to sacrifice portability
Xand increase their risk of error can therefore write, for example,
X@OneCol {@I length @Code "sqrt"} within a shape, to obtain a length which
Xis the square root of another length, or @OneCol { @I point @Code "exch" }
Xto obtain the reflection of a point about the main diagonal, and so on.
X}
XBrief explanations appear to the right, with the symbols' precedences in
Xparentheses where appropriate.
X@DP
X@Tab
X vmargin { 0.5vx }
X @Fmth { @Col { &@DispIndent A } ! @Col }
X @Fmta { @Col { &@DispIndent &2s A } ! @Col B }
X{
X@Rowh A { @I length } vmargin { 0.2vx }
X@Rowh
X@Rowa
X A { 0 }
X B { zero }
X@Rowa
X A { @Code xmark }
X B { distance to column mark }
X@Rowa
X A { @Code ymark }
X B { distance to row mark }
X@Rowa
X A { @Code xsize }
X B { distance to right boundary }
X@Rowa
X A { @Code ysize }
X B { distance to top boundary }
X@Rowa
X A { @I number @Code in }
X B { @I number inches (39) }
X@Rowa
X A { @I number @Code cm }
X B { @I number centimetres (39) }
X@Rowa
X A { @I number @Code pt }
X B { @I number points (39) }
X@Rowa
X A { @I number @Code em }
X B { @I number ems (39) }
X@Rowa
X A { @I number @Code sp }
X B { 1 sp is the current width of a space (39) }
X@Rowa
X A { @I number @Code vs }
X B { 1 vs is the current inter-line space (39) }
X@Rowa
X A { @I number @Code ft }
X B { 1 ft is the size of the current font (39) }
X@Rowa
X A { @I point @Code "@Distance" @I point }
X B { distance between two points (35) }
X@Rowa
X A { @I point @Code "@XDistance" @I point }
X B { horizontal distance between two points (35) }
X@Rowa
X A { @I point @Code "@YDistance" @I point }
X B { vertical distance between two points (35) }
X@Rowh
X@Rowh
X@Rowh A { @I angle } vmargin { 0.2vx }
X@Rowh
X@Rowa
X A { @I number @Code dg }
X B { @I number degrees (39) }
X@Rowa
X A { @I number }
X B { @I number degrees (@Code dg is optional) }
X@Rowa
X A { @I point @Code "@Angle" @I point }
X B { angle from first point to second (35) }
X@Rowh
X@Rowh
X@Rowh A { @I point } vmargin { 0.2vx }
X@Rowh
X@Rowa
X A { @I {length length} }
X B { @I x and @I y distance from origin (5) }
X@Rowa
X A { @I length @Code "<<" @I angle }
X B { distance and angle from origin (38) }
X@Rowa
X A { @I point @Code "++" @I point }
X B { vector sum of two points (36) }
X@Rowa
X A { @I point @Code "--" @I point }
X B { vector difference of two points (36) }
X@Rowa
X A { @I point @Code "@Max" @I point }
X B { vector maximum of two points (36) }
X@Rowa
X A { @I point @Code "@Min" @I point }
X B { vector minimum of two points (36) }
X@Rowa
X A { @I point @Code "**" @I number }
X B { multiplication of point by number (37) }
X@Rowa
X A { @I label }
X B { a previously defined label }
X@Rowa
X A { @Code "@Prev" }
X B { the previous point in a shape }
X}
X@End @Section
END_OF_FILE
if test 12131 -ne `wc -c <'lout/doc/tr.fig/s8'`; then
echo shar: \"'lout/doc/tr.fig/s8'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.fig/s8'
fi
if test -f 'lout/doc/tr.impl/s2.4' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.impl/s2.4'\"
else
echo shar: Extracting \"'lout/doc/tr.impl/s2.4'\" \(12152 characters\)
sed "s/^X//" >'lout/doc/tr.impl/s2.4' <<'END_OF_FILE'
X@SubSection
X @Tag { objects.impl }
X @Title { Implementation of objects and concatenation }
X@Begin
X@PP
XIn this section we discuss the implementation of objects and concatenation,
Xand especially mark alignment. The first step is to use an operator
Xprecedence parser to convert input such as
X@ID @Code "a |0.5i b /0.2i c | d"
Xinto parse trees such as
X@ID @Eq {
X@Fig {
X@Tree {
X@Node @FCircle fraction
X@FirstSub {
X @Node @FCircle bar
X @FirstSub { @Node @FCircle a }
X @NextSub { @Node @FEllipse 0.5i }
X @NextSub { @Node @FCircle b }
X}
X@NextSub { @Node @FEllipse 0.2i }
X@NextSub {
X @Node @FCircle bar
X @FirstSub { @Node @FCircle c }
X @NextSub { @Node @FCircle }
X @NextSub { @Node @FCircle d }
X}
X}
X}
X}
XMissing objects are replaced by empty objects, and sequences of
Xconcatenation operators are consolidated:
X@ID @Eq {
X@Fig {
X@Tree {
X@Node @FCircle bar
X@FirstSub { @Node @FCircle a }
X@NextSub { @Node @FEllipse 0.2i }
X@NextSub {
X @Node @FCircle bar
X @FirstSub { @Node @FCircle c }
X @NextSub { @Node @FEllipse 0.3i }
X @NextSub { @Node @FCircle d }
X}
X}
X}
X&2m ==> &2m
X@Fig {
X@Tree {
X@Node @FCircle bar
X@FirstSub { @Node @FCircle a }
X@NextSub { @Node @FEllipse 0.2i }
X@NextSub { @Node @FCircle c }
X@NextSub { @Node @FEllipse 0.3i }
X@NextSub { @Node @FCircle d }
X}
X}
X}
Xto make manifest their associativity and reduce the depth of the tree
Xfor efficiency later.
X@PP
XThe required semantic information is the size of each subobject,
Xconsisting of four integers: width to left and right of the
Xdistinguished column mark, and height above and below the distinguished
Xrow mark. These numbers are always non-negative in Basser Lout, but
Xthis restriction is unnecessary and should be dropped.
X@PP
XFor the leaves, which are simple words, the numbers are obtained from
Xfont tables. For the higher levels we apply recursive rules. Suppose
Xthat @Eq { hgap(x, g, y) } returns the desired distance between the
Xcolumn marks of objects @Eq { x } and @Eq { y } when they are separated by
Xgap @Eq { g }: @Eq { right(x) + length(g) + left(y) } when the gap mode is
Xedge-to-edge, the larger of @Eq { length(g) } and
X@Eq { right(x) + left(y) } when the mode is mark-to-mark, and so on. Given
Xan object
X@ID @Eq {
XX = x sub 1 ````` bar g sub 1 ````` ... ````` { "-2p" @Font "^"}bar g sub i-1
X````` x sub i ````` ... ````` bar g sub n-1 ````` x sub n
X}
Xwe may calculate its size as follows:
X@ID @Eq {
Xleft(X) ^= left( x sub 1 ) + hgap( x sub 1 , g sub 1 , x sub 2 )
X+ ... + hgap( x sub i-1 , g sub i-1 , x sub i )
X/1.4vx
Xright(X) ^= hgap( x sub i , g sub i , x sub i+1 )
X+ ... + hgap( x sub n-1 , g sub n-1 , x sub n ) + right( x sub n )
X/1.4vx
X"above"(X) ^= "above"(x sub 1 ) up ... up "above"(x sub n )
X/1.4vx
X"below"(X) ^= "below"(x sub 1 ) up ... up "below"(x sub n )
X}
Xwhere @Eq { non up } returns the larger of its two parameters. Similar
Xformulas are easily derived for the other operators.
X@PP
XFor purposes of exposition we will now make the simplifying
Xassumptions that all gaps are {@Code "0i"}, all column marks lie at
Xthe left edge, and all row marks lie at the top edge. Then the size
Xof each object can be expressed by just two numbers, width and
Xheight, and the four formulas reduce to
X@ID @Eq {
Xwidth( x sub 1 rel bar ... rel bar x sub n ) ^=
Xwidth( x sub 1 ) + ... + width( x sub n )
X/1.4vx
Xheight( x sub 1 rel bar ... rel bar x sub n ) ^=
Xheight( x sub 1 ) up ... up height( x sub n )
X}
XThe corresponding formulas for vertical concatenation are
X@ID @Eq {
Xwidth( x sub 1 rel "/" ... rel "/" x sub n ) ^=
Xwidth( x sub 1 ) up ... up width( x sub n )
X/1.4vx
Xheight( x sub 1 rel "/" ... rel "/" x sub n ) ^=
Xheight( x sub 1 ) + ... + height( x sub n )
X}
XAccording to these formulas, the height of
X@ID @Eq { @Fig { @Tree {
X@Node @FCircle fraction
X@LeftSub {
X @Node @FCircle bar
X @LeftSub { @Node @FCircle a }
X @RightSub { @Node @FCircle b }
X}
X@RightSub {
X @Node @FCircle bar
X @LeftSub { @Node @FCircle c }
X @RightSub { @Node @FCircle d }
X}
X}}}
Xis
X@ID @Eq {
X[ height(a) up height(b)] + [ height(c) up height(d)]
X}
Xwhich is correct, but for width they yield
X@ID @Eq {
X[ width(a) + width(b)] up [ width(c) + width(d)]
X}
Xwhich is not, since it does not take the merging of column marks into
Xaccount. The asymmetry between horizontal and vertical has come
Xabout because the row entries, such as @Eq {a} and {@Eq {b}}, are
Xadjacent in the tree, but the column entries, such as @Eq {a} and
X{@Eq {c}}, are not. It would be possible to solve this cross-linking
Xproblem by augmenting the size information stored in each node to
Xrecord the number of marks and the size of each, but the author has
Xpreferred the following method which makes structural changes to the
Xtree instead.
X@PP
XIf @Eq { a } and @Eq { c } share a column mark, they each might as well
Xhave width { @Eq {width(a) up width(c) }}, since all width calculations
Xapply to entire columns. Accordingly, we introduce a new operator,
X@Eq {COL}, defined by
X@ID @Eq { width( x sub 1 bin COL ... bin COL x sub n ) =
Xwidth( x sub 1 ) up ... up width( x sub n )
X}
Xand replace both @Eq { a } and @Eq { c } by {@Eq { a bin COL c }}. To
Xprevent @Eq { COL } operators from disturbing height calculations, we
Xdefine a binary operator called @Eq { SPLIT } by
X@ID @Eq { width( x bin SPLIT y) ^= width(x)
X/1.4vx
Xheight( x bin SPLIT y) ^= height(y) }
Xwhich switches height and width calculations onto different
Xsubtrees. Then the transformation
X@ID @Eq {
X@Fig { @Tree {
X @Node @FCircle a
X}}
X&2m ==> &2m
X@Fig { @Tree {
X @Node @FEllipse SPLIT
X @LeftSub {
X @Node @FEllipse COL
X @LeftSub { @Node @FCircle a }
X @RightSub { @Node @FCircle c }
X }
X @RightSub { @Node @FCircle a }
X}}
X}
X# where @Eq { S } denotes a @Eq { SPLIT } node and @Eq { C } denotes a
X# @Eq { COL } node,
Xwidens @Eq { a } to @Eq {width(a) up width(c) } without affecting its height;
Xit is applied to every object that shares its column mark with at least
Xone other object. A similar transformation involving a @Eq { ROW } operator
Xdeals with shared row marks. The effect on our little table is to replace
X@ID @Eq { @Fig { @Tree {
X@Node @FCircle fraction
X@LeftSub {
X @Node @FCircle bar
X @LeftSub { @Node @FCircle a }
X @RightSub { @Node @FCircle b }
X}
X@RightSub {
X @Node @FCircle bar
X @LeftSub { @Node @FCircle c }
X @RightSub { @Node @FCircle d }
X}
X}}}
Xby
X@ID @Eq { @Fig maxlabels { "70" } { @Tree hmargin { "0.1c" } {
X@Node @FCircle fraction
X@FirstSub {
X @Node @FCircle bar
X @FirstSub {
X @Node @FEllipse SPLIT
X @FirstSub {
X @Node @FEllipse COL
X @FirstSub { @Node @FCircle a }
X @NextSub { @Node @FCircle c }
X }
X @NextSub {
X @Node @FEllipse ROW
X @FirstSub { @Node @FCircle a }
X @NextSub { @Node @FCircle b }
X }
X }
X @NextSub {
X @Node @FEllipse SPLIT
X @FirstSub {
X @Node @FEllipse COL
X @FirstSub { @Node @FCircle b }
X @NextSub { @Node @FCircle d }
X }
X @NextSub {
X @Node @FEllipse ROW
X @FirstSub { @Node @FCircle a }
X @NextSub { @Node @FCircle b }
X }
X }
X}
X@NextSub {
X @Node @FCircle bar
X @FirstSub {
X @Node @FEllipse SPLIT
X @FirstSub {
X @Node @FEllipse COL
X @FirstSub { @Node @FCircle a }
X @NextSub { @Node @FCircle c }
X }
X @NextSub {
X @Node @FEllipse ROW
X @FirstSub { @Node @FCircle c }
X @NextSub { @Node @FCircle d }
X }
X }
X @NextSub {
X @Node @FEllipse SPLIT
X @FirstSub {
X @Node @FEllipse COL
X @FirstSub { @Node @FCircle b }
X @NextSub { @Node @FCircle d }
X }
X @NextSub {
X @Node @FEllipse ROW
X @FirstSub { @Node @FCircle c }
X @NextSub { @Node @FCircle d }
X }
X }
X}
X}}}
XIn fact, common subexpressions are identified (trivially) and the result
Xis a directed acyclic graph; each affected leaf has two parents, one for
Xwidth and one for height; and each @Eq { COL } or @Eq { ROW } node has
Xone parent and one child for each object lying on the corresponding
Xmark. The data structure roughly doubles in size, and this occurs only
Xrarely in practice.
X@PP
XThis method can cope with any legal input, including
X@ID @Code {
X"{ a // c | d } | { b / e }"
X"/ { f / i } | { g | h // j }"
X}
Xwhich produces overlapping spanning columns:
X@ID @I @Fig {
X @FBox margin { 0.2c } width { 1.6c } 1.2f @Font a |
X @FBox margin { 0.2c } width { 0.6c } 1.2f @Font b |
X// @FBox margin { 0.2c } width { 0.6c } 1.2f @Font c |
X @FBox margin { 0.2c } width { 0.6c } 1.2f @Font d |
X @FBox margin { 0.2c } width { 0.6c } 1.2f @Font e |
X// @FBox margin { 0.2c } width { 0.6c } 1.2f @Font f |
X @FBox margin { 0.2c } width { 0.6c } 1.2f @Font g |
X @FBox margin { 0.2c } width { 0.6c } 1.2f @Font h |
X// @FBox margin { 0.2c } width { 0.6c } 1.2f @Font i |
X @FBox margin { 0.2c } width { 1.6c } 1.2f @Font j |
X}
XThe boxes have been added to clarify the structure. The width of this
Xobject is formally
X@ID @Eq { ((width(a) up (x + y)) + z) up (x + ((y + z) up width(j))) }
Xwhere
X@IL
X@ListItem @Eq { x = width(c) up width(`f`) up width(i) }
X@ListItem @Eq { y = width(d`) up width(g) }
X@ListItem @Eq { z = width(b) up width(e) up width(h) }
X@EL
XIt seems clear that @Eq { y } at least must appear twice in any
Xexpression for the width of this object made out of simple addition
Xand maxing operations, showing that an ordinary tree
Xstructure is insufficient for overlapping spanning columns. The Basser
XLout interpreter actually rejects such structures, owing to the author's
Xdoubts about the implementability of @I Constrained and @I AdjustSize
X(Section {@NumberOf constraints}) on them; but with hindsight this caution
Xwas unnecessary.
X@PP
XThe directed acyclic graph is ordered in the sense that the order of
Xthe edges entering and leaving each node matters. The structure is
Xhighly dynamic, and traversals both with and against the arrows are
Xrequired. After a few ad-hoc attempts to extend the usual tree
Xrepresentation had failed, the author developed a representation based
Xon doubly linked lists of records denoting links, whose flexibility more
Xthan compensated for the somewhat excessive memory consumption. For example,
X@ID @Eq { @Fig {
X A:: @FCircle a |2c |2c B:: @FCircle b
X/1.5c C:: @FCircle c | D:: @FCircle d
X// A @JoinFigures arrow { forward } C
X// A @JoinFigures arrow { forward } D
X// B @JoinFigures arrow { forward } D
X}}
Xis represented by
X@CD @Eq { @Fig maxlabels { "300" } {
XA:: @DagBox mid { @BlackDot } base { a } |2c |2c |2c |2c
XB:: @DagBox mid { @BlackDot } base { b }
X/1c L:: @DagBox top { @BlackDot } mid { @BlackDot } base { LK }
X| M:: @DagBox top { @BlackDot } mid { @BlackDot } base { LK }
X| | N:: @DagBox top { @BlackDot } mid { @BlackDot } base { LK }
X/1c
XC:: @DagBox top { @BlackDot } base { c } | |
XD:: @DagBox top { @BlackDot } base { d }
X// @TVShape nw { A@MID@CTR } ne { A@MID@CTR } sw {L@MID@CTR } se { M@MID@CTR }
X// @TVShape nw { L@TOP@CTR } ne { L@TOP@CTR } sw {C@TOP@CTR } se { C@TOP@CTR }
X// @TVShape nw { M@TOP@CTR } ne { N@TOP@CTR } sw {D@TOP@CTR } se { D@TOP@CTR }
X// @TVShape nw { B@MID@CTR } ne { B@MID@CTR } sw {N@MID@CTR } se { N@MID@CTR }
X}}
Xwhere @Eq { LK } tags a record representing a link. The first list
Xin any node contains all the incoming links, the second contains the
Xoutgoing ones. The node serves as the header for both lists. The
Xrequired operations reduce to simple appends, deletes, and traversals
Xof doubly linked lists, all having small constant cost. There is a
Xhighly tuned memory allocator, and care is taken to dispose of each node
Xwhen the last incoming link is deleted, so that there is no need for
Xgarbage collection.
X@PP
XIn normal use the number of nodes at higher levels of the dag is small
Xin comparison with the leaves and their incoming links, so we may
Xestimate the space complexity at about 60 bytes per input word (20 bytes
Xper link, 40 per leaf node). Careful optimization could easily halve
Xthis, but since memory is reclaimed after printing each page there is
Xlittle need.
X@End @SubSection
END_OF_FILE
if test 12152 -ne `wc -c <'lout/doc/tr.impl/s2.4'`; then
echo shar: \"'lout/doc/tr.impl/s2.4'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.impl/s2.4'
fi
if test -f 'lout/doc/tr.lout/ch1.04' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch1.04'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch1.04'\" \(10331 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch1.04' <<'END_OF_FILE'
X@Section
X @Title { Galleys }
X @Tag { galleys }
X@Begin
X@PP
XIt is time to pause and ask ourselves how close we are to achieving our
Xaim of producing neatly formatted documents. We can certainly produce
Xthe pieces of a document, using the page layout definitions from Section
X{@NumberOf definitions}:
X@ID {
X
Xnohyphen @Break @LittlePageColumn {


X@DP
X|0.5rt {@B PURCELL}{ 0.8f @Font 1 ^//0.2v}

X@DP
XIn the world of music England is supposed to be a mere province. If she
Xproduces an indifferent composer or performer, that is regarded
Xelsewhere as perfectly normal and natural; but if foreign students of
Xmusical history have to acknowledge a British musical genius, he is
Xconsidered a freak.
X@PP
XSuch a freak is Henry Purcell. Yet if we make a choice of fifteen of
Xthe world's musical classics, as here, we find that we cannot omit this
XEnglish master.
X}
X

X||1c
X
X@LittlePageColumn


X{ { 0.8f @Font 1 ^//0.2v}Blom, Eric. @I {Some Great Composers.} Oxford, 1944.
X}
X

X||1c
X
X@Code {
X @LittlePage { "@TextPlace" //1rt "@FootSect" }
X// @LittlePage { "@TextPlace" //1rt "@FootSect" }
X// @LittlePage { "@TextPlace" //1rt "@FootSect" }
X//0.2c 8p @Font "@PageList"
X}
X
X}
Xbut when we try to merge them together, we encounter two obstacles.
X@PP
XFirst, when an object is entered at a certain place in the document, it
Xappears at that place. But a footnote is naturally entered immediately
Xafter the point it refers to (`{-2p @Font PURCELL}' in this case), yet it
Xappears somewhere else: at the bottom of a page.
X@PP
XSecond, all our features build up larger objects out of smaller ones,
Xbut the -2p @Font PURCELL object, for example, must be broken down into
Xpage-sized pieces. This occurs when the available space at the
X`somewhere else' is insufficient to hold the entire object, so this
Xsecond obstacle arises out of the first.
X@PP
XLout's last major feature, which we introduce to overcome these
Xobstacles, is the @I galley
Xgalley.feature @Index { Galleys }
X(the name is borrowed from the galleys
Xused in manual typesetting). A galley is an object plus a cross
Xreference which points to where the object is to appear. The example
Xabove has three galleys:
X@ID {
X
X{
X//0.1c
X
Xnohyphen @Break @LittlePageColumn {


X@DP
X|0.5rt {@B PURCELL}{ 0.8f @Font 1 ^//0.2v}

X@DP
XIn the world of music England is supposed to be a mere province. If she
Xproduces an indifferent composer or performer, that is regarded
Xelsewhere as perfectly normal and natural; but if foreign students of
Xmusical history have to acknowledge a British musical genius, he is
Xconsidered a freak.
X@PP
XSuch a freak is Henry Purcell. Yet if we make a choice of fifteen of
Xthe world's musical classics, as here, we find that we cannot omit this
XEnglish master.

X} { //0.4c 180d @Rotate @Arrow 2.0c }
X
X}
X
X||0io ||4.8c
X
X@Code {
X @LittlePage { "@TextPlace" //1rt "@FootSect" }
X// @LittlePage { "@TextPlace" //1rt "@FootSect" }
X// @LittlePage { "@TextPlace" //1rt "@FootSect" }
X//0.2c 8p @Font "@PageList"
X} 180d @Rotate @Arrow 1i @I -2p @Font {to printer}
X
X||0io ||2.0c
X{
X//3.9c
X
X{ @Arrow 1.7c } nohyphen @Break @LittlePageColumn
X{ { 0.8f @Font 1 ^//0.2v}Blom, Eric. @I {Some Great Composers.} Oxford, 1944.
X}
X}
X}
XA galley replaces the invocation pointed to by its cross reference. If
Xspace is not sufficient there to hold it all, the remainder of the
Xgalley is split off (the vertical concatenation symbol preceding it
Xbeing discarded) and it replaces later invocations of the same symbol.
XThis is exactly what is required to get text and footnotes onto pages.
X@PP
XTo create a galley, first define a symbol with a
Xspecial @Code into
Xinto @Index { @Code into clause }


Xclause, like this:
X@ID @Code {

X"def @FootNote into { @FootPlace&&following }"
X" right x"
X"{"
X" 8p @Font x"
X"}"
X}
XAn invocation of such a symbol will then be a galley whose object is the
Xresult of the invocation, and whose cross reference is given by the
X@Code into clause. The right parameter of the cross reference must be
Xeither @Code preceding or @Code following.
X@PP
XA symbol, like @Code "@FootPlace", which is the @I target of a galley,
Xtarget @Index { Target of a galley }
Xmust contain the special symbol @@Galley exactly once in its body; often
Xthis is all that the body contains:
X@ID @Code {
X"def @FootPlace { @Galley }"
X}
XIt is this special symbol that is replaced by the incoming galley, in
Xfact, not the @Code "@FootPlace" symbol as a whole.
X@PP
XA symbol which contains @@Galley, either directly within its body or
Xindirectly within the body of a symbol it invokes, is called a @I receptive
Xreceptive @Index { Receptive symbol }
Xsymbol, meaning receptive to galleys. @Code "@FootPlace" is receptive, which
Xmakes @Code "@FootList", @Code "@FootSect" and @Code "@PageList"
Xreceptive since they invoke @Code "@FootPlace". If no galley replaces
Xany @@Galley within some invocation of a receptive symbol, that
Xinvocation is replaced by @@Null. The advantages of this rule for page
Xlayout were explained at the end of Section {@NumberOf definitions}.
X@PP
XLet us now follow through the construction of our example
Xdocument. Initially there is just the one @I root
Xroot.galley @Index { Root galley }
Xgalley, containing an unexpanded invocation of @Code "@PageList":
X@ID { ||5c
X10p @Font @Code "@PageList" 180d @Rotate @Arrow 1i @I -2p @Font {to printer}
X}
XThen the -2p @Font PURCELL galley appears, targeted to a @Code
X"@TextPlace". Lout knows that there is a @Code "@TextPlace" hidden
Xinside @Code "@PageList", so it expands @Code "@PageList":
X@ID {
X
X{
X//0.1c
X
Xnohyphen @Break @LittlePageColumn {


X@DP
X|0.5rt {@B PURCELL}{ 0.8f @Font 1 ^//0.2v}

X@DP
XIn the world of music England is supposed to be a mere province. If she
Xproduces an indifferent composer or performer, that is regarded
Xelsewhere as perfectly normal and natural; but if foreign students of
Xmusical history have to acknowledge a British musical genius, he is
Xconsidered a freak.
X@PP
XSuch a freak is Henry Purcell. Yet if we make a choice of fifteen of
Xthe world's musical classics, as here, we find that we cannot omit this
XEnglish master.

X} { //0.4c 180d @Rotate @Arrow 2.2c }
X}
X
X||0io ||5c
X
X@Code {
X @LittlePage { "@TextPlace" //1rt "@FootSect" }
X//0.2c 8p @Font "@PageList"
X} 180d @Rotate @Arrow 1i @I -2p @Font {to printer}
X
X}
XAfter promoting the first line into @Code "@TextPlace", the footnote
Xgalley attached to it appears and demands an invocation of
X@Code "@FootPlace" following its attachment point
X(`{-2p @Font PURCELL}'). Such a @Code "@FootPlace" is found at
Xthe bottom of the first page, inside @Code "@FootSect", which is
Xaccordingly expanded, and the footnote is promoted onto the page:
X@ID {
X
X{
X//1.2c
X
Xnohyphen @Break @LittlePageColumn {


XIn the world of music England is supposed to be a mere province. If she
Xproduces an indifferent composer or performer, that is regarded
Xelsewhere as perfectly normal and natural; but if foreign

Xstudents of musical history have to acknowledge a British musical genius,
Xhe is considered a freak.


X@PP
XSuch a freak is Henry Purcell. Yet if we make a choice of fifteen of
Xthe world's musical classics, as here, we find that we cannot omit this
XEnglish master.

X} 180d @Rotate @Arrow 2.2c
X}
X
X||0io ||5c
X
X{


Xnohyphen @Break @LittleDocument
X//
X@LittleText {
X@DP
X|0.5rt {@B PURCELL}{ 0.8f @Font 1 ^//0.2v}
X@LittleFootNote
X{ { 0.8f @Font 1 ^//0.2v}Blom, Eric. @I {Some Great Composers.} Oxford, 1944.

X//1vx @Code "@FootList"
X}
X//1vx @Code "@TextPlace" }
X//
X@LittleEndRun
X//0.2c 8p @Font @Code "@PageList"
X} 180d @Rotate @Arrow 1i -2p @Font @I {to printer}
X
X}
XNow the promotion of the -2p @Font PURCELL galley resumes. When the
Xfirst page is filled, Lout searches forwards for another @Code "@TextPlace"
Xto receive the remainder, once again expanding a @Code "@PageList":
X@ID {
X
X{
X//4.85c
X
Xnohyphen @Break @LittlePageColumn {
Xperformer, that is regarded


Xelsewhere as perfectly normal and natural; but if foreign

Xstudents of musical history have to acknowledge a British musical genius,
Xhe is considered a freak.


X@PP
XSuch a freak is Henry Purcell. Yet if we make a choice of fifteen of
Xthe world's musical classics, as here, we find that we cannot omit this
XEnglish master.

X} 180d @Rotate @Arrow 2.2c
X}
X
X||0io ||5c
X
X{


Xnohyphen @Break @LittleDocument
X//
X@LittleText {
X@DP
X|0.5rt {@B PURCELL}{ 0.8f @Font 1 ^//0.2v}
X@LittleFootNote
X{ { 0.8f @Font 1 ^//0.2v}Blom, Eric. @I {Some Great Composers.} Oxford, 1944.
X}
X@DP

X @HExpand {In the world of music}
X//1vx @HExpand {England is supposed to}
X//1vx @HExpand {be a mere province. If}
X//1vx @HExpand {she produces an indifferent composer or}
X}
X//
X@LittleEndRun
X// @LittlePage { @Code "@TextPlace" //1rt @Code "@FootSect" }
X//0.2c 8p @Font @Code "@PageList"
X} 180d @Rotate @Arrow 1i -2p @Font @I {to printer}
X
X}
Xand so on until the entire galley is promoted. All these expansions and
Xreplacements are done with total
Xintegrity. For example, if Lout finds after expanding @Code "@FootSect"
Xthat the page is too full to accept even the first line of the footnote,
X@Code "@FootSect" is reset to unexpanded and the search for a target for
Xthe footnote moves on. And the cross reference direction, @Code
Xpreceding or @Code following, is always obeyed (although lack of space
Xsometimes prevents Lout from choosing the nearest target). Only the
Xroot galley contains receptive symbols in our running example, but in
Xfact any galley may contain them, without restriction.
X@PP
XWhen footnotes are placed at the bottom of a page, they appear there in
Xfirst come, first served order. To make galleys appear in sorted order, as
Xsorted.galley @Index { Sorted galleys }
Xis needed in bibliographies and indexes, a parameter or nested definition
Xwith the special name @@Key
Xkey. @Index { @@Key parameter }
Xis added to the galley definition, like this:
X@ID @Code {
X"def @IndexEntry into { @IndexPlace&&following }"
X" left @Key"
X" right x"
X"{ x }"
X}
XLike @@Tag, @@Key must be set to a simple word when the galley is invoked:
X@ID @Code {
X"cities @IndexEntry { cities, comparison of, 27 }"
X}
Xand this key is used to sort the galleys. If several sorted galleys
Xwith the same key are sent to the same place, only one of them is
Xprinted, since the others are probably unwanted duplicates.
X@PP
XThe discussion of galleys is continued at a more detailed level in
XSection {@NumberOf targets}.
X@End @Section
END_OF_FILE
if test 10331 -ne `wc -c <'lout/doc/tr.lout/ch1.04'`; then
echo shar: \"'lout/doc/tr.lout/ch1.04'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch1.04'
fi
if test -f 'lout/doc/tr.lout/ch3.02' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch3.02'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch3.02'\" \(12202 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch3.02' <<'END_OF_FILE'
X@Section
X @Title { Concatenation symbols and paragraphs }
X @Tag { concatenation }
X@Begin
X@PP
XThere are ten concatenation symbols, in three families:
Xconcatenation. @Index { Concatenation symbols }


X@ID @Tab
X vmargin { 0.5vx }

X @Fmta { @Col @Code A ! @Col @Code B ! @Col @Code C ! @Col @Code D ! @Col E }
X{
X@Rowa A { "/" } B { "^/" } C { "//" } D { "^//" } E { Vertical concatenation }
X@Rowa A { "|" } B { "^|" } C { "||" } D { "^||" } E { Horizontal concatenation }
X@Rowa A { "&" } B { "^&" } C { } D { } E {In-paragraph concatenation}
X}
XEach symbol produces an object which combines together the two
Xparameters. The right parameter must be separated from the symbol by at
Xleast one white space character.
X@PP
XThe vertical concatenation symbol @Code "/" places its left parameter
Xvertical.concatenation @Index { Vertical concatenation }
Xabove its right parameter with their column marks aligned. If one
Xparameter has more column marks than the other, empty columns are
Xinserted at the right to equalize the numbers. The variant @Code "//"
Xignores column marks and left-justifies the objects.
X@PP
XThe horizontal concatenation symbols @Code "|" and @Code "||" are horizontal
Xhorizontal.concatenation @Index { Horizontal concatenation }
Xanalogues of @Code "/" and {@Code "//"}: they place their two parameters side
Xby side, with row mark alignment or top-justification respectively. The
Xin.paragraph.concatenation @Index { In-paragraph concatenation }
Xin-paragraph concatenation symbol @Code "&" produces horizontal concatenation
Xwithin a paragraph; its special properties are treated in detail at the
Xend of this section.
X@PP
XThe concatenation symbols in any one family are {@I{mutually associative}},
Xwhich means that
X@ID {
X@Code "{" @I x {@Code "|"}{@I p} @I y @Code "}" {@Code "|"}{@I q} @I z
X}
Xis always the same as
X@ID {
X@I x {@Code "|"}{@I p} @Code "{" @I y {@Code "|"}{@I q} @I z @Code "}"
X}
Xfor any objects {@I x}, {@I y}, and {@I z}, any gaps @I p and @I q (defined
Xbelow), and any choice of {@Code "|"}, {@Code "^|"}, {@Code "||"}, and
X{@Code "^||"}. In practice we always omit such braces, since they are
Xredundant and can be misleading. The result of the complete sequence of
Xconcatenations will be called the {@I{whole concatenation object}}, and
Xthe objects which make it up will be called the {@I components}.
X@PP
XOne mark is designated as the {@I {principal mark}}, usually the mark of
Xprincipal.mark @Index { Principal mark }
Xthe first component. A later mark can be chosen for this honour by
Xattaching {@Code "^"} to the preceding concatenation symbol. See Section
X{@NumberOf onerow} for examples.
X@PP
XA {@I gap},
Xgap @Index Gap
Xspecifying the distance between the two
Xparameters, may follow any concatenation symbol. There may be no spaces
Xbetween a concatenation symbol and its gap. A missing gap is taken
Xto be {@Code 0ie}. The gap is effectively a third parameter of the
Xconcatenation symbol, and it may be an arbitrary object provided that it
Xevaluates to a juxtaposition of simple words. In general, the gap must
Xbe enclosed in braces, like this:
X@ID @Code {
X"//{ @Style&&mystyle @Open { @TopMargin } }"
X}
Xbut the braces may be omitted when the object is a juxtaposition of
Xsimple words or an invocation of a symbol without parameters, as in
X@Code "//0.3vx" and {@Code "||@Indent"}.
X@PP
XA gap consists of a length plus a gap mode. A @I length
Xlength @Index { Length }
Xis represented by an unsigned decimal number followed
Xby a unit of measurement. For example, @Code "2.5c" represents the
Xlength 2.5 centimetres. Figure {@NumberOf units} gives the full range
Xof eleven units of measurement.
Xc.unit @Index { @Code c unit }
Xp.unit @Index { @Code p unit }
Xm.unit @Index { @Code m unit }
Xf.unit @Index { @Code f unit }
Xs.unit @Index { @Code s unit }
Xv.unit @Index { @Code v unit }
Xw.unit @Index { @Code w unit }
Xb.unit @Index { @Code b unit }
Xr.unit @Index { @Code r unit }
Xd.unit @Index { @Code d unit }
X
X@BeginFigures
X@Figure
X @Caption { The eleven units of measurement provided by Lout. }
X @Tag { units }
X@Begin
X @Tab
X vmargin { 0.3v }
X side { yes }
X @Fmta { @Col @Code A ! @Col B }
X {
X @Rowa above { yes } A { c } B { Centimetres. }
X @Rowa A { i } B { Inches.
X}
X @Rowa A { p } B { Points ({@Code 72p} = {@Code 1i}).
X}
X @Rowa A { m } B { Ems ({@Code 12m} = {@Code 1i}).
X}
X @Rowa A { f } B {
XOne @Code f equals the size of the current font, as specified by
Xthe @@Font symbol (Section {@NumberOf font}). This unit is
Xappropriate for lengths that should change with the font size.
X}
X @Rowa A { s } B {
XOne @Code s equals the preferred gap between two words in the
Xcurrent font, as specified in the definition of the font, or by the
X@@Space symbol (Section {@NumberOf break}).
X}
X @Rowa A { v } B {
XOne @Code v equals the current gap between lines introduced during
Xparagraph breaking, as specified by the @@Break symbol (Section
X{@NumberOf break}). This unit is appropriate for lengths, such as the
Xspaces between paragraphs, which should change with the inter-line gap.
X}
X @Rowa A { w } B {
XOne @Code w equals the width of the following component, or its height if the
Xsymbol is vertical concatenation.
X}
X @Rowa A { b } B {
XOne @Code b equals the width of the whole concatenation object,
Xor its height if the symbol is vertical concatenation.
X}
X @Rowa A { r } B {
XOne @Code r equals one @Code b minus one {@Code w}. This unit is used
Xfor centring and right justification.
X}
X @Rowa below { yes } A { d } B {
XDegrees. This unit may only be used with the @Code "@Rotate" symbol.
X}
X }
X@End @Figure
X
X@PP
XA gap concludes with a {@I {gap mode}},
Xgap.mode @Index { Gap mode }
Xwhich is a single letter following the length, indicating how the length
Xis to be measured. As shown in Figure {@NumberOf gapmodes},


X
X@Figure
X @Tag { gapmodes }

X @Caption { The six gap modes provided by Lout. }
X@Begin
X@Fig {
X{ /2.5vx Edge-to-edge |0.3i {@Code "|"} &1p {@I l} &1p {@Code e}
X /4vx Hyphenation |0.3i {@Code "|"} &1p {@I l} &1p {@Code h}
X /4vx Overstrike |0.3i {@Code "|"} &1p {@I l} &1p {@Code o}
X /4vx Mark-to-mark |0.3i {@Code "|"} &1p {@I l} &1p {@Code x}
X /4vx Kerning |0.3i {@Code "|"} &1p {@I l} &1p {@Code k}
X /4vx Tabulation |0.3i {@Code "|"} &1p {@I l} &1p {@Code t}
X}
X||0.5i
X@Box margin { 0c } 6c @Wide 13.2c @High 9p @Font


X{
X @OneRow {
X @At { 1c @Wide 0.5c @High } @Put { @LBox 0.2co }
X @At { 4c @Wide 0.5c @High } @Put { @LBox 0.5co }
X @At { 2.2c @Wide 1.4c @High } @Put { @DoubleArrow 1.8c }
X @At { 2.2c @Wide 1.6c @High } @Put { 1.8c @Wide { &0.5rt @I l } }

X }
X //4vx
X @OneRow {

X @At { 1c @Wide 0.5c @High } @Put { @LBox 0.2co }
X @At { 4c @Wide 0.5c @High } @Put { @LBox 0.5co }
X @At { 2.2c @Wide 1.4c @High } @Put { @DoubleArrow 1.8c }
X @At { 2.2c @Wide 1.6c @High } @Put { 1.8c @Wide { &0.5rt @I l } }

X }
X //4vx
X @OneRow {

X @At { 1c @Wide 0.5c @High } @Put { @LBox 0.2co }
X @At { 4c @Wide 0.5c @High } @Put { @LBox 0.5co }
X @At { 1.2c @Wide 1.5c @High } @Put { @DoubleArrow 3.3c }
X @At { 1.2c @Wide 1.7c @High } @Put { 3.3c @Wide { &0.5rt @I l } }

X }
X //4vx
X @OneRow {

X @At { 1c @Wide 0.5c @High } @Put { @LBox 0.2co }
X @At { 4c @Wide 0.5c @High } @Put { @LBox 0.5co }
X @At { 1.2c @Wide 1.5c @High } @Put { @DoubleArrow 3.3c }
X @At { 1.2c @Wide 1.7c @High }

X @Put 3.3c @Wide { |0.5rt { max( {@I {l, a+b}}) } }


X @At { 1.2c @Wide 0.4c @High } @Put { @DoubleArrow 1.0c }
X @At { 1.2c @Wide 0.2c @High } @Put { 1.0c @Wide { &0.5rt @I a } }
X @At { 4c @Wide 0.4c @High } @Put { @DoubleArrow 0.5c }
X @At { 4c @Wide 0.2c @High } @Put { 0.5c @Wide { &0.5rt @I b } }
X }
X //4vx
X @OneRow {

X @At { 1c @Wide 0.5c @High } @Put { @LBox 0.2co }
X @At { 4c @Wide 0.5c @High } @Put { @LBox 0.5co }
X @At { 1.2c @Wide 1.5c @High } @Put { @DoubleArrow 3.3c }
X @At { 1.2c @Wide 1.7c @High }

X @Put { 3.3c @Wide { |0.5rt max( {@I {l, a, b}})}}


X @At { 1.2c @Wide 0.4c @High } @Put { @DoubleArrow 1.0c }
X @At { 1.2c @Wide 0.2c @High } @Put { 1.0c @Wide { &0.5rt @I a } }
X @At { 4c @Wide 0.4c @High } @Put { @DoubleArrow 0.5c }
X @At { 4c @Wide 0.2c @High } @Put { 0.5c @Wide { &0.5rt @I b } }
X }
X //4vx
X @OneRow {
X @At { 1c @Wide 0.5c @High } @Put { @LBox 0.2co }
X @At { 4c @Wide 0.5c @High } @Put { @LBox 0.5co }
X @At { 0.0c @Wide 1.6c @High } @Put { @DoubleArrow 4.0c }
X @At { 2.8c @Wide 1.8c @High } @Put { @I l }

X }
X //5vx
X @DoubleArrow 6c
X //0.1c |0.5rt @I { current bound }
X}
X
X}

X@End @Figure
X@EndFigures
Xwith edge-to-edge gap mode
Xedge.to.edge @Index { Edge-to-edge gap mode }
Xe.gap.mode @Index { @Code e gap mode }
Xthe length @I l is measured from the trailing edge
Xof the first object to the leading edge of the second. Edge-to-edge is the
Xdefault mode: the @Code e may be omitted. Hyphenation gap mode is
Xhyphenation.gap @Index { Hyphenation gap mode }
Xh.gap.mode @Index { @Code h gap mode }
Xsimilar, except as explained at the end of this section.
X@PP
XMark-to-mark,
Xmark.to.mark @Index { Mark-to-mark gap mode }
Xx.gap.mode @Index { @Code x gap mode }
Xoverstrike,
Xoverstrike @Index { Overstrike gap mode }
Xo.gap.mode @Index { @Code o gap mode }
Xand kerning
Xkerning @Index { Kerning gap mode }
Xk.gap.mode @Index { @Code k gap mode }
Xmeasure the length from the last mark
Xof the first object to the first mark of the second. In the case of
Xmark-to-mark, if the length is too small to prevent the objects
Xoverlapping, it is widened until they no longer do. Kerning also
Xwidens, with the aim of preventing the mark of either object from
Xoverlapping the other object; this mode is used for subscripts and
Xsuperscripts.
X@PP
Xtabulation @Index { Tabulation gap mode }
Xt.gap.mode @Index { @Code t gap mode }
Xcentring @Index { Centring }
Xright.justif @Index { Right justification }
XTabulation ignores the first object and places the leading edge of the
Xsecond object at a distance @I l from the left edge of the whole
Xconcatenation object. It is the main user of the @Code b and @Code r
Xunits of measurement; for example, @Code "|1rt" will right-justify the
Xfollowing component, and @Code "|0.5rt" will centre it.
X@PP
XWhen two objects are separated only by zero or more white space
Xwhite.space.when @SubIndex { when significant }
Xspace.f.when @SubIndex { when significant }
Xcharacters (spaces, tabs, and newlines), Lout inserts
X{@Code "&"}{@I k}{@Code "s"} between the two objects, where @I k is the
Xnumber of spaces. Precisely, @I k is determined by discarding all space
Xcharacters and tabs that precede newlines (these are invisible so are
Xbetter ignored), then counting 1 for each newline or space, and 8 for
Xeach tab character.
X@PP
XA sequence of two or more objects separated by @Code "&" symbols is a
Xparagraph.breaking.in.detail @SubIndex { in detail }
X{@I paragraph}. Lout breaks paragraphs into lines automatically as
Xrequired, by converting some of the @Code "&" symbols into
X{@Code "//1vx"}. Gaps of length 0 (other than hyphenation gaps) are not
Xeligible for this conversion. `Optimal' line breaks are chosen, using a
Xmethod adapted from @TeX [{@Ref knuth84}].
Xtex @RawIndex { @TeX }
Xtex.optimal @SubIndex { optimal paragraph breaking }
X@PP
XIf an @Code "&" symbol whose gap has hyphenation mode
Xhyphenation @Index { Hyphenation gap mode }
Xtex.hyphenation @SubIndex { hyphenation }
Xis chosen for replacement by {@Code "//1vx"}, a hyphen will be appended to
Xthe preceding object, unless that object is a word which already ends with
Xa hyphen. For example,
X@ID @Code {
XLong words may be "hyph &0ih enat &0ih ed."
X}
Xcould have the following result, depending where the line breaks fall:
X@ID 2i @Wide {
XLong words may be hyph &0ih enat &0ih ed.
X}
XBasser Lout inserts hyphenation gaps automatically as required, again
Xfollowing the method of @TeX, which approximates the hyphenations in
XWebster's dictionary. To prevent the hyphenation of a single word,
Xenclose it in quotes. Further control over paragraph breaking and
Xhyphenation is provided by the @@Break and @@Space symbols (Sections
X{@NumberOf break} and {@NumberOf space}).
X@End @Section
END_OF_FILE
if test 12202 -ne `wc -c <'lout/doc/tr.lout/ch3.02'`; then
echo shar: \"'lout/doc/tr.lout/ch3.02'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch3.02'
fi
if test -f 'lout/doc/tr.lout/ch4.04' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch4.04'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch4.04'\" \(10583 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch4.04' <<'END_OF_FILE'
X@Section
X @Title { Chapters and sections }
X @Tag { chapters }
X@Begin
X@PP
XThe definitions of chapters and sections from the DocumentLayout package
Xchapters @Index { Chapters and sections }
Xform the subject of this section. They allow a chapter to be entered
Xlike this:
Xdocument.layout.chapters @SubIndex { chapters and sections }
X@ID @Code {
X"@Chapter"
X" @Title { ... }"
X" @Tag { ... }"
X"@Begin"
X" ..."
X"@End @Chapter"
X}
XWithin the chapter a sequence of sections may be included by writing
X@ID @Code {
X"@BeginSections"
X"@Section { ... }"
X"..."
X"@Section { ... }"
X"@EndSections"
X}
XThese are numbered automatically, and an entry is made for each in a
Xtable of contents.
X@PP
XThe user of the DocumentLayout package can find the number of the chapter or
Xsection with a given tag by writing @Code "@NumberOf tag" at any point
Xin the document. This feature is based on the following definitions:
Xnumberof.example @Index { @Code "@NumberOf" example }
X@ID @Code {
X"export @Tag"
X"def @NumberMarker right @Tag { @Null }"
X""
X"def @NumberOf right x"


X"{ @NumberMarker&&x @Open { @Tag } }"
X}

XEach chapter and section will contain one invocation of
X{@Code "@NumberMarker"}; a full explanation will be given later.
X@PP
XA sequence of places for receiving chapters is easily defined:
X@ID @Code {


X"export @Tag"
X"def @ChapterList right @Tag"
X"{"
X" @Galley"
X" //@ChapterGap @ChapterList @Next @Tag"
X"}"
X}

X@Code "@ChapterGap" will usually be {@Code "1.1b"}, ensuring that each
Xchapter begins on a new page. The @Code "@Chapter" galley itself is
Xdefined as follows:
Xchapter.example @Index { @Code "@Chapter" example }
X@IndentedList
X@LI @Code {
X"export @FootNote @BeginSections @EndSections @Section"


X"def @Chapter force into { @ChapterList&&preceding }"
X" named @Tag {}"
X" named @Title {}"
X" named @RunningTitle { dft }"
X" body @Body"
X"{"
X" def @FootNote right x { @ColFootNote x }"
X""

X" def @BeginSections ..."
X" def @EndSections ..."
X" def @Section ..."
X}
X@LI @Code {


X" def @ChapterTitle"
X" {"
X" @ChapterNumbers @Case {"
X" {Yes yes} @Yield { Chapter {@NumberOf @Tag}. |2s @Title }"
X" else @Yield @Title"
X" }"
X" }"
X""
X" def @ChapterNum"
X" {"
X" @ChapterNumbers @Case {"
X" {Yes yes} @Yield { Chapter {@NumberOf @Tag} }"
X" else @Yield @Null"
X" }"
X" }"
X}

X@LI @Code {


X" ragged @Break @BookTitleFormat @ChapterTitle"
X" // @NumberMarker {"
X" @ChapterList&&@Tag @Open { @Tag }"
X" }"
X" // @ChapterList&&preceding @Tagged @Tag"
X" // @NumberMarker&&preceding @Tagged @Tag"
X" // @PageMarker&&preceding @Tagged @Tag"
X" // { @ChapterTitle } @MajorContentsEntry {@PageOf @Tag}"
X" // @Runner"
X" @FootEven { |0.5rt 0.8f @Font @B @PageNum }"
X" @FootOdd { |0.5rt 0.8f @Font @B @PageNum }"
X" // @Body"
X" //@SectionGap @ChapRefSection"
X" // @Runner"
X" @TopEven { @B @PageNum |1rt @I @ChapterNum }"
X" @TopOdd { @I {@RunningTitle @OrElse @Title} |1rt @B @PageNum }"
X"}"
X}

X@EndList
XWe will see the symbols for sections shortly. Notice how their use has
Xbeen restricted to within the right parameter of {@Code "@Chapter"}, by
Xnesting them and using a body parameter.
X@PP
XThe meaning of @Code "@FootNote" within @Code "@Chapter" has been set
Xto {@Code "@ColFootNote"}, which produces a footnote targeted to
X{@Code "@ColFootList"} (see Section {@NumberOf pagelayout}). In other
Xwords, footnotes within chapters go at the foot of the column, not at
Xthe foot of the page. (Of course, in single-column books this
Xdistinction is insignificant.) @Code "@ChapterTitle" and
X@Code "@ChapterNum" are trivial definitions which vary depending on
Xwhether the user has requested numbered chapters or not.
X@PP
XEach invocation of @Code "@Chapter" has its own unique {@Code "@Tag"},
Xeither supplied by the user or else inserted automatically by Lout. We
Xnow trace the cross referencing of chapter numbers on a hypothetical
Xthird chapter whose tag is {@Code "euclid"}.
X@PP
X@Code "@ChapterList&&preceding @Tagged euclid" attaches @Code "euclid"
Xas an extra tag to the first invocation of @Code "@ChapterList"
Xpreceding itself in the final printed document. But this
X@Code "@ChapterList" must be the target of the chapter, and so
X@ID @Code "@ChapterList&&euclid @Open { @Tag }"
Xis 3, the number of the chapter ({@Code "@Tag"} refers to the parameter
Xof {@Code "@ChapterList"}, not the parameter of {@Code "@Chapter"}).
X Consequently the invocation of
X@Code "@NumberMarker" within the chapter is equal to
X{@Code "@NumberMarker 3"}.
X@PP
X@Code "@NumberMarker&&preceding @Tagged euclid" attaches @Code "euclid"
Xto {@Code "@NumberMarker 3"} as an extra tag, and so
X{@Code "@NumberOf euclid"}, which expands to
X@ID @Code "@NumberMarker&&euclid @Open { @Tag }"
Xmust be equal to 3, as required. This scheme could be simplified by
Xplacing the invocation of @Code "@NumberMarker" within
X@Code "@ChapterList" rather than within {@Code "@Chapter"}, but it turns
Xout that that scheme does not generalize well to sections and subsections.
X@PP
XThere is a trap for the unwary in the use of @Code preceding and
X{@Code following}. Suppose that the invocation of @Code "@NumberMarker"
Xwithin @Code "@Chapter" is replaced by the seemingly equivalent
X@ID @Code "@NumberMarker { @ChapterList&&preceding @Open { @Tag } }"
XNow suppose that @Code "@NumberOf euclid" appears somewhere within
XChapter 7. It will expand to
X@ID @Code "@NumberMarker&&euclid @Open { @Tag }"
Xwhich would now be equal to
X@ID @Code "@ChapterList&&preceding @Open { @Tag }"
Xwhose value, evaluated as it is within Chapter 7, is 7, not 3. Use of
X@Code preceding or @Code following within the parameter
Xof a symbol, rather than within the body, is likely to be erroneous.
X@PP
XMuch of the remainder of the definition of @Code "@Chapter" is fairly
Xself-explanatory: there is a heading, a tag sent to mark the page on
Xwhich the chapter begins, a @Code "@ContentsEntry" galley sent to the
Xtable of contents, galleys for the figures and tables of the chapter to
Xcollect in, @Code "@Body" where the body of the chapter goes, and
X@Code "@ChapRefSection" to hold a concluding list of references. This
Xleaves only the two invocations of @Code "@Runner" to explain.
X@PP
XThe first @Code "@Runner" is just below the heading. It will be the target
Xof the @Code "@Runner&&following" cross reference at the beginning of the
Xfirst page of the chapter (see Section {@NumberOf pagelayout}), which
Xconsequently will have null running headers and the given footers.
X@PP
XThe second @Code "@Runner" appears at the very end of the chapter, hence
Xon its last page. Since no invocations of @Code "@Runner" lie between
Xit and the first {@Code "@Runner"}, it will be the target of
X@Code "@Runner&&following" on every page from the second page of the
Xchapter to the last, inclusive, and will supply the format of their
Xheaders and footers.
X@PP
XThe interested reader might care to predict the outcome in unusual
Xcases, such as when the heading occupies two pages, or when a chapter
Xoccupies only one, or (assuming a change to the gap between chapters)
Xwhen a chapter starts halfway down a page. Such predictions can be made
Xwith great confidence.
X@PP
XThe expression @Code "@RunningTitle @OrElse @Title" appearing in the second
X@Code "@Runner" returns the value of the @Code "@RunningTitle" parameter
Xof @Code "@Chapter" if this is not equal to the default value
X{@Code "dft"}, or @Code "@Title" otherwise:
Xorelse.example @Index { @Code "@OrElse" example }
X@ID @Code {


X"def @OrElse"
X" left x"
X" right y"
X"{"
X" x @Case {"
X" dft @Yield y"
X" else @Yield x"
X" }"
X"}"
X}

XThis produces the effect of
X@ID @Code {
X"named @RunningTitle { @Title }"
X}
Xwhich unfortunately is not permissible as it stands, because @Code "@Title"
Xis not visible within the default value of {@Code "@RunningTitle"}.
X@PP
XFinally, the definitions for sections omitted earlier are as follows:
Xsection.example @Index { @Code "@Section" example }
X@IndentedList
X@LI @Code {


X"def @EndSectionsPlace { @Galley }"
X"def @EndSections force into { @EndSectionsPlace&&preceding } {}"

X"macro @BeginSections { //@SectionGap @SectionList 1 // @EndSectionsPlace // }"
X}
X@LI @Code {


X"def @Section force into { @SectionList&&preceding }"
X" named @Tag {}"
X" named @Title {}"
X" named @RunningTitle { dft }"
X" body @Body"
X"{"

X" def @SectionTitle"


X" {"
X" @SectionNumbers @Case {"
X" {Yes yes} @Yield { {@NumberOf @Tag}. |2s @Title }"
X" else @Yield @Title"
X" }"
X" }"
X""
X" @Heading @Protect @SectionTitle"
X" // @NumberMarker {"
X" {@ChapterList&&@Tag @Open { @Tag }}.{"
X" @SectionList&&@Tag @Open { @Tag }}"
X" }"
X" // @ChapterList&&preceding @Tagged @Tag"
X" // @SectionList&&preceding @Tagged @Tag"
X" // @NumberMarker&&preceding @Tagged @Tag"
X" // @PageMarker&&preceding @Tagged @Tag"
X" // { &3f @SectionTitle } @ContentsEntry {@PageOf @Tag}"
X" //0io @Body"
X"}"
X}

X@EndList
XThe @Code "@BeginSections" macro invokes {@Code "@SectionList"},
Xpreceded by the appropriate gap and followed by an @Code "@EndSectsPlace"
Xfor closing the list of sections when the @Code "@EndSections" symbol is
Xfound. @Code "@Section" itself is just a copy of @Code "@Chapter" with
Xslight changes to the format. The parameter of @Code "@NumberMarker" is
Xa simple generalization of the one within {@Code "@Chapter"}. Notice
Xthat we have taken care that the value of this parameter be
Xa juxtaposition of simple words: although
X@ID @Code {
X"{@ChapterList&&@Tag @Open { @Tag }}. &"


X"{@SectionList&&@Tag @Open { @Tag }}"
X}

Xis formally equivalent, @Code "&" is not permitted within a
X@Code "@Tag" parameter.
X@PP
XThe DocumentLayout package also contains definitions for subsections in the
Xsame style. They raise the question of whether Lout is capable of
Xproducing subsections should the user place {@Code "@BeginSections"},
X{@Code "@Section"}, and {@Code "@EndSections"} within a {@I section},
Xand whether such nesting could proceed to arbitrary depth. Arbitrary
Xnesting of sections within sections is available now, although the
Xnumbering would of course be wrong. The author has worked out
Xdefinitions which provide correct numbering to arbitrary depth, with an
Xarbitrary format for each level. These were not incorporated into
XDocumentLayout because the author considers sub-subsections to be poor
Xstyle, and he prefers separate names for the symbols at each level.
X@End @Section
END_OF_FILE
if test 10583 -ne `wc -c <'lout/doc/tr.lout/ch4.04'`; then
echo shar: \"'lout/doc/tr.lout/ch4.04'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch4.04'
fi
if test -f 'lout/font0/Symbo.AFM' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/font0/Symbo.AFM'\"
else
echo shar: Extracting \"'lout/font0/Symbo.AFM'\" \(9486 characters\)
sed "s/^X//" >'lout/font0/Symbo.AFM' <<'END_OF_FILE'


XStartFontMetrics 2.0
XComment Copyright (c) 1984 Adobe Systems Incorporated. All Rights Reserved.

XComment Creation Date:Thu Apr 16 08:46:05 PST 1987
XFontName Symbol
XEncodingScheme FontSpecific
XFullName Symbol
XFamilyName Symbol


XWeight Medium
XItalicAngle 0.0
XIsFixedPitch false
XUnderlinePosition -98
XUnderlineThickness 54

XVersion 001.003
XFontBBox -180 -293 1090 1010
XStartCharMetrics 189
XC 32 ; WX 250 ; N space ; B 0 0 0 0 ;
XC 33 ; WX 333 ; N exclam ; B 128 -17 240 673 ;
XC 34 ; WX 713 ; N universal ; B 31 0 681 705 ;
XC 35 ; WX 500 ; N numbersign ; B 20 -17 481 673 ;
XC 36 ; WX 549 ; N existential ; B 25 0 478 707 ;
XC 37 ; WX 833 ; N percent ; B 63 -36 771 655 ;
XC 38 ; WX 778 ; N ampersand ; B 41 -18 750 661 ;
XC 39 ; WX 439 ; N suchthat ; B 48 -17 414 499 ;
XC 40 ; WX 333 ; N parenleft ; B 53 -191 300 673 ;
XC 41 ; WX 333 ; N parenright ; B 30 -191 277 674 ;
XC 42 ; WX 500 ; N asteriskmath ; B 65 134 427 551 ;
XC 43 ; WX 549 ; N plus ; B 10 0 539 533 ;
XC 44 ; WX 250 ; N comma ; B 56 -152 194 104 ;
XC 45 ; WX 549 ; N minus ; B 11 233 535 288 ;
XC 46 ; WX 250 ; N period ; B 69 -17 181 95 ;
XC 47 ; WX 278 ; N slash ; B 0 -17 254 646 ;
XC 48 ; WX 500 ; N zero ; B 23 -17 471 685 ;
XC 49 ; WX 500 ; N one ; B 117 0 390 673 ;
XC 50 ; WX 500 ; N two ; B 25 0 475 686 ;
XC 51 ; WX 500 ; N three ; B 39 -17 435 687 ;
XC 52 ; WX 500 ; N four ; B 16 0 469 685 ;
XC 53 ; WX 500 ; N five ; B 28 -17 443 685 ;
XC 54 ; WX 500 ; N six ; B 36 -17 467 685 ;
XC 55 ; WX 500 ; N seven ; B 24 -17 448 673 ;
XC 56 ; WX 500 ; N eight ; B 54 -18 440 686 ;
XC 57 ; WX 500 ; N nine ; B 31 -17 460 685 ;
XC 58 ; WX 278 ; N colon ; B 81 -17 193 460 ;
XC 59 ; WX 278 ; N semicolon ; B 83 -152 221 460 ;
XC 60 ; WX 549 ; N less ; B 26 0 523 522 ;
XC 61 ; WX 549 ; N equal ; B 11 141 537 390 ;
XC 62 ; WX 549 ; N greater ; B 26 0 523 522 ;
XC 63 ; WX 444 ; N question ; B 70 -17 412 685 ;
XC 64 ; WX 549 ; N congruent ; B 11 0 537 475 ;
XC 65 ; WX 722 ; N Alpha ; B 4 0 684 673 ;
XC 66 ; WX 667 ; N Beta ; B 29 0 592 672 ;
XC 67 ; WX 722 ; N Chi ; B -9 0 704 673 ;
XC 68 ; WX 612 ; N Delta ; B 6 0 608 688 ;
XC 69 ; WX 611 ; N Epsilon ; B 32 0 617 673 ;
XC 70 ; WX 763 ; N Phi ; B 26 0 741 672 ;
XC 71 ; WX 603 ; N Gamma ; B 24 0 609 673 ;
XC 72 ; WX 722 ; N Eta ; B 39 0 729 673 ;
XC 73 ; WX 333 ; N Iota ; B 32 0 316 673 ;
XC 74 ; WX 631 ; N theta1 ; B 18 -17 623 689 ;
XC 75 ; WX 722 ; N Kappa ; B 35 0 722 672 ;
XC 76 ; WX 686 ; N Lambda ; B 6 0 680 688 ;
XC 77 ; WX 889 ; N Mu ; B 28 0 887 673 ;
XC 78 ; WX 722 ; N Nu ; B 29 -8 720 673 ;
XC 79 ; WX 722 ; N Omicron ; B 41 -17 715 685 ;
XC 80 ; WX 768 ; N Pi ; B 25 0 745 673 ;
XC 81 ; WX 741 ; N Theta ; B 41 -17 715 685 ;
XC 82 ; WX 556 ; N Rho ; B 28 0 563 673 ;
XC 83 ; WX 592 ; N Sigma ; B 5 0 589 673 ;
XC 84 ; WX 611 ; N Tau ; B 33 0 607 673 ;
XC 85 ; WX 690 ; N Upsilon ; B -8 0 694 673 ;
XC 86 ; WX 439 ; N sigma1 ; B 40 -233 436 500 ;
XC 87 ; WX 768 ; N Omega ; B 34 0 736 688 ;
XC 88 ; WX 645 ; N Xi ; B 40 0 599 672 ;
XC 89 ; WX 795 ; N Psi ; B 15 0 781 683 ;
XC 90 ; WX 611 ; N Zeta ; B 44 0 636 673 ;
XC 91 ; WX 333 ; N bracketleft ; B 86 -155 299 673 ;
XC 92 ; WX 863 ; N therefore ; B 163 0 701 478 ;
XC 93 ; WX 333 ; N bracketright ; B 33 -155 246 673 ;
XC 94 ; WX 658 ; N perpendicular ; B 15 0 652 674 ;
XC 95 ; WX 500 ; N underscore ; B -2 -252 502 -206 ;
XC 96 ; WX 500 ; N radicalex ; B 480 881 1090 917 ;
XC 97 ; WX 631 ; N alpha ; B 41 -17 622 500 ;
XC 98 ; WX 549 ; N beta ; B 61 -222 515 741 ;
XC 99 ; WX 549 ; N chi ; B 12 -231 522 500 ;
XC 100 ; WX 494 ; N delta ; B 40 -17 481 740 ;
XC 101 ; WX 439 ; N epsilon ; B 22 -19 427 502 ;
XC 102 ; WX 521 ; N phi ; B 27 -224 490 670 ;
XC 103 ; WX 411 ; N gamma ; B 5 -225 484 499 ;
XC 104 ; WX 603 ; N eta ; B 0 -202 527 514 ;
XC 105 ; WX 329 ; N iota ; B 0 -18 301 503 ;
XC 106 ; WX 603 ; N phi1 ; B 36 -224 587 499 ;
XC 107 ; WX 549 ; N kappa ; B 33 0 558 502 ;
XC 108 ; WX 549 ; N lambda ; B 24 -18 548 739 ;
XC 109 ; WX 576 ; N mu ; B 33 -223 567 500 ;
XC 110 ; WX 521 ; N nu ; B -9 -17 475 507 ;
XC 111 ; WX 549 ; N omicron ; B 35 -19 501 499 ;
XC 112 ; WX 549 ; N pi ; B 10 -20 530 486 ;
XC 113 ; WX 521 ; N theta ; B 43 -18 485 690 ;
XC 114 ; WX 549 ; N rho ; B 50 -230 490 499 ;
XC 115 ; WX 603 ; N sigma ; B 30 -21 588 500 ;
XC 116 ; WX 439 ; N tau ; B 10 -18 418 500 ;
XC 117 ; WX 576 ; N upsilon ; B 7 -17 535 507 ;
XC 118 ; WX 713 ; N omega1 ; B 12 -17 671 583 ;
XC 119 ; WX 686 ; N omega ; B 42 -17 684 500 ;
XC 120 ; WX 493 ; N xi ; B 27 -224 469 766 ;
XC 121 ; WX 686 ; N psi ; B 12 -228 701 500 ;
XC 122 ; WX 494 ; N zeta ; B 60 -225 467 756 ;
XC 123 ; WX 480 ; N braceleft ; B 58 -183 397 673 ;
XC 124 ; WX 200 ; N bar ; B 65 -177 135 673 ;
XC 125 ; WX 480 ; N braceright ; B 79 -183 418 673 ;
XC 126 ; WX 549 ; N similar ; B 17 203 529 307 ;
XC 161 ; WX 620 ; N Upsilon1 ; B -2 0 610 684 ;
XC 162 ; WX 247 ; N minute ; B 27 459 228 735 ;
XC 163 ; WX 549 ; N lessequal ; B 29 0 526 639 ;
XC 164 ; WX 167 ; N fraction ; B -180 -12 340 677 ;
XC 165 ; WX 713 ; N infinity ; B 25 124 689 404 ;
XC 166 ; WX 500 ; N florin ; B 2 -193 494 687 ;
XC 167 ; WX 753 ; N club ; B 86 -26 660 533 ;
XC 168 ; WX 753 ; N diamond ; B 142 -36 600 550 ;
XC 169 ; WX 753 ; N heart ; B 117 -33 631 532 ;
XC 170 ; WX 753 ; N spade ; B 113 -36 629 548 ;
XC 171 ; WX 1042 ; N arrowboth ; B 24 -15 1024 511 ;
XC 172 ; WX 987 ; N arrowleft ; B 32 -15 942 511 ;
XC 173 ; WX 603 ; N arrowup ; B 45 0 571 910 ;
XC 174 ; WX 987 ; N arrowright ; B 49 -15 959 511 ;
XC 175 ; WX 603 ; N arrowdown ; B 45 -22 571 888 ;
XC 176 ; WX 400 ; N degree ; B 50 385 350 684 ;
XC 177 ; WX 549 ; N plusminus ; B 10 0 539 645 ;
XC 178 ; WX 411 ; N second ; B 20 459 413 737 ;
XC 179 ; WX 549 ; N greaterequal ; B 29 0 526 639 ;
XC 180 ; WX 549 ; N multiply ; B 17 8 533 524 ;
XC 181 ; WX 713 ; N proportional ; B 27 123 639 404 ;
XC 182 ; WX 494 ; N partialdiff ; B 26 -20 462 746 ;
XC 183 ; WX 460 ; N bullet ; B 50 113 410 473 ;
XC 184 ; WX 549 ; N divide ; B 10 71 536 456 ;
XC 185 ; WX 549 ; N notequal ; B 15 -25 540 549 ;
XC 186 ; WX 549 ; N equivalence ; B 14 82 538 443 ;
XC 187 ; WX 549 ; N approxequal ; B 14 135 527 394 ;
XC 188 ; WX 1000 ; N ellipsis ; B 111 -17 889 95 ;
XC 189 ; WX 603 ; N arrowvertex ; B 280 -120 336 1010 ;
XC 190 ; WX 1000 ; N arrowhorizex ; B -60 220 1050 276 ;
XC 191 ; WX 658 ; N carriagereturn ; B 15 -16 602 629 ;
XC 192 ; WX 823 ; N aleph ; B 175 -18 661 658 ;
XC 193 ; WX 686 ; N Ifraktur ; B 10 -53 578 740 ;
XC 194 ; WX 795 ; N Rfraktur ; B 26 -15 759 734 ;
XC 195 ; WX 987 ; N weierstrass ; B 159 -211 870 573 ;
XC 196 ; WX 768 ; N circlemultiply ; B 43 -17 733 673 ;
XC 197 ; WX 768 ; N circleplus ; B 43 -15 733 675 ;
XC 198 ; WX 823 ; N emptyset ; B 39 -24 781 719 ;
XC 199 ; WX 768 ; N intersection ; B 40 0 732 509 ;
XC 200 ; WX 768 ; N union ; B 40 -17 732 492 ;
XC 201 ; WX 713 ; N propersuperset ; B 20 0 673 470 ;
XC 202 ; WX 713 ; N reflexsuperset ; B 20 -125 673 470 ;
XC 203 ; WX 713 ; N notsubset ; B 36 -70 690 540 ;
XC 204 ; WX 713 ; N propersubset ; B 37 0 690 470 ;
XC 205 ; WX 713 ; N reflexsubset ; B 37 -125 690 470 ;
XC 206 ; WX 713 ; N element ; B 45 0 505 468 ;
XC 207 ; WX 713 ; N notelement ; B 45 -58 505 555 ;
XC 208 ; WX 768 ; N angle ; B 26 0 738 673 ;
XC 209 ; WX 713 ; N gradient ; B 36 -19 681 718 ;
XC 210 ; WX 790 ; N registerserif ; B 50 -20 740 670 ;
XC 211 ; WX 790 ; N copyrightserif ; B 51 -15 741 675 ;
XC 212 ; WX 890 ; N trademarkserif ; B 18 293 855 673 ;
XC 213 ; WX 823 ; N product ; B 25 -101 803 751 ;
XC 214 ; WX 549 ; N radical ; B 10 -38 515 917 ;
XC 215 ; WX 250 ; N dotmath ; B 69 210 169 310 ;
XC 216 ; WX 713 ; N logicalnot ; B 15 0 680 288 ;
XC 217 ; WX 603 ; N logicaland ; B 23 0 583 454 ;
XC 218 ; WX 603 ; N logicalor ; B 30 0 578 477 ;
XC 219 ; WX 1042 ; N arrowdblboth ; B 27 -20 1023 510 ;
XC 220 ; WX 987 ; N arrowdblleft ; B 30 -15 939 513 ;
XC 221 ; WX 603 ; N arrowdblup ; B 39 2 567 911 ;
XC 222 ; WX 987 ; N arrowdblright ; B 45 -20 954 508 ;
XC 223 ; WX 603 ; N arrowdbldown ; B 44 -19 572 890 ;
XC 224 ; WX 494 ; N lozenge ; B 18 0 466 745 ;
XC 225 ; WX 329 ; N angleleft ; B 25 -198 306 746 ;
XC 226 ; WX 790 ; N registersans ; B 50 -20 740 670 ;
XC 227 ; WX 790 ; N copyrightsans ; B 49 -15 739 675 ;
XC 228 ; WX 786 ; N trademarksans ; B 5 293 725 673 ;
XC 229 ; WX 713 ; N summation ; B 14 -108 695 752 ;
XC 230 ; WX 384 ; N parenlefttp ; B 40 -293 436 926 ;
XC 231 ; WX 384 ; N parenleftex ; B 40 -85 92 925 ;
XC 232 ; WX 384 ; N parenleftbt ; B 40 -293 436 926 ;
XC 233 ; WX 384 ; N bracketlefttp ; B 0 -80 341 926 ;
XC 234 ; WX 384 ; N bracketleftex ; B 0 -79 55 925 ;
XC 235 ; WX 384 ; N bracketleftbt ; B 0 -80 340 926 ;
XC 236 ; WX 494 ; N bracelefttp ; B 201 -75 439 926 ;
XC 237 ; WX 494 ; N braceleftmid ; B 14 -85 255 935 ;
XC 238 ; WX 494 ; N braceleftbt ; B 201 -70 439 926 ;
XC 239 ; WX 494 ; N braceex ; B 201 -80 255 935 ;
XC 241 ; WX 329 ; N angleright ; B 21 -198 302 746 ;
XC 242 ; WX 274 ; N integral ; B 2 -107 291 916 ;
XC 243 ; WX 686 ; N integraltp ; B 332 -83 715 922 ;
XC 244 ; WX 686 ; N integralex ; B 332 -88 415 975 ;
XC 245 ; WX 686 ; N integralbt ; B 39 -81 415 921 ;
XC 246 ; WX 384 ; N parenrighttp ; B 54 -293 450 926 ;
XC 247 ; WX 384 ; N parenrightex ; B 398 -85 450 925 ;
XC 248 ; WX 384 ; N parenrightbt ; B 54 -293 450 926 ;
XC 249 ; WX 384 ; N bracketrighttp ; B 22 -80 360 926 ;
XC 250 ; WX 384 ; N bracketrightex ; B 305 -79 360 925 ;
XC 251 ; WX 384 ; N bracketrightbt ; B 20 -80 360 926 ;
XC 252 ; WX 494 ; N bracerighttp ; B 17 -75 255 926 ;
XC 253 ; WX 494 ; N bracerightmid ; B 201 -85 442 935 ;
XC 254 ; WX 494 ; N bracerightbt ; B 17 -70 255 926 ;
XC -1 ; WX 790 ; N apple ; B 56 -3 733 808 ;
XEndCharMetrics
XEndFontMetrics
END_OF_FILE
if test 9486 -ne `wc -c <'lout/font0/Symbo.AFM'`; then
echo shar: \"'lout/font0/Symbo.AFM'\" unpacked with wrong size!
fi
# end of 'lout/font0/Symbo.AFM'
fi
if test -f 'lout/z27.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/z27.c'\"
else
echo shar: Extracting \"'lout/z27.c'\" \(10847 characters\)
sed "s/^X//" >'lout/z27.c' <<'END_OF_FILE'
X/*@z27.c:Debug Service:DebugInit(), Debug()@**********************************/


X/* */
X/* LOUT: A HIGH-LEVEL LANGUAGE FOR DOCUMENT FORMATTING (VERSION 2.03) */
X/* COPYRIGHT (C) 1993 Jeffrey H. Kingston */
X/* */
X/* Jeffrey H. Kingston (je...@cs.su.oz.au) */
X/* Basser Department of Computer Science */
X/* The University of Sydney 2006 */
X/* AUSTRALIA */
X/* */
X/* This program is free software; you can redistribute it and/or modify */
X/* it under the terms of the GNU General Public License as published by */
X/* the Free Software Foundation; either version 1, or (at your option) */
X/* any later version. */
X/* */
X/* This program is distributed in the hope that it will be useful, */
X/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
X/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
X/* GNU General Public License for more details. */
X/* */
X/* You should have received a copy of the GNU General Public License */
X/* along with this program; if not, write to the Free Software */
X/* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
X/* */

X/* FILE: z27.c */
X/* MODULE: Debug Service */
X/* EXTERNS: dbg[], DebugInit(), Debug() */
X/* ProfileOn(), ProfileOff(), ProfilePrint() */


X/* */
X/*****************************************************************************/
X#include "externs"
X
X#if DEBUG_ON
X

Xstruct dbs dbg[] = {
X (unsigned char *) "zz", 0, 0, 0, /* - unused - */
X (unsigned char *) "sp", 0, 0, 0, /* Supervise */
X (unsigned char *) "la", 0, 0, 0, /* Lexical Analyser */
X (unsigned char *) "fs", 0, 0, 0, /* File Service */
X (unsigned char *) "ts", 0, 0, 0, /* Token Service */
X (unsigned char *) "rd", 0, 0, 0, /* Read Definitions */
X (unsigned char *) "op", 0, 0, 0, /* Object Parser */
X (unsigned char *) "os", 0, 0, 0, /* Object Service */
X (unsigned char *) "om", 0, 0, 0, /* Object Manifest */
X (unsigned char *) "ce", 0, 0, 0, /* Closure Expansion */
X (unsigned char *) "cr", 0, 0, 0, /* Cross References */
X (unsigned char *) "ss", 0, 0, 0, /* Style Service */
X (unsigned char *) "sf", 0, 0, 0, /* Size Finder */
X (unsigned char *) "ob", 0, 0, 0, /* Object Breaking */
X (unsigned char *) "of", 0, 0, 0, /* Object Filling */
X (unsigned char *) "sc", 0, 0, 0, /* Size Constraints */
X (unsigned char *) "sa", 0, 0, 0, /* Size Adjustments */
X (unsigned char *) "gw", 0, 0, 0, /* Gap Widths */
X (unsigned char *) "gt", 0, 0, 0, /* Galley Transfer */
X (unsigned char *) "ga", 0, 0, 0, /* Galley Attaching */
X (unsigned char *) "gf", 0, 0, 0, /* Galley Flusher */
X (unsigned char *) "gm", 0, 0, 0, /* Galley Maker */
X (unsigned char *) "gs", 0, 0, 0, /* Galley Service */
X (unsigned char *) "gp", 0, 0, 0, /* Galley Printer */
X (unsigned char *) "ft", 0, 0, 0, /* Font Tables */
X (unsigned char *) "oe", 0, 0, 0, /* Object Echo */
X (unsigned char *) "es", 0, 0, 0, /* Echo Service */
X (unsigned char *) "zz", 0, 0, 0, /* Debug Service (unused) */
X (unsigned char *) "yy", 0, 0, 0, /* Error Service */
X (unsigned char *) "st", 0, 0, 0, /* Symbol Table */
X (unsigned char *) "su", 0, 0, 0, /* Symbol Uses */
X (unsigned char *) "ma", 0, 0, 0, /* Memory Allocator */
X (unsigned char *) "cs", 0, 0, 0, /* Counter Service */
X (unsigned char *) "bs", 0, 0, 0, /* Database Service */
X (unsigned char *) "rs", 0, 0, 0, /* Rotation Service */
X (unsigned char *) "tk", 0, 0, 0, /* Time Keeper */
X (unsigned char *) "hy", 0, 0, 0, /* Hyphenation */
X (unsigned char *) "pp", 0, 0, 0, /* Profiling */
X (unsigned char *) "", 0, 0, 0, /* any */


X};
X
X
X/*****************************************************************************/
X/* */

X/* DebugInit(str) */
X/* */
X/* Turn on the debug flag given by str. */
X/* */
X/*****************************************************************************/
X
XDebugInit(str)
Xunsigned char *str;
X{ int j, urg;
X for( urg = 0; urg < 2 && str[urg+2] == 'd'; urg++ );
X for( j = 1; ; j++ )
X { if( strcmp(dbg[j].flag, &str[urg+2]) == 0 ) break;
X if( strcmp(dbg[j].flag, "" ) == 0 )
X Error(FATAL, no_fpos, "unknown debug flag %s", str);
X }
X for( ; urg >= 0; urg-- ) dbg[j].on[urg] = dbg[ANY].on[urg] = TRUE;
X} /* end DebugInit */


X
X
X/*@@**************************************************************************/
X/* */

X/* Debug(category, urgency, str, p1, p2, p3, p4, p5, p6, p7, p8) */
X/* */
X/* Print str on debug output, if the flag corresponding to the given */
X/* debug category and urgency is on. */
X/* */
X/*****************************************************************************/
X
X/*VARARGS3*/
XDebug(category, urgency, str, p1, p2, p3, p4, p5, p6, p7, p8)
Xint category, urgency; unsigned char *str; int p1, p2, p3, p4, p5, p6, p7, p8;
X{ static BOOLEAN first_message = TRUE;
X if( first_message )
X { fprintf(stderr, "\nLout Debug Output:\n");
X first_message = FALSE;
X }
X fprintf(stderr, "%2s: ", dbg[category].flag);
X fprintf(stderr, str, p1, p2, p3, p4, p5, p6, p7, p8);
X fprintf(stderr, "\n");
X fflush(stderr);
X} /* end Debug */
X
X
X#define MAXPROF 20
X#include <time.h>
X
Xstruct profrec
X{ unsigned char *label; /* label of the profile */
X int calls; /* number of calls with this label */
X long time; /* total time of this label */
X};
X
Xstatic struct profrec profstack[MAXPROF];
Xstatic struct profrec profstore[MAXPROF];
Xstatic int proftop = 0, profsize = 0;
X
X/*****************************************************************************/
X/* */
X/* ProfileOn(str) */
X/* */
X/* Start profiling label str. */
X/* */
X/*****************************************************************************/
X
XProfileOn(str)
Xunsigned char *str;
X{ int i; long raw_time;
X for( i = 0; i < proftop; i++ )
X { if( strcmp(profstack[i].label, str) == 0 )
X { for( i = 0; i < proftop; i++ )
X fprintf(stderr, "profstack[%d] = %s\n", i, profstack[i].label);
X Error(INTERN, no_fpos, "ProfileOn: %s restarted", str);
X }
X }
X if( proftop == MAXPROF ) Error(INTERN, no_fpos, "ProfileOn: overflow");
X time(&raw_time);
X profstack[proftop].label = str;
X profstack[proftop].time = raw_time;
X proftop++;
X} /* end ProfileOn */


X
X
X/*****************************************************************************/
X/* */

X/* ProfileOff(str) */
X/* */
X/* Stop profiling label str. */
X/* */
X/*****************************************************************************/
X
XProfileOff(str)
Xunsigned char *str;
X{ int i; long raw_time;
X if( proftop == 0 || strcmp(profstack[proftop-1].label, str) != 0 )
X Error(INTERN, no_fpos, "ProfileOff: %s is not the current label", str);
X for( i = 0; i < profsize && strcmp(profstore[i].label, str) != 0; i++ );
X if( i >= profsize )
X { if( profsize == MAXPROF ) Error(INTERN, no_fpos, "ProfileOff: overflow");
X profsize++;
X profstore[i].label = str;
X profstore[i].calls = 0;
X profstore[i].time = 0;
X }
X time(&raw_time);
X profstore[i].calls += 1;
X profstore[i].time += (raw_time - profstack[proftop-1].time);
X proftop--;
X} /* end ProfileOff */


X
X
X/*****************************************************************************/
X/* */

X/* ProfilePrint() */
X/* */
X/* Print results of profiling. */
X/* */
X/*****************************************************************************/
X
XProfilePrint()
X{ int i;
X for( i = 0; i < profsize; i++ )
X { fprintf(stderr, "Profile %-20s %6d secs, %3d calls, %6.2f secs/call\n",
X profstore[i].label, profstore[i].time, profstore[i].calls,
X (float) profstore[i].time / profstore[i].calls );
X }
X} /* end ProfilePrint */
X#endif
END_OF_FILE
if test 10847 -ne `wc -c <'lout/z27.c'`; then
echo shar: \"'lout/z27.c'\" unpacked with wrong size!
fi
# end of 'lout/z27.c'
fi
echo shar: End of archive 23 \(of 30\).
cp /dev/null ark23isdone

Jeff Kingston

unread,
Jun 1, 1993, 11:05:01 PM6/1/93
to
Submitted-by: je...@joyce.cs.su.oz.au (Jeff Kingston)
Posting-number: Volume 37, Issue 122
Archive-name: lout/part24
Environment: UNIX

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: lout/doc/tr.begin/s14 lout/doc/tr.fig/s5
# lout/doc/tr.impl/s3.2 lout/doc/tr.lout/ch1.02
# lout/doc/tr.lout/ch2.06 lout/doc/tr.lout/ch4.03 lout/makefile
# lout/z30.c lout/z31.c
# Wrapped by kent@sparky on Sun May 30 19:44:01 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 24 (of 30)."'
if test -f 'lout/doc/tr.begin/s14' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.begin/s14'\"
else
echo shar: Extracting \"'lout/doc/tr.begin/s14'\" \(9025 characters\)
sed "s/^X//" >'lout/doc/tr.begin/s14' <<'END_OF_FILE'
X@Section
X @Tag { booklayout }
X @Title { Books }
X@Begin
X@PP
XThe DocumentLayout package may also be used to produce books. Type
X@Code "-ibook" in the Unix command instead of {@Code "-idoc"} to use the
Xpackage in this way.
X@PP
XA book begins with a @Code "@Book" symbol:
X@ID @Code {
X"@Book"
X" @Title {}"
X" @Author {}"
X" @Edition {}"
X" @Publisher {}"
X" @InitialFont { Times Roman 12p }"
X" @InitialBreak { adjust 1.2fx }"
X" @Hyphenate { Yes }"
X"//"
X}
XThe first four options are printed on the title page, the first three
Xusing {@Code "clines @Break"} (see page {@PageOf clines}). There are no
X{@Code "@Columns"}, {@Code "@PageNumbers"}, or {@Code "@FirstPageNumber"}
Xoptions. The last three options are as for @Code "@Document" and
X{@Code "@Report"}. Disaster will ensue if the @Code "//" is omitted.
X@PP
XNext comes an optional preface:
X@ID @Code {
X"@Preface"
X" @Tag { preface }"
X" @Title { About this book }"
X"@Begin"
X"@PP"
X"..."
X"@End @Preface"
X}
XSince the title of most prefaces is simply Preface, this is the default
Xvalue of the @Code "@Title" option. After the preface, BookLayout will
Xproduce a table of contents listing the introduction, chapters,
Xsections, subsections, appendices, biblio&-graphy, and index as
Xappropriate.
X@PP
XThe pages up to this point will be numbered in lower case Roman
Xnumerals; subsequent pages will be numbered in Arabic starting from 1.
X@PP
XNext comes an optional introduction, in exactly the same style as the
Xpreface except that @Code "@Introduction" replaces @Code "@Preface" and
Xthe default title is Introduction. After that comes a sequence of chapters
Xin the usual style:
X@ID @Code {
X"@Chapter"
X" @Title { Principles }"
X" @Tag { principles }"
X"@Begin"
X"@PP"


X"..."
X"@End @Chapter"
X}

XNo @Code "@BeginChapters" or @Code "@EndChapters" symbols are
Xneeded. Within a chapter, there may be a sequence of sections,
Xeach introduced by @Code "@Section" in the usual way, all bracketed
Xby @Code "@BeginSections" and {@Code "@EndSections"}. Within each
Xsection there may be subsections, each introduced by {@Code "@SubSection"},
Xand the sequence as a whole bracketed by @Code "@BeginSubSections" and
X{@Code "@EndSubSections"}. The first subsection of the first section of the
Xfirst chapter will be numbered 1.1.1, and so on. There are no sub-subsections.
X@PP
XFinally there is opportunity for a sequence of appendices, each
Xintroduced by @Code "@Appendix" in the usual way. No
X@Code "@BeginAppendices" or @Code "@EndAppendices" symbols are
Xneeded. The appendices are numbered A, B, C, etc., and there
Xare sub-appendices, obtained in the usual way.
X@PP
XEach symbol with a @Code "@Title" option also has a @Code "@RunningTitle"
Xoption. The more important parts of the book (preface, introduction,
Xchapters, and appendices) have their @Code "@RunningTitle" printed at
Xthe top of each even-numbered page; if omitted, the @Code "@Title" option
Xis used instead.
X@PP
XWith Basser Lout, a long document is best broken into a sequence of files,
Xeach containing one section, from @Code "@Section" to @Code "@End @Section"
Xinclusive. Other files are needed for the beginning of each chapter,
Xfrom @Code "@Chapter" to {@Code "@BeginSections"}, and for the end of
Xeach chapter, that is the final @Code "@EndSections" and
X{@Code "@End @Chapter"}. On the Unix operating system a good scheme for
Xnaming these files is
X@ID lines @Break {
X@Code ch0.00 @Code "@Book" ... @Code "//"
X@Code ch0.01 Preface
X@Code ch0.02 Introduction
X@Code ch1.00 Beginning of Chapter 1
X@Code ch1.01 Section 1.1
X@Code ch1.02 Section 1.2
X. . .
X@Code ch1.99 End of Chapter 1
X@Code ch2.00 Beginning of Chapter 2
X@Code ch2.01 Section 2.1
X@Code ch2.02 Section 2.2
X. . .
X@Code ch2.99 End of Chapter 2
X}
Xand so on. Then the Unix command
X@ID @Code "lout -ibook ch0.00 ch3.??"
Xwill format Chapter 3 only; and
X@ID @Code "lout -ibook ch?.??"
Xwill format the entire book. The whole book must be formatted by one
Xcommand to get the page numbers right, but there is no need to do
Xthis until everything is perfect.
X@PP
XThe symbols described in Sections 1--7 above are all available as
Xusual. The numbering of figures and tables includes a chapter or
Xappendix number: the first figure of Appendix A will be numbered A.1,
Xand so on. Figures and tables within the preface and introduction are
Xnumbered 1, 2, 3, etc. When figures and tables appear near the end of
Xa chapter, the following page on which they appear may also be the first
Xpage of the next chapter, which looks very poor. The solution is to move
Xthe figure or table to an earlier point in the chapter.
X@PP
XFigures and tables work in a slightly different way to previously, owing
Xto the need to attach a chapter or appendix number to each one. The
Xfirst figure of each chapter or appendix must be preceded by
X{@Code "@BeginFigures"}, and the last figure of each chapter or appendix
Xmust be followed by {@Code "@EndFigures"}. These symbols must also bracket
Xfigures in the preface and introduction. The symbols are not required
Xwhen there are no figures. Similarly, {@Code "@BeginTables"} and
X{@Code "@EndTables"} must bracket tables.
X@PP
XCross referencing works as described in Section {@NumberOf cross};
X@Code "@Tag" options may be given to the preface, introduction,
Xchapters, sections, subsections, appendices, and sub-appendices.
X@PP
XReferences work as described in Section {@NumberOf refs}, except
Xthat @Code "@ReferenceSection" is added automatically as needed. A variant of
Xthe @Code "@Ref" symbol called @Code "@ChapRef" is provided, which
Xcauses the reference to appear at the end of the current preface,
Xintroduction, chapter, or appendix, rather than at the end of the book.
X@PP
XAlso available are symbols for making an index. To
Xadd an entry to the index, place
X@ID @Code "packages @Index { Packages }"
Xfor example at the relevant point. The result will be something like
X@ID { Packages, 27 }
Xappearing in the index in the alphabetical position determined by the
Xleft parameter, which should be a juxtaposition of simple words composed,
Xby convention, of lower-case letters and periods only.
X@PP
XA variant called @Code "@SubIndex" provides a small indent, as is
Xconventional for sub-entries in indexes. For example,
X@ID @Code {
X"package @Index { Packages }"
X"package.r @SubIndex {ReportLayout}"
X"package.b @SubIndex {BookLayout}"
X}
Xscattered through a document will produce something like
X@ID lines @Break {
XPackages, 27
X BookLayout, 45
X ReportLayout, 40
X}
XNote how the left parameters have been carefully chosen to produce the
Xcorrect ordering. There is also a @Code "@SubSubIndex" symbol with a
Xdouble indent.
X@PP
XThese symbols attach one page number to each entry. Although the best
Xauthorities recommend exactly this, many authors choose to have entries
Xlike
X@ID { Fourier Transform, 576, 583--593 }
Xdespite the inconvenience to their readers. {@Code "@RawIndex"},
X{@Code "@RawSubIndex"}, and {@Code "@RawSubSubIndex"}
Xsymbols are provided which do not add page numbers to the entry, leaving
Xthis to the user. For example, one systematic way to get page number
Xranges is to place
X@ID @Code {
X"packages @RawIndex {"
X" Packages, {@PageOf packages}"
X" -- {@PageOf packages.end}"
X"}"
X}
Xat the start of the range, and
X@ID @Code {
X"{@PageMark packages.end}"
X}
Xat the end of the range. This works because all six index symbols
Xinclude a @Code "@PageMark" operation. Incidentally, this means that
Xindex tags should be different from chapter and other tags.
X@PP
XAnother use for @Code "@RawIndex" is to get blank lines into the index
Xbetween the letters of the alphabet, by inserting phantom entries:
X@ID @Code {
X"b @RawIndex {}"
X"c @RawIndex {}"
X"..."
X"z @RawIndex {}"
X}
XIn fact there is a symbol called @Code "@IndexBlanks" which creates
Xexactly these 25 entries. Unfortunately, these blanks will occasionally
Xappear at the top of a column, and if there are no entries beginning with
Xx, for example, there will be two blank lines between the w and y
Xentries. The careful user can start off with @Code "@IndexBlanks" and
Xreplace it later by the appropriate subset.
X@FootNote {
XFor Lout to solve this problem automatically, it would need to be told
Xwhich letter each index entry belongs under, perhaps by symbols
X{@Code "@AIndex"}, {@Code "@BIndex"}, etc. The author
Xfelt that this would have been too tedious.
X}
X@PP
XOwing to problems behind the scenes, the Index heading will be printed,
Xand an entry will be made in the table of contents, even if there are no
Xentries in the index. To prevent this, you will need to change the
X@Code "@MakeIndex" option in the @Code book setup file to {@Code "No"},
Xusing the method described in the following section.
X@PP
XAlthough the page numbers in index entries will be kept up to date
Xautomatically as the document changes, as all cross references are,
Xthe user is recommended to refrain from inserting index entries until
Xthe book is complete and an overall plan of the structure of the index
Xcan be made.
X@End @Section
END_OF_FILE
if test 9025 -ne `wc -c <'lout/doc/tr.begin/s14'`; then
echo shar: \"'lout/doc/tr.begin/s14'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.begin/s14'
fi
if test -f 'lout/doc/tr.fig/s5' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.fig/s5'\"
else
echo shar: Extracting \"'lout/doc/tr.fig/s5'\" \(9154 characters\)
sed "s/^X//" >'lout/doc/tr.fig/s5' <<'END_OF_FILE'
X@Section
X @Title { Lengths, angles, and points }
X@Begin
X@PP
XWe already know that two lengths placed side by side define a point. This is
Xonly the simplest of a number of such geometrical combinations.
X@PP
XThe symbol @Code "@Distance" returns the length of the line joining two
Xpoints:
X@ID @Code "{0 0} @Distance {3 cm 4 cm}"
Xis equivalent to the length {@Code "5 cm"}. The result of @Code "@Distance"
Xis never negative. Notice that braces must enclose the two points. The
Xsymbol @Code "@XDistance" returns the distance in the @Eq { x } direction
Xfrom one point to another:
X@ID {
X@Code "{" & @Eq { x sub 1 ``` y sub 1 } & @Code "} @XDistance {"
X& @Eq { x sub 2 ``` y sub 2 } & @Code "}"
X}
Xhas for its result the length @Eq { x sub 2 - x sub 1 }, and so may be
Xnegative. There is an analogous @Code "@YDistance" symbol.
X@PP
XThe symbol @Code "@Angle" returns the angle @Eq {theta} from one point to
Xanother:
X@ID {
X@Code "{" & @Eq { x sub 1 ``` y sub 1 } & @Code "} @Angle {"
X& @Eq { x sub 2 ``` y sub 2 } & @Code "}"
X||7ct
X@Fig {
X@Figure
X arrow { forward }
X shape { 4 cm 0 0 0 4 cm 3 cm }
X{ 4c @Wide 3c @High }
X// {4 cm 3 cm} ** 0.4 ++ { 0.5 cm 0 } @MarkOf @Eq { (x sub 1 & , y sub 1 & ) }
X// {4 cm 3 cm} ** 0.4 @BaseOf @Circle margin { 0.05c } paint { black } {}
X// {4 cm 3 cm} ** 0.8 ++ { 0.5 cm 0 } @MarkOf @Eq { (x sub 2 & , y sub 2 & ) }
X// {4 cm 3 cm} ** 0.8 @BaseOf @Circle margin { 0.05c } paint { black } {}
X// { 1 cm 0.2 cm } ** 0.7 @BaseOf @Eq { theta }
X}
X}
XThe result will be 0 if the two points are equal. The symbol @Code "<<"
Xreturns the point at a given distance and angle from @Eq { (0, 0) }:
X@ID {
X@Code "{" & @Eq { length } @Code "<<" @Eq { theta } & @Code "}"
X||7ct
X@Fig {
X@Figure
X arrow { forward }
X shape { 4 cm 0 0 0 4 cm 3 cm }
X{ 4c @Wide 3c @High }
X// {4 cm 3 cm} ** 0.5 -- {1.5 cm 0} @BaseOf @I length
X// {4 cm 3 cm} ** 0.8 @BaseOf @Circle margin { 0.05c } paint { black } {}
X// { 1 cm 0.2 cm } ** 0.7 @BaseOf @Eq { theta }
X}
X}
XFor example, @Code "{ 5 cm << 45 dg }" is the point 5 cm
Xfrom @Eq { (0, 0) } at 45 degrees.
X@PP
XPoints may be added, subtracted, and multiplied by a number:


X@ID @Tab
X vmargin { 0.5vx }

X @Fmta { @Col A ! @Col is ! @Col B }
X{
X@Rowa
X A { @Code "{" & @Eq {x sub 1 ``` y sub 1} & @Code "} ++ {" &
X@Eq {x sub 2 ``` y sub 2} & @Code "}" }
X B { @Eq { (x sub 1 + x sub 2 & , y sub 1 + y sub 2 & ) } }
X@Rowa
X A { @Code "{" & @Eq {x sub 1 ``` y sub 1} & @Code "} -- {" &
X@Eq {x sub 2 ``` y sub 2} & @Code "}" }
X B { @Eq { (x sub 1 - x sub 2 & , y sub 1 - y sub 2 & ) } }
X@Rowa
X A { @Code "{" & @Eq {x sub 1 ``` y sub 1} & @Code "} ** " & @Eq {k} }
X B { @Eq { (x sub 1 & k, y sub 1 & k) } }
X}
XFor example,
X@ID {
X@Code "{" & @Eq {x sub 1 ``` y sub 1} & @Code "} ** 0.2 ++ " &
X@Code "{" & @Eq {x sub 2 ``` y sub 2} & @Code "} ** 0.8"
X}
Xis the point eight tenths of the way from
X@Eq { (x sub 1 & , y sub 1 & ) } to
X@Eq { (x sub 2 & , y sub 2 & ) } on the line joining them:
X@LP
X@ID @Fig {
X@Figure
X shape {
X {xsize 0} ** 0.3 ++ {0 ysize} @Label P1
X {xsize 0} ++ {0 ysize} ** 0.4 @Label P2
X P1 ** 0.2 @Label FP1
X P2 ** 0.8 @Label FP2
X 0 0 P1 P2 0 0 [] FP1 FP1 ++ FP2 FP2
X }
X{ 6c @High 9c @Wide }
X// P1 ++ {0.3 cm 0} @BaseOf @Eq { (x sub 1 & , y sub 1 & ) }
X// P2 ++ {0.3 cm 0} @BaseOf @Eq { (x sub 2 & , y sub 2 & ) }
X// FP1 ++ FP2 ++ {0.3 cm 0} @BaseOf
X@Eq { (0.2x sub 1 & + 0.8x sub 2 & , 0.2y sub 1 & + 0.8y sub 2 & ) }
X}
XWhen using {@Code "**"}, the point must be on the left and the number on
Xthe right. It would be more convenient to name these symbols
X{@Code "+"}, {@Code "-"}, and {@Code "*"}, but these names
Xare often taken by equation formatters, and @Code "-" appears in
Xlengths, so we don't. There are @Code "@Max" and @Code "@Min" symbols:


X@ID @Tab
X vmargin { 0.5vx }

X @Fmta { @Col A ! @Col is ! @Col B }
X{
X@Rowa
X A { @Code "{" & @Eq {x sub 1 ``` y sub 1} & @Code "} @Max {" &
X@Eq {x sub 2 ``` y sub 2} & @Code "}" }
X B { @Eq { (max(x sub 1 & , x sub 2 & ), max(y sub 1 & , y sub 2 & )) } }
X@Rowa
X A { @Code "{" & @Eq {x sub 1 ``` y sub 1} & @Code "} @Min {" &
X@Eq {x sub 2 ``` y sub 2} & @Code "}" }
X B { @Eq { (min(x sub 1 & , x sub 2 & ), min(y sub 1 & , y sub 2 & )) } }
X}
XNote carefully that these apply to points, not to numbers.
X@PP
XThe result of adding two points together depends on where the origin is
Xat the time, as well as on the points themselves. This can lead to
Xunexpected results, as the author has found to his cost more than
Xonce. Within the @Code shape option of {@Code "@Figure"}, the origin is
Xthe lower left corner of the result of the {@Code "@Figure"}. In cases
Xlike the example on page {@PageOf sumpoints}, where points are added
Xoutside of any {@Code "@Figure"} symbol, the origin is usually at the
Xbottom left corner of the figure as a whole. A label always denotes a
Xparticular point on the printed page, regardless of where the origin
Xhappens to be.
X@PP
XThe symbol @Code "@Prev" within the @Code "shape" option of @Code
X"@Figure" denotes the previous point of the shape, ignoring points within
X{@Code {"[" &0.5s "]"}}. This makes it easy to specify each point
Xrelative to the previous one:
X@ID {
X@Code {
X" shape {"
X" 0 0"
X" { 2 cm << 30 }"
X" @Prev ++ { 2 cm << 90 }"
X" @Prev ++ { 2 cm << 150 }"
X" @Prev ++ { 2 cm << 210 }"
X" @Prev ++ { 2 cm << 270 }"
X" 0 0"
X" }"
X}
X||7ct
X@Fig { ||2.5c
X@Figure
X shape {
X 0 0
X { 2 cm << 30 }
X @Prev ++ { 2 cm << 90 }
X @Prev ++ { 2 cm << 150 }
X @Prev ++ { 2 cm << 210 }
X @Prev ++ { 2 cm << 270 }
X 0 0
X }
X{ 4c @Wide 4c @High }
X}
X}
X@PP
XFig provides a @Code "@Label" symbol for attaching a label to a point in
Xa shape, like this:
X@ID @Code "{xsize ysize} ** 0.5 @Label CTR"
XThe point may then be referred to more concisely by its label,
X{@Code CTR}. For example, the large arrow appearing in Section 2 was
Xbuilt like this:
X@ID {
X@Code {
X"@Figure"
X" shape {"
X" {0 ysize} ** 0.4 @Label SB"
X" {0 ysize} ** 0.6 @Label ST"
X" {xsize 0} ** 0.7 @Label HB"
X" SB"
X" SB ++ HB"
X" HB"
X" {xsize 0} ++ {0 ysize} ** 0.5"
X" HB ++ {0 ysize}"
X" HB ++ ST"
X" ST"
X" SB"
X" }"
X" paint { grey }"
X"{ 6c @Wide 2c @High }"


X}
X||7ct
X@Fig {
X@Figure

X shape {
X {0 ysize} ** 0.4 @Label SB
X {0 ysize} ** 0.6 @Label ST
X {xsize 0} ** 0.7 @Label HB
X SB
X SB ++ HB
X HB
X {xsize 0} ++ {0 ysize} ** 0.5
X HB ++ {0 ysize}
X HB ++ ST
X ST
X SB
X }
X paint { grey }
X{ 6c @Wide 2c @High }
X// @ShowLabels
X}
X}
XIncidentally, the labels of a figure can be displayed as above by putting
Xthe symbol @Code "@ShowLabels" at the end of the figure. Labels can
Xsave a lot of effort. They should contain only digits, upper-case
Xletters and {@Code "@"}, because Fig and Lout use labels of their own
Xmade from lower-case letters.
X@PP
XThe standard shapes have standard labels; for example, the labels
Xof @Code "@Ellipse" are
X@LP
X@ID {
X@Code {
X"@Ellipse"
X"{ 3c @Wide 2c @High }"
X}
X||7ct
X@Fig {
X@Ellipse { 3c @Wide 2c @High }
X// @ShowLabels
X}
X}
XThere is a symbol, {@Code "::"}, for @I relabelling an object.
XEach label in the right parameter is relabelled in the following way:
X@LP
X@ID {
X@Code {
X"E1:: @Ellipse"
X"{ 3c @Wide 2c @High }"
X}
X||7ct
X@Fig {
XE1:: @Ellipse { 3c @Wide 2c @High }
X// @ShowLabels
X}
X}
XWithin the right parameter of @Code "::" the original names hold sway;
Xbut afterwards the names are changed by prefixing the label
Xand @Code "@" to them. These composite labels may be used exactly like
Xother labels. Relabelling can be nested to arbitrary depth:


X@LP
X@ID {
X5c @Wide @Code {

X"A::"
X"{ 1:: @Ellipse"
X" { 3c @Wide 2c @High }"
X" //1c"
X" 2:: @Box"
X" { 3c @Wide 2c @High }"
X"}"
X}
X||7ct
X@Fig {
XA::
X{ 1:: @Ellipse { 3c @Wide 2c @High }
X //1c
X 2:: @Box { 3c @Wide 2c @High }
X}
X// @ShowLabels
X}
X}
XThe right parameter of @Code "::" may be any object.
X@PP
XThe six standard shapes ({@Code "@Box"}, {@Code "@Square"},
X{@Code "@Diamond"}, {@Code "@Polygon"}, {@Code "@Ellipse"}, and
X{@Code "@Circle"}) have a special @Code CIRCUM label, not displayed by
X{@Code "@ShowLabels"}. The expression
X@ID {
X@Eq { "angle" } @Code CIRCUM
X}
Xyields the point on the boundary of the shape at the given angle from
Xthe centre, in a coord&-inate system with the centre for origin. Thus,
Xgiven a labelled standard shape such as
X@ID @Code "A :: @Ellipse ..."
Xthe point on its boundary at an angle of 45 degrees from the centre is
X@ID @Code "A@CTR ++ {45 A@CIRCUM}"
XThe braces must be present. Regrettably, there is no way to produce a
X@Code CIRCUM label for shapes defined by the user in any reasonable time.
X@PP
XIf the same label is used twice, as is inevitable with unlabelled standard
Xshapes, only the most recent value is remembered. There is a limit on the
Xmaximum number of distinct labels in any one figure, which
Xcan be changed by means of an option to the @Code "@Fig" symbol:
X@ID @Code {
X"@Fig"
X" maxlabels { 500 }"
X"{ ... }"
X}
XThe default value is 200. Large values could cause the printing device
Xto run out of memory. Memory is reclaimed at the end of each figure.
X@End @Section
END_OF_FILE
if test 9154 -ne `wc -c <'lout/doc/tr.fig/s5'`; then
echo shar: \"'lout/doc/tr.fig/s5'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.fig/s5'
fi
if test -f 'lout/doc/tr.impl/s3.2' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.impl/s3.2'\"
else
echo shar: Extracting \"'lout/doc/tr.impl/s3.2'\" \(3408 characters\)
sed "s/^X//" >'lout/doc/tr.impl/s3.2' <<'END_OF_FILE'
X@SubSection
X @Tag { recursion }
X @Title { Recursion and page layout }
X@Begin
X@PP
XDesign and implementation should proceed together in exploratory projects,
Xsince otherwise the design too easily becomes unrealistic. Sometimes the
Ximplementation does more than its designer intended. The author wrote the
Xfollowing purely as a testing scaffold:
X@ID @Code {


X"def @Page right x"
X"{"

X" 8i @Wide 11i @High"
X" {"
X" //1i ||1i x ||1i"
X" //1i"
X" }"
X"}"
X}
XOnly afterwards did he realize its significance: the concept of a page
Xhad been defined outside the implementation, removing the need for
Xcommands for setting page width and height, margins, and so on.
X@PP
XDefining a sequence of pages is harder, since their number is not known
Xin advance. A simple version of this same problem is afforded by the
Xleaders found in tables of contents:
X@ID {
X4i @Wide { Chapter 7 @Leaders 53 }
X}
XThis seemed to require recursion, specifically the definition
X@ID @Code {
X"def @Leaders { .. @Leaders }"
X}
XNote that both @Code ".." and @Code "@Leaders" are objects, so the two
Xspaces separating them are significant. No base case is given, and indeed
Xwe have no boolean or conditional operators with which to express it;
Xbut we can adopt the implicit base `if space is not sufficient, delete
X{@Code "@Leaders"} and any preceding space'. Then the expression
X@ID @Code "4i @Wide { Chapter 7 @Leaders 53 }"
Xwill produce the object shown above. It is hard to see how this base
Xcould be made explicit, without violating the general principle of
Xkeeping all size information internal. In the implementation,
X@Code "@Leaders" remains unexpanded while sizes are being
Xcalculated; then it is treated similarly to a receptive symbol, with
Xits body as an incoming galley (Section {@NumberOf flushing}).
X@PP
XWith this settled, it is now clear how to define a document which is a
Xnumbered sequence of pages. Let @Code "@Next" be a prefix operator
Xwhich returns its parameter plus one. Then
X@ID @Code {
X"def @PageList"
X" right @PageNum"
X"{"
X" @Page {"
X" |0.5rt - @PageNum -"
X" //1v @TextPlace"
X" //1rt @FootSect"
X" }"
X" //"
X" @PageList @Next @PageNum"
X"}"
X}
Xwhen invoked in the expression {@Code "@PageList 1"}, has for its result
Xthe potentially infinite object
X@ID {


X@LittlePage {
X|0.5rt - 1 -

X//1.2vx @Code "@TextPlace"


X//1rt @Code "@FootSect"
X}
X//

X@LittlePage {
X|0.5rt - 2 -
X//1.2vx @Code "@TextPlace"
X//1rt @Code "@FootSect"
X}
X//0.2c
X8p @Font @Code "@PageList 3"
X}
XSimilarly, we may define @Code "@FootSect" like this:
X@ID @Code {
X"def @FootSect"
X"{"
X" def @FootList"
X" right @Num"
X" {"
X" @FootPlace"
X" //1v"
X" @FootList @Next @Num"
X" }"
X""
X" 1i @Wide @HLine"
X" //1v"
X" @FootList 1"
X"}"
X}
Xso that an invocation of @Code "@FootSect" produces
X@ID @Code {
X1i @Wide @HLine
X"@FootPlace"
X"@FootPlace"
X"@FootPlace"
X"..."
X}
XThe expansion process is very similar to a BNF derivation, and would be
Xattempted only on demand.
X@PP
XClearly, deciding which expansions to take and replacing @Code "@TextPlace"
Xand {@Code "@FootPlace"} by the appropriate actual text will not be easy;
Xthis is the subject of Section {@NumberOf galleys}. The important point
Xfor now is that we have here a very simple and flexible method of specifying
Xthe layout of pages, which requires no specialized language features.
X@End @SubSection
END_OF_FILE
if test 3408 -ne `wc -c <'lout/doc/tr.impl/s3.2'`; then
echo shar: \"'lout/doc/tr.impl/s3.2'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.impl/s3.2'
fi
if test -f 'lout/doc/tr.lout/ch1.02' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch1.02'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch1.02'\" \(8755 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch1.02' <<'END_OF_FILE'
X@Section
X @Title { Definitions }
X @Tag { definitions }
X@Begin
X@PP
XThe features of Lout are very general. They do not assume that documents
Xare composed of pages, nor that there are such things as margins and
Xfootnotes, for example. @I Definitions
Xdefinitions. @Index { Definitions }
Xbridge the gap between Lout's general features and the
Xspecial features -- footnotes, equations, pages -- that particular
Xdocuments require. They hold the instr&-uct&-ions for producing these
Xspecial features, conveniently packaged ready for use.
X@PP
XFor example, consider the challenge posed by `@TeX', which is the name of
Xone of Lout's most illustrious rivals [{@Ref knuth84}]. Lout solves it
Xeasily enough, like this:
X@ID @Code {
X"T{ /0.2fo E }X"
X}
Xbut to type this every time @TeX is mentioned would be tedious and
Xerror-prone. So we place a definition at the beginning of the document:
X@ID @Code {
X"def @TeX { T{ /0.2fo E }X }"
X}
XNow @Code "@TeX" stands for the object following it between
Xbraces, and we may write
X@ID @Code {
Xconsider the challenge posed by "`@TeX'", ...
X}
Xas the author did earlier in this paragraph.
X@PP
XA @I symbol
Xsymbol. @Index Symbol
Xis a name, like {@Code "@TeX"}, which stands for
Xsomething other than itself. The initial @Code "@" is not compulsory,
Xbut it does make the name stand out clearly. A @I definition of a symbol
Xdeclares a name to be a symbol, and says what the symbol stands for. The
X@I body of a definition
Xbody.of @Index { Body of a definition }
Xis the part following the name, between the braces. To @I invoke
Xinvocation @Index { Invocation of a symbol }
Xa symbol is to make use of it.
X@PP
XAnother expression ripe for packaging in a definition is
X@ID @Code {
X"@OneRow { | -2p @Font n ^/0.5fk 2 }"
X}
Xwhich produces @OneRow { | -2p @Font n ^/0.5sk 2 } as the reader
Xfamiliar with Chapter {@NumberOf details}
Xcan verify. But this time we would like to be able to write
X@ID {
X@I object @Code "@Super" @I object
X}
Xso that @Code { a "@Super" 2 } would come out as {a @Super 2}, and so
Xon, for in this way the usefulness of the definition is greatly
Xincreased. Here is how it is done:
X@ID @Code {
X"def @Super"


X" left x"
X" right y"

X"{ @OneRow { | -2p @Font y ^/0.5fk x }"
X"}"
X}
XThis definition says that @Code "@Super" has two {@I parameters},
Xparameter @Index Parameter
X@Code x and {@Code y}. When @Code "@Super" is invoked, all occurrences
Xof @Code x in the body will be replaced by the object just to the left
Xof {@Code "@Super"}, and all occurrences of @Code y will be replaced by
Xthe object just to the right. So, for example, the expression
X@ID @Code {
X"2 @Super { Slope @Font n }"
X}
Xis equal to
X@ID @Code {
X"@OneRow { | -2p @Font { Slope @Font n } ^/0.5fk 2 }"
X}
Xand so comes out as {2 @Super {Slope @Font n}}.
X@PP
XLout permits definitions to invoke themselves, a peculiarly circular
Xthing to do which goes by the name of
Xrecursion @Index Recursion
X@I recursion. Here is an example
Xof a recursive definition:
X@ID @Code {
X"def @Leaders { .. @Leaders }"
X}
XThe usual rule is that the value of an invocation of a symbol is a copy of
Xthe body of the symbol's definition, so the value of @Code "@Leaders" must be
X@ID @Code {
X".. @Leaders"
X}
XBut now this rule applies to this new invocation of {@Code "@Leaders"};
Xsubstituting its body gives
X@ID @Code {
X".. .. @Leaders"
X}
Xand so on forever. In order to make this useful,
Xan invocation of a recursive symbol is replaced by its body only if
Xsufficient space is available. So, for example,
X@ID @Code {
X"4i @Wide { Chapter 7 @Leaders 62 }"
X}
Xhas for its result the object
X@ID {
X4i @Wide { Chapter 7 @Leaders 62 }
X}
Xwith Lout checking before each replacement of @Code "@Leaders" by
X@OneCol @Code { ".." "@Leaders" } that the total length afterwards,
Xincluding the other words, would not exceed four inches.
X@PP
XThe remaining issue is what happens when Lout decides that it is time to
Xstop. The obvious thing to do is to replace the last invocation by an
Xempty object:
X@ID @Code {
X".. .. .. .. .. .. .. .. {}"
X}
XAs the example shows, this would leave a small trailing space, which in
Xpractice turns out to be a major headache. Lout solves this problem
Xby replacing the last invocation with a different kind of empty object,
Xcalled @@Null, whose effect is to make an adjacent concatenation symbol
Xdisappear, preferably one preceding the @@Null. Thus, when Lout
Xreplaces @Code "@Leaders" by @@Null in the expression
X@ID @Code {
X".. .. .. .. .. .. .. .. @Leaders"
X}
Xthe trailing space, which is really a horizontal concatenation symbol,
Xdisappears as well. This is carefully taken into account when deciding
Xwhether there is room to replace @Code "@Leaders" by its body at each
Xstage.
X@PP
XThe remainder of this section is devoted to showing how definitions may
Xbe used to specify the @I {page layout}
Xpage.layout @RawIndex { Page layout }
Xpage.layout.basic @SubIndex { principles of }
Xof a document. To begin with,
Xwe can define a page like this:
X@ID @Code {
X"def @Page"
X"{"
X" //1i ||1i"
X" 6i @Wide 9.5i @High"
X" { @TextPlace //1rt @FootSect }"
X" ||1i //1i"
X"}"
X}
XNow @Code "@Page" is an eight by
Xeleven and a half inch object, with one inch margins, a place at the top for
Xtext, and a section at the bottom for footnotes (since @Code "//1rt" leaves
Xsufficient space to bottom-justify the following object). It will be
Xconvenient for us to show the effect of invoking @Code "@Page" like this:
X@ID @Code
X{ { //0.5ix 8p @Font "@Page" &2m => } &2m
X@LittlePage { "@TextPlace" //1rt "@FootSect" }
X}
Xwith the invoked symbol appearing to the left of the arrow, and its body to
Xthe right.
X@PP
XThe definition of a vertical list of pages should come as no surprise:
X@ID @Code {
X"def @PageList"
X"{"
X" @Page"
X" //"
X" @PageList"
X"}"
X}
XThis allows invocations like the following:
X@ID @Code @HExpand @HScale {
X{ //0.5ix 8p @Font "@PageList" }
X||1m { //0.5ix => } ||1m


X{ @LittlePage { "@TextPlace" //1rt "@FootSect" }

X //0.2c 8p @Font "@PageList"
X}
X||1m { //0.5ix => } ||1m


X{ @LittlePage { "@TextPlace" //1rt "@FootSect" }
X // @LittlePage { "@TextPlace" //1rt "@FootSect" }

X //0.2c 8p @Font "@PageList"
X}
X||1m { //0.5ix => } ||1m


X{ @LittlePage { "@TextPlace" //1rt "@FootSect" }
X // @LittlePage { "@TextPlace" //1rt "@FootSect" }
X}

X}
Xsetting @Code "@PageList" to @Code @@Null on the last step. An
Xarbitrary number of pages can be generated in this way.
X@PP
XA definition for @Code "@TextPlace" is beyond us at present, since
X@Code "@TextPlace" must be replaced by different parts of the text
Xof the document on different pages. We can,
Xhowever, define @Code "@FootSect" to be a small space followed by a
Xhorizontal line followed by a list of places where footnotes are to go:
X@ID @Code {
X"def @FootList "
X"{ "
X" @FootPlace "
X" //0.3v "
X" @FootList "


X"} "
X" "
X"def @FootSect"
X"{ "

X" //0.3v 1i @Wide @HLine"
X" //0.3v @FootList "
X"} "
X}
Xassuming that @Code "@HLine" will produce a horizontal line of the
Xindicated width. With this definition we can generate pages like this:
X@ID @Code {
X@LittlePage { "@TextPlace"
X //1rt
X "@FootSect"
X }
X||2m { //0.5ix => } ||2m
X@LittlePage { "@TextPlace"
X //1rt
X @OneRow { 1c @Wide @HLine
X //0.1c
X "@FootList"
X }
X }
X||2m { //0.5ix => } ||2m
X@LittlePage { "@TextPlace"
X //1rt
X @OneRow { 1c @Wide @HLine
X //0.1c
X "@FootPlace"
X //0.1c
X "@FootList"
X }
X }
X}
Xand so on for arbitrarily many footnotes.
X@PP
XWe will see in the next section how invocations of @Code "@PageList",
X@Code "@FootSect" and @Code "@FootList" are replaced by their bodies only
Xwhen the need to insert text and footnotes obliges Lout to do so;
Xotherwise the invocations are replaced by @@Null. In this way, the
Xright number of pages is made, the small line appears only on pages that
Xhave at least one footnote, and unnecessary concatenation symbols
Xdisappear.
X@PP
XThis approach to page layout is the most original contribution Lout has
Xmade to document formatting. It is extraordinarily flexible. Two-column
Xpages? Use
X@ID @Code {
X"{2.8i @Wide @TextPlace} ||0.4i {2.8i @Wide @TextPlace}"
X}
Xinstead of {@Code "@TextPlace"}. Footnotes in smaller type? Use
X@Code { -2p "@Font" "@FootPlace" } instead of {@Code "@FootPlace"}. And
Xon and on.
X@End @Section
END_OF_FILE
if test 8755 -ne `wc -c <'lout/doc/tr.lout/ch1.02'`; then
echo shar: \"'lout/doc/tr.lout/ch1.02'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch1.02'
fi
if test -f 'lout/doc/tr.lout/ch2.06' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch2.06'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch2.06'\" \(9965 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch2.06' <<'END_OF_FILE'
X@Section
X @Title { Galleys and targets }
X @Tag { targets }
X@Begin
X@PP
XThe behaviour of galleys and their targets, as described in Section
Xgalley.feature.in.detail @SubIndex { in detail }
Xtargets.in.detail @SubIndex { in detail }
X{@NumberOf galleys}, can be summarized in three laws:
X@DP
X{@I {First Law}}: The first target is the closest invocation of the
Xtarget symbol, either preceding or following the invocation point of the
Xgalley as required, which has sufficient space to receive the first
Xcomponent;
X@DP
X{@I {Second Law}}: Each subsequent target is the closest invocation of
Xthe target symbol, following the previous target and lying within the same
Xgalley, which has sufficient space to receive the first remaining component;
X@DP
X{@I {Third Law}}: A receptive symbol that does not receive at least one
Xcomponent of any galley is replaced by @@Null.
X@DP
XThe terms `closest,' `preceding,' and `following' refer to position in
Xthe final printed document. This section explains the operation of
Xthese laws in Basser Lout.
X@PP
XWhen a galley cannot be fitted into just one target, Lout must find
Xpoints in the galley where it can be split in two. The object lying
Xbetween two neighbouring potential split points is called a @I component
Xcomponent @Index { Components of a galley }
Xof the galley. By definition, a component cannot be split.
X@PP
XTo determine the components of a galley, expand all symbols other than
Xrecursive and receptive ones, discard all @@Font, @@Break, and @@Space
Xsymbols, perform paragraph breaking as required, and discard all
Xredundant braces. Then view the galley as a sequence of one or more
Xobjects separated by vertical concatenation symbols; these are the
Xcomponents and split points. For example, given the definition
X@ID @Code {
X"def @Section into { @SectionPlace&&preceding }"
X" named @Title {}"
X" right @Body"
X"{"
X" 15p @Font { @Title //0.7f }"
X" //"
X" @Body"
X"}"
X}
Xthe galley
X@ID @Code {
X"@Section"
X" @Title { Introduction }"
X"{ This is a subject that really"
X"needs no introduction. }"
X}
Xbecomes
X@ID @Code {
X"Introduction"
X"//0.7f"
X"{}"
X"//"
X"This is a subject that really needs"
X"//1vx"
X"no introduction."
X}
Xwith four components. If @Code "@Body" was preceded by @Code "|1.0c" in
Xthe definition, the result would be
X@ID @Code {
X"Introduction"
X"//0.7f"
X"{}"
X"//"
X"|1.0c { This is a subject that really needs //1vx no introduction. }"
X}
Xand now @Code "//1vx" is buried within one component and is not a
Xpotential split point. In fact, in this case the broken paragraph as
Xa whole is enclosed in @@OneRow. This highlights a deficiency of
XBasser Lout: an indented paragraph cannot be split.
X@PP
XThe lines of a paragraph become separate components if the paragraph
Xoccupies an entire component before breaking; otherwise they are
Xenclosed in a @@OneRow symbol within one component. The same is true of
Xincoming components of other galleys. If a @@Galley symbol occupies an
Xentire component by the rules above, then the incoming components that
Xreplace it become components of their new home:
X@ID @Tab
X @Fmta { @Col @Code A ! @Col lines @Break B ! @Col @Code C }
X{
X@Rowa
X A {
X"An example"
X"//0.5c"
X"@Galley"
X"//0.5c"
X"@SomethingList"
X}
X B {
X""
X@Eq { ==> }
X}
X C {
X"An example"
X"//0.5c"
X"Incoming components"
X"//0.2c"
X"from some other galley"
X"//0.5c"
X"@SomethingList"
X}
X}
XOtherwise the incoming components are grouped within a @@OneRow symbol
Xand lie within one component.
X@PP
XThis distinction has a marked effect on the vertical concatenation
Xb.unit.use @SubIndex { use in @Code "//1.1b" }
Xsymbol {@Code "//1.1b"}, which calls for more space than is available
X(Section {@NumberOf concatenation}). There is no room for this symbol
Xwithin any component, so it will force a split and be discarded in that
Xcase. But it can be promoted to between two components.
X@PP
XComponents may be separated by @Code "/" as well as by {@Code "//"},
Xgiving rise to column mark alignment between adjacent components:
X@ID @ShowVMark {
X@HContract @GreyBox { 1c @Wide ^| 1c @Wide 0.6c @High }
X/0.3c
X@HContract @GreyBox { 2c @Wide 0.6c @High }
X/0.3c
X@HContract @GreyBox { 0.5c @Wide ^| 0.8c @Wide 0.6c @High }
X}
XWhen aligned components are promoted into different targets, the meaning
Xof alignment becomes very doubtful. For example, what if the targets
Xmark.alignment.in.detail @SubIndex { in detail }
Xare in different columns of one page, or what if one lies within
X{@Code "90d @Rotate"}?
X@PP
XThe truth is that @Code "/" causes all the objects that share a mark to
Xhave equal width:
X@ID @ShowVMark {
X@Box @HContract @GreyBox { 1c @Wide ^| 1c @Wide 0.6c @High }
X/0.3c
X@Box @HContract @GreyBox { 2c @Wide 0.6c @High }
X/0.3c
X@Box @HContract @GreyBox { 0.5c @Wide ^| 0.8c @Wide 0.6c @High }
X}
XThis is a consequence of the `as wide as possible' rule (Section
X{@NumberOf size}). Mark alignment occurs {@I incidentally}, whenever
Xthe fragments are placed into similar contexts.
X@PP
XIn this connection we must also consider the special case of a @@Galley
Xsymbol which shares its column mark with some other object:
X@ID @Code {
X"@Galley"
X"/0.2c"
X"@SomethingList"
X}
X(The @@Galley may or may not occupy an entire component; that doesn't
Xmatter here.) If incoming components are separated by @Code "//" rather
Xthan by {@Code "/"}, the meaning is so doubtful that this is forbidden. In
Xfact, a galley whose components replace such a @@Galley must have a
Xsingle column mark running its full length; that is, its components must
Xall share a single column mark. This mark will be merged with the
Xcolumn mark passing through each @@Galley that these components replace;
Xall the objects on the resulting merged mark will have equal width.
X@PP
XThe root galley, where everything collects immediately prior to output,
Xroot.galley.in.detail @SubIndex { in detail }
Xis created automatically, not by a definition. Its target is the output
Xfile, and its object is the entire input, which typically looks like this:
X@ID @Code {
X"@PageList"
X"//"
X"@Text {"
X" Body text of the document ..."
X"}"
X}
Xwhere @Code "@PageList" expands to a sequence of pages containing
X@Code "@TextPlace" symbols (see Section {@NumberOf definitions}), and
X@Code "@Text" is a galley:
X@ID @Code {
X"def @TextPlace { @Galley }"
X""
X"def @Text into { @TextPlace&&preceding }"
X" right x"
X"{"
X" x"
X"}"
X}
XThe spot vacated by a galley -- its invocation point -- becomes a @@Null
Xobject, so this root galley is effectively @Code "@PageList" alone, as
Xrequired. The @Code "@Text" galley will find its first target preceding
Xits invocation point, within {@Code "@PageList"}.
X@PP
XPrinting {@PageMark rootg} the root galley on the output file is somewhat problematical,
Xroot.galley.printing @SubIndex { printing of }
Xbecause Lout has no way of knowing how large the paper is. Basser Lout
Xsimply prints one root galley component per page (except it skips
Xcomponents of height zero), and the user is responsible for ensuring
Xthat each component is page-sized.
X@PP
XBasser Lout will promote a component only after any receptive symbols
Xcomponents.promotion @SubIndex { promotion of }
Xpromotion @Index { Promotion of components }
Xwithin it have been replaced, either by galleys or by @@Null, since
Xuntil then the component is not complete. A component which shares a
Xmark with following components is held up until they are all complete,
Xsince until then their width is uncertain.
X@PP
XConsider a page with @Code "@TextPlace" and @Code "@FootSect" receptive
Xsymbols. The rule just given will prevent the page from being printed
Xuntil @Code "@TextPlace" is replaced by body text, quite rightly; but
X@Code "@FootSect" will also prevent its printing, even when there are no
Xfootnotes.
X@PP
XBasser Lout is keen to write out pages as soon as possible, to save memory,
Xand it cannot afford to wait forever for non-existent footnotes. A variant
Xof the galley concept, called a {@I {forcing galley}},
Xforcing.galley @Index { Forcing galley } {@PageMark forcing}
Xis introduced to solve this problem. A forcing galley is defined like this:
X@ID @Code {
X"def @Text force into { @TextPlace&&preceding }"
X" ..."
X}
Xand so on. When such a galley replaces a @@Galley symbol, Lout replaces
Xevery receptive symbol preceding the @@Galley by @@Null, thus ensuring that
Xas soon as text enters a page, for example, everything up to and including
Xthe preceding page can be printed. This does not take care of the very last
Xpage, but Basser Lout replaces all receptive symbols by @@Null when it realizes
Xthat its input has all been read, thus allowing the last page to print.
X@PP
XA forcing galley causes the Third Law to be applied earlier than
Xexpected, and this creates two problems. First, the replacement by
X@@Null may be premature: a galley may turn up later wanting one of the
Xdefunct targets. Such galleys (entries in tables of contents are
Xtypical examples) are copied into the cross reference database and read
Xin during the next run just before their targets are closed, and so they
Xfind their targets in the end. Care must be taken to ensure that
Xlarge galleys such as chapters and sections do not have defunct targets,
Xsince the cost of copying them to and from the database is unacceptably high.
X@PP
XA @Code "following" galley may fail to find a first target lying in a
Xfollowing component of the same galley as its invocation point. This is
Xa deficiency of Basser Lout, which occurs if the target has not been
Xread from input at the time the galley tries to find it. A workaround
Xis to use a @Code "preceding" galley instead, defined like this:
X@ID @Code {
X"def @AGalley into { @AGalleyPlace&&preceding }"
X" right @Body"
X"{"
X" //1.1b"
X" @Body"
X"}"
X}
Xand invoked like this:
X@ID @Code {
X"@AGalleyPlace | @AGalley { content of galley }"
X"//"
X"..."
X"@AGalleyPlace"
X}
XThe first @Code "@AGalleyPlace" receives only the initial empty object,
Xsince the @Code "//1.1b" forces a split; and the Second Law puts Basser
XLout on the right track thereafter.
X@End @Section
END_OF_FILE
if test 9965 -ne `wc -c <'lout/doc/tr.lout/ch2.06'`; then
echo shar: \"'lout/doc/tr.lout/ch2.06'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch2.06'
fi
if test -f 'lout/doc/tr.lout/ch4.03' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch4.03'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch4.03'\" \(9416 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch4.03' <<'END_OF_FILE'
X@Section
X @Title { Page layout }
X @Tag { pagelayout }
X@Begin
X@PP
XThe page layout
Xpage.layout.inpractice @SubIndex { in practice }
Xdocument.layout.page.layout. @SubIndex { page layout }
Xdefinitions given in Section {@NumberOf definitions},
Xalthough correct, are very basic. In this section we present the
Xdefinitions used by the DocumentLayout package for laying out the pages
Xof books, including running page headers and footers, different formats
Xfor odd and even pages, and so on. The present document is produced with
Xthese definitions.
X@PP
XWe begin with a few definitions which permit the user to create cross
Xreferences of the `see page 27' variety which will be kept up to date
Xautomatically. The user marks the target page by placing
X@Code {"@PageMark intro"}, for example, at the point of interest, and
Xrefers to the marked page as @Code "@PageOf intro" elsewhere:
Xpageof.example @Index { @Code "@PageOf" example }
X@IndentedList
X@LI @Code {
X"export @Tag"
X"def @PageMarker right @Tag { @Null }"
X}
X@LI @Code {
X"def @PageMark right x"


X"{"
X" @PageMarker&&preceding @Tagged x"
X"}"
X}

X@LI @Code {
X"def @PageOf right x"


X"{"
X" @PageMarker&&x @Open { @Tag }"
X"}"
X}

X@EndList
XWe will see below that an invocation of @Code "@PageMarker" appears before
Xeach page, with @Code "@Tag" parameter equal to the
Xpage number. Suppose that {@Code "@PageMark intro"}, which expands to
X@ID @Code "@PageMarker&&preceding @Tagged intro"
Xhappens to fall on page 27 of the final printed document (of course, its
Xvalue is @@Null which makes it invisible). Then the effect of @@Tagged
Xis to attach @Code "intro" as an extra tag to the first invocation of
X{@Code "@PageMarker"} preceding that final point, and this must be
X{@Code "@PageMarker 27"}. Therefore the expression
X@ID @Code "@PageMarker&&intro @Open { @Tag }"
Xwill open the invocation {@Code "@PageMarker 27"} and yield the value of
Xits @Code "@Tag" parameter, 27. Thus, {@Code "@PageOf intro"} appearing
Xanywhere in the document yields 27.
X@PP
XNext we have some little definitions for various parts of the
Xpage. {@Code "@FullPlace"} will be the target of full-width body text:
X@ID @Code {


X"def @FullPlace { @Galley }"
X}

X{@Code "@ColPlace"} will be the target of body text within one column:
X@ID @Code {


X"def @ColPlace { @Galley }"
X}

X{@Code "@TopList"} will be the target of figures and tables:
X@ID @Code {


X"export @Tag"
X"def @TopList right @Tag"
X"{"
X" @Galley"
X" //@TopGap @TopList @Next @Tag"
X"}"
X}

XWe have taken a shortcut here, avoiding an unnecessary @Code "@TopPlace"
Xsymbol. @Code "@FootList" and {@Code "@FootSect"} define a sequence of
Xfull-width targets at the foot of the page for footnotes,
Xpreceded by a short horizontal line:
Xfootsect.example @Index { @Code "@FootSect" example }
X@IndentedList
X@LI @Code {


X"export @Tag"
X"def @FootList right @Tag"
X"{"
X" @Galley"
X" //@FootGap @FootList @Next @Tag"
X"}"
X}

X@LI @Code {


X"def @FootSect"
X"{"
X" @FootLen @Wide @HLine"
X" //@FootGap @FootList 1 ||@FootLen"
X"}"
X}

X@EndList
XSimilarly, @Code "@ColFootList" and @Code "@ColFootSect" provide a
Xsequence of targets for footnotes within one column:
X@ID @Code {


X"export @Tag"
X"def @ColFootList right @Tag"
X"{"
X" @Galley"
X" //@FootGap @ColFootList @Next @Tag"
X"}"
X""
X"def @ColFootSect"
X"{"
X" @ColFootLen @Wide @HLine"
X" //@FootGap @ColFootList 1 ||@ColFootLen"
X"}"
X}

XThe next definition provides a horizontal sequence of one or more columns:
Xcollist.example @Index { @Code "@ColList" example }
X@ID @Code {


X"def @ColList right col"
X"{"
X" def @Column"

X" { @VExpand { @ColPlace //1rt @OneRow { //@MidGap @ColFootSect } } }"
X""
X" col @Case {"
X" Single @Yield @Column"
X" Double @Yield { @DoubleColWidth @Wide @Column ||@ColGap @ColList col }"
X" Multi @Yield { @MultiColWidth @Wide @Column ||@ColGap @ColList col }"
X" }"
X"}"
X}
XEach column consists of a @Code "@ColPlace" at the top and a
X@Code "@FootSect" at the foot. The @@VExpand symbol ensures that
Xwhenever a column comes into existence, it will expand vertically so
Xthat the bottom-justification @Code "//1rt" has as much space as
Xpossible to work within. The @Code "col" parameter determines whether
Xthe result has a single column, double columns, or multiple columns.
X@PP
XThe {@Code "@Page"} symbol places its parameter in a page of fixed width,
Xheight, and margins:
Xpage.example @Index { @Code "@Page" example }
X@ID @Code {


X"def @Page right x"
X"{"
X" @PageWidth @Wide @PageHeight @High {"
X" //@PageMargin ||@PageMargin"
X" @HExpand @VExpand x"
X" ||@PageMargin //@PageMargin"
X" }"
X"}"
X}

X@@HExpand and @@VExpand ensure that the right parameter occupies all the
Xavailable space; this is important when the right parameter is unusually
Xsmall. The @@High symbol gives the page a single row mark, ensuring that
Xit will be printed on a single sheet of paper (page {@PageOf rootg}).
X@PP
XNext we have {@Code "@OnePage"}, defining a typical page of a book or
Xother document:
Xonepage.example @Index { @Code "@OnePage" example }
X@ID @Code {


X"def @OnePage"
X" named @Columns {}"
X" named @PageTop {}"
X" named @PageFoot {}"
X"{"
X" @Page {"
X" @PageTop"
X" //@MidGap @TopList"
X" //@MidGap @FullPlace"
X" //@MidGap @ColList @Columns"

X" // //1rt @OneRow { //@MidGap @FootSect //@MidGap @PageFoot }"
X" }"
X"}"
X}
XThe page top and page foot, and the number of columns, are parameters
Xthat will be given later when @Code "@OnePage" is invoked. The body of
Xthe page is a straightforward combination of previous definitions. The
X@Code "//" symbol protects the following @Code "//1rt" from deletion in
Xthe unlikely event that all the preceding symbols are replaced by
X@@Null. The following object is enclosed in @@OneRow to ensure that
Xall of it is bottom-justified, not just its first component.
X@PP
XBefore presenting the definition of a sequence of pages, we must detour
Xto describe how running page headers and footers (like those in the
Xpresent document) are produced. These are based on the
X@Code "@Runner" symbol:
Xrunner.example @Index { @Code "@Runner" example }
X@ID @Code {


X"export @TopOdd @TopEven @FootOdd @FootEven"
X"def @Runner"
X" named @TopOdd right @PageNum { @Null }"
X" named @TopEven right @PageNum { @Null }"
X" named @FootOdd right @PageNum { @Null }"
X" named @FootEven right @PageNum { @Null }"
X" named @Tag {}"
X"{ @Null }"
X}

XThe four parameters control the format of running headers and footers on
Xodd and even pages respectively. Invocations of {@Code "@Runner"}, for
Xexample
X@ID @Code {
X"@Runner"
X" @TopEven { @B @PageNum |1rt @I { Chapter 4 } }"
X" @TopOdd { @I { Examples } |1rt @B @PageNum }"
X}
Xwill be embedded in the body text of the document, and, as we will see
Xin a moment, are accessed by @Code "@Runner&&following" cross references
Xon the pages. Notice how the @Code "@PageNum" parameter of each
Xparameter allows the format of the running header to be specified while
Xleaving the page number to be substituted later.
X@PP
XWe may now define {@Code "@OddPageList"}, whose result is a sequence of
Xpages beginning with an odd-numbered page:
Xoddpagelist.example @Index { @Code "@OddPageList" example }
X@ID @Code {


X"def @OddPageList"
X" named @Columns {}"
X" right @PageNum"
X"{"

X" def @EvenPageList ..."


X""
X" @PageMarker @PageNum"
X" // @Runner&&following @Open {"

X" @OnePage"


X" @Columns { @Columns }"
X" @PageTop { @TopOdd @PageNum }"
X" @PageFoot { @FootOdd @PageNum }"
X" }"
X" // @EvenPageList"
X" @Columns { @Columns }"
X" @Next @PageNum"
X"}"
X}

XIgnoring @Code "@EvenPageList" for the moment, notice first that the
Xinvocation of @Code "@OnePage" is enclosed in
X{@Code "@Runner&&following @Open"}. Since {@Code "@Runner&&following"}
Xrefers to the first invocation of @Code "@Runner" appearing after itself
Xin the final printed document, the symbols @Code "@TopOdd" and
X@Code "@FootOdd" will take their value from the first invocation of
X@Code "@Runner" following the top of the page, even though @Code "@FootOdd"
Xappears at the foot of the page. Their @Code "@PageNum" parameters are
Xreplaced by {@Code "@PageNum"}, the actual page number parameter of
X{@Code "@OddPageList"}.
X@PP
XAfter producing the odd-numbered page, @Code "@OddPageList" invokes
X{@Code "@EvenPageList"}:
Xevenpagelist.example @Index { @Code "@EvenPageList" example }
X@ID @Code {


X"def @EvenPageList"
X" named @Columns {}"
X" right @PageNum"
X"{"
X" @PageMarker @PageNum"
X" // @Runner&&following @Open {"

X" @OnePage"


X" @Columns { @Columns }"
X" @PageTop { @TopEven @PageNum }"
X" @PageFoot { @FootEven @PageNum }"
X" }"
X" // @OddPageList"
X" @Columns { @Columns }"
X" @Next @PageNum"
X"}"
X}

XThis produces an even-numbered page, then passes the ball back to
X@Code "@OddPageList" -- a delightful example of what computer
Xscientists call mutual recursion. The two page types differ only in
Xtheir running headers and footers, but other changes could easily be made.
X@PP
XIt was foreshadowed earlier that an invocation of @Code "@PageMarker"
Xwould precede each page, and this has been done. Although this @Code
X"@PageMarker" is a component of the root galley, it will not cause a
Xpage to be printed, because Basser Lout skips components of height zero.
X@End @Section
END_OF_FILE
if test 9416 -ne `wc -c <'lout/doc/tr.lout/ch4.03'`; then
echo shar: \"'lout/doc/tr.lout/ch4.03'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch4.03'
fi
if test -f 'lout/makefile' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/makefile'\"
else
echo shar: Extracting \"'lout/makefile'\" \(8738 characters\)
sed "s/^X//" >'lout/makefile' <<'END_OF_FILE'
X
X###################################################################
X# #
X# Make file for installing Lout Version 2.03 #
X# #
X# Jeffrey H. Kingston #
X# 23 April 1993 #
X# #
X# make lout Compile the Lout source #
X# make install Install the Lout binary and libraries and #
X# perform a compulsory initial run #
X# make installman Install the Lout manual entry #
X# make installdoc Install the Lout documentation #
X# make clean Remove compilation temporaries #
X# make clobber Undo the effect of `make lout' #
X# make uninstall Undo the effect of `make install', #
X# `make installman', and `make installdoc' #
X# #
X# Most installations of Lout should require no more than the #
X# following steps. #
X# #
X# (1) Set the following five macros defined below to appropriate #
X# values. The macros are #
X# #
X# LATIN Set this to 1 if the ISO-LATIN-1 character #
X# set is to be used (i.e. for non-English #
X# languages), or 0 for ASCII (i.e. English). #
X# This has two effects: it changes the #
X# lexical analyser in the lout binary so #
X# as to recognize ISO-LATIN-1 characters, #
X# and it changes the directory that the Lout #
X# font files are copied from during install #
X# so that Latin .AFM files are used. It #
X# has no effect on hyphenation. #
X# #
X# At the time of writing the Latin font #
X# directory is empty and the changes to the #
X# lexical analyser are not implemented; but #
X# someday someone will fill in these gaps. #
X# #
X# BINDIR The directory where the Lout binary goes #
X# (this directory is assumed to exist) #
X# #
X# LIBDIR Directory where the Lout libraries go #
X# (this directory will be created) #
X# #
X# DOCDIR Directory where the Lout documents go; #
X# they are tech. reports written in Lout #
X# describing various parts of the system #
X# (this directory will be created) #
X# #
X# MANDIR Directory where Lout manual entry goes; #
X# it has the form of input to nroff -man #
X# (this directory is assumed to exist) #
X# #
X# (2) Execute "make lout". This will compile the Lout source #
X# code and leave the binary in this directory. No changes #
X# will be made in any other directories. #
X# #
X# (3) Execute "make install". This will (a) copy the Lout #
X# binary into directory BINDIR; (b) create LIBDIR and copy #
X# all the library files into it; and finally (c) perform a #
X# test run on the document stored in ./doc/tr.eq. This test #
X# is compulsory because it has side effects: the database #
X# index files loutrefs.li, refstyles.li, and standard.li #
X# are created in directory $(LIBDIR)/data, and the packed #
X# hyphenation pattern file lout.hyph.packed is created in #
X# directory $(LIBDIR)/include. The test run will produce #
X# quite a few warning messages about unresolved cross #
X# references, but there should be no fatal errors. (These #
X# warning messages gradually go away on subsequent runs.) #
X# #
X# (4) Execute "make installman". This installs the manual #
X# entry in directory $(MANDIR). #
X# #
X# (5) Execute "make installdoc". This creates $(DOCDIR) and #
X# copies the tech. reports into it. #
X# #
X# (6) Execute "make clobber". This undoes "make lout". #
X# #
X# You probably also want to change the default values of the #
X# @PageWidth and @PageHeight parameters of the DocumentLayout #
X# package, if you are using something other than A4 paper. #
X# These are found on lines 154-5 of file $(LIBDIR)/include/dl. #
X# Set them to the physical width and height of your paper; for #
X# example, 29.70c is 29.7 centimetres, the A4 height. #
X# #
X# Mail je...@cs.su.oz.au if you have any problems. #
X# #
X###################################################################
X
XLATIN = 0
XBINDIR = /usr/local/bin
XLIBDIR = /usr/local/lib/lout
XDOCDIR = /usr/local/lib/lout.doc
XMANDIR = /usr/local/man/man1
X
XCFLAGS = -DFONT_DIR=\"$(LIBDIR)/font$(LATIN)\" \
X -DINCL_DIR=\"$(LIBDIR)/include\" \
X -DDATA_DIR=\"$(LIBDIR)/data\" \
X -DLATIN=$(LATIN) \
X -DDEBUG_ON=0 \
X -DASSERT_ON=1
X
XOBJS = z01.o z02.o z03.o z04.o z05.o z06.o z07.o \
X z08.o z09.o z10.o z11.o z12.o z13.o z14.o \
X z15.o z16.o z17.o z18.o z19.o z20.o z21.o \
X z22.o z23.o z24.o z25.o z26.o z27.o z28.o \
X z29.o z30.o z31.o z32.o z33.o z34.o z35.o z36.o
X
Xlout: $(OBJS)
X $(CC) -o lout $(OBJS) -lm
X chmod a+x lout
X
X$(OBJS): externs
X
Xexterns:
X
Xinstall: lout
X @echo ""
X @echo "Copying Lout binary to BINDIR"
X cp lout $(BINDIR)/lout
X chmod a+x-w $(BINDIR)/lout
X @echo ""
X @echo "Creating LIBDIR and copying library files"
X mkdir $(LIBDIR)
X chmod 775 $(LIBDIR)
X mkdir $(LIBDIR)/include
X chmod 775 $(LIBDIR)/include
X mkdir $(LIBDIR)/data
X chmod 775 $(LIBDIR)/data
X mkdir $(LIBDIR)/font$(LATIN)
X chmod 775 $(LIBDIR)/font$(LATIN)
X cp include/* $(LIBDIR)/include
X chmod a+r-wx $(LIBDIR)/include/*
X cp data/* $(LIBDIR)/data
X chmod a+r-wx $(LIBDIR)/data/*
X cp font$(LATIN)/* $(LIBDIR)/font$(LATIN)
X chmod a+r-wx $(LIBDIR)/font$(LATIN)/*
X @echo ""
X @echo "Compulsory test run on doc/tr.eq (expect many non-fatal error messages)"
X ./lout ./doc/tr.eq/setup ./doc/tr.eq/s? > ./doc/tr.eq/op
X rm ./doc/tr.eq/op ./doc/tr.eq/s?.ld lout.li
X
Xinstallman:
X sed -e "s@<BINDIR>@$(BINDIR)@" -e "s@<LIBDIR>@$(LIBDIR)@" \
X -e "s@<DOCDIR>@$(DOCDIR)@" -e "s@<MANDIR>@$(MANDIR)@" \
X man/lout.1 > $(MANDIR)/lout.1
X chmod a+r $(MANDIR)/lout.1
X
Xinstalldoc:
X mkdir $(DOCDIR)
X chmod 775 $(DOCDIR)
X mkdir $(DOCDIR)/tr.lout
X chmod 775 $(DOCDIR)/tr.lout
X cp doc/tr.lout/* $(DOCDIR)/tr.lout
X chmod a+r-wx $(DOCDIR)/tr.lout/*
X mkdir $(DOCDIR)/tr.impl
X chmod 775 $(DOCDIR)/tr.impl
X cp doc/tr.impl/* $(DOCDIR)/tr.impl
X chmod a+r-wx $(DOCDIR)/tr.impl/*
X mkdir $(DOCDIR)/tr.over
X chmod 775 $(DOCDIR)/tr.over
X cp doc/tr.over/* $(DOCDIR)/tr.over
X chmod a+r-wx $(DOCDIR)/tr.over/*
X mkdir $(DOCDIR)/tr.begin
X chmod 775 $(DOCDIR)/tr.begin
X cp doc/tr.begin/* $(DOCDIR)/tr.begin
X chmod a+r-wx $(DOCDIR)/tr.begin/*
X mkdir $(DOCDIR)/tr.eq
X chmod 775 $(DOCDIR)/tr.eq
X cp doc/tr.eq/* $(DOCDIR)/tr.eq
X chmod a+r-wx $(DOCDIR)/tr.eq/*
X mkdir $(DOCDIR)/tr.fig
X chmod 775 $(DOCDIR)/tr.fig
X cp doc/tr.fig/* $(DOCDIR)/tr.fig
X chmod a+r-wx $(DOCDIR)/tr.fig/*
X mkdir $(DOCDIR)/tr.tab
X chmod 775 $(DOCDIR)/tr.tab
X cp doc/tr.tab/* $(DOCDIR)/tr.tab
X chmod a+r-wx $(DOCDIR)/tr.tab/*
X
Xuninstall:
X -rm -f $(BINDIR)/lout
X -rm -fr $(LIBDIR)
X -rm -fr $(DOCDIR)
X -rm -f $(MANDIR)/lout.1
X
Xclean:
X rm -f *.o
X
Xclobber: clean
X rm -f lout
END_OF_FILE
if test 8738 -ne `wc -c <'lout/makefile'`; then
echo shar: \"'lout/makefile'\" unpacked with wrong size!
fi
# end of 'lout/makefile'
fi
if test -f 'lout/z30.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/z30.c'\"
else
echo shar: Extracting \"'lout/z30.c'\" \(8790 characters\)
sed "s/^X//" >'lout/z30.c' <<'END_OF_FILE'
X/*@z30.c:Symbol uses:InsertUses(), FlattenUses(), SearchUses()@***************/


X/* */
X/* LOUT: A HIGH-LEVEL LANGUAGE FOR DOCUMENT FORMATTING (VERSION 2.03) */
X/* COPYRIGHT (C) 1993 Jeffrey H. Kingston */
X/* */
X/* Jeffrey H. Kingston (je...@cs.su.oz.au) */
X/* Basser Department of Computer Science */
X/* The University of Sydney 2006 */
X/* AUSTRALIA */
X/* */
X/* This program is free software; you can redistribute it and/or modify */
X/* it under the terms of the GNU General Public License as published by */
X/* the Free Software Foundation; either version 1, or (at your option) */
X/* any later version. */
X/* */
X/* This program is distributed in the hope that it will be useful, */
X/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
X/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
X/* GNU General Public License for more details. */
X/* */
X/* You should have received a copy of the GNU General Public License */
X/* along with this program; if not, write to the Free Software */
X/* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
X/* */

X/* FILE: z30.c */
X/* MODULE: Symbol Uses */
X/* EXTERNS: InsertUses(), FlattenUses(), SearchUses(), TargetUsedBy() */


X/* */
X/*****************************************************************************/
X#include "externs"
X

X
X/*****************************************************************************/
X/* */
X/* InsertUses(x, y) */
X/* */
X/* Record the fact that symbol x uses symbol y, by linking them. */
X/* Increment count of the number of times y is used, if y is a parameter. */
X/* */
X/*****************************************************************************/
X
XInsertUses(x, y)
XOBJECT x, y;
X{ OBJECT tmp;
X debug2(DSU, D, "InsertUses( %s, %s )", SymName(x), SymName(y));
X if( type(x) == LOCAL && type(y) == LOCAL && !predefined(y) )
X { tmp = GetMem(USES_SIZE, no_fpos); item(tmp) = y;
X if( base_uses(x) == nil ) next(tmp) = tmp;
X else next(tmp) = next(base_uses(x)), next(base_uses(x)) = tmp;
X base_uses(x) = tmp;
X }
X if( is_par(type(y)) )
X { uses_count(y) += (enclosing(y) == x ? 1 : 2);
X if( dirty(y) || uses_count(y) > 1 ) dirty(enclosing(y)) = TRUE;
X }
X else if( sym_body(y) == nil || dirty(y) ) dirty(x) = TRUE;
X debug5(DSU, D, "InsertUses returning ( %s %s; %s %s, count = %d )",
X SymName(x), (dirty(x) ? "dirty" : "clean"),
X SymName(y), (dirty(y) ? "dirty" : "clean"), uses_count(y));
X} /* end InsertUses */


X
X
X/*****************************************************************************/
X/* */

X/* static gather_uses(x, sym) */
X/* static gather_all_uses(x) */
X/* */
X/* gather_uses adds all the unmarked descendants of x to the uses relation */
X/* of sym; gather_all_uses applies gather_uses to all descendants of x. */
X/* */
X/*****************************************************************************/
X
Xstatic gather_uses(x, sym)
XOBJECT x, sym;
X{ OBJECT link, y, tmp;
X if( base_uses(x) != nil )
X { link = next(base_uses(x));
X do
X { y = item(link);
X if( marker(y) != sym )
X { if( y != sym )
X { marker(y) = sym;
X tmp = GetMem(USES_SIZE, no_fpos); item(tmp) = y;
X if( uses(sym) == nil ) next(tmp) = tmp;
X else next(tmp) = next(uses(sym)), next(uses(sym)) = tmp;
X uses(sym) = tmp;
X if( indefinite(y) ) indefinite(sym) = TRUE;
X if( uses_extern_target(y) ) uses_extern_target(sym) = TRUE;
X gather_uses(y, sym);
X }
X else recursive(sym) = TRUE;
X }
X link = next(link);
X } while( link != next(base_uses(x)) );
X }
X} /* end gather_uses */
X
X
Xstatic gather_all_uses(x)
XOBJECT x;
X{ OBJECT link, y;
X for( link = Down(x); link != x; link = NextDown(link) )
X { Child(y, link);
X if( type(y) == LOCAL ) gather_uses(y, y);
X gather_all_uses(y);
X }
X} /* end gather_all_uses */


X
X
X/*@@**************************************************************************/
X/* */

X/* FlattenUses() */
X/* */
X/* Traverse the directed graph assembled by InsertUses, finding its */
X/* transitive closure and storing this explicitly in uses(x) for all x. */
X/* */
X/*****************************************************************************/
X
XFlattenUses()
X{ gather_all_uses(StartSym);
X} /* end FlattenUses */


X
X
X/*****************************************************************************/
X/* */

X/* BOOLEAN SearchUses(x, y) */
X/* */
X/* Determine whether symbol x uses symbol y by searching x's uses list. */
X/* */
X/*****************************************************************************/
X
XBOOLEAN SearchUses(x, y)
XOBJECT x, y;
X{ OBJECT p;
X debug3(DSU, DD, "SearchUses(%s, %s) uses: %d", SymName(x),SymName(y),uses(x));
X if( x == y ) return TRUE;


X if( uses(x) != nil )

X { p = next(uses(x));
X do
X { debug1(DSU, DDD, " checking %s", SymName(item(p)));
X if( item(p) == y ) return TRUE;
X p = next(p);
X } while( p != next(uses(x)) );
X }
X return FALSE;
X} /* end SearchUses */


X
X
X/*****************************************************************************/
X/* */

X/* OBJECT FirstExternTarget(sym, cont) */
X/* OBJECT NextExternTarget(sym, cont) */
X/* */
X/* Together these two procedures return all symbols which are both used by */
X/* sym and a target for at least one external galley. Return nil at end. */
X/* */
X/*****************************************************************************/
X
XOBJECT FirstExternTarget(sym, cont)
XOBJECT sym, *cont;
X{ OBJECT res;
X debug1(DSU, D, "FirstExternTarget( %s )", SymName(sym));
X res = nil; *cont = nil;
X if( is_extern_target(sym) ) res = sym;
X else if( uses(sym) != nil )
X { *cont = next(uses(sym));
X do
X { if( is_extern_target(item(*cont)) )
X { res = item(*cont);
X break;
X }
X *cont = next(*cont);
X } while( *cont != next(uses(sym)) );
X }
X debug1(DSU, D, "FirstExternTarget returning %s", SymName(res));
X return res;
X} /* end FirstExternTarget */
X
XOBJECT NextExternTarget(sym, cont)
XOBJECT sym, *cont;
X{ OBJECT res;
X debug1(DSU, D, "NextExternTarget( %s )", SymName(sym));
X res = nil;
X if( *cont != nil )
X { *cont = next(*cont);
X while( *cont != next(uses(sym)) )
X { if( is_extern_target(item(*cont)) )
X { res = item(*cont);
X break;
X }
X *cont = next(*cont);
X }
X }
X debug1(DSU, D, "NextExternTarget returning %s", SymName(res));
X return res;
X} /* end NextExternTarget */
END_OF_FILE
if test 8790 -ne `wc -c <'lout/z30.c'`; then
echo shar: \"'lout/z30.c'\" unpacked with wrong size!
fi
# end of 'lout/z30.c'
fi
if test -f 'lout/z31.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/z31.c'\"
else
echo shar: Extracting \"'lout/z31.c'\" \(9723 characters\)
sed "s/^X//" >'lout/z31.c' <<'END_OF_FILE'
X/*@z31.c:Memory Allocator:zz_free[], GetMemory() etc.@************************/


X/* */
X/* LOUT: A HIGH-LEVEL LANGUAGE FOR DOCUMENT FORMATTING (VERSION 2.03) */
X/* COPYRIGHT (C) 1993 Jeffrey H. Kingston */
X/* */
X/* Jeffrey H. Kingston (je...@cs.su.oz.au) */
X/* Basser Department of Computer Science */
X/* The University of Sydney 2006 */
X/* AUSTRALIA */
X/* */
X/* This program is free software; you can redistribute it and/or modify */
X/* it under the terms of the GNU General Public License as published by */
X/* the Free Software Foundation; either version 1, or (at your option) */
X/* any later version. */
X/* */
X/* This program is distributed in the hope that it will be useful, */
X/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
X/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
X/* GNU General Public License for more details. */
X/* */
X/* You should have received a copy of the GNU General Public License */
X/* along with this program; if not, write to the Free Software */
X/* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
X/* */

X/* FILE: z31.c */
X/* MODULE: Memory Allocator */
X/* EXTERNS: zz_free[], GetMemory(), DebugMemory() */


X/* */
X/*****************************************************************************/
X#include "externs"
X

X#define MEM_CHUNK 1020 /* how many ALIGNs to get from sys */
X
X
X#if DEBUG_ON
Xstatic int no_of_calls = 0; /* number of calls to calloc() */
X int zz_newcount = 0; /* number of calls to New() */
X int zz_disposecount = 0; /* number of calls to Dispose() */
X
X/*****************************************************************************/
X/* */
X/* DebugMemory() */
X/* */
X/* Print memory usage. */
X/* */
X/*****************************************************************************/
X
XDebugMemory()
X{ int i, j; OBJECT p;
X debug2(DMA, D, "calloc called %d times (%d bytes total)",
X no_of_calls, no_of_calls * MEM_CHUNK * sizeof(ALIGN));
X debug2(DMA, D, "New() called %d times; Dispose() called %d times",
X zz_newcount, zz_disposecount);
X for( i = 0; i < MAX_OBJECT_REC; i++ )
X { if( zz_free[i] != nil )
X { j = 0;
X for( p = zz_free[i]; p != nil; p = pred(p, CHILD) ) j++;
X debug2(DMA, DD, "zz_free[%2d]: %3d", i, j);
X }
X }
X} /* end DebugMemory */
X#endif


X
X
X/*****************************************************************************/
X/* */

X/* OBJECT zz_free[], zz_hold, zz_tmp, zz_res */
X/* int zz_size */
X/* unsigned char zz_lengths[] */
X/* */
X/* zz_free[i]: free records of size i*sizeof(ALIGN). */
X/* zz_lengths[i]: the number of ALIGNs in a record of type i. */
X/* These variables are used only within the New() and Dispose() macros, */
X/* and the list handling macros. */
X/* */
X/*****************************************************************************/
X
XOBJECT zz_free[MAX_OBJECT_REC], zz_hold, zz_tmp, zz_res;
Xint zz_size;
Xunsigned char zz_lengths[DISPOSED]; /* DISPOSED is 1 + max type */
XOBJECT xx_link, xx_tmp, xx_res, xx_hold;


X
X
X/*@@**************************************************************************/
X/* */

X/* MemInit() */
X/* */
X/* Initialise memory allocator. */
X/* */
X/*****************************************************************************/
X
XMemInit()
X{
X zz_lengths[ WORD ] = 0;
X zz_lengths[ LINK ] = ceiling( sizeof(struct link_type), sizeof(ALIGN));
X
X /* object types, except closure NB have actual() field in token phase! */
X zz_lengths[ SPLIT ] =
X zz_lengths[ HEAD ] =
X zz_lengths[ PAR ] =
X zz_lengths[ ROW_THR ] =
X zz_lengths[ COL_THR ] =
X zz_lengths[ CLOSURE ] =
X zz_lengths[ NULL_CLOS ] =
X zz_lengths[ CROSS ] =
X zz_lengths[ ONE_COL ] =
X zz_lengths[ ONE_ROW ] =
X zz_lengths[ WIDE ] =
X zz_lengths[ HIGH ] =
X zz_lengths[ HSCALE ] =
X zz_lengths[ VSCALE ] =
X zz_lengths[ HCONTRACT ] =
X zz_lengths[ VCONTRACT ] =
X zz_lengths[ HEXPAND ] =
X zz_lengths[ VEXPAND ] =
X zz_lengths[ PADJUST ] =
X zz_lengths[ HADJUST ] =
X zz_lengths[ VADJUST ] =
X zz_lengths[ ROTATE ] =
X zz_lengths[ SCALE ] =
X zz_lengths[ CASE ] =
X zz_lengths[ YIELD ] =
X zz_lengths[ FONT ] =
X zz_lengths[ SPACE ] =
X zz_lengths[ BREAK ] =
X zz_lengths[ NEXT ] =
X zz_lengths[ ENV ] =
X zz_lengths[ CLOS ] =
X zz_lengths[ LVIS ] =
X zz_lengths[ OPEN ] =
X zz_lengths[ TAGGED ] =
X zz_lengths[ INCGRAPHIC ] =
X zz_lengths[ SINCGRAPHIC ] =
X zz_lengths[ GRAPHIC ] =
X zz_lengths[ ACAT ] =
X zz_lengths[ HCAT ] =
X zz_lengths[ VCAT ] =
X zz_lengths[ LBR ] =
X zz_lengths[ RBR ] =
X zz_lengths[ BEGIN ] =
X zz_lengths[ END ] =
X zz_lengths[ USE ] =
X zz_lengths[ DATABASE ] =
X zz_lengths[ SYS_DATABASE] =
X zz_lengths[ GSTUB_NONE ] =
X zz_lengths[ GSTUB_INT ] =
X zz_lengths[ GSTUB_EXT ] =
X zz_lengths[ DEAD ] =
X zz_lengths[ UNATTACHED ] =
X zz_lengths[ RECEPTIVE ] =
X zz_lengths[ RECEIVING ] =
X zz_lengths[ RECURSIVE ] =
X zz_lengths[ PRECEDES ] =
X zz_lengths[ FOLLOWS ] =
X zz_lengths[ CROSS_FOLL ] =
X zz_lengths[ GALL_FOLL ] =
X zz_lengths[ CROSS_TARG ] =
X zz_lengths[ GALL_TARG ] =
X zz_lengths[ GALL_PREC ] =
X zz_lengths[ CROSS_PREC ] =
X zz_lengths[ EXPAND_IND ] =
X zz_lengths[ THREAD ] =
X zz_lengths[ CR_LIST ] =
X ceiling(sizeof(struct closure_type), sizeof(ALIGN));
X
X /* symbol types */
X zz_lengths[ MACRO ] =
X zz_lengths[ LOCAL ] =
X zz_lengths[ LPAR ] =
X zz_lengths[ RPAR ] =
X zz_lengths[ NPAR ] =
X ceiling(sizeof(struct symbol_type), sizeof(ALIGN));
X
X /* gap objects */
X zz_lengths[ TSPACE ] =
X zz_lengths[ TJUXTA ] =
X zz_lengths[ GAP_OBJ ] =
X ceiling(sizeof(struct gapobj_type), sizeof(ALIGN));
X
X /* cross-reference and data base types */
X zz_lengths[ CROSS_SYM ] =
X zz_lengths[ CR_ROOT ] = ceiling(sizeof(struct cr_type) , sizeof(ALIGN));
X
X /* external galley record */
X zz_lengths[ EXT_GALL ] = ceiling(sizeof(struct ext_gall_type),sizeof(ALIGN));
X
X} /* end MemInit() */


X
X
X/*@@**************************************************************************/
X/* */

X/* OBJECT GetMemory(siz, pos) */
X/* */
X/* Return a pointer to siz ALIGNs of memory (0 < siz < MAX_OBJECT_REC). */
X/* */
X/*****************************************************************************/
X
XOBJECT GetMemory(siz, pos)
Xint siz; FILE_POS *pos;
X{ static ALIGN *next_free = (ALIGN *) nil;
X static ALIGN *top_free = (ALIGN *) nil;
X OBJECT res;
X char *calloc();
X
X debug1(DMA, DDD, "GetMemory( %d )", siz);
X
X /* get memory from operating system, if not enough left here */
X if( &next_free[siz] > top_free )
X { next_free = (ALIGN *) calloc(MEM_CHUNK, sizeof(ALIGN));
X ifdebug(DMA, D, no_of_calls++; )
X if( next_free == NULL ) Error(FATAL,pos,"run out of memory - exiting now");
X top_free = &next_free[MEM_CHUNK];
X debug2(DMA, D, "GetMemory: calloc returned %d - %d",
X (int) next_free, (int) top_free);
X }
X
X res = (OBJECT) next_free;
X next_free = &next_free[siz];
X debug3(DMA, DDD, "GetMemory returning @%d (next_free = @%d, top_free = @%d",
X (int) res, (int) next_free, (int) top_free);
X return res;
X} /* end GetMemory */
END_OF_FILE
if test 9723 -ne `wc -c <'lout/z31.c'`; then
echo shar: \"'lout/z31.c'\" unpacked with wrong size!
fi
# end of 'lout/z31.c'
fi
echo shar: End of archive 24 \(of 30\).
cp /dev/null ark24isdone

Jeff Kingston

unread,
Jun 1, 1993, 11:05:22 PM6/1/93
to
Submitted-by: je...@joyce.cs.su.oz.au (Jeff Kingston)
Posting-number: Volume 37, Issue 123
Archive-name: lout/part25
Environment: UNIX

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: lout/doc/tr.eq/s3 lout/doc/tr.lout/ch3.23
# lout/doc/tr.lout/ch4.01 lout/doc/tr.lout/ch4.02
# lout/doc/tr.lout/ch4.05 lout/doc/tr.lout/setup lout/z07.c
# lout/z11.c lout/z28.c lout/z35.c
# Wrapped by kent@sparky on Sun May 30 19:44:01 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 25 (of 30)."'
if test -f 'lout/doc/tr.eq/s3' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.eq/s3'\"
else
echo shar: Extracting \"'lout/doc/tr.eq/s3'\" \(3414 characters\)
sed "s/^X//" >'lout/doc/tr.eq/s3' <<'END_OF_FILE'
X@Section
X @Title { Spacing }
X@Begin
X@PP
XThere is a basic rule governing the use of white space characters
X(space, tab, and newline) in the input to Lout: white space between two
Xobjects affects the result; white space between a symbol and its
Xparameter does not.
X@PP
XAlthough this rule is just right most of the time, it is not adequate
Xfor equation formatting. Getting the horizontal spacing right in
Xequations is a very fiddly business, involving four different sizes of
Xspace (zero, thin, medium, and thick), and different rules for spacing
Xwithin superscripts and subscripts to those applying outside, according
Xto a leading authority [{@Ref knuth84}]. Eq therefore takes the spacing
Xdecisions upon itself, and con&-sequently chooses to ignore all white
Xspace in its input, even between two objects.
X@FootNote {
XThis effect is produced by enclosing the entire equation in
X{@Code "0c @Space"}. The simplest way to restore the effect of white
Xspace to part of an equation is to enclose that part in a @Code "@Font"
Xsymbol. Eq also changes the value of the @Code v unit, so if a paragraph
Xof filled text is desired within an equation, it may be necessary to
Xenclose it in a @Code "@Break" symbol. }
X@PP
XEvery symbol provided by Eq has a {@I {full name}}, which denotes the
Xsymbol without any space attached. Many symbols also
Xhave a {@I {short name}}, which denotes the same symbol with what Eq
Xconsiders to be an appropriate amount of space for that symbol attached
Xto it. For example, @Eq { lessequal } has full name @Code lessequal
Xand short name {@Code "<="}:
X@IL
X@LI {
X@Code "a lessequal b"
X|7ct
X@Eq { a lessequal b }
X}
X@LI {
X@Code "a <= b"
X|7ct
X@Eq { a <= b }
X}
X@EL
XEq puts a thick space around relation symbols like {@Code "<="}, a
Xmedium space around binary operator symbols like {@Code "+"}, and a thin
Xspace after punctuation symbols (@Code ";" and {@Code ","}); except
Xthat in places where the symbols appear in a smaller size (superscripts,
Xsubscripts, etc.), these spaces are omitted. No other horizontal space
Xis ever inserted.
X@PP
XThe short names have been carefully designed to produce good-looking
Xmathematics most of the time. It is best to rely
Xon them in the first instance and only think about spacing when the result
Xis not pleasing. In that case, Eq's space can be removed by using the
Xfull names, and thin, medium and thick space can be added using the
Xfollowing symbols:


X@ID @Tab
X vmargin { 0.5vx }

X @Fmta { @Col A ! @Col B }
X{
X@Rowa
X A { @Code "`" }
X B { {@Code "0.18f"} ({@Code "0.018f"} in subscripts, etc.) }
X@Rowa
X A { @Code "``" }
X B { {@Code "0.24f"} ({@Code "0.024f"} in subscripts, etc.) }
X@Rowa
X A { @Code "```" }
X B { {@Code "0.30f"} ({@Code "0.030f"} in subscripts, etc.) }
X}
Xwhere @Code "1f" is the current font size. These symbols have low
Xprecedence. The @Code "&" symbol from standard Lout is also available;
Xthe @Code "s" unit has value 0 and so is not very useful, but one can write
X@Code "&2m" for example for a two em space. Since the full names are tedious
Xto remember, Eq provides a symbol @Code "non" which removes spaces from
Xits right parameter; thus @Code "non <=" is equivalent to {@Code "lessequal"},
Xfor example. There are also symbols {@Code "rel"}, {@Code "bin"}, and
X{@Code "punct"} for telling Eq to add space to the following symbol as
Xthough it was a relation symbol, binary operator, or punctuation symbol.
X@End @Section
END_OF_FILE
if test 3414 -ne `wc -c <'lout/doc/tr.eq/s3'`; then
echo shar: \"'lout/doc/tr.eq/s3'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.eq/s3'
fi
if test -f 'lout/doc/tr.lout/ch3.23' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch3.23'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch3.23'\" \(7416 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch3.23' <<'END_OF_FILE'
X@Section
X @Title { "@Graphic" }
X @Tag { graphic }
X@Begin
X@PP
Xgraphic.sym @Index { @@Graphic symbol }
Xdiagrams @Index { Diagrams }
XLout does not provide the vast repertoire of graphical objects (lines,
Xcircles, boxes, etc.) required by diagrams. Instead, it provides an
Xescape route to some other language that does have these features, via
Xits @@Graphic symbol:
Xpostscript.graphic @SubIndex { used by @@Graphic }
X@ID @Code {
X"{ 0 0 moveto"
X" 0 ysize lineto"
X" xsize ysize lineto"
X" xsize 0 lineto"
X" closepath"
X" stroke"
X"}"
X"@Graphic"
X"{ //0.2c"
X" ||0.2c hello, world ||0.2c"
X" //0.2c"
X"}"
X}
XThe result of the above invocation of the symbol @@Graphic is
X@ID {
X{ 0 0 moveto
X 0 ysize lineto
X xsize ysize lineto
X xsize 0 lineto
X closepath
X stroke
X}
X@Graphic
X{ //0.2c
X ||0.2c hello, world ||0.2c
X //0.2c
X}
X}
X@PP
XThe right parameter always appears as part of the result, and indeed the
Xresult is always an object whose size is identical to the size of the
Xright parameter with @@OneCol and @@OneRow applied to
Xit. From now on we refer to this part of the result as the {@I base}.
X@PP
XThe left parameter is implementation-dependent: that is, its
Xmeaning is not defined by Lout, and different implementations could
Xrequire different values for it. The following description applies to
XBasser Lout, which uses the PostScript page description language
X[{@Ref adobe90}].
X@PP
XThe left parameter refers to a coordinate system whose origin
Xis the bottom left-hand corner of the base. It may use the symbols
X@Code xsize and @Code ysize to denote the horizontal and vertical size
Xof the base; similarly, @Code xmark and @Code ymark denote the positions
Xof the base's column and row marks:
X@ID 9p @Font @Fig {
X { &1rt @I ysize /0ik &1rt @I ymark /0ik &1rt 0 } |0.4c
X { /
X |0ik @ShowMarks { 1c @High 1.5c @Wide ^| 3c @Wide ^/ 2c @High }
X |0ik /
X }
X /0.2c
X | 0 | @I xmark | @I xsize
X}
XIn addition to these four symbols and 0, lengths may be denoted in
Xcentimetres, inches, points, ems, f's, v's and s's using the notation


X@ID @Tab
X vmargin { 0.5vx }

X hmargin { 1m }
X @Fmta { @Col {@I l @Code A} ! @Col {instead of Lout's} ! @Col {{@I l}B} }
X{
X@Rowa A { cm } B { c }
X@Rowa A { in } B { i }
X@Rowa A { pt } B { p }
X@Rowa A { em } B { m }
X@Rowa A { ft } B { f }
X@Rowa A { vs } B { v }
X@Rowa A { sp } B { s }
X}
XNote that there must be a space between the number and its unit,
Xunlike Lout proper.
X@PP
XA point within the base (and, with care, a point outside it) may
Xbe denoted by a pair of lengths. For example,
X@ID @Code {
X"xmark ymark"
X}
Xis the point where the marks cross, and
X@ID @Code {
X"0 2 cm"
X}
Xis a point on the left edge, two centimetres above the bottom left-hand
Xcorner. These two numbers are called the @I {x coordinate} and the
X@I {y coordinate} of the point.
X@PP
XThe first step in specifying a graphic object is to define a
X{@I path}. A path can be thought of as the track of a pen moving over
Xthe page. The pen may be up (not drawing) or down (drawing a line or
Xcurve) as it moves. The entire path is a sequence of the following
Xitems:
X@LP
X2i @Wide { |1rt @I {x y} @Code moveto }
X|2m Lift the pen and move it to the indicated point.
X@JP
X2i @Wide { |1rt @I {x y} @Code lineto }
X|2m Put the pen down and draw a straight line to the indicated point.
X@JP
X2i @Wide { |1rt @I {x y r angle1 angle2} @Code arc }
X|2m Put the pen down and draw a circular arc whose centre has
Xcoordinates @I x and @I y and whose radius is {@I r}. The arc begins
Xat the angle @I angle1 measuring counterclockwise from the point
Xdirectly to the right of the centre, and proceeds counterclockwise to
X{@I angle2}. If the arc is not the first thing on the path, a straight
Xline will be drawn connecting the current point to the start of the arc.
X@JP
X2i @Wide { |1rt @I {x y r angle1 angle2} @Code arcn }
X|2m As for arc, but the arc goes clockwise from @I angle1 to
X{@I angle2 }.
X@JP
X2i @Wide @Code { |1rt closepath }
X|2m Draw a straight line back to the point most recently moved to.
X@LP
XThe first item should always be a {@Code moveto}, {@Code arc}, or
X{@Code arcn}. It should be clear from this that the path given earlier:
X@ID @Code {
X"0 0 moveto"
X"0 ysize lineto"
X"xsize ysize lineto"
X"xsize 0 lineto"
X"closepath"
X}
Xtraces around the boundary of the base with the pen down.
X@PP
XOnce a path is set up, we are ready to @I paint it onto the page. There
Xare two choices: we can either @I stroke it, which means to display it
Xas described; or we can @I fill it, which means to paint everything
Xinside it grey or black. For stroking the two main options are
X@IL
X@LI {
X2i @Wide { |1rt @I length @Code setlinewidth }
X|2m The pen will draw lines of the given width.
X}
X@LI {
X2i @Wide { |1rt @Code "[" @I length @Code {"]" 0 setdash} }
X|2m The pen will draw dashed lines when it is down, with the dashes each
Xof the given length.
X}
X@EL
XThese options are followed by the word {@Code "stroke"}. So, for example,
X@ID @Code {
X"{ 0 0 moveto xsize 0 lineto"
X" 2 pt setlinewidth [ 5 pt ] 0 setdash stroke"
X"}"
X"@Graphic { 3i @Wide }"
X}
Xhas result
X@ID {
X{ 0 0 moveto xsize 0 lineto
X 2 pt setlinewidth [ 5 pt ] 0 setdash stroke
X}
X@Graphic { 3i @Wide }
X}
X@PP
XWhen filling in the region enclosed by a path, the main option is
X{@Code setgray}, which determines the shade of grey to use, on a scale
Xfrom 0 (black) to 1 (white). So, for example,
X@ID @Code {
X"{ 0 0 moveto xsize 0 lineto 0 ysize lineto closepath"
X" 0.8 setgray fill"
X"}"
X"@Graphic"
X"{ 2c @Wide 2c @High }"
X}
Xhas result
X@ID {
X{ 0 0 moveto xsize 0 lineto 0 ysize lineto closepath
X 0.8 setgray fill
X}
X@Graphic
X{ 2c @Wide 2c @High }
X}
X@PP
XThere are many other options. The value of the left parameter of
X@@Graphic may be any fragment of the PostScript page description language
X[{@Ref adobe90}]. Here are two other examples:
X@ID @Code {
Xxsize 2 div
X}
Xdenoting a length equal to half the horizontal size of the base, and
X@ID @Code {
Xgsave fill grestore stroke
X}
Xwhich both fills and strokes the path. Since Basser Lout does not check
Xthat the left parameter is valid PostScript, it is possible to cause
Xmysterious errors in the printing device, resulting in no output, if an
Xincorrect value is given. It is a good idea to encapsulate graphics
Xobjects in carefully tested definitions, like those of the Fig figure
Xdrawing package [{@Ref kingston92fig}],
Xfig @Index { Fig figure-drawing package }
Xto be sure of avoiding these errors.
X@PP
XPostScript experts may find the following information helpful when
Xdesigning advanced graphics features. The left parameter of @@Graphic
Xmay have two parts, separated by {@Code "//"}:
X@ID {
X@Code "{" @I {first part} @Code "//" @I {second part} @Code "} @Graphic"
X@I object
X}
XIf there is no {@Code "//"}, the second part is taken to be empty. The
XPostScript output has the form
X@ID lines @Break {
X@Code gsave
X@I x @I y @Code translate
X@I {Code which defines {@Code xsize}, {@Code ysize}, {@Code xmark}, {@Code ymark}, {@Code ft}, {@Code vs}, and {@Code sp} }
X@Code gsave
X@I {first part}
X@Code grestore
X@I {Code which renders the right parameter in translated coordinates}
X@I {second part}
X@Code grestore
X}
Xwhere @Eq {x, y} is the position of the lower left corner of the
Xbase. Having two parts permits bracketing operations, like @Code save
Xand @Code restore or @Code begin and {@Code end}, to enclose an
Xobject. See the source file of the Fig package for examples.
X@End @Section
END_OF_FILE
if test 7416 -ne `wc -c <'lout/doc/tr.lout/ch3.23'`; then
echo shar: \"'lout/doc/tr.lout/ch3.23'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch3.23'
fi
if test -f 'lout/doc/tr.lout/ch4.01' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch4.01'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch4.01'\" \(7273 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch4.01' <<'END_OF_FILE'
X@Section
X @Title { An equation formatting package }
X @Tag { eq }
X@Begin
X@PP
XIn this section we describe the design and implementation of the Eq
Xeq @Index { Eq equation formatting package }
Xequation formatting package. Equation formatting makes a natural first
Xexample, partly because its requirements have strongly influenced the
Xdesign of Lout, and partly because no cross references or galleys are
Xrequired.
X@PP
XTo the author's knowledge, Eq is the first equation formatter to be
Ximplemented as a collection of high-level definitions. This approach
Xhas significant advantages: the basics of language and layout are
Xtrivial, so the implementor can concentrate on fine-tuning; and the
Xdefinitions, being readily available, can be improved, extended, or even
Xreplaced.
X@PP
XAs described in the Eq user manual [{@Ref kingston92eq}], an equation is
Xentered in a format based on the one introduced by the eqn language of
XKernighan and Cherry [{@Ref kernighan75}]:
Xkernighan.b @Index { Kernighan, B. }
Xcherry.l @Index { Cherry, L. }


X@ID @Code {
X"@Eq { { x sup 2 + y sup 2 } over 2 }"
X}

XThe result is
X@ID @Eq { { x sup 2 + y sup 2 } over 2 }
XIn outline, the definition of the @Code "@Eq" symbol is
Xeq.example @Index { @Code "@Eq" example }
X@ID @Code {
X"export sup over \"+\" \"2\" \"<=\""
X"def @Eq"
X" body @Body"
X"{"
X" def sup precedence 60 left x right y { ... }"
X" def over precedence 54 left x right y { ... }"
X" def \"2\" { Base @Font \"2\" }"
X" def \"+\" { {Symbol Base} @Font \"+\" }"
X" def \"<=\" { {Symbol Base} @Font \"\\243\" }"
X" ..."
X""
X" Slope @Font 1.2f @Break 0c @Space @Body"
X"}"
X}
XA body parameter is used to restrict the visibility of the equation
Xformatting symbols (there are hundreds of them). The equation as a whole
Xis set in Slope (i.e. Italic) font, and symbols such as @Code "\"2\"" and
X@Code "\"+\"" are defined when other fonts are needed. Precedences are
Xused to resolve ambiguities such as {@Code "a sup b over c"}. Eq takes
Xall spacing decisions on itself, so to prevent white space
Xtyped by the user from interfering, the equation is enclosed in
X{@Code "0c @Space"}. We will discuss the {@Code "1.2f @Break"} later.
X@PP
XThus have we disposed of the language design part of the equation
Xformatting problem; it remains now to define the twenty or so symbols
Xwith parameters, and get the layout right.
X@PP
XEvery equation has an {@I axis}: an imaginary horizontal line through
Xthe centre of variables, through the bar of built-up fractions, and so
Xon. We can satisfy this requirement by ensuring that the result of each
Xsymbol has a single row mark, on the axis. For example, the
Xsuperscripting symbol is defined as follows:
Xsup.example @Index { @Code "sup" example }
X@ID @Code {
X"def sup"
X" precedence 60"


X" associativity left"
X" left x"

X" named gap { @SupGap }"
X" right y"
X"{"
X" @HContract @VContract {"


X" | @Smaller y"
X" ^/gap x"
X" }"
X"}"
X}

XThe @Code "@VContract" and @Code "^/" symbols together ensure that the axis
Xof the result is the axis of the left parameter. A @Code "gap"
Xparameter has been provided for varying the height of the superscript,
Xwith default value @Code "@SupGap" defined elsewhere as
X{@Code "0.40fk"}. It is important that such gaps be expressed in units
Xthat vary with the font size, so that they remain correct when the size
Xchanges. Collecting the default values into symbols like @Code
X"@SupGap" ensures consistency and assists when tuning the values. Here
Xis another characteristic definition:
Xover.example @Index { @Code "over" example }
X@ID @Code {
X"def over"
X" precedence 54"


X" associativity left"
X" left x"

X" named gap { 0.2f }"
X" right y"
X"{"
X" @HContract @VContract {"


X" |0.5rt @OneCol x"
X" ^//gap @HLine"
X" //gap |0.5rt @OneCol y"
X" }"
X"}"
X}

XBoth parameters are centred, since we do not know which will be the
Xwider; we use @@OneCol to make sure that the entire parameter is
Xcentred, not just its first column, and @@HContract ensures that the
Xfraction will never expand to fill all the available space, as Lout objects
Xhave a natural tendency to do (Section {@NumberOf size}). @Code "@HLine"
Xis a horizontal line of the width of the column:
Xhline.example @Index { @Code "@Hline" example }
X@ID @Code {
X"def @HLine"


X" named line { \"0.05 ft setlinewidth\" }"
X"{ "

X" { \"0 0 moveto xsize 0 lineto\" line \"stroke\" } @Graphic {}"
X"}"
X}
XHere we are relying on the expanding tendency just mentioned.
X@PP
XThe remaining symbols are quite similar to these ones. We conclude with
Xa few fine points of mathematical typesetting mentioned by a leading
Xauthority, D. E. Knuth [{@Ref knuth84}].
Xknuth.d @Index { Knuth, D. }
X@PP
XSome symbols, such as @Eq {lessequal} and @Eq { notequal }, should have a
Xthick space on each side; others, such as @Eq {plus} and @Eq {minus},
Xhave a medium space; others have a thin space on the right only. This
Xwould be easy to do except that these spaces are not wanted in
Xsuperscripts and subscripts:
X@ID @Eq { r sup n+1 - 1 }
XIn effect, the definition of such symbols changes depending on the
Xcontext; but Lout does not permit such a change. Luckily, the so-called
X`style' information set by the @@Font, @@Break, and @@Space symbols can
Xchange in this way. Accordingly, Eq commandeers the @Code v unit,
Xnormally used for line gaps, and uses it for these spaces instead:
X@ID @Code {


X"def @MedGap { 0.20v }"
X""

X"def \"+\" { &@MedGap plus &@MedGap }"
X""
X"def @Smaller right x { 0.7f @Font 0c @Space 0.2f @Break x }"
X}
XThe @Code "@Smaller" symbol is applied to all superscripts and subscripts,
Xreducing the font size and also reducing the @Code "v" unit,
Xthereby reducing the space around @Code "+" and similar symbols.
X@PP
XSome objects, notably matrices and large summation signs, must be
Xvertically centred in the sense that their axis must be placed halfway
Xdown the object. This seems quite different to the usual kind of
Xcentring of one object within another handled by the @Code "0.5rt" gap.
X With the aid of the @Code w unit used with concatenation symbols (one
Xw.unit.example @SubIndex { example of use of }
X@Code w is the size of the following object) and some ingenuity we find that
Xvctr.example @Index { @Code vctr example }
X@ID @Code {
X"def vctr right x"
X"{ @OneRow { /0.5wo @OneRow { @OneRow x ^/ } }"
X"}"
X}
Xwill vertically centre its parameter: @Code "@OneRow { @OneRow x ^/ }"
Xreplaces {@Code x}'s mark by one mark along its lower boundary; then
X@Code "/0.5wo" overstrikes the desired mark, and the outer @@OneRow
Xhides the lower mark. Unfortunately, although the parameter is
Xcorrectly placed and printed, the overstriking hides its top half, and
X@ID @Code {
X"vctr sum from i=0 to n i"
X}
Xappears as
X@ID @Eq {
X@OneRow { /0.5wo @OneRow { @OneRow sum ^/ } }
Xfrom i=0 to n i
X}
Xusing this definition. The version of @Code "vctr" in Eq
Xovercomes this problem by overstriking two copies of the parameter, one
Xof which has been rotated twice by 180 degrees:
X@ID @Code {
X"def vctr right x"
X"{ @OneRow"
X" { -180d @Rotate { /0.5wo 180d @Rotate { / @OneRow @OneCol x } }"


X" ^/ @OneRow { /0.5wo @OneRow { @OneRow @OneCol x ^/ } }"
X" }"
X"}"
X}

XThis is very ugly and suggests that something is lacking from Lout's features.
X@End @Section
END_OF_FILE
if test 7273 -ne `wc -c <'lout/doc/tr.lout/ch4.01'`; then
echo shar: \"'lout/doc/tr.lout/ch4.01'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch4.01'
fi
if test -f 'lout/doc/tr.lout/ch4.02' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch4.02'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch4.02'\" \(8479 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch4.02' <<'END_OF_FILE'
X@Section
X @Title { Paragraphs, displays, and lists }
X @Tag { paras }
X@Begin
X@PP
XThe remaining sections of this chapter are all based on the
XDocumentLayout package, described from the user's perspective in the
Xdocument.layout @Index { DocumentLayout package }
XBeginners' Guide [{@Ref kingston92begin}]. In 26 pages of Lout,
Xthe package defines many features required in the formatting of simple
Xdocuments, technical reports, and books, including displays, lists, page
Xlayout, cross references, tables of contents, footnotes, figures,
Xtables, references, chapters, sections, and sorted indexes.
X@PP
XThe symbols used for separating paragraphs and producing displays and
Xdocument.layout.paras @SubIndex { paragraphs }
Xlists may lack the excitement of more exotic features, but they can
Xteach some important lessons about robust design. The following macro
Xfor separating paragraphs produces a 0.3 cm vertical space and a 1 cm
Xindent on the following line, and is clearly on the right track:
X@ID @Code "macro @PP { //0.3c &1c }"
XNevertheless it has several major problems.
X@PP
XThe @Code "&" symbol is subject to widening during line adjustment, so
Xit should be replaced by {@Code "1c @Wide {}"}. But then white space
Xfollowing the symbol will affect the result, so an extra @Code "&0i" must
Xbe added. If the document is printed double spaced, this paragraph gap
Xwill fail to widen: it should be expressed in terms of the @Code "v" unit,
Xwith mark-to-mark spacing mode. Similarly, the paragraph indent should
Xprobably be made proportional to the font size.
X@PP
X`Magic numbers' like @Code "0.3c" should not be buried in definitions
Xwhere they cannot be changed easily, or kept consistent with similar
Xdefinitions during tuning. They are much better placed as symbols,
Xpossibly parameters of the enclosing package:
X@ID @Code {
X"def @DocumentLayout" pp.example @Index { @Code "@PP" example }
X" named @ParaGap { 1.3vx }"
X" named @ParaIndent { 2f }"
X" ..."
X"@Begin"


X""
X" macro @PP { //@ParaGap @ParaIndent @Wide &0i }"
X" macro @LP { //@ParaGap }"

X" ..."
X"@End @DocumentLayout"
X}
Xand we have arrived at the definition of @Code "@PP" as it appears in
Xthe DocumentLayout package.
X@PP
XA display is a table in which the first column is blank:
Xdocument.layout.displays @SubIndex { displays }
X@ID lines @Break {
X@I { preceding text }
X@Code "//@DispGap |@DispIndent" @I display
X@Code "//@DispGap"
X@I { following text }
X}
XEdge-to-edge is the appropriate spacing mode before and after displays,
Xsince the display could be a table or figure whose mark does not
Xcorrespond to a baseline. Thus, @Code "1v" is a reasonable value for
X{@Code "@DispGap"}.
X@PP
XThe ordinary user cannot be expected to type the Lout source shown
Xabove; a more appropriate syntax is
Xindented.display.example @Index { @Code "@IndentedDisplay" example }
X@ID lines @Break {
X@I { preceding text }
X@Code "@IndentedDisplay {" @I display @Code "}"
X@I { following text }
X}
XThis presents a problem: if @Code "@IndentedDisplay" is made a definition
Xwith a right parameter, its result will be an object separated from the
Xsurrounding text only by white space, hence part of the paragraph; while
Xif it is a macro, the final @Code "//@DispGap" cannot be included in it.
X The solution adopted in the DocumentLayout package uses a galley and a macro:
X@ID @Code {
X" def @DispPlace { @Galley }"
X" def @Disp into { @DispPlace&&preceding }"


X" right x"
X" {"
X" @OneRow x"
X" }"
X""

X" macro @IndentedDisplay"
X" {"
X" //@DispGap |@DispIndent @DispPlace |"
X" //@DispGap // @Disp"
X" }"
X}
X@Code "@DispPlace" and @Code "@Disp" are not exported, so there is
Xno danger of a name clash with some other symbol. The ordinary user's
Xsyntax expands to
X@ID lines @Break {
X@I { preceding text }
X@Code "//@DispGap |@DispIndent @DispPlace |"
X@Code "//@DispGap // @Disp {" @I display @Code "}"
X@I { following text }
X}
Xand the @Code "@Disp" galley appears at the preceding
X{@Code "@DispPlace"}, being itself replaced by @@Null. The @Code "//"
Xsymbol protects the preceding @Code "//@DispGap" from being deleted by
Xthis @@Null when there is no following text.
X@PP
XAn automatically numbered list
Xdocument.layout.lists @SubIndex { lists }
Xnumbered @Index { Numbered list }
Xcould have an arbitrarily large number of
Xitems, so, by analogy with sequences of pages, we see immmediately that
Xrecursion must be involved:
X@ID @Code {
X"def @List right num"
X"{"
X" @DispIndent @Wide num. | @ItemPlace"
X" //@DispGap @List @Next num"
X"}"
X}
XNotice how the @@Next symbol works in conjunction with the recursion to
Xproduce an ascending sequence of numbers; the result of @Code "@List 1"
Xwill be
X@ID @Code {
X"1. @ItemPlace"
X"2. @ItemPlace"
X"3. @ItemPlace"
X"..."
X}
XWe can follow this with items which are galleys targeted to
X{@Code "@ItemPlace&&preceding"}, and @Code "@List" will expand just
Xenough to accommodate them.
X@PP
XThe usual problem with recursive-receptive symbols now arises: there is
Xalways one unexpanded {@Code "@List"}, and until it can be removed the
Xgalley containing it will appear to be incomplete and will be prevented at
Xthat point from flushing into its parent (see page {@PageOf forcing}). We
Xadopt the usual solution: a forcing galley into a later target will
Xreplace the last @Code "@List" by @@Null. This brings us to the
Xdefinitions as they appear in DocumentLayout:
Xindented.list.example @Index { @Code "@IndentedList" example }
X@IndentedList
X@LI @Code {
X"def @ItemPlace { @Galley }"


X"def @ListItem into { @ItemPlace&&preceding }"

X" right x"
X"{ x }"
X}

X@LI @Code {


X"def @EndListPlace { @Galley }"
X"def @EndList force into { @EndListPlace&&preceding }"

X"{}"
X}
X@LI @Code {


X"def @RawIndentedList"
X" named style right tag {}"
X" named indent { @DispIndent }"
X" named gap { @DispGap }"
X" named start { 1 }"
X"{"
X" def @IList right num"
X" {"
X" indent @Wide {style num} | @ItemPlace"
X" //gap @IList @Next num"
X" }"
X""
X" @IList start // @EndListPlace"
X"}"
X}

X@EndList
XNow given the input
X@ID @Code {
X"@RawIndentedList"
X"@ListItem { first item }"
X"@ListItem { second item }"
X"..."
X"@ListItem { last item }"
X"@EndList"
X}
X@Code "@RawIndentedList" will expand to receive the items, and will be
Xclosed off by {@Code "@EndList"}.
X@PP
XThe {@Code indent}, {@Code gap}, and {@Code start} parameters are
Xstraightforward (note that the burden of typing @Code 1 has been lifted
Xfrom the ordinary user), but the @Code style parameter has a parameter
Xof its own (see page {@PageOf strange}). It is used like this:
X@ID @Code {


X"def @RawNumberedList { @RawIndentedList style { tag. } }"
X"def @RawParenNumberedList { @RawIndentedList style { (tag) } }"
X}

XIn {@Code "@RawNumberedList"}, @Code "style" is given the value
X{@Code "tag."}, where @Code tag is its own right parameter, so the value
Xof @Code "{style num}" within @Code "@IList" is {@Code "num."}; while in
X{@Code "@RawParenNumberedList"}, @Code "{style num}" is {@Code "(num)"}. In
Xthis way we achieve an unlimited variety of numbering formats without
Xhaving to rewrite @Code "@RawIndentedList" over and over.
X@PP
XThese list symbols are objects without surrounding space, so macros
Xsimilar to those used for displays are needed:
X@ID @Code {
X"macro @NumberedList { //@DispGap @RawNumberedList //@DispGap }"
X"macro @ParenNumberedList { //@DispGap @RawParenNumberedList //@DispGap }"
X}
Xand so on.
X@PP
XLists numbered by Roman numerals
Xroman @Index { Roman numerals }
Xpresent a problem, because @@Next will
Xnot increment Roman numerals. Instead, they must be stored in a
Xdatabase:
X@ID @Code {
X"def @Roman"
X" left @Tag"
X" right @Val"
X"{ @Val }"
X""
X"@SysDatabase @Roman { standard }"
X}
X@Code "@SysDatabase" is preferred over @Code "@Database" here because
Xthis database should be kept in a standard place and shared by
Xeveryone. The database itself, a file called @Code "standard.ld" in
XBasser Lout, contains invocations of {@Code "@Roman"}, each enclosed in
Xbraces:
X@ID @Code {
X"{ 1 @Roman i }"
X"{ 2 @Roman ii }"
X"..."
X"{ 100 @Roman c }"
X}
XThen @Code "@Roman&&12" for example has value {@Roman&&12}, and
X@ID @Code {


X"def @RawRomanList { @RawIndentedList style { {@Roman&&tag}. } }"
X}

Xproduces a list numbered by Roman numerals. The counting still
Xproceeds in Arabic, but each Arabic numeral is converted to Roman by the
Xcross reference. Since arbitrary objects may be stored in databases,
Xarbitrary finite sequences of objects may be `counted' in this way.
X@End @Section
END_OF_FILE
if test 8479 -ne `wc -c <'lout/doc/tr.lout/ch4.02'`; then
echo shar: \"'lout/doc/tr.lout/ch4.02'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch4.02'
fi
if test -f 'lout/doc/tr.lout/ch4.05' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch4.05'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch4.05'\" \(8311 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch4.05' <<'END_OF_FILE'
X@Section
X @Title { Bibliographies }
X @Tag { biblio }
X@Begin
X@PP
Xbibliographies @Index { Bibliographies }
XThe first step in the production of a bibliography is to create a
Xdatabase of references based on the definition
Xreference.example @Index { @Code "@Reference" example }
X@ID @Code {
X "export @Type @Author @Title @Institution @Number @Publisher"
X//1vx " @Year @Proceedings @Journal @Volume @Pages @Comment"
X//1vx ""
X//1vx "def @Reference"
X//1vx " named @Tag" |2f "{ TAG? }"
X /1vx " named @Type" | "{ TYPE? }"
X /1vx " named @Author" | "{ AUTHOR? }"
X /1vx " named @Title" | "{ TITLE? }"
X /1vx " named @Institution" | "{ INSTITUTION? }"
X /1vx " named @Number" | "{ NUMBER? }"
X /1vx " named @Publisher" | "{ PUBLISHER? }"
X /1vx " named @Year" | "{ YEAR? }"
X /1vx " named @Proceedings" | "{ PROCEEDINGS? }"
X /1vx " named @Journal" | "{ JOURNAL? }"
X /1vx " named @Volume" | "{ VOLUME? }"
X /1vx " named @Pages" | "{ PAGES? }"
X /1vx " named @Comment" | "{ @Null }"
X//1vx "{ @Null }"
X}
XFor example, the database might contain
X@IL
X@LI @Code {
X"{ @Reference"
X" @Tag { strunk79 }"
X" @Type { Book }"
X" @Author { Strunk, William and White, E. B. }"
X" @Title { The Elements of Style }"
X" @Publisher { MacMillan, third edition }"
X" @Year { 1979 }"
X"}"
X}
X
X@LI @Code {
X"{ @Reference"
X" @Tag { kingston92 }"
X" @Type { TechReport }"
X" @Author { Kingston, Jeffrey H. }"
X" @Title { Document Formatting with Lout (Second Edition) }"
X" @Number { 449 }"
X" @Institution { Basser Department of Computer"
X"Science F09, University of Sydney 2006, Australia }"
X" @Year { 1992 }"
X"}"
X}
X@EL
XSince named parameters are optional, we have one for every conceivable
Xtype of attribute, and simply leave out those that do not apply in any
Xparticular reference. We can print a reference by using the @@Open
Xsymbol to get at its attributes:
X@ID @Code {
X"@Reference&&strunk79 @Open"


X"{ @Author, {Slope @Font @Title}. @Publisher, @Year. }"

X}
XThe right parameter of @@Open may use the exported parameters of the
Xleft, and so the result is
X@ID {
X@Reference&&strunk79 @Open
X{ @Author, {Slope @Font @Title}. @Publisher, @Year. } &0io
X}
XIncidentally, we are not limited to just one database of references;
Xseveral @@Database symbols can nominate the same symbol, and invocations of
Xthat symbol can appear in the document itself as well if we wish.
X@PP
XThe second step is to create a database of print styles for the various
Xtypes of reference (Book, TechReport, etc.), based on the following
Xdefinition:
X@ID @Code {


X"export @Style"
X"def @RefStyle"
X" left @Tag"
X" named @Style right reftag {}"
X"{}"
X}

XNotice that the named parameter @Code "@Style" has a right parameter
X{@Code "reftag"}. The style database has one entry for each type of
Xreference:
X@ID @Code {
X"{ Book @RefStyle @Style"


X" { @Reference&&reftag @Open"
X" { @Author, {Slope @Font @Title}. @Publisher, @Year. @Comment }"
X" }"
X"}"
X""

X"{ TechReport @RefStyle @Style"


X" { @Reference&&reftag @Open"
X" { @Author, {Slope @Font @Title}. Tech. Rep. @Number (@Year),"
X"@Institution. @Comment }"

X" }"
X"}"
X}
Xand so on. The following prints the reference whose tag is
X@Code strunk79 in the Book style:
X@ID @Code {
X"@RefStyle&&Book @Open { @Style strunk79 }"
X}
XIt has result
X@ID {
X@RefStyle&&Book @Open { @Style strunk79 } &0io
X}
XNotice how the @Code "@Style" parameter of @Code "@RefStyle" is given the
Xparameter {@Code strunk79}, which it uses to open the appropriate
Xreference.
X@PP
XWe can consult the @Code "@Type" attribute of a reference to find out
Xits style, which brings us to the following definition for printing out
Xa reference in the style appropriate to it:
X@ID @Code {
X"def @RefPrint"
X" right reftag"


X"{ @RefStyle&&{ @Reference&&reftag @Open { @Type } }"
X" @Open { @Style reftag }"
X"}"
X}

XFor example, to evaluate {@Code "@RefPrint strunk79"}, Lout first
Xevaluates
X@ID @Code {
X"@Reference&&strunk79 @Open { @Type }"
X}
Xwhose result is {@Code { @Reference&&strunk79 @Open { @Type } }},
Xand then evaluates
X@Code {
X"@RefStyle&&Book @Open { @Style strunk79 }"
X}
Xas before. Complicated as this is, with its two databases and clever
Xpassing about of tags, the advantages of separating references from
Xprinting styles are considerable: printing styles may be changed
Xeasily, and non-expert users need never see them.
X@PP
XFinally, we come to the problem of printing out a numbered list of
Xreferences, and referring to them by number in the body of the
Xdocument. The first step is to create a numbered list of places that
Xgalleys containing references may attach to:
Xreferencesection.example @Index { @Code "@ReferenceSection" example }
X@ID @Code {


X"def @ReferenceSection"
X" named @Tag {}"
X" named @Title { References }"
X" named @RunningTitle { dft }"
X" named style right tag { tag. }"
X" named headstyle right @Title { @Heading @Title }"
X" named indent { @DispIndent }"
X" named gap { @DispGap }"
X" named start { 1 }"
X"{"
X" def @RefList right num"
X" {"

X" @NumberMarker num & indent @Wide {style num} | @RefPlace"


X" //gap @RefList @Next num"
X" }"
X""
X" @Protect headstyle @Title"
X" // @PageMarker&&preceding @Tagged @Tag"
X" // @Title @MajorContentsEntry {@PageOf @Tag}"
X" // @Runner"
X" @FootEven { |0.5rt 0.8f @Font @B @PageNum }"
X" @FootOdd { |0.5rt 0.8f @Font @B @PageNum }"
X" //@DispGap @RefList start"
X" // @Runner"
X" @TopEven { @B @PageNum }"
X" @TopOdd { @I {@RunningTitle @OrElse @Title} |1rt @B @PageNum }"
X"}"
X}

XWe place the expression @Code "@ReferenceSection" at the point where we
Xwant the list of references to appear; its value is something like
X@ID @Code {
X"1. @RefPlace"
X"2. @RefPlace"
X"3. @RefPlace"
X"..."
X}
Xwhere @Code "@RefPlace" is @Code "@Galley" as usual. We can scatter
Xmultiple lists of references through the document if we wish (at the end
Xof each chapter, for example), simply by placing @Code "@ReferenceSection"
Xat each point.
X@PP
XOur task is completed by the following definition:
Xref.example @Index { @Code "@Ref" example }
X@ID @Code {


X"def @Ref right x"
X"{"
X" def sendref into { @RefPlace&&following }"
X" right @Key"
X" {"
X" @NumberMarker&&preceding @Tagged x &"
X" @PageMarker&&preceding @Tagged x &"
X" @RefPrint x"
X" }"
X""
X" @NumberMarker&&x @Open { @Tag } sendref x"
X"}"
X}

XGiven this definition, the invocation {@Code "@Ref strunk79"} has result
X@ID @Code "@NumberMarker&&strunk79 @Open { @Tag }"
Xplus the galley {@Code "sendref strunk79"}. We first
Xfollow what happens to the galley.
X@PP
XAccording to its @Code into clause, the galley will replace a
X@Code "@RefPlace" in the nearest following {@Code "@ReferenceSection"}. If
Xevery such galley is a sorted galley whose key is the reference's tag, as
Xthis one is, they will appear sorted by tag. The galley's object is
X@ID @Code {
X"@NumberMarker&&preceding @Tagged strunk79 &"
X"@PageMarker&&preceding @Tagged strunk79 &"
X"@RefPrint strunk79"
X}
XThe result of the @@Tagged symbol is always @@Null, so this prints the
X@Code strunk79 reference in the appropriate style at the
X{@Code "@RefPlace"}, as desired.
X@PP
XNow @Code "@NumberMarker&&preceding" is the nearest preceding invocation of
X@Code "@NumberMarker" in the final document. This must be the invocation of
X@Code "@NumberMarker" just before the @Code "@RefPlace" that received
Xthe galley, and so this invocation of @Code "@NumberMarker" is given @Code
Xstrunk79 as an additional tag by the @@Tagged symbol. Its original tag
Xwas the number of the reference place, which means that
X@ID @Code {
X"@NumberMarker&&strunk79 @Open { @Tag }"
X}
Xhas for its result the number of the reference place that received the
X@Code strunk79 galley, and this is the desired result of
X{@Code "@Ref strunk79"}.
X@PP
XIt might seem that if we refer to the @Code strunk79 reference twice,
Xtwo copies will be sent to the reference list and it will appear
Xtwice. However, when more than one sorted galley with the same key is sent
Xto the same place, only one of them is printed (Section {@NumberOf galleys});
Xso provided that sorted galleys are used there is no problem.
X@End @Section
END_OF_FILE
if test 8311 -ne `wc -c <'lout/doc/tr.lout/ch4.05'`; then
echo shar: \"'lout/doc/tr.lout/ch4.05'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch4.05'
fi
if test -f 'lout/doc/tr.lout/setup' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/setup'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/setup'\" \(8555 characters\)
sed "s/^X//" >'lout/doc/tr.lout/setup' <<'END_OF_FILE'
X
X######################################################
X# #
X# Lout setup file for producing the user manual. #


X# #
X# Jeffrey H. Kingston #

X# 20 June 1991 #
X# 22 December 1991 #


X# #
X######################################################
X
X@SysInclude { ft }
X@SysInclude { dl }

X@SysInclude { eq }
X@SysInclude { fig }
X@SysInclude { tab }


X
X
X def "->" { {Symbol Base} @Font "\256" } #174 decimal
X def "=>" { {Symbol Base} @Font "\336" } #222 decimal
X macro @JP { /0.5v }
X

X def @Code right x


X { { Helvetica Base -1p } @Font lines @Break x }
X

X macro @JL { //1vx }
X
X ###################################################
X # #
X # Lout keywords. #
X # #


X ###################################################
X
X def @@Begin { @Code "@Begin" }
X def @@Break { @Code "@Break" }
X def @@Case { @Code "@Case" }
X def @@Database { @Code "@Database" }
X def @@End { @Code "@End" }
X def @@Font { @Code "@Font" }
X def @@Galley { @Code "@Galley" }
X def @@Graphic { @Code "@Graphic" }

X def @@HAdjust { @Code "@HAdjust" }
X def @@HContract { @Code "@HContract" }


X def @@HExpand { @Code "@HExpand" }
X def @@HScale { @Code "@HScale" }
X def @@High { @Code "@High" }
X def @@Include { @Code "@Include" }

X def @@IncludeGraphic { @Code "@IncludeGraphic" }


X def @@Key { @Code "@Key" }
X def @@LClos { @Code "@LClos" }
X def @@LEnv { @Code "@LEnv" }
X def @@LInput { @Code "@LInput" }

X def @@LVis { @Code "@LVis" }


X def @@Moment { @Code "@Moment" }
X def @@Next { @Code "@Next" }
X def @@Null { @Code "@Null" }
X def @@OneCol { @Code "@OneCol" }
X def @@OneRow { @Code "@OneRow" }
X def @@Open { @Code "@Open" }

X def @@PAdjust { @Code "@PAdjust" }
X def @@PrependGraphic { @Code "@PrependGraphic" }


X def @@Rotate { @Code "@Rotate" }

X def @@Scale { @Code "@Scale" }


X def @@Space { @Code "@Space" }
X def @@SysDatabase { @Code "@SysDatabase" }
X def @@SysInclude { @Code "@SysInclude" }

X def @@SysIncludeGraphic { @Code "@SysIncludeGraphic" }
X def @@SysPrependGraphic { @Code "@SysPrependGraphic" }


X def @@Tag { @Code "@Tag" }
X def @@Tagged { @Code "@Tagged" }
X def @@Use { @Code "@Use" }

X def @@VAdjust { @Code "@VAdjust" }
X def @@VContract { @Code "@VContract" }


X def @@VExpand { @Code "@VExpand" }
X def @@VScale { @Code "@VScale" }
X def @@Yield { @Code "@Yield" }
X def @@Wide { @Code "@Wide" }
X
X
X ###################################################

X # #
X # Miscellaneous, mostly graphical definitions. #
X # #
X ###################################################
X


X def @TeX { T{ /0.2fo E}X }
X

X export sp sb
X def @Equation
X body x
X @Begin
X
X def sp left x right y { @OneRow { | "-2p" @Font y ^/0.5fk x } }
X def sb left x right y { @OneRow { x ^/0.5fk | "-2p" @Font y } }


X
X Slope @Font x
X

X @End @Equation
X
X def @Super


X left x
X right y

X { @OneRow { | -2p @Font y ^/0.5fk x }
X }
X
X def @NineSquare
X right x
X {
X def @Three { x |0.2i x |0.2i x }


X
X @Three /0.2i @Three /0.2i @Three
X }
X

X def @Leaders
X { .. @Leaders
X }
X
X def @HLine
X {

X { 0 0 moveto xsize 0 lineto stroke } @Graphic {}
X }
X


X def @VDashLine
X right length
X {
X length @High {

X { 0 0 moveto 0 ysize lineto [ 3 pt ] 0 setdash stroke } @Graphic {}
X }
X }
X


X def @LBox
X right offset

X { @HContract @VContract


X {
X { //0.2c
X 0.6c @High 1.2c @Wide
X { 0 0 moveto xsize 0 lineto
X xsize ysize lineto 0 ysize lineto closepath
X gsave 0.9 setgray fill grestore stroke }
X @Graphic {}
X }
X ||offset @VDashLine 1c

X }
X }
X


X def @Arrow
X right length
X { @OneCol @OneRow
X {
X 30d @Rotate {0.12c @Wide @HLine}
X //
X length @Wide @HLine
X //

X "-30d" @Rotate {0.12c @Wide @HLine}
X }
X }
X


X def @DoubleArrow
X right length
X { @OneCol @OneRow
X {
X & 180d @Rotate @Arrow length
X |0io @Arrow length

X }
X }
X


X def @Put
X left coord
X right x
X { @OneCol @OneRow

X { coord / | @OneCol @OneRow x
X }
X }
X

X macro @At { //0io }
X
X
X ###################################################

X # #
X # Interpolated example documents. #
X # #


X ###################################################
X
X def @LittleEndRunPlace { @Galley }
X def @LittleEndRun
X force into { @LittleEndRunPlace&&preceding }
X {}
X
X def @LittleTextPlace { @Galley }
X def @LittleText into { @LittleTextPlace&&preceding }
X right x

X { x
X }
X


X def @LittleFootPlace { @Galley }
X def @LittleFootNote into { @LittleFootPlace&&following }
X right x

X { x
X }
X
X def @LittlePageColumn
X right x
X {


X 9px @Break 8p @Font

X 2.8c @Wide x
X }
X
X def @LittlePage
X right x
X {
X @HContract @VContract {


X { 0 0 moveto xsize 0 lineto xsize ysize lineto
X 0 ysize lineto closepath stroke } @Graphic
X { //0.3c ||0.3c
X 9px @Break 8p @Font
X 2.8c @Wide 3.8c @High x
X ||0.3c //0.3c

X }
X }
X }
X


X def @LittleFootSect
X { 1c @Wide @HLine
X //0.3v @LittleFootPlace ||0.5c
X }
X
X def @LittlePageList

X right @PageNum
X {


X @LittlePage { # |0.5rt @PageNum //0.8v
X //0.3v @LittleTextPlace
X //1rt @LittleFootSect
X }
X //

X @LittlePageList @Next @PageNum
X }
X


X def @LittleDocument
X { @LittlePage
X { @LittleTextPlace
X //1rt @LittleFootSect
X }
X // @LittlePageList 2
X // @LittleEndRunPlace
X }
X

X def @ShowMarks


X named linewidth { 0.015 cm }
X named linestyle { dashed }
X named dashlength { 0.15 cm }
X named paint { light }

X right x
X {
X @HContract @VContract @Fig


X { @Box margin { 0c } linewidth { linewidth } paint { paint }
X { @Figure

X shape { -0.3 cm ymark
X {xsize ymark} ++ {0.3 cm 0} []
X xmark -0.3 cm
X {xmark ysize} ++ {0 0.3 cm}
X }


X linewidth { linewidth }
X linestyle { linestyle }
X dashlength { dashlength }

X x
X }
X
X }
X }

X
X def @ShowVMark


X named linewidth { 0.015 cm }
X named linestyle { dashed }
X named dashlength { 0.15 cm }
X named paint { light }

X right x
X {
X @Fig
X {
X @Figure
X shape {
X xmark -0.3 cm
X {xmark ysize} ++ {0 0.3 cm}
X }


X linewidth { linewidth }
X linestyle { linestyle }
X dashlength { dashlength }

X x
X }
X }
X

X def @Strange
X named @Format right @Val { [@Val] }
X right x
X { @Format x
X }
X
X def @Box right x
X {
X "0 0 moveto xsize 0 lineto xsize ysize lineto 0 ysize lineto closepath stroke"
X @Graphic x
X }
X
X def @GreyBox right x
X {
X "0 0 moveto xsize 0 lineto xsize ysize lineto 0 ysize lineto closepath 0.8 setgray fill"
X @Graphic x
X }
X
X@Use { @DocumentLayout
X @MakeIndex { Yes }
X @TableOfContents { Yes }
X @AppendixGap { 1.10b }
X @BookTitleFormat { {Bold 2.0f} @Font {//2.0f @Title //0.5f} }
X}
X
X@SysDatabase @Reference { loutrefs }
END_OF_FILE
if test 8555 -ne `wc -c <'lout/doc/tr.lout/setup'`; then
echo shar: \"'lout/doc/tr.lout/setup'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/setup'
fi
if test -f 'lout/z07.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/z07.c'\"
else
echo shar: Extracting \"'lout/z07.c'\" \(8502 characters\)
sed "s/^X//" >'lout/z07.c' <<'END_OF_FILE'
X/*@z07.c:Object Service:CopyObject(), DisposeObject()@************************/


X/* */
X/* LOUT: A HIGH-LEVEL LANGUAGE FOR DOCUMENT FORMATTING (VERSION 2.03) */
X/* COPYRIGHT (C) 1993 Jeffrey H. Kingston */
X/* */
X/* Jeffrey H. Kingston (je...@cs.su.oz.au) */
X/* Basser Department of Computer Science */
X/* The University of Sydney 2006 */
X/* AUSTRALIA */
X/* */
X/* This program is free software; you can redistribute it and/or modify */
X/* it under the terms of the GNU General Public License as published by */
X/* the Free Software Foundation; either version 1, or (at your option) */
X/* any later version. */
X/* */
X/* This program is distributed in the hope that it will be useful, */
X/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
X/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
X/* GNU General Public License for more details. */
X/* */
X/* You should have received a copy of the GNU General Public License */
X/* along with this program; if not, write to the Free Software */
X/* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
X/* */

X/* FILE: z07.c */
X/* MODULE: Object Service */
X/* EXTERNS: MakeWord(), DisposeObject(), CopyObject(), */
X/* SplitIsDefinite() */


X/* */
X/*****************************************************************************/
X#include "externs"
X
X
X/*****************************************************************************/
X/* */

X/* OBJECT MakeWord(str, pos) */
X/* OBJECT MakeWordTwo(str1, str2, pos) */
X/* */
X/* Return an unsized WORD with the given string or concatenation of */
X/* strings, and the given filepos. */
X/* */
X/*****************************************************************************/
X
XOBJECT MakeWord(str, pos)
Xunsigned char *str; FILE_POS *pos;
X{ OBJECT res = NewWord(strlen(str), pos);
X strcpy( string(res), str );
X FposCopy(fpos(res), *pos);
X debug2(DOS, DD, "MakeWord(%s) returning %s", str, EchoObject(null, res));
X return res;
X} /* end MakeWord */
X
XOBJECT MakeWordTwo(str1, str2, pos)
Xunsigned char *str1, *str2; FILE_POS *pos;
X{ int len1 = strlen(str1);
X int len2 = strlen(str2);
X OBJECT res = NewWord(len1 + len2, pos);
X strcpy( string(res), str1 );
X strcpy( &string(res)[len1], str2 );
X FposCopy(fpos(res), *pos);
X debug4(DOS, DD, "MakeWordTwo(%s, %s, %s) returning %s",
X str1, str2, EchoFilePos(pos), EchoObject(null, res));
X return res;
X} /* end MakeWordTwo */


X
X
X/*****************************************************************************/
X/* */

X/* DisposeObject(x) */
X/* */
X/* Dispose object x. If some of x's children are shared with other */
X/* parents, those children are left intact. */
X/* */
X/*****************************************************************************/
X
XDisposeObject(x)
XOBJECT x;
X{ debug2(DOS,D,"[DisposeObject( %d ), type = %s, x =", (int) x, Image(type(x)));
X ifdebug(DOS, DD, EchoObject(stderr, x));
X assert( Up(x) == x, "DisposeObject: x has a parent!" );
X while( Down(x) != x ) DisposeChild(Down(x));
X Dispose(x);
X debug0(DOS, D, "]DisposeObject returning.");
X} /* end DisposeObject */


X
X
X/*@@**************************************************************************/
X/* */

X/* OBJECT CopyObject(x, pos) */
X/* */
X/* Make a copy of unsized object x, setting all file positions to *pos. */
X/* */
X/*****************************************************************************/
X
XOBJECT CopyObject(x, pos)
XOBJECT x; FILE_POS *pos;
X{ OBJECT y, link, res, tmp;
X
X debug2(DOS, DD, "CopyObject(%s,%s)", EchoObject(null, x), EchoFilePos(pos));
X switch( type(x) )
X {
X
X case WORD:
X
X res = NewWord(strlen(string(x)), pos);
X strcpy(string(res), string(x));
X break;
X
X
X case GAP_OBJ:
X
X res = New(type(x));
X mark(gap(res)) = mark(gap(x));
X join(gap(res)) = join(gap(x));


X if( Down(x) != x )
X { Child(y, Down(x));

X tmp = CopyObject(y, pos);
X Link(res, tmp);
X }
X else
X { hspace(res) = hspace(x);
X vspace(res) = vspace(x);


X }
X break;
X
X

X case HEAD:
X case NULL_CLOS:
X case CROSS:


X case ONE_COL:
X case ONE_ROW:

X case WIDE:
X case HIGH:

X case HSCALE:
X case VSCALE:

X case SCALE:


X case HCONTRACT:
X case VCONTRACT:
X case HEXPAND:
X case VEXPAND:
X case PADJUST:
X case HADJUST:
X case VADJUST:

X case ROTATE:
X case CASE:
X case YIELD:
X case FONT:
X case SPACE:
X case BREAK:
X case NEXT:
X case OPEN:
X case TAGGED:
X case INCGRAPHIC:
X case SINCGRAPHIC:
X case GRAPHIC:

X case VCAT:
X case HCAT:
X case ACAT:
X

X res = New(type(x));


X for( link = Down(x); link != x; link = NextDown(link) )
X { Child(y, link);

X tmp = CopyObject(y, pos);
X Link(res, tmp);


X }
X break;
X
X

X case ENV:
X
X res = x; /* don't copy environments */
X break;
X
X
X case PAR:
X
X res = New(PAR);
X actual(res) = actual(x);
X assert( Down(x) != x, "CopyObject: PAR child!" );
X Child(y, Down(x));
X tmp = CopyObject(y, pos);
X Link(res, tmp);


X break;
X
X
X case CLOSURE:
X

X res = New(type(x));


X for( link = Down(x); link != x; link = NextDown(link) )
X { Child(y, link);

X assert( type(y) != CLOSURE, "CopyObject: CLOSURE!" );
X tmp = CopyObject(y, pos);
X Link(res, tmp);
X }
X actual(res) = actual(x);
X StyleCopy(save_style(res), save_style(x));


X break;
X
X
X default:
X

X Error(INTERN, pos, "CopyObject: %s found", Image(type(x)));
X break;
X


X } /* end switch */

X if( pos == no_fpos ) FposCopy(fpos(res), fpos(x));
X else FposCopy(fpos(res), *pos);
X debug1(DOS, DD, "CopyObject returning %s", EchoObject(null, res));
X return res;
X} /* end CopyObject */


X
X
X/*****************************************************************************/
X/* */

X/* BOOLEAN SplitIsDefinite(x) */
X/* */
X/* Return TRUE if x is a definite SPLIT object (both children definite) */
X/* */
X/*****************************************************************************/
X
XBOOLEAN SplitIsDefinite(x)
XOBJECT x;
X{ OBJECT y1, y2;
X assert( type(x) == SPLIT, "SplitIsDefinite: x not a SPLIT!" );
X Child(y1, DownDim(x, COL));
X Child(y2, DownDim(x, ROW));
X return is_definite(type(y1)) && is_definite(type(y2));
X}
END_OF_FILE
if test 8502 -ne `wc -c <'lout/z07.c'`; then
echo shar: \"'lout/z07.c'\" unpacked with wrong size!
fi
# end of 'lout/z07.c'
fi
if test -f 'lout/z11.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/z11.c'\"
else
echo shar: Extracting \"'lout/z11.c'\" \(8495 characters\)
sed "s/^X//" >'lout/z11.c' <<'END_OF_FILE'
X/*@z11.c:Style Service:SpaceChange(), BreakChange(), EchoStyle()@*************/


X/* */
X/* LOUT: A HIGH-LEVEL LANGUAGE FOR DOCUMENT FORMATTING (VERSION 2.03) */
X/* COPYRIGHT (C) 1993 Jeffrey H. Kingston */
X/* */
X/* Jeffrey H. Kingston (je...@cs.su.oz.au) */
X/* Basser Department of Computer Science */
X/* The University of Sydney 2006 */
X/* AUSTRALIA */
X/* */
X/* This program is free software; you can redistribute it and/or modify */
X/* it under the terms of the GNU General Public License as published by */
X/* the Free Software Foundation; either version 1, or (at your option) */
X/* any later version. */
X/* */
X/* This program is distributed in the hope that it will be useful, */
X/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
X/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
X/* GNU General Public License for more details. */
X/* */
X/* You should have received a copy of the GNU General Public License */
X/* along with this program; if not, write to the Free Software */
X/* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
X/* */

X/* FILE: z11.c */
X/* MODULE: Style Service */
X/* EXTERNS: SpaceChange(), BreakChange(), EchoStyle() */


X/* */
X/*****************************************************************************/
X#include "externs"
X
X
X/*****************************************************************************/
X/* */

X/* SpaceChange(style, x) */
X/* */
X/* Change the current break style as indicated by object x. */
X/* */
X/*****************************************************************************/
X
XSpaceChange(style, x)
XSTYLE *style; OBJECT x;
X{ GAP res_gap; unsigned gap_inc;
X debug2(DSS, D, "SpaceChange(%s, %s)", EchoStyle(style), EchoObject(null, x));


X if( type(x) != WORD )

X { Error(WARN, &fpos(x), "invalid left parameter to %s", KW_SPACE);
X }
X else
X { GetGap(x, style, &res_gap, &gap_inc);
X if( gap_inc != ABS && units(res_gap) != units(space_gap(*style)) )
X { Error(WARN, &fpos(x), "space %s incompatible with enclosing", string(x));
X }
X else
X { units(space_gap(*style)) = units(res_gap);
X mode(space_gap(*style)) = mode(res_gap);
X width(space_gap(*style)) = gap_inc == ABS ? width(res_gap) :
X gap_inc == INC ? width(space_gap(*style)) + width(res_gap) :
X max(width(space_gap(*style)) - width(res_gap), 0);
X }
X }
X debug1(DSS, D, "SpaceChange returning %s", EchoStyle(style));
X} /* end SpaceChange */


X
X
X/*****************************************************************************/
X/* */

X/* BreakChange(style, x) */
X/* */
X/* Change the current break style as indicated by object x. */
X/* */
X/*****************************************************************************/
X
Xstatic changebreak(style, x)
XSTYLE *style; OBJECT x;
X{ int i; GAP res_gap; unsigned gap_inc;
X if( string(x)[0] >= 'a' && string(x)[0] <= 'z' )
X {
X /* should be a new break style option */
X if( strcmp(string(x), "hyphen") == 0 )
X hyph_style(*style) = HYPH_ON;
X else if( strcmp(string(x), "nohyphen") == 0 )
X hyph_style(*style) = HYPH_OFF;
X else if( strcmp(string(x), "adjust") == 0 )
X fill_style(*style) = FILL_ON, display_style(*style) = DISPLAY_ADJUST;
X else if( strcmp(string(x), "outdent") == 0 )
X fill_style(*style) = FILL_ON, display_style(*style) = DISPLAY_OUTDENT;
X else if( strcmp(string(x), "ragged") == 0 )
X fill_style(*style) = FILL_ON, display_style(*style) = DISPLAY_LEFT;
X else if( strcmp(string(x), "cragged") == 0 )
X fill_style(*style) = FILL_ON, display_style(*style) = DISPLAY_CENTRE;
X else if( strcmp(string(x), "ragged") == 0 )
X fill_style(*style) = FILL_ON, display_style(*style) = DISPLAY_RIGHT;
X else if( strcmp(string(x), "lines") == 0 )
X fill_style(*style) = FILL_OFF, display_style(*style) = DISPLAY_LEFT;
X else if( strcmp(string(x), "clines") == 0 )
X fill_style(*style) = FILL_OFF, display_style(*style) = DISPLAY_CENTRE;
X else if( strcmp(string(x), "rlines") == 0 )
X fill_style(*style) = FILL_OFF, display_style(*style) = DISPLAY_RIGHT;
X else Error(WARN, &fpos(x), "invalid %s option %s", KW_BREAK, string(x));
X }
X else
X {
X /* should be a new inter-line gap */
X GetGap(x, style, &res_gap, &gap_inc);
X if( gap_inc != ABS && units(res_gap) != units(line_gap(*style)) )
X { Error(WARN, &fpos(x),
X "line spacing %s incompatible with enclosing", string(x));
X }
X else
X { units(line_gap(*style)) = units(res_gap);
X mode(line_gap(*style)) = mode(res_gap);
X width(line_gap(*style)) = gap_inc == ABS ? width(res_gap) :
X gap_inc == INC ? width(line_gap(*style)) + width(res_gap) :
X max(width(line_gap(*style)) - width(res_gap), 0);
X }
X }
X} /* end changebreak */
X
XBreakChange(style, x)
XSTYLE *style; OBJECT x;
X{ OBJECT link, y;
X debug2(DSS, D, "BreakChange(%s, %s)", EchoStyle(style), EchoObject(null, x));
X switch( type(x) )


X {
X case WORD:
X

X changebreak(style, x);
X break;
X
X
X case ACAT:
X

X for( link = Down(x); link != x; link = NextDown(link) )
X { Child(y, link);

X if( type(y) == GAP_OBJ ) continue;
X else if( type(y) == WORD ) changebreak(style, y);
X else Error(WARN, &fpos(x), "invalid left parameter of %s", KW_BREAK);


X }
X break;
X
X

X default:
X
X Error(WARN, &fpos(x), "invalid left parameter of %s", KW_BREAK);
X break;
X
X }
X debug1(DSS, D, "BreakChange returning %s", EchoStyle(style));
X} /* end BreakChange */
X
X
X#if DEBUG_ON
X/*****************************************************************************/
X/* */
X/* unsigned char *EchoStyle(style) */
X/* */
X/* Returns a string showing the value of the style. */
X/* */
X/*****************************************************************************/
X
Xunsigned char *EchoStyle(style)
XSTYLE *style;
X{ char buff1[100], buff2[100], buff3[100], buff4[100];
X static char res[100];
X static char *hyphwords[] = { "hyph_undef", "hyph_off", "hyph_on" };
X static char *fillwords[] = { "fill_undef", "fill_off", "fill_on" };
X static char *displaywords[] = { "undef", "adjust", "outdent", "left",
X "centre", "right", "do" };
X strcpy(buff1, EchoCatOp(VCAT,mark(line_gap(*style)),join(line_gap(*style))));
X strcpy(buff2, EchoGap(&line_gap(*style)));
X strcpy(buff3, EchoGap(&space_gap(*style)));
X sprintf(buff4, "%s:%s:%s",
X hyph_style(*style) < 3 ? hyphwords[hyph_style(*style)] : "?",
X fill_style(*style) < 3 ? fillwords[fill_style(*style)] : "?",
X display_style(*style) < 7 ? displaywords[display_style(*style)] : "?");
X sprintf(res, "[%s%s, %d (%s), %s]", buff1, buff2, font(*style), buff3, buff4);
X return (unsigned char *) res;
X} /* end EchoStyle */
X#endif
END_OF_FILE
if test 8495 -ne `wc -c <'lout/z11.c'`; then
echo shar: \"'lout/z11.c'\" unpacked with wrong size!
fi
# end of 'lout/z11.c'
fi
if test -f 'lout/z28.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/z28.c'\"
else
echo shar: Extracting \"'lout/z28.c'\" \(8137 characters\)
sed "s/^X//" >'lout/z28.c' <<'END_OF_FILE'
X/*@z28.c:Error Service:ErrorInit(), Error(), ErrorSeen()@*********************/


X/* */
X/* LOUT: A HIGH-LEVEL LANGUAGE FOR DOCUMENT FORMATTING (VERSION 2.03) */
X/* COPYRIGHT (C) 1993 Jeffrey H. Kingston */
X/* */
X/* Jeffrey H. Kingston (je...@cs.su.oz.au) */
X/* Basser Department of Computer Science */
X/* The University of Sydney 2006 */
X/* AUSTRALIA */
X/* */
X/* This program is free software; you can redistribute it and/or modify */
X/* it under the terms of the GNU General Public License as published by */
X/* the Free Software Foundation; either version 1, or (at your option) */
X/* any later version. */
X/* */
X/* This program is distributed in the hope that it will be useful, */
X/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
X/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
X/* GNU General Public License for more details. */
X/* */
X/* You should have received a copy of the GNU General Public License */
X/* along with this program; if not, write to the Free Software */
X/* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
X/* */

X/* FILE: z28.c */
X/* MODULE: Error Service */
X/* EXTERNS: ErrorInit(), Error(), ErrorSeen() */


X/* */
X/*****************************************************************************/
X#include "externs"
X

X#define MAX_BLOCKS 20 /* max number of error blocks */
X#define MAX_ERRORS 20 /* max number of held error messages */
X
Xstatic BOOLEAN print_block[MAX_BLOCKS]; /* TRUE if print this block */
Xstatic int start_block[MAX_BLOCKS]; /* first message of block */
Xstatic unsigned char message[MAX_ERRORS][MAX_LINE]; /* the error messages */
Xstatic FILE *fp = NULL; /* file pointer of log file */
Xstatic BOOLEAN error_seen = FALSE; /* TRUE after first error */
Xstatic int block_top = 0; /* first free error block */
Xstatic int mess_top = 0; /* first free error message */


X
X
X/*****************************************************************************/
X/* */

X/* ErrorInit(str) */
X/* */
X/* Open log file str and initialise this module. */
X/* */
X/*****************************************************************************/
X
XErrorInit(str)
Xunsigned char *str;
X{ if( fp != NULL )
X Error(FATAL, no_fpos, "-e argument appears twice in command line");
X fp = fopen(str, "w");
X if( fp == NULL )
X Error(FATAL, no_fpos, "cannot open error file \"%s\"", str);
X} /* end ErrorInit */


X
X
X/*****************************************************************************/
X/* */

X/* BOOLEAN ErrorSeen() */
X/* */
X/* TRUE once an error has been found. */
X/* */
X/*****************************************************************************/
X
XBOOLEAN ErrorSeen()
X{ return error_seen;
X} /* end ErrorSeen */


X
X
X/*****************************************************************************/
X/* */

X/* EnterErrorBlock(ok_to_print) */
X/* */
X/* Start off a new block of error messages. If ok_to_print, they do not */
X/* need to be held for a later commit. */
X/* */
X/*****************************************************************************/
X
XEnterErrorBlock(ok_to_print)
XBOOLEAN ok_to_print;
X{ if( block_top < MAX_BLOCKS )
X { print_block[block_top] = ok_to_print;
X start_block[block_top] = mess_top;
X block_top++;
X }
X else Error(FATAL, no_fpos, "too many levels of error messages");
X} /* end EnterErrorBlock */


X
X
X/*@@**************************************************************************/
X/* */

X/* LeaveErrorBlock(commit) */
X/* */
X/* Finish off a block or error messages. If commit is true, print them, */
X/* otherwise discard them. */
X/* */
X/*****************************************************************************/
X
XLeaveErrorBlock(commit)
XBOOLEAN commit;
X{ int i;
X assert( block_top > 0, "LeaveErrorBlock: no matching EnterErrorBlock!" );
X assert( commit || !print_block[block_top - 1], "LeaveErrorBlock: commit!" );
X if( fp == NULL ) fp = stderr;
X if( commit )
X { for( i = start_block[block_top - 1]; i < mess_top; i++ )
X fputs(message[i], fp);
X }
X block_top--;
X mess_top = start_block[block_top];
X} /* end LeaveErrorBlock */


X
X
X/*****************************************************************************/
X/* */

X/* Error(etype, pos, str, p1, p2, p3, p4, p5, p6) */
X/* */
X/* Report error of type etype at position *pos in input. */
X/* The error message is str with parameters p1 - p6. */
X/* */
X/*****************************************************************************/
X
X/*VARARGS3*/
XError(etype, pos, str, p1, p2, p3, p4, p5, p6)
Xint etype; FILE_POS *pos; unsigned char *str, *p1, *p2, *p3, *p4, *p5, *p6;
X{ unsigned char val[MAX_LINE];
X sprintf(val, str, p1, p2, p3, p4, p5, p6);
X if( fp == NULL ) fp = stderr;
X switch( etype )
X {
X
X case INTERN:
X
X while( block_top > 0 ) LeaveErrorBlock(TRUE);
X fprintf(fp, "lout%s internal error: %s\n", EchoFilePos(pos), val);
X#ifdef DEBUG_ON
X abort();
X#else
X exit(1);
X#endif
X break;
X
X
X case FATAL:
X
X while( block_top > 0 ) LeaveErrorBlock(TRUE);
X fprintf(fp, "lout%s fatal error: %s\n", EchoFilePos(pos), val);
X exit(1);
X break;
X
X
X case WARN:
X
X if( block_top == 0 || print_block[block_top - 1] )
X fprintf(fp, "lout%s: %s\n", EchoFilePos(pos), val);
X else if( mess_top < MAX_ERRORS )
X sprintf(message[mess_top++], "lout%s: %s\n", EchoFilePos(pos), val);
X else Error(FATAL, pos, "too many error messages");
X error_seen = TRUE;


X break;
X
X
X default:
X

X Error(INTERN, no_fpos, "invalid error type");
X exit(1);
X break;
X
X }
X} /* end Error */
END_OF_FILE
if test 8137 -ne `wc -c <'lout/z28.c'`; then
echo shar: \"'lout/z28.c'\" unpacked with wrong size!
fi
# end of 'lout/z28.c'
fi
if test -f 'lout/z35.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/z35.c'\"
else
echo shar: Extracting \"'lout/z35.c'\" \(7660 characters\)
sed "s/^X//" >'lout/z35.c' <<'END_OF_FILE'
X/*@z35.c:Time Keeper: InitTime()@*********************************************/


X/* */
X/* LOUT: A HIGH-LEVEL LANGUAGE FOR DOCUMENT FORMATTING (VERSION 2.03) */
X/* COPYRIGHT (C) 1993 Jeffrey H. Kingston */
X/* */
X/* Jeffrey H. Kingston (je...@cs.su.oz.au) */
X/* Basser Department of Computer Science */
X/* The University of Sydney 2006 */
X/* AUSTRALIA */
X/* */
X/* This program is free software; you can redistribute it and/or modify */
X/* it under the terms of the GNU General Public License as published by */
X/* the Free Software Foundation; either version 1, or (at your option) */
X/* any later version. */
X/* */
X/* This program is distributed in the hope that it will be useful, */
X/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
X/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
X/* GNU General Public License for more details. */
X/* */
X/* You should have received a copy of the GNU General Public License */
X/* along with this program; if not, write to the Free Software */
X/* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
X/* */

X/* FILE: z35.c */
X/* MODULE: Time Keeper */
X/* EXTERNS: InitTime() */
X/* */
X/*****************************************************************************/
X#include <time.h>
X#include "externs"
X
X#define load(str, typ, encl) \
X sym = InsertSym(str, typ, no_fpos, DEFAULT_PREC, \
X FALSE, FALSE, 0, encl, MakeWord("", no_fpos)); \
X if( typ == NPAR ) visible(sym) = TRUE
X
X#define add_par(format, val, sym) \
X sprintf(buff, format, val); \
X par = New(PAR); actual(par) = sym; \
X Link(current_moment, par); \
X tmp = MakeWord(buff, no_fpos); \
X Link(par, tmp);
X
Xstatic OBJECT current_moment = nil;
Xstatic unsigned char time_string[30] = { '\0' };


X
X
X/*****************************************************************************/
X/* */

X/* OBJECT MomentSym; */
X/* */
X/* The symbol table entry for the @Moment symbol. */
X/* */
X/*****************************************************************************/
X
XOBJECT MomentSym = nil;


X
X
X/*@@**************************************************************************/
X/* */

X/* InitTime() */
X/* */
X/* Place a declaration of the @Moment symbol into the symbol table, and */
X/* initialize the value of the object StartMoment. */
X/* */
X/*****************************************************************************/
X
XInitTime()
X{ long raw_time; struct tm *now;
X unsigned char buff[20]; OBJECT par, tmp, sym, env;
X OBJECT tag, second, minute, hour, weekday,
X monthday, yearday, month, year, century, dst;
X debug0(DTK, D, "InitTime()");
X
X /* define @Moment symbol with its host of named parameters */
X MomentSym = load("@Moment", LOCAL, StartSym);
X tag = load(KW_TAG, NPAR, MomentSym);
X second = load("@Second", NPAR, MomentSym);
X minute = load("@Minute", NPAR, MomentSym);
X hour = load("@Hour", NPAR, MomentSym);
X monthday = load("@Day", NPAR, MomentSym);
X month = load("@Month", NPAR, MomentSym);
X year = load("@Year", NPAR, MomentSym);
X century = load("@Century", NPAR, MomentSym);
X weekday = load("@WeekDay", NPAR, MomentSym);
X yearday = load("@YearDay", NPAR, MomentSym);
X dst = load("@DaylightSaving", NPAR, MomentSym);
X
X /* get current time and convert to ASCII */
X time(&raw_time);
X now = localtime(&raw_time);
X strcpy(time_string, asctime(now));
X
X /* start of current_moment */
X current_moment = New(CLOSURE);
X actual(current_moment) = MomentSym;
X
X /* attach its many parameters */
X add_par("%s", KW_NOW, tag);
X add_par("%d", now->tm_sec, second);
X add_par("%d", now->tm_min, minute);
X add_par("%d", now->tm_hour, hour);
X add_par("%d", now->tm_mday, monthday);
X add_par("%d", now->tm_mon + 1, month);
X add_par("%.2d", now->tm_year % 100, year);
X add_par("%d", (now->tm_year+1900) / 100, century);
X add_par("%d", now->tm_wday + 1, weekday);
X add_par("%d", now->tm_yday, yearday);
X add_par("%d", now->tm_isdst, dst);
X
X /* add a null environment */
X env = New(ENV);
X AttachEnv(env, current_moment);
X debug0(DTK, D, "InitTime() returning.");
X debug0(DTK, DD, "current_moment =");
X ifdebug(DTK, DD, EchoObject(stderr, current_moment));
X} /* end InitTime */


X
X
X/*****************************************************************************/
X/* */

X/* OBJECT StartMoment() */
X/* */
X/* Returns a copy of the initial time. */
X/* */
X/*****************************************************************************/
X
XOBJECT StartMoment()
X{ OBJECT res;
X debug0(DTK, D, "StartMoment()");
X assert(current_moment != nil, "StartMoment: current_moment == nil!");
X res = CopyObject(current_moment, no_fpos);
X debug0(DTK, D, "StartMoment returning");
X ifdebug(DTK, D, EchoObject(stderr, res));
X return res;
X}


X
X
X/*****************************************************************************/
X/* */

X/* unsigned char *TimeString() */
X/* */
X/* Returns a pointer to a string containing the current time. */
X/* */
X/*****************************************************************************/
X
Xunsigned char *TimeString()
X{ return time_string;
X} /* end TimeString */
END_OF_FILE
if test 7660 -ne `wc -c <'lout/z35.c'`; then
echo shar: \"'lout/z35.c'\" unpacked with wrong size!
fi
# end of 'lout/z35.c'
fi
echo shar: End of archive 25 \(of 30\).
cp /dev/null ark25isdone

Jeff Kingston

unread,
Jun 1, 1993, 11:05:40 PM6/1/93
to
Submitted-by: je...@joyce.cs.su.oz.au (Jeff Kingston)
Posting-number: Volume 37, Issue 124
Archive-name: lout/part26
Environment: UNIX

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: lout/data/loutrefs.ld lout/data/standard.ld
# lout/doc/tr.begin/s02 lout/doc/tr.begin/s03 lout/doc/tr.eq/s6
# lout/doc/tr.fig/s3 lout/doc/tr.impl/oldrefs.ld
# lout/doc/tr.impl/s3.3 lout/doc/tr.impl/s5.1
# lout/doc/tr.lout/ch2.01 lout/doc/tr.lout/ch2.05
# lout/doc/tr.lout/ch3.07 lout/z32.c lout/z34.c
# Wrapped by kent@sparky on Sun May 30 19:44:01 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 26 (of 30)."'
if test -f 'lout/data/loutrefs.ld' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/data/loutrefs.ld'\"
else
echo shar: Extracting \"'lout/data/loutrefs.ld'\" \(5677 characters\)
sed "s/^X//" >'lout/data/loutrefs.ld' <<'END_OF_FILE'
X{ @Reference
X @Tag { knuth84 }
X @Type { Book }
X @Author { Knuth, Donald E. }
X @Title { The T{ /0.2fo E}XBook }
X @Publisher { Addison-Wesley }
X @Year { 1984 }
X}
X
X{ @Reference
X @Tag { adobe90 }
X @Type { Book }
X @Author { Adobe Systems, Inc. }
X @Title { PostScript Language Reference Manual, Second Edition }
X @Publisher { Addison-Wesley }
X @Year { 1990 }
X}
X
X{ @Reference
X @Tag { reid80 }
X @Type { ConferencePaper }
X @Author { Reid, Brian K. }
X @Title { A High-Level Approach to Computer Document Production }
X @Proceedings { Proceedings of the 7th Symposium on the Principles
Xof Programming Languages (POPL), Las Vegas NV }
X @Pages { 24--31 }
X @Year { 1980 }
X}
X


X{ @Reference
X @Tag { strunk79 }
X @Type { Book }
X @Author { Strunk, William and White, E. B. }
X @Title { The Elements of Style }

X @Publisher { Macmillan, third edition }
X @Year { 1979 }
X}
X
X{ @Reference
X @Tag { ossanna76 }
X @Type { TechReport }
X @Author { Joseph F. Ossanna }
X @Title { "Nroff/Troff" User's Manual }
X @Number { 54 }
X @Institution { Bell Laboratories, Murray Hill, NJ 07974 }
X @Year { 1976 }
X}
X
X{ @Reference
X @Tag { kernighan75 }
X @Type { JournalArticle }
X @Author { Kernighan, Brian W. and Cherry, Lorinda L. }
X @Title { A system for typesetting mathematics }
X @Journal { Communications of the ACM }
X @Volume { 18 }
X @Pages { 182--193 }
X @Year { 1975 }
X}
X
X{ @Reference
X @Tag { lesk76 }
X @Type { TechReport }
X @Author { Lesk, M. E. }
X @Title { Tbl -- a program to format tables }
X @Number { 49 }
X @Institution { Bell Laboratories, Murray Hill, NJ 07974 }
X @Year { 1976 }
X}
X
X{ @Reference
X @Tag { kernighan82 }
X @Type { JournalArticle }
X @Author { Kernighan, Brian W. }
X @Title { PIC -- A language for typesetting graphics}
X @Journal { Software Practice and Experience }
X @Volume { 12 }
X @Pages { 1--21 }
X @Year { 1982 }
X}
X
X{ @Reference
X @Tag { kingston93basser }
X @Type { Software }


X @Author { Kingston, Jeffrey H. }

X @Title { The Basser Lout Document Formatter, Version 2.03 }
X @Year { 1993 }
X @Comment { Computer program, publicly available in the
X@I jeff subdirectory of the home directory of @I ftp to host
X@I ftp.cs.su.oz.au with login name @I anonymous or @I ftp and any
Xnon-empty password (e.g. {@I none}). Distribution via email is
Xavailable for non-{@I ftp} sites. All enquiries to "je...@cs.su.oz.au". }
X}
X


X{ @Reference
X @Tag { kingston92 }
X @Type { TechReport }
X @Author { Kingston, Jeffrey H. }
X @Title { Document Formatting with Lout (Second Edition) }
X @Number { 449 }
X @Institution { Basser Department of Computer

XScience F09, University of Sydney 2006, Australia }


X @Year { 1992 }
X}
X

X{ @Reference
X @Tag { kingston92begin }


X @Type { TechReport }
X @Author { Kingston, Jeffrey H. }

X @Title { A beginners' guide to Lout }
X @Number { 450 }


X @Institution { Basser Department of Computer

XScience F09, University of Sydney 2006, Australia }


X @Year { 1992 }
X}
X

X{ @Reference
X @Tag { kingston92eq }


X @Type { TechReport }
X @Author { Kingston, Jeffrey H. }

X @Title { Eq -- a Lout package for typesetting mathematics }
X @Number { 452 }


X @Institution { Basser Department of Computer

XScience F09, University of Sydney 2006, Australia }
X @Year { 1992 }
X @Comment { Contains an appendix describing the Pas Pascal
Xformatter. }
X}
X
X{ @Reference
X @Tag { kingston92fig }


X @Type { TechReport }
X @Author { Kingston, Jeffrey H. }

X @Title { Fig -- a Lout package for drawing figures }
X @Number { 453 }


X @Institution { Basser Department of Computer

XScience F09, University of Sydney 2006, Australia }


X @Year { 1992 }
X}
X

X{ @Reference
X @Tag { kingston91over }


X @Type { TechReport }
X @Author { Kingston, Jeffrey H. }

X @Title { A new approach to document formatting }
X @Number { 412 }


X @Institution { Basser Department of Computer

XScience F09, University of Sydney 2006, Australia }
X @Year { 1991 }
X}
X
X{ @Reference
X @Tag { kingston92tab }


X @Type { TechReport }
X @Author { Kingston, Jeffrey H. }

X @Title { Tab -- a Lout package for formatting tables }
X @Number { 451 }


X @Institution { Basser Department of Computer

XScience F09, University of Sydney 2006, Australia }


X @Year { 1992 }
X}
X

X{ @Reference
X @Tag { kingston92design }


X @Type { TechReport }
X @Author { Kingston, Jeffrey H. }

X @Title { The design and implementation of the Lout document formatting language }
X @Number { 442 }


X @Institution { Basser Department of Computer

XScience F09, University of Sydney 2006, Australia }
X @Year { 1992 }
X @Comment { To appear in @I { Software---Practice and Experience. } }
X}
X
X{ @Reference
X @Tag { wirth71 }
X @Type { JournalArticle }
X @Author { Wirth, N. }
X @Title { The programming language Pascal }
X @Journal { Acta Informatica }
X @Volume { 1 }
X @Year { 1975 }
X @Pages { 35--63 }
X}
X
X{ @Reference
X @Tag { brooks91 }
X @Type { JournalArticle }
X @Author { Brooks, Kenneth P. }
X @Title { Lilac: a two-view document editor }
X @Journal { IEEE Computer }
X @Volume { @Null }
X @Pages { 7--19 }
X @Year { 1991 }
X}
X
X{ @Reference
X @Tag { furuta82 }
X @Type { JournalArticle }
X @Author { Furuta, Richard, Scofield, Jeffrey,
Xand Shaw, Alan }
X @Title { Document formatting systems: survey,
Xconcepts, and issues }
X @Journal { Computing Surveys }
X @Volume { 14 }
X @Pages { 417--472 }
X @Year { 1982 }
X}
END_OF_FILE
if test 5677 -ne `wc -c <'lout/data/loutrefs.ld'`; then
echo shar: \"'lout/data/loutrefs.ld'\" unpacked with wrong size!
fi
# end of 'lout/data/loutrefs.ld'
fi
if test -f 'lout/data/standard.ld' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/data/standard.ld'\"
else
echo shar: Extracting \"'lout/data/standard.ld'\" \(7113 characters\)
sed "s/^X//" >'lout/data/standard.ld' <<'END_OF_FILE'
X
X######################################################
X# #
X# standard.ld Jeffrey H. Kingston #
X# February 1991 #
X# #
X# Database of commonly used symbols: #
X# #
X# @Roman lower case Roman numerals #
X# @UCRoman upper case Roman numerals #
X# @Alpha lower case Roman alphabet #
X# @UCAlpha upper case Roman alphabet #
X# @Months months of the year #
X# @ShortMonths months of the year, abbreviated #
X# @WeekDays days of the week #
X# @ShortWeekDays days of the week, abbreviated #
X# #
X######################################################
X


X{ 1 @Roman i }
X{ 2 @Roman ii }

X{ 3 @Roman iii }
X{ 4 @Roman iv }
X{ 5 @Roman v }
X{ 6 @Roman vi }
X{ 7 @Roman vii }
X{ 8 @Roman viii }
X{ 9 @Roman ix }
X{ 10 @Roman x }
X{ 11 @Roman xi }
X{ 12 @Roman xii }
X{ 13 @Roman xiii }
X{ 14 @Roman xiv }
X{ 15 @Roman xv }
X{ 16 @Roman xvi }
X{ 17 @Roman xvii }
X{ 18 @Roman xviii }
X{ 19 @Roman xix }
X{ 20 @Roman xx }
X{ 21 @Roman xxi }
X{ 22 @Roman xxii }
X{ 23 @Roman xxiii }
X{ 24 @Roman xxiv }
X{ 25 @Roman xxv }
X{ 26 @Roman xxvi }
X{ 27 @Roman xxvii }
X{ 28 @Roman xxviii }
X{ 29 @Roman xxix }
X{ 30 @Roman xxx }
X{ 31 @Roman xxxi }
X{ 32 @Roman xxxii }
X{ 33 @Roman xxxiii }
X{ 34 @Roman xxxiv }
X{ 35 @Roman xxxv }
X{ 36 @Roman xxxvi }
X{ 37 @Roman xxxvii }
X{ 38 @Roman xxxviii }
X{ 39 @Roman xxxix }
X{ 40 @Roman xl }
X{ 41 @Roman xli }
X{ 42 @Roman xlii }
X{ 43 @Roman xliii }
X{ 44 @Roman xliv }
X{ 45 @Roman xlv }
X{ 46 @Roman xlvi }
X{ 47 @Roman xlvii }
X{ 48 @Roman xlviii }
X{ 49 @Roman xlix }
X{ 50 @Roman l }
X{ 51 @Roman li }
X{ 52 @Roman lii }
X{ 53 @Roman liii }
X{ 54 @Roman liv }
X{ 55 @Roman lv }
X{ 56 @Roman lvi }
X{ 57 @Roman lvii }
X{ 58 @Roman lviii }
X{ 59 @Roman lix }
X{ 60 @Roman lx }
X{ 61 @Roman lxi }
X{ 62 @Roman lxii }
X{ 63 @Roman lxiii }
X{ 64 @Roman lxiv }
X{ 65 @Roman lxv }
X{ 66 @Roman lxvi }
X{ 67 @Roman lxvii }
X{ 68 @Roman lxviii }
X{ 69 @Roman lxix }
X{ 70 @Roman lxx }
X{ 71 @Roman lxxi }
X{ 72 @Roman lxxii }
X{ 73 @Roman lxxiii }
X{ 74 @Roman lxxiv }
X{ 75 @Roman lxxv }
X{ 76 @Roman lxxvi }
X{ 77 @Roman lxxvii }
X{ 78 @Roman lxxviii }
X{ 79 @Roman lxxix }
X{ 80 @Roman lxxx }
X{ 81 @Roman lxxxi }
X{ 82 @Roman lxxxii }
X{ 83 @Roman lxxxiii }
X{ 84 @Roman lxxxiv }
X{ 85 @Roman lxxxv }
X{ 86 @Roman lxxxvi }
X{ 87 @Roman lxxxvii }
X{ 88 @Roman lxxxviii }
X{ 89 @Roman lxxxix }
X{ 90 @Roman xc }
X{ 91 @Roman xci }
X{ 92 @Roman xcii }
X{ 93 @Roman xciii }
X{ 94 @Roman xciv }
X{ 95 @Roman xcv }
X{ 96 @Roman xcvi }
X{ 97 @Roman xcvii }
X{ 98 @Roman xcviii }
X{ 99 @Roman xcix }


X{ 100 @Roman c }
X

X{ 1 @UCRoman I }
X{ 2 @UCRoman II }
X{ 3 @UCRoman III }
X{ 4 @UCRoman IV }
X{ 5 @UCRoman V }
X{ 6 @UCRoman VI }
X{ 7 @UCRoman VII }
X{ 8 @UCRoman VIII }
X{ 9 @UCRoman IX }
X{ 10 @UCRoman X }
X{ 11 @UCRoman XI }
X{ 12 @UCRoman XII }
X{ 13 @UCRoman XIII }
X{ 14 @UCRoman XIV }
X{ 15 @UCRoman XV }
X{ 16 @UCRoman XVI }
X{ 17 @UCRoman XVII }
X{ 18 @UCRoman XVIII }
X{ 19 @UCRoman XIX }
X{ 20 @UCRoman XX }
X{ 21 @UCRoman XXI }
X{ 22 @UCRoman XXII }
X{ 23 @UCRoman XXIII }
X{ 24 @UCRoman XXIV }
X{ 25 @UCRoman XXV }
X{ 26 @UCRoman XXVI }
X{ 27 @UCRoman XXVII }
X{ 28 @UCRoman XXVIII }
X{ 29 @UCRoman XXIX }
X{ 30 @UCRoman XXX }
X{ 31 @UCRoman XXXI }
X{ 32 @UCRoman XXXII }
X{ 33 @UCRoman XXXIII }
X{ 34 @UCRoman XXXIV }
X{ 35 @UCRoman XXXV }
X{ 36 @UCRoman XXXVI }
X{ 37 @UCRoman XXXVII }
X{ 38 @UCRoman XXXVIII }
X{ 39 @UCRoman XXXIX }
X{ 40 @UCRoman XL }
X{ 41 @UCRoman XLI }
X{ 42 @UCRoman XLII }
X{ 43 @UCRoman XLIII }
X{ 44 @UCRoman XLIV }
X{ 45 @UCRoman XLV }
X{ 46 @UCRoman XLVI }
X{ 47 @UCRoman XLVII }
X{ 48 @UCRoman XLVIII }
X{ 49 @UCRoman XLIX }
X{ 50 @UCRoman L }
X{ 51 @UCRoman LI }
X{ 52 @UCRoman LII }
X{ 53 @UCRoman LIII }
X{ 54 @UCRoman LIV }
X{ 55 @UCRoman LV }
X{ 56 @UCRoman LVI }
X{ 57 @UCRoman LVII }
X{ 58 @UCRoman LVIII }
X{ 59 @UCRoman LIX }
X{ 60 @UCRoman LX }
X{ 61 @UCRoman LXI }
X{ 62 @UCRoman LXII }
X{ 63 @UCRoman LXIII }
X{ 64 @UCRoman LXIV }
X{ 65 @UCRoman LXV }
X{ 66 @UCRoman LXVI }
X{ 67 @UCRoman LXVII }
X{ 68 @UCRoman LXVIII }
X{ 69 @UCRoman LXIX }
X{ 70 @UCRoman LXX }
X{ 71 @UCRoman LXXI }
X{ 72 @UCRoman LXXII }
X{ 73 @UCRoman LXXIII }
X{ 74 @UCRoman LXXIV }
X{ 75 @UCRoman LXXV }
X{ 76 @UCRoman LXXVI }
X{ 77 @UCRoman LXXVII }
X{ 78 @UCRoman LXXVIII }
X{ 79 @UCRoman LXXIX }
X{ 80 @UCRoman LXXX }
X{ 81 @UCRoman LXXXI }
X{ 82 @UCRoman LXXXII }
X{ 83 @UCRoman LXXXIII }
X{ 84 @UCRoman LXXXIV }
X{ 85 @UCRoman LXXXV }
X{ 86 @UCRoman LXXXVI }
X{ 87 @UCRoman LXXXVII }
X{ 88 @UCRoman LXXXVIII }
X{ 89 @UCRoman LXXXIX }
X{ 90 @UCRoman XC }
X{ 91 @UCRoman XCI }
X{ 92 @UCRoman XCII }
X{ 93 @UCRoman XCIII }
X{ 94 @UCRoman XCIV }
X{ 95 @UCRoman XCV }
X{ 96 @UCRoman XCVI }
X{ 97 @UCRoman XCVII }
X{ 98 @UCRoman XCVIII }
X{ 99 @UCRoman XCIX }
X{ 100 @UCRoman C }
X
X{ 1 @Alpha a }
X{ 2 @Alpha b }
X{ 3 @Alpha c }
X{ 4 @Alpha d }
X{ 5 @Alpha e }
X{ 6 @Alpha f }
X{ 7 @Alpha g }
X{ 8 @Alpha h }
X{ 9 @Alpha i }
X{ 10 @Alpha j }
X{ 11 @Alpha k }
X{ 12 @Alpha l }
X{ 13 @Alpha m }
X{ 14 @Alpha n }
X{ 15 @Alpha o }
X{ 16 @Alpha p }
X{ 17 @Alpha q }
X{ 18 @Alpha r }
X{ 19 @Alpha s }
X{ 20 @Alpha t }
X{ 21 @Alpha u }
X{ 22 @Alpha v }
X{ 23 @Alpha w }
X{ 24 @Alpha x }
X{ 25 @Alpha y }
X{ 26 @Alpha z }
X
X{ 1 @UCAlpha A }
X{ 2 @UCAlpha B }
X{ 3 @UCAlpha C }
X{ 4 @UCAlpha D }
X{ 5 @UCAlpha E }
X{ 6 @UCAlpha F }
X{ 7 @UCAlpha G }
X{ 8 @UCAlpha H }
X{ 9 @UCAlpha I }
X{ 10 @UCAlpha J }
X{ 11 @UCAlpha K }
X{ 12 @UCAlpha L }
X{ 13 @UCAlpha M }
X{ 14 @UCAlpha N }
X{ 15 @UCAlpha O }
X{ 16 @UCAlpha P }
X{ 17 @UCAlpha Q }
X{ 18 @UCAlpha R }
X{ 19 @UCAlpha S }
X{ 20 @UCAlpha T }
X{ 21 @UCAlpha U }
X{ 22 @UCAlpha V }
X{ 23 @UCAlpha W }
X{ 24 @UCAlpha X }
X{ 25 @UCAlpha Y }
X{ 26 @UCAlpha Z }
X
X{ 1 @Months January }
X{ 2 @Months February }
X{ 3 @Months March }
X{ 4 @Months April }
X{ 5 @Months May }
X{ 6 @Months June }
X{ 7 @Months July }
X{ 8 @Months August }
X{ 9 @Months September }
X{ 10 @Months October }
X{ 11 @Months November }
X{ 12 @Months December }
X
X{ 1 @ShortMonths Jan }
X{ 2 @ShortMonths Feb }
X{ 3 @ShortMonths Mar }
X{ 4 @ShortMonths Apr }
X{ 5 @ShortMonths May }
X{ 6 @ShortMonths Jun }
X{ 7 @ShortMonths Jul }
X{ 8 @ShortMonths Aug }
X{ 9 @ShortMonths Sep }
X{ 10 @ShortMonths Oct }
X{ 11 @ShortMonths Nov }
X{ 12 @ShortMonths Dec }
X
X{ 1 @WeekDays Sunday }
X{ 2 @WeekDays Monday }
X{ 3 @WeekDays Tuesday }
X{ 4 @WeekDays Wednesday }
X{ 5 @WeekDays Thursday }
X{ 6 @WeekDays Friday }
X{ 7 @WeekDays Saturday }
X
X{ 1 @ShortWeekDays Sun }
X{ 2 @ShortWeekDays Mon }
X{ 3 @ShortWeekDays Tue }
X{ 4 @ShortWeekDays Wed }
X{ 5 @ShortWeekDays Thu }
X{ 6 @ShortWeekDays Fri }
X{ 7 @ShortWeekDays Sat }
END_OF_FILE
if test 7113 -ne `wc -c <'lout/data/standard.ld'`; then
echo shar: \"'lout/data/standard.ld'\" unpacked with wrong size!
fi
# end of 'lout/data/standard.ld'
fi
if test -f 'lout/doc/tr.begin/s02' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.begin/s02'\"
else
echo shar: Extracting \"'lout/doc/tr.begin/s02'\" \(5199 characters\)
sed "s/^X//" >'lout/doc/tr.begin/s02' <<'END_OF_FILE'
X@Section
X @Tag { displays }
X @Title { Displays }
X@Begin
X@PP
XThe @Code "@Display" symbol displays the following thing in the centre
Xof the page or column:
X@ID @Code "@Display @I Centred"
Xhas result
X@Display @I Centred
XNotice that @Code "@I Centred" does not have to be grouped within braces;
Xit is already a single thing. Spaces (@Code "@DP" symbols) are inserted
Xautomatically above and below the display, so no paragraph symbols are
Xneeded anywhere near the display.
X@PP
XThe display can be made to appear at the left margin by using the
X{@Code "@LeftDisplay"} symbol instead of {@Code "@Display"}, or indented
Xby using {@Code "@IndentedDisplay"}. There are also @Code "@CentredDisplay"
Xand @Code "@CenteredDisplay" symbols which are the same as
X{@Code "@Display"}. In general, the word @Code Centred may be spelt
X@Code Centered wherever it appears.
X@PP
XEach display symbol has a `raw' version, which means that no space is
Xinserted above or below; the user must therefore add paragraph symbols:
X@ID @Code {
X"... preceding text."
X"@DP"
X"@RawIndentedDisplay @I Emma"
X"@DP"
X"@RawIndentedDisplay @I"
X"{ Mansfield Park }"
X"@DP"
X"following text ..."
X}
Xhas result
X@ID {
X... preceding text.
X@DP
X@RawIndentedDisplay @I Emma
X@DP
X@RawIndentedDisplay @I { Mansfield Park }
X@DP
Xfollowing text ...
X}
XThe point of this particular example is that two consecutive non-raw
Xdisplays would be separated by two @Code "@DP" symbols, which is too
Xmuch. A better way to do this, using a list, will be presented in the
Xnext section.
X@PP
XDisplays may be {@I aligned}, which means that nominated points within a
Xsequence of displays are made to appear directly beneath each
Xother. Displays may also be {@I numbered}, which means that an
Xautomatically generated number is placed at the right-hand margin. For
Xexample, here is a first display:
X@BeginNumberedDisplays
X@BeginAlignedDisplays
X@CentredAlignedNumberedDisplay
X @Tag { fibeq }
X@Eq { F sub n ^= F sub n-1 + F sub n-2 }
Xand here is a second display, which is aligned on its @Eq {equal} sign
Xwith the first, and also numbered in sequence with it:
X@CentredAlignedNumberedDisplay
X@Eq { F sub n - F sub n-1 ^= F sub n-2 }
X@EndNumberedDisplays
X@EndAlignedDisplays
XMathematical examples have been chosen because they are the most common
Xaligned and numbered displays; but any kind of display may be aligned or
Xnumbered.
X@PP
XNotice that the two displays are centred as a block as well as
Xaligned. Altogether then we have four ways in which displays vary:
X@BL
X@LI { A display can be raw or not raw; }
X@LI { It can be a {@Code "@Display"}, {@Code "@LeftDisplay"},
X{@Code "@IndentedDisplay"}, {@Code "@CentredDisplay"} or
X{@Code "@CenteredDisplay"}; }
X@LI { It can be aligned or not aligned; }
X@LI { It can be numbered or not numbered. }
X@EL
XAll possible combinations are allowed. The display that has everything
Xis called
X@ID @Code { "@RawCentredAlignedNumberedDisplay" &0io }
XBy leaving out some or all of {@Code Raw}, {@Code Aligned}, and
X{@Code Numbered}, and by changing or leaving out {@Code Centred},
Xwe get all these combinations.
X@PP
XWhen aligned displays are used, it is necessary to indicate where the
Xaligned group begins and ends, by inserting @Code "@BeginAlignedDisplays"
Xjust before the first, and @Code "@EndAlignedDisplays" just after the
Xlast. The alignment points are indicated by preceding them by the
Xsymbol {@Code "^"}. Numbered displays are similarly bracketed by
X@Code "@BeginNumberedDisplays" and {@Code "@EndNumberedDisplays"}. So
Xthen, with the help of the @Code "@Eq" equation formatting package
X[{@Ref kingston92eq}], here is the input for the two displays given
Xearlier:
X@ID @Code {
X"... a first display:"
X"@BeginNumberedDisplays"
X"@BeginAlignedDisplays"
X"@CentredAlignedNumberedDisplay"
X" @Tag { fibeq }"
X@OneCol { "@Eq { F sub n ^= F sub n-1 + F sub n-2 }" &0io }
X"and ... in sequence with it:"
X"@CentredAlignedNumberedDisplay"
X@OneCol { "@Eq { F sub n - F sub n-1 ^= F sub n-2 }" &0io }
X"@EndNumberedDisplays"
X"@EndAlignedDisplays"
X"Mathematical examples ..."
X}
XNo braces need enclose @Code "@Eq { ... }" because it is already a
Xsingle entity. The @Code "@Tag { fibeq }" part is optional and is
Xexplained in Section {@NumberOf cross}. Alignment and numbering work
Xquite independently; they don't have to start or end together, and there
Xcan be non-aligned and non-numbered displays among the others.
X@PP
X@Code "@BeginNumberedDisplays" has two {@I options}: subsidiary
Xsymbols which modify the result. For example,
X@ID @Code {
X"@BeginNumberedDisplays"
X" style { [tag] }"
X" start { 12.5 }"
X}
Xwill cause the associated numbered displays to be labelled [12.5],
X[12.6], and so on. The first label is the @Code style option with
X@Code tag replaced by the @Code start option. Font changes and other
Xsymbols are acceptable within the @Code style option. When omitted, the
Xoptions have default values @Code "(tag)" and @Code "1" respectively.
X@PP
XEvery symbol introduced in this section has an abbreviated form
Xconsisting of @Code "@" followed by its capital letters only. For
Xexample, @Code "@BeginNumberedDisplays" can be abbreviated to {@Code "@BND"},
Xand the display that has everything to {@Code "@RCAND"}.
X@End @Section
END_OF_FILE
if test 5199 -ne `wc -c <'lout/doc/tr.begin/s02'`; then
echo shar: \"'lout/doc/tr.begin/s02'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.begin/s02'
fi
if test -f 'lout/doc/tr.begin/s03' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.begin/s03'\"
else
echo shar: Extracting \"'lout/doc/tr.begin/s03'\" \(5254 characters\)
sed "s/^X//" >'lout/doc/tr.begin/s03' <<'END_OF_FILE'
X@Section
X @Tag { lists }
X @Title { Lists }
X@Begin
X@PP
XIn the previous section, we saw that several consecutive displays are
Xawkward to space correctly. Provided they are not aligned or numbered,
Xsuch displays are better treated as a {@I list}:
X@ID @Code {
X"... preceding text."
X"@IndentedList"
X"@ListItem @I Emma"
X"@ListItem @I { Mansfield Park }"
X"@EndList"
X"following text ..."
X}
XThere are {@Code "@LeftList"}, {@Code "@IndentedList"}, and
X@Code "@CentredList" (or {@Code "@CenteredList"}) symbols; each item is
Xintroduced by {@Code "@ListItem"}, and the list ends with
X{@Code "@EndList"}. There may be any number of items; @Code "@DP"
Xsymbols are inserted before, between, and after them.
X@PP
XA variety of automatically generated tags is available for indented
Xlists. Here is the full set, showing the first tag produced:
X@ID {
X @Code "@NumberedList" |1c 1.
X/1vx @Code "@ParenNumberedList" | (1)
X/1vx @Code "@RomanList" | i.
X/1vx @Code "@ParenRomanList" | (i)
X/1vx @Code "@UCRomanList" | I.
X/1vx @Code "@ParenUCRomanList" | (I)
X/1vx @Code "@AlphaList" | a.
X/1vx @Code "@ParenAlphaList" | (a)
X/1vx @Code "@UCAlphaList" | A.
X/1vx @Code "@ParenUCAlphaList" | (A)
X/1vx @Code "@BulletList" | @Bullet
X/1vx @Code "@StarList" | @Star
X/1vx @Code "@DashList" | --
X}
XThe Roman numerals end at c (100), and the alphabet ends
Xat z (26), but ordinary numbers have no limit. For example,
X@ID @Code {
X"@Heading { Quiz }"
X"@NumberedList"
X"@ListItem { Which American"
X"statesman owned a"
X"two-storey clock? }"
X"@ListItem { Which Yankee"
X"commander cut a swathe of"
X"destruction through the"
X"State of Georgia? }"
X"@EndList"
X}
Xhas result
X@ID {
X@Heading { Quiz }
X@DP
X@RawNumberedList
X@ListItem { Which American
Xstatesman owned a
Xtwo-storey clock? }
X@ListItem { Which Yankee
Xcommander cut a swathe of
Xdestruction through the
XState of Georgia? }
X@EndList
X}
XAlternatively, the tags may be supplied by the author, using the
X@Code "@TaggedList" symbol and its variants @Code "@WideTaggedList" and
X{@Code "@VeryWideTaggedList"}, which leave a wider indent for the tags:
X@ID @Code {
X"@WideTaggedList"
X"{ 9 a.m. } @TagItem { Breakfast in"
X"the Ipamena Lounge, served with"
X"Irish coffee and fresh croissants. }"
X"{ 10 a.m. } @TagItem { Prof. A. Smith"
X"speaks on `The Wealth of Nations.' }"
X"@EndList"
X}
Xhas result
X@ID {
X@RawWideTaggedList
X{ 9 a.m. } @TagItem { Breakfast in
Xthe Ipamena Lounge, served with
XIrish coffee and fresh croissants. }
X{ 10 a.m. } @TagItem { Prof. A. Smith
Xspeaks on `The Wealth of Nations.' }
X@EndList
X}
XEach @Code "@TagItem" symbol uses the thing just preceding it as the tag.
X@PP
XEach of these lists also has a `raw' version which omits the preceding
Xand following space. These are mainly used when an item is itself a list:
X@ID @Code {
X"@ParenNumberedList"
X"@ListItem {"
X" @RawParenRomanList"
X" @ListItem { MV Nominees,"
X"hereinafter called the vendor, ... }"
X" @EndList"
X"}"
X"@EndList"
X}
Xhas result
X@ID {
X@RawParenNumberedList
X@ListItem {
X @RawParenRomanList
X @ListItem { MV Nominees,
Xhereinafter called the vendor, ... }
X @EndList
X}
X@EndList
X}
XIf @Code "@ParenRomanList" had been used instead of
X{@Code "@RawParenRomanList"}, (1) and (i) would have appeared on
Xdifferent lines.
X@PP
XIn cases where it is desired to have a paragraph symbol following a raw
Xlist, owing to problems behind the scenes this symbol should be placed
Xbefore the first {@Code "@ListItem"} or {@Code "@TagItem"}, not after
Xthe @Code "@EndList" as would naturally be expected.
X@PP
XA finer control over the appearance of lists is obtained with
X@Code "@RawIndentedList" and {@Code "@RawTaggedList"}. These
Xhave {@I options}: optional subsidiary symbols which modify the
Xresult. For example,
X@ID @Code {
X"@RawIndentedList"
X" style { [tag] }"
X" indent { 0.5i }"
X" gap { 0.3v }"
X" start { 5 }"
X"@ListItem { ... }"
X"@ListItem { ... }"
X"@EndList"
X}
Xshows the four options available with {@Code "@RawIndentedList"}, namely
X{@Code style}, @Code {indent}, {@Code gap}, and {@Code start}. It
Xhas result
X@ID {
X@RawIndentedList
X style { [tag] }
X indent { 0.5i }
X gap { 0.3v }
X start { 5 }
X@ListItem { ... }
X@ListItem { ... }
X@EndList
X}
XThe @Code style option determines the appearance of each tag, any
X@Code tag symbol
Xwithin it being replaced by the number of the item. If numbers are not
Xwanted in the tag, @Code tag may be omitted. The other options
Xdetermine the indent, the gap between items, and the number of the first
Xitem. In general, options may be given in any order, and if omitted
Xwill revert to a reasonable standard value. @Code "@RawTaggedList" works
Xin a similar way, except that @Code tag is replaced by the tag supplied
Xby the @Code "@TagItem" symbol, and there is no @Code start option. The
Xsymbol @Code "@DP" may be used above or below the list to produce the
Xusual amount of space.
X@PP
XIndividual list items are kept together on one page or column. However,
Xa new page may be started between two list items.
X@PP
XAs in the previous section, every symbol introduced in this section has
Xan abbreviated form consisting of @Code "@" followed by its capital
Xletters only. For example, @Code "@RawNumberedList" can be abbreviated
Xto {@Code "@RNL"}, and @Code "@ListItem" to {@Code "@LI"}.
X@End @Section
END_OF_FILE
if test 5254 -ne `wc -c <'lout/doc/tr.begin/s03'`; then
echo shar: \"'lout/doc/tr.begin/s03'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.begin/s03'
fi
if test -f 'lout/doc/tr.eq/s6' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.eq/s6'\"
else
echo shar: Extracting \"'lout/doc/tr.eq/s6'\" \(5589 characters\)
sed "s/^X//" >'lout/doc/tr.eq/s6' <<'END_OF_FILE'
X@Appendix
X @Title { Pas -- a Lout Package for Printing Pascal Programs }
X@Begin
X@PP
XPas
X@Reference
X @Tag { jensen75 }
X @Type { Book }
X @Author { Jensen, K. and Wirth, N. }
X @Title { Pascal User Manual and Report }
X @Publisher { Springer-Verlag }
X @Year { 1975 }
Xis a package of definitions for printing Pascal programs
X[{@Ref jensen75}] neatly with the Lout document formatter
X[{@Ref kingston92}]. No attempt is made to follow any particular
Xprinting standard; the design simply reflects the author's taste.
X@PP
XThe package is so simple that there is very little to say about
Xit. To use Pas, place @Code "@SysInclude { pas }" in the setup file,
Xor type @Code "-ipas" in the command line. A Pascal program is
Xentered like this, where the @Code "@ID" symbol from the DocumentLayout
Xpackage [{@Ref kingston92begin}] has been used to obtain an indented display:
X@ID @Code {
X"@ID @Pas {"
X"procedure PriDelete(x: PriEntry; var Q: PriorityQueue);"
X" var i: integer;"
X"begin"
X" with Q^ do begin"
X" size := size - 1;"
X" if x^.back <= size then"
X" begin"
X" i := x^.back;"
X" A[i] := A[size + 1];"
X" A[i]^.back := i;"
X" PriAddRoot(i, Q);"
X" PriAddLeaf(i, Q)"
X" end"
X" end"
X"end;"
X"}"
X}
XThe result will come out like this:
X@ID @Pas {
Xprocedure PriDelete(x: PriEntry; var Q: PriorityQueue);
X var i: integer;
Xbegin
X with Q^ do begin
X size := size - 1;
X if x^.back <= size then
X begin
X i := x^.back;
X A[i] := A[size + 1];
X A[i]^.back := i;
X PriAddRoot(i, Q);
X PriAddLeaf(i, Q)
X end
X end
Xend;
X}
XBlank lines, line breaks, indents and spaces in the input are respected, with a
Xtab being considered equal to eight spaces. @Code "@Pas" can also be used
Xwithin a paragraph to produce Pascal fragments like @Pas { A[i..j] }. Use
X@Code "@OneCol @Pas { ... }" to prevent the result from breaking over two
Xlines.
X@PP
X@Code "@Pas" does not attempt to rearrange the program in any way. Each
Xitem is simply printed according to the following plan:
X@ID {
X7c @Wide {
X @Code and |2.5ct @Pas { and }
X//1vx @Code array |2.5ct @Pas { array }
X//1vx @Code begin |2.5ct @Pas { begin }
X//1vx @Code case |2.5ct @Pas { case }
X//1vx @Code const |2.5ct @Pas { const }
X//1vx @Code div |2.5ct @Pas { div }
X//1vx @Code do |2.5ct @Pas { do }
X//1vx @Code downto |2.5ct @Pas { downto }
X//1vx @Code else |2.5ct @Pas { else }
X//1vx @Code end |2.5ct @Pas { end }
X//1vx @Code file |2.5ct @Pas { file }
X//1vx @Code for |2.5ct @Pas { for }
X//1vx @Code forward |2.5ct @Pas { forward }
X//1vx @Code function |2.5ct @Pas { function }
X//1vx @Code goto |2.5ct @Pas { goto }
X//1vx @Code if |2.5ct @Pas { if }
X//1vx @Code in |2.5ct @Pas { in }
X//1vx @Code label |2.5ct @Pas { label }
X//1vx @Code mod |2.5ct @Pas { mod }
X//1vx @Code nil |2.5ct @Pas { nil }
X//1vx @Code not |2.5ct @Pas { not }
X//1vx @Code of |2.5ct @Pas { of }
X//1vx @Code or |2.5ct @Pas { or }
X//1vx @Code otherwise |2.5ct @Pas { otherwise }
X//1vx @Code packed |2.5ct @Pas { packed }
X//1vx @Code procedure |2.5ct @Pas { procedure }
X//1vx @Code program |2.5ct @Pas { program }
X//1vx @Code record |2.5ct @Pas { record }
X//1vx @Code repeat |2.5ct @Pas { repeat }
X//1vx @Code set |2.5ct @Pas { set }
X//1vx @Code then |2.5ct @Pas { then }
X//1vx @Code to |2.5ct @Pas { to }
X//1vx @Code type |2.5ct @Pas { type }
X//1vx @Code until |2.5ct @Pas { until }
X//1vx @Code var |2.5ct @Pas { var }
X//1vx @Code while |2.5ct @Pas { while }
X//1vx @Code with |2.5ct @Pas { with }
X} | 7c @Wide {
X @Code "0" |2.5ct @Pas { 0 }
X//1vx @Code "1" |2.5ct @Pas { 1 }
X//1vx @Code "2" |2.5ct @Pas { 2 }
X//1vx @Code "3" |2.5ct @Pas { 3 }
X//1vx @Code "4" |2.5ct @Pas { 4 }
X//1vx @Code "5" |2.5ct @Pas { 5 }
X//1vx @Code "6" |2.5ct @Pas { 6 }
X//1vx @Code "7" |2.5ct @Pas { 7 }
X//1vx @Code "8" |2.5ct @Pas { 8 }
X//1vx @Code "9" |2.5ct @Pas { 9 }
X//1vx @Code "." |2.5ct @Pas { . }
X//1vx @Code "," |2.5ct @Pas { , }
X//1vx @Code ":" |2.5ct @Pas { : }
X//1vx @Code ";" |2.5ct @Pas { ; }
X//1vx @Code "'" |2.5ct @Pas { ' }
X//1vx @Code "`" |2.5ct @Pas { ` }
X//1vx @Code "+" |2.5ct @Pas { + }
X//1vx @Code "-" |2.5ct @Pas { - }
X//1vx @Code "*" |2.5ct @Pas { * }
X//1vx @Code "/" |2.5ct @Pas { / }
X//1vx @Code "(" |2.5ct @Pas { ( }
X//1vx @Code ")" |2.5ct @Pas { ) }
X//1vx @Code "[" |2.5ct @Pas { [ }
X//1vx @Code "]" |2.5ct @Pas { ] }
X//1vx @Code "^" |2.5ct @Pas { ^ }
X//1vx @Code ".." |2.5ct @Pas { .. }
X//1vx @Code "=" |2.5ct @Pas { = }
X//1vx @Code "<" |2.5ct @Pas { < }
X//1vx @Code ">" |2.5ct @Pas { > }
X//1vx @Code "<>" |2.5ct @Pas { <> }
X//1vx @Code "<=" |2.5ct @Pas { <= }
X//1vx @Code ">=" |2.5ct @Pas { >= }
X//1vx @Code ":=" |2.5ct @Pas { := }
X}
X}
XAnything not mentioned here will appear in italic font.
X@PP
XPascal character strings need a little attention before formatting by
XPas. Their interiors are best enclosed in double quotes to prevent the
Xabove transformations from occurring inside them. Any @Code "\\" or
X@Code "\"" characters inside strings will need to be replaced by
X@Code "\\\\" and @Code "\\\"" respectively, and the opening quote should
Xbe replaced by {@Code "`"}.
X@PP
XSimilar remarks apply to Pascal comments; don't forget that @Code "{"
Xand @Code "}" must be enclosed in double quotes. Alternatively, a
X@Code "@Com" symbol can be placed in front of a comment enclosed
Xin braces. It will add literal braces:
X@ID @Code {
X"@Com { A Pascal comment }"
X}
Xhas result
X@ID @Pas {
X@Com { A Pascal comment }
X}
XIt may still be necessary to enclose the interior in double quotes.
X@End @Appendix
END_OF_FILE
if test 5589 -ne `wc -c <'lout/doc/tr.eq/s6'`; then
echo shar: \"'lout/doc/tr.eq/s6'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.eq/s6'
fi
if test -f 'lout/doc/tr.fig/s3' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.fig/s3'\"
else
echo shar: Extracting \"'lout/doc/tr.fig/s3'\" \(5295 characters\)
sed "s/^X//" >'lout/doc/tr.fig/s3' <<'END_OF_FILE'
X@Section
X @Title { Creating New Shapes }
X@Begin
X@PP
XIf the needed shape is not provided by Fig, it can be created
Xusing the @Code "@Figure" symbol. @Code "@Figure" takes all the options
Xwe have already seen, plus another one called {@Code shape}. For
Xexample,
X@ID {
X@Code {
X"@Figure"
X" shape {"
X" 0 0 xsize 0"
X" 0 ysize 0 0"
X" }"
X"{ 3c @High 2c @Wide }"


X}
X||7ct
X@Fig {
X@Figure

X shape { 0 0 xsize 0
X 0 ysize 0 0
X }
X{ 3c @High 2c @Wide }
X}
X}
XThe pairs of numbers define points in a coordinate system whose origin
Xis the lower left corner of the right parameter; the upper right corner
Xis @Code xsize {@Code ysize}, and the point where the
Xright parameter's marks cross is {@Code "xmark ymark"}:
X@ID 10p @Font
X{


X { &1rt @I ysize /0ik &1rt @I ymark /0ik &1rt 0 } |0.4c
X { /
X |0ik @ShowMarks { 1c @High 1.5c @Wide ^| 3c @Wide ^/ 2c @High }
X |0ik /
X }

X /0.3c


X | 0 | @I xmark | @I xsize
X}

XThis arrangement is identical with that for the @Code "@Graphic"
Xsymbol of basic Lout. A sequence of points defines a shape, like
Xthe triangle above. Arrowheads are drawn pointing forwards from the
Xlast segment and backwards from the first, as requested; the @Code margin
Xoption has default value {@Code 0c}.
X@PP
XNormally, the points are connected by straight lines to form the shape,
Xwhich is then painted and drawn in the usual way, depending on the other
Xoptions.
X@PP
XIf two points in the shape are separated by {@Code {"[" &0.5s "]"}}, no
Xline will be drawn between them. This permits a shape to consist of two
Xor more disconnected parts.
X@PP
XIf two points in the shape are separated by
X{@Code "[" & @Eq{x ``` y} & @Code "]"}, where
X@Eq {x} and @Eq {y} are numbers, the two points will be joined by an
Xanticlockwise arc whose centre is the point @Eq {(x, y)}. This arc
Xwill be circular if possible, otherwise it will be part of an ellipse
Xwhose axes are oriented horizontally and vertically. The notation
X@Code "[" & @Eq {x ``` y} @Code "clockwise]" makes the arc go
Xclockwise. For example,
X@ID {
X@Code {
X"@Figure"
X" shape {"
X" 0 -0.5 cm"
X" 0 0.5 cm"
X" 1 cm 0 0 -0.5 cm [" &0.5s "]"
X" 1 cm 0 [ 1.1 cm 0 ]"
X" 1 cm 0"
X" }"
X"{}"
X}
X||7ct
X@Fig { //0.5c
X@Figure
X shape { 0 -0.5 cm 0 0.5 cm
X 1 cm 0 0 -0.5 cm []
X 1 cm 0 [ 1.1 cm 0 ] 1 cm 0
X }
X{}
X}
X}
XWe have recklessly disregarded the size of the right parameter when
Xdrawing this shape, a dangerous thing to do since Lout thinks that the
Xfigure is the same size as its right parameter.
X@PP
XFinally, two points may be separated by
X@Eq { [x sub 1 ``` y sub 1 ``` x sub 2 ``` y sub 2 & ] }, which requests that a
XBezier curve be drawn between them with control points
X@Eq { (x sub 1 & , y sub 1 & ) } and
X@Eq { (x sub 2 & , y sub 2 & ) }:
X@ID @Fig {
X@Figure
X margin { 0c }
X shape { 1 cm 2 cm 4 cm 3.5 cm 9 cm 2 cm 2 cm 0.6 cm }
X linestyle { dashed }
X@Figure
X margin { 0c }
X shape { 1 cm 2 cm [4 cm 3.5 cm 9 cm 2 cm] 2 cm 0.6 cm }
X{ 7c @Wide 4c @High }
X
X// { -0.3 cm 2.0 cm } @BaseOf @Eq { (x sub 0 & , y sub 0 & )}
X// { 4.2 cm 3.5 cm } @BaseOf @Eq { (x sub 1 & , y sub 1 & )}
X// { 9.1 cm 2.0 cm } @BaseOf @Eq { (x sub 2 & , y sub 2 & )}
X// { 2.1 cm 0.0 cm } @BaseOf @Eq { (x sub 3 & , y sub 3 & )}
X}
XThe curve is attracted toward the control points, without reaching
Xthem; it is tangent to the straight line from the start point to the
Xfirst control point, and from the second control point to the finishing
Xpoint, and it lies wholly inside the quadrilateral formed by the four
Xpoints. Owing to the author's laziness, dashes and dots do not fit as
Xneatly onto Bezier curves as they do onto lines and arcs.
X @Code "@Figure" should be general enough to draw most shapes; for
Xexample, all the other shapes ({@Code "@Box"}, {@Code "@Circle"}, etc.)
Xare just instances of {@Code "@Figure"}. When it is inadequate, one
Xcan fall back to the standard @Code "@Graphic" symbol.
X@PP
XLines, arrows and arcs at any angle can be produced using {@Code "@Figure"}:
X@ID {
X@Code {
X"@Figure"
X" shape { 0 0 xsize ysize }"
X" arrow { forward }"
X"{ 2c @High 3c @Wide }"


X}
X||7ct
X@Fig {
X@Figure

X shape { 0 0 xsize ysize }
X arrow { forward }
X{ 2c @High 3c @Wide }
X}
X}
XHowever, for convenience there are symbols @Code "@Line" and @Code
X"@Arrow" which have two options, @Code "from" and {@Code "to"}, for
Xspecifying the endpoints:
X@ID {
X@Code {
X"@Arrow"
X" from { 0 0 }"
X" to { xsize ysize }"
X"{ 2c @High 3c @Wide }"
X}
X||7ct
X@Fig {
X@Arrow
X from { 0 0 }
X to { xsize ysize }
X{ 2c @High 3c @Wide }
X}
X}
XThere is also an @Code "@Arc" symbol, which draws a circular or
Xelliptical arc from one point to another about a given centre, with
Xthe usual options:
X@ID {
X@Code {
X"@Arc"
X" from { 0 0 }"
X" to { xsize ysize }"
X" ctr { 0 ysize }"
X" direction { anticlockwise }"
X" arrow { forward }"
X" linestyle { dashed }"
X"{ 2c @High 3c @Wide }"
X}
X||7ct
X@Fig {
X@Arc
X from { 0 0 }
X to { xsize ysize }
X ctr { 0 ysize }
X direction { anticlockwise }
X arrow { forward }
X linestyle { dashed }
X{ 2c @High 3c @Wide }
X}
X}
XThe arc goes either @Code clockwise (the default) or @Code anticlockwise
Xabout the centre, depending on the @Code direction option. Any
Xarrowhead will point in a direction tangent to the arc.
X@End @Section
END_OF_FILE
if test 5295 -ne `wc -c <'lout/doc/tr.fig/s3'`; then
echo shar: \"'lout/doc/tr.fig/s3'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.fig/s3'
fi
if test -f 'lout/doc/tr.impl/oldrefs.ld' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.impl/oldrefs.ld'\"
else
echo shar: Extracting \"'lout/doc/tr.impl/oldrefs.ld'\" \(5587 characters\)
sed "s/^X//" >'lout/doc/tr.impl/oldrefs.ld' <<'END_OF_FILE'
X{ @Reference
X @Tag { knuth84 }
X @Type { Book }
X @Author { Knuth, Donald E. }
X @Title { The T{ /0.2fo E}XBook }
X @Publisher { Addison-Wesley }
X @Year { 1984 }
X}
X
X{ @Reference
X @Tag { adobe85 }
X @Type { Book }
X @Author { Adobe Systems, Inc. }
X @Title { PostScript Language Reference Manual }
X @Publisher { Addison-Wesley }
X @Year { 1985 }
X}
X
X{ @Reference
X @Tag { reid80 }
X @Type { ConferencePaper }
X @Author { Reid, Brian K. }
X @Title { A High-Level Approach to Computer Document Production }
X @Proceedings { Proceedings of the 7th Symposium on the Principles
Xof Programming Languages (POPL), Las Vegas NV }
X @Pages { 24--31 }
X @Year { 1980 }
X}
X


X{ @Reference
X @Tag { strunk79 }
X @Type { Book }
X @Author { Strunk, William and White, E. B. }
X @Title { The Elements of Style }

X @Publisher { Macmillan, third edition }
X @Year { 1979 }
X}
X
X{ @Reference
X @Tag { ossanna76 }
X @Type { TechReport }
X @Author { Joseph F. Ossanna }
X @Title { "Nroff/Troff" User's Manual }
X @Number { 54 }
X @Institution { Bell Laboratories, Murray Hill, NJ 07974 }
X @Year { 1976 }
X}
X
X{ @Reference
X @Tag { kernighan75 }
X @Type { JournalArticle }
X @Author { Kernighan, Brian W. and Cherry, Lorinda L. }
X @Title { A system for typesetting mathematics }
X @Journal { Communications of the ACM }
X @Volume { 18 }
X @Pages { 182--193 }
X @Year { 1975 }
X}
X
X{ @Reference
X @Tag { lesk76 }
X @Type { TechReport }
X @Author { Lesk, M. E. }
X @Title { Tbl -- a program to format tables }
X @Number { 49 }
X @Institution { Bell Laboratories, Murray Hill, NJ 07974 }
X @Year { 1976 }
X}
X
X{ @Reference
X @Tag { kernighan82 }
X @Type { JournalArticle }
X @Author { Kernighan, Brian W. }
X @Title { PIC -- A language for typesetting graphics}
X @Journal { Software Practice and Experience }
X @Volume { 12 }
X @Pages { 1--21 }
X @Year { 1982 }
X}
X
X{ @Reference
X @Tag { kingston91 }


X @Type { TechReport }
X @Author { Kingston, Jeffrey H. }
X @Title { Document Formatting with Lout }

X @Number { 408 }


X @Institution { Basser Department of Computer

XScience F09, University of Sydney 2006, Australia }
X @Year { 1991 }
X}
X
X{ @Reference
X @Tag { kingston91basser }
X @Type { Software }


X @Author { Kingston, Jeffrey H. }

X @Title { The Basser Lout Document Formatter }
X @Year { 1991 }
X @Comment { Computer program; Version 2 publicly available
Xin the @I jeff subdirectory of the home directory of @I ftp to host
X@I ftp.cs.su.oz.au with login name @I anonymous or @I ftp and any
Xnon-empty password. Distribution via email is available for
Xnon-{@I ftp} sites. All enquiries to "je...@cs.su.oz.au". }
X}
X
X{ @Reference
X @Tag { kingston91begin }


X @Type { TechReport }
X @Author { Kingston, Jeffrey H. }

X @Title { A beginners' guide to Lout }
X @Number { 409 }


X @Institution { Basser Department of Computer

XScience F09, University of Sydney 2006, Australia }
X @Year { 1991 }
X}
X
X{ @Reference
X @Tag { kingston91eq }


X @Type { TechReport }
X @Author { Kingston, Jeffrey H. }

X @Title { Eq -- a Lout package for typesetting mathematics }
X @Number { 410 }


X @Institution { Basser Department of Computer

XScience F09, University of Sydney 2006, Australia }
X @Year { 1991 }
X @Comment { (Contains an appendix describing the Pas Pascal formatter.) }
X}
X
X{ @Reference
X @Tag { kingston91fig }


X @Type { TechReport }
X @Author { Kingston, Jeffrey H. }

X @Title { Fig -- a Lout package for drawing figures }
X @Number { 411 }


X @Institution { Basser Department of Computer

XScience F09, University of Sydney 2006, Australia }
X @Year { 1991 }
X}
X
X{ @Reference
X @Tag { kingston91over }


X @Type { TechReport }
X @Author { Kingston, Jeffrey H. }

X @Title { A new approach to document formatting }
X @Number { 412 }


X @Institution { Basser Department of Computer

XScience F09, University of Sydney 2006, Australia }
X @Year { 1991 }
X}
X
X{ @Reference
X @Tag { kingston91tab }


X @Type { TechReport }
X @Author { Kingston, Jeffrey H. }

X @Title { Tab -- a Lout package for formatting tables }
X @Number { 413 }


X @Institution { Basser Department of Computer

XScience F09, University of Sydney 2006, Australia }
X @Year { 1991 }
X}
X
X{ @Reference
X @Tag { kingston91design }


X @Type { TechReport }
X @Author { Kingston, Jeffrey H. }

X @Title { The design and implementation of a document formatting language }
X @Number { @Null }


X @Institution { Basser Department of Computer

XScience F09, University of Sydney 2006, Australia }
X @Year { 1991 }
X @Comment { @I { In preparation. } }
X}
X
X{ @Reference
X @Tag { wirth71 }
X @Type { JournalArticle }
X @Author { Wirth, N. }
X @Title { The programming language Pascal }
X @Journal { Acta Informatica }
X @Volume { 1 }
X @Year { 1975 }
X @Pages { 35--63 }
X}
X
X{ @Reference
X @Tag { brooks91 }
X @Type { JournalArticle }
X @Author { Brooks, Kenneth P. }
X @Title { Lilac: a two-view document editor }
X @Journal { IEEE Computer }
X @Volume { @Null }
X @Pages { 7--19 }
X @Year { 1991 }
X}
X
X{ @Reference
X @Tag { furuta82 }
X @Type { JournalArticle }
X @Author { Furuta, Richard, Scofield, Jeffrey,
Xand Shaw, Alan }
X @Title { Document formatting systems: survey,
Xconcepts, and issues }
X @Journal { Computing Surveys }
X @Volume { 14 }
X @Pages { 417--472 }
X @Year { 1982 }
X}
END_OF_FILE
if test 5587 -ne `wc -c <'lout/doc/tr.impl/oldrefs.ld'`; then
echo shar: \"'lout/doc/tr.impl/oldrefs.ld'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.impl/oldrefs.ld'
fi
if test -f 'lout/doc/tr.impl/s3.3' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.impl/s3.3'\"
else
echo shar: Extracting \"'lout/doc/tr.impl/s3.3'\" \(5264 characters\)
sed "s/^X//" >'lout/doc/tr.impl/s3.3' <<'END_OF_FILE'
X@SubSection
X @Tag { modules }
X @Title { Modules }
X@Begin
X@PP
XIt is well accepted that the visibility of symbols is not adequately
Xcontrolled by Algol block structure. The author is aware of several
Xmajor problems of this kind in document formatting.
X@PP
XOne problem is that some symbols should be visible only within
Xrestricted parts of a document. For example, we naturally expect
Xequation formatting to be accomplished like this:
X@ID @Code {
X"surrounding text"
X"@Eq { {x sup 2 + 1} over 4 }"
X"surrounding text"
X}
Xwith the symbols {@Code "sup"}, {@Code "over"}, etc., visible only within
Xthe equation, not in the surrounding text.
X@PP
XIt seems natural to define these symbols within {@Code "@Eq"}, since
Xthey are local to equations. It only remains then to decree that
Xsymbols local to @Code "@Eq" are to be visible within its actual right
Xparameter, and this is done by replacing the right formal parameter with a
X@I body parameter:


X@ID @Code {
X"export sup over"

X"def @Eq"
X" body @Body"
X"{"
X" def sup ..."
X" def over ..."
X""
X" Slope @Font @Body"
X"}"
X}
XThe @Code export clause lists the identifiers which are permitted to be
Xvisible outside their usual range, the body of {@Code "@Eq"}; and the
X@Code body declaration imports them into (makes them visible within)
Xthe actual right parameter of each invocation of {@Code "@Eq"}. This
Xarrangement has proven very convenient for defining a variety of
Xspecial-purpose packages.
X@PP
XAnother problem arises when global symbols, such as the ones used for
Xheadings and paragraph separators, call on values that the non-expert
Xuser will need to modify, such as the initial font or paragraph
Xindent. These values are like parameters of the document as a whole, so
Xit is natural to try this:
X@ID @Code {
X"export @Heading @PP ..."
X"def @BookLayout"


X" named @InitialFont { Times Base 12p }"

X" named @InitialBreak { adjust 14p }"
X" named @ColumnWidth { 6i }"
X" ..."
X"{"
X" def @Heading ..."
X" def @PP ..."
X"}"
X}
XNow @Code "@Heading" and @Code "@PP" may invoke @Code "@InitialFont"
Xand the other parameters. To make @Code "@Heading" and @Code "@PP"
Xvisible throughout the document, we need only add a body parameter to
X@Code "@BookLayout" and present the entire document as
X@ID @Code {
X"@BookLayout"
X" @InitialFont { Helvetica Base 10p }"
X" @InitialBreak { adjust 12p }"
X"{"
X" The document."
X"}"
X}
Xbut for practical reasons given below we prefer not to enclose the
Xentire document in braces. Instead, we write
X@ID @Code {
X"@Use { @BookLayout"
X" @InitialFont { Helvetica Base 10p }"
X" @InitialBreak { adjust 12p }"
X"}"
X"The document."
X}
Xwhich has the same effect: @Code "@Use" makes the exported symbols of
X@Code "@BookLayout" visible for the remainder of the document, and is
Xpermitted only at the beginning.
X@PP
XThe third feature that affects visibility, and which will prove useful
Xfor cross referencing (Section {@NumberOf cross}), is the @Code "@Open"
Xsymbol. It makes the exported symbols of its left parameter visible
Xwithin its right parameter, and is therefore similar to the Pascal @Code
Xwith statement.
X@PP
XIt could be argued that Lout is over-supplied with these visibility modifying
Xfeatures: the body parameter, @Code "@Use" and @Code "@Open" do not seem
Xsufficiently different from each another. The @Code "@Open" symbol is
Xthe most general, being capable of replacing the other two. For
Xexample,
X@ID @Code {
X"@Use { x }"
X"@Use { y }"
X"Body of document"
X}
Xcan be replaced by
X@ID @Code {
X"x @Open {"
X"y @Open {"
X"Body of document"
X"}}"
X}
Xand, taking the @Code "@Eq" symbol above as example, we could eliminate
Xits body parameter, add
X@ID @Code "def @Body right x { Slope @Font x }"
Xto the exported definitions of {@Code "@Eq"}, and replace
X@ID @Code "@Eq { object }"
Xby
X@ID @Code "@Eq @Open { @Body { object } }"
XIf @Code "@Eq" is a galley (Section {@NumberOf galleys}), @Code "@Body"
Xmust take over that function. But one would not want to write these
Xclumsy expressions in practice, and the enclosure of large quantities
Xof input in extra braces could cause Basser Lout to run out of memory
X(Section {@NumberOf lookahead}).
X@PP
XA quite separate kind of visibility problem arises when expert
Xusers wish to define an object or operator for repeated use within, say,
Xequations:
X@ID @Code "def isum { sum from i=1 to n }"
XAs it stands this can only be placed within the @Code "@Eq" package itself,
Xwhere @Code "sum" and the other symbols are visible, but it is not desirable
Xto modify the source code of a standard package. Lout provides an
X@Code "import" clause to solve this problem:


X@ID @Code {
X"import @Eq"

X"def isum { sum from i=1 to n }"
X}
Xmay appear after @Code "@Eq" is defined, and it will make the exported symbols
Xof @Code "@Eq" visible within the body of {@Code "isum"}. This feature
Xcomplicates the treatment of environments (Section {@NumberOf defs.impl}),
Xand even introduces an insecurity, when @Code isum is invoked outside an
Xequation. A simpler approach would be to allow only one symbol in an
X@Code import clause, and treat the following definition exactly like a
Xlocal definition of that symbol; but then it would not be possible
Xto define symbols using the resources of more than one of the standard
Xpackages.
X@End @SubSection
END_OF_FILE
if test 5264 -ne `wc -c <'lout/doc/tr.impl/s3.3'`; then
echo shar: \"'lout/doc/tr.impl/s3.3'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.impl/s3.3'
fi
if test -f 'lout/doc/tr.impl/s5.1' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.impl/s5.1'\"
else
echo shar: Extracting \"'lout/doc/tr.impl/s5.1'\" \(6118 characters\)
sed "s/^X//" >'lout/doc/tr.impl/s5.1' <<'END_OF_FILE'
X@SubSection
X @Tag { galleys }
X @Title { The galley abstraction }
X@Begin
X@PP
XLet us take the footnote as a representative example. At some point in
Xthe document, we wish to write
X@ID @Code {
X"preceding text"
X"@FootNote { footnote text }"
X"following text"
X}
Xand we expect the formatter to remove the footnote from this context and
Xplace it at the bottom of the current page, possibly splitting some or
Xall of it onto a following page if space is insufficient.
X@PP
XAn object appears in the final document at the point it is invoked, but
Xthis basic property does not hold for footnotes: the point of
Xinvocation and the point of appearance are different. In some way, the
Xfootnote is attached to the document at both points, introducing a cross
Xlinking (Section {@NumberOf genesis}) that cannot be described in purely
Xfunctional terms.
X@PP
XSince the interpretation of any object depends on an environment and
Xstyle inherited from the context, the first question must be whether
Xthe footnote inherits them through the invocation point or through
Xthe point(s) of appearance.
X@PP
XIf symbols are to be interpreted statically as heretofore, then environments
Xmust be inherited through the invocation point alone. Dynamic inheritance
Xthrough the point of appearance is enticing in some ways: it might
Xreplace the body parameter, and it might help with automatic numbering,
Xsince the number of a footnote is known only at the point of appearance;
Xbut the implementation problems are severe, and static inheritance seems
Xmuch simpler and more comprehensible to the user. Style, at least its
Xavailable width and height part, must of necessity be inherited through
Xthe point of appearance. For consistency, the entire style should be
Xinherited in this way. There is a suggestive analogy here with actual
Xparameters, which have a point of invocation from which they inherit an
Xenvironment, and a point of appearance within the body of the enclosing
Xdefinition, from which they inherit a style. It may be possible to treat
Xa footnote as the actual parameter of some symbol, therefore, although
Xthe details seem very obscure.
X@PP
XBut the most profound consequence of having two types of attachment
Xpoint is that it leads to two distinctive tree structures. Considering
Xinvocation points only leads to static trees like this one:
X@ID @I @Fig margin { 0.3c } { @Tree {
X@Node @Ellipse { body text }
X@LeftSub { @Node @Ellipse footnote }
X@RightSub {
X @Node @Ellipse figure
X @FirstSub { @Node @Ellipse footnote }
X}
X}}
Xwhich shows that the body text contains a footnote and a figure, the
Xlatter itself containing a footnote. Considering points of appearance
Xonly gives a completely different, dynamic tree:
X@ID @I @Fig margin { 0.3c } { @Tree {
X@Node @Ellipse { sequence of pages }
X@FirstSub { @Node @Ellipse { body text } }
X@NextSub { @Node @Ellipse { footnote } }
X@NextSub { @Node @Ellipse { figure } }
X@NextSub { @Node @Ellipse { footnote } }
X}}
XThe tree can be deeper, for example with sections appearing within
Xchapters which appear within the body text, which appears within the
Xfinal sequence of pages. Document formatting languages generally shirk
Xthe issues raised by this dual tree structure, by making the dynamic
Xtree built-in, by limiting one or both trees to two levels, and so on,
Xproviding a classic example of the impoverishing effect of failing to
Xpermit language features to attain their natural level of generality.
X@PP
XWe are thus led to propose a second abstraction for document formatting,
Xwhich we name the @I galley in recognition of its similarity to the
Xgalleys used in manual typesetting. A galley consists of an object (such
Xas a footnote) together with a sequence of places where that object may
Xappear (such as the bottoms of the current and following pages). Splitting
Xoccurs quite naturally when space at any place is insufficient to hold
Xthe entire object.
X@PP
XIn Lout, a footnote galley and its place of appearance are defined
Xas follows:


X@ID @Code {
X"def @FootPlace { @Galley }"
X""

X"def @FootNote into { @FootPlace&&following }"

X" right x"
X"{ x }"
X}

XThe @Code "@FootPlace" symbol contains the special symbol {@Code "@Galley"},
Xindicating that it is a point of appearance for a galley. By placing
Xinvocations of @Code "@FootPlace" at the bottoms of pages, as in Section
X{@NumberOf recursion}, we define the desired points of appearance for
Xfootnotes. Symbols whose body contains @Code "@Galley" either directly
Xor indirectly are called receptive symbols, meaning receptive to
Xgalleys, and they are expanded only on demand. The effect of the
X@Code "into" clause is to make each invocation of @Code "@FootNote" a
Xgalley whose object is the result of the invocation in the usual way,
Xand whose sequence of points of appearance is specified by the @Code "into"
Xclause; in this example, the sequence of all @Code "@FootPlace" symbols
Xfollowing the invocation point.
X@PP
XLout permits galleys to be invoked within other galleys to arbitrary
Xdepth, so that one may have footnotes within figures within the body
Xtext galley, for example, creating arbitrary static trees. Receptive
Xsymbols like @Code "@FootPlace" may appear within any galley, creating
Xarbitrary dynamic trees as well. The root of the dynamic tree, which
Xwould normally consist of the sequence of pages of the complete assembled
Xdocument, is considered to be a galley whose point of appearance is the
Xoutput file. Points of appearance may be @Code preceding or @Code following
Xthe invocation point; entries in tables of contents are the main users
Xof {@Code preceding}.
X@PP
XThe galley abstraction is adequate for all of the applications listed at
Xthe beginning of this section, except that there is no provision for
Xsorting index entries and references. Sorting of galleys has been added
Xto Lout as a built-in feature, invoked by adding a special @Code "@Key"
Xparameter to the galleys, and using its value as the sort key. The author
Xwas at a loss to find any other way, or any useful generalization of this
Xfeature. Its implementation will be discussed in Section
X{@NumberOf cross.impl}.
X@End @SubSection
END_OF_FILE
if test 6118 -ne `wc -c <'lout/doc/tr.impl/s5.1'`; then
echo shar: \"'lout/doc/tr.impl/s5.1'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.impl/s5.1'
fi
if test -f 'lout/doc/tr.lout/ch2.01' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch2.01'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch2.01'\" \(6076 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch2.01' <<'END_OF_FILE'
X@Section
X @Tag { lexical }
X @Title { Lexical structure (words, spaces, symbols) and macros }
X@Begin
X@PP
XThe input to Lout consists of a sequence of @I {textual units},
Xtextual.unit @Index {Textual unit }
Xwhich may be
Xeither {@I{white spaces}},
X@I identifiers,
X@I delimiters,
Xor
X@I {literal words}. Each
Xis a sequence of @I characters chosen from:
Xletter @Index { Letter character }
Xpunctuation @Index { Punctuation character }
Xquote @Index { Quote character }
Xescape @Index { Escape character }
Xcomment.char @Index { Comment character }


X@ID @Tab
X vmargin { 0.5vx }
X @Fmta { @Col A ! @Col B }
X{

X@Rowa A { letter } B { @Code "@ab-zAB-Z" }
X@Rowa A { punctuation } B { @Code "!$%&'()*+,-./0123456789:;<=>?[]^_`{|}~" }
X@Rowa A { white space } B { @I { space tab newline } }
X@Rowa A { quote } B { @Code "\"" }
X@Rowa A { escape } B { @Code "\\" }
X@Rowa A { comment } B { @Code "#" }
X}
XNotice that @Code "@" is classed as a letter, and the ten digits as
Xpunctuation characters.
X@PP
XA @I {white space} is a sequence of one or more white space characters.
Xwhite.space @Index { White space }
Xspace.f @Index { Space }
X@PP
XAn @I identifier is a sequence of one or more letters which is the name of a
Xidentifier @Index { Identifier }
Xsymbol. It is conventional but not essential to begin identifiers with
X{@Code "@"}; Basser Lout will print a warning message if it finds an
Xunquoted literal word (see below) beginning with {@Code "@"}, since such
Xwords are usually misspelt identifiers. The complete list of predefined
Xidentifiers is
X@ID @Code {
X{ "@Begin"
X @JL "@Break"
X @JL "@Case"
X @JL "@Database"
X @JL "@End"
X @JL "@Font"
X @JL "@Galley"
X @JL "@Graphic"
X @JL "@HAdjust"
X @JL "@HContract"
X @JL "@HExpand"
X @JL "@High"
X @JL "@HScale"
X @JL "@Include"
X @JL "@IncludeGraphic"
X} |4.4cx {
X "@Key"
X @JL "@LClos"
X @JL "@LEnv"
X @JL "@LInput"
X @JL "@LVis"
X @JL "@Moment"
X @JL "@Next"
X @JL "@Null"
X @JL "@OneCol"
X @JL "@OneRow"
X @JL "@Open"
X @JL "@PAdjust"
X @JL "@PrependGraphic"
X @JL "@Rotate"
X @JL "@Scale"
X} |4.4cx {
X "@Space"
X @JL "@SysDatabase"
X @JL "@SysInclude"
X @JL "@SysIncludeGraphic"
X @JL "@SysPrependGraphic"
X @JL "@Tag"
X @JL "@Tagged"
X @JL "@Use"
X @JL "@VAdjust"
X @JL "@VContract"
X @JL "@VExpand"
X @JL "@VScale"
X @JL "@Wide"
X @JL "@Yield"
X}
X}
Xplus the names of the parameters of @@Moment. The symbols @@LClos, @@LEnv,
Xlclos@Index { @@LClos symbol }
Xlenv @Index { @@LEnv symbol }
Xlinput @Index { @@LInput symbol }
Xlvis @Index { @@LVis symbol }
X@@LInput, and @@LVis appear in cross reference databases generated by Lout
Xand are not for use elsewhere.
X@PP
XA @I delimiter is a sequence of one or more punctuation characters which
Xdelimiter @Index { Delimiter }
Xis the name of a symbol. For example, @Code "{" and @Code
X"//" are delimiters. When defining a delimiter, the name must be enclosed
Xin quotes:
X@ID @Code {


X"def \"^\" { {} ^& {} }"
X}

Xbut quotes are not used when the delimiter is invoked. A delimiter may
Xhave other delimiters and punctuation and other characters adjacent,
Xwhereas identifiers may not be adjacent to letters or other
Xidentifiers. The complete list of predefined delimiters is
X@ID @Code {
X{
X "/"
X @JL "//"
X @JL "^/"
X @JL "^//"
X} |2.2cx {
X "|"
X @JL "||"
X @JL "^|"
X @JL "^||"
X} |2.2cx {
X "&"
X @JL "^&"
X} |2.2cx {
X "&&"
X @JL "{"
X @JL "}"
X}
X}
XA longer delimiter like @Code "<=" will be recognised in
Xpreference to a shorter one like {@Code "<"}.
X@PP
XA sequence of characters which is neither a white space, an identifier, nor a
Xdelimiter, is by default a @I {literal word}, which means that it will
Xword @Index { Word }
Xliteral.word @Index { Literal word }
Xquoted.word @Index { Quoted word }
Xpass through Lout unchanged. An arbitrary sequence of characters
Xenclosed in double quotes, for example @Code "\"{ }\"", is also a
Xliteral word. Space characters may be included, but not tabs or
Xnewlines. There are special character sequences, used only between
Xquotes, for obtaining otherwise inaccessible characters:


X@ID @Tab
X vmargin { 0.5vx }
X @Fmta { @Col A ! @Col B }
X{

X@Rowa A { @Code "\\\"" } B { produces @Code "\"" }
X@Rowa A { @Code "\\\\" } B { "\\" }
X@Rowa A { @Code "\\ddd" } B { the character whose ASCII code }
X@Rowa A { } B { the up to three digit octal number {@Code ddd} }
X}
XSo, for example, @Code "\"\\\"@PP\\\"\"" produces {@Code "\"@PP\""}.
X@PP
XWhen the comment character
Xcomment @Index { Comment }
X@Code "#" is encountered, everything from
Xthat point to the end of the line is ignored. This is useful for
Xincluding reminders to oneself, like this:
X@ID @Code {
X"# Lout user manual"
X"# J. Kingston, June 1989"
X}
Xfor temporarily deleting parts of the document, and so on.
X@PP
X@I Macros
Xmacro @Index { Macro }
Xprovide a means of defining symbols which stand for a
Xsequence of textual units rather than an object. For example, the macro
Xdefinition
X@ID @Code {
X"macro @PP { //1.3vx 2.0f @Wide &0i }"
X}
Xmakes Lout replace the symbol @Code "@PP" by the given textual units
Xbefore assembling its input into objects. A similar macro to this
Xone is used to separate the paragraphs of the present document. The
Xenclosing braces and any spaces adjacent to them are dropped, which can
Xbe a problem: @Code "@PP2i" has result {@Code "//1.3vx 2.0f @Wide &0i2i"}
Xwhich is erroneous.
X@PP
XThe meaning of symbols used within the body of a macro is determined by
Xwhere the macro is defined, not by where it is used. Due to implementation
Xproblems, @@Open symbols will not work within macros. Named and body
Xparameters will work if the symbol that they are parameters of is also
Xpresent. There is no way to get a left or right brace into the body of
Xa macro without the matching brace.
X@PP
XMacros may be nested within other definitions and exported, but they may
Xnot be parameters. They may not have parameters or nested definitions
Xof their own, and consequently a preceding @Code export clause (Section
X{@NumberOf visibility}) would be pointless; however, an @Code import
Xclause is permitted.
X@End @Section
END_OF_FILE
if test 6076 -ne `wc -c <'lout/doc/tr.lout/ch2.01'`; then
echo shar: \"'lout/doc/tr.lout/ch2.01'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch2.01'
fi
if test -f 'lout/doc/tr.lout/ch2.05' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch2.05'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch2.05'\" \(5248 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch2.05' <<'END_OF_FILE'
X@Section
X @Title { The style and size of objects }
X @Tag { size }
X@Begin
X@PP
XThis section explains how Lout determines the style and size of each
Xobject. Together, these attributes determine the object's final
Xappearance in the output.
Xstyle @Index { Style of an object }
X@PP
XThe style of an object comprises the following:
X@BulletList
X@ListItem { Which font family, face and size to use (also defining the
X@Code f unit); }
X@ListItem { What gap to replace a single space between two objects by (also
Xdefining the @Code s unit); }
X@ListItem { The kind of paragraph breaking to employ ({@Code adjust},
X{@Code ragged}, etc.) }
X@ListItem { What gap to insert between the lines of paragraphs
X(also defining the @Code v unit); }
X@ListItem { Whether to permit hyphenation or not. }
X@EndList
XThe style of an object depends on where it appears in the final
Xdocument. For example, the style of a parameter depends on where it is
Xused; the style of a galley is the style of the first target that it
Xattempts to attach itself to. Of course, the style of any object can be
Xchanged by using the @@Font, @@Space, and @@Break symbols.
X@PP
XThere are no standard default values for style. Instead one must ensure
Xthat the root galley or each of its components is enclosed in @@Font
Xand @@Break symbols. From there the style is passed to incoming galleys
Xand the objects within them.
X@PP
Xwidth. @Index { Width of an object }
Xheight. @Index { Height of an object }
Xsize. @Index { Size of an object }
XThe remainder of this section explains how the size of each object (its
Xwidth and height on the printed page) is determined. We will treat width
Xonly, since height is determined in exactly the same way, except that the
Xcomplications introduced by paragraph breaking are absent.
X@PP
XWith three exceptions (see below), the width of an object is as large as
Xit possibly could be without violating a @@Wide symbol or intruding into
Xthe space occupied by neighbouring gaps or objects. As an aid to
Xinvestigating this rule, we will use the definition
X@ID @Code {


X"def @Box right x"
X"{"

X" \"0 0 moveto xsize 0 lineto xsize ysize lineto 0 ysize lineto closepath stroke\""


X" @Graphic x"
X"}"
X}

Xwhich draws a box around the boundary of its right parameter (Section
X{@NumberOf graphic}). The result of
X@ID @Code {
X"5c @Wide @Box metempsychosis"
X}
Xis
X@ID {
X5c @Wide @Box metempsychosis
X}
XThe widest that @Code "@Box metempsychosis" could possibly be is five
Xcentimetres, and accordingly that is its width. The same applies to
X{@Code metempsychosis}, which is five centimetres wide as well. Note
Xcarefully that there is no object in this example whose width is equal
Xto the sum of the widths of the letters of {@Code metempsychosis}.
X@PP
XThe first of the three exceptions to the `as wide as possible' rule is the
X@@HContract symbol, which causes the width of its right parameter to be
Xreduced to a reasonable minimum (a formal definition will not be attempted):
X@ID @Code {
X"5c @Wide @HContract @Box metempsychosis"
X}
Xproduces
X@ID {
X5c @Wide @HContract @Box metempsychosis
X}
XThe object @Code "@HContract @Box metempsychosis" is still five centimetres
Xwide, but the object @Code "@Box metempsychosis" has been reduced.
X@PP
XThe second of the three exceptions is the horizontal concatenation symbol
X@Code "|" (and also {@Code "&"}). Consider this example:
X@ID @Code {
X"5c @Wide @Box { A |1c B |1c C }"
X}
XAs usual, the right parameter of @@Wide is five centimetres wide, and
Xthe result looks like this:
X@ID {
X5c @Wide @Box { A |1c B |1c C }
X}
XLout has to apportion the size minus inter-column gaps among the three
Xcolumns.
X@PP
XIf the columns are wide enough to require paragraph breaking, Lout will
Xassign sizes to the columns in such a way as to leave narrow columns
Xunbroken and break wider columns to equal width, occupying the full
Xsize. Otherwise, paragraph breaking is not required, and each column
Xwill be assigned a reasonable minimum size in the manner of @@HContract,
Xexcept that the last column receives all the leftover width. For example,
X@ID @Code {
X"5c @Wide { @Box A |1c @Box B |1c @Box C }"
X}
Xhas result
X@ID {
X5c @Wide { @Box A |1c @Box B |1c @Box C }
X}
XIf it is desired that the leftover width remain unused, rather than
Xgoing into the last column, an empty column can be appended, or the last
Xcolumn can be enclosed in @@HContract. Two other ways to apportion the
Xleftover width are provided by the @@HExpand and @@HAdjust symbols
X(Sections {@NumberOf hexpand} and {@NumberOf hadjust}).
X@PP
XThe third and final exception to the `as wide as possible' rule concerns
Xthe components of the root galley. Each is considered to be enclosed
Xroot.galley.size @SubIndex { size of components of }
Xin @@HContract and @@VContract symbols.
X@PP
XUp to this point we have treated width as a single quantity, but of
Xcourse it has two parts: width to left and right of the mark. The
X`as wide as possible' rule applies to both directions:
X@ID @Code {
X"@HContract { @Box 953^.05 /0.5c @Box 2^.8286 }"
X}
Xhas result
X@ID {
X@HContract { @Box 953^.05 /0.5c @Box 2^.8286 }
X}
XLeftover width usually goes to the right, as we have seen, but here some
Xwidth was available only to the left of {@Code "2.8286"} owing to the
Xcolumn mark alignment.
X@End @Section
END_OF_FILE
if test 5248 -ne `wc -c <'lout/doc/tr.lout/ch2.05'`; then
echo shar: \"'lout/doc/tr.lout/ch2.05'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch2.05'
fi
if test -f 'lout/doc/tr.lout/ch3.07' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch3.07'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch3.07'\" \(977 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch3.07' <<'END_OF_FILE'
X@Section
X @Title { "@Wide" and "@High" }
X @Tag { wide }
X@Begin
X@PP
XThe @@Wide symbol
Xwide.sym @Index { @@Wide symbol }
Xreturns its right parameter modified to have the width given by its left
Xparameter, which must be a length (Section {@NumberOf concatenation})
Xwhose unit of measurement is {@Code "c"}, {@Code "i"}, {@Code "p"},
X{@Code "m"}, {@Code "f"}, {@Code "s"}, or {@Code "v"}. If the right
Xparameter is not as wide as required, white space is added at the right;
Xif it is too wide, its paragraphs are broken (Section {@NumberOf break})
Xso that it fits. A @@OneCol operation is included in the effect of @@Wide,
Xsince it does not make sense for an object of fixed width to have two column
Xmarks.
X@PP
Xhigh.sym @Index { @@High symbol }
XThe @@High symbol similarly ensures that its result is of a given height,
Xby adding white space at the bottom. In this case it is an error for the
Xright parameter to be too large. A @@OneRow operation is included.
X@End @Section
END_OF_FILE
if test 977 -ne `wc -c <'lout/doc/tr.lout/ch3.07'`; then
echo shar: \"'lout/doc/tr.lout/ch3.07'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch3.07'
fi
if test -f 'lout/z32.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/z32.c'\"
else
echo shar: Extracting \"'lout/z32.c'\" \(5594 characters\)
sed "s/^X//" >'lout/z32.c' <<'END_OF_FILE'
X/*@z32.c:Counter Service:Next()@**********************************************/


X/* */
X/* LOUT: A HIGH-LEVEL LANGUAGE FOR DOCUMENT FORMATTING (VERSION 2.03) */
X/* COPYRIGHT (C) 1993 Jeffrey H. Kingston */
X/* */
X/* Jeffrey H. Kingston (je...@cs.su.oz.au) */
X/* Basser Department of Computer Science */
X/* The University of Sydney 2006 */
X/* AUSTRALIA */
X/* */
X/* This program is free software; you can redistribute it and/or modify */
X/* it under the terms of the GNU General Public License as published by */
X/* the Free Software Foundation; either version 1, or (at your option) */
X/* any later version. */
X/* */
X/* This program is distributed in the hope that it will be useful, */
X/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
X/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
X/* GNU General Public License for more details. */
X/* */
X/* You should have received a copy of the GNU General Public License */
X/* along with this program; if not, write to the Free Software */
X/* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
X/* */

X/* FILE: z32.c */
X/* MODULE: Counter Service */
X/* EXTERNS: Next() */


X/* */
X/*****************************************************************************/
X#include "externs"

X#define isdigit(x) ( (x) >= '0' && (x) <= '9' )
X
X/*****************************************************************************/
X/* */
X/* OBJECT Next(x, inc, done) */
X/* */
X/* Return x with its value incremented by inc (if possible). */
X/* Set *done to TRUE if successful, leave *done unchanged otherwise. */
X/* */
X/*****************************************************************************/
X
XOBJECT Next(x, inc, done)
XOBJECT x; int inc; BOOLEAN *done;
X{ OBJECT y, link; int l, r, n, len;
X unsigned char buff[MAX_LINE + 1];
X debug3(DCS, DD, "Next( %s, %d, %s )", EchoObject(null, x), inc, bool(*done));


X switch( type(x) )
X {
X case WORD:
X

X len = strlen(string(x));
X for( r = len - 1; r >= 0 && !isdigit(string(x)[r]); r--);
X if( r < 0 ) break;
X for( l = r-1; l >= 0 && isdigit(string(x)[l]); l-- );
X sscanf(&string(x)[l+1], "%d", &n);
X string(x)[l+1] = '\0';
X sprintf(buff, "%s%d%s", string(x), n+inc, &string(x)[r+1]);
X if( strlen(buff) >= MAX_LINE )
X Error(FATAL, &fpos(x), "word %s is too long", buff);
X y = MakeWord(buff, &fpos(x));
X word_font(y) = word_font(x);


X MergeNode(y, x); x = y;

X *done = TRUE;
X break;
X
X


X case INCGRAPHIC:
X case SINCGRAPHIC:

X case GAP_OBJ:
X case CLOSURE:


X case NULL_CLOS:
X case CROSS:
X

X break;
X
X


X case ONE_COL:
X case ONE_ROW:
X case WIDE:
X case HIGH:

X case HCONTRACT:
X case VCONTRACT:
X case HEXPAND:
X case VEXPAND:
X case PADJUST:
X case HADJUST:
X case VADJUST:

X case HSCALE:
X case VSCALE:

X case ROTATE:
X case SCALE:
X case SPLIT:
X case GRAPHIC:
X
X Child(y, LastDown(x));
X y = Next(y, inc, done);


X break;
X
X
X case ACAT:
X

X /* ***
X x = ReplaceWithTidy(x);
X *** */
X if( type(x) == WORD )
X { len = strlen(string(x));
X for( r = len-1; r >= 0 && !isdigit(string(x)[r]); r--);
X if( r < 0 ) break;
X for( l = r-1; l >= 0 && isdigit(string(x)[l]); l-- );
X sscanf(&string(x)[l+1], "%d", &n);
X string(x)[l+1] = '\0';
X sprintf(buff,"%s%d%s",string(x),n+inc,&string(x)[r+1]);
X y = MakeWord(buff, &fpos(x));
X word_font(y) = word_font(x);


X MergeNode(y, x); x = y;

X *done = TRUE;
X }
X else
X { assert( type(x) == ACAT, "Next: ACAT!" );
X link = LastDown(x);
X while( link != x && !*done )
X { Child(y, link);
X if( is_index(type(y)) ) continue;
X y = Next(y, inc, done);
X if( !*done ) link = PrevDown(link);
X }


X }
X break;
X
X

X case COL_THR:
X case ROW_THR:
X case HCAT:
X case VCAT:
X
X link = LastDown(x);
X while( link != x && !*done )
X { Child(y, link);
X if( is_index(type(y)) ) continue;
X y = Next(y, inc, done);
X if( !*done ) link = PrevDown(link);


X }
X break;
X
X
X default:
X

X Error(INTERN,&fpos(x), "Next: type(x) = %s", Image(type(x)));


X break;
X
X } /* end switch */

X debug1(DCS, DD, "Next returning %s", EchoObject(null, x));
X return x;
X} /* end Next */
END_OF_FILE
if test 5594 -ne `wc -c <'lout/z32.c'`; then
echo shar: \"'lout/z32.c'\" unpacked with wrong size!
fi
# end of 'lout/z32.c'
fi
if test -f 'lout/z34.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/z34.c'\"
else
echo shar: Extracting \"'lout/z34.c'\" \(5705 characters\)
sed "s/^X//" >'lout/z34.c' <<'END_OF_FILE'
X/*@z34.c:Rotation Service:RotateSize()@***************************************/


X/* */
X/* LOUT: A HIGH-LEVEL LANGUAGE FOR DOCUMENT FORMATTING (VERSION 2.03) */
X/* COPYRIGHT (C) 1993 Jeffrey H. Kingston */
X/* */
X/* Jeffrey H. Kingston (je...@cs.su.oz.au) */
X/* Basser Department of Computer Science */
X/* The University of Sydney 2006 */
X/* AUSTRALIA */
X/* */
X/* This program is free software; you can redistribute it and/or modify */
X/* it under the terms of the GNU General Public License as published by */
X/* the Free Software Foundation; either version 1, or (at your option) */
X/* any later version. */
X/* */
X/* This program is distributed in the hope that it will be useful, */
X/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
X/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
X/* GNU General Public License for more details. */
X/* */
X/* You should have received a copy of the GNU General Public License */
X/* along with this program; if not, write to the Free Software */
X/* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
X/* */

X/* FILE: z34.c */
X/* MODULE: Rotation Service */
X/* EXTERNS: RotateSize() */
X/* */
X/*****************************************************************************/


X#include <math.h>
X#ifndef M_PI
X#define M_PI 3.1415926535897931160E0
X#endif

X#include "externs"
X
Xtypedef struct { double x, y; } rect_coord;
Xtypedef struct { double angle, radius; } polar_coord;
X
X#define rect_to_polar(rect, polar) \
Xpolar.angle = atan2(rect.y, rect.x), \
Xpolar.radius = sqrt(rect.x*rect.x + rect.y*rect.y)
X
X#define polar_to_rect(polar, rect) \
Xrect.x = polar.radius * cos(polar.angle), \
Xrect.y = polar.radius * sin(polar.angle)


X
X
X/*****************************************************************************/
X/* */

X/* RotateSize(xcb, xcf, xrb, xrf, y, theta) */
X/* */
X/* Calculate the size of x, assuming that it is y rotated by theta degrees. */
X/* */
X/*****************************************************************************/
X
XRotateSize(xcb, xcf, xrb, xrf, y, theta)
XLENGTH *xcb, *xcf, *xrb, *xrf; OBJECT y; LENGTH theta;
X{ rect_coord ycorners[4], xcorner; polar_coord pol;
X double maxx, maxy, minx, miny, ang; int i;
X unsigned char buff1[20], buff2[20];
X
X /* calculate theta in radians */
X ang = (double) theta * 2 * M_PI / (double) (DG * 360);
X ifdebug(DRS, D, sprintf(buff2, "%.1f", ang));
X debug2(DRS, D, "RotateSize( %s, %s )", EchoObject(null, y), buff2);
X debug4(DRS, DD, " ycb %s, ycf %s, yrb %s, yrf %s",
X EchoLength(back(y, COL)), EchoLength(fwd(y, COL)),
X EchoLength(back(y, ROW)), EchoLength(fwd(y, ROW)));
X
X /* set up coordinates of the four corners of y */
X ycorners[0].x = (float) fwd(y, COL);
X ycorners[0].y = (float) back(y, ROW);
X ycorners[1].x = - (float) back(y, COL);
X ycorners[1].y = (float) back(y, ROW);
X ycorners[2].x = - (float) back(y, COL);
X ycorners[2].y = - (float) fwd(y, ROW);
X ycorners[3].x = (float) fwd(y, COL);
X ycorners[3].y = - (float) fwd(y, ROW);
X
X /* rotate these four corners by theta and store their extremes */
X maxx = maxy = (float) - MAX_LEN;
X minx = miny = (float) MAX_LEN;
X for( i = 0; i < 4; i++ )
X {
X if( ycorners[i].x == 0 && ycorners[i].y == 0 )
X { pol.radius = 0; pol.angle = 0; }
X else rect_to_polar(ycorners[i], pol);
X ifdebug(DRS, DD, sprintf(buff1, "%.1f", pol.angle));
X ifdebug(DRS, DD, sprintf(buff2, "%.1f", ang));
X debug5(DRS, DD, " transforming (%s, %s) -> (%s, %s) + %s",
X EchoLength( (int) ycorners[i].x), EchoLength( (int) ycorners[i].y),
X EchoLength( (int) pol.radius), buff1, buff2);
X pol.angle += ang;
X polar_to_rect(pol, xcorner);
X ifdebug(DRS, DD, sprintf(buff1, "%.1f", pol.angle));
X debug4(DRS, DD, " transforming (%s, %s) -> (%s, %s)",
X EchoLength( (int) pol.radius), buff1,
X EchoLength( (int) xcorner.x), EchoLength( (int) xcorner.y) );
X maxx = max(maxx, xcorner.x); minx = min(minx, xcorner.x);
X maxy = max(maxy, xcorner.y); miny = min(miny, xcorner.y);
X }
X
X /* store sizes back into x and return */
X *xcb = - (int) minx; *xcf = (int) maxx;
X *xrb = (int) maxy; *xrf = - (int) miny;
X debug0(DRS, D, "RotateSize returning.");
X debug4(DRS, DD, " xcb %s, xcf %s, xrb %s, xrf %s",
X EchoLength(*xcb), EchoLength(*xcf),
X EchoLength(*xrb), EchoLength(*xrf));
X} /* end RotateSize */
END_OF_FILE
if test 5705 -ne `wc -c <'lout/z34.c'`; then
echo shar: \"'lout/z34.c'\" unpacked with wrong size!
fi
# end of 'lout/z34.c'
fi
echo shar: End of archive 26 \(of 30\).
cp /dev/null ark26isdone

Jeff Kingston

unread,
Jun 1, 1993, 11:06:02 PM6/1/93
to
Submitted-by: je...@joyce.cs.su.oz.au (Jeff Kingston)
Posting-number: Volume 37, Issue 125
Archive-name: lout/part27
Environment: UNIX

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: lout/doc/tr.begin/s01 lout/doc/tr.begin/s07
# lout/doc/tr.begin/s10 lout/doc/tr.eq/s4 lout/doc/tr.fig/s2
# lout/doc/tr.fig/s6 lout/doc/tr.impl/s2.5 lout/doc/tr.impl/s4.0
# lout/doc/tr.impl/s5.3 lout/doc/tr.impl/s5.4 lout/doc/tr.impl/s5.5
# lout/doc/tr.impl/s6.2 lout/doc/tr.over/s4 lout/doc/tr.over/s5
# lout/doc/tr.tab/s6 lout/include/book lout/include/report
# Wrapped by kent@sparky on Sun May 30 19:44:02 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 27 (of 30)."'
if test -f 'lout/doc/tr.begin/s01' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.begin/s01'\"
else
echo shar: Extracting \"'lout/doc/tr.begin/s01'\" \(4181 characters\)
sed "s/^X//" >'lout/doc/tr.begin/s01' <<'END_OF_FILE'
X@Section
X @Tag { intro }
X @Title { Introduction }
X@Begin
X@PP
XThe Lout document formatting system has been designed with the
Xneeds of the ordinary user very much in mind. Although the features of Lout
Xare virtually endless, and include mathematical equations, diagrams made
Xfrom lines and shapes, bibliographic databases, and so on, the system is
Xvery simple to use.
X@PP
XDocument formatting with Lout begins with the creation of a file like
Xthe following:


X@ID @Code {
X"@Doc @Text @Begin"

X"@Heading { Introduction }"
X"@PP"
X"For Virginia Woolf, @I Middlemarch"
X"was `the magnificent book which"
X"for all its imperfections is one"
X"of the few English novels written"
X"for grown-up people.'"
X"@End @Text"
X}
XOrdinary words are mixed with symbols of special meaning, such as
X{@Code "@Doc"}, {@Code "@Text"}, {@Code "@Heading"}, and
X{@Code "@I"}. Most symbols begin with {@Code "@"}, but some, like
X{@Code "{"} and {@Code "}"}, do not. It doesn't matter where the lines
Xend: the end of a line is treated the same as a single space.
X@PP
XThis file is then processed by the Basser Lout interpreter, for example
Xby typing
X@ID @Code "lout -idoc simple > simple.ps"
Xon the Unix
X@FootNote { Unix is a trademark of "AT&T" Bell Laboratories. &0io }
Xoperating system, assuming that the file's name is
X{@Code "simple"}. The @Code "-idoc" part instructs Lout to include a
Xspecial @I {setup file} called {@Code doc}, in which the symbols are
Xdefined. The output is the PostScript
X@FootNote { PostScript is a trademark of Adobe Systems, Inc. &0io }
Xfile {@Code "simple.ps"}, which is suitable for printing on most laser
Xprinters and many other devices. When printed, it will appear like this:
X@ID {
X@Heading { Introduction }
X@PP
XFor Virginia Woolf, @I Middlemarch was `the magnificent book which
Xfor all its imperfections is one of the few English novels written
Xfor grown-up people.'
X}
XThe meaning of each symbol is now clear. @Code "@Doc @Text @Begin" and
X@Code "@End @Text" have no visible effect, but they always bracket the
Xdocument as a whole. @Code "@Heading" makes the following thing into
Xa heading; there is also @Code "@MajorHeading" for producing a large
Xheading, and @Code "@MinorHeading" for a subheading. The @Code "@PP"
Xsymbol starts a paragraph whose first line is indented; also available
Xare {@Code "@LP"} which omits the indent, {@Code "@DP"} which leaves the
Xamount of vertical space used for displays, and {@Code "@NP"}, which
Xstarts a new page or column (rarely used, since Lout does this
Xautomatically when the old one fills). Finally, @Code "@I" changes the
Xfont of the following thing to {@I Italic}.
X@PP
XBraces are used to group parts of the document together so that nearby
Xsymbols will affect the whole part. For example,
X@ID @Code "@I { Scenes of Clerical Life }"
Xproduces {@I { Scenes of Clerical Life }}. The braces around
X@Code "Introduction" in the example above are not strictly necessary,
Xsince a single word does not need to be grouped; but a longer heading
Xwould require them. Braces also help when a symbol must be immediately
Xadjacent to another symbol or to a word:
X@ID @Code "QuikWipe{@TradeMark}"
Xhas result QuikWipe{@TradeMark}. Without them Lout would confuse the
Xtwo. In a similar way, @Code "{@I Middlemarch}," produces
X{@I Middlemarch}, with the comma not set in Italic.
X@PP
XCharacters like "{", which normally are symbols, will be
Xtreated as ordinary words when enclosed in double quotes. For example,
X@Code "\"{\"" produces "{". The characters
X@ID @Code "/ | & { } # @ ^"
Xshould always be so enclosed, since otherwise they will have special
Xeffects.
X@PP
XThe symbols described above form part of the {@I DocumentLayout @I package},
Xa collection of symbols designed to make day-to-day document formatting
Xeasy. This package also provides symbols for producing displays and
Xlists, numbered sections, subsections, and appendices, footnotes,
Xfigures, tables, references, and cross references. These are described
Xin later sections of this report. This same package may also be used to
Xproduce technical reports and books, as described in Sections
X@NumberOf reportlayout and {@NumberOf booklayout}.
X@End @Section
END_OF_FILE
if test 4181 -ne `wc -c <'lout/doc/tr.begin/s01'`; then
echo shar: \"'lout/doc/tr.begin/s01'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.begin/s01'
fi
if test -f 'lout/doc/tr.begin/s07' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.begin/s07'\"
else
echo shar: Extracting \"'lout/doc/tr.begin/s07'\" \(1777 characters\)
sed "s/^X//" >'lout/doc/tr.begin/s07' <<'END_OF_FILE'
X@Section
X @Tag { sections }
X @Title { Sections }
X@Begin
X@PP
XThe DocumentLayout package provides sections, like this:
X@ID @Code {
X"some introductory text."
X"@BeginSections"


X"@Section"
X" @Title { Introduction }"

X"@Begin"
X"@PP"
X"..."

X"..."
X"@End @Section"
X"@Section"
X" @Title { Displays and lists }"


X"@Begin"
X"@PP"
X"..."

X"..."
X"@End @Section"
X"@EndSections"
X}
X@Code "@BeginSections" and @Code "@EndSections" symbols must
Xbracket the sections, and paragraph symbols are needed at the
Xbeginning of each section but not before or after the whole group. The
X@Code "@Title" option of @Code "@Section" is made into a numbered heading,
Xlike those in the present document, preceded by a conditional new page
Xsymbol (Section {@NumberOf cnp}). The body of each section is enclosed in
X@Code "@Begin" and {@Code "@End @Section"}, although @Code "{" and @Code "}"
Xare sufficient if preferred. The former are more long-winded but less
Xprone to error.
X@PP
XWithin sections one may choose to have a sequence of subsections. These
Xare introduced by @Code "@BeginSubSections" and concluded by
X{@Code "@EndSubSections"}:
X@ID @Code {
X"in the following subsections."
X"@BeginSubSections"
X"@SubSection"
X" @Title { ... }"


X"@Begin"
X"@PP"
X"..."

X"@End @SubSection"
X"@SubSection"
X" @Title { ... }"


X"@Begin"
X"@PP"
X"..."

X"@End @SubSection"
X"@EndSubSections"
X}
XThe first subsection of the first section will be numbered 1.1, and so
Xon. There are no sub-subsections. DocumentLayout also provides appendices
Xin an exactly analogous way, using the symbols {@Code "@BeginAppendices"},
X{@Code "@Appendix"}, and {@Code "@EndAppendices"}, and subappendices
Xwithin any appendix using the symbols {@Code "@BeginSubAppendices"},
X{@Code "@SubAppendix"}, and {@Code "@EndSubAppendices"}.
X@End @Section
END_OF_FILE
if test 1777 -ne `wc -c <'lout/doc/tr.begin/s07'`; then
echo shar: \"'lout/doc/tr.begin/s07'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.begin/s07'
fi
if test -f 'lout/doc/tr.begin/s10' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.begin/s10'\"
else
echo shar: Extracting \"'lout/doc/tr.begin/s10'\" \(4136 characters\)
sed "s/^X//" >'lout/doc/tr.begin/s10' <<'END_OF_FILE'
X@Section
X @Tag { refs }
X @Title { References }
X@Begin
X@PP
XThe method of handling references described in this section is rather
Xelaborate, but it has many advantages. The first step is to create a
Xseparate @I {database file} containing @Code "@Reference" symbols. Each
Xis enclosed in braces, and has options chosen from
X{@Code "@Tag"}, {@Code "@Type"}, {@Code "@Author"}, {@Code "@Title"},
X{@Code "@Institution"}, {@Code "@Number"}, {@Code "@Publisher"},
X{@Code "@Year"}, {@Code "@Proceedings"}, {@Code "@Journal"},
X{@Code "@Volume"}, {@Code "@Pages"}, and {@Code "@Comment"}:
X@IndentedList
X@ListItem @Code {


X"{ @Reference"
X" @Tag { strunk79 }"
X" @Type { Book }"

X" @Author { Strunk and White }"


X" @Title { The Elements of Style }"

X" @Publisher { MacMillan }"


X" @Year { 1979 }"
X"}"
X}

X@ListItem @Code {


X"{ @Reference"
X" @Tag { kingston92 }"
X" @Type { TechReport }"
X" @Author { Kingston, Jeffrey H. }"
X" @Title { Document Formatting"

X"with Lout }"


X" @Number { 449 }"
X" @Institution { Basser Department"

X"of Computer Science F09, University"
X"of Sydney 2006, Australia }"


X" @Year { 1992 }"
X"}"
X}

X@EndList
XThe {@Code "@Tag"} and {@Code "@Type"} options are in fact compulsory; the
Xfirst serves to name the reference, the second gives its type, which may
Xbe {@Code "TechReport"}, {@Code "ConferencePaper"}, {@Code "JournalArticle"},
X{@Code "PhD"}, or {@Code "Book"}, although a Lout expert will be able to add
Xother types. The type determines which other options must be present, as
Xshown above, and how they will be printed.
X@PP
XSuppose this file is given the name @Code "myrefs.ld" (Basser Lout
Xdatabase file names must end in {@Code ".ld"}). To tell Lout to refer
Xto this file as needed,
X@ID @Code {
X"@Database @Reference { myrefs }"
X}
Xis placed at the beginning of the document, before {@Code "@Doc"},
X{@Code "@Report"}, or {@Code "@Book"}.
X@PP
XNow, with everything prepared,
X@ID @Code {
X"{@Ref kingston92}"
X}
Xfor example at any point in the document will cause the reference whose
Xtag is @Code "kingston92" to be added to the nearest following
Xreference list, indicated by the symbol {@Code "@ReferenceSection"}, unless
Xit is already there. Typically one would write
X@ID @Code {
X"... which ends our study."
X"@DP"
X"@ReferenceSection"
X}
Xat the very end of the document (although one could equally well have several
X@Code "@ReferenceSection" symbols scattered through the document if desired);
Xtechnical reports and books add @Code "@ReferenceSection" automatically
Xwhen needed. The references will appear in alphabetical order by tag, and
Xthe @Code "@Ref" symbol will be replaced by the number of the reference,
Xin this case {@Ref "kingston92"}. @Code "@ReferenceSection" has a
X@Code "@Title" option like {@Code "@Section"}, and it also has {@Code style},
X{@Code indent}, {@Code gap} and {@Code start} options for contolling the
Xappearance of the reference list, like {@Code "@RawIndentList"}.
X@PP
XIf a separate database file is not convenient for some reason, perhaps
Xbecause it is desirable for the entire document to reside in one file,
Xthe @Code "@Reference" symbols may be incorporated into the document
Xitself, anywhere after {@Code "@Text @Begin"}. Nothing will appear
Xwhere they are typed in, but Lout will
Xnotice them and treat them exactly as if they had come from a database
Xfile. In this case no @Code "@Database" symbol is needed.
X@PP
XA way to print references at any point in the document is provided by
X{@Code "@RefPrint"}:
X@ID @Code "{@RefPrint kingston92}"
Xmight have result
X@ID {@RefPrint kingston92}
Xdepending on what references exist.
X@PP
XTo get section numbers, footnote numbers, cross references, and references
Xright, Basser Lout has to process the document more than once (three times
Xfor numbered references), and create special files whose names end
Xin `.li' and `.ld'. It will print warning messages on runs when this
Xprocess is incomplete, and substitute question marks for the unknown
Xvalues. There should be only one document containing these features per
XUnix directory, otherwise Basser Lout will confuse their special files.
X@End @Section
END_OF_FILE
if test 4136 -ne `wc -c <'lout/doc/tr.begin/s10'`; then
echo shar: \"'lout/doc/tr.begin/s10'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.begin/s10'
fi
if test -f 'lout/doc/tr.eq/s4' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.eq/s4'\"
else
echo shar: Extracting \"'lout/doc/tr.eq/s4'\" \(4293 characters\)
sed "s/^X//" >'lout/doc/tr.eq/s4' <<'END_OF_FILE'
X@Section
X @Title { Features from Standard Lout }
X@Begin
X@PP
XIn this section we summarize those features of standard Lout of most
Xrelevance to equation formatting. All are freely available within
Xequations. Full details may be found in the Lout reference manual
X[{@Ref kingston92}].
X@PP
XStandard Lout uses the symbols {@Code "#"}, {@Code "{"}, {@Code "}"},
X{@Code "&"}, {@Code "|"}, and @Code "/" for special purposes (the braces
Xare used for grouping, for example). To get these characters into
Xequations without using their full names, enclose them in double quotes:
X{@Code "\"{\""}, {@Code "\"}\""}, etc. Any sequence of characters
Xincluding spaces but not newlines may be so enclosed, and the effect is
Xto turn off any special meaning that the symbols within it might have.
X@PP
XEq sets letters in Slope (Lout's name for Italic), digits in Base (i.e.
XRoman), and other symbols in various fonts, mostly the Symbol font. To
Xchange fonts, use the @Code "@Font" symbol:
X@ID {
X@Code "Slope @Font \"2\""
X|7ct
X@Eq { Slope @Font "2" }
X}
XIn Eq it will often be necessary to enclose the right parameter in
Xdouble quotes, because the symbol 2 includes a built-in change back to
XBase font. Changing fonts makes white space between objects in the
Xright parameter appear in the result. The @Code "@Font" operator also
Xdoes size changes:
X@IL
X@LI {
X@Code "sum"
X|7ct
X@Eq { sum }
X}
X@LI {
X@Code "\"+2p\" @Font sum"
X|7ct
X@Eq { "+2p" @Font sum }
X}
X@LI {
X@Code "2.0f @Font sum"
X|7ct
X@Eq { 2.0f @Font sum }
X}
X@EL
XHere @Code "\"+2p\" @Font" sets its right parameter in a font two points
Xlarger than it would otherwise have been; @Code "2.0f @Font" sets its
Xright parameter in a font twice the original size. Sizes should always
Xbe specified relative to the enclosing size as we have done here, since
Xthen they don't need to be changed if a decision is made to set the entire
Xdocument in a different size. It is necessary to enclose @Code "+2p" in
Xdouble quotes within Eq, because otherwise the @Code "+" will be taken as
Xthe Eq symbol for {@Eq { + }}. The right parameter may be any object.
X@PP
XWhenever similar equations or parts of equations are being typed
Xrepeatedly, @I definitions should be used to save time. Suppose for
Xexample that @OneCol @Eq { p sub i ` log sub 2 ` p sub i } occurs
Xfrequently. Then
X@ID @Code "def epi { p sub i ` log sub 2 ` p sub i }"
Xmakes the symbol @Code "epi" stand for the object between the braces:
X@ID {
X@Code "big sum from i=1 to n ` epi"
X|7ct
X@Eq { big sum from i=1 to n ` epi }
X}
XSymbols may be given parameters:
X@ID @Code {
X"def ep"
X" right x"
X"{ p sub x ` log sub 2 ` p sub x"
X"}"
X}
XThe parameter @Code x will be replaced by the object just to the right
Xof {@Code "ep"}:
X@ID {
X@Code {
X"big sum from j=1 to k ` ep i +"
X"big sum from j=k+1 to n ep j"
X}
X||7ct
X@Eq {
Xbig sum from j=1 to k ` ep i +
Xbig sum from j=k+1 to n ep j
X}
X}
XThe precedence of such symbols will be 100 by default.
X@PP
XTo make the symbols of Eq available within such definitions, each must be
Xpreceded by {@Code "import @Eq"}. The best place to keep them is in the
Xsetup file, which might then look like this:
X@ID @Code {
X"@SysInclude { ft }"
X"@SysInclude { dl }"
X"@SysInclude { eq }"
X""
X"import @Eq"
X"def epi { p sub i ` log sub 2 ` p sub i }"
X""
X"import @Eq"
X"def ep right x { p sub x ` log sub 2 ` p sub x }"
X""
X"@Use { @DocumentLayout }"
X}
XUse of @Code "epi" and @Code "ep" outside equations will cause an error.
X@PP
XEquations can appear within a paragraph of text, or they can be
Xdisplayed. Eq's job is to produce a Lout object containing the
Xequation; it neither knows nor cares where this equation goes. To get
Xan equation within a paragraph, simply place @Code "@Eq { ... }" at the
Xdesired point. To prevent it spreading over two lines, use
X{@Code "@OneCol @Eq { ... }"}. To display an equation, use a display
Xsymbol from some other Lout package. For example, the DocumentLayout package
X[{@Ref kingston92begin}] has @Code "@IndentedDisplay" or @Code "@ID" for an
Xindented display, and @Code "@CentredDisplay" or @Code "@CD" for a centred
Xdisplay, so
X@ID @Code "@CD @Eq { int supp pi on 0 sin ` x = 0 }"
Xproduces
X@CD @Eq { int supp pi on 0 sin ` x = 0 }
XDocumentLayout also provides display symbols that make it easy to
Xproduce aligned and numbered equations.
X@End @Section
END_OF_FILE
if test 4293 -ne `wc -c <'lout/doc/tr.eq/s4'`; then
echo shar: \"'lout/doc/tr.eq/s4'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.eq/s4'
fi
if test -f 'lout/doc/tr.fig/s2' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.fig/s2'\"
else
echo shar: Extracting \"'lout/doc/tr.fig/s2'\" \(4595 characters\)
sed "s/^X//" >'lout/doc/tr.fig/s2' <<'END_OF_FILE'
X@Section
X @Title { Basic Shapes }
X@Begin
X@PP
XFig has a repertoire of basic shapes, whose size varies depending on
Xwhat they enclose:
X@IL
X@LI {
X@Code "@Ellipse { hello, world }"
X||7ct
X@Fig {
X@Ellipse { hello, world }
X}
X}
X@LI {
X@Code "@Box { 2c @High }"
X||7ct
X@Fig {
X@Box { 2c @High }
X}
X}
X@EL
XThere are six such shapes: {@Code "@Box"}, {@Code "@Square"},


X{@Code "@Diamond"}, {@Code "@Polygon"}, {@Code "@Ellipse"}, and

X{@Code "@Circle"}; the result in each case is the right parameter,
Xenclosed in a small margin, with the shape around it.
X@PP
XThere are options for changing the appearance of these shapes. The
Xboundary line's style may be {@Code solid}, {@Code dashed},
X{@Code cdashed}, {@Code dotted}, or {@Code noline} (that is, no line is
Xdrawn), and the length of the dashes may be changed:
X@ID {
X@Code {
X"@Circle"
X" linestyle { cdashed }"
X" dashlength { 0.2 cm }"
X"@Eq { X sub 2 }"
X}
X||7ct
X@Fig {
X@Circle
X linestyle { cdashed }
X dashlength { 0.2 cm }
X@Eq { X sub 2 }
X}
X}
XIf the line style is not mentioned, it becomes @Code solid by default. The
X@Code dashed option makes all dashes the same length; @Code cdashed
Xhalves the length of the first and last dash on each segment, which
Xlooks better in some cases. The distance between dashes or dots will be
Xat most {@Code dashlength}, reduced to make the dashes or dots fit evenly.
X@PP
XShapes may be painted {@Code black}, {@Code dark}, {@Code grey} or
X{@Code gray}, {@Code light}, {@Code white}, or {@Code nopaint} (the default):
X@ID {
X@Code {
X"@Box"
X" margin { 0c }"
X" paint { grey }"
X"@Diamond"
X" linestyle { noline }"
X" paint { white }"
X"{ hello, world }"
X}
X||7ct
X@Fig {
X@Box
X margin { 0c }
X paint { grey }
X@Diamond
X linestyle { noline }
X paint { white }
X{ hello, world }
X}
X}
XHere, the right parameter of @Code "@Box" is a diamond containing
X{@Code "hello, world"}. There is no limit to the amount of this sort of
Xnesting; the right parameter may be any Lout object.
X@PP
XWhen painting it is important to know what order things are done in,
Xbecause anything put down earlier will disappear under the paint. This
Xis why @Code nopaint and @Code white are different. Painting is done
Xfirst, then boundaries, and finally the right parameter.
X@PP
XThe @Code "@Polygon" shape has a @Code sides option for specifying the number
Xof sides, and an @Code angle option for specifying what angle anticlockwise
Xfrom vertically beneath the centre the first corner will appear at:
X@IL
X@LI {
X@Code {
X"@Polygon"
X" sides { 5 }"


X"{}"
X}
X||7ct
X@Fig {

X//0.5c
X@Polygon
X sides { 5 }
X{}
X}
X}
X
X@LI {
X@Code {
X"@Polygon"
X" sides { 5 }"
X" angle { 0 dg }"


X"{}"
X}
X||7ct
X@Fig {

X//0.5c
X@Polygon
X sides { 5 }
X angle { 0 dg }
X{}
X}
X}
X@EL
XThe defaults are 3 sides and the angle that gives the polygon
Xa horizontal base (i.e. 180 degrees divided by the number of sides).
XThus the two cases with symmetry about a vertical axis are obtained
Xby the default angle and @Code "0 dg" respectively, which is convenient.
X@PP
XAlthough lines and arrows do not enclose things in the way that boxes
Xand circles do, Fig treats them as it does the other shapes. The line
Xor arrow is drawn along the mark of the right parameter, either
Xhorizontally or vertically:
X@IL
X@LI {
X@Code "@HLine { //0.2c hello, world }"
X||7ct
X@Fig {
X@HLine { //0.2c hello, world }
X}
X}
X@LI {
X@Code "@VArrow { 2c @High X ^|0.2c }"
X||7ct
X@Fig {
X@VArrow { 2c @High X ^|0.2c }
X}
X}
X@EL
XThe usual line style options are available; the default margin is
X{@Code "0c"}. Arrows can be
X{@Code forward} (the default), {@Code back}, {@Code both}, or
X{@Code noarrow} (which just draws a line); the style of the arrowhead
Xcan be {@Code open} (the default), {@Code halfopen}, or {@Code closed}:
X@ID {
X@Code {
X"@HArrow"
X" arrow { both }"
X" headstyle { closed }"
X"{ 3c @Wide }"
X}
X||7ct
X@Fig {
X@HArrow
X arrow { both }
X headstyle { closed }
X{ 3c @Wide }
X}
X}
XIt is also possible to change the shape of the arrowhead, using the
X@Code headwidth and @Code headlength options:
X@ID @Fig {
X{


X@Figure
X shape {
X {0 ysize} ** 0.4 @Label SB
X {0 ysize} ** 0.6 @Label ST
X {xsize 0} ** 0.7 @Label HB
X SB
X SB ++ HB
X HB
X {xsize 0} ++ {0 ysize} ** 0.5
X HB ++ {0 ysize}
X HB ++ ST
X ST
X SB
X }
X paint { grey }

X{ 10c @Wide 3c @High }
X//0.3c
X7c @Wide {} & @HArrow headstyle { closed } arrow {both }
X3c @Wide { //0.2c |0.5rt @I -2p @Font headlength }
X} |0.3c @VArrow headstyle { closed } arrow {both }
X1.5c @High { /0.5rt |0.2c @I -2p @Font headwidth |0io }
X}
XTheir default values are @Code "0.05 cm" and @Code "0.15 cm"
Xrespectively.
X@End @Section
END_OF_FILE
if test 4595 -ne `wc -c <'lout/doc/tr.fig/s2'`; then
echo shar: \"'lout/doc/tr.fig/s2'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.fig/s2'
fi
if test -f 'lout/doc/tr.fig/s6' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.fig/s6'\"
else
echo shar: Extracting \"'lout/doc/tr.fig/s6'\" \(5044 characters\)
sed "s/^X//" >'lout/doc/tr.fig/s6' <<'END_OF_FILE'
X@Section
X @Title { Putting it all together }
X@Begin
X@PP
XIn this section we consider the problem of linking individual shapes
Xtogether to form complex diagrams like this one:
X@ID @Fig {
X@Frame { 10c @Wide 6c @High }
X// X**0.1 ++ Y**0.4 @BaseOf A:: @Square { @I A }
X// X**0.4 ++ Y**0.7 @BaseOf B:: @Square { @I B }
X// X**0.6 ++ Y**0.1 @BaseOf C:: @Square { @I C }
X// X**0.8 ++ Y**0.6 @BaseOf D:: @Square { @I D }
X// A @JoinFigures arrow { forward } B


X// A @JoinFigures arrow { forward } C

X// B @JoinFigures arrow { forward } C


X// B @JoinFigures arrow { forward } D

X// C @JoinFigures arrow { forward } D
X}
XWe already have several aids to hand: the standard Lout symbols,
Xespecially horizontal and vertical concatenation, rotation and scaling;
Xthe ability to nest text, equations, and other figures (in fact
Xarbitrary Lout objects) within our shapes; and the standard Lout
Xdefinition mechanism.
X@PP
XThe default values of the various options -- @Code "solid" for
X{@Code linestyle}, @Code noarrow for {@Code arrow}, and so on -- may be
Xchanged by giving options to the @Code "@Fig" symbol:
X@ID {
X@Code {
X"@Fig"
X" linestyle { noline }"
X" paint { black }"
X"{"
X" @Circle |1c @Square"
X" /1c @Diamond | @Polygon"


X"}"
X}
X||7ct
X@Fig

X linestyle { noline }
X paint { black }
X{
X @Circle |1c @Square
X /1c
X @Diamond | @Polygon
X}
X}
XA complete list of options is given in the next section.
X@PP
XFig provides an additional aid: the symbols {@Code "@BaseOf"} and
X{@Code "@MarkOf"}. The right parameter of {@Code "@BaseOf"} is an
Xarbitrary object, and its left parameter is a point. As far as Lout
Xis concerned, the result of @Code "@BaseOf" is always an empty object;
Xbut the right parameter will appear on the page with the bottom left-hand
Xcorner of its base at the point denoted by the left parameter. We stress
Xthat Lout has no idea that this is happening, and so cannot prevent the
Xshifted object from writing over other objects or even going off the edge
Xof the page. Of course, this lack of discipline is just what is needed
Xvery often in diagrams.
X@PP
XThe @Code "@MarkOf" symbol works in a similar way, except that the point
Xwhere the object's marks cross (rather than its bottom left-hand corner)
Xwill appear on the page at the point denoted by the left parameter.
X@PP
XWe can set up a coordinate system for a figure:
X@ID @Code {
X"@Figure shape { xsize 0 @Label X 0 ysize @Label Y }"
X"{ 10c @Wide 6c @High }"
X}
XIn fact, Fig contains this shape under the name {@Code "@Frame"}, so we
Xneed only write
X@ID @Code "@Frame { 10c @Wide 6c @High }"
XOf course, the right parameter may contain an arbitrary Lout object.
X@PP
XOnce the frame is set up, we can specify points by their @Code X and
X@Code Y coordinates, as fractions of the total width and height:
X@ID @Code "X ** 0.5 ++ Y ** 0.8"
XTo place the squares in the diagram above, we can use
X@ID @Code {
X"// X**0.1 ++ Y**0.4 @BaseOf A:: @Square { @I A }"
X"// X**0.4 ++ Y**0.7 @BaseOf B:: @Square { @I B }"
X"// X**0.6 ++ Y**0.1 @BaseOf C:: @Square { @I C }"
X"// X**0.8 ++ Y**0.6 @BaseOf D:: @Square { @I D }"
X}
XThe symbols' precedences are chosen so that this very common situation
Xrequires no braces. The result of this is
X@ID @Fig {
X@Box margin { 0c } @Frame { 10c @Wide 6c @High }
X// X**0.1 ++ Y**0.4 @BaseOf A:: @Square { @I A }
X// X**0.4 ++ Y**0.7 @BaseOf B:: @Square { @I B }
X// X**0.6 ++ Y**0.1 @BaseOf C:: @Square { @I C }
X// X**0.8 ++ Y**0.6 @BaseOf D:: @Square { @I D }
X}
X{@PageMark sumpoints} where we have drawn a box with margin 0 around the
Xframe to make its extent clear.
X@PP
XNow the arrow from @I A to @I B starts on the boundary of @I A at the
Xangle of a line drawn between the centres of @I A and {@I B}:
X@ID @Code "A@CTR ++ { {A@CTR @Angle B@CTR} A@CIRCUM }"
Xand a similar expression will yield the endpoint of the arrow. Such
Xexpressions should be placed into definitions if they are to be used often:
X@ID @Code {
X"import @Fig"
X"def @JoinFigures"


X" left A"
X" named linestyle { solid }"

X" named dashlength { 0.15 cm }"

X" named arrow { noarrow }"


X" named linewidth { 0.5 pt }"

X" right B"
X"{ @Arrow"


X" from { A\"@CTR\" ++ {{A\"@CTR\" @Angle B\"@CTR\"} A\"@CIRCUM\"} }"

X" to { B\"@CTR\" ++ {{B\"@CTR\" @Angle A\"@CTR\"} B\"@CIRCUM\"} }"


X" linestyle { linestyle }"
X" dashlength { dashlength }"

X" arrow { arrow }"
X" linewidth { linewidth }"
X" {}"
X"}"
X}
XDefinitions preceded by @Code "import @Fig" may use the symbols of
XFig within them; they may themselves be used only within
X@Code "@Fig { ... }". Now, to the figure above we can add
X@ID @Code {
X"// A @JoinFigures arrow { forward } B"
X"// A @JoinFigures arrow { forward } C"
X"// B @JoinFigures arrow { forward } C"
X"// B @JoinFigures arrow { forward } D"
X"// C @JoinFigures arrow { forward } D"
X}
Xto obtain the diagram as it appears at the beginning of this
Xsection. Definitions are the best means of managing complexity in
Xdiagrams, and serious users maintain a file of definitions which is
Xincluded automatically by an @Code "@Include" command.
X@End @Section
END_OF_FILE
if test 5044 -ne `wc -c <'lout/doc/tr.fig/s6'`; then
echo shar: \"'lout/doc/tr.fig/s6'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.fig/s6'
fi
if test -f 'lout/doc/tr.impl/s2.5' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.impl/s2.5'\"
else
echo shar: Extracting \"'lout/doc/tr.impl/s2.5'\" \(4418 characters\)
sed "s/^X//" >'lout/doc/tr.impl/s2.5' <<'END_OF_FILE'
X@SubSection
X @Tag { style }
X @Title { Context-sensitive attributes of objects }
X@Begin
X@PP
XAlthough we are free to place any object in any context, the context
Xmust influence the appearance of the object, since otherwise
X@ID @Code "A short paragraph of text."
Xcould not appear in a variety of fonts, column widths, etc. This
Xinfluence cannot take the purely static form that block-structured
Xlanguages use to associate values with identifiers, for then an operator
Xcould not influence the appearance of its parameters; and a state
Xvariable solution is not compatible with the overall functional design.
X@PP
XThe information needed from the context seems quite limited, comprising
Xthe font family, face, and size to use, the style of paragraph breaking
Xrequired, how much space to substitute between the words of paragraphs,
Xand how much horizontal and vertical space is available to receive the
Xobject. These four items constitute the so-called `style information'
Xof Lout. As graphics rendering hardware improves, the style information
Xwill probably grow to include colour and texture information.
X@PP
XThe way to deal with fonts at least is very clear:
X@ID @Code "{ Times Slope 12p } @Font { Hello, world }"
Xshould have result
X@ID { { Times Slope 12p } @Font { Hello, world } }
XLout also provides @Code "@Break" and @Code "@Space" symbols for
Xcontrolling the paragraph breaking and space styles mentioned
Xabove. These work in the same way, returning their right
Xparameters in the style of their left. The implementation is very
Xsimple: one merely broadcasts the style information down into the parse
Xtree of the right parameter. A font, for example, is converted to an
X8-bit internal name and stored in each leaf, while a breaking style is
Xstored in the root node of each paragraph.
X@PP
XThe same language design can be used for available width and height,
Xonly here the implementation is much more demanding:
X@ID @Code {
X"2i @Wide {"
X"(1) |0.1i An example"
X"containing a small"
X"paragraph of filled text."
X"}"
X}
Xis guaranteed to be two inches wide:
X@ID {
X2i @Wide {
X(1) |0.1i An example
Xcontaining a small
Xparagraph of filled text.
X}
X}
XOne must calculate that 1.9 inches minus the width of @Code "(1)" is
Xavailable
Xto the paragraph, and break it accordingly; Basser Lout does this in two
Xstages. In the first, upward-moving stage, widths are calculated using the
Xformulae of Section {@NumberOf objects}, which assume that available
Xspace is infinite. If the upward movement reaches a @Eq { WIDE }
Xnode, corresponding to a @Code "@Wide" operator, and
Xthe calculated width exceeds that allowed, a second, downward-moving stage
Xis initiated which attempts to reduce the width by finding and breaking
Xparagraphs. This second stage is quite routine except at @Code "|" nodes,
Xwhose children are the columns of a table. It is necessary to apportion
Xthe available width (minus inter-column gaps) among the columns. Basser
XLout leaves narrow columns unbroken and breaks the remaining columns to
Xequal width, using up all of the available space.
X@PP
XThe size of an object is not clearly determined when the upward-moving
Xsize is less than the downward-moving available space, and the object
Xcontains constructs that depend on available space (e.g. right
Xjustification). For example, in
X@ID @Code "2i @Wide { Heading // a |1rt b }"
Xit seems natural to assign a width of two inches to the subobject
X@Code "a |1rt b" because of the right justification, but it would be
Xequally plausible if the width of @Code Heading was assigned to the
Xsubobject instead. The author is conscious of having failed to resolve
Xthis matter properly; an extra operator for controlling available space
Xis probably necessary.
X@PP
XThe actual paragraph breaking is just a simple transformation on the
Xparse tree; the real issue is how to describe the various styles: ragged
Xright, adjusted, outdented, and so on. Their diversity suggests that
Xthey should somehow be defined using more basic features; but then there
Xare algorithms for high-quality paragraph breaking, which presumably
Xmust be built-in. This dilemma was not clearly grasped by the author in
X1985, and he included a built-in paragraph breaker, with the @Code
X"@Break" operator selecting from a fixed set of styles. A much better
Xsolution based on galleys will be given in Section {@NumberOf horizontal},
Xbut, regrettably, it is not implemented.
X@End @SubSection
END_OF_FILE
if test 4418 -ne `wc -c <'lout/doc/tr.impl/s2.5'`; then
echo shar: \"'lout/doc/tr.impl/s2.5'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.impl/s2.5'
fi
if test -f 'lout/doc/tr.impl/s4.0' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.impl/s4.0'\"
else
echo shar: Extracting \"'lout/doc/tr.impl/s4.0'\" \(4101 characters\)
sed "s/^X//" >'lout/doc/tr.impl/s4.0' <<'END_OF_FILE'
X@Section
X @Tag { functional }
X @Title { Implementation of the functional subset }
X@Begin
X@PP
XThe objects and definitions of Lout are very similar to those found in
Xother functional languages, and they form a natural subset of the
Xlanguage. So we pause here and present an overview of the Basser Lout
Xobject evaluation algorithm.
X@PP
XThe problem is to take an unsized object (pure parse tree), its
Xenvironment (Section {@NumberOf defs.impl}), and its style
X(Section {@NumberOf style}), and to produce a PostScript file for
Xrendering the object on an output device. This file is essentially a
Xsequence of instructions to print a given string of characters in a
Xgiven font at a given point.
X@PP
XBefore the algorithm begins, the parse tree must be obtained, either by
Xparsing input or by copying from the symbol table. Afterwards the data
Xstructure must be disposed. The algorithm proper consists of five
Xpasses, each a recursive traversal of the structure from the root down
Xto the leaves and back.
X@DP
X@I {1. Evaluation of unsized objects.} On the way down, calculate
Xenvironments and replace non-recursive, non-receptive symbols by their
Xbodies (Section {@NumberOf defs.impl}); broadcast fonts to the leaves,
Xand paragraph breaking and spacing styles to the paragraph nodes. On the
Xway back up, delete @Eq { FONT }, @Eq { BREAK }, and @Eq { SPACE } nodes,
Xand insert @Eq { SPLIT }, @Eq { COL }, and @Eq { ROW } nodes
X(Section {@NumberOf objects}).
X@DP
X@I {2. Width calculations and breaking.} Calculate the width of every
Xsubobject from the bottom up. As described in Section {@NumberOf objects},
X@Eq { WIDE } nodes may trigger object breaking sub-traversals during this pass.
X@DP
X@I {3. Height calculations.} Calculate the height of every subobject,
Xfrom the bottom up.
X@DP
X@I {4. Horizontal coordinates.} Calculate the horizontal coordinate of
Xeach subobject from the top down, and store each leaf's coordinate in
Xthe leaf.
X@DP
X@I {5. Vertical coordinates and PostScript generation.} Calculate the
Xvertical coordinate of every subobject from the top down, and at each
Xleaf, retrieve the character string, font, and horizontal coordinate,
Xand print the PostScript instruction for rendering that leaf.
X@DP
XFigure {@NumberOf components} gives the amount of code required for each
X
X@Figure
X @Tag { components }
X @Caption { Major components of the Basser Lout interpreter, showing
Xthe approximate number of lines of C code. }
X@Begin
X@Tab
X vmargin { 0.5vx }
X @Fmta { @Col @RR A ! @Col B ! @Col @RR C }
X @Fmtb { @Col @RR A ! @Col B ! @Col C }
X{
X @Rowa A { 1. } B { Initialization } C { 200 }
X @Rowa A { 2. } B { Memory allocation, ordered dag operations } C { 400 }
X @Rowa A { 3. } B { Lexical analysis, macros, file handling } C { 1,350 }
X @Rowa A { 4. } B { Parsing of objects and definitions } C { 1,150 }
X @Rowa A { 5. } B { Symbol table and call graph } C { 600 }
X @Rowa A { 6. } B { Evaluation of pure parse trees } C { 1,650 }
X @Rowa A { 7. } B { Reading, storing, and scaling of fonts } C { 600 }
X @Rowa A { 8. } B { Cross references and databases } C { 1,000 }
X @Rowa A { 9. } B { Width and height calculations, and breaking } C { 700 }
X @Rowa A { 10. } B { @I Constrained and @I AdjustSize } C { 700 }
X @Rowa A { 11. } B { Transfer of sized objects into galley tree } C { 450 }
X @Rowa A { 12. } B { Galley flushing algorithm } C { 1,500 }
X @Rowa A { 13. } B { Coordinate calculations and PostScript output } C { 700 }
X @Rowa A { 14. } B { Debugging and error handling } C { 1,200 }
X @Rowb vmargin { 0.1c } C { @Line }
X @Rowa C { 12,200 }
X}
X@End @Figure
X
Xpass. Symmetry between horizontal and vertical is exploited throughout
XBasser Lout, and passes 2 and 3, as well as 4 and 5, are executed on
Xshared code.
X@PP
XThe author can see no simple way to reduce the number of passes. The
Xintroduction of horizontal galleys (Section {@NumberOf horizontal})
Xwould remove the need for the object breaking transformations within this
Xalgorithm that are the principal obstacles in the way of the merging of
Xpasses 2 and 3.
X@End @Section
END_OF_FILE
if test 4101 -ne `wc -c <'lout/doc/tr.impl/s4.0'`; then
echo shar: \"'lout/doc/tr.impl/s4.0'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.impl/s4.0'
fi
if test -f 'lout/doc/tr.impl/s5.3' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.impl/s5.3'\"
else
echo shar: Extracting \"'lout/doc/tr.impl/s5.3'\" \(4681 characters\)
sed "s/^X//" >'lout/doc/tr.impl/s5.3' <<'END_OF_FILE'
X@SubSection
X @Tag { constraints }
X @Title { Size constraints and size adjustments }
X@Begin
X@PP
XThe galley flushing algorithm needs to know the available width and
Xheight at each receptive symbol. These symbols may lie within
Xarbitrarily complex objects, and they may compete with each other for
Xavailable space (as body text and footnote targets do), so this
Xinformation must be extracted from the tree structure when required.
X@PP
XFor example, consider the object
X@ID @Code "5i @Wide { a / b }"
Xand suppose that the width of @Code { a } is @Eq { 1i, 2i } (@Eq {1i} to
Xthe left of the mark, @Eq { 2i } to the right). What then is the
Xavailable width at {@Code { b }}? If we let the width of @Code b be
X@Eq {l,r}, we must have
X@ID @Eq { (1i up l) + (2i up r) <= 5i }
Xwith the @Eq {non up } (i.e. max) operations arising from mark
Xalignment. Eliminating them gives
X@ID @Eq {
Xmatrix {
X { 1i + 2i ^<= 5i }
Xmabove { l + 2i ^<= 5i }
Xmabove { 1i + r ^<= 5i }
Xmabove { l + r ^<= 5i }
X}
X}
Xand since we assume that @Code a fits into the available space, the
Xfirst inequality may be dropped, leaving
X@ID @Eq {
Xmatrix {
X { l ^<= 3i }
Xmabove { l + r ^<= 5i }
Xmabove { r ^<= 4i }
X}
X}
XObject @Code b may have width @Eq {l, r} for any @Eq { l } and
X@Eq { r } satisfying these inequalities, and no others.
X@PP
XHere is another example:
X@ID @Code "5i @High { a /2ix b }"
XAssuming that @Code a has height @Eq {1i,1i}, the height @Eq {l, r} of
X@Code b must satisfy
X@ID @Eq { 1i + ((1i + l) up 2i) + r <= 5i }
XThis time the @Eq { non up } operation arises from the mark-to-mark gap
Xmode, which will widen the @Eq { 2i } gap if necessary to prevent
X@Code a and @Code b from overlapping. This inequality can be rewritten as
X@ID @Eq {
Xmatrix {
X { l ^<= infinity }
Xmabove { l + r ^<= 3i }
Xmabove { r ^<= 2i }
X}
X}
XIn general, Lout is designed so that the available width or height at
Xany point can be expressed by three inequalities of the form
X@ID @Eq {
Xmatrix {
X { l ^<= x }
Xmabove { l + r ^<= y }
Xmabove { r ^<= z }
X}
X}
Xwhere @Eq {x }, @Eq {y} and @Eq {z} may be @Eq { infinity }. We
Xabbreviate these three inequalities to @Eq { l, r <= x, y, z }, and we
Xcall @Eq {x, y, z} a {@I{size constraint}}.
X@PP
XThe two examples above showed how to propagate the size constraint
X@Eq { infinity, 5i, infinity } for
X@Code "a / b" down one level to the child {@Code b}. Basser Lout
Xcontains a complete set of general rules for all node types, too
Xcomplicated to give here. Instead, we give just one example of how
Xthese rules are derived, using the object
X@ID {
X@Eq {x sub 1} @Code "/" @Eq {x sub 2} @Code "/" @Eq {ldots} @Code
X"/" @Eq {x sub n}
X}
Xwhere @Eq { x sub j } has width @Eq { l sub j , r sub j } for all @Eq {j}.
X@PP
XSuppose the whole object has width constraint @OneCol @Eq {X,Y,Z}, and we
Xrequire the width constraint of {@Eq { x sub i }}. Let
X@Eq { L = max sub j ` l sub j } and @Eq { R = max sub j ` r sub j },
Xso that @OneCol @Eq {L, R} is the width of the whole object. We assume
X@Eq {L, R <= X,Y,Z}. Then @Eq { x sub i } can be enlarged to any size
X@Eq { l sub i ` , r sub i } satisfying
X@ID @Eq { ( l sub i up L), ( r sub i up R) <= X, Y, Z }
Xwhich expands to eight inequalities:
X@ID @Eq {
Xmatrix {
X { l sub i ^<= X }
Xmabove { L ^<= X }
Xmabove { l sub i + r sub i ^<= Y }
Xmabove { l sub i + R ^<= Y }
Xmabove { L + r sub i ^<= Y }
Xmabove { L + R ^<= Y }
Xmabove { r sub i ^<= Z }
Xmabove { R ^<= Z }
X}
X}
XThree are already known, and slightly rearranging the others gives
X@ID @Eq {
Xmatrix {
X { l sub i ^<= X }
Xmabove { l sub i ^<= Y - R }
Xmabove { l sub i + r sub i ^<= Y }
Xmabove { r sub i ^<= Z }
Xmabove { r sub i ^<= Y - L }
X}
X}
XTherefore the width constraint of @Eq { x sub i } is
X@ID @Eq { min(X, Y-R), Y, min(Z, Y-L) }
XThe size constraint of any node can be found by climbing the tree to a
X@I WIDE or @I HIGH node where the constraint is trivial, then propagating
Xit back down to the node, and this is the function of procedure
X{@I Constrained} in Basser Lout.
X@PP
XAfter some components have been promoted into a target, the sizes stored
Xin its parent and higher ancestors must be adjusted to reflect the
Xincreased size. This is done by yet another set of recursive rules,
Xupward-moving this time, which cease as soon as some ancestor's size
Xdoes not change. These rules are embodied in procedure @I AdjustSize
Xof Basser Lout. The adjustment must be done before relinquishing
Xcontrol to any other galley, but not after every component.
X@End @SubSection
END_OF_FILE
if test 4681 -ne `wc -c <'lout/doc/tr.impl/s5.3'`; then
echo shar: \"'lout/doc/tr.impl/s5.3'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.impl/s5.3'
fi
if test -f 'lout/doc/tr.impl/s5.4' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.impl/s5.4'\"
else
echo shar: Extracting \"'lout/doc/tr.impl/s5.4'\" \(4726 characters\)
sed "s/^X//" >'lout/doc/tr.impl/s5.4' <<'END_OF_FILE'
X@SubSection
X @Tag { lookahead }
X @Title { The limited lookahead problem }
X@Begin
X@PP
XBasser Lout assumes that there will be enough internal memory to hold
Xthe symbol table plus a few pages, but not an entire document. This
Xsection describes the consequent problems and how they were solved.
XOther interpreters, notably interactive editors running on virtual
Xmemory systems, would not necessarily need this assumption.
X@PP
XAlthough Basser Lout can read and format any legal input, its memory
Xconsumption will be optimized when the bulk of the document resides in
Xgalleys whose targets can be identified at the moment they are
Xencountered. Let us take the typical example of a root galley which
Xis a list of pages, a @Code "@BodyText" galley targeted into the
Xpages, @Code "@Chapter" galleys targeted into {@Code "@BodyText"},
Xand @Code "@Section" galleys targeted into the @Code "@Chapter"
Xgalleys:


X@ID @Code {
X"@PageList"
X"//"

X"@BodyText"
X"//"
X"@Chapter {"
X" @Section { ... }"


X" @Section { ... }"
X" ..."
X" @Section { ... }"
X"}"

X"@Chapter {"
X" ..."
X"}"
X}
XBasser Lout is able to read and process such galleys one paragraph at
Xa time (strictly, from one @Code "//" at the outer level of a galley
Xto the next), as we now describe.
X@PP
XWhen the parser encounters the beginning of a galley, like @Code "@Chapter"
Xor {@Code "@Section"}, it initiates a new galley process. The special
Xreceptive symbol @Code "@Input" is substituted for the as yet
Xunread right parameter of the galley. As each paragraph of the right
Xparameter is read, it is deleted from the parse tree and injected into
Xthe galley's {@Code "@Input"}. The galley is then resumed. The parser
Xthus acts as an extra
Xconcurrent process; it has low priority, so that input is read only when
Xthere is nothing else to do. Since galleys may be nested, a stack of
X@Code "@Input" symbols is needed, each with its own environment and
Xstyle. If a galley is encountered for which a target is not immediately
Xidentifiable (a footnote, for example), it is read in its entirety and
Xhung in pure parse tree form from an @I UNATTACHED index in the usual way,
Xwith an environment but without a style. It will be flushed later
Xwhen its component is promoted.
X@PP
XIn addition to producing a steady flow of components from input, we must
Xalso ensure that receptive symbols do not unduly block their
Xpromotion. The @Code "@FootSect" symbol at the foot of each page is a
Xtypical example: until it is deleted the page cannot be printed.
X@PP
XReceptive symbols are expanded only on demand, so @Code "@FootSect" can
Xbe deleted as soon as we can prove that it is not wanted. The symbol
Xtable can tell us that only @Code "@FootNote" galleys (with
X@Code "@FootPlace&&following" targets) want it, so it might be possible
Xto deduce that @Code "@FootSect" may be deleted as soon as body text
Xenters the following page.
X@PP
XThe author was unable to make this work, so Basser Lout requires the
Xuser to identify those galleys which will carry the bulk of the document
X({@Code "@Chapter"}, {@Code "@Section"}, {@Code "@BodyText"}) as
X{@I {forcing galleys}}, by writing @Code "force into" instead of
X@Code "into" in their definitions. As described in the previous
Xsection, when a forcing galley attaches to a target, all receptive
Xsymbols preceding the target in its galley are deleted, removing all
Ximpediments to flushing. For example, when a forcing body text galley
Xenters a new page, the @Code "@FootSect" symbol on the preceding page
Xwill be deleted. It seems likely that a system which could afford to
Xwait until all input was read before deleting any receptive symbols
Xwould not need forcing galleys.
X@PP
XGalleys whose targets are a long way from their invocation points can be
Xa problem. If the direction is {@Code "following"}, such galleys are
Xheld in internal memory for a long time, unless they are to be
Xsorted. If the direction is
X{@Code "preceding"}, then either the entire intervening document must be
Xheld in memory (prevented by the target from flushing), or else some
Xforcing galley prematurely deletes the target, leaving the galley bereft.
X@PP
XThe typical example of the latter case occurs when the galley is an
Xentry in the table of contents, launched backwards from the beginning of
Xa chapter or section. Its target in the table of contents will have
Xbeen deleted long before, to permit the rest of the document to print,
Xso the galley ultimately emerges as an unattached galley promoted out of
Xthe root galley. All such galleys are written to an auxiliary file,
Xindexed by the missing target. On the next run, just before that target
Xis deleted, the auxiliary file is checked and any galleys for it are
Xread in and flushed.
X@End @SubSection
END_OF_FILE
if test 4726 -ne `wc -c <'lout/doc/tr.impl/s5.4'`; then
echo shar: \"'lout/doc/tr.impl/s5.4'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.impl/s5.4'
fi
if test -f 'lout/doc/tr.impl/s5.5' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.impl/s5.5'\"
else
echo shar: Extracting \"'lout/doc/tr.impl/s5.5'\" \(4791 characters\)
sed "s/^X//" >'lout/doc/tr.impl/s5.5' <<'END_OF_FILE'
X@SubSection
X @Tag { horizontal }
X @Title { Horizontal galleys }
X@Begin
X@PP
XThere is a strong analogy between breaking a column of text into
Xpage-sized pieces, and breaking a paragraph into line-sized pieces. In
Xfact, the two differ only in direction: vertical for body text,
Xhorizontal for paragraphs. In this section we define {@I{horizontal
Xgalleys}}, and show how they provide an unlimited number of paragraph
Xbreaking styles, as well as solve some other problems. Regrettably,
Xlack of time has prevented their incorporation into the Basser Lout
Xinterpreter.
X@PP
XImagine a galley whose components are separated by horizontal
Xconcatenation operators instead of vertical ones, perhaps indicated by a
X@Code { horizontally into } clause. Then all object breaking, including
Xparagraph breaking, could be replaced by galley component promotion like
Xthis:
X@ID @Code {
X"def @Paragraph right x"
X"{"
X" def @LinePlace { @Galley }"
X""
X" def @LineList"
X" {"
X" @HExpand @LinePlace"
X" //1vx @LineList"
X" }"
X""
X" def @Par horizontally into { @LinePlace&&preceding }"


X" right x"
X" { x }"
X""

X" @LineList // @Par { 0.2i @Wide {} &0i x &1rt }"
X"}"
X}
XThe @Code "@HExpand" operator, which is a primitive of Basser Lout,
Xhorizontally expands the gaps in its right parameter until the result
Xfills the available space, thus implementing line adjustment, except
Xwhen the parameter contains tabulation gaps like {@Code "&1rt"}, which
Xcause the parameter to be already expanded. The result of
X@ID @Code "@Paragraph { A short paragraph of text. }"
Xwould then be something like
X@ID 1.5i @Wide {
X0.2i @Wide {} & A short paragraph of text.
X}
Xdepending on the available horizontal space. An unlimited range of
Xparagraph breaking styles could be defined, including ragged right, ragged
Xleft, break-and-center, and so on.
X@PP
XIn Basser Lout, indented paragraphs are produced by preceding them with
Xa horizontal concatenation operator, for example {@Code "|0.5i"}. This
Xhas the unfortunate effect of making an indented paragraph into a single
Xcomponent of the enclosing galley, so that it will always be kept
Xtogether on one page. Horizontal galleys solve this problem with a
Xsimple change to {@Code "@LineList"}:
X@ID @Code {
X"def @LineList"
X"{"
X" |0.5i @HExpand @LinePlace"
X" //1vx @LineList"
X"}"
X}
Xshowing the flexibility that comes from bringing the full power of the
XLout language to bear on paragraph layout. It is easy to make provision
Xfor a tag on the first line.
X@PP
XAlthough Basser Lout permits receptive symbols within paragraphs, they
Xare of little use, because their available width is calculated after
Xparagraph breaking, and the incoming galley cannot spread over more than
Xone line. With horizontal galleys, such symbols would have infinite
Xavailable width, and we could easily produce a filled paragraph of
Xfootnotes like this:
X@ID 3.5i @Wide {
X@OneRow { -2p @Font 1 ^/0.3vo } & See Jones and Saunders (1982). &2m
X@OneRow { -2p @Font 2 ^/0.3vo } & Or so Jacobsen (1973) asserts. &2m
X@OneRow { -2p @Font 3 ^/0.3vo } & {@I ibid}, p. 327.
X}
Xbased on an infinite horizontal sequence of @Code "@FootPlace" symbols
Xinside a horizontal galley.
X@PP
XWhen body text is placed on pages, the length of each column varies
Xdepending on the available vertical space. Horizontal galleys could
Xanalogously produce lines of varying length, and so could fill
Xnon-rectangular shapes.
X@PP
XAn important theoretical benefit of horizontal galleys is that they
Xwould permit horizontal and vertical to be treated in a perfectly
Xsymmetrical way, whereas at present paragraph breaking is horizontal
Xonly, and galley breaking is vertical only. This must simplify the
Xtreatment of non-European languages which fill in unusual directions,
Xalthough it is not itself sufficient to implement them.
X@PP
XThere are a few minor problems with horizontal galleys. First, the
Xsyntactic overhead of enclosing each paragraph in @Code "@Paragraph { ... }"
Xor whatever is unacceptable. Permitting user-defined operators to have lower
Xprecedence than the white space between two words might help here. Second,
Xthe built-in paragraph breaker includes hyphenation, and it permits line
Xbreaks in the input to determine line breaks in the output, if
Xdesired. These features must somehow be preserved. Finally, we have
Xexplained how the Basser Lout interpreter assigns equal width to the
Xwider columns of tables (Section {@NumberOf style}). The equivalent
Xsituation in vertical galleys occurs when two receptive symbols compete
Xfor vertical space (e.g. @Code "@TextPlace" and {@Code "@FootSect"}),
Xand there it is conventional to grant as much as required to the first
Xarrival. It is not clear to the author how these different approaches
Xcan be reconciled.
X@End @SubSection
END_OF_FILE
if test 4791 -ne `wc -c <'lout/doc/tr.impl/s5.5'`; then
echo shar: \"'lout/doc/tr.impl/s5.5'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.impl/s5.5'
fi
if test -f 'lout/doc/tr.impl/s6.2' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.impl/s6.2'\"
else
echo shar: Extracting \"'lout/doc/tr.impl/s6.2'\" \(4579 characters\)
sed "s/^X//" >'lout/doc/tr.impl/s6.2' <<'END_OF_FILE'
X@SubSection
X @Tag { cross.impl }
X @Title { Implementation of cross references }
X@Begin
X@PP
XBefore an object can be sized and printed, the values of any cross
Xreferences within it must be known. If they refer to invocations that
Xhave not yet been read, there is a problem. Scribe [7]
Xsolves it by capitalizing on the fact that documents are formatted
Xrepeatedly during the drafting process. All tagged invocations are
Xcopied to an auxiliary file during the first run, and indexed for quick
Xretrieval on the second. A new auxiliary file is written during the second
Xrun, for retrieval on the third, and so on. Cross references always lag
Xone run behind the rest of the document; a perfect copy may be produced
Xby formatting the same version twice, except in a few pathological cases
Xthat fail to converge.
X@PP
XCross referencing in Lout is implemented on top of a simple database
Xsystem. Each database is either writable or readable but not both at
Xonce, and holds a set of key-value entries: the keys are @S ASCII
Xstrings, and the values are Lout objects, possibly with environments,
Xwritten in Lout source. Operations are provided for writing an entry,
Xconverting from writable to readable, retrieval by key, and sequential
Xretrieval in key order.
X@PP
XThe implementation, which is quite unsophisticated, employs one or more
X@S ASCII {@I{ database files}}, containing the values, and one @S ASCII
X{@I{ index file}} per database, containing the keys. To write an entry,
Xthe value is first appended to a database file, then a line like
X@ID @Code "@Chapter&&intro ch1.ld 57"
Xis appended to the index file, giving the file and offset where the value
Xis stored. To convert from writable to readable, the index file is
Xsorted. Then retrieval by key requires a binary search of the index
Xfile and one seek into a database file, and sequential retrieval by key
Xis trivial.
X@PP
XThis database system is used in several ways. For an external database,
Xsay of bibliographic references, the user creates the database file of
Xvalues (without environments), Lout creates the index file whenever it
Xcannot find one, and retrievals by key proceed as usual. Cross
Xreferences with tags other than @Code preceding and @Code following are
Xtreated as described above, by writing all tagged invocations (with
Xenvironments) to a single database, which is converted to readable at
Xthe end of the run for retrievals on the next run. Sorted galleys, such
Xas index entries, are written out indexed by target and key and retrieved
Xsequentially on the next run. Unsorted galleys with preceding targets
Xwhich pop off the top of the root galley without finding a target, such
Xas entries in tables of contents, are treated similarly, except that they
Xare indexed by target and a sequence number that preserves their relative
Xorder during the sort.
X@PP
XWhen Lout processes a multi-file document, one cross reference database
Xfile is written for each input file, but they share a common index
Xfile. At end of run, the new index file is sorted and merged with the
Xold one in such a way as to preserve entries relating to files not read
Xon the current run. This provides some support for piecemeal
Xformatting, but eventually the files must all be formatted together.
X@PP
XWhen a @Code preceding or @Code following cross reference is found,
Xit is attached to a galley index of type @Eq { CROSS_PREC } or
X{@Eq { CROSS_FOLL }}, together with an automatically generated tag composed
Xof the current file name and a sequence number. When a tagged
Xinvocation is found, it is attached to a @Eq { CROSS_TARG } index. These
Xgalley indexes are carried along through the dynamic tree, and
Xeventually pop off the top of the root galley, at which point it is easy
Xto determine which cross references refer to which invocations, since
Xthe indexes are now in final printed document order. Each referenced
Xinvocation is then written to the cross reference database, multiply indexed
Xby the generated tags of the associated cross references. On the next
Xrun, when the same @Code preceding and @Code following cross references
Xare found, chances are good that the same tags will be generated, and
Xthe appropriate values can be retrieved from the database immediately.
X@PP
XThis approach was the genesis of the @Code "@Tagged" operator, whose
Ximplementation is now immediate: for each @Code "@Tagged" operator we
Xproduce one @Eq { CROSS_PREC } or @Eq { CROSS_FOLL } galley index,
Xreplacing the generated tag with the right parameter of the @Code "@Tagged"
Xoperator. Nothing more is required.
X@End @SubSection
END_OF_FILE
if test 4579 -ne `wc -c <'lout/doc/tr.impl/s6.2'`; then
echo shar: \"'lout/doc/tr.impl/s6.2'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.impl/s6.2'
fi
if test -f 'lout/doc/tr.over/s4' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.over/s4'\"
else
echo shar: Extracting \"'lout/doc/tr.over/s4'\" \(5064 characters\)
sed "s/^X//" >'lout/doc/tr.over/s4' <<'END_OF_FILE'
X@Section
X @Title { Definitions }
X@Begin
X@PP
XLout permits the user to define operators which take objects as
Xparameters and return objects as results. This feature, unremarkable
Xin itself, has some surprising applications, most notably to a problem
Xwhich is the litmus test of flexibility in document formatting: the
Xspecification of page layout.
X@PP
XThe use of operators in document formatting seems to have been pioneered
Xby the eqn equation formatting language of Kernighan and Cherry
X[{@Ref kernighan75}]. In eqn, the mathematical formula
X@ID @Eq { { x sup 2 + 1 } over 4 }
Xfor example is expressed as
X@ID @Code "{ x sup 2 + 1 } over 4"
XThis identical expression is also used in Lout, but in Lout the operators
X({@Code "sup"}, {@Code over} and so on) have visible definitions which
Xare easy to modify and extend.
X@PP
XFor example, here is the definition of the @Code over operator as it
Xappears in the Eq equation formatting package [{@Ref kingston92eq}]:


X@ID @Code {
X"def over"
X" precedence 54"
X" associativity left"
X" left x"

X" right y"
X"{"
X" @OneRow @OneCol"
X" {"
X" |0.5rt x"
X" ^//0.2f @HLine"
X" //0.2f |0.5rt y"
X" }"
X"}"
X}
XInvokations of @Code over return the object between the braces, with the
Xformal parameters @Code x and @Code y replaced by actual parameters
Xwhich are objects found to the left and right of the @Code over symbol.
X@PP
XThe body of @Code over makes a good demonstration of the way in which
XLout's operators combine together. All are Lout primitives except
X{@Code "@HLine"}, which calls upon Lout's graphics primitives to draw a
Xhorizontal line. The @Code "//" and @Code "^//" operators are variants
Xof vertical concatenation which omit mark alignment; the separation
Xis 0.2 times the current font size. The two @Code "|0.5rt" operators
Xcenter each parameter in the column. Finally, the @Code "@OneRow" and
X@Code "^//" operators work together to ensure that only one horizontal
Xmark protrudes, rather than three; the result has the structure
X@ID @ShowMarks @Eq { { x sup 2 + 1 } over 4 }
Xand so will be aligned correctly with adjacent parts of the equation.
X@PP
XAs is usual in functional languages, sequences are obtained by recursive
Xdefinitions. For example, the `leaders' often seen in tables of
Xcontents can be generated by the definition
X@ID @Code {
X"def @Leaders"
X"{"


X" .. @Leaders"
X"}"
X}

XWhite space after @Code "{" and before @Code "}" is not
Xsignificant. The recursion stops when space runs out, so
X@ID @Code {
X"1.5i @Wide {"
X"Chapter 1 @Leaders 5"
X"}"
X}
Xhas result
X@ID {
X1.5i @Wide {
XChapter 1 @Leaders 5
X}
X}
XThe final invokation of @Code "@Leaders" is deleted along with any
Xpreceding concatenation operator (or white space in this case).
X@PP
XThe specification of page layout is a major problem for many document
Xformatters, because the model of a document as a sequence of pages is
Xbuilt-in, and an armada of tedious commands is required to communicate
Xwith this model: commands for setting page width and height, margins,
Xcolumns, page header and footer lines, and so on. Even with all these
Xcommands, the formatter will be unable to do such a simple thing as draw
Xa box around each page, if there is no command for it.
X@PP
XLout has no built-in model and no such commands. Instead, a page is an
Xobject like any other:


X@ID @Code {
X"def @Page"

X" right x"
X"{"


X" 8i @Wide 11i @High"
X" {"
X" //1i ||1i x ||1i"
X" //1i"
X" }"

X"}"
X}
XThe result of @Code "@Page" is an eight by eleven inch object containing
Xthe right parameter within one inch margins. A document is a vertical
Xconcatenation of numbered pages:


X@ID @Code {
X"def @PageList"

X" right @PageNum"
X"{"
X" @Page"
X" {"


X" |0.5rt - @PageNum -"

X" //0.2i @TextPlace"
X" //1rt @FootSect"
X" }"
X" //0i"
X" @PageList"


X" @Next @PageNum"
X"}"
X}

XThe @Code "@Next" operator is a Lout primitive that returns its right
Xparameter plus one; all automatic numbering is effected by combining
Xthis operator with recursion. The result of @Code "@PageList 1" is
Xthe object


X@ID {
X@LittlePage {
X|0.5rt - 1 -
X//1.2vx @Code "@TextPlace"
X//1rt @Code "@FootSect"
X}
X//
X@LittlePage {
X|0.5rt - 2 -
X//1.2vx @Code "@TextPlace"
X//1rt @Code "@FootSect"
X}
X//0.2c
X8p @Font @Code "@PageList 3"
X}

Xwhich has the potential to expand to infinitely many pages.
X@PP
XWe conclude this example by defining @Code "@FootSect" to be a small
Xhoriz&-ontal line above a list of @Code "@FootPlace" symbols:
X@IL
X@LI @Code {


X"def @FootList"
X"{"
X" @FootPlace"

X" //0.1i @FootList"
X"}"
X}
X@LI @Code {
X"def @FootSect"


X"{"
X" 1i @Wide @HLine"

X" //0.1i @FootList"
X"}"
X}
X@EL
XThis method of specifying page layout is infinitely more flexible than
Xthe other, since the full resources of the language may be brought to
Xbear. Of course, the {@Code "@PageList"}, {@Code "@FootSect"}, and
X{@Code "@FootList"} symbols must be expanded only on demand, and we have
Xyet to see how the {@Code "@TextPlace"} and {@Code "@FootPlace"} symbols
Xcan be replaced by actual text and footnotes.
X@End @Section
END_OF_FILE
if test 5064 -ne `wc -c <'lout/doc/tr.over/s4'`; then
echo shar: \"'lout/doc/tr.over/s4'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.over/s4'
fi
if test -f 'lout/doc/tr.over/s5' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.over/s5'\"
else
echo shar: Extracting \"'lout/doc/tr.over/s5'\" \(4210 characters\)
sed "s/^X//" >'lout/doc/tr.over/s5' <<'END_OF_FILE'
X@Section
X @Title { Galleys }
X@Begin
X@PP
XThe fundamental problem with inserting text, footnotes, and floating
Xfigures into pages is that the process seems impossible to describe in
Xfunctional terms. A footnote is entered within a paragraph of text, but
Xit appears somewhere else: at the foot of a page. Some new abstraction
Xis needed to explain this.
X@PP
XThe landscape of features that previous document formatting systems have
Xintro&-duced at this point can best be described metaphorically, as an
Xantediluvian swamp populated by dinosaurs and demons, whose air is
Xfilled with the piteous cries of docu&-ment format designers in torment.
X@PP
XLout's solution to this problem is a feature called the @I galley, after
Xthe metal trays used in manual typesetting. A galley consists of an
Xobject plus an indication that the object is to appear somewhere other
Xthan its invokation point. For example,
X@ID {
X@LittlePageList 1
X// @LittleEndRunPlace
X//
X@LittleText {
X@Heading { Galleys }
X@PP
XThe fundamental problem with inserting text, footnotes, and floating
Xfigures into pages is that the process seems impossible to describe in
Xfunctional terms. A footnote is entered within a para&-graph of text, but
Xit appears somewhere else: at the foot of a page. Some new abstraction
Xis needed to explain this.
X}
X//
X@LittleEndRun
X}
Xis the result of the expression
X@ID @Code {
X"@PageList 1"
X"//"
X"@Text {"
X"@Heading { Galleys }"
X"@PP"
X"The fundamental ..."
X"... to explain this."
X"}"
X}
XThe only new definitions required are these:


X@ID @Code {
X"def @TextPlace { @Galley }"
X""
X"def @Text"

X" into { @TextPlace&&preceding }"


X" right x"
X"{ x }"
X}

XThey say that @Code "@TextPlace" (which the reader will recall as lying
Xwithin the pages of {@Code "@PageList"}) is a placeholder for an
Xincoming galley, and that @Code "@Text" is a galley whose result is to
Xappear, not where @Code "@Text" is invoked, but rather at some
X@Code "@TextPlace" preceding that point of invokation in the final
Xprinted document.
X@PP
XAlthough the abstraction can be understood in a static way, it is
Xhelpful to trace what happens when the Basser Lout batch formatter reads
Xthe expression above.
X@PP
XSince @Code "@PageList 1" indirectly con&-tains the special @Code "@Galley"
Xsymbol, it will be expanded only upon demand. The discovery of the
X@Code "@Text" galley initiates a search for a {@Code "@TextPlace"},
Xwhich is found within {@Code "@PageList 1"} and so forces one such
Xexpansion. The available width at this @Code "@TextPlace" is six
Xinches, so the @Code "@Text" galley is broken into six-inch components
Xwhich are promoted one by one until the available height (nine inches)
Xis exhausted. Since the @Code "@Text" galley is not entirely consumed,
Xa forward search of the docu&-ment is made, another @Code "@TextPlace" is
Xfound within the as yet unexpanded {@Code "@PageList 2"}, and the
Xprocess is repeated.
X@PP
XThe treatment of footnotes is the same, except that


X@ID @Code {
X"def @FootNote"

X" into { @FootPlace&&following }"
X}
Xis used to make the footnote appear later in the finished document than its
Xinvokation point. Basser Lout suspends the promotion of text into pages
Xjust after the component containing the footnote's invokation point is
Xpromoted, switches to the placement of the footnote galley, then resumes
Xthe body text.
X@PP
XA collection of galleys all targeted to the same place may optionally
Xappear sorted on a designated key, thus implementing sorted reference
Xlists and indexes. The author was obliged to make the sorting option a
Xprimitive feature, since it otherwise seems to require boolean operators
Xwhich he preferred to exclude.
X@PP
XThe @Code "@PageList" object which receives the @Code "@Text" galley
Xcan itself be viewed as a galley whose components are pages, and this
Xleads to a dynamic view of Lout document assembly as a tree of galleys, each
Xpromoting into its parent, with the root galley promoting into the
Xoutput file. For example, the BookLayout package [{@Ref kingston92begin}]
Xhas @Code "@Section" galleys promoting into @Code "@Chapter" galleys
Xpromoting into a single @Code "@PageList" galley, which promotes into
Xthe output; no limit is imposed on the height of the tree.
X@End @Section
END_OF_FILE
if test 4210 -ne `wc -c <'lout/doc/tr.over/s5'`; then
echo shar: \"'lout/doc/tr.over/s5'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.over/s5'
fi
if test -f 'lout/doc/tr.tab/s6' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.tab/s6'\"
else
echo shar: Extracting \"'lout/doc/tr.tab/s6'\" \(4698 characters\)
sed "s/^X//" >'lout/doc/tr.tab/s6' <<'END_OF_FILE'
X@Section
X @Title { Rules, boxes, multi-page tables, etc. }
X@Begin
X@PP
XTab draws four kinds of rules. @I {Above rules} go across the table
Xabove a specified row; @I {below rules} go across the table below a
Xrow. @I {Between rules} go down the table between any two columns, but
Xnot before the first or after the last; and @I { side rules } go down
Xthe two sides:
X@ID @Code {
X"@Tab"
X" above { no }"
X" below { yes }"
X" between { single }"
X" side { double }"
X" @Fmta { ... }"
X"..."
X}
XEach option may have the value @Code no (no rules), @Code yes or
X@Code single (draw single rules), or @Code double (draw double
Xrules). Omitting an option is equivalent to giving it the value
X{@Code no}. A rule below one row exactly overstrikes a rule above the
Xnext, unless a page break intervenes.
X@PP
XThese options to @Code "@Tab" will draw all possible rules of the given
Xtype. If only some are wanted, there are {@Code above} and
X{@Code below} options (but no {@Code side} option) for each row symbol:
X@ID @Code {
X"@Rowf"
X" above { yes }"
X" below { double }"
X" A { ... }"
X" ..."
X}
Xand there is a @Code between option for the @Code "!" symbol that
Xseparates columns in the format options:
X@ID @Code "@Col A ! between { double } @Col B"
XThe symbols @Code "!!" and @Code "!!!" are abbreviations for
X@Code "! between { single }" and {@Code "! between { double }"}. All
Xthese options override the corresponding @Code "@Tab" options when they
Xare present; when they are absent, the @Code "@Tab" options hold sway.
X@PP
XIt is not hard to assemble a single box around a table, using side
Xrules, a rule above the first row, and a rule below the last:
X@ID @Code {
X"@Tab"
X" side { single }"
X"{"
X" @Rowa above { single } ..."
X" ..."
X" @Rowj below { single } ..."
X"}"
X}
XDouble boxes around a table should be assembled using the following recipe:
X@ID @Code {
X"@Tab"
X" side { double }"
X"{"
X" @Rowa above { doubleboxabove } ..."
X" ..."
X" @Rowj below { doubleboxbelow } ..."
X"}"
X}
XThis is a little tedious, but the result is good.
X@PP
XThe symbols @Code "@Line" and @Code "@DoubleLine" produce horizontal
Xsingle and double lines of the width of the column. Two other symbols,
X@Code "@Rule" and {@Code "@DoubleRule"}, produce lines which extend into
Xthe adjacent margins as well. For example,
X@CD {
X@Tab
X @Fmta { @Col A }
X{
X @Rowa A { 5^.46 }
X @Rowa A { 128^.2 }
X @Rowa A { 3^.4159 }
X @Rowa A { 5772^ }
X @Rowa A { @Line } vmargin { 0i }
X @Rowa A { 5909^.0759 }
X}
X}
Xis produced by
X@ID @Code {
X"@Tab"
X" @Fmta { @Col A }"
X"{"
X" @Rowa A { 5^.46 }"
X" @Rowa A { 128^.2 }"
X" @Rowa A { 3^.4159 }"
X" @Rowa A { 5772^ }"
X" @Rowa A { @Line } vmargin { 0i }"
X" @Rowa A { 5909^.0759 }"
X"}"
X}
XOwing to problems behind the scenes, @Code "@Rule" and @Code "@DoubleRule"
Xfail in aligned columns.
X@PP
XThe @Code "@Tab" symbol has a @Code "linewidth" option which determines
Xthe thickness of all the lines:
X@ID @Code {
X"@Tab"
X" linewidth { 0.5 pt }"
X}
Xshows the default value, 0.5 points. This cannot be overridden within
Xthe table. Double rules are drawn with their centres three line widths
Xapart. Tab thinks that rules and double rules occupy no space, so thick
Xrules may require larger margins.
X@PP
XThe tables produced by Tab permit page breaks between any two rows. The
Xchoice of page breaks can either be left to Lout, or it can be forced by
Xplacing the new page symbol @Code "@NP" between two rows. To
Xensure that each part of a multi-page table is boxed, the rows preceding
Xthe page breaks must have @Code below rules, and the rows following them
Xmust have @Code above rules. The @Code "@IndentedDisplay" and
X@Code "@CentredDisplay" symbols of the DocumentLayout package prevent
Xpage breaks in the thing displayed, so they cannot be used to display
Xmulti-page tables; a multi-page table should be displayed at the left
Xmargin by preceding and following it with {@Code "@DP"}. To prevent
Xpage breaks within a small table, either use one of the
Xdisplay symbols just mentioned or else use @Code "@OneRow @Tab ...".
X@PP
XThe @Code "@HAdjust" symbol from standard Lout can be used to widen a
Xtable's columns until it occupies the full column width. The
Xrecommended arrangement is
X@ID @Code {
X"@DP"
X"@HAdjust @Tab"
X" ..."
X"@DP"
X}
Xsince @Code "@HAdjust" is not effective within displays.
X@PP
XExpert users might occasionally find a use for the @Code "@MarkRow"
Xsymbols. There is one of them for each @Code "@Row" symbol
X({@Code "@MarkRowa"} for {@Code "@Rowa"}, etc.). A @Code "@MarkRow"
Xsymbol causes the principal mark of the table to pass through that row,
Xpermitting its alignment with horizontally adjacent objects.
X@End @Section
END_OF_FILE
if test 4698 -ne `wc -c <'lout/doc/tr.tab/s6'`; then
echo shar: \"'lout/doc/tr.tab/s6'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.tab/s6'
fi
if test -f 'lout/include/book' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/include/book'\"
else
echo shar: Extracting \"'lout/include/book'\" \(4131 characters\)
sed "s/^X//" >'lout/include/book' <<'END_OF_FILE'
X
X###############################################################################
X# #
X# Setup file for invoking @DocumentLayout for books #
X# #
X# Jeffrey H. Kingston #
X# 22 December 1992 #
X# #
X###############################################################################


X
X@SysInclude { ft }
X@SysInclude { dl }

X# @SysInclude { eq }
X# @SysInclude { tab }
X# @SysInclude { pas }
X# @SysInclude { fig }
X
X@Use { @DocumentLayout
X # @InitialFont { Times Base 12p } # initial font
X # @InitialBreak { adjust 1.20fx } # initial break
X # @Hyphenate { Yes } # Want hyphenation? Yes or No
X # @MajorHeadingFont { Bold 2.0f } # font for major headings
X # @HeadingFont { Bold } # font for ordinary headings
X # @MinorHeadingFont { Bold } # font for minor headings
X # @BookCoverFont { Helvetica Base } # font for book cover
X
X # @ParaGap { 1.30vx } # gap between paragraphs
X # @ParaIndent { 2.00f } # paragraph first-line indent
X
X # @DispGap { 1.00v } # gap above and below displays
X # @DispIndent { 2.00f } # @IndentedDisplay indent
X # @DefaultIndent { 0.5rt } # @Display indent
X # @WideIndent { 4.00f } # @WideTaggedList indent
X # @VeryWideIndent { 8.00f } # @VeryWideTaggedList indent
X
X # @PageWidth { 21.00c } # width of page
X # @PageHeight { 29.70c } # height of page
X # @PageMargin { 2.50c } # size of all four margins
X # @Columns { Single } # Single, Double, Multi
X # @DoubleColWidth { 7.50c } # column width used by Double
X # @MultiColWidth { 4.67c } # column width used by Multi
X # @ColGap { 1.00c } # gap between columns
X # @TopGap { 0.75c } # gap between figures
X # @MidGap { 0.75c } # gap above and below body text
X
X # @FootNoteFont { 0.80f } # font for footnotes
X # @FootNoteBreak { 1.20fx } # break for footnotes
X # @FootLen { 2.00c } # footnote line and indent size
X # @ColFootLen { 1.20c } # @FootLen when Double, Multi
X # @FootGap { 0.20c } # gap between footnotes
X
X @MakeIndex { Yes } # Want index? Yes or No
X # @IndexColumns { Double } # Single, Double, Multi
X
X @TableOfContents { Yes } # Want contents? Yes or No
X # @MajorContentsGap { 1.30v } # gap above major entry
X # @ContentsGap { 1.00v } # gap above ordinary entry
X
X # @ChapterNumbers { Yes } # Yes or No
X # @SectionNumbers { Yes } # Yes or No
X # @SubSectionNumbers { Yes } # Yes or No
X # @AppendixNumbers { Yes } # Yes or No
X # @SubAppendixNumbers{ Yes } # Yes or No
X # @ChapterGap { 1.10b } # gap before each chapter
X # @SectionGap { 2.00v } # gap before each section
X # @SubSectionGap { 1.50v } # gap before each subsection
X @AppendixGap { 1.10b } # gap before each appendix
X # @SubAppendixGap { 2.00v } # gap before each subappendix
X
X # @PageNumbers { Yes } # Want page numbers? Yes or No
X # @FirstPageNumber { 1 } # Number of first page
X # @PageOneTopFormat { @Null }
X # @PageOneFootFormat { @Null }
X # @PageTopFormat { |0.5rt - @PageNum - }
X # @PageFootFormat { @Null }


X @BookTitleFormat { {Bold 2.0f} @Font {//2.0f @Title //0.5f} }
X}

END_OF_FILE
if test 4131 -ne `wc -c <'lout/include/book'`; then
echo shar: \"'lout/include/book'\" unpacked with wrong size!
fi
# end of 'lout/include/book'
fi
if test -f 'lout/include/report' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/include/report'\"
else
echo shar: Extracting \"'lout/include/report'\" \(4110 characters\)
sed "s/^X//" >'lout/include/report' <<'END_OF_FILE'
X
X###############################################################################
X# #
X# Setup file for invoking @DocumentLayout for technical reports #
X# #
X# Jeffrey H. Kingston #
X# 22 December 1992 #
X# #
X###############################################################################


X
X@SysInclude { ft }
X@SysInclude { dl }

X# @SysInclude { eq }
X# @SysInclude { tab }
X# @SysInclude { pas }
X# @SysInclude { fig }
X
X@Use { @DocumentLayout
X # @InitialFont { Times Base 12p } # initial font
X # @InitialBreak { adjust 1.20fx } # initial break
X # @Hyphenate { Yes } # Want hyphenation? Yes or No
X # @MajorHeadingFont { Bold 2.0f } # font for major headings
X # @HeadingFont { Bold } # font for ordinary headings
X # @MinorHeadingFont { Bold } # font for minor headings
X # @BookCoverFont { Helvetica Base } # font for book cover
X
X # @ParaGap { 1.30vx } # gap between paragraphs
X # @ParaIndent { 2.00f } # paragraph first-line indent
X
X # @DispGap { 1.00v } # gap above and below displays
X # @DispIndent { 2.00f } # @IndentedDisplay indent
X # @DefaultIndent { 0.5rt } # @Display indent
X # @WideIndent { 4.00f } # @WideTaggedList indent
X # @VeryWideIndent { 8.00f } # @VeryWideTaggedList indent
X
X # @PageWidth { 21.00c } # width of page
X # @PageHeight { 29.70c } # height of page
X # @PageMargin { 2.50c } # size of all four margins
X # @Columns { Single } # Single, Double, Multi
X # @DoubleColWidth { 7.50c } # column width used by Double
X # @MultiColWidth { 4.67c } # column width used by Multi
X # @ColGap { 1.00c } # gap between columns
X # @TopGap { 0.75c } # gap between figures
X # @MidGap { 0.75c } # gap above and below body text
X
X # @FootNoteFont { 0.80f } # font for footnotes
X # @FootNoteBreak { 1.20fx } # break for footnotes
X # @FootLen { 2.00c } # footnote line and indent size
X # @ColFootLen { 1.20c } # @FootLen when Double, Multi
X # @FootGap { 0.20c } # gap between footnotes
X
X # @MakeIndex { No } # Want index? Yes or No
X # @IndexColumns { Double } # Single, Double, Multi
X
X # @TableOfContents { No } # Want contents? Yes or No
X # @MajorContentsGap { 1.30v } # gap above major entry
X # @ContentsGap { 1.00v } # gap above ordinary entry
X
X # @ChapterNumbers { Yes } # Yes or No
X # @SectionNumbers { Yes } # Yes or No
X # @SubSectionNumbers { Yes } # Yes or No
X # @AppendixNumbers { Yes } # Yes or No
X # @SubAppendixNumbers{ Yes } # Yes or No
X # @ChapterGap { 1.10b } # gap before each chapter
X # @SectionGap { 2.00v } # gap before each section
X # @SubSectionGap { 1.50v } # gap before each subsection
X # @AppendixGap { 2.00v } # gap before each appendix
X # @SubAppendixGap { 2.00v } # gap before each subappendix
X
X # @PageNumbers { Yes } # Want page numbers? Yes or No
X # @FirstPageNumber { 1 } # Number of first page
X # @PageOneTopFormat { @Null }
X # @PageOneFootFormat { @Null }
X # @PageTopFormat { |0.5rt - @PageNum - }
X # @PageFootFormat { @Null }
X # @BookTitleFormat { Bold @Font @Title }
X}
END_OF_FILE
if test 4110 -ne `wc -c <'lout/include/report'`; then
echo shar: \"'lout/include/report'\" unpacked with wrong size!
fi
# end of 'lout/include/report'
fi
echo shar: End of archive 27 \(of 30\).
cp /dev/null ark27isdone

Jeff Kingston

unread,
Jun 1, 1993, 11:06:26 PM6/1/93
to
Submitted-by: je...@joyce.cs.su.oz.au (Jeff Kingston)
Posting-number: Volume 37, Issue 126
Archive-name: lout/part28
Environment: UNIX

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: lout/doc/tr.begin/s04 lout/doc/tr.begin/s13
# lout/doc/tr.begin/s15 lout/doc/tr.impl/s2.1 lout/doc/tr.impl/s2.2
# lout/doc/tr.impl/s6.1 lout/doc/tr.impl/s7.0
# lout/doc/tr.lout/ch1.03 lout/doc/tr.lout/ch2.04
# lout/doc/tr.lout/ch3.03 lout/doc/tr.lout/ch3.04
# lout/doc/tr.over/s1 lout/doc/tr.over/s3 lout/doc/tr.over/setup
# lout/doc/tr.tab/s2 lout/doc/tr.tab/s4 lout/doc/tr.tab/s7
# lout/include/doc lout/include/pas lout/include/tab_prepend
# lout/man/lout.1


# Wrapped by kent@sparky on Sun May 30 19:44:02 1993
PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 28 (of 30)."'
if test -f 'lout/doc/tr.begin/s04' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.begin/s04'\"
else
echo shar: Extracting \"'lout/doc/tr.begin/s04'\" \(2847 characters\)
sed "s/^X//" >'lout/doc/tr.begin/s04' <<'END_OF_FILE'
X@Section
X @Tag { fonts }
X @Title { Fonts and unusual characters }
X@Begin
X@PP
XThis section explains how to gain access to the many different fonts and
Xunusual characters available with Lout.
X@PP
XWe are already familiar with the @Code "@I" symbol, which changes the font
Xof the following thing to {@I Italic}. Similarly, there is @Code "@B" for
X{@B Bold}, @Code "@S" for @S SMALL {@S CAPITALS},
X@FootNote {
XOwing to problems behind the scenes, if several words are grouped within one
X@Code "@S" symbol they will be kept together on one line, so to get small
Xcapitals over several lines it is necessary to apply @Code "@S" to each
Xword individually. This does not happen with other font symbols.
X}
Xand @Code "@R" for Roman.
X@PP
XThe @Code "@Font" symbol can be used to get many other fonts (a local
Xexpert should be able to supply the full list):
X@ID @Code {
X"{ Helvetica Slope } @Font Hello"
X"{ Courier Base } @Font { Hello there }"
X}
Xhas result
X@ID {
X{ Helvetica Slope } @Font Hello
X{ Courier Base } @Font { Hello there }
X}
XEach font has a family name, such as Times, Helvetica, or Courier, and a
Xface name, generally Base, Slope, or Bold. The fonts that were
Xcalled Roman, Italic, and Bold above are Times Base, Times Slope, and
XTimes Bold. When changing families the new family and a face must be
Xspecified, but when changing face within a family just the face name is
Xenough.
X@PP
XThe @Code "@Font" symbol also changes sizes:
X@ID @Code {
X"+5p @Font Hello"
X"-3p @Font Hello"
X"12p @Font Hello"
X}
Xhas result
X@ID {
X+5p @Font Hello -3p @Font Hello 12p @Font Hello
X}
Xwith the first Hello 5 points larger than it would have been otherwise,
Xthe second 3 points smaller, and the third in a 12 point font. There are
X72 points to one inch, and most documents are set in 10 or 12 point.
X@PP
XThere are symbols for some unusual characters that do not appear
Xon keyboards:
X@ID {
X @Code "--" |0.35i --
X/1vx @Code "---" | ---
X/1vx @Code "@Bullet" | @Bullet
X/1vx @Code "@Star" | @Star
X/1vx @Code "@ParSym" | @ParSym
X/1vx @Code "@SectSym" | @SectSym
X/1vx @Code "@Dagger" | @Dagger
X/1vx @Code "@DaggerDbl" | @DaggerDbl
X/1vx @Code "@CDot" | @CDot
X/1vx @Code "@Sterling" | @Sterling
X/1vx @Code "@Yen" | @Yen
X/1vx @Code "@Florin" | @Florin
X/1vx @Code "@Degree" | @Degree
X/1vx @Code "@Minute" | @Minute
X/1vx @Code "@Second" | @Second
X/1vx @Code "@Lozenge" | @Lozenge
X/1vx @Code "@Multiply" | @Multiply
X/1vx @Code "@Divide" | @Divide
X/1vx @Code "@CopyRight" | @CopyRight
X/1vx @Code "@Register" | @Register
X/1vx @Code "@TradeMark" | @TradeMark
X/1vx @Code "@Date" | @Date
X}
XThese may be used anywhere. The Adobe Systems Symbol font has many more such
Xcharacters; the Eq equation formatting package [{@Ref kingston92eq}] has
Xthe complete list. For example, @Code "@Eq { heart }" will give @Eq { heart }.
X@End @Section
END_OF_FILE
if test 2847 -ne `wc -c <'lout/doc/tr.begin/s04'`; then
echo shar: \"'lout/doc/tr.begin/s04'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.begin/s04'
fi
if test -f 'lout/doc/tr.begin/s13' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.begin/s13'\"
else
echo shar: Extracting \"'lout/doc/tr.begin/s13'\" \(2988 characters\)
sed "s/^X//" >'lout/doc/tr.begin/s13' <<'END_OF_FILE'
X@Section
X @Tag { reportlayout }
X @Title { Technical reports }
X@Begin
X@PP
XThis section describes how to use the DocumentLayout package to produce
Xtechnical reports like the present document. Type @Code "-ireport" in
Xthe Unix command instead of @Code "-idoc" to use the package in this
Xway. We present only the differences here; everything else works as
Xbefore.
X@PP
XA technical report begins with a @Code "@Report" symbol analogous to the
X@Code "@Document" symbol described in the previous section. Here it is,
Xwith its nine options and their default values:
X@ID @Code {
X"@Report"
X" @Title {}"
X" @Author {}"
X" @Institution {}"
X" @DateLine { @Date }"
X" @InitialFont { Times Base 12p }"


X" @InitialBreak { adjust 1.2fx }"
X" @Hyphenate { Yes }"

X" @PageNumbers { Yes }"
X" @Columns { Single }"
X"//"
X}
XThe {@Code "@Title"}, {@Code "@Author"}, and {@Code "@Institution"} options
Xwill be printed on the cover sheet and on the first page; they are formatted
Xusing {@Code "clines @Break"} (see page {@PageOf clines}). Multiple authors
Xshould be given on separate lines within the @Code "@Author"
Xoption. {@Code "@DateLine"} appears below the abstract on the cover sheet,
Xand its default value is the current date as shown. {@Code "@InitialFont"},
X{@Code "@InitialBreak"}, {@Code "@Hyphenate"}, {@Code "@PageNumbers"} and
X{@Code "@Columns"} are as described in the last section, except that there
Xis nothing analogous to @Code "@Text" and {@Code "@ColText"}: if
X@Code "@Columns" is set to {@Code Double}, the entire document after the
Xtitle will be set in two columns. There is no @Code "@FirstPageNumber"
Xoption. As for {@Code "@Document"}, the symbol @Code "//" must follow
Xafter, and disaster will ensue if it is omitted.
X@PP
XIf the technical report has an abstract, it comes next:
X@ID @Code {
X"@Abstract @Begin"
X"..."
X"..."
X"@End @Abstract"
X}
XThe cover sheet of the present report shows how this will
Xappear. @Code "@Abstract" has a @Code "@Title" option like the ones
Xbelow; its default value is {@I ABSTRACT}.
X@PP
XNext come the sections of the report, each enclosed in a @Code
X"@Section" symbol:
X@ID @Code {


X"@Section"
X" @Title { Introduction }"
X"@Begin"
X"@PP"
X"..."
X"..."
X"@End @Section"
X}

XNo @Code "@BeginSections" or @Code "@EndSections" symbols are needed.
X The sections may contain subsections, preceded as usual by
X@Code "@BeginSubSections" and followed by {@Code "@EndSubSections"}.
X After the sections there is opportunity for a sequence of appendices,
Xeach of the form
X@ID @Code {
X"@Appendix"


X" @Title { ... }"
X"@Begin"
X"@PP"
X"..."

X"..."
X"@End @Appendix"
X}
Xbut these are quite optional. No @Code "@BeginAppendices" and
X@Code "@EndAppendices" symbols are needed. An appendix may contain
Xsub-appendices via the usual symbols {@Code "@BeginSubAppendices"},
X{@Code "@SubAppendix"}, and {@Code "@BeginSubAppendices"}. This ends
Xthe input; there is no {@Code "@End @Text"}, and any reference section
Xwill be added automatically.
X@End @Section
END_OF_FILE
if test 2988 -ne `wc -c <'lout/doc/tr.begin/s13'`; then
echo shar: \"'lout/doc/tr.begin/s13'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.begin/s13'
fi
if test -f 'lout/doc/tr.begin/s15' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.begin/s15'\"
else
echo shar: Extracting \"'lout/doc/tr.begin/s15'\" \(3682 characters\)
sed "s/^X//" >'lout/doc/tr.begin/s15' <<'END_OF_FILE'
X@Section
X @Tag { big.changes }
X @Title { Making more radical changes }
X@Begin
X@PP
XThe DocumentLayout package makes a large number
Xof decisions, about how large the pages will be, which fonts will
Xordinarily be used, and so on. The more complex decisions, such as the
Xappearance of tables of contents in books, can only be changed by
Xmodifying the packages, but many of the simpler decisions can be changed
Xquite easily by setting options in the setup file.
X@PP
XThe first step is to obtain a private copy of the setup file. A local
Xexpert will know where these files are kept; for example, in directory
X{ @Code "/usr/lout/include"}. Suppose the @Code report setup file is
Xcopied into a file called { @Code myrep }; then typing
X@ID @Code "lout myrep myfile"
Xinstead of
X@ID @Code "lout -ireport myfile"
Xruns Lout with the private copy of the setup file, {@Code "myrep"}.
X@PP
XExactly what the setup file contains will depend upon the local
Xsituation, but it will be something like this:
X@ID @Code {
X"# Setup file for reports."
X"# J. H. Kingston, July 1991"
X""


X"@SysInclude { ft }"
X"@SysInclude { dl }"

X"# @SysInclude { eq }"
X"# @SysInclude { pas }"
X"# @SysInclude { fig }"
X"# @SysInclude { tab }"
X""
X"@Use { @DocumentLayout"
X" # @InitialFont { Times Base 12p }"
X" # @InitialBreak { adjust 1.2fx }"
X" # @Hyphenate { Yes }"
X" # @PageNumbers { Yes }"
X" # @Columns { Single }"
X" # @HeadingFont { Bold }"
X" # @ParaIndent { 2.0f }"
X" # @PageTop { |0.5rt - @PageNum - }"
X" # @PageFoot { @Null }"
X"}"
X}
XWhenever Lout encounters a @Code "#" character not enclosed in quotes,
Xit ignores it and everything following it up to the end of the line. The
Xfirst two lines of the setup file, then, are comments for the human
Xreader. After them come lines which cause Lout to read the file
X@Code "ft" of font definitions and the file @Code "dl" which contains
Xthe definition of the DocumentLayout package.
X@PP
XThe next four lines are comments and will be ignored, but if the initial
X@Code "#" is deleted they cause Lout to read the definitions of the Eq
Xequation formatting package and the Pas Pascal program formatting package
X[{@Ref kingston92eq}], the Fig diagram drawing package [{@Ref kingston92fig}],
Xand the Tab table formatting package [{@Ref kingston92tab}].
X@PP
XNext comes a @Code "@DocumentLayout" symbol within a @Code "@Use"
Xclause. It is this symbol whose options may
Xbe changed so as to affect the overall layout. These options are listed
Xas comments on the following lines, together with the default value
Xof each. To change an option, delete the @Code "#" and change the
Xvalue. For example, the normal paragraph indent produced by @Code "@PP" is
X@Code "2.0f" (twice the current font size). To change it, say to
X{@Code "3.0f"}, change the line to
X@ID @Code "@ParaIndent { 3.0f }"
XThe display indent option (not shown here) should probably be changed as well.
X@PP
XThe first five options have the same name as five of the @Code "@Document"
Xsymbol's options, and they determine the default value of those
Xoptions. The @Code "@PageTop" and @Code "@PageFoot" options determine
Xthe appearance of the page header and footer lines (where the page
Xnumbers appear), and are best left to experts; but, for example,
X@ID @Code "@PageTop { |1rt @PageNum }"
Xwill make the page number appear at the top right of each page, without
Xthe @Code "-" characters.
X@PP
XThose who wish to make more radical changes will have to copy the @Code dl
Xfile and change the definition of the DocumentLayout package. This requires
Xknowledge of the principles of Lout, and the primitive features from which
Xothers are built, as described in the Lout user manual [{@Ref kingston92}].
X@End @Section
END_OF_FILE
if test 3682 -ne `wc -c <'lout/doc/tr.begin/s15'`; then
echo shar: \"'lout/doc/tr.begin/s15'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.begin/s15'
fi
if test -f 'lout/doc/tr.impl/s2.1' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.impl/s2.1'\"
else
echo shar: Extracting \"'lout/doc/tr.impl/s2.1'\" \(4030 characters\)
sed "s/^X//" >'lout/doc/tr.impl/s2.1' <<'END_OF_FILE'
X@SubSection
X @Tag { genesis }
X @Title { The genesis of the object abstraction }
X@Begin
X@PP
XWhen one examines previous document formatting systems [4]
Xlooking for ideas for abstractions, as the author did in 1984, the Eqn
Xformatting language [5] stands out like a beacon. In
XEqn, a mathematical formula such as

X@ID @Eq { { x sup 2 + 1 } over 4 }

Xis produced by typing


X@ID @Code "{ x sup 2 + 1 } over 4"

Xin the input file; @Code sup and @Code over are binary operators, and
Xbraces are used for grouping. This is document formatting at a very
Xhigh level, close to the language of mathematics itself, with all
Xreference to font changes and spacing suppressed.
X@PP
XEqn provides a single data type (let us call it the {@I expression}),
Xbuilt up recursively in context-free style: where one expression may appear,
Xany expression may appear. This approach is common in algebra and
Xprogramming languages, where its simplicity and expressiveness have long
Xbeen appreciated; but Eqn was the first language to demonstrate its
Xutility in document formatting.
X@PP
XEach expression is treated by Eqn as a rectangle with a
X{@I {horizontal axis}}, used for alignment with adjacent expressions:
X@ID @ShowMarks marks { horizontal } @Eq { { x sup 2 + 1 } over 4 }
XThe size and rendering of the expression on the printed page are
Xknown only to the implementation, never explicitly calculated or
Xaccessed by the user. This prohibition is
Xcrucial to the maintenance of the context-free property in practice. In
XLout, for example, equations, figures, tables, and arbitrary objects may
Xbe mixed together freely. This would be impossible if size information
Xwas hidden from the implementation in user calculations.
X@PP
XThe object abstraction of Lout is a direct descendant of the Eqn
Xexpression. It employs the same context-free recursive style of construction,
Xand each object is treated by Lout as a rectangle:
X@ID @Fig {
X@ShowMarks { 1c @Wide ^| 2c @Wide 0.45c @High ^/ 0.35c @High }
X}
XThe horizontal axis, called a @I { row mark } in Lout, has a
Xvertical analogue called a {@I {column mark}}, creating a valuable
Xsymmetry between horizontal and vertical. Multiple column and row marks
Xare permitted:
X@ID @Fig {
XA:: @Box margin { 0c } paint { grey } { 1.2c @Wide 0.8c @High }
X|1c
XB:: @Box margin { 0c } paint { grey } { 1c @Wide 0.8c @High }
X/0.5c
XC:: @Box margin { 0c } paint { grey } { 0.7c @Wide 0.8c @High }
X|1c
XD:: @Box margin { 0c } paint { grey } { 1.3c @Wide 0.8c @High }
X// @Line linestyle { dashed }
X from { A@W -- { 0.3 cm 0 } }
X to { B@W ++ { 1.6 cm 0 } }
X// @Line linestyle { dashed }
X from { C@W -- { 0.3 cm 0 } }
X to { D@W ++ { 1.6 cm 0 } }
X// @Line linestyle { dashed }
X from { A@NW ++ { 0 0.3 cm } }
X to { C@SW -- { 0 0.3 cm } }
X// @Line linestyle { dashed }
X from { B@NW ++ { 0.3 cm 0.3 cm } }
X to { D@SW ++ { 0.3 cm -0.3 cm } }
X}
Xso that objects are able to represent tables.
X@PP
XThis abstraction has some limitations, the most obvious being the restriction
Xof size calculations to rectangular bounding boxes. Non-rectangular and
Xdisconnected shapes arise naturally in figures and in the characters of
Xfonts; the extension to them is conceptually straightforward and might
Xhelp to explain some fine points of layout such as kerning. However,
Xthere are implementation and language design problems, particularly
Xwhen filling non-rectangular shapes with text, and so the author chose
Xto keep to Eqn's rectangles.
X@PP
XA more fundamental limitation of the object abstraction arises from the
Xinability of recursive data types to describe cross-linked structures,
Xwhich seem to require some means of naming the multiply referenced
Xparts. Lout is obliged to introduce additional abstractions to cope
Xwith cross linking: galleys for inserting text into pages
X(Section {@NumberOf galleys}), cross references (Section {@NumberOf cross}),
Xand labelled points in figure drawing [6]. An
Xabstraction closer to hypertext might form a more unified basis for
Xthese features.
X@End @SubSection
END_OF_FILE
if test 4030 -ne `wc -c <'lout/doc/tr.impl/s2.1'`; then
echo shar: \"'lout/doc/tr.impl/s2.1'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.impl/s2.1'
fi
if test -f 'lout/doc/tr.impl/s2.2' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.impl/s2.2'\"
else
echo shar: Extracting \"'lout/doc/tr.impl/s2.2'\" \(3349 characters\)
sed "s/^X//" >'lout/doc/tr.impl/s2.2' <<'END_OF_FILE'
X@SubSection
X @Tag { lexical }
X @Title { Grammatical and lexical structure }
X@Begin
X@PP
XIf objects are to be constructed like mathematical expressions, the
Xnatural notation is a functional language based on operators, as in
XEqn. The grammar of Lout objects is accordingly
X@ID @Eq {
Xmatrix {
Xobject
Xnextcol
X--> above --> above --> above --> above --> above --> above --> above -->
Xnextcol
X{ object ``` infixop ``` object }
Xlabove gap { "1fx" }
X{ prefixop ``` object }
Xlabove gap { "1fx" }
X{ object ``` postfixop }
Xlabove gap { "1fx" }
X{ noparsop }
Xlabove gap { "1fx" }
X{ literalword }
Xlabove gap { "1fx" }
X{ @Code "{" ``` object ``` @Code "}" }
Xlabove gap { "1fx" }
X{ object ``` object }
Xlabove gap { "1fx" }
X}
X}
Xwhere {@Eq {infixop}}, {@Eq {prefixop}}, {@Eq {postfixop}}, and
X{@Eq {noparsop}} are identifiers naming operators which take 0, 1
Xor 2 parameters, as shown, and @Eq {literalword} is a sequence of
Xnon-space characters, or an arbitrary sequence of characters
Xenclosed in double quotes. Ambiguities are resolved by precedence
Xand associativity.
X@PP
XThe last production allows a meaning for expressions such as
X{@Code "{}"}, in which an object is missing. The value of this
X@I {empty object} is a rectangle of size 0 by 0, with one column
Xmark and one row mark, that prints as nothing.
X@PP
XThe second-last production generates sequences of arbitrary objects
Xseparated by white space, called {@I paragraphs}. Ignoring
Xparagraph breaking for now, the natural meaning is that the two
Xobjects should appear side by side, and Lout's parser accordingly
Xinterpolates an infix horizontal concatenation operator (see below)
Xbetween them. This operator is associative, so the grammatical
Xambiguity does no harm. However, the Algol-60 rule that white space
Xshould be significant only as a separator is necessarily broken by
XLout in just this one place.
X@PP
XAlgol-like languages distinguish literal strings from identifiers by
Xenclosing them in quotes, but literals are far too frequent in document
Xformatting for this to be viable. The conventional solution is to
Xbegin identifiers with a special character, and Lout follows Scribe
X[7] in using "`@'" rather than the "`\\'" of troff
X[8] and @TeX [9].
X@PP
XHowever, Lout takes the unusual step of making an initial "`@'"
Xoptional. The designers of Eqn apparently considered such
Xcharacters disfiguring in fine-grained input like equations, and
Xthis author agrees. The implementation is straightforward: "`@'" is
Xclassed as just another letter, and every word is searched for in
Xthe symbol table. If it is found, it is an identifier, otherwise it
Xis a literal. A warning message is printed when a literal beginning
Xwith "`@'" is found, since it is probably a mis-spelt identifier. No
Xsuch safety net is possible for identifiers without "`@'".
X@PP
XEquation formatting also demands symbols made from punctuation
Xcharacters, such as @Code "+" and {@Code "<="}. It is traditional to
Xallow such symbols to be juxtaposed, which means that the input
X@ID @Code "<=++"
Xfor example must be interpreted within the lexical analyser by searching
Xthe symbol table for its prefixes in the order {@Code "<=++"},
X{@Code "<=+"}, {@Code "<="}. Although this takes quadratic time, in
Xpractice such sequences are too short to make a more sophisticated
Xlinear method like tries worthwhile.
X@End @SubSection
END_OF_FILE
if test 3349 -ne `wc -c <'lout/doc/tr.impl/s2.2'`; then
echo shar: \"'lout/doc/tr.impl/s2.2'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.impl/s2.2'
fi
if test -f 'lout/doc/tr.impl/s6.1' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.impl/s6.1'\"
else
echo shar: Extracting \"'lout/doc/tr.impl/s6.1'\" \(3774 characters\)
sed "s/^X//" >'lout/doc/tr.impl/s6.1' <<'END_OF_FILE'
X@SubSection
X @Tag { cross }
X @Title { The cross reference abstraction }
X@Begin
X@PP
XIn developing the cross reference abstraction, it seemed best to begin
Xwith the database application, since it is the simplest. Database
Xrelations are naturally mapped into Lout definitions:
X@ID @Code {
X"def @Reference"
X" named @Tag {}"
X" named @Author {}"
X" named @Title {}"
X" named @Journal {}"
X"{}"
X}
XThe set of all invocations of @Code "@Reference" is a relation whose
Xattributes are the parameters, and whose tuples are the invocations. To
Xcomplete the correspondence, we need only declare that the @Code "@Tag"
Xparameter is special, serving as the key attribute.
X@PP
XFollowing the database model, we next need a notation for retrieving the
Xinvocation with a given tag:
X@ID @Code "@Reference&&kingston91"
XThis @I {cross reference} is like an arrow pointing to the invocation. To
Xaccess its attributes, we write
X@ID @Code "@Reference&&kingston91 @Open { @Author, @Title }"
XThe @Code "@Open" operator evaluates its right parameter in an
Xenvironment which includes the exported parameters of its left.
X@PP
XAn invocation is chosen to be a running header because of its proximity
Xto the place where it is used, rather than by its tag. Such proximity
Xis naturally expressed by two special tags, {@Code preceding} and
X{@Code following}; for example, @Code "@Sym&&following" will point to
Xthe closest following invocation of @Code "@Sym" in the final printed
Xdocument. This is much simpler conceptually than reference to the
Xinternal state of the document formatter at a critical moment, the usual
Xapproach to running headers.
X@PP
XIt turns out that the above design solves all the cross referencing
Xproblems encountered in practice except one, which may be typified by
Xthe problem of finding the number of the page on which the chapter whose
Xtag is @Code "intro" begins. Two cross referencing steps are needed,
Xfirst to {@Code "@Chapter&&intro"}, then from there to
X{@Code "@Page&&preceding"}, where the page number is known.
X@PP
XGiven the success of the design so far, this last problem proves to be
Xsurprisingly difficult. We first try
X@ID @Code {
X"@Chapter&&intro @Open {"
X" @Page&&preceding @Open { @PageNum }"
X"}"
X}
Xbut this fails because @Code "@Page&&preceding" is evaluated in the
Xpresent context, not in the context of @Code "@Chapter&&intro" as
Xrequired. So our next attempt is
X@ID @Code {
X"def @Chapter"
X" named @PageNum { @Page&&preceding @Open { @PageNum } }"
X" ..."
X}
Xwith the @Code "@Page&&preceding" cross reference attached to the
Xchapter; we write
X@ID @Code "@Chapter&&intro @Open { @PageNum }"
XThis also fails, because parameters are evaluated after substitution, so
Xonce again @Code "@Page&&preceding" is evaluated in the wrong context. We
Xcould of course define a new operator specifically for this case:
X@ID @Code "@Page&&{ @Preceding @Chapter&&intro }"
Xor some such. This is free of the annoying context-sensitivity, but it
Xseems quite complex, and the expected cross reference @Code "@Page&&preceding"
Xdoes not appear.
X@PP
XThe author was lost in these obscurities for some time, and ultimately
Xrescued himself by looking ahead to the implementation of the
X@Code preceding and @Code following tags, to see if a simple extension
Xof it would solve the problem. This led to the @Code "@Tagged" operator:
X@ID @Code "@Page&&preceding @Tagged intro"
Xplaced at the beginning of the body of the chapter will attach @Code intro
Xas an extra tag to the closest preceding invocation of {@Code "@Page"},
Xso that
X@ID @Code "@Page&&intro @Open { @PageNum }"
Xyields the desired page number. There is something low-level and ad hoc
Xabout the @Code "@Tagged" operator, but the two cross references do
Xappear naturally, and it works.
X@End @SubSection
END_OF_FILE
if test 3774 -ne `wc -c <'lout/doc/tr.impl/s6.1'`; then
echo shar: \"'lout/doc/tr.impl/s6.1'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.impl/s6.1'
fi
if test -f 'lout/doc/tr.impl/s7.0' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.impl/s7.0'\"
else
echo shar: Extracting \"'lout/doc/tr.impl/s7.0'\" \(3895 characters\)
sed "s/^X//" >'lout/doc/tr.impl/s7.0' <<'END_OF_FILE'
X@Section
X @Title { Conclusion }
X@Begin
X@PP
XSince its public release in October 1991, the Basser Lout interpreter
Xhas been ported without incident to a wide variety of Unix systems and
Xhardware. It was tested extensively before release on its own
Xdocumentation, and the few minor bugs which have emerged since then have
Xall been fixed in the second release, scheduled to appear in mid-1992.
X@PP
XSeven substantial packages of definitions are distributed with Basser
XLout. The DocumentLayout package, and its variants ReportLayout and
XBookLayout, provide the standard features that all documents
Xrequire: pages, columns, paragraphs, headings, footnotes, floating
Xfigures and tables, chapters and sections, displays and lists, access
Xto bibliographic databases, cross references, and so on
X[11]. The BookLayout package has extra features
Xneeded by books, including an automatically generated table of contents,
XRoman page numbers for the prefatory material, running page headers,
Xodd and even page layouts, and a sorted index. The Eq package formats
Xequations, and Pas formats Pascal programs [10]; Tab
Xformats tables [12]; and Fig draws figures
X[6].
X@PP
XThe non-expert user who uses these packages perceives a system of a
Xstandard quite similar to other fully developed batch formatters,
Xalthough the interface is considerably more coherent than, say, the troff
Xfamily's [8]. The expert user perceives a system which
Xis radically different from previous ones, in which a great deal can be
Xachieved very quickly. To take an extreme example, Pas was designed,
Ximplemented, tested, and documented in one afternoon. Eq took about
Xa week, but most of that time was spent in marshalling the vast
Xrepertoire of mathematical symbols, and fine-tuning the spacing. Most
Xof the effort seems to go into designing a good interface; most symbols
Xare implemented in just one or a few lines of Lout.
X@PP
XA group of about 20 satisfied non-expert users has grown up within
Xthe author's department, mainly Honours students with no investment
Xin older systems to hold them back. Basser Lout has been advertised
Xon the Internet news as available via anonymous {@I ftp}, so the
Xextent of its outside user community is hard to gauge. About 50
Xpeople have mailed comments or questions to the author; many
Xof these people have ported the program, written small definitions,
Xand modified the standard packages.
X@PP
XFuture work could usefully begin with the improvements suggested in this
Xpaper: overlapping spanning columns, better semantics for available
Xspace, and especially horizontal galleys. Support for non-European
Xlanguages is also needed. However, the main task is the development of
Xan interactive document editor based on Lout. A structure editor similar
Xto Lilac [13], which already has objects and user-defined
Xsymbols, is envisaged; since cross references are easy when the whole
Xdocument is available, the only major new problem is the treatment of
Xgalleys, including the expansion and retraction of receptive symbols.
X@LP
X@LP
X@B { Note. } Since the above was written the author has completed a
Xrevised version of Basser Lout, in which the problem concerning
Xavailable space mentioned in Section {@NumberOf style} has been resolved.
X@LP
X@LP
X@B { Acknowledgment. } The author gratefully acknowledges many
Xvaluable discussions with Douglas W. Jones, especially during the
Xdevelopment of the galley abstraction; and also many helpful comments on
Xpresentation by the anonymous referee.
X@DP
X@DP
X@Heading { References }
X@NumberedList
X@LI @RefPrint kingston91
X@LI @RefPrint kingston91over
X@LI @RefPrint kingston91basser
X@LI @RefPrint furuta82
X@LI @RefPrint kernighan75
X@LI @RefPrint kingston91fig
X@LI @RefPrint reid80
X@LI @RefPrint ossanna76
X@LI @RefPrint knuth84
X@LI @RefPrint kingston91eq
X@LI @RefPrint kingston91begin
X@LI @RefPrint kingston91tab
X@LI @RefPrint brooks91
X@EndList
X@End @Section
END_OF_FILE
if test 3895 -ne `wc -c <'lout/doc/tr.impl/s7.0'`; then
echo shar: \"'lout/doc/tr.impl/s7.0'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.impl/s7.0'
fi
if test -f 'lout/doc/tr.lout/ch1.03' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch1.03'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch1.03'\" \(3701 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch1.03' <<'END_OF_FILE'
X@Section
X @Tag { cross }
X @Title { Cross references }
X@Begin
X@PP
XA cross reference
Xcross.ref @Index { Cross reference }
Xin common terminology is something like `see Table 6'
Xor `see page 57' -- a reference within a document to some other part of
Xthe document. Readers find them very useful, but they are a major
Xbookkeeping problem for authors. As the document is revised, Table 6
Xbecomes Table 7, the thing on page 57 moves to page 63, and all the
Xcross references must be changed.
X@PP
XThe Scribe
Xscribe @Index { Scribe }
Xdocument formatter, developed by Brian K. Reid [{@Ref reid80}],
Xreid.brian @Index { Reid, Brian K. }
Xintroduced a scheme for keeping track of cross
Xreferences. It allows you to give names to tables, figures, etc., and to
Xrefer to them by name. The formatter inserts the appropriate numbers in
Xplace of the names, so that as the document is revised, the
Xcross references are kept up to date automatically. Lout has adopted
Xand extended this scheme.
X@PP
XIn Lout, automatic cross referencing works in the following way. First
Xdefine a symbol with a parameter with the special name @Code "@Tag":
X@ID @Code {
X"def @Table"
X" left @Tag"
X" right @Value"
X"{"
X" ||1i @Value"
X"}"
X}
XWhen this symbol is invoked, the value given to @Code "@Tag" should be a
Xsimple word like {@Code "cities"}, or several simple words juxtaposed
Xlike {@Code "cities.compare"}; it serves to name the invocation:
X@ID @Code {
X"cities @Table"
X"{"
X" Washington |0.5i Canberra"
X"}"
X}
XWe may now refer to this invocation elsewhere in the document, using the
X@I {cross reference} @Code "@Table&&cities". Here @Code "&&" is the
X{@I {cross reference symbol}}; its left parameter is a symbol and its right
Xparameter is the value of the @Code "@Tag" parameter of some invocation
Xof that symbol.
X@PP
XA cross reference is not an object; the reader should think of it as
Xan arrow in the final printed document, beginning at the cross reference
Xsymbol and ending at the top of the target
Xtarget @Index { Target of cross reference }
Xinvocation, like this:
X@ID 8p @Font {
X { @LittlePage // @LittlePage }
X ||0io ||0.7c
X { //2c
X { @Code "@Table&&cities" }
X //0.1c
X ||0.5c 90d @Rotate @Arrow 2.5c
X //0.05c
X @HContract @VContract
X @Fig { @Box margin { 0c } paint { grey } { 1.5c @Wide 1c @High } }
X }
X}
X@PP
XTwo special values may be given to the right parameter of
X{@Code "&&"}: @Code preceding
Xpreceding. @Index { @Code preceding }
Xfollowing. @Index { @Code following }
Xand
X@Code following. The cross
Xreference @Code "@Table&&preceding" points to some table
Xappearing earlier in the final printed document than itself; that is, the
Xarrow is guaranteed to point backwards through the document. Usually it
Xpoints to the nearest preceding invocation. Similarly,
X@Code "@Table&&following" points forwards, usually to the
Xnearest following invocation of @Code "@Table".
X@PP
XThis section has been concerned with what a cross reference is -- an
Xarrow from one point in a document to another -- but not with how it is
Xused. One simple way to use a cross reference is to put it where an
Xobject is expected, like this:
X@ID @Code {
X"a | @Table&&cities | c"
X}
XIn this case the cross reference will be replaced by a copy of the
Xinvocation it points to: in the example just given, a table will appear
Xbetween @Code a and @Code c. Other applications of cross references may be
Xfound in Chapter {@NumberOf examples}, including finding the number of
Xthe page where something appears, producing running page headers and footers,
Xand accessing databases of Roman numerals, references, etc. Cross
Xreferences are also used by galleys, as will be explained in the next section.
X@End @Section
END_OF_FILE
if test 3701 -ne `wc -c <'lout/doc/tr.lout/ch1.03'`; then
echo shar: \"'lout/doc/tr.lout/ch1.03'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch1.03'
fi
if test -f 'lout/doc/tr.lout/ch2.04' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch2.04'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch2.04'\" \(2850 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch2.04' <<'END_OF_FILE'
X@Section
X @Title { Precedence and associativity of symbols }
X @Tag { precedence }
X@Begin
X@PP
XEvery symbol in Lout has a {@I precedence},
Xpreceden @Index { Precedence }
Xwhich is a positive whole number. When two symbols compete for an object,
Xthe one with the higher precedence wins it. For example,
X@ID @Code {
X"a | b / c"
X}
Xis equivalent to @OneCol @Code { "{" a "|" b "}" "/" c } rather than
X{@OneCol @Code { a "|" "{" b "/" c "}"} }, because @Code "|" has higher
Xprecedence than @Code "/" and thus wins the {@Code b}.
X@PP
XWhen the two competing symbols have equal precedence, Lout applies a
Xsecond rule. Each symbol is either @I left-associative or
Xassociativity @Index { Associativity }
X{@I right-associative}. The value of @OneCol @Code { a op1 b op2 c} is taken
Xto be @OneCol @Code { "{" a op1 b "}" op2 c } if the symbols are both
Xleft-associative, and @OneCol @Code "a op1 { b op2 c }" if they are
Xright-associative. In cases not covered by these two rules, use braces.
X@PP
XIt sometimes happens that the result is the same regardless of how the
Xexpression is grouped. For example, @OneCol @Code { "{" a "|" b "}" "|" c }
Xand @OneCol @Code { a "|" "{" b "|" c "}" } are always the same, for any
Xcombination of objects, gaps, and variants of {@Code "|"}. In such cases
Xthe symbols are said to be {@I associative}, and we can confidently omit
Xthe braces.
X@PP
XUser-defined symbols may be given a precedence and associativity:


X@ID @Code {
X"def @Super"

X" precedence 50"
X" associativity right"


X" left x"
X" right y"
X"{"

X" @OneRow { | -2p @Font y ^/0.5fk x }"
X"}"
X}
XThey come just after any @Code into clause and before any parameter
Xdefinitions. The precedence may be
Xany whole number between 10 and 100, and if omitted is assigned the
Xvalue 100. The higher the number, the higher the precedence. The
Xassociativity may be @Code left or {@Code right}, and if omitted
Xdefaults to {@Code right}. Lout's symbols have the following
Xprecedences and associativities:
X@ID @Tab
X vmargin { 0.5vx }
X @Fmta { @Col @CC A ! @Col @CC B ! @Col C }
X{
X@Rowa
X A { Precedence }
X B { Associativity }
X C { Symbols }
X@Rowa
X@Rowa
X A { 5 }
X B { associative }
X C { @Code "/ ^/ // ^//" }
X@Rowa
X A { 6 }
X B { associative }
X C { @Code "| ^| || ^||" }
X@Rowa
X A { 7 }
X B { associative }
X C { @Code "& ^&" }
X@Rowa
X A { 7 }
X B { associative }
X C { @Code "&" in the form of one or more white space characters }
X@Rowa
X A { 10-100 }
X B { @Code left or @Code right }
X C { user-defined symbols }
X@Rowa
X A { 100 }
X B { @Code right }
X C { @@Wide, @@High, @@Graphic, etc. }
X@Rowa
X A { 101 }
X B { - }
X C { @Code "&&" }
X@Rowa
X A { 102 }
X B { associative }
X C { @Code "&" in the form of 0 spaces }
X@Rowa
X A { 103 }
X B { - }
X C { Body parameters and right parameters of @@Open }
X}
X@End @Section
END_OF_FILE
if test 2850 -ne `wc -c <'lout/doc/tr.lout/ch2.04'`; then
echo shar: \"'lout/doc/tr.lout/ch2.04'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch2.04'
fi
if test -f 'lout/doc/tr.lout/ch3.03' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch3.03'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch3.03'\" \(3574 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch3.03' <<'END_OF_FILE'
X@Section
X @Title { "@Font" }
X @Tag { font }
X@Begin
X@PP
XA @I font
Xfont. @Index { Fonts }
Xis a collection of characters which may be
Xprinted. Many fonts come in {@I families},
Xfamily @Index { Family of a font }
Xface @Index { Face of a font }
Xwhich are groups of fonts that
Xhave been designed to go together. For example, the Times family
Xincludes the following fonts:
X@ID { Times Base } @Font {
X Base @Font { Times Base }
X//1vx Slope @Font { Times Slope }
X//1vx Bold @Font { Times Bold }
X//1vx BoldSlope @Font { Times BoldSlope }
X}
XThus, each font has two names: its @I { family name } (Times,
XHelvetica, etc.) and its @I { face name } (Base, Slope, etc.). Times
XBase is more commonly called Times Roman, and Times Slope is more
Xcommonly called Times Italic. Lout avoids these names in favour of
Xgeneric names which can be applied to many font families.
X@PP
XWhen Lout runs, the first thing it reads is a list of font definitions,
Xfont.def @Index { @Code fontdef }
Xlike these:
X@ID {
X @Code "fontdef Times Base {" @I implementation-dependent @Code "}"
X//1vx @Code "fontdef Times Slope {" @I implementation-dependent @Code "}"
X}
XEach line tells Lout of the existence of a font, and assigns it a family
Xname and a face name. There are a few fonts which are the only members
Xof their families; even though these fonts do not need a face name, they
Xmust be given one by their {@Code fontdef}. The part between braces may
Xvary with different implementations of Lout, but it will usually be the
Xname of a file containing the information Lout needs to work with the
Xfont; for example, Basser Lout uses
Xadobe @Index { Adobe Systems, Inc. }
XAdobe Font Metrics files.
X@PP
XLigatures,
Xligatures @Index Ligatures
Xsuch as fl for {@OneCol f}l and fi for {@OneCol f}i, are considered by
XBasser Lout to be an integral part of the font: if the @Code fontdef
Xfile mentions them, they will be used. Enclosing one of the letters in
X@@OneCol is one sure way to disable a ligature.
X@PP
XThe @@Font symbol
Xfont.sym @Index { @@Font symbol }
Xreturns its right parameter in a font
Xand size specified by its left:
X@ID {
X@Code "{ Times Base 12p } @Font" @I object
X}
XThe family and face names must have appeared together in a {@Code fontdef};
Xthe size is arbitrary and may be given in any one of the {@Code "c"},
X{@Code "i"}, {@Code "p"}, {@Code "m"}, {@Code "f"}, {@Code "s"}, and
X{@Code "v"} units of measurement (Section {@NumberOf concatenation}),
Xalthough @Code 10p and @Code 12p are the most common sizes for text.
X@PP
XWhen a @@Font symbol is nested inside the right parameter of
Xanother @@Font symbol, the inner one determines the font of its
Xown right parameter. However, it may be abbreviated so as to inherit
Xpart of the outer symbol:
X@ID @Code {
X"{ Times Base 12p } @Font"
X"{ hello, Slope @Font hello, 15p @Font hello }"
X}
Xhas result
X@ID {
X{ Times Base 12p } @Font
X{ hello, Slope @Font hello, 15p @Font hello }
X}
XThe first inner @@Font inherits the outer family and size, changing only
Xthe face; the second inherits the outer family and face. When a family
Xname is given, it must be followed immediately by a face name. A size
Xchange always comes last.
X@PP
XSizes of the form +{@I length} and --{@I length} may also be used,
Xmeaning that the font size is to be @I length larger or smaller than
Xthe inherited value. For example, --{@Code "2p"} is often used for
Xsuperscripts and subscripts. These forms are highly recommended, since
Xthey don't need to be changed if a decision is made to alter the font
Xsize of the document as a whole.
X@End @Section
END_OF_FILE
if test 3574 -ne `wc -c <'lout/doc/tr.lout/ch3.03'`; then
echo shar: \"'lout/doc/tr.lout/ch3.03'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch3.03'
fi
if test -f 'lout/doc/tr.lout/ch3.04' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch3.04'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch3.04'\" \(3886 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch3.04' <<'END_OF_FILE'
X@Section
X @Title { "@Break" }
X @Tag { break }
X@Begin
X@PP
XThe @@Break symbol influences the appearance of paragraphs (Section
X{@NumberOf concatenation}), offering a fixed set of eight styles:
X@IL
X
X@LI {
X2i @Wide { |1rt @Code adjust @@Break @I object }
Xadjust.break @Index { @Code adjust @@Break }
X|2m Break the paragraphs of {@I object} into lines, and apply @@PAdjust
X(Section {@NumberOf hadjust}) to every line except the last in
Xeach paragraph;
X}
X
X@LI {
X2i @Wide { |1rt @Code outdent @@Break @I object }
Xoutdent.break @Index { @Code outdent @@Break }
X|2m Like {@Code adjust}, except that @Code "2.0f @Wide {} &0i" is
Xinserted at the beginning of every line except the first, creating
Xan outdented paragraph;
X}
X
X@LI {
X2i @Wide { |1rt @Code ragged @@Break @I object }
Xragged.break @Index { @Code ragged @@Break }
X|2m Break the paragraphs of {@I object} into lines, but do not adjust
Xthe lines (`ragged right');
X}
X
X@LI {
X2i @Wide { |1rt @Code cragged @@Break @I object }
Xcragged.break @Index { @Code cragged @@Break }
X|2m Like {@Code ragged}, except that each line will be centred with
Xrespect to the others;
X}
X
X@LI {
X2i @Wide { |1rt @Code rragged @@Break @I object }
Xrragged.break @Index { @Code rragged @@Break }
X|2m Like {@Code ragged}, except that each line will be right-justified with
Xrespect to the others (`ragged left');
X}
X
X@LI {
X2i @Wide { |1rt @Code lines @@Break @I object }
Xlines.break @Index { @Code lines @@Break }
X|2m Break the paragraphs of {@I object} into lines at the same points
Xthat they are broken into lines in the input; do not adjust the lines. Any
Xspaces at the start of a line other than the first will appear in the output;
X}
X
X@LI {
X2i @Wide { |1rt @Code clines @@Break @I object }
Xclines.break @Index { @Code clines @@Break }
X|2m Break the paragraphs of {@I object} into lines at the same points
Xthat they are broken into lines in the input file, then centre each line with
Xrespect to the others;
X}
X
X@LI {
X2i @Wide { |1rt @Code rlines @@Break @I object }
Xrlines.break @Index { @Code rlines @@Break }
X|2m Break the paragraphs of {@I object} into lines at the same points
Xthat they are broken into lines in the input file, then right-justify
Xeach line with respect to the others.
X}
X
X@EL
XIf the paragraph was an entire component of a galley, so will each of
Xits lines be; otherwise the lines are enclosed in a {@Code "@OneRow"}
Xsymbol after breaking.
X@PP
XThe length of the gap used to separate the lines produced by paragraph
Xbreaking is always {@Code 1v}. However, the @Code v unit itself and the
Xv.unit.effect @SubIndex { effect on paragraph breaking }
Xgap mode may be changed:
X@IL
X
X@LI {
X2i @Wide { |1rt @I gap @Code "@Break" @I object }
X|2m Within {@I object}, take the value of the @Code "v" unit to be the
Xlength of {@I gap};
X}
X
X@LI {
X2i @Wide { |1rt + & @I gap @Code "@Break" @I object }
X|2m Within {@I object}, take the value of the @Code "v" unit to be
Xlarger by the length of @I gap than it would otherwise have been;
X}
X
X@LI {
X2i @Wide { |1rt -- & @I gap @Code "@Break" @I object }
X|2m Within {@I object}, take the value of the @Code "v" unit to be
Xsmaller by the length of @I gap than it would otherwise have been.
X}
X
X@EL
XIn each case, the mode of @I gap is adopted within {@I object}.
X@PP
XFinally, the @@Break symbol influences hyphenation:
X@IL
X
X@LI {
X2i @Wide { |1rt @Code "hyphen @Break" @I object }
Xhyphen.break @Index { @Code hyphen @@Break }
X|2m Permit hyphenation within the paragraphs of {@I object};
X}
X
X@LI {
X2i @Wide { |1rt @Code "nohyphen @Break" @I object }
Xnohyphen.break @Index { @Code nohyphen @@Break }
X|2m Prohibit hyphenation within the paragraphs of {@I object}; all
Xhyphenation gaps without exception revert to edge-to-edge mode.
X}
X
X@EL
XSeveral options may be given to the @@Break symbol simultaneously, in
Xany order. For example,
X@ID @Code "{ adjust 1.2fx hyphen } @Break ..."
Xis a typical initial value.
X@End @Section
END_OF_FILE
if test 3886 -ne `wc -c <'lout/doc/tr.lout/ch3.04'`; then
echo shar: \"'lout/doc/tr.lout/ch3.04'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch3.04'
fi
if test -f 'lout/doc/tr.over/s1' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.over/s1'\"
else
echo shar: Extracting \"'lout/doc/tr.over/s1'\" \(3752 characters\)
sed "s/^X//" >'lout/doc/tr.over/s1' <<'END_OF_FILE'
X@Section


X @Title { Introduction }
X@Begin
X@PP

XThe personal computer and the laser printer have sparked a revolution in
Xthe production of documents. Many authors now routinely take their work
Xfrom conception to camera-ready copy, many publishers are using desktop
Xpublishing systems, and it is probable that manual assembly of documents
Xwill become uncommon in the near future.
X@PP
XAs control moves into the hands of an ever-increasing number of
Xnon-technical people, the stresses on document formatting software
Xincrease. On the one hand, this software must be so simple that anyone
Xcan use it; on the other, it must supply a bewildering array of
Xfeatures. A book, for example, demands fonts, paragraph and page
Xbreaking, floating figures and tables, footnotes, chapters and sections,
Xrunning page headers and footers, an automatically generated table of
Xcontents, and a sorted index. Add to this an open-ended list of
Xspecialized features, beginning with mathematical typesetting, diagrams,
Xand access to bibliographic databases, and the result is a nightmare for
Xthe software developer.
X@PP
XOne solution to this feature explosion problem is to implement as a
Xsystem primitive every feature that will ever be required. Although all
Xof the successful interactive document editors known to the author take
Xthis approach (admittedly with some attempt to generalize and unify
Xtheir features), it has clearly reached its limit. Few such systems
Xprovide equation formatting, fewer still will format a Pascal program,
Xand other specialized features will simply never be implemented.
X@PP
XA second solution is to provide a relatively small system equipped with
Xa means of defining new features, as in programming languages. This
Xapproach has been taken by the batch formatters (those which do not
Xdisplay a continuously updated image of the printed document while
Xediting) found in academia, notably troff [{@Ref ossanna76}], @TeX
X[{@Ref knuth84}], and Scribe [{@Ref reid80}]. Features such as
Xfootnotes and automatic tables of contents have been added to these
Xsystems using macro definitions. Unfortunately, such extensions are
Xvery difficult and error-prone in practice: @TeX's footnote macro alone
Xcontains half a page of dense, obscure code, while those who have
Xextended troff have abandoned the language itself and taken refuge in
Xpreprocessors. A more productive basis for developing new features is needed.
X@PP
XThis article presents a high-level language for document formatting,
Xcalled Lout, which is intended to form such a basis. Lout is quite
Xaccessible to non-expert users, but its unique property is the ease with
Xwhich expert users can add new features. We begin with a presentation
Xof Lout as it appears to the non-expert user who employs the standard
Xpackages without under&-standing Lout's principles. Later sections switch
Xto the expert's view, showing by examples the principles of Lout and how
Xadvanced features are defined.
X@PP
XA Unix-compatible


X@FootNote { Unix is a trademark of "AT&T" Bell Laboratories. }

Xbatch formatter for Lout (called Basser Lout) has been written which
Xproduces PostScript
X@FootNote { PostScript is a trademark of Adobe Systems, Incorporated. }
Xoutput suitable for printing on most laser printers and many other
Xdevices. A library of standard packages written in Lout provides all of
Xthe features listed above and many others. This system is not an
Xexperimental prototype, it is a fully operational prod&-uct&-ion
Ximplementation. The software and its supporting documentation
X[{@Ref kingston92}, {@Ref kingston93basser}, {@Ref kingston92begin},
X{@Ref kingston92design}, {@Ref kingston92eq}, {@Ref kingston92fig},
X{@Ref kingston92tab}] are available free of charge from the author.
X@End @Section
END_OF_FILE
if test 3752 -ne `wc -c <'lout/doc/tr.over/s1'`; then
echo shar: \"'lout/doc/tr.over/s1'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.over/s1'
fi
if test -f 'lout/doc/tr.over/s3' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.over/s3'\"
else
echo shar: Extracting \"'lout/doc/tr.over/s3'\" \(4009 characters\)
sed "s/^X//" >'lout/doc/tr.over/s3' <<'END_OF_FILE'
X@Section
X @Title { Objects }
X@Begin
X@PP
XTo the expert user, Lout is a high-level functional language with a
Xrelatively small repertoire of primitive features organized around four
Xkey concepts: {@I objects}, {@I definitions}, {@I cross @I references},
Xand {@I galleys}. An object is a rectangle with at least one horizontal
Xand one vertical mark protruding from it. For example,
X@ID @Code "Australia"
Xis an object which is viewed by Lout like this:
X@ID @ShowMarks Australia
XHorizontal and vertical concatenation operators, denoted by the symbols
X@Code "|" and {@Code "/"}, are used to assemble larger objects:
X@ID @Code { "USA |0.2i Australia" }
Xis the object
X@ID { @ShowMarks USA |0.2i @ShowMarks Australia }
XThe parameters are separated by the length given after the concatenation
Xsymbol (0.2 inches in this example), and their horizontal marks are
Xaligned.
X@PP
XTables are made by combining the two operators, with @Code "|" having
Xthe higher precedence:


X@ID @Code {
X |1m USA |1m "|0.2i" |1m Australia
X/1vx "/0.1i" | Washington | "|" | Canberra
X}

Xis the object
X@ID {
X @ShowMarks USA &0.4c @Fig { @Line from { 0 0 } to { xsize 0 }
X linestyle { dashed } linewidth { 0.015 cm } 0.8c @Wide {} }
X #{ 0 ymark moveto xsize 10 pt add ymark lineto [ 3 pt ] 0 setdash stroke }
X #@Graphic {1c @Wide }


X |0.2i @ShowMarks Australia
X/0.1i @ShowMarks Washington | @ShowMarks Canberra
X}

XThe second horizontal concatenation symbol needs no length, since the
Xfirst one determines the separation between the two columns created by
Xthe alignment of the vertical marks. Objects of arbitrary complexity
Xmay be assembled using these and other operators, and braces used for
Xgrouping, in a manner analogous to the assembly of expressions in
Xprogramming languages.
X@PP
XThe lengths attached to concatenation symbols have features which permit
Xobjects to be positioned very precisely. In addition to the usual units
Xof measurement (inches, centimetres, points, and ems), lengths may be
Xmeasured in units of the current font size, space width, inter-line
Xspace, and available width (for centering and right justification).
X@PP
XThere are also six @I gap {@I modes}, which determine where the lengths
Xare measured from. Previous examples have used edge-to-edge mode:
X@ID @Fig margin { 0c } headstyle { closed } {
X@ShowMarks { 0.3c @Wide ^| 0.9c @Wide 0.3c @High ^/ 0.2c @High }
X|0.5c
X@ShowMarks { 0.3c @Wide ^| 0.9c @Wide 0.3c @High ^/ 0.2c @High }
X//0.2c
X|1.2c @Arrow arrow { both } { 0.5c @Wide }
X}
XLout also provides a mark-to-mark mode, obtained by appending
X@Code x to the length:
X@ID @Fig margin { 0c } headstyle { closed } {
X@ShowMarks { 0.3c @Wide ^| 0.9c @Wide 0.3c @High ^/ 0.2c @High }
X|0.5c
X@ShowMarks { 0.3c @Wide ^| 0.9c @Wide 0.3c @High ^/ 0.2c @High }
X//0.2c
X|0.3c @Arrow arrow { both } { 1.7c @Wide }
X}
XThe length will be widened if necessary to prevent the parameters from
Xoverlapping, thus implementing the baseline-to-baseline spacing used
Xbetween lines of text. Other modes provide tabulation from the left
Xmargin, overstriking, and hyphenation.
X@PP
XThe final appearance of an object is affected by a limited amount of
Xinformation inherited from the context, principally the font and the
Xwidth available for the object to occupy. There are operators for
Xsetting these attributes:
X@ID @Code {
X"Slope @Font {"
X"Hello, world"
X"}"
X}
Xproduces
X@ID {
XSlope @Font { Hello, world }
X}
Xand in a similar way


X@ID @Code {
X"1.5i @Wide {"

X"(1) |0.1i A small"
X"indented paragraph"
X"of text."
X"}"
X}
Xproduces
X@ID {
X1.5i @Wide {
X(1) |0.1i A small
Xindented paragraph
Xof text.
X}
X}
Xwith the paragraph inheriting and being broken to an available width of
X1.4 inches minus the width of (1). This size inheritance remains secure
Xthrough all the complexities of gap modes, mark align&-ment, the @Code
X"@Wide" and other operators, and so on, providing a high-level service
Xcomparable in value with strong typing in programming languages.
X@End @Section
END_OF_FILE
if test 4009 -ne `wc -c <'lout/doc/tr.over/s3'`; then
echo shar: \"'lout/doc/tr.over/s3'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.over/s3'
fi
if test -f 'lout/doc/tr.over/setup' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.over/setup'\"
else
echo shar: Extracting \"'lout/doc/tr.over/setup'\" \(2867 characters\)
sed "s/^X//" >'lout/doc/tr.over/setup' <<'END_OF_FILE'
X
X######################################################
X# #
X# Lout setup file for Overview paper. #


X# #
X# Jeffrey H. Kingston #

X# 8 June 1991 #
X# 23 December 1991 #
X# #
X######################################################


X
X@SysInclude { ft }
X@SysInclude { dl }

X@SysInclude { eq }
X@SysInclude { fig }
X
X def @Code
X right x


X { { Helvetica Base -1p } @Font lines @Break x
X }
X

X def @ShowMarks
X named linewidth { 0.015 cm }
X named linestyle { dashed }

X named dashlength { 0.15 cm }

X named paint { light }
X right x
X {
X @Fig


X { @Box margin { 0c } linewidth { linewidth } paint { paint }
X { @Figure
X shape { -0.3 cm ymark
X {xsize ymark} ++ {0.3 cm 0} []
X xmark -0.3 cm
X {xmark ysize} ++ {0 0.3 cm}
X }
X linewidth { linewidth }

X linestyle { linestyle }
X dashlength { dashlength }

X x
X }
X
X }
X }
X

X def @TeX { T{ /0.2fo E}X }
X

X def @Leaders { .. @Leaders }


X
X ###################################################
X # #
X # Interpolated example documents. #
X # #
X ###################################################
X

X def @HLine
X {

X { 0 0 moveto xsize 0 lineto stroke } @Graphic {}
X }
X

X def @LittleEndRunPlace { @Galley }
X def @LittleEndRun
X force into { @LittleEndRunPlace&&preceding }
X {}
X
X def @LittleTextPlace { @Galley }
X def @LittleText into { @LittleTextPlace&&preceding }

X right x
X { x
X }
X

X def @LittleFootPlace { @Galley }
X def @LittleFootNote into { @LittleFootPlace&&following }

X right x
X { x
X }
X

X def @LittlePageColumn
X right x
X {


X 9px @Break 8p @Font
X 2.8c @Wide x
X }
X
X def @LittlePage

X right x
X {
X @HContract @VContract


X { 0 0 moveto xsize 0 lineto xsize ysize lineto

X 0 ysize lineto closepath stroke } @Graphic
X { //0.3c ||0.3c
X 9px @Break 8p @Font
X 2.8c @Wide 3.8c @High x
X ||0.3c //0.3c
X }
X }
X
X def @LittleFootSect
X { 1c @Wide @HLine
X //0.3v @LittleFootPlace ||0.5c
X }
X
X def @LittlePageList

X right @PageNum
X {
X @LittlePage { |0.5rt - @PageNum - //0.8v


X //0.3v @LittleTextPlace
X //1rt @LittleFootSect
X }
X //
X @LittlePageList @Next @PageNum
X }
X
X def @LittleDocument
X { @LittlePage
X { @LittleTextPlace
X //1rt @LittleFootSect
X }
X // @LittlePageList 2
X // @LittleEndRunPlace
X }
X

X@Use { @DocumentLayout }


X
X@SysDatabase @Reference { "loutrefs" }
END_OF_FILE

if test 2867 -ne `wc -c <'lout/doc/tr.over/setup'`; then
echo shar: \"'lout/doc/tr.over/setup'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.over/setup'
fi
if test -f 'lout/doc/tr.tab/s2' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.tab/s2'\"
else
echo shar: Extracting \"'lout/doc/tr.tab/s2'\" \(3628 characters\)
sed "s/^X//" >'lout/doc/tr.tab/s2' <<'END_OF_FILE'
X@Section
X @Title { Changing the style of entries and columns }
X@Begin
X@PP
XThe style of an entry is mainly determined by four symbols from standard
XLout: {@Code "@Font"}, {@Code "@Break"}, {@Code "@Wide"}, and
X{@Code "@High"}. We will review them only briefly here, since they are
Xtreated elsewhere [{@Ref kingston92}, {@Ref kingston92begin}],
Xthen explain how they are used within tables.
X@PP
XThe @Code "@Font" symbol changes the font and font size of an object. For
Xexample,
X@ID @Code "Slope @Font { hello world }"
Xproduces {Slope @Font { hello world }}, and
X@ID @Code "{ Bold +2p } @Font { hello world }"
Xproduces
X@ID {{ Bold +2p } @Font { hello world }}
Xwhich is two points larger than it otherwise would have been, as well
Xas set in bold. The DocumentLayout package provides the abbreviations
X@Code "@I" and @Code "@B" for @Code "Slope @Font" and {@Code "Bold @Font"}.
X@PP
XThe @Code "@Break" symbol affects paragraph breaking. Most relevant
Xhere are @Code "clines @Break" and {@Code "rlines @Break"}, which will
Xcentre or right-justify one or more lines in the given column:
X@ID @Code {
X"clines @Break {"
X"A small centred"
X"paragraph."
X"}"
X}
Xproduces
X@ID {
Xclines @Break {
XA small centred
Xparagraph.
X}
X}
Xfor example. Actually, there is a small problem with these symbols: they
Xonly work on paragraphs of at least two words, so they will fail to
Xcentre or right-justify a solitary word. Tab provides two symbols,
X{@Code "@CC"} and {@Code "@RR"}, which do essentially the same thing,
Xbut which work on single words as well.
X@PP
XThe @Code "@Wide" symbol forces an object to have a given width, by
Xpadding it with white space on the right if it is too small, or breaking
Xits paragraphs if it is too wide:


X@ID @Code {
X"1.5i @Wide {"

X"This small paragraph will"
X"be broken to a width of"
X"one and one half inches."
X"}"
X}
Xproduces
X@ID {
X1.5i @Wide {
XThis small paragraph will
Xbe broken to a width of
Xone and one half inches.
X}
X}
XWidths may be specified in centimetres, points or ems using the letters
X{@Code "c"}, {@Code "p"} and {@Code "e"} instead of {@Code "i"}. The
X@Code "@High" symbol is very similar, forcing an object to have a given
Xheight by adding white space beneath it.
X@PP
XAlthough we will use only these four symbols in the following, more
Xexotic symbols may be used, for example @Code "90d @Rotate" which
Xrotates any object (the entire table, for example, or one entry) ninety
Xdegrees, or any other positive or negative angle. Symbols defined by
Xthe user or taken from other packages may also be used.
X@PP
XTo change the style of an individual entry, enclose it in the symbols
Xrequired:
X@ID @Code {
X"@Rowa"
X" A { @CC { one entry of the table } }"
X}
XMore commonly, the same style is to be applied to every entry in a
Xparticular column, and this is done by placing the symbols for the style
Xinside the format option, between @Code "@Col" and the column letter:
X@ID @Code {
X"@Tab"
X" @Fmta { @Col 3c @Wide @CC A ! ... }"
X}
XAny @Code "@CC" or @Code "@RR" symbol should appear last, immediately
Xbefore the column letter. Now every entry in column @Code A will be
Xcentred in a three centimetre space, which means that the column as
Xa whole will be three centimetres wide (excluding margins) and its
Xentries will be centred.
X@PP
XIt is best not to use the @Code "@Wide" symbol at first, since Lout is
Xquite good at choosing appropriate column widths. If the result is not
Xsatisfactory, and the table is wide enough to require paragraph breaking
Xwithin its entries, @Code "@Wide" should be used only to reduce the width
Xof the wider columns, not to increase the width of the narrower ones.
X@End @Section
END_OF_FILE
if test 3628 -ne `wc -c <'lout/doc/tr.tab/s2'`; then
echo shar: \"'lout/doc/tr.tab/s2'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.tab/s2'
fi
if test -f 'lout/doc/tr.tab/s4' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.tab/s4'\"
else
echo shar: Extracting \"'lout/doc/tr.tab/s4'\" \(1609 characters\)
sed "s/^X//" >'lout/doc/tr.tab/s4' <<'END_OF_FILE'
X@Section
X @Title { Aligned columns }
X@Begin
X@PP
XColumns of numbers are often presented with decimal points aligned:
X@CD @Tab


X @Fmta { @Col A }
X{
X @Rowa A { 5^.46 }
X @Rowa A { 128^.2 }
X @Rowa A { 3^.4159 }
X @Rowa A { 5772^ }
X}

XThis is achieved with Tab by placing the @Code "^" symbol (which
Xactually comes from the DocumentLayout package) just before the
Xalignment point in each entry:


X@ID @Code {
X"@Tab"
X" @Fmta { @Col A }"
X"{"
X" @Rowa A { 5^.46 }"
X" @Rowa A { 128^.2 }"
X" @Rowa A { 3^.4159 }"
X" @Rowa A { 5772^ }"
X"}"

X}
XThe equals signs of equations can be aligned in the same way. The
Xformat of such columns should not contain @Code "@CC" or {@Code "@RR"}.
X@PP
XThe simplest way to get a heading over an aligned column is to use the
X@Code "^" symbol in the heading as well. If it is not possible to do
Xthis, for example because the heading entry is a paragraph of text
Xbroken over more than one line, the most viable alternative is to use
X@Code "@Over" in the heading line's format to make the heading column
Xspan over the aligned column:
X@ID @Code {
X"@Tab"
X" @Fmta { @Col @CC H @Over A }"
X" @Fmtb { @Col A }"
X"{"
X" @Rowa H { Heading }"
X" @Rowb A { 5^.46 }"
X" @Rowb A { 128^.2 }"
X" @Rowb A { 3^.4159 }"
X" @Rowb A { 5772^ }"
X"}"
X}
Xfor example produces
X@CD @Tab
X @Fmta { @Col @CC H @Over A }
X @Fmtb { @Col A }
X{
X @Rowa H { Heading }
X @Rowb A { 5^.46 }
X @Rowb A { 128^.2 }
X @Rowb A { 3^.4159 }
X @Rowb A { 5772^ }
X}
XUnfortunately, the aligned entries are left-justified in the column, when
Xthey should really be centred.
X@End @Section
END_OF_FILE
if test 1609 -ne `wc -c <'lout/doc/tr.tab/s4'`; then
echo shar: \"'lout/doc/tr.tab/s4'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.tab/s4'
fi
if test -f 'lout/doc/tr.tab/s7' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.tab/s7'\"
else
echo shar: Extracting \"'lout/doc/tr.tab/s7'\" \(3507 characters\)
sed "s/^X//" >'lout/doc/tr.tab/s7' <<'END_OF_FILE'
X@Section
X @Title { A final example }
X@Begin
X@PP
XIn conclusion, here is the input for a relatively large table:
X@ID 10p @Font @Code 1.2fx @Break {
X"@OneRow 10p @Font 1.15fx @Break @Tab"
X" linewidth { 1.0 pt }"
X" vmargin { 0.4v }"
X" @Fmta { @Col @B A ! @Col @B B ! @Col @B C ! @Col @B D }"
X" @Fmtb { @Col outdent @Break A ! @Col 1.8c @Wide ragged @Break B !"
X" @Col C ! @Col outdent @Break D }"
X"{"
X""
X"@Rowa above { single } below { single }"
X" A { Scholarship }"
X" B { Value $ }"
X" C { Closing date }"
X" D { Qualifications }"
X""
X"@Rowa"
X" A { 1. Tenable at the University of Sydney }"
X""
X"@Rowb"
X" A { Commonwealth and University Postgraduate Research Awards }"
X" B { 10,415 (12,724 to 16,433 from 1 January 1990) }"
X" C { 31 October }"
X" D { Graduates with Hons I or Hons II Div. 1. For research in any field }"
X""
X"@Rowb"
X" A { Commonwealth Postgraduate Course Awards }"
X" B { 10,415 }"
X" C { 30 September }"
X" D { Graduates with honours degrees or very good pass degrees. For"
X"Master's degrees undertaken by coursework }"
X""
X"@Rowb"
X" A { R. and M. Bentwich Scholarship }"
X" D { Graduate who holds a postgraduate research scholarship and who"
X"requires a supplementary grant }"
X""
X"@Rowa"
X" A { 2. Awarded by external bodies }"
X""
X"@Rowb"
X" A { Caltex }"
X" B { 24,000 }"
X" C { 30 September }"
X" D { Female graduates completing degree or diploma in year of application }"
X""
X"@Rowb"
X" A { Rhodes Scholarship }"
X" B { @Sterling3500 + return air-fare }"
X" C { 1 October }"
X" D { Age limit 25. For tenure at the University of Oxford }"
X" below { single }"
X"}"
X"@DP"
X"10p @Font { *Additional benefits include cost of travel and payment of fees. }"
X}
XThe most interesting things about it are the use of outdented paragraphs,
Xand the @Code "@Wide" symbol which restricts the width of the second column,
Xwhich would otherwise be as wide as the first and last. Here is the result:
X@DP
X@OneRow 10p @Font 1.15fx @Break @Tab
X linewidth { 1.0 pt }
X vmargin { 0.4v }
X @Fmta { @Col @B A ! @Col @B B ! @Col @B C ! @Col @B D }
X @Fmtb { @Col outdent @Break A ! @Col 1.8c @Wide ragged @Break B !
X @Col C ! @Col outdent @Break D }
X{
X@Rowa above { single } below { single }
X A { Scholarship }
X B { Value $ }
X C { Closing date }
X D { Qualifications }
X
X@Rowa
X A { 1. Tenable at the University of Sydney }
X
X@Rowb
X A { Commonwealth and University Postgraduate Research Awards }
X B { 10,415 (12,724 to 16,433 from 1 January 1990) }
X C { 31 October }
X D { Graduates with Hons I or Hons II Div. 1. For research in any field }
X
X@Rowb
X A { Commonwealth Postgraduate Course Awards }
X B { 10,415 }
X C { 30 September }
X D { Graduates with honours degrees or very good pass degrees. For
XMaster's degrees undertaken by coursework }
X
X@Rowb
X A { R. and M. Bentwich Scholarship }
X D { Graduate who holds a postgraduate research scholarship and who
Xrequires a supplementary grant }
X
X@Rowa
X A { 2. Awarded by external bodies }
X
X@Rowb
X A { Caltex }
X B { 24,000 }
X C { 30 September }
X D { Female graduates completing degree or diploma in year of application }
X
X@Rowb
X A { Rhodes Scholarship }
X B { @Sterling3500 + return air-fare }
X C { 1 October }
X D { Age limit 25. For tenure at the University of Oxford }
X below { single }
X}
X@DP
X10p @Font { *Additional benefits include cost of travel and payment of fees. }
X@End @Section
END_OF_FILE
if test 3507 -ne `wc -c <'lout/doc/tr.tab/s7'`; then
echo shar: \"'lout/doc/tr.tab/s7'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.tab/s7'
fi
if test -f 'lout/include/doc' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/include/doc'\"
else
echo shar: Extracting \"'lout/include/doc'\" \(4110 characters\)
sed "s/^X//" >'lout/include/doc' <<'END_OF_FILE'
X
X###############################################################################
X# #
X# Setup file for invoking @DocumentLayout for simple documents #

if test 4110 -ne `wc -c <'lout/include/doc'`; then
echo shar: \"'lout/include/doc'\" unpacked with wrong size!
fi
# end of 'lout/include/doc'
fi
if test -f 'lout/include/pas' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/include/pas'\"
else
echo shar: Extracting \"'lout/include/pas'\" \(3621 characters\)
sed "s/^X//" >'lout/include/pas' <<'END_OF_FILE'
X
X###############################################################################
X# #
X# Lout @Pas package for formatting Pascal programs (Version 2.0) #
X# #
X# Version 1.0 by Jeffrey H. Kingston, June 1991. #


X# Version 2.0 by Jeffrey H. Kingston, 22 December 1992. #

X# #
X# See "Eq - a Lout package for typesetting mathematics" for user #

X# information. #
X# #
X# Reference: Jensen, K. and Wirth, N. Pascal User Manual and Report. #
X# Second Edition, Springer-Verlag, 1975. #
X# #
X###############################################################################
X
Xexport "0" "1" "2" "3" "4" "5" "6" "7" "8" "9"
X "." "," ":" ";" "'" "`" "+" "-" "*" "/" "(" ")"
X "[" "]" "^" ".." "=" "<" ">" "<>" "<=" ">=" ":="
X
X and array begin case const div do downto else end
X file for forward function goto if in label mod nil not
X of or otherwise packed procedure program record repeat
X set then to type until var while with @Com
X
Xdef @Pas


X body @Body
X@Begin
X

X def @R right x { Base @Font x }
X def @B right x { Bold @Font x }
X def @S right x { { Symbol Base } @Font x }
X
X def "0" { @R "0" }
X def "1" { @R "1" }
X def "2" { @R "2" }
X def "3" { @R "3" }
X def "4" { @R "4" }
X def "5" { @R "5" }
X def "6" { @R "6" }
X def "7" { @R "7" }
X def "8" { @R "8" }
X def "9" { @R "9" }
X def "." { @R "." }
X def "," { @R "," }
X def ":" { @R ":" }
X def ";" { @R ";" }
X def "'" { @R "'" }
X def "`" { @R "`" }
X def "+" { @S "+" }
X def "-" { @S "-" }
X def "*" { @S "\052" }
X def "/" { @R "\057" }
X def "(" { @R "(" }
X def ")" { @R ")" }
X def "[" { @R "[" }
X def "]" { @R "]" }
X def "^" { @S 0.8f @Font "\255" }
X def ".." { @R ".." }
X def "=" { @S "\075" }
X def "<" { @S "\074" }
X def ">" { @S "\076" }
X def "<>" { @S "\271" }
X def "<=" { @S "\243" }
X def ">=" { @S "\263" }
X def ":=" { :{//0.03fo =} }
X
X def and { @B "and" }
X def array { @B "array" }
X def begin { @B "begin" }
X def case { @B "case" }
X def const { @B "const" }
X def div { @B "div" }
X def do { @B "do" }
X def downto { @B "downto" }
X def else { @B "else" }
X def end { @B "end" }
X def file { @B "file" }
X def for { @B "for" }
X def forward { @B "forward" }
X def function { @B "function" }
X def goto { @B "goto" }
X def if { @B "if" }
X def in { @B "in" }
X def label { @B "label" }
X def mod { @B "mod" }
X def nil { @B "nil" }
X def not { @B "not" }
X def of { @B "of" }
X def or { @B "or" }
X def otherwise { @B "otherwise" }
X def packed { @B "packed" }
X def procedure { @B "procedure" }
X def program { @B "program" }
X def record { @B "record" }
X def repeat { @B "repeat" }
X def set { @B "set" }
X def then { @B "then" }
X def to { @B "to" }
X def type { @B "type" }
X def until { @B "until" }
X def var { @B "var" }
X def while { @B "while" }
X def with { @B "with" }
X
X def @Com right x { @R "{" x @R "}" }
X
X Slope @Font lines @Break @Body
X
X@End @Pas
END_OF_FILE
if test 3621 -ne `wc -c <'lout/include/pas'`; then
echo shar: \"'lout/include/pas'\" unpacked with wrong size!
fi
# end of 'lout/include/pas'
fi
if test -f 'lout/include/tab_prepend' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/include/tab_prepend'\"
else
echo shar: Extracting \"'lout/include/tab_prepend'\" \(2912 characters\)
sed "s/^X//" >'lout/include/tab_prepend' <<'END_OF_FILE'
X%%BeginResource: procset LoutTabPrependGraphic
X%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
X% %
X% PostScript @SysPrependGraphic file for @Tab %
X% %


X% To assist in avoiding name clashes, the names %
X% of all these symbols begin with "ltab". %
X% %
X% Jeffrey H. Kingston %
X% 24 September 1991 %
X% 22 December 1992 %
X% %
X%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
X
X% linewidth ltabhs -
X% horizontal single line
X/ltabhs

X{ 0 0 moveto xsize 0 lineto

X setlinewidth 0 setlinecap stroke
X} def
X


X% linewidth ltabhsp -
X% horizontal single line with projecting ends
X/ltabhsp

X{ 0 0 moveto xsize 0 lineto

X setlinewidth 2 setlinecap stroke
X} def
X


X% linewidth ltabhd -
X% horizontal double line
X/ltabhd
X{ dup dup

X 0 0 moveto xsize 0 lineto

X 0 exch 3 mul moveto xsize exch 3 mul lineto

X setlinewidth 0 setlinecap stroke
X} def
X


X% linewidth ltabhdb -
X% horizontal double line below mark
X/ltabhdb
X{ dup dup

X 0 0 moveto xsize 0 lineto

X 0 exch -3 mul moveto xsize exch -3 mul lineto

X setlinewidth 0 setlinecap stroke
X} def
X


X% linewidth ltabhdnw -
X% horizontal double line with northwest corner
X/ltabhdnw
X{ dup dup dup dup

X 0 0 moveto xsize 0 lineto

X xsize exch 3 mul moveto
X -3 mul exch 3 mul lineto
X -3 mul 0 lineto

X setlinewidth 0 setlinejoin 2 setlinecap stroke
X} def
X


X% linewidth ltabhdne -
X% horizontal double line with northeast corner
X/ltabhdne
X{ dup dup dup dup

X 0 0 moveto xsize 0 lineto

X 0 exch 3 mul moveto
X 3 mul xsize add exch 3 mul lineto
X 3 mul xsize add 0 lineto

X setlinewidth 0 setlinejoin 2 setlinecap stroke
X} def
X


X% linewidth ltabhdsw -
X% horizontal double line with southwest corner
X/ltabhdsw
X{ dup dup dup dup

X 0 0 moveto xsize 0 lineto

X xsize exch -3 mul moveto
X -3 mul exch -3 mul lineto
X -3 mul 0 lineto

X setlinewidth 0 setlinejoin 2 setlinecap stroke
X} def
X


X% linewidth ltabhdse -
X% horizontal double line with southeast corner
X/ltabhdse
X{ dup dup dup dup

X 0 0 moveto xsize 0 lineto

X 0 exch -3 mul moveto
X 3 mul xsize add exch -3 mul lineto
X 3 mul xsize add 0 lineto

X setlinewidth 0 setlinejoin 2 setlinecap stroke
X} def
X


X% linewidth ltabvs -
X% vertical single line
X/ltabvs

X{ 0 0 moveto 0 ysize lineto

X setlinewidth 0 setlinecap stroke
X} def
X


X% linewidth ltabvd -
X% vertical double line
X/ltabvd
X{ dup dup

X 0 0 moveto 0 ysize lineto

X -3 mul 0 moveto -3 mul ysize lineto

X setlinewidth 0 setlinecap stroke
X} def
X


X% linewidth ltabvdr -
X% vertical double line to right of mark
X/ltabvdr
X{ dup dup

X 0 0 moveto 0 ysize lineto

X 3 mul 0 moveto 3 mul ysize lineto
X setlinewidth 0 setlinecap stroke
X} def
X%%EndResource

END_OF_FILE
if test 2912 -ne `wc -c <'lout/include/tab_prepend'`; then
echo shar: \"'lout/include/tab_prepend'\" unpacked with wrong size!
fi
# end of 'lout/include/tab_prepend'
fi
if test -f 'lout/man/lout.1' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/man/lout.1'\"
else
echo shar: Extracting \"'lout/man/lout.1'\" \(2954 characters\)
sed "s/^X//" >'lout/man/lout.1' <<'END_OF_FILE'
X.TH LOUT 1
X.SH NAME
Xlout - prepare Lout document for printing
X.SH SYNOPSIS
Xlout [ -i<filename> ] files
X.SH DESCRIPTION
XInvoke the Basser Lout interpreter on the concatenation of the named
Xfiles, producing a PostScript file on standard output suitable for
Xprinting on PostScript printers using lpr(1). If no files are named,
Xstdin is used instead. The special file name - may be used to denote
Xstandard input.
X.SH OPTIONS
X.TP 16
X-i<filename>
XSearch the directories of the include file path (see below) for
X<filename> and include it. There may be multiple -i options.
X.TP
X-s
XSuppress all reading and writing of the cross reference database;
Xother databases are not affected. Useful when many simple documents that
Xdon't do any cross referencing are stored in one directory.
X.TP
X-e<filename>
XDirect error messages to <filename> instead of to stderr.
X.TP
X-o<filename>
XDirect PostScript output to <filename> instead of to stdout.
X.TP
X-I<dirname>
XAdd <dirname> to the list of directories searched for @Include files
Xand -i option files. There may be multiple -I options. @Include first
Xsearches the current directory, then searches the -I directories in the
Xorder given, and finally searches the default include file directory
X(see below). @SysInclude and the -i option omit the search of the
Xcurrent directory.
X.TP
X-F<dirname>
XAdd <dirname> to the list of directories searched for font (.AFM) files.
XThere may be multiple -F options; the directories are searched in the
Xorder given, and finally the default font file directory is searched
X(see below).
X.TP
X-D<dirname>
XAdd <dirname> to the list of directories searched for Lout database
Xfiles. There may be multiple -D options. @Database searches the
Xcurrent directory, then the -D directories in the order given, and
Xfinally searches the default database file directory (see below).
X@SysDatabase omits the search of the current directory.
X.TP
X-V
XPrint version information on stderr.
X.TP
X-EPS
XProduce output in the form of an EPS (Encapsulated PostScript) file,
Xsuitable for inclusion in another document.
X.SH LIMITS
X.nf
XAt most 255 input files (no limit on @IncludeGraphic files)
XAt most 255 characters per input line
XAt most 100 fonts (each different size counts as one font)
XAt most 5 deep nesting of @Include files
X.SH FILES
X.nf
X<BINDIR>/lout - Binary file
X<LIBDIR>/include - Default include file dir.
X<LIBDIR>/data - Default standard databases dir.
X<LIBDIR>/font - Default font metrics files dir.
X<DOCDIR> - Directory containing Lout documentation
X.fi
X.SH SEE ALSO
X.P
Xlpr(1), ghostview(1)
X.SH REFERENCES
X.P
XFor a description of the Lout document formatting system,
Xsee Jeffrey H. Kingston, "Document Formatting with Lout",
XTech. Rep. 449, Basser Dept. of Computer Science, The
XUniversity of Sydney 2006, Australia (December 1992).
XSee Adobe Systems Inc., "PostScript Language Reference Manual
X(Second Edition)", Addison-Wesley, 1990, for PostScript.
X.SH AUTHOR
X.P
XJeffrey H. Kingston
END_OF_FILE
if test 2954 -ne `wc -c <'lout/man/lout.1'`; then
echo shar: \"'lout/man/lout.1'\" unpacked with wrong size!
fi
# end of 'lout/man/lout.1'
fi
echo shar: End of archive 28 \(of 30\).
cp /dev/null ark28isdone

Jeff Kingston

unread,
Jun 1, 1993, 11:07:00 PM6/1/93
to
Submitted-by: je...@joyce.cs.su.oz.au (Jeff Kingston)
Posting-number: Volume 37, Issue 127
Archive-name: lout/part29
Environment: UNIX

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: lout/README lout/doc/tr.begin/s05 lout/doc/tr.begin/s06
# lout/doc/tr.begin/s08 lout/doc/tr.begin/s09 lout/doc/tr.begin/s11
# lout/doc/tr.begin/s12 lout/doc/tr.eq/s0 lout/doc/tr.eq/s1
# lout/doc/tr.eq/setup lout/doc/tr.fig/s0 lout/doc/tr.fig/s1
# lout/doc/tr.fig/s7 lout/doc/tr.fig/setup lout/doc/tr.impl/s1.0
# lout/doc/tr.impl/s3.1 lout/doc/tr.impl/s3.4
# lout/doc/tr.lout/ch0.00 lout/doc/tr.lout/ch2.03
# lout/doc/tr.lout/ch3.06 lout/doc/tr.lout/ch3.08
# lout/doc/tr.lout/ch3.10 lout/doc/tr.lout/ch3.11
# lout/doc/tr.lout/ch3.13 lout/doc/tr.lout/ch3.16
# lout/doc/tr.lout/ch3.21 lout/doc/tr.lout/ch3.22
# lout/doc/tr.lout/ch3.24 lout/doc/tr.over/s0 lout/doc/tr.over/s6
# lout/doc/tr.over/s7 lout/doc/tr.tab/s0 lout/doc/tr.tab/s1
# lout/doc/tr.tab/s3 lout/doc/tr.tab/s5 lout/hyph.install
# lout/include/ft


# Wrapped by kent@sparky on Sun May 30 19:44:02 1993
PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 29 (of 30)."'
if test -f 'lout/README' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/README'\"
else
echo shar: Extracting \"'lout/README'\" \(2310 characters\)
sed "s/^X//" >'lout/README' <<'END_OF_FILE'
XLOUT: A HIGH-LEVEL LANGUAGE FOR DOCUMENT FORMATTING (VERSION 2.03)
XCOPYRIGHT (C) 1993 Jeffrey H. Kingston
X
XJeffrey H. Kingston
XBasser Department of Computer Science
XThe University of Sydney 2006
XAUSTRALIA
X
XTelephone (direct): 61 2 692 4216
XTelephone (messages): 61 2 692 3423
XEmail: je...@cs.su.oz.au
XFax: 61 2 692 3838
X
XThis program is free software; you can redistribute it and/or modify
Xit under the terms of the GNU General Public License as published by
Xthe Free Software Foundation; either version 1, or (at your option)
Xany later version.
X
XThis program is distributed in the hope that it will be useful,
Xbut WITHOUT ANY WARRANTY; without even the implied warranty of
XMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
XGNU General Public License for more details.
X
XYou should have received a copy of the GNU General Public License
X(file gnu.gpl in this directory); if not, write to the Free Software
XFoundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
X
XVersion 2.xx is not completely upward compatible with the original October
X1991 release. The Lout base language semantics have changed slightly (some
Xobjects come out wider than they used to), but more importantly the standard
Xpackages DocumentLayout, ReportLayout, and BookLayout have been coalesced
Xinto one, and some changes made to some of the symbols. This means that
Xmost setup files will need to be changed. The more specialized packages
X(Tab, Eq, Fig, and Pas) are compatible with the old versions. Apologies for
Xany inconvenience caused.
X
X
XThis directory contains everything needed to install the Lout document
Xformatting system on Unix. It contains the following directories:
X
X include Lout packages (in Lout) and hyphenation patterns file
X data Lout databases (in Lout)
X font0 Adobe Systems font metrics (.AFM) files (ASCII)
X font1 Adobe Systems font metrics (.AFM) files (ISO-LATIN-1)
X doc Lout documents (in Lout)
X man Lout manual entry
X
Xand the following files:
X
X externs z*.c Lout source code
X gnu.gpl A copy of the GNU General Public License
X hyph.install Information about how to change the hyphenation patterns
X makefile A makefile for installing Lout
X
XPlease see the makefile for installation instructions.
END_OF_FILE
if test 2310 -ne `wc -c <'lout/README'`; then
echo shar: \"'lout/README'\" unpacked with wrong size!
fi
# end of 'lout/README'
fi
if test -f 'lout/doc/tr.begin/s05' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.begin/s05'\"


else
echo shar: Extracting \"'lout/doc/tr.begin/s05'\" \(2789 characters\)

sed "s/^X//" >'lout/doc/tr.begin/s05' <<'END_OF_FILE'
X@Section
X @Tag { paras }
X @Title { Paragraph breaking }
X@Begin
X@PP
XLout takes the words or other things making up a paragraph and fills
Xlines with them. If two words are separated by one space in the input,
Xthey will be separated by one space in the output; two spaces in, two
Xspaces out, and so on. The end of a line counts as one space, and a tab
Xcharacter as eight. These spaces are then enlarged to remove ragged line ends.
X@PP
XThis process is called @I paragraph {@I breaking}, and the enlargement
Xof spaces is @I {line adjustment.} The @Code "@Break" symbol, which is
Xmost commonly used with displays and list items, affects paragraph
Xbreaking:
X@ID @Code {
X"@IndentedDisplay ragged @Break {"
X"This little paragraph will appear with"
X"ragged ends to its lines."
X"}"
X}
Xhas result
X@IndentedDisplay 4c @Wide ragged @Break {
XThis little paragraph will appear with
Xragged ends to its lines.
X}
Xwhen placed in a four centimetre column; line adjustment is turned
Xoff. Also available are @Code "cragged @Break" and {@Code "rragged @Break"},
Xwhich centre or right-justify each line respectively after breaking.
X@PP
XIt is also possible to have paragraphs broken in the output at the same
Xplaces they are broken in the input, using { @Code "lines @Break" }:
X@ID @Code {
X"@CenteredDisplay lines @Break @I {"
X"Teach me to hear Mermaides singing,"
X"Or to keep off envies stinging,"
X" And finde"
X" What winde"
X"Serves to'advance an honest minde."
X"}"
X}
Xhas result
X@CenteredDisplay lines @Break @I {
XTeach me to hear Mermaides singing,
XOr to keep off envies stinging,
X And finde
X What winde
XServes to'advance an honest minde.
X}
XWith @Code "lines @Break" it makes sense to indent individual lines in the
Xinput (except the first), as shown. To centre or right-justify each line, use
X{@Code "clines @Break"} or {@PageMark clines} {@Code "rlines @Break"}.
X@PP
XThe usual method, where Lout fills and adjusts lines, is called
X{@Code "adjust @Break"}. It has a variant called {@Code "outdent @Break"}
Xwhich inserts a small space at the beginning of each line except the first.
X@PP
XThe @Code "@Break" symbol also controls hyphenation: @Code "hyphen"
X@Code "@Break" turns it on, @Code "nohyphen" @Code "@Break" turns it
Xoff. For example, ragged breaking is often done without hyphenation,
Xlike this:
X@ID @Code {
X"@ID { ragged nohyphen } @Break {"
X"This little paragraph will appear with"
X"ragged ends to its lines."
X"}"
X}
XTo prevent hyphenation in the entire document, see Section
X{@NumberOf changes}. To tell Lout where you would prefer a hyphen to be
Xinserted (rarely necessary), use the @Code "&-" symbol:
X@ID @Code {
X"incent&-iv&-ate"
X}
XIf @Code "&-" occurs directly after a hyphen character, hyphenation will
Xbe permitted but no extra hyphen will be inserted.
X@End @Section
END_OF_FILE
if test 2789 -ne `wc -c <'lout/doc/tr.begin/s05'`; then
echo shar: \"'lout/doc/tr.begin/s05'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.begin/s05'
fi
if test -f 'lout/doc/tr.begin/s06' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.begin/s06'\"
else
echo shar: Extracting \"'lout/doc/tr.begin/s06'\" \(1009 characters\)
sed "s/^X//" >'lout/doc/tr.begin/s06' <<'END_OF_FILE'
X@Section
X @Tag { cnp }
X @Title { Conditional new page }
X@Begin
X@PP
XOccasionally Lout will insert a page break directly following a heading,
Xand this looks very poor. The solution is to precede the heading with
Xthe conditional new page symbol {@Code "@CNP"}, which checks whether
Xenough space is left in the page or column for a heading and at least
Xtwo lines of text. If so, @Code "@CNP" does nothing; if not, @Code "@CNP"
Xcauses a new page or column to be begun, like {@Code "@NP"}. The recommended
Xarrangement is
X@ID @Code {
X"end of previous part."
X"@DP"
X"@CNP"
X"@Heading { A Heading }"
X"@PP"
X"First paragraph of next part ..."
X}
XThe @Code "@CNP" symbol should be preceded by either @Code "@DP" or
X@Code "@LP", preferably {@Code "@DP"}, and this determines the amount of
Xspace when the @Code "@NP" action does not occur. In most cases it will
Xbe better to use the @Code "@Section" symbol described below, which has
X@Code "@CNP" included in it, rather than using @Code "@CNP" directly.
X@End @Section
END_OF_FILE
if test 1009 -ne `wc -c <'lout/doc/tr.begin/s06'`; then
echo shar: \"'lout/doc/tr.begin/s06'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.begin/s06'
fi
if test -f 'lout/doc/tr.begin/s08' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.begin/s08'\"
else
echo shar: Extracting \"'lout/doc/tr.begin/s08'\" \(1142 characters\)
sed "s/^X//" >'lout/doc/tr.begin/s08' <<'END_OF_FILE'
X@Section
X @Tag { footnotes }
X @Title { Footnotes, figures, and tables }
X@Begin
X@PP
XA footnote is created by typing
X@ID @Code "@FootNote { Like this. }"
Xafter the word that the footnote refers to. It will be numbered
Xautomatically and placed at the foot of the page or column;
X@FootNote { Like this. }
Xor, if space there is insufficient, it may start on or run onto the
Xfollowing page or column. Figures are created in a similar way:
X@ID @Code {
X"@Figure"
X" @Caption { Basser Lout }"
X"@Fig {"
X" @Box Lout &"
X" @HArrow { 2c @Wide } &"
X" @Box PostScript"
X"}"
X}
XThe @Code "@Figure" symbol places the figure (which in this example is
Xcreated using the Fig figure drawing package [{@Ref kingston92fig}]) at
Xthe top of the following column or page,
X@Figure
X @Caption { Basser Lout }
X@Fig {
X @Box Lout &
X @HArrow { 2c @Wide } &
X @Box PostScript
X}
Xlabelled by the @Code "@Caption" option and automatically numbered. Unlike
Xfootnotes, figures will not break across several pages; each figure must
Xfit on one page.
X@PP
XTables are obtained in the same way using {@Code "@Table"} instead of
X{@Code "@Figure"}.
X@End @Section
END_OF_FILE
if test 1142 -ne `wc -c <'lout/doc/tr.begin/s08'`; then
echo shar: \"'lout/doc/tr.begin/s08'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.begin/s08'
fi
if test -f 'lout/doc/tr.begin/s09' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.begin/s09'\"
else
echo shar: Extracting \"'lout/doc/tr.begin/s09'\" \(1428 characters\)
sed "s/^X//" >'lout/doc/tr.begin/s09' <<'END_OF_FILE'


X@Section
X @Tag { cross }
X @Title { Cross references }
X@Begin
X@PP

X@I {Cross references} like `see page {@PageOf cross}' are a useful feature of
Xdocuments, but they are troublesome to authors, since, as the document
Xis revised, the thing on page {@PageOf cross} might find itself on page
X{@PageOf reportlayout} and the cross reference must be changed. Lout has
Xa simple solution to this problem: instead of writing the page number
Xdirectly, write
X@ID @Code "see page {@PageOf taxinfo}"
Xinstead, and at the point referred to, write
X@ID @Code "Taxation {@PageMark taxinfo} ..."
X@Code "{@PageMark taxinfo}" will not appear in the output, but Lout makes
Xa note of the number of the page on which the word preceding it appears,
Xand inserts that number in place of {@Code "{@PageOf taxinfo}"}. Any
Xsingle word may be used for the tag.
X@PP
XCross referencing also applies to sections, subsections, appendices,
Xsubappendices, figures, tables, and numbered displays, and can supply
Xboth the page on which the item begins and its number. First, add a
X@Code "@Tag" option whose value is a single word:
X@ID @Code {
X"@Section"
X" @Title { Cross references }"
X" @Tag { cross }"


X"@Begin"
X"..."
X}

XThis marks the page on which the section begins, so @Code "{@PageOf cross}"
Xwill be {@PageOf cross} in this case. In addition, @Code "{@NumberOf cross}"
Xwill be the number of the section, in this case {@NumberOf cross}.
X@End @Section
END_OF_FILE
if test 1428 -ne `wc -c <'lout/doc/tr.begin/s09'`; then
echo shar: \"'lout/doc/tr.begin/s09'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.begin/s09'
fi
if test -f 'lout/doc/tr.begin/s11' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.begin/s11'\"
else
echo shar: Extracting \"'lout/doc/tr.begin/s11'\" \(953 characters\)
sed "s/^X//" >'lout/doc/tr.begin/s11' <<'END_OF_FILE'
X@Section
X @Tag { cols }
X @Title { Multiple columns }
X@Begin
X@PP
XDocumentLayout normally produces pages with a single column of text occupying
Xthe full width. To get multiple columns, enclose the document in
X@ID @Code {
X"@Doc @ColText @Begin"
X"..."
X"@End @ColText"
X}
XThis will ordinarily produce two columns per page, although we will see
Xin the next section how to produce three or more.
X@PP
XIt is possible to start off a document with single columns and switch to
Xmultiple columns later, using the following arrangement:


X@ID @Code {
X"@Doc @Text @Begin"

X"single column part"
X"@ColText @Begin"
X"multiple column part"
X"@End @ColText"
X"@End @Text"
X}
XThis is the most useful combination, because switching from multiple back to
Xsingle causes a new page to be begun, which generally looks poor. Tables
Xand figures are always full width, but the width of footnotes depends on
Xwhether they occur within @Code "@Text" or {@Code "@ColText"}.
X@End @Section
END_OF_FILE
if test 953 -ne `wc -c <'lout/doc/tr.begin/s11'`; then
echo shar: \"'lout/doc/tr.begin/s11'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.begin/s11'
fi
if test -f 'lout/doc/tr.begin/s12' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.begin/s12'\"
else
echo shar: Extracting \"'lout/doc/tr.begin/s12'\" \(2068 characters\)
sed "s/^X//" >'lout/doc/tr.begin/s12' <<'END_OF_FILE'
X@Section
X @Tag { changes }
X @Title { Changing the overall appearance }
X@Begin
X@PP
XA few aspects of the overall appearance of the document may be changed
Xby beginning with a @Code "@Document" symbol, as in the following
Xexample:
X@ID @Code {
X"@Document"


X" @InitialFont { Times Base 12p }"
X" @InitialBreak { adjust 1.2fx }"
X" @Hyphenate { Yes }"
X" @PageNumbers { Yes }"

X" @FirstPageNumber { 1 }"
X" @Columns { Double }"
X"//"
X"@Text @Begin"
X"..."
X"@End @Text"
X}
XThis shows the six options available with {@Code "@Document"}, and their
Xdefault values.
X@PP
X@Code "@InitialFont" and @Code "@InitialBreak" determine
Xthe overall font and paragraph breaking style; @Code "1.2fx" means that
Xthe inter-line spacing is to be 1.2 times the current font size, measured
Xfrom baseline to baseline. To get double spacing, use {@Code "2.4fx"},
Xetc. @Code "@Hyphenate" determines whether hyphenation is permitted or
Xnot, and may be @Code Yes or {@Code No}.
X@PP
X@Code "@PageNumbers" determines whether or not page numbers will be
Xprinted (but not their format), and also may be @Code Yes or {@Code No};
X@Code "@FirstPageNumber" is the number given to the first page; and
X@Code "@Columns" determines the number of columns that @Code "@ColText"
Xproduces, and may be {@Code Single}, {@Code Double}, or {@Code Multi},
Xthe last usually meaning triple.
X@PP
XSince there are default values for the options, it is only necessary to
Xmention those options that are to be changed. For example, to produce a
Xdocument in Helvetica 10 point font with no page numbers, begin with
X@ID @Code {
X"@Document"


X" @InitialFont { Helvetica Base 10p }"

X" @PageNumbers { No }"
X"//"
X}
XDisaster will ensue if the @Code "//" symbol is forgotten. The
X@Code "@Doc" symbol used previously is just an abbreviation for
X{@Code "@Document //"}.
X@PP
XOf course, these five options only scratch the surface of the possible
Xchanges that could be made. Section {@NumberOf big.changes} explains
Xhow to make many other and more radical changes to the overall appearance
Xof the document.
X@End @Section
END_OF_FILE
if test 2068 -ne `wc -c <'lout/doc/tr.begin/s12'`; then
echo shar: \"'lout/doc/tr.begin/s12'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.begin/s12'
fi
if test -f 'lout/doc/tr.eq/s0' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.eq/s0'\"
else
echo shar: Extracting \"'lout/doc/tr.eq/s0'\" \(909 characters\)
sed "s/^X//" >'lout/doc/tr.eq/s0' <<'END_OF_FILE'
X@Report
X @Title { Eq -- A Lout Package for Typesetting Mathematics }
X @Author { Jeffrey H. Kingston }
X @Institution { Basser Department of Computer Science
XUniversity of Sydney 2006
XAustralia }
X @DateLine { 22 December, 1992 }
X//
X
X@Abstract {
XThis report describes the use of Eq, a package of definitions for
Xtypesetting mathematics with the Lout document formatter. For example,
X@ID @Code "@Eq { big int supp 1 on 0 ` dx over sqrt {1 - x sup 2} = pi over 2 }"
Xproduces the output
X@ID @Eq { big int supp 1 on 0 ` dx over sqrt {1 - x sup 2} = pi over 2 }
XThe advantages of Eq include careful attention to details of spacing, a
Xrepertoire of several hundred mathematical symbols, a simple syntax
Xextensible by the user, and complete integration with the rest of Lout.
X@PP
XIn addition, this report contains an appendix describing the use of Pas,
Xa package of definitions for printing Pascal programs.
X}
END_OF_FILE
if test 909 -ne `wc -c <'lout/doc/tr.eq/s0'`; then
echo shar: \"'lout/doc/tr.eq/s0'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.eq/s0'
fi
if test -f 'lout/doc/tr.eq/s1' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.eq/s1'\"
else
echo shar: Extracting \"'lout/doc/tr.eq/s1'\" \(1344 characters\)
sed "s/^X//" >'lout/doc/tr.eq/s1' <<'END_OF_FILE'


X@Section
X @Title { Introduction }
X@Begin
X@PP

XEq is a package of definitions for typesetting mathematics with the Lout
Xdocument formatter [{@Ref kingston92}]. It includes several hundred
Xmathematical and other special characters (including the entire PostScript


X@FootNote { PostScript is a trademark of Adobe Systems, Incorporated. }

XSymbol font [{@Ref adobe90}]), and a smaller number of symbols for joining
Xobjects together in mathematical ways. Eq is based on the eqn language
Xof Kernighan and Cherry [{@Ref kernighan75}], with
Xspacing rules similar to Knuth's @TeX formatter [{@Ref knuth84}].
X@PP
XTo use Eq in a Lout document, first ensure that its definition is
Xincluded, either by having @Code "@SysInclude { eq }"
Xin the setup file, or @Code "-ieq" on the command line. Then, at any point
Xin the document, write @Code "@Eq { ... }"
Xand the symbols of Eq will be available between the braces. Any symbols
Xavailable outside continue to be available inside, which means that Eq
Xcan be freely mixed with standard Lout and with symbols from other
Xpackages, without restriction.
X@PP
XIn this report we show the Lout input at the left, and its
Xresult at the right:
X@ID {
X@Code "@Eq { {x sup 2 + y sup 2} over 2 }"
X|7ct
X@Eq { {x sup 2 + y sup 2} over 2 }
X}
XSubsequent examples will omit the enclosing {@Code "@Eq { ... }"}.
X@End @Section
END_OF_FILE
if test 1344 -ne `wc -c <'lout/doc/tr.eq/s1'`; then
echo shar: \"'lout/doc/tr.eq/s1'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.eq/s1'
fi
if test -f 'lout/doc/tr.eq/setup' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.eq/setup'\"
else
echo shar: Extracting \"'lout/doc/tr.eq/setup'\" \(1054 characters\)
sed "s/^X//" >'lout/doc/tr.eq/setup' <<'END_OF_FILE'
X
X######################################################
X# #
X# Lout setup file for Eq paper. #


X# #
X# Jeffrey H. Kingston #
X# 8 June 1991 #

X# 22 December 1992 #
X# #

X######################################################
X
X@SysInclude { ft }
X@SysInclude { dl }

X@SysInclude { tab }
X@SysInclude { eq }
X@SysInclude { pas }

X@SysInclude { fig }
X


X def @TeX { T{ /0.2fo E}X }
X

X def @Code
X right x
X { { Helvetica Base -1p } @Font lines @Break x
X }
X

X import @Eq


X def epi { p sub i ` log sub 2 ` p sub i }
X
X import @Eq
X def ep right x { p sub x ` log sub 2 ` p sub x }
X

X def @Dbl left x right y
X { 1.95i @Wide
X { 1.2i @Wide { |1rt @Code x } |0.2i @Eq {non y} }
X }
X
X@Use { @DocumentLayout
X @AppendixGap { 1.10b }
X}


X
X@SysDatabase @Reference { "loutrefs" }
END_OF_FILE

if test 1054 -ne `wc -c <'lout/doc/tr.eq/setup'`; then
echo shar: \"'lout/doc/tr.eq/setup'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.eq/setup'
fi
if test -f 'lout/doc/tr.fig/s0' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.fig/s0'\"
else
echo shar: Extracting \"'lout/doc/tr.fig/s0'\" \(1153 characters\)
sed "s/^X//" >'lout/doc/tr.fig/s0' <<'END_OF_FILE'
X@Report
X @Title { Fig -- A Lout Package for Drawing Figures }
X @Author { Jeffrey H. Kingston }
X @Institution { Basser Department of Computer Science
XThe University of Sydney 2006
XAustralia }
X @DateLine { 22 December, 1992 }
X//
X
X@Abstract @Begin
XThis report describes the use of Fig, a package of definitions
Xfor use with the Lout document formatter. Fig draws, colours, and
Xpositions arbitrary shapes made from straight lines, circular and
Xelliptical arcs, and Bezier curves:
X@CD @Fig
X margin { 0.2c }
X{
X@Frame -2p @Font
X{ A:: @Ellipse { 25, 39 }
X/0.3c |0.2c B:: @Ellipse { 43 } |0.1c |0.8c E:: @Box linestyle {noline} {Problem node}
X/0.3c C:: @Ellipse { 40, 41 } | | D:: @Ellipse paint { light } {44, 45, 46}
X}
X// @Line from { A@SE } to { B@NW }
X// @Line from { B@SW } to { C@NE }
X// @Line from { B@SE } to { D@NW }
X// @Arrow from { E@W } to { D@NE }
X}
XThe graphical objects may be rotated and scaled; they may enclose, and
Xbe enclosed by arbitrary Lout objects (text, equations, tables, other
Xgraphical objects, etc.) without restriction. A convenient algebra of
Xpoints and a method of labelling points assist positioning.
X@End @Abstract
END_OF_FILE
if test 1153 -ne `wc -c <'lout/doc/tr.fig/s0'`; then
echo shar: \"'lout/doc/tr.fig/s0'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.fig/s0'
fi
if test -f 'lout/doc/tr.fig/s1' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.fig/s1'\"
else
echo shar: Extracting \"'lout/doc/tr.fig/s1'\" \(1445 characters\)
sed "s/^X//" >'lout/doc/tr.fig/s1' <<'END_OF_FILE'


X@Section
X @Title { Introduction }
X@Begin
X@PP

XFig is a package of Lout definitions for drawing and filling in
Xarbitrary shapes made from straight lines, circular and elliptical arcs,
Xand Bezier curves. Its features are smoothly integrated with the rest
Xof Lout: one can rotate and concatenate objects created by Fig, draw a
Xbox to fit neatly around any object, etc. The design of Fig is based
Xentirely on Brian W. Kernighan's PIC language [{@Ref kernighan82}]. The
Ximplementation of Fig makes good use of the PostScript
X@FootNote { PostScript is a trademark of Adobe Systems, Inc. }
Xpage description language [{@Ref adobe90}], which was designed by John
XWarnock and others. Lout was designed and implemented by Jeffrey
XH. Kingston [{@Ref kingston92}].
X@PP
XTo use Fig within a Lout document, first ensure that its definition is
Xincluded, either by putting @Code "@SysInclude { fig }" at the start of
Xthe document, or @Code "-ifig" on the command line. Then, anywhere at
Xall within the document, write
X@ID @Code "@Fig { ... }"
Xand the symbols of Fig will be available
Xbetween the braces, which may enclose an arbitrary Lout object. Throughout
Xthis report we will show the Lout text on the left and the corresponding
Xresult on the right, like this:
X@ID {
X@Code {
X"@Fig {"
X" @Square"
X" //0.5c"
X" @Circle"


X"}"
X}
X||7ct
X@Fig {

X @Square
X //0.5c
X @Circle
X}
X}
XSubsequent examples will omit the enclosing {@Code "@Fig"}.
X@End @Section
END_OF_FILE
if test 1445 -ne `wc -c <'lout/doc/tr.fig/s1'`; then
echo shar: \"'lout/doc/tr.fig/s1'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.fig/s1'
fi
if test -f 'lout/doc/tr.fig/s7' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.fig/s7'\"
else
echo shar: Extracting \"'lout/doc/tr.fig/s7'\" \(1067 characters\)
sed "s/^X//" >'lout/doc/tr.fig/s7' <<'END_OF_FILE'
X@Section
X @Title { Errors }
X@Begin
X@PP
XLout normally produces an output file that will print without mishap on
Xany PostScript device. However, some of the options of Fig's symbols
Xare passed through Lout to the output file without checking, including
Xanything containing Fig lengths, angles, points, and labels. Any errors
Xin these options will not be detected until the file is printed.
X@PP
XThe most likely errors are {@I syntax @I errors}, as in
X@Code "shape { 0 0 [ 0 xsize }" for example, in which a @Code "]" is
Xmissing; {@I type @I errors}, as in @Code "0 0 @Distance 45" where the
Xright parameter is not a point; and {@I undefined @I errors}, arising
Xfrom labels misspelt or used before being defined. Less commonly, the
Xoptions may all be correct but the figure is too large in some way: too
Xmany labels, too deeply nested, etc.
X@PP
XWhen an error is detected, Fig arranges for the offending page to
Xbe printed up to the point where the error occurred, with a message
Xnearby describing the error. Printing of the document is then aborted.
X@End @Section
END_OF_FILE
if test 1067 -ne `wc -c <'lout/doc/tr.fig/s7'`; then
echo shar: \"'lout/doc/tr.fig/s7'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.fig/s7'
fi
if test -f 'lout/doc/tr.fig/setup' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.fig/setup'\"
else
echo shar: Extracting \"'lout/doc/tr.fig/setup'\" \(1718 characters\)
sed "s/^X//" >'lout/doc/tr.fig/setup' <<'END_OF_FILE'
X
X######################################################
X# #
X# Lout setup file for producing the Fig report. #


X# #
X# Jeffrey H. Kingston #
X# 8 June 1991 #

X# 22 December 1992 #
X# #

X######################################################
X
X@SysInclude { ft }
X@SysInclude { dl }

X@SysInclude { tab }


X@SysInclude { eq }
X@SysInclude { fig }
X
X def @Code
X right x
X { { Helvetica Base -1p } @Font lines @Break x
X }
X

X import @Fig


X def @JoinFigures
X left A
X named linestyle { solid }

X named dashlength { 0.15 cm }

X named arrow { noarrow }


X named linewidth { 0.5 pt }
X right B
X { @Arrow

X from { A"@CTR" ++ {{A"@CTR" @Angle B"@CTR"} A@CIRCUM} }
X to { B"@CTR" ++ {{B"@CTR" @Angle A"@CTR"} B@CIRCUM} }


X linestyle { linestyle }
X dashlength { dashlength }

X arrow { arrow }
X linewidth { linewidth }

X@Use { @DocumentLayout }
X
X@SysDatabase @Reference { "loutrefs" }
END_OF_FILE

if test 1718 -ne `wc -c <'lout/doc/tr.fig/setup'`; then
echo shar: \"'lout/doc/tr.fig/setup'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.fig/setup'
fi
if test -f 'lout/doc/tr.impl/s1.0' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.impl/s1.0'\"
else
echo shar: Extracting \"'lout/doc/tr.impl/s1.0'\" \(2523 characters\)
sed "s/^X//" >'lout/doc/tr.impl/s1.0' <<'END_OF_FILE'


X@Section
X @Title { Introduction }
X@Begin
X@PP

XLout [1, 2] is a high-level language
Xfor document formatting, designed and implemented by the author. The
Ximplementation, known as Basser Lout, is a fully operational production
Xversion written in C for the Unix operating system,


X@FootNote { Unix is a trademark of "AT&T" Bell Laboratories. }

Xwhich translates Lout source code into PostScript,


X@FootNote { PostScript is a trademark of Adobe Systems, Incorporated. }

Xa device-independent graphics rendering language accepted by many
Xhigh-resolution output devices, including most laser printers. Basser
XLout is available free of charge [3]. It includes
Xinstallation instructions, C source, seven standard packages, and complete
Xdocumentation in the form of six technical reports and a manual page.
X@PP
XThe Lout project arose out of the author's desire to bring to document
Xformatting languages the elegance of expression found in programming
Xlanguages like Algol-60 and Pascal. This emphasis on expressiveness
Xhas produced an order of magnitude reduction in the cost of developing
Xdocument formatting applications. For example, an equation formatting
Xapplication, which may be difficult or impossible to add to other
Xsystems, can be written in Lout in a few days.
X@PP
XWhen expert users can implement such applications quickly, non-experts
Xbenefit. Although Lout itself provides only a small kernel of carefully
Xchosen primitives, packages written in Lout and distributed with Basser
XLout provide an unprecedented array of advanced features in a form
Xaccessible to non-expert users. The features include rotation and scaling,
Xfonts, paragraph and page breaking, displays and lists, floating figures
Xand tables, footnotes, chapters and sections (automatically numbered),
Xrunning page headers and footers, odd-even page layouts, automatically
Xgenerated tables of contents, sorted indexes and reference lists,
Xbibliographic and other databases (including databases of formats for
Xprinting references), equations, tables, diagrams, formatting of
XPascal programs, and automatically maintained cross references.
X@PP
XThis paper charts the evolution of Lout from conception in mid-1984 to the
Xpublic release of Basser Lout in October 1991. Lout is organized around
Xfour key concepts -- objects, definitions, galleys, and cross references --
Xand they were developed in the order listed, so this paper will treat each
Xin turn, discussing its design, implementation, problems, and
Xprospects for further improvement.
X@End @Section
END_OF_FILE
if test 2523 -ne `wc -c <'lout/doc/tr.impl/s1.0'`; then
echo shar: \"'lout/doc/tr.impl/s1.0'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.impl/s1.0'
fi
if test -f 'lout/doc/tr.impl/s3.1' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.impl/s3.1'\"
else
echo shar: Extracting \"'lout/doc/tr.impl/s3.1'\" \(2778 characters\)
sed "s/^X//" >'lout/doc/tr.impl/s3.1' <<'END_OF_FILE'
X@SubSection
X @Tag { operators }
X @Title { Operators }
X@Begin
X@PP
XIt is evident from the example of Eqn that user-defined operators are
Xneeded that mimic the primitive ones in taking objects as parameters
Xand returning objects as results. For example, to define a superscript
Xoperator so that
X@ID @Code "2 sup n"
Xappears as {@Eq {2 sup @R n}}, the following operator definition may
Xbe used:


X@ID @Code {
X"def sup"

X" precedence 50"
X" associativity right"
X" left x"
X" right y"
X"{"
X" @OneRow { | {-2p @Font y} ^/0.5fk x }"
X"}"
X}

XThe @Code "sup" operator has precedence 50, is right associative, takes
Xtwo objects as parameters passed on the left and right, and returns the
Xobject between braces as result. This object has the structure
X@ID @I +2p @Font {
X| @ShowMarks @Code y / @ShowMarks @Code x
X}
Xbut with the first row mark hidden by the @Code "@OneRow" operator,
Xand @Code y two points smaller than it would otherwise have been. The
Xlength @Code "0.5f" specifies half the current font size; Figure
X{@NumberOf gapmodes} describes the @Code k gap mode. In the Eq equation
Xformatting package [10] the equation as a whole is
Xset in italic font, and @Code 2 is an identifier whose body contains
Xa font change back to Roman. The digits @Code 0 to @Code 9 are classed
Xas punctuation characters, permitting @Code 234 for example to be
Xinterpreted as a sequence of three identifiers.
X@PP
XThese definitions are easily implemented by a standard symbol table
Xand an operator precedence parser. Algol block structure with the
Xusual scope rules was adopted as a matter of course.
X@PP
XOperators are limited to at most two parameters, left and
Xright, and the parameters cannot be given default values. @I Named
Xparameters solve both problems:
X@ID @Code {
X"def @Preface"
X" named @Tag {}"
X" named @Title { Preface }"
X" right @Body"
X"{"
X" Bold @Font @Title"
X" //0.3v @Body"
X"}"
X}
XThe default value appears just after the parameter's declaration,
Xbetween braces. Invocations have a natural syntax:
X@ID @Code {
X"@Preface"


X" @Title { About this book }"

X"{"
X" Few observers would have supposed in 1984, that ..."
X"}"
X}
Xwith the actual named parameters following directly after the
Xoperator, before any right parameter. In this example, @Code "@Tag"
Xwill receive its default value, and a less expert user could safely
Xomit the @Code "@Title" parameter as well.
X@PP
XLout permits named parameters to have parameters, a feature with
Xapplications to bibliographic databases, running headers, and other
Xplaces where a format has to be supplied before content is
Xknown. One could go further and provide a complete lambda calculus,
Xwith functions as first-class objects, provided care was taken not
Xto intimidate the non-expert user.
X@End @SubSection
END_OF_FILE
if test 2778 -ne `wc -c <'lout/doc/tr.impl/s3.1'`; then
echo shar: \"'lout/doc/tr.impl/s3.1'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.impl/s3.1'
fi
if test -f 'lout/doc/tr.impl/s3.4' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.impl/s3.4'\"
else
echo shar: Extracting \"'lout/doc/tr.impl/s3.4'\" \(2778 characters\)
sed "s/^X//" >'lout/doc/tr.impl/s3.4' <<'END_OF_FILE'
X@SubSection
X @Tag { defs.impl }
X @Title { Implementation of definitions }
X@Begin
X@PP
XInput is processed by a hybrid parser which employs operator precedence
Xfor objects and simple recursive descent for the headers of
Xdefinitions. A symbol table stores the body of each definition as a
Xparse tree, except for macros which are lists of tokens, and manages the
Xusual stack of static scopes, accepting @I PushScope and @I PopScope
Xoperations as the parser enters and leaves scope regions, including
Xactual body parameters and the right parameter of the @Code "@Open"
Xoperator.
X@PP
XAs the parse proceeds, a complete call graph is constructed, recording,
Xfor each symbol, which symbols are invoked within its body. Immediately
Xafter the last definition is read, the transitive closure of the call
Xgraph is computed, and used to determine whether each non-parameter
Xsymbol is recursive or receptive (Section {@NumberOf galleys}), and
Xwhether each parameter is invoked exactly once or not.
X@PP
XPurely functional systems may evaluate symbol invocations in applicative
Xorder (where parameters are evaluated before substitution into bodies),
Xor in normal order (substitution before evaluation), and they may also
Xshare the value of a parameter among all uses of it. But in Basser
XLout, the presence of context-sensitive style information (Section
X{@NumberOf style}) forces normal order evaluation and prevents sharing
Xof parameter values.
X@PP
XTo evaluate an unsized object (pure parse tree), its {@I environment},
Xthe equivalent of the stack frames in Algol-like languages, must be
Xavailable, containing the actual values of all formal parameters
Xthat are visible within the unsized object. Environment handling is
Xa well-known implementation technique, so it will be discussed
Xonly briefly here.
X@PP
XEnvironments are extra subtrees hung from the objects they refer
Xto. This organization makes excellent use of the ordered dag to
Xpermit environments to be shared, and deleted when the last
Xreference to them is removed. Several optimizations have been
Ximplemented. Actual parameters known to be invoked only once are moved
Xin from the environment, not copied; copying could lead to quadratic time
Xcomplexity. Actual parameters of the form @Code "@Next" @I object
Xreceive an applicative pre-evaluation which prevents long chains of
X@Code "@Next" symbols from forming during the generation of large page
Xnumbers. Some environments which provably contribute nothing are
Xdeleted, most notably when a symbol invocation has no symbols within its
Xactual parameters and no import list, so that only the environment of its
Xbody need be kept; this saves a great deal of space when objects with
Xenvironments are written to auxiliary files (Section {@NumberOf cross}).
X@End @SubSection
END_OF_FILE
if test 2778 -ne `wc -c <'lout/doc/tr.impl/s3.4'`; then
echo shar: \"'lout/doc/tr.impl/s3.4'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.impl/s3.4'
fi
if test -f 'lout/doc/tr.lout/ch0.00' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch0.00'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch0.00'\" \(2371 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch0.00' <<'END_OF_FILE'
X
X######################################################
X# #
X# Start main document off #
X# #
X######################################################
X
X@Book


X @Title { Document Formatting
X

Xwith Lout }
X @Author { JEFFREY H. KINGSTON }
X @Edition { SECOND EDITION
X
X23 April, 1993}
X @Publisher { @I { @CopyRight Copyright 1991 and 1993, Jeffrey H. Kingston,
XBasser Department of Computer Science, The University
Xof Sydney 2006, Australia.} }
X//
X
X@Preface
X @Tag { preface }
X@Begin
X@LP
X@IndexBlanks
XThis manual is addressed to those who wish to become
Xexpert users of the document formatting language Lout. An expert user
Xis someone who understands the principles of document formatting
Xthat Lout embodies, and is able to apply them, for example to design
Xa document format or a special-purpose package. In contrast, a non-expert
Xuser is someone who simply uses Lout to format documents.
X@PP
XChapter {@NumberOf principles} explains these principles, and it
Xshould be read carefully and in sequence. Chapters {@NumberOf details}
Xand {@NumberOf symbols} are for reference; respectively, they
Xcontain descriptions of the detailed operation of Lout's major
Xcomponents, and a complete description of each predefined symbol. The
Xfinal chapter presents a collection of advanced examples.
X@PP
XThis manual presents Version 2 of Basser Lout, as released in April 1993
X[{@Ref kingston93basser}]. Those familiar with Version 1 will notice
Xmany enhancements, including PostScript
X@FootNote { PostScript is a trademark of Adobe Systems, Inc. }
XEPS file inclusion, optimal paragraph breaking, automatic hyphenation,
Xand ligatures.
X@PP
XThis manual was printed on an Apple LaserWriter
Xapple.laserwriter @Index { Apple LaserWriter }
X@FootNote { Apple and LaserWriter are trademarks of Apple Computer, Inc. }
Xlaser printer from a PostScript
Xpostscript @Index { PostScript }
Xfile generated by Version 2 of the Basser Lout interpreter, using the
XDocumentLayout package [{@Ref kingston92begin}].
X@DP
X@Heading { Acknowledgment. } Version 2 has benefited from hundreds of
Xcomments received since the release of Version 1 in October 1991. Not
Xevery suggestion could be followed, but many have been, and the
Xencouragement was greatly appreciated.
X@End @Preface
END_OF_FILE
if test 2371 -ne `wc -c <'lout/doc/tr.lout/ch0.00'`; then
echo shar: \"'lout/doc/tr.lout/ch0.00'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch0.00'
fi
if test -f 'lout/doc/tr.lout/ch2.03' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch2.03'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch2.03'\" \(2556 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch2.03' <<'END_OF_FILE'
X@Section
X @Tag { named }
X @Title { Named parameters }
X@Begin
X@PP
XIn addition to left and right (or body) parameters, a symbol may have
Xany number of {@I {named parameters}}:
Xparameter.named @SubIndex { @Code named parameter }
Xnamed.par @Index { @Code named parameter }


X@ID @Code {
X"def @Chapter"

X" named @Tag {}"
X" named @Title {}"
X" right x"
X"{"
X" ..."
X"}"
X}
XTheir definitions appear in between those of any left and right
Xparameters, and each is followed by a @I {default value} between
Xdefault @Index { Default value of parameter }
Xbraces. When @Code "@Chapter" is invoked, its named parameters are
Xgiven values in the following way:
X@ID @Code {
X"@Chapter"


X" @Tag { intro }"
X" @Title { Introduction }"

X"{"
X" ..."
X"}"
X}
XThat is, a list of named parameters appears immediately following the
Xsymbol, each with its value enclosed in braces. Any right parameter
Xfollows after them. They do not have to appear in the order they were
Xdefined, and they can even be omitted altogether, in which case the
Xdefault value from the definition is used instead.
X@PP
XA named @Code "@Tag" parameter
Xtag.par @Index { @Code "@Tag" parameter, default value of }
Xdoes not take its default value from the definition; instead, if a default
Xvalue is needed, Lout invents a simple word which differs from every other
Xtag. This is important, for example, in the production of numbered
Xchapters and sections (Section {@NumberOf chapters}).
X@PP
XNamed parameters may have parameters, {@PageMark strange} as in the
Xfollowing definition:
X@ID @Code {
X"def @Strange"


X" named @Format right @Val { [@Val] }"

X" right x"
X"{"
X" @Format x"
X"}"
X}
XThe named parameter @Code "@Format" has right parameter {@Code "@Val"},
Xand the default value of @Code "@Format" is this parameter enclosed in
Xbrackets. When @Code "@Format" is invoked it must be supplied with
Xa right parameter, which will replace {@Code "@Val"}. Thus,
X@ID @Code {
X"@Strange 27"
X}
Xequals @Code "@Format 27" and so has result
X@ID {
X@Strange 27
X}
XThe @Code "@Format" symbol is like a definition with parameters whose
Xbody can be changed:
X@ID @Code {
X"@Strange"
X" @Format { Slope @Font @Val. }"
X"27"
X}
Xstill equals {@Code "@Format 27"}, but this time the result is
X@ID {
X@Strange
X @Format { Slope @Font @Val. }
X27
X}
XIn practice, examples of named parameters with parameters all have this
Xflavour of format being separated from content; running headers (Section
X{@NumberOf pagelayout}) and printing styles for bibliographies
X(Section {@NumberOf biblio}) are two major ones.
X@End @Section
END_OF_FILE
if test 2556 -ne `wc -c <'lout/doc/tr.lout/ch2.03'`; then
echo shar: \"'lout/doc/tr.lout/ch2.03'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch2.03'
fi
if test -f 'lout/doc/tr.lout/ch3.06' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch3.06'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch3.06'\" \(1114 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch3.06' <<'END_OF_FILE'
X@Section
X @Title { "@OneCol" and "@OneRow" }
X @Tag { onerow }
X@Begin
X@PP
XThe @@OneRow symbol
Xonerow.sym @Index { @@OneRow symbol }
Xprincipal.mark.effect @SubIndex { effect on @@OneCol and @@OneRow }
Xreturns its right parameter modified so that only the principal row mark
Xprotrudes. This is normally the first row mark, but another one may be
Xchosen by preceding it with @Code "^/" or {@Code "^//"}. For example,
X@ID @Code {
X"@OneRow { |0.5rt Slope @Font x + 2 ^//1p @HLine //1p |0.5rt 5 }"
X}
Xhas result
X@LP
X@ID {
X@ShowMarks
X@OneRow { |0.5rt Slope @Font x + 2 ^//1p @HLine //1p |0.5rt 5 }
X}
X@LP
Xwith one row mark protruding from the bar as shown. Compare this with
X@ID @Code {
X"@OneRow { |0.5rt Slope @Font x + 2 //1p @HLine //1p |0.5rt 5 }"
X}
Xwhere the mark protrudes from the numerator:
X@LP
X@ID {
X@ShowMarks
X@OneRow { |0.5rt Slope @Font x + 2 //1p @HLine //1p |0.5rt 5 }
X}
X@PP
Xonecol.sym @Index { @@OneCol symbol }
X@@OneCol has the same effect on columns as @@OneRow does on rows, with
Xthe symbols @Code "^|" and @Code "^||" (or {@Code "^&"}) determining
Xwhich mark is chosen.
X@End @Section
END_OF_FILE
if test 1114 -ne `wc -c <'lout/doc/tr.lout/ch3.06'`; then
echo shar: \"'lout/doc/tr.lout/ch3.06'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch3.06'
fi
if test -f 'lout/doc/tr.lout/ch3.08' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch3.08'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch3.08'\" \(1138 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch3.08' <<'END_OF_FILE'
X@Section
X @Title { "@HExpand" and "@VExpand" }
X @Tag { hexpand }
X@Begin
X@PP
Xhexpand @Index { @@HExpand symbol }
Xvexpand @Index { @@VExpand symbol }
Xexpansion @Index { Expansion of object }
XThe @@HExpand symbol causes its right parameter to be as wide as it
Xpossibly could be without violating a @@Wide symbol or intruding into
Xthe space occupied by neighbouring gaps or objects. The @@VExpand
Xsymbol is similar, but it affects height. For example, in the object
X@ID @Code {


X"8i @Wide 11i @High {"

X" //1i ||1i @HExpand @VExpand x ||1i"
X" //1i"
X"}"
X}
Xobject @Code x could have any size up to six inches wide by nine inches
Xhigh, so the @@HExpand and @@VExpand symbols cause it to have exactly
Xthis size. This is important, for example, if @Code x contains
X@Code "|1rt" or {@Code "/1rt"}; without the expansion these might not
Xmove as far across or down as expected.
X@PP
XAs Section {@NumberOf size} explains in detail, most objects are
Xalready as large as they possibly could be. Consequently these symbols
Xare needed only rarely. @@HExpand includes a @@OneCol effect, and
X@@VExpand includes a @@OneRow effect.
X@End @Section
END_OF_FILE
if test 1138 -ne `wc -c <'lout/doc/tr.lout/ch3.08'`; then
echo shar: \"'lout/doc/tr.lout/ch3.08'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch3.08'
fi
if test -f 'lout/doc/tr.lout/ch3.10' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch3.10'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch3.10'\" \(1288 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch3.10' <<'END_OF_FILE'
X@Section
X @Title { "@HAdjust", "@VAdjust", and "@PAdjust" }
X @Tag { hadjust }
X@Begin
X@PP
Xpadjust @Index { @@PAdjust symbol }
Xhadjust @Index { @@HAdjust symbol }
Xvadjust @Index { @@VAdjust symbol }
Xadjustment @Index { Adjustment of object }
XThese symbols spread their right parameter apart until it occupies
Xall the space available to it; @@HAdjust adjusts @Code "|" sequences,
X@@VAdjust adjusts @Code "/" sequences, and @@PAdjust adjusts @Code "&"
Xsequences. For example,
X@ID @Code {
X"4i @Wide @PAdjust { 1 2 3 4 5 6 7 8 }"
X}
Xhas result
X@ID {
X4i @Wide @PAdjust { 1 2 3 4 5 6 7 8 }
X}
XMore precisely, the widening is effected by enlarging the size of each
Xcomponent except the last by an equal fraction of the space that would
Xotherwise be left over -- just the opposite of the usual procedure,
Xwhich assigns all the leftover space to the last component (Section
X{@NumberOf size}).
X@PP
X@@PAdjust is used by the @Code adjust and @Code outdent options of
Xthe @@Break symbol (Section {@NumberOf break}). It has a slight
Xpeculiarity: it will not enlarge components when the immediately
Xfollowing gap has width 0. This is to prevent space from appearing
X(for example) between a word and an immediately following comma. The
Xother two symbols will enlarge such components.
X@End @Section
END_OF_FILE
if test 1288 -ne `wc -c <'lout/doc/tr.lout/ch3.10'`; then
echo shar: \"'lout/doc/tr.lout/ch3.10'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch3.10'
fi
if test -f 'lout/doc/tr.lout/ch3.11' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch3.11'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch3.11'\" \(999 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch3.11' <<'END_OF_FILE'
X@Section
X @Title { "@HScale" and "@VScale" }
X @Tag { hscale }
X@Begin
X@PP
Xhscale @Index { @@HScale symbol }
Xvscale @Index { @@VScale symbol }
Xscaling @Index { Scaling of object }
X@@HScale causes its right parameter to expand to fill the space available,
Xby geometricallly scaling it:
X@ID @Code {
X"4i @Wide @HScale { 1 2 3 4 5 6 7 8 }"
X}
Xhas result
X@ID {
X4i @Wide @HScale { 1 2 3 4 5 6 7 8 }
X}
Xand
X@ID @Code {
X"0.5i @Wide @HScale { 1 2 3 4 5 6 7 8 }"
X}
Xhas result
X@ID {
X0.5i @Wide @HScale { 1 2 3 4 5 6 7 8 }
X}
X@@HScale first applies @@HContract to its parameter, then horizontally
Xscales it to the actual size. The principal mark of the right parameter
Xhas no effect on the result; the parameter is scaled to the actual size
Xand positioned to fill the space available. (Taking account of alignment
Xof the principal mark only causes trouble in practice.)
X@PP
X@@VScale is similar, but in a vertical direction. @@HScale and @@VScale
Xeach have both a @@OneCol and a @@OneRow effect.
X@End @Section
END_OF_FILE
if test 999 -ne `wc -c <'lout/doc/tr.lout/ch3.11'`; then
echo shar: \"'lout/doc/tr.lout/ch3.11'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch3.11'
fi
if test -f 'lout/doc/tr.lout/ch3.13' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch3.13'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch3.13'\" \(1552 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch3.13' <<'END_OF_FILE'
X@Section
X @Title { "@Rotate" }
X @Tag { rotate }
X@Begin
X@PP
Xrotate.sym @Index { @@Rotate symbol }
Xrotation @Index { Rotation of object }
XThe symbol @@Rotate will rotate its
Xright parameter counterclockwise an amount given in degrees (positive or
Xnegative) by its left parameter. For example,
X@ID @Code {
X"30d @Rotate { hello, world }"
X}
Xhas result
X@ID {
X30d @Rotate { hello, world }
X}
XBefore rotating the object, @@OneCol and @@OneRow are applied to it. The
Xresult is a rectangle whose marks pass through the point where the
Xoriginal marks crossed:
X@ID {
X @ShowMarks
X { 0.6c @Wide 0.3c @High ^| 2.2c @Wide ^/ 0.2c @High }
X
X&4m => &4m
X
X @ShowMarks
X {
X 30d @Rotate
X { @ShowMarks
X { 0.6c @Wide 0.3c @High ^| 2.2c @Wide ^/ 0.2c @High }
X }
X }
X}
XAs this example shows, rotation by an angle other than a multiple of
Xninety degrees introduces quite a lot of white space. So, for example, the
Xresult of
X@ID {
X@Code { "-30d" "@Rotate" 30d "@Rotate" } @I object
X}
Xis a much larger object than {@I object}, despite the fact that one
Xrotation cancels the other.
X@PP
XRotation of objects containing receptive and recursive symbols is
Xpermitted, but for angles other than multiples of ninety degrees it is
Xbest to make the size of the rotated object clear with @@Wide and
X@@High symbols:
X@ID @Code {
X"30d @Rotate 5i @Wide 4i @High"
X"{ //1i @TextPlace"
X" //1i"
X"}"
X}
XThis is because for angles other than multiples of ninety degrees the
Xspace available for @Code "@TextPlace" to occupy is indeterminate, and
Xthe result is poor.
X@End @Section
END_OF_FILE
if test 1552 -ne `wc -c <'lout/doc/tr.lout/ch3.13'`; then
echo shar: \"'lout/doc/tr.lout/ch3.13'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch3.13'
fi
if test -f 'lout/doc/tr.lout/ch3.16' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch3.16'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch3.16'\" \(1705 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch3.16' <<'END_OF_FILE'
X@Section
X @Title { "@Moment" }
X @Tag { moment }
X@Begin
X@PP
XThe predefined symbol @@Moment
Xmoment.sym @Index { @@Moment symbol }
Xhas the following definition:
X@ID @Code {
X"def @Moment"
X" named @Tag {}"
X" named @Second {}"
X" named @Minute {}"
X" named @Hour {}"
X" named @Day {}"
X" named @Month {}"
X" named @Year {}"
X" named @Century {}"
X" named @WeekDay {}"
X" named @YearDay {}"
X" named @DaylightSaving {}"
X"{}"
X}
XIt may be used like any other symbol. Lout provides an invocation of
X@@Moment with tag {@Code now}, whose other parameters are numbers
Xencoding the current date and time:
X@ID {
X@JP @Code "@Second" |0.5i the current second, between 0 and 59
X@JP @Code "@Minute" | the current minute, between 0 and 59
X@JP @Code "@Hour" | the current hour, between 0 and 23
X@JP @Code "@Day" | the current day of the month, between 1 and 31
X@JP @Code "@Month" | the current month, between 1 (January) and 12 (December)
X@JP @Code "@Year" | the current year of the century, between 00 and 99
X@JP @Code "@Century" | the current century, e.g. 19 or 20
X@JP @Code "@WeekDay" | the current day of the week, between 1 (Sunday) and 7 (Saturday)
X@JP @Code "@YearDay" | the current day of the year, between 0 and 365
X@JP @Code "@DaylightSaving" | an implementation-dependent number that
Xmay encode the daylight saving currently in effect
X}
Xdate @Index { Date, printing of current }
XJudicious use of databases can convert
Xthese numbers into useful dates. For example,
X@ID @Code {
X"@Moment&&now @Open { @Day {@Months&&@Month}, @Century{@Year} }"
X}
Xproduces something like
X@Moment&&now @Open { @Day {@Months&&@Month}, @Century{@Year} }
Xgiven a suitable database of months.
X@End @Section
END_OF_FILE
if test 1705 -ne `wc -c <'lout/doc/tr.lout/ch3.16'`; then
echo shar: \"'lout/doc/tr.lout/ch3.16'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch3.16'
fi
if test -f 'lout/doc/tr.lout/ch3.21' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch3.21'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch3.21'\" \(1524 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch3.21' <<'END_OF_FILE'
X@Section
X @Title { "@Open and @Use" }
X @Tag { open }
X@Begin
X@PP
XThe @@Open symbol
Xopen.sym @Index { @@Open symbol }
Xtakes a cross reference or symbol
Xinvocation for its left parameter, and an arbitrary object, which must
Xbe enclosed in braces, for its right parameter. The right parameter
Xmay refer to the exported parameters and nested definitions of the invocation
Xdenoted by the left parameter, and its value is the @@Open
Xsymbol's result. The target of the cross reference may lie in an
Xexternal database (Section {@NumberOf database}). Any symbol available
Xoutside the @@Open which happens to have the same name as one of the
Xsymbols made available by the @@Open will be unavailable within the @@Open.
X@PP
Xuse.sym @Index { @@Use symbol }
XThe @@Use symbol is an @@Open symbol in a
Xdifferent form. It may only appear just after the definitions
Xin Lout's input, and it is equivalent to enclosing the remainder of the
Xinput in an @@Open symbol. For example,
X@ID {
X @I definitions
X//1vx @Code "@Use" @Code "{" @I x @Code "}"
X//1vx @Code "@Use" @Code "{" @I y @Code "}"
X//1vx @I { rest of input }
X}
Xis equivalent to
X@ID {
X @I definitions
X//1vx @I x @Code "@Open"
X//1vx @Code "{" &4mt @I y @Code "@Open"
X//1vx &4mt @Code "{" @I { rest of input }
X//1vx &4mt @Code "}"
X//1vx @Code "}"
X}
XThe @@Use symbol allows a set of standard packages to be opened without
Xthe inconvenience of enclosing the entire document in @@Open symbols. Such
Xenclosure could cause Basser Lout to run out of memory.
X@End @Section
END_OF_FILE
if test 1524 -ne `wc -c <'lout/doc/tr.lout/ch3.21'`; then
echo shar: \"'lout/doc/tr.lout/ch3.21'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch3.21'
fi
if test -f 'lout/doc/tr.lout/ch3.22' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch3.22'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch3.22'\" \(1685 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch3.22' <<'END_OF_FILE'
X@Section
X @Title { "@Database and @SysDatabase" }
X @Tag { database }
X@Begin
X@PP
Xdatabase.sym @Index { @@Database symbol }
XThe @@Database symbol is used to declare the existence of a file
Xof symbol invocations that Lout may refer to when evaluating cross
Xreferences. In Basser Lout, for example,
X@ID @Code {
X"@Database @Months @WeekDays { standard }"
X}
Xmeans that there is a file called @Code "standard.ld" containing
Xinvocations of the previously defined symbols @Code "@Months" and
X{@Code "@WeekDays"}. A @@Database symbol may appear anywhere, although
Xit is most naturally placed immediately following the definitions of the
Xsymbols it refers to. Different definitions packages may refer to a
Xcommon database, provided the definitions they give for its symbols are
Xcompatible. An entry is interpreted as though it appears at the point
Xwhere the cross reference that retrieves it does, which allows symbols
Xlike @Code "@I" for @Code "Slope @Font" to be used in databases. The
Xdatabase file may not contain @@Database or @@Include symbols, and each
Xinvocation within it must be enclosed in braces.
X@PP
XBasser Lout constructs an {@I {index file}},
Xindex.file @Index { Index file (for databases) }
Xwhich in this example is called {@Code "standard.li"}, the first time it
Xever encounters the database, as an aid to searching it. If the database
Xfile is changed, its index file must be deleted by the user so that
XBasser Lout knows to reconstruct it.
X@PP
XBasser Lout searches for databases in the current directory first, then
Xin a sequence of standard places. To search the standard places only, use
Xsysdatabase.sym @Index { @@SysDatabase symbol }
X@@SysDatabase.
X@End @Section
END_OF_FILE
if test 1685 -ne `wc -c <'lout/doc/tr.lout/ch3.22'`; then
echo shar: \"'lout/doc/tr.lout/ch3.22'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch3.22'
fi
if test -f 'lout/doc/tr.lout/ch3.24' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch3.24'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch3.24'\" \(1436 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch3.24' <<'END_OF_FILE'
X@Section
X @Title { "@IncludeGraphic" and "@SysIncludeGraphic" }
X @Tag { includegraphic }
X@Begin
X@PP
Xincludegraphic.sym @Index { @@IncludeGraphic symbol }
Xsysincludegraphic.sym @Index { @@SysIncludeGraphic symbol }
Xpostscript.includegraphic @SubIndex { used by @@IncludeGraphic }
XThese symbols instruct Lout to incorporate a separately created
Xillustration:
X@ID @Code "@IncludeGraphic \"myportrait.eps\""
XThe parameter is implementation-dependent; in Basser Lout it is an
Xobject whose value is a simple word denoting the name of a file. This
Xfile should ideally be a PostScript EPS Version 3.0 file [{@Ref adobe90}],
Xsince then Lout will keep careful track of what resources are required
Xfor printing that file. However, any PostScript file containing the
X@Code "%%BoundingBox:" comment and not requiring unusual resources is
Xlikely to work.
X@PP
XThe result of @@IncludeGraphic is an ordinary Lout object with marks
Xthrough its centre. It may be rotated, scaled, and generally
Xtreated like any other object. Basser Lout determines its size by
Xconsulting the bounding box information in the file. If this cannot be
Xfound, a warning message is printed and the result object has zero size.
X@PP
X@@IncludeGraphic searches the same directories that @@Include does
X(Section {@NumberOf include}). @@SysIncludeGraphic is the same as
X@@IncludeGraphic, except that it searches only the directories searched
Xby @@SysInclude.
X@End @Section
END_OF_FILE
if test 1436 -ne `wc -c <'lout/doc/tr.lout/ch3.24'`; then
echo shar: \"'lout/doc/tr.lout/ch3.24'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch3.24'
fi
if test -f 'lout/doc/tr.over/s0' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.over/s0'\"
else
echo shar: Extracting \"'lout/doc/tr.over/s0'\" \(883 characters\)
sed "s/^X//" >'lout/doc/tr.over/s0' <<'END_OF_FILE'
X@Report
X @Title { A New Approach to Document Formatting }
X @Author { Jeffrey H. Kingston }
X @Institution { Basser Department of Computer Science
XUniversity of Sydney 2006
XAustralia }
X @Columns { Double }
X @DateLine { 22 December, 1992 }
X//
X
X@Abstract {
XThis paper describes a new approach to document formatting, in which
Xfeatures are written in a small, coherent, high-level language called
XLout. The resulting increase in productivity has permitted many advanced
Xfeatures to be developed quickly and accurately, including page layout of
Xunprecedented flexibility, equation formatting, automatically generated
Xtables of contents, running page headers and footers, cross references,
Xsorted indexes, and access to bibliographic databases. A fully operational
Xproduction implementation of the Lout system including all these features
Xand many others is freely available.
X}
END_OF_FILE
if test 883 -ne `wc -c <'lout/doc/tr.over/s0'`; then
echo shar: \"'lout/doc/tr.over/s0'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.over/s0'
fi
if test -f 'lout/doc/tr.over/s6' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.over/s6'\"
else
echo shar: Extracting \"'lout/doc/tr.over/s6'\" \(2574 characters\)
sed "s/^X//" >'lout/doc/tr.over/s6' <<'END_OF_FILE'
X@Section


X @Title { Cross references }
X@Begin
X@PP

XThe terms @Code "@TextPlace&&preceding" and @Code "@FootPlace&&following"
Xused above can be thought of as arrows in the final printed document,
Xpointing from themselves to the place they name. Expressed in this way,
Xfree of any reference to the internal action of the document formatter,
Xthey are easy to comprehend and work with. These arrows are called
Xcross references in Lout.
X@PP
XA galley is transported forwards along its arrow, but it turns out that
Xa reverse flow of information can also be very useful. For example,
Xlarge documents often have cross references such as `see Table 6 on page
X57.' If the numbers are replaced by arrows pointing to the table in
Xquestion, it should be possible to have their values filled in
Xautomatically (an idea introduced by Scribe [{@Ref reid80}]). An arrow
Xpointing outside the docu&-ment could retrieve an entry from a database of
Xreferences, Roman numerals, etc. And a running page header like
X`Chapter 8: Sorting' might obtain its value from an arrow pointing from
Xthe page header line down into the body text of the page, where the
Xcurrent chapter is known.
X@PP
XAll these ideas are realized in Lout, but here we will just sketch a
Xsimplified version of the running page header definitions found in the
XBookLayout package [{@Ref kingston92begin}]. A symbol called
X@Code "@Runner" is first defined:
X@ID @Code {
X"def @Runner"
X" right @Val"
X"{}"
X}
X@Code "@Runner" produces nothing at all, which means that we may place
Xthe invokation
X@ID @Code {
X"@Runner { Chapter"
X"8: Sorting }"
X}
Xat the end of a chapter without harm. This invisible invokation will be
Xcarried along with the chapter and will end up on some page of the final
Xprinted document.
X@PP
XBy modifying the definition of {@Code "@PageList"}, we can add to each
Xpage a header line containing the expression
X@ID @Code {
X"@Runner&&following"
X"@Open { @Val }"
X}
XThis means `find the nearest following invokation of @Code "@Runner" in the
Xfinal printed document and retrieve its @Code "@Val" parameter.' Every page
Xof Chapter 8 will find the correct running header, since @Code "@Runner"
Xwas placed at the end of the chapter. The invokation @Code "@Runner {}"
Xplaced at the beginning of the chapter will suppress the header on the
Xfirst page of the chapter, as it is conventional to do.
X@PP
XThese invokations of @Code "@Runner" are hidden from the non-expert user
Xwithin the definition of the @Code "@Chapter" operator. The result is a
Xreliable implementation of a notoriously difficult feature.
X@End @Section
END_OF_FILE
if test 2574 -ne `wc -c <'lout/doc/tr.over/s6'`; then
echo shar: \"'lout/doc/tr.over/s6'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.over/s6'
fi
if test -f 'lout/doc/tr.over/s7' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.over/s7'\"
else
echo shar: Extracting \"'lout/doc/tr.over/s7'\" \(1850 characters\)
sed "s/^X//" >'lout/doc/tr.over/s7' <<'END_OF_FILE'


X@Section
X @Title { Conclusion }
X@Begin
X@PP

XThe Lout document formatting system permits features as diverse as page
Xlayout and equation formatting to be implemented by definitions written
Xin a high-level language. The consequent improvement in productivity
Xhas allowed an unprecedented repertoire of advanced features to be
Xpresented to the non-expert user.
X@PP
XTo future research in document formatting, Lout offers evidence of the
Xutility of the functional paradigm, as well as two new abstractions:
Xgalleys and cross references. These provide a secure foundation for
Xfeatures which have proven very difficult to implement in the past.
X@PP
XA number of improvements to the current system can be envisaged. Better
Xparagraph and page breaking algorithms could be added to the formatter
Xwithout any change to the language; non-rectangular objects would be
Xuseful in some places. Perhaps the most useful improvement would be the
Xrepresentation of paragraphs as horizontal galleys, since this would allow
Xthe full power of the language to be brought to bear on paragraph
Xlayout, in contrast to the present built-in system which offers only the
Xtraditional styles (ragged right, justified, and so on).


X{ @Reference
X @Tag { brooks91 }
X @Type { JournalArticle }
X @Author { Brooks, Kenneth P. }
X @Title { Lilac: a two-view document editor }
X @Journal { IEEE Computer }
X @Volume { @Null }
X @Pages { 7--19 }
X @Year { 1991 }
X}

X@PP
XThe author of a recent inter&-active document editor [{@Ref brooks91}]
Xhas recommended that the interface be supported by a functional base
Xlanguage, accessible to the expert user, for such purposes as page
Xlayout definition and fine control over formatting. Lout appears to be
Xan excellent candidate for such a language, because of its small size,
Xprecision, and functional semantics.
X@End @Section
END_OF_FILE
if test 1850 -ne `wc -c <'lout/doc/tr.over/s7'`; then
echo shar: \"'lout/doc/tr.over/s7'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.over/s7'
fi
if test -f 'lout/doc/tr.tab/s0' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.tab/s0'\"
else
echo shar: Extracting \"'lout/doc/tr.tab/s0'\" \(1096 characters\)
sed "s/^X//" >'lout/doc/tr.tab/s0' <<'END_OF_FILE'
X@Report
X @Title { Tab -- A Lout Package for Formatting Tables }
X @Author { Jeffrey H. Kingston }
X @Institution { Basser Department of Computer Science
XUniversity of Sydney 2006
XAustralia }
X @DateLine { 22 December 1992 }
X//
X
X@Abstract {
XThis report describes the use of Tab, a package of definitions for
Xproducing tables with the Lout document formatter:
X@Display @Tab
X hmargin { 0.4c }
X vmargin { 0.3v }
X side { single }
X @Fmta { @Col @B @CC X @Over A,B,C }
X @Fmtb { @Col @I A ! @Col B !! @Col C }
X{
X@Rowa
X above { single }
X X { Value of mathematical formulae (millions of dollars) }
X@Rowb
X above { double }
X A { Quadratic formula }
X B { @Eq { x ^= { minus b +- sqrt { b sup 2 - 4ac } } over 2a } }
X C { 3^.5 }
X@Rowb
X below { single }
X A { Binomial theorem }
X B { @Eq { ( a + b ) sup n ^= big sum from k=0 to infty
Xmatrix atleft { ( } atright { ) } { n above k } a sup k b sup n-k
X} }
X C { 12^ }
X}
XA wide variety of styles for columns and individual entries is provided,
Xand entries may contain equations, figures, and other objects without
Xrestriction.
X}
END_OF_FILE
if test 1096 -ne `wc -c <'lout/doc/tr.tab/s0'`; then
echo shar: \"'lout/doc/tr.tab/s0'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.tab/s0'
fi
if test -f 'lout/doc/tr.tab/s1' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.tab/s1'\"
else
echo shar: Extracting \"'lout/doc/tr.tab/s1'\" \(2564 characters\)
sed "s/^X//" >'lout/doc/tr.tab/s1' <<'END_OF_FILE'


X@Section
X @Title { Introduction }
X@Begin
X@PP

XThe Tab table formatting package is designed to simplify the production
Xof tables in documents produced with the Lout document formatting system
X[{@Ref kingston92}]. Tab aligns entries in columns, draws boxes and
Xrules, and so on. To use Tab, either place @Code "-itab" on the Unix


X@FootNote { Unix is a trademark of "AT&T" Bell Laboratories. }

Xcommand line, or @Code "@SysInclude { tab }" in the setup file.
X@PP
XTo begin with a very simple example, the table
X@CD
X@Tab
X @Fmta { @Col A ! @Col B ! @Col C }
X{
X @Rowa A { Austen } B { Chaucer } C { Donne }
X @Rowa A { Balzac } B { Darwin } C { Goethe }
X @Rowa A { Byron } B { Dickens } C { Homer }
X}
Xis the result of the following Lout input:
X@ID @Code {
X"@Tab"
X" @Fmta { @Col A ! @Col B ! @Col C }"
X"{"
X" @Rowa A { Austen } B { Chaucer } C { Donne }"
X" @Rowa A { Balzac } B { Darwin } C { Goethe }"
X" @Rowa A { Byron } B { Dickens } C { Homer }"
X"}"
X}
XImmediately after the @Code "@Tab" symbol, which introduces the table,
Xcomes a @I { format option } & , {@Code "@Fmta"}, describing the format
Xof each row. It says that each row contains three columns:
X{@Code "@Col A"}, {@Code "@Col B"}, and {@Code "@Col C"}. The format
Xoption may have up to 26 columns, with names chosen freely
Xfrom the upper-&-case letters from @Code A to {@Code Z}. The symbol
X@Code "!" separates each pair of columns.
X@PP
XAfter the format option comes the body of the table, enclosed in
Xbraces. It consists entirely of a sequence of rows, each introduced by
Xthe @Code "@Rowa" symbol and containing one entry for each column of the
Xformat option, as shown (the row may occupy any number of lines of the
Xinput file). The entries may be arbitrary Lout objects, such as words,
Xparagraphs, equations, figures, and so on without restriction. An entry
Xmay be omitted altogether if it is empty. Lout will choose suitable widths
Xfor the columns, and break paragraphs in the entries to the right widths.
X@PP
XTab neither knows nor cares what happens to the table it produces; it
Xcould appear at any point in the document, even within a paragraph of
Xtext. Most commonly, though, tables are displayed using the
X@Code "@IndentedDisplay" and @Code "@CentredDisplay" symbols from the
XDocumentLayout package [{@Ref kingston92begin}]:
X@ID @Code "@CentredDisplay @Tab ..."
Xor else they go into the @Code "@Table" symbol:
X@ID @Code {
X"@Table"
X" @Caption { ... }"
X"@Tab"
X"{ ..."
X"}"
X}
Xwhich centres them at the top of the following page and adds a caption.
X@End @Section
END_OF_FILE
if test 2564 -ne `wc -c <'lout/doc/tr.tab/s1'`; then
echo shar: \"'lout/doc/tr.tab/s1'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.tab/s1'
fi
if test -f 'lout/doc/tr.tab/s3' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.tab/s3'\"
else
echo shar: Extracting \"'lout/doc/tr.tab/s3'\" \(2783 characters\)
sed "s/^X//" >'lout/doc/tr.tab/s3' <<'END_OF_FILE'
X@Section
X @Title { Changing the style of rows }
X@Begin
X@PP
XSometimes different rows need different formats, usually because they
Xare headings. Although this can be done with style-changing symbols in
Xthe entries, it is probably better to use multiple format options:
X@ID @Code {
X"@Tab"
X" @Fmta { @Col @Heading A ! @Col @Heading B }"
X" @Fmtb { @Col @A ! @Col @CC B }"
X"{"
X" @Rowa A { Course } B { Enrolment }"
X" @Rowb A { Software Engineering } B { 174 }"
X" @Rowb A { Complexity Theory } B { 37 }"
X"}"
X}
Xhas result
X@CD {
X@Tab
X @Fmta { @Col @Heading A ! @Col @Heading B }
X @Fmtb { @Col A ! @Col @CC B }
X{
X @Rowa A { Course } B { Enrolment }
X @Rowb A { Software Engineering } B { 174 }
X @Rowb A { Complexity Theory } B { 37 }
X}
X}
XWe have used the @Code "@Heading" symbol from the DocumentLayout package
Xjust to prove that it can be done. Each row appears in the format of
Xthe corresponding format option: @Code "@Rowa" rows in the format of
X{@Code "@Fmta"}, @Code "@Rowb" rows in the format of {@Code "@Fmtb"},
Xand so on. There may be up to ten different format options, from
X@Code "@Fmta" to {@Code "@Fmtj"}, and they may be used repeatedly and
Xin any order.
X@PP
XThere is an @Code "@Over" symbol for constructing
X{@I{spanning columns}}: columns that spread over two or more following
Xcolumns. For example, the Lout input
X@ID @Code {
X"@I @Tab"
X" @Fmta { @Col @CC X @Over A,B ! @Col C }"
X" @Fmtb { @Col A ! @Col B ! @Col C }"
X"{"
X" @Rowa X { X } C { C }"
X" @Rowb A { A } B { B } C { C }"
X"}"
X}
Xproduces the table
X@CD {
X@I @Tab
X side { single }
X @Fmta { @Col @CC X @Over A,B !! @Col C }
X @Fmtb { @Col A !! @Col B !! @Col C }
X{
X @Rowa X { X } C { C }
X above { single }
X below { single }
X @Rowb A { A } B { B } C { C }


X below { single }
X}
X}

X(We will see how to get the lines later.) The @Code "@Over" symbol
Xalways comes directly after the column letter, and it is followed by one
Xor more letters separated by commas indicating which columns in the
Xfollowing row this column is to span over.
X@PP
XWith multiple row formats, especially those with spanning columns, it is
Ximportant to take care that each row is compatible with the one
Xpreceding it, in the sense of having the same number of columns, taking
X@Code "@Over" symbols into account. For example, two successive
X@Code "@Rowa" rows would not be compatible in the example above, since
Xthe second has only two columns but the first prepares the way for three.
X@PP
XTab does not provide a way to have spanning columns underneath the columns
Xthey span, so spanning columns are useful only for headings. This
Xrestriction was made necessary by inadequacies in the
Xway that the Basser Lout interpreter handles spanning columns.
X@End @Section
END_OF_FILE
if test 2783 -ne `wc -c <'lout/doc/tr.tab/s3'`; then
echo shar: \"'lout/doc/tr.tab/s3'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.tab/s3'
fi
if test -f 'lout/doc/tr.tab/s5' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.tab/s5'\"
else
echo shar: Extracting \"'lout/doc/tr.tab/s5'\" \(1538 characters\)
sed "s/^X//" >'lout/doc/tr.tab/s5' <<'END_OF_FILE'
X@Section
X @Title { Margins }
X@Begin
X@PP
XTab places a @I { vertical margin } above and below each row, and a
X@I { horizontal margin } to the left and right of each column. (If
Xthere are no side rules, the leftmost and rightmost margins are
Xomitted.) The size of these margins is determined by two options to the
X@Code "@Tab" symbol:
X@ID @Code {
X"@Tab"
X" hmargin { 0.3c }"
X" vmargin { 0.2v }"


X" @Fmta { ... }"
X"..."
X}

XShown here are the default values, 0.3 centimetres for the horizontal
Xmargins, and 0.2 times the current inter-line spacing (denoted by the
Xletter {@Code v}) for the vertical margins.
X@PP
XThe horizontal margin is fixed, but each row may have its own vertical margin:
X@ID @Code {
X"@Rowa"
X" vmargin { 0.5vx }"
X" A { ... }"
X}
XIf omitted, the @Code vmargin value is taken from the @Code "@Tab" option.
X@PP
XThe value shown here, {@Code "0.5vx"}, requests a vertical margin of
Xhalf the current inter-line spacing, measured from the baseline of the
Xentry rather than from its edge (this is what the @Code x means). This
Xvalue is a good choice when the entries contain simple words or lines
Xof text (i.e. no paragraphs, large equations, figures, etc.):
X@CD {
X@Tab
X vmargin { 0.5vx }
X @Fmta { @Col @Heading A ! @Col @Heading B }
X @Fmtb { @Col A ! @Col @CC B }
X{
X @Rowa A { Course } B { Enrolment }
X @Rowb A { Software Engineering } B { 174 }
X @Rowb A { Complexity Theory } B { 37 }
X}
X}
Xsince the lines of the table will then be separated evenly like
Xthe lines in paragraphs.
X@End @Section
END_OF_FILE
if test 1538 -ne `wc -c <'lout/doc/tr.tab/s5'`; then
echo shar: \"'lout/doc/tr.tab/s5'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.tab/s5'
fi
if test -f 'lout/hyph.install' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/hyph.install'\"
else
echo shar: Extracting \"'lout/hyph.install'\" \(2297 characters\)
sed "s/^X//" >'lout/hyph.install' <<'END_OF_FILE'
XInstallation of hyphenation patterns
X
XJeffrey H. Kingston
X22 December 1992
X
XBasser Lout Version 2.03 incorporates automatic hyphenation using the method
Xintroduced by TeX (see Appendix H of the TeXBook by D. E. Knuth). No special
Xaction is required to install hyphenation unless it is desired to change the
Xhyphenation patterns that control it.
X
XThe first time on any run that hyphenation is required, Lout will search the
X@SysInclude directories for a binary file called lout.hyph.packed, which
Xcontains a memory image of the TeX hyphenation patterns, modified so that
Xthe file may be safely shared by big-endian and little-endian machines. If
Xthis file cannot be found, Lout then searches for the text file lout.hyph
Xinstead, and uses it to construct lout.hyph.packed. To change the hyphenation
Xpatterns, delete lout.hyph.packed and modify lout.hyph; the rest is automatic.
X
XFile lout.hyph mainly contains the long list of TeX hyphenation patterns,
Xbut it begins with a sequence of character classes, one class per line,
Xterminated by a blank line:
X
X @!$%^&*()_-+=~`{[}]:;'|<,.>?/0123456789
X aA
X bB
X cC
X ...
X yY
X zZ
X
XBriefly, hyphenation of a word works like this. If the word contains a
Xcharacter not found in any of these classes, it will not be hyphenated.
XOtherwise the word is analysed into sequences of letters separated by
Xsequences of non-letters (the characters in the first class are by
Xdefinition the non-letters, and the remaining characters are the letters).
XEach sequence of five or more letters is then matched with the hyphenation
Xpatterns and hyphenated. The matching process treats the members of each
Xclass as identical (so the classes above ensure that the distinction
Xbetween upper and lower case is ignored). The hyphen character "-" is
Xtreated specially. Apart from the weighting digits, the patterns should
Xcontain only letters.
X
XExtreme lengths were resorted to to compress the .packed file as much as
Xpossible, and attempts to increase the number of classes or patterns
Xsignificantly are likely to fail. Some words are not hyphenated well by
Xthe standard patterns and must be treated as exceptions; see the
XDocumentLayout package implementation (file dl in lout/include) for
Xthe standard list of these exceptions and how to deal with them.
END_OF_FILE
if test 2297 -ne `wc -c <'lout/hyph.install'`; then
echo shar: \"'lout/hyph.install'\" unpacked with wrong size!
fi
# end of 'lout/hyph.install'
fi
if test -f 'lout/include/ft' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/include/ft'\"
else
echo shar: Extracting \"'lout/include/ft'\" \(2243 characters\)
sed "s/^X//" >'lout/include/ft' <<'END_OF_FILE'
X
X###############################################################################
X# #
X# Font definitions #
X# #
X###############################################################################
X
Xfontdef AvantGarde Base { "AvantGarBoo.AFM" }
Xfontdef AvantGarde Slope { "AvantGarBooObl.AFM" }
Xfontdef AvantGarde Demi { "AvantGarDem.AFM" }
Xfontdef AvantGarde DemiSlope { "AvantGarDemObl.AFM" }
X
Xfontdef Bookman Base { "BookmDem.AFM" }
Xfontdef Bookman Slope { "BookmDemIta.AFM" }
Xfontdef Bookman Light { "BookmLig.AFM" }
Xfontdef Bookman LightSlope { "BookmLigIta.AFM" }
X
Xfontdef Courier Base { "Couri.AFM" }
Xfontdef Courier Slope { "CouriObl.AFM" }
Xfontdef Courier Bold { "CouriBol.AFM" }
Xfontdef Courier BoldSlope { "CouriBolObl.AFM" }
X
Xfontdef Helvetica Base { "Helve.AFM" }
Xfontdef Helvetica Slope { "HelveObl.AFM" }
Xfontdef Helvetica Bold { "HelveBol.AFM" }
Xfontdef Helvetica BoldSlope { "HelveBolObl.AFM" }
Xfontdef Helvetica Cond { "HelveCon.AFM" }
Xfontdef Helvetica CondSlope { "HelveConObl.AFM" }
Xfontdef Helvetica CondBold { "HelveConBol.AFM" }
Xfontdef Helvetica CondBoldSlope { "HelveConBolObl.AFM" }
Xfontdef Helvetica Narrow { "HelveNar.AFM" }
Xfontdef Helvetica NarrowSlope { "HelveNarObl.AFM" }
Xfontdef Helvetica NarrowBold { "HelveNarBol.AFM" }
Xfontdef Helvetica NarrowBoldSlope { "HelveNarBolObl.AFM" }
X
Xfontdef Schoolbook Base { "NewCenSchRom.AFM" }
Xfontdef Schoolbook Slope { "NewCenSchIta.AFM" }
Xfontdef Schoolbook Bold { "NewCenSchBol.AFM" }
Xfontdef Schoolbook BoldSlope { "NewCenSchBolIta.AFM" }
X
Xfontdef Palatino Base { "PalatRom.AFM" }
Xfontdef Palatino Slope { "PalatIta.AFM" }
Xfontdef Palatino Bold { "PalatBol.AFM" }
Xfontdef Palatino BoldSlope { "PalatBolIta.AFM" }
X
Xfontdef Symbol Base { "Symbo.AFM" }
X
Xfontdef Times Base { "TimesRom.AFM" }
Xfontdef Times Slope { "TimesIta.AFM" }
Xfontdef Times Bold { "TimesBol.AFM" }
Xfontdef Times BoldSlope { "TimesBolIta.AFM" }
X
Xfontdef Chancery Base { "ZapfChaMedIta.AFM" }
Xfontdef Dingbats Base { "ZapfDin.AFM" }
END_OF_FILE
if test 2243 -ne `wc -c <'lout/include/ft'`; then
echo shar: \"'lout/include/ft'\" unpacked with wrong size!
fi
# end of 'lout/include/ft'
fi
echo shar: End of archive 29 \(of 30\).
cp /dev/null ark29isdone

Jeff Kingston

unread,
Jun 1, 1993, 11:07:20 PM6/1/93
to
Submitted-by: je...@joyce.cs.su.oz.au (Jeff Kingston)
Posting-number: Volume 37, Issue 128
Archive-name: lout/part30
Environment: UNIX

#! /bin/sh
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".

# Contents: lout/data/README lout/doc/README lout/doc/tr.begin/README
# lout/doc/tr.begin/s00 lout/doc/tr.begin/setup
# lout/doc/tr.eq/README lout/doc/tr.fig/README
# lout/doc/tr.impl/README lout/doc/tr.impl/s0.0
# lout/doc/tr.impl/s2.0 lout/doc/tr.impl/s2.9 lout/doc/tr.impl/s3.0
# lout/doc/tr.impl/s3.9 lout/doc/tr.impl/s5.9 lout/doc/tr.impl/s6.0
# lout/doc/tr.impl/s6.9 lout/doc/tr.lout/README
# lout/doc/tr.lout/ch1.00 lout/doc/tr.lout/ch1.99
# lout/doc/tr.lout/ch2.00 lout/doc/tr.lout/ch2.99
# lout/doc/tr.lout/ch3.00 lout/doc/tr.lout/ch3.05
# lout/doc/tr.lout/ch3.09 lout/doc/tr.lout/ch3.12
# lout/doc/tr.lout/ch3.14 lout/doc/tr.lout/ch3.17
# lout/doc/tr.lout/ch3.20 lout/doc/tr.lout/ch3.26
# lout/doc/tr.lout/ch3.99 lout/doc/tr.lout/ch4.00
# lout/doc/tr.lout/ch4.99 lout/doc/tr.tab/README
# lout/doc/tr.tab/setup lout/font0/README lout/font1/README
# lout/include/README
# Wrapped by kent@sparky on Sun May 30 19:44:03 1993


PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
echo If this archive is complete, you will see the following message:

echo ' "shar: End of archive 30 (of 30)."'
if test -f 'lout/data/README' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/data/README'\"
else
echo shar: Extracting \"'lout/data/README'\" \(351 characters\)
sed "s/^X//" >'lout/data/README' <<'END_OF_FILE'
XDirectory lout/data
X
XThis directory contains Lout database files:
X
X loutrefs.ld References used in the various reports
X refstyles.ld Reference printing styles
X standard.ld Roman numerals, months, etc.
X
XCorresponding .li files will be created in this directory the
Xfirst time each database is accessed.


X
XJeffrey H. Kingston
X22 December 1992

END_OF_FILE
if test 351 -ne `wc -c <'lout/data/README'`; then
echo shar: \"'lout/data/README'\" unpacked with wrong size!
fi
# end of 'lout/data/README'
fi
if test -f 'lout/doc/README' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/README'\"
else
echo shar: Extracting \"'lout/doc/README'\" \(905 characters\)
sed "s/^X//" >'lout/doc/README' <<'END_OF_FILE'
XDirectory lout/doc
X
XThis directory contains directories holding the Lout source for
Xthe various technical reports that describe the Lout document
Xformatting system:
X
Xtr.lout `Document Formatting with Lout', the Lout user manual;
X
Xtr.over `A New Approach to Document Formatting', a journal article;
X
Xtr.impl `The Design and Implementation of the Lout Document Formatting
X Language', another journal article;
X
Xtr.begin `A Beginners' Guide to Lout', describing the @DocumentLayout
X package;
X
Xtr.eq `Eq - A Lout package for typesetting mathematics',
X describing the Eq equation formatter, and also the
X Pas Pascal program formatter;
X
Xtr.fig `Fig - A Lout package for drawing figures', describing
X the Fig figure drawing package.
X
Xtr.tab `Tab - A Lout package for formatting tables', describing
X the Tab table formatting package.
X
XJeffrey H. Kingston
X24 September 1991
X27 January 1993
END_OF_FILE
if test 905 -ne `wc -c <'lout/doc/README'`; then
echo shar: \"'lout/doc/README'\" unpacked with wrong size!
fi
# end of 'lout/doc/README'
fi
if test -f 'lout/doc/tr.begin/README' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.begin/README'\"
else
echo shar: Extracting \"'lout/doc/tr.begin/README'\" \(540 characters\)
sed "s/^X//" >'lout/doc/tr.begin/README' <<'END_OF_FILE'
XDirectory lout/doc/tr.begin


X
XThis directory contains the Lout source files for

Xthe Beginners' Guide to Lout technical report. To
Xproduce the report, type the command
X
X lout setup s?? > outfile.ps


X
Xin this directory. This must be done three times to
Xcompletely resolve all cross references, although
Xthe PostScript file outfile.ps is printable after
Xthe first run. Auxiliary files with .li and .ld
Xsuffixes will be created in this directory. A copy
Xof the final outfile.ps is included.
X
XJeffrey H. Kingston

X30 July 1991
X22 December 1992
END_OF_FILE
if test 540 -ne `wc -c <'lout/doc/tr.begin/README'`; then
echo shar: \"'lout/doc/tr.begin/README'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.begin/README'
fi
if test -f 'lout/doc/tr.begin/s00' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.begin/s00'\"
else
echo shar: Extracting \"'lout/doc/tr.begin/s00'\" \(717 characters\)
sed "s/^X//" >'lout/doc/tr.begin/s00' <<'END_OF_FILE'
X@Report
X @Title { A Beginners' Guide to Lout }


X @Author { Jeffrey H. Kingston }
X @Institution { Basser Department of Computer Science
XThe University of Sydney 2006
XAustralia }
X @DateLine { 22 December, 1992 }

X @Columns { Double }
X//
X
X@Abstract {
XThis report is a beginners' guide to the Lout document formatting
Xsystem. It shows in a very practical, step-by-step way how to produce
Xdocuments with paragraphs, headings, fonts, displays and lists,
Xfootnotes, numbered sections, references, tables and figures, and so on,
Xusing the DocumentLayout package (Version 2), which is designed for
Xproducing simple documents, technical reports, and books. The underlying
Xprinciples of Lout are not explained here.
X}
END_OF_FILE
if test 717 -ne `wc -c <'lout/doc/tr.begin/s00'`; then
echo shar: \"'lout/doc/tr.begin/s00'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.begin/s00'
fi
if test -f 'lout/doc/tr.begin/setup' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.begin/setup'\"
else
echo shar: Extracting \"'lout/doc/tr.begin/setup'\" \(711 characters\)
sed "s/^X//" >'lout/doc/tr.begin/setup' <<'END_OF_FILE'
X
X######################################################
X# #
X# Lout setup file for producing a technical report #


X# #
X# Jeffrey H. Kingston #
X# 8 June 1991 #

X# #
X######################################################
X
X@SysInclude { ft }
X@SysInclude { dl }

X@SysInclude { eq }
X@SysInclude { tab }


X@SysInclude { pas }
X@SysInclude { fig }
X

X def @Code
X right x
X { { Helvetica Base -1p } @Font lines @Break x
X }
X

X@Use { @DocumentLayout }
X
X@SysDatabase @Reference { "loutrefs" }
END_OF_FILE

if test 711 -ne `wc -c <'lout/doc/tr.begin/setup'`; then
echo shar: \"'lout/doc/tr.begin/setup'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.begin/setup'
fi
if test -f 'lout/doc/tr.eq/README' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.eq/README'\"
else
echo shar: Extracting \"'lout/doc/tr.eq/README'\" \(557 characters\)
sed "s/^X//" >'lout/doc/tr.eq/README' <<'END_OF_FILE'
XDirectory lout/doc/tr.eq
X
XThis directory contains the Lout source files for the
Xtechnical report describing the Eq equation formatting
Xpackage. To produce the report, type the command


X
X lout setup s? > outfile.ps
X
Xin this directory. This must be done three times to
Xcompletely resolve all cross references, although
Xthe PostScript file outfile.ps is printable after
Xthe first run. Auxiliary files with .li and .ld
Xsuffixes will be created in this directory. A copy
Xof the final outfile.ps is included.
X
XJeffrey H. Kingston

X30 July 1991
X22 December 1992
END_OF_FILE
if test 557 -ne `wc -c <'lout/doc/tr.eq/README'`; then
echo shar: \"'lout/doc/tr.eq/README'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.eq/README'
fi
if test -f 'lout/doc/tr.fig/README' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.fig/README'\"
else
echo shar: Extracting \"'lout/doc/tr.fig/README'\" \(570 characters\)
sed "s/^X//" >'lout/doc/tr.fig/README' <<'END_OF_FILE'
XDirectory lout/doc/tr.fig
X
XThis directory contains the Lout source files for the
Xtechnical report describing the Fig figure drawing
Xpackage (Version 2). To produce the report, type
Xthe command


X
X lout setup s? > outfile.ps
X
Xin this directory. This must be done three times to
Xcompletely resolve all cross references, although
Xthe PostScript file outfile.ps is printable after
Xthe first run. Auxiliary files with .li and .ld
Xsuffixes will be created in this directory. A copy
Xof the final outfile.ps is included.
X
XJeffrey H. Kingston

X17 February 1992
X22 December 1992
END_OF_FILE
if test 570 -ne `wc -c <'lout/doc/tr.fig/README'`; then
echo shar: \"'lout/doc/tr.fig/README'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.fig/README'
fi
if test -f 'lout/doc/tr.impl/README' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.impl/README'\"
else
echo shar: Extracting \"'lout/doc/tr.impl/README'\" \(650 characters\)
sed "s/^X//" >'lout/doc/tr.impl/README' <<'END_OF_FILE'
XDirectory lout/doc/tr.impl


X
XThis directory contains the Lout source files for the

Xreport entitled `The design and implementation of the
XLout document formatting language' which has been
Xaccepted for publication in Software - Practice and
XExperience. To produce the report, type the command
X
X lout setup s?.? > outfile.ps


X
Xin this directory. This must be done three times to
Xcompletely resolve all cross references, although
Xthe PostScript file outfile.ps is printable after
Xthe first run. Auxiliary files with .li and .ld
Xsuffixes will be created in this directory. A copy
Xof the final outfile.ps is included.

X
XJeffrey H. Kingston
X22 April 1993
END_OF_FILE
if test 650 -ne `wc -c <'lout/doc/tr.impl/README'`; then
echo shar: \"'lout/doc/tr.impl/README'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.impl/README'
fi
if test -f 'lout/doc/tr.impl/s0.0' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.impl/s0.0'\"
else
echo shar: Extracting \"'lout/doc/tr.impl/s0.0'\" \(741 characters\)
sed "s/^X//" >'lout/doc/tr.impl/s0.0' <<'END_OF_FILE'
X@Report
X @Title { The Design and Implementation
Xof the
XLout Document Formatting Language }


X @Author { Jeffrey H. Kingston }

X @Institution { Basser Department of Computer Science,
XThe University of Sydney 2006,
XAustralia }
X @DateLine { 27 January, 1993 }
X//
X
X@Abstract
X @Title { SUMMARY }
X{
XLout is a high-level language for document formatting, whose ease of use
Xhas permitted an unprecedented number of advanced features to be added
Xquickly and reliably. This paper charts the evolution of the design and
Ximplementation of Lout from conception in mid-1984 to public release in
XOctober 1991. It includes extensive discussions of remaining problems
Xand possible solutions.
X@DP
X{@B Keywords} document formatting typesetting
X}
END_OF_FILE
if test 741 -ne `wc -c <'lout/doc/tr.impl/s0.0'`; then
echo shar: \"'lout/doc/tr.impl/s0.0'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.impl/s0.0'
fi
if test -f 'lout/doc/tr.impl/s2.0' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.impl/s2.0'\"
else
echo shar: Extracting \"'lout/doc/tr.impl/s2.0'\" \(616 characters\)
sed "s/^X//" >'lout/doc/tr.impl/s2.0' <<'END_OF_FILE'


X@Section
X @Title { Objects }
X@Begin
X@PP

XThe essence of any move to a higher level is the introduction of some
Xabstraction which serves to organize the low-level operations,
Xresulting in a more succinct expression of their
Xcommon combinations at the cost of some loss of detailed control. The
Xearly part of the Lout project was spent in the development of such an
Xabstraction for the building blocks of documents, one which could
Xexplain, not just the simple phenomena of words, lines, and paragraphs,
Xbut also the alignment of columns in tables, and the complex nested
Xstructures of equations.
X@BeginSubSections
END_OF_FILE
if test 616 -ne `wc -c <'lout/doc/tr.impl/s2.0'`; then
echo shar: \"'lout/doc/tr.impl/s2.0'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.impl/s2.0'
fi
if test -f 'lout/doc/tr.impl/s2.9' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.impl/s2.9'\"
else
echo shar: Extracting \"'lout/doc/tr.impl/s2.9'\" \(30 characters\)
sed "s/^X//" >'lout/doc/tr.impl/s2.9' <<'END_OF_FILE'
X@EndSubSections
X@End @Section
END_OF_FILE
if test 30 -ne `wc -c <'lout/doc/tr.impl/s2.9'`; then
echo shar: \"'lout/doc/tr.impl/s2.9'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.impl/s2.9'
fi
if test -f 'lout/doc/tr.impl/s3.0' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.impl/s3.0'\"
else
echo shar: Extracting \"'lout/doc/tr.impl/s3.0'\" \(378 characters\)
sed "s/^X//" >'lout/doc/tr.impl/s3.0' <<'END_OF_FILE'


X@Section
X @Title { Definitions }
X@Begin
X@PP

XThe need to provide a means of packaging useful pieces of code for easy
Xrepeated use was recognised in the very earliest programming
Xlanguages. This need is even more acute in document formatting, if that
Xis possible, because the majority of users are not programmers and do
Xnot understand the code they invoke.
X@BeginSubSections
END_OF_FILE
if test 378 -ne `wc -c <'lout/doc/tr.impl/s3.0'`; then
echo shar: \"'lout/doc/tr.impl/s3.0'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.impl/s3.0'
fi
if test -f 'lout/doc/tr.impl/s3.9' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.impl/s3.9'\"
else
echo shar: Extracting \"'lout/doc/tr.impl/s3.9'\" \(30 characters\)
sed "s/^X//" >'lout/doc/tr.impl/s3.9' <<'END_OF_FILE'
X@EndSubSections
X@End @Section
END_OF_FILE
if test 30 -ne `wc -c <'lout/doc/tr.impl/s3.9'`; then
echo shar: \"'lout/doc/tr.impl/s3.9'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.impl/s3.9'
fi
if test -f 'lout/doc/tr.impl/s5.9' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.impl/s5.9'\"
else
echo shar: Extracting \"'lout/doc/tr.impl/s5.9'\" \(30 characters\)
sed "s/^X//" >'lout/doc/tr.impl/s5.9' <<'END_OF_FILE'
X@EndSubSections
X@End @Section
END_OF_FILE
if test 30 -ne `wc -c <'lout/doc/tr.impl/s5.9'`; then
echo shar: \"'lout/doc/tr.impl/s5.9'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.impl/s5.9'
fi
if test -f 'lout/doc/tr.impl/s6.0' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.impl/s6.0'\"
else
echo shar: Extracting \"'lout/doc/tr.impl/s6.0'\" \(829 characters\)
sed "s/^X//" >'lout/doc/tr.impl/s6.0' <<'END_OF_FILE'


X@Section
X @Title { Cross references }
X@Begin
X@PP

XCross references, such as `see page 57' and `see Figure 5,' are a useful
Xbut highly error-prone feature of documents. Scribe [7]
Xintroduced a method of keeping them up to date automatically as the
Xdocument changes: the user gives each referenced entity a tag, and
Xoperators are provided that return the page or sequence number of the
Xentity with a given tag.
X@PP
XA cross reference takes an object (such as a page number) from one point
Xin the document and copies it to another, and this generalization
Xsuggests other applications. For example, a running header is copied
Xfrom the title of a nearby chapter, and a reference is copied from a
Xbibliographic database. Making the unity of these applications manifest
Xis an interesting language design problem.
X@BeginSubSections
END_OF_FILE
if test 829 -ne `wc -c <'lout/doc/tr.impl/s6.0'`; then
echo shar: \"'lout/doc/tr.impl/s6.0'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.impl/s6.0'
fi
if test -f 'lout/doc/tr.impl/s6.9' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.impl/s6.9'\"
else
echo shar: Extracting \"'lout/doc/tr.impl/s6.9'\" \(30 characters\)
sed "s/^X//" >'lout/doc/tr.impl/s6.9' <<'END_OF_FILE'
X@EndSubSections
X@End @Section
END_OF_FILE
if test 30 -ne `wc -c <'lout/doc/tr.impl/s6.9'`; then
echo shar: \"'lout/doc/tr.impl/s6.9'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.impl/s6.9'
fi
if test -f 'lout/doc/tr.lout/README' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/README'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/README'\" \(579 characters\)
sed "s/^X//" >'lout/doc/tr.lout/README' <<'END_OF_FILE'
XDirectory lout/doc/tr.lout


X
XThis directory contains the Lout source files for the

Xreport `Document Formatting with Lout (Second Edition)',
Xalso known as the Lout user manual. To produce the
Xreport, type the command
X
X lout setup ch?.?? > outfile.ps
X
Xin this directory. This must be done four times to


Xcompletely resolve all cross references, although
Xthe PostScript file outfile.ps is printable after
Xthe first run. Auxiliary files with .li and .ld
Xsuffixes will be created in this directory. A copy
Xof the final outfile.ps is included.
X
XJeffrey H. Kingston

X23 December 1992
END_OF_FILE
if test 579 -ne `wc -c <'lout/doc/tr.lout/README'`; then
echo shar: \"'lout/doc/tr.lout/README'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/README'
fi
if test -f 'lout/doc/tr.lout/ch1.00' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch1.00'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch1.00'\" \(301 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch1.00' <<'END_OF_FILE'
X@Chapter


X @Title { Principles }
X @Tag { principles }
X@Begin

X@LP
XThe document formatting language Lout is based on just four key ideas:
Xobjects, definitions, cross references, and galleys. In this chapter we
Xconcentrate on them, postponing the inevitable details to later chapters.
X@BeginSections
END_OF_FILE
if test 301 -ne `wc -c <'lout/doc/tr.lout/ch1.00'`; then
echo shar: \"'lout/doc/tr.lout/ch1.00'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch1.00'
fi
if test -f 'lout/doc/tr.lout/ch1.99' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch1.99'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch1.99'\" \(27 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch1.99' <<'END_OF_FILE'
X@EndSections
X@End @Chapter
END_OF_FILE
if test 27 -ne `wc -c <'lout/doc/tr.lout/ch1.99'`; then
echo shar: \"'lout/doc/tr.lout/ch1.99'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch1.99'
fi
if test -f 'lout/doc/tr.lout/ch2.00' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch2.00'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch2.00'\" \(73 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch2.00' <<'END_OF_FILE'
X@Chapter
X @Title { Details }
X @Tag { details }
X@Begin
X@BeginSections
END_OF_FILE
if test 73 -ne `wc -c <'lout/doc/tr.lout/ch2.00'`; then
echo shar: \"'lout/doc/tr.lout/ch2.00'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch2.00'
fi
if test -f 'lout/doc/tr.lout/ch2.99' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch2.99'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch2.99'\" \(27 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch2.99' <<'END_OF_FILE'
X@EndSections
X@End @Chapter
END_OF_FILE
if test 27 -ne `wc -c <'lout/doc/tr.lout/ch2.99'`; then
echo shar: \"'lout/doc/tr.lout/ch2.99'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch2.99'
fi
if test -f 'lout/doc/tr.lout/ch3.00' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch3.00'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch3.00'\" \(84 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch3.00' <<'END_OF_FILE'
X@Chapter
X @Title { Predefined symbols }
X @Tag { symbols }
X@Begin
X@BeginSections
END_OF_FILE
if test 84 -ne `wc -c <'lout/doc/tr.lout/ch3.00'`; then
echo shar: \"'lout/doc/tr.lout/ch3.00'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch3.00'
fi
if test -f 'lout/doc/tr.lout/ch3.05' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch3.05'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch3.05'\" \(611 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch3.05' <<'END_OF_FILE'
X@Section
X @Title { "@Space" }
X @Tag { space }
X@Begin
X@PP
XThe @@Space symbol
Xspace.sym @Index { @@Space symbol }
Xchanges the value of the @Code s unit of measurement (Section
Xs.unit.space @SubIndex { and @@Space symbol }
X{@NumberOf concatenation}) within its right parameter to the value
Xgiven by the left parameter:
X@ID {
X@Code "1c @Space { a b c d }"
X}
Xhas result
X@ID {
X1c @Space { a b c d }
X}
XAs for the @@Break symbol, the left parameter of @@Space may be given
Xrelative to the enclosing @Code s unit, and it may include a gap
Xmode. Note that the @@Font symbol also sets the @Code s unit.
X@End @Section
END_OF_FILE
if test 611 -ne `wc -c <'lout/doc/tr.lout/ch3.05'`; then
echo shar: \"'lout/doc/tr.lout/ch3.05'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch3.05'
fi
if test -f 'lout/doc/tr.lout/ch3.09' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch3.09'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch3.09'\" \(642 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch3.09' <<'END_OF_FILE'
X@Section
X @Title { "@HContract" and "@VContract" }
X @Tag { hcontract }
X@Begin
X@PP
Xhcontract @Index { @@HContract symbol }
Xvcontract @Index { @@VContract symbol }
Xcontraction @Index { Contraction of object }
XThe @@HContract symbol reduces the size of its right parameter to a
Xreasonable minimum (after paragraph breaking). For example,
X@ID @Code "5i @Wide @HContract { A |1rt B }"
Xhas result
X@ID { 5i @Wide @HContract { A |1rt B } }
Xin which the B is much closer to the A than it would otherwise have
Xbeen. @@VContract is similar, but in a vertical direction. See Section
X{@NumberOf size} for a more extensive discussion.
X@End @Section
END_OF_FILE
if test 642 -ne `wc -c <'lout/doc/tr.lout/ch3.09'`; then
echo shar: \"'lout/doc/tr.lout/ch3.09'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch3.09'
fi
if test -f 'lout/doc/tr.lout/ch3.12' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch3.12'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch3.12'\" \(718 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch3.12' <<'END_OF_FILE'
X@Section
X @Title { "@Scale" }
X @Tag { scale }
X@Begin
X@PP
Xscale @Index { @@Scale symbol }
XThis symbol geometrically scales its right parameter by the scale factor
Xgiven in its left parameter:
X@ID @Code "1.0 @Scale Hello 2.0 @Scale Hello 0.5 @Scale Hello"
Xhas result
X@ID { 1.0 @Scale Hello 2.0 @Scale Hello 0.5 @Scale Hello }
XThe left parameter can be two scale factors, in which case the first
Xapplies horizontally, and the second vertically:
X@ID @Code "{0.5 2.0} @Scale Hello"
Xhas result
X@ID { {0.5 2.0} @Scale Hello }
XThe right parameter may be any object. @@Scale has both a @@OneCol and
Xa @@OneRow effect, and the marks of the result coincide with the principal
Xmarks of the right parameter.
X@End @Section
END_OF_FILE
if test 718 -ne `wc -c <'lout/doc/tr.lout/ch3.12'`; then
echo shar: \"'lout/doc/tr.lout/ch3.12'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch3.12'
fi
if test -f 'lout/doc/tr.lout/ch3.14' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch3.14'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch3.14'\" \(556 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch3.14' <<'END_OF_FILE'
X@Section
X @Title { "@Next" }
X @Tag { next }
X@Begin
X@PP
Xnext.sym @Index { @@Next symbol }
XThe symbol @@Next returns its parameter
Xplus one. It is rather clever at working this out: it hunts through
Xthe parameter from right to left, looking for a number to increment:
X@ID @Code {
X"@Next (3.99)"
X}
Xhas result {@Next (3.99)}. If @@Next cannot find a digit inside
Xits parameter, it is an error. Roman numerals are handled by storing
Xthem in a database, as explained in Section {@NumberOf paras};
X@@Next will not increment a Roman numeral.
X@End @Section
END_OF_FILE
if test 556 -ne `wc -c <'lout/doc/tr.lout/ch3.14'`; then
echo shar: \"'lout/doc/tr.lout/ch3.14'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch3.14'
fi
if test -f 'lout/doc/tr.lout/ch3.17' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch3.17'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch3.17'\" \(791 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch3.17' <<'END_OF_FILE'
X@Section
X @Title { "@Null" }
X @Tag { null }
X@Begin
X@PP
XThis symbol
Xnull.sym @Index { @@Null symbol }
Xprovides a convenient way to remove unwanted
Xconcatenation symbols. If there is a concatenation symbol
Xpreceding @@Null, the @@Null and the
Xconcatenation symbol are both deleted. Otherwise, if there is a
Xfollowing concatenation symbol, it and the @@Null are both deleted.
XOtherwise, @@Null becomes an empty object.
X@PP
XThese rules apply to a fully parenthesized version of the expression. For
Xexample, in
X@ID @Code {
X"... //1vx @Null |0.5i ..."
X}
Xit is the horizontal concatenation symbol following @@Null that
Xdisappears, because in the fully parenthesized version
X@ID @Code {
X"... //1vx { @Null |0.5i ... }"
X}
Xthere is no concatenation symbol preceding the @@Null.
X@End @Section
END_OF_FILE
if test 791 -ne `wc -c <'lout/doc/tr.lout/ch3.17'`; then
echo shar: \"'lout/doc/tr.lout/ch3.17'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch3.17'
fi
if test -f 'lout/doc/tr.lout/ch3.20' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch3.20'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch3.20'\" \(570 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch3.20' <<'END_OF_FILE'
X@Section
X @Title { "@Tagged" }
X @Tag { tagged }
X@Begin
X@PP
XThe @@Tagged
Xtagged.sym @Index { @@Tagged symbol }
Xsymbol takes a cross reference for its left parameter and an object, whose
Xvalue must be a juxtaposition of simple words or an empty
Xobject, for its right parameter. It has the effect of attaching its
Xright parameter as an additional tag to the invocation denoted by its
Xleft parameter, unless the right parameter is empty, in which case @@Tagged
Xdoes nothing. The result of @@Tagged is always @@Null, which makes it
Xeffectively invisible.
X@End @Section
END_OF_FILE
if test 570 -ne `wc -c <'lout/doc/tr.lout/ch3.20'`; then
echo shar: \"'lout/doc/tr.lout/ch3.20'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch3.20'
fi
if test -f 'lout/doc/tr.lout/ch3.26' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch3.26'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch3.26'\" \(824 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch3.26' <<'END_OF_FILE'
X@Section
X @Tag { include }
X @Title { "@Include and @SysInclude" }
X@Begin
X@PP
Xinclude.sym @Index { @@Include symbol }
Xsysinclude.sym @Index { @@SysInclude symbol }
XThese symbols instruct Lout to temporarily switch to reading another
Xfile, whose name appears in braces following the symbol. For example,
X@ID @Code {
X"@Include { \"/usr/lout/fontdefs\" }"
X}
Xwill cause the contents of file "/usr/lout/fontdefs" to be read at the
Xpoint it occurs. After that file is read, the current file is resumed. The
Xincluded file may contain arbitrary Lout text, including other
X@@Include commands. The file is searched for first in the current
Xdirectory, then in a sequence of standard places which are not necessarily the
Xsame places that databases are searched for. @@SysInclude searches the
Xstandard places only.
X@End @Section
END_OF_FILE
if test 824 -ne `wc -c <'lout/doc/tr.lout/ch3.26'`; then
echo shar: \"'lout/doc/tr.lout/ch3.26'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch3.26'
fi
if test -f 'lout/doc/tr.lout/ch3.99' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch3.99'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch3.99'\" \(27 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch3.99' <<'END_OF_FILE'
X@EndSections
X@End @Chapter
END_OF_FILE
if test 27 -ne `wc -c <'lout/doc/tr.lout/ch3.99'`; then
echo shar: \"'lout/doc/tr.lout/ch3.99'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch3.99'
fi
if test -f 'lout/doc/tr.lout/ch4.00' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch4.00'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch4.00'\" \(397 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch4.00' <<'END_OF_FILE'
X@Chapter
X @Title { Examples }
X @Tag { examples }
X@Begin
X@LP
XThis chapter presents some examples taken from the various
Xpackages available with Basser Lout. The reader who masters these
Xexamples will be well prepared to read the packages themselves. The
Xexamples have not been simplified in any way, since an important part of
Xtheir purpose is to show Lout in actual practice.
X@BeginSections
END_OF_FILE
if test 397 -ne `wc -c <'lout/doc/tr.lout/ch4.00'`; then
echo shar: \"'lout/doc/tr.lout/ch4.00'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch4.00'
fi
if test -f 'lout/doc/tr.lout/ch4.99' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.lout/ch4.99'\"
else
echo shar: Extracting \"'lout/doc/tr.lout/ch4.99'\" \(27 characters\)
sed "s/^X//" >'lout/doc/tr.lout/ch4.99' <<'END_OF_FILE'
X@EndSections
X@End @Chapter
END_OF_FILE
if test 27 -ne `wc -c <'lout/doc/tr.lout/ch4.99'`; then
echo shar: \"'lout/doc/tr.lout/ch4.99'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.lout/ch4.99'
fi
if test -f 'lout/doc/tr.tab/README' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.tab/README'\"
else
echo shar: Extracting \"'lout/doc/tr.tab/README'\" \(545 characters\)
sed "s/^X//" >'lout/doc/tr.tab/README' <<'END_OF_FILE'
XDirectory lout/doc/tr.tab


X
XThis directory contains the Lout source files for

Xthe Tab table formatting package technical report.
XTo produce the report, type the command


X
X lout setup s? > outfile.ps
X
Xin this directory. This must be done three times to
Xcompletely resolve all cross references, although
Xthe PostScript file outfile.ps is printable after
Xthe first run. Auxiliary files with .li and .ld
Xsuffixes will be created in this directory. A copy
Xof the final outfile.ps is included.
X
XJeffrey H. Kingston

X24 September 1991
X22 December 1992
END_OF_FILE
if test 545 -ne `wc -c <'lout/doc/tr.tab/README'`; then
echo shar: \"'lout/doc/tr.tab/README'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.tab/README'
fi
if test -f 'lout/doc/tr.tab/setup' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/doc/tr.tab/setup'\"
else
echo shar: Extracting \"'lout/doc/tr.tab/setup'\" \(739 characters\)
sed "s/^X//" >'lout/doc/tr.tab/setup' <<'END_OF_FILE'
X
X######################################################
X# #
X# Lout setup file for Tab paper. #


X# #
X# Jeffrey H. Kingston #

X# 22 December 1992 #
X# #
X######################################################
X
X@SysInclude { ft }
X@SysInclude { dl }

X@SysInclude { eq }
X@SysInclude { pas }
X@SysInclude { fig }

X@Include { tab }


X
X def @TeX { T{ /0.2fo E}X }
X
X def @Code
X right x
X { { Helvetica Base -1p } @Font lines @Break x
X }
X

X@Use { @DocumentLayout }
X
X@SysDatabase @Reference { "loutrefs" }
END_OF_FILE

if test 739 -ne `wc -c <'lout/doc/tr.tab/setup'`; then
echo shar: \"'lout/doc/tr.tab/setup'\" unpacked with wrong size!
fi
# end of 'lout/doc/tr.tab/setup'
fi
if test -f 'lout/font0/README' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/font0/README'\"
else
echo shar: Extracting \"'lout/font0/README'\" \(419 characters\)
sed "s/^X//" >'lout/font0/README' <<'END_OF_FILE'
XDirectory lout/font0 - font metrics for ASCII
X
XThis directory contains Adobe Systems font metrics
X(.AFM) files for the ASCII character set, exactly as
Xdistributed by Adobe Systems except that erroneous
Xligature information has been removed from Couri*.AFM
X(Courier font). These files are the source of Lout's
Xinformation about the height and width of all characters.
X
XJeffrey H. Kingston
X30 July 1991
X22 December 1992
END_OF_FILE
if test 419 -ne `wc -c <'lout/font0/README'`; then
echo shar: \"'lout/font0/README'\" unpacked with wrong size!
fi
# end of 'lout/font0/README'
fi
if test -f 'lout/font1/README' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/font1/README'\"
else
echo shar: Extracting \"'lout/font1/README'\" \(384 characters\)
sed "s/^X//" >'lout/font1/README' <<'END_OF_FILE'
XDirectory lout/font1 - font metrics for ISO-LATIN-1
X
XThis directory is supposed to contain Adobe Systems
Xfont metrics (.AFM) files for the ISO-LATIN-1
Xcharacter set. They are the source of Lout's
Xinformation about the height and width of all
Xcharacters.
X
XAt the time of writing the directory is empty
Xbecause I don't have these files.
X
XJeffrey H. Kingston
X30 July 1991
X24 March 1993
END_OF_FILE
if test 384 -ne `wc -c <'lout/font1/README'`; then
echo shar: \"'lout/font1/README'\" unpacked with wrong size!
fi
# end of 'lout/font1/README'
fi
if test -f 'lout/include/README' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'lout/include/README'\"
else
echo shar: Extracting \"'lout/include/README'\" \(682 characters\)
sed "s/^X//" >'lout/include/README' <<'END_OF_FILE'
XDirectory lout/include
X
XThis directory contains Lout source files for
Xa variety of standard packages and setup files:
X
X ft A file of font definitions
X dl The DocumentLayout package
X doc A setup file calling dl for simple documents
X report A setup file calling dl for technical reports
X book A setup file calling dl for books
X eq The Eq equation formatting package
X pas The Pas Pascal formatting package
X fig The Fig figure drawing package
X fig_prepend A PostScript file needed by fig
X tab The Tab table formatting package
X tab_prepend A PostScript file needed by Tab
X lout.hyph Text file of hyphenation patterns


X
XJeffrey H. Kingston
X22 December 1992

END_OF_FILE
if test 682 -ne `wc -c <'lout/include/README'`; then
echo shar: \"'lout/include/README'\" unpacked with wrong size!
fi
# end of 'lout/include/README'
fi
echo shar: End of archive 30 \(of 30\).
cp /dev/null ark30isdone

0 new messages