pdftex[893] branches/stable: - add primitive \pdfspacefont to

commits+thanh at tug.org commits+thanh at tug.org
Fri Feb 10 10:38:12 CET 2023


Revision: 893
          http://tug.org/svn/pdftex?view=revision&revision=893
Author:   thanh
Date:     2023-02-10 10:38:11 +0100 (Fri, 10 Feb 2023)
Log Message:
-----------
- add primitive \pdfspacefont to customize dummy font for faked inter-word space
- use real space char from when available in font
- add map entry `+pdftexspace PdfTeX-Space <pdftexspace.pfb` automatically

Modified Paths:
--------------
    branches/stable/source/src/texk/web2c/pdftexdir/mapfile.c
    branches/stable/source/src/texk/web2c/pdftexdir/pdftex.ch
    branches/stable/source/src/texk/web2c/pdftexdir/pdftex.defines
    branches/stable/source/src/texk/web2c/pdftexdir/pdftex.web
    branches/stable/source/src/texk/web2c/pdftexdir/ptexlib.h
    branches/stable/tests/28-fake-interword-space-updated/Makefile
    branches/stable/tests/28-fake-interword-space-updated/fake-interword-space.tex

Modified: branches/stable/source/src/texk/web2c/pdftexdir/mapfile.c
===================================================================
--- branches/stable/source/src/texk/web2c/pdftexdir/mapfile.c	2023-02-03 09:55:48 UTC (rev 892)
+++ branches/stable/source/src/texk/web2c/pdftexdir/mapfile.c	2023-02-10 09:38:11 UTC (rev 893)
@@ -659,6 +659,24 @@
     return hasfmentry(f) && (!is_pk((fm_entry *)pdffontmap[f]));
 }
 
+boolean hasspacechar(internalfontnumber f)
+{
+    if (!isscalable(f))
+        return false;
+
+    fm_entry *fm = (fm_entry *)pdffontmap[f];
+    fe_entry *fe;
+
+    /* if a font is not re-encoded via its map entry, we assume it has no space char */
+    if (is_reencoded(fm) && (fe = get_fe_entry(fm->encname)) != NULL) {
+        char *s = fe->glyph_names[32];
+        assert(s != NULL);
+        if (strcmp(s, "space") == 0)
+            return true;
+    }
+    return false;
+}
+
 /* check whether a map entry is valid for font replacement */
 
 static boolean fm_valid_for_font_replacement(fm_entry * fm)
@@ -839,6 +857,11 @@
     flushstr(lasttokensstring);
 }
 
+void pdfmaplinesp(void)
+{
+    process_map_item("=pdftexspace PdfTeX-Space <pdftexspace.pfb", MAPLINE);
+}
+
 void pdfinitmapfile(const_string map_name)
 {
     assert(mitem == NULL);

Modified: branches/stable/source/src/texk/web2c/pdftexdir/pdftex.ch
===================================================================
--- branches/stable/source/src/texk/web2c/pdftexdir/pdftex.ch	2023-02-03 09:55:48 UTC (rev 892)
+++ branches/stable/source/src/texk/web2c/pdftexdir/pdftex.ch	2023-02-10 09:38:11 UTC (rev 893)
@@ -179,6 +179,7 @@
 pdf_font_attr:=xmalloc_array(str_number, font_max);
 pdf_font_blink:=xmalloc_array(internal_font_number, font_max);
 pdf_font_elink:=xmalloc_array(internal_font_number, font_max);
+pdf_font_has_space_char:=xmalloc_array(internal_font_number, font_max);
 pdf_font_stretch:=xmalloc_array(integer, font_max);
 pdf_font_shrink:=xmalloc_array(integer, font_max);
 pdf_font_step:=xmalloc_array(integer, font_max);
@@ -209,6 +210,7 @@
     pdf_font_attr[font_k] := "";
     pdf_font_blink[font_k] := null_font;
     pdf_font_elink[font_k] := null_font;
+    pdf_font_has_space_char[font_k] := false;
     pdf_font_stretch[font_k] := null_font;
     pdf_font_shrink[font_k] := null_font;
     pdf_font_step[font_k] := 0;
@@ -296,6 +298,7 @@
 pdf_font_attr:=xmalloc_array(str_number,font_max);
 pdf_font_blink:=xmalloc_array(internal_font_number,font_max);
 pdf_font_elink:=xmalloc_array(internal_font_number,font_max);
+pdf_font_has_space_char:=xmalloc_array(internal_font_number,font_max);
 pdf_font_stretch:=xmalloc_array(integer,font_max);
 pdf_font_shrink:=xmalloc_array(integer,font_max);
 pdf_font_step:=xmalloc_array(integer,font_max);
@@ -326,6 +329,7 @@
     pdf_font_attr[font_k] := "";
     pdf_font_blink[font_k] := null_font;
     pdf_font_elink[font_k] := null_font;
+    pdf_font_has_space_char[font_k] := false;
     pdf_font_stretch[font_k] := null_font;
     pdf_font_shrink[font_k] := null_font;
     pdf_font_step[font_k] := 0;

Modified: branches/stable/source/src/texk/web2c/pdftexdir/pdftex.defines
===================================================================
--- branches/stable/source/src/texk/web2c/pdftexdir/pdftex.defines	2023-02-03 09:55:48 UTC (rev 892)
+++ branches/stable/source/src/texk/web2c/pdftexdir/pdftex.defines	2023-02-10 09:38:11 UTC (rev 893)
@@ -39,9 +39,11 @@
 { functions from mapfile.c }
 @define function hasfmentry();
 @define function isscalable();
+ at define function hasspacechar();
 @define procedure checkextfm();
 @define procedure pdfmapfile();
 @define procedure pdfmapline();
+ at define procedure pdfmaplinesp;
 @define procedure pdfinitmapfile();
 
 { functions from utils.c }

Modified: branches/stable/source/src/texk/web2c/pdftexdir/pdftex.web
===================================================================
--- branches/stable/source/src/texk/web2c/pdftexdir/pdftex.web	2023-02-03 09:55:48 UTC (rev 892)
+++ branches/stable/source/src/texk/web2c/pdftexdir/pdftex.web	2023-02-10 09:38:11 UTC (rev 893)
@@ -15225,11 +15225,6 @@
     get_slant := slant(f);
 end;
 
-function new_dummy_font: internal_font_number;
-begin
-    new_dummy_font := read_font_info(null_cs, "dummy", "", -1000);
-end;
-
 @ Helper for debugging purposes:
 
 @p procedure short_display_n(@!p, m:integer); {prints highlights of list |p|}
@@ -15972,6 +15967,7 @@
 @!pdf_last_f: internal_font_number; {last font in PDF output page}
 @!pdf_last_fs: internal_font_number; {last font size in PDF output page}
 @!pdf_dummy_font: internal_font_number; {font used to insert artificial interword spaces}
+@!pdf_dummy_font: internal_font_number; {font used to insert artificial interword spaces}
 
 
 @ Following procedures implement low-level subroutines to convert \TeX{}
@@ -16126,6 +16122,7 @@
 
     {create a new font object for |f|}
     pdf_create_obj(obj_type_font, f);
+    pdf_font_has_space_char[f] := hasspacechar(f);
     pdf_use_font(f, obj_ptr);
 end;
 
@@ -16182,7 +16179,8 @@
 procedure pdf_read_dummy_font;
 begin
     if pdf_dummy_font = null_font then begin
-        pdf_dummy_font := read_font_info(null_cs, "dummy-space", "", one_bp);
+        pdf_dummy_font := read_font_info(null_cs, pdf_space_font_name, "", -1000);
+        pdfmaplinesp;
         pdf_mark_char(pdf_dummy_font, 32);
     end;
 end;
@@ -16253,17 +16251,26 @@
     end;
 
     if (must_insert_space) then begin
-        pdf_out(" ");
-        save_pdf_delta_h := pdf_delta_h;
-        adv_char_width(f, 32, 3); { to get |adv_char_width_s| and |adv_char_width_s_out|}
-        pdf_delta_h := save_pdf_delta_h;
-        s := s - adv_char_width_s;
-        s_out := s_out - adv_char_width_s_out;
-        cur_h := cur_h - char_width(f)(char_info(f)(32));
+        {insert a real space char from the font when possible}
+        if pdf_font_has_space_char[f]  then begin
+            pdf_out(" ");
+            save_pdf_delta_h := pdf_delta_h;
+            adv_char_width(f, 32, 3); { to get |adv_char_width_s| and |adv_char_width_s_out|}
+            s := s - adv_char_width_s;
+            s_out := s_out - adv_char_width_s_out;
+            pdf_mark_char(f, 32);
+        end
+        else
+            must_end_string := true;
     end;
 
     if must_end_string then begin
         pdf_end_string;
+        {insert a space char from the dummy font if needed}
+        if (must_insert_space) and (not pdf_font_has_space_char[f]) then begin
+            pdf_insert_interword_space; {this will change |pdf_f|}
+            pdf_set_font(f);
+        end;
         pdf_set_textmatrix(v, v_out, f);
         pdf_f := f;
         s := 0;
@@ -20516,6 +20523,7 @@
 @ @<Glob...@>=
 @!pdf_font_blink: ^internal_font_number; {link to base font (used for expanded fonts only)}
 @!pdf_font_elink: ^internal_font_number; {link to expanded fonts (used for base fonts only)}
+@!pdf_font_has_space_char: ^boolean; {has font a real space char?}
 @!pdf_font_stretch: ^integer; {link to font expanded by stretch limi}
 @!pdf_font_shrink: ^integer; {link to font expanded by shrink limit}
 @!pdf_font_step: ^integer;  {amount of one step of expansion}
@@ -33720,7 +33728,8 @@
 @d pdf_fake_space_node         == pdftex_first_extension_code + 40
 @d pdf_running_link_off_node   == pdftex_first_extension_code + 41
 @d pdf_running_link_on_node    == pdftex_first_extension_code + 42
- at d pdftex_last_extension_code  == pdftex_first_extension_code + 42
+ at d pdf_space_font_code         == pdftex_first_extension_code + 43
+ at d pdftex_last_extension_code  == pdftex_first_extension_code + 43
 
 @<Put each...@>=
 primitive("openout",extension,open_node);@/
@@ -33819,6 +33828,8 @@
 @!@:pdf_running_link_off_}{\.{\\pdfrunninglinkoff} primitive@>
 primitive("pdfrunninglinkon",extension,pdf_running_link_on_node);@/
 @!@:pdf_running_link_on_}{\.{\\pdfrunninglinkon} primitive@>
+primitive("pdfspacefont",extension,pdf_space_font_code);@/
+@!@:pdf_space_font_}{\.{\\pdfspacefont} primitive@>
 
 @ The variable |write_loc| just introduced is used to provide an
 appropriate error message in case of ``runaway'' write texts.
@@ -33876,6 +33887,7 @@
   pdf_fake_space_node: print_esc("pdffakespace");
   pdf_running_link_off_node: print_esc("pdfrunninglinkoff");
   pdf_running_link_on_node: print_esc("pdfrunninglinkon");
+  pdf_space_font_code: print_esc("pdfspacefont");
   othercases print("[unknown extension!]")
   endcases;
 
@@ -33939,6 +33951,7 @@
   pdf_fake_space_node: @<Implement \.{\\pdffakespace}@>;
   pdf_running_link_off_node: @<Implement \.{\\pdfrunninglinkoff}@>;
   pdf_running_link_on_node: @<Implement \.{\\pdfrunninglinkon}@>;
+  pdf_space_font_code: @<Implement \.{\\pdfspacefont}@>;
 othercases confusion("ext1")
 @:this can't happen ext1}{\quad ext1@>
 endcases;
@@ -35323,6 +35336,14 @@
     new_whatsit(pdf_running_link_on_node, small_node_size);
 end
 
+@ @<Implement \.{\\pdfspacefont}@>=
+begin
+    check_pdfoutput("\pdfspacefont", true);
+    scan_pdf_ext_toks;
+    pdf_space_font_name := tokens_to_string(def_ref);
+    delete_token_ref(def_ref);
+end
+
 @ The following function are needed for outputting article thread.
 
 @<Declare procedures needed in |do_ext...@>=
@@ -36182,6 +36203,7 @@
 @!pdf_trailer_id_toks: pointer; {custom Trailer ID}
 @!gen_faked_interword_space: boolean; {flag to turn on/off faked interword spaces}
 @!gen_running_link: boolean; {flag to turn on/off running link}
+@!pdf_space_font_name: str_number; {name of font used for inter-word space in PDF output}
 
 @ @<Set init...@>=
 pdf_first_outline:= 0;
@@ -36199,7 +36221,9 @@
 pdf_trailer_id_toks := null;
 gen_faked_interword_space := false;
 gen_running_link := true;
+pdf_space_font_name := "pdftexspace";
 
+
 @ The following procedures are needed for outputting whatsit nodes for
 \pdfTeX{}.
 

Modified: branches/stable/source/src/texk/web2c/pdftexdir/ptexlib.h
===================================================================
--- branches/stable/source/src/texk/web2c/pdftexdir/ptexlib.h	2023-02-03 09:55:48 UTC (rev 892)
+++ branches/stable/source/src/texk/web2c/pdftexdir/ptexlib.h	2023-02-10 09:38:11 UTC (rev 893)
@@ -180,11 +180,13 @@
 /* mapfile.c */
 extern boolean hasfmentry(internalfontnumber);
 extern boolean isscalable(internalfontnumber);
+extern boolean hasspacechar(internalfontnumber);
 extern void fm_free(void);
 extern void fm_read_info(void);
 extern ff_entry *check_ff_exist(char *, boolean);
 extern void pdfmapfile(integer);
 extern void pdfmapline(integer);
+extern void pdfmaplinesp(void);
 extern void pdfinitmapfile(const_string map_name);
 extern fm_entry *new_fm_entry(void);
 extern void delete_fm_entry(fm_entry *);

Modified: branches/stable/tests/28-fake-interword-space-updated/Makefile
===================================================================
--- branches/stable/tests/28-fake-interword-space-updated/Makefile	2023-02-03 09:55:48 UTC (rev 892)
+++ branches/stable/tests/28-fake-interword-space-updated/Makefile	2023-02-10 09:38:11 UTC (rev 893)
@@ -2,7 +2,6 @@
 
 test:
 	$(pdftex2) -ini fake-interword-space.tex
-	# $(pdftex2) -ini f.tex
 
 clean:
 	$(clean)

Modified: branches/stable/tests/28-fake-interword-space-updated/fake-interword-space.tex
===================================================================
--- branches/stable/tests/28-fake-interword-space-updated/fake-interword-space.tex	2023-02-03 09:55:48 UTC (rev 892)
+++ branches/stable/tests/28-fake-interword-space-updated/fake-interword-space.tex	2023-02-10 09:38:11 UTC (rev 893)
@@ -1,15 +1,31 @@
 \input plain.tex
 \input pdftexconfig.tex
 \input pdftexmagfix.tex
-\font\f=texnansi-lmr10\f
 
 \pdfcompresslevel=0
 \pdfobjcompresslevel=0
+\footline={}
+
+% \pdfspacefont{texnansi-lmr10} % if not specified then `pdftexspace` will be used
+
+
 \long\def\lorem{
+\par
 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin risus nisl, rutrum vel erat et, sollicitudin rutrum mauris. Donec fermentum sem ut nibh consectetur placerat. Cras et dui lacus. Vivamus in turpis aliquet, porta massa ut, bibendum erat. Nulla in bibendum nisi. Nunc egestas tellus augue, vel auctor metus venenatis non. Ut viverra gravida neque a eleifend. Morbi ipsum nisl, finibus sed nisl vitae, aliquet viverra nunc.\par
 }
 
+\font\fa=cmr10\fa cmr10
+
+\pdfinterwordspaceoff pdfinterwordspaceoff
 \lorem
-\pdfinterwordspaceon
+\pdfinterwordspaceon pdfinterwordspaceon
 \lorem
+
+\font\fb=texnansi-lmr10\fb texnansi-lmr10
+
+\pdfinterwordspaceoff pdfinterwordspaceoff
+\lorem
+\pdfinterwordspaceon pdfinterwordspaceon
+\lorem
+
 \bye



More information about the pdftex-commits mailing list.