Merge branch '2.0'

This commit is contained in:
Takeshi KOMIYA 2019-06-02 01:09:09 +09:00
commit 5da74898c3
13 changed files with 117 additions and 25 deletions

25
CHANGES
View File

@ -165,6 +165,31 @@ Bugs fixed
Testing Testing
-------- --------
Release 2.0.2 (in development)
==============================
Dependencies
------------
Incompatible changes
--------------------
Deprecated
----------
Features added
--------------
Bugs fixed
----------
* #6286: C++, allow 8 and 9 in hexadecimal integer literals.
* #6305: Fix the string in quickstart for 'path' argument of parser
* LaTeX: Figures in admonitions produced errors (refs: #6364)
Testing
--------
Release 2.0.1 (released Apr 08, 2019) Release 2.0.1 (released Apr 08, 2019)
===================================== =====================================

View File

@ -740,19 +740,41 @@ thus allowing redefinitions. Check the respective files for the defaults.
Macros Macros
~~~~~~ ~~~~~~
- text styling commands ``\sphinx<foo>`` with ``<foo>`` being one of - text styling commands:
``strong``, ``bfcode``, ``email``, ``tablecontinued``, ``titleref``,
``menuselection``, ``accelerator``, ``crossref``, ``termref``, ``optional``.
- ``\sphinxstrong``,
- ``\sphinxbfcode``,
- ``\sphinxemail``,
- ``\sphinxtablecontinued``,
- ``\sphinxtitleref``,
- ``\sphinxmenuselection``,
- ``\sphinxaccelerator``,
- ``\sphinxcrossref``,
- ``\sphinxtermref``,
- ``\sphinxoptional``.
.. versionadded:: 1.4.5 .. versionadded:: 1.4.5
Use of ``\sphinx`` prefixed macro names to limit possibilities of conflict Use of ``\sphinx`` prefixed macro names to limit possibilities of conflict
with LaTeX packages. with LaTeX packages.
- more text styling: ``\sphinxstyle<bar>`` with ``<bar>`` one of - more text styling:
``indexentry``, ``indexextra``, ``indexpageref``, ``topictitle``,
``sidebartitle``, ``othertitle``, ``sidebarsubtitle``, ``theadfamily``,
``emphasis``, ``literalemphasis``, ``strong``, ``literalstrong``,
``abbreviation``, ``literalintitle``, ``codecontinued``, ``codecontinues``
- ``\sphinxstyleindexentry``,
- ``\sphinxstyleindexextra``,
- ``\sphinxstyleindexpageref``,
- ``\sphinxstyletopictitle``,
- ``\sphinxstylesidebartitle``,
- ``\sphinxstyleothertitle``,
- ``\sphinxstylesidebarsubtitle``,
- ``\sphinxstyletheadfamily``,
- ``\sphinxstyleemphasis``,
- ``\sphinxstyleliteralemphasis``,
- ``\sphinxstylestrong``,
- ``\sphinxstyleliteralstrong``,
- ``\sphinxstyleabbreviation``,
- ``\sphinxstyleliteralintitle``,
- ``\sphinxstylecodecontinued``,
- ``\sphinxstylecodecontinues``.
.. versionadded:: 1.5 .. versionadded:: 1.5
these macros were formerly hard-coded as non customizable ``\texttt``, these macros were formerly hard-coded as non customizable ``\texttt``,
``\emph``, etc... ``\emph``, etc...
@ -761,7 +783,7 @@ Macros
multiple paragraphs in header cells of tables. multiple paragraphs in header cells of tables.
.. versionadded:: 1.6.3 .. versionadded:: 1.6.3
``\sphinxstylecodecontinued`` and ``\sphinxstylecodecontinues``. ``\sphinxstylecodecontinued`` and ``\sphinxstylecodecontinues``.
- the table of contents is typeset via ``\sphinxtableofcontents`` which is a - ``\sphinxtableofcontents``: it is a
wrapper (defined differently in :file:`sphinxhowto.cls` and in wrapper (defined differently in :file:`sphinxhowto.cls` and in
:file:`sphinxmanual.cls`) of standard ``\tableofcontents``. The macro :file:`sphinxmanual.cls`) of standard ``\tableofcontents``. The macro
``\sphinxtableofcontentshook`` is executed during its expansion right before ``\sphinxtableofcontentshook`` is executed during its expansion right before
@ -774,22 +796,22 @@ Macros
done during loading of ``'manual'`` docclass are now executed later via done during loading of ``'manual'`` docclass are now executed later via
``\sphinxtableofcontentshook``. This macro is also executed by the ``\sphinxtableofcontentshook``. This macro is also executed by the
``'howto'`` docclass, but defaults to empty with it. ``'howto'`` docclass, but defaults to empty with it.
- a custom ``\sphinxmaketitle`` is defined in the class files - ``\sphinxmaketitle``: it is defined in the class files
:file:`sphinxmanual.cls` and :file:`sphinxhowto.cls` and is used as :file:`sphinxmanual.cls` and :file:`sphinxhowto.cls` and is used as
default setting of ``'maketitle'`` :confval:`latex_elements` key. default setting of ``'maketitle'`` :confval:`latex_elements` key.
.. versionchanged:: 1.8.3 .. versionchanged:: 1.8.3
formerly, ``\maketitle`` from LaTeX document class was modified by formerly, ``\maketitle`` from LaTeX document class was modified by
Sphinx. Sphinx.
- for ``'manual'`` docclass a macro ``\sphinxbackoftitlepage``, if it is - ``\sphinxbackoftitlepage``: for ``'manual'`` docclass, and if it is
defined, gets executed at end of ``\sphinxmaketitle``, before the final defined, it gets executed at end of ``\sphinxmaketitle``, before the final
``\clearpage``. Use either the ``'maketitle'`` key or the ``'preamble'`` key ``\clearpage``. Use either the ``'maketitle'`` key or the ``'preamble'`` key
of :confval:`latex_elements` to add a custom definition of of :confval:`latex_elements` to add a custom definition of
``\sphinxbackoftitlepage``. ``\sphinxbackoftitlepage``.
.. versionadded:: 1.8.3 .. versionadded:: 1.8.3
- the citation reference is typeset via ``\sphinxcite`` which is a wrapper - ``\sphinxcite``: it is a wrapper of standard ``\cite`` for citation
of standard ``\cite``. references.
Environments Environments
~~~~~~~~~~~~ ~~~~~~~~~~~~
@ -801,12 +823,23 @@ Environments
.. versionadded:: 1.5.6 .. versionadded:: 1.5.6
formerly, the ``\small`` was hardcoded in LaTeX writer and the ending formerly, the ``\small`` was hardcoded in LaTeX writer and the ending
``\par`` was lacking. ``\par`` was lacking.
- for each admonition type ``<foo>``, the - environments associated with admonitions:
used environment is named ``sphinx<foo>``. They may be ``\renewenvironment``
- ``sphinxnote``,
- ``sphinxhint``,
- ``sphinximportant``,
- ``sphinxtip``,
- ``sphinxwarning``,
- ``sphinxcaution``,
- ``sphinxattention``,
- ``sphinxdanger``,
- ``sphinxerror``.
They may be ``\renewenvironment``
'd individually, and must then be defined with one argument (it is the heading 'd individually, and must then be defined with one argument (it is the heading
of the notice, for example ``Warning:`` for :dudir:`warning` directive, if of the notice, for example ``Warning:`` for :dudir:`warning` directive, if
English is the document language). Their default definitions use either the English is the document language). Their default definitions use either the
*sphinxheavybox* (for the first listed directives) or the *sphinxlightbox* *sphinxheavybox* (for the last 5 ones) or the *sphinxlightbox*
environments, configured to use the parameters (colours, border thickness) environments, configured to use the parameters (colours, border thickness)
specific to each type, which can be set via ``'sphinxsetup'`` string. specific to each type, which can be set via ``'sphinxsetup'`` string.

View File

@ -497,6 +497,17 @@ General configuration
direct usage of :program:`sphinx-build` as it caches direct usage of :program:`sphinx-build` as it caches
(in its default usage) the parsed source files in per builder locations. (in its default usage) the parsed source files in per builder locations.
.. hint:: An alternative way to effectively deactivate (or customize) the
smart quotes for a given builder, for example ``latex``, is to use
``make`` this way:
.. code-block:: console
make latex O="-D smartquotes_action="
This can follow some ``make html`` with no problem, in contrast to the
situation from the prior note. It requires Docutils 0.14 or later.
.. versionadded:: 1.6.6 .. versionadded:: 1.6.6
.. confval:: tls_verify .. confval:: tls_verify

View File

@ -45,7 +45,7 @@ def handle_exception(app, args, exception, stderr=sys.stderr):
traceback.print_exc(None, stderr) traceback.print_exc(None, stderr)
print(file=stderr) print(file=stderr)
if isinstance(exception, KeyboardInterrupt): if isinstance(exception, KeyboardInterrupt):
print(__('interrupted!'), file=stderr) print(__('Interrupted!'), file=stderr)
elif isinstance(exception, SystemMessage): elif isinstance(exception, SystemMessage):
print(red(__('reST markup error:')), file=stderr) print(red(__('reST markup error:')), file=stderr)
print(terminal_safe(exception.args[0]), file=stderr) print(terminal_safe(exception.args[0]), file=stderr)

View File

@ -506,7 +506,7 @@ def get_parser():
version='%%(prog)s %s' % __display_version__) version='%%(prog)s %s' % __display_version__)
parser.add_argument('path', metavar='PROJECT_DIR', default='.', nargs='?', parser.add_argument('path', metavar='PROJECT_DIR', default='.', nargs='?',
help=__('output path')) help=__('project root'))
group = parser.add_argument_group(__('Structure options')) group = parser.add_argument_group(__('Structure options'))
group.add_argument('--sep', action='store_true', default=None, group.add_argument('--sep', action='store_true', default=None,

View File

@ -48,8 +48,8 @@ class _ModuleWrapper:
def __getattr__(self, name): def __getattr__(self, name):
# type: (str) -> Any # type: (str) -> Any
if name in self._objects: if name in self._objects:
warnings.warn("%s.%s is now deprecated. Please refer CHANGES to grasp " warnings.warn("%s.%s is deprecated. Check CHANGES for Sphinx "
"the changes of Sphinx API." % (self._modname, name), "API modifications." % (self._modname, name),
self._warning, stacklevel=3) self._warning, stacklevel=3)
return self._objects[name] return self._objects[name]

View File

@ -292,7 +292,7 @@ logger = logging.getLogger(__name__)
_integer_literal_re = re.compile(r'[1-9][0-9]*') _integer_literal_re = re.compile(r'[1-9][0-9]*')
_octal_literal_re = re.compile(r'0[0-7]*') _octal_literal_re = re.compile(r'0[0-7]*')
_hex_literal_re = re.compile(r'0[xX][0-7a-fA-F][0-7a-fA-F]*') _hex_literal_re = re.compile(r'0[xX][0-9a-fA-F][0-9a-fA-F]*')
_binary_literal_re = re.compile(r'0[bB][01][01]*') _binary_literal_re = re.compile(r'0[bB][01][01]*')
_integer_suffix_re = re.compile(r'') _integer_suffix_re = re.compile(r'')
_float_literal_re = re.compile(r'''(?x) _float_literal_re = re.compile(r'''(?x)

View File

@ -466,6 +466,7 @@ class LaTeXTranslator(SphinxTranslator):
self.in_term = 0 self.in_term = 0
self.needs_linetrimming = 0 self.needs_linetrimming = 0
self.in_minipage = 0 self.in_minipage = 0
self.no_latex_floats = 0
self.first_document = 1 self.first_document = 1
self.this_is_the_title = 1 self.this_is_the_title = 1
self.literal_whitespace = 0 self.literal_whitespace = 0
@ -1587,6 +1588,9 @@ class LaTeXTranslator(SphinxTranslator):
def visit_figure(self, node): def visit_figure(self, node):
# type: (nodes.Element) -> None # type: (nodes.Element) -> None
align = self.elements['figure_align']
if self.no_latex_floats:
align = "H"
if self.table: if self.table:
# TODO: support align option # TODO: support align option
if 'width' in node: if 'width' in node:
@ -1612,8 +1616,7 @@ class LaTeXTranslator(SphinxTranslator):
self.body.append('\n\\begin{center}') self.body.append('\n\\begin{center}')
self.context.append('\\end{center}\n') self.context.append('\\end{center}\n')
else: else:
self.body.append('\n\\begin{figure}[%s]\n\\centering\n' % self.body.append('\n\\begin{figure}[%s]\n\\centering\n' % align)
self.elements['figure_align'])
if any(isinstance(child, nodes.caption) for child in node): if any(isinstance(child, nodes.caption) for child in node):
self.body.append('\\capstart\n') self.body.append('\\capstart\n')
self.context.append('\\end{figure}\n') self.context.append('\\end{figure}\n')
@ -1653,20 +1656,24 @@ class LaTeXTranslator(SphinxTranslator):
def visit_admonition(self, node): def visit_admonition(self, node):
# type: (nodes.Element) -> None # type: (nodes.Element) -> None
self.body.append('\n\\begin{sphinxadmonition}{note}') self.body.append('\n\\begin{sphinxadmonition}{note}')
self.no_latex_floats += 1
def depart_admonition(self, node): def depart_admonition(self, node):
# type: (nodes.Element) -> None # type: (nodes.Element) -> None
self.body.append('\\end{sphinxadmonition}\n') self.body.append('\\end{sphinxadmonition}\n')
self.no_latex_floats -= 1
def _visit_named_admonition(self, node): def _visit_named_admonition(self, node):
# type: (nodes.Element) -> None # type: (nodes.Element) -> None
label = admonitionlabels[node.tagname] label = admonitionlabels[node.tagname]
self.body.append('\n\\begin{sphinxadmonition}{%s}{%s:}' % self.body.append('\n\\begin{sphinxadmonition}{%s}{%s:}' %
(node.tagname, label)) (node.tagname, label))
self.no_latex_floats += 1
def _depart_named_admonition(self, node): def _depart_named_admonition(self, node):
# type: (nodes.Element) -> None # type: (nodes.Element) -> None
self.body.append('\\end{sphinxadmonition}\n') self.body.append('\\end{sphinxadmonition}\n')
self.no_latex_floats -= 1
visit_attention = _visit_named_admonition visit_attention = _visit_named_admonition
depart_attention = _depart_named_admonition depart_attention = _depart_named_admonition

View File

@ -0,0 +1 @@
exclude_patterns = ['_build']

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

View File

@ -0,0 +1,9 @@
Test Figure in Admonition
=========================
.. caution::
This uses a figure in an admonition.
.. figure:: img.png

View File

@ -1399,6 +1399,12 @@ def test_latex_labels(app, status, warning):
assert result.count(r'\label{\detokenize{index:section1}}') == 1 assert result.count(r'\label{\detokenize{index:section1}}') == 1
@pytest.mark.sphinx('latex', testroot='latex-figure-in-admonition')
def test_latex_figure_in_admonition(app, status, warning):
app.builder.build_all()
result = (app.outdir / 'python.tex').text(encoding='utf8')
assert(r'\begin{figure}[H]' in result)
def test_default_latex_documents(): def test_default_latex_documents():
from sphinx.util import texescape from sphinx.util import texescape
texescape.init() texescape.init()

View File

@ -114,7 +114,7 @@ def test_expressions():
exprCheck('nullptr', 'LDnE') exprCheck('nullptr', 'LDnE')
exprCheck('true', 'L1E') exprCheck('true', 'L1E')
exprCheck('false', 'L0E') exprCheck('false', 'L0E')
ints = ['5', '0', '075', '0xF', '0XF', '0b1', '0B1'] ints = ['5', '0', '075', '0x0123456789ABCDEF', '0XF', '0b1', '0B1']
unsignedSuffix = ['', 'u', 'U'] unsignedSuffix = ['', 'u', 'U']
longSuffix = ['', 'l', 'L', 'll', 'LL'] longSuffix = ['', 'l', 'L', 'll', 'LL']
for i in ints: for i in ints: