emacs-orgmode
[Top][All Lists]
Advanced

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

Re: [O] [BUG?][babel] Re: Including source when exporting in PDF


From: Eric Schulte
Subject: Re: [O] [BUG?][babel] Re: Including source when exporting in PDF
Date: Fri, 20 Jan 2012 11:12:41 -0700
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.0.92 (gnu/linux)

Rainer M Krug <address@hidden> writes:

> On 18/01/12 01:57, Frozenlock wrote:
>> I'm sorry, but I don't quite understand...
>> 
>> Would it be possible to send a minimum working example of your org
>> file?
>> 
>
> The example is below:
>

This is likely the most evil snippet of Org-mode code I have ever
seen. :)

#+Options: ^:nil

* name src_emacs-lisp{(buffer-file-name)}

#+BEGIN_SRC emacs-lisp :results org :exports code :var 
buffer-file-name=(buffer-file-name)
  (org-babel-tangle)
#+END_SRC
I can confirm that it does modify the value of the file on disk as part
of the export process.  Additionally, the src_emacs_lisp in the header
does not export any results because by the time (buffer-file-name) is
called the code is living in a temporary export buffer which is not
visiting a file, note that a heading like the following would probably
give the result you're after

* name src_emacs-lisp{org-current-export-file}

similarly you want the tangling to be done in the original Org-mode file
(not the temporary export file), so that should be placed in a header
argument as well.  Try the following less evil version on for size and
let me know if it doesn't solve your problems.

#+Options: ^:nil

* name src_emacs-lisp{org-current-export-file}

One block to tangle.
#+BEGIN_SRC emacs-lisp :tangle yes
  (message "I am tangled")
#+END_SRC

One block to export.
#+BEGIN_SRC emacs-lisp :exports results :var foo=(org-babel-tangle)
  (message "I just tangled %S during export" foo)
#+END_SRC
>
> ################################################
> * name src_emacs-lisp{(buffer-file-name)}
> #+BEGIN_SRC emacs-lisp :results org :exports results :var
> buffer-file-name=(buffer-file-name)
>   (org-babel-tangle)
> #+END_SRC
> ################################################
>
> If I put the text in the ### lines in a new org file and export it, it
> is modified as described below.
>
> My guess is that it has to do with the fact that on export, a
> temporary copy is created, and some confusion is happening with which
> file is tangled.
>
> Cheers,
>
> Rainer
>
>> 
>> 
>> On Mon, Jan 16, 2012 at 6:21 AM, Rainer M Krug <address@hidden>
>> wrote: On 15/01/12 06:29, Frozenlock wrote:
>>>>> This babel block should do the following:
>>>>> 
>>>>> - When exporting, automatically tangle the babel blocks. -
>>>>> Then take the resulting files and add them to a zip file,
>>>>> along with the original .org file. - Add the necessary
>>>>> \usepackage and latex commands to insert the zipfile.
>>>>> 
>>>>> Let me know if something isn't like you want.
>>>>> 
>>>>> Here is the babel block to add to your source (org) file:
>>>>> 
>>>>> ======================================== #+BEGIN_SRC
>>>>> emacs-lisp :results org :exports results :var 
>>>>> buffer-file-name=(buffer-file-name) (let ((filename 
>>>>> (file-name-nondirectory (file-name-sans-extension 
>>>>> buffer-file-name)))) (shell-command (concat "zip -j "
>>>>> filename ".zip " filename".org " (mapconcat '(lambda (arg) 
>>>>> (convert-standard-filename (expand-file-name arg))) 
>>>>> (org-babel-tangle) " "))) (concat 
>>>>> "#+LATEX_HEADER:\\usepackage{attachfile2}\n" "#+LATEX:
>>>>> \\vfill \\textattachfile[print=false,color=0.5 0.5 
>>>>> 0.5]{"filename".zip}{Source (.org) \\& other files...}\n")) 
>>>>> #+END_SRC ==============================
>> 
>> Thanks for this code - it looks good, but there is a serious
>> problem:
>> 
>> src_emacs_lisp{} expressions are evaluated and replaced with the 
>> result in the org file, which does not happen when tangling from
>> the buffer itself. Example:
>> 
>> ################################################ * name
>> src_emacs-lisp{(buffer-file-name)} #+BEGIN_SRC emacs-lisp :results
>> org :exports results :var buffer-file-name=(buffer-file-name) 
>> (org-babel-tangle) #+END_SRC 
>> ################################################
>> 
>> If I export the file above, the file get changed to:
>> 
>> ################################################ * name
>> 
>> #+BEGIN_SRC emacs-lisp :results org :exports results :var 
>> buffer-file-name=(buffer-file-name) (org-babel-tangle) #+END_SRC 
>> ################################################
>> 
>> Is there something wrong with the code?
>> 
>> Rainer
>> 
>> 
>>>>> 
>>>>> 
>>>>> On a related note, I've added some improvements to my own way
>>>>> to export in multiple format and add the files along with the
>>>>> source. The latex commands and usepackage are included, so no
>>>>> need to add them elswhere in the org file:
>>>>> 
>>>>> ============================== # Make sure this babel block
>>>>> is the last one in the buffer; # block after this one won't
>>>>> be evaluated before the txt and html export. #+BEGIN_SRC
>>>>> emacs-lisp :results org :exports results :var
>>>>> buffer-file-name=(buffer-file-name) (let 
>>>>> ((org-export-babel-evaluate nil)); don't evaluate in
>>>>> 'recursive' exports (save-window-excursion ;; avoid leakage
>>>>> when more than one org export in block (org-export-as-ascii 
>>>>> org-export-headline-levels)) (save-window-excursion 
>>>>> (org-export-as-html org-export-headline-levels)) (let
>>>>> ((filename (file-name-nondirectory (file-name-sans-extension 
>>>>> buffer-file-name))) (to-include-files (directory-files 
>>>>> (file-name-directory buffer-file-name)))) (shell-command
>>>>> (concat "zip -j " filename  ".zip " (mapconcat '(lambda (arg)
>>>>> arg) (remove-if '(lambda (file) (string-match 
>>>>> "\\.$\\|\\.pdf$\\|\\.atfi$\\|\\.tex$\\|#" file)) ;; don't
>>>>> include useless files to-include-files) " "))) (concat 
>>>>> "#+LATEX_HEADER:\\usepackage{attachfile2}\n" "#+LATEX:
>>>>> \\vfill \\textattachfile[print=false,color=0.5 0.5 
>>>>> 0.5]{"filename".zip}{Source (.org) & html, txt...}\n")))
>>>>> #+END_SRC ==============================
>>>>> 
>>>>> 
>>>>> Enjoy!
>>>>> 
>>>>> 
>>>>> 
>>>>> On Thu, Jan 12, 2012 at 8:59 AM, Rainer M Krug
>>>>> <address@hidden> wrote:
>>>>>> On 12 January 2012 14:54, Frozenlock
>>>>>> <address@hidden> wrote:
>>>>>>> The code block I previously sent only require you to
>>>>>>> specify which _extension_ you want or don't want. No need
>>>>>>> to include any specific filename (other than the .zip
>>>>>>> file in the latex "include" command).
>>>>>>> 
>>>>>>> Am I to understand you want something to include *all and
>>>>>>> only* tangled files?
>>>>>> 
>>>>>> Yes - and the files do have different extensions (e.g. .R,
>>>>>> .sh, .sub, none) and are not tangled necessarily in a
>>>>>> specific directory.
>>>>>> 
>>>>>> and the original org file, but that is not a problem.
>>>>>> 
>>>>>> Rainer
>>>>>> 
>>>>>>> 
>>>>>>> --
>>>>>>> 
>>>>>>> I tried ":exports result" with no success. I'll try to
>>>>>>> send a minimum working example shortly.
>>>>>>> 
>>>>>>> On Thu, Jan 12, 2012 at 4:11 AM, Rainer M Krug 
>>>>>>> <address@hidden> wrote:
>>>>> On 12/01/12 03:06, Frozenlock wrote:
>>>>>>>>>> To include multiple files, I export all of the
>>>>>>>>>> required files before the PDF creation and zip
>>>>>>>>>> them. This way, I only need to include a single zip
>>>>>>>>>> file.
>>>>> 
>>>>> Good idea.
>>>>> 
>>>>>>>>>> 
>>>>>>>>>> #+BEGIN_SRC emacs-lisp :exports none ;; various
>>>>>>>>>> exports (save-window-excursion
>>>>>>>>>> (org-export-as-ascii org-export-headline-levels))
>>>>>>>>>> (save-window-excursion (org-export-as-html
>>>>>>>>>> org-export-headline-levels))
>>>>>>>>>> 
>>>>>>>>>> ;;zip the required files (let ((filename 
>>>>>>>>>> (file-name-sans-extension (file-name-nondirectory 
>>>>>>>>>> (buffer-file-name))))) (shell-command (concat "zip
>>>>>>>>>> " filename ".zip " (mapconcat '(lambda (arg) arg) 
>>>>>>>>>> (remove-if '(lambda (filename) (string-match 
>>>>>>>>>> "\\.$\\|\\.pdf$\\|\\.atfi$\\|#" filename)) 
>>>>>>>>>> (directory-files (file-name-directory 
>>>>>>>>>> (buffer-file-name)))) " ")))) #+END_SRC
>>>>>>>>>> 
>>>>>>>>>> (I've added this code in a babel block to evaluate
>>>>>>>>>> just before the PDF export.)
>>>>> 
>>>>> I actually did not want to fiddle with the file names, as it
>>>>> is to easy to forget some: this concerns in my case literate
>>>>> programming of a simulation model in R, resul;ting in several
>>>>> files of different extensions - it is to easy to forget one.
>>>>> 
>>>>> If I tangle, I get all the names of the tangled files, but I
>>>>> do not know how I can feed them into the zip file.
>>>>> 
>>>>>>>>>> 
>>>>>>>>>> As you can see, I make sure I don't include a
>>>>>>>>>> previous PDF, or any other useless file.
>>>>> 
>>>>> True.
>>>>> 
>>>>>>>>>> 
>>>>>>>>>> If you wish to add only a single type of file,
>>>>>>>>>> simply replace "remove-if" by "remove-if-not" and
>>>>>>>>>> change the value in the string-match function. For
>>>>>>>>>> example, "\\.$\\|\\.pdf$\\|\\.atfi$\\|#" would
>>>>>>>>>> become "\\.lisp$" to include all your exported lisp
>>>>>>>>>> files.
>>>>>>>>>> 
>>>>>>>>>> Hope this helps!
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> By the way, I can't get the code block to be
>>>>>>>>>> evaluated automatically when I export to PDF, any
>>>>>>>>>> clue on how to do that?
>>>>> 
>>>>> I assume, it is caused by the :exports none - so no
>>>>> evaluation is done on export. Try changing it to :exports
>>>>> result and then generate an empty result, or a list of files
>>>>> included in the zip file.
>>>>> 
>>>>> Cheers,
>>>>> 
>>>>> Rainer
>>>>> 
>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> On Wed, Jan 11, 2012 at 10:28 AM, Rainer M Krug 
>>>>>>>>>> <address@hidden> wrote: On 06/01/12 08:45,
>>>>>>>>>> Eric Schulte wrote:
>>>>>>>>>>>>> Frozenlock <address@hidden> writes:
>>>>>>>>>>>>> 
>>>>>>>>>>>>>> I am a strong advocate in keeping the
>>>>>>>>>>>>>> source of everything.
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> However, Â a source can easily be lost if
>>>>>>>>>>>>>> it doesn't follow the document. In LaTeX,
>>>>>>>>>>>>>> there's a package to attach a file to a PDF
>>>>>>>>>>>>>> (like when you attach a file to an email).
>>>>>>>>>>>>>> By doing so, the source will follow the PDF
>>>>>>>>>>>>>> even if the common reader have no clue what
>>>>>>>>>>>>>> it's for, or even how to use it.
>>>>>>>>>>>>>> 
>>>>>>>>>>>>> 
>>>>>>>>>>>>> This sounds like a great Reproducible
>>>>>>>>>>>>> Research practice.
>>>>>>>>>>>>> 
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> Here is how I attach my org source to
>>>>>>>>>>>>>> every document I export to PDF:
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> ;; Include the source file for every
>>>>>>>>>>>>>> exported PDF (org-mode) (eval-after-load
>>>>>>>>>>>>>> "org-exp" '(defadvice org-export-as-latex
>>>>>>>>>>>>>> (around org-export-add-source-pdf activate)
>>>>>>>>>>>>>> "Add the source (org file) to the resulting
>>>>>>>>>>>>>> pdf file" (let ((filename (buffer-name)))
>>>>>>>>>>>>>> ad-do-it ;do the function (let
>>>>>>>>>>>>>> ((latex-buffer ad-return-value)) 
>>>>>>>>>>>>>> (set-buffer latex-buffer) (while 
>>>>>>>>>>>>>> (re-search-forward "\\\\usepackage{.+}" nil
>>>>>>>>>>>>>> t)); go to the end of packages (insert 
>>>>>>>>>>>>>> "\n\\usepackage{attachfile2}"); the
>>>>>>>>>>>>>> package needed to attach files (when
>>>>>>>>>>>>>> (re-search-forward "\\\\end{document}" nil
>>>>>>>>>>>>>> t) (forward-line -1) (insert (concat
>>>>>>>>>>>>>> "\\vfill\n" "\\footnotesize\n" "The source
>>>>>>>>>>>>>> of this document is an Org-Mode file 
>>>>>>>>>>>>>> attached here:" "\n\\attachfile" "{"
>>>>>>>>>>>>>> filename "}"))) (save-buffer)))))
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> This is by no mean a patch, but rather a
>>>>>>>>>>>>>> quick hack. Perhaps someone with a working
>>>>>>>>>>>>>> knowledge of the org-export could find a
>>>>>>>>>>>>>> way to add a source option?
>>>>>>>>>>>>>> 
>>>>>>>>>>>>> 
>>>>>>>>>>>>> I think this practice may not actually
>>>>>>>>>>>>> require any changes to the Org-mode core. Â
>>>>>>>>>>>>> The attached small Org-mode file will attach
>>>>>>>>>>>>> itself to pdf exports using only features
>>>>>>>>>>>>> already present in Org-mode.
>>>>>>>>>> 
>>>>>>>>>> Following this idea - how can I easily attach all
>>>>>>>>>> files created by tangling? Is there a programmatic
>>>>>>>>>> way, without having to specify them manually?
>>>>>>>>>> 
>>>>>>>>>> Thanks,
>>>>>>>>>> 
>>>>>>>>>> Rainer
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>>>>> 
>>>>>>>>>>>>> 
>>>>>>>>>>>>> 
>>>>>>>>>>>>> 
>>>>>>>>>>>>> 
>>>>>>>>>>>>> Thanks for sharing this idea!
>>>>>>>>>>>>> 
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> Cheers!
>>>>>>>>>>>>>> 
>>>>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> -- Rainer M. Krug, PhD (Conservation Ecology, SUN), MSc 
>>>>>> (Conservation Biology, UCT), Dipl. Phys. (Germany)
>>>>>> 
>>>>>> Centre of Excellence for Invasion Biology Stellenbosch 
>>>>>> University South Africa
>>>>>> 
>>>>>> Tel :       +33 - (0)9 53 10 27 44 Cell:       +33 - (0)6
>>>>>> 85 62 59 98 Fax (F):       +33 - (0)9 58 10 27 44
>>>>>> 
>>>>>> Fax (D):    +49 - (0)3 21 21 25 22 44
>>>>>> 
>>>>>> email:      address@hidden
>>>>>> 
>>>>>> Skype:      RMkrug
>> 

-- 
Eric Schulte
http://cs.unm.edu/~eschulte/

reply via email to

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