天天看点

latex 参考文献显示问号_关于 VS Code、WinEdt、LaTeX 和 Markdown 的一些实用 Tips

这篇其实不短的短文的内容分为五个部分,分别是:

  • 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,注意名字中间有个+号,如下图:
latex 参考文献显示问号_关于 VS Code、WinEdt、LaTeX 和 Markdown 的一些实用 Tips

让 VS Code 里的 markdown 支持 latex 公式

第二部分:在 VS Code 里编写 LaTeX 文档(如科技论文)

我试了一下,感觉不错,界面主题可以自己选择,挺讨喜的,还支持自动编译(即保存的时候就编译),我们一步一步设置。

  • 在 VS Code 里,按下 ctrl+shift+x,会打开 Extension 搜索框,输入 LaTeX Workshop,点安装。
  • 用 ctrl+alt+b 进行编译。
  • 用 ctrl+alt+v 选择 pdf 输出文件的浏览方式,第一次有的选,建议选外部程序。
    • 选了一次以后就记住了,慎重!如果不小心按错了,参考下图:
latex 参考文献显示问号_关于 VS Code、WinEdt、LaTeX 和 Markdown 的一些实用 Tips

修改默认的 pdf 浏览工具

  • 按照上面的快捷键,编译含有中文的文档时,会发现编译失败。此时,建议修改编译器为 XeLaTeX。下文有附上具体设置,简单来说,就是在配置 latexmk 时,删掉“-pdf”,改为“-xelatex”。 一些教程没有告诉你要删掉“-pdf”参数,就是坑。
  • 以下是我的完整的设置(setting.json),注意括号和逗号。
latex 参考文献显示问号_关于 VS Code、WinEdt、LaTeX 和 Markdown 的一些实用 Tips

附上图片,方便阅读

latex 参考文献显示问号_关于 VS Code、WinEdt、LaTeX 和 Markdown 的一些实用 Tips

附上图片,方便阅读2

  • 这里出现的 latexmk 是神器,对于新手来说,你不需要判断你要调用几次 latex 指令来刷新交叉引用,也不需要调用 bibtex,全部交给 latexmk 好了。latexmk 是用 Perl 语言写的。
  • 是不是找不到在哪里设置?
    • 这里哦:File-Preferences-Settings-LaTeX,然后点 Edit in setting.json,或者直接看图片吧:
latex 参考文献显示问号_关于 VS Code、WinEdt、LaTeX 和 Markdown 的一些实用 Tips

去哪里找 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)

latex 参考文献显示问号_关于 VS Code、WinEdt、LaTeX 和 Markdown 的一些实用 Tips

WinEdt 自动识别 Latex 编译器

另外,在WinEdt 的 Options-Preferences-Wrapping 中,添加 UTF-8|ACP; 以打开 UTF-8 编码的文件,如下:

latex 参考文献显示问号_关于 VS Code、WinEdt、LaTeX 和 Markdown 的一些实用 Tips

还有,在WinEdt 的 Options-Preferences-Unicode 中,不要勾选 Enable ANSI Format for Modes,如下:

latex 参考文献显示问号_关于 VS Code、WinEdt、LaTeX 和 Markdown 的一些实用 Tips

WinEdt 前向搜索定位:

latex 参考文献显示问号_关于 VS Code、WinEdt、LaTeX 和 Markdown 的一些实用 Tips

SumantraPDF 反向搜索定位:(请按自己的安装目录修改)

"D:Program FilesWinEdt TeamWinEdt 10WinEdt.exe" "[Open(|%f|);SelPar(%l,8)]"
latex 参考文献显示问号_关于 VS Code、WinEdt、LaTeX 和 Markdown 的一些实用 Tips

一些 WinEdt 的快捷键:

ctrl+h:查看当前目录

ctrl+shift+h:设置当前文档所在目录为当前目录

ctrl+shift+c:内置命令行

ctrl+=:行数显示

F5:刷新界面左边的 Tree

ctrl+g:go to line

我一般是这样编译大论文的(看最下面的 z.bat,就是运行一个编译 LaTeX 文档的脚本):

latex 参考文献显示问号_关于 VS Code、WinEdt、LaTeX 和 Markdown 的一些实用 Tips

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
latex 参考文献显示问号_关于 VS Code、WinEdt、LaTeX 和 Markdown 的一些实用 Tips

https://tex.stackexchange.com/questions/137428/tlmgr-cannot-setup-tlpdb

如何在 Ubuntu 系统下安装最新版的 texlive:

https://github.com/scottkosty/install-tl-ubuntu​github.com

如何卸载 Linux 下的 TexLive:

How to remove everything related to TeX Live for fresh install on Ubuntu?​tex.stackexchange.com

latex 参考文献显示问号_关于 VS Code、WinEdt、LaTeX 和 Markdown 的一些实用 Tips

关于 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 参考文献显示问号_关于 VS Code、WinEdt、LaTeX 和 Markdown 的一些实用 Tips

上哪儿找“}}}”?

Latex 报错只告诉你出错的行号是 205 行(见上图),却不告诉你哪个文件,真的很头疼。我把所有的 .tex 文件(我有五个 .tex 子文件,分别包含了五章的内容)都打开看了个遍,没找到错误,甚至都没找到三个右大括号“}}}”——这是经常发生的事情。

今天我才知道,你只要输入字母 e 然后回车就会跳转到错误的地方了。

latex 参考文献显示问号_关于 VS Code、WinEdt、LaTeX 和 Markdown 的一些实用 Tips

哇塞!出错的地方压根不在 .tex 文件中,而是在 .aux 文件中,这一看,确实有“}}}”,但是我怎么debug呢?

是这样的,这种情况,往往是你修正了原来的 .tex 文件中的一个低级错误(你自己一下就知道了的那种错误),但是问题是你已经带着这个低级错误编译了一次,当然没通过。等你修正了这个低级错误以后,再编译,于是就报了这个“}}}”新错误,然后你就懵逼了——我不是已经修正了吗?

解决办法很粗暴,这个时候,只需要手动删除 .aux 文件就可以了。当然,WinEdt 支持一键删除所有过程文件,是一个垃圾桶按钮。

又比如这个错误:

latex 参考文献显示问号_关于 VS Code、WinEdt、LaTeX 和 Markdown 的一些实用 Tips

说实话,我见过超多次这种在文件第一行(l.1)的错误……原来是 .aux 的第一行啊!

latex 参考文献显示问号_关于 VS Code、WinEdt、LaTeX 和 Markdown 的一些实用 Tips

关于 XeLaTeX 产生的 pdf 文件不能复制文字(也不能搜索文字)的问题

以 ZJUThesis 这个学位论文模板为例:

documentclass[oneside,AutoFakeBold=false]{ZJUthesisv2}
           

建议不要使用伪加粗字体,采用 AutoFakeBold=false 这个选项,那么最终生成的 pdf 文档就可以复制、搜索文字了。也就是说,用了伪加粗字体,pdf 文件中的文字不可复制、搜索。

XeLaTeX 宋!体!中文字加粗

并不是说一定不能加粗,如果正文字体是(默认的)宋体,那么用加粗指令 bfseries{} 以后,加粗的正文字体是黑体。也就是说,其实可以直接用:

{heiti{}我其实就是加粗的宋体}
           

代替

{songtibfseries{}变成了黑体的宋体}
           

跑题一下,关于 ZJUThesis 这个模板

上面的例子里,为什么我要加空的大括号?2016版 ZJUThesis 的作者说:

latex 参考文献显示问号_关于 VS Code、WinEdt、LaTeX 和 Markdown 的一些实用 Tips

还有还有,用到带额外信息的引用时,比如需要强调多少页,一般用 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

latex 参考文献显示问号_关于 VS Code、WinEdt、LaTeX 和 Markdown 的一些实用 Tips

我现在知道了。作为中文之“斜体”的楷书,也可以用类似的操作处理加粗的需求:

% 楷体(相当于英文的斜体)
letkaishurelax % 清除旧定义
newCJKfontfamilykaishu{KaiTi}[AutoFakeBold] % 重定义 kaishu % xelatex编译加粗楷体为什么会失败?
{kaishubfseries{}我是加粗的楷书}
           

但是,加粗了的楷书复制后是乱码!(但是不知道为什么,加粗后的仿宋竟然可以正常复制……原理不明)。

一个帮助理解的可编译的例子

是不是晕了?拿下面这个例子去感受一下(用 xelatex 编译):

documentclass
           

后记

我不敢相信我又花了整整两天的时间更新我的学位论文(从浙大 2006 年的模板转为 2016 年的模板),科研进度原地踏步。

LaTeX 有没有罪与罚我不知道,我感觉我反正是被惩罚了,被我的这颗该死的好奇心。

继续阅读