summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/scripts/jmlr/makejmlrbook
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/scripts/jmlr/makejmlrbook')
-rwxr-xr-xMaster/texmf-dist/scripts/jmlr/makejmlrbook840
1 files changed, 840 insertions, 0 deletions
diff --git a/Master/texmf-dist/scripts/jmlr/makejmlrbook b/Master/texmf-dist/scripts/jmlr/makejmlrbook
new file mode 100755
index 00000000000..77669bbff3a
--- /dev/null
+++ b/Master/texmf-dist/scripts/jmlr/makejmlrbook
@@ -0,0 +1,840 @@
+#!/usr/bin/env perl
+# File : makejmlrbook
+# Author : Nicola L C Talbot
+# Date : 22nd March 2010
+# Last Modified : 24nd March 2010
+# Version : 0.1
+# Description : Given the name of a document using the
+# jmlrbook class file, this script runs
+# pdflatex (and possibly bibtex) on the
+# imported articles and the main document.
+# http://theoval.cmp.uea.ac.uk/~nlct/
+#
+# This file is distributed as part of the jmlr LaTeX bundle.
+#
+# Copyright (c) 2006 Nicola L.C. Talbot
+# This work may be distributed and/or modified under the
+# conditions of the LaTeX Project Public License, either version 1.3
+# of this license or any later version.
+# The latest version of this license is in
+# http://www.latex-project.org/lppl.txt
+# and version 1.3 or later is part of all distributions of LaTeX
+# version 2005/12/01 or later.
+#
+# This work has the LPPL maintenance status `maintained'.
+#
+# The Current Maintainer of this work is Nicola Talbot.
+
+use Getopt::Long;
+use File::Basename;
+use File::Copy;
+use Cwd;
+use strict;
+
+my $version = "0.1 (2010-03-24)";
+
+my $eol = "\n";
+my $dd = '/';
+
+if ($^O eq 'MSWin32')
+{
+ $eol = "\r\n";
+ $dd = "\\";
+}
+
+my $showversion = 0;
+my $showhelp = 0;
+my $quiet = 0;
+my $batchtex = 0;
+my $online = 1;
+my $print = 1;
+my $html = 1;
+my $latexapp = 'pdflatex';
+my $bibtexapp = 'bibtex';
+my $latexopts = '';
+my $bibtexopts = '';
+my $format = 'pdf';
+my $logourl = '';
+
+unless(&GetOptions(
+ "online!" => \$online,
+ "print!" => \$print,
+ "html!" => \$html,
+ "logourl=s" => \$logourl,
+ "format=s" => \$format,
+ "latexapp=s" => \$latexapp,
+ "bibtexapp=s" => \$bibtexapp,
+ "latexopts=s" => \$latexopts,
+ "bibtexopts=s" => \$bibtexopts,
+ "quieter!" => \$quiet,
+ "batchtex!" => \$batchtex,
+ "version" => \$showversion,
+ "help" => \$showhelp))
+{
+ die "$!\n", "Use --help for help\n";
+}
+
+my $appname = basename($0);
+
+if ($showhelp)
+{
+ die "$appname version $version Copyright (c) 2010 Nicola L C Talbot\n",
+ "Distributed under the LaTeX Project Public License.\n\n",
+ "Syntax: $appname [options] <filename>\n\n",
+ "<filename> should be the name of the master document for a LaTeX \n",
+ "file that uses the jmlrbook class. The .tex extension may be\n",
+ "omitted.\n\n",
+ "Basic options:\n",
+ "--online\t\tGenerate the color on-line version (default)\n",
+ "--noonline\t\tDon't generate the color on-line version\n",
+ "--print\t\t\tGenerate the grayscale print version (default)\n",
+ "--noprint\t\tDon't generate the grayscale print version\n",
+ "--html\t\t\tGenerate the HTML version (default)\n",
+ "--nohtml\t\tDon't generate the HTML version\n",
+ "--logourl <url>\tMake the logo on the HTML index page link to <url>\n",
+ "--batchtex\t\tRun TeX in batch mode\n",
+ "--nobatchtex\t\tDon't run TeX in batch mode\n",
+ "--quieter\t\tReduce messages to stdout and run TeX in batch mode\n",
+ "--noquieter\t\tDon't reduce messages to stdout\n",
+ "--version\t\tDisplay version number and exit\n",
+ "--help\t\t\tDisplay help message and exit\n",
+ "\nAdvanced options:\n",
+ "--latexapp <name>\tApplication used to call LaTeX\n",
+ "\t\t\t(Defaults to 'pdflatex')\n",
+ "--format <string>\tOutput format (default: 'pdf')\n",
+ "--bibtexapp <name>\tApplication used to call BibTeX\n",
+ "\t\t\t(Defaults to 'bibtex')\n",
+ "--latexopt <string>\tOptions to pass to LaTeX\n",
+ "--bibtexopt <string>\tOptions to pass to BibTeX\n";
+}
+
+if ($showversion)
+{
+ die "$appname version $version copyright (c) 2010 Nicola L C Talbot\n",
+ "Distributed under the LaTeX Project Public License.\n";
+}
+
+unless ($#ARGV == 0)
+{
+ die "$appname: missing filename\n",
+ "use --help for help\n";
+}
+
+if ($quiet or $batchtex)
+{
+ $latexopts = '-interaction batchmode '.$latexopts;
+}
+
+if ($quiet)
+{
+ $bibtexopts = '-terse '.$bibtexopts;
+}
+
+my ($main_name, $main_path, $main_suffix)
+ = fileparse($ARGV[0], '\.(tex|ltx)');
+
+$main_suffix = '.tex' unless $main_suffix;
+
+my $org_dir = cwd();
+
+chdir $main_path
+ or die "Can't change directory to '$main_path': $!\n";
+
+my $mainaux = "$main_name.aux";
+
+# If the aux file doesn't exist or the aux file is older than
+# the main file, run latex
+
+if (not -e $mainaux or (-M $mainaux > -M "$main_name$main_suffix"))
+{
+ &latex($main_name);
+}
+
+# Parse aux file
+
+open AUX, "$mainaux" or die "Can't open '$mainaux' $!\n";
+
+&message("Reading '$mainaux'...\n");
+
+my $main_bibdata = 0;
+my @imports = ();
+my %pagerefs = ();
+
+while (<AUX>)
+{
+ if (/\\bibdata\b/)
+ {
+ $main_bibdata = 1;
+ }
+ elsif (/\\\@jmlr\@import{(.*)}{(.*)}{(.*)}/)
+ {
+ my $import =
+ {
+ label => $1,
+ path => $2,
+ name => $3
+ };
+
+ $import->{'name'} =~s/\.(tex|ltx)\Z//;
+
+ push @imports, $import;
+ }
+ elsif (/\\contentsline\s*{chapterauthor}{(.*)}{}{}}\s*$/
+ and $#imports > -1)
+ {
+ $imports[$#imports]->{'author'} = $1;
+ }
+ elsif (/^\\newlabel\s*{([^}]*)jmlrstart}{{([^}]*)}{([^}]*)}/)
+ {
+ my $label = $1;
+
+ $pagerefs{$label}->{'start'} = $3;
+ }
+ elsif (/^\\newlabel\s*{([^}]*)jmlrend}{{([^}]*)}{([^}]*)}/)
+ {
+ my $label = $1;
+
+ $pagerefs{$label}->{'end'} = $3;
+ }
+}
+
+close AUX;
+
+# Replace any instances of \articlepagesref
+
+foreach my $import (@imports)
+{
+ my $label = $import->{'label'};
+
+ my $pages = $pagerefs{$label}->{'start'}.'--'
+ . $pagerefs{$label}->{'end'};
+
+ $import->{'author'}=~s/\\articlepagesref\s*{$label}/$pages/;
+}
+
+if ($html)
+{
+ # If the html files need to be created, make the directory
+ # html-src, if it doesn't already exist
+
+ unless (-d 'html-src')
+ {
+ mkdir 'html-src'
+ or die "Can't create directory 'html-src': $!\n";
+ }
+
+ unless (-d 'html')
+ {
+ mkdir 'html'
+ or die "Can't create directory 'html': $!\n";
+ }
+}
+
+# Iterate through each imported article
+
+foreach my $import (@imports)
+{
+ my $importbase = &fname($import->{'path'}, $import->{'name'});
+
+ # Check the aux file of this article
+
+ my $aux = "$importbase.aux";
+
+ # The aux file should exist because running LaTeX on the
+ # main file will create the aux file.
+
+ open AUX, $aux or die "Can't open '$aux' $!\n";
+
+ &message("Reading '$aux'...\n");
+
+ my $bibdata = 0;
+
+ while (<AUX>)
+ {
+ if (/\\bibdata\b/)
+ {
+ $bibdata = 1;
+ }
+ }
+
+ close AUX;
+
+ # Do we need a bibtex run?
+
+ if ($bibdata)
+ {
+ my $log = "$importbase.log";
+
+ # If the log file doesn't exist, run LaTeX
+
+ unless (-e $log)
+ {
+ chdir $import->{'path'}
+ or die "Can't change directory to '$import->{path}': $!\n";
+
+ &latex($import->{'name'});
+
+ chdir "$org_dir/$main_path" or
+ die "Can't change directory to '$org_dir/$main_path': $!\n";
+ }
+
+ open LOGFD, $log or die "Can't open '$log' $!\n";
+
+ &message("Reading '$log'...\n");
+
+ my $runbibtex = 0;
+
+ while (<LOGFD>)
+ {
+ if (/There were undefined citations\./)
+ {
+ # Run bibtex and latex
+ $runbibtex = 1;
+
+ last;
+ }
+ }
+
+ close LOGFD;
+
+ if ($runbibtex)
+ {
+ chdir $import->{'path'}
+ or die "Can't change directory to '$import->{path}': $!\n";
+
+ &bibtex($import->{'name'});
+ &latex($import->{'name'});
+
+ chdir "$org_dir/$main_path" or
+ die "Can't change directory to '$org_dir/$main_path': $!\n";
+ }
+ }
+
+ if ($html)
+ {
+ # If html is required, we also need pdf versions of the
+ # individual articles.
+
+ # Does the pdf file exist?
+
+ unless (-e "$importbase.$format")
+ {
+ chdir $import->{'path'}
+ or die "Can't change directory to '$import->{path}': $!\n";
+
+ &latex($import->{'name'});
+
+ chdir "$org_dir/$main_path" or
+ die "Can't change directory to '$org_dir/$main_path': $!\n";
+ }
+
+ # Do we need a rerun?
+
+ if (&needs_rerun($importbase))
+ {
+ chdir $import->{'path'}
+ or die "Can't change directory to '$import->{path}': $!\n";
+
+ &latex($import->{'name'});
+
+ chdir "$org_dir/$main_path" or
+ die "Can't change directory to '$org_dir/$main_path': $!\n";
+ }
+
+ my $importdir = $import->{'path'};
+
+ if ($importdir = '.')
+ {
+ $importdir = $import->{'name'};
+ }
+
+ # Check the appropriate subdirectory is in html-src
+
+ my $name = &fname('html-src', $importdir);
+
+ unless (-d $name)
+ {
+ mkdir $name
+ or die "Can't create directory '$name': $!\n";
+ }
+
+ my $text = '';
+
+ # Read the LaTeX file and store everything up to
+ # the end of the abstract
+
+ my $tex = "$importbase.tex";
+
+ open TEX, $tex or die "Can't open '$tex': $!\n";
+
+ while (<TEX>)
+ {
+ # This doesn't handle complicated cases, such as
+ # the author using \abstract ... \endabstract
+ # or commenting out the abstract with conditionals
+ if (/^([^%]*)\\end{abstract}/)
+ {
+ $text .= $&;
+ last;
+ }
+
+ $text .= $_;
+ }
+
+ close TEX;
+
+ # Add the 'html' class option:
+ unless ($text=~
+ s/^([^%]*)\\documentclass\s*\[(.*)\]/$1\\documentclass[$2,html]/m)
+ {
+ $text=~s/^([^%]*)\\documentclass\s*/$1\\documentclass[html]/m;
+ }
+
+ my $begindoc = '';
+
+ # Set the authors
+ if (defined($import->{'author'}))
+ {
+ my $author = $import->{'author'};
+
+ $author=~s/^([^;]*);/\\textbf{\\emph{$1};}/;
+
+ $begindoc .= "\\jmlrauthors{$author}";
+ }
+
+ # Add content div
+ $text=~s/^([^%]*)\\begin{document}/$&$begindoc\\HCode{<div id="content">}/m;
+
+ # Create file containing the abstract
+
+ my $absfile = "html-src/$importdir/".$import->{'name'}.'.tex';
+
+ open ABSFD,">$absfile"
+ or die "Can't create '$absfile': $!\n";
+
+ print ABSFD "\\batchmode", $eol if ($batchtex or $quiet);
+
+ my $texpath = $import->{path};
+
+ $texpath=~s/\\/\//g if ($dd eq '\\');
+
+ print ABSFD
+ "\\makeatletter",$eol,
+ "\\def\\input\@path{{../../$texpath/}}$eol",
+ "\\makeatother",$eol,
+ $text, $eol,
+ "\\HCode{</div>}", $eol,
+ "\\end{document}",$eol;
+
+ close ABSFD;
+
+ # Create the cfg file
+
+ my $cfg = "html-src/$importdir/jmlr.cfg";
+
+ open CFG, ">$cfg" or die "Can't create '$cfg': $!\n";
+
+print CFG <<END_CFG;
+\\Preamble{html}
+\\begin{document}
+\\Css{div.maketitle {text-align:left;}}
+\\Css{h2.titleHead {text-align:left;}}
+\\Css{. {font-family:verdana,helvetica,sans-serif}}
+\\Css{a {text-decoration:none;color:\\#3030a0}}
+\\Css{.cmbx-10x-x-109{ font-weight: bold;}}
+\\Css{.cmbxti-10x-x-109{ font-weight: bold; font-style: italic;}}
+\\EndPreamble
+END_CFG
+
+ close CFG;
+
+ # Run htlatex
+
+ # Change directory
+ chdir "html-src/$importdir"
+ or die "Can't change directory to 'html-src/$importdir': $!\n";
+
+
+ my $code = system("htlatex \"".$import->{'name'}."\" \"jmlr\"");
+
+ if ($code)
+ {
+ die "htlatex failed with exit code $code\n";
+ }
+
+ # Go back to main directory
+ chdir "$org_dir/$main_path"
+ or die "Can't change directory to '$org_dir/$main_path': $!\n";
+
+ # Copy the html file to the html directory, but rename
+ # the css file to jmlr.css
+
+ my $infile = "html-src/$importdir/".$import->{'name'}.".html";
+
+ open INFD, $infile or die "Can't open '$infile': $!\n";
+
+ my $outfile = "html/".$import->{'name'}.".html";
+
+ open OUTFD, ">$outfile" or die "Can't open '$outfile': $!\n";
+
+ while (<INFD>)
+ {
+ s/href="$import->{name}\.css"/href="jmlr.css"/;
+
+ print OUTFD;
+ }
+
+ close OUTFD;
+
+ close INFD;
+
+ # Copy css file
+
+ copy("html-src/$importdir/$import->{name}.css",
+ "html/jmlr.css")
+ or die "Can't copy 'html-src/$importdir/$import->{name}.css'",
+ " to 'html/jmlr.css': $!\n";
+
+ # Copy pdf file
+
+ copy("$importbase.$format",
+ "html/$import->{name}.$format")
+ or die "Can't copy '$importdir/$import->{name}.$format'",
+ " to 'html/$import->{name}.$format': $!\n";
+ }
+}
+
+# do we need to run bibtex on the main document?
+
+if ($main_bibdata)
+{
+ &bibtex($main_name);
+}
+
+if ($online)
+{
+ &latexonline($main_name);
+
+ # do we need a rerun?
+
+ if (&needs_rerun($main_name))
+ {
+ &message("Rerun required\n");
+ &latexonline($main_name);
+
+ # check again
+
+ if (&needs_rerun($main_name))
+ {
+ &message("Rerun required\n");
+ &latexonline($main_name);
+ }
+ }
+}
+
+if ($print)
+{
+ &latexprint($main_name);
+
+ # do we need a rerun?
+
+ if (&needs_rerun($main_name))
+ {
+ &message("Rerun required\n");
+ &latexprint($main_name);
+
+ # check again
+
+ if (&needs_rerun($main_name))
+ {
+ &message("Rerun required\n");
+ &latexprint($main_name);
+ }
+ }
+}
+
+if ($html)
+{
+ # Make the index file
+
+ my $indexfile = &fname('html-src', "index");
+
+ my $preamble = '';
+
+ open OUTFD, ">$indexfile.tex"
+ or die "Can't open '$indexfile.tex': $!\n";
+
+ open INFD, "$main_name.tex"
+ or die "Can't open '$main_name.tex': $!\n";
+
+ print OUTFD "\\batchmode", $eol if ($batchtex or $quiet);
+
+ print OUTFD
+ "\\makeatletter",$eol,
+ "\\def\\input\@path{{../}}$eol",
+ "\\makeatother",$eol,
+ "\\def\\jmlrgrayscale{0}",$eol;
+
+ while (<INFD>)
+ {
+ unless
+ (s/^([^%]*)\\documentclass\[([^\]]*)\]/$1\\documentclass[$2,html]/)
+ {
+ s/^([^%]*)\\documentclass/$&\[html\]/;
+ }
+
+ s/^([^%]*)\\begin{document}/$&\\HCode{<div id="content">}/;
+
+ if (/^([^%]*)\\maketitle/)
+ {
+ $preamble .= join('', $1, "\\maketitle", $eol);
+ last;
+ }
+
+ $preamble .= $_;
+ }
+
+ close INFD;
+
+ # Find the book logo
+ if ($preamble=~/\\logo\s*{(%\s*\n)?\\includegraphics\s*(\[[^\]]*\])?{([^}]*)}}/m)
+ {
+ my $texpath = $3;
+ my $orgtexpath = $texpath;
+ $texpath=~s/\//\\/g if ($dd eq "\\");
+
+ my $ext = '';
+
+ if (-e $texpath)
+ {
+ copy($texpath, 'html')
+ or die "Can't copy '$texpath' to 'html': $!\n";
+ copy($texpath, 'html-src')
+ or die "Can't copy '$texpath' to 'html-src': $!\n";
+ }
+ elsif (-e "$texpath.png")
+ {
+ copy("$texpath.png", 'html')
+ or die "Can't copy '$texpath.png' to 'html': $!\n";
+ copy("$texpath.png", 'html-src')
+ or die "Can't copy '$texpath.png' to 'html-src': $!\n";
+
+ $ext = '.png';
+ }
+ elsif (-e "$texpath.jpg")
+ {
+ copy("$texpath.jpg", 'html')
+ or die "Can't copy '$texpath.jpg' to 'html': $!\n";
+ copy("$texpath.jpg", 'html-src')
+ or die "Can't copy '$texpath.jpg' to 'html-src': $!\n";
+
+ $ext = '.jpg';
+ }
+ elsif (-e "$texpath.gif")
+ {
+ copy("$texpath.gif", 'html')
+ or die "Can't copy '$texpath.gif' to 'html': $!\n";
+ copy("$texpath.gif", 'html-src')
+ or die "Can't copy '$texpath.gif' to 'html-src': $!\n";
+
+ $ext = '.gif';
+ }
+
+ my $img = basename($texpath);
+
+ if ($logourl)
+ {
+ $preamble=~s/\\includegraphics(\[[^\]]*\])?{$orgtexpath}/\\href{$logourl}{\\includegraphics${1}{$img$ext}}/mg;
+ }
+ else
+ {
+ $preamble=~s/\\includegraphics(\[[^\]]*\])?{$orgtexpath}/\\includegraphics${1}{$img$ext}/mg;
+ }
+ }
+
+ print OUTFD $preamble, $eol;
+
+ # Parse TOC
+
+ my $toc = "$main_name.toc";
+
+ open TOC, $toc or die "Can't open '$toc': $!\n";
+
+ my $idx = 0;
+
+ while (<TOC>)
+ {
+ if (/^\\tocpart\s*{(.*)}\s*$/)
+ {
+ print OUTFD "\\begin{center}\\bfseries $1\\end{center}$eol";
+ }
+ elsif (/\\contentsline\s*{papertitle}{(.*)}{[^{}]*}{[^{}]*}\s*$/)
+ {
+ print OUTFD "\\par\\noindent $1$eol";
+ }
+ elsif (/\\contentsline\s*{chapterauthor}{(.*)}{[^{}]*}{[^{}]*}\s*$/)
+ {
+ my $details = $1;
+ $details=~s/([^;]*);/\\textbf{\\emph{$1};}/;
+
+ my $label = $imports[$idx]->{'label'};
+ my $pages = $pagerefs{$label}->{'start'}.'--'
+ . $pagerefs{$label}->{'end'};
+
+ $details=~s/\\articlepagesref\s*{$label}/$pages/;
+
+ print OUTFD "\\par $details$eol";
+
+ my $name = $imports[$idx]->{'name'};
+
+ print OUTFD "\\par [\\href{$name.html}{abs}] [\\href{$name.pdf}{pdf}]$eol$eol";
+
+ $idx++;
+ }
+ }
+
+ close TOC;
+
+ print OUTFD "\\HCode{</div>}\\end{document}$eol";
+
+ close OUTFD;
+
+ # Go into html-src directory and run htlatex
+
+ chdir('html-src')
+ or die "Can't change directory to 'html': $!\n";
+
+ my $code = system('htlatex index');
+
+ if ($code)
+ {
+ die "htlatex failed with error code $code\n";
+ }
+
+ chdir('..')
+ or die "Can't change directory to '..': $!\n";
+
+ # Copy to html directory
+
+ my $inname = &fname('html-src', 'index.html');
+ my $outname = &fname('html', 'index.html');
+
+ open INFD, $inname or die "Can't open '$inname': $!\n";
+
+ open OUTFD, ">$outname" or die "Can't open '$outname': $!\n";
+
+ while (<INFD>)
+ {
+ s/href="index.css"/href="jmlr.css"/;
+
+ print OUTFD;
+ }
+
+ close OUTFD;
+
+ close INFD;
+}
+
+# Return to original directory
+chdir $org_dir;
+
+# Subroutines
+
+sub message{ print @_ unless ($quiet) }
+
+sub latex{
+ my $file = shift;
+
+ my $code;
+
+ $code = system(join(' ', $latexapp, $latexopts, "\"$file\""));
+
+ if ($code)
+ {
+ die "**LaTeX run failed with exit code $code.**\n",
+ "Check '$file.log' for details\n";
+ }
+}
+
+sub latexonline{
+ my $file = shift;
+
+ my $code;
+
+ $code = system(join(' ', $latexapp, $latexopts,
+ "\"\\def\\jmlrgrayscale{0}\\input{$file}\""));
+
+ if ($code)
+ {
+ die "**LaTeX run failed with exit code $code.**\n",
+ "Check '$file.log' for details\n";
+ }
+
+ &message("copying '$file.$format' to '$file-online.$format'\n");
+
+ copy("$file.$format", "$file-online.$format")
+ or die "Can't copy '$file.$format' to '$file-online.$format': $!\n";
+}
+
+sub latexprint{
+ my $file = shift;
+
+ my $code;
+
+ $code = system(join(' ', $latexapp, $latexopts,
+ "\"\\def\\jmlrgrayscale{1}\\input{$file}\""));
+
+ if ($code)
+ {
+ die "**LaTeX run failed with exit code $code.**\n",
+ "Check '$file.log' for details\n";
+ }
+
+ &message("copying '$file.$format' to '$file-print.$format'\n");
+
+ copy("$file.$format", "$file-print.$format")
+ or die "Can't copy '$file.$format' to '$file-print.$format': $!\n";
+}
+
+sub bibtex{
+ my $file = shift;
+
+ my $code;
+
+ $code = system(join(' ', $bibtexapp, $bibtexopts, "\"$file\""));
+
+ if ($code)
+ {
+ die "**BibTeX run failed with exit code $code.**\n",
+ "Check '$file.blg' for details\n";
+ }
+}
+
+sub needs_rerun{
+ my $file = shift;
+ my $rerun = 0;
+
+ # Scan log file for rerun message
+
+ my $log = "$file.log";
+
+ # If there's no log file a run is needed
+ open LOGFD, $log or return 1;
+
+ while (<LOGFD>)
+ {
+ if (/Rerun to get cross-references right\./)
+ {
+ $rerun = 1;
+ last;
+ }
+ }
+
+ close LOGFD;
+
+ return $rerun;
+}
+
+sub fname{ join($dd, @_) }
+
+1;