尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Pandoc 与 Typst:解读 9585 测试用例中 unnumbered/unlisted 标题的转换逻辑
文档开发工具CLI【免费下载链接】pandocUniversal markup converter项目地址https://gitcode.com/gh_mirrors/pa/pandoc点击查看免费下载本篇技术指南以 pandoc 仓库中的命令测试用例 test/command/9585.md 为主线深入剖析 Pandoc 的 Typst 写入器如何处理带有unnumbered不编号与unlisted不进目录类的标题。读者将掌握 Typst 写入器生成#heading(level: ..., outlined: false, numbering: none)的底层原理、这两个标题类在 Pandoc 全格式中的通用语义以及如何在 Markdown 源文档中实际使用这一能力。测试用例全貌一条命令、三段标题9585 号测试用例完整内容如下原文 11 行% pandoc -f native -t typst [ Header 2 ( , [] , [] ) [ Str One ] , Header 2 ( , [ unnumbered, unlisted ] , [] ) [ Str Two ] , Header 2 ( , [] , [] ) [ Str Three ] ] ^D One #heading(level: 2, outlined: false, numbering: none)[Two] Three这是 pandoc 标准的 golden test金标测试格式%开头是待执行的命令行^D之前的缩进内容是标准输入这里是 Pandoc 内部 AST 的 native 表示^D之后是期望的标准输出。用例输入了三段 level-2 标题Header 2它们的差异仅在第二个参数——属性列表class上标题类class期望输出One空 OneTwounnumbered,unlisted#heading(level: 2, outlined: false, numbering: none)[Two]Three空 Three可以看到关键行为普通标题直接输出 Typst 的标题语法一旦标题携带unnumbered或unlisted类写入器便切换为 Typst 函数式语法#heading(...)[...]并附加对应的属性参数。其中outlined: false对应unlisted类numbering: none对应unnumbered类。源码实现Typst 写入器如何构造#heading这一转换逻辑位于 Typst 写入器的核心块转换函数blockToTypst中见 src/Text/Pandoc/Writers/Typst.hsHeader level (ident,cls,kvs) inlines - do contents - inlinesToTypst inlines let lab case lookup typst-label kvs of Just l - toLabel FreestandingLabel l Nothing - toLabel FreestandingLabel ident let headingAttrs [outlined: false | unlisted elem cls] [numbering: none | unnumbered elem cls] return $ if null headingAttrs then nowrap (literal (T.replicate level ) space contents) cr lab else literal #heading parens (literal (T.intercalate , (level: tshow level : headingAttrs))) brackets contents cr lab从源码结构可以拆解出完整的生成规则属性收集headingAttrs是一个列表推导。当cls中包含unlisted时追加outlined: false包含unnumbered时追加numbering: none。两个条件彼此独立、可叠加——这正是测试用例中 Two 标题同时出现两个属性的原因。分支判断若headingAttrs为空即两个类都没有走 Typst 的语法糖重复的次数等于标题层级level否则输出#heading(...)[...]函数调用参数以level: N开头后跟收集到的属性列表。标签输出两种分支的末尾都会追加lab——标题的标签。标签优先取键值属性typst-label否则取标题的ident标识符通过toLabel FreestandingLabel生成用于 Typst 中的交叉引用。需要特别指出的是该分支仅在类列表非空且包含这两个类之一时触发如果标题只有其他类如自定义样式类而不含这两个类仍会输出语法。因此outlined: false与numbering: none的职责划分在写入器层面是明确且正交的前者剔除目录后者关闭编号。类的通用语义unnumbered 与 unlisted 是什么这两个类并非 Typst 写入器独有而是 Pandoc 全局的标题约定在 MANUAL.txt 中有明确说明unnumbered带此类的标题即使指定了--number-sections也永远不会被编号见 MANUAL.txt 中该选项的说明。unlisted若与unnumbered同时存在该标题不会进入目录table of contents。快捷写法属性上下文中的单个连字符{-}等价于{.unnumbered}在非英语文档中更推荐使用例如# My heading {-}。适用范围这一特性当前在部分格式LaTeX 系、HTML 系、PowerPoint、RTF中实现MANUAL.txt而 Typst 写入器同样实现了等价支持——9585 测试用例正是其验证证据。一个实际场景是参考文献章节当 Pandoc 在文档末尾插入参考文献列表时会自动为# References标题添加unnumbered类使文献章节不被编号MANUAL.txt。这与 9585 用例中展示的机制完全一致只是触发方不同——一个是写入器主动添加一个是用户显式标注。跨格式对比同一类在不同写入器中的落地对比另一个命令测试 test/command/1762.md可以看到同样三个标题在 LaTeX 写入器下的输出% pandoc -t latex # One {.unlisted} # Two {.unnumbered} # Three {.unlisted .unnumbered} ^D \section{One}\label{one} \section*{Two}\label{two} \addcontentsline{toc}{section}{Two} \section*{Three}\label{three}LaTeX 侧的映射是unnumbered产生星号命令\section*{}unlisted再通过\addcontentsline{toc}{section}{...}将标题从目录中剔除\section*默认不入目录故该行是反向恢复编号但保持不列出——实际效果是两者组合后标题不编号、不入目录。而 Typst 侧则统一收敛为#heading的两个属性。两种写入器的语法形态不同但语义模型一致编号与目录是标题的两个独立维度可分别关闭。这解释了为什么 test/command/10635.md 等其他用例也会同时携带unnumbered与unlisted两个类来测试组合场景。实战在 Markdown 中编写不编号、不入目录的标题将 9585 用例的结论落到日常写作在 Markdown 源文档中只需给标题追加类即可# 参与文献 {-}这等价于# 参与文献 {.unnumbered}转换到 Typst 输出为#heading(level: 1, numbering: none)[参与文献]若希望标题既不编号也不进目录# 附录 {.unnumbered .unlisted}输出为#heading(level: 1, outlined: false, numbering: none)[附录]注意类名顺序不影响结果——源码中的两个列表推导是独立判断的。无论哪种写法写入器都会为标题生成可引用的标签默认取自标题文本自动生成的标识符或显式指定的typst-label/ident因此在 Typst 文档中仍可通过label交叉引用这些标题。测试体系这类用例如何保障写入器行为9585 用例属于 pandoc 的命令测试套件由 test/test-pandoc.hs 驱动、test/Tests/Command.hs 实现执行框架读取test/command/目录下的NNNN.md文件解析出命令行与期望输出运行真实 pandoc 二进制并逐字比对。这意味着#heading(level: 2, outlined: false, numbering: none)的输出是受回归测试保护的约定——任何对blockToTypst中headingAttrs逻辑的修改都必须让该用例继续通过。同类用例如 test/command/1762.md、test/command/11795.md共同覆盖了不同写入器、不同标题组合下的行为矩阵是理解 Pandoc 各格式写入器语义差异的最佳入口。小结从 9585 这个 11 行的测试用例出发可以还原出 Pandoc 的一条完整技术链路Markdown 中的{.unnumbered .unlisted}类 → 内部 AST 的Header块属性 → Typst 写入器blockToTypst中的headingAttrs列表推导 → 最终输出#heading(level: 2, outlined: false, numbering: none)[...]。这条链路同时受 MANUAL.txt 的语义文档、Typst.hs 的源码实现与 test/command/ 的回归测试三重约束是理解 Pandoc 类驱动的跨格式标题控制机制的最小而完整的样本。赞分享文档开发工具CLI【免费下载链接】pandocUniversal markup converter项目地址https://gitcode.com/gh_mirrors/pa/pandoc点击查看免费下载相关推荐Pandoc 标题类属性深度解析unnumbered 与 unlisted 在 LaTeX 输出中的行为机制Pandoc 标题类属性深度解析 unnumbered 与 unlisted 在 LaTeX 输出中的行为机制 本文基于 pandoc 仓库中的回归测试用例文档开发工具CLIPandoc 与 Typst 引号转义从测试用例 11463 解析 、 与 \ 的读写往返Pandoc 与 Typst 引号转义从测试用例 11463 解析 、 与 \ 的读写往返 本篇技术指南以 pandoc 仓库中的回归测试用例 te文档开发工具CLIpandoc Markdown 转义改进实战读懂命令测试 7726 中 \ 标题转义的保留逻辑pandoc Markdown 转义改进实战读懂命令测试 7726 中 \ 标题转义的保留逻辑 pandoc 是一款通用文档格式转换器其命令测试comma文档开发工具CLI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

90后负债破局:面试避坑保姆级教程

90后负债破局:面试避坑保姆级教程

90后负债破局:面试避坑保姆级教程 复制来的代码跑不通,报错红字一片,新手往往卡在第一步就心态崩了。别慌,这行代码的问题不在逻辑,而在环境配置与依赖管理的细节盲区。本文提供一份针对前端与后端通用的调试保姆级教程,帮你从“盲改”转向“精准定位…

📅 2026/9/23 5:46:41
claude-code:终端原生AI编程助手,深度集成Git/NPM/Homebrew

claude-code:终端原生AI编程助手,深度集成Git/NPM/Homebrew

1. 项目概述:这不是一个“工具”,而是一套可嵌入终端的AI编程工作流你搜“claude-code”时看到的那些关键词——terminal、git、npm、Homebrew——其实已经暴露了它的本质:它不是某个独立App,也不是网页版Claude的简化版&#xff…

📅 2026/9/23 5:46:41
Apache Druid Delta Lake 扩展实战:通过 DeltaInputSource 从 Lakehouse 表批量摄入数据

Apache Druid Delta Lake 扩展实战:通过 DeltaInputSource 从 Lakehouse 表批量摄入数据

数据库OLAP大数据后端 【免费下载链接】druid Apache Druid: a high performance real-time analytics database. 项目地址: https://gitcode.com/gh_mirrors/druid6/druid 点击查看 免费下载 Delta Lake 是构建 Lakehouse 架构的开放存储框架,而 Apach…

📅 2026/9/23 5:41:41
MORE NEWS

更多资讯

📰

企业固定资产管理痛点与数字化转型解决方案

1. 固定资产管理的核心痛点解析固定资产作为企业运营的重要物质基础,其管理效率直接影响着企业的运营成本和风险控制。在实际工作中,我发现很多企业都面临着相似的困扰:1.1 资产信息不透明导致的管理盲区最典型的场景是:财务账面上…

📰

电信ifree卡底层解析:3步调通代码,附完整示例

电信ifree卡底层解析:3步调通代码,附完整示例 刚拿到电信ifree卡,或者看到别人发的ifree卡相关代码,直接复制进IDEA或VS…

📰

对抗思维熵增:认知升级的三维实践框架

1. 认知升级的本质:对抗思维熵增2003年诺奖得主丹尼尔卡尼曼在《思考,快与慢》中揭示:人类大脑每天要处理约3.5万个决策,其中90%依赖既有的思维路径。这种思维惯性就像热力学中的熵增定律——封闭系统会自发趋向混乱。我们的大脑如…

📰

动态自适应执行深度:基于任务复杂度的 ReAct 步数智能控制

动态自适应执行深度:基于任务复杂度的 ReAct 步数智能控制在多智能体系统(MAS)的 ReAct(Reasoning Acting)推理循环中,传统的系统通常采用固定死板的最大迭代步数限制(Fixed max_iterations10&…

📰

轻量级代码安全审计实战:用JS构建可编程、可验证的审计能力

1. 这不是“安全审计”培训课,而是一套能立刻上手的实战技能体系你打开终端,敲下一行命令,几秒后屏幕上滚动出几十条带风险等级、定位路径、修复建议的结构化结果——这不是某个商业扫描器的演示视频,而是我上周用不到200行脚本完…

📰

SpringBoot+Vue校园资料分享平台开发实践

1. 项目背景与核心价值校园资料分享平台是近年来高校信息化建设中需求迫切的实用型项目。作为计算机相关专业毕业设计的选题,它完美融合了技术实践与校园场景需求,既能展示学生全栈开发能力,又具备实际应用价值。我指导过的3届毕业生中&#…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬