summaryrefslogtreecommitdiffstats
path: root/templates
diff options
context:
space:
mode:
authorDimitri van Heesch <dimitri@stack.nl>2015-01-01 20:04:54 (GMT)
committerDimitri van Heesch <dimitri@stack.nl>2015-08-27 13:45:02 (GMT)
commit02a0c353a8947290a3191aead59db08dc84766ce (patch)
treef367cb6bf3f91c2b92160144f37eed33decdc4a0 /templates
parent56987af3987f40ac77e70cd39ebbdac3702c1ce2 (diff)
downloadDoxygen-02a0c353a8947290a3191aead59db08dc84766ce.zip
Doxygen-02a0c353a8947290a3191aead59db08dc84766ce.tar.gz
Doxygen-02a0c353a8947290a3191aead59db08dc84766ce.tar.bz2
Started with generating LaTeX output via the template engine
Diffstat (limited to 'templates')
-rw-r--r--templates/html/htmlbase.tpl4
-rw-r--r--templates/html/htmltypeconstraints.tpl2
-rw-r--r--templates/latex/doxygen.sty6
-rw-r--r--templates/latex/latexannotated.tpl9
-rw-r--r--templates/latex/latexclass.tpl114
-rw-r--r--templates/latex/latexfiles.tpl0
-rw-r--r--templates/latex/latexinclude.tpl32
-rw-r--r--templates/latex/latexlayout.tpl35
-rw-r--r--templates/latex/latexmakefile.tpl64
-rw-r--r--templates/latex/latexmodules.tpl0
-rw-r--r--templates/latex/latexnamespaces.tpl0
-rw-r--r--templates/latex/latexobjlink.tpl6
-rw-r--r--templates/latex/latexrefman.tpl227
-rw-r--r--templates/latex/latextypeconstraints.tpl12
14 files changed, 505 insertions, 6 deletions
diff --git a/templates/html/htmlbase.tpl b/templates/html/htmlbase.tpl
index 5ee7f3e..84807ec 100644
--- a/templates/html/htmlbase.tpl
+++ b/templates/html/htmlbase.tpl
@@ -196,7 +196,7 @@ $(document).ready(function(){initNavTree('{{ page.fileName }}{% if page_postfix
{% if config.HTML_TIMESTAMP %}
{{ tr.generatedAt:doxygen.date,config.PROJECT_NAME }}
{% else %}
-{{ tr.generatedby }}
+{{ tr.generatedBy }}
{% endif %}
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="{{ page.relPath }}doxygen.png" alt="doxygen"/></a> {{ doxygen.version }} </li>
@@ -207,7 +207,7 @@ $(document).ready(function(){initNavTree('{{ page.fileName }}{% if page_postfix
{% if config.HTML_TIMESTAMP %}
{{ tr.generatedAt:doxygen.date,config.PROJECT_NAME }}
{% else %}
-{{ tr.generatedby }}
+{{ tr.generatedBy }}
{% endif %}
&#160;<a href="http://www.doxygen.org/index.html"><img class="footer" src="{{ page.relPath }}doxygen.png" alt="doxygen"/></a>
{{ doxygen.version }}
diff --git a/templates/html/htmltypeconstraints.tpl b/templates/html/htmltypeconstraints.tpl
index 12c9581..b5a8cd0 100644
--- a/templates/html/htmltypeconstraints.tpl
+++ b/templates/html/htmltypeconstraints.tpl
@@ -1,5 +1,5 @@
{# obj should be a class or member #}
-{% if obj.typeConstraints|length>0 %}
+{% if obj.typeConstraints %}
<div class="typecontraint">
<dl><dt><b>{{ tr.typeConstraints }}</b></dt>
<dd><table border="0" cellspacing="2" cellpadding="0">
diff --git a/templates/latex/doxygen.sty b/templates/latex/doxygen.sty
index 53d198f..948acf7 100644
--- a/templates/latex/doxygen.sty
+++ b/templates/latex/doxygen.sty
@@ -409,10 +409,10 @@
% Used by parameter lists and simple sections
\newenvironment{Desc}
{\begin{list}{}{%
- \settowidth{\labelwidth}{40pt}%
- \setlength{\leftmargin}{\labelwidth}%
+ \settowidth{\labelwidth}{20pt}%
\setlength{\parsep}{0pt}%
- \setlength{\itemsep}{-4pt}%
+ \setlength{\itemsep}{0pt}%
+ \setlength{\leftmargin}{\labelwidth+\labelsep}%
\renewcommand{\makelabel}{\entrylabel}%
}
}{%
diff --git a/templates/latex/latexannotated.tpl b/templates/latex/latexannotated.tpl
new file mode 100644
index 0000000..0b6ecb5
--- /dev/null
+++ b/templates/latex/latexannotated.tpl
@@ -0,0 +1,9 @@
+\section{<{ tr.classList }>}
+<{ tr.classListDescription }>
+\begin{DoxyCompactList}
+<% for cls in classList %>
+\item\contentsline{section}
+{<% with obj=cls text=cls.name %><% include 'latexobjlink.tpl' %><% endwith %><% if cls.brief %>\\*<{ cls.brief }><% endif %>}
+{\pageref{<{ cls.fileName|raw }>}}{}
+<% endfor %>
+\end{DoxyCompactList}
diff --git a/templates/latex/latexclass.tpl b/templates/latex/latexclass.tpl
new file mode 100644
index 0000000..7671de0
--- /dev/null
+++ b/templates/latex/latexclass.tpl
@@ -0,0 +1,114 @@
+<# input: compound #>
+<% msg %>Generating LaTeX output for class <{ compound.name }><% endmsg %>
+\hypertarget{<{ compound.fileName|raw }>}{}\section{<{ compound.title }>}
+\label{<{ compound.fileName|raw }>}\index{<{ compound.name|texLabel }>@{<{ compound.name|texIndex }>}}
+<# brief description #>
+<% if compound.brief %>
+ <{ compound.brief }>
+
+<% endif %>
+<# compound includes #>
+<% if compound.includeInfo %>
+ <% with ii=compound.includeInfo %>
+ <% include 'latexinclude.tpl' %>
+ <% endwith %>
+
+
+<% endif %>
+<# inheritance graph #>
+ <% if compound.hasInheritanceDiagram %>
+ <{ tr.inheritanceDiagramFor:compound.name }>
+ <{ compound.inheritanceDiagram }>
+ <% else %>
+ <# textual inheritance list #>
+ <% if compound.inherits|length>0 %>
+ <% markers c in compound.inherits with tr.inheritsList:compound.inherits|length %>
+ <% with obj=c.class text=c.name %>
+ <% include 'latexobjlink.tpl' %>
+ <% endwith %>
+ <% endmarkers %>
+
+
+ <% endif %>
+ <% if compound.inheritedBy|length>0 %>
+ <% markers c in compound.inheritedBy with tr.inheritedByList:compound.inheritedBy|length %>
+ <% with obj=c.class text=c.name %>
+ <% include 'latexobjlink.tpl' %>
+ <% endwith %>
+ <% endmarkers %>
+
+
+ <% endif %>
+ <% endif %>
+<# collaboration graph #>
+ <% if compound.hasCollaborationDiagram %>
+ <{ tr.collaborationDiagramFor:compound.name }>
+ <{ compound.collaborationDiagram }>
+
+
+ <% endif %>
+<# member declarations #>
+<% if compound.hasDetails %>
+ <% if compound.anchor %>
+ \label{<{ compound.anchor|raw }>}
+ <% if config.PDF_HYPERLINKS and config.USE_PDFLATEX %>
+ \hypertarget{<% if compound.fileName %><{ compound.fileName|raw }>_<% endif %><{ compound.anchor|raw }>}{}
+ <% endif %>
+ <% endif %>
+ <% if config.COMPACT_LATEX %>\subsubsection<% else %>\subsection<% endif %>{<{ tr.detailedDesc }>}
+ <# template specifier #>
+ <% if compound.language=='cpp' and compound.templateDecls %>
+ <% spaceless %>
+ \subsubsection*{
+ <% for targList in compound.templateDecls %>
+ template$<$
+ <% for targ in targList %>
+ <{ targ.type }><% if targ.name %><{ space }><{ targ.name }><% endif %><% if targ.defVal %><{ space }>= <{ targ.defVal }><% endif %><% if not forloop.last %>, <% endif %>
+ <% endfor %>
+ $>$\\*
+ <% endfor %>
+ <{ compound.compoundType }><{ space }><{ compound.name }>
+ }
+ <% endspaceless %>
+
+
+ <% endif %>
+ <% if compound.brief and config.REPEAT_BRIEF %>
+ <{ compound.brief }>
+
+
+ <% endif %>
+ <{ compound.details }>
+
+
+ <# type constraints #>
+ <% with obj=compound %>
+ <% include 'latextypeconstraints.tpl' %>
+ <% endwith %>
+
+
+<% endif %>
+<% msg %>
+ <# examples #>
+ <% if compound.examples %>
+ <dl><dt><b><{ tr.examples }></b><dd>
+ <% markers obj in compound.examples with tr.exampleList:compound.examples|length %>
+ <% with text=obj.text %>
+ <% include 'htmlobjlink.tpl' %>
+ <% endwith %>
+ <% endmarkers %>
+ </dd></dl>
+ <% endif %>
+ <# source definition #>
+ <% if compound.sourceDef %>
+ <% markers obj in compound.sourceDef with tr.definedAtLineInSourceFile %>
+ <% with text=obj.text %>
+ <% include 'htmlobjlink.tpl' %>
+ <% endwith %>
+ <% endmarkers %>
+ <% endif %>
+<% endmsg %>
+<# detailed description #>
+<# member definitions #>
+<# used files #>
+<# separate member pages #>
diff --git a/templates/latex/latexfiles.tpl b/templates/latex/latexfiles.tpl
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/templates/latex/latexfiles.tpl
diff --git a/templates/latex/latexinclude.tpl b/templates/latex/latexinclude.tpl
new file mode 100644
index 0000000..c333056
--- /dev/null
+++ b/templates/latex/latexinclude.tpl
@@ -0,0 +1,32 @@
+<# input: ii with attributes (file,name,isImport,isLocal), compound with attribute language #>
+<% spaceless %>
+<% if ii.file or ii.name %>
+{\ttfamily<{ space }>
+ <% if compound.language=='java' or compound.language=='idl' %>
+ import
+ <% else %>
+ <% if ii.isImport %>
+ \#import
+ <% else %>
+ \#include
+ <% endif %>
+ <% endif %>
+ <{ space }>
+ <% if ii.isLocal %>
+ \char`\"{}
+ <% else %>
+ $<$
+ <% endif %>
+ <% if ii.name %>
+ <{ ii.name }>
+ <% else %>
+ <{ ii.file.name }>
+ <% endif %>
+ <% if ii.isLocal %>
+ \char`\"{}
+ <% else %>
+ $>$
+ <% endif %>
+}
+<% endif %>
+<% endspaceless %>
diff --git a/templates/latex/latexlayout.tpl b/templates/latex/latexlayout.tpl
new file mode 100644
index 0000000..290a4d5
--- /dev/null
+++ b/templates/latex/latexlayout.tpl
@@ -0,0 +1,35 @@
+{% msg %}----- Start generating LaTeX output for {{ config.PROJECT_NAME }} from template ----{% endmsg %}
+
+{% create 'refman.tex' from 'latexrefman.tpl' %}
+{% create 'Makefile' from 'latexmakefile.tpl' %}
+
+{# module index #}
+{% if moduleTree.tree %}
+ {% create 'modules.tex' from 'latexmodules.tpl' %}
+{% endif %}
+
+{# namespace index #}
+{% if namespaceTree.tree %}
+ {% create 'namespaces.tex' from 'latexnamespaces.tpl' %}
+{% endif %}
+
+{# class index #}
+{% if classTree.tree %}
+ {% create 'annotated.tex' from 'latexannotated.tpl' %}
+{% endif %}
+
+{# file index #}
+{% if fileTree.tree %}
+ {% create 'files.tex' from 'latexfiles.tpl' %}
+{% endif %}
+
+{# TODO: pages #}
+{# TODO: examples #}
+{# TODO: directories #}
+
+{# write class documentation pages #}
+{% for compound in classList %}
+ {% create compound.fileName|append:'.tex' from 'latexclass.tpl' %}
+{% endfor %}
+
+{% msg %}----- End generating LaTeX output for {{ config.PROJECT_NAME }} from template ----{% endmsg %}
diff --git a/templates/latex/latexmakefile.tpl b/templates/latex/latexmakefile.tpl
new file mode 100644
index 0000000..ba1eb76
--- /dev/null
+++ b/templates/latex/latexmakefile.tpl
@@ -0,0 +1,64 @@
+{% if config.USE_PDFLATEX %}
+all: refman.pdf
+
+pdf: refman.pdf
+
+refman.pdf: clean refman.tex
+ pdflatex refman
+ {{ config.MAKEINDEX_CMD_NAME }} refman.idx
+{# TODO: generateBib #}
+ pdflatex refman
+ latex_count=8 ; \
+ while egrep -s 'Rerun (LaTeX|to get cross-references right)' refman.log && [ $$latex_count -gt 0 ] ;\
+ do \
+ echo "Rerunning latex...." ;\
+ pdflatex refman ;\
+ latex_count=`expr $$latex_count - 1` ;\
+ done
+ {{ config.MAKEINDEX_CMD_NAME }} refman.idx
+ pdflatex refman
+{% else %}
+all: refman.dvi
+
+ps: refman.ps
+
+pdf: refman.pdf
+
+ps_2on1: refman_2on1.ps
+
+pdf_2on1: refman_2on1.pdf
+
+refman.ps: refman.dvi
+ dvips -o refman.ps refman.dvi
+
+refman.pdf: refman.ps
+ ps2pdf refman.ps refman.pdf
+
+refman.dvi: clean refman.tex doxygen.sty
+ echo "Running latex..."
+ {{ config.LATEX_CMD_NAME }} refman.tex
+ echo "Running makeindex..."
+ {{ config.MAKEINDEX_CMD_NAME }} refman.idx
+{# TODO: generateBib #}
+ echo "Rerunning latex...."
+ {{ config.LATEX_CMD_NAME }} refman.tex
+ latex_count=8 ; \
+ while egrep -s 'Rerun (LaTeX|to get cross-references right)' refman.log && [ $$latex_count -gt 0 ] ;\
+ do \
+ echo "Rerunning latex...." ;\
+ {{ config.LATEX_CMD_NAME }} refman.tex ;\
+ latex_count=`expr $$latex_count - 1` ;\
+ done
+ {{ config.MAKEINDEX_CMD_NAME }} refman.idx
+ {{ config.LATEX_CMD_NAME }} refman.tex
+
+refman_2on1.ps: refman.ps
+ psnup -2 refman.ps >refman_2on1.ps
+
+refman_2on1.pdf: refman_2on1.ps
+ ps2pdf refman_2on1.ps refman_2on1.pdf
+{% endif %}
+
+clean:
+ rm -f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out *.brf *.blg *.bbl refman.pdf
+
diff --git a/templates/latex/latexmodules.tpl b/templates/latex/latexmodules.tpl
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/templates/latex/latexmodules.tpl
diff --git a/templates/latex/latexnamespaces.tpl b/templates/latex/latexnamespaces.tpl
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/templates/latex/latexnamespaces.tpl
diff --git a/templates/latex/latexobjlink.tpl b/templates/latex/latexobjlink.tpl
new file mode 100644
index 0000000..89ecc2e
--- /dev/null
+++ b/templates/latex/latexobjlink.tpl
@@ -0,0 +1,6 @@
+<# inputs: obj, text #>
+<% if config.PDF_HYPERLINKS %>
+\hyperlink{<{ obj.fileName|raw }><% if obj.anchor %>_<{ obj.anchor }><% endif %>}{<{ text }>}
+<% else %>
+{\bf <{ text }>}
+<% endif %>
diff --git a/templates/latex/latexrefman.tpl b/templates/latex/latexrefman.tpl
new file mode 100644
index 0000000..27b7ea0
--- /dev/null
+++ b/templates/latex/latexrefman.tpl
@@ -0,0 +1,227 @@
+\documentclass[twoside]{<% if config.COMPACT_LATEX %>article<% else %>book<% endif %>}
+
+% Packages required by doxygen
+\usepackage{fixltx2e}
+\usepackage{calc}
+\usepackage{doxygen}
+\usepackage[export]{adjustbox} % also loads graphicx
+<% for package in config.LATEX_EXTRA_STYLESHEET %>
+\usepackage{<{package|stripExtension:'.sty'}>}
+<% endfor %>
+\usepackage{graphicx}
+\usepackage[utf8]{inputenc}
+\usepackage{makeidx}
+\usepackage{multicol}
+\usepackage{multirow}
+\PassOptionsToPackage{warn}{textcomp}
+\usepackage{textcomp}
+\usepackage[nointegrals]{wasysym}
+\usepackage[table]{xcolor}
+
+<# TODO: languageSupportCommand #>
+
+% Font selection
+\usepackage[T1]{fontenc}
+\usepackage[scaled=.90]{helvet}
+\usepackage{courier}
+\usepackage{amssymb}
+\usepackage{sectsty}
+\renewcommand{\familydefault}{\sfdefault}
+\allsectionsfont{
+ \fontseries{bc}\selectfont
+ \color{darkgray}
+}
+\renewcommand{\DoxyLabelFont}{
+ \fontseries{bc}\selectfont
+ \color{darkgray}
+}
+\newcommand{\+}{\discretionary{\mbox{\scriptsize$\hookleftarrow$}}{}{}}
+
+% Page & text layout
+\usepackage{geometry}
+\geometry{
+ <{ config.PAPER_TYPE }>paper,
+ top=2.5cm,
+ bottom=2.5cm,
+ left=2.5cm,
+ right=2.5cm
+}
+\tolerance=750
+\hfuzz=15pt
+\hbadness=750
+\setlength{\emergencystretch}{15pt}
+\setlength{\parindent}{0cm}
+\setlength{\parskip}{0.2cm}
+\makeatletter
+\renewcommand{\paragraph}{
+ \@startsection{paragraph}{4}{0ex}{-1.0ex}{1.0ex}{
+ \normalfont\normalsize\bfseries\SS@parafont
+ }
+}
+\renewcommand{\subparagraph}{
+ \@startsection{subparagraph}{5}{0ex}{-1.0ex}{1.0ex}{
+ \normalfont\normalsize\bfseries\SS@subparafont
+ }
+}
+\makeatother
+
+% Headers & footers
+\usepackage{fancyhdr}
+\pagestyle{fancyplain}
+\fancyhead[LE]{\fancyplain{}{\bfseries\thepage}}
+\fancyhead[CE]{\fancyplain{}{}}
+\fancyhead[RE]{\fancyplain{}{\bfseries\leftmark}}
+\fancyhead[LO]{\fancyplain{}{\bfseries\rightmark}}
+\fancyhead[CO]{\fancyplain{}{}}
+\fancyhead[RO]{\fancyplain{}{\bfseries\thepage}}
+\fancyfoot[LE]{\fancyplain{}{}}
+\fancyfoot[CE]{\fancyplain{}{}}
+\fancyfoot[RE]{\fancyplain{}{\bfseries\scriptsize <{ tr.generatedAt:doxygen.date,config.PROJECT_NAME }>}}
+\fancyfoot[LO]{\fancyplain{}{\bfseries\scriptsize <{ tr.generatedAt:doxygen.date,config.PROJECT_NAME }>}}
+\fancyfoot[CO]{\fancyplain{}{}}
+\fancyfoot[RO]{\fancyplain{}{}}
+\renewcommand{\footrulewidth}{0.4pt}
+<% if not config.COMPACT_LATEX %>
+\renewcommand{\chaptermark}[1]{
+ \markboth{ #1}{}%
+}
+<% endif %>
+\renewcommand{\sectionmark}[1]{
+ \markright{\thesection\ #1}
+}
+
+% Indices & bibliography
+\usepackage{natbib}
+\usepackage[titles]{tocloft}
+\setcounter{tocdepth}{3}
+\setcounter{secnumdepth}{5}
+\makeindex
+
+<% if config.EXTRA_PACKAGES %>
+% Packages requested by user
+<% for package in config.EXTRA_PACKAGES %>
+\usepackage{<{ package }>}
+<% endfor %>
+<% endif %>
+
+<% if config.PDF_HYPERLINKS %>
+% Hyperlinks (required, but should be loaded last)
+\usepackage{ifpdf}
+\ifpdf
+ \usepackage[pdftex,pagebackref=true]{hyperref}
+\else
+ \usepackage[ps2pdf,pagebackref=true]{hyperref}
+\fi
+\hypersetup{
+ colorlinks=true,
+ linkcolor=blue,
+ citecolor=blue,
+ unicode
+}
+<% endif %>
+
+% Custom commands
+\newcommand{\clearemptydoublepage}{
+ \newpage{\pagestyle{empty}\cleardoublepage}
+}
+
+%===== C O N T E N T S =====
+
+\begin{document}
+<# TODO: select language for greek #>
+
+% Titlepage & ToC
+<% if config.USE_PDFLATEX and config.PDF_HYPERLINKS %>
+\hypersetup{pageanchor=false,
+ bookmarks=true,
+ bookmarksnumbered=true,
+ pdfencoding=unicode
+ }
+<% endif %>
+\pagenumbering{roman}
+\begin{titlepage}
+<% tabbing %>
+\vspace*{7cm}
+\begin{center}%
+{\Large
+<% if config.PROJECT_NAME %>
+ <{ config.PROJECT_NAME }>
+<% else %>
+ <{ tr.referenceManual }>
+<% endif %>
+<% if config.PROJECT_NUMBER %>
+\\[1ex]\large <{ config.PROJECT_NUMBER }>
+<% endif %>
+}\\
+\vspace*{1cm}{\large <{ tr.generatedBy }> Doxygen <{ doxygen.version }>}\\
+\vspace*{0.5cm}{\small <{ doxygen.date }>}\\
+\end{center}
+<% endtabbing %>
+\end{titlepage}
+<% if not config.COMPACT_LATEX %>\clearemptydoublepage<% endif %>
+
+\tableofcontents
+<% if not config.COMPACT_LATEX %>\clearemptydoublepage<% endif %>
+\pagenumbering{arabic}
+<% if config.USE_PDFLATEX and config.PDF_HYPERLINKS %>
+\hypersetup{pageanchor=true}
+<% endif %>
+
+%--- Begin generated contents ---
+<# TODO: loop over pages #>
+<% if moduleTree.tree %>
+<% if config.COMPACT_LATEX %>\section<% else %>\chapter<% endif %>{<{ tr.moduleIndex }>}
+\input{modules}
+<% endif %>
+<% if namespaceTree.tree %>
+<% if config.COMPACT_LATEX %>\section<% else %>\chapter<% endif %>{<{ tr.namespaceIndex }>}
+\input{namespaces}
+<% endif %>
+<% if classTree.tree %>
+<% if config.COMPACT_LATEX %>\section<% else %>\chapter<% endif %>{<{ tr.classIndex }>}
+\input{annotated}
+<% endif %>
+<% if fileTree.tree %>
+<% if config.COMPACT_LATEX %>\section<% else %>\chapter<% endif %>{<{ tr.fileIndex }>}
+\input{files}
+<% endif %>
+<% if moduleList %>
+<% if config.COMPACT_LATEX %>\section<% else %>\chapter<% endif %>{<{ tr.moduleDocumentation }>}
+<% for compound in moduleList %>
+\input{<{ compound.fileName|raw }>}
+<% endfor %>
+<% endif %>
+<% if namespaceList %>
+<% if config.COMPACT_LATEX %>\section<% else %>\chapter<% endif %>{<{ tr.namespaceDocumentation }>}
+<% for compound in namespaceList %>
+\input{<{ compound.fileName|raw }>}
+<% endfor %>
+<% endif %>
+<% if classList %>
+<% if config.COMPACT_LATEX %>\section<% else %>\chapter<% endif %>{<{ tr.classDocumentation }>}
+<% for compound in classList %>
+\input{<{ compound.fileName|raw }>}
+<% endfor %>
+<% endif %>
+<% if fileList %>
+<% if config.COMPACT_LATEX %>\section<% else %>\chapter<% endif %>{<{ tr.fileDocumentation }>}
+<% for compound in fileList %>
+\input{<{ compound.fileName|raw }>}
+<% endfor %>
+<% endif %>
+%--- End generated contents ---
+
+<# TODO: write bibliography #>
+% Index
+<% if not config.COMPACT_LATEX %>
+\backmatter
+<% endif %>
+\newpage
+\phantomsection
+\clearemptydoublepage
+\addcontentsline{toc}{<% if config.COMPACT_LATEX %>section<% else %>chapter<% endif %>}{<{ tr.index }>}
+\printindex
+
+\end{document}
+
+
diff --git a/templates/latex/latextypeconstraints.tpl b/templates/latex/latextypeconstraints.tpl
new file mode 100644
index 0000000..2853ab2
--- /dev/null
+++ b/templates/latex/latextypeconstraints.tpl
@@ -0,0 +1,12 @@
+<# obj should be a class or member #>
+<% msg %>type constraints = <{ obj.typeConstraints|length }><% endmsg %>
+<% if obj.typeConstraints %>
+\begin{Desc}
+\item[<{ tr.typeConstraints }>]
+\begin{description}
+<% for arg in obj.typeConstraints %>
+ \item[{\em <{ arg.name }>} : {\em <{ arg.type }>}] <{ arg.docs }>
+<% endfor %>
+\end{description}
+\end{Desc}
+<% endif %>