flowchart TB
subgraph keep ["沿用:源文件与云端"]
A["R / Lua / YAML / MathJax"]
B["Quarto 渲染与 GitHub Actions"]
C["Cloud Agent(Ubuntu)"]
end
subgraph adapt ["重配:本机环境"]
D["R 4.4 arm64 与 renv 库"]
E["Cursor / Positron 路径键"]
F["代理客户端、字体、Word"]
G["Docker 镜像架构"]
end
subgraph block ["停用直至改写:Windows 专有链路"]
H["Install-Harness.ps1"]
I["robocopy 镜像"]
J["v2rayN 与 %APPDATA% 分发"]
end
keep --> adapt
adapt --> block从 Windows 主力机切换到 Mac Studio(macOS)的影响评估
对照 harness 现有资产,梳理工作流、技术栈、配置与教学科研任务
摘要
本文对照 harness 仓库里已经落地的脚本、清单与说明,评估把日常主力机从 Windows 11 换成一台运行 macOS 的 Mac Studio(计划中的 M5 Max) 之后,哪些工作可以原样继续,哪些必须改路径或换工具。评估对象是本仓库已经写明的场景:R 与 Quarto 书稿和课件、Cursor 与 Positron、PowerShell 分发、Robocopy 镜像、中文 Word 书稿、Docker Selenium,以及 Cursor Cloud(Ubuntu)并行开发。本文不修改这些资产,也不推测尚未在本仓库验证的芯片参数。
核心结论:
- 学科内容与大部分课件、书稿源文件可以换机器继续写。 R 脚本、Lua 滤镜、MathJax / remark 静态资源、YAML 片段、Quarto 网站源和 GitHub Actions 都不绑定 Windows。Cloud Agent 今天已经在 Ubuntu 上跑,和 macOS 的用户态比和 Windows 更接近。
- 真正绑在 Windows 上的是「把资产装进业务项目」和「把渲染结果镜像到上传目录」这两条日常链路。
Install-Harness.ps1的说明写明只在 Windows 路径语义下测试;copy-post-sync.R直接调用robocopy /MIR。这两处在 macOS 上不能当成已可用。 - IDE、字体、Word 目视、代理和 Docker 镜像架构要重配,但不必推倒重来。
settings.json里的编辑器、Quarto、LaTeX 偏好可以保留;R 可执行文件、终端配置和用户设置目录必须按 macOS 另写。出版社接受的 docx 仍建议在 Windows 版 Word 上做目视验收。 - 过渡期应保留一台 Windows 电脑,至少覆盖一个教学周期。 它负责 PowerShell 分发脚本的验证、
robocopy镜像、v2rayN 文档中的网络排障,以及书稿在 Word 里的版式确认。Mac Studio 先承担写作、渲染、R 计算和 Cursor 本地代理。
1. 评估范围
1.1 工作情景
维护者是统计学与计量经济学教师。当前主力机是 Windows。harness 的自我定位写在 AGENTS.md 与仓库规则里:集中管理可复用的工程配置、环境脚本和代码片段,面向 R、Quarto、JavaScript、PowerShell、Windows 11。业务上已经形成这些习惯:
| 情景 | 仓库中的落点 |
|---|---|
| 课程幻灯片:联网稿与教室离线包 | docs/xaringan-dual-workflow.qmd、js/xaringan-dual/、js/mathjax-xaringan/ |
| 网站与 Reveal 的离线公式 | docs/mathjax-quarto-assets.qmd、js/mathjax-quarto/ |
| 中文书稿 Word(图题、表题、横向页) | docs/quarto-docx-chinese-book.qmd、scripts/quarto-docx/ |
| 渲染结果镜像到 Resilio Sync 的 staging | docs/quarto-book-robocopy-mirror.qmd、scripts/quarto-sync/ |
| 把上述资产装进任意课程仓库 | docs/install-harness.qmd、scripts/powershell/deploy-manifest.json |
| Cursor 写代码,Positron 做 R Console | ide/cursor-settings/、ide/positron/ |
| 本机 Agent 与 Cloud Agent 并行 | docs/cursor-local-cloud-parallel-dev.qmd |
| 访问 GitHub 时的本机代理 | docs/cursor-ide-v2rayn-network-guide.qmd |
| 偶发的浏览器自动化(如实验提交抓取) | docs/cursor-docker-selenium-workflow.qmd |
| harness 站点自身发布 | docs/cloudflare-pages-deploy.qmd,构建机是 Ubuntu |
scripts/r/ 与 scripts/sql/ 目前只有目录说明,没有绑操作系统的脚本。RStudio 目录同样是占位。本文不把尚未入库的 Stata、EViews 或 MATLAB 工程算进迁移成本;若科研主路径在那些软件上,许可证与 macOS 版本需要单独核对。
1.2 目标机器按什么来理解
目标是一台 Mac Studio,操作系统是 macOS,芯片是用户计划中的 Apple Silicon M5 Max。下文只用本仓库能够核对、且对 Apple Silicon Mac 稳定成立的事实:
- 用户态是 Unix:默认 shell 为 zsh,路径用
/,没有盘符,没有robocopy,没有 Windows PowerShell 5.1。 - 进程与容器是 arm64。CRAN 与 Quarto 都提供 Apple Silicon 构建;只发布
linux/amd64的容器要经模拟运行。 - 内存是统一内存,CPU、GPU 与容器共享同一池,不存在本仓库所依赖的 NVIDIA CUDA 路径。当前资产没有 CUDA 步骤。
- 具体核心数、内存容量与是否已经上市,以购买时的官方规格为准。本文不据此改工作流设计。
Mac Studio 是台式机。教室里的投影机、学生机和出差笔记本如果仍是 Windows,制作端换成 macOS 不会改变学生端打开的 HTML。离线课件包仍是交付物。
2. 资产分层
对照 deploy-manifest.json 的 profile,以及没有放进清单、但日常会用到的本机脚本,影响分成三层。
| 层 | 含义 | 换机后的动作 |
|---|---|---|
| 沿用 | 文件内容不调用 Windows 程序,渲染结果与操作系统无关 | git clone 后继续用 |
| 重配 | 逻辑可保留,本机路径、字体、壳或镜像架构要改 | 改本机设置或补一份 macOS 入口,先不要覆盖仓库里的 Windows 键 |
| 停用直至改写 | 脚本假定 robocopy、%APPDATA%、盘符或 PowerShell 5.1 |
macOS 上不要执行;保留 Windows 机验证 |
2.1 总表
| 资产 | 层 | Windows 上今天怎么用 | 换到 macOS 之后 |
|---|---|---|---|
Quarto 书稿与网站 .qmd、Lua 滤镜 |
沿用 | quarto render,滤镜在 Pandoc 里跑 |
同一命令。Quarto 用 macOS arm64 安装包,版本仍守住文档里的 1.8+(已验证 1.8.26 与 1.10.18) |
js/mathjax-xaringan/、js/mathjax-quarto/runtime/、js/xaringan-dual/ 的 JS、CSS、字体、R |
沿用 | 拷进课程仓库后由浏览器与 R 使用 | 文件本身可拷。安装命令今天是 Install-Harness.ps1 |
reference-doc.docx 与编号规则 |
重配 | Lua 改 OpenXML;样式在 Windows Word 里看 | 滤镜仍会跑。字体替换与页脚关系 rId14 要在 Word for Mac 里重新目视;出版社若指定 Windows Word,终稿仍在 Windows 上打开一次 |
scripts/quarto-docx/test/scripts/*.sh |
沿用 | 文档写明 Linux/Cloud 用 bash | Mac 终端可跑 run-check-all.sh、run-book.sh、sync-mirror.sh。Windows 继续用对应 .ps1 |
copy-post-sync.R + mirror-book-sync.ps1 |
停用直至改写 | post-render 调用 robocopy /MIR /XD |
macOS 没有 robocopy。在写出 rsync(或等价)实现并核对退出码之前,不要从 Mac 发布 _book_sync2 |
Install-Harness.ps1、deploy-manifest.json |
停用直至改写 | 按 profile 复制到课程仓库 | 安装说明 §11 已写明:脚本只在 Windows 路径语义下测试;Linux/macOS 需改用 rsync 或只复制文本资产 |
Distribute-CursorSettings.ps1、Distribute-PositronSettings.ps1 |
停用直至改写 | 读写 %APPDATA%\Cursor\User 与 %APPDATA%\Positron\User |
macOS 用户设置在 ~/Library/Application Support/Cursor/User/ 与 Positron 的对应目录。现有脚本不会找对文件 |
ide/cursor-settings/settings.json |
重配 | r.rpath.windows、r.rterm.windows、terminal.integrated.defaultProfile.windows 指向 C:/Program Files/R/R-4.4.3/... 与 PowerShell |
编辑器、Quarto、LaTeX 键可保留。另加 r.rpath.mac、r.rterm.mac 与 terminal.integrated.defaultProfile.osx。两套键可以写在同一份 JSON 里,VS Code 按操作系统读取 |
ide/positron/settings.json |
重配 | positron.r.interpreters.default 为 C:/Program Files/R/R-4.4.3/bin/x64/R.exe |
改为本机 R 框架或 Homebrew 前缀下的 R。Packages 面板、Quarto 大纲等键可保留 |
.cursor/setup-worktree-unix.sh |
沿用 | 与 Windows 脚本并列,由 worktrees.json 按 OS 路由 |
Mac 上 Cursor 创建 worktree 时应走这份 bash:复制 .Renviron、可选 renv::restore()、quarto check |
.cursor/setup-worktree-windows.ps1 |
停用(在 Mac 上) | Windows worktree 引导 | 留在仓库里给仍使用的 Windows 机。Mac 不会执行它 |
| v2rayN 指南 | 停用直至改写 | TUN、系统代理、PAC、WinHTTP、本地入站 10808 | 三层模型依赖 Windows 网络栈。Mac 需要另一份客户端说明,不能把该文的菜单项原样操作 |
| Docker Compose Selenium | 重配 | Docker Desktop(常见为 WSL2);就绪检查用 curl.exe;避开 Windows 保留端口 5901 |
Compose 文件可复制。确认镜像有 linux/arm64。调试端口策略可以保留 15900 / 17900。keyring 在 macOS 上走钥匙串 |
| Cloudflare Pages 工作流 | 沿用 | GitHub Actions 在 Ubuntu 上 quarto render |
与本机操作系统无关 |
| R 语言服务器排障记录 | 重配 | 根因是 renv 库目录名 windows 与 .Platform$pkgType(win.binary)不一致 |
文档写明其它 OS 的目录名可能不同,以实测为准。Mac 上对应层级通常是 macos。沿用文中的 Sys.glob 写法,不要手拼 pkgType |
3. 工作流
3.1 一天里的写、渲、传
Windows 上一条已经文档化的书稿链路是:
flowchart LR
Q["quarto render"] --> R["R/copy-post-sync.R"]
R --> RB["robocopy /MIR"]
RB --> S["_book_sync2"]
S --> RS["Resilio Sync"]
RS --> WEB["网站服务器"]copy-post-sync.R 里和 macOS 冲突的部分是具体的:
- 绝对路径用盘符正则
^[A-Za-z]:[/\\]或 UNC\\server\share判断。macOS 绝对路径以/开头,会被当成相对项目根的路径,拼到错误位置。 normalizePath(..., winslash = "\\")与大小写不敏感比较,是为 NTFS 写的。APFS 默认不区分大小写,但分隔符与大小写规则仍应改成 POSIX。system2("robocopy", ...)以及「退出码大于 7 才算失败」。rsync的成功码是 0,不能沿用这张码表。- 排除目录
.sync(以及文档中的.well-known、.rclone-cache)这个需求仍然成立。Resilio Sync 有 macOS 客户端,换的是镜像工具,不是上传产品。
在 Mac 上写出并试过替代实现之前,课程网站的发布应继续在 Windows 上执行 post-render,或者只在 Mac 上 quarto render、把 _book 拷回 Windows 再镜像。两套做法都要避免对 staging 做未经验证的删除同步。
harness 文档站自己的发布不走这条链路。它由 .github/workflows/deploy-cloudflare-pages.yml 在 Ubuntu 上构建,换电脑不影响。
3.2 把 harness 装进一门新课
今天的入口是仓库根目录的:
.\scripts\powershell\Install-Harness.ps1 `
-InstallProfile quarto-sync,cursor `
-ProjectRoot "D:\work\my-course"清单里的 profile 与用途:
| Profile | 复制内容 | macOS 上的文件能否用 |
|---|---|---|
quarto-sync |
copy-post-sync.R、mirror-book-sync.ps1、.Renviron.example、post-render 片段 |
R 与 YAML 片段可抄;.ps1 与 R 里的 robocopy 调用不能当生产路径 |
cursor |
ide/cursor-settings/settings.json → 项目 .vscode/settings.json |
JSON 可抄。其中的 r.rpath.windows 在 Mac 上不生效,需补 r.rpath.mac |
quarto-docx / quarto-docx-book |
Lua、reference-doc.docx、滤镜 YAML |
可抄。目视验收见 §5.2 |
mathjax-quarto |
vendor/mathjax/ 与 html-math-method 片段 |
运行时可抄。Reveal 模板要另跑 patch-reveal-template.ps1,该脚本标明兼容 Windows PowerShell 5.1 与 PowerShell 7 |
xaringan-dual |
remark、字体、render-slide.R、pack-offline.R、MathJax 2 配置 |
可抄。安装后仍要把 decks.example.csv 抄成 decks.csv |
docker-selenium |
Compose 与 Tasks 片段 | Compose 可抄,镜像架构要核对 |
all |
只含 quarto-sync 与 cursor | 与上两行相同,没有把 docx / MathJax 算进「全部」 |
PowerShell 7(pwsh)可以装在 macOS 上,.NET 的路径 API 也有一部分能跑。这不等于 Install-Harness.ps1 已经支持 macOS:脚本注释与 安装说明 都把测试范围限定在 Windows,并专门避开了 Windows PowerShell 5.1 的 Split-Path -Parent 与 -File 绑定问题。那些规避在 zsh 里没有对应物,也不证明脚本在 macOS 上复制 copy-tree 时行为正确。过渡期用 git 或 rsync 按清单逐项复制沿用层文件,并在复制记录里写明来源 commit。
本机用户设置的双向同步同样只覆盖 Windows。Distribute-CursorSettings.ps1 用 git diff 比较「本机用户 settings」和仓库备份,再按 -Apply 或 -ArchiveToHarness 覆盖其中一侧。在 Mac 上若误跑或手抄错目录,容易把 Windows 路径写进仓库,或把 Mac 路径覆盖到仍在使用的 Windows 配置。两边同时使用时,仓库里的 settings.json 应同时保留 r.rpath.windows 与 r.rpath.mac,由编辑器按 OS 选用。从 Mac 回写仓库前先看 diff,确认没有删掉 Windows 键。
符号链接的取舍也变了。分发机制说明 记录:Windows 上普通用户创建 symlink 常常要开开发人员模式或管理员权限,所以项目侧以复制为主。macOS 上用户目录内的 ln -s 通常可以直接用。即便如此,课程仓库仍建议继续复制进 Git,这样学生、助教和 Cloud Agent 克隆后不依赖你的 Mac 路径。符号链接只适合本机用户设置指向一份备份,而且 Mac 与 Windows 的用户设置路径不同,不能共用同一条链接。
3.3 Cursor Local、Worktree 与 Cloud
并行开发指南 把环境分成三档,其中一条硬限制是:PowerShell 脚本不要在 Cloud 的 Linux 虚拟机上测试。换成 Mac 之后,这条限制变成两台「不能拿来验证 .ps1」的机器(Mac 与 Cloud),验证仍要落在 Windows Local / Worktree。
Mac 上已经有对应入口,不必新写引导脚本:
| 文件 | 谁来跑 |
|---|---|
.cursor/worktrees.json |
把 Windows 指到 setup-worktree-windows.ps1,把 Unix 指到 setup-worktree-unix.sh |
.cursor/setup-worktree-unix.sh |
macOS 与 Linux:复制主 checkout 的 .Renviron,有 renv.lock 则 renv::restore(),然后 quarto check |
.cursor/install-cloud.sh |
只在 Cloud Ubuntu 上跑 |
因此:
- 改
docs/*.qmd、Lua、MathJax 静态文件、R 钩子:Mac 本地可以完成,并用quarto render或资产测试沙盒验证。 - 改
Install-Harness.ps1、mirror-book-sync.ps1、Distribute-*.ps1:在 Windows 上改、在 Windows 上跑。Mac 上只读。 - Move to Local 仍要求会话是在同一台电脑上启动的。Windows 上开的 Cloud 任务不能在 Mac Studio 上 Move to Local,反过来也一样。跨机器继续用 PR 或 cursor.com/agents。
- 指南里「低配硬件把重活交给 Cloud」的分工会变化。Mac Studio 的统一内存更适合本机同时开多个 R 会话、Quarto 渲染和容器;Cloud 仍然适合不占用书房机器的并行代理,以及必须在 Linux 上复现的检查。Worktree 数量上限仍按磁盘来设,不必因为换了芯片就放到默认的 25。
3.4 配置资产的验证
验证工作流 的顺序不变:在 test/ 里改镜像,L0 到 L1 通过后再晋升 canonical 文件。沙盒不通过 Install-Harness.ps1 分发。
| 资产 | 在 Mac 上怎么跑 |
|---|---|
js/mathjax-xaringan/test/ |
Rscript Rscript/test-wrap-display-math.R,再按模块跑 run-module.R。这些是 R 脚本 |
js/mathjax-quarto/test/ |
Rscript js/mathjax-quarto/test/Rscript/test-inventory.R。清点项包含 patch-reveal-template.ps1 这个文件在不在,不要求在 Mac 上执行它 |
scripts/quarto-docx/test/ |
用已有的 run-check-all.sh。Python 用 python3;Windows 文档里的 py -3 是 Windows 启动器 |
有一条 Windows 专有的回归不能只在 Mac 上签字:MathJax 4 的说明记录,用 file:// 直接打开 HTML 时,若脚本地址把盘符冒号编成 %3A,Chrome 不会把它当成 D:\...。macOS 的 file:///Users/... 没有盘符,在 Mac 上预览通过,并不覆盖这条 Windows 缺陷。教室电脑若仍是 Windows,这条检查留在 Windows 浏览器里做。
4. 技术栈
4.1 R、renv 与语言服务器
仓库备份把默认 R 固定在 4.4.3,路径是 C:/Program Files/R/R-4.4.3/bin/x64/R.exe。Mac 上应安装 同一小版本的 arm64 构建(CRAN 的 R.framework,或与该版本对齐的 Homebrew),避免 renv.lock 里已经锁定的二进制包在 4.5 上整库重装。恢复依赖时用:
Rscript -e "renv::restore(prompt = FALSE)"需要编译的包还要本机的 Command Line Tools。数据框、固定效应和 Quarto 计算常用的 CRAN 包多数已有 arm64 二进制;锁文件里若出现只有源码包、且依赖 Fortran 的项,再补 gfortran。这是恢复时才会看见的清单,不是换机前能从本仓库完整列出来的。
语言服务器超时那篇排障记录 的机制在 Mac 上仍然成立:languageserver 用 callr 拉起子进程,默认大约 3 秒就绪;.Rprofile 若走完整 renv::activate() 再加 implicit snapshot,子进程会超时,Outline 会空。变的是目录名。Windows 案例里磁盘层级是 renv/library/windows/R-4.x/...,而 .Platform$pkgType 当时是 win.binary,手拼路径永远对不上。macOS 上中间一层一般是 macos,pkgType 也不会是 win.binary。把 Windows 那份错误 .Rprofile 原样拷过来,会在新系统上再次配错。记录里推荐的 Sys.glob / list.dirs 写法两边都能用。
ragg 与中文字体是另一件事。docx 说明把「Windows 默认 png() 加宋体得到空白图」明确划在滤镜之外,修法是 knitr 的 dev = "ragg_png"。Mac 上 Quartz / ragg 也不会自带名为「宋体」的字体;空白或方框时,应改用本机已安装的中文字体族,而不是把 Windows 字体文件名写进 chunk。
vscode-R 与 Positron 的分工可以保持:Cursor 配置 负责日常 Quarto 与 AI 辅助编辑;Positron 配置 负责 Console、Data Explorer 与 Notebook。两边都有 macOS 版本。Cursor 扩展仍来自 VS Code 市场;Positron 仍用 P3M / Open VSX,并且不要在 Positron 里安装 REditorSupport.r。RStudio 的片段目录在仓库里还是空的,换成 Mac 不增加也不减少这块资产。
终端默认配置今天是:
"terminal.integrated.defaultProfile.windows": "PowerShell"Mac 上对应的是 terminal.integrated.defaultProfile.osx,日常用 zsh。仓库 settings.json 已把 files.eol 设为 \n。Windows 上若 Git 使用 core.autocrlf=true,换机后第一次提交可能把整文件标成换行变更。Mac 上宜使用 core.autocrlf=input,让工作区保持 LF,与这份设置一致。
4.2 Quarto、Pandoc 与 LaTeX
Quarto 在 macOS 上是独立安装包,Pandoc 仍随 Quarto 捆绑,不必为滤镜另装 Pandoc。quarto check 是 worktree 引导脚本里的冒烟命令,Mac 与 Windows 相同。
LaTeX Workshop 的设置没有写死 TeX 发行版路径,这份谨慎在换机时直接受益。Mac 上常用 MacTeX 或 TinyTeX;正向、反向搜索的 PDF 查看器要在新系统里重选,仓库备份没有绑定 Windows 的 SumatraPDF 路径。
4.3 壳、Python 与路径习惯
文档和脚本里的示例大量使用 D:\... 与 .\scripts\...。那些是调用说明,不是源文件里的业务逻辑。真正写进程序、会在 Mac 上算错的路径规则,集中在 copy-post-sync.R 的盘符判断(见 §3.1)。
Python 只出现在 docx 验收里:verify_docx.py 与 verify_book.py 是 python3 脚本;Windows 包装脚本优先找 py 启动器。Mac 上走已有的 shell 包装即可。
4.4 网络
v2rayN 指南 解决的是:Cursor 终端、扩展宿主、Git HTTPS 与 SSH 并不都认同一层代理;Windows 上还有 WinHTTP。文中的可复制实践是 harness 使用 HTTPS 远端,流量进 v2rayN 本地入站 10808,路由常用「绕过大陆」。
换成 macOS 之后,要重新确认的是三件事,而不是把 v2rayN 的界面找一遍:
- 本机代理客户端能否提供系统代理或 TUN,以及 Cursor 与 Git 实际走的是哪一条。
- HTTPS 远端是否仍指向本地 SOCKS/HTTP 入站;端口以新客户端为准,10808 只是 Windows 文档里的例子。
- SSH 远端(
git@github.com)往往不走 PAC。若仍用 SSH URL,需要单独的ProxyCommand或改用 HTTPS。
校园网、图书馆数据库和只允许国内 IP 的站点,在「绕过大陆」一类规则下应保持直连。这是路由需求,与操作系统无关;实现该需求的软件要换。
4.5 Docker
Selenium 工作流的不变量在 Mac 上仍然适用:每个课程仓库一份 Compose;同一标签的镜像全机共用;同时只跑一个占用主机 5555 的服务;用完 down;RSelenium 1.7.9 与 CRAN selenium 不要混用镜像。账号仍放在 keyring,不写入仓库。macOS 上 keyring 使用钥匙串。
要改的是运行环境。Windows 文档假设 Docker Desktop,并提醒 不要把主机 5901 映射进去(该端口段在 Windows 上常被保留),调试口用 15900:5900,Selenium 4 的 noVNC 用 17900。Mac 上没有同一条 Windows 保留端口说明,但继续使用 15900 / 17900 可以让两台电脑的 Compose 保持一致。就绪检查在 Mac 上用 curl,不用 curl.exe。
Apple Silicon 上要先看镜像是否提供 linux/arm64。只有 amd64 时,Docker Desktop 会模拟运行,内存占用和启动时间都与在 Windows 的 WSL2 里跑原生 amd64 不同。Mac Studio 的统一内存同时供给 Chrome 容器、R 和编辑器,批次抓取时仍应「只开一个浏览器服务」。
4.6 硬件能分担什么
当前仓库里的重活是:多本 Quarto 书同时渲染、renv 恢复、若干 R 进程、偶尔一个 Chrome 容器,以及本机 Cursor Agent。这些都吃内存和单机持久运行,Mac Studio 的机箱形态和统一内存与这个用法相符。
本仓库没有 CUDA、也没有本地大模型训练步骤。若以后要在本机做依赖 NVIDIA GPU 的训练,Mac 提供的是 Metal,不能把现有 Windows 上的 CUDA 环境原样搬过来。这件事超出今天的资产范围,不应当成换机的前置条件。
5. 教学与科研任务
5.1 课件
xaringan 双工作流把同一套幻灯片做成联网稿和教室离线包。离线包带 remark、字体和 MathJax 配置,教室电脑没有外网时用浏览器打开本地 HTML。这些文件是静态资源加 R 打包脚本(render-slide.R、pack-offline.R),制作系统换成 macOS 之后,拷到 Windows 教室机上的压缩包仍然应能打开。
制作端要注意两件具体的事:
- 新课仓库若依赖
xaringan-dual或mathjax-quartoprofile,在 Mac 上还不能用Install-Harness.ps1一键安装,需要按清单复制(§3.2)。 patch-reveal-template.ps1按 HTML 相对站点根的深度写入reveal-template.html,并拒绝盘符、file:、http:和反斜杠。深度规则在 Mac 上同样成立;在有 shell 替代脚本之前,这项补丁留在 Windows 上执行,或只把已经生成的reveal-template.html提交进课程仓库。
行内公式与 $$ 的配对钩子(mathjax-config.js 与 wrap-display-math.R)是文本,两边相同。remark 会吃掉 class 括号里反斜杠的问题也与操作系统无关,幻灯片写法不用因为换机而改。
5.2 中文书稿与出版社
滤镜解决的是 Quarto 默认 docx 不被出版社接受的版式:网站剖面的「图2- 13」、book 剖面的「图 3.1」、题注被包进 1×1 表、短列被压得折行、横向表多出空白页。这些由 Lua 和参考文档完成,Pandoc 在 macOS 上会执行同一套滤镜。
验收分两层:
| 层 | 今天的状态 | Mac 上 |
|---|---|---|
| 结构 | verify_docx.py / verify_book.py 检查 图N-M、横向页、空分节符等 |
用 run-check-all.sh 即可,作为换机后的第一道门禁 |
| 目视 | 说明写明:2026-10-15 的复测没有在 Word 里重看列宽和五号表头 | Word for Mac 的中文字体替换(参考文档若使用仅随 Windows 提供的字体名)会让这一层更不可省略 |
book 剖面的横向页依赖参考文档里的页脚关系,默认 rId14,可用元数据 docx-landscape-footer 覆盖。换用 Mac 上另存的参考文档时,这个 id 可能变化,要以新文件为准,而不是假定 Windows 那份 docx 的关系 id 永远有效。
若出版社或学校模板规定用 Windows 版 Word 打开,终稿在提交前用保留的 Windows 电脑打开一次。结构脚本通过不能代替这次打开。
5.3 课程网站与数据作业
Resilio 同步的是 staging 目录。Mac 版 Resilio 可以继续承担上传;镜像必须先有 macOS 实现,否则 staging 里会重新堆积「删不掉的旧 HTML」,或误删 .sync。这是 Robocopy 镜像说明 开头就在解决的问题。
实验或成绩页面的偶发抓取可以迁到 Mac 上的 Docker,前提是镜像架构与钥匙串里的账号都重新确认过。选择器、登录权限和「不用 Cursor 内置浏览器当批次爬虫」这些约束不变。
SQL 目录还没有可执行资产。数据库客户端换成 macOS 版本即可,连接串与查询模板不因操作系统改变。面板数据脚本若写在 R 里,随 §4.1 的 renv 恢复走。
5.4 科研计算与可重复性
对合作者和 Cloud Agent 而言,可重复的部分是 Git 里的 .qmd、renv.lock、Lua 和 YAML,不是你本机的 C:/Program Files/R/...。换机是把这件已经在 Cloud Ubuntu 上成立的事,再在本地做成一次:锁文件保持跨平台写法,绝对路径留在不提交的 .Renviron。
Windows 与 Mac 的 renv 库目录不能互相复制。每台机器自己 renv::restore()。不要把 renv/library/ 打进同步盘。
同一学期若两台电脑都改 harness,避免把「只在一个操作系统上为真」的路径提交成唯一配置。用户级设置的归档尤其如此(§3.2)。
6. 建议的切换顺序
下面按依赖排列。前一项未核对,不要开始依赖它的教学发布。
- 保留 Windows 主力机一个教学周期。 在此期间它是
.ps1、robocopy、v2rayN 与 Word 目视的唯一验收机。 - 在 Mac Studio 上安装 arm64 的 R 4.4.3、Quarto、Git、Cursor、Positron、Docker Desktop、Word、Resilio,以及一套 macOS 代理客户端。 打开终端后
quarto check与Rscript -e "R.version$platform"应显示 aarch64 / arm64。 - 克隆仓库,配置 Git 使用 LF,恢复 renv。 跑一次 MathJax 的 L0 与 docx 的
run-check-all.sh,确认沿用层在 Mac 上是绿的。 - 给 Cursor / Positron 补 macOS 路径键,不要删除 Windows 键。 用户设置目录用「应用程序支持」下的
User/settings.json,不要运行现有的Distribute-*.ps1。 - 用 Unix worktree 脚本开一个 Cursor worktree,确认
.Renviron被复制且quarto check通过。Cloud 任务按原指南继续;不要在 Mac 上测试 PowerShell 脚本。 - 课程仓库的安装改为按清单手工复制沿用层(Lua、MathJax 运行时、YAML、xaringan 的 R 与静态文件),直到存在经 macOS 测试的安装脚本。
- 为镜像另写实现并在副本目录上试删除语义,确认
.sync仍在、源目录里已删除的 HTML 不会留在 staging。未完成这一步时,网站发布仍从 Windows 执行。 - 用 Word for Mac 打开一本已通过结构脚本的书稿,看「表题」「图题」、五号表头和横向页。与出版社模板不一致时,终稿改回 Windows Word 导出。
- 代理稳定之后再把 GitHub 推送改到 Mac 上日常进行。 先用 HTTPS 远端验证,再决定要不要保留 SSH。
- Windows 机降为验收机,而不是在 Mac 工作流未写进
docs/之前拆掉。新的 macOS 安装脚本、rsync 镜像和代理说明应各写一篇专题文档,并按仓库规则放进docs/,而不是只改本篇的结论。
flowchart TB
W["Windows 继续负责 ps1、robocopy、Word 目视、v2rayN"]
M1["Mac:工具链与 renv"]
M2["Mac:沿用层测试变绿"]
M3["Mac:设置键与 worktree"]
M4["Mac:课程仓库手工安装"]
M5["镜像替代通过后再从 Mac 发布网站"]
W --- M1
M1 --> M2 --> M3 --> M4 --> M57. 边界
- 本文是影响评估,不提供
Install-Harness的 macOS 移植,也不把robocopy调用改写成rsync。那两项要单独实现,并在 Windows 与 macOS 上各做一次不会误删 staging 的试验。 - 未核对接线后的 M5 Max 核心数、统一内存容量和散热。工作流建议不依赖这些数字。
- 未把 Stata、EViews、MATLAB 或只在校园 Windows 机房提供的软件算进「可以换」的清单。
- 教室学生机、投影环境和出版社 Word 版本若仍是 Windows,交付物要在那些环境里打开一次。Mac 上的预览覆盖不了
file://盘符编码和 Windows 字体名这两类问题。 - 现有 Windows 专题文档应保留。它们描述的是仍将存在的验收环境,不是过时说明。