bananamark-tikz
TikZ图 bananamark. 用TikZ打开(方言的) tikz: true)、TikZ图(```tikz 块, tikzcd 和 tikzpicture (公式中的环境)是bananark的HTML中的占位符,包含其源的元素;这个包使用node-tikzjax (WebAssembly中的一个TeX引擎)在工作线程中编译它们,并将SVG放在它们的位置。节点。
状态
版本0.2,发布于 bananamark (见其 状态):在1.0之前,小版本可能会改变接口。同行的依赖: bananamark 相同的小版本。仅限ES模块;麻省理工学院的执照。
npm install bananamark bananamark-tikz
使用
作为处理器的插件:
import { createProcessor, defineDialect } from 'bananamark';
import { tikz } from 'bananamark-tikz';
const diagrams = tikz({
cache: 'cache/tikz', // compiled diagrams are kept here (a JSON file each); without it, in memory only
fonts: { directory: 'site/fonts' }, // the fonts of diagrams' text are copied here
});
const processor = createProcessor({ dialect: defineDialect({ tikz: true }), plugins: [diagrams] });
const page = await processor.renderAsync(source, { file: 'groups.md', outputPath: 'site/groups/index.html' });
await processor.close(); // closes the plugin: stops its worker
或者在HTML上(比如从网站的模板中截取整个页面):
const diagrams = tikz({ cache: 'cache/tikz', fonts: { directory: 'site/fonts' } });
const html = await diagrams.render(pageHTML, { outputPath: 'site/groups/index.html' });
await diagrams.close();
render(html, page) (postprocess(作为一个插件)给出了带有图表的HTML。 page 是 { outputPath, file, locale, messages }: outputPath,页面的HTML文件,字体的地址是相对于它的; file,文件错误名称(默认为 outputPath); locale 和 messages,有关错误(请参阅 错误;处理器赋予它自己的插件。当图表有文本时 @font-face 它的字体规则之前 </head> 在整个页面上,或者在HTML的开头没有 <head> (一个页面的主体,作为插件看到它)。
一旦每个页面被渲染, prune() 删除缓存不再需要的内容; close() 阻止工人。
选项
| 选项 | 意义 | 默认的 |
|---|---|---|
cache | 编译图保存在目录中 | 仅在内存中 |
fonts | { directory }:一个页面的图表使用的字体在那里被复制(带有他们的许可),并且该页面从其HTML文件中引用他们的路径;或 { href(font, outputPath) }:字体地址 | 无:带有文本的图表是错误的 |
timeout | 一个图表最长的编译时间,以毫秒为单位。一个图表用完后会被记住10分钟:没有时间允许的实例会立即失败 | 15000 |
totalTimeout | 时间,以毫秒为单位,这个实例可能花费在编译上(一个预览:一个有许多慢图的草稿不能占用队列);失败后的图表 | 没有限制 |
workerIdleTimeout | 以毫秒为单位,实例共享一个工作线程(大约0.5秒启动,370 MB),在最后一个工作线程关闭后保持这么长时间 | 每个实例都有自己的worker |
locale, messages | 错误的语言和调用者的消息,作为bananark的选项(这个包自己的消息: tikz_failed, tikz_command, tikz_unsafe, tikz_timeout, tikz_total_timeout, tikz_worker_exit),翻过这一页 | 页面的;否则 'en' |
输出
占位符(bm-tikz-source,他的 code.bm-tikz-code 显示编译前的源代码)变为 bm-tikz-rendered,保持SVG span.bm-tikz-body (svg.bm-tikz-svg;汉字 bm-tikz-cjk). 有编号的图表 span.bm-tikz-layout,它的数量在 span.bm-tikz-tag, --bm-tikz-tag-space 数字的宽度。
可以使用哪些图表
- 特克斯包
tikz-cd,amsmath,amssymb和array;TikZ库加载一个图表\usetikzlibrary{…}. - 的命令
\coloneqq,\eqqcolon,\bra,\ket,\braket,\set,\Set和\bm,以及Unicode数学符号、希腊字母和直接输入的重音拉丁字母,如KaTeX。 - 汉字,用页面的字体绘制。
- 不是bananamark
katex宏:除KaTeX外,图表由TeX编译。目前还没有来电者的序言选项。 - 不
\special,在图的源代码的任何地方(也有注释):它按原样写入SVG。这个图表是错误的。tikz_command),当它在缓存中时也是如此。 - 只有一幅画出来了:如果一个图的SVG有一个TikZ没有使用的元素(链接、脚本、动画、嵌入内容)、一个事件处理程序、一个图片外的引用或一个标记声明,那么这个图就是一个错误(
tikz_unsafe),不管TeX是怎么写的。SVG中没有删除任何内容;检查在使用每个图时运行,也从缓存运行。
图表是如何绘制的?
- 一个图表的公式是由TeX编写的:几个图表,
\left…\right或1附近的分数是由TeX布置的,遵循LaTeX而不是KaTeX (KaTeX自己的命令不在那里)。一个\tag它的周围是分开编译的,放在右边,所以数字和参考文献保留了下来。内联一行tikzcd在其细胞的基线上对齐;一个tikzpicture像往常一样baseline=(node.base). - SVG是TeX引擎自己的绘图,校正了上游转换器的偏移量(0.27 pt),使其与公式框对齐。页面只显示它:浏览器中没有测量或移动任何东西,而且它显示时没有使用JavaScript。
- 中文:引擎没有中文字体。每个汉字和全宽标点符号被声明为TeX,作为一个1 em宽的方框(在文本的大小上:公式的放大,1.1,无效),高85%,深15%;TeX在这些框周围放置节点、标签和箭头,SVG将字符写入
<text>我把他们接到哪儿去了dvisvgm:raw),用页面的字体绘制,textLength保持它们的宽度。一行中的字符为一个<text>,所以一个单词在一行上复制。尺寸遵循数学风格,粗体和斜体遵循TeX的字体,颜色和旋转遵循TikZ的字体。 - 这不是CTeX或xeCJK:宽度是假设的,而不是从读者的字体中测量的(是否显示稀有字符取决于它们),中文文本没有断行,行尾没有标点符号规则,也没有垂直文本。用ASCII写节点名;中文是用来展示的。
- 重音拉丁字母被声明为TeX的重音,所以
\text{Möbius}和\mathsf{Ét}可以直接输入。 - 抄写使汉字原封不动;西方的数学是在引擎的BaKoMa字体中,其希腊字母、符号和大括号可以作为其他字符复制。图没有MathML。
缓存
编译后的图由输入(源,显示,模式),编译器代码,引擎版本和它得到的序言(上面的可选行只有在图使用它们时才在其中)的散列保存:更改一个命令只会再次编译使用它的图。
prune({ maxAge }):在渲染每个页面后,删除此实例未使用的缓存文件,并且其中没有使用任何文件maxAge(ms,默认一周:在线编辑的草稿保留他们的)。返回已删除的号码。- TeX失败的图被记住(最近的200次失败),不再编译;一场没有时间的演讲,持续了十分钟
timeout不再是。几页同时需要的图表只编译一次。
错误
当图表无法编译时, render 扔一个香蕉马克 BananamarkError:它的消息是文件和原因("groups。md: TikZ编译失败:…"和TeX的错误), error.file 这个文件, error.code 和 error.params 消息的键和值(tikz_failed,其中TeX的误差为 params.message; tikz_command,使用 \special,命令为 params.command; tikz_unsafe,一个不仅仅是绘图的SVG,它被发现为 params.found; tikz_timeout 和 tikz_total_timeout, seconds; tikz_worker_exit,工人的退出 code), error.cause 下面的误差。单词在实例中 locale 和 messages或者页面的(处理器会给它自己的插件)默认是英文的;没有这些键的呼叫者的区域设置使用英语。
贡献
测试:看 CONTRIBUTING.md.