summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog61
-rw-r--r--doc/groff.texinfo22
-rw-r--r--src/devices/gropdf/Makefile.sub5
-rw-r--r--src/devices/gropdf/gropdf.man114
-rw-r--r--src/devices/gropdf/gropdf.pl218
-rw-r--r--tmac/pdf.tmac45
6 files changed, 351 insertions, 114 deletions
diff --git a/ChangeLog b/ChangeLog
index cda40ba7..6f4f0a1a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,58 @@
+2012-05-20 Deri James <deri@chuzzlewit.demon.co.uk>
+
+ * doc/groff.texinfo: Add extra info about `.asciify'.
+ Document new gropdf options -u and -s.
+
+ * src/devices/gropdf/gropdf.man: Remove references to Type 42 fonts,
+ they do not work in PDFs.
+ Document new option -s which adds `statistics' line to end of PDF
+ file showing number of pages in document. This has always been the
+ default behaviour (to add this line), all other software seems to
+ ignore it as intended, but `gs' sometimes complains, so the default
+ is now to omit the statistics.
+ Document new option -u[cmapfilename] to allow a user ToUnicode CMap
+ instead of gropdf's default. If no `cmapfilename' given then do not
+ include any ToUnicode CMap.
+
+ * src/devices/gropdf/gropdf.pl <top>: Allow `bundled' flags on
+ command line (i.e. -de = -d -e).
+ Use $RT_SEP as multi path separator, not hard coded `:'. Update all
+ users.
+ New flags -u and -s.
+ Once a custom papersize has been set as \X'papersize x,y' make it
+ sticky so all following pages use custom size.
+ When importing pdf with \X'pdf: pdfpic ...' do not compress objects
+ which are already compressed! This caused problems with PDFs
+ created with ImageMagick, now fixed.
+ (IsText, PutLine, do_t): The troff `u' command can contain a kerning
+ adjustment number, this was not being handled, now fixed.
+ (do_c): The troff `c' command was not being handled correctly, now
+ fixed.
+ (FindChar, RemapChr, do_N): Handle fonts with more than 255 glyphs.
+ ($ucmap): Define CMap ToUnicode to convert ligatures
+ (fl,fi,ff,ffl,ffi) back to individual characters, useful for
+ cut'n'paste and text searching.
+ (LoadFont): Handle it.
+ (ToPoints, GetPoints): Handle `z' unit.
+ (do_x, FixPDFColour, PutHotSpot): Allow Annotation colour to be
+ groff colour, i.e. 0-65535 *3, or #rrggbb, or #rrrrbbbbgggg.
+ (do_p):The papersize width/length in switch -p were reversed,
+ corrected.
+
+ * src/devices/gropdf/Makefile.sub (gropdf): Use $RT_SEP.
+ Use $fontpath rather than $fontdir (this ensures site-font is
+ included in searches).
+
+ * tmac/pdf.tmac (PDFBOOKMARK.VIEW, PDFHREF.VIEW, PDFPAGE.Y): Fix
+ strings.
+ (pdfbookmark): Correct handling of bookmark levels.
+ Convert \[em] to hyphen in bookmarks
+ Rather use -N than -T for "named" bookmarks (-T already used for "tag"
+ in pdfmark.tmac)
+ (.pdfclean): New macro which attempts to asciify bookmark text.
+ (.pdfpagename): New wrapper macro for \X'pdf: pagename'.
+ (.pdfswitchtopage): New wrapper macro for \X'pdf: switchtopage'.
+
2012-03-10 Werner LEMBERG <wl@gnu.org>
Fix compiler warnings.
@@ -379,11 +434,11 @@
Bernd Warken
[groffer] Remove hardcoded path to 'libdir/groff/groffer' directory.
-
+
* configure.ac: add GROFFERDIR variables.
-
+
* Makefile.in: add and handle variable groffer_dir
-
+
* m4/groff.m4: set up the --with-grofferdir command line option.
2011-03-18 Werner LEMBERG <wl@gnu.org>
diff --git a/doc/groff.texinfo b/doc/groff.texinfo
index b1e31707..da6535f0 100644
--- a/doc/groff.texinfo
+++ b/doc/groff.texinfo
@@ -26,7 +26,7 @@
@copying
This manual documents GNU @code{troff} version 1.21.
-Copyright @copyright{} 1994-2011 Free Software Foundation, Inc.
+Copyright @copyright{} 1994-2012 Free Software Foundation, Inc.
@quotation
Permission is granted to copy, distribute and/or modify this document
@@ -472,7 +472,7 @@ developing GNU and promoting software freedom.''
@title groff
@subtitle The GNU implementation of @code{troff}
@subtitle Edition 1.21
-@subtitle Winter 2010
+@subtitle Spring 2012
@author by Trent A.@tie{}Fisher
@author and Werner Lemberg (@email{bug-groff@@gnu.org})
@@ -13012,6 +13012,10 @@ the following sets register@tie{}@code{n} to@tie{}1.
.x
@endExample
+Note that @code{asciify} cannot return all items in a diversion back
+to their source equivalent, nodes such as @code{\N[...]} will still
+remain as nodes, so the result cannot be guaranteed to be a pure string.
+
@xref{Copy-in Mode}.
@endDefreq
@@ -15198,6 +15202,18 @@ file. See the @cite{groff_font(5)} manual page for details.
@item -v
Print the version number.
+
+@item -s
+Append a comment line to end of PDF showing statistics, i.e. number of
+pages in document. Ghostscript's @cite{ps2pdf(1)} complains about this
+line if it is included, but works anyway.
+
+@item -u@var{filename}
+@code{gropdf} normally includes a ToUnicode CMap with any font created
+using @file{text.enc} as the encoding file, this makes it easier to
+search for words which contain ligatures. You can include your own CMap
+by specifying a @var{filename} or have no CMap at all by omitting the
+@var{filename}.
@end table
@c ---------------------------------------------------------------------
@@ -15434,7 +15450,7 @@ options:
@table @option
@item -a@var{bits}
-Use this number of @var{bits} (= 1, 2 or 4) for text antialiasing.
+Use this number of @var{bits} (= 1, 2 or 4) for text antialiasing.
Default: @var{bits} = 4.
@item -a0
diff --git a/src/devices/gropdf/Makefile.sub b/src/devices/gropdf/Makefile.sub
index c876c925..30991e52 100644
--- a/src/devices/gropdf/Makefile.sub
+++ b/src/devices/gropdf/Makefile.sub
@@ -30,7 +30,7 @@ MOSTLYCLEANADD=\
RM=rm -f
-all: gropdf
+all: gropdf
gropdf: gropdf.pl $(SH_DEPS_SED_SCRIPT)
@@ -38,7 +38,8 @@ gropdf: gropdf.pl $(SH_DEPS_SED_SCRIPT)
sed -f $(SH_DEPS_SED_SCRIPT) \
-e "s|@VERSION@|$(version)$(revision)|" \
-e "s|@PERLPATH@|$(PERLPATH)|" \
- -e "s|@GROFF_FONT_DIR@|$(fontdir)|" $(srcdir)/gropdf.pl >$@
+ -e "s|@GROFF_FONT_DIR@|$(fontpath)|" \
+ -e "s|@RT_SEP@|$(RT_SEP)|" $(srcdir)/gropdf.pl >$@
chmod +x $@
install_data:
diff --git a/src/devices/gropdf/gropdf.man b/src/devices/gropdf/gropdf.man
index a26a314b..d7953e09 100644
--- a/src/devices/gropdf/gropdf.man
+++ b/src/devices/gropdf/gropdf.man
@@ -1,5 +1,5 @@
.ig
-Copyright (C) 2011
+Copyright (C) 2011-2012
Free Software Foundation, Inc.
Permission is granted to make and distribute verbatim copies of
@@ -43,12 +43,13 @@ gropdf \- PDF driver for groff
.SH SYNOPSIS
.
.SY gropdf
-.OP \-delv
+.OP \-delvs
.OP \-F dir
\#.OP \-I dir
.OP \-p papersize
\#.OP \-w n
.OP \-y foundry
+.OP \-u [cmapfile]
.RI [ files
.IR .\|.\|. ]
.YS
@@ -188,7 +189,30 @@ Set the foundry to use for selecting fonts of the same name.
.
.TP
.B \-e
-Forces gropdf to embed ALL fonts (even the 14 base PDF fonts).
+Forces
+.B gropdf
+to embed ALL fonts (even the 14 base PDF fonts).
+.
+.TP
+.B \-s
+Append a comment line to end of PDF showing statistics,
+i.e. number of pages in document.
+Ghostscript's
+.B ps2pdf
+complains about this line if it is included, but works anyway.
+.
+.TP
+.B \-u
+.TQ
+.BI \-u cmapfilename
+.B Gropdf
+normally includes a ToUnicode CMap with any font created using
+.B text.enc
+as the encoding file,
+this makes it easier to search for words which contain ligatures.
+You can include your own CMap by specifying a
+.I cmapfilename
+or have no CMap at all by omitting the argument.
.
.
.SH USAGE
@@ -677,17 +701,17 @@ The following tags are supported:
.BI "\[rs]X'pdf: pdfpic " "file alignment width height line-length" '
Place an image of the specified
.I width
-containing the PDF drawing from file
+containing the PDF drawing from file
.I file
-of desired
+of desired
.I width
and
.I height
-(if
+(if
.I height
is missing or zero then it is scaled proportionally).
.
-If
+If
.I alignment
is
.B \-L
@@ -701,7 +725,7 @@ a
.I linelength
greater than the width of the drawing is required as well.
.
-If
+If
.I width
is specified as zero then the width is scaled in proportion to the height.
.
@@ -804,52 +828,7 @@ will now load successfully.
.SS TrueType and other font formats
.
.B gropdf
-does not support TrueType fonts natively within the PDF files it generates
-(but does support any fonts if they are in an imported PDF).
-.
-However, TrueType fonts can be used with
-.B gropdf
-if converted first to
-.B Type\~42
-format, a special PostScript wrapper equivalent to the PFA format mentioned
-in
-.BR \%pfbtops (@MAN1EXT@).
-.
-There are several different methods to generate a Type\~42
-wrapper and most of them involve the use of a PostScript
-interpreter such as Ghostscript \[en] see
-.BR gs (1).
-.
-.LP
-Yet, the easiest method involves the use of the application
-.BR ttftot42 (1).
-.
-This program uses
-.BR freetype (3)
-(version 1.3.1) to generate Type\~42
-font wrappers and well-formed AFM files that can be fed to the
-.BR \%afmtodit (@MAN1EXT@)
-script to create appropriate metric files.
-.
-The resulting font wrappers should be added to groff's
-.B download
-file.
-.
-.B ttftot42
-source code can be downloaded from
-.UR ftp://\:www.giga.or.at/\:pub/\:nih/\:ttftot42/
-ftp://\:www.giga.or.at/\:pub/\:nih/\:ttftot42/
-.UE .
-.
-.LP
-Another solution for creating Type\~42 wrappers is to use FontForge,
-available from
-.UR http://\:fontforge.sf.net
-http://\:fontforge.sf.net
-.UE .
-.
-This font editor can convert most outline font formats.
-.
+does not support any other fonts except Adobe Type 1 (PFA or PFB).
.
.SH FONT INSTALLATION
.
@@ -865,8 +844,8 @@ as a step-by-step font installation guide for
.LI
Convert your font to something groff understands.
.
-This is either a PostScript Type\~1 font in either PFA or PFB format or a
-PostScript Type\~42 font, together with an AFM file.
+This is either a PostScript Type\~1 font in either PFA or PFB,
+together with an AFM file.
.
.IP
The very first line in a PFA/PFB file contains this:
@@ -880,29 +859,6 @@ The very first line in a PFA/PFB file contains this:
A PFB file has this also in the first line, but the string is
preceded with some binary bytes.
.
-.IP
-The very first characters in a Type\~42 font file look like this:
-.
-.RS
-.IP
-.B %!PS-TrueTypeFont
-.RE
-.
-.IP
-This is a wrapper format for TrueType fonts.
-.
-Old PS printers might not support it (this is, they don't have a
-built-in TrueType font interpreter).
-.
-.IP
-For TrueType fonts, try
-.B ttftot42
-or
-.BR fontforge .
-For all other font formats use
-.B fontforge
-which can convert most outline font formats.
-.
.LI
Convert the AFM file to a groff font description file with the
.BR \%afmtodit (@MAN1EXT@)
diff --git a/src/devices/gropdf/gropdf.pl b/src/devices/gropdf/gropdf.pl
index 9dbc4884..ad198bcc 100644
--- a/src/devices/gropdf/gropdf.pl
+++ b/src/devices/gropdf/gropdf.pl
@@ -23,13 +23,14 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
use strict;
-use Getopt::Long;
+use Getopt::Long qw(:config bundling);
use Compress::Zlib;
my %cfg;
$cfg{GROFF_VERSION}='@VERSION@';
$cfg{GROFF_FONT_PATH}='@GROFF_FONT_DIR@';
+$cfg{RT_SEP}='@RT_SEP@';
binmode(STDOUT);
my @obj; # Array of PDF objects
@@ -98,6 +99,8 @@ my $n_flg=1;
my $pginsert=-1; # Growth point for kids array
my %pgnames; # 'names' of pages for switchtopage
my @outlines=(); # State of Bookmark Outlines at end of each page
+my $custompaper=0; # Has there been an X papersize
+my $textenccmap=''; # CMap for groff text.enc encoding
my %ppsz=( 'ledger'=>[1224,792],
'legal'=>[612,1008],
@@ -128,6 +131,29 @@ my %ppsz=( 'ledger'=>[1224,792],
'c5'=>[459,649],
'c6'=>[323,459] );
+my $ucmap=<<'EOF';
+/CIDInit /ProcSet findresource begin
+12 dict begin
+begincmap
+/CIDSystemInfo
+<< /Registry (Adobe)
+/Ordering (UCS)
+/Supplement 0
+>> def
+/CMapName /Adobe-Identity-UCS def
+/CMapType 2 def
+1 begincodespacerange
+<0000> <FFFF>
+endcodespacerange
+2 beginbfrange
+<008b> <008f> [<00660066> <00660069> <0066006c> <006600660069> <00660066006C>]
+<00ad> <00ad> <002d>
+endbfrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+EOF
my $fd;
my $frot;
@@ -135,10 +161,12 @@ my $fpsz;
my $embedall=0;
my $debug=0;
my $version=0;
+my $stats=0;
+my $unicodemap;
#Load_Config();
-GetOptions("F=s" => \$fd, 'l' => \$frot, 'p=s' => \$fpsz, 'd!' => \$debug, 'v' => \$version, 'e' => \$embedall, 'y=s' => \$Foundry);
+GetOptions("F=s" => \$fd, 'l' => \$frot, 'p=s' => \$fpsz, 'd!' => \$debug, 'v' => \$version, 'e' => \$embedall, 'y=s' => \$Foundry, 's' => \$stats, 'u:s' => \$unicodemap);
if ($version)
{
@@ -146,11 +174,30 @@ if ($version)
exit;
}
+if (defined($unicodemap))
+{
+ if ($unicodemap eq '')
+ {
+ $ucmap='';
+ }
+ elsif (-r $unicodemap)
+ {
+ local $/;
+ open(F,"<$unicodemap") or die "gropdf: Failed to open '$unicodemap'";
+ ($ucmap)=(<F>);
+ close(F);
+ }
+ else
+ {
+ Msg(0,"Failed to find '$unicodemap' - ignoring");
+ }
+}
+
# Search for 'font directory': paths in -f opt, shell var GROFF_FONT_PATH, default paths
my $fontdir=$cfg{GROFF_FONT_PATH};
-$fontdir=$ENV{GROFF_FONT_PATH}.':'.$fontdir if exists($ENV{GROFF_FONT_PATH});
-$fontdir=$fd.':'.$fontdir if defined($fd);
+$fontdir=$ENV{GROFF_FONT_PATH}.$cfg{RT_SEP}.$fontdir if exists($ENV{GROFF_FONT_PATH});
+$fontdir=$fd.$cfg{RT_SEP}.$fontdir if defined($fd);
$rot=90 if $frot;
$matrix="0 1 -1 0" if $frot;
@@ -267,6 +314,19 @@ my $info=BuildObj(++$objct,\%info);
PutObj($objct);
+foreach my $fontno (keys %fontlst)
+{
+ my $o=$fontlst{$fontno}->{FNT};
+ my $p=GetObj($fontlst{$fontno}->{OBJ});
+
+ if (exists($p->{LastChar}) and $p->{LastChar} > 255)
+ {
+ $p->{LastChar} = 255;
+ splice(@{$o->{GNO}},256);
+ splice(@{$o->{WID}},256);
+ }
+}
+
foreach my $o (3..$objct)
{
PutObj($o) if (!exists($obj[$o]->{XREF}));
@@ -287,7 +347,8 @@ foreach my $xr (@obj)
printf("%010d 00000 n \n",$xr->{XREF});
}
-print "trailer\n<<\n/Info $info\n/Root 1 0 R\n/Size $objct\n>>\nstartxref\n$fct\n\%\%EOF\n\% Pages=$pages->{Count}\n";
+print "trailer\n<<\n/Info $info\n/Root 1 0 R\n/Size $objct\n>>\nstartxref\n$fct\n\%\%EOF\n";
+print "\% Pages=$pages->{Count}\n" if $stats;
sub MakeMatrix
@@ -431,6 +492,10 @@ sub ToPoints
{
return($num*6);
}
+ elsif ($unit eq 'z')
+ {
+ return($num/$unitwidth);
+ }
else
{
Msg(1,"Unknown scaling factor '$unit'");
@@ -488,7 +553,7 @@ sub OpenFile
return if -r "$fnm" and open($$f,"<$fnm");
}
- my (@dirs)=split(':',$dirs);
+ my (@dirs)=split($cfg{RT_SEP},$dirs);
foreach my $dir (@dirs)
{
@@ -683,6 +748,7 @@ sub do_x
my $annot=$obj[$objct];
$annot->{DATA}->{Type}='/Annot';
FixRect($annot->{DATA}->{Rect}); # Y origin to ll
+ FixPDFColour($annot->{DATA});
push(@{$cpage->{Annots}},$annotno);
}
elsif ($pdfmark=~m/(.+) \/OUT/)
@@ -988,11 +1054,54 @@ sub do_x
@mediabox=(0,0,$px,$py);
my @mb=@mediabox;
$matrixchg=1;
+ $custompaper=1;
$cpage->{MediaBox}=\@mb;
}
}
}
+sub FixPDFColour
+{
+ my $o=shift;
+ my $a=$o->{C};
+ my @r=();
+ my $c=$a->[0];
+
+ if ($#{$a}==3)
+ {
+ if ($c > 1)
+ {
+ foreach my $j (0..2)
+ {
+ push(@r,sprintf("%1.3f",$a->[$j]/0xffff));
+ }
+
+ $o->{C}=\@r;
+ }
+ }
+ elsif (substr($c,0,1) eq '#')
+ {
+ if (length($c) == 7)
+ {
+ foreach my $j (0..2)
+ {
+ push(@r,sprintf("%1.3f",hex(substr($c,$j*2+1,2))/0xff));
+ }
+
+ $o->{C}=\@r;
+ }
+ elsif (length($c) == 14)
+ {
+ foreach my $j (0..2)
+ {
+ push(@r,sprintf("%1.3f",hex(substr($c,$j*4+2,4))/0xffff));
+ }
+
+ $o->{C}=\@r;
+ }
+ }
+}
+
sub PutHotSpot
{
my $endx=shift;
@@ -1005,6 +1114,7 @@ sub PutHotSpot
my $annot=$obj[$objct];
$annot->{DATA}->{Type}='/Annot';
$annot->{DATA}->{Rect}=[$mark->{xpos},$mark->{ypos}-$mark->{rsb},$endx+$mark->{lead},$mark->{ypos}-$mark->{rst}];
+ FixPDFColour($annot->{DATA});
FixRect($annot->{DATA}->{Rect}); # Y origin to ll
push(@{$cpage->{Annots}},$annotno);
}
@@ -1029,7 +1139,7 @@ sub GetPoints
{
my $val=shift;
- $val=ToPoints($1,$2) if ($val=~m/(-?[\d.]+)([cipn])/);
+ $val=ToPoints($1,$2) if ($val=~m/(-?[\d.]+)([cipnz])/);
return $val;
}
@@ -1762,7 +1872,7 @@ sub PutObj
$obj[$ono]->{XREF}=$fct;
if (exists($obj[$ono]->{STREAM}))
{
- if (!$debug)
+ if (!$debug && !exists($obj[$ono]->{DATA}->{'Filter'}))
{
$obj[$ono]->{STREAM}=Compress::Zlib::compress($obj[$ono]->{STREAM});
$obj[$ono]->{DATA}->{'Filter'}=['/FlateDecode'];
@@ -1899,7 +2009,7 @@ sub LoadFont
}
$r[0]='u0020' if $r[3] == 32;
- next if $r[3] >255;
+# next if $r[3] >255;
$fnt{GNM}->{$r[0]}=$r[3];
$fnt{GNO}->[$r[3]]='/'.$r[4];
$fnt{WID}->[$r[3]]=$p[0];
@@ -2007,10 +2117,21 @@ sub LoadFont
$fontlst{$fontno}->{FNT}=\%fnt;
}
- PutObj($fno);
- PutObj($fno+1);
- PutObj($fno+2) if defined($obj[$fno+2]);
- PutObj($fno+3) if defined($obj[$fno+3]);
+ if (defined($fnt{encoding}) and $fnt{encoding} eq 'text.enc' and $ucmap ne '')
+ {
+ if ($textenccmap eq '')
+ {
+ $textenccmap = BuildObj($objct+1,{});
+ $objct++;
+ $obj[$objct]->{STREAM}=$ucmap;
+ }
+ $obj[$fno]->{DATA}->{'ToUnicode'}=$textenccmap;
+ }
+
+# PutObj($fno);
+# PutObj($fno+1);
+# PutObj($fno+2) if defined($obj[$fno+2]);
+# PutObj($fno+3) if defined($obj[$fno+3]);
}
sub GetType1
@@ -2164,6 +2285,7 @@ sub do_p
if ($cpageno > 0)
{
+ $cpage->{MediaBox}=\@mediabox if $custompaper;
PutObj($cpageno);
OutStream($cpageno+1);
}
@@ -2189,7 +2311,7 @@ sub do_p
$stream="q 1 0 0 1 0 0 cm\n";
$mode='g';
$curfill='';
- @mediabox=@defaultmb;
+# @mediabox=@defaultmb;
}
sub do_f
@@ -2248,6 +2370,7 @@ sub IsText
$whtsz=$fontlst{$cft}->{FNT}->{spacewidth}*$cftsz;
$stream.="/F$cft $cftsz Tf\n";
}
+ $stream.="$curkern Tc\n";
}
if ($poschg or $matrixchg)
@@ -2256,6 +2379,7 @@ sub IsText
$stream.="$matrix ".PutXY($xpos,$ypos)." Tm\n", $poschg=0;
$tmxpos=$xpos;
$matrixchg=0;
+ $stream.="$curkern Tc\n";
}
if ($fontchg)
@@ -2768,8 +2892,16 @@ sub PutLine
# $wt+=$whtsz/$cftsz;
# }
- $stream.=sprintf( "%.3f Tw ",-($whtsz+$wt*$cftsz)/$unitwidth );
- $stream.="[(";
+ $stream.=sprintf( "%.3f Tw ",-($whtsz+$wt*$cftsz)/$unitwidth-$curkern );
+ if (!defined($lin[0]->[0]) and defined($lin[0]->[1]))
+ {
+ $stream.="[ $lin[0]->[1] (";
+ shift @lin;
+ }
+ else
+ {
+ $stream.="[(";
+ }
foreach my $wd (@lin)
{
@@ -2787,6 +2919,7 @@ sub PutLine
}
else
{
+ $wwt=sprintf("%.3f",$wwt);
$stream.="$wd->[0]) $wwt (" if defined($wd->[0]);
}
}
@@ -2936,11 +3069,13 @@ sub do_t
PutLine(0) if $#lin > -1;
MakeMatrix(1);
$stream.="$matrix ".PutXY($xpos,$ypos)." Tm\n", $poschg=0;
+ $stream.="$curkern Tc\n";
$stream.="0 Tw ";
$stream.="($par) Tj\n";
MakeMatrix();
$stream.="$matrix ".PutXY($xpos,$ypos)." Tm\n", $poschg=0;
$matrixchg=0;
+ $stream.="$curkern Tc\n";
return;
}
@@ -3021,11 +3156,14 @@ sub do_C
sub FindChar
{
my $chnm=shift;
+ my $fnt=$fontlst{$cft}->{FNT};
- if (exists($fontlst{$cft}->{FNT}->{GNM}->{$chnm}))
+ if (exists($fnt->{GNM}->{$chnm}))
{
- my $ch=$fontlst{$cft}->{FNT}->{GNM}->{$chnm};
- return(chr($ch),$fontlst{$cft}->{FNT}->{WID}->[$ch]*$cftsz);
+ my $ch=$fnt->{GNM}->{$chnm};
+ $ch=RemapChr($ch,$fnt,$chnm) if ($ch > 255);
+
+ return(chr($ch),$fnt->{WID}->[$ch]*$cftsz);
}
else
{
@@ -3033,6 +3171,33 @@ sub FindChar
}
}
+sub RemapChr
+{
+ my $ch=shift;
+ my $fnt=shift;
+ my $chnm=shift;
+ my $unused=0;
+
+ foreach my $un (2..$#{$fnt->{GNO}})
+ {
+ $unused=$un,last if $fnt->{GNO}->[$un] eq '/.notdef';
+ }
+
+ if (--$unused <= 255)
+ {
+ $fnt->{GNM}->{$chnm}=$unused++;
+ $fnt->{GNO}->[$unused]=$fnt->{GNO}->[$ch+1];
+ $fnt->{WID}->[$unused]=$fnt->{WID}->[$ch+1];
+ $ch=$unused-1;
+ return($ch);
+ }
+ else
+ {
+ Msg(0,"Too many glyphs used in font '$cft'");
+ return(32);
+ }
+}
+
sub do_c
{
my $par=shift;
@@ -3040,7 +3205,7 @@ sub do_c
push(@ahead,substr($par,1));
$par=substr($par,0,1);
my $ch=ord($par);
- do_t($ch);
+ do_N($ch);
$nomove=$fontlst{$cft}->{FNT}->{WID}->[$ch]*$cftsz;
}
@@ -3048,6 +3213,19 @@ sub do_N
{
my $par=shift;
+ if ($par > 255)
+ {
+ my $fnt=$fontlst{$cft}->{FNT};
+ my $chnm='';
+
+ foreach my $c (keys %{$fnt->{GNM}})
+ {
+ $chnm=$c,last if $fnt->{GNM}->{$c} == $par;
+ }
+
+ $par=RemapChr($par,$fnt,$chnm);
+ }
+
do_t(chr($par));
$nomove=$fontlst{$cft}->{FNT}->{WID}->[$par]*$cftsz;
}
diff --git a/tmac/pdf.tmac b/tmac/pdf.tmac
index 844e3f74..68fa9e5a 100644
--- a/tmac/pdf.tmac
+++ b/tmac/pdf.tmac
@@ -144,7 +144,7 @@
.\" the page width to the viewing window, with the bookmarked entry
.\" located at the top of the viewable area.
.\"
-.ds PDFBOOKMARK.VIEW /FitH -\\n[PDFPAGE.Y] u
+.ds PDFBOOKMARK.VIEW /FitH \\n[PDFPAGE.Y] u
.\"
.\" "PDFOUTLINE.FOLDLEVEL" controls how the document outline will be
.\" displayed. It is a number, defining the maximum heading level
@@ -189,7 +189,7 @@
. \"
. nr pdf:bm.lev 0+\\$1
. if \\n[pdf:bm.lev]==0 .nr pdf:bm.lev 1
-. if \\n[pdf:bm.lev]>\\n[PDFOUTLINE.FOLDLEVEL] .nr pdf:bm.lev \\n[pdf:bm.lev]*-1
+. if \\n[pdf:bm.lev]-1==\\n[PDFOUTLINE.FOLDLEVEL] .nr pdf:bm.lev \\n[pdf:bm.lev]*-1
. nr pdf:bm.abslev 0+\\n[pdf:bm.lev]
. if \\n[pdf:bm.lev]<0 .nr pdf:bm.abslev 0+\\n[pdf:bm.abslev]*-1
. if \\n[pdf:bm.abslev]>\\n[pdf:bm.nl] .nr pdf:bm.nl \\n[pdf:bm.nl]+1
@@ -213,18 +213,24 @@
. pdf:href.sety
. ds pdf:cleaned \\$*
. ev pdfcln
+. tr \[em]-
. nf
. box pdf:clean
. nop \\$*
-. sp -1
+. fl
. box
+. chop pdf:clean
. asciify pdf:clean
+. length pdf:clean:len \\*[pdf:clean]
. ds pdf:cleaned \\*[pdf:clean]
+. rm pdf:clean
. ev
+. tr \[em]\[em]
. ds pdf:look(\\*[PDFBOOKMARK.NAME]) \\*[pdf:cleaned]
. if dPDF.EXPORT .tm .ds pdf:look(\\*[PDFBOOKMARK.NAME]) \\*[pdf:cleaned]
. pdfmark /Dest /\\*[PDFBOOKMARK.NAME] /View [\\*[PDFBOOKMARK.VIEW]] /DEST
-. pdfmark /Dest /\\*[PDFBOOKMARK.NAME] /Title (\\*[pdf:cleaned]) /Level \\n[pdf:bm.lev] /OUT
+. nop \!x X ps:exec [/Dest /\\*[PDFBOOKMARK.NAME] /Title (\\*[pdf:cleaned]) /Level \\n[pdf:bm.lev] /OUT pdfmark
+.\". pdfmark /Dest /\\*[PDFBOOKMARK.NAME] /Title "(\\*[pdf:cleaned])" /Level \\n[pdf:bm.lev] /OUT
. pdf:href.options.clear
. rr PDFPAGE.Y
. rm pdf:cleaned
@@ -240,6 +246,25 @@
. nop \!.pdfbookmark \\$@
. \}
..
+.
+.de pdfclean
+. ie '\\n(.z'' \{\
+. ds pdfcleaned \\$*
+. ev pdfcln
+. tr \[em]-
+. nf
+. box pdf:clean
+. nop \\*[\\*[pdfcleaned]]
+. fl
+. box
+. chop pdf:clean
+. asciify pdf:clean
+. ev
+. ds \\*[pdfcleaned] "\\*[pdf:clean]
+. rm pdf:clean
+. tr \[em]\[em]
+. el .nop \!.pdfclean \\$@
+..
.\"
.\" =============================================================
.\" Module PDFHREF: Create Hypertext References in a PDF Document
@@ -248,7 +273,7 @@
.\" "PDFHREF.VIEW" controls how the document will be displayed,
.\" when the user follows a link to a named reference.
.\"
-.ds PDFHREF.VIEW /FitH -\\n[PDFPAGE.Y] u
+.ds PDFHREF.VIEW /FitH \\n[PDFPAGE.Y] u
.\"
.\" This default setting will fit the page width to the viewing
.\" window, with the bookmarked entry located close to the top
@@ -278,7 +303,7 @@
.\" in groff's basic units; don't forget to append grops' "u"
.\" conversion operator, when writing the pdfmark!
.\"
-.nr PDFPAGE.Y \\n(nl-\\n[PDFHREF.VIEW.LEADING]
+.nr PDFPAGE.Y (\\n[PDFHREF.VIEW.LEADING]-\\n(nl)
..
.\" When we create a link "hot-spot" ...
.\" "PDFHREF.LEADING" sets the distance above the top of the glyph
@@ -647,7 +672,7 @@
. \" limits of its bounding box(es), as the before and after output
. \" text positions.
. \"
-. if dPDFHREF.COLOUR .defcolor pdf:href.colour rgb \\*[PDFHREF.COLOUR]
+\#. if dPDFHREF.COLOUR .defcolor pdf:href.colour rgb \\*[PDFHREF.COLOUR]
. nr pdf:bm.width \\w'\\*[PDFHREF.DESC]'
. nop \&\m[\\*[PDFHREF.TEXT.COLOUR]]\X'pdf: markstart \\n[rst] \\n[rsb] \\n[PDFHREF.LEADING] \\*[pdf:href.link]'\\*[PDFHREF.DESC]\X'pdf: markend'\m[]\c
. \"
@@ -735,5 +760,11 @@
.de pdfmarkrestart
.nop \!x X pdf: markrestart
..
+.de pdfpagename
+.nop \!x X pdf: pagename \\$1
+..
+.de pdfswitchtopage
+.nop \!x X pdf: switchtopage \\$*
+..
.\"
.\" pdf.tmac: end of file / vim: ft=groff