summaryrefslogtreecommitdiff
path: root/fonts/gentium-tug/source/gentium.rb
diff options
context:
space:
mode:
Diffstat (limited to 'fonts/gentium-tug/source/gentium.rb')
-rw-r--r--fonts/gentium-tug/source/gentium.rb384
1 files changed, 384 insertions, 0 deletions
diff --git a/fonts/gentium-tug/source/gentium.rb b/fonts/gentium-tug/source/gentium.rb
new file mode 100644
index 0000000000..9f68654fd9
--- /dev/null
+++ b/fonts/gentium-tug/source/gentium.rb
@@ -0,0 +1,384 @@
+# This file is part of the Gentium package for TeX.
+# It is licensed under the Expat License, see doc//README for details.
+
+require 'fileutils'
+
+$TDS_ROOT = File.expand_path('../../../')
+$package_name = "gentium-tug"
+
+$path_source = File.join($TDS_ROOT, "source", "fonts", $package_name)
+$path_ttf = File.join($TDS_ROOT, "fonts", "truetype", "public", $package_name)
+$path_type1 = File.join($TDS_ROOT, "fonts", "type1", "public", $package_name)
+$path_tfm = File.join($TDS_ROOT, "fonts", "tfm", "public", $package_name)
+$path_afm = File.join($TDS_ROOT, "fonts", "afm", "public", $package_name)
+$path_map_ttf = File.join($TDS_ROOT, "fonts", "map", "pdftex", $package_name)
+$path_map = File.join($TDS_ROOT, "fonts", "map", "dvips", $package_name)
+$path_enc = File.join($TDS_ROOT, "fonts", "enc", "dvips", $package_name)
+$path_fd = File.join($TDS_ROOT, "tex", "latex", $package_name)
+$path_tmp = File.join($TDS_ROOT, "tmp")
+
+class Font
+ def initialize(filename, name_something, filename_tex)
+ @filename = filename
+ @filename_tex = filename_tex
+ @name_something = name_something # TODO
+ if filename =~ /Plus/ then
+ @is_plus = true
+ else
+ @is_plus = false
+ end
+ end
+ def is_plus?
+ return @is_plus
+ end
+
+ def filename_ttf
+ return "#{@filename}.ttf"
+ end
+ def filename_type1
+ return "#{@filename}.pfb"
+ end
+ def filename_afm
+ return "#{@filename}.afm"
+ end
+ def filename_pl
+ return "#{@filename}.pl"
+ end
+
+ def generate_type1_with_ttf2pt1
+ puts "#"
+ puts "# generating type1 version of #{@filename}"
+ puts "#"
+ pwd = Dir.pwd()
+ Dir.chdir($path_ttf)
+ command = "ttf2pt1 -a -b #{filename_ttf}"
+ puts "> #{command}"
+ if system(command) then
+ if File.exists?(filename_type1) then
+ File.rename(filename_type1, File.join($path_type1, filename_type1))
+ else
+ stderr.puts "ERROR: '#{filename_type1}' doesn't exist"
+ end
+ if File.exists?(filename_afm) then
+ File.rename(filename_afm, File.join($path_afm, filename_afm))
+ else
+ stderr.puts "ERROR: '#{filename_afm}' doesn't exist"
+ end
+ end
+ Dir.chdir(pwd)
+ end
+
+ def generate_type1
+ generate_type1_with_ttf2pt1
+ end
+
+ def generate_tfms(encoding)
+ # normal
+ if is_plus? or encoding.has_bold? then
+ generate_tfm(encoding, false)
+ end
+ # small caps
+ if is_plus? and encoding.has_smallcaps? then
+ generate_tfm(encoding, true)
+ end
+ end
+
+ def generate_tfm(encoding, smallcaps)
+ pwd = Dir.pwd
+ Dir.chdir($path_afm)
+ smcp = ""
+ if smallcaps then
+ smcp = "-sc"
+ end
+ puts "#"
+ puts "# Generating TFM file for font \"#{filename}\" in encoding \"#{encoding.name}#{smcp}\""
+ puts "#"
+ filename_enc = "gentium-#{encoding.name}#{smcp}.enc"
+ filename_map = "#{filename}.map"
+ filename_pl_new = "#{encoding.name}-#{filename_tex}#{smcp}.pl"
+ filename_tfm = "#{encoding.name}-#{filename_tex}#{smcp}.tfm"
+ filename_lig = File.join(pwd, "lig", "gentium-#{encoding.name}#{smcp}.lig")
+
+ # temporarily copy encoding file to current directory (absolute paths don't seem to work)
+ FileUtils.cp(File.join($path_enc, filename_enc), filename_enc)
+ # File.copy(File.join($path_enc, filename_enc), filename_enc)
+ if File.exists?(filename_lig) then
+ command = "afm2pl -p #{filename_enc} -l #{filename_lig} #{filename_afm}"
+ else
+ command = "afm2pl -p #{filename_enc} #{filename_afm}"
+ end
+ puts "> #{command}"
+ system(command)
+ # output = `#{command}`
+ # if $?.success? then
+ if File.exists?(filename_pl) then
+ File.rename(filename_pl, filename_pl_new)
+ command2 = "pltotf #{filename_pl_new}"
+ puts "> #{command2}"
+ if system(command2) then
+ if File.exists?(filename_tfm) then
+ File.rename(filename_tfm, File.join($path_tfm, filename_tfm))
+ else
+ $stderr.puts "ERROR: '#{filename_tfm}' doesn't exist"
+ end
+ else
+ $stderr.puts "ERROR: unable to run #{command2}"
+ end
+ else
+ $stderr.puts "ERROR: '#{filename_pl}' doesn't exist"
+ end
+ # else
+ # $stderr.puts "ERROR: unable to run '#{command}'"
+ # puts output
+ # end
+ File.delete(filename_pl_new)
+ File.delete(filename_enc)
+ # afm2pl creates filename.map that has to be removed
+ File.delete(filename_map)
+
+ Dir.chdir(pwd)
+ # puts " I'm now at #{Dir.pwd}"
+ end
+
+ def glyph_names
+ if @glyph_names_hash == nil then
+ @glyph_names_hash = Hash.new
+ File.open(File.join($path_afm, filename_afm)).each_line.grep(/^C .*?; N ([^\s]*)/) do |line|
+ name = $1
+ @glyph_names_hash[name] = true
+ # puts line
+ end
+ end
+
+ return @glyph_names_hash
+ end
+
+ attr_reader :filename, :filename_tex, :name_something
+end
+
+class FontSet
+ def initialize(font_rm, font_it, font_bf, font_bi)
+ @rm = font_rm
+ @it = font_it
+ @bf = font_bf
+ @bi = font_bi
+ @list = [font_rm, font_it, font_bf, font_bi]
+ end
+ def each
+ @list.each { |f| if f then yield f end }
+ end
+end
+
+class Encoding
+ def initialize(name, supported_by_basic_family)
+ @name = name
+ @supported_by_basic_family = supported_by_basic_family
+ end
+ def to_s
+ @name
+ end
+ def name_context
+ return @name
+ end
+ def name_latex
+ if @name == "ec" then
+ return "t1"
+ elsif @name == "texnansi" then
+ return "ly1"
+ else
+ return @name
+ end
+ end
+ def name_latex_uppercase
+ if @name == "l7x" then
+ return "L7x"
+ else
+ return name_latex.upcase
+ end
+ end
+ def name_truetype
+ if ["ec", "t5"].include?(@name) then
+ return "#{@name}-ttf"
+ else
+ return @name
+ end
+ end
+ def name_truetype_sc
+ if @name == "ec" then
+ return "#{@name}-ttf-sc"
+ else
+ return "#{@name}-sc"
+ end
+ end
+
+ def is_used_in_context?
+ if ["ot1", "ts1", "lgr", "t2b", "t2c", "x2"].include?(@name) then
+ return false
+ else
+ return true
+ end
+ end
+ def is_used_in_latex?
+ if ["agr"].include?(@name) then
+ return false
+ else
+ return true
+ end
+ end
+ def has_bold?
+ return @supported_by_basic_family
+ end
+ def has_smallcaps?
+ if ["ts1", "agr", "lgr"].include?(@name) then
+ return false
+ else
+ return true
+ end
+ end
+
+ def generate_enc_sc(font)
+ file_enc_new = File.open(File.join($path_enc, "gentium-#{@name}-sc.enc"), 'w')
+ File.open(File.join($path_enc, "gentium-#{@name}.enc")).each_line do |line|
+ if line =~ /Encoding/ then
+ file_enc_new.puts line.gsub(/Encoding/, "scEncoding")
+ elsif line =~ /^\/([^\s%]*)/ then
+ name = $1
+ name_sc = "#{name}.sc"
+ if not font.glyph_names[name] then
+ puts "Warning: glyph '#{name}' in in encoding '#{@name}' doesn't exist."
+ end
+ if name == "uni0237" then
+ name_sc = "j.sc"
+ end
+ if font.glyph_names[name_sc] then
+ file_enc_new.puts "/#{name_sc}"
+ elsif ["ff", "fi", "ffi", "fl", "ffl"].include?(name) then
+ file_enc_new.puts "/.notdef"
+ else
+ file_enc_new.puts "/#{name}"
+ end
+ else
+ file_enc_new.puts line
+ end
+ end
+ file_enc_new.close
+ end
+
+ def declare_font_shape(width, shape, name)
+ text = "\\DeclareFontShape{#{name_latex_uppercase}}{gentium}{#{width}}{#{shape}}{\n" +
+ " <-> \\gentium@@scale #{@name}-gentium#{name}\n" +
+ "}{}\n\n"
+ return text
+ end
+ def declare_font_shape_sub(width1, shape1, width2, shape2)
+ return "\\DeclareFontShape{#{name_latex_uppercase}}{gentium}{#{width1}}{#{shape1}}{<->ssub * gentium/#{width2}/#{shape2}}{}"
+ end
+ def generate_fd
+ date = "2012/02/06"
+ date = "2011/01/13"
+
+ filename = "#{name_latex}gentium.fd"
+ File.open(File.join($path_fd,filename), 'w') do |file|
+ file.puts "\\ProvidesFile{#{name_latex}gentium.fd}"
+ file.puts " [#{date} Font definitions for gentium.]"
+ file.puts
+ file.puts '\expandafter\ifx\csname gentium@scale\endcsname\relax'
+ file.puts ' \let\gentium@@scale\@empty'
+ file.puts '\else'
+ file.puts ' \edef\gentium@@scale{s*[\csname gentium@scale\endcsname]}%'
+ file.puts '\fi'
+ file.puts
+ file.puts "\\DeclareFontFamily{#{name_latex_uppercase}}{gentium}{}"
+ file.puts
+ file.puts declare_font_shape("m", "n", "plus-regular")
+ file.puts declare_font_shape("m", "it", "plus-italic")
+ if has_bold? then
+ file.puts declare_font_shape("b", "n", "basic-bold")
+ file.puts declare_font_shape("b", "it", "basic-bolditalic")
+ # TODO: set the correct tfm names in the following two lines
+ if has_smallcaps? then
+ file.puts declare_font_shape("m", "sc", "plus-regular-sc")
+ file.puts declare_font_shape("m", "scit", "plus-italic-sc")
+ end
+ # TODO: a clever algorithm to do replacements instead
+ file.puts declare_font_shape_sub("m", "sl", "m", "it")
+ file.puts declare_font_shape_sub("b", "sl", "b", "it")
+ file.puts declare_font_shape_sub("bx", "sl", "b", "it")
+ file.puts declare_font_shape_sub("bx", "it", "b", "it")
+ file.puts declare_font_shape_sub("bx", "n", "b", "n")
+ else
+ file.puts declare_font_shape_sub("m", "sl", "m", "it")
+ end
+ file.puts
+ file.puts '\endinput'
+ end
+ end
+
+ attr_reader :name
+end
+
+class EncodingSet < Hash
+
+ def generate_maps(fontlist)
+ # initialize lines for map files, one array for each encoding
+ map_lines_type1 = Hash.new
+ map_lines_ttf = Hash.new
+ self.each_value do |encoding|
+ map_lines_type1[encoding.name] = Array.new
+ map_lines_ttf[encoding.name] = Array.new
+ end
+
+ # fill data
+ fontlist.each do |font|
+ self.each_value do |encoding|
+ # TODO: fix the last name (gentium) & encodings: this is another parameter that we have to introduce
+ name_tfm = "#{encoding.name}-#{font.filename_tex}".ljust(33)
+ line_reenc = "\"gentium-#{encoding.name}Encoding ReEncodeFont\"".ljust(42)
+ name_enc = "gentium-#{encoding.name}.enc"
+ name_enc_ttf = "gentium-#{encoding.name_truetype}.enc"
+
+ # normal
+ if font.is_plus? or encoding.has_bold? then
+ map_lines_type1[encoding.name].push("#{name_tfm} #{font.name_something.ljust(24)} #{line_reenc} <#{name_enc.ljust(24)} <#{font.filename_type1}")
+ map_lines_ttf[encoding.name].push("#{name_tfm} #{font.name_something.ljust(24)} <#{font.filename_ttf.ljust(18)} #{name_enc_ttf}")
+ end
+ # small caps
+ if font.is_plus? and encoding.has_smallcaps? then
+ name_tfm = "#{encoding.name}-#{font.filename_tex}-sc".ljust(33)
+ line_reenc = "\"gentium-#{encoding.name}scEncoding ReEncodeFont\"".ljust(42)
+ name_enc = "gentium-#{encoding.name}-sc.enc"
+ name_enc_ttf = "gentium-#{encoding.name_truetype_sc}.enc"
+
+ map_lines_type1[encoding.name].push("#{name_tfm} #{font.name_something.ljust(24)} #{line_reenc} <#{name_enc.ljust(24)} <#{font.filename_type1}")
+ map_lines_ttf[encoding.name].push("#{name_tfm} #{font.name_something.ljust(24)} <#{font.filename_ttf.ljust(18)} #{name_enc_ttf}")
+ end
+ end
+ end
+
+ # write map files into files
+ map_file_type1 = File.open(File.join($path_map, "gentium-type1.map" ), 'w')
+ map_file_ttf = File.open(File.join($path_map_ttf, "gentium-truetype.map"), 'w')
+ self.sort.map do |k,encoding|
+ # map file for Type1
+ map_lines_type1[encoding.name].each do |line|
+ map_file_type1.puts line
+ end
+ # map file fon TrueType
+ map_lines_ttf[encoding.name].each do |line|
+ map_file_ttf.puts line
+ end
+ # map file for TrueType for a single encoding (for ConTeXt)
+ # if encoding.is_used_in_context? then
+ if true then
+ File.open(File.join($path_map_ttf, "gentium-#{encoding.name}.map"), 'w') do |map_file_enc|
+ map_lines_ttf[encoding.name].each do |line|
+ map_file_enc.puts line
+ end
+ end
+ end
+ end
+ map_file_type1.close
+ map_file_ttf.close
+ end
+end
+