{"id":"3b351b1a-47e2-4082-ab33-0adb21be1b4b","entityType":"agent","slug":"clawhub-trisia-mddoc","name":"mddoc","canonicalUrl":"https://www.xpersona.co/agent/clawhub-trisia-mddoc","canonicalPath":"/agent/clawhub-trisia-mddoc","generatedAt":"2026-10-10T07:39:55.607Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-10T03:18:30.399Z","emptyReason":null},"description":"将 Markdown 内容转换为特定学术格式的 Word 文档 (.docx)。当用户想要将 Markdown 文件、粘贴的 Markdown 文本转换为格式化的 docx 文档时使用，特别是学术论文、技术报告、毕业论文等需要严格格式要求的场景。触发词包括：/mddoc、markdown转docx、md转word、生成格式化文档、学术格式转换。即使用户只说\"把这个转成word\"而内容是Markdown，也应使用此技能。 Skill: mddoc Owner: trisia Summary: 将 Markdown 内容转换为特定学术格式的 Word 文档 (.docx)。当用户想要将 Markdown 文件、粘贴的 Markdown 文本转换为格式化的 docx 文档时使用，特别是学术论文、技术报告、毕业论文等需要严格格式要求的场景。触发词包括：/mddoc、markdown转docx、md转word、生成格式化文档、学术格式转换。即使用户只说\"把这个转成word\"而内容是Markdown，也应使用此技能。 Tags: latest:0.1.10 Version history: v0.1.10 | 2026-08-19T05:37:17.400Z | auto - Improved二级标题（##）实现：新增 set_first_line_indent_chars，确保完全无缩进以满足顶格要求。 - 更新格式示例和文档，二级标题采用 set_fi","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.7K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s17fmfnyadz9tm2f81v06tdpj98a6xpk:mddoc","sourceUrl":"https://clawhub.ai/trisia/mddoc","homepage":"https://clawhub.ai/trisia/skills/mddoc","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/trisia/mddoc","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/trisia/skills/mddoc","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":65,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"将 Markdown 内容转换为特定学术格式的 Word 文档 (.docx)。当用户想要将 Markdown 文件、粘贴的 Markdown 文本转换为格式化的 docx 文档时使用，特别是学术论文、技术报告、毕业论文等需要严格格式要求的场景。触发词包括：/mddoc、markdown转docx、md转word、生成"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-10T03:18:30.399Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T03:18:30.399Z","emptyReason":null},"stars":null,"forks":null,"downloads":1741,"packageName":null,"latestVersion":"0.1.10","tractionLabel":"1.7K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T03:18:30.398Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T03:18:30.399Z","lastCrawledAt":"2026-10-10T03:18:30.398Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T03:18:30.398Z","lastVerifiedAt":null,"highlights":[{"version":"0.1.10","createdAt":"2026-08-19T05:37:17.400Z","changelog":"- Improved二级标题（##）实现：新增 set_first_line_indent_chars，确保完全无缩进以满足顶格要求。 - 更新格式示例和文档，二级标题采用 set_first_line_indent_chars(p, 0) 而非简单 first_line_indent=Pt(0)。 - 移除 skill-card.md 文件。","fileCount":8,"zipByteSize":39112},{"version":"0.1.9","createdAt":"2026-08-17T03:17:02.250Z","changelog":"mddoc v0.1.9 - Updated documentation in SKILL.md, including usage, formatting rules, and code samples. - Bumped version to 0.1.9. - Removed redundant skill-card.md file. - Minor maintenance updates to setup_env.py script.","fileCount":8,"zipByteSize":38112},{"version":"0.1.8","createdAt":"2026-08-12T05:39:13.480Z","changelog":"**专用虚拟环境与更加可靠的依赖自动化，使用方式大变更：** - 新增 `scripts/setup_env.py`，提供一次性专用虚拟环境自检/准备，并自动补充依赖，仅首次/升级时运行。 - 虚拟环境与依赖自动配置移到 `~/.cache/mddocx/venv`，无需每次都在 skill 目录建环境，持久、自动检测和修复依赖缺失。 - 所有转换操作统一用“专用环境python”调用，无需再手动激活或关心依赖，命令行更简洁稳定。 - 文档与快速开始说明全面适配新流程，并去除旧 skill-card.md。 - 原有转换和格式规则保持不变，兼容原有所有 Markdown→docx 场景。","fileCount":8,"zipByteSize":38006},{"version":"0.1.7","createdAt":"2026-08-03T08:35:14.417Z","changelog":"mddoc 0.1.7 - Updated core script and documentation for improved Markdown to DOCX conversion. - Removed the deprecated skill-card.md file. - Minor adjustments and clarifications in SKILL.md for usage and format guidelines.","fileCount":7,"zipByteSize":34809},{"version":"0.1.6","createdAt":"2026-07-17T01:44:36.777Z","changelog":"mddoc 0.1.6 - 支持四级及以上标题（####、#####、######），设置对应 outline_level 并按正文格式排版。 - 移除 skill-card.md 文件，简化项目结构。 - 文档（SKILL.md）详细补充了四级及以上标题的格式规范和示例代码。 - 其他内容无破坏性变动，保留全部学术排版细节与调用方法不变。","fileCount":7,"zipByteSize":31175},{"version":"0.1.5","createdAt":"2026-07-15T08:14:00.191Z","changelog":"- Added version field to SKILL.md and updated descriptions. - Improved quick start instructions to recommend using a Python virtual environment for easier dependency management. - Enhanced environment handling logic: now checks for and prepares a .venv environment automatically as needed. - Added a new test file (evals/test-latex-coverage.md) for LaTeX coverage evaluation. - Removed obsolete skill-card.md documentation.","fileCount":7,"zipByteSize":30740},{"version":"0.1.4","createdAt":"2026-07-15T03:21:36.939Z","changelog":"No file changes detected in this release. - Version updated to 0.1.4, but no code or documentation changes have been made.","fileCount":6,"zipByteSize":23315},{"version":"0.1.3","createdAt":"2026-07-15T03:10:45.840Z","changelog":"mddoc 0.1.3 - 新增脚本 scripts/md2docx.py，支持 Markdown 转 DOCX 核心功能本地化执行。 - 增加 evals/evals.json、evals/test-sample.md，用于功能评测和样例测试。 - skill-card.md 已移除。 - 图题、表题编号支持无章标题（不带 <章>- 前缀）场景，alt 为空时自动用图片文件名。 - 三线表、编号、页眉等功能规范细节完善。","fileCount":6,"zipByteSize":22922}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17fmfnyadz9tm2f81v06tdpj98a6xpk:mddoc","setupComplexity":"low","setupSteps":["Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-trisia-mddoc/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-trisia-mddoc/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-trisia-mddoc/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-trisia-mddoc/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-trisia-mddoc/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-trisia-mddoc/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-10T07:39:55.605Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-trisia-mddoc/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-trisia-mddoc/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-trisia-mddoc/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-trisia-mddoc/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-10T03:18:30.399Z","emptyReason":null},"readme":"Skill: mddoc\n\nOwner: trisia\n\nSummary: 将 Markdown 内容转换为特定学术格式的 Word 文档 (.docx)。当用户想要将 Markdown 文件、粘贴的 Markdown 文本转换为格式化的 docx 文档时使用，特别是学术论文、技术报告、毕业论文等需要严格格式要求的场景。触发词包括：/mddoc、markdown转docx、md转word、生成格式化文档、学术格式转换。即使用户只说\"把这个转成word\"而内容是Markdown，也应使用此技能。\n\nTags: latest:0.1.10\n\nVersion history:\n\nv0.1.10 | 2026-08-19T05:37:17.400Z | auto\n\n- Improved二级标题（##）实现：新增 set_first_line_indent_chars，确保完全无缩进以满足顶格要求。\n- 更新格式示例和文档，二级标题采用 set_first_line_indent_chars(p, 0) 而非简单 first_line_indent=Pt(0)。\n- 移除 skill-card.md 文件。\n\nv0.1.9 | 2026-08-17T03:17:02.250Z | auto\n\nmddoc v0.1.9\n\n- Updated documentation in SKILL.md, including usage, formatting rules, and code samples.\n- Bumped version to 0.1.9.\n- Removed redundant skill-card.md file.\n- Minor maintenance updates to setup_env.py script.\n\nv0.1.8 | 2026-08-12T05:39:13.480Z | auto\n\n**专用虚拟环境与更加可靠的依赖自动化，使用方式大变更：**\n\n- 新增 `scripts/setup_env.py`，提供一次性专用虚拟环境自检/准备，并自动补充依赖，仅首次/升级时运行。\n- 虚拟环境与依赖自动配置移到 `~/.cache/mddocx/venv`，无需每次都在 skill 目录建环境，持久、自动检测和修复依赖缺失。\n- 所有转换操作统一用“专用环境python”调用，无需再手动激活或关心依赖，命令行更简洁稳定。\n- 文档与快速开始说明全面适配新流程，并去除旧 skill-card.md。\n- 原有转换和格式规则保持不变，兼容原有所有 Markdown→docx 场景。\n\nv0.1.7 | 2026-08-03T08:35:14.417Z | auto\n\nmddoc 0.1.7\n\n- Updated core script and documentation for improved Markdown to DOCX conversion.\n- Removed the deprecated skill-card.md file.\n- Minor adjustments and clarifications in SKILL.md for usage and format guidelines.\n\nv0.1.6 | 2026-07-17T01:44:36.777Z | auto\n\nmddoc 0.1.6\n\n- 支持四级及以上标题（####、#####、######），设置对应 outline_level 并按正文格式排版。\n- 移除 skill-card.md 文件，简化项目结构。\n- 文档（SKILL.md）详细补充了四级及以上标题的格式规范和示例代码。\n- 其他内容无破坏性变动，保留全部学术排版细节与调用方法不变。\n\nv0.1.5 | 2026-07-15T08:14:00.191Z | auto\n\n- Added version field to SKILL.md and updated descriptions.\n- Improved quick start instructions to recommend using a Python virtual environment for easier dependency management.\n- Enhanced environment handling logic: now checks for and prepares a .venv environment automatically as needed.\n- Added a new test file (evals/test-latex-coverage.md) for LaTeX coverage evaluation.\n- Removed obsolete skill-card.md documentation.\n\nv0.1.4 | 2026-07-15T03:21:36.939Z | user\n\nNo file changes detected in this release.\n\n- Version updated to 0.1.4, but no code or documentation changes have been made.\n\nv0.1.3 | 2026-07-15T03:10:45.840Z | user\n\nmddoc 0.1.3\n\n- 新增脚本 scripts/md2docx.py，支持 Markdown 转 DOCX 核心功能本地化执行。\n- 增加 evals/evals.json、evals/test-sample.md，用于功能评测和样例测试。\n- skill-card.md 已移除。\n- 图题、表题编号支持无章标题（不带 <章>- 前缀）场景，alt 为空时自动用图片文件名。\n- 三线表、编号、页眉等功能规范细节完善。\n\nv0.1.2 | 2026-07-14T07:04:26.543Z | auto\n\n- Added explicit rules for handling input without a `#` title: skips title page, uses \"未命名文档\" as title in page header and output filename for `--text` mode, and uses input filename otherwise.\n- Updated output file naming: when no `#` title is present, output file is named after the original file or defaults to \"未命名文档.docx\" for pasted text.\n- Clarified header formatting: right header displays \"未命名文档\" if no title is detected, left side remains \"xxxxx\".\n- Removed `skill-card.md` file.\n\nv0.1.1 | 2026-07-09T09:05:48.310Z | auto\n\n- 明确了A4页面的页边距为左3cm、右2cm、上2cm、下2cm，页脚距底1cm。\n- 移除了 skill-card.md 文件，不再包含该简介卡片。\n- 其它内容未作改动。\n\nv0.1.0 | 2026-07-09T07:52:14.866Z | auto\n\nInitial release of mddoc.\n\n- Converts Markdown content to academic-style Word (.docx) documents.\n- Supports pasted Markdown text and file input; recognizes trigger phrases like /mddoc, md转word, and more.\n- Implements detailed formatting rules for academic papers, including title, headings, paragraph, table, image, list, and code block styles.\n- Includes references to ready-to-use Python code for each formatting element, based on python-docx.\n- Provides workflow, output file naming, strict style requirements, and content structure examples.\n- Designed for use cases such as theses, technical reports, and documents with strict academic formatting needs.\n\nArchive index:\n\nArchive v0.1.10: 8 files, 39112 bytes\n\nFiles: evals/evals.json (1585b), evals/test-latex-coverage.md (4031b), evals/test-sample.md (2833b), scripts/md2docx.py (79653b), scripts/setup_env.py (3586b), skill-card.md (1949b), SKILL.md (26171b), _meta.json (125b)\n\nFile v0.1.10:SKILL.md\n\n---\nname: mddoc\nversion: 1.0.10\ndescription: 将 Markdown 内容转换为特定学术格式的 Word 文档 (.docx)。当用户想要将 Markdown 文件、粘贴的 Markdown 文本转换为格式化的 docx 文档时使用，特别是学术论文、技术报告、毕业论文等需要严格格式要求的场景。触发词包括：/mddoc、markdown转docx、md转word、生成格式化文档、学术格式转换。即使用户只说\"把这个转成word\"而内容是Markdown，也应使用此技能。\n---\n\n# mddoc — Markdown 转学术格式 DOCX\n\n## 快速开始\n\n```bash\n# 1) 环境自检与准备（一次性，幂等）：创建/复用专用虚拟环境，仅缺失依赖时才安装\n#    专用环境位置：~/.cache/mddocx/venv（Windows: %LOCALAPPDATA%/mddocx/venv）\npython3 <skill-path>/scripts/setup_env.py\n#    输出最后一行 `READY <python>` 即就绪解释器路径\n\n# 2) 转换 Markdown 文件 → 输出到同目录（环境就绪后无需再检查）\n~/.cache/mddocx/venv/bin/python <skill-path>/scripts/md2docx.py paper.md\n\n# 指定输出路径\n~/.cache/mddocx/venv/bin/python <skill-path>/scripts/md2docx.py paper.md -o /path/to/output.docx\n\n# 直接转换粘贴的文本\n~/.cache/mddocx/venv/bin/python <skill-path>/scripts/md2docx.py --text \"# 标题\\n\\n正文内容\" -o out.docx\n```\n\n其中 `<skill-path>` = `/home/kkk/.claude/skills/mddoc`\n\n## 工作流程\n\n1. **读取输入** — 若用户粘贴 Markdown 文本则直接读取；若用户提供文件路径（含 `@` 引用）则读取该文件\n2. **检查并准备环境** — 专用虚拟环境固定于 `~/.cache/mddocx/venv`（Windows: `%LOCALAPPDATA%/mddocx/venv`）：\n   - 若该环境存在且能 `import docx, PIL, requests, mistune` → 直接转换，不安装\n   - 环境缺失或依赖缺失时，才运行 `python3 <skill-path>/scripts/setup_env.py` 创建/安装（幂等，仅缺失时安装）\n3. **执行转换** — 用专用解释器 `~/.cache/mddocx/venv/bin/python` 运行内置脚本 `scripts/md2docx.py`；若 Markdown 结构特殊则参照下方格式规范编写自定义脚本\n4. **确定输出** — 文件路径输入→同目录；粘贴内容→当前目录；文件名=「题目.docx」（题目从第一个 `# 标题` 提取；若无 `#` 标题则使用输入文件名，`--text` 模式为「未命名文档.docx」）\n5. **验证** — 检查 outline level、图片嵌入、页眉、分页符\n\n---\n\n## 格式参考\n\n> 每个元素配可直接使用的 python-docx 代码。公共导入和工具函数：\n\n```python\nfrom docx import Document\nfrom docx.shared import Pt, Cm\nfrom docx.enum.text import WD_ALIGN_PARAGRAPH\nfrom docx.oxml import OxmlElement\nfrom docx.oxml.ns import qn\n\ndef set_cn_font(run, cn_name, en_name='Times New Roman', size_pt=10.5, bold=False):\n    \"\"\"设置 run 的中英文字体、字号、加粗、颜色(黑)\"\"\"\n    run.font.size = Pt(size_pt)\n    run.font.bold = bold\n    run.font.name = en_name\n    run.font.color.rgb = None\n    rPr = run._element.get_or_add_rPr()\n    rFonts = rPr.find(qn('w:rFonts'))\n    if rFonts is None:\n        rFonts = OxmlElement('w:rFonts'); rPr.insert(0, rFonts)\n    rFonts.set(qn('w:eastAsia'), cn_name)\n    rFonts.set(qn('w:ascii'), en_name)\n    rFonts.set(qn('w:hAnsi'), en_name)\n\ndef add_empty(doc):\n    \"\"\"五号空行\"\"\"\n    p = doc.add_paragraph()\n    run = p.add_run('')\n    set_cn_font(run, '宋体', size_pt=10.5)\n    return p\n\ndef set_outline(para, level):\n    \"\"\"设置 outline level（XML方式，兼容所有python-docx版本）\"\"\"\n    pPr = para._element.get_or_add_pPr()\n    ol = OxmlElement('w:outlineLvl')\n    ol.set(qn('w:val'), str(level))\n    pPr.append(ol)\n```\n\n### 基础设置\n\n五号=10.5pt，1.3倍行距，段前段后0磅，全黑，A4页边距左3cm右2cm上2cm下2cm，页脚距底1cm。\n\n```python\ndoc = Document()\nsection = doc.sections[0]\n# 页边距：左3cm 右2cm 上2cm 下2cm\nsection.left_margin = Cm(3)\nsection.right_margin = Cm(2)\nsection.top_margin = Cm(2)\nsection.bottom_margin = Cm(2)\n\nsty = doc.styles['Normal']\nsty.font.size = Pt(10.5)\nsty.font.name = 'Times New Roman'\nsty.element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')\nsty.paragraph_format.line_spacing = 1.3\nsty.paragraph_format.space_before = Pt(0)\nsty.paragraph_format.space_after = Pt(0)\n```\n\n### 空行规则\n\n- **段落之间**：不空行\n- **题目**：上下各空一行\n- **一级标题**：上下各空一行\n- **二级/三级标题**：上下不空行\n- **图片**：上方空一行，图题下方空一行\n- **表格**：表题上方空一行，表格下方空一行\n\n### 题目（第一个 `#`）\n\n三号黑体(16pt)、居中、上下各空一行、**不设 outline level**。\n\n```python\nadd_empty(doc)\np = doc.add_paragraph()\np.alignment = WD_ALIGN_PARAGRAPH.CENTER\n# 题目不设 outline_level\nrun = p.add_run(title_text)\nset_cn_font(run, '黑体', size_pt=16)\nadd_empty(doc)\n```\n\n### 无标题文档\n\n当输入 Markdown 没有 `#` 标题时：\n- 跳过标题页，文档从第一个内容节点开始排版\n- 页眉右侧显示「未命名文档」代替标题\n- 页眉左侧「xxxxx」保持不变\n- 输出文件名：文件输入使用输入文件名（如 `paper.md` → `paper.docx`），`--text` 模式使用「未命名文档.docx」\n\n### 一级标题（后续 `#`）\n\n三号黑体(16pt)、居中、上下各空一行、outline_level=1、**前加分页符**。\n\n\n```python\nadd_empty(doc)\np = doc.add_paragraph()\np.alignment = WD_ALIGN_PARAGRAPH.CENTER\nset_outline(p, 1)\n# 分页符\npPr = p._element.get_or_add_pPr()\npPr.append(OxmlElement('w:pageBreakBefore'))\nrun = p.add_run(text)\nset_cn_font(run, '黑体', size_pt=16)\nadd_empty(doc)\n```\n\n### 二级标题（`##`）\n\n四号黑体(14pt)、**不加粗**、顶格(无缩进)、outline_level=2。上下不空行。\n顶格须清除 firstLine 与 firstLineChars 两种缩进（并确保标题样式无缩进），否则 Word/WPS 会套用 2 字符首行缩进。\n\n```python\np = doc.add_paragraph()\nset_outline(p, 2)\nset_first_line_indent_chars(p, 0)  # 顶格：清除 firstLine 与 firstLineChars\nrun = p.add_run(text)\nset_cn_font(run, '黑体', size_pt=14, bold=False)\n```\n\n### 三级标题（`###`）\n\n小四宋体(12pt)、**不加粗**、首行缩进Pt(21)(=2个中文字)、outline_level=3。\n\n```python\np = doc.add_paragraph()\nset_outline(p, 3)\np.paragraph_format.first_line_indent = Pt(21)\nrun = p.add_run(text)\nset_cn_font(run, '宋体', size_pt=12, bold=False)\n```\n\n### 四级及以上标题（`####`、`#####`、`######`）\n\n格式与正文相同（五号宋体 10.5pt、首行缩进Pt(21)、1.3倍行距），但设置对应的 outline_level（4/5/6）。上下不空行。\n\n```python\np = doc.add_paragraph()\nset_outline(p, level)  # 4、5 或 6，按实际标题层级\np.paragraph_format.first_line_indent = Pt(21)\np.paragraph_format.line_spacing = 1.3\np.paragraph_format.space_before = Pt(0)\np.paragraph_format.space_after = Pt(0)\nrun = p.add_run(text)\nset_cn_font(run, '宋体', size_pt=10.5, bold=False)\n```\n\n### 正文段落\n\n五号(10.5pt)宋体/TNR、首行缩进Pt(21)、1.3倍行距、段前段后0磅。\n\n```python\np = doc.add_paragraph()\np.paragraph_format.first_line_indent = Pt(21)\np.paragraph_format.line_spacing = 1.3\np.paragraph_format.space_before = Pt(0)\np.paragraph_format.space_after = Pt(0)\nrun = p.add_run(text)\nset_cn_font(run, '宋体', size_pt=10.5)\n```\n\n### 图片\n\n下载嵌入(不压缩)、等比缩放(8-12cm规则)、居中、上方空一行。\n\n```python\nimport requests\nfrom PIL import Image\n\ndef dl_image(url):\n    h = {'User-Agent': 'Mozilla/5.0 (compatible; mddoc/1.0)'}\n    r = requests.get(url, headers=h, timeout=30); r.raise_for_status()\n    return r.content  # bytes, 可保存为临时文件\n\ndef img_width(path):\n    img = Image.open(path)\n    dpi = img.info.get('dpi', (96, 96))\n    dx = dpi[0] if dpi and dpi[0] > 0 else 96\n    w_cm = img.width / dx * 2.54\n    if   w_cm > 12: tw = 12.0\n    elif w_cm < 8:  tw = 8.0\n    else:           tw = w_cm\n    return Cm(tw)\n\nadd_empty(doc)\np = doc.add_paragraph()\np.alignment = WD_ALIGN_PARAGRAPH.CENTER\np.add_run().add_picture(img_path, width=img_width(img_path))\n```\n\n### 图题\n\n图片下方(不空行)、小五(9pt)宋体加粗居中、逐章编号。有章标题时格式 `图<章>-<序号> <alt>`，无章标题时格式 `图<序号> <alt>`。若 alt 为空，自动使用图片文件名（不含扩展名）作为图题。\n\n```python\np = doc.add_paragraph()\np.alignment = WD_ALIGN_PARAGRAPH.CENTER\nrun = p.add_run(f'图{ch}-{idx} {alt_text}')\nset_cn_font(run, '宋体', size_pt=9, bold=True)\nadd_empty(doc)  # 图题下方空一行\n```\n\n### 表格 + 表题\n\n**三线表**(顶线1.5pt/表头底线0.75pt/底线1.5pt粗，无竖线)。表题在上方(不空行)、五号(10.5pt)宋体加粗居中。有章标题时格式`表<章>-<序号> <描述>`，无章标题时格式`表<序号> <描述>`。\n\n```python\n# 表题\nadd_empty(doc)\np = doc.add_paragraph(); p.alignment = WD_ALIGN_PARAGRAPH.CENTER\nrun = p.add_run(f'表{ch}-{idx} {caption}')\nset_cn_font(run, '宋体', size_pt=10.5, bold=True)\n\n# 表格\ntb = doc.add_table(rows=nrows, cols=ncols)\ntb.alignment = WD_ALIGN_PARAGRAPH.CENTER\n\n# 三线表边框\nPr = tb._tbl.tblPr or OxmlElement('w:tblPr')\nB = OxmlElement('w:tblBorders')\nfor tag, sz in [('top','12'),('bottom','12')]:\n    e = OxmlElement(f'w:{tag}'); e.set(qn('w:val'),'single')\n    e.set(qn('w:sz'),sz); e.set(qn('w:space'),'0'); e.set(qn('w:color'),'000000')\n    B.append(e)\nfor tag in ('left','right','insideH','insideV'):\n    e = OxmlElement(f'w:{tag}'); e.set(qn('w:val'),'none')\n    e.set(qn('w:sz'),'0'); e.set(qn('w:space'),'0'); e.set(qn('w:color'),'auto')\n    B.append(e)\nPr.append(B)\n# 表头行每格底部加细线 0.75pt（cell级别，不影响数据行）\nfor cell in tb.rows[0].cells:\n    tcPr = cell._tc.get_or_add_tcPr()\n    tcB = OxmlElement('w:tcBorders')\n    btm = OxmlElement('w:bottom')\n    btm.set(qn('w:val'),'single'); btm.set(qn('w:sz'),'6')\n    btm.set(qn('w:space'),'0'); btm.set(qn('w:color'),'000000')\n    tcB.append(btm); tcPr.append(tcB)\n\n# header/data 为 mistune table_cell['children'] AST 列表（取 cell.get('children', [])）\n# 单元格内 **加粗**、*斜体*、$公式$ 由 walk_inline 渲染，公式字号跟随 9pt\n# 表头行 — 居中、9pt、垂直居中、无缩进\nfor j, children in enumerate(header):\n    c = tb.rows[0].cells[j]\n    c.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER\n    p = c.paragraphs[0]; p.clear()\n    p.alignment = WD_ALIGN_PARAGRAPH.CENTER\n    p.paragraph_format.first_line_indent = Pt(0)\n    p.paragraph_format.line_spacing = 1.0\n    _set_para_mark_size(p, 9)\n    walk_inline(p, children, '宋体', size_pt=9)\n\n# 数据行 — 左对齐、9pt、垂直居中、无缩进\nfor i, row in enumerate(data):\n    for j, children in enumerate(row):\n        c = tb.rows[i+1].cells[j]\n        c.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER\n        p = c.paragraphs[0]; p.clear()\n        p.paragraph_format.first_line_indent = Pt(0)\n        p.paragraph_format.line_spacing = 1.0\n        _set_para_mark_size(p, 9)\n        walk_inline(p, children, '宋体', size_pt=9)\n\nadd_empty(doc)  # 表格下方空一行\n```\n\n### 页眉\n\n左顶格\"xxxxx\"、右顶格文档题目、小五(9pt)黑体。\n\n```python\nsec = doc.sections[0]; hdr = sec.header\nhdr.is_linked_to_previous = False\nr = hdr.paragraphs[0].add_run('xxxxx')\nset_cn_font(r, '黑体', size_pt=9)\np2 = hdr.add_paragraph(); p2.alignment = WD_ALIGN_PARAGRAPH.RIGHT\nr2 = p2.add_run(title_text)\nset_cn_font(r2, '黑体', size_pt=9)\n```\n\n### 列表\n\n使用 Word 原生编号/项目符号（`w:numPr` XML），支持富文本 inline 和多级嵌套。列表段落遵守正文格式（首行缩进 Pt(21)、1.3 倍行距）。\n\n```python\n# 列表编号定义（生成文档时需在 numbering.xml 中注入抽象编号）\nused_ids = _ensure_list_numbering_defs(doc)  # 定义 numId=50(有序) 和 numId=51(无序)，各 3 级\n# 有序列表 — 每块独立 numId，多级格式: 1. → a) → i.\n# 无序列表 — numId=51，多级符号: • → ◦ → ▪\n# 每个有序列表块用 _new_list_num_id() 分配独立 numId，\n# 被正文打断后重新从 1 编号（共享 numId=50 会导致 Word 持续递增）\nnum_id = '51'\nif ordered:\n    num_id = _new_list_num_id(doc.part.numbering_part._element, '50', used_ids)\nfor item in list_node['children']:\n    p = doc.add_paragraph()\n    p.paragraph_format.first_line_indent = Pt(21)  # 同正文\n    p.paragraph_format.line_spacing = 1.3\n    # 设置 Word 原生编号\n    numPr = OxmlElement('w:numPr')\n    ilvl = OxmlElement('w:ilvl'); ilvl.set(qn('w:val'), str(depth))\n    numId = OxmlElement('w:numId'); numId.set(qn('w:val'), num_id)\n    numPr.append(ilvl); numPr.append(numId)\n    p._element.get_or_add_pPr().append(numPr)\n    # walk_inline 渲染富文本（支持 **加粗**、*斜体*、$公式$）\n    walk_inline(p, item['children'][0]['children'], '宋体', size_pt=10.5)\n    # 嵌套子列表：递归调用 render_list(doc, child, depth+1, used_ids)\n```\n\n每个有序列表块使用独立 `numId`（同一 abstractNum 的不同实例各自从 1 计数），被打断后重新编号；列表编号自动跨页连续。\n\n### 内联格式（加粗、斜体、行内公式等）\n\n段落内使用 `walk_inline()` 递归遍历 mistune inline AST，生成带格式的 runs 和 OMML 元素。格式状态（加粗/斜体/下划线）递归下传，同时作用于文本 run 和公式 OMML：\n\n```python\ndef walk_inline(paragraph, children, base_cn='宋体', base_en='Times New Roman',\n                base_size=10.5, bold=False, italic=False, underline=False):\n    for child in children:\n        ct = child['type']\n        if ct == 'text':\n            if child.get('raw', ''):\n                run = paragraph.add_run(child['raw'])\n                set_cn_font(run, base_cn, en_font=base_en, size_pt=base_size, bold=bold)\n                if italic: run.font.italic = True\n                if underline: run.font.underline = True\n        elif ct == 'strong':  # **加粗** — 递归传 bold=True\n            walk_inline(paragraph, child['children'], base_cn, base_en, base_size,\n                        bold=True, italic=italic, underline=underline)\n        elif ct == 'emphasis':  # *斜体* — 递归传 italic=True\n            walk_inline(paragraph, child['children'], base_cn, base_en, base_size,\n                        bold=bold, italic=True, underline=underline)\n        elif ct == 'link':  # 链接 — 递归传 underline=True\n            walk_inline(paragraph, child['children'], base_cn, base_en, base_size,\n                        bold=bold, italic=italic, underline=True)\n        elif ct == 'inline_math':  # $...$\n            omml = latex_to_omml(child['raw'], display=False)\n            paragraph._element.append(apply_omml_style(omml, bold, italic))\n        elif ct == 'codespan':  # `代码`\n            run = paragraph.add_run(child.get('raw', ''))\n            set_cn_font(run, base_cn, en_font=base_en, size_pt=base_size)\n\n\ndef apply_omml_style(omml, bold=False, italic=False):\n    \"\"\"为公式内所有 m:r 添加 <m:sty m:val=\"b/i/bi\"/>，使 **$x$**、*$x$* 嵌套公式生效\"\"\"\n    if not (bold or italic):\n        return omml\n    val = ('b' if bold else '') + ('i' if italic else '')\n    NSM = '{http://schemas.openxmlformats.org/officeDocument/2006/math}'\n    for r in omml.iter(f'{NSM}r'):\n        rPr = r.find(f'{NSM}rPr')\n        if rPr is None:\n            rPr = OxmlElement('m:rPr')\n            r.insert(0, rPr)\n        if rPr.find(f'{NSM}sty') is None:\n            sty = OxmlElement('m:sty')\n            sty.set(qn('m:val'), val)\n            rPr.append(sty)\n    return omml\n\n\ndef _set_para_mark_size(paragraph, size_pt):\n    \"\"\"设置段落标记字号（半磅），供行内公式 OMML 继承（如 9 → 9pt）\"\"\"\n    pPr = paragraph._element.get_or_add_pPr()\n    rPr = pPr.find(qn('w:rPr'))\n    if rPr is None:\n        rPr = OxmlElement('w:rPr')\n        pPr.append(rPr)\n    sz = rPr.find(qn('w:sz'))\n    if sz is None:\n        sz = OxmlElement('w:sz')\n        rPr.append(sz)\n    sz.set(qn('w:val'), str(int(size_pt * 2)))\n```\n\n`***加粗斜体***` → AST: `emphasis > strong` → 递归自然处理为 bold+italic。嵌套在加粗/斜体里的公式（`**$x$**`、`*$x$*`）由 `apply_omml_style()` 保留并上样式。\n\n### 标题样式清理\n\n生成前覆盖 Word 内置 Heading 1-6 样式，防止默认蓝色/Cambria/加粗干扰：\n\n```python\ndef override_builtin_heading_styles(doc):\n    specs = {\n        'Heading 1': ('黑体', 16, True, WD_ALIGN_PARAGRAPH.CENTER),\n        'Heading 2': ('黑体', 14, False, WD_ALIGN_PARAGRAPH.LEFT),\n        'Heading 3': ('宋体', 12, False, WD_ALIGN_PARAGRAPH.LEFT),\n        'Heading 4': ('宋体', 10.5, False, WD_ALIGN_PARAGRAPH.LEFT),\n        'Heading 5': ('宋体', 10.5, False, WD_ALIGN_PARAGRAPH.LEFT),\n        'Heading 6': ('宋体', 10.5, False, WD_ALIGN_PARAGRAPH.LEFT),\n    }\n    for name, (cn_font, size_pt, bold, align) in specs.items():\n        style = doc.styles[name]\n        style.font.size = Pt(size_pt)\n        style.font.bold = bold\n        style.font.color.rgb = None  # 黑色\n        style.font.italic = False\n        style.font.underline = False\n        rPr = style.element.get_or_add_rPr()\n        rFonts = rPr.find(qn('w:rFonts'))\n        if rFonts is None:\n            rFonts = OxmlElement('w:rFonts'); rPr.insert(0, rFonts)\n        rFonts.set(qn('w:eastAsia'), cn_font)\n```\n\n调用位置：`generate_docx()` 中 `doc = Document()` 后立即执行。\n\n### 代码块\n\nTimes New Roman 字体、五号、无首行缩进、灰色背景(#D9D9D9)、上下各空一行。\n\n```python\nadd_empty(doc)\np = doc.add_paragraph()\nset_first_line_indent_chars(p, 0)  # 代码块无首行缩进\n# 灰色背景\npPr = p._element.get_or_add_pPr()\nshd = OxmlElement('w:shd')\nshd.set(qn('w:val'), 'clear')\nshd.set(qn('w:color'), 'auto')\nshd.set(qn('w:fill'), 'D9D9D9')\npPr.append(shd)\nrun = p.add_run(code)\nset_cn_font(run, '宋体', en_name='Times New Roman', size_pt=10.5)\nadd_empty(doc)\n```\n\n### 行内公式（`$...$`）\n\n嵌于段落中，转换为 OMML（Office Math Markup Language）格式，WPS/Word 可直接渲染。\n公式在段落中作为 `<m:oMath>` 元素插入，与文字 run 同级。\n\n```python\n# 行内公式通过 split_inline_math() 拆分为 segments\n# text segment → 普通 run，math segment → latex_to_omml() → m:oMath 元素\np = doc.add_paragraph()\np.paragraph_format.first_line_indent = Pt(21)\np.paragraph_format.line_spacing = 1.3\nfor seg in segments:\n    if seg['type'] == 'text':\n        if seg['content']:\n            run = p.add_run(seg['content'])\n            set_cn_font(run, '宋体', size_pt=10.5)\n    else:  # math — 转换为 OMML 并插入段落 XML\n        omml = latex_to_omml(seg['content'], display=False)\n        p._element.append(omml)\n```\n\n### 行间公式（`$$...$$`）\n\n独立成行，上下各空一行。公式通过 OMML 居中渲染，编号右对齐。编号格式同图/表：`(章-序号)`，逐章编号。编号括号用五号宋体，数字用五号 Times New Roman。\n\n布局方式：段落设置居中和右对齐 tab stop，OMML `<m:oMath>` 元素位于两个 tab 之间，实现公式居中、编号右对齐。\n\n```python\nadd_empty(doc)  # 上方空一行\np = doc.add_paragraph()\n\n# 设置 tab stops：居中和右对齐\n# 左边距3cm右边距2cm → 可用宽度16cm → 中心8cm(4536twips), 右边16cm(9072twips)\npPr = p._element.get_or_add_pPr()\ntabs = OxmlElement('w:tabs')\nct = OxmlElement('w:tab'); ct.set(qn('w:val'), 'center'); ct.set(qn('w:pos'), '4536')\nrt = OxmlElement('w:tab'); rt.set(qn('w:val'), 'right'); rt.set(qn('w:pos'), '9072')\ntabs.append(ct); tabs.append(rt)\npPr.append(tabs)\n\n# tab → 公式 OMML 居中\nrun_t1 = p.add_run()\nrun_t1._r.append(OxmlElement('w:tab'))\nomml = latex_to_omml(formula_text, display=False)\np._element.append(omml)\n\n# tab → 编号右对齐：(章-序号)\nrun_t2 = p.add_run()\nrun_t2._r.append(OxmlElement('w:tab'))\nrun_lp = p.add_run('(')\nset_cn_font(run_lp, '宋体', en_name='宋体', size_pt=10.5)\nrun_num = p.add_run(f'{ch}-{eq_num}')\nset_cn_font(run_num, '宋体', en_name='Times New Roman', size_pt=10.5)\nrun_rp = p.add_run(')')\nset_cn_font(run_rp, '宋体', en_name='宋体', size_pt=10.5)\n\nadd_empty(doc)  # 下方空一行\n```\n\n### LaTeX → OMML 转换\n\n内置 `latex_to_omml()` 函数将 LaTeX 数学公式转换为 OMML XML，支持以下构造：\n\n- 上下标：`a^b`、`a_b`、`a_b^c`\n- 分数：`\\frac{a}{b}`\n- 根式：`\\sqrt{x}`、`\\sqrt[n]{x}`\n- 希腊字母：`\\alpha`、`\\beta`、`\\Gamma` 等\n- 大运算符：`\\sum`、`\\prod`、`\\int`（含上下限）\n- 函数名：`\\sin`、`\\cos`、`\\log`、`\\lim` 等\n- 重音：`\\hat`、`\\bar`、`\\vec`、`\\tilde` 等\n- 符号：`\\infty`、`\\cdot`、`\\times`、`\\partial`、`\\nabla` 等\n- 定界符：`\\left(...\\right)`、`\\left[...\\right]`\n- 文本：`\\text{...}`\n\n### 页码\n\n从第一章（第一个一级标题所在页）开始编页码，格式 `第×页  共×页`，页脚边距 1cm。\n\n```python\nfrom docx.oxml import OxmlElement\nfrom docx.oxml.ns import qn\nfrom docx.shared import Cm\n\nsection = doc.sections[0]\nsection.footer_distance = Cm(1.1)  # 页脚边距\n\nfooter = section.footer\nfooter.is_linked_to_previous = False\nfp = footer.paragraphs[0]\nfp.alignment = WD_ALIGN_PARAGRAPH.CENTER\n\n# \"第\" 字\nrun1 = fp.add_run('第')\nset_cn_font(run1, '宋体', size_pt=10.5)\n# 页码字段\nrun_page = fp.add_run()\nfldChar1 = OxmlElement('w:fldChar'); fldChar1.set(qn('w:fldCharType'), 'begin')\nrun_page._r.append(fldChar1)\ninstrText = OxmlElement('w:instrText'); instrText.set(qn('xml:space'), 'preserve')\ninstrText.text = ' PAGE '\nrun_page._r.append(instrText)\nfldChar2 = OxmlElement('w:fldChar'); fldChar2.set(qn('w:fldCharType'), 'end')\nrun_page._r.append(fldChar2)\n# \"页  共\"\nrun2 = fp.add_run('页  共')\nset_cn_font(run2, '宋体', size_pt=10.5)\n# 总页数字段\nrun_total = fp.add_run()\nfldChar3 = OxmlElement('w:fldChar'); fldChar3.set(qn('w:fldCharType'), 'begin')\nrun_total._r.append(fldChar3)\ninstrText2 = OxmlElement('w:instrText'); instrText2.set(qn('xml:space'), 'preserve')\ninstrText2.text = ' NUMPAGES '\nrun_total._r.append(instrText2)\nfldChar4 = OxmlElement('w:fldChar'); fldChar4.set(qn('w:fldCharType'), 'end')\nrun_total._r.append(fldChar4)\n# \"页\"\nrun3 = fp.add_run('页')\nset_cn_font(run3, '宋体', size_pt=10.5)\n```\n\n> 注意：页码从第一章开始计数需在第一个一级标题处插入分节符并重置页码。简单场景可统一从第1页开始。\n\n### 跨页表格（续表）\n\n表头行设为重复标题行，跨页自动重复。续表在右上方标\"续表<编号>\"。\n\n```python\n# 表头行设为重复标题行（跨页自动出现）\ntblHeader = OxmlElement('w:tblHeader')\ntrPr = table.rows[0]._tr.get_or_add_trPr()\ntrPr.append(tblHeader)\n\n# 对于确实跨页的大表格，在分页处手动加\"续表\"标记：\n# （python-docx无法检测分页位置，建议生成后人工检查）\n# 续表右对齐段落示例：\np_cont = doc.add_paragraph()\np_cont.alignment = WD_ALIGN_PARAGRAPH.RIGHT\nrun_cont = p_cont.add_run(f'续表{tab_label}')\nset_cn_font(run_cont, '宋体', size_pt=10.5)\n```\n\n---\n\n## 生成后自检清单\n\n- [ ] 题目：16pt黑体、居中、无outline、上下各空一行\n- [ ] 无标题文档：跳过标题页、页眉显示「未命名文档」\n- [ ] 一级标题：16pt黑体、outline_level=1、前有分页符、上下各空一行\n- [ ] 二级标题：14pt黑体、顶格、outline_level=2、不加粗、**上下不空行**\n- [ ] 三级标题：12pt宋体、首行缩进Pt(21)、outline_level=3、不加粗、**上下不空行**\n- [ ] 四级及以上标题：10.5pt宋体同正文、首行缩进Pt(21)、outline_level=对应层级(4/5/6)、**上下不空行**\n- [ ] 正文：10.5pt、首行缩进Pt(21)、1.3倍行距、**段落间不空行**\n- [ ] 图片：嵌入、等比缩放8-12cm、居中、上下各空一行\n- [ ] 图题：9pt宋体加粗居中、图片下方\n- [ ] 表格：三线表(顶/底粗、表头格底线细、数据行无线)、居中\n- [ ] 表头行：居中、9pt、无缩进、tblHeader重复\n- [ ] 表题：10.5pt宋体加粗居中、表格上方\n- [ ] 列表：有序用 Word 原生编号、无序用 Word 原生黑圆点、悬挂缩进、支持富文本 inline\n- [ ] 代码块：Times New Roman、无缩进、灰色背景#D9D9D9、上下各空一行\n- [ ] 加粗/斜体/加粗斜体：`**文本**` bold、`*文本*` italic、`***文本***` bold+italic\n- [ ] 分隔线：`---`（3+ 连续 `-`） → 分页符\n- [ ] 页眉：左\"xxxxx\"右题目、9pt黑体\n- [ ] 行内公式：$...$ 嵌于段落、OMML格式、WPS/Word可渲染\n- [ ] 行间公式：$$...$$ OMML居中、上下各空一行、编号(章-序号)右对齐、括号宋体数字TNR\n- [ ] 页码：\"第×页 共×页\"、页脚边距1cm\n- [ ] 标题样式：Heading 1-6 已覆盖为学术格式（黑体/宋体、黑色）\n- [ ] 分隔线：`---` → 分页符\n- [ ] 续表：跨页表头重复、\"续表xx\"右上标注\n- [ ] 页边距：左3cm 右2cm 上2cm 下2cm\n- [ ] 全部黑色、无额外参数\n\n## 注意事项\n\n- **解析器**：Markdown 解析使用 mistune 3.x（`renderer='ast'`），配合 `table` 和 `math` 插件。所有 block/inline 格式由 mistune AST 提供，不再手写解析器\n- **第一个 `#` 是题目**（不设 outline），后续 `#` 是一级标题（outline_level=1）；若无 `#` 标题仍可正常生成文档\n- **图片尺寸用 `Cm()`，不手算 EMU** — `add_picture(width=Cm(x))` 自动转换\n- **图片下载必设 User-Agent** — 否则 CDN/Wikipedia 返回 400\n- **图题编号自动生成** — alt text 作为描述文字，图/表编号独立逐章编序\n- **表题识别** — 表格前含\"表\"字的段落自动作为表题（lookahead 跳过空行），不渲染为独立段落\n- **outline_level 用 `set_outline()` 设置** — `paragraph_format.outline_level` 在部分python-docx版本不生效，统一用XML方式写入；读取时也从XML读取\n- **公式编号自动生成** — 图/表/公式独立逐章编序，编号格式统一为 `章-序号`\n- **不添加**：目录页、背景色\n- **单位**：字体用 pt、尺寸用 cm\n\nFile v0.1.10:_meta.json\n\n{\n  \"ownerId\": \"kn74sxjtkhk771hzvyhh8q6hp18a69xe\",\n  \"slug\": \"mddoc\",\n  \"version\": \"0.1.10\",\n  \"publishedAt\": 1787117837400\n}\n\nFile v0.1.10:evals/test-latex-coverage.md\n\n# LaTeX 数学公式覆盖测试（IHKYoung 手册 + 完整补全）\n\n本文件测试所有已实现的 LaTeX 数学公式语法。\n\n---\n\n## 矩阵环境\n\n### bmatrix（方括号）\n\n$$\n\\begin{bmatrix} a & b \\\\ c & d \\end{bmatrix}\n$$\n\n### pmatrix（圆括号）\n\n$$\n\\begin{pmatrix} x_{11} & x_{12} \\\\ x_{21} & x_{22} \\end{pmatrix}\n$$\n\n### vmatrix（单竖线行列式）\n\n$$\n\\begin{vmatrix} a & b \\\\ c & d \\end{vmatrix}\n$$\n\n### Vmatrix（双竖线范数）\n\n$$\n\\begin{Vmatrix} a & b \\\\ c & d \\end{Vmatrix}\n$$\n\n### matrix（无括号）\n\n$$\n\\begin{matrix} 1 & 0 \\\\ 0 & 1 \\end{matrix}\n$$\n\n---\n\n## cases 环境（分段函数）\n\n$$\nf(x) = \\begin{cases} 0 & x < 0 \\\\ x^2 & 0 \\leq x < 1 \\\\ 1 & x \\geq 1 \\end{cases}\n$$\n\n---\n\n## align 环境（多行对齐）\n\n$$\n\\begin{align} x + y &= 2 \\\\ x - y &= 0 \\end{align}\n$$\n\n---\n\n## 字体命令\n\n### 粗体\n\n行内: $\\mathbf{A} = \\mathbf{B} + \\mathbf{C}$\n\n### 斜体\n\n行内: $\\mathit{variable}$\n\n### 手写体（花体）\n\n行内: $\\mathcal{L}$ $\\mathcal{A}$\n\n### 黑板粗体\n\n行内: $\\mathbb{R}$ $\\mathbb{N}$ $\\mathbb{Z}$ $\\mathbb{C}$\n\n### 正体（罗马体）\n\n行内: $\\mathrm{Var}(X)$\n\n### 等宽体\n\n行内: $\\mathtt{code}$\n\n### 粗体符号\n\n$\\boldsymbol{\\alpha} + \\bm{\\beta} = \\mathbb{E}[X]$\n\n---\n\n## 希腊字母\n\n### 小写\n\n$\\alpha$ $\\beta$ $\\gamma$ $\\delta$ $\\epsilon$ $\\varepsilon$ $\\zeta$ $\\eta$ $\\theta$ $\\vartheta$\n\n$\\iota$ $\\kappa$ $\\lambda$ $\\mu$ $\\nu$ $\\xi$ $\\pi$ $\\rho$ $\\sigma$ $\\tau$ $\\upsilon$ $\\phi$ $\\varphi$ $\\chi$ $\\psi$ $\\omega$\n\n### 大写\n\n$\\Gamma$ $\\Delta$ $\\Theta$ $\\Lambda$ $\\Xi$ $\\Pi$ $\\Sigma$ $\\Upsilon$ $\\Phi$ $\\Psi$ $\\Omega$\n\n### 变体\n\n$\\varpi$ $\\varrho$ $\\varsigma$\n\n---\n\n## 二元运算符\n\n$+$ $-$ $\\times$ $\\div$ $\\cdot$ $\\oplus$ $\\ominus$ $\\otimes$ $\\oslash$ $\\odot$ $\\star$ $\\circ$ $\\bullet$ $\\pm$ $\\mp$\n\n---\n\n## 关系符号\n\n$=$ $\\neq$ $\\approx$ $\\equiv$ $<$ $>$ $\\leq$ $\\geq$ $\\ge$ $\\le$ $\\ne$\n\n$\\ll$ $\\gg$ $\\prec$ $\\succ$ $\\preceq$ $\\succeq$ $\\sim$ $\\nsim$ $\\simeq$ $\\asymp$ $\\propto$\n\n---\n\n## 逻辑符号\n\n$\\wedge$ $\\vee$ $\\neg$ $\\Rightarrow$ $\\Leftrightarrow$ $\\forall$ $\\exists$ $\\nexists$ $\\top$ $\\bot$\n\n---\n\n## 集合符号\n\n$\\emptyset$ $\\in$ $\\notin$ $\\subseteq$ $\\subset$ $\\nsubseteq$ $\\supset$ $\\supseteq$ $\\nsupseteq$ $\\cup$ $\\cap$ $\\setminus$\n\n---\n\n## 箭头\n\n$\\to$ $\\gets$ $\\leftarrow$ $\\rightarrow$ $\\Rightarrow$ $\\Leftarrow$ $\\leftrightarrow$ $\\Leftrightarrow$\n\n$\\longrightarrow$ $\\longleftarrow$ $\\mapsto$ $\\longmapsto$ $\\uparrow$ $\\downarrow$ $\\updownarrow$\n\n$\\Uparrow$ $\\Downarrow$ $\\Updownarrow$\n\n---\n\n## 分数与根式\n\n### 分数\n\n$\\frac{a}{b}$ $\\dfrac{1}{2}$ $\\tfrac{1}{3}$\n\n$$\n\\frac{d}{dx} f(x) \\qquad \\frac{\\partial f}{\\partial x}\n$$\n\n### 根式\n\n$\\sqrt{x}$ $\\sqrt[n]{x}$\n\n---\n\n## 指数与对数\n\n$a^b$ $e^x$ $\\log x$ $\\ln x$ $\\log_a b$ $\\exp(x)$\n\n---\n\n## 极限\n\n$\\lim_{x \\to a} f(x)$ $\\lim_{x \\to \\infty} f(x)$\n\n---\n\n## 积分与求和\n\n$\\int f(x)dx$ $\\int_{a}^{b} f(x)dx$ $\\iint$ $\\iiint$\n\n$\\sum_{i=1}^{n} x_i$ $\\prod_{i=1}^{n} x_i$\n\n---\n\n## 重音符号\n\n$\\hat{x}$ $\\bar{x}$ $\\vec{v}$ $\\dot{x}$ $\\ddot{x}$ $\\tilde{x}$\n\n$$\n\\overrightarrow{AB} = \\overleftarrow{BA}\n$$\n\n---\n\n## 定界符\n\n$$\n\\left( \\frac{a + b}{c} \\right) \\qquad \\left[ \\frac{x}{y} \\right]\n$$\n\n---\n\n## 函数名\n\n$\\sin$ $\\cos$ $\\tan$ $\\cot$ $\\sec$ $\\csc$\n\n$\\arcsin$ $\\arccos$ $\\arctan$\n\n$\\sinh$ $\\cosh$ $\\tanh$ $\\coth$\n\n$\\log$ $\\lg$ $\\ln$ $\\exp$\n\n$\\lim$ $\\max$ $\\min$ $\\sup$ $\\inf$\n\n$\\det$ $\\dim$ $\\ker$ $\\gcd$\n\n---\n\n## 文本\n\n$\\text{当且仅当}$ $x \\text{ is even}$\n\n---\n\n## 间距\n\n$a\\,b$ $a\\quad b$ $a\\qquad b$\n\n---\n\n## 颜色\n\n$\\textcolor{red}{红色文字}$ $\\textcolor{blue}{蓝色文字}$\n\n---\n\n## 转义字符\n\n$\\#$ $\\$ $ \\% $ \\& $ \\_ $ \\{ $ \\} $ \\backslash $\n\n---\n\n## 综合复杂公式\n\n$$\n\\frac{1}{\\sqrt{2\\pi\\sigma^2}} \\exp\\left(-\\frac{(x-\\mu)^2}{2\\sigma^2}\\right)\n$$\n\n$$\nA\\mathbf{v} = \\lambda \\mathbf{v}\n$$\n\n$$\n\\mathbb{E}[X] = \\sum_{x} x\\,P(X=x)\n$$\n\n$$\n\\mathrm{Var}(X) = \\mathbb{E}[(X - \\mathbb{E}[X])^2]\n$$\n\n$$\nD_{KL}(P \\parallel Q) = \\sum_x P(x) \\log \\frac{P(x)}{Q(x)}\n$$\n\n$$\n\\frac{1}{N} \\sum_{i=1}^{N} (y_i - (w^T x_i + b))^2\n$$\n\nFile v0.1.10:evals/test-sample.md\n\n# 第一章 基于深度学习的图像识别研究\n\n## 1.1 研究背景\n\n近年来，深度学习技术在计算机视觉领域取得了突破性进展。卷积神经网络（Convolutional Neural Network, CNN）作为深度学习的核心架构之一，在图像分类、目标检测、语义分割等任务中表现出色。\n\n图像识别技术已广泛应用于安防监控、自动驾驶、医疗诊断等领域。传统的图像识别方法依赖手工设计的特征提取器，如 SIFT、HOG 等，这些方法在复杂场景下的泛化能力有限。\n\n### 1.2.1 深度学习发展历程\n\n深度学习的概念可追溯至20世纪40年代的神经网络研究。经历了多次起伏后，2012年 AlexNet 在 ImageNet 竞赛中的突破性表现标志着深度学习时代的正式到来。\n\n此后，VGGNet、GoogLeNet、ResNet 等架构相继提出，不断刷新图像识别的准确率记录。其中 ResNet 引入的残差连接解决了深层网络的梯度消失问题。\n\n## 1.2 研究现状\n\n目前主流的图像识别方法可归纳为三类：基于 CNN 的方法、基于 Transformer 的方法以及混合架构方法。\n\n![ResNet 网络架构示意图](https://www.python.org/static/img/python-logo.png)\n\n表 主流图像识别模型性能对比\n\n| 模型名称 | Top-1 准确率 | 参数量 | 发布时间 |\n|----------|-------------|--------|---------|\n| ResNet-50 | 76.2% | 25.6M | 2015 |\n| EfficientNet-B4 | 83.0% | 19.3M | 2019 |\n| ViT-B/16 | 84.1% | 86.0M | 2020 |\n| ConvNeXt-T | 84.9% | 28.6M | 2022 |\n| **ViT-B/32** | *85.0%* | $87.7$M | 2021 |\n\n从上表可以看出，模型性能持续提升的同时，参数效率也在不断优化。EfficientNet 系列通过神经架构搜索实现了参数效率与精度的良好平衡。\n\n### 1.2.1 数据增强技术\n\n数据增强是提升模型泛化能力的重要手段。常用方法包括：\n\n- 随机裁剪与缩放\n- 水平翻转与旋转\n- 色彩抖动与光照变换\n- CutOut 与 MixUp 等高级增强策略\n\n研究表明，合理的数据增强策略可以有效缓解过拟合问题，尤其在训练数据有限的场景下。\n\n## 1.3 理论基础\n\n卷积操作的数学表达为 $y = W * x + b$，其中 $W$ 为卷积核权重，$b$ 为偏置项。\n\n损失函数采用交叉熵损失：\n\n$$\nL(y, \\hat{y}) = -\\sum_{i=1}^{C} y_i \\log(\\hat{y}_i)\n$$\n\n梯度下降的参数更新规则为 $w_{t+1} = w_t - \\eta \\nabla L(w_t)$，其中 $\\eta$ 表示学习率。\n\n## 1.4 本文主要工作\n\n本文旨在构建一个高效准确的图像识别系统，主要贡献包括：\n\n本文的代码实现基于 PyTorch 框架，训练过程如下：\n\n```\nimport torch\nmodel = torch.hub.load('pytorch/vision', 'resnet50', pretrained=True)\nmodel.fc = torch.nn.Linear(2048, num_classes)\n```\n\n后续章节将详细介绍模型设计、训练策略与实验结果。\n\nFile v0.1.10:skill-card.md\n\n## Description:\n\nConverts Markdown files or pasted Markdown text into academically formatted Word (.docx) documents with structured headings, body text, tables, images, lists, and LaTeX-style math.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[trisia](https://clawhub.ai/user/trisia)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers, students, and document authors use mddoc to convert Markdown content into Word documents that follow strict academic formatting for papers, technical reports, and theses.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The setup workflow may create a cached Python environment and download dependencies.\n\nMitigation: Install in a controlled environment and review dependency setup before running the skill.\n\nRisk: Markdown image references may contact remote or internal URLs or embed local image files into the generated document.\n\nMitigation: Use trusted Markdown input, or sandbox conversion and disable remote or local image resolution before processing untrusted content.\n\n## Reference(s):\n\n- [mddoc ClawHub listing](https://clawhub.ai/trisia/skills/mddoc)\n\n## Skill Output:\n\n**Output Type(s):** [Files, Shell commands, Guidance]\n\n**Output Format:** [DOCX files, with Markdown guidance and shell command invocations for setup and conversion]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Creates a cached Python environment when dependencies are missing; generated documents may embed downloaded or local images referenced by Markdown input.]\n\n## Skill Version(s):\n\n0.1.10 (source: ClawHub release evidence; artifact frontmatter reports 1.0.10)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v0.1.10:evals/evals.json\n\n{\n  \"skill_name\": \"mddoc\",\n  \"evals\": [\n    {\n      \"id\": 1,\n      \"prompt\": \"帮我把这份 Markdown 文件转成 docx 格式的 Word 文档\",\n      \"expected_output\": \"生成 .docx 文件，包含正确的标题格式、正文格式、图片和表格，页眉正确设置\",\n      \"files\": [\"evals/test-sample.md\"]\n    },\n    {\n      \"id\": 2,\n      \"prompt\": \"将下面这段 markdown 转成格式化的 Word 文档，保存到当前目录：\\n\\n# 实验报告\\n\\n## 实验目的\\n\\n本实验旨在验证深度学习模型在小样本数据集上的泛化性能。通过对比实验分析不同正则化策略的效果。\\n\\n## 实验方法\\n\\n### 数据集准备\\n\\n实验采用 CIFAR-10 数据集，随机选取每类 100 张图片作为训练集。测试集保持原始大小。\\n\\n![实验流程图](https://upload.wikimedia.org/wikipedia/commons/thumb/2/2d/Tensor_visualization.svg/400px-Tensor_visualization.svg.png)\\n\\n表 超参数配置\\n\\n| 参数 | 取值 |\\n|------|------|\\n| 学习率 | 0.001 |\\n| 批量大小 | 32 |\\n| 训练轮次 | 100 |\\n\\n### 评估指标\\n\\n采用 Top-1 准确率和 F1 分数作为评估指标。\",\n      \"expected_output\": \"在当前目录生成 实验报告.docx，包含题目、各级标题、正文、图片、表格的正确格式\",\n      \"files\": []\n    },\n    {\n      \"id\": 3,\n      \"prompt\": \"/mddoc 把这个转成word @evals/test-sample.md\",\n      \"expected_output\": \"在 evals/ 目录生成第一章 基于深度学习的图像识别研究.docx，格式完全符合学术规范\",\n      \"files\": [\"evals/test-sample.md\"]\n    }\n  ]\n}\n\nArchive v0.1.9: 8 files, 38112 bytes\n\nFiles: evals/evals.json (1585b), evals/test-latex-coverage.md (4031b), evals/test-sample.md (2833b), scripts/md2docx.py (77042b), scripts/setup_env.py (3586b), skill-card.md (2227b), SKILL.md (25643b), _meta.json (124b)\n\nFile v0.1.9:SKILL.md\n\n---\nname: mddoc\nversion: 1.0.9\ndescription: 将 Markdown 内容转换为特定学术格式的 Word 文档 (.docx)。当用户想要将 Markdown 文件、粘贴的 Markdown 文本转换为格式化的 docx 文档时使用，特别是学术论文、技术报告、毕业论文等需要严格格式要求的场景。触发词包括：/mddoc、markdown转docx、md转word、生成格式化文档、学术格式转换。即使用户只说\"把这个转成word\"而内容是Markdown，也应使用此技能。\n---\n\n# mddoc — Markdown 转学术格式 DOCX\n\n## 快速开始\n\n```bash\n# 1) 环境自检与准备（一次性，幂等）：创建/复用专用虚拟环境，仅缺失依赖时才安装\n#    专用环境位置：~/.cache/mddocx/venv（Windows: %LOCALAPPDATA%/mddocx/venv）\npython3 <skill-path>/scripts/setup_env.py\n#    输出最后一行 `READY <python>` 即就绪解释器路径\n\n# 2) 转换 Markdown 文件 → 输出到同目录（环境就绪后无需再检查）\n~/.cache/mddocx/venv/bin/python <skill-path>/scripts/md2docx.py paper.md\n\n# 指定输出路径\n~/.cache/mddocx/venv/bin/python <skill-path>/scripts/md2docx.py paper.md -o /path/to/output.docx\n\n# 直接转换粘贴的文本\n~/.cache/mddocx/venv/bin/python <skill-path>/scripts/md2docx.py --text \"# 标题\\n\\n正文内容\" -o out.docx\n```\n\n其中 `<skill-path>` = `/home/kkk/.claude/skills/mddoc`\n\n## 工作流程\n\n1. **读取输入** — 若用户粘贴 Markdown 文本则直接读取；若用户提供文件路径（含 `@` 引用）则读取该文件\n2. **检查并准备环境** — 专用虚拟环境固定于 `~/.cache/mddocx/venv`（Windows: `%LOCALAPPDATA%/mddocx/venv`）：\n   - 若该环境存在且能 `import docx, PIL, requests, mistune` → 直接转换，不安装\n   - 环境缺失或依赖缺失时，才运行 `python3 <skill-path>/scripts/setup_env.py` 创建/安装（幂等，仅缺失时安装）\n3. **执行转换** — 用专用解释器 `~/.cache/mddocx/venv/bin/python` 运行内置脚本 `scripts/md2docx.py`；若 Markdown 结构特殊则参照下方格式规范编写自定义脚本\n4. **确定输出** — 文件路径输入→同目录；粘贴内容→当前目录；文件名=「题目.docx」（题目从第一个 `# 标题` 提取；若无 `#` 标题则使用输入文件名，`--text` 模式为「未命名文档.docx」）\n5. **验证** — 检查 outline level、图片嵌入、页眉、分页符\n\n---\n\n## 格式参考\n\n> 每个元素配可直接使用的 python-docx 代码。公共导入和工具函数：\n\n```python\nfrom docx import Document\nfrom docx.shared import Pt, Cm\nfrom docx.enum.text import WD_ALIGN_PARAGRAPH\nfrom docx.oxml import OxmlElement\nfrom docx.oxml.ns import qn\n\ndef set_cn_font(run, cn_name, en_name='Times New Roman', size_pt=10.5, bold=False):\n    \"\"\"设置 run 的中英文字体、字号、加粗、颜色(黑)\"\"\"\n    run.font.size = Pt(size_pt)\n    run.font.bold = bold\n    run.font.name = en_name\n    run.font.color.rgb = None\n    rPr = run._element.get_or_add_rPr()\n    rFonts = rPr.find(qn('w:rFonts'))\n    if rFonts is None:\n        rFonts = OxmlElement('w:rFonts'); rPr.insert(0, rFonts)\n    rFonts.set(qn('w:eastAsia'), cn_name)\n    rFonts.set(qn('w:ascii'), en_name)\n    rFonts.set(qn('w:hAnsi'), en_name)\n\ndef add_empty(doc):\n    \"\"\"五号空行\"\"\"\n    p = doc.add_paragraph()\n    run = p.add_run('')\n    set_cn_font(run, '宋体', size_pt=10.5)\n    return p\n\ndef set_outline(para, level):\n    \"\"\"设置 outline level（XML方式，兼容所有python-docx版本）\"\"\"\n    pPr = para._element.get_or_add_pPr()\n    ol = OxmlElement('w:outlineLvl')\n    ol.set(qn('w:val'), str(level))\n    pPr.append(ol)\n```\n\n### 基础设置\n\n五号=10.5pt，1.3倍行距，段前段后0磅，全黑，A4页边距左3cm右2cm上2cm下2cm，页脚距底1cm。\n\n```python\ndoc = Document()\nsection = doc.sections[0]\n# 页边距：左3cm 右2cm 上2cm 下2cm\nsection.left_margin = Cm(3)\nsection.right_margin = Cm(2)\nsection.top_margin = Cm(2)\nsection.bottom_margin = Cm(2)\n\nsty = doc.styles['Normal']\nsty.font.size = Pt(10.5)\nsty.font.name = 'Times New Roman'\nsty.element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')\nsty.paragraph_format.line_spacing = 1.3\nsty.paragraph_format.space_before = Pt(0)\nsty.paragraph_format.space_after = Pt(0)\n```\n\n### 空行规则\n\n- **段落之间**：不空行\n- **题目**：上下各空一行\n- **一级标题**：上下各空一行\n- **二级/三级标题**：上下不空行\n- **图片**：上方空一行，图题下方空一行\n- **表格**：表题上方空一行，表格下方空一行\n\n### 题目（第一个 `#`）\n\n三号黑体(16pt)、居中、上下各空一行、**不设 outline level**。\n\n```python\nadd_empty(doc)\np = doc.add_paragraph()\np.alignment = WD_ALIGN_PARAGRAPH.CENTER\n# 题目不设 outline_level\nrun = p.add_run(title_text)\nset_cn_font(run, '黑体', size_pt=16)\nadd_empty(doc)\n```\n\n### 无标题文档\n\n当输入 Markdown 没有 `#` 标题时：\n- 跳过标题页，文档从第一个内容节点开始排版\n- 页眉右侧显示「未命名文档」代替标题\n- 页眉左侧「xxxxx」保持不变\n- 输出文件名：文件输入使用输入文件名（如 `paper.md` → `paper.docx`），`--text` 模式使用「未命名文档.docx」\n\n### 一级标题（后续 `#`）\n\n三号黑体(16pt)、居中、上下各空一行、outline_level=1、**前加分页符**。\n\n\n```python\nadd_empty(doc)\np = doc.add_paragraph()\np.alignment = WD_ALIGN_PARAGRAPH.CENTER\nset_outline(p, 1)\n# 分页符\npPr = p._element.get_or_add_pPr()\npPr.append(OxmlElement('w:pageBreakBefore'))\nrun = p.add_run(text)\nset_cn_font(run, '黑体', size_pt=16)\nadd_empty(doc)\n```\n\n### 二级标题（`##`）\n\n四号黑体(14pt)、**不加粗**、顶格(无缩进)、outline_level=2。上下不空行。\n\n```python\np = doc.add_paragraph()\nset_outline(p, 2)\np.paragraph_format.first_line_indent = Pt(0)\nrun = p.add_run(text)\nset_cn_font(run, '黑体', size_pt=14, bold=False)\n```\n\n### 三级标题（`###`）\n\n小四宋体(12pt)、**不加粗**、首行缩进Pt(21)(=2个中文字)、outline_level=3。\n\n```python\np = doc.add_paragraph()\nset_outline(p, 3)\np.paragraph_format.first_line_indent = Pt(21)\nrun = p.add_run(text)\nset_cn_font(run, '宋体', size_pt=12, bold=False)\n```\n\n### 四级及以上标题（`####`、`#####`、`######`）\n\n格式与正文相同（五号宋体 10.5pt、首行缩进Pt(21)、1.3倍行距），但设置对应的 outline_level（4/5/6）。上下不空行。\n\n```python\np = doc.add_paragraph()\nset_outline(p, level)  # 4、5 或 6，按实际标题层级\np.paragraph_format.first_line_indent = Pt(21)\np.paragraph_format.line_spacing = 1.3\np.paragraph_format.space_before = Pt(0)\np.paragraph_format.space_after = Pt(0)\nrun = p.add_run(text)\nset_cn_font(run, '宋体', size_pt=10.5, bold=False)\n```\n\n### 正文段落\n\n五号(10.5pt)宋体/TNR、首行缩进Pt(21)、1.3倍行距、段前段后0磅。\n\n```python\np = doc.add_paragraph()\np.paragraph_format.first_line_indent = Pt(21)\np.paragraph_format.line_spacing = 1.3\np.paragraph_format.space_before = Pt(0)\np.paragraph_format.space_after = Pt(0)\nrun = p.add_run(text)\nset_cn_font(run, '宋体', size_pt=10.5)\n```\n\n### 图片\n\n下载嵌入(不压缩)、等比缩放(8-12cm规则)、居中、上方空一行。\n\n```python\nimport requests\nfrom PIL import Image\n\ndef dl_image(url):\n    h = {'User-Agent': 'Mozilla/5.0 (compatible; mddoc/1.0)'}\n    r = requests.get(url, headers=h, timeout=30); r.raise_for_status()\n    return r.content  # bytes, 可保存为临时文件\n\ndef img_width(path):\n    img = Image.open(path)\n    dpi = img.info.get('dpi', (96, 96))\n    dx = dpi[0] if dpi and dpi[0] > 0 else 96\n    w_cm = img.width / dx * 2.54\n    if   w_cm > 12: tw = 12.0\n    elif w_cm < 8:  tw = 8.0\n    else:           tw = w_cm\n    return Cm(tw)\n\nadd_empty(doc)\np = doc.add_paragraph()\np.alignment = WD_ALIGN_PARAGRAPH.CENTER\np.add_run().add_picture(img_path, width=img_width(img_path))\n```\n\n### 图题\n\n图片下方(不空行)、小五(9pt)宋体加粗居中、逐章编号。有章标题时格式 `图<章>-<序号> <alt>`，无章标题时格式 `图<序号> <alt>`。若 alt 为空，自动使用图片文件名（不含扩展名）作为图题。\n\n```python\np = doc.add_paragraph()\np.alignment = WD_ALIGN_PARAGRAPH.CENTER\nrun = p.add_run(f'图{ch}-{idx} {alt_text}')\nset_cn_font(run, '宋体', size_pt=9, bold=True)\nadd_empty(doc)  # 图题下方空一行\n```\n\n### 表格 + 表题\n\n**三线表**(顶线1.5pt/表头底线0.75pt/底线1.5pt粗，无竖线)。表题在上方(不空行)、五号(10.5pt)宋体加粗居中。有章标题时格式`表<章>-<序号> <描述>`，无章标题时格式`表<序号> <描述>`。\n\n```python\n# 表题\nadd_empty(doc)\np = doc.add_paragraph(); p.alignment = WD_ALIGN_PARAGRAPH.CENTER\nrun = p.add_run(f'表{ch}-{idx} {caption}')\nset_cn_font(run, '宋体', size_pt=10.5, bold=True)\n\n# 表格\ntb = doc.add_table(rows=nrows, cols=ncols)\ntb.alignment = WD_ALIGN_PARAGRAPH.CENTER\n\n# 三线表边框\nPr = tb._tbl.tblPr or OxmlElement('w:tblPr')\nB = OxmlElement('w:tblBorders')\nfor tag, sz in [('top','12'),('bottom','12')]:\n    e = OxmlElement(f'w:{tag}'); e.set(qn('w:val'),'single')\n    e.set(qn('w:sz'),sz); e.set(qn('w:space'),'0'); e.set(qn('w:color'),'000000')\n    B.append(e)\nfor tag in ('left','right','insideH','insideV'):\n    e = OxmlElement(f'w:{tag}'); e.set(qn('w:val'),'none')\n    e.set(qn('w:sz'),'0'); e.set(qn('w:space'),'0'); e.set(qn('w:color'),'auto')\n    B.append(e)\nPr.append(B)\n# 表头行每格底部加细线 0.75pt（cell级别，不影响数据行）\nfor cell in tb.rows[0].cells:\n    tcPr = cell._tc.get_or_add_tcPr()\n    tcB = OxmlElement('w:tcBorders')\n    btm = OxmlElement('w:bottom')\n    btm.set(qn('w:val'),'single'); btm.set(qn('w:sz'),'6')\n    btm.set(qn('w:space'),'0'); btm.set(qn('w:color'),'000000')\n    tcB.append(btm); tcPr.append(tcB)\n\n# header/data 为 mistune table_cell['children'] AST 列表（取 cell.get('children', [])）\n# 单元格内 **加粗**、*斜体*、$公式$ 由 walk_inline 渲染，公式字号跟随 9pt\n# 表头行 — 居中、9pt、垂直居中、无缩进\nfor j, children in enumerate(header):\n    c = tb.rows[0].cells[j]\n    c.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER\n    p = c.paragraphs[0]; p.clear()\n    p.alignment = WD_ALIGN_PARAGRAPH.CENTER\n    p.paragraph_format.first_line_indent = Pt(0)\n    p.paragraph_format.line_spacing = 1.0\n    _set_para_mark_size(p, 9)\n    walk_inline(p, children, '宋体', size_pt=9)\n\n# 数据行 — 左对齐、9pt、垂直居中、无缩进\nfor i, row in enumerate(data):\n    for j, children in enumerate(row):\n        c = tb.rows[i+1].cells[j]\n        c.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER\n        p = c.paragraphs[0]; p.clear()\n        p.paragraph_format.first_line_indent = Pt(0)\n        p.paragraph_format.line_spacing = 1.0\n        _set_para_mark_size(p, 9)\n        walk_inline(p, children, '宋体', size_pt=9)\n\nadd_empty(doc)  # 表格下方空一行\n```\n\n### 页眉\n\n左顶格\"xxxxx\"、右顶格文档题目、小五(9pt)黑体。\n\n```python\nsec = doc.sections[0]; hdr = sec.header\nhdr.is_linked_to_previous = False\nr = hdr.paragraphs[0].add_run('xxxxx')\nset_cn_font(r, '黑体', size_pt=9)\np2 = hdr.add_paragraph(); p2.alignment = WD_ALIGN_PARAGRAPH.RIGHT\nr2 = p2.add_run(title_text)\nset_cn_font(r2, '黑体', size_pt=9)\n```\n\n### 列表\n\n使用 Word 原生编号/项目符号（`w:numPr` XML），支持富文本 inline 和多级嵌套。列表段落遵守正文格式（首行缩进 Pt(21)、1.3 倍行距）。\n\n```python\n# 有序列表 — numId=50, 多级格式: 1. → a) → i.\n# 无序列表 — numId=51, 多级符号: • → ◦ → ▪\nfor item in list_node['children']:\n    p = doc.add_paragraph()\n    p.paragraph_format.first_line_indent = Pt(21)  # 同正文\n    p.paragraph_format.line_spacing = 1.3\n    # 设置 Word 原生编号\n    numPr = OxmlElement('w:numPr')\n    ilvl = OxmlElement('w:ilvl'); ilvl.set(qn('w:val'), str(depth))\n    numId = OxmlElement('w:numId'); numId.set(qn('w:val'), '50')  # 50=有序, 51=无序\n    numPr.append(ilvl); numPr.append(numId)\n    p._element.get_or_add_pPr().append(numPr)\n    # walk_inline 渲染富文本（支持 **加粗**、*斜体*、$公式$）\n    walk_inline(p, item['children'][0]['children'], '宋体', size_pt=10.5)\n    # 嵌套子列表：递归调用 render_list(doc, child, depth+1)\n\n# 列表编号定义（生成文档时需在 numbering.xml 中注入抽象编号）\n_ensure_list_numbering_defs(doc)  # 定义 numId=50(有序) 和 numId=51(无序)，各 3 级\n```\n\n列表编号自动跨页连续（同一 `numId` 的段落由 Word 维护编号序列）。\n\n### 内联格式（加粗、斜体、行内公式等）\n\n段落内使用 `walk_inline()` 递归遍历 mistune inline AST，生成带格式的 runs 和 OMML 元素。格式状态（加粗/斜体/下划线）递归下传，同时作用于文本 run 和公式 OMML：\n\n```python\ndef walk_inline(paragraph, children, base_cn='宋体', base_en='Times New Roman',\n                base_size=10.5, bold=False, italic=False, underline=False):\n    for child in children:\n        ct = child['type']\n        if ct == 'text':\n            if child.get('raw', ''):\n                run = paragraph.add_run(child['raw'])\n                set_cn_font(run, base_cn, en_font=base_en, size_pt=base_size, bold=bold)\n                if italic: run.font.italic = True\n                if underline: run.font.underline = True\n        elif ct == 'strong':  # **加粗** — 递归传 bold=True\n            walk_inline(paragraph, child['children'], base_cn, base_en, base_size,\n                        bold=True, italic=italic, underline=underline)\n        elif ct == 'emphasis':  # *斜体* — 递归传 italic=True\n            walk_inline(paragraph, child['children'], base_cn, base_en, base_size,\n                        bold=bold, italic=True, underline=underline)\n        elif ct == 'link':  # 链接 — 递归传 underline=True\n            walk_inline(paragraph, child['children'], base_cn, base_en, base_size,\n                        bold=bold, italic=italic, underline=True)\n        elif ct == 'inline_math':  # $...$\n            omml = latex_to_omml(child['raw'], display=False)\n            paragraph._element.append(apply_omml_style(omml, bold, italic))\n        elif ct == 'codespan':  # `代码`\n            run = paragraph.add_run(child.get('raw', ''))\n            set_cn_font(run, base_cn, en_font=base_en, size_pt=base_size)\n\n\ndef apply_omml_style(omml, bold=False, italic=False):\n    \"\"\"为公式内所有 m:r 添加 <m:sty m:val=\"b/i/bi\"/>，使 **$x$**、*$x$* 嵌套公式生效\"\"\"\n    if not (bold or italic):\n        return omml\n    val = ('b' if bold else '') + ('i' if italic else '')\n    NSM = '{http://schemas.openxmlformats.org/officeDocument/2006/math}'\n    for r in omml.iter(f'{NSM}r'):\n        rPr = r.find(f'{NSM}rPr')\n        if rPr is None:\n            rPr = OxmlElement('m:rPr')\n            r.insert(0, rPr)\n        if rPr.find(f'{NSM}sty') is None:\n            sty = OxmlElement('m:sty')\n            sty.set(qn('m:val'), val)\n            rPr.append(sty)\n    return omml\n\n\ndef _set_para_mark_size(paragraph, size_pt):\n    \"\"\"设置段落标记字号（半磅），供行内公式 OMML 继承（如 9 → 9pt）\"\"\"\n    pPr = paragraph._element.get_or_add_pPr()\n    rPr = pPr.find(qn('w:rPr'))\n    if rPr is None:\n        rPr = OxmlElement('w:rPr')\n        pPr.append(rPr)\n    sz = rPr.find(qn('w:sz'))\n    if sz is None:\n        sz = OxmlElement('w:sz')\n        rPr.append(sz)\n    sz.set(qn('w:val'), str(int(size_pt * 2)))\n```\n\n`***加粗斜体***` → AST: `emphasis > strong` → 递归自然处理为 bold+italic。嵌套在加粗/斜体里的公式（`**$x$**`、`*$x$*`）由 `apply_omml_style()` 保留并上样式。\n\n### 标题样式清理\n\n生成前覆盖 Word 内置 Heading 1-6 样式，防止默认蓝色/Cambria/加粗干扰：\n\n```python\ndef override_builtin_heading_styles(doc):\n    specs = {\n        'Heading 1': ('黑体', 16, True, WD_ALIGN_PARAGRAPH.CENTER),\n        'Heading 2': ('黑体', 14, False, WD_ALIGN_PARAGRAPH.LEFT),\n        'Heading 3': ('宋体', 12, False, WD_ALIGN_PARAGRAPH.LEFT),\n        'Heading 4': ('宋体', 10.5, False, WD_ALIGN_PARAGRAPH.LEFT),\n        'Heading 5': ('宋体', 10.5, False, WD_ALIGN_PARAGRAPH.LEFT),\n        'Heading 6': ('宋体', 10.5, False, WD_ALIGN_PARAGRAPH.LEFT),\n    }\n    for name, (cn_font, size_pt, bold, align) in specs.items():\n        style = doc.styles[name]\n        style.font.size = Pt(size_pt)\n        style.font.bold = bold\n        style.font.color.rgb = None  # 黑色\n        style.font.italic = False\n        style.font.underline = False\n        rPr = style.element.get_or_add_rPr()\n        rFonts = rPr.find(qn('w:rFonts'))\n        if rFonts is None:\n            rFonts = OxmlElement('w:rFonts'); rPr.insert(0, rFonts)\n        rFonts.set(qn('w:eastAsia'), cn_font)\n```\n\n调用位置：`generate_docx()` 中 `doc = Document()` 后立即执行。\n\n### 代码块\n\nTimes New Roman 字体、五号、无首行缩进、灰色背景(#D9D9D9)、上下各空一行。\n\n```python\nadd_empty(doc)\np = doc.add_paragraph()\nset_first_line_indent_chars(p, 0)  # 代码块无首行缩进\n# 灰色背景\npPr = p._element.get_or_add_pPr()\nshd = OxmlElement('w:shd')\nshd.set(qn('w:val'), 'clear')\nshd.set(qn('w:color'), 'auto')\nshd.set(qn('w:fill'), 'D9D9D9')\npPr.append(shd)\nrun = p.add_run(code)\nset_cn_font(run, '宋体', en_name='Times New Roman', size_pt=10.5)\nadd_empty(doc)\n```\n\n### 行内公式（`$...$`）\n\n嵌于段落中，转换为 OMML（Office Math Markup Language）格式，WPS/Word 可直接渲染。\n公式在段落中作为 `<m:oMath>` 元素插入，与文字 run 同级。\n\n```python\n# 行内公式通过 split_inline_math() 拆分为 segments\n# text segment → 普通 run，math segment → latex_to_omml() → m:oMath 元素\np = doc.add_paragraph()\np.paragraph_format.first_line_indent = Pt(21)\np.paragraph_format.line_spacing = 1.3\nfor seg in segments:\n    if seg['type'] == 'text':\n        if seg['content']:\n            run = p.add_run(seg['content'])\n            set_cn_font(run, '宋体', size_pt=10.5)\n    else:  # math — 转换为 OMML 并插入段落 XML\n        omml = latex_to_omml(seg['content'], display=False)\n        p._element.append(omml)\n```\n\n### 行间公式（`$$...$$`）\n\n独立成行，上下各空一行。公式通过 OMML 居中渲染，编号右对齐。编号格式同图/表：`(章-序号)`，逐章编号。编号括号用五号宋体，数字用五号 Times New Roman。\n\n布局方式：段落设置居中和右对齐 tab stop，OMML `<m:oMath>` 元素位于两个 tab 之间，实现公式居中、编号右对齐。\n\n```python\nadd_empty(doc)  # 上方空一行\np = doc.add_paragraph()\n\n# 设置 tab stops：居中和右对齐\n# 左边距3cm右边距2cm → 可用宽度16cm → 中心8cm(4536twips), 右边16cm(9072twips)\npPr = p._element.get_or_add_pPr()\ntabs = OxmlElement('w:tabs')\nct = OxmlElement('w:tab'); ct.set(qn('w:val'), 'center'); ct.set(qn('w:pos'), '4536')\nrt = OxmlElement('w:tab'); rt.set(qn('w:val'), 'right'); rt.set(qn('w:pos'), '9072')\ntabs.append(ct); tabs.append(rt)\npPr.append(tabs)\n\n# tab → 公式 OMML 居中\nrun_t1 = p.add_run()\nrun_t1._r.append(OxmlElement('w:tab'))\nomml = latex_to_omml(formula_text, display=False)\np._element.append(omml)\n\n# tab → 编号右对齐：(章-序号)\nrun_t2 = p.add_run()\nrun_t2._r.append(OxmlElement('w:tab'))\nrun_lp = p.add_run('(')\nset_cn_font(run_lp, '宋体', en_name='宋体', size_pt=10.5)\nrun_num = p.add_run(f'{ch}-{eq_num}')\nset_cn_font(run_num, '宋体', en_name='Times New Roman', size_pt=10.5)\nrun_rp = p.add_run(')')\nset_cn_font(run_rp, '宋体', en_name='宋体', size_pt=10.5)\n\nadd_empty(doc)  # 下方空一行\n```\n\n### LaTeX → OMML 转换\n\n内置 `latex_to_omml()` 函数将 LaTeX 数学公式转换为 OMML XML，支持以下构造：\n\n- 上下标：`a^b`、`a_b`、`a_b^c`\n- 分数：`\\frac{a}{b}`\n- 根式：`\\sqrt{x}`、`\\sqrt[n]{x}`\n- 希腊字母：`\\alpha`、`\\beta`、`\\Gamma` 等\n- 大运算符：`\\sum`、`\\prod`、`\\int`（含上下限）\n- 函数名：`\\sin`、`\\cos`、`\\log`、`\\lim` 等\n- 重音：`\\hat`、`\\bar`、`\\vec`、`\\tilde` 等\n- 符号：`\\infty`、`\\cdot`、`\\times`、`\\partial`、`\\nabla` 等\n- 定界符：`\\left(...\\right)`、`\\left[...\\right]`\n- 文本：`\\text{...}`\n\n### 页码\n\n从第一章（第一个一级标题所在页）开始编页码，格式 `第×页  共×页`，页脚边距 1cm。\n\n```python\nfrom docx.oxml import OxmlElement\nfrom docx.oxml.ns import qn\nfrom docx.shared import Cm\n\nsection = doc.sections[0]\nsection.footer_distance = Cm(1.1)  # 页脚边距\n\nfooter = section.footer\nfooter.is_linked_to_previous = False\nfp = footer.paragraphs[0]\nfp.alignment = WD_ALIGN_PARAGRAPH.CENTER\n\n# \"第\" 字\nrun1 = fp.add_run('第')\nset_cn_font(run1, '宋体', size_pt=10.5)\n# 页码字段\nrun_page = fp.add_run()\nfldChar1 = OxmlElement('w:fldChar'); fldChar1.set(qn('w:fldCharType'), 'begin')\nrun_page._r.append(fldChar1)\ninstrText = OxmlElement('w:instrText'); instrText.set(qn('xml:space'), 'preserve')\ninstrText.text = ' PAGE '\nrun_page._r.append(instrText)\nfldChar2 = OxmlElement('w:fldChar'); fldChar2.set(qn('w:fldCharType'), 'end')\nrun_page._r.append(fldChar2)\n# \"页  共\"\nrun2 = fp.add_run('页  共')\nset_cn_font(run2, '宋体', size_pt=10.5)\n# 总页数字段\nrun_total = fp.add_run()\nfldChar3 = OxmlElement('w:fldChar'); fldChar3.set(qn('w:fldCharType'), 'begin')\nrun_total._r.append(fldChar3)\ninstrText2 = OxmlElement('w:instrText'); instrText2.set(qn('xml:space'), 'preserve')\ninstrText2.text = ' NUMPAGES '\nrun_total._r.append(instrText2)\nfldChar4 = OxmlElement('w:fldChar'); fldChar4.set(qn('w:fldCharType'), 'end')\nrun_total._r.append(fldChar4)\n# \"页\"\nrun3 = fp.add_run('页')\nset_cn_font(run3, '宋体', size_pt=10.5)\n```\n\n> 注意：页码从第一章开始计数需在第一个一级标题处插入分节符并重置页码。简单场景可统一从第1页开始。\n\n### 跨页表格（续表）\n\n表头行设为重复标题行，跨页自动重复。续表在右上方标\"续表<编号>\"。\n\n```python\n# 表头行设为重复标题行（跨页自动出现）\ntblHeader = OxmlElement('w:tblHeader')\ntrPr = table.rows[0]._tr.get_or_add_trPr()\ntrPr.append(tblHeader)\n\n# 对于确实跨页的大表格，在分页处手动加\"续表\"标记：\n# （python-docx无法检测分页位置，建议生成后人工检查）\n# 续表右对齐段落示例：\np_cont = doc.add_paragraph()\np_cont.alignment = WD_ALIGN_PARAGRAPH.RIGHT\nrun_cont = p_cont.add_run(f'续表{tab_label}')\nset_cn_font(run_cont, '宋体', size_pt=10.5)\n```\n\n---\n\n## 生成后自检清单\n\n- [ ] 题目：16pt黑体、居中、无outline、上下各空一行\n- [ ] 无标题文档：跳过标题页、页眉显示「未命名文档」\n- [ ] 一级标题：16pt黑体、outline_level=1、前有分页符、上下各空一行\n- [ ] 二级标题：14pt黑体、顶格、outline_level=2、不加粗、**上下不空行**\n- [ ] 三级标题：12pt宋体、首行缩进Pt(21)、outline_level=3、不加粗、**上下不空行**\n- [ ] 四级及以上标题：10.5pt宋体同正文、首行缩进Pt(21)、outline_level=对应层级(4/5/6)、**上下不空行**\n- [ ] 正文：10.5pt、首行缩进Pt(21)、1.3倍行距、**段落间不空行**\n- [ ] 图片：嵌入、等比缩放8-12cm、居中、上下各空一行\n- [ ] 图题：9pt宋体加粗居中、图片下方\n- [ ] 表格：三线表(顶/底粗、表头格底线细、数据行无线)、居中\n- [ ] 表头行：居中、9pt、无缩进、tblHeader重复\n- [ ] 表题：10.5pt宋体加粗居中、表格上方\n- [ ] 列表：有序用 Word 原生编号、无序用 Word 原生黑圆点、悬挂缩进、支持富文本 inline\n- [ ] 代码块：Times New Roman、无缩进、灰色背景#D9D9D9、上下各空一行\n- [ ] 加粗/斜体/加粗斜体：`**文本**` bold、`*文本*` italic、`***文本***` bold+italic\n- [ ] 分隔线：`---`（3+ 连续 `-`） → 分页符\n- [ ] 页眉：左\"xxxxx\"右题目、9pt黑体\n- [ ] 行内公式：$...$ 嵌于段落、OMML格式、WPS/Word可渲染\n- [ ] 行间公式：$$...$$ OMML居中、上下各空一行、编号(章-序号)右对齐、括号宋体数字TNR\n- [ ] 页码：\"第×页 共×页\"、页脚边距1cm\n- [ ] 标题样式：Heading 1-6 已覆盖为学术格式（黑体/宋体、黑色）\n- [ ] 分隔线：`---` → 分页符\n- [ ] 续表：跨页表头重复、\"续表xx\"右上标注\n- [ ] 页边距：左3cm 右2cm 上2cm 下2cm\n- [ ] 全部黑色、无额外参数\n\n## 注意事项\n\n- **解析器**：Markdown 解析使用 mistune 3.x（`renderer='ast'`），配合 `table` 和 `math` 插件。所有 block/inline 格式由 mistune AST 提供，不再手写解析器\n- **第一个 `#` 是题目**（不设 outline），后续 `#` 是一级标题（outline_level=1）；若无 `#` 标题仍可正常生成文档\n- **图片尺寸用 `Cm()`，不手算 EMU** — `add_picture(width=Cm(x))` 自动转换\n- **图片下载必设 User-Agent** — 否则 CDN/Wikipedia 返回 400\n- **图题编号自动生成** — alt text 作为描述文字，图/表编号独立逐章编序\n- **表题识别** — 表格前含\"表\"字的段落自动作为表题（lookahead 跳过空行），不渲染为独立段落\n- **outline_level 用 `set_outline()` 设置** — `paragraph_format.outline_level` 在部分python-docx版本不生效，统一用XML方式写入；读取时也从XML读取\n- **公式编号自动生成** — 图/表/公式独立逐章编序，编号格式统一为 `章-序号`\n- **不添加**：目录页、背景色\n- **单位**：字体用 pt、尺寸用 cm\n\nFile v0.1.9:_meta.json\n\n{\n  \"ownerId\": \"kn74sxjtkhk771hzvyhh8q6hp18a69xe\",\n  \"slug\": \"mddoc\",\n  \"version\": \"0.1.9\",\n  \"publishedAt\": 1786936622250\n}\n\nFile v0.1.9:evals/test-latex-coverage.md\n\n# LaTeX 数学公式覆盖测试（IHKYoung 手册 + 完整补全）\n\n本文件测试所有已实现的 LaTeX 数学公式语法。\n\n---\n\n## 矩阵环境\n\n### bmatrix（方括号）\n\n$$\n\\begin{bmatrix} a & b \\\\ c & d \\end{bmatrix}\n$$\n\n### pmatrix（圆括号）\n\n$$\n\\begin{pmatrix} x_{11} & x_{12} \\\\ x_{21} & x_{22} \\end{pmatrix}\n$$\n\n### vmatrix（单竖线行列式）\n\n$$\n\\begin{vmatrix} a & b \\\\ c & d \\end{vmatrix}\n$$\n\n### Vmatrix（双竖线范数）\n\n$$\n\\begin{Vmatrix} a & b \\\\ c & d \\end{Vmatrix}\n$$\n\n### matrix（无括号）\n\n$$\n\\begin{matrix} 1 & 0 \\\\ 0 & 1 \\end{matrix}\n$$\n\n---\n\n## cases 环境（分段函数）\n\n$$\nf(x) = \\begin{cases} 0 & x < 0 \\\\ x^2 & 0 \\leq x < 1 \\\\ 1 & x \\geq 1 \\end{cases}\n$$\n\n---\n\n## align 环境（多行对齐）\n\n$$\n\\begin{align} x + y &= 2 \\\\ x - y &= 0 \\end{align}\n$$\n\n---\n\n## 字体命令\n\n### 粗体\n\n行内: $\\mathbf{A} = \\mathbf{B} + \\mathbf{C}$\n\n### 斜体\n\n行内: $\\mathit{variable}$\n\n### 手写体（花体）\n\n行内: $\\mathcal{L}$ $\\mathcal{A}$\n\n### 黑板粗体\n\n行内: $\\mathbb{R}$ $\\mathbb{N}$ $\\mathbb{Z}$ $\\mathbb{C}$\n\n### 正体（罗马体）\n\n行内: $\\mathrm{Var}(X)$\n\n### 等宽体\n\n行内: $\\mathtt{code}$\n\n### 粗体符号\n\n$\\boldsymbol{\\alpha} + \\bm{\\beta} = \\mathbb{E}[X]$\n\n---\n\n## 希腊字母\n\n### 小写\n\n$\\alpha$ $\\beta$ $\\gamma$ $\\delta$ $\\epsilon$ $\\varepsilon$ $\\zeta$ $\\eta$ $\\theta$ $\\vartheta$\n\n$\\iota$ $\\kappa$ $\\lambda$ $\\mu$ $\\nu$ $\\xi$ $\\pi$ $\\rho$ $\\sigma$ $\\tau$ $\\upsilon$ $\\phi$ $\\varphi$ $\\chi$ $\\psi$ $\\omega$\n\n### 大写\n\n$\\Gamma$ $\\Delta$ $\\Theta$ $\\Lambda$ $\\Xi$ $\\Pi$ $\\Sigma$ $\\Upsilon$ $\\Phi$ $\\Psi$ $\\Omega$\n\n### 变体\n\n$\\varpi$ $\\varrho$ $\\varsigma$\n\n---\n\n## 二元运算符\n\n$+$ $-$ $\\times$ $\\div$ $\\cdot$ $\\oplus$ $\\ominus$ $\\otimes$ $\\oslash$ $\\odot$ $\\star$ $\\circ$ $\\bullet$ $\\pm$ $\\mp$\n\n---\n\n## 关系符号\n\n$=$ $\\neq$ $\\approx$ $\\equiv$ $<$ $>$ $\\leq$ $\\geq$ $\\ge$ $\\le$ $\\ne$\n\n$\\ll$ $\\gg$ $\\prec$ $\\succ$ $\\preceq$ $\\succeq$ $\\sim$ $\\nsim$ $\\simeq$ $\\asymp$ $\\propto$\n\n---\n\n## 逻辑符号\n\n$\\wedge$ $\\vee$ $\\neg$ $\\Rightarrow$ $\\Leftrightarrow$ $\\forall$ $\\exists$ $\\nexists$ $\\top$ $\\bot$\n\n---\n\n## 集合符号\n\n$\\emptyset$ $\\in$ $\\notin$ $\\subseteq$ $\\subset$ $\\nsubseteq$ $\\supset$ $\\supseteq$ $\\nsupseteq$ $\\cup$ $\\cap$ $\\setminus$\n\n---\n\n## 箭头\n\n$\\to$ $\\gets$ $\\leftarrow$ $\\rightarrow$ $\\Rightarrow$ $\\Leftarrow$ $\\leftrightarrow$ $\\Leftrightarrow$\n\n$\\longrightarrow$ $\\longleftarrow$ $\\mapsto$ $\\longmapsto$ $\\uparrow$ $\\downarrow$ $\\updownarrow$\n\n$\\Uparrow$ $\\Downarrow$ $\\Updownarrow$\n\n---\n\n## 分数与根式\n\n### 分数\n\n$\\frac{a}{b}$ $\\dfrac{1}{2}$ $\\tfrac{1}{3}$\n\n$$\n\\frac{d}{dx} f(x) \\qquad \\frac{\\partial f}{\\partial x}\n$$\n\n### 根式\n\n$\\sqrt{x}$ $\\sqrt[n]{x}$\n\n---\n\n## 指数与对数\n\n$a^b$ $e^x$ $\\log x$ $\\ln x$ $\\log_a b$ $\\exp(x)$\n\n---\n\n## 极限\n\n$\\lim_{x \\to a} f(x)$ $\\lim_{x \\to \\infty} f(x)$\n\n---\n\n## 积分与求和\n\n$\\int f(x)dx$ $\\int_{a}^{b} f(x)dx$ $\\iint$ $\\iiint$\n\n$\\sum_{i=1}^{n} x_i$ $\\prod_{i=1}^{n} x_i$\n\n---\n\n## 重音符号\n\n$\\hat{x}$ $\\bar{x}$ $\\vec{v}$ $\\dot{x}$ $\\ddot{x}$ $\\tilde{x}$\n\n$$\n\\overrightarrow{AB} = \\overleftarrow{BA}\n$$\n\n---\n\n## 定界符\n\n$$\n\\left( \\frac{a + b}{c} \\right) \\qquad \\left[ \\frac{x}{y} \\right]\n$$\n\n---\n\n## 函数名\n\n$\\sin$ $\\cos$ $\\tan$ $\\cot$ $\\sec$ $\\csc$\n\n$\\arcsin$ $\\arccos$ $\\arctan$\n\n$\\sinh$ $\\cosh$ $\\tanh$ $\\coth$\n\n$\\log$ $\\lg$ $\\ln$ $\\exp$\n\n$\\lim$ $\\max$ $\\min$ $\\sup$ $\\inf$\n\n$\\det$ $\\dim$ $\\ker$ $\\gcd$\n\n---\n\n## 文本\n\n$\\text{当且仅当}$ $x \\text{ is even}$\n\n---\n\n## 间距\n\n$a\\,b$ $a\\quad b$ $a\\qquad b$\n\n---\n\n## 颜色\n\n$\\textcolor{red}{红色文字}$ $\\textcolor{blue}{蓝色文字}$\n\n---\n\n## 转义字符\n\n$\\#$ $\\$ $ \\% $ \\& $ \\_ $ \\{ $ \\} $ \\backslash $\n\n---\n\n## 综合复杂公式\n\n$$\n\\frac{1}{\\sqrt{2\\pi\\sigma^2}} \\exp\\left(-\\frac{(x-\\mu)^2}{2\\sigma^2}\\right)\n$$\n\n$$\nA\\mathbf{v} = \\lambda \\mathbf{v}\n$$\n\n$$\n\\mathbb{E}[X] = \\sum_{x} x\\,P(X=x)\n$$\n\n$$\n\\mathrm{Var}(X) = \\mathbb{E}[(X - \\mathbb{E}[X])^2]\n$$\n\n$$\nD_{KL}(P \\parallel Q) = \\sum_x P(x) \\log \\frac{P(x)}{Q(x)}\n$$\n\n$$\n\\frac{1}{N} \\sum_{i=1}^{N} (y_i - (w^T x_i + b))^2\n$$\n\nFile v0.1.9:evals/test-sample.md\n\n# 第一章 基于深度学习的图像识别研究\n\n## 1.1 研究背景\n\n近年来，深度学习技术在计算机视觉领域取得了突破性进展。卷积神经网络（Convolutional Neural Network, CNN）作为深度学习的核心架构之一，在图像分类、目标检测、语义分割等任务中表现出色。\n\n图像识别技术已广泛应用于安防监控、自动驾驶、医疗诊断等领域。传统的图像识别方法依赖手工设计的特征提取器，如 SIFT、HOG 等，这些方法在复杂场景下的泛化能力有限。\n\n### 1.2.1 深度学习发展历程\n\n深度学习的概念可追溯至20世纪40年代的神经网络研究。经历了多次起伏后，2012年 AlexNet 在 ImageNet 竞赛中的突破性表现标志着深度学习时代的正式到来。\n\n此后，VGGNet、GoogLeNet、ResNet 等架构相继提出，不断刷新图像识别的准确率记录。其中 ResNet 引入的残差连接解决了深层网络的梯度消失问题。\n\n## 1.2 研究现状\n\n目前主流的图像识别方法可归纳为三类：基于 CNN 的方法、基于 Transformer 的方法以及混合架构方法。\n\n![ResNet 网络架构示意图](https://www.python.org/static/img/python-logo.png)\n\n表 主流图像识别模型性能对比\n\n| 模型名称 | Top-1 准确率 | 参数量 | 发布时间 |\n|----------|-------------|--------|---------|\n| ResNet-50 | 76.2% | 25.6M | 2015 |\n| EfficientNet-B4 | 83.0% | 19.3M | 2019 |\n| ViT-B/16 | 84.1% | 86.0M | 2020 |\n| ConvNeXt-T | 84.9% | 28.6M | 2022 |\n| **ViT-B/32** | *85.0%* | $87.7$M | 2021 |\n\n从上表可以看出，模型性能持续提升的同时，参数效率也在不断优化。EfficientNet 系列通过神经架构搜索实现了参数效率与精度的良好平衡。\n\n### 1.2.1 数据增强技术\n\n数据增强是提升模型泛化能力的重要手段。常用方法包括：\n\n- 随机裁剪与缩放\n- 水平翻转与旋转\n- 色彩抖动与光照变换\n- CutOut 与 MixUp 等高级增强策略\n\n研究表明，合理的数据增强策略可以有效缓解过拟合问题，尤其在训练数据有限的场景下。\n\n## 1.3 理论基础\n\n卷积操作的数学表达为 $y = W * x + b$，其中 $W$ 为卷积核权重，$b$ 为偏置项。\n\n损失函数采用交叉熵损失：\n\n$$\nL(y, \\hat{y}) = -\\sum_{i=1}^{C} y_i \\log(\\hat{y}_i)\n$$\n\n梯度下降的参数更新规则为 $w_{t+1} = w_t - \\eta \\nabla L(w_t)$，其中 $\\eta$ 表示学习率。\n\n## 1.4 本文主要工作\n\n本文旨在构建一个高效准确的图像识别系统，主要贡献包括：\n\n本文的代码实现基于 PyTorch 框架，训练过程如下：\n\n```\nimport torch\nmodel = torch.hub.load('pytorch/vision', 'resnet50', pretrained=True)\nmodel.fc = torch.nn.Linear(2048, num_classes)\n```\n\n后续章节将详细介绍模型设计、训练策略与实验结果。\n\nFile v0.1.9:skill-card.md\n\n## Description:\n\nmddoc converts Markdown files or pasted Markdown into academically formatted Word (.docx) documents with structured headings, body text, tables, images, page headers, and LaTeX-style math.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[trisia](https://clawhub.ai/user/trisia)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers, students, researchers, and technical writers use this skill to turn Markdown source material into Word documents that follow a Chinese academic formatting profile. It is most relevant for papers, reports, theses, and other documents requiring strict heading, table, image, header, and math formatting.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The setup workflow can create a reusable Python virtual environment and install dependencies from the network.\n\nMitigation: Run setup in an approved environment and review dependency installation policy before deployment.\n\nRisk: Markdown documents with remote image URLs can trigger outbound requests during conversion.\n\nMitigation: For sensitive or untrusted documents, remove remote image URLs or pre-download approved images before conversion.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/trisia/skills/mddoc)\n- [Evaluation manifest](artifact/evals/evals.json)\n- [LaTeX coverage evaluation document](artifact/evals/test-latex-coverage.md)\n- [Sample Markdown evaluation document](artifact/evals/test-sample.md)\n\n## Skill Output:\n\n**Output Type(s):** [Files, Shell commands, Guidance]\n\n**Output Format:** [DOCX file plus Markdown instructions and shell command snippets]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Creates or reuses a dedicated Python virtual environment and may fetch remote images referenced by the input Markdown.]\n\n## Skill Version(s):\n\n0.1.9 (source: server release evidence and target metadata; artifact frontmatter says 1.0.9)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v0.1.9:evals/evals.json\n\n{\n  \"skill_name\": \"mddoc\",\n  \"evals\": [\n    {\n      \"id\": 1,\n      \"prompt\": \"帮我把这份 Markdown 文件转成 docx 格式的 Word 文档\",\n      \"expected_output\": \"生成 .docx 文件，包含正确的标题格式、正文格式、图片和表格，页眉正确设置\",\n      \"files\": [\"evals/test-sample.md\"]\n    },\n    {\n      \"id\": 2,\n      \"prompt\": \"将下面这段 markdown 转成格式化的 Word 文档，保存到当前目录：\\n\\n# 实验报告\\n\\n## 实验目的\\n\\n本实验旨在验证深度学习模型在小样本数据集上的泛化性能。通过对比实验分析不同正则化策略的效果。\\n\\n## 实验方法\\n\\n### 数据集准备\\n\\n实验采用 CIFAR-10 数据集，随机选取每类 100 张图片作为训练集。测试集保持原始大小。\\n\\n![实验流程图](https://upload.wikimedia.org/wikipedia/commons/thumb/2/2d/Tensor_visualization.svg/400px-Tensor_visualization.svg.png)\\n\\n表 超参数配置\\n\\n| 参数 | 取值 |\\n|------|------|\\n| 学习率 | 0.001 |\\n| 批量大小 | 32 |\\n| 训练轮次 | 100 |\\n\\n### 评估指标\\n\\n采用 Top-1 准确率和 F1 分数作为评估指标。\",\n      \"expected_output\": \"在当前目录生成 实验报告.docx，包含题目、各级标题、正文、图片、表格的正确格式\",\n      \"files\": []\n    },\n    {\n      \"id\": 3,\n      \"prompt\": \"/mddoc 把这个转成word @evals/test-sample.md\",\n      \"expected_output\": \"在 evals/ 目录生成第一章 基于深度学习的图像识别研究.docx，格式完全符合学术规范\",\n      \"files\": [\"evals/test-sample.md\"]\n    }\n  ]\n}\n\nArchive v0.1.8: 8 files, 38006 bytes\n\nFiles: evals/evals.json (1585b), evals/test-latex-coverage.md (4031b), evals/test-sample.md (2833b), scripts/md2docx.py (77042b), scripts/setup_env.py (3420b), skill-card.md (2225b), SKILL.md (25643b), _meta.json (124b)\n\nFile v0.1.8:SKILL.md\n\n---\nname: mddoc\nversion: 1.0.8\ndescription: 将 Markdown 内容转换为特定学术格式的 Word 文档 (.docx)。当用户想要将 Markdown 文件、粘贴的 Markdown 文本转换为格式化的 docx 文档时使用，特别是学术论文、技术报告、毕业论文等需要严格格式要求的场景。触发词包括：/mddoc、markdown转docx、md转word、生成格式化文档、学术格式转换。即使用户只说\"把这个转成word\"而内容是Markdown，也应使用此技能。\n---\n\n# mddoc — Markdown 转学术格式 DOCX\n\n## 快速开始\n\n```bash\n# 1) 环境自检与准备（一次性，幂等）：创建/复用专用虚拟环境，仅缺失依赖时才安装\n#    专用环境位置：~/.cache/mddocx/venv（Windows: %LOCALAPPDATA%/mddocx/venv）\npython3 <skill-path>/scripts/setup_env.py\n#    输出最后一行 `READY <python>` 即就绪解释器路径\n\n# 2) 转换 Markdown 文件 → 输出到同目录（环境就绪后无需再检查）\n~/.cache/mddocx/venv/bin/python <skill-path>/scripts/md2docx.py paper.md\n\n# 指定输出路径\n~/.cache/mddocx/venv/bin/python <skill-path>/scripts/md2docx.py paper.md -o /path/to/output.docx\n\n# 直接转换粘贴的文本\n~/.cache/mddocx/venv/bin/python <skill-path>/scripts/md2docx.py --text \"# 标题\\n\\n正文内容\" -o out.docx\n```\n\n其中 `<skill-path>` = `/home/kkk/.claude/skills/mddoc`\n\n## 工作流程\n\n1. **读取输入** — 若用户粘贴 Markdown 文本则直接读取；若用户提供文件路径（含 `@` 引用）则读取该文件\n2. **检查并准备环境** — 专用虚拟环境固定于 `~/.cache/mddocx/venv`（Windows: `%LOCALAPPDATA%/mddocx/venv`）：\n   - 若该环境存在且能 `import docx, PIL, requests, mistune` → 直接转换，不安装\n   - 环境缺失或依赖缺失时，才运行 `python3 <skill-path>/scripts/setup_env.py` 创建/安装（幂等，仅缺失时安装）\n3. **执行转换** — 用专用解释器 `~/.cache/mddocx/venv/bin/python` 运行内置脚本 `scripts/md2docx.py`；若 Markdown 结构特殊则参照下方格式规范编写自定义脚本\n4. **确定输出** — 文件路径输入→同目录；粘贴内容→当前目录；文件名=「题目.docx」（题目从第一个 `# 标题` 提取；若无 `#` 标题则使用输入文件名，`--text` 模式为「未命名文档.docx」）\n5. **验证** — 检查 outline level、图片嵌入、页眉、分页符\n\n---\n\n## 格式参考\n\n> 每个元素配可直接使用的 python-docx 代码。公共导入和工具函数：\n\n```python\nfrom docx import Document\nfrom docx.shared import Pt, Cm\nfrom docx.enum.text import WD_ALIGN_PARAGRAPH\nfrom docx.oxml import OxmlElement\nfrom docx.oxml.ns import qn\n\ndef set_cn_font(run, cn_name, en_name='Times New Roman', size_pt=10.5, bold=False):\n    \"\"\"设置 run 的中英文字体、字号、加粗、颜色(黑)\"\"\"\n    run.font.size = Pt(size_pt)\n    run.font.bold = bold\n    run.font.name = en_name\n    run.font.color.rgb = None\n    rPr = run._element.get_or_add_rPr()\n    rFonts = rPr.find(qn('w:rFonts'))\n    if rFonts is None:\n        rFonts = OxmlElement('w:rFonts'); rPr.insert(0, rFonts)\n    rFonts.set(qn('w:eastAsia'), cn_name)\n    rFonts.set(qn('w:ascii'), en_name)\n    rFonts.set(qn('w:hAnsi'), en_name)\n\ndef add_empty(doc):\n    \"\"\"五号空行\"\"\"\n    p = doc.add_paragraph()\n    run = p.add_run('')\n    set_cn_font(run, '宋体', size_pt=10.5)\n    return p\n\ndef set_outline(para, level):\n    \"\"\"设置 outline level（XML方式，兼容所有python-docx版本）\"\"\"\n    pPr = para._element.get_or_add_pPr()\n    ol = OxmlElement('w:outlineLvl')\n    ol.set(qn('w:val'), str(level))\n    pPr.append(ol)\n```\n\n### 基础设置\n\n五号=10.5pt，1.3倍行距，段前段后0磅，全黑，A4页边距左3cm右2cm上2cm下2cm，页脚距底1cm。\n\n```python\ndoc = Document()\nsection = doc.sections[0]\n# 页边距：左3cm 右2cm 上2cm 下2cm\nsection.left_margin = Cm(3)\nsection.right_margin = Cm(2)\nsection.top_margin = Cm(2)\nsection.bottom_margin = Cm(2)\n\nsty = doc.styles['Normal']\nsty.font.size = Pt(10.5)\nsty.font.name = 'Times New Roman'\nsty.element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')\nsty.paragraph_format.line_spacing = 1.3\nsty.paragraph_format.space_before = Pt(0)\nsty.paragraph_format.space_after = Pt(0)\n```\n\n### 空行规则\n\n- **段落之间**：不空行\n- **题目**：上下各空一行\n- **一级标题**：上下各空一行\n- **二级/三级标题**：上下不空行\n- **图片**：上方空一行，图题下方空一行\n- **表格**：表题上方空一行，表格下方空一行\n\n### 题目（第一个 `#`）\n\n三号黑体(16pt)、居中、上下各空一行、**不设 outline level**。\n\n```python\nadd_empty(doc)\np = doc.add_paragraph()\np.alignment = WD_ALIGN_PARAGRAPH.CENTER\n# 题目不设 outline_level\nrun = p.add_run(title_text)\nset_cn_font(run, '黑体', size_pt=16)\nadd_empty(doc)\n```\n\n### 无标题文档\n\n当输入 Markdown 没有 `#` 标题时：\n- 跳过标题页，文档从第一个内容节点开始排版\n- 页眉右侧显示「未命名文档」代替标题\n- 页眉左侧「xxxxx」保持不变\n- 输出文件名：文件输入使用输入文件名（如 `paper.md` → `paper.docx`），`--text` 模式使用「未命名文档.docx」\n\n### 一级标题（后续 `#`）\n\n三号黑体(16pt)、居中、上下各空一行、outline_level=1、**前加分页符**。\n\n\n```python\nadd_empty(doc)\np = doc.add_paragraph()\np.alignment = WD_ALIGN_PARAGRAPH.CENTER\nset_outline(p, 1)\n# 分页符\npPr = p._element.get_or_add_pPr()\npPr.append(OxmlElement('w:pageBreakBefore'))\nrun = p.add_run(text)\nset_cn_font(run, '黑体', size_pt=16)\nadd_empty(doc)\n```\n\n### 二级标题（`##`）\n\n四号黑体(14pt)、**不加粗**、顶格(无缩进)、outline_level=2。上下不空行。\n\n```python\np = doc.add_paragraph()\nset_outline(p, 2)\np.paragraph_format.first_line_indent = Pt(0)\nrun = p.add_run(text)\nset_cn_font(run, '黑体', size_pt=14, bold=False)\n```\n\n### 三级标题（`###`）\n\n小四宋体(12pt)、**不加粗**、首行缩进Pt(21)(=2个中文字)、outline_level=3。\n\n```python\np = doc.add_paragraph()\nset_outline(p, 3)\np.paragraph_format.first_line_indent = Pt(21)\nrun = p.add_run(text)\nset_cn_font(run, '宋体', size_pt=12, bold=False)\n```\n\n### 四级及以上标题（`####`、`#####`、`######`）\n\n格式与正文相同（五号宋体 10.5pt、首行缩进Pt(21)、1.3倍行距），但设置对应的 outline_level（4/5/6）。上下不空行。\n\n```python\np = doc.add_paragraph()\nset_outline(p, level)  # 4、5 或 6，按实际标题层级\np.paragraph_format.first_line_indent = Pt(21)\np.paragraph_format.line_spacing = 1.3\np.paragraph_format.space_before = Pt(0)\np.paragraph_format.space_after = Pt(0)\nrun = p.add_run(text)\nset_cn_font(run, '宋体', size_pt=10.5, bold=False)\n```\n\n### 正文段落\n\n五号(10.5pt)宋体/TNR、首行缩进Pt(21)、1.3倍行距、段前段后0磅。\n\n```python\np = doc.add_paragraph()\np.paragraph_format.first_line_indent = Pt(21)\np.paragraph_format.line_spacing = 1.3\np.paragraph_format.space_before = Pt(0)\np.paragraph_format.space_after = Pt(0)\nrun = p.add_run(text)\nset_cn_font(run, '宋体', size_pt=10.5)\n```\n\n### 图片\n\n下载嵌入(不压缩)、等比缩放(8-12cm规则)、居中、上方空一行。\n\n```python\nimport requests\nfrom PIL import Image\n\ndef dl_image(url):\n    h = {'User-Agent': 'Mozilla/5.0 (compatible; mddoc/1.0)'}\n    r = requests.get(url, headers=h, timeout=30); r.raise_for_status()\n    return r.content  # bytes, 可保存为临时文件\n\ndef img_width(path):\n    img = Image.open(path)\n    dpi = img.info.get('dpi', (96, 96))\n    dx = dpi[0] if dpi and dpi[0] > 0 else 96\n    w_cm = img.width / dx * 2.54\n    if   w_cm > 12: tw = 12.0\n    elif w_cm < 8:  tw = 8.0\n    else:           tw = w_cm\n    return Cm(tw)\n\nadd_empty(doc)\np = doc.add_paragraph()\np.alignment = WD_ALIGN_PARAGRAPH.CENTER\np.add_run().add_picture(img_path, width=img_width(img_path))\n```\n\n### 图题\n\n图片下方(不空行)、小五(9pt)宋体加粗居中、逐章编号。有章标题时格式 `图<章>-<序号> <alt>`，无章标题时格式 `图<序号> <alt>`。若 alt 为空，自动使用图片文件名（不含扩展名）作为图题。\n\n```python\np = doc.add_paragraph()\np.alignment = WD_ALIGN_PARAGRAPH.CENTER\nrun = p.add_run(f'图{ch}-{idx} {alt_text}')\nset_cn_font(run, '宋体', size_pt=9, bold=True)\nadd_empty(doc)  # 图题下方空一行\n```\n\n### 表格 + 表题\n\n**三线表**(顶线1.5pt/表头底线0.75pt/底线1.5pt粗，无竖线)。表题在上方(不空行)、五号(10.5pt)宋体加粗居中。有章标题时格式`表<章>-<序号> <描述>`，无章标题时格式`表<序号> <描述>`。\n\n```python\n# 表题\nadd_empty(doc)\np = doc.add_paragraph(); p.alignment = WD_ALIGN_PARAGRAPH.CENTER\nrun = p.add_run(f'表{ch}-{idx} {caption}')\nset_cn_font(run, '宋体', size_pt=10.5, bold=True)\n\n# 表格\ntb = doc.add_table(rows=nrows, cols=ncols)\ntb.alignment = WD_ALIGN_PARAGRAPH.CENTER\n\n# 三线表边框\nPr = tb._tbl.tblPr or OxmlElement('w:tblPr')\nB = OxmlElement('w:tblBorders')\nfor tag, sz in [('top','12'),('bottom','12')]:\n    e = OxmlElement(f'w:{tag}'); e.set(qn('w:val'),'single')\n    e.set(qn('w:sz'),sz); e.set(qn('w:space'),'0'); e.set(qn('w:color'),'000000')\n    B.append(e)\nfor tag in ('left','right','insideH','insideV'):\n    e = OxmlElement(f'w:{tag}'); e.set(qn('w:val'),'none')\n    e.set(qn('w:sz'),'0'); e.set(qn('w:space'),'0'); e.set(qn('w:color'),'auto')\n    B.append(e)\nPr.append(B)\n# 表头行每格底部加细线 0.75pt（cell级别，不影响数据行）\nfor cell in tb.rows[0].cells:\n    tcPr = cell._tc.get_or_add_tcPr()\n    tcB = OxmlElement('w:tcBorders')\n    btm = OxmlElement('w:bottom')\n    btm.set(qn('w:val'),'single'); btm.set(qn('w:sz'),'6')\n    btm.set(qn('w:space'),'0'); btm.set(qn('w:color'),'000000')\n    tcB.append(btm); tcPr.append(tcB)\n\n# header/data 为 mistune table_cell['children'] AST 列表（取 cell.get('children', [])）\n# 单元格内 **加粗**、*斜体*、$公式$ 由 walk_inline 渲染，公式字号跟随 9pt\n# 表头行 — 居中、9pt、垂直居中、无缩进\nfor j, children in enumerate(header):\n    c = tb.rows[0].cells[j]\n    c.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER\n    p = c.paragraphs[0]; p.clear()\n    p.alignment = WD_ALIGN_PARAGRAPH.CENTER\n    p.paragraph_format.first_line_indent = Pt(0)\n    p.paragraph_format.line_spacing = 1.0\n    _set_para_mark_size(p, 9)\n    walk_inline(p, children, '宋体', size_pt=9)\n\n# 数据行 — 左对齐、9pt、垂直居中、无缩进\nfor i, row in enumerate(data):\n    for j, children in enumerate(row):\n        c = tb.rows[i+1].cells[j]\n        c.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER\n        p = c.paragraphs[0]; p.clear()\n        p.paragraph_format.first_line_indent = Pt(0)\n        p.paragraph_format.line_spacing = 1.0\n        _set_para_mark_size(p, 9)\n        walk_inline(p, children, '宋体', size_pt=9)\n\nadd_empty(doc)  # 表格下方空一行\n```\n\n### 页眉\n\n左顶格\"xxxxx\"、右顶格文档题目、小五(9pt)黑体。\n\n```python\nsec = doc.sections[0]; hdr = sec.header\nhdr.is_linked_to_previous = False\nr = hdr.paragraphs[0].add_run('xxxxx')\nset_cn_font(r, '黑体', size_pt=9)\np2 = hdr.add_paragraph(); p2.alignment = WD_ALIGN_PARAGRAPH.RIGHT\nr2 = p2.add_run(title_text)\nset_cn_font(r2, '黑体', size_pt=9)\n```\n\n### 列表\n\n使用 Word 原生编号/项目符号（`w:numPr` XML），支持富文本 inline 和多级嵌套。列表段落遵守正文格式（首行缩进 Pt(21)、1.3 倍行距）。\n\n```python\n# 有序列表 — numId=50, 多级格式: 1. → a) → i.\n# 无序列表 — numId=51, 多级符号: • → ◦ → ▪\nfor item in list_node['children']:\n    p = doc.add_paragraph()\n    p.paragraph_format.first_line_indent = Pt(21)  # 同正文\n    p.paragraph_format.line_spacing = 1.3\n    # 设置 Word 原生编号\n    numPr = OxmlElement('w:numPr')\n    ilvl = OxmlElement('w:ilvl'); ilvl.set(qn('w:val'), str(depth))\n    numId = OxmlElement('w:numId'); numId.set(qn('w:val'), '50')  # 50=有序, 51=无序\n    numPr.append(ilvl); numPr.append(numId)\n    p._element.get_or_add_pPr().append(numPr)\n    # walk_inline 渲染富文本（支持 **加粗**、*斜体*、$公式$）\n    walk_inline(p, item['children'][0]['children'], '宋体', size_pt=10.5)\n    # 嵌套子列表：递归调用 render_list(doc, child, depth+1)\n\n# 列表编号定义（生成文档时需在 numbering.xml 中注入抽象编号）\n_ensure_list_numbering_defs(doc)  # 定义 numId=50(有序) 和 numId=51(无序)，各 3 级\n```\n\n列表编号自动跨页连续（同一 `numId` 的段落由 Word 维护编号序列）。\n\n### 内联格式（加粗、斜体、行内公式等）\n\n段落内使用 `walk_inline()` 递归遍历 mistune inline AST，生成带格式的 runs 和 OMML 元素。格式状态（加粗/斜体/下划线）递归下传，同时作用于文本 run 和公式 OMML：\n\n```python\ndef walk_inline(paragraph, children, base_cn='宋体', base_en='Times New Roman',\n                base_size=10.5, bold=False, italic=False, underline=False):\n    for child in children:\n        ct = child['type']\n        if ct == 'text':\n            if child.get('raw', ''):\n                run = paragraph.add_run(child['raw'])\n                set_cn_font(run, base_cn, en_font=base_en, size_pt=base_size, bold=bold)\n                if italic: run.font.italic = True\n                if underline: run.font.underline = True\n        elif ct == 'strong':  # **加粗** — 递归传 bold=True\n            walk_inline(paragraph, child['children'], base_cn, base_en, base_size,\n                        bold=True, italic=italic, underline=underline)\n        elif ct == 'emphasis':  # *斜体* — 递归传 italic=True\n            walk_inline(paragraph, child['children'], base_cn, base_en, base_size,\n                        bold=bold, italic=True, underline=underline)\n        elif ct == 'link':  # 链接 — 递归传 underline=True\n            walk_inline(paragraph, child['children'], base_cn, base_en, base_size,\n                        bold=bold, italic=italic, underline=True)\n        elif ct == 'inline_math':  # $...$\n            omml = latex_to_omml(child['raw'], display=False)\n            paragraph._element.append(apply_omml_style(omml, bold, italic))\n        elif ct == 'codespan':  # `代码`\n            run = paragraph.add_run(child.get('raw', ''))\n            set_cn_font(run, base_cn, en_font=base_en, size_pt=base_size)\n\n\ndef apply_omml_style(omml, bold=False, italic=False):\n    \"\"\"为公式内所有 m:r 添加 <m:sty m:val=\"b/i/bi\"/>，使 **$x$**、*$x$* 嵌套公式生效\"\"\"\n    if not (bold or italic):\n        return omml\n    val = ('b' if bold else '') + ('i' if italic else '')\n    NSM = '{http://schemas.openxmlformats.org/officeDocument/2006/math}'\n    for r in omml.iter(f'{NSM}r'):\n        rPr = r.find(f'{NSM}rPr')\n        if rPr is None:\n            rPr = OxmlElement('m:rPr')\n            r.insert(0, rPr)\n        if rPr.find(f'{NSM}sty') is None:\n            sty = OxmlElement('m:sty')\n            sty.set(qn('m:val'), val)\n            rPr.append(sty)\n    return omml\n\n\ndef _set_para_mark_size(paragraph, size_pt):\n    \"\"\"设置段落标记字号（半磅），供行内公式 OMML 继承（如 9 → 9pt）\"\"\"\n    pPr = paragraph._element.get_or_add_pPr()\n    rPr = pPr.find(qn('w:rPr'))\n    if rPr is None:\n        rPr = OxmlElement('w:rPr')\n        pPr.append(rPr)\n    sz = rPr.find(qn('w:sz'))\n    if sz is None:\n        sz = OxmlElement('w:sz')\n        rPr.append(sz)\n    sz.set(qn('w:val'), str(int(size_pt * 2)))\n```\n\n`***加粗斜体***` → AST: `emphasis > strong` → 递归自然处理为 bold+italic。嵌套在加粗/斜体里的公式（`**$x$**`、`*$x$*`）由 `apply_omml_style()` 保留并上样式。\n\n### 标题样式清理\n\n生成前覆盖 Word 内置 Heading 1-6 样式，防止默认蓝色/Cambria/加粗干扰：\n\n```python\ndef override_builtin_heading_styles(doc):\n    specs = {\n        'Heading 1': ('黑体', 16, True, WD_ALIGN_PARAGRAPH.CENTER),\n        'Heading 2': ('黑体', 14, False, WD_ALIGN_PARAGRAPH.LEFT),\n        'Heading 3': ('宋体', 12, False, WD_ALIGN_PARAGRAPH.LEFT),\n        'Heading 4': ('宋体', 10.5, False, WD_ALIGN_PARAGRAPH.LEFT),\n        'Heading 5': ('宋体', 10.5, False, WD_ALIGN_PARAGRAPH.LEFT),\n        'Heading 6': ('宋体', 10.5, False, WD_ALIGN_PARAGRAPH.LEFT),\n    }\n    for name, (cn_font, size_pt, bold, align) in specs.items():\n        style = doc.styles[name]\n        style.font.size = Pt(size_pt)\n        style.font.bold = bold\n        style.font.color.rgb = None  # 黑色\n        style.font.italic = False\n        style.font.underline = False\n        rPr = style.element.get_or_add_rPr()\n        rFonts = rPr.find(qn('w:rFonts'))\n        if rFonts is None:\n            rFonts = OxmlElement('w:rFonts'); rPr.insert(0, rFonts)\n        rFonts.set(qn('w:eastAsia'), cn_font)\n```\n\n调用位置：`generate_docx()` 中 `doc = Document()` 后立即执行。\n\n### 代码块\n\nTimes New Roman 字体、五号、无首行缩进、灰色背景(#D9D9D9)、上下各空一行。\n\n```python\nadd_empty(doc)\np = doc.add_paragraph()\nset_first_line_indent_chars(p, 0)  # 代码块无首行缩进\n# 灰色背景\npPr = p._element.get_or_add_pPr()\nshd = OxmlElement('w:shd')\nshd.set(qn('w:val'), 'clear')\nshd.set(qn('w:color'), 'auto')\nshd.set(qn('w:fill'), 'D9D9D9')\npPr.append(shd)\nrun = p.add_run(code)\nset_cn_font(run, '宋体', en_name='Times New Roman', size_pt=10.5)\nadd_empty(doc)\n```\n\n### 行内公式（`$...$`）\n\n嵌于段落中，转换为 OMML（Office Math Markup Language）格式，WPS/Word 可直接渲染。\n公式在段落中作为 `<m:oMath>` 元素插入，与文字 run 同级。\n\n```python\n# 行内公式通过 split_inline_math() 拆分为 segments\n# text segment → 普通 run，math segment → latex_to_omml() → m:oMath 元素\np = doc.add_paragraph()\np.paragraph_format.first_line_indent = Pt(21)\np.paragraph_format.line_spacing = 1.3\nfor seg in segments:\n    if seg['type'] == 'text':\n        if seg['content']:\n            run = p.add_run(seg['content'])\n            set_cn_font(run, '宋体', size_pt=10.5)\n    else:  # math — 转换为 OMML 并插入段落 XML\n        omml = latex_to_omml(seg['content'], display=False)\n        p._element.append(omml)\n```\n\n### 行间公式（`$$...$$`）\n\n独立成行，上下各空一行。公式通过 OMML 居中渲染，编号右对齐。编号格式同图/表：`(章-序号)`，逐章编号。编号括号用五号宋体，数字用五号 Times New Roman。\n\n布局方式：段落设置居中和右对齐 tab stop，OMML `<m:oMath>` 元素位于两个 tab 之间，实现公式居中、编号右对齐。\n\n```python\nadd_empty(doc)  # 上方空一行\np = doc.add_paragraph()\n\n# 设置 tab stops：居中和右对齐\n# 左边距3cm右边距2cm → 可用宽度16cm → 中心8cm(4536twips), 右边16cm(9072twips)\npPr = p._element.get_or_add_pPr()\ntabs = OxmlElement('w:tabs')\nct = OxmlElement('w:tab'); ct.set(qn('w:val'), 'center'); ct.set(qn('w:pos'), '4536')\nrt = OxmlElement('w:tab'); rt.set(qn('w:val'), 'right'); rt.set(qn('w:pos'), '9072')\ntabs.append(ct); tabs.append(rt)\npPr.append(tabs)\n\n# tab → 公式 OMML 居中\nrun_t1 = p.add_run()\nrun_t1._r.append(OxmlElement('w:tab'))\nomml = latex_to_omml(formula_text, display=False)\np._element.append(omml)\n\n# tab → 编号右对齐：(章-序号)\nrun_t2 = p.add_run()\nrun_t2._r.append(OxmlElement('w:tab'))\nrun_lp = p.add_run('(')\nset_cn_font(run_lp, '宋体', en_name='宋体', size_pt=10.5)\nrun_num = p.add_run(f'{ch}-{eq_num}')\nset_cn_font(run_num, '宋体', en_name='Times New Roman', size_pt=10.5)\nrun_rp = p.add_run(')')\nset_cn_font(run_rp, '宋体', en_name='宋体', size_pt=10.5)\n\nadd_empty(doc)  # 下方空一行\n```\n\n### LaTeX → OMML 转换\n\n内置 `latex_to_omml()` 函数将 LaTeX 数学公式转换为 OMML XML，支持以下构造：\n\n- 上下标：`a^b`、`a_b`、`a_b^c`\n- 分数：`\\frac{a}{b}`\n- 根式：`\\sqrt{x}`、`\\sqrt[n]{x}`\n- 希腊字母：`\\alpha`、`\\beta`、`\\Gamma` 等\n- 大运算符：`\\sum`、`\\prod`、`\\int`（含上下限）\n- 函数名：`\\sin`、`\\cos`、`\\log`、`\\lim` 等\n- 重音：`\\hat`、`\\bar`、`\\vec`、`\\tilde` 等\n- 符号：`\\infty`、`\\cdot`、`\\times`、`\\partial`、`\\nabla` 等\n- 定界符：`\\left(...\\right)`、`\\left[...\\right]`\n- 文本：`\\text{...}`\n\n### 页码\n\n从第一章（第一个一级标题所在页）开始编页码，格式 `第×页  共×页`，页脚边距 1cm。\n\n```python\nfrom docx.oxml import OxmlElement\nfrom docx.oxml.ns import qn\nfrom docx.shared import Cm\n\nsection = doc.sections[0]\nsection.footer_distance = Cm(1.1)  # 页脚边距\n\nfooter = section.footer\nfooter.is_linked_to_previous = False\nfp = footer.paragraphs[0]\nfp.alignment = WD_ALIGN_PARAGRAPH.CENTER\n\n# \"第\" 字\nrun1 = fp.add_run('第')\nset_cn_font(run1, '宋体', size_pt=10.5)\n# 页码字段\nrun_page = fp.add_run()\nfldChar1 = OxmlElement('w:fldChar'); fldChar1.set(qn('w:fldCharType'), 'begin')\nrun_page._r.append(fldChar1)\ninstrText = OxmlElement('w:instrText'); instrText.set(qn('xml:space'), 'preserve')\ninstrText.text = ' PAGE '\nrun_page._r.append(instrText)\nfldChar2 = OxmlElement('w:fldChar'); fldChar2.set(qn('w:fldCharType'), 'end')\nrun_page._r.append(fldChar2)\n# \"页  共\"\nrun2 = fp.add_run('页  共')\nset_cn_font(run2, '宋体', size_pt=10.5)\n# 总页数字段\nrun_total = fp.add_run()\nfldChar3 = OxmlElement('w:fldChar'); fldChar3.set(qn('w:fldCharType'), 'begin')\nrun_total._r.append(fldChar3)\ninstrText2 = OxmlElement('w:instrText'); instrText2.set(qn('xml:space'), 'preserve')\ninstrText2.text = ' NUMPAGES '\nrun_total._r.append(instrText2)\nfldChar4 = OxmlElement('w:fldChar'); fldChar4.set(qn('w:fldCharType'), 'end')\nrun_total._r.append(fldChar4)\n# \"页\"\nrun3 = fp.add_run('页')\nset_cn_font(run3, '宋体', size_pt=10.5)\n```\n\n> 注意：页码从第一章开始计数需在第一个一级标题处插入分节符并重置页码。简单场景可统一从第1页开始。\n\n### 跨页表格（续表）\n\n表头行设为重复标题行，跨页自动重复。续表在右上方标\"续表<编号>\"。\n\n```python\n# 表头行设为重复标题行（跨页自动出现）\ntblHeader = OxmlElement('w:tblHeader')\ntrPr = table.rows[0]._tr.get_or_add_trPr()\ntrPr.append(tblHeader)\n\n# 对于确实跨页的大表格，在分页处手动加\"续表\"标记：\n# （python-docx无法检测分页位置，建议生成后人工检查）\n# 续表右对齐段落示例：\np_cont = doc.add_paragraph()\np_cont.alignment = WD_ALIGN_PARAGRAPH.RIGHT\nrun_cont = p_cont.add_run(f'续表{tab_label}')\nset_cn_font(run_cont, '宋体', size_pt=10.5)\n```\n\n---\n\n## 生成后自检清单\n\n- [ ] 题目：16pt黑体、居中、无outline、上下各空一行\n- [ ] 无标题文档：跳过标题页、页眉显示「未命名文档」\n- [ ] 一级标题：16pt黑体、outline_level=1、前有分页符、上下各空一行\n- [ ] 二级标题：14pt黑体、顶格、outline_level=2、不加粗、**上下不空行**\n- [ ] 三级标题：12pt宋体、首行缩进Pt(21)、outline_level=3、不加粗、**上下不空行**\n- [ ] 四级及以上标题：10.5pt宋体同正文、首行缩进Pt(21)、outline_level=对应层级(4/5/6)、**上下不空行**\n- [ ] 正文：10.5pt、首行缩进Pt(21)、1.3倍行距、**段落间不空行**\n- [ ] 图片：嵌入、等比缩放8-12cm、居中、上下各空一行\n- [ ] 图题：9pt宋体加粗居中、图片下方\n- [ ] 表格：三线表(顶/底粗、表头格底线细、数据行无线)、居中\n- [ ] 表头行：居中、9pt、无缩进、tblHeader重复\n- [ ] 表题：10.5pt宋体加粗居中、表格上方\n- [ ] 列表：有序用 Word 原生编号、无序用 Word 原生黑圆点、悬挂缩进、支持富文本 inline\n- [ ] 代码块：Times New Roman、无缩进、灰色背景#D9D9D9、上下各空一行\n- [ ] 加粗/斜体/加粗斜体：`**文本**` bold、`*文本*` italic、`***文本***` bold+italic\n- [ ] 分隔线：`---`（3+ 连续 `-`） → 分页符\n- [ ] 页眉：左\"xxxxx\"右题目、9pt黑体\n- [ ] 行内公式：$...$ 嵌于段落、OMML格式、WPS/Word可渲染\n- [ ] 行间公式：$$...$$ OMML居中、上下各空一行、编号(章-序号)右对齐、括号宋体数字TNR\n- [ ] 页码：\"第×页 共×页\"、页脚边距1cm\n- [ ] 标题样式：Heading 1-6 已覆盖为学术格式（黑体/宋体、黑色）\n- [ ] 分隔线：`---` → 分页符\n- [ ] 续表：跨页表头重复、\"续表xx\"右上标注\n- [ ] 页边距：左3cm 右2cm 上2cm 下2cm\n- [ ] 全部黑色、无额外参数\n\n## 注意事项\n\n- **解析器**：Markdown 解析使用 mistune 3.x（`renderer='ast'`），配合 `table` 和 `math` 插件。所有 block/inline 格式由 mistune AST 提供，不再手写解析器\n- **第一个 `#` 是题目**（不设 outline），后续 `#` 是一级标题（outline_level=1）；若无 `#` 标题仍可正常生成文档\n- **图片尺寸用 `Cm()`，不手算 EMU** — `add_picture(width=Cm(x))` 自动转换\n- **图片下载必设 User-Agent** — 否则 CDN/Wikipedia 返回 400\n- **图题编号自动生成** — alt text 作为描述文字，图/表编号独立逐章编序\n- **表题识别** — 表格前含\"表\"字的段落自动作为表题（lookahead 跳过空行），不渲染为独立段落\n- **outline_level 用 `set_outline()` 设置** — `paragraph_format.outline_level` 在部分python-docx版本不生效，统一用XML方式写入；读取时也从XML读取\n- **公式编号自动生成** — 图/表/公式独立逐章编序，编号格式统一为 `章-序号`\n- **不添加**：目录页、背景色\n- **单位**：字体用 pt、尺寸用 cm\n\nFile v0.1.8:_meta.json\n\n{\n  \"ownerId\": \"kn74sxjtkhk771hzvyhh8q6hp18a69xe\",\n  \"slug\": \"mddoc\",\n  \"version\": \"0.1.8\",\n  \"publishedAt\": 1786513153480\n}\n\nFile v0.1.8:evals/test-latex-coverage.md\n\n# LaTeX 数学公式覆盖测试（IHKYoung 手册 + 完整补全）\n\n本文件测试所有已实现的 LaTeX 数学公式语法。\n\n---\n\n## 矩阵环境\n\n### bmatrix（方括号）\n\n$$\n\\begin{bmatrix} a & b \\\\ c & d \\end{bmatrix}\n$$\n\n### pmatrix（圆括号）\n\n$$\n\\begin{pmatrix} x_{11} & x_{12} \\\\ x_{21} & x_{22} \\end{pmatrix}\n$$\n\n### vmatrix（单竖线行列式）\n\n$$\n\\begin{vmatrix} a & b \\\\ c & d \\end{vmatrix}\n$$\n\n### Vmatrix（双竖线范数）\n\n$$\n\\begin{Vmatrix} a & b \\\\ c & d \\end{Vmatrix}\n$$\n\n### matrix（无括号）\n\n$$\n\\begin{matrix} 1 & 0 \\\\ 0 & 1 \\end{matrix}\n$$\n\n---\n\n## cases 环境（分段函数）\n\n$$\nf(x) = \\begin{cases} 0 & x < 0 \\\\ x^2 & 0 \\leq x < 1 \\\\ 1 & x \\geq 1 \\end{cases}\n$$\n\n---\n\n## align 环境（多行对齐）\n\n$$\n\\begin{align} x + y &= 2 \\\\ x - y &= 0 \\end{align}\n$$\n\n---\n\n## 字体命令\n\n### 粗体\n\n行内: $\\mathbf{A} = \\mathbf{B} + \\mathbf{C}$\n\n### 斜体\n\n行内: $\\mathit{variable}$\n\n### 手写体（花体）\n\n行内: $\\mathcal{L}$ $\\mathcal{A}$\n\n### 黑板粗体\n\n行内: $\\mathbb{R}$ $\\mathbb{N}$ $\\mathbb{Z}$ $\\mathbb{C}$\n\n### 正体（罗马体）\n\n行内: $\\mathrm{Var}(X)$\n\n### 等宽体\n\n行内: $\\mathtt{code}$\n\n### 粗体符号\n\n$\\boldsymbol{\\alpha} + \\bm{\\beta} = \\mathbb{E}[X]$\n\n---\n\n## 希腊字母\n\n### 小写\n\n$\\alpha$ $\\beta$ $\\gamma$ $\\delta$ $\\epsilon$ $\\varepsilon$ $\\zeta$ $\\eta$ $\\theta$ $\\vartheta$\n\n$\\iota$ $\\kappa$ $\\lambda$ $\\mu$ $\\nu$ $\\xi$ $\\pi$ $\\rho$ $\\sigma$ $\\tau$ $\\upsilon$ $\\phi$ $\\varphi$ $\\chi$ $\\psi$ $\\omega$\n\n### 大写\n\n$\\Gamma$ $\\Delta$ $\\Theta$ $\\Lambda$ $\\Xi$ $\\Pi$ $\\Sigma$ $\\Upsilon$ $\\Phi$ $\\Psi$ $\\Omega$\n\n### 变体\n\n$\\varpi$ $\\varrho$ $\\varsigma$\n\n---\n\n## 二元运算符\n\n$+$ $-$ $\\times$ $\\div$ $\\cdot$ $\\oplus$ $\\ominus$ $\\otimes$ $\\oslash$ $\\odot$ $\\star$ $\\circ$ $\\bullet$ $\\pm$ $\\mp$\n\n---\n\n## 关系符号\n\n$=$ $\\neq$ $\\approx$ $\\equiv$ $<$ $>$ $\\leq$ $\\geq$ $\\ge$ $\\le$ $\\ne$\n\n$\\ll$ $\\gg$ $\\prec$ $\\succ$ $\\preceq$ $\\succeq$ $\\sim$ $\\nsim$ $\\simeq$ $\\asymp$ $\\propto$\n\n---\n\n## 逻辑符号\n\n$\\wedge$ $\\vee$ $\\neg$ $\\Rightarrow$ $\\Leftrightarrow$ $\\forall$ $\\exists$ $\\nexists$ $\\top$ $\\bot$\n\n---\n\n## 集合符号\n\n$\\emptyset$ $\\in$ $\\notin$ $\\subseteq$ $\\subset$ $\\nsubseteq$ $\\supset$ $\\supseteq$ $\\nsupseteq$ $\\cup$ $\\cap$ $\\setminus$\n\n---\n\n## 箭头\n\n$\\to$ $\\gets$ $\\leftarrow$ $\\rightarrow$ $\\Rightarrow$ $\\Leftarrow$ $\\leftrightarrow$ $\\Leftrightarrow$\n\n$\\longrightarrow$ $\\longleftarrow$ $\\mapsto$ $\\longmapsto$ $\\uparrow$ $\\downarrow$ $\\updownarrow$\n\n$\\Uparrow$ $\\Downarrow$ $\\Updownarrow$\n\n---\n\n## 分数与根式\n\n### 分数\n\n$\\frac{a}{b}$ $\\dfrac{1}{2}$ $\\tfrac{1}{3}$\n\n$$\n\\frac{d}{dx} f(x) \\qquad \\frac{\\partial f}{\\partial x}\n$$\n\n### 根式\n\n$\\sqrt{x}$ $\\sqrt[n]{x}$\n\n---\n\n## 指数与对数\n\n$a^b$ $e^x$ $\\log x$ $\\ln x$ $\\log_a b$ $\\exp(x)$\n\n---\n\n## 极限\n\n$\\lim_{x \\to a} f(x)$ $\\lim_{x \\to \\infty} f(x)$\n\n---\n\n## 积分与求和\n\n$\\int f(x)dx$ $\\int_{a}^{b} f(x)dx$ $\\iint$ $\\iiint$\n\n$\\sum_{i=1}^{n} x_i$ $\\prod_{i=1}^{n} x_i$\n\n---\n\n## 重音符号\n\n$\\hat{x}$ $\\bar{x}$ $\\vec{v}$ $\\dot{x}$ $\\ddot{x}$ $\\tilde{x}$\n\n$$\n\\overrightarrow{AB} = \\overleftarrow{BA}\n$$\n\n---\n\n## 定界符\n\n$$\n\\left( \\frac{a + b}{c} \\right) \\qquad \\left[ \\frac{x}{y} \\right]\n$$\n\n---\n\n## 函数名\n\n$\\sin$ $\\cos$ $\\tan$ $\\cot$ $\\sec$ $\\csc$\n\n$\\arcsin$ $\\arccos$ $\\arctan$\n\n$\\sinh$ $\\cosh$ $\\tanh$ $\\coth$\n\n$\\log$ $\\lg$ $\\ln$ $\\exp$\n\n$\\lim$ $\\max$ $\\min$ $\\sup$ $\\inf$\n\n$\\det$ $\\dim$ $\\ker$ $\\gcd$\n\n---\n\n## 文本\n\n$\\text{当且仅当}$ $x \\text{ is even}$\n\n---\n\n## 间距\n\n$a\\,b$ $a\\quad b$ $a\\qquad b$\n\n---\n\n## 颜色\n\n$\\textcolor{red}{红色文字}$ $\\textcolor{blue}{蓝色文字}$\n\n---\n\n## 转义字符\n\n$\\#$ $\\$ $ \\% $ \\& $ \\_ $ \\{ $ \\} $ \\backslash $\n\n---\n\n## 综合复杂公式\n\n$$\n\\frac{1}{\\sqrt{2\\pi\\sigma^2}} \\exp\\left(-\\frac{(x-\\mu)^2}{2\\sigma^2}\\right)\n$$\n\n$$\nA\\mathbf{v} = \\lambda \\mathbf{v}\n$$\n\n$$\n\\mathbb{E}[X] = \\sum_{x} x\\,P(X=x)\n$$\n\n$$\n\\mathrm{Var}(X) = \\mathbb{E}[(X - \\mathbb{E}[X])^2]\n$$\n\n$$\nD_{KL}(P \\parallel Q) = \\sum_x P(x) \\log \\frac{P(x)}{Q(x)}\n$$\n\n$$\n\\frac{1}{N} \\sum_{i=1}^{N} (y_i - (w^T x_i + b))^2\n$$\n\nFile v0.1.8:evals/test-sample.md\n\n# 第一章 基于深度学习的图像识别研究\n\n## 1.1 研究背景\n\n近年来，深度学习技术在计算机视觉领域取得了突破性进展。卷积神经网络（Convolutional Neural Network, CNN）作为深度学习的核心架构之一，在图像分类、目标检测、语义分割等任务中表现出色。\n\n图像识别技术已广泛应用于安防监控、自动驾驶、医疗诊断等领域。传统的图像识别方法依赖手工设计的特征提取器，如 SIFT、HOG 等，这些方法在复杂场景下的泛化能力有限。\n\n### 1.2.1 深度学习发展历程\n\n深度学习的概念可追溯至20世纪40年代的神经网络研究。经历了多次起伏后，2012年 AlexNet 在 ImageNet 竞赛中的突破性表现标志着深度学习时代的正式到来。\n\n此后，VGGNet、GoogLeNet、ResNet 等架构相继提出，不断刷新图像识别的准确率记录。其中 ResNet 引入的残差连接解决了深层网络的梯度消失问题。\n\n## 1.2 研究现状\n\n目前主流的图像识别方法可归纳为三类：基于 CNN 的方法、基于 Transformer 的方法以及混合架构方法。\n\n![ResNet 网络架构示意图](https://www.python.org/static/img/python-logo.png)\n\n表 主流图像识别模型性能对比\n\n| 模型名称 | Top-1 准确率 | 参数量 | 发布时间 |\n|----------|-------------|--------|---------|\n| ResNet-50 | 76.2% | 25.6M | 2015 |\n| EfficientNet-B4 | 83.0% | 19.3M | 2019 |\n| ViT-B/16 | 84.1% | 86.0M | 2020 |\n| ConvNeXt-T | 84.9% | 28.6M | 2022 |\n| **ViT-B/32** | *85.0%* | $87.7$M | 2021 |\n\n从上表可以看出，模型性能持续提升的同时，参数效率也在不断优化。EfficientNet 系列通过神经架构搜索实现了参数效率与精度的良好平衡。\n\n### 1.2.1 数据增强技术\n\n数据增强是提升模型泛化能力的重要手段。常用方法包括：\n\n- 随机裁剪与缩放\n- 水平翻转与旋转\n- 色彩抖动与光照变换\n- CutOut 与 MixUp 等高级增强策略\n\n研究表明，合理的数据增强策略可以有效缓解过拟合问题，尤其在训练数据有限的场景下。\n\n## 1.3 理论基础\n\n卷积操作的数学表达为 $y = W * x + b$，其中 $W$ 为卷积核权重，$b$ 为偏置项。\n\n损失函数采用交叉熵损失：\n\n$$\nL(y, \\hat{y}) = -\\sum_{i=1}^{C} y_i \\log(\\hat{y}_i)\n$$\n\n梯度下降的参数更新规则为 $w_{t+1} = w_t - \\eta \\nabla L(w_t)$，其中 $\\eta$ 表示学习率。\n\n## 1.4 本文主要工作\n\n本文旨在构建一个高效准确的图像识别系统，主要贡献包括：\n\n本文的代码实现基于 PyTorch 框架，训练过程如下：\n\n```\nimport torch\nmodel = torch.hub.load('pytorch/vision', 'resnet50', pretrained=True)\nmodel.fc = torch.nn.Linear(2048, num_classes)\n```\n\n后续章节将详细介绍模型设计、训练策略与实验结果。\n\nFile v0.1.8:skill-card.md\n\n## Description:\n\nConverts Markdown files or pasted Markdown text into academically formatted Word (.docx) documents with support for headings, body text, images, tables, code blocks, lists, and LaTeX math.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[trisia](https://clawhub.ai/user/trisia)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers, students, and technical writers use this skill to convert Markdown content into formatted DOCX documents for academic papers, technical reports, theses, and similar structured documents.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Untrusted Markdown can trigger automatic outbound image downloads.\n\nMitigation: Review Markdown image URLs before conversion or disable remote image fetching when processing untrusted content.\n\nRisk: The setup workflow creates a persistent cache virtual environment and installs Python packages.\n\nMitigation: Approve dependency installation before first use and run the skill in an environment where the persistent cache location is acceptable.\n\nRisk: The converter reads Markdown inputs and writes DOCX files to the selected output location.\n\nMitigation: Use intended input files and explicit output paths when converting sensitive or untrusted documents.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/trisia/skills/mddoc)\n- [Sample Markdown evaluation](artifact/evals/test-sample.md)\n- [LaTeX coverage evaluation](artifact/evals/test-latex-coverage.md)\n\n## Skill Output:\n\n**Output Type(s):** [files, shell commands, configuration, guidance]\n\n**Output Format:** [DOCX files with Markdown guidance and shell commands]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May create or reuse a persistent Python virtual environment and may fetch image URLs embedded in Markdown.]\n\n## Skill Version(s):\n\n0.1.8 (source: server release evidence; artifact frontmatter says 1.0.8)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v0.1.8:evals/evals.json\n\n{\n  \"skill_name\": \"mddoc\",\n  \"evals\": [\n    {\n      \"id\": 1,\n      \"prompt\": \"帮我把这份 Markdown 文件转成 docx 格式的 Word 文档\",\n      \"expected_output\": \"生成 .docx 文件，包含正确的标题格式、正文格式、图片和表格，页眉正确设置\",\n      \"files\": [\"evals/test-sample.md\"]\n    },\n    {\n      \"id\": 2,\n      \"prompt\": \"将下面这段 markdown 转成格式化的 Word 文档，保存到当前目录：\\n\\n# 实验报告\\n\\n## 实验目的\\n\\n本实验旨在验证深度学习模型在小样本数据集上的泛化性能。通过对比实验分析不同正则化策略的效果。\\n\\n## 实验方法\\n\\n### 数据集准备\\n\\n实验采用 CIFAR-10 数据集，随机选取每类 100 张图片作为训练集。测试集保持原始大小。\\n\\n![实验流程图](https://upload.wikimedia.org/wikipedia/commons/thumb/2/2d/Tensor_visualization.svg/400px-Tensor_visualization.svg.png)\\n\\n表 超参数配置\\n\\n| 参数 | 取值 |\\n|------|------|\\n| 学习率 | 0.001 |\\n| 批量大小 | 32 |\\n| 训练轮次 | 100 |\\n\\n### 评估指标\\n\\n采用 Top-1 准确率和 F1 分数作为评估指标。\",\n      \"expected_output\": \"在当前目录生成 实验报告.docx，包含题目、各级标题、正文、图片、表格的正确格式\",\n      \"files\": []\n    },\n    {\n      \"id\": 3,\n      \"prompt\": \"/mddoc 把这个转成word @evals/test-sample.md\",\n      \"expected_output\": \"在 evals/ 目录生成第一章 基于深度学习的图像识别研究.docx，格式完全符合学术规范\",\n      \"files\": [\"evals/test-sample.md\"]\n    }\n  ]\n}\n\nArchive v0.1.7: 7 files, 34809 bytes\n\nFiles: evals/evals.json (1585b), evals/test-latex-coverage.md (4031b), evals/test-sample.md (2789b), scripts/md2docx.py (75658b), skill-card.md (1778b), SKILL.md (23488b), _meta.json (124b)\n\nFile v0.1.7:SKILL.md\n\n---\nname: mddoc\nversion: 1.0.7\ndescription: 将 Markdown 内容转换为特定学术格式的 Word 文档 (.docx)。当用户想要将 Markdown 文件、粘贴的 Markdown 文本转换为格式化的 docx 文档时使用，特别是学术论文、技术报告、毕业论文等需要严格格式要求的场景。触发词包括：/mddoc、markdown转docx、md转word、生成格式化文档、学术格式转换。即使用户只说\"把这个转成word\"而内容是Markdown，也应使用此技能。\n---\n\n# mddoc — Markdown 转学术格式 DOCX\n\n## 快速开始\n\n```bash\n# 首次使用：创建虚拟环境并安装依赖\npython3 -m venv .venv\nsource .venv/bin/activate\npip install python-docx Pillow requests mistune\n\n# 后续使用：直接激活虚拟环境\nsource .venv/bin/activate\n\n# 转换 Markdown 文件 → 输出到同目录\npython <skill-path>/scripts/md2docx.py paper.md\n\n# 指定输出路径\npython <skill-path>/scripts/md2docx.py paper.md -o /path/to/output.docx\n\n# 直接转换粘贴的文本\npython <skill-path>/scripts/md2docx.py --text \"# 标题\\n\\n正文内容\" -o out.docx\n```\n\n其中 `<skill-path>` = `/home/kkk/.claude/skills/mddoc`\n\n## 工作流程\n\n1. **读取输入** — 若用户粘贴 Markdown 文本则直接读取；若用户提供文件路径（含 `@` 引用）则读取该文件\n2. **检查并准备环境** — 按以下顺序检查，命中即跳过后续步骤：\n   - 若 `.venv/bin/python` 存在且能 `import docx, PIL, requests, mistune` → 直接使用\n   - 若 `.venv` 存在但缺依赖 → `source .venv/bin/activate && pip install python-docx Pillow requests mistune`\n   - 若 `.venv` 不存在 → `python3 -m venv .venv && source .venv/bin/activate && pip install python-docx Pillow requests mistune`\n3. **执行转换** — 优先使用内置脚本 `scripts/md2docx.py`；若 Markdown 结构特殊则参照下方格式规范编写自定义脚本\n4. **确定输出** — 文件路径输入→同目录；粘贴内容→当前目录；文件名=「题目.docx」（题目从第一个 `# 标题` 提取；若无 `#` 标题则使用输入文件名，`--text` 模式为「未命名文档.docx」）\n5. **验证** — 检查 outline level、图片嵌入、页眉、分页符\n\n---\n\n## 格式参考\n\n> 每个元素配可直接使用的 python-docx 代码。公共导入和工具函数：\n\n```python\nfrom docx import Document\nfrom docx.shared import Pt, Cm\nfrom docx.enum.text import WD_ALIGN_PARAGRAPH\nfrom docx.oxml import OxmlElement\nfrom docx.oxml.ns import qn\n\ndef set_cn_font(run, cn_name, en_name='Times New Roman', size_pt=10.5, bold=False):\n    \"\"\"设置 run 的中英文字体、字号、加粗、颜色(黑)\"\"\"\n    run.font.size = Pt(size_pt)\n    run.font.bold = bold\n    run.font.name = en_name\n    run.font.color.rgb = None\n    rPr = run._element.get_or_add_rPr()\n    rFonts = rPr.find(qn('w:rFonts'))\n    if rFonts is None:\n        rFonts = OxmlElement('w:rFonts'); rPr.insert(0, rFonts)\n    rFonts.set(qn('w:eastAsia'), cn_name)\n    rFonts.set(qn('w:ascii'), en_name)\n    rFonts.set(qn('w:hAnsi'), en_name)\n\ndef add_empty(doc):\n    \"\"\"五号空行\"\"\"\n    p = doc.add_paragraph()\n    run = p.add_run('')\n    set_cn_font(run, '宋体', size_pt=10.5)\n    return p\n\ndef set_outline(para, level):\n    \"\"\"设置 outline level（XML方式，兼容所有python-docx版本）\"\"\"\n    pPr = para._element.get_or_add_pPr()\n    ol = OxmlElement('w:outlineLvl')\n    ol.set(qn('w:val'), str(level))\n    pPr.append(ol)\n```\n\n### 基础设置\n\n五号=10.5pt，1.3倍行距，段前段后0磅，全黑，A4页边距左3cm右2cm上2cm下2cm，页脚距底1cm。\n\n```python\ndoc = Document()\nsection = doc.sections[0]\n# 页边距：左3cm 右2cm 上2cm 下2cm\nsection.left_margin = Cm(3)\nsection.right_margin = Cm(2)\nsection.top_margin = Cm(2)\nsection.bottom_margin = Cm(2)\n\nsty = doc.styles['Normal']\nsty.font.size = Pt(10.5)\nsty.font.name = 'Times New Roman'\nsty.element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')\nsty.paragraph_format.line_spacing = 1.3\nsty.paragraph_format.space_before = Pt(0)\nsty.paragraph_format.space_after = Pt(0)\n```\n\n### 空行规则\n\n- **段落之间**：不空行\n- **题目**：上下各空一行\n- **一级标题**：上下各空一行\n- **二级/三级标题**：上下不空行\n- **图片**：上方空一行，图题下方空一行\n- **表格**：表题上方空一行，表格下方空一行\n\n### 题目（第一个 `#`）\n\n三号黑体(16pt)、居中、上下各空一行、**不设 outline level**。\n\n```python\nadd_empty(doc)\np = doc.add_paragraph()\np.alignment = WD_ALIGN_PARAGRAPH.CENTER\n# 题目不设 outline_level\nrun = p.add_run(title_text)\nset_cn_font(run, '黑体', size_pt=16)\nadd_empty(doc)\n```\n\n### 无标题文档\n\n当输入 Markdown 没有 `#` 标题时：\n- 跳过标题页，文档从第一个内容节点开始排版\n- 页眉右侧显示「未命名文档」代替标题\n- 页眉左侧「xxxxx」保持不变\n- 输出文件名：文件输入使用输入文件名（如 `paper.md` → `paper.docx`），`--text` 模式使用「未命名文档.docx」\n\n### 一级标题（后续 `#`）\n\n三号黑体(16pt)、居中、上下各空一行、outline_level=1、**前加分页符**。\n\n\n```python\nadd_empty(doc)\np = doc.add_paragraph()\np.alignment = WD_ALIGN_PARAGRAPH.CENTER\nset_outline(p, 1)\n# 分页符\npPr = p._element.get_or_add_pPr()\npPr.append(OxmlElement('w:pageBreakBefore'))\nrun = p.add_run(text)\nset_cn_font(run, '黑体', size_pt=16)\nadd_empty(doc)\n```\n\n### 二级标题（`##`）\n\n四号黑体(14pt)、**不加粗**、顶格(无缩进)、outline_level=2。上下不空行。\n\n```python\np = doc.add_paragraph()\nset_outline(p, 2)\np.paragraph_format.first_line_indent = Pt(0)\nrun = p.add_run(text)\nset_cn_font(run, '黑体', size_pt=14, bold=False)\n```\n\n### 三级标题（`###`）\n\n小四宋体(12pt)、**不加粗**、首行缩进Pt(21)(=2个中文字)、outline_level=3。\n\n```python\np = doc.add_paragraph()\nset_outline(p, 3)\np.paragraph_format.first_line_indent = Pt(21)\nrun = p.add_run(text)\nset_cn_font(run, '宋体', size_pt=12, bold=False)\n```\n\n### 四级及以上标题（`####`、`#####`、`######`）\n\n格式与正文相同（五号宋体 10.5pt、首行缩进Pt(21)、1.3倍行距），但设置对应的 outline_level（4/5/6）。上下不空行。\n\n```python\np = doc.add_paragraph()\nset_outline(p, level)  # 4、5 或 6，按实际标题层级\np.paragraph_format.first_line_indent = Pt(21)\np.paragraph_format.line_spacing = 1.3\np.paragraph_format.space_before = Pt(0)\np.paragraph_format.space_after = Pt(0)\nrun = p.add_run(text)\nset_cn_font(run, '宋体', size_pt=10.5, bold=False)\n```\n\n### 正文段落\n\n五号(10.5pt)宋体/TNR、首行缩进Pt(21)、1.3倍行距、段前段后0磅。\n\n```python\np = doc.add_paragraph()\np.paragraph_format.first_line_indent = Pt(21)\np.paragraph_format.line_spacing = 1.3\np.paragraph_format.space_before = Pt(0)\np.paragraph_format.space_after = Pt(0)\nrun = p.add_run(text)\nset_cn_font(run, '宋体', size_pt=10.5)\n```\n\n### 图片\n\n下载嵌入(不压缩)、等比缩放(8-12cm规则)、居中、上方空一行。\n\n```python\nimport requests\nfrom PIL import Image\n\ndef dl_image(url):\n    h = {'User-Agent': 'Mozilla/5.0 (compatible; mddoc/1.0)'}\n    r = requests.get(url, headers=h, timeout=30); r.raise_for_status()\n    return r.content  # bytes, 可保存为临时文件\n\ndef img_width(path):\n    img = Image.open(path)\n    dpi = img.info.get('dpi', (96, 96))\n    dx = dpi[0] if dpi and dpi[0] > 0 else 96\n    w_cm = img.width / dx * 2.54\n    if   w_cm > 12: tw = 12.0\n    elif w_cm < 8:  tw = 8.0\n    else:           tw = w_cm\n    return Cm(tw)\n\nadd_empty(doc)\np = doc.add_paragraph()\np.alignment = WD_ALIGN_PARAGRAPH.CENTER\np.add_run().add_picture(img_path, width=img_width(img_path))\n```\n\n### 图题\n\n图片下方(不空行)、小五(9pt)宋体加粗居中、逐章编号。有章标题时格式 `图<章>-<序号> <alt>`，无章标题时格式 `图<序号> <alt>`。若 alt 为空，自动使用图片文件名（不含扩展名）作为图题。\n\n```python\np = doc.add_paragraph()\np.alignment = WD_ALIGN_PARAGRAPH.CENTER\nrun = p.add_run(f'图{ch}-{idx} {alt_text}')\nset_cn_font(run, '宋体', size_pt=9, bold=True)\nadd_empty(doc)  # 图题下方空一行\n```\n\n### 表格 + 表题\n\n**三线表**(顶线1.5pt/表头底线0.75pt/底线1.5pt粗，无竖线)。表题在上方(不空行)、五号(10.5pt)宋体加粗居中。有章标题时格式`表<章>-<序号> <描述>`，无章标题时格式`表<序号> <描述>`。\n\n```python\n# 表题\nadd_empty(doc)\np = doc.add_paragraph(); p.alignment = WD_ALIGN_PARAGRAPH.CENTER\nrun = p.add_run(f'表{ch}-{idx} {caption}')\nset_cn_font(run, '宋体', size_pt=10.5, bold=True)\n\n# 表格\ntb = doc.add_table(rows=nrows, cols=ncols)\ntb.alignment = WD_ALIGN_PARAGRAPH.CENTER\n\n# 三线表边框\nPr = tb._tbl.tblPr or OxmlElement('w:tblPr')\nB = OxmlElement('w:tblBorders')\nfor tag, sz in [('top','12'),('bottom','12')]:\n    e = OxmlElement(f'w:{tag}'); e.set(qn('w:val'),'single')\n    e.set(qn('w:sz'),sz); e.set(qn('w:space'),'0'); e.set(qn('w:color'),'000000')\n    B.append(e)\nfor tag in ('left','right','insideH','insideV'):\n    e = OxmlElement(f'w:{tag}'); e.set(qn('w:val'),'none')\n    e.set(qn('w:sz'),'0'); e.set(qn('w:space'),'0'); e.set(qn('w:color'),'auto')\n    B.append(e)\nPr.append(B)\n# 表头行每格底部加细线 0.75pt（cell级别，不影响数据行）\nfor cell in tb.rows[0].cells:\n    tcPr = cell._tc.get_or_add_tcPr()\n    tcB = OxmlElement('w:tcBorders')\n    btm = OxmlElement('w:bottom')\n    btm.set(qn('w:val'),'single'); btm.set(qn('w:sz'),'6')\n    btm.set(qn('w:space'),'0'); btm.set(qn('w:color'),'000000')\n    tcB.append(btm); tcPr.append(tcB)\n\n# 表头行 — 居中、9pt、无缩进\nfor j, txt in enumerate(header):\n    c = tb.rows[0].cells[j]; c.paragraphs[0].clear()\n    c.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER\n    run = c.paragraphs[0].add_run(txt)\n    set_cn_font(run, '宋体', size_pt=9)\n    c.paragraphs[0].paragraph_format.first_line_indent = Pt(0)\n\n# 数据行 — 左对齐、9pt、无缩进\nfor i, row in enumerate(data):\n    for j, txt in enumerate(row):\n        c = tb.rows[i+1].cells[j]; c.paragraphs[0].clear()\n        c.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.LEFT\n        run = c.paragraphs[0].add_run(txt)\n        set_cn_font(run, '宋体', size_pt=9)\n        c.paragraphs[0].paragraph_format.first_line_indent = Pt(0)\n\nadd_empty(doc)  # 表格下方空一行\n```\n\n### 页眉\n\n左顶格\"xxxxx\"、右顶格文档题目、小五(9pt)黑体。\n\n```python\nsec = doc.sections[0]; hdr = sec.header\nhdr.is_linked_to_previous = False\nr = hdr.paragraphs[0].add_run('xxxxx')\nset_cn_font(r, '黑体', size_pt=9)\np2 = hdr.add_paragraph(); p2.alignment = WD_ALIGN_PARAGRAPH.RIGHT\nr2 = p2.add_run(title_text)\nset_cn_font(r2, '黑体', size_pt=9)\n```\n\n### 列表\n\n使用 Word 原生编号/项目符号（`w:numPr` XML），支持富文本 inline 和多级嵌套。列表段落遵守正文格式（首行缩进 Pt(21)、1.3 倍行距）。\n\n```python\n# 有序列表 — numId=50, 多级格式: 1. → a) → i.\n# 无序列表 — numId=51, 多级符号: • → ◦ → ▪\nfor item in list_node['children']:\n    p = doc.add_paragraph()\n    p.paragraph_format.first_line_indent = Pt(21)  # 同正文\n    p.paragraph_format.line_spacing = 1.3\n    # 设置 Word 原生编号\n    numPr = OxmlElement('w:numPr')\n    ilvl = OxmlElement('w:ilvl'); ilvl.set(qn('w:val'), str(depth))\n    numId = OxmlElement('w:numId'); numId.set(qn('w:val'), '50')  # 50=有序, 51=无序\n    numPr.append(ilvl); numPr.append(numId)\n    p._element.get_or_add_pPr().append(numPr)\n    # walk_inline 渲染富文本（支持 **加粗**、*斜体*、$公式$）\n    walk_inline(p, item['children'][0]['children'], '宋体', size_pt=10.5)\n    # 嵌套子列表：递归调用 render_list(doc, child, depth+1)\n\n# 列表编号定义（生成文档时需在 numbering.xml 中注入抽象编号）\n_ensure_list_numbering_defs(doc)  # 定义 numId=50(有序) 和 numId=51(无序)，各 3 级\n```\n\n列表编号自动跨页连续（同一 `numId` 的段落由 Word 维护编号序列）。\n\n### 内联格式（加粗、斜体、行内公式等）\n\n段落内使用 `walk_inline()` 递归遍历 mistune inline AST，生成带格式的 runs 和 OMML 元素：\n\n```python\ndef walk_inline(paragraph, children, base_cn='宋体', base_en='Times New Roman', base_size=10.5):\n    for child in children:\n        ct = child['type']\n        if ct == 'text':\n            if child.get('raw', ''):\n                run = paragraph.add_run(child['raw'])\n                set_cn_font(run, base_cn, en_font=base_en, size_pt=base_size)\n        elif ct == 'strong':  # **加粗**\n            # 递归收集 runs，设置 bold=True\n            tmp = _make_temp_para()\n            walk_inline(tmp, child['children'])\n            for r in tmp.runs:\n                nr = paragraph.add_run(r.text)\n                set_cn_font(nr, base_cn, en_font=base_en, size_pt=base_size, bold=True)\n                if r.font.italic: nr.font.italic = True  # 嵌套斜体\n        elif ct == 'emphasis':  # *斜体*\n            tmp = _make_temp_para()\n            walk_inline(tmp, child['children'])\n            for r in tmp.runs:\n                nr = paragraph.add_run(r.text)\n                set_cn_font(nr, base_cn, en_font=base_en, size_pt=base_size, bold=r.font.bold)\n                nr.font.italic = True\n        elif ct == 'inline_math':  # $...$\n            omml = latex_to_omml(child['raw'], display=False)\n            paragraph._element.append(omml)\n```\n\n`***加粗斜体***` → AST: `emphasis > strong` → 递归自然处理为 bold+italic。\n\n### 标题样式清理\n\n生成前覆盖 Word 内置 Heading 1-6 样式，防止默认蓝色/Cambria/加粗干扰：\n\n```python\ndef override_builtin_heading_styles(doc):\n    specs = {\n        'Heading 1': ('黑体', 16, True, WD_ALIGN_PARAGRAPH.CENTER),\n        'Heading 2': ('黑体', 14, False, WD_ALIGN_PARAGRAPH.LEFT),\n        'Heading 3': ('宋体', 12, False, WD_ALIGN_PARAGRAPH.LEFT),\n        'Heading 4': ('宋体', 10.5, False, WD_ALIGN_PARAGRAPH.LEFT),\n        'Heading 5': ('宋体', 10.5, False, WD_ALIGN_PARAGRAPH.LEFT),\n        'Heading 6': ('宋体', 10.5, False, WD_ALIGN_PARAGRAPH.LEFT),\n    }\n    for name, (cn_font, size_pt, bold, align) in specs.items():\n        style = doc.styles[name]\n        style.font.size = Pt(size_pt)\n        style.font.bold = bold\n        style.font.color.rgb = None  # 黑色\n        style.font.italic = False\n        style.font.underline = False\n        rPr = style.element.get_or_add_rPr()\n        rFonts = rPr.find(qn('w:rFonts'))\n        if rFonts is None:\n            rFonts = OxmlElement('w:rFonts'); rPr.insert(0, rFonts)\n        rFonts.set(qn('w:eastAsia'), cn_font)\n```\n\n调用位置：`generate_docx()` 中 `doc = Document()` 后立即执行。\n\n### 代码块\n\nTimes New Roman 字体、五号、无首行缩进、灰色背景(#D9D9D9)、上下各空一行。\n\n```python\nadd_empty(doc)\np = doc.add_paragraph()\nset_first_line_indent_chars(p, 0)  # 代码块无首行缩进\n# 灰色背景\npPr = p._element.get_or_add_pPr()\nshd = OxmlElement('w:shd')\nshd.set(qn('w:val'), 'clear')\nshd.set(qn('w:color'), 'auto')\nshd.set(qn('w:fill'), 'D9D9D9')\npPr.append(shd)\nrun = p.add_run(code)\nset_cn_font(run, '宋体', en_name='Times New Roman', size_pt=10.5)\nadd_empty(doc)\n```\n\n### 行内公式（`$...$`）\n\n嵌于段落中，转换为 OMML（Office Math Markup Language）格式，WPS/Word 可直接渲染。\n公式在段落中作为 `<m:oMath>` 元素插入，与文字 run 同级。\n\n```python\n# 行内公式通过 split_inline_math() 拆分为 segments\n# text segment → 普通 run，math segment → latex_to_omml() → m:oMath 元素\np = doc.add_paragraph()\np.paragraph_format.first_line_indent = Pt(21)\np.paragraph_format.line_spacing = 1.3\nfor seg in segments:\n    if seg['type'] == 'text':\n        if seg['content']:\n            run = p.add_run(seg['content'])\n            set_cn_font(run, '宋体', size_pt=10.5)\n    else:  # math — 转换为 OMML 并插入段落 XML\n        omml = latex_to_omml(seg['content'], display=False)\n        p._element.append(omml)\n```\n\n### 行间公式（`$$...$$`）\n\n独立成行，上下各空一行。公式通过 OMML 居中渲染，编号右对齐。编号格式同图/表：`(章-序号)`，逐章编号。编号括号用五号宋体，数字用五号 Times New Roman。\n\n布局方式：段落设置居中和右对齐 tab stop，OMML `<m:oMath>` 元素位于两个 tab 之间，实现公式居中、编号右对齐。\n\n```python\nadd_empty(doc)  # 上方空一行\np = doc.add_paragraph()\n\n# 设置 tab stops：居中和右对齐\n# 左边距3cm右边距2cm → 可用宽度16cm → 中心8cm(4536twips), 右边16cm(9072twips)\npPr = p._element.get_or_add_pPr()\ntabs = OxmlElement('w:tabs')\nct = OxmlElement('w:tab'); ct.set(qn('w:val'), 'center'); ct.set(qn('w:pos'), '4536')\nrt = OxmlElement('w:tab'); rt.set(qn('w:val'), 'right'); rt.set(qn('w:pos'), '9072')\ntabs.append(ct); tabs.append(rt)\npPr.append(tabs)\n\n# tab → 公式 OMML 居中\nrun_t1 = p.add_run()\nrun_t1._r.append(OxmlElement('w:tab'))\nomml = latex_to_omml(formula_text, display=False)\np._element.append(omml)\n\n# tab → 编号右对齐：(章-序号)\nrun_t2 = p.add_run()\nrun_t2._r.append(OxmlElement('w:tab'))\nrun_lp = p.add_run('(')\nset_cn_font(run_lp, '宋体', en_name='宋体', size_pt=10.5)\nrun_num = p.add_run(f'{ch}-{eq_num}')\nset_cn_font(run_num, '宋体', en_name='Times New Roman', size_pt=10.5)\nrun_rp = p.add_run(')')\nset_cn_font(run_rp, '宋体', en_name='宋体', size_pt=10.5)\n\nadd_empty(doc)  # 下方空一行\n```\n\n### LaTeX → OMML 转换\n\n内置 `latex_to_omml()` 函数将 LaTeX 数学公式转换为 OMML XML，支持以下构造：\n\n- 上下标：`a^b`、`a_b`、`a_b^c`\n- 分数：`\\frac{a}{b}`\n- 根式：`\\sqrt{x}`、`\\sqrt[n]{x}`\n- 希腊字母：`\\alpha`、`\\beta`、`\\Gamma` 等\n- 大运算符：`\\sum`、`\\prod`、`\\int`（含上下限）\n- 函数名：`\\sin`、`\\cos`、`\\log`、`\\lim` 等\n- 重音：`\\hat`、`\\bar`、`\\vec`、`\\tilde` 等\n- 符号：`\\infty`、`\\cdot`、`\\times`、`\\partial`、`\\nabla` 等\n- 定界符：`\\left(...\\right)`、`\\left[...\\right]`\n- 文本：`\\text{...}`\n\n### 页码\n\n从第一章（第一个一级标题所在页）开始编页码，格式 `第×页  共×页`，页脚边距 1cm。\n\n```python\nfrom docx.oxml import OxmlElement\nfrom docx.oxml.ns import qn\nfrom docx.shared import Cm\n\nsection = doc.sections[0]\nsection.footer_distance = Cm(1.1)  # 页脚边距\n\nfooter = section.footer\nfooter.is_linked_to_previous = False\nfp = footer.paragraphs[0]\nfp.alignment = WD_ALIGN_PARAGRAPH.CENTER\n\n# \"第\" 字\nrun1 = fp.add_run('第')\nset_cn_font(run1, '宋体', size_pt=10.5)\n# 页码字段\nrun_page = fp.add_run()\nfldChar1 = OxmlElement('w:fldChar'); fldChar1.set(qn('w:fldCharType'), 'begin')\nrun_page._r.append(fldChar1)\ninstrText = OxmlElement('w:instrText'); instrText.set(qn('xml:space'), 'preserve')\ninstrText.text = ' PAGE '\nrun_page._r.append(instrText)\nfldChar2 = OxmlElement('w:fldChar'); fldChar2.set(qn('w:fldCharType'), 'end')\nrun_page._r.append(fldChar2)\n# \"页  共\"\nrun2 = fp.add_run('页  共')\nset_cn_font(run2, '宋体', size_pt=10.5)\n# 总页数字段\nrun_total = fp.add_run()\nfldChar3 = OxmlElement('w:fldChar'); fldChar3.set(qn('w:fldCharType'), 'begin')\nrun_total._r.append(fldChar3)\ninstrText2 = OxmlElement('w:instrText'); instrText2.set(qn('xml:space'), 'preserve')\ninstrText2.text = ' NUMPAGES '\nrun_total._r.append(instrText2)\nfldChar4 = OxmlElement('w:fldChar'); fldChar4.set(qn('w:fldCharType'), 'end')\nrun_total._r.append(fldChar4)\n# \"页\"\nrun3 = fp.add_run('页')\nset_cn_font(run3, '宋体', size_pt=10.5)\n```\n\n> 注意：页码从第一章开始计数需在第一个一级标题处插入分节符并重置页码。简单场景可统一从第1页开始。\n\n### 跨页表格（续表）\n\n表头行设为重复标题行，跨页自动重复。续表在右上方标\"续表<编号>\"。\n\n```python\n# 表头行设为重复标题行（跨页自动出现）\ntblHeader = OxmlElement('w:tblHeader')\ntrPr = table.rows[0]._tr.get_or_add_trPr()\ntrPr.append(tblHeader)\n\n# 对于确实跨页的大表格，在分页处手动加\"续表\"标记：\n# （python-docx无法检测分页位置，建议生成后人工检查）\n# 续表右对齐段落示例：\np_cont = doc.add_paragraph()\np_cont.alignment = WD_ALIGN_PARAGRAPH.RIGHT\nrun_cont = p_cont.add_run(f'续表{tab_label}')\nset_cn_font(run_cont, '宋体', size_pt=10.5)\n```\n\n---\n\n## 生成后自检清单\n\n- [ ] 题目：16pt黑体、居中、无outline、上下各空一行\n- [ ] 无标题文档：跳过标题页、页眉显示「未命名文档」\n- [ ] 一级标题：16pt黑体、outline_level=1、前有分页符、上下各空一行\n- [ ] 二级标题：14pt黑体、顶格、outline_level=2、不加粗、**上下不空行**\n- [ ] 三级标题：12pt宋体、首行缩进Pt(21)、outline_level=3、不加粗、**上下不空行**\n- [ ] 四级及以上标题：10.5pt宋体同正文、首行缩进Pt(21)、outline_level=对应层级(4/5/6)、**上下不空行**\n- [ ] 正文：10.5pt、首行缩进Pt(21)、1.3倍行距、**段落间不空行**\n- [ ] 图片：嵌入、等比缩放8-12cm、居中、上下各空一行\n- [ ] 图题：9pt宋体加粗居中、图片下方\n- [ ] 表格：三线表(顶/底粗、表头格底线细、数据行无线)、居中\n- [ ] 表头行：居中、9pt、无缩进、tblHeader重复\n- [ ] 表题：10.5pt宋体加粗居中、表格上方\n- [ ] 列表：有序用 Word 原生编号、无序用 Word 原生黑圆点、悬挂缩进、支持富文本 inline\n- [ ] 代码块：Times New Roman、无缩进、灰色背景#D9D9D9、上下各空一行\n- [ ] 加粗/斜体/加粗斜体：`**文本**` bold、`*文本*` italic、`***文本***` bold+italic\n- [ ] 分隔线：`---`（3+ 连续 `-`） → 分页符\n- [ ] 页眉：左\"xxxxx\"右题目、9pt黑体\n- [ ] 行内公式：$...$ 嵌于段落、OMML格式、WPS/Word可渲染\n- [ ] 行间公式：$$...$$ OMML居中、上下各空一行、编号(章-序号)右对齐、括号宋体数字TNR\n- [ ] 页码：\"第×页 共×页\"、页脚边距1cm\n- [ ] 标题样式：Heading 1-6 已覆盖为学术格式（黑体/宋体、黑色）\n- [ ] 分隔线：`---` → 分页符\n- [ ] 续表：跨页表头重复、\"续表xx\"右上标注\n- [ ] 页边距：左3cm 右2cm 上2cm 下2cm\n- [ ] 全部黑色、无额外参数\n\n## 注意事项\n\n- **解析器**：Markdown 解析使用 mistune 3.x（`renderer='ast'`），配合 `table` 和 `math` 插件。所有 block/inline 格式由 mistune AST 提供，不再手写解析器\n- **第一个 `#` 是题目**（不设 outline），后续 `#` 是一级标题（outline_level=1）；若无 `#` 标题仍可正常生成文档\n- **图片尺寸用 `Cm()`，不手算 EMU** — `add_picture(width=Cm(x))` 自动转换\n- **图片下载必设 User-Agent** — 否则 CDN/Wikipedia 返回 400\n- **图题编号自动生成** — alt text 作为描述文字，图/表编号独立逐章编序\n- **表题识别** — 表格前含\"表\"字的段落自动作为表题（lookahead 跳过空行），不渲染为独立段落\n- **outline_level 用 `set_outline()` 设置** — `paragraph_format.outline_level` 在部分python-docx版本不生效，统一用XML方式写入；读取时也从XML读取\n- **公式编号自动生成** — 图/表/公式独立逐章编序，编号格式统一为 `章-序号`\n- **不添加**：目录页、背景色\n- **单位**：字体用 pt、尺寸用 cm\n\nFile v0.1.7:_meta.json\n\n{\n  \"ownerId\": \"kn74sxjtkhk771hzvyhh8q6hp18a69xe\",\n  \"slug\": \"mddoc\",\n  \"version\": \"0.1.7\",\n  \"publishedAt\": 1785746114417\n}\n\nFile v0.1.7:evals/test-latex-coverage.md\n\n# LaTeX 数学公式覆盖测试（IHKYoung 手册 + 完整补全）\n\n本文件测试所有已实现的 LaTeX 数学公式语法。\n\n---\n\n## 矩阵环境\n\n### bmatrix（方括号）\n\n$$\n\\begin{bmatrix} a & b \\\\ c & d \\end{bmatrix}\n$$\n\n### pmatrix（圆括号）\n\n$$\n\\begin{pmatrix} x_{11} & x_{12} \\\\ x_{21} & x_{22} \\end{pmatrix}\n$$\n\n### vmatrix（单竖线行列式）\n\n$$\n\\begin{vmatrix} a & b \\\\ c & d \\end{vmatrix}\n$$\n\n### Vmatrix（双竖线范数）\n\n$$\n\\begin{Vmatrix} a & b \\\\ c & d \\end{Vmatrix}\n$$\n\n### matrix（无括号）\n\n$$\n\\begin{matrix} 1 & 0 \\\\ 0 & 1 \\end{matrix}\n$$\n\n---\n\n## cases 环境（分段函数）\n\n$$\nf(x) = \\begin{cases} 0 & x < 0 \\\\ x^2 & 0 \\leq x < 1 \\\\ 1 & x \\geq 1 \\end{cases}\n$$\n\n---\n\n## align 环境（多行对齐）\n\n$$\n\\begin{align} x + y &= 2 \\\\ x - y &= 0 \\end{align}\n$$\n\n---\n\n## 字体命令\n\n### 粗体\n\n行内: $\\mathbf{A} = \\mathbf{B} + \\mathbf{C}$\n\n### 斜体\n\n行内: $\\mathit{variable}$\n\n### 手写体（花体）\n\n行内: $\\mathcal{L}$ $\\mathcal{A}$\n\n### 黑板粗体\n\n行内: $\\mathbb{R}$ $\\mathbb{N}$ $\\mathbb{Z}$ $\\mathbb{C}$\n\n### 正体（罗马体）\n\n行内: $\\mathrm{Var}(X)$\n\n### 等宽体\n\n行内: $\\mathtt{code}$\n\n### 粗体符号\n\n$\\boldsymbol{\\alpha} + \\bm{\\beta} = \\mathbb{E}[X]$\n\n---\n\n## 希腊字母\n\n### 小写\n\n$\\alpha$ $\\beta$ $\\gamma$ $\\delta$ $\\epsilon$ $\\varepsilon$ $\\zeta$ $\\eta$ $\\theta$ $\\vartheta$\n\n$\\iota$ $\\kappa$ $\\lambda$ $\\mu$ $\\nu$ $\\xi$ $\\pi$ $\\rho$ $\\sigma$ $\\tau$ $\\upsilon$ $\\phi$ $\\varphi$ $\\chi$ $\\psi$ $\\omega$\n\n### 大写\n\n$\\Gamma$ $\\Delta$ $\\Theta$ $\\Lambda$ $\\Xi$ $\\Pi$ $\\Sigma$ $\\Upsilon$ $\\Phi$ $\\Psi$ $\\Omega$\n\n### 变体\n\n$\\varpi$ $\\varrho$ $\\varsigma$\n\n---\n\n## 二元运算符\n\n$+$ $-$ $\\times$ $\\div$ $\\cdot$ $\\oplus$ $\\ominus$ $\\otimes$ $\\oslash$ $\\odot$ $\\star$ $\\circ$ $\\bullet$ $\\pm$ $\\mp$\n\n---\n\n## 关系符号\n\n$=$ $\\neq$ $\\approx$ $\\equiv$ $<$ $>$ $\\leq$ $\\geq$ $\\ge$ $\\le$ $\\ne$\n\n$\\ll$ $\\gg$ $\\prec$ $\\succ$ $\\preceq$ $\\succeq$ $\\sim$ $\\nsim$ $\\simeq$ $\\asymp$ $\\propto$\n\n---\n\n## 逻辑符号\n\n$\\wedge$ $\\vee$ $\\neg$ $\\Rightarrow$ $\\Leftrightarrow$ $\\forall$ $\\exists$ $\\nexists$ $\\top$ $\\bot$\n\n---\n\n## 集合符号\n\n$\\emptyset$ $\\in$ $\\notin$ $\\subseteq$ $\\subset$ $\\nsubseteq$ $\\supset$ $\\supseteq$ $\\nsupseteq$ $\\cup$ $\\cap$ $\\setminus$\n\n---\n\n## 箭头\n\n$\\to$ $\\gets$ $\\leftarrow$ $\\rightarrow$ $\\Rightarrow$ $\\Leftarrow$ $\\leftrightarrow$ $\\Leftrightarrow$\n\n$\\longrightarrow$ $\\longleftarrow$ $\\mapsto$ $\\longmapsto$ $\\uparrow$ $\\downarrow$ $\\updownarrow$\n\n$\\Uparrow$ $\\Downarrow$ $\\Updownarrow$\n\n---\n\n## 分数与根式\n\n### 分数\n\n$\\frac{a}{b}$ $\\dfrac{1}{2}$ $\\tfrac{1}{3}$\n\n$$\n\\frac{d}{dx} f(x) \\qquad \\frac{\\partial f}{\\partial x}\n$$\n\n### 根式\n\n$\\sqrt{x}$ $\\sqrt[n]{x}$\n\n---\n\n## 指数与对数\n\n$a^b$ $e^x$ $\\log x$ $\\ln x$ $\\log_a b$ $\\exp(x)$\n\n---\n\n## 极限\n\n$\\lim_{x \\to a} f(x)$ $\\lim_{x \\to \\infty} f(x)$\n\n---\n\n## 积分与求和\n\n$\\int f(x)dx$ $\\int_{a}^{b} f(x)dx$ $\\iint$ $\\iiint$\n\n$\\sum_{i=1}^{n} x_i$ $\\prod_{i=1}^{n} x_i$\n\n---\n\n## 重音符号\n\n$\\hat{x}$ $\\bar{x}$ $\\vec{v}$ $\\dot{x}$ $\\ddot{x}$ $\\tilde{x}$\n\n$$\n\\overrightarrow{AB} = \\overleftarrow{BA}\n$$\n\n---\n\n## 定界符\n\n$$\n\\left( \\frac{a + b}{c} \\right) \\qquad \\left[ \\frac{x}{y} \\right]\n$$\n\n---\n\n## 函数名\n\n$\\sin$ $\\cos$ $\\tan$ $\\cot$ $\\sec$ $\\csc$\n\n$\\arcsin$ $\\arccos$ $\\arctan$\n\n$\\sinh$ $\\cosh$ $\\tanh$ $\\coth$\n\n$\\log$ $\\lg$ $\\ln$ $\\exp$\n\n$\\lim$ $\\max$ $\\min$ $\\sup$ $\\inf$\n\n$\\det$ $\\dim$ $\\ker$ $\\gcd$\n\n---\n\n## 文本\n\n$\\text{当且仅当}$ $x \\text{ is even}$\n\n---\n\n## 间距\n\n$a\\,b$ $a\\quad b$ $a\\qquad b$\n\n---\n\n## 颜色\n\n$\\textcolor{red}{红色文字}$ $\\textcolor{blue}{蓝色文字}$\n\n---\n\n## 转义字符\n\n$\\#$ $\\$ $ \\% $ \\& $ \\_ $ \\{ $ \\} $ \\backslash $\n\n---\n\n## 综合复杂公式\n\n$$\n\\frac{1}{\\sqrt{2\\pi\\sigma^2}} \\exp\\left(-\\frac{(x-\\mu)^2}{2\\sigma^2}\\right)\n$$\n\n$$\nA\\mathbf{v} = \\lambda \\mathbf{v}\n$$\n\n$$\n\\mathbb{E}[X] = \\sum_{x} x\\,P(X=x)\n$$\n\n$$\n\\mathrm{Var}(X) = \\mathbb{E}[(X - \\mathbb{E}[X])^2]\n$$\n\n$$\nD_{KL}(P \\parallel Q) = \\sum_x P(x) \\log \\frac{P(x)}{Q(x)}\n$$\n\n$$\n\\frac{1}{N} \\sum_{i=1}^{N} (y_i - (w^T x_i + b))^2\n$$\n\nFile v0.1.7:evals/test-sample.md\n\n# 第一章 基于深度学习的图像识别研究\n\n## 1.1 研究背景\n\n近年来，深度学习技术在计算机视觉领域取得了突破性进展。卷积神经网络（Convolutional Neural Network, CNN）作为深度学习的核心架构之一，在图像分类、目标检测、语义分割等任务中表现出色。\n\n图像识别技术已广泛应用于安防监控、自动驾驶、医疗诊断等领域。传统的图像识别方法依赖手工设计的特征提取器，如 SIFT、HOG 等，这些方法在复杂场景下的泛化能力有限。\n\n### 1.2.1 深度学习发展历程\n\n深度学习的概念可追溯至20世纪40年代的神经网络研究。经历了多次起伏后，2012年 AlexNet 在 ImageNet 竞赛中的突破性表现标志着深度学习时代的正式到来。\n\n此后，VGGNet、GoogLeNet、ResNet 等架构相继提出，不断刷新图像识别的准确率记录。其中 ResNet 引入的残差连接解决了深层网络的梯度消失问题。\n\n## 1.2 研究现状\n\n目前主流的图像识别方法可归纳为三类：基于 CNN 的方法、基于 Transformer 的方法以及混合架构方法。\n\n![ResNet 网络架构示意图](https://www.python.org/static/img/python-logo.png)\n\n表 主流图像识别模型性能对比\n\n| 模型名称 | Top-1 准确率 | 参数量 | 发布时间 |\n|----------|-------------|--------|---------|\n| ResNet-50 | 76.2% | 25.6M | 2015 |\n| EfficientNet-B4 | 83.0% | 19.3M | 2019 |\n| ViT-B/16 | 84.1% | 86.0M | 2020 |\n| ConvNeXt-T | 84.9% | 28.6M | 2022 |\n\n从上表可以看出，模型性能持续提升的同时，参数效率也在不断优化。EfficientNet 系列通过神经架构搜索实现了参数效率与精度的良好平衡。\n\n### 1.2.1 数据增强技术\n\n数据增强是提升模型泛化能力的重要手段。常用方法包括：\n\n- 随机裁剪与缩放\n- 水平翻转与旋转\n- 色彩抖动与光照变换\n- CutOut 与 MixUp 等高级增强策略\n\n研究表明，合理的数据增强策略可以有效缓解过拟合问题，尤其在训练数据有限的场景下。\n\n## 1.3 理论基础\n\n卷积操作的数学表达为 $y = W * x + b$，其中 $W$ 为卷积核权重，$b$ 为偏置项。\n\n损失函数采用交叉熵损失：\n\n$$\nL(y, \\hat{y}) = -\\sum_{i=1}^{C} y_i \\log(\\hat{y}_i)\n$$\n\n梯度下降的参数更新规则为 $w_{t+1} = w_t - \\eta \\nabla L(w_t)$，其中 $\\eta$ 表示学习率。\n\n## 1.4 本文主要工作\n\n本文旨在构建一个高效准确的图像识别系统，主要贡献包括：\n\n本文的代码实现基于 PyTorch 框架，训练过程如下：\n\n```\nimport torch\nmodel = torch.hub.load('pytorch/vision', 'resnet50', pretrained=True)\nmodel.fc = torch.nn.Linear(2048, num_classes)\n```\n\n后续章节将详细介绍模型设计、训练策略与实验结果。\n\nFile v0.1.7:skill-card.md\n\n## Description: <br>\nmddoc converts Markdown files or pasted Markdown text into academically formatted Word (.docx) documents. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[trisia](https://clawhub.ai/user/trisia) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers, students, and technical writers use this skill to convert Markdown content into Word documents with academic formatting, including headings, tables, images, headers, page numbers, and LaTeX-style math where supported. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The converter may fetch external or local images referenced in Markdown during conversion. <br>\nMitigation: Review Markdown for external image URLs and absolute local image paths before conversion, and avoid untrusted Markdown in sensitive environments unless image fetching is disabled or reviewed. <br>\n\n\n## Reference(s): <br>\n- [ClawHub skill page](https://clawhub.ai/trisia/skills/mddoc) <br>\n- [Publisher profile](https://clawhub.ai/user/trisia) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [Files, Shell commands, Guidance, Code] <br>\n**Output Format:** [Markdown guidance with shell commands that produce .docx files] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Generated DOCX output may embed images referenced by Markdown.] <br>\n\n## Skill Version(s): <br>\n0.1.7 (source: server release metadata) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nFile v0.1.7:evals/evals.json\n\n{\n  \"skill_name\": \"mddoc\",\n  \"evals\": [\n    {\n      \"id\": 1,\n      \"prompt\": \"帮我把这份 Markdown 文件转成 docx 格式的 Word 文档\",\n      \"expected_output\": \"生成 .docx 文件，包含正确的标题格式、正文格式、图片和表格，页眉正确设置\",\n      \"files\": [\"evals/test-sample.md\"]\n    },\n    {\n      \"id\": 2,\n      \"prompt\": \"将下面这段 markdown 转成格式化的 Word 文档，保存到当前目录：\\n\\n# 实验报告\\n\\n## 实验目的\\n\\n本实验旨在验证深度学习模型在小样本数据集上的泛化性能。通过对比实验分析不同正则化策略的效果。\\n\\n## 实验方法\\n\\n### 数据集准备\\n\\n实验采用 CIFAR-10 数据集，随机选取每类 100 张图片作为训练集。测试集保持原始大小。\\n\\n![实验流程图](https://upload.wikimedia.org/wikipedia/commons/thumb/2/2d/Tensor_visualization.svg/400px-Tensor_visualization.svg.png)\\n\\n表 超参数配置\\n\\n| 参数 | 取值 |\\n|------|------|\\n| 学习率 | 0.001 |\\n| 批量大小 | 32 |\\n| 训练轮次 | 100 |\\n\\n### 评估指标\\n\\n采用 Top-1 准确率和 F1 分数作为评估指标。\",\n      \"expected_output\": \"在当前目录生成 实验报告.docx，包含题目、各级标题、正文、图片、表格的正确格式\",\n      \"files\": []\n    },\n    {\n      \"id\": 3,\n      \"prompt\": \"/mddoc 把这个转成word @evals/test-sample.md\",\n      \"expected_output\": \"在 evals/ 目录生成第一章 基于深度学习的图像识别研究.docx，格式完全符合学术规范\",\n      \"files\": [\"evals/test-sample.md\"]\n    }\n  ]\n}\n\nArchive v0.1.6: 7 files, 31175 bytes\n\nFiles: evals/evals.json (1585b), evals/test-latex-coverage.md (4031b), evals/test-sample.md (2789b), scripts/md2docx.py (66964b), skill-card.md (1804b), SKILL.md (19452b), _meta.json (124b)\n\nFile v0.1.6:SKILL.md\n\n---\nname: mddoc\nversion: 1.0.6\ndescription: 将 Markdown 内容转换为特定学术格式的 Word 文档 (.docx)。当用户想要将 Markdown 文件、粘贴的 Markdown 文本转换为格式化的 docx 文档时使用，特别是学术论文、技术报告、毕业论文等需要严格格式要求的场景。触发词包括：/mddoc、markdown转docx、md转word、生成格式化文档、学术格式转换。即使用户只说\"把这个转成word\"而内容是Markdown，也应使用此技能。\n---\n\n# mddoc — Markdown 转学术格式 DOCX\n\n## 快速开始\n\n```bash\n# 首次使用：创建虚拟环境并安装依赖\npython3 -m venv .venv\nsource .venv/bin/activate\npip install python-docx Pillow requests mistune\n\n# 后续使用：直接激活虚拟环境\nsource .venv/bin/activate\n\n# 转换 Markdown 文件 → 输出到同目录\npython <skill-path>/scripts/md2docx.py paper.md\n\n# 指定输出路径\npython <skill-path>/scripts/md2docx.py paper.md -o /path/to/output.docx\n\n# 直接转换粘贴的文本\npython <skill-path>/scripts/md2docx.py --text \"# 标题\\n\\n正文内容\" -o out.docx\n```\n\n其中 `<skill-path>` = `/home/kkk/.claude/skills/mddoc`\n\n## 工作流程\n\n1. **读取输入** — 若用户粘贴 Markdown 文本则直接读取；若用户提供文件路径（含 `@` 引用）则读取该文件\n2. **检查并准备环境** — 按以下顺序检查，命中即跳过后续步骤：\n   - 若 `.venv/bin/python` 存在且能 `import docx, PIL, requests, mistune` → 直接使用\n   - 若 `.venv` 存在但缺依赖 → `source .venv/bin/activate && pip install python-docx Pillow requests mistune`\n   - 若 `.venv` 不存在 → `python3 -m venv .venv && source .venv/bin/activate && pip install python-docx Pillow requests mistune`\n3. **执行转换** — 优先使用内置脚本 `scripts/md2docx.py`；若 Markdown 结构特殊则参照下方格式规范编写自定义脚本\n4. **确定输出** — 文件路径输入→同目录；粘贴内容→当前目录；文件名=「题目.docx」（题目从第一个 `# 标题` 提取；若无 `#` 标题则使用输入文件名，`--text` 模式为「未命名文档.docx」）\n5. **验证** — 检查 outline level、图片嵌入、页眉、分页符\n\n---\n\n## 格式参考\n\n> 每个元素配可直接使用的 python-docx 代码。公共导入和工具函数：\n\n```python\nfrom docx import Document\nfrom docx.shared import Pt, Cm\nfrom docx.enum.text import WD_ALIGN_PARAGRAPH\nfrom docx.oxml import OxmlElement\nfrom docx.oxml.ns import qn\n\ndef set_cn_font(run, cn_name, en_name='Times New Roman', size_pt=10.5, bold=False):\n    \"\"\"设置 run 的中英文字体、字号、加粗、颜色(黑)\"\"\"\n    run.font.size = Pt(size_pt)\n    run.font.bold = bold\n    run.font.name = en_name\n    run.font.color.rgb = None\n    rPr = run._element.get_or_add_rPr()\n    rFonts = rPr.find(qn('w:rFonts'))\n    if rFonts is None:\n        rFonts = OxmlElement('w:rFonts'); rPr.insert(0, rFonts)\n    rFonts.set(qn('w:eastAsia'), cn_name)\n    rFonts.set(qn('w:ascii'), en_name)\n    rFonts.set(qn('w:hAnsi'), en_name)\n\ndef add_empty(doc):\n    \"\"\"五号空行\"\"\"\n    p = doc.add_paragraph()\n    run = p.add_run('')\n    set_cn_font(run, '宋体', size_pt=10.5)\n    return p\n\ndef set_outline(para, level):\n    \"\"\"设置 outline level（XML方式，兼容所有python-docx版本）\"\"\"\n    pPr = para._element.get_or_add_pPr()\n    ol = OxmlElement('w:outlineLvl')\n    ol.set(qn('w:val'), str(level))\n    pPr.append(ol)\n```\n\n### 基础设置\n\n五号=10.5pt，1.3倍行距，段前段后0磅，全黑，A4页边距左3cm右2cm上2cm下2cm，页脚距底1cm。\n\n```python\ndoc = Document()\nsection = doc.sections[0]\n# 页边距：左3cm 右2cm 上2cm 下2cm\nsection.left_margin = Cm(3)\nsection.right_margin = Cm(2)\nsection.top_margin = Cm(2)\nsection.bottom_margin = Cm(2)\n\nsty = doc.styles['Normal']\nsty.font.size = Pt(10.5)\nsty.font.name = 'Times New Roman'\nsty.element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')\nsty.paragraph_format.line_spacing = 1.3\nsty.paragraph_format.space_before = Pt(0)\nsty.paragraph_format.space_after = Pt(0)\n```\n\n### 空行规则\n\n- **段落之间**：不空行\n- **题目**：上下各空一行\n- **一级标题**：上下各空一行\n- **二级/三级标题**：上下不空行\n- **图片**：上方空一行，图题下方空一行\n- **表格**：表题上方空一行，表格下方空一行\n\n### 题目（第一个 `#`）\n\n三号黑体(16pt)、居中、上下各空一行、**不设 outline level**。\n\n```python\nadd_empty(doc)\np = doc.add_paragraph()\np.alignment = WD_ALIGN_PARAGRAPH.CENTER\n# 题目不设 outline_level\nrun = p.add_run(title_text)\nset_cn_font(run, '黑体', size_pt=16)\nadd_empty(doc)\n```\n\n### 无标题文档\n\n当输入 Markdown 没有 `#` 标题时：\n- 跳过标题页，文档从第一个内容节点开始排版\n- 页眉右侧显示「未命名文档」代替标题\n- 页眉左侧「xxxxx」保持不变\n- 输出文件名：文件输入使用输入文件名（如 `paper.md` → `paper.docx`），`--text` 模式使用「未命名文档.docx」\n\n### 一级标题（后续 `#`）\n\n三号黑体(16pt)、居中、上下各空一行、outline_level=1、**前加分页符**。\n\n\n```python\nadd_empty(doc)\np = doc.add_paragraph()\np.alignment = WD_ALIGN_PARAGRAPH.CENTER\nset_outline(p, 1)\n# 分页符\npPr = p._element.get_or_add_pPr()\npPr.append(OxmlElement('w:pageBreakBefore'))\nrun = p.add_run(text)\nset_cn_font(run, '黑体', size_pt=16)\nadd_empty(doc)\n```\n\n### 二级标题（`##`）\n\n四号黑体(14pt)、**不加粗**、顶格(无缩进)、outline_level=2。上下不空行。\n\n```python\np = doc.add_paragraph()\nset_outline(p, 2)\np.paragraph_format.first_line_indent = Pt(0)\nrun = p.add_run(text)\nset_cn_font(run, '黑体', size_pt=14, bold=False)\n```\n\n### 三级标题（`###`）\n\n小四宋体(12pt)、**不加粗**、首行缩进Pt(21)(=2个中文字)、outline_level=3。\n\n```python\np = doc.add_paragraph()\nset_outline(p, 3)\np.paragraph_format.first_line_indent = Pt(21)\nrun = p.add_run(text)\nset_cn_font(run, '宋体', size_pt=12, bold=False)\n```\n\n### 四级及以上标题（`####`、`#####`、`######`）\n\n格式与正文相同（五号宋体 10.5pt、首行缩进Pt(21)、1.3倍行距），但设置对应的 outline_level（4/5/6）。上下不空行。\n\n```python\np = doc.add_paragraph()\nset_outline(p, level)  # 4、5 或 6，按实际标题层级\np.paragraph_format.first_line_indent = Pt(21)\np.paragraph_format.line_spacing = 1.3\np.paragraph_format.space_before = Pt(0)\np.paragraph_format.space_after = Pt(0)\nrun = p.add_run(text)\nset_cn_font(run, '宋体', size_pt=10.5, bold=False)\n```\n\n### 正文段落\n\n五号(10.5pt)宋体/TNR、首行缩进Pt(21)、1.3倍行距、段前段后0磅。\n\n```python\np = doc.add_paragraph()\np.paragraph_format.first_line_indent = Pt(21)\np.paragraph_format.line_spacing = 1.3\np.paragraph_format.space_before = Pt(0)\np.paragraph_format.space_after = Pt(0)\nrun = p.add_run(text)\nset_cn_font(run, '宋体', size_pt=10.5)\n```\n\n### 图片\n\n下载嵌入(不压缩)、等比缩放(8-12cm规则)、居中、上方空一行。\n\n```python\nimport requests\nfrom PIL import Image\n\ndef dl_image(url):\n    h = {'User-Agent': 'Mozilla/5.0 (compatible; mddoc/1.0)'}\n    r = requests.get(url, headers=h, timeout=30); r.raise_for_status()\n    return r.content  # bytes, 可保存为临时文件\n\ndef img_width(path):\n    img = Image.open(path)\n    dpi = img.info.get('dpi', (96, 96))\n    dx = dpi[0] if dpi and dpi[0] > 0 else 96\n    w_cm = img.width / dx * 2.54\n    if   w_cm > 12: tw = 12.0\n    elif w_cm < 8:  tw = 8.0\n    else:           tw = w_cm\n    return Cm(tw)\n\nadd_empty(doc)\np = doc.add_paragraph()\np.alignment = WD_ALIGN_PARAGRAPH.CENTER\np.add_run().add_picture(img_path, width=img_width(img_path))\n```\n\n### 图题\n\n图片下方(不空行)、小五(9pt)宋体加粗居中、逐章编号。有章标题时格式 `图<章>-<序号> <alt>`，无章标题时格式 `图<序号> <alt>`。若 alt 为空，自动使用图片文件名（不含扩展名）作为图题。\n\n```python\np = doc.add_paragraph()\np.alignment = WD_ALIGN_PARAGRAPH.CENTER\nrun = p.add_run(f'图{ch}-{idx} {alt_text}')\nset_cn_font(run, '宋体', size_pt=9, bold=True)\nadd_empty(doc)  # 图题下方空一行\n```\n\n### 表格 + 表题\n\n**三线表**(顶线1.5pt/表头底线0.75pt/底线1.5pt粗，无竖线)。表题在上方(不空行)、五号(10.5pt)宋体加粗居中。有章标题时格式`表<章>-<序号> <描述>`，无章标题时格式`表<序号> <描述>`。\n\n```python\n# 表题\nadd_empty(doc)\np = doc.add_paragraph(); p.alignment = WD_ALIGN_PARAGRAPH.CENTER\nrun = p.add_run(f'表{ch}-{idx} {caption}')\nset_cn_font(run, '宋体', size_pt=10.5, bold=True)\n\n# 表格\ntb = doc.add_table(rows=nrows, cols=ncols)\ntb.alignment = WD_ALIGN_PARAGRAPH.CENTER\n\n# 三线表边框\nPr = tb._tbl.tblPr or OxmlElement('w:tblPr')\nB = OxmlElement('w:tblBorders')\nfor tag, sz in [('top','12'),('bottom','12')]:\n    e = OxmlElement(f'w:{tag}'); e.set(qn('w:val'),'single')\n    e.set(qn('w:sz'),sz); e.set(qn('w:space'),'0'); e.set(qn('w:color'),'000000')\n    B.append(e)\nfor tag in ('left','right','insideH','insideV'):\n    e = OxmlElement(f'w:{tag}'); e.set(qn('w:val'),'none')\n    e.set(qn('w:sz'),'0'); e.set(qn('w:space'),'0'); e.set(qn('w:color'),'auto')\n    B.append(e)\nPr.append(B)\n# 表头行每格底部加细线 0.75pt（cell级别，不影响数据行）\nfor cell in tb.rows[0].cells:\n    tcPr = cell._tc.get_or_add_tcPr()\n    tcB = OxmlElement('w:tcBorders')\n    btm = OxmlElement('w:bottom')\n    btm.set(qn('w:val'),'single'); btm.set(qn('w:sz'),'6')\n    btm.set(qn('w:space'),'0'); btm.set(qn('w:color'),'000000')\n    tcB.append(btm); tcPr.append(tcB)\n\n# 表头行 — 居中、9pt、无缩进\nfor j, txt in enumerate(header):\n    c = tb.rows[0].cells[j]; c.paragraphs[0].clear()\n    c.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER\n    run = c.paragraphs[0].add_run(txt)\n    set_cn_font(run, '宋体', size_pt=9)\n    c.paragraphs[0].paragraph_format.first_line_indent = Pt(0)\n\n# 数据行 — 左对齐、9pt、无缩进\nfor i, row in enumerate(data):\n    for j, txt in enumerate(row):\n        c = tb.rows[i+1].cells[j]; c.paragraphs[0].clear()\n        c.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.LEFT\n        run = c.paragraphs[0].add_run(txt)\n        set_cn_font(run, '宋体', size_pt=9)\n        c.paragraphs[0].paragraph_format.first_line_indent = Pt(0)\n\nadd_empty(doc)  # 表格下方空一行\n```\n\n### 页眉\n\n左顶格\"xxxxx\"、右顶格文档题目、小五(9pt)黑体。\n\n```python\nsec = doc.sections[0]; hdr = sec.header\nhdr.is_linked_to_previous = False\nr = hdr.paragraphs[0].add_run('xxxxx')\nset_cn_font(r, '黑体', size_pt=9)\np2 = hdr.add_paragraph(); p2.alignment = WD_ALIGN_PARAGRAPH.RIGHT\nr2 = p2.add_run(title_text)\nset_cn_font(r2, '黑体', size_pt=9)\n```\n\n### 列表\n\n有序列表用（1）、（2）、（3）序号；无序列表用 • 符号。按正文格式（首行缩进Pt(21)）。\n\n```python\n# 有序列表 — (1)、(2)、(3) 格式\nfor idx, item in enumerate(items, 1):\n    p = doc.add_paragraph()\n    p.paragraph_format.first_line_indent = Pt(21)\n    run = p.add_run(f'（{idx}）{item}')\n    set_cn_font(run, '宋体', size_pt=10.5)\n\n# 无序列表\nfor item in items:\n    p = doc.add_paragraph()\n    p.paragraph_format.first_line_indent = Pt(21)\n    run = p.add_run(f'• {item}')\n    set_cn_font(run, '宋体', size_pt=10.5)\n```\n\n### 代码块\n\nTimes New Roman 字体、五号、左缩进、灰色背景(#D9D9D9)、上下各空一行。\n\n```python\nadd_empty(doc)\np = doc.add_paragraph()\np.paragraph_format.left_indent = Cm(1)\n# 灰色背景\npPr = p._element.get_or_add_pPr()\nshd = OxmlElement('w:shd')\nshd.set(qn('w:val'), 'clear')\nshd.set(qn('w:color'), 'auto')\nshd.set(qn('w:fill'), 'D9D9D9')\npPr.append(shd)\nrun = p.add_run(code)\nset_cn_font(run, '宋体', en_name='Times New Roman', size_pt=10.5)\nadd_empty(doc)\n```\n\n### 行内公式（`$...$`）\n\n嵌于段落中，转换为 OMML（Office Math Markup Language）格式，WPS/Word 可直接渲染。\n公式在段落中作为 `<m:oMath>` 元素插入，与文字 run 同级。\n\n```python\n# 行内公式通过 split_inline_math() 拆分为 segments\n# text segment → 普通 run，math segment → latex_to_omml() → m:oMath 元素\np = doc.add_paragraph()\np.paragraph_format.first_line_indent = Pt(21)\np.paragraph_format.line_spacing = 1.3\nfor seg in segments:\n    if seg['type'] == 'text':\n        if seg['content']:\n            run = p.add_run(seg['content'])\n            set_cn_font(run, '宋体', size_pt=10.5)\n    else:  # math — 转换为 OMML 并插入段落 XML\n        omml = latex_to_omml(seg['content'], display=False)\n        p._element.append(omml)\n```\n\n### 行间公式（`$$...$$`）\n\n独立成行，上下各空一行。公式通过 OMML 居中渲染，编号右对齐。编号格式同图/表：`(章-序号)`，逐章编号。编号括号用五号宋体，数字用五号 Times New Roman。\n\n布局方式：段落设置居中和右对齐 tab stop，OMML `<m:oMath>` 元素位于两个 tab 之间，实现公式居中、编号右对齐。\n\n```python\nadd_empty(doc)  # 上方空一行\np = doc.add_paragraph()\n\n# 设置 tab stops：居中和右对齐\n# 左边距3cm右边距2cm → 可用宽度16cm → 中心8cm(4536twips), 右边16cm(9072twips)\npPr = p._element.get_or_add_pPr()\ntabs = OxmlElement('w:tabs')\nct = OxmlElement('w:tab'); ct.set(qn('w:val'), 'center'); ct.set(qn('w:pos'), '4536')\nrt = OxmlElement('w:tab'); rt.set(qn('w:val'), 'right'); rt.set(qn('w:pos'), '9072')\ntabs.append(ct); tabs.append(rt)\npPr.append(tabs)\n\n# tab → 公式 OMML 居中\nrun_t1 = p.add_run()\nrun_t1._r.append(OxmlElement('w:tab'))\nomml = latex_to_omml(formula_text, display=False)\np._element.append(omml)\n\n# tab → 编号右对齐：(章-序号)\nrun_t2 = p.add_run()\nrun_t2._r.append(OxmlElement('w:tab'))\nrun_lp = p.add_run('(')\nset_cn_font(run_lp, '宋体', en_name='宋体', size_pt=10.5)\nrun_num = p.add_run(f'{ch}-{eq_num}')\nset_cn_font(run_num, '宋体', en_name='Times New Roman', size_pt=10.5)\nrun_rp = p.add_run(')')\nset_cn_font(run_rp, '宋体', en_name='宋体', size_pt=10.5)\n\nadd_empty(doc)  # 下方空一行\n```\n\n### LaTeX → OMML 转换\n\n内置 `latex_to_omml()` 函数将 LaTeX 数学公式转换为 OMML XML，支持以下构造：\n\n- 上下标：`a^b`、`a_b`、`a_b^c`\n- 分数：`\\frac{a}{b}`\n- 根式：`\\sqrt{x}`、`\\sqrt[n]{x}`\n- 希腊字母：`\\alpha`、`\\beta`、`\\Gamma` 等\n- 大运算符：`\\sum`、`\\prod`、`\\int`（含上下限）\n- 函数名：`\\sin`、`\\cos`、`\\log`、`\\lim` 等\n- 重音：`\\hat`、`\\bar`、`\\vec`、`\\tilde` 等\n- 符号：`\\infty`、`\\cdot`、`\\times`、`\\partial`、`\\nabla` 等\n- 定界符：`\\left(...\\right)`、`\\left[...\\right]`\n- 文本：`\\text{...}`\n\n### 页码\n\n从第一章（第一个一级标题所在页）开始编页码，格式 `第×页  共×页`，页脚边距 1cm。\n\n```python\nfrom docx.oxml import OxmlElement\nfrom docx.oxml.ns import qn\nfrom docx.shared import Cm\n\nsection = doc.sections[0]\nsection.footer_distance = Cm(1.1)  # 页脚边距\n\nfooter = section.footer\nfooter.is_linked_to_previous = False\nfp = footer.paragraphs[0]\nfp.alignment = WD_ALIGN_PARAGRAPH.CENTER\n\n# \"第\" 字\nrun1 = fp.add_run('第')\nset_cn_font(run1, '宋体', size_pt=10.5)\n# 页码字段\nrun_page = fp.add_run()\nfldChar1 = OxmlElement('w:fldChar'); fldChar1.set(qn('w:fldCharType'), 'begin')\nrun_page._r.append(fldChar1)\ninstrText = OxmlElement('w:instrText'); instrText.set(qn('xml:space'), 'preserve')\ninstrText.text = ' PAGE '\nrun_page._r.append(instrText)\nfldChar2 = OxmlElement('w:fldChar'); fldChar2.set(qn('w:fldCharType'), 'end')\nrun_page._r.append(fldChar2)\n# \"页  共\"\nrun2 = fp.add_run('页  共')\nset_cn_font(run2, '宋体', size_pt=10.5)\n# 总页数字段\nrun_total = fp.add_run()\nfldChar3 = OxmlElement('w:fldChar'); fldChar3.set(qn('w:fldCharType'), 'begin')\nrun_total._r.append(fldChar3)\ninstrText2 = OxmlElement('w:instrText'); instrText2.set(qn('xml:space'), 'preserve')\ninstrText2.text = ' NUMPAGES '\nrun_total._r.append(instrText2)\nfldChar4 = OxmlElement('w:fldChar'); fldChar4.set(qn('w:fldCharType'), 'end')\nrun_total._r.append(fldChar4)\n# \"页\"\nrun3 = fp.add_run('页')\nset_cn_font(run3, '宋体', size_pt=10.5)\n```\n\n> 注意：页码从第一章开始计数需在第一个一级标题处插入分节符并重置页码。简单场景可统一从第1页开始。\n\n### 跨页表格（续表）\n\n表头行设为重复标题行，跨页自动重复。续表在右上方标\"续表<编号>\"。\n\n```python\n# 表头行设为重复标题行（跨页自动出现）\ntblHeader = OxmlElement('w:tblHeader')\ntrPr = table.rows[0]._tr.get_or_add_trPr()\ntrPr.append(tblHeader)\n\n# 对于确实跨页的大表格，在分页处手动加\"续表\"标记：\n# （python-docx无法检测分页位置，建议生成后人工检查）\n# 续表右对齐段落示例：\np_cont = doc.add_paragraph()\np_cont.alignment = WD_ALIGN_PARAGRAPH.RIGHT\nrun_cont = p_cont.add_run(f'续表{tab_label}')\nset_cn_font(run_cont, '宋体', size_pt=10.5)\n```\n\n---\n\n## 生成后自检清单\n\n- [ ] 题目：16pt黑体、居中、无outline、上下各空一行\n- [ ] 无标题文档：跳过标题页、页眉显示「未命名文档」\n- [ ] 一级标题：16pt黑体、outline_level=1、前有分页符、上下各空一行\n- [ ] 二级标题：14pt黑体、顶格、outline_level=2、不加粗、**上下不空行**\n- [ ] 三级标题：12pt宋体、首行缩进Pt(21)、outline_level=3、不加粗、**上下不空行**\n- [ ] 四级及以上标题：10.5pt宋体同正文、首行缩进Pt(21)、outline_level=对应层级(4/5/6)、**上下不空行**\n- [ ] 正文：10.5pt、首行缩进Pt(21)、1.3倍行距、**段落间不空行**\n- [ ] 图片：嵌入、等比缩放8-12cm、居中、上下各空一行\n- [ ] 图题：9pt宋体加粗居中、图片下方\n- [ ] 表格：三线表(顶/底粗、表头格底线细、数据行无线)、居中\n- [ ] 表头行：居中、9pt、无缩进、tblHeader重复\n- [ ] 表题：10.5pt宋体加粗居中、表格上方\n- [ ] 列表：有序用（1）（2）（3）、无序用•、首行缩进\n- [ ] 代码块：Times New Roman、左缩进、灰色背景#D9D9D9、上下各空一行\n- [ ] 页眉：左\"xxxxx\"右题目、9pt黑体\n- [ ] 行内公式：$...$ 嵌于段落、OMML格式、WPS/Word可渲染\n- [ ] 行间公式：$$...$$ OMML居中、上下各空一行、编号(章-序号)右对齐、括号宋体数字TNR\n- [ ] 页码：\"第×页 共×页\"、页脚边距1cm\n- [ ] 续表：跨页表头重复、\"续表xx\"右上标注\n- [ ] 页边距：左3cm 右2cm 上2cm 下2cm\n- [ ] 全部黑色、无额外参数\n\n## 注意事项\n\n- **第一个 `#` 是题目**（不设 outline），后续 `#` 是一级标题（outline_level=1）；若无 `#` 标题仍可正常生成文档\n- **图片尺寸用 `Cm()`，不手算 EMU** — `add_picture(width=Cm(x))` 自动转换\n- **图片下载必设 User-Agent** — 否则 CDN/Wikipedia 返回 400\n- **图题编号自动生成** — alt text 作为描述文字，图/表编号独立逐章编序\n- **表题识别** — 表格前含\"表\"字的段落作为表题\n- **outline_level 用 `set_outline()` 设置** — `paragraph_format.outline_level` 在部分python-docx版本不生效，统一用XML方式写入；读取时也从XML读取\n- **公式编号自动生成** — 图/表/公式独立逐章编序，编号格式统一为 `章-序号`\n- **不添加**：目录页、背景色\n- **单位**：字体用 pt、尺寸用 cm\n\nFile v0.1.6:_meta.json\n\n{\n  \"ownerId\": \"kn74sxjtkhk771hzvyhh8q6hp18a69xe\",\n  \"slug\": \"mddoc\",\n  \"version\": \"0.1.6\",\n  \"publishedAt\": 1784252676777\n}\n\nFile v0.1.6:evals/test-latex-coverage.md\n\n# LaTeX 数学公式覆盖测试（IHKYoung 手册 + 完整补全）\n\n本文件测试所有已实现的 LaTeX 数学公式语法。\n\n---\n\n## 矩阵环境\n\n### bmatrix（方括号）\n\n$$\n\\begin{bmatrix} a & b \\\\ c & d \\end{bmatrix}\n$$\n\n### pmatrix（圆括号）\n\n$$\n\\begin{pmatrix} x_{11} & x_{12} \\\\ x_{21} & x_{22} \\end{pmatrix}\n$$\n\n### vmatrix（单竖线行列式）\n\n$$\n\\begin{vmatrix} a & b \\\\ c & d \\end{vmatrix}\n$$\n\n### Vmatrix（双竖线范数）\n\n$$\n\\begin{Vmatrix} a & b \\\\ c & d \\end{Vmatrix}\n$$\n\n### matrix（无括号）\n\n$$\n\\begin{matrix} 1 & 0 \\\\ 0 & 1 \\end{matrix}\n$$\n\n---\n\n## cases 环境（分段函数）\n\n$$\nf(x) = \\begin{cases} 0 & x < 0 \\\\ x^2 & 0 \\leq x < 1 \\\\ 1 & x \\geq 1 \\end{cases}\n$$\n\n---\n\n## align 环境（多行对齐）\n\n$$\n\\begin{align} x + y &= 2 \\\\ x - y &= 0 \\end{align}\n$$\n\n---\n\n## 字体命令\n\n### 粗体\n\n行内: $\\mathbf{A} = \\mathbf{B} + \\mathbf{C}$\n\n### 斜体\n\n行内: $\\mathit{variable}$\n\n### 手写体（花体）\n\n行内: $\\mathcal{L}$ $\\mathcal{A}$\n\n### 黑板粗体\n\n行内: $\\mathbb{R}$ $\\mathbb{N}$ $\\mathbb{Z}$ $\\mathbb{C}$\n\n### 正体（罗马体）\n\n行内: $\\mathrm{Var}(X)$\n\n### 等宽体\n\n行内: $\\mathtt{code}$\n\n### 粗体符号\n\n$\\boldsymbol{\\alpha} + \\bm{\\beta} = \\mathbb{E}[X]$\n\n---\n\n## 希腊字母\n\n### 小写\n\n$\\alpha$ $\\beta$ $\\gamma$ $\\delta$ $\\epsilon$ $\\varepsilon$ $\\zeta$ $\\eta$ $\\theta$ $\\vartheta$\n\n$\\iota$ $\\kappa$ $\\lambda$ $\\mu$ $\\nu$ $\\xi$ $\\pi$ $\\rho$ $\\sigma$ $\\tau$ $\\upsilon$ $\\phi$ $\\varphi$ $\\chi$ $\\psi$ $\\omega$\n\n### 大写\n\n$\\Gamma$ $\\Delta$ $\\Theta$ $\\Lambda$ $\\Xi$ $\\Pi$ $\\Sigma$ $\\Upsilon$ $\\Phi$ $\\Psi$ $\\Omega$\n\n### 变体\n\n$\\varpi$ $\\varrho$ $\\varsigma$\n\n---\n\n## 二元运算符\n\n$+$ $-$ $\\times$ $\\div$ $\\cdot$ $\\oplus$ $\\ominus$ $\\otimes$ $\\oslash$ $\\odot$ $\\star$ $\\circ$ $\\bullet$ $\\pm$ $\\mp$\n\n---\n\n## 关系符号\n\n$=$ $\\neq$ $\\approx$ $\\equiv$ $<$ $>$ $\\leq$ $\\geq$ $\\ge$ $\\le$ $\\ne$\n\n$\\ll$ $\\gg$ $\\prec$ $\\succ$ $\\preceq$ $\\succeq$ $\\sim$ $\\nsim$ $\\simeq$ $\\asymp$ $\\propto$\n\n---\n\n## 逻辑符号\n\n$\\wedge$ $\\vee$ $\\neg$ $\\Rightarrow$ $\\Leftrightarrow$ $\\forall$ $\\exists$ $\\nexists$ $\\top$ $\\bot$\n\n---\n\n## 集合符号\n\n$\\emptyset$ $\\in$ $\\notin$ $\\subseteq$ $\\subset$ $\\nsubseteq$ $\\supset$ $\\supseteq$ $\\nsupseteq$ $\\cup$ $\\cap$ $\\setminus$\n\n---\n\n## 箭头\n\n$\\to$ $\\gets$ $\\leftarrow$ $\\rightarrow$ $\\Rightarrow$ $\\Leftarrow$ $\\leftrightarrow$ $\\Leftrightarrow$\n\n$\\longrightarrow$ $\\longleftarrow$ $\\mapsto$ $\\longmapsto$ $\\uparrow$ $\\downarrow$ $\\updownarrow$\n\n$\\Uparrow$ $\\Downarrow$ $\\Updownarrow$\n\n---\n\n## 分数与根式\n\n### 分数\n\n$\\frac{a}{b}$ $\\dfrac{1}{2}$ $\\tfrac{1}{3}$\n\n$$\n\\frac{d}{dx} f(x) \\qquad \\frac{\\partial f}{\\partial x}\n$$\n\n### 根式\n\n$\\sqrt{x}$ $\\sqrt[n]{x}$\n\n---\n\n## 指数与对数\n\n$a^b$ $e^x$ $\\log x$ $\\ln x$ $\\log_a b$ $\\exp(x)$\n\n---\n\n## 极限\n\n$\\lim_{x \\to a} f(x)$ $\\lim_{x \\to \\infty} f(x)$\n\n---\n\n## 积分与求和\n\n$\\int f(x)dx$ $\\int_{a}^{b} f(x)dx$ $\\iint$ $\\iiint$\n\n$\\sum_{i=1}^{n} x_i$ $\\prod_{i=1}^{n} x_i$\n\n---\n\n## 重音符号\n\n$\\hat{x}$ $\\bar{x}$ $\\vec{v}$ $\\dot{x}$ $\\ddot{x}$ $\\tilde{x}$\n\n$$\n\\overrightarrow{AB} = \\overleftarrow{BA}\n$$\n\n---\n\n## 定界符\n\n$$\n\\left( \\frac{a + b}{c} \\right) \\qquad \\left[ \\frac{x}{y} \\right]\n$$\n\n---\n\n## 函数名\n\n$\\sin$ $\\cos$ $\\tan$ $\\cot$ $\\sec$ $\\csc$\n\n$\\arcsin$ $\\arccos$ $\\arctan$\n\n$\\sinh$ $\\cosh$ $\\tanh$ $\\coth$\n\n$\\log$ $\\lg$ $\\ln$ $\\exp$\n\n$\\lim$ $\\max$ $\\min$ $\\sup$ $\\inf$\n\n$\\det$ $\\dim$ $\\ker$ $\\gcd$\n\n---\n\n## 文本\n\n$\\text{当且仅当}$ $x \\text{ is even}$\n\n---\n\n## 间距\n\n$a\\,b$ $a\\quad b$ $a\\qquad b$\n\n---\n\n## 颜色\n\n$\\textcolor{red}{红色文字}$ $\\textcolor{blue}{蓝色文字}$\n\n---\n\n## 转义字符\n\n$\\#$ $\\$ $ \\% $ \\& $ \\_ $ \\{ $ \\} $ \\backslash $\n\n---\n\n## 综合复杂公式\n\n$$\n\\frac{1}{\\sqrt{2\\pi\\sigma^2}} \\exp\\left(-\\frac{(x-\\mu)^2}{2\\sigma^2}\\right)\n$$\n\n$$\nA\\mathbf{v} = \\lambda \\mathbf{v}\n$$\n\n$$\n\\mathbb{E}[X] = \\sum_{x} x\\,P(X=x)\n$$\n\n$$\n\\mathrm{Var}(X) = \\mathbb{E}[(X - \\mathbb{E}[X])^2]\n$$\n\n$$\nD_{KL}(P \\parallel Q) = \\sum_x P(x) \\log \\frac{P(x)}{Q(x)}\n$$\n\n$$\n\\frac{1}{N} \\sum_{i=1}^{N} (y_i - (w^T x_i + b))^2\n$$\n\nFile v0.1.6:evals/test-sample.md\n\n# 第一章 基于深度学习的图像识别研究\n\n## 1.1 研究背景\n\n近年来，深度学习技术在计算机视觉领域取得了突破性进展。卷积神经网络（Convolutional Neural Network, CNN）作为深度学习的核心架构之一，在图像分类、目标检测、语义分割等任务中表现出色。\n\n图像识别技术已广泛应用于安防监控、自动驾驶、医疗诊断等领域。传统的图像识别方法依赖手工设计的特征提取器，如 SIFT、HOG 等，这些方法在复杂场景下的泛化能力有限。\n\n### 1.2.1 深度学习发展历程\n\n深度学习的概念可追溯至20世纪40年代的神经网络研究。经历了多次起伏后，2012年 AlexNet 在 ImageNet 竞赛中的突破性表现标志着深度学习时代的正式到来。\n\n此后，VGGNet、GoogLeNet、ResNet 等架构相继提出，不断刷新图像识别的准确率记录。其中 ResNet 引入的残差连接解决了深层网络的梯度消失问题。\n\n## 1.2 研究现状\n\n目前主流的图像识别方法可归纳为三类：基于 CNN 的方法、基于 Transformer 的方法以及混合架构方法。\n\n![ResNet 网络架构示意图](https://www.python.org/static/img/python-logo.png)\n\n表 主流图像识别模型性能对比\n\n| 模型名称 | Top-1 准确率 | 参数量 | 发布时间 |\n|----------|-------------|--------|---------|\n| ResNet-50 | 76.2% | 25.6M | 2015 |\n| EfficientNet-B4 | 83.0% | 19.3M | 2019 |\n| ViT-B/16 | 84.1% | 86.0M | 2020 |\n| ConvNeXt-T | 84.9% | 28.6M | 2022 |\n\n从上表可以看出，模型性能持续提升的同时，参数效率也在不断优化。EfficientNet 系列通过神经架构搜索实现了参数效率与精度的良好平衡。\n\n### 1.2.1 数据增强技术\n\n数据增强是提升模型泛化能力的重要手段。常用方法包括：\n\n- 随机裁剪与缩放\n- 水平翻转与旋转\n- 色彩抖动与光照变换\n- CutOut 与 MixUp 等高级增强策略\n\n研究表明，合理的数据增强策略可以有效缓解过拟合问题，尤其在训练数据有限的场景下。\n\n## 1.3 理论基础\n\n卷积操作的数学表达为 $y = W * x + b$，其中 $W$ 为卷积核权重，$b$ 为偏置项。\n\n损失函数采用交叉熵损失：\n\n$$\nL(y, \\hat{y}) = -\\sum_{i=1}^{C} y_i \\log(\\hat{y}_i)\n$$\n\n梯度下降的参数更新规则为 $w_{t+1} = w_t - \\eta \\nabla L(w_t)$，其中 $\\eta$ 表示学习率。\n\n## 1.4 本文主要工作\n\n本文旨在构建一个高效准确的图像识别系统，主要贡献包括：\n\n本文的代码实现基于 PyTorch 框架，训练过程如下：\n\n```\nimport torch\nmodel = torch.hub.load('pytorch/vision', 'resnet50', pretrained=True)\nmodel.fc = torch.nn.Linear(2048, num_classes)\n```\n\n后续章节将详细介绍模型设计、训练策略与实验结果。\n\nFile v0.1.6:skill-card.md\n\n## Description: <br>\nConverts Markdown files or pasted Markdown into academically formatted Word DOCX documents, including headings, body text, images, tables, headers, page numbers, and LaTeX math. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[trisia](https://clawhub.ai/user/trisia) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers, researchers, students, and technical writers use this skill to turn Markdown content into DOCX files that follow a specific academic paper or report layout. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: Markdown image links may be fetched automatically during conversion. <br>\nMitigation: Use trusted Markdown, remove remote image links before conversion in sensitive environments, or require explicit opt-in with private and internal address blocking. <br>\n\n\n## Reference(s): <br>\n- [ClawHub skill page](https://clawhub.ai/trisia/skills/mddoc) <br>\n- [OpenXML Office Math namespace](http://schemas.openxmlformats.org/officeDocument/2006/math) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [files, shell commands, configuration, code, guidance] <br>\n**Output Format:** [DOCX files with Markdown guidance and shell command examples] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Produces .docx documents from Markdown file paths or pasted Markdown text.] <br>\n\n## Skill Version(s): <br>\n0.1.6 (source: server release metadata) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nFile v0.1.6:evals/evals.json\n\n{\n  \"skill_name\": \"mddoc\",\n  \"evals\": [\n    {\n      \"id\": 1,\n      \"prompt\": \"帮我把这份 Markdown 文件转成 docx 格式的 Word 文档\",\n      \"expected_output\": \"生成 .docx 文件，包含正确的标题格式、正文格式、图片和表格，页眉正确设置\",\n      \"files\": [\"evals/test-sample.md\"]\n    },\n    {\n      \"id\": 2,\n      \"prompt\": \"将下面这段 markdown 转成格式化的 Word 文档，保存到当前目录：\\n\\n# 实验报告\\n\\n## 实验目的\\n\\n本实验旨在验证深度学习模型在小样本数据集上的泛化性能。通过对比实验分析不同正则化策略的效果。\\n\\n## 实验方法\\n\\n### 数据集准备\\n\\n实验采用 CIFAR-10 数据集，随机选取每类 100 张图片作为训练集。测试集保持原始大小。\\n\\n![实验流程图](https://upload.wikimedia.org/wikipedia/commons/thumb/2/2d/Tensor_visualization.svg/400px-Tensor_visualization.svg.png)\\n\\n表 超参数配置\\n\\n| 参数 | 取值 |\\n|------|------|\\n| 学习率 | 0.001 |\\n| 批量大小 | 32 |\\n| 训练轮次 | 100 |\\n\\n### 评估指标\\n\\n采用 Top-1 准确率和 F1 分数作为评估指标。\",\n      \"expected_output\": \"在当前目录生成 实验报告.docx，包含题目、各级标题、正文、图片、表格的正确格式\",\n      \"files\": []\n    },\n    {\n      \"id\": 3,\n      \"prompt\": \"/mddoc 把这个转成word @evals/test-sample.md\",\n      \"expected_output\": \"在 evals/ 目录生成第一章 基于深度学习的图像识别研究.docx，格式完全符合学术规范\",\n      \"files\": [\"evals/test-sample.md\"]\n    }\n  ]\n}\n\nArchive v0.1.5: 7 files, 30740 bytes\n\nFiles: evals/evals.json (1585b), evals/test-latex-coverage.md (4031b), evals/test-sample.md (2789b), scripts/md2docx.py (66077b), skill-card.md (1774b), SKILL.md (18421b), _meta.json (124b)\n\nFile v0.1.5:SKILL.md\n\n---\nname: mddoc\nversion: 1.0.5\ndescription: 将 Markdown 内容转换为特定学术格式的 Word 文档 (.docx)。当用户想要将 Markdown 文件、粘贴的 Markdown 文本转换为格式化的 docx 文档时使用，特别是学术论文、技术报告、毕业论文等需要严格格式要求的场景。触发词包括：/mddoc、markdown转docx、md转word、生成格式化文档、学术格式转换。即使用户只说\"把这个转成word\"而内容是Markdown，也应使用此技能。\n---\n\n# mddoc — Markdown 转学术格式 DOCX\n\n## 快速开始\n\n```bash\n# 首次使用：创建虚拟环境并安装依赖\npython3 -m venv .venv\nsource .venv/bin/activate\npip install python-docx Pillow requests mistune\n\n# 后续使用：直接激活虚拟环境\nsource .venv/bin/activate\n\n# 转换 Markdown 文件 → 输出到同目录\npython <skill-path>/scripts/md2docx.py paper.md\n\n# 指定输出路径\npython <skill-path>/scripts/md2docx.py paper.md -o /path/to/output.docx\n\n# 直接转换粘贴的文本\npython <skill-path>/scripts/md2docx.py --text \"# 标题\\n\\n正文内容\" -o out.docx\n```\n\n其中 `<skill-path>` = `/home/kkk/.claude/skills/mddoc`\n\n## 工作流程\n\n1. **读取输入** — 若用户粘贴 Markdown 文本则直接读取；若用户提供文件路径（含 `@` 引用）则读取该文件\n2. **检查并准备环境** — 按以下顺序检查，命中即跳过后续步骤：\n   - 若 `.venv/bin/python` 存在且能 `import docx, PIL, requests, mistune` → 直接使用\n   - 若 `.venv` 存在但缺依赖 → `source .venv/bin/activate && pip install python-docx Pillow requests mistune`\n   - 若 `.venv` 不存在 → `python3 -m venv .venv && source .venv/bin/activate && pip install python-docx Pillow requests mistune`\n3. **执行转换** — 优先使用内置脚本 `scripts/md2docx.py`；若 Markdown 结构特殊则参照下方格式规范编写自定义脚本\n4. **确定输出** — 文件路径输入→同目录；粘贴内容→当前目录；文件名=「题目.docx」（题目从第一个 `# 标题` 提取；若无 `#` 标题则使用输入文件名，`--text` 模式为「未命名文档.docx」）\n5. **验证** — 检查 outline level、图片嵌入、页眉、分页符\n\n---\n\n## 格式参考\n\n> 每个元素配可直接使用的 python-docx 代码。公共导入和工具函数：\n\n```python\nfrom docx import Document\nfrom docx.shared import Pt, Cm\nfrom docx.enum.text import WD_ALIGN_PARAGRAPH\nfrom docx.oxml import OxmlElement\nfrom docx.oxml.ns import qn\n\ndef set_cn_font(run, cn_name, en_name='Times New Roman', size_pt=10.5, bold=False):\n    \"\"\"设置 run 的中英文字体、字号、加粗、颜色(黑)\"\"\"\n    run.font.size = Pt(size_pt)\n    run.font.bold = bold\n    run.font.name = en_name\n    run.font.color.rgb = None\n    rPr = run._element.get_or_add_rPr()\n    rFonts = rPr.find(qn('w:rFonts'))\n    if rFonts is None:\n        rFonts = OxmlElement('w:rFonts'); rPr.insert(0, rFonts)\n    rFonts.set(qn('w:eastAsia'), cn_name)\n    rFonts.set(qn('w:ascii'), en_name)\n    rFonts.set(qn('w:hAnsi'), en_name)\n\ndef add_empty(doc):\n    \"\"\"五号空行\"\"\"\n    p = doc.add_paragraph()\n    run = p.add_run('')\n    set_cn_font(run, '宋体', size_pt=10.5)\n    return p\n\ndef set_outline(para, level):\n    \"\"\"设置 outline level（XML方式，兼容所有python-docx版本）\"\"\"\n    pPr = para._element.get_or_add_pPr()\n    ol = OxmlElement('w:outlineLvl')\n    ol.set(qn('w:val'), str(level))\n    pPr.append(ol)\n```\n\n### 基础设置\n\n五号=10.5pt，1.3倍行距，段前段后0磅，全黑，A4页边距左3cm右2cm上2cm下2cm，页脚距底1cm。\n\n```python\ndoc = Document()\nsection = doc.sections[0]\n# 页边距：左3cm 右2cm 上2cm 下2cm\nsection.left_margin = Cm(3)\nsection.right_margin = Cm(2)\nsection.top_margin = Cm(2)\nsection.bottom_margin = Cm(2)\n\nsty = doc.styles['Normal']\nsty.font.size = Pt(10.5)\nsty.font.name = 'Times New Roman'\nsty.element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')\nsty.paragraph_format.line_spacing = 1.3\nsty.paragraph_format.space_before = Pt(0)\nsty.paragraph_format.space_after = Pt(0)\n```\n\n### 空行规则\n\n- **段落之间**：不空行\n- **题目**：上下各空一行\n- **一级标题**：上下各空一行\n- **二级/三级标题**：上下不空行\n- **图片**：上方空一行，图题下方空一行\n- **表格**：表题上方空一行，表格下方空一行\n\n### 题目（第一个 `#`）\n\n三号黑体(16pt)、居中、上下各空一行、**不设 outline level**。\n\n```python\nadd_empty(doc)\np = doc.add_paragraph()\np.alignment = WD_ALIGN_PARAGRAPH.CENTER\n# 题目不设 outline_level\nrun = p.add_run(title_text)\nset_cn_font(run, '黑体', size_pt=16)\nadd_empty(doc)\n```\n\n### 无标题文档\n\n当输入 Markdown 没有 `#` 标题时：\n- 跳过标题页，文档从第一个内容节点开始排版\n- 页眉右侧显示「未命名文档」代替标题\n- 页眉左侧「xxxxx」保持不变\n- 输出文件名：文件输入使用输入文件名（如 `paper.md` → `paper.docx`），`--text` 模式使用「未命名文档.docx」\n\n### 一级标题（后续 `#`）\n\n三号黑体(16pt)、居中、上下各空一行、outline_level=1、**前加分页符**。\n\n\n```python\nadd_empty(doc)\np = doc.add_paragraph()\np.alignment = WD_ALIGN_PARAGRAPH.CENTER\nset_outline(p, 1)\n# 分页符\npPr = p._element.get_or_add_pPr()\npPr.append(OxmlElement('w:pageBreakBefore'))\nrun = p.add_run(text)\nset_cn_font(run, '黑体', size_pt=16)\nadd_empty(doc)\n```\n\n### 二级标题（`##`）\n\n四号黑体(14pt)、**不加粗**、顶格(无缩进)、outline_level=2。上下不空行。\n\n```python\np = doc.add_paragraph()\nset_outline(p, 2)\np.paragraph_format.first_line_indent = Pt(0)\nrun = p.add_run(text)\nset_cn_font(run, '黑体', size_pt=14, bold=False)\n```\n\n### 三级标题（`###`）\n\n小四宋体(12pt)、**不加粗**、首行缩进Pt(21)(=2个中文字)、outline_level=3。\n\n```python\np = doc.add_paragraph()\nset_outline(p, 3)\np.paragraph_format.first_line_indent = Pt(21)\nrun = p.add_run(text)\nset_cn_font(run, '宋体', size_pt=12, bold=False)\n```\n\n### 正文段落\n\n五号(10.5pt)宋体/TNR、首行缩进Pt(21)、1.3倍行距、段前段后0磅。\n\n```python\np = doc.add_paragraph()\np.paragraph_format.first_line_indent = Pt(21)\np.paragraph_format.line_spacing = 1.3\np.paragraph_format.space_before = Pt(0)\np.paragraph_format.space_after = Pt(0)\nrun = p.add_run(text)\nset_cn_font(run, '宋体', size_pt=10.5)\n```\n\n### 图片\n\n下载嵌入(不压缩)、等比缩放(8-12cm规则)、居中、上方空一行。\n\n```python\nimport requests\nfrom PIL import Image\n\ndef dl_image(url):\n    h = {'User-Agent': 'Mozilla/5.0 (compatible; mddoc/1.0)'}\n    r = requests.get(url, headers=h, timeout=30); r.raise_for_status()\n    return r.content  # bytes, 可保存为临时文件\n\ndef img_width(path):\n    img = Image.open(path)\n    dpi = img.info.get('dpi', (96, 96))\n    dx = dpi[0] if dpi and dpi[0] > 0 else 96\n    w_cm = img.width / dx * 2.54\n    if   w_cm > 12: tw = 12.0\n    elif w_cm < 8:  tw = 8.0\n    else:           tw = w_cm\n    return Cm(tw)\n\nadd_empty(doc)\np = doc.add_paragraph()\np.alignment = WD_ALIGN_PARAGRAPH.CENTER\np.add_run().add_picture(img_path, width=img_width(img_path))\n```\n\n### 图题\n\n图片下方(不空行)、小五(9pt)宋体加粗居中、逐章编号。有章标题时格式 `图<章>-<序号> <alt>`，无章标题时格式 `图<序号> <alt>`。若 alt 为空，自动使用图片文件名（不含扩展名）作为图题。\n\n```python\np = doc.add_paragraph()\np.alignment = WD_ALIGN_PARAGRAPH.CENTER\nrun = p.add_run(f'图{ch}-{idx} {alt_text}')\nset_cn_font(run, '宋体', size_pt=9, bold=True)\nadd_empty(doc)  # 图题下方空一行\n```\n\n### 表格 + 表题\n\n**三线表**(顶线1.5pt/表头底线0.75pt/底线1.5pt粗，无竖线)。表题在上方(不空行)、五号(10.5pt)宋体加粗居中。有章标题时格式`表<章>-<序号> <描述>`，无章标题时格式`表<序号> <描述>`。\n\n```python\n# 表题\nadd_empty(doc)\np = doc.add_paragraph(); p.alignment = WD_ALIGN_PARAGRAPH.CENTER\nrun = p.add_run(f'表{ch}-{idx} {caption}')\nset_cn_font(run, '宋体', size_pt=10.5, bold=True)\n\n# 表格\ntb = doc.add_table(rows=nrows, cols=ncols)\ntb.alignment = WD_ALIGN_PARAGRAPH.CENTER\n\n# 三线表边框\nPr = tb._tbl.tblPr or OxmlElement('w:tblPr')\nB = OxmlElement('w:tblBorders')\nfor tag, sz in [('top','12'),('bottom','12')]:\n    e = OxmlElement(f'w:{tag}'); e.set(qn('w:val'),'single')\n    e.set(qn('w:sz'),sz); e.set(qn('w:space'),'0'); e.set(qn('w:color'),'000000')\n    B.append(e)\nfor tag in ('left','right','insideH','insideV'):\n    e = OxmlElement(f'w:{tag}'); e.set(qn('w:val'),'none')\n    e\n\nArchive v0.1.4: 6 files, 23315 bytes\n\nFiles: evals/evals.json (1585b), evals/test-sample.md (2789b), scripts/md2docx.py (44306b), skill-card.md (1802b), SKILL.md (17921b), _meta.json (124b)\n\nArchive v0.1.3: 6 files, 22922 bytes\n\nFiles: evals/evals.json (1585b), evals/test-sample.md (2789b), scripts/md2docx.py (43232b), skill-card.md (1689b), SKILL.md (17921b), _meta.json (124b)\n\nArchive v0.1.2: 3 files, 7953 bytes\n\nFiles: skill-card.md (2112b), SKILL.md (17721b), _meta.json (124b)\n\nArchive v0.1.1: 3 files, 7751 bytes\n\nFiles: skill-card.md (2100b), SKILL.md (17146b), _meta.json (124b)","readmeExcerpt":"Skill: mddoc Owner: trisia Summary: 将 Markdown 内容转换为特定学术格式的 Word 文档 (.docx)。当用户想要将 Markdown 文件、粘贴的 Markdown 文本转换为格式化的 docx 文档时使用，特别是学术论文、技术报告、毕业论文等需要严格格式要求的场景。触发词包括：/mddoc、markdown转docx、md转word、生成格式化文档、学术格式转换。即使用户只说\"把这个转成word\"而内容是Markdown，也应使用此技能。 Tags: latest:0.1.10 Version history: v0.1.10 | 2026-08-19T05:37:17.400Z | auto - Improved二级标题（##）实现：新增 set_first_line_indent_chars，确保完全无缩进以满足顶格要求。 - 更新格式示例和文档，二级标题采用 set_fi","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"# 1) 环境自检与准备（一次性，幂等）：创建/复用专用虚拟环境，仅缺失依赖时才安装\n#    专用环境位置：~/.cache/mddocx/venv（Windows: %LOCALAPPDATA%/mddocx/venv）\npython3 <skill-path>/scripts/setup_env.py\n#    输出最后一行 `READY <python>` 即就绪解释器路径\n\n# 2) 转换 Markdown 文件 → 输出到同目录（环境就绪后无需再检查）\n~/.cache/mddocx/venv/bin/python <skill-path>/scripts/md2docx.py paper.md\n\n# 指定输出路径\n~/.cache/mddocx/venv/bin/python <skill-path>/scripts/md2docx.py paper.md -o /path/to/output.docx\n\n# 直接转换粘贴的文本\n~/.cache/mddocx/venv/bin/python <skill-path>/scripts/md2docx.py --text \"# 标题\\n\\n正文内容\" -o out.docx"},{"language":"python","snippet":"from docx import Document\nfrom docx.shared import Pt, Cm\nfrom docx.enum.text import WD_ALIGN_PARAGRAPH\nfrom docx.oxml import OxmlElement\nfrom docx.oxml.ns import qn\n\ndef set_cn_font(run, cn_name, en_name='Times New Roman', size_pt=10.5, bold=False):\n    \"\"\"设置 run 的中英文字体、字号、加粗、颜色(黑)\"\"\"\n    run.font.size = Pt(size_pt)\n    run.font.bold = bold\n    run.font.name = en_name\n    run.font.color.rgb = None\n    rPr = run._element.get_or_add_rPr()\n    rFonts = rPr.find(qn('w:rFonts'))\n    if rFonts is None:\n        rFonts = OxmlElement('w:rFonts'); rPr.insert(0, rFonts)\n    rFonts.set(qn('w:eastAsia'), cn_name)\n    rFonts.set(qn('w:ascii'), en_name)\n    rFonts.set(qn('w:hAnsi'), en_name)\n\ndef add_empty(doc):\n    \"\"\"五号空行\"\"\"\n    p = doc.add_paragraph()\n    run = p.add_run('')\n    set_cn_font(run, '宋体', size_pt=10.5)\n    return p\n\ndef set_outline(para, level):\n    \"\"\"设置 outline level（XML方式，兼容所有python-docx版本）\"\"\"\n    pPr = para._element.get_or_add_pPr()\n    ol = OxmlElement('w:outlineLvl')\n    ol.set(qn('w:val'), str(level))\n    pPr.append(ol)"},{"language":"python","snippet":"doc = Document()\nsection = doc.sections[0]\n# 页边距：左3cm 右2cm 上2cm 下2cm\nsection.left_margin = Cm(3)\nsection.right_margin = Cm(2)\nsection.top_margin = Cm(2)\nsection.bottom_margin = Cm(2)\n\nsty = doc.styles['Normal']\nsty.font.size = Pt(10.5)\nsty.font.name = 'Times New Roman'\nsty.element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')\nsty.paragraph_format.line_spacing = 1.3\nsty.paragraph_format.space_before = Pt(0)\nsty.paragraph_format.space_after = Pt(0)"},{"language":"python","snippet":"add_empty(doc)\np = doc.add_paragraph()\np.alignment = WD_ALIGN_PARAGRAPH.CENTER\n# 题目不设 outline_level\nrun = p.add_run(title_text)\nset_cn_font(run, '黑体', size_pt=16)\nadd_empty(doc)"},{"language":"python","snippet":"add_empty(doc)\np = doc.add_paragraph()\np.alignment = WD_ALIGN_PARAGRAPH.CENTER\nset_outline(p, 1)\n# 分页符\npPr = p._element.get_or_add_pPr()\npPr.append(OxmlElement('w:pageBreakBefore'))\nrun = p.add_run(text)\nset_cn_font(run, '黑体', size_pt=16)\nadd_empty(doc)"},{"language":"python","snippet":"p = doc.add_paragraph()\nset_outline(p, 2)\nset_first_line_indent_chars(p, 0)  # 顶格：清除 firstLine 与 firstLineChars\nrun = p.add_run(text)\nset_cn_font(run, '黑体', size_pt=14, bold=False)"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: mddoc\nversion: 1.0.10\ndescription: 将 Markdown 内容转换为特定学术格式的 Word 文档 (.docx)。当用户想要将 Markdown 文件、粘贴的 Markdown 文本转换为格式化的 docx 文档时使用，特别是学术论文、技术报告、毕业论文等需要严格格式要求的场景。触发词包括：/mddoc、markdown转docx、md转word、生成格式化文档、学术格式转换。即使用户只说\"把这个转成word\"而内容是Markdown，也应使用此技能。\n---\n\n# mddoc — Markdown 转学术格式 DOCX\n\n## 快速开始\n\n```bash\n# 1) 环境自检与准备（一次性，幂等）：创建/复用专用虚拟环境，仅缺失依赖时才安装\n#    专用环境位置：~/.cache/mddocx/venv（Windows: %LOCALAPPDATA%/mddocx/venv）\npython3 <skill-path>/scripts/setup_env.py\n#    输出最后一行 `READY <python>` 即就绪解释器路径\n\n# 2) 转换 Markdown 文件 → 输出到同目录（环境就绪后无需再检查）\n~/.cache/mddocx/venv/bin/python <skill-path>/scripts/md2docx.py paper.md\n\n# 指定输出路径\n~/.cache/mddocx/venv/bin/python <skill-path>/scripts/md2docx.py paper.md -o /path/to/output.docx\n\n# 直接转换粘贴的文本\n~/.cache/mddocx/venv/bin/python <skill-path>/scripts/md2docx.py --text \"# 标题\\n\\n正文内容\" -o out.docx\n```\n\n其中 `<skill-path>` = `/home/kkk/.claude/skills/mddoc`\n\n## 工作流程\n\n1. **读取输入** — 若用户粘贴 Markdown 文本则直接读取；若用户提供文件路径（含 `@` 引用）则读取该文件\n2. **检查并准备环境** — 专用虚拟环境固定于 `~/.cache/mddocx/venv`（Windows: `%LOCALAPPDATA%/mddocx/venv`）：\n   - 若该环境存在且能 `import docx, PIL, requests, mistune` → 直接转换，不安装\n   - 环境缺失或依赖缺失时，才运行 `python3 <skill-path>/scripts/setup_env.py` 创建/安装（幂等，仅缺失时安装）\n3. **执行转换** — 用专用解释器 `~/.cache/mddocx/venv/bin/python` 运行内置脚本 `scripts/md2docx.py`；若 Markdown 结构特殊则参照下方格式规范编写自定义脚本\n4. **确定输出** — 文件路径输入→同目录；粘贴内容→当前目录；文件名=「题目.docx」（题目从第一个 `# 标题` 提取；若无 `#` 标题则使用输入文件名，`--text` 模式为「未命名文档.docx」）\n5. **验证** — 检查 outline level、图片嵌入、页眉、分页符\n\n---\n\n## 格式参考\n\n> 每个元素配可直接使用的 python-docx 代码。公共导入和工具函数：\n\n```python\nfrom docx import Document\nfrom docx.shared import Pt, Cm\nfrom docx.enum.text import WD_ALIGN_PARAGRAPH\nfrom docx.oxml import OxmlElement\nfrom docx.oxml.ns import qn\n\ndef set_cn_font(run, cn_name, en_name='Times New Roman', size_pt=10.5, bold=False):\n    \"\"\"设置 run 的中英文字体、字号、加粗、颜色(黑)\"\"\"\n    run.font.size = Pt(size_pt)\n    run.font.bold = bold\n    run.font.name = en_name\n    run.font.color.rgb = None\n    rPr = run._element.get_or_add_rPr()\n    rFonts = rPr.find(qn('w:rFonts'))\n    if rFonts is None:\n        rFonts = OxmlElement('w:rFonts'); rPr.insert(0, rFonts)\n    rFonts.set(qn('w:eastAsia'), cn_name)\n    rFonts.set(qn('w:ascii'), en_name)\n    rFonts.set(qn('w:hAnsi'), en_name)\n\ndef add_empty(doc):\n    \"\"\"五号空行\"\"\"\n    p = doc.add_paragraph()\n    run = p.add_run('')\n    set_cn_font(run, '宋体', size_pt=10.5)\n    return p\n\ndef set_outline(para, level):\n    \"\"\"设置 outline level（XML方式，兼容所有python-docx版本）\"\"\"\n    pPr = para._element.get_or_add_pPr()\n    ol = OxmlElement('w:outlineLvl')\n    ol.set(qn('w:val'), str(level))\n    pPr.append(ol)\n```\n\n### 基础设置\n\n五号=10.5pt，1.3倍行距，段前段后0磅，全黑，A4页边距左3cm右2cm上2cm下2cm，页脚距底1cm。\n\n```python\ndoc = Document()\nsection = doc.sections[0]\n# 页边距：左3cm 右2cm 上2cm 下2cm\nsection.left_margin = Cm(3)\nsection.right_margin = Cm(2)\nsection.top_margin = Cm(2)\nsection.bottom_margin = Cm(2)\n\nsty = doc.styles['Normal']\nsty.font.size = Pt(10.5)\nsty.font.name = 'Times New Roman'\nsty.element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')\nsty.paragraph_form"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn74sxjtkhk771hzvyhh8q6hp18a69xe\",\n  \"slug\": \"mddoc\",\n  \"version\": \"0.1.10\",\n  \"publishedAt\": 1787117837400\n}"},{"path":"evals/test-latex-coverage.md","content":"# LaTeX 数学公式覆盖测试（IHKYoung 手册 + 完整补全）\n\n本文件测试所有已实现的 LaTeX 数学公式语法。\n\n---\n\n## 矩阵环境\n\n### bmatrix（方括号）\n\n$$\n\\begin{bmatrix} a & b \\\\ c & d \\end{bmatrix}\n$$\n\n### pmatrix（圆括号）\n\n$$\n\\begin{pmatrix} x_{11} & x_{12} \\\\ x_{21} & x_{22} \\end{pmatrix}\n$$\n\n### vmatrix（单竖线行列式）\n\n$$\n\\begin{vmatrix} a & b \\\\ c & d \\end{vmatrix}\n$$\n\n### Vmatrix（双竖线范数）\n\n$$\n\\begin{Vmatrix} a & b \\\\ c & d \\end{Vmatrix}\n$$\n\n### matrix（无括号）\n\n$$\n\\begin{matrix} 1 & 0 \\\\ 0 & 1 \\end{matrix}\n$$\n\n---\n\n## cases 环境（分段函数）\n\n$$\nf(x) = \\begin{cases} 0 & x < 0 \\\\ x^2 & 0 \\leq x < 1 \\\\ 1 & x \\geq 1 \\end{cases}\n$$\n\n---\n\n## align 环境（多行对齐）\n\n$$\n\\begin{align} x + y &= 2 \\\\ x - y &= 0 \\end{align}\n$$\n\n---\n\n## 字体命令\n\n### 粗体\n\n行内: $\\mathbf{A} = \\mathbf{B} + \\mathbf{C}$\n\n### 斜体\n\n行内: $\\mathit{variable}$\n\n### 手写体（花体）\n\n行内: $\\mathcal{L}$ $\\mathcal{A}$\n\n### 黑板粗体\n\n行内: $\\mathbb{R}$ $\\mathbb{N}$ $\\mathbb{Z}$ $\\mathbb{C}$\n\n### 正体（罗马体）\n\n行内: $\\mathrm{Var}(X)$\n\n### 等宽体\n\n行内: $\\mathtt{code}$\n\n### 粗体符号\n\n$\\boldsymbol{\\alpha} + \\bm{\\beta} = \\mathbb{E}[X]$\n\n---\n\n## 希腊字母\n\n### 小写\n\n$\\alpha$ $\\beta$ $\\gamma$ $\\delta$ $\\epsilon$ $\\varepsilon$ $\\zeta$ $\\eta$ $\\theta$ $\\vartheta$\n\n$\\iota$ $\\kappa$ $\\lambda$ $\\mu$ $\\nu$ $\\xi$ $\\pi$ $\\rho$ $\\sigma$ $\\tau$ $\\upsilon$ $\\phi$ $\\varphi$ $\\chi$ $\\psi$ $\\omega$\n\n### 大写\n\n$\\Gamma$ $\\Delta$ $\\Theta$ $\\Lambda$ $\\Xi$ $\\Pi$ $\\Sigma$ $\\Upsilon$ $\\Phi$ $\\Psi$ $\\Omega$\n\n### 变体\n\n$\\varpi$ $\\varrho$ $\\varsigma$\n\n---\n\n## 二元运算符\n\n$+$ $-$ $\\times$ $\\div$ $\\cdot$ $\\oplus$ $\\ominus$ $\\otimes$ $\\oslash$ $\\odot$ $\\star$ $\\circ$ $\\bullet$ $\\pm$ $\\mp$\n\n---\n\n## 关系符号\n\n$=$ $\\neq$ $\\approx$ $\\equiv$ $<$ $>$ $\\leq$ $\\geq$ $\\ge$ $\\le$ $\\ne$\n\n$\\ll$ $\\gg$ $\\prec$ $\\succ$ $\\preceq$ $\\succeq$ $\\sim$ $\\nsim$ $\\simeq$ $\\asymp$ $\\propto$\n\n---\n\n## 逻辑符号\n\n$\\wedge$ $\\vee$ $\\neg$ $\\Rightarrow$ $\\Leftrightarrow$ $\\forall$ $\\exists$ $\\nexists$ $\\top$ $\\bot$\n\n---\n\n## 集合符号\n\n$\\emptyset$ $\\in$ $\\notin$ $\\subseteq$ $\\subset$ $\\nsubseteq$ $\\supset$ $\\supseteq$ $\\nsupseteq$ $\\cup$ $\\cap$ $\\setminus$\n\n---\n\n## 箭头\n\n$\\to$ $\\gets$ $\\leftarrow$ $\\rightarrow$ $\\Rightarrow$ $\\Leftarrow$ $\\leftrightarrow$ $\\Leftrightarrow$\n\n$\\longrightarrow$ $\\longleftarrow$ $\\mapsto$ $\\longmapsto$ $\\uparrow$ $\\downarrow$ $\\updownarrow$\n\n$\\Uparrow$ $\\Downarrow$ $\\Updownarrow$\n\n---\n\n## 分数与根式\n\n### 分数\n\n$\\frac{a}{b}$ $\\dfrac{1}{2}$ $\\tfrac{1}{3}$\n\n$$\n\\frac{d}{dx} f(x) \\qquad \\frac{\\partial f}{\\partial x}\n$$\n\n### 根式\n\n$\\sqrt{x}$ $\\sqrt[n]{x}$\n\n---\n\n## 指数与对数\n\n$a^b$ $e^x$ $\\log x$ $\\ln x$ $\\log_a b$ $\\exp(x)$\n\n---\n\n## 极限\n\n$\\lim_{x \\to a} f(x)$ $\\lim_{x \\to \\infty} f(x)$\n\n---\n\n## 积分与求和\n\n$\\int f(x)dx$ $\\int_{a}^{b} f(x)dx$ $\\iint$ $\\iiint$\n\n$\\sum_{i=1}^{n} x_i$ $\\prod_{i=1}^{n} x_i$\n\n---\n\n## 重音符号\n\n$\\hat{x}$ $\\bar{x}$ $\\vec{v}$ $\\dot{x}$ $\\ddot{x}$ $\\tilde{x}$\n\n$$\n\\overrightarrow{AB} = \\overleftarrow{BA}\n$$\n\n---\n\n## 定界符\n\n$$\n\\left( \\frac{a + b}{c} \\right) \\qquad \\left[ \\frac{x}{y} \\right]\n$$\n\n---\n\n## 函数名\n\n$\\sin$ $\\cos$ $\\tan$ $\\cot$ $\\sec$ $\\csc$\n\n$\\arcsin$ $\\arccos$ $\\arctan$\n\n$\\sinh$ $\\cosh$ $\\tanh$ $\\coth$\n\n$\\log$ $\\lg$ $\\ln$ $\\exp$\n\n$\\lim$ $\\max$ $\\min$ $\\sup$ $\\inf$\n\n$\\det$ $\\di"},{"path":"evals/test-sample.md","content":"# 第一章 基于深度学习的图像识别研究\n\n## 1.1 研究背景\n\n近年来，深度学习技术在计算机视觉领域取得了突破性进展。卷积神经网络（Convolutional Neural Network, CNN）作为深度学习的核心架构之一，在图像分类、目标检测、语义分割等任务中表现出色。\n\n图像识别技术已广泛应用于安防监控、自动驾驶、医疗诊断等领域。传统的图像识别方法依赖手工设计的特征提取器，如 SIFT、HOG 等，这些方法在复杂场景下的泛化能力有限。\n\n### 1.2.1 深度学习发展历程\n\n深度学习的概念可追溯至20世纪40年代的神经网络研究。经历了多次起伏后，2012年 AlexNet 在 ImageNet 竞赛中的突破性表现标志着深度学习时代的正式到来。\n\n此后，VGGNet、GoogLeNet、ResNet 等架构相继提出，不断刷新图像识别的准确率记录。其中 ResNet 引入的残差连接解决了深层网络的梯度消失问题。\n\n## 1.2 研究现状\n\n目前主流的图像识别方法可归纳为三类：基于 CNN 的方法、基于 Transformer 的方法以及混合架构方法。\n\n![ResNet 网络架构示意图](https://www.python.org/static/img/python-logo.png)\n\n表 主流图像识别模型性能对比\n\n| 模型名称 | Top-1 准确率 | 参数量 | 发布时间 |\n|----------|-------------|--------|---------|\n| ResNet-50 | 76.2% | 25.6M | 2015 |\n| EfficientNet-B4 | 83.0% | 19.3M | 2019 |\n| ViT-B/16 | 84.1% | 86.0M | 2020 |\n| ConvNeXt-T | 84.9% | 28.6M | 2022 |\n| **ViT-B/32** | *85.0%* | $87.7$M | 2021 |\n\n从上表可以看出，模型性能持续提升的同时，参数效率也在不断优化。EfficientNet 系列通过神经架构搜索实现了参数效率与精度的良好平衡。\n\n### 1.2.1 数据增强技术\n\n数据增强是提升模型泛化能力的重要手段。常用方法包括：\n\n- 随机裁剪与缩放\n- 水平翻转与旋转\n- 色彩抖动与光照变换\n- CutOut 与 MixUp 等高级增强策略\n\n研究表明，合理的数据增强策略可以有效缓解过拟合问题，尤其在训练数据有限的场景下。\n\n## 1.3 理论基础\n\n卷积操作的数学表达为 $y = W * x + b$，其中 $W$ 为卷积核权重，$b$ 为偏置项。\n\n损失函数采用交叉熵损失：\n\n$$\nL(y, \\hat{y}) = -\\sum_{i=1}^{C} y_i \\log(\\hat{y}_i)\n$$\n\n梯度下降的参数更新规则为 $w_{t+1} = w_t - \\eta \\nabla L(w_t)$，其中 $\\eta$ 表示学习率。\n\n## 1.4 本文主要工作\n\n本文旨在构建一个高效准确的图像识别系统，主要贡献包括：\n\n本文的代码实现基于 PyTorch 框架，训练过程如下：\n\n```\nimport torch\nmodel = torch.hub.load('pytorch/vision', 'resnet50', pretrained=True)\nmodel.fc = torch.nn.Linear(2048, num_classes)\n```\n\n后续章节将详细介绍模型设计、训练策略与实验结果。"},{"path":"skill-card.md","content":"## Description:\n\nConverts Markdown files or pasted Markdown text into academically formatted Word (.docx) documents with structured headings, body text, tables, images, lists, and LaTeX-style math.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[trisia](https://clawhub.ai/user/trisia)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers, students, and document authors use mddoc to convert Markdown content into Word documents that follow strict academic formatting for papers, technical reports, and theses.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The setup workflow may create a cached Python environment and download dependencies.\n\nMitigation: Install in a controlled environment and review dependency setup before running the skill.\n\nRisk: Markdown image references may contact remote or internal URLs or embed local image files into the generated document.\n\nMitigation: Use trusted Markdown input, or sandbox conversion and disable remote or local image resolution before processing untrusted content.\n\n## Reference(s):\n\n- [mddoc ClawHub listing](https://clawhub.ai/trisia/skills/mddoc)\n\n## Skill Output:\n\n**Output Type(s):** [Files, Shell commands, Guidance]\n\n**Output Format:** [DOCX files, with Markdown guidance and shell command invocations for setup and conversion]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Creates a cached Python environment when dependencies are missing; generated documents may embed downloaded or local images referenced by Markdown input.]\n\n## Skill Version(s):\n\n0.1.10 (source: ClawHub release evidence; artifact frontmatter reports 1.0.10)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"将 Markdown 内容转换为特定学术格式的 Word 文档 (.docx)。当用户想要将 Markdown 文件、粘贴的 Markdown 文本转换为格式化的 docx 文档时使用，特别是学术论文、技术报告、毕业论文等需要严格格式要求的场景。触发词包括：/mddoc、markdown转docx、md转word、生成格式化文档、学术格式转换。即使用户只说\"把这个转成word\"而内容是Markdown，也应使用此技能。 Skill: mddoc Owner: trisia Summary: 将 Markdown 内容转换为特定学术格式的 Word 文档 (.docx)。当用户想要将 Markdown 文件、粘贴的 Markdown 文本转换为格式化的 docx 文档时使用，特别是学术论文、技术报告、毕业论文等需要严格格式要求的场景。触发词包括：/mddoc、markdown转docx、md转word、生成格式化文档、学术格式转换。即使用户只说\"把这个转成word\"而内容是Markdown，也应使用此技能。 Tags: latest:0.1.10 Version history: v0.1.10 | 2026-08-19T05:37:17.400Z | auto - Improved二级标题（##）实现：新增 set_first_line_indent_chars，确保完全无缩进以满足顶格要求。 - 更新格式示例和文档，二级标题采用 set_fi","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":881,"uniquenessScore":56,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T03:18:30.399Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-10T03:18:30.399Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-10T07:39:55.607Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}