LOADING

加载过慢请开启缓存 浏览器默认开启

想在 $\KaTeX$ 里用 \newcommand

2025/1/31 一些记录

之前写 的时候为了省事定义了一堆 \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 了。