Skip to content

PPTX: a bottom-anchored 125% spcPct cover title reserves 6.73pt too much below its last baseline, seating the block 6.85pt high #1864

Description

@developer0hye

Problem

Page 1 of GENERAL SERVICES.pptx (#1220) is a bottom-anchored ctrTitle
placeholder holding one hard-broken 50pt Gill Sans MT paragraph at
<a:lnSpc><a:spcPct val="125000"/>. Its line advance matches a native
PowerPoint export, but the whole two-line block seats 6.85pt above it: our
block reserves 6.73pt more space below its last baseline than PowerPoint does,
and the bottom anchor pushes the excess upward.

No font substitution is involved — pdffonts reports GillSansMT-Bold
embedded on page 1 of both PDFs.

Measurement

mutool draw -F trace, page 1, in points from the page top:

Quantity native PowerPoint office2pdf delta
GENERAL SERVICES baseline 234.960 228.114 -6.846
MARKETING PLAN baseline 309.840 303.114 -6.726
advance between them 74.880 75.000 +0.120
box bottom - last baseline 15.874 22.600 +6.726

The advance is 1.25 x 1.2 x 50pt = 75.00pt, and the export's 74.88 is that
value on its 0.24pt device grid — so the pacing model is right and only the
reserve below the last baseline is wrong.

Subtracting the default bIns of 3.6pt, the descent below the last baseline is
12.274pt native (0.2455em at 50pt) against our 19.000pt (0.3800em). A fix
session should measure whether the spcPct percentage is reaching that descent;
A native one-factor probe already recorded for this project found that
<a:lnSpc><a:spcPct> resizes a line from the top and leaves the descent
below the baseline unchanged.

Source

ppt/slides/slide1.xml, <p:sp> id 2 (<p:ph type="ctrTitle"/>),
<a:off y="2008518"/> <a:ext cy="2128049"/> — box top 158.152pt, height
167.563pt, bottom 325.714pt:

<a:pPr><a:lnSpc><a:spcPct val="125000"/></a:lnSpc></a:pPr>
<a:r><a:rPr lang="en-US" sz="5000"/><a:t>GENERAL SERVICES</a:t></a:r>
<a:br><a:rPr lang="en-US" sz="5000"/></a:br>
<a:r><a:rPr lang="en-US" sz="5000"/><a:t>MARKETING PLAN</a:t></a:r>
<a:endParaRPr lang="en-US" sz="5000"/>

ppt/slideLayouts/slideLayout1.xml gives the placeholder
<a:bodyPr anchor="b"/> and <a:lvl1pPr algn="ctr"><a:lnSpc><a:spcPct val="125000"/></a:lnSpc><a:defRPr sz="6000">.

Reproduction

  • Input: GENERAL SERVICES.pptx (SHA-256 17924ec3b27646a2c1b2bb711b845360b713cc7052b3cdde9df752f9ceded3a9), page 1.
  • Reference: the cached native PowerPoint 16.113.1 export, SHA-256
    adec062605a45f1b6884252e9f4e199dee2da029e975845c258f4a7c38c820e1, or a fresh
    osascript scripts/macos/export_powerpoint_pdfs.applescript <out> native <staged.pptx>
    from inside ~/Library/Containers/com.microsoft.Powerpoint/Data/probes/.
  • python3 scripts/compare_layout.py --audit --fine-shift 0.12 gt.pdf out.pdf
    on the page-1 extract.

Expected

The bottom-anchored block reserves PowerPoint's descent below its last
baseline, so both title baselines land within the export's 0.24pt quantum.

Actual

Both baselines sit 6.7-6.9pt high because the reserve below the last baseline is
6.73pt too large.

Note on provenance

Found while fixing #1666, which corrected the style a <a:br> contributes to
the line it ends. Before that fix this page read -6.18pt rather than -6.85pt:
the break carried the layout's 60pt <a:defRPr> and its oversized box happened
to cancel 0.67pt of this deviation. The advance was, and remains, correct.

Following the precedent of #1862, this is filed from trace measurements rather
than a compare.jpg; a fix PR should add the side-by-side image the visual
contract asks for.

Related: #1220, #1666, #1254

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions