📄 tex2rtf.cpp
字号:
/////////////////////////////////////////////////////////////////////////////// Name: tex2rtf.cpp// Purpose: Converts Latex to linear/WinHelp RTF, HTML, wxHelp.// Author: Julian Smart// Modified by: Wlodzimiez ABX Skiba 2003/2004 Unicode support// Ron Lee// Created: 7.9.93// RCS-ID: $Id: tex2rtf.cpp,v 1.58 2006/08/28 10:29:23 VZ Exp $// Copyright: (c) Julian Smart// Licence: wxWindows licence/////////////////////////////////////////////////////////////////////////////// For compilers that support precompilation, includes "wx.h".#include "wx/wxprec.h"#ifdef __BORLANDC__#pragma hdrstop#endif#if defined(__WXMSW__) #include "wx/msw/wrapwin.h"#endif#ifndef WX_PRECOMP #ifndef NO_GUI #include "wx/menu.h" #include "wx/textctrl.h" #include "wx/filedlg.h" #include "wx/msgdlg.h" #include "wx/icon.h" #endif#endif#include "wx/log.h"#ifndef NO_GUI #include "wx/timer.h" #include "wx/help.h" #include "wx/cshelp.h" #include "wx/helphtml.h" #ifdef __WXMSW__ #include "wx/msw/helpchm.h" #else #include "wx/html/helpctrl.h" #endif#endif // !NO_GUI#include "wx/utils.h"#if wxUSE_IOSTREAMH#include <iostream.h>#include <fstream.h>#else#include <iostream>#include <fstream>#endif#include <ctype.h>#include <stdlib.h>#include "tex2any.h"#include "tex2rtf.h"#include "rtfutils.h"#include "symbols.h"#if (defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXMAC__) || defined(__WXX11__) || defined(__WXMGL__)) && !defined(NO_GUI)#include "tex2rtf.xpm"#endif#if !WXWIN_COMPATIBILITY_2_4static inline wxChar* copystring(const wxChar* s) { return wxStrcpy(new wxChar[wxStrlen(s) + 1], s); }#endifconst float versionNo = float(TEX2RTF_VERSION_NUMBER);TexChunk *currentMember = NULL;bool startedSections = false;wxChar *contentsString = NULL;bool suppressNameDecoration = false;bool OkToClose = true;int passNumber = 1;unsigned long errorCount = 0;#ifndef NO_GUIextern wxChar *BigBuffer;extern wxChar *TexFileRoot;extern wxChar *TexBibName; // Bibliography output file nameextern wxChar *TexTmpBibName; // Temporary bibliography output file nameextern wxList ColourTable;extern TexChunk *TopLevel;#if wxUSE_HELPwxHelpControllerBase *HelpInstance = NULL;#endif // wxUSE_HELP#ifdef __WXMSW__static wxChar *ipc_buffer = NULL;static wxChar Tex2RTFLastStatus[100];Tex2RTFServer *TheTex2RTFServer = NULL;#endif // __WXMSW__#endif // !NO_GUIwxChar *bulletFile = NULL;FILE *Contents = NULL; // Contents pageFILE *Chapters = NULL; // Chapters (WinHelp RTF) or rest of file (linear RTF)FILE *Sections = NULL;FILE *Subsections = NULL;FILE *Subsubsections = NULL;FILE *Popups = NULL;FILE *WinHelpContentsFile = NULL;wxString InputFile;wxString OutputFile;wxChar *MacroFile = copystring(_T("tex2rtf.ini"));wxChar *FileRoot = NULL;wxChar *ContentsName = NULL; // Contents page from last time aroundwxChar *TmpContentsName = NULL; // Current contents pagewxChar *TmpFrameContentsName = NULL; // Current frame contents pagewxChar *WinHelpContentsFileName = NULL; // WinHelp .cnt filewxChar *RefFileName = NULL; // Reference file namewxChar *RTFCharset = copystring(_T("ansi"));#ifdef __WXMSW__int BufSize = 100; // Size of buffer in K#elseint BufSize = 500;#endifbool Go(void);void ShowOptions(void);wxChar wxTex2RTFBuffer[1500];#ifdef NO_GUI IMPLEMENT_APP_CONSOLE(MyApp)#else wxMenuBar *menuBar = NULL; MyFrame *frame = NULL; // DECLARE_APP(MyApp) IMPLEMENT_APP(MyApp)#endif// `Main program' equivalent, creating windows and returning main app framebool MyApp::OnInit(){ // Use default list of macros defined in tex2any.cc DefineDefaultMacros(); AddMacroDef(ltHARDY, _T("hardy"), 0); FileRoot = new wxChar[300]; ContentsName = new wxChar[300]; TmpContentsName = new wxChar[300]; TmpFrameContentsName = new wxChar[300]; WinHelpContentsFileName = new wxChar[300]; RefFileName = new wxChar[300]; WX_CLEAR_LIST(wxList,ColourTable); int n = 1; // Read input/output files if (argc > 1) { if (argv[1][0] != _T('-')) { InputFile = argv[1]; n ++; if (argc > 2) { if (argv[2][0] != _T('-')) { OutputFile = argv[2]; n ++; } } } } TexPathList.Add(::wxGetCwd());#ifdef NO_GUI if (InputFile.empty() || OutputFile.empty()) { wxSTD cout << "Tex2RTF: input or output file is missing.\n"; ShowOptions(); exit(1); }#endif if (!InputFile.empty()) { TexPathList.EnsureFileAccessible(InputFile); } if (InputFile.empty() || OutputFile.empty()) isInteractive = true; int i; for (i = n; i < argc;) { if (wxStrcmp(argv[i], _T("-winhelp")) == 0) { i ++; convertMode = TEX_RTF; winHelp = true; }#ifndef NO_GUI else if (wxStrcmp(argv[i], _T("-interactive")) == 0) { i ++; isInteractive = true; }#endif else if (wxStrcmp(argv[i], _T("-sync")) == 0) // Don't yield { i ++; isSync = true; } else if (wxStrcmp(argv[i], _T("-rtf")) == 0) { i ++; convertMode = TEX_RTF; } else if (wxStrcmp(argv[i], _T("-html")) == 0) { i ++; convertMode = TEX_HTML; } else if (wxStrcmp(argv[i], _T("-xlp")) == 0) { i ++; convertMode = TEX_XLP; } else if (wxStrcmp(argv[i], _T("-twice")) == 0) { i ++; runTwice = true; } else if (wxStrcmp(argv[i], _T("-macros")) == 0) { i ++; if (i < argc) { MacroFile = copystring(argv[i]); i ++; } } else if (wxStrcmp(argv[i], _T("-bufsize")) == 0) { i ++; if (i < argc) { BufSize = wxAtoi(argv[i]); i ++; } } else if (wxStrcmp(argv[i], _T("-charset")) == 0) { i ++; if (i < argc) { wxChar *s = argv[i]; i ++; if (wxStrcmp(s, _T("ansi")) == 0 || wxStrcmp(s, _T("pc")) == 0 || wxStrcmp(s, _T("mac")) == 0 || wxStrcmp(s, _T("pca")) == 0) RTFCharset = copystring(s); else { OnError(_T("Incorrect argument for -charset")); return false; } } } else if (wxStrcmp(argv[i], _T("-checkcurlybraces")) == 0) { i ++; checkCurlyBraces = true; } else if (wxStrcmp(argv[i], _T("-checkcurleybraces")) == 0) { // Support the old, incorrectly spelled version of -checkcurlybraces // so that old scripts which run tex2rtf -checkcurleybraces still work. i ++; checkCurlyBraces = true; } else if (wxStrcmp(argv[i], _T("-checksyntax")) == 0) { i ++; checkSyntax = true; } else { wxString buf; buf.Printf(_T("Invalid switch %s.\n"), argv[i]); OnError((wxChar *)buf.c_str());#ifdef NO_GUI ShowOptions(); exit(1);#else return false;#endif } }#if defined(__WXMSW__) && !defined(NO_GUI) wxDDEInitialize(); Tex2RTFLastStatus[0] = 0; // DDE connection return value TheTex2RTFServer = new Tex2RTFServer; TheTex2RTFServer->Create(_T("TEX2RTF"));#endif TexInitialize(BufSize); ResetContentsLevels(0);#ifndef NO_GUI if (isInteractive) { // Create the main frame window frame = new MyFrame(NULL, wxID_ANY, _T("Tex2RTF"), wxDefaultPosition, wxSize(400, 300));#if wxUSE_STATUSBAR frame->CreateStatusBar(2);#endif // wxUSE_STATUSBAR // Give it an icon // TODO: uncomment this when we have tex2rtf.xpm frame->SetIcon(wxICON(tex2rtf)); if (!InputFile.empty()) { wxString title; title.Printf( _T("Tex2RTF [%s]"), wxFileNameFromPath(InputFile).c_str()); frame->SetTitle(title); } // Make a menubar wxMenu *file_menu = new wxMenu; file_menu->Append(TEX_GO, _T("&Go"), _T("Run converter")); file_menu->Append(TEX_SET_INPUT, _T("Set &Input File"), _T("Set the LaTeX input file")); file_menu->Append(TEX_SET_OUTPUT, _T("Set &Output File"), _T("Set the output file")); file_menu->AppendSeparator(); file_menu->Append(TEX_VIEW_LATEX, _T("View &LaTeX File"), _T("View the LaTeX input file")); file_menu->Append(TEX_VIEW_OUTPUT, _T("View Output &File"), _T("View output file")); file_menu->Append(TEX_SAVE_FILE, _T("&Save log file"), _T("Save displayed text into file")); file_menu->AppendSeparator(); file_menu->Append(TEX_QUIT, _T("E&xit"), _T("Exit Tex2RTF")); wxMenu *macro_menu = new wxMenu; macro_menu->Append(TEX_LOAD_CUSTOM_MACROS, _T("&Load Custom Macros"), _T("Load custom LaTeX macro file")); macro_menu->Append(TEX_VIEW_CUSTOM_MACROS, _T("View &Custom Macros"), _T("View custom LaTeX macros")); wxMenu *mode_menu = new wxMenu; mode_menu->Append(TEX_MODE_RTF, _T("Output linear &RTF"), _T("Wordprocessor-compatible RTF")); mode_menu->Append(TEX_MODE_WINHELP, _T("Output &WinHelp RTF"), _T("WinHelp-compatible RTF")); mode_menu->Append(TEX_MODE_HTML, _T("Output &HTML"), _T("HTML World Wide Web hypertext file")); mode_menu->Append(TEX_MODE_XLP, _T("Output &XLP"), _T("wxHelp hypertext help file")); wxMenu *options_menu = new wxMenu; options_menu->Append(TEX_OPTIONS_CURLY_BRACE, _T("Curly brace matching"), _T("Checks for mismatched curly braces"),true); options_menu->Append(TEX_OPTIONS_SYNTAX_CHECKING, _T("Syntax checking"), _T("Syntax checking for common errors"),true); options_menu->Check(TEX_OPTIONS_CURLY_BRACE, checkCurlyBraces); options_menu->Check(TEX_OPTIONS_SYNTAX_CHECKING, checkSyntax); wxMenu *help_menu = new wxMenu; help_menu->Append(TEX_HELP, _T("&Help"), _T("Tex2RTF Contents Page")); help_menu->Append(TEX_ABOUT, _T("&About Tex2RTF"), _T("About Tex2RTF")); menuBar = new wxMenuBar; menuBar->Append(file_menu, _T("&File")); menuBar->Append(macro_menu, _T("&Macros")); menuBar->Append(mode_menu, _T("&Conversion Mode")); menuBar->Append(options_menu, _T("&Options")); menuBar->Append(help_menu, _T("&Help")); frame->SetMenuBar(menuBar); frame->textWindow = new wxTextCtrl(frame, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY|wxTE_MULTILINE); (*frame->textWindow) << _T("Welcome to Tex2RTF.\n");// ShowOptions();#if wxUSE_HELP#if wxUSE_MS_HTML_HELP && !defined(__WXUNIVERSAL__) HelpInstance = new wxCHMHelpController;#else HelpInstance = new wxHelpController;#endif HelpInstance->Initialize(_T("tex2rtf"));#endif // wxUSE_HELP /* * Read macro/initialisation file * */ wxString path = TexPathList.FindValidPath(MacroFile); if (!path.empty()) ReadCustomMacros(path);#if wxUSE_STATUSBAR wxString inStr(_T("In ")); switch (convertMode) { case TEX_RTF: if(winHelp) inStr += _T("WinHelp RTF"); else inStr += _T("linear RTF"); break; case TEX_HTML: inStr += _T("HTML"); break; case TEX_XLP: inStr += _T("XLP"); break; default: inStr += _T("unknown"); break; } inStr += _T(" mode."); frame->SetStatusText(inStr, 1);#endif // wxUSE_STATUSBAR frame->Show(true); return true; } else#endif // NO_GUI { /* * Read macro/initialisation file * */ wxString path = TexPathList.FindValidPath(MacroFile); if (!path.empty()) ReadCustomMacros(path); bool rc = Go(); if ( rc && runTwice ) { rc = Go();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -