#! /bin/gawk -f # Last edited on 2002-01-07 20:04:03 by stolfi BEGIN { abort = -1; usage = ( \ "reposition-marginal-notes \\\n" \ " < INFILE.org > OUTFILE.org" \ ); # Displaces any marginal notes that are embedded in a paragraph # forward to the end of that paragraph. last_was_para = 1; # TRUE if last line was a paragraph terminator. inside_marg_note = 0; # TRUE if we have seen "@unit G" but not its "#end" marg_notes = ""; # Suspended marginal notes, each line ends with "\n". } (abort >= 0) { exit abort; } /^[@]/ { if(inside_marg_note) { data_error(("@-line inside marg note")); } } (inside_marg_note) { marg_notes = ( marg_notes $0 "\n"); if ($0 ~ /^[#]end marginalnote */) inside_marg_note = 0; next; } ($0 ~ /^[@](chapter|part|end)/) { last_was_parag = 1; } (last_was_parag) { if (marg_notes != "") { printf "%s", marg_notes; if ($0 !~ /^[@](chapter|part|end)/) { print "@unit P +1 text"; } marg_notes = ""; # last_was_parag remains unchanged } } /^ *([#]|$)/ { print; next; # last_was_parag remains unchanged } /^[@]unit *[G] *[+]?[0-9]+ *marg/ { marg_notes = ( marg_notes $0 "\n"); inside_marg_note = 1; # last_was_parag remains unchanged next; } /^[@][=] *$/ { last_was_parag = 1; print; next; } /./ { print; last_was_parag = 0; next; } function arg_error(msg) { printf "%s\n", msg > "/dev/stderr"; printf "usage: %s\n", usage > "/dev/stderr"; abort = 1; exit 1 } function data_error(msg) { printf "line %d: %s\n", FNR, msg > "/dev/stderr"; abort = 1; exit 1 }