diff options
author | Karl Berry <karl@freefriends.org> | 2009-01-03 19:10:19 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2009-01-03 19:10:19 +0000 |
commit | 4a99b7afa624662867335325f07b6e36e7d57ad6 (patch) | |
tree | c16a9d37da5d5ca6dd97b86e5709a80f59ef2974 /Master/texmf | |
parent | 71dcedfe354adfec2f2e051b2108a12f7022b037 (diff) |
new paper size module for tlmgr2
git-svn-id: svn://tug.org/texlive/trunk@11807 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf')
-rw-r--r-- | Master/texmf/scripts/texlive/papersize-setting.pl | 613 | ||||
-rwxr-xr-x | Master/texmf/scripts/texlive/tlmgr2.pl | 21 |
2 files changed, 8 insertions, 626 deletions
diff --git a/Master/texmf/scripts/texlive/papersize-setting.pl b/Master/texmf/scripts/texlive/papersize-setting.pl deleted file mode 100644 index 13557b132d2..00000000000 --- a/Master/texmf/scripts/texlive/papersize-setting.pl +++ /dev/null @@ -1,613 +0,0 @@ -# -# $Id$ -# -# Adjusting and querying paper sizes from various config files -# -# Copyright 2008 Norbert Preining -# This file is licensed under the GNU General Public License version 2 -# or any later version. -# -# TODO TODO TODO -# if no paperconfig line is found in paper_do_simple it adds to the end of the -# file the new line, but this does not work on context because it -# has an \endinput at the end ... needs to be fixed -# -# output is done to stdout, not the right config file -# - -$^W = 1; -use strict; - -our $localtlpdb; - -our %default_paper_config_path_component; - -$default_paper_config_path_component{"pdftex"} = - "tex/generic/config/pdftexconfig.tex"; -$default_paper_config_path_component{"xdvi"} = - "xdvi/XDvi"; -$default_paper_config_path_component{"dvipdfm"} = - "dvipdfm/config/config"; -$default_paper_config_path_component{"dvipdfmx"} = - "dvipdfmx/dvipdfmx.cfg"; -$default_paper_config_path_component{"context"} = - "tex/context/user/cont-sys.tex"; -$default_paper_config_path_component{"dvips"} = - "dvips/config/config.ps"; - -# Output is actually done to the components in this hash, and -# if a value is undefined to the one from %default_.... -# -our %paper_config_path_component; - - -my %pdftex_papersize = ( - "letter" => [ '8.5 true in', '11 true in' ], - "a4" => [ '210 true mm', '297 true mm' ], -); - -my %xdvi_papersize; -$xdvi_papersize{'us'}='8.5x11'; -$xdvi_papersize{'letter'}='8.5x11'; -$xdvi_papersize{'usr'}='11x8.5'; -$xdvi_papersize{'legal'}='8.5x14'; -$xdvi_papersize{'ledger'}='17.0x11.0'; -$xdvi_papersize{'tabloid'}= '11.0x17.0'; -$xdvi_papersize{'foolscap'}='13.5x17.0'; -$xdvi_papersize{'a1'}='59.4x84.0cm'; -$xdvi_papersize{'a2'}='42.0x59.4cm'; -$xdvi_papersize{'a3'}='29.7x42.0cm'; -$xdvi_papersize{'a4'}='21.0x29.7cm'; -$xdvi_papersize{'a5'}='14.85x21.0cm'; -$xdvi_papersize{'a6'}='10.5x14.85cm'; -$xdvi_papersize{'a7'}='7.42x10.5cm'; -$xdvi_papersize{'a1r'}='84.0x59.4cm'; -$xdvi_papersize{'a2r'}='59.4x42.0cm'; -$xdvi_papersize{'a3r'}='42.0x29.7cm'; -$xdvi_papersize{'a4r'}='29.7x21.0cm'; -$xdvi_papersize{'a5r'}='21.0x14.85cm'; -$xdvi_papersize{'a6r'}='14.85x10.5cm'; -$xdvi_papersize{'a7r'}='10.5x7.42cm'; -$xdvi_papersize{'b1'}='70.6x100.0cm'; -$xdvi_papersize{'b2'}='50.0x70.6cm'; -$xdvi_papersize{'b3'}='35.3x50.0cm'; -$xdvi_papersize{'b4'}='25.0x35.3cm'; -$xdvi_papersize{'b5'}='17.6x25.0cm'; -$xdvi_papersize{'b6'}='13.5x17.6cm'; -$xdvi_papersize{'b7'}='8.8x13.5cm'; -$xdvi_papersize{'b1r'}='100.0x70.6cm'; -$xdvi_papersize{'b2r'}='70.6x50.0cm'; -$xdvi_papersize{'b3r'}='50.0x35.3cm'; -$xdvi_papersize{'b4r'}='35.3x25.0cm'; -$xdvi_papersize{'b5r'}='25.0x17.6cm'; -$xdvi_papersize{'b6r'}='17.6x13.5cm'; -$xdvi_papersize{'b7r'}='13.5x8.8cm'; -$xdvi_papersize{'c1'}='64.8x91.6cm'; -$xdvi_papersize{'c2'}='45.8x64.8cm'; -$xdvi_papersize{'c3'}='32.4x45.8cm'; -$xdvi_papersize{'c4'}='22.9x32.4cm'; -$xdvi_papersize{'c5'}='16.2x22.9cm'; -$xdvi_papersize{'c6'}='11.46x16.2cm'; -$xdvi_papersize{'c7'}='8.1x11.46cm'; -$xdvi_papersize{'c1r'}='91.6x64.8cm'; -$xdvi_papersize{'c2r'}='64.8x45.8cm'; -$xdvi_papersize{'c3r'}='45.8x32.4cm'; -$xdvi_papersize{'c4r'}='32.4x22.9cm'; -$xdvi_papersize{'c5r'}='22.9x16.2cm'; -$xdvi_papersize{'c6r'}='16.2x11.46cm'; -$xdvi_papersize{'c7r'}='11.46x8.1cm'; - -my %dvipdfm_papersize = ( 'letter' => 1, 'legal' => 1, 'ledger' => 1, - 'tabloid' => 1, 'a4' => 1, 'a3' => 1 ); - - -our %papersetting_subs; - -sub paper_all { - my %ret; - for my $p (keys %papersetting_subs) { - #info("setting paper size for $p to @_\n"); - merge_into(\%ret, &{$papersetting_subs{$p}}(@_)); - } - return \%ret; -} - -sub get_paper_list { - my $prog = shift; - return ( &{$papersetting_subs{$prog}} ( "/dummy", "--returnlist" ) ); -} - -# -# pdftex pdftexconfig.tex format -# /--- pdftexconfig.tex --- -# |... -# |\pdfpagewidth=NNN true <unit> -# |\pdfpageheight=NNN true <unit> -# |... -# \------------------------ -# -# Reading is done via --progname=pdftex --format='tex' pdftexconfig.tex -# Writing is done to TEXMFSYSCONFIG/tex/generic/config/pdftexconfig.tex -# -sub paper_pdftex { - my %ret; - my $outtree = shift; - my $outcomp = $paper_config_path_component{"pdftex"}; - $outcomp || ($outcomp = $default_paper_config_path_component{"pdftex"}); - my $outfile = "$outtree/$outcomp"; - my $newpaper = shift; - my $cf = `kpsewhich --progname=pdftex --format=tex pdftexconfig.tex`; - chomp($cf); - debug("file used for pdftex: $cf\n"); - - open(FOO, "<$cf") or die("cannot open file: $!"); - my @lines = <FOO>; - close(FOO); - - my ($cpw, $cph); - my ($cpwidx, $cphidx); - my $endinputidx; - # read the lines and the last pdfpageswidth/height wins - for my $idx (0..$#lines) { - my $l = $lines[$idx]; - if ($l =~ m/^\s*\\pdfpagewidth\s*=?\s*(.+)\s*$/) { - $cpw = $1; - $cpwidx = $idx; - next; - } - if ($l =~ m/^\s*\\pdfpageheight\s*=?\s*(.+)\s*$/) { - $cph = $1; - $cphidx = $idx; - next; - } - if ($l =~ m/^\s*\\endinput\s*/) { - $endinputidx = $idx; - next; - } - } - # trying to find the right papersize - # - my $currentpaper; - if (defined($cpw) && defined($cph)) { - for my $pname (keys %pdftex_papersize) { - my ($w, $h) = @{$pdftex_papersize{$pname}}; - if (($w eq $cpw) && ($h eq $cph)) { - $currentpaper = $pname; - last; - } - } - } else { - $currentpaper = "(undefined)"; - } - $currentpaper || ($currentpaper = "$cpw x $cph"); - if (defined($newpaper)) { - if ($newpaper eq "--list") { - info("$currentpaper\n"); - for my $p (keys %pdftex_papersize) { - info("$p\n") unless ($p eq $currentpaper); - } - } elsif ($newpaper eq "--returnlist") { - my @ret; - push @ret, "$currentpaper"; - for my $p (keys %pdftex_papersize) { - push @ret, $p unless ($p eq $currentpaper); - } - return @ret; - } else { - my $found = 0; - for my $p (keys %pdftex_papersize) { - if ($p eq $newpaper) { - $found = 1; - last; - } - } - if ($found) { - my $newwline = - '\pdfpagewidth=' . ${$pdftex_papersize{$newpaper}}[0] . "\n"; - my $newhline = - '\pdfpageheight=' . ${$pdftex_papersize{$newpaper}}[1] . "\n"; - if (defined($cpwidx)) { - $lines[$cpwidx] = $newwline; - } else { - if (defined($endinputidx)) { - $lines[$endinputidx] = $newwline . $lines[$endinputidx]; - } else { - $lines[$#lines] = $newwline; - } - } - if (defined($cphidx)) { - $lines[$cphidx] = $newhline; - } else { - if (defined($endinputidx)) { - $lines[$endinputidx] = $newhline . $lines[$endinputidx]; - } else { - $lines[$#lines] = $newwline; - } - } - info("Setting paper for pdftex to $newpaper.\n"); - mkdirhier(dirname($outfile)); - # if we create the outfile we have to call mktexlsr - $ret{"mktexlsr"} = 1 unless (-r $outfile); - if (!open(TMP, ">$outfile")) { - tlwarn("Cannot write to $outfile: $!\n"); - tlwarn("Not setting paper for pdftex.\n"); - return; - } - for (@lines) { print TMP; } - close (TMP); - } else { - warn "Not a valid paper size for pdftex: $newpaper\n"; - } - } - } else { - # just print the current value - info("current pdftex paper size: $currentpaper\n"); - } - return \%ret; -} -$papersetting_subs{"pdftex"} = \&paper_pdftex; - -############################################### -# -# dvips config.ps format: -# /--- config.ps --- -# |... -# |stuff not related to paper sizes -# |... -# | <empty line> -# |% some comments -# |% more comments -# |@ <NAME> <WIDTH> <HEIGHT> -# |@+ ...definition line -# |@+ ...definition line -# |... more definition lines -# |@+ %%EndPaperSize -# | -# |@ <NAME> <WIDTH> <HEIGHT> -# |... -# \------------ -# -# the first paper definition is the default -# selecting paper is done like with texconfig which used ed to move the -# selected part between @ $selected_paper .... @ /-1 (the line before the -# next @ line) to the line before the first @ line. -# (what a tricky ed invocation te created there, impressive!!!) -# -# Reading is done via --progname=dvips --format='dvips config' config.ps -# Writing is done to TEXMFSYSCONFIG/dvips/config/config.ps -# -sub paper_dvips { - my %ret; - my $outtree = shift; - my $outcomp = $paper_config_path_component{"dvips"}; - $outcomp || ($outcomp = $default_paper_config_path_component{"dvips"}); - my $outfile = "$outtree/$outcomp"; - my $newpaper = shift; - my $configps = `kpsewhich --progname=dvips --format="dvips config" config.ps`; - chomp($configps); - debug("file used for dvips: $configps\n"); - - open(FOO, "<$configps") or die("cannot open file: $!"); - my @lines = <FOO>; - close(FOO); - - my @papersizes; - my $firstpaperidx; - my %startidx; - my %endidx; - my $in_block = ""; - my $idx = 0; - for my $idx (0 .. $#lines) { - if ($lines[$idx] =~ m/^@ (\w+)/) { - $startidx{$1} = $idx; - $firstpaperidx || ($firstpaperidx = $idx-1); - $in_block = $1; - push @papersizes, $1; - next; - } - # empty lines or comments stop a block - if ($in_block) { - if ($lines[$idx] =~ m/^\s*(%.*)?\s*$/) { - $endidx{$in_block} = $idx-1; - $in_block = ""; - } - next; - } - } - - if (defined($newpaper)) { - if ($newpaper eq "--list") { - for my $p (@papersizes) { - info("$p\n"); # first is already the selected one - } - } elsif ($newpaper eq "--returnlist") { - return(@papersizes); - } else { - my $found = 0; - for my $p (@papersizes) { - if ($p eq $newpaper) { - $found = 1; - last; - } - } - if ($found) { - my @newlines; - for my $idx (0..$#lines) { - if ($idx < $firstpaperidx) { - push @newlines, $lines[$idx]; - next; - } - if ($idx == $firstpaperidx) { - # insert the selected paper definition - push @newlines, @lines[$startidx{$newpaper}..$endidx{$newpaper}]; - push @newlines, $lines[$idx]; - next; - } - if ($idx >= $startidx{$newpaper} && $idx <= $endidx{$newpaper}) { - next; - } - push @newlines, $lines[$idx]; - } - info("Setting paper for dvips to $newpaper.\n"); - mkdirhier(dirname($outfile)); - # if we create the outfile we have to call mktexlsr - $ret{"mktexlsr"} = 1 unless (-r $outfile); - if (!open(TMP, ">$outfile")) { - tlwarn("Cannot write to $outfile: $!\n"); - tlwarn("Not setting paper for dvips.\n"); - return; - } - for (@newlines) { print TMP; } - close (TMP); - } else { - warn "Not a valid paper size for dvips: $newpaper\n"; - } - } - } else { - # just print the current value - info("current dvips paper size: $papersizes[0]\n"); - } - return \%ret; -} -$papersetting_subs{"dvips"} = \&paper_dvips; - -# -# context format: -# /--- cont-sys.{tex,rme} -# |... -# |\setuppapersize[letter][letter] -# |... -# \------------ -# -# Reading is done first via kpsewhich -prog=tex -format=tex cont-sys.tex -# if that fails via -prog=tex -format='other text files' cont-sys.rme -# -# Writing is done to TEXMFSYSCONFIG/tex/context/user/cont-sys.tex -# -sub paper_context { - my $outtree = shift; - my $outcomp = $paper_config_path_component{"context"}; - $outcomp || ($outcomp = $default_paper_config_path_component{"context"}); - my $outfile = "$outtree/$outcomp"; - my $newpaper = shift; - # check that context is installed at all - if (!defined($localtlpdb->get_package("context"))) { - debug("context not installed, not setting paper size\n"); - return; - } - my $inp = `kpsewhich --progname=tex --format=tex cont-sys.tex`; - chomp($inp); - if (!$inp) { - # we didn't get anything, so retry with .rme - $inp = `kpsewhich --progname=tex --format="other text files" cont-sys.rme`; - chomp($inp); - } - my @bla = keys %pdftex_papersize; - # take care here, the \\\\ are necessary in some places and not in - # some others because there is no intermediate evaluation - return &paper_do_simple($inp, "context", '^\s*\\\\setuppapersize\s*', - '^\s*\\\\setuppapersize\s*\[([^][]*)\].*$', - sub { - my ($ll,$np) = @_; - if ($ll =~ m/^\s*\\setuppapersize\s*/) { - return("\\setuppapersize[$np][$np]\n"); - } else { - return($ll); - } - }, - $outfile, \@bla, 'a4', '\setuppapersize[a4][a4]', $newpaper); -} -$papersetting_subs{"context"} = \&paper_context; - - -# -# xdvi format: -# /--- XDvi --- -# |... -# |*paper: <NAME> -# |... -# \------------ -# -# Reading is done via --progname=xdvi --format='other text files' XDvi -# Writing is done to TEXMFSYSCONFIG/xdvi/XDvi -# -sub paper_xdvi { - my $outtree = shift; - my $outcomp = $paper_config_path_component{"xdvi"}; - $outcomp || ($outcomp = $default_paper_config_path_component{"xdvi"}); - my $outfile = "$outtree/$outcomp"; - my $newpaper = shift; - my $xdvi = `kpsewhich --progname=xdvi --format="other text files" XDvi`; - chomp($xdvi); - my @bla = keys %xdvi_papersize; - return &paper_do_simple($xdvi, "xdvi", '^\*paper: ', '^\*paper:\s+(\w+)\s*$', - sub { - my ($ll,$np) = @_; - $ll =~ s/^\*paper:\s+(\w+)\s*$/\*paper: $np\n/; - return($ll); - }, $outfile, \@bla, '(not defined)', '*paper: a4', $newpaper); -} -$papersetting_subs{"xdvi"} = \&paper_xdvi; - - -# -# dvipdfm(x) format: -# /--- dvipdfm/config, dvipdfmx/dvipdfmx.cfg --- -# |... -# |p <NAME> -# |... -# \------------ -# -# Reading is done -# for dvipdfm via --progname=dvipdfm --format='other text files' config -# for dvipdfmx via --progname=dvipdfmx --format='other text files' dvipdfmx.cfg -# Writing is done to TEXMFSYSCONFIG/dvipdfm/config/config -# and /dvipdfmx/dvipdfmx.cfg -# -# -sub do_dvipdfm_and_x { - my ($inp, $prog, $outtree, $paplist, $newpaper) = @_; - my $outcomp = $paper_config_path_component{$prog}; - $outcomp || ($outcomp = $default_paper_config_path_component{$prog}); - my $outfile = "$outtree/$outcomp"; - return &paper_do_simple($inp, $prog, '^p\s+', '^p\s+(\w+)\s*$', - sub { - my ($ll,$np) = @_; - $ll =~ s/^p\s+(\w+)\s*$/p $np\n/; - return($ll); - }, $outfile, $paplist, '(not defined)', 'p a4', $newpaper); -} - -sub paper_dvipdfm { - my $outtree = shift; - my $newpaper = shift; - my $inp = `kpsewhich --progname=dvipdfm --format="other text files" config`; - chomp($inp); - my @bla = keys %dvipdfm_papersize; - return &do_dvipdfm_and_x($inp, "dvipdfm", $outtree, \@bla, $newpaper); -} -$papersetting_subs{"dvipdfm"} = \&paper_dvipdfm; - -sub paper_dvipdfmx { - my $outtree = shift; - my $newpaper = shift; - my $inp = `kpsewhich --progname=dvipdfmx --format="other text files" dvipdfmx.cfg`; - chomp($inp); - my @bla = keys %dvipdfm_papersize; - return &do_dvipdfm_and_x($inp, "dvipdfmx", $outtree, \@bla, $newpaper); -} -$papersetting_subs{"dvipdfmx"} = \&paper_dvipdfmx; - - - -# -# paper_do_simple does the work for single line config files -# (xdvi, dvipdfm, dvipdfmx) -# arguments: -# $inp, $prog, $firstre, $secondre, $bl, $outp, $paplist, $newpaper -# with -# $inp .. input file location -# $prog .. program name -# $firstre .. re that searches for paper lines -# $secondre .. re that extracts the paper from a paper line -# $bl .. block/sub taking two args, one paper line and the new paper, and -# returns the line with the paper configured, only lines mathing -# $firstre are shipped over to $bl -# $outp .. location of the output file -# $paplist .. ref to an array with the list of admissible paper sizes -# $defaultpaper .. default papersize (arbitrary string) if the $firstre is -# not found in the config file -# $defaultline .. the line to be added at the bottom of the file if -# no line has been found -# $newpaper .. --list, new paper, or undef -sub paper_do_simple { - my ($inp, $prog, $firstre, $secondre, $bl, $outp, $paplist, $defaultpaper, $defaultline, $newpaper) = @_; - - my %ret; - - debug("file used for $prog: $inp\n"); - - open(FOO, "<$inp") or die("cannot open file $inp: $!"); - my @lines = <FOO>; - close(FOO); - - my $currentpaper; - my @paperlines = grep (m/$firstre/,@lines); - if (!@paperlines) { - $currentpaper = $defaultpaper; - } else { - if ($#paperlines > 0) { - warn "Strange, more than one paper definiton, using the first one in\n$inp\n"; - } - $currentpaper = $paperlines[0]; - chomp($currentpaper); - $currentpaper =~ s/$secondre/$1/; - } - - # change value - if (defined($newpaper)) { - if ($newpaper eq "--list") { - info("$currentpaper\n"); - for my $p (@$paplist) { - info("$p\n") unless ($p eq $currentpaper); - } - } elsif ($newpaper eq "--returnlist") { - my @ret; - push @ret, $currentpaper; - for my $p (@$paplist) { - push @ret, $p unless ($p eq $currentpaper); - } - return(@ret); - } else { - my $found = 0; - for my $p (@$paplist) { - if ($p eq $newpaper) { - $found = 1; - last; - } - } - if ($found) { - my @newlines; - my $foundcfg = 0; - for my $l (@lines) { - if ($l =~ m/$firstre/) { - push @newlines, &$bl($l, $newpaper); - $foundcfg = 1; - } else { - push @newlines, $l; - } - } - # what to do if no default line found??? - if (!$foundcfg) { - push @newlines, &$bl($defaultline, $newpaper); - } - info("Setting paper for $prog to $newpaper.\n"); - mkdirhier(dirname($outp)); - # if we create the outfile we have to call mktexlsr - $ret{"mktexlsr"} = 1 unless (-r $outp); - if (!open(TMP, ">$outp")) { - tlwarn("Cannot write to $outp: $!\n"); - tlwarn("Not setting paper for $prog.\n"); - return; - } - for (@newlines) { print TMP; } - close (TMP); - } else { - warn "Not a valid paper size for $prog: $newpaper\n"; - } - } - } else { - # just return the current value - info("Current paper setting for $prog: $currentpaper\n"); - } - return \%ret; -} - -1; - -### Local Variables: -### perl-indent-level: 2 -### tab-width: 2 -### indent-tabs-mode: nil -### End: -# vim:set tabstop=2 expandtab: # diff --git a/Master/texmf/scripts/texlive/tlmgr2.pl b/Master/texmf/scripts/texlive/tlmgr2.pl index fb46752f730..8212dbaa66d 100755 --- a/Master/texmf/scripts/texlive/tlmgr2.pl +++ b/Master/texmf/scripts/texlive/tlmgr2.pl @@ -59,9 +59,7 @@ use TeXLive::TLWinGoo; TeXLive::TLUtils->import(qw(member info give_ctan_mirror win32 dirname mkdirhier merge_into copy log debug)); -require("papersize-setting.pl"); -our %papersetting_subs; -#use TeXLive::TLPaper; +use TeXLive::TLPaper; binmode(STDOUT, ":utf8"); binmode(STDERR, ":utf8"); @@ -715,15 +713,10 @@ sub action_paper { my $newpaper = shift @ARGV; if (!defined($newpaper) || $newpaper !~ /^(a4|letter)$/) { $newpaper = "the empty string." if !defined($newpaper); - tlwarn("tlmgr: paper expects `a4' or `letter', not $newpaper\n"); + tlwarn("tlmgr: paper expects `a4' or `letter', not $newpaper.\n"); return; } - # output is done to the path components as given in - # our %paper_config_path_component, and if not present the defaults - # in %default_paper_config_path_component; - # together with the tree as given in the first argument of paper_* - merge_into(\%ret, paper_all($texmfsysconfig, $newpaper)); - #karl merge_into(\%ret, TeXLive::TLPaper::paper_all($texmfsysconfig, $newpaper)); + merge_into(\%ret, TeXLive::TLPaper::paper_all($texmfsysconfig, $newpaper)); } else { my $prog = $action; # first argument is the program to change my $arg = shift @ARGV; # get "paper" argument @@ -732,10 +725,12 @@ sub action_paper { tlwarn("tlmgr: expected `paper' after $prog, not $arg\n"); return; } - merge_into(\%ret, &{$papersetting_subs{$prog}}($texmfsysconfig, @ARGV)); - #karl merge_into(\%ret,TeXLive::TLPaper::do_paper($prog,$texmfsysconfig,@ARGV)); + merge_into(\%ret,TeXLive::TLPaper::do_paper($prog,$texmfsysconfig,@ARGV)); + } + if ($ret{"format"} && ! $localtlpdb->option_create_formats) { + info("$0: option to update formats is off, skipping.\n"); + delete $ret{"format"}; } - $ret{"format"} = 1 if ($localtlpdb->option_create_formats); return \%ret; } |