|
@@ -2296,6 +2296,68 @@ The conversion is made depending of STRING-BEFORE and STRING-AFTER."
|
|
|
|
|
|
(defun org-export-latex-preprocess (parameters)
|
|
|
"Clean stuff in the LaTeX export."
|
|
|
+ ;; Replace footnotes.
|
|
|
+ (when (plist-get parameters :footnotes)
|
|
|
+ (goto-char (point-min))
|
|
|
+ (let (ref)
|
|
|
+ (while (setq ref (org-footnote-get-next-reference))
|
|
|
+ (let* ((beg (nth 1 ref))
|
|
|
+ (lbl (car ref))
|
|
|
+ (def (nth 1 (assoc (string-to-number lbl)
|
|
|
+ (mapcar (lambda (e) (cdr e))
|
|
|
+ org-export-footnotes-seen)))))
|
|
|
+ ;; Fix body for footnotes ending on a link or a list and
|
|
|
+ ;; remove definition from buffer.
|
|
|
+ (setq def
|
|
|
+ (concat def
|
|
|
+ (if (string-match "ORG-LIST-END-MARKER\\'" def)
|
|
|
+ "\n" " ")))
|
|
|
+ (org-footnote-delete-definitions lbl)
|
|
|
+ ;; Compute string to insert (FNOTE), and protect the outside
|
|
|
+ ;; macro from further transformation. When footnote at
|
|
|
+ ;; point is referring to a previously defined footnote, use
|
|
|
+ ;; \footnotemark. Otherwise, use \footnote.
|
|
|
+ (let ((fnote (if (member lbl org-export-latex-footmark-seen)
|
|
|
+ (org-export-latex-protect-string
|
|
|
+ (format "\\footnotemark[%s]" lbl))
|
|
|
+ (push lbl org-export-latex-footmark-seen)
|
|
|
+ (concat (org-export-latex-protect-string "\\footnote{")
|
|
|
+ def
|
|
|
+ (org-export-latex-protect-string "}"))))
|
|
|
+ ;; Check if another footnote is immediately following.
|
|
|
+ ;; If so, add a separator in-between.
|
|
|
+ (sep (org-export-latex-protect-string
|
|
|
+ (if (save-excursion (goto-char (1- (nth 2 ref)))
|
|
|
+ (let ((next (org-footnote-get-next-reference)))
|
|
|
+ (and next (= (nth 1 next) (nth 2 ref)))))
|
|
|
+ org-export-latex-footnote-separator ""))))
|
|
|
+ (when (org-on-heading-p)
|
|
|
+ (setq fnote (concat (org-export-latex-protect-string "\\protect")
|
|
|
+ fnote)))
|
|
|
+ ;; Ensure a footnote at column 0 cannot end a list
|
|
|
+ ;; containing it.
|
|
|
+ (put-text-property 0 (length fnote) 'original-indentation 1000 fnote)
|
|
|
+ ;; Replace footnote reference with FNOTE and, maybe, SEP.
|
|
|
+ ;; `save-excursion' is required if there are two footnotes
|
|
|
+ ;; in a row. In that case, point would be left at the
|
|
|
+ ;; beginning of the second one, and
|
|
|
+ ;; `org-footnote-get-next-reference' would then skip it.
|
|
|
+ (goto-char beg)
|
|
|
+ (delete-region beg (nth 2 ref))
|
|
|
+ (save-excursion (insert fnote sep)))))))
|
|
|
+
|
|
|
+ ;; Remove footnote section tag for LaTeX
|
|
|
+ (goto-char (point-min))
|
|
|
+ (while (re-search-forward
|
|
|
+ (concat "^" footnote-section-tag-regexp) nil t)
|
|
|
+ (org-if-unprotected
|
|
|
+ (replace-match "")))
|
|
|
+ ;; Remove any left-over footnote definition.
|
|
|
+ (mapc (lambda (fn) (org-footnote-delete-definitions (car fn)))
|
|
|
+ org-export-footnotes-data)
|
|
|
+ (mapc (lambda (fn) (org-footnote-delete-definitions fn))
|
|
|
+ org-export-latex-footmark-seen)
|
|
|
+
|
|
|
;; Preserve line breaks
|
|
|
(goto-char (point-min))
|
|
|
(while (re-search-forward "\\\\\\\\" nil t)
|
|
@@ -2317,7 +2379,6 @@ The conversion is made depending of STRING-BEFORE and STRING-AFTER."
|
|
|
(goto-char (point-at-eol))))))
|
|
|
|
|
|
;; Preserve math snippets
|
|
|
-
|
|
|
(let* ((matchers (plist-get org-format-latex-options :matchers))
|
|
|
(re-list org-latex-regexps)
|
|
|
beg end re e m n block off)
|
|
@@ -2409,12 +2470,17 @@ The conversion is made depending of STRING-BEFORE and STRING-AFTER."
|
|
|
"\\(" (org-create-multibrace-regexp "{" "}" 3) "\\)\\{1,3\\}")))
|
|
|
(while (re-search-forward re nil t)
|
|
|
(unless (or
|
|
|
- ;; check for comment line
|
|
|
+ ;; Check for comment line.
|
|
|
(save-excursion (goto-char (match-beginning 0))
|
|
|
(org-in-indented-comment-line))
|
|
|
- ;; Check if this is a defined entity, so that is may need conversion
|
|
|
+ ;; Check if this is a defined entity, so that is may
|
|
|
+ ;; need conversion.
|
|
|
(org-entity-get (match-string 1))
|
|
|
- )
|
|
|
+ ;; Do not protect interior of footnotes. Those have
|
|
|
+ ;; already been taken care of earlier in the function.
|
|
|
+ ;; Yet, keep looking inside them for more commands.
|
|
|
+ (and (equal (match-string 1) "footnote")
|
|
|
+ (goto-char (match-end 1))))
|
|
|
(add-text-properties (match-beginning 0) (match-end 0)
|
|
|
'(org-protected t)))))
|
|
|
|
|
@@ -2450,69 +2516,7 @@ The conversion is made depending of STRING-BEFORE and STRING-AFTER."
|
|
|
(goto-char (point-min))
|
|
|
(while (re-search-forward "@<\\(?:[^\"\n]\\|\".*\"\\)*?>" nil t)
|
|
|
(org-if-unprotected
|
|
|
- (replace-match "")))
|
|
|
-
|
|
|
- ;; When converting to LaTeX, replace footnotes.
|
|
|
- (when (plist-get parameters :footnotes)
|
|
|
- (goto-char (point-min))
|
|
|
- (let (ref)
|
|
|
- (while (setq ref (org-footnote-get-next-reference))
|
|
|
- (let* ((beg (nth 1 ref))
|
|
|
- (lbl (car ref))
|
|
|
- (def (nth 1 (assoc (string-to-number lbl)
|
|
|
- (mapcar (lambda (e) (cdr e))
|
|
|
- org-export-footnotes-seen)))))
|
|
|
- ;; Fix body for footnotes ending on a link or a list and
|
|
|
- ;; remove definition from buffer.
|
|
|
- (setq def
|
|
|
- (concat def
|
|
|
- (if (string-match "ORG-LIST-END-MARKER\\'" def)
|
|
|
- "\n" " ")))
|
|
|
- (org-footnote-delete-definitions lbl)
|
|
|
- ;; Compute string to insert (FNOTE), and protect the outside
|
|
|
- ;; macro from further transformation. When footnote at point
|
|
|
- ;; is referring to a previously defined footnote, use
|
|
|
- ;; \footnotemark. Otherwise, use \footnote.
|
|
|
- (let ((fnote (if (member lbl org-export-latex-footmark-seen)
|
|
|
- (org-export-latex-protect-string
|
|
|
- (format "\\footnotemark[%s]" lbl))
|
|
|
- (push lbl org-export-latex-footmark-seen)
|
|
|
- (concat (org-export-latex-protect-string "\\footnote{")
|
|
|
- def
|
|
|
- (org-export-latex-protect-string "}"))))
|
|
|
- ;; Check if another footnote is immediately following.
|
|
|
- ;; If so, add a separator in-between.
|
|
|
- (sep (org-export-latex-protect-string
|
|
|
- (if (save-excursion (goto-char (1- (nth 2 ref)))
|
|
|
- (let ((next (org-footnote-get-next-reference)))
|
|
|
- (and next (= (nth 1 next) (nth 2 ref)))))
|
|
|
- org-export-latex-footnote-separator ""))))
|
|
|
- (when (org-on-heading-p)
|
|
|
- (setq fnote (concat (org-export-latex-protect-string"\\protect")
|
|
|
- fnote)))
|
|
|
- ;; Ensure a footnote at column 0 cannot end a list
|
|
|
- ;; containing it.
|
|
|
- (put-text-property 0 (length fnote) 'original-indentation 1000 fnote)
|
|
|
- ;; Replace footnote reference with FNOTE and, maybe, SEP.
|
|
|
- ;; `save-excursion' is required if there are two footnotes
|
|
|
- ;; in a row. In that case, point would be left at the
|
|
|
- ;; beginning of the second one, and
|
|
|
- ;; `org-footnote-get-next-reference' would then skip it.
|
|
|
- (goto-char beg)
|
|
|
- (delete-region beg (nth 2 ref))
|
|
|
- (save-excursion (insert fnote sep)))))))
|
|
|
-
|
|
|
- ;; Remove footnote section tag for LaTeX
|
|
|
- (goto-char (point-min))
|
|
|
- (while (re-search-forward
|
|
|
- (concat "^" footnote-section-tag-regexp) nil t)
|
|
|
- (org-if-unprotected
|
|
|
- (replace-match "")))
|
|
|
- ;; Remove any left-over footnote definition.
|
|
|
- (mapc (lambda (fn) (org-footnote-delete-definitions (car fn)))
|
|
|
- org-export-footnotes-data)
|
|
|
- (mapc (lambda (fn) (org-footnote-delete-definitions fn))
|
|
|
- org-export-latex-footmark-seen))
|
|
|
+ (replace-match ""))))
|
|
|
|
|
|
(defun org-export-latex-fix-inputenc ()
|
|
|
"Set the coding system in inputenc to what the buffer is."
|