前两天,我出于某种原因升级了本地的node.js。然后我就发现我的博客没法用了,网址打开是一片乱码。经过查询确认,我发现原来是因为hexo不支持高版本的node.js。当时我就折腾了半天版本上的事情。并且升级完之后,还不得不使用新版的next主题。新版主题不支持valine评论系统,所以我不久之前好不容易搞明白的评论系统就又没用了。经此一事,我觉得或许有必要对于自己的网站有更深的理解。
本文中的版本
- hexo 5.4.2
- hexo-cli 4.3.0
- NexT 8.11.1
更新 NexT 主题
更新了 Next 主题。看起来,它的 repo 位置有过几次改变,因此我的升级过程走了一些弯路。不过,这里提供了有用的知识。先不考虑自定义的那些东西,只是把它装上。我留了旧版的 next,然后把新版另起了一个文件夹。
| |
这样,还要在根目录的_config.yml里面改变 theme 为 theme: next-reload。
NexT 主题的美化
以前,我习惯于把 next 主题的个性化设置直接写在themes/next/_config.yml里面,但是这隐含着一种悲观的预期,也就是说,我随时都要准备跑路,也觉得 next 这个主题也随时都要跑路,所以我才为了省事而假装我永远不需要更新 next,而一旦更新,我还需要手动把设置都弄回去。上次,我就忘了这回事,结果把个性化设置弄丢了,还要重新弄一遍。
所以这次我参考了官方文档的说法,把 theme config 拉出来放在 hexo config 里面了。具体做法就是在根目录的_config.yml里面加入你想改变的个性化设置:
| |
设置自己的缩略图
一般来讲,浏览器里显示的网页标签包含标题和缩略图两部分。使用 next 主题时,默认的缩略图是 next 主题的标志,一个六边形加字母 N,令人想到那不勒斯的队徽,十分的晦气。因此我画了一个橘子替代它。在根目录新建一个source\images文件夹,把图片放进去,然后在个性化设置的favicon一栏指向这些图片。
另外,在themes\next-reload\source\css\_variables\Pisces.styl里面调
| |
去掉烦人的边框。
配置 next 主题自带的搜索功能
需要安装一个插件。
| |
在_config.yml里面加上
| |
并且在 next theme config 里面打开local_search。
更改字体
以前用的是黑体。但是最近感觉阅读汉字需要衬线的帮助了,所以决定换成 Noto Serif。在_config.yml里面更改字体设置:
| |
此外,还希望标题弄成稍微粗一点的字体。找了一下,在\themes\next-reload\source\css\_common\components\post\post-header.styl里面的posts-expand .post-title那里,加入
| |
就可以了。
其他
侧边栏加入阅读进度百分比:
scrollpercent: true页脚删除“由 Hexo & NexT.xxx_theme 强力驱动”,换成自定义内容:
1 2 3 4# If not defined, `author` from Hexo `_config.yml` will be used. copyright: 自定义内容 # Powered by Hexo & NexT powered: false设置书签功能:
bookmark默认目录展开:在
_config.yml的toc(table of content)中打开expand_all。添加字数和阅读时间统计:
安装一个插件1 2npm i hexo-word-counter --save hexo clean并打开wordcount。
把某些地方刷橙:在
\themes\next-reload\source\css\_variables\base.styl里面可调。
KaTeX
出于一些原因,还要重装 hexo。每次重装之后,都要调整一些 markdown 渲染的问题,其中最重要的就是公式。以前,我使用 mathjax,但是这回试了一下 katex。看起来后者要快一些。
KaTeX是可汗学院搞出来的一个 JS 库,和 mathjax 一样,用来在网页上显示 LaTeX 排版的东西。感觉原理上,mathjax 输出的是 html 文档,要把 hexo 渲染出来的 html 再渲染一遍。而 katex 是从 tex 代码生成 html 片段,所以比较快。
安装 KaTeX
去掉了自带的渲染器,装上新的:
| |
在根目录的_config.yml最后加上
| |
这里面好像 plugins 不加 markdown-it-katex 也没事,是默认 enable 的。这个渲染器可以弄很多插件,比如 emoji,footnote什么的,不过我暂时并不需要。
$\KaTeX$ 和一般的 $\LaTeX$ 在我的使用范围内没有什么区别。有的东西太久不用也会忘,有一个 cheatsheet。
另外,这个方案下,在$的内部最好没有空格,否则会报警(LaTeX-incompatible input and strict mode is set to 'warn': Unicode text character used in math mode)。公式内换行用\\看起来没啥问题,但是最好留意一下。
KaTeX 实现引用公式的一种办法
更新 现在这一套又用不了了。。。
前面说,katex 的原理是输入 tex,输出 html片段,所以在这情况下,做公式的自动计数和引用是比较难的,似乎 katex 本身还不支持 \ref ,不过我找到了一个别人的办法,参考了一下。
具体来说,hexo 里面肯定是用某种插件实现 katex 渲染的,我是在装 @upupming\hexo-renderer-markdown-it-plus 之后发现它自带了一个 markdown-it-katex,装在 \node_modules/@abreto下面。进去找到\node_modules\@abreto\markdown-it-katex\index.js,看到
| |
于是把options改成
| |
这里面原理就是让 katex 信任 htmlId 和 href,这样就可以定义几个宏,手动把公式的编号打上 html id,然后用超链接的形式去索引他们。
在 KaTeX 的宏定义中,可以以
#数字的形式设置占位符,按顺序对应定义的参数。如\test{1}{2}{3}宏指令的定义若要依次引用第 1、2、3 个参数,就以#1、#2、#3占位即可。占位符可重复引用,不同的占位符最多 9 个。\id指令用\htmlId模拟,用于生成页面内锚点,在 LaTeX 中与\tag或\caption配合使用,所以我们在这里也将\htmlId的第二个参数留空,在页面上不做显示。\ref和\eqref指令都是引用,区别在于后者会加上括号,一般用于公式的引用。我们用\href指令来模拟,第一个参数是跳转的链接,第二个指令是引用显示。一般引用显示都是数字或字母的编号,为了避免被 KaTeX 引擎识别为变量,加一个\text指令。需要注意的是,由于页面锚点的 URL 也是用#表示,这会引发和宏定义占位符的冲突。所幸 KaTeX 的引擎考虑到了这一点,使用两个#,也就是##就可以表示#本身,而不会被当作占位符解析(其实是我试出来的)。
有一个很烦的事情,我刚弄的时候这个东西一直实现不了,最后发现是 html id 相关的内容在 @abreto\markdown-it-katex\node_modules\katex里面缺失了,所以我就十分粗暴地单独安装了一个 katex,然后把这里面的内容直接替换了,结果就好了。
最后的效果就是这样的:
| |
当然,这个时候一定会报
| |
一些以前没有发现的功能
markdown 中使用 html 标签(已经设置了 markdown 渲染器中 html: true):
- 下划线:
<u>underlined</u>=underlined - 带有颜色的字体:
<font color=cyan>colored</font>=colored - 高亮:
<mark>highlighted</mark>=highlighted - 删除线:
<del>deleted</del>=deleted - 波浪线:
<span style="text-decoration-line: underline; text-decoration-style: wavy;">wavy</span>=wavy - 双下划线:
:<span style="text-decoration-line: underline; text-decoration-style: double; ">double underlined </span>=double underlined
hexo 中的标签功能:
| |
一般来说,可以在themes/your_theme/_config.yml里面调整标签的风格。
零敲碎打
- 对于每一篇历史文章都重新手动确定了 categories/分类 和 tags/标签。
- 标签页仍然展示文章目录的问题。具体来说,标签页应该只显示一堆分散的标签,不具备文章的结构,因此自然没有在侧边栏展示文章目录的道理。但是,我使用的 Pisces scheme 仍然有这个性质。以前感觉这是一个小问题,这次顺便就给解决了。在
\themes\next-reload\layout\_macro\sidebar.njk里面把set display_toc那里改成1{%- set display_toc = page.toc.enable and display_toc and page.type != "tags" %}
就可以了。