[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [O] example filter for code blocks?

From: John Kitchin
Subject: Re: [O] example filter for code blocks?
Date: Thu, 26 Sep 2013 13:57:35 -0400

Hi everyone,
Thanks for  the tips in using export filters for code blocks. I thought I would share my current solution. The goal was to export all the code blocks in an org-file to files systematically named part1/script-%d.py where %d is a number. I didnot want to tangle exactly, because I wanted to avoid naming the code block tangle files.

Then, I wanted to insert a pdf link that would open the file, after the syntax highlighted code.

I wanted this because it is not convenient to copy and paste the syntax-highlighted code into an editor. I teach from the pdf that is generated, and it would be convenient to just open the code, edit and rerun to explore solutions.

So, here is the solution:

At the top of my orgfile, I have this definition which creates a pdf link.

#+LATEX_HEADER: \newcommand{\LaunchBinary}[2]{%
#+LATEX_HEADER:   % #1: layer name,
#+LATEX_HEADER:   % #2: link text
#+LATEX_HEADER:   \leavevmode%
#+LATEX_HEADER:   \pdfstartlink  attr{/C [0.9 0 0] /Border [0 0 2]} user {
#+LATEX_HEADER:     /Subtype /Link
#+LATEX_HEADER:     /A <<
#+LATEX_HEADER:       /F <<
#+LATEX_HEADER:          /DOS (#1)
#+LATEX_HEADER:       >>
#+LATEX_HEADER:       /S /Launch
#+LATEX_HEADER:     >>
#+LATEX_HEADER:   } #2%
#+LATEX_HEADER:   \pdfendlink%

Then, I use the code snippet below to export the file to latex. It is stored in a noexport section at the end of the document. basically I set a counter, and wrote a filter function for src blocks. the function captures the lines between the first and last (first is \begin{minted}... and last is \end{minted} in this case. I write those lines to a file named according to the counter, and finally insert \LaunchBinary... into the string returned by the filter. everything else in this let block is just fine-tuning the latex packages, and export behavior.

(let (
      ;; these packages are loaded in the latex file
       '(("utf8" "inputenc" nil)
     ("T1" "fontenc" nil)
     ("" "fixltx2e" nil)
     ("" "natbib" t)
     ("" "url" t)
     ("" "graphicx" t)
         ("" "textcomp" t)
         ("" "underscore" t)
     ("" "amsmath" t)
         ("version=3" "mhchem" t)
         ("tight,pdftex" "web" nil)
         ("" "exerquiz" nil)
         ("ImplMulti" "dljslib" nil)
      (async nil)
      (subtreep nil)
      (visible-only nil)
      (body-only nil))

(setq counter 0)

  (defun ox-mrkup-filter-src-block (text back-end info)
    (setq counter (+ counter 1))

    (let ((filename (format "part1-scripts/script-%d.py" counter)))
        (insert (mapconcat 'identity (butlast (cdr (split-string text "\n" t))) "\n"))
        (write-region (point-min) (point-max) filename))

      (format "%s

\\LaunchBinary{%s}{Open the python script (%s).}

" text filename filename)))

(let ((org-export-filter-src-block-functions '(ox-mrkup-filter-src-block)))
  (org-latex-export-to-latex async subtreep visible-only body-only
                 '(:with-author t               
                                            :with-date t
                                            :with-title t
                                            :with-timestamps t
                                            :with-todo-keywords t
                                            :with-toc nil))))

After building the pdf with pdflatex, I get a link with a red box around it that I can click on, and on my system it opens the python file in the python editor I have configured to open the file!

Thanks again!


John Kitchin
Associate Professor
Doherty Hall A207F
Department of Chemical Engineering
Carnegie Mellon University
Pittsburgh, PA 15213

reply via email to

[Prev in Thread] Current Thread [Next in Thread]