我正在用德语写一篇论文,这些是我的字体设置:
\usepackage[utf8]{inputenc} % Required for inputting international characters
\usepackage[T1]{fontenc} % Use 8-bit encoding
\usepackage{zi4} % Pretty font for Source Code
\usepackage{kpfonts} % Use the Adobe Utopia font for the document
\usepackage{tgadventor} % Font for the title page
\renewcommand*\ttdefault{lmtt}
\renewcommand*\familydefault{\rmdefault}
所有的 ä、ö、ü 都显示正常,但ß
不正常。我的 TeX 源代码中的短语是“...eine größere API ...”,但在 PDF 中它看起来像这样:
我在用着西特克斯版本 3.14159265-2.6-0.999991(TeX 直播2019/Debian)(预加载格式=xelatex),已启用\write18。
====更新======
仅回答@wipet 和@Mico 的问题:
基本上我对 LaTeX 环境设置不太了解。很多年前我使用蚀在 Windows 上编辑和构建我的论文。当时使用的是 MikTex,这就是为什么pdfTeX开始发挥作用。
现在我正在使用Visual Studio 代码+ Latex 研讨会Linux Mint构建文件框。该“LaTeX 研讨会”的手册说,它最适合TeX 直播,所以我使用了 TeX Live。但我不知道 pdfTeX 和 TeX Live 是两个不同的东西,而且它们不兼容。所以你看到了有趣的设置组合。
来吧,教授们、同学们,为什么我们不使用 Markdown 写论文……?
啊,说到“palatino clone”,我觉得“tgpagella”字体更符合这个名声?我在我的 Diplomarbeit 上用过 tgpagella,我真的很喜欢它。但现在我想我不像以前那么敏锐了,现在我更喜欢 kpfonts 的圆润和飘逸感……
答案1
由于您使用的是 XeLaTeX,因此您不应加载fontenc
、inputenc
和kpfonts
包。相反,您应该加载fontspec
和kpfonts-otf
包。
以下代码根据是否正在使用 pdfLaTeX、XeLaTeX 或 LuaLaTeX 来选择要加载的包。(如果正在使用 XeLaTeX 或 LuaLaTeX,还要注意匹配衬线字体、无衬线字体和等宽字体的 x 高度。)采取这种预防措施后,ß
在这三种情况下,变音符号和字符的排版均正确。
哦,我不会\renewcommand*\ttdefault{lmtt}
在 pdfLaTeX 下运行,因为它会使加载zi4
包无效。
以下截图是在 XeLaTeX 下执行以下代码得到的:
\documentclass{article} % or some other suitable document class
\usepackage{iftex}
\ifpdftex
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{kpfonts} % Palatino clone text (serif) and math font
\usepackage{zi4} % monospaced font (Consolas/Inconsolata)
\usepackage{tgadventor} % sans-serif font (clone of ITC Avantgarde Gothic)
\else
\usepackage{fontspec}
\usepackage{kpfonts-otf}
\setmonofont{Consolas}[Scale=MatchLowercase] % or some other suitable font
\ifxetex
\setsansfont{texgyreadventor}[%
% Set the path as needed for your OS and TeX distribution:
Path =/usr/local/texlive/2022/texmf-dist/fonts/opentype/public/tex-gyre/,
Scale=MatchLowercase,
Extension = .otf,
UprightFont = *-regular,
BoldFont = *-bold,
ItalicFont = *-italic,
BoldItalicFont= *-bolditalic]
\else
\setsansfont{TexGyre Adventor}[Scale=MatchLowercase]
\fi
\fi
%\renewcommand*\ttdefault{lmtt} % why??
%\renewcommand*\familydefault{\rmdefault} % serves no discernible purpose
\begin{document}
das größere Übel
\sffamily
das größere Übel
\ttfamily
das größere Übel
\end{document}
答案2
问题在于,Unicode 的前 256 个位置(大致与 iso-latin1 编码相同)与 90 年代使用的 TeX 8 位编码不同,后者在科克会议上达成一致,并命名为 T1。T1 编码在位置 223 处包含 SS,但 Unicode 在这里声明了 ß。T1 的原因是:SS 是 ß 的大写,而 ß 本身位于 T1 中的位置 255:T1 中所有大写/小写字母位置的差异是常数:32。
有特殊的方法将 iso-latin1 输入编码中的 ß(槽 223)转换为 T1 编码中的槽 255。90 年代,大量 TeX 字体都是用 T1 编码创建的。例如在 LaTeX 中,包[latin1]{inputenc}
将 ß 设置为活动字符并将其转换为\ss
。该[T1]{fontenc}
包将\ss
宏定义为槽 255。如果您有 Unicode 输入(以 UTF-8 表示),则 ß 是双字节字符并将[utf8]{inputenc}
第一个字节设置为活动字符,然后将这两个字节转换为\ss
宏。但是当您使用 Unicode TeX 引擎(XeLaTeX 或 LuaLaTeX)时,则会[utf8]{inputenc}
忽略并显示消息:
Package inputenc Warning: inputenc package ignored with utf8 based engines.
因此,ß 不会转换为 T1 编码\ss
,也无法转换为 T1 编码。这是问题的核心。
但是现在,我们有了 Unicode 引擎:luatex、xetex、Unicode 字体,我们不需要再考虑这个问题,因为输入中的 ß 等于字体中的 ß。
当你使用 OpTeX 而不加载 Unicode 字体时,问题非常明显:
hello: ß
\bye
结果为 hello: SS,因为 T1 编码字体已预加载到格式中。日志文件和终端报告警告:
WARNING l.2: Unicode font was not loaded.
如果您选择 Unicode 字体系列,则问题消失:
\fontfam[adventor]
hello: ß
\bye
因为输入中的 ß 是字体中的 ß。