bananamark

中文文档
0.2.1发布于 2026/11/03MITES Module

用于数学写作的Markdown方言:公式,编号章节和定理,交叉引用,参考书目,维基链接和中文排版,呈现为HTML

中文使用文档
文档目录8 节
  1. 安装
  2. 从命令行
  3. 在程序中
  4. 语法
  5. 包
  6. 文档
  7. 状态
  8. 贡献

bananamark

香蕉语是Markdown的数学写作方言。它向Markdown添加TeX公式、编号的章节和定理以及交叉引用,并将文档呈现为HTML。

## Groups

::: definition [Group] {@def:group}
A **group** is a set with an associative operation, an identity $e$ and inverses.
:::

By @def:group, every group has an identity.

这里的章节编号为1,定义的标题为“definition 1.1 (Group)”,参考文献变为阅读“definition 1.1”的链接。

它还支持参考书目、脚注、TikZ图表和中文排版。它可以用作命令或库,并呈现的页面 香蕉空间,中文数学维基。

安装

npm install bananamark       # in a project
npm install -g bananamark    # for the command, anywhere

或不安装: npx bananamark file.md. 节点22及以上版本。

从命令行

bananamark file.md

写 file.html 在文件旁边:一个包含其样式表和字体的整个页面,它可以自己打开并离线工作。错误将其行命名为(file.md:5: unknown theorem environment: nope),命令以状态1退出。

选项意义
-o, --output <file>HTML的去向; - 用于标准输出
--fragment只有主体的HTML,才能放入您自己的页面(样式) bananamark/style.css 和 bananamark/katex.css)
--css <file or URL>在其他样式表之后添加的样式表,因此具有优先级:嵌入文件,链接URL。可以给几次吗
--no-default-style省略了bananark的外观和页面布局,只保留公式所需的内容
--lang <code>页面语言如下: zh-cn 给出了中文排版和在前面的问题上;默认的 en
--locale <code>错误的语言, en 或者 zh-cn;默认的 en
--dialect <file>一个模块,包含 方言 (下图)
--tikz编译TikZ图(如下)
-h, --help; -v, --version

与 - 作为文件,它读取标准输入并写入标准输出。

样式表。 一个页面包含KaTeX的样式表和字体,以及bananark的 样式表 还有几行布局。给定的文件 --css 在这些之后,所以一些规则足以改变外观。环境的颜色是自定义属性:

/* mine.css, for bananamark file.md --css mine.css */
:root { --bm-accent-theorem: crimson; }
a { color: teal; }
body { font-family: sans-serif; }

从无到有,添加 --no-default-style. 嵌入文件中的地址从页面开始,而不是从文件开始。

前事。 的行之间,文件开头的一个YAML块 ---,是可选的。命令如下 title (显示为页面的标题,它可能包含公式), lang, numbering 和 typography (见 编号 和 排版),并忽略其他字段。

---
title: Groups and $\mathbb{Z}$
lang: en
---

## Definition {@sec:def}
…

没有一个 title,则页面的标题是其第一个标题的文本,否则就是文件名。相对图像地址是按原样编写的,因此它们保存HTML所在的位置。

它写的是什么。 参考书目随处可见 代码的语言 突出显示;Wiki链接是关闭的,因为单个文件没有站点供它们访问,所以 [[…]] 保持文本。要更改或添加宏,请给出 --dialect 导出方言设置的模块。它不需要导入,所以它可以在任何安装命令的地方工作:

// dialect.mjs
export default { wikiLinks: true, katex: { macros: { '\\RR': '\\mathbb{R}' } } };

模块可以导出what defineDialect 返回(作为其默认值,或作为 dialect),然后按原样使用。这需要相同的副本 bananamark 作为命令,在项目中安装这两个命令。

TikZ。 图需要单独的包 bananamark-tikz,安装在旁边 bananamark. 与 --tikz (或方言) tikz: true)它们被编译成SVG,它们的字体也被放在页面中;没有它, ```tikz 块是普通的代码块。要在不安装的情况下尝试: npx -p bananamark -p bananamark-tikz bananamark file.md --tikz.

在程序中

import { renderDocument } from 'bananamark';
import 'bananamark/katex.css';   // with a bundler; or serve katex/dist/ of the same KaTeX version, 0.18.4
import 'bananamark/style.css';   // a plain look, to start from

const source = '## Groups {@sec:groups}\n\n::: definition [Group] {@def:group}\nA set with an operation…\n:::\n\nBy @def:group, $e$ is unique.';
const result = renderDocument(source, { file: 'groups.md' });
result.html;       // the body's HTML: "Definition 1.1 (Group)", "By Definition 1.1, …"
result.headings;   // [{ level: 2, id: 'groups', number: '1', title: 'Groups' }]

要渲染多个页面,一次创建一个处理器:

import { createProcessor, defineDialect } from 'bananamark';

const dialect = defineDialect({ wikiLinks: true, bibliography: true });
const processor = createProcessor({
  dialect,
  resolveWikiLink: target => articles.has(target) ? { url: `/wiki/${encodeURIComponent(target)}/` } : undefined,
});
for (const [file, source] of pages) output.set(file, processor.render(source, { file }).html);

页面的首页内容是调用者的:在呈现之前删除它,然后给出 lineOffset (正文前的行数),以便错误指向文件自己的行。

语法

通用标记与GFM表格,划线和脚注,以及:

特征写
公式$…$, \(…\);显示 $$…$$, \[…\];编号: ```math {@eq:label} 块
部分## 标题是编号的; ## Title* 不是; {@sec:label} 最后声明一个标签
Theorem-like环境::: theorem [Title] {@thm:label} … :::; ::: definition (Name) 给环境起了自己的名字, remark* 是数不清的; ::: proof (类型:看 默认的环境)
交叉引用@label, {@label}, @-label (单是数字), [text](@label)
标签列表项(a), iv), (A1) 诸如列表标记; (a) {@it:label} text 可以参考
数据块Fenced阻塞调用者名称,保存有关该页的数据,不显示(参见 数据块)
html样式标签<lang de>…</lang>;调用者可以添加自己的,而香蕉是现成的 <align right>…</align> 和 <spoiler title="…">…</spoiler> (见 html样式标签)
图像的宽度![caption](image.png){width=200}: width (整个像素)变成 <img width>
排版中文排字(见 排版); 直引号变成了大引号(参见 引号), --, --- 和 ... 变成-,-,…
裸露的地址https://…, http://…, www.… 电子邮件地址也变成了链接,就在汉字后面。地址是ASCII格式,并以非ASCII格式的第一个字符结束; ?!.,:;*_~ 和不平衡 ) 在它的尽头不是它的一部分。将其他人写为 [text](…) 或者 <…>
Wiki连结(wikiLinks)[[Target]], [[Target|text]];目标可能持有公式
参考文献(bibliography)一个 ```bibliography block (YAML; fields:参见 参考书目字段); @key 文中引用了一个条目
TikZ (tikz)一个 ```tikz 块({caption="…"} 后 tikz 给它一个标题), tikzcd 和 tikzpicture 公式中的环境(由 bananamark-tikz)

最后三个是关闭的,除非方言打开它们(参见 方言):否则 [[…]] 为文本,且 ```bibliography 和 ```tikz 块是普通的代码块。

在这些文档中 标签 是引用的目标({@thm:a}); <lang> 类似的还有 html样式标签。这个 参考 完整地描述了每个特性,规范文件用示例展示了每个特性。

包

包为什么
bananamark (一)在Node或浏览器中将页面呈现为HTML
bananamark-tikzTikZ图(```tikz 块, tikzcd 在公式中)编译成SVG;节点只
bananamark-codemirror在CodeMirror 6中编辑方言:高亮显示,补全,键入时检查

一个站点呈现为 bananamark (加上 bananamark-tikz 图);浏览器中的编辑器添加 bananamark-codemirror. 描述一下这个地方的方言 defineDialect,在自己的模块中,并将其分配给每个模块,以便编辑器像渲染器一样读取页面:

// dialect.js, imported by the site's build and by its editor
import { alignTag, defineDialect } from 'bananamark';
export const dialect = defineDialect({ wikiLinks: true, tags: { align: alignTag } });

// the build
createProcessor({ dialect, resolveWikiLink });
// the editor
new EditorView({ extensions: [basicSetup, bananamark({ dialect })] });   // bananamark-codemirror

文档

  • REFERENCE.md:所有细节:语法,选项,钩子,结果及其错误,消息,扩展,书籍,HTML,排版,KaTeX,高亮显示和API。
  • test/spec/一致性示例,它是方言的规范,保存在存储库中(不在NPM包中)。
  • CHANGELOG.md:每个版本都有什么变化。

状态

  • 0.2版。在1.0之前,一个小版本(0.3)可能会改变接口和规范描述的HTML;补丁版本(0.2.1)没有。三个软件包一起发布,版本相同; bananamark-codemirror 和 bananamark-tikz 采取 bananamark 作为同一次要版本的对等依赖。
  • 节点22及以后版本;从2023年开始的浏览器(样式表需要) :has())。
  • 仅限ES模块。还没有TypeScript类型。
  • 麻省理工学院的执照。

贡献

测试,规范的示例以及如何更新它们:参见 CONTRIBUTING.md.

版本与发布记录

bananamark 共发布 4 个版本,首次发布于 2026/10/28;过去 12 个月发布了 4 个版本。

版本发布日期距今
0.2.1latest2026/11/03今天
0.2.02026/11/012 天前
0.1.02026/10/286 天前
0.0.0-stage2026/10/286 天前

关于 bananamark 的常见问题

bananamark 是什么?

用于数学写作的Markdown方言:公式,编号章节和定理,交叉引用,参考书目,维基链接和中文排版,呈现为HTML

如何安装 bananamark?

在项目目录运行 npm install bananamark,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:@lezer/common(^1.5.3)、@lezer/markdown(^1.8.0)、@lezer/highlight(^1.2.5)、@codemirror/language(^6.13.1)、@codemirror/lang-yaml(^6.1.3)、@codemirror/lang-markdown(^6.5.2)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。它还提供命令行工具 bananamark,可以用 npx bananamark 直接运行。

bananamark 支持 TypeScript 吗?

该包的 package.json 没有声明类型入口。需要类型提示时,可以在 npm 上查找社区维护的 @types/bananamark 是否存在。

bananamark 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

bananamark 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=22。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

bananamark 可以商用吗?

bananamark 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

bananamark 还在维护吗?

最新版本 0.2.1 发布于 2026/11/03(今天);至今共发布 4 个版本,其中过去 12 个月发布了 4 个;首次发布于 2026/10/28。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。