【學習筆記】Latex各平臺2020實戰攻略

Latex各平臺2020實戰攻略

寫在前面:按照本意其實比較想寫成“全平臺記錄”的,但是想了一下感覺自己大概還是沒資格那樣說,更何況還有最致命的一個問題——我手頭沒有mac且不會玩黑蘋果,於是就emmm,起了這個名字。

然後接下來是說正事環節,在本文中,我將嘗試去展示從儘可能多的角度,以儘可能詳細的方式去講述自己tex使用的經驗,以及一些潛在遇到的問題。在每章的開頭,我均會簡述一下閱讀本部分所需要的一些基礎技能點,以便補課。

概述

關於\(\TeX\)

關於\(\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.

以上是原文,簡單來說大概這麼幾個要點:

  • \(\TeX\)是一種排版系統,這一點和word的定位有幾分類似
  • \(\TeX\)已經在學術界被廣泛使用,而且免費
  • \(\TeX\)的主要目標有二
    • 讓任何人以極小代價構建高質量文檔內容,確保編寫者的內容專注性
    • 確保同一份文檔在各個計算機上的渲染結果相同,確保格式統一性

關於\(\LaTeX\)

實際上,\(\LaTeX\)是一個更爲大衆所熟知的名詞。而這個詞和上文\(\TeX\)的關係,經過一番查閱官方資料,本人作如下理解,如有不當之處歡迎批評指正:

  • \(\TeX\)是一種語言,且存在多種不同的實現
  • \(\LaTeX\)是這種語言編寫的

這樣的關係實際上頗有些類似於C和C++的關係。首先C語言本身就存在多種實現,比如衆所周知的gnu實現(即gcc)、vs實現(從早期的vc6到現在和.NET Framework存在千絲萬縷關係的vs)以及clang實現等。在這些實現的基礎上,C++基於C本身的功能和特性,定義了更多的一些標準庫和功能,也在語法層面進行了進一步的擴展。同樣的,隨着\(\LaTeX\)得到長足的發展,其本身也被納入了官方工具鏈的支持範圍中,這一點也和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作爲跨平臺的編輯器。

實操

當Tex遇到Linux

首先當然要從最簡單的一個開始講起來,先看下在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。

當Tex遇到Windows

實際上這部分操作也不算很複雜,甚至對於不那麼習慣使用命令行的人而言反而這樣更傻瓜一些。

首先,從清華大學鏡像源上下載所需要的iso鏡像,並掛載到本地虛擬盤符上。而後進入盤內,運行install-tl-windows.bat批處理文件(建議使用管理員權限,以便給全體用戶安裝)。然後就是等待安裝完畢,可能時間比較久(大概1小時不到一點)。安裝完畢後,可以用類似Linux的方式來檢測是否安裝成功,如果命令行不存在,則可以考慮找下可執行文件並手動添加至環境變量中。

而關於編輯器的安裝,可以直接參考官方網站,均提供可執行安裝包:

當Tex遇到Makefile

既然已經在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 xelatexmake 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}

即可直接在後文中使用中文,不需要任何額外配置,實測可用

當Tex遇到docker

而考慮到部分小夥伴可能比較喜歡docker-based開發,所以在此筆者也進行了一定的踩坑。關於docker相關,我也分享一下經驗。

目前已經做了如下的探索:

  • 選用ubuntu容器,建議選用國內版,或者自行更換鏡像源、時區以及默認系統編碼
  • 在上面用apt命令安裝texlive-full
  • 考慮到後續可能有自行安裝額外字體的需要,服還需要額外安裝fc-cache命令行

大概摘取了一部分,供參考

FROM ubuntu:my-version
MAINTAINER HansBug <[email protected]>

# 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

以上是比較簡單的一種。值得注意的是:

  • 實測,在ubuntu16.04鏡像上,安裝的版本是2015版,在18.04鏡像上是2017版,20.04鏡像上是2019版
  • 如果對環境沒有特別敏感的需求的話,自行選用對應的ubuntu系統即可
  • 當然,如果您比較依賴特殊環境,或者就是想在同一個系統下精準安裝自定義的版本,那麼大概需要自備iso並掛載安裝。iso的安裝方式可以參考下這篇文章:https://blog.csdn.net/engreal/article/details/80704755,寫於2018年內容應該還算比較新

當Tex遇到gitlab ci

在前面的章節中,已經解決了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上一次實戰的大概總結,實際上也根本沒啥東西,權當一個可有可無的記錄吧,不爲別的,只爲等到哪天我這榆木腦袋把這些忘個精光後,再來看看時省點時間吧。總結啥的,也就這麼回事而已。

胡言亂語的話,實際上也沒啥好說的,真的沒啥畢竟。近期一系列的操作早就亂了套,自己就一泥菩薩也沒資格說啥,說啥都是蒼白的。硬要說的話,長點記性長點腦子,別一天到晚和牲口似的記喫不記打,好了傷疤忘了疼,不,那連牲口都比不上。失敗不可怕,只要心中的旗子沒倒下,最起碼還能重來,但旗子倒了那就真的沒救了。他們都說,摧毀一個人,只需要令他相信,然後將這份信念撕得粉碎。但是我一直覺得,只有這樣,依然願意自個撿起來縫縫補補並像寶貝一樣收好走下去的信念,纔算得上是信念,而不是一張打着信念的旗號被當做擋箭牌的廁紙。

算了,也不想那些有的沒的,想了也沒用你又不是上帝,更何況眼巴巴看着悲劇發生卻只能眼巴巴看着無能爲力,那才叫真的悲劇。別問,問就一句——“但將行好事,莫要問前程”。就醬,告辭。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章