关于 morph-ppt
morph-ppt 是 officecli-pptx 的扩展技能,用于通过 Morph 转场制作 PowerPoint 演示文稿,重点讲解跨页形状命名、运动规划及 Morph 行为和渲染限制检查。
主要功能
- 01按名称配对跨页形状
- 02规划角色的移动与退场
- 03设置 Morph 幻灯片转场
- 04使用场景、角色和页面前缀
- 05检查 Morph 渲染限制
适用场景
- 01制作形状跨页移动的演示文稿
- 02让视觉元素在连续幻灯片间变换
- 03为受支持的演示文稿查看器准备 Morph
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ iofficeai/ officecli --skill morph-ppt安装后在 Claude Code 中输入/morph-ppt确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
reference/decision-rules.mdmorph-helpers.pymorph-helpers.shpptx-design.mdreference/styles/bw--brutalist-raw/build.shbw__brutalist_raw.pptxstyle.mdreference/styles/bw--mono-line/build.shbw__mono_line.pptxstyle.mdreference/styles/bw--swiss-bauhaus/build.shbw__swiss_bauhaus.pptxstyle.mdreference/styles/bw--swiss-system/style.mdreference/styles/dark--architectural-plan/build.shdark__architectural_plan.pptxstyle.mdreference/styles/dark--aurora-softedge/style.mdreference/styles/dark--blueprint-grid/build.shdark__blueprint_grid.pptxstyle.mdreference/styles/dark--circle-digital/build.shdark__circle_digital.pptxstyle.mdreference/styles/dark--cosmic-neon/build.shdark__cosmic_neon.pptxstyle.mdreference/styles/dark--cyber-future/build.shdark__cyber_future.pptxstyle.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'(单引号)。在 Pythonsubprocess.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 |
规划规则:
- 预先确定所有
!!名称:每个参与 morph 配对的形状,在两张幻灯片上必须使用完全相同的名称。 - 将每个
!!形状归类为!!scene-*或!!actor-*。scene 形状持续存在;actor 形状必须规划好退场的幻灯片。 - 章节转场边界: 进入新的主题章节时,在新章节的第一张幻灯片上,为前一章节所有
!!actor-*添加残影。仅保留!!scene-*(整份演示文稿的装饰元素)。 - 在表格完成之前,不要开始构建。如果构建过程中计划发生变化,请重新绘制表格并重新验证受影响的幻灯片。
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 中标注)。该库的价值在于设计逻辑:为某种气质选择配色、标志性形状、编排模式。请将这些逻辑应用到你自己的网格计算中。
四步查找法:
- 浏览 INDEX。
reference/styles/INDEX.md按配色类别和气质对全部 52 种风格进行分组(例如dark--premium-navy代表权威 / 精致;warm--earth-organic代表有机 / 质朴)。快速查找表还列出了每种风格的主色十六进制三元组(背景 / 前景 / 强调色)——如果用户指定了品牌色,可以扫描十六进制列找到最接近的匹配,无需逐个打开每个style.md。选择 1 种与主题气质相符或与用户指定十六进制色相契合的风格。 - 阅读设计理念。 打开
reference/styles/<style-id>/style.md,了解设计意图——字体搭配、配色逻辑、标志性元素。 - 浏览技法。 仅为技法参考(标志性形状、调色板十六进制值、编排思路)才打开
reference/styles/<style-id>/build.sh——坐标已知存在问题,见INDEX.mdL5-11;请勿复制其中的坐标。 - 应用到你自己的画布。 使用 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 演示文稿时:
- 第 N 张:引入
!!actor-ring(在 x=0cm 处可见) - 第 N+1 张:添加新内容。完成前,将
!!actor-ring幽灵化至x=36cm。 - 第 N+2 张:添加更多内容。再次将
!!actor-ring幽灵化至x=36cm。(不可省略——即便它在上一张已位于画布之外,每张幻灯片仍是全新的画布。) - 第 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-4 | Agent 有时会把 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 演示文稿都包含三个独立文件:
<topic>.pptx— 演示文稿本体,已关闭且officecli validate通过(交付门禁 1 OK)。build.sh或build.py— 可重复运行的脚本(Shell 原生构建用 bash;多页叙事用 Python,并调用morph-helpers.py)。必须能通过全新的officecli create调用重新生成该演示文稿。brief.md— 独立文件,不嵌入到任何其他文件中。 包含:- 第 1 节:主题 / 受众 / 目的 / 叙事 / 风格方向(从
reference/styles/INDEX.md中选定 1 个具名风格) - 第 2 节:逐页大纲(页面类型 + 每页一句话论点)
- 第 3 节:§Morph Pair Planning 表格(Pair / Slide A / Slide B / Actors / Ghosts)——供审阅者审核编排的设计记录
- 第 1 节:主题 / 受众 / 目的 / 叙事 / 风格方向(从
交付前提醒用户(可原样使用的措辞):
- "演示文稿已包含 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 转义三层机制)。