latex 矩阵_【LaTeX 编辑环境搭建】TeX Live+VS code(+HyperSnips插件)

还望见谅 下文中的拼写错误,比如 "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.com
449d33250eea206f8b1e52781aa8723c.png

1.基于 VIM + Ulisnip LaTeX 配置的有关资料整理如下:

  • Gilles Castel 的配置方法
How I'm able to take notes in mathematics lectures using LaTeX and Vim​castel.dev

Gilles Castel 的 github 主页,其中有 tex.snippets配置文件

gillescastel/latex-snippets​github.com
6512b9a0080afdc84e2342eb26b70047.png
  • 国内 张翼腾大佬 进一步开发了 更加炫酷的功能(矩阵自动填充),文末有其 snippet 配置文件(侵权删)
https://zhuanlan.zhihu.com/p/92046022​zhuanlan.zhihu.com

其 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——可以帮助整理一下代码的格式(主要是对齐缩进之类的)

228f219f8ec1954c8b71c0392912d7e7.png
latex-formatter

2.2 其他有用的插件:

  • TODO Highlight——记录一下当前code的中断点或者有待补充修改的地方,方便自己下次工作时快速找到上次终端的地方
  • todo tree —— 搭配 TODO Highlight使用,显示如下

1a554d7f9fbd1629d6ec35c05a9636b4.png
todo tree
  • english word hint——英语单词补全
  • indent-rainbow

4132efb5a4ceda18bd14a0da40e04da6.png
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"
            ]
        }
    ],

d98900d984f340f3a31df32468e51faa.png
个人自定义设置的recipe

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 内每行程序都要用“”括起来

bbadf32a8ae74b4f5fe9917ad72cbcad.png
VS code 自带的snippet 定义

67c7bace0f30bb03fa79c7f42acc692e.png

3.1 VS code 中基于 Ultisnip 的 sbippet 插件

  • Vsnip: 允许用户在vscode 中直接使用 Ultisnip ,但是本人太菜,尝试过多次无果(如有大佬知道怎么使用还望评论告知,万谢!)

547fc28d72ba135be0eef2d9f1dab58f.png
Vsnip
  • HyperSnip:与Ultisnip类似,但是实现的功能要少很多,不过也够用了;配置也很方便,只要稍稍改动 大佬们写好的 Ultisnip 文件就好

03b6b838a4a254ecd80164ab2c108f73.png
HyperSnips

3.2 设置步骤

STEP1: 新建 hsnips 文件:Ctrl shift p ——>HyperSnips: Open snippets directory,新建 tex.hsnips(只有文件后缀为 .tex 才会触发这些 snippets)或者 all.hsnips (任何语言都会触发)

SETP2: blocks 设置

  1. 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 globalkeyword, as follows:
global
// JavaScript code
endglobal

2. Snippet blocks 定义快捷指令,语法结构为:

Snippet blocks are snippet definitions. They are defined with the snippetkeyword, as follows:
snippet trigger "description" flags
body
endsnippet
where the triggerfield is required and the fields descriptionand flagsare 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. 没用过
* 只对非正则表达式有效

797ae4decd5ae0ab0102e5fec5d5aed9.png
  • 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]开始索引

2fac391f629b9bf13b0ccdbb74834c87.png
body中可用的三个变量

3.3 使用说明举例

  • dategreeting
snippet dategreeting "Gives you the current date!"
Hello from your hsnip at ``rv = new Date().toDateString()``!
endsnippet

f1237d9cd5de578169f2bd71f2bc20a0.png
说明

c3d676181d9d28e73320659879c8e9a0.gif
见谅我这老年人的打字速度
  • box
snippet box "Box" A
``rv = '┌' + '─'.repeat(t[0].length + 2) + '┐'``
│ $1 │
``rv = '└' + '─'.repeat(t[0].length + 2) + '┘'``
endsnippet

25b5fccb3a05687fc47eb6876523252c.png

5cf560a15ae139ee6d2e43b4abd3744a.gif
  • hat
snippet `(?[a-zA-Z]w*)(hat|HAT)` "hat" iA
hat{``rv = m[1]``}
endsnippet

46dffa0e39b3ee0f8cf00a8834189edb.png

ff6616eb80c4e1443cbde5295aeb8dd8.gif

同样也可实现 / 自动展开为分数的功能

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

4177370ce10549b006c35133574d82bc.gif
  • 矩阵(这个做的不好)
// 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

fc83ee944c41b512919f816a5fcfcd0f.png

ac71737f3d9b2dda23f6eb0a34b6f135.gif

4 附录——hypersnip配置文件

我的hypersnip配置文件(有些指令有冲突,由于不会定义math()环境,可能导致文档书写不便)

latex.hsnips​github.com

鄙人程序小白,求轻点喷,哈哈

4.1 一些参考

HyperSnip实现‘/’识别为分数​stackoverflow.com
df958f4bdf5b1ff41f20af870da30d53.png
https://www.reddit.com/r/vscode/comments/db8csz/introducing_hypersnips_a_powerful_snippet_engine/​www.reddit.com

正则表达式

正则表达式 - 元字符 | 菜鸟教程​www.runoob.com 正则表达式手册​tool.oschina.net 正则表达式在线测试​regexr.com
f5a3131777d690bfc7f4c844d4485b2d.png

Javascript

JavaScript 教程 | 菜鸟教程​www.runoob.com

VIM ultisnip 介绍

vim snippets 介绍​www.jianshu.com
36434aa8e8fdf2eaa81220c0f5836f9a.png

VScode 自带 snippet 使用

VSCode 利用 Snippets 设置超实用的代码块​juejin.im
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值