--- loncom/interface/lonprintout.pm 2023/04/18 18:48:14 1.627.2.32.2.7 +++ loncom/interface/lonprintout.pm 2012/12/21 18:51:49 1.628 @@ -1,7 +1,7 @@ # The LearningOnline Network # Printout # -# $Id: lonprintout.pm,v 1.627.2.32.2.7 2023/04/18 18:48:14 raeburn Exp $ +# $Id: lonprintout.pm,v 1.628 2012/12/21 18:51:49 bisitz Exp $ # # Copyright Michigan State University Board of Trustees # @@ -27,6 +27,7 @@ # package Apache::lonprintout; use strict; +use POSIX; use Apache::Constants qw(:common :http); use Apache::lonxml; use Apache::lonnet; @@ -46,6 +47,7 @@ use File::Basename; use HTTP::Response; use LONCAPA::map(); +use POSIX qw(ctime); use Apache::lonlocal; use Carp; use LONCAPA; @@ -143,13 +145,13 @@ sub printable_sequence { # Parameters: # helper - the helper which already contains info about the current folder we can # purloin. -# map - the map for which incomplete problems are to be printed -# nocurrloc - True if printout called from icon/link in Tools in /adm/navmaps +# url - Top url of the sequence # Return: # XML that can be parsed by the helper to drive the state machine. # -sub create_incomplete_folder_selstud_helper { - my ($helper, $map, $nocurrloc) = @_; +sub create_incomplete_folder_selstud_helper($helper) +{ + my ($helper, $map) = @_; my $symbFilter = '$res->shown_symb()'; @@ -158,7 +160,7 @@ sub create_incomplete_folder_selstud_hel my $resource_chooser = &generate_resource_chooser('CHOOSE_INCOMPLETE_PEOPLE_SEQ', 'Select problem(s) to print', - 'multichoice="1" toponly="1" addstatus="1" closeallpages="1" modallink="1" nocurrloc="'.$nocurrloc.'"', + 'multichoice="1" toponly="1" addstatus="1" closeallpages="1"', 'RESOURCES', 'CHOOSE_STUDENTS_INCOMPLETE', $map, @@ -207,7 +209,7 @@ sub create_incomplete_course_helper { my $resource_chooser = &generate_resource_chooser('INCOMPLETE_PROBLEMS_COURSE_RESOURCES', 'Select problem(s) to print', - 'multichoice = "1" suppressEmptySequences="0" addstatus="1" closeallpagtes="1" modallink="1"', + 'multichoice = "1" suppressEmptySequences="0" addstatus="1" closeallpagtes="1"', 'RESOURCES', 'INCOMPLETE_PROBLEMS_COURSE_STUDENTS', '', @@ -236,7 +238,6 @@ sub create_incomplete_course_helper { # Parameters: # $helper - helper we are generating states for. # $map - The map for which the student wants incomplete problems. -# $nocurrloc - True if printout called from icon/link in Tools in /adm/navmaps # Returns: # XML that defines the helper states being created. # @@ -244,7 +245,7 @@ sub create_incomplete_course_helper { # CHOOSE_INCOMPLETE_SEQ - Resource selector. # sub create_incomplete_folder_helper { - my ($helper, $map, $nocurrloc) = @_; + my ($helper, $map) = @_; my $filter = '$res->is_problem()'; $filter .= ' && $res->resprintable() '; @@ -254,7 +255,7 @@ sub create_incomplete_folder_helper { my $resource_chooser = &generate_resource_chooser('CHOOSE_INCOMPLETE_SEQ', 'Select problem(s) to print', - 'multichoice="1", toponly ="1", addstatus="1", closeallpages="1" modallink="1" nocurrloc="'.$nocurrloc.'"', + 'multichoice="1", toponly ="1", addstatus="1", closeallpages="1"', 'RESOURCES', 'PAGESIZE', $map, @@ -308,8 +309,7 @@ CHOOSE_STUDENTS # this_state - State name of the chooser. # prompt_text - Text to use to prompt user. # resource_options - Resource tag options e.g. -# "multichoice='1', toponly='1', addstatus='1', -# modallink='1'" +# "multichoice='1', toponly='1', addstatus='1'" # that control the selection and appearance of the # resource selector. # variable - Name of the variable to hold the choice @@ -446,134 +446,6 @@ CHOOSE_ANON1 return $result; } -sub generate_common_choosers { - my ($r,$helper,$map,$url,$isProblem,$symbFilter,$start_new_option) = @_; - - my $randomly_ordered_warning = - &get_randomly_ordered_warning($helper, $map); - - # code for a few states used for printout launched from both - # /adm/navmaps and from a resource by a privileged user: - # - To allow resources to be selected for printing. - # - To determine pagination between assignments. - # - To determine how many assignments should be bundled into a single PDF. - - my $resource_selector= &generate_resource_chooser('SELECT_PROBLEMS', - 'Select resources to print', - 'multichoice="1" addstatus="1" closeallpages="1" modallink="1" suppressNavmap="1"', - 'RESOURCES', - 'PRINT_FORMATTING', - $map, - $isProblem, '', $symbFilter, - $start_new_option); - $resource_selector .= &generate_format_selector($helper, - 'How should results be printed?', - 'PRINT_FORMATTING'). - &generate_resource_chooser('CHOOSE_STUDENTS_PAGE', - 'Select Problem(s) to print', - "multichoice='1' addstatus='1' closeallpages ='1' modallink='1'", - 'RESOURCES', - 'PRINT_FORMATTING', - $url, - $isProblem, '', $symbFilter, - $start_new_option); - -# Generate student choosers. - - &Apache::lonxml::xmlparse($r, 'helper', - &generate_student_chooser('CHOOSE_TGT_STUDENTS_PAGE', - 'student_sort', - 'STUDENTS', - 'CHOOSE_STUDENTS_PAGE')); - &Apache::lonxml::xmlparse($r, 'helper', - &generate_student_chooser('CHOOSE_STUDENTS', - 'student_sort', - 'STUDENTS', - 'SELECT_PROBLEMS')); - &Apache::lonxml::xmlparse($r, 'helper', $resource_selector); - - 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; } - if ($name =~ /^type\0/) { next; } - $namechoice.=''.$name.''; - } - - my %code_values; - my %codes_to_print; - foreach my $key (@names) { - %code_values = &Apache::grades::get_codes($key, $cdom, $cnum); - foreach my $key (keys(%code_values)) { - $codes_to_print{$key} = 1; - } - } - - my $code_selection; - foreach my $code (sort {uc($a) cmp uc($b)} (keys(%codes_to_print))) { - my $choice = $code; - if ($code =~ /^[A-Z]+$/) { # Alpha code - $choice = &letters_to_num($code); - } - push(@{$helper->{DATA}{ALL_CODE_CHOICES}},[$code,$choice]); - } - if (%codes_to_print) { - $code_selection .=' - Choose single CODE from list: - - - - - push(@{$state->{CHOICES}},@{$helper->{DATA}{ALL_CODE_CHOICES}}); - - - - '.$/; - } - - my @lines = &Apache::lonnet::get_scantronformat_file(); - my $codechoice=''; - foreach my $line (@lines) { - next if (($line =~ /^\#/) || ($line eq '')); - my ($name,$description,$code_type,$code_length)= - (split(/:/,$line))[0,1,2,4]; - if ($code_length > 0 && - $code_type =~/^(letter|number|-1)/) { - $codechoice.=''.$description.''; - } - } - if ($codechoice eq '') { - $codechoice='Default'; - } - my $anon1 = &generate_code_selector($helper, - 'CHOOSE_ANON1', - 'SELECT_PROBLEMS', - $codechoice, - $code_selection, - $namechoice) . $resource_selector; - - &Apache::lonxml::xmlparse($r, 'helper',$anon1); - - my $anon_page = &generate_code_selector($helper, - 'CHOOSE_ANON1_PAGE', - 'SELECT_PROBLEMS_PAGE', - $codechoice, - $code_selection, - $namechoice) . - &generate_resource_chooser('SELECT_PROBLEMS_PAGE', - 'Select Problem(s) to print', - "multichoice='1' addstatus='1' closeallpages ='1' modallink='1'", - 'RESOURCES', - 'PRINT_FORMATTING', - $url, - $isProblem, '', $symbFilter, - $start_new_option); - &Apache::lonxml::xmlparse($r, 'helper', $anon_page); - return ($randomly_ordered_warning,$codechoice,$code_selection,$namechoice); -} - # Returns the XML for choosing how assignments are to be formatted # that text must still be parsed by the helper xml parser. # Parameters: 3 (required) @@ -588,9 +460,7 @@ sub generate_format_selector { my $secpdfoption; unless (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_anon') || ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_anon_page') || - ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_anon') || - ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'select_sequences_problems_for_anon') || - ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'select_sequences_resources_for_anon')) { + ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_anon') ) { $secpdfoption = 'Each PDF contains exactly one section'; } return <parmval('printstartdate', $part); my $partclose = $res->parmval('printenddate', $part); - if (!$partopen) { - $partopen = $res->parmval('opendate',$part); - } - if (!$partopen) { - $partopen = $res->parmval('contentopen',$part); - } - if ($partopen) { - push(@open_dates, $partopen); - } - if ($partclose) { - push(@close_dates, $partclose); - } + push(@open_dates, $partopen); push(@close_dates, $partclose); } @@ -748,6 +604,13 @@ sub get_print_dates { ($open_date, $close_date) = &compute_open_window(\@open_dates, \@close_dates); + if ($open_date) { + $open_date = POSIX::strftime('%D', localtime($open_date)); + } + if ($close_date) { + $close_date = POSIX::strftime('%D', localtime($close_date)); + } + return ($open_date, $close_date); } @@ -756,7 +619,7 @@ sub get_print_dates { # get_print_dates but namvaps::course_print_dates are gotten...and not converted # to times either. # -# @param $res - Reference to a resource hash from lonnavmaps::resource. +# @param $res - Reference to a resource has from lonnvampas::resource. # # @return (opendate, closedate) # @@ -770,7 +633,7 @@ sub course_print_dates { my @close_dates; my $navmap = $res->{NAV_MAP}; # Slightly OO dirty. - # Don't bother looping over undefined or empty parts array; + # Don't bother looping over undefined or empty parts arraY; if (@parts) { foreach my $part (@parts) { @@ -796,7 +659,7 @@ sub map_print_dates { my $navmap = $res->{NAV_MAP}; # slightly OO dirty. - # Don't bother looping over undefined or empty parts array; + # Don't bother looping over undefined or empty parts arraY; if (@parts) { foreach my $part (@parts) { @@ -834,12 +697,12 @@ sub incomplete { } } # -# When printing for students, the resources and order of the +# When printing for students, the resoures and order of the # resources may need to be altered if there are folders with # random selectiopn or random ordering (or both) enabled. # This sub computes the set of resources to print for a student # modified both by random ordering and selection and filtered -# to only those that are in the original set selected to be printed. +# to only those that are in the original set selcted to be printed. # # Parameters: # $map - The URL of the folder being printed. @@ -850,9 +713,6 @@ sub incomplete { # $who - Student/domain for whome the sequence will be generated. # $code - CODE being printed when printing Problems/Resources # from folder for CODEd assignments -# $nohidemap - If true, parameter in map for hiddenresource will be -# ignored. The user calling the routine should have -# both the pav and vgr privileges if this is set to true). # # Implicit inputs: # $ @@ -861,7 +721,7 @@ sub incomplete { # print_resources. # sub master_seq_to_person_seq { - my ($map, $seq, $who, $code, $nohidemap) = @_; + my ($map, $seq, $who, $code) = @_; my ($username, $userdomain, $usersection) = split(/:/, $who); @@ -872,14 +732,9 @@ sub master_seq_to_person_seq { my %seq_hash = map {$_ => 1} @$seq; my @output_seq; - - my $unhidden; - if ($nohidemap) { - $unhidden = &Apache::lonnet::clutter($map); - } my $navmap = Apache::lonnavmaps::navmap->new($username, $userdomain, - $code,$unhidden); + $code); my ($start,$finish); if ($map) { @@ -897,8 +752,9 @@ sub master_seq_to_person_seq { my $iterator = $navmap->getIterator($start,$finish,{},1); # Iterate on the resource..select the items that are randomly selected - # and that are in the seq_hash. Presumably the iterator will take care - # of the random ordering part of the deal. + # and that are in the seq_has. Presumably the iterator will take care + # of the random ordering part of the deal. + # my $curres; while ($curres = $iterator->next()) { # @@ -974,14 +830,14 @@ sub set_font_size { my ($text) = @_; # There appear to be cases where the font directive is empty.. in which - # case the first substitution would insert a spurious \ oh happy day. + # case the first substituion would insert a spurious \ oh happy day. # as this has been the cause of much mystery and hair pulling _sigh_ if ($font_size ne '') { - $text =~ s/\\begin\{document}/\\begin{document}{\\$font_size/; - $text =~ s/\\end\{document}/}\\end{document}/; + $text =~ s/\\begin{document}/\\begin{document}{\\$font_size/; } + $text =~ s/\\end{document}/}\\end{document}/; return $text; @@ -992,7 +848,7 @@ sub set_font_size { # - The PDF, if necessary, is replicated. # - The PDF is added to the list of files to convert to postscript (along with the images). # - The LaTeX is added to include the final converted postscript in the file as an included -# job. The assumption is that the includepsheader.ps header will be included. +# job. The assumption is that the includedpsheader.ps header will be included. # # Parameters: # pdf_uri - URI of the PDF file to include. @@ -1016,14 +872,14 @@ sub include_pdf { $file = &Apache::lonnet::filelocation('',$pdf_uri); } - # The file is now replicated locally ... or it did not exist in the first place + # The file isn ow replicated locally.. or it did not exist in the first place # (unlikely). If it did exist, add the pdf to the set of files/images that - # need to be converted for this print job: + # need tob e converted for this print job: my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'}; $file =~ s{(.*)/res/}{$londocroot/res/}; - open(FILE,">>","$Apache::lonnet::perlvar{'lonPrtDir'}/$env{'user.name'}_$env{'user.domain'}_printout.dat"); + open(FILE,">>$Apache::lonnet::perlvar{'lonPrtDir'}/$env{'user.name'}_$env{'user.domain'}_printout.dat"); print FILE ("$file\n"); close (FILE); @@ -1058,13 +914,13 @@ sub include_pdf { sub collect_languages { my $doc = shift; my %languages; - while ($doc =~ /\\selectlanguage\{(\w+)}/mg) { + while ($doc =~ /\\selectlanguage{(\w+)}/mg) { $languages{$1} = 1; # allows us to request each language exactly once. } my @lang_list = (keys(%languages)); # List of unique languages if (scalar @lang_list) { my $babel_header = '\usepackage[' . join(',', @lang_list) .']{babel}'. "\n"; - $doc =~ s/\\begin\{document}/$babel_header\\begin{document}/; + $doc =~ s/\\begin{document}/$babel_header\\begin{document}/; } return $doc; } @@ -1155,8 +1011,8 @@ sub printf_style_subst { if ($size ne "") { $subst = substr($subst, 0, $size); - # Here's a nice edge case ... suppose the end of the - # substring is a \. In that case may have just + # Here's a nice edge case.. supose the end of the + # substring is a \. In that case may have just # chopped off a TeX escape... in that case, we append # " " for the trailing character, and let the field # spill over a bit (sigh). @@ -1192,12 +1048,12 @@ sub printf_style_subst { # %s - The section if it is supplied. # sub format_page_header { - my ($width, $format, $assignment, $course, $student) = @_; + my ($width, $format, $assignment, $course, $student, $section) = @_; $width = &recalcto_mm($width); # Get width in mm. - my $chars_per_line = int($width/2); # Character/textline. + my $chars_per_line = int($width/1.6); # Character/textline. # Default format? @@ -1213,44 +1069,40 @@ sub format_page_header { # - Allow the assignment to be 2 lines (wrapped). # - my $firstline = "$student $course"; - if (length($firstline) > $chars_per_line) { - my $lastchar = $chars_per_line - length($student) - 1; - if ($lastchar > 0) { - $course = substr($course, 0, $lastchar); - } else { # Nothing left of course: - $course = ''; - } - } - if (length($assignment) > $chars_per_line) { - $assignment = substr($assignment, 0, $chars_per_line); - } + - $format = "\\textbf{$student} $course \\hfill \\thepage \\\\ \\textit{$assignment}"; + my $name_length = int($chars_per_line *3 /4); + my $sec_length = int($chars_per_line / 5); - } else { - # An open question is how to handle long user formatted page headers... - # A possible future is to support e.g. %na so that the user can control - # the truncation of the elements that can appear in the header. - # - $format = &printf_style_subst("a", $format, $assignment); - $format = &printf_style_subst("c", $format, $course); - $format = &printf_style_subst("n", $format, $student); - - # If the user put %'s in the format string, they must be escaped - # to \% else LaTeX will think they are comments and terminate - # the line.. which is bad!!! + $format = "%$name_length".'n'; - } + if ($section) { + $format .= ' - Sec: '."%$sec_length".'s'; + } - return $format; + $format .= '\\\\%c \\\\ %a'; + + } + # An open question is how to handle long user formatted page headers... + # A possible future is to support e.g. %na so that the user can control + # the truncation of the elements that can appear in the header. + # + $format = &printf_style_subst("a", $format, $assignment); + $format = &printf_style_subst("c", $format, $course); + $format = &printf_style_subst("n", $format, $student); + $format = &printf_style_subst("s", $format, $section); + + + # If the user put %'s in the format string, they must be escaped + # to \% else LaTeX will think they are comments and terminate + # the line.. which is bad!!! # If the user has role author, $course and $assignment are empty so # there is '\\ \\ ' in the page header. That's cause a error in LaTeX if($format =~ /\\\\\s\\\\\s/) { #TODO find sensible caption for page header - my $testPrintout = '\\\\'.&mt('Authoring Space').' \\\\'.&mt('Test-Printout '); + my $testPrintout = '\\\\'.&mt('Construction Space').' \\\\'.&mt('Test-Printout '); $format =~ s/\\\\\s\\\\\s/$testPrintout/; } # @@ -1370,9 +1222,8 @@ sub is_valid_alpha_code { sub is_code_valid { my ($code_value, $code_option) = @_; my ($code_type, $code_length) = ('letter', 6); # defaults. - my @lines = &Apache::lonnet::get_scantronformat_file(); + my @lines = &Apache::grades::get_scantronformat_file(); foreach my $line (@lines) { - next if (($line =~ /^\#/) || ($line eq '')); my ($name, $type, $length) = (split(/:/, $line))[0,2,4]; if($name eq $code_option) { $code_length = $length; @@ -1444,7 +1295,7 @@ sub compare_names { } # Break the tie on the first name, but there are leading (possibly trailing - # whitespaces to get rid of first) + # whitespaces to get rid of first # $f1 =~ s/^\s+//; # Remove leading... $f1 =~ s/\s+$//; # Trailing spaces from first 1... @@ -1466,8 +1317,8 @@ sub compare_names { sub latex_header_footer_remove { my $text = shift; - $text =~ s/\\end\{document}//; - $text =~ s/\\documentclass([^&]*)\\begin\{document}//; + $text =~ s/\\end{document}//; + $text =~ s/\\documentclass([^&]*)\\begin{document}//; return $text; } # @@ -1476,8 +1327,8 @@ sub latex_header_footer_remove { # necessity is determined by the problem_split param. # sub encapsulate_minipage { - my ($text,$problem_split) = @_; - if (!($problem_split =~ /yes/i)) { + my ($text) = @_; + if (!($env{'form.problem.split'} =~ /yes/i)) { $text = '\begin{minipage}{\textwidth}'.$text.'\end{minipage}'; } return $text; @@ -1981,6 +1832,8 @@ sub get_course { my $courseidinfo; if (defined($env{'request.course.id'})) { $courseidinfo = &Apache::lonxml::latex_special_symbols(&unescape($env{'course.'.$env{'request.course.id'}.'.description'}),'header'); + my $sec = $env{'request.course.sec'}; + } return $courseidinfo; } @@ -2003,7 +1856,6 @@ sub page_format_transformation { my $name = &get_name(); my $courseidinfo = &get_course(); - if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo } my $header_text = $parmhash{'print_header_format'}; $header_text = &format_page_header($textwidth, $header_text, $assignment, $courseidinfo, $name); @@ -2016,12 +1868,12 @@ sub page_format_transformation { $fancypagestatement="\\rhead{}\\chead{}\\lhead{$header_text}"; } if ($layout eq 'album') { - $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\\usepackage{booktabs}\\begin{document}\\voffset=-0\.8 cm\\setcounter{page}{1}\n /; + $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\\usepackage{booktabs}\\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 $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\\usepackage{booktabs}\\begin{document}\n\\voffset=-0\.8 cm\\setcounter{page}{1}\n/; + $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\\usepackage{booktabs}\\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\n\\evensidemargin = $evenoffset $topmargintoinsert\\textwidth= $textwidth\\newlength{\\minipagewidth}\n\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\renewcommand{\\ref}{\\keephidden\}\\pagestyle{fancy}\\rhead{}\\chead{}\\usepackage{booktabs}\\begin{document}\\voffset=-0\.8cm\n\\setcounter{page}{1} \\vskip 5 mm\n /; + $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{}\\usepackage{booktabs}\\begin{document}\\voffset=-0\.8cm\n\\setcounter{page}{1} \\vskip 5 mm\n /; } if ($papersize eq 'a4') { my $papersize_text; @@ -2030,13 +1882,13 @@ sub page_format_transformation { } else { $papersize_text = '\special{papersize=210mm,297mm}'; } - $text =~ s/(\\begin\{document})/$1$papersize_text/; + $text =~ s/(\\begin{document})/$1$papersize_text/; } } if ($tableofcontents eq 'yes') {$text=~s/(\\setcounter\{page\}\{1\})/$1 \\tableofcontents\\newpage /;} if ($indexlist eq 'yes') { - $text=~s/(\\begin\{document})/\\makeindex $1/; - $text=~s/(\\end\{document})/\\strut\\\\\\strut\\printindex $1/; + $text=~s/(\\begin{document})/\\makeindex $1/; + $text=~s/(\\end{document})/\\strut\\\\\\strut\\printindex $1/; } return $text; } @@ -2045,12 +1897,12 @@ sub page_format_transformation { sub page_cleanup { my $result = shift; - $result =~ m/\\end\{document}(\d*)$/; + $result =~ m/\\end{document}(\d*)$/; my $number_of_columns = $1; my $insert = '{'; for (my $id=1;$id<=$number_of_columns;$id++) { $insert .='l'; } $insert .= '}'; - $result =~ s/(\\begin\{longtable})INSERTTHEHEADOFLONGTABLE\\endfirsthead\\endhead/$1$insert/g; + $result =~ s/(\\begin{longtable})INSERTTHEHEADOFLONGTABLE\\endfirsthead\\endhead/$1$insert/g; $result =~ s/&\s*REMOVETHEHEADOFLONGTABLE\\\\/\\\\/g; return $result,$number_of_columns; } @@ -2086,16 +1938,16 @@ my $end_of_student = "\n".'\special{ps:E sub latex_corrections { my ($number_of_columns,$result,$selectionmade,$answer_mode) = @_; -# $result =~ s/\\includegraphics\{/\\includegraphics\[width=\\minipagewidth\]{/g; +# $result =~ s/\\includegraphics{/\\includegraphics\[width=\\minipagewidth\]{/g; my $copyright = ©right_line(); if ($selectionmade eq '1' || $answer_mode eq 'only') { - $result =~ s/(\\end\{document})/\\strut\\vskip 0 mm $copyright $end_of_student $1/; + $result =~ s/(\\end{document})/\\strut\\vskip 0 mm $copyright $end_of_student $1/; } else { - $result =~ s/(\\end\{document})/\\strut\\vspace\*{-4 mm}\\newline $copyright $end_of_student $1/; + $result =~ s/(\\end{document})/\\strut\\vspace\*{-4 mm}\\newline $copyright $end_of_student $1/; } $result =~ s/\$number_of_columns/$number_of_columns/g; - $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; + $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 my $first_comment = index($result,'