From f223e690b39d4a66cd9606e2b16fdb4c281656f8 2012-05-15 00:12:34 From: Fernando Perez Date: 2012-05-15 00:12:34 Subject: [PATCH] Merge pull request #12 from fperez/latex-conv Latex converter, lots of fixes and some refactoring --- diff --git a/nbconvert.py b/nbconvert.py index ccc0aa2..7ed1a13 100755 --- a/nbconvert.py +++ b/nbconvert.py @@ -9,23 +9,82 @@ called nb_figure_NN.png. To avoid the two-step process, ipynb -> rst -> html, use '--format quick-html' which will do ipynb -> html, but won't look as pretty. """ - +#----------------------------------------------------------------------------- +# Imports +#----------------------------------------------------------------------------- +from __future__ import print_function + +# Stdlib +import codecs +import logging import os +import pprint +import re import subprocess import sys + +inkscape = 'inkscape' +if sys.platform == 'darwin': + inkscape = '/Applications/Inkscape.app/Contents/Resources/bin/inkscape' + if not os.path.exists(inkscape): + inkscape = None + +# From IPython from IPython.external import argparse from IPython.nbformat import current as nbformat from IPython.utils.text import indent from decorators import DocInherit -# Cell converters +#----------------------------------------------------------------------------- +# Utility functions +#----------------------------------------------------------------------------- + +def remove_fake_files_url(cell): + """Remove from the cell source the /files/ pseudo-path we use. + """ + src = cell.source + cell.source = src.replace('/files/', '') + + +def remove_ansi(src): + """Strip all ANSI color escape sequences from input string. + + Parameters + ---------- + src : string -def unknown_cell(cell): - """Default converter for cells of unknown type. + Returns + ------- + string """ + return re.sub(r'\033\[(0|\d;\d\d)m', '', src) - return rst_directive('.. warning:: Unknown cell') + \ - [repr(cell)] + +# Pandoc-dependent code +def markdown2latex(src): + """Convert a markdown string to LaTeX via pandoc. + + This function will raise an error if pandoc is not installed. + + Any error messages generated by pandoc are printed to stderr. + + Parameters + ---------- + src : string + Input string, assumed to be valid markdown. + + Returns + ------- + out : string + Output as returned by pandoc. + """ + p = subprocess.Popen('pandoc -f markdown -t latex'.split(), + stdin=subprocess.PIPE, stdout=subprocess.PIPE) + out, err = p.communicate(src) + if err: + print(err, file=sys.stderr) + #print('*'*20+'\n', out, '\n'+'*'*20) # dbg + return out def rst_directive(directive, text=''): @@ -34,8 +93,9 @@ def rst_directive(directive, text=''): out.extend([indent(text), '']) return out -# Converters for parts of a cell. - +#----------------------------------------------------------------------------- +# Class declarations +#----------------------------------------------------------------------------- class ConversionException(Exception): pass @@ -43,29 +103,43 @@ class ConversionException(Exception): class Converter(object): default_encoding = 'utf-8' - + extension = str() + figures_counter = 0 + infile = str() + infile_dir = str() + infile_root = str() + files_dir = str() + with_preamble = True + user_preamble = None + output = str() + raw_as_verbatim = False + def __init__(self, infile): self.infile = infile - self.dirpath = os.path.dirname(infile) - - @property - def extension(self): - raise ConversionException("""extension must be defined in Converter - subclass""") + self.infile_dir = os.path.dirname(infile) + infile_root = os.path.splitext(infile)[0] + files_dir = infile_root + '_files' + if not os.path.isdir(files_dir): + os.mkdir(files_dir) + self.infile_root = infile_root + self.files_dir = files_dir def dispatch(self, cell_type): """return cell_type dependent render method, for example render_code """ - # XXX: unknown_cell here is RST specific - make it generic - return getattr(self, 'render_' + cell_type, unknown_cell) + return getattr(self, 'render_' + cell_type, self.render_unknown) def convert(self): lines = [] lines.extend(self.optional_header()) - for cell in self.nb.worksheets[0].cells: - conv_fn = self.dispatch(cell.cell_type) - lines.extend(conv_fn(cell)) - lines.append('') + for worksheet in self.nb.worksheets: + for cell in worksheet.cells: + #print(cell.cell_type) # dbg + conv_fn = self.dispatch(cell.cell_type) + if cell.cell_type in ('markdown', 'raw'): + remove_fake_files_url(cell) + lines.extend(conv_fn(cell)) + lines.append('') lines.extend(self.optional_footer()) return '\n'.join(lines) @@ -83,12 +157,13 @@ class Converter(object): def save(self, infile=None, encoding=None): "read and parse notebook into self.nb" if infile is None: - infile = os.path.splitext(self.infile)[0] + '.' + self.extension + outfile = os.path.basename(self.infile) + outfile = os.path.splitext(outfile)[0] + '.' + self.extension if encoding is None: encoding = self.default_encoding - with open(infile, 'w') as f: + with open(outfile, 'w') as f: f.write(self.output.encode(encoding)) - return infile + return os.path.abspath(outfile) def optional_header(self): return [] @@ -96,6 +171,28 @@ class Converter(object): def optional_footer(self): return [] + def _new_figure(self, data, fmt): + """Create a new figure file in the given format. + + Returns a path relative to the input file. + """ + figname = '%s_fig_%02i.%s' % (self.infile_root, + self.figures_counter, fmt) + self.figures_counter += 1 + fullname = os.path.join(self.files_dir, figname) + + # Binary files are base64-encoded, SVG is already XML + if fmt in ('png', 'jpg', 'pdf'): + data = data.decode('base64') + fopen = lambda fname: open(fname, 'wb') + else: + fopen = lambda fname: codecs.open(fname, 'wb', self.default_encoding) + + with fopen(fullname) as f: + f.write(data) + + return fullname + def render_heading(self, cell): """convert a heading cell @@ -114,18 +211,43 @@ class Converter(object): Returns list.""" raise NotImplementedError - def render_pyout(self, cell): + def render_pyout(self, output): """convert pyout part of a code cell Returns list.""" raise NotImplementedError - def render_display_data(self, cell): + + def render_pyerr(self, output): + """convert pyerr part of a code cell + + Returns list.""" + raise NotImplementedError + + def _img_lines(self, img_file): + """Return list of lines to include an image file.""" + # Note: subclasses may choose to implement format-specific _FMT_lines + # methods if they so choose (FMT in {png, svg, jpg, pdf}). + raise NotImplementedError + + def render_display_data(self, output): """convert display data from the output of a code cell Returns list. """ - raise NotImplementedError + lines = [] + + for fmt in ['png', 'svg', 'jpg', 'pdf']: + if fmt in output: + img_file = self._new_figure(output[fmt], fmt) + # Subclasses can have format-specific render functions (e.g., + # latex has to auto-convert all SVG to PDF first). + lines_fun = getattr(self, '_%s_lines' % fmt, None) + if not lines_fun: + lines_fun = self._img_lines + lines.extend(lines_fun(img_file)) + + return lines def render_stream(self, cell): """convert stream part of a code cell @@ -133,16 +255,33 @@ class Converter(object): Returns list.""" raise NotImplementedError - def render_plaintext(self, cell): - """convert plain text + def render_raw(self, cell): + """convert a cell with raw text Returns list.""" raise NotImplementedError + def render_unknown(self, cell): + """Render cells of unkown type + + Returns list.""" + data = pprint.pformat(cell) + logging.warning('Unknown cell:\n%s' % data) + return self._unknown_lines(data) + + def _unknown_lines(self, data): + """Return list of lines for an unknown cell. + + Parameters + ---------- + data : str + The content of the unknown data as a single string. + """ + raise NotImplementedError + class ConverterRST(Converter): extension = 'rst' - figures_counter = 0 heading_level = {1: '=', 2: '-', 3: '`', 4: '\'', 5: '.', 6: '~'} @DocInherit @@ -169,8 +308,11 @@ class ConverterRST(Converter): return [cell.source] @DocInherit - def render_plaintext(self, cell): - return [cell.source] + def render_raw(self, cell): + if self.raw_as_verbatim: + return ['::', '', indent(cell.source), ''] + else: + return [cell.source] @DocInherit def render_pyout(self, output): @@ -186,25 +328,15 @@ class ConverterRST(Converter): return lines @DocInherit - def render_display_data(self, output): - lines = [] - - if 'png' in output: - # XXX: make the figures notebooks specific (i.e. self.infile) so - # that multiple notebook conversions don't clobber each other's - # figures - infile = 'nb_figure_%s.png' % self.figures_counter - fullname = os.path.join(self.dirpath, infile) - with open(fullname, 'w') as f: - f.write(output.png.decode('base64')) - - self.figures_counter += 1 - lines.append('.. image:: %s' % infile) - lines.append('') - - return lines + def render_pyerr(self, output): + # Note: a traceback is a *list* of frames. + return ['::', '', indent(remove_ansi('\n'.join(output.traceback))), ''] @DocInherit + def _img_lines(self, img_file): + return ['.. image:: %s' % img_file, ''] + + @DocInherit def render_stream(self, output): lines = [] @@ -213,9 +345,17 @@ class ConverterRST(Converter): return lines + @DocInherit + def _unknown_lines(self, data): + return rst_directive('.. warning:: Unknown cell') + [data] + + class ConverterQuickHTML(Converter): extension = 'html' - figures_counter = 0 + + def in_tag(self, tag, src): + """Return a list of elements bracketed by the given tag""" + return ['<%s>' % tag, src, '' % tag] def optional_header(self): # XXX: inject the IPython standard CSS into here @@ -259,54 +399,226 @@ class ConverterQuickHTML(Converter): @DocInherit def render_markdown(self, cell): - return ["
"+cell.source+"
"] + return self.in_tag('pre', cell.source) @DocInherit - def render_plaintext(self, cell): - return ["
"+cell.source+"
"] + def render_raw(self, cell): + if self.raw_as_verbatim: + return self.in_tag('pre', cell.source) + else: + return [cell.source] @DocInherit def render_pyout(self, output): - lines = ['Out[%s]:' % output.prompt_number, ''] + lines = ['Out[%s]:' % + output.prompt_number, ''] # output is a dictionary like object with type as a key - if 'latex' in output: - lines.append("
")
-            lines.extend(indent(output.latex))
-            lines.append("
") + for out_type in ('text', 'latex'): + if out_type in output: + lines.extend(self.in_tag('pre', indent(output[out_type]))) + + return lines + + @DocInherit + def render_pyerr(self, output): + # Note: a traceback is a *list* of frames. + return self.in_tag('pre', remove_ansi('\n'.join(output.traceback))) + + @DocInherit + def _img_lines(self, img_file): + return ['' % img_file, ''] + + @DocInherit + def render_stream(self, output): + lines = [] if 'text' in output: - lines.append("
")
-            lines.extend(indent(output.text))
-            lines.append("
") + lines.append(output.text) return lines @DocInherit - def render_display_data(self, output): - lines = [] + def _unknown_lines(self, data): + return ['

Warning:: Unknown cell

'] + self.in_tag('pre', data) + - if 'png' in output: - infile = 'nb_figure_%s.png' % self.figures_counter - fullname = os.path.join(self.dirpath, infile) - with open(fullname, 'w') as f: - f.write(output.png.decode('base64')) +class ConverterLaTeX(Converter): + """Converts a notebook to a .tex file suitable for pdflatex. - self.figures_counter += 1 - lines.append('' % infile) - lines.append('') + Note: this converter *needs*: + + - `pandoc`: for all conversion of markdown cells. If your notebook only + has Raw cells, pandoc will not be needed. + + - `inkscape`: if your notebook has SVG figures. These need to be + converted to PDF before inclusion in the TeX file, as LaTeX doesn't + understand SVG natively. + + You will in general obtain much better final PDF results if you configure + the matplotlib backend to create SVG output with + + %config InlineBackend.figure_format = 'svg' + + (or set the equivalent flag at startup or in your configuration profile). + """ + extension = 'tex' + documentclass = 'article' + documentclass_options = '11pt,english' + heading_map = {1: r'\section', + 2: r'\subsection', + 3: r'\subsubsection', + 4: r'\paragraph', + 5: r'\subparagraph', + 6: r'\subparagraph'} + + def in_env(self, environment, lines): + """Return list of environment lines for input lines + + Parameters + ---------- + env : string + Name of the environment to bracket with begin/end. + + lines: """ + out = [r'\begin{%s}' % environment] + if isinstance(lines, basestring): + out.append(lines) + else: # list + out.extend(lines) + out.append(r'\end{%s}' % environment) + return out + + def convert(self): + # The main body is done by the logic in the parent class, and that's + # all we need if preamble support has been turned off. + body = super(ConverterLaTeX, self).convert() + if not self.with_preamble: + return body + # But if preamble is on, then we need to construct a proper, standalone + # tex file. + + # Tag the document at the top and set latex class + final = [ r'%% This file was auto-generated by IPython, do NOT edit', + r'%% Conversion from the original notebook file:', + r'%% {0}'.format(self.infile), + r'%%', + r'\documentclass[%s]{%s}' % (self.documentclass_options, + self.documentclass), + '', + ] + # Load our own preamble, which is stored next to the main file. We + # need to be careful in case the script entry point is a symlink + myfile = __file__ if not os.path.islink(__file__) else \ + os.readlink(__file__) + with open(os.path.join(os.path.dirname(myfile), 'preamble.tex')) as f: + final.append(f.read()) + + # Load any additional user-supplied preamble + if self.user_preamble: + final.extend(['', '%% Adding user preamble from file:', + '%% {0}'.format(self.user_preamble), '']) + with open(self.user_preamble) as f: + final.append(f.read()) + + # Include document body + final.extend([ r'\begin{document}', '', + body, + r'\end{document}', '']) + # Retun value must be a string + return '\n'.join(final) + + @DocInherit + def render_heading(self, cell): + marker = self.heading_map[cell.level] + return ['%s{%s}' % (marker, cell.source) ] + + @DocInherit + def render_code(self, cell): + if not cell.input: + return [] + + # Cell codes first carry input code, we use lstlisting for that + lines = [r'\begin{codecell}'] + + lines.extend(self.in_env('codeinput', + self.in_env('lstlisting', cell.input))) + + outlines = [] + for output in cell.outputs: + conv_fn = self.dispatch(output.output_type) + outlines.extend(conv_fn(output)) + + # And then output of many possible types; use a frame for all of it. + if outlines: + lines.extend(self.in_env('codeoutput', outlines)) + + lines.append(r'\end{codecell}') return lines + + @DocInherit + def _img_lines(self, img_file): + return self.in_env('center', + [r'\includegraphics[width=3in]{%s}' % img_file, r'\par']) + + def _svg_lines(self, img_file): + base_file = os.path.splitext(img_file)[0] + pdf_file = base_file + '.pdf' + subprocess.check_call([ inkscape, '--export-pdf=%s' % pdf_file, + img_file]) + return self._img_lines(pdf_file) + @DocInherit def render_stream(self, output): lines = [] if 'text' in output: - lines.append(output.text) + lines.extend(self.in_env('verbatim', output.text.strip())) + + return lines + + @DocInherit + def render_markdown(self, cell): + return [markdown2latex(cell.source)] + + @DocInherit + def render_pyout(self, output): + lines = [] + + # output is a dictionary like object with type as a key + if 'latex' in output: + lines.extend(output.latex) + + if 'text' in output: + lines.extend(self.in_env('verbatim', output.text)) return lines + @DocInherit + def render_pyerr(self, output): + # Note: a traceback is a *list* of frames. + return self.in_env('traceback', + self.in_env('verbatim', + remove_ansi('\n'.join(output.traceback)))) + + @DocInherit + def render_raw(self, cell): + if self.raw_as_verbatim: + return self.in_env('verbatim', cell.source) + else: + return [cell.source] + + @DocInherit + def _unknown_lines(self, data): + return [r'{\vspace{5mm}\bf WARNING:: unknown cell:}'] + \ + self.in_env('verbatim', data) + +#----------------------------------------------------------------------------- +# Standalone conversion functions +#----------------------------------------------------------------------------- + def rst2simplehtml(infile): """Convert a rst file to simplified html suitable for blogger. @@ -355,7 +667,7 @@ def rst2simplehtml(infile): return newfname -known_formats = "rst (default), html, quick-html" +known_formats = "rst (default), html, quick-html, latex" def main(infile, format='rst'): """Convert a notebook to html in one step""" @@ -373,11 +685,16 @@ def main(infile, format='rst'): elif format == 'quick-html': converter = ConverterQuickHTML(infile) rstfname = converter.render() + elif format == 'latex': + converter = ConverterLaTeX(infile) + latexfname = converter.render() else: raise SystemExit("Unknown format '%s', " % format + "known formats are: " + known_formats) - +#----------------------------------------------------------------------------- +# Script main +#----------------------------------------------------------------------------- if __name__ == '__main__': parser = argparse.ArgumentParser(description=__doc__, diff --git a/preamble.tex b/preamble.tex new file mode 100644 index 0000000..f35ca8d --- /dev/null +++ b/preamble.tex @@ -0,0 +1,94 @@ +%% This is the automatic preamble used by IPython. Note that it does *not* +%% include a documentclass declaration, that is added at runtime to the overall +%% document. + +\usepackage{amsmath} +\usepackage{amssymb} +\usepackage{graphicx} + +% needed for markdown enumerations to work +\usepackage{enumerate} + +% Slightly bigger margins than the latex defaults +\usepackage{geometry} +\geometry{verbose,tmargin=3cm,bmargin=3cm,lmargin=2.5cm,rmargin=2.5cm} + +% Define a few colors for use in code, links and cell shading +\usepackage{color} +\definecolor{orange}{cmyk}{0,0.4,0.8,0.2} +\definecolor{darkorange}{rgb}{.71,0.21,0.01} +\definecolor{darkgreen}{rgb}{.12,.54,.11} +\definecolor{myteal}{rgb}{.26, .44, .56} +\definecolor{gray}{gray}{0.45} +\definecolor{lightgray}{gray}{.95} +\definecolor{mediumgray}{gray}{.8} +\definecolor{inputbackground}{rgb}{.95, .95, .85} +\definecolor{outputbackground}{rgb}{.95, .95, .95} +\definecolor{traceback}{rgb}{1, .95, .95} + +% Framed environments for code cells (inputs, outputs, errors, ...). The +% various uses of \unskip (or not) at the end were fine-tuned by hand, so don't +% randomly change them unless you're sure of the effect it will have. +\usepackage{framed} + +% remove extraneous vertical space in boxes +\setlength\fboxsep{0pt} + +% codecell is the whole input+output set of blocks that a Code cell can +% generate. +\newenvironment{codecell}{% + \def\FrameCommand{\color{mediumgray} \vrule width 1pt \hspace{5pt}}% + \MakeFramed{\vspace{-0.5em}\FrameRestore}} + {\unskip\endMakeFramed} + + \newenvironment{codeinput}{% + \def\FrameCommand{\colorbox{inputbackground}}% + \MakeFramed{\advance\hsize-\width \FrameRestore}} + {\unskip\endMakeFramed} + +\newenvironment{codeoutput}{% + \def\FrameCommand{\colorbox{outputbackground}}% + \vspace{-1.4em} + \MakeFramed{\advance\hsize-\width \FrameRestore}} + {\unskip\medskip\endMakeFramed} + +\newenvironment{traceback}{% + \def\FrameCommand{\colorbox{traceback}}% + \MakeFramed{\advance\hsize-\width \FrameRestore}} + {\endMakeFramed} + +% Use and configure listings package for nicely formatted code +\usepackage{listings} +\lstset{ + language=python, + aboveskip=\smallskipamount, + belowskip=\smallskipamount, + %xleftmargin=3mm, + breaklines=true, + basicstyle=\small \ttfamily, + showstringspaces=false, + keywordstyle=\color{blue}\bfseries, + commentstyle=\color{myteal}, + stringstyle=\color{darkgreen}, + identifierstyle=\color{darkorange}, +} + +% The hyperref package gives us a pdf with properly built +% internal navigation ('pdf bookmarks' for the table of contents, +% internal cross-reference links, web links for URLs, etc.) +\usepackage{hyperref} +\hypersetup{ + breaklinks=true, % so long urls are correctly broken across lines + colorlinks=true, + urlcolor=blue, + linkcolor=darkorange, + citecolor=darkgreen, + } + +% hardcode size of all verbatim environments to be a bit smaller +\makeatletter +\g@addto@macro\@verbatim\small\topsep=0.5em\partopsep=0pt +\makeatother + +% Prevent overflowing lines due to urls and other hard-to-break entities. +\sloppy diff --git a/tests/test.ipynb b/tests/test.ipynb index a82ecf7..2ec7f73 100644 --- a/tests/test.ipynb +++ b/tests/test.ipynb @@ -51,15 +51,12 @@ { "cell_type": "markdown", "source": [ - "A section heading", - "=================", - "", "A bit of text, with *important things*:", "", "* and", - "* more", + "* more that **are boldface**, as well as `verbatim`.", "", - "Using reST links to `ipython `_." + "Using markdown hyperlinks for [ipython](http://ipython.org)." ] }, { @@ -67,21 +64,21 @@ "collapsed": false, "input": [ "f = figure()", - "plot([1])", + "plot([1,2,3])", "display(f)" ], "language": "python", "outputs": [ { "output_type": "display_data", - "png": "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\n", + "png": "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\n", "text": [ - "" + "" ] }, { "output_type": "display_data", - "png": "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\n" + "png": "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\n" } ], "prompt_number": 1 @@ -128,7 +125,8 @@ "output_type": "stream", "stream": "stdout", "text": [ - "hello world" + "hello world", + "" ] } ], @@ -141,17 +139,70 @@ ] }, { - "cell_type": "plaintext", + "cell_type": "raw", "source": [ "plain text" ] }, { "cell_type": "code", - "collapsed": true, - "input": [], + "collapsed": false, + "input": [ + "import sys", + "m = 'A message'", + "print m, 'to stdout'", + "print >> sys.stderr, m, 'to stderr'", + "m" + ], "language": "python", - "outputs": [] + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "A message to stdout", + "" + ] + }, + { + "output_type": "stream", + "stream": "stderr", + "text": [ + "A message to stderr", + "" + ] + }, + { + "output_type": "pyout", + "prompt_number": 5, + "text": [ + "'A message'" + ] + } + ], + "prompt_number": 5 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "# a traceback", + "1/0" + ], + "language": "python", + "outputs": [ + { + "ename": "ZeroDivisionError", + "evalue": "integer division or modulo by zero", + "output_type": "pyerr", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[1;31mZeroDivisionError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m/home/fperez/ipython/nbconvert/tests/\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;31m# a traceback\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[1;36m1\u001b[0m\u001b[1;33m/\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mZeroDivisionError\u001b[0m: integer division or modulo by zero" + ] + } + ], + "prompt_number": 6 } ] }