Differences

This shows you the differences between two versions of the page.

Link to this comparison view

submit_prepare.pl [2006/07/22 00:00] (current)
Line 1: Line 1:
 +===== submit_prepare.pl =====
  
 +This is a Perl script which automates some of the steps in preparing a file for submission to ApJ or astro-ph. It will never modify your original TeX file or figures, but instead creates copies with the desired changes. ​
 +
 +Use it like:
 +    submit_prepare.pl ​ myarticle.tex
 +and it will create a new subdirectory called "​submit"​ with a version of the article ready for submission. ​
 +
 +Use 
 +    submit_prepare.pl -x myarticle.tex
 +to copy all your images and shrink them into compressed JPEG format to meet ArXiV.org'​s file size limits.
 +
 +This script requires that you have both Ghostscript (gs) and jpeg2ps installed.
 +
 +
 +
 +<​code>​
 +#​!/​usr/​local/​bin/​perl
 +#
 +# submit_prepare.pl -- Marshall Perrin <​mperrin@astro.berkeley.edu>​
 +
 +#     ​Package up an article for submission to ApJ or ArXiV.org (astro-ph)
 +#     This involves renaming things to meet the ApJ file name standards,
 +#     ​and/​or re-compressing image files smaller to meet ArXiV'​s file
 +#     size limit, and then compressing everything into a tar file.
 +#
 +#     It also strips out comments from the LaTeX file, both to reduce
 +#     file size further and in case you left any embarassing comments in that
 +#     you don't want the journal editor to see. ;-)
 +#
 +# Usage: ​   submit_prepare.pl [-x] [-r #] [-t] <​filename>​
 +#
 +# Options:
 +#           ​-x ​  ​prepare for ArXiV submission. This involves recompressing
 +#                all figures to a smaller size in order to meet the < 1MB limit.
 +#           -r # What resolution to use for JPEGs during ArXiV preparation.
 +#                Default is 150 dpi; make it smaller to shrink files more.
 +#           ​-t ​  ​automatically tar things up into submit.tar.gz
 +#
 +# Outputs: A directory called "​submit"​ which contains all the relevant stuff.
 +#       ​**WARNING** This script will overwrite any existing "​submit"​
 +#       ​subdirectory of the current directory. Any files therein will be lost!
 +#
 +# Requirements:​
 +#       You must have jpeg2ps and gs in your path. Get gs from Fink and
 +#       ​jpeg2ps from http://​www.pdflib.com/​products/​more/​jpeg2ps.html
 +#       or DarwinPorts.
 +#
 +# History:
 +#       ​2005-10-07 ​     Began. M. Perrin
 +#       ​2006-04-24 ​     Added option handling, checks for file name
 +#                       ​extensions,​ and general cleanup of the code.
 +#
 +#
 +# TODO: Make it check for includegraphics commands too, and optionally
 +#       ​convert them to plotones, stripping out any arguments
 +
 +use Getopt::​Std;​
 +# See http://​aplawrence.com/​Unix/​perlgetopts.html
 +# TODO make this better. ​
 +#        add an option to automatically latex and xdvi it for testing.
 +%options = ();
 +getopts("​xr:​t",​\%options);​
 +
 +if ($#ARGV < 0) { die "​Usage:​ submit_prepare.pl [-x] [-r #] [-t] <​filename>​\n"​}
 +
 +if (defined $options{r}) {
 +    $resolution = $options{r};​
 +    print " ​ Using resolution = $resolution\n";​
 +} else { $resolution = 150; }
 +
 +# are we preparing for submission to a journal (default; use full-res figures)
 +# or to ArXiv.org (aka astro-ph, in which case we need to compress the figures);
 +$arxiv_mode = defined $options{x};​
 +
 +$inputtex = $ARGV[0];
 +unless ($inputtex =~ /\.tex$/) {$inputtex .= "​.tex";​};​
 +
 +
 +print "Input file is $inputtex\n";​
 +
 +unless (-e $inputtex) {die "​Couldn'​t find that input file!\n"​}
 +
 +mkdir "​submit";​
 +`rm submit/*`; # clean out any leftover files there
 +
 +open IN,​$inputtex or die "​Error:​$!";​
 +open OUT,">​submit/​ms.tex"​ or die;
 +
 +$figcounter = 1;
 +while (<​IN>​) {
 +
 + #Remove any comments in the LaTeX file before submitting
 + s/​^%.*\n|([^\\])%.*\n/​$1/​go;​
 +
 + # Look to see if this line references a figure.
 + if (/​\\plotone{([^\}]*)}/​) {
 +     $fn = $1;
 +            # output a new version of the input line which links to
 +            # '​f1',​ '​f2',​ etc instead.
 +     s/​$fn/​f$figcounter.eps/;​
 +            prepare_figure($fn);​
 + }
 +        # repeat the above for includegraphics instead of plotone.
 + if (/​\\includegraphics(.*){([^\}]*)}/​) {
 +            $args = $1;
 +     $fn = $2;
 +            prepare_figure($fn);​
 + }
 +
 + print OUT;
 +
 +}
 +
 +# copy the BBL file, too (necessary for ApJ submission since they
 +# don't do BiBTeX directly)
 +$bblname = $inputtex;
 +$bblname =~ s/​\.tex/​\.bbl/;​
 +`cp $bblname submit/​ms.bbl`;​
 +
 +print "​\nOutput written to submit/​ms.tex\n";​
 +
 +if ($arxiv_mode) {
 +    $size = (split(/​\s+/,​`du -sk submit`))[0];​
 +    print " ​     Total size of submit directory: ​ $size kB\n\n";​
 +    if ($size >= 1024) {print "**** Warning! Size > 1 MB! ****\n";​ }
 +}
 +
 +
 +if (defined $options{t}) {
 +    system('​tar cvzf submit.tar.gz submit'​);​
 +    $size = (split(/​\s+/,​`ls -l submit.tar.gz`))[4];​
 +    $size = int($size/​1024);​
 +    print " ​      ​Created submit.tar.gz ​   $size kB\n\n";​
 +}
 +
 +
 +
 +######################################################################​
 +
 +sub prepare_figure {
 +    my ($fn);
 +    $fn = shift;
 +    print "​figure:​ $fn\t=> f$figcounter.eps\n\t";​
 +            # if $fn does not have an extension, assume it's .eps
 +            unless ($fn =~ /\.eps$/) { $fn .= "​.eps"​};​
 +            #TODO error checking for the case where $fn is not an EPS file!
 +
 +            unless (-e $fn) { die "I can't find the file $fn!"; }
 +
 +            ​
 +       if ($arxiv_mode) {
 +            # Now compress the figure for ArXiV'​s draconian requirements
 +            `gs -r$resolution -dEPSCrop -dTextAlphaBits=4 -sDEVICE=jpeg -sOutputFile=submit/​f$figcounter.jpg -dBATCH -dNOPAUSE $fn`;
 +           ​`jpeg2ps submit/​f$figcounter.jpg > submit/​f$figcounter.eps`;​
 +           `rm submit/​f$figcounter.jpg`;​
 +            # and use whichever is smaller
 +            $oldsize = -s "​$fn";​
 +            $newsize = -s "​submit/​f$figcounter.eps";​
 +            print "\tOld size:​\t$oldsize\tNew size:​\t$newsize\n";​
 + # ​          if ($oldsize < $newsize) {`cp $fn.eps submit/​f$figcounter.eps"​
 +        ​
 +        } else  {
 +            # We're just submitting to a journal. This is easy.
 +     `cp $fn submit/​f$figcounter.eps`;​
 +        }
 +
 +     ​$figcounter++;​
 +
 +
 +}
 +
 +</​code>​