ſ(长 s)和连字符

ſ(长 s)和连字符

我使用的是 UTF-8,因此如果使用正确的字体,在旧德语文本中实现不同类型的 s(s、ſ、ß)没有问题。不幸的是,连字符断开了,因为 LaTeX 不知道 ſ 必须像处理“s”一样处理。

梅威瑟:

\documentclass{article}
\usepackage[ngerman]{babel}

\begin{document}
XXX Gesellschaft Gesellschaft Gesellschaft Gesellschaft Gesellschaft Gesellschaft Gesellschaft Gesellschaft Gesellschaft

XXX Geſellſchaft Geſellſchaft Geſellſchaft Geſellſchaft Geſellſchaft Geſellſchaft Geſellſchaft Geſellſchaft Geſellſchaft

\hyphenation{Ge-ſell-ſchaft}

XXX Geſellſchaft Geſellſchaft Geſellſchaft Geſellſchaft Geſellſchaft Geſellſchaft Geſellſchaft Geſellſchaft Geſellſchaft

\end{document}

正如在行尾看到的,我必须手动添加正确的连字符。有什么办法可以解决这个问题吗?

在此处输入图片描述

答案1

对于 LuaTeX,以下是 David Carlisles 的想法的实现,用于创建回调。它的工作原理是在连字符前用标记hypenate替换每个字符,然后在连字符后恢复原始字符:ſs

\documentclass{article}
\usepackage[ngerman]{babel}
\usepackage{luacode}
\begin{luacode*}
local sattr = luatexbase.new_attribute("longsattr")
local disc = node.id'disc'
print('DISC', disc)

local function long_to_s(head, tail)
  for n in node.traverse(head) do
    if n == tail then break end
    if n.id == disc then
    print(n)
      long_to_s(n.pre)
      long_to_s(n.post)
      long_to_s(n.replace)
    end
    if n.char == 383 then
      n.char = 115
      node.set_attribute(n, sattr, 383)
    end
  end
end
local function s_to_long(head, tail)
  for n in node.traverse(head) do
    if n == tail then break end
    if n.id == disc then
      s_to_long(n.pre)
      s_to_long(n.post)
      s_to_long(n.replace)
    end
    local a = node.get_attribute(n, sattr)
    if a then
      n.char = a
      node.unset_attribute(n, sattr)
    end
  end
end
local function myhyph(head, tail)
  long_to_s(head, tail)
  lang.hyphenate(head, tail)
  s_to_long(head, tail)
end
luatexbase.add_to_callback("hyphenate",myhyph,"hyphenate with modified s")
\end{luacode*}
\begin{document}
XXX Gesellschaft Gesellschaft Gesellschaft Gesellschaft Gesellschaft Gesellschaft Gesellschaft Gesellschaft Gesellschaft

XXX Geſellſchaft Geſellſchaft Geſellſchaft Geſellſchaft Geſellſchaft Geſellſchaft Geſellſchaft Geſellſchaft Geſellſchaft
\end{document}

在此处输入图片描述

LuaTeX 还允许您在运行过程中操作连字模式,因此您还可以使用(这是 David Carlisles 选择 (b) 的自动化版本):

\documentclass{article}
\usepackage[ngerman]{babel}
\usepackage{luacode}
\begin{luacode*}
  local l = lang.new(tex.language)
  l:patterns(l:patterns():gsub('s', 'ſ'))
\end{luacode*}
\begin{document}
XXX Gesellschaft Gesellschaft Gesellschaft Gesellschaft Gesellschaft Gesellschaft Gesellschaft Gesellschaft Gesellschaft

XXX Geſellſchaft Geſellſchaft Geſellſchaft Geſellſchaft Geſellſchaft Geſellſchaft Geſellſchaft Geſellſchaft Geſellſchaft
\end{document}

在此处输入图片描述

答案2

一个简单的方法是选择支持 ſ 作为开放类型字符变体的字体,例如 EB Garamond。然后您可以在需要时选择该变体。

(重新阅读上述评论,我发现这对应于 David Carlisle 的选项 (c),您说它不合适,但这个 MWE 表明您可以使用这种方法同时获得这两种类型的 s。)

更新显示 iſt 和 ſselbes。

\documentclass{article}
\usepackage[ngerman]{babel}
\babelfont{rm}{EB Garamond}
\begin{document}
XXX Gesellschaft Gesellschaft Gesellschaft Gesellschaft Gesellschaft Gesellschaft Gesellschaft Gesellschaft Gesellschaft

\addfontfeature{CharacterVariant=1}

XXX Gesellschaft Gesellschaft Gesellschaft Gesellschaft Gesellschaft Gesellschaft Gesellschaft Gesellschaft Gesellschaft

ist selbes
\end{document}

在此处输入图片描述

相关内容