一般答案

一般答案

在下面的 MWE 中,如果它们位于行或文档的最后一个位置,或者某个没有下一个字符的地方,我想用 替换所有。我添加了两个规则来表明它适用于其他地方,但我想不出当 位于末尾时的规则ſ。规则是我猜的,但它不起作用。 sſafter = {{ 0x0000 }},这里是链式替代的参考。

编译使用lualatex mwe.tex

\documentclass[a4paper]{article}
\usepackage{fontspec}

\directlua
{
    fonts.handlers.otf.addfeature {
        name = "chainrounds",
        type = "chainsubstitution",
        lookups = {
            {
                type = "substitution",
                data = {
                    [0x017F] = "s",
                },
            },
        },
        data = {
            rules = {
                {
                    before = {{ "b", "c", "d", "f", "g", "h", "j", "k", "l", "m", "n", "p", "q", "r", "t", "v", "w", "x", "z" }},
                    current = {{ 0x017F }},
                    after = {{ 0x017F }},
                    lookups = { 1 },
                },
                {
                    current = {{ 0x017F }},
                    after = {{ "b", "d", "f", "g", "h", "j", "k", "l", "m", "n", "q", "r", "v", "w", "x", "z", 0x00DF, 0x0020 }},
                    lookups = { 1 },
                },
                {
                    current = {{ 0x017F }},
                    after = {{ 0x0000 }},
                    lookups = { 1 },
                },
            },
        },
    }

}

\begin{document}

    \setmainfont[
        RawFeature={+chainrounds},
    ]{XITS-Regular.otf}

    OK: gſſe eſg

    For the following I cannot find a rule:
    wanted is a \texttt{s} when a \texttt{ſ} is typed but the character is the last in the line/document: ſ

\end{document}

luatex 链替换

答案1

一般答案

  • 从我的测试来看,我认为使用此类规则无法找到检测第一个和最后一个字符的通用方法。在复杂情况下,需要连续添加多个字体特征,每个特征按顺序添加才能RawFeature={+featurename1,+featurename2,+featurename3}获得想要的结果,其中每个可能的类型都在问题链接的手册中定义,并且链接的特征可以是相同或不同的类型。
  • 复杂规则是检查所有预期的邻居,ſeſiſoſsſ并创建一个在更通用的规则“仅匹配ſ”之前匹配的特定规则。如果规则足够好,那么更通用的规则在实践中将是字符串的结尾/字符串的开头。
  • 因为我不确定这是否是正确答案,所以我把它打开了。

我的用例的解决方法

感谢 Jasper 的提示(首先替换所有的ſs这样我们就得到了已经正确的不可能的位置),我可以通过结合来找到解决方案

  1. substitution
  2. chainsubstitution

这个顺序可能很重要。

  1. ſs“无限制”替换“全部” 。
  2. s用“全部”替换ſ,但要有限制(尽可能)
  3. ſ现在字符串中仍然有太多内容,因此请通过检查之前、当前和之后来过滤掉更多内容。
  4. ſ通过仅检查当前和之后来过滤掉更多。

当前代码需要进行一些调整,但主要问题已经解决。

\documentclass[a4paper]{article}
\usepackage{fontspec}

\directlua{
    fonts.handlers.otf.addfeature
    {
        name = "subfirststep",
        type = "substitution",
        data =
        {
            [0x017F] = "s",
        },
    }

    fonts.handlers.otf.addfeature {
        name = "chainrounds",
        type = "chainsubstitution",
        lookups = {
            {
                type = "substitution",
                data = {
                    [0x017F] = "s",
                },
            },
            {
                type = "substitution",
                data = {
                    ["s"] = 0x017F,
                },
            },
        },
        data = {
            rules = {
                {
                    current = {{ "s" }},
                    after = {{ "a", "c", "e", "i", "o", "p", "t", "u", "y", 0x00E4, 0x00F6, 0x00FC }},
                    lookups = { 2 },
                },
                {
                    before = {{ "b", "c", "d", "f", "g", "h", "j", "k", "l", "m", "n", "p", "q", "r", "t", "v", "w", "x", "z" }},
                    current = {{ 0x017F }},
                    after = {{ 0x017F }},
                    lookups = { 1 },
                },
                {
                    current = {{ 0x017F }},
                    after = {{ "b", "d", "f", "g", "h", "j", "k", "l", "m", "n", "q", "r", "v", "w", "x", "z", 0x00DF, 0x0020 }},
                    lookups = { 1 },
                },

            },
        },
    }

}

\begin{document}

    \setmainfont[
        RawFeature={+subfirststep,+chainrounds},
    ]{XITS-Regular.otf}

    OK: gſſe eſg

    ſa

    ſ ſ

\end{document}

被取代

相关内容