diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/jmlr/makejmlrbook |
Initial commit
Diffstat (limited to 'macros/latex/contrib/jmlr/makejmlrbook')
-rwxr-xr-x | macros/latex/contrib/jmlr/makejmlrbook | 1308 |
1 files changed, 1308 insertions, 0 deletions
diff --git a/macros/latex/contrib/jmlr/makejmlrbook b/macros/latex/contrib/jmlr/makejmlrbook new file mode 100755 index 0000000000..252ce3e549 --- /dev/null +++ b/macros/latex/contrib/jmlr/makejmlrbook @@ -0,0 +1,1308 @@ +#!/usr/bin/env perl +# File : makejmlrbook +# Author : Nicola L C Talbot +# Date : 22nd March 2010 +# Last Modified : 30 May 2012 +# Version : 0.32 +# 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.32 (2012-05-28)"; + +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 = ''; +my $extractpreface = 0; # v0.3 added +# execute system calls (--noexecute will just list the system calls +# without executing them) +my $execute = 1; # v0.31 added + +unless(&GetOptions( + "online!" => \$online, + "print!" => \$print, + "html!" => \$html, + "extractpreface!" => \$extractpreface, + "logourl=s" => \$logourl, + "format=s" => \$format, + "latexapp=s" => \$latexapp, + "bibtexapp=s" => \$bibtexapp, + "latexopts=s" => \$latexopts, + "bibtexopts=s" => \$bibtexopts, + "quieter!" => \$quiet, + "batchtex!" => \$batchtex, + "execute!" => \$execute, + "version" => \$showversion, + "help" => \$showhelp)) +{ + die "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", + "--extractpreface\tParse document for preface environment\n", + "--noextractpreface\tDon't parse document for preface environment\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", + "--execute\t\tExecute system calls (default)\n", + "--noexecute\t\tDon't execute system calls, just list the\n", + "\t\t\tcommands.\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(); + +&chdirordie($main_path); + +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); +} + +my $main_bibdata = 0; +my @imports = (); +my %pagerefs = (); +my $preface_data; # v0.3 new +my @preface_editors = (); + +# Parse aux file + +&parsemainaux($mainaux); + +# 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') + { + &mkdirordie('html-src'); + } + + unless (-d 'html') + { + &mkdirordie('html'); + } + + if ($extractpreface) # v0.3 new + { + # If the preface needs to be extract, make a directory for it if + # it doesn't already exist + + my $prefdir = &fname("html-src", $preface_data->{'OutFile'}); + + unless (-d $prefdir) + { + &mkdirordie($prefdir); + } + + my $prefbase = &fname($prefdir, $preface_data->{'OutFile'}); + + &createprefacefile($prefdir, $prefbase); + + # Create the cfg file + + &createjmlrcfg("html-src", $preface_data->{'OutFile'}); + + &chdirordie($prefdir); + + &latex($preface_data->{'OutFile'}); + &htlatex($preface_data->{'OutFile'}, 'jmlr'); + + &chdirordie($org_dir, $main_path); + + # Check the appropriate subdirectory is in html directory + + my $outname = &fname('html', $preface_data->{'OutFile'}); + + unless (-d $outname) + { + &mkdirordie($outname); + } + + # Copy pdf file + + ©ordie("$prefbase.$format", + &fname($outname, "$preface_data->{OutFile}.$format")); + + # Copy html file + + ©html($preface_data->{'OutFile'}, $preface_data->{'OutFile'}); + } +} + +# Iterate through each imported article + +foreach my $import (@imports) +{ + my $label = $import->{'label'}; + 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. + + my $bibdata = 0; + + if (open AUX, $aux) + { + &message("Reading '$aux'...\n"); + + while (<AUX>) + { + if (/\\bibdata\b/) + { + $bibdata = 1; + } + } + + close AUX; + } + elsif (not $execute) + { + warn "Can't open '$aux' - skipping\n"; + } + else + { + die "$appname: Can't open '$aux' $!\n"; + } + + # Do we need a bibtex run? + + if ($bibdata) + { + my $log = "$importbase.log"; + + # If the log file doesn't exist, run LaTeX + + unless (-e $log) + { + &chdirordie($import->{'path'}); + + &latex($import->{'name'}); + + &chdirordie($org_dir, $main_path); + } + + open LOGFD, $log or die "$appname: 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) + { + &chdirordie($import->{'path'}); + + &bibtex($import->{'name'}); + &latex($import->{'name'}); + + &chdirordie($org_dir, $main_path); + } + } + + if ($html) + { + # If html is required, we also need pdf versions of the + # individual articles. + + # v0.2 run latex even if pdf file exists to ensure start page + # number is correct. + + &chdirordie($import->{'path'}); + + &latexstartpage($import->{'name'}, $pagerefs{$label}->{'start'}); + + &chdirordie($org_dir, $main_path); + + # Do we need a rerun? + + if (&needs_rerun($importbase)) + { + &chdirordie($import->{'path'}); + + &latexstartpage($import->{'name'}, $pagerefs{$label}->{'start'}); + + &chdirordie($org_dir,$main_path); + } + + 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) + { + &mkdirordie($name); + } + + my $text = ''; + + # Read the LaTeX file and store everything up to + # the end of the abstract + + my $tex = "$importbase.tex"; + + my $absfile = &fname("html-src", $importdir, + $import->{'name'}.'.tex'); + + if ($execute) + { + open TEX, $tex or die "$appname: 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 $aux = "$importbase.aux"; + + $aux=~s/\\/\//g if ($dd eq '\\'); + + my $prebegindoc = '\\hypersetup{draft}' . $eol + . '\\makeatletter' . $eol + . "\\input{../../$aux}" . $eol + . '\\makeatother' + . $eol; + + my $begindoc = ''; + + # Set the authors + if (defined($import->{'author'})) + { + my $author = $import->{'author'}; + + $author=~s/^([^;]*);/\\textbf{\\emph{$1};}/; + + $begindoc .= "\\jmlrauthors{$author}"; + } + + # Add content div + + # v0.31 modified \footnote to set the footnote text as in-line + # parenthesis. + + $text=~s/^([^%\n\r\f]*)\\begin{document}/ + $prebegindoc$&$begindoc + \\HCode{<div id="content">} + \\renewcommand{\\footnote}[2][]{ (\#2)}%$eol + /mx; + + # Create file containing the abstract + + open ABSFD,">$absfile" + or die "$appname: 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{", &htmltimestamp, "}", $eol, + "\\HCode{</div>}", $eol, + &htmlmenu, # v0.3 added by Olivier Chapelle + "\\end{document}",$eol; + + close ABSFD; + } + else + { + &messagecall("Skipping creation of '$absfile'\n"); + } + + # Create the cfg file + + &createjmlrcfg("html-src", $importdir); + + # Run htlatex + + # Change directory + &chdirordie("html-src", $importdir); + + &htlatex($import->{'name'}, 'jmlr'); + + # Go back to main directory + + &chdirordie($org_dir, $main_path); + + # Copy the html file to the html directory, but rename + # the css file to jmlr.css + + ©html($importdir, $import->{'name'}); + + # Check the appropriate subdirectory is in html directory + + my $outname = &fname('html', $importdir); + + unless (-d $outname) + { + &mkdirordie($outname); + } + + # Copy pdf file + + ©ordie("$importbase.$format", + &fname($outname, "$import->{name}.$format")); + } +} + +# 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 and $execute) +{ + # 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\s*\[([^\]]*)\]/ + $1\\documentclass[$2,html]/x) + { + s/^([^%]*)\\documentclass\s*/$&\[html\]/; + } + + s/^([^%]*)\\begin{document}/ + \\hypersetup{draft}$eol$&\\HCode{<div id="content">}/x; + + if (/^([^%]*)\\maketitle/) + { + $preamble .= join('', $1, "\\maketitle", $eol); + last; + } + + $preamble .= $_; + } + + close INFD; + + # Find the book logo + if ($preamble + =~/\\logo\s*(?:\[[^\]]*\])?\s*{(%\s*\n)?\\includegraphics\s*(\[[^\]]*\])?{([^}]*)}}/m) + { + my $texpath = $3; + my $orgtexpath = $texpath; + $texpath=~s/\//\\/g if ($dd eq "\\"); + + my $ext = ''; + + if (-e $texpath) + { + ©ordie($texpath, 'html'); + + ©ordie($texpath, 'html-src'); + } + elsif (-e "$texpath.png") + { + ©ordie("$texpath.png", 'html'); + + ©ordie("$texpath.png", 'html-src'); + + $ext = '.png'; + } + elsif (-e "$texpath.jpg") + { + ©ordie("$texpath.jpg", 'html'); + ©ordie("$texpath.jpg", 'html-src'); + + $ext = '.jpg'; + } + elsif (-e "$texpath.gif") + { + ©ordie("$texpath.gif", 'html'); + + ©ordie("$texpath.gif", 'html-src'); + + $ext = '.gif'; + } + + my $img = basename($texpath); + + if ($logourl) + { + $preamble=~s/ + \\includegraphics(\[[^\]]*\])?{$orgtexpath}/ + \\href{$logourl}{\\includegraphics${1}{$img$ext}}/mgx; + } + else + { + $preamble=~s/ + \\includegraphics(\[[^\]]*\])?{$orgtexpath}/ + \\includegraphics${1}{$img$ext}/mgx; + } + } + + print OUTFD $preamble, $eol; + + # Parse TOC + + my $toc = "$main_name.toc"; + + # Add link to preface if required + + if ($extractpreface) + { + print OUTFD + "\\begin{description}\\item[\\normalfont \\prefacename]", $eol; + + print OUTFD "\\textbf{\\emph{\\jmlrabbrnamelist{{", + join('},{', @preface_editors), + "}}};} ", + '\\csname @jmlrabbrvproceedings\\endcsname\\space', + '\\csname @jmlrvolume\\endcsname:', + $preface_data->{'Start'}; + + unless ($preface_data->{'Start'} eq $preface_data->{'End'}) + { + print OUTFD '--', $preface_data->{'End'}; + } + + print OUTFD ', \\csname @jmlryear\\endcsname\\newline', $eol; + + my $name = $preface_data->{'OutFile'}; + + print OUTFD "[\\HCode{<a href=\"$name.html\">html</a>}] ", + "[\\HCode{<a href=\"$name/$name.pdf\">pdf</a>}]", + $eol; + + print OUTFD "\\end{description}$eol"; + } + + 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*$/) + { + # v0.3 Changed by Olivier Chapelle to use description + # environment instead of paragraph break + print OUTFD "\\begin{description}\\item[\\normalfont $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/; + + # v0.3 Changed by Olivier Chapelle to use newline instead of par + print OUTFD "$details\\newline$eol"; + + my $name = $imports[$idx]->{'name'}; + + print OUTFD "[\\HCode{<a href=\"$name.html\">abs</a>}] ", + "[\\HCode{<a href=\"$name/$name.pdf\">pdf</a>}]", + $eol; + + # v0.3 Changed by Olivier Chapelle to end description + print OUTFD "\\end{description}$eol"; + + $idx++; + } + } + + close TOC; + + # version 0.2 added time stamp + + print OUTFD "\\HCode{", &htmltimestamp, "}$eol"; + + print OUTFD &htmlmenu; # v0.3 Added by Olivier Chapelle + + print OUTFD "\\HCode{</div>}\\end{document}$eol"; + + close OUTFD; + + # Go into html-src directory and run htlatex + + &chdirordie('html-src'); + + &htlatex("index", 'xhtml'); + + &chdirordie('..'); + + # 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; + + # v0.2 new: + # Copy any images generated by htlatex to html/ + + my @imagefiles = glob(&fname('html-src', "index*.png")); + + foreach my $imagefile (@imagefiles) + { + copy($imagefile, 'html'); + } +} +elsif ($html) +{ + &messagecall("chdir 'html-src'\n"); + &htlatex("index", 'xhtml'); +} + +# Return to original directory +chdir $org_dir; + +# Subroutines + +sub message{ print @_ unless ($quiet) } + +sub messagecall{ print @_ if (not $quiet or not $execute) } + +sub systemcall{ + my $cmd = shift; + + &messagecall($cmd, "\n"); + + my $code = 0; + + $code = system($cmd) if ($execute); + + $code; +} + +sub latex{ + my $file = shift; + + my $code = &systemcall(join(' ', $latexapp, $latexopts, "\"$file\"")); + + if ($code) + { + die "**LaTeX run failed with exit code $code.**\n", + "Check '$file.log' for details\n"; + } +} + +# v0.2 new +sub latexstartpage{ + my $file = shift; + my $page = shift; + + my $code = &systemcall(join(' ', $latexapp, $latexopts, + "\"\\def\\startpage{$page}\\input{$file}\"")); + + if ($code) + { + die "**LaTeX run failed with exit code $code.**\n", + "Check '$file.log' for details\n"; + } +} + +sub copyordie{ + my ($org, $dest) = @_; + + &messagecall("copy '$org' to '$dest'\n"); + + if ($execute) + { + copy($org, $dest) or die "Can't copy '$org' to '$dest': $!\n"; + } +} + +sub latexonline{ + my $file = shift; + + my $code = &systemcall(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"; + } + + ©ordie("$file.$format", "$file-online.$format"); +} + +sub latexprint{ + my $file = shift; + + my $code = &systemcall(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"; + } + + ©ordie("$file.$format", "$file-print.$format"); +} + +sub bibtex{ + my $file = shift; + + my $code = &systemcall( + 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; + + unless ($execute) + { + &messagecall("Skipping rerun check for '$file'\n"); + return 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, @_) } + +# v0.3 new +sub chdirordie{ + my $dirname = &fname(@_); + + &messagecall("chdir '$dirname'\n"); + + unless (chdir $dirname) + { + if ($execute) + { + die "$appname: Can't change directory to $dirname: $!\n"; + } + else + { + warn "(Can't change directory to '$dirname')\n"; + } + } +} + +# v0.31 new +sub mkdirordie{ + my $dirname = &fname(@_); + + &messagecall("mkdir '$dirname'\n"); + + unless (mkdir $dirname) + { + if ($execute) + { + die "$appname: Can't create directory '$dirname': $!\n"; + } + else + { + warn "(Can't create directory '$dirname')\n"; + } + } +} + +# v0.2 new +sub htmltimestamp{ + my $timestamp = localtime; + + return "<hr><center>Page last modified on $timestamp.</center>"; +} + +# v0.3 Added by Olivier Chapelle +sub htmlmenu{ + return ' +\\HCode{<div id="fixed"><br>} +\\HCode{<a align="right" href="http://www.jmlr.org" target=_top><img align="right" class="jmlr" src="http://jmlr.csail.mit.edu/jmlr.jpg" border="0"></a>} +\\HCode{<p><br><br>} +\\HCode{<p align="right"> <A href="http://www.jmlr.org/"> Home Page </A>} +\\HCode{<p align="right"> <A href="/papers"> Papers </A>} +\\HCode{<p align="right"> <A href="/author-info.html"> Submissions </A>} +\\HCode{<p align="right"> <A href="/news.html"> News </A>} +\\HCode{<p align="right"> <A href="/scope.html"> Scope </A>} +\\HCode{<p align="right"> <A href="/editorial-board.html"> Editorial Board </A>} +\\HCode{<p align="right"> <A href="/announcements.html"> Announcements </A>} +\\HCode{<p align="right"> <A href="/proceedings"> Proceedings </A>} +\\HCode{<p align="right"> <A href="/mloss">Open Source Software</A>} +\\HCode{<p align="right"> <A href="/search-jmlr.html"> Search </A>} +\\HCode{<p align="right"> <A href="/manudb"> Login </A></p>} +\\HCode{<br><br>} +\\HCode{<p align="right"> <A href="http://jmlr.csail.mit.edu/jmlr.xml">} +\\HCode{<img src="http://jmlr.csail.mit.edu/RSS.gif" class="rss" alt="RSS Feed">} +\\HCode{</A>} +\\HCode{</div>} +' +} + +# v0.3 new +sub htlatex{ + my ($filename, $cfg) = @_; + + # unicode-related options suggested by Olivier Chapelle + + # v0.31 added latex options in 5th parameter + + my $code = &systemcall(join(' ', 'htlatex', + "\"$filename\"", + "\"$cfg,uni-html4\"", + "\" -cunihtf -utf8\"", + '""', + "\" $latexopts\"" + )); + + if ($code) + { + die "$appname: htlatex failed with exit code $code.\n"; + } +} + +#v0.3 new +sub createjmlrcfg{ + my $cfg = &fname(@_, "jmlr.cfg"); + + unless ($execute) + { + &messagecall("Skipping creation of '$cfg'\n"); + return; + } + + open CFG, ">$cfg" or die "$appname: 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;}} +\\Css{\\#fixed {position:absolute; top:0; left:0; width:8em; +height:100\\%;}} +\\Css{\\#content {margin-top:1em; margin-left:10em; +margin-right:0.5em;}} +\\Css{img.jmlr {width: 7em;}} +\\Css{img.rss {width: 2em;}} +\\EndPreamble +END_CFG + +# v0.3 Last four \Css lines above added by Olivier Chapelle + close CFG; +} + +#v0.3 new +# copy html from html-src/$dir/ to html/ and rename css file +sub copyhtml{ + my ($dir, $name) = @_; + + my $infile = &fname("html-src", $dir, "$name.html"); + + my $outfile = &fname("html", "$name.html"); + + unless ($execute) + { + &messagecall("Copy '$infile' to '$outfile'\n"); + return; + } + + open INFD, $infile or die "Can't open '$infile': $!\n"; + + open OUTFD, ">$outfile" or die "Can't open '$outfile': $!\n"; + + while (<INFD>) + { + s/href="$name\.css"/href="jmlr.css"/; + + print OUTFD; + } + + close OUTFD; + + close INFD; + + # Copy css file + + ©ordie("html-src/$dir/$name.css", "html/jmlr.css"); +} + +sub parsemainaux{ + my $mainaux = shift; + + &message("Reading '$mainaux'...\n"); + + unless (open AUX, "$mainaux") + { + if ($execute) + { + die "$appname: Can't open '$mainaux' $!\n"; + } + else + { + warn "(Can't open '$mainaux' - skipping)\n"; + return; + } + } + + 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; + } + elsif ($extractpreface) # v0.3 new + { + if (/^\\\@prefacestart{([^}]*)}{(\d*)}/) + { + $preface_data->{'Start'} = $1; + $preface_data->{'StartArabic'} = $2; + } + elsif (/^\\\@prefaceend{([^}]*)}/) + { + $preface_data->{'End'} = $1; + } + elsif (/^\\\@prefacefile{([^}]*)}{([^}]*)}/) + { + $preface_data->{'File'} = $1; + $preface_data->{'OutFile'} = $2; + } + elsif (/^\\\@prefaceeditor{(.*)}/) + { + my $name = $1; + $name=~s/\\\\.*//; + push @preface_editors, $name; + } + } + } + + # if preface is to be extracted, has the require data been found? + + if ($extractpreface) + { + unless ($preface_data->{'File'}) + { + warn "$appname: Can't find preface information in aux file.\n", + "Have you used the preface environment?\n"; + + $extractpreface = 0; + } + } + + close AUX; +} + +sub createprefacefile{ + my ($prefdir, $prefbase) = @_; + + my $prefout = "$prefbase.tex"; + + &messagecall("Create preface file '$prefout'\n"); + + return unless ($execute); + + # Open preface output file + + open PREFOUT, ">$prefout" + or die "$appname: Can't open '$prefout': $!\n"; + + print PREFOUT "\\batchmode", $eol if ($batchtex or $quiet); + print PREFOUT "\\makeatletter", $eol; + print PREFOUT "\\def\\input\@path{{../../}}", $eol; + print PREFOUT "\\makeatother", $eol; + + # Get the book's preamble + + my $filename = "$main_name$main_suffix"; + + open BOOK, $filename + or die "$appname: Can't open '$filename': $!\n"; + + while (<BOOK>) + { + if (/\\documentclass/) + { + unless (s/^([^%]*)\\documentclass\s*\[(.*)\]/$1\\documentclass[$2,html]/m) + { + s/^([^%]*)\\documentclass\s*/$1\\documentclass[html]/m; + } + + print PREFOUT; + } + elsif (/^\\begin{document}/) + { + if ($preface_data->{'Start'}=~/^[clxvi]+$/) + { + print PREFOUT "\\pagenumbering{roman}%", $eol; + } + elsif ($preface_data->{'Start'}=~/^[CLXVI]+$/) + { + print PREFOUT "\\pagenumbering{Roman}%", $eol; + } + + print PREFOUT + "\\setcounter{page}{", + $preface_data->{'StartArabic'}, + "}%", $eol; + + # \hypersetup{draft} is used to suppress links. + # (Only a partial document so internal links may be + # dead. Also prevents unwanted tag before the DOCTYPE + # line in the HTML file.) + + print PREFOUT + "\\hypersetup{draft}", $eol, + '\\makeatletter', + "\\\@openrightfalse\\input{../../$main_name.aux}", + '\\makeatother', $eol; + + print PREFOUT + "\\providecommand{\\HCode}[1]{}", $eol, + "\\title{\\prefacename}", $eol, + "\\begin{document}", $eol, + "\\HCode{<div id=\"content\">}", $eol; + + last; + } + else + { + print PREFOUT; + } + } + + close BOOK; + + # Preface file name will have '/' as directory divider + + my $preffile = $preface_data->{'File'}; + + if ($dd eq "\\") + { + $preffile=~s/\//\\/g; + } + + open PREFIN, $preffile + or die "$appname: Can't open '$preffile': $!\n"; + + my $scanning = 0; + + while (<PREFIN>) + { + # This is fairly primitive and works best when the begin + # and end of the environment are on their own line. + + if (/\\begin{preface}/) + { + print PREFOUT; + $scanning = 1; + } + elsif ($scanning) + { + print PREFOUT; + + last if /\\end{preface}/; + } + } + + close PREFIN; + + print PREFOUT + "\\HCode{", &htmltimestamp, "}", $eol, + "\\HCode{</div>}", $eol, + &htmlmenu, + "\\end{document}", $eol; + + close PREFOUT; + +} + +1; |