From 073e0a71ecac51f34fbae68983f72a5ca46b03ed Mon Sep 17 00:00:00 2001 From: Peter Breitenlohner Date: Tue, 7 Aug 2012 06:31:41 +0000 Subject: Move more tetex linked scripts from texmf/ to texmf-dist/ git-svn-id: svn://tug.org/texlive/trunk@27327 c570f23f-e606-0410-a88d-b1316a301751 --- Build/source/texk/tetex/ChangeLog | 10 + Build/source/texk/tetex/Makefile.am | 33 +- Build/source/texk/tetex/Makefile.in | 160 +- Build/source/texk/tetex/e2pall.man | 55 - .../source/texk/tetex/tests/updmap-cmdline-test.pl | 20 - Build/source/texk/tetex/texdoctk.man | 217 -- Build/source/texk/tetex/thumbpdf.man | 100 - Build/source/texk/tetex/updmap-sys.sh | 30 - Build/source/texk/tetex/updmap.cfg.5 | 135 -- Build/source/texk/tetex/updmap.help2man | 100 - Build/source/texk/tetex/updmap.man | 330 --- Build/source/texk/tetex/updmap.pl | 2163 -------------------- Build/source/texk/texlive/ChangeLog | 5 + Build/source/texk/texlive/Makefile.am | 5 + Build/source/texk/texlive/Makefile.in | 131 +- Build/source/texk/texlive/linked_scripts/ChangeLog | 10 + .../source/texk/texlive/linked_scripts/Makefile.am | 32 +- .../source/texk/texlive/linked_scripts/Makefile.in | 174 +- .../source/texk/texlive/linked_scripts/scripts.lst | 2 + .../texk/texlive/linked_scripts/tetex/e2pall.1 | 55 + .../texk/texlive/linked_scripts/tetex/texdoctk.1 | 217 ++ .../texlive/linked_scripts/tetex/updmap-sys.sh | 30 + .../texk/texlive/linked_scripts/tetex/updmap.1 | 360 ++++ .../texk/texlive/linked_scripts/tetex/updmap.cfg.5 | 135 ++ .../texk/texlive/linked_scripts/tetex/updmap.pl | 2163 ++++++++++++++++++++ .../texlive/linked_scripts/thumbpdf/thumbpdf.1 | 100 + .../texk/texlive/linked_scripts/updmap.help2man | 100 + .../texk/texlive/tests/updmap-cmdline-test.pl | 20 + Master/bin/alpha-linux/updmap | 2 +- Master/bin/alpha-linux/updmap-sys | 2 +- Master/bin/amd64-freebsd/updmap | 2 +- Master/bin/amd64-freebsd/updmap-sys | 2 +- Master/bin/amd64-kfreebsd/updmap | 2 +- Master/bin/amd64-kfreebsd/updmap-sys | 2 +- Master/bin/armel-linux/updmap | 2 +- Master/bin/armel-linux/updmap-sys | 2 +- Master/bin/i386-cygwin/updmap | 2 +- Master/bin/i386-cygwin/updmap-sys | 2 +- Master/bin/i386-freebsd/updmap | 2 +- Master/bin/i386-freebsd/updmap-sys | 2 +- Master/bin/i386-kfreebsd/updmap | 2 +- Master/bin/i386-kfreebsd/updmap-sys | 2 +- Master/bin/i386-linux/updmap | 2 +- Master/bin/i386-linux/updmap-sys | 2 +- Master/bin/i386-solaris/updmap | 2 +- Master/bin/i386-solaris/updmap-sys | 2 +- Master/bin/mipsel-linux/updmap | 2 +- Master/bin/mipsel-linux/updmap-sys | 2 +- Master/bin/powerpc-aix/updmap | 2 +- Master/bin/powerpc-aix/updmap-sys | 2 +- Master/bin/powerpc-linux/updmap | 2 +- Master/bin/powerpc-linux/updmap-sys | 2 +- Master/bin/sparc-solaris/updmap | 2 +- Master/bin/sparc-solaris/updmap-sys | 2 +- Master/bin/universal-darwin/updmap | 2 +- Master/bin/universal-darwin/updmap-sys | 2 +- Master/bin/x86_64-darwin/updmap | 2 +- Master/bin/x86_64-darwin/updmap-sys | 2 +- Master/bin/x86_64-linux/updmap | 2 +- Master/bin/x86_64-linux/updmap-sys | 2 +- Master/bin/x86_64-solaris/updmap | 2 +- Master/bin/x86_64-solaris/updmap-sys | 2 +- Master/texmf-dist/scripts/tetex/updmap-sys.sh | 30 + Master/texmf-dist/scripts/tetex/updmap.pl | 2163 ++++++++++++++++++++ Master/texmf/scripts/tetex/updmap-sys.sh | 30 - Master/texmf/scripts/tetex/updmap.pl | 2163 -------------------- Master/tlpkg/tlpsrc/tetex.tlpsrc | 4 +- 67 files changed, 5771 insertions(+), 5579 deletions(-) delete mode 100644 Build/source/texk/tetex/e2pall.man delete mode 100755 Build/source/texk/tetex/tests/updmap-cmdline-test.pl delete mode 100644 Build/source/texk/tetex/texdoctk.man delete mode 100644 Build/source/texk/tetex/thumbpdf.man delete mode 100755 Build/source/texk/tetex/updmap-sys.sh delete mode 100644 Build/source/texk/tetex/updmap.cfg.5 delete mode 100644 Build/source/texk/tetex/updmap.help2man delete mode 100644 Build/source/texk/tetex/updmap.man delete mode 100755 Build/source/texk/tetex/updmap.pl create mode 100644 Build/source/texk/texlive/linked_scripts/tetex/e2pall.1 create mode 100644 Build/source/texk/texlive/linked_scripts/tetex/texdoctk.1 create mode 100755 Build/source/texk/texlive/linked_scripts/tetex/updmap-sys.sh create mode 100644 Build/source/texk/texlive/linked_scripts/tetex/updmap.1 create mode 100644 Build/source/texk/texlive/linked_scripts/tetex/updmap.cfg.5 create mode 100755 Build/source/texk/texlive/linked_scripts/tetex/updmap.pl create mode 100644 Build/source/texk/texlive/linked_scripts/thumbpdf/thumbpdf.1 create mode 100644 Build/source/texk/texlive/linked_scripts/updmap.help2man create mode 100755 Build/source/texk/texlive/tests/updmap-cmdline-test.pl create mode 100755 Master/texmf-dist/scripts/tetex/updmap-sys.sh create mode 100755 Master/texmf-dist/scripts/tetex/updmap.pl delete mode 100755 Master/texmf/scripts/tetex/updmap-sys.sh delete mode 100755 Master/texmf/scripts/tetex/updmap.pl diff --git a/Build/source/texk/tetex/ChangeLog b/Build/source/texk/tetex/ChangeLog index abdc49b7cb4..2c6d0aed2ad 100644 --- a/Build/source/texk/tetex/ChangeLog +++ b/Build/source/texk/tetex/ChangeLog @@ -1,3 +1,13 @@ +2012-08-07 Peter Breitenlohner + + * tests/, updmap* (removed): Moved from here to ../texlive/. + * Makefile.am: Adapted. + +2012-08-06 Peter Breitenlohner + + * e2pall.man, texdoctk.man, texdoctk.man: Moved to ../texlive/. + * Makefile.am: Adapted. + 2012-08-04 Karl Berry * tl-sys-wrapper: not needed. The Windows wrapper, runscript.tlu, diff --git a/Build/source/texk/tetex/Makefile.am b/Build/source/texk/tetex/Makefile.am index 2f82752bf0a..a969da396ee 100644 --- a/Build/source/texk/tetex/Makefile.am +++ b/Build/source/texk/tetex/Makefile.am @@ -7,11 +7,9 @@ ACLOCAL_AMFLAGS = -I ../../m4 EXTRA_DIST = -perl_scripts = \ - updmap +perl_scripts = -shell_scripts = \ - updmap-sys +shell_scripts = sh_scripts = \ allcm \ @@ -52,7 +50,6 @@ dist_man1_MANS = \ allneeded.man \ dvi2fax.man \ dvired.man \ - e2pall.man \ fmtutil.man \ fontinst.man \ kpsetool.man \ @@ -62,14 +59,10 @@ dist_man1_MANS = \ rubibtex.man \ rumakeindex.man \ texconfig.man \ - texdoctk.man \ - texlinks.man \ - thumbpdf.man \ - updmap.man + texlinks.man dist_man5_MANS = \ - fmtutil.cnf.5 \ - updmap.cfg.5 + fmtutil.cnf.5 texconfigdir = $(datarootdir)/texmf/texconfig dist_texconfig_SCRIPTS = tcfmgr @@ -88,8 +81,7 @@ include $(top_srcdir)/../am/bin_links.am man1_links = $(bin_links) \ fmtutil:fmtutil-sys \ - texconfig:texconfig-sys \ - updmap:updmap-sys + texconfig:texconfig-sys include $(top_srcdir)/../am/man1_links.am @@ -125,18 +117,3 @@ if !WIN32 PATH="$(DESTDIR)$(bindir):$(PATH)"; export PATH; $(run_texlinks) endif !WIN32 -## Generate the updmap man page using help2man plus a bit of -## handwritten material. But don't actually update updmap.man, -## we don't want to require help2man for an install. Leave that to be -## done by hand. -.PHONY: xupdmap.man -xupdmap.man: updmap.help2man updmap.pl - help2man --include=$< --source="TeX Live" --no-info \ - $(srcdir)/updmap.pl >/tmp/$@ -EXTRA_DIST += updmap.help2man - -## Tests -## -TESTS = tests/updmap-cmdline-test.pl -EXTRA_DIST += $(TESTS) - diff --git a/Build/source/texk/tetex/Makefile.in b/Build/source/texk/tetex/Makefile.in index 1ac3a78edeb..11f70358443 100644 --- a/Build/source/texk/tetex/Makefile.in +++ b/Build/source/texk/tetex/Makefile.in @@ -123,10 +123,6 @@ man5dir = $(mandir)/man5 NROFF = nroff MANS = $(dist_man1_MANS) $(dist_man5_MANS) DATA = $(dist_texconfig_DATA) $(dist_web2c_DATA) -am__tty_colors_dummy = \ - mgn= red= grn= lgn= blu= brg= std=; \ - am__color_tests=no -am__tty_colors = $(am__tty_colors_dummy) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) @@ -231,13 +227,9 @@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ACLOCAL_AMFLAGS = -I ../../m4 EXTRA_DIST = ../../build-aux/relpath README.texdoctk old-fontinst.bat \ - old-updmap updmap-single.pl updmap.help2man $(TESTS) -perl_scripts = \ - updmap - -shell_scripts = \ - updmap-sys - + old-updmap updmap-single.pl +perl_scripts = +shell_scripts = sh_scripts = \ allcm \ allneeded \ @@ -272,7 +264,6 @@ dist_man1_MANS = \ allneeded.man \ dvi2fax.man \ dvired.man \ - e2pall.man \ fmtutil.man \ fontinst.man \ kpsetool.man \ @@ -282,14 +273,10 @@ dist_man1_MANS = \ rubibtex.man \ rumakeindex.man \ texconfig.man \ - texdoctk.man \ - texlinks.man \ - thumbpdf.man \ - updmap.man + texlinks.man dist_man5_MANS = \ - fmtutil.cnf.5 \ - updmap.cfg.5 + fmtutil.cnf.5 texconfigdir = $(datarootdir)/texmf/texconfig dist_texconfig_SCRIPTS = tcfmgr @@ -304,14 +291,12 @@ bin_links = \ man1_links = $(bin_links) \ fmtutil:fmtutil-sys \ - texconfig:texconfig-sys \ - updmap:updmap-sys + texconfig:texconfig-sys run_texlinks = $(DESTDIR)$(bindir)/texlinks -v \ -f $(DESTDIR)$(web2cdir)/fmtutil.cnf \ -e "$(EXEEXT)" $(DESTDIR)$(bindir) -TESTS = tests/updmap-cmdline-test.pl all: all-am .SUFFIXES: @@ -623,99 +608,6 @@ CTAGS: cscope cscopelist: -check-TESTS: $(TESTS) - @failed=0; all=0; xfail=0; xpass=0; skip=0; \ - srcdir=$(srcdir); export srcdir; \ - list=' $(TESTS) '; \ - $(am__tty_colors); \ - if test -n "$$list"; then \ - for tst in $$list; do \ - if test -f ./$$tst; then dir=./; \ - elif test -f $$tst; then dir=; \ - else dir="$(srcdir)/"; fi; \ - if $(TESTS_ENVIRONMENT) $${dir}$$tst $(AM_TESTS_FD_REDIRECT); then \ - all=`expr $$all + 1`; \ - case " $(XFAIL_TESTS) " in \ - *[\ \ ]$$tst[\ \ ]*) \ - xpass=`expr $$xpass + 1`; \ - failed=`expr $$failed + 1`; \ - col=$$red; res=XPASS; \ - ;; \ - *) \ - col=$$grn; res=PASS; \ - ;; \ - esac; \ - elif test $$? -ne 77; then \ - all=`expr $$all + 1`; \ - case " $(XFAIL_TESTS) " in \ - *[\ \ ]$$tst[\ \ ]*) \ - xfail=`expr $$xfail + 1`; \ - col=$$lgn; res=XFAIL; \ - ;; \ - *) \ - failed=`expr $$failed + 1`; \ - col=$$red; res=FAIL; \ - ;; \ - esac; \ - else \ - skip=`expr $$skip + 1`; \ - col=$$blu; res=SKIP; \ - fi; \ - echo "$${col}$$res$${std}: $$tst"; \ - done; \ - if test "$$all" -eq 1; then \ - tests="test"; \ - All=""; \ - else \ - tests="tests"; \ - All="All "; \ - fi; \ - if test "$$failed" -eq 0; then \ - if test "$$xfail" -eq 0; then \ - banner="$$All$$all $$tests passed"; \ - else \ - if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ - banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ - fi; \ - else \ - if test "$$xpass" -eq 0; then \ - banner="$$failed of $$all $$tests failed"; \ - else \ - if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ - banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ - fi; \ - fi; \ - dashes="$$banner"; \ - skipped=""; \ - if test "$$skip" -ne 0; then \ - if test "$$skip" -eq 1; then \ - skipped="($$skip test was not run)"; \ - else \ - skipped="($$skip tests were not run)"; \ - fi; \ - test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ - dashes="$$skipped"; \ - fi; \ - report=""; \ - if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ - report="Please report to $(PACKAGE_BUGREPORT)"; \ - test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ - dashes="$$report"; \ - fi; \ - dashes=`echo "$$dashes" | sed s/./=/g`; \ - if test "$$failed" -eq 0; then \ - col="$$grn"; \ - else \ - col="$$red"; \ - fi; \ - echo "$${col}$$dashes$${std}"; \ - echo "$${col}$$banner$${std}"; \ - test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \ - test -z "$$report" || echo "$${col}$$report$${std}"; \ - echo "$${col}$$dashes$${std}"; \ - test "$$failed" -eq 0; \ - else :; fi - distdir: $(DISTFILES) @list='$(MANS)'; if test -n "$$list"; then \ list=`for p in $$list; do \ @@ -886,7 +778,6 @@ distcleancheck: distclean $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am - $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(SCRIPTS) $(MANS) $(DATA) installdirs: @@ -1003,23 +894,23 @@ uninstall-am: uninstall-dist_binSCRIPTS uninstall-dist_texconfigDATA \ $(MAKE) $(AM_MAKEFLAGS) uninstall-hook uninstall-man: uninstall-man1 uninstall-man5 -.MAKE: check-am install-am install-data-am install-exec-am \ - install-strip uninstall-am - -.PHONY: all all-am am--refresh check check-TESTS check-am clean \ - clean-generic dist dist-all dist-bzip2 dist-gzip dist-lzip \ - dist-shar dist-tarZ dist-xz dist-zip distcheck distclean \ - distclean-generic distcleancheck distdir distuninstallcheck \ - dvi dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-data-hook \ - install-dist_binSCRIPTS install-dist_texconfigDATA \ - install-dist_texconfigSCRIPTS install-dist_texmfSCRIPTS \ - install-dist_web2cDATA install-dvi install-dvi-am install-exec \ - install-exec-am install-exec-hook install-html install-html-am \ - install-info install-info-am install-man install-man1 \ - install-man5 install-nodist_binSCRIPTS install-pdf \ - install-pdf-am install-ps install-ps-am install-strip \ - installcheck installcheck-am installdirs maintainer-clean \ +.MAKE: install-am install-data-am install-exec-am install-strip \ + uninstall-am + +.PHONY: all all-am am--refresh check check-am clean clean-generic dist \ + dist-all dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ \ + dist-xz dist-zip distcheck distclean distclean-generic \ + distcleancheck distdir distuninstallcheck dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-data-hook install-dist_binSCRIPTS \ + install-dist_texconfigDATA install-dist_texconfigSCRIPTS \ + install-dist_texmfSCRIPTS install-dist_web2cDATA install-dvi \ + install-dvi-am install-exec install-exec-am install-exec-hook \ + install-html install-html-am install-info install-info-am \ + install-man install-man1 install-man5 \ + install-nodist_binSCRIPTS install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am uninstall uninstall-am \ uninstall-dist_binSCRIPTS uninstall-dist_texconfigDATA \ @@ -1105,11 +996,6 @@ uninstall-hook: uninstall-bin-links uninstall-links uninstall-man1-links run-texlinks: @WIN32_FALSE@ PATH="$(DESTDIR)$(bindir):$(PATH)"; export PATH; $(run_texlinks) -.PHONY: xupdmap.man -xupdmap.man: updmap.help2man updmap.pl - help2man --include=$< --source="TeX Live" --no-info \ - $(srcdir)/updmap.pl >/tmp/$@ - # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: diff --git a/Build/source/texk/tetex/e2pall.man b/Build/source/texk/tetex/e2pall.man deleted file mode 100644 index b102568b53a..00000000000 --- a/Build/source/texk/tetex/e2pall.man +++ /dev/null @@ -1,55 +0,0 @@ -.TH "e2pall" "1" "August 2000" "teTeX" "teTeX" -.PP -.SH "NAME" -e2pall \- convert all EPS files in a LaTeX document to PDF -.PP -.SH "SYNOPSIS" -.PP -\fBe2pall\fP \fITEXFILE\fP -.PP -.SH "DESCRIPTION" -.PP -\fBe2pall\fP searches through \fITEXFILE\fP for \eincludegraphics -commands to find the base names of image files\&. When it finds one, -\fBe2pall\fP runs \fBepstopdf\fP(1) to create a PDF file from the EPS -file\&. -.PP -\fBe2pall\fP will check to be sure that an existing PDF file is -up-to-date with the EPS file, and will not run \fBepstopdf\fP(1) if -the PDF file is newer than the EPS file\&. -.PP -.SH "BUGS" -.PP -.IP "" -Seems to be broken -.IP "" -Cannot handle \einput{\fIfilename\fP} or -\eincludegraphics{\fIfilename\fP} split over more than one -line -.IP "" -Must be run from same directory as the LaTeX file -.IP "" -Does not look down $TEXINPUTS -.IP "" -Cannot handle documents that use \einclude commands -.IP "" -Assumes \fIall\fP files included with \eincludegraphics are EPS -files -.IP -.PP -.SH "SEE ALSO" -.PP -\fBepstopdf\fP(1) -.PP -.SH "AUTHOR" -.PP -\fBe2pall\fP was written by Jody Klymak and published in a posting to -the (mailing list)\&. -.PP -This manual page was written by C\&.M\&. Connelly -, for -the Debian GNU/Linux system\&. It may be used by other distributions -without contacting the author\&. Any mistakes or omissions in the -manual page are my fault; inquiries about or corrections to this -manual page should be directed to me (and not to the primary author)\&. -.PP diff --git a/Build/source/texk/tetex/tests/updmap-cmdline-test.pl b/Build/source/texk/tetex/tests/updmap-cmdline-test.pl deleted file mode 100755 index 3875fb760e6..00000000000 --- a/Build/source/texk/tetex/tests/updmap-cmdline-test.pl +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env perl -# $Id$ -# Public domain. Originally written 2011, Karl Berry. -# Check that updmap can parse various cmdline invocations. - -# srcdir = tetex (in the source tree) -BEGIN { chomp ($srcdir = $ENV{"srcdir"} || `cd \`dirname $0\`/.. && pwd`); } -require "$srcdir/../tests/common-test.pl"; - -exit (&main ()); - -sub main { - my $ret = &test_run ("$srcdir/updmap.pl", "--version"); - - # we aren't going to fix this in the current updmap.pl. - # "foo", "--enable Map" - # "-n", "--quiet", - my $bad = $ret != 0; - return $bad; -} diff --git a/Build/source/texk/tetex/texdoctk.man b/Build/source/texk/tetex/texdoctk.man deleted file mode 100644 index e7aebb7098a..00000000000 --- a/Build/source/texk/tetex/texdoctk.man +++ /dev/null @@ -1,217 +0,0 @@ -.TH TEXDOCTK 1 -.SH NAME -texdoctk \- GUI for easier access of TeX package and program documentations -.SH SYNOPSIS -.B texdoctk --[aq] -.SH "DESCRIPTION" -.B texdoctk -is a GUI for easier access to a large part of the vast amount -of package and program documentations and tutorials for TeX and its -different derivatives (mainly LaTeX). It is optimized and included in -the teTeX and fpTeX distributions and also available with TeXLive. -.PP -The documentation is grouped into 17 categories; the 18th button of the main -panel is inactive by default and intended for use with local additions (see -section -.B CONFIGURATION -below). -.PP -In the settings window you see a checkbox in the html->ps and text->ps -converter menus for switching on/off output redirect. This is due to the fact -that some converters do not write their output into a file but to stdout by -default, so a redirect is needed, e.g. -.PP -a2ps myfile.txt >myfile.ps -.SH "OPTIONS" -.TP -.I "\-v" -verbose: enable some viewer messages which are otherwise sent to stderr, -as well as some warning popup windows. This can also be set in a -configuration file. -.TP -.I "\-a" -autoview: autostart viewer if a listbox contains only one item (this will -frequently happen in search results). This can also be set in a configuration -file. -.SH "CONFIGURATION" -.PP -The configuration is controlled by the system default configuration file -($TEXMFMAIN)/texdoctk/texdocrc.defaults, most of whose entries can though be -overridden by the users' own optional ~/.texdocrc files and/or command line -options. -.SS The Settings menu and configuration files -.PP -The Settings menu is used to change the user-definable settings of \fBtexdoctk\fP -for the duration of the program call or as new defaults. The latter case is -the purpose of the Save button, which generates or rewrites the user's own -~/.texdocrc file. The system defaults cannot be edited with the Settings -menu. -.TP -Paths -The TEXMF-type paths on the system are reported, and the user can specify the -name of the subdirectory of $HOMETEXMF, where the personal documentation is -stored. -.TP -General viewer behaviour - -.I Suppress error messages -toggle verbose mode (see option -v); default is off. - -.I Autostart viewer for one-item listboxes -if a listbox contains only one item (see option -a) - -.I Use text viewer for unknown file format -i.e. treat the file as plain text. \fBtexdoctk\fP should recognize the usual file -formats and also relate names like README to plain text, but some docs may have -freely invented names. Default is on; if switched off, trying to view such -files will raise an error. The switch does not influence printing: unrecognized -formats cannot be printed. - -.I Change viewer colours -using either RGB triplets in the format #rrggbb or the standardized names. -.TP -DVI/PostScript/PDF/HTML/Plain text -For text files, \fBtexdoctk\fP provides an own viewer. If this viewer is disabled, -but no alternative viewer is specified, \fBtexdoctk\fP tries to read the content -of the environment variable $PAGER. - -If you want to print the documentations, you will need converters to turn -non-PS files into PostScript. Here are some suggestions: - -\& dvi->ps: -dvips (is part of teTeX) (http://www.radicaleye.com/dvips.html) - -\& pdf->ps: -pdf2ps (http://www.cs.wisc.edu/~ghost) or -Acrobat Reader (http://www.adobe.com) - -\& html->ps: html2ps (http://user.it.uu.se/~jan/html2ps.html) - -\& plain text->ps: a2ps (http://www-inf.enst.fr/~demaille/a2ps/) - -The html->ps and text->ps converter menus for switching on/off output redirect. -This is due to the fact that some converters do not write their output into a -file but to stdout by default, so a redirect is needed, e.g. -.B a2ps myfile.txt >myfile.ps -.PP -The system-wide configuration file is ($TEXMFMAIN)/texdoctk/texdocrc.defaults -and should only be writable by the administrator of the installation using any -text editor. The optional user configuration file is ~/.texdocrc and can -override all but those system settings which affect the installation as a -whole. The preferred way of changing it is through the Settings menu. -.SS The databases -\fBtexdoctk\fP comes with a default database file ($TEXMFMAIN)/texdoctk/texdoctk.dat -with a special format. It is divided into 17 sections corresponding to the -17 buttons that are active by default. Each section begins with a line - -@\fIsection_name\fP - -where -.I section_name -is the text as it appears in the button. This title is -followed by the descriptive entries for each documentation, which have this -format: - -\fIpackage-label\fP;Short description for listbox (opt. \fIpackage-name\fP);path in doc directory;optional keywords - -(without breaking the line!). Comments (initiated with a #) and empty lines -are ignored by the program. The second field is the text displayed in the -selection listboxes of \fBtexdoctk\fP, and you will usually want to mention the name -of the package in parens along with it; the first field is a \fBunique\fP label -for the package for internal use of the program which will usually be chosen -identical to the package name, but can be different if there is more than one -documentation file coming with a package. -.PP -The administrator will probably install additional packages in the local texmf -tree. The corresponding documentation can be made accessible by an additional -database $TEXMFLOCAL/texdoctk/texdoctk-local.dat. Furthermore, individual -users possibly install additional packages in an texmf subdirectory of their -$HOME, for which they can make an individual database themselves as -$TEXMFHOME/texdoctk/texdoctk-pers.dat. After creating such files, texhash -must be executed. -.PP -Both types of databases must have the same structure as the system database, -although they need (and should) not include all its sections if there are no -additional entries. For example, if the the package -.I foo -is added to the local tree such that its documentation file is -($TEXMFLOCAL)/doc/latex/foo/foo.dvi and it is decided that it fits best into -the existing category Graphics, texdoctk-local.dat would look like this: - -@Graphics -.br -foo;Create bells and whistles (foo);latex/foo/foo.dvi;decoration - -The entry for -.I foo -will then be appended to the list of entries in the Graphics category. The 18th -button can be activated in the same way, but using a new category name; -possible entries at the beginning of the database which have not been assigned -to a category will be assigned to the default Miscellaneous, making the 18th -button active with that label. Note that you cannot have more than 18 -categories; if there are more, only the one defined last will appear and be -used. -.PP -If the documentation is included in the .sty file instead of a proper -documentation file, the optional keywords should start with --?- directly after the semicolon, where ? is 0, 1, 2 or 3; these are flags -which indicate in which part of the .sty the instructions are placed and -should help \fBtexdoctk\fP to extract the documentation from the style and present -it without the code, which would normally be of little use. -.TP -0 -no specific place, scattered between the code -.TP -1 -at end, behind \\endinput; some .sty files have well-organized documentation -behind the end of the actual code, where TeX doesn't see it upon compilation -.TP -2 -at beginning, terminated by %%%%%%; in some other cases, some usage information -is at the beginning of the .sty as a comment terminated by a line full of % -.TP -3 -as 2, but with a blank line as termination -.PP -See the system database for plenty of examples. - -.SH "FILES" -.PP -\& $TEXMFMAIN/texdoctk/texdocrc.defaults -system-wide configuration file -.PP -\& ~/.texdocrc -(optional) personal configuration file; can also be created with the Settings menu -.PP -\& $TEXMFMAIN/texdoctk/texdoctk.dat -default database file for documentation files of the distribution -.PP -\& $TEXMFLOCAL/texdoctk/texdoctk-local.dat -(optional) local database file for documentation files -.PP -\& $TEXMFHOME/texdoctk/texdoctk-pers.dat -(optional) personal database file of individual users for documentation files -.SH BUGS -Widget placement in topic toplevels becomes ugly when the toplevel is stretched -or shrunk. -.PP -The font in the frame labels of the Settings menu are not forced to the default -font; this will become visible e.g. at hi-res screens, where the label font is -not scaled up. -.PP -Netscape and Mozilla error output will be written to stderr even if the quiet -mode was set. -.SH AUTHOR -.B texdoctk -was written by Thomas Ruedas . -.PP -This manual page was originally written by Adrian Bunk for -the Debian GNU/Linux system (but may be used by others). It is now maintained -by Thomas Ruedas. - -.SH COPYRIGHT -Copyright (C) 2000-2004 Thomas Ruedas -.br -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. diff --git a/Build/source/texk/tetex/thumbpdf.man b/Build/source/texk/tetex/thumbpdf.man deleted file mode 100644 index d1d7e358f9a..00000000000 --- a/Build/source/texk/tetex/thumbpdf.man +++ /dev/null @@ -1,100 +0,0 @@ -.TH "thumbpdf" "1" "September 2000" "teTeX" "teTeX" -.PP -.SH "NAME" -thumbpdf \- generate thumbnail images for a PDF file -created with \fBpdftex\fP -.PP -.SH "SYNOPSIS" -.PP -\fBthumbpdf\fP [ \fIOPTION\fP\&.\&.\&. ] \fIPDF_FILE\fP -.PP -.SH "DESCRIPTION" -.PP -\fBthumbpdf\fP is used to create thumbnail images of individual pages -within a PDF (Portable Document Format) document\&. -.PP -.SH "USAGE" -.PP -First run \fBpdftex\fP(1) on your document to create a PDF file\&. -Then run \fBthumbpdf\fP to generate the thumbnails, a PDF file -containing the thumbnails, and a pdfTeX file to include the thumbnails -in the PDF file\&. Finally, run \fBpdftex\fP(1) on your file again to -create the final PDF file\&. -.PP -\fBthumbpdf\fP calls \fBgs\fP(1) to generate PNG images of the pages -within \fIPDF_FILE\fP, and \fBpdftex\fP(1) to create a PDF file -containing the thumbnail images\&. -.PP -.SH "OPTIONS" -.PP -.IP "\fB--help\fP" -print usage -.IP "\fB--(no)makepng\fP" -make PNG thumbnail images (default: true) -.IP "\fB--(no)makepdf\fP" -generate new PDF file containing the -thumbnails (default: true) -.IP "\fB--(no)makedef\fP" -create a TeX file for \fBpdftex\fP(1) to -read in (default: true) -.IP "\fB--(no)quiet\fP" -suppress messages (default: false) -.IP "\fB--(no)verbose\fP" -verbose messages (default: false) -.IP "\fB--(no)debug\fP" -print debugging information while parsing -(default: false) -.IP "\fB--resolution\fP \fIres\fP" -resolution for GhostScript step -(default: 9) -.IP "\fB--compress\fP \fIn\fP" -\epdfcompresslevel for \fBthumbpdf\&.pdf\fP -(0-9; default: 9) -.IP "\fB--device\fP | \fBpng\fP\fIdev\fP" -GhostScript PNG device; -\fIdev\fP = `mono\', `gray\', -`16\', `256\', `16m\' (default: -`png16m\') -.PP -.SH "FILES" -.PP -.IP "\fIthumb\fPnn\fI\&.png\fP" -PNG thumbnail images -.IP "\fIthumbpdf\&.pdf\fP" -PDF file containing thumbnail images -.IP "\fIthumbpdf\&.tex\fP" -A pdfTeX program to include the thumbnails -file -.IP "\fIthumbpdf\&.log\fP" -pdfTeX log file -.IP "\fIthumbpdf\&.sty\fP" -a LaTeX package to be included in files -for which a user wants to generate thumbnails -.PP -.SH "SEE ALSO" -.PP -\fBgs\fP(1), \fBpdftex\fP(1)\&. -.PP -Web page: -.PP -.SH "BUGS" -.PP -None known, but report any bugs found to the author\&. -.PP -.SH "COPYRIGHT" -.PP -Copyright © 1999\&. \fBthumbpdf\fP is distributed under -version 1, or (at your option) a later version of the LaTeX Project -Public License\&. -.PP -.SH "AUTHOR" -.PP -\fBthumbpdf\fP was written by Heiko Oberdiek -\&. -.PP -This manual page was written by C\&.M\&. Connelly -, for -the Debian GNU/Linux system\&. It may be used by other distributions -without contacting the author\&. Any mistakes or omissions in the -manual page are my fault; inquiries about or corrections to this -manual page should be directed to me (and not to the primary author)\&. diff --git a/Build/source/texk/tetex/updmap-sys.sh b/Build/source/texk/tetex/updmap-sys.sh deleted file mode 100755 index 6f3c8365658..00000000000 --- a/Build/source/texk/tetex/updmap-sys.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/sh - -# updmap-sys: Thomas Esser, public domain. - -# wrapper script for updmap with TEXMFVAR and TEXMFCONFIG set to -# TEXMFSYSVAR / TEXMFSYSCONFIG - -test -f /bin/ksh && test -z "$RUNNING_KSH" \ - && { UNAMES=`uname -s`; test "x$UNAMES" = xULTRIX; } 2>/dev/null \ - && { RUNNING_KSH=true; export RUNNING_KSH; exec /bin/ksh $0 ${1+"$@"}; } -unset RUNNING_KSH - -test -f /bin/bsh && test -z "$RUNNING_BSH" \ - && { UNAMES=`uname -s`; test "x$UNAMES" = xAIX; } 2>/dev/null \ - && { RUNNING_BSH=true; export RUNNING_BSH; exec /bin/bsh $0 ${1+"$@"}; } -unset RUNNING_BSH - -export PATH - -# hack around a bug in zsh: -test -n "${ZSH_VERSION+set}" && alias -g '${1+"$@"}'='"$@"' - -v=`kpsewhich -var-value TEXMFSYSVAR` -c=`kpsewhich -var-value TEXMFSYSCONFIG` - -TEXMFVAR="$v" -TEXMFCONFIG="$c" -export TEXMFVAR TEXMFCONFIG - -exec updmap ${1+"$@"} diff --git a/Build/source/texk/tetex/updmap.cfg.5 b/Build/source/texk/tetex/updmap.cfg.5 deleted file mode 100644 index 0d8c90b5412..00000000000 --- a/Build/source/texk/tetex/updmap.cfg.5 +++ /dev/null @@ -1,135 +0,0 @@ -.\" Hey, Emacs! This is an -*- nroff -*- source file. -.\" -.\" Copyright (C) 2004, 2012 Hilmar Preusse -.\" -.\" This is free software; you can redistribute it and/or modify it under -.\" the terms of the GNU General Public License as published by the Free -.\" Software Foundation; either version 2, or (at your option) any later -.\" version. -.\" -.\" This is distributed in the hope that it will be useful, but WITHOUT -.\" ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -.\" FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -.\" for more details. -.\" -.\" You should have received a copy of the GNU General Public License -.\" along with this program. if not, see . -.\" -.TH "UPDMAP.CFG" "12" "March 2012" "TeX Live" "TeX Live" -.SH "NAME" -\fBupdmap.cfg\fR \- configuration of font mapping/inclusion for dvips and -friends. -.SH "DESCRIPTION" -The file \fBupdmap.cfg\fR is the central font configuration file of a -teTeX system and is read by \fBupdmap\fP(1). It describes if and how -fonts should be included (or not included) into PS-/PDF-files. This -works for Outline (Postscript Type1) and Bitmap Fonts (Postscript -Type3) mostly coming from MetaFont. -.PP -\fBupdmap\fP is a utility that creates font configuration files for -\fBdvips\fP(1), \fBpdftex\fP(1), \fBxdvi\fP(1), \fBps2pk\fP(1), -\fBgsftopk\fP(1), \fBdvipdfm\fP(1) and (soon) \fBdvipdfmx\fP(1)\&. In -an ideal world, updmap would be unnecessary -- each of these programs -would read the same configuration file to learn what fonts are -available and how they should be treated\&. As things stand, however, -each of these tools has subtly different requirements and thereby -needs its own font configuration file\&. \fBupdmap\fP creates font -configuration files for all of these programs from a single source, -\fBupdmap.cfg\fR, allowing you to easily keep all the different -configuration files in sync\&. -.P -\fBdvipsPreferOutline\fR -.br -Configures if \fBdvips\fR (by default) should 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 -can be forced by putting "p psfonts_pk.map" into a config file. We provide -such config files which can be enabled via -\fBdvips\fR \fI-Poutline\fR (resp. \fBdvips\fR \fI-Ppk\fR). -.br -Valid settings for dvipsPreferOutline are \fItrue\fR / \fIfalse\fR. -.P -\fBLW35\fR -.br -Which fonts of the "Basic 35 Laserwriter Fonts" do you want to use and -how are the filenames chosen? Valid settings: -.br -URW: URW fonts with "vendor" filenames (e.g. n019064l.pfb) -.br -URWkb: URW fonts with "berry" filenames (e.g. uhvbo8ac.pfb) -.br -ADOBE: Adobe fonts with "vendor" filenames (e.g. hvnbo___.pfb) -.br -ADOBEkb: Adobe fonts with "berry" filenames (e.g. phvbo8an.pfb) -.P -\fBdvipsDownloadBase\fR -.br -Configures if \fBdvips\fR (by default) should download the standard 35 LaserWriter -fonts into the document (set \fItrue\fR) or should these fonts be used from the ps -interpreter / printer (set \fIfalse\fR). -.br -The user can override the default by specifying \fBdvips\fR \fI-Pdownload35\fR -(resp. \fBdvips\fR \fI-Pbuiltin35\fR) to download the LW35 fonts -(resp. use the built-in fonts). -.br -Valid settings are \fItrue\fR / \fIfalse\fR. -.P -\fBpdftexDownloadBase14\fR -.br -Should \fBpdftex\fR 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. -.br -Valid settings are \fItrue\fR (download the fonts) or \fIfalse\fR (don't -download the fonts). Adobe recommends to embed all fonts. -.P -\fBdvipdfmDownloadBase14\fR -.br -Should \fBdvipdfm\fR 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. -.br -Valid settings are \fItrue\fR (download the fonts) or \fIfalse\fR (don't -download the fonts). -.P -\fBMap\fR -.br -Points to a map file, which describes a mapping from a font (called in the TeX -document) to the pfb file containing the Postscript code. -.br -Usage: \fBMap\fR filename.map -.P -The syntax of map files is the same as \fBdvips\fP(1) uses, see -section 6.4, "'psfonts.map': PostScript font catalog" in the manual of -\fBdvips\fP(1), available as info and pdf file. -.P -\fBMixedMap\fR -.br -Similar to \fBMap\fR. It should be used when there is Type1 and a bitmap -implementation of the font (the latter mostly coming from MetaFont). These -entries will not be used in the default map of \fBdvips\fR if -\fBdvipsPreferOutline\fR is set to \fIfalse\fR. -.br -Usage: \fBMixedMap\fR filename.map -.P -The sign \fB#\fR precedes a comment. -.P -Not used Map files should be commented out using the string \fB#!\fR at the -beginning of the line. These entries can be (de-)activated using \fBupdmap\fR -with the options \fI--enable\fR and \fI--disable\fR. -.SH "SPECIAL TO DEBIAN" -In Debian the file \fBupdmap.cfg\fR is a generated file sitting in /var. It is -generated by concatenating the *.cfg files from /etc/texmf/updmap.d/. These -files follow the syntax of updmap.cfg, but contain only parts of it. -.SH "AUTHOR" -This manual page was written by Hilmar Preusse , for -the Debian GNU/Linux system by simply copying the comments from -\fBupdmap.cfg\fR and rewriting some of them. It may be used by other -distributions without contacting the author. Any mistakes or omissions in -the manual page are my fault; inquiries about or corrections to this manual -page should be directed to me (and not to the primary author). -.SH "SEE ALSO" -updmap(1), info page of dvips(1) -.SH "THANKS TO" -Frank Kuester, -Thomas Esser. diff --git a/Build/source/texk/tetex/updmap.help2man b/Build/source/texk/tetex/updmap.help2man deleted file mode 100644 index 4864c2d74f4..00000000000 --- a/Build/source/texk/tetex/updmap.help2man +++ /dev/null @@ -1,100 +0,0 @@ -# $Id$ -# This help2man auxiliary file is in the public domain. -# Originally created by Karl Berry. -# The FILES text from Claire Connelly. -# See the Makefile for the help2man invocation. -# do not fill the long TEXMF* tables. - -[NAME] -updmap \- manage TeX font maps, per-user -.br -updmap-sys \- manage TeX font maps, system-wide - -/in the final output/ -.SH ENVIRONMENT - -/in the given order/ -.nf - -/where YYYY is/ -.fi - -/give the -n option/ -.SH EXAMPLES - -[FILES] -Configuration and input files: -.IP "\fIupdmap\&.cfg\fP" -Main configuration file\&. In -\fItexmf/web2c\fP by default, but may be located elsewhere -depending on your distribution\&. Each texmf tree read should have its -own \fIupdmap.cfg\fP. -.IP "\fIdvips35\&.map\fP" -Map file for standard 35 PostScript fonts for -use with \fBdvips\fP(1)\&. -.IP "\fIpdftex35\&.map\fP" -Map file for standard 35 PostScript fonts for -use with \fBpdftex\fP(1)\&. -.IP "\fIps2pk35\&.map\fP" -Map file for standard 35 PostScript fonts for -use with \fBps2pk\fP(1)\&. -.PP -Output files: -.IP "\fIpsfonts\&.map\fP" -For \fBdvips\fP(1)\&. -Same as \fIpsfonts_t1\&.map\fP if option \fBdvipsPreferOutline\fP active, -else as \fIpsfonts_pk\&.map\fP. -.IP "\fIpsfonts_pk\&.map\fP" -For \fBdvips\fP(1)\&. -Without information from MixedMap files\&. -(Setting of \fBdvipsPreferOutline\fP ignored\&.) -.IP "\fIpsfonts_t1\&.map\fP" -For \fBdvips\fP(1)\&. -With information from MixedMap files\&. -(Setting of \fBdvipsPreferOutline\fP ignored\&.) -.IP "\fIdownload35\&.map\fP" -For \fBdvips\fP(1)\&. -Always downloads the standard 35 fonts\&. -(Setting of \fBdvipsDownloadBase35\fP ignored\&.) -.IP "\fIbuiltin35\&.map\fP" -For \fBdvips\fP(1)\&. -Never downloads the standard 35 fonts\&. -(Setting of \fBdvipsDownloadBase35\fP ignored\&.) -.IP "\fIpdftex\&.map\fP" -For \fBpdftex\fP(1)\&. -Same as \fIpdftex_dl14\&.map\fP if option \fBpdftexDownloadBase14\fP active, -else as \fIpdftex_ndl14\&.map\fP. -.IP "\fIpdftex_dl14\&.map\fP" -For \fBpdftex\fP(1)\&. -Always downloads the standard 14 fonts\&. -.IP "\fIpdftex_ndl14\&.map\fP" -For \fBpdftex\fP(1)\&. -Never downloads the standard 14 fonts\&. -.IP "\fIps2pk\&.map\fP" -Similar to \fIpsfonts.map\fP file, but -forces all fonts to be downloaded, so this map file can be used with -\fBxdvi\fP(1) and \fBps2pk\fP(1)\&. -.PP -Configuration files for \fBdvips\fP(1): -.IP "\fIconfig\&.builtin35\fP" -Loads \fIbuiltin35\&.map\fP instead -of \fIpsfonts\&.map\fP\&. -.IP "\fIconfig\&.download35\fP" -Loads \fIdownload35\&.map\fP instead -of \fIpsfonts\&.map\fP\&. -.IP "\fIconfig\&.outline\fP" -Loads \fIpsfonts_t1\&.map\fP instead -of \fIpsfonts\&.map\fP\&. -.IP "\fIconfig\&.pdf\fP" -Loads \fIpsfonts_t1\&.map\fP instead -of \fIpsfonts\&.map\fP and has additional optimizations for PDF generation\&. -.IP "\fIconfig\&.pk\fP" -Loads \fIpsfonts_pk\&.map\fP instead -of \fIpsfonts\&.map\fP\&. -.IP "\fIconfig\&.www\fP" -Loads \fIpsfonts_t1\&.map\fP instead -of \fIpsfonts\&.map\fP\&. -(For compatibility with old versions\&.) -.IP "\fIconfig\&.gstopk\fP" -Loads \fIpsfonts_t1\&.map\fP instead -of \fIpsfonts\&.map\fP\&. diff --git a/Build/source/texk/tetex/updmap.man b/Build/source/texk/tetex/updmap.man deleted file mode 100644 index e4a89cdefef..00000000000 --- a/Build/source/texk/tetex/updmap.man +++ /dev/null @@ -1,330 +0,0 @@ -.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.40.9. -.TH UPDMAP "1" "June 2012" "TeX Live" "User Commands" -.SH NAME -updmap \- manage TeX font maps, per-user -.br -updmap-sys \- manage TeX font maps, system-wide -.SH SYNOPSIS -.B updmap -[\fIOPTION\fR] ... [\fICOMMAND\fR] -.br -.B updmap-sys -[\fIOPTION\fR] ... [\fICOMMAND\fR] -.SH DESCRIPTION -updmap (TeX Live, multi) version $Id: updmap.pl 26778 2012\-06\-01 17:36:30Z karl $ -.PP -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 \fB\-\-all\fR updmap.cfg", but see below). -.PP -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 -font files are included in the PDF or PostScript output. -.PP -By default, the TeX filename database (ls\-R) is also updated. -.SH OPTIONS -.TP -\fB\-\-cnffile\fR FILE -read FILE for the updmap configuration -(can be given multiple times, in which case -all the files are used) -.TP -\fB\-\-dvipdfmxoutputdir\fR DIR -specify output directory (dvipdfm(x) syntax) -.TP -\fB\-\-dvipsoutputdir\fR DIR -specify output directory (dvips syntax) -.TP -\fB\-\-pdftexoutputdir\fR DIR -specify output directory (pdftex syntax) -.TP -\fB\-\-pxdvioutputdir\fR DIR -specify output directory (pxdvi syntax) -.TP -\fB\-\-outputdir\fR DIR -specify output directory (for all files) -.TP -\fB\-\-copy\fR -cp generic files rather than using symlinks -.TP -\fB\-\-force\fR -recreate files even if config hasn't changed -.TP -\fB\-\-nomkmap\fR -do not recreate map files -.TP -\fB\-\-nohash\fR -do not run texhash -.TP -\fB\-n\fR, \fB\-\-dry\-run\fR -only show the configuration, no output -.TP -\fB\-\-quiet\fR, \fB\-\-silent\fR -reduce verbosity -.SS "Commands:" -.TP -\fB\-\-help\fR -show this message and exit -.TP -\fB\-\-version\fR -show version information and exit -.TP -\fB\-\-showoption\fR OPTION -show the current setting of OPTION -.TP -\fB\-\-showoptions\fR OPTION -show possible settings for OPTION -.TP -\fB\-\-setoption\fR OPTION VALUE -set OPTION to value; option names below -.TP -\fB\-\-setoption\fR OPTION=VALUE -as above, just different syntax -.TP -\fB\-\-enable\fR MAPTYPE MAPFILE -add "MAPTYPE MAPFILE" to updmap.cfg, -where MAPTYPE is Map, MixedMap, or KanjiMap -.TP -\fB\-\-enable\fR Map=MAPFILE -add "Map MAPFILE" to updmap.cfg -.HP -\fB\-\-enable\fR MixedMap=MAPFILE add "MixedMap MAPFILE" to updmap.cfg -.HP -\fB\-\-enable\fR KanjiMap=MAPFILE add "KanjiMap MAPFILE" to updmap.cfg -.TP -\fB\-\-disable\fR MAPFILE -disable MAPFILE, of whatever type -.TP -\fB\-\-listmaps\fR -list all active and inactive maps -.TP -\fB\-\-listavailablemaps\fR -same as \fB\-\-listmaps\fR, but without -unavailable map files -.TP -\fB\-\-syncwithtrees\fR -disable unavailable map files in updmap.cfg -.PP -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 devices 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. -KanjiMap entries are added to psfonts_t1.map and kanjix.map. -.PP -Explanation of the OPTION names for \fB\-\-showoptions\fR, \fB\-\-showoptions\fR, \fB\-\-setoption\fR: -.TP -dvipsPreferOutline -true|false (default true) -.IP -Whether dvips uses bitmaps or outlines, when both are available. -.TP -dvipsDownloadBase35 -true|false (default true) -.IP -Whether dvips includes the standard 35 PostScript fonts in its output. -.TP -pdftexDownloadBase14 -true|false (default true) -.IP -Whether pdftex includes the standard 14 PDF fonts in its output. -.TP -pxdviUse -true|false (default false) -.IP -Whether maps for pxdvi (Japanese\-patched xdvi) are under updmap's control. -.TP -kanjiEmbed -(any string) -.TP -kanjiVariant -(any string) -.IP -See below. -.TP -LW35 -URWkb|URW|ADOBEkb|ADOBE (default URWkb) -.IP -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) -.IP -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. -.IP -The options kanjiEmbed and kanjiVariant specify special replacements -in the map lines. If a map contains the string @kanjiEmbed@, then -this will be replaced by the value of that option; similarly for -kanjiVariant. In this way, users of Japanese TeX can select different -fonts to be included in the final output. -.SH ENVIRONMENT -.PP -Explanation of trees and files normally used: -.IP -If \fB\-\-cnffile\fR is specified on the command line (possibly multiple -times), its value(s) are used. Otherwise, updmap reads all the -updmap.cfg files found by running `kpsewhich \fB\-all\fR updmap.cfg', -in the order returned by kpsewhich. If multiple updmap.cfg files are -found, all the maps mentioned in all the updmap.cfg files are merged. -.IP -There is one exception to keep upgradability from earlier versions of -TeX Live: if a file TEXMFLOCAL/web2c/updmap\-local.cfg exists (formerly -used by tlmgr to merge local fonts), then the file -TEXMFLOCAL/web2c/updmap.cfg is ignored (if it exists) and the -updmap\-local.cfg is used instead. In this case, updmap recognizes the -previous syntax for disabling map files in updmap\-local.cfg (this -syntax is different from what is used now). -.IP -According to the actions, updmap might write to one of the given files -or create a new updmap.cfg, described further below. -.IP -Where changes are saved: if config files are given on the command -line, then the first one given will be used to save any changes from -\fB\-\-setoption\fR, \fB\-\-enable\fR or \fB\-\-disable\fR. If the config files are taken -from kpsewhich output, then the algorithm is more complex: -.IP -1) If $TEXMFHOME/web2c/updmap.cfg or $TEXMFCONFIG/web2c/updmap.cfg -appears in the list of used files, then the one listed first by -kpsewhich \fB\-\-all\fR (equivalently, the one returned by kpsewhich -updmap.cfg), is used. -.IP -2) If neither of the above two are present and changes are made, a -new config file is created in $TEXMFCONFIG/web2c/updmap.cfg. -.IP -Multiple definitions of a font: -.IP -If a font is defined in more than one map file, then the definition -coming from the first\-listed updmap.cfg is used. If a font is -defined multiple times in the same map file, one is chosen -arbitrarily. In both cases a warning is issued. -.IP -Disabling maps: -.IP -updmap.cfg files with higher priority (listed earlier) can disable -maps mentioned in lower priority (listed later) updmap.cfg files by -writing, e.g., -.IP -#! Map mapname.map -.IP -or -.IP -#! MixedMap mapname.map -.IP -in the higher\-priority updmap.cfg file. -.IP -As an example, suppose you have a copy of MathTime Pro fonts -and want to disable the Belleek version of the fonts; that is, -disable the map belleek.map. You can create the file -$TEXMFCONFIG/web2c/updmap.cfg with the content -.IP -#! Map belleek.map -Map mt\-plus.map -Map mt\-yy.map -.IP -and call updmap. -.IP -updmap writes the map files for dvips (psfonts.map) and pdftex -(pdftex.map) to the TEXMFVAR/fonts/map/updmap/{dvips,pdftex}/ -directories. -.IP -The log file is written to TEXMFVAR/web2c/updmap.log. -.IP -When updmap\-sys is run, TEXMFSYSCONFIG and TEXMFSYSVAR are used -instead of TEXMFCONFIG and TEXMFVAR, respectively. This is the only -difference between updmap\-sys and updmap. -.IP -Other locations may be used if you give them on the command line, or -these trees don't exist, or you are not using the original TeX Live. -.IP -To see the precise locations of the various files that -will be read and written, give the \fB\-n\fR option (or read the source). -.SH EXAMPLES -.PP -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. -.SH FILES -Configuration and input files: -.IP "\fIupdmap\&.cfg\fP" -Main configuration file\&. In -\fItexmf/web2c\fP by default, but may be located elsewhere -depending on your distribution\&. Each texmf tree read should have its -own \fIupdmap.cfg\fP. -.IP "\fIdvips35\&.map\fP" -Map file for standard 35 PostScript fonts for -use with \fBdvips\fP(1)\&. -.IP "\fIpdftex35\&.map\fP" -Map file for standard 35 PostScript fonts for -use with \fBpdftex\fP(1)\&. -.IP "\fIps2pk35\&.map\fP" -Map file for standard 35 PostScript fonts for -use with \fBps2pk\fP(1)\&. -.PP -Output files: -.IP "\fIpsfonts\&.map\fP" -For \fBdvips\fP(1)\&. -Same as \fIpsfonts_t1\&.map\fP if option \fBdvipsPreferOutline\fP active, -else as \fIpsfonts_pk\&.map\fP. -.IP "\fIpsfonts_pk\&.map\fP" -For \fBdvips\fP(1)\&. -Without information from MixedMap files\&. -(Setting of \fBdvipsPreferOutline\fP ignored\&.) -.IP "\fIpsfonts_t1\&.map\fP" -For \fBdvips\fP(1)\&. -With information from MixedMap files\&. -(Setting of \fBdvipsPreferOutline\fP ignored\&.) -.IP "\fIdownload35\&.map\fP" -For \fBdvips\fP(1)\&. -Always downloads the standard 35 fonts\&. -(Setting of \fBdvipsDownloadBase35\fP ignored\&.) -.IP "\fIbuiltin35\&.map\fP" -For \fBdvips\fP(1)\&. -Never downloads the standard 35 fonts\&. -(Setting of \fBdvipsDownloadBase35\fP ignored\&.) -.IP "\fIpdftex\&.map\fP" -For \fBpdftex\fP(1)\&. -Same as \fIpdftex_dl14\&.map\fP if option \fBpdftexDownloadBase14\fP active, -else as \fIpdftex_ndl14\&.map\fP. -.IP "\fIpdftex_dl14\&.map\fP" -For \fBpdftex\fP(1)\&. -Always downloads the standard 14 fonts\&. -.IP "\fIpdftex_ndl14\&.map\fP" -For \fBpdftex\fP(1)\&. -Never downloads the standard 14 fonts\&. -.IP "\fIps2pk\&.map\fP" -Similar to \fIpsfonts.map\fP file, but -forces all fonts to be downloaded, so this map file can be used with -\fBxdvi\fP(1) and \fBps2pk\fP(1)\&. -.PP -Configuration files for \fBdvips\fP(1): -.IP "\fIconfig\&.builtin35\fP" -Loads \fIbuiltin35\&.map\fP instead -of \fIpsfonts\&.map\fP\&. -.IP "\fIconfig\&.download35\fP" -Loads \fIdownload35\&.map\fP instead -of \fIpsfonts\&.map\fP\&. -.IP "\fIconfig\&.outline\fP" -Loads \fIpsfonts_t1\&.map\fP instead -of \fIpsfonts\&.map\fP\&. -.IP "\fIconfig\&.pdf\fP" -Loads \fIpsfonts_t1\&.map\fP instead -of \fIpsfonts\&.map\fP and has additional optimizations for PDF generation\&. -.IP "\fIconfig\&.pk\fP" -Loads \fIpsfonts_pk\&.map\fP instead -of \fIpsfonts\&.map\fP\&. -.IP "\fIconfig\&.www\fP" -Loads \fIpsfonts_t1\&.map\fP instead -of \fIpsfonts\&.map\fP\&. -(For compatibility with old versions\&.) -.IP "\fIconfig\&.gstopk\fP" -Loads \fIpsfonts_t1\&.map\fP instead -of \fIpsfonts\&.map\fP\&. -.SH "REPORTING BUGS" -Report bugs to: tex\-k@tug.org -.br -TeX Live home page: diff --git a/Build/source/texk/tetex/updmap.pl b/Build/source/texk/tetex/updmap.pl deleted file mode 100755 index 710c61cd9c4..00000000000 --- a/Build/source/texk/tetex/updmap.pl +++ /dev/null @@ -1,2163 +0,0 @@ -#!/usr/bin/env perl -# mupdmap: utility to maintain map files for outline fonts. -# $Id$ -# -# 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 -# - after TL2012? Maybe remove support for reading updmap-local.cfg -# - -my $TEXMFROOT; - -BEGIN { - $^W=1; - $TEXMFROOT = `kpsewhich -var-value=TEXMFROOT`; - if ($?) { - print STDERR "updmap: Cannot find TEXMFROOT, aborting!\n"; - exit 1; - } - chomp($TEXMFROOT); - unshift (@INC, "$TEXMFROOT/tlpkg"); -} - - -my $version = '$Id$'; - -use Getopt::Long qw(:config no_autoabbrev ignore_case_always); -use strict; -use TeXLive::TLUtils qw(mkdirhier mktexupd win32 basename dirname - sort_uniq member); - -#use Data::Dumper; -#$Data::Dumper::Indent = 1; - -(my $prg = basename($0)) =~ s/\.pl$//; - -# sudo sometimes does not reset the home dir of root, check on that -# see more comments at the definition of the function itself -# this function checks by itself whether it is running on windows or not -reset_root_home(); - -chomp(my $TEXMFMAIN = `kpsewhich --var-value=TEXMFMAIN`); -chomp(my $TEXMFVAR = `kpsewhich -var-value=TEXMFVAR`); -chomp(my $TEXMFCONFIG = `kpsewhich -var-value=TEXMFCONFIG`); -chomp(my $TEXMFHOME = `kpsewhich -var-value=TEXMFHOME`); - -# 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); - $TEXMFHOME = lc($TEXMFHOME); -} - - -my %opts = ( quiet => 0, nohash => 0, nomkmap => 0 ); -my $alldata; -my $updLSR; - -my @cmdline_options = ( - "listfiles", - "cnffile=s@", - "copy", - "disable=s@", - "dvipdfmoutputdir=s", - "dvipdfmxoutputdir=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", - ); - -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", - }, - kanjiVariant => { - type => "any", - default => "", - }, -); - -&main(); - -############### - -sub main { - processOptions(); - - help() if $opts{'help'}; - - if ($opts{'version'}) { - print version(); - exit (0); - } - - if ($opts{'dvipdfmoutputdir'} && !defined($opts{'dvipdfmxoutputdir'})) { - $opts{'dvipdfmxoutputdir'} = $opts{'dvipdfmoutputdir'}; - printf STDERR "Using --dvipdfmoutputdir options for dvipdfmx, but please use --dvipdfmxoutputdir\n"; - } - - if ($opts{'dvipdfmoutputdir'} && $opts{'dvipdfmxoutputdir'} && - $opts{'dvipdfmoutputdir'} ne $opts{'dvipdfmxoutputdir'}) { - printf STDERR "Options for --dvipdfmoutputdir and --dvipdfmxoutputdir do not agree\nplease use only --dvipdfmxoutputdir. Exiting.\n"; - exit(1); - } - - 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; - } - - 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; - - # determine which config files should be used - # replaces the former "setupCfgFile" - # - # we also determine here where changes will be saved to - if ($opts{'cnffile'}) { - my @tmp; - for my $f (@{$opts{'cnffile'}}) { - if (! -f $f) { - die "$prg: Config file \"$f\" not found."; - } - push @tmp, (win32() ? lc($f) : $f); - } - @{$opts{'cnffile'}} = @tmp; - # 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; - for my $f (@all_files) { - push @used_files, (win32() ? lc($f) : $f); - } - # - my $TEXMFLOCALVAR; - my @TEXMFLOCAL; - if (win32()) { - chomp($TEXMFLOCALVAR =`kpsewhich --expand-path=\$TEXMFLOCAL`); - @TEXMFLOCAL = map { lc } split(/;/ , $TEXMFLOCALVAR); - } else { - chomp($TEXMFLOCALVAR =`kpsewhich --expand-path='\$TEXMFLOCAL'`); - @TEXMFLOCAL = split /:/ , $TEXMFLOCALVAR; - } - # - # search for TEXMFLOCAL/web2c/updmap.cfg - # check for compatibility with old updmap-local.cfg - my @tmlused; - for my $tml (@TEXMFLOCAL) { - my $TMLabs = Cwd::abs_path($tml); - next if (!$TMLabs); - my $oldfound = 0; - if (-r "$TMLabs/web2c/updmap-local.cfg") { - push @tmlused, "$TMLabs/web2c/updmap-local.cfg"; - warning("Old configuration file\n $TMLabs/web2c/updmap-local.cfg\nfound! "); - $oldfound = 1; - } - if (-r "$TMLabs/web2c/updmap.cfg") { - if ($oldfound) { - warning("Will read it *instead* of\n $TMLabs/web2c/updmap.cfg\n"); - } else { - push @tmlused, "$TMLabs/web2c/updmap.cfg"; - } - } - warning("Please consider moving the information from updmap-local.cfg to\n $TMLabs/web2c/updmap.cfg\n") - if ($oldfound); - } - # - # reorder used files: we move TEXMFLOCAL (if used) just above TEXMFMAIN - # as sysadmins will probably adjust values there - # - # updmap (user): - # ============== - # as found: - # TEXMFCONFIG $HOME/.texliveYYYY/texmf-config/web2c/updmap.cfg - # TEXMFVAR $HOME/.texliveYYYY/texmf-var/web2c/updmap.cfg - # TEXMFHOME $HOME/texmf/web2c/updmap.cfg - # TEXMFSYSCONFIG $TEXLIVE/YYYY/texmf-config/web2c/updmap.cfg - # TEXMFSYSVAR $TEXLIVE/YYYY/texmf-var/web2c/updmap.cfg - # TEXMFMAIN $TEXLIVE/YYYY/texmf/web2c/updmap.cfg - # TEXMFLOCAL $TEXLIVE/texmf-local/web2c/updmap.cfg - # TEXMFDIST $TEXLIVE/YYYY/texmf-dist/web2c/updmap.cfg - # - # as used: - # TEXMFCONFIG $HOME/.texliveYYYY/texmf-config/web2c/updmap.cfg - # TEXMFVAR $HOME/.texliveYYYY/texmf-var/web2c/updmap.cfg - # TEXMFHOME $HOME/texmf/web2c/updmap.cfg - # TEXMFSYSCONFIG $TEXLIVE/YYYY/texmf-config/web2c/updmap.cfg - # TEXMFSYSVAR $TEXLIVE/YYYY/texmf-var/web2c/updmap.cfg - # TEXMFLOCAL $TEXLIVE/texmf-local/web2c/updmap.cfg - # TEXMFMAIN $TEXLIVE/YYYY/texmf/web2c/updmap.cfg - # TEXMFDIST $TEXLIVE/YYYY/texmf-dist/web2c/updmap.cfg - # - # updmap-sys (root): - # ================== - # as found: - # TEXMFSYSCONFIG $TEXLIVE/YYYY/texmf-config/web2c/updmap.cfg - # TEXMFSYSVAR $TEXLIVE/YYYY/texmf-var/web2c/updmap.cfg - # TEXMFMAIN $TEXLIVE/YYYY/texmf/web2c/updmap.cfg - # TEXMFLOCAL $TEXLIVE/texmf-local/web2c/updmap.cfg - # TEXMFDIST $TEXLIVE/YYYY/texmf-dist/web2c/updmap.cfg - # - # as used: - # TEXMFSYSCONFIG $TEXLIVE/YYYY/texmf-config/web2c/updmap.cfg - # TEXMFSYSVAR $TEXLIVE/YYYY/texmf-var/web2c/updmap.cfg - # TEXMFLOCAL $TEXLIVE/texmf-local/web2c/updmap.cfg - # TEXMFMAIN $TEXLIVE/YYYY/texmf/web2c/updmap.cfg - # TEXMFDIST $TEXLIVE/YYYY/texmf-dist/web2c/updmap.cfg - # - if (@tmlused) { - my @tmp; - for my $f (@used_files) { - if ($f =~ m!\Q$TEXMFMAIN/\E!) { - push @tmp, @tmlused; - push @tmp, $f; - } else { - my $pushit = 1; - for my $tml (@TEXMFLOCAL) { - if ($f =~ m!\Q$tml\E!) { - $pushit = 0; - last; - } - } - push @tmp, $f if ($pushit); - } - } - @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!(\Q$TEXMFHOME\E|\Q$TEXMFCONFIG\E)/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"; - } - } - if (!$opts{'quiet'}) { - print "$prg is using the following updmap.cfg files (in precedence order):\n"; - for my $f (@{$opts{'cnffile'}}) { - print " $f\n"; - } - print "$prg is using the following updmap.cfg file for writing changes:\n"; - print " $changes_config_file\n"; - } - if ($opts{'listfiles'}) { - # we listed it above, so be done - exit 0; - } - - $alldata->{'changes_config'} = $changes_config_file; - - read_updmap_files(@{$opts{'cnffile'}}); - - if ($opts{'showoption'}) { - for my $o (@{$opts{'showoption'}}) { - if (defined($settings{$o})) { - my ($v, $vo) = get_cfg($o); - $v = "\"$v\"" if ($v =~ m/\s/); - print "$o=$v ($vo)\n"; - } else { - printf STDERR "$prg: unknown option: $o\n"; - } - } - exit 0; - } - - 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; - } - - # 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; - - if ($opts{'syncwithtrees'}) { - my @missing = read_map_files(); - if (@missing) { - print "Missing map files found, disabling\n"; - for my $m (@missing) { - my $orig = $alldata->{'maps'}{$m}{'origin'}; - print "\t$m (in $orig)\n"; - } - print "in $changes_config_file\n"; - print "Do you really want to continue (y/N)? "; - my $answer = ; - $answer = "n" if !defined($answer); - chomp($answer); - print "answer =$answer=\n"; - if ($answer ne "y" && $answer ne "Y") { - print "Please fix manually before running updmap(-sys) again!\n"; - exit 0; - } - $changed ||= enable_disable_maps(@missing); - print "finished.\n"; - # the original script did not run any update of the map files here, - # should we do that? - } - exit 0; - } - - $updLSR = &mktexupd(); - $updLSR->{mustexist}(0); - - my $cmd; - if ($opts{'edit'}) { - if ($opts{"dry-run"}) { - printf STDERR "No, are you joking, you want to edit with --dry-run?\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'}}); - } - - - 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("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); - } - - if (!$opts{'nohash'}) { - print "$prg: Updating ls-R files.\n" if !$opts{'quiet'}; - $updLSR->{exec}() unless $opts{"dry-run"}; - } - - return 0; -} - -################################################################## -# -# - -sub getFonts { - my ($first, @rest) = @_; - my $getall = 0; - my @maps = (); - return if !defined($first); - if ($first eq "-all") { - $getall = 1; - @maps = @rest; - } else { - @maps = ($first, @rest); - } - my @lines = (); - 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'}; - } - } - } - } - chomp @lines; - return @lines; -} - -############################################################################### -# writeLines() -# write the lines in $filename -# -sub writeLines { - my ($fname, @lines) = @_; - return if $opts{"dry-run"}; - map { ($_ !~ m/\n$/ ? s/$/\n/ : $_ ) } @lines; - open FILE, ">$fname" or die "$prg: can't write lines to $fname: $!"; - print FILE @lines; - close FILE; -} - -############################################################################### -# 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 { - 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; - } - return @out; -} - -############################################################################### -# setupSymlinks() -# set symlink for psfonts.map according to dvipsPreferOutline variable -# -sub setupSymlinks { - my ($dvipsPreferOutline, $dvipsoutputdir, $pdftexDownloadBase14, $pdftexoutputdir) = @_; - my $src; - my %link; - my @link; - - if ($dvipsPreferOutline eq "true") { - $src = "psfonts_t1.map"; - } else { - $src = "psfonts_pk.map"; - } - unlink "$dvipsoutputdir/psfonts.map" unless $opts{"dry-run"}; - push @link, &SymlinkOrCopy("$dvipsoutputdir", "$src", "psfonts.map"); - - if ($pdftexDownloadBase14 eq "true") { - $src = "pdftex_dl14.map"; - } else { - $src = "pdftex_ndl14.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(mode args ...) -# transform fontname and filenames according to transformation specified -# by mode. Possible values: -# URW|URWkb|ADOBE|ADOBEkb -# -sub transLW35 { - 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 - } elsif ($mode eq "URW") { - for my $r (@fileURW) { - map { eval($r); } @lines; - } - } elsif ($mode eq "ADOBE" || $mode eq "ADOBEkb") { - for my $r (@psADOBE) { - map { eval($r); } @lines; - } - my @filemode = eval ("\@file" . $mode); - for my $r (@filemode) { - map { eval($r); } @lines; - } - } - return @lines; -} - -############################################################################### -# 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"); - } -} - -sub mkMaps { - my $logfile; - - $logfile = "$TEXMFVAR/web2c/updmap.log"; - - 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"; - } - } - 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'}; - } - - 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'); - my ($kanjiVariant, $kanjiVariant_origin) = get_cfg('kanjiVariant'); - - 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 kanjiVariant replacement string : " - . "$kanjiVariant ($kanjiVariant_origin)" - . "\n create a mapfile for pxdvi : " - . "$pxdviUse ($pxdviUse_origin)" - . "\n\n"); - - 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"); - } - } - 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"); - } - } - 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 { - only_log("$m (full path not set?)\n"); - } - } - only_log("\n"); - print_and_log (sprintf(" [%3d files]\n\n", scalar @notmixedmaps)); - only_log("\n"); - - # Create psfonts_t1.map, psfonts_pk.map, ps2pk.map and pdftex.map: - my $dvipsoutputdir = $opts{'dvipsoutputdir'}; - my $pdftexoutputdir = $opts{'pdftexoutputdir'}; - my $dvipdfmxoutputdir = $opts{'dvipdfmxoutputdir'}; - 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", - "$dvipdfmxoutputdir/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; - } - } - - 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); - - print "Generating output for dvipdfmx...\n" if !$opts{'quiet'}; - &writeLines(">$dvipdfmxoutputdir/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); - } - - - 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; - } - 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)); - - 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)); - - 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 @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); - - 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); - - 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 (-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'}; - } - } - - 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="$dvipdfmxoutputdir"; - 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'}; - -} - - -sub locateMap { - my $map = shift; - my $ret = `kpsewhich --format=map $map`; - chomp($ret); - return $ret; -} - -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 { - 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"; - - @{$opts{'setoption'}} = @setoptions if (@setoptions); - @{$opts{'enable'}} = @enable if (@enable); - - Getopt::Long::Configure($oldconfig); - - # now continue with normal option handling - - GetOptions(\%opts, @cmdline_options) or - die "Try \"$prg --help\" for more information.\n"; -} - -# 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"; - } - } - my $od = $opts{$driver . "outputdir"}; - if (!$opts{"dry-run"}) { - &mkdirhier($od); - if (! -w $od) { - die "$prg: Directory \"$od\" isn't writable: $!"; - } - } - print "$driver output dir: \"$od\"\n" if !$opts{'quiet'}; - return $od; -} - -############################################################################### -# 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 setOptions { - my (@options) = @_; - for (my $i = 0; $i < @options; $i++) { - my $o = $options[$i]; - - my ($key,$val) = split (/=/, $o, 2); - - die "$prg: unexpected empty key or val for options (@options), goodbye.\n" - if !$key || !defined($val); - - &setOption ($key, $val); - } - 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 { - # this is --disable MapName - disable_map($tc, $w); - } - } - merge_settings(); - return save_updmap($tc); -} - -sub enable_map { - my ($tc, $type, $map) = @_; - - die "$prg: invalid mapType $type" if ($type !~ m/^(Map|MixedMap|KanjiMap)$/); - - 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 { - # 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"; - } -} - -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 { - $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; - } -} - - -# 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"; - # update lsR database - $updLSR->{add}($fn); - $updLSR->{exec}(); - # reset the LSR stuff, otherwise we add files several times - $updLSR->{reset}(); - } - # 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; - } - } - } - 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; - } - return 0; -} - -###################### -# 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; -} - -############################################################################### -# 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) = @_; - - die "$prg: Unsupported option $opt." if (!defined($settings{$opt})); - die "$0: Invalid value $val for option $opt." - if (!check_option($opt, $val)); - - # silently accept this old option name, just in case. - return if $opt eq "dvipdfmDownloadBase14"; - - #print "Setting option $opt to $val...\n" if !$opts{'quiet'}; - my $tc = $alldata->{'changes_config'}; - - die "$prg: top config file $tc has not been read." - if (!defined($alldata->{'updmap'}{$tc})); - - 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; - } -} - - -############################################################################### -# copyFile() -# copy file $src to $dst, sets $dst creation and mod time -# -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 ; - close(OUT); - close(IN); - my @t = stat($src); - utime($t[8], $t[9], $dst); -} - -############################################################################### -# 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; - - open IN, "$file_A"; - my $A=(); - close IN; - open IN, "$file_B"; - my $B=(); - close IN; - - $retval=1 if ($A eq $B); - return $retval; -} - -############################################################################### -# 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; - - 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 = (); - 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)); -} - -############################################################################### -# 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; - - # @lines = grep {++$count{$_} < 2 } (sort @lines); - @lines = grep {++$count{$_} < 2 } (@lines); - - return @lines; -} - - -################################################################# -# -# 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 data and check for kanji embed - merge_settings(); -} - -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; - } - } - } - # - my ($kanjiEmbed, $kanjiEmbed_origin) = get_cfg('kanjiEmbed'); - my ($kanjiVariant, $kanjiVariant_origin) = get_cfg('kanjiVariant'); - # - # go through all map files and check that the text is properly replaced - # after the replacement check that the generated map file actually - # exists, we do NOT want to break in this case! - # - for my $l (@l) { - for my $m (keys %{$alldata->{'updmap'}{$l}{'maps'}}) { - if ($m =~ m/\@kanjiEmbed@/ || $m =~ m/\@kanjiVariant@/) { - my $newm = $m; - $newm =~ s/\@kanjiEmbed@/$kanjiEmbed/; - $newm =~ s/\@kanjiVariant@/$kanjiVariant/; - if (locateMap($newm)) { - # 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; - } else { - print "$prg: generated map $newm (from $m) does not exists, not activating it!\n"; - } - # in any case delete the @kanji...@ entry line, such a map will - # never exist - 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 = ; - 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 ' '; - # make sure we get empty strings as arguments - $b = "" if (!defined($b)); - if ($a eq "#!") { - if ($b eq "Map" || $b eq "MixedMap" || $b eq "KanjiMap") { - my $c = shift @rest; - if (!defined($c)) { - warning("$prg: apparently not a real disable line, ignored: $_\n"); - } else { - if (defined($data{'maps'}{$c})) { - warning("$prg: double mention of $c in $fn\n"); - } - $data{'maps'}{$c}{'status'} = 'disabled'; - $data{'maps'}{$c}{'type'} = $b; - $data{'maps'}{$c}{'line'} = $i; - } - } - next; - } - if (@rest) { - warning("$prg: 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("$prg: 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("$prg: double mention 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 { - warning("$prg: unrecognized line $i in $fn: $_\n"); - } - } - return \%data; -} - -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; - } - } - - # - # 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}; - } - } - } - } - return (@missing); -} - -sub read_map_file { - my $fn = shift; - my @lines; - if (!open(MF,"<$fn")) { - warn("cannot open $fn: $!"); - return; - } - @lines = ; - 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; -} - -# -# 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"); - } - } - } -} - - -# -# $HOME and sudo and updmap-sys horror -# some instances of sudo do not reset $HOME to the home of root -# as an effect of "sudo updmap" creates root owned files in the home -# of a normal user, and "sudo updmap-sys" uses map files and updmap.cfg -# files from the directory of a normal user, but creating files -# in TEXMFSYSCONFIG. This is *all* wrong. -# we check: if we are running as UID 0 (root) on Unix and the -# ENV{HOME} is NOT the same as the one of root, then give a warning -# and reset it to the real home dir of root. - -sub reset_root_home { - if (!win32() && ($> == 0)) { # $> is effective uid - my $envhome = $ENV{'HOME'}; - # if $HOME isn't an existing directory, we don't care. - if (defined($envhome) && (-d $envhome)) { - # we want to avoid calling getpwuid as far as possible, so if - # $envhome is one of some usual values we accept it without worrying. - if ($envhome =~ m,^(/|/root|/var/root)/*$,) { - return; - } - # $HOME is defined, check what is the home of root in reality - my (undef,undef,undef,undef,undef,undef,undef,$roothome) = getpwuid(0); - if (defined($roothome)) { - if ($envhome ne $roothome) { - warning("$prg: resetting \$HOME value (was $envhome) to root's " - . "actual home ($roothome).\n"); - $ENV{'HOME'} = $roothome; - } else { - # envhome and roothome do agree, nothing to do, that is the good case - } - } else { - warning("$prg: home of root not defined, strange!\n"); - } - } - } -} - -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 -font files are included in the PDF or PostScript 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) - --dvipdfmxoutputdir DIR specify output directory (dvipdfm(x) 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 - --showoption OPTION show the current setting of OPTION - --showoptions OPTION show possible settings for OPTION - --setoption OPTION VALUE set OPTION to value; option names below - --setoption OPTION=VALUE as above, just different syntax - --enable MAPTYPE MAPFILE add "MAPTYPE MAPFILE" to updmap.cfg, - where MAPTYPE is Map, MixedMap, or 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, of whatever type - --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 devices 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. -KanjiMap entries are added to psfonts_t1.map and kanjix.map. - -Explanation of the OPTION names for --showoptions, --showoption, --setoption: - - dvipsPreferOutline true|false (default true) - Whether dvips uses bitmaps or outlines, when both are available. - dvipsDownloadBase35 true|false (default true) - 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) are under updmap's control. - kanjiEmbed (any string) - kanjiVariant (any string) - See below. - 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) - - 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. - - The options kanjiEmbed and kanjiVariant specify special replacements - in the map lines. If a map contains the string \@kanjiEmbed\@, then - this will be replaced by the value of that option; similarly for - kanjiVariant. In this way, users of Japanese TeX can select different - fonts to be included in the final output. - -Explanation of trees and files normally used: - - If --cnffile is specified on the command line (possibly multiple - times), its value(s) are used. Otherwise, updmap reads all the - updmap.cfg files found by running \`kpsewhich -all updmap.cfg', in the - order returned by kpsewhich, with one exception: an updmap.cfg found - in TEXMFLOCAL is given higher priority than the updmap.cfg in - TEXMFMAIN, to ensure that local adjustments by administrators take - precedence over what is shipped in TeX Live. - - In any case, if multiple updmap.cfg files are found, all the maps - mentioned in all the updmap.cfg files are merged. - - Thus, if updmap.cfg files are present in all trees, and the default - layout is used as shipped with TeX Live, the following files are - read, in the given order. - - For updmap-sys: - TEXMFSYSCONFIG \$TEXLIVE/YYYY/texmf-config/web2c/updmap.cfg - TEXMFSYSVAR \$TEXLIVE/YYYY/texmf-var/web2c/updmap.cfg - TEXMFLOCAL \$TEXLIVE/texmf-local/web2c/updmap.cfg - TEXMFMAIN \$TEXLIVE/YYYY/texmf/web2c/updmap.cfg - TEXMFDIST \$TEXLIVE/YYYY/texmf-dist/web2c/updmap.cfg - - For updmap: - TEXMFCONFIG \$HOME/.texliveYYYY/texmf-config/web2c/updmap.cfg - TEXMFVAR \$HOME/.texliveYYYY/texmf-var/web2c/updmap.cfg - TEXMFHOME \$HOME/texmf/web2c/updmap.cfg - TEXMFSYSCONFIG \$TEXLIVE/YYYY/texmf-config/web2c/updmap.cfg - TEXMFSYSVAR \$TEXLIVE/YYYY/texmf-var/web2c/updmap.cfg - TEXMFLOCAL \$TEXLIVE/texmf-local/web2c/updmap.cfg - TEXMFMAIN \$TEXLIVE/YYYY/texmf/web2c/updmap.cfg - TEXMFDIST \$TEXLIVE/YYYY/texmf-dist/web2c/updmap.cfg - - (where YYYY is the TeX Live release version). - - There is another exception to keep upgradability from earlier versions - of TeX Live: if a file TEXMFLOCAL/web2c/updmap-local.cfg exists - (formerly used by tlmgr to merge local fonts), then the file - TEXMFLOCAL/web2c/updmap.cfg is ignored (if it exists) and that - updmap-local.cfg is used instead. In this case, updmap recognizes the - previous syntax for disabling map files in updmap-local.cfg (this - syntax is different from what is used now). - - According to the actions, updmap might write to one of the given files - or create a new updmap.cfg, described further below. - - Where changes are saved: if config files are given on the command - line, then the first one given will be used to save any changes from - --setoption, --enable or --disable. If the config files are taken - from kpsewhich output, then the algorithm is more complex: - - 1) If \$TEXMFCONFIG/web2c/updmap.cfg or \$TEXMFHOME/web2c/updmap.cfg - appears in the list of used files, then the one listed first by - kpsewhich --all (equivalently, the one returned by kpsewhich - updmap.cfg), is used. - - 2) If neither of the above two are present and changes are made, a - new config file is created in \$TEXMFCONFIG/web2c/updmap.cfg. - - Resolving multiple definitions of a font: - If a font is defined in more than one map file, then the definition - coming from the first-listed updmap.cfg is used. If a font is - defined multiple times within the same map file, one is chosen - arbitrarily. In both cases a warning is issued. - - Disabling maps: - updmap.cfg files with higher priority (listed earlier) can disable - maps mentioned in lower priority (listed later) updmap.cfg files by - writing, e.g., - \#! Map mapname.map - or - \#! MixedMap mapname.map - in the higher-priority updmap.cfg file. - - As an example, suppose you have a copy of MathTime Pro fonts - and want to disable the Belleek version of the fonts; that is, - disable the map belleek.map. You can create the file - \$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 of TEXMFCONFIG and TEXMFVAR, respectively. This is the only - difference between updmap-sys and updmap. - - Other locations may be used if you give them 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 source). - -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: -EOF -; - print &version(); - print $usage; - exit 0; -} - -### Local Variables: -### perl-indent-level: 2 -### tab-width: 2 -### indent-tabs-mode: nil -### End: -# vim:set tabstop=2 expandtab: # diff --git a/Build/source/texk/texlive/ChangeLog b/Build/source/texk/texlive/ChangeLog index 436316d8325..32a665cc547 100644 --- a/Build/source/texk/texlive/ChangeLog +++ b/Build/source/texk/texlive/ChangeLog @@ -1,3 +1,8 @@ +2012-08-07 Peter Breitenlohner + + * tests/ (new): Moved from ../tetex/ to here and adapted. + * Makefile.am: Adapted. + 2012-04-15 Peter Breitenlohner * tests/ (removed): Moved from here to ../tetex/. diff --git a/Build/source/texk/texlive/Makefile.am b/Build/source/texk/texlive/Makefile.am index e9e84232231..a65919fa447 100644 --- a/Build/source/texk/texlive/Makefile.am +++ b/Build/source/texk/texlive/Makefile.am @@ -11,3 +11,8 @@ SUBDIRS = context linked_scripts ## EXTRA_DIST = w32_wrapper +## Tests +## +TESTS = tests/updmap-cmdline-test.pl +EXTRA_DIST += $(TESTS) + diff --git a/Build/source/texk/texlive/Makefile.in b/Build/source/texk/texlive/Makefile.in index 716a7922b0d..a069ed1141d 100644 --- a/Build/source/texk/texlive/Makefile.in +++ b/Build/source/texk/texlive/Makefile.in @@ -87,6 +87,10 @@ AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ ETAGS = etags CTAGS = ctags CSCOPE = cscope +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = $(am__tty_colors_dummy) DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) @@ -217,7 +221,8 @@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ACLOCAL_AMFLAGS = -I ../../m4 SUBDIRS = context linked_scripts -EXTRA_DIST = w32_wrapper +EXTRA_DIST = w32_wrapper $(TESTS) +TESTS = tests/updmap-cmdline-test.pl all: all-recursive .SUFFIXES: @@ -392,6 +397,99 @@ distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files +check-TESTS: $(TESTS) + @failed=0; all=0; xfail=0; xpass=0; skip=0; \ + srcdir=$(srcdir); export srcdir; \ + list=' $(TESTS) '; \ + $(am__tty_colors); \ + if test -n "$$list"; then \ + for tst in $$list; do \ + if test -f ./$$tst; then dir=./; \ + elif test -f $$tst; then dir=; \ + else dir="$(srcdir)/"; fi; \ + if $(TESTS_ENVIRONMENT) $${dir}$$tst $(AM_TESTS_FD_REDIRECT); then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$tst[\ \ ]*) \ + xpass=`expr $$xpass + 1`; \ + failed=`expr $$failed + 1`; \ + col=$$red; res=XPASS; \ + ;; \ + *) \ + col=$$grn; res=PASS; \ + ;; \ + esac; \ + elif test $$? -ne 77; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$tst[\ \ ]*) \ + xfail=`expr $$xfail + 1`; \ + col=$$lgn; res=XFAIL; \ + ;; \ + *) \ + failed=`expr $$failed + 1`; \ + col=$$red; res=FAIL; \ + ;; \ + esac; \ + else \ + skip=`expr $$skip + 1`; \ + col=$$blu; res=SKIP; \ + fi; \ + echo "$${col}$$res$${std}: $$tst"; \ + done; \ + if test "$$all" -eq 1; then \ + tests="test"; \ + All=""; \ + else \ + tests="tests"; \ + All="All "; \ + fi; \ + if test "$$failed" -eq 0; then \ + if test "$$xfail" -eq 0; then \ + banner="$$All$$all $$tests passed"; \ + else \ + if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ + banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ + fi; \ + else \ + if test "$$xpass" -eq 0; then \ + banner="$$failed of $$all $$tests failed"; \ + else \ + if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ + banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ + fi; \ + fi; \ + dashes="$$banner"; \ + skipped=""; \ + if test "$$skip" -ne 0; then \ + if test "$$skip" -eq 1; then \ + skipped="($$skip test was not run)"; \ + else \ + skipped="($$skip tests were not run)"; \ + fi; \ + test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$skipped"; \ + fi; \ + report=""; \ + if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ + report="Please report to $(PACKAGE_BUGREPORT)"; \ + test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$report"; \ + fi; \ + dashes=`echo "$$dashes" | sed s/./=/g`; \ + if test "$$failed" -eq 0; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + fi; \ + echo "$${col}$$dashes$${std}"; \ + echo "$${col}$$banner$${std}"; \ + test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \ + test -z "$$report" || echo "$${col}$$report$${std}"; \ + echo "$${col}$$dashes$${std}"; \ + test "$$failed" -eq 0; \ + else :; fi + distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @@ -574,6 +672,7 @@ distcleancheck: distclean $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-recursive all-am: Makefile installdirs: installdirs-recursive @@ -677,25 +776,25 @@ ps-am: uninstall-am: -.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) \ +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) check-am \ cscopelist-recursive ctags-recursive install-am install-strip \ tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ - all all-am am--refresh check check-am clean clean-cscope \ - clean-generic cscope cscopelist cscopelist-recursive ctags \ - ctags-recursive dist dist-all dist-bzip2 dist-gzip dist-lzip \ - dist-shar dist-tarZ dist-xz dist-zip distcheck distclean \ - distclean-generic distclean-tags distcleancheck distdir \ - distuninstallcheck dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-info install-info-am install-man \ - install-pdf install-pdf-am install-ps install-ps-am \ - install-strip installcheck installcheck-am installdirs \ - installdirs-am maintainer-clean maintainer-clean-generic \ - mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags \ - tags-recursive uninstall uninstall-am + all all-am am--refresh check check-TESTS check-am clean \ + clean-cscope clean-generic cscope cscopelist \ + cscopelist-recursive ctags ctags-recursive dist dist-all \ + dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ dist-xz \ + dist-zip distcheck distclean distclean-generic distclean-tags \ + distcleancheck distdir distuninstallcheck dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ + pdf-am ps ps-am tags tags-recursive uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. diff --git a/Build/source/texk/texlive/linked_scripts/ChangeLog b/Build/source/texk/texlive/linked_scripts/ChangeLog index e67e62c83c6..54afbf8722c 100644 --- a/Build/source/texk/texlive/linked_scripts/ChangeLog +++ b/Build/source/texk/texlive/linked_scripts/ChangeLog @@ -1,8 +1,18 @@ +2012-08-07 Peter Breitenlohner + + * updmap.help2man, tetex/updmap* (new): Moved from ../../tetex/ + to here. + * Makefile.am: Added man1_links and rule for xupdmap.1. + 2012-08-06 Peter Breitenlohner * Makefile.am (texmf_*_scripts): Move a2ping/, simpdftex/, tetex/, and texdoc/ scripts from texmf/ to texmf-dist/. + * tetex/{e2pall,texdoctk}.1, thumbpdf/thumbpdf.1 (new): + Moved from ../../tetex/{e2pall,texdoctk,thumbpdf}.man to here. + * Makefile.am: Added dist_man_MANS. + 2012-07-28 Peter Breitenlohner * Makefile.am (bin_links) [WIN32]: Skip shell script links. diff --git a/Build/source/texk/texlive/linked_scripts/Makefile.am b/Build/source/texk/texlive/linked_scripts/Makefile.am index 685179766ec..3c5663eda65 100644 --- a/Build/source/texk/texlive/linked_scripts/Makefile.am +++ b/Build/source/texk/texlive/linked_scripts/Makefile.am @@ -37,6 +37,8 @@ bin_SCRIPTS = # texmf_scriptsdir = $(datarootdir)/texmf/scripts ## We distinguish shell and other (perl, lua, python, ruby, ...) scripts. +## Some shell scripts are, however, listed under *_other_scripts because +## they are correctly handled by ../w32_wrapper/runscript.exe. texmf_shell_scripts = texmf_other_scripts = \ texlive/rungs.tlu \ @@ -125,6 +127,8 @@ texmf_dist_other_scripts = \ svn-multi/svn-multi.pl \ tetex/e2pall.pl \ tetex/texdoctk.pl \ + tetex/updmap.pl \ + tetex/updmap-sys.sh \ texdoc/texdoc.tlu \ texcount/texcount.pl \ texdef/texdef.pl \ @@ -141,7 +145,7 @@ nobase_dist_texmf_dist_scripts_SCRIPTS = \ $(texmf_dist_shell_scripts) \ $(texmf_dist_other_scripts) -# Symlinks within $(bindir): FILE:LINK indicates LINK->FILE +## Symlinks within $(bindir): FILE:LINK indicates LINK->FILE bin_links = \ epstopdf:repstopdf \ pdfcrop:rpdfcrop @@ -150,6 +154,18 @@ bin_links += \ lua2dox_lua:lua2dox_filter endif !WIN32 +## Manpages +dist_man_MANS = \ + tetex/e2pall.1 \ + tetex/texdoctk.1 \ + tetex/updmap.1 \ + tetex/updmap.cfg.5 \ + thumbpdf/thumbpdf.1 + +man1_links = updmap:updmap-sys + +include $(top_srcdir)/../am/man1_links.am + # The idea is to install the scripts themselves in texmf*/scripts, and # have bin/arch/foo be a symlink to, say, # ../../texmf-dist/scripts/foo/foo.pl. That way we save a bit of disk @@ -173,7 +189,7 @@ endif !WIN32 EXTRA_DIST += ../../../build-aux/relpath relpath = $(SHELL) $(top_srcdir)/../../build-aux/relpath runscript = $(top_srcdir)/w32_wrapper/runscript.exe -install-data-hook: +install-data-hook: install-man1-links if WIN32 @for s in $(texmf_other_scripts) $(texmf_dist_other_scripts); do \ t=`basename $$s | sed 's,\.[^/]*$$,,' | tr '[A-Z]' '[a-z]'`; \ @@ -236,7 +252,7 @@ if WIN32 WINEXT = $(EXEEXT) endif WIN32 -uninstall-hook: +uninstall-hook: uninstall-man1-links @for s in $(nobase_dist_texmf_scripts_SCRIPTS) $(nobase_dist_texmf_dist_scripts_SCRIPTS); do \ target=`basename $$s | tr '[A-Z]' '[a-z]'`; \ echo "$$s" | grep listings-ext.sh >/dev/null \ @@ -253,3 +269,13 @@ if !WIN32 else :; fi endif !WIN32 +## Generate the updmap man page using help2man plus a bit of +## handwritten material. But don't actually update updmap.man, +## we don't want to require help2man for an install. Leave that to be +## done by hand. +.PHONY: xupdmap.1 +xupdmap.1: updmap.help2man tetex/updmap.pl + help2man --include=$< --source="TeX Live" --no-info \ + $(srcdir)/tetex/updmap.pl >/tmp/$@ +EXTRA_DIST += updmap.help2man + diff --git a/Build/source/texk/texlive/linked_scripts/Makefile.in b/Build/source/texk/texlive/linked_scripts/Makefile.in index ac7e0498dd2..d3d8d56c7a2 100644 --- a/Build/source/texk/texlive/linked_scripts/Makefile.in +++ b/Build/source/texk/texlive/linked_scripts/Makefile.in @@ -51,10 +51,12 @@ POST_UNINSTALL = : @WIN32_FALSE@am__append_1 = \ @WIN32_FALSE@ lua2dox_lua:lua2dox_filter -subdir = linked_scripts -DIST_COMMON = README $(nobase_dist_texmf_dist_scripts_SCRIPTS) \ +DIST_COMMON = README $(dist_man_MANS) \ + $(nobase_dist_texmf_dist_scripts_SCRIPTS) \ $(nobase_dist_texmf_scripts_SCRIPTS) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in ChangeLog + $(srcdir)/Makefile.in $(top_srcdir)/../am/man1_links.am \ + ChangeLog +subdir = linked_scripts ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/../../m4/kpse-win32.m4 \ $(top_srcdir)/configure.ac @@ -92,7 +94,8 @@ am__uninstall_files_from_dir = { \ } am__installdirs = "$(DESTDIR)$(bindir)" \ "$(DESTDIR)$(texmf_dist_scriptsdir)" \ - "$(DESTDIR)$(texmf_scriptsdir)" + "$(DESTDIR)$(texmf_scriptsdir)" "$(DESTDIR)$(man1dir)" \ + "$(DESTDIR)$(man5dir)" SCRIPTS = $(bin_SCRIPTS) $(nobase_dist_texmf_dist_scripts_SCRIPTS) \ $(nobase_dist_texmf_scripts_SCRIPTS) SOURCES = @@ -102,6 +105,10 @@ am__can_run_installinfo = \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac +man1dir = $(mandir)/man1 +man5dir = $(mandir)/man5 +NROFF = nroff +MANS = $(dist_man_MANS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ @@ -210,7 +217,7 @@ DISTCLEANFILES = scripts-list # # We support native builds, multiplatform or not, as well as distro builds. # -EXTRA_DIST = scripts.lst ../../../build-aux/relpath +EXTRA_DIST = scripts.lst ../../../build-aux/relpath updmap.help2man bin_SCRIPTS = # Copies of these scripts exist here for the sake of avoiding @@ -308,6 +315,8 @@ texmf_dist_other_scripts = \ svn-multi/svn-multi.pl \ tetex/e2pall.pl \ tetex/texdoctk.pl \ + tetex/updmap.pl \ + tetex/updmap-sys.sh \ texdoc/texdoc.tlu \ texcount/texcount.pl \ texdef/texdef.pl \ @@ -325,16 +334,22 @@ nobase_dist_texmf_dist_scripts_SCRIPTS = \ $(texmf_dist_shell_scripts) \ $(texmf_dist_other_scripts) - -# Symlinks within $(bindir): FILE:LINK indicates LINK->FILE bin_links = epstopdf:repstopdf pdfcrop:rpdfcrop $(am__append_1) +dist_man_MANS = \ + tetex/e2pall.1 \ + tetex/texdoctk.1 \ + tetex/updmap.1 \ + tetex/updmap.cfg.5 \ + thumbpdf/thumbpdf.1 + +man1_links = updmap:updmap-sys relpath = $(SHELL) $(top_srcdir)/../../build-aux/relpath runscript = $(top_srcdir)/w32_wrapper/runscript.exe @WIN32_TRUE@WINEXT = $(EXEEXT) all: all-am .SUFFIXES: -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/../am/man1_links.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ @@ -355,6 +370,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; +$(top_srcdir)/../am/man1_links.am: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh @@ -483,6 +499,92 @@ uninstall-nobase_dist_texmf_scriptsSCRIPTS: files=`$(am__nobase_strip) \ -e 'h;s,.*/,,;$(transform);x;s|[^/]*$$||;G;s,\n,,'`; \ dir='$(DESTDIR)$(texmf_scriptsdir)'; $(am__uninstall_files_from_dir) +install-man1: $(dist_man_MANS) + @$(NORMAL_INSTALL) + @list1=''; \ + list2='$(dist_man_MANS)'; \ + test -n "$(man1dir)" \ + && test -n "`echo $$list1$$list2`" \ + || exit 0; \ + echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ + { for i in $$list1; do echo "$$i"; done; \ + if test -n "$$list2"; then \ + for i in $$list2; do echo "$$i"; done \ + | sed -n '/\.1[a-z]*$$/p'; \ + fi; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ + done; } + +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man1dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) +install-man5: $(dist_man_MANS) + @$(NORMAL_INSTALL) + @list1=''; \ + list2='$(dist_man_MANS)'; \ + test -n "$(man5dir)" \ + && test -n "`echo $$list1$$list2`" \ + || exit 0; \ + echo " $(MKDIR_P) '$(DESTDIR)$(man5dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(man5dir)" || exit 1; \ + { for i in $$list1; do echo "$$i"; done; \ + if test -n "$$list2"; then \ + for i in $$list2; do echo "$$i"; done \ + | sed -n '/\.5[a-z]*$$/p'; \ + fi; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^5][0-9a-z]*$$,5,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man5dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man5dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man5dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man5dir)" || exit $$?; }; \ + done; } + +uninstall-man5: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man5dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(dist_man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.5[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^5][0-9a-z]*$$,5,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + dir='$(DESTDIR)$(man5dir)'; $(am__uninstall_files_from_dir) tags: TAGS TAGS: @@ -493,6 +595,19 @@ cscope cscopelist: distdir: $(DISTFILES) + @list='$(MANS)'; if test -n "$$list"; then \ + list=`for p in $$list; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ + if test -n "$$list" && \ + grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ + echo "error: found man pages containing the 'missing help2man' replacement text:" >&2; \ + grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ + echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ + echo " typically 'make maintainer-clean' will remove them" >&2; \ + exit 1; \ + else :; fi; \ + else :; fi @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -524,9 +639,9 @@ distdir: $(DISTFILES) done check-am: all-am check: check-am -all-am: Makefile $(SCRIPTS) all-local +all-am: Makefile $(SCRIPTS) $(MANS) all-local installdirs: - for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(texmf_dist_scriptsdir)" "$(DESTDIR)$(texmf_scriptsdir)"; do \ + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(texmf_dist_scriptsdir)" "$(DESTDIR)$(texmf_scriptsdir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man5dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am @@ -580,7 +695,8 @@ info: info-am info-am: -install-data-am: install-nobase_dist_texmf_dist_scriptsSCRIPTS \ +install-data-am: install-man \ + install-nobase_dist_texmf_dist_scriptsSCRIPTS \ install-nobase_dist_texmf_scriptsSCRIPTS @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-data-hook @@ -598,7 +714,7 @@ install-info: install-info-am install-info-am: -install-man: +install-man: install-man1 install-man5 install-pdf: install-pdf-am @@ -626,11 +742,13 @@ ps: ps-am ps-am: -uninstall-am: uninstall-binSCRIPTS \ +uninstall-am: uninstall-binSCRIPTS uninstall-man \ uninstall-nobase_dist_texmf_dist_scriptsSCRIPTS \ uninstall-nobase_dist_texmf_scriptsSCRIPTS @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook +uninstall-man: uninstall-man1 uninstall-man5 + .MAKE: install-am install-data-am install-strip uninstall-am .PHONY: all all-am all-local check check-am clean clean-generic \ @@ -639,13 +757,15 @@ uninstall-am: uninstall-binSCRIPTS \ install-data install-data-am install-data-hook install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ + install-man1 install-man5 \ install-nobase_dist_texmf_dist_scriptsSCRIPTS \ install-nobase_dist_texmf_scriptsSCRIPTS install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am uninstall uninstall-am uninstall-binSCRIPTS \ - uninstall-hook uninstall-nobase_dist_texmf_dist_scriptsSCRIPTS \ + uninstall-hook uninstall-man uninstall-man1 uninstall-man5 \ + uninstall-nobase_dist_texmf_dist_scriptsSCRIPTS \ uninstall-nobase_dist_texmf_scriptsSCRIPTS @@ -661,7 +781,24 @@ scripts-list: Makefile @MAINTAINER_MODE_TRUE@all-local: scripts-list @MAINTAINER_MODE_FALSE@all-local: -install-data-hook: +.PHONY: install-man1-links uninstall-man1-links + +install-man1-links: + @cd $(DESTDIR)$(man1dir) && \ + for s in $(man1_links); do \ + link=`echo $$s | sed 's,.*:,,'`; \ + file=`echo $$s | sed 's,:.*,,'`; \ + rm -f $$link.1; \ + echo "creating link '$$link.1' -> '$$file.1'"; \ + echo ".so man1/$$file.1" >$$link.1; \ + done + +uninstall-man1-links: + @for s in $(man1_links); do \ + link=`echo $$s | sed 's,.*:,,'`; \ + rm -f $(DESTDIR)$(man1dir)/$$link.1; \ + done +install-data-hook: install-man1-links @WIN32_TRUE@ @for s in $(texmf_other_scripts) $(texmf_dist_other_scripts); do \ @WIN32_TRUE@ t=`basename $$s | sed 's,\.[^/]*$$,,' | tr '[A-Z]' '[a-z]'`; \ @WIN32_TRUE@ echo "$(INSTALL_SCRIPT) '$(runscript)' '$(DESTDIR)$(bindir)/$$t.exe'"; \ @@ -710,7 +847,7 @@ install-data-hook: .PHONY: install-links install-links: -uninstall-hook: +uninstall-hook: uninstall-man1-links @for s in $(nobase_dist_texmf_scripts_SCRIPTS) $(nobase_dist_texmf_dist_scripts_SCRIPTS); do \ target=`basename $$s | tr '[A-Z]' '[a-z]'`; \ echo "$$s" | grep listings-ext.sh >/dev/null \ @@ -725,6 +862,11 @@ uninstall-hook: @WIN32_FALSE@ rm -f $(DESTDIR)$(bindir)/man; \ @WIN32_FALSE@ else :; fi +.PHONY: xupdmap.1 +xupdmap.1: updmap.help2man tetex/updmap.pl + help2man --include=$< --source="TeX Live" --no-info \ + $(srcdir)/tetex/updmap.pl >/tmp/$@ + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: diff --git a/Build/source/texk/texlive/linked_scripts/scripts.lst b/Build/source/texk/texlive/linked_scripts/scripts.lst index 924e0a11e0b..c5f867f0b9f 100644 --- a/Build/source/texk/texlive/linked_scripts/scripts.lst +++ b/Build/source/texk/texlive/linked_scripts/scripts.lst @@ -80,6 +80,8 @@ sty2dtx/sty2dtx.pl svn-multi/svn-multi.pl tetex/e2pall.pl tetex/texdoctk.pl +tetex/updmap.pl +tetex/updmap-sys.sh texdoc/texdoc.tlu texcount/texcount.pl texdef/texdef.pl diff --git a/Build/source/texk/texlive/linked_scripts/tetex/e2pall.1 b/Build/source/texk/texlive/linked_scripts/tetex/e2pall.1 new file mode 100644 index 00000000000..b102568b53a --- /dev/null +++ b/Build/source/texk/texlive/linked_scripts/tetex/e2pall.1 @@ -0,0 +1,55 @@ +.TH "e2pall" "1" "August 2000" "teTeX" "teTeX" +.PP +.SH "NAME" +e2pall \- convert all EPS files in a LaTeX document to PDF +.PP +.SH "SYNOPSIS" +.PP +\fBe2pall\fP \fITEXFILE\fP +.PP +.SH "DESCRIPTION" +.PP +\fBe2pall\fP searches through \fITEXFILE\fP for \eincludegraphics +commands to find the base names of image files\&. When it finds one, +\fBe2pall\fP runs \fBepstopdf\fP(1) to create a PDF file from the EPS +file\&. +.PP +\fBe2pall\fP will check to be sure that an existing PDF file is +up-to-date with the EPS file, and will not run \fBepstopdf\fP(1) if +the PDF file is newer than the EPS file\&. +.PP +.SH "BUGS" +.PP +.IP "" +Seems to be broken +.IP "" +Cannot handle \einput{\fIfilename\fP} or +\eincludegraphics{\fIfilename\fP} split over more than one +line +.IP "" +Must be run from same directory as the LaTeX file +.IP "" +Does not look down $TEXINPUTS +.IP "" +Cannot handle documents that use \einclude commands +.IP "" +Assumes \fIall\fP files included with \eincludegraphics are EPS +files +.IP +.PP +.SH "SEE ALSO" +.PP +\fBepstopdf\fP(1) +.PP +.SH "AUTHOR" +.PP +\fBe2pall\fP was written by Jody Klymak and published in a posting to +the (mailing list)\&. +.PP +This manual page was written by C\&.M\&. Connelly +, for +the Debian GNU/Linux system\&. It may be used by other distributions +without contacting the author\&. Any mistakes or omissions in the +manual page are my fault; inquiries about or corrections to this +manual page should be directed to me (and not to the primary author)\&. +.PP diff --git a/Build/source/texk/texlive/linked_scripts/tetex/texdoctk.1 b/Build/source/texk/texlive/linked_scripts/tetex/texdoctk.1 new file mode 100644 index 00000000000..e7aebb7098a --- /dev/null +++ b/Build/source/texk/texlive/linked_scripts/tetex/texdoctk.1 @@ -0,0 +1,217 @@ +.TH TEXDOCTK 1 +.SH NAME +texdoctk \- GUI for easier access of TeX package and program documentations +.SH SYNOPSIS +.B texdoctk +-[aq] +.SH "DESCRIPTION" +.B texdoctk +is a GUI for easier access to a large part of the vast amount +of package and program documentations and tutorials for TeX and its +different derivatives (mainly LaTeX). It is optimized and included in +the teTeX and fpTeX distributions and also available with TeXLive. +.PP +The documentation is grouped into 17 categories; the 18th button of the main +panel is inactive by default and intended for use with local additions (see +section +.B CONFIGURATION +below). +.PP +In the settings window you see a checkbox in the html->ps and text->ps +converter menus for switching on/off output redirect. This is due to the fact +that some converters do not write their output into a file but to stdout by +default, so a redirect is needed, e.g. +.PP +a2ps myfile.txt >myfile.ps +.SH "OPTIONS" +.TP +.I "\-v" +verbose: enable some viewer messages which are otherwise sent to stderr, +as well as some warning popup windows. This can also be set in a +configuration file. +.TP +.I "\-a" +autoview: autostart viewer if a listbox contains only one item (this will +frequently happen in search results). This can also be set in a configuration +file. +.SH "CONFIGURATION" +.PP +The configuration is controlled by the system default configuration file +($TEXMFMAIN)/texdoctk/texdocrc.defaults, most of whose entries can though be +overridden by the users' own optional ~/.texdocrc files and/or command line +options. +.SS The Settings menu and configuration files +.PP +The Settings menu is used to change the user-definable settings of \fBtexdoctk\fP +for the duration of the program call or as new defaults. The latter case is +the purpose of the Save button, which generates or rewrites the user's own +~/.texdocrc file. The system defaults cannot be edited with the Settings +menu. +.TP +Paths +The TEXMF-type paths on the system are reported, and the user can specify the +name of the subdirectory of $HOMETEXMF, where the personal documentation is +stored. +.TP +General viewer behaviour + +.I Suppress error messages +toggle verbose mode (see option -v); default is off. + +.I Autostart viewer for one-item listboxes +if a listbox contains only one item (see option -a) + +.I Use text viewer for unknown file format +i.e. treat the file as plain text. \fBtexdoctk\fP should recognize the usual file +formats and also relate names like README to plain text, but some docs may have +freely invented names. Default is on; if switched off, trying to view such +files will raise an error. The switch does not influence printing: unrecognized +formats cannot be printed. + +.I Change viewer colours +using either RGB triplets in the format #rrggbb or the standardized names. +.TP +DVI/PostScript/PDF/HTML/Plain text +For text files, \fBtexdoctk\fP provides an own viewer. If this viewer is disabled, +but no alternative viewer is specified, \fBtexdoctk\fP tries to read the content +of the environment variable $PAGER. + +If you want to print the documentations, you will need converters to turn +non-PS files into PostScript. Here are some suggestions: + +\& dvi->ps: +dvips (is part of teTeX) (http://www.radicaleye.com/dvips.html) + +\& pdf->ps: +pdf2ps (http://www.cs.wisc.edu/~ghost) or +Acrobat Reader (http://www.adobe.com) + +\& html->ps: html2ps (http://user.it.uu.se/~jan/html2ps.html) + +\& plain text->ps: a2ps (http://www-inf.enst.fr/~demaille/a2ps/) + +The html->ps and text->ps converter menus for switching on/off output redirect. +This is due to the fact that some converters do not write their output into a +file but to stdout by default, so a redirect is needed, e.g. +.B a2ps myfile.txt >myfile.ps +.PP +The system-wide configuration file is ($TEXMFMAIN)/texdoctk/texdocrc.defaults +and should only be writable by the administrator of the installation using any +text editor. The optional user configuration file is ~/.texdocrc and can +override all but those system settings which affect the installation as a +whole. The preferred way of changing it is through the Settings menu. +.SS The databases +\fBtexdoctk\fP comes with a default database file ($TEXMFMAIN)/texdoctk/texdoctk.dat +with a special format. It is divided into 17 sections corresponding to the +17 buttons that are active by default. Each section begins with a line + +@\fIsection_name\fP + +where +.I section_name +is the text as it appears in the button. This title is +followed by the descriptive entries for each documentation, which have this +format: + +\fIpackage-label\fP;Short description for listbox (opt. \fIpackage-name\fP);path in doc directory;optional keywords + +(without breaking the line!). Comments (initiated with a #) and empty lines +are ignored by the program. The second field is the text displayed in the +selection listboxes of \fBtexdoctk\fP, and you will usually want to mention the name +of the package in parens along with it; the first field is a \fBunique\fP label +for the package for internal use of the program which will usually be chosen +identical to the package name, but can be different if there is more than one +documentation file coming with a package. +.PP +The administrator will probably install additional packages in the local texmf +tree. The corresponding documentation can be made accessible by an additional +database $TEXMFLOCAL/texdoctk/texdoctk-local.dat. Furthermore, individual +users possibly install additional packages in an texmf subdirectory of their +$HOME, for which they can make an individual database themselves as +$TEXMFHOME/texdoctk/texdoctk-pers.dat. After creating such files, texhash +must be executed. +.PP +Both types of databases must have the same structure as the system database, +although they need (and should) not include all its sections if there are no +additional entries. For example, if the the package +.I foo +is added to the local tree such that its documentation file is +($TEXMFLOCAL)/doc/latex/foo/foo.dvi and it is decided that it fits best into +the existing category Graphics, texdoctk-local.dat would look like this: + +@Graphics +.br +foo;Create bells and whistles (foo);latex/foo/foo.dvi;decoration + +The entry for +.I foo +will then be appended to the list of entries in the Graphics category. The 18th +button can be activated in the same way, but using a new category name; +possible entries at the beginning of the database which have not been assigned +to a category will be assigned to the default Miscellaneous, making the 18th +button active with that label. Note that you cannot have more than 18 +categories; if there are more, only the one defined last will appear and be +used. +.PP +If the documentation is included in the .sty file instead of a proper +documentation file, the optional keywords should start with +-?- directly after the semicolon, where ? is 0, 1, 2 or 3; these are flags +which indicate in which part of the .sty the instructions are placed and +should help \fBtexdoctk\fP to extract the documentation from the style and present +it without the code, which would normally be of little use. +.TP +0 +no specific place, scattered between the code +.TP +1 +at end, behind \\endinput; some .sty files have well-organized documentation +behind the end of the actual code, where TeX doesn't see it upon compilation +.TP +2 +at beginning, terminated by %%%%%%; in some other cases, some usage information +is at the beginning of the .sty as a comment terminated by a line full of % +.TP +3 +as 2, but with a blank line as termination +.PP +See the system database for plenty of examples. + +.SH "FILES" +.PP +\& $TEXMFMAIN/texdoctk/texdocrc.defaults +system-wide configuration file +.PP +\& ~/.texdocrc +(optional) personal configuration file; can also be created with the Settings menu +.PP +\& $TEXMFMAIN/texdoctk/texdoctk.dat +default database file for documentation files of the distribution +.PP +\& $TEXMFLOCAL/texdoctk/texdoctk-local.dat +(optional) local database file for documentation files +.PP +\& $TEXMFHOME/texdoctk/texdoctk-pers.dat +(optional) personal database file of individual users for documentation files +.SH BUGS +Widget placement in topic toplevels becomes ugly when the toplevel is stretched +or shrunk. +.PP +The font in the frame labels of the Settings menu are not forced to the default +font; this will become visible e.g. at hi-res screens, where the label font is +not scaled up. +.PP +Netscape and Mozilla error output will be written to stderr even if the quiet +mode was set. +.SH AUTHOR +.B texdoctk +was written by Thomas Ruedas . +.PP +This manual page was originally written by Adrian Bunk for +the Debian GNU/Linux system (but may be used by others). It is now maintained +by Thomas Ruedas. + +.SH COPYRIGHT +Copyright (C) 2000-2004 Thomas Ruedas +.br +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. diff --git a/Build/source/texk/texlive/linked_scripts/tetex/updmap-sys.sh b/Build/source/texk/texlive/linked_scripts/tetex/updmap-sys.sh new file mode 100755 index 00000000000..6f3c8365658 --- /dev/null +++ b/Build/source/texk/texlive/linked_scripts/tetex/updmap-sys.sh @@ -0,0 +1,30 @@ +#!/bin/sh + +# updmap-sys: Thomas Esser, public domain. + +# wrapper script for updmap with TEXMFVAR and TEXMFCONFIG set to +# TEXMFSYSVAR / TEXMFSYSCONFIG + +test -f /bin/ksh && test -z "$RUNNING_KSH" \ + && { UNAMES=`uname -s`; test "x$UNAMES" = xULTRIX; } 2>/dev/null \ + && { RUNNING_KSH=true; export RUNNING_KSH; exec /bin/ksh $0 ${1+"$@"}; } +unset RUNNING_KSH + +test -f /bin/bsh && test -z "$RUNNING_BSH" \ + && { UNAMES=`uname -s`; test "x$UNAMES" = xAIX; } 2>/dev/null \ + && { RUNNING_BSH=true; export RUNNING_BSH; exec /bin/bsh $0 ${1+"$@"}; } +unset RUNNING_BSH + +export PATH + +# hack around a bug in zsh: +test -n "${ZSH_VERSION+set}" && alias -g '${1+"$@"}'='"$@"' + +v=`kpsewhich -var-value TEXMFSYSVAR` +c=`kpsewhich -var-value TEXMFSYSCONFIG` + +TEXMFVAR="$v" +TEXMFCONFIG="$c" +export TEXMFVAR TEXMFCONFIG + +exec updmap ${1+"$@"} diff --git a/Build/source/texk/texlive/linked_scripts/tetex/updmap.1 b/Build/source/texk/texlive/linked_scripts/tetex/updmap.1 new file mode 100644 index 00000000000..5bc81acc69d --- /dev/null +++ b/Build/source/texk/texlive/linked_scripts/tetex/updmap.1 @@ -0,0 +1,360 @@ +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.40.9. +.TH UPDMAP "1" "August 2012" "TeX Live" "User Commands" +.SH NAME +updmap \- manage TeX font maps, per-user +.br +updmap-sys \- manage TeX font maps, system-wide +.SH SYNOPSIS +.B updmap +[\fIOPTION\fR] ... [\fICOMMAND\fR] +.br +.B updmap-sys +[\fIOPTION\fR] ... [\fICOMMAND\fR] +.SH DESCRIPTION +updmap (TeX Live, multi) version $Id: updmap.pl 27264 2012\-07\-31 05:10:29Z preining $ +.PP +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 \fB\-\-all\fR updmap.cfg", but see below). +.PP +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 +font files are included in the PDF or PostScript output. +.PP +By default, the TeX filename database (ls\-R) is also updated. +.SH OPTIONS +.TP +\fB\-\-cnffile\fR FILE +read FILE for the updmap configuration +(can be given multiple times, in which case +all the files are used) +.TP +\fB\-\-dvipdfmxoutputdir\fR DIR +specify output directory (dvipdfm(x) syntax) +.TP +\fB\-\-dvipsoutputdir\fR DIR +specify output directory (dvips syntax) +.TP +\fB\-\-pdftexoutputdir\fR DIR +specify output directory (pdftex syntax) +.TP +\fB\-\-pxdvioutputdir\fR DIR +specify output directory (pxdvi syntax) +.TP +\fB\-\-outputdir\fR DIR +specify output directory (for all files) +.TP +\fB\-\-copy\fR +cp generic files rather than using symlinks +.TP +\fB\-\-force\fR +recreate files even if config hasn't changed +.TP +\fB\-\-nomkmap\fR +do not recreate map files +.TP +\fB\-\-nohash\fR +do not run texhash +.TP +\fB\-n\fR, \fB\-\-dry\-run\fR +only show the configuration, no output +.TP +\fB\-\-quiet\fR, \fB\-\-silent\fR +reduce verbosity +.SS "Commands:" +.TP +\fB\-\-help\fR +show this message and exit +.TP +\fB\-\-version\fR +show version information and exit +.TP +\fB\-\-showoption\fR OPTION +show the current setting of OPTION +.TP +\fB\-\-showoptions\fR OPTION +show possible settings for OPTION +.TP +\fB\-\-setoption\fR OPTION VALUE +set OPTION to value; option names below +.TP +\fB\-\-setoption\fR OPTION=VALUE +as above, just different syntax +.TP +\fB\-\-enable\fR MAPTYPE MAPFILE +add "MAPTYPE MAPFILE" to updmap.cfg, +where MAPTYPE is Map, MixedMap, or KanjiMap +.TP +\fB\-\-enable\fR Map=MAPFILE +add "Map MAPFILE" to updmap.cfg +.HP +\fB\-\-enable\fR MixedMap=MAPFILE add "MixedMap MAPFILE" to updmap.cfg +.HP +\fB\-\-enable\fR KanjiMap=MAPFILE add "KanjiMap MAPFILE" to updmap.cfg +.TP +\fB\-\-disable\fR MAPFILE +disable MAPFILE, of whatever type +.TP +\fB\-\-listmaps\fR +list all active and inactive maps +.TP +\fB\-\-listavailablemaps\fR +same as \fB\-\-listmaps\fR, but without +unavailable map files +.TP +\fB\-\-syncwithtrees\fR +disable unavailable map files in updmap.cfg +.PP +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 devices 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. +KanjiMap entries are added to psfonts_t1.map and kanjix.map. +.PP +Explanation of the OPTION names for \fB\-\-showoptions\fR, \fB\-\-showoption\fR, \fB\-\-setoption\fR: +.TP +dvipsPreferOutline +true|false (default true) +.IP +Whether dvips uses bitmaps or outlines, when both are available. +.TP +dvipsDownloadBase35 +true|false (default true) +.IP +Whether dvips includes the standard 35 PostScript fonts in its output. +.TP +pdftexDownloadBase14 +true|false (default true) +.IP +Whether pdftex includes the standard 14 PDF fonts in its output. +.TP +pxdviUse +true|false (default false) +.IP +Whether maps for pxdvi (Japanese\-patched xdvi) are under updmap's control. +.TP +kanjiEmbed +(any string) +.TP +kanjiVariant +(any string) +.IP +See below. +.TP +LW35 +URWkb|URW|ADOBEkb|ADOBE (default URWkb) +.IP +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) +.IP +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. +.IP +The options kanjiEmbed and kanjiVariant specify special replacements +in the map lines. If a map contains the string @kanjiEmbed@, then +this will be replaced by the value of that option; similarly for +kanjiVariant. In this way, users of Japanese TeX can select different +fonts to be included in the final output. +.SH ENVIRONMENT +.PP +Explanation of trees and files normally used: +.IP +If \fB\-\-cnffile\fR is specified on the command line (possibly multiple +times), its value(s) are used. Otherwise, updmap reads all the +updmap.cfg files found by running `kpsewhich \fB\-all\fR updmap.cfg', in the +order returned by kpsewhich, with one exception: an updmap.cfg found +in TEXMFLOCAL is given higher priority than the updmap.cfg in +TEXMFMAIN, to ensure that local adjustments by administrators take +precedence over what is shipped in TeX Live. +.IP +In any case, if multiple updmap.cfg files are found, all the maps +mentioned in all the updmap.cfg files are merged. +.IP +Thus, if updmap.cfg files are present in all trees, and the default +layout is used as shipped with TeX Live, the following files are +read, in the given order. +.nf +.IP +For updmap\-sys: +TEXMFSYSCONFIG $TEXLIVE/YYYY/texmf\-config/web2c/updmap.cfg +TEXMFSYSVAR $TEXLIVE/YYYY/texmf\-var/web2c/updmap.cfg +TEXMFLOCAL $TEXLIVE/texmf\-local/web2c/updmap.cfg +TEXMFMAIN $TEXLIVE/YYYY/texmf/web2c/updmap.cfg +TEXMFDIST $TEXLIVE/YYYY/texmf\-dist/web2c/updmap.cfg +.IP +For updmap: +TEXMFCONFIG $HOME/.texliveYYYY/texmf\-config/web2c/updmap.cfg +TEXMFVAR $HOME/.texliveYYYY/texmf\-var/web2c/updmap.cfg +TEXMFHOME $HOME/texmf/web2c/updmap.cfg +TEXMFSYSCONFIG $TEXLIVE/YYYY/texmf\-config/web2c/updmap.cfg +TEXMFSYSVAR $TEXLIVE/YYYY/texmf\-var/web2c/updmap.cfg +TEXMFLOCAL $TEXLIVE/texmf\-local/web2c/updmap.cfg +TEXMFMAIN $TEXLIVE/YYYY/texmf/web2c/updmap.cfg +TEXMFDIST $TEXLIVE/YYYY/texmf\-dist/web2c/updmap.cfg +.IP +(where YYYY is the TeX Live release version). +.fi +.IP +There is another exception to keep upgradability from earlier versions +of TeX Live: if a file TEXMFLOCAL/web2c/updmap\-local.cfg exists +(formerly used by tlmgr to merge local fonts), then the file +TEXMFLOCAL/web2c/updmap.cfg is ignored (if it exists) and that +updmap\-local.cfg is used instead. In this case, updmap recognizes the +previous syntax for disabling map files in updmap\-local.cfg (this +syntax is different from what is used now). +.IP +According to the actions, updmap might write to one of the given files +or create a new updmap.cfg, described further below. +.IP +Where changes are saved: if config files are given on the command +line, then the first one given will be used to save any changes from +\fB\-\-setoption\fR, \fB\-\-enable\fR or \fB\-\-disable\fR. If the config files are taken +from kpsewhich output, then the algorithm is more complex: +.IP +1) If $TEXMFCONFIG/web2c/updmap.cfg or $TEXMFHOME/web2c/updmap.cfg +appears in the list of used files, then the one listed first by +kpsewhich \fB\-\-all\fR (equivalently, the one returned by kpsewhich +updmap.cfg), is used. +.IP +2) If neither of the above two are present and changes are made, a +new config file is created in $TEXMFCONFIG/web2c/updmap.cfg. +.IP +Resolving multiple definitions of a font: +.IP +If a font is defined in more than one map file, then the definition +coming from the first\-listed updmap.cfg is used. If a font is +defined multiple times within the same map file, one is chosen +arbitrarily. In both cases a warning is issued. +.IP +Disabling maps: +.IP +updmap.cfg files with higher priority (listed earlier) can disable +maps mentioned in lower priority (listed later) updmap.cfg files by +writing, e.g., +.IP +#! Map mapname.map +.IP +or +.IP +#! MixedMap mapname.map +.IP +in the higher\-priority updmap.cfg file. +.IP +As an example, suppose you have a copy of MathTime Pro fonts +and want to disable the Belleek version of the fonts; that is, +disable the map belleek.map. You can create the file +$TEXMFCONFIG/web2c/updmap.cfg with the content +.IP +#! Map belleek.map +Map mt\-plus.map +Map mt\-yy.map +.IP +and call updmap. +.IP +updmap writes the map files for dvips (psfonts.map) and pdftex +(pdftex.map) to the TEXMFVAR/fonts/map/updmap/{dvips,pdftex}/ +directories. +.IP +The log file is written to TEXMFVAR/web2c/updmap.log. +.IP +When updmap\-sys is run, TEXMFSYSCONFIG and TEXMFSYSVAR are used +instead of TEXMFCONFIG and TEXMFVAR, respectively. This is the only +difference between updmap\-sys and updmap. +.IP +Other locations may be used if you give them on the command line, or +these trees don't exist, or you are not using the original TeX Live. +.IP +To see the precise locations of the various files that +will be read and written, give the \fB\-n\fR option (or read the source). +.SH EXAMPLES +.PP +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. +.SH FILES +Configuration and input files: +.IP "\fIupdmap\&.cfg\fP" +Main configuration file\&. In +\fItexmf/web2c\fP by default, but may be located elsewhere +depending on your distribution\&. Each texmf tree read should have its +own \fIupdmap.cfg\fP. +.IP "\fIdvips35\&.map\fP" +Map file for standard 35 PostScript fonts for +use with \fBdvips\fP(1)\&. +.IP "\fIpdftex35\&.map\fP" +Map file for standard 35 PostScript fonts for +use with \fBpdftex\fP(1)\&. +.IP "\fIps2pk35\&.map\fP" +Map file for standard 35 PostScript fonts for +use with \fBps2pk\fP(1)\&. +.PP +Output files: +.IP "\fIpsfonts\&.map\fP" +For \fBdvips\fP(1)\&. +Same as \fIpsfonts_t1\&.map\fP if option \fBdvipsPreferOutline\fP active, +else as \fIpsfonts_pk\&.map\fP. +.IP "\fIpsfonts_pk\&.map\fP" +For \fBdvips\fP(1)\&. +Without information from MixedMap files\&. +(Setting of \fBdvipsPreferOutline\fP ignored\&.) +.IP "\fIpsfonts_t1\&.map\fP" +For \fBdvips\fP(1)\&. +With information from MixedMap files\&. +(Setting of \fBdvipsPreferOutline\fP ignored\&.) +.IP "\fIdownload35\&.map\fP" +For \fBdvips\fP(1)\&. +Always downloads the standard 35 fonts\&. +(Setting of \fBdvipsDownloadBase35\fP ignored\&.) +.IP "\fIbuiltin35\&.map\fP" +For \fBdvips\fP(1)\&. +Never downloads the standard 35 fonts\&. +(Setting of \fBdvipsDownloadBase35\fP ignored\&.) +.IP "\fIpdftex\&.map\fP" +For \fBpdftex\fP(1)\&. +Same as \fIpdftex_dl14\&.map\fP if option \fBpdftexDownloadBase14\fP active, +else as \fIpdftex_ndl14\&.map\fP. +.IP "\fIpdftex_dl14\&.map\fP" +For \fBpdftex\fP(1)\&. +Always downloads the standard 14 fonts\&. +.IP "\fIpdftex_ndl14\&.map\fP" +For \fBpdftex\fP(1)\&. +Never downloads the standard 14 fonts\&. +.IP "\fIps2pk\&.map\fP" +Similar to \fIpsfonts.map\fP file, but +forces all fonts to be downloaded, so this map file can be used with +\fBxdvi\fP(1) and \fBps2pk\fP(1)\&. +.PP +Configuration files for \fBdvips\fP(1): +.IP "\fIconfig\&.builtin35\fP" +Loads \fIbuiltin35\&.map\fP instead +of \fIpsfonts\&.map\fP\&. +.IP "\fIconfig\&.download35\fP" +Loads \fIdownload35\&.map\fP instead +of \fIpsfonts\&.map\fP\&. +.IP "\fIconfig\&.outline\fP" +Loads \fIpsfonts_t1\&.map\fP instead +of \fIpsfonts\&.map\fP\&. +.IP "\fIconfig\&.pdf\fP" +Loads \fIpsfonts_t1\&.map\fP instead +of \fIpsfonts\&.map\fP and has additional optimizations for PDF generation\&. +.IP "\fIconfig\&.pk\fP" +Loads \fIpsfonts_pk\&.map\fP instead +of \fIpsfonts\&.map\fP\&. +.IP "\fIconfig\&.www\fP" +Loads \fIpsfonts_t1\&.map\fP instead +of \fIpsfonts\&.map\fP\&. +(For compatibility with old versions\&.) +.IP "\fIconfig\&.gstopk\fP" +Loads \fIpsfonts_t1\&.map\fP instead +of \fIpsfonts\&.map\fP\&. +.SH "REPORTING BUGS" +Report bugs to: tex\-k@tug.org +.br +TeX Live home page: diff --git a/Build/source/texk/texlive/linked_scripts/tetex/updmap.cfg.5 b/Build/source/texk/texlive/linked_scripts/tetex/updmap.cfg.5 new file mode 100644 index 00000000000..0d8c90b5412 --- /dev/null +++ b/Build/source/texk/texlive/linked_scripts/tetex/updmap.cfg.5 @@ -0,0 +1,135 @@ +.\" Hey, Emacs! This is an -*- nroff -*- source file. +.\" +.\" Copyright (C) 2004, 2012 Hilmar Preusse +.\" +.\" This is free software; you can redistribute it and/or modify it under +.\" the terms of the GNU General Public License as published by the Free +.\" Software Foundation; either version 2, or (at your option) any later +.\" version. +.\" +.\" This is distributed in the hope that it will be useful, but WITHOUT +.\" ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +.\" FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +.\" for more details. +.\" +.\" You should have received a copy of the GNU General Public License +.\" along with this program. if not, see . +.\" +.TH "UPDMAP.CFG" "12" "March 2012" "TeX Live" "TeX Live" +.SH "NAME" +\fBupdmap.cfg\fR \- configuration of font mapping/inclusion for dvips and +friends. +.SH "DESCRIPTION" +The file \fBupdmap.cfg\fR is the central font configuration file of a +teTeX system and is read by \fBupdmap\fP(1). It describes if and how +fonts should be included (or not included) into PS-/PDF-files. This +works for Outline (Postscript Type1) and Bitmap Fonts (Postscript +Type3) mostly coming from MetaFont. +.PP +\fBupdmap\fP is a utility that creates font configuration files for +\fBdvips\fP(1), \fBpdftex\fP(1), \fBxdvi\fP(1), \fBps2pk\fP(1), +\fBgsftopk\fP(1), \fBdvipdfm\fP(1) and (soon) \fBdvipdfmx\fP(1)\&. In +an ideal world, updmap would be unnecessary -- each of these programs +would read the same configuration file to learn what fonts are +available and how they should be treated\&. As things stand, however, +each of these tools has subtly different requirements and thereby +needs its own font configuration file\&. \fBupdmap\fP creates font +configuration files for all of these programs from a single source, +\fBupdmap.cfg\fR, allowing you to easily keep all the different +configuration files in sync\&. +.P +\fBdvipsPreferOutline\fR +.br +Configures if \fBdvips\fR (by default) should 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 +can be forced by putting "p psfonts_pk.map" into a config file. We provide +such config files which can be enabled via +\fBdvips\fR \fI-Poutline\fR (resp. \fBdvips\fR \fI-Ppk\fR). +.br +Valid settings for dvipsPreferOutline are \fItrue\fR / \fIfalse\fR. +.P +\fBLW35\fR +.br +Which fonts of the "Basic 35 Laserwriter Fonts" do you want to use and +how are the filenames chosen? Valid settings: +.br +URW: URW fonts with "vendor" filenames (e.g. n019064l.pfb) +.br +URWkb: URW fonts with "berry" filenames (e.g. uhvbo8ac.pfb) +.br +ADOBE: Adobe fonts with "vendor" filenames (e.g. hvnbo___.pfb) +.br +ADOBEkb: Adobe fonts with "berry" filenames (e.g. phvbo8an.pfb) +.P +\fBdvipsDownloadBase\fR +.br +Configures if \fBdvips\fR (by default) should download the standard 35 LaserWriter +fonts into the document (set \fItrue\fR) or should these fonts be used from the ps +interpreter / printer (set \fIfalse\fR). +.br +The user can override the default by specifying \fBdvips\fR \fI-Pdownload35\fR +(resp. \fBdvips\fR \fI-Pbuiltin35\fR) to download the LW35 fonts +(resp. use the built-in fonts). +.br +Valid settings are \fItrue\fR / \fIfalse\fR. +.P +\fBpdftexDownloadBase14\fR +.br +Should \fBpdftex\fR 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. +.br +Valid settings are \fItrue\fR (download the fonts) or \fIfalse\fR (don't +download the fonts). Adobe recommends to embed all fonts. +.P +\fBdvipdfmDownloadBase14\fR +.br +Should \fBdvipdfm\fR 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. +.br +Valid settings are \fItrue\fR (download the fonts) or \fIfalse\fR (don't +download the fonts). +.P +\fBMap\fR +.br +Points to a map file, which describes a mapping from a font (called in the TeX +document) to the pfb file containing the Postscript code. +.br +Usage: \fBMap\fR filename.map +.P +The syntax of map files is the same as \fBdvips\fP(1) uses, see +section 6.4, "'psfonts.map': PostScript font catalog" in the manual of +\fBdvips\fP(1), available as info and pdf file. +.P +\fBMixedMap\fR +.br +Similar to \fBMap\fR. It should be used when there is Type1 and a bitmap +implementation of the font (the latter mostly coming from MetaFont). These +entries will not be used in the default map of \fBdvips\fR if +\fBdvipsPreferOutline\fR is set to \fIfalse\fR. +.br +Usage: \fBMixedMap\fR filename.map +.P +The sign \fB#\fR precedes a comment. +.P +Not used Map files should be commented out using the string \fB#!\fR at the +beginning of the line. These entries can be (de-)activated using \fBupdmap\fR +with the options \fI--enable\fR and \fI--disable\fR. +.SH "SPECIAL TO DEBIAN" +In Debian the file \fBupdmap.cfg\fR is a generated file sitting in /var. It is +generated by concatenating the *.cfg files from /etc/texmf/updmap.d/. These +files follow the syntax of updmap.cfg, but contain only parts of it. +.SH "AUTHOR" +This manual page was written by Hilmar Preusse , for +the Debian GNU/Linux system by simply copying the comments from +\fBupdmap.cfg\fR and rewriting some of them. It may be used by other +distributions without contacting the author. Any mistakes or omissions in +the manual page are my fault; inquiries about or corrections to this manual +page should be directed to me (and not to the primary author). +.SH "SEE ALSO" +updmap(1), info page of dvips(1) +.SH "THANKS TO" +Frank Kuester, +Thomas Esser. diff --git a/Build/source/texk/texlive/linked_scripts/tetex/updmap.pl b/Build/source/texk/texlive/linked_scripts/tetex/updmap.pl new file mode 100755 index 00000000000..710c61cd9c4 --- /dev/null +++ b/Build/source/texk/texlive/linked_scripts/tetex/updmap.pl @@ -0,0 +1,2163 @@ +#!/usr/bin/env perl +# mupdmap: utility to maintain map files for outline fonts. +# $Id$ +# +# 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 +# - after TL2012? Maybe remove support for reading updmap-local.cfg +# + +my $TEXMFROOT; + +BEGIN { + $^W=1; + $TEXMFROOT = `kpsewhich -var-value=TEXMFROOT`; + if ($?) { + print STDERR "updmap: Cannot find TEXMFROOT, aborting!\n"; + exit 1; + } + chomp($TEXMFROOT); + unshift (@INC, "$TEXMFROOT/tlpkg"); +} + + +my $version = '$Id$'; + +use Getopt::Long qw(:config no_autoabbrev ignore_case_always); +use strict; +use TeXLive::TLUtils qw(mkdirhier mktexupd win32 basename dirname + sort_uniq member); + +#use Data::Dumper; +#$Data::Dumper::Indent = 1; + +(my $prg = basename($0)) =~ s/\.pl$//; + +# sudo sometimes does not reset the home dir of root, check on that +# see more comments at the definition of the function itself +# this function checks by itself whether it is running on windows or not +reset_root_home(); + +chomp(my $TEXMFMAIN = `kpsewhich --var-value=TEXMFMAIN`); +chomp(my $TEXMFVAR = `kpsewhich -var-value=TEXMFVAR`); +chomp(my $TEXMFCONFIG = `kpsewhich -var-value=TEXMFCONFIG`); +chomp(my $TEXMFHOME = `kpsewhich -var-value=TEXMFHOME`); + +# 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); + $TEXMFHOME = lc($TEXMFHOME); +} + + +my %opts = ( quiet => 0, nohash => 0, nomkmap => 0 ); +my $alldata; +my $updLSR; + +my @cmdline_options = ( + "listfiles", + "cnffile=s@", + "copy", + "disable=s@", + "dvipdfmoutputdir=s", + "dvipdfmxoutputdir=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", + ); + +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", + }, + kanjiVariant => { + type => "any", + default => "", + }, +); + +&main(); + +############### + +sub main { + processOptions(); + + help() if $opts{'help'}; + + if ($opts{'version'}) { + print version(); + exit (0); + } + + if ($opts{'dvipdfmoutputdir'} && !defined($opts{'dvipdfmxoutputdir'})) { + $opts{'dvipdfmxoutputdir'} = $opts{'dvipdfmoutputdir'}; + printf STDERR "Using --dvipdfmoutputdir options for dvipdfmx, but please use --dvipdfmxoutputdir\n"; + } + + if ($opts{'dvipdfmoutputdir'} && $opts{'dvipdfmxoutputdir'} && + $opts{'dvipdfmoutputdir'} ne $opts{'dvipdfmxoutputdir'}) { + printf STDERR "Options for --dvipdfmoutputdir and --dvipdfmxoutputdir do not agree\nplease use only --dvipdfmxoutputdir. Exiting.\n"; + exit(1); + } + + 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; + } + + 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; + + # determine which config files should be used + # replaces the former "setupCfgFile" + # + # we also determine here where changes will be saved to + if ($opts{'cnffile'}) { + my @tmp; + for my $f (@{$opts{'cnffile'}}) { + if (! -f $f) { + die "$prg: Config file \"$f\" not found."; + } + push @tmp, (win32() ? lc($f) : $f); + } + @{$opts{'cnffile'}} = @tmp; + # 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; + for my $f (@all_files) { + push @used_files, (win32() ? lc($f) : $f); + } + # + my $TEXMFLOCALVAR; + my @TEXMFLOCAL; + if (win32()) { + chomp($TEXMFLOCALVAR =`kpsewhich --expand-path=\$TEXMFLOCAL`); + @TEXMFLOCAL = map { lc } split(/;/ , $TEXMFLOCALVAR); + } else { + chomp($TEXMFLOCALVAR =`kpsewhich --expand-path='\$TEXMFLOCAL'`); + @TEXMFLOCAL = split /:/ , $TEXMFLOCALVAR; + } + # + # search for TEXMFLOCAL/web2c/updmap.cfg + # check for compatibility with old updmap-local.cfg + my @tmlused; + for my $tml (@TEXMFLOCAL) { + my $TMLabs = Cwd::abs_path($tml); + next if (!$TMLabs); + my $oldfound = 0; + if (-r "$TMLabs/web2c/updmap-local.cfg") { + push @tmlused, "$TMLabs/web2c/updmap-local.cfg"; + warning("Old configuration file\n $TMLabs/web2c/updmap-local.cfg\nfound! "); + $oldfound = 1; + } + if (-r "$TMLabs/web2c/updmap.cfg") { + if ($oldfound) { + warning("Will read it *instead* of\n $TMLabs/web2c/updmap.cfg\n"); + } else { + push @tmlused, "$TMLabs/web2c/updmap.cfg"; + } + } + warning("Please consider moving the information from updmap-local.cfg to\n $TMLabs/web2c/updmap.cfg\n") + if ($oldfound); + } + # + # reorder used files: we move TEXMFLOCAL (if used) just above TEXMFMAIN + # as sysadmins will probably adjust values there + # + # updmap (user): + # ============== + # as found: + # TEXMFCONFIG $HOME/.texliveYYYY/texmf-config/web2c/updmap.cfg + # TEXMFVAR $HOME/.texliveYYYY/texmf-var/web2c/updmap.cfg + # TEXMFHOME $HOME/texmf/web2c/updmap.cfg + # TEXMFSYSCONFIG $TEXLIVE/YYYY/texmf-config/web2c/updmap.cfg + # TEXMFSYSVAR $TEXLIVE/YYYY/texmf-var/web2c/updmap.cfg + # TEXMFMAIN $TEXLIVE/YYYY/texmf/web2c/updmap.cfg + # TEXMFLOCAL $TEXLIVE/texmf-local/web2c/updmap.cfg + # TEXMFDIST $TEXLIVE/YYYY/texmf-dist/web2c/updmap.cfg + # + # as used: + # TEXMFCONFIG $HOME/.texliveYYYY/texmf-config/web2c/updmap.cfg + # TEXMFVAR $HOME/.texliveYYYY/texmf-var/web2c/updmap.cfg + # TEXMFHOME $HOME/texmf/web2c/updmap.cfg + # TEXMFSYSCONFIG $TEXLIVE/YYYY/texmf-config/web2c/updmap.cfg + # TEXMFSYSVAR $TEXLIVE/YYYY/texmf-var/web2c/updmap.cfg + # TEXMFLOCAL $TEXLIVE/texmf-local/web2c/updmap.cfg + # TEXMFMAIN $TEXLIVE/YYYY/texmf/web2c/updmap.cfg + # TEXMFDIST $TEXLIVE/YYYY/texmf-dist/web2c/updmap.cfg + # + # updmap-sys (root): + # ================== + # as found: + # TEXMFSYSCONFIG $TEXLIVE/YYYY/texmf-config/web2c/updmap.cfg + # TEXMFSYSVAR $TEXLIVE/YYYY/texmf-var/web2c/updmap.cfg + # TEXMFMAIN $TEXLIVE/YYYY/texmf/web2c/updmap.cfg + # TEXMFLOCAL $TEXLIVE/texmf-local/web2c/updmap.cfg + # TEXMFDIST $TEXLIVE/YYYY/texmf-dist/web2c/updmap.cfg + # + # as used: + # TEXMFSYSCONFIG $TEXLIVE/YYYY/texmf-config/web2c/updmap.cfg + # TEXMFSYSVAR $TEXLIVE/YYYY/texmf-var/web2c/updmap.cfg + # TEXMFLOCAL $TEXLIVE/texmf-local/web2c/updmap.cfg + # TEXMFMAIN $TEXLIVE/YYYY/texmf/web2c/updmap.cfg + # TEXMFDIST $TEXLIVE/YYYY/texmf-dist/web2c/updmap.cfg + # + if (@tmlused) { + my @tmp; + for my $f (@used_files) { + if ($f =~ m!\Q$TEXMFMAIN/\E!) { + push @tmp, @tmlused; + push @tmp, $f; + } else { + my $pushit = 1; + for my $tml (@TEXMFLOCAL) { + if ($f =~ m!\Q$tml\E!) { + $pushit = 0; + last; + } + } + push @tmp, $f if ($pushit); + } + } + @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!(\Q$TEXMFHOME\E|\Q$TEXMFCONFIG\E)/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"; + } + } + if (!$opts{'quiet'}) { + print "$prg is using the following updmap.cfg files (in precedence order):\n"; + for my $f (@{$opts{'cnffile'}}) { + print " $f\n"; + } + print "$prg is using the following updmap.cfg file for writing changes:\n"; + print " $changes_config_file\n"; + } + if ($opts{'listfiles'}) { + # we listed it above, so be done + exit 0; + } + + $alldata->{'changes_config'} = $changes_config_file; + + read_updmap_files(@{$opts{'cnffile'}}); + + if ($opts{'showoption'}) { + for my $o (@{$opts{'showoption'}}) { + if (defined($settings{$o})) { + my ($v, $vo) = get_cfg($o); + $v = "\"$v\"" if ($v =~ m/\s/); + print "$o=$v ($vo)\n"; + } else { + printf STDERR "$prg: unknown option: $o\n"; + } + } + exit 0; + } + + 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; + } + + # 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; + + if ($opts{'syncwithtrees'}) { + my @missing = read_map_files(); + if (@missing) { + print "Missing map files found, disabling\n"; + for my $m (@missing) { + my $orig = $alldata->{'maps'}{$m}{'origin'}; + print "\t$m (in $orig)\n"; + } + print "in $changes_config_file\n"; + print "Do you really want to continue (y/N)? "; + my $answer = ; + $answer = "n" if !defined($answer); + chomp($answer); + print "answer =$answer=\n"; + if ($answer ne "y" && $answer ne "Y") { + print "Please fix manually before running updmap(-sys) again!\n"; + exit 0; + } + $changed ||= enable_disable_maps(@missing); + print "finished.\n"; + # the original script did not run any update of the map files here, + # should we do that? + } + exit 0; + } + + $updLSR = &mktexupd(); + $updLSR->{mustexist}(0); + + my $cmd; + if ($opts{'edit'}) { + if ($opts{"dry-run"}) { + printf STDERR "No, are you joking, you want to edit with --dry-run?\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'}}); + } + + + 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("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); + } + + if (!$opts{'nohash'}) { + print "$prg: Updating ls-R files.\n" if !$opts{'quiet'}; + $updLSR->{exec}() unless $opts{"dry-run"}; + } + + return 0; +} + +################################################################## +# +# + +sub getFonts { + my ($first, @rest) = @_; + my $getall = 0; + my @maps = (); + return if !defined($first); + if ($first eq "-all") { + $getall = 1; + @maps = @rest; + } else { + @maps = ($first, @rest); + } + my @lines = (); + 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'}; + } + } + } + } + chomp @lines; + return @lines; +} + +############################################################################### +# writeLines() +# write the lines in $filename +# +sub writeLines { + my ($fname, @lines) = @_; + return if $opts{"dry-run"}; + map { ($_ !~ m/\n$/ ? s/$/\n/ : $_ ) } @lines; + open FILE, ">$fname" or die "$prg: can't write lines to $fname: $!"; + print FILE @lines; + close FILE; +} + +############################################################################### +# 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 { + 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; + } + return @out; +} + +############################################################################### +# setupSymlinks() +# set symlink for psfonts.map according to dvipsPreferOutline variable +# +sub setupSymlinks { + my ($dvipsPreferOutline, $dvipsoutputdir, $pdftexDownloadBase14, $pdftexoutputdir) = @_; + my $src; + my %link; + my @link; + + if ($dvipsPreferOutline eq "true") { + $src = "psfonts_t1.map"; + } else { + $src = "psfonts_pk.map"; + } + unlink "$dvipsoutputdir/psfonts.map" unless $opts{"dry-run"}; + push @link, &SymlinkOrCopy("$dvipsoutputdir", "$src", "psfonts.map"); + + if ($pdftexDownloadBase14 eq "true") { + $src = "pdftex_dl14.map"; + } else { + $src = "pdftex_ndl14.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(mode args ...) +# transform fontname and filenames according to transformation specified +# by mode. Possible values: +# URW|URWkb|ADOBE|ADOBEkb +# +sub transLW35 { + 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 + } elsif ($mode eq "URW") { + for my $r (@fileURW) { + map { eval($r); } @lines; + } + } elsif ($mode eq "ADOBE" || $mode eq "ADOBEkb") { + for my $r (@psADOBE) { + map { eval($r); } @lines; + } + my @filemode = eval ("\@file" . $mode); + for my $r (@filemode) { + map { eval($r); } @lines; + } + } + return @lines; +} + +############################################################################### +# 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"); + } +} + +sub mkMaps { + my $logfile; + + $logfile = "$TEXMFVAR/web2c/updmap.log"; + + 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"; + } + } + 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'}; + } + + 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'); + my ($kanjiVariant, $kanjiVariant_origin) = get_cfg('kanjiVariant'); + + 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 kanjiVariant replacement string : " + . "$kanjiVariant ($kanjiVariant_origin)" + . "\n create a mapfile for pxdvi : " + . "$pxdviUse ($pxdviUse_origin)" + . "\n\n"); + + 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"); + } + } + 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"); + } + } + 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 { + only_log("$m (full path not set?)\n"); + } + } + only_log("\n"); + print_and_log (sprintf(" [%3d files]\n\n", scalar @notmixedmaps)); + only_log("\n"); + + # Create psfonts_t1.map, psfonts_pk.map, ps2pk.map and pdftex.map: + my $dvipsoutputdir = $opts{'dvipsoutputdir'}; + my $pdftexoutputdir = $opts{'pdftexoutputdir'}; + my $dvipdfmxoutputdir = $opts{'dvipdfmxoutputdir'}; + 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", + "$dvipdfmxoutputdir/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; + } + } + + 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); + + print "Generating output for dvipdfmx...\n" if !$opts{'quiet'}; + &writeLines(">$dvipdfmxoutputdir/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); + } + + + 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; + } + 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)); + + 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)); + + 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 @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); + + 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); + + 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 (-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'}; + } + } + + 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="$dvipdfmxoutputdir"; + 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'}; + +} + + +sub locateMap { + my $map = shift; + my $ret = `kpsewhich --format=map $map`; + chomp($ret); + return $ret; +} + +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 { + 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"; + + @{$opts{'setoption'}} = @setoptions if (@setoptions); + @{$opts{'enable'}} = @enable if (@enable); + + Getopt::Long::Configure($oldconfig); + + # now continue with normal option handling + + GetOptions(\%opts, @cmdline_options) or + die "Try \"$prg --help\" for more information.\n"; +} + +# 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"; + } + } + my $od = $opts{$driver . "outputdir"}; + if (!$opts{"dry-run"}) { + &mkdirhier($od); + if (! -w $od) { + die "$prg: Directory \"$od\" isn't writable: $!"; + } + } + print "$driver output dir: \"$od\"\n" if !$opts{'quiet'}; + return $od; +} + +############################################################################### +# 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 setOptions { + my (@options) = @_; + for (my $i = 0; $i < @options; $i++) { + my $o = $options[$i]; + + my ($key,$val) = split (/=/, $o, 2); + + die "$prg: unexpected empty key or val for options (@options), goodbye.\n" + if !$key || !defined($val); + + &setOption ($key, $val); + } + 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 { + # this is --disable MapName + disable_map($tc, $w); + } + } + merge_settings(); + return save_updmap($tc); +} + +sub enable_map { + my ($tc, $type, $map) = @_; + + die "$prg: invalid mapType $type" if ($type !~ m/^(Map|MixedMap|KanjiMap)$/); + + 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 { + # 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"; + } +} + +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 { + $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; + } +} + + +# 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"; + # update lsR database + $updLSR->{add}($fn); + $updLSR->{exec}(); + # reset the LSR stuff, otherwise we add files several times + $updLSR->{reset}(); + } + # 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; + } + } + } + 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; + } + return 0; +} + +###################### +# 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; +} + +############################################################################### +# 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) = @_; + + die "$prg: Unsupported option $opt." if (!defined($settings{$opt})); + die "$0: Invalid value $val for option $opt." + if (!check_option($opt, $val)); + + # silently accept this old option name, just in case. + return if $opt eq "dvipdfmDownloadBase14"; + + #print "Setting option $opt to $val...\n" if !$opts{'quiet'}; + my $tc = $alldata->{'changes_config'}; + + die "$prg: top config file $tc has not been read." + if (!defined($alldata->{'updmap'}{$tc})); + + 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; + } +} + + +############################################################################### +# copyFile() +# copy file $src to $dst, sets $dst creation and mod time +# +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 ; + close(OUT); + close(IN); + my @t = stat($src); + utime($t[8], $t[9], $dst); +} + +############################################################################### +# 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; + + open IN, "$file_A"; + my $A=(); + close IN; + open IN, "$file_B"; + my $B=(); + close IN; + + $retval=1 if ($A eq $B); + return $retval; +} + +############################################################################### +# 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; + + 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 = (); + 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)); +} + +############################################################################### +# 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; + + # @lines = grep {++$count{$_} < 2 } (sort @lines); + @lines = grep {++$count{$_} < 2 } (@lines); + + return @lines; +} + + +################################################################# +# +# 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 data and check for kanji embed + merge_settings(); +} + +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; + } + } + } + # + my ($kanjiEmbed, $kanjiEmbed_origin) = get_cfg('kanjiEmbed'); + my ($kanjiVariant, $kanjiVariant_origin) = get_cfg('kanjiVariant'); + # + # go through all map files and check that the text is properly replaced + # after the replacement check that the generated map file actually + # exists, we do NOT want to break in this case! + # + for my $l (@l) { + for my $m (keys %{$alldata->{'updmap'}{$l}{'maps'}}) { + if ($m =~ m/\@kanjiEmbed@/ || $m =~ m/\@kanjiVariant@/) { + my $newm = $m; + $newm =~ s/\@kanjiEmbed@/$kanjiEmbed/; + $newm =~ s/\@kanjiVariant@/$kanjiVariant/; + if (locateMap($newm)) { + # 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; + } else { + print "$prg: generated map $newm (from $m) does not exists, not activating it!\n"; + } + # in any case delete the @kanji...@ entry line, such a map will + # never exist + 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 = ; + 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 ' '; + # make sure we get empty strings as arguments + $b = "" if (!defined($b)); + if ($a eq "#!") { + if ($b eq "Map" || $b eq "MixedMap" || $b eq "KanjiMap") { + my $c = shift @rest; + if (!defined($c)) { + warning("$prg: apparently not a real disable line, ignored: $_\n"); + } else { + if (defined($data{'maps'}{$c})) { + warning("$prg: double mention of $c in $fn\n"); + } + $data{'maps'}{$c}{'status'} = 'disabled'; + $data{'maps'}{$c}{'type'} = $b; + $data{'maps'}{$c}{'line'} = $i; + } + } + next; + } + if (@rest) { + warning("$prg: 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("$prg: 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("$prg: double mention 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 { + warning("$prg: unrecognized line $i in $fn: $_\n"); + } + } + return \%data; +} + +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; + } + } + + # + # 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}; + } + } + } + } + return (@missing); +} + +sub read_map_file { + my $fn = shift; + my @lines; + if (!open(MF,"<$fn")) { + warn("cannot open $fn: $!"); + return; + } + @lines = ; + 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; +} + +# +# 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"); + } + } + } +} + + +# +# $HOME and sudo and updmap-sys horror +# some instances of sudo do not reset $HOME to the home of root +# as an effect of "sudo updmap" creates root owned files in the home +# of a normal user, and "sudo updmap-sys" uses map files and updmap.cfg +# files from the directory of a normal user, but creating files +# in TEXMFSYSCONFIG. This is *all* wrong. +# we check: if we are running as UID 0 (root) on Unix and the +# ENV{HOME} is NOT the same as the one of root, then give a warning +# and reset it to the real home dir of root. + +sub reset_root_home { + if (!win32() && ($> == 0)) { # $> is effective uid + my $envhome = $ENV{'HOME'}; + # if $HOME isn't an existing directory, we don't care. + if (defined($envhome) && (-d $envhome)) { + # we want to avoid calling getpwuid as far as possible, so if + # $envhome is one of some usual values we accept it without worrying. + if ($envhome =~ m,^(/|/root|/var/root)/*$,) { + return; + } + # $HOME is defined, check what is the home of root in reality + my (undef,undef,undef,undef,undef,undef,undef,$roothome) = getpwuid(0); + if (defined($roothome)) { + if ($envhome ne $roothome) { + warning("$prg: resetting \$HOME value (was $envhome) to root's " + . "actual home ($roothome).\n"); + $ENV{'HOME'} = $roothome; + } else { + # envhome and roothome do agree, nothing to do, that is the good case + } + } else { + warning("$prg: home of root not defined, strange!\n"); + } + } + } +} + +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 +font files are included in the PDF or PostScript 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) + --dvipdfmxoutputdir DIR specify output directory (dvipdfm(x) 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 + --showoption OPTION show the current setting of OPTION + --showoptions OPTION show possible settings for OPTION + --setoption OPTION VALUE set OPTION to value; option names below + --setoption OPTION=VALUE as above, just different syntax + --enable MAPTYPE MAPFILE add "MAPTYPE MAPFILE" to updmap.cfg, + where MAPTYPE is Map, MixedMap, or 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, of whatever type + --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 devices 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. +KanjiMap entries are added to psfonts_t1.map and kanjix.map. + +Explanation of the OPTION names for --showoptions, --showoption, --setoption: + + dvipsPreferOutline true|false (default true) + Whether dvips uses bitmaps or outlines, when both are available. + dvipsDownloadBase35 true|false (default true) + 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) are under updmap's control. + kanjiEmbed (any string) + kanjiVariant (any string) + See below. + 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) + + 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. + + The options kanjiEmbed and kanjiVariant specify special replacements + in the map lines. If a map contains the string \@kanjiEmbed\@, then + this will be replaced by the value of that option; similarly for + kanjiVariant. In this way, users of Japanese TeX can select different + fonts to be included in the final output. + +Explanation of trees and files normally used: + + If --cnffile is specified on the command line (possibly multiple + times), its value(s) are used. Otherwise, updmap reads all the + updmap.cfg files found by running \`kpsewhich -all updmap.cfg', in the + order returned by kpsewhich, with one exception: an updmap.cfg found + in TEXMFLOCAL is given higher priority than the updmap.cfg in + TEXMFMAIN, to ensure that local adjustments by administrators take + precedence over what is shipped in TeX Live. + + In any case, if multiple updmap.cfg files are found, all the maps + mentioned in all the updmap.cfg files are merged. + + Thus, if updmap.cfg files are present in all trees, and the default + layout is used as shipped with TeX Live, the following files are + read, in the given order. + + For updmap-sys: + TEXMFSYSCONFIG \$TEXLIVE/YYYY/texmf-config/web2c/updmap.cfg + TEXMFSYSVAR \$TEXLIVE/YYYY/texmf-var/web2c/updmap.cfg + TEXMFLOCAL \$TEXLIVE/texmf-local/web2c/updmap.cfg + TEXMFMAIN \$TEXLIVE/YYYY/texmf/web2c/updmap.cfg + TEXMFDIST \$TEXLIVE/YYYY/texmf-dist/web2c/updmap.cfg + + For updmap: + TEXMFCONFIG \$HOME/.texliveYYYY/texmf-config/web2c/updmap.cfg + TEXMFVAR \$HOME/.texliveYYYY/texmf-var/web2c/updmap.cfg + TEXMFHOME \$HOME/texmf/web2c/updmap.cfg + TEXMFSYSCONFIG \$TEXLIVE/YYYY/texmf-config/web2c/updmap.cfg + TEXMFSYSVAR \$TEXLIVE/YYYY/texmf-var/web2c/updmap.cfg + TEXMFLOCAL \$TEXLIVE/texmf-local/web2c/updmap.cfg + TEXMFMAIN \$TEXLIVE/YYYY/texmf/web2c/updmap.cfg + TEXMFDIST \$TEXLIVE/YYYY/texmf-dist/web2c/updmap.cfg + + (where YYYY is the TeX Live release version). + + There is another exception to keep upgradability from earlier versions + of TeX Live: if a file TEXMFLOCAL/web2c/updmap-local.cfg exists + (formerly used by tlmgr to merge local fonts), then the file + TEXMFLOCAL/web2c/updmap.cfg is ignored (if it exists) and that + updmap-local.cfg is used instead. In this case, updmap recognizes the + previous syntax for disabling map files in updmap-local.cfg (this + syntax is different from what is used now). + + According to the actions, updmap might write to one of the given files + or create a new updmap.cfg, described further below. + + Where changes are saved: if config files are given on the command + line, then the first one given will be used to save any changes from + --setoption, --enable or --disable. If the config files are taken + from kpsewhich output, then the algorithm is more complex: + + 1) If \$TEXMFCONFIG/web2c/updmap.cfg or \$TEXMFHOME/web2c/updmap.cfg + appears in the list of used files, then the one listed first by + kpsewhich --all (equivalently, the one returned by kpsewhich + updmap.cfg), is used. + + 2) If neither of the above two are present and changes are made, a + new config file is created in \$TEXMFCONFIG/web2c/updmap.cfg. + + Resolving multiple definitions of a font: + If a font is defined in more than one map file, then the definition + coming from the first-listed updmap.cfg is used. If a font is + defined multiple times within the same map file, one is chosen + arbitrarily. In both cases a warning is issued. + + Disabling maps: + updmap.cfg files with higher priority (listed earlier) can disable + maps mentioned in lower priority (listed later) updmap.cfg files by + writing, e.g., + \#! Map mapname.map + or + \#! MixedMap mapname.map + in the higher-priority updmap.cfg file. + + As an example, suppose you have a copy of MathTime Pro fonts + and want to disable the Belleek version of the fonts; that is, + disable the map belleek.map. You can create the file + \$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 of TEXMFCONFIG and TEXMFVAR, respectively. This is the only + difference between updmap-sys and updmap. + + Other locations may be used if you give them 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 source). + +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: +EOF +; + print &version(); + print $usage; + exit 0; +} + +### Local Variables: +### perl-indent-level: 2 +### tab-width: 2 +### indent-tabs-mode: nil +### End: +# vim:set tabstop=2 expandtab: # diff --git a/Build/source/texk/texlive/linked_scripts/thumbpdf/thumbpdf.1 b/Build/source/texk/texlive/linked_scripts/thumbpdf/thumbpdf.1 new file mode 100644 index 00000000000..d1d7e358f9a --- /dev/null +++ b/Build/source/texk/texlive/linked_scripts/thumbpdf/thumbpdf.1 @@ -0,0 +1,100 @@ +.TH "thumbpdf" "1" "September 2000" "teTeX" "teTeX" +.PP +.SH "NAME" +thumbpdf \- generate thumbnail images for a PDF file +created with \fBpdftex\fP +.PP +.SH "SYNOPSIS" +.PP +\fBthumbpdf\fP [ \fIOPTION\fP\&.\&.\&. ] \fIPDF_FILE\fP +.PP +.SH "DESCRIPTION" +.PP +\fBthumbpdf\fP is used to create thumbnail images of individual pages +within a PDF (Portable Document Format) document\&. +.PP +.SH "USAGE" +.PP +First run \fBpdftex\fP(1) on your document to create a PDF file\&. +Then run \fBthumbpdf\fP to generate the thumbnails, a PDF file +containing the thumbnails, and a pdfTeX file to include the thumbnails +in the PDF file\&. Finally, run \fBpdftex\fP(1) on your file again to +create the final PDF file\&. +.PP +\fBthumbpdf\fP calls \fBgs\fP(1) to generate PNG images of the pages +within \fIPDF_FILE\fP, and \fBpdftex\fP(1) to create a PDF file +containing the thumbnail images\&. +.PP +.SH "OPTIONS" +.PP +.IP "\fB--help\fP" +print usage +.IP "\fB--(no)makepng\fP" +make PNG thumbnail images (default: true) +.IP "\fB--(no)makepdf\fP" +generate new PDF file containing the +thumbnails (default: true) +.IP "\fB--(no)makedef\fP" +create a TeX file for \fBpdftex\fP(1) to +read in (default: true) +.IP "\fB--(no)quiet\fP" +suppress messages (default: false) +.IP "\fB--(no)verbose\fP" +verbose messages (default: false) +.IP "\fB--(no)debug\fP" +print debugging information while parsing +(default: false) +.IP "\fB--resolution\fP \fIres\fP" +resolution for GhostScript step +(default: 9) +.IP "\fB--compress\fP \fIn\fP" +\epdfcompresslevel for \fBthumbpdf\&.pdf\fP +(0-9; default: 9) +.IP "\fB--device\fP | \fBpng\fP\fIdev\fP" +GhostScript PNG device; +\fIdev\fP = `mono\', `gray\', +`16\', `256\', `16m\' (default: +`png16m\') +.PP +.SH "FILES" +.PP +.IP "\fIthumb\fPnn\fI\&.png\fP" +PNG thumbnail images +.IP "\fIthumbpdf\&.pdf\fP" +PDF file containing thumbnail images +.IP "\fIthumbpdf\&.tex\fP" +A pdfTeX program to include the thumbnails +file +.IP "\fIthumbpdf\&.log\fP" +pdfTeX log file +.IP "\fIthumbpdf\&.sty\fP" +a LaTeX package to be included in files +for which a user wants to generate thumbnails +.PP +.SH "SEE ALSO" +.PP +\fBgs\fP(1), \fBpdftex\fP(1)\&. +.PP +Web page: +.PP +.SH "BUGS" +.PP +None known, but report any bugs found to the author\&. +.PP +.SH "COPYRIGHT" +.PP +Copyright © 1999\&. \fBthumbpdf\fP is distributed under +version 1, or (at your option) a later version of the LaTeX Project +Public License\&. +.PP +.SH "AUTHOR" +.PP +\fBthumbpdf\fP was written by Heiko Oberdiek +\&. +.PP +This manual page was written by C\&.M\&. Connelly +, for +the Debian GNU/Linux system\&. It may be used by other distributions +without contacting the author\&. Any mistakes or omissions in the +manual page are my fault; inquiries about or corrections to this +manual page should be directed to me (and not to the primary author)\&. diff --git a/Build/source/texk/texlive/linked_scripts/updmap.help2man b/Build/source/texk/texlive/linked_scripts/updmap.help2man new file mode 100644 index 00000000000..4864c2d74f4 --- /dev/null +++ b/Build/source/texk/texlive/linked_scripts/updmap.help2man @@ -0,0 +1,100 @@ +# $Id$ +# This help2man auxiliary file is in the public domain. +# Originally created by Karl Berry. +# The FILES text from Claire Connelly. +# See the Makefile for the help2man invocation. +# do not fill the long TEXMF* tables. + +[NAME] +updmap \- manage TeX font maps, per-user +.br +updmap-sys \- manage TeX font maps, system-wide + +/in the final output/ +.SH ENVIRONMENT + +/in the given order/ +.nf + +/where YYYY is/ +.fi + +/give the -n option/ +.SH EXAMPLES + +[FILES] +Configuration and input files: +.IP "\fIupdmap\&.cfg\fP" +Main configuration file\&. In +\fItexmf/web2c\fP by default, but may be located elsewhere +depending on your distribution\&. Each texmf tree read should have its +own \fIupdmap.cfg\fP. +.IP "\fIdvips35\&.map\fP" +Map file for standard 35 PostScript fonts for +use with \fBdvips\fP(1)\&. +.IP "\fIpdftex35\&.map\fP" +Map file for standard 35 PostScript fonts for +use with \fBpdftex\fP(1)\&. +.IP "\fIps2pk35\&.map\fP" +Map file for standard 35 PostScript fonts for +use with \fBps2pk\fP(1)\&. +.PP +Output files: +.IP "\fIpsfonts\&.map\fP" +For \fBdvips\fP(1)\&. +Same as \fIpsfonts_t1\&.map\fP if option \fBdvipsPreferOutline\fP active, +else as \fIpsfonts_pk\&.map\fP. +.IP "\fIpsfonts_pk\&.map\fP" +For \fBdvips\fP(1)\&. +Without information from MixedMap files\&. +(Setting of \fBdvipsPreferOutline\fP ignored\&.) +.IP "\fIpsfonts_t1\&.map\fP" +For \fBdvips\fP(1)\&. +With information from MixedMap files\&. +(Setting of \fBdvipsPreferOutline\fP ignored\&.) +.IP "\fIdownload35\&.map\fP" +For \fBdvips\fP(1)\&. +Always downloads the standard 35 fonts\&. +(Setting of \fBdvipsDownloadBase35\fP ignored\&.) +.IP "\fIbuiltin35\&.map\fP" +For \fBdvips\fP(1)\&. +Never downloads the standard 35 fonts\&. +(Setting of \fBdvipsDownloadBase35\fP ignored\&.) +.IP "\fIpdftex\&.map\fP" +For \fBpdftex\fP(1)\&. +Same as \fIpdftex_dl14\&.map\fP if option \fBpdftexDownloadBase14\fP active, +else as \fIpdftex_ndl14\&.map\fP. +.IP "\fIpdftex_dl14\&.map\fP" +For \fBpdftex\fP(1)\&. +Always downloads the standard 14 fonts\&. +.IP "\fIpdftex_ndl14\&.map\fP" +For \fBpdftex\fP(1)\&. +Never downloads the standard 14 fonts\&. +.IP "\fIps2pk\&.map\fP" +Similar to \fIpsfonts.map\fP file, but +forces all fonts to be downloaded, so this map file can be used with +\fBxdvi\fP(1) and \fBps2pk\fP(1)\&. +.PP +Configuration files for \fBdvips\fP(1): +.IP "\fIconfig\&.builtin35\fP" +Loads \fIbuiltin35\&.map\fP instead +of \fIpsfonts\&.map\fP\&. +.IP "\fIconfig\&.download35\fP" +Loads \fIdownload35\&.map\fP instead +of \fIpsfonts\&.map\fP\&. +.IP "\fIconfig\&.outline\fP" +Loads \fIpsfonts_t1\&.map\fP instead +of \fIpsfonts\&.map\fP\&. +.IP "\fIconfig\&.pdf\fP" +Loads \fIpsfonts_t1\&.map\fP instead +of \fIpsfonts\&.map\fP and has additional optimizations for PDF generation\&. +.IP "\fIconfig\&.pk\fP" +Loads \fIpsfonts_pk\&.map\fP instead +of \fIpsfonts\&.map\fP\&. +.IP "\fIconfig\&.www\fP" +Loads \fIpsfonts_t1\&.map\fP instead +of \fIpsfonts\&.map\fP\&. +(For compatibility with old versions\&.) +.IP "\fIconfig\&.gstopk\fP" +Loads \fIpsfonts_t1\&.map\fP instead +of \fIpsfonts\&.map\fP\&. diff --git a/Build/source/texk/texlive/tests/updmap-cmdline-test.pl b/Build/source/texk/texlive/tests/updmap-cmdline-test.pl new file mode 100755 index 00000000000..310344776a1 --- /dev/null +++ b/Build/source/texk/texlive/tests/updmap-cmdline-test.pl @@ -0,0 +1,20 @@ +#!/usr/bin/env perl +# $Id$ +# Public domain. Originally written 2011, Karl Berry. +# Check that updmap can parse various cmdline invocations. + +# srcdir = texlive (in the source tree) +BEGIN { chomp ($srcdir = $ENV{"srcdir"} || `cd \`dirname $0\`/.. && pwd`); } +require "$srcdir/../tests/common-test.pl"; + +exit (&main ()); + +sub main { + my $ret = &test_run ("$srcdir/linked_scripts/tetex/updmap.pl", "--version"); + + # we aren't going to fix this in the current updmap.pl. + # "foo", "--enable Map" + # "-n", "--quiet", + my $bad = $ret != 0; + return $bad; +} diff --git a/Master/bin/alpha-linux/updmap b/Master/bin/alpha-linux/updmap index 5eceaae6d41..71ec4103390 120000 --- a/Master/bin/alpha-linux/updmap +++ b/Master/bin/alpha-linux/updmap @@ -1 +1 @@ -../../texmf/scripts/tetex/updmap.pl \ No newline at end of file +../../texmf-dist/scripts/tetex/updmap.pl \ No newline at end of file diff --git a/Master/bin/alpha-linux/updmap-sys b/Master/bin/alpha-linux/updmap-sys index 87523fb08ed..66d13fd9a52 120000 --- a/Master/bin/alpha-linux/updmap-sys +++ b/Master/bin/alpha-linux/updmap-sys @@ -1 +1 @@ -../../texmf/scripts/tetex/updmap-sys.sh \ No newline at end of file +../../texmf-dist/scripts/tetex/updmap-sys.sh \ No newline at end of file diff --git a/Master/bin/amd64-freebsd/updmap b/Master/bin/amd64-freebsd/updmap index 5eceaae6d41..71ec4103390 120000 --- a/Master/bin/amd64-freebsd/updmap +++ b/Master/bin/amd64-freebsd/updmap @@ -1 +1 @@ -../../texmf/scripts/tetex/updmap.pl \ No newline at end of file +../../texmf-dist/scripts/tetex/updmap.pl \ No newline at end of file diff --git a/Master/bin/amd64-freebsd/updmap-sys b/Master/bin/amd64-freebsd/updmap-sys index 87523fb08ed..66d13fd9a52 120000 --- a/Master/bin/amd64-freebsd/updmap-sys +++ b/Master/bin/amd64-freebsd/updmap-sys @@ -1 +1 @@ -../../texmf/scripts/tetex/updmap-sys.sh \ No newline at end of file +../../texmf-dist/scripts/tetex/updmap-sys.sh \ No newline at end of file diff --git a/Master/bin/amd64-kfreebsd/updmap b/Master/bin/amd64-kfreebsd/updmap index 5eceaae6d41..71ec4103390 120000 --- a/Master/bin/amd64-kfreebsd/updmap +++ b/Master/bin/amd64-kfreebsd/updmap @@ -1 +1 @@ -../../texmf/scripts/tetex/updmap.pl \ No newline at end of file +../../texmf-dist/scripts/tetex/updmap.pl \ No newline at end of file diff --git a/Master/bin/amd64-kfreebsd/updmap-sys b/Master/bin/amd64-kfreebsd/updmap-sys index 87523fb08ed..66d13fd9a52 120000 --- a/Master/bin/amd64-kfreebsd/updmap-sys +++ b/Master/bin/amd64-kfreebsd/updmap-sys @@ -1 +1 @@ -../../texmf/scripts/tetex/updmap-sys.sh \ No newline at end of file +../../texmf-dist/scripts/tetex/updmap-sys.sh \ No newline at end of file diff --git a/Master/bin/armel-linux/updmap b/Master/bin/armel-linux/updmap index 5eceaae6d41..71ec4103390 120000 --- a/Master/bin/armel-linux/updmap +++ b/Master/bin/armel-linux/updmap @@ -1 +1 @@ -../../texmf/scripts/tetex/updmap.pl \ No newline at end of file +../../texmf-dist/scripts/tetex/updmap.pl \ No newline at end of file diff --git a/Master/bin/armel-linux/updmap-sys b/Master/bin/armel-linux/updmap-sys index 87523fb08ed..66d13fd9a52 120000 --- a/Master/bin/armel-linux/updmap-sys +++ b/Master/bin/armel-linux/updmap-sys @@ -1 +1 @@ -../../texmf/scripts/tetex/updmap-sys.sh \ No newline at end of file +../../texmf-dist/scripts/tetex/updmap-sys.sh \ No newline at end of file diff --git a/Master/bin/i386-cygwin/updmap b/Master/bin/i386-cygwin/updmap index 5eceaae6d41..71ec4103390 120000 --- a/Master/bin/i386-cygwin/updmap +++ b/Master/bin/i386-cygwin/updmap @@ -1 +1 @@ -../../texmf/scripts/tetex/updmap.pl \ No newline at end of file +../../texmf-dist/scripts/tetex/updmap.pl \ No newline at end of file diff --git a/Master/bin/i386-cygwin/updmap-sys b/Master/bin/i386-cygwin/updmap-sys index 87523fb08ed..66d13fd9a52 120000 --- a/Master/bin/i386-cygwin/updmap-sys +++ b/Master/bin/i386-cygwin/updmap-sys @@ -1 +1 @@ -../../texmf/scripts/tetex/updmap-sys.sh \ No newline at end of file +../../texmf-dist/scripts/tetex/updmap-sys.sh \ No newline at end of file diff --git a/Master/bin/i386-freebsd/updmap b/Master/bin/i386-freebsd/updmap index 5eceaae6d41..71ec4103390 120000 --- a/Master/bin/i386-freebsd/updmap +++ b/Master/bin/i386-freebsd/updmap @@ -1 +1 @@ -../../texmf/scripts/tetex/updmap.pl \ No newline at end of file +../../texmf-dist/scripts/tetex/updmap.pl \ No newline at end of file diff --git a/Master/bin/i386-freebsd/updmap-sys b/Master/bin/i386-freebsd/updmap-sys index 87523fb08ed..66d13fd9a52 120000 --- a/Master/bin/i386-freebsd/updmap-sys +++ b/Master/bin/i386-freebsd/updmap-sys @@ -1 +1 @@ -../../texmf/scripts/tetex/updmap-sys.sh \ No newline at end of file +../../texmf-dist/scripts/tetex/updmap-sys.sh \ No newline at end of file diff --git a/Master/bin/i386-kfreebsd/updmap b/Master/bin/i386-kfreebsd/updmap index 5eceaae6d41..71ec4103390 120000 --- a/Master/bin/i386-kfreebsd/updmap +++ b/Master/bin/i386-kfreebsd/updmap @@ -1 +1 @@ -../../texmf/scripts/tetex/updmap.pl \ No newline at end of file +../../texmf-dist/scripts/tetex/updmap.pl \ No newline at end of file diff --git a/Master/bin/i386-kfreebsd/updmap-sys b/Master/bin/i386-kfreebsd/updmap-sys index 87523fb08ed..66d13fd9a52 120000 --- a/Master/bin/i386-kfreebsd/updmap-sys +++ b/Master/bin/i386-kfreebsd/updmap-sys @@ -1 +1 @@ -../../texmf/scripts/tetex/updmap-sys.sh \ No newline at end of file +../../texmf-dist/scripts/tetex/updmap-sys.sh \ No newline at end of file diff --git a/Master/bin/i386-linux/updmap b/Master/bin/i386-linux/updmap index 5eceaae6d41..71ec4103390 120000 --- a/Master/bin/i386-linux/updmap +++ b/Master/bin/i386-linux/updmap @@ -1 +1 @@ -../../texmf/scripts/tetex/updmap.pl \ No newline at end of file +../../texmf-dist/scripts/tetex/updmap.pl \ No newline at end of file diff --git a/Master/bin/i386-linux/updmap-sys b/Master/bin/i386-linux/updmap-sys index 87523fb08ed..66d13fd9a52 120000 --- a/Master/bin/i386-linux/updmap-sys +++ b/Master/bin/i386-linux/updmap-sys @@ -1 +1 @@ -../../texmf/scripts/tetex/updmap-sys.sh \ No newline at end of file +../../texmf-dist/scripts/tetex/updmap-sys.sh \ No newline at end of file diff --git a/Master/bin/i386-solaris/updmap b/Master/bin/i386-solaris/updmap index 5eceaae6d41..71ec4103390 120000 --- a/Master/bin/i386-solaris/updmap +++ b/Master/bin/i386-solaris/updmap @@ -1 +1 @@ -../../texmf/scripts/tetex/updmap.pl \ No newline at end of file +../../texmf-dist/scripts/tetex/updmap.pl \ No newline at end of file diff --git a/Master/bin/i386-solaris/updmap-sys b/Master/bin/i386-solaris/updmap-sys index 87523fb08ed..66d13fd9a52 120000 --- a/Master/bin/i386-solaris/updmap-sys +++ b/Master/bin/i386-solaris/updmap-sys @@ -1 +1 @@ -../../texmf/scripts/tetex/updmap-sys.sh \ No newline at end of file +../../texmf-dist/scripts/tetex/updmap-sys.sh \ No newline at end of file diff --git a/Master/bin/mipsel-linux/updmap b/Master/bin/mipsel-linux/updmap index 5eceaae6d41..71ec4103390 120000 --- a/Master/bin/mipsel-linux/updmap +++ b/Master/bin/mipsel-linux/updmap @@ -1 +1 @@ -../../texmf/scripts/tetex/updmap.pl \ No newline at end of file +../../texmf-dist/scripts/tetex/updmap.pl \ No newline at end of file diff --git a/Master/bin/mipsel-linux/updmap-sys b/Master/bin/mipsel-linux/updmap-sys index 87523fb08ed..66d13fd9a52 120000 --- a/Master/bin/mipsel-linux/updmap-sys +++ b/Master/bin/mipsel-linux/updmap-sys @@ -1 +1 @@ -../../texmf/scripts/tetex/updmap-sys.sh \ No newline at end of file +../../texmf-dist/scripts/tetex/updmap-sys.sh \ No newline at end of file diff --git a/Master/bin/powerpc-aix/updmap b/Master/bin/powerpc-aix/updmap index 5eceaae6d41..71ec4103390 120000 --- a/Master/bin/powerpc-aix/updmap +++ b/Master/bin/powerpc-aix/updmap @@ -1 +1 @@ -../../texmf/scripts/tetex/updmap.pl \ No newline at end of file +../../texmf-dist/scripts/tetex/updmap.pl \ No newline at end of file diff --git a/Master/bin/powerpc-aix/updmap-sys b/Master/bin/powerpc-aix/updmap-sys index 87523fb08ed..66d13fd9a52 120000 --- a/Master/bin/powerpc-aix/updmap-sys +++ b/Master/bin/powerpc-aix/updmap-sys @@ -1 +1 @@ -../../texmf/scripts/tetex/updmap-sys.sh \ No newline at end of file +../../texmf-dist/scripts/tetex/updmap-sys.sh \ No newline at end of file diff --git a/Master/bin/powerpc-linux/updmap b/Master/bin/powerpc-linux/updmap index 5eceaae6d41..71ec4103390 120000 --- a/Master/bin/powerpc-linux/updmap +++ b/Master/bin/powerpc-linux/updmap @@ -1 +1 @@ -../../texmf/scripts/tetex/updmap.pl \ No newline at end of file +../../texmf-dist/scripts/tetex/updmap.pl \ No newline at end of file diff --git a/Master/bin/powerpc-linux/updmap-sys b/Master/bin/powerpc-linux/updmap-sys index 87523fb08ed..66d13fd9a52 120000 --- a/Master/bin/powerpc-linux/updmap-sys +++ b/Master/bin/powerpc-linux/updmap-sys @@ -1 +1 @@ -../../texmf/scripts/tetex/updmap-sys.sh \ No newline at end of file +../../texmf-dist/scripts/tetex/updmap-sys.sh \ No newline at end of file diff --git a/Master/bin/sparc-solaris/updmap b/Master/bin/sparc-solaris/updmap index 5eceaae6d41..71ec4103390 120000 --- a/Master/bin/sparc-solaris/updmap +++ b/Master/bin/sparc-solaris/updmap @@ -1 +1 @@ -../../texmf/scripts/tetex/updmap.pl \ No newline at end of file +../../texmf-dist/scripts/tetex/updmap.pl \ No newline at end of file diff --git a/Master/bin/sparc-solaris/updmap-sys b/Master/bin/sparc-solaris/updmap-sys index 87523fb08ed..66d13fd9a52 120000 --- a/Master/bin/sparc-solaris/updmap-sys +++ b/Master/bin/sparc-solaris/updmap-sys @@ -1 +1 @@ -../../texmf/scripts/tetex/updmap-sys.sh \ No newline at end of file +../../texmf-dist/scripts/tetex/updmap-sys.sh \ No newline at end of file diff --git a/Master/bin/universal-darwin/updmap b/Master/bin/universal-darwin/updmap index 5eceaae6d41..71ec4103390 120000 --- a/Master/bin/universal-darwin/updmap +++ b/Master/bin/universal-darwin/updmap @@ -1 +1 @@ -../../texmf/scripts/tetex/updmap.pl \ No newline at end of file +../../texmf-dist/scripts/tetex/updmap.pl \ No newline at end of file diff --git a/Master/bin/universal-darwin/updmap-sys b/Master/bin/universal-darwin/updmap-sys index 87523fb08ed..66d13fd9a52 120000 --- a/Master/bin/universal-darwin/updmap-sys +++ b/Master/bin/universal-darwin/updmap-sys @@ -1 +1 @@ -../../texmf/scripts/tetex/updmap-sys.sh \ No newline at end of file +../../texmf-dist/scripts/tetex/updmap-sys.sh \ No newline at end of file diff --git a/Master/bin/x86_64-darwin/updmap b/Master/bin/x86_64-darwin/updmap index 5eceaae6d41..71ec4103390 120000 --- a/Master/bin/x86_64-darwin/updmap +++ b/Master/bin/x86_64-darwin/updmap @@ -1 +1 @@ -../../texmf/scripts/tetex/updmap.pl \ No newline at end of file +../../texmf-dist/scripts/tetex/updmap.pl \ No newline at end of file diff --git a/Master/bin/x86_64-darwin/updmap-sys b/Master/bin/x86_64-darwin/updmap-sys index 87523fb08ed..66d13fd9a52 120000 --- a/Master/bin/x86_64-darwin/updmap-sys +++ b/Master/bin/x86_64-darwin/updmap-sys @@ -1 +1 @@ -../../texmf/scripts/tetex/updmap-sys.sh \ No newline at end of file +../../texmf-dist/scripts/tetex/updmap-sys.sh \ No newline at end of file diff --git a/Master/bin/x86_64-linux/updmap b/Master/bin/x86_64-linux/updmap index 5eceaae6d41..71ec4103390 120000 --- a/Master/bin/x86_64-linux/updmap +++ b/Master/bin/x86_64-linux/updmap @@ -1 +1 @@ -../../texmf/scripts/tetex/updmap.pl \ No newline at end of file +../../texmf-dist/scripts/tetex/updmap.pl \ No newline at end of file diff --git a/Master/bin/x86_64-linux/updmap-sys b/Master/bin/x86_64-linux/updmap-sys index 87523fb08ed..66d13fd9a52 120000 --- a/Master/bin/x86_64-linux/updmap-sys +++ b/Master/bin/x86_64-linux/updmap-sys @@ -1 +1 @@ -../../texmf/scripts/tetex/updmap-sys.sh \ No newline at end of file +../../texmf-dist/scripts/tetex/updmap-sys.sh \ No newline at end of file diff --git a/Master/bin/x86_64-solaris/updmap b/Master/bin/x86_64-solaris/updmap index 5eceaae6d41..71ec4103390 120000 --- a/Master/bin/x86_64-solaris/updmap +++ b/Master/bin/x86_64-solaris/updmap @@ -1 +1 @@ -../../texmf/scripts/tetex/updmap.pl \ No newline at end of file +../../texmf-dist/scripts/tetex/updmap.pl \ No newline at end of file diff --git a/Master/bin/x86_64-solaris/updmap-sys b/Master/bin/x86_64-solaris/updmap-sys index 87523fb08ed..66d13fd9a52 120000 --- a/Master/bin/x86_64-solaris/updmap-sys +++ b/Master/bin/x86_64-solaris/updmap-sys @@ -1 +1 @@ -../../texmf/scripts/tetex/updmap-sys.sh \ No newline at end of file +../../texmf-dist/scripts/tetex/updmap-sys.sh \ No newline at end of file diff --git a/Master/texmf-dist/scripts/tetex/updmap-sys.sh b/Master/texmf-dist/scripts/tetex/updmap-sys.sh new file mode 100755 index 00000000000..6f3c8365658 --- /dev/null +++ b/Master/texmf-dist/scripts/tetex/updmap-sys.sh @@ -0,0 +1,30 @@ +#!/bin/sh + +# updmap-sys: Thomas Esser, public domain. + +# wrapper script for updmap with TEXMFVAR and TEXMFCONFIG set to +# TEXMFSYSVAR / TEXMFSYSCONFIG + +test -f /bin/ksh && test -z "$RUNNING_KSH" \ + && { UNAMES=`uname -s`; test "x$UNAMES" = xULTRIX; } 2>/dev/null \ + && { RUNNING_KSH=true; export RUNNING_KSH; exec /bin/ksh $0 ${1+"$@"}; } +unset RUNNING_KSH + +test -f /bin/bsh && test -z "$RUNNING_BSH" \ + && { UNAMES=`uname -s`; test "x$UNAMES" = xAIX; } 2>/dev/null \ + && { RUNNING_BSH=true; export RUNNING_BSH; exec /bin/bsh $0 ${1+"$@"}; } +unset RUNNING_BSH + +export PATH + +# hack around a bug in zsh: +test -n "${ZSH_VERSION+set}" && alias -g '${1+"$@"}'='"$@"' + +v=`kpsewhich -var-value TEXMFSYSVAR` +c=`kpsewhich -var-value TEXMFSYSCONFIG` + +TEXMFVAR="$v" +TEXMFCONFIG="$c" +export TEXMFVAR TEXMFCONFIG + +exec updmap ${1+"$@"} diff --git a/Master/texmf-dist/scripts/tetex/updmap.pl b/Master/texmf-dist/scripts/tetex/updmap.pl new file mode 100755 index 00000000000..68d05bb82eb --- /dev/null +++ b/Master/texmf-dist/scripts/tetex/updmap.pl @@ -0,0 +1,2163 @@ +#!/usr/bin/env perl +# mupdmap: utility to maintain map files for outline fonts. +# $Id: updmap.pl 27264 2012-07-31 05:10:29Z 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 +# - after TL2012? Maybe remove support for reading updmap-local.cfg +# + +my $TEXMFROOT; + +BEGIN { + $^W=1; + $TEXMFROOT = `kpsewhich -var-value=TEXMFROOT`; + if ($?) { + print STDERR "updmap: Cannot find TEXMFROOT, aborting!\n"; + exit 1; + } + chomp($TEXMFROOT); + unshift (@INC, "$TEXMFROOT/tlpkg"); +} + + +my $version = '$Id: updmap.pl 27264 2012-07-31 05:10:29Z preining $'; + +use Getopt::Long qw(:config no_autoabbrev ignore_case_always); +use strict; +use TeXLive::TLUtils qw(mkdirhier mktexupd win32 basename dirname + sort_uniq member); + +#use Data::Dumper; +#$Data::Dumper::Indent = 1; + +(my $prg = basename($0)) =~ s/\.pl$//; + +# sudo sometimes does not reset the home dir of root, check on that +# see more comments at the definition of the function itself +# this function checks by itself whether it is running on windows or not +reset_root_home(); + +chomp(my $TEXMFMAIN = `kpsewhich --var-value=TEXMFMAIN`); +chomp(my $TEXMFVAR = `kpsewhich -var-value=TEXMFVAR`); +chomp(my $TEXMFCONFIG = `kpsewhich -var-value=TEXMFCONFIG`); +chomp(my $TEXMFHOME = `kpsewhich -var-value=TEXMFHOME`); + +# 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); + $TEXMFHOME = lc($TEXMFHOME); +} + + +my %opts = ( quiet => 0, nohash => 0, nomkmap => 0 ); +my $alldata; +my $updLSR; + +my @cmdline_options = ( + "listfiles", + "cnffile=s@", + "copy", + "disable=s@", + "dvipdfmoutputdir=s", + "dvipdfmxoutputdir=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", + ); + +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", + }, + kanjiVariant => { + type => "any", + default => "", + }, +); + +&main(); + +############### + +sub main { + processOptions(); + + help() if $opts{'help'}; + + if ($opts{'version'}) { + print version(); + exit (0); + } + + if ($opts{'dvipdfmoutputdir'} && !defined($opts{'dvipdfmxoutputdir'})) { + $opts{'dvipdfmxoutputdir'} = $opts{'dvipdfmoutputdir'}; + printf STDERR "Using --dvipdfmoutputdir options for dvipdfmx, but please use --dvipdfmxoutputdir\n"; + } + + if ($opts{'dvipdfmoutputdir'} && $opts{'dvipdfmxoutputdir'} && + $opts{'dvipdfmoutputdir'} ne $opts{'dvipdfmxoutputdir'}) { + printf STDERR "Options for --dvipdfmoutputdir and --dvipdfmxoutputdir do not agree\nplease use only --dvipdfmxoutputdir. Exiting.\n"; + exit(1); + } + + 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; + } + + 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; + + # determine which config files should be used + # replaces the former "setupCfgFile" + # + # we also determine here where changes will be saved to + if ($opts{'cnffile'}) { + my @tmp; + for my $f (@{$opts{'cnffile'}}) { + if (! -f $f) { + die "$prg: Config file \"$f\" not found."; + } + push @tmp, (win32() ? lc($f) : $f); + } + @{$opts{'cnffile'}} = @tmp; + # 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; + for my $f (@all_files) { + push @used_files, (win32() ? lc($f) : $f); + } + # + my $TEXMFLOCALVAR; + my @TEXMFLOCAL; + if (win32()) { + chomp($TEXMFLOCALVAR =`kpsewhich --expand-path=\$TEXMFLOCAL`); + @TEXMFLOCAL = map { lc } split(/;/ , $TEXMFLOCALVAR); + } else { + chomp($TEXMFLOCALVAR =`kpsewhich --expand-path='\$TEXMFLOCAL'`); + @TEXMFLOCAL = split /:/ , $TEXMFLOCALVAR; + } + # + # search for TEXMFLOCAL/web2c/updmap.cfg + # check for compatibility with old updmap-local.cfg + my @tmlused; + for my $tml (@TEXMFLOCAL) { + my $TMLabs = Cwd::abs_path($tml); + next if (!$TMLabs); + my $oldfound = 0; + if (-r "$TMLabs/web2c/updmap-local.cfg") { + push @tmlused, "$TMLabs/web2c/updmap-local.cfg"; + warning("Old configuration file\n $TMLabs/web2c/updmap-local.cfg\nfound! "); + $oldfound = 1; + } + if (-r "$TMLabs/web2c/updmap.cfg") { + if ($oldfound) { + warning("Will read it *instead* of\n $TMLabs/web2c/updmap.cfg\n"); + } else { + push @tmlused, "$TMLabs/web2c/updmap.cfg"; + } + } + warning("Please consider moving the information from updmap-local.cfg to\n $TMLabs/web2c/updmap.cfg\n") + if ($oldfound); + } + # + # reorder used files: we move TEXMFLOCAL (if used) just above TEXMFMAIN + # as sysadmins will probably adjust values there + # + # updmap (user): + # ============== + # as found: + # TEXMFCONFIG $HOME/.texliveYYYY/texmf-config/web2c/updmap.cfg + # TEXMFVAR $HOME/.texliveYYYY/texmf-var/web2c/updmap.cfg + # TEXMFHOME $HOME/texmf/web2c/updmap.cfg + # TEXMFSYSCONFIG $TEXLIVE/YYYY/texmf-config/web2c/updmap.cfg + # TEXMFSYSVAR $TEXLIVE/YYYY/texmf-var/web2c/updmap.cfg + # TEXMFMAIN $TEXLIVE/YYYY/texmf/web2c/updmap.cfg + # TEXMFLOCAL $TEXLIVE/texmf-local/web2c/updmap.cfg + # TEXMFDIST $TEXLIVE/YYYY/texmf-dist/web2c/updmap.cfg + # + # as used: + # TEXMFCONFIG $HOME/.texliveYYYY/texmf-config/web2c/updmap.cfg + # TEXMFVAR $HOME/.texliveYYYY/texmf-var/web2c/updmap.cfg + # TEXMFHOME $HOME/texmf/web2c/updmap.cfg + # TEXMFSYSCONFIG $TEXLIVE/YYYY/texmf-config/web2c/updmap.cfg + # TEXMFSYSVAR $TEXLIVE/YYYY/texmf-var/web2c/updmap.cfg + # TEXMFLOCAL $TEXLIVE/texmf-local/web2c/updmap.cfg + # TEXMFMAIN $TEXLIVE/YYYY/texmf/web2c/updmap.cfg + # TEXMFDIST $TEXLIVE/YYYY/texmf-dist/web2c/updmap.cfg + # + # updmap-sys (root): + # ================== + # as found: + # TEXMFSYSCONFIG $TEXLIVE/YYYY/texmf-config/web2c/updmap.cfg + # TEXMFSYSVAR $TEXLIVE/YYYY/texmf-var/web2c/updmap.cfg + # TEXMFMAIN $TEXLIVE/YYYY/texmf/web2c/updmap.cfg + # TEXMFLOCAL $TEXLIVE/texmf-local/web2c/updmap.cfg + # TEXMFDIST $TEXLIVE/YYYY/texmf-dist/web2c/updmap.cfg + # + # as used: + # TEXMFSYSCONFIG $TEXLIVE/YYYY/texmf-config/web2c/updmap.cfg + # TEXMFSYSVAR $TEXLIVE/YYYY/texmf-var/web2c/updmap.cfg + # TEXMFLOCAL $TEXLIVE/texmf-local/web2c/updmap.cfg + # TEXMFMAIN $TEXLIVE/YYYY/texmf/web2c/updmap.cfg + # TEXMFDIST $TEXLIVE/YYYY/texmf-dist/web2c/updmap.cfg + # + if (@tmlused) { + my @tmp; + for my $f (@used_files) { + if ($f =~ m!\Q$TEXMFMAIN/\E!) { + push @tmp, @tmlused; + push @tmp, $f; + } else { + my $pushit = 1; + for my $tml (@TEXMFLOCAL) { + if ($f =~ m!\Q$tml\E!) { + $pushit = 0; + last; + } + } + push @tmp, $f if ($pushit); + } + } + @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!(\Q$TEXMFHOME\E|\Q$TEXMFCONFIG\E)/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"; + } + } + if (!$opts{'quiet'}) { + print "$prg is using the following updmap.cfg files (in precedence order):\n"; + for my $f (@{$opts{'cnffile'}}) { + print " $f\n"; + } + print "$prg is using the following updmap.cfg file for writing changes:\n"; + print " $changes_config_file\n"; + } + if ($opts{'listfiles'}) { + # we listed it above, so be done + exit 0; + } + + $alldata->{'changes_config'} = $changes_config_file; + + read_updmap_files(@{$opts{'cnffile'}}); + + if ($opts{'showoption'}) { + for my $o (@{$opts{'showoption'}}) { + if (defined($settings{$o})) { + my ($v, $vo) = get_cfg($o); + $v = "\"$v\"" if ($v =~ m/\s/); + print "$o=$v ($vo)\n"; + } else { + printf STDERR "$prg: unknown option: $o\n"; + } + } + exit 0; + } + + 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; + } + + # 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; + + if ($opts{'syncwithtrees'}) { + my @missing = read_map_files(); + if (@missing) { + print "Missing map files found, disabling\n"; + for my $m (@missing) { + my $orig = $alldata->{'maps'}{$m}{'origin'}; + print "\t$m (in $orig)\n"; + } + print "in $changes_config_file\n"; + print "Do you really want to continue (y/N)? "; + my $answer = ; + $answer = "n" if !defined($answer); + chomp($answer); + print "answer =$answer=\n"; + if ($answer ne "y" && $answer ne "Y") { + print "Please fix manually before running updmap(-sys) again!\n"; + exit 0; + } + $changed ||= enable_disable_maps(@missing); + print "finished.\n"; + # the original script did not run any update of the map files here, + # should we do that? + } + exit 0; + } + + $updLSR = &mktexupd(); + $updLSR->{mustexist}(0); + + my $cmd; + if ($opts{'edit'}) { + if ($opts{"dry-run"}) { + printf STDERR "No, are you joking, you want to edit with --dry-run?\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'}}); + } + + + 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("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); + } + + if (!$opts{'nohash'}) { + print "$prg: Updating ls-R files.\n" if !$opts{'quiet'}; + $updLSR->{exec}() unless $opts{"dry-run"}; + } + + return 0; +} + +################################################################## +# +# + +sub getFonts { + my ($first, @rest) = @_; + my $getall = 0; + my @maps = (); + return if !defined($first); + if ($first eq "-all") { + $getall = 1; + @maps = @rest; + } else { + @maps = ($first, @rest); + } + my @lines = (); + 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'}; + } + } + } + } + chomp @lines; + return @lines; +} + +############################################################################### +# writeLines() +# write the lines in $filename +# +sub writeLines { + my ($fname, @lines) = @_; + return if $opts{"dry-run"}; + map { ($_ !~ m/\n$/ ? s/$/\n/ : $_ ) } @lines; + open FILE, ">$fname" or die "$prg: can't write lines to $fname: $!"; + print FILE @lines; + close FILE; +} + +############################################################################### +# 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 { + 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; + } + return @out; +} + +############################################################################### +# setupSymlinks() +# set symlink for psfonts.map according to dvipsPreferOutline variable +# +sub setupSymlinks { + my ($dvipsPreferOutline, $dvipsoutputdir, $pdftexDownloadBase14, $pdftexoutputdir) = @_; + my $src; + my %link; + my @link; + + if ($dvipsPreferOutline eq "true") { + $src = "psfonts_t1.map"; + } else { + $src = "psfonts_pk.map"; + } + unlink "$dvipsoutputdir/psfonts.map" unless $opts{"dry-run"}; + push @link, &SymlinkOrCopy("$dvipsoutputdir", "$src", "psfonts.map"); + + if ($pdftexDownloadBase14 eq "true") { + $src = "pdftex_dl14.map"; + } else { + $src = "pdftex_ndl14.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(mode args ...) +# transform fontname and filenames according to transformation specified +# by mode. Possible values: +# URW|URWkb|ADOBE|ADOBEkb +# +sub transLW35 { + 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 + } elsif ($mode eq "URW") { + for my $r (@fileURW) { + map { eval($r); } @lines; + } + } elsif ($mode eq "ADOBE" || $mode eq "ADOBEkb") { + for my $r (@psADOBE) { + map { eval($r); } @lines; + } + my @filemode = eval ("\@file" . $mode); + for my $r (@filemode) { + map { eval($r); } @lines; + } + } + return @lines; +} + +############################################################################### +# 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"); + } +} + +sub mkMaps { + my $logfile; + + $logfile = "$TEXMFVAR/web2c/updmap.log"; + + 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"; + } + } + 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'}; + } + + 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'); + my ($kanjiVariant, $kanjiVariant_origin) = get_cfg('kanjiVariant'); + + 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 kanjiVariant replacement string : " + . "$kanjiVariant ($kanjiVariant_origin)" + . "\n create a mapfile for pxdvi : " + . "$pxdviUse ($pxdviUse_origin)" + . "\n\n"); + + 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"); + } + } + 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"); + } + } + 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 { + only_log("$m (full path not set?)\n"); + } + } + only_log("\n"); + print_and_log (sprintf(" [%3d files]\n\n", scalar @notmixedmaps)); + only_log("\n"); + + # Create psfonts_t1.map, psfonts_pk.map, ps2pk.map and pdftex.map: + my $dvipsoutputdir = $opts{'dvipsoutputdir'}; + my $pdftexoutputdir = $opts{'pdftexoutputdir'}; + my $dvipdfmxoutputdir = $opts{'dvipdfmxoutputdir'}; + 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", + "$dvipdfmxoutputdir/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; + } + } + + 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); + + print "Generating output for dvipdfmx...\n" if !$opts{'quiet'}; + &writeLines(">$dvipdfmxoutputdir/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); + } + + + 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; + } + 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)); + + 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)); + + 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 @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); + + 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); + + 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 (-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'}; + } + } + + 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="$dvipdfmxoutputdir"; + 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'}; + +} + + +sub locateMap { + my $map = shift; + my $ret = `kpsewhich --format=map $map`; + chomp($ret); + return $ret; +} + +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 { + 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"; + + @{$opts{'setoption'}} = @setoptions if (@setoptions); + @{$opts{'enable'}} = @enable if (@enable); + + Getopt::Long::Configure($oldconfig); + + # now continue with normal option handling + + GetOptions(\%opts, @cmdline_options) or + die "Try \"$prg --help\" for more information.\n"; +} + +# 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"; + } + } + my $od = $opts{$driver . "outputdir"}; + if (!$opts{"dry-run"}) { + &mkdirhier($od); + if (! -w $od) { + die "$prg: Directory \"$od\" isn't writable: $!"; + } + } + print "$driver output dir: \"$od\"\n" if !$opts{'quiet'}; + return $od; +} + +############################################################################### +# 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 setOptions { + my (@options) = @_; + for (my $i = 0; $i < @options; $i++) { + my $o = $options[$i]; + + my ($key,$val) = split (/=/, $o, 2); + + die "$prg: unexpected empty key or val for options (@options), goodbye.\n" + if !$key || !defined($val); + + &setOption ($key, $val); + } + 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 { + # this is --disable MapName + disable_map($tc, $w); + } + } + merge_settings(); + return save_updmap($tc); +} + +sub enable_map { + my ($tc, $type, $map) = @_; + + die "$prg: invalid mapType $type" if ($type !~ m/^(Map|MixedMap|KanjiMap)$/); + + 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 { + # 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"; + } +} + +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 { + $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; + } +} + + +# 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"; + # update lsR database + $updLSR->{add}($fn); + $updLSR->{exec}(); + # reset the LSR stuff, otherwise we add files several times + $updLSR->{reset}(); + } + # 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; + } + } + } + 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; + } + return 0; +} + +###################### +# 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; +} + +############################################################################### +# 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) = @_; + + die "$prg: Unsupported option $opt." if (!defined($settings{$opt})); + die "$0: Invalid value $val for option $opt." + if (!check_option($opt, $val)); + + # silently accept this old option name, just in case. + return if $opt eq "dvipdfmDownloadBase14"; + + #print "Setting option $opt to $val...\n" if !$opts{'quiet'}; + my $tc = $alldata->{'changes_config'}; + + die "$prg: top config file $tc has not been read." + if (!defined($alldata->{'updmap'}{$tc})); + + 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; + } +} + + +############################################################################### +# copyFile() +# copy file $src to $dst, sets $dst creation and mod time +# +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 ; + close(OUT); + close(IN); + my @t = stat($src); + utime($t[8], $t[9], $dst); +} + +############################################################################### +# 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; + + open IN, "$file_A"; + my $A=(); + close IN; + open IN, "$file_B"; + my $B=(); + close IN; + + $retval=1 if ($A eq $B); + return $retval; +} + +############################################################################### +# 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; + + 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 = (); + 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)); +} + +############################################################################### +# 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; + + # @lines = grep {++$count{$_} < 2 } (sort @lines); + @lines = grep {++$count{$_} < 2 } (@lines); + + return @lines; +} + + +################################################################# +# +# 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 data and check for kanji embed + merge_settings(); +} + +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; + } + } + } + # + my ($kanjiEmbed, $kanjiEmbed_origin) = get_cfg('kanjiEmbed'); + my ($kanjiVariant, $kanjiVariant_origin) = get_cfg('kanjiVariant'); + # + # go through all map files and check that the text is properly replaced + # after the replacement check that the generated map file actually + # exists, we do NOT want to break in this case! + # + for my $l (@l) { + for my $m (keys %{$alldata->{'updmap'}{$l}{'maps'}}) { + if ($m =~ m/\@kanjiEmbed@/ || $m =~ m/\@kanjiVariant@/) { + my $newm = $m; + $newm =~ s/\@kanjiEmbed@/$kanjiEmbed/; + $newm =~ s/\@kanjiVariant@/$kanjiVariant/; + if (locateMap($newm)) { + # 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; + } else { + print "$prg: generated map $newm (from $m) does not exists, not activating it!\n"; + } + # in any case delete the @kanji...@ entry line, such a map will + # never exist + 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 = ; + 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 ' '; + # make sure we get empty strings as arguments + $b = "" if (!defined($b)); + if ($a eq "#!") { + if ($b eq "Map" || $b eq "MixedMap" || $b eq "KanjiMap") { + my $c = shift @rest; + if (!defined($c)) { + warning("$prg: apparently not a real disable line, ignored: $_\n"); + } else { + if (defined($data{'maps'}{$c})) { + warning("$prg: double mention of $c in $fn\n"); + } + $data{'maps'}{$c}{'status'} = 'disabled'; + $data{'maps'}{$c}{'type'} = $b; + $data{'maps'}{$c}{'line'} = $i; + } + } + next; + } + if (@rest) { + warning("$prg: 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("$prg: 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("$prg: double mention 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 { + warning("$prg: unrecognized line $i in $fn: $_\n"); + } + } + return \%data; +} + +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; + } + } + + # + # 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}; + } + } + } + } + return (@missing); +} + +sub read_map_file { + my $fn = shift; + my @lines; + if (!open(MF,"<$fn")) { + warn("cannot open $fn: $!"); + return; + } + @lines = ; + 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; +} + +# +# 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"); + } + } + } +} + + +# +# $HOME and sudo and updmap-sys horror +# some instances of sudo do not reset $HOME to the home of root +# as an effect of "sudo updmap" creates root owned files in the home +# of a normal user, and "sudo updmap-sys" uses map files and updmap.cfg +# files from the directory of a normal user, but creating files +# in TEXMFSYSCONFIG. This is *all* wrong. +# we check: if we are running as UID 0 (root) on Unix and the +# ENV{HOME} is NOT the same as the one of root, then give a warning +# and reset it to the real home dir of root. + +sub reset_root_home { + if (!win32() && ($> == 0)) { # $> is effective uid + my $envhome = $ENV{'HOME'}; + # if $HOME isn't an existing directory, we don't care. + if (defined($envhome) && (-d $envhome)) { + # we want to avoid calling getpwuid as far as possible, so if + # $envhome is one of some usual values we accept it without worrying. + if ($envhome =~ m,^(/|/root|/var/root)/*$,) { + return; + } + # $HOME is defined, check what is the home of root in reality + my (undef,undef,undef,undef,undef,undef,undef,$roothome) = getpwuid(0); + if (defined($roothome)) { + if ($envhome ne $roothome) { + warning("$prg: resetting \$HOME value (was $envhome) to root's " + . "actual home ($roothome).\n"); + $ENV{'HOME'} = $roothome; + } else { + # envhome and roothome do agree, nothing to do, that is the good case + } + } else { + warning("$prg: home of root not defined, strange!\n"); + } + } + } +} + +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 +font files are included in the PDF or PostScript 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) + --dvipdfmxoutputdir DIR specify output directory (dvipdfm(x) 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 + --showoption OPTION show the current setting of OPTION + --showoptions OPTION show possible settings for OPTION + --setoption OPTION VALUE set OPTION to value; option names below + --setoption OPTION=VALUE as above, just different syntax + --enable MAPTYPE MAPFILE add "MAPTYPE MAPFILE" to updmap.cfg, + where MAPTYPE is Map, MixedMap, or 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, of whatever type + --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 devices 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. +KanjiMap entries are added to psfonts_t1.map and kanjix.map. + +Explanation of the OPTION names for --showoptions, --showoption, --setoption: + + dvipsPreferOutline true|false (default true) + Whether dvips uses bitmaps or outlines, when both are available. + dvipsDownloadBase35 true|false (default true) + 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) are under updmap's control. + kanjiEmbed (any string) + kanjiVariant (any string) + See below. + 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) + + 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. + + The options kanjiEmbed and kanjiVariant specify special replacements + in the map lines. If a map contains the string \@kanjiEmbed\@, then + this will be replaced by the value of that option; similarly for + kanjiVariant. In this way, users of Japanese TeX can select different + fonts to be included in the final output. + +Explanation of trees and files normally used: + + If --cnffile is specified on the command line (possibly multiple + times), its value(s) are used. Otherwise, updmap reads all the + updmap.cfg files found by running \`kpsewhich -all updmap.cfg', in the + order returned by kpsewhich, with one exception: an updmap.cfg found + in TEXMFLOCAL is given higher priority than the updmap.cfg in + TEXMFMAIN, to ensure that local adjustments by administrators take + precedence over what is shipped in TeX Live. + + In any case, if multiple updmap.cfg files are found, all the maps + mentioned in all the updmap.cfg files are merged. + + Thus, if updmap.cfg files are present in all trees, and the default + layout is used as shipped with TeX Live, the following files are + read, in the given order. + + For updmap-sys: + TEXMFSYSCONFIG \$TEXLIVE/YYYY/texmf-config/web2c/updmap.cfg + TEXMFSYSVAR \$TEXLIVE/YYYY/texmf-var/web2c/updmap.cfg + TEXMFLOCAL \$TEXLIVE/texmf-local/web2c/updmap.cfg + TEXMFMAIN \$TEXLIVE/YYYY/texmf/web2c/updmap.cfg + TEXMFDIST \$TEXLIVE/YYYY/texmf-dist/web2c/updmap.cfg + + For updmap: + TEXMFCONFIG \$HOME/.texliveYYYY/texmf-config/web2c/updmap.cfg + TEXMFVAR \$HOME/.texliveYYYY/texmf-var/web2c/updmap.cfg + TEXMFHOME \$HOME/texmf/web2c/updmap.cfg + TEXMFSYSCONFIG \$TEXLIVE/YYYY/texmf-config/web2c/updmap.cfg + TEXMFSYSVAR \$TEXLIVE/YYYY/texmf-var/web2c/updmap.cfg + TEXMFLOCAL \$TEXLIVE/texmf-local/web2c/updmap.cfg + TEXMFMAIN \$TEXLIVE/YYYY/texmf/web2c/updmap.cfg + TEXMFDIST \$TEXLIVE/YYYY/texmf-dist/web2c/updmap.cfg + + (where YYYY is the TeX Live release version). + + There is another exception to keep upgradability from earlier versions + of TeX Live: if a file TEXMFLOCAL/web2c/updmap-local.cfg exists + (formerly used by tlmgr to merge local fonts), then the file + TEXMFLOCAL/web2c/updmap.cfg is ignored (if it exists) and that + updmap-local.cfg is used instead. In this case, updmap recognizes the + previous syntax for disabling map files in updmap-local.cfg (this + syntax is different from what is used now). + + According to the actions, updmap might write to one of the given files + or create a new updmap.cfg, described further below. + + Where changes are saved: if config files are given on the command + line, then the first one given will be used to save any changes from + --setoption, --enable or --disable. If the config files are taken + from kpsewhich output, then the algorithm is more complex: + + 1) If \$TEXMFCONFIG/web2c/updmap.cfg or \$TEXMFHOME/web2c/updmap.cfg + appears in the list of used files, then the one listed first by + kpsewhich --all (equivalently, the one returned by kpsewhich + updmap.cfg), is used. + + 2) If neither of the above two are present and changes are made, a + new config file is created in \$TEXMFCONFIG/web2c/updmap.cfg. + + Resolving multiple definitions of a font: + If a font is defined in more than one map file, then the definition + coming from the first-listed updmap.cfg is used. If a font is + defined multiple times within the same map file, one is chosen + arbitrarily. In both cases a warning is issued. + + Disabling maps: + updmap.cfg files with higher priority (listed earlier) can disable + maps mentioned in lower priority (listed later) updmap.cfg files by + writing, e.g., + \#! Map mapname.map + or + \#! MixedMap mapname.map + in the higher-priority updmap.cfg file. + + As an example, suppose you have a copy of MathTime Pro fonts + and want to disable the Belleek version of the fonts; that is, + disable the map belleek.map. You can create the file + \$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 of TEXMFCONFIG and TEXMFVAR, respectively. This is the only + difference between updmap-sys and updmap. + + Other locations may be used if you give them 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 source). + +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: +EOF +; + print &version(); + print $usage; + exit 0; +} + +### Local Variables: +### perl-indent-level: 2 +### tab-width: 2 +### indent-tabs-mode: nil +### End: +# vim:set tabstop=2 expandtab: # diff --git a/Master/texmf/scripts/tetex/updmap-sys.sh b/Master/texmf/scripts/tetex/updmap-sys.sh deleted file mode 100755 index 6f3c8365658..00000000000 --- a/Master/texmf/scripts/tetex/updmap-sys.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/sh - -# updmap-sys: Thomas Esser, public domain. - -# wrapper script for updmap with TEXMFVAR and TEXMFCONFIG set to -# TEXMFSYSVAR / TEXMFSYSCONFIG - -test -f /bin/ksh && test -z "$RUNNING_KSH" \ - && { UNAMES=`uname -s`; test "x$UNAMES" = xULTRIX; } 2>/dev/null \ - && { RUNNING_KSH=true; export RUNNING_KSH; exec /bin/ksh $0 ${1+"$@"}; } -unset RUNNING_KSH - -test -f /bin/bsh && test -z "$RUNNING_BSH" \ - && { UNAMES=`uname -s`; test "x$UNAMES" = xAIX; } 2>/dev/null \ - && { RUNNING_BSH=true; export RUNNING_BSH; exec /bin/bsh $0 ${1+"$@"}; } -unset RUNNING_BSH - -export PATH - -# hack around a bug in zsh: -test -n "${ZSH_VERSION+set}" && alias -g '${1+"$@"}'='"$@"' - -v=`kpsewhich -var-value TEXMFSYSVAR` -c=`kpsewhich -var-value TEXMFSYSCONFIG` - -TEXMFVAR="$v" -TEXMFCONFIG="$c" -export TEXMFVAR TEXMFCONFIG - -exec updmap ${1+"$@"} diff --git a/Master/texmf/scripts/tetex/updmap.pl b/Master/texmf/scripts/tetex/updmap.pl deleted file mode 100755 index 68d05bb82eb..00000000000 --- a/Master/texmf/scripts/tetex/updmap.pl +++ /dev/null @@ -1,2163 +0,0 @@ -#!/usr/bin/env perl -# mupdmap: utility to maintain map files for outline fonts. -# $Id: updmap.pl 27264 2012-07-31 05:10:29Z 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 -# - after TL2012? Maybe remove support for reading updmap-local.cfg -# - -my $TEXMFROOT; - -BEGIN { - $^W=1; - $TEXMFROOT = `kpsewhich -var-value=TEXMFROOT`; - if ($?) { - print STDERR "updmap: Cannot find TEXMFROOT, aborting!\n"; - exit 1; - } - chomp($TEXMFROOT); - unshift (@INC, "$TEXMFROOT/tlpkg"); -} - - -my $version = '$Id: updmap.pl 27264 2012-07-31 05:10:29Z preining $'; - -use Getopt::Long qw(:config no_autoabbrev ignore_case_always); -use strict; -use TeXLive::TLUtils qw(mkdirhier mktexupd win32 basename dirname - sort_uniq member); - -#use Data::Dumper; -#$Data::Dumper::Indent = 1; - -(my $prg = basename($0)) =~ s/\.pl$//; - -# sudo sometimes does not reset the home dir of root, check on that -# see more comments at the definition of the function itself -# this function checks by itself whether it is running on windows or not -reset_root_home(); - -chomp(my $TEXMFMAIN = `kpsewhich --var-value=TEXMFMAIN`); -chomp(my $TEXMFVAR = `kpsewhich -var-value=TEXMFVAR`); -chomp(my $TEXMFCONFIG = `kpsewhich -var-value=TEXMFCONFIG`); -chomp(my $TEXMFHOME = `kpsewhich -var-value=TEXMFHOME`); - -# 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); - $TEXMFHOME = lc($TEXMFHOME); -} - - -my %opts = ( quiet => 0, nohash => 0, nomkmap => 0 ); -my $alldata; -my $updLSR; - -my @cmdline_options = ( - "listfiles", - "cnffile=s@", - "copy", - "disable=s@", - "dvipdfmoutputdir=s", - "dvipdfmxoutputdir=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", - ); - -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", - }, - kanjiVariant => { - type => "any", - default => "", - }, -); - -&main(); - -############### - -sub main { - processOptions(); - - help() if $opts{'help'}; - - if ($opts{'version'}) { - print version(); - exit (0); - } - - if ($opts{'dvipdfmoutputdir'} && !defined($opts{'dvipdfmxoutputdir'})) { - $opts{'dvipdfmxoutputdir'} = $opts{'dvipdfmoutputdir'}; - printf STDERR "Using --dvipdfmoutputdir options for dvipdfmx, but please use --dvipdfmxoutputdir\n"; - } - - if ($opts{'dvipdfmoutputdir'} && $opts{'dvipdfmxoutputdir'} && - $opts{'dvipdfmoutputdir'} ne $opts{'dvipdfmxoutputdir'}) { - printf STDERR "Options for --dvipdfmoutputdir and --dvipdfmxoutputdir do not agree\nplease use only --dvipdfmxoutputdir. Exiting.\n"; - exit(1); - } - - 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; - } - - 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; - - # determine which config files should be used - # replaces the former "setupCfgFile" - # - # we also determine here where changes will be saved to - if ($opts{'cnffile'}) { - my @tmp; - for my $f (@{$opts{'cnffile'}}) { - if (! -f $f) { - die "$prg: Config file \"$f\" not found."; - } - push @tmp, (win32() ? lc($f) : $f); - } - @{$opts{'cnffile'}} = @tmp; - # 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; - for my $f (@all_files) { - push @used_files, (win32() ? lc($f) : $f); - } - # - my $TEXMFLOCALVAR; - my @TEXMFLOCAL; - if (win32()) { - chomp($TEXMFLOCALVAR =`kpsewhich --expand-path=\$TEXMFLOCAL`); - @TEXMFLOCAL = map { lc } split(/;/ , $TEXMFLOCALVAR); - } else { - chomp($TEXMFLOCALVAR =`kpsewhich --expand-path='\$TEXMFLOCAL'`); - @TEXMFLOCAL = split /:/ , $TEXMFLOCALVAR; - } - # - # search for TEXMFLOCAL/web2c/updmap.cfg - # check for compatibility with old updmap-local.cfg - my @tmlused; - for my $tml (@TEXMFLOCAL) { - my $TMLabs = Cwd::abs_path($tml); - next if (!$TMLabs); - my $oldfound = 0; - if (-r "$TMLabs/web2c/updmap-local.cfg") { - push @tmlused, "$TMLabs/web2c/updmap-local.cfg"; - warning("Old configuration file\n $TMLabs/web2c/updmap-local.cfg\nfound! "); - $oldfound = 1; - } - if (-r "$TMLabs/web2c/updmap.cfg") { - if ($oldfound) { - warning("Will read it *instead* of\n $TMLabs/web2c/updmap.cfg\n"); - } else { - push @tmlused, "$TMLabs/web2c/updmap.cfg"; - } - } - warning("Please consider moving the information from updmap-local.cfg to\n $TMLabs/web2c/updmap.cfg\n") - if ($oldfound); - } - # - # reorder used files: we move TEXMFLOCAL (if used) just above TEXMFMAIN - # as sysadmins will probably adjust values there - # - # updmap (user): - # ============== - # as found: - # TEXMFCONFIG $HOME/.texliveYYYY/texmf-config/web2c/updmap.cfg - # TEXMFVAR $HOME/.texliveYYYY/texmf-var/web2c/updmap.cfg - # TEXMFHOME $HOME/texmf/web2c/updmap.cfg - # TEXMFSYSCONFIG $TEXLIVE/YYYY/texmf-config/web2c/updmap.cfg - # TEXMFSYSVAR $TEXLIVE/YYYY/texmf-var/web2c/updmap.cfg - # TEXMFMAIN $TEXLIVE/YYYY/texmf/web2c/updmap.cfg - # TEXMFLOCAL $TEXLIVE/texmf-local/web2c/updmap.cfg - # TEXMFDIST $TEXLIVE/YYYY/texmf-dist/web2c/updmap.cfg - # - # as used: - # TEXMFCONFIG $HOME/.texliveYYYY/texmf-config/web2c/updmap.cfg - # TEXMFVAR $HOME/.texliveYYYY/texmf-var/web2c/updmap.cfg - # TEXMFHOME $HOME/texmf/web2c/updmap.cfg - # TEXMFSYSCONFIG $TEXLIVE/YYYY/texmf-config/web2c/updmap.cfg - # TEXMFSYSVAR $TEXLIVE/YYYY/texmf-var/web2c/updmap.cfg - # TEXMFLOCAL $TEXLIVE/texmf-local/web2c/updmap.cfg - # TEXMFMAIN $TEXLIVE/YYYY/texmf/web2c/updmap.cfg - # TEXMFDIST $TEXLIVE/YYYY/texmf-dist/web2c/updmap.cfg - # - # updmap-sys (root): - # ================== - # as found: - # TEXMFSYSCONFIG $TEXLIVE/YYYY/texmf-config/web2c/updmap.cfg - # TEXMFSYSVAR $TEXLIVE/YYYY/texmf-var/web2c/updmap.cfg - # TEXMFMAIN $TEXLIVE/YYYY/texmf/web2c/updmap.cfg - # TEXMFLOCAL $TEXLIVE/texmf-local/web2c/updmap.cfg - # TEXMFDIST $TEXLIVE/YYYY/texmf-dist/web2c/updmap.cfg - # - # as used: - # TEXMFSYSCONFIG $TEXLIVE/YYYY/texmf-config/web2c/updmap.cfg - # TEXMFSYSVAR $TEXLIVE/YYYY/texmf-var/web2c/updmap.cfg - # TEXMFLOCAL $TEXLIVE/texmf-local/web2c/updmap.cfg - # TEXMFMAIN $TEXLIVE/YYYY/texmf/web2c/updmap.cfg - # TEXMFDIST $TEXLIVE/YYYY/texmf-dist/web2c/updmap.cfg - # - if (@tmlused) { - my @tmp; - for my $f (@used_files) { - if ($f =~ m!\Q$TEXMFMAIN/\E!) { - push @tmp, @tmlused; - push @tmp, $f; - } else { - my $pushit = 1; - for my $tml (@TEXMFLOCAL) { - if ($f =~ m!\Q$tml\E!) { - $pushit = 0; - last; - } - } - push @tmp, $f if ($pushit); - } - } - @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!(\Q$TEXMFHOME\E|\Q$TEXMFCONFIG\E)/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"; - } - } - if (!$opts{'quiet'}) { - print "$prg is using the following updmap.cfg files (in precedence order):\n"; - for my $f (@{$opts{'cnffile'}}) { - print " $f\n"; - } - print "$prg is using the following updmap.cfg file for writing changes:\n"; - print " $changes_config_file\n"; - } - if ($opts{'listfiles'}) { - # we listed it above, so be done - exit 0; - } - - $alldata->{'changes_config'} = $changes_config_file; - - read_updmap_files(@{$opts{'cnffile'}}); - - if ($opts{'showoption'}) { - for my $o (@{$opts{'showoption'}}) { - if (defined($settings{$o})) { - my ($v, $vo) = get_cfg($o); - $v = "\"$v\"" if ($v =~ m/\s/); - print "$o=$v ($vo)\n"; - } else { - printf STDERR "$prg: unknown option: $o\n"; - } - } - exit 0; - } - - 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; - } - - # 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; - - if ($opts{'syncwithtrees'}) { - my @missing = read_map_files(); - if (@missing) { - print "Missing map files found, disabling\n"; - for my $m (@missing) { - my $orig = $alldata->{'maps'}{$m}{'origin'}; - print "\t$m (in $orig)\n"; - } - print "in $changes_config_file\n"; - print "Do you really want to continue (y/N)? "; - my $answer = ; - $answer = "n" if !defined($answer); - chomp($answer); - print "answer =$answer=\n"; - if ($answer ne "y" && $answer ne "Y") { - print "Please fix manually before running updmap(-sys) again!\n"; - exit 0; - } - $changed ||= enable_disable_maps(@missing); - print "finished.\n"; - # the original script did not run any update of the map files here, - # should we do that? - } - exit 0; - } - - $updLSR = &mktexupd(); - $updLSR->{mustexist}(0); - - my $cmd; - if ($opts{'edit'}) { - if ($opts{"dry-run"}) { - printf STDERR "No, are you joking, you want to edit with --dry-run?\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'}}); - } - - - 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("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); - } - - if (!$opts{'nohash'}) { - print "$prg: Updating ls-R files.\n" if !$opts{'quiet'}; - $updLSR->{exec}() unless $opts{"dry-run"}; - } - - return 0; -} - -################################################################## -# -# - -sub getFonts { - my ($first, @rest) = @_; - my $getall = 0; - my @maps = (); - return if !defined($first); - if ($first eq "-all") { - $getall = 1; - @maps = @rest; - } else { - @maps = ($first, @rest); - } - my @lines = (); - 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'}; - } - } - } - } - chomp @lines; - return @lines; -} - -############################################################################### -# writeLines() -# write the lines in $filename -# -sub writeLines { - my ($fname, @lines) = @_; - return if $opts{"dry-run"}; - map { ($_ !~ m/\n$/ ? s/$/\n/ : $_ ) } @lines; - open FILE, ">$fname" or die "$prg: can't write lines to $fname: $!"; - print FILE @lines; - close FILE; -} - -############################################################################### -# 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 { - 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; - } - return @out; -} - -############################################################################### -# setupSymlinks() -# set symlink for psfonts.map according to dvipsPreferOutline variable -# -sub setupSymlinks { - my ($dvipsPreferOutline, $dvipsoutputdir, $pdftexDownloadBase14, $pdftexoutputdir) = @_; - my $src; - my %link; - my @link; - - if ($dvipsPreferOutline eq "true") { - $src = "psfonts_t1.map"; - } else { - $src = "psfonts_pk.map"; - } - unlink "$dvipsoutputdir/psfonts.map" unless $opts{"dry-run"}; - push @link, &SymlinkOrCopy("$dvipsoutputdir", "$src", "psfonts.map"); - - if ($pdftexDownloadBase14 eq "true") { - $src = "pdftex_dl14.map"; - } else { - $src = "pdftex_ndl14.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(mode args ...) -# transform fontname and filenames according to transformation specified -# by mode. Possible values: -# URW|URWkb|ADOBE|ADOBEkb -# -sub transLW35 { - 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 - } elsif ($mode eq "URW") { - for my $r (@fileURW) { - map { eval($r); } @lines; - } - } elsif ($mode eq "ADOBE" || $mode eq "ADOBEkb") { - for my $r (@psADOBE) { - map { eval($r); } @lines; - } - my @filemode = eval ("\@file" . $mode); - for my $r (@filemode) { - map { eval($r); } @lines; - } - } - return @lines; -} - -############################################################################### -# 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"); - } -} - -sub mkMaps { - my $logfile; - - $logfile = "$TEXMFVAR/web2c/updmap.log"; - - 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"; - } - } - 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'}; - } - - 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'); - my ($kanjiVariant, $kanjiVariant_origin) = get_cfg('kanjiVariant'); - - 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 kanjiVariant replacement string : " - . "$kanjiVariant ($kanjiVariant_origin)" - . "\n create a mapfile for pxdvi : " - . "$pxdviUse ($pxdviUse_origin)" - . "\n\n"); - - 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"); - } - } - 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"); - } - } - 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 { - only_log("$m (full path not set?)\n"); - } - } - only_log("\n"); - print_and_log (sprintf(" [%3d files]\n\n", scalar @notmixedmaps)); - only_log("\n"); - - # Create psfonts_t1.map, psfonts_pk.map, ps2pk.map and pdftex.map: - my $dvipsoutputdir = $opts{'dvipsoutputdir'}; - my $pdftexoutputdir = $opts{'pdftexoutputdir'}; - my $dvipdfmxoutputdir = $opts{'dvipdfmxoutputdir'}; - 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", - "$dvipdfmxoutputdir/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; - } - } - - 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); - - print "Generating output for dvipdfmx...\n" if !$opts{'quiet'}; - &writeLines(">$dvipdfmxoutputdir/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); - } - - - 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; - } - 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)); - - 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)); - - 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 @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); - - 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); - - 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 (-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'}; - } - } - - 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="$dvipdfmxoutputdir"; - 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'}; - -} - - -sub locateMap { - my $map = shift; - my $ret = `kpsewhich --format=map $map`; - chomp($ret); - return $ret; -} - -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 { - 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"; - - @{$opts{'setoption'}} = @setoptions if (@setoptions); - @{$opts{'enable'}} = @enable if (@enable); - - Getopt::Long::Configure($oldconfig); - - # now continue with normal option handling - - GetOptions(\%opts, @cmdline_options) or - die "Try \"$prg --help\" for more information.\n"; -} - -# 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"; - } - } - my $od = $opts{$driver . "outputdir"}; - if (!$opts{"dry-run"}) { - &mkdirhier($od); - if (! -w $od) { - die "$prg: Directory \"$od\" isn't writable: $!"; - } - } - print "$driver output dir: \"$od\"\n" if !$opts{'quiet'}; - return $od; -} - -############################################################################### -# 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 setOptions { - my (@options) = @_; - for (my $i = 0; $i < @options; $i++) { - my $o = $options[$i]; - - my ($key,$val) = split (/=/, $o, 2); - - die "$prg: unexpected empty key or val for options (@options), goodbye.\n" - if !$key || !defined($val); - - &setOption ($key, $val); - } - 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 { - # this is --disable MapName - disable_map($tc, $w); - } - } - merge_settings(); - return save_updmap($tc); -} - -sub enable_map { - my ($tc, $type, $map) = @_; - - die "$prg: invalid mapType $type" if ($type !~ m/^(Map|MixedMap|KanjiMap)$/); - - 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 { - # 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"; - } -} - -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 { - $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; - } -} - - -# 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"; - # update lsR database - $updLSR->{add}($fn); - $updLSR->{exec}(); - # reset the LSR stuff, otherwise we add files several times - $updLSR->{reset}(); - } - # 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; - } - } - } - 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; - } - return 0; -} - -###################### -# 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; -} - -############################################################################### -# 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) = @_; - - die "$prg: Unsupported option $opt." if (!defined($settings{$opt})); - die "$0: Invalid value $val for option $opt." - if (!check_option($opt, $val)); - - # silently accept this old option name, just in case. - return if $opt eq "dvipdfmDownloadBase14"; - - #print "Setting option $opt to $val...\n" if !$opts{'quiet'}; - my $tc = $alldata->{'changes_config'}; - - die "$prg: top config file $tc has not been read." - if (!defined($alldata->{'updmap'}{$tc})); - - 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; - } -} - - -############################################################################### -# copyFile() -# copy file $src to $dst, sets $dst creation and mod time -# -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 ; - close(OUT); - close(IN); - my @t = stat($src); - utime($t[8], $t[9], $dst); -} - -############################################################################### -# 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; - - open IN, "$file_A"; - my $A=(); - close IN; - open IN, "$file_B"; - my $B=(); - close IN; - - $retval=1 if ($A eq $B); - return $retval; -} - -############################################################################### -# 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; - - 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 = (); - 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)); -} - -############################################################################### -# 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; - - # @lines = grep {++$count{$_} < 2 } (sort @lines); - @lines = grep {++$count{$_} < 2 } (@lines); - - return @lines; -} - - -################################################################# -# -# 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 data and check for kanji embed - merge_settings(); -} - -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; - } - } - } - # - my ($kanjiEmbed, $kanjiEmbed_origin) = get_cfg('kanjiEmbed'); - my ($kanjiVariant, $kanjiVariant_origin) = get_cfg('kanjiVariant'); - # - # go through all map files and check that the text is properly replaced - # after the replacement check that the generated map file actually - # exists, we do NOT want to break in this case! - # - for my $l (@l) { - for my $m (keys %{$alldata->{'updmap'}{$l}{'maps'}}) { - if ($m =~ m/\@kanjiEmbed@/ || $m =~ m/\@kanjiVariant@/) { - my $newm = $m; - $newm =~ s/\@kanjiEmbed@/$kanjiEmbed/; - $newm =~ s/\@kanjiVariant@/$kanjiVariant/; - if (locateMap($newm)) { - # 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; - } else { - print "$prg: generated map $newm (from $m) does not exists, not activating it!\n"; - } - # in any case delete the @kanji...@ entry line, such a map will - # never exist - 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 = ; - 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 ' '; - # make sure we get empty strings as arguments - $b = "" if (!defined($b)); - if ($a eq "#!") { - if ($b eq "Map" || $b eq "MixedMap" || $b eq "KanjiMap") { - my $c = shift @rest; - if (!defined($c)) { - warning("$prg: apparently not a real disable line, ignored: $_\n"); - } else { - if (defined($data{'maps'}{$c})) { - warning("$prg: double mention of $c in $fn\n"); - } - $data{'maps'}{$c}{'status'} = 'disabled'; - $data{'maps'}{$c}{'type'} = $b; - $data{'maps'}{$c}{'line'} = $i; - } - } - next; - } - if (@rest) { - warning("$prg: 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("$prg: 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("$prg: double mention 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 { - warning("$prg: unrecognized line $i in $fn: $_\n"); - } - } - return \%data; -} - -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; - } - } - - # - # 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}; - } - } - } - } - return (@missing); -} - -sub read_map_file { - my $fn = shift; - my @lines; - if (!open(MF,"<$fn")) { - warn("cannot open $fn: $!"); - return; - } - @lines = ; - 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; -} - -# -# 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"); - } - } - } -} - - -# -# $HOME and sudo and updmap-sys horror -# some instances of sudo do not reset $HOME to the home of root -# as an effect of "sudo updmap" creates root owned files in the home -# of a normal user, and "sudo updmap-sys" uses map files and updmap.cfg -# files from the directory of a normal user, but creating files -# in TEXMFSYSCONFIG. This is *all* wrong. -# we check: if we are running as UID 0 (root) on Unix and the -# ENV{HOME} is NOT the same as the one of root, then give a warning -# and reset it to the real home dir of root. - -sub reset_root_home { - if (!win32() && ($> == 0)) { # $> is effective uid - my $envhome = $ENV{'HOME'}; - # if $HOME isn't an existing directory, we don't care. - if (defined($envhome) && (-d $envhome)) { - # we want to avoid calling getpwuid as far as possible, so if - # $envhome is one of some usual values we accept it without worrying. - if ($envhome =~ m,^(/|/root|/var/root)/*$,) { - return; - } - # $HOME is defined, check what is the home of root in reality - my (undef,undef,undef,undef,undef,undef,undef,$roothome) = getpwuid(0); - if (defined($roothome)) { - if ($envhome ne $roothome) { - warning("$prg: resetting \$HOME value (was $envhome) to root's " - . "actual home ($roothome).\n"); - $ENV{'HOME'} = $roothome; - } else { - # envhome and roothome do agree, nothing to do, that is the good case - } - } else { - warning("$prg: home of root not defined, strange!\n"); - } - } - } -} - -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 -font files are included in the PDF or PostScript 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) - --dvipdfmxoutputdir DIR specify output directory (dvipdfm(x) 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 - --showoption OPTION show the current setting of OPTION - --showoptions OPTION show possible settings for OPTION - --setoption OPTION VALUE set OPTION to value; option names below - --setoption OPTION=VALUE as above, just different syntax - --enable MAPTYPE MAPFILE add "MAPTYPE MAPFILE" to updmap.cfg, - where MAPTYPE is Map, MixedMap, or 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, of whatever type - --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 devices 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. -KanjiMap entries are added to psfonts_t1.map and kanjix.map. - -Explanation of the OPTION names for --showoptions, --showoption, --setoption: - - dvipsPreferOutline true|false (default true) - Whether dvips uses bitmaps or outlines, when both are available. - dvipsDownloadBase35 true|false (default true) - 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) are under updmap's control. - kanjiEmbed (any string) - kanjiVariant (any string) - See below. - 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) - - 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. - - The options kanjiEmbed and kanjiVariant specify special replacements - in the map lines. If a map contains the string \@kanjiEmbed\@, then - this will be replaced by the value of that option; similarly for - kanjiVariant. In this way, users of Japanese TeX can select different - fonts to be included in the final output. - -Explanation of trees and files normally used: - - If --cnffile is specified on the command line (possibly multiple - times), its value(s) are used. Otherwise, updmap reads all the - updmap.cfg files found by running \`kpsewhich -all updmap.cfg', in the - order returned by kpsewhich, with one exception: an updmap.cfg found - in TEXMFLOCAL is given higher priority than the updmap.cfg in - TEXMFMAIN, to ensure that local adjustments by administrators take - precedence over what is shipped in TeX Live. - - In any case, if multiple updmap.cfg files are found, all the maps - mentioned in all the updmap.cfg files are merged. - - Thus, if updmap.cfg files are present in all trees, and the default - layout is used as shipped with TeX Live, the following files are - read, in the given order. - - For updmap-sys: - TEXMFSYSCONFIG \$TEXLIVE/YYYY/texmf-config/web2c/updmap.cfg - TEXMFSYSVAR \$TEXLIVE/YYYY/texmf-var/web2c/updmap.cfg - TEXMFLOCAL \$TEXLIVE/texmf-local/web2c/updmap.cfg - TEXMFMAIN \$TEXLIVE/YYYY/texmf/web2c/updmap.cfg - TEXMFDIST \$TEXLIVE/YYYY/texmf-dist/web2c/updmap.cfg - - For updmap: - TEXMFCONFIG \$HOME/.texliveYYYY/texmf-config/web2c/updmap.cfg - TEXMFVAR \$HOME/.texliveYYYY/texmf-var/web2c/updmap.cfg - TEXMFHOME \$HOME/texmf/web2c/updmap.cfg - TEXMFSYSCONFIG \$TEXLIVE/YYYY/texmf-config/web2c/updmap.cfg - TEXMFSYSVAR \$TEXLIVE/YYYY/texmf-var/web2c/updmap.cfg - TEXMFLOCAL \$TEXLIVE/texmf-local/web2c/updmap.cfg - TEXMFMAIN \$TEXLIVE/YYYY/texmf/web2c/updmap.cfg - TEXMFDIST \$TEXLIVE/YYYY/texmf-dist/web2c/updmap.cfg - - (where YYYY is the TeX Live release version). - - There is another exception to keep upgradability from earlier versions - of TeX Live: if a file TEXMFLOCAL/web2c/updmap-local.cfg exists - (formerly used by tlmgr to merge local fonts), then the file - TEXMFLOCAL/web2c/updmap.cfg is ignored (if it exists) and that - updmap-local.cfg is used instead. In this case, updmap recognizes the - previous syntax for disabling map files in updmap-local.cfg (this - syntax is different from what is used now). - - According to the actions, updmap might write to one of the given files - or create a new updmap.cfg, described further below. - - Where changes are saved: if config files are given on the command - line, then the first one given will be used to save any changes from - --setoption, --enable or --disable. If the config files are taken - from kpsewhich output, then the algorithm is more complex: - - 1) If \$TEXMFCONFIG/web2c/updmap.cfg or \$TEXMFHOME/web2c/updmap.cfg - appears in the list of used files, then the one listed first by - kpsewhich --all (equivalently, the one returned by kpsewhich - updmap.cfg), is used. - - 2) If neither of the above two are present and changes are made, a - new config file is created in \$TEXMFCONFIG/web2c/updmap.cfg. - - Resolving multiple definitions of a font: - If a font is defined in more than one map file, then the definition - coming from the first-listed updmap.cfg is used. If a font is - defined multiple times within the same map file, one is chosen - arbitrarily. In both cases a warning is issued. - - Disabling maps: - updmap.cfg files with higher priority (listed earlier) can disable - maps mentioned in lower priority (listed later) updmap.cfg files by - writing, e.g., - \#! Map mapname.map - or - \#! MixedMap mapname.map - in the higher-priority updmap.cfg file. - - As an example, suppose you have a copy of MathTime Pro fonts - and want to disable the Belleek version of the fonts; that is, - disable the map belleek.map. You can create the file - \$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 of TEXMFCONFIG and TEXMFVAR, respectively. This is the only - difference between updmap-sys and updmap. - - Other locations may be used if you give them 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 source). - -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: -EOF -; - print &version(); - print $usage; - exit 0; -} - -### Local Variables: -### perl-indent-level: 2 -### tab-width: 2 -### indent-tabs-mode: nil -### End: -# vim:set tabstop=2 expandtab: # diff --git a/Master/tlpkg/tlpsrc/tetex.tlpsrc b/Master/tlpkg/tlpsrc/tetex.tlpsrc index fe4f41d4e34..450c1f6c0b1 100644 --- a/Master/tlpkg/tlpsrc/tetex.tlpsrc +++ b/Master/tlpkg/tlpsrc/tetex.tlpsrc @@ -8,10 +8,10 @@ execute addMap mathpple.map runpattern f texmf/dvips/tetex/* runpattern f texmf/fonts/enc/dvips/tetex/* runpattern f texmf/fonts/map/dvips/tetex/* -runpattern f texmf/scripts/tetex/updmap.pl -runpattern f texmf/scripts/tetex/updmap-sys.sh runpattern f texmf/web2c/updmap.cfg runpattern f texmf-dist/web2c/updmap.cfg +runpattern f texmf-dist/scripts/tetex/updmap.pl +runpattern f texmf-dist/scripts/tetex/updmap-sys.sh docpattern f texmf/doc/man/man1/allcm.* docpattern f texmf/doc/man/man1/allec.* -- cgit v1.2.3