353 lines
8.3 KiB
Perl
353 lines
8.3 KiB
Perl
#!/usr/bin/perl -w
|
|
#
|
|
# Copyright (c) 2002 SuSE Linux AG, Nuernberg, Germany. All rights reserved.
|
|
#
|
|
# Author: Mike Fabian <mfabian@suse.de>, 2002
|
|
#
|
|
|
|
use English;
|
|
use Getopt::Long;
|
|
|
|
# check if we are started as root
|
|
# only one of UID and USER must be set correctly
|
|
|
|
if ($UID != 0 && $ENV{USER} !~ /root/) {
|
|
print "You must be root to start $0\n";
|
|
exit 1;
|
|
}
|
|
|
|
if (system ("rpm -q freetype-tools >/dev/null 2>&1") != 0) {
|
|
print "freetype-tools package missing, exiting.\n";
|
|
exit 1;
|
|
}
|
|
|
|
|
|
sub usage {
|
|
print "Usage: cjk-latex-config [--verbose|v] [--force|f] [--type1|t]\n";
|
|
exit 1;
|
|
}
|
|
|
|
# Process command line options
|
|
my %opt;
|
|
unless (GetOptions(\%opt,
|
|
'verbose|v', \$OPT_VERBOSE,
|
|
'force|f', \$OPT_FORCE,
|
|
'type1|t', \$OPT_TYPE1,
|
|
)) {
|
|
&usage();
|
|
exit 1;
|
|
}
|
|
|
|
# to make sure ttf2tfm finds the .sdf files:
|
|
system("texhash");
|
|
|
|
$tfm_created = 0;
|
|
$type1_created = 0;
|
|
|
|
system("mkdir -p /usr/share/texmf/fonts/truetype/");
|
|
|
|
open (TTFONTS_MAP, "/etc/ttf2pk/ttfonts.map");
|
|
|
|
while (<TTFONTS_MAP>) {
|
|
|
|
chomp($ARG);
|
|
|
|
if ($ARG =~ /\@[a-zA-Z0-9\/]+\@/) {
|
|
|
|
if($OPT_VERBOSE) {
|
|
print "----------------------------------------------------------------------\n";
|
|
print "$ARG\n";
|
|
}
|
|
|
|
@fields = split(/\s+/, $ARG);
|
|
|
|
$tt_dir = "/usr/X11R6/lib/X11/fonts/truetype/";
|
|
$tt_basename = $fields[1];
|
|
|
|
if ($fields[0] =~ /([^\s]+)\@[a-zA-Z0-9\/]+\@/) {
|
|
$latex_font_name = $1;
|
|
} else {
|
|
print "can't find latex font name.\n";
|
|
exit 1
|
|
}
|
|
|
|
if ($fields[0] =~ /\@([a-zA-Z0-9\/]+)\@/) {
|
|
$sfd_name = $1;
|
|
$sfd_name =~ /.*\/([a-zA-Z0-9]+)/;
|
|
$sfd_basename = $1;
|
|
} else {
|
|
print "can't find sfd_name.\n";
|
|
exit 1
|
|
}
|
|
|
|
if ($ARG =~ /Pid=([0-9]+)/) {
|
|
$pid = "$1";
|
|
} else {
|
|
$pid = "3";
|
|
}
|
|
|
|
if ($ARG =~ /Eid=([0-9]+)/) {
|
|
$eid = "$1";
|
|
} else {
|
|
$eid = "1";
|
|
}
|
|
|
|
if ($ARG =~ /Slant=([0-9.]+)/) {
|
|
$slant = $1;
|
|
$slant_opt = "-s $1";
|
|
} else {
|
|
$slant = 0;
|
|
$slant_opt = "-s 0";
|
|
}
|
|
|
|
if ($ARG =~ /Rotate=(Yes)/) {
|
|
$rotate = 1;
|
|
$rotate_opt = "-x";
|
|
} else {
|
|
$rotate = 0;
|
|
$rotate_opt = "";
|
|
}
|
|
|
|
if (-e "$tt_dir/$tt_basename") {
|
|
symlink("$tt_dir/$tt_basename",
|
|
"/usr/share/texmf/fonts/truetype/$tt_basename");
|
|
$tfm_dir = "/usr/share/texmf/fonts/tfm/cjk-latex/";
|
|
$type1_dir = "/usr/share/texmf/fonts/type1/cjk-latex/";
|
|
|
|
if (0 != create_or_update_tfm ()) {
|
|
print "creating .tfm failed.\n";
|
|
}
|
|
if ($OPT_TYPE1 && $slant == 0 && $rotate == 0) {
|
|
if (0 != create_or_update_type1 ()) {
|
|
print "creating type1 font failed.\n";
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($type1_created) {
|
|
$command = "cjk-latex-t1mapgen $type1_dir";
|
|
if (0 != system ($command)) {
|
|
print "$command failed.\n";
|
|
exit 1;
|
|
}
|
|
}
|
|
|
|
if ($tfm_created || $type1_created) {
|
|
system("texhash");
|
|
}
|
|
|
|
|
|
exit 0;
|
|
|
|
|
|
######################################################################
|
|
|
|
sub create_or_update_tfm {
|
|
|
|
if ($OPT_FORCE ||
|
|
mtime_differs_or_missing ("$tt_dir/$tt_basename",
|
|
"$tfm_dir/$sfd_basename/$latex_font_name/")) {
|
|
|
|
if (0 != system ("mkdir -p $tfm_dir/$sfd_basename/$latex_font_name/")) {
|
|
print "mkdir -p $tfm_dir/$sfd_basename/$latex_font_name/ failed.\n";
|
|
exit 1;
|
|
}
|
|
if (! chdir ("$tfm_dir/$sfd_basename/$latex_font_name/")) {
|
|
print "can't chdir to $tfm_dir/$sfd_basename/$latex_font_name/\n";
|
|
exit 1;
|
|
}
|
|
|
|
$command = "ttf2tfm $tt_dir/$tt_basename ";
|
|
unless ($OPT_VERBOSE) {
|
|
$command .= " -q";
|
|
}
|
|
$command .= " -P $pid -E $eid $rotate_opt $slant_opt $latex_font_name\@$sfd_name\@";
|
|
if ($OPT_VERBOSE) {
|
|
print "$command\n";
|
|
} else {
|
|
$command .= " > /dev/null 2>&1";
|
|
print "$latex_font_name\@$sfd_name\@: calling ttf2tfm ...\n";
|
|
}
|
|
if (0 != system($command)) {
|
|
print "$command failed.\n";
|
|
return 1;
|
|
}
|
|
|
|
# success, mark this by giving the created directory the same time stamp
|
|
# as the TT-font:
|
|
system("touch -r $tt_dir/$tt_basename $tfm_dir/$sfd_basename/$latex_font_name/");
|
|
$tfm_created = 1;
|
|
return 0;
|
|
}
|
|
|
|
}
|
|
|
|
######################################################################
|
|
|
|
sub create_or_update_type1 {
|
|
|
|
if ($OPT_FORCE ||
|
|
mtime_differs_or_missing ("$tt_dir/$tt_basename",
|
|
"$type1_dir/$sfd_basename/$latex_font_name/")) {
|
|
|
|
if (0 != system ("mkdir -p $type1_dir/$sfd_basename/$latex_font_name/")) {
|
|
print "mkdir -p $type1_dir/$sfd_basename/$latex_font_name/ failed.\n";
|
|
exit 1;
|
|
}
|
|
if (! chdir ("$type1_dir/$sfd_basename/$latex_font_name/")) {
|
|
print "can't chdir to $type1_dir/$sfd_basename/$latex_font_name/\n";
|
|
exit 1;
|
|
}
|
|
|
|
if (grep(/$tt_basename/,("wadalab-gothic.ttf","watanabe-mincho.ttf"))) {
|
|
print "$tt_basename does not work with ttf2pt1, skipping ...\n";
|
|
return 0;
|
|
}
|
|
|
|
# disable smoothing of outlines for broken fonts
|
|
# (for details see 'man ttf2pt1'):
|
|
my $smoothing_opt = " ";
|
|
if (grep(/$tt_basename/,("kochi-gothic.ttf"))) {
|
|
print "$tt_basename broken, disabling smoothing of outlines.\n";
|
|
$smoothing_opt = " -O s ";
|
|
}
|
|
|
|
$sfd_file = "/usr/share/texmf/ttf2tfm/$sfd_basename.sfd";
|
|
$map_file = `mktemp /tmp/cjk-latex-config-map.XXXXXX`;
|
|
chomp $map_file;
|
|
if ($map_file eq "") {
|
|
print "mktemp /tmp/cjk-latex-config-map.XXXXXX failed.\n";
|
|
}
|
|
|
|
@planes = sfd2map($sfd_file,$map_file);
|
|
if ($#planes == -1) {
|
|
print "sfd2map($sfd_file,$map_file) failed.\n";
|
|
return 1;
|
|
}
|
|
|
|
for my $plane (@planes) {
|
|
if ($OPT_VERBOSE) {
|
|
$command = "ttf2pt1 -W 99 ";
|
|
} else {
|
|
$command = "ttf2pt1 -W 0 ";
|
|
}
|
|
$command .= $smoothing_opt;
|
|
$command .= " -p ft -b -G a -m h=5000 ";
|
|
$command .= " -L $map_file+pid=$pid,eid=$eid,$plane ";
|
|
$command .= " $tt_dir/$tt_basename $latex_font_name$plane";
|
|
if ($OPT_VERBOSE) {
|
|
print "$command\n";
|
|
} else {
|
|
$command .= " > /dev/null 2>&1";
|
|
print "$latex_font_name\@$sfd_name\@, plane=$plane: calling ttf2pt1 ...\n";
|
|
}
|
|
if (0 != system($command)) {
|
|
print "$command failed.\n";
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
unlink $map_file;
|
|
|
|
# success, mark this by giving the created directory the same time stamp
|
|
# as the TT-font:
|
|
system("touch -r $tt_dir/$tt_basename $type1_dir/$sfd_basename/$latex_font_name/");
|
|
$type1_created = 1;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
######################################################################
|
|
|
|
sub sfd2map {
|
|
my($sfd_file,$map_file) = @_;
|
|
if (! open (SFD, "<$sfd_file")) {
|
|
print "cannot open $sfd_file\n";
|
|
return ();
|
|
}
|
|
if (! open (MAP, ">$map_file")) {
|
|
print "cannot open $map_file\n";
|
|
close (SFD);
|
|
return ();
|
|
}
|
|
|
|
my(@planes) = ();
|
|
|
|
while (<SFD>) {
|
|
|
|
if ( ! ($ARG =~ /^[[:space:]]*\#/)) { # skip comment lines
|
|
|
|
# handle plane numbers:
|
|
if ( $ARG =~ /^([[:xdigit:]]{2})[[:space:]]*/ ) {
|
|
$ARG =~ s/^([[:xdigit:]]{2})[[:space:]]*/ /;
|
|
print MAP "plane $1\n";
|
|
print MAP "at 0x00\n";
|
|
$planes[$#planes + 1] = $1;
|
|
}
|
|
|
|
# remove continuation chars '\':
|
|
$ARG =~ s/\\$//;
|
|
|
|
$ARG =~ s/(0x[[:xdigit:]]{1,4})/$1,/g;
|
|
# handle ranges like 0xF800_0xF8FF
|
|
$ARG =~ s/(0x[[:xdigit:]]{1,4}),_/$1-/g;
|
|
}
|
|
|
|
print MAP $ARG;
|
|
|
|
}
|
|
|
|
close (MAP);
|
|
close (SFD);
|
|
return @planes;
|
|
}
|
|
|
|
|
|
# Returns true if the modification time of $f1 differs from
|
|
# the modification time of $f2
|
|
sub mtime_differs {
|
|
my($f1,$f2) = @_;
|
|
if( -e $f1 && -e $f2) {
|
|
local (@f1s) = stat ($f1);
|
|
local (@f2s) = stat ($f2);
|
|
return ($f1s[9] != $f2s[9]);
|
|
} else {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
# Returns true if the modification time of $f1 differs from
|
|
# the modification time of $f2 or if one of the files is missing
|
|
sub mtime_differs_or_missing {
|
|
my($f1,$f2) = @_;
|
|
if (! -e $f1 || ! -e $f2 || mtime_differs($f1,$f2)) {
|
|
return 1;
|
|
} else {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
# Returns true if $f1 is newer than $f2
|
|
sub newer {
|
|
my($f1,$f2) = @_;
|
|
if( -e $f1 && -e $f2) {
|
|
local (@f1s) = stat ($f1);
|
|
local (@f2s) = stat ($f2);
|
|
return ($f1s[9] > $f2s[9]);
|
|
} else {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
# Returns true if $f1 is newer than $f2 or if one of the files is missing
|
|
sub newer_or_missing {
|
|
my($f1,$f2) = @_;
|
|
if (! -e $f1 || ! -e $f2 || newer($f1,$f2)) {
|
|
return 1;
|
|
} else {
|
|
return 0;
|
|
}
|
|
}
|