3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich#!/usr/bin/perl -w
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettichuse strict;
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettichuse File::Basename;
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich# ##### old intention below
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich# read file "words.input" from current directory and produce
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich# "\wordline{<word>}\hline" lines. plus patterns written in lines
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich# starting with "%" . THe pattern should contain a variable calles
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich# "$word. It functions as input.
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich# words.input contains words seperated
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich# by space, newline or tabular creates or overwrites a file called
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich# "generated-words.tex"
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich# the fonts file can be created by this bash line:
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich# for f in `ls /usr/share/texmf/tex/latex/psnfss/*.sty` ; do f=`basename $f| sed 's/\.sty//'`;echo '\usepackage{'$f'} ::: '$f ; done > fonts.input
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich########
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich# conf #
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich########
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich
3826795df114d8a584132374d84f2ce08d3a3f5fKlaus Luettichmy $PDFLATEX_BIN = 'pdflatex';
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettichmy $PDFTOTEXT_BIN = 'pdftotext';
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettichmy $DO_PDFLATEX = 1; # 1 = do it
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettichmy $DO_PDFTOTEXT = 1; # 0 = don't do it
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich#$ENV{'TEXINPUTS'} =$ENV{'TEXINPUTS'}."::".dirname($0);
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maedermy $haskell_header =
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich'{- |
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus LuettichModule : $Header$
ff8ef439e24b731d473160e9ac94c18630063f63Christian MaederDescription : several tables needed for LaTeX formatting
ff8ef439e24b731d473160e9ac94c18630063f63Christian MaederCopyright : (c) Klaus Luettich, Uni Bremen 2002-2004
ff8ef439e24b731d473160e9ac94c18630063f63Christian MaederLicense : GPLv2 or higher, see LICENSE.txt
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich
34bff097c14521b5e57ce37279a34256e1f78aa5Klaus LuettichMaintainer : Christian.Maeder@dfki.de
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus LuettichStability : provisional
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus LuettichPortability : portable
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich-}
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder{-
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder Created by a Perl-script (utils/words.pl)!
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich DO NOT MODIFY BY HAND!!
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich-}
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettichmodule Common.LaTeX_maps where
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maederimport Data.Map (fromList, Map)
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich';
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich########
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich# main #
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich########
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maedermy %used_words = &process_the_words; # the words, LaTeX makros,
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder # syllables (ligatures), letters widely
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder # used in (Het)CASL
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich# Split into sections that give the names of the Haskell maps.
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettichmy @fonts = &read_fonts; # adds an "empty font" for LaTeX-default
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettichmy %widths = (); # a table of width from various fonts
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettichforeach my $font (@fonts) {
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich $widths{$font->[1]} = &process_one_font($font);
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich # debugging
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder 0 && do {
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich foreach my $sec (keys %{$widths{$font->[1]}}) {
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder print "$sec :", join(",", @{${$widths{$font->[1]}}{$sec}}),"\n";
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich }
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich };
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich}
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettichmy %word_widths = &calc_max_width(\%widths,\%used_words);
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder # a table of sections to table of
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich # words per section to max width over all fonts
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich# debugging
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder1 && do {
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich foreach my $sec (keys %word_widths) {
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder print "$sec :\n",
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder join(", ", (map {"$_: ".$word_widths{$sec}{$_}; }
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder (sort (keys %{$word_widths{$sec}})))),
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder "\n";
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich }
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich };
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder&generate_haskell_FM(\%word_widths); # uses %word_widths
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich########
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich# subs #
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich########
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettichsub generate_haskell_FM {
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich my $word_widths = $_[0];
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich open HASKELL, "> LaTeX_maps.hs" or
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder die "cannot create Haskell module \"LaTeX_maps.hs\"";
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich print HASKELL $haskell_header;
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich my @two_letter_words = ();
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich foreach my $sec (keys %{$word_widths}) {
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder # generate a list of pairs for each section named after the section
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder print HASKELL &fm_header($sec);
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder my @words = sort (keys %{$word_widths->{$sec}});
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder push @two_letter_words, (grep {length($_) == 2;} @words);
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder print HASKELL " [",
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder join(",", (map {"(\"".&escape_String($_)."\",".
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder int($word_widths->{$sec}{$_} * 0.351 * 1000).
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder ')';
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder }
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder (@words))),
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder "]\n";
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder print HASKELL &key_fm_header($sec);
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder my @long_words = sort (grep {length($_) > 2;} @words);
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder my $last_word = '';
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder my @first_letters =
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder grep {my $ret = $_ ne $last_word;$last_word = $_;$ret; }
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder (sort (map {m/^(.)/o;$1} @long_words));
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder print HASKELL " [",
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder join(",",map {my $c = &escape_String($_);
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder "('".$c."',[".
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder join(",",map {"\"".
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder &escape_String($_).
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder "\""}
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder (grep {m/^$c/}
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder @long_words)).
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder "])"} @first_letters), "]\n";
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich }
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich my $last_word = '';
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich print HASKELL "\nligatures :: Map String Bool\n",
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich "ligatures = fromList [",
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder join(",", map { "(\"".&escape_String($_)."\",True)";}
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder grep {my $ret = $_ ne $last_word;$last_word = $_;$ret; }
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder (sort @two_letter_words)),
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich "]\n";
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich}
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettichsub escape_String {
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich return join("", map {
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder if (m/^\\$/o) {
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder "\\$_";
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder } elsif(m/^"$/o) { # "
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder "\\$_";
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder } else {
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder # substitute ������� with \196\214\220\223\228\246\252
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder $_ =~ s/�/\\196/o; $_ =~ s/�/\\214/o; $_ =~ s/�/\\220/o;
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder $_ =~ s/�/\\223/o;
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder $_ =~ s/�/\\228/o; $_ =~ s/�/\\246/o; $_ =~ s/�/\\252/o;
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder $_;
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder }
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich } split(//o,$_[0]));
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich}
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettichsub fm_header {
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich my $map_name = $_[0]."_map";
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich return "\n$map_name :: Map String Int\n$map_name = fromList";
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich}
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettichsub key_fm_header {
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich my $map_name = "key_".$_[0]."_map";
ff8ef439e24b731d473160e9ac94c18630063f63Christian Maeder return "\n$map_name :: Map Char [String]\n$map_name = fromList";
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich}
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettichsub calc_max_width {
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich my $font_widths = $_[0];
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich my $words = $_[1];
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich my @fonts = keys %{$font_widths};
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich my %max_widths = ();
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich foreach my $sec (keys %{$words}) {
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder my %word_max_width = ();
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder my $width_word_index = 0;
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder print "$sec: ";
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder foreach my $word (@{$words->{$sec}}) {
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder my $max = 0;
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder #print "$word: ";
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder foreach my $font (@fonts) {
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder my $cur = $font_widths->{$font}->{$sec}->[$width_word_index];
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder $cur = 0 unless defined $cur;
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder $max = &max($max,$cur);
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder print "$font: ".int($cur * 0.351 * 1000)." " if $word eq "~";
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder }
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder print "\n" if $word eq "~";
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder print STDERR
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder "\nWarning: max length of $word is undefined or zero\n"
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder if ! defined $max || $max == 0;
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder $word_max_width{$word} = $max;
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder $width_word_index++;
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder #exit if $width_word_index >= 5;
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder }
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder $max_widths{$sec} = \%word_max_width;
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder #exit;
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich }
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich return %max_widths;
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich}
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettichsub max {
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich return (($_[0] >= $_[1]) ? $_[0] : $_[1]);
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich}
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettichsub process_one_font {
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich # debugging: print "font: ".join(", ", @{$_[0]})."\n";
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich my ($font_cmnd,$font_name) = @{$_[0]};
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich # generate two documents one human readable and one for the machine
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder my $computer_tex_filename =
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder # &gen_tex('width-table.tex.svmono.templ',
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder &gen_tex('width-table.tex.templ',
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder $font_name,'computer',$font_cmnd);
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder my $human_tex_filename =
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder # &gen_tex('width-table.tex.svmono.templ',
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder &gen_tex('width-table.tex.templ',
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder $font_name,'human',$font_cmnd);
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich if ($DO_PDFLATEX) {
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder &pdflatex($computer_tex_filename);
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder &pdflatex($human_tex_filename);
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich }
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder my $computer_pdf_filename =
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder basename($computer_tex_filename,'.tex').'.pdf';
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich return &get_widths($computer_pdf_filename); # seperated in sections
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich}
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettichsub pdflatex {
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich my $tex_filename = $_[0];
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich system($PDFLATEX_BIN,$tex_filename);
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich}
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettichsub get_widths {
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich my $pdf_filename = $_[0];
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich my $txt_filename = basename($pdf_filename,'.pdf').'.txt';
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich my %widths = ();
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich if ($DO_PDFTOTEXT) {
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder system($PDFTOTEXT_BIN,"-raw",$pdf_filename);
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich }
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich #open WIDTH, "pdftotext $pdf_filename | egrep 'section: |wl: ' |"
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder# or die "cannot call pdftotext or egrep or cannot fork";
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder open WIDTH, "< $txt_filename"
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder or die "cannot read file \"$txt_filename\"";
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich my $section = '';
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich my @widths = ();
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich while (<WIDTH>) {
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder m/section: (\w+)\+\+\+/o && do {
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder unless ($section eq '') {
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder $widths{$section} = [@widths];
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder @widths = ();
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder }
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder $section = $1;
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder };
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder m/wl: (\d+\.\d+)pt/o && $section ne '' && do {
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder push @widths, $1;
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder };
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich }
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich close WIDTH;
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich $widths{$section} = [@widths];
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich # debugging
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder 0 && do {
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder foreach my $sec (keys %widths) {
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder print "$sec :", join(",", @{$widths{$sec}}),"\n";
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder }
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich };
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich return \%widths;
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich}
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettichsub gen_tex {
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich my ($input_filename,$font_name,$purpose,$font_cmnd) = @_;
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder my $output_filename =
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder basename($input_filename,'.tex.templ').".$font_name.".
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder substr($purpose,0,1).".tex";
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich my $no_cols = '';
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich open TEMPL, "< $input_filename";
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich open OUT, "> $output_filename";
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich $purpose eq 'human' && do {$no_cols = '';};
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich $purpose eq 'computer' && do {$no_cols = '% ';};
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich while (<TEMPL>) {
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder s/<set-font>/$font_cmnd/;
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder s/<no-columns>/$no_cols/;
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder print OUT $_;
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich }
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich close TEMPL;
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich close OUT;
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich return $output_filename;
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich}
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettichsub read_fonts {
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder open FONTS, "< fonts.input"
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder or die "cannot open file \"fonts.input\" for reading";
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich my @read_fonts = ();
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich while (<FONTS>) {
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder chomp;
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder my @fnt_descrp = split /\s+:::\s+/;
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder push @read_fonts, \@fnt_descrp;
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich }
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich close FONTS;
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich unshift @read_fonts, [('','default')];
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich return @read_fonts;
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich}
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettichmy $count_words = 0;
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettichsub process_the_words {
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich my $pat = '%s';
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich my $line = '';
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich my @sec_words = ();
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich my %all_words = ();
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich my $section = '';
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich open WORDS, "< words.input" or die("no file named \"words.input\" found");
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder open GENWORDS, "> generated_words.tex"
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder or die "cannot write to file \"generated_words.tex\"!";
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich while ($line = <WORDS>) {
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder &sep_tabular,next if $line=~ m/^\s*$/o;
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder if ($line =~ m/^%/o) {
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder chomp $line;
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder if ($line =~ m/^\%pattern:\s*/o) {
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder $line =~ s///o;
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder $pat = $line;
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder } elsif ($line =~ m/^%section:\s*/o) {
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder #print STDERR "$section : ",join(", ",@sec_words),"\n";
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder unless ($section eq '') {
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder $all_words{$section} = [@sec_words];
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder #print STDERR "pushed: $section : ",join(", ",@sec_words),"\n";
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder }
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder @sec_words = ();
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder $line =~ s///o;
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder $section = $line;
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder &sep_tabular("\\newpage\n\\section*{section: $section+++}\n");
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder } else {
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder print STDERR "unknown directive: $line\n";
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder }
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder } elsif ($line =~ m/^&/o) {
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder $line =~ s///o;
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder print GENWORDS $line;
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder } elsif ($line =~ m/^~(.*)$/o) {
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder &sep_tabular($1);
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder } else {
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder my @words = split(/\s+/o, $line);
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder push @sec_words, @words;
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder foreach my $word (@words) {
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder my $fpat= sprintf($pat,$word);
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder print GENWORDS "\\wordline{$fpat}\n\\hline\n";
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder if(++$count_words >= 37) {
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder &sep_tabular;
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder }
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder }
a9a5ac69d1d35b1a8f4288f7de005b16589cc0c5Christian Maeder }
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich }
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich close WORDS;
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich close GENWORDS;
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich $all_words{$section} = [@sec_words];
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich return %all_words;
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich}
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettichsub sep_tabular {
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich my $fill_in = defined $_[0] ? $_[0] : '';
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich $count_words = 0;
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich print GENWORDS "\\end{tabular}\n$fill_in\n\\begin{tabular}{l|l}\n\\hline\n";
3ae73283b9596a1567f0f5c5bee932fb0f4611c0Klaus Luettich}