summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/scripts/cjk-gs-integrate/cjk-gs-integrate.pl
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/scripts/cjk-gs-integrate/cjk-gs-integrate.pl')
-rwxr-xr-xMaster/texmf-dist/scripts/cjk-gs-integrate/cjk-gs-integrate.pl2179
1 files changed, 2179 insertions, 0 deletions
diff --git a/Master/texmf-dist/scripts/cjk-gs-integrate/cjk-gs-integrate.pl b/Master/texmf-dist/scripts/cjk-gs-integrate/cjk-gs-integrate.pl
new file mode 100755
index 00000000000..980e41329be
--- /dev/null
+++ b/Master/texmf-dist/scripts/cjk-gs-integrate/cjk-gs-integrate.pl
@@ -0,0 +1,2179 @@
+#!/usr/bin/env perl
+#
+# cjk-gs-integrate - setup ghostscript for CID/TTF CJK fonts
+#
+# Copyright 2015 by Norbert Preining
+#
+# Based on research and work by Yusuke Kuroki, Bruno Voisin, Munehiro Yamamoto
+# and the TeX Q&A wiki page
+#
+# 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/norbusan/cjk-gs-support
+#
+# TODO:
+# - how to deal with MacTeX pre-shipped configuration files?
+# - interoperability with updmap-config-kanji
+# - input from CK about font priorities
+#
+
+$^W = 1;
+use Getopt::Long qw(:config no_autoabbrev ignore_case_always);
+use File::Basename;
+use strict;
+
+(my $prg = basename($0)) =~ s/\.pl$//;
+my $version = '20150506.0';
+
+if (win32()) {
+ print_error("Sorry, currently not supported on Windows!\n");
+ exit(1);
+}
+
+my %encode_list = (
+ Japan => [ qw/
+ 78-EUC-H
+ 78-EUC-V
+ 78-H
+ 78-RKSJ-H
+ 78-RKSJ-V
+ 78-V
+ 78ms-RKSJ-H
+ 78ms-RKSJ-V
+ 83pv-RKSJ-H
+ 90ms-RKSJ-H
+ 90ms-RKSJ-V
+ 90msp-RKSJ-H
+ 90msp-RKSJ-V
+ 90pv-RKSJ-H
+ 90pv-RKSJ-V
+ Add-H
+ Add-RKSJ-H
+ Add-RKSJ-V
+ Add-V
+ Adobe-Japan1-0
+ Adobe-Japan1-1
+ Adobe-Japan1-2
+ Adobe-Japan1-3
+ Adobe-Japan1-4
+ Adobe-Japan1-5
+ Adobe-Japan1-6
+ EUC-H
+ EUC-V
+ Ext-H
+ Ext-RKSJ-H
+ Ext-RKSJ-V
+ Ext-V
+ H
+ Hankaku
+ Hiragana
+ Identity-H
+ Identity-V
+ Katakana
+ NWP-H
+ NWP-V
+ RKSJ-H
+ RKSJ-V
+ Roman
+ UniJIS-UCS2-H
+ UniJIS-UCS2-HW-H
+ UniJIS-UCS2-HW-V
+ UniJIS-UCS2-V
+ UniJIS-UTF16-H
+ UniJIS-UTF16-V
+ UniJIS-UTF32-H
+ UniJIS-UTF32-V
+ UniJIS-UTF8-H
+ UniJIS-UTF8-V
+ UniJIS2004-UTF16-H
+ UniJIS2004-UTF16-V
+ UniJIS2004-UTF32-H
+ UniJIS2004-UTF32-V
+ UniJIS2004-UTF8-H
+ UniJIS2004-UTF8-V
+ UniJISPro-UCS2-HW-V
+ UniJISPro-UCS2-V
+ UniJISPro-UTF8-V
+ UniJISX0213-UTF32-H
+ UniJISX0213-UTF32-V
+ UniJISX02132004-UTF32-H
+ UniJISX02132004-UTF32-V
+ V
+ WP-Symbol/ ],
+ GB => [ qw/
+ Adobe-GB1-0
+ Adobe-GB1-1
+ Adobe-GB1-2
+ Adobe-GB1-3
+ Adobe-GB1-4
+ Adobe-GB1-5
+ GB-EUC-H
+ GB-EUC-V
+ GB-H
+ GB-RKSJ-H
+ GB-V
+ GBK-EUC-H
+ GBK-EUC-V
+ GBK2K-H
+ GBK2K-V
+ GBKp-EUC-H
+ GBKp-EUC-V
+ GBT-EUC-H
+ GBT-EUC-V
+ GBT-H
+ GBT-RKSJ-H
+ GBT-V
+ GBTpc-EUC-H
+ GBTpc-EUC-V
+ GBpc-EUC-H
+ GBpc-EUC-V
+ Identity-H
+ Identity-V
+ UniGB-UCS2-H
+ UniGB-UCS2-V
+ UniGB-UTF16-H
+ UniGB-UTF16-V
+ UniGB-UTF32-H
+ UniGB-UTF32-V
+ UniGB-UTF8-H
+ UniGB-UTF8-V/ ],
+ CNS => [ qw/
+ Adobe-CNS1-0
+ Adobe-CNS1-1
+ Adobe-CNS1-2
+ Adobe-CNS1-3
+ Adobe-CNS1-4
+ Adobe-CNS1-5
+ Adobe-CNS1-6
+ B5-H
+ B5-V
+ B5pc-H
+ B5pc-V
+ CNS-EUC-H
+ CNS-EUC-V
+ CNS1-H
+ CNS1-V
+ CNS2-H
+ CNS2-V
+ ETHK-B5-H
+ ETHK-B5-V
+ ETen-B5-H
+ ETen-B5-V
+ ETenms-B5-H
+ ETenms-B5-V
+ HKdla-B5-H
+ HKdla-B5-V
+ HKdlb-B5-H
+ HKdlb-B5-V
+ HKgccs-B5-H
+ HKgccs-B5-V
+ HKm314-B5-H
+ HKm314-B5-V
+ HKm471-B5-H
+ HKm471-B5-V
+ HKscs-B5-H
+ HKscs-B5-V
+ Identity-H
+ Identity-V
+ UniCNS-UCS2-H
+ UniCNS-UCS2-V
+ UniCNS-UTF16-H
+ UniCNS-UTF16-V
+ UniCNS-UTF32-H
+ UniCNS-UTF32-V
+ UniCNS-UTF8-H
+ UniCNS-UTF8-V/ ],
+ Korea => [ qw/
+ Adobe-Korea1-0
+ Adobe-Korea1-1
+ Adobe-Korea1-2
+ Identity-H
+ Identity-V
+ KSC-EUC-H
+ KSC-EUC-V
+ KSC-H
+ KSC-Johab-H
+ KSC-Johab-V
+ KSC-RKSJ-H
+ KSC-V
+ KSCms-UHC-H
+ KSCms-UHC-HW-H
+ KSCms-UHC-HW-V
+ KSCms-UHC-V
+ KSCpc-EUC-H
+ KSCpc-EUC-V
+ UniKS-UCS2-H
+ UniKS-UCS2-V
+ UniKS-UTF16-H
+ UniKS-UTF16-V
+ UniKS-UTF32-H
+ UniKS-UTF32-V
+ UniKS-UTF8-H
+ UniKS-UTF8-V/ ] );
+
+my $dry_run = 0;
+my $opt_help = 0;
+my $opt_quiet = 0;
+my $opt_debug = 0;
+my $opt_listaliases = 0;
+my $opt_listallaliases = 0;
+my $opt_listfonts = 0;
+my $opt_info = 0;
+my $opt_fontdef;
+my $opt_output;
+my @opt_aliases;
+my $opt_only_aliases = 0;
+my $opt_machine = 0;
+my $opt_filelist;
+my $opt_force = 0;
+my $opt_texmflink = 0;
+my $opt_markdown = 0;
+
+if (! GetOptions(
+ "n|dry-run" => \$dry_run,
+ "info" => \$opt_info,
+ "list-aliases" => \$opt_listaliases,
+ "list-all-aliases" => \$opt_listallaliases,
+ "list-fonts" => \$opt_listfonts,
+ "link-texmflocal" => \$opt_texmflink,
+ "only-aliases" => \$opt_only_aliases,
+ "machine-readable" => \$opt_machine,
+ "force" => \$opt_force,
+ "filelist=s" => \$opt_filelist,
+ "markdown" => \$opt_markdown,
+ "o|output=s" => \$opt_output,
+ "h|help" => \$opt_help,
+ "q|quiet" => \$opt_quiet,
+ "d|debug+" => \$opt_debug,
+ "f|fontdef=s" => \$opt_fontdef,
+ "a|alias=s" => \@opt_aliases,
+ "v|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') ;
+my $sep = (win32() ? ';' : ':');
+my %fontdb;
+my %aliases;
+my %user_aliases;
+
+if ($opt_help) {
+ Usage();
+ exit 0;
+}
+
+if ($opt_debug) {
+ require Data::Dumper;
+ $Data::Dumper::Indent = 1;
+}
+
+chomp (my $TEXMFLOCAL = `kpsewhich -var-value=TEXMFLOCAL`);
+
+main(@ARGV);
+
+#
+# only sub definitions from here on
+#
+sub main {
+ print_info("reading font database ...\n");
+ read_font_database();
+ if (!$opt_listallaliases) {
+ print_info("checking for files ...\n");
+ check_for_files();
+ } else {
+ make_all_available();
+ }
+ compute_aliases();
+ if ($opt_info) {
+ $opt_listfonts = 1;
+ $opt_listaliases = 1;
+ }
+ if ($opt_listfonts) {
+ info_found_fonts();
+ }
+ if ($opt_listaliases || $opt_listallaliases) {
+ print "List of ", ($opt_listaliases ? "all" : "available"), " aliases and their options (in decreasing priority):\n" unless $opt_machine;
+ my (@jal, @kal, @tal, @sal);
+ for my $al (sort keys %aliases) {
+ my $cl;
+ my @ks = sort { $a <=> $b} keys(%{$aliases{$al}});
+ my $foo = '';
+ $foo = "$al:\n" unless $opt_machine;
+ for my $p (@ks) {
+ my $t = $aliases{$al}{$p};
+ my $fn = ($opt_listallaliases ? "-" : $fontdb{$t}{'target'} );
+ # should always be the same ;-)
+ $cl = $fontdb{$t}{'class'};
+ if (!$opt_listallaliases && $fontdb{$t}{'type'} eq 'TTF' && $fontdb{$t}{'subfont'} > 0) {
+ $fn .= "($fontdb{$t}{'subfont'})";
+ }
+ if ($opt_machine) {
+ $foo .= "$al:$p:$aliases{$al}{$p}:$fn\n";
+ } else {
+ $foo .= "\t($p) $aliases{$al}{$p} ($fn)\n";
+ }
+ }
+ if ($cl eq 'Japan') {
+ push @jal, $foo;
+ } elsif ($cl eq 'Korea') {
+ push @kal, $foo;
+ } elsif ($cl eq 'GB') {
+ push @sal, $foo;
+ } elsif ($cl eq 'CNS') {
+ push @tal, $foo;
+ } else {
+ print STDERR "unknown class $cl for $al\n";
+ }
+ }
+ if ($opt_machine) {
+ print @jal if @jal;
+ print @kal if @kal;
+ print @tal if @tal;
+ print @sal if @sal;
+ } else {
+ print "Aliases for Japanese fonts:\n", @jal, "\n" if @jal;
+ print "Aliases for Korean fonts:\n", @kal, "\n" if @kal;
+ print "Aliases for Traditional Chinese fonts:\n", @tal, "\n" if @tal;
+ print "Aliases for Simplified Chinese fonts:\n", @sal, "\n" if @sal;
+ }
+ }
+ exit(0) if ($opt_listfonts || $opt_listaliases || $opt_listallaliases);
+
+ if (! $opt_output) {
+ print_info("searching for GhostScript resource\n");
+ my $gsres = find_gs_resource();
+ if (!$gsres) {
+ print_error("Cannot find GhostScript, terminating!\n");
+ exit(1);
+ } else {
+ $opt_output = $gsres;
+ }
+ }
+ if (! -d $opt_output) {
+ $dry_run || mkdir($opt_output) ||
+ die ("Cannot create directory $opt_output: $!");
+ }
+ print_info("output is going to $opt_output\n");
+ if (!$opt_only_aliases) {
+ print_info("generating font snippets and link CID fonts ...\n");
+ do_otf_fonts();
+ print_info("generating font snippets, links, and cidfmap.local for TTF fonts ...\n");
+ do_ttf_fonts();
+ }
+ print_info("generating font aliases ...\n");
+ do_aliases();
+ print_info("finished\n");
+}
+
+sub update_master_cidfmap {
+ my $add = shift;
+ my $cidfmap_master = "$opt_output/Init/cidfmap";
+ if (-r $cidfmap_master) {
+ open(FOO, "<", $cidfmap_master) ||
+ die ("Cannot open $cidfmap_master for reading: $!");
+ my $found = 0;
+ while(<FOO>) {
+ $found = 1 if
+ m/^\s*\(\Q$add\E\)\s\s*\.runlibfile\s*$/;
+ }
+ if ($found) {
+ print_info("$add already loaded in $cidfmap_master, no changes\n");
+ } else {
+ return if $dry_run;
+ open(FOO, ">>", $cidfmap_master) ||
+ die ("Cannot open $cidfmap_master for appending: $!");
+ print FOO "($add) .runlibfile\n";
+ close(FOO);
+ }
+ } else {
+ return if $dry_run;
+ open(FOO, ">", $cidfmap_master) ||
+ die ("Cannot open $cidfmap_master for writing: $!");
+ print FOO "($add) .runlibfile\n";
+ close(FOO);
+ }
+}
+
+sub make_dir {
+ my ($d, $w) = @_;
+ if (-r $d) {
+ if (! -d $d) {
+ print_error("$d is not a directory, $w\n");
+ exit 1;
+ }
+ } else {
+ $dry_run || mkdir($d);
+ }
+}
+
+sub do_otf_fonts {
+ my $fontdest = "$opt_output/Font";
+ my $ciddest = "$opt_output/CIDFont";
+ make_dir($fontdest, "cannot create CID snippets there!");
+ make_dir($ciddest, "cannot link CID fonts there!");
+ print "opt_texfmlink = $opt_texmflink\n";
+ make_dir("$TEXMFLOCAL/fonts/opentype/cjk-gs-integrate",
+ "cannot link fonts to it!")
+ if $opt_texmflink;
+ for my $k (keys %fontdb) {
+ if ($fontdb{$k}{'available'} && $fontdb{$k}{'type'} eq 'CID') {
+ generate_font_snippet($fontdest,
+ $k, $fontdb{$k}{'class'}, $fontdb{$k}{'target'});
+ link_font($fontdb{$k}{'target'}, $ciddest, $k);
+ link_font($fontdb{$k}{'target'}, "$TEXMFLOCAL/fonts/opentype/cjk-gs-integrate")
+ if $opt_texmflink;
+ }
+ }
+}
+
+sub generate_font_snippet {
+ my ($fd, $n, $c, $f) = @_;
+ return if $dry_run;
+ for my $enc (@{$encode_list{$c}}) {
+ open(FOO, ">$fd/$n-$enc") ||
+ die("cannot open $fd/$n-$enc for writing: $!");
+ print FOO "%%!PS-Adobe-3.0 Resource-Font
+%%%%DocumentNeededResources: $enc (CMap)
+%%%%IncludeResource: $enc (CMap)
+%%%%BeginResource: Font ($n-$enc)
+($n-$enc)
+($enc) /CMap findresource
+[($n) /CIDFont findresource]
+composefont
+pop
+%%%%EndResource
+%%%%EOF
+";
+ close(FOO);
+ }
+}
+
+sub link_font {
+ my ($f, $cd, $n) = @_;
+ return if $dry_run;
+ if (!$n) {
+ $n = basename($f);
+ }
+ my $target = "$cd/$n";
+ printf STDERR "link try to $target\n";
+ if ($opt_force && -e $target) {
+ print_info("Removing $target prior to recreation due to --force\n");
+ unlink($target) || die "Cannot unlink $target prior to recreation under --force: $!";
+ }
+ if (-l $target) {
+ my $linkt = readlink($target);
+ if ($linkt && -r $linkt) {
+ if ($linkt eq $f) {
+ # do nothing, it is the same link
+ } else {
+ print_error("link $target already existing, but different target then $target, exiting!\n");
+ exit(1);
+ }
+ } else {
+ print_warning("removing dangling symlink $target to $linkt\n");
+ unlink($target);
+ }
+ } else {
+ if (-e $target) {
+ print_error("$target already existing, but not a link, exiting!\n");
+ exit(1);
+ } else {
+ symlink($f, $target) || die("Cannot link font $f to $target: $!");
+ }
+ }
+}
+
+sub do_ttf_fonts {
+ my $fontdest = "$opt_output/Font";
+ my $cidfsubst = "$opt_output/CIDFSubst";
+ my $outp = '';
+ make_dir($fontdest, "cannot create CID snippets there!");
+ make_dir($cidfsubst, "cannot link TTF fonts there!");
+ make_dir("$TEXMFLOCAL/fonts/truetype/cjk-gs-integrate",
+ "cannot link fonts to it!")
+ if $opt_texmflink;
+ for my $k (keys %fontdb) {
+ if ($fontdb{$k}{'available'} && $fontdb{$k}{'type'} eq 'TTF') {
+ generate_font_snippet($fontdest,
+ $k, $fontdb{$k}{'class'}, $fontdb{$k}{'target'});
+ $outp .= generate_cidfmap_entry($k, $fontdb{$k}{'class'}, $fontdb{$k}{'target'}, $fontdb{$k}{'subfont'});
+ link_font($fontdb{$k}{'target'}, $cidfsubst);
+ link_font($fontdb{$k}{'target'}, "$TEXMFLOCAL/fonts/truetype/cjk-gs-integrate")
+ if $opt_texmflink;
+ }
+ }
+ return if $dry_run;
+ if ($outp) {
+ if (! -d "$opt_output/Init") {
+ mkdir("$opt_output/Init") ||
+ die("Cannot create directory $opt_output/Init: $!");
+ }
+ open(FOO, ">$opt_output/Init/cidfmap.local") ||
+ die "Cannot open $opt_output/cidfmap.local: $!";
+ print FOO $outp;
+ close(FOO);
+ }
+ print_info("adding cidfmap.local to cidfmap file ...\n");
+ update_master_cidfmap('cidfmap.local');
+}
+
+sub do_aliases {
+ my $fontdest = "$opt_output/Font";
+ my $cidfsubst = "$opt_output/CIDFSubst";
+ my $outp = '';
+ #
+ # alias handling
+ # we use two levels of aliases, one is for the default names that
+ # are not actual fonts:
+ # Ryumin-Light, GothicBBB-Medium, FutoMinA101-Bold, FutoGoB101-Bold,
+ # Jun101-Light which are the original Morisawa names.
+ #
+ # the second level of aliases is for Morisawa OTF font names:
+ # RyuminPro-Light, GothicBBBPro-Medium,
+ # FutoMinA101Pro-Bold, FutoGoB101Pro-Bold
+ # Jun101Pro-Light
+ #
+ # the order of fonts selected is
+ # Morisawa Pr6, Morisawa, Hiragino ProN, Hiragino,
+ # Yu OSX, Yu Win, Kozuka ProN, Kozuka, IPAex, IPA
+ # but is defined in the Provides(Priority): Name in the font definiton
+ #
+ $outp .= "\n\n% Aliases\n";
+ #
+ my (@jal, @kal, @tal, @sal);
+ #
+ for my $al (sort keys %aliases) {
+ my $target;
+ my $class;
+ if ($user_aliases{$al}) {
+ $target = $user_aliases{$al};
+ # determine class
+ if ($fontdb{$target}{'available'}) {
+ $class = $fontdb{$target}{'class'};
+ } else {
+ # must be an aliases, we checked this when initializing %user_aliases
+ # reset the $al value
+ # and since $class is still undefined we will use the next code below
+ $al = $target;
+ }
+ }
+ if (!$class) {
+ # search lowest number
+ my @ks = keys(%{$aliases{$al}});
+ my $first = (sort { $a <=> $b} @ks)[0];
+ $target = $aliases{$al}{$first};
+ $class = $fontdb{$target}{'class'};
+ }
+ # we also need to create font snippets in Font for the aliases!
+ generate_font_snippet($fontdest, $al, $class, $target);
+ if ($class eq 'Japan') {
+ push @jal, "/$al /$target ;";
+ } elsif ($class eq 'Korea') {
+ push @kal, "/$al /$target ;";
+ } elsif ($class eq 'GB') {
+ push @sal, "/$al /$target ;";
+ } elsif ($class eq 'CNS') {
+ push @tal, "/$al /$target ;";
+ } else {
+ print STDERR "unknown class $class for $al\n";
+ }
+ }
+ $outp .= "\n% Japanese fonts\n" . join("\n", @jal) . "\n" if @jal;
+ $outp .= "\n% Korean fonts\n" . join("\n", @kal) . "\n" if @kal;
+ $outp .= "\n% Traditional Chinese fonts\n" . join("\n", @tal) . "\n" if @tal;
+ $outp .= "\n% Simplified Chinese fonts\n" . join("\n", @sal) . "\n" if @sal;
+ #
+ return if $dry_run;
+ if ($outp) {
+ if (! -d "$opt_output/Init") {
+ mkdir("$opt_output/Init") ||
+ die("Cannot create directory $opt_output/Init: $!");
+ }
+ open(FOO, ">$opt_output/Init/cidfmap.aliases") ||
+ die "Cannot open $opt_output/cidfmap.aliases: $!";
+ print FOO $outp;
+ close(FOO);
+ }
+ print_info("adding cidfmap.aliases to cidfmap file ...\n");
+ update_master_cidfmap('cidfmap.aliases');
+}
+
+sub generate_cidfmap_entry {
+ my ($n, $c, $f, $sf) = @_;
+ # we link the ttf fonts, so we use only the base name
+ # otherwise the ps2pdf breaks due to -dSAFER
+ my $bn = basename($f);
+ # extract subfont
+ my $s = "/$n << /FileType /TrueType
+ /Path pssystemparams /GenericResourceDir get
+ (CIDFSubst/$bn) concatstrings
+ /SubfontID $sf
+ /CSI [($c";
+ if ($c eq "Japan") {
+ $s .= "1) 6]";
+ } elsif ($c eq "GB") {
+ $s .= "1) 5]";
+ } elsif ($c eq "CNS") {
+ $s .= "1) 5]";
+ } elsif ($c eq "Korea") {
+ $s .= "1) 2]";
+ } else {
+ print_warning("unknown class $c for $n, skipping.\n");
+ return '';
+ }
+ $s .= " >> ;\n";
+ return $s;
+}
+
+#
+# dump found files
+sub info_found_fonts {
+ print "List of found fonts:\n\n";
+ for my $k (keys %fontdb) {
+ my @foundfiles;
+ if ($fontdb{$k}{'available'}) {
+ print "Font: $k\n";
+ print "Type: $fontdb{$k}{'type'}\n";
+ print "Class: $fontdb{$k}{'class'}\n";
+ my $fn = $fontdb{$k}{'target'};
+ if ($fontdb{$k}{'type'} eq 'TTF' && $fontdb{$k}{'subfont'} > 0) {
+ $fn .= "($fontdb{$k}{'subfont'})";
+ }
+ print "File: $fn\n";
+ print "\n";
+ }
+ }
+}
+
+
+#
+# make all fonts available for listing all aliases
+sub make_all_available {
+ for my $k (keys %fontdb) {
+ $fontdb{$k}{'available'} = 1;
+ delete $fontdb{$k}{'files'};
+ }
+}
+
+#
+# checks all file names listed in %fontdb
+# and sets
+sub check_for_files {
+ my @foundfiles;
+ if ($opt_filelist) {
+ open(FOO, "<", $opt_filelist) || die "Cannot open $opt_filelist: $!";
+ @foundfiles = <FOO>;
+ close(FOO) || warn "Cannot close $opt_filelist: $!";
+ } else {
+ # first collect all files:
+ my @fn;
+ for my $k (keys %fontdb) {
+ for my $f (keys %{$fontdb{$k}{'files'}}) {
+ # check for subfont extension
+ if ($f =~ m/^(.*)\(\d*\)$/) {
+ push @fn, $1;
+ } else {
+ push @fn, $f;
+ }
+ }
+ }
+ #
+ # collect extra directories for search
+ my @extradirs;
+ if (win32()) {
+ push @extradirs, "c:/windows/fonts//";
+ } else {
+ # other dirs to check, for normal unix?
+ for my $d (qw!/Library/Fonts /System/Library/Fonts /Library/Fonts/Microsoft/ /Network/Library/Fonts!) {
+ push @extradirs, $d if (-d $d);
+ }
+ my $home = $ENV{'HOME'};
+ push @extradirs, "$home/Library/Fonts" if (-d "$home/Library/Fonts");
+ }
+ #
+ if (@extradirs) {
+ # final dummy directory
+ push @extradirs, "/this/does/not/really/exists/unless/you/are/stupid";
+ # push current value of OSFONTDIR
+ push @extradirs, $ENV{'OSFONTDIR'} if $ENV{'OSFONTDIR'};
+ # compose OSFONTDIR
+ my $osfontdir = join ':', @extradirs;
+ $ENV{'OSFONTDIR'} = $osfontdir;
+ }
+ if ($ENV{'OSFONTDIR'}) {
+ print_debug("final setting of OSFONTDIR: $ENV{'OSFONTDIR'}\n");
+ }
+ # prepare for kpsewhich call, we need to do quoting
+ my $cmdl = 'kpsewhich ';
+ for my $f (@fn) {
+ $cmdl .= " \"$f\" ";
+ }
+ # shoot up kpsewhich
+ print_ddebug("checking for $cmdl\n");
+ @foundfiles = `$cmdl`;
+ }
+ chomp(@foundfiles);
+ print_ddebug("Found files @foundfiles\n");
+ # map basenames to filenames
+ my %bntofn;
+ for my $f (@foundfiles) {
+ my $bn = basename($f);
+ $bntofn{$bn} = $f;
+ }
+ if ($opt_debug > 1) {
+ print_ddebug("dumping basename to filename list:\n");
+ print_ddebug(Data::Dumper::Dumper(\%bntofn));
+ }
+
+ # update the %fontdb with the found files
+ for my $k (keys %fontdb) {
+ $fontdb{$k}{'available'} = 0;
+ for my $f (keys %{$fontdb{$k}{'files'}}) {
+ # check for subfont extension
+ my $realfile = $f;
+ $realfile =~ s/^(.*)\(\d*\)$/$1/;
+ if ($bntofn{$realfile}) {
+ # we found a representative, make it available
+ $fontdb{$k}{'files'}{$f}{'target'} = $bntofn{$realfile};
+ $fontdb{$k}{'available'} = 1;
+ } else {
+ # delete the entry for convenience
+ delete $fontdb{$k}{'files'}{$f};
+ }
+ }
+ }
+ # second round to determine the winner in case of more targets
+ for my $k (keys %fontdb) {
+ if ($fontdb{$k}{'available'}) {
+ my $mp = 1000000; my $mf;
+ for my $f (keys %{$fontdb{$k}{'files'}}) {
+ if ($fontdb{$k}{'files'}{$f}{'priority'} < $mp) {
+ $mp = $fontdb{$k}{'files'}{$f}{'priority'};
+ $mf = $f;
+ }
+ }
+ # extract subfont if necessary
+ my $sf = 0;
+ if ($mf =~ m/^(.*)\((\d*)\)$/) { $sf = $2; }
+ $fontdb{$k}{'target'} = $fontdb{$k}{'files'}{$mf}{'target'};
+ $fontdb{$k}{'subfont'} = $sf if ($fontdb{$k}{'type'} eq 'TTF');
+ }
+ # not needed anymore
+ delete $fontdb{$k}{'files'};
+ }
+ if ($opt_debug > 0) {
+ print_debug("dumping font database:\n");
+ print_debug(Data::Dumper::Dumper(\%fontdb));
+ }
+}
+
+sub compute_aliases {
+ # go through fontdb to check for provides
+ # accumulate all provided fonts in @provides
+ for my $k (keys %fontdb) {
+ if ($fontdb{$k}{'available'}) {
+ for my $p (keys %{$fontdb{$k}{'provides'}}) {
+ # do not check alias if the real font is available
+ next if $fontdb{$p}{'available'};
+ # use the priority as key
+ # if priorities are double, this will pick one at chance
+ if ($aliases{$p}{$fontdb{$k}{'provides'}{$p}}) {
+ print_warning("duplicate provide levels:\n");
+ print_warning(" current $p $fontdb{$k}{'provides'}{$p} $aliases{$p}{$fontdb{$k}{'provides'}{$p}}\n");
+ print_warning(" ignored $p $fontdb{$k}{'provides'}{$p} $k\n");
+ } else {
+ $aliases{$p}{$fontdb{$k}{'provides'}{$p}} = $k;
+ }
+ }
+ }
+ }
+ # check for user supplied aliases
+ for my $a (@opt_aliases) {
+ if ($a =~ m/^(.*)=(.*)$/) {
+ my $ll = $1;
+ my $rr = $2;
+ # check for consistency of user provided aliases:
+ # - ll must not be available
+ # - rr needs to be available as font or alias
+ # check whether $rr is available, either as real font or as alias
+ if ($fontdb{$ll}{'available'}) {
+ print_error("left side of alias spec is provided by a real font: $a\n");
+ print_error("stopping here\n");
+ exit(1);
+ }
+ if (!($fontdb{$rr}{'available'} || $aliases{$rr})) {
+ print_error("right side of alias spec is not available as real font or alias: $a\n");
+ print_error("stopping here\n");
+ exit(1);
+ }
+ $user_aliases{$ll} = $rr;
+ }
+ }
+ if ($opt_debug > 0) {
+ print_debug("dumping aliases:\n");
+ print_debug(Data::Dumper::Dumper(\%aliases));
+ }
+}
+
+sub read_font_database {
+ my @dbl;
+ if ($opt_fontdef) {
+ open (FDB, "<$opt_fontdef") ||
+ die "Cannot find $opt_fontdef: $!";
+ @dbl = <FDB>;
+ close(FDB);
+ } else {
+ @dbl = <DATA>;
+ }
+ chomp(@dbl);
+ # add a "final empty line" to easy parsing
+ push @dbl, "";
+ my $fontname = "";
+ my $fonttype = "";
+ my $fontclass = "";
+ my %fontprovides = ();
+ my %fontfiles;
+ my $psname = "";
+ my $lineno = 0;
+ for my $l (@dbl) {
+ $lineno++;
+
+ next if ($l =~ m/^\s*#/);
+ if ($l =~ m/^\s*$/) {
+ if ($fontname || $fonttype || $fontclass || keys(%fontfiles)) {
+ if ($fontname && $fonttype && $fontclass && keys(%fontfiles)) {
+ my $realfontname = ($psname ? $psname : $fontname);
+ $fontdb{$realfontname}{'type'} = $fonttype;
+ $fontdb{$realfontname}{'class'} = $fontclass;
+ $fontdb{$realfontname}{'files'} = { %fontfiles };
+ $fontdb{$realfontname}{'provides'} = { %fontprovides };
+ # reset to start
+ $fontname = $fonttype = $fontclass = $psname = "";
+ %fontfiles = ();
+ %fontprovides = ();
+ } else {
+ print_warning("incomplete entry above line $lineno for $fontname/$fonttype/$fontclass, skipping!\n");
+ # reset to start
+ $fontname = $fonttype = $fontclass = $psname = "";
+ %fontfiles = ();
+ %fontprovides = ();
+ }
+ } else {
+ # no term is set, so nothing to warn about
+ }
+ next;
+ }
+ if ($l =~ m/^Name:\s*(.*)$/) { $fontname = $1; next; }
+ if ($l =~ m/^PSName:\s*(.*)$/) { $psname = $1; next; }
+ if ($l =~ m/^Type:\s*(.*)$/) { $fonttype = $1 ; next ; }
+ if ($l =~ m/^Class:\s*(.*)$/) { $fontclass = $1 ; next ; }
+ if ($l =~ m/^Filename(\((\d+)\))?:\s*(.*)$/) {
+ $fontfiles{$3}{'priority'} = ($2 ? $2 : 10);
+ next;
+ }
+ if ($l =~ m/^Provides\((\d+)\):\s*(.*)$/) { $fontprovides{$2} = $1; next; }
+ # we are still here??
+ print_error("Cannot parse this file at line $lineno, exiting. Strange line: >>>$l<<<\n");
+ exit (1);
+ }
+}
+
+sub find_gs_resource {
+ # we assume that gs is in the path
+ # on Windows we probably have to try something else
+ my @ret = `gs --help 2>$nul`;
+ my $foundres = '';
+ if ($?) {
+ print_error("Cannot find gs ...\n");
+ } else {
+ # try to find resource line
+ for (@ret) {
+ if (m!Resource/Font!) {
+ $foundres = $_;
+ $foundres =~ s/^\s*//;
+ $foundres =~ s/\s*:\s*$//;
+ $foundres =~ s!/Font!!;
+ last;
+ }
+ }
+ if (!$foundres) {
+ print_error("Found gs but no resource???\n");
+ }
+ }
+ return $foundres;
+}
+
+sub version {
+ my $ret = sprintf "%s version %s\n", $prg, $version;
+ return $ret;
+}
+
+sub Usage {
+ my $headline = "Configuring GhostScript for CJK CID/TTF fonts";
+ my $usage = "[perl] $prg\[.pl\] [OPTIONS]";
+ my $options = "
+-n, --dry-run do not actually output anything
+-f, --fontdef FILE specify alternate set of font definitions, if not
+ given, the built-in set is used
+-o, --output DIR specifies the base output dir, if not provided,
+ the Resource directory of an install GhostScript
+ is searched and used.
+-a, --alias LL=RR defines an alias, or overrides a given alias
+ illegal if LL is provided by a real font, or
+ RR is neither available as real font or alias
+ can be given multiple times
+--filelist FILE read list of available font files from FILE
+ instead of searching with kpathsea
+--link-texmflocal link fonts into
+ TEXMFLOCAL/fonts/opentype/cjk-gs-integrate
+ and
+ TEXMFLOCAL/fonts/truetype/cjk-gs-integrate
+--machine-readable output of --list-aliases is machine readable
+--force do not bail out if linked fonts already exist
+-q, --quiet be less verbose
+-d, --debug output debug information, can be given multiple times
+-v, --version outputs only the version information
+-h, --help this help
+";
+
+ my $commandoptions = "
+--only-aliases do only regenerate the cidfmap.alias file instead of all
+--list-aliases lists the available aliases and their options, with the
+ selected option on top
+--list-all-aliases list all possible aliases without searching for actually
+ present files
+--list-fonts lists the fonts found on the system
+--info combines the above two information
+";
+
+ my $shortdesc = "
+This script searches a list of directories for CJK fonts, and makes
+them available to an installed GhostScript. In the simplest case with
+sufficient privileges, a run without arguments should effect in a
+complete setup of GhostScript.
+";
+
+my $operation = "
+For each found TrueType (TTF) font it creates a cidfmap entry in
+
+ <Resource>/Init/cidfmap.local
+
+and links the font to
+
+ <Resource>/CIDFSubst/
+
+For each CID font it creates a snippet in
+
+ <Resource>/Font/
+
+and links the font to
+
+ <Resource>/CIDFont/
+
+The `<Resource>` dir is either given by `-o`/`--output`, or otherwise searched
+from an installed GhostScript (binary name is assumed to be 'gs').
+
+Aliases are added to
+
+ <Resource>/Init/cidfmap.aliases
+
+Finally, it tries to add runlib calls to
+
+ <Resource>/Init/cidfmap
+
+to load the cidfmap.local and cidfmap.aliases.
+";
+
+ my $dirsearch = '
+Search is done using the kpathsea library, in particular using kpsewhich
+program. By default the following directories are searched:
+ - all TEXMF trees
+ - `/Library/Fonts`, `/Library/Fonts/Microsoft`, `/System/Library/Fonts`,
+ `/Network/Library/Fonts`, and `~/Library/Fonts` (all if available)
+ - `c:/windows/fonts` (on Windows)
+ - the directories in `OSFONTDIR` environment variable
+
+In case you want to add some directories to the search path, adapt the
+`OSFONTDIR` environment variable accordingly: Example:
+
+`````
+ OSFONTDIR="/usr/local/share/fonts/truetype//:/usr/local/share/fonts/opentype//" $prg
+`````
+
+will result in fonts found in the above two given directories to be
+searched in addition.
+';
+
+ my $outputfile = "
+If no output option is given, the program searches for a GhostScript
+interpreter 'gs' and determines its Resource directory. This might
+fail, in which case one need to pass the output directory manually.
+
+Since the program adds files and link to this directory, sufficient
+permissions are necessary.
+";
+
+ my $aliases = "
+Aliases are managed via the Provides values in the font database.
+At the moment entries for the basic font names for CJK fonts
+are added:
+
+Japanese:
+
+ Ryumin-Light GothicBBB-Medium FutoMinA101-Bold FutoGoB101-Bold Jun101-Light
+
+Korean:
+
+ HYGoThic-Medium HYSMyeongJo-Medium
+
+Simplified Chinese:
+
+ STSong-Light STHeiti-Regular STHeiti-Light STKaiti-Regular
+
+Traditional Chinese:
+
+ MSung-Light MHei-Medium MKai-Medium
+
+In addition, we also includes provide entries for the OTF Morisawa names:
+ RyuminPro-Light GothicBBBPro-Medium FutoMinA101Pro-Bold
+ FutoGoB101Pro-Bold Jun101Pro-Light
+
+The order is determined by the Provides setting in the font database,
+and for the Japanese fonts it is currently:
+ Morisawa Pr6, Morisawa, Hiragino ProN, Hiragino,
+ Yu OSX, Yu Win, Kozuka ProN, Kozuka, IPAex, IPA
+
+That is, the first font found in this order will be used to provide the
+alias if necessary.
+
+#### Overriding aliases ####
+
+Using the command line option `--alias LL=RR` one can add arbitrary aliases,
+or override ones selected by the program. For this to work the following
+requirements of `LL` and `RR` must be fulfilled:
+ * `LL` is not provided by a real font
+ * `RR` is available either as real font, or as alias (indirect alias)
+";
+
+ my $authors = "
+The script and its documentation was written by Norbert Preining, based
+on research and work by Yusuke Kuroki, Bruno Voisin, Munehiro Yamamoto
+and the TeX Q&A wiki page.
+
+The script is licensed under GNU General Public License Version 3 or later.
+The contained font data is not copyrightable.
+";
+
+
+ if ($opt_markdown) {
+ print "$headline\n";
+ print ("=" x length($headline));
+ print "\n$shortdesc\nUsage\n-----\n\n`````\n$usage\n`````\n\n";
+ print "#### Options ####\n\n`````";
+ print_for_out($options, " ");
+ print "`````\n\n#### Command like options ####\n\n`````";
+ print_for_out($commandoptions, " ");
+ print "`````\n\nOperation\n---------\n$operation\n";
+ print "How and which directories are searched\n";
+ print "--------------------------------------\n$dirsearch\n";
+ print "Output files\n";
+ print "------------\n$outputfile\n";
+ print "Aliases\n";
+ print "-------\n$aliases\n";
+ print "Authors, Contributors, and Copyright\n";
+ print "------------------------------------\n$authors\n";
+ } else {
+ print "\nUsage: $usage\n\n$headline\n$shortdesc";
+ print "\nOptions:\n";
+ print_for_out($options, " ");
+ print "\nCommand like options:\n";
+ print_for_out($commandoptions, " ");
+ print "\nOperation:\n";
+ print_for_out($operation, " ");
+ print "\nHow and which directories are searched:\n";
+ print_for_out($dirsearch, " ");
+ print "\nOutput files:\n";
+ print_for_out($outputfile, " ");
+ print "\nAliases:\n";
+ print_for_out($aliases, " ");
+ print "\nAuthors, Contributors, and Copyright:\n";
+ print_for_out($authors, " ");
+ print "\n";
+ }
+ exit 0;
+}
+
+sub print_for_out {
+ my ($what, $indent) = @_;
+ for (split /\n/, $what) {
+ next if m/`````/;
+ s/\s*####\s*//g;
+ if ($_ eq '') {
+ print "\n";
+ } else {
+ print "$indent$_\n";
+ }
+ }
+}
+
+# info/warning can be suppressed
+# verbose/error cannot be suppressed
+sub print_info {
+ print STDOUT "$prg: ", @_ if (!$opt_quiet);
+}
+sub print_verbose {
+ print STDOUT "$prg: ", @_;
+}
+sub print_warning {
+ print STDERR "$prg [WARNING]: ", @_ if (!$opt_quiet)
+}
+sub print_error {
+ print STDERR "$prg [ERROR]: ", @_;
+}
+sub print_debug {
+ print STDERR "$prg [DEBUG]: ", @_ if ($opt_debug >= 1);
+}
+sub print_ddebug {
+ print STDERR "$prg [DEBUG]: ", @_ if ($opt_debug >= 2);
+}
+
+
+__DATA__
+#
+# CJK FONT DEFINITIONS
+#
+
+# JAPAN
+
+# Morisawa
+
+Name: A-OTF-FutoGoB101Pr6N-Bold
+PSName: FutoGoB101Pr6N-Bold
+Type: CID
+Class: Japan
+Provides(10): FutoGoB101-Bold
+Provides(10): FutoGoB101Pro-Bold
+Filename: A-OTF-FutoGoB101Pr6N-Bold.otf
+
+Name: A-OTF-FutoGoB101Pro-Bold
+PSName: FutoGoB101Pro-Bold
+Type: CID
+Class: Japan
+Provides(20): FutoGoB101-Bold
+Filename: A-OTF-FutoGoB101Pro-Bold.otf
+
+Name: A-OTF-FutoMinA101Pr6N-Bold
+PSName: FutoMinA101Pr6N-Bold
+Type: CID
+Class: Japan
+Provides(10): FutoMinA101-Bold
+Provides(10): FutoMinA101Pro-Bold
+Filename: A-OTF-FutoMinA101Pr6N-Bold.otf
+
+Name: A-OTF-FutoMinA101Pro-Bold
+PSName: FutoMinA101Pro-Bold
+Type: CID
+Class: Japan
+Provides(20): FutoMinA101-Bold
+Filename: A-OTF-FutoMinA101Pro-Bold.otf
+
+Name: A-OTF-GothicBBBPr6N-Medium
+PSName: GothicBBBPr6N-Medium
+Type: CID
+Class: Japan
+Provides(10): GothicBBB-Medium
+Provides(10): GothicBBBPro-Medium
+Filename: A-OTF-GothicBBBPr6N-Medium.otf
+
+Name: A-OTF-GothicBBBPro-Medium
+PSName: GothicBBBPro-Medium
+Type: CID
+Class: Japan
+Provides(20): GothicBBB-Medium
+Filename: A-OTF-GothicBBBPro-Medium.otf
+
+Name: A-OTF-Jun101Pro-Light
+PSName: Jun101Pro-Light
+Type: CID
+Class: Japan
+Provides(20): Jun101-Light
+Filename: A-OTF-Jun101Pro-Light.otf
+
+Name: A-OTF-MidashiGoPr6N-MB31
+PSName: MidashiGoPr6N-MB31
+Type: CID
+Class: Japan
+Provides(10): MidashiGo-MB31
+Provides(10): MidashiGoPro-MB31
+Filename: A-OTF-MidashiGoPr6N-MB31.otf
+
+Name: A-OTF-MidashiGoPro-MB31
+PSName: MidashiGoPro-MB31
+Type: CID
+Class: Japan
+Provides(20): MidashiGo-MB31
+Filename: A-OTF-MidashiGoPro-MB31.otf
+
+Name: A-OTF-RyuminPr6N-Light
+PSName: RyuminPr6N-Light
+Type: CID
+Class: Japan
+Provides(10): Ryumin-Light
+Provides(10): RyuminPro-Light
+Filename: A-OTF-RyuminPr6N-Light.otf
+
+Name: A-OTF-RyuminPro-Light
+PSName: RyuminPro-Light
+Type: CID
+Class: Japan
+Provides(20): Ryumin-Light
+Filename: A-OTF-RyuminPro-Light.otf
+
+Name: A-OTF-ShinMGoPr6N-Light
+PSName: ShinMGoPr6N-Light
+Type: CID
+Class: Japan
+Provides(10): Jun101-Light
+Provides(10): Jun101Pro-Light
+Filename: A-OTF-ShinMGoPr6N-Light.otf
+
+
+# Hiragino
+
+Name: HiraKakuPro-W3
+Type: CID
+Class: Japan
+Provides(40): GothicBBB-Medium
+Provides(40): GothicBBBPro-Medium
+# the following two are *not* the same
+# one is in decomposed form (for Mac), one is in composed form (for the rest)
+Filename(20): ヒラギノ角ゴ Pro W3.otf
+Filename(19): ヒラギノ角ゴ Pro W3.otf
+Filename(10): HiraKakuPro-W3.otf
+
+Name: HiraKakuPro-W6
+Type: CID
+Class: Japan
+Provides(40): FutoGoB101-Bold
+Provides(40): FutoGoB101Pro-Bold
+Filename(20): ヒラギノ角ゴ Pro W6.otf
+Filename(19): ヒラギノ角ゴ Pro W6.otf
+Filename(10): HiraKakuPro-W6.otf
+
+Name: HiraKakuProN-W3
+Type: CID
+Class: Japan
+Provides(30): GothicBBB-Medium
+Provides(30): GothicBBBPro-Medium
+Filename(20): ヒラギノ角ゴ ProN W3.otf
+Filename(19): ヒラギノ角ゴ ProN W3.otf
+Filename(10): HiraKakuProN-W3.otf
+
+Name: HiraKakuProN-W6
+Type: CID
+Class: Japan
+Provides(30): FutoGoB101-Bold
+Provides(30): FutoGoB101Pro-Bold
+Filename(20): ヒラギノ角ゴ ProN W6.otf
+Filename(19): ヒラギノ角ゴ ProN W6.otf
+Filename(10): HiraKakuProN-W6.otf
+
+Name: HiraKakuStd-W8
+Type: CID
+Class: Japan
+Provides(40): MidashiGo-MB31
+Provides(40): MidashiGoPro-MB31
+Filename(20): ヒラギノ角ゴ Std W8.otf
+Filename(19): ヒラギノ角ゴ Std W8.otf
+Filename(10): HiraKakuStd-W8.otf
+
+Name: HiraKakuStdN-W8
+Type: CID
+Class: Japan
+Provides(30): MidashiGo-MB31
+Provides(30): MidashiGoPro-MB31
+Filename(20): ヒラギノ角ゴ StdN W8.otf
+Filename(19): ヒラギノ角ゴ StdN W8.otf
+Filename(10): HiraKakuStdN-W8.otf
+
+Name: HiraMaruPro-W4
+Type: CID
+Class: Japan
+Provides(40): Jun101-Light
+Provides(40): Jun101Pro-Light
+Filename(20): ヒラギノ丸ゴ Pro W4.otf
+Filename(19): ヒラギノ丸ゴ Pro W4.otf
+Filename(10): HiraMaruPro-W4.otf
+
+Name: HiraMaruProN-W4
+Type: CID
+Class: Japan
+Provides(30): Jun101-Light
+Provides(30): Jun101Pro-Light
+Filename(20): ヒラギノ丸ゴ ProN W4.otf
+Filename(19): ヒラギノ丸ゴ ProN W4.otf
+Filename(10): HiraMaruProN-W4.otf
+
+Name: HiraMinPro-W3
+Type: CID
+Class: Japan
+Provides(40): Ryumin-Light
+Provides(40): RyuminPro-Light
+Filename(20): ヒラギノ明朝 Pro W3.otf
+Filename(19): ヒラギノ明朝 Pro W3.otf
+Filename(10): HiraMinPro-W3.otf
+
+Name: HiraMinPro-W6
+Type: CID
+Class: Japan
+Provides(40): FutoMinA101-Bold
+Provides(40): FutoMinA101Pro-Bold
+Filename(20): ヒラギノ明朝 Pro W6.otf
+Filename(19): ヒラギノ明朝 Pro W6.otf
+Filename(10): HiraMinPro-W6.otf
+
+Name: HiraMinProN-W3
+Type: CID
+Class: Japan
+Provides(30): Ryumin-Light
+Provides(30): RyuminPro-Light
+Filename(20): ヒラギノ明朝 ProN W3.otf
+Filename(19): ヒラギノ明朝 ProN W3.otf
+Filename(10): HiraMinProN-W3.otf
+
+Name: HiraMinProN-W6
+Type: CID
+Class: Japan
+Provides(30): FutoMinA101-Bold
+Provides(30): FutoMinA101Pro-Bold
+Filename(20): ヒラギノ明朝 ProN W6.otf
+Filename(19): ヒラギノ明朝 ProN W6.otf
+Filename(10): HiraMinProN-W6.otf
+
+
+Name: HiraginoSansGB-W3
+Type: CID
+Class: GB
+Filename(20): Hiragino Sans GB W3.otf
+Filename(10): HiraginoSansGB-W3.otf
+
+Name: HiraginoSansGB-W6
+Type: CID
+Class: GB
+Filename(20): Hiragino Sans GB W6.otf
+Filename(10): HiraginoSansGB-W6.otf
+
+
+# Yu-fonts MacOS version
+
+Name: YuGo-Medium
+Type: CID
+Class: Japan
+Provides(50): GothicBBB-Medium
+Provides(50): GothicBBBPro-Medium
+Filename(20): Yu Gothic Medium.otf
+Filename(10): YuGo-Medium.otf
+
+Name: YuGo-Bold
+Type: CID
+Class: Japan
+Provides(50): FutoGoB101-Bold
+Provides(50): FutoGoB101Pro-Bold
+Provides(50): Jun101-Light
+Provides(50): Jun101Pro-Light
+Provides(50): MidashiGo-MB31
+Provides(50): MidashiGoPro-MB31
+Filename(20): Yu Gothic Bold.otf
+Filename(10): YuGo-Bold.otf
+
+Name: YuMin-Medium
+Type: CID
+Class: Japan
+Provides(50): Ryumin-Light
+Provides(50): RyuminPro-Light
+Filename(20): Yu Mincho Medium.otf
+Filename(10): YuMin-Medium.otf
+
+Name: YuMin-Demibold
+Type: CID
+Class: Japan
+Provides(50): FutoMinA101-Bold
+Provides(50): FutoMinA101Pro-Bold
+Filename(20): Yu Mincho Demibold.otf
+Filename(10): YuMin-Demibold.otf
+
+# Yu-fonts Windows version
+
+Name: YuMincho-Regular
+Type: TTF
+Class: Japan
+Provides(60): Ryumin-Light
+Provides(60): RyuminPro-Light
+Filename(20): yumin.ttf
+Filename(10): YuMincho-Regular.ttf
+
+Name: YuMincho-Light
+Type: TTF
+Class: Japan
+Filename(20): yuminl.ttf
+Filename(10): YuMincho-Light.ttf
+
+Name: YuMincho-DemiBold
+Type: TTF
+Class: Japan
+Provides(60): FutoMinA101-Bold
+Provides(60): FutoMinA101Pro-Bold
+Filename(20): yumindb.ttf
+Filename(10): YuMincho-DemiBold.ttf
+
+Name: YuGothic-Regular
+Type: TTF
+Class: Japan
+Provides(60): GothicBBB-Medium
+Provides(60): GothicBBBPro-Medium
+Filename(20): yugothic.ttf
+Filename(10): YuGothic-Regular.ttf
+
+Name: YuGothic-Light
+Type: TTF
+Class: Japan
+Filename(20): yugothil.ttf
+Filename(10): YuGothic-Light.ttf
+
+Name: YuGothic-Bold
+Type: TTF
+Class: Japan
+Provides(60): FutoGoB101-Bold
+Provides(60): FutoGoB101Pro-Bold
+Provides(60): Jun101-Light
+Provides(60): Jun101Pro-Light
+Provides(60): MidashiGo-MB31
+Provides(60): MidashiGoPro-MB31
+Filename(20): yugothib.ttf
+Filename(10): YuGothic-Bold.ttf
+
+# IPA fonts
+
+Name: IPAMincho
+Type: TTF
+Class: Japan
+Provides(110): Ryumin-Light
+Provides(110): RyuminPro-Light
+Provides(110): FutoMinA101-Bold
+Provides(110): FutoMinA101Pro-Bold
+Filename(20): ipam.ttf
+Filename(10): IPAMincho.ttf
+
+Name: IPAGothic
+Type: TTF
+Class: Japan
+Provides(110): GothicBBB-Medium
+Provides(110): GothicBBBPro-Medium
+Provides(110): FutoGoB101-Bold
+Provides(110): FutoGoB101Pro-Bold
+Provides(110): Jun101-Light
+Provides(110): Jun101Pro-Light
+Provides(110): MidashiGo-MB31
+Provides(110): MidashiGoPro-MB31
+Filename(20): ipag.ttf
+Filename(10): IPAGothic.ttf
+
+Name: IPAexMincho
+Type: TTF
+Class: Japan
+Provides(100): Ryumin-Light
+Provides(100): RyuminPro-Light
+Provides(100): FutoMinA101-Bold
+Provides(100): FutoMinA101Pro-Bold
+Filename(20): ipaexm.ttf
+Filename(10): IPAexMincho.ttf
+
+Name: IPAexGothic
+Type: TTF
+Class: Japan
+Provides(100): GothicBBB-Medium
+Provides(100): GothicBBBPro-Medium
+Provides(100): FutoGoB101-Bold
+Provides(100): FutoGoB101Pro-Bold
+Provides(100): Jun101-Light
+Provides(100): Jun101Pro-Light
+Provides(100): MidashiGo-MB31
+Provides(100): MidashiGoPro-MB31
+Filename(20): ipaexg.ttf
+Filename(10): IPAexGothic.ttf
+
+# Kozuka fonts
+
+Name: KozGoPr6N-Bold
+Type: CID
+Class: Japan
+Provides(70): FutoGoB101-Bold
+Provides(70): FutoGoB101Pro-Bold
+Filename: KozGoPr6N-Bold.otf
+
+Name: KozGoPr6N-Heavy
+Type: CID
+Class: Japan
+Provides(70): Jun101-Light
+Provides(70): Jun101Pro-Light
+Provides(70): MidashiGo-MB31
+Provides(70): MidashiGoPro-MB31
+Filename: KozGoPr6N-Heavy.otf
+
+Name: KozGoPr6N-Medium
+Type: CID
+Class: Japan
+Provides(70): GothicBBB-Medium
+Provides(70): GothicBBBPro-Medium
+Filename: KozGoPr6N-Medium.otf
+
+Name: KozGoPr6N-Regular
+Type: CID
+Class: Japan
+Filename: KozGoPr6N-Regular.otf
+
+Name: KozGoPr6N-ExtraLight
+Type: CID
+Class: Japan
+Filename: KozGoPr6N-ExtraLight.otf
+
+Name: KozGoPr6N-Light
+Type: CID
+Class: Japan
+Filename: KozGoPr6N-Light.otf
+
+Name: KozGoPro-ExtraLight
+Type: CID
+Class: Japan
+Filename: KozGoPro-ExtraLight.otf
+
+Name: KozGoPro-Light
+Type: CID
+Class: Japan
+Filename: KozGoPro-Light.otf
+
+
+Name: KozGoPro-Bold
+Type: CID
+Class: Japan
+Provides(90): FutoGoB101-Bold
+Provides(90): FutoGoB101Pro-Bold
+Filename: KozGoPro-Bold.otf
+
+Name: KozGoPro-Heavy
+Type: CID
+Class: Japan
+Provides(90): Jun101-Light
+Provides(90): Jun101Pro-Light
+Provides(90): MidashiGo-MB31
+Provides(90): MidashiGoPro-MB31
+Filename: KozGoPro-Heavy.otf
+
+Name: KozGoPro-Medium
+Type: CID
+Class: Japan
+Provides(90): GothicBBB-Medium
+Provides(90): GothicBBBPro-Medium
+Filename: KozGoPro-Medium.otf
+
+Name: KozGoPro-Regular
+Type: CID
+Class: Japan
+Filename: KozGoPro-Regular.otf
+
+Name: KozGoProVI-Bold
+Type: CID
+Class: Japan
+Provides(80): FutoGoB101-Bold
+Provides(80): FutoGoB101Pro-Bold
+Filename: KozGoProVI-Bold.otf
+
+Name: KozGoProVI-Heavy
+Type: CID
+Class: Japan
+Provides(80): Jun101-Light
+Provides(80): Jun101Pro-Light
+Provides(80): MidashiGo-MB31
+Provides(80): MidashiGoPro-MB31
+Filename: KozGoProVI-Heavy.otf
+
+Name: KozGoProVI-Medium
+Type: CID
+Class: Japan
+Provides(80): GothicBBB-Medium
+Provides(80): GothicBBBPro-Medium
+Filename: KozGoProVI-Medium.otf
+
+Name: KozGoProVI-Regular
+Type: CID
+Class: Japan
+Filename: KozGoProVI-Regular.otf
+
+Name: KozMinPr6N-Bold
+Type: CID
+Class: Japan
+Provides(70): FutoMinA101-Bold
+Provides(70): FutoMinA101Pro-Bold
+Filename: KozMinPr6N-Bold.otf
+
+Name: KozMinPr6N-Light
+Type: CID
+Class: Japan
+Filename: KozMinPr6N-Light.otf
+
+Name: KozMinPr6N-Regular
+Type: CID
+Class: Japan
+Provides(70): Ryumin-Light
+Provides(70): RyuminPro-Light
+Filename: KozMinPr6N-Regular.otf
+
+Name: KozMinPro-Bold
+Type: CID
+Class: Japan
+Provides(90): FutoMinA101-Bold
+Provides(90): FutoMinA101Pro-Bold
+Filename: KozMinPro-Bold.otf
+
+Name: KozMinPro-Light
+Type: CID
+Class: Japan
+Filename: KozMinPro-Light.otf
+
+Name: KozMinPro-Regular
+Type: CID
+Class: Japan
+Provides(90): Ryumin-Light
+Provides(90): RyuminPro-Light
+Filename: KozMinPro-Regular.otf
+
+Name: KozMinProVI-Bold
+Type: CID
+Class: Japan
+Provides(80): FutoMinA101-Bold
+Provides(80): FutoMinA101Pro-Bold
+Filename: KozMinProVI-Bold.otf
+
+Name: KozMinProVI-Light
+Type: CID
+Class: Japan
+Filename: KozMinProVI-Light.otf
+
+Name: KozMinProVI-Regular
+Type: CID
+Class: Japan
+Provides(80): Ryumin-Light
+Provides(80): RyuminPro-Light
+Filename: KozMinProVI-Regular.otf
+
+Name: KozMinPr6N-ExtraLight
+Type: CID
+Class: Japan
+Filename: KozMinPr6N-ExtraLight.otf
+
+Name: KozMinPr6N-Medium
+Type: CID
+Class: Japan
+Filename: KozMinPr6N-Medium.otf
+
+Name: KozMinPr6N-Heavy
+Type: CID
+Class: Japan
+Filename: KozMinPr6N-Heavy.otf
+
+Name: KozMinPro-ExtraLight
+Type: CID
+Class: Japan
+Filename: KozMinPro-ExtraLight.otf
+
+Name: KozMinPro-Medium
+Type: CID
+Class: Japan
+Filename: KozMinPro-Medium.otf
+
+Name: KozMinPro-Heavy
+Type: CID
+Class: Japan
+Filename: KozMinPro-Heavy.otf
+
+
+#
+# CHINESE FONTS
+#
+
+Name: LiHeiPro
+Type: TTF
+Class: CNS
+Provides(50): MHei-Medium
+Filename(20): 儷黑 Pro.ttf
+Filename(10): LiHeiPro.ttf
+
+Name: LiSongPro
+Type: TTF
+Class: CNS
+# Provides(50): MSung-Medium
+Provides(50): MSung-Light
+Filename(20): 儷宋 Pro.ttf
+Filename(10): LiSongPro.ttf
+
+Name: STXihei
+Type: TTF
+Class: GB
+Provides(20): STHeiti-Light
+Filename(20): 华文细黑.ttf
+Filename(10): STXihei.ttf
+
+Name: STHeiti
+Type: TTF
+Class: GB
+Provides(50): STHeiti-Regular
+Filename(20): 华文黑体.ttf
+Filename(10): STHeiti.ttf
+
+Name: STHeitiSC-Light
+Type: TTF
+Class: GB
+Provides(10): STHeiti-Light
+Filename(10): STHeiti Light.ttc(1)
+Filename(20): STHeitiSC-Light.ttf
+
+Name: STHeitiSC-Medium
+Type: TTF
+Class: GB
+Provides(40): STHeiti-Regular
+Filename(10): STHeiti Medium.ttc(1)
+Filename(20): STHeitiSC-Medium.ttf
+
+Name: STHeitiTC-Light
+Type: TTF
+Class: CNS
+Filename(10): STHeiti Light.ttc(0)
+Filename(20): STHeitiTC-Light.ttf
+
+Name: STHeitiTC-Medium
+Type: TTF
+Class: CNS
+Provides(40): MHei-Medium
+Filename(10): STHeiti Medium.ttc(0)
+Filename(20): STHeitiTC-Medium.ttf
+
+Name: STFangsong
+Type: TTF
+Class: GB
+# Provides(40): STFangsong-Light
+Provides(40): STFangsong-Regular
+Filename(20): 华文仿宋.ttf
+Filename(10): STFangsong.ttf
+
+Name: STSong
+Type: TTF
+Class: GB
+Provides(50): STSong-Light
+Filename(10): Songti.ttc(4)
+Filename(20): 宋体.ttc(3)
+Filename(30): 华文宋体.ttf
+Filename(40): STSong.ttf
+
+Name: STSongti-SC-Light
+Type: TTF
+Class: GB
+Provides(40): STSong-Light
+Filename(10): Songti.ttc(3)
+Filename(20): 宋体.ttc(2)
+Filename(30): STSongti-SC-Light.ttf
+
+Name: STSongti-SC-Regular
+Type: TTF
+Class: GB
+Filename(10): Songti.ttc(6)
+Filename(20): 宋体.ttc(4)
+Filename(30): STSongti-SC-Regular.ttf
+
+Name: STSongti-SC-Bold
+Type: TTF
+Class: GB
+Filename(10): Songti.ttc(1)
+Filename(20): 宋体.ttc(1)
+Filename(30): STSongti-SC-Bold.ttf
+
+Name: STSongti-SC-Black
+Type: TTF
+Class: GB
+Filename(10): Songti.ttc(0)
+Filename(20): 宋体.ttc(0)
+Filename(30): STSongti-SC-Black.ttf
+
+Name: STSongti-TC-Light
+Type: TTF
+Class: CNS
+Provides(40): MSung-Light
+Filename(10): Songti.ttc(5)
+Filename(20): STSongti-TC-Light.ttf
+
+Name: STSongti-TC-Regular
+Type: TTF
+Class: CNS
+# Provides(40): MSung-Medium
+Filename(10): Songti.ttc(7)
+Filename(20): STSongti-TC-Regular.ttf
+
+Name: STSongti-TC-Bold
+Type: TTF
+Class: CNS
+Filename(10): Songti.ttc(2)
+Filename(20): STSongti-TC-Bold.ttf
+
+Name: STKaiti
+Type: TTF
+Class: GB
+Provides(50): STKaiti-Regular
+Filename(10): Kaiti.ttc(4)
+Filename(20): 楷体.ttc(3)
+Filename(30): 华文楷体.ttf
+Filename(40): STKaiti.ttf
+
+Name: STKaiti-SC-Regular
+Type: TTF
+Class: GB
+Provides(40): STKaiti-Regular
+Filename(10): Kaiti.ttc(3)
+Filename(20): 楷体.ttc(2)
+Filename(30): STKaiti-SC-Regular.ttf
+
+Name: STKaiti-SC-Bold
+Type: TTF
+Class: GB
+Filename(10): Kaiti.ttc(1)
+Filename(20): 楷体.ttc(1)
+Filename(30): STKaiti-SC-Bold.ttf
+
+Name: STKaiti-SC-Black
+Type: TTF
+Class: GB
+Filename(10): Kaiti.ttc(0)
+Filename(20): 楷体.ttc(0)
+Filename(30): STKaiti-SC-Black.ttf
+
+Name: STKaiTi-TC-Regular
+Type: TTF
+Class: CNS
+Provides(40): MKai-Medium
+Filename(10): Kaiti.ttc(5)
+Filename(20): STKaiTi-TC-Regular.ttf
+
+Name: STKaiTi-TC-Bold
+Type: TTF
+Class: CNS
+Filename(10): Kaiti.ttc(2)
+Filename(20): STKaiTi-TC-Bold.ttf
+
+Name: STKaiti-Adobe-CNS1
+Type: TTF
+Class: CNS
+Provides(50): MKai-Medium
+Filename(10): Kaiti.ttc(4)
+Filename(20): 楷体.ttc(3)
+Filename(30): 华文楷体.ttf
+Filename(40): STKaiti.ttf
+
+# Adobe fonts
+
+# simplified chinese
+
+Name: AdobeSongStd-Light
+Type: CID
+Class: GB
+Provides(30): STSong-Light
+Filename(10): AdobeSongStd-Light.otf
+
+Name: AdobeHeitiStd-Regular
+Type: CID
+Class: GB
+Provides(30): STHeiti-Regular
+Provides(30): STHeiti-Light
+Filename(20): AdobeHeitiStd-Regular.otf
+
+Name: AdobeKaitiStd-Regular
+Type: CID
+Class: GB
+Provides(30): STKaiti-Regular
+Filename(20): AdobeKaitiStd-Regular.otf
+
+Name: AdobeFangsongStd-Regular
+Type: CID
+Class: GB
+# Provides(30): STFangsong-Light
+Provides(30): STFangsong-Regular
+Filename(20): AdobeFangsongStd-Regular.otf
+
+# traditional chinese
+
+Name: AdobeMingStd-Light
+Type: CID
+Class: CNS
+Provides(30): MSung-Light
+# Provides(30): MSung-Medium
+Filename(20): AdobeMingStd-Light.otf
+
+Name: AdobeFanHeitiStd-Bold
+Type: CID
+Class: CNS
+Provides(30): MHei-Medium
+Provides(30): MKai-Medium
+Filename(20): AdobeFanHeitiStd-Bold.otf
+
+# korean
+
+Name: AdobeMyungjoStd-Medium
+Type: CID
+Class: Korea
+Provides(20): HYSMyeongJo-Medium
+Filename: AdobeMyungjoStd-Medium.otf
+
+Name: AdobeGothicStd-Bold
+Type: CID
+Class: Korea
+Provides(20): HYGoThic-Medium
+Provides(50): HYRGoThic-Medium
+Filename: AdobeGothicStd-Bold.otf
+
+#
+# KOREAN FONTS
+#
+
+# apple fonts
+
+Name: AppleMyungjo
+Type: TTF
+Class: Korea
+Provides(50): HYSMyeongJo-Medium
+Filename: AppleMyungjo.ttf
+
+Name: AppleGothic
+Type: TTF
+Class: Korea
+Provides(50): HYGoThic-Medium
+Provides(80): HYRGoThic-Medium
+Filename: AppleGothic.ttf
+
+Name: NanumMyeongjo
+Type: TTF
+Class: Korea
+Provides(30): HYSMyeongJo-Medium
+Filename: NanumMyeongjo.ttc(0)
+
+Name: NanumMyeongjoBold
+Type: TTF
+Class: Korea
+Filename: NanumMyeongjo.ttc(1)
+
+Name: NanumMyeongjoExtraBold
+Type: TTF
+Class: Korea
+Filename: NanumMyeongjo.ttc(2)
+
+Name: NanumGothic
+Type: TTF
+Class: Korea
+Provides(30): HYGoThic-Medium
+Provides(60): HYRGoThic-Medium
+Filename: NanumGothic.ttc(0)
+
+Name: NanumGothicBold
+Type: TTF
+Class: Korea
+Filename: NanumGothic.ttc(1)
+
+Name: NanumGothicExtraBold
+Type: TTF
+Class: Korea
+Filename: NanumGothic.ttc(2)
+
+Name: NanumBrush
+Type: TTF
+Class: Korea
+Filename: NanumScript.ttc(0)
+
+Name: NanumPen
+Type: TTF
+Class: Korea
+Filename: NanumScript.ttc(1)
+
+Name: AppleSDGothicNeo-Thin
+Type: CID
+Class: Korea
+Filename: AppleSDGothicNeo-Thin.otf
+
+Name: AppleSDGothicNeo-UltraLight
+Type: CID
+Class: Korea
+Filename: AppleSDGothicNeo-UltraLight.otf
+
+Name: AppleSDGothicNeo-Light
+Type: CID
+Class: Korea
+Filename: AppleSDGothicNeo-Light.otf
+
+Name: AppleSDGothicNeo-Regular
+Type: CID
+Class: Korea
+Filename: AppleSDGothicNeo-Regular.otf
+
+Name: AppleSDGothicNeo-Medium
+Type: CID
+Class: Korea
+Filename: AppleSDGothicNeo-Medium.otf
+
+Name: AppleSDGothicNeo-SemiBold
+Type: CID
+Class: Korea
+Filename: AppleSDGothicNeo-SemiBold.otf
+
+Name: AppleSDGothicNeo-Bold
+Type: CID
+Class: Korea
+Filename: AppleSDGothicNeo-Bold.otf
+
+Name: AppleSDGothicNeo-ExtraBold
+Type: CID
+Class: Korea
+Filename: AppleSDGothicNeo-ExtraBold.otf
+
+Name: AppleSDGothicNeo-Heavy
+Type: CID
+Class: Korea
+Filename: AppleSDGothicNeo-Heavy.otf
+
+#
+# Microsoft Mac Office fonts
+#
+
+# Korea
+
+Name: Gulim
+Type: TTF
+Class: Korea
+Provides(70): HYRGoThic-Medium
+Provides(70): HYGoThic-Medium
+Filename(30): Gulim.ttf
+Filename(50): gulim.ttc
+
+Name: Dotum
+Type: TTF
+Class: Korea
+Provides(40): HYGoThic-Medium
+Filename(50): Dotum.ttf
+
+Name: Batang
+Type: TTF
+Class: Korea
+Provides(40): HYSMyeongJo-Medium
+Filename(50): Batang.ttf
+
+# simplified chinese
+
+Name: SimHei
+Type: TTF
+Class: GB
+Provides(60): STHeiti-Regular
+Provides(60): STKaiti-Regular
+Provides(60): STHeiti-Light
+Filename(50): SimHei.ttf
+
+Name: SimSun
+Type: TTF
+Class: GB
+Provides(60): STSong-Light
+# Provides(60): STFangsong-Light
+Provides(60): STFangsong-Regular
+Filename(50): SimSun.ttf
+
+# traditional chinese
+
+Name: MingLiU
+Type: TTF
+Class: CNS
+Provides(60): MHei-Medium
+Provides(60): MKai-Medium
+# Provides(60): MSung-Medium
+Provides(60): MSung-Light
+Filename(50): MingLiU.ttf
+
+Name: PMingLiU
+Type: TTF
+Class: CNS
+Filename(50): PMingLiU.ttf
+
+# japanese
+
+Name: MS-Gothic
+Type: TTF
+Class: Japan
+Provides(95): GothicBBB-Medium
+Provides(95): GothicBBBPro-Medium
+Provides(95): MidashiGo-MB31
+Provides(95): MidashiGoPro-MB31
+Provides(95): FutoGoB101-Bold
+Provides(95): FutoGoB101Pro-Bold
+Provides(95): MidashiGo-MB31
+Provides(95): MidashiGoPro-MB31
+Provides(95): Jun101-Light
+Provides(95): Jun101Pro-Light
+Filename(50): MS Gothic.ttf
+Filename(30): MS-Gothic.ttf
+
+Name: MS-Mincho
+Type: TTF
+Class: Japan
+Provides(95): Ryumin-Light
+Provides(95): RyuminPro-Light
+Provides(95): FutoMinA101-Bold
+Provides(95): FutoMinA101Pro-Bold
+Filename(50): MS Mincho.ttf
+Filename(30): MS-Mincho.ttf
+
+Name: MS-PGothic
+Type: TTF
+Class: Japan
+Filename(50): MS PGothic.ttf
+Filename(30): MS-PGothic.ttf
+
+Name: MS-PMincho
+Type: TTF
+Class: Japan
+Filename(50): MS PMincho.ttf
+Filename(30): MS-PMincho.ttf
+
+Name: Meiryo
+Type: TTF
+Class: Japan
+Filename(50): Meiryo.ttf
+
+Name: Meiryo-Bold
+Type: TTF
+Class: Japan
+Filename(50): Meiryo Bold.ttf
+Filename(30): Meiryo-Bold.ttf
+
+Name: Meiryo-BoldItalic
+Type: TTF
+Class: Japan
+Filename(50): Meiryo Bold Italic.ttf
+Filename(30): Meiryo-BoldItalic.ttf
+
+Name: Meiryo-Italic
+Type: TTF
+Class: Japan
+Filename(50): Meiryo Italic.ttf
+Filename(30): Meiryo-Italic.ttf
+
+
+### Local Variables:
+### perl-indent-level: 2
+### tab-width: 2
+### indent-tabs-mode: nil
+### End:
+# vim: set tabstop=2 expandtab autoindent: