Florian Beck <f...@miszellen.de> writes: > Ok, I took some time to extract a minimal example. It works fine, but > on a very low level (see below). > > Again, the goal is to add an optional argument to sectioning command. > The best way I could come up with is this (I omit the > `fb/org-export-pdf' function): > > #+BEGIN_SRC emacs-lisp > (defun fb/org-export-modify-headline (headline string) > (if (string-match > (rx > string-start "\\" > (group-n 1 (0+ "sub")) > (group-n 2 (or "part" "chapter" "section" "paragraph")) > (group-n 3 (zero-or-one "\*")) > "{" (group-n 4 (minimal-match (0+ (not (any "}"))))) "}") > string) > (let* ((level (match-string 1 string)) > (type (match-string 2 string)) > (stars (match-string 3 string)) > (title (match-string 4 string)) > (toc-title (org-element-property :toc-title headline)) > (new-hl > (format "\\%s%s%s%s{%s}" > (or level "") > type > (or stars "") > (if toc-title (format "[%s]" toc-title) "") > title))) > (replace-match new-hl t t string 0)) > string))
Why don't you simply replace (or add, if needed) optional argument from sectioning command with `replace-regexp-in-string' instead of building the whole string again? Like the following (untested): #+begin_src emacs-lisp (defun fb/org-latex-headline (headline contents info) (let ((original-hl (org-export-with-backend 'latex headline contents info)) (toc-title (org-element-property :toc-title headline))) (cond ((not toc-title) original-hl) ((string-match "\\`\\.*?\\*?\\[\\([^]]\\)\\]" original-hl) (replace-match toc-title nil nil original-hl 1)) (t (replace-regexp-in-string "\\`\\.*?\\*?" (concat "\\&" toc-title) original-hl))))) #+end_src > As you can see, I pull apart the string and then put it back together. > (Relatively straightforward in this case, much more involved for, say, > links.) Writing translators for headlines links and tables is usually a major undertaking when creating a new back-end. That's why there are so many tools to operate on these elements in ox.el. Anyway, this is not bad, as you forked a 3k locs back-end with about 30 locs. > In a perfect world, I would have access to these elements and the format > string, so I could either modify them before calling > `org-export-with-backend' or assemble the string myself. In your perfect world, there would be billions of variables, depending on the element, the back-end and the task. Customization is still important, so I offer generic tools when variables are not enough. Note that I might implement this feature at one point, but I still have to think about its specifications. Regards, -- Nicolas Goaziou