Hello, Florian Beck <f...@miszellen.de> writes:
> the docstring for `org-latex-classes' says: > > "Instead of a list of sectioning commands, you can also specify > a function name. That function will be called with two > parameters, the (reduced) level of the headline, and a predicate > non-nil when the headline should be numbered. It must return > a format string in which the section title will be added." > > This is wrong. The way this function is called in `org-latex-headline' > requires it to return a string with TWO format specifiers, e.g. > "\section{%%s}%%s\n", the second where the CONTENT of the section is > being added. Maybe `org-latex-headline' should add "%%s\n" itself – as > it does for other cases? Indeed. It's now the case. Thanks for reporting this. > Also, I'm using this to add an optional argument to my sections. Can I > expect this to work? (i.e. being called in a context where the variables > `info' and `headline' are defined?) > > #+BEGIN_SRC emacs-lisp > (defun fb/latex-sections (level numbered) > (let* ((level (1- level)) > (sec-name (nth level fb/latex-section-names)) > (sec (when sec-name > (format "\\%s%s%s{%%s}\n%%s" > sec-name > (if numbered "" "*") > ;; "" > (or (when (plist-get info :toc-title) > (let ((toc-title (org-element-property > :toc-title headline))) > (when toc-title (format "[%s]" toc-title)))) > "") > )))) > sec)) > #+END_SRC Actually, the proper way to do this is to define a derived back-end with a custom headline translation function. #+begin_src emacs-lisp (org-export-define-derived-backend my-latex latex :translate-alist ((headline . fb/my-latex-headline))) (defun fb/my-latex-headline (headline contents info) ... Do whatever you want here) #+end_src Also, you can use `org-export-with-backend' as a fallback case for your custom function. >From there you can use: (org-export-to-buffer 'my-latex "*My own export*") or, (org-export-to-file 'my-latex "some-file.tex") You may wrap the previous calls into an interactive command (just copy and adapt from those in ox-latex.el). For example: #+begin_src emacs-lisp (defun fb/my-latex-export-to-latex (&optional async subtreep visible-only body-only ext-plist) (interactive) (let ((outfile (org-export-output-file-name ".tex" subtreep))) (if async (org-export-async-start (lambda (f) (org-export-add-to-stack f 'my-latex)) `(expand-file-name (org-export-to-file 'my-latex ,outfile ,subtreep ,visible-only ,body-only ',ext-plist))) (org-export-to-file 'my-latex outfile subtreep visible-only body-only ext-plist)))) #+end_src Optionally, you can add an entry in the dispatcher for your new command: #+begin_src emacs-lisp (org-export-define-derived-backend my-latex latex :translate-alist ((headline . fb/my-latex-headline)) :menu-entry (?l 2 ((?m "With my special extension" fb/my-latex-export-to-latex)))) #+end_src Regards, -- Nicolas Goaziou