Diff for /loncom/interface/lonprintout.pm between versions 1.278 and 1.292

version 1.278, 2004/02/17 16:24:24 version 1.292, 2004/04/20 06:11:49
Line 89  sub character_chart { Line 89  sub character_chart {
     $result =~ s/&\#0?58;/:/g;      $result =~ s/&\#0?58;/:/g;
     $result =~ s/&\#0?59;/;/g;      $result =~ s/&\#0?59;/;/g;
     $result =~ s/&(\#0?60|lt|\#139);/\$<\$/g;      $result =~ s/&(\#0?60|lt|\#139);/\$<\$/g;
     $result =~ s/&\#0?61;/\$=\$/g;      $result =~ s/&\#0?61;/\\ensuremath\{=\}/g;
     $result =~ s/&(\#0?62|gt|\#155);/\$>\$/g;      $result =~ s/&(\#0?62|gt|\#155);/\\ensuremath\{>\}/g;
     $result =~ s/&\#0?63;/\?/g;      $result =~ s/&\#0?63;/\?/g;
     $result =~ s/&\#0?65;/A/g;      $result =~ s/&\#0?65;/A/g;
     $result =~ s/&\#0?66;/B/g;      $result =~ s/&\#0?66;/B/g;
Line 119  sub character_chart { Line 119  sub character_chart {
     $result =~ s/&\#0?89;/Y/g;      $result =~ s/&\#0?89;/Y/g;
     $result =~ s/&\#0?90;/Z/g;      $result =~ s/&\#0?90;/Z/g;
     $result =~ s/&\#0?91;/[/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?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?95|138|154);/\\underline{\\makebox[2mm]{\\strut}}/g;
     $result =~ s/&\#(0?96|145);/\`/g;      $result =~ s/&\#(0?96|145);/\`/g;
     $result =~ s/&\#0?97;/a/g;      $result =~ s/&\#0?97;/a/g;
Line 156  sub character_chart { Line 156  sub character_chart {
     $result =~ s/&\#126;/\~/g;      $result =~ s/&\#126;/\~/g;
     $result =~ s/&\#131;/\\textflorin /g;      $result =~ s/&\#131;/\\textflorin /g;
     $result =~ s/&\#132;/\"/g;      $result =~ s/&\#132;/\"/g;
     $result =~ s/&\#133;/\$\\ldots\$/g;      $result =~ s/&\#133;/\\ensuremath\{\\ldots\}/g;
     $result =~ s/&\#134;/\$\\dagger\$/g;      $result =~ s/&\#134;/\\ensuremath\{\\dagger\}/g;
     $result =~ s/&\#135;/\$\\ddagger\$/g;      $result =~ s/&\#135;/\\ensuremath\{\\ddagger\}/g;
     $result =~ s/&\#137;/\\textperthousand /g;      $result =~ s/&\#137;/\\textperthousand /g;
     $result =~ s/&\#140;/{\\OE}/g;      $result =~ s/&\#140;/{\\OE}/g;
     $result =~ s/&\#147;/\`\`/g;      $result =~ s/&\#147;/\`\`/g;
     $result =~ s/&\#148;/\'\'/g;      $result =~ s/&\#148;/\'\'/g;
     $result =~ s/&\#149;/\$\\bullet\$/g;      $result =~ s/&\#149;/\\ensuremath\{\\bullet\}/g;
     $result =~ s/&\#150;/--/g;      $result =~ s/&\#150;/--/g;
     $result =~ s/&\#151;/---/g;      $result =~ s/&\#151;/---/g;
     $result =~ s/&\#152;/\$\\sim\$/g;      $result =~ s/&\#152;/\\ensuremath\{\\sim\}/g;
     $result =~ s/&\#153;/\\texttrademark /g;      $result =~ s/&\#153;/\\texttrademark /g;
     $result =~ s/&\#156;/\\oe/g;      $result =~ s/&\#156;/\\oe/g;
     $result =~ s/&\#159;/\\\"Y/g;      $result =~ s/&\#159;/\\\"Y/g;
     $result =~ s/&(\#160|nbsp);//g;      $result =~ s/&(\#160|nbsp);/~/g;
     $result =~ s/&(\#161|iexcl);/!\`/g;      $result =~ s/&(\#161|iexcl);/!\`/g;
     $result =~ s/&(\#162|cent);/\\textcent /g;      $result =~ s/&(\#162|cent);/\\textcent /g;
     $result =~ s/&(\#163|pound);/\\pounds /g;       $result =~ s/&(\#163|pound);/\\pounds /g; 
Line 181  sub character_chart { Line 181  sub character_chart {
     $result =~ s/&(\#168|uml);/\\texthighdieresis /g;      $result =~ s/&(\#168|uml);/\\texthighdieresis /g;
     $result =~ s/&(\#169|copy);/\\copyright /g;      $result =~ s/&(\#169|copy);/\\copyright /g;
     $result =~ s/&(\#170|ordf);/\\textordfeminine /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/&(\#173|shy);/ - /g;
     $result =~ s/&(\#174|reg);/\\textregistered /g;      $result =~ s/&(\#174|reg);/\\textregistered /g;
     $result =~ s/&(\#175|macr);/\$^{-}\$/g;      $result =~ s/&(\#175|macr);/\\ensuremath\{^{-}\}/g;
     $result =~ s/&(\#176|deg);/\$^{\\circ}\$/g;      $result =~ s/&(\#176|deg);/\\ensuremath\{^{\\circ}\}/g;
     $result =~ s/&(\#177|plusmn);/\$\\pm\$/g;      $result =~ s/&(\#177|plusmn);/\\ensuremath\{\\pm\}/g;
     $result =~ s/&(\#178|sup2);/\$^2\$/g;      $result =~ s/&(\#178|sup2);/\\ensuremath\{^2\}/g;
     $result =~ s/&(\#179|sup3);/\$^3\$/g;      $result =~ s/&(\#179|sup3);/\\ensuremath\{^3\}/g;
     $result =~ s/&(\#180|acute);/\\textacute /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/&(\#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/&(\#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/&(\#186|ordm);/\\textordmasculine /g;
     $result =~ s/&(\#188|frac14);/\\textonequarter /g;      $result =~ s/&(\#188|frac14);/\\textonequarter /g;
     $result =~ s/&(\#189|frac12);/\\textonehalf /g;      $result =~ s/&(\#189|frac12);/\\textonehalf /g;
Line 222  sub character_chart { Line 222  sub character_chart {
     $result =~ s/&(\#212|Ocirc);/\\^{O}/g;      $result =~ s/&(\#212|Ocirc);/\\^{O}/g;
     $result =~ s/&(\#213|Otilde);/\\~{O}/g;      $result =~ s/&(\#213|Otilde);/\\~{O}/g;
     $result =~ s/&(\#214|Ouml);/\\\"{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/&(\#216|Oslash);/{\\O}/g;
     $result =~ s/&(\#217|Ugrave);/\\\`{U}/g;          $result =~ s/&(\#217|Ugrave);/\\\`{U}/g;    
     $result =~ s/&(\#218|Uacute);/\\\'{U}/g;      $result =~ s/&(\#218|Uacute);/\\\'{U}/g;
Line 246  sub character_chart { Line 246  sub character_chart {
     $result =~ s/&(\#237|iacute);/\\\'{i}/g;      $result =~ s/&(\#237|iacute);/\\\'{i}/g;
     $result =~ s/&(\#238|icirc);/\\^{i}/g;      $result =~ s/&(\#238|icirc);/\\^{i}/g;
     $result =~ s/&(\#239|iuml);/\\\"{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/&(\#241|ntilde);/\\~{n}/g;
     $result =~ s/&(\#242|ograve);/\\\`{o}/g;      $result =~ s/&(\#242|ograve);/\\\`{o}/g;
     $result =~ s/&(\#243|oacute);/\\\'{o}/g;      $result =~ s/&(\#243|oacute);/\\\'{o}/g;
     $result =~ s/&(\#244|ocirc);/\\^{o}/g;      $result =~ s/&(\#244|ocirc);/\\^{o}/g;
     $result =~ s/&(\#245|otilde);/\\~{o}/g;      $result =~ s/&(\#245|otilde);/\\~{o}/g;
     $result =~ s/&(\#246|ouml);/\\\"{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/&(\#248|oslash);/{\\o}/g;
     $result =~ s/&(\#249|ugrave);/\\\`{u}/g;       $result =~ s/&(\#249|ugrave);/\\\`{u}/g; 
     $result =~ s/&(\#250|uacute);/\\\'{u}/g;      $result =~ s/&(\#250|uacute);/\\\'{u}/g;
Line 261  sub character_chart { Line 261  sub character_chart {
     $result =~ s/&(\#252|uuml);/\\\"{u}/g;      $result =~ s/&(\#252|uuml);/\\\"{u}/g;
     $result =~ s/&(\#253|yacute);/\\\'{y}/g;      $result =~ s/&(\#253|yacute);/\\\'{y}/g;
     $result =~ s/&(\#255|yuml);/\\\"{y}/g;      $result =~ s/&(\#255|yuml);/\\\"{y}/g;
     $result =~ s/&\#952;/\$\\theta\$/g;      $result =~ s/&\#952;/\\ensuremath\{\\theta\}/g;
 #Greek Alphabet  #Greek Alphabet
     $result =~ s/&(alpha|\#945);/\$\\alpha \$/g;      $result =~ s/&(alpha|\#945);/\\ensuremath\{\\alpha\}/g;
     $result =~ s/&(beta|\#946);/\$\\beta \$/g;      $result =~ s/&(beta|\#946);/\\ensuremath\{\\beta\}/g;
     $result =~ s/&(gamma|\#947);/\$\\gamma \$/g;      $result =~ s/&(gamma|\#947);/\\ensuremath\{\\gamma\}/g;
     $result =~ s/&(delta|\#948);/\$\\delta \$/g;      $result =~ s/&(delta|\#948);/\\ensuremath\{\\delta\}/g;
     $result =~ s/&(epsilon|\#949);/\$\\epsilon \$/g;      $result =~ s/&(epsilon|\#949);/\\ensuremath\{\\epsilon\}/g;
     $result =~ s/&(zeta|\#950);/\$\\zeta \$/g;      $result =~ s/&(zeta|\#950);/\\ensuremath\{\\zeta\}/g;
     $result =~ s/&(eta|\#951);/\$\\eta \$/g;      $result =~ s/&(eta|\#951);/\\ensuremath\{\\eta\}/g;
     $result =~ s/&(theta|\#952);/\$\\theta \$/g;      $result =~ s/&(theta|\#952);/\\ensuremath\{\\theta\}/g;
     $result =~ s/&(iota|\#953);/\$\\iota \$/g;      $result =~ s/&(iota|\#953);/\\ensuremath\{\\iota\}/g;
     $result =~ s/&(kappa|\#954);/\$\\kappa \$/g;      $result =~ s/&(kappa|\#954);/\\ensuremath\{\\kappa\}/g;
     $result =~ s/&(lambda|\#955);/\$\\lambda \$/g;      $result =~ s/&(lambda|\#955);/\\ensuremath\{\\lambda\}/g;
     $result =~ s/&(mu|\#956);/\$\\mu \$/g;      $result =~ s/&(mu|\#956);/\\ensuremath\{\\mu\}/g;
     $result =~ s/&(nu|\#957);/\$\\nu \$/g;      $result =~ s/&(nu|\#957);/\\ensuremath\{\\nu\}/g;
     $result =~ s/&(xi|\#958);/\$\\xi \$/g;      $result =~ s/&(xi|\#958);/\\ensuremath\{\\xi\}/g;
     $result =~ s/&(omicron|\#959);/o/g;      $result =~ s/&(omicron|\#959);/o/g;
     $result =~ s/&(pi|\#960);/\$\\pi \$/g;      $result =~ s/&(pi|\#960);/\\ensuremath\{\\pi\}/g;
     $result =~ s/&(rho|\#961);/\$\\rho \$/g;      $result =~ s/&(rho|\#961);/\\ensuremath\{\\rho\}/g;
     $result =~ s/&(sigma|\#963);/\$\\sigma \$/g;      $result =~ s/&(sigma|\#963);/\\ensuremath\{\\sigma\}/g;
     $result =~ s/&(tau|\#964);/\$\\tau \$/g;      $result =~ s/&(tau|\#964);/\\ensuremath\{\\tau\}/g;
     $result =~ s/&(upsilon|\#965);/\$\\upsilon \$/g;      $result =~ s/&(upsilon|\#965);/\\ensuremath\{\\upsilon\}/g;
     $result =~ s/&(phi|\#966);/\$\\phi \$/g;      $result =~ s/&(phi|\#966);/\\ensuremath\{\\phi\}/g;
     $result =~ s/&(chi|\#967);/\$\\chi \$/g;      $result =~ s/&(chi|\#967);/\\ensuremath\{\\chi\}/g;
     $result =~ s/&(psi|\#968);/\$\\psi \$/g;      $result =~ s/&(psi|\#968);/\\ensuremath\{\\psi\}/g;
     $result =~ s/&(omega|\#969);/\$\\omega \$/g;      $result =~ s/&(omega|\#969);/\\ensuremath\{\\omega\}/g;
     $result =~ s/&(thetasym|\#977);/\$\\vartheta \$/g;      $result =~ s/&(thetasym|\#977);/\\ensuremath\{\\vartheta\}/g;
     $result =~ s/&(piv|\#982);/\$\\varpi \$/g;      $result =~ s/&(piv|\#982);/\\ensuremath\{\\varpi\}/g;
     $result =~ s/&(Alpha|\#913);/A/g;      $result =~ s/&(Alpha|\#913);/A/g;
     $result =~ s/&(Beta|\#914);/B/g;      $result =~ s/&(Beta|\#914);/B/g;
     $result =~ s/&(Gamma|\#915);/\$\\Gamma \$/g;      $result =~ s/&(Gamma|\#915);/\\ensuremath\{\\Gamma\}/g;
     $result =~ s/&(Delta|\#916);/\$\\Delta \$/g;      $result =~ s/&(Delta|\#916);/\\ensuremath\{\\Delta\}/g;
     $result =~ s/&(Epsilon|\#917);/E/g;      $result =~ s/&(Epsilon|\#917);/E/g;
     $result =~ s/&(Zeta|\#918);/Z/g;      $result =~ s/&(Zeta|\#918);/Z/g;
     $result =~ s/&(Eta|\#919);/H/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/&(Iota|\#921);/I/g;
     $result =~ s/&(Kappa|\#922);/K/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/&(Mu|\#924);/M/g;
     $result =~ s/&(Nu|\#925);/N/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/&(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/&(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/&(Tau|\#932);/T/g;
     $result =~ s/&(Upsilon|\#933);/\$\\Upsilon \$/g;      $result =~ s/&(Upsilon|\#933);/\\ensuremath\{\\Upsilon\}/g;
     $result =~ s/&(Phi|\#934);/\$\\Phi \$/g;      $result =~ s/&(Phi|\#934);/\\ensuremath\{\\Phi\}/g;
     $result =~ s/&(Chi|\#935);/X/g;      $result =~ s/&(Chi|\#935);/X/g;
     $result =~ s/&(Psi|\#936);/\$\\Psi \$/g;      $result =~ s/&(Psi|\#936);/\\ensuremath\{\\Psi\}/g;
     $result =~ s/&(Omega|\#937);/\$\\Omega \$/g;      $result =~ s/&(Omega|\#937);/\\ensuremath\{\\Omega\}/g;
 #Arrows (extended HTML 4.01)  #Arrows (extended HTML 4.01)
     $result =~ s/&(larr|\#8592);/\$\\leftarrow \$/g;      $result =~ s/&(larr|\#8592);/\\ensuremath\{\\leftarrow\}/g;
     $result =~ s/&(uarr|\#8593);/\$\\uparrow \$/g;      $result =~ s/&(uarr|\#8593);/\\ensuremath\{\\uparrow\}/g;
     $result =~ s/&(rarr|\#8594);/\$\\rightarrow \$/g;      $result =~ s/&(rarr|\#8594);/\\ensuremath\{\\rightarrow\}/g;
     $result =~ s/&(darr|\#8595);/\$\\downarrow \$/g;      $result =~ s/&(darr|\#8595);/\\ensuremath\{\\downarrow\}/g;
     $result =~ s/&(harr|\#8596);/\$\\leftrightarrow \$/g;      $result =~ s/&(harr|\#8596);/\\ensuremath\{\\leftrightarrow\}/g;
     $result =~ s/&(lArr|\#8656);/\$\\Leftarrow \$/g;      $result =~ s/&(lArr|\#8656);/\\ensuremath\{\\Leftarrow\}/g;
     $result =~ s/&(uArr|\#8657);/\$\\Uparrow \$/g;      $result =~ s/&(uArr|\#8657);/\\ensuremath\{\\Uparrow\}/g;
     $result =~ s/&(rArr|\#8658);/\$\\Rightarrow \$/g;      $result =~ s/&(rArr|\#8658);/\\ensuremath\{\\Rightarrow\}/g;
     $result =~ s/&(dArr|\#8659);/\$\\Downarrow \$/g;      $result =~ s/&(dArr|\#8659);/\\ensuremath\{\\Downarrow\}/g;
     $result =~ s/&(hArr|\#8660);/\$\\Leftrightarrow \$/g;      $result =~ s/&(hArr|\#8660);/\\ensuremath\{\\Leftrightarrow\}/g;
 #Mathematical Operators (extended HTML 4.01)  #Mathematical Operators (extended HTML 4.01)
     $result =~ s/&(forall|\#8704);/\$\\forall \$/g;      $result =~ s/&(forall|\#8704);/\\ensuremath\{\\forall\}/g;
     $result =~ s/&(part|\#8706);/\$\\partial \$/g;      $result =~ s/&(part|\#8706);/\\ensuremath\{\\partial\}/g;
     $result =~ s/&(exist|\#8707);/\$\\exists \$/g;      $result =~ s/&(exist|\#8707);/\\ensuremath\{\\exists\}/g;
     $result =~ s/&(empty|\#8709);/\$\\emptyset \$/g;      $result =~ s/&(empty|\#8709);/\\ensuremath\{\\emptyset\}/g;
     $result =~ s/&(nabla|\#8711);/\$\\nabla \$/g;      $result =~ s/&(nabla|\#8711);/\\ensuremath\{\\nabla\}/g;
     $result =~ s/&(isin|\#8712);/\$\\in \$/g;      $result =~ s/&(isin|\#8712);/\\ensuremath\{\\in\}/g;
     $result =~ s/&(notin|\#8713);/\$\\notin \$/g;      $result =~ s/&(notin|\#8713);/\\ensuremath\{\\notin\}/g;
     $result =~ s/&(ni|\#8715);/\$\\ni \$/g;      $result =~ s/&(ni|\#8715);/\\ensuremath\{\\ni\}/g;
     $result =~ s/&(prod|\#8719);/\$\\prod \$/g;      $result =~ s/&(prod|\#8719);/\\ensuremath\{\\prod\}/g;
     $result =~ s/&(sum|\#8721);/\$\\sum \$/g;      $result =~ s/&(sum|\#8721);/\\ensuremath\{\\sum\}/g;
     $result =~ s/&(minus|\#8722);/\$-\$/g;      $result =~ s/&(minus|\#8722);/\\ensuremath\{-\}/g;
     $result =~ s/&(lowast|\#8727);/\$*\$/g;      $result =~ s/&(lowast|\#8727);/\\ensuremath\{*\}/g;
     $result =~ s/&(radic|\#8730);/\$\\surd \$/g;      $result =~ s/&(radic|\#8730);/\\ensuremath\{\\surd\}/g;
     $result =~ s/&(prop|\#8733);/\$\\propto \$/g;      $result =~ s/&(prop|\#8733);/\\ensuremath\{\\propto\}/g;
     $result =~ s/&(infin|\#8734);/\$\\infty \$/g;      $result =~ s/&(infin|\#8734);/\\ensuremath\{\\infty\}/g;
     $result =~ s/&(ang|\#8736);/\$\\angle \$/g;      $result =~ s/&(ang|\#8736);/\\ensuremath\{\\angle\}/g;
     $result =~ s/&(and|\#8743);/\$\\wedge \$/g;      $result =~ s/&(and|\#8743);/\\ensuremath\{\\wedge\}/g;
     $result =~ s/&(or|\#8744);/\$\\vee \$/g;      $result =~ s/&(or|\#8744);/\\ensuremath\{\\vee\}/g;
     $result =~ s/&(cap|\#8745);/\$\\cap \$/g;      $result =~ s/&(cap|\#8745);/\\ensuremath\{\\cap\}/g;
     $result =~ s/&(cup|\#8746);/\$\\cup \$/g;      $result =~ s/&(cup|\#8746);/\\ensuremath\{\\cup\}/g;
     $result =~ s/&(int|\#8747);/\$\\int \$/g;      $result =~ s/&(int|\#8747);/\\ensuremath\{\\int\}/g;
     $result =~ s/&(sim|\#8764);/\$\\sim \$/g;      $result =~ s/&(sim|\#8764);/\\ensuremath\{\\sim\}/g;
     $result =~ s/&(cong|\#8773);/\$\\cong \$/g;      $result =~ s/&(cong|\#8773);/\\ensuremath\{\\cong\}/g;
     $result =~ s/&(asymp|\#8776);/\$\\approx \$/g;      $result =~ s/&(asymp|\#8776);/\\ensuremath\{\\approx\}/g;
     $result =~ s/&(ne|\#8800);/\$\\not= \$/g;      $result =~ s/&(ne|\#8800);/\\ensuremath\{\\not=\}/g;
     $result =~ s/&(equiv|\#8801);/\$\\equiv \$/g;      $result =~ s/&(equiv|\#8801);/\\ensuremath\{\\equiv\}/g;
     $result =~ s/&(le|\#8804);/\$\\leq \$/g;      $result =~ s/&(le|\#8804);/\\ensuremath\{\\leq\}/g;
     $result =~ s/&(ge|\#8805);/\$\\geq \$/g;      $result =~ s/&(ge|\#8805);/\\ensuremath\{\\geq\}/g;
     $result =~ s/&(sub|\#8834);/\$\\subset \$/g;      $result =~ s/&(sub|\#8834);/\\ensuremath\{\\subset\}/g;
     $result =~ s/&(sup|\#8835);/\$\\supset \$/g;      $result =~ s/&(sup|\#8835);/\\ensuremath\{\\supset\}/g;
     $result =~ s/&(nsub|\#8836);/\$\\not\\subset \$/g;      $result =~ s/&(nsub|\#8836);/\\ensuremath\{\\not\\subset\}/g;
     $result =~ s/&(sube|\#8838);/\$\\subseteq \$/g;      $result =~ s/&(sube|\#8838);/\\ensuremath\{\\subseteq\}/g;
     $result =~ s/&(supe|\#8839);/\$\\supseteq \$/g;      $result =~ s/&(supe|\#8839);/\\ensuremath\{\\supseteq\}/g;
     $result =~ s/&(oplus|\#8853);/\$\\oplus \$/g;      $result =~ s/&(oplus|\#8853);/\\ensuremath\{\\oplus\}/g;
     $result =~ s/&(otimes|\#8855);/\$\\otimes \$/g;      $result =~ s/&(otimes|\#8855);/\\ensuremath\{\\otimes\}/g;
     $result =~ s/&(perp|\#8869);/\$\\perp \$/g;      $result =~ s/&(perp|\#8869);/\\ensuremath\{\\perp\}/g;
     $result =~ s/&(sdot|\#8901);/\$\\cdot \$/g;      $result =~ s/&(sdot|\#8901);/\\ensuremath\{\\cdot\}/g;
 #Geometric Shapes (extended HTML 4.01)  #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)  #Miscellaneous Symbols (extended HTML 4.01)
     $result =~ s/&(spades|\#9824);/\$\\spadesuit \$/g;      $result =~ s/&(spades|\#9824);/\\ensuremath\{\\spadesuit\}/g;
     $result =~ s/&(clubs|\#9827);/\$\\clubsuit \$/g;      $result =~ s/&(clubs|\#9827);/\\ensuremath\{\\clubsuit\}/g;
     $result =~ s/&(hearts|\#9829);/\$\\heartsuit \$/g;      $result =~ s/&(hearts|\#9829);/\\ensuremath\{\\heartsuit\}/g;
     $result =~ s/&(diams|\#9830);/\$\\diamondsuit \$/g;      $result =~ s/&(diams|\#9830);/\\ensuremath\{\\diamondsuit\}/g;
     return $result;      return $result;
 }  }
   
Line 661  sub recalcto_mm { Line 661  sub recalcto_mm {
     return $LaTeXwidth;      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 output_data {  sub output_data {
     my ($r,$helper,$rparmhash) = @_;      my ($r,$helper,$rparmhash) = @_;
     my %parmhash = %$rparmhash;      my %parmhash = %$rparmhash;
Line 739  ENDPART Line 750  ENDPART
     my $put_result = &Apache::lonnet::put('environment',{'construct.style'=>$helper->{'VARS'}->{'style_file'}},$dom,$user);      my $put_result = &Apache::lonnet::put('environment',{'construct.style'=>$helper->{'VARS'}->{'style_file'}},$dom,$user);
  }   }
  my %form;   my %form;
                   if ($helper->{'VARS'}->{'probstatus'} eq 'exam') {$form{'problemtype'}='exam';}
  $form{'grade_target'}='tex';   $form{'grade_target'}='tex';
  if ($helper->{'VARS'}->{'pagesize.width'}=~/\d+/ &&   $form{'textwidth'}=&get_textwidth($helper,$LaTeXwidth);
                     $helper->{'VARS'}->{'pagesize.widthunit'}=~/\w+/) {  
     $form{'textwidth'}=&recalcto_mm($helper->{'VARS'}->{'pagesize.width'}.' '.$helper->{'VARS'}->{'pagesize.widthunit'});  
  } else {  
     $form{'textwidth'}=$LaTeXwidth;  
  }  
  $form{'problem_split'}=$parmhash{'problem_stream_switch'};   $form{'problem_split'}=$parmhash{'problem_stream_switch'};
  $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};   $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
  if ($helper->{'VARS'}->{'curseed'}) {   if ($helper->{'VARS'}->{'curseed'}) {
Line 810  ENDPART Line 817  ENDPART
     if ($helper->{'VARS'}->{'ANSWER_TYPE'} ne 'only') {      if ($helper->{'VARS'}->{'ANSWER_TYPE'} ne 'only') {
  my %form;   my %form;
  $form{'grade_target'}='tex';   $form{'grade_target'}='tex';
  if ($helper->{'VARS'}->{'pagesize.width'}=~/\d+/ &&   $form{'textwidth'}=&get_textwidth($helper,$LaTeXwidth);
     $helper->{'VARS'}->{'pagesize.widthunit'}=~/\w+/) {  
     $form{'textwidth'}=&recalcto_mm($helper->{'VARS'}->{'pagesize.width'}.' '.$helper->{'VARS'}->{'pagesize.widthunit'});  
  } else {  
     $form{'textwidth'}=$LaTeXwidth;  
  }  
  $form{'problem_split'}=$parmhash{'problem_stream_switch'};   $form{'problem_split'}=$parmhash{'problem_stream_switch'};
  $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};   $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
  $form{'rndseed'}=$rndseed;   $form{'rndseed'}=$rndseed;
Line 861  ENDPART Line 863  ENDPART
  } elsif ($currentURL=~/\/smppg$/) {    } elsif ($currentURL=~/\/smppg$/) { 
  my %form;   my %form;
  $form{'grade_target'}='tex';   $form{'grade_target'}='tex';
  if ($helper->{'VARS'}->{'pagesize.width'}=~/\d+/ &&   $form{'textwidth'}=&get_textwidth($helper,$LaTeXwidth);
                     $helper->{'VARS'}->{'pagesize.widthunit'}=~/\w+/) {  
     $form{'textwidth'}=&recalcto_mm($helper->{'VARS'}->{'pagesize.width'}.' '.$helper->{'VARS'}->{'pagesize.widthunit'});  
  } else {  
     $form{'textwidth'}=$LaTeXwidth;  
  }  
  $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};   $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
  my $texversion=&Apache::lonnet::ssi($currentURL,%form);   my $texversion=&Apache::lonnet::ssi($currentURL,%form);
  $result .= $texversion;   $result .= $texversion;
Line 888  ENDPART Line 885  ENDPART
         #-- produce an output string          #-- produce an output string
  my %form=();      my %form=();   
  $form{'grade_target'}='tex';   $form{'grade_target'}='tex';
  if ($helper->{'VARS'}->{'pagesize.width'}=~/\d+/ &&   $form{'textwidth'}=&get_textwidth($helper,$LaTeXwidth);
     $helper->{'VARS'}->{'pagesize.widthunit'}=~/\w+/) {  
     $form{'textwidth'}=&recalcto_mm($helper->{'VARS'}->{'pagesize.width'}.' '.$helper->{'VARS'}->{'pagesize.widthunit'});  
  } else {  
     $form{'textwidth'}=$LaTeXwidth;  
  }  
  $form{'problem_split'}=$parmhash{'problem_stream_switch'};   $form{'problem_split'}=$parmhash{'problem_stream_switch'};
  $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};   $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
  my $flag_latex_header_remove = 'NO';   my $flag_latex_header_remove = 'NO';
Line 974  ENDPART Line 966  ENDPART
  &Apache::lonnet::delenv('form.counter');   &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}';   $result .= '\end{document}';
      } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students') || ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_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         #-- prints assignments for whole class or for selected students  
    my $type;
  if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students') {   if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students') {
      $selectionmade=5;       $selectionmade=5;
        $type='problems';
  } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_students') {   } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_students') {
      $selectionmade=8;       $selectionmade=8;
        $type='resources';
  }   }
  my @students=split /\|\|\|/, $helper->{'VARS'}->{'STUDENTS'};   my @students=split /\|\|\|/, $helper->{'VARS'}->{'STUDENTS'};
          if ($helper->{'VARS'}->{'NUMBER_TO_PRINT'} eq '0' ||           if ($helper->{'VARS'}->{'NUMBER_TO_PRINT'} eq '0' ||
Line 990  ENDPART Line 986  ENDPART
  #loop over students   #loop over students
  my $flag_latex_header_remove = 'NO';    my $flag_latex_header_remove = 'NO'; 
  my %moreenv;   my %moreenv;
  if ($helper->{'VARS'}->{'pagesize.width'}=~/\d+/ &&   $moreenv{'textwidth'}=&get_textwidth($helper,$LaTeXwidth);
      $helper->{'VARS'}->{'pagesize.widthunit'}=~/\w+/) {  
      $moreenv{'textwidth'}=&recalcto_mm($helper->{'VARS'}->{'pagesize.width'}.' '.$helper->{'VARS'}->{'pagesize.widthunit'});  
  } else {  
      $moreenv{'textwidth'}=$LaTeXwidth;  
  }  
  &Apache::lonnet::appenv(%moreenv);  
  my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,'Print Status','Class Print Status',$#students+1);   my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,'Print Status','Class Print Status',$#students+1);
  my $student_counter=-1;   my $student_counter=-1;
  foreach my $person (@students) {   foreach my $person (@students) {
      $student_counter++;       $student_counter++;
     my $current_output = '';        my $i=int($student_counter/$helper->{'VARS'}{'NUMBER_TO_PRINT'});
     my ($username,$userdomain,$usersection) = split /:/,$person;       my ($output,$fullname)=&print_resources($r,$helper,$person,$type,\%moreenv,\@master_seq,$flag_latex_header_remove);
     my $fullname = &get_name($username,$userdomain);       $print_array[$i].=$output;
        $student_names[$i].=$person.':'.$fullname.'_END_';
     if ($parmhash{'anonymous_quiz'}=~/yes/) {$fullname=' ';} #put here something reasonable for anonymous exams or quiz       &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,&mt('last student').' '.$fullname);
             #goes through all resources, checks if they are available for current student, and produces output          $flag_latex_header_remove = 'YES';
     &Apache::lonnet::delenv('form.counter');   }
     &Apache::lonxml::init_counter();   &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
     foreach my $curresline (@master_seq)  {   $result .= $print_array[0].'  \end{document}';
  if ((($curresline=~ m/\.(problem|exam|quiz|assess|survey|form|library)$/) && ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students')) || ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_students')) {       } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_anon')     ||
     my ($map,$id,$res_url) = &Apache::lonnet::decode_symb($curresline);        ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_anon')  ) { 
     if (&Apache::lonnet::allowed('bre',$res_url)) {   my $cdom =$ENV{'course.'.$ENV{'request.course.id'}.'.domain'};
  my $rendered = &Apache::loncommon::get_student_view($curresline,$username,$userdomain,   my $cnum =$ENV{'course.'.$ENV{'request.course.id'}.'.num'};
                                                                         $ENV{'request.course.id'},'tex');   my $num_todo=$helper->{'VARS'}->{'NUMBER_TO_PRINT_TOTAL'};
  my $lonidsdir=$r->dir_config('lonIDsDir');   my $code_name=$helper->{'VARS'}->{'ANON_CODE_STORAGE_NAME'};
  my $envfile=$ENV{'user.environment'};   my $old_name=$helper->{'VARS'}->{'REUSE_OLD_CODES'};
  $envfile=~/\/([^\/]+)\.id$/;   my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'};
  $envfile=$1;   my ($type) = split(/_/,$helper->{'VARS'}->{'PRINT_TYPE'});
  &Apache::lonnet::transfer_profile_to_env($lonidsdir,$envfile);   my $flag_latex_header_remove = 'NO'; 
  my $current_counter=$ENV{'form.counter'};   my %moreenv = ('textwidth' => &get_textwidth($helper,$LaTeXwidth));
  if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') ||   my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,'Print Status','Class Print Status',$num_todo,'inline');
    ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) {   my $seed=time+($$<<16)+($$);
     my %form;   my @allcodes;
     $form{'answer_output_mode'}='tex';   if ($old_name) {
     $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};       my %result=&Apache::lonnet::get('CODEs',[$old_name],$cdom,$cnum);
     my $ansrendered = &Apache::loncommon::get_student_answers($curresline,$username,$userdomain,$ENV{'request.course.id'},%form);       @allcodes=split(',',$result{$old_name});
     &Apache::lonnet::appenv(('form.counter' => $current_counter));   } else {
     if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {       my %allcodes;
  $rendered=~s/(\\keephidden{ENDOFPROBLEM})/$ansrendered$1/;       for (my $i=0;$i<$num_todo;$i++) {
     } else {   $moreenv{'CODE'}=&get_CODE(\%allcodes,$i,$seed,'6');
  $rendered=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});       }
  $rendered.='\vskip 0 mm \noindent\textbf{'.&Apache::lonnet::gettitle($curresline).'}\vskip 0 mm ';       if ($code_name) {
  $rendered.=&path_to_problem ($curresline,$LaTeXwidth);   &Apache::lonnet::put('CODEs',
  $rendered.='\vskip 1 mm '.$ansrendered;        {$code_name =>join(',',keys(%allcodes))},
     }        $cdom,$cnum);
  }       }
  if ($flag_latex_header_remove eq 'YES') {       @allcodes=keys(%allcodes);
     $rendered = &latex_header_footer_remove($rendered);   }
  } else {   my $i=0;
     $rendered =~ s/\\end{document}//;   foreach my $code (sort(@allcodes)) {
  }       $moreenv{'CODE'}=&num_to_letters($code);
  $current_output .= $rendered;       my ($output,$fullname)=
     }   &print_resources($r,$helper,'anonymous',$type,\%moreenv,
     $flag_latex_header_remove = 'YES';    \@master_seq,$flag_latex_header_remove);
  }       $print_array[$i].=$output;
     }       &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,
     my $courseidinfo = &get_course();         &mt('last assignment').' '.$fullname);
     if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo }       $flag_latex_header_remove = 'YES';
             if ($usersection ne '') {$courseidinfo.=' - Sec. '.$usersection}       $i++;
     my $currentassignment=&Apache::lonxml::latex_special_symbols($helper->{VARS}->{'assignment'},'header');   }
     if ($current_output=~/\\documentclass/) {   &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
  $current_output =~ s/\\begin{document}/\\setlength{\\topmargin}{1cm} \\begin{document}\\noindent\\lhead{\\textit{\\textbf{$fullname}}$courseidinfo \\hfill \\thepage \\\\ \\textit{$currentassignment}}\\vskip 3 mm /;   $result .= $print_array[0].'  \end{document}';
     } else {       } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_from_directory') {      
  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;  
     }  
             $print_array[int($student_counter/$helper->{'VARS'}->{'NUMBER_TO_PRINT'})].=$current_output;  
             $student_names[int($student_counter/$helper->{'VARS'}->{'NUMBER_TO_PRINT'})].=$person.':'.$fullname.'_END_';  
     &Apache::lonnet::delenv('form.counter');      
     &Apache::lonxml::init_counter();   
     &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,  
      &mt('last student').' '.$fullname);  
  }  
  &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);  
  $result .= $print_array[0].'  \end{document}';  
  &Apache::lonnet::delenv('form.textwidth');  
     } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_from_directory') {        
     #prints selected problems from the subdirectory       #prints selected problems from the subdirectory 
  $selectionmade = 6;   $selectionmade = 6;
         my @list_of_files=split /\|\|\|/, $helper->{'VARS'}->{'FILES'};          my @list_of_files=split /\|\|\|/, $helper->{'VARS'}->{'FILES'};
Line 1084  ENDPART Line 1059  ENDPART
     if ($urlp=~/\//) {      if ($urlp=~/\//) {
  my %form;   my %form;
  $form{'grade_target'}='tex';   $form{'grade_target'}='tex';
  if ($helper->{'VARS'}->{'pagesize.width'}=~/\d+/ &&   $form{'textwidth'}=&get_textwidth($helper,$LaTeXwidth);
                     $helper->{'VARS'}->{'pagesize.widthunit'}=~/\w+/) {  
     $form{'textwidth'}=&recalcto_mm($helper->{'VARS'}->{'pagesize.width'}.' '.$helper->{'VARS'}->{'pagesize.widthunit'});  
  } else {  
     $form{'textwidth'}=$LaTeXwidth;  
  }  
  $form{'rndseed'}=$rndseed;   $form{'rndseed'}=$rndseed;
  if ($urlp =~ m|/home/([^/]+)/public_html|) {   if ($urlp =~ m|/home/([^/]+)/public_html|) {
     $urlp =~ s|/home/([^/]*)/public_html|/~$1|;      $urlp =~ s|/home/([^/]*)/public_html|/~$1|;
Line 1213  ENDPART Line 1183  ENDPART
     } else {      } else {
  #prints resource from the construction space   #prints resource from the construction space
  $URLback='/'.$helper->{'VARS'}->{'filename'};   $URLback='/'.$helper->{'VARS'}->{'filename'};
  if ($URLback=~/([^?]+)/) {$URLback=$1;}   if ($URLback=~/([^?]+)/) {
       $URLback=$1;
       $URLback=~s|^/~|/priv/|;
    }
     }      }
   
     &Apache::lonnet::appenv('cgi.'.$identifier.'.file'   => $filename,      &Apache::lonnet::appenv('cgi.'.$identifier.'.file'   => $filename,
Line 1228  ENDPART Line 1201  ENDPART
                             'cgi.'.$identifier.'backref' => $URLback,);                              'cgi.'.$identifier.'backref' => $URLback,);
     
 $r->print(<<FINALEND);  $r->print(<<FINALEND);
 <meta http-equiv="Refresh" content="0; url=/cgi-bin/printout.pl?$identifier">  <meta http-equiv="Refresh" content="0; url=/cgi-bin/printout.pl?$identifier" />
 </body>  </body>
 </html>  </html>
 FINALEND  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;
       srand($seed);
       my $newcode;
       while(1) {
    $newcode=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)=@_;
       my $current_output = ''; 
       my ($username,$userdomain,$usersection) = split /:/,$person;
       my $fullname = &get_name($username,$userdomain);
       if ($person =~ 'anon') {
    $fullname = "CODE - ".$moreenv->{'CODE'};
       }
       #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 ( !($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)) {
    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')) {
       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);
       &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;
       }
       $remove_latex_header = 'YES';
    }
       }
       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\\lhead{\\textit{\\textbf{$fullname}}$courseidinfo \\hfill \\thepage \\\\ \\textit{$currentassignment}}\\vskip 3 mm /;
       } else {
    my $blankpages = '';
    for (my $j=0;$j<$helper->{'VARS'}->{'EMPTY_PAGES'};$j++) {$blankpages.='\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 '.$blankpages.'\setcounter{page}{1}\noindent\parbox{\minipagewidth}{\noindent\\lhead{\\textit{\\textbf{'.$fullname.'}}'.$courseidinfo.' \\hfill \\thepage \\\\ \\textit{'.$currentassignment.'}}} \vskip -5 mm '.$current_output;
       }
       return ($current_output,$fullname);
   
   }
   
 sub handler {  sub handler {
   
Line 1322  sub printHelper { Line 1381  sub printHelper {
     my $helper = Apache::lonhelper::helper->new("Printing Helper");      my $helper = Apache::lonhelper::helper->new("Printing Helper");
     $helper->declareVar('symb');      $helper->declareVar('symb');
     $helper->declareVar('postdata');          $helper->declareVar('postdata');    
     $helper->declareVar('curseed');          $helper->declareVar('curseed'); 
       $helper->declareVar('probstatus');   
     $helper->declareVar('filename');      $helper->declareVar('filename');
     $helper->declareVar('construction');      $helper->declareVar('construction');
     $helper->declareVar('assignment');      $helper->declareVar('assignment');
Line 1382  sub printHelper { Line 1442  sub printHelper {
     if (!$helper->{VARS}->{'curseed'} && $ENV{'form.curseed'}) {      if (!$helper->{VARS}->{'curseed'} && $ENV{'form.curseed'}) {
  $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 $userCanSeeHidden = Apache::lonnavmaps::advancedUser();
     my $userPriviledged = ($ENV{'request.role'}=~m/^cc\./ or      my $userPriviledged = ($ENV{'request.role'}=~m/^cc\./ or
Line 1413  sub printHelper { Line 1476  sub printHelper {
     my $paramHash;      my $paramHash;
   
     if ($resourceTitle) {      if ($resourceTitle) {
         push @{$printChoices}, ["<b><i>$resourceTitle</i></b> (what you just saw on the screen)", 'current_document', 'PAGESIZE'];          push @{$printChoices}, ["<b><i>$resourceTitle</i></b> (".&mt('what you just saw on the screen').")", 'current_document', 'PAGESIZE'];
     }      }
   
 #    $r->print($helper->{VARS}->{'postdata'});  
   
     # Useful filter strings      # Useful filter strings
     my $isProblem = '$res->is_problem()';      my $isProblem = '($res->is_problem()||$res->contains_problem) ';
     $isProblem .= ' && !$res->randomout()' if !$userCanSeeHidden;      $isProblem .= ' && !$res->randomout()' if !$userCanSeeHidden;
     my $isProblemOrMap = '$res->is_problem() || $res->is_map()';      my $isProblemOrMap = '$res->is_problem() || $res->contains_problem() || $res->is_sequence()';
     my $isNotMap = '!$res->is_map()';      my $isNotMap = '!$res->is_sequence()';
     $isNotMap .= ' && !$res->randomout()' if !$userCanSeeHidden;      $isNotMap .= ' && !$res->randomout()' if !$userCanSeeHidden;
     my $isMap = '$res->is_map()';      my $isMap = '$res->is_map()';
     my $symbFilter = '$res->symb()';      my $symbFilter = '$res->symb()';
Line 1439  sub printHelper { Line 1500  sub printHelper {
  $helper->{VARS}->{'postdata'} &&   $helper->{VARS}->{'postdata'} &&
  $helper->{VARS}->{'assignment'}) {   $helper->{VARS}->{'assignment'}) {
         # Allow problems from sequence          # Allow problems from sequence
         push @{$printChoices}, ["<b>Problems</b> in <b><i>$sequenceTitle</i></b>", 'map_problems', 'CHOOSE_PROBLEMS'];          push @{$printChoices}, ["<b>".&mt('Problems')."</b> ".&mt('in')." <b><i>$sequenceTitle</i></b>", 'map_problems', 'CHOOSE_PROBLEMS'];
         # Allow all resources from sequence          # Allow all resources from sequence
         push @{$printChoices}, ["<b>Resources</b> in <b><i>$sequenceTitle</i></b>", 'map_problems_pages', 'CHOOSE_PROBLEMS_HTML'];          push @{$printChoices}, ["<b>".&mt('Resources')."</b> ".&mt('in')." <b><i>$sequenceTitle</i></b>", 'map_problems_pages', 'CHOOSE_PROBLEMS_HTML'];
   
         my $helperFragment = <<HELPERFRAGMENT;          my $helperFragment = <<HELPERFRAGMENT;
   <state name="CHOOSE_PROBLEMS" title="Select Problem(s) to print">    <state name="CHOOSE_PROBLEMS" title="Select Problem(s) to print">
     <message>(mark them then click "next" button) <br /></message>      <message>(mark them then click "next" button) <br /></message>
     <resource variable="RESOURCES" multichoice="1" toponly='1' addstatus="1">      <resource variable="RESOURCES" multichoice="1" toponly='1' addstatus="1"
                 closeallpages="1">
       <nextstate>PAGESIZE</nextstate>        <nextstate>PAGESIZE</nextstate>
       <filterfunc>return $isProblem;</filterfunc>        <filterfunc>return $isProblem;</filterfunc>
       <mapurl>$map</mapurl>        <mapurl>$map</mapurl>
Line 1456  sub printHelper { Line 1518  sub printHelper {
   
   <state name="CHOOSE_PROBLEMS_HTML" title="Select Resource(s) to print">    <state name="CHOOSE_PROBLEMS_HTML" title="Select Resource(s) to print">
     <message>(mark them then click "next" button) <br /></message>      <message>(mark them then click "next" button) <br /></message>
     <resource variable="RESOURCES" multichoice="1" toponly='1' addstatus="1">      <resource variable="RESOURCES" multichoice="1" toponly='1' addstatus="1"
                 closeallpages="1">
       <nextstate>PAGESIZE</nextstate>        <nextstate>PAGESIZE</nextstate>
       <filterfunc>return $isNotMap;</filterfunc>        <filterfunc>return $isNotMap;</filterfunc>
       <mapurl>$map</mapurl>        <mapurl>$map</mapurl>
Line 1472  HELPERFRAGMENT Line 1535  HELPERFRAGMENT
     # problems in the course, optionally for selected students      # problems in the course, optionally for selected students
     if ($userPriviledged && ($helper->{VARS}->{'postdata'}=~/\/res\//)) {       if ($userPriviledged && ($helper->{VARS}->{'postdata'}=~/\/res\//)) { 
         push @{$printChoices}, ['<b>Problems</b> from <b>entire course</b>', 'all_problems', 'ALL_PROBLEMS'];          push @{$printChoices}, ['<b>Problems</b> from <b>entire course</b>', 'all_problems', 'ALL_PROBLEMS'];
  if ($helper->{VARS}->{'assignment'}) {           &Apache::lonxml::xmlparse($r, 'helper', <<ALL_PROBLEMS);
     push @{$printChoices}, ["<b>Problems</b> from <b><i>$sequenceTitle</i></b> for <b>selected students</b>", 'problems_for_students', 'CHOOSE_STUDENTS'];  
  }  
         &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_STUDENTS);  
   <state name="ALL_PROBLEMS" title="Select Problem(s) to print">    <state name="ALL_PROBLEMS" title="Select Problem(s) to print">
     <message>(mark them then click "next" button) <br /></message>      <message>(mark them then click "next" button) <br /></message>
     <resource variable="RESOURCES" multichoice="1"      <resource variable="RESOURCES" toponly='0' multichoice="1"
  suppressEmptySequences='1' addstatus="1">   suppressEmptySequences='0' addstatus="1" closeallpages="1">
       <nextstate>PAGESIZE</nextstate>        <nextstate>PAGESIZE</nextstate>
       <filterfunc>return $isProblemOrMap;</filterfunc>        <filterfunc>return $isProblemOrMap;</filterfunc>
       <choicefunc>return $isProblem;</choicefunc>        <choicefunc>return $isNotMap;</choicefunc>
       <valuefunc>return $symbFilter;</valuefunc>        <valuefunc>return $symbFilter;</valuefunc>
       </resource>      </resource>
     </state>    </state>
   ALL_PROBLEMS
   
   <state name="CHOOSE_STUDENTS" title="Select Students and Resources">   if ($helper->{VARS}->{'assignment'}) {
     <student multichoice='1' variable="STUDENTS" nextstate="PAGESIZE" />      push @{$printChoices}, ["<b>".&mt('Problems')."</b> ".&mt('from')." <b><i>$sequenceTitle</i></b> ".&mt('for')." <b>".&mt('selected students')."</b>", 'problems_for_students', 'CHOOSE_STUDENTS'];
     <message><br /><big><i><b>Select resources for the assignment</b></i></big><br /></message>      push @{$printChoices}, ["<b>".&mt('Problems')."</b> ".&mt('from')." <b><i>$sequenceTitle</i></b> ".&mt('for')." <b>".&mt('anonymous students')."</b>", 'problems_for_anon', 'CHOOSE_ANON1'];
     <resource variable="RESOURCES" multichoice="1" addstatus="1">   }
    my $resource_selector=<<RESOURCE_SELECTOR;
      <message><br /><big><i><b>Select resources for the assignment</b></i></big><br /></message>
       <resource variable="RESOURCES" multichoice="1" addstatus="1" 
                 closeallpages="1">
       <filterfunc>return $isProblem;</filterfunc>        <filterfunc>return $isProblem;</filterfunc>
       <mapurl>$map</mapurl>        <mapurl>$map</mapurl>
       <valuefunc>return $symbFilter;</valuefunc>        <valuefunc>return $symbFilter;</valuefunc>
Line 1501  HELPERFRAGMENT Line 1566  HELPERFRAGMENT
       <choice computer='1'>Add one empty page/column after each student\'s assignment</choice>        <choice computer='1'>Add one empty page/column after each student\'s assignment</choice>
       <choice computer='2'>Add two empty pages/column after each student\'s assignment</choice>        <choice computer='2'>Add two empty pages/column after each student\'s assignment</choice>
       <choice computer='3'>Add three empty pages/column after each student\'s assignment</choice>        <choice computer='3'>Add three empty pages/column after each student\'s assignment</choice>
       </choices>      </choices>
     </state>      <message><hr width='33%' /><b>Number of assignments printed at the same time: </b></message>
       <string variable="NUMBER_TO_PRINT" maxlength="5" size="5"><defaultvalue>"all"</defaultvalue></string>
   RESOURCE_SELECTOR
   
           &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_STUDENTS);
     <state name="CHOOSE_STUDENTS" title="Select Students and Resources">
         <student multichoice='1' variable="STUDENTS" nextstate="PAGESIZE" />
       $resource_selector
     </state>
 CHOOSE_STUDENTS  CHOOSE_STUDENTS
   
  addMessage("<hr width='33%' /><b>Number of assignments printed at the same time: </b>");   my $cdom = $ENV{'course.'.$ENV{'request.course.id'}.'.domain'};
         $paramHash = Apache::lonhelper::getParamHash();   my $cnum = $ENV{'course.'.$ENV{'request.course.id'}.'.num'};
  $paramHash->{'variable'} = 'NUMBER_TO_PRINT';             my @names=&Apache::lonnet::getkeys('CODEs',$cdom,$cnum);
  $helper->declareVar('NUMBER_TO_PRINT');            my $namechoice='<choice></choice>';
  addMessage("<input type='text' name='NUMBER_TO_PRINT.forminput' size='3' value='all' /><hr width='33%' />");   foreach my $name (@names) {
       $namechoice.='<choice computer="'.$name.'">'.$name.'</choice>';
    }
           &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_ANON1);
     <state name="CHOOSE_ANON1" title="Select Students and Resources">
       <nextstate>PAGESIZE</nextstate>
       <message><hr width='33%' /><b>Number of anonymous assignments to print?</b></message>
       <string variable="NUMBER_TO_PRINT_TOTAL" maxlength="5" size="5"></string>
       <message><br /><b>Names to store the CODEs under for later:</b></message>
       <string variable="ANON_CODE_STORAGE_NAME" maxlength="50" size="20" />
       <message><hr width='33%' /></message>
       <message><b>Reprint a set of saved CODEs:</b></message>
       <dropdown variable="REUSE_OLD_CODES">
           $namechoice
       </dropdown>
       <message><hr width='33%' /></message>
       $resource_selector
     </state>
   CHOOSE_ANON1
   
   
  if ($helper->{VARS}->{'assignment'}) {   if ($helper->{VARS}->{'assignment'}) {
     push @{$printChoices}, ["<b>Resources</b> from <b><i>$sequenceTitle</i></b> for <b>selected students</b>", 'resources_for_students', 'CHOOSE_STUDENTS1'];      push @{$printChoices}, ["<b>".&mt('Resources')."</b> ".&mt('from')." <b><i>$sequenceTitle</i></b> ".&mt('for')." <b>".&mt('selected students')."</b>", 'resources_for_students', 'CHOOSE_STUDENTS1'];
       push @{$printChoices}, ["<b>".&mt('Resources')."</b> ".&mt('from')." <b><i>$sequenceTitle</i></b> ".&mt('for')." <b>".&mt('anonymous students')."</b>", 'resources_for_anon', 'CHOOSE_ANON2'];
  }   }
  &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_STUDENTS1);      
   <state name="CHOOSE_STUDENTS1" title="Select Students and Resources">  
     <student multichoice='1' variable="STUDENTS" nextstate="PAGESIZE" />   $resource_selector=<<RESOURCE_SELECTOR;
     <message><br /><big><i><b>Select resources for the assignment</b></i></big><br /></message>      <message><br /><big><i><b>Select resources for the assignment</b></i></big><br /></message>
     <resource variable="RESOURCES" multichoice="1" addstatus="1">      <resource variable="RESOURCES" multichoice="1" addstatus="1" 
                 closeallpages="1">
       <filterfunc>return $isNotMap;</filterfunc>        <filterfunc>return $isNotMap;</filterfunc>
       <mapurl>$map</mapurl>        <mapurl>$map</mapurl>
       <valuefunc>return $symbFilter;</valuefunc>        <valuefunc>return $symbFilter;</valuefunc>
Line 1529  CHOOSE_STUDENTS Line 1623  CHOOSE_STUDENTS
       <choice computer='1'>Add one empty page/column after each student\'s assignment</choice>        <choice computer='1'>Add one empty page/column after each student\'s assignment</choice>
       <choice computer='2'>Add two empty pages/column after each student\'s assignment</choice>        <choice computer='2'>Add two empty pages/column after each student\'s assignment</choice>
       <choice computer='3'>Add three empty pages/column after each student\'s assignment</choice>        <choice computer='3'>Add three empty pages/column after each student\'s assignment</choice>
       </choices>      </choices>
       <message><hr width='33%' /><b>Number of assignments printed at the same time: </b></message>
       <string variable="NUMBER_TO_PRINT" maxlength="5" size="5"><defaultvalue>"all"</defaultvalue></string>
   RESOURCE_SELECTOR
   
    &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_STUDENTS1);
     <state name="CHOOSE_STUDENTS1" title="Select Students and Resources">
       <student multichoice='1' variable="STUDENTS" nextstate="PAGESIZE" />
       $resource_selector
     </state>      </state>
 CHOOSE_STUDENTS1  CHOOSE_STUDENTS1
   
   addMessage("<hr width='33%' /><b>Number of assignments printed at the same time: </b>");   &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_ANON2);
         $paramHash = Apache::lonhelper::getParamHash();    <state name="CHOOSE_ANON2" title="Select Students and Resources">
  $paramHash->{'variable'} = 'NUMBER_TO_PRINT';         <message><hr width='33%' /><b>How many Anonymous exams to print?</b></message>
  $helper->declareVar('NUMBER_TO_PRINT');               <string variable="NUMBER_TO_PRINT_TOTAL" maxlength="5" size="5"></string>
  addMessage("<input type='text' name='NUMBER_TO_PRINT.forminput' size='3' value='all' /><hr width='33%' />");      <message><hr width='33%' /></message>
       $resource_selector
     </state>
   CHOOSE_ANON2
     }      }
   
     # FIXME: That RE should come from a library somewhere.      # 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/') {          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}, ["<b>Problems</b> from current subdirectory <b><i>$subdir</i></b>", 'problems_from_directory', 'CHOOSE_FROM_SUBDIR'];          push @{$printChoices}, ["<b>".&mt('Problems')."</b> ".&mt('from current subdirectory')." <b><i>$subdir</i></b>", 'problems_from_directory', 'CHOOSE_FROM_SUBDIR'];
   
         my $f = '$filename';          my $f = '$filename';
         my $xmlfrag = <<CHOOSE_FROM_SUBDIR;          my $xmlfrag = <<CHOOSE_FROM_SUBDIR;
Line 1585  CHOOSE_FROM_SUBDIR Line 1690  CHOOSE_FROM_SUBDIR
     </state>      </state>
   <state name="CHOOSE_FROM_ANY_SEQUENCE" title="Select Resources To Print">    <state name="CHOOSE_FROM_ANY_SEQUENCE" title="Select Resources To Print">
     <message>(mark desired resources then click "next" button) <br /></message>      <message>(mark desired resources then click "next" button) <br /></message>
     <resource variable="RESOURCES" multichoice="1" toponly='1' addstatus="1">      <resource variable="RESOURCES" multichoice="1" toponly='1' addstatus="1"
                 closeallpages="1">
       <nextstate>PAGESIZE</nextstate>        <nextstate>PAGESIZE</nextstate>
       <filterfunc>return $isProblem</filterfunc>        <filterfunc>return $isProblem</filterfunc>
       <mapurl evaluate='1'>return '$escapedSequenceName';</mapurl>        <mapurl evaluate='1'>return '$escapedSequenceName';</mapurl>
Line 1618  CHOOSE_FROM_ANY_SEQUENCE Line 1724  CHOOSE_FROM_ANY_SEQUENCE
         $paramHash->{CHOICES} = [          $paramHash->{CHOICES} = [
                                    ['Without Answers', 'yes'],                                     ['Without Answers', 'yes'],
                                    ['With Answers', 'no'],                                     ['With Answers', 'no'],
                                    ['Only Answers', 'only'] ];                                     ['Only Answers', 'only'],
                                      ['As Exam Problem', 'exam']
                                   ];
         Apache::lonhelper::dropdown->new();          Apache::lonhelper::dropdown->new();
  addMessage("</td></tr>");   addMessage("</td></tr>");
  $startedTable = 1;   $startedTable = 1;
Line 1670  CHOOSE_FROM_ANY_SEQUENCE Line 1778  CHOOSE_FROM_ANY_SEQUENCE
  if ($helper->{'VARS'}->{'construction'}) {    if ($helper->{'VARS'}->{'construction'}) { 
     my $stylevalue=$ENV{'construct.style'};      my $stylevalue=$ENV{'construct.style'};
     my $xmlfrag .= <<"RNDSEED";      my $xmlfrag .= <<"RNDSEED";
     <message><tr><td align='right'>Use random seed: </td><td></message>      <message><tr><td align='right'>Use random seed:  </td><td></message>
     <string variable="curseed" size="15" maxlength="15">      <string variable="curseed" size="15" maxlength="15">
  <defaultvalue>   <defaultvalue>
             return $helper->{VARS}->{'curseed'};              return $helper->{VARS}->{'curseed'};
Line 1935  sub render { Line 2043  sub render {
 </table>  </table>
   
 <p>Hint: Some instructors like to leave scratch space for the student by  <p>Hint: Some instructors like to leave scratch space for the student by
 making the width much smaller then the width of the page.</p>  making the width much smaller than the width of the page.</p>
   
 ELEMENTHTML  ELEMENTHTML
   

Removed from v.1.278  
changed lines
  Added in v.1.292


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>