德语变音符号没问题,但 ß 显示为“SS”

德语变音符号没问题,但 ß 显示为“SS”

我正在用德语写一篇论文,这些是我的字体设置:

\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,因此您不应加载fontencinputenckpfonts包。相反,您应该加载fontspeckpfonts-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

因为输入中的 ß 是字体中的 ß。

相关内容