emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: Frozenlock <frozenlock@gmail.com>
To: Rainer M Krug <r.m.krug@gmail.com>
Cc: emacs-orgmode@gnu.org, Eric Schulte <eric.schulte@gmx.com>
Subject: Re: Including source when exporting in PDF
Date: Sun, 15 Jan 2012 00:29:51 -0500	[thread overview]
Message-ID: <CACjB3dvgmxW4_obHGaEBnE2UG7ABudpVxV5PTdtO35UFqEp3kQ@mail.gmail.com> (raw)
In-Reply-To: <CAGhLh6Hn1h_3P=fHupuyjcASiZwtmHGEkf6qFzyryP+9nYV+Eg@mail.gmail.com>

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
==============================


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 <r.m.krug@gmail.com> wrote:
> On 12 January 2012 14:54, Frozenlock <frozenlock@gmail.com> 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 <r.m.krug@gmail.com> wrote:
>>> -----BEGIN PGP SIGNED MESSAGE-----
>>> Hash: SHA1
>>>
>>> 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
>>>> <r.m.krug@gmail.com> wrote: On 06/01/12 08:45, Eric Schulte wrote:
>>>>>>> Frozenlock <frozenlock@gmail.com> 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 :       +33 - (0)9 58 10 27 44
>>>
>>> Fax (D):    +49 - (0)3 21 21 25 22 44
>>>
>>> email:      Rainer@krugs.de
>>>
>>> Skype:      RMkrug
>>> -----BEGIN PGP SIGNATURE-----
>>> Version: GnuPG v1.4.11 (GNU/Linux)
>>> Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/
>>>
>>> iEUEARECAAYFAk8Oo7UACgkQoYgNqgF2egpg9wCfTq04zAVki+Oh1g97/C3FERf3
>>> Ej0Al30dF8xQdyHNOmOK8y7ZolA0dzE=
>>> =IUuN
>>> -----END PGP SIGNATURE-----
>
>
>
> --
> 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:      Rainer@krugs.de
>
> Skype:      RMkrug

  reply	other threads:[~2012-01-15  5:29 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-01-04 21:29 Including source when exporting in PDF Frozenlock
2012-01-06  7:45 ` Eric Schulte
2012-01-11 15:28   ` Rainer M Krug
2012-01-12  2:06     ` Frozenlock
2012-01-12  9:11       ` Rainer M Krug
2012-01-12 13:54         ` Frozenlock
2012-01-12 13:59           ` Rainer M Krug
2012-01-15  5:29             ` Frozenlock [this message]
2012-01-16 11:21               ` [BUG?][babel] " Rainer M Krug
2012-01-18  0:57                 ` Frozenlock
2012-01-18  9:03                   ` Rainer M Krug
2012-01-20 18:12                     ` Eric Schulte

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CACjB3dvgmxW4_obHGaEBnE2UG7ABudpVxV5PTdtO35UFqEp3kQ@mail.gmail.com \
    --to=frozenlock@gmail.com \
    --cc=emacs-orgmode@gnu.org \
    --cc=eric.schulte@gmx.com \
    --cc=r.m.krug@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).