RTF Appendices

retour au texte principal


APPENDIX A: SAMPLE RTF READER APPLICATION

The GC0165 disk included with this Application Note contains the sample RTF reader program RTFREADR.EXE, which will help you create an RTF reader for your own application when used in conjunction with the Microsoft Rich Text Format Specification and the information below.

Note The sample RTF reader is not a for-sale product, and Microsoft does not provide technical or any other type of support for the sample RTF reader code or the RTF specification.

How to Write an RTF Reader

There are three basic things that an RTF reader must do:

1. Separate text from RTF controls.

2. Parse an RTF control.

3. Dispatch an RTF control.

Separating text from RTF controls is relatively simple, because all RTF controls begin with a backslash. Therefore, any incoming character that is not a backslash is text and will be handled as text. (Of course, what one does with that text may be relatively complicated.)

Parsing an RTF control is also relatively simple. An RTF control is either (a) a sequence of alphabetic characters followed by an optional numeric parameter, or (b) a single non-alphanumeric character.

Dispatching an RTF control, on the other hand, is relatively complicated. A recursive-descent parser tends to be overly strict because RTF is intentionally vague about the order of various properties relative to one another. However, whatever method you use to dispatch an RTF control, your reader should do the following:

* Ignore control words you don't understand.

Many readers crash when they come across an unknown RTF control. Because Microsoft is continually adding new RTF controls, this limits an RTF reader to working with the RTF from one particular product (usually some version of Word for Windows).

* Always understand \*.

One of the most important things an RTF reader can do is to understand the \* control. This control introduces a destination that is not part of the document. It tells the RTF reader that if the reader does not understand the next control word, then it should skip the entire enclosing group. If your reader follows this rule and the one above, your reader will be able to cope with any future change to RTF short of a complete rewrite.

* Remember that binary data can occur when you're skipping RTF.

A simple way to skip a group in RTF is to keep a running count of the opening braces that the reader has encountered in the RTF stream. When the reader sees an opening brace, it increments the count; when the reader sees a closing brace, it decrements the count. When the count becomes negative, the end of the group has been found. Unfortunately, this doesn't work when the RTF file contains a \bin control; the reader must explicitly check each control word found to see if it's a \bin control, and, if a \bin control is found, skip that many bytes before resuming its scanning for braces.

A Sample RTF Reader Implementation

The Microsoft Word Processing Conversions group uses a table-driven approach to reading RTF. This approach allows the most flexibility in reading RTF, with the corresponding problem that it's difficult to detect incorrect RTF. An RTF reader that is based on this approach is presented below. This reader works exactly as described in the RTF specification and uses the principles of operation described in the RTF specification. This reader is designed to be simple to understand but is not intended to be very efficient. This RTF reader also implements the three design principles listed in the previous section.

The RTF reader consists of four files:

* Rtfdecl.h, which contains the prototypes for all the functions in the RTF reader

* Rtftype.h, which contains the types used in the RTF reader

* Rtfreadr.c, which contains the main program, the main loop of the RTF reader, and the RTF control parser

* Rtfactn.c, which contains the dispatch routines for the RTF reader

Rtfdecl.h and Rtfreadr.c

Rtfdecl.h is straightforward and requires little explanation.

rtfreadr.c is also reasonably straightforward; the function ecRtfParse separates text from RTF controls and handles text, and the function ecParseRtfKeyword parses an RTF control and also collects any parameter that follows the RTF control.

Rtftype.h

Rtftype.h begins by declaring a sample set of character, paragraph, section, and document properties. These structures are present to demonstrate how the dispatch routines can modify any particular property and are not actually used to format text.

For example, the following enumeration describes which destination text should be routed to:

typedef enum { rdsNorm, rdsSkip } RDS;

Because this is just a sample RTF reader, there are only two destinations; a more complicated reader would add an entry to this enumeration for each destination supported [for example, headers, footnotes, endnotes, comments (annotations), bookmarks, and pictures].

The following enumeration describes the internal state of the RTF parser:

typedef enum { risNorm, risBin, risHex } RIS;

This is entirely separate from the state of the dispatch routines and the destination state; other RTF readers may not necessarily have anything similar to this.

The following structure encapsulates the state that must be saved at a group start and restored at a group end:

typedef struct save
{
struct save *pNext;
CHP chp;
PAP pap;
SEP sep;
DOP dop;
RDS rds;
RIS ris;
} SAVE;

The following enumeration describes a set of classes for RTF controls:

typedef enum {kwdChar, kwdDest, kwdProp, kwdSpec} KWD;

Use kwdChar for controls that represent special characters (such as \-, \{, or \}).

Use kwdDest for controls that introduce RTF destinations.

Use kwdProp for controls that modify some sort of property.

Use kwdSpec for controls that need to run some specialized code.

The following enumeration defines the number of PROP structures (described below) that will be used. There will typically be an iprop for every field in the character, paragraph, section, and document properties.

typedef enum {ipropBold, ipropItalic, ipropUnderline, ipropLeftInd,
ipropRightInd, ipropFirstInd, ipropCols, ipropPgnX, ipropPgnY,
ipropXaPage, ipropYaPage, ipropXaLeft, ipropXaRight,
ipropYaTop, ipropYaBottom, ipropPgnStart, ipropSbk, 
ipropPgnFormat, ipropFacingp, ipropLandscape, ipropJust,
ipropPard, ipropPlain,
ipropMax} IPROP;

The following structure is a very compact way to describe how to locate the address of a particular value in one of the property structures:

typedef enum {actnSpec, actnByte, actnWord} ACTN;
typedef enum {propChp, propPap, propSep, propDop} PROPTYPE;
typedef struct propmod
{
ACTN actn;
PROPTYPE prop;
int offset;
} PROP;

The actn field describes the width of the value being described: if the value is a byte, then actn is actnByte; if the value is a word, then actn is actnWord; if the value is neither a byte nor a word, then you can use actnSpec to indicate that some C code needs to be run to set the value. The prop field indicates which property structure is being described; propChp indicates that the value is located within the CHP structure; propPap indicates that the value is located within the PAP structure, and so on. Finally, the offset field contains the offset of the value from the start of the structure. The offsetof() macro is usually used to initialize this field.

The following structure describes how to parse a particular RTF control:

typedef enum {ipfnBin, ipfnHex, ipfnSkipDest } IPFN;
typedef enum {idestPict, idestSkip } IDEST;
typedef struct symbol
{
char *szKeyword;
int dflt;
bool fPassDflt;
KWD kwd;
int idx;
} SYM;

szKeyword points to the RTF control being described; kwd describes the class of the particular RTF control (described above); dflt is the default value for this control, and fPassDflt should be nonzero if the value in dflt should be passed to the dispatch routine. (fPassDflt is only nonzero for control words that normally set a particular value. For example, the various section break controls typically have nonzero fPassDflt controls, but controls that take parameters should not.)

Idx is a generalized index; its use depends on the kwd being used for this control.

* If kwd is kwdChar, then idx is the character that should be output.

* If kwd is kwdDest, then idx is the idest for the new destination.

* If kwd is kwdProp, then idx is the iprop for the appropriate property.

* If kwd is kwdSpec, then idx is an ipfn for the appropriate function.

With this structure, it is very simple to dispatch an RTF control word. Once the reader isolates the RTF control word and its (possibly associated) value, the reader then searches an array of SYM structures to find the RTF control word. If the control word is not found, the reader ignores it, unless the previous control was \*, in which case the reader must scan past an entire group.

If the control word is found, the reader then uses the kwd value from the SYM structure to determine what to do. This is, in fact, exactly what the function ecTranslateKeyword in the file RTFACTN.C does.

Rtfactn.c

Rtfactn.c contains the tables describing the properties and control words, and the routines to evaluate properties (ecApplyPropChange) and to dispatch control words (ecTranslateKeyword).

The tables are the keys to understanding the RTF dispatch routines. The following are some sample entries from both tables, along with a brief explanation of each entry.

The Property Table. This table must have an entry for every iprop.

actnByte,   propChp,    offsetof(CHP, fBold),       // ipropBold

This property says that the ipropBold property is a byte parameter bound to chp.fBold.

actnWord,   propPap,    offsetof(PAP, xaRight),     // ipropRightInd

This property says that ipropRightInd is a word parameter bound to pap.xaRight.

actnWord,   propSep,    offsetof(SEP, cCols),       // ipropCols

This property says that ipropCols is a word parameter bound to sep.cCols.

actnSpec,   propChp,    0,                          // ipropPlain

This property says that ipropPlain is a special parameter. Instead of directly evaluating it, ecApplyPropChange will run some custom C code to apply a property change.

The Control Word Table.

"b",        1,      fFalse,     kwdProp,    ipropBold,

This structure says that the control \b sets the ipropBold property. Because fPassDflt is False, the reader only uses the default value if the control does not have a parameter. If no parameter is provided, the reader uses a value of 1.

"sbknone",  sbkNon, fTrue,      kwdProp,    ipropSbk,

This entry says that the control \sbknone sets the ipropSbk property. Because fPassDflt is True, the reader always uses the default value of sbkNon, even if the control has a parameter.

"par",      0,      fFalse,     kwdChar,    0x0a,

This entry says that the control \par is equivalent to a 0x0a (linefeed) character.

"tab",      0,      fFalse,     kwdChar,    0x09,

This entry says that the control \tab is equivalent to a 0x09 (tab) character.

"bin",      0,      fFalse,     kwdSpec,    ipfnBin,

This entry says that the control \bin should run some C code. The particular piece of C code can be located by the ipfnBin parameter.

"fonttbl",  0,      fFalse,     kwdDest,    idestSkip,

This entry says that the control \fonttbl should change to the destination idestSkip.

Notes on Implementing Other RTF Features

The table-driven approach to dispatching RTF controls used by the sample converter does not implement any syntax checking. For most controls, this is not a problem; a control simply modifies the appropriate property. However, some controls, such as those for tabs and borders, are dependent on other control words either before or after the current control word.

There are some standard techniques for handling these features.

Tabs and Other Control Sequences Terminating in a Fixed Control

The best way to implement these types of control sequences is to have a global structure that represents the current state of the tab descriptor (or other entity). As the modifiers come in, they modify the various fields of the global structure. When the fixed control at the end of the sequence is dispatched, it adds the entire descriptor and reinitializes the global variable.

Borders and Other Control Sequences Beginning with a Fixed Control

The best way to implement these types of control sequences is to have a global pointer that is initialized when the fixed control is dispatched. The controls that modify the fixed control then modify fields pointed to by the control.

Other Problem Areas in RTF

Style Sheets

Style sheets can be handled as destinations; however, styles have default values, just as every other control does. RTF readers should be sure to handle a missing style control as the default style value (that is, 0).

Property Changes

Some RTF readers use various bits of RTF syntax to mark property changes. In particular, they assume that property changes will occur only after a group start, which is not correct. Because there is a variety of ways to represent identical property changes in RTF, RTF readers should look at the changes in the properties and not at any particular way of representing a property change. In particular, properties can be changed explicitly with a control word or implicitly at the end of a group. For example, these three sequences of RTF have exactly the same semantics, and should be translated identically:

*	{\b bold \i Bold Italic \i0 Bold again}
*	{\b bold {\i Bold Italic }Bold again}
*	{\b bold \i Bold Italic \plain\b Bold again}

Fields

All versions of Microsoft Word for Windows and version 6.0 and later of Microsoft Word for the Macintosh have fields. If you're writing an RTF reader and expect to do anything with fields, keep the following notes in mind:

* Field instructions may have arbitrary amounts of character formatting and arbitrarily nested groups. While the groups will be properly nested within the field instructions, you may be inside an arbitrary number of groups by the time you know which field you are working with. If you then expect to be able to skip to the end of the field instructions, you'll have to know how many groups have started so that you can skip to the end properly.

* Some fields, the INCLUDE field in particular, can have section breaks in the field results. If this occurs, then the text after the end of the field does not have the same section properties as the text at the start of the field; the section properties must not be restored when the field results contain section breaks.

Tables

Tables are probably the trickiest part of RTF to read and write correctly. Because of the way Microsoft word processors implement tables, and the table-driven approach of many Microsoft RTF readers, it is very easy to write tables in RTF that will crash Microsoft word processors when you try to read the RTF. Here are some guidelines to reduce problems with tables in RTF:

* Place the entire table definition before any paragraph properties, including \pard.

* Make sure the number of cells in the RTF matches the number of cell definitions.

* Some controls must be the same in all paragraphs in a row. In particular, all paragraphs in a row must have the same positioning controls, and all paragraphs in a row must have \intbl specified.

* Do not use the \sbys control inside a table. \sbys is a holdover from Word for MS-DOS and early versions of Word for the Macintosh. Word for Windows and current versions of Word for the Macintosh translate \sbys as a table. Because Word for Windows and Word for the Macintosh do not support nested tables, these products will probably crash if you specify \sbys in a table.

* Cell definitions starting before the left margin of the paper begins (that is, the parameter plus the left margin is negative) are always in error.

* Even though nested tables are not explicitly defined in RTF, and Word for Windows and Word for the Macintosh do not support nested tables, you must still save table properties when changing destinations because tables can be nested inside other destinations--that is, you can have a table that contains a footnote or an annotation, and the footnote or annotation can contain another table.

Appendix A-1: Listings

Rtfdecl.h

// RTF parser declarations
int ecRtfParse(FILE *fp);
int ecPushRtfState(void);
int ecPopRtfState(void);
int ecParseRtfKeyword(FILE *fp);
int ecParseChar(int c);
int ecTranslateKeyword(char *szKeyword, int param, bool fParam);
int ecPrintChar(int ch);
int ecEndGroupAction(RDS rds);
int ecApplyPropChange(IPROP iprop, int val);
int ecChangeDest(IDEST idest);
int ecParseSpecialKeyword(IPFN ipfn);
int ecParseSpecialProperty(IPROP iprop, int val);
int ecParseHexByte(void);
// RTF variable declarations
extern int cGroup;
extern RDS rds;
extern RIS ris;
extern CHP chp;
extern PAP pap;
extern SEP sep;
extern DOP dop;
extern SAVE *psave;
extern long cbBin;
extern long lParam;
extern bool fSkipDestIfUnk;
extern FILE *fpIn;
// RTF parser error codes
#define ecOK 0                      // Everything's fine!
#define ecStackUnderflow    1       // Unmatched '}'
#define ecStackOverflow     2       // Too many '{' -- memory exhausted
#define ecUnmatchedBrace    3       // RTF ended during an open group.
#define ecInvalidHex        4       // invalid hex character found in data
#define ecBadTable          5       // RTF table (sym or prop) invalid
#define ecAssertion         6       // Assertion failure
#define ecEndOfFile         7       // End of file reached while reading RTF

Rtftype.h

typedef char bool;
#define fTrue 1
#define fFalse 0
typedef struct char_prop
{
    char fBold;
    char fUnderline;
    char fItalic;
} CHP;                  // CHaracter Properties
typedef enum {justL, justR, justC, justF } JUST;
typedef struct para_prop
{
    int xaLeft;                 // left indent in twips
    int xaRight;                // right indent in twips
    int xaFirst;                // first line indent in twips
    JUST just;                  // justification
} PAP;                  // PAragraph Properties
typedef enum {sbkNon, sbkCol, sbkEvn, sbkOdd, sbkPg} SBK;
typedef enum {pgDec, pgURom, pgLRom, pgULtr, pgLLtr} PGN;
typedef struct sect_prop
{
    int cCols;                  // number of columns
    SBK sbk;                    // section break type
    int xaPgn;                  // x position of page number in twips
    int yaPgn;                  // y position of page number in twips
    PGN pgnFormat;              // how the page number is formatted
} SEP;                  // SEction Properties
typedef struct doc_prop
{
    int xaPage;                 // page width in twips
    int yaPage;                 // page height in twips
    int xaLeft;                 // left margin in twips
    int yaTop;                  // top margin in twips
    int xaRight;                // right margin in twips
    int yaBottom;               // bottom margin in twips
    int pgnStart;               // starting page number in twips
    char fFacingp;              // facing pages enabled?
    char fLandscape;            // landscape or portrait??
} DOP;                  // DOcument Properties
typedef enum { rdsNorm, rdsSkip } RDS;              // Rtf Destination State
typedef enum { risNorm, risBin, risHex } RIS;       // Rtf Internal State
typedef struct save             // property save structure
{
    struct save *pNext;         // next save
    CHP chp;
    PAP pap;
    SEP sep;
    DOP dop;
    RDS rds;
    RIS ris;
} SAVE;
// What types of properties are there?
typedef enum {ipropBold, ipropItalic, ipropUnderline, ipropLeftInd,
              ipropRightInd, ipropFirstInd, ipropCols, ipropPgnX,
              ipropPgnY, ipropXaPage, ipropYaPage, ipropXaLeft,
              ipropXaRight, ipropYaTop, ipropYaBottom, ipropPgnStart,
              ipropSbk, ipropPgnFormat, ipropFacingp, ipropLandscape,
              ipropJust, ipropPard, ipropPlain, ipropSectd,
              ipropMax } IPROP;
typedef enum {actnSpec, actnByte, actnWord} ACTN;
typedef enum {propChp, propPap, propSep, propDop} PROPTYPE;
typedef struct propmod
{
    ACTN actn;              // size of value
    PROPTYPE prop;          // structure containing value
    int  offset;            // offset of value from base of structure
} PROP;
typedef enum {ipfnBin, ipfnHex, ipfnSkipDest } IPFN;
typedef enum {idestPict, idestSkip } IDEST;
typedef enum {kwdChar, kwdDest, kwdProp, kwdSpec} KWD;
typedef struct symbol
{
    char *szKeyword;        // RTF keyword
    int  dflt;              // default value to use
    bool fPassDflt;         // true to use default value from this table
    KWD  kwd;               // base action to take
    int  idx;               // index into property table if kwd == kwdProp
                            // index into destination table if kwd == kwdDest
                            // character to print if kwd == kwdChar
} SYM;

Rtfreadr.c

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include "rtftype.h"
#include "rtfdecl.h"
int cGroup;
bool fSkipDestIfUnk;
long cbBin;
long lParam;
RDS rds;
RIS ris;
CHP chp;
PAP pap;
SEP sep;
DOP dop;
SAVE *psave;
FILE *fpIn;
//
// %%Function: main
//
// Main loop. Initialize and parse RTF.
//
main(int argc, char *argv[])
{
    FILE *fp;
    int ec;
    fp = fpIn = fopen("test.rtf", "r");
    if (!fp)
    {
        printf ("Can't open test file!\n");
        return 1;
    }
    if ((ec = ecRtfParse(fp)) != ecOK)
        printf("error %d parsing rtf\n", ec);
    else
        printf("Parsed RTF file OK\n");
    fclose(fp);
    return 0;
}
//
// %%Function: ecRtfParse
//
// Step 1:
// Isolate RTF keywords and send them to ecParseRtfKeyword;
// Push and pop state at the start and end of RTF groups;
// Send text to ecParseChar for further processing.
//
int
ecRtfParse(FILE *fp)
{
    int ch;
    int ec;
    int cNibble = 2;
    int b = 0;
    while ((ch = getc(fp)) != EOF)
    {
        if (cGroup < 0)
            return ecStackUnderflow;
        if (ris == risBin)                      // if we're parsing binary data, handle it directly
        {
            if ((ec = ecParseChar(ch)) != ecOK)
                return ec;
        }
        else
        {
            switch (ch)
            {
            case '{':
                if ((ec = ecPushRtfState()) != ecOK)
                    return ec;
                break;
            case '}':
                if ((ec = ecPopRtfState()) != ecOK)
                    return ec;
                break;
            case '\\':
                if ((ec = ecParseRtfKeyword(fp)) != ecOK)
                    return ec;
                break;
            case 0x0d:
            case 0x0a:          // cr and lf are noise characters...
                break;
            default:
                if (ris == risNorm)
                {
                    if ((ec = ecParseChar(ch)) != ecOK)
                        return ec;
                }
                else
                {               // parsing hex data
                    if (ris != risHex)
                        return ecAssertion;
                    b = b << 4;
                    if (isdigit(ch))
                        b += (char) ch - '0';
                    else
                    {
                        if (islower(ch))
                        {
                            if (ch < 'a' || ch > 'f')
                                return ecInvalidHex;
                            b += (char) ch - 'a';
                        }
                        else
                        {
                            if (ch < 'A' || ch > 'F')
                                return ecInvalidHex;
                            b += (char) ch - 'A';
                        }
                    }
                    cNibble--;
                    if (!cNibble)
                    {
                        if ((ec = ecParseChar(b)) != ecOK)
                            return ec;
                        cNibble = 2;
                        b = 0;
ris = risNorm;
                    }
                }                   // end else (ris != risNorm)
                break;
            }       // switch
        }           // else (ris != risBin)
    }               // while
    if (cGroup < 0)
        return ecStackUnderflow;
    if (cGroup > 0)
        return ecUnmatchedBrace;
    return ecOK;
}
//
// %%Function: ecPushRtfState
//
// Save relevant info on a linked list of SAVE structures.
//
int
ecPushRtfState(void)
{
    SAVE *psaveNew = malloc(sizeof(SAVE));
    if (!psaveNew)
        return ecStackOverflow;
    psaveNew -> pNext = psave;
    psaveNew -> chp = chp;
    psaveNew -> pap = pap;
    psaveNew -> sep = sep;
    psaveNew -> dop = dop;
    psaveNew -> rds = rds;
    psaveNew -> ris = ris;
    ris = risNorm;
    psave = psaveNew;
    cGroup++;
    return ecOK;
}
//
// %%Function: ecPopRtfState
//
// If we're ending a destination (that is, the destination is changing),
// call ecEndGroupAction.
// Always restore relevant info from the top of the SAVE list.
//
int
ecPopRtfState(void)
{
    SAVE *psaveOld;
    int ec;
    if (!psave)
        return ecStackUnderflow;
    if (rds != psave->rds)
    {
        if ((ec = ecEndGroupAction(rds)) != ecOK)
            return ec;
    }
    chp = psave->chp;
    pap = psave->pap;
    sep = psave->sep;
    dop = psave->dop;
    rds = psave->rds;
    ris = psave->ris;
    psaveOld = psave;
    psave = psave->pNext;
    cGroup--;
    free(psaveOld);
    return ecOK;
}
//
// %%Function: ecParseRtfKeyword
//
// Step 2:
// get a control word (and its associated value) and
// call ecTranslateKeyword to dispatch the control.
//
int
ecParseRtfKeyword(FILE *fp)
{
    int ch;
    char fParam = fFalse;
    char fNeg = fFalse;
    int param = 0;
    char *pch;
    char szKeyword[30];
    char szParameter[20];
    szKeyword[0] = '\0';
    szParameter[0] = '\0';
    if ((ch = getc(fp)) == EOF)
        return ecEndOfFile;
    if (!isalpha(ch))           // a control symbol; no delimiter.
    {
        szKeyword[0] = (char) ch;
        szKeyword[1] = '\0';
        return ecTranslateKeyword(szKeyword, 0, fParam);
    }
    for (pch = szKeyword; isalpha(ch); ch = getc(fp))
        *pch++ = (char) ch;
    *pch = '\0';
    if (ch == '-')
    {
        fNeg  = fTrue;
        if ((ch = getc(fp)) == EOF)
            return ecEndOfFile;
    }
    if (isdigit(ch))
    {
        fParam = fTrue;         // a digit after the control means we have a parameter
        for (pch = szParameter; isdigit(ch); ch = getc(fp))
            *pch++ = (char) ch;
        *pch = '\0';
        param = atoi(szParameter);
        if (fNeg)
            param = -param;
        lParam = atol(szParameter);
        if (fNeg)
            param = -param;
    }
    if (ch != ' ')
        ungetc(ch, fp);
    return ecTranslateKeyword(szKeyword, param, fParam);
}
//
// %%Function: ecParseChar
//
// Route the character to the appropriate destination stream.
//
int
ecParseChar(int ch)
{
    if (ris == risBin && --cbBin <= 0)
        ris = risNorm;
    switch (rds)
    {
    case rdsSkip:
        // Toss this character.
        return ecOK;
    case rdsNorm:
        // Output a character. Properties are valid at this point.
        return ecPrintChar(ch);
    default:
    // handle other destinations....
        return ecOK;
    }
}
//
// %%Function: ecPrintChar
//
// Send a character to the output file.
//
int
ecPrintChar(int ch)
{
    // unfortunately, we don't do a whole lot here as far as layout goes...
    putchar(ch);
    return ecOK;
}RTFACTN.C
#include <stdio.h>
#include <string.h>
#include <stddef.h>
#include <ctype.h>
#include "rtftype.h"
#include "rtfdecl.h"
// RTF parser tables
// Property descriptions
PROP rgprop [ipropMax] = {
    actnByte,   propChp,    offsetof(CHP, fBold),       // ipropBold
    actnByte,   propChp,    offsetof(CHP, fItalic),     // ipropItalic
    actnByte,   propChp,    offsetof(CHP, fUnderline),  // ipropUnderline
    actnWord,   propPap,    offsetof(PAP, xaLeft),      // ipropLeftInd
    actnWord,   propPap,    offsetof(PAP, xaRight),     // ipropRightInd
    actnWord,   propPap,    offsetof(PAP, xaFirst),     // ipropFirstInd
    actnWord,   propSep,    offsetof(SEP, cCols),       // ipropCols
    actnWord,   propSep,    offsetof(SEP, xaPgn),       // ipropPgnX
    actnWord,   propSep,    offsetof(SEP, yaPgn),       // ipropPgnY
    actnWord,   propDop,    offsetof(DOP, xaPage),      // ipropXaPage
    actnWord,   propDop,    offsetof(DOP, yaPage),      // ipropYaPage
    actnWord,   propDop,    offsetof(DOP, xaLeft),      // ipropXaLeft
    actnWord,   propDop,    offsetof(DOP, xaRight),     // ipropXaRight
    actnWord,   propDop,    offsetof(DOP, yaTop),       // ipropYaTop
    actnWord,   propDop,    offsetof(DOP, yaBottom),    // ipropYaBottom
    actnWord,   propDop,    offsetof(DOP, pgnStart),    // ipropPgnStart
    actnByte,   propSep,    offsetof(SEP, sbk),         // ipropSbk
    actnByte,   propSep,    offsetof(SEP, pgnFormat),   // ipropPgnFormat
    actnByte,   propDop,    offsetof(DOP, fFacingp),    // ipropFacingp
    actnByte,   propDop,    offsetof(DOP, fLandscape),  // ipropLandscape
    actnByte,   propPap,    offsetof(PAP, just),        // ipropJust
    actnSpec,   propPap,    0,                          // ipropPard
    actnSpec,   propChp,    0,                          // ipropPlain
    actnSpec,   propSep,    0,                          // ipropSectd
};
// Keyword descriptions
SYM rgsymRtf[] = {
//  keyword     dflt    fPassDflt   kwd         idx
    "b",        1,      fFalse,     kwdProp,    ipropBold,
    "u",        1,      fFalse,     kwdProp,    ipropUnderline,
    "i",        1,      fFalse,     kwdProp,    ipropItalic,
    "li",       0,      fFalse,     kwdProp,    ipropLeftInd,
    "ri",       0,      fFalse,     kwdProp,    ipropRightInd,
    "fi",       0,      fFalse,     kwdProp,    ipropFirstInd,
    "cols",     1,      fFalse,     kwdProp,    ipropCols,
    "sbknone",  sbkNon, fTrue,      kwdProp,    ipropSbk,
    "sbkcol",   sbkCol, fTrue,      kwdProp,    ipropSbk,
    "sbkeven",  sbkEvn, fTrue,      kwdProp,    ipropSbk,
    "sbkodd",   sbkOdd, fTrue,      kwdProp,    ipropSbk,
    "sbkpage",  sbkPg,  fTrue,      kwdProp,    ipropSbk,
    "pgnx",     0,      fFalse,     kwdProp,    ipropPgnX,
    "pgny",     0,      fFalse,     kwdProp,    ipropPgnY,
    "pgndec",   pgDec,  fTrue,      kwdProp,    ipropPgnFormat,
    "pgnucrm",  pgURom, fTrue,      kwdProp,    ipropPgnFormat,
    "pgnlcrm",  pgLRom, fTrue,      kwdProp,    ipropPgnFormat,
    "pgnucltr", pgULtr, fTrue,      kwdProp,    ipropPgnFormat,
    "pgnlcltr", pgLLtr, fTrue,      kwdProp,    ipropPgnFormat,
    "qc",       justC,  fTrue,      kwdProp,    ipropJust,
    "ql",       justL,  fTrue,      kwdProp,    ipropJust,
    "qr",       justR,  fTrue,      kwdProp,    ipropJust,
    "qj",       justF,  fTrue,      kwdProp,    ipropJust,
    "paperw",   12240,  fFalse,     kwdProp,    ipropXaPage,
    "paperh",   15480,  fFalse,     kwdProp,    ipropYaPage,
    "margl",    1800,   fFalse,     kwdProp,    ipropXaLeft,
    "margr",    1800,   fFalse,     kwdProp,    ipropXaRight,
    "margt",    1440,   fFalse,     kwdProp,    ipropYaTop,
    "margb",    1440,   fFalse,     kwdProp,    ipropYaBottom,
    "pgnstart", 1,      fTrue,      kwdProp,    ipropPgnStart,
    "facingp",  1,      fTrue,      kwdProp,    ipropFacingp,
    "landscape",1,      fTrue,      kwdProp,    ipropLandscape,
    "par",      0,      fFalse,     kwdChar,    0x0a,
    "\0x0a",    0,      fFalse,     kwdChar,    0x0a,
    "\0x0d",    0,      fFalse,     kwdChar,    0x0a,
    "tab",      0,      fFalse,     kwdChar,    0x09,
    "ldblquote",0,      fFalse,     kwdChar,    '"',
    "rdblquote",0,      fFalse,     kwdChar,    '"',
    "bin",      0,      fFalse,     kwdSpec,    ipfnBin,
    "*",        0,      fFalse,     kwdSpec,    ipfnSkipDest,
    "'",        0,      fFalse,     kwdSpec,    ipfnHex,
    "author",   0,      fFalse,     kwdDest,    idestSkip,
    "buptim",   0,      fFalse,     kwdDest,    idestSkip,
    "colortbl", 0,      fFalse,     kwdDest,    idestSkip,
    "comment",  0,      fFalse,     kwdDest,    idestSkip,
    "creatim",  0,      fFalse,     kwdDest,    idestSkip,
    "doccomm",  0,      fFalse,     kwdDest,    idestSkip,
    "fonttbl",  0,      fFalse,     kwdDest,    idestSkip,
    "footer",   0,      fFalse,     kwdDest,    idestSkip,
    "footerf",  0,      fFalse,     kwdDest,    idestSkip,
    "footerl",  0,      fFalse,     kwdDest,    idestSkip,
    "footerr",  0,      fFalse,     kwdDest,    idestSkip,
    "footnote", 0,      fFalse,     kwdDest,    idestSkip,
    "ftncn",    0,      fFalse,     kwdDest,    idestSkip,
    "ftnsep",   0,      fFalse,     kwdDest,    idestSkip,
    "ftnsepc",  0,      fFalse,     kwdDest,    idestSkip,
    "header",   0,      fFalse,     kwdDest,    idestSkip,
    "headerf",  0,      fFalse,     kwdDest,    idestSkip,
    "headerl",  0,      fFalse,     kwdDest,    idestSkip,
    "headerr",  0,      fFalse,     kwdDest,    idestSkip,
    "info",     0,      fFalse,     kwdDest,    idestSkip,
    "keywords", 0,      fFalse,     kwdDest,    idestSkip,
    "operator", 0,      fFalse,     kwdDest,    idestSkip,
    "pict",     0,      fFalse,     kwdDest,    idestSkip,
    "printim",  0,      fFalse,     kwdDest,    idestSkip,
    "private1", 0,      fFalse,     kwdDest,    idestSkip,
    "revtim",   0,      fFalse,     kwdDest,    idestSkip,
    "rxe",      0,      fFalse,     kwdDest,    idestSkip,
    "stylesheet",   0,      fFalse,     kwdDest,    idestSkip,
    "subject",  0,      fFalse,     kwdDest,    idestSkip,
    "tc",       0,      fFalse,     kwdDest,    idestSkip,
    "title",    0,      fFalse,     kwdDest,    idestSkip,
    "txe",      0,      fFalse,     kwdDest,    idestSkip,
    "xe",       0,      fFalse,     kwdDest,    idestSkip,
    "{",        0,      fFalse,     kwdChar,    '{',
    "}",        0,      fFalse,     kwdChar,    '}',
    "\\",       0,      fFalse,     kwdChar,    '\\'
    };
int isymMax = sizeof(rgsymRtf) / sizeof(SYM);
//
// %%Function: ecApplyPropChange
//
// Set the property identified by _iprop_ to the value _val_.
//
//
int
ecApplyPropChange(IPROP iprop, int val)
{
    char *pb;
    if (rds == rdsSkip)                 // If we're skipping text,
        return ecOK;                    // don't do anything.
    switch (rgprop[iprop].prop)
    {
    case propDop:
        pb = (char *)&dop;
        break;
    case propSep:
        pb = (char *)&sep;
        break;
    case propPap:
        pb = (char *)&pap;
        break;
    case propChp:
        pb = (char *)&chp;
        break;
    default:
        if (rgprop[iprop].actn != actnSpec)
            return ecBadTable;
        break;
    }
    switch (rgprop[iprop].actn)
    {
    case actnByte:
        pb[rgprop[iprop].offset] = (unsigned char) val;
        break;
    case actnWord:
        (*(int *) (pb+rgprop[iprop].offset)) = val;
        break;
    case actnSpec:
        return ecParseSpecialProperty(iprop, val);
        break;
    default:
        return ecBadTable;
    }
    return ecOK;
}
//
// %%Function: ecParseSpecialProperty
//
// Set a property that requires code to evaluate.
//
int
ecParseSpecialProperty(IPROP iprop, int val)
{
    switch (iprop)
    {
    case ipropPard:
        memset(&pap, 0, sizeof(pap));
        return ecOK;
    case ipropPlain:
        memset(&chp, 0, sizeof(chp));
        return ecOK;
    case ipropSectd:
        memset(&sep, 0, sizeof(sep));
        return ecOK;
    default:
        return ecBadTable;
    }
    return ecBadTable;
}
//
// %%Function: ecTranslateKeyword.
//
// Step 3.
// Search rgsymRtf for szKeyword and evaluate it appropriately.
//
// Inputs:
// szKeyword:   The RTF control to evaluate.
// param:       The parameter of the RTF control.
// fParam:      fTrue if the control had a parameter; (that is, if param is valid)
//              fFalse if it did not.
//
int
ecTranslateKeyword(char *szKeyword, int param, bool fParam)
{
    int isym;
    // search for szKeyword in rgsymRtf
    for (isym = 0; isym < isymMax; isym++)
        if (strcmp(szKeyword, rgsymRtf[isym].szKeyword) == 0)
            break;
    if (isym == isymMax)            // control word not found
    {
        if (fSkipDestIfUnk)         // if this is a new destination
            rds = rdsSkip;          // skip the destination
                                    // else just discard it
        fSkipDestIfUnk = fFalse;
        return ecOK;
    }
    // found it!  use kwd and idx to determine what to do with it.
    fSkipDestIfUnk = fFalse;
    switch (rgsymRtf[isym].kwd)
    {
    case kwdProp:
        if (rgsymRtf[isym].fPassDflt || !fParam)
            param = rgsymRtf[isym].dflt;
        return ecApplyPropChange(rgsymRtf[isym].idx, param);
    case kwdChar:
        return ecParseChar(rgsymRtf[isym].idx);
    case kwdDest:
        return ecChangeDest(rgsymRtf[isym].idx);
    case kwdSpec:
        return ecParseSpecialKeyword(rgsymRtf[isym].idx);
    default:
        return ecBadTable;
    }
    return ecBadTable;
}
//
// %%Function: ecChangeDest
//
// Change to the destination specified by idest.
// There's usually more to do here than this...
//
int
ecChangeDest(IDEST idest)
{
    if (rds == rdsSkip)             // if we're skipping text,
        return ecOK;                // don't do anything
    switch (idest)
    {
    default:
        rds = rdsSkip;              // when in doubt, skip it...
        break;
    }
    return ecOK;
}
//
// %%Function: ecEndGroupAction
//
// The destination specified by rds is coming to a close.
// If there's any cleanup that needs to be done, do it now.
//
int
ecEndGroupAction(RDS rds)
{
    return ecOK;
}
//
// %%Function: ecParseSpecialKeyword
//
// Evaluate an RTF control that needs special processing.
//
int
ecParseSpecialKeyword(IPFN ipfn)
{
    if (rds == rdsSkip && ipfn != ipfnBin)  // if we're skipping, and it's not
        return ecOK;                        // the \bin keyword, ignore it.
    switch (ipfn)
    {
    case ipfnBin:
        ris = risBin;
        cbBin = lParam;
        break;
    case ipfnSkipDest:
        fSkipDestIfUnk = fTrue;
        break;
    case ipfnHex:
 ris = risHex;
 break;
    default:
        return ecBadTable;
    }
    return ecOK;
}

Makefile

rtfreadr.exe: rtfactn.obj rtfreadr.obj
    link rtfreadr.obj rtfactn.obj <nul
rtfactn.obj: rtfactn.c rtfdecl.h rtftype.h
rtfreadr.obj: rtfreadr.c rtfdecl.h rtftype.h

APPENDIX B: WORD (ASIAN VERSIONS) TEXT FORMAT

This appendix contains the changes to the Rich Text Format (RTF) specification for the Japanese version of Word (all platforms). In this section, Word J refers to the Japanese version of Word and RTF-J refers to the RTF specification described below. This document also contains some information about the interpretation of RTF-J and some behaviors of Word J.

This appendix is meant to be used in conjunction with the full RTF specification, assumes you have read the rest of this document, and does not contain the necessary information to implement an RTF reader or writer by itself. If you have any questions, please refer to the main specification first.

RTF-J

There is a Japanese local RTF specification, called RTF-J, that is somewhat different from the standard RTF specification. Although Word 7.0 J does not write RTF-J, it can read RTF-J files. It retains the text strings in the file and disregards unknown control words.

Escaped Expressions

An escape expression (for example, \'hh, \\, or \{) is usable in all RTF control words.

Writer:

In general RTF should be written out with all characters above 0x80 in the escaped form, \'hh.
Character code Write out as
0x00 <= ch < 0x20 Escaped (\'hh)
0x20 <= ch < 0x80 Raw (non-escaped) character
0x80 <= ch <= 0xFF Escaped (\'hh)

For compatibility, there is an RTFParam option in the HKEY_CURRENT_USERF\Software\Microsoft\Word\7.0FE\ section of the registry database that determines whether raw 8-bit characters or escaped characters are used for the double-byte characters in \stylesheet, \fonttbl, \bkmkstart, and \bkmkend. This option is valid only when writing out the RTF; it does not affect RTF reading behavior.

[Microsoft Word] RTFParam=7 (the default) uses an escaped expression when the character is above 0x80. RTFParam=8 uses raw 8-bit characters for \stylesheet, \fonttbl, \bkmkstart, and \bkmkend (does not escape even if trailing-byte was an RTF special character such as \, {, or }).

Reader:

When the RTF reader encounters raw characters in the leading-byte range of the double-byte character, it regards the next character as the trailing byte of the double-byte character and combines the two characters into one double-byte character.
Leading byte Trailing byte Validity
Escaped Raw (0x20 <= ch <= 0x7f) Valid (standard format for double-byte character)
Escaped Escaped (other) Valid (standard format for double-byte character)
Raw Raw Valid (RTF-J format for double-byte character)
Raw Escaped Invalid

Character Set

Word J specifies the character set in the font table using \fcharset. Word J interprets \cpg437 as \fcharset0 and \cpg932 as \fcharset128 if it encounters these control words when reading RTF. If both \fcharset and \cpg appear in the font table, \cpg is ignored.

Character Mapping

Word maps single-byte characters according to character set information (for example, Macintosh to ANSI) and leaves double-byte characters unmapped.

Font Family

RTF-J control words Definition and the interpretation in Word
\jis RTF-J uses \jis as a control word for character set. Word J interprets this as \ansi, which is the default character set used if the character set is not defined.
\fjminchou and \fjgothic RTF-J uses \fjminchou and \fjgothic to specify font family. Word J interprets these as \fnil, which is the default font family.

ShiftJIS Font Without \cpg or \fcharset

If \cpg or \fcharset control words are not present, Word J uses the text metrics of the font before determining the character set of these fonts. If the font is unknown, Word J assumes it is SHIFTJIS_CHARSET.

Composite Fonts (Associated Fonts for International Runs)

Word J defines control words to specify composite fonts as associated character properties. These control words follow the rule of associated character properties and understand font designation (\af). All other <aprops> are ignored in Word J.
<atext> <losbrun> | <hisbrun> | <dbrun>
<losbrun> \hich \af & <aprops> \dbch \af & <aprops> \loch <ptext>
<hisbrun> \loch \af & <aprops> \dbch \af & <aprops> \hich <ptext>
<dbrun> \loch \af & <aprops> \hich \af & <aprops> \dbch <ptext>
Control word Definition
\loch Specifies a run of the characters in the low-ANSI (0x00-0x7F) area.
\hich For the characters in the high-ANSI (0x80--0xFF) area.
\dbch Specifies a run of the double-byte characters.

Word J writes out associated character properties in the styles. In the style sheet, the <dbrun> definition should be used for compatibility with applications that have transparent readers.

{\stylesheet{\loch\af5\hich\af5\dbch\f27\fs20\snext0 Normal;}}

If the composite font definition matches the style, only the control word (\loch, \hich, or \dbch) will be used to distinguish the type of run, along with the font information for transparent readers.

{\fonttbl{\f5\fswiss\fcharset0\fprq2 Arial;}{\f27\froman\fcharset128\fprq1 Mincho;}}
{\stylesheet{\loch\af5\hich\af5\dbch\f27\fs20\snext0 Normal;}}
\pard\plain
{\dbch\f27\fs20 \'82\'b1\'82\'ea\'82\'cd}
{\loch\f5 Test }
{\dbch\f27\'82\'c5\'82\'b7\'81B}
\par}

If one or all of \loch, \hich, and \dbch are missing from the style sheet definition (or the character set doesn't match), Word J will apply appropriate fonts to each character run in the style using the bulleted rules below.
Control word Font that Word J will apply
\loch Same font as \f.
\hich Any font whose character set is ANSI_CHARSET.
\dbch Any font whose character set is SHIFTJIS_CHARSET.

If the composite font control words are missing from the character run, Word J will interpret all characters below 0x80 as a \loch run. Characters above or equal to 0x80 will be determined using the following rules:

If the character is in the leading-byte range and the next character is in the trailing-byte range of a double-byte character, it will be treated as a \dbch run (one double-byte character). For example:

\'99\'47à

If the character is in the leading-byte range of a double-byte character but the next character is not in the trailing-byte range, it will be treated as a \hich run (two high-ANSI or low-ANSI characters). For example:

\'99\'FFàÿ

If the character is in the leading-byte range of a double-byte character and is the last character in the run, it will be treated as a \hich run (one high-ANSI character). For example:

\'99\parà

If the character is not in the leading-byte range of a double-byte character, it will be treated as a \hich run (one high-ANSI character). For example:

\'FFàÿ

New Control Words Created by Word 6J

Control word Description

Associated Character Properties

\loch The text consists of single-byte low-ANSI (0x00-0x7F) characters.
\hich The text consists of single-byte high-ANSI (0x80-0xFF) characters.
\dbch The text consists of double-byte characters.

Borders

\brdrdash Dashed border.
\brdrdashd Dash-dotted border.
\brdrdashdd Dash-dot-dotted border.

Character Properties

\uldash Dashed underline.
\uldashd Dash-dotted underline.
\uldashdd Dash-dot-dotted underline.
\ulhair Hairline underline.
\ulth Thick underline.
\ulwave Wave underline.
\accnone No accent characters (over dot / over comma).
\accdot Over dot accent.
\acccomma Over comma accent.
\charscalex Character width scaling.
\striked Double strikethrough.

Document Formatting Properties

\horzdoc Horizontal rendering.
\vertdoc Vertical rendering.
\*\fchars List of following kinsoku characters.
\*\lchars List of leading kinsoku characters.
\jcompress Compressing justification (default).
\jexpand Expanding justification.
\gutterprl Parallel gutter.
\dgsnap Snap to grid.
\dghspaceN Grid horizontal spacing in twips (the default is 120).
\dgvspaceN Grid vertical spacing in twips (the default is 120).
\dghoriginN Grid horizontal origin in twips (the default is 1701).
\dgvoriginN Grid vertical origin in twips (the default is 1984).
\dghshowN Show Nth horizontal grid (the default is 3).
\dgvshowN Show Nth vertical grid (the default is 0).
\twoonone Print two logical pages on one physical page.
\lnongrid Define line based on the grid.

Bullets and Numbering

\pndecd Double-byte decimal numbering (\*arabic\*dbchar).
\pndbnum Kanji numbering without the digit character (\*dbnum1).
\pnaiu 46 phonetic katakana characters in "aiueo" order (\*aiueo).
\pnaiud 46 phonetic double-byte katakana characters (\*aiueo\*dbchar).
\pniroha 46 phonetic katakana characters in "iroha" order (\*iroha).
\pnirohad 46 phonetic double-byte katakana characters (\*iroha\*dbchar).
\pncnum 20 numbered list in circle (\*circlenum).
\pnuldash Dashed underline.
\pnuldashd Dash-dotted underline.
\pnuldashdd Dash-dot-dotted underline.
\pnulhair Hairline underline.
\pnulth Thick underline.
\pnulwave Wave underline.

Drawing Objects

\dptxlrtb Text box flows from left to right and top to bottom (default).
\dptxtbrl Text box flows from right to left and top to bottom.
\dptxbtlr Text box flows from left to right and bottom to top.
\dptxlrtbv Text box flows from left to right and top to bottom, vertically.
\dptxtbrlv Text box flows from top to bottom and right to left, vertically.

Frame Properties

\frmtxlrtb Frame box flows from left to right and top to bottom (default).
\frmtxtbrl Frame box flows right to left and top to bottom.
\frmtxbtlr Frame box flows left to right and bottom to top.
\frmtxlrtbv Frame box flows left to right and top to bottom, vertical.
\frmtxtbrlv Frame box flows top to bottom and right to left, vertical.

Index Entries

\*\pxe "Yomi" (pronunciation) for index entry.

Paragraph Properties

\nocwrap No character wrapping.
\nowwrap No word wrapping.
\qd Distributed.
\nooverflow No overflow period and comma.
\aspalpha Auto spacing between DBC and English.
\aspnum Auto spacing between DBC and numbers.
\fahang Font alignment -> Hanging.
\facenter Font alignment -> Center.
\faroman Font alignment -> Roman (default).
\favar Font alignment -> Upholding variable.
\fafixed Font alignment -> Upholding fixed.

Section Formatting Properties

\horzsect Horizontal rendering.
\vertsect Vertical rendering.
\pgndecd Double-byte decimal numbering.
\pgndbnum Kanji numbering without the digit character.
\pgndbnumd Kanji numbering with the digit character.

Special Characters

\zwbo Zero-width break opportunity. Used to insert break opportunity between two characters.
\zwnbo Zero-width nonbreak opportunity. Used to remove break opportunity between two characters.
\qmspace One-quarter em space.

Table Formatting

\clbrdrdtlcldglu Diagonal line (top left to bottom right).
\clbrdrdtr\cldgll Diagonal line (top right to bottom left).
\cltxlrtb Text in a cell flows from left to right and top to bottom (default).
\cltxtbrl Text in a cell flows right to left and top to bottom.
\cltxbtlr Text in a cell flows left to right and bottom to top.
\cltxlrtbv Text in a cell flows left to right and top to bottom, vertical.
\cltxtbrlv Text in a cell flows top to bottom and right to left, vertical.
\clvmgf The first cell in a range of table cells to be vertically merged.
\clvmrg Contents of the table cell are vertically merged with those of the preceding cell.
\clvertalt Cell top align.
\clvertalc Cell vertically center align.
\clvertalb Cell bottom align.

Tabs

\tlmdot Leader middle dots.

New Control Words Created by Asian Versions of Word 97

Control word Meaning

Character Formatting Properties

\cgridN Character grid.
\g Destination related to character grids.
\gcw Grid column width.
\gridtbl Destination keyword related to character grids.
\nosectexpand Disable character space basement.

Paragraph Formatting Properties

\nosnaplinegrid Disable snap line to grid.
\faauto Font alignment the default setting for this is "Auto."

Borders

\brdrframe Border resembles a "Frame."

Bullets and Numbers

\pnaiueo 46 phonetic Katakana characters in "aiueo" order (*aiueo).
\pnaiueod 46 phonetic double-byte Katakana characters (*aiueo*dbchar).
\pndbnumd Kanji numbering with the digit character (*dbnum2).
\pndbnumt Kanji numbering 3 (*dbnum3).
\pndbnuml Kanji numbering 3 (*dbnum3).
\pndbnumk Kanji numbering 4 (*dbnum4).
\pnganada Korean numbering 2 (*ganada).
\pngbnum Chinese numbering 1 (*gb1).
\pngbnumd Chinese numbering 2 (*gb2).
\pngbnuml Chinese numbering 3 (*gb3).
\pngbnumk Chinese numbering 4 (*gb4).
\pnzodiac Chinese Zodiac numbering 1 (*zodiac1).
\pnzodiacd Chinese Zodiac numbering 2 (*zodiac2).
\pnzodiacl Chinese Zodiac numbering 3 (*zodiac3).
\pnganada Korean numbering 1 (*ganada).
\pnchosung Korean numbering 2 (*chosung).

Endnotes and Footnotes

\ftnnchosung Footnote Korean numbering 1 (*chosung).
\ftnncnum Footnote Circle numbering (*circlenum).
\ftnndbnum Foonote Kanji numbering without the digit character (*dbnum1).
\ftnndbnumd Footnote Kanji numbering with the digit character (*dbnum2).
\ftnndbnumt Footnote Kanji numbering 3 (*dbnum3).
\ftnndbnumk Footnote Kanji numbering 4 (*dbnum4).
\ftnndbar Footnote double-byte numbering (*dbchar).
\ftnnganada Footnote Korean numbering 2 (*ganada).
\ftnngbnum Footnote Chinese numbering 1 (*gb1).
\ftnngbnumd Footnote Chinese numbering 2 (*gb2).
\ftnngbnuml Footnote Chinese numbering 3 (*gb3).
\ftnngbnumk Footnote Chinese numbering 4 (*gb4).
\ftnnzodiac Footnote numbering-- Chinese Zodiac numbering 1 (* zodiac1)

\ftnnzodiacd Footnote numbering-- Chinese Zodiac numbering 2 (* zodiac2)

\ftnnzodiacl Footnote numbering-- Chinese Zodiac numbering 3 (* zodiac3).
\aftnnchosung Endnote Korean numbering 1 (*chosung).
\aftnncnum Endnote Circle numbering (*circlenum).
\aftnndbnum Endnote Kanji numbering without the digit character (*dbnum1).
\aftnndbnumd Endnote Kanji numbering with the digit character (*dbnum2).
\aftnndbnumt Endnote Kanji numbering 3 (*dbnum3).
\aftnndbnumk Endnote Kanji numbering 4 (*dbnum4).
\aftnndbar Endnote double-byte numbering (*dbchar).
\aftnnganada Endnote Korean numbering 2 (*ganada).
\aftnngbnum Endnote Chinese numbering 1 (*gb1).
\aftnngbnumd Endnote Chinese numbering 2 (*gb2).
\aftnngbnuml Endnote Chinese numbering 3 (*gb3).
\aftnngbnumk Endnote Chinese numbering 4 (*gb4).
\aftnnzodiac Endnote numbering-- Chinese Zodiac numbering 1 (* zodiac1)

\aftnnzodiacd Endnote numbering-- Chinese Zodiac numbering 2 (* zodiac2)

\aftnnzodiacl Endnote numbering-- Chinese Zodiac numbering 3 (* zodiac3).

Section Formatting Properties

\pgnchosung Korean numbering 1 (* chosung).
\pgncnum Circle numbering (*circlenum).
\pgndbnumt Kanji numbering 3 (*dbnum3).
\pgndbnumk Kanji numbering 4 (*dbnum4).
\pgnganada Korean numbering 2 (*ganada)
\pgngbnum Chinese numbering 1 (*gb1).
\pgngbnumd Chinese numbering 2 (*gb2).
\pgngbnuml Chinese numbering 3 (*gb3).
\pgngbnumk Chinese numbering 4 (*gb4).
\pgnzodiac Chinese Zodiac numbering 1 (*zodiac1).
\pgnzodiacd Chinese Zodiac numbering 2 (*zodiac2).
\pgnzodiacl Chinese Zodiac numbering 3 (*zodiac3).
\sectexpandN Character space basement.
\sectlinegridN Line grid.
\sectdefaultclN Default state of section. Indicates \sectspecifyclN and \sectspecifylN are not emitted.
\sectspecifyclN Specify number of characters per line only.
\sectspecifylN Specify both number of characters per line and number of lines per page.
\adjustright Adjust right indent.

Document Formatting Properties

\dgmargin Grid to follow margins.

Index Entries

\yxe Pronunciation for index entry.

APPENDIX C: INDEX OF RTF CONTROL WORDS

The following table contains a list of each RTF control word, the name of the section where it may be found, and a brief description of the type of control word. The types are described in the following table.
Type Description
Flag This control word ignores any parameter.
Destination This control word starts a group or destination. It ignores any parameter.
Symbol This control word represents a special character.
Toggle This control word distinguishes between the ON and OFF states for the given property. The control word with no parameter or a nonzero parameter is used to turn on the property, while the control word with a zero parameter is used to turn it off.
Value This control word requires a parameter.

Note In the following comprehensive table, the names of all control words that are new to Microsoft Word version 7.0 are followed by an asterisk (*) and the names of all control words that are new to Microsoft Word 97 are followed by two asterisks (**).

Control word Described in section Type
\' Special Characters Symbol
\- Special Characters Symbol
\* Special Characters Symbol
\: Special Characters Symbol
\\ Special Characters Symbol
\_ Special Characters Symbol
\{ Special Characters Symbol
\| Special Characters Symbol
\} Special Characters Symbol
\~ Special Characters Symbol
\ab Associated Character Properties Toggle
\absh Positioned Objects and Frames Value
\abslock * Positioned Objects and Frames Flag
\absw Positioned Objects and Frames Value
\acaps Associated Character Properties Toggle
\acf Associated Character Properties Value
\additive Style Sheet Flag
\adjustright ** New Control Words Created by Asian Versions of Word 97 Flag
\adn Associated Character Properties Value
\aenddoc Document Formatting Properties Flag
\aendnotes Document Formatting Properties Flag
\aexpnd Associated Character Properties Value
\af Associated Character Properties Value
\afs Associated Character Properties Value
\aftnbj Document Formatting Properties Flag
\aftncn Document Formatting Properties Destination
\aftnnalc Document Formatting Properties Flag
\aftnnar Document Formatting Properties Flag
\aftnnauc Document Formatting Properties Flag
\aftnnchi Document Formatting Properties Flag
\aftnnchosung ** New Control Words Created by Asian Versions of Word 97 Flag
\aftnncnum ** New Control Words Created by Asian Versions of Word 97 Flag
\aftnndbar ** New Control Words Created by Asian Versions of Word 97 Flag
\aftnndbnum ** New Control Words Created by Asian Versions of Word 97 Flag
\aftnndbnumd ** New Control Words Created by Asian Versions of Word 97 Flag
\aftnndbnumk ** New Control Words Created by Asian Versions of Word 97 Flag
\aftnndbnumt ** New Control Words Created by Asian Versions of Word 97 Flag
\aftnnganada ** New Control Words Created by Asian Versions of Word 97 Flag
\aftnngbnum ** New Control Words Created by Asian Versions of Word 97 Flag
\aftnngbnumd ** New Control Words Created by Asian Versions of Word 97 Flag
\aftnngbnumk ** New Control Words Created by Asian Versions of Word 97 Flag
\aftnngbnuml ** New Control Words Created by Asian Versions of Word 97 Flag
\aftnnrlc Document Formatting Properties Flag
\aftnnruc Document Formatting Properties Flag
\aftnnzodiac ** New Control Words Created by Asian Versions of Word 97 Flag
\aftnnzodiacd ** New Control Words Created by Asian Versions of Word 97 Flag
\aftnnzodiacl ** New Control Words Created by Asian Versions of Word 97 Flag
\aftnrestart Document Formatting Properties Flag
\aftnrstcont Document Formatting Properties Flag
\aftnsep Document Formatting Properties Destination
\aftnsepc Document Formatting Properties Destination
\aftnstart Document Formatting Properties Value
\aftntj Document Formatting Properties Flag
\ai Associated Character Properties Toggle
\alang Associated Character Properties Value
\allprot Document Formatting Properties Flag
\alt Style Sheet Flag
\animtextN ** New Control Words Created by Asian Versions of Word 97 Value
\annotation Comments (annotations) Destination
\annotprot Document Formatting Properties Flag
\ansi Character Set Flag
\ansicpgN ** Unicode RTF Value
\aoutl Associated Character Properties Toggle
\ascaps Associated Character Properties Toggle
\ashad Associated Character Properties Toggle
\astrike Associated Character Properties Toggle
\atnauthor Comments (annotations) Destination
\atnicn Comments (annotations) Destination
\atnid Comments (annotations) Destination
\atnref Comments (annotations) Destination
\atntime Comments (annotations) Destination
\atrfend Comments (annotations) Destination
\atrfstart Comments (annotations) Destination
\aul Associated Character Properties Toggle
\auld Associated Character Properties Toggle
\auldb Associated Character Properties Toggle
\aulnone Associated Character Properties Toggle
\aulw Associated Character Properties Toggle
\aup Associated Character Properties Value
\author Information Group Destination
\b Character Formatting Properties Toggle
\background ** Word 97 RTF for Drawing Objects (Shapes) Destination
\bdbfhdr ** Document Formatting Properties Flag
\bgbdiag Paragraph Shading Flag
\bgcross Paragraph Shading Flag
\bgdcross Paragraph Shading Flag
\bgdkbdiag Paragraph Shading Flag
\bgdkcross Paragraph Shading Flag
\bgdkdcross Paragraph Shading Flag
\bgdkfdiag Paragraph Shading Flag
\bgdkhoriz Paragraph Shading Flag
\bgdkvert Paragraph Shading Flag
\bgfdiag Paragraph Shading Flag
\bghoriz Paragraph Shading Flag
\bgvert Paragraph Shading Flag
\bin Pictures Value
\binfsxn Section Formatting Properties Value
\binsxn Section Formatting Properties Value
\bkmkcolf Bookmarks Value
\bkmkcoll Bookmarks Value
\bkmkend Bookmarks Destination
\bkmkpub Macintosh Edition Manager Publisher Objects Flag
\bkmkstart Bookmarks Destination
\bliptagN ** Pictures Value
\blipuid ** Pictures Value
\blipupiN ** Pictures Value
\blue Color Table Value
\box Paragraph Borders Flag
\brdrartN ** Document Formatting Properties Value
\brdrb Paragraph Borders Flag
\brdrbar Paragraph Borders Flag
\brdrbtw Paragraph Borders Flag
\brdrcf Paragraph Borders Value
\brdrdash Paragraph Borders Flag
\brdrdashd ** Paragraph Text Flag
\brdrdashdd ** Paragraph Text Flag
\brdrdashdotstr ** Paragraph Text Flag
\brdrdashsm ** Paragraph Text Flag
\brdrdb Paragraph Borders Flag
\brdrdot Paragraph Borders Flag
\brdremboss ** Paragraph Text Flag
\brdrengrave ** Paragraph Text Flag
\brdrframe ** New Control Words Created by Asian Versions of Word 97 Flag
\brdrhair Paragraph Borders Flag
\brdrl Paragraph Borders Flag
\brdrr Paragraph Borders Flag
\brdrs Paragraph Borders Flag
\brdrsh Paragraph Borders Flag
\brdrt Paragraph Borders Flag
\brdrth Paragraph Borders Flag
\brdrthtnlg ** Paragraph Text Flag
\brdrthtnmg ** Paragraph Text Flag
\brdrthtnsg ** Paragraph Text Flag
\brdrtnthlg ** Paragraph Text Flag
\brdrtnthmg ** Paragraph Text Flag
\brdrtnthsg ** Paragraph Text Flag
\brdrtnthtnlg ** Paragraph Text Flag
\brdrtnthtnmg ** Paragraph Text Flag
\brdrtnthtnsg ** Paragraph Text Flag
\brdrtriple ** Paragraph Text Flag
\brdrw Paragraph Borders Value
\brdrwavy ** Paragraph Text Flag
\brdrwavydb ** Paragraph Text Flag
\brkfrm Document Formatting Properties Flag
\brsp Paragraph Borders Value
\bullet Special Characters Symbol
\buptim Information Group Destination
\bxe Index Entries Flag
\caps Character Formatting Properties Toggle
\category * Information Group Destination
\cb Character Formatting Properties Value
\cbpat Paragraph Shading Value
\cchs Character Formatting Properties Value
\cell Special Characters Symbol
\cellx Table Definitions Value
\cf Character Formatting Properties Value
\cfpat Paragraph Shading Value
\cgridN ** New Control Words Created by Asian Versions of Word 97 Value
\charscalexN ** Character Text Value
\chatn Special Characters Symbol
\chbgbdiag ** Character Text Flag
\chbgcross ** Character Text Flag
\chbgdcross ** Character Text Flag
\chbgdkbdiag ** Character Text Flag
\chbgdkcross ** Character Text Flag
\chbgdkdcross ** Character Text Flag
\chbgdkfdiag ** Character Text Flag
\chbgdkhoriz ** Character Text Flag
\chbgdkvert ** Character Text Flag
\chbgfdiag ** Character Text Flag
\chbghoriz ** Character Text Flag
\chbgvert ** Character Text Flag
\chbrdr ** Character Text Flag
\chcbpatN ** Character Text Value
\chcfpatN ** Character Text Value
\chdate Special Characters Symbol
\chdpa Special Characters Symbol
\chdpl Special Characters Symbol
\chftn Special Characters Symbol
\chftnsep Special Characters Symbol
\chftnsepc Special Characters Symbol
\chpgn Special Characters Symbol
\chshdngN ** Character Text Value
\chtime Special Characters Symbol
\clbgbdiag Table Definitions Flag
\clbgcross Table Definitions Flag
\clbgdcross Table Definitions Flag
\clbgdkbdiag Table Definitions Flag
\clbgdkcross Table Definitions Flag
\clbgdkdcross Table Definitions Flag
\clbgdkfdiag Table Definitions Flag
\clbgdkhor Table Definitions Flag
\clbgdkvert Table Definitions Flag
\clbgfdiag Table Definitions Flag
\clbghoriz Table Definitions Flag
\clbgvert Table Definitions Flag
\clbrdrb Table Definitions Flag
\clbrdrl Table Definitions Flag
\clbrdrr Table Definitions Flag
\clbrdrt Table Definitions Flag
\clcbpat Table Definitions Value
\clcfpat Table Definitions Value
\clmgf Table Definitions Flag
\clmrg Table Definitions Flag
\clshdng Table Definitions Value
\cltxlrtb ** Paragraph Text Flag
\cltxtbrl ** Paragraph Text Flag
\clvertalb ** Paragraph Text Flag
\clvertalc ** Paragraph Text Flag
\clvertalt ** Paragraph Text Flag
\colno Section Formatting Properties Value
\colortbl Color Table Destination
\cols Section Formatting Properties Value
\colsr Section Formatting Properties Value
\colsx Section Formatting Properties Value
\column Special Characters Symbol
\colw Section Formatting Properties Value
\comment Information Group Destination
\company * Information Group Destination
\cpg Code Page Support Value
\crauthN ** Character Text Value
\crdateN ** Character Text Value
\creatim Information Group Destination
\cs Character Formatting Properties Value
\ctrl Style Sheet Flag
\cvmme Document Formatting Properties Flag
\datafield Fields Destination
\date ** Fields Flag
\deff Font Table Value
\defformat Document Formatting Properties Flag
\deflang Document Formatting Properties Value
\deflangfe ** Document Formatting Properties Value
\deftab Document Formatting Properties Value
\deleted Character Formatting Properties Toggle
\dfrauthN ** Paragraph Text Value
\dfrdateN ** Paragraph Text Value
\dfrmtxtx Positioned Objects and Frames Value
\dfrmtxty Positioned Objects and Frames Value
\dfrstart ** Paragraph Text Value
\dfrstop ** Paragraph Text Value
\dfrxst ** Paragraph Text Value
\dgmargin ** New Control Words Created by Asian Versions of Word 97 Flag
\dibitmap Pictures Value
\dn Character Formatting Properties Value
\dntblnsbdb ** Document Formatting Properties Flag
\do Drawing Objects Destination
\dobxcolumn Drawing Objects Flag
\dobxmargin Drawing Objects Flag
\dobxpage Drawing Objects Flag
\dobymargin Drawing Objects Flag
\dobypage Drawing Objects Flag
\dobypara Drawing Objects Flag
\doccomm Information Group Destination
\doctemp Document Formatting Properties Flag
\doctypeN ** Document Formatting Properties Value
\docvar * Document Variables Destination
\dodhgt Drawing Objects Value
\dolock Drawing Objects Flag
\dpaendhol Drawing Objects Flag
\dpaendl Drawing Objects Value
\dpaendsol Drawing Objects Flag
\dpaendw Drawing Objects Value
\dparc Drawing Objects Flag
\dparcflipx Drawing Objects Flag
\dparcflipy Drawing Objects Flag
\dpastarthol Drawing Objects Flag
\dpastartl Drawing Objects Value
\dpastartsol Drawing Objects Flag
\dpastartw Drawing Objects Value
\dpcallout Drawing Objects Flag
\dpcoa Drawing Objects Value
\dpcoaccent Drawing Objects Flag
\dpcobestfit Drawing Objects Flag
\dpcoborder Drawing Objects Flag
\dpcodabs Drawing Objects Value
\dpcodbottom Drawing Objects Flag
\dpcodcenter Drawing Objects Flag
\dpcodescent Drawing Objects Value
\dpcodtop Drawing Objects Flag
\dpcolength Drawing Objects Value
\dpcominusx Drawing Objects Flag
\dpcominusy Drawing Objects Flag
\dpcooffset Drawing Objects Value
\dpcosmarta Drawing Objects Flag
\dpcotdouble Drawing Objects Flag
\dpcotright Drawing Objects Flag
\dpcotsingle Drawing Objects Flag
\dpcottriple Drawing Objects Flag
\dpcount Drawing Objects Value
\dpellipse Drawing Objects Flag
\dpendgroup Drawing Objects Flag
\dpfillbgcb Drawing Objects Value
\dpfillbgcg Drawing Objects Value
\dpfillbgcr Drawing Objects Value
\dpfillbggray Drawing Objects Value
\dpfillbgpal Drawing Objects Flag
\dpfillfgcb Drawing Objects Value
\dpfillfgcg Drawing Objects Value
\dpfillfgcr Drawing Objects Value
\dpfillfggray Drawing Objects Value
\dpfillfgpal Drawing Objects Flag
\dpfillpat Drawing Objects Value
\dpgroup Drawing Objects Flag
\dpline Drawing Objects Flag
\dplinecob Drawing Objects Value
\dplinecog Drawing Objects Value
\dplinecor Drawing Objects Value
\dplinedado Drawing Objects Flag
\dplinedadodo Drawing Objects Flag
\dplinedash Drawing Objects Flag
\dplinedot Drawing Objects Flag
\dplinegray Drawing Objects Value
\dplinehollow Drawing Objects Flag
\dplinepal Drawing Objects Flag
\dplinesolid Drawing Objects Flag
\dplinew Drawing Objects Value
\dppolycount Drawing Objects Value
\dppolygon Drawing Objects Flag
\dppolyline Drawing Objects Flag
\dpptx Drawing Objects Value
\dppty Drawing Objects Value
\dprect Drawing Objects Flag
\dproundr Drawing Objects Flag
\dpshadow Drawing Objects Flag
\dpshadx Drawing Objects Value
\dpshady Drawing Objects Value
\dptxbx Drawing Objects Flag
\dptxbxmar Drawing Objects Value
\dptxbxtext Drawing Objects Destination
\dpx Drawing Objects Value
\dpxsize Drawing Objects Value
\dpy Drawing Objects Value
\dpysize Drawing Objects Value
\dropcapli Positioned Objects and Frames Value
\dropcapt Positioned Objects and Frames Value
\ds Section Formatting Properties Value
\dxfrtext Positioned Objects and Frames Value
\dy Information Group Value
\edmins Information Group Value
\embo ** Character Text Toggle
\emdash Special Characters Symbol
\emfblip ** Pictures Flag
\emspace Special Characters Symbol
\endash Special Characters Symbol
\enddoc Document Formatting Properties Flag
\endnhere Section Formatting Properties Flag
\endnotes Document Formatting Properties Flag
\enspace Special Characters Symbol
\expnd Character Formatting Properties Value
\expndtw Character Formatting Properties Value
\expshrtn ** Document Formatting Properties Flag
\f Character Formatting Properties Value
\faauto ** New Control Words Created by Asian Versions of Word 97 Value
\facingp Document Formatting Properties Flag
\falt Font Table Destination
\fbiasN ** Font Table Value
\fbidi Font Table Flag
\fcharset Font Table Value
\fdecor Font Table Flag
\fet Document Formatting Properties Value
\ffdefres ** Form Fields Value
\ffdeftext ** Form Fields Destination
\ffentrymcr ** Form Fields Destination
\ffexitmcr ** Form Fields Destination
\ffformat ** Form Fields Destination
\ffhaslistboxN ** Form Fields Value
\ffhelptext ** Form Fields Destination
\ffhpsN ** Form Fields Value
\ffl ** Form Fields Destination
\ffmaxlen ** Form Fields Value
\ffname ** Form Fields Destination
\ffownhelpN ** Form Fields Value
\ffownstatN ** Form Fields Value
\ffprotN ** Form Fields Value
\ffrecalcN ** Form Fields Value
\ffresN ** Form Fields Value
\ffsizeN ** Form Fields Value
\ffstattext ** Form Fields Destination
\fftypeN ** Form Fields Value
\fftypetxtN ** Form Fields Value
\fi Paragraph Formatting Properties Value
\fid File Table Value
\field Fields Destination
\file File Table Destination
\filetbl File Table Destination
\fldalt Document Formatting Properties Flag
\flddirty Fields Flag
\fldedit Fields Flag
\fldinst Fields Destination
\fldlock Fields Flag
\fldpriv Fields Flag
\fldrslt Fields Destination
\fldtype ** Fields Destination
\fmodern Font Table Flag
\fn Style Sheet Value
\fname * Font Table Destination
\fnetwork File Table Flag
\fnil Font Table Flag
\fontemb Font Table Destination
\fontfile Font Table Destination
\fonttbl Font Table Destination
\footer Headers and Footers Destination
\footerf Headers and Footers Destination
\footerl Headers and Footers Destination
\footerr Headers and Footers Destination
\footery Section Formatting Properties Value
\footnote Footnotes Destination
\formdisp Document Formatting Properties Flag
\formfield ** Form Fields Destination
\formprot Document Formatting Properties Flag
\formshade Document Formatting Properties Flag
\fosnum File Table Value
\fprq Font Table Value
\fracwidth Document Formatting Properties Flag
\frelative File Table Value
\froman Font Table Flag
\fromtext ** Document Formatting Properties Flag
\fs Character Formatting Properties Value
\fscript Font Table Flag
\fswiss Font Table Flag
\ftech Font Table Flag
\ftnalt Document Formatting Properties Flag
\ftnbj Document Formatting Properties Flag
\ftncn Document Formatting Properties Destination
\ftnil Font Table Flag
\ftnnalc Document Formatting Properties Flag
\ftnnar Document Formatting Properties Flag
\ftnnauc Document Formatting Properties Flag
\ftnnchi Document Formatting Properties Flag
\ftnnchosung ** New Control Words Created by Asian Versions of Word 97 Flag
\ftnncnum ** New Control Words Created by Asian Versions of Word 97 Flag
\ftnndbar ** New Control Words Created by Asian Versions of Word 97 Flag
\ftnndbnum ** New Control Words Created by Asian Versions of Word 97 Flag
\ftnndbnumd ** New Control Words Created by Asian Versions of Word 97 Flag
\ftnndbnumk ** New Control Words Created by Asian Versions of Word 97 Flag
\ftnndbnumt ** New Control Words Created by Asian Versions of Word 97 Flag
\ftnnganada ** New Control Words Created by Asian Versions of Word 97 Flag
\ftnngbnum ** New Control Words Created by Asian Versions of Word 97 Flag
\ftnngbnumd ** New Control Words Created by Asian Versions of Word 97 Flag
\ftnngbnumk ** New Control Words Created by Asian Versions of Word 97 Flag
\ftnngbnuml ** New Control Words Created by Asian Versions of Word 97 Flag
\ftnnrlc Document Formatting Properties Flag
\ftnnruc Document Formatting Properties Flag
\ftnnzodiac ** New Control Words Created by Asian Versions of Word 97 Flag
\ftnnzodiacd ** New Control Words Created by Asian Versions of Word 97 Flag
\ftnnzodiacl ** New Control Words Created by Asian Versions of Word 97 Flag
\ftnrestart Document Formatting Properties Flag
\ftnrstcont Document Formatting Properties Flag
\ftnrstpg Document Formatting Properties Flag
\ftnsep Document Formatting Properties Destination
\ftnsepc Document Formatting Properties Destination
\ftnstart Document Formatting Properties Value
\ftntj Document Formatting Properties Flag
\fttruetype Font Table Flag
\fvaliddos File Table Flag
\fvalidhpfs File Table Flag
\fvalidmac File Table Flag
\fvalidntfs File Table Flag
\g ** New Control Words Created by Asian Versions of Word 97 Destination
\gcw ** New Control Words Created by Asian Versions of Word 97 Value
\green Color Table Value
\gridtbl ** New Control Words Created by Asian Versions of Word 97 Destination
\gutter Document Formatting Properties Value
\guttersxn Section Formatting Properties Value
\header Headers and Footers Destination
\headerf Headers and Footers Destination
\headerl Headers and Footers Destination
\headerr Headers and Footers Destination
\headery Section Formatting Properties Value
\highlight * Highlighting Value
\hlfr ** Word 97 RTF for Drawing Objects (Shapes) Value
\hlinkbase ** Information Group Value
\hlloc ** Word 97 RTF for Drawing Objects (Shapes) Value
\hlsrc ** Word 97 RTF for Drawing Objects (Shapes) Value
\hr Information Group Value
\hyphauto Document Formatting Properties Toggle
\hyphcaps Document Formatting Properties Toggle
\hyphconsec Document Formatting Properties Value
\hyphhotz Document Formatting Properties Value
\hyphpar Paragraph Formatting Properties Toggle
\i Character Formatting Properties Toggle
\id Information Group Value
\ilvl ** Paragraph Text Value
\impr ** Character Text Toggle
\info Information Group Destination
\intbl Paragraph Formatting Properties Flag
\ixe Index Entries Flag
\jpegblip ** Pictures Flag
\keep Paragraph Formatting Properties Flag
\keepn Paragraph Formatting Properties Flag
\kerning Character Formatting Properties Value
\keycode Style Sheet Destination
\keywords Information Group Destination
\landscape Document Formatting Properties Flag
\lang Character Formatting Properties Value
\ldblquote Special Characters Symbol
\level Paragraph Formatting Properties Value
\levelfollowN ** List Table Value
\levelindentN ** List Table Value
\leveljcN ** List Table Value
\levellegalN ** List Table Value
\levelnfcN ** List Table Value
\levelnorestartN ** List Table Value
\levelnumbers ** List Table Destination
\leveloldN ** List Table Value
\levelprevN ** List Table Value
\levelprevspaceN ** List Table Value
\levelspaceN ** List Table Value
\levelstartatN ** List Table Value
\leveltext ** List Table Value
\li Paragraph Formatting Properties Value
\line Special Characters Symbol
\linebetcol Section Formatting Properties Flag
\linecont Section Formatting Properties Flag
\linemod Section Formatting Properties Value
\lineppage Section Formatting Properties Flag
\linerestart Section Formatting Properties Flag
\linestart Document Formatting Properties Value
\linestarts Section Formatting Properties Value
\linex Section Formatting Properties Value
\linkself Objects Flag
\linkstyles Document Formatting Properties Flag
\linkval * Information Group Value
\listidN ** List Table Value
\listname ** List Table Destination
\listoverridecountN ** List Table Value
\listoverrideformatN ** List Table Value
\listoverridestartN ** List Table Value
\listrestarthdnN ** List Table Value
\listsimpleN ** List Table Value
\listtemplateidN ** List Table Value
\listtext ** Paragraph Text Destination
\lndscpsxn Section Formatting Properties Flag
\lquote Special Characters Symbol
\ls ** List Table Value
\ltrch Character Formatting Properties Flag
\ltrdoc Document Formatting Properties Flag
\ltrmark Special Characters Symbol
\ltrpar Paragraph Formatting Properties Flag
\ltrrow Table Definitions Flag
\ltrsect Section Formatting Properties Flag
\lytexcttp ** Document Formatting Properties Flag
\lytprtmet ** Document Formatting Properties Flag
\mac Character Set Flag
\macpict Pictures Flag
\makebackup Document Formatting Properties Flag
\manager * Information Group Destination
\margb Document Formatting Properties Value
\margbsxn Section Formatting Properties Value
\margl Document Formatting Properties Value
\marglsxn Section Formatting Properties Value
\margmirror Document Formatting Properties Flag
\margr Document Formatting Properties Value
\margrsxn Section Formatting Properties Value
\margt Document Formatting Properties Value
\margtsxn Section Formatting Properties Value
\min Information Group Value
\mo Information Group Value
\msmcap ** Document Formatting Properties Flag
\nextfile Document Formatting Properties Destination
\nocolbal Document Formatting Properties Flag
\noextrasprl Document Formatting Properties Flag
\nofchars Information Group Value
\nofcharsws ** Information Group Value
\nofpages Information Group Value
\nofwords Information Group Value
\nolead ** Document Formatting Properties Flag
\noline Paragraph Formatting Properties Flag
\nonshppict ** Pictures Flag
\nosectexpand ** New Control Words Created by Asian Versions of Word 97 Flag
\nosnaplinegrid ** New Control Words Created by Asian Versions of Word 97 Flag
\nospaceforul ** Document Formatting Properties Flag
\nosupersub Character Formatting Properties Flag
\notabind Document Formatting Properties Flag
\noultrlspc ** Document Formatting Properties Flag
\nowidctlpar Paragraph Formatting Properties Flag
\nowrap Positioned Objects and Frames Flag
\noxlattoyen ** Document Formatting Properties Flag
\objalias Objects Destination
\objalign Objects Value
\objattph * Objects Flag
\objautlink Objects Flag
\objclass Objects Destination
\objcropb Objects Value
\objcropl Objects Value
\objcropr Objects Value
\objcropt Objects Value
\objdata Objects Destination
\object Objects Destination
\objemb Objects Flag
\objh Objects Value
\objhtml ** Objects Flag
\objicemb Objects Flag
\objlink Objects Flag
\objlock Objects Flag
\objname Objects Destination
\objocx ** Objects Flag
\objpub Objects Flag
\objscalex Objects Value
\objscaley Objects Value
\objsect Objects Destination
\objsetsize Objects Flag
\objsub Objects Flag
\objtime Objects Destination
\objtransy Objects Value
\objupdate Objects Flag
\objw Objects Value
\oldlinewrap ** Document Formatting Properties Flag
\operator Information Group Destination
\otblrul Document Formatting Properties Flag
\outl Character Formatting Properties Toggle
\outlinelevelN ** Paragraph Text Value
\overlay ** Paragraph Text Flag
\page Special Characters Symbol
\pagebb Paragraph Formatting Properties Flag
\panose ** Font Table Destination
\paperh Document Formatting Properties Value
\paperw Document Formatting Properties Value
\par Special Characters Symbol
\pard Paragraph Formatting Properties Flag
\pc Character Set Flag
\pca Character Set Flag
\pgbrdrb ** Document Formatting Properties Flag
\pgbrdrfoot ** Document Formatting Properties Flag
\pgbrdrhead ** Document Formatting Properties Flag
\pgbrdrl ** Document Formatting Properties Flag
\pgbrdroptN ** Document Formatting Properties Value
\pgbrdrr ** Document Formatting Properties Flag
\pgbrdrsnap ** Document Formatting Properties Flag
\pgbrdrt ** Document Formatting Properties Flag
\pghsxn Section Formatting Properties Value
\pgnchosung ** New Control Words Created by Asian Versions of Word 97 Flag
\pgncnum ** New Control Words Created by Asian Versions of Word 97 Flag
\pgncont Section Formatting Properties Flag
\pgndbnumk ** New Control Words Created by Asian Versions of Word 97 Flag
\pgndbnumt ** New Control Words Created by Asian Versions of Word 97 Flag
\pgndec Section Formatting Properties Flag
\pgnganada ** New Control Words Created by Asian Versions of Word 97 Flag
\pgngbnum ** New Control Words Created by Asian Versions of Word 97 Flag
\pgngbnumd ** New Control Words Created by Asian Versions of Word 97 Flag
\pgngbnumk ** New Control Words Created by Asian Versions of Word 97 Flag
\pgngbnuml ** New Control Words Created by Asian Versions of Word 97 Flag
\pgnhn Section Formatting Properties Value
\pgnhnsc Section Formatting Properties Flag
\pgnhnsh Section Formatting Properties Flag
\pgnhnsm Section Formatting Properties Flag
\pgnhnsn Section Formatting Properties Flag
\pgnhnsp Section Formatting Properties Flag
\pgnlcltr Section Formatting Properties Flag
\pgnlcrm Section Formatting Properties Flag
\pgnrestart Section Formatting Properties Flag
\pgnstart Document Formatting Properties Value
\pgnstarts Section Formatting Properties Value
\pgnucltr Section Formatting Properties Flag
\pgnucrm Section Formatting Properties Flag
\pgnx Section Formatting Properties Value
\pgny Section Formatting Properties Value
\pgnzodiac ** New Control Words Created by Asian Versions of Word 97 Flag
\pgnzodiacd ** New Control Words Created by Asian Versions of Word 97 Flag
\pgnzodiacl ** New Control Words Created by Asian Versions of Word 97 Flag
\pgwsxn Section Formatting Properties Value
\phcol Positioned Objects and Frames Flag
\phmrg Positioned Objects and Frames Flag
\phpg Positioned Objects and Frames Flag
\picbmp Pictures Flag
\picbpp Pictures Value
\piccropb Pictures Value
\piccropl Pictures Value
\piccropr Pictures Value
\piccropt Pictures Value
\pich Pictures Value
\pichgoal Pictures Value
\picprop ** Pictures Destination
\picscaled Pictures Flag
\picscalex Pictures Value
\picscaley Pictures Value
\pict Pictures Destination
\picw Pictures Value
\picwgoal Pictures Value
\plain Character Formatting Properties Flag
\pmmetafile Pictures Value
\pn Bullets and Numbering Destination
\pnacross Bullets and Numbering Flag
\pnaiueo ** New Control Words Created by Asian Versions of Word 97 Flag
\pnaiueod ** New Control Words Created by Asian Versions of Word 97 Flag
\pnb Bullets and Numbering Toggle
\pncaps Bullets and Numbering Toggle
\pncard Bullets and Numbering Flag
\pncf Bullets and Numbering Value
\pnchosung ** New Control Words Created by Asian Versions of Word 97 Flag
\pndbnumd ** New Control Words Created by Asian Versions of Word 97 Flag
\pndbnumk ** New Control Words Created by Asian Versions of Word 97 Flag
\pndbnuml ** New Control Words Created by Asian Versions of Word 97 Flag
\pndbnumt ** New Control Words Created by Asian Versions of Word 97 Flag
\pndec Bullets and Numbering Flag
\pnf Bullets and Numbering Value
\pnfs Bullets and Numbering Value
\pnganada ** New Control Words Created by Asian Versions of Word 97 Flag
\pnganada ** New Control Words Created by Asian Versions of Word 97 Flag
\pngblip ** Pictures Flag
\pngbnum ** New Control Words Created by Asian Versions of Word 97 Flag
\pngbnumd ** New Control Words Created by Asian Versions of Word 97 Flag
\pngbnumk ** New Control Words Created by Asian Versions of Word 97 Flag
\pngbnuml ** New Control Words Created by Asian Versions of Word 97 Flag
\pnhang Bullets and Numbering Flag
\pni Bullets and Numbering Toggle
\pnindent Bullets and Numbering Value
\pnlcltr Bullets and Numbering Flag
\pnlcrm Bullets and Numbering Flag
\pnlvl Bullets and Numbering Value
\pnlvlblt Bullets and Numbering Flag
\pnlvlbody Bullets and Numbering Flag
\pnlvlcont Bullets and Numbering Flag
\pnnumonce Bullets and Numbering Flag
\pnord Bullets and Numbering Flag
\pnordt Bullets and Numbering Flag
\pnprev Bullets and Numbering Flag
\pnqc Bullets and Numbering Flag
\pnql Bullets and Numbering Flag
\pnqr Bullets and Numbering Flag
\pnrauthN ** Paragraph Text Value
\pnrdateN ** Paragraph Text Value
\pnrestart Bullets and Numbering Flag
\pnrnfcN ** Paragraph Text Value
\pnrnot ** Paragraph Text Flag
\pnrpnbrN ** Paragraph Text Value
\pnrrgbN ** Paragraph Text Value
\pnrstartN ** Paragraph Text Value
\pnrstopN ** Paragraph Text Value
\pnrxstN ** Paragraph Text Value
\pnscaps Bullets and Numbering Toggle
\pnseclvl Bullets and Numbering Destination
\pnsp Bullets and Numbering Value
\pnstart Bullets and Numbering Value
\pnstrike Bullets and Numbering Toggle
\pntext Bullets and Numbering Destination
\pntxta Bullets and Numbering Destination
\pntxtb Bullets and Numbering Destination
\pnucltr Bullets and Numbering Flag
\pnucrm Bullets and Numbering Flag
\pnul Bullets and Numbering Toggle
\pnuld Bullets and Numbering Flag
\pnuldb Bullets and Numbering Flag
\pnulnone Bullets and Numbering Flag
\pnulw Bullets and Numbering Flag
\pnzodiac ** New Control Words Created by Asian Versions of Word 97 Flag
\pnzodiacd ** New Control Words Created by Asian Versions of Word 97 Flag
\pnzodiacl ** New Control Words Created by Asian Versions of Word 97 Flag
\posnegx Positioned Objects and Frames Value
\posnegy Positioned Objects and Frames Value
\posx Positioned Objects and Frames Value
\posxc Positioned Objects and Frames Flag
\posxi Positioned Objects and Frames Flag
\posxl Positioned Objects and Frames Flag
\posxo Positioned Objects and Frames Flag
\posxr Positioned Objects and Frames Flag
\posy Positioned Objects and Frames Value
\posyb Positioned Objects and Frames Flag
\posyc Positioned Objects and Frames Flag
\posyil Positioned Objects and Frames Flag
\posyin ** Paragraph Text Flag
\posyout ** Paragraph Text Flag
\posyt Positioned Objects and Frames Flag
\prcolbl Document Formatting Properties Flag
\printdata Document Formatting Properties Flag
\printim Information Group Destination
\private ** Document Formatting Properties Destination
\propname * Information Group Value
\proptype * Information Group Value
\psover Document Formatting Properties Flag
\psz Document Formatting Properties Value
\pubauto Macintosh Edition Manager Publisher Objects Flag
\pvmrg Positioned Objects and Frames Flag
\pvpara Positioned Objects and Frames Flag
\pvpg Positioned Objects and Frames Flag
\qc Paragraph Formatting Properties Flag
\qj Paragraph Formatting Properties Flag
\ql Paragraph Formatting Properties Flag
\qr Paragraph Formatting Properties Flag
\rdblquote Special Characters Symbol
\red Color Table Value
\result Objects Destination
\revauth Character Formatting Properties Value
\revauthdelN ** Character Text Value
\revbar Document Formatting Properties Value
\revdttm Character Formatting Properties Value
\revdttmdelN ** Character Text Value
\revised Character Formatting Properties Toggle
\revisions Document Formatting Properties Flag
\revprop Document Formatting Properties Value
\revprot Document Formatting Properties Flag
\revtbl Revision Marks Destination
\revtim Information Group Destination
\ri Paragraph Formatting Properties Value
\row Special Characters Symbol
\rquote Special Characters Symbol
\rsltbmp Objects Flag
\rsltmerge Objects Flag
\rsltpict Objects Flag
\rsltrtf Objects Flag
\rslttxt Objects Flag
\rtf RTF Version Destination
\rtlch Character Formatting Properties Flag
\rtldoc Document Formatting Properties Flag
\rtlmark Bidirectional Language Support and Special Characters Symbol
\rtlpar Paragraph Formatting Properties Flag
\rtlrow Table Definitions Flag
\rtlsect Section Formatting Properties Flag
\rxe Index Entries Destination
\s Paragraph Formatting Properties Value
\sa Paragraph Formatting Properties Value
\sautoupd ** Style Sheet Flag
\sb Paragraph Formatting Properties Value
\sbasedon Style Sheet Value
\sbkcol Section Formatting Properties Flag
\sbkeven Section Formatting Properties Flag
\sbknone Section Formatting Properties Flag
\sbkodd Section Formatting Properties Flag
\sbkpage Section Formatting Properties Flag
\sbys Paragraph Formatting Properties Flag
\scaps Character Formatting Properties Toggle
\sec Information Group Value
\sect Special Characters Symbol
\sectd Section Formatting Properties Flag
\sectdefaultclN ** New Control Words Created by Asian Versions of Word 97 Value
\sectexpandN ** New Control Words Created by Asian Versions of Word 97 Value
\sectlinegridN ** New Control Words Created by Asian Versions of Word 97 Value
\sectnum Special Characters Symbol
\sectspecifyclN ** New Control Words Created by Asian Versions of Word 97 Value
\sectspecifylN ** New Control Words Created by Asian Versions of Word 97 Value
\sectunlocked Section Formatting Properties Flag
\shad Character Formatting Properties Toggle
\shading Paragraph Shading Value
\shidden ** Style Sheet Flag
\shift Style Sheet Flag
\shpbottomN ** Word 97 RTF for Drawing Objects (Shapes) Value
\shpbxcolumn ** Word 97 RTF for Drawing Objects (Shapes) Flag
\shpbxmargin ** Word 97 RTF for Drawing Objects (Shapes) Flag
\shpbxpage ** Word 97 RTF for Drawing Objects (Shapes) Flag
\shpbymargin ** Word 97 RTF for Drawing Objects (Shapes) Flag
\shpbypage ** Word 97 RTF for Drawing Objects (Shapes) Flag
\shpbypara ** Word 97 RTF for Drawing Objects (Shapes) Flag
\shpfblwtxtN ** Word 97 RTF for Drawing Objects (Shapes) Value
\shpfhdrN ** Word 97 RTF for Drawing Objects (Shapes) Value
\shpgrp ** Word 97 RTF for Drawing Objects (Shapes) Value
\shpleftN ** Word 97 RTF for Drawing Objects (Shapes) Value
\shplidN ** Word 97 RTF for Drawing Objects (Shapes) Value
\shplockanchor ** Word 97 RTF for Drawing Objects (Shapes) Flag
\shppict ** Pictures Destination
\shprightN ** Word 97 RTF for Drawing Objects (Shapes) Value
\shprslt ** Word 97 RTF for Drawing Objects (Shapes) Value
\shptopN ** Word 97 RTF for Drawing Objects (Shapes) Value
\shptxt ** Word 97 RTF for Drawing Objects (Shapes) Value
\shpwrkN ** Word 97 RTF for Drawing Objects (Shapes) Value
\shpwrN ** Word 97 RTF for Drawing Objects (Shapes) Value
\shpzN ** Word 97 RTF for Drawing Objects (Shapes) Value
\sl Paragraph Formatting Properties Value
\slmult Paragraph Formatting Properties Value
\snext Style Sheet Value
\softcol Special Characters Flag
\softlheight Special Characters Value
\softline Special Characters Flag
\softpage Special Characters Flag
\sprsbsp ** Document Formatting Properties Flag
\sprslnsp * Document Formatting Properties Flag
\sprsspbf Document Formatting Properties Flag
\sprstsm ** Document Formatting Properties Flag
\sprstsp Document Formatting Properties Flag
\staticval * Information Group Value
\stextflow ** Section Text Value
\strike Character Formatting Properties Toggle
\strikedl ** Character Text Toggle
\stylesheet Style Sheet Destination
\sub Character Formatting Properties Flag
\subdocument Paragraph Formatting Properties Value
\subfontbysize * Document Formatting Properties Flag
\subject Information Group Destination
\super Character Formatting Properties Flag
\swpbdr Document Formatting Properties Flag
\tab Special Characters Symbol
\tb Tabs Value
\tc Table of Contents Entries Destination
\tcelld ** New Control Words Created by Asian Versions of Word 97 Flag
\tcf Table of Contents Entries Value
\tcl Table of Contents Entries Value
\tcn Table of Contents Entries Flag
\template Document Formatting Properties Destination
\time ** Fields Flag
\title Information Group Destination
\titlepg Section Formatting Properties Flag
\tldot Tabs Flag
\tleq Tabs Flag
\tlhyph Tabs Flag
\tlth Tabs Flag
\tlul Tabs Flag
\tqc Tabs Flag
\tqdec Tabs Flag
\tqr Tabs Flag
\transmf Document Formatting Properties Flag
\trbrdrb Table Definitions Flag
\trbrdrh Table Definitions Flag
\trbrdrl Table Definitions Flag
\trbrdrr Table Definitions Flag
\trbrdrt Table Definitions Flag
\trbrdrv Table Definitions Flag
\trgaph Table Definitions Value
\trhdr Table Definitions Flag
\trkeep Table Definitions Flag
\trleft Table Definitions Value
\trowd Table Definitions Flag
\trqc Table Definitions Flag
\trql Table Definitions Flag
\trqr Table Definitions Flag
\trrh Table Definitions Value
\truncatefont
height * Document Formatting Properties Flag
\tx Tabs Value
\txe Index Entries Destination
\ucN ** Unicode RTF Value
\ud ** Unicode RTF Destination
\ul Character Formatting Properties Toggle
\uld Character Formatting Properties Flag
\uldash ** Character Text Toggle
\uldashd ** Character Text Toggle
\uldashdd ** Character Text Toggle
\uldb Character Formatting Properties Flag
\ulnone Character Formatting Properties Flag
\ulth ** Character Text Toggle
\ulw Character Formatting Properties Flag
\ulwave ** Character Text Toggle
\uN ** Unicode RTF Value
\up Character Formatting Properties Value
\upr ** Unicode RTF Destination
\userprops * Information Group Destination
\v Character Formatting Properties Toggle
\vern Information Group Value
\version Information Group Value
\vertalb Section Formatting Properties Flag
\vertalc Section Formatting Properties Flag
\vertalj Section Formatting Properties Flag
\vertalt Section Formatting Properties Flag
\viewkindN ** Document Formatting Properties Value
\viewscaleN ** Document Formatting Properties Value
\viewzkN ** Document Formatting Properties Value
\wbitmap Pictures Value
\wbmbitspixel Pictures Value
\wbmplanes Pictures Value
\wbmwidthbytes Pictures Value
\widctlpar Paragraph Formatting Properties Flag
\widowctrl Document Formatting Properties Flag
\windowcaption ** Document Formatting Properties Value
\wmetafile Pictures Value
\wpeqn ** Fields Flag
\wpjst ** Document Formatting Properties Flag
\wpsp ** Document Formatting Properties Flag
\wraptrsp Document Formatting Properties Flag
\xe Index Entries Destination
\xef Index Entries Value
\yr Information Group Value
\yxe ** New Control Words Created by Asian Versions of Word 97 Flag
\zwj Special Characters Symbol
\zwnj Special Characters Symbol

#######

Disclaimer

The disk and software contained on it, including any accompanying documentation (the "Software"), are provided to you at no additional charge. Microsoft Corporation owns all rights, title, and interest in and to the Software. The user assumes the entire risk as to the accuracy and the use of the Software.

COPYRIGHT NOTICE. Copyright © 1995-1997 Microsoft Corporation. Microsoft and/or its suppliers, One Microsoft Way, Redmond, Washington 98052-6399 U.S.A. All rights reserved.

TRADEMARKS. Microsoft, Windows, Windows NT, MSN, The Microsoft Network and/or other Microsoft products referenced herein are either trademarks or registered trademarks of Microsoft. Other product and company names mentioned herein may be the trademarks of their respective owners.

The names of companies, products, people, characters and/or data mentioned herein are fictitious and are in no way intended to represent any real individual, company, product or event, unless otherwise noted.

NO WARRANTY. THE SOFTWARE IS PROVIDED "AS-IS," WITHOUT WARRANTY OF ANY KIND, AND ANY USE OF THIS SOFTWARE PRODUCT IS AT YOUR OWN RISK. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, MICROSOFT AND ITS SUPPLIERS DISCLAIM ALL WARRANTIES AND CONDITIONS, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE, TITLE, AND NON-INFRINGEMENT, WITH REGARD TO THE SOFTWARE.

LIMITATION OF LIABILITY. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL MICROSOFT OR ITS SUPPLIERS BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT, OR CONSEQUENTIAL DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR ANY OTHER PECUNIARY LOSS) ARISING OUT OF THE USE OF OR INABILITY TO USE THE SOFTWARE, EVEN IF MICROSOFT HAS BEEN ADVISED OF THE POSSIBLITY OF SUCH DAMAGES. BECAUSE SOME STATES AND JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES, THE ABOVE LIMITATION MAY NOT APPLY. MICROSOFT'S ENTIRE LIABILITY AND YOUR EXCLUSIVE REMEDY UNDER THIS EULA SHALL NOT EXCEED FIVE DOLLARS (US$5.00).

The following conditions also apply to your use of the Software:

The Software may be copied and distributed internally only, subject to the following conditions:

All text must be copied without modification and all pages must be included;

If software is included, all files on the disk(s) |must be copied without modification [the MS-DOS(R) utility diskcopy is appropriate for this purpose];

All components of this Software must be distributed together; and

This Software may not be distributed to any third party.

If you are not a Microsoft Premier customer, Microsoft shall not provide technical support for this Software.

The Software is provided with RESTRICTED RIGHTS. Use, duplication, or disclosure by the Government is subject to restrictions set forth in subparagraph (c)(1)(ii) of the Rights in Technical Data and Computer Software clause at DFARS 252.227-7013 or subparagraphs (c)(1) and (2) of the Commercial Computer Software--Restricted Rights at 48 CFR 52.227-19, as applicable. Manufacturer is Microsoft Corporation, One Microsoft Way, Redmond, WA 98052-6399. Any transfer of the Software must be accompanied by this statement and may only be transferred if first approved by Microsoft.

You agree that you will not export or re-export the Software to any country, person, entity or end user subject to U.S.A. export restrictions, and you are responsible for complying with all applicable U.S. and local export laws in connection with the use of this Software. You warrant and represent that neither the U.S.A. Bureau of Export Administration nor any other federal agency has suspended, revoked or denied you export privileges.

This EULA is governed by the laws of the State of Washington, U.S.A.