📄 latexgen.cpp
字号:
/****************************************************************************** * * $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 + -