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 | |
parent | 71dcedfe354adfec2f2e051b2108a12f7022b037 (diff) |
new paper size module for tlmgr2
git-svn-id: svn://tug.org/texlive/trunk@11807 c570f23f-e606-0410-a88d-b1316a301751
-rwxr-xr-x | Master/texmf/scripts/texlive/tlmgr2.pl | 21 | ||||
-rw-r--r-- | Master/tlpkg/TeXLive/TLPaper.pm (renamed from Master/texmf/scripts/texlive/papersize-setting.pl) | 512 |
2 files changed, 290 insertions, 243 deletions
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; } diff --git a/Master/texmf/scripts/texlive/papersize-setting.pl b/Master/tlpkg/TeXLive/TLPaper.pm index 13557b132d2..51275b94cb5 100644 --- a/Master/texmf/scripts/texlive/papersize-setting.pl +++ b/Master/tlpkg/TeXLive/TLPaper.pm @@ -1,9 +1,8 @@ -# -# $Id$ +# $Id: papersize-setting.pl 11574 2008-12-10 00:06:21Z preining $ # # Adjusting and querying paper sizes from various config files # -# Copyright 2008 Norbert Preining +# Copyright 2008, 2009 Norbert Preining # This file is licensed under the GNU General Public License version 2 # or any later version. # @@ -11,113 +10,211 @@ # 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; +package TeXLive::TLPaper; -our $localtlpdb; +=pod -our %default_paper_config_path_component; +=head1 NAME -$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"; +C<TeXLive::TLPaper> -- paper size setting -# 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; +=head1 SYNOPSIS + + use TeXLive::TLPaper; + +=head1 DESCRIPTION + +=over 4 + +=cut + +use TeXLive::TLUtils qw(:DEFAULT dirname merge_into mkdirhier); + +my %paper_sub = ( + "xdvi" => \&paper_xdvi, + "pdftex" => \&paper_pdftex, + "dvips" => \&paper_dvips, + "dvipdfmx" => \&paper_dvipdfmx, + "dvipdfm" => \&paper_dvipdfm, + "context" => \&paper_context, +); + +# Where to write to by default. +my %default_paper_config_path_component = ( + "xdvi" => "xdvi/XDvi", + "pdftex" => "tex/generic/config/pdftexconfig.tex", + "dvips" => "dvips/config/config.ps", + "dvipdfmx" => "dvipdfmx/dvipdfmx.cfg", + "dvipdfm" => "dvipdfm/config/config", + "context" => "tex/context/user/cont-sys.tex", +); +# Output is done to the components in this hash. +# If a value is undefined, we take the one from %default_... +# +my %paper_config_path_component; + + +my %xdvi_papersize = ( + "a1" => "59.4x84.0cm", + "a1r" => "84.0x59.4cm", + "a2" => "42.0x59.4cm", + "a2r" => "59.4x42.0cm", + "a3" => "29.7x42.0cm", + "a3r" => "42.0x29.7cm", + "a4" => "21.0x29.7cm", + "a4r" => "29.7x21.0cm", + "a5" => "14.85x21.0cm", + "a5r" => "21.0x14.85cm", + "a6" => "10.5x14.85cm", + "a6r" => "14.85x10.5cm", + "a7" => "7.42x10.5cm", + "a7r" => "10.5x7.42cm", + "b1" => "70.6x100.0cm", + "b1r" => "100.0x70.6cm", + "b2" => "50.0x70.6cm", + "b2r" => "70.6x50.0cm", + "b3" => "35.3x50.0cm", + "b3r" => "50.0x35.3cm", + "b4" => "25.0x35.3cm", + "b4r" => "35.3x25.0cm", + "b5" => "17.6x25.0cm", + "b5r" => "25.0x17.6cm", + "b6" => "13.5x17.6cm", + "b6r" => "17.6x13.5cm", + "b7" => "8.8x13.5cm", + "b7r" => "13.5x8.8cm", + "c1" => "64.8x91.6cm", + "c1r" => "91.6x64.8cm", + "c2" => "45.8x64.8cm", + "c2r" => "64.8x45.8cm", + "c3" => "32.4x45.8cm", + "c3r" => "45.8x32.4cm", + "c4" => "22.9x32.4cm", + "c4r" => "32.4x22.9cm", + "c5" => "16.2x22.9cm", + "c5r" => "22.9x16.2cm", + "c6" => "11.46x16.2cm", + "c6r" => "16.2x11.46cm", + "c7" => "8.1x11.46cm", + "c7r" => "11.46x8.1cm", + "foolscap" => "13.5x17.0", + "ledger" => "17.0x11.0", + "legal" => "8.5x14", + "letter" => "8.5x11", + "tabloid" => "11.0x17.0", + "us" => "8.5x11", + "usr" => "11x8.5", +); my %pdftex_papersize = ( + "a4" => [ '210 true mm', '297 true mm' ], "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; +my %dvipdfm_papersize = ( + "a3" => 1, + "a4" => 1, + "ledger" => 1, + "legal" => 1, + "letter" => 1, + "tabloid" => 1, +); + + + +=item C<do_paper($prog,$texmfsysconfig,@args)> + +Call the paper subroutine for C<$prog>, passing args. Return hash of +necessary post-install programs for C<handle_ret_hash> to run. + +=cut + +sub do_paper { + my ($prog,$texmfsysconfig,@args) = @_; + my @ret = (); + if (exists $paper_sub{$prog}) { + my $sub = $paper_sub{$prog}; + @ret = &$sub($texmfsysconfig, @args); + } else { + tlwarn("$0: unknown paper program $prog ($texmfsysconfig,@args)\n"); + } + return @ret; +} + + +=item C<paper_all($texmfsysconfig, $newpaper)> + +Pass all C<@args> to each paper subroutine in turn, thus setting the +paper size for all supported programs. Return merge of all returned +hashes. + +=cut 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}}(@_)); + for my $p (sort keys %paper_sub) { + merge_into(\%ret, &{$paper_sub{$p}} (@_)); } return \%ret; } -sub get_paper_list { - my $prog = shift; - return ( &{$papersetting_subs{$prog}} ( "/dummy", "--returnlist" ) ); + +# return the config file to look in by running kpsewhich with the +# specified PROGNAME, FORMAT, and @FILENAMES. If no result, give a +# warning and return the empty string. +# +sub find_paper_file { + my ($progname, $format, @filenames) = @_; + my $ret = ""; + + my $cmd; + for my $filename (@filenames) { + $cmd = qq!kpsewhich --progname=$progname --format="$format" $filename!; + chomp($ret = `$cmd`); + if ($ret) { + debug("paper file for $progname ($format) $filename: $ret\n"); + last; + } + } + + tlwarn("$0: found no paper file for $progname (from $cmd)\n") if ! $ret; + return $ret; } + +# 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 $newpaper = shift; + + my $inp = &find_paper_file("xdvi", "other text files", "XDvi"); + return () unless $inp; + + my $outcomp = $paper_config_path_component{"xdvi"} + || $default_paper_config_path_component{"xdvi"}; + my $outfile = "$outtree/$outcomp"; + + my @sizes = 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, \@sizes, '(undefined)', '*paper: a4', $newpaper); +} + + # pdftex pdftexconfig.tex format # /--- pdftexconfig.tex --- # |... @@ -130,17 +227,18 @@ sub get_paper_list { # 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"); + my %ret; + + my $outcomp = $paper_config_path_component{"pdftex"} + || $default_paper_config_path_component{"pdftex"}; + my $outfile = "$outtree/$outcomp"; + + my $inp = &find_paper_file("pdftex", "tex", "pdftexconfig.tex"); + return () unless $inp; - open(FOO, "<$cf") or die("cannot open file: $!"); + open(FOO, "<$inp") || die "$0: open($inp) failed: $!"; my @lines = <FOO>; close(FOO); @@ -187,7 +285,7 @@ sub paper_pdftex { info("$p\n") unless ($p eq $currentpaper); } } elsif ($newpaper eq "--returnlist") { - my @ret; + my @ret = (); push @ret, "$currentpaper"; for my $p (keys %pdftex_papersize) { push @ret, $p unless ($p eq $currentpaper); @@ -224,31 +322,29 @@ sub paper_pdftex { $lines[$#lines] = $newwline; } } - info("Setting paper for pdftex to $newpaper.\n"); + info("$0: setting paper size 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; + tlwarn("$0: Cannot write to $outfile: $!\n"); + tlwarn("Not setting paper size for pdftex.\n"); + return (); } for (@lines) { print TMP; } - close (TMP); + close(TMP) || warn "$0: close(>$outfile) failed: $!"; + $ret{"format"} = 1; } else { - warn "Not a valid paper size for pdftex: $newpaper\n"; + tlwarn("$0: Not a valid paper size for pdftex: $newpaper\n"); } } } else { - # just print the current value - info("current pdftex paper size: $currentpaper\n"); + info("Current pdftex paper size (from $inp): $currentpaper\n"); } return \%ret; } -$papersetting_subs{"pdftex"} = \&paper_pdftex; -############################################### -# + # dvips config.ps format: # /--- config.ps --- # |... @@ -277,17 +373,18 @@ $papersetting_subs{"pdftex"} = \&paper_pdftex; # 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"); + my %ret; + + my $inp = &find_paper_file("dvips", "dvips config", "config.ps"); + return () unless $inp; + + my $outcomp = $paper_config_path_component{"dvips"} + || $default_paper_config_path_component{"dvips"}; + my $outfile = "$outtree/$outcomp"; - open(FOO, "<$configps") or die("cannot open file: $!"); + open(FOO, "<$inp") || die "$0: open($inp) failed: $!"; my @lines = <FOO>; close(FOO); @@ -348,109 +445,28 @@ sub paper_dvips { } push @newlines, $lines[$idx]; } - info("Setting paper for dvips to $newpaper.\n"); + info("$0: setting paper size 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; + tlwarn("$0: Cannot write to $outfile: $!\n"); + tlwarn("Not setting paper size for dvips.\n"); + return (); } for (@newlines) { print TMP; } - close (TMP); + close(TMP) || warn "$0: close(>$outfile) failed: $!"; } else { - warn "Not a valid paper size for dvips: $newpaper\n"; + tlwarn("$0: Not a valid paper size for dvips: $newpaper\n"); } } } else { - # just print the current value - info("current dvips paper size: $papersizes[0]\n"); + info("Current dvips paper size (from $inp): $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 --- # |... @@ -466,43 +482,78 @@ $papersetting_subs{"xdvi"} = \&paper_xdvi; # # 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 ($inp,$prog,$outtree,$paplist,$newpaper) = @_; + my $outcomp = $paper_config_path_component{$prog} + || $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); + }, $outfile, $paplist, '(undefined)', '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); + + my $inp = &find_paper_file("dvipdfm", "other text files", "config"); + return () unless $inp; + + my @sizes = keys %dvipdfm_papersize; + return &do_dvipdfm_and_x($inp, "dvipdfm", $outtree, \@sizes, $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); + + my $inp = &find_paper_file("dvipdfmx", "other text files", "dvipdfmx.cfg"); + return () unless $inp; + + my @sizes = keys %dvipdfm_papersize; + return &do_dvipdfm_and_x($inp, "dvipdfmx", $outtree, \@sizes, $newpaper); } -$papersetting_subs{"dvipdfmx"} = \&paper_dvipdfmx; + +# context format: +# /--- cont-sys.{tex,rme} +# |... +# |\setuppapersize[letter][letter] +# |... +# \------------ +# +sub paper_context { + my $outtree = shift; + my $newpaper = shift; + + my $outcomp = $paper_config_path_component{"context"} + || $default_paper_config_path_component{"context"}; + my $outfile = "$outtree/$outcomp"; + my $inp = &find_paper_file("context", "tex", "cont-sys.tex", "cont-sys.rme"); + return () unless $inp; -# + my @sizes = 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, \@sizes, 'a4', '\setuppapersize[a4][a4]', $newpaper); +} + + # paper_do_simple does the work for single line config files -# (xdvi, dvipdfm, dvipdfmx) +# (xdvi, dvipdfm, ...) # arguments: # $inp, $prog, $firstre, $secondre, $bl, $outp, $paplist, $newpaper # with @@ -552,7 +603,7 @@ sub paper_do_simple { info("$p\n") unless ($p eq $currentpaper); } } elsif ($newpaper eq "--returnlist") { - my @ret; + my @ret = (); push @ret, $currentpaper; for my $p (@$paplist) { push @ret, $p unless ($p eq $currentpaper); @@ -581,24 +632,25 @@ sub paper_do_simple { if (!$foundcfg) { push @newlines, &$bl($defaultline, $newpaper); } - info("Setting paper for $prog to $newpaper.\n"); + info("$0: setting paper size 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"); + tlwarn("$0: Cannot write to $outp: $!\n"); + tlwarn("Not setting paper size for $prog.\n"); return; } for (@newlines) { print TMP; } - close (TMP); + close(TMP) || warn "$0: close(>$outfile) failed: $!"; + $ret{"format"} = 1 if $prog eq "context"; } else { - warn "Not a valid paper size for $prog: $newpaper\n"; + tlwarn("$0: Not a valid paper size for $prog: $newpaper\n"); } } } else { - # just return the current value - info("Current paper setting for $prog: $currentpaper\n"); + # return the current value + info("Current $prog paper size (from $inp): $currentpaper\n"); } return \%ret; } |