From 68082f953b9c1da98b2b9365067d2ef2b0aa3d11 Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Sat, 14 Jan 2017 06:01:42 +0000 Subject: add ptex-fontmaps git-svn-id: svn://tug.org/texlive/trunk@42944 c570f23f-e606-0410-a88d-b1316a301751 --- .../ptex-fontmaps/kanji-config-updmap-sys.sh | 24 + .../scripts/ptex-fontmaps/kanji-config-updmap.pl | 386 ++++++++++++++ .../scripts/ptex-fontmaps/kanji-fontmap-creator.pl | 590 +++++++++++++++++++++ 3 files changed, 1000 insertions(+) create mode 100755 Master/texmf-dist/scripts/ptex-fontmaps/kanji-config-updmap-sys.sh create mode 100755 Master/texmf-dist/scripts/ptex-fontmaps/kanji-config-updmap.pl create mode 100644 Master/texmf-dist/scripts/ptex-fontmaps/kanji-fontmap-creator.pl (limited to 'Master/texmf-dist/scripts/ptex-fontmaps') diff --git a/Master/texmf-dist/scripts/ptex-fontmaps/kanji-config-updmap-sys.sh b/Master/texmf-dist/scripts/ptex-fontmaps/kanji-config-updmap-sys.sh new file mode 100755 index 00000000000..4d0944572a1 --- /dev/null +++ b/Master/texmf-dist/scripts/ptex-fontmaps/kanji-config-updmap-sys.sh @@ -0,0 +1,24 @@ +#!/bin/sh + +# kanji-config-updmap-sys: +# copy of fmtutil-sys by Thomas Esser, public domain. + +# wrapper script for updmap-setup-kanji 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 + +# hack around a bug in zsh: +test -n "${ZSH_VERSION+set}" && alias -g '${1+"$@"}'='"$@"' +export PATH + +exec kanji-config-updmap --sys ${1+"$@"} + diff --git a/Master/texmf-dist/scripts/ptex-fontmaps/kanji-config-updmap.pl b/Master/texmf-dist/scripts/ptex-fontmaps/kanji-config-updmap.pl new file mode 100755 index 00000000000..f1b88fbe12c --- /dev/null +++ b/Master/texmf-dist/scripts/ptex-fontmaps/kanji-config-updmap.pl @@ -0,0 +1,386 @@ +#!/usr/bin/env perl +# kanji-config-updmap: setup Japanese font embedding +# Version 20170114.0 +# +# formerly known as updmap-setup-kanji +# +# Copyright 2004-2006 by KOBAYASHI R. Taizo for the shell version (updmap-otf) +# Copyright 2011-2016 by PREINING Norbert +# +# This file is licensed under GPL version 3 or any later version. +# For copyright statements see end of file. +# +# For development see +# https://github.com/texjporg/jfontmaps +# +# For a changelog see the git log +# + +$^W = 1; +use Getopt::Long qw(:config no_autoabbrev ignore_case_always); +use strict; + +my $prg = "kanji-config-updmap"; +my $version = '20170114.0'; + +my $updmap_real = "updmap"; +my $updmap = $updmap_real; + +my $dry_run = 0; +my $opt_help = 0; +my $opt_jis = 0; +my $opt_sys = 0; +my $opt_mode = "ja"; + +if (! GetOptions( + "n|dry-run" => \$dry_run, + "h|help" => \$opt_help, + "jis2004" => \$opt_jis, + "mode=s" => \$opt_mode, + "ja" => sub { $opt_mode = "ja"; }, + "sc" => sub { $opt_mode = "sc"; }, + "tc" => sub { $opt_mode = "tc"; }, + "ko" => sub { $opt_mode = "ko"; }, + "sys" => \$opt_sys, + "version" => sub { print &version(); exit(0); }, ) ) { + die "Try \"$0 --help\" for more information.\n"; +} + + +sub win32 { return ($^O=~/^MSWin(32|64)$/i); } + +my $nul = (win32() ? 'nul' : '/dev/null') ; + + +if ($dry_run) { + $updmap = "echo updmap"; +} +if ($opt_sys) { + $updmap = "$updmap --sys" ; + $updmap_real = "$updmap_real --sys" ; +} + +if ($opt_help) { + Usage(); + exit 0; +} + +# +# representatives of support font families +# +my %representatives = ( + "ja" => { + "hiragino" => "HiraMinPro-W3.otf", + "hiragino-pron" => "HiraMinProN-W3.otf", + "hiragino-elcapitan" => "HiraginoSerif-W3.ttc", + "hiragino-elcapitan-pron" => "HiraginoSerif-W3.ttc", + "toppanbunkyu-sierra" => "ToppanBunkyuGothic.ttc", + "morisawa" => "A-OTF-RyuminPro-Light.otf", + "morisawa-pr6n" => "A-OTF-RyuminPr6N-Light.otf", + "kozuka" => "KozMinPro-Regular.otf", + "kozuka-pr6n" => "KozMinPr6N-Regular.otf", + "kozuka-pr6" => "KozMinProVI-Regular.otf", + "ipa" => "ipam.ttf", + "ipaex" => "ipaexm.ttf", + "moga-mobo" => "mogam.ttc", + "moga-mobo-ex" => "mogam.ttc", + "ume" => "ume-tmo3.ttf", + "ms" => "msgothic.ttc", + "ms-osx" => "MS-Gothic.ttf", + "yu-win" => "yugothib.ttf", + "yu-win10" => "YuGothB.ttc", + "yu-osx" => "YuMin-Medium.otf", + "canon" => "FGCCHMW3.TTC", + }, + "sc" => { + "ms" => "simsun.ttc", + #"sinotype" => "STSong.ttf", # removed + "adobe" => "AdobeSongStd-Light.otf", + "fandol" => "FandolSong-Regular.otf", + "arphic" => "gbsn00lp.ttf", + "cjkunifonts" => "uming.ttc", + "cjkunifonts-ttf" => "uming.ttf", + }, + "tc" => { + "ms" => "mingliu.ttc", + "dynacomware" => "LiSongPro.ttf", + "adobe" => "AdobeMingStd-Light.otf", + "arphic" => "bsmi00lp.ttf", + "cjkunifonts" => "uming.ttc", + "cjkunifonts-ttf" => "uming.ttf", + }, + "ko" => { + "ms" => "batang.ttc", + "apple" => "AppleMyungjo.ttf", + "adobe" => "AdobeMyungjoStd-Medium.otf", + "baekmuk" => "dotum.ttf", # slightly safer than batang.ttf on case-insentive systems + "unfonts" => "UnBatang.ttf", + "solaris" => "h2mjsm.ttf", + } +); +my %available; + + +main(@ARGV); + +sub version { + my $ret = sprintf "%s version %s\n", + $prg, $version; + return $ret; +} + +sub Usage { + my $usage = <<"EOF"; + $prg Set up embedding of Japanese/Chinese/Korean fonts via updmap.cfg. + + This script searches for some of the most common fonts + for embedding into pdfs by dvipdfmx. + + In addition it allows to set up arbitrary font families + to be embedded into the generated pdf files, as long + as at least the map file otf-.map is present. + Other map files that will be used if available are + + For Japanese: + ptex-.map + uptex-.map + otf-.map + otf-up-.map + + For Korean, Traditional Chinese and Simplified Chinese: + uptex--.map + otf--.map + (NN being: ko, tc, sc) + + Please see the documentation of updmap for details (updmap --help). + + Usage: $prg [OPTION] {|auto|nofont|status} + + embed an arbitrary font family , at least the + map file otf-.map has to be available. + auto: embed one of the following supported font families + automatically: + hiragino, hiragino-pron, hiragino-elcapitan, + hiragino-elcapitan-pron, toppanbunkyu-sierra, + morisawa, morisawa-pr6n, + kozuka, kozuka-pr6n, kozuka-pr6, + ipa, ipaex, moga-mobo, moga-mobo-ex, ume, + ms, ms-osx, + yu-win, yu-win10, yu-osx, + canon + and fall back to not embedding any font if none of them + is available + nofont: embed no fonts (and rely on system fonts when displaying pdfs) + If your system does not have any of the supported font + families as specified above, this target is selected + automatically. + status: get information about current environment and usable font map + + Options: + -n, --dry-run do not actually run updmap + -h, --help show this message and exit + --mode=NN setup for Japanese (NN=ja), Korean (NN=ko), + Simplified Chinese (NN=sc), Traditional Chinese (NN=tc) + --NN short for --mode=NN + --jis2004 use JIS2004 variants for default fonts of (u)pTeX + --sys run in sys mode, i.e., call updmap-sys + --version show version information and exit + +EOF +; + print $usage; + exit 0; +} + + + +### +### Check Installed Font +### + +sub CheckInstallFont { + for my $k (keys %{$representatives{$opt_mode}}) { + my $f = `kpsewhich $representatives{$opt_mode}{$k}`; + if (! $?) { + $available{$k} = chomp($f); + } + } +} + +### +### GetStatus +### + +sub check_mapfile { + my $mapf = shift; + my $f = `kpsewhich $mapf 2> $nul`; + my $ret = $?; + if (wantarray) { + return (!$ret, $f); + } else { + return (!$ret); + } +} + +sub GetStatus { + my $val = `$updmap_real --quiet --showoption ${opt_mode}Embed`; + my $STATUS; + if ($val =~ m/^${opt_mode}Embed=([^()\s]*)(\s+\()?/) { + $STATUS = $1; + } else { + printf STDERR "Cannot find status of current ${opt_mode}Embed setting via updmap --showoption!\n"; + exit 1; + } + + my $testmap = ($opt_mode eq "ja" ? "ptex-$STATUS.map" : "uptex-${opt_mode}-$STATUS.map"); + if (check_mapfile($testmap)) { + print "CURRENT family for $opt_mode: $STATUS\n"; + } else { + print "WARNING: Currently selected map file for $opt_mode cannot be found: $testmap\n"; + } + + for my $k (sort keys %{$representatives{$opt_mode}}) { + my $MAPFILE = ($opt_mode eq "ja" ? "ptex-$k.map" : "uptex-${opt_mode}-$k.map"); + next if ($MAPFILE eq $testmap); + if (check_mapfile($MAPFILE)) { + if ($available{$k}) { + print "Standby family : $k\n"; + } + } + } + return $STATUS; +} + +### +### Setup Map files +### + +sub SetupMapFile { + my $rep = shift; + my $MAPFILE = ($opt_mode eq "ja" ? "ptex-$rep.map" : "uptex-${opt_mode}-$rep.map"); + if (check_mapfile($MAPFILE)) { + print "Setting up ... $MAPFILE\n"; + system("$updmap --quiet --nomkmap --nohash -setoption ${opt_mode}Embed $rep"); + if ($opt_jis) { + system("$updmap --quiet --nomkmap --nohash -setoption jaVariant -04"); + } else { + system("$updmap --quiet --nomkmap --nohash -setoption jaVariant \"\""); + } + system("$updmap"); + } else { + print "NOT EXIST $MAPFILE\n"; + exit 1; + } +} + +sub SetupReplacement { + my $rep = shift; + if (defined($representatives{$opt_mode}{$rep})) { + if ($available{$rep}) { + return SetupMapFile($rep); + } else { + printf STDERR "$rep not available, falling back to auto!\n"; + return SetupReplacement("auto"); + } + } else { + if ($rep eq "nofont") { + return SetupMapFile("noEmbed"); + } elsif ($rep eq "auto") { + my $STATUS = GetStatus(); + # first check if we have a status set and the font is installed + # in this case don't change anything, just make sure + if (defined($representatives{$opt_mode}{$STATUS}) && $available{$STATUS}) { + return SetupMapFile($STATUS); + } else { + if (!($STATUS eq "noEmbed" || $STATUS eq "")) { + # some unknown setting is set up currently, overwrite, but warn + print "Previous setting $STATUS for $opt_mode is unknown, replacing it!\n" + } + # if we are in the noEmbed or nothing set case, but one + # of the supported fonts are present then use them + # (originally it said "three fonts hiragino/morisawa/kozuka", but the code below + # was different from this statement; changed to "supported fonts" on 2016/12/08) + my @testlist; + if ($opt_mode eq 'ja') { + @testlist = qw/ + morisawa-pr6n morisawa + hiragino-pron hiragino hiragino-elcapitan-pron hiragino-elcapitan + kozuka-pr6n kozuka-pr6 kozuka + toppanbunkyu-sierra + yu-osx yu-win10 yu-win10 canon + ms ms-osx moga-mobo moga-mobo-ex ume + ipa ipaex/; + } elsif ($opt_mode eq 'tc') { + @testlist = qw/dynacomware adobe ms arphic cjkunifonts cjkunifonts-ttf/; + } elsif ($opt_mode eq 'sc') { + @testlist = qw/fandol adobe ms arphic cjkunifonts cjkunifonts-ttf/; + } elsif ($opt_mode eq 'ko') { + @testlist = qw/apple adobe ms baekmuk unfonts solaris/; + } + # else cannot happen unless getopt is broken + + for my $i (@testlist) { + if ($available{$i}) { + return SetupMapFile($i); + } + } + # still here, no map file found! + return SetupMapFile("noEmbed"); + } + } else { + # anything else is treated as a map file name + return SetupMapFile($rep); + } + } +} + +### +### MAIN +### + +sub main { + my ($a, $b) = @_; + + CheckInstallFont(); + + if (!defined($a) || defined($b)) { + Usage(); + exit 1; + } + + if ($a eq "status") { + GetStatus(); + exit 0; + } + + return SetupReplacement($a); +} + +# +# +# Copyright statements: +# +# KOBAYASHI Taizo +# email to preining@logic.at +# Message-Id: <20120130.162953.59640143170594580.tkoba@cc.kyushu-u.ac.jp> +# Message-Id: <20120201.105639.625859878546968959.tkoba@cc.kyushu-u.ac.jp> +# -------------------------------------------------------- +# copyright statement は簡単に以下で結構です。 +# +# Copyright 2004-2006 by KOBAYASHI Taizo +# +# では +# GPL version 3 or any later version +# +# -------------------------------------------------------- +# +# PREINING Norbert +# as author and maintainer of the current file +# Licensed under GPL version 3 or any later version +# +### Local Variables: +### perl-indent-level: 2 +### tab-width: 2 +### indent-tabs-mode: nil +### End: +# vim: set tabstop=2 expandtab autoindent: diff --git a/Master/texmf-dist/scripts/ptex-fontmaps/kanji-fontmap-creator.pl b/Master/texmf-dist/scripts/ptex-fontmaps/kanji-fontmap-creator.pl new file mode 100644 index 00000000000..b364d7e9c93 --- /dev/null +++ b/Master/texmf-dist/scripts/ptex-fontmaps/kanji-fontmap-creator.pl @@ -0,0 +1,590 @@ +#!/usr/bin/env perl +# +# kanji-fontmap-creator +# (c) 2012-2014 Norbert Preining +# Version: 20170114.0 +# Licenced under the GPLv2 or any higher version +# +# gui to create map files for updmap(-setup-kanji) +# +# ptex/uptex: +# 2 fonts (rml/gbm) +# 2 variants +# (ev vertical/horizontal) +# +# otf/otf-up: +# +# 2 variants +# fonts: +# gothic: regular, bold, heavy, maru +# mincho: regular, bold, light +# +# possible improvements: +# - allow editing current files by reading and interpreting them +# needs better structure of the data +# - specify output directory, automatically write to $TEXMFLOCAL ? +# - more checks, warnings? +# + +$^W = 1; +use strict; + +use Tk; +use Tk::NoteBook; +use Tk::Dialog; +use Cwd; +use Getopt::Long qw(:config no_autoabbrev); +use Pod::Usage; + +my $opt_lang = "en"; +my $opt_help = 0; +my $opt_version = 0; + +my $prg = "kanji-fontmap-creator"; +my $version = "20170114.0"; + +# +# global vars configuring operation +my $group_name = ""; +my $do_vertical = 0; +my $do_iso2004 = 0; +my $do_otf = 0; +my @f_mincho_regular; my @f_gothic_regular; +my @f_mincho_bold; my @f_gothic_bold; +my @f_gothic_heavy; +my @f_gothic_maru; +my @f_mincho_light; +my $b_save; + +my $iso_i = 1; +my $vert_i = 2; +my $isovert_i = 3; +my @order; + +my $mw; + +$order[0] = 'Default'; +$order[$iso_i] = 'ISO2004'; +$order[$vert_i] = 'Vertical'; +$order[$isovert_i] = 'ISO2004/Vertical'; + + +GetOptions( + "lang=s" => \$opt_lang, + "version" => \$opt_version, + "help|?|h" => \$opt_help) or pod2usage(1); + +if (win32()) { + pod2usage(-exitstatus => 0, + -verbose => 2, + -noperldoc => 1, + -output => \*STDOUT) if $opt_help; +} else { + pod2usage(-exitstatus => 0, -verbose => 2, -file => $0) if $opt_help; +} + +if ($opt_version) { + print "$prg $version\n"; + exit 0; +} + +if ($opt_lang ne "en") { + print STDERR "$prg: languages other than en currently not implemented.\n"; +} + +&main(); + +sub main { + # + # + $mw = MainWindow->new; + $mw->title("Kanji Fontmap Creator"); + $mw->optionAdd("*Button.Relief", "ridge", 20); + my $tf = $mw->Frame; + my $nb = $mw->NoteBook; + my $bf = $mw->Frame; + # + # top frame + # + my $name_label = $tf->Label(-text => "Group name:"); + my $name_entry = $tf->Entry(-width => 30, -textvariable => \$group_name, + -validate => "all", -validatecommand => \&validate_group_name); + my $opt_label = $tf->Label(-text => "Options:"); + my $opt_vert = $tf->Checkbutton(-text => "separate vertical fonts", + -variable => \$do_vertical); + my $opt_iso = $tf->Checkbutton(-text => "separate ISO 2004 support", + -variable => \$do_iso2004 ); + my $opt_otf = $tf->Checkbutton(-text => "OTF support", + -variable => \$do_otf); + # + # pack the stuff + $name_label->grid(-row => 0, -column => 0, -sticky => "e"); + $name_entry->grid(-row => 0, -column => 1, -sticky => "w"); + $opt_label->grid(-row => 1, -column => 0, -sticky => "e"); + $opt_otf->grid(-row => 1, -column => 1, -sticky => "w"); + $opt_iso->grid(-column => 1, -sticky => "w"); + $opt_vert->grid(-column => 1, -sticky => "w"); + # + # notebook part + my @p; + for my $i (0..$#order) { + $p[$i] = $nb->add($order[$i], -label => $order[$i], + -state => ($i > 0 ? "disabled" : "normal")); + } + # + # pack outer window + $tf->pack(-expand => 1, -fill => 'x', -padx => '4m', -pady => '4m'); + $nb->pack(-expand => 1, -fill => 'both', -padx => '4m'); + $bf->pack(-expand => 1, -fill => 'x', -padx => '4m', -pady => '4m'); + # + # + my @l_mincho; my @l_gothic; + my @l_regular; + my @l_bold; + my @l_heavy; + my @l_light; + my @l_maru; + my @e_mincho_regular; my @e_gothic_regular; + my @e_mincho_bold; my @e_gothic_bold; + my @e_gothic_heavy; + my @e_gothic_maru; + my @e_mincho_light; + my $ew = 20; + for my $i (0..$#order) { + $l_mincho[$i] = $p[$i]->Label(-text => "Mincho"); + $l_gothic[$i] = $p[$i]->Label(-text => "Gothic"); + # + $l_regular[$i] = $p[$i]->Label(-text => "Regular"); + $e_mincho_regular[$i] = $p[$i]->Entry(-width => $ew, + -textvariable => \$f_mincho_regular[$i]); + $e_gothic_regular[$i] = $p[$i]->Entry(-width => $ew, + -textvariable => \$f_gothic_regular[$i]); + # + $l_bold[$i] = $p[$i]->Label(-text => "Bold", -state => "disabled"); + $e_mincho_bold[$i] = $p[$i]->Entry(-width => $ew, + -textvariable => \$f_mincho_bold[$i], + -state => "disabled", -relief => "flat"); + $e_gothic_bold[$i] = $p[$i]->Entry(-width => $ew, + -textvariable => \$f_gothic_bold[$i], + -state => "disabled", -relief => "flat"); + # + $l_heavy[$i] = $p[$i]->Label(-text => "Heavy", -state => "disabled"); + $l_light[$i] = $p[$i]->Label(-text => "Light", -state => "disabled"); + $l_maru[$i] = $p[$i]->Label(-text => "Maru", -state => "disabled"); + $e_gothic_heavy[$i] = $p[$i]->Entry(-width => $ew, + -textvariable => \$f_gothic_heavy[$i], + -state => "disabled", -relief => "flat"); + $e_gothic_maru[$i] = $p[$i]->Entry(-width => $ew, + -textvariable => \$f_gothic_maru[$i], + -state => "disabled", -relief => "flat"); + $e_mincho_light[$i] = $p[$i]->Entry(-width => $ew, + -textvariable => \$f_mincho_light[$i], + -state => "disabled", -relief => "flat"); + # + # grid the whole stuff + $l_mincho[$i]->grid(-row => 0, -column => 1); + $l_gothic[$i]->grid(-row => 0, -column => 2); + # + $l_regular[$i]->grid(-row => 1, -column => 0, -sticky => "e"); + $e_mincho_regular[$i]->grid(-row => 1, -column => 1); + $e_gothic_regular[$i]->grid(-row => 1, -column => 2); + # + $l_bold[$i]->grid(-row => 3, -column => 0, -sticky => "e"); + $e_mincho_bold[$i]->grid(-row => 3, -column => 1); + $e_gothic_bold[$i]->grid(-row => 3, -column => 2); + # + $l_heavy[$i]->grid(-row => 4, -column => 0, -sticky => "e"); + $e_gothic_heavy[$i]->grid(-row => 4, -column => 1); + $l_maru[$i]->grid(-row => 5, -column => 0, -sticky => "e"); + $e_gothic_maru[$i]->grid(-row => 5, -column => 2); + $l_light[$i]->grid(-row => 6, -column => 0, -sticky => "e"); + $e_mincho_light[$i]->grid(-row => 6, -column => 2); + } + # + # Button frame + $b_save = $bf->Button(-text => "Save"); + + # + # Actions: + # + # activate tabs when options are selected + $opt_vert->configure(-command => sub { + if (!$do_vertical && ($nb->raised() =~ m/Vertical/)) { + $nb->raise("Default"); + } + $nb->pageconfigure("Vertical", + -state => ($do_vertical ? "normal" : "disabled")); + $nb->pageconfigure("ISO2004/Vertical", + -state => (($do_vertical & $do_iso2004) ? "normal" : "disabled")) + }); + $opt_iso->configure(-command => sub { + if (!$do_iso2004 && ($nb->raised() =~ m/ISO2004/)) { + $nb->raise("Default"); + } + $nb->pageconfigure("ISO2004", + -state => ($do_iso2004 ? "normal" : "disabled")); + $nb->pageconfigure("ISO2004/Vertical", + -state => (($do_vertical & $do_iso2004) ? "normal" : "disabled")) + }); + + # activate lower part for when otf is selected + $opt_otf->configure(-command => sub { + for my $i (0..$#order) { + $l_light[$i]->configure( + -state => ($do_otf ? "normal" : "disabled")); + $e_mincho_light[$i]->configure( + -state => ($do_otf ? "normal" : "disabled"), + -relief => ($do_otf ? "sunken" : "flat")); + # + $l_bold[$i]->configure( + -state => ($do_otf ? "normal" : "disabled")); + $e_mincho_bold[$i]->configure( + -state => ($do_otf ? "normal" : "disabled"), + -relief => ($do_otf ? "sunken" : "flat")); + $e_gothic_bold[$i]->configure( + -state => ($do_otf ? "normal" : "disabled"), + -relief => ($do_otf ? "sunken" : "flat")); + # + $l_heavy[$i]->configure( + -state => ($do_otf ? "normal" : "disabled")); + $l_maru[$i]->configure( + -state => ($do_otf ? "normal" : "disabled")); + $e_gothic_maru[$i]->configure( + -state => ($do_otf ? "normal" : "disabled"), + -relief => ($do_otf ? "sunken" : "flat")); + $e_gothic_heavy[$i]->configure( + -state => ($do_otf ? "normal" : "disabled"), + -relief => ($do_otf ? "sunken" : "flat")); + } + }); + # + # + $b_save->configure(-command => \&export_font_maps, -state => "disabled"); + $b_save->pack; + + Tk::MainLoop(); +} + +sub validate_group_name { + my ($new_val, undef, $old_val) = @_; + $b_save->configure(-state => ($new_val eq "" ? "disabled" : "normal")); + return 1; +} + +sub addgroup { + my ($str, $fref, $i_a, $i_b, @entries) = @_; + my $do = 1; + while (@entries) { + my $tfm = shift @entries; + my $enc = shift @entries; + addlines($str, $tfm, $enc, ($do ? $fref->[$i_a] : $fref->[$i_b])); + $do = !$do; + } +} + +sub addlines { + my ($strref, @entries) = @_; + while (@entries) { + my $tfm = shift @entries; + my $enc = shift @entries; + my $fn = shift @entries; + if (defined($fn)) { + $$strref .= "$tfm $enc $fn\n"; + } else { + print STDERR "target file for $tfm $enc not defined!\n"; + } + } +} + +sub export_font_maps { + if ($group_name eq "") { + print STDERR "That should not happen!\n"; + exit 1; + } + + # indirections + my $ii = ($do_iso2004 ? $iso_i : 0); + my $vi = ($do_vertical ? $vert_i : 0); + my $ivi = (($do_vertical && $do_vertical) ? $isovert_i : 0); + # + + my ($ptexlines, $ptex04lines, $uptexlines, $uptex04lines); + my ($otflines, $otfuplines); + addlines(\$ptexlines, + 'rml', 'H', $f_mincho_regular[0], + 'rmlv','V', $f_mincho_regular[$vi], + 'gbm', 'H', $f_gothic_regular[0], + 'gbmv','V', $f_gothic_regular[$vi]); + addlines(\$ptex04lines, + 'rml', 'H', $f_mincho_regular[$ii], + 'rmlv','V', $f_mincho_regular[$ivi], + 'gbm', 'H', $f_gothic_regular[$ii], + 'gbmv','V', $f_gothic_regular[$ivi]); + addlines(\$uptexlines, + 'urml', 'UniJIS-UTF16-H', $f_mincho_regular[0], + 'urmlv', 'UniJIS-UTF16-V', $f_mincho_regular[$vi], + 'ugbm', 'UniJIS-UTF16-H', $f_gothic_regular[0], + 'ugbmv', 'UniJIS-UTF16-V', $f_gothic_regular[$vi], + 'uprml-h', 'UniJIS-UTF16-H', $f_mincho_regular[0], + 'uprml-v', 'UniJIS-UTF16-V', $f_mincho_regular[$vi], + 'upgbm-h', 'UniJIS-UTF16-H', $f_gothic_regular[0], + 'upgbm-v', 'UniJIS-UTF16-V', $f_gothic_regular[$vi], + 'uprml-hq', 'UniJIS-UCS2-H', $f_mincho_regular[0], + 'upgbm-hq', 'UniJIS-UCS2-H', $f_gothic_regular[0]); + addlines(\$uptex04lines, + 'urml', 'UniJIS-UTF16-H', $f_mincho_regular[$ii], + 'urmlv', 'UniJIS-UTF16-V', $f_mincho_regular[$ivi], + 'ugbm', 'UniJIS-UTF16-H', $f_gothic_regular[$ii], + 'ugbmv', 'UniJIS-UTF16-V', $f_gothic_regular[$ivi], + 'uprml-h', 'UniJIS-UTF16-H', $f_mincho_regular[$ii], + 'uprml-v', 'UniJIS-UTF16-V', $f_mincho_regular[$ivi], + 'upgbm-h', 'UniJIS-UTF16-H', $f_gothic_regular[$ii], + 'upgbm-v', 'UniJIS-UTF16-V', $f_gothic_regular[$ivi], + 'uprml-hq', 'UniJIS-UCS2-H', $f_mincho_regular[$ii], + 'upgbm-hq', 'UniJIS-UCS2-H', $f_gothic_regular[$ii]); + + + addlines(\$otflines, + '%', 'mincho regular', '', + 'otf-ujmr-h', 'UniJIS-UTF16-H', $f_mincho_regular[0], + 'otf-ujmr-v', 'UniJIS-UTF16-V', $f_mincho_regular[$vi], + 'otf-cjmr-h', 'Identity-H', $f_mincho_regular[0], + 'otf-cjmr-v', 'Identity-V', $f_mincho_regular[$vi], + 'hminr-h', 'H', $f_mincho_regular[0], + 'hminr-v', 'V', $f_mincho_regular[$vi], + '%', 'gothic regular', '', + 'otf-ujgr-h', 'UniJIS-UTF16-H', $f_gothic_regular[0], + 'otf-ujgr-v', 'UniJIS-UTF16-V', $f_gothic_regular[$vi], + 'otf-cjgr-h', 'Identity-H', $f_gothic_regular[0], + 'otf-cjgr-v', 'Identity-V', $f_gothic_regular[$vi], + 'hgothr-h', 'H', $f_gothic_regular[0], + 'hgothr-v', 'V', $f_gothic_regular[$vi], + '%', 'mincho bold', ''); + addgroup(\$otflines, ($do_otf ? \@f_mincho_bold : \@f_mincho_regular), + 0, $vi, + 'otf-ujmb-h', 'UniJIS-UTF16-H', + 'otf-ujmb-v', 'UniJIS-UTF16-V', + 'otf-cjmb-h', 'Identity-H', + 'otf-cjmb-v', 'Identity-V', + 'hminb-h', 'H', + 'hminb-v', 'V'); + addlines(\$otflines, '%', 'gothic bold', ''); + addgroup(\$otflines, ($do_otf ? \@f_gothic_bold : \@f_gothic_regular), + 0, $vi, + 'otf-ujgb-h', 'UniJIS-UTF16-H', + 'otf-ujgb-v', 'UniJIS-UTF16-V', + 'otf-cjgb-h', 'Identity-H', + 'otf-cjgb-v', 'Identity-V', + 'hgothb-h', 'H', + 'hgothb-v', 'V'); + addlines(\$otflines, '%', 'gothic heavy', ''); + addgroup(\$otflines, ($do_otf ? \@f_gothic_heavy : \@f_gothic_regular), + 0, $vi, + 'hgotheb-h', 'H', + 'hgotheb-v', 'V'); + addlines(\$otflines, '%', 'gothic maru', ''); + addgroup(\$otflines, ($do_otf ? \@f_gothic_maru : \@f_gothic_regular), + 0, $vi, + 'otf-ujmgr-h', 'UniJIS-UTF16-H', + 'otf-ujmgr-v', 'UniJIS-UTF16-V', + 'otf-cjmgr-h', 'Identity-H', + 'otf-cjmgr-v', 'Identity-V', + 'hmgothr-h', 'H', + 'hmgothr-v', 'V'); + addlines(\$otflines, '%', 'mincho light', ''); + addgroup(\$otflines, ($do_otf ? \@f_mincho_light : \@f_mincho_regular), + 0, $vi, + 'otf-ujml-h', 'UniJIS-UTF16-H', + 'otf-ujml-v', 'UniJIS-UTF16-V', + 'otf-cjml-h', 'Identity-H', + 'otf-cjml-v', 'Identity-V', + 'hminl-h', 'H', + 'hminl-v', 'V'); + addlines(\$otflines, '%', 'JIS 2004', '', + 'otf-ujmrn-h', 'UniJIS2004-UTF16-H', $f_mincho_regular[$ii], + 'otf-ujmrn-v', 'UniJIS2004-UTF16-V', $f_mincho_regular[$ivi], + 'hminrn-h', 'H', $f_mincho_regular[$ii], + 'hminrn-v', 'V', $f_mincho_regular[$ivi], + '%', '', '', + 'otf-ujgrn-h', 'UniJIS2004-UTF16-H', $f_gothic_regular[$ii], + 'otf-ujgrn-v', 'UniJIS2004-UTF16-V', $f_gothic_regular[$ivi], + 'hgothrn-h', 'H' , $f_gothic_regular[$ii], + 'hgothrn-v', 'V' , $f_gothic_regular[$ivi], + '%', '', ''); + addgroup(\$otflines, ($do_otf ? \@f_mincho_bold : \@f_mincho_regular), + $ii, $ivi, + 'otf-ujmbn-h', 'UniJIS2004-UTF16-H', + 'otf-ujmbn-v', 'UniJIS2004-UTF16-V', + 'hminbn-h', 'H', + 'hminbn-v', 'V'); + addlines(\$otflines, '%', '', ''); + addgroup(\$otflines, ($do_otf ? \@f_gothic_bold : \@f_gothic_regular), + $ii, $ivi, + 'otf-ujgbn-h', 'UniJIS2004-UTF16-H', + 'otf-ujgbn-v', 'UniJIS2004-UTF16-V', + 'hgothbn-h', 'H', + 'hgothbn-v', 'V'); + addlines(\$otflines, '%', '', ''); + addgroup(\$otflines, ($do_otf ? \@f_gothic_heavy : \@f_gothic_regular), + $ii, $ivi, + 'otf-ujmgrn-h', 'UniJIS2004-UTF16-H', + 'otf-ujmgrn-v', 'UniJIS2004-UTF16-V', + 'hmgothrn-h', 'H', + 'hmgothrn-v', 'V'); + addlines(\$otflines, '%', '', ''); + addgroup(\$otflines, ($do_otf ? \@f_mincho_light : \@f_mincho_regular), + $ii, $ivi, + 'otf-ujmln-h', 'UniJIS2004-UTF16-H', + 'otf-ujmln-v', 'UniJIS2004-UTF16-V', + 'hminln-h', 'H', + 'hminln-v', 'V'); + + addlines(\$otfuplines, + 'uphminr-h', 'UniJIS-UTF16-H', $f_mincho_regular[0], + 'uphminr-v', 'UniJIS-UTF16-V', $f_mincho_regular[$vi], + 'uphgothr-h', 'UniJIS-UTF16-H', $f_gothic_regular[0], + 'uphgothr-v', 'UniJIS-UTF16-V', $f_gothic_regular[$vi]); + addgroup(\$otfuplines, ($do_otf ? \@f_mincho_bold : \@f_mincho_regular), + 0, $vi, + 'uphminb-h', 'UniJIS-UTF16-H', + 'uphminb-v', 'UniJIS-UTF16-V'); + addgroup(\$otfuplines, ($do_otf ? \@f_gothic_bold : \@f_gothic_regular), + 0, $vi, + 'uphgothb-h', 'UniJIS-UTF16-H', + 'uphgothb-v', 'UniJIS-UTF16-V'); + addgroup(\$otfuplines, ($do_otf ? \@f_gothic_heavy : \@f_gothic_regular), + 0, $vi, + 'uphgotheb-h', 'UniJIS-UTF16-H', + 'uphgotheb-v', 'UniJIS-UTF16-V'); + addgroup(\$otfuplines, ($do_otf ? \@f_gothic_maru : \@f_gothic_regular), + 0, $vi, + 'uphmgothr-h', 'UniJIS-UTF16-H', + 'uphmgothr-v', 'UniJIS-UTF16-V'); + addgroup(\$otfuplines, ($do_otf ? \@f_mincho_light : \@f_mincho_regular), + 0, $vi, + 'uphminl-h', 'UniJIS-UTF16-H', + 'uphminl-v', 'UniJIS-UTF16-V'); + + # check that none of the output files are already existing: + if (-r "ptex-$group_name.map" || + -r "ptex-${group_name}-04.map" || + -r "uptex-$group_name.map" || + -r "uptex-${group_name}-04.map" || + -r "otf-$group_name.map" || + -r "otf-up-$group_name.map" || + -r "$group_name.map" || + -r "${group_name}-04.map") { + print STDERR "Some of the output files already exist in the cwd, aborting!\n"; + exit 1; + } + + # generate the output files + open (OUT, ">ptex-$group_name.map") + or die("Cannot open ptex-$group_name.map for writing: $!"); + print OUT "% generated by $prg\n$ptexlines\n"; + close(OUT); + + open (OUT, ">ptex-${group_name}-04.map") + or die("Cannot open ptex-${group_name}-04.map for writing: $!"); + print OUT "% generated by $prg\n$ptex04lines\n"; + close(OUT); + + open (OUT, ">uptex-$group_name.map") + or die("Cannot open uptex-$group_name.map for writing: $!"); + print OUT "% generated by $prg\n$uptexlines\n"; + close(OUT); + + open (OUT, ">uptex-${group_name}-04.map") + or die("Cannot open uptex-${group_name}-04.map for writing: $!"); + print OUT "% generated by $prg\n$uptex04lines\n"; + close(OUT); + + open (OUT, ">otf-$group_name.map") + or die("Cannot open otf-$group_name.map for writing: $!"); + print OUT "% generated by $prg\n$otflines\n"; + close(OUT); + + open (OUT, ">otf-up-$group_name.map") + or die("Cannot open otf-up-$group_name.map for writing: $!"); + print OUT "% generated by $prg\n$otfuplines\n"; + close(OUT); + + open (OUT, ">$group_name.map") + or die("Cannot open $group_name.map for writing: $!"); + print OUT "% generated by $prg\n%\n% maps for family $group_name\n\n"; + print OUT "% ptex\n$ptexlines\n"; + print OUT "% uptex\n$uptexlines\n"; + print OUT "% otf\n$otflines\n"; + print OUT "% otf-uptex\n$otfuplines\n"; + close(OUT); + + open (OUT, ">${group_name}-04.map") + or die("Cannot open ${group_name}-04.map for writing: $!"); + print OUT "% generated by $prg\n%\n% maps for family $group_name ISO2004\n\n"; + print OUT "% ptex\n$ptex04lines\n"; + print OUT "% uptex\n$uptex04lines\n"; + print OUT "% otf\n$otflines\n"; + print OUT "% otf-uptex\n$otfuplines\n"; + close(OUT); + + my $cwd = cwd(); + + $mw->Dialog(-title => "Finished", + -text => "Fontmaps have been created in the $cwd.\nPlease move them to a place where dvipdfmx can find them.", + -buttons => [ "Finish" ])->Show(); + + $mw->destroy; + exit 0; +} + + +sub win32 { return ($^O =~ /^MSWin/i ? 1 : 0); } + +__END__ + +=head1 NAME + +kanji-fontmap-creator - GUI to create map file collections for Kanji fonts + +=head1 SYNOPSIS + +kanji-fontmap-creator [I