Re: pdftex - Encoding for metafont PK fonts
Pali Rohár <[email protected]>
| Newsgroups | gmane.comp.tex.pdftex |
|---|---|
| Message-ID | <201606262256.40162@pali> |
On Sunday 26 June 2016 13:35:22 Pali Rohár wrote: > On Sunday 26 June 2016 07:54:19 Reinhard Kotucha wrote: > > On 2016-06-25 at 22:56:48 +0000, Ross Moore wrote: > > > But it is pity that it is not possible to specify that enc file > > > also for PK fonts generated by MetaFont. Or it is somehow > > > possible? > > > > > > I see no reason why not, but could easily be wrong. > > > But I must admit that I’ve not tried it with a PK font. > > > > Dear Ross, > > I assume that the main problem is that Metafont is using numerical > > glyph indices but in order to re-encode a font, it's required that > > each glyph has a name. > > Yes! And that glyph name for each numberical value (index) is > available in encode file (csr.enc). This is reason why I'm tryint to > tell pdftex: > > "hey pdftex, please use csr.enc for my csb12 PK font, it contains > mapping index --> glyph name which you need to building cmap file" Ok, it is really not possible with pdftex. I looked into pdftex source code and code for writing PK & Type 3 fonts in PDFtex does not use encoding vectors... Also code for loading mapfile cannot be used for PK fonts (checker refuse it). I looked deeply how pdftex working with Type 3 and PK fonts and created small patch which adds support for generating /ToUnicode object (from \pdfglyphtounicode table) and which allows to load enc file also PK fonts. Patch was created against pdftex in TeXLive 2012 (which is on my system), but is really small and should be very easy to rewrite/apply it on new versions. Patch pdftex-pkfonts-encfile-tounicode.patch is attached. Let me know what do you think about it and if it can be added to pdftex project. -- Pali Rohár [email protected]
pdftex-pkfonts-encfile-tounicode.patch
(text/x-patch, 5.1 KB)
Index: texlive-bin-2012.20120628/texk/web2c/pdftexdir/mapfile.c
===================================================================
--- texlive-bin-2012.20120628.orig/texk/web2c/pdftexdir/mapfile.c 2012-04-12 18:48:24.000000000 +0200
+++ texlive-bin-2012.20120628/texk/web2c/pdftexdir/mapfile.c 2016-06-26 22:39:36.102270848 +0200
@@ -288,11 +288,11 @@
/* do not set variable |a| as this entry will be still accepted */
}
- /* if both ps_name and font file are missing, drop this entry */
- if (fm->ps_name == NULL && !is_fontfile(fm)) {
+ /* if ps_name, font file and enc file are missing, drop this entry */
+ if (fm->ps_name == NULL && !is_fontfile(fm) && !is_reencoded(fm)) {
if (warn)
pdftex_warn
- ("invalid entry for `%s': both ps_name and font file missing",
+ ("invalid entry for `%s': ps_name, font file and enc file missing",
fm->tfm_name);
a += 1;
}
Index: texlive-bin-2012.20120628/texk/web2c/pdftexdir/writefont.c
===================================================================
--- texlive-bin-2012.20120628.orig/texk/web2c/pdftexdir/writefont.c 2011-04-29 02:06:36.000000000 +0200
+++ texlive-bin-2012.20120628/texk/web2c/pdftexdir/writefont.c 2016-06-26 22:38:17.129390428 +0200
@@ -664,7 +664,7 @@
fm_entry *fm;
fm = hasfmentry(f) ? (fm_entry *) pdffontmap[f] : NULL;
if (fm == NULL || (fm->ps_name == NULL && fm->ff_name == NULL))
- writet3(font_objnum, f);
+ writet3(fm, font_objnum, f);
else
create_fontdictionary(fm, font_objnum, f);
}
Index: texlive-bin-2012.20120628/texk/web2c/pdftexdir/ptexlib.h
===================================================================
--- texlive-bin-2012.20120628.orig/texk/web2c/pdftexdir/ptexlib.h 2012-05-20 01:57:09.000000000 +0200
+++ texlive-bin-2012.20120628/texk/web2c/pdftexdir/ptexlib.h 2016-06-26 22:32:28.261532200 +0200
@@ -315,7 +315,7 @@
extern void t1_free(void);
/* writet3.c */
-extern void writet3(int, internalfontnumber);
+extern void writet3(fm_entry *, int, internalfontnumber);
extern scaled getpkcharwidth(internalfontnumber, scaled);
/* writettf.c */
Index: texlive-bin-2012.20120628/texk/web2c/pdftexdir/writet3.c
===================================================================
--- texlive-bin-2012.20120628.orig/texk/web2c/pdftexdir/writet3.c 2011-04-29 02:06:36.000000000 +0200
+++ texlive-bin-2012.20120628/texk/web2c/pdftexdir/writet3.c 2016-06-26 22:43:18.996787419 +0200
@@ -254,7 +254,7 @@
return true;
}
-void writet3(int objnum, internalfontnumber f)
+void writet3(fm_entry * fm, int objnum, internalfontnumber f)
{
static char t3_font_scale_str[] = "\\pdffontscale";
int i;
@@ -262,12 +262,17 @@
int first_char, last_char;
integer pk_font_scale;
boolean is_notdef;
+ fe_entry *fe;
+ char **glyph_names;
+ integer tounicode_objnum;
t3_glyph_num = 0;
t3_image_used = false;
for (i = 0; i < 256; i++) {
t3_char_procs[i] = 0;
t3_char_widths[i] = 0;
}
+ fe = fm ? get_fe_entry(fm->encname) : NULL;
+ glyph_names = fe ? fe->glyph_names : NULL;
packfilename(fontname[f], getnullstr(), maketexstring(".pgc"));
cur_file_name = makecstring(makenamestring());
is_pk_font = false;
@@ -298,6 +303,11 @@
if (pdfcharmarked(f, i))
break;
last_char = i;
+ /* write ToUnicode entry if needed */
+ if (fixedgentounicode > 0 && !pdffontnobuiltintounicode[f] && fe != NULL)
+ tounicode_objnum = write_tounicode(glyph_names, fm->tfm_name, fe->name);
+ else
+ tounicode_objnum = 0;
pdfbegindict(objnum, 1); /* Type 3 font dictionary */
pdf_puts("/Type /Font\n/Subtype /Type3\n");
pdf_printf("/Name /F%i\n", (int) f);
@@ -344,7 +354,10 @@
pdf_printf("/%s", notdef);
is_notdef = true;
} else {
- pdf_printf("/a%i", first_char);
+ if (glyph_names && glyph_names[first_char])
+ pdf_printf("/%s", glyph_names[first_char]);
+ else
+ pdf_printf("/a%i", first_char);
is_notdef = false;
}
for (i = first_char + 1; i <= last_char; i++) {
@@ -358,15 +371,23 @@
pdf_printf(" %i", i);
is_notdef = false;
}
- pdf_printf("/a%i", i);
+ if (glyph_names && glyph_names[first_char])
+ pdf_printf("/%s", glyph_names[first_char]);
+ else
+ pdf_printf("/a%i", i);
}
}
pdf_puts("]\n");
+ if (tounicode_objnum != 0)
+ pdf_printf("/ToUnicode %i 0 R\n", (int) tounicode_objnum);
pdfenddict();
pdfbegindict(cptr, 1); /* CharProcs dictionary */
for (i = first_char; i <= last_char; i++)
if (t3_char_procs[i] != 0)
- pdf_printf("/a%i %i 0 R\n", (int) i, (int) t3_char_procs[i]);
+ if (glyph_names && glyph_names[first_char])
+ pdf_printf("/%s %i 0 R\n", glyph_names[first_char], (int) t3_char_procs[i]);
+ else
+ pdf_printf("/a%i %i 0 R\n", (int) i, (int) t3_char_procs[i]);
pdfenddict();
t3_close();
tex_printf(">");
signature.asc
(application/pgp-signature, 198 B)
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) iEYEABECAAYFAldwQYgACgkQi/DJPQPkQ1IgSQCghcgEF8j59Q/fuVm5AZCcVp3E +rUAoMY5AKGYRRnkynLnaeXCCxA1PN0V =ENd5 -----END PGP SIGNATURE-----