使用 XeTeX 编译时 µ(微)和其他 Unicode 符号的不同渲染

使用 XeTeX 编译时 µ(微)和其他 Unicode 符号的不同渲染

这不是一个“如何做”的问题,而是一个“为什么”的问题。

我正在用 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;!

相关内容