diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /web/noweb/src/awk/totex |
Initial commit
Diffstat (limited to 'web/noweb/src/awk/totex')
-rwxr-xr-x | web/noweb/src/awk/totex | 175 |
1 files changed, 175 insertions, 0 deletions
diff --git a/web/noweb/src/awk/totex b/web/noweb/src/awk/totex new file mode 100755 index 0000000000..ac74b82695 --- /dev/null +++ b/web/noweb/src/awk/totex @@ -0,0 +1,175 @@ +#!/bin/sh +LIB=|LIBDIR| +# Copyright 1991-2018 by Norman Ramsey. All rights reserved. +# See file COPYRIGHT for more information. +# Don't try to understand this file! Look at lib/totex.nw in the noweb source! +delay=0 noindex=0 +for i do + case $i in + -delay) delay=1 ;; + -noindex) noindex=1 ;; + *) echo "This can't happen -- $i passed to totex" 1>&2 ; exit 1 ;; + esac +done +nawk 'BEGIN { code=0 ; quoting=0 ; text=1; defns[0] = 0 + ulist[0] = 0 } + /^@begin code/ { code=1 ; printf "\\nwbegincode{%s}", substr($0, 13) } + /^@end code/ { code=0 ; printf "\\nwendcode{}"; lastdefnlabel = "" } + /^@begin docs 0$/ { if (delay) next } + /^@end docs 0$/ { if (delay) { + printf "\\nwfilename{%s}", filename; delay=0; next + } } + /^@begin docs/ { text=0 ; printf "\\nwbegindocs{%s}", substr($0, 13) } + /^@end docs/ { printf "\\nwenddocs{}" } + /^@text / { line = substr($0, 7) ; text += length - 6 + if (code) printf "%s", escape_brace_bslash(line) + else if (quoting) printf "%s", TeXliteral(line) + else printf "%s", line + } + /^@nl$/ { if (!code) {if (text==0) printf "\\nwdocspar" + text=1} + if (quoting) printf "\\nwnewline" + printf "\n" + } + /^@defn / { name = substr($0, 7); if (lastxreflabel != "") { + printf "\\sublabel{%s}", lastxreflabel + printf "\\nwmargintag{%s}", label2tag(lastxreflabel) + } + printf "\\moddef{%s%s}\\%sendmoddef", convquotes(name), (lastxrefref != "" ? ("~" label2tag(lastxrefref)) : ""), defns[name] + lastdefnlabel = lastxreflabel + lastxreflabel = lastxrefref = "" + defns[name] = "plus" } + /^@use / { printf "\\LA{}%s%s\\RA{}", + convquotes(substr($0, 6)), (lastxrefref != "" ? ("~" label2tag(lastxrefref)) : "") + } + /^@quote$/ { quoting = 1 ; printf "{\\tt{}" } + /^@endquote$/ { quoting = 0 ; printf "}" } + /^@file / { filename = substr($0, 7); lastxreflabel = lastxrefref = "" + if (!delay) printf "\\nwfilename{%s}", filename + } + /^@literal / { printf "%s", substr($0, 10) } + /^@header latex / { printf "\\documentclass{article}\\usepackage{noweb}\\pagestyle{noweb}\\noweboptions{%s}%s", + substr($0, 15), "\\begin{document}" } + /^@header tex / { printf "\\input nwmac " } + /^@trailer latex$/ { print "\\end{document}" } + /^@trailer tex$/ { print "\\bye" } + /^@xref label / { lastxreflabel = substr($0, 13) } + /^@xref ref / { lastxrefref = substr($0, 11) } + /^@xref begindefs$/ { printf "\\nwalsodefined{" } + /^@xref defitem / { printf "\\\\{%s}", substr($0, 15) } + /^@xref enddefs$/ { printf "}" } + /^@xref beginuses$/ { printf "\\nwused{" } + /^@xref useitem / { printf "\\\\{%s}", substr($0, 15) } + /^@xref enduses$/ { printf "}" } + /^@xref notused / { printf "\\nwnotused{%s}", TeXliteral(substr($0, 15)) } + /^@xref nextdef / { } + /^@xref prevdef / { } + /^@xref beginchunks$/ { } + /^@xref chunkbegin / { label = $3; name = substr($0, 19 + length(label)) + printf "\\nwixlogsorted{c}{{%s}{%s}{", + convquotes(name), label + } + /^@xref chunkuse / { printf "\\nwixu{%s}", substr($0, 16) } + /^@xref chunkdefn / { printf "\\nwixd{%s}", substr($0, 17) } + /^@xref chunkend$/ { print "}}%" } + /^@xref endchunks$/ { } + /^@index nl$/ { print (code ? "\\eatline" : "%") } + /^@index defn / { + if (!noindex) { arg = substr($0, 13); if (lastxreflabel != "") printf "\\nosublabel{%s}", lastxreflabel + if (lastxrefref != "") + printf "\\nwindexdefn{%s}{%s}{%s}", TeXliteral(arg), indexlabel(arg), lastxrefref + lastxreflabel = lastxrefref = "" } } + /^@index localdefn / { + if (!noindex) { arg = substr($0, 18); if (lastxreflabel != "") printf "\\nosublabel{%s}", lastxreflabel + if (lastxrefref != "") + printf "\\nwindexdefn{%s}{%s}{%s}", TeXliteral(arg), indexlabel(arg), lastxrefref + lastxreflabel = lastxrefref = "" } } + /^@index use / { + if (!noindex) { arg = substr($0, 12); if (!code) { + if (lastxreflabel != "") printf "\\protect\\nosublabel{%s}", lastxreflabel + if (lastxrefref != "") + printf "\\protect\\nwindexuse{%s}{%s}{%s}", + TeXliteral(arg), indexlabel(arg), lastxrefref + } + lastxreflabel = lastxrefref = "" } } + /^@index begindefs$/ { if (!noindex) { printf "\\nwidentdefs{" } } + /^@index isused / { if (!noindex) { } } # handled by latex + /^@index defitem / { if (!noindex) { i = substr($0,16); printf "\\\\{{%s}{%s}}", TeXliteral(i), indexlabel(i) } } + /^@index enddefs$/ { if (!noindex) { printf "}" } } + /^@index beginuses$/ { if (!noindex) { printf "\\nwidentuses{"; ucount = 0 } } + /^@index isdefined / { if (!noindex) { } } # latex finds the definitions + /^@index useitem / { if (!noindex) { i = substr($0, 16); printf "\\\\{{%s}{%s}}", TeXliteral(i), indexlabel(i) + ulist[ucount++] = i + } } + /^@index enduses$/ { if (!noindex) { printf "}"; if (lastdefnlabel != "") { + for (j = 0; j < ucount; j++) + printf "\\nwindexuse{%s}{%s}{%s}", + TeXliteral(ulist[j]), indexlabel(ulist[j]), lastdefnlabel + } } } + /^@index beginindex$/ { if (!noindex) { } } + /^@index entrybegin / { if (!noindex) { label = $3; name = substr($0, 20 + length(label)) + printf "\\nwixlogsorted{i}{{%s}{%s}}%%\n", + TeXliteral(name), indexlabel(name) + } } + /^@index entryuse / { if (!noindex) { } } # handled by latex + /^@index entrydefn / { if (!noindex) { } } # handled by latex + /^@index entryend$/ { if (!noindex) { } } + /^@index endindex$/ { if (!noindex) { } } + + END { printf "\n" } + function label2tag(label) { + return "{\\nwtagstyle{}\\subpageref{" label "}}" + } + function escape_brace_bslash(line) { + gsub(/[\\{}]/, "\n&", line) + gsub(/\n/, "\\", line) + return line + } + function convquotes(s, r, i) { + r = "" + while (i = index(s, "[[")) { + r = r substr(s, 1, i-1) "\\code{}" + s = substr(s, i+2) + if (i = match(s, "\\]\\]+")) { + r = r TeXliteral(substr(s, 1, i-1+RLENGTH-2)) "\\edoc{}" + s = substr(s, i+RLENGTH) + } else { + r = r s "\\edoc{}" + s = "" + } + } + return r s + } + function indexlabel(ident, l) { + l = ident + gsub(/:/, ":col", l) # must be first (colon) + gsub(/ /, ":sp", l) # space + gsub(/#/, ":has", l) # hash + gsub(/\$/, ":do", l) # dollar + gsub(/%/, ":pe", l) # percent + gsub(/&/, ":am", l) # ampersand + gsub(/,/, ":com", l) # commad + gsub(/\\/, ":bs", l) # backslash + gsub(/\^/, ":hat", l) # hat + gsub(/_/, ":un", l) # underscore + gsub(/{/, ":lb", l) # left brace + gsub(/}/, ":rb", l) # right brace + gsub(/~/, ":ti", l) # tilde + return l + } + function TeXliteral(arg) { + gsub(/\\/, "<\\char92>", arg) + gsub(/}/, "<\\char125}", arg) + gsub(/{/, "{\\char123}", arg) + gsub(/<\\char/, "{\\char", arg) + gsub(/{\\char92>/, "{\\char92}", arg) + gsub(/\$/, "{\\char36}", arg) + gsub(/&/, "{\\char38}", arg) + gsub(/#/, "{\\char35}", arg) + gsub(/\^/, "{\\char94}", arg) + gsub(/_/, "{\\char95}", arg) + gsub(/%/, "{\\char37}", arg) + gsub(/~/, "{\\char126}", arg) + gsub(/ /, "\\ ", arg) + return arg + }' delay=$delay noindex=$noindex |