mcpField
M
morph-ppt

morph-ppt

github.com/iofficeai文档处理32.7k127 次安装今天更新
代码仓库

关于 morph-ppt

morph-ppt 是 officecli-pptx 的扩展技能,用于通过 Morph 转场制作 PowerPoint 演示文稿,重点讲解跨页形状命名、运动规划及 Morph 行为和渲染限制检查。

主要功能

  1. 01按名称配对跨页形状
  2. 02规划角色的移动与退场
  3. 03设置 Morph 幻灯片转场
  4. 04使用场景、角色和页面前缀
  5. 05检查 Morph 渲染限制

适用场景

  1. 01制作形状跨页移动的演示文稿
  2. 02让视觉元素在连续幻灯片间变换
  3. 03为受支持的演示文稿查看器准备 Morph

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/iofficeai/officecli --skill morph-ppt

安装后在 Claude Code 中输入/morph-ppt确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

reference/
decision-rules.md
morph-helpers.py
morph-helpers.sh
pptx-design.md
reference/styles/bw--brutalist-raw/
build.sh
bw__brutalist_raw.pptx
style.md
reference/styles/bw--mono-line/
build.sh
bw__mono_line.pptx
style.md
reference/styles/bw--swiss-bauhaus/
build.sh
bw__swiss_bauhaus.pptx
style.md
reference/styles/bw--swiss-system/
style.md
reference/styles/dark--architectural-plan/
build.sh
dark__architectural_plan.pptx
style.md
reference/styles/dark--aurora-softedge/
style.md
reference/styles/dark--blueprint-grid/
build.sh
dark__blueprint_grid.pptx
style.md
reference/styles/dark--circle-digital/
build.sh
dark__circle_digital.pptx
style.md
reference/styles/dark--cosmic-neon/
build.sh
dark__cosmic_neon.pptx
style.md
reference/styles/dark--cyber-future/
build.sh
dark__cyber_future.pptx
style.md

详细介绍

OfficeCLI Morph-PPT 技能

本技能是构建在 officecli-pptx 之上的场景层。 所有 pptx 硬性规则(视觉交付底线:标题 ≥ 36pt / 正文 ≥ 18pt / 标题 ≥ 2× 正文;33.87×19.05cm 上的 12 列网格;标准配色;图表选择决策表;连接线规范;shell 转义;常驻与批处理;交付门禁 1–5a)全部继承自基础技能,不在此重复讲解。本文件仅补充 Morph 所需内容:跨幻灯片的形状名绑定、场景演员(Scene Actors)与内容前缀的区别、幽灵(ghost)使用规范、transition=morph 的 CLI 特性、52 种风格的视觉库查询,以及针对 morph 的独立视角门禁 5b 扩展。

凡基础 pptx 规则已覆盖的内容,本文以 → see pptx v2 §X 标注。若尚未阅读,请先阅读 skills/officecli-pptx/SKILL.md。

安装

如果缺少 officecli:

  • macOS / Linux:curl -fsSL https://d.officecli.ai/install.sh | bash
  • Windows(PowerShell):irm https://d.officecli.ai/install.ps1 | iex

使用 officecli --version 验证安装(若 PATH 未生效,请打开新终端)。若安装失败,请从 https://github.com/iOfficeAI/OfficeCLI/releases 下载二进制文件。

⚠️ 帮助优先规则

本技能讲解的是 Morph 工作流——何时必须匹配形状名、何时使用幽灵、CLI 何时自动添加前缀——而非每一个命令参数。 当属性名、枚举值或预设不确定时,请先查阅帮助,再进行猜测。

officecli help pptx slide           # authoritative for: transition, advanceTime, advanceClick, background
officecli help pptx transition      # transition / transitionDuration / transitionSpeed (Parent: slide)
officecli help pptx shape           # name, preset, x/y/width/height, fill, rotation, opacity, animation
officecli help pptx animation       # preset + trigger + duration values
officecli help pptx <element> --json  # machine-readable schema

帮助信息反映已安装的 CLI 版本。若技能文档与帮助信息不一致,以帮助为准。 本文件中每个 --prop X= 均已通过 officecli help pptx <element> 核对。具体确认项:transition=morph 是 slide 上的合法取值;advanceTime / advanceClick 均为有效属性。transition 是一个真实元素(officecli help pptx transition,父元素:slide,支持 set/get),它暴露 transition、transitionDuration 和 transitionSpeed 三个属性。使用高级路径 set <slide> --prop transition=morph 设置切换效果;如需调整速度/时长,使用组合简写 transition=morph-slow(或 -fast,或 transition=morph-<DUR_MS>)。速度/时长只能通过 transition 属性上的该简写设置,不能作为独立的子属性。两者在读回时均可往返一致:transition=morph-slow/-fast 读回为 transitionSpeed=slow/fast,transition=morph-<DUR_MS>(例如 morph-1500)读回为 transitionDuration=1500。

思维模型与继承关系

继承自 pptx v2。 你应当先阅读 skills/officecli-pptx/SKILL.md。本技能假定你已掌握以下内容:添加幻灯片、形状、图表与连接线;通过 @name= / @id= 寻址;引用路径;使用 batch heredoc;在流程连接线上使用 tailEnd=triangle;执行交付检查门 1–5a;区分 [AGENT-ERROR]、[RENDERER-BUG] 与 [SKILL gap]。如果其中任何内容不熟悉,请先阅读 pptx v2。

从 pptx v2 继承(不要重复讲解):

  • 视觉交付底线:标题 ≥ 36pt / 正文 ≥ 18pt / 标题 ≥ 2× 正文,封面内容丰富度,对比度底线,不得出现 \$\t\n 字面量,每张幻灯片 ≤ 1 个动画 / ≤ 600ms。
  • 网格计算:33.87 × 19.05cm,边距 ≥ 1.27cm,块间距 ≥ 0.76cm,负空间 ≥ 20%。对于 N 列卡片网格:col = (33.87 − 2·margin − (N−1)·gap) / N。
  • 四套标准配色(Executive 海军蓝 / Forest & moss 森林绿 / Warm terracotta 暖陶土 / Charcoal minimal 木炭极简)——morph 演示文稿可以从 reference/styles/ 中选择不同风格,但对比度规则依然适用。
  • 图表选择表:柱形图 vs 条形图 vs 折线图 vs 饼图 vs 散点图 vs 大字号 KPI;> 3 个系列 + > 8 个类别 时需拆分。
  • 连接线规范:shape=straight|elbow|curve,起止点使用 @id=(C-P-6),每条流程线都要使用 tailEnd=triangle。
  • Shell 转义三层规则:$ 使用单引号包裹,batch 使用 heredoc,真正的换行使用 <a:br/>。
  • 常驻模式与 batch ≤ 12 个操作,使用 <<'EOF' 单引号定界符。
  • 交付检查门 1–5a(schema、token 检索、超链接 rPr、幻灯片顺序、深色叠深色)——每一项检查门都必须输出 OK,才能宣布完成。
  • 已知问题 C-P-1..7(超链接 rPr、图表 spPr 警告、动画时长回读、动画移除、连接线枚举、连接线 @name=、图表颜色渲染器归一化)。
  • 问题归因分类:[AGENT-ERROR] vs [RENDERER-BUG] vs [SKILL gap]。

Morph 专属身份——本技能负责的内容(在 pptx v2 基础上的增量):

  • 跨幻灯片形状名称绑定。 PowerPoint 的 Morph 引擎通过相邻幻灯片上完全相同的 name= 来配对形状,并对其位置 / 尺寸 / 旋转 / 填充 / 不透明度进行插值。没有匹配的名称就不会产生动画,只会出现无声的淡入淡出。这是一种工作流纪律,而不是 CLI 功能。
  • 命名空间前缀: !!scene-*(持久装饰,从不隐藏)/ !!actor-*(先演变再退出的内容)/ #sN-*(逐页内容,在第 N+1 页上隐藏)。在执行 add 之前就要规划好名称。
  • 隐藏位置 x=36cm(位于 33.87cm 画布的右边缘之外)。切勿删除带 !! 前缀的形状——应将其移出画布,以保证 morph 退出动画仍然播放。
  • transition=morph 自动前缀特性。 CLI 会在 morph 幻灯片的每个形状前自动加上 !!(#s1-title 会被存储为 !!#s1-title)。@name= 路径选择器仍然可以解析——get .../shape[@name=#s1-title] 会返回该形状(匹配容忍后缀/前缀)。读回的名称是带前缀的形式。参见 §已知问题。
  • 相邻幻灯片的空间变化。 相邻幻灯片对之间的位移 ≥ 5cm 或旋转 ≥ 15°——否则 morph 插值不会产生任何可见效果。
  • 渲染器现实情况。 Morph 可在 PowerPoint 365 / Keynote / WPS 中渲染。LibreOffice 及许多网页查看器会将其渲染为普通淡入淡出(运行时特性)。这不是技能缺陷,应归类为 [RENDERER-BUG]。
反向交接——何时返回 pptx 基础技能(或相关技能)

对于没有跨幻灯片运动的演示文稿(董事会汇报、销售演示、全员大会、培训),请继续使用 pptx v2 基础。对于不使用 morph 的融资叙事结构,请使用 officecli-pitch-deck。仅当用户明确要求"morph"/"平滑过渡"/"连续动画",且 ≥ 2 张连续幻灯片共享一个会发生变形的视觉元素时,才使用本技能。仅指一次性入场动画的"动画演示文稿"应使用 pptx v2 §动画,而非 morph。

Shell 与执行规范

Shell 引号、增量执行、$FILE 约定 → 参见 pptx v2 §Shell & Execution Discipline。规则完全相同。

Morph 专属补充:

  • shell 值中的 !! —— 使用单引号。 Bash / zsh 的历史展开会吞掉未加引号的 !!foo。务必使用 --prop 'name=!!scene-ring'(单引号)。在 Python subprocess.run([...]) 列表中无需加引号,直接将 "name=!!scene-ring" 作为普通字符串传入即可。
  • prop 文本中的 $ —— 使用单引号(价格符号)。 使用 --prop text='$9/mo' 和 --prop text='$199/yr',切勿使用 --prop text="$9/mo"(zsh/bash 会把 $9 当作空变量吞掉,导致文本显示为 . 或多余的句号)。对于双引号 prop 中的 ${VAR}、$USER、\n、\r、\t 同样适用。下方的 Gate 2 Morph 补充规则会检查此类泄漏特征。
  • shell 值中的 # —— 安全,但仍建议加引号。 # 只有在 shell 单词开头才是注释符。--prop name=#s1-title 可以正常工作,但 --prop 'name=#s1-title' 是避免猜测的习惯写法。
  • 批量 heredoc 是多形状幻灯片最清晰的方式。 <<'EOF' | officecli batch $FILE 会禁用所有 shell 展开,JSON 正文中的 $、!!、#、' 都可以安全使用。
  • --json 响应将数据包裹在 .data.results[] 中。 query 和 get 都返回 .data.results[] 数组。单个节点的 format 位于 .data.results[0].format.X;该节点的子节点位于 .data.results[0].children[](每个子节点的 format 位于 .data.results[0].children[].format.X)。务必通过 .data.results[0] 访问——直接使用 .data.children[] 或 .data.format 会静默返回 null。
  • 变量: 在每个构建脚本顶部设置 FILE="deck.pptx";以下所有示例均使用 $FILE。
  • 门禁 shell 模式 —— 先计数,再 if/else。 切勿编写 grep … && echo LEAK || echo OK——当 grep 退出码为 1(0 个匹配)时,|| 分支会在标准输出为空的情况下触发,造成混淆地打印 "OK"(或因前面的管道打印 "LEAK")。标准写法:COUNT=$(cmd | wc -l); if [ "$COUNT" -gt 0 ]; then echo "LEAK: …"; else echo "OK"; fi。

本技能负责的两个基本概念

  • Scene Actors(场景演员) = 持久的 !! 命名形状(装饰或内容),在相邻幻灯片之间按完全相同的名称配对,以便 Morph 进行插值。每个 !!scene-* / !!actor-* 形状都是一个场景演员。
  • Choreography(编排) = 关于演员如何变化的计划——谁移动到哪里、谁进入、谁退出,发生在哪一对幻灯片之间。必须在代码之前写在 §Morph Pair Planning 表格中。

当用户要求 morph 动效,且至少有 2 张连续幻灯片共享一个会发生变形的视觉元素时,使用本技能。目标观看端注意:morph 需要 PowerPoint 365 / Keynote / WPS——如果用户仅使用 LibreOffice,请先发出警告(参见 §Renderer honesty)。

演讲者备注规则。 每张内容幻灯片(非封面、非结束页)都必须通过 officecli add "$FILE" /slide[N] --type notes --prop text='…' 添加演讲者备注。缺少备注 = 不可交付,继承自 pptx v2 §Hard rules(H7)。Morph 演示文稿通常视觉上较为简约,因此备注承载解说内容。

Morph 是什么(核心机制)

PowerPoint 的 Morph 切换通过在相邻幻灯片之间插值形状属性来实现平滑动效,匹配依据是完全相同的形状名称。

Slide 1: shape name="!!scene-ring" x=5cm  width=8cm   fill=E94560 opacity=0.3
Slide 2: shape name="!!scene-ring" x=20cm width=12cm fill=E94560 opacity=0.6
         ↓  transition=morph on slide 2
Result:  Ring smoothly moves, grows, and fades darker over ~1 second

只有当第 N+1 张幻灯片带有 transition=morph 时,Morph 才会运行。可在创建时通过 officecli add / --type slide --prop transition=morph 应用,或事后通过 officecli set "/slide[N]" --prop transition=morph 设置。未包含该属性的第 2 张及以后的幻灯片将回退到母版定义的任何切换效果(通常为无切换),动效会悄无声息地失效。

三前缀命名体系(不可协商):

前缀角色生命周期示例
!!scene-*背景 / 装饰,贯穿整个演示文稿设置一次,通过调整位置/尺寸制造动感;很少被移出画布!!scene-ring、!!scene-bg-band、!!scene-grid
!!actor-*内容 / 前景,在一个章节内持续演变在第 N 页引入,在第 N+1、N+2……页修改,在其退出页移至 x=36cm(幽灵化)!!actor-feature-box、!!actor-metric、!!actor-headline
#sN-*每页内容(标题、要点、说明文字)在第 N 页新增,在第 N+1 页移至 x=36cm(幽灵化)#s1-title、#s2-kpi、#s3-caption

硬性规则: !!scene-* 与 !!actor-* 名称绝不能冲突(例如同一演示文稿中同时存在 !!scene-card 与 !!actor-card,morph 引擎会将二者混淆)。请加以区分:!!scene-card-bg 与 !!actor-card-content。

图表可以参与 morph 配对。 officecli add … --type chart 接受 --prop name=!!…(名称可回读),因此相邻页上名称相同的 !! 图表会参与形状名称 morph 配对,图表框架会对位置/尺寸进行插值。注意:morph 无法对图表框架内的绘图数据进行插值。对于必须让柱体本身产生动画的柱状图增长 / 折线图增长叙事,可选择:(a) 直接接受图表的普通淡入效果;或 (b) 手动构建 N 个按数值调整尺寸的 !!actor-bar-K 矩形,并对这些矩形进行 morph。每个矩形在相邻页上使用相同的 !!actor-bar-K 名称,宽度 / 高度 / 填充色随之演变。

幽灵残留无提示。 一旦某个 !! 前缀形状出现在任意一页,除非被明确移至 x=36cm,它将在之后每一张 morph 页上保持可见。final-check 辅助工具不会检测可见区域内残留的 !! 形状——只有第 5b 关的截图审查才能发现。 在编写代码之前,请先在配对表中规划好每个 actor 的退出页。

空间变化规则。 相邻页面的构图必须明显不同:至少 3 个 morph 配对形状需满足位移 ≥ 5cm、或旋转 ≥ 15°、或尺寸变化 ≥ 30%。否则 morph 无法插值出可见差异,转场会退化为淡入淡出(静默失效)。

同时计时约束。 同一 morph 配对中的所有 !! 形状会同时播放动画。若要让形状 A 先于形状 B 出现,需插入一个中间关键帧页面——不存在逐形状延迟的设置项。

配对、进入与退出——一种规则,三种行为。 同一机制(形状名称匹配)会产生三种结果:

行为源页面 A目标页面 B哪一方携带 !!?
配对 morph(插值)含 !!foo含 !!foo两页,名称完全相同
进入(淡入 / morph 进入)—(无对应形状)含 !!foo仅目标页——新形状
通过幽灵化退出(滑出)含 !!foo,位于可见 x含 !!foo,位于 x=36cm两页——名称相同,B 页中已移出画布

需要加 !! 前缀并幽灵化的是离场内容,而非入场内容。 若忘记处理,!!actor-* 形状会悄然“消失”——它们在 B 页上名称缺失,会被视为无配对的退出(普通淡出)。因此务必显式将其幽灵化至 x=36cm,使退出动画能明显地从右边缘滑出。下面是一个可直接运行的示例:

# Slide 2: actor is visible at x=5cm — Slide 3: same name, ghosted off-canvas → visible slide-off motion
officecli add "$FILE" "/slide[3]" --type shape --prop 'name=!!actor-metric' \
  --prop text="42%" --prop x=36cm --prop y=8cm --prop width=6cm --prop height=3cm

内容(#sN-*)每页单独新增。 由于每页文字都会变化,Morph 对标题 / 正文没有有意义的配对可做,只会对其进行交叉淡化。因此 #sN-* 每页使用不同名称(有意不配对),并且必须在第 N+1 页幽灵化。场景角色(!!)负责保持连续性;内容(#)负责传递信息。

Morph 配对规划(编码前,必需)

在规划 morph 配对之前,如果演示文稿的受众、目的或叙事线索不够明确,请先运行 reference/decision-rules.md 中的规划提示词,生成 brief.md。没有叙事主线的 morph 动画会变成“带动效的幻灯片”,而不是“带动效的故事”。

在编写任何 officecli add 之前,先在 brief.md 中用表格规划每一次转场。构建过程中途重命名形状,是造成残影累积缺陷的头号原因。

配对幻灯片 A(起始)幻灯片 B(结束)涉及的角色幻灯片 B 上的残影
1→2!!scene-ring 居中,5cm,#s1-title 可见圆环移至 x=20cm,尺寸由 8cm 放大到 12cm;#s2-subtitle 显示!!scene-ring 演变#s1-title → x=36cm
2→3!!actor-feature-box 较大(宽 14cm)特性框缩小(6cm),!!actor-metric 进入!!scene-ring、!!actor-feature-box、!!actor-metric#s2-subtitle → x=36cm
3→4内容章节 A章节 B 分隔页—!!actor-feature-box 与 !!actor-metric → x=36cm(章节退场);#s3-* → x=36cm

规划规则:

  1. 预先确定所有 !! 名称:每个参与 morph 配对的形状,在两张幻灯片上必须使用完全相同的名称。
  2. 将每个 !! 形状归类为 !!scene-* 或 !!actor-*。scene 形状持续存在;actor 形状必须规划好退场的幻灯片。
  3. 章节转场边界: 进入新的主题章节时,在新章节的第一张幻灯片上,为前一章节所有 !!actor-* 添加残影。仅保留 !!scene-*(整份演示文稿的装饰元素)。
  4. 在表格完成之前,不要开始构建。如果构建过程中计划发生变化,请重新绘制表格并重新验证受影响的幻灯片。

Morph 配方(4 种模式)

四种模式覆盖约 95% 的 morph 演示文稿。全文使用 $FILE="deck.pptx"。每个代码块都是独立的,且不超过 20 行。

(a) 单元素 morph:尺寸 / 位置

视觉效果。 第 1 张幻灯片中,一个主视觉标题居中显示(48pt,y=8cm);第 2 张幻灯片中,它缩小到 32pt 并移动到左上角(x=1.5cm,y=1cm),让第 2 张幻灯片的新内容成为视觉焦点。只有一个形状,动效简洁,没有 actor。

FILE="deck.pptx"
officecli create "$FILE"; officecli open "$FILE"

# Slide 1 — hero
officecli add "$FILE" / --type slide --prop layout=blank --prop background=1E2761
officecli add "$FILE" /slide[1] --type shape --prop 'name=!!actor-headline' \
  --prop text="The one idea" --prop x=4cm --prop y=8cm --prop width=26cm --prop height=3cm \
  --prop font=Georgia --prop size=48 --prop bold=true --prop color=FFFFFF --prop align=center --prop fill=none

# Slide 2 — headline shrinks + moves; new body takes stage
officecli add "$FILE" / --type slide --prop layout=blank --prop background=1E2761 --prop transition=morph
officecli add "$FILE" /slide[2] --type shape --prop 'name=!!actor-headline' \
  --prop text="The one idea" --prop x=1.5cm --prop y=1cm --prop width=12cm --prop height=1.5cm \
  --prop font=Georgia --prop size=24 --prop bold=true --prop color=FFFFFF --prop align=left --prop fill=none
officecli add "$FILE" /slide[2] --type shape --prop 'name=#s2-body' \
  --prop text="Here is the supporting evidence." --prop x=1.5cm --prop y=5cm --prop width=30cm --prop height=2cm \
  --prop font=Calibri --prop size=20 --prop color=CADCFC --prop fill=none

officecli close "$FILE"; officecli validate "$FILE"
(b) 多元素协调 morph:Actors / Choreography

视觉效果。 三个 scene actor(!!scene-ring、!!scene-dot、!!scene-band)在 3 张幻灯片之间重新定位,形成类似镜头平移的效果。每张幻灯片的标题通过 #sN-* 残影模式淡入淡出。当叙事具有连续的视觉背景时使用此模式。

# Slide 1 — anchor composition (already built via recipe a; here we add actors)
officecli add "$FILE" /slide[1] --type shape --prop 'name=!!scene-ring' --prop preset=ellipse \
  --prop fill=E94560 --prop opacity=0.3 --prop x=5cm --prop y=3cm --prop width=8cm --prop height=8cm
officecli add "$FILE" /slide[1] --type shape --prop 'name=!!scene-dot' --prop preset=ellipse \
  --prop fill=0F3460 --prop x=28cm --prop y=15cm --prop width=1cm --prop height=1cm

# Slide 2 — morph: ring moves + grows, dot slides left (spatial variety ≥ 5cm on both)
officecli set "$FILE" "/slide[2]" --prop transition=morph
officecli add "$FILE" /slide[2] --type shape --prop 'name=!!scene-ring' --prop preset=ellipse \
  --prop fill=E94560 --prop opacity=0.6 --prop x=20cm --prop y=2cm --prop width=12cm --prop height=12cm
officecli add "$FILE" /slide[2] --type shape --prop 'name=!!scene-dot' --prop preset=ellipse \
  --prop fill=0F3460 --prop x=3cm --prop y=16cm --prop width=1.5cm --prop height=1.5cm
# Ghost slide-1 content (name path still resolves after morph — see Known Issues)
officecli set "$FILE" "/slide[2]/shape[@name=#s1-title]" --prop x=36cm 2>/dev/null || true

# Verify morph pair: identical names on slides 1 & 2
officecli get "$FILE" /slide[1] --depth 1 --json | jq -r '.data.results[0].children[]?.format.name // empty'
officecli get "$FILE" /slide[2] --depth 1 --json | jq -r '.data.results[0].children[]?.format.name // empty'
# Compare — `!!scene-ring` and `!!scene-dot` MUST appear on both, byte-identical.
# Note: morph stores names with a `!!` prefix; compare the prefixed forms.
(c) 连续多幻灯片 morph(故事线):使用辅助脚本

视觉效果。 一条由 5 张幻灯片组成的连续叙事线:随着叙事推进,同样的 2 个 scene actor 在画布上缓慢漂移;内容(#sN-*)在每张幻灯片上刷新,并在下一张幻灯片上留下残影。若手动构建,大约需要 60 条命令。使用 reference/morph-helpers.py 可以让构建脚本保持简短,并自动完成验证。

#!/usr/bin/env python3
# Invoke the provided helper library for clone + ghost + verify
import subprocess, sys, os
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
HELPERS = os.path.join(SCRIPT_DIR, "reference", "morph-helpers.py")
FILE = "deck.pptx"

def helper(*args):
    subprocess.run([sys.executable, HELPERS, *[str(a) for a in args]], check=True)

# ... assume slide 1 is built with 2 scene actors (!!scene-ring, !!scene-dot) + #s1-title
# Helper builds slide 2–5 with: clone from previous + apply transition=morph + ghost previous #sN- content
# `clone` prints the cloned slide's shape list — read it to pick which shape indices carry the
# previous slide's #s(n-1)- content, then pass those explicit indices to `ghost`.
for n in range(2, 6):
    helper("clone", FILE, n - 1, n)          # clone + set transition=morph + list shapes (note the #s(n-1)- indices)
    helper("ghost", FILE, n, 1, 2)           # ghost the #s(n-1)- content shapes by index (here shapes 1 & 2)
    # …then add THIS slide's #sN- content via officecli add as normal…
helper("final-check", FILE)                   # structural pass; DOES NOT catch !! lingering in visible area

辅助函数签名与源码:reference/morph-helpers.py(clone、ghost、verify、final-check)。对应的 shell 版本是 reference/morph-helpers.sh,请按平台二选一,不要混用。

何时使用辅助脚本,何时直接使用 officecli。 对于 2 至 3 张幻灯片的演示文稿,直接使用原始命令(配方 a、b)更清晰。对于 5 张及以上、且有重复的克隆 / 残影 / 验证节奏的演示文稿,辅助脚本可节省约 40% 的命令,并内置验证。无论如何,每张幻灯片在交付前仍需通过 officecli validate 检查。

(d) Morph + 淡入混合:在 Morph 切换页上入场

视觉效果。 一组 Morph 页面对,其中 !!scene-ring 连续移动,同时一个新增的逐页卡片淡入。适用于由 Morph 配对的背景承载视觉焦点、而新增前景内容需要比直接出现更柔和入场的场景。

# Slide 2 already has transition=morph and !!scene-ring. Add a new card with fade-entrance.
officecli add "$FILE" /slide[2] --type shape --prop 'name=#s2-card' --prop preset=roundRect \
  --prop fill=F5F7FA --prop line=none --prop x=2cm --prop y=12cm --prop width=10cm --prop height=5cm

# Apply simultaneous-with-morph fade entrance to the new card.
# 'fade-entrance-300-with' = fade in, 300ms, trigger=withPrevious (plays with the morph transition).
officecli set "$FILE" "/slide[2]/shape[@name=#s2-card]" --prop animation=fade-entrance-300-with
officecli get "$FILE" "/slide[2]/shape[@name=#s2-card]" --json | jq '.data.results[0].format.animation'  # readback sanity — drops the trigger suffix, reads back as "fade-entrance-300"

为何有效。 Morph 只对 !!scene-* 形状生成动画(它们在第 1 页有配对对象);新增的 #s2-card 在第 1 页没有对应对象,因此 Morph 会默认对其做淡入——fade-entrance-300-with 则显式指定该淡入并设定时长。请遵循 pptx v2 的动画底线:不超过 600ms,不使用弹跳、旋转或从边缘飞入(标准预设列表见 officecli help pptx animation)。

编排(Choreography):动画类型与错峰时序

Morph 如何为多个形状制作动画,决定了观众看到的效果。为每一对形状选择合适的机制:

动画类型实现方式(Slide A 与 Slide B 之间)
简单移动两张幻灯片上使用相同的 !! 名称,尺寸相同,x/y 不同 — Morph 对位置进行插值
缩放变换名称相同,width/height 不同 — Morph 对尺寸进行插值(并重新定位中心)
移动 + 缩放同时改变 x、y、width、height — Morph 一次处理所有维度
颜色 / 透明度变化名称相同,fill 或 opacity 不同 — Morph 对填充色进行交叉淡化
旋转名称相同,rotation(度数)不同 — Morph 沿最短弧线旋转
字号变化名称相同,文本形状的 size(pt)不同 — 在 PowerPoint 365 中可插值;在 Keynote / WPS / LibreOffice 中可靠性较低(可能退化为交叉淡化)。为获得可移植的动效,应将 size 变化与对应的 width/height 变化或 x/y 位移配合使用 — 当尺寸插值失效时,空间变化仍能保持动效可见
进入(淡入)形状仅存在于 Slide B 中(A 中无对应形状)— Morph 将其淡入
退出(淡出)形状仅存在于 Slide A 中(B 中无对应形状)— Morph 将其淡出

多形状时序约束。 同一个 Morph 对中的所有 !! 形状都会同时执行动画 — CLI 中没有逐形状的延迟/时长设置(帮助文档确认:幻灯片上不存在 morph.duration / morph.delay)。若要让形状 A 先于形状 B 动画,请通过一张中间幻灯片将过渡拆分为两对:

Slide 2 → Slide 3:  !!actor-A moves (!!actor-B stays put)
Slide 3 → Slide 4:  !!actor-B moves (!!actor-A stays put or ghosts)

第 3 张幻灯片是明确的中间关键帧。请勿尝试通过形状 animation= 属性上的时序参数来伪造错峰效果 — Morph 会先于逐形状动画执行。

足够多样性的启发式规则(最佳实践 — 创作灵活性)。 要让 Morph 呈现为“运动”,主导配对形状应至少改变 {x, y, width, height, rotation, fill, opacity} 中的 3 项,并满足位移 ≥ 5cm 或旋转 ≥ 15° 或尺寸变化 ≥ 30%。单个形状改变 3 个属性是有效的创作模式(聚焦于一个主角元素)。

交付关卡 5b-morph-2 更为严格。 该关卡强制断言:至少 3 个不同的 !! 前缀形状,在该对幻灯片之间各自至少改变 {x, y, width, height, rotation, font-size} 中的 1 项 — 用于检验“这确实是 Morph,而非伪 Morph”的完整性。启发式规则指导创作意图;关卡决定能否交付。品牌恒定的背景元素(固定页眉条、页脚栏、徽标标签)不计入 3 个形状的配额 — 它们本应保持不动,动效必须来自其他 3 个命名形状。存疑时,以更严格的关卡为准。

按幻灯片长度安排节奏。 每次过渡都使用 Morph,会显得焦躁而非电影感。应根据幻灯片长度安排 Morph 时刻:

  • 8-10 张幻灯片(紧凑型): 3-5 个 Morph 时刻;动效可以集中出现。
  • 12-18 张幻灯片(仪式型): 总计 3-5 次 Morph,每隔 4-6 张幻灯片分布一次;在章节分隔页使用 transition=morph,使动画起到章节标点的作用,而非持续的躁动。
  • 18 张以上(分幕型): 将内容组织为 3 幕,幕与幕之间使用 1 次较长的章节分隔 Morph(5-10 秒有意图的运动,并配有短暂停留),每幕内再安排 2-3 次较平缓的 Morph。应更多地依赖 !!scene-* 的连续性,而非逐张幻灯片的 !!actor-* 频繁更替。

场景角色空间规则

场景角色和在画布上移动的角色在变形(morph)过程中必须保持在可预测的区域内,否则它们会穿越内容,显得杂乱。

安全区(场景角色的静止位置和变形路径优先使用):

Top-right corner:   x ≥ 24cm, y ≤ 6cm
Bottom-right:       x ≥ 24cm, y ≥ 12cm
Bottom-left:        x ≤ 2cm,  y ≥ 12cm
Off-canvas (ghost): x ≥ 33.87cm  (canvas right edge; use x=36cm for explicit ghost)

避免让角色静止在内容核心区: x = 2~28cm, y = 3~16cm。角色在变形过程中可以穿过核心区(这正是动效本身),但除非角色本身就是内容(承载本页信息的 !!actor-*),否则不应在高不透明度下停留在该区域。

放置任何场景角色之前,先检查现有形状的边界:

officecli get "$FILE" "/slide[$N]" --depth 1 --json | \
  jq -r '.data.results[0].children[]? | "\(.format.name // .path)  x=\(.format.x) y=\(.format.y) w=\(.format.width) h=\(.format.height)"'

确认角色的目标位置不与任何 #sN-* 内容形状的边界框重叠(x 到 x + width,y 到 y + height)。如果会重叠,则将角色的 opacity 降至 ≤ 0.15,或将其移动到安全区。

风格库查找工作流

reference/styles/ 包含 52 个视觉风格目录(深色 / 浅色 / 暖色 / 鲜艳 / 黑白 / 混合等气质)——仅作设计灵感,并非模板。请将该库作为按需参考使用,而不是整体搬运内容。

为什么是查找而非复制。 52 个 build.sh 文件各自都是完整的风格演示,但其坐标是针对该演示的内容长度手动调校的。将其原样复制到内容不同的演示文稿中,会产生重叠和错位(已在 INDEX.md L5-11 中标注)。该库的价值在于设计逻辑:为某种气质选择配色、标志性形状、编排模式。请将这些逻辑应用到你自己的网格计算中。

四步查找法:

  1. 浏览 INDEX。 reference/styles/INDEX.md 按配色类别和气质对全部 52 种风格进行分组(例如 dark--premium-navy 代表权威 / 精致;warm--earth-organic 代表有机 / 质朴)。快速查找表还列出了每种风格的主色十六进制三元组(背景 / 前景 / 强调色)——如果用户指定了品牌色,可以扫描十六进制列找到最接近的匹配,无需逐个打开每个 style.md。选择 1 种与主题气质相符或与用户指定十六进制色相契合的风格。
  2. 阅读设计理念。 打开 reference/styles/<style-id>/style.md,了解设计意图——字体搭配、配色逻辑、标志性元素。
  3. 浏览技法。 仅为技法参考(标志性形状、调色板十六进制值、编排思路)才打开 reference/styles/<style-id>/build.sh——坐标已知存在问题,见 INDEX.md L5-11;请勿复制其中的坐标。
  4. 应用到你自己的画布。 使用 pptx v2 网格计算和视觉底线构建演示文稿;只借用配色和标志性的设计手法。

指引: → 参见 reference/styles/<style-id>/ ——切勿从风格的 build.sh 中直接复制坐标。

交付检查(继承 pptx v2 及 morph 补充项)

Gate 1–5a:完整沿用 pptx v2。 → 参见 pptx v2 §Delivery Gate。包括 Schema(白名单 C-P-2 图表 spPr)、令牌检查($…$ / {{…}} / \$\t\n / () / [])、超链接 rPr(C-P-1)、页面顺序检查,以及深色背景上的深色内容对比度(Gate 5a)。在每个 pptx Gate 1–5a 都输出 OK 信息之前,拒绝宣布完成。 变形演示文稿与任何 pptx 一样存在令牌、Schema 和顺序方面的风险。

Gate 2 morph 补充项 —— 被 zsh 吞掉的价格 / 指标令牌

pptx v2 的 Gate 2 覆盖 $…$、{{…}}、\$\t\n 字面量以及空的 () / []。morph 演示文稿还会出现另一类泄漏:在双引号 --prop text="…" 中书写的价格 / 指标令牌($9/mo、$29/month、$199/yr)——shell 会把 $9 当作空变量吞掉,CLI 则会存入 /mo 或多余的句点。除 pptx Gate 2 外,还需运行以下检查:

# Gate 2 morph — price / metric token leaks + stray-period placeholders
# Pattern hits: bare prices ($9, $29, $9.99), /unit suffix ($9/mo, $199/yr), ${VAR}, \n/\r/\t, lone period
LEAKS=$(officecli view "$FILE" text | grep -nE '\$[0-9]+(\.[0-9]+)?(/(mo|month|yr|year|day|wk|week|hr|hour))?|\$\{[A-Z_]+\}|\\[nrt]|^\.$' || true)
if [ -z "$LEAKS" ]; then echo "Gate 2 morph OK"; else echo "LEAK: $LEAKS"; fi

涵盖:$9 $9.99 $29/month $199/yr $1/day ${VAR} \n/\r/\t 字面量,以及多余的 . 占位符。修复方法:对属性使用单引号(--prop text='$9/mo')。

Gate 5b — 通过 HTML 预览进行视觉审计(必须执行)——针对 morph 扩展

运行 officecli view "$FILE" html 并读取返回的 HTML 路径。对每一张幻灯片,回答 pptx v2 Gate 5b 的问题(重叠 / 深色叠深色 / 分隔线重叠 / 顺序合理性 / 缺失箭头),另外还需完成以下四项 morph 专项检查:

重要:带前缀匹配的选择器。 officecli query 仅支持运算符 =、!=、~=、>=、<=、>、<,不存在 ^= 前缀运算符。类似 shape[name^=!!actor-] 的选择器会返回 invalid_selector 错误。若要进行“以……开头”的筛选,请使用 get --depth 1 循环配合 jq startswith(),如下所示。

  • 5b-morph-1 — !!actor-* 在其所属段落结束后泄漏到可见区域。 对于每一个本应已退场的 !!actor-*,确认 x ≥ 33.87cm(画布右边缘)。循环加过滤(选择器安全):

    NSLIDES=$(officecli query "$FILE" slide --json | jq '.data.results | length')
    for N in $(seq 1 $NSLIDES); do
      officecli get "$FILE" "/slide[$N]" --depth 1 --json | \
        jq -r --arg n "$N" '.data.results[0].children[]? |
          select(.format.name? // "" | startswith("!!actor-")) |
          select((.format.x // "0cm" | rtrimstr("cm") | tonumber) < 33.87) |
          "slide \($n) leak: \(.format.name) stuck at x=\(.format.x)"'
    done
    

    只要打印出任何一行,即表示 actor 仍滞留在可见区域。final-check 无法发现此问题——只有循环与读取 HTML 才能发现。

  • 5b-morph-2 — 相邻幻灯片的空间构图完全相同(无运动)。 硬性规则:每一对 morph 之间,至少需要 3 个不同的 !! 前缀形状,且每个形状至少在 {x, y, width, height, rotation, font-size} 中的一项上有差异。证明循环(导出两张幻灯片,比对同名形状,统计有差异的形状数量):

    for K in 1 2 3 4; do
      A=$(officecli get "$FILE" "/slide[$K]" --depth 1 --json | \
        jq -r '.data.results[0].children[]? | select(.format.name? // "" | startswith("!!")) |
          "\(.format.name)|\(.format.x)|\(.format.y)|\(.format.width)|\(.format.height)|\(.format.rotation // 0)"')
      B=$(officecli get "$FILE" "/slide[$((K+1))]" --depth 1 --json | \
        jq -r '.data.results[0].children[]? | select(.format.name? // "" | startswith("!!")) |
          "\(.format.name)|\(.format.x)|\(.format.y)|\(.format.width)|\(.format.height)|\(.format.rotation // 0)"')
      VARIES=$(diff <(echo "$A") <(echo "$B") | grep -c '^[<>]')
      if [ "$VARIES" -lt 6 ]; then echo "pair $K→$((K+1)) FLAT: only $VARIES diff-lines (need ≥ 6 = 3 shapes × 2 sides)"; fi
    done
    
  • 5b-morph-3 — Morph 对的名称不匹配。 相邻幻灯片必须完全共享至少 2 个 !! 前缀名称。证明(注意:子元素位于 .data.results[0].children[]——直接使用 .data.children[] 会返回 null):

    for N in 1 2 3 4 5; do
      echo "--- slide $N ---"
      officecli get "$FILE" "/slide[$N]" --depth 1 --json | \
        jq -r '.data.results[0].children[]? | select(.format.name? // "" | startswith("!!")) | .format.name'
    done
    

    对连续的区块进行目视比对——N 与 N+1 之间共享的 !! 名称即为 morph 对。若无任何重叠,则该对只是普通淡入淡出。

  • 5b-morph-4 — #sN-* 残留在第 N+1 张幻灯片上(幽灵泄漏)。 每张幻灯片的内容必须在下一张幻灯片上被隐藏为幽灵(x=36cm)。对每个 N≥2 执行循环加过滤:

    NSLIDES=$(officecli query "$FILE" slide --json | jq '.data.results | length')
    for N in $(seq 2 $NSLIDES); do
      PREV=$((N-1))
      officecli get "$FILE" "/slide[$N]" --depth 1 --json | \
        jq -r --arg n "$N" --arg p "$PREV" '.data.results[0].children[]? |
          select(.format.name? // "" | startswith("#s\($p)-")) |
          select((.format.x // "0cm" | rtrimstr("cm") | tonumber) < 33.87) |
          "slide \($n) leak: \(.format.name) stuck at x=\(.format.x)"'
    done
    

    只要打印出任何一行,即表示某个 #s(N-1)-* 形状在第 N 张幻灯片上仍然可见。将其隐藏为幽灵。

若任一 5b-morph-1..4 循环输出了任何一行,则拒绝交付。 将四个循环的标准输出汇总到同一个流中,并用计数模式强制执行:LEAK_COUNT=$(...all four loops... | wc -l); if [ "$LEAK_COUNT" -gt 0 ]; then echo "REJECT: $LEAK_COUNT morph leaks"; else echo "Gate 5b-morph OK"; fi。

渲染器说明

Morph 可在以下环境中正常渲染: PowerPoint 365(Windows/Mac)、Keynote、WPS、PowerPoint Online。

Morph 无法在以下环境中渲染: LibreOffice Impress(渲染为静态画面,有时会显示为淡入淡出)、Google Slides 网页版查看器(丢失插值效果)、大多数 HTML / SVG 查看器,以及 officecli view html(仅呈现结构,morph 属于运行时效果)。这属于 [RENDERER-BUG],而非技能缺陷。需明确告知用户:"请在 PowerPoint 365 / Keynote / WPS 中打开以查看 morph 动效;其他查看器将显示为静态画面或普通淡入淡出。"

任何渲染器生成的静态截图都无法验证 morph 动效(动效只在运行时存在)。请使用上述 Gate 5b 查询来证明各对 morph 的正确性;请使用实时查看器来评估动效质量。

幽灵管理与 Actor 生命周期

每个 !!actor-* 和 #sN-* 形状都必须在每一张幻灯片上进行管理,而不仅仅是其退场的那一张。

逐页幽灵规则

构建多页 morph 演示文稿时:

  1. 第 N 张:引入 !!actor-ring(在 x=0cm 处可见)
  2. 第 N+1 张:添加新内容。完成前,将 !!actor-ring 幽灵化至 x=36cm。
  3. 第 N+2 张:添加更多内容。再次将 !!actor-ring 幽灵化至 x=36cm。(不可省略——即便它在上一张已位于画布之外,每张幻灯片仍是全新的画布。)
  4. 第 N+3 张:若 !!actor-ring 需要再次可见,则将其移回 x=0cm 或其新位置。

原因: 每张幻灯片的形状列表是相互独立的。在第 N 张上将形状移出画布,并不会延续到第 N+1 张——若忘记再次幽灵化,它会在第 N+1 张上以原始位置重新出现。

工作流模式(Bash)
# After adding new content shapes to slide $SLIDE:
for ACTOR in "!!actor-ring" "!!actor-dot" "!!actor-accent-bar"; do
  officecli set "$FILE" "/slide[$SLIDE]/shape[@name=$ACTOR]" --prop x=36cm || true
done

或在构建循环中:

for SLIDE_NUM in 3 4 5 6 7 8 9 10 11; do
  # Add content specific to this slide
  officecli add "$FILE" "/slide[$SLIDE_NUM]" --type shape ...
  
  # IMMEDIATELY ghost all old actors (M-2 prevention)
  officecli set "$FILE" "/slide[$SLIDE_NUM]/shape[@name=!!actor-ring]" --prop x=36cm || true
  officecli set "$FILE" "/slide[$SLIDE_NUM]/shape[@name=!!actor-dot]" --prop x=36cm || true
done
检测:幽灵计数闸门

morph-helpers.py final-check 会统计 x ≥ 34cm 处的所有形状。如果数量大于 50,它会打印:

REJECT: Found 135 accumulated ghosts — likely M-2 ghost accumulation.
Run: officecli query deck.pptx 'shape[x>=34cm]' --json | jq '.data.results | length'
Expected ≤ 50 (roughly 4–5 active actors × 10–12 slides).

修复: 检查构建日志,确保每张幻灯片都对不应出现在其中的所有 Actor 重新执行幽灵化处理。重新运行 final-check。如果数量仍大于 50,请使用 morph-helpers.py clean-accumulation deck.pptx(参见参考章节)。

常见 Morph 陷阱(设计与工作流陷阱)

基础 pptx 陷阱(Shell 引号、zsh 的 [N] 通配符、十六进制 # 前缀、属性文本中的 \n)→ 参见 pptx v2 §Common Pitfalls。以下是 morph 特有的陷阱:

陷阱正确做法
同一份 deck 中同时存在 !!scene-card 和 !!actor-card名称在所有前缀之间必须唯一。重命名为:!!scene-card-bg 与 !!actor-card-content
部分幻灯片已完成后,在构建过程中重命名形状这是等待发生的幽灵累积 Bug。停止操作,重新绘制 §Morph Pair Planning 表格,并重新运行受影响的幻灯片
将 !!actor-* 放入内容核心,却未规划退出方式每个 !!actor-* 都需要一张幽灵幻灯片。必须在编码之前在配对表中规划好
幽灵累积(M-2):忘记在后续幻灯片上重新幽灵化 !!actor-*关键: 当你向第 N+1 张幻灯片添加新内容时,第 N 张幻灯片中所有不应可见的 !!actor-* 都必须再次移动到 x=36cm。不要假设它们一旦被幽灵化就会保持在屏幕外——每张幻灯片都是独立的。构建模式:对每张新幻灯片:添加内容形状 → 然后循环:将每个处于活动状态的 !!actor-* 设置为 x=36cm。如果幽灵数量超过 50,morph-helpers.py final-check 将拒绝通过
忘记在某张幻灯片上设置 transition=morph会变成无声的淡入淡出。闸门 5b-morph-2(无运动)会将其捕获;可通过 set /slide[N] --prop transition=morph 修复
认为 @name= 路径在 morph 幻灯片上会失效并不会——在设置 transition=morph 之后 @name= 仍然可以解析(M-1);只有回读的名称会增加 !! 前缀
相邻幻灯片视觉上完全相同Morph 没有可插值的内容——会退化为普通淡入淡出。应用 §Scene-actor spatial rule,并将至少 3 个形状移动 ≥ 5cm / ≥ 15°
试图通过每个形状的计时来错开 2 个形状的动画不受支持——应将该配对拆分为两个过渡,并通过中间关键帧幻灯片衔接
在 LibreOffice 或浏览器中测试 morph 动画属于 [RENDERER-BUG],并非 skill 缺陷。请在 PowerPoint 365 / Keynote / WPS 中测试
退出时删除 !! 形状,而不是将其幽灵化删除会破坏 morph 配对——形状会无动画地消失。始终将其幽灵化到 x=36cm
使用双引号编写 --prop text="$9/mo"Shell 会将 $9 当作空变量吞掉 → 文本被存为 /mo 或多余的 .。应使用单引号:--prop text='$9/mo'。Gate 2 morph 附加规则会检查这种泄漏
在 --prop text='line1<a:br/>line2' 中使用字面量 <a:br/>会被存为 7 个普通字符,而不是换行。应对每一行分别执行 officecli add "/slide[N]/shape[@id=K]" --type paragraph(M-6)
使用 shape[name^=!!actor-] 选择器officecli query 不支持 ^= 运算符——会返回 invalid_selector。应改用 get /slide[N] --depth 1 --json | jq '.data.results[0].children[]? | select(.format.name | startswith("!!actor-"))'

已知问题与常见陷阱

基础 pptx 缺陷 C-P-1..7(超链接 rPr、图表 ChartShapeProperties 警告、动画时长回读、动画移除、连接器枚举、连接器 @name=、图表颜色渲染器规范化)均适用。→ 变通方法请参见 pptx v2 §Known Issues C-P-1..7。

Morph 专属(M-1..5):

#现象变通方法
M-1执行 officecli set '/slide[N]' --prop transition=morph 后,该幻灯片上的每个形状名称前都会自动加上 !!(#s1-title → !!#s1-title)。回读的名称为加前缀后的形式。选择器过滤注意事项: 自动加前缀后,!!#sN-caption 会与 !!actor-* 并存,在 jq 中用 startswith("!!") 筛选"场景角色"会产生误匹配。务必使用 startswith("!!actor-") 或 startswith("!!scene-") 过滤,切勿仅用 startswith("!!")。@name= 路径选择器仍然有效——/slide[N]/shape[@name=#s1-title] 可返回该形状(匹配容忍后缀/前缀),因此无需重写路径。若需在 jq 过滤中使用带前缀的名称,请考虑开头的 !!。
M-2 🚨幽灵累积——第 3 张幻灯片引入的 !!actor-* 会一直在第 4、5、6 张幻灯片上可见,除非每一页都被显式隐藏。 final-check 辅助工具会检测此问题,幽灵数量超过 50 时拒绝通过。强制的逐页规则: 向幻灯片添加新内容后,立即将之前幻灯片中所有活动的 !!actor-* 设置为 x=36cm(或若其属于当前语境,则显式将其定位为可见)。示例:officecli set /slide[4]/shape[@name=!!actor-ring] --prop x=36cm。每次添加幻灯片后都要执行,而不只是在最后执行。参见下方 §Ghost Discipline & Actor Lifecycle。
M-3章节切换边界——在新主题章节的首张幻灯片上,上一章节的 !!actor-* 形状会明显残留。命令不会报错,只会造成视觉杂乱。在每张章节起始幻灯片上,显式将上一章节的所有 !!actor-* 隐藏至 x=36cm。场景形状(!!scene-*)保持不变。
M-4Agent 有时会把 morph.duration= / transition.delay= 当作独立属性使用,这些属性会被报告为 UNSUPPORTED 而拒绝。在 transition 属性上使用组合简写:transition=morph-slow / -fast,或 transition=morph-<DUR_MS>(例如 transition=morph-1500)。两者在回读时均可往返(transitionSpeed=slow,transitionDuration=1500)。仅当简写无法满足需求(需精细控制原始 XML)时,才对 <p:transition> 回退使用 raw-set——参见下方 M-4 示例代码块。
M-5[RENDERER-BUG] LibreOffice / Google Slides 网页查看器会将 morph 幻灯片渲染为普通淡入淡出(无插值)。在 PowerPoint 365 / Keynote / WPS 中测试。这不是 skill 缺陷,无需排查。
M-6写在 --prop text='line1<a:br/>line2' 中的 <a:br/> 会被存储为 7 个字符的字面字符串,而非被解释为换行。观众看到的是原样渲染的 line1<a:br/>line2。对于多行项目符号或说明文字,每行添加一个段落:officecli add "/slide[N]/shape[@id=K]" --type paragraph --prop text='line1',然后再以 text='line2' 重复执行。真实换行的工作流参见 pptx v2 §Shell escape。

M-4 示例——放慢所有 morph 过渡,raw-set 回退方案(优先使用 transition=morph-slow;仅在简写无法满足时使用此方法)。注意:在 morph 幻灯片上,//p:transition 会同时匹配 mc:Choice 和 mc:Fallback,因此会输出 2 element(s) affected:

# Per-slide: add spd="slow" to every transition element on slide N (2 XML hits per morph slide)
for N in 2 3 4; do
  officecli raw-set "$FILE" "/slide[$N]" --xpath "//p:transition" --action setattr --xml 'spd=slow'
done
officecli validate "$FILE"

回读:officecli query "$FILE" slide --json | jq '.data.results[].format | select(.transition=="morph") | .transitionSpeed' 会为每张受影响的幻灯片输出 "slow"。

产出物与交付

每个 morph 演示文稿都包含三个独立文件:

  1. <topic>.pptx — 演示文稿本体,已关闭且 officecli validate 通过(交付门禁 1 OK)。
  2. build.sh 或 build.py — 可重复运行的脚本(Shell 原生构建用 bash;多页叙事用 Python,并调用 morph-helpers.py)。必须能通过全新的 officecli create 调用重新生成该演示文稿。
  3. brief.md — 独立文件,不嵌入到任何其他文件中。 包含:
    • 第 1 节:主题 / 受众 / 目的 / 叙事 / 风格方向(从 reference/styles/INDEX.md 中选定 1 个具名风格)
    • 第 2 节:逐页大纲(页面类型 + 每页一句话论点)
    • 第 3 节:§Morph Pair Planning 表格(Pair / Slide A / Slide B / Actors / Ghosts)——供审阅者审核编排的设计记录

交付前提醒用户(可原样使用的措辞):

  • "演示文稿已包含 morph 转场。请在 PowerPoint 365 / Keynote / WPS 中打开以查看动效——LibreOffice 和网页查看器只会渲染静态画面。"
  • "构建脚本运行期间,.pptx 可能会被多次重写。如需预览进度,请使用 officecli watch "$FILE" 并在 AionUi 中打开实时预览——构建期间请勿点击"用系统应用打开",否则会遇到文件锁定。"

创建后的调整

标准调整表 → 参见 pptx v2 §Common Pitfalls / swap / move / remove / set。morph 注意事项:在任何会重新排序 morph 配对页面的 swap 或 move 之后,需重新验证共享 !! 名称的相邻性。 对受影响的配对运行上方的门禁 5b-morph-3 查询——如果交换破坏了某个配对,要么重命名形状,要么重新编排转场。

交付前的最终检查。 运行完整交付门禁(1 至 5b-morph-1..4),在 PowerPoint 365 / Keynote / WPS 中打开 .pptx,完整观看一次页面间的 morph 转场,确认动效可见。如果任何门禁输出 REJECT,先修复并重新运行——切勿在存在已知未通过门禁的情况下交付。

参考资料

  • reference/decision-rules.md — 金字塔原理、SCQA、页面类型菜单、brief.md 结构规范。在 §Morph Pair Planning 阶段阅读,用于在编写命令前确定叙事结构。
  • reference/pptx-design.md — 设计补充说明(Scene Actors 机制、页面类型表、编排模式)。画布 / 字体 / 配色位于 pptx v2 中;本文件仅涵盖 morph 特有内容。
  • reference/morph-helpers.py — 跨平台(Mac / Windows / Linux)的 Python 辅助工具,用于克隆 + 幽灵形状 + 验证 + 最终检查。可作为库导入,或通过命令行参数调用。5 页以上的叙事优先使用。
  • reference/morph-helpers.sh — Bash 版本的等效工具。每个项目任选其一,不要混用。
  • reference/styles/INDEX.md — 52 种风格的视觉库,按配色(dark / light / warm / vivid / bw / mixed)和氛围分组。查找流程见上文 §Style library lookup workflow。
  • skills/officecli-pptx/SKILL.md — pptx v2 基础规则(视觉底线、网格、标准配色、图表选择、连接线规范、交付门禁 1–5a、已知问题 C-P-1..7、Shell 转义三层机制)。

评论

支持 Markdown