On Feb 4, 2014, at 12:31, Nick Dokos wrote: > Nick Dokos writes: > >> "R. Michael Weylandt" writes: >> >>> I want org-mode to export to the "amsart" class by default. In >>> addition to the regular \title, \author, \date macros, amsart also >>> allows for "email". >>> >>> (add-to-list 'org-latex-classes >>> '("amsart" >>> "\\documentclass{amsart} >>> [DEFAULT-PACKAGES] >>> [PACKAGES] >>> [EXTRA] >>> \\email{ {{{email}}} }" >>> ("\\section{%s}" . "\\section{%s}") >>> ("\\subsection{%s}" . "\\subsection{%s}") >>> ("\\subsubsection{%s}" . "\\subsubsection{%s}"))) >>> >>> Running this on a document like: >>> >>> #+TITLE: Test 1 >>> #+AUTHOR: Michael Weylandt >>> #+EMAIL: Michael.Weylandt@gmail.com >>> #+LATEX_CLASS: amsart >>> * Header 1 >>> Hello World >>> >>> leaves me with "\email{email}" in the resulting LaTeX instead of >>> "\email{Michael.Weylandt@mail.com}". Since this is used as part of >>> \maketitle, doing something in the body (like your example) is too >>> late. >>> >>> The #+EMAIL: value is handled by ox-latex.el, but it's only placed >>> inside the \author{} macro instead of in a stand alone \email{}. >>> That's the behavior I'm hoping to tweak. >>> >>> Is that clearer? >> >> Much - thanks. I haven't thought much about it but my knee-jerk reaction >> is to use a marker (something like \email{@EMAIL@}) when defining the >> class and use a filter to replace it at the end. But there are might be >> more elegant solutions around. > > So here's a brute-force solution along the above lines: > > --8<---------------cut here---------------start------------->8--- > #+EMAIL: ndokos@gmail.com > #+LATEX_CLASS: amsart > > * foo > bar > > * code :noexport: > This should probably go in some initialization file - for testing, I just executed > the code blocks by hand: > > #+name: email-filter > #+BEGIN_SRC elisp :results none > (defun nd-email-filter (contents backend info) > (let ((email (plist-get info :email))) > (replace-regexp-in-string "@EMAIL@" email contents t))) > > (add-to-list 'org-export-filter-final-output-functions (function nd-email-filter)) > #+END_SRC > > #+name: amsart > #+BEGIN_SRC elisp :results none > (setq amsart-class > '("amsart" > "\\documentclass{amsart} > [DEFAULT-PACKAGES] > [PACKAGES] > [EXTRA] > \\email{@EMAIL@ }" > ("\\section{%s}" . "\\section{%s}") > ("\\subsection{%s}" . "\\subsection{%s}") > ("\\subsubsection{%s}" . "\\subsubsection{%s}"))) > > (add-to-list 'org-latex-classes amsart-class) > #+END_SRC > > This deletes the amsart from the org-latex-classes list: > > #+BEGIN_SRC elisp > (setq org-latex-classes (cdr org-latex-classes)) > #+END_SRC > --8<---------------cut here---------------end--------------->8--- > > Nick Hi Nick, Thanks for the example; the filter seems to work well. Two possible issues: 1. I only want to use it for some latex classes 2. When using \email{} I want to get rid of the \thanks{} in \author{}. I came up with the following: <----------------------> (require 'cl-lib) (defun any (x) (cl-reduce (lambda (x y) (if x x y)) x)) ;; For certain latex classes, the org-mode default of \author{NAME\thanks{EMAIL}} ;; isn't what the class wants (defvar org-latex-classes-with-email '("amsart" "amsbook")) ;; After completing latex export, check if we are in one of the classes listed in 'org-latex-classes-with-email; ;; if we are, we need to ;; 1) Remove the \thanks{} macro inside \author{} ;; 2) Add an \email{} macro ;; This can be done with a single regex replace using captures. (defun org-latex-classes-with-email-filter (contents backend info) (if (any (mapcar (lambda (x) (string-match x contents)) org-latex-classes-with-email)) (replace-regexp-in-string "\\\\author{\\(.*\\)\\\\thanks{\\(.*\\)}}" "\\\\author{\\1}\n\\\\email{\\2}" contents))) ;; Thanks to Nick Dokos for the filter setup help --http://lists.gnu.org/archive/html/emacs-orgmode/2014-02/msg00130.html (add-to-list 'org-export-filter-final-output-functions (function org-latex-classes-with-email-filter)) <-------------------> It's regex based so there may be some false positives, but it seems to work well enough for me. Michael