BNU-FZH

fengzhenhua@outlook.com

Linux 下的下载工具算是很丰富的了,目前主流的有 FDM、Motrix、迅雷、uGet 等等。但是今天的主角 Motrix 算是比较全能的一位了。

Motrix 除了支持常规的 http 下载,还支持 BT、磁力甚至迅雷链接。当然,ed2k 电驴链接暂不支持。Motrix 的外观走小清新风格,简洁明快,点缀配色恰到好处,选项设置简单明了。
Motrix 官网:https://motrix.app

Motrix 提供了 deb 安装包和 Appimage 包,对新手用户非常友好,各个主流 Linux 发行版都可以使用。

安装后,启动 Motrix,真的是没有任何多余的按钮和功能,简洁实用,上手使用没有任何难度。看上去也非常舒服。

添加一个 BT 下载任务进行测试。当然也可以同时添加多个任务。

在种子资源足够的情况下,Motrix 下载基本上能达到满速,非常不错。

添加一个迅雷链接进行测试。可能会提示资源不一定存在,不管它,先下载试试看。

Motrix 下载一些热门迅雷资源还是没问题,速度也不错。但是毕竟不是原生迅雷,在部分资源解析方面,尤其是对于冷门资源,Motrix 还是容易下载失败。不过也没关系,现在迅雷链接已经不复当年盛况,主流的 BT 和磁力就够用了。

进入 Motrix 的设置页面,在基础设置里,就是一些外观界面、保存路径、限速、任务数量、消息通知等设置,一看就会。

在进阶设置页面,值得称赞的是,Motrix 默认添加了 Tracker 服务器,不必像 Qbittorrent 那样手动添加了。而且 Motrix 的 Tracker 服务器列表还是每天自动更新。对于BT和磁力下载而言,真是太有帮助了。

特别值得一提的是,Motrix 可以设置模拟用户代理,直接点击下方的客户端即可,其中 du 是指百度网盘,对于使用 x 猴脚本的用户而言,这个可是非常有用。

小结:相较于 FDM,Motrix 功能更为全面,界面也更好看,一些黑科技功能也更好用。当然,Motrix 能提供各大浏览器扩展就更完美了。

局域网文件传送,主要用于手机与电脑或者手机与手机之间,对于 Linux 用户而言,站长薄荷君之前推荐过 LANDrop、Dukto、Feem 等。随着时过境迁,很多优秀的开源项目都没有维护了,目前能够良好支持手机与电脑(Linux)的局域网文件传送工具中,Feem 算是不错的了。当然,美中不足是有广告。

现在,LocalSend 来了!

顾名思义,LocalSend 就是本地传送工具。这是一款开源软件,可以良好支持 Linux、MacOS 和 Windows 电脑平台,也良好支持 Android 和 iOS 移动平台。而且,LocalSend 的界面非常简洁清新,颇有原生 Android 系统的风格。关键是没有广告!

更贴心的是,LocalSend 为 Linux 用户提供了 Deb 安装包和 Appimage 包,主流 Linux 发行版都可以无忧使用,真是太棒了!
LocalSend 官网:https://localsend.org/

启动 LocalSend,接收、发送、设置,三大功能,没有任何多余的元素,而且中文化非常好。

在发送页面,就可以看到在同一局域网内运行 LocalSend 的其他设备。

薄荷君实测,通过 iPhone 向电脑(Linux)发送文件,如图所示,这是电脑端提示接收的界面。当然还可以设置成自动接收。

这是传送过程以及完成的界面。

要发送文件(图片、文件夹都可以),先点击添加,添加本地文件,然后点击下方的其他设备,向其发送。

等待目标设备接收。

局域网传送,速度很快。

在看看 LocalSend 的设置选项,都是中文见面,一看就会,毫无难度。

小结:LocalSend 无论是从界面布局、外观颜值还是功能便捷性方面都是当今最好的局域网文件传送工具,强烈推荐大家使用!

文学编程是 TeX 的作者高德纳提出的编程方式,主张程序员在编写代码的过程中详细地记录自己的思维方式和内在逻辑。这种编程方式注重编码的逻辑而将编码本身放在更次要的位置,因而不充分的设计在这种编程方式下无所遁形。文学编程的另一个优点是它产生的代码文档能帮助程序员在任意时候重新会想起当时编码的思路。

在 LaTeX 中,可以用 Doc 和 DocStrip 这两个工具来实现文学编程。

对于程序员来说,最重要的有三个部分:

  • 代码;
  • 代码文档;
  • 用户手册。

使用 Doc 和 DocStrip 可以将这三个部分集中到一个 .dtx 文件当中。这篇文章将分三个部分讲述如何构建这样一个 .dtx 文件。

.ins 文件

INS 三个字母是「Install」的缩写,顾名思义,这个文件是和安装相关的。.ins 文件通常用来控制 TeX 从 .dtx 文件里释放宏包文件,它的结构最为简单,大概是这样的。

  1. 作为注释的版权信息
  2. 载入 docstrip.tex
  3. 写入 DocStrip 的控制命令
  4. 编写将写入生成文件的版权信息
  5. 生成文件指令
  6. 写入提示信息用以完成安装
  7. 结束安装文件

这里粗体标记的是必不可少的部分,其他部分或多或少都可以省略。

我们逐步构建一个完整的 .ins 文件。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
%% Copyright (C) 2003--2015
%% CTEX.ORG and any individual authors listed elsewhere in this file.
%% --------------------------------------------------------------------------
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either
%% version 1.3c of this license or (at your option) any later
%% version. This version of this license is in
%% http://www.latex-project.org/lppl/lppl-1-3c.txt
%% and the latest version of this license is in
%% http://www.latex-project.org/lppl.txt
%% and version 1.3 or later is part of all distributions of
%% LaTeX version 2005/12/01 or later.
%%
%% This work has the LPPL maintenance status `maintained'.
%%
%% The Current Maintainers of this work are Leo Liu, Qing Lee and Liam Huang.
%% --------------------------------------------------------------------------

这是 ctex 宏包的版权声明信息。

  • 这里的每一行都以百分号开头,因此在声明版权的同时不会影响正常的编译流程。
  • 版权声明部分,首先是声明版权的归属。
  • 接下来,声明许可协议为 LPPL。大多数 TeX 相关的宏包或软件,都在 LPPL 协议下发布。

1
\input docstrip.tex

载入 docstrip.tex


1
\keepsilent

这是 DocStrip 的控制命令之一,其作用是关闭 DocStrip 的日志输出功能。默认情况下,DocStrip 会详细输出它的每一步操作。对于大多数人来说,成百上千行的日志徒惹人嫌弃,因此我们关闭它。

更多的控制命令可以参考 DocStrip 的文档。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
\preamble

Copyright (C) 2003-2015
CTEX.ORG and any individual authors listed in the documentation.
------------------------------------------------------------------------------

This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either
version 1.3c of this license or (at your option) any later
version. This version of this license is in
http://www.latex-project.org/lppl/lppl-1-3c.txt
and the latest version of this license is in
http://www.latex-project.org/lppl.txt
and version 1.3 or later is part of all distributions of
LaTeX version 2005/12/01 or later.

This work has the LPPL maintenance status `maintained'.

The Current Maintainers of this work are Leo Liu, Qing Lee and Liam Huang.
------------------------------------------------------------------------------

\endpreamble

\preamble\endpreamble 之间的部分,将被写入由 DocStrip 生成的所有文档(默认情况下)。比如上面这段 ctex 宏包的版权信息将写入每一个生成的文件。


下面的内容是整个 .ins 文件里最重要的部分,它控制着如何生成最终的宏包文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
\generate
{
\usedir{tex/latex/ctex}
\file{ctex.sty} {\from{\jobname.dtx}{package,style}}
\file{ctexcap.sty} {\from{\jobname.dtx}{package,ctexcap}}
\file{ctexsize.sty} {\from{\jobname.dtx}{package,ctexsize}}
\file{ctexart.cls} {\from{\jobname.dtx}{class,article}}
\file{ctexbook.cls} {\from{\jobname.dtx}{class,book}}
\file{ctexrep.cls} {\from{\jobname.dtx}{class,report}}
\file{ctexspa.def}
{
\from{\jobname.dtx} {ctexspa}
\from{ctexpunct.spa} {}
}
}

\generate 命令中的\file{⟨filename⟩}{\from{⟨sourcefilename⟩}{⟨optionlist⟩}} 用来指定宏包文件的生成方式。这里的含义是,从 ⟨sourcefilename⟩ 中抽取含有 ⟨optionlist⟩ 标记的部分,生成 ⟨filename⟩ 这个文件。

一个 \generate 里可以有多个 \file 命令。一个 \file 命令里可以有多个 \from 命令。一个 \from 命令里的 ⟨option⟩,组成 ⟨optionlist⟩。其中 ⟨option⟩ 需要用逗号隔开,\file 之间和 \from 之间则不需要。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
\obeyspaces
\Msg{*************************************************************}
\Msg{* *}
\Msg{* To finish the installation you have to move the following *}
\Msg{* file into proper directories searched by TeX: *}
\Msg{* *}
\Msg{* The recommended directory is TDS:tex/latex/ctex *}
\Msg{* *}
\Msg{* ctex.sty *}
\Msg{* ctexcap.sty *}
\Msg{* ctexsize.sty *}
\Msg{* ctexart.cls *}
\Msg{* ctexbook.cls *}
\Msg{* ctexrep.cls *}
\Msg{* ctexspa.def *}
\Msg{* *}
\Msg{* To produce the documentation run the file ctex.dtx *}
\Msg{* through XeLaTeX. *}
\Msg{* *}
\Msg{* Happy TeXing! *}
\Msg{* *}
\Msg{*************************************************************}

这里的内容会在处理完 .ins 文件之后显示在控制台,用来提示使用者将文件置入指定的目录。TeX 会忽略连续的空格,第一行的 \obeyspaces 则会让 TeX 输出这些空格。


1
\endbatchfile

显式地结束安装文件,此后的所有内容都会被忽略。

将上面的代码依次粘贴到一起,就是一个最简单的 .ins 文件了。

.dtx 文件

.dtx 文件比 .ins 文件复杂得多。.ins 文件在整个过程中会被读取一次,而 .dtx 文件却会被读取三次。下面是对此三个步骤的简略描述。如果暂时看不懂也没有关系,下一节我们将会化身人肉编译器,逐行分析示例。

处理 .ins 文件的时候,会载入 .dtx 文件。这时候 .dtx 文件中以 % 开头的行将被全部忽略,而以 % 开头的行则会用于记录 ⟨option⟩。程序会根据 .ins 文件中 \generate 命令里 \from 的指示的 ⟨option⟩ 抽取 .dtx 文件中 ⟨option⟩ 相关内容。这个过程中,没有以 % 开头的行会根据 ⟨option⟩ 写入文件,而 % 开头的行则被抑制并保护起来。最终生成宏包文件。

第二遍处理 .dtx 文件的时候,在读入 \documentclass{ltxdoc} 之前,所有的内容与通常意义上的 LaTeX 代码完全一致。因此需要依靠 \iffalse% \iffalse 来保护相关代码,这些代码通常是 README 文件和 LICENSE 文件。在读入 \DocInput{filename.dtx} 之后,.dtx 文件会被第三次载入处理。处理完成之后遇到 \end{document},后续的内容被全部忽略。最终生成说明文档。

第三遍处理 .dtx 是被 \DocInput 载入的。此时,文档内(几乎)所有的 % 都被忽略。因为 LaTeX 只能有一个 \documentclass 以及一对 \begin{document}\end{document},所以 \end{document} 之前的所有内容都应当在这一次处理的时候被忽略。因此这部分内容应该被 \iffalse\fi 保护起来。

.dtx 文件由以下部分组成。

  1. 包含在 % \iffalse% \fi 中间的版权信息
  2. 包含在 % \iffalse% \fi 中间的宏包基本信息
  3. 包含在 %<*driver>%</driver> 中间的 ltxdoc 文档类及相关代码,这部分代码也应包含在 % \iffalse% \fi 中间
  4. \end{document} 之后的说明文档,这部分文档应该隐藏在行首的 % 之后
  5. 在说明文档最后的代码说明,以及间杂在代码说明中间的代码,其中代码说明也应该隐藏在行首的 % 之后,而代码本身则不应该被 % 保护

示例 .dtx 文件的具体内容,可以参看下一节。

人肉编译器

我们来看两个文件,分别是 dtxtut.insdtxtut.dtx。你可以下载这两个文件,然后跟着我的思路一起分析。

首先我们要生成宏包文件,在命令行中运行

1
xelatex dtxtut.ins

注意,这里的后缀名不可省略。

文件读入之后,直到 12 行都是注释,直接忽略。接着到了第 13 行,读入了 docstrip.tex 这个文件。随后进行了一些设置之后来到了第 26 行.

1
\generate{\file{\jobname.sty}{\from{\jobname.dtx}{package}}}

这里 \jobname 是当前文件的名字(不含后缀),即 dtxtut。所以这里会从 dtxtut.dtx 文件中,抽取 package 的部分,组成名为 dtxtut.sty 这个文件。

现在我们读取 dtxtut.dtx。前 18 行都是注释,忽略。19 -- 21 行是 package 部分,输出。23 行开始了名为 driver 的部分,直到 32 行结束。接下来一直到 81 行都是注释,忽略。82行开始了名为 package 的部分,于是程序将 82 行开始到 100 行中没有注释掉的部分抽出来,输出。这样,输出的内容接在 \preamble 之后,保存为 dtxtut.sty 文件。

接下来我们生成宏包文档,在命令行中运行

1
xelatex dtxtut.dtx

同样,这里的后缀名不可省略。

前 23 行都是注释,忽略。24 行载入了 ltxdoc 文档类,随后载入了刚刚生成的 dtxtut.sty 宏包。26 行的 \EnableCrossrefs 打开了代码索引的生成(如果你将来不需要,可以用 \DisableCrossrefs 打开)。27 行的 \CodelineIndex 则使得索引指向代码行号,而不是页码。28 行的 \RecordChanges 则会让文档类记录宏包的变化记录。

接下来,30 行的 \DocInput{\jobname.dtx} 重新载入了这个文件本身,但(几乎)所有的 % 符号都被忽略。第 1 行遇到 \iffalse,直到 16 行的 \fi,中间的内容都被忽略。17 行是空行。18 行又遇到 \iffalse,直到 33 行的 \fi,中间的内容都被忽略。注意,这里正好跳过了 driver 部分。

接下来的 \CheckSum\CharacterTable 是为了检测 .dtx 文件完整性的两个工具。众所周知,.dtx 文件包含了一个宏包的几乎所有信息,如果文件在网络传输的过程中出错,则宏包安装必然失败。因此,检测文件的完整性就变得很有必要。

\CheckSum 采用了一个很简单的方案来检验完整性。它将从 \StopEventually 开始到 \Finale 结尾的,在 macrocode 环境里的反斜杠 \ 计数,将计数的值作为校验和。在生成文档的过程中,程序将会计算这个值,并于 \CheckSum{} 中的值进行比对。若二者不一致,则说明传输过程中可能出现错误。

\CharacterTable 更为直接一点。程序将检查代码中出现的符号均包含在 \CharacterTable 之中。若不然,则认为传输过程中可能出错。

接下来的内容,直到第 76 行都很好理解。77 行出现了 \StopEventually 命令,并在参数中启动了 \PrintIndex 命令。我们刚才说了 \StopEventually 会开启校验和的检查,而 \PrintIndex 则会在此处打印代码索引。

macrocode 环境是一个特殊的环境,它有点类似于 LaTeX 原生的 verbatim 环境。它在大多数情况下的行为和 verbatim 环境相同,大体上是将代码输出到最终的文档当中。

这样持续运行到 103 行,遇到 \Finale 命令,校验和计算的终点。此时,程序将会计算出校验和,并与文档中给出的校验和进行比较。如果 \CheckSum 不存在,或者给出的值为 0,那么程序会给出正确的值,让你填入文档。如果 \CheckSum 存在,但值与程序计算的不符,那么程序会报错,并给出正确的值。改正后重新编译才能得到文档。如果 \CheckSum 存在,且校验和通过,那么程序会继续运行。

104 行是 \endinput,结束整个文件,本次对 dtxtut.dtx 的处理结束,回到上一次的断点。

30 行之后,31 行就是 \end{document},文档处理结束,之后的内容全都被忽略。输出文档,退出。

.dtx.ins 合二为一

细心的读者会发现,整个过程中,.dtx 文件承担了几乎所有的功能,而 .ins 文件只是一个「指路人」。这些读者可能会思考,是不是有办法将 .ins 文件并入 .dtx 文件呢?答案是肯定的。

对于这类合二为一的 .dtx 文件,使用 Plain TeX 格式编译,会启动 DocStrip 工具,得到宏包文件;使用 LaTeX 格式编译,则会生成文档。

这里给出一个来自知乎提问示例(略有修改),你可以在我的答案里看到对此的具体分析。

引用

PDF Mix Tool是Linux下的最佳 PDF 编辑软件之一,也是PDF Arranger的替代品。它是一个用于操作 pdf 文件的简洁的 GUI 工具,可以修改文件(旋转、拆分、从文件中提取),但是不能编辑PDF文件的内容。虽然这个应用程序只提供了一个简洁的工具集,没有附带很多工具,但是,也足以应付日常的使用了。

安装

1
sudo pacman -S pdfmixtool

软件功能

  1. 在新发布的版本中有一个左侧边栏
    在侧边栏中包括你可能需要执行的所有操作的图标。虽然这不是一个重大变化,但是,这有助于增强用户的使用体验。 PdfMixTool侧边栏

  2. PDF元数据编辑
    现在可以修改文档的标题、作者、主题、关键字、创建者、制作者以及创建和修改日期。因此,你可以轻松编辑文档的元数据。 PdfMixTool元数据编辑

  3. 支持Qt6.0
    PDF Mix Tool 是用 C++ 编写的,它依赖于qpdf和Qt库来实现相关功能。

  4. 其他改进

    • PDF Mix Tool 现在在页面组合中添加了从右到左的支持。
    • 在所有操作中都尽可能保留链接、注释和轮廓。
    • 修复了一些BUG。
  5. GitLab源码
    https://gitlab.com/scarpetta/pdfmixtool

  6. 参考文章:PDF Mix Tool | 轻量级PDF编辑软件

在使用Git的过程中,有的文件比如日志,临时文件,编译的中间文件等不要提交到代码仓库,这时就要设置相应的忽略规则,来忽略这些文件的提交。简单来说一个场景:在你使用git add .的时候,遇到了把你不想提交的文件也添加到了缓存中去的情况,比如项目的本地配置信息,如果你上传到Git中去其他人pull下来的时候就会和他本地的配置有冲突,所以这样的个性化配置文件我们一般不把它推送到git服务器中,但是又为了偷懒每次添加缓存的时候都想用git add .而不是手动一个一个文件添加,该怎么办呢?很简单,git为我们提供了一个.gitignore文件,只要在这个文件中声明哪些文件你不希望添加到git中去,这样当你使用git add .的时候这些文件就会被自动忽略掉。

Git忽略文件的原则

  • 忽略操作系统自动生成的文件,比如缩略图等;
  • 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如产生的.log日志文件;
  • 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。

使用方法

在工作目录中新建一个文件.gitignore, 然后把要忽略的文件名填进去,Git就会自动忽略这些文件。不需要从头写.gitignore文件,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。 https://github.com/github/gitignore

我的Latex仓库配置

.gitignore
1
2
3
4
5
*.aux
*.log
*.pdf
*.synctex.gz
*.out

参考文章

[Git].gitignore文件的配置使用

在决定全面使用vim-latex来编写latex文件后,发现Alt键一直没有启用。于是在nvim下查询帮助:help latex-suite.txt , 然后找到Alt相关,即

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Latex-Suite utilizes a set of macros originally created by Carl Mueller in
auctex.vim to make inserting all the \left ... \right stuff very easy and to
also make some use of the heavily under-utilized <Alt> key.

NOTE: By default, the mappings involving the <Alt> key are turned off for
compatibility with inserting non-ASCII characters. It can be enabled by
setting
let g:Tex_AdvancedMath = 1
in your $VIM/ftplugin/tex.vim.


NOTE: By default, typing Alt-<key> in Vim takes focus to the menu bar if a menu
with the hotkey <key> exists. If in your case, there are conflicts due to
this behavior, you will need to set
set winaltkeys=no
in your $VIM/ftplugin/tex.vim in order to use these maps.

由于我是在neovim下使用的vim-latex, 于是找到路径为:~/.local/share/nvim/lazy/vim-latex/ftplugin/ 但是发现没有文件tex.vim, 于是, 即

~/.local/share/nvim/lazy/vim-latex/ftplugin/tex.vim
1
2
let g:Tex_AdvancedMath = 1
set winaltkeys=no

经过上述设置后Alt键终于被启用了,我目前使用的主要是它智能插入item的功能。

git是当前最常见的版本控制工具,但出现以下情况时,往往需要清空commits历史记录:

  • commits记录占用空间过大甚至远远超过版本控制文件本身大小,进行云端代码管理时会受制于空间限制,无法继续更新
  • 历史记录中存在敏感信息,需要清理

清理commits历史记录的核心思想是,直接删除本地的.git目录,重新建立git仓库并与远程仓库建立链接,采用强制提交的方式覆盖远程仓库的commits记录。

下面是一段示例,参数说明:

  • $REPO_DIR 表示需要处理的Git仓库本地目录
  • git@github.com:xxxx/$REPO_DIR.git 表示远程仓库地址

进入本地仓库,删除.git目录

1
2
cd $REPO_DIR
rm -rf .git

重新初始化

1
2
git init
git branch -m main

由于Gitlab仓库的默认分支名为main,而仓库初始化默认为master, 所以需要重命名为main.

添加commit

1
2
git add .
git commit -m "restart git commit"

添加远程仓库链接

设置远程仓库代号为origin, 则

1
git remote add orign git@github.com:xxxx/$REPO_DIR.git

注意,此时可用git remote -v检查远程仓库的设置。

强制提交到master分支,覆盖远程仓库的commits历史提交记录

1
2
3
git push -f origin master
or
git push --force origin master

追踪上游分支

1
git push --set-upstream origin main

如果不设置上游分支,再次提交时的commits不能确定跟踪变化,所以不能正常提交博客文章,于是这是一个必须的操作。

参考文章

清空Github仓库的commits历史记录

作为一个理科生,终生都离不开数学公式。而LaTeX绝对是处理数学公式的王者,在编辑LaTeX中的众多工具中,使用vim或neovim配合编辑LaTeX的插件又是王者中的王者。在众多的插件中,vim-latexvimtex是网络上提到最多的,也是使用者最多的插件,但是这两者该如何选择呢?经过本人的实践,最终选择了vim-latex.

选择依据分析

众多网络文章都提到了插件vimtex, 按其官方介绍:VimTeX is a modern Vim and Neovim filetype and syntax plugin for LaTeX files. , 或许就是这个modern让许多人选择了它。诚然vimtex是一个优秀的插件,我们来看一下它提供的功能(引用其README.md):

  • Document compilation with latexmk, latexrun, tectonic, or arara
  • LaTeX log parsing for quickfix entries using
  • Compilation of selected part of document
  • Support for several PDF viewers with forward search
  • Completion of
    • citations
    • labels
    • commands
    • file names for figures, input/include, includepdf, includestandalone
    • glossary entries
    • package and documentclass names based on available .sty and .cls files
  • Document navigation through
    • table of contents
    • table of labels
    • proper settings for 'include', 'includexpr', 'suffixesadd' and 'define', which among other things
      • allow :h include-search and :h definition-search
      • give enhanced gf command
  • Easy access to (online) documentation of packages
  • Word count (through texcount)
  • Motions (link to GIF demonstrations)
    • Move between section boundaries with [[, [], ][, and ]]
    • Move between environment boundaries with [m, [M, ]m, and ]M
    • Move between math environment boundaries with [n, [N, ]n, and ]N
    • Move between frame environment boundaries with [r, [R, ]r, and ]R
    • Move between comment boundaries with [* and ]*
    • Move between matching delimiters with %
  • Text objects (link to GIF demonstrations)
    • ic ac Commands
    • id ad Delimiters
    • ie ae LaTeX environments
    • i$ a$ Math environments
    • iP aP Sections
    • im am Items
  • Other mappings (link to GIF demonstrations)
    • Delete the surrounding command, environment or delimiter with dsc/dse/ds$/dsd
    • Change the surrounding command, environment or delimiter with csc/cse/cs$/csd
    • Toggle starred command or environment with tsc/tse
    • Toggle inline and displaymath with ts$
    • Toggle between e.g. () and \left(\right) with tsd
    • Toggle (inline) fractions with tsf
    • Close the current environment/delimiter in insert mode with ]]
    • Add \left ... \right) modifiers to surrounding delimiters with <F8>
    • Insert new command with <F7>
    • Convenient insert mode mappings for faster typing of e.g. maths
    • Context menu on citations (e.g. \cite{...}) mapped to <cr>
  • Improved folding (:h 'foldexpr')
  • Improved indentation (:h 'indentexpr')
  • Syntax highlighting
    • A consistent core syntax specification
    • General syntax highlighting for several popular LaTeX packages
    • Nested syntax highlighting for several popular LaTeX packages
    • Highlight matching delimiters
  • Support for multi-file project packages

而插件vim-latex(又称latex-suite), 按vimtexREADME.md

The main difference between VimTeX and LaTeX-Suite (aka vim-latex) is probably that VimTeX does not try to implement a full fledged IDE for LaTeX inside Vim. E.g.:

  • VimTeX does not provide a full snippet feature, because this is better handled by UltiSnips or neosnippet or similar snippet engines.
  • VimTeX builds upon Vim principles: It provides text objects for environments, inline math, it provides motions for sections and paragraphs
  • VimTeX uses latexmk, latexrun, tectonic or arara for compilation with a callback feature to get instant feedback on compilation errors
  • VimTeX is very modular: if you don't like a feature, you can turn it off.

这两个插件有相同的部分,比如说输入希腊字母,vim-latex在任何模式下都可以输出对应的希腊字母命令,而vimtex在数学模式中才输出希腊字母,相较而言vimtex更加保险一些,但是对于一个熟悉LaTeX的人来讲,这个事情都是知道的,影响不大,只能说vimtex更加细致一点。而vim-latex提供了完整的LaTeX的输入语法,同时提供了<++>标记方法,可以使用Ctrl+j快速的移动光标,这点是vimtex所无法比拟的。按vimtex的说法,vimtex把补全的任务交给了其他插件,但是就专业性和速度上讲,vim-latex绝对领先。

vimtex提供的较好的特性是光标在各环境中移动,这点是vim-latex不具备的功能。但是vimneovim的特性,使用搜索功能或数字键加hjkl方式移动光标,好像vimtex也没有占据足够的优势。

vimtex方便的更改环境功能,例如cse可以方便的更换为新的环境,但是vim-latex也可以使用<S-F5>快捷键快速更换环境,再则考虑到编写环境前作者肯定是规划好的环境,所以更改环境是一个低概率事件。此处注意,Neovim中同时按下组键<S+F5>(也就是Shift+F5)返回的是F17,并不能获得vim-latex所需的组合键<S-F5>!! 具体请参考keycode in terminal for vim&neovim, 于是做出修改:

~/.config/nvim/init.vim
1
2
3
4
map <F17> <S-F5>
imap <F17> <S-F5>
map <F19> <S-F7>
imap <F19> <S-F7>

修改完毕,在neovim中可以正常使用环境或命令的替换。很多人选择vimtex的一个重要原因是其可以配置增量编译,实现时时查看结果,但是LaTeX的精神本身就是!对于一个熟悉LaTeX的人来讲随时关注结果并不是必须的,除非公式比较复杂,而这只需要编译一下看看结果即可。时时编译的代价就是电脑消耗更多的资源,对于我的笔记本来说,风扇一直转发出的噪音会干扰我的写作思维。对于一个初入LaTeX的人,这或许是一个较好的选择,但是对于一个足够熟悉LaTeX的人来讲,不是必须的,也是符合Linux思维。

综上所述,vim-latexvimtex都是优秀的LaTeX插件,但是前者提供了完备的功能,后者的优势功能是一些低频率使用的功能,综合平衡的话还是选择vim-latex更好一些。由于二者并不冲突,所以可以同时配置二个插件,获取各自的功能这是一个比较折中的方案,但是不太符合Linux纯净化的哲学思想,所以我还是选择了前者,在没有足够的理由前应该不会同时安装二者。

作为可用的配置,下面将二者的配置文件列出,方便大家参考:

~/.config/nvim/lua/plg/vim-latex.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#! /usr/bin/env lua
--
-- vim-latex.lua
-- Copyright (C) 2023 feng <feng@arch>
--
-- Distributed under terms of the MIT license.
--
-- vim-latex默认的局势键
-- F1 帮助菜单
-- F5 插入环境选择对话框,若在导言区将弹出插入宏包对话框
-- F7 插入引用选择对话框
--绑定快捷键
-- -- 测试功能
-- inoremap <buffer><silent> <C-S-F5> <C-O>:call <SID>ChangeEnvironment(input('Environment? '))<CR>
-- noremap <buffer><silent> <C-S-F5> :call <SID>ChangeEnvironment(input('Environment? '))<CR>
vim.api.nvim_create_autocmd("FileType",{
pattern = "tex",
callback = function()
-- 配置F4打开模板
vim.api.nvim_set_keymap("n", "<F4>", ":TTemplate<CR>", {noremap = true, silent = true})
-- 配置pdflatex编译,原vim-latex中使用\ll 默认 xelatex 编译
vim.api.nvim_set_keymap("n", "<F6>", [[<cmd>!pdflatex % <CR>]], {noremap = true, silent = true})
-- 配置F8编译 aux辅助文件,直接根据数据库生成文献引用, 注意使用%:t:r 截取文件名
vim.api.nvim_set_keymap("n", "<F8>", [[<cmd>!bibtex %:t:r.aux <CR>]], {noremap = true, silent = true})
-- 配置F10编译多合一文件时,以当前目录名为主文件,以节省时间
vim.api.nvim_set_keymap("n", "<F10>", [[<cmd>!xelatex $(echo $PWD|awk -F"/" '{print $NF}').tex <CR>]], {noremap = true, silent = true})
end
})
-- 开启treesitter提供的语法高亮
vim.api.nvim_create_autocmd( 'FileType', { pattern = 'tex',
callback = function(args)
vim.treesitter.start(args.buf, 'latex')
vim.bo[args.buf].syntax = 'on' -- only if additional legacy syntax is needed
end
})
-- set for vim-latex/latex-suite
vim.g['Tex_Menus'] = 0
vim.g['Tex_Flavor'] = 'latex'
vim.g['Tex_IgnoreLevel'] = 8
vim.g['Tex_GotoError'] = 0
vim.g['Tex_DefaultTargetFormat'] = 'pdf'
-- 配置默认编译引擎为 xelatex
vim.g['Tex_CompileRule_pdf'] = 'xelatex -synctex=1 -interaction=nonstopmode -file-line-error-style $*'
-- 获取桌面环境,并根据桌面环境选择默认的PDF阅读器
if os.getenv("DESKTOP_SESSION") == "plasma" then
vim.g['Tex_ViewRule_pdf'] = 'okular'
else
vim.g['Tex_ViewRule_pdf'] = 'evince'
end
-- 统一设置为轻量级的mupdf阅读器
-- vim.g['Tex_ViewRule_pdf'] = 'mupdf'
--控制统计过程中的警告信息
vim.g['Tex_IgnoredWarnings'] = {}
--
vim.g['Tex_CustomTemplateDirectory'] = "~/.latex-templates/"
~/.config/nvim/lua/plg/vimtex.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#! /usr/bin/env lua
--
-- vimtex.lua
-- Copyright (C) 2023 feng <feng@archlinux>
--
vim.g['tex_flavor'] = 'latex'
vim.g['vimtex_view_method'] = 'zathura'
vim.g['vimtex_view_general_viewer'] = 'zathura'
vim.g['vimtex_view_general_options'] = [[--unique file:@pdf\#src:@line@tex]]
vim.g['vimtex_compiler_latexmk_engines'] = {
_ = '-xelatex'
}
vim.g['vimtex_compiler_progname'] = 'nvr'
-- vim.g['vimtex_view_general_options_latexmk'] = '--unique'
-- vim.g['vimtex_view_general_options_latexmk'] = '--reuse-instance'
--
-- A few examples of disabling default VimTeX features.
vim.g['tex_comment_nospell'] = 1
vim.g['vimtex_quickfix_mode'] = 1
vim.g['vimtex_indent_enabled'] = 1 -- turn off VimTeX indentation
vim.g['vimtex_imaps_enabled'] = 1 -- disable insert mode mappings (e.g. if you use UltiSnips)
vim.g['vimtex_complete_enabled'] = 1 -- turn off completion
vim.g['vimtex_syntax_enabled'] = 1 -- disable syntax conceal
vim.g['vimtex_syntax_conceal_disable'] = 1 --avoid the startup warning
-- 使一些符号以一种更加直观的方式显示出来
vim.g['tex_conceal'] = 'abdmg'
vim.g['conceallevel'] = 1
-- 更改maplocalleader避免与vim-latex的冲突
vim.g['maplocalleader'] = ","

参考文章

  1. VimAwesome
  2. vim-latex.sourceforge
  3. 用Vim高效地编辑LaTeX文档

这是一款可以实现数学符号对齐的插件,测试后发现很实用,于是直接粘上其README.md, 如下

This is a mirror of http://www.vim.org/scripts/script.php?script_id=294

Align and AlignMaps lets you align statements on their equal signs, make comment boxes, align comments, align declarations, etc.

Note: this plugin is not a left&right margin justification tool! See vimscript#177 or vimscript#2324 for that. Note: if you have vim 7.1 or later, your vimball should unpack just fine without having to update it.

There are two basic commands provided by this package:

    AlignCtrl options sep1 sep2 sep3 ... 
    [range]Align sep1 sep2 sep3 ... 

The "sep#" are regular expressions which describe separators that delineate fields; Align will line up the separators. The range may be any Vim range, including visual-blocks. Align works on lines of the form: (ws==whitespace, sep==separator, field==text)

ws-field-ws-sep-ws-field-ws-sep-ws-field-... 
ws-field-ws-sep-ws-field-ws-sep-ws-field-... 

Note that white-space (ws) surrounding separators is ignored.

The Align package includes:

  • Align : the basic alignment command
  • AlignCtrl : provides options for the next call to :Align
  • AlignMaps : many three or four key maps which support aligning C/C++ style declarations, ()?..:.., expressions, C/C++ comments, numbers, C preprocessor definitions, tables based on tabs or spaces, and more.

In addition, AutoAlign (vimscript#884) uses the Align function to align =s as you type.

Align handles alignment on multiple separators, not just the first one, and the separators may be the same across the line or different. With AlignCtrl one may specify that separators are cyclic (re-used sequentially) or equivalent (all separators are simultaneously active).

There are several options to help with deciding what to do with initial white space. By default Align re-uses the first line's initial white space, but one may use AlignCtrl to retain or remove each line's initial white space.

The <Align.vim> and <AlignMaps.vim> files are plugins and require vim 6.1 or higher.

EXAMPLES:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
:5,10Align = 
Align on '=' signs

:'<,'>Align = + - \* /
Align on any of the five separator characters shown.
Note that visual block mode was used to fire off Align.

:AlignCtrl =lp1P1I
which means:
= all separators are equivalent
l fields will be left-justified
p1 pad one space before each separator
P1 pad one space after each separator
I preserve and apply the first line's leading white space to all
Align'd lines

:help align
Gives help for Align

ALIGNMENT CONTROL

Alignment control allows for left or right justification or centering of fields, cyclic (sequentially active) or equivalent (simultaneously active) regular expressions to specify field separators, initial white space control, optional visual-block use (ie. apply Alignment only within a block), user-specified white-space padding about separators, and multiple separators.

MANY ALIGNMENT MAPS

AlignMaps.vim provides a number of maps which make using this package easy. They typically either apply to the range 'a,. (from mark a to current line) or use the visual-selection (V, v, or ctrl-v selected):

1
2
3
4
5
\t=  : align assignments (don't count logic, like == or !=) 
\t, : align on commas
\t| : align on vertical bars (|)
\tsp : align on whitespace
\tt : align LaTeX tabular tables

AlignMaps also provides some internally complex maps for aligning C declarations, Ansi C function arguments, html tables, LaTeX tabulars, and trailing comments:

1
2
3
4
\acom : align comments 
\adec : align C declarations (one variable per line)
\afnc : align ansi-style C function input arguments
\Htd : align html tables

To see some examples of this, check out

[http://mysite.verizon.net/astronaut/vim/align.html#Examples](http://mysite.verizon.net/astronaut/vim/align.html#Examples) 

(the proportional fonts used by most browsers in showing you this page preclude showing the examples here). The help for Align and AlignCtrl also contains many examples.

ALIGNMENT ON VISUAL BLOCKS AND g,v-LIKE CONTROL

Sometimes one wants to align only a subset of text in a range, based on patterns or column extents. Align supports both types of restrictions!

Visual-block selection may be used to restrict Align to operate only 
within that visual block. 
 
AlignCtrl supports "g" and "v" patterns that restrict Align to 

operate on lines which match (or don't match, respectively) those 
patterns. 

NEW STUFF:

There's a number of new AlignCtrl options:

- allows one to skip a separator (treat it as part of a field) 
+ repeat the last lrc justification (ex. lr+ == lrrrrrr... ) 
: treat the rest of the line as a field; acts as a modifier 
  to the last lrc. 
< left-justify the separator 
> right-justify the separator 
| center the separator 

These are, except for the ":", cyclic parameters. In other words, >< is equivalent to ><><><><... . Thus separators can be of differing lengths (ex. -+ as a separator pattern can match -, --, ---, etc and the separators will be left/right/center justified as you wish).

To get automatic, as-you-type, aligning of = in the C, vimL, and other languages, check out vimscript#884 for several ftplugins (which use Align).

Alternative Aligners: Gergely Kontra's vimscript#176

Thank you for rating Align!

DISCUSSION and COMMENTS:

Please use email for bugs. Enjoy!

(alpha/beta version available at http://mysite.verizon.net/astronaut/vim/index.html#ALIGN)

CDNJS是一个JS资料库,可以直接在网页上应用它上面拥有的一些JS文件。为什么不直接引用自己下载下来的库而要引用上面的文件呢?因为引用上面的文件可以使用户浏览网站的速度更佳,可以提高用户体验。Next主题的CDNJS直接调用的https://cdnjs.cloudflare.com, 按Next主题官方说法

Particularly, if you are a Chinese blogger or most of your visits come from China, please note that the CDNJS is blocked in some parts of China, don't use it as your CDN provider.

Next主题默认检测网站根目录安装的插件,将其视为内部的插件,对于某些未检测到的插件视为第三方插件。知道这个特性后,我们首先要做的就是安装@next-theme/plugins, 这样适配Next主题的特定插件就会在托管的网站内部加载,这可以保证Next的各项功能正常工作。操作如下:

1
2
diary --ThemeUpdate
npm install @next-theme/plugins

先更新Next主题的目的是匹配最新的@next-theme/plugins, 于是可以保证主题内部插件工作良好。然而Next主题的一些部分还采用了图标,这些图标并不在@next-theme/plugins范围内,其中最重要的local-search插件也会受到影响,所以需要加载CDN网站到第三方插件。目前国内有很多 NPM 的 CDN,可以支持相关包文件的高速访问下载,其中库比较全的CDN推荐以下三个:

其中Zstatic用到了镜像回源,也就是说只要访问一次,文件就会被存储到国内的服务器上,再也不用担心缓存过期了,所以网络文章建议优先用这个,但是在本博客主题上测试效果并不好。如果您使用 cdnjs.com 只需要替换 cdnjs.cloudflare.coms4.zstatic.net 即可,如

1
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
替换成
1
<script src="https://s4.zstatic.net/ajax/libs/jquery/3.2.1/jquery.min.js"></script>

如果您使用 unpkg.com 只需要替换 unpkg.com 为 s4.zstatic.net/npm 即可,如

1
<script src="https://unpkg.com/react@16.7.0/umd/react.production.min.js"></script>
替换成
1
<script src="https://s4.zstatic.net/npm/react@16.7.0/umd/react.production.min.js"></script>

批量替换代码:

1
2
find . -type f -exec sed -i 's#https://unpkg.com#https://s4.zstatic.net/npm#g' {} +
find . -type f -exec sed -i 's#https://cdnjs.cloudflare.com#https://s4.zstatic.net#

  • Hexo Next主题在V8.19.0版本后就支持自定义cdnjs了,所以配置了s4.zstatic.net, 测试访问速度可以。2024年01月22日发现本博客的PDF组件无法使用,于是判断是s4.zstatic.net同步的js不全导致,更换为cdn.onmicrosoft.cnmirrors.sustech.edu.cn/cdnjs后问题解决,尽管在网络上看到文章推荐使用前者,但是在博客中表现来看后二者更佳,并且南科大镜像更加快速一些,完美适配了我的Next主题。
  • 2024年09月27日, 南方科技大学的cdn镜像访问出现问题,于是为保证网站正常访问不得不修复此问题。经过研究,安装@next-theme/plugins后,可以保证PDFNext主题依赖的插件由站内加载,其他部分则由cdn镜像加载,于是多数的镜像均可以正常使用了,为确保访问的稳定重新切换为s4.zstatic.net, 经测试效果良好.