0%

TeX Live 是由国际 TeX 用户组(TUG)维护的 TeX 发行版,一般被认为是 TeX 发行版的「正统」,具有稳定、更新快、维护足的特点。

不过,使用 TeX Live 也有麻烦的地方——TeX Live 每年都更新,而更新版本之后旧版本就无法再从 CTAN 上自动更新宏包。这样一来,TeX Live 用户就不得不每年都重新安装一次,相当麻烦。而且,在新版测试期间更新的宏包,旧版本的用户就无法通过 tlmgr 来更新了。对于中国的用户而言,TeX Live 2014 向 TeX Live 2015 的过渡期尤为难熬,因为 CTeX 宏集的新版本 发布了。

这篇文章中,我将介绍如何在旧版本的 TeX Live 中跨版本更新宏包。

阅读全文 »

TeX 是一个相当庞大的系统,其中的程序、格式、宏包和工具繁多。新手比较容易接受直观的现象,对于 TeX 系统中繁琐抽象的概念则了解甚少。

比如说,新手听闻「LaTeX」之名,于是在编译的时候看见 pdfLaTeX 或 XeLaTeX 的时候就会犹豫:「这是不是我听说的那个 LaTeX 呢」。于是,新手可能会倾向于使用 LaTeX 去编译。编译完成之后,又面临着将 DVI 文件转化为 PDF 文件的问题,这时候新手又会面临两个选择:

  • 使用 dvips 先转换为 PS 文件,再使用 ps2pdf 转换为 PDF 文件
  • 使用 DVIPDFMx 直接转换为 PDF 文件

两种方式在新手眼中的差异直观而明显:「前一种方式多了 PS 文件这个中间步骤」。诚然,这是对的,但是却忽略了一些细节但关键的东西。这样不经意的忽略往往为后来的错误埋下了根源,比如新手经常会遇到下列一些错误:

  • 使用 WinEdt 时,弹出对话框提示「returned exit code (1)」
  • 编译完成后不报错,但是插入的图片显示异常
  • 编译完成后不报错,但是纸张尺寸或超链接异常

这些错误往往是驱动选项错误导致的,准确地说,是驱动选项和实际使用的驱动不一致导致的。而所谓驱动,就是 dvipsDVIPDFMx 这些转换工具。

阅读全文 »

CTeX 2.0 的代码主要是 李清 用 LaTeX 3 的语法书写的。之后 刘海洋 对代码做了一些调整,并构建了第一个版本的宏集手册。再之后,在测试版本发布之后,我重构了宏集手册,成为你们现在看到的这个样子。

现在,新版宏集已经上传,CTAN 地址是:http://www.ctan.org/pkg/ctex

阅读全文 »

今天有人问到下列代码报错:

1
2
3
4
5
6
7
8
\documentclass{article}
%\listfiles
\usepackage[unicode,psdextra]{hyperref}
\usepackage{unicode-math}
\setmathfont{Asana Math}
\begin{document}
\section{$\mu$}
\end{document}

提示:

1
Improper alphabetic constant

看了一下,是 hyperref 宏包的 bug。

阅读全文 »

在很多场合,我们都需要生成一系列固定长度的字符串,分发给用户,作为邀请码或者兑换码。

关于邀请码,最容易想到的特征有二:一是足够长,二是不具有规律性。这两个特征主要是为了防止用户伪造邀请码,简单来说,就是让用户「猜对」正确邀请码的可能性足够小。不过,作为邀请码来说,仅有这两个特征还不够。

邀请码并不是发放给用户就结束了,还涉及到验证的过程。用户在收到邀请码之后,将邀请码提交给系统。系统在收到提交之后,要在数据库里查询是否有匹配的记录。所以生成邀请码时除了要防止用户伪造,还要方便后期的校验。这就要求我们能够从邀请码中,经过简单的变换,提取出「主键」。

这篇文章我们讨论一下如何用 Python 生成随机的邀请码。

阅读全文 »