在 DSH 对话里复制含公式的内容时,剪贴板里得到 $...$ / $$...$$ 的 LaTeX 源码,而不是 KaTeX 渲染碎片;代码块与输入框保持原生复制。
安装
# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)
dsh plugin --profile web add github:Takeoff0518/dsh-katex-inline-copy
装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本——pnpm 默认拦截,所以安装可能停在 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED 或 ERR_PNPM_IGNORED_BUILDS;dsh 会打印出需要添加的确切键名,把它加进该 profile 的 pnpm-workspace.yaml 的 allowBuilds 下,重跑一次即可装上。放行构建本身就是一次信任判断:请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。
README
在 DeepSeek Harness 的对话里复制带公式的内容时,剪贴板里拿到的是
$...$ / $$...$$ 的 LaTeX 源码,而不是 KaTeX 渲染后的一堆 span。

效果与 Gemini Web 的「选中复制公式不崩」一致:
比较 $f(n)$ 与 $n^{\log_b a}$ 的渐进大小。
$$T(n) = aT\left(\frac{n}{b}\right) + f(n)$$
安装
# 从 GitHub 直接安装
dsh plugin add github:Takeoff0518/dsh-katex-inline-copy
# 或者在 设置 → 插件 里按绝对路径安装
安装后立即生效,无需重启。
行为
| 操作 | 结果 |
|---|---|
| 选中含行内公式的正文 | 公式变成 $...$,正文原样 |
| 选中块级公式 | 变成 $$...$$,独占一行 |
| 只选中公式里的半个字符 | 自动补成整条公式 |
| 复制代码块 | 完全不变(DSH 自己的复制按钮照旧) |
| 复制输入框里的文字 | 完全不变 |
Ctrl+Shift+V |
得到同样的 LaTeX 文本 |
原理
DSH 用 KaTeX 渲染公式(katex.renderToString(tex, { displayMode })),所以每个公式在
DOM 里长这样:
<span class="katex">
<span class="katex-mathml">
<math><semantics><mrow>…</mrow>
<annotation encoding="application/x-tex">T(n)=aT\left(\frac{n}{b}\right)+f(n)</annotation>
</semantics></math>
</span>
<span class="katex-html" aria-hidden="true">…</span>
</span>
TeX 源码一直在 annotation 里——这也是不需要额外 data-math 属性的原因。
插件在 document 上挂一个捕获阶段的 copy 监听:
- 有选区、不在输入框/代码块里;
- 选区确实碰到
.katex(用range.intersectsNode判断); - 把选区端点扩到整条公式(对应 Gemini 的
Mpk); cloneContents()后,把每个公式节点替换成$…$/$$…$$文本节点;preventDefault(),把text/plain+text/html写进event.clipboardData。
第 5 步用同步 clipboardData.setData:它在 copy 事件里是权威写入,不受焦点和权限
影响(Gemini 因为要带内联样式才走了异步 ClipboardItem,这里不需要)。只有浏览器
没提供 clipboardData 时才退回 navigator.clipboard.write。
原始消息 DOM 全程不被修改。
开关
默认开启。想临时关掉(浏览器控制台执行):
localStorage.setItem('dsh-katex-inline-copy.enabled', 'off')
恢复:
localStorage.removeItem('dsh-katex-inline-copy.enabled')
限制
- 只处理 KaTeX 渲染出来的公式(
.katex);katex-error会保持原样; - 不做 MathML→图片、也不做 Word/飞书专用格式;
- 公式围栏固定为
$/$$,可通过改src/math.ts的wrapTex换风格; - 依赖 KaTeX 在 DOM 里保留
<annotation encoding="application/x-tex">。
开发
npm install
npm test # 21 个用例(node:test + jsdom + 真实 KaTeX)
npm run typecheck
npm run build # src/ → lib/client.js,并构建 harness
npm run serve # http://127.0.0.1:8123/tools/harness/
tools/harness/ 是一个用同一套渲染管线、同一份复制代码的本地页面,选中文字按
Ctrl+C 就能看到实际写入剪贴板的内容,不用重启 DSH。
src/math.ts 选区 ↔ 公式节点、TeX 提取、$ 包裹
src/transform.ts 克隆 → 替换 → { html, text }
src/install.ts copy 监听、选区扩展、写剪贴板、兜底
src/index.ts 插件入口(ModuleLoader factory)
lib/client.js 构建产物(提交进仓库,供按路径安装)
卸载
在 设置 → 插件 里移除 dsh-katex-inline-copy,或调用 plugin_manager 的
remove_bundle。卸载后复制行为立即回到原生。
链接
同类插件
zhu1090093659/dsh-web#packages/dsh-task-board★ 10290
侧边栏多列任务看板:卡片交给真实 DSH 智能体会话执行,支持 cron 定时(Host 侧到点执行,关浏览器也生效)。
zhu1090093659/dsh-web#packages/dsh-web-all★ 10290
DSH Web UI 插件与皮肤合集:任务看板、git 图、右侧面板、远程移动端 UI、桌宠、实时 token 统计与皮肤中心。
ccch1mneyyy/dsh-TUI★ 7336
Claude Code 风格全屏终端 UI:像素鲸鱼顶栏、实时工作状态行、思考流式展开。
MeteorNOX/DeepSeek-Balance-Whale-Widget★ 7093
右下角常驻的小鲸鱼挂件:余额、今日已用与每轮对话消耗(含峰谷价),余额预警与今日预算的泡泡内容都可编辑;泡泡点击序列模块化自定义,支持并列加权 A/B、随机台词与随机图片;内置 30+ 厂商模板(OpenAI / OpenRouter / Kimi / 硅基流动 / 方舟 / 智谱 / MiniMax 等),按模型查余额与订阅额度;另有任务结束音效、导入音频、自定义角色与资源管理。数据全在本机,无遥测。
omdsh-dev/DSH-better-sidebar★ 5036
侧边栏完整工作台:内置文件渲染编辑、终端、Git 与子代理,支持三方插件注册新 Tab。
Devin-AXIS/deepseek-design#deepseek-idesign★ 1792
可视化设计工作室,支持网站、App 原型、海报、信息卡、报告和杂志的模板创建、元素编辑、选区级 AI 草稿衔接与导出。
社区评论
评论公开保存在 GitHub Discussions。加载评论会连接 GitHub 和 Giscus;发表内容需要 GitHub 账号。