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

Latex各平臺2020實戰攻略

寫在前面:按照本意其實比較想寫成「全平臺記錄」的,可是想了一下感受本身大概仍是沒資格那樣說,更況且還有最致命的一個問題——我手頭沒有mac且不會玩黑蘋果,因而就emmm,起了這個名字。html

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

概述

關於\(\TeX\)

關於\(\TeX\),首先咱們看下wikipedia上的說明:git

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.github

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.docker

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.shell

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

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

關於\(\LaTeX\)

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

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

這樣的關係實際上很有些相似於C和C++的關係。首先C語言自己就存在多種實現,好比衆所周知的gnu實現(即gcc)、vs實現(從早期的vc6到如今和.NET Framework存在千絲萬縷關係的vs)以及clang實現等。在這些實現的基礎上,C++基於C自己的功能和特性,定義了更多的一些標準庫和功能,也在語法層面進行了進一步的擴展。一樣的,隨着\(\LaTeX\)獲得長足的發展,其自己也被歸入了官方工具鏈的支持範圍中,這一點也和gcc頗爲相似,現代的gcc實際上早已支持C++特性並能夠完成C++項目的構建。windows

說回到不一樣實現的這一層,比較常見的latex環境大概兩個——texlive和ctex。這二者都具有必定的使用量,基本功能和性能有所保證,並且ctex在win自帶編輯器等配套工具。不過相對來講,筆者以爲texlive的環境配置更爲簡單一些,也更純粹。而且筆者早年嘗試過在win上配置ctex環境及其完整套件,感受仍是存在諸如支持老舊封裝過分等一系列問題,環境自己也略微脆弱,相比之下texlive簡單暴力可是靠譜跨平臺也基本上沒啥坑,故本文中一律選擇texlive環境。固然了,對ctex有興趣的老哥老姐們也歡迎探索交流。bash

關於編輯器

接下來就是關於編輯器的選擇了。實際上寫過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 <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

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

  • 實測,在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上一次實戰的大概總結,實際上也根本沒啥東西,權當一個無關緊要的記錄吧,不爲別的,只爲等到哪天我這榆木腦殼把這些忘個精光後,再來看看時省點時間吧。總結啥的,也就這麼回事而已。

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

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

相關文章
相關標籤/搜索