Windows系统下使用gvim配置LaTeX快速书写环境

0 前言

小白近来读到这样一篇文章:How I’m able to take notes in mathematics lectures using LaTeX and Vim,这位学数学的小哥,通过使用vim和 LaTeX \LaTeX{} LATEX在整个本科学习期间,共记下了1700多页的数学公式笔记,惊为天人。——这简直就是小白梦中的自己。
在这里插入图片描述

在这里插入图片描述

对小白自己来说,想要系统地学习 LaTeX \LaTeX{} LATEX已经由来已久,而且也确实为此付出了一些努力:包括

  • 购买并阅读了一些 LaTeX \LaTeX{} LATEX的入门书籍;
  • 学习CTeX套装的一些基础使用方法(相较于后来的工具来说真的难用);
  • 尝试学习并配置TeXLive、TeXStudio(可视化工具里它是目前小白所知最优)等工具;
  • 尝试使用并学习OverLeaf在线编辑器;
  • 在markdown编辑器内使用 LaTeX \LaTeX{} LATEX语法等。

不得不说,小白在学习 LaTeX \LaTeX{} LATEX的道路上的投入和产出不成正比。这可能有赖于本人学习上一贯的低效率,或者归咎于 LaTeX \LaTeX{} LATEX本身陡峭的学习曲线。在很长的一段时间里,小白已经接近放弃直接使用 LaTeX \LaTeX{} LATEX而转投于各种Markdown书写工具(例如小白正在使用的同样高效的Obsidian)。

这次终于有这么一个契机(最主要是成功了),在折腾了那么多知识点之后,尝试在Windows系统下使用gvim(即vim的Windows发行版)+ texlive + SumatraPDF + vim-plug + Ultisnips + vim-snippets + vimtex 配置如那位数学小哥类似的 LaTeX \LaTeX{} LATEX书写环境。

对于这个过程,小白觉得,确实,这种Geek级的配置,对于一般的初学者来说真的很不友好,小白也在这个过程中甚为痛苦。甚至于,本身来讲,vim这个工具在编程界也是颇受争议,非IDE党会对它爱不释手,而IDE党则对它嗤之以鼻。但是小白认为,使用vim和使用五笔输入法一样,这正是残存的极客(折腾)精神的体现。

在之前小白也提到,这里用到的工具有点多,而每一个工具其实都有非常具体的使用方法,小白本篇文章也只是将整个工具链路打通,对于其中诸多的自定义设置细节还甚为不熟悉,需要持续精进。在此特别说明:水平所限,如有错漏,敬请原谅。

1 TeXLive下载及安装

texlive是一个优秀的 LaTeX \LaTeX{} LATEX发行版,集成度比较高,相较于以前的CTeX套件友好了很多。
其内置了latexmk工具,可使用主流的

  • pdflatex
  • dvipdfex
  • lualatex
  • xelatex
    LaTeX \LaTeX{} LATEX编译器。

官网地址
注意:小白觉得离线安装包比在线安装包要靠谱,原因无他,因为小白的网络太慢了。宁愿全部下载下来再安装,也不要使用在线安装包,等待它自己去连接网络下载。事实上,可能绝大多数国内网络都面临着这个问题,因为即使是官网也会根据你的网络地址将下载链接跳转到最近的国内镜像站去。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

国内的镜像站挺多,小白这次跳转到阿里云上,下载最新的版本,如图版本是texlive2024,离线安装包大小为5.6GB。

texlive的安装没有什么特别的地方,直接各种下一步即可。这是 LaTeX \LaTeX{} LATEX的核心工具。

2 gvim下载安装及配置

下面来下载另一个重要工具:gvim
gvim的官网地址
在这里插入图片描述

小白这里下载的是x64的exe文件。
下载完成后安装,打开gvim
在这里插入图片描述

默认的主题及背景颜色很丑
在这里插入图片描述

所以我们需要对gvim进行个性化设置。配置文件名为_vimrc, 默认安装在

C:\Program Files\Vim

文件夹下,如果你在安装时选择了安装位置,那么配置文件一般在安装目录中。
默认的配置文件存在一些内容,小白的这份如下:

" Vim with all enhancements
source $VIMRUNTIME/vimrc_example.vim

" Use the internal diff if available.
" Otherwise use the special 'diffexpr' for Windows.
if &diffopt !~# 'internal'
  set diffexpr=MyDiff()
endif
function MyDiff()
  let opt = '-a --binary '
  if &diffopt =~ 'icase' | let opt = opt . '-i ' | endif
  if &diffopt =~ 'iwhite' | let opt = opt . '-b ' | endif
  let arg1 = v:fname_in
  if arg1 =~ ' ' | let arg1 = '"' . arg1 . '"' | endif
  let arg1 = substitute(arg1, '!', '\!', 'g')
  let arg2 = v:fname_new
  if arg2 =~ ' ' | let arg2 = '"' . arg2 . '"' | endif
  let arg2 = substitute(arg2, '!', '\!', 'g')
  let arg3 = v:fname_out
  if arg3 =~ ' ' | let arg3 = '"' . arg3 . '"' | endif
  let arg3 = substitute(arg3, '!', '\!', 'g')
  if $VIMRUNTIME =~ ' '
    if &sh =~ '\<cmd'
      if empty(&shellxquote)
        let l:shxq_sav = ''
        set shellxquote&
      endif
      let cmd = '"' . $VIMRUNTIME . '\diff"'
    else
      let cmd = substitute($VIMRUNTIME, ' ', '" ', '') . '\diff"'
    endif
  else
    let cmd = $VIMRUNTIME . '\diff'
  endif
  let cmd = substitute(cmd, '!', '\!', 'g')
  silent execute '!' . cmd . ' ' . opt . arg1 . ' ' . arg2 . ' > ' . arg3
  if exists('l:shxq_sav')
    let &shellxquote=l:shxq_sav
  endif
endfunction

在以上内容后面添加:

" 去除欢迎界面,“帮助乌干达男孩”之类的
set shortmess=atI
" 打开行号
set nu
" 打开相对行号功能
set rnu
" 设置默认的字体为Consolas,大小为9
set guifont=Consolas:h9
" 光标遇到圆括号、方括号、大括号时,自动高亮对应的另一个圆括号、方括号和大括号
set showmatch
" 配色方案选择slate
colorscheme slate
" 语法使能
syntax enable
" 语法高亮
syntax on
" 按文件类型缩进打开
filetype indent on
" 按文件类型插件缩进打开
filetype plugin indent on

_vimrc文件中参数的配置还有很多,对小白来说,暂时以上就足够了。

打开一个helloworld.cpp文件
在这里插入图片描述

可以看到,配色已经更改了,代码的字体为9号的consolas;
左侧的行号已经显示出来(贴左为绝对行号),相对行号也显示出来,方便跳转。

如果想要学习与vim相关的更多内容,可以参看vimhelp

推荐一个好的vim插件排行网站https://vimawesome.com/

3 vim-plug插件安装及配置

vim强大的原因之一,就是它各种各样丰富的插件系统。
对此,我们采用vim-plug进行插件管理。需要说明的是,安装这个插件最好装一个git,有git才方便它执行自动安装等操作。
此插件在github上的地址为:vim-plug

该工具的安装配置过程非常简单,只需要下载plug.vim文件,并将其放置在用户目录的autoload路径下,例如:本小白放置在C:\Users\Admin\vimfiles\autoload目录下
在这里插入图片描述

然后只需要在_vimrc文件中进行设置即可,设置的方式也很简单。
只需要用call plug#begin()call plug#end()把需要的插件包围起来,像下面这样:

call plug#begin()

" 在此处列举你需要的插件
Plug 'XXXX/vim-pluginname'

call plug#end()

在gvim的normal模式下,可以用常用的命令:

  • :PlugInstall 安装插件
  • :PlugUpdate 更新插件
  • :PlugDiff 查看最新更新的差异
  • :PlugClean 清除不在list中的插件

按照这个说法,打开gvim后,也不需要离线下载剩余的插件了,只需要配置:

call plug#begin()

Plug 'SirVer/ultisnips'
Plug 'honza/vim-snippets'
Plug 'lervag/vimtex'
call plug#end()

输入:PlugInstall,打个响指,稍等片刻
然后就可以迎娶白富美、出任CEO,走上人生巅峰……
在这里插入图片描述

这是官方的表述,看上去确实很简单,but小白没成功,原因经过查询,似乎是因为github的网络连接不稳定,导致PlugInstall命令无法成功执行。

所以小白采用的是离线配置的方法,在接下来的配置中将会讲述。

4 ultisnips和vim-snippets插件安装及配置

这两个插件,都是为了让vim能够自动补全代码,提高输入效率的。也是数学小哥能用 LaTeX \LaTeX{} LATEX写课堂笔记的核心武器。需要注意的是在github上同名的插件数量有点多,需要认准以下二位的:

  • SirVer/ultisnips
  • honza/vim-snippets

先分别从两个仓库中把最新版本的插件下载下来:
在这里插入图片描述

将两个插件分别解压,放到gvim安装目录下:C:\Program Files\Vim\vim91\autoload
然后在_vimrc配置文件中写入:

call plug#begin("C:\Program Files\Vim\vim91\autoload")
Plug 'C:\Program Files\Vim\vim91\autoload\ultisnips-3.2'
Plug 'C:\Program Files\Vim\vim91\autoload\vim-snippets-1.0.0'
call plug#end()

" tab键唤醒自动片段
let g:UltiSnipsExpandTrigger="<tab>"
" ctrl+tab键唤醒自动片段列表
let g:UltiSnipsListSnippets="<c-tab>"
" tab键在自动片段选项中向后跳转
let g:UltiSnipsJumpForwardTrigger="<tab>"
" shift+tab键在自动片段选项中向前跳转
let g:UltiSnipsJumpBackwardTrigger="<s-tab>"
" 片段文件的地址
let g:UltiSnipsSnippetDirectories=['C:\Program Files\Vim\vim91\autoload\vim-snippets-1.0.0\UltiSnips']

注意到,以上对vim-plug.vim文件地址、ultisnipsvim-snippets的路径均进行了绝对地址设置。如果不这样设置,可能会引发错误。

此时如果新建一个.cpp文件,在gvim中打开,如图,输入main,再按tab:
在这里插入图片描述

这就表明我们已经成功配置了片段联想插件。这样的话,就离数学小哥的飞速笔记又近了一步。

我们稍做一点探究:在C:\Program Files\Vim\vim91\autoload\vim-snippets-1.0.0\UltiSnips目录下面,能看到对应很多种语言的.snippets文件,这些文件即配置了在不同语言下联想片段的功能。
在这里插入图片描述

关于.snippets文件的自定义撰写,需要另外学习,本文暂不考虑这些,先使用插件中自带的配置方式进行。小白后续使用过程中再去学习如何配置自己的片段联想文件。

5 vimtex插件安装及配置

前面铺垫了这么多,终于轮到 LaTeX \LaTeX{} LATEX插件。
官方下载地址如下:
/lervag/vimtex

这部分在配置文件中需要配置更多,小白也是从别的博客中摘抄下来的:

set shortmess=atI
set nu
set rnu
set guifont=Consolas:h9
set showmatch
colorscheme slate
syntax enable
syntax on
filetype indent on
filetype plugin indent on

call plug#begin("C:\Program Files\Vim\vim91\autoload")
Plug 'C:\Program Files\Vim\vim91\autoload\ultisnips-3.2'
Plug 'C:\Program Files\Vim\vim91\autoload\vim-snippets-1.0.0'
Plug 'C:\Program Files\Vim\vim91\autoload\vimtex-2.15'
call plug#end()

let g:UltiSnipsExpandTrigger="<tab>"
let g:UltiSnipsListSnippets="<c-tab>"
let g:UltiSnipsJumpForwardTrigger="<tab>"
let g:UltiSnipsJumpBackwardTrigger="<s-tab>"
let g:UltiSnipsSnippetDirectories=['C:\Program Files\Vim\vim91\autoload\vim-snippets-1.0.0\UltiSnips']

"LaTeX配置
let g:tex_flavor='latex'
let g:vimtex_texcount_custom_arg=' -ch -total'
"映射VimtexCountWords!\lw 在命令模式下enter此命令可统计中英文字符的个数
au FileType tex map <buffer> <silent>  <leader>lw :VimtexCountWords!  <CR><CR>
let g:Tex_ViewRule_pdf = 'E:\Latex\SumatraPDF\SumatraPDF.exe -reuse-instance -inverse-search "gvim -c \":RemoteOpen +\%l \%f\""'

"这里是LaTeX编译引擎的设置,这里默认LaTeX编译方式为-pdf(pdfLaTeX),
"vimtex提供了magic comments来为文件设置编译方式
"例如,我在tex文件开头输入 % !TEX program = xelatex   即指定-xelatex (xelatex)编译文件
let g:vimtex_compiler_latexmk_engines = {
    \ '_'                : '-pdf',
    \ 'pdflatex'         : '-pdf',
    \ 'dvipdfex'         : '-pdfdvi',
    \ 'lualatex'         : '-lualatex',
    \ 'xelatex'          : '-xelatex',
    \ 'context (pdftex)' : '-pdf -pdflatex=texexec',
    \ 'context (luatex)' : '-pdf -pdflatex=context',
    \ 'context (xetex)'  : '-pdf -pdflatex=''texexec --xtx''',
    \}
"这里是设置latexmk工具的可选参数
let g:vimtex_compiler_latexmk = {
    \ 'build_dir' : '',
    \ 'callback' : 1,
    \ 'continuous' : 1,
    \ 'executable' : 'latexmk',
    \ 'hooks' : [],
    \ 'options' : [
    \   '-verbose',
    \   '-file-line-error',
    \   '-shell-escape',
    \   '-synctex=1',
    \   '-interaction=nonstopmode',
    \ ],
    \}

" 阅读器相关的配置 包含正反向查找功能 仅供参考
let g:vimtex_view_general_viewer = 'C:\Users\Admin\AppData\Local\SumatraPDF\SumatraPDF.exe' "这里放置你的sumatrapdf 安装路径
let g:vimtex_view_general_options_latexmk = '-reuse-instance'
let g:vimtex_view_general_options
     \ = ' -reuse-instance -forward-search @tex @line @pdf'
     \ . ' -inverse-search "' . 'cmd /c start /min \"\" '  . exepath(v:progpath)
     \ . ' -v --not-a-term -T dumb -c  \"VimtexInverseSearch %l ''%f''\""' "for vim/gvim



"编译过程中忽略警告信息
let g:vimtex_quickfix_open_on_warning=0

let g:vimtex_quickfix_mode=0
set conceallevel=1
let g:tex_conceal='abdmg'

创建了一个texTest.tex文件:

% !TEX program = xelatex
\documentclass[]{ctexart}
\usepackage[utf8]{inputenc}
\usepackage{fontspec}
\setCJKmainfont{DingTalkJinBuTi-Regular.ttf}
\begin{document}
\title{Hello, World}
\author{ErDong XiaoBai}
\date{\today} 
\maketitle
	Hello, \LaTeX{} World!

	你好,世界!
	
	这世界真的很残酷,因为世界并不是按照人的意志来设计的。
	所以我们更加要珍惜彼此,珍惜生活。
	回归理性,这才是一种认真的生活态度。

	$
		A = \bigcap_{i\in I}A_i
		\infty
	$
\end{document}

在normal模式下输入\ll即可编译该文档,如下所示。

在这里插入图片描述

注意到在配置文件中输入的最后两行,可以起到tex文件编辑过程中转换和隐形的作用:

set conceallevel=1
let g:tex_conceal='abdmg'

在这里插入图片描述

到这一步,小白已经算是初步搭建了gvim+vimtex的编译环境。但即使是数学小哥的那篇博客里,还针对个性化自定义做出了大量的修改,这些动作对于提高编辑速度均有很大作用,且通过自定义tex.snippets文件可以拥有更大的灵活性。
这就留待后续的使用过程中进一步学习了。对于这篇文章只能暂时告一段落。

6 参考文献

  1. How I’m able to take notes in mathematics lectures using LaTeX and Vim
  2. vim的四个模式以及常用快捷键
  3. Vim 配置入门
  4. 让你的vim更加强大,vim-plug安装插件实战!
  5. vim配置之snippets代码块
  6. Vim+VimTeX:带给你飞一般的LaTeX编辑体验
  7. VimTeX+Vim:带你愉快地编辑LaTeX文件
  8. Vim Latex 的使用和配置技巧 (二)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/715245.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大一期末——写程序100道

1&#xff0e;用循环的嵌套&#xff0c;输出输出如下图形 * * * * * * * * * * * * * * * * * * * * * * * * * public static void main(String[] args) {int i0;//用i记录行数int j1;//用j记录每一行打印*的个数while (i<7){//打印7行if (i<3){//打印1~3行int xj;用x记…

毕业了校园卡怎么改套餐?

毕业了校园卡怎么改套餐&#xff1f; 毕业生校园卡99元套餐变更8元保号套餐教程 学弟学妹们恭喜毕业呀&#x1f393; 校园卡绑定了好多东西注销不掉又不想交高额月租的看过来。 今天一招教你更改校园卡套餐。 中国移动/电信/联通App 打开App&#xff0c;在首页右上角点击人工…

vue框架学习------框架概述

框架 在基础语言之上,对各种基础功能进行封装 什么是框架 框架&#xff08;Framework&#xff09;是整个或部分系统的可重用设计&#xff0c;表现为一组抽象构件及构件实例间交互的方法; 另一种定义认为&#xff0c;框架是可被应用开发者定制的应用骨架。前者是从应用方面而…

system与excel族函数区别

1.system #include<stdlib.h> int system(const char *command); comand是命令的路径&#xff0c;一般我们用绝对路径 system函数会创建新的进程&#xff0c;新的进程执行完返回原来的进程&#xff0c;原来的进程则继续执行后面的代码段。 如我们创建一个sys.cpp文件…

Oracle 入门--前提

目录 1.sqlplus 2.dual是什么&#xff1f; 3.SQL语句的种类 4.Oracle是如何工作的 5.Oracle查看配置文件 6.修改配置文件 7.常用的参数设置 1.sqlplus 管理数据库&#xff1a;启动&#xff0c;关闭&#xff0c;创建&#xff0c;删除对象......查看数据库的运行状态&…

可视化大屏开发系列——页面布局

页面布局是可视化大屏的基础&#xff0c;想要拥有一个基本美观的大屏&#xff0c;就得考虑页面整体模块的宽高自适应&#xff0c;我们自然就会想到具有强大灵活性flex布局&#xff0c;再借助百分比布局来辅助。至此&#xff0c;大屏页面布局问题即可得到解决。 写在前面&#x…

YOLOv10涨点改进创新MSAM注意力,通道注意力升级,魔改CBAM

目录 1,YOLO v10介绍 1.1 C2fUIB介绍 1.2 PSA介绍 1.3 SCDown 2.自研MSAM 2.1 自研MSAM注意力介绍 3.MSAM如何加入到YOLOv8 3.1 MSAM加入ultralytics/nn/attention/MsAM.py 3.2 修改tasks.py1)首先进行引用定义 3.3 yolov10n-MSAM.yaml 3.4 yolov10n-PSMSAM.yaml 改…

C++内存管理(free和delete区别)

本文由小编本人创作&#xff0c;如有不对&#xff0c;请多指正! 我们先来讲一些常见的数据类型存储在哪些位置&#xff0c;大家可以根据下面的试题来检验一下自己 第一个是属于全局变量&#xff0c;他是储存在静态区的&#xff0c;第二个是静态全局变量&#xff0c;也是属于静…

Keil5新建工程详细讲解

一. 新建文件夹并拷贝库文件 新建project文件夹后建立4个子文件夹&#xff1a;startup&#xff0c;device&#xff0c;drivers&#xff0c;main 二. 新建mdk工程 1. 打开MDK软件&#xff0c;再点击Project->New uVision Project…新建一个工程&#xff0c;在弹出的对话框内…

OpenCV中 haarcascades 级联分类器各种模型.xml文件介绍

haarcascades Haar Cascades 是一种用于对象检测的机器学习模型&#xff0c;特别是在OpenCV库中广泛使用。这些模型通过训练大量的正样本&#xff08;包含目标对象的图像&#xff09;和负样本&#xff08;不包含目标对象的图像&#xff09;来识别图像中的对象。Haar Cascades …

技巧解析,如何向Kimi提问才能写出更好的论文?

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 今天为大家整理、分享的Kimi提问技巧&#xff0c;将对论文写作的各个阶段提供帮助&#xff0c;可以以此来辅助学术论文撰写。 在此之前&#xff0c;先为大家科普一个概念——信息熵&am…

CSS实现前端小组件随笔

一.CSSJS实现打字机效果 1.1实现效果 1.2HTML部分 <span class"bottom-text"></span> 1.3CSS部分 .bottom-text {font-fanmily: "fangsong";display:inline-block;position:relative;font-size:20px;height:20px;inline-height:20px;color…

Redis 分片集群

一. 前言 前面文章介绍了主从集群和哨兵模式。其中主从集群可以通过读写分离的方式解决高并发场景下的读问题&#xff1b;而在主节点出现故障时&#xff0c;又可以通过哨兵模式的自动选举来实现高可用。 Redis 主从集群 && 哨兵模式 二. Redis 分片集群 2.1 分片集群…

图解 Twitter 架构图

写在前面 两年前&#xff0c;马老板收购了twitter&#xff0c;并且做了一系列的大动作。那么今天我们来看一下这个全球最火的软件之一的架构。 Twitter解析 开始之前&#xff0c;我先提前说明一下&#xff0c;我之前不是做搜推广的&#xff0c;所以对这些了解不是很深&…

SwiftUI 6.0(Xcode 16)全新 @Entry 和 @Previewable 宏让开发妙趣横生

概览 如火如荼的 WWDC 2024 已进入第五天&#xff0c;苹果开发平台中众多海量新功能都争先恐后的喷薄欲出。 在这里就让我们从中挑两个轻松有趣的新功能展示给小伙伴们吧&#xff1a;它们分别是 全新的 Entry 和 Previewable 宏。 在本篇博文中&#xff0c;您将学到如下内容&a…

WEB基础--Mybatis

了解Mybatis 什么是Mybatis 市面上最流行的技术架构&#xff1a;SSM 他们代表了 Spring业务层框架&#xff0c;SpringMvc WEB层框架以及MyBatis数据库持久层框架。 MyBatis 作为一个数据库持久层框架&#xff0c;是基于ORM规范(对象关系映射) 。类似我们以前的JDBC 和 JPA。…

DzzOffice集成功能最丰富的开源PHP+MySQL办公系统套件

DzzOffice是一套开源办公套件&#xff0c;旨在为企业和团队提供类似“Google企业应用套件”和“微软Office365”的协同办公平台。以下是对DzzOffice的详细介绍&#xff1a; 主要功能和应用&#xff1a; 网盘&#xff1a;支持企业、团队文件的集中管理&#xff0c;提供文件标签…

memory动态内存管理学习之shared_ptr

此头文件是动态内存管理库的一部分。std::shared_ptr 是一种通过指针保持对象共享所有权的智能指针。多个 shared_ptr 对象可持有同一对象。下列情况之一出现时销毁对象并解分配其内存&#xff1a; 最后剩下的持有对象的 shared_ptr 被销毁&#xff1b;最后剩下的持有对象的 s…

PID_Compact指令博图仿真

一、PID_Compact 指令管脚介绍 做仿真前&#xff0c;肯定要对主角有一定了解才能够按我们需要的去控制。 主要管脚介绍&#xff1a; 输入参数&#xff1a; setpoint&#xff1a;自动模式下的用户设定值&#xff1b; input&#xff1a;实际反馈值&#xff0c;非模拟量&#x…

[Linux] TCP协议介绍(2): TCP协议的“三次握手“过程分析、超时重传机制介绍...

上一篇文章中, 已经介绍了TCP协议的数据格式, 简单分析了其与UDP协议 关于可靠性方面的差异 本篇文章, 介绍分析一下 使用TCP协议通信, 非常重要的一个过程: 三次握手 TCP的"三次握手" TCP协议是有连接的传输层协议, 即使用TCP协议通信, 是需要建立连接的 TCP协议…