help-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: how to renumber footnotes?


From: Andreas Röhler
Subject: Re: how to renumber footnotes?
Date: Sat, 18 Apr 2020 11:00:14 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.7.0


Am 17.04.20 um 19:03 schrieb Sharon Kimble:
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

Andreas Röhler <andreas.roehler@easy-emacs.de> writes:

On 17.04.20 05:58, Sharon Kimble wrote:
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512


Please, can someone help me sort out an org-mode footnote problem?

I have 2 org-mode documents called 'file-a' and 'file-b', and both have
got several hundred footnotes starting with 1. I'm adding file-b on to
the end of file-a, and trying to renumber the footnotes, so that even if
file-a has 354 footnotes, and file-b has 421 footnotes, the whole file
renumbers the footnotes and continues on from 354 to 355, 356, 357, etc
and onwards.

But how can I do this please? The org-mode footnote program can't do it,
so how do I do it please?

(The footnote numbers I've shown are purely arbitrary, some files that
I'm wanting to do this with have up to 700 footnotes in their combined
Make sure there is only one footnote-section at the end of file and all fn 
appear in correct order:

(defun ar-org-footnote-renumber-intern ()
   (let ((c 0))
     (while (re-search-forward org-footnote-re nil t)
       (backward-char 2)
       (when (looking-at "[0-9]+")
     (replace-match (number-to-string (cl-incf c)))))))

(defun ar-org-footnote-renumber ()
   "Renumber footnotes."
   (interactive "*")
   (save-restriction
     (widen)
     (goto-char (point-min))
     (when (re-search-forward "^* Footnotes" nil t)
       ;; first renumber fns in text section, afterwards the
       ;; fn-definitions
       (save-restriction
     (narrow-to-region (point-min) (line-beginning-position))
     (goto-char (point-min))
     (ar-org-footnote-renumber-intern)
     (widen)
     (when (re-search-forward "^* Footnotes" nil t)
       (narrow-to-region (line-beginning-position) (point-max))
       (goto-char (point-min))
       (ar-org-footnote-renumber-intern))))))

Thanks Andreas, but all my footnotes are inline. Perhaps I should've
said that earlier on, sorry!

Perhaps I could put them at the end but I'm too tired at the moment to
think about it, but plenty of time at the weekend, hooray!

Thanks
   Sharon.
- -- A taste of linux = http://www.sharons.org.uk
TGmeds = http://www.tgmeds.org.uk
DrugFacts = https://www.drugfacts.org.uk
Debian 10.2, fluxbox 1.3.7, emacs 27.0.90, org 9.3.6

This version allows re-numbering in reverse order, as some footnote-mode seem to require. Inlined fn should be supported.

Works only on active region.

(defun ar-org-footnote-renumber-intern (&optional reverse)
  (let* ((c 0)
     (nav-function (if reverse 're-search-backward 're-search-forward)))
    (if reverse
    (goto-char (point-max))
      (goto-char (point-min)))
    (while (funcall nav-function org-footnote-re nil t)
      (save-excursion
    (goto-char (match-beginning 0))
    (search-forward ":")
    (when (looking-at "[0-9]+")
      (replace-match (number-to-string (cl-incf c))))))))

(defun ar-renumber-footnote-in-region (arg &optional beg end)
  "Renumber footnotes in active region.

ARG: With \\[universal-argument] renumber in reverse order.
Optional BEG: specify start position ignoring region.
Optional END: specify end position ignoring region.
 "
  (interactive "*P")
  (save-excursion
    (let ((beg (cond (beg)
             ((use-region-p)
              (region-beginning))))
          (end (cond (end)
             ((use-region-p)
              (copy-marker (region-end)))))
      (reverse (eq 4 (prefix-numeric-value arg))))
      (if
      (and beg end)
      (progn
        (save-restriction
          (narrow-to-region beg end)
          (ar-org-footnote-renumber-intern reverse)))
    (error "Need an active region to work on!")))))




reply via email to

[Prev in Thread] Current Thread [Next in Thread]