之前写 的时候为了省事定义了一堆 \newcommand
,但是到了这里的 Markdown 就几乎没法用了。之前在写 另一个测试 的时候没有自定义命令用写得有点痛苦,于是就想用点什么办法把之前自己定义过的 \newcommand
搬过来。虽然不知道什么时候会用上,但还是先把这个做了。
注意到直接在公式里写 \newcommand
是没有问题的,例如 $\newcommand\p\pi\p$
就是 ,但我的 \newcommand
有几十个,每写一个公式就把这些东西复制一遍显然不现实。好在可以用脚本在渲染前对内容进行预处理,由于公式中不会出现 %
,直接把 $%
替换为 $
加上提前准备好的自定义命令就好了。找 LLM 写了脚本,为了方便改配置,把自定义命令放到网站的 config.latex_new_command
里了。本来没想处理代码块的情况,但想到正在写的这篇,就把代码块内部的 $%
排除了。
hexo.extend.filter.register('before_post_render', function(data) {
const latexCommand = hexo.config.latex_new_command;
if (latexCommand) {
const codeBlockParts = data.content.split(/((?:^|\n)\s*```[^\n]*[\s\S]*?\n\s*```\s*(?:\n|$))/g);
for (let i = 0; i < codeBlockParts.length; i++) {
if (i % 2 === 0) {
const inlineCodeParts = codeBlockParts[i].split(/(`(?:\\.|[^`])*?`)/g);
for (let j = 0; j < inlineCodeParts.length; j++) {
if (j % 2 === 0) {
inlineCodeParts[j] = inlineCodeParts[j].replace(/\$\%/g, `$${latexCommand}`);
}
}
codeBlockParts[i] = inlineCodeParts.join('');
}
}
data.content = codeBlockParts.join('');
}
return data;
}, 8);
狠狠测试一下(胡言乱语)
顺便改了一下主题的渲染,这样文章标题也支持 Markdown 了。