diff options
Diffstat (limited to 'Master/tlpkg/dev/quilt-patches/dev.multi-updmap')
-rw-r--r-- | Master/tlpkg/dev/quilt-patches/dev.multi-updmap | 4209 |
1 files changed, 4209 insertions, 0 deletions
diff --git a/Master/tlpkg/dev/quilt-patches/dev.multi-updmap b/Master/tlpkg/dev/quilt-patches/dev.multi-updmap new file mode 100644 index 00000000000..551bb33f852 --- /dev/null +++ b/Master/tlpkg/dev/quilt-patches/dev.multi-updmap @@ -0,0 +1,4209 @@ +--- + install-tl | 7 + texmf-dist/web2c/updmap.cfg | 230 +++ + texmf/scripts/tetex/updmap.pl | 3017 ++++++++++++++++++++++++----------------- + texmf/scripts/texlive/tlmgr.pl | 131 - + texmf/web2c/updmap-hdr.cfg | 107 - + texmf/web2c/updmap.cfg | 256 --- + tlpkg/TeXLive/TLUtils.pm | 67 + 7 files changed, 2071 insertions(+), 1744 deletions(-) + +Index: Master/texmf/web2c/updmap.cfg +=================================================================== +--- Master.orig/texmf/web2c/updmap.cfg 2012-01-12 12:54:40.000000000 +0900 ++++ Master/texmf/web2c/updmap.cfg 2012-01-12 12:55:09.000000000 +0900 +@@ -1,31 +1,7 @@ +-# Generated by /home/texlive/karl/Master/bin/i386-linux/tlmgr on Mon Jan 9 04:29:26 2012 +-# $Id: updmap-hdr.cfg 24398 2011-10-26 01:07:22Z preining $ +-# +-# The full updmap.cfg is generated by concatenating updmap-hdr.cfg with +-# all the Map and MixedMap lines from an installation, possibly +-# appending a local configuration file. +-# +-# To make local customizations to the map files, please use of the +-# following methods: +-# +-# 1) call +-# updmap-sys --enable Map=foo.map +-# for each map file. (Or MixedMap instead of Map, if your font has +-# both Metafont and outline definitions.) See the updmap --help +-# documentation. +-# +-# 2) add your local map entries to the file +-# TEXMFLOCAL/web2c/updmap-local.cfg +-# and then call +-# tlmgr generate updmap +-# which will concatenate updmap-local.cfg to the end of the final +-# updmap.cfg. (You can override the local.cfg file location with the +-# --localcfg option; see tlmgr --help.) +-# +-# If you use either of these methods, your local adaptations will be +-# preserved when tlmgr updates the installation or this config file. +-# Manual edits to updmap.cfg may be lost on update. +- ++# ++# updmap.cfg ++# TEXMFMAIN ++# only the options are defined here + + ################################################################ + # OPTIONS +@@ -100,227 +76,3 @@ + # map file used. + kanjiEmbed noEmbed + +-################################################################ +-# Map files. +-################################################################ +-# +-# There are two possible entries: Map and MixedMap. Both have one additional +-# argument: the filename of the map file. MixedMap ("mixed" means that +-# the font is available as bitmap and as outline) lines will not be used +-# in the default map of dvips if dvipsPreferOutline is false. Inactive +-# Map files should be marked by "#! " (without the quotes), not just #. +-# +- +-Map OrnementsADF.map +-Map ArrowsADF.map +-Map BulletsADF.map +-MixedMap allrunes.map +-Map euler.map +-MixedMap cm.map +-MixedMap cmextra.map +-MixedMap cyrillic.map +-MixedMap latxfont.map +-MixedMap symbols.map +-Map uaq.map +-Map antt.map +-Map arabi.map +-MixedMap arabtex.map +-Map archaicprw.map +-Map arev.map +-Map bkaiu.map +-Map bsmiu.map +-Map gbsnu.map +-Map gkaiu.map +-Map ascii.map +-Map augie.map +-Map auncial.map +-Map aurical.map +-Map ybv.map +-MixedMap bbold.map +-Map belleek.map +-Map bera.map +-Map ybd.map +-Map sqrcaps.map +-Map boondox.map +-Map pbsi.map +-Map burmese.map +-Map calligra.map +-Map cantarell.map +-Map cmin.map +-MixedMap cbgreek-full.map +-MixedMap ccpl.map +-Map ccicons.map +-Map clm.map +-Map chemarrow.map +-Map cjhebrew.map +-MixedMap cmtext-bsr-interpolated.map +-Map cm-lgc.map +-MixedMap cm-super-t1.map +-MixedMap cm-super-t2a.map +-MixedMap cm-super-t2b.map +-MixedMap cm-super-t2c.map +-MixedMap cm-super-ts1.map +-MixedMap cm-super-x2.map +-Map cmcyr.map +-MixedMap cmll.map +-Map comfortaa.map +-Map original-context-symbol.map +-MixedMap csother.map +-MixedMap cstext.map +-Map cyklop.map +-Map dejavu-type1.map +-Map dictsym.map +-Map dstroke.map +-Map droid.map +-Map dutchcal.map +-Map yes.map +-Map epigrafica.map +-Map epiolmec.map +-MixedMap esint.map +-Map ESSTIX.map +-Map esvect.map +-MixedMap ethiop.map +-MixedMap eurosym.map +-Map fdsymbol.map +-Map fge.map +-Map foekfont.map +-Map fonetika.map +-Map fourier-utopia-expert.map +-Map fourier.map +-Map frcursive.map +-Map garuda-c90.map +-Map gfsartemisia.map +-Map gfsbaskerville.map +-Map gfsbodoni.map +-Map gfscomplutum.map +-Map gfsdidot.map +-Map gfsneohellenic.map +-Map gfsporson.map +-Map gfssolomos.map +-Map yfrak.map +-Map ugq.map +-Map grverb.map +-MixedMap hfbright.map +-MixedMap iby.map +-Map fi4.map +-Map Acorn.map +-Map AnnSton.map +-Map ArtNouv.map +-Map ArtNouvc.map +-Map Carrickc.map +-Map Eichenla.map +-Map Eileen.map +-Map EileenBl.map +-Map Elzevier.map +-Map GotIn.map +-Map GoudyIn.map +-Map Kinigcap.map +-Map Konanur.map +-Map Kramer.map +-Map MorrisIn.map +-Map Nouveaud.map +-Map Romantik.map +-Map Rothdn.map +-Map RoyalIn.map +-Map Sanremo.map +-Map Starburst.map +-Map Typocaps.map +-Map Zallman.map +-Map iwona.map +-KanjiMap otf-@kanjiEmbed@.map +-KanjiMap otf-cktx.map +-Map kerkis.map +-Map knitfont.map +-Map kpfonts.map +-Map kurier.map +-Map lato.map +-Map libertine.map +-Map yly.map +-Map linearA.map +-Map l7x-urwvn.map +-Map lm.map +-MixedMap lxfonts.map +-MixedMap manfnt.map +-Map marvosym.map +-Map mathabx.map +-Map mdbch.map +-Map mdput.map +-Map mdugm.map +-Map mdsymbol.map +-Map troff-updmap.map +-MixedMap mflogo.map +-Map MnSymbol.map +-MixedMap mongolian.map +-MixedMap musix.map +-Map norasi-c90.map +-Map cherokee.map +-Map ocrb.map +-Map oinuit.map +-Map omega.map +-Map opensans.map +-Map paratype-type1.map +-Map phaistos.map +-MixedMap pigpen.map +-MixedMap plother.map +-MixedMap pltext.map +-Map ap.map +-Map prodint.map +-Map charter.map +-Map fpls.map +-Map pazo.map +-Map utopia.map +-KanjiMap morisawa.map +-KanjiMap ptex-@kanjiEmbed@.map +-Map pxfonts.map +-Map pxtx.map +-Map recycle.map +-Map yrd.map +-MixedMap rsfs.map +-Map rsfso.map +-Map skt.map +-MixedMap semaf.map +-Map SkakNew.map +-Map starfont.map +-Map icelandic.map +-MixedMap stmaryrd.map +-Map tabvar.map +-Map mathpple.map +-Map qag.map +-Map qbk.map +-Map qcr.map +-Map qcs.map +-Map qhv.map +-Map qpl.map +-Map qtm.map +-Map qzc.map +-Map tfrupee.map +-MixedMap tipa.map +-MixedMap trajan.map +-Map txfonts.map +-Map gptimes.map +-Map umj.map +-MixedMap dvng.map +-Map yv1.map +-Map yv2.map +-Map yv3.map +-Map yvo.map +-Map yvt.map +-Map arevvn.map +-Map chartervn.map +-Map cmbrightvn.map +-Map concretevn.map +-Map grotesqvn.map +-Map txttvn.map +-Map urwvn.map +-MixedMap vnrother.map +-MixedMap vnrtext.map +-Map vntopia.map +-Map dgj.map +-Map dmj.map +-Map mc2j.map +-Map mcj.map +-Map mr2j.map +-Map mrj.map +-MixedMap wasy.map +-MixedMap xypic.map +-MixedMap yhmath.map +Index: Master/texmf-dist/web2c/updmap.cfg +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ Master/texmf-dist/web2c/updmap.cfg 2012-01-12 12:56:10.000000000 +0900 +@@ -0,0 +1,230 @@ ++# ++# updmap.cfg ++# TEXMFDIST ++# only contains the actual maps ++# settings are in TEXMFMAIN ++ ++################################################################ ++# Map files. ++################################################################ ++# ++# There are two possible entries: Map and MixedMap. Both have one additional ++# argument: the filename of the map file. MixedMap ("mixed" means that ++# the font is available as bitmap and as outline) lines will not be used ++# in the default map of dvips if dvipsPreferOutline is false. Inactive ++# Map files should be marked by "#! " (without the quotes), not just #. ++# ++ ++Map OrnementsADF.map ++Map ArrowsADF.map ++Map BulletsADF.map ++MixedMap allrunes.map ++Map euler.map ++MixedMap cm.map ++MixedMap cmextra.map ++MixedMap cyrillic.map ++MixedMap latxfont.map ++MixedMap symbols.map ++Map uaq.map ++Map antt.map ++Map arabi.map ++MixedMap arabtex.map ++Map archaicprw.map ++Map arev.map ++Map bkaiu.map ++Map bsmiu.map ++Map gbsnu.map ++Map gkaiu.map ++Map ascii.map ++Map augie.map ++Map auncial.map ++Map aurical.map ++Map ybv.map ++MixedMap bbold.map ++Map belleek.map ++Map bera.map ++Map ybd.map ++Map sqrcaps.map ++Map boondox.map ++Map pbsi.map ++Map burmese.map ++Map calligra.map ++Map cantarell.map ++Map cmin.map ++MixedMap cbgreek-full.map ++MixedMap ccpl.map ++Map ccicons.map ++Map clm.map ++Map chemarrow.map ++Map cjhebrew.map ++MixedMap cmtext-bsr-interpolated.map ++Map cm-lgc.map ++MixedMap cm-super-t1.map ++MixedMap cm-super-t2a.map ++MixedMap cm-super-t2b.map ++MixedMap cm-super-t2c.map ++MixedMap cm-super-ts1.map ++MixedMap cm-super-x2.map ++Map cmcyr.map ++MixedMap cmll.map ++Map comfortaa.map ++Map original-context-symbol.map ++MixedMap csother.map ++MixedMap cstext.map ++Map cyklop.map ++Map dejavu-type1.map ++Map dictsym.map ++Map dstroke.map ++Map droid.map ++Map dutchcal.map ++Map yes.map ++Map epigrafica.map ++Map epiolmec.map ++MixedMap esint.map ++Map ESSTIX.map ++Map esvect.map ++MixedMap ethiop.map ++MixedMap eurosym.map ++Map fdsymbol.map ++Map fge.map ++Map foekfont.map ++Map fonetika.map ++Map fourier-utopia-expert.map ++Map fourier.map ++Map frcursive.map ++Map garuda-c90.map ++Map gfsartemisia.map ++Map gfsbaskerville.map ++Map gfsbodoni.map ++Map gfscomplutum.map ++Map gfsdidot.map ++Map gfsneohellenic.map ++Map gfsporson.map ++Map gfssolomos.map ++Map yfrak.map ++Map ugq.map ++Map grverb.map ++MixedMap hfbright.map ++MixedMap iby.map ++Map fi4.map ++Map Acorn.map ++Map AnnSton.map ++Map ArtNouv.map ++Map ArtNouvc.map ++Map Carrickc.map ++Map Eichenla.map ++Map Eileen.map ++Map EileenBl.map ++Map Elzevier.map ++Map GotIn.map ++Map GoudyIn.map ++Map Kinigcap.map ++Map Konanur.map ++Map Kramer.map ++Map MorrisIn.map ++Map Nouveaud.map ++Map Romantik.map ++Map Rothdn.map ++Map RoyalIn.map ++Map Sanremo.map ++Map Starburst.map ++Map Typocaps.map ++Map Zallman.map ++Map iwona.map ++KanjiMap otf-@kanjiEmbed@.map ++KanjiMap otf-cktx.map ++Map kerkis.map ++Map knitfont.map ++Map kpfonts.map ++Map kurier.map ++Map lato.map ++Map libertine.map ++Map yly.map ++Map linearA.map ++Map l7x-urwvn.map ++Map lm.map ++MixedMap lxfonts.map ++MixedMap manfnt.map ++Map marvosym.map ++Map mathabx.map ++Map mdbch.map ++Map mdput.map ++Map mdugm.map ++Map mdsymbol.map ++Map troff-updmap.map ++MixedMap mflogo.map ++Map MnSymbol.map ++MixedMap mongolian.map ++MixedMap musix.map ++Map norasi-c90.map ++Map cherokee.map ++Map ocrb.map ++Map oinuit.map ++Map omega.map ++Map opensans.map ++Map paratype-type1.map ++Map phaistos.map ++MixedMap pigpen.map ++MixedMap plother.map ++MixedMap pltext.map ++Map ap.map ++Map prodint.map ++Map charter.map ++Map fpls.map ++Map pazo.map ++Map utopia.map ++KanjiMap morisawa.map ++KanjiMap ptex-@kanjiEmbed@.map ++Map pxfonts.map ++Map pxtx.map ++Map recycle.map ++Map yrd.map ++MixedMap rsfs.map ++Map rsfso.map ++Map skt.map ++MixedMap semaf.map ++Map SkakNew.map ++Map starfont.map ++Map icelandic.map ++MixedMap stmaryrd.map ++Map tabvar.map ++Map mathpple.map ++Map qag.map ++Map qbk.map ++Map qcr.map ++Map qcs.map ++Map qhv.map ++Map qpl.map ++Map qtm.map ++Map qzc.map ++Map tfrupee.map ++MixedMap tipa.map ++MixedMap trajan.map ++Map txfonts.map ++Map gptimes.map ++Map umj.map ++MixedMap dvng.map ++Map yv1.map ++Map yv2.map ++Map yv3.map ++Map yvo.map ++Map yvt.map ++Map arevvn.map ++Map chartervn.map ++Map cmbrightvn.map ++Map concretevn.map ++Map grotesqvn.map ++Map txttvn.map ++Map urwvn.map ++MixedMap vnrother.map ++MixedMap vnrtext.map ++Map vntopia.map ++Map dgj.map ++Map dmj.map ++Map mc2j.map ++Map mcj.map ++Map mr2j.map ++Map mrj.map ++MixedMap wasy.map ++MixedMap xypic.map ++MixedMap yhmath.map +Index: Master/texmf/scripts/texlive/tlmgr.pl +=================================================================== +--- Master.orig/texmf/scripts/texlive/tlmgr.pl 2012-01-12 12:54:40.000000000 +0900 ++++ Master/texmf/scripts/texlive/tlmgr.pl 2012-01-12 13:42:40.000000000 +0900 +@@ -624,47 +624,21 @@ + chomp(my $TEXMFSYSVAR = `kpsewhich -var-value=TEXMFSYSVAR`); + chomp(my $TEXMFSYSCONFIG = `kpsewhich -var-value=TEXMFSYSCONFIG`); + chomp(my $TEXMFLOCAL = `kpsewhich -var-value=TEXMFLOCAL`); ++ chomp(my $TEXMFDIST = `kpsewhich -var-value=TEXMFDIST`); + + # + # maps handling +- # if enabled and disabled -> do nothing +- # if only enabled -> enable it +- # if only disabled -> disable it +- # if the option "generate_updmap" is set, then simply ignore all that +- # and run the equivalent of tlmgr generate updmap + { + my $updmap_run_needed = 0; +- my %do_enable; +- my %do_disable; + for my $m (keys %{$::execute_actions{'enable'}{'maps'}}) { + $updmap_run_needed = 1; +- $do_enable{$m} = 1; + } + for my $m (keys %{$::execute_actions{'disable'}{'maps'}}) { + $updmap_run_needed = 1; +- if (defined($do_enable{$m})) { +- # we are upgrading because it is disabled and enabled, so +- # delete the entry in do_enable, it is already +- delete $do_enable{$m}; +- } else { +- # not new installed, so simply removed +- $do_disable{$m} = 1; +- } +- } +- if ($updmap_run_needed && $localtlpdb->option("generate_updmap")) { +- my $dest = "$TEXMFSYSCONFIG/web2c/updmap.cfg"; +- my $localcfg = "$TEXMFLOCAL/web2c/updmap-local.cfg"; +- info("tlmgr: generate_updmap writing new $dest\n"); +- TeXLive::TLUtils::create_updmap($localtlpdb, $dest, $localcfg); +- } else { +- for my $m (keys %do_disable) { +- $errors += do_cmd_and_check("updmap-sys --nomkmap --nohash --disable $m"); +- } +- for my $m (keys %do_enable) { +- my $str = "updmap-sys --nomkmap --nohash --enable " . +- $::execute_actions{'enable'}{'maps'}{$m} . "=$m"; +- $errors += do_cmd_and_check($str); +- } ++ } ++ if ($updmap_run_needed) { ++ my $dest = "$TEXMFDIST/web2c/updmap.cfg"; ++ TeXLive::TLUtils::create_updmap($localtlpdb, $dest); + } + $errors += do_cmd_and_check("updmap-sys") if $updmap_run_needed; + } +@@ -3918,17 +3892,15 @@ + init_local_db(); + + # we create fmtutil.cnf, language.dat, language.def in TEXMFSYSVAR and +- # updmap.cfg in TEXMFSYSCONFIG. The reason is that calls to +- # updmap-sys (as is done by the tlmgr update call when packages with +- # maps are installed) will create the updmap.cfg file in +- # TEXMFSYSCONFIG. It would start from the version in TEXMFSYSVAR, but +- # after that the TEXMFSYSCONFIG takes precedence and thus the +- # mechanism explained in updmap.cfg header would not work. We don't +- # want that. So just use TEXMFSYSCONFIG from the start. ++ # updmap.cfg in TEXMFDIST. The reason is that we are now using an ++ # implementation of updmap that supports multiple updmap files. ++ # Local adaptions should not be made there, but only in TEXMFLOCAL ++ # or TEXMF(SYS)CONFIG updmap.cfg + # + chomp (my $TEXMFSYSVAR = `kpsewhich -var-value=TEXMFSYSVAR`); + chomp (my $TEXMFSYSCONFIG = `kpsewhich -var-value=TEXMFSYSCONFIG`); + chomp (my $TEXMFLOCAL = `kpsewhich -var-value=TEXMFLOCAL`); ++ chomp (my $TEXMFDIST = `kpsewhich -var-value=TEXMFDIST`); + + # we do generate all config files, treat $opts{"dest"} as pattern + # and make it append the respective extensions +@@ -4006,10 +3978,9 @@ + } + + } elsif ($what =~ m/^updmap$/i) { +- my $dest = $opts{"dest"} || "$TEXMFSYSCONFIG/web2c/updmap.cfg"; +- my $localcfg = $opts{"localcfg"} || "$TEXMFLOCAL/web2c/updmap-local.cfg"; ++ my $dest = $opts{"dest"} || "$TEXMFDIST/web2c/updmap.cfg"; + debug("$0: writing new updmap.cfg to $dest\n"); +- TeXLive::TLUtils::create_updmap($localtlpdb, $dest, $localcfg); ++ TeXLive::TLUtils::create_updmap($localtlpdb, $dest); + + if ($opts{"rebuild-sys"}) { + do_cmd_and_check("updmap-sys"); +@@ -6110,7 +6081,6 @@ + sys_bin (directory to which executables are linked by the path action) + sys_man (directory to which man pages are linked by the path action) + sys_info (directory to which Info files are linked by the path action) +- generate_updmap (run the equivalent of tlmgr generate updmap on changes) + desktop_integration (Windows-only: create Start menu shortcuts) + fileassocs (Windows-only: change file associations) + multiuser (Windows-only: install for all users) +@@ -6166,9 +6136,6 @@ + Unix-like systems to control the generation of links for executables, + info files and man pages. See the C<path> action for details. + +-For the C<generate_updmap> option, see the C<updmap> section in +-L<generate|/"generate [I<option>]... I<what>">. +- + The last three options control behaviour on Windows installations. If + C<desktop_integration> is set, then some packages will install items in + a sub-folder of the Start menu for C<tlmgr gui>, documentation, etc. If +@@ -6558,31 +6525,20 @@ + =back + + The C<generate> action overwrites any manual changes made in the +-respective files: it recreates them from scratch. ++respective files: it recreates them from scratch based on the ++information of the installed packages, plus local adaptions. + +-For C<fmtutil> and the language files, this is normal, and both the TeX +-Live installer and C<tlmgr> routinely call C<generate> for them. ++The TeX Live installer and C<tlmgr> routinely call C<generate> for ++all of these files. + +-For C<updmap>, however, C<tlmgr> does I<not> use C<generate> by default, +-because the result would be to disable all maps which have been manually +-installed via S<C<updmap-sys --enable>>, e.g., for proprietary or local +-fonts, which has been the standard method for adding fonts to TeX +-installations for years. Rather, the C<generate> action only +-incorporates the changes in the C<--localcfg> file mentioned below. +- +-Notwithstanding the above, if you only use the fonts and font packages +-within TeX Live, and rigorously maintain your local fonts (if any) using +-C<updmap-local.cfg>, there is nothing wrong with using C<generate +-updmap>. It can be helpful in moving from release to release, +-especially. We use it ourselves to generate the C<updmap.cfg> file in +-the live source repository. If you want to commit yourself to using +-C<updmap-local.cfg>, you can set the C<generate_updmap> option and +-C<tlmgr> will run C<generate updmap> for you on update. +- +-In any case, C<tlmgr> updates and maintains the final C<updmap.cfg> in +-C<TEXMFSYSCONFIG> (while the other generated files are in +-C<TEXMFSYSVAR>), because that is the location that C<updmap-sys> (via +-C<tcfmgr>) historically uses. ++For managing your own fonts, please see the documentation of ++updmap, which supports multiple updmap.cfg files. So by simply ++editing TEXMFLOCAL's updmap.cfg they will be accounted for. ++ ++In any case, C<tlmgr> updates and maintains C<updmap.cfg> in ++C<TEXMFDIST> (while the other generated files are in ++C<TEXMFSYSVAR>), because that is the location where the fonts ++are installed. + + In more detail: C<generate> remakes any of the five config files + C<language.dat>, C<language.def>, C<language.dat.lua>, C<fmtutil.cnf>, +@@ -6590,26 +6546,27 @@ + locally-maintained files. + + The locally-maintained files are C<language-local.dat>, +-C<language-local.def>, C<language-local.dat.lua>, C<fmtutil-local.cnf>, +-or C<updmap-local.cfg>, searched for in C<TEXMFLOCAL> in the respective +-directories. If they are present, the final file is made by starting ++C<language-local.def>, C<language-local.dat.lua>, or C<fmtutil-local.cnf>, ++searched for in C<TEXMFLOCAL> in the respective directories. ++The formerly supported C<updmap-local.cfg> is not supported anymore, ++since C<updmap> now supports multiple updmap.cfg files, so local ++additions can be put into an updmap.cfg file in TEXMFLOCAL. ++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. + + Local files specify entries to be disabled with a comment line, namely + one of these: + +- #!NAME + %!NAME + --!NAME + +-where C<fmtutil.cnf> and C<updmap.cfg> use C<#>, C<language.dat> and ++where C<fmtutil.cnf> uses C<#>, C<language.dat> and + C<language.def> use C<%>, and C<language.dat.lua> use C<-->. In any +-case, the I<name> is the respective format name, map file name (include +-the C<.map> extension), or hyphenation pattern identifier. Examples: ++case, the I<name> is the respective format name, or hyphenation pattern ++identifier. Examples: + + #!pdflatex +- #!lm.map + %!german + --!usenglishmax + +@@ -6622,20 +6579,9 @@ + syntax as the master files. + + The form C<generate language> recreates both the C<language.dat>, the +-C<language.def> and the C<language.dat.lua>files, while the forms with ++C<language.def> and the C<language.dat.lua> files, while the forms with + extension recreates only the given language file. + +-Special consideration for updmap.cfg: in addition to font map files, +-this file specifies the setting of five options: C<dvipsPreferOutline>, +-C<LW35>, C<dvipsDownloadBase35>, C<pdftexDownloadBase14>, and +-C<dvipdfmDownloadBase14>. The defaults for these as set in +-C<updmap-hdr.cfg> are usually fine. If you want to change them, you can +-include changed settings for any or all of these five options in your +-C<updmap-local.cfg> file and they will be respected by C<generate +-updmap>. For example: +- +- dvipsDownloadBase35 true +- + Options: + + =over 4 +@@ -6643,7 +6589,7 @@ + =item B<--dest> I<output_file> + + specifies the output file (defaults to the respective location in +-C<TEXMFSYSVAR> for C<language*> and C<fmtutil>, and C<TEXMFSYSCONFIG> ++C<TEXMFSYSVAR> for C<language*> and C<fmtutil>, and C<TEXMFSYSDIST> + for C<updmap>). 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 +@@ -6681,13 +6627,6 @@ + web2c/fmtutil.cnf (and fmtutil-local.cnf); + web2c/updmap.cfg (and updmap-local.cfg). + +-Final repetition: as explained above, C<tlmgr> does I<not> use +-C<generate updmap> for font map files. Therefore, if you want to make +-use of C<updmap-local.cfg>, you must run C<tlmgr generate updmap> +-and C<updmap-sys> yourself after making any local changes. If you +-make yourself responsible for rigorously using C<updmap-local.cfg>), set +-C<option generate_updmap>). +- + + =head1 CONFIGURATION FILE + +Index: Master/texmf/web2c/updmap-hdr.cfg +=================================================================== +--- Master.orig/texmf/web2c/updmap-hdr.cfg 2011-10-26 10:07:22.000000000 +0900 ++++ Master/texmf/web2c/updmap-hdr.cfg 2012-01-12 13:42:09.000000000 +0900 +@@ -1,8 +1,8 @@ + # $Id: updmap-hdr.cfg 24398 2011-10-26 01:07:22Z preining $ + # +-# The full updmap.cfg is generated by concatenating updmap-hdr.cfg with +-# all the Map and MixedMap lines from an installation, possibly +-# appending a local configuration file. ++# The updmap.cfg in this tree (TEXMFDIST) is generated by tlmgr by ++# concatenating updmap-hdr.cfg with all the Map and MixedMap lines ++# from an installation. + # + # To make local customizations to the map files, please use of the + # following methods: +@@ -11,102 +11,11 @@ + # updmap-sys --enable Map=foo.map + # for each map file. (Or MixedMap instead of Map, if your font has + # both Metafont and outline definitions.) See the updmap --help +-# documentation. ++# documentation. This will add lines to the updmap.cfg file in ++# TEXMFSYSCONFIG (creating it if necessary). + # +-# 2) add your local map entries to the file +-# TEXMFLOCAL/web2c/updmap-local.cfg +-# and then call +-# tlmgr generate updmap +-# which will concatenate updmap-local.cfg to the end of the final +-# updmap.cfg. (You can override the local.cfg file location with the +-# --localcfg option; see tlmgr --help.) ++# 2) put all your additional fonts into TEXMFLOCAL and edit ++# TEXMFLOCAL/web2c/updmap.cfg. + # +-# If you use either of these methods, your local adaptations will be +-# preserved when tlmgr updates the installation or this config file. +-# Manual edits to updmap.cfg may be lost on update. +- +- +-################################################################ +-# OPTIONS +-################################################################ +- ++# Manual edits to this updmap.cfg will be lost on update. + # +-# dvipsPreferOutline +-# +-# Should dvips (by default) prefer bitmap fonts or outline fonts +-# if both are available? Independent of this setting, outlines +-# can be forced by putting "p psfonts_t1.map" into a config file +-# that dvips reads. Bitmaps (for the fonts in question) can +-# be forced by putting "p psfonts_pk.map" into a config file. +-# We provide such config files which can be enabled via +-# dvips -Poutline ... resp. dvips -Ppk ... +-# +-# Valid settings for dvipsPreferOutline are true / false: +-dvipsPreferOutline true +- +-# +-# LW35 +-# +-# Which fonts for the "Basic 35 Laserwriter Fonts" do you want to use and +-# how are the filenames chosen? Valid settings: +-# URW: URW fonts with "vendor" filenames (e.g. n019064l.pfb) +-# URWkb: URW fonts with "berry" filenames (e.g. uhvbo8ac.pfb) +-# ADOBE: Adobe fonts with "vendor" filenames (e.g. hvnbo___.pfb) +-# ADOBEkb: Adobe fonts with "berry" filenames (e.g. phvbo8an.pfb) +-LW35 URWkb +- +-# +-# dvipsDownloadBase35 +-# +-# Should dvips (by default) download the standard 35 LaserWriter fonts +-# with the document (then set dvipsDownloadBase35 true) or should these +-# fonts be used from the ps interpreter / printer? +-# Whatever the default is, the user can override it by specifying +-# dvips -Pdownload35 ... resp. dvips -Pbuiltin35 ... to either download +-# the LW35 fonts resp. use the built-in fonts. +-# +-# Valid settings are true / false: +-dvipsDownloadBase35 true +- +-# +-# pdftexDownloadBase14 +-# +-# Should pdftex download the base 14 pdf fonts? Since some configurations +-# (ps / pdf tools / printers) use bad default fonts, it is safer to download +-# the fonts. The pdf files will get bigger, though. +-# Valid settings are true (download the fonts) or false (don't download +-# the fonts). Adobe recommends embedding all fonts. +-pdftexDownloadBase14 true +- +-# +-# dvipdfmDownloadBase14 +-# +-# Should dvipdfm download the base 14 pdf fonts? Since some configurations +-# (ps / pdf tools / printers) use bad default fonts, it is safer to download +-# the fonts. The pdf files will get bigger, though. +-# Valid settings are true (download the fonts) or false (don't download +-# the fonts). +-dvipdfmDownloadBase14 true +- +-# +-# kanjiEmbed +-# +-# updmap generates a file kanjix.map for usage with dvipdfmx. Using this +-# option one can switch between not embedding any kanji font, and several +-# available. +-# Valid setting is any string. At updmap run time the @kanjiEmbed@ substring +-# in a map file name will be replaced with this settings, and the respective +-# map file used. +-kanjiEmbed noEmbed +- +-################################################################ +-# Map files. +-################################################################ +-# +-# There are two possible entries: Map and MixedMap. Both have one additional +-# argument: the filename of the map file. MixedMap ("mixed" means that +-# the font is available as bitmap and as outline) lines will not be used +-# in the default map of dvips if dvipsPreferOutline is false. Inactive +-# Map files should be marked by "#! " (without the quotes), not just #. +-# +- +Index: Master/tlpkg/TeXLive/TLUtils.pm +=================================================================== +--- Master.orig/tlpkg/TeXLive/TLUtils.pm 2012-01-05 11:07:33.000000000 +0900 ++++ Master/tlpkg/TeXLive/TLUtils.pm 2012-01-12 13:04:16.000000000 +0900 +@@ -2575,67 +2575,10 @@ + } + + sub create_updmap { +- my ($tlpdb,$dest,$localconf) = @_; +- my @tlpdblines = $tlpdb->updmap_cfg_lines( +- get_disabled_local_configs($localconf, '#')); +- # we do not use _create_config_files here because we want to +- # parse the $localconf file for the five options in updmap.cfg +- #_create_config_files($tlpdb, "texmf/web2c/updmap-hdr.cfg", $dest, +- # $localconf, 0, '#', \@tlpdblines); +- my $headfile = "texmf/web2c/updmap-hdr.cfg"; +- my $root = $tlpdb->root; +- my @lines; +- my @localconflines; +- my %configs; +- if (-r "$localconf") { +- # +- # this should be done more intelligently, but for now only add those +- # lines without any duplication check ... +- open FOO, "<$localconf" +- or die "strange, -r ok but cannot open $localconf: $!"; +- my @bla = <FOO>; +- close(FOO); +- for my $l (@bla) { +- my ($k, $v, @rest) = split(' ', $l); +- if (check_updmap_config_value($k, $v, $localconf)) { +- $configs{$k} = $v; +- } else { +- push @localconflines, $l; +- } +- } +- } +- # +- # read the -hdr file and replace the options if given in the local +- # config file +- open(INFILE,"<$root/$headfile") or die("Cannot open $root/$headfile"); +- for my $l (<INFILE>) { +- my ($k, $v, @rest) = split(' ', $l); +- if (check_updmap_config_value($k, $v, "$root/$headfile")) { +- if (defined($configs{$k})) { +- push @lines, "$k $configs{$k}\n"; +- } else { +- push @lines, $l; +- } +- } else { +- push @lines, $l; +- } +- } +- close (INFILE); +- +- # add the lines from the tlpdb +- push @lines, @tlpdblines; +- +- # add additional local config lines +- push @lines, @localconflines; +- +- if ($#lines >= 0) { +- open(OUTFILE,">$dest") +- or die("Cannot open $dest for writing: $!"); +- +- printf OUTFILE "# Generated by %s on %s\n", "$0", scalar localtime; +- print OUTFILE @lines; +- close(OUTFILE) || warn "close(>$dest) failed: $!"; +- } ++ my ($tlpdb,$dest) = @_; ++ my @tlpdblines = $tlpdb->updmap_cfg_lines(); ++ _create_config_files($tlpdb, "texmf/web2c/updmap-hdr.cfg", $dest, ++ undef, 0, '#', \@tlpdblines); + } + + sub check_updmap_config_value { +@@ -2703,7 +2646,7 @@ + my @lines = <INFILE>; + push @lines, @$tlpdblinesref; + close (INFILE); +- if (-r "$localconf") { ++ if (defined($localconf) && -r $localconf) { + # + # this should be done more intelligently, but for now only add those + # lines without any duplication check ... +Index: Master/install-tl +=================================================================== +--- Master.orig/install-tl 2011-10-07 07:50:55.000000000 +0900 ++++ Master/install-tl 2012-01-12 13:27:39.000000000 +0900 +@@ -861,11 +861,10 @@ + "$TEXMFSYSVAR/web2c/fmtutil.cnf", + "$TEXMFLOCAL/web2c/fmtutil-local.cnf"); + +- mkdirhier "$vars{'TEXMFSYSCONFIG'}/web2c"; +- info("writing updmap.cfg to $TEXMFSYSCONFIG/web2c/updmap.cfg\n"); ++ mkdirhier "$TEXDIR/texmf-dist/web2c"; ++ info("writing updmap.cfg to $TEXDIR/texmf-dist/web2c/updmap.cfg\n"); + TeXLive::TLUtils::create_updmap ($usedtlpdb, +- "$TEXMFSYSCONFIG/web2c/updmap.cfg", +- "$TEXMFLOCAL/web2c/updmap-local.cfg"); ++ "$TEXDIR/texmf-dist/web2c/updmap.cfg"); + + info("writing language.dat to $TEXMFSYSVAR/tex/generic/config/language.dat\n"); + TeXLive::TLUtils::create_language_dat($usedtlpdb, +Index: Master/texmf/scripts/tetex/updmap.pl +=================================================================== +--- Master.orig/texmf/scripts/tetex/updmap.pl 2011-11-16 07:55:48.000000000 +0900 ++++ Master/texmf/scripts/tetex/updmap.pl 2012-01-12 13:48:49.000000000 +0900 +@@ -1,390 +1,452 @@ +-#! /usr/bin/env perl +-# updmap: utility to maintain map files for outline fonts. +-# +-# Copyright 2002-2011 Thomas Esser. +-# Fabrice Popineau wrote the Perl version. ++#!/usr/bin/env perl ++# mupdmap: utility to maintain map files for outline fonts. ++# $Id: mupdmap.pl 25074 2012-01-12 02:48:37Z preining $ ++# ++# Copyright 2011, 2012 Norbert Preining ++# This file is licensed under the GNU General Public License version 2 ++# or any later version. ++# ++# History: ++# Original shell script (C) 2002 Thomas Esser ++# first perl variant (C) Fabrice Popineau ++# later adaptions by Reinhard Kotucha and Karl Berry ++# the original versions were licensed under the following agreement: + # Anyone may freely use, modify, and/or distribute this file, without + # limitation. ++# ++# TODO ++# - check all other invocations ++# ++# TODO after inclusion in TL: ++# - remove the special code that excludes TEXMFMAIN and reorder the rest, ++# should not be necessary anymore ++# - after TL2012? Maybe remove support for reading updmap-local.cfg ++# ++ ++my $TEXMFROOT; + + BEGIN { + $^W=1; +- chomp($TEXMFROOT = `kpsewhich -var-value=TEXMFROOT`); ++ $TEXMFROOT = `kpsewhich -var-value=TEXMFROOT`; ++ if ($?) { ++ print STDERR "(m)updmap: Cannot find TEXMFROOT, aborting!\n"; ++ exit 1; ++ } ++ chomp($TEXMFROOT); + unshift (@INC, "$TEXMFROOT/tlpkg"); + } + +-my $version = '$Id: updmap.pl 24602 2011-11-15 22:55:34Z preining $'; +- +-use strict; +-use TeXLive::TLUtils qw(mkdirhier mktexupd win32); +-use Getopt::Long; +-$Getopt::Long::autoabbrev=0; +-Getopt::Long::Configure (qw(ignore_case_always)); +- +-my $short_progname = "updmap"; +- +-my $cnfFile; +-my $cnfFileShort; +-my $outputdir; +-my $dvipsoutputdir; +-my $pdftexoutputdir; +-my $dvipdfmoutputdir; +-my $pxdvioutputdir; +-my $quiet; +-my $nohash; +-my $nomkmap; +-my (@psADOBE, @fileADOBE, @fileADOBEkb, @fileURW); +- +-my $enableItem; +-my @setoptions = (); +-my @showoptions = (); +-my @disableItem = (); +-my $listmaps; +-my $listavailablemaps; +-my $syncwithtrees; +- +-my $opt_edit; +-my $opt_force; +-my $opt_help; +-my $dry_run; +-my $TEXMFMAIN; +-my $TEXMFVAR; +- +-my $mode; +-my $dvipsPreferOutline; +-my $dvipsDownloadBase35; +-my $pdftexDownloadBase14; +-my $pxdviUse; +-my $kanjiEmbed; +- +-my $dvips35; +-my $pdftex35; +-my $ps2pk35; +- +-my $newcnf; +-my $copy; +-my %link; +-my %maps; +-my @missing; +-my $writelog = 0; +-my $cache = 0; # don't change! +-my $pdftexStripEnc = 0; +- +-# initialize mktexupd +-my $updLSR=&mktexupd(); +-$updLSR->{mustexist}(0); +- +-my @cfg = (); +- +-&main; +-exit 0; +- +- +-# return program name + version string. +-sub version { +- my $ret = sprintf "%s (TeX Live) version %s\n", $short_progname, $version; +- return $ret; +-} +- +-############################################################################### +-# help() +-# display help message and exit +-# +-sub help { +- my $usage= <<"EOF"; +-Usage: $short_progname [OPTION] ... [COMMAND] +- or: $short_progname-sys [OPTION] ... [COMMAND] +- +-Update the default font map files used by pdftex, dvips, and dvipdfm(x), +-(and optionally pxdvi) as determined by the configuration file updmap.cfg +-(the one returned by running "kpsewhich updmap.cfg"). +- +-Among other things, these map files are used to determine which fonts +-should be used as bitmaps and which as outlines, and to determine which +-fonts are included in the output. +- +-By default, the TeX filename database (ls-R) is also updated. +- +-Options: +- --cnffile FILE read FILE for the updmap configuration +- --dvipdfmoutputdir DIR specify output directory (dvipdfm syntax) +- --dvipsoutputdir DIR specify output directory (dvips syntax) +- --pdftexoutputdir DIR specify output directory (pdftex syntax) +- --pxdvioutputdir DIR specify output directory (pxdvi syntax) +- --outputdir DIR specify output directory (for all files) +- --copy cp generic files rather than using symlinks +- --force recreate files even if config hasn't changed +- --nomkmap do not recreate map files +- --nohash do not run texhash +- -n, --dry-run only show the configuration, no output +- --quiet, --silent reduce verbosity +- +-Commands: +- --help show this message and exit +- --version show version information and exit +- --showoptions ITEM show alternatives for options +- --setoption OPTION VALUE set option, where OPTION is one of: +- LW35, dvipsPreferOutline, dvipsDownloadBase35, +- pdftexDownloadBase14, pxdviUse, or kanjiEmbed +- --setoption OPTION=VALUE as above, just different syntax +- --enable MAPTYPE MAPFILE add "MAPTYPE MAPFILE" to updmap.cfg, +- where MAPTYPE is one of: Map, MixedMap, KanjiMap +- --enable Map=MAPFILE add \"Map MAPFILE\" to updmap.cfg +- --enable MixedMap=MAPFILE add \"MixedMap MAPFILE\" to updmap.cfg +- --enable KanjiMap=MAPFILE add \"KanjiMap MAPFILE\" to updmap.cfg +- --disable MAPFILE disable MAPFILE, whether Map, MixedMap, +- or KanjiMap +- --listmaps list all active and inactive maps +- --listavailablemaps same as --listmaps, but without +- unavailable map files +- --syncwithtrees disable unavailable map files in updmap.cfg +- +-Explanation of the map types: the (only) difference between Map and +-MixedMap is that MixedMap entries are not added to psfonts_pk.map. +-The purpose is to help users with printers that render Type 1 outline +-fonts worse than mode-tuned Type 1 bitmap fonts. So, MixedMap is used +-for fonts that are available as both Type 1 and Metafont. +- +-Explanation of the --setoption possibilities: +- +- dvipsPreferOutline true|false (default true) +- Whether dvips uses bitmaps or outlines, when both are available. +- dvipsDownloadBase35 true|false (default false) +- Whether dvips includes the standard 35 PostScript fonts in its output. +- pdftexDownloadBase14 true|false (default true) +- Whether pdftex includes the standard 14 PDF fonts in its output. +- pxdviUse true|false (default false) +- Whether maps for pxdvi (Japanese-patched xdvi) is under control of updmap. +- LW35 URWkb|URW|ADOBEkb|ADOBE (default URWkb) +- Adapt the font and file names of the standard 35 PostScript fonts. +- URWkb URW fonts with "berry" filenames (e.g. uhvbo8ac.pfb) +- URW URW fonts with "vendor" filenames (e.g. n019064l.pfb) +- ADOBEkb Adobe fonts with "berry" filenames (e.g. phvbo8an.pfb) +- ADOBE Adobe fonts with "vendor" filenames (e.g. hvnbo___.pfb) +- kanjiEmbed (any string) + +- These options are only read and acted on by updmap; dvips, pdftex, etc., +- do not know anything about them. They work by changing the default map +- file which the programs read, so they can be overridden by specifying +- command-line options or configuration files to the programs, as +- explained at the beginning of updmap.cfg. ++my $version = '$Id: mupdmap.pl 25074 2012-01-12 02:48:37Z preining $'; + +-Explanation of trees and files normally used: ++use Getopt::Long qw(:config no_autoabbrev ignore_case_always); ++use strict; ++use TeXLive::TLUtils qw(mkdirhier mktexupd win32 basename dirname ++ sort_uniq member); + +- updmap both reads and writes TEXMFCONFIG/web2c/updmap.cfg, according to +- the actions specified. ++#use Data::Dumper; ++#$Data::Dumper::Indent = 1; + +- updmap writes the map files for dvips (psfonts.map) and pdftex +- (pdftex.map) to the TEXMFVAR/fonts/map/updmap/{dvips,pdftex}/ +- directories. ++chomp(my $TEXMFMAIN = `kpsewhich --var-value=TEXMFMAIN`); ++chomp(my $TEXMFVAR = `kpsewhich -var-value=TEXMFVAR`); ++chomp(my $TEXMFCONFIG = `kpsewhich -var-value=TEXMFCONFIG`); ++ ++# make sure that on windows *everything* is in lower case for comparison ++if (win32()) { ++ $TEXMFMAIN = lc($TEXMFMAIN); ++ $TEXMFVAR = lc($TEXMFVAR); ++ $TEXMFCONFIG = lc($TEXMFCONFIG); ++ $TEXMFROOT = lc($TEXMFROOT); ++} ++ ++my $prg = basename($0); ++ ++my %opts = ( quiet => 0, nohash => 0, nomkmap => 0 ); ++my $alldata; ++my $updLSR; ++ ++my @cmdline_options = ( ++ "oldmode", ++ "cnffile=s@", ++ "copy", ++ "disable=s@", ++ "dvipdfmoutputdir=s", ++ "dvipsoutputdir=s", ++ # the following does not work, Getopt::Long looses the first ++ # entry in a multi setting, treat it separately in processOptions ++ # furthermore, it is not supported by older perls, so do it differently ++ #"enable=s{1,2}", ++ "edit", ++ "force", ++ "listavailablemaps", ++ "listmaps|l", ++ "nohash", ++ "nomkmap", ++ "dry-run|n", ++ "outputdir=s", ++ "pdftexoutputdir=s", ++ "pxdvioutputdir=s", ++ "quiet|silent|q", ++ # the following is a correct specification of an option according ++ # to the manual, but it does not work! ++ # we will treat that option by itself in processOptions ++ # furthermore, it is not supported by older perls, so do it differently ++ #"setoption=s@{1,2}", ++ "showoptions=s@", ++ "showoption=s@", ++ "syncwithtrees", ++ "version", ++ "help|h", ++ # some debugging invocations ++ "_readsave=s", ++ "_listupdmap", ++ ); ++ ++my %settings = ( ++ dvipsPreferOutline => { ++ type => "binary", ++ default => "true", ++ }, ++ LW35 => { ++ type => "string", ++ possible => [ qw/URW URWkb ADOBE ADOBEkb/ ], ++ default => "URWkb", ++ }, ++ dvipsDownloadBase35 => { ++ type => "binary", ++ default => "true", ++ }, ++ pdftexDownloadBase14 => { ++ type => "binary", ++ default => "true", ++ }, ++ dvipdfmDownloadBase14 => { ++ type => "binary", ++ default => "true", ++ }, ++ pxdviUse => { ++ type => "binary", ++ default => "false", ++ }, ++ kanjiEmbed => { ++ type => "any", ++ default => "noEmbed", ++ }, ++); + +- The log file is written to TEXMFVAR/web2c/updmap.log. ++&main(); + +- When updmap-sys is run, TEXMFSYSCONFIG and TEXMFSYSVAR are used +- instead. This is the only difference between updmap-sys and updmap. ++############### + +- Other locations can be used if overridden on the command line, or these +- trees don't exist, or you are not using the original TeX Live. ++sub main { ++ processOptions(); + +- To see the precise locations of the various files that +- will be read and written, give the -n option (or read the man page). ++ help() if $opts{'help'}; + +-For step-by-step instructions on making new fonts known to TeX, read +-http://tug.org/fonts/fontinstall.html. For even more terse +-instructions, read the beginning of updmap.cfg. ++ if ($opts{'_readsave'}) { ++ read_updmap_files($opts{'_readsave'}); ++ print "READING DONE ============================\n"; ++ #print Dumper($alldata); ++ $alldata->{'updmap'}{$opts{'_readsave'}}{'changed'} = 1; ++ save_updmap($opts{'_readsave'}); ++ exit 0; ++ } + +-Report bugs to: tex-k\@tug.org +-TeX Live home page: <http://tug.org/texlive/> +-EOF +-; +- print &version(); +- print $usage; +- exit 0; +-} ++ if ($opts{'showoptions'}) { ++ for my $o (@{$opts{'showoptions'}}) { ++ if (defined($settings{$o})) { ++ if ($settings{$o}{'type'} eq "binary") { ++ print "true false\n"; ++ } elsif ($settings{$o}{'type'} eq "string") { ++ print "@{$settings{$o}{'possible'}}\n"; ++ } elsif ($settings{$o}{'type'} eq "any") { ++ print "(any string)\n"; ++ } else { ++ print "strange: unknown type of option $o\nplease report\n"; ++ } ++ } else { ++ print "$prg: unknown option: $o\n"; ++ } ++ } ++ exit 0; ++ } + ++ # config file for changes ++ my $changes_config_file; + +- +-############################################################################### +-# processOptions() +-# process cmd line options +-# +-sub processOptions { ++ # determine which config files should be used ++ # replaces the former "setupCfgFile" + # +- # We parse the command line twice. The first time is to handle +- # --setoption, which might take either one or two following values. +- # the second to handle everything else. The Getopt::Long feature to +- # handle this is only supported in 5.8.8 (released in 2006) or later, +- # and a few people run older perls. +- # +- my $oldconfig = Getopt::Long::Configure(qw(pass_through)); +- # +- sub read_for_set_options { +- my ($setopt, $val) = @_; +- # check if = occurs in $val, if not, get the next argument +- if ($val =~ m/=/) { +- push (@setoptions, $val); ++ # we also determine here where changes will be saved to ++ if ($opts{'cnffile'}) { ++ for my $f (@{$opts{'cnffile'}}) { ++ if (! -f $f) { ++ die "$prg: Config file \"$f\" not found."; ++ } ++ } ++ # in case that config files are given on the command line, the first ++ # in the list is the one where changes will be written to. ++ ($changes_config_file) = @{$opts{'cnffile'}}; ++ } else { ++ my @all_files = `kpsewhich -all updmap.cfg`; ++ chomp(@all_files); ++ my @used_files; ++ # ++ # in --oldmode we ignore texmf/web2c/updmap.cfg and reorder some ++ # order to get things right ++ # without --oldmode everything will be used as default to, i.e. ++ # the order is given by kpsewhich -all updmap.cfg ++ if (!$opts{"oldmode"}) { ++ push @used_files, @all_files; + } else { +- my $vv = shift @ARGV; +- die "$0: --setoption $val given with no value; try --help.\n" +- if !defined($vv); +- push (@setoptions, "$val=$vv"); ++ # --oldmode ++ for my $f (@all_files) { ++ # make sure that all file names are lower case on windows for comparison ++ $f = lc($f) if win32(); ++ if ($f =~ m!$TEXMFROOT/texmf/web2c/updmap.cfg!) { ++ warning("Ignoring $f, it is only a sample file!\n"); ++ } else { ++ push @used_files, $f; ++ } ++ } ++ } ++ # ++ # reorder used files: since we ship and manage with tlmgr ++ # the file in TEXMFSYSCONFIG, and TEXMFLOCAL has *lower* priority ++ # then TEXMFSYSCONFIG, we move a TEXMFLOCAL-updmap.cfg if found ++ # after TEXMFCONFIG TEXMFVAR and TEXMFHOME ++ chomp(my $TEXMFLOCAL =`kpsewhich --var-value=TEXMFLOCAL`); ++ chomp(my $TEXMFHOME =`kpsewhich --var-value=TEXMFHOME`); ++ if (win32()) { ++ $TEXMFLOCAL = lc($TEXMFLOCAL); ++ $TEXMFHOME = lc($TEXMFHOME); ++ } ++ my $found = 0; ++ my $TMLabs = Cwd::abs_path($TEXMFLOCAL); ++ if ($TMLabs) { ++ for my $f (@used_files) { ++ my $absf = Cwd::abs_path($f); #should always work ++ if ($absf =~ m/^$TMLabs/) { ++ $found = 1; ++ last; ++ } ++ } ++ } ++ my $old_updmap_local_found = 0; ++ if (-r "$TMLabs/web2c/updmap-local.cfg") { ++ $old_updmap_local_found = 1; ++ warning("Old configuration file TEXMFLOCAL/web2c/updmap-local.cfg found!\n"); ++ if ($found) { ++ warning("Will read this file *instead* of TEXMFLOCAL/web2c/updmap.cfg!!!\n"); ++ } else { ++ # if TEXMFLOCAL updmap.cfg does not exist, we have to make sure ++ # that the replacement is added to the list of updmap files ++ push @used_files, "$TMLabs/web2c/updmap-local.cfg"; ++ } ++ warning("Please consider moving the information from updmap-local.cfg to TEXMFLOCAL/web2c/updmap.cfg\n"); ++ } ++ if ($found || $old_updmap_local_found) { ++ my @tmp; ++ my $local_pushed = 0; ++ for my $f (@used_files) { ++ if ($f =~ m!$TEXMFCONFIG|$TEXMFVAR|$TEXMFHOME!) { ++ push @tmp, $f; ++ } else { ++ if (!$local_pushed) { ++ # should we use the return value of grep here, but we know ++ # what we will find?!?! ++ if ($old_updmap_local_found) { ++ push @tmp, "$TEXMFLOCAL/web2c/updmap-local.cfg"; ++ } else { ++ push @tmp, "$TEXMFLOCAL/web2c/updmap.cfg"; ++ } ++ $local_pushed = 1; ++ } ++ # push the original ++ push @tmp, $f unless ($f =~ m!$TEXMFLOCAL!); ++ } ++ } ++ @used_files = @tmp; ++ } ++ @{$opts{'cnffile'}} = @used_files; ++ # determine the config file that we will use for changes ++ # if in the list of used files contains either one from ++ # TEXMFHOME or TEXMFCONFIG (which is TEXMFSYSCONFIG in the -sys case) ++ # then use the *top* file (which will be either one of the two), ++ # if none of the two exists, create a file in TEXMFCONFIG and use it ++ my $use_top = 0; ++ for my $f (@used_files) { ++ if ($f =~ m!($TEXMFHOME|$TEXMFCONFIG)/web2c/updmap.cfg!) { ++ $use_top = 1; ++ last; ++ } ++ } ++ if ($use_top) { ++ ($changes_config_file) = @used_files; ++ } else { ++ # add the empty config file ++ my $dn = "$TEXMFCONFIG/web2c"; ++ $changes_config_file = "$dn/updmap.cfg"; + } + } +- GetOptions("setoption=s@" => \&read_for_set_options) +- || die "$0: could not read for --setoption; try --help.\n"; +- +- # restore old getopt config and read everything else. +- Getopt::Long::Configure($oldconfig); +- unless (&GetOptions ( +- "cnffile=s" => \$cnfFile, +- "copy" => \$copy, +- "disable=s" => \@disableItem, +- "dvipdfmoutputdir=s" => \$dvipdfmoutputdir, +- "dvipsoutputdir=s" => \$dvipsoutputdir, +- "enable=s" => \$enableItem, +- "edit" => \$opt_edit, +- "force" => \$opt_force, +- "listavailablemaps" => \$listavailablemaps, +- "l|listmaps" => \$listmaps, +- "nohash" => \$nohash, +- "nomkmap" => \$nomkmap, +- "n|dry-run" => \$dry_run, +- "outputdir=s" => \$outputdir, +- "pdftexoutputdir=s" => \$pdftexoutputdir, +- "pxdvioutputdir=s" => \$pxdvioutputdir, +- "q|quiet|silent" => \$quiet, +- "setoption" => +- sub {die "$0: --setoption needs an option and value; try --help.\n"}, +- "showoptions=s" => \@showoptions, +- "syncwithtrees" => \$syncwithtrees, +- "version" => sub { print &version(); exit(0); }, +- "h|help" => \$opt_help)) { +- die "Try \"$0 --help\" for more information.\n"; +- } +- +- if (@ARGV) { +- warn "$0: Ignoring unexpected non-option argument(s): @ARGV.\n"; +- } +- +- if ($outputdir) { +- $dvipsoutputdir = $outputdir if (! $dvipsoutputdir); +- $pdftexoutputdir = $outputdir if (! $pdftexoutputdir); +- $dvipdfmoutputdir = $outputdir if (! $dvipdfmoutputdir); +- $pxdvioutputdir = $outputdir if (! $pxdvioutputdir); +- } +- if ($cnfFile && ! -f $cnfFile) { +- die "$0: Config file \"$cnfFile\" not found.\n"; +- } +- if ($dvipsoutputdir && ! $dry_run && ! -d $dvipsoutputdir) { +- &mkdirhier ($dvipsoutputdir); +- } +- if ($dvipdfmoutputdir && ! $dry_run && ! -d $dvipdfmoutputdir) { +- &mkdirhier ($dvipdfmoutputdir); +- } +- if ($pdftexoutputdir && ! $dry_run && ! -d $pdftexoutputdir) { +- &mkdirhier ($pdftexoutputdir); ++ print "$prg is using the following updmap.cfg files (in precedence order):\n"; ++ for my $f (@{$opts{'cnffile'}}) { ++ print " $f\n"; + } +- if ($pxdvioutputdir && ! $dry_run && ! -d $pxdvioutputdir) { +- &mkdirhier ($pxdvioutputdir); ++ $alldata->{'changes_config'} = $changes_config_file; ++ ++ if ($opts{'_listupdmap'}) { ++ exit 0; + } +-} + +- +-############################################################################### +-# equalize_file(filename[, comment_char]) +-# read a file and return its processed content as a string. +-# look into the source code for more details. +-# +-sub equalize_file { +- my $file=shift; +- my $comment=shift; +- my @temp; ++ read_updmap_files(@{$opts{'cnffile'}}); + +- open IN, "$file"; +- my @lines = (<IN>); +- close IN; +- chomp(@lines); ++ if ($opts{'showoption'}) { ++ for my $o (@{$opts{'showoption'}}) { ++ if (defined($settings{$o})) { ++ my ($v, $vo) = get_cfg($o); ++ print "$o: $v ($vo)\n"; ++ } else { ++ print "$prg: unknown option: $o\n"; ++ } ++ } ++ exit 0; ++ } + +- for (@lines) { +- s/\s*${comment}.*// if (defined $comment); # remove comments +- next if /^\s*$/; # remove empty lines +- s/\s+/ /g; # replace multiple whitespace chars by a single one +- push @temp, $_; ++ if ($opts{'listmaps'}) { ++ for my $m (keys %{$alldata->{'maps'}}) { ++ my $origin = $alldata->{'maps'}{$m}{'origin'}; ++ print $alldata->{'updmap'}{$origin}{'maps'}{$m}{'type'}, " $m ", ++ $alldata->{'updmap'}{$origin}{'maps'}{$m}{'status'}, " in $origin\n"; ++ } ++ exit 0; + } +- return join('X', sort(@temp)); +-} + +-############################################################################### +-# files_are_different(file_A, file_B[, comment_char]) +-# compare two equalized files. +-# +-sub files_are_different { +- my $file_A=shift; +- my $file_B=shift; +- my $comment=shift; +- my $retval=0; ++ # we do changes always in the used config file with the highest ++ # priority ++ my $bakFile = $changes_config_file; ++ $bakFile =~ s/\.cfg$/.bak/; ++ my $changed = 0; + +- my $A=equalize_file("$file_A", $comment); +- my $B=equalize_file("$file_B", $comment); +- $retval=1 unless ($A eq $B); +- return $retval; +-} ++ if ($opts{'syncwithtrees'}) { ++ my @missing = read_map_files(); ++ if (@missing) { ++ print "Missing map files found, disabling them in $changes_config_file\n"; ++ for my $m (@missing) { ++ $changed ||= disableMap($m); ++ } ++ # the original script did not run any update of the map files here, ++ # should we do that? ++ } ++ exit 0; ++ } + +-############################################################################### +-# files_are_equal(file_A, file_B[, comment_char]) +-# compare two equalized files. Same as files_are_different() with +-# return value inverted. +-# +-sub files_are_equal { +- return (&files_are_different (@_))? 0:1; +-} ++ my $cmd; ++ if ($opts{'edit'}) { ++ if ($opts{"dry-run"}) { ++ printf STDERR "No, are you joking, you want to edit with --dry-run?\n"; ++ printf STDERR "Not doing that, bye bye!\n"; ++ exit 1; ++ } ++ # it's not a good idea to edit updmap.cfg manually these days, ++ # but for compatibility we'll silently keep the option. ++ $cmd = 'edit'; ++ my $editor = $ENV{'VISUAL'} || $ENV{'EDITOR'}; ++ $editor ||= (&win32 ? "notepad" : "vi"); ++ if (-r $changes_config_file) { ++ ©File($changes_config_file, $bakFile); ++ } else { ++ touch($bakFile); ++ touch($changes_config_file); ++ } ++ system($editor, $changes_config_file); ++ $changed = files_are_different($bakFile, $changes_config_file); ++ } elsif ($opts{'setoption'}) { ++ $cmd = 'setOption'; ++ $changed = setOptions (@{$opts{'setoption'}}); ++ } elsif ($opts{'enable'} || $opts{'disable'}) { ++ $cmd = 'enableMap'; ++ $changed ||= enable_disable_maps(@{$opts{'enable'}}, @{$opts{'disable'}}); ++ } + +-############################################################################### +-# files_are_identical(file_A, file_B) +-# compare two files. Same as cmp(1). +-# +-sub files_are_identical { +- my $file_A=shift; +- my $file_B=shift; +- my $retval=0; ++ # what does this? ++ $updLSR = &mktexupd(); ++ $updLSR->{mustexist}(0); + +- open IN, "$file_A"; +- my $A=(<IN>); +- close IN; +- open IN, "$file_B"; +- my $B=(<IN>); +- close IN; ++ if ($cmd && !$opts{'force'} && !$changed) { ++ print "$changes_config_file unchanged. Map files not recreated.\n" ++ if !$opts{'quiet'}; ++ } else { ++ if (!$opts{'nomkmap'}) { ++ # before we continue we have to make sure that a newly created config ++ # file is acually used. So we have to push the $changes_config_file ++ # onto the list of available files. Since it is already properly ++ # initialized and the merging is done later, all settings should be ++ # honored ++ my @aaa = @{$alldata->{'order'}}; ++ unshift @aaa, $changes_config_file; ++ $alldata->{'order'} = [ @aaa ]; ++ setupOutputDir("dvips"); ++ setupOutputDir("pdftex"); ++ setupOutputDir("dvipdfmx"); ++ setupOutputDir("dvipdfm"); ++ setupOutputDir("pxdvi"); ++ my @missing = read_map_files(); ++ if (@missing) { ++ print STDERR "\nERROR: The following map file(s) couldn't be found:\n"; ++ for my $m (@missing) { ++ my $orig = $alldata->{'maps'}{$m}{'origin'}; ++ print STDERR "\t$m (in $orig)\n"; ++ } ++ print STDERR "\n\tDid you run mktexlsr?\n\n" . ++ "\tYou can disable non-existent map entries using the option\n". ++ "\t --syncwithtrees.\n\n"; ++ exit 1; ++ } ++ merge_data(); ++ # for inspecting the output ++ #print STDERR Data::Dumper->Dump([$alldata], [qw(mapdata)]); ++ #print Dumper($alldata); ++ mkMaps(); ++ } ++ unlink ($bakFile) if (-r $bakFile); ++ } + +- $retval=1 if ($A eq $B); +- return $retval; ++ if (!$opts{'nohash'}) { ++ print "$prg: Updating ls-R files.\n" if !$opts{'quiet'}; ++ $updLSR->{exec}() unless $opts{"dry-run"}; ++ } + } + +-############################################################################### +-# getLines() ++################################################################## + # +-############################################################################### +-sub getLines { ++# ++ ++sub getFonts { ++ my ($first, @rest) = @_; ++ my $getall = 0; ++ my @maps = (); ++ if ($first eq "-all") { ++ $getall = 1; ++ @maps = @rest; ++ } else { ++ @maps = ($first, @rest); ++ } + my @lines = (); +- foreach my $fname (@_) { +- next if (! $fname); +- if (! exists $maps{"$fname"}) { +- open FILE, "<$fname" or die "$0: can't get lines from $fname: $!"; +- my @file=<FILE>; +- close FILE; +- if ($writelog) { +- print LOG ("\n$fname:\n"); +- foreach my $line (@file) { +- next if $line =~ /^\s*%/; # comment +- next if $line =~ /^\s*#/; # comment +- next if $line =~ /^\s*$/; # empty line +- my $tfm; +- ($tfm)=split ' ', $line; +- print LOG "$tfm\n"; ++ for my $m (@maps) { ++ if (defined($alldata->{'maps'}{$m})) { ++ print LOG "\n" . $alldata->{'maps'}{$m}{'fullpath'} . ":\n" unless $opts{'dry-run'}; ++ push @lines, "% $m"; ++ for my $k (sort keys %{$alldata->{'maps'}{$m}{'fonts'}}) { ++ if ($getall || $alldata->{'fonts'}{$k}{'origin'} eq $m) { ++ if (defined($alldata->{'maps'}{$m}{'fonts'}{$k})) { ++ push @lines, "$k " . $alldata->{'maps'}{$m}{'fonts'}{$k}; ++ } else { ++ print "undefined fonts for $k in $m ?!?!?\n"; ++ } ++ print LOG "$k\n" unless $opts{'dry-run'}; + } + } +- $maps{"$fname"} = [ @file ] if ($cache); +- push @lines, @file; +- } else { +- push @lines, @{$maps{"$fname"}}; + } + } + chomp @lines; +@@ -397,50 +459,33 @@ + # + sub writeLines { + my ($fname, @lines) = @_; ++ return if $opts{"dry-run"}; + map { ($_ !~ m/\n$/ ? s/$/\n/ : $_ ) } @lines; +- open FILE, ">$fname" or die "$0: can't write lines to $fname: $!"; ++ open FILE, ">$fname" or die "$prg: can't write lines to $fname: $!"; + print FILE @lines; + close FILE; + } + + ############################################################################### +-# copyFile() +-# copy file $src to $dst, sets $dst creation and mod time ++# to_pdftex() ++# if $pdftexStripEnc is set, strip "PS_Encoding_Name ReEncodeFont" ++# from map entries; they are ignored by pdftex. But since the sh ++# incarnation of updmap included them, and we want to minimize ++# differences, this is not done by default. + # +-sub copyFile { +- my ($src, $dst) = @_; +- my $dir; +- ($dir=$dst)=~s/(.*)\/.*/$1/; +- mkdirhier $dir; +- +- $src eq $dst && return "can't copy $src to itself!\n"; +- +- open IN, "<$src" or die "$0: can't open source file $src for copying: $!"; +- open OUT, ">$dst"; +- +- binmode(IN); +- binmode(OUT); +- print OUT <IN>; +- close(OUT); +- close(IN); +- my @t = stat($src); +- utime($t[8], $t[9], $dst); +-} +- +-############################################################################### +-# SymlinkOrCopy(dir, src, dest) +-# create symlinks if possible, otherwise copy files +-# +-sub SymlinkOrCopy { +- my ($dir, $src, $dest) = @_; +- if (&win32 || $copy) { # always copy +- ©File("$dir/$src", "$dir/$dest"); +- } else { # symlink if supported by fs, copy otherwise +- system("cd \"$dir\" && ln -s $src $dest 2>/dev/null || " +- . "cp -p \"$dir/$src\" \"$dir/$dest\""); ++sub to_pdftex { ++ my $pdftexStripEnc = 0; ++ return @_ unless $pdftexStripEnc; ++ my @in = @_; ++ my @out; ++ foreach my $line (@in) { ++ if ($line =~ /^(.*\s+)(\S+\s+ReEncodeFont\s)(.*)/) { ++ $line = "$1$3"; ++ $line =~ s/\s+\"\s+\"\s+/ /; ++ } ++ push @out, $line; + } +- # remember for "Files generated" in &mkMaps. +- $link{"$dest"}="$src"; ++ return @out; + } + + ############################################################################### +@@ -448,35 +493,208 @@ + # set symlink for psfonts.map according to dvipsPreferOutline variable + # + sub setupSymlinks { ++ my ($dvipsPreferOutline, $dvipsoutputdir, $pdftexDownloadBase14, $pdftexoutputdir) = @_; + my $src; ++ my %link; ++ my @link; + +- if ($dvipsPreferOutline) { ++ if ($dvipsPreferOutline eq "true") { + $src = "psfonts_t1.map"; + } else { + $src = "psfonts_pk.map"; + } +- unlink "$dvipsoutputdir/psfonts.map"; +- &SymlinkOrCopy("$dvipsoutputdir", "$src", "psfonts.map"); ++ unlink "$dvipsoutputdir/psfonts.map" unless $opts{"dry-run"}; ++ push @link, &SymlinkOrCopy("$dvipsoutputdir", "$src", "psfonts.map"); + +- if ($pdftexDownloadBase14) { ++ if ($pdftexDownloadBase14 eq "true") { + $src = "pdftex_dl14.map"; + } else { + $src = "pdftex_ndl14.map"; + } +- unlink "$pdftexoutputdir/pdftex.map"; +- &SymlinkOrCopy("$pdftexoutputdir", "$src", "pdftex.map"); ++ unlink "$pdftexoutputdir/pdftex.map" unless $opts{"dry-run"}; ++ push @link, &SymlinkOrCopy("$pdftexoutputdir", "$src", "pdftex.map"); ++ %link = @link; ++ return \%link; ++} ++ ++############################################################################### ++# SymlinkOrCopy(dir, src, dest) ++# create symlinks if possible, otherwise copy files ++# ++sub SymlinkOrCopy { ++ my ($dir, $src, $dest) = @_; ++ return ($src, $dest) if $opts{"dry-run"}; ++ if (&win32 || $opts{'copy'}) { # always copy ++ ©File("$dir/$src", "$dir/$dest"); ++ } else { # symlink if supported by fs, copy otherwise ++ system("cd \"$dir\" && ln -s $src $dest 2>/dev/null || " ++ . "cp -p \"$dir/$src\" \"$dir/$dest\""); ++ } ++ # remember for "Files generated" in &mkMaps. ++ return ($dest, $src); + } + +- ++ + ############################################################################### +-# transLW35(args ...) ++# transLW35(mode args ...) + # transform fontname and filenames according to transformation specified + # by mode. Possible values: + # URW|URWkb|ADOBE|ADOBEkb + # + sub transLW35 { +- my ($name) = @_; +- my @lines = &getLines($name); ++ my ($mode, @lines) = @_; ++ ++ my @psADOBE = ( ++ 's/ URWGothicL-Demi / AvantGarde-Demi /', ++ 's/ URWGothicL-DemiObli / AvantGarde-DemiOblique /', ++ 's/ URWGothicL-Book / AvantGarde-Book /', ++ 's/ URWGothicL-BookObli / AvantGarde-BookOblique /', ++ 's/ URWBookmanL-DemiBold / Bookman-Demi /', ++ 's/ URWBookmanL-DemiBoldItal / Bookman-DemiItalic /', ++ 's/ URWBookmanL-Ligh / Bookman-Light /', ++ 's/ URWBookmanL-LighItal / Bookman-LightItalic /', ++ 's/ NimbusMonL-Bold / Courier-Bold /', ++ 's/ NimbusMonL-BoldObli / Courier-BoldOblique /', ++ 's/ NimbusMonL-Regu / Courier /', ++ 's/ NimbusMonL-ReguObli / Courier-Oblique /', ++ 's/ NimbusSanL-Bold / Helvetica-Bold /', ++ 's/ NimbusSanL-BoldCond / Helvetica-Narrow-Bold /', ++ 's/ NimbusSanL-BoldItal / Helvetica-BoldOblique /', ++ 's/ NimbusSanL-BoldCondItal / Helvetica-Narrow-BoldOblique /', ++ 's/ NimbusSanL-Regu / Helvetica /', ++ 's/ NimbusSanL-ReguCond / Helvetica-Narrow /', ++ 's/ NimbusSanL-ReguItal / Helvetica-Oblique /', ++ 's/ NimbusSanL-ReguCondItal / Helvetica-Narrow-Oblique /', ++ 's/ CenturySchL-Bold / NewCenturySchlbk-Bold /', ++ 's/ CenturySchL-BoldItal / NewCenturySchlbk-BoldItalic /', ++ 's/ CenturySchL-Roma / NewCenturySchlbk-Roman /', ++ 's/ CenturySchL-Ital / NewCenturySchlbk-Italic /', ++ 's/ URWPalladioL-Bold / Palatino-Bold /', ++ 's/ URWPalladioL-BoldItal / Palatino-BoldItalic /', ++ 's/ URWPalladioL-Roma / Palatino-Roman /', ++ 's/ URWPalladioL-Ital / Palatino-Italic /', ++ 's/ StandardSymL / Symbol /', ++ 's/ NimbusRomNo9L-Medi / Times-Bold /', ++ 's/ NimbusRomNo9L-MediItal / Times-BoldItalic /', ++ 's/ NimbusRomNo9L-Regu / Times-Roman /', ++ 's/ NimbusRomNo9L-ReguItal / Times-Italic /', ++ 's/ URWChanceryL-MediItal / ZapfChancery-MediumItalic /', ++ 's/ Dingbats / ZapfDingbats /', ++ ); ++ ++ my @fileADOBEkb = ( ++ 's/\buagd8a.pfb\b/pagd8a.pfb/', ++ 's/\buagdo8a.pfb\b/pagdo8a.pfb/', ++ 's/\buagk8a.pfb\b/pagk8a.pfb/', ++ 's/\buagko8a.pfb\b/pagko8a.pfb/', ++ 's/\bubkd8a.pfb\b/pbkd8a.pfb/', ++ 's/\bubkdi8a.pfb\b/pbkdi8a.pfb/', ++ 's/\bubkl8a.pfb\b/pbkl8a.pfb/', ++ 's/\bubkli8a.pfb\b/pbkli8a.pfb/', ++ 's/\bucrb8a.pfb\b/pcrb8a.pfb/', ++ 's/\bucrbo8a.pfb\b/pcrbo8a.pfb/', ++ 's/\bucrr8a.pfb\b/pcrr8a.pfb/', ++ 's/\bucrro8a.pfb\b/pcrro8a.pfb/', ++ 's/\buhvb8a.pfb\b/phvb8a.pfb/', ++ 's/\buhvb8ac.pfb\b/phvb8an.pfb/', ++ 's/\buhvbo8a.pfb\b/phvbo8a.pfb/', ++ 's/\buhvbo8ac.pfb\b/phvbo8an.pfb/', ++ 's/\buhvr8a.pfb\b/phvr8a.pfb/', ++ 's/\buhvr8ac.pfb\b/phvr8an.pfb/', ++ 's/\buhvro8a.pfb\b/phvro8a.pfb/', ++ 's/\buhvro8ac.pfb\b/phvro8an.pfb/', ++ 's/\buncb8a.pfb\b/pncb8a.pfb/', ++ 's/\buncbi8a.pfb\b/pncbi8a.pfb/', ++ 's/\buncr8a.pfb\b/pncr8a.pfb/', ++ 's/\buncri8a.pfb\b/pncri8a.pfb/', ++ 's/\buplb8a.pfb\b/pplb8a.pfb/', ++ 's/\buplbi8a.pfb\b/pplbi8a.pfb/', ++ 's/\buplr8a.pfb\b/pplr8a.pfb/', ++ 's/\buplri8a.pfb\b/pplri8a.pfb/', ++ 's/\busyr.pfb\b/psyr.pfb/', ++ 's/\butmb8a.pfb\b/ptmb8a.pfb/', ++ 's/\butmbi8a.pfb\b/ptmbi8a.pfb/', ++ 's/\butmr8a.pfb\b/ptmr8a.pfb/', ++ 's/\butmri8a.pfb\b/ptmri8a.pfb/', ++ 's/\buzcmi8a.pfb\b/pzcmi8a.pfb/', ++ 's/\buzdr.pfb\b/pzdr.pfb/', ++ ); ++ ++ my @fileURW = ( ++ 's/\buagd8a.pfb\b/a010015l.pfb/', ++ 's/\buagdo8a.pfb\b/a010035l.pfb/', ++ 's/\buagk8a.pfb\b/a010013l.pfb/', ++ 's/\buagko8a.pfb\b/a010033l.pfb/', ++ 's/\bubkd8a.pfb\b/b018015l.pfb/', ++ 's/\bubkdi8a.pfb\b/b018035l.pfb/', ++ 's/\bubkl8a.pfb\b/b018012l.pfb/', ++ 's/\bubkli8a.pfb\b/b018032l.pfb/', ++ 's/\bucrb8a.pfb\b/n022004l.pfb/', ++ 's/\bucrbo8a.pfb\b/n022024l.pfb/', ++ 's/\bucrr8a.pfb\b/n022003l.pfb/', ++ 's/\bucrro8a.pfb\b/n022023l.pfb/', ++ 's/\buhvb8a.pfb\b/n019004l.pfb/', ++ 's/\buhvb8ac.pfb\b/n019044l.pfb/', ++ 's/\buhvbo8a.pfb\b/n019024l.pfb/', ++ 's/\buhvbo8ac.pfb\b/n019064l.pfb/', ++ 's/\buhvr8a.pfb\b/n019003l.pfb/', ++ 's/\buhvr8ac.pfb\b/n019043l.pfb/', ++ 's/\buhvro8a.pfb\b/n019023l.pfb/', ++ 's/\buhvro8ac.pfb\b/n019063l.pfb/', ++ 's/\buncb8a.pfb\b/c059016l.pfb/', ++ 's/\buncbi8a.pfb\b/c059036l.pfb/', ++ 's/\buncr8a.pfb\b/c059013l.pfb/', ++ 's/\buncri8a.pfb\b/c059033l.pfb/', ++ 's/\buplb8a.pfb\b/p052004l.pfb/', ++ 's/\buplbi8a.pfb\b/p052024l.pfb/', ++ 's/\buplr8a.pfb\b/p052003l.pfb/', ++ 's/\buplri8a.pfb\b/p052023l.pfb/', ++ 's/\busyr.pfb\b/s050000l.pfb/', ++ 's/\butmb8a.pfb\b/n021004l.pfb/', ++ 's/\butmbi8a.pfb\b/n021024l.pfb/', ++ 's/\butmr8a.pfb\b/n021003l.pfb/', ++ 's/\butmri8a.pfb\b/n021023l.pfb/', ++ 's/\buzcmi8a.pfb\b/z003034l.pfb/', ++ 's/\buzdr.pfb\b/d050000l.pfb/', ++ ); ++ ++ my @fileADOBE = ( ++ 's/\buagd8a.pfb\b/agd_____.pfb/', ++ 's/\buagdo8a.pfb\b/agdo____.pfb/', ++ 's/\buagk8a.pfb\b/agw_____.pfb/', ++ 's/\buagko8a.pfb\b/agwo____.pfb/', ++ 's/\bubkd8a.pfb\b/bkd_____.pfb/', ++ 's/\bubkdi8a.pfb\b/bkdi____.pfb/', ++ 's/\bubkl8a.pfb\b/bkl_____.pfb/', ++ 's/\bubkli8a.pfb\b/bkli____.pfb/', ++ 's/\bucrb8a.pfb\b/cob_____.pfb/', ++ 's/\bucrbo8a.pfb\b/cobo____.pfb/', ++ 's/\bucrr8a.pfb\b/com_____.pfb/', ++ 's/\bucrro8a.pfb\b/coo_____.pfb/', ++ 's/\buhvb8a.pfb\b/hvb_____.pfb/', ++ 's/\buhvb8ac.pfb\b/hvnb____.pfb/', ++ 's/\buhvbo8a.pfb\b/hvbo____.pfb/', ++ 's/\buhvbo8ac.pfb\b/hvnbo___.pfb/', ++ 's/\buhvr8a.pfb\b/hv______.pfb/', ++ 's/\buhvr8ac.pfb\b/hvn_____.pfb/', ++ 's/\buhvro8a.pfb\b/hvo_____.pfb/', ++ 's/\buhvro8ac.pfb\b/hvno____.pfb/', ++ 's/\buncb8a.pfb\b/ncb_____.pfb/', ++ 's/\buncbi8a.pfb\b/ncbi____.pfb/', ++ 's/\buncr8a.pfb\b/ncr_____.pfb/', ++ 's/\buncri8a.pfb\b/nci_____.pfb/', ++ 's/\buplb8a.pfb\b/pob_____.pfb/', ++ 's/\buplbi8a.pfb\b/pobi____.pfb/', ++ 's/\buplr8a.pfb\b/por_____.pfb/', ++ 's/\buplri8a.pfb\b/poi_____.pfb/', ++ 's/\busyr.pfb\b/sy______.pfb/', ++ 's/\butmb8a.pfb\b/tib_____.pfb/', ++ 's/\butmbi8a.pfb\b/tibi____.pfb/', ++ 's/\butmr8a.pfb\b/tir_____.pfb/', ++ 's/\butmri8a.pfb\b/tii_____.pfb/', ++ 's/\buzcmi8a.pfb\b/zcmi____.pfb/', ++ 's/\buzdr.pfb\b/zd______.pfb/', ++ ); + + if ($mode eq "" || $mode eq "URWkb") { + # do nothing +@@ -497,963 +715,1300 @@ + } + + ############################################################################### +-# locateWeb2c (file ...) +-# apply kpsewhich with format 'web2c files' +-# +-sub locateWeb2c { +- my @files = @_; +- return @files if ($#files < 0); +- +- @files = split (/\n/, `kpsewhich --format="web2c files" @files`); +- if (wantarray) { +- return @files; +- } +- else { +- return $files[0]; ++# cidx2dvips() ++# reads from stdin, writes to stdout. It transforms "cid-x"-like syntax into ++# "dvips"-like syntax. ++############################################################################### ++sub cidx2dvips { ++ my ($s) = @_; ++ my @d; ++ foreach (@$s) { ++ if (m/^%/) { ++ push(@d, $_); ++ next; ++ } ++ s/,BoldItalic/ -s .3/; ++ s/,Bold//; ++ s/,Italic/ -s .3/; ++ s/\s\s*/ /g; ++ if ($_ =~ /.*[@\:\/,]/) {next;} ++ elsif ($_ =~ /^[^ ][^ ]* unicode /) {next;} ++ s/^([^ ][^ ]* [^ ][^ ]* [^ ][^ ]*)\.[Oo][Tt][Ff]/$1/; ++ s/^([^ ][^ ]* [^ ][^ ]* [^ ][^ ]*)\.[Tt][Tt][FfCc]/$1/; ++ s/$/ %/; ++ s/^(([^ ]*).*)/$1$2/; ++ s/^([^ ][^ ]* ([^ ][^ ]*) !*([^ ][^ ]*).*)/$1 $3-$2/; ++ s/^(.* -e ([.0-9-][.0-9-]*).*)/$1 "$2 ExtendFont"/; ++ s/^(.* -s ([.0-9-][.0-9-]*).*)/$1 "$2 SlantFont"/; ++ s/.*%//; ++ push(@d, $_); ++ } ++ return @d ++} ++ ++sub get_cfg { ++ my ($v) = @_; ++ if (defined($alldata->{'merged'}{'setting'}{$v})) { ++ return ( $alldata->{'merged'}{'setting'}{$v}{'val'}, ++ $alldata->{'merged'}{'setting'}{$v}{'origin'} ); ++ } else { ++ return ($settings{$v}{'default'}, "default"); + } + } + +-############################################################################### +-# locateMap (file ...) +-# apply kpsewhich with format 'map' +-# +-sub locateMap { +- my @maps = @_; +- return @maps if ($#maps < 0); ++sub mkMaps { ++ my $logfile; + +- my @files = `kpsewhich --format=map @maps`; +- chomp @files; ++ $logfile = "$TEXMFVAR/web2c/updmap.log"; + +- foreach my $map (@maps) { +- push @missing, $map if (! grep /\/$map(\.map)?$/, @files); ++ if (! $opts{'dry-run'}) { ++ mkdirhier("$TEXMFVAR/web2c"); ++ open LOG, ">$logfile" ++ or die "$prg: Can't open log file \"$logfile\": $!"; ++ print LOG &version(); ++ printf LOG "%s\n\n", scalar localtime(); ++ print LOG "Using the following config files:\n"; ++ for (@{$opts{'cnffile'}}) { ++ print LOG " $_\n"; ++ } + } +- +- if (wantarray) { +- return @files; +- } else { +- return $files[0]; ++ sub print_and_log { ++ my $str=shift; ++ print $str if !$opts{'quiet'}; ++ print LOG $str unless $opts{'dry-run'}; ++ } ++ sub only_log { ++ print LOG shift unless $opts{'dry-run'}; + } +-} + +- +-############################################################################### +-# cfgval(variable) +-# read variable ($1) from config file +-# +-sub cfgval { +- my ($variable) = @_; +- my $value; ++ my ($mode, $mode_origin) = get_cfg('LW35'); ++ my ($dvipsPreferOutline, $dvipsPreferOutline_origin) = ++ get_cfg('dvipsPreferOutline'); ++ my ($dvipsDownloadBase35, $dvipsDownloadBase35_origin) = ++ get_cfg('dvipsDownloadBase35'); ++ my ($pdftexDownloadBase14, $pdftexDownloadBase14_origin) = ++ get_cfg('pdftexDownloadBase14'); ++ my ($pxdviUse, $pxdviUse_origin) = get_cfg('pxdviUse'); ++ my ($kanjiEmbed, $kanjiEmbed_origin) = get_cfg('kanjiEmbed'); ++ ++ print_and_log ("\n$prg is creating new map files" ++ . "\nusing the following configuration:" ++ . "\n LW35 font names : " ++ . "$mode ($mode_origin)" ++ . "\n prefer outlines : " ++ . "$dvipsPreferOutline ($dvipsPreferOutline_origin)" ++ . "\n texhash enabled : " ++ . ($opts{'nohash'} ? "false" : "true") ++ . "\n download standard fonts (dvips) : " ++ . "$dvipsDownloadBase35 ($dvipsDownloadBase35_origin)" ++ . "\n download standard fonts (pdftex) : " ++ . "$pdftexDownloadBase14 ($pdftexDownloadBase14_origin)" ++ . "\n kanjiEmbed replacement string : " ++ . "$kanjiEmbed ($kanjiEmbed_origin)" ++ . "\n create a mapfile for pxdvi : " ++ . "$pxdviUse ($pxdviUse_origin)" ++ . "\n\n"); + +- if ($#cfg < 0) { +- open FILE, "<$cnfFile" or die "$0: can't open configuration file $cnfFile: $!"; +- while (<FILE>) { +- s/\s*$//; # strip trailing spaces +- push @cfg, $_; ++ print_and_log ("Scanning for LW35 support files"); ++ my $dvips35 = $alldata->{'maps'}{"dvips35.map"}{'fullpath'}; ++ my $pdftex35 = $alldata->{'maps'}{"pdftex35.map"}{'fullpath'}; ++ my $ps2pk35 = $alldata->{'maps'}{"ps2pk35.map"}{'fullpath'}; ++ my $LW35 = "\n$dvips35\n$pdftex35\n$ps2pk35\n\n"; ++ only_log ("\n"); ++ only_log ($LW35); ++ print_and_log (" [ 3 files]\n"); ++ only_log ("\n"); ++ ++ print_and_log ("Scanning for MixedMap entries"); ++ my @mixedmaps; ++ my @notmixedmaps; ++ my @kanjimaps; ++ for my $m (keys %{$alldata->{'maps'}}) { ++ my $origin = $alldata->{'maps'}{$m}{'origin'}; ++ next if !defined($origin); ++ next if ($alldata->{'updmap'}{$origin}{'maps'}{$m}{'status'} eq "disabled"); ++ push @mixedmaps, $m ++ if ($alldata->{'updmap'}{$origin}{'maps'}{$m}{'type'} eq "MixedMap"); ++ push @notmixedmaps, $m ++ if ($alldata->{'updmap'}{$origin}{'maps'}{$m}{'type'} eq "Map"); ++ push @kanjimaps, $m ++ if ($alldata->{'updmap'}{$origin}{'maps'}{$m}{'type'} eq "KanjiMap"); ++ } ++ ++ @mixedmaps = sort @mixedmaps; ++ @notmixedmaps = sort @notmixedmaps; ++ @kanjimaps = sort @kanjimaps; ++ only_log("\n"); ++ foreach my $m (sort @mixedmaps) { ++ if (defined($alldata->{'maps'}{$m}{'fullpath'})) { ++ only_log($alldata->{'maps'}{$m}{'fullpath'} . "\n"); ++ } else { ++ only_log("$m (full path not set?)\n"); + } +- close FILE; +- chomp (@cfg); + } +- for my $line (@cfg) { +- if ($line =~ m/^\s*${variable}[\s=]+(.*)\s*$/) { +- $value = $1; +- if ($value =~ m/^(true|yes|t|y|1)$/) { +- $value = 1; +- } +- elsif ($value =~ m/^(false|no|f|n|0)$/) { +- $value = 0; +- } +- last; ++ only_log("\n"); ++ print_and_log (sprintf(" [%3d files]\n", scalar @mixedmaps)); ++ only_log("\n"); ++ ++ print_and_log ("Scanning for KanjiMap entries"); ++ only_log("\n"); ++ foreach my $m (@kanjimaps) { ++ if (defined($alldata->{'maps'}{$m}{'fullpath'})) { ++ only_log($alldata->{'maps'}{$m}{'fullpath'} . "\n"); ++ } else { ++ only_log("$m (full path not set?)\n"); + } + } +- return $value; +-} +- +-############################################################################### +-# configReplace(file, pattern, line) +-# The first line in file that matches pattern gets replaced by line. +-# line will be added at the end of the file if pattern does not match. +-# +-sub configReplace { +- my ($file, $pat, $line) = @_; +- my @lines = &getLines($file); +- my $found = 0; +- map { +- if (/$pat/) { +- $found = 1; $_ = $line; +- } +- } @lines; +- if (! $found) { +- push @lines, $line; +- } +- &writeLines($file, @lines); +-} +- +-############################################################################### +-# setOption (@options) +-# parse @options for "key=value" (one element of @options) +-# or "key", "value" (two elements of @options) pairs. +-# (These were the values provided to --setoption.) +-# +-sub setOptions { +- my (@options) = @_; +- for (my $i = 0; $i < @options; $i++) { +- my $o = $options[$i]; +- +- my ($key,$val); +- if ($o =~ /=/) { +- ($key,$val) = split (/=/, $o, 2); ++ only_log("\n"); ++ print_and_log (sprintf(" [%3d files]\n", scalar @kanjimaps)); ++ only_log("\n"); ++ ++ print_and_log ("Scanning for Map entries"); ++ only_log("\n"); ++ foreach my $m (@notmixedmaps) { ++ if (defined($alldata->{'maps'}{$m}{'fullpath'})) { ++ only_log($alldata->{'maps'}{$m}{'fullpath'} . "\n"); + } else { +- $key = $o; +- die "$0: no value for --setoption $key, goodbye.\n" +- if $i + 1 >= @options; +- $val = $options[$i + 1]; +- $i++; ++ only_log("$m (full path not set?)\n"); + } +- +- die "$0: unexpected empty key or val for options (@options), goodbye.\n" +- if !$key || !$val; +- &setOption ($key, $val); + } +-} +- +-############################################################################### +-# setOption (option, value) +-# sets option to value in the config file (replacing the existing setting +-# or by adding a new line to the config file). +-# +-sub setOption { +- my ($opt, $val) = @_; ++ only_log("\n"); ++ print_and_log (sprintf(" [%3d files]\n\n", scalar @notmixedmaps)); ++ only_log("\n"); + +- if ($opt eq "LW35") { +- if ($val !~ m/^(URWkb|URW|ADOBE|ADOBEkb)$/) { +- die "$0: Invalid value $val for option $opt; try --help.\n"; +- } +- } elsif ($opt =~ +-m/^(dvipsPreferOutline|dvipsDownloadBase35|(pdftex|dvipdfm)DownloadBase14|pxdviUse)$/) { +- if ($val !~ m/^(true|false)$/) { +- die "$0: Invalid value $val for option $opt; should be \"true\" or \"false\".\n"; +- } +- } elsif ($opt eq "kanjiEmbed"){ +- # do nothing +- } else { +- die "$0: Unsupported option $opt (value given: $val).\n"; ++ # Create psfonts_t1.map, psfonts_pk.map, ps2pk.map and pdftex.map: ++ my $dvipsoutputdir = $opts{'dvipsoutputdir'}; ++ my $pdftexoutputdir = $opts{'pdftexoutputdir'}; ++ my $dvipdfmoutputdir = $opts{'dvipdfmoutputdir'}; ++ my $pxdvioutputdir = $opts{'pxdvioutputdir'}; ++ if (!$opts{'dry-run'}) { ++ my @managed_files = ("$dvipsoutputdir/download35.map", ++ "$dvipsoutputdir/builtin35.map", ++ "$dvipsoutputdir/psfonts_t1.map", ++ "$dvipsoutputdir/psfonts_pk.map", ++ "$pdftexoutputdir/pdftex_dl14.map", ++ "$pdftexoutputdir/pdftex_ndl14.map", ++ "$dvipdfmoutputdir/kanjix.map", ++ "$dvipsoutputdir/ps2pk.map"); ++ push @managed_files, "$pxdvioutputdir/xdvi-ptex.map" ++ if ($pxdviUse eq "true"); ++ for my $file (@managed_files) { ++ open FILE, ">$file"; ++ print FILE "% $file:\ ++% maintained by updmap[-sys] (multi).\ ++% Don't change this file directly. Use updmap[-sys] instead.\ ++% See the updmap documentation.\ ++% A log of the run that created this file is available here:\ ++% $logfile\ ++"; ++ close FILE; ++ } + } + +- # silently accept this old option name, just in case. +- return if $opt eq "dvipdfmDownloadBase14"; +- +- #print "Setting option $opt to $val...\n" if !$quiet; +- &configReplace("$cnfFile", "^" . "$opt" . "\\s", "$opt $val"); +-} ++ my @kanjimaps_fonts = getFonts(@kanjimaps); ++ @kanjimaps_fonts = &normalizeLines(@kanjimaps_fonts); ++ my @ps2pk_fonts = getFonts('-all', "ps2pk35.map"); ++ my @dvips35_fonts = getFonts('-all', "dvips35.map"); ++ my @pdftex35_fonts = getFonts('-all', "pdftex35.map"); ++ my @mixedmaps_fonts = getFonts(@mixedmaps); ++ my @notmixedmaps_fonts = getFonts(@notmixedmaps); + +-############################################################################### +-# showOptions(item) +-# show Options for an item +-# +-sub showOptions { +- foreach my $item (@_) { +- if ($item eq "LW35") { +- print "URWkb URW ADOBE ADOBEkb\n"; +- } +- elsif ($item =~ +-m/(dvipsPreferOutline|(dvipdfm|pdftex)DownloadBase14|dvipsDownloadBase35|pxdviUse)/) { +- print "true false\n"; +- } +- elsif ($item eq "kanjiEmbed") { +- print "(any string)\n"; +- } +- else { +- print "Unknown item \"$item\"; should be one of LW35, dvipsPreferOutline,\n" +- . " dvipsDownloadBase35, pdftexDownloadBase14, pxdviUse or kanjiEmbed\n"; +- } ++ print "Generating output for dvipdfm...\n" if !$opts{'quiet'}; ++ &writeLines(">$dvipdfmoutputdir/kanjix.map", @kanjimaps_fonts); ++ ++ if ($pxdviUse eq "true") { ++ # we use the very same data as for kanjix.map, but generate ++ # a different file, so that in case a user wants to hand-craft it ++ print "Generating output for pxdvi...\n" if !$opts{'quiet'}; ++ &writeLines(">$pxdvioutputdir/xdvi-ptex.map", @kanjimaps_fonts); + } +- exit 0 +-} + +- +-############################################################################### +-# enableMap (type, map) +-# enables an entry in the config file for map with a given type. +-# +-sub enableMap { +- my ($type, $map) = @_; + +- if ($type !~ m/^(Map|MixedMap|KanjiMap)$/) { +- die "$0: Invalid mapType $type\n"; ++ print "Generating output for ps2pk...\n" if !$opts{'quiet'}; ++ my @ps2pk_map; ++ push @ps2pk_map, "% ps2pk35.map"; ++ push @ps2pk_map, transLW35($mode, @ps2pk_fonts); ++ push @ps2pk_map, @mixedmaps_fonts; ++ push @ps2pk_map, @notmixedmaps_fonts; ++ &writeLines(">$dvipsoutputdir/ps2pk.map", ++ normalizeLines(@ps2pk_map)); ++ ++ print "Generating output for dvips...\n" if !$opts{'quiet'}; ++ my @download35_map; ++ push @download35_map, "% ps2pk35.map"; ++ push @download35_map, transLW35($mode, @ps2pk_fonts); ++ &writeLines(">$dvipsoutputdir/download35.map", ++ normalizeLines(@download35_map)); ++ ++ my @builtin35_map; ++ push @builtin35_map, "% dvips35.map"; ++ push @builtin35_map, transLW35($mode, @dvips35_fonts); ++ &writeLines(">$dvipsoutputdir/builtin35.map", ++ normalizeLines(@builtin35_map)); ++ ++ my @dftdvips_fonts = ($dvipsDownloadBase35 ? @ps2pk_fonts : @dvips35_fonts); ++ ++ my @psfonts_t1_map; ++ if ($dvipsDownloadBase35) { ++ push @psfonts_t1_map, "% ps2pk35.map", ++ @dftdvips_fonts = @ps2pk_fonts; ++ } else { ++ push @psfonts_t1_map, "% dvips35.map"; ++ @dftdvips_fonts = @dvips35_fonts; + } +- # a map can only have one type, so we carefully disable everything +- # about map here: +- &disableMap("$map"); ++ push @psfonts_t1_map, transLW35($mode, @dftdvips_fonts); ++ my @tmpkanji2 = cidx2dvips(\@kanjimaps_fonts); ++ push @psfonts_t1_map, @mixedmaps_fonts; ++ push @psfonts_t1_map, @notmixedmaps_fonts; ++ push @psfonts_t1_map, @tmpkanji2; ++ &writeLines(">$dvipsoutputdir/psfonts_t1.map", ++ normalizeLines(@psfonts_t1_map)); + +- # now enable with the right type: +- &configReplace("$cnfFile", "^#!\\s*" . "$type" . "\\s*$map", "$type $map"); +-} ++ my @psfonts_pk_map; ++ push @psfonts_pk_map, transLW35($mode, @dftdvips_fonts); ++ push @psfonts_pk_map, @notmixedmaps_fonts; ++ push @psfonts_pk_map, @tmpkanji2; ++ &writeLines(">$dvipsoutputdir/psfonts_pk.map", ++ normalizeLines(@psfonts_pk_map)); + +-############################################################################### +-# disableMap (map) +-# disables map in config file (any type) +-# +-sub disableMap { +- my ($map) = @_; +- my %count = (); +- my $type; ++ print "Generating output for pdftex...\n" if !$opts{'quiet'}; ++ # remove PaintType due to Sebastian's request ++ my @pdftexmaps_ndl; ++ push @pdftexmaps_ndl, "% pdftex35.map"; ++ push @pdftexmaps_ndl, transLW35($mode, @pdftex35_fonts); ++ push @pdftexmaps_ndl, @mixedmaps_fonts; ++ push @pdftexmaps_ndl, @notmixedmaps_fonts; ++ @pdftexmaps_ndl = grep { $_ !~ m/(^%\|PaintType)/ } @pdftexmaps_ndl; ++ ++ my @pdftexmaps_dl; ++ push @pdftexmaps_dl, "% ps2pk35.map"; ++ push @pdftexmaps_dl, transLW35($mode, @ps2pk_fonts); ++ push @pdftexmaps_dl, @mixedmaps_fonts; ++ push @pdftexmaps_dl, @notmixedmaps_fonts; ++ @pdftexmaps_dl = grep { $_ !~ m/(^%\|PaintType)/ } @pdftexmaps_dl; + +- my @mapType = grep { +- my @fields = split; +- if ($fields[0] and $fields[0] =~ /^(MixedMap|Map|KanjiMap)$/ +- and $fields[1] eq $map and ++$count{$fields[0]}) { +- $_ = $fields[0]; +- } +- else { +- $_ = ''; +- } +- } &getLines($cnfFile); ++ my @pdftex_ndl14_map = @pdftexmaps_ndl; ++ @pdftex_ndl14_map = &normalizeLines(@pdftex_ndl14_map); ++ @pdftex_ndl14_map = &to_pdftex(@pdftex_ndl14_map); ++ &writeLines(">$pdftexoutputdir/pdftex_ndl14.map", @pdftex_ndl14_map); + +- foreach $type (@mapType) { +- &configReplace("$cnfFile", "^$type" . "\\s*$map", "#! $type $map"); +- } +-} ++ my @pdftex_dl14_map = @pdftexmaps_dl; ++ @pdftex_dl14_map = &normalizeLines(@pdftex_dl14_map); ++ @pdftex_dl14_map = &to_pdftex(@pdftex_dl14_map); ++ &writeLines(">$pdftexoutputdir/pdftex_dl14.map", @pdftex_dl14_map); + +-############################################################################### +-# setupDestDir() +-# find an output directory if none specified on cmd line. First choice is +-# $TEXMFVAR/fonts/map/updmap (if TEXMFVAR is set), next is relative to +-# config file location. Fallback is $TEXMFMAIN/fonts/map/updmap. +-# +-sub setupOutputDir { +- my($od, $driver) = @_; ++ our $link = &setupSymlinks($dvipsPreferOutline, $dvipsoutputdir, $pdftexDownloadBase14, $pdftexoutputdir); ++ ++ print_and_log ("\nFiles generated:\n"); ++ sub dir { ++ my ($d, $f, $target)=@_; ++ our $link; ++ if (-e "$d/$f") { ++ my @stat=lstat("$d/$f"); ++ my ($s,$m,$h,$D,$M,$Y)=localtime($stat[9]); ++ my $timestamp=sprintf ("%04d-%02d-%02d %02d:%02d:%02d", ++ $Y+1900, $M+1, $D, $h, $m, $s); ++ my $date=sprintf "%12d %s %s", $stat[7], $timestamp, $f; ++ print_and_log ($date); + +- if (!$od) { +- my $rel = "fonts/map/$driver/updmap"; +- my $tf; +- # Try TEXMFVAR tree. Use it if variable is set and $rel can +- # be written. +- chomp($tf = `kpsewhich --var-value=TEXMFVAR`); +- if ($tf) { +- &mkdirhier("$tf/$rel"); +- if (! -w "$tf/$rel") { +- die "$0: Directory \"$tf/$rel\" isn't writable.\n"; ++ if (-l "$d/$f") { ++ my $lnk=sprintf " -> %s\n", readlink ("$d/$f"); ++ print_and_log ($lnk); ++ } elsif ($f eq $target) { ++ if (&files_are_identical("$d/$f", "$d/" . $link->{$target})) { ++ print_and_log (" = $link->{$target}\n"); ++ } else { ++ print_and_log (" = ?????\n"); # This shouldn't happen. ++ } ++ } else { ++ print_and_log ("\n"); + } ++ } else { ++ print STDERR "Warning: File $d/$f doesn't exist.\n"; ++ print LOG "Warning: File $d/$f doesn't exist.\n" ++ unless $opts{'dry-run'}; + } +- $od = "$tf/$rel"; + } +- &mkdirhier($od); +- print "$driver output dir: \"$od\"\n" if !$quiet; +- return $od; +-} +- +-sub setupDestDir { +- $dvipsoutputdir = &setupOutputDir($dvipsoutputdir, "dvips"); +- $pdftexoutputdir = &setupOutputDir($pdftexoutputdir, "pdftex"); +- $dvipdfmoutputdir = &setupOutputDir($dvipdfmoutputdir, "dvipdfm"); +- $pxdvioutputdir = &setupOutputDir($pxdvioutputdir, "pxdvi"); +-} + +-############################################################################### +-# setupCfgFile() +-# find config file if none specified on cmd line. +-# +-sub setupCfgFile { +- if (! $cnfFile) { +- my $tf = `kpsewhich --var-value=TEXMFCONFIG`; +- chomp($tf); +- if ($tf && ! -f "$tf/web2c/$cnfFileShort") { +- &mkdirhier("$tf/web2c") if (! -d "$tf/web2c"); +- if (-d "$tf/web2c" && -w "$tf/web2c") { +- unlink "$tf/web2c/$cnfFileShort"; +- my $original_cfg=`kpsewhich updmap.cfg`; +- chomp($original_cfg); +- print("copy $original_cfg => $tf/web2c/$cnfFileShort\n") if !$quiet; +- $newcnf="$tf/web2c/$cnfFileShort"; +- ©File("$original_cfg", "$tf/web2c/$cnfFileShort"); +- $updLSR->{add}("$tf/web2c/$cnfFileShort"); +- } +- } +- $cnfFile = "$tf/web2c/updmap.cfg"; +- if (-s $cnfFile) { +- print "Config file: \"$cnfFile\"\n" if !$quiet; +- } else { +- die "$0: Config file updmap.cfg not found.\n"; ++ my $d; ++ $d = "$dvipsoutputdir"; ++ print_and_log(" $d:\n"); ++ foreach my $f ('builtin35.map', 'download35.map', 'psfonts_pk.map', ++ 'psfonts_t1.map', 'ps2pk.map', 'psfonts.map') { ++ dir ($d, $f, 'psfonts.map'); ++ $updLSR->{add}("$d/$f") unless $opts{'dry-run'}; ++ } ++ $d = "$pdftexoutputdir"; ++ print_and_log(" $d:\n"); ++ foreach my $f ('pdftex_dl14.map', 'pdftex_ndl14.map', 'pdftex.map') { ++ dir ($d, $f, 'pdftex.map'); ++ $updLSR->{add}("$d/$f") unless $opts{'dry-run'}; ++ } ++ $d="$dvipdfmoutputdir"; ++ print_and_log(" $d:\n"); ++ foreach my $f ('kanjix.map') { ++ dir ($d, $f, ''); ++ $updLSR->{add}("$d/$f") unless $opts{'dry-run'}; ++ } ++ if ($pxdviUse eq "true") { ++ $d="$pxdvioutputdir"; ++ print_and_log(" $d:\n"); ++ foreach my $f ('xdvi-ptex.map') { ++ dir ($d, $f, ''); ++ $updLSR->{add}("$d/$f") unless $opts{'dry-run'}; + } + } ++ close LOG unless $opts{'dry-run'}; ++ print "\nTranscript written on \"$logfile\".\n" if !$opts{'quiet'}; ++ + } + +-############################################################################### +-# catMaps(regex) +-# filter config file by regex for map lines and extract the map filenames. +-# These are then looked up (by kpsewhich in locateMap) and the content of +-# all map files is send to stdout. +-# +-sub catMaps { +- my ($map) = @_; +- my %count = ( ); +- my @maps = grep { $_ =~ m/$map/ } @cfg; +- map{ +- $_ =~ s/\#.*//; +- $_ =~ s/\@kanjiEmbed@/$kanjiEmbed/; +- $_ =~ s/\s*([^\s]*)\s*([^\s]*)/$2/; +- } @maps; +- @maps = sort(@maps); +- @maps = grep { ++$count{$_} < 2; } @maps; + +- @maps = &locateMap(@maps); +- return @maps; ++sub locateMap { ++ my $map = shift; ++ my $ret = `kpsewhich --format=map $map`; ++ chomp($ret); ++ return $ret; + } + +-############################################################################### +-# listMaps() +-# list all maps mentioned in the config file +-# +-sub listMaps { +- my $what=shift; +- my @mapfiles; +- my @paths; +- $kanjiEmbed = &cfgval("kanjiEmbed"); +- $kanjiEmbed = "noEmbed" unless (defined $kanjiEmbed); +- +- my @lines = grep { +- if ($what eq 'sync') { +- $_ =~ m/^(Mixed|Kanji)?Map/ ++sub processOptions { ++ # first process the stupid setoption= s@{1,2} which is not accepted ++ # furthermore, try to work around missing s{1,2} support in older perls ++ my $oldconfig = Getopt::Long::Configure(qw(pass_through)); ++ our @setoptions; ++ our @enable; ++ sub read_one_or_two { ++ my ($opt, $val) = @_; ++ our @setoptions; ++ our @enable; ++ # check if = occirs in $val, if not, get the next argument ++ if ($val =~ m/=/) { ++ if ($opt eq "setoption") { ++ push @setoptions, $val; ++ } else { ++ push @enable, $val; ++ } + } else { +- $_ =~ m/^(\#! *)?(Mixed|Kanji)?Map/ +- } +- } &getLines($cnfFile); +- +- if ($what eq 'list') { +- # --listmaps +- map { print "$_\n"; } @lines; +- } else { +- map { $_ =~ s/\@kanjiEmbed@/$kanjiEmbed/ } @lines; +- @mapfiles=grep { $_ =~ s/^(\#! *)?(Mixed|Kanji)?Map\s+// } @lines; +- @paths=&locateMap(@mapfiles); +- +- if ($what eq 'avail') { +- # --listavailablemaps +- map { +- my $entry="$_"; +- # that was disabled, but I don't understand why (NP) +- print "$entry\n" if (grep { $_ =~ m/\/$entry/ } @paths); +- } @lines; +- } elsif ($what eq 'sync') { +- # --syncwithtrees +- map { +- my $entry="$_"; +- unless (grep { $_ =~ m/\/$entry/ } @paths) { +- &disableMap($entry); +- print " $entry disabled\n" if !$quiet; +- } +- } @lines; ++ my $vv = shift @ARGV; ++ die "Try \"$prg --help\" for more information.\n" ++ if !defined($vv); ++ if ($opt eq "setoption") { ++ push @setoptions, "$val=$vv"; ++ } else { ++ push @enable, "$val=$vv"; ++ } + } + } +-} ++ GetOptions("setoption=s@" => \&read_one_or_two, ++ "enable=s@" => \&read_one_or_two) or ++ die "Try \"$prg --help\" for more information.\n"; + +-############################################################################### +-# normalizeLines() +-# remove comments, whitespace is exactly one space, no empty lines, +-# no whitespace at end of line, one space before and after " +-# +-sub normalizeLines { +- my @lines = @_; +- my %count = (); ++ @{$opts{'setoption'}} = @setoptions if (@setoptions); ++ @{$opts{'enable'}} = @enable if (@enable); + +- @lines = grep { $_ !~ m/^[*#;%]/ } @lines; +- map {$_ =~ s/\s+/ /gx } @lines; +- @lines = grep { $_ !~ m/^\s*$/x } @lines; +- map { $_ =~ s/\s$//x ; +- $_ =~ s/\s*\"\s*/ \" /gx; +- $_ =~ s/\" ([^\"]*) \"/\"$1\"/gx; +- } @lines; ++ Getopt::Long::Configure($oldconfig); + +- @lines = grep {++$count{$_} < 2 } (sort @lines); ++ # now continue with normal option handling + +- return @lines; ++ GetOptions(\%opts, @cmdline_options) or ++ die "Try \"$prg --help\" for more information.\n"; + } + +-############################################################################### +-# to_pdftex() +-# if $pdftexStripEnc is set, strip "PS_Encoding_Name ReEncodeFont" +-# from map entries; they are ignored by pdftex. But since the sh +-# incarnation of updmap included them, and we want to minimize +-# differences, this is not done by default. +-# +-sub to_pdftex { +- return @_ unless $pdftexStripEnc; +- my @in = @_; +- my @out; +- foreach my $line (@in) { +- if ($line =~ /^(.*\s+)(\S+\s+ReEncodeFont\s)(.*)/) { +- $line = "$1$3"; +- $line =~ s/\s+\"\s+\"\s+/ /; ++# determines the output dir for driver from cmd line, or if not given ++# from TEXMFVAR ++sub setupOutputDir { ++ my $driver = shift; ++ if (!$opts{$driver . "outputdir"}) { ++ if ($opts{'outputdir'}) { ++ $opts{$driver . "outputdir"} = $opts{'outputdir'}; ++ } else { ++ $opts{$driver . "outputdir"} = "$TEXMFVAR/fonts/map/$driver/updmap"; + } +- push @out, $line; + } +- return @out; +-} +- +-############################################################################### +-# cidx2dvips() +-# reads from stdin, writes to stdout. It transforms "cid-x"-like syntax into +-# "dvips"-like syntax. +-############################################################################### +-sub cidx2dvips { +- my ($s) = @_; +- my @d; +- foreach (@$s) { +- s/,BoldItalic/ -s .3/; +- s/,Bold//; +- s/,Italic/ -s .3/; +- s/\s\s*/ /g; +- if ($_ =~ /.*[@\:\/,]/) {next;} +- elsif ($_ =~ /^[^ ][^ ]* unicode /) {next;} +- s/^([^ ][^ ]* [^ ][^ ]* [^ ][^ ]*)\.[Oo][Tt][Ff]/$1/; +- s/^([^ ][^ ]* [^ ][^ ]* [^ ][^ ]*)\.[Tt][Tt][FfCc]/$1/; +- s/$/ %/; +- s/^(([^ ]*).*)/$1$2/; +- s/^([^ ][^ ]* ([^ ][^ ]*) !*([^ ][^ ]*).*)/$1 $3-$2/; +- s/^(.* -e ([.0-9-][.0-9-]*).*)/$1 "$2 ExtendFont"/; +- s/^(.* -s ([.0-9-][.0-9-]*).*)/$1 "$2 SlantFont"/; +- s/.*%//; +- push(@d, $_); ++ my $od = $opts{$driver . "outputdir"}; ++ if (!$opts{"dry-run"}) { ++ &mkdirhier($od); ++ if (! -w $od) { ++ die "$prg: Directory \"$od\" isn't writable: $!"; + } +- return @d ++ } ++ print "$driver output dir: \"$od\"\n" if !$opts{'quiet'}; ++ return $od; + } + +- + ############################################################################### +-# mkMaps() +-# the main task of this script: create the output files ++# setOption (@options) ++# parse @options for "key=value" (one element of @options) ++# we can only have "key=value" since that is the way it was prepared ++# in process_options ++# (These were the values provided to --setoption.) + # +-sub mkMaps { +- my @lines; +- my $logfile; ++sub setOptions { ++ my (@options) = @_; ++ for (my $i = 0; $i < @options; $i++) { ++ my $o = $options[$i]; + +- $cache=1; ++ my ($key,$val) = split (/=/, $o, 2); + +- if (! $dry_run) { +- my $TEXMFVAR = `kpsewhich --var-value=TEXMFVAR`; +- chomp($TEXMFVAR); +- $logfile = "$TEXMFVAR/web2c/updmap.log"; +- mkdirhier "$TEXMFVAR/web2c"; +- open LOG, ">$logfile" +- or die "$0: Can't open log file \"$logfile\": $!"; +- $writelog=1; +- print LOG &version(); +- printf LOG "%s\n\n", scalar localtime(); +- print LOG "Using config file \"$cnfFile\".\n"; +- } +- sub wlog () { +- my $str=shift; +- if ($dry_run) { +- print $str; +- } else { +- print $str if !$quiet; +- print LOG $str; +- } ++ die "$prg: unexpected empty key or val for options (@options), goodbye.\n" ++ if !$key || !$val; ++ &setOption ($key, $val); + } +- sub newline() { +- if ($dry_run) { +- print "\n"; ++ return save_updmap($alldata->{'changes_config'}); ++} ++ ++sub enable_disable_maps { ++ my (@what) = @_; ++ my $tc = $alldata->{'changes_config'}; ++ die "$prg: top config file $tc has not been read." ++ if (!defined($alldata->{'updmap'}{$tc})); ++ my $changed = 0; ++ for my $w (@what) { ++ if ($w =~ m/=/) { ++ # this is --enable MapType=MapName ++ my ($type, $map) = split ('=', $w); ++ enable_map($tc, $type, $map); + } else { +- print LOG "\n"; ++ # this is --disable MapName ++ disable_map($tc, $w); + } + } ++ return save_updmap($tc); ++} + +- $mode = &cfgval("LW35"); +- $mode = "URWkb" unless (defined $mode); +- +- $dvipsPreferOutline = &cfgval("dvipsPreferOutline"); +- $dvipsPreferOutline = 1 unless (defined $dvipsPreferOutline); +- +- $dvipsDownloadBase35 = &cfgval("dvipsDownloadBase35"); +- $dvipsDownloadBase35 = 1 unless (defined $dvipsDownloadBase35); +- +- $pdftexDownloadBase14 = &cfgval("pdftexDownloadBase14"); +- $pdftexDownloadBase14 = 1 unless (defined $pdftexDownloadBase14); +- +- $kanjiEmbed = &cfgval("kanjiEmbed"); +- $kanjiEmbed = "noEmbed" unless (defined $kanjiEmbed); +- +- $pxdviUse = &cfgval("pxdviUse"); +- $pxdviUse = 0 unless (defined $pxdviUse); ++sub enable_map { ++ my ($tc, $type, $map) = @_; + +- &wlog ("\n$0 " +- . ($dry_run ? "would create" : "is creating") . " new map files" +- . "\nusing the following configuration:" +- . "\n LW35 font names : " +- . $mode +- . "\n prefer outlines : " +- . ($dvipsPreferOutline ? "true" : "false") +- . "\n texhash enabled : " +- . ($nohash ? "false" : "true") +- . "\n download standard fonts (dvips) : " +- . ($dvipsDownloadBase35 ? "true" : "false") +- . "\n download standard fonts (pdftex) : " +- . ($pdftexDownloadBase14 ? "true" : "false") +- . "\n create a mapfile for pxdvi : " +- . ($pxdviUse ? "true" : "false") +- . "\n\n"); ++ die "$prg: invalid mapType $type" if ($type !~ m/^(Map|MixedMap|KanjiMap)$/); + +- &wlog ("Scanning for LW35 support files"); +- $dvips35 = &locateMap("dvips35.map"); +- $pdftex35 = &locateMap("pdftex35.map"); +- $ps2pk35 = &locateMap("ps2pk35.map"); +- my $LW35 = "\n$dvips35\n$pdftex35\n$ps2pk35\n\n"; +- if ($dry_run) { +- print $LW35; ++ if (defined($alldata->{'updmap'}{$tc}{'maps'}{$map})) { ++ # the map data has already been read in, no special precautions necessary ++ if (($alldata->{'updmap'}{$tc}{'maps'}{$map}{'status'} eq "enabled") && ++ ($alldata->{'updmap'}{$tc}{'maps'}{$map}{'type'} eq $type)) { ++ # nothing to do here ... be happy! ++ return; ++ } else { ++ $alldata->{'updmap'}{$tc}{'maps'}{$map}{'status'} = "enabled"; ++ $alldata->{'updmap'}{$tc}{'maps'}{$map}{'type'} = $type; ++ $alldata->{'maps'}{$map}{'origin'} = $tc; ++ $alldata->{'maps'}{$map}{'status'} = "enabled"; ++ $alldata->{'updmap'}{$tc}{'changed'} = 1; ++ } + } else { +- print LOG $LW35; ++ # add a new map file! ++ $alldata->{'updmap'}{$tc}{'maps'}{$map}{'type'} = $type; ++ $alldata->{'updmap'}{$tc}{'maps'}{$map}{'status'} = "enabled"; ++ $alldata->{'updmap'}{$tc}{'maps'}{$map}{'line'} = -1; ++ $alldata->{'updmap'}{$tc}{'changed'} = 1; ++ $alldata->{'maps'}{$map}{'origin'} = $tc; ++ $alldata->{'maps'}{$map}{'status'} = "enabled"; + } +- printf " [%3d files]\n", 3 unless ($quiet || $dry_run); ++} + +- &wlog ("Scanning for MixedMap entries"); +- &newline; +- my @tmp1 = &catMaps('^MixedMap'); +- foreach my $line (@tmp1) { +- if ($dry_run) { +- print "$line\n"; ++sub disable_map { ++ my ($tc, $map) = @_; ++ ++ if (defined($alldata->{'updmap'}{$tc}{'maps'}{$map})) { ++ # the map data has already been read in, no special precautions necessary ++ if ($alldata->{'updmap'}{$tc}{'maps'}{$map}{'status'} eq "disabled") { ++ # nothing to do here ... be happy! + } else { +- print LOG "$line\n"; ++ $alldata->{'updmap'}{$tc}{'maps'}{$map}{'status'} = "disabled"; ++ $alldata->{'maps'}{$map}{'origin'} = $tc; ++ $alldata->{'maps'}{$map}{'status'} = "disabled"; ++ $alldata->{'updmap'}{$tc}{'changed'} = 1; + } ++ } else { ++ # disable a Map type that might be activated in a lower ranked updmap.cfg ++ if (!defined($alldata->{'maps'}{$map})) { ++ warning("Map is not present anywhere, why should I disable it?\n"); ++ return; ++ } ++ my $orig = $alldata->{'maps'}{$map}{'origin'}; ++ # add a new entry to the top level where we disable it ++ # copy over the type from the last entry ++ $alldata->{'updmap'}{$tc}{'maps'}{$map}{'type'} = ++ $alldata->{'updmap'}{$orig}{'maps'}{$map}{'type'}; ++ $alldata->{'updmap'}{$tc}{'maps'}{$map}{'status'} = "disabled"; ++ $alldata->{'updmap'}{$tc}{'maps'}{$map}{'line'} = -1; ++ # rewrite the origin ++ $alldata->{'maps'}{$map}{'origin'} = $tc; ++ $alldata->{'maps'}{$map}{'status'} = "disabled"; ++ # go on for writing ++ $alldata->{'updmap'}{$tc}{'changed'} = 1; + } +- &newline; +- printf " [%3d files]\n", scalar @tmp1 +- unless ($quiet || $dry_run); +- +- &wlog ("Scanning for KanjiMap entries"); +- &newline; +- my @tmpkanji0 = &catMaps('^KanjiMap'); +- foreach my $line (@tmpkanji0) { +- if ($dry_run) { +- print "$line\n"; +- } else { +- print LOG "$line\n"; ++} ++ ++ ++# returns 1 if actually saved due to changes ++sub save_updmap { ++ my $fn = shift; ++ return if $opts{'dry-run'}; ++ my %upd = %{$alldata->{'updmap'}{$fn}}; ++ if ($upd{'changed'}) { ++ mkdirhier(dirname($fn)); ++ open (FN, ">$fn") || die "$prg: can't write to $fn: $!"; ++ my @lines = @{$upd{'lines'}}; ++ if (!@lines) { ++ print "Creating new config file $fn\n"; ++ } ++ # collect the lines with data ++ my %line_to_setting; ++ my %line_to_map; ++ my @add_setting; ++ my @add_map; ++ if (defined($upd{'setting'})) { ++ for my $k (keys %{$upd{'setting'}}) { ++ if ($upd{'setting'}{$k}{'line'} == -1) { ++ push @add_setting, $k; ++ } else { ++ $line_to_setting{$upd{'setting'}{$k}{'line'}} = $k; ++ } ++ } + } +- } +- &newline; +- printf " [%3d files]\n", scalar @tmpkanji0 +- unless ($quiet || $dry_run); +- +- &wlog ("Scanning for Map entries"); +- &newline(); +- my @tmp2 = &catMaps('^Map'); +- foreach my $line (@tmp2) { +- if ($dry_run) { +- print "$line\n"; +- } else { +- print LOG "$line\n"; ++ if (defined($upd{'maps'})) { ++ for my $k (keys %{$upd{'maps'}}) { ++ if ($upd{'maps'}{$k}{'line'} == -1) { ++ push @add_map, $k; ++ } else { ++ $line_to_map{$upd{'maps'}{$k}{'line'}} = $k; ++ } ++ } + } ++ for my $i (0..$#lines) { ++ if (defined($line_to_setting{$i})) { ++ my $k = $line_to_setting{$i}; ++ my $v = $upd{'setting'}{$k}{'val'}; ++ print FN "$k $v\n"; ++ } elsif (defined($line_to_map{$i})) { ++ my $m = $line_to_map{$i}; ++ my $rm; ++ if (defined($upd{'maps'}{$m}{'original'})) { ++ # we have the case that @noEmbed@ was replaced by the respective ++ # setting. Before writing out we have to replace this back with ++ # the original line!A ++ $rm = $upd{'maps'}{$m}{'original'}; ++ } else { ++ $rm = $m; ++ } ++ my $t = $upd{'maps'}{$m}{'type'}; ++ my $p = ($upd{'maps'}{$m}{'status'} eq "disabled" ? "#! " : ""); ++ print FN "$p$t $rm\n"; ++ } else { ++ print FN "$lines[$i]\n"; ++ } ++ } ++ # add the new settings and maps ++ for my $k (@add_setting) { ++ my $v = $upd{'setting'}{$k}{'val'}; ++ print FN "$k $v\n"; ++ } ++ for my $m (@add_map) { ++ my $t = $upd{'maps'}{$m}{'type'}; ++ my $p = ($upd{'maps'}{$m}{'status'} eq "disabled" ? "#! " : ""); ++ print FN "$p$t $m\n"; ++ } ++ close(FN) || warn("Cannot close file handle for $fn: $!"); ++ delete $alldata->{'updmap'}{$fn}{'changed'}; ++ return 1; + } +- &newline; +- printf " [%3d files]\n\n", scalar @tmp2 +- unless ($quiet || $dry_run); +- +- if (@missing > 0) { +- print STDERR "\nERROR: The following map file(s) couldn't be found:\n\t"; +- print STDERR join(' ', @missing); +- print STDERR "\n\n\tDid you run mktexlsr?\n\n" . +- "\tYou can delete non-existent map entries using the option\n". +- "\t --syncwithtrees.\n\n"; +- exit (1); +- } +- exit(0) if $dry_run; ++ return 0; ++} + +- # Create psfonts_t1.map, psfonts_pk.map, ps2pk.map and pdftex.map: +- my @managed_files = ("$dvipsoutputdir/download35.map", +- "$dvipsoutputdir/builtin35.map", +- "$dvipsoutputdir/psfonts_t1.map", +- "$dvipsoutputdir/psfonts_pk.map", +- "$pdftexoutputdir/pdftex_dl14.map", +- "$pdftexoutputdir/pdftex_ndl14.map", +- "$dvipdfmoutputdir/kanjix.map", +- "$dvipsoutputdir/ps2pk.map"); +- if ($pxdviUse) { +- push @managed_files, "$pxdvioutputdir/xdvi-ptex.map"; +- } +- for my $file (@managed_files) { +- open FILE, ">$file"; +- print FILE "% $file:\ +-% maintained by updmap[-sys].\ +-% Don't change this file directly. Use updmap[-sys] instead.\ +-% See texmf/web2c/$cnfFileShort and the updmap documentation.\ +-% A log of the run that created this file is available here:\ +-% $logfile\ +-"; +- close FILE; ++###################### ++# check for correct option value ++# ++sub check_option { ++ my ($opt, $val) = @_; ++ if ((($settings{$opt}{'type'} eq "binary") && ++ $val ne "true" && $val ne "false") || ++ (($settings{$opt}{'type'} eq "string") && ++ !member($val, @{$settings{$opt}{'possible'}}))) { ++ return 0; + } ++ return 1; ++} + +- print "Generating output for dvipdfm...\n" if !$quiet; +- my @tmpkanji1; +- push @tmpkanji1, &getLines(@tmpkanji0); +- @tmpkanji1 = &normalizeLines(@tmpkanji1); +- &writeLines(">$dvipdfmoutputdir/kanjix.map", +- @tmpkanji1); +- +- if ($pxdviUse) { +- # we use the very same data as for kanjix.map, but generate +- # a different file, so that in case a user wants to hand-craft it +- print "Generating output for pxdvi...\n" if !$quiet; +- &writeLines(">$pxdvioutputdir/xdvi-ptex.map", +- @tmpkanji1); +- } +- +- print "Generating output for ps2pk...\n" if !$quiet; +- my @ps2pk_map = &transLW35($ps2pk35); +- push @ps2pk_map, &getLines(@tmp1); +- push @ps2pk_map, &getLines(@tmp2); +- &writeLines(">$dvipsoutputdir/ps2pk.map", +- &normalizeLines(@ps2pk_map)); +- +- print "Generating output for dvips...\n" if !$quiet; +- my @download35_map = &transLW35($ps2pk35); +- &writeLines(">$dvipsoutputdir/download35.map", +- &normalizeLines(@download35_map)); +- +- my @builtin35_map = &transLW35($dvips35); +- &writeLines(">$dvipsoutputdir/builtin35.map", +- &normalizeLines(@builtin35_map)); +- +- my $dftdvips = ($dvipsDownloadBase35 ? $ps2pk35 : $dvips35); +- +- my @psfonts_t1_map = &transLW35($dftdvips); +- my @tmpkanji2 = &cidx2dvips(\@tmpkanji1); +- push @psfonts_t1_map, &getLines(@tmp1); +- push @psfonts_t1_map, &getLines(@tmp2); +- push @psfonts_t1_map, @tmpkanji2; +- &writeLines(">$dvipsoutputdir/psfonts_t1.map", +- &normalizeLines(@psfonts_t1_map)); +- +- my @psfonts_pk_map = &transLW35($dftdvips); +- push @psfonts_pk_map, &getLines(@tmp2); +- push @psfonts_pk_map, @tmpkanji2; +- &writeLines(">$dvipsoutputdir/psfonts_pk.map", +- &normalizeLines(@psfonts_pk_map)); ++############################################################################### ++# setOption (conf_file, option, value) ++# sets option to value in the config file (replacing the existing setting ++# or by adding a new line to the config file). ++# ++sub setOption { ++ my ($opt, $val) = @_; + +- print "Generating output for pdftex...\n" if !$quiet; +- # remove PaintType due to Sebastian's request +- my @tmp3 = &transLW35($pdftex35); +- push @tmp3, &getLines(@tmp1); +- push @tmp3, &getLines(@tmp2); +- @tmp3 = grep { $_ !~ m/(^%|PaintType)/ } @tmp3; +- +- my @tmp7 = &transLW35($ps2pk35); +- push @tmp7, &getLines(@tmp1); +- push @tmp7, &getLines(@tmp2); +- @tmp7 = grep { $_ !~ m/(^%|PaintType)/ } @tmp7; ++ die "$prg: Unsupported option $opt." if (!defined($settings{$opt})); ++ die "$0: Invalid value $val for option $opt." ++ if (!check_option($opt, $val)); + +- my @pdftex_ndl14_map = @tmp3; +- @pdftex_ndl14_map = &normalizeLines(@pdftex_ndl14_map); +- @pdftex_ndl14_map = &to_pdftex(@pdftex_ndl14_map); +- &writeLines(">$pdftexoutputdir/pdftex_ndl14.map", @pdftex_ndl14_map); ++ # silently accept this old option name, just in case. ++ return if $opt eq "dvipdfmDownloadBase14"; + +- my @pdftex_dl14_map = @tmp7; +- @pdftex_dl14_map = &normalizeLines(@pdftex_dl14_map); +- @pdftex_dl14_map = &to_pdftex(@pdftex_dl14_map); +- &writeLines(">$pdftexoutputdir/pdftex_dl14.map", @pdftex_dl14_map); ++ #print "Setting option $opt to $val...\n" if !$opts{'quiet'}; ++ my $tc = $alldata->{'changes_config'}; + +- &setupSymlinks; ++ die "$prg: top config file $tc has not been read." ++ if (!defined($alldata->{'updmap'}{$tc})); + +- &wlog ("\nFiles generated:\n"); +- sub dir { +- my ($d, $f, $target)=@_; +- if (-e "$d/$f") { +- my @stat=lstat("$d/$f"); +- my ($s,$m,$h,$D,$M,$Y)=localtime($stat[9]); +- my $timestamp=sprintf ("%04d-%02d-%02d %02d:%02d:%02d", +- $Y+1900, $M+1, $D, $h, $m, $s); +- my $date=sprintf "%12d %s %s", $stat[7], $timestamp, $f; +- &wlog ($date); +- +- if (-l "$d/$f") { +- my $lnk=sprintf " -> %s\n", readlink ("$d/$f"); +- &wlog ($lnk); +- } elsif ($f eq $target) { +- if (&files_are_identical("$d/$f", "$d/$link{$target}")) { +- &wlog (" = $link{$target}\n"); +- } else { +- &wlog (" = ?????\n"); # This shouldn't happen. +- } +- } else { +- &wlog ("\n"); +- } +- } else { +- print STDERR "Warning: File $d/$f doesn't exist.\n"; +- print LOG "Warning: File $d/$f doesn't exist.\n"; +- } +- } +- my $d; +- $d="$dvipsoutputdir"; &wlog (" $d:\n"); +- foreach my $f ('builtin35.map', 'download35.map', 'psfonts_pk.map', +- 'psfonts_t1.map', 'ps2pk.map', 'psfonts.map') { +- dir ($d, $f, 'psfonts.map'); +- $updLSR->{add}("$d/$f"); +- } +- $d="$pdftexoutputdir"; &wlog (" $d:\n"); +- foreach my $f ('pdftex_dl14.map', 'pdftex_ndl14.map', 'pdftex.map') { +- dir ($d, $f, 'pdftex.map'); +- $updLSR->{add}("$d/$f"); +- } +- $d="$dvipdfmoutputdir"; &wlog (" $d:\n"); +- foreach my $f ('kanjix.map') { +- dir ($d, $f, ''); +- $updLSR->{add}("$d/$f"); +- } +- if ($pxdviUse) { +- $d="$pxdvioutputdir"; &wlog (" $d:\n"); +- foreach my $f ('xdvi-ptex.map') { +- dir ($d, $f, ''); +- $updLSR->{add}("$d/$f"); ++ if (defined($alldata->{'updmap'}{$tc}{'setting'}{$opt}{'val'})) { ++ # the value is already set, do nothing ++ if ($alldata->{'updmap'}{$tc}{'setting'}{$opt}{'val'} eq $val) { ++ return; + } ++ $alldata->{'updmap'}{$tc}{'setting'}{$opt}{'val'} = $val; ++ $alldata->{'updmap'}{$tc}{'changed'} = 1; ++ } else { ++ $alldata->{'updmap'}{$tc}{'setting'}{$opt}{'val'} = $val; ++ $alldata->{'updmap'}{$tc}{'setting'}{$opt}{'line'} = -1; ++ $alldata->{'updmap'}{$tc}{'changed'} = 1; + } +- close LOG; +- print "\nTranscript written on \"$logfile\".\n" if !$quiet; + } + +- ++ + ############################################################################### +-# initVars() +-# initialize global variables ++# copyFile() ++# copy file $src to $dst, sets $dst creation and mod time + # +-sub initVars { +- $quiet = 0; +- $nohash = 0; +- $nomkmap = 0; +- $cnfFile = ""; +- $cnfFileShort = "updmap.cfg"; +- $outputdir = ""; +- chomp($TEXMFMAIN =`kpsewhich --var-value=TEXMFMAIN`); ++sub copyFile { ++ my ($src, $dst) = @_; ++ my $dir; ++ ($dir=$dst)=~s/(.*)\/.*/$1/; ++ mkdirhier($dir); + +- @psADOBE = ( +- 's/ URWGothicL-Demi / AvantGarde-Demi /', +- 's/ URWGothicL-DemiObli / AvantGarde-DemiOblique /', +- 's/ URWGothicL-Book / AvantGarde-Book /', +- 's/ URWGothicL-BookObli / AvantGarde-BookOblique /', +- 's/ URWBookmanL-DemiBold / Bookman-Demi /', +- 's/ URWBookmanL-DemiBoldItal / Bookman-DemiItalic /', +- 's/ URWBookmanL-Ligh / Bookman-Light /', +- 's/ URWBookmanL-LighItal / Bookman-LightItalic /', +- 's/ NimbusMonL-Bold / Courier-Bold /', +- 's/ NimbusMonL-BoldObli / Courier-BoldOblique /', +- 's/ NimbusMonL-Regu / Courier /', +- 's/ NimbusMonL-ReguObli / Courier-Oblique /', +- 's/ NimbusSanL-Bold / Helvetica-Bold /', +- 's/ NimbusSanL-BoldCond / Helvetica-Narrow-Bold /', +- 's/ NimbusSanL-BoldItal / Helvetica-BoldOblique /', +- 's/ NimbusSanL-BoldCondItal / Helvetica-Narrow-BoldOblique /', +- 's/ NimbusSanL-Regu / Helvetica /', +- 's/ NimbusSanL-ReguCond / Helvetica-Narrow /', +- 's/ NimbusSanL-ReguItal / Helvetica-Oblique /', +- 's/ NimbusSanL-ReguCondItal / Helvetica-Narrow-Oblique /', +- 's/ CenturySchL-Bold / NewCenturySchlbk-Bold /', +- 's/ CenturySchL-BoldItal / NewCenturySchlbk-BoldItalic /', +- 's/ CenturySchL-Roma / NewCenturySchlbk-Roman /', +- 's/ CenturySchL-Ital / NewCenturySchlbk-Italic /', +- 's/ URWPalladioL-Bold / Palatino-Bold /', +- 's/ URWPalladioL-BoldItal / Palatino-BoldItalic /', +- 's/ URWPalladioL-Roma / Palatino-Roman /', +- 's/ URWPalladioL-Ital / Palatino-Italic /', +- 's/ StandardSymL / Symbol /', +- 's/ NimbusRomNo9L-Medi / Times-Bold /', +- 's/ NimbusRomNo9L-MediItal / Times-BoldItalic /', +- 's/ NimbusRomNo9L-Regu / Times-Roman /', +- 's/ NimbusRomNo9L-ReguItal / Times-Italic /', +- 's/ URWChanceryL-MediItal / ZapfChancery-MediumItalic /', +- 's/ Dingbats / ZapfDingbats /', +- ); ++ $src eq $dst && return "can't copy $src to itself!\n"; + +- @fileADOBEkb = ( +- 's/\buagd8a.pfb\b/pagd8a.pfb/', +- 's/\buagdo8a.pfb\b/pagdo8a.pfb/', +- 's/\buagk8a.pfb\b/pagk8a.pfb/', +- 's/\buagko8a.pfb\b/pagko8a.pfb/', +- 's/\bubkd8a.pfb\b/pbkd8a.pfb/', +- 's/\bubkdi8a.pfb\b/pbkdi8a.pfb/', +- 's/\bubkl8a.pfb\b/pbkl8a.pfb/', +- 's/\bubkli8a.pfb\b/pbkli8a.pfb/', +- 's/\bucrb8a.pfb\b/pcrb8a.pfb/', +- 's/\bucrbo8a.pfb\b/pcrbo8a.pfb/', +- 's/\bucrr8a.pfb\b/pcrr8a.pfb/', +- 's/\bucrro8a.pfb\b/pcrro8a.pfb/', +- 's/\buhvb8a.pfb\b/phvb8a.pfb/', +- 's/\buhvb8ac.pfb\b/phvb8an.pfb/', +- 's/\buhvbo8a.pfb\b/phvbo8a.pfb/', +- 's/\buhvbo8ac.pfb\b/phvbo8an.pfb/', +- 's/\buhvr8a.pfb\b/phvr8a.pfb/', +- 's/\buhvr8ac.pfb\b/phvr8an.pfb/', +- 's/\buhvro8a.pfb\b/phvro8a.pfb/', +- 's/\buhvro8ac.pfb\b/phvro8an.pfb/', +- 's/\buncb8a.pfb\b/pncb8a.pfb/', +- 's/\buncbi8a.pfb\b/pncbi8a.pfb/', +- 's/\buncr8a.pfb\b/pncr8a.pfb/', +- 's/\buncri8a.pfb\b/pncri8a.pfb/', +- 's/\buplb8a.pfb\b/pplb8a.pfb/', +- 's/\buplbi8a.pfb\b/pplbi8a.pfb/', +- 's/\buplr8a.pfb\b/pplr8a.pfb/', +- 's/\buplri8a.pfb\b/pplri8a.pfb/', +- 's/\busyr.pfb\b/psyr.pfb/', +- 's/\butmb8a.pfb\b/ptmb8a.pfb/', +- 's/\butmbi8a.pfb\b/ptmbi8a.pfb/', +- 's/\butmr8a.pfb\b/ptmr8a.pfb/', +- 's/\butmri8a.pfb\b/ptmri8a.pfb/', +- 's/\buzcmi8a.pfb\b/pzcmi8a.pfb/', +- 's/\buzdr.pfb\b/pzdr.pfb/', +- ); ++ open IN, "<$src" or die "$0: can't open source file $src for copying: $!"; ++ open OUT, ">$dst"; + +- @fileURW = ( +- 's/\buagd8a.pfb\b/a010015l.pfb/', +- 's/\buagdo8a.pfb\b/a010035l.pfb/', +- 's/\buagk8a.pfb\b/a010013l.pfb/', +- 's/\buagko8a.pfb\b/a010033l.pfb/', +- 's/\bubkd8a.pfb\b/b018015l.pfb/', +- 's/\bubkdi8a.pfb\b/b018035l.pfb/', +- 's/\bubkl8a.pfb\b/b018012l.pfb/', +- 's/\bubkli8a.pfb\b/b018032l.pfb/', +- 's/\bucrb8a.pfb\b/n022004l.pfb/', +- 's/\bucrbo8a.pfb\b/n022024l.pfb/', +- 's/\bucrr8a.pfb\b/n022003l.pfb/', +- 's/\bucrro8a.pfb\b/n022023l.pfb/', +- 's/\buhvb8a.pfb\b/n019004l.pfb/', +- 's/\buhvb8ac.pfb\b/n019044l.pfb/', +- 's/\buhvbo8a.pfb\b/n019024l.pfb/', +- 's/\buhvbo8ac.pfb\b/n019064l.pfb/', +- 's/\buhvr8a.pfb\b/n019003l.pfb/', +- 's/\buhvr8ac.pfb\b/n019043l.pfb/', +- 's/\buhvro8a.pfb\b/n019023l.pfb/', +- 's/\buhvro8ac.pfb\b/n019063l.pfb/', +- 's/\buncb8a.pfb\b/c059016l.pfb/', +- 's/\buncbi8a.pfb\b/c059036l.pfb/', +- 's/\buncr8a.pfb\b/c059013l.pfb/', +- 's/\buncri8a.pfb\b/c059033l.pfb/', +- 's/\buplb8a.pfb\b/p052004l.pfb/', +- 's/\buplbi8a.pfb\b/p052024l.pfb/', +- 's/\buplr8a.pfb\b/p052003l.pfb/', +- 's/\buplri8a.pfb\b/p052023l.pfb/', +- 's/\busyr.pfb\b/s050000l.pfb/', +- 's/\butmb8a.pfb\b/n021004l.pfb/', +- 's/\butmbi8a.pfb\b/n021024l.pfb/', +- 's/\butmr8a.pfb\b/n021003l.pfb/', +- 's/\butmri8a.pfb\b/n021023l.pfb/', +- 's/\buzcmi8a.pfb\b/z003034l.pfb/', +- 's/\buzdr.pfb\b/d050000l.pfb/', +- ); +- +- @fileADOBE = ( +- 's/\buagd8a.pfb\b/agd_____.pfb/', +- 's/\buagdo8a.pfb\b/agdo____.pfb/', +- 's/\buagk8a.pfb\b/agw_____.pfb/', +- 's/\buagko8a.pfb\b/agwo____.pfb/', +- 's/\bubkd8a.pfb\b/bkd_____.pfb/', +- 's/\bubkdi8a.pfb\b/bkdi____.pfb/', +- 's/\bubkl8a.pfb\b/bkl_____.pfb/', +- 's/\bubkli8a.pfb\b/bkli____.pfb/', +- 's/\bucrb8a.pfb\b/cob_____.pfb/', +- 's/\bucrbo8a.pfb\b/cobo____.pfb/', +- 's/\bucrr8a.pfb\b/com_____.pfb/', +- 's/\bucrro8a.pfb\b/coo_____.pfb/', +- 's/\buhvb8a.pfb\b/hvb_____.pfb/', +- 's/\buhvb8ac.pfb\b/hvnb____.pfb/', +- 's/\buhvbo8a.pfb\b/hvbo____.pfb/', +- 's/\buhvbo8ac.pfb\b/hvnbo___.pfb/', +- 's/\buhvr8a.pfb\b/hv______.pfb/', +- 's/\buhvr8ac.pfb\b/hvn_____.pfb/', +- 's/\buhvro8a.pfb\b/hvo_____.pfb/', +- 's/\buhvro8ac.pfb\b/hvno____.pfb/', +- 's/\buncb8a.pfb\b/ncb_____.pfb/', +- 's/\buncbi8a.pfb\b/ncbi____.pfb/', +- 's/\buncr8a.pfb\b/ncr_____.pfb/', +- 's/\buncri8a.pfb\b/nci_____.pfb/', +- 's/\buplb8a.pfb\b/pob_____.pfb/', +- 's/\buplbi8a.pfb\b/pobi____.pfb/', +- 's/\buplr8a.pfb\b/por_____.pfb/', +- 's/\buplri8a.pfb\b/poi_____.pfb/', +- 's/\busyr.pfb\b/sy______.pfb/', +- 's/\butmb8a.pfb\b/tib_____.pfb/', +- 's/\butmbi8a.pfb\b/tibi____.pfb/', +- 's/\butmr8a.pfb\b/tir_____.pfb/', +- 's/\butmri8a.pfb\b/tii_____.pfb/', +- 's/\buzcmi8a.pfb\b/zcmi____.pfb/', +- 's/\buzdr.pfb\b/zd______.pfb/', +- ); ++ binmode(IN); ++ binmode(OUT); ++ print OUT <IN>; ++ close(OUT); ++ close(IN); ++ my @t = stat($src); ++ utime($t[8], $t[9], $dst); + } + +- + ############################################################################### +-# main() ++# files_are_identical(file_A, file_B) ++# compare two files. Same as cmp(1). + # +-sub main { +- &initVars; +- &processOptions; ++sub files_are_identical { ++ my $file_A=shift; ++ my $file_B=shift; ++ my $retval=0; + +- &help if ($opt_help); ++ open IN, "$file_A"; ++ my $A=(<IN>); ++ close IN; ++ open IN, "$file_B"; ++ my $B=(<IN>); ++ close IN; + +- if (@showoptions) { +- &showOptions(@showoptions); +- exit 0; +- } ++ $retval=1 if ($A eq $B); ++ return $retval; ++} + +- &setupCfgFile; ++############################################################################### ++# files_are_different(file_A, file_B[, comment_char]) ++# compare two equalized files. ++# ++sub files_are_different { ++ my $file_A=shift; ++ my $file_B=shift; ++ my $comment=shift; ++ my $retval=0; + +- if ($listmaps) { +- &listMaps ('list'); +- exit 0; +- } +- if ($listavailablemaps) { +- &listMaps ('avail'); +- exit 0; +- } +- if ($syncwithtrees) { +- &listMaps ('sync'); +- exit 0; ++ my $A=equalize_file("$file_A", $comment); ++ my $B=equalize_file("$file_B", $comment); ++ $retval=1 unless ($A eq $B); ++ return $retval; ++} ++ ++############################################################################### ++# equalize_file(filename[, comment_char]) ++# read a file and return its processed content as a string. ++# look into the source code for more details. ++# ++sub equalize_file { ++ my $file=shift; ++ my $comment=shift; ++ my @temp; ++ ++ open IN, "$file"; ++ my @lines = (<IN>); ++ close IN; ++ chomp(@lines); ++ ++ for (@lines) { ++ s/\s*${comment}.*// if (defined $comment); # remove comments ++ next if /^\s*$/; # remove empty lines ++ s/\s+/ /g; # replace multiple whitespace chars by a single one ++ push @temp, $_; + } ++ return join('X', sort(@temp)); ++} + +- my $bakFile = $cnfFile; +- $bakFile =~ s/\.cfg$/.bak/; +- ©File($cnfFile, $bakFile); ++############################################################################### ++# normalizeLines() ++# not the original function, we want it to keep comments, that are ++# anyway only the file names we are adding! ++# whitespace is exactly one space, no empty lines, ++# no whitespace at end of line, one space before and after " ++# ++sub normalizeLines { ++ my @lines = @_; ++ my %count = (); ++ ++ # @lines = grep { $_ !~ m/^[*#;%]/ } @lines; ++ map {$_ =~ s/\s+/ /gx } @lines; ++ @lines = grep { $_ !~ m/^\s*$/x } @lines; ++ map { $_ =~ s/\s$//x ; ++ $_ =~ s/\s*\"\s*/ \" /gx; ++ $_ =~ s/\" ([^\"]*) \"/\"$1\"/gx; ++ } @lines; + +- my $cmd = ''; ++ # @lines = grep {++$count{$_} < 2 } (sort @lines); ++ @lines = grep {++$count{$_} < 2 } (@lines); + +- if ($opt_edit) { +- # it's not a good idea to edit updmap.cfg manually these days, +- # but for compatibility we'll silently keep the option. +- $cmd = 'edit'; +- my $editor = $ENV{'VISUAL'} || $ENV{'EDITOR'}; +- $editor ||= (&win32 ? "notepad" : "vi"); +- system($editor, $cnfFile); ++ return @lines; ++} + +- } elsif (@setoptions) { +- $cmd = 'setOption'; +- &setOptions (@setoptions); + +- } elsif ($enableItem) { +- $cmd = 'enableMap'; +- if ($enableItem =~ /=/) { +- &enableMap(split('=', $enableItem)); ++################################################################# ++# ++# reading updmap-cfg files and the actual map files ++# ++# the following hash saves *all* the information and is passed around ++# we do not fill everything from the very beginning to make sure that ++# we only read what is necessary (speed!) ++# ++# initialized by main ++# $alldata->{'changes_config'} = the config file where changes are saved ++# ++# initialized by read_updmap_files ++# $alldata->{'order'} = [ list of updmap in decreasing priority ] ++# $alldata->{'updmap'}{$full_path_name_of_updmap}{'lines'} = \@lines ++# $alldata->{'updmap'}{$full_path_name_of_updmap}{'setting'}{$key}{'val'} = $val ++# $alldata->{'updmap'}{$full_path_name_of_updmap}{'setting'}{$key}{'line'} = $i ++# $alldata->{'updmap'}{$full_path_name_of_updmap}{'maps'}{$mapname}{'type'} ++# = 'Map'|'MixedMap'|'KanjiMap'|'disabled' ++# $alldata->{'updmap'}{$full_path_name_of_updmap}{'maps'}{$mapname}{'status'} ++# = 'enabled'|'disabled' ++# $alldata->{'updmap'}{$full_path_name_of_updmap}{'maps'}{$mapname}{'line'} = $i ++# $alldata->{'maps'}{$m}{'origin'} = $updmap_path_name ++# $alldata->{'maps'}{$m}{'status'} = enabled | disabled ++# ++# initialized by read_map_files ++# $alldata->{'maps'}{$m}{'fonts'}{$font} = $definition ++# $alldata->{'fonts'}{$f}{'origin'} = $map ++# ++# initialized by merge_data ++# $alldata->{'merged'}{'setting'}{$key}{'val'} = $val ++# $alldata->{'merged'}{'setting'}{$key}{'origin'} = $origin_updmap_cfg ++# $alldata->{'merged'}{'allMaps'}{'fonts'}{$fontdef} = $rest ++# $alldata->{'merged'}{'noMixedMaps'}{'fonts'}{$fontdef} = $rest ++# $alldata->{'merged'}{'KanjiMaps'}{'fonts'}{$fontdef} = $rest ++# ++ ++sub read_updmap_files { ++ my (@l) = @_; ++ for my $l (@l) { ++ my $updmap = read_updmap_file($l); ++ $alldata->{'updmap'}{$l}{'lines'} = $updmap->{'lines'}; ++ if (defined($updmap->{'setting'})) { ++ for my $k (keys %{$updmap->{'setting'}}) { ++ $alldata->{'updmap'}{$l}{'setting'}{$k}{'val'} = $updmap->{'setting'}{$k}{'val'}; ++ $alldata->{'updmap'}{$l}{'setting'}{$k}{'line'} = $updmap->{'setting'}{$k}{'line'}; ++ } ++ } ++ if (defined($updmap->{'maps'})) { ++ for my $k (keys %{$updmap->{'maps'}}) { ++ $alldata->{'updmap'}{$l}{'maps'}{$k}{'type'} = $updmap->{'maps'}{$k}{'type'}; ++ $alldata->{'updmap'}{$l}{'maps'}{$k}{'status'} = $updmap->{'maps'}{$k}{'status'}; ++ $alldata->{'updmap'}{$l}{'maps'}{$k}{'line'} = $updmap->{'maps'}{$k}{'line'}; ++ } ++ } ++ } ++ # in case the changes_config is a new one read it in and initialize it here ++ my $cc = $alldata->{'changes_config'}; ++ if (! -r $cc) { ++ $alldata->{'updmap'}{$cc}{'lines'} = [ ]; ++ } ++ # ++ $alldata->{'order'} = \@l; ++ # ++ # merge the settings so that we can check for kanjiEmbed ++ # ++ merge_settings(); ++ # ++ my ($kanjiEmbed, $kanjiEmbed_origin) = get_cfg('kanjiEmbed'); ++ # ++ # go through all map files and check that the text is properly replaced ++ # ++ for my $l (@l) { ++ for my $m (keys %{$alldata->{'updmap'}{$l}{'maps'}}) { ++ if ($m =~ m/\@kanjiEmbed@/) { ++ my $newm = $m; ++ $newm =~ s/\@kanjiEmbed@/$kanjiEmbed/; ++ # now we have to update various linked items ++ $alldata->{'updmap'}{$l}{'maps'}{$newm}{'type'} = ++ $alldata->{'updmap'}{$l}{'maps'}{$m}{'type'}; ++ $alldata->{'updmap'}{$l}{'maps'}{$newm}{'status'} = ++ $alldata->{'updmap'}{$l}{'maps'}{$m}{'status'}; ++ $alldata->{'updmap'}{$l}{'maps'}{$newm}{'line'} = ++ $alldata->{'updmap'}{$l}{'maps'}{$m}{'line'}; ++ $alldata->{'updmap'}{$l}{'maps'}{$newm}{'original'} = $m; ++ delete $alldata->{'updmap'}{$l}{'maps'}{$m}; ++ } ++ } ++ } ++ # ++ # first round determine which maps should be used and which type, as ++ # different updmap.cfg files might specify different types of maps ++ # (MixedMap or Map or KanjiMap). ++ # Again, we have to do that in reverse order ++ for my $l (reverse @l) { ++ if (defined($alldata->{'updmap'}{$l}{'maps'})) { ++ for my $m (keys %{$alldata->{'updmap'}{$l}{'maps'}}) { ++ $alldata->{'maps'}{$m}{'origin'} = $l; ++ $alldata->{'maps'}{$m}{'status'} = $alldata->{'updmap'}{$l}{'maps'}{$m}{'status'}; ++ } ++ } ++ } ++} ++ ++sub read_updmap_file { ++ my $fn = shift; ++ my $is_old_local = ($fn =~ m/updmap-local.cfg/ ? 1 : 0); ++ my %data; ++ if (!open(FN,"<$fn")) { ++ die ("Cannot read $fn: $!"); ++ } ++ # we count lines from 0 ..!!!! ++ my $i = -1; ++ my @lines = <FN>; ++ chomp(@lines); ++ $data{'lines'} = [ @lines ]; ++ close(FN) || warn("Cannot close $fn: $!"); ++ for (@lines) { ++ $i++; ++ chomp; ++ if ($is_old_local) { ++ # in case we read an old updmap-local.cfg we have to make sure ++ # that the disable lines ++ # ^#!foo.map ++ # are rewritten to proper disable lines ++ # ^#! Map foo.map ++ # we are guessing here the type of the map (namely Map) ++ $_ =~ s/^#!([^ ])/#! Map $1/; ++ } ++ next if /^\s*$/; ++ next if /^\s*#$/; ++ next if /^\s*#[^!]/; ++ next if /^\s*##/; ++ next if /^#![^ ]/; ++ # allow for commands on the line itself ++ s/([^#].*)#.*$/$1/; ++ my ($a, $b, @rest) = split ' '; ++ if ($a eq "#!") { ++ if ($b eq "Map" || $b eq "MixedMap" || $b eq "KanjiMap") { ++ my $c = shift @rest; ++ if (!defined($c)) { ++ warning("updmap: apparently not a real disable line, ignored: $_\n"); ++ } else { ++ if (defined($data{'maps'}{$c})) { ++ warning("updmap: double mentioning of $c in $fn\n"); ++ } ++ $data{'maps'}{$c}{'status'} = 'disabled'; ++ $data{'maps'}{$c}{'type'} = $b; ++ $data{'maps'}{$c}{'line'} = $i; ++ } ++ } ++ next; ++ } ++ if (@rest) { ++ warning("updmap: line $i in $fn contains a syntax error, more than two words!\n"); ++ } ++ if (defined($settings{$a})) { ++ if (check_option($a, $b)) { ++ $data{'setting'}{$a}{'val'} = $b; ++ $data{'setting'}{$a}{'line'} = $i; ++ } else { ++ warning("updmap: unknown setting for $a: $b, ignored!\n"); ++ } ++ } elsif ($a eq "Map" || $a eq "MixedMap" || $a eq "KanjiMap") { ++ if (defined($data{'maps'}{$b}) && $data{'maps'}{$b}{'type'} ne $a) { ++ warning("updmap: double mentioning of $b with conflicting types in $fn\n"); ++ } else { ++ $data{'maps'}{$b}{'type'} = $a; ++ $data{'maps'}{$b}{'status'} = 'enabled'; ++ $data{'maps'}{$b}{'line'} = $i; ++ } + } else { +- &enableMap($enableItem, shift @ARGV); ++ warning("updmap: unrecognized line $i in $fn: $_\n"); + } ++ } ++ return \%data; ++} + +- } elsif (@disableItem) { +- $cmd = 'disableMap'; +- foreach my $m (@disableItem) { +- &disableMap($m); ++sub read_map_files { ++ if (!defined($alldata->{'updmap'})) { ++ return; ++ } ++ my @missing; ++ my @l = @{$alldata->{'order'}}; ++ # first collect all the map files we are interested in ++ # and determine whether they exist, and get their full path ++ my @maps; ++ for my $f (@l) { ++ next if !defined($alldata->{'updmap'}{$f}{'maps'}); ++ for my $m (keys %{$alldata->{'updmap'}{$f}{'maps'}}) { ++ # only read a map file if its final status is enabled! ++ push @maps, $m if ($alldata->{'maps'}{$m}{'status'} eq 'enabled'); ++ } ++ } ++ for my $m (qw/dvips35.map pdftex35.map ps2pk35.map/) { ++ push @maps, $m; ++ $alldata->{'maps'}{$m}{'status'} = 'enabled'; ++ } ++ @maps = sort_uniq(@maps); ++ my @fullpath = `kpsewhich --format=map @maps`; ++ chomp @fullpath; ++ foreach my $map (@maps) { ++ my ($ff) = grep /\/$map(\.map)?$/, @fullpath; ++ if ($ff) { ++ $alldata->{'maps'}{$map}{'fullpath'} = $ff; ++ } else { ++ # if the map file is not found, then push it onto the list of ++ # missing map files, since we know that it is enabled ++ push @missing, $map; + } + } + +- if ($cmd && !$opt_force && &files_are_equal($bakFile, $cnfFile)) { +- print "$cnfFile unchanged. Map files not recreated.\n" if !$quiet; +- } else { +- if (! $nomkmap) { +- &setupDestDir; +- &mkMaps; ++ # ++ # read in the three basic fonts definition maps ++ for my $m (qw/dvips35.map pdftex35.map ps2pk35.map/) { ++ my $ret = read_map_file($alldata->{'maps'}{$m}{'fullpath'}); ++ my @ff = (); ++ for my $font (keys %$ret) { ++ $alldata->{'fonts'}{$font}{'origin'} = $m; ++ $alldata->{'maps'}{$m}{'fonts'}{$font} = $ret->{$font}; ++ } ++ } ++ # we read the updmap in reverse directions, since we ++ # replace the origin field of font definition always with the ++ # top one ++ for my $f (reverse @l) { ++ my @maps = keys %{$alldata->{'updmap'}{$f}{'maps'}}; ++ for my $m (@maps) { ++ # we do not read a map file multiple times, if $alldata{'maps'}{$m} is ++ # defined we expect that it was read and do skip it ++ next if defined($alldata->{'maps'}{$m}{'fonts'}); ++ # we do not read a map files content if it is disabled ++ next if ($alldata->{'maps'}{$m}{'status'} eq 'disabled'); ++ if (!defined($alldata->{'maps'}{$m}{'fullpath'})) { ++ # we have already pushed these map files onto the list of missing ++ # map files, so do nothing here ++ next; ++ } ++ my $ret = read_map_file($alldata->{'maps'}{$m}{'fullpath'}); ++ if (defined($ret)) { ++ for my $font (keys %$ret) { ++ if (defined($alldata->{'fonts'}{$font})) { ++ # we got another definition, warn on that ++ # if the origin is not defined by now, the font is defined ++ # multiple times in the same map file, otherwise it is ++ # defined in another map file already ++ if (defined($alldata->{'fonts'}{$font}{'origin'})) { ++ my $fontorig = $alldata->{'fonts'}{$font}{'origin'}; ++ my $maporig = $alldata->{'maps'}{$fontorig}{'origin'}; ++ warning("$prg: font $font is defined multiple times:\n"); ++ warning("$prg: $fontorig (from $maporig)\n"); ++ warning("$prg: $m (from $f) (used)\n"); ++ } else { ++ warning("$prg: font $font is multiply defined in $m, using an arbitrary instance!\n"); ++ } ++ } ++ $alldata->{'fonts'}{$font}{'origin'} = $m; ++ $alldata->{'maps'}{$m}{'fonts'}{$font} = $ret->{$font}; ++ } ++ } + } +- unlink ($bakFile); + } ++ return (@missing); ++} + +- unless ($nohash) { +- print "$0: Updating ls-R files.\n" if !$quiet; +- $updLSR->{exec}() ++sub read_map_file { ++ my $fn = shift; ++ my @lines; ++ if (!open(MF,"<$fn")) { ++ warn("cannot open $fn: $!"); ++ return; ++ } ++ @lines = <MF>; ++ close(MF); ++ chomp(@lines); ++ my %data; ++ for (@lines) { ++ next if /^\s*#/; ++ next if /^\s*%/; ++ next if /^\s*$/; ++ my ($a, $b) = split(' ', $_, 2); ++ $data{$a} = $b; + } ++ return \%data; ++} ++ ++# ++# merge and update the setting ++# ++sub merge_settings { ++ my @l = @{$alldata->{'order'}}; ++ # ++ # for security clean out everything that was there ++ %{$alldata->{'merged'}} = (); ++ # ++ # first read in the settings ++ # we read it in *reverse* order and simple fill up the combined data ++ # thus if there are multiple definitions/settings, the one coming from ++ # the first in the original list will win! ++ for my $l (reverse @l) { ++ # merge settings ++ if (defined($alldata->{'updmap'}{$l}{'setting'})) { ++ for my $k (keys %{$alldata->{'updmap'}{$l}{'setting'}}) { ++ $alldata->{'merged'}{'setting'}{$k}{'val'} = $alldata->{'updmap'}{$l}{'setting'}{$k}{'val'}; ++ $alldata->{'merged'}{'setting'}{$k}{'origin'} = $l; ++ } ++ } ++ } ++ # ++} ++ ++# ++# merging the various font definitions ++# ++sub merge_data { ++ my @l = @{$alldata->{'order'}}; ++ # ++ # now merge the data ++ # ++ for my $m (keys %{$alldata->{'maps'}}) { ++ my $origin = $alldata->{'maps'}{$m}{'origin'}; ++ next if !defined($origin); ++ next if ($alldata->{'updmap'}{$origin}{'maps'}{$m}{'status'} eq "disabled"); ++ for my $f (keys %{$alldata->{'maps'}{$m}{'fonts'}}) { ++ # use the font definition only for those fonts where the origin matches ++ if ($alldata->{'fonts'}{$f}{'origin'} eq $m) { ++ $alldata->{'merged'}{'allMaps'}{'fonts'}{$f} = ++ $alldata->{'maps'}{$m}{'fonts'}{$f} ++ if ($alldata->{'updmap'}{$origin}{'maps'}{$m}{'type'} ne "KanjiMap"); ++ $alldata->{'merged'}{'noMixedMaps'}{'fonts'}{$f} = ++ $alldata->{'maps'}{$m}{'fonts'}{$f} ++ if ($alldata->{'updmap'}{$origin}{'maps'}{$m}{'type'} eq "Map"); ++ $alldata->{'merged'}{'KanjiMap'}{'fonts'}{$f} = ++ $alldata->{'maps'}{$m}{'fonts'}{$f} ++ if ($alldata->{'updmap'}{$origin}{'maps'}{$m}{'type'} eq "KanjiMap"); ++ } ++ } ++ } ++} ++ ++sub warning { ++ print STDERR @_; ++} ++ ++# ++# help, version etc etc ++# ++ ++sub version { ++ my $ret = sprintf "%s (TeX Live, multi) version %s\n", $prg, $version; ++ return $ret; ++} ++ ++sub help { ++ my $usage = <<"EOF"; ++Usage: $prg [OPTION] ... [COMMAND] ++ or: $prg-sys [OPTION] ... [COMMAND] ++ ++Update the default font map files used by pdftex, dvips, and dvipdfm(x), ++(and optionally pxdvi) as determined by all configuration files updmap.cfg ++(the ones returned by running "kpsewhich --all updmap.cfg", but see below). ++ ++Among other things, these map files are used to determine which fonts ++should be used as bitmaps and which as outlines, and to determine which ++fonts are included in the output. ++ ++By default, the TeX filename database (ls-R) is also updated. ++ ++Options: ++ --cnffile FILE read FILE for the updmap configuration ++ (can be given multiple times, in which case ++ all the files are used) ++ --dvipdfmoutputdir DIR specify output directory (dvipdfm syntax) ++ --dvipsoutputdir DIR specify output directory (dvips syntax) ++ --pdftexoutputdir DIR specify output directory (pdftex syntax) ++ --pxdvioutputdir DIR specify output directory (pxdvi syntax) ++ --outputdir DIR specify output directory (for all files) ++ --copy cp generic files rather than using symlinks ++ --force recreate files even if config hasn't changed ++ --nomkmap do not recreate map files ++ --nohash do not run texhash ++ -n, --dry-run only show the configuration, no output ++ --quiet, --silent reduce verbosity ++ ++Commands: ++ --help show this message and exit ++ --version show version information and exit ++ --showoptions OPTION show possible settings for OPTION ++ --showoption OPTION show the current setting of OPTION ++ --setoption OPTION VALUE set OPTION to value ++ --setoption OPTION=VALUE as above, just different syntax ++ --enable MAPTYPE MAPFILE add "MAPTYPE MAPFILE" to updmap.cfg, ++ where MAPTYPE is either Map, MixedMap, KanjiMap ++ --enable Map=MAPFILE add \"Map MAPFILE\" to updmap.cfg ++ --enable MixedMap=MAPFILE add \"MixedMap MAPFILE\" to updmap.cfg ++ --enable KanjiMap=MAPFILE add \"KanjiMap MAPFILE\" to updmap.cfg ++ --disable MAPFILE disable MAPFILE, whether Map, MixedMap, or KanjiMap ++ --listmaps list all active and inactive maps ++ --listavailablemaps same as --listmaps, but without ++ unavailable map files ++ --syncwithtrees disable unavailable map files in updmap.cfg ++ ++Explanation of the map types: the (only) difference between Map and ++MixedMap is that MixedMap entries are not added to psfonts_pk.map. ++KanjiMap entries are added to psfonts_t1.map and kanjix.map. ++The purpose is to help users with printers that render Type 1 outline ++fonts worse than mode-tuned Type 1 bitmap fonts. So, MixedMap is used ++for fonts that are available as both Type 1 and Metafont. ++ ++Explanation of the possible OPTIONS (showoptions, showoptions, setoption): ++ ++ dvipsPreferOutline true|false (default true) ++ Whether dvips uses bitmaps or outlines, when both are available. ++ dvipsDownloadBase35 true|false (default false) ++ Whether dvips includes the standard 35 PostScript fonts in its output. ++ pdftexDownloadBase14 true|false (default true) ++ Whether pdftex includes the standard 14 PDF fonts in its output. ++ pxdviUse true|false (default false) ++ Whether maps for pxdvi (Japanese-patched xdvi) is under control of updmap. ++ LW35 URWkb|URW|ADOBEkb|ADOBE (default URWkb) ++ Adapt the font and file names of the standard 35 PostScript fonts. ++ URWkb URW fonts with "berry" filenames (e.g. uhvbo8ac.pfb) ++ URW URW fonts with "vendor" filenames (e.g. n019064l.pfb) ++ ADOBEkb Adobe fonts with "berry" filenames (e.g. phvbo8an.pfb) ++ ADOBE Adobe fonts with "vendor" filenames (e.g. hvnbo___.pfb) ++ kanjiEmbed (any string) ++ ++ These options are only read and acted on by updmap; dvips, pdftex, etc., ++ do not know anything about them. They work by changing the default map ++ file which the programs read, so they can be overridden by specifying ++ command-line options or configuration files to the programs, as ++ explained at the beginning of updmap.cfg. ++ ++Explanation of trees and files normally used: ++ ++NEEDS TO BE FIXED TODO TODO TODO AFTER FINAL INCLUSION ++ ++BEHAVIOUR HOW IT IS NOW ++ ++ updmap reads all the updmap.cfg found by ++ kpsewhich -all updmap.cfg ++ or those given on the command line with --cnffile. If kpsewhich is ++ used to determine the list of config files, there is one caveat: An ++ occurrence of updmap.cfg in TEXMFLOCAL is moved up in the priority ++ list just after files from TEXMFCONFIG, TEXMFVAR and TEXMFHOME. This ++ allows system administrator to override settings in ++ TEXMFSYSCONFIG/web2c/updmap.cfg which is used by tlmgr to manage ++ the installed options. ++ ++BEHAVIOUR HOW IT SHOULD BE AFTER INCLUSION ++ ++ updmap reads all the updmap.cfg files found by ++ kpsewhich -all updmap.cfg ++ in the order returned by kpsewhich. There is one exception to keep ++ upgradability from earlier versions of TeX Live: If there is a file ++ TEXMFLOCAL/web2c/updmap-local.cfg (which was formerly used by tlmgr ++ to merge local fonts), then a (not necessarily existing) file ++ TEXMFLOCAL/web2c/updmap.cfg is ignored and the updmap-local.cfg is ++ used instead. In this case updmap recognizes also the syntax for ++ disabling map files in the updmap-local.cfg (this syntax was different ++ to what is used now!). ++ ++ According to the actions updmap might write to one of the given files or ++ create a new updmap.cfg, see below for details. ++ ++ If multiple updmap.cfg files are found, all the map files mentioned ++ in all the updmap.cfg files are merged. ++ ++ CAVEATS with multiple updmap.cfg files ++ * where changes are saved ++ If config files are given on the cmd line, then the first given will ++ be used to save changes (by --setoption, --enable or --disable). ++ If the config files are taken from kpsewhich, then the algorithm is ++ more complex: ++ - if one of \$TEXMFHOME/web2c/updmap.cfg or \$TEXMFCONFIG/web2c/updmap.cfg ++ appears in the list of used files, then the one given *first* by ++ kpsewhich --all, or equivalently, the one given by kpsewhich updmap.cfg, ++ is used ++ - if none of the above two are present, a new config file is created ++ in \$TEXMFCONFIG/web2c/updmap.cfg (in case there are actual changes) ++ and used ++ ++ * multiple font definitions ++ If a font is defined multiple times in different maps, then the ++ definition of the map file that comes from the highest priority ++ updmap.cfg file is used. ++ If a font is defined multiple times in the same map file, an ++ arbitrary definition is used. ++ In both cases warnings are issued. ++ ++ * disabling map files ++ updmap.cfg files with higher priority can disable map files that ++ are mentioned in lower priority updmap.cfg files by disabling ++ them, i.e., writing ++ \#! Map mapname.map ++ or ++ \#! MixedMap mapname.map ++ into the higher prioprity updmap.cfg file. ++ ++ As an example take a user with a copy of the commercial MTPRO fonts. ++ He wants to disable the belleek version of the fonts, that is ++ disable the map belleek.map. The user should create a updmap.cfg file ++ in \$TEXMFCONFIG/web2c/updmap.cfg with the content ++ #! Map belleek.map ++ Map mt-plus.map ++ Map mt-yy.map ++ and call $prg. ++ ++ updmap writes the map files for dvips (psfonts.map) and pdftex ++ (pdftex.map) to the TEXMFVAR/fonts/map/updmap/{dvips,pdftex}/ ++ directories. ++ ++ The log file is written to TEXMFVAR/web2c/updmap.log. ++ ++ When updmap-sys is run, TEXMFSYSCONFIG and TEXMFSYSVAR are used ++ instead. This is the only difference between updmap-sys and updmap. ++ ++ Other locations can be used if overridden on the command line, or these ++ trees don't exist, or you are not using the original TeX Live. ++ ++ To see the precise locations of the various files that ++ will be read and written, give the -n option (or read the man page). ++ ++For step-by-step instructions on making new fonts known to TeX, read ++http://tug.org/fonts/fontinstall.html. For even more terse ++instructions, read the beginning of updmap.cfg. ++ ++Report bugs to: tex-k\@tug.org ++TeX Live home page: <http://tug.org/texlive/> ++EOF ++; ++ print &version(); ++ print $usage; ++ exit 0; + } +-__END__ + + ### Local Variables: + ### perl-indent-level: 2 |