使用Virsual Studio Code优雅地写LaTex

前言

最近在学习使用LaTex写作,由于我目前使用Manjaro,Linux上目前没有优秀的LaTex写作软件,VS Code成为了我目前的一个好选择。

  • 本文转载自 Ethlisan 由我重新排版,部分内容经过编辑
  • Visual Studio Code (以下简称 VS Code)是微软推出的一款编辑器,在尝试为用他配置 Python 开发环境之后,我深深的被 VS Code的代码高亮和中文显示吸引了,以至于用了这么多年的 Sublime Text 都想迁移到 VS Code,搭建好 LaTeX 环境之后,我对比了下 Sublime Text 和 VS Code,感觉 Sublime Text 这块更成熟(特指 LaTeX),VS Code 属于追赶者,用过之后觉得还是很不错的~~

基本要求

  1. TeXlive 或者 MiKTeX (本文以 TeXlive 2015 为例)

  2. Visual Studio Code

  3. LaTeX Workshop (VS Code 插件)

软件的安装

TeXlive 和 Visual Studio Code 的安装这里不赘述,需要注意的一个事情是,安装之后需要将 TeXlive 的 bin 目录(C:\texlive\2015\bin\win32)添加到系统的环境变量(PATH)中。

插件的安装

在安装 Visual Studio Code 之后,在左侧打开 扩展(快捷键 Ctrl+Shift+X),搜索 LaTeX Workshop,选择安装,并选择重启 VS Code 激活插件。

两种编译方式

  1. 使用可变 TeX 引擎

在我们编写 LaTeX 文档的时候,有两个命令很特殊,一个是 %!TEX program = xelatex,一个是 % !TEX root = relative/or/absolute/path/to/root/file.tex,前者指定编译方式,后者指定主(根)文件,借助这个,我们可以对不同文档设定不同的编译方式,这就简化了编译时的麻烦。如果我们指定了文档的编译方式,则只需要按照下面配置就可以编译 LaTeX 文档了。

具体做法是,在 VS Code 左下角,点击齿轮图案的按钮,选择 设置,在右侧添加 LaTeX Workshop 的配置命令

    "latex-workshop.latex.clean.enabled": false,
    "latex-workshop.view.pdf.hand": true,
    // 可变编译方式 
    "latex-workshop.latex.toolchain": [
      {
        "command": "", // 注意这里是留空的
        "args": [
          "-synctex=1",
          "-interaction=nonstopmode",
          "-file-line-error",
          "%DOC%"
        ]
      }
    ],

    "latex-workshop.latex.clean.enabled": false,
    "latex-workshop.view.pdf.hand": true,
    // 可变编译方式 
    "latex-workshop.latex.toolchain": [
      {
        "command": "", // 注意这里是留空的
        "args": [
          "-synctex=1",
          "-interaction=nonstopmode",
          "-file-line-error",
          "%DOC%"
        ]
      }
    ],

然后我们选择新建一个文档(前几天看到两个博主借鉴我们 2014 年 Sublime Text 搭建 LaTeX 编写环境博文的内容,连下面的代码都是一样的,但是在文中却没有引用我们的,呵呵),鉴于此,我决定加入一些个人信息。

 %!TEX program = xelatex
 % 使用 ctexart 文类,UTF-8 编码
\documentclass[UTF8]{ctexart}
\title{测试}
\author{ddswhu}
\date{\today}

\begin{document}
\maketitle

This is the context of the article.

这就是文章的所有内容。

\end{document}


将这个文件保存为 test.tex,然后使用快捷键 Ctrl+Alt+B 编译,或者在文档中,鼠标右键,选择 Build LaTeX Project,这样就能使用 xelatex 编译 test.tex 了。

其实,LaTeX Workshop 默认的编译方式是 latexmk,我们还可以仿造 MiKTeX 里面的 TeXify 命令,只需要将配置修改为

"latex-workshop.latex.toolchain": [
  {
    "command": "texify",
    "args": [
      "--synctex",
      "--pdf",
      "--tex-option=\"-interaction=nonstopmode\"",
      "--tex-option=\"-file-line-error\"",
      "%DOC%.tex"
    ]
  }
]
  1. 指定编译方式

修改插件配置文件**(不推荐)**

说到指定单独的编译方式,这里还是有两个不同的方式,一种是在上述的配置基础上继续修改,可以将 command修改为 xelatex或者pdflatex以及bibtex。

以下是一个完整的 PDFLaTeX 编译(pdflatex->bibtex->pdflatex->pdflatex)

"latex-workshop.latex.toolchain": [
  {
    "command": "pdflatex",
    "args": [
      "-synctex=1",
      "-interaction=nonstopmode",
      "-file-line-error",
      "%DOC%"
    ]
  }, {
    "command": "bibtex",
    "args": [
      "%DOCFILE%"
    ]
  }, {
    "command": "pdflatex",
    "args": [
      "-synctex=1",
      "-interaction=nonstopmode",
      "-file-line-error",
      "%DOC%"
    ]
  }, {
    "command": "pdflatex",
    "args": [
      "-synctex=1",
      "-interaction=nonstopmode",
      "-file-line-error",
      "%DOC%"
    ]
  }
]

因为这里指定了具体的编译方式,所以在文档部分不需要指定编译方式。由于配置文件是全局的,所以这种方式对于不同文件,你需要临时配置文件,有点不太方便。

修改项目任务(tasks.json)文件(推荐) 在 VS Code 中,在操作时并不是以单个文件为依托,而是以项目或者工程为单位。对应的,在 VS Code,我们需要将这个文件夹导入到 VS Code 中,并为这个项目配置 tasks.json 文件,在 tasks.json 文件中指定编译方式等。

具体操作是,在任务栏选择 任务->运行任务,然后 VS Code 会提示没有任务,需要配置任务,然后选择使用模板创建任务,在模板选择的时候,选择 Others 。然后将 tasks.json文件内容修改如下:

 {
     // See https://go.microsoft.com/fwlink/?LinkId=733558
     // for the documentation about the tasks.json format
     // Author: EthanDENG
     // Homepage: http://ddswhu.com/
     // Last Update: 2017/11/01
     // Latest Version: http://ddswhu.com/download/

     "version": "2.0.0",
     "tasks": [
         {
             "taskName": "XeLaTeX",
             "type": "shell",
             "command": "xelatex",
             "args": [
                 "-synctex=1",
                 "-interaction=nonstopmode",
                 "-file-line-error",
                 "${file}"
             ],
             "problemMatcher": "$tsc-watch"
         },
         {
             "taskName": "PDF Preview",
             "type": "shell",
             "command": "SumatraPDF -reuse-instance ${fileBasenameNoExtension}.pdf",
             "problemMatcher": "$tsc-watch"
         },
         {
             "taskName": "PDFLaTeX",
             "type": "shell",
             "command": "pdflatex",
             "args": [
                 "-synctex=1",
                 "-interaction=nonstopmode",
                 "-file-line-error",
                 "${file}"
             ],
             "problemMatcher": "$tsc-watch"
         },
         {
             "taskName": "BibTeX",
             "type": "shell",
             "command": "bibtex",
             "args": [
                 "${fileBasenameNoExtension}.aux"
             ],
             "problemMatcher": "$tsc-watch"
         },
         {
             "taskName": "LaTeX",
             "type": "shell",
             "command": "latex",
             "args": [
                 "-synctex=1",
                 "-interaction=nonstopmode",
                 "${file}"
             ],
             "problemMatcher": "$tsc-watch"
         },
         {
             "taskName": "dvi2pdf",
             "type": "shell",
             "command": "dvipdfmx",
             "args": [
                 "${fileBasenameNoExtension}.dvi"
             ],
             "problemMatcher": "$tsc-watch"
         },
         {
             "taskName": "dvi2ps",
             "type": "shell",
             "command": "dvips",
             "args": [
                 "${fileBasenameNoExtension}.dvi"
             ],
             "problemMatcher": "$tsc-watch"
         },
         {
             "taskName": "ps2pdf",
             "type": "shell",
             "command": "ps2pdf",
             "args": [
                 "${fileBasenameNoExtension}.ps"
             ],
             "problemMatcher": "$tsc-watch"
         }
     ]
 }


这样,任务配置好了,接下来就只要运行就行了。依次选择 任务->运行任务,选择你所需要的编译方式,如果需要完整编译,假设文档有 bib 文件,则需要选择 PDFLaTeX->BibTeX->PDFLaTeX->PDFLaTeX。

这种配置的好处是,你可以完全控制编译方式,能选择编译 bib 文件,适用于大型项目,比如论文,笔记或者书籍等(推荐)。并且只要你配置好 tasks.json文件之后,以后打开文件就不用管编译方式和配置了,可以直接运行任务就行。

其他设置

修改配置文件编译快捷键 编译的默认快捷键是 Ctrl+Alt+B,由于我习惯了 Sublime Text 的 Ctrl+B,所以这里我们再提一下 VS Code 快捷键的设置,在 VS Code 左下角,点击齿轮图案的按钮,选择 键盘快捷方式,然后再搜索栏里面选择 LaTeX Workshop,将第一个 Build LaTeX Project 的快捷键修改为 Ctrl+B 即可。

为任务文件编译添加快捷键 上述的快捷键是修改默认的编译快捷键,为了能让我们更方便的编译,我推荐使用下面的快捷键设置

//  Author: Ethan DENG
//  Homepage: http://ddswhu.com/
//  Last Update: 2017/11/01
//  Latest Version: http://ddswhu.com/download/ 
{
    "key": "ctrl+1",
    "command": "workbench.action.tasks.runTask",
    "when": "editorFocus && !findWidgetVisible && !replaceActive && !searchViewletVisible",
    "args": "PDFLaTeX"
},
{
    "key": "ctrl+2",
    "command": "workbench.action.tasks.runTask",
    "when": "editorFocus && !findWidgetVisible && !replaceActive && !searchViewletVisible",
    "args": "XeLaTeX"
},
{
    "key": "ctrl+3",
    "command": "workbench.action.tasks.runTask",
    "when": "editorFocus && !findWidgetVisible && !replaceActive && !searchViewletVisible",
    "args": "BibTeX"
},
{
    "key": "ctrl+4",
    "command": "workbench.action.tasks.runTask",
    "when": "editorFocus && !findWidgetVisible && !replaceActive && !searchViewletVisible",
    "args": "PDF Preview"
}

将上述代码添加到 VS Code 的 keybindings.json 中即可。添加方法:文件->首选项->键盘快捷方式,在搜索框下方找到 keybindings.json文件并打开,将上述内容添加到末尾即可。上述配置了4个快捷键,

  1. Ctrl+1:PDFLaTeX
  2. Ctrl+2:XeLaTeX
  3. Ctrl+3:BibTeX
  4. Ctrl+4:PDF Preview (使用 SumatraPDF 预览)

区分配置文件设置与任务文件设置

这里有两个东西我们需要区分下,为了让 VS Code 能编译 tex 文件,我们有两种方法,一种是通过修改配置文件(latex-workshop.latex.toolchain),一种是修改文件夹内所在的任务文件(tasks.json),他们之间的区别是

  1. LaTeX Workshop 配置法:需要文件开头指定编译方式,即 %!TEX program = xelatex,可以使用 pdflatex与xelatex,不适用于含 bib 文档的编译,快捷键为 Ctrl+B,适用于单个文档或者小型项目。
  2. 项目任务文件配置法:无需指定文档编译方式,可以通过 Ctrl+1-4 自由选择编译方式,需要在项目文件夹内修改 tasks.json文件,原则上适用于任何项目。 tasks.json 文件 使用 tasks.json文件有两种方式。
  • 第一种方法是,参照本文文末下载 .vscode.zip,将其解压放在每个需要添加 tasks.json的 LaTeX 项目(文件夹)下。
  • 第二种方法是,将上述内容保存下来,在新建 LaTeX 项目的时候,按照上述过程添加 tasks.json即可。

为了简化第二种方法的工作量,我们这里借助 VS Code 里面的代码片段(code snippet)。VS Code 根据语言分类,将代码分类存放在不同的 json文件中,我们只需要将 tasks.json的内容转为 snippet,添加到 json.json下面即可,在下次需要修改 tasks.json文件的时候,输入latextask,然后按下 Tab键即可。具体的,文件->首选项->用户代码片段,键入 JSON,然后将下面内容添加到 json.json 中。

{
    //  Author: Ethan DENG
    //  Homepage: http://ddswhu.com/
    //  Last Update: 2017/11/01
    //  Latest Version: http://ddswhu.com/download/ 
    "The content of tasks.json file of LaTeX files ": {
        "prefix": "latextask",
        "body": [
          "{",
          "    // See https://go.microsoft.com/fwlink/?LinkId=733558",
          "    // for the documentation about the tasks.json format",
          "    \"version\": \"2.0.0\",",
          "    \"tasks\": [",
          "        {",
          "            \"taskName\": \"XeLaTeX\",",
          "            \"type\": \"shell\",",
          "            \"command\": \"xelatex\",",
          "            \"args\": [",
          "                \"-synctex=1\",",
          "                \"-interaction=nonstopmode\",",
          "                \"-file-line-error\",",
          "                \"\\${file}\"",
          "            ],",
          "            \"problemMatcher\": \"\\$tsc-watch\"",
          "        },",
          "        {",
          "            \"taskName\": \"PDF Preview\",",
          "            \"type\": \"shell\",",
          "            \"command\": \"SumatraPDF -reuse-instance \\${fileBasenameNoExtension}.pdf\",",
          "            \"problemMatcher\": \"\\$tsc-watch\"",
          "        },",
          "        {",
          "            \"taskName\": \"PDFLaTeX\",",
          "            \"type\": \"shell\",",
          "            \"command\": \"pdflatex\",",
          "            \"args\": [",
          "                \"-synctex=1\",",
          "                \"-interaction=nonstopmode\",",
          "                \"-file-line-error\",",
          "                \"\\${file}\"",
          "            ],",
          "            \"problemMatcher\": \"\\$tsc-watch\"",
          "        },",
          "        {",
          "            \"taskName\": \"BibTeX\",",
          "            \"type\": \"shell\",",
          "            \"command\": \"bibtex\",",
          "            \"args\": [",
          "                \"\\${fileBasenameNoExtension}.aux\"",
          "            ],",
          "            \"problemMatcher\": \"\\$tsc-watch\"",
          "        },",
          "        {",
          "            \"taskName\": \"LaTeX\",",
          "            \"type\": \"shell\",",
          "            \"command\": \"latex\",",
          "            \"args\": [",
          "                \"-synctex=1\",",
          "                \"-interaction=nonstopmode\",",
          "                \"\\${file}\"",
          "            ],",
          "            \"problemMatcher\": \"\\$tsc-watch\"",
          "        },",
          "        {",
          "            \"taskName\": \"dvi2pdf\",",
          "            \"type\": \"shell\",",
          "            \"command\": \"dvipdfmx\",",
          "            \"args\": [",
          "                \"\\${fileBasenameNoExtension}.dvi\"",
          "            ],",
          "            \"problemMatcher\": \"\\$tsc-watch\"",
          "        },",
          "        {",
          "            \"taskName\": \"dvi2ps\",",
          "            \"type\": \"shell\",",
          "            \"command\": \"dvips\",",
          "            \"args\": [",
          "                \"\\${fileBasenameNoExtension}.dvi\"",
          "            ],",
          "            \"problemMatcher\": \"\\$tsc-watch\"",
          "        },",
          "        {",
          "            \"taskName\": \"ps2pdf\",",
          "            \"type\": \"shell\",",
          "            \"command\": \"ps2pdf\",",
          "            \"args\": [",
          "                \"\\${fileBasenameNoExtension}.ps\"",
          "            ],",
          "            \"problemMatcher\": \"\\$tsc-watch\"",
          "        }",
          "    ]",
          "}"
        ],
        "description": "The content of tasks.json file of LaTeX files "
      }
}

反向定位跳转

通过右侧的红色 PDF 按钮,我们可以打开 PDF 预览,我们在查看 PDF 的时候,可以通过快捷键 Ctrl+Shift+Left跳转到代码。

updatedupdated2021-09-232021-09-23
点击刷新