Quarkdown 库(libs)机制全解析:从 `.include {name}` 加载到自定义函数库的构建与分发

发布时间:2026/9/14 13:24:42

Quarkdown 库(libs)机制全解析:从 `.include {name}` 加载到自定义函数库的构建与分发 Quarkdown 库libs机制全解析从.include {name}加载到自定义函数库的构建与分发【免费下载链接】quarkdown Markdown with superpowers: from ideas to papers, presentations, websites, books, and knowledge bases.项目地址: https://gitcode.com/GitHub_Trending/qu/quarkdownQuarkdown 的quarkdown-libs模块承载了官方内置的 Quarkdown 函数库库本身以.qd文件编写随发行包自动分发在主文档中通过.include {name}一句即可加载并复用其中的全部函数。本文基于该模块的 README 及其 源码逐层拆解库的编写 → Gradle 分发 → CLI 定位 → 运行时加载 → 主文档调用的完整链路并给出可复制的实战用法。一、什么是 Quarkdown 库在 Quarkdown 中库library是指用 Quarkdown 语言自身编写的一组可复用声明主要是函数定义、变量与本地化表存放于.qd文件中。与普通被包含的文档不同库的定位是符号的复用载体加载库后库内定义的函数即可在主文档中直接调用而不会把库文件中的 Markdown 内容原样混入正文。quarkdown-libs正是承载这类库的 Gradle 子模块。按 settings.gradle.kts 的include(quarkdown-libs)它被纳入整个 Quarkdown 多模块构建。模块的源码结构非常精简quarkdown-libs/src/main/resources/docs.qd面向文档型输出的布局库quarkdown-libs/src/main/resources/paper.qd面向论文型输出的排版库摘要、定义、引理、定理、证明等块。之所以放在src/main/resources下是因为这些.qd文件属于随发行包发布的静态资源会被 Gradle 原样打包进发行物而不是参与编译。二、库的构建与分发Gradle 自动拷贝到lib/qdREADME 明确了分发规则Gradle 构建系统会自动把src/main/resources中的.qd文件拷贝到发行 zip 的lib/qd目录。也就是说当你下载 Quarkdown 发行包或通过distZip任务自行构建时得到的目标目录结构大致如下与 docs/importing-external-libraries.qd 中的 filetree 一致- quarkdown - lib - qd - docs.qd - paper.qd - ... - bin - quarkdown.jar这个固定目录约定是后续一切库加载机制的地基CLI 的默认库目录、.include {name}的查找范围都建立在其上。三、加载库.include {name}与.include {path}的本质区别在主文档中加载一个库使用.include {name}函数name为库文件名不带.qd扩展名。例如加载paper.qd写作.include {paper}见 docs/importing-external-libraries.qd。这里有一个关键的语义区分官方文档特别用 Note 强调docs/importing-external-libraries.qd与.include {path}不同.include {name}这种方式只加载库中声明的符号函数、变量、本地化表等不会把库文件里的 Markdown 内容追加进正文。因此.include {name}是面向函数库的加载方式而.include {path}是面向子文档内容的引入方式。在 docs/paper-library.qd 中可以看到二者的典型组合使用.include {docs} .include {paper}先加载两个库拿到docs与paper提供的全部函数随后文档正文中就能直接调用.abstract、.definition、.proof等库函数。源码印证.include的查找范围从核心实现看.include {name}的可加载库集合与库目录直接相关。在 quarkdown-core/src/main/kotlin/com/quarkdown/core/context/Context.kt 中运行时上下文同时维护两类集合libraries已加载的库用于函数查找loadableLibraries可从库目录即--libs指定的目录按名加载的外部库注释明确说明它们由用户通过.include {name}函数加载。这从数据结构上印证了文档描述的行为.include {name}并不会立刻把文件内容渲染进文档而是把库注册进上下文的加载库集合供后续函数解析使用。四、指定库目录CLI 选项-l/--libs库目录默认为安装目录/lib/qd即上一节提到的分发约定位置。需要覆盖默认值时使用 CLI 的-l或--libs选项README、docs/importing-external-libraries.qd。该选项的声明位于执行命令的实现中quarkdown-cli/src/main/kotlin/com/quarkdown/cli/exec/ExecuteCommand.kt/** * Optional library directory. * If not set, defaults to the qd/ subdirectory of the resolved install directory. */ private val libraryDirectory: File? by option(-l, --libs, help Library directory) .file( mustExist true, canBeFile false, canBeDir true, )从这段源码可以得到几个精确的约束与默认行为默认值未指定时回退到解析出的安装目录下的qd/子目录即lib/qd必须是已存在目录mustExist true表示路径必须真实存在canBeFile false禁止指向文件canBeDir true要求其确为目录别名短选项-l与长选项--libs等价。典型用法示例quarkdown --libs /path/to/my-libs compile main.qd # 等价写法 quarkdown -l /path/to/my-libs compile main.qd通过该选项指向自己的库目录后lib/qd中同名库会被影子化——loadableLibraries将从你指定的目录解析从而实现库的自定义与替换。五、库的实战源码docs.qd与paper.qd仅理解加载机制还不够真正有价值的是官方库本身的写法。quarkdown-libs恰好提供了两份完整的、可运行的库源码是学习如何用 Quarkdown 编写库的最佳教材。5.1docs.qd文档布局库docs.qd 定义了文档型doctype {docs}输出的整体布局核心思路是用变量集中管理可调参数再把这些参数喂给分页边距布局.doctype {docs} .var {pagelistposition} {lefttop} .var {tocposition} {righttop} .include {.pathtoroot/_setup.qd} .pagemargin {.pagelistposition} .navigation role:{pagelist} .include {.pathtoroot/_nav.qd} .pagemargin {.tocposition} .tableofcontents #! .docname值得注意的库编写要点变量即配置项pagelistposition、tocposition以.var声明并给出默认值用户加载库后可通过同名.var覆盖实现零侵入定制相对根目录引用库内通过.pathtoroot前缀引用仓库根目录下的_setup.qd、_nav.qd保证了库被任意位置的项目加载时路径依然正确#!是不转义内容#! .docname表示原样输出当前文档的文档名而不把它当作普通标题文本渲染。5.2paper.qd论文排版库paper.qd 是更复杂的函数库范例提供了abstract、definition、lemma、theorem、proof五个论文常用块其设计分三层非常值得借鉴。第一层多语言本地化表。.localization {paper}定义了中文、英文、法文、德文、意大利文、日文、波兰文、葡萄牙文、俄文、乌克兰文共 10 种语言的术语映射.localization {paper} - Chinese - abstract: 摘要 - definition: 定义 - lemma: 引理 - proof: 证明 - theorem: 定理 - English - abstract: Abstract ...第二层可调变量。库用注释明确标注每个变量的用途并给出默认值!-- Alignment of the Abstract title, relative to its body content -- .var {abstractalignment} {center} !-- The suffix that follows the title of a block, e.g. Definition, Lemma, ... -- .var {paperblocksuffix} {\.} !-- Content at the end of a proof block -- .var {proofend} {∎}三个变量分别控制摘要标题对齐方式默认居中、块标题后缀默认句点、证明块结尾符号默认 ∎。用户只需在加载库后重新.var即可定制例如.abstractalignment {start}会把摘要标题改为左对齐对应文档 docs/paper-library.qd 中的用法。第三层函数定义。五个公开函数共享内部实现避免重复代码。以abstract为例.function {abstract} content: .container padding:{0 1cm} fullwidth:{yes} .align {.abstractalignment} ####! .localize {paper:abstract} .container padding:{2mm 0} .content .whitespace而definition、lemma、theorem、proof四个编号块则通过内部辅助函数namedparagraph与INTERNALtypedparagraph层层复用namedparagraph接收名称、可选的编号标签和内容利用.numbered生成编号并用.concatenate与.isnotempty在有编号时才拼接 .number最后附加paperblocksuffix后缀INTERNALtypedparagraph根据类型名definition等查本地化表得到标题文本并生成复数形式的编号标签definitions、lemmas等再委托给namedparagraph顶层definition/lemma/theorem/proof一行转调INTERNALtypedparagraph其中proof额外在末尾用.align {end}输出proofend符号.function {proof} content: .INTERNALtypedparagraph {proof} {.content} .align {end} .text {.proofend} size:{huge}这种公开函数薄封装 内部辅助函数复用 变量集中配置的三层结构是编写高质量 Quarkdown 库的推荐范式paper.qd本身就是一份完整的参考实现。六、实战在文档中使用paper库下面把整条链路串起来展示一个真实可运行的使用场景完整用法参见 docs/paper-library.qd。6.1 引入库在文档开头加载库.include {paper}若paper.qd不在默认的lib/qd目录则用-l/--libs指向其所在目录后再编译。6.2 使用abstract块库加载后主文档即可直接调用库函数.abstract This is my *abstract*! Here goes the summary of the document.渲染结果即标准的、带居中标题的摘要块对应文档配图 abstract.png。若希望标题左对齐在调用前覆盖变量.abstractalignment {start} .abstract This is my *abstract*! Here goes the summary of the document.6.3 使用编号块definition / lemma / theorem / proofdefinition、lemma、theorem与proof直接以内容参数调用.theorem For any three points, there is a unique line passing through them. .proof Suppose that two distinct lines pass through the same three points...配合 numbering.qd 中定义的编号格式这些块会自动编号——编号格式名使用复数形式definitions、lemmas、theorems、proofsdocs/paper-library.qd。默认情况下块标题带paperblocksuffix默认\.后缀证明块以proofend默认∎收尾块标题文案随文档语言在 10 种本地化表中自动切换。七、小结从quarkdown-libs模块出发可以总结出 Quarkdown 库机制的完整画像环节机制依据编写库即.qd文件置于src/main/resources可包含函数、变量、本地化表quarkdown-libs/src/main/resources分发Gradle 在构建发行 zip 时自动拷贝.qd到lib/qdREADME定位CLI-l/--libs指定库目录默认lib/qd要求目录必须存在ExecuteCommand.kt加载.include {name}只注册符号、不混入 Markdown 内容加载后函数可直接调用Context.kt、importing-external-libraries.qd复用官方库docs.qd与paper.qd即最佳范例公开函数薄封装、内部函数复用、变量集中配置docs.qd、paper.qd对想要一套排版逻辑多处复用的开发者而言最直接的路径是仿照paper.qd编写自己的.qd库 → 通过-l指向该目录 → 在主文档.include {name}后调用库函数。官方更多用法细节可继续阅读 docs/importing-external-libraries.qd 与 docs/paper-library.qd。【免费下载链接】quarkdown Markdown with superpowers: from ideas to papers, presentations, websites, books, and knowledge bases.项目地址: https://gitcode.com/GitHub_Trending/qu/quarkdown创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/14 13:24:42

相控阵方向图仿真:从阵列信号处理到Matlab代码实现

简介:这是一份面向雷达通信与阵列信号处理学习者的Matlab仿真资源,专注于相控阵雷达方向图的绘制与分析。资源包含可运行的.m源码、对应的.fig交互图以及3张运行结果截图,方便读者直观对比仿真输出与理论结果。压缩包内共5个文件,…

2026/9/14 13:59:47

Go语言WebSocket实战:构建高性能实时通信服务

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/14 13:59:47

Docker 端口占用,Codex 跑排障:Key 用 TaoToken

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/14 13:59:47

Arnis:30 分钟在 Minecraft 里复刻一座真实城市,免费开源

Arnis:30 分钟在 Minecraft 里复刻一座真实城市,免费开源 【免费下载链接】arnis Generate any location from the real world in Minecraft with a high level of detail. 项目地址: https://gitcode.com/GitHub_Trending/ar/arnis 框出老家所在…

2026/9/14 13:59:47

基于YOLO26的高空抛物智能检测系统设计与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/14 13:59:47

SpringBoot+Vue校园招聘管理系统:表设计、权限控制与答辩验证

简介:基于Spring Boot与Vue的校园招聘管理系统,是一份答辩通过的高分毕业设计源码项目,适合Java方向的毕业生或在校学生用于毕业设计、课程设计、期末大作业等场景。系统覆盖企业、职位、简历投递与后台管理等校园招聘核心功能,能…

2026/9/14 13:54:45

Windows 装好 Claude Code,Key 改填 TaoToken

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/14 2:17:50

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/14 0:03:22

KCF目标跟踪算法与OTB工程实现:毕业设计实战解析

简介:这是一份基于KCF核相关滤波算法、融合尺度池与抗遮挡处理的目标检测跟踪MATLAB完整源码,主要面向计算机相关专业准备毕业设计、课程设计或期末大作业的学生,也适合需要项目实战练习的初学者。源码在OTB数据集上完成验证,能够…

2026/9/14 0:03:22

语音情感识别实战:Keras实现LSTM、CNN、SVM与MLP多模型对比

简介:面向语音情感识别入门与进阶开发者,这份基于Keras的项目源码完整实现了LSTM、CNN、SVM、MLP四种模型,兼容Python3.8与Keras/TensorFlow2环境。压缩包内含49个文件,大小约70.31MB,主体包括Python脚本、yaml/json配…

2026/9/14 11:59:31

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/14 13:53:59

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/14 11:22:57

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码