我使用的是 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}