Source code for ipypublish.scripts.ipynb_latex_setup

#!/usr/bin/env python
"""
Some setup for improved latex/pdf output

at top of workbook, use:

.. code:: python

    from ipynb_latex_setup import *

"""

from __future__ import division as _division
# Py2/Py3 compatibility
# =====================
from __future__ import print_function as _print_function

# PYTHON
# =======

# IPYTHON
# =======
try:
    from IPython import get_ipython
    from IPython.display import Image, Latex
    from IPython.display import set_matplotlib_formats

    _ipy_present = True
except ImportError:
    _ipy_present = False
if _ipy_present:
    ipython = get_ipython()
    if ipython is not None:
        ipython.magic("config InlineBackend.figure_format = 'svg'")
        ipython.magic("matplotlib inline")
        set_matplotlib_formats('pdf', 'svg')

# NUMPY
# =====
try:
    import numpy as np
except ImportError:
    pass

# MATPLOTLIB
# ===========
try:
    import matplotlib as mpl

    _mpl_present = True
except ImportError:
    _mpl_present = False

if _mpl_present:
    mpl.rcParams['savefig.dpi'] = 75
    mpl.rcParams['figure.figsize'] = (7, 4)
    mpl.rcParams['figure.autolayout'] = False
    mpl.rcParams['axes.labelsize'] = 18
    mpl.rcParams['axes.titlesize'] = 20
    mpl.rcParams['font.size'] = 16
    mpl.rcParams['lines.linewidth'] = 2.0
    mpl.rcParams['lines.markersize'] = 8
    mpl.rcParams['legend.fontsize'] = 14
    mpl.rcParams['text.usetex'] = True
    mpl.rcParams['font.family'] = "serif"
    mpl.rcParams['font.serif'] = "cm"
    mpl.rcParams['text.latex.preamble'] = r"\usepackage{subdepth}, \usepackage{type1cm}"

# PANDAS
# ======
try:
    import pandas as pd

    _pandas_present = True
except ImportError:
    _pandas_present = False

if _pandas_present and ipython:
    pd.set_option('display.latex.repr', True)
    pd.set_option('display.latex.longtable', False)
    pd.set_option('display.latex.escape', False)

# SYMPY
# =====
try:
    import sympy as sym

    _sympy_present = True
except ImportError:
    _sympy_present = False
if _sympy_present:
    sym.init_printing(use_latex=True)

# IMAGE ARRANGEMENT with PIL
# ==========================
try:
    from PIL import Image as PImage

    _pil_present = True
except ImportError:
    _pil_present = False
if _pil_present:
[docs] def create_test_image(size=(50, 50)): from io import BytesIO file = BytesIO() image = PImage.new('RGBA', size=size, color=(155, 0, 0)) image.save(file, 'png') file.name = 'test.png' file.seek(0) return file
[docs] def images_read(paths): """read a list of image paths to a list of PIL.IMAGE instances """ return [PImage.open(i).convert("RGBA") for i in paths]
[docs] def images_hconcat(images, width=700, height=700, gap=0, aspaths=True): """concatenate multiple images horizontally Parameters ---------- images : list if aspaths=True, list of path strings, else list of PIL.Image instances width : int or list[int] maximum width of final image, or of individual images height : int or list[int] maximum height of final image, or of individual images gap : int size of space between images Returns ------- image : PIL.Image Examples -------- >>> img_path = create_test_image(size=(50,50)) >>> img = images_hconcat([img_path,img_path]) >>> img.size (100, 50) >>> img_path = create_test_image(size=(50,50)) >>> img = images_hconcat([img_path,img_path],width=40,height=40) >>> img.size (40, 20) >>> img_path = create_test_image(size=(50,50)) >>> img = images_hconcat([img_path,img_path],width=[40,30]) >>> img.size (70, 40) >>> img_path = create_test_image(size=(50,50)) >>> img = images_hconcat([img_path,img_path],gap=10) >>> img.size (110, 50) """ images = images_read(images) if aspaths else images if not isinstance(width, list): widths = [width for _ in images] else: widths = width[:] width = sum(widths) + gap * (len(images) - 1) if not isinstance(height, list): heights = [height for _ in images] else: heights = height[:] height = sum(heights) for im, w, h in zip(images, widths, heights): im.thumbnail((w, h), PImage.ANTIALIAS) widths, heights = zip(*(i.size for i in images)) total_width = sum(widths) + gap * (len(images) - 1) max_height = max(heights) new_im = PImage.new('RGBA', (total_width, max_height)) x_offset = 0 for im in images: new_im.paste(im, (x_offset, 0), mask=im) x_offset += im.size[0] + gap new_im.thumbnail((width, height), PImage.ANTIALIAS) return new_im
[docs] def images_vconcat(images, width=700, height=700, gap=0, aspaths=True): """concatenate multiple images vertically Parameters ---------- images : list if aspaths=True, list of path strings, else list of PIL.Image instances width : int or list[int] maximum width of final image, or of individual images height : int or list[int] maximum height of final image, or of individual images gap : int size of space between images Returns ------- image : PIL.Image Examples -------- >>> img_path = create_test_image(size=(50,50)) >>> img = images_vconcat([img_path,img_path]) >>> img.size (50, 100) >>> img_path = create_test_image(size=(50,50)) >>> img = images_vconcat([img_path,img_path],width=40,height=40) >>> img.size (20, 40) >>> img_path = create_test_image(size=(50,50)) >>> img = images_vconcat([img_path,img_path],width=[40,30]) >>> img.size (40, 70) >>> img_path = create_test_image(size=(50,50)) >>> img = images_vconcat([img_path,img_path],gap=10) >>> img.size (50, 110) """ images = images_read(images) if aspaths else images if not isinstance(width, list): widths = [width for _ in images] else: widths = width[:] width = sum(widths) if not isinstance(height, list): heights = [height for _ in images] else: heights = height[:] height = sum(heights) + gap * (len(images) - 1) for im, w, h in zip(images, widths, heights): im.thumbnail((w, h), PImage.ANTIALIAS) widths, heights = zip(*(i.size for i in images)) max_width = max(widths) total_height = sum(heights) + gap * (len(images) - 1) new_im = PImage.new('RGBA', (max_width, total_height)) y_offset = 0 for im in images: new_im.paste(im, (0, y_offset), mask=im) y_offset += im.size[1] + gap new_im.thumbnail((width, height), PImage.ANTIALIAS) return new_im
[docs] def images_gridconcat(pathslist, width=700, height=700, aspaths=True, hgap=0, vgap=0): """concatenate multiple images in a grid Parameters ---------- pathslist : list[list] if aspaths=True, list of path strings, else list of PIL.Image instances each sub list constitutes a row width : int maximum width of final image height : int maximum height of final image hgap : int size of horizontal space between images vgap : int size of vertical space between images Returns ------- image : PIL.Image """ himages = [images_hconcat(paths, gap=hgap, aspaths=aspaths) for paths in pathslist] new_im = images_vconcat(himages, gap=vgap, aspaths=False) new_im.thumbnail((width, height), PImage.ANTIALIAS) return new_im
# JSONEXTENDED # ========================== try: from jsonextended import ejson, edict _jsonextended_present = True except ImportError: _jsonextended_present = False if _jsonextended_present: from jsonextended import plugins as eplugins # eplugins.load_builtin_plugins()