[
  {
    "path": ".gitignore",
    "content": ".DS_Store\n"
  },
  {
    "path": "README.en.md",
    "content": "# Configure LaTeX in VSCode\n\nEnglish | [中文](README.zh.md)\n\nThis guide shows how to set up a LaTeX environment in VSCode for editing and previewing, so you can work efficiently and comfortably.\n\nSupported features:\n\n-   Auto compile on save\n-   XeLaTeX and PdfLaTeX support (Chinese and English)\n-   Output to a dedicated folder `./tmp`\n-   English word completion with Chinese translations\n-   LaTeX syntax completion\n-   Fast math snippets (e.g. `@a` expands to `\\alpha`)\n-   Path auto-completion\n-   Auto-generate matrix and figure environments\n-   Live preview for equations and images\n-   Auto-format `.tex` files\n\nExample result after a full setup:\n\n![Alt text](img/iShot_2023-02-13_12.26.45.gif)\n\nThe configuration includes:\n\n- [Software installation](#software-installation)\n  - [Install TeX Live](#install-tex-live)\n  - [Install VSCode](#install-vscode)\n- [VSCode extensions](#vscode-extensions)\n  - [How to install](#how-to-install)\n  - [Recommended extensions](#recommended-extensions)\n- [LaTeX Workshop configuration](#latex-workshop-configuration)\n  - [Basic settings](#basic-settings)\n  - [Compile toolchain](#compile-toolchain)\n- [Advanced configuration](#advanced-configuration)\n  - [Format LaTeX with latexindent](#format-latex-with-latexindent)\n  - [Fast math input with HyperSnips for Math](#fast-math-input-with-hypersnips-for-math)\n  - [Version control with Git](#version-control-with-git)\n  - [Speed up with TikZ externalize](#speed-up-with-tikz-externalize)\n\n## Software installation\n\n### Install TeX Live\n\nTeX Live is a full LaTeX distribution and is recommended for compiling LaTeX documents. If you previously installed MikTeX, uninstall it completely before installing TeX Live.\n\nWindows / Linux users can download the installer here: [texlive.iso](https://mirrors.tuna.tsinghua.edu.cn/CTAN/systems/texlive/Images/). Download the ISO and run the installer.\n\nMac users can download: [MacTeX.pkg](https://mirrors.tuna.tsinghua.edu.cn/ctan/systems/mac/mactex/). Download the pkg and run it.\n\n### Install VSCode\n\nVSCode is a lightweight editor that supports LaTeX. Download the installer from [Visual Studio Code](https://code.visualstudio.com/download) and install it.\n\n## VSCode extensions\n\n### How to install\n\nClick the Extensions icon on the left:\n\n![Extensions](img/iShot_2023-02-13_10.19.01.png)\n\nSearch for the extension and click Install.\n\n### Recommended extensions\n\nEverything below is optional except LaTeX Workshop.\n\n-   LaTeX Workshop\n\n    LaTeX Workshop provides compilation, preview, and syntax checking.\n\n    ![latex workshop](img/iShot_2023-02-13_10.22.55.png)\n\n-   English Word Hint\n\n    English Word Hint suggests English words and shows Chinese translations to improve English writing efficiency.\n\n    ![English word hint](img/iShot_2023-02-13_10.24.58.png)\n\n-   Path Auto Complete\n\n    Path Auto Complete inserts image paths quickly.\n\n    ![Alt text](img/iShot_2023-02-13_11.57.52.png)\n\n-   indent rainbow\n\n    indent rainbow colorizes indentation levels.\n\n    ![Alt text](img/iShot_2023-02-13_10.27.37.png)\n\n-   Word Count CJK\n\n    Word Count CJK counts words for Chinese documents.\n\n    ![Alt text](img/iShot_2023-02-13_10.29.03.png)\n\n-   Code Spell Checker\n\n    Code Spell Checker checks English spelling with low memory overhead.\n\n    ![Alt text](img/iShot_2023-02-13_10.31.35.png)\n\n-   LTex\n\n    LTex checks spelling and grammar, but is slower and uses more memory. Choose either LTex or Code Spell Checker.\n\n    ![Alt text](img/iShot_2023-02-13_10.31.59.png)\n\n-   Project Manager\n\n    Project Manager helps you switch between multiple VSCode projects.\n\n    ![Alt text](img/iShot_2023-02-13_10.36.21.png)\n\n-   Material Icon Theme\n\n    Material Icon Theme adds icons to the VSCode file tree.\n\n    ![Alt text](img/iShot_2023-02-13_10.38.20.png)\n\n-   WakaTime\n\n    WakaTime tracks coding time by language for better time planning.\n\n    ![Alt text](img/iShot_2023-02-13_10.39.39.png)\n\n## LaTeX Workshop configuration\n\nThe settings below are my personal configuration. Adjust as needed.\n\n### Basic settings\n\n```json\n\"latex-workshop.hover.preview.mathjax.extensions\": [\n    \"boldsymbol\"\n],\n\"latex-workshop.intellisense.package.enabled\": true,\n\"latex-workshop.latex.outDir\": \"./tmp\",\n\"latex-workshop.latex.recipe.default\": \"lastUsed\",\n\"latex-workshop.mathpreviewpanel.cursor.enabled\": true,\n\"latex-workshop.message.error.show\": false,\n\"latex-workshop.message.warning.show\": false,\n\"latex-workshop.view.pdf.invert\": 1,\n\"latex-workshop.view.pdf.invertMode.enabled\": \"auto\",\n```\n\nClick the gear icon in the lower-left corner of VSCode, choose Settings, and search for each option to update it. For example:\n\n![Alt text](img/iShot_2023-02-13_10.47.32.png)\n\nIf you are comfortable with VSCode, open Command Palette, search for settings, open settings.json, and paste the snippet directly.\n\nExplanation of each setting:\n\n```text\n// Enable boldsymbol in hover preview\n\"latex-workshop.hover.preview.mathjax.extensions\": [\n    \"boldsymbol\"\n],\n// Enable IntelliSense for package commands and environments\n\"latex-workshop.intellisense.package.enabled\": true,\n// Output directory for compiled files\n\"latex-workshop.latex.outDir\": \"./tmp\",\n// Default recipe uses the last one you ran\n\"latex-workshop.latex.recipe.default\": \"lastUsed\",\n// Enable the math preview panel for complex formulas\n\"latex-workshop.mathpreviewpanel.cursor.enabled\": true,\n// Disable error popups\n\"latex-workshop.message.error.show\": false,\n// Disable warning popups\n\"latex-workshop.message.warning.show\": false,\n// Invert colors when previewing PDF\n\"latex-workshop.view.pdf.invert\": 1,\n// Auto detect when to invert PDF colors\n\"latex-workshop.view.pdf.invertMode.enabled\": \"auto\",\n```\n\n### Compile toolchain\n\nI recommend using latexmk, which automatically detects changes and supports multiple engines such as XeLaTeX and PdfLaTeX.\n\nIn settings.json, find `latex-workshop.latex.tools` and `latex-workshop.latex.recipes`, delete them, and replace with:\n\n```json\n\"latex-workshop.latex.recipes\": [\n    {\n        \"name\": \"XeLaTeX\",\n        \"tools\": [\n            \"xelatexmk\"\n        ]\n    },\n    {\n        \"name\": \"PdfLaTeX\",\n        \"tools\": [\n            \"pdflatexmk\"\n        ]\n    }\n],\n\"latex-workshop.latex.tools\": [\n    {\n        \"args\": [\n            \"-synctex=1\",\n            \"-pdfxe\",\n            \"-interaction=nonstopmode\",\n            \"-file-line-error\",\n            \"-outdir=%OUTDIR%\",\n            \"%DOC%\"\n        ],\n        \"command\": \"latexmk\",\n        \"env\": {},\n        \"name\": \"xelatexmk\"\n    },\n    {\n        \"args\": [\n            \"-synctex=1\",\n            \"-pdf\",\n            \"-interaction=nonstopmode\",\n            \"-file-line-error\",\n            \"-outdir=%OUTDIR%\",\n            \"%DOC%\"\n        ],\n        \"command\": \"latexmk\",\n        \"env\": {},\n        \"name\": \"pdflatexmk\"\n    }\n],\n```\n\n## Advanced configuration\n\nThis section is optional.\n\n### Format LaTeX with latexindent\n\nInstall latexindent.pl first, following [latexindent.pl](https://github.com/cmhughes/latexindent.pl).\n\nAdd this to settings.json:\n\n```json\n\"latex-workshop.latexindent.args\": [\n    \"-g\",\n    \"./%OUTDIR%/indent.log\",\n    \"%TMPFILE%\",\n    \"-y=defaultIndent: '%INDENT%'\"\n],\n```\n\nThis sends latexindent.pl logs to `tmp/indent.log` for easier management.\n\n### Fast math input with HyperSnips for Math\n\nInstall HyperSnips for Math and follow the extension's setup instructions.\n\nWith this extension, typing `eq` expands to:\n\n```latex\n\\begin{equation}\n\n\\end{equation}\n```\n\n[latex.hsnips](latex.hsnips) is my personal config and supports two features.\n\nType `bmat n m` and press Space to generate an empty matrix:\n\n```latex\n// bmat 3 4\n\\begin{bmatrix}\n     &  &  &  \\\\\n     &  &  &  \\\\\n     &  &  &  \\\\\n\\end{bmatrix}\n```\n\nType `fig label n` and press Space to generate a figure block with multiple subfigures:\n\n```latex\n\\begin{figure}[htb!]\n    \\centering\n    \\begin{subfigure}{.3\\textwidth}\n        \\centering\n        \\includegraphics[width=\\textwidth]{./img}\n        \\caption{}\n        \\label{fig:example_1}\n    \\end{subfigure}\n    \\begin{subfigure}{.3\\textwidth}\n        \\centering\n        \\includegraphics[width=\\textwidth]{./img}\n        \\caption{}\n        \\label{fig:example_2}\n    \\end{subfigure}\n    \\begin{subfigure}{.3\\textwidth}\n        \\centering\n        \\includegraphics[width=\\textwidth]{./img}\n        \\caption{}\n        \\label{fig:example_3}\n    \\end{subfigure}\n    \\caption{}\n    \\label{fig:example}\n\\end{figure}\n```\n\nAdjust other snippets as needed.\n\n### Version control with Git\n\nInstall Git first. Click the Source Control icon in VSCode. If Git is missing, VSCode will prompt you to install it.\n\n![Alt text](img/iShot_2023-02-15_16.45.42.png)\n\nRecommended extensions:\n\n-   GitLens\n\n    GitLens adds blame and history features. Some features require a Pro subscription, so turn them off in settings. You can also use the free alternatives below.\n\n-   Git Graph\n\n    Git Graph shows the commit history visually.\n\n-   Commit Message Editor\n\n    Commit Message Editor formats commit messages. You can import this [config](shinyypig_commit_config.json).\n\n![Alt text](img/iShot_2023-02-15_16.54.32.png)\n\n### Speed up with TikZ externalize\n\nMake sure your output directory is `./tmp/`, then add this to your `.tex` file:\n\n```latex\n\\usetikzlibrary{external}\n\\immediate\\write18{mkdir -p tmp/tmp/}\n\\tikzexternalize[\n    prefix=tmp/,\n    mode=list and make,\n]\n```\n\nThen create a `latexmkrc` file at the project root:\n\n```perl\n$clean_ext .= ' %R.figlist %R-figure* %R.makefile fls.tmp';\n$latex    = 'internal tikzlatex latex    %B %O %S';\n$pdflatex = 'internal tikzlatex pdflatex %B %O %S';\n$lualatex = 'internal tikzlatex lualatex %B %O %S';\n$xelatex  = 'internal tikzlatex xelatex  %B %O %S';\n$hash_calc_ignore_pattern{'pdf'} = '^(/CreationDate|/ModDate|/ID)';\n$hash_calc_ignore_pattern{'ps'} = '^%%CreationDate';\n\nsub tikzlatex {\n  my ($engine, $base, @args) = @_;\n  my $ret = 0;\n  print \"Tikzlatex: ===Running '$engine @args'...\\n\";\n  $ret = system( $engine, @args );\n  print \"Tikzlatex: Fixing .fls file ...\\n\";\n  system \"echo INPUT \\\"$aux_dir1$base.figlist\\\"  >  \\\"$aux_dir1$base.fls.tmp\\\"\";\n  system \"echo INPUT \\\"$aux_dir1$base.makefile\\\" >> \\\"$aux_dir1$base.fls.tmp\\\"\";\n  system \"cat \\\"$aux_dir1$base.fls\\\"    >> \\\"$aux_dir1$base.fls.tmp\\\"\";\n  rename \"$aux_dir1$base.fls.tmp\", \"$aux_dir1$base.fls\";\n  if ($ret) { return $ret; }\n  if ( -e \"$aux_dir1$base.makefile\" ) {\n    if ($engine eq 'xelatex') {\n      print \"Tikzlatex: ---Correcting '$aux_dir1$base.makefile' made under xelatex\\n\";\n      system( 'perl', '-i', '-p', '-e', 's/^\\^\\^I/\\t/', \"$aux_dir1$base.makefile\" );\n    }\n    elsif ($engine eq 'latex') {\n      print \"Tikzlatex: ---Correcting '$aux_dir1$base.makefile' made under latex\\n\";\n      system( 'perl', '-i', '-p', '-e', 's/\\.epsi/\\.ps/', \"$aux_dir1$base.makefile\" );\n    }\n    print \"Tikzlatex: ---Running 'make -f $aux_dir1$base.makefile' ...\\n\";\n    if ($aux_dir) {\n    #   system \"perl -i -p -e 's#-shell-escape#-shell-escape -output-directory=\\\"$aux_dir1\\\"#g' $aux_dir1$base.makefile\";\n      system \"perl -i -p -e 's#$base.figlist#$aux_dir1$base.figlist#g' $aux_dir1$base.makefile\";\n      system \"cp $aux_dir1$aux_dir1*.md5 $aux_dir1\";\n      system \"rm -rf $aux_dir1$aux_dir1\";\n      $ret = system \"make\",  \"-j\", \"10\", \"-f\", \"$aux_dir1$base.makefile\";\n      system \"rm $base.run.xml\";\n    }\n    else {\n      $ret = system \"make\",  \"-j\", \"10\", \"-f\", \"$base.makefile\";\n    }\n    if ($ret) {\n      print \"Tikzlatex: !!!!!!!!!!!!!! Error from make !!!!!!!!! \\n\",\n            \"  The log files for making the figures '$aux_dir1$base-figure*.log'\\n\",\n            \"  may have information\\n\";\n    }\n  }\n  else {\n    print \"Tikzlatex: No '$aux_dir1$base.makefile', so I won't run make.\\n\";\n  }\n  return $ret;\n}\n```\n\nFinally, update LaTeX Workshop tools as follows:\n\n```json\n\"latex-workshop.latex.tools\": [\n    {\n        \"args\": [\n            \"-synctex=1\",\n            \"--pdfxe\",\n            \"-shell-escape\",\n            \"-interaction=nonstopmode\",\n            \"-file-line-error\",\n            \"-outdir=%OUTDIR%\",\n            \"%DOC%\"\n        ],\n        \"command\": \"latexmk\",\n        \"env\": {},\n        \"name\": \"xelatexmk\"\n    },\n    {\n        \"args\": [\n            \"-synctex=1\",\n            \"-pdflatex\",\n            \"-shell-escape\",\n            \"-interaction=nonstopmode\",\n            \"-file-line-error\",\n            \"-outdir=%OUTDIR%\",\n            \"%DOC%\"\n        ],\n        \"command\": \"latexmk\",\n        \"env\": {},\n        \"name\": \"pdflatexmk\"\n    }\n],\n```\n"
  },
  {
    "path": "README.md",
    "content": "# 在 VSCode 中配置 LaTeX 环境\n\n中文 | [English](README.en.md)\n\n本教程将介绍如何在 VSCode 中配置 LaTeX 环境，以便于在 VSCode 中进行 LaTeX 的编写和预览，打造一个舒适便捷的 LaTeX 编写环境。\n\n支持的功能有：\n\n- 保存文件时自动编译\n- 支持 XeLaTeX 和 PdfLaTeX 编译 (中英文)\n- 编译结果输出到特定文件夹./tmp\n- 英文单词补全，以及中文翻译\n- LaTeX 语法自动补全\n- 支持快速输入公式，比如输入`@a`会自动补全为`\\alpha`\n- 自动补全路径\n- 自动生成矩阵和图片环境\n- 实时预览公式、图片\n- 自动格式化 tex 文件\n\n完整配置后的效果如下：\n\n![Alt text](img/iShot_2023-02-13_12.26.45.gif)\n\n配置部分主要包含以下内容：\n\n- [软件安装](#软件安装)\n    - [TeX Live 安装](#tex-live-安装)\n    - [VSCode 安装](#vscode-安装)\n- [VSCode 插件](#vscode-插件)\n    - [如何安装](#如何安装)\n    - [插件推荐](#插件推荐)\n- [LaTeX Workshop 配置](#latex-workshop-配置)\n    - [基本配置](#基本配置)\n    - [编译工具链配置](#编译工具链配置)\n- [进阶配置](#进阶配置)\n    - [使用 latexindent 格式化 LaTeX 代码](#使用-latexindent-格式化-latex-代码)\n    - [使用 HyperSnips for Math 插件快速输入公式](#使用-hypersnips-for-math-插件快速输入公式)\n    - [使用 Git 进行版本管理](#使用-git-进行版本管理)\n    - [TiKZ Externalize 加速编译](#tikz-externalize-加速编译)\n\n## 软件安装\n\n### TeX Live 安装\n\nTeX Live 是一个 LaTeX 发行版，并且包含较为完整的 LaTeX 环境，推荐使用 TeX Live 进行 LaTeX 的编译。如果之前安装过 MikTeX，一定要将其完全卸载后，再安装 TeX Live。\n\nWindows / Linux 用户可以直接下载安装包进行安装，安装包下载地址为：[texlive.iso](https://mirrors.tuna.tsinghua.edu.cn/CTAN/systems/texlive/Images/)，下载 texlive.iso 文件，双击安装即可。\n\nMac 用户下载 Mac 版本的发行包，安装包下载地址为：[MacTeX.pkg](https://mirrors.tuna.tsinghua.edu.cn/ctan/systems/mac/mactex/)，下载 MacTeX.pkg 文件，双击安装即可。\n\n### VSCode 安装\n\nVSCode 是一个轻量级的编辑器，支持多种语言的编写，包括 LaTeX。安装包下载地址为：[Visual Studio Code](https://code.visualstudio.com/download)，下载对应系统的安装包，双击安装即可。\n\n## VSCode 插件\n\n### 如何安装\n\n点击左侧的扩展按钮\n\n![Extensions](img/iShot_2023-02-13_10.19.01.png)\n\n搜索对应的插件，点击安装即可。\n\n### 插件推荐\n\n除了 LaTeX Workshop 之外，其他插件都是可选的，可以根据自己的需求进行安装。\n\n- LaTeX Workshop\n\n    LaTeX Workshop 支持 LaTeX 的编译、预览、语法检查等功能。\n\n    ![latex workshop](img/iShot_2023-02-13_10.22.55.png)\n\n- English Word Hint\n\n    English Word Hint 是一个英语单词提示插件，可以在编写英语文档时，自动提示相关英语单词，并显示对应的中文翻译，提高英文文档编写效率。\n\n    ![English word hint](img/iShot_2023-02-13_10.24.58.png)\n\n- Path Auto Complete\n\n    Path Auto Complete 可以自动补全路径，方便快速插入图片。\n\n    ![Alt text](img/iShot_2023-02-13_11.57.52.png)\n\n- indent rainbow\n\n    indent rainbow 可以为不同层级的缩进添加不同的颜色，方便阅读。\n\n    ![Alt text](img/iShot_2023-02-13_10.27.37.png)\n\n- Word Count CJK\n\n    Word Count CJK 可以统计中文文档的字数。\n\n    ![Alt text](img/iShot_2023-02-13_10.29.03.png)\n\n- Code Spell Checker\n\n    Code Spell Checker 可以检查文档中的英文单词拼写错误，轻量级插件，速度快，内存占用少。\n\n    ![Alt text](img/iShot_2023-02-13_10.31.35.png)\n\n- LTex\n\n    LTex 是一个拼写以及语法检查插件，不仅仅可以检查拼写错误，还可以检查语法错误，功能强大，但是速度较慢，内存占用较大。与 Code Spell Checker 两者可以视配置二选一。\n\n    ![Alt text](img/iShot_2023-02-13_10.31.59.png)\n\n- Project Manager\n\n    Project Manager 可以管理多个 VSCode 项目，方便快速打开或切换项目。\n\n    ![Alt text](img/iShot_2023-02-13_10.36.21.png)\n\n- Material Icon Theme\n\n    Material Icon Theme 可以为 VSCode 左侧的文件树添加图标，方便查看。\n\n    ![Alt text](img/iShot_2023-02-13_10.38.20.png)\n\n- WakaTime\n\n    WakaTime 可以统计编程时间，以及编程语言的使用时间，以帮助我们更好的规划学习时间。\n\n    ![Alt text](img/iShot_2023-02-13_10.39.39.png)\n\n## LaTeX Workshop 配置\n\n下面的配置是我个人的配置，可以根据自己的需求进行修改。\n\n### 基本配置\n\n```json\n\"latex-workshop.hover.preview.mathjax.extensions\": [\n    \"boldsymbol\"\n],\n\"latex-workshop.intellisense.package.enabled\": true,\n\"latex-workshop.latex.outDir\": \"./tmp\",\n\"latex-workshop.latex.recipe.default\": \"lastUsed\",\n\"latex-workshop.mathpreviewpanel.cursor.enabled\": true,\n\"latex-workshop.message.error.show\": false,\n\"latex-workshop.message.warning.show\": false,\n\"latex-workshop.view.pdf.invert\": 1,\n\"latex-workshop.view.pdf.invertMode.enabled\": \"auto\",\n```\n\n点击 VSCode 左下角的齿轮按钮，选择 settings （设置），进入设置界面。\n搜索对应的条目，并修改为相应的配置，其余配置默认即可。比如：\n\n![Alt text](img/iShot_2023-02-13_10.47.32.png)\n\n如果比较熟悉 VSCode，可以点击左下角的齿轮按钮，选择 Command Palette (命令面板)，在命令面板中搜索 settings，打开 settings.json 文件，直接复制粘贴上面的代码，从而快速修改配置。\n\n配置项的具体解释如下：\n\n```text\n// 鼠标悬停，预览公式时，支持 boldsymbol 宏\n\"latex-workshop.hover.preview.mathjax.extensions\": [\n    \"boldsymbol\"\n],\n// 是否启用 IntelliSense，自动补全引用的包中的环境和命令\n\"latex-workshop.intellisense.package.enabled\": true,\n// 编译后的文件输出目录\n\"latex-workshop.latex.outDir\": \"./tmp\",\n// 默认编译引擎为上次使用的\n\"latex-workshop.latex.recipe.default\": \"lastUsed\",\n// 预览复杂公式，使用时需要通过 command palette (命令面板) 打开\n\"latex-workshop.mathpreviewpanel.cursor.enabled\": true,\n// 不允许弹窗显示错误信息\n\"latex-workshop.message.error.show\": false,\n// 不允许弹窗显示警告信息\n\"latex-workshop.message.warning.show\": false,\n// 预览 PDF 时，反转颜色\n\"latex-workshop.view.pdf.invert\": 1,\n// 预览 PDF 时，自动检测是否需要反转颜色\n\"latex-workshop.view.pdf.invertMode.enabled\": \"auto\",\n```\n\n### 编译工具链配置\n\n推荐使用 latexmk 进行编译，latexmk 可以自动检测文档中的变化，自动进行编译，并且同时支持多种编译引擎，包括 XeLaTeX、PdfLaTeX。\n\n在 settings.json 文件中找到 latex-workshop.latex.tools 和 latex-workshop.latex.recipes 配置项，将其全部删除，并修改为如下配置：\n\n```json\n\"latex-workshop.latex.recipes\": [\n    {\n        \"name\": \"XeLaTeX\",\n        \"tools\": [\n            \"xelatexmk\"\n        ]\n    },\n    {\n        \"name\": \"PdfLaTeX\",\n        \"tools\": [\n            \"pdflatexmk\"\n        ]\n    }\n],\n\"latex-workshop.latex.tools\": [\n    {\n        \"args\": [\n            \"-synctex=1\",\n            \"-pdfxe\",\n            \"-interaction=nonstopmode\",\n            \"-file-line-error\",\n            \"-outdir=%OUTDIR%\",\n            \"%DOC%\"\n        ],\n        \"command\": \"latexmk\",\n        \"env\": {},\n        \"name\": \"xelatexmk\"\n    },\n    {\n        \"args\": [\n            \"-synctex=1\",\n            \"-pdf\",\n            \"-interaction=nonstopmode\",\n            \"-file-line-error\",\n            \"-outdir=%OUTDIR%\",\n            \"%DOC%\"\n        ],\n        \"command\": \"latexmk\",\n        \"env\": {},\n        \"name\": \"pdflatexmk\"\n    }\n],\n```\n\n## 进阶配置\n\n这一部分的配置可选，如果不需要可以跳过。\n\n### 使用 latexindent 格式化 LaTeX 代码\n\n首先需要安装 latexindent.pl，具体安装方法可以参考 [latexindent.pl](https://github.com/cmhughes/latexindent.pl)。\n\n修改 settings.json 文件，添加如下配置：\n\n```json\n\"latex-workshop.latexindent.args\": [\n    \"-g\",\n    \"./%OUTDIR%/indent.log\",\n    \"%TMPFILE%\",\n    \"-y=defaultIndent: '%INDENT%'\"\n],\n```\n\n该配置的主要目的是将 latexindent.pl 的输出信息输出到 tmp/indent.log 文件中，方便统一管理。\n\n### 使用 HyperSnips for Math 插件快速输入公式\n\n首先安装 HyperSnips for Math， 然后根据插件说明进行基本配置。\n\n利用该插件可以快速输入公式，比如输入 `eq` 就可以自动生成\n\n```latex\n\\begin{equation}\n\n\\end{equation}\n```\n\n[latex.hsnips](latex.hsnips)是我的个人配置，主要支持两个功能\n\n输入 `bmat n m` 然后按空格键，可以自动生成对应大小的空矩阵：\n\n```latex\n// bmat 3 4\n\\begin{bmatrix}\n     &  &  &  \\\\\n     &  &  &  \\\\\n     &  &  &  \\\\\n\\end{bmatrix}\n```\n\n输入 `fig label n` 然后按空格键，可以自动生成对应数量的图片插入代码，label 则为对应的标签：\n\n```latex\n\\begin{figure}[htb!]\n    \\centering\n    \\begin{subfigure}{.3\\textwidth}\n        \\centering\n        \\includegraphics[width=\\textwidth]{./img}\n        \\caption{}\n        \\label{fig:example_1}\n    \\end{subfigure}\n    \\begin{subfigure}{.3\\textwidth}\n        \\centering\n        \\includegraphics[width=\\textwidth]{./img}\n        \\caption{}\n        \\label{fig:example_2}\n    \\end{subfigure}\n    \\begin{subfigure}{.3\\textwidth}\n        \\centering\n        \\includegraphics[width=\\textwidth]{./img}\n        \\caption{}\n        \\label{fig:example_3}\n    \\end{subfigure}\n    \\caption{}\n    \\label{fig:example}\n\\end{figure}\n```\n\n其余配置可以根据自己的需求进行修改。\n\n### 使用 Git 进行版本管理\n\n首先需要安装 Git：点击 VSCode 左侧的 Source Control (源代码管理) 图标，如果没有安装 Git，会提示安装，根据提示安装即可。\n\n![Alt text](img/iShot_2023-02-15_16.45.42.png)\n\n推荐安装的插件有：\n\n- GitLens\n\n    GitLens 拓展了 VSCode 的源代码管理功能，可以查看每一行代码的提交记录，以及每一次提交的详细信息。但是需要 pro 会员才能解锁全部功能，建议直接在设置中关闭 pro 功能。相关功能，安装下方开源免费插件替代即可。\n\n- Git Graph\n\n    Git Graph 可以以图形化的方式展示 Git 仓库的提交记录，方便查看。\n\n- Commit Message Editor\n\n    Commit Message Editor 可以格式化 commit 信息。可以导入该[配置](shinyypig_commit_config.json)，方便统一管理，效果如下。\n\n![Alt text](img/iShot_2023-02-15_16.54.32.png)\n\n### TiKZ Externalize 加速编译\n\n确保你的 LaTeX 的输出目录为`./tmp/`，然后在你的 tex 文件中添加如下代码：\n\n```latex\n\\usetikzlibrary{external}\n\\immediate\\write18{mkdir -p tmp/tmp/}\n\\tikzexternalize[\n    prefix=tmp/,\n    mode=list and make,\n]\n```\n\n接着在文档根目录下新建`latexmkrc`文件，添加如下代码：\n\n```perl\n$clean_ext .= ' %R.figlist %R-figure* %R.makefile fls.tmp';\n$latex    = 'internal tikzlatex latex    %B %O %S';\n$pdflatex = 'internal tikzlatex pdflatex %B %O %S';\n$lualatex = 'internal tikzlatex lualatex %B %O %S';\n$xelatex  = 'internal tikzlatex xelatex  %B %O %S';\n$hash_calc_ignore_pattern{'pdf'} = '^(/CreationDate|/ModDate|/ID)';\n$hash_calc_ignore_pattern{'ps'} = '^%%CreationDate';\n\nsub tikzlatex {\n  my ($engine, $base, @args) = @_;\n  my $ret = 0;\n  print \"Tikzlatex: ===Running '$engine @args'...\\n\";\n  $ret = system( $engine, @args );\n  print \"Tikzlatex: Fixing .fls file ...\\n\";\n  system \"echo INPUT \\\"$aux_dir1$base.figlist\\\"  >  \\\"$aux_dir1$base.fls.tmp\\\"\";\n  system \"echo INPUT \\\"$aux_dir1$base.makefile\\\" >> \\\"$aux_dir1$base.fls.tmp\\\"\";\n  system \"cat \\\"$aux_dir1$base.fls\\\"    >> \\\"$aux_dir1$base.fls.tmp\\\"\";\n  rename \"$aux_dir1$base.fls.tmp\", \"$aux_dir1$base.fls\";\n  if ($ret) { return $ret; }\n  if ( -e \"$aux_dir1$base.makefile\" ) {\n    if ($engine eq 'xelatex') {\n      print \"Tikzlatex: ---Correcting '$aux_dir1$base.makefile' made under xelatex\\n\";\n      system( 'perl', '-i', '-p', '-e', 's/^\\^\\^I/\\t/', \"$aux_dir1$base.makefile\" );\n    }\n    elsif ($engine eq 'latex') {\n      print \"Tikzlatex: ---Correcting '$aux_dir1$base.makefile' made under latex\\n\";\n      system( 'perl', '-i', '-p', '-e', 's/\\.epsi/\\.ps/', \"$aux_dir1$base.makefile\" );\n    }\n    print \"Tikzlatex: ---Running 'make -f $aux_dir1$base.makefile' ...\\n\";\n    if ($aux_dir) {\n    #   system \"perl -i -p -e 's#-shell-escape#-shell-escape -output-directory=\\\"$aux_dir1\\\"#g' $aux_dir1$base.makefile\";\n      system \"perl -i -p -e 's#$base.figlist#$aux_dir1$base.figlist#g' $aux_dir1$base.makefile\";\n      system \"cp $aux_dir1$aux_dir1*.md5 $aux_dir1\";\n      system \"rm -rf $aux_dir1$aux_dir1\";\n      $ret = system \"make\",  \"-j\", \"10\", \"-f\", \"$aux_dir1$base.makefile\";\n      system \"rm $base.run.xml\";\n    }\n    else {\n      $ret = system \"make\",  \"-j\", \"10\", \"-f\", \"$base.makefile\";\n    }\n    if ($ret) {\n      print \"Tikzlatex: !!!!!!!!!!!!!! Error from make !!!!!!!!! \\n\",\n            \"  The log files for making the figures '$aux_dir1$base-figure*.log'\\n\",\n            \"  may have information\\n\";\n    }\n  }\n  else {\n    print \"Tikzlatex: No '$aux_dir1$base.makefile', so I won't run make.\\n\";\n  }\n  return $ret;\n}\n```\n\n最后，LaTeX Workshop 的工具配置需要修改为：\n\n```json\n\"latex-workshop.latex.tools\": [\n    {\n        \"args\": [\n            \"-synctex=1\",\n            \"--pdfxe\",\n            \"-shell-escape\",\n            \"-interaction=nonstopmode\",\n            \"-file-line-error\",\n            \"-outdir=%OUTDIR%\",\n            \"%DOC%\"\n        ],\n        \"command\": \"latexmk\",\n        \"env\": {},\n        \"name\": \"xelatexmk\"\n    },\n    {\n        \"args\": [\n            \"-synctex=1\",\n            \"-pdflatex\",\n            \"-shell-escape\",\n            \"-interaction=nonstopmode\",\n            \"-file-line-error\",\n            \"-outdir=%OUTDIR%\",\n            \"%DOC%\"\n        ],\n        \"command\": \"latexmk\",\n        \"env\": {},\n        \"name\": \"pdflatexmk\"\n    }\n],\n```\n"
  },
  {
    "path": "latex.hsnips",
    "content": "global\nfunction gen_matrix(nrow, ncol, index) {\n    let results = \"\\n\";\n    let order = 1;\n    for (var i=0; i<nrow; i++){\n        results += '    ';\n        for(var j = 0; j < ncol; j++){\n            results += \"\\$\" +(order ).toString() + ((j == ncol -1) ?  \" \\\\\\\\\\\\\" : \" & \");\n            order ++;\n        }\n        if (i == nrow-1) \n            results = results.slice(0, -4);\n        results += index ? \"\\n\" : \"\";\n    }\n    return results;\n}\nfunction gen_vector(m) {\n    let results = \"\";\n    let order = 1;\n    for (var i=0; i<m-1; i++){\n        results += \"$\" + (order).toString() + \" & \";\n        order ++;\n    }\n    results += \"$\" + (order).toString();\n    return results;\n}\nfunction gen_fig(label, nfig) {\n    let results = \"\";\n    results += \"\\\\begin{figure}[htb!]\\n\";\n    results += \"    \\\\centering\\n\";\n    let order = 2;\n    if (nfig == 1) {\n        results += \"    \\\\includegraphics[width=.${1:4}\\\\textwidth]{./img${2}}\\n\";\n        order ++;\n    } \n    else {\n        for (var i=0; i<nfig; i++){\n            results += \"    \\\\begin{subfigure}{.${1:3}\\\\textwidth}\\n\";\n            results += \"        \\\\includegraphics[width=\\\\textwidth]{./img${\" + (order).toString() + \"}}\\n\";\n            results += \"        \\\\caption{}\\n\";\n            results += \"        \\\\label{fig.\" + label + \"_\" + (i+1).toString() + \"}\\n\";\n            results += \"    \\\\end{subfigure}\\n\";\n            order ++;\n        }\n    }\n    results += \"    \\\\caption{${\" + (order).toString() + \"}}\\n\";\n    results += \"    \\\\label{fig.\" + label + \"}\\n\";\n    results += \"\\\\end{figure}\";\n    return results;\n}\nfunction gen_img(nfig) {\n    let results = \"<div align=center>\\n\";\n    if (nfig == 1) {\n        results += \"    <img width=50% style=margin:2% src=\\\"assets${1}\\\">\\n\";\n    } \n    else {\n        let order = 1;\n        for (var i=0; i<nfig; i++){\n            results += \"    <img width=30% style=margin:2% src=\\\"assets${\" + (order).toString() + \"}\\\">\\n\";\n            order ++;\n        }\n    }\n    results += \"</div>\\n\";\n    return results;\n}\nfunction gen_columns(m) {\n    if (m == 1) return \"\";\n    let results = \"\\\\begin{columns}[c]\\n\";\n    let order = 2;\n    for (var i=0; i<m; i++){\n        results += \"    \\\\begin{column}{.${1:45}\\\\textwidth}\\n\";\n        results += \"        ${\" + (order).toString() + \"}\\n\";\n        results += \"    \\\\end{column}\\n\";\n        order ++;\n    }\n    results += \"\\\\end{columns}\";\n    return results;\n}\n\nendglobal\n\n############################# tmp #############################\n# txc -> textcolor\nsnippet txc \"textcolor\" iA\n\\textcolor{c}{\n    ${1:${VISUAL}}\n}$0\nendsnippet\n\n############################# tikz ############################\n\nsnippet `^( *)tikz` \"theorem\" bA\n``rv = m[1]``\\begin{tikzpicture}\n``rv = m[1]``    $1\n``rv = m[1]``\\end{tikzpicture}$0\nendsnippet\n\nsnippet `scatter\\(([^,]+), ([^,]+)\\) ` \"scatter\" bA\n\\addplot[\n    only marks,\n    mark=*,\n    mark size=1.5,\n    mark options={draw=``rv=m[2]``,fill=``rv=m[2]``!80},\n] table[x=x, y=y, col sep=comma] {``rv=m[1]``};\nendsnippet\n\nsnippet `plot\\(([^,]+), ([^,]+)\\) ` \"plot line\" bA\n\\addplot[\n    ``rv=m[2]``,\n    thick,\n] table[x=x, y=y, col sep=comma] {``rv=m[1]``};\nendsnippet\n\nsnippet `scatter3\\(([^,]+), ([^,]+)\\) ` \"scatter\" bA\n\\addplot[\n    only marks,\n    mark=*,\n    mark size=1.5,\n    mark options={draw=``rv=m[2]``,fill=``rv=m[2]``!80},\n] table[x=x, y=y, z=z, col sep=comma] {``rv=m[1]``};\nendsnippet\n\nsnippet `plot3\\(([^,]+), ([^,]+)\\) ` \"plot line\" bA\n\\addplot[\n    ``rv=m[2]``,\n    thick,\n] table[x=x, y=y, z=z, col sep=comma] {``rv=m[1]``};\nendsnippet\n\nsnippet `axis2 ` \"pgfaxis\" bA\n\\begin{axis}[\n        xlabel=$ x $, ylabel=$ y $,\n        xmin=-3.5, xmax=3.5,\n        ymin=-2.5, ymax=2.5,\n        grid, axis equal image,\n        legend cell align=left,\n        legend style={\n                at={(axis cs:3.5,2.5)},\n                anchor=north east,\n                font=\\tiny,\n                draw=none,\n                fill=none\n            }\n    ]\n    $0\n\\end{axis}\nendsnippet\n\nsnippet `axis3 ` \"pgfaxis\" bA\n\\begin{axis}[\n        xlabel=$ x $, ylabel=$ y $, zlabel=$ z $,\n        xmin=-3.5, xmax=3.5,\n        ymin=-2.5, ymax=2.5,\n        zmin=-2.5, zmax=2.5,\n        grid, axis equal image,\n    ]\n    $0\n\\end{axis}\nendsnippet\n\n############################# beamer #############################\n#snippet only \"beamer only\" iA\n#\\only<${1:1}>{\n#    ${2:${VISUAL}}\n#}$0\n#endsnippet\n\nsnippet ani \"animategraphics\" bA\n\\animategraphics[width=\\textwidth,autoplay,loop,palindrome]{${1:12}}{./img${2}}{${3:0}}{${4:10}}\nendsnippet\n\nsnippet `col ([0-9]+) ` \"columns\" bA\n``rv = gen_columns(m[1])``$0\nendsnippet\n\n# frame abc  -> \\begin{frame}\nsnippet `frame (\\S+) ([0-9]+) ` \"label\" A\n\\begin{frame}{``rv = m[1]``}\n``rv = gen_columns(m[2])``$0\n\\end{frame}\nendsnippet\n############################# latex enverniments #############################\n# txt -> \\text{}\nsnippet txt \"text\" iA\n\\text{${1:${VISUAL}}}$0\nendsnippet\n\n# tit -> \\textit{}\nsnippet tit \"text it\" iA\n\\textit{${1:${VISUAL}}}$0\nendsnippet\n\n# tbf -> \\textbf{}\npriority 10\nsnippet tbf \"textbf\" iA\n\\textbf{${1:${VISUAL}}}$0\nendsnippet\n\n# lemma\nsnippet `^( *)lemma` \"lemma\" bA\n``rv = m[1]``\\begin{lemma}\n``rv = m[1]``    $1\n``rv = m[1]``\\end{lemma}$0\nendsnippet\n\n# theorem\nsnippet `^( *)thm` \"theorem\" bA\n``rv = m[1]``\\begin{theorem}\n``rv = m[1]``    $1\n``rv = m[1]``\\end{theorem}$0\nendsnippet\n\nsnippet `^( *)def` \"theorem\" bA\n``rv = m[1]``\\begin{definition}\n``rv = m[1]``    $1\n``rv = m[1]``\\end{definition}$0\nendsnippet\n\nsnippet == \"inline Math\" iA\n\\\\( ${1:${VISUAL}} \\\\)$0\nendsnippet\n\nsnippet `^( *)\\\\\\[` \"inline Math\" bA\n``rv = m[1]``\\[\n``rv = m[1]``    ${VISUAL}$0\n``rv = m[1]``\\]\nendsnippet\n\nsnippet `^( *)eq` \"equation\" bA\n``rv = m[1]``\\begin{equation}\n``rv = m[1]``    ${VISUAL}$0\n``rv = m[1]``\\end{equation}\nendsnippet\n\nsnippet `^( *)beg` \"begin{} / end{}\" bA\n``rv = m[1]``\\begin{$1}\n``rv = m[1]``\t${VISUAL}$0\n``rv = m[1]``\\end{$1}\nendsnippet\n\nsnippet `^( *)minipage` \"minipage\" bA\n``rv = m[1]``\\begin{minipage}{.${1:45}\\textwidth}\n``rv = m[1]``\t${VISUAL}$0\n``rv = m[1]``\\end{minipage}\nendsnippet\n\n# lab abc  -> \\label{abc}\nsnippet `lab (\\S+) ` \"label\" A\n\\label{``rv = m[1]``}\nendsnippet\n\n# bmat m n -> a matrix with the size of m*n\nsnippet `(bm|pm|m|vm)at ([0-9]+) ([0-9]+) ` \"matrix\" bA\n\\begin{``rv = m[1]``atrix}``\n    rv = gen_matrix(m[2],m[3],1);\n``\\end{``rv = m[1]``atrix}$0\nendsnippet\n\n# vec m -> a vector with the size of 1*m\nsnippet `vec ([0-9]+) ` \"matrix\" bA\n\\begin{bmatrix} ``rv = gen_vector(m[1])`` \\end{bmatrix}$0\nendsnippet\n\n# fig label n -> figure enverniment with n subfigures, and the labels are specified by label\nsnippet `fig (\\S+) ([0-9]+) ` \"figure\" bA\n``rv = gen_fig(m[1], m[2])``$0\nendsnippet\n\nsnippet `ref (\\S+) ` \"reference\" A\n\\cref{``rv = m[1]``}\nendsnippet\n\nsnippet `cite (\\S+) ` \"cite\" A\n\\cite{``rv = m[1]``}\nendsnippet\n\nsnippet `(chapter|section|subsection|subsubsection) (\\S+) ` \"paragraph\" bwA\n\\\\``rv = m[1]``{``rv = m[2]``}\n$0\nendsnippet\n\n############################# Math #############################\n############################# Greek letters\nsnippet @a \"alpha\" iAm\n\\alpha\nendsnippet\n\nsnippet @A \"alpha\" iAm\n\\alpha\nendsnippet\n\nsnippet @b \"beta\" iAm\n\\beta\nendsnippet\n\nsnippet @B \"beta\" iAm\n\\beta\nendsnippet\n\nsnippet @c \"chi\" iAm\n\\chi\nendsnippet\n\nsnippet @C \"chi\" iAm\n\\chi\nendsnippet\n\nsnippet @p \"pi\" iAm\n\\pi\nendsnippet\n\nsnippet :p \"partial\" iAm\n\\partial\nendsnippet\n\nsnippet @P \"Pi\" iAm\n\\Pi\nendsnippet\n\nsnippet @g \"gamma\" iAm\n\\gamma\nendsnippet\n\nsnippet @G \"Gamma\" iAm\n\\Gamma\nendsnippet\n\nsnippet @d \"delta\" iAm\n\\delta\nendsnippet\n\nsnippet @D \"Delta\" iAm\n\\Delta\nendsnippet\n\nsnippet @e \"epsilon\" iAm\n\\epsilon\nendsnippet\n\nsnippet @E \"epsilon\" iAm\n\\epsilon\nendsnippet\n\nsnippet :e \"varepsilon\" iAm\n\\varepsilon\nendsnippet\n\nsnippet :E \"varepsilon\" iAm\n\\varepsilon\nendsnippet\n\nsnippet @n \"nabla\" iAm\n\\nabla\nendsnippet\n\nsnippet @z \"zeta\" iAm\n\\zeta\nendsnippet\n\nsnippet @Z \"zeta\" iAm\n\\zeta\nendsnippet\n\nsnippet @t \"theta\" iAm\n\\theta\nendsnippet\n\nsnippet @T \"Theta\" iAm\n\\Theta\nendsnippet\n\nsnippet :t \"tau\" iAm\n\\tau\nendsnippet\n\nsnippet @k \"kappa\" iAm\n\\kappa\nendsnippet\n\nsnippet @K \"kappa\" iAm\n\\kappa\nendsnippet\n\nsnippet @l \"lambda\" iAm\n\\lambda\nendsnippet\n\nsnippet @L \"Lambda\" iAm\n\\Lambda\nendsnippet\n\nsnippet @m \"mu\" iAm\n\\mu\nendsnippet\n\nsnippet @M \"mu\" iAm\n\\mu\nendsnippet\n\nsnippet @r \"rho\" iAm\n\\rho\nendsnippet\n\nsnippet @R \"rho\" iAm\n\\rho\nendsnippet\n\nsnippet @s \"sigma\" iAm\n\\sigma\nendsnippet\n\nsnippet @S \"Sigma\" iAm\n\\Sigma\nendsnippet\n\nsnippet @o \"omega\" iAm\n\\omega\nendsnippet\n\nsnippet @O \"Omega\" iAm\n\\Omega\nendsnippet\n\nsnippet \\{ \"bracket\" iAm\n\\\\{ ${1:${VISUAL}} \\\\}$0\nendsnippet\n\nsnippet @| \"left| right|\" iAm\n\\left| ${1:${VISUAL}} \\right|$0\nendsnippet\n\nsnippet :| \"left\\| right\\|\" iAm\n\\left\\| ${1:${VISUAL}} \\right\\|$0\nendsnippet\n\nsnippet @} \"\\left\\{ \\right\\}\" iAm\n\\left\\\\{ ${1:${VISUAL}} \\right\\\\}$0\nendsnippet\n\nsnippet ` bl `  \"left\\{ right.\" iAm\n\\left\\\\{ ${1:${VISUAL}} \\right.$0\nendsnippet\n\nsnippet ` br ` \"left. right\\}\" iAm\n\\left. ${1:${VISUAL}} \\right\\\\}$0\nendsnippet\n\nsnippet @] \"left[ right]\" iAm\n\\left[ ${1:${VISUAL}} \\right]$0\nendsnippet\n\nsnippet @) \"left( right)\" iAm\n\\left( ${1:${VISUAL}} \\right)$0\nendsnippet\n\nsnippet @> \"leftangle rightangle\" iAm\n\\left< ${1:${VISUAL}} \\right>$0\nendsnippet\n############################# math symbols\n# RR -> \\mathbb{R}\nsnippet `RR` \"sets\" iwAm\n\\\\mathbb{``rv=m[0].charAt(0)``}\nendsnippet\n# => -> \\Rightarrow\nsnippet `->` \"implies\" iAm\n\\rightarrow\nendsnippet\n# =< -> \\Leftarrow\nsnippet `<-` \"implied by\" iAm\n\\leftarrow\nendsnippet\n# <= -> \\leq\nsnippet `<=` \"leq\" iAm\n\\leq\nendsnippet\n# >= -> \\geq\nsnippet `>=` \"geq\" iAm\n\\geq\nendsnippet\n# != -> \\neq\nsnippet `!=` \"neq\" iAm\n\\neq\nendsnippet\n\nsnippet `~=` \"approx: iAm\n\\approx\nendsnippet\n# ... -> \\cdots\nsnippet ... \"dots\" iAm\n\\dots\nendsnippet\n\nsnippet *** \"cdots\" iAm\n\\cdots\nendsnippet\n\nsnippet ;;; \"vdots\" iAm\n\\vdots\nendsnippet\n\nsnippet ::: \"ddots\" iAm\n\\ddots\nendsnippet\n# inf -> \\infty\nsnippet inf \"\\infty\" iAm\n\\infty \nendsnippet\n############################# math functions\npriority 200\nsnippet norm \"norm\" iAm\n\\left\\| ${1:${VISUAL}} \\right\\|$0\nendsnippet\n\nsnippet ^ \"superscript\" iAm\n^{${1}}$0\nendsnippet\n\nsnippet _ \"subscript\" iAm\n_{${1}}$0\nendsnippet\n# spl -> the split enverniment with the selected text\nsnippet spl \"split\" Am\n\\begin{split}\n    ${VISUAL}$0\n\\end{split}\nendsnippet\n# ali -> the aligned enverniment the selected text\nsnippet ali \"aligned\" Am\n\\begin{aligned}\n    ${VISUAL}$0\n\\end{aligned}\nendsnippet\n# case -> the cases enverniment the selected text\nsnippet case \"cases\" Am\n\\begin{cases}\n    ${VISUAL}$0\n\\end{cases}\nendsnippet\n# fr -> fractor enverniment with the selected text\nsnippet // \"frac\" iAm\n\\frac{${1:${VISUAL}}}{$2}$0\nendsnippet\n# \\mathbf{A}^T -> \\mathbf{A}^{\\mathbrm T}\nsnippet `\\^\\{T` \"transpose\" iAm\n^{\\mathrm{T}\nendsnippet\n# \\mathbf{A}^H -> \\mathbf{A}^{\\mathbrm H}\nsnippet `\\^\\{H` \"hermitian\" iAm\n^{\\mathrm{H}\nendsnippet\n# ||x||_F -> ||x||_{\\mathrm F}\nsnippet `\\_\\{F` \"frobenius\" iAm\n_{\\mathrm{F}\nendsnippet\n\nsnippet `(\\\\?[a-zA-Z0-9]\\w*({?\\w*})?)(bf|BF)` \"mathbf\" iAm\n\\mathbf{``rv = m[1]``}\nendsnippet\n\nsnippet `(\\\\?[a-zA-Z0-9]\\w*({?\\w*})?)(bm|BM)` \"mathbm\" iAm\n\\bm{``rv = m[1]``}\nendsnippet\n\n# priority 100\nsnippet `(\\\\?[a-zA-Z]\\w*({?\\w*})?)bb` iAm\n\\mathbb{``rv = m[1]``}$0\nendsnippet\n\n# priority 100\nsnippet `(\\\\?[a-zA-Z]\\w*({?\\w*})?)cal` \"mathcal\" iAm\n\\mathcal{``rv = m[1].toUpperCase()``}$0\nendsnippet\n\n# priority 100\nsnippet `(\\\\?[a-zA-Z]\\w*({?\\w*})?)(frak)` \"mathfrak\" iAm\n\\mathfrak{``rv = m[1]``}\nendsnippet\n\n# priority 100\nsnippet `(?<!\\\\)\\b([a-zA-Z]+)rm` \"mathrm\" iAm\n\\mathrm{``rv = m[1]``}\nendsnippet\n\nsnippet `(?<!arc)(?<!\\\\)(sin|cos|tan|csc|sec|cot|ln|log|lg|det|ker|max|min)` \"function\" iAm\n\\``rv=m[1]+' '``\nendsnippet\n\nsnippet `(?<=\\\\(sin|cos|tan|csc|sec|cot))( )h` \"function\" iAm\n``rv='h '``\nendsnippet\n# in -> \\in\nsnippet ` (in|notin|subset|subseteq|supset|supseteq) ` \"sets operator\" wAm\n \\``rv = m[1]`` \nendsnippet\n# cap -> \\cap\nsnippet ` (circ|cap|cup|land|lor|lnot|oplus|ominus|times|otimes|sqcap|sqcup|vdash|models) ` \"logic operator\" wAm\n \\``rv = m[1]`` \nendsnippet\n\nsnippet empty \"empty set\" Am\n\\varnothing \nendsnippet\n\nsnippet `(\\\\?[a-zA-Z0-9]\\w*({?\\w*})?)op` \"operatorname\" iAm\n\\operatorname{``rv = m[1]``}\nendsnippet\n\nsnippet `([0-9]+)d` \"degrees\" iAm\n``rv = m[1]``^{\\circ}$0\nendsnippet\n\nsnippet `sqrt` \"sqrt\" iAm\n\\sqrt{${1:${VISUAL}}}$0\nendsnippet\n\nsnippet `sum` \"sqrt\" iAm\n\\sum\nendsnippet\n############################# hat operations\nsnippet `(\\\\?[a-zA-Z]\\w*({?\\w*})?)(bar|BAR)` \"Bar\" iAm\n\\overline{``rv = m[1]``}\nendsnippet\n\nsnippet `(\\\\?[a-zA-Z]\\w*({?\\w*})?)(td|TD)` \"tilde\" iAm\n\\tilde{``rv = m[1]``}\nendsnippet\n\nsnippet `(\\\\?[a-zA-Z]\\w*({?\\w*})?)(hat|HAT)` \"hat\" iAm\n\\hat{``rv = m[1]``}\nendsnippet\n\nsnippet `(\\\\?[a-zA-Z]\\w*({?\\w*})?)(hvec)` \"Vector postfix\" iAm\n\\vec{``rv = m[1]``}\nendsnippet\n\nsnippet `(\\\\?[a-zA-Z]\\w*({?\\w*})?)(rta)` \"Vector postfix\" iAm\n\\overrightarrow{``rv = m[1]``}\nendsnippet\n\nsnippet `(\\\\?[a-zA-Z]\\w*({?\\w*})?)(hdot)` \"dot\" iAm\n\\dot{``rv = m[1]``}\nendsnippet\n\nsnippet `(\\\\?[a-zA-Z]\\w*({?\\w*})?)(hddot)` \"ddot\" iAm\n\\ddot{``rv = m[1]``}\nendsnippet"
  },
  {
    "path": "shinyypig_commit_config.json",
    "content": "{\n    \"$schema\": \"https://bendera.github.io/vscode-commit-message-editor/schemas/config-v1.schema.json\",\n    \"configVersion\": \"1\",\n    \"staticTemplate\": [\n        \"feat: Short description\",\n        \"\",\n        \"Message body\"\n    ],\n    \"dynamicTemplate\": [\n        \"{type} {description}\",\n        \"\",\n        \"{body}\"\n    ],\n    \"tokens\": [\n        {\n            \"label\": \"Type\",\n            \"name\": \"type\",\n            \"type\": \"enum\",\n            \"combobox\": true,\n            \"options\": [\n                {\n                    \"label\": \"✨ 新功能或文本\",\n                    \"value\": \"✨\",\n                    \"description\": \"新增功能或文本\"\n                },\n                {\n                    \"label\": \"📝 添加说明文档\",\n                    \"value\": \"📝\",\n                    \"description\": \"添加说明文档\"\n                },\n                {\n                    \"label\": \"🎨 润色或美化\",\n                    \"value\": \"🎨\",\n                    \"description\": \"润色文本或美化代码\"\n                },\n                {\n                    \"label\": \"🩹 修复简单错误\",\n                    \"value\": \"🩹\",\n                    \"description\": \"简单修复非关键性问题\"\n                },\n                {\n                    \"label\": \"🐛 修复关键错误\",\n                    \"value\": \"🐛\",\n                    \"description\": \"修复关键错误\"\n                },\n                {\n                    \"label\": \"💩 初稿\",\n                    \"value\": \"💩\",\n                    \"description\": \"写的很差需要进一步修改\"\n                },\n                {\n                    \"label\": \"💥 引入重大改变\",\n                    \"value\": \"💥\",\n                    \"description\": \"引入重大改变\"\n                },\n                {\n                    \"label\": \"🎉 初次提交\",\n                    \"value\": \"🎉\",\n                    \"description\": \"初次提交\"\n                },\n                {\n                    \"label\": \"🔥 删除\",\n                    \"value\": \"🔥\",\n                    \"description\": \"删除代码或文件\"\n                },\n                {\n                    \"label\": \"📦 编译\",\n                    \"value\": \"📦\",\n                    \"description\": \"新增或更新已编译的文件或包\"\n                },\n                {\n                    \"label\": \"➖ 移除依赖\",\n                    \"value\": \"➖\",\n                    \"description\": \"移除依赖\"\n                },\n                {\n                    \"label\": \"➕ 添加依赖\",\n                    \"value\": \"➕\",\n                    \"description\": \"添加依赖\"\n                },\n                {\n                    \"label\": \"🚚 移动或重命名\",\n                    \"value\": \"🚚\",\n                    \"description\": \"移动或重命名文件文件夹\"\n                },\n                {\n                    \"label\": \"🔀 合并分支\",\n                    \"value\": \"🔀\",\n                    \"description\": \"合并分支\"\n                },\n                {\n                    \"label\": \"⏪ 还原\",\n                    \"value\": \"⏪\",\n                    \"description\": \"还原修改\"\n                },\n                {\n                    \"label\": \"🗑 清理\",\n                    \"value\": \"🗑\",\n                    \"description\": \"清理废弃代码或文本\"\n                },\n                {\n                    \"label\": \"🙈 .gitignore\",\n                    \"value\": \"🙈\",\n                    \"description\": \"添加或更新 .gitignore 文件\"\n                },\n                {\n                    \"label\": \"👥 新增或更新贡献者\",\n                    \"value\": \"👥\",\n                    \"description\": \"新增或更新贡献者\"\n                }\n            ],\n            \"description\": \"Type of changes\"\n        },\n        {\n            \"label\": \"Short description\",\n            \"name\": \"description\",\n            \"description\": \"Short description in the subject line.\",\n            \"type\": \"text\",\n            \"multiline\": false\n        },\n        {\n            \"label\": \"Body\",\n            \"name\": \"body\",\n            \"description\": \"Optional body\",\n            \"type\": \"text\",\n            \"multiline\": true,\n            \"lines\": 5,\n            \"maxLines\": 10\n        }\n    ]\n}"
  }
]