#!/usr/bin/perl -s BEGIN{ print "This script is deprecated, use pass-test.\n"; exit 0;} our ($s,$o,$pdf,$pdf2,$nosol, $nores, $n,$h, $h1,$d,$dl,$dm, $debug_frac, $debug_fun, $test, $showrand, $tit, $aut ); use utf8; use strict; use Data::Dumper; ##use Exercise::Gen::Let; use Exercise::Proc::Parse; use Skel::Data; use Text::RewriteRules; skimport(); my $state = {}; my $base; if($h) {print EXE(); exit 0} ### Mex skeleton if($h1){print GEXER(); exit 0} ### Test skeleton my $f=shift or die("usage: $0 [options] file\n"); Exercise::Proc::Parse::parseFile($f); print Dumper( \%Exercise::Proc::Parse::sem); __END__ if($d){ Exercise::Gen::Let::parseFile($f); print Dumper(\%Exercise::Gen::Let::sem ); exit 0} if($dl){Exercise::Gen::Let::lexdebug($f); exit 0} if($f =~ m/(.*)\.test$/){$test=1; $o ||="$1.tex";$base=$1 } else { $o ||="$f.tex";$base=$f } if($test) { mtest2tex($f,$o)} elsif($dm){ debugmex ($f,$o)} else { mex2tex ({ ($n ? (n=>$n) :()), ($nosol? (nosol=>$nosol) :()), ($nores? (nores=>$nores) :()), ($s ? (s=>$s) :()), ($tit ? (title=>$tit) :()), ($aut ? (author=>$aut) :()), },[$f,@ARGV],$o)} if($pdf){ system("/usr/local/bin/ppdflatex -Q $base.tex")== 0 or die("Error in ppdflatex\n"); system("jpdf $base.pdf") == 0 or system("xpdf $base.pdf") == 0 or die("Error no PDF found\n"); } if($pdf2){ system("/usr/local/bin/ppdflatex -Q $base.tex")== 0 or die("Error in ppdflatex\n"); } sub debugmex{ ## debug multi-exercise : generates a exe+solu+... tex file my ($f,$o)= @_; Exercise::Gen::Let::parseFile($f); Exercise::Gen::Let::calcsem(); my $t= $Exercise::Gen::Let::sem{texblocks}; my $v= $Exercise::Gen::Let::sem{ts}; my $tab=""; if($showrand){ for (keys %$v ){ $tab.= sprintf("%5s | %20s | %s\n", $_, $v->{$_}{fv}, $v->{$_}{v1})}; } open (F,">:utf8",$o) or die("cant create output file $o\n");; print F LATDEBUG({ # data => $t->{data}{v1}, ($showrand ?( tab => $tab):()), map {("_$_"=>$t->{$_}{v1} )} qw(sugestion result author title usepackage resolution obs question ), }); close F; } sub mex2tex{ ## multi-exercise : generates a exe.tex file my %opt =(n => 1,nores=>0, nosol => 0, s => 0); if(ref($_[0]) eq "HASH") {%opt = (%opt , %{shift(@_)}) } ; my ($f,$o)= @_; my @files = ref($f)? @$f : ($f); my @q = (); my @r = (); my $rule = "\n\n....................\n\n"; my @resol = (); my ($enu,$sol,$res,$t); for my $f1 (@files){ Exercise::Gen::Let::parseFile($f1); Exercise::Gen::Let::calcsem(); ## Exercise::Gen::Let::calcnewchoice(); $t= $Exercise::Gen::Let::sem{texblocks}; $opt{title} //= $t->{title}{v1}; $opt{subtitle} //= $t->{author}{v1}; $opt{data} //= $t->{data}{v1}; push(@q ,{q=> $t->{question}{v1} }); push(@r ,{q=> $t->{question}{v1} . $rule . $t->{result}{v1} }); push(@resol ,{q=> $t->{question}{v1} . $rule . $t->{resolution}{v1} }); } my %meta = ( title => $opt{title}, subtitle => $opt{author} || '\mbox{}' , data => $opt{data} || '\today' ); if ($s==0){ $enu= join("\n\n\\hrule\n\n",map {$_->{q}} @q); $sol= join("\n\n\\hrule\n\n",map {$_->{q}} @r); $res= join("\n\n\\hrule\n\n",map {$_->{q}} @resol); } elsif($s==1){ $enu= question( @q); $sol= question( @r); $res= question( @resol); } elsif($s==2){ $enu = ENUN({ questions => question( @q), %meta }); $sol = ENUN({ questions => question( @r), %meta }); $res = ENUN({ questions => question( @resol), %meta }); } my $body= join('\newpage ', ( $enu, ($opt{nosol} ? () : ($sol)), ($opt{nores} ? () : ($res)), )); open (F,">:utf8",$o) or die("cant create output file $o\n"); print F TEX( { _usepackage => $t->{usepackage}{v1}, tex_body => $body, }); close F; } sub mex{ ## my %opt =(s => 1); if(ref($_[0]) eq "HASH") {%opt = (%opt , %{shift(@_)}) } ; my ($f)= shift; my $q = ""; my $r = ""; my $resol = ""; my ($enu,$sol,$res,$t); my $rule = "\n\n....................\n\n"; Exercise::Gen::Let::parseFile($f); Exercise::Gen::Let::calcsem(); ## Exercise::Gen::Let::calcnewchoice(); $t= $Exercise::Gen::Let::sem{texblocks}; $opt{title} //= $t->{title}{v1}; $opt{subtitle} //= $t->{author}{v1}; $opt{data} //= $t->{data}{v1}; $q = {q=> $t->{question}{v1} }; $r = {q=> $t->{result}{v1} }; $resol = {q=> $t->{resolution}{v1} }; my %meta = ( title => $opt{title}, subtitle => $opt{author} || '\mbox{}' , data => $opt{data} || '\today' ); if ($s==0){ $enu= $q->{q}; $sol= $q->{q}; $res= $q->{q}; } elsif($s==1){ $enu= question( $q); $sol= question( $r); $res= question( $resol); } ($enu,$sol,$res,\%meta) } sub mtest2tex{ my ($f,$o)= @_; my $txt=`cat $f`; my $aux=mtestfile($txt); my %meta= (title => $aux->{title}, _usepackage => $aux->{usepackage} || '%no extra packages' , subtitle => $aux->{subtitle} || '\mbox{}' , data => $aux->{data} || '\today' ); $state->{enunpage} = ENUN({%meta, questions=> $aux->{txt} }); $state->{resultpage}= ENUN({%meta, questions=> $state->{resultpage_q}}); $state->{resolutionpage}=ENUN({%meta,questions=> $state->{resolutionpage_q}}); open (F,">",$o) or die; print F TSKEL($state); close F; } RULES/m mtestfile =begin=> s/(.)(.*)/$1\n$2__FIM/s ;my $r={}; \#[Qq]uest:\s*(\S+)=e=>push(@{$r->{q}},$1); proc_file($1) \#usepackage[[:CBB:]]=e=>$r->{usepackage}=$2;"" \#[Qq]uest[[:CBB:]][[:CBB:]][[:CBB:]]=e=>saveq($2,$4,$6) \n[Tt]itle:\s*(.+)=e=>$r->{title}=$1;"" \n[Vv]ersions:\s*(.+)=e=>$r->{versions}=$1;"" \n(\w+):\s*(.+)=e=>$r->{$1}=$2;"" __FIM=last=> !!s/.__FIM// and $r->{txt}=$_ and return $r ENDRULES sub saveq{ my ($q,$resul,$resol)=@_; $state->{resultpage_q} .=ENU2({_question => $resul}); $state->{resolutionpage_q}.=ENU2({_question => $resol}); ENU2({_question => $q}); } sub proc_file{ my $f=shift; print STDERR "Debug: processing '$f'\n"; die("Error: cant find $f\n") unless -f $f; my $e=Exercise::Gen->new($f) or warn("Fail to process $f\n"); my $aux= $e->latex(); saveq($aux->{_question},$aux->{_resolution}, $aux->{_result}); } __DATA__ __jjaulas__ \RequirePackage[a4paper,top=2cm,left=2cm,right=2cm,bottom=1.5cm,nohead,nofoot]{geometry} \parindent 0pt \parskip 3pt \usepackage{fancyvrb} \fvset{fontsize=\small, numbers=left, frame=leftline, numberblanklines=false} \newcounter{quest} %\def\theenumi{\alpha{enumi}} \newenvironment{questao}[2][]{ \def\theenumi{\alph{enumi})} % \addvspace{2mm} % \mbox{}\\ \addtocounter{quest}{1}{\bf Quest\~ao \thequest\ (#2)} \marginpar{#1} }{ \addvspace{2mm}\mbox{}\hrule\mbox{} } \newenvironment{exame}[3]{\noindent\fbox{\begin{minipage}{\textwidth}\begin{center} {\Huge #1 \\ \huge #2 \\ \large #3\\} \end{center}\end{minipage}} \mbox{}\\}{} \newcommand{\exametitle}[3]{\noindent\fbox{\begin{minipage}{\textwidth}\begin{center} {\Huge #1 \\ \huge #2 \\ \large #3\\} \end{center}\end{minipage}} \mbox{}\\} __ENU3__ \begin{questao}{} [% _question %] \footnotetext{\thequest:[% _result %]} \end{questao} __ENU2__ \begin{questao}{} [% _question %] \end{questao} __ENU__ \section{Enunciado} [% _question %] __SUG__ \section{Sugestão} [% _sugestion %] __RES__ [% _result %] __LATDEBUG__ [%default:{ _usepackage=>'%no #useackage provided', _sugestion =>'... no sugestion provided', _resolution=>'... no resolution provided', _author=>'', data=>'\today', _obs=>'', tab=> '', }%] \documentclass[portuges,a4paper]{article} \usepackage{babel} \usepackage[mathletters]{ucs} \usepackage[utf8x]{inputenc} \usepackage[T1]{fontenc} \usepackage{fancyvrb} %\usepackage{t1enc} %\usepackage{jjaulas} \usepackage{graphicx} [% _usepackage %] [%!jjaulas %] \begin{document} \exametitle{[% _title %]}{[% _author %]\mbox{}}{[%data%]} \subsection*{Enunciado} [% _question %] \subsection*{Sugestion} [% _sugestion %] \subsection*{Resolution} [% _resolution %] \subsection*{Result} [% _result %] \subsection*{Obs} [% _obs %] \subsection*{Random choices} {\small \begin{verbatim} [% tab %] \end{verbatim} } \end{document} __EXE__ #title: #author: #let: n a =[ ]; a ~ b; #question: \begin{enumerate} \item \end{enumerate} #sugestion: #resolution: #result: #Verify: #usepackage % \usepackage{...} latex preambula __GEXER__ template: ~/svn/mtest/Exercise-Gen/example/jj.tskel problems: ~/svn/mtest/ versions: 4 title: Teste Matemática Jun 2011 subtitle: exemplo inocente data: Nov 2011 \section*{Introdução} Este teste destina-se a ... #quest: EqQua2NV.txt #quest: DerivadaDoProdutoNV.txt #quest: EstaticaNV.txt #quest: DerivadaDaFuncaoCompostaNV.txt #quest{Quanto é $3 \times 9$?}{$9+9+9=27$}{27} __ENUN__ \exametitle{[% title %]}{[% subtitle %]}{[%data%]} [% questions %] __TSKEL__ [%default:{_usepackage=>'', -author=> '', }%] \documentclass[portuges,a4paper]{article} \usepackage{babel} \usepackage[mathletters]{ucs} \usepackage[utf8x]{inputenc} \usepackage[T1]{fontenc} \usepackage{fancyvrb} %\usepackage{t1enc} %\usepackage{jjaulas} \usepackage{graphicx} [% _usepackage %] [%!jjaulas %] \begin{document} %\fvset{fontsize=\small, frame=single, numberblanklines=false} [% enunpage %] \newpage [% resultpage %] \newpage [% resolutionpage %] \end{document} __question__ \begin{questao}{} [% q %] \end{questao} __TEX__ [%default:{_usepackage=>'', tex_title => '', }%] \documentclass[portuges,a4paper]{article} \usepackage{babel} \usepackage[mathletters]{ucs} \usepackage[utf8x]{inputenc} \usepackage[T1]{fontenc} \usepackage{fancyvrb} %\usepackage{t1enc} %\usepackage{jjaulas} \usepackage{graphicx} [% _usepackage %] [%!jjaulas %] \begin{document} %\fvset{fontsize=\small, frame=single, numberblanklines=false} [% tex_title %] [% tex_body %] \end{document} __END__ =head1 NAME mex2tex - Exercise Generator =head1 SYNOPSIS To obtain templates/example: mex2tex -h -- print multi-exercise template mex2tex -h1 -- print multi-test template To print all sections of a mex-file mex2tex -dm -- debug the mex-file mex2tex -dm -pdf problem.txt -- makes pdf and shows it mex2tex -dm -pdf2 problem.txt -- makes pdf -nosol -- skip solution section -nores -- skip resolution section -tit="Title of the test" default: title from first mex -aut="author name" default: author os first mex Debug the lex-level of the mex-file mex2tex -dl -- debug the lexer stage mex2tex -pdf math.test =head1 DESCRIPTION =head2 EXPORT =head1 AUTHOR J.Joao Almeida, jj@di.uminho.pt =head1 SEE ALSO perl(1). =cut sub mex2tex1{ ## multi-exercise : generates a exe.tex file my %opt =(n => 1, nosol => 0, s => 0); if(ref($_[0]) eq "HASH") {%opt = (%opt , %{shift(@_)}) } ; my ($f,$o)= @_; Exercise::Gen::Let::parseFile($f); Exercise::Gen::Let::calcsem(); my ($enu,$sol,$t); my @q = (); my @r = (); for(1 .. $opt{n} ){ Exercise::Gen::Let::calcnewchoice(); $t= $Exercise::Gen::Let::sem{texblocks}; push(@q ,{q=> $t->{question}{v1} }); push(@r ,{q=> $t->{question}{v1} . "\n\n....................\n\n". $t->{result}{v1} }); } if ($s==0){ $enu= join("\n\n\\hrule\n\n",map {$_->{q}} @q); $sol= join("\n\n\\hrule\n\n",map {$_->{q}} @r);} elsif($s==1){ $enu= question( @q) ; $sol= question( @r); } elsif($s==2){ $enu = ENUN( { questions => question( @q), title => $t->{title}{v1}, subtitle => $t->{author}{v1} || '\mbox{}' , data => $t->{data}{v1} || '\today' , }); $sol = ENUN({ questions => question( @r), title => $t->{title}{v1}, subtitle => $t->{author}{v1} || '\mbox{}' , data => $t->{data}{v1} || '\today' , }); } open (F,">:utf8",$o) or die("cant create output file $o\n"); print F TEX( { _usepackage => $t->{usepackage}{v1}, tex_body => ($opt{nosol}? $enu : "$enu \\newpage $sol"), }); close F; } sub mex2tex2{ ## multi-exercise : generates a exe.tex file my %opt =(n => 1, nosol => 0); if(ref($_[0]) eq "HASH") {%opt = (%opt , %{shift(@_)}) } ; my ($f,$o)= @_; Exercise::Gen::Let::parseFile($f); Exercise::Gen::Let::calcsem(); my $t; my @q = (); my @r = (); for(1 .. $opt{n} ){ Exercise::Gen::Let::calcnewchoice(); $t= $Exercise::Gen::Let::sem{texblocks}; push(@q ,{q=> $t->{question}{v1} }); push(@r ,{q=> $t->{question}{v1} . "\\dotfill \\\\". $t->{result}{v1} }); } my $enu = ENUN( { questions => question( @q), title => $t->{title}{v1}, subtitle => $t->{author}{v1} || '\mbox{}' , data => $t->{data}{v1} || '\today' , }); my $sol = ENUN({ questions => question( @r), title => $t->{title}{v1}, subtitle => $t->{author}{v1} || '\mbox{}' , data => $t->{data}{v1} || '\today' , }); open (F,">:utf8",$o) or die("cant create output file $o\n"); print F TEX( { _usepackage => $t->{usepackage}{v1}, tex_body => ($opt{nosol}? $enu : "$enu \\newpage $sol"), }); close F; }