![使用 XeTeX 编译时 µ(微)和其他 Unicode 符号的不同渲染](https://linux22.com/image/429639/%E4%BD%BF%E7%94%A8%20XeTeX%20%E7%BC%96%E8%AF%91%E6%97%B6%20%C2%B5%EF%BC%88%E5%BE%AE%EF%BC%89%E5%92%8C%E5%85%B6%E4%BB%96%20Unicode%20%E7%AC%A6%E5%8F%B7%E7%9A%84%E4%B8%8D%E5%90%8C%E6%B8%B2%E6%9F%93.png)
这不是一个“如何做”的问题,而是一个“为什么”的问题。
我正在用 LaTeX 重写一个 MS Word 文档,以便编译西特克斯。我注意到有些符号没有显示,尤其是 µ(或“微”)符号,有时显示,有时不显示。以下 mcve 显示了这种行为(注意:使用 Pdflatex 编译会! Package inputenc Error: Invalid UTF-8 byte sequence.
在几行上抛出错误。)
\documentclass[11pt,a4paper]{scrarticle}
\begin{document}
\ \\
GREEK SMALL LETTER MU: μ\\
MICRO SIGN: µ\\
German Umlaut: äöü ÄÖÜ ß\\
Some greek letters: αΑ βΒ \\
mathematical symbols:
答案1
结合使用一些工具来弄清楚发生了什么。首先string-functions.com,将 Ansi 字符串分别转换为看似相同的 μ 和 µ(将输入编码设置为 ISO8859-1,将输出设置为 UTF-8)。从引用的来源复制粘贴也可以,但我想从已知不同的字符开始。粘贴这两个亩放入 Python3 脚本中可得:
>>> print (hex(ord("μ")))
0x3bc
>>> print (hex(ord("µ")))
0xb5
确认,正如 Albert 的评论所述,第一个是希腊小写字母 MU,第二个是微符号(根据 Unicode 标准大写)。
微符号的渲染也listings
成功,但希腊字母则不然。Unicode 允许字体对多个代码点使用相同的字形,因此它们确实可以是像素相同的。
下面是一个 Python 脚本,用于检查整个源中的 Unicode 字符(粘贴到多行字符串中source
,注意r'''
开始原始多行字符串并'''
结束多行字符串)。
import unicodedata
source=r'''\documentclass[11pt,a4paper]{scrarticle}
\usepackage{xcolor}
\usepackage{listings}
\lstset{
frame=trBL,
language=C++,
basicstyle=\small, % make fontsize a little smaller to better fit code
showstringspaces=false, % don't mark spaces in strings
%numbers=left, % display line numbers on the left
commentstyle=\color{teal}, % comment color
keywordstyle=\color{blue}, % keyword color
stringstyle=\color{red} % string color
}
\begin{document}
\begin{lstlisting}
public Byte SomeCurrent; //Current measured in μA
public Byte OtherCurrent; //Other current in µA
\end{lstlisting}
\end{document}'''
header=["char","codepoint","position", "name"]
print (header)
for i,char in enumerate(source):
if ord(char)>127:
line=[char, hex(ord(char)), i, unicodedata.name(char)]
print (line)
它给出的输出是:
['char', 'codepoint', 'position', 'name']
['μ', '0x3bc', 542, 'GREEK SMALL LETTER MU']
['µ', '0xb5', 590, 'MICRO SIGN']
从文件中读取源代码并给出每个unicode字符的行号和行内位置很容易,但我将其留给读者作为练习。
答案2
经过进一步的调查,我可以在lstlisting
也能重现外部的行为。这让我想到这个问题。答案是,我使用的字体缺少这些unicode字符,这也显示在扩展日志中 - 但在编译时不会显示为警告,例如:
Missing character: There is no μ in font [lmroman10-regular]:mapping=tex-text;!