| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- """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
|