From mboxrd@z Thu Jan 1 00:00:00 1970 From: tsd@tsdye.com (Thomas S. Dye) Subject: Re: example filter for code blocks? Date: Sun, 29 Sep 2013 14:33:50 -1000 Message-ID: References: Mime-Version: 1.0 Content-Type: text/plain Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:41367) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VQRRQ-0006ig-CZ for emacs-orgmode@gnu.org; Sun, 29 Sep 2013 20:34:29 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VQRRI-0000Le-6i for emacs-orgmode@gnu.org; Sun, 29 Sep 2013 20:34:24 -0400 Received: from oproxy12-pub.mail.unifiedlayer.com ([50.87.16.10]:41952) by eggs.gnu.org with smtp (Exim 4.71) (envelope-from ) id 1VQRRH-0000LP-SR for emacs-orgmode@gnu.org; Sun, 29 Sep 2013 20:34:16 -0400 In-Reply-To: (John Kitchin's message of "Thu, 26 Sep 2013 13:57:35 -0400") List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: John Kitchin Cc: emacs-orgmode@gnu.org Hi John, John Kitchin writes: > 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% > #+LATEX_HEADER: } With this in my LaTeX file: \LaunchBinary{lkfs-structure.org}{Open the file Org mode file.} I get a red boxed link in the pdf output. When I click on it, Adobe Reader complains: Could not find an application to open the file ' '. I can't understand the code for LaunchBinary, but noticed "DOS" and wondered if the code is somehow dependent on the operating system. I'm using a Mac. All the best, Tom > > > 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 > (org-latex-default-packages-alist > '(("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))) > (with-temp-buffer > (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 > > ----------------------------------- > John Kitchin > Associate Professor > Doherty Hall A207F > Department of Chemical Engineering > Carnegie Mellon University > Pittsburgh, PA 15213 > 412-268-7803 > http://kitchingroup.cheme.cmu.edu > 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% > #+LATEX_HEADER: } > > 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 > (org-latex-default-packages-alist > '(("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))) > (with-temp-buffer > (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 > > ----------------------------------- > John Kitchin > Associate Professor > Doherty Hall A207F > Department of Chemical Engineering > Carnegie Mellon University > Pittsburgh, PA 15213 > 412-268-7803 > http://kitchingroup.cheme.cmu.edu > > -- Thomas S. Dye http://www.tsdye.com