--- loncom/interface/lonprintout.pm 2003/10/01 13:49:41 1.245 +++ loncom/interface/lonprintout.pm 2005/02/22 23:32:48 1.365 @@ -1,7 +1,7 @@ -# The LearningOnline Network +# The LearningOnline Network # Printout # -# $Id: lonprintout.pm,v 1.245 2003/10/01 13:49:41 sakharuk Exp $ +# $Id: lonprintout.pm,v 1.365 2005/02/22 23:32:48 foxr Exp $ # # Copyright Michigan State University Board of Trustees # @@ -25,17 +25,6 @@ # # http://www.lon-capa.org/ # -# (Internal Server Error Handler -# -# (Login Screen -# 5/21/99,5/22,5/25,5/26,5/31,6/2,6/10,7/12,7/14, -# 1/14/00,5/29,5/30,6/1,6/29,7/1,11/9 Gerd Kortemeyer) -# -# 3/1/1 Gerd Kortemeyer) -# -# 3/1 Gerd Kortemeyer -# -# 9/17 Alex Sakharuk # package Apache::lonprintout; @@ -51,12 +40,65 @@ use Apache::File(); use Apache::lonnavmaps; use Apache::lonratedt; use POSIX qw(strftime); -use GDBM_File; +use Apache::lonlocal; + +# Compare two students by name. The students are in the form +# returned by the helper: +# user:domain:section:last, first:status +# This is a helper function for the perl sort built-in therefore: +# Implicit Inputs: +# $a - The first element to compare (global) +# $b - The second element to compare (global) +# Returns: +# -1 - $a < $b +# 0 - $a == $b +# +1 - $a > $b +# Note that the initial comparison is done on the last names with the +# first names only used to break the tie. +# +# +sub compare_names { + # First split the names up into the primary fields. + + my ($u1, $d1, $s1, $n1, $stat1) = split(/:/, $a); + my ($u2, $d2, $s2, $n2, $stat2) = split(/:/, $b); + + # Now split the last name and first name of each n: + # + my ($l1,$f1) = split(/,/, $n1); + my ($l2,$f2) = split(/,/, $n2); -my %hash; -my $LaTeXwidth = 0; + # We don't bother to remove the leading/trailing whitespace from the + # firstname, unless the last names compare identical. + if($l1 lt $l2) { + return -1; + } + if($l1 gt $l2) { + return 1; + } + + # Break the tie on the first name, but there are leading (possibly trailing + # whitespaces to get rid of first + # + $f1 =~ s/^\s+//; # Remove leading... + $f1 =~ s/\s+$//; # Trailing spaces from first 1... + + $f2 =~ s/^\s+//; + $f2 =~ s/\s+$//; # And the same for first 2... + + if($f1 lt $f2) { + return -1; + } + if($f1 gt $f2) { + return 1; + } + + # Must be the same name. + + return 0; +} sub latex_header_footer_remove { my $text = shift; @@ -99,8 +141,8 @@ sub character_chart { $result =~ s/&\#0?58;/:/g; $result =~ s/&\#0?59;/;/g; $result =~ s/&(\#0?60|lt|\#139);/\$<\$/g; - $result =~ s/&\#0?61;/\$=\$/g; - $result =~ s/&(\#0?62|gt|\#155);/\$>\$/g; + $result =~ s/&\#0?61;/\\ensuremath\{=\}/g; + $result =~ s/&(\#0?62|gt|\#155);/\\ensuremath\{>\}/g; $result =~ s/&\#0?63;/\?/g; $result =~ s/&\#0?65;/A/g; $result =~ s/&\#0?66;/B/g; @@ -129,9 +171,9 @@ sub character_chart { $result =~ s/&\#0?89;/Y/g; $result =~ s/&\#0?90;/Z/g; $result =~ s/&\#0?91;/[/g; - $result =~ s/&\#0?92;/\$\\setminus\$/g; + $result =~ s/&\#0?92;/\\ensuremath\{\\setminus\}/g; $result =~ s/&\#0?93;/]/g; - $result =~ s/&\#(0?94|136);/\$\\wedge\$/g; + $result =~ s/&\#(0?94|136);/\\ensuremath\{\\wedge\}/g; $result =~ s/&\#(0?95|138|154);/\\underline{\\makebox[2mm]{\\strut}}/g; $result =~ s/&\#(0?96|145);/\`/g; $result =~ s/&\#0?97;/a/g; @@ -166,21 +208,21 @@ sub character_chart { $result =~ s/&\#126;/\~/g; $result =~ s/&\#131;/\\textflorin /g; $result =~ s/&\#132;/\"/g; - $result =~ s/&\#133;/\$\\ldots\$/g; - $result =~ s/&\#134;/\$\\dagger\$/g; - $result =~ s/&\#135;/\$\\ddagger\$/g; + $result =~ s/&\#133;/\\ensuremath\{\\ldots\}/g; + $result =~ s/&\#134;/\\ensuremath\{\\dagger\}/g; + $result =~ s/&\#135;/\\ensuremath\{\\ddagger\}/g; $result =~ s/&\#137;/\\textperthousand /g; $result =~ s/&\#140;/{\\OE}/g; $result =~ s/&\#147;/\`\`/g; $result =~ s/&\#148;/\'\'/g; - $result =~ s/&\#149;/\$\\bullet\$/g; + $result =~ s/&\#149;/\\ensuremath\{\\bullet\}/g; $result =~ s/&\#150;/--/g; $result =~ s/&\#151;/---/g; - $result =~ s/&\#152;/\$\\sim\$/g; + $result =~ s/&\#152;/\\ensuremath\{\\sim\}/g; $result =~ s/&\#153;/\\texttrademark /g; $result =~ s/&\#156;/\\oe/g; $result =~ s/&\#159;/\\\"Y/g; - $result =~ s/&(\#160|nbsp);//g; + $result =~ s/&(\#160|nbsp);/~/g; $result =~ s/&(\#161|iexcl);/!\`/g; $result =~ s/&(\#162|cent);/\\textcent /g; $result =~ s/&(\#163|pound);/\\pounds /g; @@ -191,20 +233,20 @@ sub character_chart { $result =~ s/&(\#168|uml);/\\texthighdieresis /g; $result =~ s/&(\#169|copy);/\\copyright /g; $result =~ s/&(\#170|ordf);/\\textordfeminine /g; - $result =~ s/&(\#172|not);/\$\\neg\$/g; + $result =~ s/&(\#172|not);/\\ensuremath\{\\neg\}/g; $result =~ s/&(\#173|shy);/ - /g; $result =~ s/&(\#174|reg);/\\textregistered /g; - $result =~ s/&(\#175|macr);/\$^{-}\$/g; - $result =~ s/&(\#176|deg);/\$^{\\circ}\$/g; - $result =~ s/&(\#177|plusmn);/\$\\pm\$/g; - $result =~ s/&(\#178|sup2);/\$^2\$/g; - $result =~ s/&(\#179|sup3);/\$^3\$/g; + $result =~ s/&(\#175|macr);/\\ensuremath\{^{-}\}/g; + $result =~ s/&(\#176|deg);/\\ensuremath\{^{\\circ}\}/g; + $result =~ s/&(\#177|plusmn);/\\ensuremath\{\\pm\}/g; + $result =~ s/&(\#178|sup2);/\\ensuremath\{^2\}/g; + $result =~ s/&(\#179|sup3);/\\ensuremath\{^3\}/g; $result =~ s/&(\#180|acute);/\\textacute /g; - $result =~ s/&(\#181|micro);/\$\\mu\$/g; + $result =~ s/&(\#181|micro);/\\ensuremath\{\\mu\}/g; $result =~ s/&(\#182|para);/\\P/g; - $result =~ s/&(\#183|middot);/\$\\cdot\$/g; + $result =~ s/&(\#183|middot);/\\ensuremath\{\\cdot\}/g; $result =~ s/&(\#184|cedil);/\\c{\\strut}/g; - $result =~ s/&(\#185|sup1);/\$^1\$/g; + $result =~ s/&(\#185|sup1);/\\ensuremath\{^1\}/g; $result =~ s/&(\#186|ordm);/\\textordmasculine /g; $result =~ s/&(\#188|frac14);/\\textonequarter /g; $result =~ s/&(\#189|frac12);/\\textonehalf /g; @@ -232,14 +274,14 @@ sub character_chart { $result =~ s/&(\#212|Ocirc);/\\^{O}/g; $result =~ s/&(\#213|Otilde);/\\~{O}/g; $result =~ s/&(\#214|Ouml);/\\\"{O}/g; - $result =~ s/&(\#215|times);/\$\\times\$/g; + $result =~ s/&(\#215|times);/\\ensuremath\{\\times\}/g; $result =~ s/&(\#216|Oslash);/{\\O}/g; $result =~ s/&(\#217|Ugrave);/\\\`{U}/g; $result =~ s/&(\#218|Uacute);/\\\'{U}/g; $result =~ s/&(\#219|Ucirc);/\\^{U}/g; $result =~ s/&(\#220|Uuml);/\\\"{U}/g; $result =~ s/&(\#221|Yacute);/\\\'{Y}/g; - $result =~ s/&(\#223|szlig);/\\ss/g; + $result =~ s/&(\#223|szlig);/{\\ss}/g; $result =~ s/&(\#224|agrave);/\\\`{a}/g; $result =~ s/&(\#225|aacute);/\\\'{a}/g; $result =~ s/&(\#226|acirc);/\\^{a}/g; @@ -256,14 +298,14 @@ sub character_chart { $result =~ s/&(\#237|iacute);/\\\'{i}/g; $result =~ s/&(\#238|icirc);/\\^{i}/g; $result =~ s/&(\#239|iuml);/\\\"{i}/g; - $result =~ s/&(\#240|eth);/\$\\partial\$/g; + $result =~ s/&(\#240|eth);/\\ensuremath\{\\partial\}/g; $result =~ s/&(\#241|ntilde);/\\~{n}/g; $result =~ s/&(\#242|ograve);/\\\`{o}/g; $result =~ s/&(\#243|oacute);/\\\'{o}/g; $result =~ s/&(\#244|ocirc);/\\^{o}/g; $result =~ s/&(\#245|otilde);/\\~{o}/g; $result =~ s/&(\#246|ouml);/\\\"{o}/g; - $result =~ s/&(\#247|divide);/\$\\div\$/g; + $result =~ s/&(\#247|divide);/\\ensuremath\{\\div\}/g; $result =~ s/&(\#248|oslash);/{\\o}/g; $result =~ s/&(\#249|ugrave);/\\\`{u}/g; $result =~ s/&(\#250|uacute);/\\\'{u}/g; @@ -271,195 +313,222 @@ sub character_chart { $result =~ s/&(\#252|uuml);/\\\"{u}/g; $result =~ s/&(\#253|yacute);/\\\'{y}/g; $result =~ s/&(\#255|yuml);/\\\"{y}/g; - $result =~ s/&\#952;/\$\\theta\$/g; + $result =~ s/&\#952;/\\ensuremath\{\\theta\}/g; #Greek Alphabet - $result =~ s/&(alpha|\#945);/\$\\alpha \$/g; - $result =~ s/&(beta|\#946);/\$\\beta \$/g; - $result =~ s/&(gamma|\#947);/\$\\gamma \$/g; - $result =~ s/&(delta|\#948);/\$\\delta \$/g; - $result =~ s/&(epsilon|\#949);/\$\\epsilon \$/g; - $result =~ s/&(zeta|\#950);/\$\\zeta \$/g; - $result =~ s/&(eta|\#951);/\$\\eta \$/g; - $result =~ s/&(theta|\#952);/\$\\theta \$/g; - $result =~ s/&(iota|\#953);/\$\\iota \$/g; - $result =~ s/&(kappa|\#954);/\$\\kappa \$/g; - $result =~ s/&(lambda|\#955);/\$\\lambda \$/g; - $result =~ s/&(mu|\#956);/\$\\mu \$/g; - $result =~ s/&(nu|\#957);/\$\\nu \$/g; - $result =~ s/&(xi|\#958);/\$\\xi \$/g; + $result =~ s/&(alpha|\#945);/\\ensuremath\{\\alpha\}/g; + $result =~ s/&(beta|\#946);/\\ensuremath\{\\beta\}/g; + $result =~ s/&(gamma|\#947);/\\ensuremath\{\\gamma\}/g; + $result =~ s/&(delta|\#948);/\\ensuremath\{\\delta\}/g; + $result =~ s/&(epsilon|\#949);/\\ensuremath\{\\epsilon\}/g; + $result =~ s/&(zeta|\#950);/\\ensuremath\{\\zeta\}/g; + $result =~ s/&(eta|\#951);/\\ensuremath\{\\eta\}/g; + $result =~ s/&(theta|\#952);/\\ensuremath\{\\theta\}/g; + $result =~ s/&(iota|\#953);/\\ensuremath\{\\iota\}/g; + $result =~ s/&(kappa|\#954);/\\ensuremath\{\\kappa\}/g; + $result =~ s/&(lambda|\#955);/\\ensuremath\{\\lambda\}/g; + $result =~ s/&(mu|\#956);/\\ensuremath\{\\mu\}/g; + $result =~ s/&(nu|\#957);/\\ensuremath\{\\nu\}/g; + $result =~ s/&(xi|\#958);/\\ensuremath\{\\xi\}/g; $result =~ s/&(omicron|\#959);/o/g; - $result =~ s/&(pi|\#960);/\$\\pi \$/g; - $result =~ s/&(rho|\#961);/\$\\rho \$/g; - $result =~ s/&(sigma|\#963);/\$\\sigma \$/g; - $result =~ s/&(tau|\#964);/\$\\tau \$/g; - $result =~ s/&(upsilon|\#965);/\$\\upsilon \$/g; - $result =~ s/&(phi|\#966);/\$\\phi \$/g; - $result =~ s/&(chi|\#967);/\$\\chi \$/g; - $result =~ s/&(psi|\#968);/\$\\psi \$/g; - $result =~ s/&(omega|\#969);/\$\\omega \$/g; - $result =~ s/&(thetasym|\#977);/\$\\vartheta \$/g; - $result =~ s/&(piv|\#982);/\$\\varpi \$/g; + $result =~ s/&(pi|\#960);/\\ensuremath\{\\pi\}/g; + $result =~ s/&(rho|\#961);/\\ensuremath\{\\rho\}/g; + $result =~ s/&(sigma|\#963);/\\ensuremath\{\\sigma\}/g; + $result =~ s/&(tau|\#964);/\\ensuremath\{\\tau\}/g; + $result =~ s/&(upsilon|\#965);/\\ensuremath\{\\upsilon\}/g; + $result =~ s/&(phi|\#966);/\\ensuremath\{\\phi\}/g; + $result =~ s/&(chi|\#967);/\\ensuremath\{\\chi\}/g; + $result =~ s/&(psi|\#968);/\\ensuremath\{\\psi\}/g; + $result =~ s/&(omega|\#969);/\\ensuremath\{\\omega\}/g; + $result =~ s/&(thetasym|\#977);/\\ensuremath\{\\vartheta\}/g; + $result =~ s/&(piv|\#982);/\\ensuremath\{\\varpi\}/g; $result =~ s/&(Alpha|\#913);/A/g; $result =~ s/&(Beta|\#914);/B/g; - $result =~ s/&(Gamma|\#915);/\$\\Gamma \$/g; - $result =~ s/&(Delta|\#916);/\$\\Delta \$/g; + $result =~ s/&(Gamma|\#915);/\\ensuremath\{\\Gamma\}/g; + $result =~ s/&(Delta|\#916);/\\ensuremath\{\\Delta\}/g; $result =~ s/&(Epsilon|\#917);/E/g; $result =~ s/&(Zeta|\#918);/Z/g; $result =~ s/&(Eta|\#919);/H/g; - $result =~ s/&(Theta|\#920);/\$\\Theta \$/g; + $result =~ s/&(Theta|\#920);/\\ensuremath\{\\Theta\}/g; $result =~ s/&(Iota|\#921);/I/g; $result =~ s/&(Kappa|\#922);/K/g; - $result =~ s/&(Lambda|\#923);/\$\\Lambda \$/g; + $result =~ s/&(Lambda|\#923);/\\ensuremath\{\\Lambda\}/g; $result =~ s/&(Mu|\#924);/M/g; $result =~ s/&(Nu|\#925);/N/g; - $result =~ s/&(Xi|\#926);/\$\\Xi \$/g; + $result =~ s/&(Xi|\#926);/\\ensuremath\{\\Xi\}/g; $result =~ s/&(Omicron|\#927);/O/g; - $result =~ s/&(Pi|\#928);/\$\\Pi \$/g; + $result =~ s/&(Pi|\#928);/\\ensuremath\{\\Pi\}/g; $result =~ s/&(Rho|\#929);/P/g; - $result =~ s/&(Sigma|\#931);/\$\\Sigma \$/g; + $result =~ s/&(Sigma|\#931);/\\ensuremath\{\\Sigma\}/g; $result =~ s/&(Tau|\#932);/T/g; - $result =~ s/&(Upsilon|\#933);/\$\\Upsilon \$/g; - $result =~ s/&(Phi|\#934);/\$\\Phi \$/g; + $result =~ s/&(Upsilon|\#933);/\\ensuremath\{\\Upsilon\}/g; + $result =~ s/&(Phi|\#934);/\\ensuremath\{\\Phi\}/g; $result =~ s/&(Chi|\#935);/X/g; - $result =~ s/&(Psi|\#936);/\$\\Psi \$/g; - $result =~ s/&(Omega|\#937);/\$\\Omega \$/g; + $result =~ s/&(Psi|\#936);/\\ensuremath\{\\Psi\}/g; + $result =~ s/&(Omega|\#937);/\\ensuremath\{\\Omega\}/g; #Arrows (extended HTML 4.01) - $result =~ s/&(larr|\#8592);/\$\\leftarrow \$/g; - $result =~ s/&(uarr|\#8593);/\$\\uparrow \$/g; - $result =~ s/&(rarr|\#8594);/\$\\rightarrow \$/g; - $result =~ s/&(darr|\#8595);/\$\\downarrow \$/g; - $result =~ s/&(harr|\#8596);/\$\\leftrightarrow \$/g; - $result =~ s/&(lArr|\#8656);/\$\\Leftarrow \$/g; - $result =~ s/&(uArr|\#8657);/\$\\Uparrow \$/g; - $result =~ s/&(rArr|\#8658);/\$\\Rightarrow \$/g; - $result =~ s/&(dArr|\#8659);/\$\\Downarrow \$/g; - $result =~ s/&(hArr|\#8660);/\$\\Leftrightarrow \$/g; + $result =~ s/&(larr|\#8592);/\\ensuremath\{\\leftarrow\}/g; + $result =~ s/&(uarr|\#8593);/\\ensuremath\{\\uparrow\}/g; + $result =~ s/&(rarr|\#8594);/\\ensuremath\{\\rightarrow\}/g; + $result =~ s/&(darr|\#8595);/\\ensuremath\{\\downarrow\}/g; + $result =~ s/&(harr|\#8596);/\\ensuremath\{\\leftrightarrow\}/g; + $result =~ s/&(lArr|\#8656);/\\ensuremath\{\\Leftarrow\}/g; + $result =~ s/&(uArr|\#8657);/\\ensuremath\{\\Uparrow\}/g; + $result =~ s/&(rArr|\#8658);/\\ensuremath\{\\Rightarrow\}/g; + $result =~ s/&(dArr|\#8659);/\\ensuremath\{\\Downarrow\}/g; + $result =~ s/&(hArr|\#8660);/\\ensuremath\{\\Leftrightarrow\}/g; #Mathematical Operators (extended HTML 4.01) - $result =~ s/&(forall|\#8704);/\$\\forall \$/g; - $result =~ s/&(part|\#8706);/\$\\partial \$/g; - $result =~ s/&(exist|\#8707);/\$\\exists \$/g; - $result =~ s/&(empty|\#8709);/\$\\emptyset \$/g; - $result =~ s/&(nabla|\#8711);/\$\\nabla \$/g; - $result =~ s/&(isin|\#8712);/\$\\in \$/g; - $result =~ s/&(notin|\#8713);/\$\\notin \$/g; - $result =~ s/&(ni|\#8715);/\$\\ni \$/g; - $result =~ s/&(prod|\#8719);/\$\\prod \$/g; - $result =~ s/&(sum|\#8721);/\$\\sum \$/g; - $result =~ s/&(minus|\#8722);/\$-\$/g; - $result =~ s/&(lowast|\#8727);/\$*\$/g; - $result =~ s/&(radic|\#8730);/\$\\surd \$/g; - $result =~ s/&(prop|\#8733);/\$\\propto \$/g; - $result =~ s/&(infin|\#8734);/\$\\infty \$/g; - $result =~ s/&(ang|\#8736);/\$\\angle \$/g; - $result =~ s/&(and|\#8743);/\$\\wedge \$/g; - $result =~ s/&(or|\#8744);/\$\\vee \$/g; - $result =~ s/&(cap|\#8745);/\$\\cap \$/g; - $result =~ s/&(cup|\#8746);/\$\\cup \$/g; - $result =~ s/&(int|\#8747);/\$\\int \$/g; - $result =~ s/&(sim|\#8764);/\$\\sim \$/g; - $result =~ s/&(cong|\#8773);/\$\\cong \$/g; - $result =~ s/&(asymp|\#8776);/\$\\approx \$/g; - $result =~ s/&(ne|\#8800);/\$\\not= \$/g; - $result =~ s/&(equiv|\#8801);/\$\\equiv \$/g; - $result =~ s/&(le|\#8804);/\$\\leq \$/g; - $result =~ s/&(ge|\#8805);/\$\\geq \$/g; - $result =~ s/&(sub|\#8834);/\$\\subset \$/g; - $result =~ s/&(sup|\#8835);/\$\\supset \$/g; - $result =~ s/&(nsub|\#8836);/\$\\not\\subset \$/g; - $result =~ s/&(sube|\#8838);/\$\\subseteq \$/g; - $result =~ s/&(supe|\#8839);/\$\\supseteq \$/g; - $result =~ s/&(oplus|\#8853);/\$\\oplus \$/g; - $result =~ s/&(otimes|\#8855);/\$\\otimes \$/g; - $result =~ s/&(perp|\#8869);/\$\\perp \$/g; - $result =~ s/&(sdot|\#8901);/\$\\cdot \$/g; + $result =~ s/&(forall|\#8704);/\\ensuremath\{\\forall\}/g; + $result =~ s/&(part|\#8706);/\\ensuremath\{\\partial\}/g; + $result =~ s/&(exist|\#8707);/\\ensuremath\{\\exists\}/g; + $result =~ s/&(empty|\#8709);/\\ensuremath\{\\emptyset\}/g; + $result =~ s/&(nabla|\#8711);/\\ensuremath\{\\nabla\}/g; + $result =~ s/&(isin|\#8712);/\\ensuremath\{\\in\}/g; + $result =~ s/&(notin|\#8713);/\\ensuremath\{\\notin\}/g; + $result =~ s/&(ni|\#8715);/\\ensuremath\{\\ni\}/g; + $result =~ s/&(prod|\#8719);/\\ensuremath\{\\prod\}/g; + $result =~ s/&(sum|\#8721);/\\ensuremath\{\\sum\}/g; + $result =~ s/&(minus|\#8722);/\\ensuremath\{-\}/g; + $result =~ s/&(lowast|\#8727);/\\ensuremath\{*\}/g; + $result =~ s/&(radic|\#8730);/\\ensuremath\{\\surd\}/g; + $result =~ s/&(prop|\#8733);/\\ensuremath\{\\propto\}/g; + $result =~ s/&(infin|\#8734);/\\ensuremath\{\\infty\}/g; + $result =~ s/&(ang|\#8736);/\\ensuremath\{\\angle\}/g; + $result =~ s/&(and|\#8743);/\\ensuremath\{\\wedge\}/g; + $result =~ s/&(or|\#8744);/\\ensuremath\{\\vee\}/g; + $result =~ s/&(cap|\#8745);/\\ensuremath\{\\cap\}/g; + $result =~ s/&(cup|\#8746);/\\ensuremath\{\\cup\}/g; + $result =~ s/&(int|\#8747);/\\ensuremath\{\\int\}/g; + $result =~ s/&(sim|\#8764);/\\ensuremath\{\\sim\}/g; + $result =~ s/&(cong|\#8773);/\\ensuremath\{\\cong\}/g; + $result =~ s/&(asymp|\#8776);/\\ensuremath\{\\approx\}/g; + $result =~ s/&(ne|\#8800);/\\ensuremath\{\\not=\}/g; + $result =~ s/&(equiv|\#8801);/\\ensuremath\{\\equiv\}/g; + $result =~ s/&(le|\#8804);/\\ensuremath\{\\leq\}/g; + $result =~ s/&(ge|\#8805);/\\ensuremath\{\\geq\}/g; + $result =~ s/&(sub|\#8834);/\\ensuremath\{\\subset\}/g; + $result =~ s/&(sup|\#8835);/\\ensuremath\{\\supset\}/g; + $result =~ s/&(nsub|\#8836);/\\ensuremath\{\\not\\subset\}/g; + $result =~ s/&(sube|\#8838);/\\ensuremath\{\\subseteq\}/g; + $result =~ s/&(supe|\#8839);/\\ensuremath\{\\supseteq\}/g; + $result =~ s/&(oplus|\#8853);/\\ensuremath\{\\oplus\}/g; + $result =~ s/&(otimes|\#8855);/\\ensuremath\{\\otimes\}/g; + $result =~ s/&(perp|\#8869);/\\ensuremath\{\\perp\}/g; + $result =~ s/&(sdot|\#8901);/\\ensuremath\{\\cdot\}/g; #Geometric Shapes (extended HTML 4.01) - $result =~ s/&(loz|\#9674);/\$\\Diamond \$/g; + $result =~ s/&(loz|\#9674);/\\ensuremath\{\\Diamond\}/g; #Miscellaneous Symbols (extended HTML 4.01) - $result =~ s/&(spades|\#9824);/\$\\spadesuit \$/g; - $result =~ s/&(clubs|\#9827);/\$\\clubsuit \$/g; - $result =~ s/&(hearts|\#9829);/\$\\heartsuit \$/g; - $result =~ s/&(diams|\#9830);/\$\\diamondsuit \$/g; + $result =~ s/&(spades|\#9824);/\\ensuremath\{\\spadesuit\}/g; + $result =~ s/&(clubs|\#9827);/\\ensuremath\{\\clubsuit\}/g; + $result =~ s/&(hearts|\#9829);/\\ensuremath\{\\heartsuit\}/g; + $result =~ s/&(diams|\#9830);/\\ensuremath\{\\diamondsuit\}/g; return $result; } + #width, height, oddsidemargin, evensidemargin, topmargin +my %page_formats= + ('letter' => { + 'book' => { + '1' => [ '7.1 in','9.8 in', '-0.57 in','-0.57 in','0.7 cm'], + '2' => ['3.66 in','9.8 in', '-0.57 in','-0.57 in','0.7 cm'] + }, + 'album' => { + '1' => [ '8.8 in', '6.8 in','-40 pt in', '-60 pt','1 cm'], + '2' => [ '4.4 in', '6.8 in','-0.5 in', '-1.5 in','3.5 in'] + }, + }, + 'legal' => { + 'book' => { + '1' => ['7.1 in','13 in',,'-0.57 in','-0.57 in','-0.5 in'], + '2' => ['3.16 in','13 in','-0.57 in','-0.57 in','-0.5 in'] + }, + 'album' => { + '1' => [], + '2' => [] + }, + }, + 'tabloid' => { + 'book' => { + '1' => ['9.8 in','16 in','-0.57 in','-0.57 in','-0.5 in'], + '2' => ['4.9 in','16 in','-0.57 in','-0.57 in','-0.5 in'] + }, + 'album' => { + '1' => [], + '2' => [] + }, + }, + 'executive' => { + 'book' => { + '1' => ['6.8 in','9 in','-0.57 in','-0.57 in','1.2 in'], + '2' => ['3.1 in','9 in','-0.57 in','-0.57 in','1.2 in'] + }, + 'album' => { + '1' => [], + '2' => [] + }, + }, + 'a2' => { + 'book' => { + '1' => [], + '2' => [] + }, + 'album' => { + '1' => [], + '2' => [] + }, + }, + 'a3' => { + 'book' => { + '1' => [], + '2' => [] + }, + 'album' => { + '1' => [], + '2' => [] + }, + }, + 'a4' => { + 'book' => { + '1' => ['176 mm','272 mm','-40 pt in','-60 pt','-0.5 in'], + '2' => [ '91 mm','272 mm','-40 pt in','-60 pt','-0.5 in'] + }, + 'album' => { + '1' => ['8.5 in','7.7 in','-40 pt in','-60 pt','0 in'], + '2' => ['3.9 in','7.7 in','-40 pt in','-60 pt','0 in'] + }, + }, + 'a5' => { + 'book' => { + '1' => [], + '2' => [] + }, + 'album' => { + '1' => [], + '2' => [] + }, + }, + 'a6' => { + 'book' => { + '1' => [], + '2' => [] + }, + 'album' => { + '1' => [], + '2' => [] + }, + }, + ); + sub page_format { # -#Correspondence between $papersize variable and real paper format: -# 0 - "Letter [8 1/2x11 in]" -# 1 - "Legal [8 1/2x14 in]" -# 2 - "Ledger/Tabloid [11x17 in]" -# 3 - "Executive [7 1/2x10 in]" -# 4 - "A2 [420x594 mm]" -# 5 - "A3 [297x420 mm]" -# 6 - "A4 [210x297 mm]" -# 7 - "A5 [148x210 mm]" -# 8 - "A6 [105x148 mm]" +#Supported paper format: "Letter [8 1/2x11 in]", "Legal [8 1/2x14 in]", +# "Ledger/Tabloid [11x17 in]", "Executive [7 1/2x10 in]", +# "A2 [420x594 mm]", "A3 [297x420 mm]", +# "A4 [210x297 mm]", "A5 [148x210 mm]", +# "A6 [105x148 mm]" # my ($papersize,$layout,$numberofcolumns) = @_; - my ($textwidth,$textheight,$oddoffset,$evenoffset,$topmargin) = (0,0,0,0,0); - if ($papersize eq '0') { - if ($layout eq 'book') { - if ($numberofcolumns == 1) { - $textwidth = '7.1 in'; #'18 cm'; - $textheight = '10.2 in'; #'25.9 cm'; - $oddoffset = '-0.57 in'; - $evenoffset = '-0.57 in'; - } elsif ($numberofcolumns == 2) { - $textwidth = '3.66 in'; #'93 mm'; - $textheight = '10.2 in'; #'25.9 cm'; - $oddoffset = '-0.57 in'; - $evenoffset = '-0.57 in'; - } - } elsif ($layout eq 'album') { - if ($numberofcolumns eq '1') { - $textwidth = '8.8 in'; - $textheight = '6.8 in'; - $oddoffset = '-40 pt'; - $evenoffset = '-60 pt'; - } elsif ($numberofcolumns == 2) { - $textwidth = '4.4 in'; - $textheight = '6.8 in'; - $oddoffset = '-0.5 in'; - $evenoffset = '-1.5 in'; - $topmargin = '3.5 in'; - } - } -# } elsif($papersize eq '1') { -# } elsif($papersize eq '2') { -# } elsif($papersize eq '3'/) { - } elsif($papersize eq '6') { - if ($layout eq 'book') { - if ($numberofcolumns == 1) { - $textwidth = '18 cm'; - $textheight = '28 cm'; - $oddoffset = '-0.57 in'; - $evenoffset = '-0.57 in'; - } elsif ($numberofcolumns == 2) { - $textwidth = '96 mm'; - $textheight = '2 cm'; - $oddoffset = '-0.57 in'; - $evenoffset = '-0.57 in'; - } - } elsif ($layout eq 'album') { - if ($numberofcolumns eq '1') { - $textwidth = '8.5 in'; - $textheight = '7.7 in'; - $oddoffset = '-40 pt'; - $evenoffset = '-60 pt'; - } elsif ($numberofcolumns == 2) { - $textwidth = '3.9 in'; - $textheight = '7.7 in'; - $oddoffset = '-40 pt'; - $evenoffset = '-60 pt'; - } - } -# } elsif($papersize eq '5') { -# } elsif($papersize eq '4') { -# } elsif($papersize eq '7') { -# } elsif($papersize eq '8') { - } - return $textwidth,$textheight,$oddoffset,$evenoffset,$topmargin; + return @{$page_formats{$papersize}->{$layout}->{$numberofcolumns}}; } @@ -482,26 +551,35 @@ sub get_course { } sub page_format_transformation { - my ($papersize,$layout,$numberofcolumns,$choice,$text,$assignment,$tableofcontents,$indexlist) = @_; + my ($papersize,$layout,$numberofcolumns,$choice,$text,$assignment,$tableofcontents,$indexlist,$selectionmade) = @_; my ($textwidth,$textheight,$oddoffset,$evenoffset,$topmargin); - $assignment=&Apache::lonxml::latex_special_symbols($assignment,'header'); - if ($numberofcolumns != 1) { - ($textwidth,$textheight,$oddoffset,$evenoffset,$topmargin) = &page_format($papersize,$layout,$numberofcolumns,$topmargin); + if ($selectionmade eq '4') { + $assignment='Problems from the Whole Course'; } else { - ($textwidth,$textheight,$oddoffset,$evenoffset) = ($ENV{'form.width'},$ENV{'form.height'},$ENV{'form.leftmargin'},$ENV{'form.leftmargin'}); + $assignment=&Apache::lonxml::latex_special_symbols($assignment,'header'); } + ($textwidth,$textheight,$oddoffset,$evenoffset,$topmargin) = &page_format($papersize,$layout,$numberofcolumns,$topmargin); my $name = &get_name(); my $courseidinfo = &get_course(); if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo } + my $topmargintoinsert = ''; + if ($topmargin ne '0') {$topmargintoinsert='\setlength{\topmargin}{'.$topmargin.'}';} + my $fancypagestatement=''; + if ($numberofcolumns eq '2') { + $fancypagestatement="\\fancyhead{}\\fancyhead[LO]{\\textbf{$name} $courseidinfo \\hfill \\thepage \\\\ \\textit{$assignment}}"; + } else { + $fancypagestatement="\\rhead{}\\chead{}\\lhead{\\textbf{$name} $courseidinfo \\hfill \\thepage \\\\ \\textit{$assignment}}"; + } if ($layout eq 'album') { - my $topmargintoinsert = ''; - if ($topmargin ne '0') {$topmargintoinsert='\setlength{\topmargin}{'.$topmargin.'}';} - $text =~ s/\\begin{document}/\\setlength{\\oddsidemargin}{$oddoffset}\\setlength{\\evensidemargin}{$evenoffset}$topmargintoinsert\\setlength{\\textwidth}{$textwidth}\\setlength{\\textheight}{$textheight}\\setlength{\\textfloatsep}{8pt plus 2\.0pt minus 4\.0pt}\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\usepackage{fancyhdr}\\pagestyle{fancy}\\rhead{}\\chead{}\\lhead{\\textbf{$name} $courseidinfo \\hfill \\thepage \\\\ \\textit{$assignment}} \\begin{document}\\voffset=-0\.8 cm\\setcounter{page}{1} /; + $text =~ s/\\begin{document}/\\setlength{\\oddsidemargin}{$oddoffset}\\setlength{\\evensidemargin}{$evenoffset}$topmargintoinsert\n\\setlength{\\textwidth}{$textwidth}\\setlength{\\textheight}{$textheight}\\setlength{\\textfloatsep}{8pt plus 2\.0pt minus 4\.0pt}\n\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\usepackage{fancyhdr}\\addtolength{\\headheight}{\\baselineskip}\n\\pagestyle{fancy}$fancypagestatement\\begin{document}\\voffset=-0\.8 cm\\setcounter{page}{1}\n /; } elsif ($layout eq 'book') { if ($choice ne 'All class print') { - $text =~ s/\\begin{document}/\\textheight $textheight\\oddsidemargin = $evenoffset\\evensidemargin = $evenoffset\\textwidth= $textwidth\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\renewcommand{\\ref}{\\keephidden\}\\usepackage{fancyhdr}\\pagestyle{fancy}\\rhead{}\\chead{}\\lhead{\\textbf{$name} $courseidinfo \\hfill \\thepage \\\\ \\textit{$assignment}}\\begin{document}\\voffset=-0\.8 cm\\setcounter{page}{1}/; + $text =~ s/\\begin{document}/\\textheight $textheight\\oddsidemargin = $evenoffset\\evensidemargin = $evenoffset $topmargintoinsert\n\\textwidth= $textwidth\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\n\\renewcommand{\\ref}{\\keephidden\}\\usepackage{fancyhdr}\\addtolength{\\headheight}{\\baselineskip}\\pagestyle{fancy}$fancypagestatement\\begin{document}\n\\voffset=-0\.8 cm\\setcounter{page}{1}\n/; } else { - $text =~ s/\\pagestyle{fancy}\\rhead{}\\chead{}\s*\\begin{document}/\\textheight = $textheight\\oddsidemargin = $evenoffset\\evensidemargin = $evenoffset\\textwidth= $textwidth\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\renewcommand{\\ref}{\\keephidden\}\\pagestyle{fancy}\\rhead{}\\chead{}\\begin{document}\\voffset=-0\.8cm\\setcounter{page}{1} \\vskip 5 mm /; + $text =~ s/\\pagestyle{fancy}\\rhead{}\\chead{}\s*\\begin{document}/\\textheight = $textheight\\oddsidemargin = $evenoffset\n\\evensidemargin = $evenoffset $topmargintoinsert\\textwidth= $textwidth\\newlength{\\minipagewidth}\n\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\renewcommand{\\ref}{\\keephidden\}\\pagestyle{fancy}\\rhead{}\\chead{}\\begin{document}\\voffset=-0\.8cm\n\\setcounter{page}{1} \\vskip 5 mm\n /; + } + if ($papersize eq 'a4') { + $text =~ s/(\\begin{document})/$1\\special{papersize=210mm,297mm}/; } } if ($tableofcontents eq 'yes') {$text=~s/(\\setcounter\{page\}\{1\})/$1 \\tableofcontents\\newpage /;} @@ -528,34 +606,38 @@ sub page_cleanup { sub details_for_menu { - - my $name_of_resourse = $hash{'title_'.$hash{'ids_'.$ENV{'form.postdata'}}}; - my $symbolic = &Apache::lonnet::symbread($ENV{'form.postdata'}); + my ($helper)=@_; + my $postdata=$ENV{'form.postdata'}; + if (!$postdata) { $postdata=$helper->{VARS}{'postdata'}; } + my $name_of_resource = &Apache::lonnet::gettitle($postdata); + my $symbolic = &Apache::lonnet::symbread($postdata); my ($map,$id,$resource)=&Apache::lonnet::decode_symb($symbolic); $map=&Apache::lonnet::clutter($map); - my $name_of_sequence; - $name_of_sequence = $hash{'title_'.$hash{'ids_'.$map}}; + my $name_of_sequence = &Apache::lonnet::gettitle($map); if ($name_of_sequence =~ /^\s*$/) { $map =~ m|([^/]+)$|; $name_of_sequence = $1; } - my $name_of_map = $hash{'title_'.$hash{'ids_'.&Apache::lonnet::clutter($ENV{'request.course.uri'})}}; + my $name_of_map = &Apache::lonnet::gettitle($ENV{'request.course.uri'}); if ($name_of_map =~ /^\s*$/) { $ENV{'request.course.uri'} =~ m|([^/]+)$|; $name_of_map = $1; } - return ($name_of_resourse,$name_of_sequence,$name_of_map); - + return ($name_of_resource,$name_of_sequence,$name_of_map); } sub latex_corrections { - my ($number_of_columns,$result) = @_; + my ($number_of_columns,$result,$selectionmade) = @_; # $result =~ s/\\includegraphics{/\\includegraphics\[width=\\minipagewidth\]{/g; $result =~ s/\$number_of_columns/$number_of_columns/g; - $result =~ s/(\\end{document})/\\strut\\newline\\noindent\\makebox\[\\textwidth\/$number_of_columns\]\[b\]{\\hrulefill}\\newline\\noindent\\tiny Printed from LON-CAPA\\copyright MSU{\\hfill} Licensed under GNU General Public License $1/; + if ($selectionmade ne '1') { + $result =~ s/(\\end{document})/\\strut\\vspace\*{-4 mm}\\newline\\noindent\\makebox\[\\textwidth\/$number_of_columns\]\[b\]{\\hrulefill}\\newline\\noindent\\tiny Printed from LON-CAPA\\copyright MSU{\\hfill} Licensed under GNU General Public License $1/; + } else { + $result =~ s/(\\end{document})/\\strut\\newline\\noindent\\makebox\[\\textwidth\/$number_of_columns\]\[b\]{\\hrulefill}\\newline\\noindent\\tiny Printed from LON-CAPA\\copyright MSU{\\hfill} Licensed under GNU General Public License $1/; + } $result =~ s/(\\end{longtable}\s*)(\\strut\\newline\\noindent\\makebox\[\\textwidth\/$number_of_columns\]\[b\]{\\hrulefill})/$2$1/g; $result =~ s/(\\end{longtable}\s*)\\strut\\newline/$1/g; #-- LaTeX corrections @@ -570,8 +652,7 @@ sub latex_corrections { $result =~ s/\\\\\s*\\vskip/\\vskip/gm; $result =~ s/\\\\\s*\\noindent\s*(\\\\)+/\\\\\\noindent /g; $result =~ s/{\\par }\s*\\\\/\\\\/gm; - $result =~ s/\\\\\s+\[/ \[/g; - $result =~ s/\b__+\b/\\makebox\[1 cm\]\[b\]{\\hrulefill}/g; + $result =~ s/\\\\\s+\[/ \[/g; #conversion of html characters to LaTeX equivalents if ($result =~ m/&(\w+|#\d+);/) { $result = &character_chart($result); @@ -614,65 +695,162 @@ sub IndexCreation { sub print_latex_header { my $mode=shift; my $output='\documentclass[letterpaper]{article}'; - if ($mode eq 'batchmode') { + if (($mode eq 'batchmode') || (!$ENV{'request.role.adv'})) { $output.='\batchmode'; } - $output.='\newcommand{\keephidden}[1]{}\renewcommand{\deg}{$^{\circ}$}'. - '\usepackage{longtable}\usepackage{textcomp}\usepackage{makeidx}'. - '\usepackage[dvips]{graphicx}\usepackage{epsfig}\usepackage{calc}'. - '\newenvironment{choicelist}{\begin{list}{}{\setlength{\rightmargin}{0in}'. - '\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.05in}'. - '\setlength{\itemsep}{0.022in}\setlength{\parsep}{0in}'. - '\setlength{\belowdisplayskip}{0.04in}\setlength{\abovedisplayskip}{0.05in}'. - '\setlength{\abovedisplayshortskip}{-0.04in}'. - '\setlength{\belowdisplayshortskip}{0.04in}}}{\end{list}}'. - '\renewenvironment{theindex}{\begin{list}{}{{\vskip 1mm \noindent \large'. - '\textbf{Index}} \newline \setlength{\rightmargin}{0in}'. - '\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.01in}'. - '\setlength{\itemsep}{0.1in}\setlength{\parsep}{-0.02in}'. - '\setlength{\belowdisplayskip}{0.01in}\setlength{\abovedisplayskip}{0.01in}'. - '\setlength{\abovedisplayshortskip}{-0.04in}'. - '\setlength{\belowdisplayshortskip}{0.01in}}}{\end{list}}\begin{document}'; + $output.='\newcommand{\keephidden}[1]{}\renewcommand{\deg}{$^{\circ}$}'."\n". + '\usepackage{longtable}\usepackage{textcomp}\usepackage{makeidx}'."\n". + '\usepackage[dvips]{graphicx}\usepackage{epsfig}'."\n". + '\usepackage{picins}\usepackage{calc}'."\n". + '\newenvironment{choicelist}{\begin{list}{}{\setlength{\rightmargin}{0in}'."\n". + '\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.05in}'."\n". + '\setlength{\itemsep}{0.022in}\setlength{\parsep}{0in}'."\n". + '\setlength{\belowdisplayskip}{0.04in}\setlength{\abovedisplayskip}{0.05in}'."\n". + '\setlength{\abovedisplayshortskip}{-0.04in}'."\n". + '\setlength{\belowdisplayshortskip}{0.04in}}}{\end{list}}'."\n". + '\renewenvironment{theindex}{\begin{list}{}{{\vskip 1mm \noindent \large'."\n". + '\textbf{Index}} \newline \setlength{\rightmargin}{0in}'."\n". + '\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.01in}'."\n". + '\setlength{\itemsep}{0.1in}\setlength{\parsep}{-0.02in}'."\n". + '\setlength{\belowdisplayskip}{0.01in}\setlength{\abovedisplayskip}{0.01in}'."\n". + '\setlength{\abovedisplayshortskip}{-0.04in}'."\n". + '\setlength{\belowdisplayshortskip}{0.01in}}}{\end{list}}\begin{document}'."\n"; return $output; } sub path_to_problem { - my ($urlp,$LaTeXwidth)=@_; + my ($urlp,$colwidth)=@_; my $newurlp = ''; - $LaTeXwidth=~s/\s*mm\s*$//; - my $HowMany = length($urlp)*2; - if ($HowMany > $LaTeXwidth) { - my @temporrary = split '/',$urlp; - my $HowManyNew = 0; - for (my $ii=0;$ii<=$#temporrary;$ii++) { - if ($temporrary[$ii] ne '') { - $HowManyNew += length($temporrary[$ii])*2; - if ($HowManyNew < $LaTeXwidth ) { - $newurlp .= '/'.$temporrary[$ii]; - } else { - $HowManyNew = 0; - $newurlp .= '|\vskip -1 mm \noindent \verb|'; - $ii--; - } + $colwidth=~s/\s*mm\s*$//; +#characters average about 2 mm in width + if (length($urlp)*2 > $colwidth) { + my @elements = split '/',$urlp; + my $curlength=0; + foreach my $element (@elements) { + if ($curlength+(length($element)*2) > $colwidth) { + $newurlp .= '|\vskip -1 mm \noindent \verb|'; + $curlength=0; + } else { + $curlength+=length($element)*2; } + $newurlp.='/'.$element; } + } else { + $newurlp=$urlp; } return '{\small\noindent\verb|'.$newurlp.'|\vskip 0 mm}'; } +sub recalcto_mm { + my $textwidth=shift; + my $LaTeXwidth; + if ($textwidth=~/(-?\d+\.?\d*)\s*cm/) { + $LaTeXwidth = $1*10; + } elsif ($textwidth=~/(-?\d+\.?\d*)\s*mm/) { + $LaTeXwidth = $1; + } elsif ($textwidth=~/(-?\d+\.?\d*)\s*in/) { + $LaTeXwidth = $1*25.4; + } + $LaTeXwidth.=' mm'; + return $LaTeXwidth; +} + +sub get_textwidth { + my ($helper,$LaTeXwidth)=@_; + my $textwidth=$LaTeXwidth; + if ($helper->{'VARS'}->{'pagesize.width'}=~/\d+/ && + $helper->{'VARS'}->{'pagesize.widthunit'}=~/\w+/) { + $textwidth=&recalcto_mm($helper->{'VARS'}->{'pagesize.width'}.' '. + $helper->{'VARS'}->{'pagesize.widthunit'}); + } + return $textwidth; +} + + +sub unsupported { + my ($currentURL,$mode)=@_; + if ($mode ne '') {$mode='\\'.$mode} + my $result.= &print_latex_header($mode); + if ($currentURL=~/\/ext\//) { + $result.=' \strut \\\\ THIS IS EXTERNAL RESOURCE WITH URL \strut \\\\ '.$currentURL.' '; + } else { + $result.=$currentURL; + } + $result.= '\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill} \end{document}'; + return $result; +} + + +# +# Retrieve the hash of page breaks. +# +# Inputs: +# helper - reference to helper object. +# Outputs +# A reference to a page break hash. +# +# + +sub get_page_breaks { + my ($helper) = @_; + my %page_breaks; + + foreach my $break (split /\|\|\|/, $helper->{'VARS'}->{'FINISHPAGE'}) { + $page_breaks{$break} = 1; + } + + return %page_breaks; +} + sub output_data { my ($r,$helper,$rparmhash) = @_; my %parmhash = %$rparmhash; + my $html=&Apache::lonxml::xmlbegin(); my $bodytag=&Apache::loncommon::bodytag('Preparing Printout'); $r->print(< +$html + LON-CAPA output for printing $bodytag Please stand by while processing your print request, this may take some time ... ENDPART + + # fetch the pagebreaks and store them in the course environment + # The page breaks will be pulled into the hash %page_breaks which is + # indexed by symb and contains 1's for each break. + + $ENV{'form.pagebreaks'} = $helper->{'VARS'}->{'FINISHPAGE'}; + &Apache::loncommon::store_course_settings('print', + {'pagebreaks' => 'scalar'}); + + my %page_breaks = &get_page_breaks($helper); + my $format_from_helper = $helper->{'VARS'}->{'FORMAT'}; my ($result,$selectionmade) = ('',''); my $number_of_columns = 1; #used only for pages to determine the width of the cell @@ -685,39 +863,51 @@ ENDPART } my ($textwidth,$textheight,$oddoffset,$evenoffset) = &page_format($papersize,$laystyle,$numberofcolumns); my $assignment = $ENV{'form.assignment'}; - my $LaTeXwidth; - if ($textwidth=~/(\d+\.?\d*)\s*cm/) { - $LaTeXwidth = $1*10; - } elsif ($textwidth=~/(\d+\.?\d*)\s*mm/) { - $LaTeXwidth = $1; - } elsif ($textwidth=~/(\d+\.?\d*)\s*in/) { - $LaTeXwidth = $1*25.4; - } - $LaTeXwidth.=' mm'; + my $LaTeXwidth=&recalcto_mm($textwidth); + my @print_array=(); + my @student_names=(); + + # Common settings for the %form has: + # In some cases these settings get overriddent by specific cases, but the + # settings are common enough to make it worthwhile factoring them out + # here. + # + my %form; + $form{'grade_target'} = 'tex'; + $form{'textwidth'} = &get_textwidth($helper, $LaTeXwidth); if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'current_document') { #-- single document - problem, page, html, xml, ... - my $currentURL; + my ($currentURL,$cleanURL); if ($helper->{'VARS'}->{'construction'} ne '1') { #prints published resource $currentURL=$helper->{'VARS'}->{'postdata'}; + $cleanURL=&Apache::lonenc::check_decrypt($currentURL); } else { #prints resource from the construction space $currentURL='/'.$helper->{'VARS'}->{'filename'}; if ($currentURL=~/([^?]+)/) {$currentURL=$1;} + $cleanURL=$currentURL; } $selectionmade = 1; - if ($currentURL=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) { + if ($cleanURL=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) { my $rndseed=time; my $texversion=''; if ($helper->{'VARS'}->{'ANSWER_TYPE'} ne 'only') { my %moreenv; - $moreenv{'request.filename'}=$currentURL; - my %form; - $form{'grade_target'}='tex'; - $form{'textwidth'}=$LaTeXwidth; + $moreenv{'request.filename'}=$cleanURL; + if ($helper->{'VARS'}->{'style_file'}=~/\w/) { + $moreenv{'construct.style'}=$helper->{'VARS'}->{'style_file'}; + my $dom = $ENV{'user.domain'}; + my $user = $ENV{'user.name'}; + my $put_result = &Apache::lonnet::put('environment',{'construct.style'=>$helper->{'VARS'}->{'style_file'}},$dom,$user); + } + if ($helper->{'VARS'}->{'probstatus'} eq 'exam') {$form{'problemtype'}='exam';} $form{'problem_split'}=$parmhash{'problem_stream_switch'}; + $form{'suppress_tries'}=$parmhash{'suppress_tries'}; $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; + $form{'print_discussions'}=$helper->{'VARS'}->{'PRINT_DISCUSSIONS'}; + if ($helper->{'VARS'}->{'PRINT_DISCUSSIONS'} eq 'yes') {$form{'problem_split'}='yes';} if ($helper->{'VARS'}->{'curseed'}) { $rndseed=$helper->{'VARS'}->{'curseed'}; } @@ -725,13 +915,13 @@ ENDPART &Apache::lonnet::appenv(%moreenv); &Apache::lonnet::delenv('form.counter'); &Apache::lonxml::init_counter(); - $texversion=&Apache::lonnet::ssi($currentURL,%form); + $texversion.=&Apache::lonnet::ssi($currentURL,%form); &Apache::lonnet::delenv('form.counter'); &Apache::lonnet::delenv('request.filename'); } if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) { - my %form; + $form{'problem_split'}=$parmhash{'problem_stream_switch'}; $form{'grade_target'}='answer'; $form{'answer_output_mode'}='tex'; $form{'rndseed'}=$rndseed; @@ -742,10 +932,10 @@ ENDPART $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); if ($helper->{'VARS'}->{'construction'} ne '1') { $texversion.='\vskip 0 mm \noindent\textbf{'.&Apache::lonnet::gettitle($helper->{'VARS'}->{'symb'}).'}\vskip 0 mm '; - $texversion.=&path_to_problem ($currentURL,$LaTeXwidth); + $texversion.=&path_to_problem($cleanURL,$LaTeXwidth); } else { $texversion.='\vskip 0 mm \noindent\textbf{Prints from construction space - there is no title.}\vskip 0 mm '; - my $URLpath=$currentURL; + my $URLpath=$cleanURL; $URLpath=~s/~([^\/]+)/public_html\/$1\/$1/; $texversion.=&path_to_problem ($URLpath,$LaTeXwidth); } @@ -778,20 +968,19 @@ ENDPART if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm)$/) { my $texversion=''; if ($helper->{'VARS'}->{'ANSWER_TYPE'} ne 'only') { - my %form; - $form{'grade_target'}='tex'; - $form{'textwidth'}=$LaTeXwidth; $form{'problem_split'}=$parmhash{'problem_stream_switch'}; + $form{'suppress_tries'}=$parmhash{'suppress_tries'}; $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; $form{'rndseed'}=$rndseed; $texversion=&Apache::lonnet::ssi($urlp,%form); } - if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || - ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) { - my %form; + if((($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || + ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) && + ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page)$/)) { $form{'grade_target'}='answer'; $form{'answer_output_mode'}='tex'; $form{'rndseed'}=$rndseed; + $form{'problem_split'}=$parmhash{'problem_stream_switch'}; if ($urlp=~/\/res\//) {$ENV{'request.state'}='published';} my $answer=&Apache::lonnet::ssi($urlp,%form); if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { @@ -822,26 +1011,36 @@ ENDPART } if ($helper->{VARS}->{'construction'} eq '1') {$result=~s/(\\begin{document})/$1 \\fbox\{RANDOM SEED IS $rndseed\} /;} $result .= '\end{document}'; + } elsif ($cleanURL=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) { + $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; + if ($currentURL=~/\/syllabus$/) {$currentURL=~s/\/res//;} + my $texversion=&Apache::lonnet::ssi($currentURL,%form); + $result .= $texversion; } else { - $result.='\documentclass[letterpaper]{article}\usepackage{calc}\begin{document}Printout of this type of document is currently not supported: '; - if ($currentURL=~/\/(aboutme|syllabus|bulletinboard|smppg)$/) { - $result.=$1; - } elsif ($currentURL=~/\/ext\//) { - $result.=' \strut \\\\ THIS IS EXTERNAL RESOURCE WITH URL \strut \\\\ '.$currentURL.' '; - } else { - $result.=$currentURL; - } - $result.=' \end{document}' + $result.=&unsupported($currentURL,$helper->{'VARS'}->{'LATEX_TYPE'}); } - } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems') or + } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems') or ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_pages') or - ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems')) { + ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems') or + ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_resources') or # BUGBUG + ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'select_sequences')) { #-- produce an output string - my %form=(); - $form{'grade_target'}='tex'; - $form{'textwidth'}=$LaTeXwidth; + if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems') { + $selectionmade = 2; + } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_pages') { + $selectionmade = 3; + } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems') { + $selectionmade = 4; + } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_resources') { #BUGBUG + $selectionmade = 4; + } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'select_sequences') { + $selectionmade = 7; + } $form{'problem_split'}=$parmhash{'problem_stream_switch'}; + $form{'suppress_tries'}=$parmhash{'suppress_tries'}; $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; + $form{'print_discussions'}=$helper->{'VARS'}->{'PRINT_DISCUSSIONS'}; + if ($helper->{'VARS'}->{'PRINT_DISCUSSIONS'} eq 'yes') {$form{'problem_split'}='yes';} my $flag_latex_header_remove = 'NO'; my $flag_page_in_sequence = 'NO'; my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'}; @@ -849,118 +1048,217 @@ ENDPART &Apache::lonnet::delenv('form.counter'); &Apache::lonxml::init_counter(); for (my $i=0;$i<=$#master_seq;$i++) { + + # Note due to document structure, not allowed to put \newpage + # prior to the first resource + + if (defined $page_breaks{$master_seq[$i]}) { + if($i != 0) { + $result.="\\newpage\n"; + } + } my (undef,undef,$urlp)=&Apache::lonnet::decode_symb($master_seq[$i]); $urlp=&Apache::lonnet::clutter($urlp); - if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems') { - $selectionmade = 2; - } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_pages') { - $selectionmade = 3; - } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems') { - $selectionmade = 4; - } $form{'symb'}=$master_seq[$i]; my ($sequence)=&Apache::lonnet::decode_symb($master_seq[$i]); my $assignment=&Apache::lonxml::latex_special_symbols(&Apache::lonnet::gettitle($sequence),'header'); #tittle of the assignment which contains this problem - #&Apache::lonnet::logthis("Trying to get $urlp with symb $master_seq[$i]"); - my $texversion=&Apache::lonnet::ssi($urlp,%form); - if ($urlp=~/\.page$/) { - ($texversion,my $number_of_columns_page) = &page_cleanup($texversion); - if ($number_of_columns_page > $number_of_columns) {$number_of_columns=$number_of_columns_page;} - $texversion =~ s/\\end{document}\d*/\\end{document}/; - $flag_page_in_sequence = 'YES'; - } - if ($flag_latex_header_remove ne 'NO') { - $texversion = &latex_header_footer_remove($texversion); + if ($selectionmade==7) {$helper->{VARS}->{'assignment'}=$assignment;} + if ($i==0) {$prevassignment=$assignment;} + my $texversion=''; + if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) { + $texversion.=&Apache::lonnet::ssi($urlp,%form); + if ($urlp=~/\.page$/) { + ($texversion,my $number_of_columns_page) = &page_cleanup($texversion); + if ($number_of_columns_page > $number_of_columns) {$number_of_columns=$number_of_columns_page;} + $texversion =~ s/\\end{document}\d*/\\end{document}/; + $flag_page_in_sequence = 'YES'; + } + my $lonidsdir=$r->dir_config('lonIDsDir'); + my $envfile=$ENV{'user.environment'}; + $envfile=~/\/([^\/]+)\.id$/; + $envfile=$1; + &Apache::lonnet::transfer_profile_to_env($lonidsdir,$envfile); + my $current_counter=$ENV{'form.counter'}; + if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || + ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) { + $form{'grade_target'}='answer'; + $form{'answer_output_mode'}='tex'; + my $answer=&Apache::lonnet::ssi($urlp,%form); + &Apache::lonnet::appenv(('form.counter' => $current_counter)); + if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { + $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/; + } else { + if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library)$/) { + $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); + $texversion.='\vskip 0 mm \noindent\textbf{'.&Apache::lonnet::gettitle($urlp).'}\vskip 0 mm '; + $texversion.=&path_to_problem ($urlp,$LaTeXwidth); + $texversion.='\vskip 1 mm '.$answer; + } else { + $texversion=''; + } + } + } + if ($flag_latex_header_remove ne 'NO') { + $texversion = &latex_header_footer_remove($texversion); + } else { + $texversion =~ s/\\end{document}//; + } + if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') { + $texversion=&IndexCreation($texversion,$urlp); + } + if (($selectionmade == 4) and ($assignment ne $prevassignment)) { + my $name = &get_name(); + my $courseidinfo = &get_course(); + if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo } + $prevassignment=$assignment; + $result .='\newpage \noindent\parbox{\minipagewidth}{\noindent\\lhead{\\textit{\\textbf{'.$name.'}}'.$courseidinfo.' \\hfill \\thepage \\\\ \\textit{'.$assignment.'}}} \vskip 5 mm '; + } + $result .= $texversion; + $flag_latex_header_remove = 'YES'; + } elsif ($urlp=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) { + $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; + if ($urlp=~/\/syllabus$/) {$urlp=~s/\/res//;} + my $texversion=&Apache::lonnet::ssi($urlp,%form); + if ($flag_latex_header_remove ne 'NO') { + $texversion = &latex_header_footer_remove($texversion); + } else { + $texversion =~ s/\\end{document}/\\vskip 0\.5mm\\noindent\\makebox\[\\textwidth\/\$number_of_columns\]\[b\]\{\\hrulefill\}/; + } + $result .= $texversion; + $flag_latex_header_remove = 'YES'; } else { - $texversion =~ s/\\end{document}//; - } - if($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { - my %form; - $form{'grade_target'}='answer'; - $form{'answer_output_mode'}='tex'; - my $answer=&Apache::lonnet::ssi($urlp,%form); - $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/; - } - if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') { - $texversion=&IndexCreation($texversion,$urlp); - } - if (($selectionmade == 4) and ($assignment ne $prevassignment) and ($i>=1)) { - my ($name,$courseidinfo) = &get_name; - $courseidinfo = &get_course(); - if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo } - $prevassignment=$assignment; - $result .='\newpage \noindent\parbox{\minipagewidth}{\noindent\\lhead{\\textit{\\textbf{'.$name.'}}'.$courseidinfo.' \\hfill \\thepage \\\\ \\textit{'.$assignment.'}}} \vskip -5 mm '; - } - $result .= $texversion; - $flag_latex_header_remove = 'YES'; + $texversion=&unsupported($urlp,$helper->{'VARS'}->{'LATEX_TYPE'}); + if ($flag_latex_header_remove ne 'NO') { + $texversion = &latex_header_footer_remove($texversion); + } else { + $texversion =~ s/\\end{document}//; + } + $result .= $texversion; + $flag_latex_header_remove = 'YES'; + } + if (&Apache::loncommon::connection_aborted($r)) { last; } } &Apache::lonnet::delenv('form.counter'); - if ($flag_page_in_sequence eq 'YES') {$result =~ s/\\usepackage{calc}/\\usepackage{calc}\\usepackage{longtable}/;} + if ($flag_page_in_sequence eq 'YES') { + $result =~ s/\\usepackage{calc}/\\usepackage{calc}\\usepackage{longtable}/; + } $result .= '\end{document}'; - } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students') { + } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students') || + ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_students')){ + + #-- prints assignments for whole class or for selected students - $selectionmade=5; + my $type; + if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students') { + $selectionmade=5; + $type='problems'; + } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_students') { + $selectionmade=8; + $type='resources'; + } my @students=split /\|\|\|/, $helper->{'VARS'}->{'STUDENTS'}; + # The normal sort order is by section then by students within the + # section. If the helper var student_sort is 1, then the user has elected + # to override this and output the students by name. + # Each element of the students array is of the form: + # username:domain:section:last, first:status + # + # + if ($helper->{'VARS'}->{'student_sort'} eq 1) { + @students = sort compare_names @students; + } + if ($helper->{'VARS'}->{'NUMBER_TO_PRINT'} eq '0' || + $helper->{'VARS'}->{'NUMBER_TO_PRINT'} eq 'all' ) { + $helper->{'VARS'}->{'NUMBER_TO_PRINT'}=$#students+1; + } my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'}; + #loop over students my $flag_latex_header_remove = 'NO'; my %moreenv; - $moreenv{'form.textwidth'}=$LaTeXwidth; - &Apache::lonnet::appenv(%moreenv); - my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,'Print Status','Class Print Status',$#students+1); + $moreenv{'instructor_comments'}='hide'; + $moreenv{'textwidth'}=&get_textwidth($helper,$LaTeXwidth); + $moreenv{'print_discussions'}=$helper->{'VARS'}->{'PRINT_DISCUSSIONS'}; + $moreenv{'problem_split'} = $parmhash{'problem_stream_switch'}; + if ($helper->{'VARS'}->{'PRINT_DISCUSSIONS'} eq 'yes') {$moreenv{'problem_split'}='yes';} + my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,'Print Status','Class Print Status',$#students+1,'inline','75'); + my $student_counter=-1; foreach my $person (@students) { - my $current_output = ''; -# my ($usersection,$username,$userdomain) = split /:/,$person; - my ($username,$userdomain) = split /:/,$person; - my $fullname = &get_name($username,$userdomain); - - if ($parmhash{'anonymous_quiz'}=~/yes/) {$fullname=' ';} #put here something reasonable for anonymous exams or quiz - #goes through all resources, checks if they are available for current student, and produces output - &Apache::lonnet::delenv('form.counter'); - &Apache::lonxml::init_counter(); - foreach my $curresline (@master_seq) { - if ($curresline=~ m/\.(problem|exam|quiz|assess|survey|form|library)$/) { - my ($map,$id,$res_url) = &Apache::lonnet::decode_symb($curresline); - if (&Apache::lonnet::allowed('bre',$res_url)) { - my $rendered = &Apache::loncommon::get_student_view($curresline,$username,$userdomain, - $ENV{'request.course.id'},'tex'); - if ($flag_latex_header_remove eq 'YES') { - $rendered = &latex_header_footer_remove($rendered); - } else { - $rendered =~ s/\\end{document}//; - } - if($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { - my %form; - $form{'answer_output_mode'}='tex'; - $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; - my $ansrendered = &Apache::loncommon::get_student_answers($curresline,$username,$userdomain,$ENV{'request.course.id'},%form); - $rendered=~s/(\\keephidden{ENDOFPROBLEM})/$ansrendered$1/; - } - $current_output .= $rendered; - } - $flag_latex_header_remove = 'YES'; - } - } - my $courseidinfo = &get_course(); - if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo } - my $currentassignment=&Apache::lonxml::latex_special_symbols($helper->{VARS}->{'assignment'},'header'); - if ($current_output=~/\\documentclass/) { - $current_output =~ s/\\begin{document}/\\setlength{\\topmargin}{1cm} \\begin{document}\\noindent\\lhead{\\textit{\\textbf{$fullname}}$courseidinfo \\hfill \\thepage \\\\ \\textit{$currentassignment}}\\vskip 3 mm /; - } else { - my $blanspages = ''; - for (my $j=0;$j<$helper->{'VARS'}->{'EMPTY_PAGES'};$j++) {$blanspages.='\clearpage\strut\clearpage';} - $current_output = '\strut\\newline\\noindent\\makebox[\\textwidth/$number_of_columns][b]{\\hrulefill}\\newline\\noindent{\\tiny Printed from LON-CAPA\\copyright MSU{\\hfill} Licensed under GNU General Public License }\\newpage '.$blanspages.'\setcounter{page}{1}\noindent\parbox{\minipagewidth}{\noindent\\lhead{\\textit{\\textbf{'.$fullname.'}}'.$courseidinfo.' \\hfill \\thepage \\\\ \\textit{'.$currentassignment.'}}} \vskip -5 mm '.$current_output; - } - $result .= $current_output; - &Apache::lonnet::delenv('form.counter'); - &Apache::lonxml::init_counter(); - &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state, - 'last student '.$fullname); - } - &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); - $result .= '\end{document}'; - &Apache::lonnet::delenv('form.textwidth'); - } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_from_directory') { + + my $duefile="/home/httpd/prtspool/$ENV{'user.name'}_$ENV{'user.domain'}_printout.due"; + if (-e $duefile) { + my $temp_file = Apache::File->new('>>'.$duefile); + print $temp_file "1969\n"; + } + $student_counter++; + my $i=int($student_counter/$helper->{'VARS'}{'NUMBER_TO_PRINT'}); + my ($output,$fullname)=&print_resources($r,$helper, + $person,$type, + \%moreenv,\@master_seq, + $flag_latex_header_remove, + $LaTeXwidth); + $print_array[$i].=$output; + $student_names[$i].=$person.':'.$fullname.'_END_'; + &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,&mt('last student').' '.$fullname); + $flag_latex_header_remove = 'YES'; + if (&Apache::loncommon::connection_aborted($r)) { last; } + } + &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); + $result .= $print_array[0].' \end{document}'; + } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_anon') || + ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_anon') ) { + my $cdom =$ENV{'course.'.$ENV{'request.course.id'}.'.domain'}; + my $cnum =$ENV{'course.'.$ENV{'request.course.id'}.'.num'}; + my $num_todo=$helper->{'VARS'}->{'NUMBER_TO_PRINT_TOTAL'}; + my $code_name=$helper->{'VARS'}->{'ANON_CODE_STORAGE_NAME'}; + my $old_name=$helper->{'VARS'}->{'REUSE_OLD_CODES'}; + my %moreenv = ('textwidth' => &get_textwidth($helper,$LaTeXwidth)); + $moreenv{'problem_split'} = $parmhash{'problem_stream_switch'}; + my $seed=time+($$<<16)+($$); + my @allcodes; + if ($old_name) { + my %result=&Apache::lonnet::get('CODEs',[$old_name],$cdom,$cnum); + @allcodes=split(',',$result{$old_name}); + $num_todo=scalar(@allcodes); + } else { + my %allcodes; + srand($seed); + for (my $i=0;$i<$num_todo;$i++) { + $moreenv{'CODE'}=&get_CODE(\%allcodes,$i,$seed,'6'); + } + if ($code_name) { + &Apache::lonnet::put('CODEs', + {$code_name =>join(',',keys(%allcodes))}, + $cdom,$cnum); + } + @allcodes=keys(%allcodes); + } + my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'}; + my ($type) = split(/_/,$helper->{'VARS'}->{'PRINT_TYPE'}); + my $number_per_page=$helper->{'VARS'}->{'NUMBER_TO_PRINT'}; + if ($number_per_page eq '0' || $number_per_page eq 'all') { + $number_per_page=$num_todo; + } + my $flag_latex_header_remove = 'NO'; + my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,'Print Status','Class Print Status',$num_todo,'inline','75'); + my $count=0; + foreach my $code (sort(@allcodes)) { + my $file_num=int($count/$number_per_page); + $moreenv{'CODE'}=&num_to_letters($code); + my ($output,$fullname)= + &print_resources($r,$helper,'anonymous',$type,\%moreenv, + \@master_seq,$flag_latex_header_remove, + $LaTeXwidth); + $print_array[$file_num].=$output; + &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state, + &mt('last assignment').' '.$fullname); + $flag_latex_header_remove = 'YES'; + $count++; + if (&Apache::loncommon::connection_aborted($r)) { last; } + } + &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); + $result .= $print_array[0].' \end{document}'; + } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_from_directory') { #prints selected problems from the subdirectory $selectionmade = 6; my @list_of_files=split /\|\|\|/, $helper->{'VARS'}->{'FILES'}; @@ -972,28 +1270,43 @@ ENDPART } for (my $i=0;$i<=$#list_of_files;$i++) { my $urlp = $list_of_files[$i]; + $urlp=~s|//|/|; if ($urlp=~/\//) { - my %form; - $form{'grade_target'}='tex'; - $form{'textwidth'}=$LaTeXwidth; + $form{'problem_split'}=$parmhash{'problem_stream_switch'}; $form{'rndseed'}=$rndseed; if ($urlp =~ m|/home/([^/]+)/public_html|) { $urlp =~ s|/home/([^/]*)/public_html|/~$1|; } else { - $urlp =~ s|^/home/httpd/html||; + $urlp =~ s|^$Apache::lonnet::perlvar{'lonDocRoot'}||; } my $texversion=&Apache::lonnet::ssi($urlp,%form); - if($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { - my %form; + if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || + ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) { $form{'grade_target'}='answer'; $form{'answer_output_mode'}='tex'; $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; $form{'rndseed'}=$rndseed; my $answer=&Apache::lonnet::ssi($urlp,%form); - $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/; + if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { + $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/; + } else { + $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); + if ($helper->{'VARS'}->{'construction'} ne '1') { + $texversion.='\vskip 0 mm \noindent '; + $texversion.=&path_to_problem ($urlp,$LaTeXwidth); + } else { + $texversion.='\vskip 0 mm \noindent\textbf{Prints from construction space - there is no title.}\vskip 0 mm '; + my $URLpath=$urlp; + $URLpath=~s/~([^\/]+)/public_html\/$1\/$1/; + $texversion.=&path_to_problem ($URLpath,$LaTeXwidth); + } + $texversion.='\vskip 1 mm '.$answer.'\end{document}'; + } } #this chunck is responsible for printing the path to problem - my $newurlp=&path_to_problem($urlp,$LaTeXwidth); + my $newurlp=$urlp; + if ($newurlp=~/~/) {$newurlp=~s|\/~([^\/]+)\/|\/home\/$1\/public_html\/|;} + $newurlp=&path_to_problem($newurlp,$LaTeXwidth); $texversion =~ s/(\\begin{minipage}{\\textwidth})/$1 $newurlp/; if ($flag_latex_header_remove ne 'NO') { $texversion = &latex_header_footer_remove($texversion); @@ -1015,37 +1328,223 @@ ENDPART $result .= '\end{document}'; } #-------------------------------------------------------- corrections for the different page formats - $result = &page_format_transformation($papersize,$laystyle,$numberofcolumns,$helper->{'VARS'}->{'PRINT_TYPE'},$result,$helper->{VARS}->{'assignment'},$helper->{'VARS'}->{'TABLE_CONTENTS'},$helper->{'VARS'}->{'TABLE_INDEX'}); - $result = &latex_corrections($number_of_columns,$result); + $result = &page_format_transformation($papersize,$laystyle,$numberofcolumns,$helper->{'VARS'}->{'PRINT_TYPE'},$result,$helper->{VARS}->{'assignment'},$helper->{'VARS'}->{'TABLE_CONTENTS'},$helper->{'VARS'}->{'TABLE_INDEX'},$selectionmade); + $result = &latex_corrections($number_of_columns,$result,$selectionmade); + for (my $i=1;$i<=$#print_array;$i++) {$print_array[$i] = &latex_corrections($number_of_columns,$print_array[$i],$selectionmade);} #changes page's parameters for the one column output if ($numberofcolumns == 1) { - $result =~ s/\\textwidth= 9cm/\\textwidth= $helper->{'VARS'}->{'pagesize.width'} $helper->{'VARS'}->{'pagesize.widthunit'} /; - $result =~ s/\\textheight 25\.9cm/\\textheight $helper->{'VARS'}->{'pagesize.height'} $helper->{'VARS'}->{'pagesize.heightunit'} /; - $result =~ s/\\evensidemargin = -0\.57in/\\evensidemargin= $helper->{'VARS'}->{'pagesize.lmargin'} $helper->{'VARS'}->{'pagesize.lmarginunit'} /; - $result =~ s/\\oddsidemargin = -0\.57in/\\oddsidemargin= $helper->{'VARS'}->{'pagesize.lmargin'} $helper->{'VARS'}->{'pagesize.lmarginunit'} /; - } - if ($helper->{'VARS'}->{'TABLE_CONTENTS'} eq 'yes') {$selectionmade*=10;} - if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') { - if ($selectionmade<10) {$selectionmade*=100;} else {$selectionmade*=10;} + $result =~ s/\\textwidth\s*=\s*-?\d*\.?\d*\s*(cm|mm|in)/\\textwidth= $helper->{'VARS'}->{'pagesize.width'} $helper->{'VARS'}->{'pagesize.widthunit'} /; + $result =~ s/\\textheight\s*=\s*-?\d*\.?\d*\s*(cm|mm|in)/\\textheight $helper->{'VARS'}->{'pagesize.height'} $helper->{'VARS'}->{'pagesize.heightunit'} /; + $result =~ s/\\evensidemargin\s*=\s*-?\d*\.?\d*\s*(cm|mm|in)/\\evensidemargin= $helper->{'VARS'}->{'pagesize.lmargin'} $helper->{'VARS'}->{'pagesize.lmarginunit'} /; + $result =~ s/\\oddsidemargin\s*=\s*-?\d*\.?\d*\s*(cm|mm|in)/\\oddsidemargin= $helper->{'VARS'}->{'pagesize.lmargin'} $helper->{'VARS'}->{'pagesize.lmarginunit'} /; } - if ($ENV{'request.role.adv'}) {$selectionmade*=10000;} #-- writing .tex file in prtspool my $temp_file; - my $filename = "/home/httpd/prtspool/$ENV{'user.name'}_$ENV{'user.domain'}_printout_".time."_".rand(10000000).".tex"; - unless ($temp_file = Apache::File->new('>'.$filename)) { - $r->log_error("Couldn't open $filename for output $!"); - return SERVER_ERROR; - } - print $temp_file $result; + my $identifier = &Apache::loncommon::get_cgi_id(); + my $filename = "/home/httpd/prtspool/$ENV{'user.name'}_$ENV{'user.domain'}_printout_".$identifier.".tex"; + if (!($#print_array>0)) { + unless ($temp_file = Apache::File->new('>'.$filename)) { + $r->log_error("Couldn't open $filename for output $!"); + return SERVER_ERROR; + } + print $temp_file $result; + my $begin=index($result,'\begin{document}',0); + my $inc=substr($result,0,$begin+16); + } else { + my $begin=index($result,'\begin{document}',0); + my $inc=substr($result,0,$begin+16); + for (my $i=0;$i<=$#print_array;$i++) { + if ($i==0) { + $print_array[$i]=$result; + } else { + my $anobegin=index($print_array[$i],'\setcounter{page}',0); + substr($print_array[$i],0,$anobegin)=''; + $print_array[$i]=$inc.$print_array[$i].'\end{document}'; + } + my $temp_file; + my $newfilename=$filename; + my $num=$i+1; + $newfilename =~s/\.tex$/_$num\.tex/; + unless ($temp_file = Apache::File->new('>'.$newfilename)) { + $r->log_error("Couldn't open $newfilename for output $!"); + return SERVER_ERROR; + } + print $temp_file $print_array[$i]; + } + } + my $student_names=''; + if ($#print_array>0) { + for (my $i=0;$i<=$#print_array;$i++) { + $student_names.=$student_names[$i].'_ENDPERSON_'; + } + } else { + if ($#student_names>-1) { + $student_names=$student_names[0].'_ENDPERSON_'; + } else { + my $fullname = &get_name($ENV{'user.name'},$ENV{'user.domain'}); + $student_names=join(':',$ENV{'user.name'},$ENV{'user.domain'}, + $ENV{'request.course.sec'},$fullname). + '_ENDPERSON_'.'_END_'; + } + } + + my $URLback=''; #link to original document + if ($helper->{'VARS'}->{'construction'} ne '1') { + #prints published resource + $URLback=&Apache::lonnet::escape('/adm/flip?postdata=return:'); + } else { + #prints resource from the construction space + $URLback='/'.$helper->{'VARS'}->{'filename'}; + if ($URLback=~/([^?]+)/) { + $URLback=$1; + $URLback=~s|^/~|/priv/|; + } + } + &Apache::lonnet::appenv('cgi.'.$identifier.'.file' => $filename, + 'cgi.'.$identifier.'.layout' => $laystyle, + 'cgi.'.$identifier.'.numcol' => $numberofcolumns, + 'cgi.'.$identifier.'.paper' => $papersize, + 'cgi.'.$identifier.'.selection' => $selectionmade, + 'cgi.'.$identifier.'tableofcontents' => $helper->{'VARS'}->{'TABLE_CONTENTS'}, + 'cgi.'.$identifier.'tableofindex' => $helper->{'VARS'}->{'TABLE_INDEX'}, + 'cgi.'.$identifier.'role' => $ENV{'request.role.adv'}, + 'cgi.'.$identifier.'numberoffiles' => $#print_array, + 'cgi.'.$identifier.'studentnames' => $student_names, + 'cgi.'.$identifier.'backref' => $URLback,); + $r->print(< +
+ +Continue FINALEND } +sub num_to_letters { + my ($num) = @_; + my @nums= split('',$num); + my @num_to_let=('A'..'Z'); + my $word; + foreach my $digit (@nums) { $word.=$num_to_let[$digit]; } + return $word; +} + +sub get_CODE { + my ($all_codes,$num,$seed,$size)=@_; + my $max='1'.'0'x$size; + my $newcode; + while(1) { + $newcode=sprintf("%06d",int(rand($max))); + if (!exists($$all_codes{$newcode})) { + $$all_codes{$newcode}=1; + return &num_to_letters($newcode); + } + } +} +sub print_resources { + my ($r,$helper,$person,$type,$moreenv,$master_seq,$remove_latex_header, + $LaTeXwidth)=@_; + my $current_output = ''; + my ($username,$userdomain,$usersection) = split /:/,$person; + my $fullname = &get_name($username,$userdomain); + my $namepostfix; + if ($person =~ 'anon') { + $namepostfix="\\\\Name: "; + $fullname = "CODE - ".$moreenv->{'CODE'}; + } + my $i = 0; + #goes through all resources, checks if they are available for + #current student, and produces output + &Apache::lonnet::delenv('form.counter'); + &Apache::lonxml::init_counter(); + + my %page_breaks = &get_page_breaks($helper); + + foreach my $curresline (@{$master_seq}) { + if (defined $page_breaks{$curresline}) { + if($i != 0) { + $current_output.= "\\newpage\n"; + } + } + $i++; + if ( !($type eq 'problems' && + ($curresline!~ m/\.(problem|exam|quiz|assess|survey|form|library)$/)) ) { + my ($map,$id,$res_url) = &Apache::lonnet::decode_symb($curresline); + if (&Apache::lonnet::allowed('bre',$res_url)) { + if ($res_url=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) { + my $rendered = &Apache::loncommon::get_student_view($curresline,$username,$userdomain,$ENV{'request.course.id'},'tex',$moreenv); + my $lonidsdir=$r->dir_config('lonIDsDir'); + my $envfile=$ENV{'user.environment'}; + $envfile=~/\/([^\/]+)\.id$/; + $envfile=$1; + &Apache::lonnet::transfer_profile_to_env($lonidsdir,$envfile); + my $current_counter=$ENV{'form.counter'}; + if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || + ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) { + $moreenv->{'answer_output_mode'}='tex'; + $moreenv->{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; + my $ansrendered = &Apache::loncommon::get_student_answers($curresline,$username,$userdomain,$ENV{'request.course.id'},%{$moreenv}); + &Apache::lonnet::appenv(('form.counter' => $current_counter)); + if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { + $rendered=~s/(\\keephidden{ENDOFPROBLEM})/$ansrendered$1/; + } else { + $rendered=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); + $rendered.='\vskip 0 mm \noindent\textbf{'.&Apache::lonnet::gettitle($curresline).'}\vskip 0 mm '; + $rendered.=&path_to_problem ($curresline,$LaTeXwidth); + $rendered.='\vskip 1 mm '.$ansrendered; + } + } + if ($remove_latex_header eq 'YES') { + $rendered = &latex_header_footer_remove($rendered); + } else { + $rendered =~ s/\\end{document}//; + } + $current_output .= $rendered; + } elsif ($res_url=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) { + my $rendered = &Apache::loncommon::get_student_view($curresline,$username,$userdomain,$ENV{'request.course.id'},'tex',$moreenv); + my $lonidsdir=$r->dir_config('lonIDsDir'); + my $envfile=$ENV{'user.environment'}; + $envfile=~/\/([^\/]+)\.id$/; + $envfile=$1; + &Apache::lonnet::transfer_profile_to_env($lonidsdir,$envfile); + my $current_counter=$ENV{'form.counter'}; + if ($remove_latex_header eq 'YES') { + $rendered = &latex_header_footer_remove($rendered); + } else { + $rendered =~ s/\\end{document}//; + } + $current_output .= $rendered.'\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}\strut \vskip 0 mm \strut '; + } else { + my $rendered = &unsupported($res_url,$helper->{'VARS'}->{'LATEX_TYPE'}); + if ($remove_latex_header ne 'NO') { + $rendered = &latex_header_footer_remove($rendered); + } else { + $rendered =~ s/\\end{document}//; + } + $current_output .= $rendered; + } + } + $remove_latex_header = 'YES'; + } + if (&Apache::loncommon::connection_aborted($r)) { last; } + } + my $courseidinfo = &get_course(); + if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo } + if ($usersection ne '') {$courseidinfo.=' - Sec. '.$usersection} + my $currentassignment=&Apache::lonxml::latex_special_symbols($helper->{VARS}->{'assignment'},'header'); + if ($current_output=~/\\documentclass/) { + $current_output =~ s/\\begin{document}/\\setlength{\\topmargin}{1cm} \\begin{document}\\noindent\\parbox{\\minipagewidth}{\\noindent\\lhead{\\textit{\\textbf{$fullname}}$courseidinfo \\hfill \\thepage \\\\ \\textit{$currentassignment}$namepostfix}}\\vskip 5 mm /; + } else { + my $blankpages = ''; + for (my $j=0;$j<$helper->{'VARS'}->{'EMPTY_PAGES'};$j++) {$blankpages.='\clearpage\strut\clearpage';} + $current_output = '\strut\vspace*{-6 mm}\\newline\\noindent\\makebox[\\textwidth/$number_of_columns][b]{\\hrulefill}\vspace*{-2 mm}\\newline\\noindent{\\tiny Printed from LON-CAPA\\copyright MSU{\\hfill} Licensed under GNU General Public License }\\newpage '.$blankpages.'\setcounter{page}{1}\noindent\parbox{\minipagewidth}{\noindent\\lhead{\\textit{\\textbf{'.$fullname.'}}'.$courseidinfo.' \\hfill \\thepage \\\\ \\textit{'.$currentassignment.'}'.$namepostfix.'}} \vskip 5 mm '.$current_output; + } + return ($current_output,$fullname); + +} sub handler { @@ -1069,16 +1568,21 @@ sub handler { # foreach $key (keys %{$helper->{'VARS'}}) { # $r->print(' '.$key.'->'.$helper->{'VARS'}->{$key}.'<-
'); # } +# foreach $key (keys %ENV) { +# $r->print(' '.$key.'->'.$ENV{$key}.'<-
'); +# } # return OK; my %parmhash=&Apache::lonnet::coursedescription($ENV{'request.course.id'}); - + # my $key; # foreach $key (keys %parmhash) { # $r->print(' '.$key.'->'.$parmhash{$key}.'<-
'); # } -# return OK; +# + + &output_data($r,$helper,\%parmhash); return OK; } @@ -1097,11 +1601,6 @@ use Data::Dumper; sub printHelper { my $r = shift; - if ($ENV{'request.course.id'}) { - my $fn=$ENV{'request.course.fn'}; - tie(%hash,'GDBM_File',"$fn.db",&GDBM_READER(),0640); - } - if ($r->header_only) { if ($ENV{'browser.mathml'}) { &Apache::loncommon::content_type($r,'text/xml'); @@ -1130,10 +1629,21 @@ sub printHelper { my $helper = Apache::lonhelper::helper->new("Printing Helper"); $helper->declareVar('symb'); $helper->declareVar('postdata'); - $helper->declareVar('curseed'); + $helper->declareVar('curseed'); + $helper->declareVar('probstatus'); $helper->declareVar('filename'); $helper->declareVar('construction'); $helper->declareVar('assignment'); + $helper->declareVar('style_file'); + $helper->declareVar('student_sort'); + $helper->declareVar('FINISHPAGE'); + + # The page breaks can get loaded initially from the course environment: + + &Apache::loncommon::restore_course_settings('print', + {'pagebreaks' => 'scalar'}); + + $helper->{VARS}->{FINISHPAGE} = $ENV{'form.pagebreaks'}; # This will persistently load in the data we want from the # very first screen. @@ -1160,8 +1670,9 @@ sub printHelper { $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($helper->{VARS}->{'postdata'}); } - - my ($resourceTitle,$sequenceTitle,$mapTitle) = &details_for_menu; + $helper->{VARS}->{'symb'}= + &Apache::lonenc::check_encrypt($helper->{VARS}->{'symb'}); + my ($resourceTitle,$sequenceTitle,$mapTitle) = &details_for_menu($helper); if ($sequenceTitle ne '') {$helper->{VARS}->{'assignment'}=$sequenceTitle;} @@ -1178,7 +1689,8 @@ sub printHelper { 0, rindex($helper->{VARS}->{'filename'}, '/') + 1); } else { ($map, $id, $url) = &Apache::lonnet::decode_symb($symb); - $helper->{VARS}->{'postdata'} = Apache::lonnet::clutter($url); + $helper->{VARS}->{'postdata'} = + &Apache::lonenc::check_encrypt(&Apache::lonnet::clutter($url)); if (!$resourceTitle) { # if the resource doesn't have a title, use the filename my $postdata = $helper->{VARS}->{'postdata'}; @@ -1189,6 +1701,9 @@ sub printHelper { if (!$helper->{VARS}->{'curseed'} && $ENV{'form.curseed'}) { $helper->{VARS}->{'curseed'}=$ENV{'form.curseed'}; } + if (!$helper->{VARS}->{'probstatus'} && $ENV{'form.problemtype'}) { + $helper->{VARS}->{'probstatus'}=$ENV{'form.problemtype'}; + } my $userCanSeeHidden = Apache::lonnavmaps::advancedUser(); my $userPriviledged = ($ENV{'request.role'}=~m/^cc\./ or @@ -1200,7 +1715,7 @@ sub printHelper { # "Delete everything after the last slash." $subdir =~ s|/[^/]+$||; if (not $helper->{VARS}->{'construction'}) { - $subdir='/home/httpd/html/res/'.$subdir; + $subdir=$Apache::lonnet::perlvar{'lonDocRoot'}.'/res/'.$subdir; } # "Remove all duplicate slashes." $subdir =~ s|/+|/|g; @@ -1220,20 +1735,18 @@ sub printHelper { my $paramHash; if ($resourceTitle) { - push @{$printChoices}, ["$resourceTitle (what you just saw on the screen)", 'current_document', 'PAGESIZE']; + push @{$printChoices}, ["$resourceTitle (".&mt('what you just saw on the screen').")", 'current_document', 'PAGESIZE']; } -# $r->print($helper->{VARS}->{'postdata'}); - # Useful filter strings - my $isProblem = '$res->is_problem()'; + my $isProblem = '($res->is_problem()||$res->contains_problem) '; $isProblem .= ' && !$res->randomout()' if !$userCanSeeHidden; - my $isProblemOrMap = '$res->is_problem() || $res->is_map()'; - my $isNotMap = '!$res->is_map()'; + my $isProblemOrMap = '$res->is_problem() || $res->contains_problem() || $res->is_sequence()'; + my $isNotMap = '!$res->is_sequence()'; $isNotMap .= ' && !$res->randomout()' if !$userCanSeeHidden; my $isMap = '$res->is_map()'; - my $symbFilter = '$res->symb()'; - my $urlValue = '$res->src()'; + my $symbFilter = '$res->shown_symb()'; + my $urlValue = '$res->link()'; $helper->declareVar('SEQUENCE'); @@ -1243,65 +1756,162 @@ sub printHelper { # If we're in a sequence... if (($helper->{'VARS'}->{'construction'} ne '1') && + $helper->{VARS}->{'postdata'} && $helper->{VARS}->{'assignment'}) { # Allow problems from sequence - push @{$printChoices}, ["Problems in $sequenceTitle", 'map_problems', 'CHOOSE_PROBLEMS']; + push @{$printChoices}, ["".&mt('Problems')." ".&mt('in')." $sequenceTitle", 'map_problems', 'CHOOSE_PROBLEMS']; # Allow all resources from sequence - push @{$printChoices}, ["Resources in $sequenceTitle", 'map_problems_pages', 'CHOOSE_PROBLEMS_HTML']; + push @{$printChoices}, ["".&mt('Resources')." ".&mt('in')." $sequenceTitle", 'map_problems_pages', 'CHOOSE_PROBLEMS_HTML']; my $helperFragment = < (mark them then click "next" button)
- + PAGESIZE return $isProblem; $map return $symbFilter; + (mark them then click "next" button)
- + PAGESIZE return $isNotMap; $map return $symbFilter; +
HELPERFRAGMENT - &Apache::lonxml::xmlparse($r, 'helper', $helperFragment); + &Apache::lonxml::xmlparse($r, 'helper', $helperFragment); } - # If the user is priviledged, allow them to print all - # problems in the course, optionally for selected students - if ($userPriviledged && ($helper->{VARS}->{'postdata'}=~/\/res\//)) { - push @{$printChoices}, ['Problems from entire course', 'all_problems', 'ALL_PROBLEMS']; - if ($helper->{VARS}->{'assignment'}) { - push @{$printChoices}, ["Problems from $sequenceTitle for selected students", 'problems_for_students', 'CHOOSE_STUDENTS']; - } + # If the user is privileged, allow them to print all + # problems and resources in the entier course, optionally for selected students + if ($userPriviledged && + ($helper->{VARS}->{'postdata'}=~/\/res\// || $helper->{VARS}->{'postdata'}=~/\/(syllabus|smppg|aboutme|bulletinboard)$/)) { - &Apache::lonxml::xmlparse($r, 'helper', <Problems from entire course', 'all_problems', 'ALL_PROBLEMS']; + push @{$printChoices}, ['Resources from entire course', 'all_resources', 'ALL_RESOURCES']; + &Apache::lonxml::xmlparse($r, 'helper', < (mark them then click "next" button)
- + PAGESIZE return $isProblemOrMap; - return $isProblem; + return $isNotMap; + return $symbFilter; + + + + (Mark them then click "next" button)
+ + PAGESIZE + return $isNotMap; + return $symbFilter; + +
+ALL_PROBLEMS + + if ($helper->{VARS}->{'assignment'}) { + push @{$printChoices}, ["".&mt('Problems')." ".&mt('from')." $sequenceTitle ".&mt('for')." ".&mt('selected students')."", 'problems_for_students', 'CHOOSE_STUDENTS']; + push @{$printChoices}, ["".&mt('Problems')." ".&mt('from')." $sequenceTitle ".&mt('for')." ".&mt('anonymous students')."", 'problems_for_anon', 'CHOOSE_ANON1']; + } + my $resource_selector=<
Select resources for the assignment
+ + return $isProblem; + $map return $symbFilter; + - +
How should the results be printed?
+ + Start each student\'s assignment on a new page/column (add a pagefeed after each assignment) + Add one empty page/column after each student\'s assignment + Add two empty pages/column after each student\'s assignment + Add three empty pages/column after each student\'s assignment + +
Number of assignments printed at the same time:
+ "all" +RESOURCE_SELECTOR + &Apache::lonxml::xmlparse($r, 'helper', < - + + Select sort order + + Sort by section then student + Sort by students across sections. + + $resource_selector + +CHOOSE_STUDENTS + + my $cdom = $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}; + my $cnum = $ENV{'course.'.$ENV{'request.course.id'}.'.num'}; + my @names=&Apache::lonnet::getkeys('CODEs',$cdom,$cnum); + my $namechoice=''; + foreach my $name (sort {uc($a) cmp uc($b)} @names) { + if ($name =~ /^error: 2 /) { next; } + $namechoice.=''.$name.''; + } + &Apache::lonxml::xmlparse($r, 'helper', < + PAGESIZE +
+
Number of anonymous assignments to print? + + + if (((\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}+0) < 1) && + !\$helper->{'VARS'}{'REUSE_OLD_CODES'}) { + return "You need to specify the number of assignments to print"; + } + return undef; + + +
+ Names to store the CODEs under for later: + + +
+
+ Reprint a set of saved CODEs: + + $namechoice + +
+ $resource_selector + +CHOOSE_ANON1 + + + if ($helper->{VARS}->{'assignment'}) { + push @{$printChoices}, ["".&mt('Resources')." ".&mt('from')." $sequenceTitle ".&mt('for')." ".&mt('selected students')."", 'resources_for_students', 'CHOOSE_STUDENTS1']; + push @{$printChoices}, ["".&mt('Resources')." ".&mt('from')." $sequenceTitle ".&mt('for')." ".&mt('anonymous students')."", 'resources_for_anon', 'CHOOSE_ANON2']; + } + + + $resource_selector=<
Select resources for the assignment
- - return $isProblem + + return $isNotMap; $map - return $symbFilter + return $symbFilter; +
How should the results be printed?
@@ -1309,14 +1919,55 @@ HELPERFRAGMENT Add one empty page/column after each student\'s assignment Add two empty pages/column after each student\'s assignment Add three empty pages/column after each student\'s assignment - + +
Number of assignments printed at the same time:
+ "all" +RESOURCE_SELECTOR + + &Apache::lonxml::xmlparse($r, 'helper', < + + + Sort by section then student + Sort by students across sections. + + + $resource_selector -CHOOSE_STUDENTS +CHOOSE_STUDENTS1 + + &Apache::lonxml::xmlparse($r, 'helper', < + PAGESIZE +
Number of anonymous assignments to print? + + + if (((\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}+0) < 1) && + !\$helper->{'VARS'}{'REUSE_OLD_CODES'}) { + return "You need to specify the number of assignments to print"; + } + return undef; + + +
+ Names to store the CODEs under for later: + + +
+
+ Reprint a set of saved CODEs: + + $namechoice + +
+ $resource_selector + +CHOOSE_ANON2 } # FIXME: That RE should come from a library somewhere. - if ((((&Apache::lonnet::allowed('bre',$subdir) eq 'F') and ($helper->{VARS}->{'postdata'}=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)/)) or defined $helper->{'VARS'}->{'construction'}) and $ENV{'request.role.adv'} and $subdir ne '/home/httpd/html/res/') { - push @{$printChoices}, ["Problems from current subdirectory $subdir", 'problems_from_directory', 'CHOOSE_FROM_SUBDIR']; + if ((((&Apache::lonnet::allowed('bre',$subdir) eq 'F') and ($helper->{VARS}->{'postdata'}=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)/)) or defined $helper->{'VARS'}->{'construction'}) and $ENV{'request.role.adv'} and $subdir ne $Apache::lonnet::perlvar{'lonDocRoot'}.'/res/') { + push @{$printChoices}, ["".&mt('Problems')." ".&mt('from current subdirectory')." $subdir", 'problems_from_directory', 'CHOOSE_FROM_SUBDIR']; my $f = '$filename'; my $xmlfrag = <{VARS}->{'construction'}) { - push @$printChoices, ["Resources from selected sequence in course", - 'map_problems_pages', 'CHOOSE_SEQUENCE']; + push @$printChoices, ["Resources from selected sequence in course", + 'select_sequences', 'CHOOSE_SEQUENCE']; my $escapedSequenceName = $helper->{VARS}->{'SEQUENCE'}; #Escape apostrophes and backslashes for Perl $escapedSequenceName =~ s/\\/\\\\/g; @@ -1355,15 +2006,18 @@ CHOOSE_FROM_SUBDIR CHOOSE_FROM_ANY_SEQUENCE return \$res->is_sequence; return $urlValue; +
(mark desired resources then click "next" button)
- + PAGESIZE return $isProblem return '$escapedSequenceName'; return $symbFilter; +
CHOOSE_FROM_ANY_SEQUENCE @@ -1392,7 +2046,9 @@ CHOOSE_FROM_ANY_SEQUENCE $paramHash->{CHOICES} = [ ['Without Answers', 'yes'], ['With Answers', 'no'], - ['Only Answers', 'only'] ]; + ['Only Answers', 'only'], + ['As Exam Problem', 'exam'] + ]; Apache::lonhelper::dropdown->new(); addMessage(""); $startedTable = 1; @@ -1439,33 +2095,38 @@ CHOOSE_FROM_ANY_SEQUENCE ['Yes', 'yes'] ]; Apache::lonhelper::dropdown->new(); addMessage(""); - } - - if ($helper->{VARS}->{'construction'}) { - addMessage("Print With URL: "); + addMessage("Print Discussions: "); $paramHash = Apache::lonhelper::getParamHash(); - $paramHash->{'variable'} = 'CONSTR_RESOURSE_URL'; - $helper->declareVar('CONSTR_RESOURSE_URL'); + $paramHash->{'variable'} = 'PRINT_DISCUSSIONS'; + $helper->declareVar('PRINT_DISCUSSIONS'); $paramHash->{CHOICES} = [ ['No', 'no'], ['Yes', 'yes'] ]; Apache::lonhelper::dropdown->new(); addMessage(""); } + if ($helper->{'VARS'}->{'construction'}) { - my $xmlfrag .= <<'RNDSEED'; - Use random seed: + my $stylevalue=$ENV{'construct.style'}; + my $xmlfrag .= <<"RNDSEED"; + Use random seed: return $helper->{VARS}->{'curseed'}; - + + Use style file: +   Select style file RNDSEED &Apache::lonxml::xmlparse($r, 'helper', $xmlfrag); + $helper->{'VARS'}->{'style_file'}=$ENV{'form.style_file_value'}; } } + + + if ($startedTable) { addMessage(""); } @@ -1488,9 +2149,7 @@ RNDSEED $r->print($helper->display()); - Apache::lonhelper::unregisterHelperTags(); - - untie %hash; + &Apache::lonhelper::unregisterHelperTags(); return OK; } @@ -1528,12 +2187,13 @@ use Apache::lonhelper; no strict; @ISA = ("Apache::lonhelper::element"); use strict; +use Apache::lonlocal; my $maxColumns = 2; -my @paperSize = ("Letter [8 1/2x11 in]", "Legal [8 1/2x14 in]", - "Ledger/Tabloid [11x17 in]", "Executive [7 1/2x10 in]", - "A2 [420x594 mm]", "A3 [297x420 mm]", "A4 [210x297 mm]", - "A5 [148x210 mm]", "A6 [105x148 mm]" ); +my @paperSize = ("letter [8 1/2x11 in]", "legal [8 1/2x14 in]", + "tabloid (ledger) [11x17 in]", "executive [7 1/2x10 in]", + "a2 [420x594 mm]", "a3 [297x420 mm]", "a4 [210x297 mm]", + "a5 [148x210 mm]", "a6 [105x148 mm]" ); # Tentative format: Orientation (L = Landscape, P = portrait) | Colnum | # Paper type @@ -1555,15 +2215,17 @@ sub render { my $helper = Apache::lonhelper::getHelper(); my $result = ''; my $var = $self->{'variable'}; - + my $PageLayout=&mt('Page layout'); + my $NumberOfColumns=&mt('Number of columns'); + my $PaperType=&mt('Paper type'); $result .= < - - - + + +
Page layoutNumber of columnsPaper type$PageLayout$NumberOfColumns$PaperType
@@ -1586,16 +2248,20 @@ STATEHTML $result .= "\n"; $result .= "
"; return $result; } @@ -1710,7 +2376,7 @@ sub render {

Hint: Some instructors like to leave scratch space for the student by -making the width much smaller then the width of the page.

+making the width much smaller than the width of the page.

ELEMENTHTML 500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.