On Feb 4, 2014, at 12:31, Nick Dokos <ndokos@gmail.com> wrote:

Nick Dokos <ndokos@gmail.com> writes:

"R. Michael Weylandt" <michael.weylandt@gmail.com> 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