|
From: <mi...@us...> - 2015-03-17 17:08:17
|
Revision: 7845
http://sourceforge.net/p/docutils/code/7845
Author: milde
Date: 2015-03-17 17:08:09 +0000 (Tue, 17 Mar 2015)
Log Message:
-----------
Cleaner LaTeX code for enumerations.
Modified Paths:
--------------
trunk/docutils/HISTORY.txt
trunk/docutils/docutils/writers/latex2e/__init__.py
trunk/docutils/test/functional/expected/standalone_rst_latex.tex
trunk/docutils/test/functional/expected/standalone_rst_xetex.tex
trunk/docutils/test/test_writers/test_latex2e.py
Modified: trunk/docutils/HISTORY.txt
===================================================================
--- trunk/docutils/HISTORY.txt 2015-03-17 15:35:15 UTC (rev 7844)
+++ trunk/docutils/HISTORY.txt 2015-03-17 17:08:09 UTC (rev 7845)
@@ -61,11 +61,13 @@
* docutils/writers/latex2e/__init__.py
- - use absolute path for ``default_template_path``.
+ - Use absolute path for ``default_template_path``.
- - removed deprecated options ``--use-latex-footnotes`` and
+ - Removed deprecated options ``--use-latex-footnotes`` and
``--figure-footnotes``.
+ - Cleaner LaTeX code for enumerations.
+
* docutils/writers/odf_odt/__init__.py
- remove decode.encode of filename stored in zip.
Modified: trunk/docutils/docutils/writers/latex2e/__init__.py
===================================================================
--- trunk/docutils/docutils/writers/latex2e/__init__.py 2015-03-17 15:35:15 UTC (rev 7844)
+++ trunk/docutils/docutils/writers/latex2e/__init__.py 2015-03-17 17:08:09 UTC (rev 7845)
@@ -2005,59 +2005,63 @@
self.out.extend(self.active_table.depart_row())
def visit_enumerated_list(self, node):
- # We create our own enumeration list environment.
- # This allows to set the style and starting value
- # and unlimited nesting.
- enum_style = {'arabic':'arabic',
- 'loweralpha':'alph',
- 'upperalpha':'Alph',
- 'lowerroman':'roman',
- 'upperroman':'Roman' }
- enum_suffix = ''
- if 'suffix' in node:
- enum_suffix = node['suffix']
- enum_prefix = ''
- if 'prefix' in node:
- enum_prefix = node['prefix']
+ # enumeration styles:
+ types = {'': '',
+ 'arabic':'arabic',
+ 'loweralpha':'alph',
+ 'upperalpha':'Alph',
+ 'lowerroman':'roman',
+ 'upperroman':'Roman'}
+ # the 4 default LaTeX enumeration labels: präfix, enumtype, suffix,
+ labels = [('', 'arabic', '.'), # 1.
+ ('(', 'alph', ')'), # (a)
+ ('', 'roman', '.'), # i.
+ ('', 'Alph', '.')] # A.
+
+ prefix = ''
if self.compound_enumerators:
- pref = ''
- if self.section_prefix_for_enumerators and self.section_level:
- for i in range(self.section_level):
- pref += '%d.' % self._section_number[i]
- pref = pref[:-1] + self.section_enumerator_separator
- enum_prefix += pref
- for ctype, cname in self._enumeration_counters:
- enum_prefix += '\\%s{%s}.' % (ctype, cname)
- enum_type = 'arabic'
- if 'enumtype' in node:
- enum_type = node['enumtype']
- if enum_type in enum_style:
- enum_type = enum_style[enum_type]
+ if (self.section_prefix_for_enumerators and self.section_level
+ and not self._enumeration_counters):
+ prefix = '.'.join([str(n) for n in
+ self._section_number[:self.section_level]]
+ ) + self.section_enumerator_separator
+ if self._enumeration_counters:
+ prefix += self._enumeration_counters[-1]
+ # TODO: use LaTeX default for unspecified label-type?
+ # (needs change of parser)
+ prefix += node.get('prefix', '')
+ enumtype = types[node.get('enumtype' '')]
+ suffix = node.get('suffix', '')
- counter_name = 'listcnt%d' % len(self._enumeration_counters)
- self._enumeration_counters.append((enum_type, counter_name))
- # If we haven't used this counter name before, then create a
- # new counter; otherwise, reset & reuse the old counter.
- if len(self._enumeration_counters) > self._max_enumeration_counters:
- self._max_enumeration_counters = len(self._enumeration_counters)
- self.out.append('\\newcounter{%s}\n' % counter_name)
+ enumeration_level = len(self._enumeration_counters)+1
+ counter_name = 'enum' + roman.toRoman(enumeration_level).lower()
+ label = r'%s\%s{%s}%s' % (prefix, enumtype, counter_name, suffix)
+ self._enumeration_counters.append(label)
+
+ if enumeration_level <= 4:
+ self.out.append('\\begin{enumerate}\n')
+ if (prefix, enumtype, suffix
+ ) != labels[enumeration_level-1]:
+ self.out.append('\\renewcommand{\\label%s}{%s}\n' %
+ (counter_name, label))
else:
- self.out.append('\\setcounter{%s}{0}\n' % counter_name)
-
- self.out.append('\\begin{list}{%s\\%s{%s}%s}\n' %
- (enum_prefix,enum_type,counter_name,enum_suffix))
- self.out.append('{\n')
- self.out.append('\\usecounter{%s}\n' % counter_name)
- # set start after usecounter, because it initializes to zero.
+ self.fallbacks[counter_name] = '\\newcounter{%s}' % counter_name
+ self.out.append('\\begin{list}')
+ self.out.append('{%s}' % label)
+ self.out.append('{\\usecounter{%s}}\n' % counter_name)
if 'start' in node:
- self.out.append('\\addtocounter{%s}{%d}\n' %
+ self.out.append('\\setcounter{%s}{%d}\n' %
(counter_name,node['start']-1))
- ## set rightmargin equal to leftmargin
- self.out.append('\\setlength{\\rightmargin}{\\leftmargin}\n')
- self.out.append('}\n')
+ # ## set rightmargin equal to leftmargin
+ # self.out.append('\\setlength{\\rightmargin}{\\leftmargin}\n')
+
+
def depart_enumerated_list(self, node):
- self.out.append('\\end{list}\n')
+ if len(self._enumeration_counters) <= 4:
+ self.out.append('\\end{enumerate}\n')
+ else:
+ self.out.append('\\end{list}\n')
self._enumeration_counters.pop()
def visit_field(self, node):
Modified: trunk/docutils/test/functional/expected/standalone_rst_latex.tex
===================================================================
--- trunk/docutils/test/functional/expected/standalone_rst_latex.tex 2015-03-17 15:35:15 UTC (rev 7844)
+++ trunk/docutils/test/functional/expected/standalone_rst_latex.tex 2015-03-17 17:08:09 UTC (rev 7845)
@@ -66,6 +66,7 @@
% subtitle (in document title)
\providecommand*{\DUdocumentsubtitle}[1]{{\large #1}}
+\newcounter{enumv}
% error admonition title
\providecommand*{\DUtitleerror}[1]{\DUtitle{\color{red}#1}}
@@ -423,89 +424,54 @@
\subsection{2.3~~~Enumerated Lists%
\label{enumerated-lists}%
}
-\newcounter{listcnt0}
-\begin{list}{\arabic{listcnt0}.}
-{
-\usecounter{listcnt0}
-\setlength{\rightmargin}{\leftmargin}
-}
+\begin{enumerate}
\item Arabic numerals.
-\newcounter{listcnt1}
-\begin{list}{\alph{listcnt1})}
-{
-\usecounter{listcnt1}
-\setlength{\rightmargin}{\leftmargin}
-}
+\begin{enumerate}
+\renewcommand{\labelenumii}{\alph{enumii})}
\item lower alpha)
-\newcounter{listcnt2}
-\begin{list}{(\roman{listcnt2})}
-{
-\usecounter{listcnt2}
-\setlength{\rightmargin}{\leftmargin}
-}
+\begin{enumerate}
+\renewcommand{\labelenumiii}{(\roman{enumiii})}
\item (lower roman)
-\newcounter{listcnt3}
-\begin{list}{\Alph{listcnt3}.}
-{
-\usecounter{listcnt3}
-\setlength{\rightmargin}{\leftmargin}
-}
+\begin{enumerate}
\item upper alpha.
-\newcounter{listcnt4}
-\begin{list}{\Roman{listcnt4})}
-{
-\usecounter{listcnt4}
-\setlength{\rightmargin}{\leftmargin}
-}
+\begin{list}{\Roman{enumv})}{\usecounter{enumv}}
\item upper roman)
\end{list}
-\end{list}
-\end{list}
-\end{list}
+\end{enumerate}
+\end{enumerate}
+\end{enumerate}
\item Lists that don’t start at 1:
-\setcounter{listcnt1}{0}
-\begin{list}{\arabic{listcnt1}.}
-{
-\usecounter{listcnt1}
-\addtocounter{listcnt1}{2}
-\setlength{\rightmargin}{\leftmargin}
-}
+\begin{enumerate}
+\renewcommand{\labelenumii}{\arabic{enumii}.}
+\setcounter{enumii}{2}
\item Three
\item Four
-\end{list}
-\setcounter{listcnt1}{0}
-\begin{list}{\Alph{listcnt1}.}
-{
-\usecounter{listcnt1}
-\addtocounter{listcnt1}{2}
-\setlength{\rightmargin}{\leftmargin}
-}
+\end{enumerate}
+\begin{enumerate}
+\renewcommand{\labelenumii}{\Alph{enumii}.}
+\setcounter{enumii}{2}
\item C
\item D
-\end{list}
-\setcounter{listcnt1}{0}
-\begin{list}{\roman{listcnt1}.}
-{
-\usecounter{listcnt1}
-\addtocounter{listcnt1}{2}
-\setlength{\rightmargin}{\leftmargin}
-}
+\end{enumerate}
+\begin{enumerate}
+\renewcommand{\labelenumii}{\roman{enumii}.}
+\setcounter{enumii}{2}
\item iii
\item iv
-\end{list}
-\end{list}
+\end{enumerate}
+\end{enumerate}
\subsection{2.4~~~Definition Lists%
Modified: trunk/docutils/test/functional/expected/standalone_rst_xetex.tex
===================================================================
--- trunk/docutils/test/functional/expected/standalone_rst_xetex.tex 2015-03-17 15:35:15 UTC (rev 7844)
+++ trunk/docutils/test/functional/expected/standalone_rst_xetex.tex 2015-03-17 17:08:09 UTC (rev 7845)
@@ -62,6 +62,7 @@
% subtitle (in document title)
\providecommand*{\DUdocumentsubtitle}[1]{{\large #1}}
+\newcounter{enumv}
% error admonition title
\providecommand*{\DUtitleerror}[1]{\DUtitle{\color{red}#1}}
@@ -422,89 +423,54 @@
\subsection{2.3 Enumerated Lists%
\label{enumerated-lists}%
}
-\newcounter{listcnt0}
-\begin{list}{\arabic{listcnt0}.}
-{
-\usecounter{listcnt0}
-\setlength{\rightmargin}{\leftmargin}
-}
+\begin{enumerate}
\item Arabic numerals.
-\newcounter{listcnt1}
-\begin{list}{\alph{listcnt1})}
-{
-\usecounter{listcnt1}
-\setlength{\rightmargin}{\leftmargin}
-}
+\begin{enumerate}
+\renewcommand{\labelenumii}{\alph{enumii})}
\item lower alpha)
-\newcounter{listcnt2}
-\begin{list}{(\roman{listcnt2})}
-{
-\usecounter{listcnt2}
-\setlength{\rightmargin}{\leftmargin}
-}
+\begin{enumerate}
+\renewcommand{\labelenumiii}{(\roman{enumiii})}
\item (lower roman)
-\newcounter{listcnt3}
-\begin{list}{\Alph{listcnt3}.}
-{
-\usecounter{listcnt3}
-\setlength{\rightmargin}{\leftmargin}
-}
+\begin{enumerate}
\item upper alpha.
-\newcounter{listcnt4}
-\begin{list}{\Roman{listcnt4})}
-{
-\usecounter{listcnt4}
-\setlength{\rightmargin}{\leftmargin}
-}
+\begin{list}{\Roman{enumv})}{\usecounter{enumv}}
\item upper roman)
\end{list}
-\end{list}
-\end{list}
-\end{list}
+\end{enumerate}
+\end{enumerate}
+\end{enumerate}
\item Lists that don’t start at 1:
-\setcounter{listcnt1}{0}
-\begin{list}{\arabic{listcnt1}.}
-{
-\usecounter{listcnt1}
-\addtocounter{listcnt1}{2}
-\setlength{\rightmargin}{\leftmargin}
-}
+\begin{enumerate}
+\renewcommand{\labelenumii}{\arabic{enumii}.}
+\setcounter{enumii}{2}
\item Three
\item Four
-\end{list}
-\setcounter{listcnt1}{0}
-\begin{list}{\Alph{listcnt1}.}
-{
-\usecounter{listcnt1}
-\addtocounter{listcnt1}{2}
-\setlength{\rightmargin}{\leftmargin}
-}
+\end{enumerate}
+\begin{enumerate}
+\renewcommand{\labelenumii}{\Alph{enumii}.}
+\setcounter{enumii}{2}
\item C
\item D
-\end{list}
-\setcounter{listcnt1}{0}
-\begin{list}{\roman{listcnt1}.}
-{
-\usecounter{listcnt1}
-\addtocounter{listcnt1}{2}
-\setlength{\rightmargin}{\leftmargin}
-}
+\end{enumerate}
+\begin{enumerate}
+\renewcommand{\labelenumii}{\roman{enumii}.}
+\setcounter{enumii}{2}
\item iii
\item iv
-\end{list}
-\end{list}
+\end{enumerate}
+\end{enumerate}
\subsection{2.4 Definition Lists%
Modified: trunk/docutils/test/test_writers/test_latex2e.py
===================================================================
--- trunk/docutils/test/test_writers/test_latex2e.py 2015-03-17 15:35:15 UTC (rev 7844)
+++ trunk/docutils/test/test_writers/test_latex2e.py 2015-03-17 17:08:09 UTC (rev 7845)
@@ -396,55 +396,37 @@
(II) in roman numerals.
""",
# expected output
-head + r"""\newcounter{listcnt0}
-\begin{list}{\arabic{listcnt0}.}
-{
-\usecounter{listcnt0}
-\setlength{\rightmargin}{\leftmargin}
-}
+head + r"""\begin{enumerate}
\item Item 1.
\item Second to the previous item this one will explain
-\end{list}
+\end{enumerate}
%
\begin{quote}
-\setcounter{listcnt0}{0}
-\begin{list}{\alph{listcnt0})}
-{
-\usecounter{listcnt0}
-\setlength{\rightmargin}{\leftmargin}
-}
+\begin{enumerate}
+\renewcommand{\labelenumi}{\alph{enumi})}
\item nothing.
\item or some other.
-\end{list}
+\end{enumerate}
\end{quote}
-\setcounter{listcnt0}{0}
-\begin{list}{\arabic{listcnt0}.}
-{
-\usecounter{listcnt0}
-\addtocounter{listcnt0}{2}
-\setlength{\rightmargin}{\leftmargin}
-}
+\begin{enumerate}
+\setcounter{enumi}{2}
\item Third is
-\end{list}
+\end{enumerate}
%
\begin{quote}
-\setcounter{listcnt0}{0}
-\begin{list}{(\Roman{listcnt0})}
-{
-\usecounter{listcnt0}
-\setlength{\rightmargin}{\leftmargin}
-}
+\begin{enumerate}
+\renewcommand{\labelenumi}{(\Roman{enumi})}
\item having pre and postfixes
\item in roman numerals.
-\end{list}
+\end{enumerate}
\end{quote}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|