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

> Nick Dokos <ndo...@gmail.com> writes:
> 
>> "R. Michael Weylandt" <michael.weyla...@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.weyla...@gmail.com
>>> #+LATEX_CLASS: amsart
>>> * Header 1
>>> Hello World
>>> 
>>> leaves me with "\email{email}" in the resulting LaTeX instead of
>>> "\email{michael.weyla...@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: ndo...@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

Reply via email to