diff options
-rw-r--r-- | CHANGES | 49 | ||||
-rw-r--r-- | doc/conf.py | 7 | ||||
-rw-r--r-- | doc/usage/builders/index.rst | 2 | ||||
-rw-r--r-- | doc/usage/configuration.rst | 103 | ||||
-rw-r--r-- | sphinx/templates/latex/latex.tex_t | 2 | ||||
-rw-r--r-- | sphinx/texinputs/sphinx.sty | 24 | ||||
-rw-r--r-- | sphinx/texinputs/sphinx.xdy | 89 | ||||
-rw-r--r-- | sphinx/util/texescape.py | 52 | ||||
-rw-r--r-- | sphinx/writers/latex.py | 68 | ||||
-rw-r--r-- | tests/test_markup.py | 4 |
10 files changed, 287 insertions, 113 deletions
@@ -4,7 +4,41 @@ Release 2.0.0 (in development) Dependencies ------------ -* LaTeX builder now depends on TeX Live 2015 or above +* LaTeX builder now depends on TeX Live 2015 or above. +* LaTeX builder may need these additional LaTeX packages for PDF builds + (with ``'pdflatex'`` :confval:`latex_engine`): + + .. list-table:: Requirements + :header-rows: 1 + + * - LaTeX package (CTAN) + - Ubuntu xenial + - needed for + * - substitutefont + - texlive-latex-extra + - Greek or Cyrillic letters (in non-Cyrillic documents) + * - textalpha + - texlive-lang-greek + - Greek letters (in text, not math) + * - gfsartemisia + - fonts-gfs-artemisia (texlive-fonts-extra) + - Greek letters (in text, not math) + * - gfsneohellenic + - fonts-gfs-neohellenic (texlive-fonts-extra) + - Greek letters (in text, not math) + * - cbfonts + - texlive-lang-greek + - Greek letters (in text, not math) + * - cm-lgc + - texlive-fonts-extra + - Cyrillic letters (in non-Cyrillic documents) + + These extra package are not required by default. The first two are needed if + the :confval:`latex_elements`.\ ``'fontenc'`` key has been modify to declare + the use of the ``LGR`` (Greek) and/or ``T2A`` (Cyrillic) font encoding. Even + then, the last four are font packages arising in the default value for + :confval:`latex_elements`.\ ``'fontpkg'``, and may be replaced by other font + packages providing ``LGR`` and/or ``T2A`` support. Incompatible changes -------------------- @@ -15,6 +49,11 @@ Incompatible changes has been longly used as default of sphinx-quickstart. * LaTeX: Move message resources to ``sphinxmessage.sty`` * LaTeX: Stop using ``\captions<lang>`` macro for some labels +* LaTeX: Greek letters in text are not escaped to math mode mark-up, and they + will use the text font not the math font. If (and only if) the document + contains such Greek Unicode letters *and* the :confval:`latex_engine` is + ``'pdflatex'`` then the :confval:`latex_elements`.\ ``'fontenc'`` key + **must** be used to declare usage of the ``LGR`` font encoding. Deprecated ---------- @@ -58,10 +97,18 @@ __ https://github.com/sphinx-contrib/sphinx-pretty-searchresults * #4018: htmlhelp: Add :confval:`htmlhelp_file_suffix` and :confval:`htmlhelp_link_suffix` * #5559: text: Support complex tables (colspan and rowspan) +* LaTeX: support rendering (not in math, yet) of Greek and Cyrillic Unicode + letters in non-Cyrillic document even with ``'pdflatex'`` as + :confval:`latex_engine` Bugs fixed ---------- +* #5247: LaTeX: PDF does not build with default font config for Russian + language and ``'xelatex'`` or ``'lualatex'`` as :confval:`latex_engine` + (refs: #5251) +* #5248: LaTeX: Greek letters in section titles disappear from PDF bookmarks + Testing -------- diff --git a/doc/conf.py b/doc/conf.py index e06d70150..661efb434 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -56,10 +56,17 @@ latex_documents = [('contents', 'sphinx.tex', 'Sphinx Documentation', 'Georg Brandl', 'manual', 1)] latex_logo = '_static/sphinx.png' latex_elements = { + 'fontenc': r'\usepackage[LGR,T2A,T1]{fontenc}', 'fontpkg': r''' \usepackage[sc]{mathpazo} \usepackage[scaled]{helvet} \usepackage{courier} +\substitutefont{LGR}{\rmdefault}{udidot} +\substitutefont{LGR}{\sfdefault}{neohellenic} +\substitutefont{LGR}{\ttdefault}{cmtt} +\substitutefont{T2A}{\rmdefault}{fcm} +\substitutefont{T2A}{\sfdefault}{fcs} +\substitutefont{T2A}{\ttdefault}{fct} ''', 'passoptionstopackages': '\\PassOptionsToPackage{svgnames}{xcolor}', 'preamble': '\\DeclareUnicodeCharacter{229E}{\\ensuremath{\\boxplus}}', diff --git a/doc/usage/builders/index.rst b/doc/usage/builders/index.rst index e7ad13bd1..3f16c84e5 100644 --- a/doc/usage/builders/index.rst +++ b/doc/usage/builders/index.rst @@ -164,6 +164,8 @@ The builder's "name" must be given to the **-b** command-line option of * ``texlive-latex-recommended`` * ``texlive-fonts-recommended`` * ``texlive-latex-extra`` + * ``texlive-fonts-extra``, ``texlive-lang-greek`` (if needed to + support Greek or Cyrillic letters in non-cyrillic document) * ``latexmk`` (for ``make latexpdf`` on GNU/Linux and MacOS X) * ``texlive-luatex``, ``texlive-xetex`` (see :confval:`latex_engine`) diff --git a/doc/usage/configuration.rst b/doc/usage/configuration.rst index f64ec73bc..765431fe2 100644 --- a/doc/usage/configuration.rst +++ b/doc/usage/configuration.rst @@ -2043,17 +2043,48 @@ information. ``babel``, not ``polyglossia``. ``'fontpkg'`` - Font package inclusion, default ``'\\usepackage{times}'`` (which uses - Times for text, Helvetica for sans serif and Courier for code-blocks). + Font package inclusion, the default is ``'\\usepackage{times}'`` which + uses Times for text, Helvetica for sans serif and Courier for monospace. .. versionchanged:: 1.2 Defaults to ``''`` when the :confval:`language` uses the Cyrillic script. - .. versionchanged:: 1.5 - Defaults to ``''`` when :confval:`latex_engine` is ``'xelatex'``. - .. versionchanged:: 1.6 - Defaults to ``''`` also with ``'lualatex'``. - + .. versionchanged:: 2.0 + Support for individual Greek and Cyrillic letters: + + - In order to support occasional Cyrillic (физика частиц) + or Greek letters (Σωματιδιακή φυσική) in + a document whose language is English or a Latin European + one, the default set-up is enhanced (only for ``'pdflatex'`` + engine) to do: + + .. code-block:: latex + + \substitutefont{LGR}{\rmdefault}{artemisia} + \substitutefont{LGR}{\sfdefault}{neohellenic} + \substitutefont{LGR}{\ttdefault}{cmtt} + \substitutefont{T2A}{\rmdefault}{fcm} + \substitutefont{T2A}{\sfdefault}{fcs} + \substitutefont{T2A}{\ttdefault}{fct} + + For this however, the ``'fontenc'`` key must be used to tell + LaTeX to load the ``LGR`` (Greek) or ``T2A`` (partial Cyrillic) + font encoding. If ``'fontenc'`` is not modified the above lines + are not executed. + + In a custom ``'fontpkg'`` setting, do not use ``\substitutefont`` + with a font encoding not also declared via ``'fontenc'``. + + - For ``'xelatex'`` and ``'lualatex'``, the default is + ``'\\setmainfont{CMU Serif}'`` (and similar for sans + serif and monospace) . This OpenType font family supports + both Cyrillic and Greek scripts (contrarily to the + default font configured by LaTeX for ``xelatex/lualatex`` + if ``'fontpkg'`` is left to empty string, as was the case + prior to 2.0). + + - ``'platex'`` (Japanese documents) engine supports individual + Cyrillic and Greek letters with no need of extra user set-up. ``'fncychap'`` Inclusion of the "fncychap" package (which makes fancy chapter titles), default ``'\\usepackage[Bjarne]{fncychap}'`` for English documentation @@ -2130,13 +2161,69 @@ information. .. versionadded:: 1.2 ``'fontenc'`` - "fontenc" package inclusion, default ``'\\usepackage[T1]{fontenc}'``. + "fontenc" package inclusion, defaults to + ``'\\usepackage[T1]{fontenc}'``. .. versionchanged:: 1.5 Defaults to ``'\\usepackage{fontspec}'`` when :confval:`latex_engine` is ``'xelatex'``. .. versionchanged:: 1.6 ``'lualatex'`` also uses ``fontspec`` per default. + .. versionchanged:: 2.0 + With ``'pdflatex'`` you can add ``LGR`` and/or ``T2A`` + (before ``T1`` which should remain the last) to trigger + automatic support of occasional Greek and Cyrillic letters + in text. + + .. attention:: + + Prior to 2.0, Unicode Greek letters were escaped to use LaTeX + math mark-up. This is not the case anymore so it may be needed + to modify this key into ``'\\usepackage[LGR,T1]{fontenc}'`` and + also to make sure to have the suitable Greek font packages + as listed in :doc:`../changes` (or replacements). + + ``'textgreek'`` + The default (``'pdflatex'`` only) is + ``'\\usepackage{textalpha}'``, but only if ``'fontenc'`` was + modified by user to include ``LGR`` option. If not, the key + value will be forced to be empty string. + + This is needed for ``pdfLaTeX`` to support Unicode input of Greek + letters such as φύσις. Expert users may want to load the ``textalpha`` + package with its option ``normalize-symbols``. + + .. note:: + + - Unicode Greek letters in text were, prior to release 2.0, escaped + to LaTeX math markup in the produced LaTeX file, hence their + rendering in PDF used the math font. They are now copied over + unmodified to the LaTeX file and rendered in PDF by the text + font. But the ``LGR`` font encoding must be loaded. + + - Unicode Greek letters are not accepted in :rst:dir:`math` + contents. LaTeX math mark-up ``\alpha`` etc..., must be used + there. + + - With ``'xelatex'`` or ``'lualatex'``, this is ignored as the + support for Unicode Greek letters comes from using an OpenType + font which supports the Greek script. This is the case (since + 2.0) with the default fonts used by Sphinx for these engines. + + Besides, Unicode input in math (not only Greek symbols) can be + obtained by adding ``\usepackage{unicode-math}`` to the LaTeX + preamble (and perhaps use ``\setmathfont`` to switch to some + other OpenMath font than the XeLaTeX default). Then one can use + ``:math:`α=\alpha``` input. But take note that + ``\usepackage[math-style=literal]{unicode-math}`` is needed to + obtain in PDF similar output as in HTML+MathJaX, i.e. the ``α`` + remains upright, and the ``\alpha`` gives an italic letter. + + - With ``platex`` (Japanese), this key setting is ignored: + Greek (and Cyrillic) letters are handled natively by the engine + own default fonts. + + .. versionadded:: 2.0 ``'geometry'`` "geometry" package inclusion, the default definition is: diff --git a/sphinx/templates/latex/latex.tex_t b/sphinx/templates/latex/latex.tex_t index e75a9e8ce..06b94b0f2 100644 --- a/sphinx/templates/latex/latex.tex_t +++ b/sphinx/templates/latex/latex.tex_t @@ -26,7 +26,9 @@ <%= fontenc %> <%= amsmath %> <%= multilingual %> +<%= substitutefont %> <%= fontpkg %> +<%= textgreek %> <%= fncychap %> \usepackage<%= sphinxpkgoptions %>{sphinx} <%= sphinxsetup %> diff --git a/sphinx/texinputs/sphinx.sty b/sphinx/texinputs/sphinx.sty index 249f2ece0..5aa1d586a 100644 --- a/sphinx/texinputs/sphinx.sty +++ b/sphinx/texinputs/sphinx.sty @@ -247,6 +247,8 @@ \DeclareStringOption[\inv@mag in]{vmargin} \DeclareStringOption[.5\dimexpr\inv@mag in\relax]{marginpar} \fi +% Allow Cyrillic letters in non-Cyrillic document (needed for pdflatex only) +\DeclareBoolOption[false]{cyrnocyr} \DeclareStringOption[0]{maxlistdepth}% \newcommand*\spx@opt@maxlistdepth{0} \DeclareStringOption[-1]{numfigreset} @@ -361,6 +363,28 @@ \newcommand\sphinxsetup[1]{\setkeys{sphinx}{#1}} +%% CYRILLIC IN NON-CYRILLIC DOCUMENTS (pdflatex only) +% +% refs: https://tex.stackexchange.com/q/460271/4686 +% +\ifspx@opt@cyrnocyr + \@tfor\@tempa:=% + {ae}{a}{b}{chrdsc}{chvcrs}{ch}{c}{dje}{dze}{dzhe}{d}{erev}{ery}{e}% + {f}{ghcrs}{gup}{g}{hdsc}{hrdsn}{h}{ie}{ii}{ishrt}{i}{je}% + {kbeak}{kdsc}{kvcrs}{k}{lje}{l}{m}{ndsc}{ng}{nje}{n}{otld}{o}{p}{r}% + {schwa}{sdsc}{sftsn}{shch}{shha}{sh}{s}{tshe}{t}{ushrt}{u}{v}% + {ya}{yhcrs}{yi}{yo}{yu}{y}{zdsc}{zhdsc}{zh}{z}\do + {% + \expandafter\DeclareTextSymbolDefault\expandafter + {\csname cyr\@tempa\endcsname}{T2A}% + \expandafter\uppercase\expandafter{\expandafter + \def\expandafter\@tempa\expandafter{\@tempa}}% + \expandafter\DeclareTextSymbolDefault\expandafter + {\csname CYR\@tempa\endcsname}{T2A}% + }% + \DeclareTextSymbolDefault{\CYRpalochka}{T2A}% +\fi + %% MAXLISTDEPTH % % remove LaTeX's cap on nesting depth if 'maxlistdepth' key used. diff --git a/sphinx/texinputs/sphinx.xdy b/sphinx/texinputs/sphinx.xdy index 0d02ef337..1c0794cd9 100644 --- a/sphinx/texinputs/sphinx.xdy +++ b/sphinx/texinputs/sphinx.xdy @@ -147,40 +147,61 @@ (merge-rule "\(\sb{\text{7}}\)" "₇" :string) (merge-rule "\(\sb{\text{8}}\)" "₈" :string) (merge-rule "\(\sb{\text{9}}\)" "₉" :string) -(merge-rule "\(\alpha\)" "α" :string) -(merge-rule "\(\beta\)" "β" :string) -(merge-rule "\(\gamma\)" "γ" :string) -(merge-rule "\(\delta\)" "δ" :string) -(merge-rule "\(\epsilon\)" "ε" :string) -(merge-rule "\(\zeta\)" "ζ" :string) -(merge-rule "\(\eta\)" "η" :string) -(merge-rule "\(\theta\)" "θ" :string) -(merge-rule "\(\iota\)" "ι" :string) -(merge-rule "\(\kappa\)" "κ" :string) -(merge-rule "\(\lambda\)" "λ" :string) -(merge-rule "\(\mu\)" "μ" :string) -(merge-rule "\(\nu\)" "ν" :string) -(merge-rule "\(\xi\)" "ξ" :string) -(merge-rule "\(\pi\)" "π" :string) -(merge-rule "\(\rho\)" "ρ" :string) -(merge-rule "\(\sigma\)" "σ" :string) -(merge-rule "\(\tau\)" "τ" :string) -(merge-rule "\(\upsilon\)" "υ" :string) -(merge-rule "\(\phi\)" "φ" :string) -(merge-rule "\(\chi\)" "χ" :string) -(merge-rule "\(\psi\)" "ψ" :string) -(merge-rule "\(\omega\)" "ω" :string) -(merge-rule "\(\Gamma\)" "Γ" :string) -(merge-rule "\(\Delta\)" "Δ" :string) -(merge-rule "\(\Theta\)" "Θ" :string) -(merge-rule "\(\Lambda\)" "Λ" :string) -(merge-rule "\(\Xi\)" "Ξ" :string) -(merge-rule "\(\Pi\)" "Π" :string) -(merge-rule "\(\Sigma\)" "Σ" :string) -(merge-rule "\(\Upsilon\)" "Υ" :string) -(merge-rule "\(\Phi\)" "Φ" :string) -(merge-rule "\(\Psi\)" "Ψ" :string) -(merge-rule "\(\Omega\)" "Ω" :string) +(merge-rule "\IeC {\textalpha }" "α" :string) +(merge-rule "\IeC {\textbeta }" "β" :string) +(merge-rule "\IeC {\textgamma }" "γ" :string) +(merge-rule "\IeC {\textdelta }" "δ" :string) +(merge-rule "\IeC {\textepsilon }" "ε" :string) +(merge-rule "\IeC {\textzeta }" "ζ" :string) +(merge-rule "\IeC {\texteta }" "η" :string) +(merge-rule "\IeC {\texttheta }" "θ" :string) +(merge-rule "\IeC {\textiota }" "ι" :string) +(merge-rule "\IeC {\textkappa }" "κ" :string) +(merge-rule "\IeC {\textlambda }" "λ" :string) +(merge-rule "\IeC {\textmu }" "μ" :string) +(merge-rule "\IeC {\textnu }" "ν" :string) +(merge-rule "\IeC {\textxi }" "ξ" :string) +(merge-rule "\IeC {\textomicron }" "ο" :string) +(merge-rule "\IeC {\textpi }" "π" :string) +(merge-rule "\IeC {\textrho }" "ρ" :string) +(merge-rule "\IeC {\textsigma }" "σ" :string) +(merge-rule "\IeC {\texttau }" "τ" :string) +(merge-rule "\IeC {\textupsilon }" "υ" :string) +(merge-rule "\IeC {\textphi }" "φ" :string) +(merge-rule "\IeC {\textchi }" "χ" :string) +(merge-rule "\IeC {\textpsi }" "ψ" :string) +(merge-rule "\IeC {\textomega }" "ω" :string) +(merge-rule "\IeC {\textAlpha }" "Α" :string) +(merge-rule "\IeC {\textBeta }" "Β" :string) +(merge-rule "\IeC {\textGamma }" "Γ" :string) +(merge-rule "\IeC {\textDelta }" "Δ" :string) +(merge-rule "\IeC {\textEpsilon }" "Ε" :string) +(merge-rule "\IeC {\textZeta }" "Ζ" :string) +(merge-rule "\IeC {\textEta }" "Η" :string) +(merge-rule "\IeC {\textTheta }" "Θ" :string) +(merge-rule "\IeC {\textIota }" "Ι" :string) +(merge-rule "\IeC {\textKappa }" "Κ" :string) +(merge-rule "\IeC {\textLambda }" "Λ" :string) +(merge-rule "\IeC {\textMu }" "Μ" :string) +(merge-rule "\IeC {\textNu }" "Ν" :string) +(merge-rule "\IeC {\textTheta }" "Θ" :string) +(merge-rule "\IeC {\textIota }" "Ι" :string) +(merge-rule "\IeC {\textKappa }" "Κ" :string) +(merge-rule "\IeC {\textLambda }" "Λ" :string) +(merge-rule "\IeC {\textMu }" "Μ" :string) +(merge-rule "\IeC {\textNu }" "Ν" :string) +(merge-rule "\IeC {\textXi }" "Ξ" :string) +(merge-rule "\IeC {\textOmicron }" "Ο" :string) +(merge-rule "\IeC {\textPi }" "Π" :string) +(merge-rule "\IeC {\textRho }" "Ρ" :string) +(merge-rule "\IeC {\textSigma }" "Σ" :string) +(merge-rule "\IeC {\textTau }" "Τ" :string) +(merge-rule "\IeC {\textUpsilon }" "Υ" :string) +(merge-rule "\IeC {\textPhi }" "Φ" :string) +(merge-rule "\IeC {\textChi }" "Χ" :string) +(merge-rule "\IeC {\textPsi }" "Ψ" :string) +(merge-rule "\IeC {\textOmega }" "Ω" :string) +(merge-rule "\IeC {\textohm }" "Ω" :string) ;; This xindy module provides some basic support for "see" (require "makeindex.xdy") diff --git a/sphinx/util/texescape.py b/sphinx/util/texescape.py index 0f1783def..4ce2cfff8 100644 --- a/sphinx/util/texescape.py +++ b/sphinx/util/texescape.py @@ -69,56 +69,8 @@ tex_replacements = [ ('₇', r'\(\sb{\text{7}}\)'), ('₈', r'\(\sb{\text{8}}\)'), ('₉', r'\(\sb{\text{9}}\)'), - # map Greek alphabet - ('α', r'\(\alpha\)'), - ('β', r'\(\beta\)'), - ('γ', r'\(\gamma\)'), - ('δ', r'\(\delta\)'), - ('ε', r'\(\epsilon\)'), - ('ζ', r'\(\zeta\)'), - ('η', r'\(\eta\)'), - ('θ', r'\(\theta\)'), - ('ι', r'\(\iota\)'), - ('κ', r'\(\kappa\)'), - ('λ', r'\(\lambda\)'), - ('μ', r'\(\mu\)'), - ('ν', r'\(\nu\)'), - ('ξ', r'\(\xi\)'), - ('ο', r'o'), - ('π', r'\(\pi\)'), - ('ρ', r'\(\rho\)'), - ('σ', r'\(\sigma\)'), - ('τ', r'\(\tau\)'), - ('υ', '\\(\\upsilon\\)'), - ('φ', r'\(\phi\)'), - ('χ', r'\(\chi\)'), - ('ψ', r'\(\psi\)'), - ('ω', r'\(\omega\)'), - ('Α', r'A'), - ('Β', r'B'), - ('Γ', r'\(\Gamma\)'), - ('Δ', r'\(\Delta\)'), - ('Ε', r'E'), - ('Ζ', r'Z'), - ('Η', r'H'), - ('Θ', r'\(\Theta\)'), - ('Ι', r'I'), - ('Κ', r'K'), - ('Λ', r'\(\Lambda\)'), - ('Μ', r'M'), - ('Ν', r'N'), - ('Ξ', r'\(\Xi\)'), - ('Ο', r'O'), - ('Π', r'\(\Pi\)'), - ('Ρ', r'P'), - ('Σ', r'\(\Sigma\)'), - ('Τ', r'T'), - ('Υ', '\\(\\Upsilon\\)'), - ('Φ', r'\(\Phi\)'), - ('Χ', r'X'), - ('Ψ', r'\(\Psi\)'), - ('Ω', r'\(\Omega\)'), - ('Ω', r'\(\Omega\)'), + # Greek alphabet not escaped: pdflatex handles it via textalpha and inputenc + # OHM SIGN U+2126 is handled by LaTeX textcomp package ] tex_escape_map = {} # type: Dict[int, unicode] diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index 207f7513a..f1e3b7e98 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -64,6 +64,23 @@ ENUMERATE_LIST_STYLE = defaultdict(lambda: r'\arabic', 'lowerroman': r'\roman', 'upperroman': r'\Roman', }) # type: Dict[unicode, unicode] +PDFLATEX_DEFAULT_FONT_PKG = r''' +\usepackage{times} +\expandafter\ifx\csname T@LGR\endcsname\relax +\else +% LGR was declared as font encoding + \substitutefont{LGR}{\rmdefault}{artemisia} % gfsartemisia + \substitutefont{LGR}{\sfdefault}{neohellenic} % gfsneohellenic + \substitutefont{LGR}{\ttdefault}{cmtt} % cbfonts +\fi +\expandafter\ifx\csname T@T2A\endcsname\relax +\else +% T2A was declared as font encoding + \substitutefont{T2A}{\rmdefault}{fcm} + \substitutefont{T2A}{\sfdefault}{fcs} + \substitutefont{T2A}{\ttdefault}{fct} +\fi +''' DEFAULT_SETTINGS = { 'latex_engine': 'pdflatex', @@ -86,7 +103,9 @@ DEFAULT_SETTINGS = { 'multilingual': '', 'babel': '\\usepackage{babel}', 'polyglossia': '', - 'fontpkg': '\\usepackage{times}', + 'fontpkg': PDFLATEX_DEFAULT_FONT_PKG, + 'substitutefont': '', + 'textgreek': '\\usepackage{textalpha}', 'fncychap': '\\usepackage[Bjarne]{fncychap}', 'hyperref': ('% Include hyperref last.\n' '\\usepackage{hyperref}\n' @@ -121,21 +140,17 @@ ADDITIONAL_SETTINGS = { 'inputenc': '\\usepackage[utf8]{inputenc}', 'utf8extra': ('\\ifdefined\\DeclareUnicodeCharacter\n' '% support both utf8 and utf8x syntaxes\n' - '\\edef\\sphinxdqmaybe{' - '\\ifdefined\\DeclareUnicodeCharacterAsOptional' - '\\string"\\fi}\n' - ' \\DeclareUnicodeCharacter{\\sphinxdqmaybe00A0}' - '{\\nobreakspace}\n' - ' \\DeclareUnicodeCharacter{\\sphinxdqmaybe2500}' - '{\\sphinxunichar{2500}}\n' - ' \\DeclareUnicodeCharacter{\\sphinxdqmaybe2502}' - '{\\sphinxunichar{2502}}\n' - ' \\DeclareUnicodeCharacter{\\sphinxdqmaybe2514}' - '{\\sphinxunichar{2514}}\n' - ' \\DeclareUnicodeCharacter{\\sphinxdqmaybe251C}' - '{\\sphinxunichar{251C}}\n' - ' \\DeclareUnicodeCharacter{\\sphinxdqmaybe2572}' - '{\\textbackslash}\n' + ' \\ifdefined\\DeclareUnicodeCharacterAsOptional\n' + ' \\def\\sphinxDUC#1{\\DeclareUnicodeCharacter{"#1}}\n' + ' \\else\n' + ' \\let\\sphinxDUC\\DeclareUnicodeCharacter\n' + ' \\fi\n' + ' \\sphinxDUC{00A0}{\\nobreakspace}\n' + ' \\sphinxDUC{2500}{\\sphinxunichar{2500}}\n' + ' \\sphinxDUC{2502}{\\sphinxunichar{2502}}\n' + ' \\sphinxDUC{2514}{\\sphinxunichar{2514}}\n' + ' \\sphinxDUC{251C}{\\sphinxunichar{251C}}\n' + ' \\sphinxDUC{2572}{\\textbackslash}\n' '\\fi'), }, 'xelatex': { @@ -143,7 +158,10 @@ ADDITIONAL_SETTINGS = { 'polyglossia': '\\usepackage{polyglossia}', 'babel': '', 'fontenc': '\\usepackage{fontspec}', - 'fontpkg': '', + 'fontpkg': ('\\setmainfont{CMU Serif}\n' + '\\setsansfont{CMU Sans Serif}\n' + '\\setmonofont{CMU Typewriter Text}'), + 'textgreek': '', 'utf8extra': ('\\catcode`^^^^00a0\\active\\protected\\def^^^^00a0' '{\\leavevmode\\nobreak\\ }'), 'fvset': '\\fvset{fontsize=auto}', @@ -153,7 +171,10 @@ ADDITIONAL_SETTINGS = { 'polyglossia': '\\usepackage{polyglossia}', 'babel': '', 'fontenc': '\\usepackage{fontspec}', - 'fontpkg': '', + 'fontpkg': ('\\setmainfont{CMU Serif}\n' + '\\setsansfont{CMU Sans Serif}\n' + '\\setmonofont{CMU Typewriter Text}'), + 'textgreek': '', 'utf8extra': ('\\catcode`^^^^00a0\\active\\protected\\def^^^^00a0' '{\\leavevmode\\nobreak\\ }'), 'fvset': '\\fvset{fontsize=auto}', @@ -162,6 +183,8 @@ ADDITIONAL_SETTINGS = { 'latex_engine': 'platex', 'babel': '', 'classoptions': ',dvipdfmx', + 'fontpkg': '\\usepackage{times}', + 'textgreek': '', 'fncychap': '', 'geometry': '\\usepackage[dvipdfm]{geometry}', }, @@ -552,6 +575,15 @@ class LaTeXTranslator(nodes.NodeVisitor): builder.config.language) # set up multilingual module... + if self.elements['latex_engine'] == 'pdflatex': + if ('T2A' in self.elements['fontenc'] and + not self.babel.uses_cyrillic()): + self.elements['substitutefont'] = '\\usepackage{substitutefont}' + self.elements['sphinxpkgoptions'] += ',cyrnocyr' + if 'LGR' in self.elements['fontenc']: + self.elements['substitutefont'] = '\\usepackage{substitutefont}' + else: + self.elements['textgreek'] = '' # 'babel' key is public and user setting must be obeyed if self.elements['babel']: self.elements['classoptions'] += ',' + self.babel.get_language() diff --git a/tests/test_markup.py b/tests/test_markup.py index 0f401306b..0c376d041 100644 --- a/tests/test_markup.py +++ b/tests/test_markup.py @@ -216,7 +216,7 @@ def get_verifier(verify, verify_re): 'verify', u'Γ\\\\∞$', None, - r'\(\Gamma\)\textbackslash{}\(\infty\)\$', + u'Γ\\textbackslash{}\\(\\infty\\)\\$', ), ( # in verbatim code fragments @@ -225,7 +225,7 @@ def get_verifier(verify, verify_re): None, (u'\\fvset{hllines={, ,}}%\n' u'\\begin{sphinxVerbatim}[commandchars=\\\\\\{\\}]\n' - u'@\\(\\Gamma\\)\\PYGZbs{}\\(\\infty\\)\\PYGZdl{}\\PYGZob{}\\PYGZcb{}\n' + u'@Γ\\PYGZbs{}\\(\\infty\\)\\PYGZdl{}\\PYGZob{}\\PYGZcb{}\n' u'\\end{sphinxVerbatim}'), ), ( |