mirror of
https://github.com/sphinx-doc/sphinx.git
synced 2025-02-25 18:55:22 -06:00
LaTeX: add styling to general index, similar to domain indices
Closes: #5579. Also closes #5576.
This commit is contained in:
parent
47bd24e7d2
commit
4df3b067b7
@ -4,6 +4,9 @@ heading_prefix " \\bigletter "
|
||||
|
||||
preamble "\\begin{sphinxtheindex}
|
||||
\\let\\bigletter\\sphinxstyleindexlettergroup
|
||||
\\let\\spxpagem \\sphinxstyleindexpagemain
|
||||
\\let\\spxentry \\sphinxstyleindexentry
|
||||
\\let\\spxextra \\sphinxstyleindexextra
|
||||
|
||||
"
|
||||
|
||||
|
@ -1623,8 +1623,11 @@
|
||||
|
||||
% additional customizable styling
|
||||
\def\sphinxstyleindexentry #1{\texttt{#1}}
|
||||
\def\sphinxstyleindexextra #1{ \emph{(#1)}}
|
||||
\def\sphinxstyleindexextra #1{ (\emph{#1})}
|
||||
\def\sphinxstyleindexpageref #1{, \pageref{#1}}
|
||||
\def\sphinxstyleindexpagemain#1{\textbf{#1}}
|
||||
\protected\def\spxentry#1{#1}% will get \let to \sphinxstyleindexentry in index
|
||||
\protected\def\spxextra#1{#1}% will get \let to \sphinxstyleindexextra in index
|
||||
\def\sphinxstyleindexlettergroup #1%
|
||||
{{\Large\sffamily#1}\nopagebreak\vspace{1mm}}
|
||||
\def\sphinxstyleindexlettergroupDefault #1%
|
||||
|
@ -3,11 +3,12 @@
|
||||
;; Unfortunately xindy is out-of-the-box hyperref-incompatible. This
|
||||
;; configuration is a workaround, which requires to pass option
|
||||
;; hyperindex=false to hyperref.
|
||||
;; textit and emph not currently used by Sphinx LaTeX writer.
|
||||
(define-attributes (("textbf" "textit" "emph" "default")))
|
||||
;; textit and emph not currently used, spxpagem replaces former textbf
|
||||
(define-attributes (("textbf" "textit" "emph" "spxpagem" "default")))
|
||||
(markup-locref :open "\textbf{\hyperpage{" :close "}}" :attr "textbf")
|
||||
(markup-locref :open "\textit{\hyperpage{" :close "}}" :attr "textit")
|
||||
(markup-locref :open "\emph{\hyperpage{" :close "}}" :attr "emph")
|
||||
(markup-locref :open "\spxpagem{\hyperpage{" :close "}}" :attr "spxpagem")
|
||||
(markup-locref :open "\hyperpage{" :close "}" :attr "default")
|
||||
|
||||
(require "numeric-sort.xdy")
|
||||
@ -193,6 +194,9 @@
|
||||
(markup-index :open "\begin{sphinxtheindex}
|
||||
\let\lettergroup\sphinxstyleindexlettergroup
|
||||
\let\lettergroupDefault\sphinxstyleindexlettergroupDefault
|
||||
\let\spxpagem\sphinxstyleindexpagemain
|
||||
\let\spxentry\sphinxstyleindexentry
|
||||
\let\spxextra\sphinxstyleindexextra
|
||||
|
||||
"
|
||||
:close "
|
||||
|
@ -1884,7 +1884,7 @@ class LaTeXTranslator(nodes.NodeVisitor):
|
||||
# type: (nodes.Node) -> None
|
||||
self.body.append('\n\\end{flushright}\n')
|
||||
|
||||
def visit_index(self, node, scre=re.compile(r';\s*')):
|
||||
def visit_index(self, node, extrare=re.compile(r'^(.*\S)\s+\(([^()]*)\)\s*$')):
|
||||
# type: (nodes.Node, Pattern) -> None
|
||||
def escape(value):
|
||||
value = self.encode(value)
|
||||
@ -1895,33 +1895,51 @@ class LaTeXTranslator(nodes.NodeVisitor):
|
||||
value = value.replace('!', '"!')
|
||||
return value
|
||||
|
||||
def style(string):
|
||||
match = extrare.match(string)
|
||||
if match:
|
||||
return match.expand(r'\\spxentry{\1}\\spxextra{\2}')
|
||||
else:
|
||||
return '\\spxentry{%s}' % string
|
||||
|
||||
if not node.get('inline', True):
|
||||
self.body.append('\n')
|
||||
entries = node['entries']
|
||||
for type, string, tid, ismain, key_ in entries:
|
||||
m = ''
|
||||
if ismain:
|
||||
m = '|textbf'
|
||||
m = '|spxpagem'
|
||||
try:
|
||||
if type == 'single':
|
||||
p = scre.sub('!', escape(string))
|
||||
self.body.append(r'\index{%s%s}' % (p, m))
|
||||
try:
|
||||
p1, p2 = [escape(x) for x in split_into(2, 'single', string)]
|
||||
P1, P2 = style(p1), style(p2)
|
||||
self.body.append(r'\index{%s@%s!%s@%s%s}' % (p1, P1, p2, P2, m))
|
||||
except ValueError:
|
||||
p = escape(split_into(1, 'single', string)[0])
|
||||
P = style(p)
|
||||
self.body.append(r'\index{%s@%s%s}' % (p, P, m))
|
||||
elif type == 'pair':
|
||||
p1, p2 = [escape(x) for x in split_into(2, 'pair', string)]
|
||||
self.body.append(r'\index{%s!%s%s}\index{%s!%s%s}' %
|
||||
(p1, p2, m, p2, p1, m))
|
||||
P1, P2 = style(p1), style(p2)
|
||||
self.body.append(r'\index{%s@%s!%s@%s%s}\index{%s@%s!%s@%s%s}' %
|
||||
(p1, P1, p2, P2, m, p2, P2, p1, P1, m))
|
||||
elif type == 'triple':
|
||||
p1, p2, p3 = [escape(x) for x in split_into(3, 'triple', string)]
|
||||
self.body.append(
|
||||
r'\index{%s!%s %s%s}\index{%s!%s, %s%s}'
|
||||
r'\index{%s!%s %s%s}' %
|
||||
(p1, p2, p3, m, p2, p3, p1, m, p3, p1, p2, m))
|
||||
r'\index{%s@\spxentry{%s}!%s %s@\spxentry{%s %s}%s}'
|
||||
r'\index{%s@\spxentry{%s}!%s, %s@\spxentry{%s, %s}%s}'
|
||||
r'\index{%s@\spxentry{%s}!%s %s@\spxentry{%s %s}%s}' %
|
||||
(p1, p1, p2, p3, p2, p3, m, p2, p2, p3, p1, p3, p1, m,
|
||||
p3, p3, p1, p2, p1, p2, m))
|
||||
elif type == 'see':
|
||||
p1, p2 = [escape(x) for x in split_into(2, 'see', string)]
|
||||
self.body.append(r'\index{%s|see{%s}}' % (p1, p2))
|
||||
P1 = style(p1)
|
||||
self.body.append(r'\index{%s@%s|see{%s}}' % (p1, P1, p2))
|
||||
elif type == 'seealso':
|
||||
p1, p2 = [escape(x) for x in split_into(2, 'seealso', string)]
|
||||
self.body.append(r'\index{%s|see{%s}}' % (p1, p2))
|
||||
P1 = style(p1)
|
||||
self.body.append(r'\index{%s@%s|see{%s}}' % (p1, P1, p2))
|
||||
else:
|
||||
logger.warning(__('unknown index entry type %s found'), type)
|
||||
except ValueError as err:
|
||||
|
@ -1199,9 +1199,13 @@ def test_latex_index(app, status, warning):
|
||||
app.builder.build_all()
|
||||
|
||||
result = (app.outdir / 'Python.tex').text(encoding='utf8')
|
||||
assert 'A \\index{famous}famous \\index{equation}equation:\n' in result
|
||||
assert '\n\\index{Einstein}\\index{relativity}\\ignorespaces \nand' in result
|
||||
assert '\n\\index{main \\sphinxleftcurlybrace{}}\\ignorespaces ' in result
|
||||
assert ('A \\index{famous@\\spxentry{famous}}famous '
|
||||
'\\index{equation@\\spxentry{equation}}equation:\n' in result)
|
||||
assert ('\n\\index{Einstein@\\spxentry{Einstein}}'
|
||||
'\\index{relativity@\\spxentry{relativity}}'
|
||||
'\\ignorespaces \nand') in result
|
||||
assert ('\n\\index{main \\sphinxleftcurlybrace{}@\\spxentry{'
|
||||
'main \\sphinxleftcurlybrace{}}}\\ignorespaces ' in result)
|
||||
|
||||
|
||||
@pytest.mark.sphinx('latex', testroot='latex-equations')
|
||||
@ -1269,20 +1273,22 @@ def test_latex_glossary(app, status, warning):
|
||||
app.builder.build_all()
|
||||
|
||||
result = (app.outdir / 'test.tex').text(encoding='utf8')
|
||||
assert (u'\\item[{änhlich\\index{änhlich|textbf}\\phantomsection'
|
||||
assert (u'\\item[{änhlich\\index{änhlich@\\spxentry{änhlich}|spxpagem}'
|
||||
r'\phantomsection'
|
||||
r'\label{\detokenize{index:term-anhlich}}}] \leavevmode' in result)
|
||||
assert (r'\item[{boson\index{boson|textbf}\phantomsection'
|
||||
assert (r'\item[{boson\index{boson@\spxentry{boson}|spxpagem}\phantomsection'
|
||||
r'\label{\detokenize{index:term-boson}}}] \leavevmode' in result)
|
||||
assert (r'\item[{\sphinxstyleemphasis{fermion}\index{fermion|textbf}'
|
||||
assert (r'\item[{\sphinxstyleemphasis{fermion}'
|
||||
r'\index{fermion@\spxentry{fermion}|spxpagem}'
|
||||
r'\phantomsection'
|
||||
r'\label{\detokenize{index:term-fermion}}}] \leavevmode' in result)
|
||||
assert (r'\item[{tauon\index{tauon|textbf}\phantomsection'
|
||||
assert (r'\item[{tauon\index{tauon@\spxentry{tauon}|spxpagem}\phantomsection'
|
||||
r'\label{\detokenize{index:term-tauon}}}] \leavevmode'
|
||||
r'\item[{myon\index{myon|textbf}\phantomsection'
|
||||
r'\item[{myon\index{myon@\spxentry{myon}|spxpagem}\phantomsection'
|
||||
r'\label{\detokenize{index:term-myon}}}] \leavevmode'
|
||||
r'\item[{electron\index{electron|textbf}\phantomsection'
|
||||
r'\item[{electron\index{electron@\spxentry{electron}|spxpagem}\phantomsection'
|
||||
r'\label{\detokenize{index:term-electron}}}] \leavevmode' in result)
|
||||
assert (u'\\item[{über\\index{über|textbf}\\phantomsection'
|
||||
assert (u'\\item[{über\\index{über@\\spxentry{über}|spxpagem}\\phantomsection'
|
||||
r'\label{\detokenize{index:term-uber}}}] \leavevmode' in result)
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user