-
Notifications
You must be signed in to change notification settings - Fork 556
/
latex.py
105 lines (86 loc) · 3.76 KB
/
latex.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
"""LaTeX Exporter class"""
# Copyright (c) Jupyter Development Team.
# Distributed under the terms of the Modified BSD License.
import os
from traitlets import default
from traitlets.config import Config
from nbconvert.filters.filter_links import resolve_references
from nbconvert.filters.highlight import Highlight2Latex
from nbconvert.filters.pandoc import ConvertExplicitlyRelativePaths
from .templateexporter import TemplateExporter
class LatexExporter(TemplateExporter):
"""
Exports to a Latex template. Inherit from this class if your template is
LaTeX based and you need custom transformers/filters.
If you don't need custom transformers/filters, just change the
'template_file' config option. Place your template in the special "/latex"
subfolder of the "../templates" folder.
"""
export_from_notebook = "LaTeX"
@default("file_extension")
def _file_extension_default(self):
return ".tex"
@default("template_name")
def _template_name_default(self):
return "latex"
output_mimetype = "text/latex"
def default_filters(self):
"""Get the default filters."""
yield from super().default_filters()
yield ("resolve_references", resolve_references)
@property
def default_config(self):
c = Config(
{
"NbConvertBase": {
"display_data_priority": [
"text/latex",
"application/pdf",
"image/png",
"image/jpeg",
"image/svg+xml",
"text/markdown",
"text/plain",
]
},
"ExtractAttachmentsPreprocessor": {"enabled": True},
"ExtractOutputPreprocessor": {"enabled": True},
"SVG2PDFPreprocessor": {"enabled": True},
"LatexPreprocessor": {"enabled": True},
"SphinxPreprocessor": {"enabled": True},
"HighlightMagicsPreprocessor": {"enabled": True},
}
)
if super().default_config:
c2 = super().default_config.copy()
c2.merge(c)
c = c2
return c
def from_notebook_node(self, nb, resources=None, **kw):
"""Convert from notebook node."""
langinfo = nb.metadata.get("language_info", {})
lexer = langinfo.get("pygments_lexer", langinfo.get("name", None))
highlight_code = self.filters.get(
"highlight_code", Highlight2Latex(pygments_lexer=lexer, parent=self)
)
self.register_filter("highlight_code", highlight_code)
# Need to make sure explicit relative paths are visible to latex for pdf conversion
# https://github.com/jupyter/nbconvert/issues/1998
nb_path = resources.get("metadata", {}).get("path") if resources else None
texinputs = os.path.abspath(nb_path) if nb_path else os.getcwd()
convert_explicitly_relative_paths = self.filters.get(
"convert_explicitly_relative_paths",
ConvertExplicitlyRelativePaths(texinputs=texinputs, parent=self),
)
self.register_filter("convert_explicitly_relative_paths", convert_explicitly_relative_paths)
return super().from_notebook_node(nb, resources, **kw)
def _create_environment(self):
environment = super()._create_environment()
# Set special Jinja2 syntax that will not conflict with latex.
environment.block_start_string = "((*"
environment.block_end_string = "*))"
environment.variable_start_string = "((("
environment.variable_end_string = ")))"
environment.comment_start_string = "((="
environment.comment_end_string = "=))"
return environment