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