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

news2024/11/24 17:27:31

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 的使用和配置技巧 (二)

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C/C++ Adaline自适应线性神经网络算法详解及源码

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

C++11参数包...Args

以list中的包装器做介绍 包装器是由一个类模板接收后存储在统一的...Args中 标准格式 说明&#xff1a;...Args就是参数包的类型 实例&#xff1a; //参数包 void Show() {cout <<"结束" << endl; }template<class T,class ...Args> void Show(T…

跟着刘二大人学pytorch(第---13---节课之RNN高级篇)

文章目录 0 前言0.1 课程视频链接&#xff1a;0.2 课件下载地址&#xff1a; 1 本节课任务描述模型的处理过程训练循环初始化分类器是否使用GPU构造损失函数和优化器每个epoch所要花费的时间遍历每个epoch时进行训练和测试记录每次测试的准确率加入到列表中 具体实现&#xff0…

哇塞,超好吃的麻辣片,一口就爱上

最近&#xff0c;我发现了一款让人欲罢不能的美食——食家巷麻辣片&#xff01;&#x1f60d; 一打开包装&#xff0c;那浓郁的麻辣香气就扑鼻而来&#xff0c;瞬间刺激着我的嗅觉神经。&#x1f603;食家巷麻辣片的外观色泽鲜艳&#xff0c;红通通的一片&#xff0c;看着就特…

Verilog综合出来的图

Verilog写代码时需要清楚自己综合出来的是组合逻辑、锁存器还是寄存器。 甚至&#xff0c;有时写的代码有误&#xff0c;vivado不能识别出来&#xff0c;这时打开综合后的schematic简单查看一下是否综合出想要的结果。 比如&#xff1a;误将一个always模块重复一遍&#xff0c;…

Java环境安装

下载JDK https://www.oracle.com/cn/java/technologies/downloads/#jdk22-windows 点开那个下载都可以但是要记住下载的路径因为下一步要添加环境变量 选择编辑系统环境变量 点击环境变量 点击新建 新建环境变量JAVA_HOME 并输入JDK在计算机保存的路径 打开cmd 输入java -…

深度解析Spring事务管理:从源码到实际应用

引言 Spring框架的事务管理是Java企业级应用开发中不可或缺的一部分。它提供了一种声明式和编程式的事务管理方式&#xff0c;极大地简化了事务的处理。本文将深入探讨Spring事务的底层实现原理&#xff0c;通过源码分析&#xff0c;揭示其内部工作机制。 EnableTransactionMan…

举例说明 如何判断Spark作业的瓶颈

首先看哪个Job执行时间长&#xff1a; 例如下图中明显Job 2时间执行最长&#xff0c;这个对rdd作业是直观有效的。 对于sql作业可能不准确&#xff0c;sql需要关注stage的详情耗时。 然后看执行时间长的Job中哪个stage执行时间长&#xff1a; 明显stage 7和stage 13执行时间长&…

Excel中多条件判断公式怎么写?

在Excel里&#xff0c;这种情况下的公式怎么写呢&#xff1f; 本题有两个判断条件&#xff0c;按照题设&#xff0c;用IF函数就可以了&#xff0c;这样查看公式时逻辑比较直观&#xff1a; IF(A2>80%, 4, IF(A2>30%, 8*(A2-30%),0)) 用IF函数写公式&#xff0c;特别是当…

单列集合顶层接口Collection及五类遍历方式(迭代器)

collection add方法细节&#xff1a; remove方法细节&#xff1a; contains方法细节&#xff1a; 如果集合中存储的是自定义对象, student之类的, 也想通过contains进行判断, 就必须在javaBean中重写equals方法 contains在arrayList中源代码&#xff1a;在底层调用了equals方…

爱了爱了,11款超良心App推荐!

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/今天&#xff0c;我们向你推荐十款与众不同但又不错的win10软件&#xff0c;它们都有各自的功能和优点&#xff0c;相信你一定会喜欢。 1.图片处…

大数据开发流程解析

大数据开发是一个复杂且系统的过程&#xff0c;涉及需求分析、数据探查、指标管理、模型设计、ETL开发、数据验证、任务调度以及上线管理等多个阶段。本文将详细介绍每个阶段的内容&#xff0c;并提供相关示例和代码示例&#xff0c;帮助理解和实施大数据开发流程。 本文中的示…

通义千问调用笔记

如何使用通义千问API_模型服务灵积(DashScope)-阿里云帮助中心 package com.ruoyi.webapp.utils;import com.alibaba.dashscope.aigc.generation.Generation; import com.alibaba.dashscope.aigc.generation.GenerationOutput; import com.alibaba.dashscope.aigc.generation.G…

期末算法复习

0-1背包问题&#xff08;动态规划&#xff09; 例题 算法思想&#xff1a; 动态规划的核心思想是将原问题拆分成若干个子问题&#xff0c;并利用已解决的子问题的解来求解更大规模的问题。 主要是状态转移方程和状态 算法描述&#xff1a; 初始化一个二维数组dp&#xff0…

深度学习 --- stanford cs231学习笔记三(卷积神经网络CNN)

卷积神经网络CNN 1&#xff0c;有效的利用了图像的空间信息/局部感受野 全连接神经网络中的神经是由铺平后的所有像素计算决定。 由于计算时是把图像的所有像素拉成了一条线&#xff0c;因此在拉伸的同时也损失了图像像素之间固有的空间信息。 卷积层中的神经只由5x5x3(假设fil…

JavaFX文本

另一个基本的JavaFX节点是Text节点&#xff0c;它允许我们在场景图上显示文本。要创建Text节点&#xff0c;请使用javafx.scene.text.Text类。 所有JavaFX场景节点都从javafx.scene.Node中扩展&#xff0c;并且它们继承了许多功能&#xff0c;例如缩放&#xff0c;翻译或旋转的…

稀疏矩阵是什么 如何求

稀疏矩阵是一种特殊类型的矩阵&#xff0c;其中大多数元素都是零。由于稀疏矩阵中非零元素的数量远少于零元素&#xff0c;因此可以使用特定的数据结构和算法来高效地存储和处理它们&#xff0c;从而节省存储空间和计算时间。 RowPtr 数组中的每个元素表示对应行的第一个非零元…

计算机缺失msvcr110.dll如何解决,这6种解决方法可有效解决

电脑已经成为我们生活和工作中不可或缺的工具&#xff0c;然而在使用电脑的过程中&#xff0c;我们常常会遇到一些问题&#xff0c;其中之一就是电脑找不到msvcr110.dll文件。这个问题可能会给我们带来一些困扰&#xff0c;但是只要我们了解其原因并采取相应的解决方法&#xf…

C 语言连接MySQL 数据库

前提条件 本机安装MySQL 8 数据库 整体步骤 第一步&#xff1a;开启Windows 子系统安装Ubuntu 22.04.4&#xff0c;安装MySQL 数据库第三方库执行 如下命令&#xff1a; sudo aptitude install libmysqlclient-dev wz2012LAPTOP-8R0KHL88:/mnt/e/vsCode/cpro$ sudo aptit…

使用Java Spring Boot生成二维码与条形码

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…