LaTeX (xeLaTeX) 使用心得和 Vim 配置 (初级篇)

写在前面

我很早就听说做报告有个叫 LaTeX 的玩意很好用。一方面之前我的指导老师推荐用 LaTeX 写论文,还有就是这两天在写操作系统实验报告,也手痒想拿这玩意试试看。

可能是我对 LaTeX 本身的期望太大了吧,实际上 LaTeX 并没有我想象的那么好使。可能在国外读大学的同学情况会好些,因为国外大学会有写好的模板。但是是到了中文环境下,LaTeX 的支持做的可以说差劲。为什么这么说呢?用 LaTeX 写计算机科学方面的东西,它最方便的功能 —— 添加代码块,即使是加了最重的中文支持宏包 CTeX 也不能很好的支持代码中的中文显示。要知道计算机科学方面应该是 LaTeX 的本家了,当然我在后面会给出解决办法。

我并不是说 LaTeX 怎么怎么不好。因为排版问题本身就是个NP完备问题。而是说用 Word 的也好,用 LaTeX 的也好,只要你能达到排版美观的目的即可。Word 有 Word 的长处,LaTeX 有 LaTeX 的长处,这我下面也会有介绍,但现在你需要记着,LaTeX 只不过是另一种排版方式而已,它并没有让你产生任何优越性的理由。当然,它在模板重用,章节自动计数等方面是有不可否认的优势。用 Word 的同学,如果是近几天就急需要交稿,也大可不必急着学习 LaTeX,把手上的论文用 Word 好好排排,效果一样出色。

什么是 LaTeX

我也才接触 LaTeX 不久,大概说说 LaTeX 是个怎么回事。

首先说 Tex。Tex 是一个很古老的排版工具 (1977 Stanford,比 Word 要早哦)。主要用于科技著作的排版工作。而这种工具使用的文件后缀名即为 *.tex。

Plain Tex 是 Tex 最基本的文件格式,但是这种格式实在基本,也十分复杂,一方面要处理文本格式,一方面要写 Tex 指令。并不适合普通作者使用。(哪个作家想为了创作做程序员的?我双手欢迎!!)

于是就出现了人们熟知的 LaTeX,LaTeX 真正从一个作者的角度出发,即使不懂程序设计的知识也可以在几天时间内做出很有质量的排版。而对于论文中,标题、章节、目录的自动计数支持,对于科学领域的复杂表格和公式更有突出的优势。

常见的 LaTeX 编译器

说这点是为了点一下插图和中文支持的两个坑。

  • latex: latex 是 LaTex 默认的编译器,缺省输出文件为 dvi 文件,使用 -pdf 选项后输出pdf文件。默认不支持中文,默认不支持位图。(知道什么叫位图吧? jpg,png,etc。只要不是 eps 格式的都傲娇哦)
  • pdflatex: 使用 pdflatex 编译可以直接编译出 pdf 文件。支持部分位图格式 (png),和 latex 一样导入 ctex 宏包后可以对中文进行一定程度的支持 (限定6种字体)
  • xelatex: Tex 编译程序的最新实现,使用 xeCJK 可以支持系统原生的字体库,再加上 ctexcap 宏包就可以达到对中文的最高程度支持。是三种编译器中解决中文环境的最完美解决方案。支持绝大多数位图格式 (png,jpg,bmp,etc.),但是语法上比传统 Tex 稍严格。

读者应该心里有数了吧? 如果你是新手想用学 LaTex 的,还想用它排中文的,请用 xelatex! 请用 xelatex! 请用 xelatex! 这也是笔者特意在标题后面写上它的原因。

与 Word 的对比

LaTeX 与 Word 可以说是截然不同的。Word 可以做到所见即所得地排版。而 LaTeX 则是需要将排版的控制指令写入文本中。经由编译系统的编译才能展现出文章最后的面貌。

Word LaTeX
学习难度 前期上手快,后期学习难度增加。 前期难以入门,后期学习难度较低
排版模式 所见即所得,手动排版。 先写排版指令,编译后查看排版结果。
排版效果
擅长领域 日常工作 科研领域( 计算机科学,数学,语言学等 )
合作创作 前期只能靠复制粘贴的方式合作,后期有强大的批阅记录 前期可以通过导入外部tex文件进行方便的多人合作书写,但后期没有批阅这一模式,只能靠pdf批阅,不能体现在源文件中。(我晓得你会用git)

常见问题

好像前面说的有点多了啊 orz,常见问题我就另开一篇文章吧。

嫌麻烦的同学可以先看看这里。

这里面有我配置好的排版。可能样式丑了点,但是可以保证数学公式,伪代码,代码的导入编辑绝对没有坑。什么中文不兼容和伪代码栏太宽等问题一定是没有滴!!只希望能拿它当个底包用。在此基础上可以做一些更漂亮的排版工作。

page.png

还有一些模板可以参考:

编写环境

顺带说一下编写环境问题。笔者知道用来写 LaTeX 的软件有两个,TexStudio 和 Texmaker。这两个书写程序大概看了下还算简单,经过一些诸如指定编译器的一些配置后就可以上手使用了。我当然还知道 ctex 也发了个集成版开发环境。但鉴于某个致命 BUG (它把PATH变量全清空了) 和使用的盗版编译器 (WinEdit) 就不提了。

当然,作为一个 Vim 党。我就照顾一下我们的党员吧。以下给出笔者调试过的 Vim 配置:

首先,插件部分,这里推荐 neo 系列的 neocomplate 和 neosnippet,以及针对 Tex 文件做优化的 vim-latex 插件。
编译使用的是强大的 singlecomplete 插件。另外 pdf 浏览器我换成了 evince。这样每次编译后不用重新打开,他自己就会刷新的。
所以你开两个窗口,一个 Vim 在写,一个 evince 再看。多爽!

vim.gif

注意我用的插件管理器为 Vim-Plug。若使用不一样的管理器还请稍微修改下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
let language_ex=['python''c','cpp','vbs','vim','java','php','ino','vimentry','matlab','html','sql','tex']
Plug 'vim-latex/vim-latex',{'for':'tex'}
" let g:Tex_CompileRule_ps = 'dvips -Ppdf -o $*.ps $*.dvi'
" let g:Tex_ViewRule_dvi = 'dviout'
" let g:Tex_CompileRule_dvi = 'latex -synctex=1 -src-specials --interaction=nonstopmode $*'
" let g:Tex_CompileRule_ps = 'dvips -Ppdf -t letter -o $*.ps $*.dvi'
let g:Tex_CompileRule_pdf = 'xelatex -synctex=1 -file-line-error-style -interaction=nonstopmode $*'
let g:Tex_DefaultTargetFormat = 'pdf'
let g:Tex_SmartKeyBS=0
" let g:Tex_ViewRule_ps = 'okular'
if WINDOWS()
let g:Tex_ViewRule_pdf = 'C:\Users\Anemone\AppData\Local\Apps\Evince-2.32.0.14401\bin\evince.exe'
endif
let g:Tex_ViewRule_dvi = 'dviout'
let g:Tex_SmartKeyBS=0
Plug 'Shougo/neosnippet-snippets',{'for':language_ex}| Plug 'Shougo/neosnippet.vim'
" Plugin key-mappings.
imap <C-k> <Plug>(neosnippet_expand_or_jump)
smap <C-k> <Plug>(neosnippet_expand_or_jump)
xmap <C-k> <Plug>(neosnippet_expand_target)
" SuperTab like snippets behavior.
imap <expr><TAB>
\ pumvisible() ? "\<C-n>" :
\ neosnippet#expandable_or_jumpable() ?
\ "\<Plug>(neosnippet_expand_or_jump)" : "\<TAB>"
" For conceal markers.
if has('conceal')
set conceallevel=2 concealcursor=niv
endif
Plug 'Shougo/neocomplete.vim',{'for':language_ex}
" let g:neocomplete#enable_debug = 0
let g:acp_enableAtStartup = 0
let g:neocomplete#enable_at_startup = 1
let g:neocomplete#enable_smart_case = 1
let g:neocomplete#max_list=30
let g:neocomplete#sources#dictionary#dictionaries = {
\ 'default' : '',
\ 'arduino' : $VIM.'/vimfiles/dict/arduino.dict',
\ 'c' : $VIM.'/vimfiles/dict/c.dict',
\ 'cpp' : $VIM.'/vimfiles/dict/cpp.dict',
\ 'css' : $VIM.'/vimfiles/dict/css.dict',
\ 'java' : $VIM.'/vimfiles/dict/java.dict',
\ 'javascript' : $VIM.'/vimfiles/dict/javascript.dict',
\ 'php' : $VIM.'/vimfiles/dict/php.dict',
\ 'vim' : $VIM.'/vimfiles/dict/vim.dict',
\ 'matlab' : $VIM.'/vimfiles/dict/matlab.dict',
\ 'sql' : $VIM.'/vimfiles/dict/sql.dict',
\ 'tex' : $VIM.'/vimfiles/dict/latex.dict',
\ }
inoremap <expr><TAB> pumvisible() ? "\<C-n>" : "\<TAB>"
autocmd FileType css setlocal omnifunc=csscomplete#CompleteCSS
autocmd FileType html,markdown setlocal omnifunc=htmlcomplete#CompleteTags
autocmd FileType javascript setlocal omnifunc=javascriptcomplete#CompleteJS
autocmd FileType python setlocal omnifunc=pythoncomplete#Complete
autocmd FileType xml setlocal omnifunc=xmlcomplete#CompleteTags
inoremap <expr><C-h> neocomplete#smart_close_popup()."\<C-h>"
inoremap <expr><BS> neocomplete#smart_close_popup()."\<C-h>"
inoremap <silent> <CR> <C-r>=<SID>my_cr_function()<CR>
function! s:my_cr_function()
return (pumvisible() ? "\<C-y>" : "" ) . "\<CR>"
endfunction
if !exists('g:neocomplete#sources#omni#input_patterns')
let g:neocomplete#sources#omni#input_patterns = {}
endif
let g:neocomplete#sources#omni#input_patterns.tex= '\\\h\w*{'
Plug 'xuhdev/SingleCompile'
nmap <F9> :w<cr>: SCCompileRun<CR>
imap <F9> <ESC>:w<CR>:SCCompileRun<CR>
nmap <F10> :SCCompile<cr>
let g:SingleCompile_showquickfixiferror = 1

然后针对 LaTeX 做一些特殊配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
" this is mostly a matter of taste. but LaTeX looks good with just a bit
" of indentation.
set sw=2
" TIP: if you write your \label's as \label{fig:something}, then if you
" type in \ref{fig: and press <C-n> you will automatically cycle through
" all the figure labels. Very useful!
set iskeyword+=:
" nmap <F9> :call Tex_CompileLatex()<CR>
nmap <F10> :call Tex_ViewLaTeX()<CR>
" inoremap <expr><C-h> neocomplete#smart_close_popup()."\<C-h>"
" inoremap <expr><BS> neocomplete#smart_close_popup()."\<C-h>"
filetype indent on
" IMPORTANT: win32 users will need to have 'shellslash' set so that latex
" can be called correctly.
set shellslash
" IMPORTANT: grep will sometimes skip displaying the file name if you
" search in a singe file. This will confuse Latex-Suite. Set your grep
" program to always generate a file-name.
set grepprg=grep\ -nH\ $*
" OPTIONAL: Starting with Vim 7, the filetype of empty .tex files defaults to
" 'plaintex' instead of 'tex', which results in vim-latex not being loaded.
" The following changes the default filetype back to 'tex':
let g:tex_flavor='latex'
" imap <c-k> <F7>
nmap <c-j> <c-w>j
nmap <Leader>fa :%s/\./。/gc<cr>
nmap <Leader>fb :%s/,/,/gc<cr>
" :%s/,/,/gc
call SingleCompile#SetCompilerTemplate('tex', 'xelatex', 'XeLatex',
\ 'xelatex', '-interaction=nonstopmode -synctex=1 -file-line-error-style',
\ SingleCompile#GetDefaultOpenCommand() .
\ ' "$(FILE_TITLE)$.pdf"')
" call SingleCompile#SetOutfile('filetype', 'compiler', 'out_file')
call SingleCompile#ChooseCompiler('tex', 'xelatex')
nmap <F9> :SCCompile<cr>
imap <F9> :SCCompile<cr>
set list lcs=tab:\¦\
" "let g:neosnippet#snippets_directory='$VIM/vimfiles/latexsnip'

总之配一下这四个插件就可以了。实在不行也可以到我的 Git 仓库里下现成的配置文件。

https://github.com/Anemone0/exVim

最后小结

LaTeX 是一个强大的排版工具。这体现在有现成模板的情况下,书写人员只需专心编撰内容而无需照顾排版工作。

但排版问题一直是个NP完备问题。部分时候还是需要手工调整。它的前期学习成本较高,这里我推荐一个 入门的视频,大家可以看一看 。

我们现在常使用的已经是升级版 - xeLaTeX,它在本地字库的支持效果很好。同时支持很多插图格式。但是某些宏包的指令会有差异。 大概就是这样。