Word 97 stores bullets and numbering information very differently from earlier versions of Word. In Word 6.0, for example, number formatting data is stored individually with each paragraph. In Word 97, however, all of the formatting information is stored in a pair of document-wide list tables which act as a style sheet, and each individual paragraph stores only an index to one of the tables, like a style index.
There are two list tables in Word: the List table (destination \listtable), and the List Override table (destination \listoverridetable).
The first table Word stores is the List table. A List table is a list of lists (destination \list). Each list contains a number of list properties that pertain to the entire list, and a list of levels (destination \listlevel), each of which contains properties that pertain only to that level.
Control word | Meaning |
\listidN | Each list must have a unique list ID that should be randomly generated. The value N is a long integer. The list ID cannot be between -1 and -5. |
\listtemplateidN | Each list should have a unique template ID as well, which also should be randomly generated. The template ID cannot be -1. The value N is a long integer. |
\listsimpleN | 1 if the list has one level; 0 if the list has nine levels |
\listrestarthdnN | 1 if the list restarts at each section; 0 if not. Used for Word 7.0 compatibility only. |
\listname | The argument for \listname is a string that is the name of this list. Names allow ListNum fields to specify the list they belong to. This is a destination control word. |
Each list consists of either one or nine list levels depending upon whether the \listsimple flag is set. Each list level contains a number of properties that specify the formatting for that level, such as the start-at value, the text string surrounding the number, its justification and indents, and so on.
Control word | Meaning |
\levelstartatN | N specifies the start-at value for the level |
\levelnfcN | Specifies the number type for the level: 0Arabic (1, 2, 3) 1Uppercase Roman numeral (I, II, III) 2Lowercase Roman numeral (i, ii, iii) 3Uppercase letter (A, B, C) 4Lowercase letter (a, b, c) 5Ordinal number (1st, 2nd, 3rd) 6Cardinal text number (One, Two Three) 7Ordinal text number (First, Second, Third) 22Arabic with leading zero (01, 02, 03, ..., 10, 11) 23Bullet (no number at all) 255No number |
\leveljcN | 0Left justified 1Center justified 2Right justified |
\leveloldN | 1 if this level was converted from Word 6.0 or 7.0, 0 if it is a native Word 97 level. |
\levelprevN | 1 if this level includes the text from the previous level (used for Word 7.0 compatibility only); otherwise, the value is 0 . This keyword will only be valid if the \leveloldN keyword is emitted. |
\levelprevspaceN | 1 if this level includes the indentation from the previous level (used for Word 7.0 compatibility only); otherwise, the value is 0 . This keyword will only be valid if the \leveloldN keyword is emitted. |
\levelindentN | Minimum distance from the left indent to the start of the paragraph text (used for Word 7.0 compatibility only). This keyword will only be valid if the \leveloldN keyword is emitted. |
\levelspaceN | Minimum distance from the right edge of the number to the start of the paragraph text (used for Word 7.0 compatibility only). This keyword will only be valid if the \leveloldN keyword is emitted. |
\leveltext | The argument for this level should be the number format string for this level. The first character is the length of the string, and any numbers within the level should be replaced by the index of the level they represent. For example, a level three number such as “1.1.1.” would generate the following RTF: “{\leveltext \’06\’00.\’01.\’02.}” where the ’06 is the string length, the \’00, \’01, and \’02 are the level place holders, and the periods are the surrounding text. This is a destination control word. |
\levelnumbers | The argument for this destination should be a string that gives the offsets into the \leveltext of the level place holders. In the above example, “1.1.1.”, the \levelnumbers RTF should be
because the level place holders have indices 1, 3, and 5. This is a destination control word. |
\levelfollowN | Specifies which character follows the level text: 0Tab 1Space 2Nothing |
\levellegalN | 1 if any list numbers from previous levels should be converted to arabic numbers; 0 if they should be left with the format specified by their own level’s definition. |
\levelnorestartN | 1 if this level does not restart its count each time a number of a higher level is reached, 0 if this level does restart its count each time a number of a higher level is reached. |
In addition to all of these properties, each list level can contain any character properties (all of which affect all text for that level) and any combination of three paragraph properties: left indents, first line left indents, and tabs—each of which must be of a special type: jclisttab. These paragraph properties will be automatically applied to any paragraph in the list.
The List Override table is a list of list overrides (destination \listoverride). Each list override contains the listid of one of the lists in the List table, as well as a list of any properties it chooses to override. Each paragraph will contain a list override index (keyword ls) which is a 1-based index into this table. Most list overrides don’t override any properties—instead, they provide a level of indirection to a list. There are generally two types of list overrides: (1) formatting overrides, which allow a paragraph to be part of a list and are numbered along with the other members of the list, but have different formatting properties; and, (2) start-at overrides, which allow a paragraph to share the formatting properties of a list, but have a different start-at values. The first element in the document with each list override index takes the start-at value that the list override specifies as its value, while each subsequent element is assigned the number succeeding the previous element of the list.
List overrides have a few top-level keywords, including a \listoverridecount, which contains a count of the number of levels whose format is overridden. This \listoverridecount should always be either 1 or 9, depending upon whether the list to be overridden is simple or multilevel. All of the actual override information is stored within a list of list override levels (destination \lfolevel).
Control word | Meaning |
\listidN | Should exactly match the \listid of one of the lists in the List table. The value N is a long integer. |
\listoverridecountN | Number of list override levels within this list override (from 0 or 9). |
\ls | The (1-based) index of this \listoverride in the \listoverride table. This value should never be zero inside a \listoverride, and must be unique for all \listoverrides within a document. The valid values are from 1 to 2000. |
Each list override level contains flags to specify whether the formatting or start-at values are being overridden for each level. If the format flag (listoverrideformat) is given, the lfolevel should also contain a list level (listlevel). If the start-at flag (listoverridestart) is given, a start-at value must be provided. If the start-at is overridden but the format is not, then a levelstartat should be provided in the lfolevel itself. If both start-at and format are overridden, put the levelstartat inside the listlevel contained in the lfolevel.
Control word | Meaning |
\listoverridestartN | Should exactly match the listID of one of the lists in the List table. The value N is a long integer. |
\listoverrideformatN | Number of list override levels within this list override (should be either 1 or 9). |