如何配置VSCode以使用LATEX,以及Markdown的嵌入、伪代码的使用等。
Table of Contents
环境
- Windows 10 22H2
- VSCode 1.74.3
- TeX Live 2022
配置过程
先正常安装TeX Live和VS Code的LaTeX Workshop插件,TeX Live的环境变量应当是自动配置好了的,使用tex --version
命令测试是否安装成功。然后将:
//////// LaTeX Workshop ////////
// 默认值为onFileChange,即文件更改时自动build,另一个可选值为onSave
"latex-workshop.latex.autoBuild.run": "never",
// 配置LaTeX tools,出现在编译工具链中的编译工具要先在这里进行定义
"latex-workshop.latex.tools": [
{
"name": "xelatex",
"command": "xelatex",
"args": [
"-synctex=1",
"-interaction=nonstopmode",
"-file-line-error",
"%DOCFILE%"
]
},
{
"name": "pdflatex",
"command": "pdflatex",
"args": [
"-synctex=1",
"-interaction=nonstopmode",
"-file-line-error",
"%DOCFILE%"
]
},
{
"name": "bibtex",
"command": "bibtex",
"args": [
"%DOCFILE%"
]
},
{
"name": "biber",
"command": "biber",
"args": [
"%DOCFILE%"
]
}
],
// 编译工具链,最终出现在侧边栏中的编译选项
"latex-workshop.latex.recipes": [
{
"name": "xelatex",
"tools": [
"xelatex"
],
},
{
"name": "xe->biber->xe->xe",
"tools": [
"xelatex",
"biber",
"xelatex",
"xelatex"
]
},
{
"name": "xe->bibtex->xe->xe",
"tools": [
"xelatex",
"bibtex",
"xelatex",
"xelatex"
]
}
],
粘到设置文件里(完整的配置说明文档在这里)。必须重启,否则可能是因为环境变量的原因会报错。随后即可使用。
其中pdfLaTeX是常用的编译工具,而X
使用Elegant模板
elegant系列模板是国人开发的一套LaTeX模板,还是比较好看且好用的。TeX Live自带有elegant系列模板,不需要单独下载安装。
处理Fandol警告
按照以上设置,编译时会有个警告Fandol is being set as the default font for CJK text.(xeCJK) Please make sure it has been properly installed.
。尝试安装了Fandol字体,但仍有报错。这并非VSCode或ElegantLaTeX的问题,而是xeCJK的3.2.10及更新版本的问题,GitHub上也有对应的issue,介绍了警告的成因,但我暂时没看懂,排版真的是一门非常深的学问,绝不是第一印象中的“一堆方块字堆一块不就完了”。
这个警告事实上是无害的。有关如何解决它,目前看到如下几种方法:
- 将documentclass改为
\documentclass[..., fontset=windows]{...}
,试了下,没啥用; - 在documentclass前添加
\PassOptionsToPackage{quiet}{xeCJK}
,也就是屏蔽xeCJK宏包的信息——其它宏包也可以这样屏蔽,亲测有效; - 这篇知乎文章中提到的将警告转换为信息的方法,相比上面的粗暴方法可以更精细地控制,不过太复杂了。
完整模板
%!TEX program = xelatex
% 完整编译: xelatex -> biber -> xelatex -> xelatex
%\PassOptionsToPackage{quiet}{xeCJK}%屏蔽某个包的报错
% 英文en中文cn,如果英文模式要显示中文需引入xeCJK包
\documentclass[lang=cn,11pt,a4paper]{elegantpaper}
\title{这里是标题}
\author{这里是作者}
\date{\today}
%%%%%%%% 本文档命令
\usepackage{xeCJK} % 英文模式下需要显示中文时使用,英文模式会缺失部分罕见字并有字体缺失警告系软件bug
\usepackage{float} % 禁止图表浮动的[H]需用到此包
\setcounter{secnumdepth}{4} % 使用后四级标题也带几点几点几的序号
\setcounter{tocdepth}{4} % 使用后四级标题在目录中也显示
\hypersetup{colorlinks=false} % 设置链接为黑色,因为目录也是链接全是红色不好看
%%%%%%%% 代码块设置
\lstset{
numbers=left, % 显示行号
numberstyle=\tiny\color{gray}, % 行号设置
%breaklines=true, % 对过长的代码自动换行
%extendedchars=false, % 解决代码跨页时,章节标题,页眉等汉字不显示的问题
}
\lstalias{text}{} % 允许代码块输出非代码纯文本
%%%%%%%% 伪代码支持
\usepackage[ruled,linesnumbered]{algorithm2e}
\SetKwRepeat{Do}{do}{while} % do-while支持
\usepackage{array}
\usepackage{multirow}
\begin{document}
\maketitle
\tableofcontents
\newpage
\section{一级标题}
注意事项:
\begin{itemize}
\item 文件命名注意事项
\subitem tex文件名为全英文
\subitem bib文件名为reference.bib
\subitem 图片在image文件夹内
\end{itemize}
\subsection{二级标题}
现代社会以海德格尔的一句“一切实践传统都已经瓦解完了”为嚆矢。滥觞于家庭与社会传统的期望正失去它们的借鉴意义。但面对看似无垠的未来天空,我想循卡尔维诺“树上的男爵”的生活好过过早地振翮。\cite{LivinginaTree}
\begin{lstlisting}[language=Python]
# -*- coding: UTF-8 -*-
# 该实例输出 Hello World!
print('Hello World!')
\end{lstlisting}
\subsubsection{三级标题}
我们怀揣热忱的灵魂天然被赋予对超越性的追求,不屑于古旧坐标的约束,钟情于在别处的芬芳。但当这种期望流于对过去观念不假思索的批判,乃至走向虚无与达达主义时,便值得警惕了。与秩序的落差、错位向来不能为越矩的行为张本。而纵然我们已有翔实的蓝图,仍不能自持已在浪潮之巅立下了自己的沉锚。
\begin{table}[H]
\center{
\begin{tabular}{|cc|}
\hline
\multicolumn{2}{|c|}{推荐使用网站生成表格} \\ \hline
\multicolumn{1}{|c|}{生成网站} & https://www.tablesgenerator.com/ \\ \hline
\end{tabular}
}
\caption{这个网站还能生成Markdown表格。}
\end{table}
\paragraph{四级标题}
“我的生活故事始终内嵌在那些我由之获得自身身份共同体的故事之中。”麦金太尔之言可谓切中了肯綮。人的社会性是不可祓除的,而我们欲上青云也无时无刻不在因风借力。社会与家庭暂且被我们把握为一个薄脊的符号客体,一定程度上是因为我们尚缺乏体验与阅历去支撑自己的认知。而这种偏见的傲慢更远在知性的傲慢之上。
\begin{figure}[H]
\center{\includegraphics[width=0.1\textwidth]{9.png}}
\caption{我去除了大部分肠的腥味,但是我保留了一部分,我觉得保留了一部分肠的味道,才知道你吃的是大肠。}
\end{figure}
\subsection{二级标题}
在孜孜矻矻以求生活意义的道路上,对自己的期望本就是在与家庭与社会对接中塑型的动态过程。而我们的底料便是对不同生活方式、不同角色的觉感与体认。生活在树上的柯希莫为强盗送书,兴修水利,又维系自己的爱情。他的生活观念是厚实的,也是实践的。倘若我们在对过往借韦伯之言“祓魅”后,又对不断膨胀的自我进行“赋魅”,那么在丢失外界预期的同时,未尝也不是丢了自我。
\begin{lstlisting}[language=C++]
#include <iostream>
using namespace std;
int main()
{
cout << "Hello, world!" << endl;
return 0;
}
\end{lstlisting}
\subsubsection{三级标题}
毫无疑问,从家庭与社会角度一觇的自我有偏狭过时的成分。但我们所应摒弃的不是对此的批判,而是其批判的廉价,其对批判投诚中的反智倾向。在尼采的观念中,如果在成为狮子与孩子之前,略去了像骆驼一样背负前人遗产的过程,那其“永远重复”洵不能成立。何况当矿工诗人陈年喜顺从编辑的意愿,选择写迎合读者的都市小说,将他十六年的地底生涯降格为桥段素材时,我们没资格斥之以媚俗。
\begin{lstlisting}[language=text]
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
\end{lstlisting}
\paragraph{四级标题}
蓝图上的落差终归只是理念上的区分,在实践场域的分野也未必明晰。譬如当我们追寻心之所向时,在途中涉足权力的玉墀,这究竟是伴随着期望的泯灭还是期望的达成?在我们塑造生活的同时,生活也在浇铸我们。既不可否认原生的家庭性与社会性,又承认自己的图景有轻狂的失真,不妨让体验走在言语之前。用不被禁锢的头脑去体味切斯瓦夫·米沃什的大海与风帆,并效维特根斯坦之言,对无法言说之事保持沉默。
\begin{algorithm}[H]
\SetKwFunction{funcName}{函数名funcName}
\SetKwData{mydata}{变量名my\_data}
\caption{How to write algorithms}
\KwIn{this text}
\KwOut{how to write algorithm with \LaTeX2e }
\KwData{和上面的输入输出标记二选一即可}
\KwResult{how to write algorithm with \LaTeX2e }
initialization\;
\While{While Do体}{
read current\;
% 如果是\If的话第二个大括号体也就是else区就不会显示
\eIf(\tcp*[f]{居右注释,\textbackslash eIf是带else的带大括号if}){条件}{
\tcp{单行注释,\textbackslash lIf是不带else的行内if}
\lIf{1$<$2}{\funcName{\mydata}\;}
\tcc{c风格注释,同理\textbackslash lElse是行内else}
\lElse{\funcName{\mydata,\mydata}\;}
}
{
\uIf{如果想用else if体}{就要用\textbackslash uIf和\textbackslash uElseIf\;}
\uElseIf{因为\textbackslash If和\textbackslash ElseIf是带end的}{会多出来end\;}
\Else{最后再加上一个正常的\textbackslash Else就好了\;}
}
\Do{自定义的Do While体}{do these things\;}
\Repeat{自带的Repeat Until体}{do these things\;}
}
\For{$i\leftarrow 2$ \KwTo $l$}
{i from 2 to l应当如上写\;}
\end{algorithm}
\printbibliography[heading=bibintoc, title=\ebibname]
% 添加不带序号的章节
\section*{附录}
\addcontentsline{toc}{section}{附录}
用在树上的生活方式体现个体的超越性,保持婞直却又不拘泥于所谓“遗世独立”的单向度形象。这便是卡尔维诺为我们提供的理想期望范式。生活在树上——始终热爱大地——升上天空。
\end{document}
效果如下:
使用LaTeX编译Markdown
这篇博文对此有详细介绍。简单来说,可以通过引入markdown宏包\usepackage{markdown}
并在正文中使用markdown块\begin{markdown} ... \end{markdown}
实现。除此以外,在本文一开始给出的配置文件地参数中还要加上--shell-escape
参数。这是因为编译Markdown需要调用外部代码,我们需要允许X
markdown宏包缺省不支持使用三个反引号表示的代码块,需要通过\markdownSetup{fencedCode = true}
选项允许该特性。另外,Markdown中的代码块支持“text”类型,而代码块所使用的listings不支持,可以通过\lstalias{text}{}
自定义这个类型。
使用Markdown的模板如下:
%!TEX program = xelatex
% 完整编译: xelatex -> biber -> xelatex -> xelatex
%\PassOptionsToPackage{quiet}{xeCJK}%屏蔽某个包的报错
% 英文en中文cn,如果英文模式要显示中文需引入xeCJK包
\documentclass[lang=cn,11pt,a4paper]{elegantpaper}
\usepackage{markdown}
\begin{document}
\begin{markdown}
...
Markdown内容
...
\end{markdown}
\end{document}