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

📄 latexgen.cpp

📁 doxygen(一个自动从源代码生成文档的工具)的源代码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
/****************************************************************************** * * $Id: latexgen.cpp,v 1.58 2001/03/19 19:27:40 root Exp $ * * Copyright (C) 1997-2001 by Dimitri van Heesch. * * Permission to use, copy, modify, and distribute this software and its * documentation under the terms of the GNU General Public License is hereby  * granted. No representations are made about the suitability of this software  * for any purpose. It is provided "as is" without express or implied warranty. * See the GNU General Public License for more details. * * Documents produced by Doxygen are derivative works derived from the * input used in their production; they are not affected by this license. * */#include <stdlib.h>#include "qtbc.h"#include <qdir.h>#include "latexgen.h"#include "config.h"#include "message.h"#include "doxygen.h"#include "util.h"#include "diagram.h"#include "language.h"#include "version.h"#include "dot.h"#include "page.h"//static QCString filterTitle(const char *s)//{//  QCString tmp=s,result;//  uint i;for (i=0;i<tmp.length();i++)//  {//    char c=tmp.at(i);//    switch(c)//    {//      case '#': result+="\\#";  break;//      case '"': result+="\\\""; break;//      case '%': result+="\\%";  break;//      case '[': result+="{";    break;//      case ']': result+="}";    break;//      default:  result+=c;      break;//    }//  }//  return result;  //}static QCString escapeLabelName(const char *s){  QCString result;  const char *p=s;  char c;  while ((c=*p++))  {    switch (c)    {      case '%': result+="\\%"; break;      case '|': result+="\\texttt{\"|}"; break;      case '!': result+="\"!"; break;      default: result+=c;    }  }  return result;}static QCString escapeMakeIndexChars(LatexGenerator *g,QTextStream &t,const char *s){  QCString result;  const char *p=s;  char str[2];  str[1]=0;  char c;  while ((c=*p++))  {    switch (c)    {      case '!': t << "\"!"; break;      case '"': t << "\"\""; break;      case '@': t << "\"@"; break;      case '|': t << "\\texttt{\"|}"; break;      case '[': t << "["; break;      case ']': t << "]"; break;      default:  str[0]=c; g->docify(str); break;    }  }  return result;}LatexGenerator::LatexGenerator() : OutputGenerator(){  dir=Config_getString("LATEX_OUTPUT");  col=0;  //printf("LatexGenerator::LatexGenerator() insideTabbing=FALSE\n");  insideTabbing=FALSE;  firstDescItem=TRUE;  insidePre=FALSE;}LatexGenerator::~LatexGenerator(){}//LatexGenerator::LatexGenerator(const LatexGenerator &g)//  : OutputGenerator(g)//{//  col=g.col;//}void LatexGenerator::append(const OutputGenerator *g){  t << g->getContents();  col+=((LatexGenerator *)g)->col;  insideTabbing=insideTabbing || ((LatexGenerator *)g)->insideTabbing;  firstDescItem = ((LatexGenerator *)g)->firstDescItem;  insidePre = insidePre || ((LatexGenerator *)g)->insidePre;  //printf("LatexGenerator::append(%s) insideTabbing=%s\n", g->getContents().data(),  //    insideTabbing ? "TRUE" : "FALSE" );}OutputGenerator *LatexGenerator::copy(){  LatexGenerator *result = new LatexGenerator;  result->insideTabbing=insideTabbing;  result->insidePre=insidePre;  return result;}void LatexGenerator::init(){  QCString dir=Config_getString("LATEX_OUTPUT");  QDir d(dir);  if (!d.exists() && !d.mkdir(dir))  {    err("Could not create output directory %s\n",dir.data());    exit(1);  }    QCString fileName=dir+"/Makefile";  QFile file(fileName);  if (!file.open(IO_WriteOnly))  {    err("Could not open file %s for writing\n",fileName.data());    exit(1);  }  QTextStream t(&file);  t << "all: refman.dvi" << endl    << endl    << "ps: refman.ps" << endl    << endl    << "pdf: refman.pdf" << endl    << endl    << "ps_2on1: refman_2on1.ps" << endl    << endl    << "pdf_2on1: refman_2on1.pdf" << endl    << endl    << "refman.ps: refman.dvi" << endl    << "\tdvips -o refman.ps refman.dvi" << endl    << endl;    if (Config_getBool("USE_PDFLATEX")) // use pdflatex instead of latex    {      t << "refman.pdf: refman.tex" << endl;      t << "\tpdflatex refman.tex" << endl;      t << "\tmakeindex refman.idx" << endl;      t << "\tpdflatex refman.tex" << endl << endl;    }    else // otherwise use ps2pdf: not as nice :(    {      t << "refman.pdf: refman.ps" << endl;#if defined(_MSC_VER)      // ps2pdf.bat does not work properly from a makefile using GNU make!      t << "\tgswin32c -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite "           "-sOutputFile=refman.pdf -c save pop -f refman.ps" << endl << endl;#else      t << "\tps2pdf refman.ps refman.pdf" << endl << endl;#endif    }      t << "refman_2on1.ps: refman.ps" << endl    << "\tpsnup -2 refman.ps >refman_2on1.ps" << endl    << endl    << "refman_2on1.pdf: refman_2on1.ps" << endl#if defined(_MSC_VER)    // ps2pdf.bat does not work properly from a makefile using GNU make!    << "\tgswin32c -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite "           "-sOutputFile=refman_2on1.pdf -c save pop -f refman_2on1.ps" << endl#else    << "\tps2pdf refman_2on1.ps refman_2on1.pdf" << endl#endif    << endl    << "refman.dvi: refman.tex doxygen.sty" << endl    << "\techo \"Running latex...\"" << endl    << "\tlatex refman.tex" << endl    << "\techo \"Running makeindex...\"" << endl    << "\tmakeindex refman.idx" << endl    << "\techo \"Rerunning latex....\"" << endl    << "\tlatex refman.tex" << endl    << "\tlatex_count=5" << endl    << "\twhile egrep -s 'Rerun (LaTeX|to get cross-references right)' refman.log && [ $latex_count -gt 0 ] ;\\" << endl    << "\t    do \\" << endl    << "\t      echo \"Rerunning latex....\" ;\\" << endl    << "\t      latex refman.tex ;\\" << endl    << "\t      latex_count=`expr $latex_count - 1` ;\\" << endl    << "\t    done" << endl << endl    << "clean:" << endl    << "\trm -f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out" << endl;}static void writeDefaultHeaderPart1(QTextStream &t){  // part 1  QCString paperName;  if (Config_getBool("LATEX_BATCHMODE")) t << "\\batchmode" << endl;  QCString &paperType=Config_getEnum("PAPER_TYPE");  if (paperType=="a4wide")     paperName="a4";   else     paperName=paperType;  t << "\\documentclass[" << paperName << "paper";  //if (Config_getBool("PDF_HYPERLINKS")) t << ",ps2pdf";  t << "]{";  if (Config_getBool("COMPACT_LATEX")) t << "article"; else t << "book";  t << "}\n";  if (paperType=="a4wide") t << "\\usepackage{a4wide}\n";  t << "\\usepackage{makeidx}\n"    "\\usepackage{fancyhdr}\n"    "\\usepackage{graphicx}\n"    "\\usepackage{float}\n"    "\\usepackage{alltt}\n";  if (Config_getBool("PDF_HYPERLINKS"))   {    t << "\\usepackage{times}" << endl;    t << "\\ifx\\pdfoutput\\undefined" << endl      << "\\usepackage[ps2pdf," << endl      << "            pagebackref=true," << endl      << "            colorlinks=true," << endl      << "            linkcolor=blue" << endl      << "           ]{hyperref}" << endl      << "\\else" << endl      << "\\usepackage[pdftex," << endl      << "            pagebackref=true," << endl      << "            colorlinks=true," << endl      << "            linkcolor=blue" << endl      << "           ]{hyperref}" << endl      << "\\fi" << endl;  }  // Try to get the command for switching on the language  // support  QCString sLanguageSupportCommand(      theTranslator->latexLanguageSupportCommand());  if (!sLanguageSupportCommand.isEmpty())  {    // The command is not empty.  Put it to the output.    // if the command is empty, no output is needed.    t << sLanguageSupportCommand;  }  t << "\\usepackage{doxygen}\n";  QStrList &extraPackages = Config_getList("EXTRA_PACKAGES");  const char *s=extraPackages.first();  while (s)  {    t << "\\usepackage{" << s << "}\n";    s=extraPackages.next();  }  t << "\\makeindex\n"    "\\setcounter{tocdepth}{1}\n"    "\\setlength{\\footrulewidth}{0.4pt}\n"    "\\begin{document}\n"    "\\begin{titlepage}\n"    "\\vspace*{7cm}\n"    "\\begin{center}\n"    "{\\Large ";}static void writeDefaultHeaderPart2(QTextStream &t){  // part 2  t << "}\\\\" << endl    << "\\vspace*{1cm}" << endl    << "{\\large ";}static void writeDefaultHeaderPart3(QTextStream &t){  // part 3  t << " Doxygen " << versionString << "}\\\\" << endl    << "\\vspace*{0.5cm}" << endl    << "{\\small " << dateToString(TRUE) << "}\\\\" << endl    << "\\end{center}" << endl    << "\\end{titlepage}" << endl;  if (!Config_getBool("COMPACT_LATEX")) t << "\\clearemptydoublepage\n";  t << "\\pagenumbering{roman}\n";  t << "\\tableofcontents\n";  if (!Config_getBool("COMPACT_LATEX")) t << "\\clearemptydoublepage\n";  t << "\\pagenumbering{arabic}\n";}static void writeDefaultStyleSheetPart1(QTextStream &t){  // part 1  t << "\\NeedsTeXFormat{LaTeX2e}\n";  t << "\\ProvidesPackage{doxygen}\n";  t << "\\RequirePackage{calc}\n";  t << "\\RequirePackage{array}\n";  t << "\\pagestyle{fancyplain}\n";  t << "\\addtolength{\\headwidth}{\\marginparsep}\n";  t << "\\addtolength{\\headwidth}{\\marginparwidth}\n";  t << "\\newcommand{\\clearemptydoublepage}{\\newpage{\\pagestyle{empty}";  t << "\\cleardoublepage}}\n";  if (!Config_getBool("COMPACT_LATEX"))     t << "\\renewcommand{\\chaptermark}[1]{\\markboth{#1}{}}\n";  t << "\\renewcommand{\\sectionmark}[1]{\\markright{\\thesection\\ #1}}\n";  t << "\\lhead[\\fancyplain{}{\\bfseries\\thepage}]\n";  t << "        {\\fancyplain{}{\\bfseries\\rightmark}}\n";  t << "\\rhead[\\fancyplain{}{\\bfseries\\leftmark}]\n";  t << "        {\\fancyplain{}{\\bfseries\\thepage}}\n";  t << "\\rfoot[\\fancyplain{}{\\bfseries\\scriptsize ";}static void writeDefaultStyleSheetPart2(QTextStream &t){  t << "\\lfoot[]{\\fancyplain{}{\\bfseries\\scriptsize ";}static void writeDefaultStyleSheetPart3(QTextStream &t){  t << "}}\n";  t << "\\cfoot{}\n";  t << "\\newenvironment{CompactList}\n";  t << "{\\begin{list}{}{\n";  t << "  \\setlength{\\leftmargin}{0.5cm}\n";  t << "  \\setlength{\\itemsep}{0pt}\n";  t << "  \\setlength{\\parsep}{0pt}\n";  t << "  \\setlength{\\topsep}{0pt}\n";  t << "  \\renewcommand{\\makelabel}{}}}\n";  t << "{\\end{list}}\n";  t << "\\newenvironment{CompactItemize}\n";  t << "{\n";  t << "  \\begin{itemize}\n";  t << "  \\setlength{\\itemsep}{-3pt}\n";  t << "  \\setlength{\\parsep}{0pt}\n";  t << "  \\setlength{\\topsep}{0pt}\n";  t << "  \\setlength{\\partopsep}{0pt}\n";  t << "}\n";  t << "{\\end{itemize}}\n";  t << "\\newcommand{\\PBS}[1]{\\let\\temp=\\\\#1\\let\\\\=\\temp}\n";  t << "\\newlength{\\tmplength}\n";  t << "\\newenvironment{TabularC}[1]\n";  t << "{\n";  t << "\\setlength{\\tmplength}\n";  t << "     {\\linewidth/(#1)-\\tabcolsep*2-\\arrayrulewidth*(#1+1)/(#1)}\n";  t << "      \\par\\begin{tabular*}{\\linewidth}\n";  t << "             {*{#1}{|>{\\PBS\\raggedright\\hspace{0pt}}p{\\the\\tmplength}}|}\n";  t << "}\n";  t << "{\\end{tabular*}\\par}\n";  t << "\\newcommand{\\entrylabel}[1]{\n";  t << "   {\\parbox[b]{\\labelwidth-4pt}{\\makebox[0pt][l]{\\textbf{#1}}\\\\}}}\n";  t << "\\newenvironment{Desc}\n";  t << "{\\begin{list}{}\n";  t << "  {\n";  t << "    \\settowidth{\\labelwidth}{40pt}\n";  t << "    \\setlength{\\leftmargin}{\\labelwidth}\n";  t << "    \\setlength{\\parsep}{0pt}\n";  t << "    \\setlength{\\itemsep}{-4pt}\n";  t << "    \\renewcommand{\\makelabel}{\\entrylabel}\n";  t << "  }\n";  t << "}\n";  t << "{\\end{list}}\n";  t << "\\newenvironment{Indent}\n";  t << "  {\\begin{list}{}{\\setlength{\\leftmargin}{0.5cm}}\n";  t << "      \\item[]\\ignorespaces}\n";  t << "  {\\unskip\\end{list}}\n";  t << "\\setlength{\\parindent}{0cm}\n";  t << "\\setlength{\\parskip}{0.2cm}\n";  t << "\\addtocounter{secnumdepth}{1}\n";  t << "\\sloppy\n";}void LatexGenerator::writeHeaderFile(QFile &f){  QTextStream t(&f);  writeDefaultHeaderPart1(t);  t << "Your title here";  writeDefaultHeaderPart2(t);  t << "Generated by";  writeDefaultHeaderPart3(t);}void LatexGenerator::writeStyleSheetFile(QFile &f){  QTextStream t(&f);#if QT_VERSION >= 200  t.setEncoding(QTextStream::Latin1);#endif  writeDefaultStyleSheetPart1(t);  QCString &projectName = Config_getString("PROJECT_NAME");  t << theTranslator->trGeneratedAt( dateToString(TRUE), projectName );  t << " doxygen " << theTranslator->trWrittenBy() << " ";  t << "Dimitri van Heesch \\copyright~1997-2001";  writeDefaultStyleSheetPart2(t);  t << theTranslator->trGeneratedAt( dateToString(TRUE), projectName );  t << " doxygen " << theTranslator->trWrittenBy() << " ";  t << "Dimitri van Heesch \\copyright~1997-2001";  writeDefaultStyleSheetPart3(t);}void LatexGenerator::startFile(const char *name,const char *,const char *,bool){  QCString fileName=name;  if (fileName.right(4)!=".tex" && fileName.right(4)!=".sty") fileName+=".tex";  startPlainFile(fileName);}void LatexGenerator::endFile(){  endPlainFile();}//void LatexGenerator::writeIndex()//{//  startFile("refman.tex");//}   void LatexGenerator::startProjectNumber(){  t << "\\\\[1ex]\\large "; }void LatexGenerator::startIndexSection(IndexSections is){  bool &compactLatex = Config_getBool("COMPACT_LATEX");  QCString &latexHeader = Config_getString("LATEX_HEADER");  switch (is)  {    case isTitlePageStart:      {        if (latexHeader.isEmpty())        {          writeDefaultHeaderPart1(t);        }        else        {          QCString header = fileToString(latexHeader);          t << substituteKeywords(header,0);        }      }      break;    case isTitlePageAuthor:      if (latexHeader.isEmpty())

⌨️ 快捷键说明

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