⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 texutils.cpp

📁 很牛的GUI源码wxWidgets-2.8.0.zip 可在多种平台下运行.
💻 CPP
📖 第 1 页 / 共 4 页
字号:
/////////////////////////////////////////////////////////////////////////////// Name:        texutils.cpp// Purpose:     Miscellaneous utilities// Author:      Julian Smart// Modified by: Wlodzimiez ABX Skiba 2003/2004 Unicode support//              Ron Lee// Created:     7.9.93// RCS-ID:      $Id: texutils.cpp,v 1.36 2006/06/13 10:33:24 ABX 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#ifndef WX_PRECOMP    #include "wx/log.h"#endif#include "wx/app.h"#include "wx/hash.h"#include "wx/textfile.h"#ifdef new#undef new#endif#if wxUSE_IOSTREAMH#include <iostream.h>#include <fstream.h>#else#include <iostream>#include <fstream>using namespace std;#endif#include <ctype.h>#include "tex2any.h"#if !WXWIN_COMPATIBILITY_2_4static inline wxChar* copystring(const wxChar* s)    { return wxStrcpy(new wxChar[wxStrlen(s) + 1], s); }#endifwxHashTable TexReferences(wxKEY_STRING);wxList BibList(wxKEY_STRING);wxStringList CitationList;wxList ColourTable(wxKEY_STRING);wxHashTable BibStringTable(wxKEY_STRING);wxList CustomMacroList(wxKEY_STRING);TexChunk *currentSection = NULL;wxChar *fakeCurrentSection = NULL;static long BibLine = 1;void OutputCurrentSection(void){  if (fakeCurrentSection)    TexOutput(fakeCurrentSection);  else if (currentSection)    TraverseChildrenFromChunk(currentSection);}// Nasty but the way things are done now, necessary,// in order to output a chunk properly to a string (macros and all).void OutputCurrentSectionToString(wxChar *buf){    if (fakeCurrentSection)        wxStrcpy(buf, fakeCurrentSection);    else        OutputChunkToString(currentSection, buf);}void OutputChunkToString(TexChunk *chunk, wxChar *buf){  FILE *tempfd = wxFopen(_T("tmp.tmp"), _T("w"));  if (!tempfd)    return;  FILE *old1 = CurrentOutput1;  FILE *old2 = CurrentOutput2;  CurrentOutput1 = tempfd;  CurrentOutput2 = NULL;  TraverseChildrenFromChunk(chunk);  CurrentOutput1 = old1;  CurrentOutput2 = old2;  fclose(tempfd);  // Read from file into string  tempfd = wxFopen(_T("tmp.tmp"), _T("r"));  if (!tempfd)    return;  buf[0] = 0;  int ch = -2;  int i = 0;  while (ch != EOF)  {    ch = getc(tempfd);    if (ch == EOF)      buf[i] = 0;    else    {      buf[i] = (wxChar)ch;      i ++;    }  }  fclose(tempfd);  wxRemoveFile(_T("tmp.tmp"));}// Called by Tex2Any to simulate a sectionvoid FakeCurrentSection(wxChar *fakeSection, bool addToContents){  currentSection = NULL;  if (fakeCurrentSection) delete[] fakeCurrentSection;  fakeCurrentSection = copystring(fakeSection);  if (DocumentStyle == LATEX_ARTICLE)  {    int mac = ltSECTIONHEADING;    if (!addToContents)      mac = ltSECTIONHEADINGSTAR;    OnMacro(mac, 0, true);    OnMacro(mac, 0, false);  }  else  {    int mac = ltCHAPTERHEADING;    if (!addToContents)      mac = ltCHAPTERHEADINGSTAR;    OnMacro(mac, 0, true);    OnMacro(mac, 0, false);  }  if (fakeCurrentSection) delete[] fakeCurrentSection;  fakeCurrentSection = NULL;}// Look for \label macro, use this ref name if found or// make up a topic name otherwise.static long topicCounter = 0;void ResetTopicCounter(void){  topicCounter = 0;}static wxChar *forceTopicName = NULL;void ForceTopicName(const wxChar *name){  if (forceTopicName)    delete[] forceTopicName;  if (name)    forceTopicName = copystring(name);  else    forceTopicName = NULL;}wxChar *FindTopicName(TexChunk *chunk){  if (forceTopicName)    return forceTopicName;  wxChar *topicName = NULL;  static wxChar topicBuf[100];  if (chunk && (chunk->type == CHUNK_TYPE_MACRO) &&      (chunk->macroId == ltLABEL))  {    wxNode *node = chunk->children.GetFirst();    if (node)    {      TexChunk *child = (TexChunk *)node->GetData();      if (child->type == CHUNK_TYPE_ARG)      {        wxNode *snode = child->children.GetFirst();        if (snode)        {          TexChunk *schunk = (TexChunk *)snode->GetData();          if (schunk->type == CHUNK_TYPE_STRING)            topicName = schunk->value;        }      }    }  }  if (topicName)    return topicName;  else  {    wxSnprintf(topicBuf, sizeof(topicBuf), _T("topic%ld"), topicCounter);    topicCounter ++;    return topicBuf;  }}/* * Simulate argument data, so we can 'drive' clients which implement * certain basic formatting behaviour. * Snag is that some save a TexChunk, so don't use yet... * */void StartSimulateArgument(wxChar *data){  wxStrcpy(currentArgData, data);  haveArgData = true;}void EndSimulateArgument(void){  haveArgData = false;}/* * Parse and convert unit arguments to points * */int ParseUnitArgument(wxChar *unitArg){  float conversionFactor = 1.0;  float unitValue = 0.0;  int len = wxStrlen(unitArg);  // Get rid of any accidentally embedded commands  for (int i = 0; i < len; i++)    if (unitArg[i] == '\\')      unitArg[i] = 0;  len = wxStrlen(unitArg);  if (unitArg && (len > 0) && (isdigit(unitArg[0]) || unitArg[0] == '-'))  {    wxSscanf(unitArg, _T("%f"), &unitValue);    if (len > 1)    {      wxChar units[3];      units[0] = unitArg[len-2];      units[1] = unitArg[len-1];      units[2] = 0;      if (wxStrcmp(units, _T("in")) == 0)        conversionFactor = 72.0;      else if (wxStrcmp(units, _T("cm")) == 0)        conversionFactor = (float)72.0/(float)2.51;      else if (wxStrcmp(units, _T("mm")) == 0)        conversionFactor = (float)72.0/(float)25.1;      else if (wxStrcmp(units, _T("pt")) == 0)        conversionFactor = 1;    }    return (int)(unitValue*conversionFactor);  }  else return 0;}/* * Strip off any extension (dot something) from end of file, * IF one exists. Inserts zero into buffer. * */void StripExtension(wxChar *buffer){  int len = wxStrlen(buffer);  int i = len-1;  while (i > 0)  {    if (buffer[i] == '.')    {      buffer[i] = 0;      break;    }    i --;  }}/* * Latex font setting * */void SetFontSizes(int pointSize){  switch (pointSize)  {    case 12:    {      normalFont = 12;      smallFont = 10;      tinyFont = 8;      largeFont1 = 14;      LargeFont2 = 16;      LARGEFont3 = 20;      hugeFont1 = 24;      HugeFont2 = 28;      HUGEFont3 = 32;      break;    }    case 11:    {      normalFont = 11;      smallFont = 9;      tinyFont = 7;      largeFont1 = 13;      LargeFont2 = 16;      LARGEFont3 = 19;      hugeFont1 = 22;      HugeFont2 = 26;      HUGEFont3 = 30;      break;    }    case 10:    {      normalFont = 10;      smallFont = 8;      tinyFont = 6;      largeFont1 = 12;      LargeFont2 = 14;      LARGEFont3 = 18;      hugeFont1 = 20;      HugeFont2 = 24;      HUGEFont3 = 28;      break;    }  }}/* * Latex references * */void AddTexRef(wxChar *name, wxChar *file, wxChar *sectionName,               int chapter, int section, int subsection, int subsubsection){  TexRef *texRef = (TexRef *)TexReferences.Get(name);  if (texRef) TexReferences.Delete(name);  wxChar buf[100];  buf[0] = 0;/*  if (sectionName)  {    wxStrcat(buf, sectionName);    wxStrcat(buf, " ");  }*/  if (chapter)  {    wxChar buf2[10];    wxSnprintf(buf2, sizeof(buf2), _T("%d"), chapter);    wxStrcat(buf, buf2);  }  if (section)  {    wxChar buf2[10];    if (chapter)      wxStrcat(buf, _T("."));    wxSnprintf(buf2, sizeof(buf2), _T("%d"), section);    wxStrcat(buf, buf2);  }  if (subsection)  {    wxChar buf2[10];    wxStrcat(buf, _T("."));    wxSnprintf(buf2, sizeof(buf2), _T("%d"), subsection);    wxStrcat(buf, buf2);  }  if (subsubsection)  {    wxChar buf2[10];    wxStrcat(buf, _T("."));    wxSnprintf(buf2, sizeof(buf2), _T("%d"), subsubsection);    wxStrcat(buf, buf2);  }  wxChar *tmp = ((wxStrlen(buf) > 0) ? buf : (wxChar *)NULL);  TexReferences.Put(name, new TexRef(name, file, tmp, sectionName));}void WriteTexReferences(wxChar *filename){    wxString name = filename;    wxTextFile file;    if (!(wxFileExists(name)?file.Open(name):file.Create(name)))        return;    file.Clear();    TexReferences.BeginFind();    wxHashTable::Node *node = TexReferences.Next();    while (node)    {        Tex2RTFYield();        TexRef *ref = (TexRef *)node->GetData();        wxString converter = ref->refLabel;        converter << wxT(" ");        converter << (ref->refFile ? ref->refFile : _T("??"));        converter << wxT(" ");        converter << (ref->sectionName ? ref->sectionName : _T("??")) ;        converter << wxT(" ");        converter << (ref->sectionNumber ? ref->sectionNumber : _T("??")) ;        file.AddLine(converter);        if (!ref->sectionNumber || (wxStrcmp(ref->sectionNumber, _T("??")) == 0 && wxStrcmp(ref->sectionName, _T("??")) == 0))        {            wxChar buf[200];            wxSnprintf(buf, sizeof(buf), _T("Warning: reference %s not resolved."), ref->refLabel);            OnInform(buf);        }        node = TexReferences.Next();    }    file.Write();    file.Close();}void ReadTexReferences(wxChar *filename){    wxString name = filename;    if (!wxFileExists(name))        return;    wxTextFile file;    if (!file.Open(name))        return;    wxString line;    for ( line = file.GetFirstLine(); !file.Eof(); line = file.GetNextLine() )    {        wxString labelStr = line.BeforeFirst(wxT(' '));        line = line.AfterFirst(wxT(' '));        wxString fileStr  = line.BeforeFirst(wxT(' '));        line = line.AfterFirst(wxT(' '));        wxString sectionNameStr = line.BeforeFirst(wxT(' '));        wxString sectionStr = line.AfterFirst(wxT(' '));        // gt - needed to trick the hash table "TexReferences" into deleting the key        // strings it creates in the Put() function, but not the item that is        // created here, as that is destroyed elsewhere.  Without doing this, there        // were massive memory leaks        TexReferences.DeleteContents(true);        TexReferences.Put(            labelStr.c_str(),            new TexRef(                labelStr.c_str(),                fileStr.c_str(),                sectionStr.c_str(),                sectionNameStr.c_str()            )

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -