Source code for typhon.latex

# -*- coding: utf-8 -*-
"""
Implementation of functions related to LaTeX.

"""

import sys


__all__ = [
    'texify_matrix',
    ]


[docs]def texify_matrix(a, fmt="%f", filename=None, caption=None, heading=None, label='tab:matrix', align='r', delimiter=True): """Convert a np.ndarray into a LaTeX table. Note: the function only works with 2-dimensional arrays. If you want to process 1-dimensional arrays you still have to pass them in a 2D-represenation to clearly determine if it is a row or column vector ([1, N] or [N, 1]). Args: a (np.ndarray): array to convert to LaTeX table. fmt (str): format string to specify the number format. filename (str): path to outputfile. if no file is given, the output is send so stdout. caption (str): table caption, if no caption is passed it is left empty. heading (list[str]): list of names (str) for each column. label (str): Label to reference the table. align (str): specify the alignment of numbers inside the cells. delimiter (bool): toggle the separation of cells through lines. Returns: LaTeX source code either to a specified file or stdout. Examples: >>> import numpy >>> texify_matrix(numpy.random.randn(5, 4), ... fmt="%.3f", ... filename="matrix.tex", ... caption="This is a test caption.", ... heading=['H1', 'H2', 'H3', 'H4'], ... align='c', ... delimiter=False ... ) """ # only two-dimensional arrays are allowed if a.ndim != 2: raise Exception('Only 2D arrays can be converted to tables.') # check if alignment is valid if align not in ['l', 'c', 'r']: raise Exception('Valid alignment values are: "l", "c" and "r"') # define row and column delimiters if delimiter is True: dlm = '|' nwl = '\\hline' else: dlm = nwl = '' # if no caption is passed, leave it empty if caption is None: caption = '' elif not isinstance(caption, str): raise TypeError('Caption has to be of type string.') # if headings are given, one has to name each column if heading is not None: if not isinstance(heading, list) or not isinstance(heading[0], str): raise TypeError('heading has to be list of strings.') elif len(heading) != a.shape[1]: raise Exception('Number of names has to match number of columns.') # if filename is passed, open file and redirect stdout if filename is not None: out = open(filename, 'w') else: out = sys.stdout # TODO: Overdo the handling of strings in this function! It seems like # string.format() could be used **way** more often. # print table header out.write('\\begin{table}\n' '\\centering\n' '\\caption{' + caption + '\\label{' + label + '}}\n' '\\begin{tabular}{' + (dlm + (align + dlm) * a.shape[1]) + '}' + nwl + '\n') # if given, print column headings if heading is not None: out.write(heading[0]) for c in heading[1:]: out.write(' & ' + c) out.write('\\\\' + nwl + '\n') # print each matrix row for r in a: out.write(fmt % r[0]) for c in r[1:]: out.write(' & ' + fmt % c) out.write('\\\\' + nwl + '\n') # close table environment out.write('\\end{tabular}\n' '\\end{table}\n')