From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 2 Sep 2019 13:46:59 +0900 Subject: Initial commit --- support/relabel/README | 30 +++ support/relabel/Relabeldocument.txt | 286 ++++++++++++++++++++ support/relabel/relabel.doc | 261 +++++++++++++++++++ support/relabel/relabeli.pas | 502 +++++++++++++++++++++++++++++++++++ support/relabel/relabelmac.hqx | 261 +++++++++++++++++++ support/relabel/relabelmac.pas | 503 ++++++++++++++++++++++++++++++++++++ support/relabel/relex2i.txt | 166 ++++++++++++ support/relabel/relex2m.txt | 191 ++++++++++++++ support/relabel/relex3i.txt | 158 +++++++++++ support/relabel/relex3m.txt | 156 +++++++++++ 10 files changed, 2514 insertions(+) create mode 100644 support/relabel/README create mode 100644 support/relabel/Relabeldocument.txt create mode 100644 support/relabel/relabel.doc create mode 100644 support/relabel/relabeli.pas create mode 100644 support/relabel/relabelmac.hqx create mode 100644 support/relabel/relabelmac.pas create mode 100644 support/relabel/relex2i.txt create mode 100644 support/relabel/relex2m.txt create mode 100644 support/relabel/relex3i.txt create mode 100644 support/relabel/relex3m.txt (limited to 'support/relabel') diff --git a/support/relabel/README b/support/relabel/README new file mode 100644 index 0000000000..b517b7286b --- /dev/null +++ b/support/relabel/README @@ -0,0 +1,30 @@ + THE RELABEL SYSTEM + +By Peter Ungar, 4/22/1994, laxa@acfcluster.nyu.edu, 914 723 7187 + + RELABEL is a system for convenient relabeling in mathematical +manuscripts as one makes changes. It is intended to be used with +TeX or LaTeX source texts, but can be used with any text file +and possibly even with some formatted files. + + The greatest advantage of RELABEL compared to any TeX macro +based reference system, such as the one in LaTeX, is that with +the latter one gets a permanent discrepancy between the labels in +the source text and the typeset text. + + RELABEL also requires less extra typing than the LaTeX macros; +usually just a single byte in each label or reference in addition +to what will be printed. + + The following RELABEL files are available: + + Relabeldocument.txt Detailed instructions for using RELABEL on + Macintosh or MS-DOS computers. + relabeli.exe (binary) executable MS-DOS RELABEL program + relabeli.pas Turbo Pascal source text for the above + relabelmac.exe (macbinary) executable Macintosh RELABEL program + relabelmac.pas Turbo Pascal for Macintosh source text for the above + relex2i.txt and relex3i.txt: Example files for IBM-compatible computers + relex2i.txt and relex3m.txt: Example files for Macintosh computers. + +(This file slightly updated 2008-Aug-18, JH.) \ No newline at end of file diff --git a/support/relabel/Relabeldocument.txt b/support/relabel/Relabeldocument.txt new file mode 100644 index 0000000000..d9de637b50 --- /dev/null +++ b/support/relabel/Relabeldocument.txt @@ -0,0 +1,286 @@ + GENERAL DESCRIPTION OF "RELABEL". + + Peter Ungar, peterungar@yahoo.com Aug. 18, 2008 + +WARNINGS. If your .TeX files contain extended characters (characters +coded by bytes > 127) then this program will not work for you. +Relabeli.exe and Relabelmac assume the only extended characters in +the file are the ones put in to tell Relabel what kind of item the +subsequent characters are the identifier of. + + TeX ignores lines starting with % but Relabel is not programmed to +do that. Hence extended characters have to be removed +from commented-out text for the relabeling to work correctly. + +------------------------------------------- + + The program RELABEL is designed to make it easy to renumber the +items and change the references to them in a text file after you have +inserted or deleted or moved material. LaTeX does this at the +typesetting stage, but that creates a discrepancy between labels in +the source text and the typeset text. It also involves more typing than RELABEL. + + The MS-DOS version of RELABEL, Relabeli.exe, works on Windows Vista and +earlier versions but both the file to be relabeled and the output file must +obey MS-DOS filename rules: at most 8 characters before the . and no spaces. +I don't know whether Relabelmac works on current Macintosh computers. + + To use RELABEL, you normally have to type only a single +character in addition to what would be in an old-fashioned +typescript, to tag the string which follows as an identifier for +one of 10 kinds of items. If you are referring to an item which +has not appeared yet, you have to type a second character to +indicate that this is a reference. + + In LaTeX the term "label" is used for the occurrence of, say, +3.2.13 next to the formula, and "reference" for its occurrence +elsewhere. We shall mostly use the same terminology and use +"identifier" when mean "a label or a reference". + + TYPES OF IDENTIFIERS. + + RELABEL has provision for identifiers of chapters, sections, +subsections, definitions, theorems, lemmas, figures, formulas, +problems and at-large items. At-large items are numbered +consecutively in the entire file; photo-reproductions printed on +special paper are usually numbered this way. + + When RELABEL encounters a subsection heading, the numbers of +all non-heading items other than at-large items are reset to 1. +These item numbers form six independent series but RELABEL treats +them in the same way. In particular, "lemma"-s are not reset +after each theorem. Section headings reset the subsection count +too. A new chapter identifier resets the section count only in +3-level mode, explained below. It is allowed that some chapters +contain sections and others not, and some sections can contain +subsections and others not. A chapter or section may contain some +material before the sections or subsections start. + + THREE OR TWO LEVELS OF TEXT UNITS. + + RELABEL can work with either 3 levels of text units (chapter, +section, subsection) or 2 levels (section, subsection.) In the +3-level mode section numbers are reset to 1 at the beginning of +each chapter except the first. All other counts are reset to 1 at +the beginning of each section or subsection, except for the count +of "at large items" which starts with 1 and is not reset. +3-level mode does not mean that chapters must have sections and +sections must have subsections, only that they may have them. + + If you give RELABEL the wrong number of levels, you will get +error messages. + ABBREVIATED IDENTIFIERS. + + In 3-level mode a full identifier must contain the chapter +identifier and, if we are in a section or subsection, then those +identifiers too. The full identifier of Theorem 4 of chapter 1, +section 2, subsection 3, with the theorem tag +would be 1.2.3.4. Part or all of a section may not be +in a subsection, and part or all of a chapter may not be in any +section. In such parts a full identifier is correspondingly +shorter. If chapter 1 has no sections then the full label +of theorem 4 would be 1.4. (See later about alternative label +tags for Macintosh and MS-DOS computers.) + + In 2-level mode you can still use chapter labels but sections +are numbered consecutively even after you have entered a new chapter. +Therefore, a chapter identifier is not needed in a full identifier +of another type of item; the section number suffices to make the +label unique in the entire text. Putting the chapter number there +too will cause an error. + + Labels and references to items of the at-large type should NOT +include a text unit identifier. + + You may omit ALL the text unit identifiers (chapter, section, +subsection) in a label or reference; RELABEL will understand that +the text unit is the current one. If you refer to another text +unit, you may not omit ANY identifier, even if you are referring +to another subsection of the present section. RELABEL will also +be confused if you omit some but not all of the identifiers of +the current text unit. Apart from this, you need not be +consistent; you may omit all unit identifiers in one label or +reference and put them all in in the next. You can choose whether +your output have abbreviated or full labels. IF YOU WANT TO MOVE +MATERIAL AROUND, USE RELABEL TO CREATE A FILE WITH UNABBREVIATED +LABELS. Then you can move, say, Problem 2 from Section 6 into +Section 7 which also has a Problem 2, and they will be assigned +different numbers when you run RELABEL again. + + You may abbreviate labels of sections and subsections but in its +output RELABEL always writes these out in full. In section and +subsection labels RELABEL will even correctly interpret partially +abbreviated labels, i.e. in 3-level mode you can omit the +identifier of the current chapter but retain the identifier of +the currect section. + + LABEL TAGS IN OUTPUT OPTION + + If further revisions are to be made in the file, we want to +retain the special symbols which identify the various kinds of +labels and references. If you are using WinEdt and MikTeX, you can +typeset from a source text with the label tags in it; MikTeX ignores +the tags. In case your TeX program does not ignore extended characters, +RELABEL gives the option of an output file without label tags. + + NAMES OF FILES + + RELABELi.exe is an old MS-DOS program. Input and output file names +must consist of 8 or fewer characters and contain no spaces. Otherwise +RELABELi.exe hangs up without a message. + + The Macintosh version makes a name for the output file by +appending either an R or a T to the name of the input file. R +is for Relabeled and it is appended when the output file still +contains the label tags. T stands for TeX source text, and is +appended if the "no label tags in the output file" option is +selected. + + + In case the Macintosh version, RELABELMAC, still works on your +Macintosh, note the following. The Creator of the output files is +*TEX, for convenient use with the excellent TeX program +TEXTURES. You can change the creator in the program by +looking for the TEXTURES creator code *TEX using ResEdit. + + SPECIFICATION OF IDENTIFIERS. + + The chapter number, if any, the section number, subsection +number and the number of the item within the unit are separated +by periods(.). Because of this, RELABEL will go wrong if you assign +formula numbers containing decimal points, e.g. 1.5 for something +inserted between 1 and 2. The identifiers you give to chapters, +sections and items within a section should consist of digits and +letters of the English alphabet (ASCII characters 48-57, 65-90 +and 97-122). You can use 1a instead of 1.5. Lower and +uppercase letters are considered distinct. The parts of the label +separated by .'s should contain at most 12 symbols. When the +program is reading a label and it encounters a space or any other +symbol which is not a digit or a small letter or ., it concludes +that the label has been read, and that the symbol at hand is the +one following the label. RELABEL recognizes a . immediately +following the label which is not followed by a character or digit +as not part of the label. Thus, when you have proved it, you can +write + +Theorem 1.5. Perfect numbers are even. + + + TAGS INDICATING THE KIND OF ITEM + + To indicate what something like 5 or 12.JohnSmith is the label +of, we place an extended character just before the identifier. +There are two different tags that can be used for each type of item. +The reason is that some extended characters are easier to type on +Windows computers while others are easier on Macs. The input file may contain either one of the choices in each place, so that Relabeli.exe can process +a file written on a Macintosh, conversely. + + At large ferers to items numbered consecutively in the entire file. +An identifier of such an item should not have chapter, section and subsection identifiers and will be changed to a single number. + + MS-DOS MACINTOSH + + At large: ASCII 220: Option a, ASCII 140: + fiGure: ASCII 221: Option g, ASCII 169: + Formula: ASCII 222: Option f, ASCII 196: + Problem: ASCII 223: Option p, ASCII 185: + Definition: ASCII 224: Option d, ASCII 182: + Theorem: ASCII 225: Option t, ASCII 160: + Lemma: ASCII 226: Option l, ASCII 194: + Chapter: ASCII 227: Option c, ASCII 141: + Section: ASCII 228: Option s, ASCII 167: + suBsection: ASCII 229: Option b, ASCII 186: + +Reference tag: ASCII 222: Option f, ASCII 196: + +The blank Option t is bewildering but if you copy and paste it works. + + To produce, say, byte 222 when using MS-DOS programs, hold down +ALT and press the 2 key ON THE NUMERIC KEYPAD 3 times. (If this +does not work, try locking or unlocking the numeric key pad.) + +WARNING TO WinEdt users: In all the settings I was able to try, +WinEdt produced extended characters different from the above when I used the ALT key. +To get the required byte into the text select CHARACTER MAP from the +TOOLS menu. Double clicking a character will insert it into the +text where the caret is. Another way: type the characters into a +Wordpad text file, keep that window open and copy and paste the characters. + + In the MS-DOS bytes we chose, only the last digit varies, which +makes typing relatively easy. To help remember the last digit, +note that in the top row of the keypad we have chapter, section +and subsection; in the second row, definition, theorem, lemma; in +the third row, figure, formula, problem. For the at-LARGE +type of item we use the LARGE 0 key in the fourth row. Since +formula is the most frequently occurring item, we utilized the +most convenient code for it, and also for the reference tag. + + Both the MS-DOS and the Macintosh versions of RELABEL recognize +either code, or a mixture of the two, in the input. They change it +to the one used in their respective systems in the output. + + The symbols associated with the characters depend on the font. +On MS-DOS computers one gets different characters if one uses +different country codes. Users of languages other than English +may find that some of the 18 bytes we used in tags are needed for +use in text and have to be replaced. + + Note also that in some fonts some bytes > 127 produce symbols +also associated with bytes < 128. Therefore, if you see an +ordinary character in the above the tag list, it does not +necessarily mean there will be a conflict with RELABEL. + + REFERENCE TAGS + + RELABEL checks whether an identifier has occurred earlier. If +not, it treats it as a label, i.e. the occurrence of an identifier +next to the item it is identifying, rather than a reference. If +we make a reference to an item which has not yet occurred, we have +to tag it as a reference. This is done by putting just after the +tag which specifies the item kind, one of the two reference +tags shown in the table. Wneh you have run a file through +RELABEL, backward as well as forward references will have +the reference tag, which enables us to move material to any +other place in the text. + + EXAMPLE FILES + + Two example files are provided so that the reader can see how +RELABEL works and experiment with it. The files have +memnonic labels, which RELABEL replaces with numbered labels. +RELEX3 has 3 levels of text units, RELEX2 has 2. (RELEX2 +will also produce 1 error message.) The files are almost the +same. If you produce a relabeled file with the labels written out +in full and the label tags left in, you can move items and +even entire text units to other places. If you then use RELABEL +again, the text units and items will be provided with appropriate +new labels. + + ERROR HANDLING + + If you make a mistake when typing the input file name or input +a letter when a number is expected or vice versa, RELABEL will +crash. On the Macintosh it may even cause a system crash and +output a message that a system file may have been damaged. In +fact, the disk drive is not activated on these occasions and +hence no disk file is affected. (If one compiles the Macintosh +version with THINK PASCAL or with METROWERKS PASCAL, the +resulting applications will not cause system crashes in these +circumstances but the THINK PASCAL 3.0 product takes about 3 times +longer to relabel our example files on the MAC+, and the +METROWERKS PASCAL v.1.3 product takes about 10 times as long.) + + If a label has a wrong format or RELABEL can not find a label +which is referred to, there will be an error message and you can +choose to exit RELABEL. (Relex2 has one reference to a +nonexistent label.) Try to complete the run. In the output file +the incorrect identifiers are replaced by ??? which should make +it easy to find the errors in the input file. + + It helps to avoid errors to put the reference tag into all +references, not just forward references. If you make a tagged +reference to a nonexistent label, e.g. because of a typing error, +RELABEL gives an error message. If the identifier is not tagged +as a reference but has the correct format, RELABEL will consider +it to be a new label and assign the next available number for +that kind of item. diff --git a/support/relabel/relabel.doc b/support/relabel/relabel.doc new file mode 100644 index 0000000000..cd1e535c4d --- /dev/null +++ b/support/relabel/relabel.doc @@ -0,0 +1,261 @@ + GENERAL DESCRIPTION OF "RELABEL". + + Peter Ungar, 914 723 7187 May 25, 1994 + + The program RELABEL is designed to make it easy to renumber the +items and change the references to them when you want to +insert or delete material or move it to another part of the +manuscript. LaTeX has a clumsy mechanism of this sort, which gets +into action at the typesetting stage. It creates a permanent +discrepancy between labels in the source text and the final +version. It also involves more typing than RELABEL. + + To use RELABEL, you normally have to type only a single +character in addition to what would be in an old-fashioned +typescript, to tag the string which follows as an identifier for +one of 9 kinds of items. If you are referring to an item which +has not appeared yet, you have to type a second character to +indicate that this is a reference. + + In LaTeX the term "label" is used for the occurrence of, say, +3.2.13 next to the formula, and "reference" for its occurrence +elsewhere. We shall mostly use the same terminology and use +"identifier" when mean "a label or a reference". + + TYPES OF IDENTIFIERS. + + RELABEL has provision for identifiers of chapters, sections, +subsections, definitions, theorems, lemmas, figures, formulas, +problems and at-large items. At-large items are numbered +consecutively in the entire file; photo-reproductions printed on +special paper are usually numbered this way. + + When RELABEL encounters a subsection heading, the numbers of +all non-heading items other than at-large items are reset to 1. +These item numbers form six independent series but RELABEL treats +them in the same way. In particular, "lemma"-s are not reset +after each theorem. Section headings reset the subsection count +too. A new chapter identifier resets the section count only in +3-level mode, explained below. It is allowed that some chapters +contain sections and others not, and some sections can contain +subsections and others not. A chapter or section may contain some +material before the sections or subsections start. + + If you do not want item numbers reset each time you start a +subsection, use a non-heading type tag you do not need, e.g. +Lemma, to label subsections. + + THREE OR TWO LEVELS OF TEXT UNITS. + + RELABEL can work with either 3 levels of text units (chapter, +section, subsection) or 2 levels (section, subsection.) In the +3-level mode section numbers are reset to 1 at the beginning of +each chapter except the first. All other counts are reset to 1 at +the beginning of each section or subsection, except for the count +of "at large items" which starts with 1 and is not reset. +3-level mode does not mean that chapters must have sections and +sections must have subsections, only that they may have them. + + If you give RELABEL the wrong number of levels, you will get +error messages. RELABEL does not have a built-in option to +change a text from 2-level to 3-level mode or vice versa, although +one can trick it into doing that. + + ABBREVIATED IDENTIFIERS. + + In 3-level mode a full identifier must contain the chapter +identifier and, if we are in a section or subsection, then those +identifiers too. The full identifier of Theorem 4 of chapter 1, +section 2, subsection 3, with the theorem tag (Macintosh version) +would be 1.2.3.4. Part or all of a section may not be +in a subsection, and part or all of a chapter may not be in any +section. In such parts a full identifier is correspondingly +shorter. If chapter 1 has no sections then the full label +of theorem 4 would be 1.4. (See later about alternative label +tags for Macintosh and MS-DOS computers.) + + In 2-level mode you can still use chapter labels but sections +are numbered consecutively. Therefore, a chapter identifier +is not needed in a full identifier of another type of item and +will cause an error if used. + + Labels and references to items of the at-large type should NOT +include a text unit identifier. + + You may omit ALL the text unit identifiers (chapter, section, +subsection) in a label or reference; RELABEL will understand that +the text unit is the current one. If you refer to another text +unit, you may not omit ANY identifier, even if you are referring +to another subsection of the present section. RELABEL will also +be confused if you omit some but not all of the identifiers of +the current text unit. Apart from this, you need not be +consistent; you may omit all unit identifiers in one label or +reference and put them all in in the next. You can choose whether +your output have abbreviated or full labels. IF YOU WANT TO MOVE +MATERIAL AROUND, USE RELABEL TO CREATE A FILE WITH UNABBREVIATED +LABELS. Then you can move, say, Problem 2 from Section 6 into +Section 7 which also has a Problem 2, and they will be assigned +different numbers when you run RELABEL again. + + You may abbreviate labels of sections and subsections but in its +output RELABEL always writes these out in full. In section and +subsection labels RELABEL will even correctly interpret partially +abbreviated labels, i.e. in 3-level mode you can omit the +identifier of the current chapter but retain the identifier of +the currect section. + + LABEL TAGS IN OUTPUT OPTION + + If further revisions are to be made in the file, we want to +retain the special symbols which identify the various kinds of +labels and references. We do not want them in the final version. + + NAMES OF THE OUTPUT FILES + + The Macintosh version makes a name for the output file by +appending either an R or a T to the name of the input file. R +is for Relabeled and it is appended when the output file still +contains the label tags. T stands for TeX source text, and is +appended if the "no label tags in the output file" option is +selected. + + MS-DOS users do not have the luxury of being able to lengthen +file names. The MS-DOS version of RELABEL asks you to give a name +to the output file. + + In the Macintosh version the Creator of the output files is +*TEX, for convenient use with the excellent TeX program +TEXTURES. You can easily change TextCreator in the source text of +the program. Less easily, you can change the compiled program by +looking for the TEXTURES creator code *TEX using ResEdit. + + SPECIFICATION OF IDENTIFIERS. + + The chapter number, if any, the section number, subsection +number and the number of the item within the unit are separated +by .-s. Because of this, RELABEL will go wrong if you assign +formula numbers containing decimal points, e.g. 1.5 for something +inserted between 1 and 2. The identifiers you give to chapters, +sections and items within a section should consist of ASCII +characters 48-57, 65-90 and 97-122, digits and letters of the +English alphabet, so you can use 1a instead of 1.5. Lower and +uppercase letters are considered distinct. The parts of the label +separated by .'s should contain at most 12 symbols. When the +program is reading a label and it encounters a space or any other +symbol which is not a digit or a small letter or ., it concludes +that the label has been read, and that the symbol at hand is the +one following the label. RELABEL recognizes a . immediately +following the label which is not followed by a character or digit +as not part of the label. Thus, when you have proved it, you can +write + +Theorem 1.5. Perfect numbers are even. + + + TAGS INDICATING THE KIND OF ITEM + + To indicate what something like 5 or 12.JohnSmith is the label +of, we immediately precede the label (without leaving a space) by +a certain character. Characters with bytes < 128 could not be +used because they are needed for the text. We have to allow two +alternative label tags for each of our 10 types of item +because what is easy to remember and write on the Macintosh is +difficult on MS-DOS computers and vice versa. + + MACINTOSH MS-DOS + + 0: At large: Option a, ASCII 141: ASCII 220: + 1: Chapter: Option c, ASCII 141: ASCII 227: + 2: Section: Option s, ASCII 167: ASCII 228: + 3: suBsection: Option b, ASCII 186: ASCII 229: + 4: fiGure: Option g, ASCII 169: ASCII 221: + 5: Formula: Option f, ASCII 196: ASCII 222: + 6: Problem: Option p, ASCII 185: ASCII 223: + 7: Definition: Option d, ASCII 182: ASCII 224: + 8: Theorem: Option t, ASCII 160: ASCII 225: + 9: Lemma: Option l, ASCII 194: ASCII 226: + +Reference tag: Option f, ASCII 196: ASCII 222: + + To produce, say, byte 222 when using MS-DOS programs, hold down +ALT and press the 2 key ON THE NUMERIC KEYPAD 3 times. (If this +does not work, try locking or unlocking the numeric key pad.) + + In the MS-DOS bytes we chose, only the last digit varies, which +makes typing relatively easy. To help remember the last digit, +note that in the top row of the keypad we have chapter, section +and subsection; in the second row, definition, theorem, lemma; in +the third row, figure, formula, problem. For the at-LARGE +type of item we use the LARGE 0 key in the fourth row. Since +formula is the most frequently occurring item, we utilized the +most convenient code for it, and also for the reference tag. + + Both the MS-DOS and the Macintosh versions of RELABEL recognize +either code, or a mixture of the two, in the input. They change it +to the one used in their respective systems in the output. + + The symbols associated with the characters depend on the font. +On MS-DOS computers one gets different characters if one uses +different country codes. Users of languages other than English +may find that some of the 18 bytes we used in tags are needed for +use in text and have to be replaced. + + Note also that in some fonts some bytes > 127 produce symbols +also associated with bytes < 128. Therefore, if you see an +ordinary character in the above the tag list, it does not +necessarily mean there will be a conflict with RELABEL. + + REFERENCE TAGS + + RELABEL checks whether an identifier has occurred earlier. If +not, it treats it as a label, i.e. the occurrence of an identifier +next to the item it is identifying, rather than a reference. If +we make a reference to an item which has not yet occurred, we have +to tag it as a reference. This is done by putting just after the +tag which specifies the item kind, one of the two reference +tags shown in the table. Wneh you have run a file through +RELABEL, backward as well as forward references will have +the reference tag, which enables us to move material to any +other place in the text. + + EXAMPLE FILES + + Two example files are provided so that the reader can see how +RELABEL works and experiment with it. The files have +memnonic labels, which RELABEL replaces with numbered labels. +RELEX3 has 3 levels of text units, RELEX2 has 2. (RELEX2 +will also produce 1 error message.) The files are almost the +same. If you produce a relabeled file with the labels written out +in full and the label tags left in, you can move items and +even entire text units to other places. If you then use RELABEL +again, the text units and items will be provided with appropriate +new labels. + + ERROR HANDLING + + If you make a mistake when typing the input file name or input +a letter when a number is expected or vice versa, RELABEL will +crash. On the Macintosh it may even cause a system crash and +output a message that a system file may have been damaged. In +fact, the disk drive is not activated on these occasions and +hence no disk file is affected. (If one compiles the Macintosh +version with THINK PASCAL or with METROWERKS PASCAL, the +resulting applications will not cause system crashes in these +circumstances but the THINK PASCAL 3.0 product takes about 3 times +longer to relabel our example files on the MAC+, and the +METROWERKS PASCAL v.1.3 product takes about 10 times as long.) + + If a label has a wrong format or RELABEL can not find a label +which is referred to, there will be an error message and you can +choose to exit RELABEL. (Relex2 has one reference to a +nonexistent label.) Try to complete the run. In the output file +the incorrect identifiers are replaced by ??? which should make +it easy to find the errors in the input file. + + It helps to avoid errors to put the reference tag into all +references, not just forward references. If you make a tagged +reference to a nonexistent label, e.g. because of a typing error, +RELABEL gives an error message. If the identifier is not tagged +as a reference but has the correct format, RELABEL will consider +it to be a new label and assign the next available number for +that kind of item. diff --git a/support/relabel/relabeli.pas b/support/relabel/relabeli.pas new file mode 100644 index 0000000000..7610da260f --- /dev/null +++ b/support/relabel/relabeli.pas @@ -0,0 +1,502 @@ +PROGRAM relabeli; {Relabel program for IBM-compatible computers, to +be compiled by Turbo Pascal. + Written by Peter Ungar, 914 723 7187, June 7th, 94, Mar. 5th, 95, +Mar. 31, 95} +{Change of Mar. 5, 1995: In case of a reference to a nonexistent label, +RELABEL is supposed to print out the nonexistent label. Before this +correction this failed to work in most cases. + Change of Mar. 31: Message asking for starting chapter number +and section number changed to disallow -1. RELABEL is programmed +to regard the character - as not part of a label. + Aslo, the message in case of a reference to a nonexistent label +was made clearer. } +{$N-} +LABEL 1,3,8,9; + +TYPE stringarray=array[1..6] of string[12]; + + (* LaTeX calls the identifier "label" when it occurs next to + the item, and "reference" elsewhere. I loosely follow this usage, + and use "identifier" for an occurrence of a string which + could be a label or a reference. In text written + for RELABEL, as in typeset books, labels and references + are not marked as such by the author. RELABEL regards the first + occurrence of an identifier as the label, unless it is marked as a + (forward) reference. + The program makes two passes over the text. The first + involves reading only. The program takes down each identifier at its + first occurrence which is not marked as a reference + and assigns to it the next + available serial number. These pairs of old and new labels are + stored in the labelentry file. Next, the text is read again and + written out to a new file, with each identifier changed to its new + value. + + Stringarrays will hold identifiers, including those parts of the + identifiers which are implicit, i.e. if we omit the identifier(s) + of the current text unit, RELABEL will put them in. + The entries of the stringarray are: + a) If SectionReset=TRUE (3-level mode): chapteri.d., section i.d., + subsection i.d. and the identifier of the object. + If the item does not apply, e.g. if we are not in a subsection, + the corresponding entry is the empty string ''; + b) If SectionReset=FALSE, i.e. sections are numbered + consecutively, then chapter numbers are not needed in i.d.s and + the first entry of the string array is empty except in the + i.d. of a chapter. *) + + (* We use the following pointer construction to get around the fact + that Turbo Pascal allots a space of only 64K to + all regularly declared variables, but can utilize memory outside + that limited space for variables created by NEW statements. *) + + labelentry=RECORD oldlabel:stringarray; + newlabel:array[1..4] of integer; + secondpassoccurred:boolean; + END; + labelentryp=^labelentry; + sublistp=array[-1..2000] of labelentryp; + mainlistp=^sublistp; + + (* Oldlabel is a stringarray. The labels in the old text may + contain lowercase letters as well as digits. + Newlabel is represented by an array of integers, the + chapter number etc. This will be made into a string when there is + a reference to the label.*) + + VAR i,j,k,n,implicit,ImplAdj,SerialNo, + FirstChapter,FirstSection,LabelKind:integer; + (* ImplAdj (ImplicitAdjustment) is 0 if section numbers are reset + at the beginning of each chapter and 1 if they are not, and + hence chapter numbers are not needed in labels other than chapter + labels. + SerialNo will hold the serial number of the first occurrence + of a label in the array holding all labels of its kind. + FirstChapter, FirstSection are the numbers to be assigned to the + first chapter and the first section of the file. RELABEL asks an + input of this when the program starts, in case you want 0, 1 or + larger numbers if the file is from the middle of a manuscript. *) + totalcount, currentcount:array[0..9] of integer; + s,filename,outputfilename:string; + labelstring:string[51]; + sta,empty,current:stringarray; + + (* totalcount will say how many labels of the 9 kinds we have + so far. currentcount gives the counts of the 9 kinds since they + were last reset. + current contains the chapter, section + and subsection identifiers of the current text unit. *) + + mainlist:array[0..9] of mainlistp; + SectionReset,ForwardRef, LabeltagsInOutput, omit, + PeriodFollows, FirstChapterlabel, FirstSectionlabel: boolean; +(* Sectionreset: Each chapter starts with section 1.*) + + incoming, outgoing:text; + c,ans:char; + +FUNCTION min(i,j:integer):integer; +BEGIN + IF i0 DO BEGIN s:=s+chr(48+(a DIV d)); a:= a MOD d; d:=d DIV 10 END; + 9:END; + + FUNCTION labelsymbol(c:char):boolean; +(* TRUE if c is a symbol allowed in a label, i.e. a digit or + a lowercase letter. *) + VAR x:integer; + BEGIN x:=ord(c); + labelsymbol:=(((48<=x) AND (x<=57)) OR ((97<=x) AND (x<=122)) + OR ((65<=x) AND (x<=90))) + END; + + PROCEDURE ReadLabel(VAR star:stringarray; VAR c:char); + (* Reads the components of a label from the incoming stream and + puts its components into the stringarray star, including + the implicit items. If section numbers are not reset in each + chapter then the empty string is put in the chapter designator + location star[1] except in the case of chapter labels. *) + LABEL 2,5,9; + VAR i,implicit:integer; str:string[12]; + BEGIN + k:=0; star:=empty; PeriodFollows:=FALSE; + (* k will count the number of parts separated by .'s in the label. *) + 2: str:=''; + WHILE labelsymbol(c) DO BEGIN + str:=str+c; + read(incoming,c); + END; + k:=k+1; star[k+ImplAdj]:=str; + IF c='.' THEN BEGIN + (* Another part of the label is coming, or there is a . after + the label. *) + read(incoming,c); + IF labelsymbol(c) THEN GOTO 2 + ELSE PeriodFollows:=TRUE; + END; + (* Now we have all k items of the label in the stringarray star. + We want the program to work so that, if desired, the chapter, section + and subsection labels may be omitted and then they are understood to + refer to the current chapter, section or subsection. + We reconstruct the omitted parts of the label. We assemble it + in star and then if it is a new label we put it into the mainlist. + If the number of levels is 3 then the + components of star are: Chapter label, Section label, Subsection + label and item label. If any of these are missing or not applicable, + the corresponding label is ''. A subsection label is missing + if the section is not divided into subsections. A subsection + label is inapplicable if the label is a chapter or section label. + If the number of levels is 2 + then a label of anything except a chapter is complete without the + chapter label, and star[1]:='' for all such items. + The label of a nonreset item should not contain chapter, section + or subsection identifiers. *) + IF (LabelKind > 1) AND ((k+ImplAdj) > min(LabelKind,4)) THEN BEGIN + writeln('Found a label with too many parts. If you have 2 levels'); + writeln('section numbers then nonchapter labels should not contain'); + writeln('a chapter identifier.'); + GOTO 5; + END; + IF ((LabelKind=0) AND (k>1)) THEN BEGIN + writeln(' An at-large item label with more than one part. '); +5: write('LabelKind= '); write(LabelKind,' '); + FOR i:=1+ImplAdj TO k+ImplAdj-1 DO write(sta[i],'.'); + writeln(sta[k+ImplAdj]); + write(' Continue? y or n '); readln(ans); + IF ans='n' THEN BEGIN close(incoming); halt END; + END; (* of error handling. *) + IF LabelKind=0 THEN BEGIN + star[4]:=star[1+implAdj]; star[1+ImplAdj]:=''; + END; + IF LabelKind=1 THEN BEGIN + star[1]:=star[1+ImplAdj]; star[2]:='';GOTO 9 END; + IF (2<=LabelKind) AND (LabelKind<=3) THEN BEGIN + implicit:=LabelKind-k-ImplAdj; + IF implicit>0 THEN BEGIN + FOR i:=LabelKind DOWNTO implicit+1 DO star[i]:=star[i-implicit]; + FOR i:=1+ImplAdj TO implicit+ImplAdj DO star[i]:=current[i]; + END; + END; + IF (labelkind >= 4) THEN BEGIN + IF k+ImplAdj<4 THEN BEGIN + star[4]:=star[k+ImplAdj]; star[k+ImplAdj]:='' END; + IF k=1 THEN FOR i:=1+ImplAdj to 3 DO star[i]:=current[i]; + (*This must be a label of an item in the current text unit.*) + END; +9:END; (* of procedure readlabel. Note that c is the first symbol after + the label at this stage, or the first symbol after the period + if there was a period immediately after the label. *) + + FUNCTION InList(st:StringArray;VAR SerialNo:integer):boolean; + (* TRUE if the label st is already in the mainlist. + This function is also used to compute the index SerialNo of + the label in the array of that LabelKind*) + LABEL 9; + VAR i:integer; bool:boolean; + BEGIN + IF totalcount[LabelKind] = 0 THEN InList:=FALSE + ELSE + FOR i:=totalcount[LabelKind] DOWNTO 1 DO + BEGIN + bool:=TRUE; + WITH mainlist[LabelKind]^[i]^ DO + FOR j:=1 TO 4 DO bool:=bool AND (oldlabel[j]=st[j]); + IF bool THEN BEGIN + InList:=TRUE; + SerialNo:=i; + (* mainlist[LabelKind]^[SerialNo] is the record where this + label and the new label which is to replace it can be found.*) + GOTO 9 END; + END; + InList:=FALSE; (* The label is not in mainlist. *) +9:END; + + + PROCEDURE AddToList(sta:stringarray); +(* We have a new label which is not a forward reference. Add it to mainlist*) + VAR i:integer; + BEGIN + totalcount[LabelKind]:=totalcount[LabelKind]+1; + currentcount[LabelKind]:=currentcount[LabelKind]+1; + (* If the new label is a chapter, section or subsection label then + the counts of subordinate items have to be reset.*) + IF (0=2 THEN + FOR i:=1+ImplAdj TO min(3,LabelKind) DO newlabel[i]:=currentcount[i]; + IF LabelKind>=4 THEN newlabel[4]:=currentcount[labelkind]; + (* Newlabel[1] is 0 if sections are numbered + consecutively and chapter numbers occur only in chapter labels.*) + SecondPassOccurred:=FALSE; + END; (* of preparing new mainlist entry *) + END; (* of processing the new label *) + + PROCEDURE MakeNewLabelstring(VAR newlabelstring:string; + labelkind,SerialNo:integer); + LABEL 9; + VAR j:integer;s:string; + InUnitRef:boolean; + BEGIN + WITH mainlist[LabelKind]^[SerialNo]^ DO + BEGIN + newlabelstring:=''; + IF LabelKind=0 THEN + BEGIN IntToStr(newlabel[4],newlabelstring); + GOTO 9 END; (* Of LabelKind=0 (at-large item label) case *) + + IF LabelKind=1 THEN + BEGIN IntToStr(newlabel[1],newlabelstring); + GOTO 9 END; (* Of LabelKind=1 (i.e. chapterlabel) case *) + + IF omit AND (LabelKind>3) THEN BEGIN + (* Find whether the reference is to the current unit of the text.*) + InUnitRef:=TRUE; + FOR j:=1+ImplAdj TO 3 DO + InUnitRef:=InUnitRef AND (newlabel[j]=currentcount[j]); + IF InUnitRef THEN BEGIN + IntToStr(newlabel[4],newlabelstring); GOTO 9 END; + END; (* Of making label without chapter,section and subsection + number. Note we exit to 9 only if such a label has been made. *) + FOR j:=1+ImplAdj TO min(LabelKind,4) DO + IF OldLabel[j]<>'' THEN BEGIN + IntToStr(newlabel[j],s); + IF newlabelstring='' THEN newlabelstring:=s + ELSE newlabelstring:=newlabelstring+'.'+s; + END; + END; (* of WITH statement *) +9:END; + + FUNCTION LabelTag(LabelKind:integer):char; (* For error message.*) + BEGIN + CASE LabelKind OF + 0: LabelTag:= chr(220); (* at-large item *) + 1: LabelTag:= chr(227); (* chapter *) + 2: LabelTag:= chr(228); (* section *) + 3: LabelTag:= chr(229); (* subsection *) + 4: LabelTag:= chr(221); (* figure *) + 5: LabelTag:= chr(222); (* formula *) + 6: LabelTag:= chr(223); (* problem *) + 7: LabelTag:= chr(224); (* definition *) + 8: LabelTag:= chr(225); (* theorem *) + 9: LabelTag:= chr(226); (* lemma *) + END; + END; + + (* Main program begins here.*) +BEGIN +1: FOR i:=1 TO 4 DO empty[i]:=''; current:=empty; + writeln('File to be renumbered. If it is not in the same directory as'); + writeln('RELABEL, then give path name.'); + readln(filename); + writeln(' Name of relabeled file: '); + readln(OutputFileName); + writeln('Is the labeling based on 3 levels (Chapter, Section, Subsection'); + writeln('or 2 levels (Section, Subsection)? (Input 3 or 2)'); + readln(i); SectionReset:=(i=3); ImplAdj:=3-i; + (*ImplAdj (Implicit Adjustment) = 1 if chapter numbers are superfluous + in labels, 0 otherwise.*) + writeln('Do you want the chapter, section and subsection numbers in'); + writeln('the new file if they are all the current ones (y or n)'); + writeln('(Chapter numbers are included only in 3-level mode.)'); + readln(ans); omit:=ans='n'; + writeln('Do you want the label tags to remain in the output?'); + readln(ans); LabeltagsInOutput:=ans='y'; + FOR i:=0 TO 9 DO currentcount[i]:=0; + TotalCount:=CurrentCount; + writeln('Input the starting number >= 0 you want for chapters'); + readln(FirstChapter); + currentcount[1]:=FirstChapter-1; FirstChapterlabel:=TRUE; + writeln('Input the number >= 0 you want for the first section'); + readln(FirstSection); + currentcount[2]:=FirstSection-1; FirstSectionlabel:=TRUE; + writeln('I will beep when ready'); + (* Next create the arrays for storing the various types of labels. *) + + FOR i:=0 TO 9 DO new(mainlist[i]); + + Assign(incoming,filename); + Reset(incoming); + read(incoming, c); + WHILE eof(incoming)=FALSE DO + BEGIN + IF ord(c) > 128 THEN BEGIN + CASE c OF (* cases of Macintosh labels *) + '': LabelKind:=0; + '': LabelKind:=1; + '': LabelKind:=2; + '': LabelKind:=3; + '': LabelKind:=4; + '': LabelKind:=5; + '': LabelKind:=6; + '': LabelKind:=7; + '': LabelKind:=8; + '': LabelKind:=9; + ELSE (* In case the file comes from MS-DOS user of RELABEL *) + IF ((227 <= ord(c)) AND (ord(c)<= 229)) + THEN LabelKind:= ord(c)-226 + ELSE IF ((221 <= ord(c)) AND (ord(c)<= 226)) + THEN LabelKind:= ord(c)-217 + ELSE IF ord(c)=220 THEN LabelKind:=0 + ELSE GOTO 8; (* c is not a label tag *) + END; + read(incoming, c); + IF ((ord(c) = 196) OR (ord(c)=222)) THEN GOTO 8 + ELSE readlabel(sta,c); + + (* Do readlabel and the work below only if this is not + labeled to be a reference. + Next, we check if this is a repeat occurrence of a label. + If not, enter in the list of labels and increase the count + of labels of the kind we found.*) + + IF NOT InList(sta,SerialNo) THEN AddToList(sta); + END; (* of processing a label *) + 8:read(incoming,c) + END; (* of WHILE loop which reads characters of the file *) + + writeln('First pass completed. I am starting to write the new file.'); + + Reset(incoming); + + Assign(outgoing, outputfilename); + Rewrite(outgoing); + + current:=empty; + FOR i:=0 TO 9 DO currentcount[i]:=0; + currentcount[1]:=FirstChapter-1; + currentcount[2]:=FirstSection-1; + + (* We need to redo current to be able to restore the implicit + parts of the labels as we encounter them on the second pass. *) + +3:read(incoming,c); + WHILE eof(incoming)=FALSE DO + BEGIN + IF ord(c) >=128 THEN BEGIN (* A label may begin here. *) + CASE c OF +(* If we have a labelkind indicator used with Macintosh, convert it. *) + '': c:=chr(220); + '': c:=chr(227); + '': c:=chr(228); + '': c:=chr(229); + '': c:=chr(225); + '': c:=chr(226); + '': c:=chr(224); + '': c:=chr(222); + '': c:=chr(221); + '': c:=chr(223); + END; (* Of replacing Macintosh labels. *) + ForwardRef:=FALSE; + LabelKind:=ord(c)-220; + IF ((labelkind < 0) OR (LabelKind > 9)) THEN BEGIN + (*The symbol is not a labelkind indicator. Write & exit.*) + write(outgoing,c); GOTO 3 + END + ELSE IF LabelKind > 6 THEN LabelKind:=LabelKind-6 + ELSE IF LabelKind>0 THEN LabelKind:= LabelKind+3; + (* End of determining LabelKind *) + IF LabeltagsInOutput THEN write(outgoing,c); + read(incoming,c); + IF c=chr(196) THEN c:=chr(222); {Translate Macintosh forward ref. ind.} + IF c=chr(222) THEN BEGIN + ForwardRef:=TRUE; + IF LabeltagsInOutput THEN write(outgoing,c); + read(incoming,c) + END; + readlabel(sta,c); + IF NOT(InList(sta,SerialNo)) THEN BEGIN + writeln('Label not found in list on second pass.'); + writeln('You may have referred to a nonexistent label'); + writeln('or the level number you entered may be wrong.'); + write('LabelKind: ', LabelKind,' Label: '); + FOR i:=1+ImplAdj TO min(LabelKind-1, 3) DO + IF sta[i] <> '' THEN write(sta[i],'.'); + IF ((LabelKind = 0) OR (LabelKind > 3)) THEN writeln(sta[4]) + ELSE writeln(sta[LabelKind]); + write('Should I go on, with "???" in this reference? y or n '); + readln(ans); + IF ans='n' THEN BEGIN close(incoming);close(outgoing);halt END; + write(outgoing,'???'); GOTO 9; + END; (* Of message and output, we had a reference to unknown label.*) + IF NOT ForwardRef THEN BEGIN + WITH mainlist[labelkind]^[SerialNo]^ DO BEGIN + IF (NOT secondpassoccurred)THEN BEGIN +(* Should be here? currentcount[labelkind]:=currentcount[labelkind]+1; *) + IF (0FirstChapter) + OR (currentcount[2]>FirstSection) THEN BEGIN + FOR i:=max(labelkind+1,ImplAdj+2) TO 3 DO BEGIN + current[i]:=''; currentcount[i]:=0; + END; + END; + END; (* Of dealing with the label of a new heading. *) + secondpassoccurred:=TRUE; + END + ELSE IF LabeltagsInOutput THEN write(outgoing,''); + (* We have a reference.*) + END; (* Of WITH mainlist...*) + END; (* Of NOT ForwardRef *) + (* Now we are ready to get the new label and convert it to a + string. This can not be done once for all since the string + may be shorter in a reference to the item from within + the same subunit. Doing the job from scratch each time just + because we may need one or the other of two expressions + is admittedly inelegant but seldom are there many references + to one item. *) + MakeNewLabelstring(s,LabelKind, SerialNo); + write(outgoing,s); +9: IF PeriodFollows THEN write(outgoing,'.'); + END (* of assembling and writing the new label. *) + ELSE BEGIN (* ord(c)<128, certainly not a labelkind symbol*) + write(outgoing,c); + read(incoming,c); + END; (* of IF ord(c)>=128..ELSE statement. *) + END; (* Return to the beginning of the WHILE eof(incoming)=FALSE cycle *) + write(outgoing,c); (* write the last symbol of the file *) + close(outgoing);close(incoming); + writeln(chr(7),'"',outputfilename,'"', 'written on disk.'); + FOR i:=0 TO 9 DO dispose(mainlist[i]); + write('Relabel another file? (y or n)'); + readln(c); IF c='y' THEN GOTO 1; + END. diff --git a/support/relabel/relabelmac.hqx b/support/relabel/relabelmac.hqx new file mode 100644 index 0000000000..9e8aea7ff2 --- /dev/null +++ b/support/relabel/relabelmac.hqx @@ -0,0 +1,261 @@ +(This file must be converted with BinHex 4.0) +:"e*&6%0`!39"36$q3"!#3#$#mCp`!N!3"!*!$-(i!!#pq!*!$2M8!N!403Ir +r*!"P3!#3"!(JrrmN!'9,!*!%(&Ir"e*&6%0`#!*!$39"36$q3"!%!rj!%!*! +%'q-!!%&38%`rN!3"!2q3"!#3%UYr`pm!N!B`[!#3!dTQrrmN!'a4!*!%(Plrrb3 +!E&`!N!3GK2rr*!"XC`#3"'cjrrmN!'ab!*!%8,,rrb3!EDX!N!4i22rr*!"Zj!# +3"$ArN!-N!(%T!*!%B9Irrb3!F63!N!3Z5[rr*!"dK3#3"%+@rrmN!(53!!#3"'C +8rrmN!(3!N!-B!*!$+!!!"[i!N!-)!*!$)#p)2c`!!DR`!!![AJ#3!`%J3b3!5%, +%`5B"5%2'`04$5%+3!m$"d))Q#%je)%-L4(J!5S"U"%5!H2p+J@S%4)&'4#3"NS& +f)01"NS*N!Y+#dB"4brrd4S"+4'F#4)")4%T%C`*%J5B)+!P1G@'q)!&1G5![!!3 +L!''@,d!!"%je)&p)E`!%,bm!"$mm+!kTke#26Y"9MdKA2c`!&kRV)'m!"JL3!!! +(9ZG)HJ"',`Jr2!!!UHY+(fF3#0!!"f!+9Bp)9cmm!"HTkcmmB!")9cmm!!'Tke5 +2,bm!"NK[!!Sr2#J3UHY)9cmm!"QTke526R8rrS!!N!FL(b*I)&m[!A!!%"$L5$, +B8FMrr%je)Km`(b*I)&m[!4,!B!)5f&()rra1G5)I-"mJAb*I,`'`%@-#%"&5L4$ +!B!)3f9()rra1G5)I)PmJAbm"%"J5'43!Y!&M!K3"!N)!rfF+8d+c#&E+rraQ!V) +!6R8L(b*I)&m[!A!!FJ!3'")4d4&N"P$4%!&'!%2a%!&J!K,B8FMrr%je*"m`(c) +I)&mLAbm#G!!8%%T"EJ*b!E*#EKc3`C4"8N*+3'm5X%*[!M!#%X"63",B8FMrr%j +e3K&1G8MR%$"-l`-!!""`!()!G!%3''FJ%KPR(T!!3@8B8d%f!54)*NQe#eE,rra +R#P*#8SK4b2rXG!!r3J!@60m-##"IA)p1d%j@rJ")E[m!,bi!$$mm!!%r,J!)8eG +K!2pU,bi!%%KZr`"K!2mf5'lq!#mZ!!`r,J!)2c`!rf%!rdT)E[i!5'lr!'%!raC +)E[m!,bi!$$mZ!!TK!2l!6PiJAdr[!!a1d%j@rJ")E[m!,bi!$$mm!!%r,J!+8eG +K!2m+5'lq!#mZ!!``,J!+d'i!#$m!2c`!rf%!r[")E[i!5'lr!'%!rVa)E[m!,bi +!$$mm!2pK!2jQ6PiJAe#26Y!N(c!I-KmLAb"I,`*d)*4!P%&J!N)C8FMrr'!#%YK +4bIrmB!*#'9(+rra1G5"I)Pp#Q8+C3TP#Q8+C3TP#Q8+C6Y!JAc!I)Ppb!")!jNN +"m4!!6Y!JAc)I-"mLAj)!C4Td!"3!jNV5`J#3!rJ"d9)!CJ45LA$i8`&NmNl3*"m +`(c)I)&mLAbm#dX"J!K$C8FRrr%je)"mLAb"I,`"`"l1)9XMrr%je)"mLAb"IB!B +J(b"I)Pm[!(!()KL#NE+C9XMrq%je)"mLAb"I,`"`"b)BJT%L`9()rrK1G5!I)Pm +JAbm!F!FL'%D"`T%L`9()rrC1G5!I)PmJAbm!F!FL'-+4)X&4b2ri6R8JAb*I-"m +-3!%!C!Sb!1C*!6%3!%l3F!"1d(!!)Km`(b*IS4iLL#""6Y!LAb"I)&#J(dl4)$J +"-*!!Z!%8)(J#UY#S!!`J9bk!6Y!JH!%`)RJ"&#!)N!#*FJb`J@85)S!JJ5()!43 +LH!+U)SM4U3!-)$J$'U"-)&FZJ%l3)Km`(b*I)&pJ!K,B8FMrr#""6Y!L(c!I)Pm +JAp$!dX"J!K-J8FMrr#""6Y!LAc)I-"mJAf!#%-&4b2rm6Y%LAb"I-Km`(fF-8d! +d!,)B9mVrr*!!3Mm!6Y%LAb"I-Km`(fF-8d!d!,)B9XVrr*!!3Mm!6Y%aqJ!U#NT +"qJ!Q)FJ+6!Ji!!B#MQB85(J+6$mm!!@TkdKk!!Sr2!!"UHY1G3!0,bi!"$!m!FQ +K4R!36Y!JAl"BE4D`@'i36Y!JAl#BE3L`Q'i#6Y"CL&@)9BJ[#$!m!FQK4R!&6Y" ++J'`'4)!3r!!Y3rS!)()*X*P8bIrm@BNL'@F1G#p5!T!!J@6kd)%3`Q$Z6R8lQXS +!"IAK!!#BPS!!$d*!!!''S!!!*a!!!!2S!*!$C!#3!`S!N!-"!*!%F!"b!(3!$"! +!+fF)$"!!,@B%G!&5L")3"!%!1JB"!!TN'!b!$-c-c@3DiiJ[!1@)d*r3J@X18SK +Jh%S#C`4%J%T!6R9%r!!"6R919[rL5N"X!R!!$%!!5'm#F%Jp32rN(8(riNKZrq) +[#8KZrqBr2!!,UHX-,J!rrqYQ#Lem!*!$%rrLB0j$l[rU$&%"-'B%3Qlrk(!!%"P +#-3!!8d$4E[rS5LlrjQF'%2`!,@!+5LlriQB%%2`!)!`4!%jQ9"$m!%i3r!""%2` +!6K$m!#J3,[rZB4ib!1P*%#lrlf%8d%&bC'%JFJTK('%H%2`!+8lk!*3%!!!`$!! +!#Qd#A`!#3!!26R9)`)(""J!!-"$!5%"1G3`4!%PQ$K$m!%N3r!"1%2`!4Q"H5Ll +riQBUB9S`,[rN98"Y#K$m!#jK6&()rr`3r!"P-#lrk%M!E333r!!VB3$q9Q!Z-#l +rj$)ZrqKX"K$m!$"J"Q%J8FRrr&0!E433r!!Z8N&X"K$m!$"J!Q%)8FMrmNjH6R8 +3f@B)8iN4I!!`rrp1G8j@rqC#E[rS3QlrjNS3Chi-%!!VC``-%!!YCJJGI!!"rqC +5L!`3!%jQ0P+)$"J!3@CF$"J!6QC@F!!-%!!SCJj5L'%!rLCP4J`B!#PQ3%S3CM` +L[(rr3!"+!'BLF"9J(J`3!%PQ-P+)$"J!6QBJ$"J!4QBD%""Q&L+mIrm!!"0!!!0 ++,[rQC``)d3!(B!BL[(rr3"&1qJ"dFJ"d!"!3"!!!1JB!!!TN*%T"CJ4+!'F5$%% +!%fF)8N%GN!!3kQ!%8Qlrk%S#Ca*6E[rSB!`-%!!ZCJT+!QDiG!&5L'$!(8(rkQB +'2A`"-2rU$"!!4@B-8SKK!2eiCCM4E[rS5K"QN!")E[rQ,`Nr2!!*UHX-8ArrC`B +-8IrrCJK#D3!%3UN!"NjH6R92lrq`)%mKE`"B!"*#D!!@3LJ!'L&[!&3!(+!,1d$ +rlNr[!&!JAe#26Y"2lrq`)%mKE`"8!"*#D!!@3LJ!'U!*1d$rlNr[!&!ZRdje)"m +L(b*I,`"`#G!4S4i[##$YrqSJ`A!!%"%3f9()rr`VArrU6R8JAcmYrqj#EIrZ6Y" ++EIrZCJ*1G6!m!FQK4R"M6Y"2lrq`,dJ!%L"23QJ!&N)S!"T++3!"CaUJ#'F)$%$ +rd'F3B#a#D!!FS!a)k!!'!##J$8)S!"Y#U!!FS!"Q%N+S!"+J&$0S!"J!!M0S!"B +!"$Y!rqj2l`"36R92lrq`)%maD3!#!"JaI!!"!#a#U!!ZS%4Q$%ST!!&R"N+S!"b +J%MY!rqj2l`"36R92lrq`)%maD3!#!"LJ!@B-3UJ!%M&T!!3!&U!61d$rlNr[!&" +1G8TT!!"Q#MYmrpVrlN6m!!&1G8ST!!"Q#MYmri$rlN6m!!&1G8ST!!&Q#MYmrhr +rlN6m!!&1G63m!3"J"$3m!!%LE`!+5Um!"QGS)%N``N+B-1m!"%+B3TK#Q#"YrqS +J#'FQ,`J[#9#))Qm!$R!!%"K)3"!CS$`LAb"IC`3J8'$H)fJ!"!!3B")L,Irm*#h +rq#"[!!CK!2kkCK*`!$!T!!DK(L0)!!`l32rZCb"#D3!!B$KK!2p-C6*++3!"C`S +cD3!)!!T1ZJ0+-d)!!%*T!!K#D3!+5LN!!@F'-fN!"J!+5QN!!QF%B3$q`L"I6qm +!#Nl3)Qm!"%TT!!"R)%ST!!&R#M0T!!J!#Nkk!`BJD3!-S"p+D3!#C`4K!2l!3QN +!!#kI6R8b+3!)XQN!#QB-6VS#i%TT!!TR%()!,`NLD3!-%$%3!#*I6R9%r!!"6R9 +d!'%!rX"P1Q(-C6B-!!!JBJC5D3!)B2"K['8Q$!!!)'-J8QN!#!a#!&"Rl&*#$!! +!B@8+$!!!HQ)%"!!!)"$!B0C#%%je)&mL9f%!rRKP%''%C3a5D3!)!N!!rcm!6Y" +#Cdl36PErVN(ZrkiLEJ!)BBj"l[qZ6VVk3Q8%5K"R#$YmrhlrlR!!6PiJ9bk!6Y" +19[qZ3HlrVL*Z!!aK!2pL3HlrVL*Z!!K1Z[ZQ$*&rrd!4CJBlI2pqrqj1ALkI6R8 +LE`!))'m!"(3!B3$pq'8HB3$r"'8B$!!!$@F58QN!#!a#!2pRkP*#%B!J!'$L%)) +ZRdje)Qm!"'%!rFTP%'%!rYCP#P*T!!J-!!!0C["1G6)T!!J[#5*T!!`6J"!!)Pp +5360"!!LbD3!+C`!"PNjeF!!3''%!rD"P)$m!P%"[#P0#F#"KbP(+rrSd(f!%%"K +K[P(+rrT1qJ&U6R8JAc3I-"mL9f%!rA"P&P9#E3`r!(!JBCa4b[rk-"pKP%kk!84 +1d%j@rr3J,J!+3Hlrp%kkq0)J#%(Zrr53!)JLEJ!10#i!#''3!%jH)&pFMdl36PE +rVN(ZrkiLEJ!-5Qi!#'`i-#i!#Ja!!!TX!R!+$%!!8'm#F&!p3!!+88"b!%kkq5J +J#%(Zrkk3!)L`EJ!+E"`4[!!J!!"53'$`-#i!#()"6VVj"L!)3HlrVT!!L#*Z!"! +d,J!+B3$r)NjH)&p3Mdl3)Qm!#L"[!!Bd,`!%B3$r"L"IA)p1d#*[!!Jd,`!%3IS +!&NS[!!CQ"%(k!"*K!2lQ)&pBMdl3"&45988J"8C"6&0&)&mLAh!-B!BJAb*AF!e +K!2aSC3KK!2kF6VS!5Nl3G!"J#R3"B!Cd!Q!#G!-JAb*I5LN!!'FNB3$p3'8H#!) +!!'F'$!!!$@F5#!)!!@F5$!!!)')-8QN!#'$F(c`!!8l33LG1d%TT!!*Q'%MR)-" +#Cbm*)'N!%%k3!$YIrqj-h`-%6R8b+3!)XQN!#QC5)JK2lrq`)%maD3!#!"JKD3! +-!#"#D!!N3QJ!,%ST!!"Q#M&T!!J!*U!$B"JaD3!'!#DJ!QF)$%$rf@B#F!!cD!! +U!!T#D3!)6qm!8#""1d$rlNje0$`"!'!%0$`!!5*[!!T+V`!'CbJJ56$#3TJ`l`! +%3TK#Q%+B)Lhrp#3Yrr!JE`!'B3$kNQF33QN!!'!1B3$l0Q8)-d)!!'%!qYBJAdr +[!!T1d#*[!!4+D3!!C`KK!2V`3QN!!#kI6R9`!'!#F!%LE`!)B3$l!'8f6qrrX#" +2-@N!!J!B)@m!9!!J3QJ!*$&T!!B!*N*S!#a+!'B'S!*R#Q!%S!0R"$Y!rqj2l`" +3,Tp1G5*[!!KK!2UmC5`J,`!%-LN!"Nkk!*!!6qrrX#"2-@N!!J!B-A`!!3!X)8! +!,U"%1d$rlNr[!&!JAe#26Y!LE`!%B6Jb+3!'6VS!E#p!!!41G5*[!!4K*#!"-LN +!"Nkk!&B[3!!%6R8LE`!%B3k`J9I!4!!JAeL2(`"1d'%!qNCP(Nr[rl!J6c&T!!) +!'+!BS"%J+!!F)LJ!,Nr[!&"1GA!!FJ"1G53!5%,%`8K#N!2!`G##6R8J3h3!GL$ +93T4"C!,83G'!8F[rp#B)4S"1G3#3"%j@!!!VI&4&@&6rr#Ym9&""8rri+ha#58j +"rr3VI&43392rm%*Yrqj#VIrU6Pj1G8KYrlkSEUMq)$`!!2rrS$+T%UN`5(S!8+P +lUFbS8%+R3UG)HJ"%5(J*%&$R2c`!"%Kirrp#*d+RU4-V9rl+U(-[22rmrrLSH$m +m!!5SKcmm!!QSLN*RU)0#VIl13LhqhN+YrZ"1GDRd!#i!#!&,!IJJ2!!!rpHJ-N) +R2c`!+%KYrZ5TFA!"`"mI3!!%6R9#*f(H5KpQ%UK@6VS"i%)RBG"+(fId6VS"lN) +R2c`!+%KYrZ5TF%SIF!!3,IlT##d!#2lbCaS-3!!ZCJ4`!'!3$%!!3'd+$%!!Ifi +%!N!!(cp!!!41G8+YrYBVI!%6!H$qfNKYrYDSSd+YrXj1G8kk!5i'E3!,rYSlI!( +JrYa)EIl@U+01G6!YrXjb#dlk!5i`,Il1F[91qJ%N)&mb(c!I8d"Y'!a!!&"X%P0 +"E3i-33!CE!Jl32l31d(qcNl32fhqd!!%6R8rEIl1!!41G8(YrYm3J(!"51FB-#4 +)0J!i,Il3*NT63f9B$")!)'888ST54!a%!&"Yl%kk!&"1ZJ##B0a1ZJ"'%"S-!!! +(CJJr2!!#UFKJb!`!!!KQ$&0YrY"X[%*YrY"JYJa!!!eQ"Nkk!&"JUJa!!!aQT'% +!raTJRNkk!!K-h``B6R8S#TL,Cbj1ZJ"-"Qd!#rlDF!E"a0&YrYa)EIl@U+-[,Il +@"PF!#DL6,`Y#Ccm%U)ACEIl36R9#EIl38QhqcJaY!"RqcQd-8fhqcR!!F[91qJ! +L6R8`,Il1`I`!#c)YrY$$r!!'5+d!!rl@+fhqe[lD6R8[!cB"`I`!#cY!rYC#EIl +B+h`"%`(JrYT#TkMB5'hqeN*R2`-[,`!)U1qSf5BI6R8J1!&UX+hqi'81)$J"DY# +i![3V32lJB4"1G8SYrYjR!Q%'3Uhqi%jeBBJ'E3!*rYB'E3!,rYTFEIlF5'hqeUL +N4LhqhNje)PmJAbm*5LJ!!'B@5MJ"FQVk-#J!#%*S!!JJD!!-B!$qK%MR'#!N5(B +!5LS!!'YX3QGK!2fD-"pR6RJ!$%!!#'F`H2m-3!!BCbJ-3!!ECb)-3!!0CcJ-3!! +JEG3JDJ!-%B!`!'%!rMC53lCU!!CQ`'!U5N0RZN(k!$*`!f%!rLC63e(-rqjJU&$ +U!!"J$L"U!!`4J$!!B3$q"&*$08-!#N*U!!K-h`3B6R8))!J!N!919J!!6VVmL%K +k!#j)H[p!6VVe5%KYrpC)HJ!S2c`!J%kkpQ*)EIr#5(S!)Mmm!)"1Z[CB6Pj1G3K +$EfjcEfaP1J!)3fpZFfpXC6S!#%0[ER0[E'8k!*!&6PB!!$!Z!!U`EJ!)E!!!$$e +Z!!S!$'!!!!JpEJ!)!!a1ALkI6R8!N!419J!!-#i!#V"Z!!KX!!!-2@i!#!!-B!! +!#$eZ!!S!$%jH,Tp1G3#3"%j@rIj)HJ$S,bi!#$mm!2p1ZZe!5Qi!$'`!!"a)HJ$ +5,bi!#$mm!2p1ZZdS-#i!$%4!28!!$%TZ!!aQ!!!@5(S!XLmZ!!Jr2!$r6VVY"Q! +!!*BpI#F3rri`,J!-5-#"l[rq5N"Q!!!8-#lrrNM!JI`!#Me!rrjJ!2rJ5QlrrQm +!!'B`,J!-5-#"l[rq"N!!-!*!!2m!3!%!28$qrLmZ!!K)E[hq6VVXJ%KZr[j)E[h +q6VVXjNKZrIi[,J!)2c`!rdkkl*!!-#i!$%M!JHlrrNK!28!!$$!Zrrj)`)(m!!S +p32rqB!$rPNjH)&pFMdl3!!!",3%`!*!%6PErrMeZ!!MrrJaZ!$$rrPc!4!!-EJ! +jrrjI`83"`!%-EJ"KrrjF`83"$'i!H[rqAm*%!X)#J!%-EJ""rrjF`83"$'i!@[r +qAm*%!X)#J!%G3!!+6PiJAe526Y"19[hZ51FB!%*YrX4"lIQb)Qi!$(!8)YK4b2r +m3Lhj-8Kk"'j)E[rZ2c`!$%kkkp"9Mb"Z!!Jr%%kkrfT+(fF!!&3JEJ!)-"!#3!$ +r!%!"!$e!rZj)E[rZ5'lplNkkkh4)E[lZ5'lplNkkkpT)E[hZ5'lrlMmm!!a1ZZZ +%5'hj'Nkkp9iLEJ!)-TpBMdkkm[aJ!2qH-#hqa&*!1d$qa$!YrX63EIkq`I`!$NK +ZrqiJEJ!-5(!!mMmm!!a1ZZY#)'i!#!a3!#jQ!!!f5'hj'Nkkp4!LEJ!)-TpBMdk +kmUj9Mb"Z!!Jr%%kkrVa+(fF!!!TJ!2mZB!!!#"Ym!!(j-3aY!!(qYPl!4!!b,Il +%dQhq[P@22bhqYMmm!!3Q!#J"6VVp1,KIAX"%!-B!C`!!0NKYrm*)HJ0H3QG1Z[C +m6VVf`PL26VVb4NKYrm*)HJ1!3QG1Z[CN6VVfUPL26VVb,Q!!!$*+EIkf9m"%!!a +Y!!(qa&l"4!(!!@F!!3C)EIr#5(S$KN*R6VVf-%kkpRCBMdkkmIT)EIr#5(S$S%* +R6VVf'$!YrVC)`#m!3QG1Z[9`5(S$P%*R6VVf!&L26VVacLm(-#hq[P*!-Lhqa0* +YrVj636i"RN"Y!!!i28$rrM!Zrrl"r!!15'hr`N(YqIK)F!!!3QG1Z[A#2c`!,N* +R6VVdq&L26VVaKP*Zrrj4crr3,Km`,Il%d'hq[X(m!!j)EIr#3Hhjq%K`!!"#Cdk +kpBT1Z[A3@)p1Z[&85'hr`NKk!a"#CdkkpA*1Z[@i@)p1Z[%m5'hreNkkmiSlArN +#6VVd-&L26VVa*JaY!'lj!QB!!"")EIND6VVbb%kkm4#Tp%TYrVCQ!!"#-#hq[P* +!`I`!$L"Z!!a)F!$b)'i!$%KS!#Sr2!!-6VVT@$!YrVj53-(m!!j)HJ+X)'i!$%K +`!2)r2!!-6VVT1JaY!!(qYQB!!$J`,Ikq8N$"r!!1)'i!$%K`!2)[,J!-2c`!$%k +kk4*)HJ*b)'i!$%KS!!ir2!!-6VVSrQ!!!B!-E3!#rVCF`%3!$'d!!rkfAm&%!F! +"C`!!Z$!YrVD3!'hqa*!!EIkq28$rr%TZrra[!!#J,`F`,[rm8N!b,Ikf2J#H3@i +!!$`p3Irq4%F`,[rq`I`!$M)Zrrk5E[rm`r`!$L"Z!!a)F"$b)'i!$%K`!2)r2!! +-6VVSJP0Zrrj4crr1,Km["c!YrVj53$)Zrrc5EIkq2J'H3'd!!$Bp32rq-#lrrX( +m!!ib,[rq`r`!$N(Yq9")F"!!)'i!$%K`!2)r2!!-6VVS0&*Zrrj4crr5,Km-E3! +%rVCY!!#Q-#hqa0"YrVi-3!!%E!!!4M!YrX63EIkq`I`!$L"Z!!a)F!$b)'i!$%K +S!#Sr2!!-6VVRl$!YrX63EIkq`I`!$NKk!8)JEJ!-5(!!mMmm!!a1ZZI-$'d!!Il +%CJ!!5#m(-#hq[P*!IJ1H3'd!!$Bp32rq-#lrrX(m!!ib,[rq`r`!$N(Yq9")F"! +!)'i!$%K`!2)r2!!-6VVRKP*Zrrj4crr5,Kp-h`!B6PiJAe#26Y!!!$K'Eh9ZC#" +K)'aKBQ9X)(GTG'JJG'p[)'eKERNJF'&bG(-Z)%PQ)(P[G5"SBACP)$)JE'9fC@a +c,!!jEfjXH5"K)'0SBA"dCA)JE'&LC@`JFfK[G@aN)'0[ER4KD@iJB5"MD'&`G'9 +b)'PNC@jdD@CTCA)Z-5""EL"KG#eXBA*RC5"TG'9Y)'aKBQ9X)(GTG'JJE@pbC5" +dD'&Z)'pZC5"`BA*d1L!,6'&LC@a,D@jN1L!*)#"-B@*PE$SJ%80[ER4TER9P2b" +j)'pb)'iJ!*!'6PErU%MR!#!JEJ!-3qlrV(!8)YK4b2rm-#hqYZ0)3HhqSNT`!!" +Q!!!+3Li!%'!!!+`["c!YrVEM5%(YrU)b-!!!IJ'H3@i!!*)p3IqU4%FGI!!"rkN +`,Ikfj8Jb,[qUj8P&lINf*()!!#4b%!3["h!"IJ5H3'd!!$il32l'-#hqaX(m!!i +b,Il'`r`!$N(Zrjj)F"!!3HVrmNK`!!"1ZZB@9m"%!-!ZrkNG32qT8QhqaP(2rmS +Z(dSZrkPR!!!8(A`!!3!3)Qi!#$+ZrkTJ!!!88flrUP(2rhJZ(d)Z!""J!!!),Kp +J!2ri60m%!%jH)&p3Mdl36PErUNMR%#!JEJ!)3qlrV(!8)YK4b2rm-#hqYZ0)-Lh +qYZ0*3HhqSM3`%!"53N2YrU)cJJ!!-#hqYZ0)-LhqYZ0*3HhqMM3`%!"53N2YrSi +cJJ!!5QhqYPl!4!!-E3!$rVCI`83"`!&R!!#m-#hqYX(m!!ib,Ikf`r`!$N(Zrjj +)F"!!3Hhj8%K`!!!r2!!-6VVP%#m(9Bm`,Ikf8N!r!$!YrVj83$m!6VVhI$!IIJQ +H3'd!!$Jp32qU-#lrUZ0)3HhqMN*`!!!`,[qU`I`!$NKk!@j"lIP35(!!!$mm!!a +1ZZ6!8QlrUP(2rp!Z(`aY!!(qYPI!4!$!,IN`C`!!$$YYrVVqN!"#,IN`$'d!![k +f9m"%!-!Yq5pR!!!-1fhqZ2k53Lhj,c!YrVEP5$)YrVEM58(YrU)d-"!!j8T"lIN +f)(!!!%K`)!3r2!"H6VVR'M!YrVEP5$)YrVEM58(YrU)d-"!!j8T&lINf*()!!#4 +b)!4"l[qX3p*`&#,B8FMrr#m(F!&q"*j!E3!!($e!rkS`,[qUidK"kJ"53R!!!&* +ZrkT4crrX,Kp+EIkfCJ!!#$9YrSi!@JaY!!(qYQB!!!JeEIk3!!"8$'d!![kfE3! +!5Lm(-#hq[P*!9Bmr2!!$2bhqYLB!6VVf&MiIRN0Y!!!S282rUM!ZrkVM5$)ZrkV +M58(YrSj$kJ"5-l!3!*!$8QlrUP(2rq!Z(`aY!!6qYQd!!")`,IkfidK"lIk10A! +!N!0D3LS!A%cI"!K1ALkI6R8!!%j@rIa)ja!J-#i!#Z9)-Li!#19*4Hhj0L4b!!! +NFK!%5(S"HLmZ!!`r2!$r6VVM-NTZ!!TQ!!!52bS!@LmZ!!a1Z[A-B!!"5JaZ!!% +!#QB!!")r+J"8,bi!$%kkpE*J!!%`$'i!!`!+AX"%!-!Yq6*R!!"Q(A`!!Ilp,`F +`,Ikq8N"q!jj!E3!!0Me!rri`,[rqidJb,[rqidP"kJ"50$!!!%(YrSkdF"!!9m" +%!-!Zr[dG32lp8QlrrP(2rp)Z(dSZr[eR!!!52bS!@LmZ!!a1Z[8mB!!!ZLm(-#h +q[P*!9Bmr,J!+2c`!"#B!6VVdc$iIRN0Y!!#B282rrM!Zrrl"r!!15(S!Q%(Urr* +)F!!!6VVLE'F!!(!`,[rqidK"kJ"52c!!!%KZr[j1Z[6L5(S!F#mZ!!a1ZZ*'CJ! +!&NKZr[i[,J!-2c`!rdkkiK4J!!!f,bi!$%KZrIa1ZZ(B5(S!3NKZrIa1ZZ)q5'l +qrNKZrIa1ZZ)b5'lpr#mZ!!`r2!$r6VVKh&*Zrrj4crp`,Kp-h`3)6PiJAe#26Y! +!N!B",J#3"%j@!!!`,J!)$%!!!'B!!!`pI!#-!!TJ!!#J$%!!!@B!!!`pI!#0!!T +J!!#1$%!!!QB!!!`pI!#R!!TJ!!"m$%!!!fB!!!`pI!#k!!TJ!!"U$%!!"'B!!!` +pI!#T!!TJ!!"B$%!!"@B!!!`pI!$%!!TJ!!"'$%!!"QB!!!`pI!#j!!TJ!!!d$%! +!"fB!!!`pI!#f!!TJ!!!L$%!!#'B!!!`pI!#J!!TJ!!!3$%!!#@B!!!JpI!$#!!T +1AL"I9)p1d%j@r`")ja!J,`G`!Ai%RN"Y!!!U1d$qb$!YrXM"r!!15(S,AN(YqD4 +)F!!!2c`!$%kki-C5EIl)8FrrhLiI3HhjXN2Yq9j`&#,B8FMrr%KYrm*)HJXZ3QG +1ZZa@6VVXR&L26VVS)%KYrm*)HJYD3QG1ZZ`q6VVXK&L26VVS#%KYrpC)E[m!6VV +Uc%KZr`")EIb12c`!rdkki'"1ZZVX@)p1ZZIL5'hr`NKk#eT#Cdkkl!"1ZZa'@)p +1ZZI+5'hr`NKk#hT#CdkkkqK1ZZ`Z@)p1ZZHb5'hr`NKk#k*#Cdkkkp"BMdkkjjj +)EIr@6VVU#L!I1d$qb%kkkT!!@)p1ZZH'$'d!!rl)9m"%!"Y!q69`!j!!EIl)1d$ +q[NKYrm*)HJY`3QG1ZZZ-6VVVdPL26VVR9NKYrm*)HJZ3!%*R6VVVG%kkklTBMdk +kjcj)EIr#5(S,Y%*R6VVVA%kkkk*BMdkkjbC)EIr@6VVTG$YIq3*1ZZSD@)p1ZZF +3$'d!E[N#9m"%!"Y!q6*)EIr#5(S,XN*R6VVV)%kkkfCBMdkkjZT)EIr@6VVT1$Y +Iq3*1ZZRH@)p1ZZE8$'d!HIN#9m"%!"Y!q60+,INcC`!!&NKk#l")EIU12c`!rdk +khb*J!!!55(S,RNKYqSir2!$r6VVI$Lm(F!"q#Cj!E3!!($Y!rXJ`,Il)idK"lIk +13R!!!&*YrXK4crrX,Kp"lIk13qhqSR!%)YK4b2rm5'hr`NKk#e4#CdkkkS"1ZZV +'@)p1ZZC+5'hreNkkk,BJ(cY!rVT1ZZNm@)p1ZZBb-#hqZP0!1d$qN!!EI!!"q6" +)EIr#5(S,5N*R6VVU3%kkkSCBMdkkjJT)EIr@6VVSGL!I1d$qZ%kkk2aBMdkkjI) +`,Iki8d!l32k5'h`!!IN[5'hr`NKk#d"#CdkkkJ"1ZZT'@)p1ZZA+,`G`!(i*RN" +Y!!!N1d$qb$!YrXMP5%(Yq6C)F!!!2c`I5%kki0j5EIl)8Frrj#iI5'hj'NKYr)i +r2!)!6VVQJNkkjBC)EIND6VVRe$YIq34BMdkkjA4)EIND6VVTq"!I5J"Q!!'1$'d +!J2N%E`!"EM!Yq33-3!#-CJ!!#N*YrVCJ!!%1$%!!M@B!!!`lI!!"rVCJ!!$m$%! +!TfB!!!`lI!!#rVCJ!!$U$%!!ZQB!!!`lI!!$rVCJ!!$B$%!!U@B!!!`lI!!%rVC +J!!$'$%!!a'B!!!`lI!!&rVCJ!!#d$%!!Z@B!!!`lI!!'rVCJ!!#L$%!!YQB!!!` +lI!!(rVCJ!!#3!!a!!+"Q!!!-1h`!#2kfB!!!IJa!!-*Q!!!-1h`!#IkfB!!!E!a +Y!12j"&c!4!!-E3$Pq34I`83"`!&R!!!5-#hj"!4!!1)l32kfB!!!3JaY!0hj"&c +!4!!-E3$Lq34I`83"`!&R!!!5-#hj"!4!!0Nl32kfB!!!'!aY!0cj"'B!!!T#EIk +fB!!!"Q!!!%j)EIND6VVQL$YIq34BMdkkj#J-E3$%q34R!!!55'hk"NKYq341Z[# +)B!!!"Q!!!"j9MdKYqJC)EIkm6VVef%SICJ!!#NKYqJC1Z[E!5'hj'NkkjM`lArN +%@)p1ZZ2FB!$qCNKYrm*)HJP13QG1ZZIf6VVS2&L26VVM`%KYq4T#Tcmm!J"1ZZ5 +U6VVMVNKYr)j)E[m!6VVEkNKYqSj)E[m!6VVF8%KZr`")EIZ12c`!rdkkfrSVI#T +849Mrq%KYq3C)EIZ12c`#!%kkj'a1ZZ0U3HhjXN2Yq9j`&#,B8FMrr#m(F!"q#Cj +!E3!!($Y!rXJ`,Il)idK"lIk13R!!!&*YrXK4crrX,Km`,Ikk8d!l32k3!$!YrVK +63$Y!rT*)EIND6VVPE$YIq34BMdkki`a)EIND6VVRN!!3(dS!CJ!&)!aY!)$j"'d +!"1`-E3$Fq34Q!!!53QhqYP@23QG1Z[QB1erj"!aY!12j"&c!4!!-E3$Pq34I`83 +"`!&R!!!F-#hj"!4!!1)l32kf9Bmr,Ikf6VVjC$YIq33-E3$Gq34F`%3!$'d!i[N +%Am&%!F!"C`!!($!Yq33%3!$C1d$qYP@22bhqYNkkq6!lArN%3Lhj0$!Yq33-3!# +-CJ!!#N*YrVCJ!!#m$%!!M@B!!!`lI!!"rVCJ!!#U$%!!TfB!!!`lI!!#rVCJ!!# +B$%!!ZQB!!!`lI!!$rVCJ!!#'$%!!U@B!!!`lI!!%rVCJ!!"d$%!!a'B!!!`lI!! +&rVCJ!!"L$%!!Z@B!!!`lI!!'rVCJ!!"3$%!!YQB!!!`lI!!(rVCJ!!!q$%!!S'B +!!!`lI!!)rVCJ!!!X$%!!`QB!!!`lI!!*rVCJ!!!D5'hj"MmYq34#Cdkkj44BMdk +kiD*J!2k#5Lhj-fF!!"C)EIN'2bhj"%*R6VVNp&L26VVKJNKYq4T1ZZ231erj"&L +26VVKF!aY!0lj"'B!!!JlI!$%q33-E3$%q34Q!!!f'h`!!INd5Lhj-fF!!"C)EIN +'2bhj"%*R6VVNTPL26VVK0%KYq4T1ZZ1#1erj"&L26VVK)NKYqJC)EIN%6VVYM&@ +25'hk"NKYrVa1Z[,N5KpQ!!'85'hr`NKk"V4#Cdkkj5"1ZZ9Q@)p1ZZ$U5'hr`NK +k"XT#Cdkkj3K1ZZ91@)p1ZZ$55'hr`NKk"Z"#Cdkkj2"1ZZ8f@)p1ZZ#k5'hr`NK +k"[K#Cdkkj0J`,Ikf5-![!%*R6VVN-%Kk"Za#Cdkkj-"BMdkki)i["c!YrVj53&@ +2-LhqYP0"2`%r2!!$*J"1ZZY!2KqH3fd!!$Jl3rl)-#hqb-(m!!j)EIr#3Hhjq%K +`!!"#Cdkkj(Jr2!!Z3QG1ZZ1Z@)p1ZZ!m8Qhqb&(2rp!Z(dTYrVCA`%3!$'d!!rk +fAX&%!B!"C`!!(NKYrm*)EIS`3QG1ZZ3i6VVNIPL26VVJ!Q!!!#B`,Ikf`I`!$NK +Yrm*"lIRi5(!!!%*R6VVN%%kkj&CBMdkkhpT)EIr#5(S',N*R6VVMq%kkj$jBMdk +khm*)EIr@6VVL%$YIq3*1ZZ+f@)p1ZYqX$'d!E[N#CJ!!(%KYq4T1ZZ&16VVIPNK +Yq3C1ZZVVILURd5'hj"NKk"Hj#CdkkikCBMdkkhh4J!!&+5Lhj0'B!!4i`,Ik +fj8Jb,Ikmj8P&lINf*()!!#4b%!4++J"FCJ!!iNTYrVCH`%3!$'d!"2kfAF&%!F! +"C`!!`$!YrVEM5$)YrVEM58(YrSid-"!!8N*$lIk1-i)!!$!YrVE"r!!1-LhqYX2 +m!!j"k[rb5(!3!%(Yq9")F!!!2c`!$%kkeei`,Ik3!,"YrVTH`%3!-LhqNV*YrVK +H`83"J!&R!!"F,`G9Mc!YrVC53$m!-#hq[P4!2`"1ZZQX-"pq!jj!E3!!1$Y!rXJ +`,Il)`I`!$NKk"3a"lIP35(!!!$mm!!a1ZYEq-#hqb10)3HhqMN*`!!"5EIl)8Fr +rd#iI&A`!!3"FB!!!(NSYq60R!!!@5'hj"Mmm!-4#CdkkiEjBMdkkhNa)EIf12bh +qYMmYrVa1Z[035'hj"NKYrBj#CdkkiPTBMdkkhLK+,INaC`!!&NKYq3Br2!!Z3QG +1ZZ&q@)p1ZYi-B!!!+%KYq3Br,IN%3QG1ZZ&Q@)p1ZYhd5'hj'Nkki%)lArN%@)p +1ZYhLB!$ke%KYq3Br,IN%3QG1ZZ%m@)p1ZYh+5'hj"NkkhhC1ZYfq5'hj'NkkhfT +1ZYfb5'hr`Mmm!!G#Cdkki4!r2!!L3QG1ZZ%'5'hlMN*R6VVK[$mm!#*#Cdkki2* +)HJ2f3QG1ZZ'S6VVKlPL26VVGFLm(F!"q#Cj!E3!!)$Y!rXJ`,Il)j8K"lINf5(! +!!%kkf*T5EIl)8Frrk#iI5'hr`NKk!m4#Cdkki@4BMdkkh6*)EIr@6VVIJ$YIq34 +1ZZ!Q@)p1ZYdF$'d!HIN%CJ!!"Q!!p**-h`3)6Pj1G3!!3NCTE'8JG'mJBQ8JFQ9 +ZG@eLCA*PC#iJ5@BJDA3JDA-JEQpd)'PZ)(4SC5"cB@eP)'C[E'4PFL"KFb"548j +968*&8J!pG'KPEL"RDACP)("KG'JJEQ&YC5`JC5jR,L!J5'&bC%4TFfXk3f&XBh9 +XGA-J3Qp[Db"'EfaNCA)k3fJc)$G%Eb"jEh8JD'&fC5"K)$)JE'9fC@`J+&0PBh4 +TEfiX)("[Fh0TBQaj)(0eBR0PBh4TEfiT)'pb2c-JE'9fC@`J+%0SBA"dCA)X)(0 +PBh4TEfiX)(0eBR0PBh4TEfiT)'KTCA*KFQ0SH5"[CL"dCAKd)(9ZDA4c2a&*ER" +eG#!J-L!JEh)J)$-J)$G%Eb"jEh8JGf&ZG#"dD'8JBfKKF(4PFL`JFf9MG'P[EL" +KEQ3JFh9LFf9MG'P[EL"ZG@eLCA*c1QPZ)(4SC5"ZCAFJCQPXC5"TCL"dD'9j)'& +bC5"KE'`JG'KP)'0eFR*PER3JEfjPFb!SH5"[FL"Z+5!!1#K$D'&`G'9b)'jeE@* +PFR-JBA*P)'PZBfaeC'9N)'pZE(NJD@BJH@pe)'KKGQ8J-b"XCACPE(-T!$a%Eb" +jEh8JGf&ZG#"dD'8JE'&LC@`JG'&RFb"dEb"bC@eKD@iJD@iJG'KP)'peG("eG$m +JH5"[FL"Z1L!!!9)"9$9*ER"eG#"dD'8JER9YBQ9b)#!q)#db)(P[G5"hB@jd)'C +[FL"dD'8JCQPbFh3JBfKKF(4PFM9*ER"eG#"dD'8JER9YBQ9b)#!q)#db)(P[G5" +hB@jd)'C[FL"dD'8JCQPbFh3JFf9MG'P[EKC*)(GTE'`JBQ9PF#"hD'9Z)(*PB@4 +j!$T'DA*cG#"`BA0c)'0[EA"XCA4PC#iJ55"KE5"cG'&bG'PZCb"dEb"hFQPdC5" +dD'8JEQ9h)'CTE'8Z!#e-38*&6#"16e3J4Np96N3J58iJ6%P69#"26L"648026N3 +J8%&68biJ49*56e)Y@8p9)%e"@5")39C&)#"548C&8P*&4#"86b"")%j26N9B590 +848j8)%a"3N9-,dp5)&P295"039NJ5%&@45"&6P4&8N9%)&4)45"A8Np14b"-49C +&6#"198e#49)Z#daKBQ9X5fPZC$SJ#5!J6'&LC@`k)"&$EfjdD@jeC6mJH5"[FL" +Z)!-rN!-!!""hFQPdG'9Z)'pZ)'4TFfXZ!"j5C@aKBQ9X)'&ZEh4SCA)JCQPXC6m +J+(NJEh)JELN!6VV9C%kki#C1ZZ2%6VV`b+Rd!!!"!*!$-(i!!#pq!*!$2J!c'E) +#P!#3!a`!2J!!3dp%43!"!!S!!2rr!*!&-hTL!!(rra3!!"`!-hTbNim: diff --git a/support/relabel/relabelmac.pas b/support/relabel/relabelmac.pas new file mode 100644 index 0000000000..f5b671181e --- /dev/null +++ b/support/relabel/relabelmac.pas @@ -0,0 +1,503 @@ +PROGRAM relabelmac; {For Turbo Pascal for Macintosh.} +{Peter Ungar, 914 723 7187, June 7, 1994; Mar. 5th, Mar. 31th 1995} +{Change of Mar. 5, 1995: In case of a reference to a nonexistent label, +RELABEL is supposed to print out the nonexistent label. Before this +correction this failed to work in most cases. +Change of Mar. 31: The messages to input the numbers of the first +chapter and the first section were changed. The old messages said -1 was +allowed, but RELABEL is programmed to regard the symbol - as +not part of a label. + Also, the error message for nonexistent labels was made clearer.} + +LABEL 1,3,8,9; + +TYPE stringarray=array[1..6] of string[12]; + + (* LaTeX calls the identifier "label" when it occurs next to + the item, and "reference" elsewhere. I apologize for not having + observed this distinction. I should have used "identifier" for + an occurrence of a string which could be a label or a reference, + but for the most part I called it a label. In text written + for RELABEL, as in typeset books, labels and references + are not marked as such by the author. RELABEL regards the first + occurrence of an identifier as the label, unless it is marked as a + forward reference. + The program makes two passes over the text. The first + involves reading only. The program takes down each label at its + first nonforward occurrence and assigns to it the next + available serial number. These pairs of old and new labels are + stored in the labelentry file. Next, the text is read again and + written out to a new file, with each label changed to its new + value. + + Stringarrays will hold labels, including those parts of the label + which are implicit, i.e. if we omit the chapter label or the + chapter and section label or the chapter, section and subsection + label when those are the current ones. + The entries of the stringarray are: + a) If SectionReset=TRUE: chapterlabel, sectionlabel, + subsection label and the identifier of the object of the label. + If the item does not apply, e.g. if we are not in a subsection, + the corresponding entry is the empty string ''; + b) If SectionReset=FALSE, i.e. sections are numbered + consecutively, then chapter numbers are not needed in labels and + the first entry of the string array is empty except in the + label of a chapter. *) + + (* We use the following pointer construction to get around the fact + that Turbo Pascal allots a space of only 32K to + all regularly declared variables, but can utilize memory outside + that limited space for variables created by NEW statements. *) + + labelentry=RECORD oldlabel:stringarray; + newlabel:array[1..4] of integer; + secondpassoccurred:boolean; + END; + labelentryp=^labelentry; + sublistp=array[-1..2000] of labelentryp; + mainlistp=^sublistp; + + (* Oldlabel is a stringarray. The labels in the old text may + contain lowercase letters as well as digits. + Newlabel is represented by an array of integers, the + chapter number etc. This will be made into a string when there is + a reference to the label.*) + + VAR i,j,k,n,implicit,ImplAdj,SerialNo, + FirstChapter,FirstSection,LabelKind:integer; + (* ImplAdj (ImplicitAdjustment) is 0 if section numbers are reset + at the beginning of each chapter and 1 if they are not, and + hence chapter numbers are not needed in labels other than chapter + labels. + SerialNo will hold the serial number of the first occurrence + of a label in the array holding all labels of its kind. + FirstChapter, FirstSection are the numbers to be assigned to the + first chapter and the first section of the file. RELABEL asks an + input of this when the program starts, in case you want 0, 1 or + larger numbers if the file is from the middle of a manuscript. *) + totalcount, currentcount:array[0..9] of integer; + (* countstarts gives where the numbering of chapters, sections + subsections and other labeled items begins; the program sets + the last two equal to 1. *) + s,filename,outputfilename, filenameend:string; + labelstring:string[51]; + sta,empty,current:stringarray; + + (* totalcount will say how many labels of the 10 kinds we have + so far. currentcount gives the counts of the 10 kinds since they + were last reset. + current contains the current chapterlabel, section + label and subsection label. *) + + mainlist:array[0..9] of mainlistp; + SectionReset,ForwardRef, LabeltagsInOutput, omit, + PeriodFollows, FirstChapterLabel, FirstSectionLabel: boolean; +(* Sectionreset: Each chapter starts with section 1.*) + + incoming, outgoing:text; + c,ans:char; + +FUNCTION min(i,j:integer):integer; +BEGIN + IF i0 DO BEGIN s:=s+chr(48+(a DIV d)); a:= a MOD d; d:=d DIV 10 END; + 9:END; + + FUNCTION labelsymbol(c:char):boolean; +(* TRUE if c is a symbol allowed in a label, i.e. a digit or + a lowercase letter. *) + VAR x:integer; + BEGIN x:=ord(c); + labelsymbol:=(((48<=x) AND (x<=57)) OR ((97<=x) AND (x<=122)) + OR ((65<=x) AND (x<=90))) + END; + + PROCEDURE ReadLabel(VAR star:stringarray; VAR c:char); + (* Reads the components of a label from the incoming stream and + puts its components into the stringarray star, including + the implicit items. If section numbers are not reset in each + chapter (2 levels of test units) then the empty string is put in + the chapter designator location star[1] except in the case of + chapter labels. *) + LABEL 2,5,9; + VAR i,implicit:integer; str:string[12]; + BEGIN + k:=0; star:=empty; PeriodFollows:=FALSE; + (* k will count the number of parts separated by .'s in the label. *) + 2: str:=''; + WHILE labelsymbol(c) DO BEGIN + str:=str+c; + read(incoming,c); + END; + k:=k+1; star[k+ImplAdj]:=str; + IF c='.' THEN BEGIN + (* Another part of the label is coming, or there is a . after + the label. *) + read(incoming,c); + IF labelsymbol(c) THEN GOTO 2 + ELSE PeriodFollows:=TRUE; + END; + (* Now we have all k items of the label in the stringarray star. + We want the program to work so that, if desired, the chapter, section + and subsection labels may be omitted and then they are understood to + refer to the current chapter, section or subsection. + We reconstruct the omitted parts of the label. We assemble it + in star and then if it is a new label we put it into the mainlist. + If the number of levels is 3, then the + components of star are: Chapter label, Section label, Subsection + label and item label. If any of these are missing or not applicable, + the corresponding label is ''. A subsection label is missing + if the section is not divided into subsections. A subsection + label is inapplicable if the label is a chapter or section label. + If the number of levels is 2, (ImplAdj=1) then a label of + anything except a chapter is complete without the chapter label, + and star[1]:='' for all such items. *) + IF (LabelKind > 1) AND ((k+ImplAdj) > min(LabelKind, 4)) THEN BEGIN + writeln('Found a label with too many parts. If you have 2 levels,'); + writeln('only a chapter label should contain a chapter identifier.'); + GOTO 5; + END; + IF ((LabelKind=0) AND (k>1)) THEN BEGIN + writeln(' An at-large item label with more than one part: '); +5: write('LabelKind: ',Labelkind,' Label: '); + FOR i:=1+ImplAdj TO k+ImplAdj-1 DO write(sta[i],'.'); + writeln(sta[k+ImplAdj]); + writeln('Continue? y or n '); readln(ans); + IF ans='n' THEN BEGIN close(incoming); halt END; + END; (* Of error handling. *) + IF LabelKind=0 THEN BEGIN + star[4]:=star[1+ImplAdj]; star[1+ImplAdj]:=''; + END; + IF LabelKind=1 THEN BEGIN + star[1]:=star[1+ImplAdj]; star[2]:='';GOTO 9 END; + IF (2<=LabelKind) AND (LabelKind<=3) THEN BEGIN + implicit:=LabelKind-k-ImplAdj; + IF implicit>0 THEN BEGIN + FOR i:=LabelKind DOWNTO implicit+1 DO star[i]:=star[i-implicit]; + FOR i:=1+ImplAdj TO implicit+ImplAdj DO star[i]:=current[i]; + END; + END; + IF (labelkind >= 4) THEN BEGIN + IF k+ImplAdj<4 THEN BEGIN + star[4]:=star[k+ImplAdj]; star[k+ImplAdj]:='' END; + IF k=1 THEN FOR i:=1+ImplAdj to 3 DO star[i]:=current[i]; + (*This must be a label of an item in the current text unit.*) + END; +9:END; (* of procedure readlabel. Note that c is the first symbol after + the label at this stage, or the first symbol after the period + if there was a period immediately after the label. *) + + FUNCTION InList(st:StringArray;VAR SerialNo:integer):boolean; + (* TRUE if the label st is already in the mainlist. + This function is also used to compute the index SerialNo of + the label in the array of that LabelKind*) + LABEL 9; + VAR i:integer; bool:boolean; + BEGIN + IF totalcount[LabelKind]=0 THEN InList:=FALSE + ELSE FOR i:=totalcount[LabelKind] DOWNTO 1 DO + BEGIN + bool:=TRUE; + WITH mainlist[LabelKind]^[i]^ DO + FOR j:=1 TO 4 DO bool:=bool AND (oldlabel[j]=st[j]); + IF bool THEN BEGIN + InList:=TRUE; + SerialNo:=i; + (* mainlist[LabelKind]^[SerialNo] is the record where this + label and the new label which is to replace it can be found.*) + GOTO 9 END; + END; + InList:=FALSE; (* The label is not in mainlist. *) +9:END; + + + PROCEDURE AddToList(sta:stringarray); +(* We have a new label which is not a forward reference. Add it to mainlist*) + VAR i:integer; + BEGIN + totalcount[LabelKind]:=totalcount[LabelKind]+1; + currentcount[LabelKind]:=currentcount[LabelKind]+1; + (* If the new label is a chapter, section or subsection label then + the counts of subordinate items have to be reset.*) + + IF (0=2 THEN + FOR i:=1+ImplAdj TO min(3,LabelKind) DO newlabel[i]:=currentcount[i]; + IF LabelKind>=4 THEN newlabel[4]:=currentcount[labelkind]; + (* Newlabel[1] is 0 if sections are numbered + consecutively and chapter numbers occur only in chapter labels.*) + SecondPassOccurred:=FALSE; + END; (* of preparing new mainlist entry *) + END; (* of processing the new label *) + + PROCEDURE MakeNewLabelstring(VAR newlabelstring:string; + labelkind,SerialNo:integer); + LABEL 9; + VAR j:integer;s:string; + InUnitRef:boolean; + BEGIN + WITH mainlist[LabelKind]^[SerialNo]^ DO + BEGIN + newlabelstring:=''; + IF LabelKind=0 THEN + BEGIN IntToStr(newlabel[4],newlabelstring); + GOTO 9 END; (* Of LabelKind=0 (at large label) case *) + IF LabelKind=1 THEN + BEGIN IntToStr(newlabel[1],newlabelstring); + GOTO 9 END; (* Of LabelKind=1 (i.e. chapterlabel) case *) + + IF omit AND (LabelKind>3) THEN BEGIN + (* Find whether the reference is to the current unit of the text.*) + InUnitRef:=TRUE; + FOR j:=1+ImplAdj TO 3 DO + InUnitRef:=InUnitRef AND (newlabel[j]=currentcount[j]); + IF InUnitRef THEN BEGIN + IntToStr(newlabel[4],newlabelstring); GOTO 9 END; + END; (* Of making label without chapter,section and subsection + number. Note we exit to 9 only if such a label has been made. *) + FOR j:=1+ImplAdj TO min(LabelKind,4) DO + IF OldLabel[j] <> '' THEN BEGIN + IntToStr(newlabel[j],s); + IF newlabelstring='' THEN newlabelstring:=s + ELSE newlabelstring:=newlabelstring+'.'+s; + END; + END; (* of WITH statement *) +9:END; + + FUNCTION LabelTag(LabelKind:integer):char; (* For error message.*) + BEGIN + CASE LabelKind OF + 0: LabelTag:= ''; {Option a, At large item ASCII 140} + 1: LabelTag:= ''; {Option c, Chapter ASCII 141} + 2: LabelTag:= ''; {Option s, Section ASCII 167} + 3: LabelTag:= ''; {Option b, suBsection ASCII 186} + 4: LabelTag:= ''; {Option g, fiGure ASCII 169} + 5: LabelTag:= ''; {Option f, Formula ASCII 196} + 6: LabelTag:= ''; {Option p, Problem ASCII 185} + 7: LabelTag:= ''; {Option d, Definition ASCII 182} + 8: LabelTag:= ''; {Option t, Theorem ASCII 160} + 9: LabelTag:= ''; {Option l, Lemma ASCII 194} + (* In the IBM-compatible version of RELABEL different label tags are used. + Their ASCII numbers are 227, 228, 229, 221, 222,..., 226 *) + END; + END; (* Main program begins here.*) +BEGIN +1: FOR i:=1 TO 4 DO empty[i]:=''; current:=empty; + writeln('File to be renumbered. If it is not in the same folder as RENUMBER'); + writeln('then give path name, e.g. HardDisk:Calculus Book Folder:Ch3 '); + readln(filename); + writeln('Do you have a 2 level (Section, possibly subsection) or'); + writeln('3 level (Chapter, section, subsection) hierarchy of text units?'); + write('Input 2 or 3 '); + readln(i); SectionReset:= i=3; ImplAdj:=3-i; + (*ImplAdj (Implicit Adjustment) = 1 if chapter numbers are superfluous + in labels, 0 otherwise.*) + writeln('Do you want the chapter, section and subsection numbers'); + writeln('in the new file if they are all the current ones (y or n) '); + writeln('(Chapter numbers are included only if you have 3 levels)'); + readln(ans); omit:=ans='n'; + writeln('Do you want the label tags to remain in the output? y or n: '); + readln(ans); LabeltagsInOutput:=ans='y'; + IF labeltagsinoutput THEN filenameend:='R' ELSE filenameend:='T'; + FOR i:=0 TO 9 DO currentcount[i]:=0; + TotalCount:=CurrentCount; + writeln('Input the number >= 0 you want for the first chapter'); + readln(FirstChapter); + currentcount[1]:=FirstChapter-1; FirstChapterLabel:=TRUE; + writeln('Input the number >= 0 you want for the first section'); + readln(FirstSection); + currentcount[2]:=FirstSection-1; FirstSectionLabel:=TRUE; + writeln('I will beep when ready'); + (* Next create the arrays for storing the various types of labels. *) + + FOR i:=0 TO 9 DO new(mainlist[i]); + + Reset(incoming,filename{,50000}); (* Use large buffer to spare disk drive *) + read(incoming, c); + WHILE eof(incoming)=FALSE DO + BEGIN + IF ord(c) > 128 THEN BEGIN + CASE c OF + '': LabelKind:=0; + '': LabelKind:=1; + '': LabelKind:=2; + '': LabelKind:=3; + '': LabelKind:=4; + '': LabelKind:=5; + '': LabelKind:=6; + '': LabelKind:=7; + '': LabelKind:=8; + '': LabelKind:=9; + OTHERWISE (* In case the file comes from MS-DOS user of RELABEL *) + IF ((227 <= ord(c)) AND (ord(c)<= 229)) + THEN LabelKind:= ord(c)-226 + ELSE IF ((221 <= ord(c)) AND (ord(c)<= 226)) + THEN LabelKind:= ord(c)-217 + ELSE IF ord(c)=220 THEN LabelKind:=0 + ELSE GOTO 8; + END; + read(incoming, c); + IF (c<>'') THEN readlabel(sta,c) ELSE GOTO 8; + + (* Do readlabel and the work below only if this is not + labeled to be a reference. + Next, we check if this is a repeat occurrence of a label. + If not, enter in the list of labels and increase the count + of labels of the kind we found.*) + + IF NOT InList(sta,SerialNo) THEN AddToList(sta); + END; (* of processing a label *) + 8:read(incoming,c) + END; (* of loop which reads characters of the file *) + + writeln('First pass completed. I am starting to write the new file.'); + + Reset(incoming); + + outputfilename:=filename+filenameend; + (*If we choose to retain the tags of the labels in the renumbered + file then its name is original file name with R appended, + if the tags are stripped from the labels, S is appended.*) + TextCreator:='*TEX'; + Rewrite(outgoing,outputfilename{,50000}); + (* Use large buffers to avoid frequent disk operation *) + + current:=empty; + FOR i:=0 TO 9 DO currentcount[i]:=0; + currentcount[1]:=FirstChapter-1; + currentcount[2]:=FirstSection-1; + + (* We need to redo current to be able to restore the implicit + parts of the labels as we encounter them on the second pass. *) + +3:read(incoming,c); + WHILE eof(incoming)=FALSE DO + BEGIN + IF ord(c) >=128 THEN BEGIN (* A label may begin here. *) + (* Check for and convert MS-DOS label tags *) + IF ord(c)=220 THEN BEGIN LabelKind:=0; c:=labeltag(0) END; + IF ((227 <= ord(c)) AND (ord(c)<= 229)) THEN BEGIN + LabelKind:= ord(c)-226; c:=labeltag(labelkind) END; + IF ((221 <= ord(c)) AND (ord(c)<= 226)) THEN BEGIN + LabelKind:= ord(c)-217; c:=labeltag(labelkind) END; {Of DOS conv.} + ForwardRef:=FALSE; + CASE c OF + '': LabelKind:=0; + '': LabelKind:=1; + '': LabelKind:=2; + '': LabelKind:=3; + '': LabelKind:=4; + '': LabelKind:=5; + '': LabelKind:=6; + '': LabelKind:=7; + '': LabelKind:=8; + '': LabelKind:=9 + OTHERWISE BEGIN (*The symbol is not a labelkind indicator*) + write(outgoing,c); GOTO 3; + END; + END; (* of CASEs. We did not GOTO 3, c is a labeltag. *) + IF LabeltagsInOutput THEN write(outgoing,c); + read(incoming,c); + IF c=chr(222) THEN c:=''; + IF c='' THEN BEGIN + ForwardRef:=TRUE; + IF LabeltagsInOutput THEN write(outgoing,c); + read(incoming,c) + END; + readlabel(sta,c); + IF NOT(InList(sta,SerialNo)) THEN BEGIN + writeln('LABEL NOT FOUND IN LIST ON SECOND PASS. ERROR'); + writeln('YOU MAY HAVE REFERRED TO A NONEXISTENT LABEL'); + writeln('OR YOU MAY HAVE ENTERED THE WRONG LEVEL NUMBER.'); + write('LabelKind: ',Labelkind,' Label in full form: '); + FOR i:=1+ImplAdj TO min(LabelKind-1, 3) DO + IF sta[i] <> '' THEN write(sta[i],'.'); + IF ((LabelKind = 0) OR (LabelKind > 3)) THEN writeln(sta[4]) + ELSE writeln(sta[LabelKind]); + writeln('Continue (with ??? in this reference)? y or n '); + readln(ans); + IF ans='n' THEN BEGIN close(incoming); close(outgoing); halt END; + write(outgoing,'???'); GOTO 9; + END; (* Of message and output, we had a reference to unknown label.*) + IF NOT ForwardRef THEN BEGIN + WITH mainlist[labelkind]^[SerialNo]^ DO BEGIN + IF (NOT secondpassoccurred)THEN BEGIN + IF (0FirstChapter) + OR (currentcount[2]>FirstSection) THEN BEGIN + FOR i:=max(labelkind+1,ImplAdj+2) TO 3 DO BEGIN + current[i]:=''; currentcount[i]:=0; + END; + END; + END; (* Of dealing with the label of a new heading. *) + secondpassoccurred:=TRUE; + END + ELSE IF LabeltagsInOutput THEN write(outgoing,''); + (* We have a reference.*) + END; (* Of WITH mainlist...*) + END; (* Of NOT ForwardRef *) + (* Now we are ready to get the new label and convert it to a + string. This can not be done once for all since the string + may be shorter in a reference to the item from within + the same subunit. Doing the job from scratch each time just + because we may need one or the other of two expressions + is admittedly inelegant but seldom are there many references + to one item. *) + MakeNewLabelstring(s,LabelKind, SerialNo); + write(outgoing,s); +9: IF PeriodFollows THEN write(outgoing,'.'); + END (* of assembling and writing the new label. *) + ELSE BEGIN (* ord(c)<128, certainly not a labelkind symbol*) + write(outgoing,c); + read(incoming,c); + END; (* of IF ord(c)>=128..ELSE statement. *) + END; (* Return to the beginning of the WHILE eof(incoming)=FALSE cycle *) + write(outgoing,c); (* write the last symbol of the file *) + close(outgoing);close(incoming); + writeln(chr(7),'"',outputfilename,'"', 'written on disk.'); + FOR i:=0 TO 9 DO dispose(mainlist[i]); + write('Relabel another file? (y or n)'); + readln(c); IF c='y' THEN GOTO 1; + END. diff --git a/support/relabel/relex2i.txt b/support/relabel/relex2i.txt new file mode 100644 index 0000000000..8389739bbc --- /dev/null +++ b/support/relabel/relex2i.txt @@ -0,0 +1,166 @@ +RelabelExample2 file for IBM-compatible computers. + +Chapter in. Introduction. + +Section le. Levels. + +Definition levelsdef. This file is in- +tended for using RELABEL in 2-level +mode. The hierarchy of text units is +section and subsection. +Chapter labels are treated as nothing +more than a set of labels which are +not reset when we enter a new section. +Subsection numbers are reset to 1 in +each new section and all item numbers +are reset to 1 in each subsection. + +Section di. Directions. + +Def def. This file is intended to +show how the program relabel works and +to help you experiment with it. The +"chapters", "sections" etc. all have +memnonic labels, which the program +RELABEL replaces by numbers in the +output file. Run the program using +this file as input and compare the +output file with this file. View the +original and relabeled files side +by side. Close this file before you +start. + +PROBLEM WARNING. This text is +intended to illustrate renumbering +when section numbers do NOT restart +in each chapter. CHAPTER IDENTIFIERS +SHOULD NOT OCCUR EXCEPT IN CHAPTER +LABELS. RELABEL WILL GET CONFUSED IF +CHAPTER IDENTIFIERS ARE USED IN +ANY OTHER LABEL OR REFERENCE. + + +Section su. Suggestions. + + Note that if you just move Horst +of Ithaca to Hopewell, he will be +married label-wise to Hope of Hopewell +insofar as they will share the same +label. This is because they both +started out with the label ho. +That is OK as long as they are not +in the same town. +If you run RELABEL before +moving Horst, and ask for chapter +numbers etc. not to be omitted, +then you can move Horst to Hopewell +and RELABEL again, and this time +Horst and Hope will have distinct +labels. + +CHAPTER ca. State of California + +Section ca. Campers in California + +am Amanda at large +ca Forward ref. to Cathy at large +Fig.ca Carl +Fig.al Alfred +Fig.ad. Adele Smith +Fig. adelejones Adele Jones +forw.Ref. to or.be Betty +Ref. to Fig. al Alfred +Forward Ref. to nonexistent label +ne Nobody +Forward ref. to to.it.ho Horst +of Ithaca + +Section or Orange County + + +Fig.bo Bob +Fig.be Betty +Ref. to adelejones Adele Jones +Ref. to or.be Betty +Ref. to be Betty +Ref. to Fig. al Alfred + +SubSection sa. Town of Santa Ana + +Fig.ch Charles +Fig.ca Cathy +Forwardref to me.pr.da Dan + +Section mo Monterey County + +Subsection loc Town of Lockwood + +ed Edward + +CHAPTER nj. State of New Jersey + +Section cam. Campers in New Jersey + + Note that we can not use ca as +identifier for this section because +we used ca as identifier for +the section Camping in California. +This file is intended for not resetting +the section numbers in each new +chapter. When this option is used, +chapter identifiers are used only +in chapter labels and the same +section label can not be used in +different chapters. When the reset +option is used, a chapter identifier +are part of the full label of +every item and RELABEL will not be +confused if the same identifier +is used for sections in different +chapters, even if you do not type +the full label but only the +abbreviated form, i.e., the last item. +Note that ca is used three times, as +a chapter identifier, a section +identifier and an item identifier. + +Fig.el Elaine + +Section me. Mercer County + +Subsection pr. Town of Princeton + +Fig.fr Frank of Princeton +da Dan + +Subsection ho. Town of Hopewell + +ho Hope of Hopewell +Fig.dor Doris +Fig.er Erwin + +CHAPTER ny State of New York + +Section to Tompkins County + +Subsection it Town of Ithaca + +ho Horst of Ithaca +ForwardRef. to we.ea.fr Frank of +Eastchester. + +Section we Westchester County + +Subsection ea Town of Eastchester + +Fig. fr Frank, born in Eastchester +Ref. to me.ho.dor Doris +Ref. to nj New Jersey State +Ref. to me.pr Princeton, town of +Ref. to fr Frank, born in Eastchester +Ref. to me.pr.fr Frank, born in Princeton +Ref. to am Amanda at large +ca Cathy at large. +Ca Calvin at large + + End of Pseudobook diff --git a/support/relabel/relex2m.txt b/support/relabel/relex2m.txt new file mode 100644 index 0000000000..9eebc62887 --- /dev/null +++ b/support/relabel/relex2m.txt @@ -0,0 +1,191 @@ +RelabelExample2 file for Macintosh. + +Chapter in. Introduction. + +Section le. Levels. + +Definition levels. This file is an +example file for using RELABEL in 2-level +mode. The hierarchy of text units is +section and subsection. +Chapter labels are not part of any +other identifier but when a new +chapter starts RELABEL resets to 1 all +all counts except the section count +and the count for "at large" items. +Subsection numbers are reset to 1 in +each new section and all item numbers +except "at large" are reset to 1 in +each subsection. + + +Section di. Directions. + +Def def. This file is intended to +show how the program relabel works and +to help you experiment with it. The +"chapters", "sections" etc. all have +memnonic labels, which the program +RELABEL replaces by numbers in the +output file. Run the program using +this file as input and compare the +output file with this file. View the +original and relabeled files side by +side. Close this file before you +start. + +Subsection howtorefer. Reference format + +In 2-level mode all references to +items in other text units must +contain a section identitier and, if +the item is in a subsection, the +subsection identifier must also be +supplied. The section identifier must +be given even if it you are referring +to an item in another sucsection of +the current section. You have the +option of omitting ALL unit +identifiers if you are referring to a +label in the same text unit, i.e., if +no section or subsection starts +between the label and the reference. + Exception: items of the type "at +large" are not considered part of any +particular text unit and references +to them should NOT contain text unit +identifiers. + + +Section su. Suggestions. + + Note that if you just move Horst +of Ithaca to Hopewell, he will be +married label-wise to Hope of Hopewell +insofar as they will share the same +label before and after relabeling. +This is because they both started out +with the label ho. That is OK as +long as they are not in the same text +unit. If you want to move Horst from +Ithaca to Hopewell, run RELABEL before +moving Horst, and ask for section +numbers etc. to be retained. Then +you can move Horst to Hopewell. This +time Horst and Hope will have +different labels but the label of +Horst will reflect his former rather +than his present location. To correct +this, run RELABEL again. You can ask +for abbreviated or full labels, and +this time Horst and Hope will have +distinct labels. + +Forward ref. to me.ho.ho Hope of Hopewell +Forward ref. to to.it.ho Horst of Ithaca + +CHAPTER ca. State of California + +Section ca. Campers in California + +Forward ref. to At large alt Alton +At large al Albert +At large Al Allyson +Fig.ca Carl +Fig.al Alfred +Fig.ad. Adele Smith +Fig. adelejones Adele Jones +forw.Ref. to or.be Betty +Ref. to Fig. al Alfred +Forward Ref. to nonexistent label +ne Nobody +Forward ref. to to.it.ho Horst +of Ithaca + +Section or Orange County + + +Fig.bo Bob +Fig.be Betty +Ref. to adelejones Adele Jones +Ref. to or.be Betty +Ref. to be Betty +Ref. to Fig. al Alfred + +SubSection sa. Santa Ana + +Fig.ch Charles +Fig.ca Cathy +Forwardref to me.pr.da Dan + +Section mo Monterey County + +Subsection loc Lockwood + +ed Edward + +CHAPTER nj. State of New Jersey + +Section cam. Campers in New Jersey + + Note that we can not use ca as +identifier for this section because +we used ca as identifier for +the section Camping in California. +This file is intended for not resetting +the section numbers in each new +chapter. When this option is used, +chapter identifiers are used only +in chapter labels and the same +section label can not be used in +different chapters. When the reset +option is used, a chapter identifier +are part of the full label of +every item and RELABEL will not be +confused if the same identifier +is used for sections in different +chapters, even if you do not type +the full label but only the +abbreviated form, i.e., the last item. +Note that ca is used three times, as +a chapter identifier, a section +identifier and an item identifier. + +Fig.el Elaine + +Section me. Mercer County + +Subsection pr. Princeton + +Fig.fr Frank, born in Princeton +da Dan + +Subsection ho. Village of Hopewell + +ho Hope of Hopewell +Fig.dor Doris +Fig.er Erwin + +CHAPTER ny State of New York + +Section to Tompkins County + +Subsection it City of Ithaca + +ho Horst of Ithaca +ForwardRef. to we.ea.fr Frank, born in +Eastchester. + +Section we Westchester County + +Subsection ea Eastchester (a town in Westchester) + +alt Alton +Ref. to at large Al Allyson +Fig. fr Frank, born in Eastchester +Ref. to me.ho.dor Doris +Ref. to nj New Jersey State +Ref. to me.pr Princeton, town of +Ref. to fr Frank, born in Eastchester +Ref. to me.pr.fr Frank, born in Princeton + End of Pseudobook diff --git a/support/relabel/relex3i.txt b/support/relabel/relex3i.txt new file mode 100644 index 0000000000..132b37fc27 --- /dev/null +++ b/support/relabel/relex3i.txt @@ -0,0 +1,158 @@ +RELABEL EXAMPLE3 FILE FOR MS-DOS COMPUTERS. + +Chapter intro. Introduction. + +Definition levels. This file is in- +tended for using RELABEL in 3-level +mode. The hierarchy of text units is +chapter, section and subsection. +Section numbers are reset to 1 in each +new chapter except the first. Sub- +section numbers are reset to 1 in +each new section and all item numbers +are reset to 1 in each subsection. + +This file is intended to show how the +program relabel works and to help you +experiment with it. The "chapters", +"sections" etc. all have memnonic +labels, which the program RELABEL +replaces by numbers in the output file. +Run the program using this file as +input and compare the output file with +this file. Close this file before you +start. + +After running RELABEL, open this file +and the relabeled version in +windows side by side, and compare the +two files. These lines are short to +facilitate this. + +WARNING WARNING. RELABEL can deal with +two kinds of files, and asks you which +kind you have. If we restart the +section numbers at the beginning of +each chapter then a full label of all +items must contain the chapter label, +although in references to items in the +current text unit you may omit ALL text +unit identifiers. If we do not +restart section numbers in each chapter +then RELABEL disregards chapter +identifiers except in chapter labels. +If you include a chapter identifier in a +nonchapter label RELABEL will get +confused. Conversely, if section +numbers are to start from 1 in each +chapter, all references to other text +units must contain a chapter identitier. + +Section sugg. Suggestions + + Note that if you just move Horst +of Ithaca to Hopewell, he will be +married label-wise to Hope of Hopewell +insofar as they will share the same +label. This is because they both +started out with the label ho. +That is OK as long as they are not +in the same town. +If you run RELABEL before +moving Horst, and ask for chapter +numbers etc. not to be omitted, +then you can move Horst to Hopewell +and RELABEL again, and this time +Horst and Hope will have distinct +labels. + +PROBLEM WARNING. IF YOU HAVE LABELS IN +A FILE WHICH ARE "AT LARGE" IN +CHAPTERS, I.E. NOT IN A SECTION WITHIN +THE CHAPTER. AND YOU SELECT THE "DO NOT +RESET SECTION NUMBERS IN EACH CHAPTER" +OPTION THEN CHAPTER NUMBERS WILL BE +OMITTED FROM ALL LABELS, EXCEPT CHAPTER +LABELS, EVEN INTERNALLY AND THE RELABEL +PROGRAM WILL NOT BE ABLE TO FIGURE OUT +WHAT THE LABELS LOOSE IN THE CHAPTER +SHOULD BE. RELABEL EXAMPLE 2 IS SUCH A +FILE. + +CHAPTER ca. State of California + +Campers in California: + +ca Cathy, at large in the US +Fig.al Alfred +Fig.ad. Adele Smith +Fig. adelejones Adele Jones +forw.Ref. to ca.or.be Betty +Ref. to Fig. al Alfred +Forward ref. to ny.to.it.ho Horst of Ithaca. +Forward ref. to Ca Calvin, at large in Ithaca. + +Section or. Orange County + + +Fig.bo Bob +Fig.be Betty +Ref. to ca.adelejones Adele Jones +Ref. to ca.or.be Betty +Ref. to be Betty +Ref. to Fig. ca.al Alfred + +SubSection sa. Town of Santa Ana + +Fig.ch Charles +Fig.ca Cathy +Forwardref to Fig.nj.el Elaine +Forwardref to nj.me.pr.da Dan + +Sectionmo. Monterey County + +Subsection loc. Town of Lockwood + +ed Edward + +CHAPTER nj State of New Jersey. + +Fig.el Elaine + +Section me Mercer County + +Subsection pr Town of Princeton + +Fig.fr Frank, born in Princeton +da Dan + +Subsection ho Town of Hopewell + +ho Hope of Hopewell +Fig.dor Doris +Fig.er Erwin +al Alvin, at large + +CHAPTER ny State of New York + +Section to Tompkins County + +Subsection it Town of Ithaca + +Ca Calvin, at large +Ref. to al Alvin, at large in Hopewell +ho Horst of Ithaca +Forward ref. to ny.we.ea.fr Frank, +born in Eastchester + +Section we Westchester County + +Subsection ea Town of Eastchester + +Fig. fr Frank of Eastchester +Ref. to nj.me.ho.dor Doris +Ref. to nj New Jersey State +Ref. to nj.me.pr Princeton, town of +Ref. to fr Frank of Eastchester +Ref. to nj.me.pr.fr Frank, born in Princeton + End of Pseudobook diff --git a/support/relabel/relex3m.txt b/support/relabel/relex3m.txt new file mode 100644 index 0000000000..bd73098377 --- /dev/null +++ b/support/relabel/relex3m.txt @@ -0,0 +1,156 @@ +RELABEL EXAMPLE3 FILE FOR MACINTOSH. + +Chapter intro. Introduction. + +Definition levels. This file is in- +tended for seeing RELABEL work in 3- +level mode. The hierarchy of text units +is chapter, section and subsection. +Section numbers are reset to 1 in each +new chapter except the first. Sub- +section numbers are reset to 1 in +each new section and all item numbers +are reset to 1 in each subsection. + +The "chapters", +"sections" etc. all have memnonic +labels, which the program RELABEL +replaces by numbers in the output file. +Run the program using this file as +input and compare the output file with +this file. Close this file before you +start. + +After running RELABEL, open this file +and the relabeled version in +windows side by side, and compare the +two files. These lines are short to +facilitate this. + +Section howtorefer Reference format. + +In 3-level mode all references to +items in other text units must +contain a chapter identitier and, if +the item is in a section or +subsection, those identifiers must +also be supplied even if the chapter +and section number are the current +ones. You have the option of omitting +ALL unit identifiers if you are +referring to a label in the same text +unit, i.e., if no section or +subsection starts between the label +and the reference. + Exception: items of the type "at +large" are not considered part of any +particular text unit and references +to them should NOT contain text unit +identifiers. + +Section sugg. Suggestions + + Note that if you just move Horst of +Ithaca to Hopewell, he will be +married label-wise to Hope of Hopewell +insofar as they will share the same +label before and after relabeling. +This is because they both started out +with the label ho. That is OK as +long as they are not in the same text +unit. If you want to move Horst from +Ithaca to Hopewell, run RELABEL before +moving Horst, and ask for section +numbers etc. to be retained. Then +you can move Horst to Hopewell. This +time Horst and Hope will have +different labels but the label of +Horst will reflect his former rather +than his present location. To correct +this, run RELABEL again. You can ask +for abbreviated or full labels, and +this time Horst and Hope will have +distinct labels. + +Forward ref. to nj.me.ho.ho Hope of Hopewell +Forward ref. to ny.to.it.ho Horst of Ithaca + +CHAPTER ca. State of California + +Campers in California: + +Fig.al Alfred +Fig.ad. Adele Smith +Fig. adelejones Adele Jones +forw.Ref. to ca.or.be Betty +Ref. to Fig. al Alfred +Forward ref. to Al Allyson, at large + +Forward ref. to ny.to.it.ho Horst of Ithaca. + +Section or. Orange County + +Forward ref. to At large alt Alton +At large al Albert +At large Al Allyson +Fig.bo Bob +Fig.be Betty +Ref. to ca.adelejones Adele Jones +Ref. to ca.or.be Betty +Ref. to be Betty +Ref. to Fig. ca.al Alfred + +SubSection sa. Town of Santa Ana + +Fig.ch Charles +Fig.ca Cathy +Forwardref to Fig.nj.el Elaine +Forwardref to nj.me.pr.da Dan + +Section mo. Monterey County + +Subsection loc. Town of Lockwood + +ed Edward + +CHAPTER nj State of New Jersey. + +Fig.el Elaine + +Section me Mercer County + +Subsection pr Town of Princeton + +Fig.fr Frank, born in Princeton +da Dan + +Subsection ho Town of Hopewell + +ho Hope of Hopewell +Fig.dor Doris +Fig.er Erwin + +CHAPTER ny State of New York + +Section to Tompkins County + +Subsection it Town of Ithaca +ho Horst of Ithaca +Forward ref. to ny.we.ea.fr Frank, +born in Eastchester + +Section we Westchester County + +Subsection ea Town of Eastchester + +At large alt Alton +Ref. to at large Al Allyson +Fig. fr Frank of Eastchester +Ref. to Fig.nj.me.ho.dor Doris +Ref. to Fig.nj New Jersey State +Ref. to Fig.nj.me.pr Princeton, town of +Ref. to Fig.fr Frank of Eastchester +Ref. to Fig.nj.me.pr.fr Frank, born in Princeton + End of Pseudobook + + -- cgit v1.2.3