还望见谅 下文中的拼写错误,比如 "latex" 之类,抱歉!
目录:
1.基于 VIM + Ultisnip LaTeX 配置的有关资料
1.1 Gilles Castel 的配置方法
1.2 国内 张翼腾大佬 进一步开发了 更加炫酷的功能(矩阵自动填充)
2. 基于 Vscode + HyperSnip 的Latex 环境搭建
2.1 Vscode中有关 LaTeX 的插件
2.2 其他有用的插件
2.3 LaTeX 编译器设置
2.4 LaTeX code 与pdf 之间 正向搜索和反向搜索设置
3. snippet 设置
3.1 VS code 中基于 Ultisnip 的 snippet 插件
3.2 设置步骤
3.3 使用说明举例
4 附录——hypersnip配置文件
4.1 一些参考
之前一直使用TexStudio 作为 LaTeX 写作的编辑器,但是代码补全功能不是很好。
看到网上有大神使用VIM+ultisnip 用LaTeX 上课记笔记,十分佩服。
1700页数学笔记火了!全程敲代码,硬核小哥教你上手LaTeX+Vim(附代码)mp.weixin.qq.com1.基于 VIM + Ulisnip LaTeX 配置的有关资料整理如下:
- Gilles Castel 的配置方法
Gilles Castel 的 github 主页,其中有 tex.snippets配置文件
gillescastel/latex-snippetsgithub.com- 国内 张翼腾大佬 进一步开发了 更加炫酷的功能(矩阵自动填充),文末有其 snippet 配置文件(侵权删)
其 github 主页
zyt-snippet 配置文件github.com奈何本人太菜,VIM 上手太难,尝试多次,无果,转而使用 VScode + HyperSnip 实现一些类似的功能
2.基于 Vscode + HyperSnip 的 LaTeX 环境搭建
2.1 Vscode中有关 LaTeX 的插件:
- LaTex Workshop:——必备
- LaTex language support—— LaTeX 语法的 高亮 和 快捷片段(snippet)
- latex-formatter——可以帮助整理一下代码的格式(主要是对齐缩进之类的)
2.2 其他有用的插件:
- TODO Highlight——记录一下当前code的中断点或者有待补充修改的地方,方便自己下次工作时快速找到上次终端的地方
- todo tree —— 搭配 TODO Highlight使用,显示如下
- english word hint——英语单词补全
- indent-rainbow
2.3 LaTeX 编译器设置
通常写中文需要指定使用 xelatex 编译,可以在文档开头使用如下的魔法指令
% !TEX program = xelatex
也可以修改json文件(ctrl+shift+P ——> json ——>enter 回车)
"latex-workshop.latex.tools": [
{
"name": "xelatex",
"command": "xelatex",
"args": [
"-synctex=1",
"-interaction=nonstopmode",
"-file-line-error",
"-pdf",
"%DOCFILE%"
]
},
{
"name": "pdflatex",
"command": "pdflatex",
"args": [
"-synctex=1",
"-interaction=nonstopmode",
"-file-line-error",
"%DOCFILE%"
]
},
{
"name": "bibtex",
"command": "bibtex",
"args": [
"%DOCFILE%"
]
}
],
// 一下设置 recipes,设置完成后 会在latex workshop 中显示相应的编译方法
"latex-workshop.latex.recipes": [
{
"name": "xelatex",
"tools": [
"xelatex"
]
},
{
"name": "xe->bib->xe->xe",
"tools": [
"xelatex",
"bibtex",
"xelatex",
"xelatex"
]
},
{
"name": "pdflatex",
"tools": [
"pdflatex"
]
}
],
2.4 LaTeX code 与pdf 之间 正向搜索和反向搜索设置
这个功能在texstudio 是自带的,并且是编辑文章经常会用到的
- 正向搜索:LaTeX code 跳转到 pdf 文档
- 反向搜索:PDF 文档 跳转到 LaTeX
此功能在 vscode 中实现需要:
- PDF 浏览器(支持反向搜索):下载 SumatraPDF
- 代码设置(同样修改json文件即可:ctrl+shift+P ——> json ——>enter 回车),注意把相应的路径替换成自己的!!!!!!
// 设置 latex-workshop 的 PDF 预览程序,external 指的是外部程序
"latex-workshop.view.pdf.viewer": "external",
"latex-workshop.view.pdf.external.viewer.command": " 你的SumatraPDF安装路径 /SumatraPDF/SumatraPDF.exe",
"latex-workshop.view.pdf.external.viewer.args": [
"-forward-search",
"%TEX%",
"%LINE%",
"-reuse-instance",
"-inverse-search",
"" 你的vscode安装路径 /Microsoft VS Code/Code.exe" " 你的vscode安装路径 /Microsoft VS Code/resources/app/out/cli.js" -gr "%f":"%l"",
"%PDF%"
],
"latex-workshop.view.pdf.external.synctex.command": " 你的SumatraPDF安装路径 /SumatraPDF/SumatraPDF.exe",
"latex-workshop.view.pdf.external.synctex.args": [
"-forward-search",
"%TEX%",
"%LINE%",
"-reuse-instance",
"-inverse-search",
"" 你的vscode安装路径 /Microsoft VS Code/Code.exe" " 你的vscode安装路径 /Microsoft VS Code/resources/app/out/cli.js" -gr "%f":"%l"",
"%PDF%",
],
"window.zoomLevel": 0,
// bibtex 格式
"latex-workshop.bibtex-format.tab": "tab",
// 自动编译,全部关闭,当且仅当你认为有需要的时候才会去做编译
"latex-workshop.latex.autoBuild.run": "never",
"latex-workshop.latex.autoBuild.cleanAndRetry.enabled": false,
3. 重点来了!snippet 设置
- VS code 有自带的snippet 定义方法,但是很不友好,主要是由于body 内每行程序都要用“”括起来
3.1 VS code 中基于 Ultisnip 的 sbippet 插件
- Vsnip: 允许用户在vscode 中直接使用 Ultisnip ,但是本人太菜,尝试过多次无果(如有大佬知道怎么使用还望评论告知,万谢!)
- HyperSnip:与Ultisnip类似,但是实现的功能要少很多,不过也够用了;配置也很方便,只要稍稍改动 大佬们写好的 Ultisnip 文件就好
3.2 设置步骤
STEP1: 新建 hsnips 文件:Ctrl shift p ——>HyperSnips: Open snippets directory,新建 tex.hsnips(只有文件后缀为 .tex 才会触发这些 snippets)或者 all.hsnips (任何语言都会触发)
SETP2: blocks 设置
- Global blocks 中可以定义该文件 .hsnips 中所有 block 都可使用的函数,编程语言为 javascript
Global blocks are JavaScript code blocks with code that is shared between all the snippets defined in the current file. They are defined with the
global
keyword, as follows:
global
// JavaScript code
endglobal
2. Snippet blocks 定义快捷指令,语法结构为:
Snippet blocks are snippet definitions. They are defined with the
snippet
keyword, as follows:
snippet trigger "description" flags
body
endsnippet
where thetrigger
field is required and the fieldsdescription
andflags
are optional.
- Trigger:触发的指令,其中不能包含空格;如果使用正则表达式,请用backticks (
`
)括起来
A trigger can be any sequence of characters which does not contain a space, or a regular expression surrounded by backticks (
`
).
- description:指令描述,可选
- Flags:设置片段的触发方式,比如是否自动触发
The flags field is a sequence of characters which modify the behavior of the snippet, the available flags are the following:
A:自动展开。默认是按下tab
时触发代码段,Flag 设置为A
,代码段将在 Trigger 匹配后立即激活,这对于 regex 正则表达式代码段特别有用。
i: 词内展开*。默认情况下,触发器仅在前面带有空格字符时才匹配触发。如果设置 为 i,则不管前面的字符如何,都会触发带有此选项的代码段,例如,可以在单词的中间触发代码段。
w: 单词边界*。使用此选项时,触发器将在单词边界处匹配。
M: Multi-line mode - By default, regex matches will only match content on the current line, when this option is enabled the last hsnips.multiLineContext lines will be available for matching. 没用过
* 只对非正则表达式有效
- body:trigger 替换的主体部分;如果使用 JavaScript interpolation,请用 two backticks (
``
) 将程序括起来
The body is the text that will replace the trigger when the snippet is expanded, as in usual snippets, the tab stops$1
,$2
, etc. are available.
The full power of HyperSnips comes when using JavaScript interpolation: you can have code blocks inside your snippet delimited by two backticks (``
) that will run when the snippet is expanded, and every time the text in one of the tab stops is changed.
- body 中的占位符 $
$
后面紧跟数字可指定代码片段触发落入编辑器之后的光标位置,光标位置按照从小到大排序。 方法中当你输入Trigger + TAB
之后光标会默认落到$1
的位置,再次按TAB
则光标会落到$2
的位置,以此类推。
需要注意的是: $0
设置最终光标的位置。
- body 中 code interpolation 用到的三个变量(使用 JavaScript interpolation,请用 two backticks (``) 将程序括起来)
rv: 块的返回值,该返回值 将会替代 ````中的内容
t: 每个tab 中输入的内容,比如 $1、$2中的内容,可以使用它来动态更改代码段内容。需要注意从 t[0] 开始索引
m: 如果 trigger 使用正则表达式(regular expressio),m 包含每个正则表达式每块的匹配内容,一般来讲,正则表达式中 每个``( )`` 中匹配的内容为一块,从m[1]开始索引
3.3 使用说明举例
- dategreeting
snippet dategreeting "Gives you the current date!"
Hello from your hsnip at ``rv = new Date().toDateString()``!
endsnippet
- box
snippet box "Box" A
``rv = '┌' + '─'.repeat(t[0].length + 2) + '┐'``
│ $1 │
``rv = '└' + '─'.repeat(t[0].length + 2) + '┘'``
endsnippet
- hat
snippet `(?[a-zA-Z]w*)(hat|HAT)` "hat" iA
hat{``rv = m[1]``}
endsnippet
同样也可实现 /
自动展开为分数的功能
snippet `((d+)|(d*)()?([A-Za-z]+)((^|_)({d+}|d))*)/` "Fraction no ()" A
frac{``rv = m[1]``}{$1}$0
endsnippet
snippet `^.*)/` "Fraction with ()" A
``
let str = m[0];
str = str.slice(0, -1);
let lastIndex = str.length - 1;
let depth = 0;
let i = str.length - 1;
while (true) {
if (str[i] == ')') depth += 1;
if (str[i] == '(') depth -= 1;
if (depth == 0) break;
i -= 1;
}
let results = str.slice(0, i) + "frac{" + str.slice(i+1, -1) + "}";
results += "{$1}$0";
rv = results;
``
endsnippet
- 矩阵(这个做的不好)
// global中定义生成矩阵的函数
global
// JavaScript code
function gen_matrix(nrow, ncol) {
let results = "n";
let order = 1;
for (var i=0; i<nrow; i++){
results += ' ';
for(var j = 0;j <ncol-1;j++){
results += "$" +(order ).toString() + " & ";
order ++;
}
results += " $"+(order).toString() +" "+ ""+ "n";
order ++;
}
return results;
}
endglobal
priority 20000
snippet `(b|p)mat([1-9]{1})` "bmatrix" iwA
begin{``rv = m[1]``matrix}``
rv = gen_matrix(m[2],m[2]);
``end{``rv = m[1]``matrix}$0
endsnippet
4 附录——hypersnip配置文件
我的hypersnip配置文件(有些指令有冲突,由于不会定义math()环境,可能导致文档书写不便)
latex.hsnipsgithub.com鄙人程序小白,求轻点喷,哈哈
4.1 一些参考
HyperSnip实现‘/’识别为分数stackoverflow.com正则表达式
正则表达式 - 元字符 | 菜鸟教程www.runoob.com 正则表达式手册tool.oschina.net 正则表达式在线测试regexr.comJavascript
JavaScript 教程 | 菜鸟教程www.runoob.comVIM ultisnip 介绍
vim snippets 介绍www.jianshu.comVScode 自带 snippet 使用
VSCode 利用 Snippets 设置超实用的代码块juejin.im