0%

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 生成随机的邀请码。

阅读全文 »

首先说明,这是邪道,除非你知道自己在干什么,请不要使用这篇文章提到的方法。这篇文章纯粹是一个技巧的记录,在某些时候可能会有用。

有时候我们会需要将公式字体修改为正文的 \rmfamily\upright\normalsize 的样式。虽然看起来很复杂,其实却很简单。我们只需要在导言区末尾添加以下两行代码:

1
2
\everymath\expandafter{\the\everymath\mathgroup0}
\everydisplay\expandafter{\the\everydisplay\mathgroup0}
阅读全文 »