资讯动态

Pandoc 的 implicit_figures 扩展:把独立图片自动转成带题注的图(figure)

发布时间:2026/9/20 2:40:56 来源:尧图企业网站定制
文档开发工具CLI【免费下载链接】pandocUniversal markup converter项目地址https://gitcode.com/gh_mirrors/pa/pandoc点击查看免费下载导读test/command/4012.md是 Pandoc 命令测试套件test/command中的一个用例它验证了在启用implicit_figures扩展时一段“整段只有一个带非空 alt 文本的图片”的 Markdown会被解析成带题注的图figure并且图片上的尺寸属性会正确写入 HTML 输出的style属性中。本文以该用例为线索结合 MANUAL.txt 的官方说明与 src/Text/Pandoc/Readers/Markdown.hs 等源码讲解implicit_figures的触发条件、属性语法、在 HTML 输出中的呈现方式以及如何用命令测试用例来锁定这一行为。读完本文你将能精确控制 Pandoc 中“独立图片自动成图”的行为并能在自己的仓库里复现与验证该测试。测试用例 4012 在验证什么test/command/4012.md的完整内容如下% pandoc -f markdown-implicit_figures ![image] [image]: http://example.com/image.jpg {height35mm} ^D pimg srchttp://example.com/image.jpg styleheight:35mm altimage //p该文件属于 Pandoc 的命令测试command test体系第一行% pandoc ...是要执行的命令行^D之前是标准输入^D之后是期望的标准输出。它的技术要点有四点以-f markdown-implicit_figures显式启用扩展格式字符串markdown-implicit_figures表示在 Markdown 语法基础上移除implicit_figures扩展-前缀表示禁用。这一点很关键——单独使用-f markdown时该扩展默认是开启的见下文而这里特意关掉它是为了单独验证**链接属性link_attributes**的行为。引用式图片语法![image]是快捷引用链接图片地址由下方[image]: http://example.com/image.jpg ...的定义给出。图片引用上携带属性[image]: http://example.com/image.jpg {height35mm}在引用定义中写入了height35mm属性。期望输出HTML 中图片是p包裹的普通img不是figure且高度被转成了内联样式styleheight:35mm。也就是说该用例真正锁定的行为是当implicit_figures被禁用、但图片属性语法生效时独立图片保持为普通段落且尺寸属性被 HTML writer 转换为内联 CSS 输出。它和implicit_figures是“同一个特性的正反两面”一个管“是否成图”一个管“属性如何渲染”。implicit_figures 扩展定义与默认状态官方语义MANUAL.txt 对implicit_figures的定义是An image with nonempty alt text, occurring by itself in a paragraph, will be rendered as a figure with a caption. The images description will be used as the caption.即一段中单独出现、且 alt 文本非空的图片会被渲染为带题注的图figure图片的描述文本即题注。例如This is the caption.会被解析为带题注 This is the caption. 的 figure。如果希望图片保持普通的内联图片只要让它不是段落里的唯一内容即可例如在图片后加一个不换行空格This image wont be a figure\扩展的注册与默认集合在 src/Text/Pandoc/Extensions.hs 中扩展被定义为构造器| Ext_implicit_figures -- ^ A paragraph with just an image is a figure它属于 Pandoc 的 Markdown 默认扩展集合pandocExtensionssrc/Text/Pandoc/Extensions.hs也出现在plainExtensionsplain 输出格式默认集合与gfmExtensions等集合中src/Text/Pandoc/Extensions.hs、src/Text/Pandoc/Extensions.hs。因此使用-f markdown默认格式时implicit_figures默认开启使用-f markdown-implicit_figures可显式关闭它使用-f markdownimplicit_figures可显式开启它对默认不含该扩展的格式如 CommonMark 基础语法也有效。Markdown reader 的触发逻辑在 src/Text/Pandoc/Readers/Markdown.hs 中段落解析器会对“整段仅一个图片”的情形做特判let figureOr constr inlns case B.toList inlns of [Image attr figCaption (src, tit)] | extensionEnabled Ext_implicit_figures exts , not (null figCaption) - do implicitFigure attr (B.fromList figCaption) src tit _ - constr inlns两个条件缺一不可Ext_implicit_figures已启用且图片的 altfigCaption非空。满足条件时调用implicitFigure构造 figure 块否则退回普通段落/普通段落块。implicitFiguresrc/Text/Pandoc/Readers/Markdown.hs还会从属性中抽出alt和latex-placement做特殊处理alt属性用于指定与题注不同的替代文本latex-placement则被转存到 figure 属性上供 LaTeX 输出使用。CommonMark reader 的对应实现CommonMark 格式对implicit_figures的语义一致在 src/Text/Pandoc/Readers/CommonMark.hs 中makeFigures把“整段只有一个图片且 alt 非空”的段落转换为FiguremakeFigures (Para [Image (ident,classes,kvs) alt (src,tit)]) | not (null alt) Figure (ident,[],[]) (Caption Nothing [Plain alt]) [Plain [Image (,classes,kvs) alt (src,tit)]]它仅在Ext_implicit_figures启用时被应用到文档树上src/Text/Pandoc/Readers/CommonMark.hs。注意 CommonMark 的Figure块与 Pandoc Markdown 略有差异标识符被清空、类名保留这体现了两个 reader 在细节上的不同。图片属性link_attributes与尺寸属性属性语法implicit_figures常与link_attributes扩展配合使用。link_attributes允许在链接/图片内联或引用式后书写{#id .class keyvalue}形式的属性MANUAL.txtAn inline image{#id .class width30 height20px} and a reference ![image][ref] with attributes.本用例 4012 展示的正是引用式图片的属性写法在引用定义行[image]: URL之后追加{height35mm}。相关解析逻辑在 src/Text/Pandoc/Readers/Markdown.hs当Ext_link_attributes启用时引用定义后可以跟一组attributes。尺寸属性的合法单位height35mm中的35mm是合法的尺寸值。尺寸值由 src/Text/Pandoc/ImageSize.hs 中的Dimension类型支持data Dimension Pixel Integer | Centimeter Double | Millimeter Double | Inch Double | Point Double | Pica Double | Percent Double | Em Double即支持px、cm、mm、in、pt、pc、%、em等单位。dimension :: Direction - Attr - Maybe Dimensionsrc/Text/Pandoc/ImageSize.hs从属性中读取width/height键并解析为上述维度。HTML 输出尺寸属性如何变成内联样式期望输出的解释测试期望的 HTML 是pimg srchttp://example.com/image.jpg styleheight:35mm altimage //p注意两点styleheight:35mmheight键没有被原样输出为height35mm属性而是被合并进了style属性。因为implicit_figures被禁用所以img仍被p包裹普通段落而不是figure/figcaption结构。altimagealt 文本取自引用链接的标签文本image。源码层面的实现在 HTML writer 中src/Text/Pandoc/Writers/HTML.hs 的imgAttrsToHtml处理图片属性把width/height从普通属性中过滤出来isNotDimdimensionsToAttrList根据维度类型决定输出形式像素值Pixel输出为width30/height20这样的数字属性其他单位如mm、cm、em、%则生成stylewidth:35mm;形式的内联样式多个样式项会被consolidateStyles合并进同一个style属性src/Text/Pandoc/Writers/HTML.hs。这正是height35mm被输出为styleheight:35mm的原因。其他输出格式的行为差异implicit_figures的渲染结果因输出格式而异MANUAL.txt多数格式HTML、LaTeX、ConTeXt 等会把独立图片渲染为带figcaption的 figure部分格式如 RTF尚不支持 figure此时仍输出“段落中单独一张图”没有题注reveal.js 幻灯片中若图片带r-stretch类图片会铺满屏幕并省略 figure 标签与题注LaTeX 输出可用latex-placement属性指定 figure 位置例如The caption.{latex-placementht}MANUAL.txt若想让 alt 文本与题注不同可用alt属性The caption.{altdescription of image}MANUAL.txt。如何复现与验证可以直接在命令行复现本测试用例。在仓库根目录准备输入内容并执行此处使用 heredoc 模拟测试的 stdin 输入cat EOF | pandoc -f markdown-implicit_figures ![image] [image]: http://example.com/image.jpg {height35mm} EOF应得到pimg srchttp://example.com/image.jpg styleheight:35mm altimage //p对比实验可以更直观地理解该特性启用implicit_figures时的行为执行pandoc -f markdown默认已开启同样的输入会得到一个figure结构例如figureimg src... altimage /figcaptionimage/figcaption/figure——因为image是非空 alt整段只有一个图片满足成图条件。alt 为空时的行为若把引用改为![]且无alt属性则即使启用扩展也不会成图not (null figCaption)条件不满足。属性对输出形式的影响把{height35mm}换成{height35px}HTML 输出会变为height35形式的数字属性而{height35mm}则始终走style内联样式。还可以运行整个命令测试套件来验证该用例没有回归Pandoc 的命令测试入口是 test/test-pandoc.hs它会读取 test/command 目录下全部*.md用例包括 4012并断言输出一致。小结test/command/4012.md是一个小而精的命令测试用例它同时覆盖了三层技术事实扩展开关的写法-f markdown-implicit_figures用-前缀从格式中移除扩展这是 Pandoc 中启用/禁用扩展的标准语法引用式图片的属性语法[ref]: URL {height35mm}中的属性由link_attributes扩展提供HTML writer 的属性渲染规则非像素尺寸单位被合并进style内联样式像素则输出为数字属性src/Text/Pandoc/Writers/HTML.hs。理解了这个用例也就理解了implicit_figures、link_attributes与 HTML 尺寸渲染三者如何协作。配合 MANUAL.txt 的 Images 章节与 src/Text/Pandoc/Readers/Markdown.hs 的解析代码你可以在实际文档中精确控制图片何时成图、题注如何生成、尺寸如何呈现。赞分享文档开发工具CLI【免费下载链接】pandocUniversal markup converter项目地址https://gitcode.com/gh_mirrors/pa/pandoc点击查看免费下载相关推荐Pandoc implicit_figures 扩展深度解析从 test/command/3450.md 看图片到图形的转换机制与禁用行为Pandoc implicit_figures 扩展深度解析从 test/command/3450.md 看图片到图形的转换机制与禁用行为 导读 本文以 pa文档开发工具CLIPandoc implicit_figures 扩展深度解析Figure 块在 Markdown 输出中的三种渲染模式Pandoc implicit_figures 扩展深度解析Figure 块在 Markdown 输出中的三种渲染模式 导读 本文围绕 pandoc 官方命令文档开发工具CLI如何用 phpize 把 php-src 中的扩展转换为可独立分发的自包含扩展如何用 phpize 把 php src 中的扩展转换为可独立分发的自包含扩展 如果你手上有一份 php src 源码想把其中某个内置扩展文档以 ext/m编程语言语言运行时解释器创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价