///////////////////////////////////////////////////////////////////////////// // Name: rtfutils.cpp // Purpose: Converts Latex to Word RTF/WinHelp RTF // Author: Julian Smart // Modified by: Wlodzimiez ABX Skiba 2003/2004 Unicode support // Ron Lee // Created: 7.9.93 // RCS-ID: $Id$ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// #ifdef __GNUG__ #pragma implementation #endif // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif #ifndef WX_PRECOMP #endif #include "tex2any.h" #include "tex2rtf.h" #include #include #include #ifdef __WIN32__ #include #endif #include "bmputils.h" #include "table.h" #if !WXWIN_COMPATIBILITY_2_4 static inline wxChar* copystring(const wxChar* s) { return wxStrcpy(new wxChar[wxStrlen(s) + 1], s); } #endif wxList itemizeStack; static int indentLevel = 0; static int forbidParindent = 0; // if > 0, no parindent (e.g. in center environment) int forbidResetPar = 0; // If > 0, don't reset memory of having output a new par static wxChar *contentsLineSection = NULL; static wxChar *contentsLineValue = NULL; static TexChunk *descriptionItemArg = NULL; static wxStringList environmentStack; // Stack of paragraph styles we need to remember static int footnoteCount = 0; static int citeCount = 1; extern bool winHelp; extern bool startedSections; extern FILE *Contents; extern FILE *Chapters; extern FILE *Popups; extern FILE *WinHelpContentsFile; extern wxChar *RTFCharset; // This is defined in the Tex2Any library and isn't in use after parsing extern wxChar *BigBuffer; extern wxHashTable TexReferences; // Are we in verbatim mode? If so, format differently. static bool inVerbatim = false; // We're in a series of PopRef topics, so don't output section headings bool inPopRefSection = false; // Green colour? static bool hotSpotColour = true; static bool hotSpotUnderline = true; // Transparency (WHITE = transparent) static bool bitmapTransparency = true; // Linear RTF requires us to set the style per section. static wxChar *currentNumberStyle = NULL; static int currentItemSep = 8; static int CurrentTextWidth = 8640; // Say, six inches static int CurrentLeftMarginOdd = 400; static int CurrentLeftMarginEven = 1440; static int CurrentRightMarginOdd = 1440; static int CurrentRightMarginEven = 400; static int CurrentMarginParWidth = 2000; static int CurrentMarginParSep = 400; // Gap between marginpar and text static int CurrentMarginParX = CurrentLeftMarginOdd + CurrentTextWidth + CurrentMarginParSep; static int GutterWidth = 2300; // Two-column table dimensions, in twips static int TwoColWidthA = 1500; static int TwoColWidthB = 3000; const int PageWidth = 12242; // 8.25 inches wide for A4 // Remember the anchor in a helpref static TexChunk *helpRefText = NULL; /* * Flag to say we've just issued a \par\pard command, so don't * repeat this unnecessarily. * */ int issuedNewParagraph = 0; // Need to know whether we're in a table or figure for benefit // of listoffigures/listoftables static bool inFigure = false; static bool inTable = false; /* * Current topics * */ static wxChar *CurrentChapterName = NULL; static wxChar *CurrentSectionName = NULL; static wxChar *CurrentSubsectionName = NULL; static wxChar *CurrentTopic = NULL; static bool InPopups() { if (CurrentChapterName && (wxStrcmp(CurrentChapterName, _T("popups")) == 0)) return true; if (CurrentSectionName && (wxStrcmp(CurrentSectionName, _T("popups")) == 0)) return true; return false; } static void SetCurrentTopic(wxChar *s) { if (CurrentTopic) delete[] CurrentTopic; CurrentTopic = copystring(s); } void SetCurrentChapterName(wxChar *s) { if (CurrentChapterName) delete[] CurrentChapterName; CurrentChapterName = copystring(s); SetCurrentTopic(s); } void SetCurrentSectionName(wxChar *s) { if (CurrentSectionName) delete[] CurrentSectionName; CurrentSectionName = copystring(s); SetCurrentTopic(s); } void SetCurrentSubsectionName(wxChar *s) { if (CurrentSubsectionName) delete[] CurrentSubsectionName; CurrentSubsectionName = copystring(s); SetCurrentTopic(s); } // Indicate that a parent topic at level 'level' has children. // Level 1 is a chapter, 2 is a section, etc. void NotifyParentHasChildren(int parentLevel) { wxChar *parentTopic = NULL; switch (parentLevel) { case 1: { parentTopic = CurrentChapterName; break; } case 2: { parentTopic = CurrentSectionName; break; } case 3: { parentTopic = CurrentSubsectionName; break; } default: { break; } } if (parentTopic) { TexTopic *texTopic = (TexTopic *)TopicTable.Get(parentTopic); if (!texTopic) { texTopic = new TexTopic; TopicTable.Put(parentTopic, texTopic); } texTopic->hasChildren = true; } } // Have to keep a count of what levels are books, what are pages, // in order to correct for a Win95 bug which means that if you // have a book at level n, and then a page at level n, the page // ends up on level n + 1. bool ContentsLevels[5]; // Reset below this level (starts from 1) void ResetContentsLevels(int l) { int i; for (i = l; i < 5; i++) ContentsLevels[i] = false; // There are always books on the top level ContentsLevels[0] = true; } // Output a WinHelp section as a keyword, substituting // : for space. void OutputSectionKeyword(FILE *fd) { OutputCurrentSectionToString(wxTex2RTFBuffer); unsigned int i; for (i = 0; i < wxStrlen(wxTex2RTFBuffer); i++) if (wxTex2RTFBuffer[i] == ':') wxTex2RTFBuffer[i] = ' '; // Don't write to index if there's some RTF in the string else if ( wxTex2RTFBuffer[i] == '{' ) return; wxFprintf(fd, _T("K{\\footnote {K} ")); wxFprintf(fd, _T("%s"), wxTex2RTFBuffer); wxFprintf(fd, _T("}\n")); } // Write a line for the .cnt file, if we're doing this. void WriteWinHelpContentsFileLine(wxChar *topicName, wxChar *xitle, int level) { // First, convert any RTF characters to ASCII wxChar title[255]; int s=0; int d=0; while ( (xitle[s]!=0)&&(d<255) ) { wxChar ch=xitle[s]&0xff; if (ch==0x5c) { wxChar ch1=xitle[s+1]&0xff; wxChar ch2=xitle[s+2]&0xff; wxChar ch3=xitle[s+3]&0xff; s+=4; // next character if ((ch1==0x27)&&(ch2==0x66)&&(ch3==0x36)) { title[d++]=_T('ö'); } if ((ch1==0x27)&&(ch2==0x65)&&(ch3==0x34)) { title[d++]=_T('ä'); } if ((ch1==0x27)&&(ch2==0x66)&&(ch3==0x63)) { title[d++]=_T('ü'); } if ((ch1==0x27)&&(ch2==0x64)&&(ch3==0x36)) { title[d++]=_T('Ö'); } if ((ch1==0x27)&&(ch2==0x63)&&(ch3==0x34)) { title[d++]=_T('Ä'); } if ((ch1==0x27)&&(ch2==0x64)&&(ch3==0x63)) { title[d++]=_T('Ü'); } } else { title[d++]=ch; s++; } } title[d]=0; // Section (2) becomes level 1 if it's an article. if (DocumentStyle == LATEX_ARTICLE) level --; if (level == 0) // Means we had a Chapter in an article, oops. return; ResetContentsLevels(level); if (!title) return; if (winHelp && winHelpContents && WinHelpContentsFile) { TexTopic *texTopic = (TexTopic *)TopicTable.Get(topicName); if (texTopic) { // If a previous section at this level was a book, we *have* to have a // book not a page, because of a bug in WHC (or WinHelp 4). if (texTopic->hasChildren || level == 1 || ContentsLevels[level-1]) { // At this level, we have a pointer to a further hierarchy. // So we need a 'book' consisting of (say) Chapter 1. wxFprintf(WinHelpContentsFile, _T("%d %s\n"), level, title); // Then we have a 'page' consisting of the text for this chapter wxFprintf(WinHelpContentsFile, _T("%d %s=%s\n"), level+1, title, topicName); // Then we'll be writing out further pages or books at level + 1... // Remember that at this level, we had a book and *must* for the // remainder of sections at this level. ContentsLevels[level-1] = true; } else { wxFprintf(WinHelpContentsFile, _T("%d %s=%s\n"), level, title, topicName); } } else { if (level == 1 || ContentsLevels[level-1]) { // Always have a book at level 1 wxFprintf(WinHelpContentsFile, _T("%d %s\n"), level, title); wxFprintf(WinHelpContentsFile, _T("%d %s=%s\n"), level+1, title, topicName); ContentsLevels[level-1] = true; } else // Probably doesn't have children if it hasn't been added to the topic table wxFprintf(WinHelpContentsFile, _T("%d %s=%s\n"), level, title, topicName); } } } void SplitIndexEntry(wxChar *entry, wxChar *buf1, wxChar *buf2) { int len = wxStrlen(entry); int i = 0; while ((i < len) && entry[i] != '!') { buf1[i] = entry[i]; i ++; } buf1[i] = 0; buf2[0] = 0; int j = 0; if (entry[i] == '!') { i ++; while (i < len) { buf2[j] = entry[i]; i ++; j++; } buf2[j] = 0; } } /* * Output topic index entries in WinHelp RTF * */ void GenerateKeywordsForTopic(wxChar *topic) { TexTopic *texTopic = (TexTopic *)TopicTable.Get(topic); if (!texTopic) return; wxStringList *list = texTopic->keywords; if (list) { wxStringListNode *node = list->GetFirst(); while (node) { wxChar *s = (wxChar *)node->GetData(); // Must separate out main entry form subentry (only 1 subentry allowed) wxChar buf1[100]; wxChar buf2[100]; SplitIndexEntry(s, buf1, buf2); // Check for ':' which messes up index unsigned int i; for (i = 0; i < wxStrlen(buf1) ; i++) if (buf1[i] == ':') buf1[i] = ' '; for (i = 0; i < wxStrlen(buf2) ; i++) if (buf2[i] == ':') buf2[i] = ' '; // {K} is a strange fix to prevent words beginning with K not // being indexed properly TexOutput(_T("K{\\footnote {K} ")); TexOutput(buf1); if (wxStrlen(buf2) > 0) { // Output subentry TexOutput(_T(", ")); TexOutput(buf2); } TexOutput(_T("}\n")); node = node->GetNext(); } } } /* * Output index entry in linear RTF * */ void GenerateIndexEntry(wxChar *entry) { if (useWord) { wxChar buf1[100]; wxChar buf2[100]; SplitIndexEntry(entry, buf1, buf2); TexOutput(_T("{\\xe\\v {")); TexOutput(buf1); if (wxStrlen(buf2) > 0) { TexOutput(_T("\\:")); TexOutput(buf2); } TexOutput(_T("}}")); } } /* * Write a suitable RTF header. * */ void WriteColourTable(FILE *fd) { wxFprintf(fd, _T("{\\colortbl")); wxNode *node = ColourTable.GetFirst(); while (node) { ColourTableEntry *entry = (ColourTableEntry *)node->GetData(); wxFprintf(fd, _T("\\red%d\\green%d\\blue%d;\n"), entry->red, entry->green, entry->blue); node = node->GetNext(); } wxFprintf(fd, _T("}")); } /* * Write heading style * */ void WriteHeadingStyle(FILE *fd, int heading) { switch (heading) { case 1: { wxFprintf(fd, _T("\\sb300\\sa260\\f2\\b\\fs%d"), chapterFont*2); break; } case 2: { wxFprintf(fd, _T("\\sb200\\sa240\\f2\\b\\fs%d"), sectionFont*2); break; } case 3: { wxFprintf(fd, _T("\\sb120\\sa240\\f2\\b\\fs%d"), subsectionFont*2); break; } case 4: { wxFprintf(fd, _T("\\sb120\\sa240\\f2\\b\\fs%d"), subsectionFont*2); break; } default: break; } } void WriteRTFHeader(FILE *fd) { wxFprintf(fd, _T("{\\rtf1\\%s \\deff0\n"), RTFCharset); wxFprintf(fd, _T("{\\fonttbl{\\f0\\froman Times New Roman;}{\\f1\\ftech Symbol;}{\\f2\\fswiss Arial;}\n")); wxFprintf(fd, _T("{\\f3\\fmodern Courier;}{\\f4\\ftech Wingdings;}{\\f5\\ftech Monotype Sorts;}\n}")); /* * Style sheet */ wxFprintf(fd, _T("{\\stylesheet{\\f2\\fs22\\sa200 \\snext0 Normal;}\n")); // Headings wxFprintf(fd, _T("{\\s1 ")); WriteHeadingStyle(fd, 1); wxFprintf(fd, _T("\\sbasedon0\\snext0 heading 1;}\n")); wxFprintf(fd, _T("{\\s2 ")); WriteHeadingStyle(fd, 2); wxFprintf(fd, _T("\\sbasedon0\\snext0 heading 2;}\n")); wxFprintf(fd, _T("{\\s3 ")); WriteHeadingStyle(fd, 3); wxFprintf(fd, _T("\\sbasedon0\\snext0 heading 3;}\n")); wxFprintf(fd, _T("{\\s4 ")); WriteHeadingStyle(fd, 4); wxFprintf(fd, _T("\\sbasedon0\\snext0 heading 4;}\n")); // Code style wxFprintf(fd, _T("{\\s10\\ql \\li720\\ri0\\nowidctlpar\\faauto\\rin0\\lin720\\itap0 \\cbpat17\ \\f2\\fs20 \\sbasedon0 \\snext24 Code;}\n")); // Table of contents styles wxFprintf(fd, _T("{\\s20\\sb300\\tqr\\tldot\\tx8640 \\b\\f2 \\sbasedon0\\snext0 toc 1;}\n")); wxFprintf(fd, _T("{\\s21\\sb90\\tqr\\tldot\\li400\\tqr\\tx8640 \\f2\\fs20\\sbasedon0\\snext0 toc 2;}\n")); wxFprintf(fd, _T("{\\s22\\sb90\\tqr\\tldot\\li800\\tx8640 \\f2\\fs20 \\sbasedon0\\snext0 toc 3;}\n")); wxFprintf(fd, _T("{\\s23\\sb90\\tqr\\tldot\\li1200\\tx8640 \\f2\\fs20 \\sbasedon0\\snext0 toc 4;}\n")); // Index styles wxFprintf(fd, _T("{\\s30\\fi-200\\li200\\tqr\\tx3960 \\f2\\fs18 \\sbasedon0\\snext0 index 1;}\n")); wxFprintf(fd, _T("{\\s31\\fi-200\\li400\\tqr\\tx3960 \\f2\\fs18 \\sbasedon0\\snext0 index 2;}\n")); wxFprintf(fd, _T("{\\s32\\fi-200\\li600\\tqr\\tx3960 \\f2\\fs18 \\sbasedon0\\snext0 index 3;}\n")); wxFprintf(fd, _T("{\\s33\\fi-200\\li800\\tqr\\tx3960 \\f2\\fs18 \\sbasedon0\\snext0 index 4;}\n")); wxFprintf(fd, _T("{\\s35\\qc\\sb240\\sa120 \\b\\f2\\fs26 \\sbasedon0\\snext30 index heading;}\n")); wxFprintf(fd, _T("}\n")); WriteColourTable(fd); wxFprintf(fd, _T("\n\\ftnbj\\ftnrestart")); // Latex default is footnotes at bottom of page, not section. wxFprintf(fd, _T("\n")); } void OutputNumberStyle(wxChar *numberStyle) { if (numberStyle) { if (wxStrcmp(numberStyle, _T("arabic")) == 0) { TexOutput(_T("\\pgndec")); } else if (wxStrcmp(numberStyle, _T("roman")) == 0) { TexOutput(_T("\\pgnlcrm")); } else if (wxStrcmp(numberStyle, _T("Roman")) == 0) { TexOutput(_T("\\pgnucrm")); } else if (wxStrcmp(numberStyle, _T("alph")) == 0) { TexOutput(_T("\\pgnlcltr")); } else if (wxStrcmp(numberStyle, _T("Alph")) == 0) { TexOutput(_T("\\pgnucltr")); } } } /* * Write a Windows help project file */ bool WriteHPJ(wxChar *filename) { wxChar hpjFilename[256]; wxChar helpFile[50]; wxChar rtfFile[50]; wxStrcpy(hpjFilename, filename); StripExtension(hpjFilename); wxStrcat(hpjFilename, _T(".hpj")); wxStrcpy(helpFile, wxFileNameFromPath(filename)); StripExtension(helpFile); wxStrcpy(rtfFile, helpFile); wxStrcat(helpFile, _T(".hlp")); wxStrcat(rtfFile, _T(".rtf")); FILE *fd = wxFopen(hpjFilename, _T("w")); if (!fd) return false; wxChar *helpTitle = winHelpTitle; if (!helpTitle) helpTitle = _T("Untitled"); wxString thePath = wxPathOnly(InputFile); if (thePath.IsEmpty()) thePath = _T("."); wxFprintf(fd, _T("[OPTIONS]\n")); wxFprintf(fd, _T("BMROOT=%s ; Assume that bitmaps are where the source is\n"), thePath.c_str()); wxFprintf(fd, _T("TITLE=%s\n"), helpTitle); wxFprintf(fd, _T("CONTENTS=Contents\n")); if (winHelpVersion > 3) { wxFprintf(fd, _T("; COMPRESS=12 Hall Zeck ; Max compression, but needs lots of memory\n")); wxFprintf(fd, _T("COMPRESS=8 Zeck\n")); wxFprintf(fd, _T("LCID=0x809 0x0 0x0 ;English (British)\n")); wxFprintf(fd, _T("HLP=.\\%s.hlp\n"), wxFileNameFromPath(FileRoot)); } else { wxFprintf(fd, _T("COMPRESS=HIGH\n")); } wxFprintf(fd, _T("\n")); if (winHelpVersion > 3) { wxFprintf(fd, _T("[WINDOWS]\n")); wxFprintf(fd, _T("Main=\"\",(553,102,400,600),20736,(r14876671),(r12632256),f3\n")); wxFprintf(fd, _T("\n")); } wxFprintf(fd, _T("[FILES]\n%s\n\n"), rtfFile); wxFprintf(fd, _T("[CONFIG]\n")); if (useUpButton) wxFprintf(fd, _T("CreateButton(\"Up\", \"&Up\", \"JumpId(`%s', `Contents')\")\n"), helpFile); wxFprintf(fd, _T("BrowseButtons()\n\n")); wxFprintf(fd, _T("[MAP]\n\n[BITMAPS]\n\n")); fclose(fd); return true; } /* * Given a TexChunk with a string value, scans through the string * converting Latex-isms into RTF-isms, such as 2 newlines -> \par, * and inserting spaces at the start of lines since in Latex, a newline * implies a space, but not in RTF. * */ void ProcessText2RTF(TexChunk *chunk) { bool changed = false; int ptr = 0; int i = 0; wxChar ch = 1; int len = wxStrlen(chunk->value); while (ch != 0) { ch = chunk->value[i]; if (ch == 10) { if (inVerbatim) { BigBuffer[ptr] = 0; wxStrcat(BigBuffer, _T("\\par\n")); ptr += 5; // BigBuffer[ptr] = 0; wxStrcat(BigBuffer, _T("\\par{\\v this was verbatim}\n")); ptr += 5; i ++; changed = true; } else { // If the first character of the next line is ASCII, // put a space in. Implicit in Latex, not in RTF. /* The reason this is difficult is that you don't really know where a space would be appropriate. If you always put in a space when you find a newline, unwanted spaces appear in the text. */ if ((i > 0) && (len > i+1 && isascii(chunk->value[i+1]) && !isspace(chunk->value[i+1])) || ((len > i+1 && chunk->value[i+1] == 13) && (len > i+2 && isascii(chunk->value[i+2]) && !isspace(chunk->value[i+2])))) // if (true) { // DOS files have a 13 after the 10 BigBuffer[ptr] = 10; ptr ++; i ++; if (chunk->value[i] == 13) { BigBuffer[ptr] = 13; ptr ++; i ++; } BigBuffer[ptr] = ' '; ptr ++; // Note that the actual ASCII character seen is dealt with in the next // iteration changed = true; } else { BigBuffer[ptr] = ch; i ++; } } } else if (!inVerbatim && ch == '`' && (len >= i+1 && chunk->value[i+1] == '`')) { BigBuffer[ptr] = '"'; ptr ++; i += 2; changed = true; } else if (!inVerbatim && ch == '`') // Change ` to ' { BigBuffer[ptr] = 39; ptr ++; i += 1; changed = true; } else if (inVerbatim && ch == '\\') // Change backslash to two backslashes { BigBuffer[ptr] = '\\'; ptr ++; BigBuffer[ptr] = '\\'; ptr ++; i += 1; changed = true; } else if (inVerbatim && (ch == '{' || ch == '}')) // Escape the curley bracket { BigBuffer[ptr] = '\\'; ptr ++; BigBuffer[ptr] = ch; ptr ++; i += 1; changed = true; } else { BigBuffer[ptr] = ch; i ++; ptr ++; } } BigBuffer[ptr] = 0; if (changed) { delete[] chunk->value; chunk->value = copystring(BigBuffer); } } /* * Scan through all chunks starting from the given one, * calling ProcessText2RTF to convert Latex-isms to RTF-isms. * This should be called after Tex2Any has parsed the file, * and before TraverseDocument is called. * */ void Text2RTF(TexChunk *chunk) { Tex2RTFYield(); if (stopRunning) return; switch (chunk->type) { case CHUNK_TYPE_MACRO: { TexMacroDef *def = chunk->def; if (def && def->ignore) return; if (def && (def->macroId == ltVERBATIM || def->macroId == ltVERB)) inVerbatim = true; wxNode *node = chunk->children.GetFirst(); while (node) { TexChunk *child_chunk = (TexChunk *)node->GetData(); Text2RTF(child_chunk); node = node->GetNext(); } if (def && (def->macroId == ltVERBATIM || def->macroId == ltVERB)) inVerbatim = false; break; } case CHUNK_TYPE_ARG: { wxNode *node = chunk->children.GetFirst(); while (node) { TexChunk *child_chunk = (TexChunk *)node->GetData(); Text2RTF(child_chunk); node = node->GetNext(); } break; } case CHUNK_TYPE_STRING: { if (chunk->value) ProcessText2RTF(chunk); break; } } } /* * Not used yet * */ wxChar browseBuf[10]; static long browseId = 0; wxChar *GetBrowseString(void) { wxChar buf[10]; browseId ++; wxSnprintf(buf, sizeof(buf), _T("%ld"), browseId); int noZeroes = 5-wxStrlen(buf); wxStrcpy(browseBuf, _T("browse")); for (int i = 0; i < noZeroes; i++) wxStrcat(browseBuf, _T("0")); wxStrcat(browseBuf, buf); return browseBuf; } /* * Keeping track of environments to restore the styles after \pard. * Push strings like "\qc" onto stack. * */ void PushEnvironmentStyle(wxChar *style) { environmentStack.Add(style); } void PopEnvironmentStyle(void) { wxStringListNode *node = environmentStack.GetLast(); if (node) { wxChar *val = (wxChar *)node->GetData(); delete[] val; delete node; } } // Write out the styles, most recent first. void WriteEnvironmentStyles(void) { wxStringListNode *node = environmentStack.GetLast(); while (node) { wxChar *val = (wxChar *)node->GetData(); TexOutput(val); node = node->GetNext(); } if (!inTabular && (ParIndent > 0) && (forbidParindent == 0)) { wxChar buf[15]; wxSnprintf(buf, sizeof(buf), _T("\\fi%d"), ParIndent*20); // Convert points to TWIPS TexOutput(buf); } if (environmentStack.GetCount() > 0 || (ParIndent > 0)) TexOutput(_T("\n")); } /* * Output a header * */ void OutputRTFHeaderCommands(void) { wxChar buf[300]; if (PageStyle && wxStrcmp(PageStyle, _T("plain")) == 0) { TexOutput(_T("{\\headerl }{\\headerr }")); } else if (PageStyle && wxStrcmp(PageStyle, _T("empty")) == 0) { TexOutput(_T("{\\headerl }{\\headerr }")); } else if (PageStyle && wxStrcmp(PageStyle, _T("headings")) == 0) { // Left header TexOutput(_T("{\\headerl\\fi0 ")); if (headerRule) TexOutput(_T("\\brdrb\\brdrs\\brdrw15\\brsp20 ")); TexOutput(_T("{\\i \\qr ")); if (DocumentStyle == LATEX_ARTICLE) { wxSnprintf(buf, sizeof(buf), _T("SECTION %d"), sectionNo); TexOutput(buf); } else { wxSnprintf(buf, sizeof(buf), _T("CHAPTER %d: "), chapterNo); TexOutput(buf); } TexOutput(_T("{\\field{\\*\\fldinst PAGE \\\\* MERGEFORMAT }{\\fldrslt 1}}")); TexOutput(_T("}\\par\\pard}")); // Right header TexOutput(_T("{\\headerr\\fi0 ")); if (headerRule) TexOutput(_T("\\brdrb\\brdrs\\brdrw15\\brsp20 ")); TexOutput(_T("{\\i \\qc ")); if (DocumentStyle == LATEX_ARTICLE) { wxSnprintf(buf, sizeof(buf), _T("SECTION %d"), sectionNo); TexOutput(buf); } else { wxSnprintf(buf, sizeof(buf), _T("CHAPTER %d"), chapterNo); TexOutput(buf); } TexOutput(_T("{\\field{\\*\\fldinst PAGE \\\\* MERGEFORMAT }{\\fldrslt 1}}")); TexOutput(_T("}\\par\\pard}")); } else { int oldForbidResetPar = forbidResetPar; forbidResetPar = 0; if (LeftHeaderEven || CentreHeaderEven || RightHeaderEven) { TexOutput(_T("{\\headerl\\fi0 ")); if (headerRule) TexOutput(_T("\\brdrb\\brdrs\\brdrw15\\brsp20 ")); if (LeftHeaderEven) { if (!CentreHeaderEven && !RightHeaderEven) TexOutput(_T("\\ql ")); TraverseChildrenFromChunk(LeftHeaderEven); } if (CentreHeaderEven) { if (!LeftHeaderEven && !RightHeaderEven) TexOutput(_T("\\qc ")); else TexOutput(_T("\\tab\\tab\\tab ")); TraverseChildrenFromChunk(CentreHeaderEven); } if (RightHeaderEven) { if (!LeftHeaderEven && !CentreHeaderEven) TexOutput(_T("\\qr ")); else TexOutput(_T("\\tab\\tab\\tab\\tab\\tab\\tab ")); TraverseChildrenFromChunk(RightHeaderEven); } TexOutput(_T("\\par\\pard}")); } if (LeftHeaderOdd || CentreHeaderOdd || RightHeaderOdd) { TexOutput(_T("{\\headerr\\fi0 ")); if (headerRule) TexOutput(_T("\\brdrb\\brdrs\\brdrw15\\brsp20 ")); if (LeftHeaderOdd) { if (!CentreHeaderOdd && !RightHeaderOdd) TexOutput(_T("\\ql ")); TraverseChildrenFromChunk(LeftHeaderOdd); } if (CentreHeaderOdd) { if (!LeftHeaderOdd && !RightHeaderOdd) TexOutput(_T("\\qc ")); else TexOutput(_T("\\tab\\tab\\tab ")); TraverseChildrenFromChunk(CentreHeaderOdd); } if (RightHeaderOdd) { if (!LeftHeaderOdd && !CentreHeaderOdd) TexOutput(_T("\\qr ")); else TexOutput(_T("\\tab\\tab\\tab\\tab\\tab\\tab ")); TraverseChildrenFromChunk(RightHeaderOdd); } TexOutput(_T("\\par\\pard}")); } // As an approximation, don't put a header on the first page of a section. // This may not always be desired, but it's a reasonable guess. TexOutput(_T("{\\headerf }")); forbidResetPar = oldForbidResetPar; } } void OutputRTFFooterCommands(void) { if (PageStyle && wxStrcmp(PageStyle, _T("plain")) == 0) { TexOutput(_T("{\\footerl\\fi0 ")); if (footerRule) TexOutput(_T("\\brdrt\\brdrs\\brdrw15\\brsp20 ")); TexOutput(_T("{\\qc ")); TexOutput(_T("{\\field{\\*\\fldinst PAGE \\\\* MERGEFORMAT }{\\fldrslt 1}}")); TexOutput(_T("}\\par\\pard}")); TexOutput(_T("{\\footerr\\fi0 ")); if (footerRule) TexOutput(_T("\\brdrt\\brdrs\\brdrw15\\brsp20 ")); TexOutput(_T("{\\qc ")); TexOutput(_T("{\\field{\\*\\fldinst PAGE \\\\* MERGEFORMAT }{\\fldrslt 1}}")); TexOutput(_T("}\\par\\pard}")); } else if (PageStyle && wxStrcmp(PageStyle, _T("empty")) == 0) { TexOutput(_T("{\\footerl }{\\footerr }")); } else if (PageStyle && wxStrcmp(PageStyle, _T("headings")) == 0) { TexOutput(_T("{\\footerl }{\\footerr }")); } else { if (LeftFooterEven || CentreFooterEven || RightFooterEven) { TexOutput(_T("{\\footerl\\fi0 ")); if (footerRule) TexOutput(_T("\\brdrt\\brdrs\\brdrw15\\brsp20 ")); if (LeftFooterEven) { if (!CentreFooterEven && !RightFooterEven) TexOutput(_T("\\ql ")); TraverseChildrenFromChunk(LeftFooterEven); } if (CentreFooterEven) { if (!LeftFooterEven && !RightFooterEven) TexOutput(_T("\\qc ")); else TexOutput(_T("\\tab\\tab\\tab ")); TraverseChildrenFromChunk(CentreFooterEven); } if (RightFooterEven) { if (!LeftFooterEven && !CentreFooterEven) TexOutput(_T("\\qr ")); else TexOutput(_T("\\tab\\tab\\tab\\tab\\tab\\tab ")); TraverseChildrenFromChunk(RightFooterEven); } TexOutput(_T("\\par\\pard}")); } if (LeftFooterOdd || CentreFooterOdd || RightFooterOdd) { TexOutput(_T("{\\footerr\\fi0 ")); if (footerRule) TexOutput(_T("\\brdrt\\brdrs\\brdrw15\\brsp20 ")); if (LeftFooterOdd) { if (!CentreFooterOdd && !RightFooterOdd) TexOutput(_T("\\ql ")); TraverseChildrenFromChunk(LeftFooterOdd); } if (CentreFooterOdd) { if (!LeftFooterOdd && !RightFooterOdd) TexOutput(_T("\\qc ")); else TexOutput(_T("\\tab\\tab\\tab ")); TraverseChildrenFromChunk(CentreFooterOdd); } if (RightFooterOdd) { if (!LeftFooterOdd && !CentreFooterOdd) TexOutput(_T("\\qr ")); else TexOutput(_T("\\tab\\tab\\tab\\tab\\tab\\tab ")); TraverseChildrenFromChunk(RightFooterOdd); } TexOutput(_T("\\par\\pard}")); } // As an approximation, put a footer on the first page of a section. // This may not always be desired, but it's a reasonable guess. if (LeftFooterOdd || CentreFooterOdd || RightFooterOdd) { TexOutput(_T("{\\footerf\\fi0 ")); if (LeftFooterOdd) { if (!CentreFooterOdd && !RightFooterOdd) TexOutput(_T("\\ql ")); TraverseChildrenFromChunk(LeftFooterOdd); } if (CentreFooterOdd) { if (!LeftFooterOdd && !RightFooterOdd) TexOutput(_T("\\qc ")); else TexOutput(_T("\\tab\\tab\\tab ")); TraverseChildrenFromChunk(CentreFooterOdd); } if (RightFooterOdd) { if (!LeftFooterOdd && !CentreFooterOdd) TexOutput(_T("\\qr ")); else TexOutput(_T("\\tab\\tab\\tab\\tab\\tab\\tab ")); TraverseChildrenFromChunk(RightFooterOdd); } TexOutput(_T("\\par\\pard}")); } } } // Called on start/end of macro examination void RTFOnMacro(int macroId, int no_args, bool start) { /* wxChar tmpBuf[40]; wxSnprintf(tmpBuf, sizeof(tmpBuf), _T("%d (%d)"), macroId, (int)start); OutputDebugString("RTFOnMacro Start "); OutputDebugString(tmpBuf); OutputDebugString("\n"); wxYield(); */ // ltLABEL is included here because after a section but BEFORE // the label is seen, a new paragraph is issued. Don't upset this by // immediately forgetting we've done it. if (start && (macroId != ltPAR && macroId != ltITEMIZE && macroId != ltENUMERATE && macroId != ltDESCRIPTION && macroId != ltVERBATIM && macroId != ltLABEL && macroId != ltSETHEADER && macroId != ltSETFOOTER && macroId != ltPAGENUMBERING && (forbidResetPar == 0))) { issuedNewParagraph = 0; } wxChar buf[300]; switch (macroId) { case ltCHAPTER: case ltCHAPTERSTAR: case ltCHAPTERHEADING: case ltCHAPTERHEADINGSTAR: { if (!start) { sectionNo = 0; figureNo = 0; tableNo = 0; subsectionNo = 0; subsubsectionNo = 0; footnoteCount = 0; if (macroId != ltCHAPTERSTAR && macroId != ltCHAPTERHEADINGSTAR) chapterNo ++; wxChar *topicName = FindTopicName(GetNextChunk()); SetCurrentChapterName(topicName); if (winHelpContents && winHelp && !InPopups()) { OutputCurrentSectionToString(wxTex2RTFBuffer); WriteWinHelpContentsFileLine(topicName, wxTex2RTFBuffer, 1); } AddTexRef(topicName, NULL, ChapterNameString, chapterNo); if (winHelp) { if (!InPopups()) wxFprintf(Contents, _T("\n{\\uldb ")); wxFprintf(Chapters, _T("\\page")); wxFprintf(Chapters, _T("\n${\\footnote ")); if (!InPopups()) SetCurrentOutputs(Contents, Chapters); else SetCurrentOutput(Chapters); } else { wxFprintf(Chapters, _T("\\sect\\pgncont\\titlepg\n")); // If a non-custom page style, we generate the header now. if (PageStyle && (wxStrcmp(PageStyle, _T("plain")) == 0 || wxStrcmp(PageStyle, _T("empty")) == 0 || wxStrcmp(PageStyle, _T("headings")) == 0)) { OutputRTFHeaderCommands(); OutputRTFFooterCommands(); } // Need to reset the current numbering style, or RTF forgets it. SetCurrentOutput(Chapters); OutputNumberStyle(currentNumberStyle); SetCurrentOutput(Contents); if (!InPopups()) { if (macroId == ltCHAPTER) { // Section wxFprintf(Contents, _T("\\par\n\\pard{\\b %d\\tab "), chapterNo); } else if (macroId == ltCHAPTERHEADING) { wxFprintf(Contents, _T("\\par\n\\pard{\\b ")); } else SetCurrentOutput(NULL); // No entry in table of contents } } startedSections = true; // Output heading to contents page if (!InPopups()) { OutputCurrentSection(); if (winHelp) { wxFprintf(Contents, _T("}{\\v %s}\\pard\\par\n"), topicName); //WriteEnvironmentStyles(); } else if ((macroId == ltCHAPTER) || (macroId == ltCHAPTERHEADING)) wxFprintf(Contents, _T("}\\par\\par\\pard\n")); // From here, just output to chapter SetCurrentOutput(Chapters); } if (winHelp) { wxFprintf(Chapters, _T("}\n#{\\footnote %s}\n"), topicName); wxFprintf(Chapters, _T("+{\\footnote %s}\n"), GetBrowseString()); OutputSectionKeyword(Chapters); GenerateKeywordsForTopic(topicName); if (useUpButton) { // If we're generating a .cnt file, we don't want to be able // jump up to the old-style contents page, so disable it. if (winHelpContents) wxFprintf(Chapters, _T("!{\\footnote DisableButton(\"Up\")}\n")); else wxFprintf(Chapters, _T("!{\\footnote EnableButton(\"Up\");ChangeButtonBinding(\"Up\", \"JumpId(`%s.hlp', `%s')\")}\n"), wxFileNameFromPath(FileRoot), _T("Contents")); } } if (!InPopups()) { wxChar *styleCommand = _T(""); if (!winHelp && useHeadingStyles && (macroId == ltCHAPTER || macroId == ltCHAPTERHEADING || macroId == ltCHAPTERHEADINGSTAR)) styleCommand = _T("\\s1"); wxFprintf(Chapters, _T("\\pard{%s"), ((winHelp && !InPopups()) ? _T("\\keepn\\sa140\\sb140") : styleCommand)); WriteHeadingStyle(Chapters, 1); wxFprintf(Chapters, _T(" ")); if (!winHelp) { if (macroId == ltCHAPTER) { if (useWord) // wxFprintf(Chapters, "{\\bkmkstart %s}%d{\\bkmkend %s}. ", topicName, chapterNo, wxFprintf(Chapters, _T("{\\bkmkstart %s}{\\bkmkend %s}"), topicName, topicName); else wxFprintf(Chapters, _T("%d. "), chapterNo); } else if ( useWord ) { wxFprintf(Chapters, _T("{\\bkmkstart %s}{\\bkmkend %s}"), topicName, topicName); } } OutputCurrentSection(); TexOutput(_T("\\par\\pard}\n")); } issuedNewParagraph = 1; WriteEnvironmentStyles(); } break; } case ltSECTION: case ltSECTIONSTAR: case ltSECTIONHEADING: case ltSECTIONHEADINGSTAR: case ltGLOSS: { FILE *jumpFrom; if (DocumentStyle == LATEX_ARTICLE) jumpFrom = Contents; else jumpFrom = Chapters; if (!start) { subsectionNo = 0; subsubsectionNo = 0; if (DocumentStyle == LATEX_ARTICLE) footnoteCount = 0; if (macroId != ltSECTIONSTAR && macroId != ltSECTIONHEADINGSTAR) sectionNo ++; wxChar *topicName = FindTopicName(GetNextChunk()); SetCurrentSectionName(topicName); NotifyParentHasChildren(1); if (winHelpContents && winHelp && !InPopups()) { OutputCurrentSectionToString(wxTex2RTFBuffer); WriteWinHelpContentsFileLine(topicName, wxTex2RTFBuffer, 2); } AddTexRef(topicName, NULL, SectionNameString, chapterNo, sectionNo); if (winHelp) { SetCurrentOutputs(jumpFrom, Sections); // Newline for a new section if this is an article if ((DocumentStyle == LATEX_ARTICLE) && ((macroId == ltSECTION) || (macroId == ltSECTIONSTAR) || (macroId == ltSECTIONHEADINGSTAR))) wxFprintf(Sections, _T("\\page\n")); if (!InPopups()) wxFprintf(jumpFrom, _T("\n{\\uldb ")); } else { if (DocumentStyle == LATEX_ARTICLE) { TexOutput(_T("\\sect\\pgncont\n")); // If a non-custom page style, we generate the header now. if (PageStyle && (wxStrcmp(PageStyle, _T("plain")) == 0 || wxStrcmp(PageStyle, _T("empty")) == 0 || wxStrcmp(PageStyle, _T("headings")) == 0)) { OutputRTFHeaderCommands(); OutputRTFFooterCommands(); } } SetCurrentOutput(Contents); if (macroId == ltSECTION) { if (!InPopups()) { if (DocumentStyle == LATEX_REPORT) wxFprintf(Contents, _T("\n\\pard{\\tab %d.%d\\tab "), chapterNo, sectionNo); else wxFprintf(Contents, _T("\\par\n\\pard{\\b %d\\tab "), sectionNo); } } else if (macroId == ltSECTIONHEADING) { if (!InPopups()) { if (DocumentStyle == LATEX_REPORT) wxFprintf(Contents, _T("\n\\pard{\\tab ")); //, chapterNo, sectionNo); else wxFprintf(Contents, _T("\\par\n\\pard{\\b ")); //, sectionNo); } } else SetCurrentOutput(NULL); } if (startedSections) { if (winHelp) wxFprintf(Sections, _T("\\page\n")); } startedSections = true; if (winHelp) wxFprintf(Sections, _T("\n${\\footnote ")); // Output heading to contents page if (!InPopups()) OutputCurrentSection(); if (winHelp) { if (!InPopups()) { wxFprintf(jumpFrom, _T("}{\\v %s}\\pard\\par\n"), topicName); //WriteEnvironmentStyles(); } } else if ((macroId != ltSECTIONSTAR) && (macroId != ltGLOSS)) { if (DocumentStyle == LATEX_REPORT) wxFprintf(Contents, _T("}\\par\\pard\n")); else wxFprintf(Contents, _T("}\\par\\par\\pard\n")); } SetCurrentOutput(winHelp ? Sections : Chapters); if (winHelp) { wxFprintf(Sections, _T("}\n#{\\footnote %s}\n"), topicName); wxFprintf(Sections, _T("+{\\footnote %s}\n"), GetBrowseString()); OutputSectionKeyword(Sections); GenerateKeywordsForTopic(topicName); if (useUpButton) { if (DocumentStyle == LATEX_ARTICLE) { wxFprintf(Sections, _T("!{\\footnote EnableButton(\"Up\");ChangeButtonBinding(\"Up\", \"JumpId(`%s.hlp', `%s')\")}\n"), wxFileNameFromPath(FileRoot), _T("Contents")); } else if (CurrentChapterName) { wxFprintf(Sections, _T("!{\\footnote EnableButton(\"Up\");ChangeButtonBinding(\"Up\", \"JumpId(`%s.hlp', `%s')\")}\n"), wxFileNameFromPath(FileRoot), CurrentChapterName); } } } if (!InPopups()) { wxChar *styleCommand = _T(""); if (!winHelp && useHeadingStyles && (macroId != ltSECTIONSTAR)) { if (DocumentStyle == LATEX_ARTICLE) styleCommand = _T("\\s1"); else styleCommand = _T("\\s2"); } wxChar *keep = _T(""); if (winHelp && (macroId != ltGLOSS) && !InPopups()) keep = _T("\\keepn\\sa140\\sb140"); wxFprintf(winHelp ? Sections : Chapters, _T("\\pard{%s%s"), keep, styleCommand); WriteHeadingStyle((winHelp ? Sections : Chapters), (DocumentStyle == LATEX_ARTICLE ? 1 : 2)); wxFprintf(winHelp ? Sections : Chapters, _T(" ")); if (!winHelp) { if ((macroId != ltSECTIONSTAR) && (macroId != ltSECTIONHEADINGSTAR) && (macroId != ltGLOSS)) { if (DocumentStyle == LATEX_REPORT) { if (useWord) // wxFprintf(Chapters, _T("{\\bkmkstart %s}%d.%d{\\bkmkend %s}. "), topicName, chapterNo, sectionNo, wxFprintf(Chapters, _T("{\\bkmkstart %s}{\\bkmkend %s}"), topicName, topicName); else wxFprintf(Chapters, _T("%d.%d. "), chapterNo, sectionNo); } else { if (useWord) // wxFprintf(Chapters, "{\\bkmkstart %s}%d{\\bkmkend %s}. ", topicName, sectionNo, wxFprintf(Chapters, _T("{\\bkmkstart %s}{\\bkmkend %s}"), topicName, topicName); else wxFprintf(Chapters, _T("%d. "), sectionNo); } } else if ( useWord ) { wxFprintf(Chapters, _T("{\\bkmkstart %s}{\\bkmkend %s}"), topicName, topicName); } } OutputCurrentSection(); TexOutput(_T("\\par\\pard}\n")); // TexOutput(_T("\\par\\pard}\\par\n")); } issuedNewParagraph = 1; WriteEnvironmentStyles(); // issuedNewParagraph = 2; } break; } case ltSUBSECTION: case ltSUBSECTIONSTAR: case ltMEMBERSECTION: case ltFUNCTIONSECTION: { if (!start) { if (winHelp && !Sections) { OnError(_T("You cannot have a subsection before a section!")); } else { subsubsectionNo = 0; if (macroId != ltSUBSECTIONSTAR) subsectionNo ++; wxChar *topicName = FindTopicName(GetNextChunk()); SetCurrentSubsectionName(topicName); NotifyParentHasChildren(2); if (winHelpContents && winHelp && !InPopups()) { OutputCurrentSectionToString(wxTex2RTFBuffer); WriteWinHelpContentsFileLine(topicName, wxTex2RTFBuffer, 3); } AddTexRef(topicName, NULL, SectionNameString, chapterNo, sectionNo, subsectionNo); if (winHelp) { SetCurrentOutputs(Sections, Subsections); SetCurrentOutputs(Sections, Subsections); if (!InPopups()) wxFprintf(Sections, _T("\n{\\uldb ")); } else { if ((macroId != ltSUBSECTIONSTAR) && (macroId != ltMEMBERSECTION) && (macroId != ltFUNCTIONSECTION)) { SetCurrentOutput(Contents); if (DocumentStyle == LATEX_REPORT) wxFprintf(Contents, _T("\n\\pard\\tab\\tab %d.%d.%d\\tab "), chapterNo, sectionNo, subsectionNo); else wxFprintf(Contents, _T("\n\\pard\\tab %d.%d\\tab "), sectionNo, subsectionNo); } else SetCurrentOutput(NULL); } if (startedSections) { if (winHelp) { if (!InPopups()) wxFprintf(Subsections, _T("\\page\n")); } // Experimental JACS 2004-02-21 #if 0 else wxFprintf(Chapters, _T("\\par\n")); #endif } startedSections = true; if (winHelp) wxFprintf(Subsections, _T("\n${\\footnote ")); // Output to contents page if (!InPopups()) OutputCurrentSection(); if (winHelp) { if (!InPopups()) { wxFprintf(Sections, _T("}{\\v %s}\\pard\\par\n"), topicName); //WriteEnvironmentStyles(); } } else if ((macroId != ltSUBSECTIONSTAR) && (macroId != ltMEMBERSECTION) && (macroId != ltFUNCTIONSECTION)) wxFprintf(Contents, _T("\\par\\pard\n")); SetCurrentOutput(winHelp ? Subsections : Chapters); if (winHelp) { wxFprintf(Subsections, _T("}\n#{\\footnote %s}\n"), topicName); wxFprintf(Subsections, _T("+{\\footnote %s}\n"), GetBrowseString()); OutputSectionKeyword(Subsections); GenerateKeywordsForTopic(topicName); if (useUpButton && CurrentSectionName) { wxFprintf(Subsections, _T("!{\\footnote EnableButton(\"Up\");ChangeButtonBinding(\"Up\", \"JumpId(`%s.hlp', `%s')\")}\n"), wxFileNameFromPath(FileRoot), CurrentSectionName); } } if (!winHelp && indexSubsections && useWord) { // Insert index entry for this subsection TexOutput(_T("{\\xe\\v {")); OutputCurrentSection(); TexOutput(_T("}}")); } if (!InPopups()) { wxChar *styleCommand = _T(""); if (!winHelp && useHeadingStyles && (macroId != ltSUBSECTIONSTAR)) { if (DocumentStyle == LATEX_ARTICLE) styleCommand = _T("\\s2"); else styleCommand = _T("\\s3"); } wxChar *keep = _T(""); if (winHelp && !InPopups()) keep = _T("\\keepn\\sa140\\sb140"); wxFprintf(winHelp ? Subsections : Chapters, _T("\\pard{%s%s"), keep, styleCommand); WriteHeadingStyle((winHelp ? Subsections : Chapters), (DocumentStyle == LATEX_ARTICLE ? 2 : 3)); wxFprintf(winHelp ? Subsections : Chapters, _T(" ")); if (!winHelp) { if ((macroId != ltSUBSECTIONSTAR) && (macroId != ltMEMBERSECTION) && (macroId != ltFUNCTIONSECTION)) { if (DocumentStyle == LATEX_REPORT) { if (useWord) // wxFprintf(Chapters, _T("{\\bkmkstart %s}%d.%d.%d{\\bkmkend %s}. "), topicName, chapterNo, sectionNo, subsectionNo, wxFprintf(Chapters, _T("{\\bkmkstart %s}{\\bkmkend %s}"), topicName, topicName); else wxFprintf(Chapters, _T("%d.%d.%d. "), chapterNo, sectionNo, subsectionNo); } else { if (useWord) // wxFprintf(Chapters, _T("{\\bkmkstart %s}%d.%d{\\bkmkend %s}. "), topicName, sectionNo, subsectionNo, wxFprintf(Chapters, _T("{\\bkmkstart %s}{\\bkmkend %s}"), topicName, topicName); else wxFprintf(Chapters, _T("%d.%d. "), sectionNo, subsectionNo); } } else if ( useWord ) { wxFprintf(Chapters, _T("{\\bkmkstart %s}{\\bkmkend %s}"), topicName, topicName); } } OutputCurrentSection(); // Repeat section header // Experimental JACS TexOutput(_T("\\par\\pard}\n")); // TexOutput(_T("\\par\\pard}\\par\n")); } issuedNewParagraph = 1; WriteEnvironmentStyles(); } } break; } case ltSUBSUBSECTION: case ltSUBSUBSECTIONSTAR: { if (!start) { if (winHelp && !Subsections) { OnError(_T("You cannot have a subsubsection before a subsection!")); } else { if (macroId != ltSUBSUBSECTIONSTAR) subsubsectionNo ++; wxChar *topicName = FindTopicName(GetNextChunk()); SetCurrentTopic(topicName); NotifyParentHasChildren(3); if (winHelpContents && winHelp) { OutputCurrentSectionToString(wxTex2RTFBuffer); WriteWinHelpContentsFileLine(topicName, wxTex2RTFBuffer, 4); } AddTexRef(topicName, NULL, SectionNameString, chapterNo, sectionNo, subsectionNo, subsubsectionNo); if (winHelp) { SetCurrentOutputs(Subsections, Subsubsections); wxFprintf(Subsections, _T("\n{\\uldb ")); } else { if (macroId != ltSUBSUBSECTIONSTAR) { if (DocumentStyle == LATEX_ARTICLE) { SetCurrentOutput(Contents); wxFprintf(Contents, _T("\n\\tab\\tab %d.%d.%d\\tab "), sectionNo, subsectionNo, subsubsectionNo); } else SetCurrentOutput(NULL); // Don't write it into the contents, or anywhere else } else SetCurrentOutput(NULL); // Don't write it into the contents, or anywhere else } if (startedSections) { if (winHelp) wxFprintf(Subsubsections, _T("\\page\n")); // Experimental JACS 2004-02-21 #if 0 else wxFprintf(Chapters, _T("\\par\n")); #endif } startedSections = true; if (winHelp) wxFprintf(Subsubsections, _T("\n${\\footnote ")); // Output header to contents page OutputCurrentSection(); if (winHelp) { wxFprintf(Subsections, _T("}{\\v %s}\\pard\\par\n"), topicName); //WriteEnvironmentStyles(); } else if ((DocumentStyle == LATEX_ARTICLE) && (macroId != ltSUBSUBSECTIONSTAR)) wxFprintf(Contents, _T("\\par\\pard\n")); SetCurrentOutput(winHelp ? Subsubsections : Chapters); if (winHelp) { wxFprintf(Subsubsections, _T("}\n#{\\footnote %s}\n"), topicName); wxFprintf(Subsubsections, _T("+{\\footnote %s}\n"), GetBrowseString()); OutputSectionKeyword(Subsubsections); GenerateKeywordsForTopic(topicName); if (useUpButton && CurrentSubsectionName) { wxFprintf(Subsubsections, _T("!{\\footnote EnableButton(\"Up\");ChangeButtonBinding(\"Up\", \"JumpId(`%s.hlp', `%s')\")}\n"), wxFileNameFromPath(FileRoot), CurrentSubsectionName); } } if (!winHelp && indexSubsections && useWord) { // Insert index entry for this subsubsection TexOutput(_T("{\\xe\\v {")); OutputCurrentSection(); TexOutput(_T("}}")); } wxChar *styleCommand = _T(""); if (!winHelp && useHeadingStyles && (macroId != ltSUBSUBSECTIONSTAR)) { if (DocumentStyle == LATEX_ARTICLE) styleCommand = _T("\\s3"); else styleCommand = _T("\\s4"); } wxChar *keep = _T(""); if (winHelp) keep = _T("\\keepn\\sa140\\sb140"); wxFprintf(winHelp ? Subsubsections : Chapters, _T("\\pard{%s%s"), keep, styleCommand); WriteHeadingStyle((winHelp ? Subsubsections : Chapters), (DocumentStyle == LATEX_ARTICLE ? 3 : 4)); wxFprintf(winHelp ? Subsubsections : Chapters, _T(" ")); if (!winHelp) { if ((macroId != ltSUBSUBSECTIONSTAR)) { if (DocumentStyle == LATEX_ARTICLE) { if (useWord) // wxFprintf(Chapters, _T("{\\bkmkstart %s}%d.%d.%d{\\bkmkend %s}. "), topicName, sectionNo, subsectionNo, subsubsectionNo, wxFprintf(Chapters, _T("{\\bkmkstart %s}{\\bkmkend %s}"), topicName, topicName); else wxFprintf(Chapters, _T("%d.%d.%d. "), sectionNo, subsectionNo, subsubsectionNo); } else { if (useWord) // wxFprintf(Chapters, _T("{\\bkmkstart %s}%d.%d.%d.%d{\\bkmkend %s}. "), topicName, chapterNo, sectionNo, subsectionNo, subsubsectionNo, wxFprintf(Chapters, _T("{\\bkmkstart %s}{\\bkmkend %s}"), topicName, topicName); else wxFprintf(Chapters, _T("%d.%d.%d.%d. "), chapterNo, sectionNo, subsectionNo, subsubsectionNo); } } else if ( useWord ) { wxFprintf(Chapters, _T("{\\bkmkstart %s}{\\bkmkend %s}"), topicName, topicName); } } OutputCurrentSection(); // Repeat section header TexOutput(_T("\\par\\pard}\n")); issuedNewParagraph = 1; WriteEnvironmentStyles(); // TexOutput(_T("\\par\\pard}\\par\n")); // issuedNewParagraph = 2; } } break; } case ltCAPTION: case ltCAPTIONSTAR: { if (!start) { wxChar *topicName = FindTopicName(GetNextChunk()); SetCurrentTopic(topicName); TexOutput(_T("\\pard\\par")); wxChar figBuf[200]; if (inFigure) { figureNo ++; if (winHelp || !useWord) { if (DocumentStyle != LATEX_ARTICLE) wxSnprintf(figBuf, sizeof(figBuf), _T("%s %d.%d: "), FigureNameString, chapterNo, figureNo); else wxSnprintf(figBuf, sizeof(figBuf), _T("%s %d: "), FigureNameString, figureNo); } else { wxSnprintf(figBuf, sizeof(figBuf), _T("%s {\\field\\flddirty{\\*\\fldinst SEQ Figure \\\\* ARABIC }{\\fldrslt {\\bkmkstart %s}??{\\bkmkend %s}}}: "), FigureNameString, topicName, topicName); } } else { tableNo ++; if (winHelp || !useWord) { if (DocumentStyle != LATEX_ARTICLE) wxSnprintf(figBuf, sizeof(figBuf), _T("%s %d.%d: "), TableNameString, chapterNo, tableNo); else wxSnprintf(figBuf, sizeof(figBuf), _T("%s %d: "), TableNameString, tableNo); } else { wxSnprintf(figBuf, sizeof(figBuf), _T("%s {\\field\\flddirty{\\*\\fldinst SEQ Table \\\\* ARABIC }{\\fldrslt {\\bkmkstart %s}??{\\bkmkend %s}}}: "), TableNameString, topicName, topicName); } } int n = (inTable ? tableNo : figureNo); AddTexRef(topicName, NULL, NULL, ((DocumentStyle != LATEX_ARTICLE) ? chapterNo : n), ((DocumentStyle != LATEX_ARTICLE) ? n : 0)); if (winHelp) TexOutput(_T("\\qc{\\b ")); else TexOutput(_T("\\ql{\\b ")); TexOutput(figBuf); OutputCurrentSection(); TexOutput(_T("}\\par\\pard\n")); WriteEnvironmentStyles(); } break; } case ltFUNC: case ltPFUNC: { // SetCurrentOutput(winHelp ? Subsections : Chapters); if (start) { TexOutput(_T("{")); } else { TexOutput(_T("}\n")); if (winHelp) { TexOutput(_T("K{\\footnote {K} ")); suppressNameDecoration = true; TraverseChildrenFromChunk(currentMember); suppressNameDecoration = false; TexOutput(_T("}\n")); } if (!winHelp && useWord) { // Insert index entry for this function TexOutput(_T("{\\xe\\v {")); suppressNameDecoration = true; // Necessary so don't print "(\\bf" etc. TraverseChildrenFromChunk(currentMember); suppressNameDecoration = false; TexOutput(_T("}}")); } } break; } case ltCLIPSFUNC: { // SetCurrentOutput(winHelp ? Subsections : Chapters); if (start) { TexOutput(_T("{")); } else { TexOutput(_T("}\n")); if (winHelp) { TexOutput(_T("K{\\footnote {K} ")); suppressNameDecoration = true; // Necessary so don't print "(\\bf" etc. TraverseChildrenFromChunk(currentMember); suppressNameDecoration = false; TexOutput(_T("}\n")); } if (!winHelp && useWord) { // Insert index entry for this function TexOutput(_T("{\\xe\\v {")); suppressNameDecoration = true; // Necessary so don't print "(\\bf" etc. TraverseChildrenFromChunk(currentMember); suppressNameDecoration = false; TexOutput(_T("}}")); } } break; } case ltMEMBER: { // SetCurrentOutput(winHelp ? Subsections : Chapters); if (start) { TexOutput(_T("{\\b ")); } else { TexOutput(_T("}\n")); if (winHelp) { TexOutput(_T("K{\\footnote {K} ")); TraverseChildrenFromChunk(currentMember); TexOutput(_T("}\n")); } if (!winHelp && useWord) { // Insert index entry for this function TexOutput(_T("{\\xe\\v {")); suppressNameDecoration = true; // Necessary so don't print "(\\bf" etc. TraverseChildrenFromChunk(currentMember); suppressNameDecoration = false; TexOutput(_T("}}")); } } break; } case ltDOCUMENT: { if (start) SetCurrentOutput(Chapters); break; } case ltTABLEOFCONTENTS: { if (start) { if (!winHelp && useWord) { // Insert Word for Windows table of contents TexOutput(_T("\\par\\pard\\pgnrestart\\sect\\titlepg")); // In linear RTF, same as chapter headings. wxSnprintf(buf, sizeof(buf), _T("{\\b\\fs%d %s}\\par\\par\\pard\n\n"), chapterFont*2, ContentsNameString); TexOutput(buf); wxSnprintf(buf, sizeof(buf), _T("{\\field{\\*\\fldinst TOC \\\\o \"1-%d\" }{\\fldrslt PRESS F9 TO REFORMAT CONTENTS}}\n"), contentsDepth); TexOutput(buf); // TexOutput(_T("\\sect\\sectd")); } else { FILE *fd = wxFopen(ContentsName, _T("r")); if (fd) { int ch = getc(fd); while (ch != EOF) { putc(ch, Chapters); ch = getc(fd); } fclose(fd); } else { TexOutput(_T("{\\i RUN TEX2RTF AGAIN FOR CONTENTS PAGE}\\par\n")); OnInform(_T("Run Tex2RTF again to include contents page.")); } } } break; } case ltVOID: { // if (start) // TexOutput(_T("{\\b void}")); break; } case ltHARDY: { if (start) TexOutput(_T("{\\scaps HARDY}")); break; } case ltWXCLIPS: { if (start) TexOutput(_T("wxCLIPS")); break; } case ltSPECIALAMPERSAND: { if (start) { if (inTabular) TexOutput(_T("\\cell ")); else TexOutput(_T("&")); } break; } case ltSPECIALTILDE: { if (start) { #if 1 // if(inVerbatim) TexOutput(_T("~")); #else TexOutput(_T(" ")); #endif } break; } case ltBACKSLASHCHAR: { if (start) { if (inTabular) { // TexOutput(_T("\\cell\\row\\trowd\\trgaph108\\trleft-108\n")); TexOutput(_T("\\cell\\row\\trowd\\trgaph108\n")); int currentWidth = 0; for (int i = 0; i < noColumns; i++) { currentWidth += TableData[i].width; if (TableData[i].rightBorder) TexOutput(_T("\\clbrdrr\\brdrs\\brdrw15")); if (TableData[i].leftBorder) TexOutput(_T("\\clbrdrl\\brdrs\\brdrw15")); wxSnprintf(buf, sizeof(buf), _T("\\cellx%d"), currentWidth); TexOutput(buf); } TexOutput(_T("\\pard\\intbl\n")); } else TexOutput(_T("\\line\n")); } break; } case ltRANGLEBRA: { if (start) TexOutput(_T("\tab ")); break; } case ltRTFSP: // Explicit space, RTF only { if (start) TexOutput(_T(" ")); break; } case ltITEMIZE: case ltENUMERATE: case ltDESCRIPTION: { if (start) { if (indentLevel > 0) { // Experimental JACS 2004-02-21 TexOutput(_T("\\par\n")); issuedNewParagraph = 1; // TexOutput(_T("\\par\\par\n")); // issuedNewParagraph = 2; } else { // Top-level list: issue a new paragraph if we haven't // just done so if (!issuedNewParagraph) { TexOutput(_T("\\par\\pard")); WriteEnvironmentStyles(); issuedNewParagraph = 1; } else issuedNewParagraph = 0; } indentLevel ++; TexOutput(_T("\\fi0\n")); int listType; if (macroId == ltENUMERATE) listType = LATEX_ENUMERATE; else if (macroId == ltITEMIZE) listType = LATEX_ITEMIZE; else listType = LATEX_DESCRIPTION; int oldIndent = 0; wxNode *node = itemizeStack.GetFirst(); if (node) oldIndent = ((ItemizeStruc *)node->GetData())->indentation; int indentSize1 = oldIndent + 20*labelIndentTab; int indentSize2 = oldIndent + 20*itemIndentTab; ItemizeStruc *struc = new ItemizeStruc(listType, indentSize2, indentSize1); itemizeStack.Insert(struc); wxSnprintf(buf, sizeof(buf), _T("\\tx%d\\tx%d\\li%d\\sa200"), indentSize1, indentSize2, indentSize2); PushEnvironmentStyle(buf); } else { currentItemSep = 8; // Reset to the default indentLevel --; PopEnvironmentStyle(); if (itemizeStack.GetFirst()) { ItemizeStruc *struc = (ItemizeStruc *)itemizeStack.GetFirst()->GetData(); delete struc; delete itemizeStack.GetFirst(); } /* Change 18/7/97 - don't know why we wish to do this if (itemizeStack.Number() == 0) { OnMacro(ltPAR, 0, true); OnMacro(ltPAR, 0, false); issuedNewParagraph = 2; } */ } break; } case ltTWOCOLLIST: { if (start) { indentLevel ++; int oldIndent = 0; wxNode *node = itemizeStack.GetFirst(); if (node) oldIndent = ((ItemizeStruc *)node->GetData())->indentation; int indentSize = oldIndent + TwoColWidthA; ItemizeStruc *struc = new ItemizeStruc(LATEX_TWOCOL, indentSize); itemizeStack.Insert(struc); // wxSnprintf(buf, sizeof(buf), _T("\\tx%d\\li%d\\ri%d"), indentSize, indentSize, TwoColWidthA+TwoColWidthB+oldIndent); wxSnprintf(buf, sizeof(buf), _T("\\tx%d\\li%d\\sa200"), indentSize, indentSize); PushEnvironmentStyle(buf); } else { indentLevel --; PopEnvironmentStyle(); if (itemizeStack.GetFirst()) { ItemizeStruc *struc = (ItemizeStruc *)itemizeStack.GetFirst()->GetData(); delete struc; delete itemizeStack.GetFirst(); } /* // JACS June 1997 TexOutput(_T("\\pard\n")); WriteEnvironmentStyles(); */ /* why do we need this? */ // Experimental TexOutput(_T("\\pard\n")); #if 0 if (itemizeStack.GetCount() == 0) { issuedNewParagraph = 0; OnMacro(ltPAR, 0, true); OnMacro(ltPAR, 0, false); } #endif } break; } case ltITEM: { wxNode *node = itemizeStack.GetFirst(); if (node) { ItemizeStruc *struc = (ItemizeStruc *)node->GetData(); if (!start) { struc->currentItem += 1; wxChar indentBuf[60]; int indentSize1 = struc->labelIndentation; int indentSize2 = struc->indentation; TexOutput(_T("\n")); if (struc->currentItem > 1 && issuedNewParagraph == 0) { // JACS // if (currentItemSep > 0) // TexOutput(_T("\\par")); TexOutput(_T("\\par")); issuedNewParagraph = 1; // WriteEnvironmentStyles(); } wxSnprintf(buf, sizeof(buf), _T("\\tx%d\\tx%d\\li%d\\fi-%d\n"), indentSize1, indentSize2, indentSize2, 20*itemIndentTab); TexOutput(buf); switch (struc->listType) { case LATEX_ENUMERATE: { if (descriptionItemArg) { TexOutput(_T("\\tab{ ")); TraverseChildrenFromChunk(descriptionItemArg); TexOutput(_T("}\\tab")); descriptionItemArg = NULL; } else { wxSnprintf(indentBuf, sizeof(indentBuf), _T("\\tab{\\b %d.}\\tab"), struc->currentItem); TexOutput(indentBuf); } break; } case LATEX_ITEMIZE: { if (descriptionItemArg) { TexOutput(_T("\\tab{ ")); TraverseChildrenFromChunk(descriptionItemArg); TexOutput(_T("}\\tab")); descriptionItemArg = NULL; } else { if (bulletFile && winHelp) { if (winHelpVersion > 3) // Transparent bitmap wxSnprintf(indentBuf, sizeof(indentBuf), _T("\\tab\\{bmct %s\\}\\tab"), bulletFile); else wxSnprintf(indentBuf, sizeof(indentBuf), _T("\\tab\\{bmc %s\\}\\tab"), bulletFile); } else if (winHelp) wxSnprintf(indentBuf, sizeof(indentBuf), _T("\\tab{\\b o}\\tab")); else wxSnprintf(indentBuf, sizeof(indentBuf), _T("\\tab{\\f1\\'b7}\\tab")); TexOutput(indentBuf); } break; } default: case LATEX_DESCRIPTION: { if (descriptionItemArg) { TexOutput(_T("\\tab{\\b ")); TraverseChildrenFromChunk(descriptionItemArg); TexOutput(_T("} ")); descriptionItemArg = NULL; } break; } } } } break; } case ltTWOCOLITEM: case ltTWOCOLITEMRULED: { wxNode *node = itemizeStack.GetFirst(); if (node) { ItemizeStruc *struc = (ItemizeStruc *)node->GetData(); if (start) { struc->currentItem += 1; int oldIndent = 0; wxNode *node2 = NULL; if (itemizeStack.GetCount() > 1) // TODO: do I actually mean Nth(0) here?? node2 = itemizeStack.Item(1); if (node2) oldIndent = ((ItemizeStruc *)node2->GetData())->indentation; TexOutput(_T("\n")); // JACS #if 0 if (struc->currentItem > 1) { if (currentItemSep > 0) TexOutput(_T("\\par")); // WriteEnvironmentStyles(); } #endif // wxSnprintf(buf, sizeof(buf), _T("\\tx%d\\li%d\\fi-%d\\ri%d\n"), TwoColWidthA, // TwoColWidthA, TwoColWidthA, TwoColWidthA+TwoColWidthB+oldIndent); /* wxSnprintf(buf, sizeof(buf), _T("\\tx%d\\li%d\\fi-%d\n"), TwoColWidthA, TwoColWidthA, TwoColWidthA); */ wxSnprintf(buf, sizeof(buf), _T("\\tx%d\\li%d\\fi-%d\n"), TwoColWidthA + oldIndent, TwoColWidthA + oldIndent, TwoColWidthA); TexOutput(buf); } } break; } case ltVERBATIM: case ltVERB: { if (start) { // JACS #if 0 if (macroId == ltVERBATIM) { if (!issuedNewParagraph) { TexOutput(_T("\\par\\pard")); WriteEnvironmentStyles(); issuedNewParagraph = 1; } else issuedNewParagraph = 0; } #endif if (macroId == ltVERBATIM) wxSnprintf(buf, sizeof(buf), _T("{\\f3\\s10\\fs20\\li720\\sa0 ")); else wxSnprintf(buf, sizeof(buf), _T("{\\f3\\fs20 ")); TexOutput(buf); } else { TexOutput(_T("}")); if (macroId == ltVERBATIM) { TexOutput(_T("\\pard\n")); WriteEnvironmentStyles(); // JACS #if 0 TexOutput(_T("\\par\n")); issuedNewParagraph = 1; #endif } } break; } case ltCENTERLINE: case ltCENTER: { if (start) { TexOutput(_T("\\qc ")); forbidParindent ++; PushEnvironmentStyle(_T("\\qc\\sa200")); } else { TexOutput(_T("\\par\\pard\n")); issuedNewParagraph = 1; forbidParindent --; PopEnvironmentStyle(); WriteEnvironmentStyles(); } break; } case ltFLUSHLEFT: { if (start) { TexOutput(_T("\\ql\\sa200 ")); forbidParindent ++; PushEnvironmentStyle(_T("\\ql")); } else { TexOutput(_T("\\par\\pard\n")); issuedNewParagraph = 1; forbidParindent --; PopEnvironmentStyle(); WriteEnvironmentStyles(); } break; } case ltFLUSHRIGHT: { if (start) { TexOutput(_T("\\qr\\sa200 ")); forbidParindent ++; PushEnvironmentStyle(_T("\\qr")); } else { TexOutput(_T("\\par\\pard\n")); issuedNewParagraph = 1; forbidParindent --; PopEnvironmentStyle(); WriteEnvironmentStyles(); } break; } case ltSMALL: case ltFOOTNOTESIZE: { if (start) { wxSnprintf(buf, sizeof(buf), _T("{\\fs%d\n"), smallFont*2); TexOutput(buf); } else TexOutput(_T("}\n")); break; } case ltTINY: case ltSCRIPTSIZE: { if (start) { wxSnprintf(buf, sizeof(buf), _T("{\\fs%d\n"), tinyFont*2); TexOutput(buf); } else TexOutput(_T("}\n")); break; } case ltNORMALSIZE: { if (start) { wxSnprintf(buf, sizeof(buf), _T("{\\fs%d\n"), normalFont*2); TexOutput(buf); } else TexOutput(_T("}\n")); break; } case ltlarge: { if (start) { wxSnprintf(buf, sizeof(buf), _T("{\\fs%d\n"), largeFont1*2); TexOutput(buf); } else TexOutput(_T("}\n")); break; } case ltLarge: { if (start) { wxSnprintf(buf, sizeof(buf), _T("{\\fs%d\n"), LargeFont2*2); TexOutput(buf); } else TexOutput(_T("}\n")); break; } case ltLARGE: { if (start) { wxSnprintf(buf, sizeof(buf), _T("{\\fs%d\n"), LARGEFont3*2); TexOutput(buf); } else TexOutput(_T("}\n")); break; } case lthuge: { if (start) { wxSnprintf(buf, sizeof(buf), _T("{\\fs%d\n"), hugeFont1*2); TexOutput(buf); } else TexOutput(_T("}\n")); break; } case ltHuge: { if (start) { wxSnprintf(buf, sizeof(buf), _T("{\\fs%d\n"), HugeFont2*2); TexOutput(buf); } else TexOutput(_T("}\n")); break; } case ltHUGE: { if (start) { wxSnprintf(buf, sizeof(buf), _T("{\\fs%d\n"), HUGEFont3*2); TexOutput(buf); } else TexOutput(_T("}\n")); break; } case ltTEXTBF: case ltBFSERIES: case ltBF: { if (start) { TexOutput(_T("{\\b ")); } else TexOutput(_T("}")); break; } case ltUNDERLINE: { if (start) { TexOutput(_T("{\\ul ")); } else TexOutput(_T("}")); break; } case ltTEXTIT: case ltITSHAPE: case ltIT: case ltEMPH: case ltEM: { if (start) { TexOutput(_T("{\\i ")); } else TexOutput(_T("}")); break; } // Roman font: do nothing. Should really switch between // fonts. case ltTEXTRM: case ltRMFAMILY: case ltRM: { /* if (start) { TexOutput(_T("{\\plain ")); } else TexOutput(_T("}")); */ break; } // Medium-weight font. Unbolden... case ltMDSERIES: { if (start) { TexOutput(_T("{\\b0 ")); } else TexOutput(_T("}")); break; } // Upright (un-italic or slant) case ltUPSHAPE: { if (start) { TexOutput(_T("{\\i0 ")); } else TexOutput(_T("}")); break; } case ltTEXTSC: case ltSCSHAPE: case ltSC: { if (start) { TexOutput(_T("{\\scaps ")); } else TexOutput(_T("}")); break; } case ltTEXTTT: case ltTTFAMILY: case ltTT: { if (start) { TexOutput(_T("{\\f3 ")); } else TexOutput(_T("}")); break; } case ltLBRACE: { if (start) TexOutput(_T("\\{")); break; } case ltRBRACE: { if (start) TexOutput(_T("\\}")); break; } case ltBACKSLASH: { if (start) TexOutput(_T("\\\\")); break; } case ltPAR: { if (start) { if ( issuedNewParagraph == 0 ) { TexOutput(_T("\\par\\pard")); issuedNewParagraph ++; // Extra par if parskip is more than zero (usually looks best.) // N.B. JACS 2004-02-21: shouldn't need this for linear RTF if // we have a suitable set of styles. #if 0 if (winHelp && !inTabular && (ParSkip > 0)) { TexOutput(_T("\\par")); issuedNewParagraph ++; } #endif WriteEnvironmentStyles(); } // 1 is a whole paragraph if ParSkip == 0, // half a paragraph if ParSkip > 0 else if ( issuedNewParagraph == 1 ) { // Don't need a par at all if we've already had one, // and ParSkip == 0. #if 0 // Extra par if parskip is more than zero (usually looks best.) if (winHelp && !inTabular && (ParSkip > 0)) { TexOutput(_T("\\par")); issuedNewParagraph ++; } #endif WriteEnvironmentStyles(); } /* if (!issuedNewParagraph || (issuedNewParagraph > 1)) { TexOutput(_T("\\par\\pard")); // Extra par if parskip is more than zero (usually looks best.) if (!inTabular && (ParSkip > 0)) TexOutput(_T("\\par")); WriteEnvironmentStyles(); } */ TexOutput(_T("\n")); } break; } case ltNEWPAGE: { // In Windows Help, no newpages until we've started some chapters or sections if (!(winHelp && !startedSections)) if (start) TexOutput(_T("\\page\n")); break; } case ltMAKETITLE: { if (start && DocumentTitle) { TexOutput(_T("\\par\\pard")); if (!winHelp) TexOutput(_T("\\par")); wxSnprintf(buf, sizeof(buf), _T("\\qc{\\fs%d\\b "), titleFont*2); TexOutput(buf); TraverseChildrenFromChunk(DocumentTitle); TexOutput(_T("}\\par\\pard\n")); if (DocumentAuthor) { if (!winHelp) TexOutput(_T("\\par")); wxSnprintf(buf, sizeof(buf), _T("\\par\\qc{\\fs%d "), authorFont*2); TexOutput(buf); TraverseChildrenFromChunk(DocumentAuthor); TexOutput(_T("}")); TexOutput(_T("\\par\\pard\n")); } if (DocumentDate) { TexOutput(_T("\\par")); wxSnprintf(buf, sizeof(buf), _T("\\qc{\\fs%d "), authorFont*2); TexOutput(buf); TraverseChildrenFromChunk(DocumentDate); TexOutput(_T("}\\par\\pard\n")); } // If linear RTF, we want this titlepage to be in a separate // section with its own (blank) header and footer if (!winHelp && (DocumentStyle != LATEX_ARTICLE)) { TexOutput(_T("{\\header }{\\footer }\n")); // Not sure about this: we get too many sections. // TexOutput(_T("\\sect")); } } break; } case ltADDCONTENTSLINE: { if (!start) { if (contentsLineSection && contentsLineValue) { if (wxStrcmp(contentsLineSection, _T("chapter")) == 0) { wxFprintf(Contents, _T("\\par\n{\\b %s}\\par\n"), contentsLineValue); } else if (wxStrcmp(contentsLineSection, _T("section")) == 0) { if (DocumentStyle != LATEX_ARTICLE) wxFprintf(Contents, _T("\n\\tab%s\\par\n"), contentsLineValue); else wxFprintf(Contents, _T("\\par\n{\\b %s}\\par\n"), contentsLineValue); } } } break; } case ltHRULE: { if (start) { TexOutput(_T("\\brdrb\\brdrs\\par\\pard\n")); issuedNewParagraph = 1; WriteEnvironmentStyles(); } break; } case ltRULE: { if (start) { TexOutput(_T("\\brdrb\\brdrs\\par\\pard\n")); issuedNewParagraph = 1; WriteEnvironmentStyles(); } break; } case ltHLINE: { if (start) ruleTop ++; break; } case ltNUMBEREDBIBITEM: { if (start) TexOutput(_T("\\li260\\fi-260 ")); // Indent from 2nd line else TexOutput(_T("\\par\\pard\\par\n\n")); break; } case ltTHEPAGE: { if (start) { TexOutput(_T("{\\field{\\*\\fldinst PAGE \\\\* MERGEFORMAT }{\\fldrslt 1}}")); } break; } case ltTHECHAPTER: { if (start) { // TexOutput(_T("{\\field{\\*\\fldinst SECTION \\\\* MERGEFORMAT }{\\fldrslt 1}}")); wxSnprintf(buf, sizeof(buf), _T("%d"), chapterNo); TexOutput(buf); } break; } case ltTHESECTION: { if (start) { // TexOutput(_T("{\\field{\\*\\fldinst SECTION \\\\* MERGEFORMAT }{\\fldrslt 1}}")); wxSnprintf(buf, sizeof(buf), _T("%d"), sectionNo); TexOutput(buf); } break; } case ltTWOCOLUMN: { if (!start && !winHelp) { TexOutput(_T("\\cols2\n")); } break; } case ltONECOLUMN: { if (!start && !winHelp) { TexOutput(_T("\\cols1\n")); } break; } case ltPRINTINDEX: { if (start && useWord && !winHelp) { FakeCurrentSection(_T("Index")); OnMacro(ltPAR, 0, true); OnMacro(ltPAR, 0, false); TexOutput(_T("\\par{\\field{\\*\\fldinst INDEX \\\\h \"\\emdash A\\emdash \"\\\\c \"2\"}{\\fldrslt PRESS F9 TO REFORMAT INDEX}}\n")); } break; } case ltLISTOFFIGURES: { if (start && useWord && !winHelp) { FakeCurrentSection(FiguresNameString, false); OnMacro(ltPAR, 0, true); OnMacro(ltPAR, 0, false); OnMacro(ltPAR, 0, true); OnMacro(ltPAR, 0, false); wxChar buf[200]; wxSnprintf(buf, sizeof(buf), _T("{\\field\\fldedit{\\*\\fldinst TOC \\\\c \"%s\" }{\\fldrslt PRESS F9 TO REFORMAT LIST OF FIGURES}}\n"), FigureNameString); TexOutput(buf); } break; } case ltLISTOFTABLES: { if (start && useWord && !winHelp) { FakeCurrentSection(TablesNameString, false); OnMacro(ltPAR, 0, true); OnMacro(ltPAR, 0, false); OnMacro(ltPAR, 0, true); OnMacro(ltPAR, 0, false); wxChar buf[200]; wxSnprintf(buf, sizeof(buf), _T("{\\field\\fldedit{\\*\\fldinst TOC \\\\c \"%s\" }{\\fldrslt PRESS F9 TO REFORMAT LIST OF TABLES}}\n"), TablesNameString); TexOutput(buf); } break; } // Symbols case ltALPHA: if (start) TexOutput(_T("{\\f1\\'61}")); break; case ltBETA: if (start) TexOutput(_T("{\\f1\\'62}")); break; case ltGAMMA: if (start) TexOutput(_T("{\\f1\\'63}")); break; case ltDELTA: if (start) TexOutput(_T("{\\f1\\'64}")); break; case ltEPSILON: case ltVAREPSILON: if (start) TexOutput(_T("{\\f1\\'65}")); break; case ltZETA: if (start) TexOutput(_T("{\\f1\\'7A}")); break; case ltETA: if (start) TexOutput(_T("{\\f1\\'68}")); break; case ltTHETA: case ltVARTHETA: if (start) TexOutput(_T("{\\f1\\'71}")); break; case ltIOTA: if (start) TexOutput(_T("{\\f1\\'69}")); break; case ltKAPPA: if (start) TexOutput(_T("{\\f1\\'6B}")); break; case ltLAMBDA: if (start) TexOutput(_T("{\\f1\\'6C}")); break; case ltMU: if (start) TexOutput(_T("{\\f1\\'6D}")); break; case ltNU: if (start) TexOutput(_T("{\\f1\\'6E}")); break; case ltXI: if (start) TexOutput(_T("{\\f1\\'78}")); break; case ltPI: if (start) TexOutput(_T("{\\f1\\'70}")); break; case ltVARPI: if (start) TexOutput(_T("{\\f1\\'76}")); break; case ltRHO: case ltVARRHO: if (start) TexOutput(_T("{\\f1\\'72}")); break; case ltSIGMA: if (start) TexOutput(_T("{\\f1\\'73}")); break; case ltVARSIGMA: if (start) TexOutput(_T("{\\f1\\'56}")); break; case ltTAU: if (start) TexOutput(_T("{\\f1\\'74}")); break; case ltUPSILON: if (start) TexOutput(_T("{\\f1\\'75}")); break; case ltPHI: case ltVARPHI: if (start) TexOutput(_T("{\\f1\\'66}")); break; case ltCHI: if (start) TexOutput(_T("{\\f1\\'63}")); break; case ltPSI: if (start) TexOutput(_T("{\\f1\\'79}")); break; case ltOMEGA: if (start) TexOutput(_T("{\\f1\\'77}")); break; case ltCAP_GAMMA: if (start) TexOutput(_T("{\\f1\\'47}")); break; case ltCAP_DELTA: if (start) TexOutput(_T("{\\f1\\'44}")); break; case ltCAP_THETA: if (start) TexOutput(_T("{\\f1\\'51}")); break; case ltCAP_LAMBDA: if (start) TexOutput(_T("{\\f1\\'4C}")); break; case ltCAP_XI: if (start) TexOutput(_T("{\\f1\\'58}")); break; case ltCAP_PI: if (start) TexOutput(_T("{\\f1\\'50}")); break; case ltCAP_SIGMA: if (start) TexOutput(_T("{\\f1\\'53}")); break; case ltCAP_UPSILON: if (start) TexOutput(_T("{\\f1\\'54}")); break; case ltCAP_PHI: if (start) TexOutput(_T("{\\f1\\'46}")); break; case ltCAP_PSI: if (start) TexOutput(_T("{\\f1\\'59}")); break; case ltCAP_OMEGA: if (start) TexOutput(_T("{\\f1\\'57}")); break; // Binary operation symbols case ltLE: case ltLEQ: if (start) TexOutput(_T("{\\f1\\'A3}")); break; case ltLL: if (start) TexOutput(_T("<<")); break; case ltSUBSET: if (start) TexOutput(_T("{\\f1\\'CC}")); break; case ltSUBSETEQ: if (start) TexOutput(_T("{\\f1\\'CD}")); break; case ltIN: if (start) TexOutput(_T("{\\f1\\'CE}")); break; case ltGE: case ltGEQ: if (start) TexOutput(_T("{\\f1\\'B3}")); break; case ltGG: if (start) TexOutput(_T(">>")); break; case ltSUPSET: if (start) TexOutput(_T("{\\f1\\'C9}")); break; case ltSUPSETEQ: if (start) TexOutput(_T("{\\f1\\'CD}")); break; case ltNI: if (start) TexOutput(_T("{\\f1\\'27}")); break; case ltPERP: if (start) TexOutput(_T("{\\f1\\'5E}")); break; case ltNEQ: if (start) TexOutput(_T("{\\f1\\'B9}")); break; case ltAPPROX: if (start) TexOutput(_T("{\\f1\\'BB}")); break; case ltCONG: if (start) TexOutput(_T("{\\f1\\'40}")); break; case ltEQUIV: if (start) TexOutput(_T("{\\f1\\'BA}")); break; case ltPROPTO: if (start) TexOutput(_T("{\\f1\\'B5}")); break; case ltSIM: if (start) TexOutput(_T("{\\f1\\'7E}")); break; case ltSMILE: if (start) TexOutput(_T("{\\f4\\'4A}")); break; case ltFROWN: if (start) TexOutput(_T("{\\f4\\'4C}")); break; case ltMID: if (start) TexOutput(_T("|")); break; // Negated relation symbols case ltNOTEQ: if (start) TexOutput(_T("{\\f1\\'B9}")); break; case ltNOTIN: if (start) TexOutput(_T("{\\f1\\'CF}")); break; case ltNOTSUBSET: if (start) TexOutput(_T("{\\f1\\'CB}")); break; // Arrows case ltLEFTARROW: if (start) TexOutput(_T("{\\f1\\'AC}")); break; case ltLEFTARROW2: if (start) TexOutput(_T("{\\f1\\'DC}")); break; case ltRIGHTARROW: if (start) TexOutput(_T("{\\f1\\'AE}")); break; case ltRIGHTARROW2: if (start) TexOutput(_T("{\\f1\\'DE}")); break; case ltLEFTRIGHTARROW: if (start) TexOutput(_T("{\\f1\\'AB}")); break; case ltLEFTRIGHTARROW2: if (start) TexOutput(_T("{\\f1\\'DB}")); break; case ltUPARROW: if (start) TexOutput(_T("{\\f1\\'AD}")); break; case ltUPARROW2: if (start) TexOutput(_T("{\\f1\\'DD}")); break; case ltDOWNARROW: if (start) TexOutput(_T("{\\f1\\'AF}")); break; case ltDOWNARROW2: if (start) TexOutput(_T("{\\f1\\'DF}")); break; // Miscellaneous symbols case ltALEPH: if (start) TexOutput(_T("{\\f1\\'CO}")); break; case ltWP: if (start) TexOutput(_T("{\\f1\\'C3}")); break; case ltRE: if (start) TexOutput(_T("{\\f1\\'C2}")); break; case ltIM: if (start) TexOutput(_T("{\\f1\\'C1}")); break; case ltEMPTYSET: if (start) TexOutput(_T("{\\f1\\'C6}")); break; case ltNABLA: if (start) TexOutput(_T("{\\f1\\'D1}")); break; case ltSURD: if (start) TexOutput(_T("{\\f1\\'D6}")); break; case ltPARTIAL: if (start) TexOutput(_T("{\\f1\\'B6}")); break; case ltBOT: if (start) TexOutput(_T("{\\f1\\'5E}")); break; case ltFORALL: if (start) TexOutput(_T("{\\f1\\'22}")); break; case ltEXISTS: if (start) TexOutput(_T("{\\f1\\'24}")); break; case ltNEG: if (start) TexOutput(_T("{\\f1\\'D8}")); break; case ltSHARP: if (start) TexOutput(_T("{\\f1\\'23}")); break; case ltANGLE: if (start) TexOutput(_T("{\\f1\\'D0}")); break; case ltTRIANGLE: if (start) TexOutput(_T("{\\f5\\'73}")); break; case ltCLUBSUIT: if (start) TexOutput(_T("{\\f5\\'A8}")); break; case ltDIAMONDSUIT: if (start) TexOutput(_T("{\\f5\\'A9}")); break; case ltHEARTSUIT: if (start) TexOutput(_T("{\\f5\\'AA}")); break; case ltSPADESUIT: if (start) TexOutput(_T("{\\f5\\'AB}")); break; case ltINFTY: if (start) TexOutput(_T("{\\f1\\'A5}")); break; case ltCOPYRIGHT: if (start) TexOutput(_T("{\\f0\\'A9}")); break; case ltREGISTERED: if (start) TexOutput(_T("{\\f0\\'AE}")); break; case ltPM: if (start) TexOutput(_T("{\\f1\\'B1}")); break; case ltMP: if (start) TexOutput(_T("{\\f1\\'B1}")); break; case ltTIMES: if (start) TexOutput(_T("{\\f1\\'B4}")); break; case ltDIV: if (start) TexOutput(_T("{\\f1\\'B8}")); break; case ltCDOT: if (start) TexOutput(_T("{\\f1\\'D7}")); break; case ltAST: if (start) TexOutput(_T("{\\f1\\'2A}")); break; case ltSTAR: if (start) TexOutput(_T("{\\f5\\'AB}")); break; case ltCAP: if (start) TexOutput(_T("{\\f1\\'C7}")); break; case ltCUP: if (start) TexOutput(_T("{\\f1\\'C8}")); break; case ltVEE: if (start) TexOutput(_T("{\\f1\\'DA}")); break; case ltWEDGE: if (start) TexOutput(_T("{\\f1\\'D9}")); break; case ltCIRC: if (start) TexOutput(_T("{\\f1\\'B0}")); break; case ltBULLET: if (start) TexOutput(_T("{\\f1\\'B7}")); break; case ltDIAMOND: if (start) TexOutput(_T("{\\f1\\'E0}")); break; case ltBOX: if (start) TexOutput(_T("{\\f1\\'C6}")); break; case ltDIAMOND2: if (start) TexOutput(_T("{\\f1\\'E0}")); break; case ltBIGTRIANGLEDOWN: if (start) TexOutput(_T("{\\f1\\'D1}")); break; case ltOPLUS: if (start) TexOutput(_T("{\\f1\\'C5}")); break; case ltOTIMES: if (start) TexOutput(_T("{\\f1\\'C4}")); break; case ltSS: if (start) TexOutput(_T("{\\'DF}")); break; case ltFIGURE: { if (start) inFigure = true; else inFigure = false; break; } case ltTABLE: { if (start) inTable = true; else inTable = false; break; } default: { DefaultOnMacro(macroId, no_args, start); break; } } } // Called on start/end of argument examination bool RTFOnArgument(int macroId, int arg_no, bool start) { wxChar buf[300]; switch (macroId) { case ltCHAPTER: case ltCHAPTERSTAR: case ltCHAPTERHEADING: case ltSECTION: case ltSECTIONSTAR: case ltSECTIONHEADING: case ltSUBSECTION: case ltSUBSECTIONSTAR: case ltSUBSUBSECTION: case ltSUBSUBSECTIONSTAR: case ltGLOSS: case ltMEMBERSECTION: case ltFUNCTIONSECTION: case ltCAPTION: case ltCAPTIONSTAR: { if (!start && (arg_no == 1)) currentSection = GetArgChunk(); return false; } case ltFUNC: { if (start && (arg_no == 1)) TexOutput(_T("\\pard\\li600\\fi-600{\\b ")); if (!start && (arg_no == 1)) TexOutput(_T("} ")); if (start && (arg_no == 2)) { if (!suppressNameDecoration) TexOutput(_T("{\\b ")); currentMember = GetArgChunk(); } if (!start && (arg_no == 2)) { if (!suppressNameDecoration) TexOutput(_T("}")); } if (start && (arg_no == 3)) TexOutput(_T("(")); if (!start && (arg_no == 3)) { // TexOutput(_T(")\\li0\\fi0")); // TexOutput(_T(")\\par\\pard\\li0\\fi0")); // issuedNewParagraph = 1; TexOutput(_T(")")); WriteEnvironmentStyles(); } break; } case ltCLIPSFUNC: { if (start && (arg_no == 1)) TexOutput(_T("\\pard\\li260\\fi-260{\\b ")); if (!start && (arg_no == 1)) TexOutput(_T("} ")); if (start && (arg_no == 2)) { if (!suppressNameDecoration) TexOutput(_T("({\\b ")); currentMember = GetArgChunk(); } if (!start && (arg_no == 2)) { if (!suppressNameDecoration) TexOutput(_T("}")); } if (!start && (arg_no == 3)) { TexOutput(_T(")\\li0\\fi0")); WriteEnvironmentStyles(); } break; } case ltPFUNC: { if (start && (arg_no == 1)) TexOutput(_T("\\pard\\li260\\fi-260")); if (!start && (arg_no == 1)) TexOutput(_T(" ")); if (start && (arg_no == 2)) TexOutput(_T("(*")); if (!start && (arg_no == 2)) TexOutput(_T(")")); if (start && (arg_no == 2)) currentMember = GetArgChunk(); if (start && (arg_no == 3)) TexOutput(_T("(")); if (!start && (arg_no == 3)) { TexOutput(_T(")\\li0\\fi0")); WriteEnvironmentStyles(); } break; } case ltPARAM: { if (start && (arg_no == 1)) TexOutput(_T("{\\b ")); if (!start && (arg_no == 1)) TexOutput(_T("}")); if (start && (arg_no == 2)) { TexOutput(_T("{\\i ")); } if (!start && (arg_no == 2)) { TexOutput(_T("}")); } break; } case ltCPARAM: { if (start && (arg_no == 1)) TexOutput(_T("{\\b ")); if (!start && (arg_no == 1)) TexOutput(_T("} ")); // This is the difference from param - one space! if (start && (arg_no == 2)) { TexOutput(_T("{\\i ")); } if (!start && (arg_no == 2)) { TexOutput(_T("}")); } break; } case ltMEMBER: { if (!start && (arg_no == 1)) TexOutput(_T(" ")); if (start && (arg_no == 2)) currentMember = GetArgChunk(); break; } case ltREF: { if (start) { wxChar *sec = NULL; wxChar *refName = GetArgData(); if (winHelp || !useWord) { if (refName) { TexRef *texRef = FindReference(refName); if (texRef) { sec = texRef->sectionNumber; } } if (sec) { TexOutput(sec); } } else { wxFprintf(Chapters, _T("{\\field{\\*\\fldinst REF %s \\\\* MERGEFORMAT }{\\fldrslt ??}}"), refName); } return false; } break; } case ltHELPREF: case ltHELPREFN: { if (winHelp) { if ((GetNoArgs() - arg_no) == 1) { if (start) TexOutput(_T("{\\uldb ")); else TexOutput(_T("}")); } if ((GetNoArgs() - arg_no) == 0) // Arg = 2, or 3 if first is optional { if (start) { TexOutput(_T("{\\v ")); // Remove green colour/underlining if specified if (!hotSpotUnderline && !hotSpotColour) TexOutput(_T("%")); else if (!hotSpotColour) TexOutput(_T("*")); } else TexOutput(_T("}")); } } else // If a linear document, must resolve the references ourselves { if ((GetNoArgs() - arg_no) == 1) { // In a linear document we display the anchor text in italic plus // the page number. if (start) TexOutput(_T("{\\i ")); else TexOutput(_T("}")); if (start) helpRefText = GetArgChunk(); return true; } else if ((GetNoArgs() - arg_no) == 0) // Arg = 2, or 3 if first is optional { if (macroId != ltHELPREFN) { wxChar *refName = GetArgData(); TexRef *texRef = NULL; if (refName) texRef = FindReference(refName); if (start) { if (texRef || !ignoreBadRefs) TexOutput(_T(" (")); if (refName) { if (texRef || !ignoreBadRefs) { if (useWord) { TexOutput(_T("p. ")); TexOutput(_T("{\\field{\\*\\fldinst PAGEREF ")); TexOutput(refName); TexOutput(_T(" \\\\* MERGEFORMAT }{\\fldrslt ??}}")); } else { // Only print section name if we're not in Word mode, // so can't do page references if (texRef) { TexOutput(texRef->sectionName); TexOutput(_T(" ")); TexOutput(texRef->sectionNumber); } else { if (!ignoreBadRefs) TexOutput(_T("??")); wxSnprintf(buf, sizeof(buf), _T("Warning: unresolved reference '%s'"), refName); OnInform(buf); } } } } else TexOutput(_T("??")); } else { if (texRef || !ignoreBadRefs) TexOutput(_T(")")); } } return false; } } break; } case ltURLREF: { if (arg_no == 1) { return true; } else if (arg_no == 2) { if (start) { inVerbatim = true; TexOutput(_T(" ({\\f3 ")); } else { TexOutput(_T("})")); inVerbatim = false; } return true; } break; } case ltPOPREF: { if (winHelp) { if ((GetNoArgs() - arg_no) == 1) { if (start) TexOutput(_T("{\\ul ")); else TexOutput(_T("}")); } if ((GetNoArgs() - arg_no) == 0) // Arg = 2, or 3 if first is optional { if (start) { TexOutput(_T("{\\v ")); // Remove green colour/underlining if specified if (!hotSpotUnderline && !hotSpotColour) TexOutput(_T("%")); else if (!hotSpotColour) TexOutput(_T("*")); } else TexOutput(_T("}")); } } else // A linear document... { if ((GetNoArgs() - arg_no) == 1) { // In a linear document we just display the anchor text in italic if (start) TexOutput(_T("{\\i ")); else TexOutput(_T("}")); return true; } else return false; } break; } case ltADDCONTENTSLINE: { if (start && !winHelp) { if (arg_no == 2) contentsLineSection = copystring(GetArgData()); else if (arg_no == 3) contentsLineValue = copystring(GetArgData()); return false; } else return false; } case ltIMAGE: case ltIMAGEL: case ltIMAGER: case ltIMAGEMAP: case ltPSBOXTO: { if (arg_no == 3) return false; static int imageWidth = 0; static int imageHeight = 0; if (start && (arg_no == 1)) { wxChar *imageDimensions = copystring(GetArgData()); // imageWidth - Convert points to TWIPS (1 twip = 1/20th of point) wxStringTokenizer tok(imageDimensions, _T(";:"), wxTOKEN_STRTOK); if(tok.HasMoreTokens()) { wxString token = tok.GetNextToken(); imageWidth = (int)(20*ParseUnitArgument((wxChar*)token.c_str())); } else { imageWidth = 0; } // imageHeight - Convert points to TWIPS (1 twip = 1/20th of point) if(tok.HasMoreTokens()) { wxString token = tok.GetNextToken(); imageHeight = (int)(20*ParseUnitArgument((wxChar*)token.c_str())); } else { imageHeight = 0; } if (imageDimensions) // glt delete [] imageDimensions; return false; } else if (start && (arg_no == 2 )) { wxChar *filename = copystring(GetArgData()); wxString f = _T(""); if ((winHelp || (wxStrcmp(bitmapMethod, _T("includepicture")) == 0) || (wxStrcmp(bitmapMethod, _T("import")) == 0)) && useWord) { if (f == _T("")) // Try for a .shg (segmented hypergraphics file) { wxStrcpy(buf, filename); StripExtension(buf); wxStrcat(buf, _T(".shg")); f = TexPathList.FindValidPath(buf); } if (f == _T("")) // Try for a .bmp { wxStrcpy(buf, filename); StripExtension(buf); wxStrcat(buf, _T(".bmp")); f = TexPathList.FindValidPath(buf); } if (f == _T("")) // Try for a metafile instead { wxStrcpy(buf, filename); StripExtension(buf); wxStrcat(buf, _T(".wmf")); f = TexPathList.FindValidPath(buf); } if (f != _T("")) { if (winHelp) { if (bitmapTransparency && (winHelpVersion > 3)) TexOutput(_T("\\{bmct ")); else TexOutput(_T("\\{bmc ")); wxString str = wxFileNameFromPath(f); TexOutput((wxChar*) (const wxChar*) str); TexOutput(_T("\\}")); } else { // Microsoft Word method if (wxStrcmp(bitmapMethod, _T("import")) == 0) TexOutput(_T("{\\field{\\*\\fldinst IMPORT ")); else TexOutput(_T("{\\field{\\*\\fldinst INCLUDEPICTURE ")); // Full path appears not to be valid! wxString str = wxFileNameFromPath(f); TexOutput((wxChar*)(const wxChar*) str); /* int len = wxStrlen(f); wxChar smallBuf[2]; smallBuf[1] = 0; for (int i = 0; i < len; i++) { smallBuf[0] = f[i]; TexOutput(smallBuf); if (smallBuf[0] == '\\') TexOutput(smallBuf); } */ TexOutput(_T("}{\\fldrslt PRESS F9 TO FORMAT PICTURE}}")); } } else { TexOutput(_T("[No BMP or WMF for image file ")); TexOutput(filename); TexOutput(_T("]")); wxSnprintf(buf, sizeof(buf), _T("Warning: could not find a BMP or WMF equivalent for %s."), filename); OnInform(buf); } if (filename) // glt delete [] filename; } else // linear RTF { if (f == _T("")) // Try for a .bmp { wxStrcpy(buf, filename); StripExtension(buf); wxStrcat(buf, _T(".bmp")); f = TexPathList.FindValidPath(buf); } if (f != _T("")) { FILE *fd = wxFopen(f, _T("rb")); if (OutputBitmapHeader(fd, winHelp)) OutputBitmapData(fd); else { wxSnprintf(buf, sizeof(buf), _T("Could not read bitmap %s.\nMay be in wrong format (needs RGB-encoded Windows BMP)."), f.c_str()); OnError(buf); } fclose(fd); } else // Try for a metafile instead { #ifdef __WXMSW__ wxStrcpy(buf, filename); StripExtension(buf); wxStrcat(buf, _T(".wmf")); f = TexPathList.FindValidPath(buf); if (f != _T("")) { // HFILE handle = _lopen(f, READ); FILE *fd = wxFopen(f, _T("rb")); if (OutputMetafileHeader(fd, winHelp, imageWidth, imageHeight)) { OutputMetafileData(fd); } else { wxSnprintf(buf, sizeof(buf), _T("Could not read metafile %s. Perhaps it's not a placeable metafile?"), f.c_str()); OnError(buf); } fclose(fd); } else { #endif TexOutput(_T("[No BMP or WMF for image file ")); TexOutput(filename); TexOutput(_T("]")); wxSnprintf(buf, sizeof(buf), _T("Warning: could not find a BMP or WMF equivalent for %s."), filename); OnInform(buf); #ifdef __WXMSW__ } #endif } } return false; } else return false; } case ltTABULAR: case ltSUPERTABULAR: { if (arg_no == 1) { if (start) { currentRowNumber = 0; inTabular = true; startRows = true; tableVerticalLineLeft = false; tableVerticalLineRight = false; int currentWidth = 0; wxChar *alignString = copystring(GetArgData()); ParseTableArgument(alignString); // TexOutput(_T("\\trowd\\trgaph108\\trleft-108")); TexOutput(_T("\\trowd\\trgaph108")); // Write the first row formatting for compatibility // with standard Latex if (compatibilityMode) { for (int i = 0; i < noColumns; i++) { currentWidth += TableData[i].width; wxSnprintf(buf, sizeof(buf), _T("\\cellx%d"), currentWidth); TexOutput(buf); } TexOutput(_T("\\pard\\intbl\n")); } delete[] alignString; return false; } } else if (arg_no == 2 && !start) { TexOutput(_T("\\pard\n")); WriteEnvironmentStyles(); inTabular = false; } break; } case ltQUOTE: case ltVERSE: { if (start) { TexOutput(_T("\\li360\n")); forbidParindent ++; PushEnvironmentStyle(_T("\\li360\\sa200")); } else { forbidParindent --; PopEnvironmentStyle(); OnMacro(ltPAR, 0, true); OnMacro(ltPAR, 0, false); } break; } case ltQUOTATION: { if (start) { TexOutput(_T("\\li360\n")); PushEnvironmentStyle(_T("\\li360\\sa200")); } else { PopEnvironmentStyle(); OnMacro(ltPAR, 0, true); OnMacro(ltPAR, 0, false); } break; } case ltBOXIT: case ltFRAMEBOX: case ltFBOX: case ltNORMALBOX: case ltNORMALBOXD: { if (start) { wxSnprintf(buf, sizeof(buf), _T("\\sa200\\box\\trgaph108%s\n"), ((macroId == ltNORMALBOXD) ? _T("\\brdrdb") : _T("\\brdrs"))); TexOutput(buf); PushEnvironmentStyle(buf); } else { PopEnvironmentStyle(); OnMacro(ltPAR, 0, true); OnMacro(ltPAR, 0, false); } break; } case ltHELPFONTSIZE: { if (start) { wxChar *data = GetArgData(); if (wxStrcmp(data, _T("10")) == 0) SetFontSizes(10); else if (wxStrcmp(data, _T("11")) == 0) SetFontSizes(11); else if (wxStrcmp(data, _T("12")) == 0) SetFontSizes(12); wxSnprintf(buf, sizeof(buf), _T("\\fs%d\n"), normalFont*2); TexOutput(buf); TexOutput(buf); return false; } break; } case ltHELPFONTFAMILY: { if (start) { wxChar *data = GetArgData(); if (wxStrcmp(data, _T("Swiss")) == 0) TexOutput(_T("\\f2\n")); else if (wxStrcmp(data, _T("Symbol")) == 0) TexOutput(_T("\\f1\n")); else if (wxStrcmp(data, _T("Times")) == 0) TexOutput(_T("\\f0\n")); return false; } break; } case ltPARINDENT: { if (start && arg_no == 1) { wxChar *data = GetArgData(); ParIndent = ParseUnitArgument(data); if (ParIndent == 0 || forbidParindent == 0) { wxSnprintf(buf, sizeof(buf), _T("\\fi%d\n"), ParIndent*20); TexOutput(buf); } return false; } break; } case ltITEM: { if (start && IsArgOptional()) { descriptionItemArg = GetArgChunk(); return false; } break; } case ltTWOCOLITEM: case ltTWOCOLITEMRULED: { switch (arg_no) { case 1: { if (!start) TexOutput(_T("\\tab ")); break; } case 2: { if (!start) { if (macroId == ltTWOCOLITEMRULED) TexOutput(_T("\\brdrb\\brdrs\\brdrw15\\brsp20 ")); TexOutput(_T("\\par\\pard\n")); issuedNewParagraph = 1; WriteEnvironmentStyles(); } break; } } return true; } /* * Accents * */ case ltACCENT_GRAVE: { if (start) { wxChar *val = GetArgData(); if (val) { switch (val[0]) { case 'a': TexOutput(_T("\\'e0")); break; case 'e': TexOutput(_T("\\'e8")); break; case 'i': TexOutput(_T("\\'ec")); break; case 'o': TexOutput(_T("\\'f2")); break; case 'u': TexOutput(_T("\\'f9")); break; case 'A': TexOutput(_T("\\'c0")); break; case 'E': TexOutput(_T("\\'c8")); break; case 'I': TexOutput(_T("\\'cc")); break; case 'O': TexOutput(_T("\\'d2")); break; case 'U': TexOutput(_T("\\'d9")); break; default: break; } } } return false; } case ltACCENT_ACUTE: { if (start) { wxChar *val = GetArgData(); if (val) { switch (val[0]) { case 'a': TexOutput(_T("\\'e1")); break; case 'e': TexOutput(_T("\\'e9")); break; case 'i': TexOutput(_T("\\'ed")); break; case 'o': TexOutput(_T("\\'f3")); break; case 'u': TexOutput(_T("\\'fa")); break; case 'y': TexOutput(_T("\\'fd")); break; case 'A': TexOutput(_T("\\'c1")); break; case 'E': TexOutput(_T("\\'c9")); break; case 'I': TexOutput(_T("\\'cd")); break; case 'O': TexOutput(_T("\\'d3")); break; case 'U': TexOutput(_T("\\'da")); break; case 'Y': TexOutput(_T("\\'dd")); break; default: break; } } } return false; } case ltACCENT_CARET: { if (start) { wxChar *val = GetArgData(); if (val) { switch (val[0]) { case 'a': TexOutput(_T("\\'e2")); break; case 'e': TexOutput(_T("\\'ea")); break; case 'i': TexOutput(_T("\\'ee")); break; case 'o': TexOutput(_T("\\'f4")); break; case 'u': TexOutput(_T("\\'fb")); break; case 'A': TexOutput(_T("\\'c2")); break; case 'E': TexOutput(_T("\\'ca")); break; case 'I': TexOutput(_T("\\'ce")); break; case 'O': TexOutput(_T("\\'d4")); break; case 'U': TexOutput(_T("\\'db")); break; default: break; } } } return false; } case ltACCENT_TILDE: { if (start) { wxChar *val = GetArgData(); if (val) { switch (val[0]) { case 'a': TexOutput(_T("\\'e3")); break; case ' ': TexOutput(_T("~")); break; case 'n': TexOutput(_T("\\'f1")); break; case 'o': TexOutput(_T("\\'f5")); break; case 'A': TexOutput(_T("\\'c3")); break; case 'N': TexOutput(_T("\\'d1")); break; case 'O': TexOutput(_T("\\'d5")); break; default: break; } } } return false; } case ltACCENT_UMLAUT: { if (start) { wxChar *val = GetArgData(); if (val) { switch (val[0]) { case 'a': TexOutput(_T("\\'e4")); break; case 'e': TexOutput(_T("\\'eb")); break; case 'i': TexOutput(_T("\\'ef")); break; case 'o': TexOutput(_T("\\'f6")); break; case 'u': TexOutput(_T("\\'fc")); break; case 's': TexOutput(_T("\\'df")); break; case 'y': TexOutput(_T("\\'ff")); break; case 'A': TexOutput(_T("\\'c4")); break; case 'E': TexOutput(_T("\\'cb")); break; case 'I': TexOutput(_T("\\'cf")); break; case 'O': TexOutput(_T("\\'d6")); break; case 'U': TexOutput(_T("\\'dc")); break; case 'Y': TexOutput(_T("\\'df")); break; default: break; } } } return false; } case ltACCENT_DOT: { if (start) { wxChar *val = GetArgData(); if (val) { switch (val[0]) { case 'a': TexOutput(_T("\\'e5")); break; case 'A': TexOutput(_T("\\'c5")); break; default: break; } } } return false; } case ltACCENT_CADILLA: { if (start) { wxChar *val = GetArgData(); if (val) { switch (val[0]) { case 'c': TexOutput(_T("\\'e7")); break; case 'C': TexOutput(_T("\\'c7")); break; default: break; } } } return false; } case ltFOOTNOTE: { static wxChar *helpTopic = NULL; static FILE *savedOutput = NULL; if (winHelp) { if (arg_no == 1) { if (start) { OnInform(_T("Consider using \\footnotepopup instead of \\footnote.")); footnoteCount ++; wxChar footBuf[20]; wxSnprintf(footBuf, sizeof(footBuf), _T("(%d)"), footnoteCount); TexOutput(_T(" {\\ul ")); TexOutput(footBuf); TexOutput(_T("}")); helpTopic = FindTopicName(NULL); TexOutput(_T("{\\v ")); // Remove green colour/underlining if specified if (!hotSpotUnderline && !hotSpotColour) TexOutput(_T("%")); else if (!hotSpotColour) TexOutput(_T("*")); TexOutput(helpTopic); TexOutput(_T("}")); wxFprintf(Popups, _T("\\page\n")); // wxFprintf(Popups, _T("\n${\\footnote }")); // No title wxFprintf(Popups, _T("\n#{\\footnote %s}\n"), helpTopic); wxFprintf(Popups, _T("+{\\footnote %s}\n"), GetBrowseString()); savedOutput = CurrentOutput1; SetCurrentOutput(Popups); } else { SetCurrentOutput(savedOutput); } return true; } return true; } else { if (start) { TexOutput(_T(" {\\super \\chftn{\\footnote \\fs20 {\\super \\chftn}"), true); } else { TexOutput(_T("}}"), true); } return true; } } case ltFOOTNOTEPOPUP: { static wxChar *helpTopic = NULL; static FILE *savedOutput = NULL; if (winHelp) { if (arg_no == 1) { if (start) { TexOutput(_T("{\\ul ")); } else { TexOutput(_T("}")); } return true; } else if (arg_no == 2) { if (start) { helpTopic = FindTopicName(NULL); TexOutput(_T("{\\v ")); // Remove green colour/underlining if specified if (!hotSpotUnderline && !hotSpotColour) TexOutput(_T("%")); else if (!hotSpotColour) TexOutput(_T("*")); TexOutput(helpTopic); TexOutput(_T("}")); wxFprintf(Popups, _T("\\page\n")); // wxFprintf(Popups, _T("\n${\\footnote }")); // No title wxFprintf(Popups, _T("\n#{\\footnote %s}\n"), helpTopic); wxFprintf(Popups, _T("+{\\footnote %s}\n"), GetBrowseString()); savedOutput = CurrentOutput1; SetCurrentOutput(Popups); } else { SetCurrentOutput(savedOutput); } return true; } } else { if (arg_no == 1) return true; if (start) { TexOutput(_T(" {\\super \\chftn{\\footnote \\fs20 {\\super \\chftn}"), true); } else { TexOutput(_T("}}"), true); } return true; } break; } case ltFANCYPLAIN: { if (start && (arg_no == 1)) return false; else return true; } case ltSETHEADER: { if (start) forbidResetPar ++; else forbidResetPar --; if (winHelp) return false; if (start) { switch (arg_no) { case 1: LeftHeaderEven = GetArgChunk(); if (wxStrlen(GetArgData(LeftHeaderEven)) == 0) LeftHeaderEven = NULL; break; case 2: CentreHeaderEven = GetArgChunk(); if (wxStrlen(GetArgData(CentreHeaderEven)) == 0) CentreHeaderEven = NULL; break; case 3: RightHeaderEven = GetArgChunk(); if (wxStrlen(GetArgData(RightHeaderEven)) == 0) RightHeaderEven = NULL; break; case 4: LeftHeaderOdd = GetArgChunk(); if (wxStrlen(GetArgData(LeftHeaderOdd)) == 0) LeftHeaderOdd = NULL; break; case 5: CentreHeaderOdd = GetArgChunk(); if (wxStrlen(GetArgData(CentreHeaderOdd)) == 0) CentreHeaderOdd = NULL; break; case 6: RightHeaderOdd = GetArgChunk(); if (wxStrlen(GetArgData(RightHeaderOdd)) == 0) RightHeaderOdd = NULL; OutputRTFHeaderCommands(); break; default: break; } } return false; } case ltSETFOOTER: { if (start) forbidResetPar ++; else forbidResetPar --; if (winHelp) return false; if (start) { switch (arg_no) { case 1: LeftFooterEven = GetArgChunk(); if (wxStrlen(GetArgData(LeftFooterEven)) == 0) LeftFooterEven = NULL; break; case 2: CentreFooterEven = GetArgChunk(); if (wxStrlen(GetArgData(CentreFooterEven)) == 0) CentreFooterEven = NULL; break; case 3: RightFooterEven = GetArgChunk(); if (wxStrlen(GetArgData(RightFooterEven)) == 0) RightFooterEven = NULL; break; case 4: LeftFooterOdd = GetArgChunk(); if (wxStrlen(GetArgData(LeftFooterOdd)) == 0) LeftFooterOdd = NULL; break; case 5: CentreFooterOdd = GetArgChunk(); if (wxStrlen(GetArgData(CentreFooterOdd)) == 0) CentreFooterOdd = NULL; break; case 6: RightFooterOdd = GetArgChunk(); if (wxStrlen(GetArgData(RightFooterOdd)) == 0) RightFooterOdd = NULL; OutputRTFFooterCommands(); break; default: break; } } return false; } case ltMARKRIGHT: { if (winHelp) return false; // Fake a SetHeader command if (start) { LeftHeaderOdd = NULL; CentreHeaderOdd = NULL; RightHeaderOdd = NULL; LeftHeaderEven = NULL; CentreHeaderEven = NULL; RightHeaderEven = NULL; OnInform(_T("Consider using setheader/setfooter rather than markright.")); } RTFOnArgument(ltSETHEADER, 4, start); if (!start) OutputRTFHeaderCommands(); return false; } case ltMARKBOTH: { if (winHelp) return false; // Fake a SetHeader command switch (arg_no) { case 1: { if (start) { LeftHeaderOdd = NULL; CentreHeaderOdd = NULL; RightHeaderOdd = NULL; LeftHeaderEven = NULL; CentreHeaderEven = NULL; RightHeaderEven = NULL; OnInform(_T("Consider using setheader/setfooter rather than markboth.")); } return RTFOnArgument(ltSETHEADER, 1, start); } case 2: { RTFOnArgument(ltSETHEADER, 4, start); if (!start) OutputRTFHeaderCommands(); return false; } } break; } case ltPAGENUMBERING: { if (start) forbidResetPar ++; else forbidResetPar --; if (winHelp) return false; if (start) { TexOutput(_T("\\pgnrestart")); wxChar *data = GetArgData(); if (currentNumberStyle) delete[] currentNumberStyle; currentNumberStyle = copystring(data); OutputNumberStyle(currentNumberStyle); TexOutput(_T("\n")); } return false; } case ltTWOCOLUMN: { if (winHelp) return false; if (start) return true; break; } case ltITEMSEP: { if (start) { wxChar *val = GetArgData(); currentItemSep = ParseUnitArgument(val); return false; } break; } case ltEVENSIDEMARGIN: { return false; } case ltODDSIDEMARGIN: { if (start) { wxChar *val = GetArgData(); int twips = (int)(20*ParseUnitArgument(val)); // Add an inch since in LaTeX it's specified minus an inch twips += 1440; CurrentLeftMarginOdd = twips; wxSnprintf(buf, sizeof(buf), _T("\\margl%d\n"), twips); TexOutput(buf); CurrentMarginParX = CurrentLeftMarginOdd + CurrentTextWidth + CurrentMarginParSep; } return false; } case ltMARGINPARWIDTH: { if (start) { wxChar *val = GetArgData(); int twips = (int)(20*ParseUnitArgument(val)); CurrentMarginParWidth = twips; } return false; } case ltMARGINPARSEP: { if (start) { wxChar *val = GetArgData(); int twips = (int)(20*ParseUnitArgument(val)); CurrentMarginParSep = twips; CurrentMarginParX = CurrentLeftMarginOdd + CurrentTextWidth + CurrentMarginParSep; } return false; } case ltTEXTWIDTH: { if (start) { wxChar *val = GetArgData(); int twips = (int)(20*ParseUnitArgument(val)); CurrentTextWidth = twips; // Need to set an implicit right margin CurrentRightMarginOdd = PageWidth - CurrentTextWidth - CurrentLeftMarginOdd; CurrentRightMarginEven = PageWidth - CurrentTextWidth - CurrentLeftMarginEven; CurrentMarginParX = CurrentLeftMarginOdd + CurrentTextWidth + CurrentMarginParSep; wxSnprintf(buf, sizeof(buf), _T("\\margr%d\n"), CurrentRightMarginOdd); TexOutput(buf); } return false; } case ltMARGINPAR: case ltMARGINPARODD: { if (start) { if (winHelp) { TexOutput(_T("\\sa200\\box\n")); PushEnvironmentStyle(_T("\\sa200\\box")); } else { wxSnprintf(buf, sizeof(buf), _T("\\phpg\\posx%d\\absw%d\n"), CurrentMarginParX, CurrentMarginParWidth); TexOutput(buf); } return true; } else { if (winHelp) { TexOutput(_T("\\par\\pard\n")); PopEnvironmentStyle(); WriteEnvironmentStyles(); } else TexOutput(_T("\\par\\pard\n")); issuedNewParagraph = 1; } return false; } case ltMARGINPAREVEN: { if (start) { if (winHelp) { TexOutput(_T("\\sa200\\box\n")); PushEnvironmentStyle(_T("\\sa200\\box")); } else { if (mirrorMargins) { // Have to calculate what the margins are changed to in WfW margin // mirror mode, on an even (left-hand) page. int x = PageWidth - CurrentRightMarginOdd - CurrentMarginParWidth - CurrentMarginParSep - CurrentTextWidth + GutterWidth; wxSnprintf(buf, sizeof(buf), _T("\\phpg\\posx%d\\absw%d\n"), x, CurrentMarginParWidth); TexOutput(buf); } else { wxSnprintf(buf, sizeof(buf), _T("\\phpg\\posx%d\\absw%d\n"), CurrentMarginParX, CurrentMarginParWidth); TexOutput(buf); } } return true; } else { if (winHelp) { TexOutput(_T("\\par\\pard\n")); PopEnvironmentStyle(); WriteEnvironmentStyles(); } else issuedNewParagraph = 1; TexOutput(_T("\\par\\pard\n")); } return false; } case ltTWOCOLWIDTHA: { if (start) { wxChar *val = GetArgData(); int twips = (int)(20*ParseUnitArgument(val)); TwoColWidthA = twips; } return false; } case ltTWOCOLWIDTHB: { if (start) { wxChar *val = GetArgData(); int twips = (int)(20*ParseUnitArgument(val)); TwoColWidthB = twips; } return false; } case ltROW: case ltRULEDROW: { if (start) { int currentWidth = 0; if (!compatibilityMode || (currentRowNumber > 0)) { TexOutput(_T("\\pard\\intbl")); if (macroId == ltRULEDROW) ruleBottom = 1; for (int i = 0; i < noColumns; i++) { currentWidth += TableData[i].width; if (ruleTop == 1) { TexOutput(_T("\\clbrdrt\\brdrs\\brdrw15")); } else if (ruleTop > 1) { TexOutput(_T("\\clbrdrt\\brdrdb\\brdrw15")); } if (ruleBottom == 1) { TexOutput(_T("\\clbrdrb\\brdrs\\brdrw15")); } else if (ruleBottom > 1) { TexOutput(_T("\\clbrdrb\\brdrdb\\brdrw15")); } if (TableData[i].rightBorder) TexOutput(_T("\\clbrdrr\\brdrs\\brdrw15")); if (TableData[i].leftBorder) TexOutput(_T("\\clbrdrl\\brdrs\\brdrw15")); wxSnprintf(buf, sizeof(buf), _T("\\cellx%d"), currentWidth); TexOutput(buf); } TexOutput(_T("\\pard\\intbl\n")); } ruleTop = 0; ruleBottom = 0; currentRowNumber ++; return true; } else { // TexOutput(_T("\\cell\\row\\trowd\\trgaph108\\trleft-108\n")); TexOutput(_T("\\cell\\row\\trowd\\trgaph108\n")); } break; } case ltMULTICOLUMN: { static int noMultiColumns = 0; if (start) { switch (arg_no) { case 1: { noMultiColumns = wxAtoi(GetArgData()); return false; } case 2: { return false; } case 3: { return true; } } } else { if (arg_no == 3) { for (int i = 1; i < noMultiColumns; i ++) TexOutput(_T("\\cell")); } } break; } case ltINDENTED: { if (start && (arg_no == 1)) { // indentLevel ++; // TexOutput(_T("\\fi0\n")); int oldIndent = 0; wxNode *node = itemizeStack.GetFirst(); if (node) oldIndent = ((ItemizeStruc *)node->GetData())->indentation; int indentValue = 20*ParseUnitArgument(GetArgData()); int indentSize = indentValue + oldIndent; ItemizeStruc *struc = new ItemizeStruc(LATEX_INDENT, indentSize); itemizeStack.Insert(struc); wxSnprintf(buf, sizeof(buf), _T("\\tx%d\\li%d\\sa200 "), indentSize, indentSize); PushEnvironmentStyle(buf); TexOutput(buf); return false; } if (!start && (arg_no == 2)) { PopEnvironmentStyle(); if (itemizeStack.GetFirst()) { ItemizeStruc *struc = (ItemizeStruc *)itemizeStack.GetFirst()->GetData(); delete struc; delete itemizeStack.GetFirst(); } if (itemizeStack.GetCount() == 0) { TexOutput(_T("\\par\\pard\n")); issuedNewParagraph = 1; WriteEnvironmentStyles(); } } return true; } /* case ltSIZEDBOX: case ltSIZEDBOXD: { if (start && (arg_no == 1)) { int oldIndent = 0; wxNode *node = itemizeStack.GetFirst(); if (node) oldIndent = ((ItemizeStruc *)node->GetData())->indentation; int boxWidth = 20*ParseUnitArgument(GetArgData()); int indentValue = (int)((CurrentTextWidth - oldIndent - boxWidth)/2.0); int indentSize = indentValue + oldIndent; int indentSizeRight = indentSize + boxWidth; ItemizeStruc *struc = new ItemizeStruc(LATEX_INDENT, indentSize); itemizeStack.Insert(struc); wxSnprintf(buf, sizeof(buf), _T("\\tx%d\\li%d\\lr%d\\sa200\\box%s "), indentSize, indentSize, indentSizeRight, ((macroId == ltCENTEREDBOX) ? _T("\\brdrs") : _T("\\brdrdb"))); PushEnvironmentStyle(buf); TexOutput(buf); return false; } if (!start && (arg_no == 2)) { PopEnvironmentStyle(); if (itemizeStack.GetFirst()) { ItemizeStruc *struc = (ItemizeStruc *)itemizeStack.GetFirst()->GetData(); delete struc; delete itemizeStack.GetFirst(); } if (itemizeStack.Number() == 0) { TexOutput(_T("\\par\\pard\n")); issuedNewParagraph = 1; WriteEnvironmentStyles(); } } return true; break; } */ case ltDOCUMENTSTYLE: { DefaultOnArgument(macroId, arg_no, start); if (!start && !IsArgOptional()) { if (MinorDocumentStyleString) { if (StringMatch(_T("twoside"), MinorDocumentStyleString)) // Mirror margins, switch on odd/even headers & footers, and break sections at odd pages TexOutput(_T("\\margmirror\\facingp\\sbkodd")); if (StringMatch(_T("twocolumn"), MinorDocumentStyleString)) TexOutput(_T("\\cols2")); } TexOutput(_T("\n")); } return false; } case ltSETHOTSPOTCOLOUR: case ltSETHOTSPOTCOLOR: { if (!start) { wxChar *text = GetArgData(); if (wxStrcmp(text, _T("yes")) == 0 || wxStrcmp(text, _T("on")) == 0 || wxStrcmp(text, _T("ok")) == 0) hotSpotColour = true; else hotSpotColour = false; } return false; } case ltSETTRANSPARENCY: { if (!start) { wxChar *text = GetArgData(); if (wxStrcmp(text, _T("yes")) == 0 || wxStrcmp(text, _T("on")) == 0 || wxStrcmp(text, _T("ok")) == 0) bitmapTransparency = true; else bitmapTransparency = false; } return false; } case ltSETHOTSPOTUNDERLINE: { if (!start) { wxChar *text = GetArgData(); if (wxStrcmp(text, _T("yes")) == 0 || wxStrcmp(text, _T("on")) == 0 || wxStrcmp(text, _T("ok")) == 0) hotSpotUnderline = true; else hotSpotUnderline = false; } return false; } case ltBIBITEM: { if (arg_no == 1 && start) { wxChar *citeKey = GetArgData(); TexRef *ref = (TexRef *)TexReferences.Get(citeKey); if (ref) { if (ref->sectionNumber) delete[] ref->sectionNumber; wxSnprintf(buf, sizeof(buf), _T("[%d]"), citeCount); ref->sectionNumber = copystring(buf); } TexOutput(_T("\\li260\\fi-260 ")); // Indent from 2nd line wxSnprintf(buf, sizeof(buf), _T("{\\b [%d]} "), citeCount); TexOutput(buf); citeCount ++; return false; } if (arg_no == 2 && !start) TexOutput(_T("\\par\\pard\\par\n\n")); return true; } case ltTHEBIBLIOGRAPHY: { if (start && (arg_no == 1)) { citeCount = 1; if (winHelp) SetCurrentOutputs(Contents, Chapters); if (!winHelp) { wxFprintf(Chapters, _T("\\sect\\pgncont\\titlepg\n")); // If a non-custom page style, we generate the header now. if (PageStyle && (wxStrcmp(PageStyle, _T("plain")) == 0 || wxStrcmp(PageStyle, _T("empty")) == 0 || wxStrcmp(PageStyle, _T("headings")) == 0)) { OutputRTFHeaderCommands(); OutputRTFFooterCommands(); } // Need to reset the current numbering style, or RTF forgets it. OutputNumberStyle(currentNumberStyle); SetCurrentOutput(Contents); } else wxFprintf(Chapters, _T("\\page\n")); if (winHelp) wxFprintf(Contents, _T("\n{\\uldb %s}"), ReferencesNameString); else wxFprintf(Contents, _T("\\par\n\\pard{\\b %s}"), ReferencesNameString); startedSections = true; if (winHelp) wxFprintf(Chapters, _T("\n${\\footnote %s}"), ReferencesNameString); wxChar *topicName = _T("bibliography"); if (winHelp) { wxFprintf(Contents, _T("{\\v %s}\\par\\pard\n"), topicName); WriteEnvironmentStyles(); } else wxFprintf(Contents, _T("\\par\\par\\pard\n")); if (winHelp) { wxFprintf(Chapters, _T("\n#{\\footnote %s}\n"), topicName); wxFprintf(Chapters, _T("+{\\footnote %s}\n"), GetBrowseString()); wxFprintf(Chapters, _T("K{\\footnote {K} %s}\n"), ReferencesNameString); GenerateKeywordsForTopic(topicName); if (useUpButton) { wxFprintf(Chapters, _T("!{\\footnote EnableButton(\"Up\");ChangeButtonBinding(\"Up\", \"JumpId(`%s.hlp', `%s')\")}\n"), wxFileNameFromPath(FileRoot), "Contents"); } } SetCurrentOutput(Chapters); wxChar *styleCommand = _T(""); if (!winHelp && useHeadingStyles) styleCommand = _T("\\s1"); wxFprintf(Chapters, _T("\\pard{%s"), (winHelp ? _T("\\keepn\\sa140\\sb140") : styleCommand)); WriteHeadingStyle(Chapters, 1); wxFprintf(Chapters, _T(" References\\par\\pard}\n")); return false; } return true; } case ltINDEX: { /* * In Windows help, all keywords should be at the start of the * topic, but Latex \index commands can be anywhere in the text. * So we're going to have to build up lists of keywords for a topic, * and insert them on the second pass. * * In linear RTF, we can embed the index entry now. * */ if (start) { // wxChar *entry = GetArgData(); wxChar buf[300]; OutputChunkToString(GetArgChunk(), buf); if (winHelp) { if (CurrentTopic) { AddKeyWordForTopic(CurrentTopic, buf); } } else GenerateIndexEntry(buf); } return false; } case ltFCOL: case ltBCOL: { if (start) { switch (arg_no) { case 1: { wxChar *name = GetArgData(); int pos = FindColourPosition(name); if (pos > -1) { wxSnprintf(buf, sizeof(buf), _T("{%s%d "), ((macroId == ltFCOL) ? _T("\\cf") : _T("\\cb")), pos); TexOutput(buf); } else { wxSnprintf(buf, sizeof(buf), _T("Could not find colour name %s"), name); OnError(buf); } break; } case 2: { return true; } default: break; } } else { if (arg_no == 2) TexOutput(_T("}")); } return false; } case ltLABEL: { if (start && !winHelp && useWord) { wxChar *s = GetArgData(); // Only insert a bookmark here if it's not just been inserted // in a section heading. if ( !CurrentTopic || !(wxStrcmp(CurrentTopic, s) == 0) ) /* if ( (!CurrentChapterName || !(CurrentChapterName && (wxStrcmp(CurrentChapterName, s) == 0))) && (!CurrentSectionName || !(CurrentSectionName && (wxStrcmp(CurrentSectionName, s) == 0))) && (!CurrentSubsectionName || !(CurrentSubsectionName && (wxStrcmp(CurrentSubsectionName, s) == 0))) ) */ { wxFprintf(Chapters, _T("{\\bkmkstart %s}{\\bkmkend %s}"), s,s); } } return false; } case ltPAGEREF: { if (start && useWord && !winHelp) { wxChar *s = GetArgData(); wxFprintf(Chapters, _T("{\\field{\\*\\fldinst PAGEREF %s \\\\* MERGEFORMAT }{\\fldrslt ??}}"), s); } return false; } case ltPOPREFONLY: { if (start) inPopRefSection = true; else inPopRefSection = false; break; } case ltINSERTATLEVEL: { // This macro allows you to insert text at a different level // from the current level, e.g. into the Sections from within a subsubsection. if (!winHelp & useWord) return false; static int currentLevelNo = 1; static FILE* oldLevelFile = Chapters; if (start) { switch (arg_no) { case 1: { oldLevelFile = CurrentOutput1; wxChar *str = GetArgData(); currentLevelNo = wxAtoi(str); FILE* outputFile; // TODO: cope with article style (no chapters) switch (currentLevelNo) { case 1: { outputFile = Chapters; break; } case 2: { outputFile = Sections; break; } case 3: { outputFile = Subsections; break; } case 4: { outputFile = Subsubsections; break; } default: { outputFile = NULL; break; } } if (outputFile) CurrentOutput1 = outputFile; return false; } case 2: { return true; } default: break; } return true; } else { if (arg_no == 2) { CurrentOutput1 = oldLevelFile; } return true; } } default: return DefaultOnArgument(macroId, arg_no, start); } return true; } bool RTFGo(void) { if (stopRunning) return false; // Reset variables indentLevel = 0; forbidParindent = 0; contentsLineSection = NULL; contentsLineValue = NULL; descriptionItemArg = NULL; inTabular = false; inTable = false; inFigure = false; startRows = false; tableVerticalLineLeft = false; tableVerticalLineRight = false; noColumns = 0; startedSections = false; inVerbatim = false; browseId = 0; if (InputFile && OutputFile) { // Do some RTF-specific transformations on all the strings, // recursively Text2RTF(GetTopLevelChunk()); Contents = wxFopen(TmpContentsName, _T("w")); Chapters = wxFopen(_T("chapters.rtf"), _T("w")); if (winHelp) { Sections = wxFopen(_T("sections.rtf"), _T("w")); Subsections = wxFopen(_T("subsections.rtf"), _T("w")); Subsubsections = wxFopen(_T("subsubsections.rtf"), _T("w")); Popups = wxFopen(_T("popups.rtf"), _T("w")); if (winHelpContents) { WinHelpContentsFile = wxFopen(WinHelpContentsFileName, _T("w")); if (WinHelpContentsFile) wxFprintf(WinHelpContentsFile, _T(":Base %s.hlp\n"), wxFileNameFromPath(FileRoot)); } if (!Sections || !Subsections || !Subsubsections || !Popups || (winHelpContents && !WinHelpContentsFile)) { OnError(_T("Ouch! Could not open temporary file(s) for writing.")); return false; } } if (!Contents || !Chapters) { OnError(_T("Ouch! Could not open temporary file(s) for writing.")); return false; } if (winHelp) { wxFprintf(Chapters, _T("\n#{\\footnote Contents}\n")); wxFprintf(Chapters, _T("${\\footnote Contents}\n")); wxFprintf(Chapters, _T("+{\\footnote %s}\n"), GetBrowseString()); wxFprintf(Chapters, _T("K{\\footnote {K} %s}\n"), ContentsNameString); wxFprintf(Chapters, _T("!{\\footnote DisableButton(\"Up\")}\n")); } if (!winHelp) { wxFprintf(Chapters, _T("\\titlepg\n")); wxFprintf(Contents, _T("\\par\\pard\\pgnrestart\\sect\\titlepg")); } // In WinHelp, Contents title takes font of title. // In linear RTF, same as chapter headings. wxFprintf(Contents, _T("{\\b\\fs%d %s}\\par\\par\\pard\n\n"), (winHelp ? titleFont : chapterFont)*2, ContentsNameString); // By default, Swiss, 11 point. wxFprintf(Chapters, _T("\\f2\\fs22\n")); PushEnvironmentStyle(_T("\\f2\\fs22\\sa200")); SetCurrentOutput(Chapters); if (stopRunning) return false; OnInform(_T("Converting...")); TraverseDocument(); FILE *Header = wxFopen(_T("header.rtf"), _T("w")); if (!Header) { OnError(_T("Ouch! Could not open temporary file header.rtf for writing.")); return false; } WriteRTFHeader(Header); fclose(Header); PopEnvironmentStyle(); Tex2RTFYield(true); if (winHelp) { // wxFprintf(Contents, _T("\\page\n")); wxFprintf(Chapters, _T("\\page\n")); wxFprintf(Sections, _T("\\page\n")); wxFprintf(Subsections, _T("\\page\n")); wxFprintf(Subsubsections, _T("\\page\n\n")); wxFprintf(Popups, _T("\\page\n}\n")); } // TexOutput(_T("\n\\info{\\doccomm Document created by Julian Smart's Tex2RTF.}\n")); if (!winHelp) TexOutput(_T("}\n")); fclose(Contents); Contents = NULL; fclose(Chapters); Chapters = NULL; if (winHelp) { fclose(Sections); Sections = NULL; fclose(Subsections); Subsections = NULL; fclose(Subsubsections); Subsubsections = NULL; fclose(Popups); Popups = NULL; if (winHelpContents) { fclose(WinHelpContentsFile); WinHelpContentsFile = NULL; } } if (winHelp) { wxConcatFiles(_T("header.rtf"), _T("chapters.rtf"), _T("tmp1.rtf")); Tex2RTFYield(true); wxConcatFiles(_T("tmp1.rtf"), _T("sections.rtf"), _T("tmp2.rtf")); Tex2RTFYield(true); wxConcatFiles(_T("tmp2.rtf"), _T("subsections.rtf"), _T("tmp3.rtf")); Tex2RTFYield(true); wxConcatFiles(_T("tmp3.rtf"), _T("subsubsections.rtf"), _T("tmp4.rtf")); Tex2RTFYield(true); wxConcatFiles(_T("tmp4.rtf"), _T("popups.rtf"), OutputFile); Tex2RTFYield(true); wxRemoveFile(_T("tmp1.rtf")); wxRemoveFile(_T("tmp2.rtf")); wxRemoveFile(_T("tmp3.rtf")); wxRemoveFile(_T("tmp4.rtf")); } else { wxConcatFiles(_T("header.rtf"), _T("chapters.rtf"), _T("tmp1.rtf")); Tex2RTFYield(true); if (wxFileExists(OutputFile)) wxRemoveFile(OutputFile); wxChar *cwdStr; cwdStr = wxGetWorkingDirectory(); wxString outputDirStr; outputDirStr = wxPathOnly(OutputFile); // Determine if the temp file and the output file are in the same directory, // and if they are, then just rename the temp file rather than copying // it, as this is much faster when working with large (multi-megabyte files) if ((wxStrcmp(outputDirStr.c_str(),_T("")) == 0) || // no path specified on output file (wxStrcmp(cwdStr,outputDirStr.c_str()) == 0)) // paths do not match { wxRenameFile(_T("tmp1.rtf"), OutputFile); } else { wxCopyFile(_T("tmp1.rtf"), OutputFile); } delete [] cwdStr; Tex2RTFYield(true); wxRemoveFile(_T("tmp1.rtf")); } if (wxFileExists(ContentsName)) wxRemoveFile(ContentsName); if (!wxRenameFile(TmpContentsName, ContentsName)) { wxCopyFile(TmpContentsName, ContentsName); wxRemoveFile(TmpContentsName); } wxRemoveFile(_T("chapters.rtf")); wxRemoveFile(_T("header.rtf")); if (winHelp) { wxRemoveFile(_T("sections.rtf")); wxRemoveFile(_T("subsections.rtf")); wxRemoveFile(_T("subsubsections.rtf")); wxRemoveFile(_T("popups.rtf")); } if (winHelp && generateHPJ) WriteHPJ(OutputFile); return true; } return false; }