【教程】跨平台使用vim-pandoc和vimtex编辑和输出pdf和docx的教程


#1

谢绝转载!

在学习使用 vim 写 markdown 的过程中,遇到了各种问题,在调整中又扩展到可以写 Latex,各种问题今天终于全部调整好了,将自己遇到的问题和解决方法写在这里,分享给有需要的人。

由于使用的电脑跨三大平台(windows10、opensuse、macosx),试用了 typora、Markdownpad2、mou、macdown、Remarkable 等各种编辑器,后来又有了编辑 Latex 的需求,最终决定折腾 vim/gvim,由于跨平台,详细说起来就比较繁琐,请大家细心慢慢看。

首先,这篇教程的目的是使用 vim/gvim 完全跨平台编辑 md 和 Latex,并且可以一键导出 docx(仅限 md)或 pdf,下面先说 windows 平台下的具体操作。

windows 平台需要安装以下软件:

1、gvim7.4
gvim 主页有两个版本,gvim74 和 gvim74-1024;后一个支持 python3.4.x,建议安装 gvim74-1024 这个版本

2、python3.4.x
为什么要安装这个呢?因为要使用 Ultisnips 插件,这个插件可以自动插入一些定义好的片段,更快捷。

3、pandoc
这个是一个文档转换神器,我们下一步的 md 转 docx 或 pdf 就靠它来完成。

4、Texlive2015
Latex 就类似 Linux 一样是一个大的概念,有好几种发行版,建议 Texlive2015,因为自带 latexmk,这个太方便了。

5、sumatraPDF
这是一个开源的 pdf 阅读器,编辑 Latex 文档时,需要调用阅读器来检查,我们要使用的 Vimtex 支持这个。

6、git
前往 git 官网下载,并安装 git,后面的下载插件要用到。

以上安装完成后,记得将 pandoc、Texlive、sumatraPDF 这三个的路径加入系统 Path 变量。具体操作为:
控制面板 – 系统和安全 – 高级系统设置 – 环境变量,在用户栏,新增变量,变量名:Path;变量值:以上三个软件的路径。完成以后重启电脑。

下来是 Linux 平台的操作:

openSUSE 平台需要安装以下软件:

1、添加 vim 源,更新到最新版。

sudo zypper ar -f  http://download.opensuse.org/repositories/editors/openSUSE_Leap_42.1/ vim-editor
 
     sudo zypper in vim

2、git

sudo zypper ar -f http://download.opensuse.org/repositories/devel:/tools:/scm/openSUSE_Leap_42.1/ git-scm
 
     sudo zypper in git

3、Texlive2015

 具体怎么安装,论坛里就有。

下面开始就不再涉及平台差异了,全部在 vim 的插件部分,主要是编辑 vimrc 的内容,跨平台通用。

我使用 vim-plug 来管理插件,如果你用其他的,请按照你的习惯修改命令。

首先是 Markdown 的编辑需要的 vim 插件,关于 md 的插件有很多,我也走了很多弯路,在这里强烈建议大家使用下面的插件,其他的都可以放弃了(中文很多教程或是经验都太陈旧了)

Plug 'vim-pandoc/vim-pandoc'
Plug 'vim-pandoc/vim-pandoc-syntax'

对于这两个插件需要做以下配置,就是写在你的 vimrc 文件里面

自动识别 md 文档

autocmd BufNewFile,BufRead *.markdown,*.mdown,*.mkd,*.mkdn,*.mdwn,*.md  set filetype=markdown

配置 pandoc 参数及自动导出 pdf 及 docx

        let g:pandoc#toc#position = "left"
	let g:pandoc#formatting#mode = 'h'
	let g:pandoc#formatting#smart_autoformat_on_cursormoved = 1
	let g:pandoc#folding#level = 9
	let g:pandoc#folding#fdc = 0
	let g:pandoc#folding#mode = "relative"
	let g:pandoc#filetypes#handled = "markdown","pandoc"]
	let g:pandoc#filetypes#pandoc_markdown = 0
	let g:pandoc#modules#disabled = 'spell']
	let g:pandoc#completion#bib#mode = 'citeproc'
	let g:pandoc#syntax#colorcolumn = 1

function! ToPdf()
    exec 'w'
    exec '!pandoc --latex-engine=xelatex --template= 你自己的模板  % --output %<.pdf'
endfunction

function! ToDocx()
		exec 'w'
    	exec '!pandoc --from=markdown --to=docx  % --output %<.docx'
endfunction

nmap <silent> <F8> :call ToPdf()<CR>
nmap <silent> <F9> :call ToDocx()<CR>

这里有 3 个注意事项:

1、我映射了 F8 和 F9 分别是导出 pdf 和导出 docx,如果你有占用这两个键,自己修改最后两行。

2、导出 pdf 如果涉及到中文,需要指定模板,windows 默认的模板路径在~\AppData\Roaming\pandoc\templates
openSUSE 默认的模板路径在 /usr/share/pandoc 版本号 /data/templates/ 下面,具体的模板内容就要自己在网上找了。找到后需要复制到上面的路径下。

3、导出 docx 的时候,有两个参数 --dir-data 和 --reference-docx

 --dir-data 不指定的话,默认路径就是~\AppData\Roaming\pandoc\,自动去这里查找一个 reference.docx 文件作为模板

 --reference-docx 可以指定一个具体的 docx 文件作为模板,默认路径和你的 md 文件在同一个目录内。

以上两个参数只能用一个,指定目录或是指定文件。

由于 pandoc 转换 pdf 是需要使用 texlive 的引擎,我想为了一个 md 转 pdf,已经安装了 3G 的 Texlive 了,干脆把 Latex 的编辑 – 编译也放在 vim 里面算了,结果这个想法让我折腾到崩溃,因为网上中文的 vim 涉及 Latex 的教程全部陈旧到无法说,英文的资料都特别零散,东一句西一句,折腾了一周才解决。

既然是 vim 编辑 – 编译,第一步肯定还是插件, 强烈建议 vimtex vimtex vimtex 就是这个插件,别的插件都不要用

vimtex 这个插件完全不需要你手工安装任何东西,命令如下:

Plug 'lervag/vimtex'

这样就 ok 了,完全不需要你再去搞任何目录、下载、复制,就这么简单。而且它默认使用 Texlive2015 里面带的 latexmk 来完成编译,这个东西也极其牛逼,有两个特点:

1、支持在 tex 源码文件里面指定编译引擎,其 Tex 引擎设置命令格式为:%!TEX program =

2、支持源码修改后,立即更新 pdf 以供查看

vimrc 需要的配置如下:

let g:tex_flavor                     = 'latex'
let g:tex_indent_items                    = 0
let g:Tex_DefaultTargetFormat        = 'pdf'                                                    
let g:Tex_CompileRule_pdf = 'xelatex -src-specials -synctex=1 -interaction=nonstopmode $*'   
let g:Tex_FormatDependency_pdf        = 'pdf'
let g:vimtex_view_method = 'general'
let g:vimtex_enabled = 1
let g:vimtex_complete_img_use_tail = 1
if WINDOWS()
	let g:vimtex_view_general_viewer = 'SumatraPDF'
	let g:vimtex_view_general_options= '-reuse-instance -forward-search @tex @line @pdf'
	let g:vimtex_view_general_options_latexmk = '-reuse-instance'
elseif OSX()
	let g:vimtex_view_general_viewer = 'open'
else
	let g:vimtex_view_general_viewer = 'xdg-open'
endif

这里有 2 点要注意,

1、编译命令是
\ll
,调用 latexmk 来完成编译,这里需要一个文件,windows 或 openSUSE 都是要放在~/ 下面,文件名:

.latexmkrc
内容如下:
$pdf_mode = 1;
$pdflatex = "xelatex --shell-escape -src-specials -synctex=1 -interaction=nonstopmode %O %S";
$recorder = 1;
$pdf_previewer = "SumatraPDF -reuse-instance -inverse-search -a %O %S";

2、我根据操作系统设定了不同的 pdf 阅读器,编译完成后,自动打开 pdf 文档查看,判断系统的函数你要自己写在 vimrc 里面,如果不会,google 这个很容易找到。

完成 vimrc 的修改后,重新打开你的 vim/gvim,新建一个 md 文档,按下 F8 导出 pdf,按下 F9 导出 docx

新建一个 tex 文档,输入\ll,自动编译并自动打开 pdf 供你查看,不要关掉 pdf 窗口,然后对源码进行修改,对源码保存后,pdf 会自动更新,这就是前面大力推荐 vimtex 这个插件的原因。

这样子设定后,什么环境下,md 和 Latex 都是相同的编辑体验,简单又好用。写在这里给有需要的人。

谢绝转载!


#2

既然是全局安装 TeXlive,也可以单独写一个 sh 文件比如 texlive.sh(记得 chmod a+x texlive.sh) 丢到 /etc/profile.d 目录下。这样的话所有用户都可以使用 TeXlive 了:-)

但是我不懂为什么会需要修改 sudoers 文件呢… … 应该没有必要,因为一般不会用 sudo 权限来编译。第四项应该可以去掉吧。之前你要使用 sudo 来编译,说明添加到 .bashrc 没有效果,而修改 sudoers 成功了。现在既然普通权限就可以编译了,那么应该就不需要编辑第四项:-)


#3

是我没说清楚,如果要使用 tlmgr 更新 TeXlive 的话,因为 /usr/local 权限的问题,必须使用 sudo 才能对这个目录写,但是 sudo 里面又没有 tlmgr 的路径,所以要修改 sudoers 这一句。