Re: pdftex Digest, Vol 190, Issue 2

Doug McKenna <doug-Nf2trSL5CZG0AFT+FuuGOlaTQe2KTcn/@public.gmane.org> Tue, 27 Feb 2024 11:46:18 -0700 (MST)
Newsgroups gmane.comp.tex.pdftex
Message-ID <160958237.4179948.1709059578435.JavaMail.zimbra@mathemaesthetics.com>
  \interlinepenalties 3 10 20 30
  \clubpenalties 3 66 77 88


The etex.ch file introduces code to add the interlinepenalties to the clubpenalties:


@x [39] m.890 l.17427 - eTeX penalties
  begin pen:=inter_line_penalty;
  if cur_line=prev_graf+1 then pen:=pen+club_penalty;
  if cur_line+2=best_line then pen:=pen+final_widow_penalty;
@y
  begin q:=inter_line_penalties_ptr;
  if q<>null then
    begin r:=cur_line;
    if r>penalty(q) then r:=penalty(q);
    pen:=penalty(q+r);
    end
  else pen:=inter_line_penalty;
  q:=club_penalties_ptr;
  if q<>null then
    begin r:=cur_line-prev_graf;
    if r>penalty(q) then r:=penalty(q);
    pen:=pen+penalty(q+r);
    end
  else if cur_line=prev_graf+1 then pen:=pen+club_penalty;
  if d then q:=display_widow_penalties_ptr
  else q:=widow_penalties_ptr;
  if q<>null then
    begin r:=best_line-cur_line-1;
    if r>penalty(q) then r:=penalty(q);
    pen:=pen+penalty(q+r);
    end
  else if cur_line+2=best_line then
    if d then pen:=pen+display_widow_penalty
    else pen:=pen+widow_penalty;
@z

but the plain text run log file shows no adding:

Completed box being shipped out [1]
\vbox(667.20255+0.0)x469.75499
.\vbox(0.0+0.0)x469.75499, glue set 14.0fil
..\glue -22.5
..\hbox(8.5+0.0)x469.75499, glue set 469.75499fil
...\vbox(8.5+0.0)x0.0
...\glue 0.0 plus 1.0fil
..\glue 0.0 plus 1.0fil minus 1.0fil
.\vbox(643.20255+0.0)x469.75499, glue set 585.20255fill
..\glue(\topskip) 5.69446
..\hbox(4.30554+0.0)x469.75499
...\hbox(0.0+0.0)x20.0
...\tenrm a
...\penalty -10000
...\glue(\rightskip) 0.0
..\penalty 66
..\glue(\baselineskip) 5.05556
..\hbox(6.94444+0.0)x469.75499, glue set 273.18797
...\tenrm b
...\tenrm b
...\glue 3.33333 plus 1.66666 minus 1.11111
...\penalty -10000
...\glue(\rightskip) 0.0
..\penalty 77
..\glue(\baselineskip) 7.69446
..\hbox(4.30554+0.0)x469.75499, glue set 277.18802
...\tenrm c
...\glue 3.33333 plus 1.66666 minus 1.11111
...\penalty -10000
...\glue(\rightskip) 0.0
..\penalty 88
..\glue(\baselineskip) 5.05556
..\hbox(6.94444+0.0)x469.75499, glue set 276.52135
...\tenrm d
...\glue 3.33333 plus 1.66666 minus 1.11111
...\penalty -10000
...\glue(\rightskip) 0.0
..\penalty 238
..\glue(\baselineskip) 7.69446
..\hbox(4.30554+0.0)x469.75499, glue set 465.31055fil
...\tenrm e
...\penalty 10000
...\glue(\parfillskip) 0.0 plus 1.0fil
...\glue(\rightskip) 0.0
..\glue 0.0 plus 1.0fill
.\glue(\baselineskip) 17.55556
.\hbox(6.44444+0.0)x469.75499, glue set 232.37749fil
..\glue 0.0 plus 1.0fil minus 1.0fil
..\tenrm 1
..\glue 0.0 plus 1.0fil minus 1.0fil


I tried your sample code in my own private JSBox interpreter, which I developed using the etex.ch file to understand the algorithms to write my code.  Mine adds them (the right thing, as near as I can tell).  Here's the JSBox log for shipped page:

Shipping out a completed page with \count 0..0 = [1]:
  vbox : [id=15] (667.20255 + 0.0) ✕ 469.75499 [rigid], contains 4 items
    vbox : [id=12] (0.0 + 0.0) ✕ 469.75499, stretched using 14.0fil, contains 3 items
      glue : [\vskip] -22.5
      hbox : [id=11] (8.5 + 0.0) ✕ 469.75499, stretched using 469.755fil, contains 2 items
        vbox : [id=10] (8.5 + 0.0) ✕ 0.0 [empty]
        glue : [\hfil] 0.0 plus 1.0fil
      glue : [\vss] 0.0 plus 1.0fil minus 1.0fil
    vbox : [id=13] (643.20255 + 0.0) ✕ 469.75499, stretched using 585.20251fill, contains 15 items
      glue : [\topskip] 5.69446
      hbox : [id=4] (4.30554 + 0.0) ✕ 469.75499, contains 4 items
             [uses font \tenrm = cmr10.tfm [unscaled]]
        hbox : [id=3, \parindent] (0.0 + 0.0) ✕ 20.0 [rigid] [empty]
        text : \tenrm a                                   [1 char, wd=5.00002pt] [`a = "61 =  97]
        cost : \penalty -10000 [always]
        glue : [\rightskip] 0.0
      cost : \penalty 76
      glue : [\baselineskip (adjusted)] 5.05556
      hbox : [id=5] (6.94444 + 0.0) ✕ 469.75499, stretched using 273.18799, contains 5 items
             [uses font \tenrm = cmr10.tfm [unscaled]]
        text : \tenrm bb                                  [2 chars, total wd=11.11115pt] [`b = "62 =  98] [`b = "62 =  98]
        glue : [interword space] 3.33333 plus 1.66666 minus 1.11111
        cost : \penalty -10000 [always]
        glue : [\rightskip] 0.0
      cost : \penalty 97
      glue : [\baselineskip (adjusted)] 7.69446
      hbox : [id=6] (4.30554 + 0.0) ✕ 469.75499, stretched using 277.18802, contains 4 items
             [uses font \tenrm = cmr10.tfm [unscaled]]
        text : \tenrm c                                   [1 char, wd=4.44444pt] [`c = "63 =  99]
        glue : [interword space] 3.33333 plus 1.66666 minus 1.11111
        cost : \penalty -10000 [always]
        glue : [\rightskip] 0.0
      cost : \penalty 118
      glue : [\baselineskip (adjusted)] 5.05556
      hbox : [id=7] (6.94444 + 0.0) ✕ 469.75499, stretched using 276.52133, contains 4 items
             [uses font \tenrm = cmr10.tfm [unscaled]]
        text : \tenrm d                                   [1 char, wd=5.55557pt] [`d = "64 = 100]
        glue : [interword space] 3.33333 plus 1.66666 minus 1.11111
        cost : \penalty -10000 [always]
        glue : [\rightskip] 0.0
      cost : \penalty 268
      glue : [\baselineskip (adjusted)] 7.69446
      hbox : [id=8] (4.30554 + 0.0) ✕ 469.75499, stretched using 465.31055fil, contains 4 items
             [uses font \tenrm = cmr10.tfm [unscaled]]
        text : \tenrm e                                   [1 char, wd=4.44444pt] [`e = "65 = 101]
        cost : \penalty 10000 [never]
        glue : [\parfillskip] 0.0 plus 1.0fil
        glue : [\rightskip] 0.0
      glue : [\vfill] 0.0 plus 1.0fill
    glue : [\baselineskip (adjusted)] 17.55556
    hbox : [id=14] (6.44444 + 0.0) ✕ 469.75499, stretched using 232.37749fil, contains 3 items
           [uses font \tenrm = cmr10.tfm [unscaled]]
      glue : [\hss] 0.0 plus 1.0fil minus 1.0fil
      text : \tenrm 1                                   [1 char, wd=5.00002pt] [`1 = "31 =  49]
      glue : [\hss] 0.0 plus 1.0fil minus 1.0fil


76  = 66 + 10
97  = 77 + 20
118 = 88 + 30

268 = 238 + 30


So it's a mystery to me what "reality" is here, or where a bug may have been introduced.  Sure seems like cumulative penalties is the intent, especially given the original tex.web code that etex.ch changes.

Doug McKenna