The idNode member specifies the ID of the node being passed in the call to
HrBeginStructNode. This member may not have a value of 0. A value of -1 indicates that
child nodes do not use the idNodeParent parameter to specify this node as their parent.
Instead, this node can be a parent only by enclosing child nodes in the EMF. Multiple
nodes can have an ID of -1. If the ID is not -1, the value is unique across the document.
The embedded union at the end of the MSODOCEXSTRUCTNODE is interpreted
differently depending on the type of node:
iHeadingLevel is the heading level for an msodocexStructTypeHeading.
idPara is the paragraph id for a P, TOCI, or ListBody.
idDropCap is the id of an msodocexStructTypeDropCap.
iPage is the page number for an msodocexStructTypePage.
bt is the line break type for an msodocexStructTypeTextLine.
iListLevel is the list level for an msodocexStructTypeList or
msodocexStructTypeListItem.
listType is the list type for an msodocexStructTypeListItem.
idAtn is the id of an msodocexStructTypeAnnotationBegin or
msodocexStructTypeAnnotationEnd.
cpLim is used to determine the nesting order of tables within tables for an
msodocexStructTypeTable, msodocexStructTypeTOC, or
msodocexStructTypeListBody.
typedef struct _MsoDocexStructNode
{
    int idNode;
    MSODOCEXSTRUCTTYPE nodetype;
    WCHAR* pwchAltText;
    union
    {
        int iHeadingLevel;
        ULONG idPara;
        ULONG idDropCap;
        int iPage;
        WCHAR* pwchActualText;
        MSODOCEXLINEBREAKTYPE bt;
        int iListLevel;
        MSODOCEXLISTTYPE listType;
        ULONG idAtn;
        long cpLim;
        int shapeProperty;
        MsoDocexTableAttr tableAttr;
        WCHAR* idTableHeader;
        int iTargetParentId;
    };
} MSODOCEXSTRUCTNODE;