The following mark scheme is meant to be interpreted via bash, as is done optionally in BitterSuite. It also contains directives that are intended to be expanded via nroff.
#!/bin/bash $( domath () { # Restrict to two trailing decimal points for the floating point value, # then chop off trailing zeroes, then chop off a trailing decimal point. # Note: because of truncation, do not accumulate domath results. echo "scale = 2; $1" | bc | sed -e 's/\(\.[1-9]*\)\(0*\)$/\1/g' | sed 's/\.$//g' } q1dr=4 q1tot=$( domath "$t1o + $q1dr" ) q2dr=5 q2tot=$( domath "$t2o + $q2dr" ) alltot=$( domath "$q1dr + $q2dr + $to" ) # The innermost echo allows preservation of space for evaluation later # by replacing them with hex codes. # This delayed evaluation is handled by the echo that is echoed by # 'eval echo' # There really must be a simpler way to do this... tempvar=$(eval echo "echo -e \"$(echo " .ti 5 This is a marking scheme that incorporates both nroff directives and shell interpretation, including the pre-assignment of variables that are used internally. This should help ensure, for example, that course staff doesn't make any arithmetic errors when creating assignment totals. .ad c ========================================= Total Mark Assigned: _______ / $alltot Marked By: ________ ========================================= .ad l .in 8 .ti -8 Q1: _____ / $q1tot .ti -4 Design recipe: $(printf "%11s" "_____ / $q1dr") .ti -4 Autotesting: $(printf "%13s" "$t1e / $t1o") .ti -8 Q2: _____ / $q2tot .ti -4 Design recipe: $(printf "%11s" "_____ / $q2dr") .ti -4 Autotesting: $(printf "%13s" "$t2e / $t2o") .ti 12 " | sed 's/ /\\x20/g')\"" | perl -ne 'chomp; print "$_\\n";' ) echo $tempvar )