summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docutils/HISTORY.txt3
-rw-r--r--docutils/docutils/writers/latex2e/__init__.py36
-rw-r--r--docutils/test/functional/expected/latex_cornercases.tex4
-rw-r--r--docutils/test/functional/expected/latex_leavevmode.tex408
-rw-r--r--docutils/test/functional/expected/latex_memoir.tex20
-rw-r--r--docutils/test/functional/expected/standalone_rst_latex.tex20
-rw-r--r--docutils/test/functional/expected/standalone_rst_xetex.tex20
-rw-r--r--docutils/test/functional/input/latex_leavevmode.txt164
-rw-r--r--docutils/test/functional/tests/latex_leavevmode.py10
9 files changed, 649 insertions, 36 deletions
diff --git a/docutils/HISTORY.txt b/docutils/HISTORY.txt
index 7772d4ed2..ab63c0933 100644
--- a/docutils/HISTORY.txt
+++ b/docutils/HISTORY.txt
@@ -156,6 +156,9 @@ Version 0.17b1
is True. (This did happen when publishing from a doctree.)
- Set PDF document properties from "meta" directive content.
+
+ - Apply version of patch #176 "LaTeX writer: Append \leavevmode to
+ non-docinfo field names" by John Thorvald Wodder II.
* docutils/writers/manpage.py
diff --git a/docutils/docutils/writers/latex2e/__init__.py b/docutils/docutils/writers/latex2e/__init__.py
index 1556d10bd..5f0aa1408 100644
--- a/docutils/docutils/writers/latex2e/__init__.py
+++ b/docutils/docutils/writers/latex2e/__init__.py
@@ -1577,6 +1577,30 @@ class LaTeXTranslator(nodes.NodeVisitor):
def pop_output_collector(self):
self.out = self.out_stack.pop()
+ def term_postfix(self, node):
+ """
+ Return LaTeX code required between term or field name and content.
+
+ In a LaTeX "description" environment (used for definition
+ lists and non-docinfo field lists), a ``\\leavevmode``
+ between an item's label and content ensures the correct
+ placement of certain block constructs.
+ """
+ for child in node:
+ if not isinstance(child, (nodes.Invisible, nodes.footnote,
+ nodes.citation)):
+ break
+ else:
+ return ''
+ if isinstance(child, (nodes.image)):
+ return '\\leavevmode\n' # Images get an additional newline.
+ if isinstance(child, (nodes.container, nodes.compound)):
+ return self.term_postfix(child)
+ if not isinstance(child,
+ (nodes.paragraph, nodes.math_block)):
+ return r'\leavevmode'
+ return ''
+
# Visitor methods
# ---------------
@@ -2130,7 +2154,8 @@ class LaTeXTranslator(nodes.NodeVisitor):
pass
def visit_field_body(self, node):
- pass
+ if not isinstance(node.parent.parent, nodes.docinfo):
+ self.out.append(self.term_postfix(node))
def depart_field_body(self, node):
if self.out is self.docinfo:
@@ -2970,9 +2995,12 @@ class LaTeXTranslator(nodes.NodeVisitor):
self.out.append('\\item[{')
def depart_term(self, node):
- # \leavevmode results in a line break if the
- # term is followed by an item list.
- self.out.append('}] \\leavevmode ')
+ self.out.append('}] ')
+ # Do we need a \leavevmode (line break if the field body begins
+ # with a list or environment)?
+ next_node = node.next_node(descend=False, siblings=True)
+ if not isinstance(next_node, nodes.classifier):
+ self.out.append(self.term_postfix(next_node))
def visit_tgroup(self, node):
pass
diff --git a/docutils/test/functional/expected/latex_cornercases.tex b/docutils/test/functional/expected/latex_cornercases.tex
index bc9ef36af..5621bb156 100644
--- a/docutils/test/functional/expected/latex_cornercases.tex
+++ b/docutils/test/functional/expected/latex_cornercases.tex
@@ -437,7 +437,7 @@ cell 1, 2
}
\begin{description}
-\item[{definition:}] \leavevmode
+\item[{definition:}]
list
\end{description}
@@ -490,7 +490,7 @@ cell 1, 2
}
\begin{description}
-\item[{definition:}] \leavevmode
+\item[{definition:}]
list
\end{description}
diff --git a/docutils/test/functional/expected/latex_leavevmode.tex b/docutils/test/functional/expected/latex_leavevmode.tex
new file mode 100644
index 000000000..57daf1349
--- /dev/null
+++ b/docutils/test/functional/expected/latex_leavevmode.tex
@@ -0,0 +1,408 @@
+\documentclass[a4paper]{article}
+% generated by Docutils <http://docutils.sourceforge.net/>
+\usepackage{cmap} % fix search and cut-and-paste in Acrobat
+\usepackage{ifthen}
+\usepackage[T1]{fontenc}
+\usepackage[utf8]{inputenc}
+\usepackage{alltt}
+\usepackage{amsmath}
+\usepackage{float} % extended float configuration
+\floatplacement{figure}{H} % place figures here definitely
+\usepackage{graphicx}
+\setcounter{secnumdepth}{0}
+\usepackage{longtable,ltcaption,array}
+\setlength{\extrarowheight}{2pt}
+\newlength{\DUtablewidth} % internal use in tables
+\usepackage{tabularx}
+
+%%% Custom LaTeX preamble
+% PDF Standard Fonts
+\usepackage{mathptmx} % Times
+\usepackage[scaled=.90]{helvet}
+\usepackage{courier}
+
+%%% User specified packages and stylesheets
+
+%%% Fallback definitions for Docutils-specific commands
+
+% class handling for environments (block-level elements)
+% \begin{DUclass}{spam} tries \DUCLASSspam and
+% \end{DUclass}{spam} tries \endDUCLASSspam
+\ifx\DUclass\undefined % poor man's "provideenvironment"
+ \newenvironment{DUclass}[1]%
+ {% "#1" does not work in end-part of environment.
+ \def\DocutilsClassFunctionName{DUCLASS#1}
+ \csname \DocutilsClassFunctionName \endcsname}%
+ {\csname end\DocutilsClassFunctionName \endcsname}%
+\fi
+
+% Provide a length variable and set default, if it is new
+\providecommand*{\DUprovidelength}[2]{
+ \ifthenelse{\isundefined{#1}}{\newlength{#1}\setlength{#1}{#2}}{}
+}
+
+% abstract title
+\providecommand*{\DUtitleabstract}[1]{\centerline{\textbf{#1}}}
+
+% admonition (specially marked topic)
+\providecommand{\DUadmonition}[2][class-arg]{%
+ % try \DUadmonition#1{#2}:
+ \ifcsname DUadmonition#1\endcsname%
+ \csname DUadmonition#1\endcsname{#2}%
+ \else
+ \begin{center}
+ \fbox{\parbox{0.9\linewidth}{#2}}
+ \end{center}
+ \fi
+}
+
+% width of docinfo table
+\DUprovidelength{\DUdocinfowidth}{0.9\linewidth}
+
+% field list environment (for separate configuration of `field lists`)
+\ifthenelse{\isundefined{\DUfieldlist}}{
+ \newenvironment{DUfieldlist}%
+ {\quote\description}
+ {\enddescription\endquote}
+}{}
+
+% numerical or symbol footnotes with hyperlinks and backlinks
+\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%
+}
+
+% custom inline roles: \DUrole{#1}{#2} tries \DUrole#1{#2}
+\providecommand*{\DUrole}[2]{%
+ \ifcsname DUrole#1\endcsname%
+ \csname DUrole#1\endcsname{#2}%
+ \else%
+ #2%
+ \fi%
+}
+
+% line block environment
+\DUprovidelength{\DUlineblockindent}{2.5em}
+\ifthenelse{\isundefined{\DUlineblock}}{
+ \newenvironment{DUlineblock}[1]{%
+ \list{}{\setlength{\partopsep}{\parskip}
+ \addtolength{\partopsep}{\baselineskip}
+ \setlength{\topsep}{0pt}
+ \setlength{\itemsep}{0.15\baselineskip}
+ \setlength{\parsep}{0pt}
+ \setlength{\leftmargin}{#1}}
+ \raggedright
+ }
+ {\endlist}
+}{}
+
+% list of command line options
+\providecommand*{\DUoptionlistlabel}[1]{\bfseries #1 \hfill}
+\DUprovidelength{\DUoptionlistindent}{3cm}
+\ifthenelse{\isundefined{\DUoptionlist}}{
+ \newenvironment{DUoptionlist}{%
+ \list{}{\setlength{\labelwidth}{\DUoptionlistindent}
+ \setlength{\rightmargin}{1cm}
+ \setlength{\leftmargin}{\rightmargin}
+ \addtolength{\leftmargin}{\labelwidth}
+ \addtolength{\leftmargin}{\labelsep}
+ \renewcommand{\makelabel}{\DUoptionlistlabel}}
+ }
+ {\endlist}
+}{}
+
+% informal heading
+\providecommand*{\DUrubric}[1]{\subsubsection*{\emph{#1}}}
+
+% 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
+}
+
+% titlereference standard role
+\providecommand*{\DUroletitlereference}[1]{\textsl{#1}}
+
+% hyperlinks:
+\ifthenelse{\isundefined{\hypersetup}}{
+ \usepackage[colorlinks=true,linkcolor=blue,urlcolor=blue]{hyperref}
+ \usepackage{bookmark}
+ \urlstyle{same} % normal text font (alternatives: tt, rm, sf)
+}{}
+\hypersetup{
+ pdftitle={Styling of Elements in Definition- or Field-List},
+ pdfauthor={Hänsel;Gretel}
+}
+
+%%% Body
+\begin{document}
+\title{Styling of Elements in Definition- or Field-List%
+ \label{styling-of-elements-in-definition-or-field-list}}
+\author{}
+\date{}
+\maketitle
+
+% Docinfo
+\begin{center}
+\begin{tabularx}{\DUdocinfowidth}{lX}
+\textbf{Author}: &
+ Hänsel \\
+\textbf{Author}: &
+ Gretel \\
+\textbf{Address}: &
+ {\raggedright
+123 Example Street\\
+Example, EX Canada } \\
+\textbf{Generic Docinfo List Field}: &
+\begin{itemize}
+\item This is a list.
+
+\item It does not require \texttt{\textbackslash{}leavevmode} because it is in the docinfo.
+\end{itemize}
+\\
+\end{tabularx}
+\end{center}
+
+\begin{DUclass}{abstract}
+\begin{quote}
+\DUtitle[abstract]{Abstract}
+
+Test that \texttt{\textbackslash{}leavevmode} is inserted after the term or field-name
+when required for correct placement of the item.
+\end{quote}
+\end{DUclass}
+
+
+\section{Elements needing \texttt{\textbackslash{}leavevmode}%
+ \label{elements-needing-leavevmode}%
+}
+
+\begin{DUfieldlist}
+\item[{Bullet List:}]\leavevmode
+\begin{itemize}
+\item This is a bullet list nested in a field list.
+
+\item It needs \texttt{\textbackslash{}leavevmode} so that it will start on a new line
+after the term.
+
+\item Without \texttt{\textbackslash{}leavevmode}, the first bullet would be on the same line as
+the term, and the following bullets would not line up.
+\end{itemize}
+
+\item[{Enumerated List:}]\leavevmode
+\begin{enumerate}
+\item This is an enumerated list.
+
+\item All lists need \texttt{\textbackslash{}leavevmode}.
+\end{enumerate}
+
+\item[{Field List:}]\leavevmode
+\begin{DUfieldlist}
+\item[{Field List:}]
+Like this one
+
+\item[{Needs \texttt{\textbackslash{}leavevmode}:}]
+Yes
+\end{DUfieldlist}
+
+\item[{empty:}]\end{DUfieldlist}
+
+\begin{description}
+\item[{Definition List}] \leavevmode
+\begin{description}
+\item[{Nested}]
+inside another definition list.
+
+\item[{Needs \texttt{\textbackslash{}leavevmode}?}] \leavevmode
+\begin{description}
+\item[{Yes.}]
+Independent of the nesting level.
+
+\end{description}
+
+\end{description}
+
+\item[{Option List}] \leavevmode
+\begin{DUoptionlist}
+\item[-h] Show help
+
+\item[-v] Be verbose
+
+\item[-{}-rare] a) This description starts with an enumeration
+c) but does not need \texttt{\textbackslash{}leavevmode}.
+\end{DUoptionlist}
+
+\item[{Literal Block}] \leavevmode
+\begin{quote}
+\begin{alltt}
+_needs_leavevmode = True
+\end{alltt}
+\end{quote}
+
+\item[{Doctest Block}] \leavevmode
+\begin{quote}
+\begin{alltt}
+>>> needs_leavevmode(nodes.doctest_block)
+True
+\end{alltt}
+\end{quote}
+
+\item[{Line Block}] \leavevmode
+\begin{DUlineblock}{0em}
+\item[] Needs “\texttt{\textbackslash{}leavevmode}”,
+\item[] so that all lines start with the same indent.
+\end{DUlineblock}
+
+\item[{Block Quote}] \leavevmode
+%
+
+\begin{quote}
+Block Quotes need “\texttt{\textbackslash{}leavevmode}”, too,
+so that all lines start with the same indent.
+\end{quote}
+
+\item[{Table}] \leavevmode
+\setlength{\DUtablewidth}{\linewidth}%
+\begin{longtable*}{|p{0.051\DUtablewidth}|p{0.051\DUtablewidth}|}
+\hline
+
+1
+ &
+2
+ \\
+\hline
+
+3
+ &
+4
+ \\
+\hline
+\end{longtable*}
+
+\item[{Figure}] \leavevmode
+\begin{figure}
+\noindent\makebox[\linewidth][c]{\includegraphics{../../../docs/user/rst/images/title.png}}
+\caption{A figure}
+\end{figure}
+
+\item[{Image}] \leavevmode
+
+\includegraphics{../../../docs/user/rst/images/title.png}
+
+\item[{Rubric}] \leavevmode
+\DUrubric{A Rubric}
+
+\item[{Admonition}] \leavevmode
+\DUadmonition[note]{
+\DUtitle[note]{Note}
+
+Admonitions need to be preceded by \texttt{\textbackslash{}leavevmode}.
+Otherwise, the term ends up centered above the admonition box.
+
+So do \emph{System Messages}, as they use the “DUadmonition”
+LaTeX environment.
+}
+
+\end{description}
+
+
+\section{Elements not needing \texttt{\textbackslash{}leavevmode}%
+ \label{elements-not-needing-leavevmode}%
+}
+
+\begin{description}
+\item[{Paragraph}]
+Paragraphs don’t need \texttt{\textbackslash{}leavevmode}. They are meant
+to start after the term and have a hanging indent.
+
+\begin{itemize}
+\item Subsequent elements don’t need \texttt{\textbackslash{}leavevmode} either.
+\end{itemize}
+
+\item[{Math Block}] %
+\begin{equation*}
+\sum_{i=1}^n i = \frac{n^2+n}{2}
+\end{equation*}
+LaTeX starts math blocks (both single-line and multiline) in a new
+paragraph automatically, with or without \texttt{\textbackslash{}leavevmode}, so
+\texttt{\textbackslash{}leavevmode} isn’t needed.
+
+\item[{Term with Classifier: classifier}] \leavevmode
+\begin{itemize}
+\item After a \emph{classifier}, \texttt{\textbackslash{}leavevmode} is not required.
+
+\item This holds for all elements that normally need \texttt{\textbackslash{}leavevmode}.
+\end{itemize}
+
+\end{description}
+
+
+\section{Ambiguous cases%
+ \label{ambiguous-cases}%
+}
+
+\begin{description}
+\item[{Comment and Target}] \leavevmode
+% This is ignored.
+
+\begin{itemize}
+\item Comments and other “Invisible” nodes (substitution definitions,
+targets, pending) must be skipped when determining whether a
+\texttt{\textbackslash{}leavevmode} is required.
+\end{itemize}
+
+\item[{Substitution Definition and Class directive}]
+\DUrole{test}{Is \texttt{\textbackslash{}leavevmode} required? Answer: No (because a paragraph follows).}
+
+\item[{Compound}]
+\begin{DUclass}{compound}
+\DUroletitlereference{Compound} and \DUroletitlereference{Container} wrap around other block elements.
+They get a \texttt{\textbackslash{}leavevmode}, if the first nested element is a
+list or similar.
+\end{DUclass}
+
+\item[{Container}] \leavevmode
+\begin{DUclass}{my-class}
+
+\begin{itemize}
+\item This list inside a container requires a \texttt{\textbackslash{}leavevmode}.
+\end{itemize}
+\end{DUclass}
+
+\item[{Footnote}] %
+\DUfootnotetext{f1}{f1}{1}{\phantomsection\label{f1}%
+This footnote will move to the bottom of the page.
+}
+
+A \texttt{\textbackslash{}leavevmode} is required, if the first list item value is a
+footnote and a list or similar follows.
+
+\item[{Citation}] \leavevmode\begin{figure}[b]\raisebox{1em}{\hypertarget{example73}{}}[example73]
+No Name, “Citations move to the bottom as well”,
+Musterstadt, 1973.
+\end{figure}
+
+\begin{itemize}
+\item A \texttt{\textbackslash{}leavevmode} is required, if the first list item value is a
+citation and a list or similar follows.
+\end{itemize}
+
+\item[{Raw Block Text}] \leavevmode
+“Raw” blocks are always preceded by
+\verb|\leavevmode|, just in case.
+
+\end{description}
+
+\end{document}
diff --git a/docutils/test/functional/expected/latex_memoir.tex b/docutils/test/functional/expected/latex_memoir.tex
index 3cad8b6f0..60d64eeaf 100644
--- a/docutils/test/functional/expected/latex_memoir.tex
+++ b/docutils/test/functional/expected/latex_memoir.tex
@@ -464,18 +464,18 @@ Paragraph 2 of item 2.
}
\begin{description}
-\item[{Term}] \leavevmode
+\item[{Term}]
Definition
-\item[{Term}] \leavevmode (\textbf{classifier})
+\item[{Term}] (\textbf{classifier})
Definition paragraph 1.
Definition paragraph 2.
-\item[{Term}] \leavevmode
+\item[{Term}]
Definition
-\item[{Term}] \leavevmode (\textbf{classifier one})(\textbf{classifier two})
+\item[{Term}] (\textbf{classifier one})(\textbf{classifier two})
Definition
\end{description}
@@ -1374,7 +1374,7 @@ list,
\end{DUfieldlist}
a paragraph,
\begin{description}
-\item[{a definition}] \leavevmode
+\item[{a definition}]
list,
\end{description}
@@ -1840,7 +1840,7 @@ with the \emph{wave function} $\Psi $, describes how the quantum state of a
physical system changes in time.
\begin{description}
-\item[{Math-Accents:}] \leavevmode
+\item[{Math-Accents:}] \leavevmode
\setlength{\DUtablewidth}{\linewidth}%
\begin{longtable*}{p{0.315\DUtablewidth}p{0.315\DUtablewidth}p{0.315\DUtablewidth}}
@@ -2188,7 +2188,7 @@ is contained in a quote
\end{quote}
\begin{description}
-\item[{In a definition list:}] \leavevmode
+\item[{In a definition list:}] \leavevmode
\begin{DUoptionlist}
\item[-{}-help] show help
@@ -2646,10 +2646,10 @@ Compare the items in the following lists:
\end{itemize}
\begin{description}
-\item[{simple}] \leavevmode
+\item[{simple}]
description term
-\item[{{[}bracketed{]}}] \leavevmode
+\item[{{[}bracketed{]}}]
description term
\end{description}
@@ -2719,7 +2719,7 @@ Long URLs should be wrapped in the PDF. This can be achieved with the
(name) of a reference node equals the link URL.
\begin{description}
-\item[{Example:}] \leavevmode
+\item[{Example:}]
a long URL that should wrap in the output
\url{http://docutils.sourceforge.net/docs/user/latex.html\#id79}
diff --git a/docutils/test/functional/expected/standalone_rst_latex.tex b/docutils/test/functional/expected/standalone_rst_latex.tex
index 95a45b359..24387c141 100644
--- a/docutils/test/functional/expected/standalone_rst_latex.tex
+++ b/docutils/test/functional/expected/standalone_rst_latex.tex
@@ -468,18 +468,18 @@ Paragraph 2 of item 2.
}
\begin{description}
-\item[{Term}] \leavevmode
+\item[{Term}]
Definition
-\item[{Term}] \leavevmode (\textbf{classifier})
+\item[{Term}] (\textbf{classifier})
Definition paragraph 1.
Definition paragraph 2.
-\item[{Term}] \leavevmode
+\item[{Term}]
Definition
-\item[{Term}] \leavevmode (\textbf{classifier one})(\textbf{classifier two})
+\item[{Term}] (\textbf{classifier one})(\textbf{classifier two})
Definition
\end{description}
@@ -1378,7 +1378,7 @@ list,
\end{DUfieldlist}
a paragraph,
\begin{description}
-\item[{a definition}] \leavevmode
+\item[{a definition}]
list,
\end{description}
@@ -1844,7 +1844,7 @@ with the \emph{wave function} $\Psi $, describes how the quantum state of a
physical system changes in time.
\begin{description}
-\item[{Math-Accents:}] \leavevmode
+\item[{Math-Accents:}] \leavevmode
\setlength{\DUtablewidth}{\linewidth}%
\begin{longtable*}{p{0.315\DUtablewidth}p{0.315\DUtablewidth}p{0.315\DUtablewidth}}
@@ -2192,7 +2192,7 @@ is contained in a quote
\end{quote}
\begin{description}
-\item[{In a definition list:}] \leavevmode
+\item[{In a definition list:}] \leavevmode
\begin{DUoptionlist}
\item[-{}-help] show help
@@ -2650,10 +2650,10 @@ Compare the items in the following lists:
\end{itemize}
\begin{description}
-\item[{simple}] \leavevmode
+\item[{simple}]
description term
-\item[{{[}bracketed{]}}] \leavevmode
+\item[{{[}bracketed{]}}]
description term
\end{description}
@@ -2723,7 +2723,7 @@ Long URLs should be wrapped in the PDF. This can be achieved with the
(name) of a reference node equals the link URL.
\begin{description}
-\item[{Example:}] \leavevmode
+\item[{Example:}]
a long URL that should wrap in the output
\url{http://docutils.sourceforge.net/docs/user/latex.html\#id79}
diff --git a/docutils/test/functional/expected/standalone_rst_xetex.tex b/docutils/test/functional/expected/standalone_rst_xetex.tex
index 4bbb8b940..bed8f2718 100644
--- a/docutils/test/functional/expected/standalone_rst_xetex.tex
+++ b/docutils/test/functional/expected/standalone_rst_xetex.tex
@@ -327,18 +327,18 @@ Paragraph 2 of item 2.
}
\begin{description}
-\item[{Term}] \leavevmode
+\item[{Term}]
Definition
-\item[{Term}] \leavevmode (\textbf{classifier})
+\item[{Term}] (\textbf{classifier})
Definition paragraph 1.
Definition paragraph 2.
-\item[{Term}] \leavevmode
+\item[{Term}]
Definition
-\item[{Term}] \leavevmode (\textbf{classifier one})(\textbf{classifier two})
+\item[{Term}] (\textbf{classifier one})(\textbf{classifier two})
Definition
\end{description}
@@ -1261,7 +1261,7 @@ list,
\end{DUfieldlist}
a paragraph,
\begin{description}
-\item[{a definition}] \leavevmode
+\item[{a definition}]
list,
\end{description}
@@ -1728,7 +1728,7 @@ with the \emph{wave function} $\Psi $, describes how the quantum state of a
physical system changes in time.
\begin{description}
-\item[{Math-Accents:}] \leavevmode
+\item[{Math-Accents:}] \leavevmode
\setlength{\DUtablewidth}{\linewidth}%
\begin{longtable*}{p{0.315\DUtablewidth}p{0.315\DUtablewidth}p{0.315\DUtablewidth}}
@@ -2076,7 +2076,7 @@ is contained in a quote
\end{quote}
\begin{description}
-\item[{In a definition list:}] \leavevmode
+\item[{In a definition list:}] \leavevmode
\begin{DUoptionlist}
\item[--help] show help
@@ -2534,10 +2534,10 @@ Compare the items in the following lists:
\end{itemize}
\begin{description}
-\item[{simple}] \leavevmode
+\item[{simple}]
description term
-\item[{{[}bracketed{]}}] \leavevmode
+\item[{{[}bracketed{]}}]
description term
\end{description}
@@ -2607,7 +2607,7 @@ Long URLs should be wrapped in the PDF. This can be achieved with the
(name) of a reference node equals the link URL.
\begin{description}
-\item[{Example:}] \leavevmode
+\item[{Example:}]
a long URL that should wrap in the output
\url{http://docutils.sourceforge.net/docs/user/latex.html\#id79}
diff --git a/docutils/test/functional/input/latex_leavevmode.txt b/docutils/test/functional/input/latex_leavevmode.txt
new file mode 100644
index 000000000..618c8950e
--- /dev/null
+++ b/docutils/test/functional/input/latex_leavevmode.txt
@@ -0,0 +1,164 @@
+Styling of Elements in Definition- or Field-List
+================================================
+
+:Authors: Hänsel, Gretel
+:Address: 123 Example Street
+ Example, EX Canada
+:Generic Docinfo List Field:
+ - This is a list.
+ - It does not require ``\leavevmode`` because it is in the docinfo.
+:Abstract:
+ Test that ``\leavevmode`` is inserted after the term or field-name
+ when required for correct placement of the item.
+
+Elements needing ``\leavevmode``
+********************************
+
+:Bullet List:
+ - This is a bullet list nested in a field list.
+ - It needs ``\leavevmode`` so that it will start on a new line
+ after the term.
+ - Without ``\leavevmode``, the first bullet would be on the same line as
+ the term, and the following bullets would not line up.
+
+:Enumerated List:
+ 1. This is an enumerated list.
+ 2. All lists need ``\leavevmode``.
+
+:Field List:
+ :Field List: Like this one
+ :Needs ``\leavevmode``: Yes
+
+:empty:
+
+Definition List
+ Nested
+ inside another definition list.
+ Needs ``\leavevmode``?
+ Yes.
+ Independent of the nesting level.
+
+Option List
+ -h Show help
+ -v Be verbose
+ --rare a) This description starts with an enumeration
+ c) but does not need ``\leavevmode``.
+
+Literal Block
+ ::
+
+ _needs_leavevmode = True
+
+Doctest Block
+ >>> needs_leavevmode(nodes.doctest_block)
+ True
+
+Line Block
+ | Needs "``\leavevmode``",
+ | so that all lines start with the same indent.
+
+Block Quote
+ ..
+
+ Block Quotes need "``\leavevmode``", too,
+ so that all lines start with the same indent.
+
+Table
+ +---+---+
+ | 1 | 2 |
+ +---+---+
+ | 3 | 4 |
+ +---+---+
+
+Figure
+ .. figure:: ../../../docs/user/rst/images/title.png
+
+ A figure
+
+Image
+ .. image:: ../../../docs/user/rst/images/title.png
+
+Rubric
+ .. rubric:: A Rubric
+
+Admonition
+ .. note::
+
+ Admonitions need to be preceded by ``\leavevmode``.
+ Otherwise, the term ends up centered above the admonition box.
+
+ So do *System Messages*, as they use the "DUadmonition"
+ LaTeX environment.
+
+
+Elements not needing ``\leavevmode``
+************************************
+
+Paragraph
+ Paragraphs don't need ``\leavevmode``. They are meant
+ to start after the term and have a hanging indent.
+
+ * Subsequent elements don't need ``\leavevmode`` either.
+
+Math Block
+ .. math::
+
+ \sum_{i=1}^n i = \frac{n^2+n}{2}
+
+ LaTeX starts math blocks (both single-line and multiline) in a new
+ paragraph automatically, with or without ``\leavevmode``, so
+ ``\leavevmode`` isn't needed.
+
+Term with Classifier: classifier
+ - After a *classifier*, ``\leavevmode`` is not required.
+ - This holds for all elements that normally need ``\leavevmode``.
+
+Ambiguous cases
+***************
+
+Comment and Target
+ .. This is ignored.
+
+ .. _foo:
+
+ * Comments and other "Invisible" nodes (substitution definitions,
+ targets, pending) must be skipped when determining whether a
+ ``\leavevmode`` is required.
+
+Substitution Definition and Class directive
+ .. |no-leavevmode| replace:: No (because a paragraph follows).
+
+ .. class:: test
+
+ Is ``\leavevmode`` required? Answer: |no-leavevmode|
+
+Compound
+ .. compound::
+
+ `Compound` and `Container` wrap around other block elements.
+ They get a ``\leavevmode``, if the first nested element is a
+ list or similar.
+
+Container
+ .. container:: my-class
+
+ * This list inside a container requires a ``\leavevmode``.
+
+Footnote
+ .. [#f1] This footnote will move to the bottom of the page.
+
+ A ``\leavevmode`` is required, if the first list item value is a
+ footnote and a list or similar follows.
+
+Citation
+ .. [example73] No Name, "Citations move to the bottom as well",
+ Musterstadt, 1973.
+
+ * A ``\leavevmode`` is required, if the first list item value is a
+ citation and a list or similar follows.
+
+Raw Block Text
+ .. raw:: latex
+
+ “Raw” blocks are always preceded by
+ \verb|\leavevmode|, just in case.
diff --git a/docutils/test/functional/tests/latex_leavevmode.py b/docutils/test/functional/tests/latex_leavevmode.py
new file mode 100644
index 000000000..64ec4a72a
--- /dev/null
+++ b/docutils/test/functional/tests/latex_leavevmode.py
@@ -0,0 +1,10 @@
+# Source and destination file names.
+test_source = "latex_leavevmode.txt"
+test_destination = "latex_leavevmode.tex"
+
+# Keyword parameters passed to publish_file.
+writer_name = "latex"
+
+# Settings
+# use "smartquotes" transition:
+settings_overrides['smart_quotes'] = True