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. Inaddition to the regular \title, \author, \date macros, amsart alsoallows 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 1Hello Worldleaves 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 toolate.The #+EMAIL: value is handled by ox-latex.el, but it's only placedinside 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 reactionis to use a marker (something like \email{@EMAIL@}) when defining theclass and use a filter to replace it at the end. But there are might bemore 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
(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