如何强制在 LuaLaTeX 中将长 ſ 呈现为​​ s?

如何强制在 LuaLaTeX 中将长 ſ 呈现为​​ s?

我正在尝试排版我女儿非常喜欢的几篇童话故事。由于它们不再受版权保护,我在这里复制了一个简短的故事。假设我有以下源文件:

\documentclass[paper=A5]{scrbook}
\usepackage{fontspec}
\usepackage[german]{babel}
\usepackage{csquotes}

\defaultfontfeatures{Ligatures=TeX}
\setmainfont{UnifrakturMaguntia}
\renewcommand\emshape{\addfontfeature{LetterSpace=20.0,Ligatures=Required,Ligatures=NoCommon}}
\begin{document}

\section*{Der ſüße Brei}

Es war einmal ein armes, frommes Mädchen, das lebte mit ſeiner Mutter
allein, und ſie hatten nichts mehr zu eſſen. Da ging das Kind hinaus
in den Wald, und begegnete ihm da eine alte Frau, die wußte ſeinen
Jammer ſchon und ſchenkte ihm ein Töpfchen, zu dem ſollt es ſagen:
\enquote{Töpfchen, koche}, ſo kochte es guten, ſüßen Hirſenbrei, und
wenn es ſagte: \enquote{Töpfchen, ſteh}, ſo hörte es wieder auf zu
kochen. Das Mädchen brachte den Topf ſeiner Mutter heim, und nun waren
ſie ihrer Armut und ihres Hungers ledig und aßen ſüßen Brei, ſooft
ſie wollten. Auf eine Zeit war das Mädchen ausgegangen, da ſprach die
Mutter \enquote{Töpfchen, koche}, da kocht es, und ſie ißt ſich ſatt;
nun will ſie, daß das Töpfchen wieder aufhören ſoll, aber ſie weiß das
Wort nicht. Alſo kocht es fort, und der Brei ſteigt über den Rand
hinaus und kocht immerzu, die Küche und das ganze Haus voll, und das
zweite Haus und dann die Straße, als wollts die ganze Welt ſatt machen,
und iſt die größte Not, und kein Mensch weiß ſich da zu helfen.
Endlich, wie nur noch ein einziges Haus übrig iſt, da kommt das Kind
heim und ſpricht nur: \enquote{Töpfchen, ſteh}, da ſteht es und hört
auf zu kochen; und wer wieder in die Stadt wollte, der mußte  ſich
durcheſſen.
\end{document}

...目前呈现为:

细线,黑体字

我如何强制使用现代字体的版本将长 ſ 渲染为当代标准 s?上面的标题渲染已经证明了这个问题,删除(注释掉)\setmainfont文档的这一行时,这一点非常明显:

细线字体

那么,有没有办法s在我以特定方式构建文档时强制将 ſ 的 Unicode 代码点(似乎大多数编辑器都认为它与 ſ 相同(Vim 甚至感到困惑))重新映射到字形 s?

附言:渲染版本中有一个小问题,我已将其删除,因此它与您实际得到的并不完全相同。我替换了上面的一个意外的.;by 。;

答案1

\documentclass{article}
\directlua
{
 fonts.handlers.otf.addfeature
  {
    name = "longssub",
    type = "substituation",
    data =
      {
           ["ſ"] = {"s"}
      },
  }
}

\usepackage{fontspec}

\begin{document}
 \setmainfont{Times New Roman}
 und ſie hatten nichts mehr zu eſſen.

 \setmainfont{Times New Roman}[RawFeature=+longssub]
 und ſie hatten nichts mehr zu eſſen.
\end{document}

在此处输入图片描述

答案2

有多种方法可以做到这一点,我将向您展示两种选择:

(虚拟)字体功能

就 TeX 而言,此变体不会改变底层文本,并且仅在实际塑造线条时交换字形,因此它非常强大。但缺点是,例如连字符仍将字符视为长 s:

\documentclass[paper=A5]{scrbook}
\usepackage{fontspec}
\usepackage[german]{babel}
\usepackage{csquotes}

\directlua{
  fonts.handlers.otf.addfeature{
    type = 'substitution',
    data = {
      [0x017F] = string.byte's', % replce U+017F (long s) by a normal "s"
    },
    name = 'no_long_s',
    prepend = true,
  }
}
\defaultfontfeatures{Ligatures=TeX,RawFeature=no_long_s}
\setmainfont{UnifrakturMaguntia}
\setsansfont{Latin Modern Sans}
\begin{document}

\section*{Der ſüße Brei}

Es war einmal ein armes, frommes Mädchen, das lebte mit ſeiner Mutter
allein, und ſie hatten nichts mehr zu eſſen. Da ging das Kind hinaus
in den Wald, und begegnete ihm da eine alte Frau, die wußte ſeinen
Jammer ſchon und ſchenkte ihm ein Töpfchen, zu dem ſollt es ſagen:
\enquote{Töpfchen, koche}, ſo kochte es guten, ſüßen Hirſenbrei, und
wenn es ſagte: \enquote{Töpfchen, ſteh}, ſo hörte es wieder auf zu
kochen. Das Mädchen brachte den Topf ſeiner Mutter heim, und nun waren
ſie ihrer Armut und ihres Hungers ledig und aßen ſüßen Brei, ſooft
ſie wollten. Auf eine Zeit war das Mädchen ausgegangen, da ſprach die
Mutter \enquote{Töpfchen, koche}, da kocht es, und ſie ißt ſich ſatt;
nun will ſie, daß das Töpfchen wieder aufhören ſoll, aber ſie weiß das
Wort nicht. Alſo kocht es fort, und der Brei ſteigt über den Rand
hinaus und kocht immerzu, die Küche und das ganze Haus voll, und das
zweite Haus und dann die Straße, als wollts die ganze Welt ſatt machen,
und iſt die größte Not, und kein Mensch weiß ſich da zu helfen.
Endlich, wie nur noch ein einziges Haus übrig iſt, da kommt das Kind
heim und ſpricht nur: \enquote{Töpfchen, ſteh}, da ſteht es und hört
auf zu kochen; und wer wieder in die Stadt wollte, der mußte  ſich
durcheſſen.
\end{document}

如果你想避免对连字符的影响,你可以调整代码https://tex.stackexchange.com/a/444880/80496省略该long_to_s功能。然后该角色会更早被替换。

活跃角色

传统的 TeX 替代品是活动字符:

\documentclass[paper=A5]{scrbook}
\usepackage{fontspec}
\usepackage[german]{babel}
\usepackage{csquotes}

\defaultfontfeatures{Ligatures=TeX}
\setmainfont{UnifrakturMaguntia}
\setsansfont{Latin Modern Sans}

\catcode`ſ=\active % Make ſ active
\newcommand ſ{s} % Now we can let it expand to s

\begin{document}

\section*{Der ſüße Brei}

Es war einmal ein armes, frommes Mädchen, das lebte mit ſeiner Mutter
allein, und ſie hatten nichts mehr zu eſſen. Da ging das Kind hinaus
in den Wald, und begegnete ihm da eine alte Frau, die wußte ſeinen
Jammer ſchon und ſchenkte ihm ein Töpfchen, zu dem ſollt es ſagen:
\enquote{Töpfchen, koche}, ſo kochte es guten, ſüßen Hirſenbrei, und
wenn es ſagte: \enquote{Töpfchen, ſteh}, ſo hörte es wieder auf zu
kochen. Das Mädchen brachte den Topf ſeiner Mutter heim, und nun waren
ſie ihrer Armut und ihres Hungers ledig und aßen ſüßen Brei, ſooft
ſie wollten. Auf eine Zeit war das Mädchen ausgegangen, da ſprach die
Mutter \enquote{Töpfchen, koche}, da kocht es, und ſie ißt ſich ſatt;
nun will ſie, daß das Töpfchen wieder aufhören ſoll, aber ſie weiß das
Wort nicht. Alſo kocht es fort, und der Brei ſteigt über den Rand
hinaus und kocht immerzu, die Küche und das ganze Haus voll, und das
zweite Haus und dann die Straße, als wollts die ganze Welt ſatt machen,
und iſt die größte Not, und kein Mensch weiß ſich da zu helfen.
Endlich, wie nur noch ein einziges Haus übrig iſt, da kommt das Kind
heim und ſpricht nur: \enquote{Töpfchen, ſteh}, da ſteht es und hört
auf zu kochen; und wer wieder in die Stadt wollte, der mußte  ſich
durcheſſen.
\end{document}

答案3

还有另一种方法,在这种特殊情况下我不推荐,但只是为了完整性:

\babelposthyphenation{german}{ſ}{ string = s }

我认为要走的路是 Ulrike 提出的方法。

相关内容