|
|
# -*- coding: utf-8 -*- |
|
|
#! /usr/bin/env python |
|
|
|
|
|
# $Id: test_latex2e.py 8058 2017-04-19 16:45:32Z milde $ |
|
|
# Author: engelbert gruber <grubert@users.sourceforge.net> |
|
|
# Copyright: This module has been placed in the public domain. |
|
|
|
|
|
""" |
|
|
Tests for latex2e writer. |
|
|
""" |
|
|
|
|
|
import string |
|
|
from __init__ import DocutilsTestSupport |
|
|
|
|
|
def suite(): |
|
|
settings = {'use_latex_toc': False} |
|
|
s = DocutilsTestSupport.PublishTestSuite('latex', suite_settings=settings) |
|
|
s.generateTests(totest) |
|
|
settings['use_latex_toc'] = True |
|
|
s.generateTests(totest_latex_toc) |
|
|
settings['use_latex_toc'] = False |
|
|
settings['sectnum_xform'] = False |
|
|
s.generateTests(totest_latex_sectnum) |
|
|
settings['sectnum_xform'] = True |
|
|
settings['use_latex_citations'] = True |
|
|
s.generateTests(totest_latex_citations) |
|
|
settings['table_style'] = ['colwidths-auto'] |
|
|
s.generateTests(totest_table_style_auto) |
|
|
settings['table_style'] = ['booktabs'] |
|
|
s.generateTests(totest_table_style_booktabs) |
|
|
settings['stylesheet_path'] = 'data/spam,data/ham.tex' |
|
|
s.generateTests(totest_stylesheet) |
|
|
settings['embed_stylesheet'] = True |
|
|
settings['warning_stream'] = '' |
|
|
s.generateTests(totest_stylesheet_embed) |
|
|
return s |
|
|
|
|
|
head_template = string.Template( |
|
|
r"""$head_prefix% generated by Docutils <http://docutils.sourceforge.net/> |
|
|
\usepackage{cmap} % fix search and cut-and-paste in Acrobat |
|
|
$requirements |
|
|
%%% Custom LaTeX preamble |
|
|
$latex_preamble |
|
|
%%% User specified packages and stylesheets |
|
|
$stylesheet |
|
|
%%% Fallback definitions for Docutils-specific commands |
|
|
$fallbacks$pdfsetup |
|
|
$titledata |
|
|
%%% Body |
|
|
\begin{document} |
|
|
""") |
|
|
|
|
|
parts = dict( |
|
|
head_prefix = r"""\documentclass[a4paper]{article} |
|
|
""", |
|
|
requirements = r"""\usepackage{ifthen} |
|
|
\usepackage[T1]{fontenc} |
|
|
\usepackage[utf8]{inputenc} |
|
|
""", |
|
|
latex_preamble = r"""% PDF Standard Fonts |
|
|
\usepackage{mathptmx} % Times |
|
|
\usepackage[scaled=.90]{helvet} |
|
|
\usepackage{courier} |
|
|
""", |
|
|
longtable = r"""\usepackage{longtable,ltcaption,array} |
|
|
\setlength{\extrarowheight}{2pt} |
|
|
\newlength{\DUtablewidth} % internal use in tables |
|
|
""", |
|
|
stylesheet = '', |
|
|
fallbacks = '', |
|
|
fallbacks_highlight = r"""% basic code highlight: |
|
|
\providecommand*\DUrolecomment[1]{\textcolor[rgb]{0.40,0.40,0.40}{#1}} |
|
|
\providecommand*\DUroledeleted[1]{\textcolor[rgb]{0.40,0.40,0.40}{#1}} |
|
|
\providecommand*\DUrolekeyword[1]{\textbf{#1}} |
|
|
\providecommand*\DUrolestring[1]{\textit{#1}} |
|
|
|
|
|
% inline markup (custom roles) |
|
|
% \DUrole{#1}{#2} tries \DUrole#1{#2} |
|
|
\providecommand*{\DUrole}[2]{% |
|
|
% backwards compatibility: try \docutilsrole#1{#2} |
|
|
\ifcsname docutilsrole#1\endcsname% |
|
|
\csname docutilsrole#1\endcsname{#2}% |
|
|
\else |
|
|
\csname DUrole#1\endcsname{#2}% |
|
|
\fi% |
|
|
} |
|
|
""", |
|
|
pdfsetup = r""" |
|
|
% hyperlinks: |
|
|
\ifthenelse{\isundefined{\hypersetup}}{ |
|
|
\usepackage[colorlinks=true,linkcolor=blue,urlcolor=blue]{hyperref} |
|
|
\usepackage{bookmark} |
|
|
\urlstyle{same} % normal text font (alternatives: tt, rm, sf) |
|
|
}{} |
|
|
""", |
|
|
titledata = '') |
|
|
|
|
|
head = head_template.substitute(parts) |
|
|
|
|
|
head_table = head_template.substitute( |
|
|
dict(parts, requirements = parts['requirements'] + parts['longtable'])) |
|
|
|
|
|
head_booktabs = head_template.substitute( |
|
|
dict(parts, requirements=parts['requirements'] |
|
|
+ '\\usepackage{booktabs}\n' + parts['longtable'])) |
|
|
|
|
|
head_textcomp = head_template.substitute( |
|
|
dict(parts, requirements = parts['requirements'] + |
|
|
r"""\usepackage{textcomp} % text symbol macros |
|
|
""")) |
|
|
|
|
|
head_alltt = head_template.substitute( |
|
|
dict(parts, requirements = parts['requirements'] + |
|
|
r"""\usepackage{alltt} |
|
|
""")) |
|
|
|
|
|
|
|
|
totest = {} |
|
|
totest_latex_toc = {} |
|
|
totest_latex_sectnum = {} |
|
|
totest_latex_citations = {} |
|
|
totest_stylesheet = {} |
|
|
totest_stylesheet_embed = {} |
|
|
totest_table_style_auto = {} |
|
|
totest_table_style_booktabs = {} |
|
|
|
|
|
totest['url_chars'] = [ |
|
|
["http://nowhere/url_with%28parens%29", |
|
|
head + r""" |
|
|
\url{http://nowhere/url_with\%28parens\%29} |
|
|
|
|
|
\end{document} |
|
|
"""], |
|
|
] |
|
|
|
|
|
totest['textcomp'] = [ |
|
|
["2 µm is just 2/1000000 m", |
|
|
head_textcomp + r""" |
|
|
2 µm is just 2/1000000 m |
|
|
|
|
|
\end{document} |
|
|
"""], |
|
|
] |
|
|
|
|
|
totest['spanish quote'] = [ |
|
|
[".. role:: language-es\n\nUnd damit :language-es:`basta`!", |
|
|
head_template.substitute(dict(parts, requirements = |
|
|
r"""\usepackage{ifthen} |
|
|
\usepackage[T1]{fontenc} |
|
|
\usepackage[utf8]{inputenc} |
|
|
\usepackage[spanish,english]{babel} |
|
|
\AtBeginDocument{\shorthandoff{.<>}} |
|
|
""")) + r""" |
|
|
Und damit \foreignlanguage{spanish}{basta}! |
|
|
|
|
|
\end{document} |
|
|
"""], |
|
|
] |
|
|
|
|
|
totest['code role'] = [ |
|
|
[":code:`x=1`", |
|
|
head_template.substitute(dict(parts, requirements = parts['requirements']+ |
|
|
r"""\usepackage{color} |
|
|
""", fallbacks = parts['fallbacks_highlight'])) + r""" |
|
|
\texttt{\DUrole{code}{x=1}} |
|
|
|
|
|
\end{document} |
|
|
"""], |
|
|
] |
|
|
|
|
|
totest['table_of_contents'] = [ |
|
|
# input |
|
|
["""\ |
|
|
.. contents:: Table of Contents |
|
|
|
|
|
Title 1 |
|
|
======= |
|
|
Paragraph 1. |
|
|
|
|
|
Title 2 |
|
|
------- |
|
|
Paragraph 2. |
|
|
""", |
|
|
## # expected output |
|
|
head_template.substitute(dict(parts, |
|
|
requirements=parts['requirements'] + '\\setcounter{secnumdepth}{0}\n', |
|
|
fallbacks=r""" |
|
|
% title for topics, admonitions, unsupported section levels, and sidebar |
|
|
\providecommand*{\DUtitle}[2][class-arg]{% |
|
|
% call \DUtitle#1{#2} if it exists: |
|
|
\ifcsname DUtitle#1\endcsname% |
|
|
\csname DUtitle#1\endcsname{#2}% |
|
|
\else |
|
|
\smallskip\noindent\textbf{#2}\smallskip% |
|
|
\fi |
|
|
} |
|
|
""")) + r""" |
|
|
\phantomsection\label{table-of-contents} |
|
|
\pdfbookmark[1]{Table of Contents}{table-of-contents} |
|
|
\DUtitle[contents]{Table of Contents} |
|
|
|
|
|
\begin{list}{}{} |
|
|
\item \hyperref[title-1]{Title 1} |
|
|
|
|
|
\begin{list}{}{} |
|
|
\item \hyperref[title-2]{Title 2} |
|
|
\end{list} |
|
|
\end{list} |
|
|
|
|
|
|
|
|
\section{Title 1% |
|
|
\label{title-1}% |
|
|
} |
|
|
|
|
|
Paragraph 1. |
|
|
|
|
|
|
|
|
\subsection{Title 2% |
|
|
\label{title-2}% |
|
|
} |
|
|
|
|
|
Paragraph 2. |
|
|
|
|
|
\end{document} |
|
|
"""], |
|
|
] |
|
|
|
|
|
totest['footnote text'] = [ |
|
|
# input |
|
|
["""\ |
|
|
.. [1] paragraph |
|
|
|
|
|
.. [2] |
|
|
|
|
|
.. [3] 1. enumeration |
|
|
""", |
|
|
## # expected output |
|
|
head_template.substitute(dict(parts, |
|
|
fallbacks=r"""% numeric or symbol footnotes with hyperlinks |
|
|
\providecommand*{\DUfootnotemark}[3]{% |
|
|
\raisebox{1em}{\hypertarget{#1}{}}% |
|
|
\hyperlink{#2}{\textsuperscript{#3}}% |
|
|
} |
|
|
\providecommand{\DUfootnotetext}[4]{% |
|
|
\begingroup% |
|
|
\renewcommand{\thefootnote}{% |
|
|
\protect\raisebox{1em}{\protect\hypertarget{#1}{}}% |
|
|
\protect\hyperlink{#2}{#3}}% |
|
|
\footnotetext{#4}% |
|
|
\endgroup% |
|
|
} |
|
|
""")) + r"""% |
|
|
\DUfootnotetext{id1}{id1}{1}{% |
|
|
paragraph |
|
|
} |
|
|
% |
|
|
\DUfootnotetext{id2}{id2}{2}{} |
|
|
% |
|
|
\DUfootnotetext{id3}{id3}{3}{ |
|
|
\begin{enumerate} |
|
|
\item enumeration |
|
|
\end{enumerate} |
|
|
} |
|
|
|
|
|
\end{document} |
|
|
"""], |
|
|
] |
|
|
|
|
|
totest_latex_toc['no_sectnum'] = [ |
|
|
# input |
|
|
["""\ |
|
|
.. contents:: |
|
|
|
|
|
first section |
|
|
------------- |
|
|
""", |
|
|
## # expected output |
|
|
head_template.substitute(dict(parts, |
|
|
requirements=parts['requirements'] + '\\setcounter{secnumdepth}{0}\n' |
|
|
)) + r""" |
|
|
\phantomsection\label{contents} |
|
|
\pdfbookmark[1]{Contents}{contents} |
|
|
\tableofcontents |
|
|
|
|
|
|
|
|
\section{first section% |
|
|
\label{first-section}% |
|
|
} |
|
|
|
|
|
\end{document} |
|
|
"""], |
|
|
] |
|
|
|
|
|
totest_latex_toc['sectnum'] = [ |
|
|
# input |
|
|
["""\ |
|
|
.. contents:: |
|
|
.. sectnum:: |
|
|
|
|
|
first section |
|
|
------------- |
|
|
""", |
|
|
## # expected output |
|
|
head_template.substitute(dict(parts, |
|
|
requirements=parts['requirements'] + '\\setcounter{secnumdepth}{0}\n' |
|
|
)) + r""" |
|
|
\phantomsection\label{contents} |
|
|
\pdfbookmark[1]{Contents}{contents} |
|
|
\tableofcontents |
|
|
|
|
|
|
|
|
\section{1 first section% |
|
|
\label{first-section}% |
|
|
} |
|
|
|
|
|
\end{document} |
|
|
"""], |
|
|
] |
|
|
|
|
|
|
|
|
totest_latex_sectnum['no_sectnum'] = [ |
|
|
# input |
|
|
["""\ |
|
|
some text |
|
|
|
|
|
first section |
|
|
------------- |
|
|
""", |
|
|
## # expected output |
|
|
head_template.substitute(dict(parts, requirements = parts['requirements'] + |
|
|
r"""\setcounter{secnumdepth}{0} |
|
|
""")) + r""" |
|
|
some text |
|
|
|
|
|
|
|
|
\section{first section% |
|
|
\label{first-section}% |
|
|
} |
|
|
|
|
|
\end{document} |
|
|
"""], |
|
|
] |
|
|
|
|
|
totest_latex_sectnum['sectnum'] = [ |
|
|
# input |
|
|
["""\ |
|
|
.. sectnum:: |
|
|
|
|
|
some text |
|
|
|
|
|
first section |
|
|
------------- |
|
|
""", |
|
|
## # expected output |
|
|
head_template.substitute(dict(parts, |
|
|
requirements=parts['requirements'] + '\\setcounter{secnumdepth}{0}\n' |
|
|
)) + r""" |
|
|
some text |
|
|
|
|
|
|
|
|
\section{first section% |
|
|
\label{first-section}% |
|
|
} |
|
|
|
|
|
\end{document} |
|
|
"""], |
|
|
] |
|
|
|
|
|
totest_latex_citations['citations_with_underscore'] = [ |
|
|
# input |
|
|
["""\ |
|
|
Just a test citation [my_cite2006]_. |
|
|
|
|
|
.. [my_cite2006] |
|
|
The underscore is mishandled. |
|
|
""", |
|
|
## # expected output |
|
|
head + r""" |
|
|
Just a test citation \cite{my_cite2006}. |
|
|
|
|
|
\begin{thebibliography}{my\_cite2006} |
|
|
\bibitem[my\_cite2006]{my_cite2006}{ |
|
|
The underscore is mishandled. |
|
|
} |
|
|
\end{thebibliography} |
|
|
|
|
|
\end{document} |
|
|
"""], |
|
|
] |
|
|
|
|
|
|
|
|
totest_latex_citations['adjacent_citations'] = [ |
|
|
# input |
|
|
["""\ |
|
|
Two non-citations: [MeYou2007]_[YouMe2007]_. |
|
|
|
|
|
Need to be separated for grouping: [MeYou2007]_ [YouMe2007]_. |
|
|
|
|
|
Two spaces (or anything else) for no grouping: [MeYou2007]_ [YouMe2007]_. |
|
|
|
|
|
But a line break should work: [MeYou2007]_ |
|
|
[YouMe2007]_. |
|
|
|
|
|
.. [MeYou2007] not. |
|
|
.. [YouMe2007] important. |
|
|
""", |
|
|
# expected output |
|
|
head + r""" |
|
|
Two non-citations: {[}MeYou2007{]}\_{[}YouMe2007{]}\_. |
|
|
|
|
|
Need to be separated for grouping: \cite{MeYou2007,YouMe2007}. |
|
|
|
|
|
Two spaces (or anything else) for no grouping: \cite{MeYou2007} \cite{YouMe2007}. |
|
|
|
|
|
But a line break should work: \cite{MeYou2007,YouMe2007}. |
|
|
|
|
|
\begin{thebibliography}{MeYou2007} |
|
|
\bibitem[MeYou2007]{MeYou2007}{ |
|
|
not. |
|
|
} |
|
|
\bibitem[YouMe2007]{YouMe2007}{ |
|
|
important. |
|
|
} |
|
|
\end{thebibliography} |
|
|
|
|
|
\end{document} |
|
|
"""], |
|
|
] |
|
|
|
|
|
|
|
|
totest['enumerated_lists'] = [ |
|
|
# input |
|
|
["""\ |
|
|
1. Item 1. |
|
|
2. Second to the previous item this one will explain |
|
|
|
|
|
a) nothing. |
|
|
b) or some other. |
|
|
|
|
|
3. Third is |
|
|
|
|
|
(I) having pre and postfixes |
|
|
(II) in roman numerals. |
|
|
""", |
|
|
# expected output |
|
|
head + r""" |
|
|
\begin{enumerate} |
|
|
\item Item 1. |
|
|
|
|
|
\item Second to the previous item this one will explain |
|
|
\end{enumerate} |
|
|
|
|
|
\begin{quote} |
|
|
\begin{enumerate} |
|
|
\renewcommand{\labelenumi}{\alph{enumi})} |
|
|
\item nothing. |
|
|
|
|
|
\item or some other. |
|
|
\end{enumerate} |
|
|
\end{quote} |
|
|
|
|
|
\begin{enumerate} |
|
|
\setcounter{enumi}{2} |
|
|
\item Third is |
|
|
\end{enumerate} |
|
|
|
|
|
\begin{quote} |
|
|
\begin{enumerate} |
|
|
\renewcommand{\labelenumi}{(\Roman{enumi})} |
|
|
\item having pre and postfixes |
|
|
|
|
|
\item in roman numerals. |
|
|
\end{enumerate} |
|
|
\end{quote} |
|
|
|
|
|
\end{document} |
|
|
"""], |
|
|
] |
|
|
|
|
|
# TODO: need to test for quote replacing if the language uses "ASCII-quotes" |
|
|
# as active character (e.g. de (ngerman)). |
|
|
|
|
|
|
|
|
totest['table_caption'] = [ |
|
|
# input |
|
|
["""\ |
|
|
.. table:: Foo |
|
|
|
|
|
+-----+-----+ |
|
|
| | | |
|
|
+-----+-----+ |
|
|
| | | |
|
|
+-----+-----+ |
|
|
""", |
|
|
head_table + r""" |
|
|
\setlength{\DUtablewidth}{\linewidth} |
|
|
\begin{longtable}[c]{|p{0.075\DUtablewidth}|p{0.075\DUtablewidth}|} |
|
|
\caption{Foo}\\ |
|
|
\hline |
|
|
& \\ |
|
|
\hline |
|
|
& \\ |
|
|
\hline |
|
|
\end{longtable} |
|
|
|
|
|
\end{document} |
|
|
"""], |
|
|
] |
|
|
|
|
|
totest['table_styles'] = [ |
|
|
["""\ |
|
|
.. table:: |
|
|
:class: borderless |
|
|
|
|
|
+-----+-----+ |
|
|
| 1 | 2 | |
|
|
+-----+-----+ |
|
|
| 3 | 4 | |
|
|
+-----+-----+ |
|
|
""", |
|
|
head_table + r""" |
|
|
\setlength{\DUtablewidth}{\linewidth} |
|
|
\begin{longtable*}[c]{p{0.075\DUtablewidth}p{0.075\DUtablewidth}} |
|
|
|
|
|
1 |
|
|
& |
|
|
2 |
|
|
\\ |
|
|
|
|
|
3 |
|
|
& |
|
|
4 |
|
|
\\ |
|
|
\end{longtable*} |
|
|
|
|
|
\end{document} |
|
|
"""], |
|
|
["""\ |
|
|
.. table:: |
|
|
:class: booktabs |
|
|
|
|
|
+-----+-+ |
|
|
| 1 |2| |
|
|
+-----+-+ |
|
|
""", |
|
|
head_booktabs + r""" |
|
|
\setlength{\DUtablewidth}{\linewidth} |
|
|
\begin{longtable*}[c]{p{0.075\DUtablewidth}p{0.028\DUtablewidth}} |
|
|
\toprule |
|
|
|
|
|
1 |
|
|
& |
|
|
2 |
|
|
\\ |
|
|
\bottomrule |
|
|
\end{longtable*} |
|
|
|
|
|
\end{document} |
|
|
"""], |
|
|
["""\ |
|
|
.. table:: |
|
|
:class: colwidths-auto |
|
|
|
|
|
+-----+-+ |
|
|
| 1 |2| |
|
|
+-----+-+ |
|
|
""", |
|
|
head_table + r""" |
|
|
\begin{longtable*}[c]{|l|l|} |
|
|
\hline |
|
|
1 & 2 \\ |
|
|
\hline |
|
|
\end{longtable*} |
|
|
|
|
|
\end{document} |
|
|
"""], |
|
|
["""\ |
|
|
.. table:: |
|
|
:widths: auto |
|
|
|
|
|
+-----+-+ |
|
|
| 1 |2| |
|
|
+-----+-+ |
|
|
""", |
|
|
head_table + r""" |
|
|
\begin{longtable*}[c]{|l|l|} |
|
|
\hline |
|
|
1 & 2 \\ |
|
|
\hline |
|
|
\end{longtable*} |
|
|
|
|
|
\end{document} |
|
|
"""], |
|
|
["""\ |
|
|
.. table:: |
|
|
:widths: 15, 30 |
|
|
|
|
|
+-----+-----+ |
|
|
| 1 | 2 | |
|
|
+-----+-----+ |
|
|
""", |
|
|
head_table + r""" |
|
|
\setlength{\DUtablewidth}{\linewidth} |
|
|
\begin{longtable*}[c]{|p{0.191\DUtablewidth}|p{0.365\DUtablewidth}|} |
|
|
\hline |
|
|
|
|
|
1 |
|
|
& |
|
|
2 |
|
|
\\ |
|
|
\hline |
|
|
\end{longtable*} |
|
|
|
|
|
\end{document} |
|
|
"""], |
|
|
] |
|
|
|
|
|
totest_table_style_booktabs['table_styles'] = [ |
|
|
# borderless overrides "booktabs" table_style |
|
|
["""\ |
|
|
.. table:: |
|
|
:class: borderless |
|
|
|
|
|
+-----+-----+ |
|
|
| 1 | 2 | |
|
|
+-----+-----+ |
|
|
| 3 | 4 | |
|
|
+-----+-----+ |
|
|
""", |
|
|
head_table + r""" |
|
|
\setlength{\DUtablewidth}{\linewidth} |
|
|
\begin{longtable*}[c]{p{0.075\DUtablewidth}p{0.075\DUtablewidth}} |
|
|
|
|
|
1 |
|
|
& |
|
|
2 |
|
|
\\ |
|
|
|
|
|
3 |
|
|
& |
|
|
4 |
|
|
\\ |
|
|
\end{longtable*} |
|
|
|
|
|
\end{document} |
|
|
"""], |
|
|
["""\ |
|
|
.. table:: |
|
|
:widths: auto |
|
|
|
|
|
+-----+-+ |
|
|
| 1 |2| |
|
|
+-----+-+ |
|
|
""", |
|
|
head_booktabs + r""" |
|
|
\begin{longtable*}[c]{ll} |
|
|
\toprule |
|
|
1 & 2 \\ |
|
|
\bottomrule |
|
|
\end{longtable*} |
|
|
|
|
|
\end{document} |
|
|
"""], |
|
|
["""\ |
|
|
.. table:: |
|
|
:widths: 15, 30 |
|
|
|
|
|
+-----+-----+ |
|
|
| 1 | 2 | |
|
|
+-----+-----+ |
|
|
""", |
|
|
head_booktabs + r""" |
|
|
\setlength{\DUtablewidth}{\linewidth} |
|
|
\begin{longtable*}[c]{p{0.191\DUtablewidth}p{0.365\DUtablewidth}} |
|
|
\toprule |
|
|
|
|
|
1 |
|
|
& |
|
|
2 |
|
|
\\ |
|
|
\bottomrule |
|
|
\end{longtable*} |
|
|
|
|
|
\end{document} |
|
|
"""], |
|
|
] |
|
|
totest_table_style_auto['table_styles'] = [ |
|
|
["""\ |
|
|
.. table:: |
|
|
:class: borderless |
|
|
|
|
|
+-----+-----+ |
|
|
| 1 | 2 | |
|
|
+-----+-----+ |
|
|
| 3 | 4 | |
|
|
+-----+-----+ |
|
|
""", |
|
|
head_table + r""" |
|
|
\begin{longtable*}[c]{ll} |
|
|
1 & 2 \\ |
|
|
3 & 4 \\ |
|
|
\end{longtable*} |
|
|
|
|
|
\end{document} |
|
|
"""], |
|
|
["""\ |
|
|
.. table:: |
|
|
:class: booktabs |
|
|
|
|
|
+-----+-+ |
|
|
| 1 |2| |
|
|
+-----+-+ |
|
|
""", |
|
|
head_booktabs + r""" |
|
|
\begin{longtable*}[c]{ll} |
|
|
\toprule |
|
|
1 & 2 \\ |
|
|
\bottomrule |
|
|
\end{longtable*} |
|
|
|
|
|
\end{document} |
|
|
"""], |
|
|
# given width overrides "colwidth-auto" |
|
|
["""\ |
|
|
.. table:: |
|
|
:widths: 15, 30 |
|
|
|
|
|
+-----+-----+ |
|
|
| 1 | 2 | |
|
|
+-----+-----+ |
|
|
""", |
|
|
head_table + r""" |
|
|
\setlength{\DUtablewidth}{\linewidth} |
|
|
\begin{longtable*}[c]{|p{0.191\DUtablewidth}|p{0.365\DUtablewidth}|} |
|
|
\hline |
|
|
|
|
|
1 |
|
|
& |
|
|
2 |
|
|
\\ |
|
|
\hline |
|
|
\end{longtable*} |
|
|
|
|
|
\end{document} |
|
|
"""], |
|
|
] |
|
|
|
|
|
totest['table_align'] = [ |
|
|
# input |
|
|
["""\ |
|
|
.. table:: |
|
|
:align: right |
|
|
|
|
|
+-----+-----+ |
|
|
| 1 | 2 | |
|
|
+-----+-----+ |
|
|
""", |
|
|
head_table + r""" |
|
|
\setlength{\DUtablewidth}{\linewidth} |
|
|
\begin{longtable*}[r]{|p{0.075\DUtablewidth}|p{0.075\DUtablewidth}|} |
|
|
\hline |
|
|
|
|
|
1 |
|
|
& |
|
|
2 |
|
|
\\ |
|
|
\hline |
|
|
\end{longtable*} |
|
|
|
|
|
\end{document} |
|
|
"""], |
|
|
] |
|
|
|
|
|
totest['table_empty_thead_entry'] = [ |
|
|
# input |
|
|
["""\ |
|
|
===== ====== |
|
|
Title |
|
|
===== ====== |
|
|
entry value1 |
|
|
===== ====== |
|
|
""", |
|
|
head_table + r""" |
|
|
\setlength{\DUtablewidth}{\linewidth} |
|
|
\begin{longtable*}[c]{|p{0.075\DUtablewidth}|p{0.086\DUtablewidth}|} |
|
|
\hline |
|
|
\textbf{% |
|
|
Title |
|
|
} & \\ |
|
|
\hline |
|
|
\endfirsthead |
|
|
\hline |
|
|
\textbf{% |
|
|
Title |
|
|
} & \\ |
|
|
\hline |
|
|
\endhead |
|
|
\multicolumn{2}{c}{\hfill ... continued on next page} \\ |
|
|
\endfoot |
|
|
\endlastfoot |
|
|
|
|
|
entry |
|
|
& |
|
|
value1 |
|
|
\\ |
|
|
\hline |
|
|
\end{longtable*} |
|
|
|
|
|
\end{document} |
|
|
"""], |
|
|
] |
|
|
|
|
|
# The "[" needs to be protected (otherwise it will be seen as an |
|
|
# option to "\\", "\item", etc. ). |
|
|
|
|
|
totest['bracket_protection'] = [ |
|
|
# input |
|
|
[""" |
|
|
* [no option] to this item |
|
|
""", |
|
|
head + r""" |
|
|
\begin{itemize} |
|
|
\item {[}no option{]} to this item |
|
|
\end{itemize} |
|
|
|
|
|
\end{document} |
|
|
"""], |
|
|
] |
|
|
|
|
|
totest['literal_block'] = [ |
|
|
# input |
|
|
["""\ |
|
|
Test special characters { [ \\\\ ] } in literal block:: |
|
|
|
|
|
{ [ ( \macro |
|
|
|
|
|
} ] ) |
|
|
""", |
|
|
head_alltt + r""" |
|
|
Test special characters \{ {[} \textbackslash{} {]} \} in literal block: |
|
|
|
|
|
\begin{quote} |
|
|
\begin{alltt} |
|
|
\{ [ ( \textbackslash{}macro |
|
|
|
|
|
\} ] ) |
|
|
\end{alltt} |
|
|
\end{quote} |
|
|
|
|
|
\end{document} |
|
|
"""], |
|
|
] |
|
|
|
|
|
totest['raw'] = [ |
|
|
[r""".. raw:: latex |
|
|
|
|
|
$E=mc^2$ |
|
|
|
|
|
A paragraph. |
|
|
|
|
|
.. |sub| raw:: latex |
|
|
|
|
|
(some raw text) |
|
|
|
|
|
Foo |sub| |
|
|
same paragraph. |
|
|
""", |
|
|
head + r""" |
|
|
$E=mc^2$ |
|
|
|
|
|
A paragraph. |
|
|
|
|
|
Foo (some raw text) |
|
|
same paragraph. |
|
|
|
|
|
\end{document} |
|
|
"""], |
|
|
] |
|
|
|
|
|
totest['title_with_inline_markup'] = [ |
|
|
["""\ |
|
|
This is the *Title* |
|
|
=================== |
|
|
|
|
|
This is the *Subtitle* |
|
|
---------------------- |
|
|
|
|
|
This is a *section title* |
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
|
|
|
|
This is the *document*. |
|
|
""", |
|
|
head_template.substitute(dict(parts, |
|
|
requirements=parts['requirements'] + '\\setcounter{secnumdepth}{0}\n', |
|
|
fallbacks=r""" |
|
|
% subtitle (in document title) |
|
|
\providecommand*{\DUdocumentsubtitle}[1]{{\large #1}} |
|
|
""", |
|
|
pdfsetup=parts['pdfsetup'] + r"""\hypersetup{ |
|
|
pdftitle={This is the Title}, |
|
|
} |
|
|
""", titledata=r"""%%% Title Data |
|
|
\title{\phantomsection% |
|
|
This is the \emph{Title}% |
|
|
\label{this-is-the-title}% |
|
|
\\ % subtitle% |
|
|
\DUdocumentsubtitle{This is the \emph{Subtitle}}% |
|
|
\label{this-is-the-subtitle}} |
|
|
\author{} |
|
|
\date{} |
|
|
""")) + r"""\maketitle |
|
|
|
|
|
|
|
|
\section{This is a \emph{section title}% |
|
|
\label{this-is-a-section-title}% |
|
|
} |
|
|
|
|
|
This is the \emph{document}. |
|
|
|
|
|
\end{document} |
|
|
"""], |
|
|
] |
|
|
|
|
|
totest_stylesheet['two-styles'] = [ |
|
|
# input |
|
|
["""two stylesheet links in the header""", |
|
|
head_template.substitute(dict(parts, stylesheet = |
|
|
r"""\usepackage{data/spam} |
|
|
\input{data/ham.tex} |
|
|
""")) + r""" |
|
|
two stylesheet links in the header |
|
|
|
|
|
\end{document} |
|
|
"""], |
|
|
] |
|
|
|
|
|
totest_stylesheet_embed['two-styles'] = [ |
|
|
# input |
|
|
["""two stylesheets embedded in the header""", |
|
|
head_template.substitute(dict(parts, stylesheet = |
|
|
r"""% Cannot embed stylesheet 'data/spam.sty': |
|
|
% No such file or directory. |
|
|
% embedded stylesheet: data/ham.tex |
|
|
\newcommand{\ham}{wonderful ham} |
|
|
|
|
|
""")) + r""" |
|
|
two stylesheets embedded in the header |
|
|
|
|
|
\end{document} |
|
|
"""], |
|
|
] |
|
|
|
|
|
if __name__ == '__main__': |
|
|
import unittest |
|
|
unittest.main(defaultTest='suite')
|
|
|
|