前言
呵呵, 终于要开始写论文了.
我很讨厌触碰从来没接触过的东西, 比如Latex, 之前从来没用过, 其实我心理还是想用word来写论文的, 毕竟我这个方向不会写巨复杂的公式. 考虑到种种原因, 还是硬着头皮学习了一下.
作为万里长征的第一步, 搭建开发环境总是最让人头大的. 这两天琢磨了4个开发环境, 并成功的编译了USENIX的论文模板:
Templates for Conference Papers
当然,本文仅仅对刚刚开始使用Latex的同学具有一定的参考价值,可以稍微降低学习成本。
此外,网上有很多相关的环境配置的博客,但是可能已经过去太久了,像VS Code、Intellij Idea等相关插件都优化了,已经不需要用户进行复杂的配置了,傻瓜式的鼠标点两下就行了。
本文给出了4种方式来写Latex,分别是:
- Overleaf
- ShareLatex
- VS Code + LaTeX Workshop
- Intellij Idea + TeXiFy
至于孰优孰劣,本文不做评价,全凭个人喜好,比如我,就是Jetbrains 的忠实拥趸。
最后,实现的目标是,能成功的编译USENIX的论文模板输出PDF文件,并实现正反向的搜素(即在PDF中定位tex文档,和从tex文档定位PDF文件)。说白了也是浅尝辄止,入个门而已。
对于想简单入门Latex语法的同学,可以看附录一, 我对模板内容进行了全面的注释。
(截至2021年11月10日, 下述所有的软件及其插件,都是官网的最新版!)
Overleaf
简介
Overleaf是一个在线的Latex编辑器:
操作
登录其官网,然后注册账户登录即可。在操作界面:
我们可以创建啥也没有的空白项目,或者从本地/Github上传已有的项目(Github需要收费),它还贴心的给我们准备了很多模板。但是我们在这里选择创建一个空白模板:
功能很少,也非常的一目了然,我们自己导入USENIX的论文模板:
编译后显示:
这是因为我们导入了宏包usenix2019_v3.sty,但是其实USENIX模板的名字其实是usenix-2020-09.sty,因此只需要重命名一下就好了:
可以看到图片、引用文献都是正常的!但是有4个警告,我们暂且不管,我将在文末的附录中贴上最终我注释修改过的模板,以供大家入门Latex的语法。
此时,你将缓缓打出不屑。是的就是这么简单,Overleaf其实已经很不错了,我身边的同学都在用,而且还能share,让老师帮你修改等等。如果你对本地编译Latex毫无兴趣,那么就可以到此打住了!
ShareLatex
简介
你可以简单的认为ShareLatex就是Overleaf的开源版,即你可以自己搭建Overleaf服务,这样你的数据就掌握在你的手上,不用担心Overleaf网不好,网速太慢,泄密等问题。
关于ShareLatex和Overleaf的更多信息,可以查阅:
ShareLaTeX, Online LaTeX Editorwww.sharelatex.com/[图片上传失败...(image-8a07b5-1636597623220)]
环境搭建
这里使用官方文档[1][2]推荐的傻瓜模式进行部署,详细的文档参阅文末参考文献。
Prerequisites
- docker
- docker-compose
配置
(1) 克隆Overleaf Toolkit到本地(服务器):
git clone https://github.com/overleaf/toolkit.git ./overleaf
cd ./overleaf
(2) 初始化配置文件
bin/init
此时将生成三个配置文件:
ls config/
overleaf.rc variables.env version
(3) 启动
bin/up
注意,第一次运行时需要拉去Docker 镜像,比较慢,成功之后将不会退出命令行,可以用***Ctrl + C ***退出,此时将关闭启动的容器,然后可以用:
bin/start
bin/stop
来启动和关闭容器服务。
up或start 之后,将会启动三个容器:
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9c5c888f7b8b sharelatex/sharelatex:3.0.1 "/sbin/my_init" 3 days ago Up 2 hours 0.0.0.0:80->80/tcp sharelatex
07ae53497628 mongo:4.0 "docker-entrypoint.s…" 3 days ago Up 2 hours (healthy) 27017/tcp mongo
fbc9980d58b3 redis:5.0 "docker-entrypoint.s…" 3 days ago Up 2 hours 6379/tcp redis
我们需要重点关注sharelatex的容器端口,如果你按上述过程执行,那么将是:
127.0.0.1:80 -> 80/tcp
这意味这仅仅监听本地的请求,如果你想监听所有用户的请求,那么需要修改其监听地址为:
0.0.0.0:80 -> 80/tcp
这需要修改config/overleaf.rc文件:
之后需要使用bin/up重启容器,修改配置后必须使用bin/up才能生效!!!
(4) 创建管理账号
浏览器中打开:http://localhost/launchpad
(5)访问
之后的操作就等同于Overleaf了,我们将得到一个非常类似的界面:
安装完整texlive
当我们编译模板时会发现:
提示缺少宏包:microtype.sty
这其实是系统宏包,为什么会这样呢?
这是因为我们的sharelatex仅仅安装了最小化的TeXLive[3]如果需要完整的环境,需要我们手动下载:
(1) 启动服务后,执行:
docker exec sharelatex tlmgr update
docker exec sharelatex tlmgr install scheme-full
(2) 提交容器镜像
docker commit sharelatex sharelatex/sharelatex:with-texlive-full
(3) 修改配置文件中sharelatex的版本为with-texlive-full
如果你熟悉docker,那么我相信,你很清楚这是在干嘛!!!
VS Code + LaTeX Workshop
简介
VS Code的大名,就不用过多介绍了吧。
安装TeXLive,VS Code以及LaTeX Workshop插件的过程就不赘述了,如果这都搞不定,那可以私信我(只帮女生)。此外,推荐安装完整版的TeXLive,浪费点空间没事的!
这个时候, 我们新建一个文件夹, 然后放入模板文件, 然后用VS Code打开:
不需要任何配置, 我们就可以直接编译和预览, 我相信这才是我们的VS Code.
配置
我们现在来关注一下命令栏窗口:
主要来看Build和View两个功能:
BUILD
Build无非就是编译Tex文件, 每一个绿色的三角都是一个编译方式, 可见我们有多条路可选, 而我们默认的方式是使用latexmk编译器, 此外我们还可以看到pdflatex这个编译器, 他需要配合bibtex进行四次编译, 记住这两点!
我们可以打开默认的设置(defaultSettings.json, 按F1,然后键入defaultSettings), 查看:
放在"latex-workshop.latex.recipes"第一个的既是默认Build方式.
这里有一个问题, 那就是默认情况下这个配置是不支持中文路径的, 因此如果你不想改配置, 那么就不要把文件放在中文路径中, 但是如果你的用户名就是中文, 没办法了,那么就要修改这个配置.
但是注意我们目前打开的是defaultSettings.json, 即VS的默认配置文件,它是只读的, 如果我们要修改, 需要在settings.json中覆盖默认设置.
因此你只需要把latex-workshop.latex.tools对应的配置中的%DOC%修改为%DOCFILE%,然后将其放入settings.json(按F1, 键入settings)中即可,也可以直接用我的写好的, 见附录二.
此外, 放我们编译之后, 会产生很多的临时文件:
此时,我们可以使用clean up清除:
那些临时文件将被清除也在默认配置文件中, 但是我们这次通过"文件->首选项->设置"来查看:
也可以通过搜索"latex-workshop.latex.clean.fileTypes"来定位, 也可以在默认配置文件中查看.
请注意, 我们需要保留*.gz文件:
它是我们进行正反向搜索用的.
我们也可以配置自动清理:
至于其他的配置, 大家自己查阅把, 本文仅仅是带你入门.
注意, 我认为修改配置还是用第二种方式, 除非配置过于复杂, 否则不要自己去修改settings.json.
VIEW
查看PDF有三种方式
- 可以再VS Code中直接查看, 对应了"VSCocd tab"
- 可以在浏览器中查看, 对应了"browser"
- 可以使用外部的查看器, 比如SumatraPDF
显然, 我们推荐大家使用前两种! 对于第三种, 需要自己的额外的配置, 可以自己去研究!
正反搜索
从PDF到VSCode
按住Alt键, 鼠标点击即可定位到VSCode的位置
从VSCode到PDF
使用快捷键: Ctrl+Alt+J 即可跳转到VSCode光标所在的PDF对应的位置
Intellij Idea + TeXiFy
简介
Intellij Idea的大名,就不用过多介绍了吧。
安装TeXLive,Intellij Idea以及TeXiFy插件的过程就不赘述了,如果这都搞不定,那可以私信我(只帮女生)。此外,推荐安装完整版的TeXLive,浪费点空间没事的!
此外,不一定非要是Intellij Idea,Pycharm等Jetbrains的IDE都是可以的,只要能下载TeXiFy插件。
配置
要想正常的编译, 需要我们来定义配置文件, 这是Jetbrains IDE的标准模式, 当然你也可以点击上图中在\begin{document}前面的绿色箭头来自动生产配置文件:
点击运行之后你会发现, 生成了一个out目录, 里面包含了最终的pdf文件!但是很可惜, 这种方式生成的pdf的参考文献是有问题的!
pdfLatex
我们点开自动生成的配置文件:
发现他其实是使用了pdfLatex这个编译器, 但是我们在VSCode中说过了, 这个编译器要配合BibTex才行, 但是IDEA没有给我们自动生产(有时候也会自动生成, 但是配置有问题, 很奇怪).
这时候需要我们自己配置一个:
然后再在pdfLatex中指定BibTex:
这个时候, 你会发现有4个输出终端, 这是符合预期的最终的pdf也是正常的:
有时候, IDEA会给我们自动生产BIbTex的配置, 但是是有问题的, 你只要改成我上面的配置即可. (仅仅是简单的去掉了环境变量)
Latexmk
当然, 你可能还记得VSCode的默认编译器是Latexmk, 而它不需要这么复杂的路径, 我们的IDEA当然也是支持的, 你只需要修改一下:
你会发现也是正常的.....
因为我怕你学会了这个就不会去看pdfLatex的配置了.
View
最后就是查看PDF, 显然我们不能在文件夹中去查看pdf. IDEA暂时不能像VSCode那样支持三种方式, 目前仅仅支持第三方工具:SumatraPDF
下载安装之后, 重启IDEA,就会在配置中找到:
此时点击运行, 就会直接调用SumatraPDF
正反搜索[4]
从PDF到IDEA
在IDEA中,选中"Tools->LaTeX->Configure Inverse Search";
然后在PDF中双击即可跳转到IDEA.
配置操作只需要执行一次.
从IDEA到PDF
使用快捷键: "Ctrl+Alt+Shift+." 即可跳转到IDEA光标所在的PDF对应的位置
后记
截至2021年11月10日, 上述所有的软件及其插件,都是官网的最新版!
附录一
我注释过的模板文件
% documentclass 用于指明文档的类型,如book、article等
% {}中是必须参数,即必须指定类型
% []中是可选参数,在这里:
% letterpaper, 显然就是纸张类型
% twocolumn, 表示两列,论文格式
% 10pt, 字体大小,这个大小并不是随意指定的,过大会无效
\documentclass[letterpaper,twocolumn,10pt]{article}
% usepackage, 用于引入宏包,可以是自定义的或者系统包
% usenix, 对应了同目录下的usenix.sty, 是usenix指定的格式
% tikz,amsmath 包用于实现画图
\usepackage{usenix}
\usepackage{tikz}
\usepackage{amsmath}
% 这个命令是VScode的⚠警告建议添加的
% 大体意思是,"\nonfrenchspacing is active. 调整字间距将会禁用它, 可添加如下指令规避"
\microtypecontext{spacing=nonfrench}
% filecontents 宏应该是以下内容生成到指定的文件中
% 文件名也就是{\jobname.bib} 其中\jobname 对了tex文件的名称:usenix-copy
% bib其实是参考文献的意思, .bib是专门存放参考文献的文件格式
% 以下将会生成一个名为usenix-copy.bib的文件存放参考文献, 但是其实我们可以直接在此文件中写入, 因此下面的内容可以直接去掉
% bib文件最终会生产blb文件,此文件会被反向查找定位
% 在文章的最后, 需要用以下指令来引入参考文献:
% \bibliographystyle{plain}
% \bibliography{\jobname}
%
% 此外, 作者名的格式必须严格写,每个作者名之间要用`.`即英文句点隔开
%
% \usepackage{filecontents}
% \begin{filecontents}{\jobname.bib}
% @inproceedings{arpachiDusseau18:osbook,
% author = {Edward Oakes. Leon Yang. Dennis Zhou. Kevin Houck. Tyler Harter. Andrea C. Arpaci-Dusseau. and Remzi H. Arpaci-Dusseau},
% title = {SOCK: Rapid Task Provisioning with Serverless-Optimized Containers},
% booktitle = {USENIX Annual Technical Conference (USENIX ATC)},
% year = 2018
% }
% @inproceedings{waldspurger02,
% author = {Edward Oakes. Leon Yang. Dennis Zhou. Kevin Houck. Tyler Harter. Andrea C. Arpaci-Dusseau. and Remzi H. Arpaci-Dusseau},
% title = {SOCK: Rapid Task Provisioning with Serverless-Optimized Containers},
% booktitle = {USENIX Annual Technical Conference (USENIX ATC)},
% year = 2018,
% note = {\url{https://www.usenix.org/conference/atc18/presentation/oakes}}
% }
% \end{filecontents}
% document的开始
\begin{document}
% 一开始的论文的标题, 包括了\date, \title, \author 等
% ATC中不要求写\date 而且指定了\title, \author的格式
% 最后要通过\maketitle讲上述给显示出来
%
% \\ 是强制换行
%
% 1\. \tiny 2\. \scriptsize 3\. \footnotesize 4\. \small 5\. \normalsize
% 6\. \large 7\. \Large 8\. \LARGE 9\. \huge 10\. \Huge 依次表示了字体大小
%
% \bf是加粗, 用法是 {\bf text}
% 加粗还可以是\textbf{text}, 更推荐使用此
%
% \rm 是将斜体变为正体
%don't want date printed
\date{}
% make title bold and 14 pt font (Latex default is non-bold, 16 pt)
\title{\Large \bf Formatting Submissions for a USENIX Conference:\\
An (Incomplete) Example}
%for single author (just remove % characters)
\author{
{\rm Your N.\ Here}\\
Your Institution
\and
{\rm Second Name}\\
Second Institution
% copy the following lines to add more authors
% \and
% {\rm Name}\\
%Name Institution
} % end author
\maketitle
%-------------------------------------------------------------------------------
% abstract, 摘要有自己的关键字和格式,和section相区别
\begin{abstract}
Your abstract text goes here. Just a few facts. Whet our appetites.
Not more than 200 words, if possible, and preferably closer to 150.
\end{abstract}
%-------------------------------------------------------------------------------
% 每个section都会自己编号,如果使用 section* 可以不参与编号
% 可以使用\subsection \subsubsection 等
\section{Introduction}
A paragraph of text goes here. Lots of text. \\Plenty of interesting
text. {\bf Text} \textbf{text} text text text text text text text text text text text
text text text text text text text text text text text text text text
text text text text text text text text text text text text text text
text text text text text text text.
More fascinating text. Features galore, plethora of promises.
%-------------------------------------------------------------------------------
% \footnote是注脚
% \begin{verbatim} code \end{verbatim} 之间可以写代码
% \cite{} 可以引用参考文献, 可引用多个,用`,`隔开
% `~` 是个经常出现,他表示一个不可打断的空格,后面跟的必须和前面的单词在同一行,其本身就是一个空格哦
% \ref{label} 用于引用图片,章节等,被引的对象必须定义\label{},\ref{}同样会根据类型来自动编号
\section{Footnotes, Verbatim, and Citations}
Footnotes should be places after punctuation characters, without any
spaces between said characters and footnotes, like so.
\footnote{Remember that USENIX format stopped using endnotes and is
now using regular footnotes.} And some embedded literal code may
look as follows.\footnote{Remember that USENIX format stopped using endnotes and is
now using regular footnotes.}
\begin{verbatim}
int main(int argc, char *argv[])
{
return 0;
}
\end{verbatim}
Now we're going to cite somebody. Watch for the cite tag. Here it
comes. Arpachi-Dusseau and Arpachi-Dusseau coauthored an excellent OS
book, which is also really funnnnnnnny\cite{arpachiDusseau18:osbook,waldspurger02,waldspurger02,waldspurger02}, and
Waldspurger got into the SIGOPS hall-of-fame due to his seminal paper
about resource management in the ESX hypervisor~\cite{waldspurger02}.
The tilde character (\~{}) in the tex source means a non-breaking
space. This way, your reference will always be attached to the word
that preceded it, instead of going to the next line.
And the 'cite' package sorts your citations by their numerical order
of the corresponding references at the end of the paper, ridding you
from the need to notice that, e.g, ``Waldspurger'' appears after
``Arpachi-Dusseau'' when sorting references
alphabetically~\cite{waldspurger02,arpachiDusseau18:osbook}.
It'd be nice and thoughtful of you to include a suitable link in each
and every bibtex entry that you use in your submission, to allow
reviewers (and other readers) to easily get to the cited work, as is
done in all entries found in the References section of this document.
Now we're going take a look at Section~\ref{sec:figs}, but not before
observing that refs to sections and citations and such are colored and
clickable in the PDF because of the packages we've included.
%-----------------------------------------------------------------
% \label{sec:figs} 用于给本章节编号.
% \label{fig:vectors} 给\caption,即图片的标题编号,
% \textbackslash 就是 `\`符号
% \textrm、\textsf、\texttt 都是设置字体:
% \textrm{} :Roman Family 罗马字体
% \textsf{}:Scan Serif Family 无衬线字体
% \texttt{}:Typewriter Family 打字机字体
% \noindent 即不要缩进,表示承接上一段
% description, enumerate, itemize 都是列表,分别表示:
% description, 解说列表,可自定义标签(文字或者图标)
% enumerate, 有序列表
% itemize, 无序列表
% \includegraphics 用于插入图片,可以插入pdf, 是放入矢量图的神器
\section{Floating Figures and Lists}
\label{sec:figs}
\begin{figure}
\begin{center}
\begin{tikzpicture}
\draw[thin,gray!40] (-2,-2) grid (2,2);
\draw[<->] (-2,0)--(2,0) node[right]{$x$};
\draw[<->] (0,-2)--(0,2) node[above]{$y$};
\draw[line width=2pt,blue,-stealth](0,0)--(1,1)
node[anchor=south west]{$\boldsymbol{u}$};
\draw[line width=2pt,red,-stealth](0,0)--(-1,-1)
node[anchor=north east]{$\boldsymbol{-u}$};
\end{tikzpicture}
\end{center}
\caption{\label{fig:vectors} Text size inside figure should be as big as
caption's text. Text size inside figure should be as big as
caption's text. Text size inside figure should be as big as
caption's text. Text size inside figure should be as big as
caption's text. Text size inside figure should be as big as
caption's text. }
\end{figure}
% \begin{figure}
% \begin{center}
% \includegraphics{fig-1.pdf}
% \end{center}
% \caption{\label{fig:pdf} Text size inside figure should be as big as
% caption's text. Text size inside figure should be as big as
% caption's text. Text size inside figure should be as big as
% caption's text. Text size inside figure should be as big as
% caption's text. Text size inside figure should be as big as
% caption's text. }
% \end{figure}
% \begin{figure}
% \begin{center}
% \includegraphics[width=\linewidth]{1.pdf}
% \end{center}
% \caption{\label{fig:pdf-p1} Text size inside figure should be as big as
% caption's text. Text size inside figure should be as big as
% caption's text. Text size inside figure should be as big as
% caption's text. Text size inside figure should be as big as
% caption's text. Text size inside figure should be as big as
% caption's text. }
% \end{figure}
Here's a typical reference to a floating figure:
Figure~\ref{fig:vectors}. Floats should usually be placed where latex
wants then. Figure\ref{fig:vectors} is centered, and has a caption
that instructs you to make sure that the size of the text within the
figures that you use is as big as (or bigger than) the size of the
text in the caption of the figures. Please do. Really.
In our case, we've explicitly drawn the figure inlined in latex, to
allow this tex file to cleanly compile. But usually, your figures will
reside in some file.pdf, and you'd include them in your document
with, say, \textbackslash{includegraphics}.
Lists are sometimes quite handy. If you want to itemize things, feel
free:
\begin{description}
\item[fread] a function that reads from a \texttt{stream} into the
array \texttt{ptr} at most \texttt{nobj} objects of size
\texttt{size}, returning returns the number of objects read.
\item[Fred] a person's name, e.g., there once was a dude named Fred
who separated usenix.sty from this file to allow for easy
inclusion.
\end{description}
\noindent
The noindent at the start of this paragraph in its tex version makes
it clear that it's a continuation of the preceding paragraph, as
opposed to a new paragraph in its own right.
\subsection{LaTeX-ing Your TeX File}
%-----------------------------------
People often use \texttt{pdflatex} these days for creating pdf-s from
tex files via the shell. And \texttt{bibtex}, of course. Works for us.
\subsubsection{test}
textbackslash
%-------------------------------------------------------------------------------
\bibliographystyle{plain}
\bibliography{\jobname}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\end{document}
附录二
支持中文路径的latex-workshop.latex.tools, 仅仅是修改了默认配置中的%DOC%为%DOCFILE%.
然后将其放入settings.json中.
"latex-workshop.latex.tools": [
{
"name": "latexmk",
"command": "latexmk",
"args": [
"-synctex=1",
"-interaction=nonstopmode",
"-file-line-error",
"-pdf",
"-outdir=%OUTDIR%",
"%DOCFILE%"
],
"env": {}
},
{
"name": "lualatexmk",
"command": "latexmk",
"args": [
"-synctex=1",
"-interaction=nonstopmode",
"-file-line-error",
"-lualatex",
"-outdir=%OUTDIR%",
"%DOCFILE%"
],
"env": {}
},
{
"name": "latexmk_rconly",
"command": "latexmk",
"args": [
"%DOCFILE%"
],
"env": {}
},
{
"name": "pdflatex",
"command": "pdflatex",
"args": [
"-synctex=1",
"-interaction=nonstopmode",
"-file-line-error",
"%DOCFILE%"
],
"env": {}
},
{
"name": "bibtex",
"command": "bibtex",
"args": [
"%DOCFILE%"
],
"env": {}
},
{
"name": "rnw2tex",
"command": "Rscript",
"args": [
"-e",
"knitr::opts_knit$set(concordance = TRUE); knitr::knit('%DOCFILE_EXT%')"
],
"env": {}
},
{
"name": "jnw2tex",
"command": "julia",
"args": [
"-e",
"using Weave; weave(\"%DOC_EXT%\", doctype=\"tex\")"
],
"env": {}
},
{
"name": "jnw2texmintex",
"command": "julia",
"args": [
"-e",
"using Weave; weave(\"%DOC_EXT%\", doctype=\"texminted\")"
],
"env": {}
},
{
"name": "tectonic",
"command": "tectonic",
"args": [
"--synctex",
"--keep-logs",
"%DOC%.tex"
],
"env": {}
}
],
参考
- ^Overleaf Quick Start Guide https://github.com/overleaf/overleaf/wiki/Quick-Start-Guide
- ^Overleaf Toolkit https://github.com/overleaf/toolkit
- ^TeXLive https://www.tug.org/texlive/
- ^SumatraPDF support https://github.com/Hannah-Sten/TeXiFy-IDEA/wiki/SumatraPDF-support