1 /****************************************************************************** 2 * 3 * 4 * 5 * Copyright (C) 1997-2015 by Dimitri van Heesch. 6 * 7 * Permission to use, copy, modify, and distribute this software and its 8 * documentation under the terms of the GNU General Public License is hereby 9 * granted. No representations are made about the suitability of this software 10 * for any purpose. It is provided "as is" without express or implied warranty. 11 * See the GNU General Public License for more details. 12 * 13 * Documents produced by Doxygen are derivative works derived from the 14 * input used in their production; they are not affected by this license. 15 * 16 */ 17 18 #ifndef LATEXGEN_H 19 #define LATEXGEN_H 20 21 #include "config.h" 22 #include "outputgen.h" 23 24 #define LATEX_STYLE_EXTENSION ".sty" 25 26 class TextStream; 27 28 class LatexCodeGenerator : public CodeOutputInterface 29 { 30 public: 31 LatexCodeGenerator(TextStream &t,const QCString &relPath,const QCString &sourceFile); 32 LatexCodeGenerator(TextStream &t); 33 void setRelativePath(const QCString &path); 34 void setSourceFileName(const QCString &sourceFileName); 35 void codify(const QCString &text) override; 36 void writeCodeLink(CodeSymbolType type, 37 const QCString &ref,const QCString &file, 38 const QCString &anchor,const QCString &name, 39 const QCString &tooltip) override; writeTooltip(const QCString &,const DocLinkInfo &,const QCString &,const QCString &,const SourceLinkInfo &,const SourceLinkInfo &)40 void writeTooltip(const QCString &, 41 const DocLinkInfo &, 42 const QCString &, 43 const QCString &, 44 const SourceLinkInfo &, 45 const SourceLinkInfo & 46 ) override{} 47 void writeLineNumber(const QCString &,const QCString &,const QCString &,int,bool) override; 48 void startCodeLine(bool) override; 49 void endCodeLine() override; 50 void startFontClass(const QCString &) override; 51 void endFontClass() override; writeCodeAnchor(const QCString &)52 void writeCodeAnchor(const QCString &) override {} setCurrentDoc(const Definition *,const QCString &,bool)53 void setCurrentDoc(const Definition *,const QCString &,bool) override {} addWord(const QCString &,bool)54 void addWord(const QCString &,bool) override {} 55 void startCodeFragment(const QCString &style) override; 56 void endCodeFragment(const QCString &style) override; 57 58 // extra methods not part of CodeOutputInterface incUsedTableLevel()59 void incUsedTableLevel() { m_usedTableLevel++; } decUsedTableLevel()60 void decUsedTableLevel() { m_usedTableLevel--; } usedTableLevel()61 int usedTableLevel() const { return m_usedTableLevel; } 62 63 private: 64 void _writeCodeLink(const QCString &className, 65 const QCString &ref,const QCString &file, 66 const QCString &anchor,const QCString &name, 67 const QCString &tooltip); 68 void docify(const QCString &str); 69 bool m_streamSet = false; 70 TextStream &m_t; 71 QCString m_relPath; 72 QCString m_sourceFileName; 73 int m_col = 0; 74 bool m_doxyCodeLineOpen = false; 75 int m_usedTableLevel = 0; 76 }; 77 78 /** Generator for LaTeX output. */ 79 class LatexGenerator : public OutputGenerator 80 { 81 public: 82 LatexGenerator(); 83 LatexGenerator(const LatexGenerator &); 84 LatexGenerator &operator=(const LatexGenerator &); 85 virtual ~LatexGenerator(); 86 virtual std::unique_ptr<OutputGenerator> clone() const; 87 88 static void init(); 89 void cleanup(); 90 static void writeStyleSheetFile(TextStream &t); 91 static void writeHeaderFile(TextStream &t); 92 static void writeFooterFile(TextStream &t); 93 type()94 virtual OutputType type() const { return Latex; } 95 96 // --- CodeOutputInterface codify(const QCString & text)97 void codify(const QCString &text) 98 { m_codeGen.codify(text); } writeCodeLink(CodeSymbolType type,const QCString & ref,const QCString & file,const QCString & anchor,const QCString & name,const QCString & tooltip)99 void writeCodeLink(CodeSymbolType type, 100 const QCString &ref, const QCString &file, 101 const QCString &anchor,const QCString &name, 102 const QCString &tooltip) 103 { m_codeGen.writeCodeLink(type,ref,file,anchor,name,tooltip); } writeLineNumber(const QCString & ref,const QCString & file,const QCString & anchor,int lineNumber,bool writeLineAnchor)104 void writeLineNumber(const QCString &ref,const QCString &file,const QCString &anchor,int lineNumber, bool writeLineAnchor) 105 { m_codeGen.writeLineNumber(ref,file,anchor,lineNumber,writeLineAnchor); } writeTooltip(const QCString & id,const DocLinkInfo & docInfo,const QCString & decl,const QCString & desc,const SourceLinkInfo & defInfo,const SourceLinkInfo & declInfo)106 void writeTooltip(const QCString &id, const DocLinkInfo &docInfo, const QCString &decl, 107 const QCString &desc, const SourceLinkInfo &defInfo, const SourceLinkInfo &declInfo 108 ) 109 { m_codeGen.writeTooltip(id,docInfo,decl,desc,defInfo,declInfo); } startCodeLine(bool hasLineNumbers)110 void startCodeLine(bool hasLineNumbers) 111 { m_codeGen.startCodeLine(hasLineNumbers); } endCodeLine()112 void endCodeLine() 113 { m_codeGen.endCodeLine(); } startFontClass(const QCString & s)114 void startFontClass(const QCString &s) 115 { m_codeGen.startFontClass(s); } endFontClass()116 void endFontClass() 117 { m_codeGen.endFontClass(); } writeCodeAnchor(const QCString & anchor)118 void writeCodeAnchor(const QCString &anchor) 119 { m_codeGen.writeCodeAnchor(anchor); } startCodeFragment(const QCString & style)120 void startCodeFragment(const QCString &style) 121 { m_codeGen.startCodeFragment(style); } endCodeFragment(const QCString & style)122 void endCodeFragment(const QCString &style) 123 { m_codeGen.endCodeFragment(style); } 124 // --------------------------- 125 126 127 void writeDoc(DocNode *,const Definition *ctx,const MemberDef *,int id); 128 129 void startFile(const QCString &name,const QCString &manName,const QCString &title,int id); writeSearchInfo()130 void writeSearchInfo() {} writeFooter(const QCString &)131 void writeFooter(const QCString &) {} 132 void endFile(); 133 void clearBuffer(); 134 135 void startIndexSection(IndexSections); 136 void endIndexSection(IndexSections); 137 void writePageLink(const QCString &,bool); 138 void startProjectNumber(); endProjectNumber()139 void endProjectNumber() {} 140 void writeStyleInfo(int part); 141 void startTitleHead(const QCString &); 142 void startTitle(); 143 void endTitleHead(const QCString &,const QCString &name); endTitle()144 void endTitle() { m_t << "}"; } 145 146 void newParagraph(); 147 void startParagraph(const QCString &classDef); 148 void endParagraph(); 149 void writeString(const QCString &text); startIndexListItem()150 void startIndexListItem() {} endIndexListItem()151 void endIndexListItem() {} startIndexList()152 void startIndexList() { m_t << "\\begin{DoxyCompactList}\n"; } endIndexList()153 void endIndexList() { m_t << "\\end{DoxyCompactList}\n"; } 154 void startIndexKey(); 155 void endIndexKey(); 156 void startIndexValue(bool); 157 void endIndexValue(const QCString &,bool); startItemList()158 void startItemList() { m_t << "\\begin{DoxyCompactItemize}\n"; } endItemList()159 void endItemList() { m_t << "\\end{DoxyCompactItemize}\n"; } 160 void startIndexItem(const QCString &ref,const QCString &file); 161 void endIndexItem(const QCString &ref,const QCString &file); 162 void docify(const QCString &text); 163 void writeObjectLink(const QCString &ref,const QCString &file, 164 const QCString &anchor,const QCString &name); 165 166 void startTextLink(const QCString &,const QCString &); 167 void endTextLink(); 168 void startHtmlLink(const QCString &url); 169 void endHtmlLink(); startTypewriter()170 void startTypewriter() { m_t << "{\\ttfamily "; } endTypewriter()171 void endTypewriter() { m_t << "}"; } 172 void startGroupHeader(int); 173 void endGroupHeader(int); startItemListItem()174 void startItemListItem() { m_t << "\\item \n"; } endItemListItem()175 void endItemListItem() {} 176 startMemberSections()177 void startMemberSections() {} endMemberSections()178 void endMemberSections() {} startHeaderSection()179 void startHeaderSection() {} endHeaderSection()180 void endHeaderSection() {} 181 void startMemberHeader(const QCString &,int); 182 void endMemberHeader(); startMemberSubtitle()183 void startMemberSubtitle() {} endMemberSubtitle()184 void endMemberSubtitle() {} startMemberDocList()185 void startMemberDocList() {} endMemberDocList()186 void endMemberDocList() {} 187 void startMemberList(); 188 void endMemberList(); 189 void startInlineHeader(); 190 void endInlineHeader(); 191 void startAnonTypeScope(int); 192 void endAnonTypeScope(int); 193 void startMemberItem(const QCString &,int,const QCString &); 194 void endMemberItem(); 195 void startMemberTemplateParams(); 196 void endMemberTemplateParams(const QCString &,const QCString &); startCompoundTemplateParams()197 void startCompoundTemplateParams() { startSubsubsection(); } endCompoundTemplateParams()198 void endCompoundTemplateParams() { endSubsubsection(); } 199 200 void startMemberGroupHeader(bool); 201 void endMemberGroupHeader(); 202 void startMemberGroupDocs(); 203 void endMemberGroupDocs(); 204 void startMemberGroup(); 205 void endMemberGroup(bool); 206 insertMemberAlign(bool)207 void insertMemberAlign(bool) {} insertMemberAlignLeft(int,bool)208 void insertMemberAlignLeft(int,bool){} 209 writeRuler()210 void writeRuler() { m_t << "\n\n"; } 211 void writeAnchor(const QCString &fileName,const QCString &name); startEmphasis()212 void startEmphasis() { m_t << "{\\em "; } endEmphasis()213 void endEmphasis() { m_t << "}"; } startBold()214 void startBold() { m_t << "{\\bfseries "; } endBold()215 void endBold() { m_t << "}"; } 216 void startDescription(); 217 void endDescription(); 218 void startDescItem(); 219 void endDescItem(); 220 void lineBreak(const QCString &style=QCString()); 221 void startMemberDoc(const QCString &,const QCString &,const QCString &,const QCString &,int,int,bool); 222 void endMemberDoc(bool); 223 void startDoxyAnchor(const QCString &,const QCString &,const QCString &,const QCString &,const QCString &); 224 void endDoxyAnchor(const QCString &,const QCString &); 225 void writeChar(char c); writeLatexSpacing()226 void writeLatexSpacing() { m_t << "\\hspace{0.3cm}"; } 227 void writeStartAnnoItem(const QCString &type,const QCString &file, 228 const QCString &path,const QCString &name); 229 void writeEndAnnoItem(const QCString &name); startSubsection()230 void startSubsection() { m_t << "\\subsection*{"; } endSubsection()231 void endSubsection() { m_t << "}\n"; } startSubsubsection()232 void startSubsubsection() { m_t << "\\subsubsection*{"; } endSubsubsection()233 void endSubsubsection() { m_t << "}\n"; } startCenter()234 void startCenter() { m_t << "\\begin{center}\n"; } endCenter()235 void endCenter() { m_t << "\\end{center}\n"; } startSmall()236 void startSmall() { m_t << "\\footnotesize "; } endSmall()237 void endSmall() { m_t << "\\normalsize "; } 238 void startMemberDescription(const QCString &,const QCString &,bool); 239 void endMemberDescription(); startMemberDeclaration()240 void startMemberDeclaration() {} endMemberDeclaration(const QCString &,const QCString &)241 void endMemberDeclaration(const QCString &,const QCString &) {} writeInheritedSectionTitle(const QCString &,const QCString &,const QCString &,const QCString &,const QCString &,const QCString &)242 void writeInheritedSectionTitle(const QCString &,const QCString &,const QCString &, 243 const QCString &,const QCString &,const QCString &) {} startDescList(SectionTypes)244 void startDescList(SectionTypes) { m_t << "\\begin{Desc}\n\\item["; } endDescList()245 void endDescList() { m_t << "\\end{Desc}\n"; } 246 void startExamples(); 247 void endExamples(); 248 void startParamList(ParamListTypes,const QCString &title); 249 void endParamList(); startDescForItem()250 void startDescForItem() { m_t << "\\par\n"; } endDescForItem()251 void endDescForItem() {} 252 void startSection(const QCString &,const QCString &,SectionType); 253 void endSection(const QCString &,SectionType); 254 void addIndexItem(const QCString &,const QCString &); startIndent()255 void startIndent() {} endIndent()256 void endIndent() {} writeSynopsis()257 void writeSynopsis() {} 258 void startClassDiagram(); 259 void endClassDiagram(const ClassDiagram &,const QCString &,const QCString &); 260 void startPageRef(); 261 void endPageRef(const QCString &,const QCString &); startQuickIndices()262 void startQuickIndices() {} endQuickIndices()263 void endQuickIndices() {} writeSplitBar(const QCString &)264 void writeSplitBar(const QCString &) {} writeNavigationPath(const QCString &)265 void writeNavigationPath(const QCString &) {} writeLogo()266 void writeLogo() {} writeQuickLinks(bool,HighlightedItem,const QCString &)267 void writeQuickLinks(bool,HighlightedItem,const QCString &) {} writeSummaryLink(const QCString &,const QCString &,const QCString &,bool)268 void writeSummaryLink(const QCString &,const QCString &,const QCString &,bool) {} startContents()269 void startContents() {} endContents()270 void endContents() {} 271 void writeNonBreakableSpace(int); 272 273 void startDescTable(const QCString &title); 274 void endDescTable(); 275 void startDescTableRow(); 276 void endDescTableRow(); 277 void startDescTableTitle(); 278 void endDescTableTitle(); 279 void startDescTableData(); 280 void endDescTableData(); 281 void lastIndexPage(); 282 283 void startDotGraph(); 284 void endDotGraph(DotClassGraph &); 285 void startInclDepGraph(); 286 void endInclDepGraph(DotInclDepGraph &); 287 void startCallGraph(); 288 void startGroupCollaboration(); 289 void endGroupCollaboration(DotGroupCollaboration &g); 290 void endCallGraph(DotCallGraph &); 291 void startDirDepGraph(); 292 void endDirDepGraph(DotDirDeps &g); writeGraphicalHierarchy(DotGfxHierarchyTable &)293 void writeGraphicalHierarchy(DotGfxHierarchyTable &) {} 294 startTextBlock(bool)295 void startTextBlock(bool) {} endTextBlock(bool)296 void endTextBlock(bool) {} 297 startMemberDocPrefixItem()298 void startMemberDocPrefixItem() {} endMemberDocPrefixItem()299 void endMemberDocPrefixItem() { m_t << "\\\\\n"; } startMemberDocName(bool)300 void startMemberDocName(bool) {} endMemberDocName()301 void endMemberDocName() {} 302 void startParameterType(bool,const QCString &); 303 void endParameterType(); 304 void startParameterName(bool); 305 void endParameterName(bool,bool,bool); 306 void startParameterList(bool); 307 void endParameterList(); 308 void exceptionEntry(const QCString &,bool); 309 310 void startConstraintList(const QCString &); 311 void startConstraintParam(); 312 void endConstraintParam(); 313 void startConstraintType(); 314 void endConstraintType(); 315 void startConstraintDocs(); 316 void endConstraintDocs(); 317 void endConstraintList(); 318 319 void startMemberDocSimple(bool); 320 void endMemberDocSimple(bool); 321 void startInlineMemberType(); 322 void endInlineMemberType(); 323 void startInlineMemberName(); 324 void endInlineMemberName(); 325 void startInlineMemberDoc(); 326 void endInlineMemberDoc(); 327 328 void startLabels(); 329 void writeLabel(const QCString &l,bool isLast); 330 void endLabels(); 331 setCurrentDoc(const Definition *,const QCString &,bool)332 void setCurrentDoc(const Definition *,const QCString &,bool) {} addWord(const QCString &,bool)333 void addWord(const QCString &,bool) {} 334 335 336 private: 337 bool m_insideTabbing = false; 338 bool m_firstDescItem = true; 339 bool m_disableLinks = false; 340 QCString m_relPath; 341 int m_indent = 0; 342 bool templateMemberItem = false; 343 LatexCodeGenerator m_codeGen; 344 }; 345 346 #endif 347