用小写/大写对填充 lua 表。

用小写/大写对填充 lua 表。

我想为Letters=Uppercase尚未内置所需开放类型功能的字体添加该选项。

这(使用 lualatex)可以实现如下:

\documentclass{article}
\directlua
{
 fonts.handlers.otf.addfeature
  {
    name = "vircase",
    type = "multiple",
    data =
      {
          ["a"] = {"A"},
          ["ü"] = {"Ü"},
          ["ɒ"] = {"A"},       %test non existing chars (nothing happens)
          [0x0065] = {0x0045}, %test unicode-numbers (e/E)   
          ["o"] = {"X"},
          ["o"]=  {"O"},       %test multiple settings (last wins)
          ["ß"] = {"S","S"},   %special case, should be added manually
      },
  }
} 

\usepackage{fontspec}
  \setmainfont{OpenSans-Regular.ttf}%
   [
    RawFeature=+vircase,
   ]


\begin{document}
AAAA aaaa ü ß ɒ e o 

Hallo Welt!
\end{document}

在此处输入图片描述

但我自然不想把所有的配对都写下来。

那么我怎样才能尽可能少地填写表格呢?应该可以在最后手动添加一些对(对于像上面的 ß 这样的案例)。

我更喜欢使用 tex 系统中现有文件的解决方案。我考虑char-def.lua过从上下文中使用(使用require("char-def.lua")。但是,虽然它可以在 texlive 中毫无问题地加载,但它在 miktex 中不存在,而且我不确定文件是否会保持稳定。另一个想法是以某种方式使用luatex-unicode-letters.tex。但我对其他想法持开放态度。

答案1

Miktex 和 TL 都包含文件UnicodeData.txt,其中包含所有必要的信息。它包含以下形式的行:

0061;LATIN SMALL LETTER A;Ll;0;L;;;;;N;;;0041;;0041

有几个字段以分号分隔。重要的字段是第一个,它是当前字符的代码点,第四个,它是字符的类,第十五个,它包含相应大写字符的代码点。

我们可以编写简单的 Lua 库来解析文件并返回包含必要信息的表:

local unicode_data = kpse.find_file("UnicodeData.txt")

local characters = {}
for line in io.lines(unicode_data) do
  local fields = line:explode ";"
  -- we want to process only uppercase letters
  if fields[3] == "Ll" then
    local lowercase = tonumber(fields[1],16)
    -- uppercae codepoint is in field 15
    -- some uppercase letters doesn't have lowercase versions
    local uppercase = tonumber(fields[15],16)
    characters[lowercase] = uppercase
  end
end

return characters

我们测试Ll类别,即小写字母,并构建具有大写代码点的表格。请注意,一些小写字符没有对应的大写字母,但没关系,它们不会包含在表中。

它可以按以下方式使用:

\documentclass{article}
\directlua
{
  local lowercases = require "makelowercases"
  lowercases["ß"] = {"S","S"}
 fonts.handlers.otf.addfeature
  {
    name = "vircase",
    type = "multiple",
    data = lowercases
  }
} 

\usepackage{fontspec}
  \setmainfont{OpenSans-Regular.ttf}%
   [
    RawFeature=+vircase,
   ]


\begin{document}
AAAA aaaa ü ß ɒ e o 

Hallo Welt!
\end{document}

它将产生以下结果:

在此处输入图片描述

答案2

我将使用包含的unicodeLua 模块并通过循环填充大写表,如下所示:

\documentclass{article}
\directlua
{
local upper = unicode.utf8.upper
local char = unicode.utf8.char

local data = {}
for c = 0x20, 0x0500 do
    data[char(c)] = {upper(char(c))}
end

data["ß"] = {"S","S"}

fonts.handlers.otf.addfeature {
    name = "vircase",
    {
        type = "multiple",
        data = data,
    }
}
} 

\usepackage{fontspec}
\setmainfont{CMU Serif}%
   [
    RawFeature=+vircase,
   ]

\begin{document}
AAAA aaaa ü ß ɒ e o 

Hallo Welt!

Привет, Мир!
\end{document}

由于我使用的是 TexLive 2016,arg 的语法fonts.handlers.otf.addfeature有些不同,您可以调整它。我限制了循环,使其0x0500涵盖拉丁字母、希腊语和西里尔语。还添加了一些西里尔语示例(并且有效!)。

在此处输入图片描述

相关内容