我想为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
我将使用包含的unicode
Lua 模块并通过循环填充大写表,如下所示:
\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
涵盖拉丁字母、希腊语和西里尔语。还添加了一些西里尔语示例(并且有效!)。