From mboxrd@z Thu Jan 1 00:00:00 1970 From: Aaron Ecay Subject: [PATCH 1/5] ox-latex: add optional-packages machinery Date: Wed, 20 Feb 2013 23:02:22 -0500 Message-ID: <1361419346-23146-2-git-send-email-aaronecay@gmail.com> References: <1361419346-23146-1-git-send-email-aaronecay@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Return-path: Received: from eggs.gnu.org ([208.118.235.92]:58103) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1U8NN1-0001UU-6f for emacs-orgmode@gnu.org; Wed, 20 Feb 2013 23:02:57 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1U8NMt-00037O-9D for emacs-orgmode@gnu.org; Wed, 20 Feb 2013 23:02:54 -0500 Received: from mail-vb0-f42.google.com ([209.85.212.42]:52588) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1U8NMt-00037K-3W for emacs-orgmode@gnu.org; Wed, 20 Feb 2013 23:02:47 -0500 Received: by mail-vb0-f42.google.com with SMTP id ff1so2382408vbb.15 for ; Wed, 20 Feb 2013 20:02:46 -0800 (PST) In-Reply-To: <1361419346-23146-1-git-send-email-aaronecay@gmail.com> 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: emacs-orgmode@gnu.org This code allows latex packages to be inserted into the output document only if they are needed. The function ‘org-latex--use-package’ is provided for code to signal that it wants a package inserted into the output. The ‘org-latex-optional-packages-options-alist’ variable allows optionally loaded packages to be customized. It contains slots for options to be passed to the \usepackage line, as well as arbitrary code to be inserted into the preamble. Code to use this mechanism is in followup patches. --- lisp/ox-latex.el | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 54 insertions(+), 3 deletions(-) diff --git a/lisp/ox-latex.el b/lisp/ox-latex.el index 9d5b5c5..9895028 100644 --- a/lisp/ox-latex.el +++ b/lisp/ox-latex.el @@ -418,6 +418,22 @@ toc:nil option, not to those generated with #+TOC keyword." :group 'org-export-latex :type 'boolean) +(defcustom org-latex-optional-package-options-alist nil + "An alist of options for packages which will be loaded if needed. + +The format is a list of triples of (PACKAGE-NAME PACKAGE-OPTIONS +PREAMBLE-CODE). The PACKAGE-OPTIONS will be passed as options to +the \\usepackage command. The PREAMBLE-CODE will be inserted in +the preamble of the resulting document (before any LaTeX_HEADER +lines). + +Either of the values may be omitted (nil)." + :group 'org-export-latex + :type '(repeat + (list + (string :tag "Package name") + (string :tag "Package options") + (string :tag "Preamble code")))) ;;;; Headline @@ -1087,6 +1103,11 @@ just outside of it." (funcall search-refs element)) "")) +(defun org-latex--use-package (info package) + (let ((optional-packages (plist-get info :latex-optional-packages))) + (plist-put info :latex-optional-packages + (add-to-list 'optional-packages package)))) + ;;; Template @@ -1110,7 +1131,8 @@ holding export options." (if (not class-options) header (replace-regexp-in-string "^[ \t]*\\\\documentclass\\(\\(\\[.*\\]\\)?\\)" - class-options header t nil 1))))) + class-options header t nil 1)))) + (optional-packages (plist-get info :latex-optional-packages))) (if (not document-class-string) (user-error "Unknown LaTeX class `%s'" class) (org-latex-guess-babel-language @@ -1118,8 +1140,13 @@ holding export options." (org-splice-latex-header document-class-string org-latex-default-packages-alist - org-latex-packages-alist nil - (plist-get info :latex-header-extra))) + (org-latex-add-optional-packages + optional-packages + org-latex-packages-alist) + nil + (org-latex-add-optional-package-preambles + optional-packages + (plist-get info :latex-header-extra)))) info))))) ;; Possibly limit depth for headline numbering. (let ((sec-num (plist-get info :section-numbers))) @@ -1183,6 +1210,30 @@ holding export options." ;; Document end. "\\end{document}"))) +(defun org-latex-add-optional-packages (optional-packages packages) + (if (not optional-packages) + packages + (append packages + (mapcar + (lambda (pkg) + (list (or (cadr (assoc pkg org-latex-optional-package-options-alist)) "") + pkg + nil)) + optional-packages)))) + +(defun org-latex-add-optional-package-preambles (optional-packages preamble) + (if (not optional-packages) + preamble + (concat + (mapconcat + #'identity + (delq nil + (mapcar (lambda (pkg) + (nth 2 (assoc pkg org-latex-optional-package-options-alist))) + optional-packages)) + "\n") + "\n" preamble))) + ;;; Transcode Functions -- 1.8.1.4