写在前面:按照本意其实比较想写成“全平台记录”的,但是想了一下感觉自己大概还是没资格那样说,更何况还有最致命的一个问题——我手头没有mac且不会玩黑苹果,于是就emmm,起了这个名字。
然后接下来是说正事环节,在本文中,我将尝试去展示从尽可能多的角度,以尽可能详细的方式去讲述自己tex使用的经验,以及一些潜在遇到的问题。在每章的开头,我均会简述一下阅读本部分所需要的一些基础技能点,以便补课。
关于
,首先我们看下wikipedia上的说明:
TeX, stylized within the system as TEX, is a typesetting system (or a "formatting system") which was designed and mostly written by Donald Knuth and released in 1978. TeX is a popular means of typesetting complex mathematical formulae; it has been noted as one of the most sophisticated digital typographical systems. TeX is popular in academia, especially in mathematics, computer science, economics, engineering, linguistics, physics, statistics, and quantitative psychology. It has largely displaced Unix troff, the other favored formatting system, in many Unix installations which use both for different purposes. It is also used for many other typesetting tasks, especially in the form of LaTeX, ConTeXt, and other macro packages. TeX was designed with two main goals in mind: to allow anybody to produce high-quality books with minimal effort, and to provide a system that would give exactly the same results on all computers, at any point in time (together with the Metafont language for font description and the Computer Modern family of typefaces). TeX is free software, which made it accessible to a wide range of users.
以上是原文,简单来说大概这么几个要点:
是一种排版系统,这一点和word的定位有几分类似
已经在学术界被广泛使用,而且免费
的主要目标有二
实际上,
是一个更为大众所熟知的名词。而这个词和上文
的关系,经过一番查阅官方资料,本人作如下理解,如有不当之处欢迎批评指正:
是一种语言,且存在多种不同的实现
是这种语言编写的
这样的关系实际上颇有些类似于C和C++的关系。首先C语言本身就存在多种实现,比如众所周知的gnu
实现(即gcc
)、vs实现(从早期的vc6到现在和.NET Framework存在千丝万缕关系的vs)以及clang实现等。在这些实现的基础上,C++基于C本身的功能和特性,定义了更多的一些标准库和功能,也在语法层面进行了进一步的扩展。同样的,随着
得到长足的发展,其本身也被纳入了官方工具链的支持范围中,这一点也和gcc
颇为类似,现代的gcc
实际上早已支持C++特性并可以完成C++项目的构建。
说回到不同实现的这一层,比较常见的latex环境大概两个——texlive和ctex。这两者都具备一定的使用量,基本功能和性能有所保证,而且ctex在win自带编辑器等配套工具。不过相对来说,笔者觉得texlive的环境配置更为简单一些,也更纯粹。并且笔者早年尝试过在win上配置ctex环境及其完整套件,感觉还是存在诸如支持老旧、封装过度等一系列问题,环境本身也略微脆弱,相比之下texlive简单暴力但是靠谱,跨平台也基本上没啥坑,故本文中一概选择texlive环境。当然了,对ctex有兴趣的老哥老姐们也欢迎探索交流。
接下来就是关于编辑器的选择了。实际上写过paper或者latex文档的都应该知道,latex实际上远远不只是一个平铺直叙的东西。
笔者在编辑器选择的问题上,参考了一些国内外论坛上的说法,了解了一系列比较被广泛使用的GUI编辑器。限于笔者对其也不能说都很了解,故在此处略微说说笔者比较了解的那些。
首先是在线类编辑器:ShareLatex、Overleaf,著名在线编辑器,同时模板众多且适合teamwork。但是缺点也很明显,国内嘛,都懂,一系列不便是真实存在的。故个人推荐在需要teamwork的时候考虑在线编辑器(实际上也大可不必,完全可以基于git协作,用后文中所述的方式),在需要模板的时候,可以去Overleaf上找一下,创建项目后直接打包下载到本地。
本地类编辑器,着重说说几个:
编辑器 | 优点 | 缺点 |
---|---|---|
TexStudio | 针对Latex设计,使用方便,功能齐全且可配置性完全可以;在Linux系统上视觉效果好 | 在Win平台上视觉效果不够好,容易出现配色崩坏等情况(例如代码警告色和部分高亮色完全重合等) |
TexMaker | 针对Latex设计,使用方便,可配置空间充分;比TexStudio更轻量化 | 在Win上效果略差;功能不如TexStudio齐全 |
WinEdt | 入门级编辑器,CTex套装自带,功能齐全 | 跨平台支持受限,且存在过度封装等情况,可配置性受限 |
VSCode | 比较轻量化,且针对代码编辑的优化到位,使用快捷 | 需要配置额外插件以及编译方式,且实际使用起来并没有上述几个Latex专用工具流畅 |
Sublime Text | 轻量化,启动快,使用快捷 | Latex相关插件支持付费,且比较需要进行手动配置 |
以上为个人的使用体验,故笔者最终还是选择了TexStudio作为跨平台的编辑器。
首先当然要从最简单的一个开始讲起来,先看下在linux上tex环境的配置。实际上真的特简单,就一个命令完事
sudo apt install -y texlive-full
可能会运行比较长时间,毕竟这个包有3-4G之大。运行完后可以用以下的命令查看环境是否配置妥当
latex --version # latex 命令
xelatex --version # xelatex 命令(后续会用到)
bibtex --version # bibtex 命令(后续会用到)
在ubuntu16.04中,这样安装出来的版本是texlive-2015,虽然可能老了点,但是实测基本功能齐全,一般的使用完全没有问题。
至此,texlive环境算是安装完毕了。不过考虑到可能需要用到的编辑器,我们还是应该去安装下,虽然也都是一条命令的事情:
sudo apt-get install -y texstudio # 安装texstudio
sudo apt-get install -y texmaker # 安装texmaker
可以根据自己的使用习惯决定安装哪个,个人的话更喜欢使用texstudio。
实际上这部分操作也不算很复杂,甚至对于不那么习惯使用命令行的人而言反而这样更傻瓜一些。
首先,从清华大学镜像源上下载所需要的iso镜像,并挂载到本地虚拟盘符上。而后进入盘内,运行install-tl-windows.bat
批处理文件(建议使用管理员权限,以便给全体用户安装)。然后就是等待安装完毕,可能时间比较久(大概1小时不到一点)。安装完毕后,可以用类似Linux的方式来检测是否安装成功,如果命令行不存在,则可以考虑找下可执行文件并手动添加至环境变量中。
而关于编辑器的安装,可以直接参考官方网站,均提供可执行安装包:
既然已经在linux等环境下准备命令行操作了,那Makefile这种的好东西自然必须提一嘴。这是我自己基于北航学位论文模板上的Makefile,魔改后的一个版本
# Latex command lines
LATEX := "$(shell which latex 2> /dev/null)" -interaction=nonstopmode
XELATEX := "$(shell which xelatex 2> /dev/null)" -synctex=1 -interaction=nonstopmode
PDFLATEX := "$(shell which pdflatex 2> /dev/null)" -synctex=1 -interaction=nonstopmode
LUALATEX := "$(shell which lualatex 2> /dev/null)" -synctex=1 -interaction=nonstopmode
# Bibtex command lines
BIBTEX := "$(shell which bibtex 2> /dev/null)"
# IDE command lines
NANO := $(shell which nano 2> /dev/null)
VIM := $(shell which vim 2> /dev/null)
GEDIT := $(shell which gedit 2> /dev/null)
TEXMAKER := $(shell which texmaker 2> /dev/null)
TEXSTUDIO := $(shell which texstudio 2> /dev/null)
EDIT ?= $(if ${TEXSTUDIO},${TEXSTUDIO}, \
$(if ${TEXMAKER},${TEXMAKER}, \
$(if ${VIM},${VIM}, \
$(if ${NANO},${NANO}, \
$(if ${GEDIT},${GEDIT}, \
)))))
EDITX := "${EDIT}"
# Key files
DISPATCH_TEX ?= $(shell ls *.tex | xargs -n 1 2> /dev/null | head -1)
DISPATCH_AUX := $(basename ${DISPATCH_TEX}).aux
DISPATCH_PDF := $(basename ${DISPATCH_TEX}).pdf
ABS_DISPATCH_TEX := $(abspath ${DISPATCH_TEX})
ABS_DISPATCH_AUX := $(abspath ${DISPATCH_AUX})
ABS_DISPATCH_PDF := $(abspath ${DISPATCH_PDF})
# Packaged variables
MAKEX := "$(MAKE)" DISPATCH_TEX="${DISPATCH_TEX}" EDIT="${EDIT}"
# Default script when run 'make'
all: build
# Build scripts (do not use absolute path here)
xelatex:
$(XELATEX) "${DISPATCH_TEX}"
bibtex:
$(BIBTEX) "${DISPATCH_AUX}"
xe_bi_xe_xe:
$(MAKEX) xelatex
$(MAKEX) bibtex
$(MAKEX) xelatex
$(MAKEX) xelatex
build: xe_bi_xe_xe
rebuild: clean build
# Clean scripts
clean:
find . -name '*.aux' -print0 | xargs -0 rm -rf
rm -rf *.lof *.log *.lot *.out *.toc *.bbl *.blg *.thm *.synctex.gz
rm -rf *.pdf
# Edit scripts
edit:
$(EDITX) "${ABS_DISPATCH_TEX}"
# Infomation script
dispatch:
@echo "${ABS_DISPATCH_TEX}"
pdf:
@echo "${ABS_DISPATCH_PDF}"
看上去似乎有些复杂,其实特别简单,就几个主要功能
make build # 按照xe->bib->xe*2的流程构建pdf(会自动寻找顶层tex文件用于构建)
make pdf # 输出生成后的pdf文件绝对路径(会自动寻找顶层tex文件并生成pdf路径)
make edit # 编辑tex文件(会自动寻找顶层tex文件和各种命令行编辑器,并打开编辑器)
make clean # 清空目前存在的构建文件
此外,考虑到可能存在的调试情况,故可以直接调用make xelatex
、make bibtex
等。同时考虑到可能会有不基于xelatex的,或者顺序不同的编译过程,在这样的情况下,可以参照make xe_bi_xe_xe
的写法进行扩展。
此脚本目前在ubuntu各个版本上实测运行正常,并在windows 10下的git bash中也运行正常(在win环境下,要想在make edit
中国自动使用texstudio或者texmaker,需要额外配置一下环境变量),可以放心使用。
至此,我们看一下运行效果。首先咱们弄来IEEE的双排tex模板(这里是传送门),具体操作方式很简单,打开模板,创建在线项目,然后直接将创建好的在线项目打包下载到本地然后解压,在解压完毕后,将上述Makefile添加进来,并添加一个README.md
。目前的路径结构应该如下
.
|-- IEEEtran.cls
|-- Makefile
|-- README.md
|-- bibliography
| |-- IEEEabrv.bib
| |-- IEEEexample.bib
| |-- IEEEtran.bst
| `-- IEEEtran_bst_HOWTO.pdf
`-- conference_041818.tex
1 directory, 8 files
然后我们执行
make build
后,结构如下
.
|-- IEEEtran.cls
|-- Makefile
|-- README.md
|-- bibliography
| |-- IEEEabrv.bib
| |-- IEEEexample.bib
| |-- IEEEtran.bst
| `-- IEEEtran_bst_HOWTO.pdf
|-- conference_041818.aux
|-- conference_041818.bbl
|-- conference_041818.blg
|-- conference_041818.log
|-- conference_041818.pdf
|-- conference_041818.synctex.gz
`-- conference_041818.tex
1 directory, 14 files
打开文件conference_041818.pdf
,看下效果
可以看到效果已经出来了。
此外,如果需要支持中文的话也十分简单,只需要在文档开头添加
\usepackage{ctex}
即可直接在后文中使用中文,不需要任何额外配置,实测可用。
而考虑到部分小伙伴可能比较喜欢docker-based开发,所以在此笔者也进行了一定的踩坑。关于docker相关,我也分享一下经验。
目前已经做了如下的探索:
apt
命令安装texlive-full
fc-cache
命令行大概摘取了一部分,供参考
FROM ubuntu:my-version
MAINTAINER HansBug <hansbug@buaa.edu.cn>
# Dependencies
RUN \
apt update \
&& apt upgrade -y \
&& apt install -y texlive-full \
&& latex --version \
&& xelatex --version \
&& bibtex --version
# Font utils support
RUN \
apt update \
&& DEBIAN_FRONTEND=noninteractive apt install -yq ttf-mscorefonts-installer fontconfig \
&& fc-cache --version
按照如下方式编译并运行看看效果
hansbug@hansbug-VirtualBox:~$ docker build -t latex:texlive-2015
hansbug@hansbug-VirtualBox:~$ docker run --rm -it latex:texlive-2015 /bin/bash
root@18e50c30e450:/# latex --version
pdfTeX 3.14159265-2.6-1.40.16 (TeX Live 2015/Debian)
kpathsea version 6.2.1
Copyright 2015 Peter Breitenlohner (eTeX)/Han The Thanh (pdfTeX).
There is NO warranty. Redistribution of this software is
covered by the terms of both the pdfTeX copyright and
the Lesser GNU General Public License.
For more information about these matters, see the file
named COPYING and the pdfTeX source.
Primary author of pdfTeX: Peter Breitenlohner (eTeX)/Han The Thanh (pdfTeX).
Compiled with libpng 1.6.17; using libpng 1.6.17
Compiled with zlib 1.2.8; using zlib 1.2.8
Compiled with poppler version 0.41.0
root@18e50c30e450:/# xelatex --version
XeTeX 3.14159265-2.6-0.99992 (TeX Live 2015/Debian)
kpathsea version 6.2.1
Copyright 2015 SIL International, Jonathan Kew and Khaled Hosny.
There is NO warranty. Redistribution of this software is
covered by the terms of both the XeTeX copyright and
the Lesser GNU General Public License.
For more information about these matters, see the file
named COPYING and the XeTeX source.
Primary author of XeTeX: Jonathan Kew.
Compiled with ICU version 55.1; using 55.1
Compiled with zlib version 1.2.8; using 1.2.8
Compiled with FreeType2 version 2.5.5; using 2.5.5
Compiled with Graphite2 version 1.3.10; using 1.3.10
Compiled with HarfBuzz version 1.0.1; using 1.0.1
Compiled with libpng version 1.6.17; using 1.6.17
Compiled with poppler version 0.41.0
Compiled with fontconfig version 2.11.94; using 2.11.94
root@18e50c30e450:/# bibtex --version
BibTeX 0.99d (TeX Live 2015/Debian)
kpathsea version 6.2.1
Copyright 2015 Oren Patashnik.
There is NO warranty. Redistribution of this software is
covered by the terms of both the BibTeX copyright and
the Lesser GNU General Public License.
For more information about these matters, see the file
named COPYING and the BibTeX source.
Primary author of BibTeX: Oren Patashnik.
root@18e50c30e450:/# exit
以上是比较简单的一种。值得注意的是:
在前面的章节中,已经解决了tex纯命令行编译的问题,也通过docker镜像的构建实现了独立环境的问题。
故在此基础上,我们可以基于gitlab ci将推上仓库的tex文档进行自动构建,并将pdf推送到特定的地方。
这是笔者在近期写的一篇综述文中所使用的.gitlab-ci.yml
文件(关于gitlab runner等的一系列具体配置方法,此处不作详细展开,感兴趣的话可以读一下gitlab ci的官方文档:传送门)
image: latex:texlive-2015 # use the image of yours
stages:
- build
- deploy
before_script:
- xelatex --version
- bibtex --version
build_paper:
stage: build
script:
- ls -al
- make build
- ls -al $(make pdf)
artifacts:
name: ${CI_PROJECT_NAME}-build-paper-${CI_COMMIT_SHA}
when: on_success
expire_in: 3 days
paths:
- '*.pdf'
deploy_paper:
stage: deploy
dependencies:
- build_paper
script:
- ls -al
- echo "this is empty deployment"
- echo "and you can push the pdf file $(make pdf) to anywhere you like"
实际上,在github上也可以用类似的方式,而且思路基本一致,只不过是换上了travis等持续继承系统而已。
以上就是近期在Latex上一次实战的大概总结,实际上也根本没啥东西,权当一个可有可无的记录吧,不为别的,只为等到哪天我这榆木脑袋把这些忘个精光后,再来看看时省点时间吧。总结啥的,也就这么回事而已。
胡言乱语的话,实际上也没啥好说的,真的没啥毕竟。近期一系列的操作早就乱了套,自己就一泥菩萨也没资格说啥,说啥都是苍白的。硬要说的话,长点记性长点脑子,别一天到晚和牲口似的记吃不记打,好了伤疤忘了疼,不,那连牲口都比不上。失败不可怕,只要心中的旗子没倒下,最起码还能重来,但旗子倒了那就真的没救了。他们都说,摧毁一个人,只需要令他相信,然后将这份信念撕得粉碎。但是我一直觉得,只有这样,依然愿意自个捡起来缝缝补补并像宝贝一样收好走下去的信念,才算得上是信念,而不是一张打着信念的旗号被当做挡箭牌的厕纸。
算了,也不想那些有的没的,想了也没用你又不是上帝,更何况眼巴巴看着悲剧发生却只能眼巴巴看着无能为力,那才叫真的悲剧。别问,问就一句——“但将行好事,莫要问前程”。就酱,告辞。