#! /bin/sh # footnotes - renumber footnotes in a text # Heiner Steven awk ' # renumrefs - renumber footnote references in "line", return result # # "createmap" controls whether new entries for the mapping table [] map # are created. function renumrefs(line, createmap, result) { result = "" # Process all footnote references while (match(line, /\[[0-9][0-9]*\]/) > 0) { oldnum = substr(line, RSTART+1, RLENGTH-2) + 0 if (!(oldnum in map) && createmap) { map[oldnum + 0] = ++lastnum } newnum = map[oldnum] # Replace old footnote with new one from "newnum" result = result substr(line, 1, RSTART) newnum "]" line = substr(line, RSTART + RLENGTH) } result = result line # Use the rest of line return result } # Switch between the two modes: mode "list" processes the # footnote list, otherwise a footnote reference is processed. $0 == "@footnote:" { mode = "list"; next } # Fast path: if there is no footnote reference there is nothing to do $0 !~ /\[[0-9][0-9]*\]/ { print; next } # There is at least one foot note mark! { if (mode != "list") { # Read text, create reference map table print renumrefs($0, 1) } else { # Save list entry, will be printed at the end of the script notetext[newnum + 0] = renumrefs($0, 0) } } # The complete text has been read. Write the complete footnote list # in the right ascending order. END { for (i = 1; i <= lastnum; i++) { print notetext[i] } } ' "$@"