这篇其实不短的短文的内容分为五个部分,分别是:
- Markdown+Math
- VS Code+XeLaTeX
- TexLive+WinEdt
- latexrun 和 latexmk 的区别(前者是 python 脚本,后者是 perl 脚本?)
- XeLaTeX 导致的问题
- 解决方案:定义不可复制、搜索的伪加粗字体
- 关于 pdf 文件中的文字不可复制、搜索的问题,有一个“日文空格 Trick”或“全角空格 Trick”,亲测有效,但是!在使用了 kaishu 指令以后,这个方法就失效了。
- WinEdt 的 debug 技巧
第一部分:同时支持 Markdown 和 LaTeX 实时显示的软件之一:VS Code
对于同时支持 Markdown 和 LaTeX 实时显示的软件,我一直推荐的是 Typora 和 Jupyter Lab,但是其实 VS Code 也是可以做到的——只是要安装扩展罢了——是我太孤陋寡闻了。
通过安装合适的扩展,VS Code 能够编辑 Markdown 和 LaTeX 混排的文档(如博客文章):
- 在 VS Code 里,按下 ctrl+shift+x,会打开 Extension 搜索框:
- 【更新】评论里有内行人给推荐了一个:Markdown Preview Enhanced,我更推荐安装这个了现在,各位可以比较一下有什么不同。
- 输入 Markdown+Math,注意名字中间有个+号,如下图:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SOmZDZyUTO1UTYxgjNkNmMykjN3MGM5MDZyUWMmdTN48CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
让 VS Code 里的 markdown 支持 latex 公式
第二部分:在 VS Code 里编写 LaTeX 文档(如科技论文)
我试了一下,感觉不错,界面主题可以自己选择,挺讨喜的,还支持自动编译(即保存的时候就编译),我们一步一步设置。
- 在 VS Code 里,按下 ctrl+shift+x,会打开 Extension 搜索框,输入 LaTeX Workshop,点安装。
- 用 ctrl+alt+b 进行编译。
- 用 ctrl+alt+v 选择 pdf 输出文件的浏览方式,第一次有的选,建议选外部程序。
- 选了一次以后就记住了,慎重!如果不小心按错了,参考下图:
修改默认的 pdf 浏览工具
- 按照上面的快捷键,编译含有中文的文档时,会发现编译失败。此时,建议修改编译器为 XeLaTeX。下文有附上具体设置,简单来说,就是在配置 latexmk 时,删掉“-pdf”,改为“-xelatex”。 一些教程没有告诉你要删掉“-pdf”参数,就是坑。
- 以下是我的完整的设置(setting.json),注意括号和逗号。
附上图片,方便阅读
附上图片,方便阅读2
- 这里出现的 latexmk 是神器,对于新手来说,你不需要判断你要调用几次 latex 指令来刷新交叉引用,也不需要调用 bibtex,全部交给 latexmk 好了。latexmk 是用 Perl 语言写的。
- 是不是找不到在哪里设置?
- 这里哦:File-Preferences-Settings-LaTeX,然后点 Edit in setting.json,或者直接看图片吧:
去哪里找 setting.json 呢?
免责声明:我其实不是很清楚要不要安装额外的 LaTeX 编译器才行的,我的系统里是已经装了 TexLive 2019(这是超链接) ,所以如果不能编译,那你也应该装一个,但是下载、安装很花时间的哦。
- 我还成功用 xelatex 引擎编译通过了含中文的 Beamer(相当于 pdf 版本的 PPT)。
- 我发现输入 ctrl+shift+c,会在当前目录下打开一个 cmd。
- 这意味着,你仍然可以在 VS Code 里写作,然后自己调用 cmd 输入指令编译。比如,可以把编译指令写成一个 .bat 批处理文件,然后运行。下面有两个学位论文的例子,第一个例子是按不同的章节单独生成参考文献,所以需要手动一个一个把 bibtex 打上去。编译的文件是 drh.tex。
=
- 这是第二个例子。在一般情况下,只需要运行 xelatex 一次,bibtex一次,xelatex 两次就够了。这里的 makeindex 是建立索引,不需要的话移除就好了。
:: 这是一个.bat文件
xelatex --synctex=1 drh
makeindex drh.idx
bibtex drh
xelatex --synctex=1 drh
xelatex --synctex=1 drh
- 其他资料:
- 浙大学位论文模板。
- 中科院学位论文模板。
- 再附上几句很难蒐集到的但是超好用的清爽指令:
usepackage
第三部分:TexLive 和 WinEdt (是时候淘汰 CTEX 套装了)
我至今还留恋 CTEX 套装的原因就是为了 WinEdt(一款 LaTeX 编辑器,可代替上面的 VS Code)。但是,我今天发现,其实 WinEdt 是独立的编辑器……作为 WinEdt 的正版付费用户,我感到深深的羞愧……
所以,事情就变得很简单了,先想办法在 Window 下安装
TexLive 2019。
然后去下载安装
WinEdt 最新版(这是超链接),然后你会发现,WinEdt 自动识别你电脑中的 LaTeX 编译器:(点击 WinEdt 顶部标签 Options-Execution Modes)
WinEdt 自动识别 Latex 编译器
另外,在WinEdt 的 Options-Preferences-Wrapping 中,添加 UTF-8|ACP; 以打开 UTF-8 编码的文件,如下:
还有,在WinEdt 的 Options-Preferences-Unicode 中,不要勾选 Enable ANSI Format for Modes,如下:
WinEdt 前向搜索定位:
SumantraPDF 反向搜索定位:(请按自己的安装目录修改)
"D:Program FilesWinEdt TeamWinEdt 10WinEdt.exe" "[Open(|%f|);SelPar(%l,8)]"
一些 WinEdt 的快捷键:
ctrl+h:查看当前目录
ctrl+shift+h:设置当前文档所在目录为当前目录
ctrl+shift+c:内置命令行
ctrl+=:行数显示
F5:刷新界面左边的 Tree
ctrl+g:go to line
我一般是这样编译大论文的(看最下面的 z.bat,就是运行一个编译 LaTeX 文档的脚本):
WinEdt 使用示例
第四部分:latexrun 和 latexmk 的区别
浅尝 Linux 系统下的 LaTeX 生态
为了使用一款叫做 latexrun 的 LaTeX Wrapper(相当于 latexmk,但是据说 debug 时更友好),并使用 Makefile 来编译 latex 文档,我开始研究在 Linux 系统下的 latex 系统生态。
为了使用中文,需要为 Linux 系统下的 TexLive 安装 ctex 库。参照下面这个回答,可以用tlmgr(texlive manager)来安装 ctex 库。然后在 Bash(终端)里输入下面的指令就可以了。
tlmgr install ctex
https://tex.stackexchange.com/questions/137428/tlmgr-cannot-setup-tlpdb
如何在 Ubuntu 系统下安装最新版的 texlive:
https://github.com/scottkosty/install-tl-ubuntugithub.com
如何卸载 Linux 下的 TexLive:
How to remove everything related to TeX Live for fresh install on Ubuntu?tex.stackexchange.com
关于 latexmk
我试了一下,其实你也可以在 Windows 系统下使用 latexrun,它其实就是一个 python 脚本。但是我没有感觉到这个好在哪里……还是用 Perl 语言写的 latexmk 吧,就是多装个软件(好像叫草莓 Perl)罢了。
用 latexmk 调用 xelatex 是有点麻烦的,搜了一会也没找到答案,后来快放弃的时候在这里找到了:
latexmk -pvc -view=none -xelatex 你的tex文件文件名
:: 或者:
latexmk -c -xelatex -synctex=1 你的tex文件文件名
这里的 -pv 参数(我不知道具体是哪一个)还能持续监测改动自动刷新 pdf 文件,-c 参数是清除中间文件的意思,-synctex=1 产生反向搜索的必要文件。
不需要中文的话,latexmk 调用 pdflatex 就很简单了:
latexmk -quiet -pdf 你的tex文件文件名
这里的 -quiet 就是静默打印的意思。
虽然话是这么说,我推荐傻瓜式的 batch 文件,而不是 latexmk——太聪明了有时候反而不好,比如我想让它重新编译一遍,它可能会说我不要(摔桌子第五部分:XeLaTeX 导致的中文字问题,以及如何 debug
LaTeX+WinEdt,如何快速定位错误?
我在写大论文的时候,一不小心就可能出错,比如:
上哪儿找“}}}”?
Latex 报错只告诉你出错的行号是 205 行(见上图),却不告诉你哪个文件,真的很头疼。我把所有的 .tex 文件(我有五个 .tex 子文件,分别包含了五章的内容)都打开看了个遍,没找到错误,甚至都没找到三个右大括号“}}}”——这是经常发生的事情。
今天我才知道,你只要输入字母 e 然后回车就会跳转到错误的地方了。
哇塞!出错的地方压根不在 .tex 文件中,而是在 .aux 文件中,这一看,确实有“}}}”,但是我怎么debug呢?
是这样的,这种情况,往往是你修正了原来的 .tex 文件中的一个低级错误(你自己一下就知道了的那种错误),但是问题是你已经带着这个低级错误编译了一次,当然没通过。等你修正了这个低级错误以后,再编译,于是就报了这个“}}}”新错误,然后你就懵逼了——我不是已经修正了吗?
解决办法很粗暴,这个时候,只需要手动删除 .aux 文件就可以了。当然,WinEdt 支持一键删除所有过程文件,是一个垃圾桶按钮。
又比如这个错误:
说实话,我见过超多次这种在文件第一行(l.1)的错误……原来是 .aux 的第一行啊!
关于 XeLaTeX 产生的 pdf 文件不能复制文字(也不能搜索文字)的问题
以 ZJUThesis 这个学位论文模板为例:
documentclass[oneside,AutoFakeBold=false]{ZJUthesisv2}
建议不要使用伪加粗字体,采用 AutoFakeBold=false 这个选项,那么最终生成的 pdf 文档就可以复制、搜索文字了。也就是说,用了伪加粗字体,pdf 文件中的文字不可复制、搜索。
XeLaTeX 宋!体!中文字加粗
并不是说一定不能加粗,如果正文字体是(默认的)宋体,那么用加粗指令 bfseries{} 以后,加粗的正文字体是黑体。也就是说,其实可以直接用:
{heiti{}我其实就是加粗的宋体}
代替
{songtibfseries{}变成了黑体的宋体}
跑题一下,关于 ZJUThesis 这个模板
上面的例子里,为什么我要加空的大括号?2016版 ZJUThesis 的作者说:
还有还有,用到带额外信息的引用时,比如需要强调多少页,一般用 cite[p.~64]{bibkey}。但是在这个学位论文模板中——可能这个指令被重定义了还是怎么样的——反正这么做不行了。那就自己定义一个 citeinfo 吧:
newcommand*citeinfo[2]{textsuperscript{[citenum{#1},~#2]}}
XeLaTeX 仿!宋!和楷!书!中文字加粗
前面已经看到了,全局 AutoFakeBold=true 会导致 pdf 文件中的文字不可复制、搜索。那么改为false就好了。但是!如果我真的想要加粗,比如加粗表格的第一行,怎么办?
想要局部加粗仿宋,可以这么干,定义一个字体为 fangsongboldfont,再定义一个命令为 fangsongbold:
newCJKfontfamilyfangsongboldfont{FangSong}[AutoFakeBold] % 重定义 fangsong % xelatex编译加粗楷体为什么会失败?
newcommand{fangsongbold}{fangsongboldfontbfseries{}}
% 使用例子:
{fangsongbold{}我是加粗的仿宋}
你知道中文其实是没有 斜体 的吗!?
stone-zeng:回「LaTeX 的罪与罚」zhuanlan.zhihu.com
我现在知道了。作为中文之“斜体”的楷书,也可以用类似的操作处理加粗的需求:
% 楷体(相当于英文的斜体)
letkaishurelax % 清除旧定义
newCJKfontfamilykaishu{KaiTi}[AutoFakeBold] % 重定义 kaishu % xelatex编译加粗楷体为什么会失败?
{kaishubfseries{}我是加粗的楷书}
但是,加粗了的楷书复制后是乱码!(但是不知道为什么,加粗后的仿宋竟然可以正常复制……原理不明)。
一个帮助理解的可编译的例子
是不是晕了?拿下面这个例子去感受一下(用 xelatex 编译):
documentclass
后记
我不敢相信我又花了整整两天的时间更新我的学位论文(从浙大 2006 年的模板转为 2016 年的模板),科研进度原地踏步。
LaTeX 有没有罪与罚我不知道,我感觉我反正是被惩罚了,被我的这颗该死的好奇心。