1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: Utilities for Latex conversion.
4 // Author: Julian Smart
5 // Modified by: Wlodzimierz ABX Skiba 2003/2004 Unicode support
9 // Copyright: (c) Julian Smart
10 // Licence: wxWindows licence
11 /////////////////////////////////////////////////////////////////////////////
13 // For compilers that support precompilation, includes "wx.h".
14 #include "wx/wxprec.h"
28 #if !WXWIN_COMPATIBILITY_2_4
29 static inline wxChar
* copystring(const wxChar
* s
)
30 { return wxStrcpy(new wxChar
[wxStrlen(s
) + 1], s
); }
34 * Variables accessible from clients
38 TexChunk
* DocumentTitle
= NULL
;
39 TexChunk
* DocumentAuthor
= NULL
;
40 TexChunk
* DocumentDate
= NULL
;
42 // Header/footers/pagestyle
43 TexChunk
* LeftHeaderEven
= NULL
;
44 TexChunk
* LeftFooterEven
= NULL
;
45 TexChunk
* CentreHeaderEven
= NULL
;
46 TexChunk
* CentreFooterEven
= NULL
;
47 TexChunk
* RightHeaderEven
= NULL
;
48 TexChunk
* RightFooterEven
= NULL
;
49 TexChunk
* LeftHeaderOdd
= NULL
;
50 TexChunk
* LeftFooterOdd
= NULL
;
51 TexChunk
* CentreHeaderOdd
= NULL
;
52 TexChunk
* CentreFooterOdd
= NULL
;
53 TexChunk
* RightHeaderOdd
= NULL
;
54 TexChunk
* RightFooterOdd
= NULL
;
55 wxChar
* PageStyle
= copystring(_T("plain"));
57 int DocumentStyle
= LATEX_REPORT
;
58 int MinorDocumentStyle
= 0;
59 wxPathList TexPathList
;
60 wxChar
* BibliographyStyleString
= copystring(_T("plain"));
61 wxChar
* DocumentStyleString
= copystring(_T("report"));
62 wxChar
* MinorDocumentStyleString
= NULL
;
76 // All of these tokens MUST be found on a line by themselves (no other
77 // text) and must start at the first character of the line, or tex2rtf
78 // will fail to process them correctly (a limitation of tex2rtf, not TeX)
79 static const wxString syntaxTokens
[] =
80 { _T("\\begin{verbatim}"),
81 _T("\\begin{toocomplex}"),
82 _T("\\end{verbatim}"),
83 _T("\\end{toocomplex}"),
85 _T("\\begin{comment}"),
87 _T("\\verbatiminput"),
97 * USER-ADJUSTABLE SETTINGS
101 // Section font sizes
102 int chapterFont
= 12; // LARGEFont3;
103 int sectionFont
= 12; // LargeFont2;
104 int subsectionFont
= 12; // largeFont1;
105 int titleFont
= LARGEFont3
;
106 int authorFont
= LargeFont2
;
107 int mirrorMargins
= true;
108 bool winHelp
= false; // Output in Windows Help format if true, linear otherwise
109 bool isInteractive
= false;
110 bool runTwice
= false;
111 int convertMode
= TEX_RTF
;
112 bool checkCurlyBraces
= false;
113 bool checkSyntax
= false;
114 bool headerRule
= false;
115 bool footerRule
= false;
116 bool compatibilityMode
= false; // If true, maximum Latex compatibility
117 // (Quality of RTF generation deteriorate)
118 bool generateHPJ
; // Generate WinHelp Help Project file
119 wxChar
*winHelpTitle
= NULL
; // Windows Help title
120 int defaultTableColumnWidth
= 2000;
122 int labelIndentTab
= 18; // From left indent to item label (points)
123 int itemIndentTab
= 40; // From left indent to item (points)
125 bool useUpButton
= true;
126 int htmlBrowseButtons
= HTML_BUTTONS_TEXT
;
128 bool truncateFilenames
= false; // Truncate for DOS
129 int winHelpVersion
= 3; // WinHelp Version (3 for Windows 3.1, 4 for Win95)
130 bool winHelpContents
= false; // Generate .cnt file for WinHelp 4
131 bool htmlIndex
= false; // Generate .htx file for HTML
132 bool htmlFrameContents
= false; // Use frames for HTML contents page
133 wxChar
*htmlStylesheet
= NULL
; // Use this CSS stylesheet for HTML pages
134 bool useHeadingStyles
= true; // Insert \s1, s2 etc.
135 bool useWord
= true; // Insert proper Word table of contents, etc etc
136 int contentsDepth
= 4; // Depth of Word table of contents
137 bool indexSubsections
= true; // Index subsections in linear RTF
138 // Linear RTF method of including bitmaps. Can be "includepicture", "hex"
139 wxChar
*bitmapMethod
= copystring(_T("includepicture"));
140 bool upperCaseNames
= false;
141 // HTML background and text colours
142 wxChar
*backgroundImageString
= NULL
;
143 wxChar
*backgroundColourString
= copystring(_T("255;255;255"));
144 wxChar
*textColourString
= NULL
;
145 wxChar
*linkColourString
= NULL
;
146 wxChar
*followedLinkColourString
= NULL
;
147 bool combineSubSections
= false;
148 bool htmlWorkshopFiles
= false;
149 bool ignoreBadRefs
= false;
150 wxChar
*htmlFaceName
= NULL
;
152 extern int passNumber
;
154 extern wxHashTable TexReferences
;
157 * International support
160 // Names to help with internationalisation
161 wxChar
*ContentsNameString
= copystring(_T("Contents"));
162 wxChar
*AbstractNameString
= copystring(_T("Abstract"));
163 wxChar
*GlossaryNameString
= copystring(_T("Glossary"));
164 wxChar
*ReferencesNameString
= copystring(_T("References"));
165 wxChar
*FiguresNameString
= copystring(_T("List of Figures"));
166 wxChar
*TablesNameString
= copystring(_T("List of Tables"));
167 wxChar
*FigureNameString
= copystring(_T("Figure"));
168 wxChar
*TableNameString
= copystring(_T("Table"));
169 wxChar
*IndexNameString
= copystring(_T("Index"));
170 wxChar
*ChapterNameString
= copystring(_T("chapter"));
171 wxChar
*SectionNameString
= copystring(_T("section"));
172 wxChar
*SubsectionNameString
= copystring(_T("subsection"));
173 wxChar
*SubsubsectionNameString
= copystring(_T("subsubsection"));
174 wxChar
*UpNameString
= copystring(_T("Up"));
183 int subsectionNo
= 0;
184 int subsubsectionNo
= 0;
193 FILE *CurrentOutput1
= NULL
;
194 FILE *CurrentOutput2
= NULL
;
196 unsigned long LineNumbers
[15];
197 wxChar
*FileNames
[15];
198 int CurrentInputIndex
= 0;
200 wxChar
*TexFileRoot
= NULL
;
201 wxChar
*TexBibName
= NULL
; // Bibliography output file name
202 wxChar
*TexTmpBibName
= NULL
; // Temporary bibliography output file name
203 bool isSync
= false; // If true, should not yield to other processes.
204 bool stopRunning
= false; // If true, should abort.
206 static int currentColumn
= 0;
207 wxChar
*currentArgData
= NULL
;
208 bool haveArgData
= false; // If true, we're simulating the data.
209 TexChunk
*currentArgument
= NULL
;
210 TexChunk
*nextChunk
= NULL
;
211 bool isArgOptional
= false;
214 TexChunk
*TopLevel
= NULL
;
215 // wxList MacroDefs(wxKEY_STRING);
216 wxHashTable
MacroDefs(wxKEY_STRING
);
217 wxStringList IgnorableInputFiles
; // Ignorable \input files, e.g. psbox.tex
218 wxChar
*BigBuffer
= NULL
; // For reading in large chunks of text
219 TexMacroDef
*SoloBlockDef
= NULL
;
220 TexMacroDef
*VerbatimMacroDef
= NULL
;
222 #define IncrementLineNumber() LineNumbers[CurrentInputIndex] ++
225 TexRef::TexRef(const wxChar
*label
, const wxChar
*file
,
226 const wxChar
*section
, const wxChar
*sectionN
)
228 refLabel
= copystring(label
);
229 refFile
= file
? copystring(file
) : (wxChar
*) NULL
;
230 sectionNumber
= section
? copystring(section
) : copystring(_T("??"));
231 sectionName
= sectionN
? copystring(sectionN
) : copystring(_T("??"));
234 TexRef::~TexRef(void)
236 delete [] refLabel
; refLabel
= NULL
;
237 delete [] refFile
; refFile
= NULL
;
238 delete [] sectionNumber
; sectionNumber
= NULL
;
239 delete [] sectionName
; sectionName
= NULL
;
243 CustomMacro::~CustomMacro()
251 void TexOutput(const wxChar
*s
, bool ordinaryText
)
253 int len
= wxStrlen(s
);
255 // Update current column, but only if we're guaranteed to
256 // be ordinary text (not mark-up stuff)
259 for (i
= 0; i
< len
; i
++)
261 if (s
[i
] == 13 || s
[i
] == 10)
268 wxFprintf(CurrentOutput1
, _T("%s"), s
);
270 wxFprintf(CurrentOutput2
, _T("%s"), s
);
274 * Try to find a Latex macro, in one of the following forms:
275 * (1) \begin{} ... \end{}
276 * (2) \macroname{arg1}...{argn}
280 void ForbidWarning(TexMacroDef
*def
)
283 switch (def
->forbidden
)
287 informBuf
.Printf(_T("Warning: it is recommended that command %s is not used."), def
->name
);
288 OnInform((const wxChar
*)informBuf
.c_str());
291 case FORBID_ABSOLUTELY
:
293 informBuf
.Printf(_T("Error: command %s cannot be used and will lead to errors."), def
->name
);
294 OnInform((const wxChar
*)informBuf
.c_str());
302 TexMacroDef
*MatchMacro(wxChar
*buffer
, int *pos
, wxChar
**env
, bool *parseToBrace
)
304 *parseToBrace
= true;
306 TexMacroDef
*def
= NULL
;
309 // First, try to find begin{thing}
310 if (wxStrncmp(buffer
+i
, _T("begin{"), 6) == 0)
315 while ((isalpha(buffer
[j
]) || buffer
[j
] == '*') && ((j
- i
) < 39))
317 macroBuf
[j
-i
] = buffer
[j
];
321 def
= (TexMacroDef
*)MacroDefs
.Get(macroBuf
);
325 *pos
= j
+ 1; // BUGBUG Should this be + 1???
336 // Failed, so try to find macro from definition list
339 // First try getting a one-character macro, but ONLY
340 // if these TWO characters are not both alphabetical (could
341 // be a longer macro)
342 if (!(isalpha(buffer
[i
]) && isalpha(buffer
[i
+1])))
344 macroBuf
[0] = buffer
[i
];
347 def
= (TexMacroDef
*)MacroDefs
.Get(macroBuf
);
353 while ((isalpha(buffer
[j
]) || buffer
[j
] == '*') && ((j
- i
) < 39))
355 macroBuf
[j
-i
] = buffer
[j
];
359 def
= (TexMacroDef
*)MacroDefs
.Get(macroBuf
);
366 // We want to check whether this is a space-consuming macro
368 // No brace, e.g. \input thing.tex instead of \input{thing};
369 // or a numeric argument, such as \parindent0pt
370 if ((def
->no_args
> 0) && ((buffer
[i
] == 32) || (buffer
[i
] == '=') || (isdigit(buffer
[i
]))))
372 if ((buffer
[i
] == 32) || (buffer
[i
] == '='))
375 *parseToBrace
= false;
384 void EatWhiteSpace(wxChar
*buffer
, int *pos
)
386 int len
= wxStrlen(buffer
);
388 bool keepGoing
= true;
389 bool moreLines
= true;
390 while ((j
< len
) && keepGoing
&&
391 (buffer
[j
] == 10 || buffer
[j
] == 13 || buffer
[j
] == ' ' || buffer
[j
] == 9))
398 moreLines
= read_a_line(buffer
);
399 len
= wxStrlen(buffer
);
409 bool FindEndEnvironment(wxChar
*buffer
, int *pos
, wxChar
*env
)
413 // Try to find end{thing}
414 if ((wxStrncmp(buffer
+i
, _T("end{"), 4) == 0) &&
415 (wxStrncmp(buffer
+i
+4, env
, wxStrlen(env
)) == 0))
417 *pos
= i
+ 5 + wxStrlen(env
);
423 bool readingVerbatim
= false;
424 bool readInVerbatim
= false; // Within a verbatim, but not nec. verbatiminput
426 // Switched this off because e.g. \verb${$ causes it to fail. There is no
427 // detection of \verb yet.
428 // #define CHECK_BRACES 1
430 unsigned long leftCurly
= 0;
431 unsigned long rightCurly
= 0;
432 static wxString currentFileName
= wxEmptyString
;
434 bool read_a_line(wxChar
*buf
)
436 if (CurrentInputIndex
< 0)
443 unsigned long bufIndex
= 0;
447 while (ch
!= EOF
&& ch
!= 10)
449 if (bufIndex
>= MAX_LINE_BUFFER_SIZE
)
452 errBuf
.Printf(_T("Line %lu of file %s is too long. Lines can be no longer than %lu characters. Truncated."),
453 LineNumbers
[CurrentInputIndex
], (const wxChar
*) currentFileName
.c_str(), MAX_LINE_BUFFER_SIZE
);
454 OnError((wxChar
*)errBuf
.c_str());
458 if (((bufIndex
== 14) && (wxStrncmp(buf
, _T("\\end{verbatim}"), 14) == 0)) ||
459 ((bufIndex
== 16) && (wxStrncmp(buf
, _T("\\end{toocomplex}"), 16) == 0)))
460 readInVerbatim
= false;
463 ch
= getc(Inputs
[CurrentInputIndex
]);
465 if (checkCurlyBraces
)
467 if (ch
== '{' && !readInVerbatim
&& lastChar
!= _T('\\'))
469 if (ch
== '}' && !readInVerbatim
&& lastChar
!= _T('\\'))
472 if (rightCurly
> leftCurly
)
475 errBuf
.Printf(_T("An extra right Curly brace ('}') was detected at line %lu inside file %s"), LineNumbers
[CurrentInputIndex
], (const wxChar
*) currentFileName
.c_str());
476 OnError((wxChar
*)errBuf
.c_str());
478 // Reduce the count of right Curly braces, so the mismatched count
479 // isn't reported on every line that has a '}' after the first mismatch
487 // Check for 2 consecutive newlines and replace with \par
488 if (ch
== 10 && !readInVerbatim
)
490 int ch1
= getc(Inputs
[CurrentInputIndex
]);
491 if ((ch1
== 10) || (ch1
== 13))
493 // Eliminate newline (10) following DOS linefeed
495 getc(Inputs
[CurrentInputIndex
]);
497 IncrementLineNumber();
498 // wxStrcat(buf, "\\par\n");
500 if (bufIndex
+5 >= MAX_LINE_BUFFER_SIZE
)
503 errBuf
.Printf(_T("Line %lu of file %s is too long. Lines can be no longer than %lu characters. Truncated."),
504 LineNumbers
[CurrentInputIndex
], (const wxChar
*) currentFileName
.c_str(),MAX_LINE_BUFFER_SIZE
);
505 OnError((wxChar
*)errBuf
.c_str());
508 wxStrcat(buf
, _T("\\par"));
514 ungetc(ch1
, Inputs
[CurrentInputIndex
]);
515 if (bufIndex
>= MAX_LINE_BUFFER_SIZE
)
518 errBuf
.Printf(_T("Line %lu of file %s is too long. Lines can be no longer than %lu characters. Truncated."),
519 LineNumbers
[CurrentInputIndex
], (const wxChar
*) currentFileName
.c_str(),MAX_LINE_BUFFER_SIZE
);
520 OnError((wxChar
*)errBuf
.c_str());
524 buf
[bufIndex
] = (wxChar
)ch
;
531 // Convert embedded characters to RTF equivalents
540 if (bufIndex
+5 >= MAX_LINE_BUFFER_SIZE
)
543 errBuf
.Printf(_T("Line %lu of file %s is too long. Lines can be no longer than %lu characters. Truncated."),
544 LineNumbers
[CurrentInputIndex
], (const wxChar
*) currentFileName
.c_str(),MAX_LINE_BUFFER_SIZE
);
545 OnError((wxChar
*)errBuf
.c_str());
548 buf
[bufIndex
++]='\\';
553 case 0xf6:buf
[bufIndex
++]='o';break; // ö
554 case 0xe4:buf
[bufIndex
++]='a';break; // ä
555 case 0xfc:buf
[bufIndex
++]='u';break; // ü
556 case 0xd6:buf
[bufIndex
++]='O';break; // Ö
557 case 0xc4:buf
[bufIndex
++]='A';break; // Ä
558 case 0xdc:buf
[bufIndex
++]='U';break; // Ü
563 if (bufIndex
+5 >= MAX_LINE_BUFFER_SIZE
)
566 errBuf
.Printf(_T("Line %lu of file %s is too long. Lines can be no longer than %lu characters. Truncated."),
567 LineNumbers
[CurrentInputIndex
], (const wxChar
*) currentFileName
.c_str(),MAX_LINE_BUFFER_SIZE
);
568 OnError((wxChar
*)errBuf
.c_str());
571 buf
[bufIndex
++]='\\';
574 buf
[bufIndex
++]='\\';
578 if (bufIndex
>= MAX_LINE_BUFFER_SIZE
)
581 errBuf
.Printf(_T("Line %lu of file %s is too long. Lines can be no longer than %lu characters. Truncated."),
582 LineNumbers
[CurrentInputIndex
], (const wxChar
*) currentFileName
.c_str(),MAX_LINE_BUFFER_SIZE
);
583 OnError((wxChar
*)errBuf
.c_str());
586 // If the current character read in is a '_', we need to check
587 // whether there should be a '\' before it or not
590 buf
[bufIndex
++] = (wxChar
)ch
;
598 // There should NOT be a '\' before the '_'
599 if ((bufIndex
> 0 && (buf
[bufIndex
-1] == '\\')) && (buf
[0] != '%'))
602 // errBuf.Printf(_T("An underscore ('_') was detected at line %lu inside file %s that should NOT have a '\\' before it."),
603 // LineNumbers[CurrentInputIndex], (const wxChar*) currentFileName.c_str());
604 // OnError((wxChar *)errBuf.c_str());
609 // There should be a '\' before the '_'
613 errBuf
.Printf(_T("An underscore ('_') was detected at line %lu inside file %s that may need a '\\' before it."),
614 LineNumbers
[CurrentInputIndex
], (const wxChar
*) currentFileName
.c_str());
615 OnError((wxChar
*)errBuf
.c_str());
617 else if ((buf
[bufIndex
-1] != '\\') && (buf
[0] != '%') && // If it is a comment line, then no warnings
618 (wxStrncmp(buf
, _T("\\input"), 6))) // do not report filenames that have underscores in them
621 errBuf
.Printf(_T("An underscore ('_') was detected at line %lu inside file %s that may need a '\\' before it."),
622 LineNumbers
[CurrentInputIndex
], (const wxChar
*) currentFileName
.c_str());
623 OnError((wxChar
*)errBuf
.c_str());
627 buf
[bufIndex
++] = (wxChar
)ch
;
635 fclose(Inputs
[CurrentInputIndex
]);
636 Inputs
[CurrentInputIndex
] = NULL
;
637 if (CurrentInputIndex
> 0)
638 ch
= ' '; // No real end of file
639 CurrentInputIndex
--;
641 if (checkCurlyBraces
)
643 if (leftCurly
!= rightCurly
)
646 errBuf
.Printf(_T("Curly braces do not match inside file %s\n%lu opens, %lu closes"),
647 (const wxChar
*) currentFileName
.c_str(),leftCurly
,rightCurly
);
648 OnError((wxChar
*)errBuf
.c_str());
656 readingVerbatim
= false;
657 readInVerbatim
= false;
658 wxStrcat(buf
, _T("\\end{verbatim}\n"));
663 IncrementLineNumber();
667 // Strip out comment environment
668 if (wxStrncmp(buf
, _T("\\begin{comment}"), 15) == 0)
670 while (wxStrncmp(buf
, _T("\\end{comment}"), 13) != 0)
672 return read_a_line(buf
);
674 // Read a verbatim input file as if it were a verbatim environment
675 else if (wxStrncmp(buf
, _T("\\verbatiminput"), 14) == 0)
678 wxChar
*fileName
= buf
+ wordLen
+ 1;
680 int j
= bufIndex
- 1;
683 // thing}\par -- eliminate the \par!
684 if (wxStrncmp((buf
+ wxStrlen(buf
)-5), _T("\\par"), 4) == 0)
691 buf
[j
-1] = 0; // Ignore final brace
693 wxString actualFile
= TexPathList
.FindValidPath(fileName
);
694 currentFileName
= actualFile
;
695 if (actualFile
.empty())
698 errBuf
.Printf(_T("Could not find file: %s"),fileName
);
699 OnError((wxChar
*)errBuf
.c_str());
704 informStr
.Printf(_T("Processing: %s"),actualFile
.c_str());
705 OnInform((wxChar
*)informStr
.c_str());
706 CurrentInputIndex
++;
708 Inputs
[CurrentInputIndex
] = wxFopen(actualFile
, _T("r"));
709 LineNumbers
[CurrentInputIndex
] = 1;
710 if (FileNames
[CurrentInputIndex
])
711 delete[] FileNames
[CurrentInputIndex
];
712 FileNames
[CurrentInputIndex
] = copystring(actualFile
);
714 if (!Inputs
[CurrentInputIndex
])
716 CurrentInputIndex
--;
717 OnError(_T("Could not open verbatiminput file."));
721 readingVerbatim
= true;
722 readInVerbatim
= true;
723 wxStrcpy(buf
, _T("\\begin{verbatim}\n"));
729 else if (wxStrncmp(buf
, _T("\\input"), 6) == 0 || wxStrncmp(buf
, _T("\\helpinput"), 10) == 0 ||
730 wxStrncmp(buf
, _T("\\include"), 8) == 0)
733 if (wxStrncmp(buf
, _T("\\input"), 6) == 0)
736 if (wxStrncmp(buf
, _T("\\include"), 8) == 0)
741 wxChar
*fileName
= buf
+ wordLen
+ 1;
743 int j
= bufIndex
- 1;
746 // \input{thing}\par -- eliminate the \par!
747 // if (wxStrncmp((buf + wxStrlen(buf)-5), "\\par", 4) == 0)
748 if (wxStrncmp((buf
+ wxStrlen(buf
)-4), _T("\\par"), 4) == 0) // Bug fix 8/2/95 Ulrich Leodolter
755 if (buf
[j
-1] == _T('}'))
756 buf
[j
-1] = 0; // Ignore final brace
758 // Remove backslashes from name
759 wxString
fileNameStr(fileName
);
760 fileNameStr
.Replace(_T("\\"), _T(""));
762 // Ignore some types of input files (e.g. macro definition files)
763 wxChar
*fileOnly
= wxFileNameFromPath((wxChar
*) (const wxChar
*) fileNameStr
);
764 currentFileName
= fileOnly
;
765 if (IgnorableInputFiles
.Member(fileOnly
))
766 return read_a_line(buf
);
768 wxString actualFile
= TexPathList
.FindValidPath(fileNameStr
);
769 if (actualFile
.empty())
772 wxSnprintf(buf2
, sizeof(buf2
), _T("%s.tex"), fileNameStr
.c_str());
773 actualFile
= TexPathList
.FindValidPath(buf2
);
775 currentFileName
= actualFile
;
777 if (actualFile
.empty())
780 errBuf
.Printf(_T("Could not find file: %s"),fileName
);
781 OnError((wxChar
*)errBuf
.c_str());
785 // Ensure that if this file includes another,
786 // then we look in the same directory as this one.
787 TexPathList
.EnsureFileAccessible(actualFile
);
790 informStr
.Printf(_T("Processing: %s"),actualFile
.c_str());
791 OnInform((wxChar
*)informStr
.c_str());
792 CurrentInputIndex
++;
794 Inputs
[CurrentInputIndex
] = wxFopen(actualFile
, _T("r"));
795 LineNumbers
[CurrentInputIndex
] = 1;
796 if (FileNames
[CurrentInputIndex
])
797 delete[] FileNames
[CurrentInputIndex
];
798 FileNames
[CurrentInputIndex
] = copystring(actualFile
);
800 if (!Inputs
[CurrentInputIndex
])
803 errBuf
.Printf(_T("Could not open include file %s"), (const wxChar
*) actualFile
);
804 CurrentInputIndex
--;
805 OnError((wxChar
*)errBuf
.c_str());
808 bool succ
= read_a_line(buf
);
814 wxString bufStr
= buf
;
815 for (int index
=0; !syntaxTokens
[index
].empty(); index
++)
817 size_t pos
= bufStr
.find(syntaxTokens
[index
]);
818 if (pos
!= wxString::npos
&& pos
!= 0)
820 size_t commentStart
= bufStr
.find(_T("%"));
821 if (commentStart
== wxString::npos
|| commentStart
> pos
)
824 if (syntaxTokens
[index
] == _T("\\verb"))
826 errBuf
.Printf(_T("'%s$....$' was detected at line %lu inside file %s. Please replace this form with \\tt{....}"),
827 syntaxTokens
[index
].c_str(),
828 LineNumbers
[CurrentInputIndex
],
829 currentFileName
.c_str());
833 errBuf
.Printf(_T("'%s' was detected at line %lu inside file %s that is not the only text on the line, starting at column one."),
834 syntaxTokens
[index
].c_str(),
835 LineNumbers
[CurrentInputIndex
],
836 currentFileName
.c_str());
838 OnError((wxChar
*)errBuf
.c_str());
844 if (wxStrncmp(buf
, _T("\\begin{verbatim}"), 16) == 0 ||
845 wxStrncmp(buf
, _T("\\begin{toocomplex}"), 18) == 0)
846 readInVerbatim
= true;
847 else if (wxStrncmp(buf
, _T("\\end{verbatim}"), 14) == 0 ||
848 wxStrncmp(buf
, _T("\\end{toocomplex}"), 16) == 0)
849 readInVerbatim
= false;
851 if (checkCurlyBraces
)
853 if (ch
== EOF
&& leftCurly
!= rightCurly
)
856 errBuf
.Printf(_T("Curly braces do not match inside file %s\n%lu opens, %lu closes"),
857 (const wxChar
*) currentFileName
.c_str(),leftCurly
,rightCurly
);
858 OnError((wxChar
*)errBuf
.c_str());
870 bool ParseNewCommand(wxChar
*buffer
, int *pos
)
872 if ((wxStrncmp((buffer
+(*pos
)), _T("newcommand"), 10) == 0) ||
873 (wxStrncmp((buffer
+(*pos
)), _T("renewcommand"), 12) == 0))
875 if (wxStrncmp((buffer
+(*pos
)), _T("newcommand"), 10) == 0)
880 wxChar commandName
[100];
881 wxChar commandValue
[1000];
884 while (buffer
[*pos
] != _T('}') && (buffer
[*pos
] != 0))
886 commandName
[i
] = buffer
[*pos
];
893 if (buffer
[*pos
] == _T('['))
896 noArgs
= (int)(buffer
[*pos
]) - 48;
897 *pos
+= 2; // read past argument and '['
903 wxChar ch
= buffer
[*pos
];
906 else if (ch
== _T('}'))
914 end
= !read_a_line(buffer
);
919 commandValue
[i
] = ch
;
925 CustomMacro
*macro
= new CustomMacro(commandName
, noArgs
, NULL
);
926 if (wxStrlen(commandValue
) > 0)
927 macro
->macroBody
= copystring(commandValue
);
928 if (!CustomMacroList
.Find(commandName
))
930 CustomMacroList
.Append(commandName
, macro
);
931 AddMacroDef(ltCUSTOM_MACRO
, commandName
, noArgs
);
938 void MacroError(wxChar
*buffer
)
941 wxChar macroBuf
[200];
945 while (((ch
= buffer
[i
-1]) != '\n') && (ch
!= 0))
954 errBuf
.Printf(_T("Could not find macro: %s at line %d, file %s"),
955 macroBuf
, (int)(LineNumbers
[CurrentInputIndex
]-1), FileNames
[CurrentInputIndex
]);
956 OnError((wxChar
*)errBuf
.c_str());
958 if (wxStrcmp(macroBuf
,_T("\\end{document}")) == 0)
960 OnInform( _T("Halted build due to unrecoverable error.") );
967 * 'environment' specifies the name of the macro IFF if we're looking for the end
968 * of an environment, e.g. \end{itemize}. Otherwise it's NULL.
969 * 'parseToBrace' is true if the argument should extend to the next right brace,
970 * e.g. in {\bf an argument} as opposed to \vskip 30pt
973 int ParseArg(TexChunk
*thisArg
, wxList
& children
, wxChar
*buffer
, int pos
, wxChar
*environment
, bool parseToBrace
, TexChunk
*customMacroArgs
)
976 if (stopRunning
) return pos
;
985 // Consume leading brace or square bracket, but ONLY if not following
986 // a space, because this could be e.g. {\large {\bf thing}} where {\bf thing}
987 // is the argument of \large AS WELL as being a block in its
991 if ((pos > 0) && (buffer[pos-1] != ' ') && buffer[pos] == '{')
995 if ((pos > 0) && (buffer[pos-1] != ' ') && (buffer[pos] == '[' || buffer[pos] == '('))
1000 else if ((pos > 1) && (buffer[pos-1] != ' ') && (buffer[pos+1] == '[' || buffer[pos+1] == '('))
1008 // If not parsing to brace, just read the next word
1009 // (e.g. \vskip 20pt)
1012 int ch
= buffer
[pos
];
1013 while (!eof
&& ch
!= 13 && ch
!= 32 && ch
!= 10 &&
1014 ch
!= 0 && ch
!= '{')
1016 BigBuffer
[buf_ptr
] = (wxChar
)ch
;
1023 TexChunk
*chunk
= new TexChunk(CHUNK_TYPE_STRING
);
1024 BigBuffer
[buf_ptr
] = 0;
1025 chunk
->value
= copystring(BigBuffer
);
1026 children
.Append((wxObject
*)chunk
);
1033 len
= wxStrlen(buffer
);
1036 if (customMacroArgs
) return 0;
1038 eof
= read_a_line(buffer
);
1040 // Check for verbatim (or toocomplex, which comes to the same thing)
1041 wxString bufStr
= buffer
;
1042 // if (bufStr.find("\\begin{verbatim}") != wxString::npos ||
1043 // bufStr.find("\\begin{toocomplex}") != wxString::npos)
1044 if (wxStrncmp(buffer
, _T("\\begin{verbatim}"), 16) == 0 ||
1045 wxStrncmp(buffer
, _T("\\begin{toocomplex}"), 18) == 0)
1049 TexChunk
*chunk
= new TexChunk(CHUNK_TYPE_STRING
);
1050 BigBuffer
[buf_ptr
] = 0;
1051 chunk
->value
= copystring(BigBuffer
);
1052 children
.Append((wxObject
*)chunk
);
1057 eof
= read_a_line(buffer
);
1058 while (!eof
&& (wxStrncmp(buffer
, _T("\\end{verbatim}"), 14) != 0) &&
1059 (wxStrncmp(buffer
, _T("\\end{toocomplex}"), 16) != 0)
1062 wxStrcat(BigBuffer
, buffer
);
1063 buf_ptr
+= wxStrlen(buffer
);
1064 eof
= read_a_line(buffer
);
1066 eof
= read_a_line(buffer
);
1069 TexChunk
*chunk
= new TexChunk(CHUNK_TYPE_MACRO
, VerbatimMacroDef
);
1071 chunk
->macroId
= ltVERBATIM
;
1072 TexChunk
*arg
= new TexChunk(CHUNK_TYPE_ARG
, VerbatimMacroDef
);
1074 arg
->macroId
= ltVERBATIM
;
1075 TexChunk
*str
= new TexChunk(CHUNK_TYPE_STRING
);
1076 str
->value
= copystring(BigBuffer
);
1078 children
.Append((wxObject
*)chunk
);
1079 chunk
->children
.Append((wxObject
*)arg
);
1080 arg
->children
.Append((wxObject
*)str
);
1082 // Also want to include the following newline (is always a newline
1083 // after a verbatim): EXCEPT in HTML
1084 if (convertMode
!= TEX_HTML
)
1086 TexMacroDef
*parDef
= (TexMacroDef
*)MacroDefs
.Get(_T("\\"));
1087 TexChunk
*parChunk
= new TexChunk(CHUNK_TYPE_MACRO
, parDef
);
1088 parChunk
->no_args
= 0;
1089 parChunk
->macroId
= ltBACKSLASHCHAR
;
1090 children
.Append((wxObject
*)parChunk
);
1095 wxChar wxCh
= buffer
[pos
];
1096 // End of optional argument -- pretend it's right brace for simplicity
1097 if (thisArg
->optional
&& (wxCh
== _T(']')))
1103 case _T('}'): // End of argument
1107 TexChunk
*chunk
= new TexChunk(CHUNK_TYPE_STRING
);
1108 BigBuffer
[buf_ptr
] = 0;
1109 chunk
->value
= copystring(BigBuffer
);
1110 children
.Append((wxObject
*)chunk
);
1112 if (wxCh
== _T('}')) pos
++;
1117 if (buf_ptr
> 0) // Finish off the string we've read so far
1119 TexChunk
*chunk
= new TexChunk(CHUNK_TYPE_STRING
);
1120 BigBuffer
[buf_ptr
] = 0;
1122 chunk
->value
= copystring(BigBuffer
);
1123 children
.Append((wxObject
*)chunk
);
1127 // Try matching \end{environment}
1128 if (environment
&& FindEndEnvironment(buffer
, &pos
, environment
))
1130 // Eliminate newline after an \end{} if possible
1131 if (buffer
[pos
] == 13)
1134 if (buffer
[pos
] == 10)
1140 if (ParseNewCommand(buffer
, &pos
))
1143 if (wxStrncmp(buffer
+pos
, _T("special"), 7) == 0)
1151 wxTex2RTFBuffer
[0] = 0;
1156 wxChar ch
= buffer
[pos
];
1162 wxTex2RTFBuffer
[i
] = 0;
1167 wxTex2RTFBuffer
[i
] = _T('}');
1172 else if (ch
== _T('{'))
1174 wxTex2RTFBuffer
[i
] = _T('{');
1178 else if (ch
== _T('\\') && buffer
[pos
+1] == _T('}'))
1180 wxTex2RTFBuffer
[i
] = _T('}');
1184 else if (ch
== _T('\\') && buffer
[pos
+1] == _T('{'))
1186 wxTex2RTFBuffer
[i
] = _T('{');
1192 wxTex2RTFBuffer
[i
] = ch
;
1199 TexChunk
*chunk
= new TexChunk(CHUNK_TYPE_MACRO
);
1201 chunk
->macroId
= ltSPECIAL
;
1202 TexMacroDef
*specialDef
= (TexMacroDef
*)MacroDefs
.Get(_T("special"));
1203 chunk
->def
= specialDef
;
1204 TexChunk
*arg
= new TexChunk(CHUNK_TYPE_ARG
, specialDef
);
1205 chunk
->children
.Append((wxObject
*)arg
);
1207 arg
->macroId
= chunk
->macroId
;
1209 // The value in the first argument.
1210 TexChunk
*argValue
= new TexChunk(CHUNK_TYPE_STRING
);
1211 arg
->children
.Append((wxObject
*)argValue
);
1213 argValue
->value
= copystring(wxTex2RTFBuffer
);
1215 children
.Append((wxObject
*)chunk
);
1217 else if (wxStrncmp(buffer
+pos
, _T("verb"), 4) == 0)
1220 if (buffer
[pos
] == _T('*'))
1223 // Find the delimiter character
1224 wxChar ch
= buffer
[pos
];
1226 // Now at start of verbatim text
1228 while ((buffer
[pos
] != ch
) && buffer
[pos
] != 0)
1230 wxChar
*val
= new wxChar
[pos
- j
+ 1];
1232 for (i
= j
; i
< pos
; i
++)
1234 val
[i
-j
] = buffer
[i
];
1240 TexChunk
*chunk
= new TexChunk(CHUNK_TYPE_MACRO
);
1242 chunk
->macroId
= ltVERB
;
1243 TexMacroDef
*verbDef
= (TexMacroDef
*)MacroDefs
.Get(_T("verb"));
1244 chunk
->def
= verbDef
;
1245 TexChunk
*arg
= new TexChunk(CHUNK_TYPE_ARG
, verbDef
);
1246 chunk
->children
.Append((wxObject
*)arg
);
1248 arg
->macroId
= chunk
->macroId
;
1250 // The value in the first argument.
1251 TexChunk
*argValue
= new TexChunk(CHUNK_TYPE_STRING
);
1252 arg
->children
.Append((wxObject
*)argValue
);
1254 argValue
->value
= val
;
1256 children
.Append((wxObject
*)chunk
);
1261 bool tmpParseToBrace
= true;
1262 TexMacroDef
*def
= MatchMacro(buffer
, &pos
, &env
, &tmpParseToBrace
);
1265 CustomMacro
*customMacro
= FindCustomMacro(def
->name
);
1267 TexChunk
*chunk
= new TexChunk(CHUNK_TYPE_MACRO
, def
);
1269 chunk
->no_args
= def
->no_args
;
1270 // chunk->name = copystring(def->name);
1271 chunk
->macroId
= def
->macroId
;
1274 children
.Append((wxObject
*)chunk
);
1276 // Eliminate newline after a \begin{} or a \\ if possible
1277 if ((env
|| wxStrcmp(def
->name
, _T("\\")) == 0) && (buffer
[pos
] == 13))
1280 if (buffer
[pos
] == 10)
1284 pos
= ParseMacroBody(def
->name
,
1285 chunk
, chunk
->no_args
,
1292 // If custom macro, parse the body substituting the above found args.
1295 if (customMacro
->macroBody
)
1297 wxChar macroBuf
[300];
1298 // wxStrcpy(macroBuf, _T("{"));
1299 wxStrcpy(macroBuf
, customMacro
->macroBody
);
1300 wxStrcat(macroBuf
, _T("}"));
1301 ParseArg(thisArg
, children
, macroBuf
, 0, NULL
, true, chunk
);
1304 // delete chunk; // Might delete children
1309 MacroError(buffer
+pos
);
1314 // Parse constructs like {\bf thing} as if they were
1319 if (buffer
[pos
] == _T('\\'))
1323 TexChunk
*chunk
= new TexChunk(CHUNK_TYPE_STRING
);
1324 BigBuffer
[buf_ptr
] = 0;
1326 chunk
->value
= copystring(BigBuffer
);
1327 children
.Append((wxObject
*)chunk
);
1332 bool tmpParseToBrace
;
1333 TexMacroDef
*def
= MatchMacro(buffer
, &pos
, &env
, &tmpParseToBrace
);
1336 CustomMacro
*customMacro
= FindCustomMacro(def
->name
);
1338 TexChunk
*chunk
= new TexChunk(CHUNK_TYPE_MACRO
, def
);
1339 chunk
->no_args
= def
->no_args
;
1340 // chunk->name = copystring(def->name);
1341 chunk
->macroId
= def
->macroId
;
1343 children
.Append((wxObject
*)chunk
);
1345 pos
= ParseMacroBody(def
->name
, chunk
, chunk
->no_args
,
1346 buffer
, pos
, NULL
, true, customMacroArgs
);
1348 // If custom macro, parse the body substituting the above found args.
1351 if (customMacro
->macroBody
)
1353 wxChar macroBuf
[300];
1354 // wxStrcpy(macroBuf, _T("{"));
1355 wxStrcpy(macroBuf
, customMacro
->macroBody
);
1356 wxStrcat(macroBuf
, _T("}"));
1357 ParseArg(thisArg
, children
, macroBuf
, 0, NULL
, true, chunk
);
1360 // delete chunk; // Might delete children
1365 MacroError(buffer
+pos
);
1371 * If all else fails, we assume that we have
1372 * a pair of braces on their own, so return a `dummy' macro
1373 * definition with just one argument to parse.
1377 SoloBlockDef
= new TexMacroDef(ltSOLO_BLOCK
, _T("solo block"), 1, false);
1382 TexChunk
*chunk1
= new TexChunk(CHUNK_TYPE_STRING
);
1383 BigBuffer
[buf_ptr
] = 0;
1385 chunk1
->value
= copystring(BigBuffer
);
1386 children
.Append((wxObject
*)chunk1
);
1388 TexChunk
*chunk
= new TexChunk(CHUNK_TYPE_MACRO
, SoloBlockDef
);
1389 chunk
->no_args
= SoloBlockDef
->no_args
;
1390 // chunk->name = copystring(SoloBlockDef->name);
1391 chunk
->macroId
= SoloBlockDef
->macroId
;
1392 children
.Append((wxObject
*)chunk
);
1394 TexChunk
*arg
= new TexChunk(CHUNK_TYPE_ARG
, SoloBlockDef
);
1396 chunk
->children
.Append((wxObject
*)arg
);
1397 // arg->name = copystring(SoloBlockDef->name);
1399 arg
->macroId
= chunk
->macroId
;
1401 pos
= ParseArg(arg
, arg
->children
, buffer
, pos
, NULL
, true, customMacroArgs
);
1409 TexChunk
*chunk
= new TexChunk(CHUNK_TYPE_STRING
);
1410 BigBuffer
[buf_ptr
] = 0;
1412 chunk
->value
= copystring(BigBuffer
);
1413 children
.Append((wxObject
*)chunk
);
1418 if (buffer
[pos
] == _T('$'))
1420 TexChunk
*chunk
= new TexChunk(CHUNK_TYPE_MACRO
);
1422 // chunk->name = copystring(_T("$$"));
1423 chunk
->macroId
= ltSPECIALDOUBLEDOLLAR
;
1424 children
.Append((wxObject
*)chunk
);
1429 TexChunk
*chunk
= new TexChunk(CHUNK_TYPE_MACRO
);
1431 // chunk->name = copystring(_T("_$"));
1432 chunk
->macroId
= ltSPECIALDOLLAR
;
1433 children
.Append((wxObject
*)chunk
);
1441 TexChunk
*chunk
= new TexChunk(CHUNK_TYPE_STRING
);
1442 BigBuffer
[buf_ptr
] = 0;
1444 chunk
->value
= copystring(BigBuffer
);
1445 children
.Append((wxObject
*)chunk
);
1449 TexChunk
*chunk
= new TexChunk(CHUNK_TYPE_MACRO
);
1451 // chunk->name = copystring(_T("_~"));
1452 chunk
->macroId
= ltSPECIALTILDE
;
1453 children
.Append((wxObject
*)chunk
);
1456 case _T('#'): // Either treat as a special TeX character or as a macro arg
1460 TexChunk
*chunk
= new TexChunk(CHUNK_TYPE_STRING
);
1461 BigBuffer
[buf_ptr
] = 0;
1463 chunk
->value
= copystring(BigBuffer
);
1464 children
.Append((wxObject
*)chunk
);
1468 if (!customMacroArgs
)
1470 TexChunk
*chunk
= new TexChunk(CHUNK_TYPE_MACRO
);
1472 // chunk->name = copystring(_T("_#"));
1473 chunk
->macroId
= ltSPECIALHASH
;
1474 children
.Append((wxObject
*)chunk
);
1478 if (isdigit(buffer
[pos
]))
1480 int n
= buffer
[pos
] - 48;
1482 wxNode
*node
= customMacroArgs
->children
.Item(n
-1);
1485 TexChunk
*argChunk
= (TexChunk
*)node
->GetData();
1486 children
.Append((wxObject
*)new TexChunk(*argChunk
));
1494 // Remove white space before and after the ampersand,
1495 // since this is probably a table column separator with
1496 // some convenient -- but useless -- white space in the text.
1497 while ((buf_ptr
> 0) && ((BigBuffer
[buf_ptr
-1] == _T(' ')) || (BigBuffer
[buf_ptr
-1] == 9)))
1502 TexChunk
*chunk
= new TexChunk(CHUNK_TYPE_STRING
);
1503 BigBuffer
[buf_ptr
] = 0;
1505 chunk
->value
= copystring(BigBuffer
);
1506 children
.Append((wxObject
*)chunk
);
1511 while (buffer
[pos
] == _T(' ') || buffer
[pos
] == 9)
1514 TexChunk
*chunk
= new TexChunk(CHUNK_TYPE_MACRO
);
1516 // chunk->name = copystring(_T("_&"));
1517 chunk
->macroId
= ltSPECIALAMPERSAND
;
1518 children
.Append((wxObject
*)chunk
);
1521 // Eliminate end-of-line comment
1525 while (wxCh
!= 10 && wxCh
!= 13 && wxCh
!= 0)
1530 if (buffer
[pos
] == 10 || buffer
[pos
] == 13)
1533 if (buffer
[pos
] == 10) pos
++; // Eliminate newline following DOS line feed
1540 BigBuffer
[buf_ptr
] = _T(' ');
1541 BigBuffer
[buf_ptr
+1] = 0;
1548 BigBuffer
[buf_ptr
] = wxCh
;
1549 BigBuffer
[buf_ptr
+1] = 0;
1560 * Consume as many arguments as the macro definition specifies
1564 int ParseMacroBody(const wxChar
*WXUNUSED(macro_name
), TexChunk
*parent
,
1565 int no_args
, wxChar
*buffer
, int pos
,
1566 wxChar
*environment
, bool parseToBrace
,
1567 TexChunk
*customMacroArgs
)
1570 if (stopRunning
) return pos
;
1572 // Check for a first optional argument
1573 if (buffer
[pos
] == ' ' && buffer
[pos
+1] == '[')
1575 // Fool following code into thinking that this is definitely
1576 // an optional first argument. (If a space before a non-first argument,
1577 // [ is interpreted as a [, not an optional argument.)
1583 if (buffer
[pos
] == '[')
1589 for (i
= 0; i
< no_args
; i
++)
1592 TexChunk
*arg
= new TexChunk(CHUNK_TYPE_ARG
, parent
->def
);
1594 parent
->children
.Append((wxObject
*)arg
);
1595 // arg->name = copystring(macro_name);
1596 arg
->argn
= maxArgs
;
1597 arg
->macroId
= parent
->macroId
;
1599 // To parse the first arg of a 2 arg \begin{thing}{arg} ... \end{thing}
1600 // have to fool parser into thinking this is a regular kind of block.
1602 if ((no_args
== 2) && (i
== 0))
1605 actualEnv
= environment
;
1607 bool isOptional
= false;
1609 // Remove the first { of the argument so it doesn't get recognized as { ... }
1610 // EatWhiteSpace(buffer, &pos);
1613 // The reason for these tests is to not consume braces that don't
1614 // belong to this macro.
1615 // E.g. {\bf {\small thing}}
1616 if ((pos
> 0) && (buffer
[pos
-1] != ' ') && buffer
[pos
] == '{')
1619 if ((pos
> 0) && (buffer
[pos
-1] != ' ') && (buffer
[pos
] == '['))
1624 else if ((pos
> 1) && (buffer
[pos
-1] != ' ') && (buffer
[pos
+1] == '['))
1632 wxString
tmpBuffer(buffer
);
1633 if (tmpBuffer
.length() > 4)
1635 if (tmpBuffer
.Right(4) == _T("\\par"))
1636 tmpBuffer
= tmpBuffer
.Mid(0,tmpBuffer
.length()-4);
1638 errBuf
.Printf(_T("Missing macro argument in the line:\n\t%s\n"),tmpBuffer
.c_str());
1639 OnError((wxChar
*)errBuf
.c_str());
1643 arg
->optional
= isOptional
;
1645 pos
= ParseArg(arg
, arg
->children
, buffer
, pos
, actualEnv
, parseToBrace
, customMacroArgs
);
1647 // If we've encountered an OPTIONAL argument, go another time around
1648 // the loop, because we've got more than we thought.
1649 // Hopefully optional args don't occur at the end of a macro use
1650 // or we might miss it.
1651 // Don't increment no of times round loop if the first optional arg
1652 // -- we already did it before the loop.
1653 if (arg
->optional
&& (i
> 0))
1656 parent
->no_args
= maxArgs
;
1658 // Tell each argument how many args there are (useful when processing an arg)
1659 wxNode
*node
= parent
->children
.GetFirst();
1662 TexChunk
*chunk
= (TexChunk
*)node
->GetData();
1663 chunk
->no_args
= maxArgs
;
1664 node
= node
->GetNext();
1669 bool TexLoadFile(const wxString
& filename
)
1671 static wxChar
*line_buffer
;
1672 stopRunning
= false;
1673 wxStrcpy(TexFileRoot
, filename
);
1674 StripExtension(TexFileRoot
);
1675 wxSnprintf(TexBibName
, 300, _T("%s.bb"), TexFileRoot
);
1676 wxSnprintf(TexTmpBibName
, 300, _T("%s.bb1"), TexFileRoot
);
1678 TexPathList
.EnsureFileAccessible(filename
);
1683 line_buffer
= new wxChar
[MAX_LINE_BUFFER_SIZE
];
1685 Inputs
[0] = wxFopen(filename
, _T("r"));
1687 FileNames
[0] = copystring(filename
);
1690 read_a_line(line_buffer
);
1691 ParseMacroBody(_T("toplevel"), TopLevel
, 1, line_buffer
, 0, NULL
, true);
1692 if (Inputs
[0]) fclose(Inputs
[0]);
1699 TexMacroDef::TexMacroDef(int the_id
, const wxChar
*the_name
, int n
, bool ig
, bool forbidLevel
)
1701 name
= copystring(the_name
);
1705 forbidden
= forbidLevel
;
1708 TexMacroDef::~TexMacroDef(void)
1710 if (name
) delete[] name
;
1713 TexChunk::TexChunk(int the_type
, TexMacroDef
*the_def
)
1725 TexChunk::TexChunk(TexChunk
& toCopy
)
1728 no_args
= toCopy
.no_args
;
1730 macroId
= toCopy
.macroId
;
1733 // name = copystring(toCopy.name);
1739 value
= copystring(toCopy
.value
);
1743 optional
= toCopy
.optional
;
1744 wxNode
*node
= toCopy
.children
.GetFirst();
1747 TexChunk
*child
= (TexChunk
*)node
->GetData();
1748 children
.Append((wxObject
*)new TexChunk(*child
));
1749 node
= node
->GetNext();
1753 TexChunk::~TexChunk(void)
1755 // if (name) delete[] name;
1756 if (value
) delete[] value
;
1757 wxNode
*node
= children
.GetFirst();
1760 TexChunk
*child
= (TexChunk
*)node
->GetData();
1762 wxNode
*next
= node
->GetNext();
1768 bool IsArgOptional(void) // Is this argument an optional argument?
1770 return isArgOptional
;
1773 int GetNoArgs(void) // Number of args for this macro
1778 /* Gets the text of a chunk on request (must be for small arguments
1783 void GetArgData1(TexChunk
*chunk
)
1785 switch (chunk
->type
)
1787 case CHUNK_TYPE_MACRO
:
1789 TexMacroDef
*def
= chunk
->def
;
1790 if (def
&& def
->ignore
)
1793 if (def
&& (wxStrcmp(def
->name
, _T("solo block")) != 0))
1795 wxStrcat(currentArgData
, _T("\\"));
1796 wxStrcat(currentArgData
, def
->name
);
1799 wxNode
*node
= chunk
->children
.GetFirst();
1802 TexChunk
*child_chunk
= (TexChunk
*)node
->GetData();
1803 wxStrcat(currentArgData
, _T("{"));
1804 GetArgData1(child_chunk
);
1805 wxStrcat(currentArgData
, _T("}"));
1806 node
= node
->GetNext();
1810 case CHUNK_TYPE_ARG
:
1812 wxNode
*node
= chunk
->children
.GetFirst();
1815 TexChunk
*child_chunk
= (TexChunk
*)node
->GetData();
1816 GetArgData1(child_chunk
);
1817 node
= node
->GetNext();
1821 case CHUNK_TYPE_STRING
:
1824 wxStrcat(currentArgData
, chunk
->value
);
1830 wxChar
*GetArgData(TexChunk
*WXUNUSED(chunk
))
1832 currentArgData
[0] = 0;
1833 GetArgData1(currentArgument
);
1834 haveArgData
= false;
1835 return currentArgData
;
1838 wxChar
*GetArgData(void)
1842 currentArgData
[0] = 0;
1843 GetArgData1(currentArgument
);
1845 return currentArgData
;
1848 TexChunk
*GetArgChunk(void)
1850 return currentArgument
;
1853 TexChunk
*GetNextChunk(void) // Look ahead to the next chunk
1858 TexChunk
*GetTopLevelChunk(void)
1863 int GetCurrentColumn(void)
1865 return currentColumn
;
1869 * Traverses document calling functions to allow the client to
1870 * write out the appropriate stuff
1874 void TraverseFromChunk(TexChunk
*chunk
, wxNode
*thisNode
, bool childrenOnly
)
1877 if (stopRunning
) return;
1879 switch (chunk
->type
)
1881 case CHUNK_TYPE_MACRO
:
1883 TexMacroDef
*def
= chunk
->def
;
1884 if (def
&& def
->ignore
)
1888 OnMacro(chunk
->macroId
, chunk
->no_args
, true);
1890 wxNode
*node
= chunk
->children
.GetFirst();
1893 TexChunk
*child_chunk
= (TexChunk
*)node
->GetData();
1894 TraverseFromChunk(child_chunk
, node
);
1895 node
= node
->GetNext();
1898 if (thisNode
&& thisNode
->GetNext())
1899 nextChunk
= (TexChunk
*)thisNode
->GetNext()->GetData();
1902 OnMacro(chunk
->macroId
, chunk
->no_args
, false);
1905 case CHUNK_TYPE_ARG
:
1907 currentArgument
= chunk
;
1909 isArgOptional
= chunk
->optional
;
1910 noArgs
= chunk
->no_args
;
1912 // If OnArgument returns false, don't output.
1914 if (childrenOnly
|| OnArgument(chunk
->macroId
, chunk
->argn
, true))
1916 wxNode
*node
= chunk
->children
.GetFirst();
1919 TexChunk
*child_chunk
= (TexChunk
*)node
->GetData();
1920 TraverseFromChunk(child_chunk
, node
);
1921 node
= node
->GetNext();
1925 currentArgument
= chunk
;
1927 if (thisNode
&& thisNode
->GetNext())
1928 nextChunk
= (TexChunk
*)thisNode
->GetNext()->GetData();
1930 isArgOptional
= chunk
->optional
;
1931 noArgs
= chunk
->no_args
;
1934 (void)OnArgument(chunk
->macroId
, chunk
->argn
, false);
1937 case CHUNK_TYPE_STRING
:
1939 extern int issuedNewParagraph
;
1940 extern int forbidResetPar
;
1941 if (chunk
->value
&& (forbidResetPar
== 0))
1943 // If non-whitespace text, we no longer have a new paragraph.
1944 if (issuedNewParagraph
&& !((chunk
->value
[0] == 10 || chunk
->value
[0] == 13 || chunk
->value
[0] == 32)
1945 && chunk
->value
[1] == 0))
1947 issuedNewParagraph
= false;
1949 TexOutput(chunk
->value
, true);
1956 void TraverseDocument(void)
1958 TraverseFromChunk(TopLevel
, NULL
);
1961 void SetCurrentOutput(FILE *fd
)
1963 CurrentOutput1
= fd
;
1964 CurrentOutput2
= NULL
;
1967 void SetCurrentOutputs(FILE *fd1
, FILE *fd2
)
1969 CurrentOutput1
= fd1
;
1970 CurrentOutput2
= fd2
;
1973 void AddMacroDef(int the_id
, const wxChar
*name
, int n
, bool ignore
, bool forbid
)
1975 MacroDefs
.Put(name
, new TexMacroDef(the_id
, name
, n
, ignore
, forbid
));
1978 void TexInitialize(int bufSize
)
1980 InitialiseColourTable();
1982 TexPathList
.AddEnvList(_T("TEXINPUT"));
1985 TexPathList
.AddEnvList(_T("TEXINPUTS"));
1988 for (i
= 0; i
< 15; i
++)
1992 FileNames
[i
] = NULL
;
1995 IgnorableInputFiles
.Add(_T("psbox.tex"));
1996 BigBuffer
= new wxChar
[(bufSize
*1000)];
1997 currentArgData
= new wxChar
[2000];
1998 TexFileRoot
= new wxChar
[300];
1999 TexBibName
= new wxChar
[300];
2000 TexTmpBibName
= new wxChar
[300];
2001 AddMacroDef(ltTOPLEVEL
, _T("toplevel"), 1);
2002 TopLevel
= new TexChunk(CHUNK_TYPE_MACRO
);
2003 // TopLevel->name = copystring(_T("toplevel"));
2004 TopLevel
->macroId
= ltTOPLEVEL
;
2005 TopLevel
->no_args
= 1;
2006 VerbatimMacroDef
= (TexMacroDef
*)MacroDefs
.Get(_T("verbatim"));
2009 void TexCleanUp(void)
2012 for (i
= 0; i
< 15; i
++)
2018 subsubsectionNo
= 0;
2021 CurrentOutput1
= NULL
;
2022 CurrentOutput2
= NULL
;
2023 CurrentInputIndex
= 0;
2024 haveArgData
= false;
2029 TopLevel
= new TexChunk(CHUNK_TYPE_MACRO
);
2030 // TopLevel->name = copystring(_T("toplevel"));
2031 TopLevel
->macroId
= ltTOPLEVEL
;
2032 TopLevel
->no_args
= 1;
2034 DocumentTitle
= NULL
;
2035 DocumentAuthor
= NULL
;
2036 DocumentDate
= NULL
;
2037 DocumentStyle
= LATEX_REPORT
;
2038 MinorDocumentStyle
= 0;
2039 BibliographyStyleString
= copystring(_T("plain"));
2040 DocumentStyleString
= copystring(_T("report"));
2041 MinorDocumentStyleString
= NULL
;
2043 // gt - Changed this so if this is the final pass
2044 // then we DO want to remove these macros, so that
2045 // memory is not MASSIVELY leaked if the user
2046 // does not exit the program, but instead runs
2047 // the program again
2048 if ((passNumber
== 1 && !runTwice
) ||
2049 (passNumber
== 2 && runTwice
))
2051 /* Don't want to remove custom macros after each pass.*/
2053 wxNode
*node
= CustomMacroList
.GetFirst();
2056 CustomMacro
*macro
= (CustomMacro
*)node
->GetData();
2059 node
= CustomMacroList
.GetFirst();
2063 TexReferences
.BeginFind();
2064 wxHashTable::Node
*refNode
= TexReferences
.Next();
2067 TexRef
*ref
= (TexRef
*)refNode
->GetData();
2069 refNode
= TexReferences
.Next();
2071 TexReferences
.Clear();
2073 wxNode
* bibNode
= BibList
.GetFirst();
2076 BibEntry
*entry
= (BibEntry
*)bibNode
->GetData();
2079 bibNode
= BibList
.GetFirst();
2081 CitationList
.Clear();
2082 ResetTopicCounter();
2085 // There is likely to be one set of macros used by all utilities.
2086 void DefineDefaultMacros(void)
2088 // Put names which subsume other names at the TOP
2089 // so they get recognized first
2091 AddMacroDef(ltACCENT_GRAVE
, _T("`"), 1);
2092 AddMacroDef(ltACCENT_ACUTE
, _T("'"), 1);
2093 AddMacroDef(ltACCENT_CARET
, _T("^"), 1);
2094 AddMacroDef(ltACCENT_UMLAUT
, _T("\""), 1);
2095 AddMacroDef(ltACCENT_TILDE
, _T("~"), 1);
2096 AddMacroDef(ltACCENT_DOT
, _T("."), 1);
2097 AddMacroDef(ltACCENT_CADILLA
, _T("c"), 1);
2098 AddMacroDef(ltSMALLSPACE1
, _T(","), 0);
2099 AddMacroDef(ltSMALLSPACE2
, _T(";"), 0);
2101 AddMacroDef(ltABSTRACT
, _T("abstract"), 1);
2102 AddMacroDef(ltADDCONTENTSLINE
, _T("addcontentsline"), 3);
2103 AddMacroDef(ltADDTOCOUNTER
, _T("addtocounter"), 2);
2104 AddMacroDef(ltALEPH
, _T("aleph"), 0);
2105 AddMacroDef(ltALPHA
, _T("alpha"), 0);
2106 AddMacroDef(ltALPH1
, _T("alph"), 1);
2107 AddMacroDef(ltALPH2
, _T("Alph"), 1);
2108 AddMacroDef(ltANGLE
, _T("angle"), 0);
2109 AddMacroDef(ltAPPENDIX
, _T("appendix"), 0);
2110 AddMacroDef(ltAPPROX
, _T("approx"), 0);
2111 AddMacroDef(ltARABIC
, _T("arabic"), 1);
2112 AddMacroDef(ltARRAY
, _T("array"), 1);
2113 AddMacroDef(ltAST
, _T("ast"), 0);
2114 AddMacroDef(ltASYMP
, _T("asymp"), 0);
2115 AddMacroDef(ltAUTHOR
, _T("author"), 1);
2117 AddMacroDef(ltBACKGROUNDCOLOUR
, _T("backgroundcolour"), 1);
2118 AddMacroDef(ltBACKGROUNDIMAGE
, _T("backgroundimage"), 1);
2119 AddMacroDef(ltBACKGROUND
, _T("background"), 1);
2120 AddMacroDef(ltBACKSLASHRAW
, _T("backslashraw"), 0);
2121 AddMacroDef(ltBACKSLASH
, _T("backslash"), 0);
2122 AddMacroDef(ltBASELINESKIP
, _T("baselineskip"), 1);
2123 AddMacroDef(ltBCOL
, _T("bcol"), 2);
2124 AddMacroDef(ltBETA
, _T("beta"), 0);
2125 AddMacroDef(ltBFSERIES
, _T("bfseries"), 1);
2126 AddMacroDef(ltBF
, _T("bf"), 1);
2127 AddMacroDef(ltBIBITEM
, _T("bibitem"), 2);
2128 // For convenience, bibitem has 2 args: label and item.
2129 // The Latex syntax permits writing as 2 args.
2130 AddMacroDef(ltBIBLIOGRAPHYSTYLE
, _T("bibliographystyle"), 1);
2131 AddMacroDef(ltBIBLIOGRAPHY
, _T("bibliography"), 1);
2132 AddMacroDef(ltBIGTRIANGLEDOWN
, _T("bigtriangledown"), 0);
2133 AddMacroDef(ltBOT
, _T("bot"), 0);
2134 AddMacroDef(ltBOXIT
, _T("boxit"), 1);
2135 AddMacroDef(ltBOX
, _T("box"), 0);
2136 AddMacroDef(ltBRCLEAR
, _T("brclear"), 0);
2137 AddMacroDef(ltBULLET
, _T("bullet"), 0);
2139 AddMacroDef(ltCAPTIONSTAR
, _T("caption*"), 1);
2140 AddMacroDef(ltCAPTION
, _T("caption"), 1);
2141 AddMacroDef(ltCAP
, _T("cap"), 0);
2142 AddMacroDef(ltCDOTS
, _T("cdots"), 0);
2143 AddMacroDef(ltCDOT
, _T("cdot"), 0);
2144 AddMacroDef(ltCENTERLINE
, _T("centerline"), 1);
2145 AddMacroDef(ltCENTERING
, _T("centering"), 0);
2146 AddMacroDef(ltCENTER
, _T("center"), 1);
2147 AddMacroDef(ltCEXTRACT
, _T("cextract"), 0);
2148 AddMacroDef(ltCHAPTERHEADING
, _T("chapterheading"), 1);
2149 AddMacroDef(ltCHAPTERSTAR
, _T("chapter*"), 1);
2150 AddMacroDef(ltCHAPTER
, _T("chapter"), 1);
2151 AddMacroDef(ltCHI
, _T("chi"), 0);
2152 AddMacroDef(ltCINSERT
, _T("cinsert"), 0);
2153 AddMacroDef(ltCIRC
, _T("circ"), 0);
2154 AddMacroDef(ltCITE
, _T("cite"), 1);
2155 AddMacroDef(ltCLASS
, _T("class"), 1);
2156 AddMacroDef(ltCLEARDOUBLEPAGE
, _T("cleardoublepage"), 0);
2157 AddMacroDef(ltCLEARPAGE
, _T("clearpage"), 0);
2158 AddMacroDef(ltCLINE
, _T("cline"), 1);
2159 AddMacroDef(ltCLIPSFUNC
, _T("clipsfunc"), 3);
2160 AddMacroDef(ltCLUBSUIT
, _T("clubsuit"), 0);
2161 AddMacroDef(ltCOLUMNSEP
, _T("columnsep"), 1);
2162 AddMacroDef(ltCOMMENT
, _T("comment"), 1, true);
2163 AddMacroDef(ltCONG
, _T("cong"), 0);
2164 AddMacroDef(ltCOPYRIGHT
, _T("copyright"), 0);
2165 AddMacroDef(ltCPARAM
, _T("cparam"), 2);
2166 AddMacroDef(ltCHEAD
, _T("chead"), 1);
2167 AddMacroDef(ltCFOOT
, _T("cfoot"), 1);
2168 AddMacroDef(ltCUP
, _T("cup"), 0);
2170 AddMacroDef(ltDASHV
, _T("dashv"), 0);
2171 AddMacroDef(ltDATE
, _T("date"), 1);
2172 AddMacroDef(ltDELTA
, _T("delta"), 0);
2173 AddMacroDef(ltCAP_DELTA
, _T("Delta"), 0);
2174 AddMacroDef(ltDEFINECOLOUR
, _T("definecolour"), 4);
2175 AddMacroDef(ltDEFINECOLOR
, _T("definecolor"), 4);
2176 AddMacroDef(ltDESCRIPTION
, _T("description"), 1);
2177 AddMacroDef(ltDESTRUCT
, _T("destruct"), 1);
2178 AddMacroDef(ltDIAMOND2
, _T("diamond2"), 0);
2179 AddMacroDef(ltDIAMOND
, _T("diamond"), 0);
2180 AddMacroDef(ltDIV
, _T("div"), 0);
2181 AddMacroDef(ltDOCUMENTCLASS
, _T("documentclass"), 1);
2182 AddMacroDef(ltDOCUMENTSTYLE
, _T("documentstyle"), 1);
2183 AddMacroDef(ltDOCUMENT
, _T("document"), 1);
2184 AddMacroDef(ltDOUBLESPACE
, _T("doublespace"), 1);
2185 AddMacroDef(ltDOTEQ
, _T("doteq"), 0);
2186 AddMacroDef(ltDOWNARROW
, _T("downarrow"), 0);
2187 AddMacroDef(ltDOWNARROW2
, _T("Downarrow"), 0);
2189 AddMacroDef(ltEMPTYSET
, _T("emptyset"), 0);
2190 AddMacroDef(ltEMPH
, _T("emph"), 1);
2191 AddMacroDef(ltEM
, _T("em"), 1);
2192 AddMacroDef(ltENUMERATE
, _T("enumerate"), 1);
2193 AddMacroDef(ltEPSILON
, _T("epsilon"), 0);
2194 AddMacroDef(ltEQUATION
, _T("equation"), 1);
2195 AddMacroDef(ltEQUIV
, _T("equiv"), 0);
2196 AddMacroDef(ltETA
, _T("eta"), 0);
2197 AddMacroDef(ltEVENSIDEMARGIN
, _T("evensidemargin"), 1);
2198 AddMacroDef(ltEXISTS
, _T("exists"), 0);
2200 AddMacroDef(ltFBOX
, _T("fbox"), 1);
2201 AddMacroDef(ltFCOL
, _T("fcol"), 2);
2202 AddMacroDef(ltFIGURE
, _T("figure"), 1);
2203 AddMacroDef(ltFIGURESTAR
, _T("figure*"), 1);
2204 AddMacroDef(ltFLUSHLEFT
, _T("flushleft"), 1);
2205 AddMacroDef(ltFLUSHRIGHT
, _T("flushright"), 1);
2206 AddMacroDef(ltFOLLOWEDLINKCOLOUR
, _T("followedlinkcolour"), 1);
2207 AddMacroDef(ltFOOTHEIGHT
, _T("footheight"), 1);
2208 AddMacroDef(ltFOOTNOTEPOPUP
, _T("footnotepopup"), 2);
2209 AddMacroDef(ltFOOTNOTE
, _T("footnote"), 1);
2210 AddMacroDef(ltFOOTSKIP
, _T("footskip"), 1);
2211 AddMacroDef(ltFORALL
, _T("forall"), 0);
2212 AddMacroDef(ltFRAMEBOX
, _T("framebox"), 1);
2213 AddMacroDef(ltFROWN
, _T("frown"), 0);
2214 AddMacroDef(ltFUNCTIONSECTION
, _T("functionsection"), 1);
2215 AddMacroDef(ltFUNC
, _T("func"), 3);
2216 AddMacroDef(ltFOOTNOTESIZE
, _T("footnotesize"), 0);
2217 AddMacroDef(ltFANCYPLAIN
, _T("fancyplain"), 2);
2219 AddMacroDef(ltGAMMA
, _T("gamma"), 0);
2220 AddMacroDef(ltCAP_GAMMA
, _T("Gamma"), 0);
2221 AddMacroDef(ltGEQ
, _T("geq"), 0);
2222 AddMacroDef(ltGE
, _T("ge"), 0);
2223 AddMacroDef(ltGG
, _T("gg"), 0);
2224 AddMacroDef(ltGLOSSARY
, _T("glossary"), 1);
2225 AddMacroDef(ltGLOSS
, _T("gloss"), 1);
2227 AddMacroDef(ltHEADHEIGHT
, _T("headheight"), 1);
2228 AddMacroDef(ltHEARTSUIT
, _T("heartsuit"), 0);
2229 AddMacroDef(ltHELPGLOSSARY
, _T("helpglossary"), 1);
2230 AddMacroDef(ltHELPIGNORE
, _T("helpignore"), 1, true);
2231 AddMacroDef(ltHELPONLY
, _T("helponly"), 1);
2232 AddMacroDef(ltHELPINPUT
, _T("helpinput"), 1);
2233 AddMacroDef(ltHELPFONTFAMILY
, _T("helpfontfamily"), 1);
2234 AddMacroDef(ltHELPFONTSIZE
, _T("helpfontsize"), 1);
2235 AddMacroDef(ltHELPREFN
, _T("helprefn"), 2);
2236 AddMacroDef(ltHELPREF
, _T("helpref"), 2);
2237 AddMacroDef(ltHFILL
, _T("hfill"), 0);
2238 AddMacroDef(ltHLINE
, _T("hline"), 0);
2239 AddMacroDef(ltHRULE
, _T("hrule"), 0);
2240 AddMacroDef(ltHSPACESTAR
, _T("hspace*"), 1);
2241 AddMacroDef(ltHSPACE
, _T("hspace"), 1);
2242 AddMacroDef(ltHSKIPSTAR
, _T("hskip*"), 1);
2243 AddMacroDef(ltHSKIP
, _T("hskip"), 1);
2244 AddMacroDef(lthuge
, _T("huge"), 1);
2245 AddMacroDef(ltHuge
, _T("Huge"), 1);
2246 AddMacroDef(ltHUGE
, _T("HUGE"), 1);
2247 AddMacroDef(ltHTMLIGNORE
, _T("htmlignore"), 1);
2248 AddMacroDef(ltHTMLONLY
, _T("htmlonly"), 1);
2250 AddMacroDef(ltIM
, _T("im"), 0);
2251 AddMacroDef(ltINCLUDEONLY
, _T("includeonly"), 1);
2252 AddMacroDef(ltINCLUDE
, _T("include"), 1);
2253 AddMacroDef(ltINDENTED
, _T("indented"), 2);
2254 AddMacroDef(ltINDEX
, _T("index"), 1);
2255 AddMacroDef(ltINPUT
, _T("input"), 1, true);
2256 AddMacroDef(ltIOTA
, _T("iota"), 0);
2257 AddMacroDef(ltITEMIZE
, _T("itemize"), 1);
2258 AddMacroDef(ltITEM
, _T("item"), 0);
2259 AddMacroDef(ltIMAGEMAP
, _T("imagemap"), 3);
2260 AddMacroDef(ltIMAGEL
, _T("imagel"), 2);
2261 AddMacroDef(ltIMAGER
, _T("imager"), 2);
2262 AddMacroDef(ltIMAGE
, _T("image"), 2);
2263 AddMacroDef(ltIN
, _T("in"), 0);
2264 AddMacroDef(ltINFTY
, _T("infty"), 0);
2265 AddMacroDef(ltITSHAPE
, _T("itshape"), 1);
2266 AddMacroDef(ltIT
, _T("it"), 1);
2267 AddMacroDef(ltITEMSEP
, _T("itemsep"), 1);
2268 AddMacroDef(ltINSERTATLEVEL
, _T("insertatlevel"), 2);
2270 AddMacroDef(ltKAPPA
, _T("kappa"), 0);
2271 AddMacroDef(ltKILL
, _T("kill"), 0);
2273 AddMacroDef(ltLABEL
, _T("label"), 1);
2274 AddMacroDef(ltLAMBDA
, _T("lambda"), 0);
2275 AddMacroDef(ltCAP_LAMBDA
, _T("Lambda"), 0);
2276 AddMacroDef(ltlarge
, _T("large"), 1);
2277 AddMacroDef(ltLarge
, _T("Large"), 1);
2278 AddMacroDef(ltLARGE
, _T("LARGE"), 1);
2279 AddMacroDef(ltLATEXIGNORE
, _T("latexignore"), 1);
2280 AddMacroDef(ltLATEXONLY
, _T("latexonly"), 1);
2281 AddMacroDef(ltLATEX
, _T("LaTeX"), 0);
2282 AddMacroDef(ltLBOX
, _T("lbox"), 1);
2283 AddMacroDef(ltLBRACERAW
, _T("lbraceraw"), 0);
2284 AddMacroDef(ltLDOTS
, _T("ldots"), 0);
2285 AddMacroDef(ltLEQ
, _T("leq"), 0);
2286 AddMacroDef(ltLE
, _T("le"), 0);
2287 AddMacroDef(ltLEFTARROW
, _T("leftarrow"), 0);
2288 AddMacroDef(ltLEFTRIGHTARROW
, _T("leftrightarrow"), 0);
2289 AddMacroDef(ltLEFTARROW2
, _T("Leftarrow"), 0);
2290 AddMacroDef(ltLEFTRIGHTARROW2
, _T("Leftrightarrow"), 0);
2291 AddMacroDef(ltLINEBREAK
, _T("linebreak"), 0);
2292 AddMacroDef(ltLINKCOLOUR
, _T("linkcolour"), 1);
2293 AddMacroDef(ltLISTOFFIGURES
, _T("listoffigures"), 0);
2294 AddMacroDef(ltLISTOFTABLES
, _T("listoftables"), 0);
2295 AddMacroDef(ltLHEAD
, _T("lhead"), 1);
2296 AddMacroDef(ltLFOOT
, _T("lfoot"), 1);
2297 AddMacroDef(ltLOWERCASE
, _T("lowercase"), 1);
2298 AddMacroDef(ltLL
, _T("ll"), 0);
2300 AddMacroDef(ltMAKEGLOSSARY
, _T("makeglossary"), 0);
2301 AddMacroDef(ltMAKEINDEX
, _T("makeindex"), 0);
2302 AddMacroDef(ltMAKETITLE
, _T("maketitle"), 0);
2303 AddMacroDef(ltMARKRIGHT
, _T("markright"), 1);
2304 AddMacroDef(ltMARKBOTH
, _T("markboth"), 2);
2305 AddMacroDef(ltMARGINPARWIDTH
, _T("marginparwidth"), 1);
2306 AddMacroDef(ltMARGINPARSEP
, _T("marginparsep"), 1);
2307 AddMacroDef(ltMARGINPARODD
, _T("marginparodd"), 1);
2308 AddMacroDef(ltMARGINPAREVEN
, _T("marginpareven"), 1);
2309 AddMacroDef(ltMARGINPAR
, _T("marginpar"), 1);
2310 AddMacroDef(ltMBOX
, _T("mbox"), 1);
2311 AddMacroDef(ltMDSERIES
, _T("mdseries"), 1);
2312 AddMacroDef(ltMEMBERSECTION
, _T("membersection"), 1);
2313 AddMacroDef(ltMEMBER
, _T("member"), 2);
2314 AddMacroDef(ltMID
, _T("mid"), 0);
2315 AddMacroDef(ltMODELS
, _T("models"), 0);
2316 AddMacroDef(ltMP
, _T("mp"), 0);
2317 AddMacroDef(ltMULTICOLUMN
, _T("multicolumn"), 3);
2318 AddMacroDef(ltMU
, _T("mu"), 0);
2320 AddMacroDef(ltNABLA
, _T("nabla"), 0);
2321 AddMacroDef(ltNEG
, _T("neg"), 0);
2322 AddMacroDef(ltNEQ
, _T("neq"), 0);
2323 AddMacroDef(ltNEWCOUNTER
, _T("newcounter"), 1, false, (bool)FORBID_ABSOLUTELY
);
2324 AddMacroDef(ltNEWLINE
, _T("newline"), 0);
2325 AddMacroDef(ltNEWPAGE
, _T("newpage"), 0);
2326 AddMacroDef(ltNI
, _T("ni"), 0);
2327 AddMacroDef(ltNOCITE
, _T("nocite"), 1);
2328 AddMacroDef(ltNOINDENT
, _T("noindent"), 0);
2329 AddMacroDef(ltNOLINEBREAK
, _T("nolinebreak"), 0);
2330 AddMacroDef(ltNOPAGEBREAK
, _T("nopagebreak"), 0);
2331 AddMacroDef(ltNORMALSIZE
, _T("normalsize"), 1);
2332 AddMacroDef(ltNORMALBOX
, _T("normalbox"), 1);
2333 AddMacroDef(ltNORMALBOXD
, _T("normalboxd"), 1);
2334 AddMacroDef(ltNOTEQ
, _T("noteq"), 0);
2335 AddMacroDef(ltNOTIN
, _T("notin"), 0);
2336 AddMacroDef(ltNOTSUBSET
, _T("notsubset"), 0);
2337 AddMacroDef(ltNU
, _T("nu"), 0);
2339 AddMacroDef(ltODDSIDEMARGIN
, _T("oddsidemargin"), 1);
2340 AddMacroDef(ltOMEGA
, _T("omega"), 0);
2341 AddMacroDef(ltCAP_OMEGA
, _T("Omega"), 0);
2342 AddMacroDef(ltONECOLUMN
, _T("onecolumn"), 0);
2343 AddMacroDef(ltOPLUS
, _T("oplus"), 0);
2344 AddMacroDef(ltOSLASH
, _T("oslash"), 0);
2345 AddMacroDef(ltOTIMES
, _T("otimes"), 0);
2347 AddMacroDef(ltPAGEBREAK
, _T("pagebreak"), 0);
2348 AddMacroDef(ltPAGEREF
, _T("pageref"), 1);
2349 AddMacroDef(ltPAGESTYLE
, _T("pagestyle"), 1);
2350 AddMacroDef(ltPAGENUMBERING
, _T("pagenumbering"), 1);
2351 AddMacroDef(ltPARAGRAPHSTAR
, _T("paragraph*"), 1);
2352 AddMacroDef(ltPARAGRAPH
, _T("paragraph"), 1);
2353 AddMacroDef(ltPARALLEL
, _T("parallel"), 0);
2354 AddMacroDef(ltPARAM
, _T("param"), 2);
2355 AddMacroDef(ltPARINDENT
, _T("parindent"), 1);
2356 AddMacroDef(ltPARSKIP
, _T("parskip"), 1);
2357 AddMacroDef(ltPARTIAL
, _T("partial"), 0);
2358 AddMacroDef(ltPARTSTAR
, _T("part*"), 1);
2359 AddMacroDef(ltPART
, _T("part"), 1);
2360 AddMacroDef(ltPAR
, _T("par"), 0);
2361 AddMacroDef(ltPERP
, _T("perp"), 0);
2362 AddMacroDef(ltPHI
, _T("phi"), 0);
2363 AddMacroDef(ltCAP_PHI
, _T("Phi"), 0);
2364 AddMacroDef(ltPFUNC
, _T("pfunc"), 3);
2365 AddMacroDef(ltPICTURE
, _T("picture"), 1);
2366 AddMacroDef(ltPI
, _T("pi"), 0);
2367 AddMacroDef(ltCAP_PI
, _T("Pi"), 0);
2368 AddMacroDef(ltPM
, _T("pm"), 0);
2369 AddMacroDef(ltPOPREFONLY
, _T("poprefonly"), 1);
2370 AddMacroDef(ltPOPREF
, _T("popref"), 2);
2371 AddMacroDef(ltPOUNDS
, _T("pounds"), 0);
2372 AddMacroDef(ltPREC
, _T("prec"), 0);
2373 AddMacroDef(ltPRECEQ
, _T("preceq"), 0);
2374 AddMacroDef(ltPRINTINDEX
, _T("printindex"), 0);
2375 AddMacroDef(ltPROPTO
, _T("propto"), 0);
2376 AddMacroDef(ltPSBOXTO
, _T("psboxto"), 1, false, (bool)FORBID_ABSOLUTELY
);
2377 AddMacroDef(ltPSBOX
, _T("psbox"), 1, false, (bool)FORBID_ABSOLUTELY
);
2378 AddMacroDef(ltPSI
, _T("psi"), 0);
2379 AddMacroDef(ltCAP_PSI
, _T("Psi"), 0);
2381 AddMacroDef(ltQUOTE
, _T("quote"), 1);
2382 AddMacroDef(ltQUOTATION
, _T("quotation"), 1);
2384 AddMacroDef(ltRAGGEDBOTTOM
, _T("raggedbottom"), 0);
2385 AddMacroDef(ltRAGGEDLEFT
, _T("raggedleft"), 0);
2386 AddMacroDef(ltRAGGEDRIGHT
, _T("raggedright"), 0);
2387 AddMacroDef(ltRBRACERAW
, _T("rbraceraw"), 0);
2388 AddMacroDef(ltREF
, _T("ref"), 1);
2389 AddMacroDef(ltREGISTERED
, _T("registered"), 0);
2390 AddMacroDef(ltRE
, _T("we"), 0);
2391 AddMacroDef(ltRHO
, _T("rho"), 0);
2392 AddMacroDef(ltRIGHTARROW
, _T("rightarrow"), 0);
2393 AddMacroDef(ltRIGHTARROW2
, _T("rightarrow2"), 0);
2394 AddMacroDef(ltRMFAMILY
, _T("rmfamily"), 1);
2395 AddMacroDef(ltRM
, _T("rm"), 1);
2396 AddMacroDef(ltROMAN
, _T("roman"), 1);
2397 AddMacroDef(ltROMAN2
, _T("Roman"), 1);
2398 // AddMacroDef(lt"row", 1);
2399 AddMacroDef(ltRTFSP
, _T("rtfsp"), 0);
2400 AddMacroDef(ltRTFIGNORE
, _T("rtfignore"), 1);
2401 AddMacroDef(ltRTFONLY
, _T("rtfonly"), 1);
2402 AddMacroDef(ltRULEDROW
, _T("ruledrow"), 1);
2403 AddMacroDef(ltDRULED
, _T("druled"), 1);
2404 AddMacroDef(ltRULE
, _T("rule"), 2);
2405 AddMacroDef(ltRHEAD
, _T("rhead"), 1);
2406 AddMacroDef(ltRFOOT
, _T("rfoot"), 1);
2407 AddMacroDef(ltROW
, _T("row"), 1);
2409 AddMacroDef(ltSCSHAPE
, _T("scshape"), 1);
2410 AddMacroDef(ltSC
, _T("sc"), 1);
2411 AddMacroDef(ltSECTIONHEADING
, _T("sectionheading"), 1);
2412 AddMacroDef(ltSECTIONSTAR
, _T("section*"), 1);
2413 AddMacroDef(ltSECTION
, _T("section"), 1);
2414 AddMacroDef(ltSETCOUNTER
, _T("setcounter"), 2);
2415 AddMacroDef(ltSFFAMILY
, _T("sffamily"), 1);
2416 AddMacroDef(ltSF
, _T("sf"), 1);
2417 AddMacroDef(ltSHARP
, _T("sharp"), 0);
2418 AddMacroDef(ltSHORTCITE
, _T("shortcite"), 1);
2419 AddMacroDef(ltSIGMA
, _T("sigma"), 0);
2420 AddMacroDef(ltCAP_SIGMA
, _T("Sigma"), 0);
2421 AddMacroDef(ltSIM
, _T("sim"), 0);
2422 AddMacroDef(ltSIMEQ
, _T("simeq"), 0);
2423 AddMacroDef(ltSINGLESPACE
, _T("singlespace"), 1);
2424 AddMacroDef(ltSIZEDBOX
, _T("sizedbox"), 2);
2425 AddMacroDef(ltSIZEDBOXD
, _T("sizedboxd"), 2);
2426 AddMacroDef(ltSLOPPYPAR
, _T("sloppypar"), 1);
2427 AddMacroDef(ltSLOPPY
, _T("sloppy"), 0);
2428 AddMacroDef(ltSLSHAPE
, _T("slshape"), 1);
2429 AddMacroDef(ltSL
, _T("sl"), 1);
2430 AddMacroDef(ltSMALL
, _T("small"), 1);
2431 AddMacroDef(ltSMILE
, _T("smile"), 0);
2432 AddMacroDef(ltSS
, _T("ss"), 0);
2433 AddMacroDef(ltSTAR
, _T("star"), 0);
2434 AddMacroDef(ltSUBITEM
, _T("subitem"), 0);
2435 AddMacroDef(ltSUBPARAGRAPHSTAR
, _T("subparagraph*"), 1);
2436 AddMacroDef(ltSUBPARAGRAPH
, _T("subparagraph"), 1);
2437 AddMacroDef(ltSPECIAL
, _T("special"), 1);
2438 AddMacroDef(ltSUBSECTIONSTAR
, _T("subsection*"), 1);
2439 AddMacroDef(ltSUBSECTION
, _T("subsection"), 1);
2440 AddMacroDef(ltSUBSETEQ
, _T("subseteq"), 0);
2441 AddMacroDef(ltSUBSET
, _T("subset"), 0);
2442 AddMacroDef(ltSUCC
, _T("succ"), 0);
2443 AddMacroDef(ltSUCCEQ
, _T("succeq"), 0);
2444 AddMacroDef(ltSUPSETEQ
, _T("supseteq"), 0);
2445 AddMacroDef(ltSUPSET
, _T("supset"), 0);
2446 AddMacroDef(ltSUBSUBSECTIONSTAR
, _T("subsubsection*"), 1);
2447 AddMacroDef(ltSUBSUBSECTION
, _T("subsubsection"), 1);
2448 AddMacroDef(ltSUPERTABULAR
, _T("supertabular"), 2, false);
2449 AddMacroDef(ltSURD
, _T("surd"), 0);
2450 AddMacroDef(ltSCRIPTSIZE
, _T("scriptsize"), 1);
2451 AddMacroDef(ltSETHEADER
, _T("setheader"), 6);
2452 AddMacroDef(ltSETFOOTER
, _T("setfooter"), 6);
2453 AddMacroDef(ltSETHOTSPOTCOLOUR
, _T("sethotspotcolour"), 1);
2454 AddMacroDef(ltSETHOTSPOTCOLOR
, _T("sethotspotcolor"), 1);
2455 AddMacroDef(ltSETHOTSPOTUNDERLINE
, _T("sethotspotunderline"), 1);
2456 AddMacroDef(ltSETTRANSPARENCY
, _T("settransparency"), 1);
2457 AddMacroDef(ltSPADESUIT
, _T("spadesuit"), 0);
2459 AddMacroDef(ltTABBING
, _T("tabbing"), 2);
2460 AddMacroDef(ltTABLEOFCONTENTS
, _T("tableofcontents"), 0);
2461 AddMacroDef(ltTABLE
, _T("table"), 1);
2462 AddMacroDef(ltTABULAR
, _T("tabular"), 2, false);
2463 AddMacroDef(ltTAB
, _T("tab"), 0);
2464 AddMacroDef(ltTAU
, _T("tau"), 0);
2465 AddMacroDef(ltTEXTRM
, _T("textrm"), 1);
2466 AddMacroDef(ltTEXTSF
, _T("textsf"), 1);
2467 AddMacroDef(ltTEXTTT
, _T("texttt"), 1);
2468 AddMacroDef(ltTEXTBF
, _T("textbf"), 1);
2469 AddMacroDef(ltTEXTIT
, _T("textit"), 1);
2470 AddMacroDef(ltTEXTSL
, _T("textsl"), 1);
2471 AddMacroDef(ltTEXTSC
, _T("textsc"), 1);
2472 AddMacroDef(ltTEXTWIDTH
, _T("textwidth"), 1);
2473 AddMacroDef(ltTEXTHEIGHT
, _T("textheight"), 1);
2474 AddMacroDef(ltTEXTCOLOUR
, _T("textcolour"), 1);
2475 AddMacroDef(ltTEX
, _T("TeX"), 0);
2476 AddMacroDef(ltTHEBIBLIOGRAPHY
, _T("thebibliography"), 2);
2477 AddMacroDef(ltTHETA
, _T("theta"), 0);
2478 AddMacroDef(ltTIMES
, _T("times"), 0);
2479 AddMacroDef(ltCAP_THETA
, _T("Theta"), 0);
2480 AddMacroDef(ltTITLEPAGE
, _T("titlepage"), 1);
2481 AddMacroDef(ltTITLE
, _T("title"), 1);
2482 AddMacroDef(ltTINY
, _T("tiny"), 1);
2483 AddMacroDef(ltTODAY
, _T("today"), 0);
2484 AddMacroDef(ltTOPMARGIN
, _T("topmargin"), 1);
2485 AddMacroDef(ltTOPSKIP
, _T("topskip"), 1);
2486 AddMacroDef(ltTRIANGLE
, _T("triangle"), 0);
2487 AddMacroDef(ltTTFAMILY
, _T("ttfamily"), 1);
2488 AddMacroDef(ltTT
, _T("tt"), 1);
2489 AddMacroDef(ltTYPEIN
, _T("typein"), 1);
2490 AddMacroDef(ltTYPEOUT
, _T("typeout"), 1);
2491 AddMacroDef(ltTWOCOLWIDTHA
, _T("twocolwidtha"), 1);
2492 AddMacroDef(ltTWOCOLWIDTHB
, _T("twocolwidthb"), 1);
2493 AddMacroDef(ltTWOCOLSPACING
, _T("twocolspacing"), 1);
2494 AddMacroDef(ltTWOCOLITEMRULED
, _T("twocolitemruled"), 2);
2495 AddMacroDef(ltTWOCOLITEM
, _T("twocolitem"), 2);
2496 AddMacroDef(ltTWOCOLLIST
, _T("twocollist"), 1);
2497 AddMacroDef(ltTWOCOLUMN
, _T("twocolumn"), 0);
2498 AddMacroDef(ltTHEPAGE
, _T("thepage"), 0);
2499 AddMacroDef(ltTHECHAPTER
, _T("thechapter"), 0);
2500 AddMacroDef(ltTHESECTION
, _T("thesection"), 0);
2501 AddMacroDef(ltTHISPAGESTYLE
, _T("thispagestyle"), 1);
2503 AddMacroDef(ltUNDERLINE
, _T("underline"), 1);
2504 AddMacroDef(ltUPSILON
, _T("upsilon"), 0);
2505 AddMacroDef(ltCAP_UPSILON
, _T("Upsilon"), 0);
2506 AddMacroDef(ltUPARROW
, _T("uparrow"), 0);
2507 AddMacroDef(ltUPARROW2
, _T("Uparrow"), 0);
2508 AddMacroDef(ltUPPERCASE
, _T("uppercase"), 1);
2509 AddMacroDef(ltUPSHAPE
, _T("upshape"), 1);
2510 AddMacroDef(ltURLREF
, _T("urlref"), 2);
2511 AddMacroDef(ltUSEPACKAGE
, _T("usepackage"), 1);
2513 AddMacroDef(ltVAREPSILON
, _T("varepsilon"), 0);
2514 AddMacroDef(ltVARPHI
, _T("varphi"), 0);
2515 AddMacroDef(ltVARPI
, _T("varpi"), 0);
2516 AddMacroDef(ltVARRHO
, _T("varrho"), 0);
2517 AddMacroDef(ltVARSIGMA
, _T("varsigma"), 0);
2518 AddMacroDef(ltVARTHETA
, _T("vartheta"), 0);
2519 AddMacroDef(ltVDOTS
, _T("vdots"), 0);
2520 AddMacroDef(ltVEE
, _T("vee"), 0);
2521 AddMacroDef(ltVERBATIMINPUT
, _T("verbatiminput"), 1);
2522 AddMacroDef(ltVERBATIM
, _T("verbatim"), 1);
2523 AddMacroDef(ltVERBSTAR
, _T("verb*"), 1);
2524 AddMacroDef(ltVERB
, _T("verb"), 1);
2525 AddMacroDef(ltVERSE
, _T("verse"), 1);
2526 AddMacroDef(ltVFILL
, _T("vfill"), 0);
2527 AddMacroDef(ltVLINE
, _T("vline"), 0);
2528 AddMacroDef(ltVOID
, _T("void"), 0);
2529 AddMacroDef(ltVDASH
, _T("vdash"), 0);
2530 AddMacroDef(ltVRULE
, _T("vrule"), 0);
2531 AddMacroDef(ltVSPACESTAR
, _T("vspace*"), 1);
2532 AddMacroDef(ltVSKIPSTAR
, _T("vskip*"), 1);
2533 AddMacroDef(ltVSPACE
, _T("vspace"), 1);
2534 AddMacroDef(ltVSKIP
, _T("vskip"), 1);
2536 AddMacroDef(ltWEDGE
, _T("wedge"), 0);
2537 AddMacroDef(ltWXCLIPS
, _T("wxclips"), 0);
2538 AddMacroDef(ltWINHELPIGNORE
, _T("winhelpignore"), 1);
2539 AddMacroDef(ltWINHELPONLY
, _T("winhelponly"), 1);
2540 AddMacroDef(ltWP
, _T("wp"), 0);
2542 AddMacroDef(ltXI
, _T("xi"), 0);
2543 AddMacroDef(ltCAP_XI
, _T("Xi"), 0);
2544 AddMacroDef(ltXLPIGNORE
, _T("xlpignore"), 1);
2545 AddMacroDef(ltXLPONLY
, _T("xlponly"), 1);
2547 AddMacroDef(ltZETA
, _T("zeta"), 0);
2549 AddMacroDef(ltSPACE
, _T(" "), 0);
2550 AddMacroDef(ltBACKSLASHCHAR
, _T("\\"), 0);
2551 AddMacroDef(ltPIPE
, _T("|"), 0);
2552 AddMacroDef(ltFORWARDSLASH
, _T("/"), 0);
2553 AddMacroDef(ltUNDERSCORE
, _T("_"), 0);
2554 AddMacroDef(ltAMPERSAND
, _T("&"), 0);
2555 AddMacroDef(ltPERCENT
, _T("%"), 0);
2556 AddMacroDef(ltDOLLAR
, _T("$"), 0);
2557 AddMacroDef(ltHASH
, _T("#"), 0);
2558 AddMacroDef(ltLPARENTH
, _T("("), 0);
2559 AddMacroDef(ltRPARENTH
, _T(")"), 0);
2560 AddMacroDef(ltLBRACE
, _T("{"), 0);
2561 AddMacroDef(ltRBRACE
, _T("}"), 0);
2562 // AddMacroDef(ltEQUALS, _T("="), 0);
2563 AddMacroDef(ltRANGLEBRA
, _T(">"), 0);
2564 AddMacroDef(ltLANGLEBRA
, _T("<"), 0);
2565 AddMacroDef(ltPLUS
, _T("+"), 0);
2566 AddMacroDef(ltDASH
, _T("-"), 0);
2567 AddMacroDef(ltAT_SYMBOL
, _T("@"), 0);
2568 // AddMacroDef(ltSINGLEQUOTE, _T("'"), 0);
2569 // AddMacroDef(ltBACKQUOTE, _T("`"), 0);
2573 * Default behaviour, should be called by client if can't match locally.
2577 // Called on start/end of macro examination
2578 void DefaultOnMacro(int macroId
, int no_args
, bool start
)
2582 // Default behaviour for abstract
2587 // Write the heading
2588 FakeCurrentSection(AbstractNameString
);
2589 OnMacro(ltPAR
, 0, true);
2590 OnMacro(ltPAR
, 0, false);
2594 if (DocumentStyle
== LATEX_ARTICLE
)
2602 // Default behaviour for glossary
2603 case ltHELPGLOSSARY
:
2607 // Write the heading
2608 FakeCurrentSection(GlossaryNameString
);
2609 OnMacro(ltPAR
, 0, true);
2610 OnMacro(ltPAR
, 0, false);
2611 if ((convertMode
== TEX_RTF
) && !winHelp
)
2613 OnMacro(ltPAR
, 0, true);
2614 OnMacro(ltPAR
, 0, false);
2619 case ltSPECIALAMPERSAND
:
2627 if (convertMode
== TEX_HTML
)
2628 TexOutput(_T("<<"));
2630 TexOutput(_T("<<"), true);
2636 if (convertMode
== TEX_HTML
)
2637 TexOutput(_T(">>"));
2639 TexOutput(_T(">>"), true);
2644 TexOutput(_T("~"), true);
2648 TexOutput(_T("~"), true);
2650 case ltSPECIALTILDE
:
2652 TexOutput(_T(" "), true);
2656 TexOutput(_T("_"), true);
2660 TexOutput(_T("#"), true);
2664 TexOutput(_T("&"), true);
2668 TexOutput(_T(" "), true);
2672 TexOutput(_T("|"), true);
2676 TexOutput(_T("%"), true);
2680 TexOutput(_T("$"), true);
2684 TexOutput(_T(""), true);
2688 TexOutput(_T(""), true);
2692 TexOutput(_T("{"), true);
2696 TexOutput(_T("}"), true);
2700 TexOutput(_T("(c)"), true);
2704 TexOutput(_T("(r)"), true);
2708 TexOutput(_T("\\"), true);
2713 TexOutput(_T("..."), true);
2717 TexOutput(_T("|"), true);
2721 TexOutput(_T("LaTeX"), true);
2725 TexOutput(_T("TeX"), true);
2729 // FIXME: this is valid only if the output is iso-8859-1
2730 TexOutput(wxString::FromAscii("£"), true);
2732 case ltSPECIALDOUBLEDOLLAR
: // Interpret as center
2733 OnMacro(ltCENTER
, no_args
, start
);
2739 OnMacro(ltIT
, no_args
, start
);
2742 case ltPARAGRAPHSTAR
:
2743 case ltSUBPARAGRAPH
:
2744 case ltSUBPARAGRAPHSTAR
:
2745 OnMacro(ltSUBSUBSECTION
, no_args
, start
);
2753 TexOutput(wxCtime(&when
), true);
2764 if (start
) TexOutput(_T("alpha"));
2767 if (start
) TexOutput(_T("beta"));
2770 if (start
) TexOutput(_T("gamma"));
2773 if (start
) TexOutput(_T("delta"));
2777 if (start
) TexOutput(_T("epsilon"));
2780 if (start
) TexOutput(_T("zeta"));
2783 if (start
) TexOutput(_T("eta"));
2787 if (start
) TexOutput(_T("theta"));
2790 if (start
) TexOutput(_T("iota"));
2793 if (start
) TexOutput(_T("kappa"));
2796 if (start
) TexOutput(_T("lambda"));
2799 if (start
) TexOutput(_T("mu"));
2802 if (start
) TexOutput(_T("nu"));
2805 if (start
) TexOutput(_T("xi"));
2809 if (start
) TexOutput(_T("pi"));
2813 if (start
) TexOutput(_T("rho"));
2817 if (start
) TexOutput(_T("sigma"));
2820 if (start
) TexOutput(_T("tau"));
2823 if (start
) TexOutput(_T("upsilon"));
2827 if (start
) TexOutput(_T("phi"));
2830 if (start
) TexOutput(_T("chi"));
2833 if (start
) TexOutput(_T("psi"));
2836 if (start
) TexOutput(_T("omega"));
2839 if (start
) TexOutput(_T("GAMMA"));
2842 if (start
) TexOutput(_T("DELTA"));
2845 if (start
) TexOutput(_T("THETA"));
2848 if (start
) TexOutput(_T("LAMBDA"));
2851 if (start
) TexOutput(_T("XI"));
2854 if (start
) TexOutput(_T("PI"));
2857 if (start
) TexOutput(_T("SIGMA"));
2860 if (start
) TexOutput(_T("UPSILON"));
2863 if (start
) TexOutput(_T("PHI"));
2866 if (start
) TexOutput(_T("PSI"));
2869 if (start
) TexOutput(_T("OMEGA"));
2872 // Binary operation symbols
2877 if (convertMode
== TEX_HTML
)
2878 TexOutput(_T("<="));
2880 TexOutput(_T("<="));
2886 if (convertMode
== TEX_HTML
)
2887 TexOutput(_T("<<"));
2889 TexOutput(_T("<<"));
2893 if (start
) TexOutput(_T("SUBSET"));
2896 if (start
) TexOutput(_T("SUBSETEQ"));
2899 if (start
) TexOutput(_T("IN"));
2902 if (start
) TexOutput(_T("VDASH"));
2905 if (start
) TexOutput(_T("MODELS"));
2912 if (convertMode
== TEX_HTML
)
2913 TexOutput(_T(">="));
2915 TexOutput(_T(">="));
2922 if (convertMode
== TEX_HTML
)
2923 TexOutput(_T(">>"));
2925 TexOutput(_T(">>"));
2929 if (start
) TexOutput(_T("SUPSET"));
2932 if (start
) TexOutput(_T("SUPSETEQ"));
2935 if (start
) TexOutput(_T("NI"));
2938 if (start
) TexOutput(_T("DASHV"));
2941 if (start
) TexOutput(_T("PERP"));
2944 if (start
) TexOutput(_T("NEQ"));
2947 if (start
) TexOutput(_T("DOTEQ"));
2950 if (start
) TexOutput(_T("APPROX"));
2953 if (start
) TexOutput(_T("CONG"));
2956 if (start
) TexOutput(_T("EQUIV"));
2959 if (start
) TexOutput(_T("PROPTO"));
2962 if (start
) TexOutput(_T("PREC"));
2965 if (start
) TexOutput(_T("PRECEQ"));
2968 if (start
) TexOutput(_T("|"));
2971 if (start
) TexOutput(_T("~"));
2974 if (start
) TexOutput(_T("SIMEQ"));
2977 if (start
) TexOutput(_T("ASYMP"));
2980 if (start
) TexOutput(_T(":-)"));
2983 if (start
) TexOutput(_T(":-("));
2986 if (start
) TexOutput(_T("SUCC"));
2989 if (start
) TexOutput(_T("SUCCEQ"));
2992 if (start
) TexOutput(_T("|"));
2995 // Negated relation symbols
2997 if (start
) TexOutput(_T("!="));
3000 if (start
) TexOutput(_T("NOTIN"));
3003 if (start
) TexOutput(_T("NOTSUBSET"));
3010 if (convertMode
== TEX_HTML
)
3011 TexOutput(_T("<--"));
3013 TexOutput(_T("<--"));
3019 if (convertMode
== TEX_HTML
)
3020 TexOutput(_T("<=="));
3022 TexOutput(_T("<=="));
3028 if (convertMode
== TEX_HTML
)
3029 TexOutput(_T("-->"));
3031 TexOutput(_T("-->"));
3037 if (convertMode
== TEX_HTML
)
3038 TexOutput(_T("==>"));
3040 TexOutput(_T("==>"));
3043 case ltLEFTRIGHTARROW
:
3046 if (convertMode
== TEX_HTML
)
3047 TexOutput(_T("<-->"));
3049 TexOutput(_T("<-->"));
3052 case ltLEFTRIGHTARROW2
:
3055 if (convertMode
== TEX_HTML
)
3056 TexOutput(_T("<==>"));
3058 TexOutput(_T("<==>"));
3062 if (start
) TexOutput(_T("UPARROW"));
3065 if (start
) TexOutput(_T("UPARROW2"));
3068 if (start
) TexOutput(_T("DOWNARROW"));
3071 if (start
) TexOutput(_T("DOWNARROW2"));
3073 // Miscellaneous symbols
3075 if (start
) TexOutput(_T("ALEPH"));
3078 if (start
) TexOutput(_T("WP"));
3081 if (start
) TexOutput(_T("RE"));
3084 if (start
) TexOutput(_T("IM"));
3087 if (start
) TexOutput(_T("EMPTYSET"));
3090 if (start
) TexOutput(_T("NABLA"));
3093 if (start
) TexOutput(_T("SURD"));
3096 if (start
) TexOutput(_T("PARTIAL"));
3099 if (start
) TexOutput(_T("BOT"));
3102 if (start
) TexOutput(_T("FORALL"));
3105 if (start
) TexOutput(_T("EXISTS"));
3108 if (start
) TexOutput(_T("NEG"));
3111 if (start
) TexOutput(_T("SHARP"));
3114 if (start
) TexOutput(_T("ANGLE"));
3117 if (start
) TexOutput(_T("TRIANGLE"));
3120 if (start
) TexOutput(_T("CLUBSUIT"));
3123 if (start
) TexOutput(_T("DIAMONDSUIT"));
3126 if (start
) TexOutput(_T("HEARTSUIT"));
3129 if (start
) TexOutput(_T("SPADESUIT"));
3132 if (start
) TexOutput(_T("INFTY"));
3135 if (start
) TexOutput(_T("PM"));
3138 if (start
) TexOutput(_T("MP"));
3141 if (start
) TexOutput(_T("TIMES"));
3144 if (start
) TexOutput(_T("DIV"));
3147 if (start
) TexOutput(_T("CDOT"));
3150 if (start
) TexOutput(_T("AST"));
3153 if (start
) TexOutput(_T("STAR"));
3156 if (start
) TexOutput(_T("CAP"));
3159 if (start
) TexOutput(_T("CUP"));
3162 if (start
) TexOutput(_T("VEE"));
3165 if (start
) TexOutput(_T("WEDGE"));
3168 if (start
) TexOutput(_T("CIRC"));
3171 if (start
) TexOutput(_T("BULLET"));
3174 if (start
) TexOutput(_T("DIAMOND"));
3177 if (start
) TexOutput(_T("OSLASH"));
3180 if (start
) TexOutput(_T("BOX"));
3183 if (start
) TexOutput(_T("DIAMOND2"));
3185 case ltBIGTRIANGLEDOWN
:
3186 if (start
) TexOutput(_T("BIGTRIANGLEDOWN"));
3189 if (start
) TexOutput(_T("OPLUS"));
3192 if (start
) TexOutput(_T("OTIMES"));
3195 if (start
) TexOutput(_T("s"));
3197 case ltBACKSLASHRAW
:
3198 if (start
) TexOutput(_T("\\"));
3201 if (start
) TexOutput(_T("{"));
3204 if (start
) TexOutput(_T("}"));
3208 if (start
) TexOutput(_T(" "));
3215 // Called on start/end of argument examination
3216 bool DefaultOnArgument(int macroId
, int arg_no
, bool start
)
3222 if (arg_no
== 1 && start
)
3224 wxChar
*refName
= GetArgData();
3227 TexRef
*texRef
= FindReference(refName
);
3230 // Must strip the 'section' or 'chapter' or 'figure' text
3231 // from a normal 'ref' reference
3233 wxStrcpy(buf
, texRef
->sectionNumber
);
3234 int len
= wxStrlen(buf
);
3236 if (wxStrcmp(buf
, _T("??")) != 0)
3248 TexOutput(texRef
->sectionNumber
+ i
, true);
3253 informBuf
.Printf(_T("Warning: unresolved reference '%s'"), refName
);
3254 OnInform((wxChar
*)informBuf
.c_str());
3257 else TexOutput(_T("??"), true);
3268 if (start
&& (arg_no
== 1))
3269 DocumentAuthor
= GetArgChunk();
3274 if (start
&& (arg_no
== 1))
3275 DocumentDate
= GetArgChunk();
3280 if (start
&& (arg_no
== 1))
3281 DocumentTitle
= GetArgChunk();
3284 case ltDOCUMENTCLASS
:
3285 case ltDOCUMENTSTYLE
:
3287 if (start
&& !IsArgOptional())
3289 DocumentStyleString
= copystring(GetArgData());
3290 if (wxStrncmp(DocumentStyleString
, _T("art"), 3) == 0)
3291 DocumentStyle
= LATEX_ARTICLE
;
3292 else if (wxStrncmp(DocumentStyleString
, _T("rep"), 3) == 0)
3293 DocumentStyle
= LATEX_REPORT
;
3294 else if (wxStrncmp(DocumentStyleString
, _T("book"), 4) == 0 ||
3295 wxStrncmp(DocumentStyleString
, _T("thesis"), 6) == 0)
3296 DocumentStyle
= LATEX_BOOK
;
3297 else if (wxStrncmp(DocumentStyleString
, _T("letter"), 6) == 0)
3298 DocumentStyle
= LATEX_LETTER
;
3299 else if (wxStrncmp(DocumentStyleString
, _T("slides"), 6) == 0)
3300 DocumentStyle
= LATEX_SLIDES
;
3302 if (StringMatch(_T("10"), DocumentStyleString
))
3304 else if (StringMatch(_T("11"), DocumentStyleString
))
3306 else if (StringMatch(_T("12"), DocumentStyleString
))
3309 OnMacro(ltHELPFONTSIZE
, 1, true);
3310 wxSnprintf(currentArgData
, 2000, _T("%d"), normalFont
);
3312 OnArgument(ltHELPFONTSIZE
, 1, true);
3313 OnArgument(ltHELPFONTSIZE
, 1, false);
3314 haveArgData
= false;
3315 OnMacro(ltHELPFONTSIZE
, 1, false);
3317 else if (start
&& IsArgOptional())
3319 MinorDocumentStyleString
= copystring(GetArgData());
3321 if (StringMatch(_T("10"), MinorDocumentStyleString
))
3323 else if (StringMatch(_T("11"), MinorDocumentStyleString
))
3325 else if (StringMatch(_T("12"), MinorDocumentStyleString
))
3330 case ltBIBLIOGRAPHYSTYLE
:
3332 if (start
&& !IsArgOptional())
3333 BibliographyStyleString
= copystring(GetArgData());
3338 if (start
&& !IsArgOptional())
3340 if (PageStyle
) delete[] PageStyle
;
3341 PageStyle
= copystring(GetArgData());
3348 if (start && !IsArgOptional())
3349 LeftHeader = GetArgChunk();
3355 if (start && !IsArgOptional())
3356 LeftFooter = GetArgChunk();
3362 if (start && !IsArgOptional())
3363 CentreHeader = GetArgChunk();
3369 if (start && !IsArgOptional())
3370 CentreFooter = GetArgChunk();
3376 if (start && !IsArgOptional())
3377 RightHeader = GetArgChunk();
3383 if (start && !IsArgOptional())
3384 RightFooter = GetArgChunk();
3392 if (start
&& !IsArgOptional())
3394 wxChar
*citeKeys
= GetArgData();
3396 wxChar
*citeKey
= ParseMultifieldString(citeKeys
, &pos
);
3399 AddCitation(citeKey
);
3400 TexRef
*ref
= FindReference(citeKey
);
3403 TexOutput(ref
->sectionNumber
, true);
3404 if (wxStrcmp(ref
->sectionNumber
, _T("??")) == 0)
3407 informBuf
.Printf(_T("Warning: unresolved citation %s."), citeKey
);
3408 OnInform((wxChar
*)informBuf
.c_str());
3411 citeKey
= ParseMultifieldString(citeKeys
, &pos
);
3414 TexOutput(_T(", "), true);
3423 if (start
&& !IsArgOptional())
3425 wxChar
*citeKey
= GetArgData();
3426 AddCitation(citeKey
);
3431 case ltHELPFONTSIZE
:
3435 wxChar
*data
= GetArgData();
3436 if (wxStrcmp(data
, _T("10")) == 0)
3438 else if (wxStrcmp(data
, _T("11")) == 0)
3440 else if (wxStrcmp(data
, _T("12")) == 0)
3450 TexOutput(_T(" ??"), true);
3457 if (start
&& arg_no
== 1)
3459 wxChar
*data
= GetArgData();
3460 ParSkip
= ParseUnitArgument(data
);
3467 if (start
&& arg_no
== 1)
3469 wxChar
*data
= GetArgData();
3470 ParIndent
= ParseUnitArgument(data
);
3477 return OnArgument(ltIT
, arg_no
, start
);
3479 case ltSPECIALDOUBLEDOLLAR
:
3481 return OnArgument(ltCENTER
, arg_no
, start
);
3484 case ltPARAGRAPHSTAR
:
3485 case ltSUBPARAGRAPH
:
3486 case ltSUBPARAGRAPHSTAR
:
3488 return OnArgument(ltSUBSUBSECTION
, arg_no
, start
);
3493 OnInform(GetArgData());
3499 TexOutput(_T(" ("), true);
3501 TexOutput(_T(")"), true);
3504 case ltBIBLIOGRAPHY
:
3511 FILE *fd
= wxFopen(TexBibName
, _T("r"));
3515 smallBuf
[0] = (wxChar
)ch
;
3518 TexOutput(smallBuf
);
3520 smallBuf
[0] = (wxChar
)ch
;
3526 OnInform(_T("Run Tex2RTF again to include bibliography."));
3529 // Read in the .bib file, resolve all known references, write out the RTF.
3530 wxChar
*allFiles
= GetArgData();
3532 wxChar
*bibFile
= ParseMultifieldString(allFiles
, &pos
);
3535 wxChar fileBuf
[300];
3536 wxStrcpy(fileBuf
, bibFile
);
3537 wxString actualFile
= TexPathList
.FindValidPath(fileBuf
);
3538 if (actualFile
.empty())
3540 wxStrcat(fileBuf
, _T(".bib"));
3541 actualFile
= TexPathList
.FindValidPath(fileBuf
);
3543 if (!actualFile
.empty())
3545 if (!ReadBib((wxChar
*) (const wxChar
*) actualFile
))
3548 errBuf
.Printf(_T(".bib file %s not found or malformed"), (const wxChar
*) actualFile
);
3549 OnError((wxChar
*)errBuf
.c_str());
3555 errBuf
.Printf(_T(".bib file %s not found"), fileBuf
);
3556 OnError((wxChar
*)errBuf
.c_str());
3558 bibFile
= ParseMultifieldString(allFiles
, &pos
);
3561 ResolveBibReferences();
3563 // Write it a new bib section in the appropriate format.
3564 FILE *save1
= CurrentOutput1
;
3565 FILE *save2
= CurrentOutput2
;
3566 FILE *Biblio
= wxFopen(TexTmpBibName
, _T("w"));
3567 SetCurrentOutput(Biblio
);
3570 if (wxFileExists(TexTmpBibName
))
3572 if (wxFileExists(TexBibName
)) wxRemoveFile(TexBibName
);
3573 wxRenameFile(TexTmpBibName
, TexBibName
);
3575 SetCurrentOutputs(save1
, save2
);
3581 return (start
&& (arg_no
== 3));
3586 if (start
&& (arg_no
== 1))
3588 wxChar
*s
= GetArgData();
3591 wxChar
*s1
= copystring(s
);
3593 for (i
= 0; i
< (int)wxStrlen(s
); i
++)
3594 s1
[i
] = (wxChar
)wxToupper(s
[i
]);
3606 if (start
&& (arg_no
== 1))
3608 wxChar
*s
= GetArgData();
3611 wxChar
*s1
= copystring(s
);
3613 for (i
= 0; i
< (int)wxStrlen(s
); i
++)
3614 s1
[i
] = (wxChar
)wxTolower(s
[i
]);
3626 if (start
&& (arg_no
== 1))
3628 wxChar
*s
= GetArgData();
3631 wxChar
*s1
= copystring(s
);
3633 for (i
= 0; i
< (int)wxStrlen(s
); i
++)
3634 s1
[i
] = (wxChar
)wxToupper(s
[i
]);
3644 case ltPOPREF
: // Ignore second argument by default
3645 return (start
&& (arg_no
== 1));
3649 return ((convertMode
== TEX_XLP
) ? false : true);
3651 return ((convertMode
!= TEX_XLP
) ? false : true);
3653 return ((convertMode
== TEX_HTML
) ? false : true);
3655 return ((convertMode
!= TEX_HTML
) ? false : true);
3657 return (((convertMode
== TEX_RTF
) && !winHelp
) ? false : true);
3659 return (!((convertMode
== TEX_RTF
) && !winHelp
) ? false : true);
3660 case ltWINHELPIGNORE
:
3661 return (winHelp
? false : true);
3663 return (!winHelp
? false : true);
3675 case ltADDTOCOUNTER
:
3676 case ltADDCONTENTSLINE
:
3680 case ltBASELINESKIP
:
3689 case ltPAGENUMBERING
:
3701 case ltTHISPAGESTYLE
:
3704 case ltEVENSIDEMARGIN
:
3705 case ltODDSIDEMARGIN
:
3707 case ltMARGINPARWIDTH
:
3708 case ltMARGINPARSEP
:
3709 case ltMARGINPAREVEN
:
3710 case ltMARGINPARODD
:
3711 case ltTWOCOLWIDTHA
:
3712 case ltTWOCOLWIDTHB
:
3713 case ltTWOCOLSPACING
:
3720 case ltSETHOTSPOTCOLOUR
:
3721 case ltSETHOTSPOTCOLOR
:
3722 case ltSETHOTSPOTUNDERLINE
:
3723 case ltSETTRANSPARENCY
:
3726 case ltBACKGROUNDCOLOUR
:
3727 case ltBACKGROUNDIMAGE
:
3729 case ltFOLLOWEDLINKCOLOUR
:
3736 case ltINSERTATLEVEL
:
3739 case ltSUPERTABULAR
:
3743 return (arg_no
== 2);
3744 case ltDEFINECOLOUR
:
3747 static int redVal
= 0;
3748 static int greenVal
= 0;
3749 static int blueVal
= 0;
3750 static wxChar
*colourName
= NULL
;
3757 if (colourName
) delete[] colourName
;
3758 colourName
= copystring(GetArgData());
3763 redVal
= wxAtoi(GetArgData());
3768 greenVal
= wxAtoi(GetArgData());
3773 blueVal
= wxAtoi(GetArgData());
3774 AddColour(colourName
, redVal
, greenVal
, blueVal
);
3788 return (!IsArgOptional());