diff options
author | Karl Berry <karl@freefriends.org> | 2013-03-10 22:38:10 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2013-03-10 22:38:10 +0000 |
commit | 89135e7e1b6a211b066867735c41e9a1a4310c5f (patch) | |
tree | 2196faea0cf74bd49d034d56443ae7644a638c35 /Build/source | |
parent | 6380d0315e1132891b4735999c26b0a41e6d1aaa (diff) |
pst2pdf (10mar13)
git-svn-id: svn://tug.org/texlive/trunk@29333 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source')
5 files changed, 1301 insertions, 1091 deletions
diff --git a/Build/source/texk/texlive/linked_scripts/Makefile.am b/Build/source/texk/texlive/linked_scripts/Makefile.am index a57d828b3be..e4d32e1c757 100644 --- a/Build/source/texk/texlive/linked_scripts/Makefile.am +++ b/Build/source/texk/texlive/linked_scripts/Makefile.am @@ -137,7 +137,7 @@ texmf_dist_other_scripts = \ pkfix/pkfix.pl \ pkfix-helper/pkfix-helper \ pmx/pmx2pdf.lua \ - pst2pdf/pst2pdf \ + pst2pdf/pst2pdf.pl \ purifyeps/purifyeps \ splitindex/perl/splitindex.pl \ sty2dtx/sty2dtx.pl \ diff --git a/Build/source/texk/texlive/linked_scripts/Makefile.in b/Build/source/texk/texlive/linked_scripts/Makefile.in index 5a2eeb4d833..bce3c7105c5 100644 --- a/Build/source/texk/texlive/linked_scripts/Makefile.in +++ b/Build/source/texk/texlive/linked_scripts/Makefile.in @@ -318,7 +318,7 @@ texmf_dist_other_scripts = \ pkfix/pkfix.pl \ pkfix-helper/pkfix-helper \ pmx/pmx2pdf.lua \ - pst2pdf/pst2pdf \ + pst2pdf/pst2pdf.pl \ purifyeps/purifyeps \ splitindex/perl/splitindex.pl \ sty2dtx/sty2dtx.pl \ diff --git a/Build/source/texk/texlive/linked_scripts/pst2pdf/pst2pdf b/Build/source/texk/texlive/linked_scripts/pst2pdf/pst2pdf deleted file mode 100755 index da0aba08e4d..00000000000 --- a/Build/source/texk/texlive/linked_scripts/pst2pdf/pst2pdf +++ /dev/null @@ -1,524 +0,0 @@ -eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' && eval 'exec perl -S $0 $argv:q' - if 0; - -use strict; # to be sure, that all is safe ... :-) - -# $Id: pst2pdf.pl 611 2011-12-14 08:41:35Z herbert $ -# v. 0.13 simplify the use of PSTricks with pdf -# 2011-12-12 (c) Herbert Voss <hvoss@tug.org> -# Pablo González Luengo and http://perlenespanol.com -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or (at -# your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the -# Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, -# MA 02111-1307 USA -# -use File::Path; # creating/removing dirs -use File::Copy; # copying files -use File::Basename; # scan argument -use IO::File; # simple IO operation -use Getopt::Long; # read parameter -#----------------------- User part begin ------------------------ -my $imageDir = "images"; # where to save the images -my $Iext = ".pdf"; # leave empty, if not a special one -my $tempDir = "."; # temporary directory -my $verbose = 1; # 0 or 1, logfile -my $clear = 0; # 0 or 1, clears all temporary files -my $DPI = 75; # very low value for the png's -my $Iscale = 1; # for \includegraphics -my $noImages = 0; # 1->create no images -my $runBibTeX = 0; # 1->runs bibtex -my $runBiber = 0; # 1->runs biber and sets $runBibTeX=0 -my $ppm = 0; # 1->create .ppm files -my $norun = 0; # 1->runs pdflatex -my $miktex = 0; # 1->runs pdlatex for miktex -my $eps = 0; # 1->create .eps files -#----------------------- User part end --------------------------- -#----------------------- program identification, options and help -my $program = "pst2pdf"; -my $ident = '$Id: pst2pdf.pl 611 2011-12-14 08:41:35Z herbert $'; -my $copyright = <<END_COPYRIGHT ; -Copyright 2011-01-18 (c) Herbert Voss <hvoss\@tug.org> -END_COPYRIGHT -my $licensetxt= <<END_LICENSE ; - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, - MA 02111-1307 USA -END_LICENSE -my $title = "$program $ident\n"; -my $usage = <<"END_OF_USAGE"; -${title}Usage: $program <texfile[,tex]> [Options] -pst2pdf run a TeX source, and convert all PS-related part as - single images (pdf and/or eps and/or png and/or ...) - and then runs pdflatex. See pst2pdf documentation for more info -Options: - --help - display this help and exit - --version - display version information and exit - --license - display license information and exit - --imageDir - the dir for the created images (default images) - --DPI=<int> - the dots per inch for a cretaed ppm files (default 75) - --ppm - create .ppm files - --eps - create .eps files - --Iscale=<real> - the value for [scale=] in \\includegraphics - --verbose - long log - --clear - delete all temp files - --norun - create file-pdf.tex, but, no run pdflatex - --runBibTeX - run bibtex on the aux file, if exists - --runBiber - run biber on the bcf file, if exists - --miktex - for miktex users -enable-write18 -Examples: -* $program test.tex --clear --ppm --eps -* produce test-pdf.tex and .ppm,.eps,.tex and .pdf for all images in image dir -END_OF_USAGE -# -my $result=GetOptions ( - "help", - "version", - "license", - "DPI=i" => \$DPI, # numeric - "Iscale=f" => \$Iscale, # real - "imageDir=s" => \$imageDir, # string - "tempDir=s" => \$tempDir, # string - "Iext=s" => \$Iext, # string - "clear" => \$clear, # flag - "noImages" => \$noImages, # flag - "runBibTeX" => \$runBibTeX, # flag - "ppm" => \$ppm, # flag - "norun" => \$norun, # flag - "miktex" => \$miktex, # flag - "eps" => \$eps, # flag - "runBiber" => \$runBiber, # flag - "verbose" => \$verbose, -) or die $usage; -# help functions -sub debug { print STDERR "* @_\n" if $::opt_debug; } -sub warning { print STDERR "==> Warning: @_\n"; } -sub error { die "$title!!! Error: @_\n"; } -sub errorUsage { die "Error: @_ (try --help for more information)\n"; } -# options for command line -if ($::opt_help) { - print $usage; - exit (0); -} -if ($::opt_version) { - print $title; - print $copyright; - exit (0); -} -if ($::opt_license) { - print $licensetxt; - exit (0); -} -# open file -my $InputFilename = ""; -if ($::opt_filter) { - @ARGV == 0 or - errorUsage "Input file cannot be used with filter option"; - debug "Filtering: will read standard input"; -} else { - @ARGV > 0 or errorUsage "Input filename missing"; - @ARGV < 2 or errorUsage "Unknown option or too many input files"; - $InputFilename = $ARGV[0]; - debug "Input filename:", $InputFilename; -} -my @SuffixList = (".tex","",".ltx"); # possible extensions -my ($name,$path,$ext) = fileparse($ARGV[0],@SuffixList); -if ($ext eq "") { $ext = ".tex"; } # me need the extension as well -my $TeXfile = "$path$name$ext"; -my $Logfile = "$tempDir/$name.plog"; # our own log file -open (LOGfile,">$Logfile") or die "cannot open $Logfile!"; -LOG ("Parameters:"); -LOG ("==> imageDir = $imageDir"); -LOG ("==> Iext = $Iext"); -LOG ("==> DPI = $DPI"); -LOG ("==> Iscale = $Iscale"); -LOG ("==> tempDir = $tempDir"); -LOG ("==> verbose = $verbose"); -LOG ("==> clear = $clear"); -LOG ("==> noImages = $noImages"); -LOG ("==> runBibTeX= $runBibTeX"); -LOG ("==> runBiber = $runBiber"); -LOG ("==> ppm = $ppm"); -LOG ("==> norun = $norun"); -LOG ("==> miktex = $miktex"); -LOG ("==> eps = $eps"); - -if ($runBibTeX && $runBiber) { - LOG ("!!! you cannot run BibTeX and Biber at the same document ..."); - LOG ("!!! Assuming to run Biber"); - $runBibTeX = 0; -} -if ($ppm) { - LOG ("Generate .ppm files ..."); - $ppm = 1; -} -if ($norun) { - LOG ("no compile file-pdf.tex"); - $norun = 1; -} -if ($miktex) { - LOG ("enable write 18 ..."); - $miktex = 1; -} -if ($eps) { - LOG ("Generate .eps files ..."); - $eps = 1; -} - -my $imgNo = 1; # internal image counter -my $pstExaLoaded = 0; # Document loads pst-exa - -LOG ("Running on [$path][$name][$ext]"); -open (FILE, "<$TeXfile") or die "cannot open source file $TeXfile!"; # the source -if (!$noImages ) { - if (-d $imageDir) { LOG ("$imageDir exists") } - else { mkdir("$imageDir", 0744) || die "cannot mkdir $imageDir: $!"; -LOG ("Imagedir created"); } -LOG ("go to savePreamble ... "); -savePreamble($name); -runBurst("$tempDir"); -LOG ("done!\n go to runFile ..."); -runFile($name); -LOG ("done!"); -close FILE; # close source file -}# !noImages - -#------------ Create filename-pics.pdf, split and generate .ppm -sub runBurst{ -if ($miktex){system("pdflatex -enable-write18 -interaction=nonstopmode $tempDir/$name");} -else{system("pdflatex -shell-escape -interaction=nonstopmode $tempDir/$name");} -system("pdftk $name-pics.pdf burst output $imageDir/$name-tmp-\%1d.pdf"); -if ($ppm){system("pdftoppm -r $DPI $name-pics.pdf $imageDir/$name-tmp"); -# Renaming .ppm neded for windows -if ($^O eq 'MSWin32') { -my $dren = "$tempDir/$imageDir"; -my $fichero = ''; -my $ppmren = ''; -my $renNo = 1; -if(opendir(DIR,$dren)){ - foreach (readdir DIR){ - $fichero = $_; - if ($fichero =~ /([^\d]+)(\d+).ppm/){ - my $renNo=int($2); - my $newname="$1$renNo.ppm"; - $ppmren = rename("$dren/$fichero","$dren/$newname"); - } - } - } - else - { - print "dont open".$dren; - } -closedir DIR; -} -# end renaming -} -} -#------------ end pdftk burst -LOG ("runpdfTeX ... "); -runpdfTeX("$path$name",$name); -LOG ("all finished ... :-)"); -close LOGfile; - -if ( $clear ) { -unlink "$path$name.txt"; -unlink "$path$name.log"; -unlink "$path$name.plog"; -unlink "$path$name.preamble"; -unlink "$path$name.pdf"; - } -# create a preamble file -# if we have a \input command inside the preamble, it doesn't hurt, we need -# it anyway for the postscript files and the pdf one. -sub savePreamble { - my $filename = pop; # get the file name - LOG ("----- Start Preamble -----"); - open (FILEp, ">$tempDir/$filename.preamble") - or die "cannot open preamble file $tempDir/$filename.preamble!"; - while (<FILE>) { # read all until \begin{document} - $pstExaLoaded = index($_,"usepackage{pst-exa}"); - my $i = index($_,"begin{document}"); - if ($i > 0) { - if ($i > 1) { print FILEp substr($_,0,--$i); } # write all until \begin{document} - close(FILEp); # close preamble - LOG ("----- Close Preamble ------"); - return; - } else { - print FILEp "$_"; # write into preamble - LOG ("$_"); - } - } - close(FILEp); - if ( $verbose ) { LOG("<-----Preamble<----"); } - return; -} - -sub searchPS { # search the PostScript parts - my @PS = (); # single PS sequence - my @PStotal = (); # all PS sequences as list of arrays - my $depth = -1; # counts nested macros - my $type = -1; # -1-> none; 1->PST; 2->PS; - my $EndDocument = 0; # ignore all after \end{document} - my $iVerb = 0; # test for verbatim or lstlisting environment, must be ignored - while (<FILE>) { # scan the input file - if (!$EndDocument) { - chomp; # delete EOL character - my $line = $_; # save line - if ( !$iVerb ) { - $iVerb = ((index($line,"begin{verbatim}") > 0) or (index($line,"begin{lstlisting}") > 0)); - } # do nothing until \end{verbatim} - if ( !$iVerb ) { - my $iPS = index($line,"begin{postscript}"); - my $iPST = index($line,"begin{pspicture*}"); - if ($iPST < 0) { $iPST = index($line,"begin{pspicture}"); } # alternative - if ($iPST < 0) { $iPST = index($line,"pspicture"); } # alternative \pspicture... - if (($iPS > 0) && ( $type == 1 )){ print "postscript environment must be of outer level!\n"; exit 1; } - if ( $type < 0 ) { # no active environment - if ($iPS > 0) { # we have \begin{postscript} - $type = 2; - $line = substr($line,$iPS-1); # add rest of the line - LOG("PS-Zeile: $line"); - } - elsif ( $iPST > 0 ) { # we have \begin{pspicture} or \pspicture - $type = 1; - $depth++; - $line = substr($line,$iPST-1); # add all unitl pspicture - LOG("PST-Zeile: $line"); - } - } -# we have now \begin{pspicture} or \begin{postscript} - if ($type > 0) { # start Scan, we have an environment - LOG ("searchPS: set \$type=$type"); - $iPST = index($line,"end{pspicture*}"); - if ($iPST < 0) { $iPST = index($line,"end{pspicture}"); } # alternative - if ($iPST < 0) { $iPST = index($line,"endpspicture"); } # alternative \endpspicture... - $iPS = index($line,"end{postscript}"); - if ($iPST > 0) { # test, we can have postscript and pspicture in one line - if ( $type < 2) { # found end of pspicture environment - LOG ("searchPS: $line"); - $depth--; - if ($depth < 0) { - $type = -1; - if (index($line,"endpspicture") > 0) # add line, depends to type - { push @PS,substr($line,0,$iPST+12); } # \endpspicture - elsif (index($line,"pspicture*") > 0) - { push @PS,substr($line,0,$iPST+15); }# \end{pspicture} - else { push @PS,substr($line,0,$iPST+14); } # \end{pspicture} - LOG ("searchPS: set \$type=$type"); - push @PStotal,[@PS]; # add PS sequence - LOG ("---->PS---->\n@PS\n<----PS<----"); - @PS = (); # start new PS sequence - } # no pspicture env left - } else { push @PS,$line; } # pspicture inside postscript - } elsif ($iPS > 0) { # must be type=1 -> stop Scan - LOG ("searchPS: $line"); - $type = -1; - push @PS,substr($line,0,$iPS+15); # add line - LOG ("searchPS: set \$type=$type"); - push @PStotal,[@PS]; # add PS sequence - LOG ("---->PS---->\n@PS\n<----PS<----"); - @PS =(); # start new PS sequence - } else { push @PS,$line; } # add line - } - my $i = index($line,"end{document}"); - if ($i > 0) { $EndDocument++; LOG("EndDocument in searchPS"); } - } # if ( $iVerb ) - if (( index($line,"end{verbatim}") > 0 ) or ( index($line,"end{lstlisting}") > 0 )) { $iVerb = 0; } - }} - if ( $verbose ) { - LOG("---->PStotal---->"); - for my $aref ( @PStotal ) { - my @a = @$aref; - my $i = 0; - foreach ( @a ) { LOG ($a[$i]); $i++; } - } - LOG ("<----PStotal<----"); - } - close(FILE); - return @PStotal; # return all PS sequences -} - -# Creating subfiles.tex and .eps for images -sub runTeX{ - my $filename = pop; - my $name = "$filename"; - copy("$filename.tex", "$imageDir/$filename-$imgNo.tex") or die "Cannot copy Source file!"; - if ($eps){ - system("pdftops -level3 -eps $imageDir/$filename-$imgNo.pdf $imageDir/$filename-$imgNo.eps"); - } -$imgNo=$imgNo+1; -} - -sub runFile { - my $filename = pop; - my @PSarray = searchPS(); - if ( $verbose ) { - LOG("---->PSarray---->"); - for my $aref ( @PSarray ) { - my @a = @$aref; - my $i = 0; - foreach ( @a ) { print LOG $a[$i]."\n"; $i++; } - } - LOG("<----PSarray<----"); - my $no = @PSarray; - LOG("PS: ".$no." PS sequence(s)"); - } - for my $aref ( @PSarray ) { - my @PS = @$aref; - open (FILEp,"<$tempDir/$filename.preamble") or die "cannot open $tempDir/$filename.preamble!"; - open (FILEsub,">$tempDir/$filename-tmp.tex") or die "cannot open $tempDir/$filename-tmp.tex!"; - while (<FILEp>) {print FILEsub $_; } - print FILEsub "\\pagestyle{empty}\n"; - print FILEsub "\\begin{document}\n"; - if ( $verbose ) { LOG("\@PS: $_"); } - foreach ( @PS ) { print FILEsub "$_\n"; } - print FILEsub "\\end{document}\n"; - close (FILEsub); - close (FILEp); - runTeX("$tempDir/$filename-tmp"); - } -} -# Replace files -sub runpdfTeX() { - my ($name,$pdfname) = @_; - open (PDF, ">$tempDir/$pdfname-pdf.tex") or die "cannot open $tempDir/$pdfname-pdf.tex!"; - open (FILE, "<$name.tex") or die "cannot open $name!"; - my $ignore = 0; - my $IMGno = 1; - my $depth = -1; - my $type = -1; - my $EndDocument = 0; # ignore all after \end{document} - my $iVerb = 0; - while (<FILE>) { # scan the input file - if ( !$iVerb ) { - $iVerb = ((index($_,"begin{verbatim}") > 0) or (index($_,"begin{lstlisting}") > 0)); - } # do nothing until \end{verbatim}|| \end{lstlisting} - if ( !$iVerb ) { - my $i = index($_,"end{document}"); - if ($i > 0) { print PDF $_; $EndDocument++; LOG("EndDocument in runpdfTeX"); } - if ( !$EndDocument ) { - my $iPS = index($_,"begin{postscript}"); - if ( $iPS > 0 ) { - $type = 2; - $ignore = 1; - if ($iPS > 1) { print PDF substr($_,0,--$iPS); } # add preceeding text - print PDF "\\includegraphics[scale=$Iscale]{$pdfname-tmp-$IMGno}"; # use pdfname - $IMGno=$IMGno+1; - } # postscript env - if ( $type < 2 ) { - my $iPST = index($_,"begin{pspicture*}"); - if ($iPST < 0) { $iPST = index($_,"begin{pspicture}"); } # alternative ... - if ($iPST < 0) { $iPST = index($_,"\\pspicture"); } # alternative \endpspicture... - if ( $iPST >= 0 ) { # start Scan - $ignore = 1; - $type = 1; - $depth++; # pspicture env - LOG("Increase depth: $depth"); - if ( $depth == 0 ) { - if ($iPST > 1) { print PDF substr($_,0,--$iPST); } # add preceeding text - print PDF "\\includegraphics[scale=$Iscale]{$pdfname-tmp-$IMGno}"; # use \graphicspath - $IMGno=$IMGno+1; - LOG("Increase Image counter: $IMGno"); - } - } - } - if ( !$ignore ) { print PDF "$_"; } # default line - if ( $type == 2 ) { # postscript env - my $iPS = index($_,"end{postscript}"); - if ($iPS > 0) { - print PDF substr($_,$iPS+15); # rest of line - $ignore = 0; - $type=-1; - } # end Scan - } elsif ( $type == 1 ) { # pspicture env - my $iPST = index($_,"end{pspicture*}"); - if ($iPST < 0) { $iPST = index($_,"end{pspicture}"); } # alternative ... - if ($iPST < 0) { $iPST = index($_,"endpspicture"); } # alternative \endpspicture... - if ($iPST > 0) { # end Scan - if (index($_,"endpspicture") > 0) # add rest of line, depends to type - { print PDF substr($_,$iPST+12); } # \endpspicture - elsif (index($_,"pspicture*") > 0) - { print PDF substr($_,$iPST+15); } # \end{pspicture*} - else { print PDF substr($_,$iPST+14); } # \end{pspicture} - $depth--; - LOG("Decrease depth: $depth"); - if ($depth < 0) { $ignore = 0; } - } - } - } # if ( !$EndDocument ) - } else { print PDF $_; } # if ( $iVerb ) - if (( index($_,"end{verbatim}") > 0 ) or ( index($_,"end{lstlisting}") > 0 )) { $iVerb = 0; } - } # while (<FILE>) - close (FILE); - close (PDF); -# Coment pst-package - open (IPDF, "<$tempDir/$pdfname-pdf.tex"); - undef $/; # read all file - my ($uno,$dos) = split(/\\begin\{document\}/,<IPDF>,2); - close IPDF; - - my @coment = split /\n/, $uno; # split in two - my @preamb; - - foreach my $line (@coment) { - chomp($line); - $line =~ s/\\usepackage(?:\[.+?\])?\{pst.+?}//g; # delete - $line =~ s/\\usepackage(?:\[.+?\])?\{psfr.+?}//g; # delete - $line =~ s/(\\usepackage(?:\[.+?\])?)\{auto-pst.+?}//g; # delete - $line =~ s/(\\usepackage(?:\[.+?\])?)\{vaucanson-.+?}//g; # delete - $line =~ s/(\\usepackage(?:\[.+?\])?)\{psgo}//g; # delete - $line =~ s/(\\usepackage(?:\[.+?\])?)\{graph/\%$1\{graph/g; # comment - next if $line =~ m/^\s*$/; - push(@preamb,$line); # adding changes -} -my $clean = join("\n", @preamb, "\\usepackage{grfext}\n\\\PrependGraphicsExtensions*{$Iext}\n\\usepackage{graphicx}\n\\graphicspath{{$imageDir/}}\n\\begin{document}\n". $dos); - -open (OPDF,">$tempDir/$pdfname-pdf.tex"); # write changes -print OPDF $clean; -close OPDF; -# close coment pst-package - -my $runAgain = 0; -if ($norun){print "Done\n";} -else {system("pdflatex -interaction=nonstopmode $pdfname-pdf");} -if (-e "$tempDir/$pdfname-pdf.idx") { system("makeindex $tempDir/$pdfname-pdf.idx"); $runAgain++; } -if ($runBibTeX && -e "$tempDir/$pdfname-pdf.aux") { system("bibtex $tempDir/$pdfname-pdf"); $runAgain++; } -if ($runBiber && -e "$tempDir/$pdfname-pdf.bcf") { system("biber $tempDir/$pdfname-pdf"); $runAgain++; } -if ($runAgain) { system("pdflatex $tempDir/$pdfname-pdf"); } -if ( $clear ) { - unlink "$name.txt"; - unlink "$tempDir/$name.aux"; - unlink "$tempDir/$pdfname-pdf.log"; - unlink "$tempDir/$pdfname-pdf.aux"; - unlink "$tempDir/$pdfname-pdf-autopp.txt"; - unlink "$tempDir/$pdfname-pics.pdf"; - unlink "$tempDir/doc_data.txt"; - unlink "$tempDir/$pdfname-tmp.tex"; - } -} - -sub LOG() { - if ( $verbose ) { print LOGfile "@_\n"; } -} -__END__ diff --git a/Build/source/texk/texlive/linked_scripts/pst2pdf/pst2pdf.pl b/Build/source/texk/texlive/linked_scripts/pst2pdf/pst2pdf.pl new file mode 100755 index 00000000000..040cdf7e7dd --- /dev/null +++ b/Build/source/texk/texlive/linked_scripts/pst2pdf/pst2pdf.pl @@ -0,0 +1,659 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' && eval 'exec perl -S $0 $argv:q' + if 0; + +use strict; # to be sure, that all is safe ... :-) + +# $Id: pst2pdf.pl 611 2011-12-14 08:41:35Z herbert $ +# v. 0.14 simplify the use of PSTricks with pdf +# 2011-12-12 (c) Herbert Voss <hvoss@tug.org> +# Pablo González Luengo +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or (at +# your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the +# Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# +use File::Path; # creating/removing dirs +use File::Copy; # copying files +use File::Basename; # scan argument +use IO::File; # simple IO operation +use Getopt::Long; # read parameter +use autodie; +#----------------------- User part begin ------------------------ +my $imageDir = "images";# where to save the images +my $Iext = ".pdf"; # leave empty, if not a special one +my $tempDir = "."; # temporary directory +my $verbose = 0; # 0 or 1, logfile +my $clear = 0; # 0 or 1, clears all temporary files +my $DPI = 75; # very low value for the png's +my $Iscale = 1; # for \includegraphics +my $noImages = 0; # 1->create no images +my $single = 0; # 1->single create images +my $runBibTeX = 0; # 1->runs bibtex +my $runBiber = 0; # 1->runs biber and sets $runBibTeX=0 +my $ppm = 0; # 1->create .ppm files +my $norun = 0; # 1->runs pdflatex +my $eps = 0; # 1->create .eps files +my $files = 0; # 1->create image files .tex +my $all = 0; # 1->create all images and files for type +my $nopdftk = 0; # 1->create all images and files for type in single mode +my $xetex = 0; # 1->Using XeLaTeX for compilation. +#----------------------- User part end --------------------------- +#-------------- program identification, options and help --------- +my $program = "pst2pdf"; +my $ident = '$Id: pst2pdf.pl 611 2011-12-14 08:41:35Z herbert $'; +my $copyright = <<END_COPYRIGHT ; +Copyright 2011-01-18 (c) Herbert Voss <hvoss\@tug.org> +END_COPYRIGHT +my $licensetxt= <<END_LICENSE ; + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, + MA 02111-1307 USA +END_LICENSE +my $title = "$program $ident\n"; +my $usage = <<"END_OF_USAGE"; +${title}Usage: $program <texfile.tex> [Options] +pst2pdf run a TeX source, and convert all PS-related part as + single images (pdf or eps or ppm, default pdf) + and then runs pdflatex. See pst2pdf documentation for more info +Options: + --help - display this help and exit + --version - display version information and exit + --license - display license information and exit + --imageDir - the dir for the created images (default images) + --DPI=<int> - the dots per inch for a cretaed ppm files (default 75) + --ppm - create .ppm files + --eps - create .eps files + --Iscale=<real> - the value for [scale=] in \\includegraphics + --noImages - generate files without compile (need -norun) + --verbose - creates long log + --clear - delete all temp files + --norun - create file-pdf.tex, but, no run pdflatex + --runBibTeX - run bibtex on the aux file, if exists + --runBiber - run biber on the bcf file, if exists + --files - create images files (.tex) for all pst enviroment + --single - create images whitout pdftk and auto-pst-pdf + --all - create all image type and images.tex + --nopdftk - create all image type and images.tex in single mode + --xetex - using XeLaTeX for compilation. +Examples: +* $program test.tex --all +* produce test-pdf.tex and ppm,eps,tex and pdf for pst-enviroment in image dir +END_OF_USAGE +# +my $result=GetOptions ( + "help", + "version", + "license", + "DPI=i" => \$DPI, # numeric + "Iscale=f" => \$Iscale, # real + "imageDir=s" => \$imageDir, # string + "tempDir=s" => \$tempDir, # string + "Iext=s" => \$Iext, # string + "clear" => \$clear, # flag + "noImages" => \$noImages, # flag + "single" => \$single, # flag + "runBibTeX" => \$runBibTeX, # flag + "ppm" => \$ppm, # flag + "norun" => \$norun, # flag + "eps" => \$eps, # flag + "files" => \$files, # flag + "all" => \$all, # flag + "nopdftk" => \$nopdftk, # flag + "xetex" => \$xetex, # flag + "runBiber" => \$runBiber, # flag + "verbose" => \$verbose, +) or die $usage; +#---------------- help functions -------------------------------- +sub errorUsage { die "Error: @_ (try --help for more information)\n"; } +# options for command line +if ($::opt_help) { +print $usage; + exit (0); +} +if ($::opt_version) { + print $title; + print $copyright; + exit (0); +} +if ($::opt_license) { + print $licensetxt; + exit (0); +} +# open file +my $InputFilename = ""; + @ARGV > 0 or errorUsage "Input filename missing"; + @ARGV < 2 or errorUsage "Unknown option or too many input files"; + $InputFilename = $ARGV[0]; + +my @SuffixList = (".tex","",".ltx"); # possible extensions +my ($name,$path,$ext) = fileparse($ARGV[0],@SuffixList); +if ($ext eq "") { $ext = ".tex"; } # me need the extension as well +my $TeXfile = "$path$name$ext"; +open my $LOGfile,'>', "$tempDir/$name.plog"; # our own log file + LOG ("Parameters:"); + LOG ("==> imageDir = $imageDir"); + LOG ("==> Iext = $Iext"); + LOG ("==> DPI = $DPI"); + LOG ("==> Iscale = $Iscale"); + LOG ("==> tempDir = $tempDir"); + LOG ("==> verbose = $verbose"); + LOG ("==> clear = $clear"); + LOG ("==> noImages = $noImages"); + LOG ("==> single = $single"); + LOG ("==> runBibTeX= $runBibTeX"); + LOG ("==> runBiber = $runBiber"); + LOG ("==> ppm = $ppm"); + LOG ("==> norun = $norun"); + LOG ("==> eps = $eps"); + LOG ("==> files = $files"); + LOG ("==> xetex = $xetex"); + +if ($runBibTeX && $runBiber) { + LOG ("!!! you cannot run BibTeX and Biber at the same document ..."); + LOG ("!!! Assuming to run Biber"); + $runBibTeX = 0; +} +if ($ppm) { + LOG ("Generate .ppm files ..."); + $ppm = 1; +} +if ($norun) { + LOG ("no compile $name-pdf.tex"); + $norun = 1; +} +if ($eps) { + LOG ("Generate .eps files ..."); + $eps = 1; +} +if ($files) { + LOG ("Generate .tex images files ..."); + $files=1; +} +if ($all) { + LOG ("Generate all images files ..."); + $files=$eps = $ppm = $clear = 1; +} +if ($nopdftk) { + LOG ("single mode generate all images files ..."); + $single=$files=$eps = $ppm = $clear = 1; +} +if ($xetex) { + LOG ("Compiling using XeLaTeX ..."); + $xetex=1; +} + +my $imgNo = 1; # internal image counter +#----------- single mode no need pdftk and auto-pst-pdf ---------------------- +if ($single) { +LOG ("Running on [$path][$name][$ext]"); +open my $FILE,'<', "$TeXfile" ; # the source +LOG ("single mode generate images..."); +if (-d $imageDir) { LOG ("$imageDir exists") } +else { mkdir("$imageDir", 0744) ;} +savePreamble($name); +runFile($name); +close $FILE; # close source file +close $LOGfile; +} +#---------------- end single -------------- +else{ +LOG ("Running on [$path][$name][$ext]"); +open my $FILE,'<', "$TeXfile" ; # the source +if (!$noImages ) { +if (-d $imageDir) { LOG ("$imageDir exists") } +else { mkdir("$imageDir", 0744) ; +LOG ("Imagedir created"); } +LOG ("go to savePreamble ... "); +runBurst($tempDir); +savePreamble($name); +runFile($name); +LOG ("done!\n go to runFile ..."); +LOG ("done!"); +close $FILE; # close source file +close $LOGfile; +}# !noImages +} +#------------ Create filename-pics.pdf, split and generate .ppm +sub runBurst{ +if ($single){ print "single mode";} +else{ +my $entrada = "$TeXfile"; +my $salida = "$name-pics.tex"; + open my $ENTRADA,'<', "$entrada"; + open my $SALIDA,'>',"$salida"; + print $SALIDA "\\AtBeginDocument\{\n"; +if ($xetex){ + print $SALIDA "\\RequirePackage\[xetex,active,tightpage\]\{preview\}\n";} +else{ + print $SALIDA "\\RequirePackage\[active,dvips,tightpage\]\{preview\}\n";} + print $SALIDA "\\renewcommand\\PreviewBbAdjust\{-600pt -600pt 600pt 600pt\}\n"; + print $SALIDA "\\newenvironment{postscript}{}{}\n"; + print $SALIDA "\\PreviewEnvironment\{postscript\}\n"; + print $SALIDA "\\PreviewEnvironment\{pspicture\}\}\n"; + while ( my $linea = <$ENTRADA> ) { + print $SALIDA $linea;} + close $ENTRADA; + close $SALIDA; +# --------------------Compiling File -------------------------- +if ($xetex){ + system("xelatex -interaction=batchmode $tempDir/$name-pics.tex"); + system("pdfcrop -xetex $tempDir/$name-pics.pdf $tempDir/$name-pics.pdf");} +else{ + system("latex -interaction=batchmode $tempDir/$name-pics.tex"); + system("dvips $tempDir/$name-pics.dvi"); + system("ps2pdf -dProcessColorModel=/DeviceCMYK -dPDFSETTINGS=/prepress $tempDir/$name-pics.ps"); + system("pdfcrop $tempDir/$name-pics.pdf $tempDir/$name-pics.pdf");} + system("pdftk $tempDir/$name-pics.pdf burst output $imageDir/$name-fig-\%1d.pdf"); +if ($ppm){ + system("pdftoppm -r $DPI $tempDir/$name-pics.pdf $imageDir/$name-fig");} + } +} +#------------ end pdftk burst +LOG ("runpdfTeX ... "); +runpdfTeX("$path$name",$name); +LOG ("all finished ... :-)"); +# create a preamble file +# if we have a \input command inside the preamble, it doesn't hurt, we need +# it anyway for the postscript files and the pdf one. +# ----------------- Save Preamble ---------------------------------------- +sub savePreamble { +my $filename = pop; # get the file name + LOG ("----- Start Preamble -----"); +open my $FILEp,'>',"$tempDir/$filename.preamble"; +open my $FILE, '<', "$name.tex"; + while (<$FILE>) { # read all until \begin{document} + my $i = index($_,"begin{document}"); + if ($i > 0) { + if ($i > 1) { print $FILEp substr($_,0,--$i); } # write all until \begin{document} + if ($single) { + print $FILEp "\\newenvironment{postscript}{}{}\n"; + print $FILEp "\\pagestyle{empty}\n"; + } +close $FILEp; # close preamble + LOG ("----- Close Preamble ------"); + return; + } +else { + print $FILEp "$_"; # write into preamble + LOG ("$_"); + } +} +close $FILE; +close $FILEp; + if ( $verbose ) { LOG("<-----Preamble<----"); } + return; +} + +sub searchPS { # search the PostScript parts + my @PS = (); # single PS sequence + my @PStotal = (); # all PS sequences as list of arrays + my $depth = -1; # counts nested macros + my $type = -1; # -1-> none; 1->PST; 2->PS; + my $EndDocument = 0;# ignore all after \end{document} + my $iVerb = 0; # test for verbatim or lstlisting environment, must be ignored + open my $FILE, '<', "$name.tex"; + while (<$FILE>) { # scan the input file + if (!$EndDocument) { + chomp; # delete EOL character + my $line = $_; # save line + if ( !$iVerb ) { + $iVerb = ((index($line,"begin{verbatim}") > 0) + or (index($line,"begin{lstlisting}") > 0) + or (index($line,"begin{Verbatim}") > 0) + or (index($line,"begin{verbatim*}") > 0)); + } # do nothing until \end{verbatim} + if ( !$iVerb ) { + my $iPS = index($line,"begin{postscript}"); + my $iPST = index($line,"begin{pspicture*}"); + if ($iPST < 0) { $iPST = index($line,"begin{pspicture}"); } # alternative + if ($iPST < 0) { $iPST = index($line,"pspicture"); } # alternative \pspicture... + if (($iPS > 0) && ( $type == 1 )){ print "postscript environment must be of outer level!\n"; exit 1; } + if ( $type < 0 ) { # no active environment + if ($iPS > 0) { # we have \begin{postscript} + $type = 2; + $line = substr($line,$iPS-1); # add rest of the line + LOG("PS-Zeile: $line"); + } + elsif ( $iPST > 0 ) { # we have \begin{pspicture} or \pspicture + $type = 1; + $depth++; + $line = substr($line,$iPST-1);# add all unitl pspicture + LOG("PST-Zeile: $line"); + } + } +# we have now \begin{pspicture} or \begin{postscript} + if ($type > 0) { # start Scan, we have an environment + LOG ("searchPS: set \$type=$type"); + $iPST = index($line,"end{pspicture*}"); + if ($iPST < 0) { $iPST = index($line,"end{pspicture}"); } # alternative + if ($iPST < 0) { $iPST = index($line,"endpspicture"); } # alternative \endpspicture... + $iPS = index($line,"end{postscript}"); + if ($iPST > 0) { # test, we can have postscript and pspicture in one line + if ( $type < 2) { # found end of pspicture environment + LOG ("searchPS: $line"); + $depth--; + if ($depth < 0) { + $type = -1; + if (index($line,"endpspicture") > 0) # add line, depends to type + { push @PS,substr($line,0,$iPST+12); } # \endpspicture + elsif (index($line,"pspicture*") > 0) + { push @PS,substr($line,0,$iPST+15); }# \end{pspicture} + else { push @PS,substr($line,0,$iPST+14); } # \end{pspicture} + LOG ("searchPS: set \$type=$type"); + push @PStotal,[@PS]; # add PS sequence + LOG ("---->PS---->\n@PS\n<----PS<----"); + @PS = (); # start new PS sequence + } # no pspicture env left + } else { push @PS,$line; } # pspicture inside postscript + } elsif ($iPS > 0) { # must be type=1 -> stop Scan + LOG ("searchPS: $line"); + $type = -1; + push @PS,substr($line,0,$iPS+15); # add line + LOG ("searchPS: set \$type=$type"); + push @PStotal,[@PS]; # add PS sequence + LOG ("---->PS---->\n@PS\n<----PS<----"); + @PS =(); # start new PS sequence + } else { push @PS,$line; } # add line + } + my $i = index($line,"end{document}"); + if ($i > 0) { $EndDocument++; LOG("EndDocument in searchPS"); } + } # if ( $iVerb ) + if (( index($line,"end{verbatim}") > 0 ) + or ( index($line,"end{lstlisting}") > 0 ) + or ( index($line,"end{Verbatim}") > 0 ) + or ( index($line,"end{verbatim*}") > 0 )) { $iVerb = 0; } + }} + if ( $verbose ) { + LOG("---->PStotal---->"); + for my $aref ( @PStotal ) { + my @a = @$aref; + my $i = 1; + foreach ( @a ) { LOG ($a[$i]); $i=$i+1; } + } + LOG ("<----PStotal<----"); + } + close $FILE; + return @PStotal; # return all PS sequences +} +# Creating ifile.tex and eps, pdf and ppm for images +if ($single){ +sub runsingle{ + my $filename = pop; + if ($xetex){ + system("xelatex -interaction=batchmode $tempDir/$filename-fig"); + system("pdfcrop -xetex $tempDir/$filename-fig.pdf $imageDir/$filename-fig-$imgNo.pdf");} + else{ + system("latex -interaction=batchmode $tempDir/$filename-fig"); + system("dvips $tempDir/$filename-fig"); + system("ps2pdf -dProcessColorModel=/DeviceCMYK -dPDFSETTINGS=/prepress $tempDir/$filename-fig.ps"); + system("pdfcrop $tempDir/$filename-fig.pdf $imageDir/$filename-fig-$imgNo.pdf");} + if ($files){ + copy("$filename-fig.tex", "$imageDir/$filename-fig-$imgNo.tex");} + system("pdfcrop $tempDir/$filename-fig.pdf $imageDir/$filename-fig-$imgNo.pdf"); + if ($eps) { + system("pdftops -level3 -eps $imageDir/$filename-fig-$imgNo.pdf $imageDir/$filename-fig-$imgNo.eps");} + if ($ppm) { + system("pdftoppm -r $DPI $imageDir/$filename-fig-$imgNo.pdf $imageDir/$filename-fig-$imgNo");} + $imgNo=$imgNo+1; + } +} +else{ +#----------------- Creating files.tex and .eps for images -------------- +sub runTeX{ + my $filename = pop; + if ($eps){ + system("pdftops -level3 -eps $imageDir/$filename-$imgNo.pdf $imageDir/$filename-$imgNo.eps"); + } + if ($files){ + copy("$filename.tex", "$imageDir/$filename-$imgNo.tex"); +} + $imgNo=$imgNo+1; +} +} +sub runFile { + my $filename = pop; + my @PSarray = searchPS(); + if ( $verbose ) { + LOG("---->PSarray---->"); + for my $aref ( @PSarray ) { + my @a = @$aref; + my $i = 1; + foreach ( @a ) { print LOG $a[$i]."\n"; $i=$i+1; } + } + LOG("<----PSarray<----"); + my $no = @PSarray; + LOG("PS: ".$no." PS sequence(s)"); + } + for my $aref ( @PSarray ) { + my @PS = @$aref; + open my $FILEp,'<',"$tempDir/$filename.preamble"; + open my $FILEsub,'>',"$tempDir/$filename-fig.tex"; + while (<$FILEp>) {print $FILEsub $_; } + print $FILEsub "\\begin{document}\n"; + if ( $verbose ) { LOG("\@PS: $_"); } + foreach ( @PS ) { print $FILEsub "$_\n"; } + print $FILEsub "\\end{document}"; + close $FILEsub; + close $FILEp; + if ($single) { + runsingle("$name"); + } + else{ + runTeX("$tempDir/$name-fig"); + } +} +} +# ----------------Renaming ppm need for correct name +if(!$noImages){ + my $dren = "$tempDir/$imageDir"; + my $fichero = ''; + my $ppmren = ''; + my $renNo = 1; + if(opendir(DIR,$dren)){ + foreach (readdir DIR){ + $fichero = $_; + if ( $fichero =~ /($name-fig-)(\d+|\d+[-]\d+).ppm/) { + my $renNo = int($2); + my $newname="$1$renNo.ppm"; + $ppmren = rename("$dren/$fichero","$dren/$newname"); + } + } +} +closedir DIR; +}# end renaming +#--------------------------- Replace files---------------------- +sub runpdfTeX() { + my ($name,$pdfname) = @_; + open my $PDF,'>',"$tempDir/$pdfname-pdf.tex"; + open my $FILE,'<',"$name.tex"; + my $ignore = 0; + my $IMGno = 1; + my $depth = -1; + my $type = -1; + my $EndDocument = 0; # ignore all after \end{document} + my $iVerb = 0; + while (<$FILE>) { # scan the input file + if ( !$iVerb ) { + $iVerb = ((index($_,"begin{verbatim}") > 0) + or (index($_,"begin{lstlisting}") > 0) + or (index($_,"begin{Verbatim}") > 0) + or (index($_,"begin{verbatim*}") > 0)); + } # do nothing until \end{verbatim}|| \end{lstlisting} + if ( !$iVerb ) { + my $i = index($_,"end{document}"); + if ($i > 0) { print $PDF $_; $EndDocument++; LOG("EndDocument in runpdfTeX"); } + if ( !$EndDocument ) { + my $iPS = index($_,"begin{postscript}"); + if ( $iPS > 0 ) { + $type = 2; + $ignore = 1; + if ($iPS > 1) { print $PDF substr($_,0,--$iPS); } # add preceeding text + print $PDF "\\includegraphics[scale=$Iscale]{$pdfname-fig-$IMGno}"; # use pdfname + $IMGno=$IMGno+1; + } # postscript env + if ( $type < 2 ) { + my $iPST = index($_,"begin{pspicture*}"); + if ($iPST < 0) { $iPST = index($_,"begin{pspicture}"); } # alternative ... + if ($iPST < 0) { $iPST = index($_,"\\pspicture"); } # alternative \\pspicture... + if ( $iPST >= 0 ) { # start Scan + $ignore = 1; + $type = 1; + $depth++; # pspicture env + LOG("Increase depth: $depth"); + if ( $depth == 0 ) { + if ($iPST > 1) { print $PDF substr($_,0,--$iPST); } # add preceeding text + print $PDF "\\includegraphics[scale=$Iscale]{$pdfname-fig-$IMGno}"; # use \graphicspath + $IMGno=$IMGno+1; + LOG("Increase Image counter: $IMGno"); + } + } + } + if ( !$ignore ) { print $PDF "$_"; } # default line + if ( $type == 2 ) { # postscript env + my $iPS = index($_,"end{postscript}"); + if ($iPS > 0) { + print $PDF substr($_,$iPS+15); # rest of line + $ignore = 0; + $type=-1; + } # end Scan + } + elsif ( $type == 1 ) { # pspicture env + my $iPST = index($_,"end{pspicture*}"); + if ($iPST < 0) { $iPST = index($_,"end{pspicture}"); } # alternative ... + if ($iPST < 0) { $iPST = index($_,"endpspicture"); } # alternative \endpspicture... + if ($iPST > 0) { # end Scan + if (index($_,"endpspicture") > 0) # add rest of line, depends to type + { print $PDF substr($_,$iPST+12); } # \endpspicture + elsif (index($_,"pspicture*") > 0) + { print $PDF substr($_,$iPST+15); } # \end{pspicture*} + else{ print $PDF substr($_,$iPST+14); } # \end{pspicture} + $depth--; + LOG("Decrease depth: $depth"); + if ($depth < 0) { $ignore = 0; } + } + } + } # if ( !$EndDocument ) + } + else { print $PDF $_; } # if ( $iVerb ) + if (( index($_,"end{verbatim}") > 0 ) + or ( index($_,"end{lstlisting}") > 0 ) + or ( index($_,"end{Verbatim}") > 0 ) + or ( index($_,"end{verbatim*}") > 0 )) { $iVerb = 0; } + } # while (<$FILE>) + close $FILE; + close $PDF; +#------------------- Coment pst-package for pdfLaTeX -------------------- + open my $IPDF,'<', "$tempDir/$pdfname-pdf.tex"; + undef $/; # read all file + my ($uno,$dos) = split(/\\begin\{document\}/,<$IPDF>,2); + close $IPDF; + + my @coment = split /\n/, $uno; # split in two + my @preamb; + + foreach my $line (@coment) { + chomp($line); + if(!$xetex){ + $line =~ s/\\usepackage(?:\[.+?\])?\{pst.+?}//g; # delete + $line =~ s/\\usepackage(?:\[.+?\])?\{psfr.+?}//g; # delete + $line =~ s/(\\usepackage(?:\[.+?\])?)\{auto-pst.+?}//g; # delete + $line =~ s/(\\usepackage(?:\[.+?\])?)\{vaucanson-.+?}//g; # delete + $line =~ s/(\\usepackage(?:\[.+?\])?)\{psgo}//g; # delete + } + $line =~ s/(\\usepackage(?:\[.+?\])?)\{graph/\%$1\{graph/g; # comment + next if $line =~ m/^\s*$/; + push(@preamb,$line);} # adding changes + +my $clean = join("\n", @preamb, "\\usepackage{grfext}\n\\\PrependGraphicsExtensions*{$Iext}\n\\usepackage{graphicx}\n\\graphicspath{{$imageDir/}}\n\\begin{document}". $dos); + + open my $OPDF,'>',"$tempDir/$pdfname-pdf.tex"; # write changes + print $OPDF $clean; + close $OPDF; +# ------------------------- close coment pst-package ------------------------------ +my $runAgain = 0; + if ($norun){print "Done\n";} + else { + if($xetex){ + system("xelatex -interaction=batchmode $tempDir/$pdfname-pdf"); print "Done\n";} + else{ + system("pdflatex -interaction=batchmode $tempDir/$pdfname-pdf"); print "Done\n";} + } + if (-e "$tempDir/$pdfname-pdf.idx") { + system("makeindex $tempDir/$pdfname-pdf.idx"); $runAgain++;} + if ($runBibTeX && -e "$tempDir/$pdfname-pdf.aux") { + system("bibtex $tempDir/$pdfname-pdf"); $runAgain++; } + if ($runBiber && -e "$tempDir/$pdfname-pdf.bcf") { + system("biber $tempDir/$pdfname-pdf"); $runAgain++; } + if ($runAgain){ + if($xetex){ + system("xelatex -interaction=batchmode $tempDir/$pdfname-pdf");} + else{ + system("pdflatex -interaction=batchmode $tempDir/$pdfname-pdf");} + } + if ($ppm){ + print "If you need to create jpg/png/svg type cd $imageDir and run\n"; + print "mogrify -format [ext] *.ppm\n"; + } + if ($clear) { + if ($norun){} + if ($single) { + unlink "$tempDir/$name-fig.pdf"; + if(!$xetex){ + unlink "$tempDir/$name-fig.dvi"; + unlink "$tempDir/$name-fig.ps"; + } + unlink "$tempDir/$name-fig.aux"; + unlink "$tempDir/$name-fig.log"; + unlink "$tempDir/$name-fig.tex"; + if(!$verbose) { + unlink "$tempDir/$name.plog"; + } + unlink "$tempDir/$name.preamble"; + unlink "$tempDir/$name-pdf.aux"; + unlink "$tempDir/$name-pdf.log"; + } + else{ + if(!$verbose) { + unlink "$tempDir/$name.plog"; + } + unlink "$tempDir/$name.preamble"; + unlink "$tempDir/$name-pdf.aux"; + unlink "$tempDir/$name-pdf.log"; + unlink "$tempDir/$name-pics.pdf"; + unlink "$tempDir/$name-pics.tex"; + unlink "$tempDir/$name-pics.aux"; + if(!$xetex){ + unlink "$tempDir/$name-pics.dvi"; + unlink "$tempDir/$name-pics.ps";} + unlink "$tempDir/$name-pics.log"; + unlink "$tempDir/$name-fig.tex"; + } + } + } + +sub LOG() { + if ( $verbose ) { print $LOGfile "@_\n"; } + } +__END__ diff --git a/Build/source/texk/texlive/linked_scripts/texlive/tlmgr.pl b/Build/source/texk/texlive/linked_scripts/texlive/tlmgr.pl index dfcf2a0e483..51580081030 100755 --- a/Build/source/texk/texlive/linked_scripts/texlive/tlmgr.pl +++ b/Build/source/texk/texlive/linked_scripts/texlive/tlmgr.pl @@ -1,12 +1,12 @@ #!/usr/bin/env perl -# $Id: tlmgr.pl 28995 2013-01-31 00:45:52Z preining $ +# $Id: tlmgr.pl 29313 2013-03-08 13:24:40Z preining $ # -# Copyright 2008, 2009, 2010, 2011, 2012 Norbert Preining +# Copyright 2008-2013 Norbert Preining # This file is licensed under the GNU General Public License version 2 # or any later version. -my $svnrev = '$Revision: 28995 $'; -my $datrev = '$Date: 2013-01-31 01:45:52 +0100 (Thu, 31 Jan 2013) $'; +my $svnrev = '$Revision: 29313 $'; +my $datrev = '$Date: 2013-03-08 14:24:40 +0100 (Fri, 08 Mar 2013) $'; my $tlmgrrevision; my $prg; if ($svnrev =~ m/: ([0-9]+) /) { @@ -24,6 +24,7 @@ our $loadmediasrcerror; our $packagelogfile; our $packagelogged; our $tlmgr_config_file; +our $pinfile; BEGIN { $^W = 1; @@ -161,6 +162,7 @@ sub main { "dry-run|n" => 1 }, "paper" => { "list" => 1 }, "path" => { "w32mode" => "=s" }, + "pinning" => { "all" => 1 }, "platform" => { "dry-run|n" => 1 }, "postaction" => { "w32mode" => "=s", "all" => 1, @@ -3510,7 +3512,76 @@ sub show_list_of_packages { # tlmgr pinning remove <repo> <pkgglob> [<pkgglob>, ...] # tlmgr pinning remove <repo> --all sub action_pinning { - tlwarn("Not implemented by now, sorry!\n"); + my $what = shift @ARGV; + $what || ($what = 'show'); + init_local_db(); + init_tlmedia_or_die(); + if (!$remotetlpdb->is_virtual) { + tlwarn("tlmgr: not a virtual database, no pinning actions supported!\n"); + return; + } + my $pinref = $remotetlpdb->virtual_pindata(); + my $pf = $remotetlpdb->virtual_pinning(); + my @pins = @$pinref; + if ($what =~ m/^show$/i) { + print "Defined pinning data:\n"; + for my $p (@pins) { + print " ", $p->{'repo'}, ":", $p->{'glob'}, "\n"; + } + } elsif ($what =~ m/^check$/i) { + tlwarn("Not implemented by now, sorry!\n"); + return 0; + } elsif ($what =~ m/^add$/i) { + # we need at least two more arguments + if ($#ARGV < 1) { + tlwarn("missing arguments to pinning add\n"); + return; + } + my $repo = shift @ARGV; + my @ov = $pf->value($repo); + push @ov, @ARGV; + $pf->value($repo, @ov); + $remotetlpdb->virtual_update_pins(); + $pf->save; + info("Added/Updated pinning data for $repo\n"); + return 1; + } elsif ($what =~ m/^remove$/i) { + my $repo = shift @ARGV; + if (!defined($repo)) { + tlwarn("missing arguments to pinning add\n"); + return; + } + my $pf = $remotetlpdb->virtual_pinning(); + if ($opts{'all'}) { + if ($#ARGV >= 0) { + tlwarn("no additional argument allowed when --all is given\n"); + return; + } + $pf->delete_key($repo); + $remotetlpdb->virtual_update_pins(); + $pf->save; + return; + } + # complicated case, we want to remove only one setting + my @ov = $pf->value($repo); + my @nv; + for my $pf (@ov) { + push @nv, $pf if (!member($pf, @ARGV)); + } + $pf->value($repo, @nv); + $remotetlpdb->virtual_update_pins(); + $pf->save; + info("Removed pinning data for $repo\n"); + return 1; + } else { + tlwarn("Unknown argument to pinning action: $what\n"); + return 0; + } + # $pin{'repo'} = $repo; + # $pin{'glob'} = $glob; + # $pin{'re'} = $re; + # $pin{'line'} = $line; # for debug/warning purpose + return 0; } # REPOSITORY @@ -5185,24 +5256,19 @@ sub init_tlmedia # now check/setup pinning # TODO for now no default pinning file! - if ($opts{"pin-file"}) { - my @pins = read_pinning_file($opts{"pin-file"}); - if (@pins) { - $remotetlpdb->virtual_pinning(@pins); - } - } else { + if (!$opts{"pin-file"}) { # check for pinning file in TEXMFLOCAL/tlpkg/pinning.txt chomp (my $TEXMFLOCAL = `kpsewhich -var-value=TEXMFLOCAL`); debug("trying to load pinning file $TEXMFLOCAL/tlpkg/pinning.txt\n"); if (-r "$TEXMFLOCAL/tlpkg/pinning.txt") { - my @pins = read_pinning_file("$TEXMFLOCAL/tlpkg/pinning.txt"); - if (@pins) { - info("tlmgr: using pinning file $TEXMFLOCAL/tlpkg/pinning.txt\n"); - $remotetlpdb->virtual_pinning(@pins); - } + $opts{"pin-file"} = "$TEXMFLOCAL/tlpkg/pinning.txt"; } } - + if ($opts{"pin-file"} && -r $opts{"pin-file"}) { + # $pinfile is global var + $pinfile = TeXLive::TLConfFile->new($opts{"pin-file"}, "#", ":", 'multiple'); + $remotetlpdb->virtual_pinning($pinfile); + } # this "location-url" line should not be changed since GUI programs # depend on it: print "location-url\t$locstr\n" if $::machinereadable; @@ -5419,26 +5485,6 @@ FROZEN return($remotetlpdb); } -sub read_pinning_file { - my $pf = shift; - my @pins; - my $pfh; - if (!open($pfh, "<$pf")) { - tlwarn("Pinning file $pf cannot be read: $!\n"); - return; - } - debug("Reading pinning file $pf\n"); - while (my $l = TeXLive::TLUtils::get_full_line($pfh)) { - chomp($l); - # comments and empty lines are allowed - next if ($l =~ m/^\s*#/); - next if ($l =~ m/^\s*$/); - my ($a, $b) = split(/:/, $l); - push @pins, $remotetlpdb->make_pin_data_from_line($l); - } - close($pfh); - return @pins; -} # finish handles the -pause option (wait for input from stdin), @@ -5878,420 +5924,392 @@ Gives version information (same as C<--version>). If C<-v> has been given the revisions of the used modules are reported, too. -=head2 gui - -Start the graphical user interface. See B<GUI> below. +=head2 backup [--clean[=I<N>]] [--backupdir I<dir>] [--all | I<pkg>]... +If the C<--clean> option is not specified, this action makes a backup of +the given packages, or all packages given C<--all>. These backups are +saved to the value of the C<--backupdir> option, if that is an existing and +writable directory. If C<--backupdir> is not given, the C<backupdir> +option setting in the TLPDB is used, if present. If both are missing, +no backups are made. -=head2 install [I<option>]... I<pkg>... +If the C<--clean> option is specified, backups are pruned (removed) +instead of saved. The optional integer value I<N> may be specified to +set the number of backups that will be retained when cleaning. If C<N> +is not given, the value of the C<autobackup> option is used. If both are +missing, an error is issued. For more details of backup pruning, see +the C<option> action. -Install each I<pkg> given on the command line. By default this installs -all packages on which the given I<pkg>s are dependent, also. Options: +Options: =over 4 -=item B<--file> +=item B<--backupdir> I<directory> -Instead of fetching a package from the installation repository, use -the packages files given on the command line. These files need -to be proper TeX Live package files (with contained tlpobj file). +Overrides the C<backupdir> option setting in the TLPDB. +The I<directory> argument is required and must specify an existing, +writable directory where backups are to be placed. -=item B<--reinstall> +=item B<--all> -Reinstall a package (including dependencies for collections) even if it -seems to be already installed (i.e, is present in the TLPDB). This is -useful to recover from accidental removal of files in the hierarchy. +If C<--clean> is not specified, make a backup of all packages in the TeX +Live installation; this will take quite a lot of space and time. If +C<--clean> is specified, all packages are pruned. -When re-installing, only dependencies on normal packages are followed -(not those of category Scheme or Collection). +=item B<--clean>[=I<N>] -=item B<--no-depends> +Instead of making backups, prune the backup directory of old backups, as +explained above. The optional integer argument I<N> overrides the +C<autobackup> option set in the TLPDB. You must use C<--all> or a list +of packages together with this option, as desired. -Do not install dependencies. (By default, installing a package ensures -that all dependencies of this package are fulfilled.) +=item B<--dry-run> -=item B<--no-depends-at-all> +Nothing is actually backed up or removed; instead, the actions to be +performed are written to the terminal. -When you install a package which ships binary files the respective -binary package will also be installed. That is, for a package C<foo>, -the package C<foo.i386-linux> will also be installed on an C<i386-linux> -system. This switch suppresses this behavior, and also implies -C<--no-depends>. Don't use it unless you are sure of what you are -doing. +=back -=item B<--dry-run> -Nothing is actually installed; instead, the actions to be performed are -written to the terminal. +=head2 candidates -=item B<--force> +=over 4 -If updates to C<tlmgr> itself (or other parts of the basic -infrastructure) are present, C<tlmgr> will bail out and not perform the -installation unless this option is given. Not recommended. +=item B<candidates I<pkg>> -=back +Shows the available candidate repositories for package I<pkg>. +See L</"MULTIPLE REPOSITORIES"> below. -=head2 update [I<option>]... [I<pkg>]... +=back -Updates the packages given as arguments to the latest version available -at the installation source. Either C<--all> or at least one I<pkg> name -must be specified. Options: +=head2 check [I<option>]... [files|depends|executes|runfiles|all] + +Executes one (or all) check(s) on the consistency of the installation. =over 4 -=item B<--all> +=item B<files> -Update all installed packages except for C<tlmgr> itself. Thus, if -updates to C<tlmgr> itself are present, this will simply give an error, -unless also the option C<--force> or C<--self> is given. (See below.) +Checks that all files listed in the local TLPDB (C<texlive.tlpdb>) are +actually present, and lists those missing. -In addition to updating the installed packages, during the update of a -collection the local installation is (by default) synchronized to the -status of the collection on the server, for both additions and removals. +=item B<depends> -This means that if a package has been removed on the server (and thus -has also been removed from the respective collection), C<tlmgr> will -remove the package in the local installation. This is called -``auto-remove'' and is announced as such when using the option -C<--list>. This auto-removal can be suppressed using the option -C<--no-auto-remove>. +Lists those packages which occur as dependencies in an installed collections, +but are themselves not installed, and those packages that are not +contained in any collection. -Analogously, if a package has been added to a collection on the server -that is also installed locally, it will be added to the local -installation. This is called ``auto-install'' and is announced as such -when using the option C<--list>. This auto-installation can be -suppressed using the option C<--no-auto-install>. +If you call C<tlmgr check collections> this test will be carried out +instead since former versions for C<tlmgr> called it that way. -An exception to the collection dependency checks (including the -auto-installation of packages just mentioned) are those that have been -``forcibly removed'' by you, that is, you called C<tlmgr remove --force> -on them. (See the C<remove> action documentation.) To reinstall any -such forcibly removed packages use C<--reinstall-forcibly-removed>. +=item B<executes> -If you want to exclude some packages from the current update run (e.g., -due to a slow link), see the C<--exclude> option below. +Check that the files referred to by C<execute> directives in the TeX +Live Database are present. -=item B<--self> +=item B<runfiles> -Update C<tlmgr> itself (that is, the infrastructure packages) if updates -to it are present. On Windows this includes updates to the private Perl -interpreter shipped inside TeX Live. +List those filenames that are occurring more than one time in the runfiles. -If this option is given together with either C<--all> or a list of -packages, then C<tlmgr> will be updated first and, if this update -succeeds, the new version will be restarted to complete the rest of the -updates. +=back -In short: +Options: - tlmgr update --self # update infrastructure only - tlmgr update --self --all # update infrastructure and all packages - tlmgr update --force --all # update all packages but *not* infrastructure - # ... this last at your own risk, not recommended! +=over 4 -=item B<--dry-run> +=item B<--use-svn> -Nothing is actually installed; instead, the actions to be performed are -written to the terminal. This is a more detailed report than C<--list>. +Use the output of C<svn status> instead of listing the files; for +checking the TL development repository. -=item B<--list> [I<pkg>] +=back -Concisely list the packages which would be updated, newly installed, or -removed, without actually changing anything. -If C<--all> is also given, all available updates are listed. -If C<--self> is given, but not C<--all>, only updates to the -critical packages (tlmgr, texlive infrastructure, perl on Windows, etc.) -are listed. -If neither C<--all> nor C<--self> is given, and in addition no I<pkg> is -given, then C<--all> is assumed (thus, C<tlmgr update --list> is the -same as C<tlmgr update --list --all>). -If neither C<--all> nor C<--self> is given, but specific package names are -given, those packages are checked for updates. -=item B<--exclude> I<pkg> +=head2 conf [texmf|tlmgr [I<key> [I<value>]]] -Exclude I<pkg> from the update process. If this option is given more -than once, its arguments accumulate. +With only C<conf>, show general configuration information for TeX Live, +including active configuration files, path settings, and more. This is +like the C<texconfig conf> call, but works on all supported platforms. -An argument I<pkg> excludes both the package I<pkg> itself and all -its related platform-specific packages I<pkg.ARCH>. For example, +With either C<conf texmf> or C<conf tlmgr> given in addition, shows all +key/value pairs (i.e., all settings) as saved in C<ROOT/texmf.cnf> or +the tlmgr configuration file (see below), respectively. - tlmgr update --all --exclude a2ping +If I<key> is given in addition, shows the value of only that given +I<key> in the respective file. -will not update C<a2ping>, C<a2ping.i386-linux>, or -any other C<a2ping.>I<ARCH> package. +If I<value> is given in addition, I<key> is set to I<value> in the +respective file. I<No error checking is done!> -If this option specifies a package that would otherwise be a candidate -for auto-installation, auto-removal, or reinstallation of a forcibly -removed package, C<tlmgr> quits with an error message. Excludes are not -supported in these circumstances. +Practical application: if the execution of (some or all) system commands +via C<\write18> was left enabled during installation, you can disable +it afterwards: + + tlmgr conf texmf shell_escape 0 -=item B<--no-auto-remove> [I<pkg>]... +Warning: The general facility is here, but tinkering with settings in +this way is very strongly discouraged. Again, no error checking is +done, so any sort of breakage is possible. -Under normal circumstances C<tlmgr> tries to remove packages which have -disappeared on the server, as described above under C<--all>. This -option prevents any such removals, either for all packages (with -C<--all>), or the given I<pkg> names. -=item B<--no-auto-install> [I<pkg>]... +=head2 dump-tlpdb [--local|--remote] -Under normal circumstances C<tlmgr> will install packages which are new -on the server, as described above under C<--all>. This option prevents -any such automatic installation, either for all packages (with -C<--all>), or the given I<pkg> names. +Dump complete local or remote TLPDB to standard output, as-is. The +output is analogous to the C<--machine-readable> output; see +L<MACHINE-READABLE OUTPUT> section. -Furthermore, after the C<tlmgr> run using this has finished, the -packages that would have been auto-installed I<will be considered as -forcibly removed>. So, if C<foobar> is the only new package on the -server, then +Options: - tlmgr update --all --no-auto-install +=over 4 -is equivalent to +=item B<--local> - tlmgr update --all - tlmgr remove --force foobar +Dump the local tlpdb. -=item B<--reinstall-forcibly-removed> +=item B<--remote> -Under normal circumstances C<tlmgr> will not install packages that have -been forcibly removed by the user; that is, removed with C<remove ---force>, or whose installation was prohibited by C<--no-auto-install> -during an earlier update. +Dump the remote tlpdb. -This option makes C<tlmgr> ignore the forcible removals and re-install -all such packages. This can be used to completely synchronize an -installation with the server's idea of what is available: +=back - tlmgr update --reinstall-forcibly-removed --all +Exactly one of C<--local> and C<--remote> must be given. -=item B<--backup> and B<--backupdir> I<directory> +In either case, the first line of the output specifies the repository +location, in this format: -These two options control the creation of backups of packages I<before> -updating; that is, backup of packages as currently installed. If -neither of these options are given, no backup package will be saved. If -C<--backupdir> is given and specifies a writable directory then a backup -will be made in that location. If only C<--backup> is given, then a -backup will be made to the directory previously set via the C<option> -action (see below). If both are given then a backup will be made to the -specified I<directory>. + "location-url" "\t" location -You can set options via the C<option> action to automatically create -backups for all packages, and/or keep only a certain number of -backups. Please see the C<option> action for details. +where C<location-url> is the literal field name, followed by a tab, and +I<location> is the file or url to the repository. -C<tlmgr> always makes a temporary backup when updating packages, in case -of download or other failure during an update. In contrast, the purpose -of this C<--backup> option is to allow you to save a persistent backup -in case the actual I<content> of the update causes problems, e.g., -introduces an incompatibility. +Line endings may be either LF or CRLF depending on the current platform. -The C<restore> action explains how to restore from a backup. -=item B<--no-depends> +=head2 generate [I<option>]... I<what> -If you call for updating a package normally all depending packages -will also be checked for updates and updated if necessary. This switch -suppresses this behavior. +=over 4 -=item B<--no-depends-at-all> +=item B<generate language> -See above under B<install> (and beware). +=item B<generate language.dat> -=item B<--force> +=item B<generate language.def> -Force update of normal packages, without updating C<tlmgr> itself -(unless the C<--self> option is also given). Not recommended. +=item B<generate language.dat.lua> -Also, C<update --list> is still performed regardless of this option. +=item B<generate fmtutil> =back -If the package on the server is older than the package already installed -(e.g., if the selected mirror is out of date), C<tlmgr> does not -downgrade. Also, packages for uninstalled platforms are not installed. - - -=head2 backup [--clean[=I<N>]] [--backupdir I<dir>] [--all | I<pkg>]... - -If the C<--clean> option is not specified, this action makes a backup of -the given packages, or all packages given C<--all>. These backups are -saved to the value of the C<--backupdir> option, if that is an existing and -writable directory. If C<--backupdir> is not given, the C<backupdir> -option setting in the TLPDB is used, if present. If both are missing, -no backups are made. +The C<generate> action overwrites any manual changes made in the +respective files: it recreates them from scratch based on the +information of the installed packages, plus local adaptions. +The TeX Live installer and C<tlmgr> routinely call C<generate> for +all of these files. -If the C<--clean> option is specified, backups are pruned (removed) -instead of saved. The optional integer value I<N> may be specified to -set the number of backups that will be retained when cleaning. If C<N> -is not given, the value of the C<autobackup> option is used. If both are -missing, an error is issued. For more details of backup pruning, see -the C<option> action. +For managing your own fonts, please read the C<updmap --help> +information and/or L<http://tug.org/fonts/fontinstall.html>. -Options: +In more detail: C<generate> remakes any of the configuration files +C<language.dat>, C<language.def>, C<language.dat.lua>, and +C<fmtutil.cnf>, from the information present in the local TLPDB, plus +locally-maintained files. -=over 4 +The locally-maintained files are C<language-local.dat>, +C<language-local.def>, C<language-local.dat.lua>, or +C<fmtutil-local.cnf>, searched for in C<TEXMFLOCAL> in the respective +directories. If local additions are present, the final file is made by +starting with the main file, omitting any entries that the local file +specifies to be disabled, and finally appending the local file. -=item B<--backupdir> I<directory> +(Historical note: The formerly supported C<updmap-local.cfg> is no longer +read, since C<updmap> now supports multiple C<updmap.cfg> files. Thus, +local additions can and should be put into an C<updmap.cfg> file in +C<TEXMFLOCAL>. The C<generate updmap> action no longer exists.) -Overrides the C<backupdir> option setting in the TLPDB. -The I<directory> argument is required and must specify an existing, -writable directory where backups are to be placed. +Local files specify entries to be disabled with a comment line, namely +one of these: -=item B<--all> + #!NAME + %!NAME + --!NAME -If C<--clean> is not specified, make a backup of all packages in the TeX -Live installation; this will take quite a lot of space and time. If -C<--clean> is specified, all packages are pruned. +where C<fmtutil.cnf> uses C<#>, C<language.dat> and C<language.def> use +C<%>, and C<language.dat.lua> use C<-->. In all cases, the I<name> is +the respective format name or hyphenation pattern identifier. +Examples: -=item B<--clean>[=I<N>] + #!pdflatex + %!german + --!usenglishmax -Instead of making backups, prune the backup directory of old backups, as -explained above. The optional integer argument I<N> overrides the -C<autobackup> option set in the TLPDB. You must use C<--all> or a list -of packages together with this option, as desired. +(Of course, you're not likely to actually want to disable those +particular items. They're just examples.) -=item B<--dry-run> +After such a disabling line, the local file can include another entry +for the same item, if a different definition is desired. In general, +except for the special disabling lines, the local files follow the same +syntax as the master files. -Nothing is actually backed up or removed; instead, the actions to be -performed are written to the terminal. +The form C<generate language> recreates all three files C<language.dat>, +C<language.def>, and C<language.dat.lua>, while the forms with an +extension recreates only that given language file. -=back +Options: +=over 4 -=head2 restore [--backupdir I<dir>] [--all | I<pkg> [I<rev>]] +=item B<--dest> I<output_file> -Restore a package from a previously-made backup. +specifies the output file (defaults to the respective location in +C<TEXMFSYSVAR>). If C<--dest> is given to C<generate language>, it +serves as a basename onto which C<.dat> will be appended for the name of +the C<language.dat> output file, C<.def> will be appended to the value +for the name of the C<language.def> output file, and C<.dat.lua> to the +name of the C<language.dat.lua> file. (This is just to avoid +overwriting; if you want a specific name for each output file, we +recommend invoking C<tlmgr> twice.) -If C<--all> is given, try to restore the latest revision of all -package backups found in the backup directory. +=item B<--localcfg> I<local_conf_file> -Otherwise, if neither I<pkg> nor I<rev> are given, list the available backup -revisions for all packages. +specifies the (optional) local additions (defaults to the respective +location in C<TEXMFLOCAL>). -With I<pkg> given but no I<rev>, list all available backup revisions of -I<pkg>. +=item B<--rebuild-sys> -When listing available packages tlmgr shows the revision and in -parenthesis the creation time if available (in format yyyy-mm-dd hh:mm). +tells tlmgr to run necessary programs after config files have been +regenerated. These are: +C<fmtutil-sys --all> after C<generate fmtutil>, +C<fmtutil-sys --byhyphen .../language.dat> after C<generate language.dat>, +and +C<fmtutil-sys --byhyphen .../language.def> after C<generate language.def>. -With both I<pkg> and I<rev>, tries to restore the package from the -specified backup. +These subsequent calls cause the newly-generated files to actually take +effect. This is not done by default since those calls are lengthy +processes and one might want to made several related changes in +succession before invoking these programs. -Options: +=back -=over 4 +The respective locations are as follows: -=item B<--all> + tex/generic/config/language.dat (and language-local.dat); + tex/generic/config/language.def (and language-local.def); + tex/generic/config/language.dat.lua (and language-local.dat.lua); + web2c/fmtutil.cnf (and fmtutil-local.cnf); -Try to restore the latest revision of all package backups found in the -backup directory. Additional non-option arguments (like I<pkg>) are not -allowed. -=item B<--backupdir> I<directory> +=head2 gui -Specify the directory where the backups are to be found. If not given it -will be taken from the configuration setting in the TLPDB. +Start the graphical user interface. See B<GUI> below. -=item B<--dry-run> -Nothing is actually restored; instead, the actions to be performed are -written to the terminal. +=head2 info [I<option>...] [collections|schemes|I<pkg>...] -=item B<--force> +With no argument, lists all packages available at the package +repository, prefixing those already installed with C<i>. -Don't ask questions. +With the single word C<collections> or C<schemes> as the argument, lists +the request type instead of all packages. -=back +With any other arguments, display information about I<pkg>: the name, +category, short and long description, installation status, and TeX Live +revision number. If I<pkg> is not locally installed, searches in the +remote installation source. +It also displays information taken from the TeX Catalogue, namely the +package version, date, and license. Consider these, especially the +package version, as approximations only, due to timing skew of the +updates of the different pieces. By contrast, the C<revision> value +comes directly from TL and is reliable. -=head2 remove [I<option>]... I<pkg>... +The former actions C<show> and C<list> are merged into this action, +but are still supported for backward compatibility. -Remove each I<pkg> specified. Removing a collection removes all package -dependencies (unless C<--no-depends> is specified), but not any -collection dependencies of that collection. However, when removing a -package, dependencies are never removed. Options: +Options: =over 4 -=item B<--no-depends> +=item B<--list> -Do not remove dependent packages. +If the option C<--list> is given with a package, the list of contained +files is also shown, including those for platform-specific dependencies. +When given with schemes and collections, C<--list> outputs their +dependencies in a similar way. -=item B<--no-depends-at-all> +=item B<--only-installed> -See above under B<install> (and beware). +If this options is given, the installation source will +not be used; only locally installed packages, collections, or schemes +are listed. +(Does not work for listing of packages for now) -=item B<--force> +=item B<--taxonomy> -By default, removal of a package or collection that is a dependency of -another collection or scheme is not allowed. With this option, the -package will be removed unconditionally. Use with care. +=item B<--keyword> -A package that has been removed using the C<--force> option because it -is still listed in an installed collection or scheme will not be -updated, and will be mentioned as B<forcibly removed> in the output of -B<tlmgr update --list>. +=item B<--functionality> -=item B<--dry-run> +=item B<--characterization> -Nothing is actually removed; instead, the actions to be performed are -written to the terminal. +In addition to the normal data displayed, also display information for +given packages from the corresponding taxonomy (or all of them). See +L</"TAXONOMIES"> below for details. =back -=head2 repository - -=over 4 - -=item B<repository list> +=head2 install [I<option>]... I<pkg>... -=item B<repository list I<path|tag>> +Install each I<pkg> given on the command line. By default this installs +all packages on which the given I<pkg>s are dependent, also. Options: -=item B<repository add I<path> [I<tag>]> +=over 4 -=item B<repository remove I<path|tag>> +=item B<--file> -=item B<repository set I<path>[#I<tag>] [I<path>[#I<tag>] ...]> +Instead of fetching a package from the installation repository, use +the packages files given on the command line. These files need +to be proper TeX Live package files (with contained tlpobj file). -This action manages the list of repositories. See L</"MULTIPLE -REPOSITORIES"> below for detailed explanations. +=item B<--reinstall> -The first form (C<list>) lists all configured repositories and the -respective tags if set. If a path, url, or tag is given after the -C<list> keyword, it is interpreted as source from where to -initialize a TeX Live Database and lists the contained packages. -This can also be an up-to-now not used repository, both locally -and remote. If one pass in addition C<--with-platforms>, for each -package the available platforms (if any) are listed, too. +Reinstall a package (including dependencies for collections) even if it +seems to be already installed (i.e, is present in the TLPDB). This is +useful to recover from accidental removal of files in the hierarchy. -The third form (C<add>) adds a repository -(optionally attaching a tag) to the list of repositories. The forth -form (C<remove>) removes a repository, either by full path/url, or by -tag. The last form (C<set>) sets the list of repositories to the items -given on the command line, not keeping previous settings +When re-installing, only dependencies on normal packages are followed +(not those of category Scheme or Collection). -In all cases, one of the repositories must be tagged as C<main>; -otherwise, all operations will fail! +=item B<--no-depends> -=back +Do not install dependencies. (By default, installing a package ensures +that all dependencies of this package are fulfilled.) +=item B<--no-depends-at-all> -=head2 candidates +When you install a package which ships binary files the respective +binary package will also be installed. That is, for a package C<foo>, +the package C<foo.i386-linux> will also be installed on an C<i386-linux> +system. This switch suppresses this behavior, and also implies +C<--no-depends>. Don't use it unless you are sure of what you are +doing. -=over 4 +=item B<--dry-run> -=item B<candidates I<pkg>> +Nothing is actually installed; instead, the actions to be performed are +written to the terminal. -Shows the available candidate repositories for package I<pkg>. -See L</"MULTIPLE REPOSITORIES"> below. +=item B<--force> +If updates to C<tlmgr> itself (or other parts of the basic +infrastructure) are present, C<tlmgr> will bail out and not perform the +installation unless this option is given. Not recommended. =back + =head2 option =over 4 @@ -6391,33 +6409,6 @@ to the registry and the menus are done for all users on the system instead of only the current user. All three options are on by default. -=head2 conf [texmf|tlmgr [I<key> [I<value>]]] - -With only C<conf>, show general configuration information for TeX Live, -including active configuration files, path settings, and more. This is -like the C<texconfig conf> call, but works on all supported platforms. - -With either C<conf texmf> or C<conf tlmgr> given in addition, shows all -key/value pairs (i.e., all settings) as saved in C<ROOT/texmf.cnf> or -the tlmgr configuration file (see below), respectively. - -If I<key> is given in addition, shows the value of only that given -I<key> in the respective file. - -If I<value> is given in addition, I<key> is set to I<value> in the -respective file. I<No error checking is done!> - -Practical application: if the execution of (some or all) system commands -via C<\write18> was left enabled during installation, you can disable -it afterwards: - - tlmgr conf texmf shell_escape 0 - -Warning: The general facility is here, but tinkering with settings in -this way is very strongly discouraged. Again, no error checking is -done, so any sort of breakage is possible. - - =head2 paper =over 4 @@ -6453,6 +6444,63 @@ settings for some programs, notably C<dvips>. C<tlmgr> does not support those extra settings at present. +=head2 path [--w32mode=user|admin] [add|remove] + +On Unix, merely adds or removes symlinks for binaries, man pages, and +info pages in the system directories specified by the respective options +(see the L<option> description above). Does not change any +initialization files, either system or personal. + +On Windows, the registry part where the binary directory is added or +removed is determined in the following way: + +If the user has admin rights, and the option C<--w32mode> is not given, +the setting I<w32_multi_user> determines the location (i.e., if it is +on then the system path, otherwise the user path is changed). + +If the user has admin rights, and the option C<--w32mode> is given, this +option determines the path to be adjusted. + +If the user does not have admin rights, and the option C<--w32mode> +is not given, and the setting I<w32_multi_user> is off, the user path +is changed, while if the setting I<w32_multi_user> is on, a warning is +issued that the caller does not have enough privileges. + +If the user does not have admin rights, and the option C<--w32mode> +is given, it must be B<user> and the user path will be adjusted. If a +user without admin rights uses the option C<--w32mode admin> a warning +is issued that the caller does not have enough privileges. + + +=head2 pinning + +The pinning action manages the pinning file, see L<Pinning> for details. + +=over 4 + +=item B<pinning show> + +Shows the current pinning data. + +=item B<pinning check> + +Not implemented at the moment. + +=item B<pinning add I<repo> I<pgkglob> [I<pkgglob>]> + +Pins the packages specified by I<pkgglob> to the repo I<repo>. + +=item B<pinning remove I<repo> I<pgkglob> [I<pkgglob>]> + +If there is a the very package glob <pkgglob> recorded in the pinning file +for the given repo I<repo>, it is removed. + +=item B<pinning remove I<repo> --all> + +Remove all pinning data for repo I<repo>. + +=back + =head2 platform list|add|remove I<platform>... =head2 platform set I<platform> @@ -6492,6 +6540,32 @@ written to the terminal. =back +=cut + +# keep the following on *ONE* line otherwise Losedows perldoc does +# not show it!!!! + +=pod + +=head2 postaction [--w32mode=user|admin] [--fileassocmode=1|2] [--all] [install|remove] [shortcut|fileassoc|script] [I<pkg>]... + +Carry out the postaction C<shortcut>, C<fileassoc>, or C<script> given +as the second required argument in install or remove mode (which is the +first required argument), for either the packages given on the command +line, or for all if C<--all> is given. + +If the option C<--w32mode> is given the value C<user>, all actions will +only be carried out in the user-accessible parts of the +registry/filesystem, while the value C<admin> selects the system-wide +parts of the registry for the file associations. If you do not have +enough permissions, using C<--w32mode=admin> will not succeed. + +C<--fileassocmode> specifies the action for file associations. If it is +set to 1 (the default), only new associations are added; if it is set to +2, all associations are set to the TeX Live programs. (See also +C<option fileassocs>.) + + =head2 print-platform Print the TeX Live identifier for the detected platform @@ -6499,57 +6573,121 @@ Print the TeX Live identifier for the detected platform C<--print-arch> is a synonym. -=head2 info [I<option>...] [collections|schemes|I<pkg>...] +=head2 restore [--backupdir I<dir>] [--all | I<pkg> [I<rev>]] -With no argument, lists all packages available at the package -repository, prefixing those already installed with C<i>. +Restore a package from a previously-made backup. -With the single word C<collections> or C<schemes> as the argument, lists -the request type instead of all packages. +If C<--all> is given, try to restore the latest revision of all +package backups found in the backup directory. -With any other arguments, display information about I<pkg>: the name, -category, short and long description, installation status, and TeX Live -revision number. If I<pkg> is not locally installed, searches in the -remote installation source. +Otherwise, if neither I<pkg> nor I<rev> are given, list the available backup +revisions for all packages. -It also displays information taken from the TeX Catalogue, namely the -package version, date, and license. Consider these, especially the -package version, as approximations only, due to timing skew of the -updates of the different pieces. By contrast, the C<revision> value -comes directly from TL and is reliable. +With I<pkg> given but no I<rev>, list all available backup revisions of +I<pkg>. -The former actions C<show> and C<list> are merged into this action, -but are still supported for backward compatibility. +When listing available packages tlmgr shows the revision and in +parenthesis the creation time if available (in format yyyy-mm-dd hh:mm). + +With both I<pkg> and I<rev>, tries to restore the package from the +specified backup. Options: =over 4 -=item B<--list> +=item B<--all> -If the option C<--list> is given with a package, the list of contained -files is also shown, including those for platform-specific dependencies. -When given with schemes and collections, C<--list> outputs their -dependencies in a similar way. +Try to restore the latest revision of all package backups found in the +backup directory. Additional non-option arguments (like I<pkg>) are not +allowed. -=item B<--only-installed> +=item B<--backupdir> I<directory> -If this options is given, the installation source will -not be used; only locally installed packages, collections, or schemes -are listed. -(Does not work for listing of packages for now) +Specify the directory where the backups are to be found. If not given it +will be taken from the configuration setting in the TLPDB. -=item B<--taxonomy> +=item B<--dry-run> -=item B<--keyword> +Nothing is actually restored; instead, the actions to be performed are +written to the terminal. -=item B<--functionality> +=item B<--force> -=item B<--characterization> +Don't ask questions. -In addition to the normal data displayed, also display information for -given packages from the corresponding taxonomy (or all of them). See -L</"TAXONOMIES"> below for details. +=back + + +=head2 remove [I<option>]... I<pkg>... + +Remove each I<pkg> specified. Removing a collection removes all package +dependencies (unless C<--no-depends> is specified), but not any +collection dependencies of that collection. However, when removing a +package, dependencies are never removed. Options: + +=over 4 + +=item B<--no-depends> + +Do not remove dependent packages. + +=item B<--no-depends-at-all> + +See above under B<install> (and beware). + +=item B<--force> + +By default, removal of a package or collection that is a dependency of +another collection or scheme is not allowed. With this option, the +package will be removed unconditionally. Use with care. + +A package that has been removed using the C<--force> option because it +is still listed in an installed collection or scheme will not be +updated, and will be mentioned as B<forcibly removed> in the output of +B<tlmgr update --list>. + +=item B<--dry-run> + +Nothing is actually removed; instead, the actions to be performed are +written to the terminal. + +=back + + +=head2 repository + +=over 4 + +=item B<repository list> + +=item B<repository list I<path|tag>> + +=item B<repository add I<path> [I<tag>]> + +=item B<repository remove I<path|tag>> + +=item B<repository set I<path>[#I<tag>] [I<path>[#I<tag>] ...]> + +This action manages the list of repositories. See L</"MULTIPLE +REPOSITORIES"> below for detailed explanations. + +The first form (C<list>) lists all configured repositories and the +respective tags if set. If a path, url, or tag is given after the +C<list> keyword, it is interpreted as source from where to +initialize a TeX Live Database and lists the contained packages. +This can also be an up-to-now not used repository, both locally +and remote. If one pass in addition C<--with-platforms>, for each +package the available platforms (if any) are listed, too. + +The third form (C<add>) adds a repository +(optionally attaching a tag) to the list of repositories. The forth +form (C<remove>) removes a repository, either by full path/url, or by +tag. The last form (C<set>) sets the list of repositories to the items +given on the command line, not keeping previous settings + +In all cases, one of the repositories must be tagged as C<main>; +otherwise, all operations will fail! =back @@ -6622,261 +6760,198 @@ Search for package names, descriptions, and taxonomies, but not files. =back -=head2 dump-tlpdb [--local|--remote] - -Dump complete local or remote TLPDB to standard output, as-is. The -output is analogous to the C<--machine-readable> output; see -L<MACHINE-READABLE OUTPUT> section. +=head2 uninstall -Options: +Uninstalls the entire TeX Live installation. Options: =over 4 -=item B<--local> - -Dump the local tlpdb. - -=item B<--remote> +=item B<--force> -Dump the remote tlpdb. +Do not ask for confirmation, remove immediately. =back -Exactly one of C<--local> and C<--remote> must be given. - -In either case, the first line of the output specifies the repository -location, in this format: - - "location-url" "\t" location - -where C<location-url> is the literal field name, followed by a tab, and -I<location> is the file or url to the repository. - -Line endings may be either LF or CRLF depending on the current platform. - - -=head2 check [I<option>]... [files|depends|executes|runfiles|all] - -Executes one (or all) check(s) on the consistency of the installation. - -=over 4 - -=item B<files> - -Checks that all files listed in the local TLPDB (C<texlive.tlpdb>) are -actually present, and lists those missing. - -=item B<depends> - -Lists those packages which occur as dependencies in an installed collections, -but are themselves not installed, and those packages that are not -contained in any collection. - -If you call C<tlmgr check collections> this test will be carried out -instead since former versions for C<tlmgr> called it that way. - -=item B<executes> -Check that the files referred to by C<execute> directives in the TeX -Live Database are present. - -=item B<runfiles> - -List those filenames that are occurring more than one time in the runfiles. - -=back +=head2 update [I<option>]... [I<pkg>]... -Options: +Updates the packages given as arguments to the latest version available +at the installation source. Either C<--all> or at least one I<pkg> name +must be specified. Options: =over 4 -=item B<--use-svn> - -Use the output of C<svn status> instead of listing the files; for -checking the TL development repository. - -=back - - -=head2 path [--w32mode=user|admin] [add|remove] - -On Unix, merely adds or removes symlinks for binaries, man pages, and -info pages in the system directories specified by the respective options -(see the L<option> description above). Does not change any -initialization files, either system or personal. - -On Windows, the registry part where the binary directory is added or -removed is determined in the following way: - -If the user has admin rights, and the option C<--w32mode> is not given, -the setting I<w32_multi_user> determines the location (i.e., if it is -on then the system path, otherwise the user path is changed). - -If the user has admin rights, and the option C<--w32mode> is given, this -option determines the path to be adjusted. - -If the user does not have admin rights, and the option C<--w32mode> -is not given, and the setting I<w32_multi_user> is off, the user path -is changed, while if the setting I<w32_multi_user> is on, a warning is -issued that the caller does not have enough privileges. - -If the user does not have admin rights, and the option C<--w32mode> -is given, it must be B<user> and the user path will be adjusted. If a -user without admin rights uses the option C<--w32mode admin> a warning -is issued that the caller does not have enough privileges. +=item B<--all> +Update all installed packages except for C<tlmgr> itself. Thus, if +updates to C<tlmgr> itself are present, this will simply give an error, +unless also the option C<--force> or C<--self> is given. (See below.) -=cut +In addition to updating the installed packages, during the update of a +collection the local installation is (by default) synchronized to the +status of the collection on the server, for both additions and removals. -# keep the following on *ONE* line otherwise Losedows perldoc does -# not show it!!!! +This means that if a package has been removed on the server (and thus +has also been removed from the respective collection), C<tlmgr> will +remove the package in the local installation. This is called +``auto-remove'' and is announced as such when using the option +C<--list>. This auto-removal can be suppressed using the option +C<--no-auto-remove>. -=pod +Analogously, if a package has been added to a collection on the server +that is also installed locally, it will be added to the local +installation. This is called ``auto-install'' and is announced as such +when using the option C<--list>. This auto-installation can be +suppressed using the option C<--no-auto-install>. -=head2 postaction [--w32mode=user|admin] [--fileassocmode=1|2] [--all] [install|remove] [shortcut|fileassoc|script] [I<pkg>]... +An exception to the collection dependency checks (including the +auto-installation of packages just mentioned) are those that have been +``forcibly removed'' by you, that is, you called C<tlmgr remove --force> +on them. (See the C<remove> action documentation.) To reinstall any +such forcibly removed packages use C<--reinstall-forcibly-removed>. -Carry out the postaction C<shortcut>, C<fileassoc>, or C<script> given -as the second required argument in install or remove mode (which is the -first required argument), for either the packages given on the command -line, or for all if C<--all> is given. +If you want to exclude some packages from the current update run (e.g., +due to a slow link), see the C<--exclude> option below. -If the option C<--w32mode> is given the value C<user>, all actions will -only be carried out in the user-accessible parts of the -registry/filesystem, while the value C<admin> selects the system-wide -parts of the registry for the file associations. If you do not have -enough permissions, using C<--w32mode=admin> will not succeed. +=item B<--self> -C<--fileassocmode> specifies the action for file associations. If it is -set to 1 (the default), only new associations are added; if it is set to -2, all associations are set to the TeX Live programs. (See also -C<option fileassocs>.) +Update C<tlmgr> itself (that is, the infrastructure packages) if updates +to it are present. On Windows this includes updates to the private Perl +interpreter shipped inside TeX Live. +If this option is given together with either C<--all> or a list of +packages, then C<tlmgr> will be updated first and, if this update +succeeds, the new version will be restarted to complete the rest of the +updates. -=head2 uninstall +In short: -Uninstalls the entire TeX Live installation. Options: + tlmgr update --self # update infrastructure only + tlmgr update --self --all # update infrastructure and all packages + tlmgr update --force --all # update all packages but *not* infrastructure + # ... this last at your own risk, not recommended! -=over 4 +=item B<--dry-run> -=item B<--force> +Nothing is actually installed; instead, the actions to be performed are +written to the terminal. This is a more detailed report than C<--list>. -Do not ask for confirmation, remove immediately. +=item B<--list> [I<pkg>] -=back +Concisely list the packages which would be updated, newly installed, or +removed, without actually changing anything. +If C<--all> is also given, all available updates are listed. +If C<--self> is given, but not C<--all>, only updates to the +critical packages (tlmgr, texlive infrastructure, perl on Windows, etc.) +are listed. +If neither C<--all> nor C<--self> is given, and in addition no I<pkg> is +given, then C<--all> is assumed (thus, C<tlmgr update --list> is the +same as C<tlmgr update --list --all>). +If neither C<--all> nor C<--self> is given, but specific package names are +given, those packages are checked for updates. +=item B<--exclude> I<pkg> -=head2 generate [I<option>]... I<what> +Exclude I<pkg> from the update process. If this option is given more +than once, its arguments accumulate. -=over 4 +An argument I<pkg> excludes both the package I<pkg> itself and all +its related platform-specific packages I<pkg.ARCH>. For example, -=item B<generate language> + tlmgr update --all --exclude a2ping -=item B<generate language.dat> +will not update C<a2ping>, C<a2ping.i386-linux>, or +any other C<a2ping.>I<ARCH> package. -=item B<generate language.def> +If this option specifies a package that would otherwise be a candidate +for auto-installation, auto-removal, or reinstallation of a forcibly +removed package, C<tlmgr> quits with an error message. Excludes are not +supported in these circumstances. -=item B<generate language.dat.lua> +=item B<--no-auto-remove> [I<pkg>]... -=item B<generate fmtutil> +Under normal circumstances C<tlmgr> tries to remove packages which have +disappeared on the server, as described above under C<--all>. This +option prevents any such removals, either for all packages (with +C<--all>), or the given I<pkg> names. -=back +=item B<--no-auto-install> [I<pkg>]... -The C<generate> action overwrites any manual changes made in the -respective files: it recreates them from scratch based on the -information of the installed packages, plus local adaptions. -The TeX Live installer and C<tlmgr> routinely call C<generate> for -all of these files. +Under normal circumstances C<tlmgr> will install packages which are new +on the server, as described above under C<--all>. This option prevents +any such automatic installation, either for all packages (with +C<--all>), or the given I<pkg> names. -For managing your own fonts, please read the C<updmap --help> -information and/or L<http://tug.org/fonts/fontinstall.html>. +Furthermore, after the C<tlmgr> run using this has finished, the +packages that would have been auto-installed I<will be considered as +forcibly removed>. So, if C<foobar> is the only new package on the +server, then -In more detail: C<generate> remakes any of the configuration files -C<language.dat>, C<language.def>, C<language.dat.lua>, and -C<fmtutil.cnf>, from the information present in the local TLPDB, plus -locally-maintained files. + tlmgr update --all --no-auto-install -The locally-maintained files are C<language-local.dat>, -C<language-local.def>, C<language-local.dat.lua>, or -C<fmtutil-local.cnf>, searched for in C<TEXMFLOCAL> in the respective -directories. If local additions are present, the final file is made by -starting with the main file, omitting any entries that the local file -specifies to be disabled, and finally appending the local file. +is equivalent to -(Historical note: The formerly supported C<updmap-local.cfg> is no longer -read, since C<updmap> now supports multiple C<updmap.cfg> files. Thus, -local additions can and should be put into an C<updmap.cfg> file in -C<TEXMFLOCAL>. The C<generate updmap> action no longer exists.) + tlmgr update --all + tlmgr remove --force foobar -Local files specify entries to be disabled with a comment line, namely -one of these: +=item B<--reinstall-forcibly-removed> - #!NAME - %!NAME - --!NAME +Under normal circumstances C<tlmgr> will not install packages that have +been forcibly removed by the user; that is, removed with C<remove +--force>, or whose installation was prohibited by C<--no-auto-install> +during an earlier update. -where C<fmtutil.cnf> uses C<#>, C<language.dat> and C<language.def> use -C<%>, and C<language.dat.lua> use C<-->. In all cases, the I<name> is -the respective format name or hyphenation pattern identifier. -Examples: +This option makes C<tlmgr> ignore the forcible removals and re-install +all such packages. This can be used to completely synchronize an +installation with the server's idea of what is available: - #!pdflatex - %!german - --!usenglishmax + tlmgr update --reinstall-forcibly-removed --all -(Of course, you're not likely to actually want to disable those -particular items. They're just examples.) +=item B<--backup> and B<--backupdir> I<directory> -After such a disabling line, the local file can include another entry -for the same item, if a different definition is desired. In general, -except for the special disabling lines, the local files follow the same -syntax as the master files. +These two options control the creation of backups of packages I<before> +updating; that is, backup of packages as currently installed. If +neither of these options are given, no backup package will be saved. If +C<--backupdir> is given and specifies a writable directory then a backup +will be made in that location. If only C<--backup> is given, then a +backup will be made to the directory previously set via the C<option> +action (see below). If both are given then a backup will be made to the +specified I<directory>. -The form C<generate language> recreates all three files C<language.dat>, -C<language.def>, and C<language.dat.lua>, while the forms with an -extension recreates only that given language file. +You can set options via the C<option> action to automatically create +backups for all packages, and/or keep only a certain number of +backups. Please see the C<option> action for details. -Options: +C<tlmgr> always makes a temporary backup when updating packages, in case +of download or other failure during an update. In contrast, the purpose +of this C<--backup> option is to allow you to save a persistent backup +in case the actual I<content> of the update causes problems, e.g., +introduces an incompatibility. -=over 4 +The C<restore> action explains how to restore from a backup. -=item B<--dest> I<output_file> +=item B<--no-depends> -specifies the output file (defaults to the respective location in -C<TEXMFSYSVAR>). If C<--dest> is given to C<generate language>, it -serves as a basename onto which C<.dat> will be appended for the name of -the C<language.dat> output file, C<.def> will be appended to the value -for the name of the C<language.def> output file, and C<.dat.lua> to the -name of the C<language.dat.lua> file. (This is just to avoid -overwriting; if you want a specific name for each output file, we -recommend invoking C<tlmgr> twice.) +If you call for updating a package normally all depending packages +will also be checked for updates and updated if necessary. This switch +suppresses this behavior. -=item B<--localcfg> I<local_conf_file> +=item B<--no-depends-at-all> -specifies the (optional) local additions (defaults to the respective -location in C<TEXMFLOCAL>). +See above under B<install> (and beware). -=item B<--rebuild-sys> +=item B<--force> -tells tlmgr to run necessary programs after config files have been -regenerated. These are: -C<fmtutil-sys --all> after C<generate fmtutil>, -C<fmtutil-sys --byhyphen .../language.dat> after C<generate language.dat>, -and -C<fmtutil-sys --byhyphen .../language.def> after C<generate language.def>. +Force update of normal packages, without updating C<tlmgr> itself +(unless the C<--self> option is also given). Not recommended. -These subsequent calls cause the newly-generated files to actually take -effect. This is not done by default since those calls are lengthy -processes and one might want to made several related changes in -succession before invoking these programs. +Also, C<update --list> is still performed regardless of this option. =back -The respective locations are as follows: - - tex/generic/config/language.dat (and language-local.dat); - tex/generic/config/language.def (and language-local.def); - tex/generic/config/language.dat.lua (and language-local.dat.lua); - web2c/fmtutil.cnf (and fmtutil-local.cnf); +If the package on the server is older than the package already installed +(e.g., if the selected mirror is out of date), C<tlmgr> does not +downgrade. Also, packages for uninstalled platforms are not installed. =head1 TLMGR CONFIGURATION FILE |