在 LuaLaTeX 中创建从西里尔字母到拉丁字母的音译映射

在 LuaLaTeX 中创建从西里尔字母到拉丁字母的音译映射

我创建了一个.map西里尔文到拉丁文的音译文件,如下所示使用 xetex 自动转写西里尔字母

我将cyrillic-to-latin.tec文件放在了文件夹中。

\documentclass{article}
\usepackage{fontspec}
\usepackage{ifluatex,ifxetex}

\setmainfont[Mapping=cyrillic-to-latin]{texgyreadventor-regular.otf}

\begin{document}
\ifxetex
    This is XeTeX
\else\ifluatex
    This is LuaTeX
\fi\fi

Hello, world

Здравствуй, Мир

\end{document}

该东西在运行 XeLaTeX 时运行完美,但 LuaLaTeX 却直接忽略了映射系统。

使用 XeLaTeX 编译 在此处输入图片描述

使用 LuaLaTeX 编译 在此处输入图片描述

如何强制 LuaLaTeX 使用所需的字体映射?

注意:正如@Michal.h21 所要求的,我将我个人用于音译的 .map 文件与意大利语规则放在一起:

; TECkit mapping for TeX input conventions <-> Unicode characters

LHSName "Cyrillic-to-Latin"
RHSName "UNICODE"

pass(Unicode)

; ligatures from Knuth's original CMR fonts
U+002D U+002D           <>  U+2013  ; -- -> en dash
U+002D U+002D U+002D    <>  U+2014  ; --- -> em dash

U+0027          <>  U+2019  ; ' -> right single quote
U+0027 U+0027   <>  U+201D  ; '' -> right double quote
U+0022           >  U+201D  ; " -> right double quote

U+0060          <>  U+2018  ; ` -> left single quote
U+0060 U+0060   <>  U+201C  ; `` -> left double quote

U+0021 U+0060   <>  U+00A1  ; !` -> inverted exclam
U+003F U+0060   <>  U+00BF  ; ?` -> inverted question

; additions supported in T1 encoding
U+002C U+002C   <>  U+201E  ; ,, -> DOUBLE LOW-9 QUOTATION MARK
U+003C U+003C   <>  U+00AB  ; << -> LEFT POINTING GUILLEMET
U+003E U+003E   <>  U+00BB  ; >> -> RIGHT POINTING GUILLEMET


U+0410 <> U+0041  ; A
U+0411 <> U+0042  ; B
U+0412 <> U+0056  ; V
U+0413 <> U+0047  ; G
U+0414 <> U+0044  ; D
U+0415 <> U+0045  ; E
U+0416 <> U+017D  ; Ž
U+0417 <> U+005A  ; Z
U+0418 <> U+0049  ; I
U+041A <> U+004B  ; K
U+041B <> U+004C  ; L
U+041C <> U+004D  ; M
U+041D <> U+004E  ; N
U+041E <> U+004F  ; O
U+041F <> U+0050  ; P
U+0420 <> U+0052  ; R
U+0421 <> U+0053  ; S
U+0422 <> U+0054  ; T
U+0423 <> U+0055  ; U
U+0424 <> U+0046  ; F
U+0426 <> U+0043  ; C
U+0427 <> U+010C  ; Č
U+0428 <> U+0160  ; Š
U+042D <> U+0116  ; Ė
U+042E <> U+004A U+0075  ; Ju
U+042F <> U+004A U+0061  ; Ja
U+0401 <> U+00CB  ; Ë
U+0430 <> U+0061  ; a
U+0431 <> U+0062  ; b
U+0432 <> U+0076  ; v
U+0433 <> U+0067  ; g
U+0434 <> U+0064  ; d
U+0435 <> U+0065  ; e
U+0436 <> U+017E  ; ž
U+0437 <> U+007A  ; z
U+0438 <> U+0069  ; i
U+0439 <> U+006A  ; j
U+043A <> U+006B  ; k
U+043B <> U+006C  ; l
U+043C <> U+006D  ; m
U+043D <> U+006E  ; n
U+043E <> U+006F  ; o
U+043F <> U+0070  ; p
U+0440 <> U+0072  ; r
U+0441 <> U+0073  ; s
U+0442 <> U+0074  ; t
U+0443 <> U+0075  ; u
U+0444 <> U+0066  ; f
U+0446 <> U+0063  ; c
U+0447 <> U+010D  ; č
U+0448 <> U+0161  ; š
U+044D <> U+0117  ; ė
U+044E <> U+006A U+0075  ; ju
U+044F <> U+006A U+0061  ; ja
U+0451 <> U+00EB  ; ë
U+0456 <> U+0069  ; i
U+0406 <> U+0049  ; I
U+0454 <> U+006A U+0065  ; je
U+0468 <> U+004A U+0065  ; Je
U+0425 <> U+0043 U+0068 ; Ch
U+0445 <> U+0063 U+0068 ; ch
U+0418 <> U+0049  ; I
U+0429 <> U+0160  U+010D ; Šč
U+042A <> U+0027  ; '
U+042B <> U+0059  ; Y
U+042C <> U+2019  ; '
U+0449 <> U+0161  U+010D ; šč
U+044A <> U+2019  ; '
U+044B <> U+0079  ; y
U+044C <> U+2019  ; ' 

答案1

编辑 10/2017

这是 Lua 脚本的新版本。它生成 Luaotfload 的代码,而不是不再支持的字体功能文件。它还有一个新选项--back,可以创建反方向的映射,例如在我们的示例中从西里尔字母到拉丁字母。

该脚本名为maptolua.lua

kpse.set_program_name "luatex"
local lapp = require "lapp-mk4"
local uchar = unicode.utf8.char
local args

local function load_glyph_list(filename)
  local t = {}
  for line in io.lines(filename) do
    local glyph, code = line:match("([^;]+);([A-Fa-f0-9]+)")
    if glyph then
      code = string.upper(code)
      -- print(code, glyph)
      t[code] = glyph
    end
  end
  return t
end

local function load_map_file(mapfile, glyph_list)
  local glyph_list = glyph_list or {}
  local parse_codepoints = function(s)
    local t = {}
    local s = string.upper(s)
    for x in s:gmatch("U%+([0-9A-F]+)") do
      t[#t+1] = glyph_list[x] or "undefined"
    end
    return t
  end
  local get_chars = function(s)
    local t = {}
    for x in s:gmatch("U%+([0-9A-F]+)") do
      t[#t+1] = string.format('"%s"', uchar(tonumber(x, 16)))
    end
    return t
  end
  local t = {liga = {}, gsub = {}, ccmp= {}}
  for line in io.lines(mapfile) do
    -- search for 
    local lookup, replace = line:match("([^%<]+)<>([^%;]+)")
    if args.back then -- we can create reverse mapping from the map file
      lookup, replace = replace, lookup
    end
    -- process lines which define mappings
    if lookup then
      -- convert strings with unicode codepoints to tables with glyph names
      -- local lookups = parse_codepoints(lookup)
      local lookups = get_chars(lookup)
      -- local replaces = parse_codepoints(replace)
      local replaces = get_chars(replace)
      -- print(table.concat(lookups, ";"), "+", table.concat(replaces, ";"))
      local newt = {lookups = lookups, replaces = replaces}
      if #lookups > 1 then
        table.insert(t.liga, newt)
      elseif #replaces > 1 then
        table.insert(t.ccmp, newt)
      else 
        table.insert(t.gsub, newt)
      end
    end
  end
  return t
end

local function print_fea_file(script, language,  maptable)
  local function print_feature(feature, name, typ, key, value) 
    -- the field must be only one character long
    print("fonts.handlers.otf.addfeature {")
    print(string.format("\tname='%s',", name))
    print(string.format("\ttype='%s',", typ))
    print("\tdata={")
    for _, entry in ipairs(maptable[feature]) do
      local field = entry[key][1]
      local result = entry[value]
      if #result > 1 then
        local t = {}
        for _, s in ipairs(result) do
          t[#t+1] = string.format("%s", s)
        end
        result = "{" .. table.concat(t, ",") .. "}"
      else
        result = string.format("%s", result[1])
      end
      print(string.format("[%s] = %s,", field, result))
    end
    print("}}")
  end
  -- print(string.format("languagesystem %s %s;", script, language))
  print("\\directlua{")
  print_feature("liga", "liga", "ligature", "replaces", "lookups")
  print_feature("ccmp", "ccmp", "multiple", "lookups", "replaces")
  print_feature("gsub", "gsub", "substitution","lookups", "replaces")
  print "}"
end

args = lapp [[
maptolua.lua Convert teckit map files to Luaotfload feature tables
Usage:
texlua maptolua.lua [options] <map file> [glyph list file]
-l,--language  (default dflt) language name in OpenType format
-s,--script  (default LATN) script name in OpenType format
-b,--back  create back mapping
<map_file> (string) file to be converted
[glyph_list] (defualt glyphlist.txt) file in Adobe glyh list format with unicode to glyph names mapping
]]

-- if not arg[1] then
--   print "Usage:"
--   print "texlua maptofea.lua mapfile [glyph list] > featurefile.fea"
--   os.exit()
-- end

-- map files use Unicode values, we need to transform them to the glyph names
-- table with glyph list can be either passes as second argument, or one shipped in TL is used
local glyphfile = args.glyph_list or kpse.find_file("glyphlist.txt", "map")

local glyphtable = load_glyph_list(glyphfile)

-- load the map file, search for unicode values and replace them with glyph names
local maptable = load_map_file(args.map_file, glyphtable)

print_fea_file(args.script, args.language, maptable)

它可以像这样执行:

texlua maptolua.lua  cyr.map  > newfeat.tex

生成以下 TeX 文件:

\directlua{
fonts.handlers.otf.addfeature {
    name='liga',
    type='ligature',
    data={
["–"] = {"-","-"},
["—"] = {"-","-","-"},
["”"] = {"'","'"},
["“"] = {"`","`"},
["¡"] = {"!","`"},
["¿"] = {"?","`"},
["„"] = {",",","},
["«"] = {"<","<"},
["»"] = {">",">"},
}}
fonts.handlers.otf.addfeature {
    name='ccmp',
    type='multiple',
    data={
["Ю"] = {"J","u"},
["Я"] = {"J","a"},
["ю"] = {"j","u"},
["я"] = {"j","a"},
["є"] = {"j","e"},
["Ѩ"] = {"J","e"},
["Щ"] = {"Š","Č"},
["щ"] = {"š","č"},
}}
fonts.handlers.otf.addfeature {
    name='gsub',
    type='substitution',
    data={
["'"] = "’",
["`"] = "‘",
["А"] = "A",
["Б"] = "B",
["В"] = "V",
["Г"] = "G",
["Д"] = "D",
["Е"] = "E",
["Ж"] = "Ž",
["З"] = "Z",
["И"] = "J",
["К"] = "K",
["Л"] = "L",
["М"] = "M",
["Н"] = "N",
["О"] = "O",
["П"] = "P",
["Р"] = "R",
["С"] = "S",
["Т"] = "T",
["У"] = "U",
["Ф"] = "F",
["Ц"] = "C",
["Ч"] = "Č",
["Ш"] = "Š",
["Э"] = "Ė",
["Ё"] = "Ë",
["а"] = "a",
["б"] = "b",
["в"] = "v",
["г"] = "g",
["д"] = "d",
["е"] = "e",
["ж"] = "ž",
["з"] = "z",
["и"] = "i",
["й"] = "j",
["к"] = "k",
["л"] = "l",
["м"] = "m",
["н"] = "n",
["о"] = "o",
["п"] = "p",
["р"] = "r",
["с"] = "s",
["т"] = "t",
["у"] = "u",
["ф"] = "f",
["ц"] = "c",
["ч"] = "č",
["ш"] = "š",
["э"] = "ė",
["ё"] = "ë",
["і"] = "i",
["І"] = "I",
["Х"] = "X",
["х"] = "x",
["И"] = "I",
["Ъ"] = "'",
["Ы"] = "Y",
["Ь"] = "’",
["ъ"] = "’",
["ы"] = "y",
["ь"] = "’",
}}
}

它可以按以下方式使用:

\documentclass{article}
\usepackage{fontspec}
\usepackage{ifluatex,ifxetex}
\input{newfeat.tex}
\setmainfont[RawFeature=+gsub;]{Linux Libertine O}


\begin{document}
\ifxetex
This is XeTeX
\else\ifluatex
This is LuaTeX
\fi\fi


Hello,, -- --- world я щ 
Здравствуй, Мир

\end{document}

(注意,必须RawFeature=+gsub;在字体声明中使用)

结果如下:

在此处输入图片描述


@edit 添加了对用多个新字形替换一个字形的支持

LuaTeX 不支持映射文件,但另一方面它支持OpenType 功能文件。两者之间存在很大差异,第一个在字符级别上使用 unicode 值,另一个使用字形名称。

我已经创建了将地图文件转换为.fea文件的简单脚本maptofea.lua

kpse.set_program_name "luatex"
local lapp = require "lapp-mk4"

local function load_glyph_list(filename)
  local t = {}
  for line in io.lines(filename) do
    local glyph, code = line:match("([^;]+);([A-Fa-f0-9]+)")
    if glyph then
      code = string.upper(code)
      -- print(code, glyph)
      t[code] = glyph
    end
  end
  return t
end

local function load_map_file(mapfile, glyph_list)
  local glyph_list = glyph_list or {}
  local parse_codepoints = function(s)
    local t = {}
    local s = string.upper(s)
    for x in s:gmatch("U%+([0-9A-F]+)") do
      t[#t+1] = glyph_list[x] or "undefined"
    end
    return t
  end
  local t = {liga = {}, gsub = {}, ccmp= {}}
  for line in io.lines(mapfile) do
    -- search for 
    local lookup, replace = line:match("([^%<]+)<>([^%;]+)")
    -- process lines which define mappings
    if lookup then
      -- convert strings with unicode codepoints to tables with glyph names
      local lookups = parse_codepoints(lookup)
      local replaces = parse_codepoints(replace)
      -- print(table.concat(lookups, ";"), "+", table.concat(replaces, ";"))
      local newt = {lookups = lookups, replaces = replaces}
      if #lookups > 1 then
        table.insert(t.liga, newt)
      elseif #replaces > 1 then
        table.insert(t.ccmp, newt)
      else 
        table.insert(t.gsub, newt)
      end
    end
  end
  return t
end

local function print_fea_file(script, language,  maptable)
  local function print_feature(feature) 
    print("feature " .. feature .. " {")
    for _, entry in ipairs(maptable[feature]) do
      print(string.format("  sub %s by %s;", table.concat(entry.lookups, " "), table.concat(entry.replaces, " ")))
    end
    print("} ".. feature .. ";")
  end
  print(string.format("languagesystem %s %s;", script, language))
  print_feature "liga"
  print_feature "ccmp"
  print_feature "gsub"
end

local args = lapp [[
maptofea.lua Convert teckit map files to OpenType feature files
Usage:
texlua maptofea.lua [options] <map file> [glyph list file]
-l,--language  (default dflt) language name in OpenType format
-s,--script  (default LATN) script name in OpenType format
<map_file> (string) file to be converted
[glyph_list] (defualt glyphlist.txt) file in Adobe glyh list format with unicode to glyph names mapping
]]

-- if not arg[1] then
--   print "Usage:"
--   print "texlua maptofea.lua mapfile [glyph list] > featurefile.fea"
--   os.exit()
-- end

-- map files use Unicode values, we need to transform them to the glyph names
-- table with glyph list can be either passes as second argument, or one shipped in TL is used
local glyphfile = arg[2] or kpse.find_file("glyphlist.txt", "map")

local glyphtable = load_glyph_list(glyphfile)

-- load the map file, search for unicode values and replace them with glyph names
local maptable = load_map_file(arg[1], glyphtable)

print_fea_file(args.script, args.language, maptable)

这是帮助信息:

maptofea.lua Convert teckit map files to OpenType feature files
Usage:
texlua maptofea.lua [options] <map file> [glyph list file]
-l,--language  (default dflt) language name in OpenType format
-s,--script  (default LATN) script name in OpenType format
<map_file> (string) file to be converted
[glyph_list] (defualt glyphlist.txt) file in Adobe glyh list format with unicode to glyph names mapping

您可以简单地使用它,而无需在地图文件上使用任何选项:

texlua maptofea.lua cyrillic-to-latin.map > cyrtolatn2.fea

转换后的文件cyrtolatn2.fea

languagesystem LATN dflt;
feature liga {
  sub hyphen hyphen by endash;
  sub hyphen hyphen hyphen by emdash;
  sub quotesingle quotesingle by quotedblright;
  sub grave grave by quotedblleft;
  sub exclam grave by exclamdown;
  sub question grave by questiondown;
  sub comma comma by quotedblbase;
  sub less less by guillemotleft;
  sub greater greater by guillemotright;
} liga;
feature ccmp {
  sub afii10048 by J u;
  sub afii10049 by J a;
  sub iucyrillic by j u;
  sub iacyrillic by j a;
  sub ecyrillic by j e;
  sub Yuslittleiotifiedcyrillic by J e;
  sub afii10043 by Scaron Ccaron;
  sub shchacyrillic by scaron ccaron;
} ccmp;
feature gsub {
  sub quotesingle by quoteright;
  sub grave by quoteleft;
  sub afii10017 by A;
  sub afii10018 by B;
  sub afii10019 by V;
  sub afii10020 by G;
  sub afii10021 by D;
  sub afii10022 by E;
  sub afii10024 by Zcaron;
  sub afii10025 by Z;
  sub afii10026 by J;
  sub afii10028 by K;
  sub afii10029 by L;
  sub afii10030 by M;
  sub afii10031 by N;
  sub afii10032 by O;
  sub afii10033 by P;
  sub afii10034 by R;
  sub afii10035 by S;
  sub afii10036 by T;
  sub afii10037 by U;
  sub afii10038 by F;
  sub afii10040 by C;
  sub afii10041 by Ccaron;
  sub afii10042 by Scaron;
  sub afii10047 by Edotaccent;
  sub afii10023 by Edieresis;
  sub afii10065 by a;
  sub becyrillic by b;
  sub vecyrillic by v;
  sub gecyrillic by g;
  sub decyrillic by d;
  sub iecyrillic by e;
  sub zhecyrillic by zcaron;
  sub zecyrillic by z;
  sub iicyrillic by i;
  sub iishortcyrillic by j;
  sub kacyrillic by k;
  sub elcyrillic by l;
  sub emcyrillic by m;
  sub encyrillic by n;
  sub ocyrillic by o;
  sub pecyrillic by p;
  sub ercyrillic by r;
  sub escyrillic by s;
  sub tecyrillic by t;
  sub ucyrillic by u;
  sub efcyrillic by f;
  sub tsecyrillic by c;
  sub checyrillic by ccaron;
  sub shacyrillic by scaron;
  sub ereversedcyrillic by edotaccent;
  sub iocyrillic by edieresis;
  sub icyrillic by i;
  sub afii10055 by I;
  sub afii10039 by X;
  sub khacyrillic by x;
  sub afii10026 by I;
  sub afii10044 by quotesingle;
  sub afii10045 by Y;
  sub afii10046 by quoteright;
  sub hardsigncyrillic by quoteright;
  sub yericyrillic by y;
  sub softsigncyrillic by quoteright;
} gsub;

您必须请求功能文件以及gsub文档中的 opentype 功能:

\documentclass{article}
\usepackage{fontspec}
\usepackage{ifluatex,ifxetex}

\setmainfont[Mapping=cyrillic-to-latin,FeatureFile=cyrtolatn2.fea, RawFeature={+gsub;+liga;}]{Linux Libertine O}

\begin{document}
\ifxetex
    This is XeTeX
\else\ifluatex
    This is LuaTeX
\fi\fi

Hello,, -- ---  world я щ 
Здравствуй, Мир

\end{document}

结果如下: ]

升级至2016 TeXLive 发行版。

新版本不支持包含 .fea 文件,因此此方法已过时。可以使用\directlua以下方法解决此问题:

\directlua{
    fonts.handlers.otf.addfeature {
        name = "myliga",
         type = "ligature",
         data = {
             ['Aacute'] = { "А", 0x0301},
             ['Eacute'] = { "Е", 0x0301},
             ['Iacute'] = { "И", 0x0301},
             ['iacute'] = { "и", 0x0301},
             ['Oacute'] = { "О", 0x0301},
             ['Uacute'] = { "У", 0x0301},
             ['Yacute'] = { "Ы", 0x0301},         
             ['Egrave'] = { "Э", 0x0301},         
             ['egrave'] = { "э", 0x0301},         
        },
    }
}

\directlua{
    fonts.handlers.otf.addfeature {
        name = "mycomp",
         type = "multiple",
         data = {
             afii10039 = { "C", "h" },
             afii10087 = { "c", "h" },
             afii10048 = { "J", "u" },
             afii10049 = { "J", "a" },
             afii10096 = { "j", "u" },
             afii10097 = { "j", "a" },
             Yuslittleiotifiedcyrillic = { "J", "e" },
             afii10043 = { "Scaron", "ccaron" },
             afii10091 = { "scaron", "ccaron" },
        },
    }
}

\directlua{
    fonts.handlers.otf.addfeature {
        name = "mysub",
            type = "substitution",
            data = {
                ["quotesingle"] = "quoteright",
                ["grave"] = "quoteleft",
                ["afii10017"] = "A",
                ["afii10018"] = "B",
                ["afii10019"] = "V",
                ["afii10020"] = "G",
                ["afii10021"] = "D",
                ["afii10022"] = "E",
                ["afii10024"] = "Zcaron",
                ["afii10025"] = "Z",
                ["afii10026"] = "I",
                ["afii10027"] = "J",
                ["afii10028"] = "K",
                ["afii10029"] = "L",
                ["afii10030"] = "M",
                ["afii10031"] = "N",
                ["afii10032"] = "O",
                ["afii10033"] = "P",
                ["afii10034"] = "R",
                ["afii10035"] = "S",
                ["afii10036"] = "T",
                ["afii10037"] = "U",
                ["afii10038"] = "F",
                ["afii10040"] = "C",
                ["afii10041"] = "Ccaron",
                ["afii10042"] = "Scaron",
                ["afii10047"] = "Edotaccent",
                ["afii10023"] = "Edieresis",
                ["afii10065"] = "a",
                ["afii10066"] = "b",
                ["afii10067"] = "v",
                ["afii10068"] = "g",
                ["afii10069"] = "d",
                ["afii10070"] = "e",
                ["afii10072"] = "zcaron",
                ["afii10073"] = "z",
                ["afii10074"] = "i",
                ["afii10075"] = "j",
                ["afii10076"] = "k",
                ["afii10077"] = "l",
                ["afii10078"] = "m",
                ["afii10079"] = "n",
                ["afii10080"] = "o",
                ["afii10081"] = "p",
                ["afii10082"] = "r",
                ["afii10083"] = "s",
                ["afii10084"] = "t",
                ["afii10085"] = "u",
                ["afii10086"] = "f",
                ["afii10088"] = "c",
                ["afii10089"] = "ccaron",
                ["afii10090"] = "scaron",
                ["afii10095"] = "edotaccent",
                ["afii10071"] = "edieresis",
                ["afii10103"] = "i",
                ["afii10055"] = "I",
                ["afii10026"] = "I",
                ["afii10044"] = "quoteright",
                ["afii10045"] = "Y",
                ["afii10046"] = "quoteright",
                ["afii10092"] = "quoteright",
                ["afii10093"] = "y",
                ["afii10094"] = "quoteright",
        },
    }
}

必须以通常的方式调用上面定义的功能。

\setmainfont{Linux Libertine O}[RawFeature={+mysub;+mycomp;+myliga}]

答案2

在此处输入图片描述

这是使用 luatex 排版的:

\documentclass{article}
\usepackage{fontspec}
\usepackage{ifluatex,ifxetex}

\setmainfont[Mapping=cyrillic-to-latin]{texgyreadventor-regular.otf}

\begin{document}
\ifxetex
    This is XeTeX
\else\ifluatex
    This is LuaTeX

\directlua{require("cyrtr")}

\fi

Hello, world

Здравствуй, Мир

\end{document}

使用链接问题中映射文件生成的 cyrtr.lua。(我弄乱了一些引号字符,你需要将它们添加回来)

function cyrtr (s)
return
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
string.gsub(
s,
'А','A'),
'Б','B'),
'В','V'),
'Г','G'),
'Д','D'),
'Е','E'),
'Ж','Ž'),
'З','Z'),
'И','I'),
'К','K'),
'Л','L'),
'М','M'),
'Н','N'),
'О','O'),
'П','P'),
'Р','R'),
'С','S'),
'Т','T'),
'У','U'),
'Ф','F'),
'Ц','C'),
'Ч','Č'),
'Ш','Š'),
'Э','Ė'),
'Ю','Ju'),
'Я','Ja'),
'Ё','Ë'),
'а','a'),
'б','b'),
'в','v'),
'г','g'),
'д','d'),
'е','e'),
'ж','ž'),
'з','z'),
'и','i'),
'й','j'),
'к','k'),
'л','l'),
'м','m'),
'н','n'),
'о','o'),
'п','p'),
'р','r'),
'с','s'),
'т','t'),
'у','u'),
'ф','f'),
'ц','c'),
'ч','č'),
'ш','š'),
'э','ė'),
'ю','ju'),
'я','ja'),
'ё','ë'),
'і','i'),
'І','I'),
'є','je'),
'Ѩ','Je'),
'Х','X'),
'х','x'),
'И','I'),
'Щ','Šč'),
'Ы','Y'),
'щ','šč'),
'ы','y')
end


luatexbase.add_to_callback(
"process_input_buffer",
cyrtr,
"cyrillic transliteration")

无论如何,这个音译是可能的,不同的语言有不同的音译系统。

答案3

稍微扩展一下答案空间:

解释3,有一个稍微更便携的(非 lua)解决方案:\tl_replace_all:Nnn可用的函数形式为:

\tl_replace_all:Nnn \l_mycy_tl { д } { d }

它既快速又易于使用。这是 expl3 正则表达式功能过于强大的一个示例。

西里尔字母 Unicode 代码块的概念证明:六种使用西里尔字母的语言(科米语、印古什语、乌德穆尔特语等)的样本,按照 GOST 7.79-2000、ISO9:1995 标准进行音译。

示例翻译

至少在维基百科中,拉丁字母(例如 Æ、I、X)与西里尔字母(Ӕ、Ӏ、Х)已经明显混淆。代码点完全不同。

查找代码基本上是从电子表格中复制粘贴的,电子表格使用concatenate函数来构建代码串,因此易于维护。连接所需的 to-from 表也是复制粘贴的(来自 Wikipedia,因此需要校对)。

更新

对于替换函数,组合变音符号算作字符串中的字符,因此应先替换最长的字符串,然后再替换较短的字符串,以获得正确的音译。MWE 中的代码已更新。

平均能量损失

\documentclass{article}
\usepackage{xcolor}
\usepackage{fontspec}
\setmainfont{Noto Serif}[Colour=red]
\newfontfamily\fcyrtrans{Noto Serif}%[Colour=blue]
\newfontfamily\forig{Noto Serif}


\ExplSyntaxOn


%-----   transliteration
\tl_new:N \l_mycy_tl
\NewDocumentCommand { \cyrtrans } { m } {
\tl_set:Nn \l_mycy_tl { #1 }
 \docyrtrans 
 \tl_use:N \l_mycy_tl
}

\NewDocumentEnvironment{cyrtranse}{ +b } 
{
\tl_set:Nn \l_mycy_tl { #1 }
\docyrtrans 
{ \tl_use:N \l_mycy_tl }
}
{ }


\newcommand\docyrtrans{%
\tl_replace_all:Nnn \l_mycy_tl { о̄̈ } { { \fcyrtrans ọ̈}}
\tl_replace_all:Nnn \l_mycy_tl { Ӓ̄ } { { \fcyrtrans Ạ̈}}
\tl_replace_all:Nnn \l_mycy_tl { А̄ } { { \fcyrtrans Ā}}
\tl_replace_all:Nnn \l_mycy_tl { А́ } { { \fcyrtrans Á}}
\tl_replace_all:Nnn \l_mycy_tl { А̊ } { { \fcyrtrans Å}}
\tl_replace_all:Nnn \l_mycy_tl { И́ } { { \fcyrtrans Í}}
\tl_replace_all:Nnn \l_mycy_tl { І̄ } { { \fcyrtrans Ǐ}}
\tl_replace_all:Nnn \l_mycy_tl { Ј̵ } { { \fcyrtrans J́}}
\tl_replace_all:Nnn \l_mycy_tl { К̨ } { { \fcyrtrans K̀}}
\tl_replace_all:Nnn \l_mycy_tl { Н̄ } { { \fcyrtrans N̄}}
\tl_replace_all:Nnn \l_mycy_tl { Ӧ̄ } { { \fcyrtrans Ọ̈}}
\tl_replace_all:Nnn \l_mycy_tl { О́ } { { \fcyrtrans Ó}}
\tl_replace_all:Nnn \l_mycy_tl { О̄ } { { \fcyrtrans Ō}}
\tl_replace_all:Nnn \l_mycy_tl { С̀ } { { \fcyrtrans S̀}}
\tl_replace_all:Nnn \l_mycy_tl { Т̌ } { { \fcyrtrans Ť}}
\tl_replace_all:Nnn \l_mycy_tl { У́ } { { \fcyrtrans Ú}}
\tl_replace_all:Nnn \l_mycy_tl { Ӱ̄ } { { \fcyrtrans Ụ̈}}
\tl_replace_all:Nnn \l_mycy_tl { Ч̀ } { { \fcyrtrans C̀}}
\tl_replace_all:Nnn \l_mycy_tl { Ы̄ } { { \fcyrtrans Ȳ}}
\tl_replace_all:Nnn \l_mycy_tl { Ю̄ } { { \fcyrtrans Û̄}}
\tl_replace_all:Nnn \l_mycy_tl { ӓ̄ } { { \fcyrtrans ạ̈}}
\tl_replace_all:Nnn \l_mycy_tl { а̄ } { { \fcyrtrans ā}}
\tl_replace_all:Nnn \l_mycy_tl { а́ } { { \fcyrtrans á}}
\tl_replace_all:Nnn \l_mycy_tl { а̊ } { { \fcyrtrans å}}
\tl_replace_all:Nnn \l_mycy_tl { и́ } { { \fcyrtrans í}}
\tl_replace_all:Nnn \l_mycy_tl { і̄ } { { \fcyrtrans ǐ}}
\tl_replace_all:Nnn \l_mycy_tl { ј̵ } { { \fcyrtrans j́}}
\tl_replace_all:Nnn \l_mycy_tl { к̨ } { { \fcyrtrans k̀}}
\tl_replace_all:Nnn \l_mycy_tl { н̄ } { { \fcyrtrans n̄}}
\tl_replace_all:Nnn \l_mycy_tl { о́ } { { \fcyrtrans ó}}
\tl_replace_all:Nnn \l_mycy_tl { о̄ } { { \fcyrtrans ō}}
\tl_replace_all:Nnn \l_mycy_tl { с̀ } { { \fcyrtrans s̀}}
\tl_replace_all:Nnn \l_mycy_tl { т̌ } { { \fcyrtrans ť}}
\tl_replace_all:Nnn \l_mycy_tl { у́ } { { \fcyrtrans ú}}
\tl_replace_all:Nnn \l_mycy_tl { ӱ̄ } { { \fcyrtrans ụ̈}}
\tl_replace_all:Nnn \l_mycy_tl { ч̀ } { { \fcyrtrans c̀}}
\tl_replace_all:Nnn \l_mycy_tl { ы̄ } { { \fcyrtrans ȳ}}
\tl_replace_all:Nnn \l_mycy_tl { ю̄ } { { \fcyrtrans û̄}}
\tl_replace_all:Nnn \l_mycy_tl { А } { { \fcyrtrans A}}
\tl_replace_all:Nnn \l_mycy_tl { Ӓ } { { \fcyrtrans Ä}}
\tl_replace_all:Nnn \l_mycy_tl { Ӑ } { { \fcyrtrans Ă}}
\tl_replace_all:Nnn \l_mycy_tl { Ӕ } { { \fcyrtrans Æ}}
\tl_replace_all:Nnn \l_mycy_tl { Б } { { \fcyrtrans B}}
\tl_replace_all:Nnn \l_mycy_tl { В } { { \fcyrtrans V}}
\tl_replace_all:Nnn \l_mycy_tl { Г } { { \fcyrtrans G}}
\tl_replace_all:Nnn \l_mycy_tl { Ѓ } { { \fcyrtrans Ǵ}}
\tl_replace_all:Nnn \l_mycy_tl { Ғ } { { \fcyrtrans Ġ}}
\tl_replace_all:Nnn \l_mycy_tl { Ҕ } { { \fcyrtrans Ğ}}
\tl_replace_all:Nnn \l_mycy_tl { Һ } { { \fcyrtrans Ḥ}}
\tl_replace_all:Nnn \l_mycy_tl { Д } { { \fcyrtrans D}}
\tl_replace_all:Nnn \l_mycy_tl { Ђ } { { \fcyrtrans Đ}}
\tl_replace_all:Nnn \l_mycy_tl { Е } { { \fcyrtrans E}}
\tl_replace_all:Nnn \l_mycy_tl { Ӗ } { { \fcyrtrans Ĕ}}
\tl_replace_all:Nnn \l_mycy_tl { Ё } { { \fcyrtrans Ë}}
\tl_replace_all:Nnn \l_mycy_tl { Є } { { \fcyrtrans Ê}}
\tl_replace_all:Nnn \l_mycy_tl { Ж } { { \fcyrtrans Ž}}
\tl_replace_all:Nnn \l_mycy_tl { Җ } { { \fcyrtrans Ž̦}}
\tl_replace_all:Nnn \l_mycy_tl { Ӝ } { { \fcyrtrans Z̄}}
\tl_replace_all:Nnn \l_mycy_tl { Ӂ } { { \fcyrtrans Z̆}}
\tl_replace_all:Nnn \l_mycy_tl { З } { { \fcyrtrans Z}}
\tl_replace_all:Nnn \l_mycy_tl { Ӟ } { { \fcyrtrans Z̈}}
\tl_replace_all:Nnn \l_mycy_tl { Ӡ } { { \fcyrtrans Ź}}
\tl_replace_all:Nnn \l_mycy_tl { Ѕ } { { \fcyrtrans Ẑ}}
\tl_replace_all:Nnn \l_mycy_tl { И } { { \fcyrtrans I}}
\tl_replace_all:Nnn \l_mycy_tl { Ӣ } { { \fcyrtrans Ī}}
\tl_replace_all:Nnn \l_mycy_tl { Ӥ } { { \fcyrtrans Î}}
\tl_replace_all:Nnn \l_mycy_tl { Й } { { \fcyrtrans J}}
\tl_replace_all:Nnn \l_mycy_tl { І } { { \fcyrtrans Ì}}
\tl_replace_all:Nnn \l_mycy_tl { Ї } { { \fcyrtrans Ï}}
\tl_replace_all:Nnn \l_mycy_tl { Ј } { { \fcyrtrans J̌}}
\tl_replace_all:Nnn \l_mycy_tl { К } { { \fcyrtrans K}}
\tl_replace_all:Nnn \l_mycy_tl { Ќ } { { \fcyrtrans Ḱ}}
\tl_replace_all:Nnn \l_mycy_tl { Ӄ } { { \fcyrtrans Ḳ}}
\tl_replace_all:Nnn \l_mycy_tl { Ҝ } { { \fcyrtrans K̂}}
\tl_replace_all:Nnn \l_mycy_tl { Ҡ } { { \fcyrtrans Ǩ}}
\tl_replace_all:Nnn \l_mycy_tl { Ҟ } { { \fcyrtrans K̄}}
\tl_replace_all:Nnn \l_mycy_tl { Қ } { { \fcyrtrans K̦}}
\tl_replace_all:Nnn \l_mycy_tl { Ԛ } { { \fcyrtrans Q}}
\tl_replace_all:Nnn \l_mycy_tl { Л } { { \fcyrtrans L}}
\tl_replace_all:Nnn \l_mycy_tl { Љ } { { \fcyrtrans L̂}}
\tl_replace_all:Nnn \l_mycy_tl { Ԡ } { { \fcyrtrans L̦}}
\tl_replace_all:Nnn \l_mycy_tl { М } { { \fcyrtrans M}}
\tl_replace_all:Nnn \l_mycy_tl { Н } { { \fcyrtrans N}}
\tl_replace_all:Nnn \l_mycy_tl { Њ } { { \fcyrtrans N̂}}
\tl_replace_all:Nnn \l_mycy_tl { Ң } { { \fcyrtrans N̦}}
\tl_replace_all:Nnn \l_mycy_tl { Ӊ } { { \fcyrtrans Ṇ}}
\tl_replace_all:Nnn \l_mycy_tl { Ҥ } { { \fcyrtrans Ṅ}}
\tl_replace_all:Nnn \l_mycy_tl { Ԋ } { { \fcyrtrans Ǹ}}
\tl_replace_all:Nnn \l_mycy_tl { Ԣ } { { \fcyrtrans Ń}}
\tl_replace_all:Nnn \l_mycy_tl { Ӈ } { { \fcyrtrans Ň}}
\tl_replace_all:Nnn \l_mycy_tl { О } { { \fcyrtrans O}}
\tl_replace_all:Nnn \l_mycy_tl { Ӧ } { { \fcyrtrans Ö}}
\tl_replace_all:Nnn \l_mycy_tl { Ө } { { \fcyrtrans Ô}}
\tl_replace_all:Nnn \l_mycy_tl { Ӫ } { { \fcyrtrans Ő}}
\tl_replace_all:Nnn \l_mycy_tl { Ҩ } { { \fcyrtrans Ò}}
\tl_replace_all:Nnn \l_mycy_tl { Œ } { { \fcyrtrans Œ}}
\tl_replace_all:Nnn \l_mycy_tl { П } { { \fcyrtrans P}}
\tl_replace_all:Nnn \l_mycy_tl { Ҧ } { { \fcyrtrans Ṕ}}
\tl_replace_all:Nnn \l_mycy_tl { Ԥ } { { \fcyrtrans P̀}}
\tl_replace_all:Nnn \l_mycy_tl { Р } { { \fcyrtrans R}}
\tl_replace_all:Nnn \l_mycy_tl { С } { { \fcyrtrans S}}
\tl_replace_all:Nnn \l_mycy_tl { Ҫ } { { \fcyrtrans Ș}}
\tl_replace_all:Nnn \l_mycy_tl { Т } { { \fcyrtrans T}}
\tl_replace_all:Nnn \l_mycy_tl { Ћ } { { \fcyrtrans Ć}}
\tl_replace_all:Nnn \l_mycy_tl { Ԏ } { { \fcyrtrans T̀}}
\tl_replace_all:Nnn \l_mycy_tl { Ҭ } { { \fcyrtrans Ț}}
\tl_replace_all:Nnn \l_mycy_tl { У } { { \fcyrtrans U}}
\tl_replace_all:Nnn \l_mycy_tl { Ӱ } { { \fcyrtrans Ü}}
\tl_replace_all:Nnn \l_mycy_tl { Ӯ } { { \fcyrtrans Ū}}
\tl_replace_all:Nnn \l_mycy_tl { Ў } { { \fcyrtrans Ŭ}}
\tl_replace_all:Nnn \l_mycy_tl { Ӳ } { { \fcyrtrans Ű}}
\tl_replace_all:Nnn \l_mycy_tl { Ү } { { \fcyrtrans Ù}}
\tl_replace_all:Nnn \l_mycy_tl { Ұ } { { \fcyrtrans U̇}}
\tl_replace_all:Nnn \l_mycy_tl { Ԝ } { { \fcyrtrans W}}
\tl_replace_all:Nnn \l_mycy_tl { Ф } { { \fcyrtrans F}}
\tl_replace_all:Nnn \l_mycy_tl { Х } { { \fcyrtrans H}}
\tl_replace_all:Nnn \l_mycy_tl { Ҳ } { { \fcyrtrans H̦}}
\tl_replace_all:Nnn \l_mycy_tl { Ц } { { \fcyrtrans C}}
\tl_replace_all:Nnn \l_mycy_tl { Ҵ } { { \fcyrtrans C̄}}
\tl_replace_all:Nnn \l_mycy_tl { Џ } { { \fcyrtrans D̂}}
\tl_replace_all:Nnn \l_mycy_tl { Ч } { { \fcyrtrans Č}}
\tl_replace_all:Nnn \l_mycy_tl { Ҷ } { { \fcyrtrans C̦}}
\tl_replace_all:Nnn \l_mycy_tl { Ӌ } { { \fcyrtrans C̣}}
\tl_replace_all:Nnn \l_mycy_tl { Ӵ } { { \fcyrtrans C̈}}
\tl_replace_all:Nnn \l_mycy_tl { Ҹ } { { \fcyrtrans Ĉ}}
\tl_replace_all:Nnn \l_mycy_tl { Ҽ } { { \fcyrtrans C̆}}
\tl_replace_all:Nnn \l_mycy_tl { Ҿ } { { \fcyrtrans C̨̆}}
\tl_replace_all:Nnn \l_mycy_tl { Ш } { { \fcyrtrans Š}}
\tl_replace_all:Nnn \l_mycy_tl { Щ } { { \fcyrtrans Ŝ}}
\tl_replace_all:Nnn \l_mycy_tl { Ъ } { { \fcyrtrans ʺ}}
\tl_replace_all:Nnn \l_mycy_tl { Ы } { { \fcyrtrans Y}}
\tl_replace_all:Nnn \l_mycy_tl { Ӹ } { { \fcyrtrans Ÿ}}
\tl_replace_all:Nnn \l_mycy_tl { Ь } { { \fcyrtrans ʹ}}
\tl_replace_all:Nnn \l_mycy_tl { Э } { { \fcyrtrans È}}
\tl_replace_all:Nnn \l_mycy_tl { Ә } { { \fcyrtrans A̋}}
\tl_replace_all:Nnn \l_mycy_tl { Ӛ } { { \fcyrtrans À}}
\tl_replace_all:Nnn \l_mycy_tl { Ю } { { \fcyrtrans Û}}
\tl_replace_all:Nnn \l_mycy_tl { Я } { { \fcyrtrans Â}}
\tl_replace_all:Nnn \l_mycy_tl { Ґ } { { \fcyrtrans G̀}}
\tl_replace_all:Nnn \l_mycy_tl { Ѣ } { { \fcyrtrans Ě}}
\tl_replace_all:Nnn \l_mycy_tl { Ѫ } { { \fcyrtrans Ǎ}}
\tl_replace_all:Nnn \l_mycy_tl { Ѳ } { { \fcyrtrans F̀}}
\tl_replace_all:Nnn \l_mycy_tl { Ѵ } { { \fcyrtrans Ỳ}}
\tl_replace_all:Nnn \l_mycy_tl { Ӏ } { { \fcyrtrans ‡}}
\tl_replace_all:Nnn \l_mycy_tl { ʼ } { { \fcyrtrans ʼ}}
\tl_replace_all:Nnn \l_mycy_tl { ˮ } { { \fcyrtrans ˮ}}
\tl_replace_all:Nnn \l_mycy_tl { а } { { \fcyrtrans a}}
\tl_replace_all:Nnn \l_mycy_tl { ӓ } { { \fcyrtrans ä}}
\tl_replace_all:Nnn \l_mycy_tl { ӑ } { { \fcyrtrans ă}}
\tl_replace_all:Nnn \l_mycy_tl { ӕ } { { \fcyrtrans æ}}
\tl_replace_all:Nnn \l_mycy_tl { б } { { \fcyrtrans b}}
\tl_replace_all:Nnn \l_mycy_tl { в } { { \fcyrtrans v}}
\tl_replace_all:Nnn \l_mycy_tl { г } { { \fcyrtrans g}}
\tl_replace_all:Nnn \l_mycy_tl { ѓ } { { \fcyrtrans ǵ}}
\tl_replace_all:Nnn \l_mycy_tl { ғ } { { \fcyrtrans ġ}}
\tl_replace_all:Nnn \l_mycy_tl { ҕ } { { \fcyrtrans ğ}}
\tl_replace_all:Nnn \l_mycy_tl { һ } { { \fcyrtrans ḥ}}
\tl_replace_all:Nnn \l_mycy_tl { д } { { \fcyrtrans d}}
\tl_replace_all:Nnn \l_mycy_tl { ђ } { { \fcyrtrans đ}}
\tl_replace_all:Nnn \l_mycy_tl { е } { { \fcyrtrans e}}
\tl_replace_all:Nnn \l_mycy_tl { ӗ } { { \fcyrtrans ĕ}}
\tl_replace_all:Nnn \l_mycy_tl { ё } { { \fcyrtrans ë}}
\tl_replace_all:Nnn \l_mycy_tl { є } { { \fcyrtrans ê}}
\tl_replace_all:Nnn \l_mycy_tl { ж } { { \fcyrtrans ž}}
\tl_replace_all:Nnn \l_mycy_tl { җ } { { \fcyrtrans ž̦}}
\tl_replace_all:Nnn \l_mycy_tl { ӝ } { { \fcyrtrans z̄}}
\tl_replace_all:Nnn \l_mycy_tl { ӂ } { { \fcyrtrans z̆}}
\tl_replace_all:Nnn \l_mycy_tl { з } { { \fcyrtrans z}}
\tl_replace_all:Nnn \l_mycy_tl { ӟ } { { \fcyrtrans z̈}}
\tl_replace_all:Nnn \l_mycy_tl { ӡ } { { \fcyrtrans ź}}
\tl_replace_all:Nnn \l_mycy_tl { ѕ } { { \fcyrtrans ẑ}}
\tl_replace_all:Nnn \l_mycy_tl { и } { { \fcyrtrans i}}
\tl_replace_all:Nnn \l_mycy_tl { ӣ } { { \fcyrtrans ī}}
\tl_replace_all:Nnn \l_mycy_tl { ӥ } { { \fcyrtrans î}}
\tl_replace_all:Nnn \l_mycy_tl { й } { { \fcyrtrans j}}
\tl_replace_all:Nnn \l_mycy_tl { і } { { \fcyrtrans ì}}
\tl_replace_all:Nnn \l_mycy_tl { ї } { { \fcyrtrans ï}}
\tl_replace_all:Nnn \l_mycy_tl { ј } { { \fcyrtrans ǰ}}
\tl_replace_all:Nnn \l_mycy_tl { к } { { \fcyrtrans k}}
\tl_replace_all:Nnn \l_mycy_tl { ќ } { { \fcyrtrans ḱ}}
\tl_replace_all:Nnn \l_mycy_tl { ӄ } { { \fcyrtrans ḳ}}
\tl_replace_all:Nnn \l_mycy_tl { ҝ } { { \fcyrtrans k̂}}
\tl_replace_all:Nnn \l_mycy_tl { ҡ } { { \fcyrtrans ǩ}}
\tl_replace_all:Nnn \l_mycy_tl { ҟ } { { \fcyrtrans k̄}}
\tl_replace_all:Nnn \l_mycy_tl { қ } { { \fcyrtrans k̦}}
\tl_replace_all:Nnn \l_mycy_tl { ԛ } { { \fcyrtrans q}}
\tl_replace_all:Nnn \l_mycy_tl { л } { { \fcyrtrans l}}
\tl_replace_all:Nnn \l_mycy_tl { љ } { { \fcyrtrans l̂}}
\tl_replace_all:Nnn \l_mycy_tl { ԡ } { { \fcyrtrans l̦}}
\tl_replace_all:Nnn \l_mycy_tl { м } { { \fcyrtrans m}}
\tl_replace_all:Nnn \l_mycy_tl { н } { { \fcyrtrans n}}
\tl_replace_all:Nnn \l_mycy_tl { њ } { { \fcyrtrans n̂}}
\tl_replace_all:Nnn \l_mycy_tl { ң } { { \fcyrtrans n̦}}
\tl_replace_all:Nnn \l_mycy_tl { ӊ } { { \fcyrtrans ṇ}}
\tl_replace_all:Nnn \l_mycy_tl { ҥ } { { \fcyrtrans ṅ}}
\tl_replace_all:Nnn \l_mycy_tl { ԋ } { { \fcyrtrans ǹ}}
\tl_replace_all:Nnn \l_mycy_tl { ԣ } { { \fcyrtrans ń}}
\tl_replace_all:Nnn \l_mycy_tl { ӈ } { { \fcyrtrans ň}}
\tl_replace_all:Nnn \l_mycy_tl { о } { { \fcyrtrans o}}
\tl_replace_all:Nnn \l_mycy_tl { ӧ } { { \fcyrtrans ö}}
\tl_replace_all:Nnn \l_mycy_tl { ө } { { \fcyrtrans ô}}
\tl_replace_all:Nnn \l_mycy_tl { ӫ } { { \fcyrtrans ő}}
\tl_replace_all:Nnn \l_mycy_tl { ҩ } { { \fcyrtrans ò}}
\tl_replace_all:Nnn \l_mycy_tl { œ } { { \fcyrtrans œ}}
\tl_replace_all:Nnn \l_mycy_tl { п } { { \fcyrtrans p}}
\tl_replace_all:Nnn \l_mycy_tl { ҧ } { { \fcyrtrans ṕ}}
\tl_replace_all:Nnn \l_mycy_tl { ԥ } { { \fcyrtrans p̀}}
\tl_replace_all:Nnn \l_mycy_tl { р } { { \fcyrtrans r}}
\tl_replace_all:Nnn \l_mycy_tl { с } { { \fcyrtrans s}}
\tl_replace_all:Nnn \l_mycy_tl { ҫ } { { \fcyrtrans ș}}
\tl_replace_all:Nnn \l_mycy_tl { т } { { \fcyrtrans t}}
\tl_replace_all:Nnn \l_mycy_tl { ћ } { { \fcyrtrans ć}}
\tl_replace_all:Nnn \l_mycy_tl { ԏ } { { \fcyrtrans t̀}}
\tl_replace_all:Nnn \l_mycy_tl { ҭ } { { \fcyrtrans ț}}
\tl_replace_all:Nnn \l_mycy_tl { у } { { \fcyrtrans u}}
\tl_replace_all:Nnn \l_mycy_tl { ӱ } { { \fcyrtrans ü}}
\tl_replace_all:Nnn \l_mycy_tl { ӯ } { { \fcyrtrans ū}}
\tl_replace_all:Nnn \l_mycy_tl { ў } { { \fcyrtrans ŭ}}
\tl_replace_all:Nnn \l_mycy_tl { ӳ } { { \fcyrtrans ű}}
\tl_replace_all:Nnn \l_mycy_tl { ү } { { \fcyrtrans ù}}
\tl_replace_all:Nnn \l_mycy_tl { ұ } { { \fcyrtrans u̇}}
\tl_replace_all:Nnn \l_mycy_tl { ԝ } { { \fcyrtrans w}}
\tl_replace_all:Nnn \l_mycy_tl { ф } { { \fcyrtrans f}}
\tl_replace_all:Nnn \l_mycy_tl { х } { { \fcyrtrans h}}
\tl_replace_all:Nnn \l_mycy_tl { ҳ } { { \fcyrtrans h̦}}
\tl_replace_all:Nnn \l_mycy_tl { ц } { { \fcyrtrans c}}
\tl_replace_all:Nnn \l_mycy_tl { ҵ } { { \fcyrtrans c̄}}
\tl_replace_all:Nnn \l_mycy_tl { џ } { { \fcyrtrans d̂}}
\tl_replace_all:Nnn \l_mycy_tl { ч } { { \fcyrtrans č}}
\tl_replace_all:Nnn \l_mycy_tl { ҷ } { { \fcyrtrans c̦}}
\tl_replace_all:Nnn \l_mycy_tl { ӌ } { { \fcyrtrans c̣}}
\tl_replace_all:Nnn \l_mycy_tl { ӵ } { { \fcyrtrans c̈}}
\tl_replace_all:Nnn \l_mycy_tl { ҹ } { { \fcyrtrans ĉ}}
\tl_replace_all:Nnn \l_mycy_tl { ҽ } { { \fcyrtrans c̆}}
\tl_replace_all:Nnn \l_mycy_tl { ҿ } { { \fcyrtrans c̨̆}}
\tl_replace_all:Nnn \l_mycy_tl { ш } { { \fcyrtrans š}}
\tl_replace_all:Nnn \l_mycy_tl { щ } { { \fcyrtrans ŝ}}
\tl_replace_all:Nnn \l_mycy_tl { ъ } { { \fcyrtrans }}
\tl_replace_all:Nnn \l_mycy_tl { ы } { { \fcyrtrans y}}
\tl_replace_all:Nnn \l_mycy_tl { ӹ } { { \fcyrtrans ÿ}}
\tl_replace_all:Nnn \l_mycy_tl { ь } { { \fcyrtrans }}
\tl_replace_all:Nnn \l_mycy_tl { э } { { \fcyrtrans è}}
\tl_replace_all:Nnn \l_mycy_tl { ә } { { \fcyrtrans a̋}}
\tl_replace_all:Nnn \l_mycy_tl { ӛ } { { \fcyrtrans à}}
\tl_replace_all:Nnn \l_mycy_tl { ю } { { \fcyrtrans û}}
\tl_replace_all:Nnn \l_mycy_tl { я } { { \fcyrtrans â}}
\tl_replace_all:Nnn \l_mycy_tl { ґ } { { \fcyrtrans g̀}}
\tl_replace_all:Nnn \l_mycy_tl { ѣ } { { \fcyrtrans ě}}
\tl_replace_all:Nnn \l_mycy_tl { ѫ } { { \fcyrtrans ǎ}}
\tl_replace_all:Nnn \l_mycy_tl { ѳ } { { \fcyrtrans f̀}}
\tl_replace_all:Nnn \l_mycy_tl { ѵ } { { \fcyrtrans ỳ}}
\tl_replace_all:Nnn \l_mycy_tl { X } { { \fcyrtrans X}}
\tl_replace_all:Nnn \l_mycy_tl { I } { { \fcyrtrans I}}
\tl_replace_all:Nnn \l_mycy_tl { Æ } { { \fcyrtrans Æ}}
\tl_replace_all:Nnn \l_mycy_tl { æ } { { \fcyrtrans æ}}
}

\ExplSyntaxOff




\begin{document}

{\forig Солнечная система -- \bfseries inline transliteration: } 
\cyrtrans{Солнечная система}

{\forig 
Implementing a GOST 7.79-2000, ISO9:1995, transliteration scheme.

Extract is from Wikipedia article on the solar system, in some Cyrillic-using languages: Russian, Ingush, Komi etc. Red is original untransliterated text.
}

\bigskip
{\forig \bfseries Environment: Russian ru русский язык }

\begin{cyrtranse}

Со́лнечная систе́ма — планетная система, включает в себя центральную звезду — Солнце — и все естественные космические объекты, вращающиеся вокруг Солнца. Она сформировалась путём гравитационного сжатия газопылевого облака примерно 4,57 млрд лет назад[2].

Общая масса Солнечной системы составляет около 1,0014 M☉. Бо́льшая часть её приходится на Солнце; оставшаяся часть практически полностью содержится в восьми отдалённых друг от друга планетах, имеющих близкие к круговым орбиты, лежащие почти в одной плоскости — плоскости эклиптики. Из-за этого наблюдается противоречащее ожидаемому распределение момента импульса между Солнцем и планетами (так называемая «проблема моментов»): всего 2 \% общего момента системы приходится на долю Солнца, масса которого в ~740 раз больше общей массы планет, а остальные 98 \% — на \textasciitilde 0,001 общей массы Солнечной системы[18]. 

\end{cyrtranse}
%-------------------------------------------------


%\bigskip
%{\forig \bfseries Environment: ccc}\par
%\begin{cyrtranse}
%\end{cyrtranse}
%%-------------------------------------------------

%\bigskip
%{\forig \bfseries Environment: ccc}\par
%\begin{cyrtranse}
%\end{cyrtranse}
%%-------------------------------------------------



\bigskip
{\forig \bfseries Environment: Tajik tg тоҷикӣ}\par
\begin{cyrtranse}
Манзумаи офтобӣ
Системаи офтобӣ

    Офтоб
    Уторид
    Зуҳра
    Замин
    Моҳ
    Миррих
    Муштарӣ
    Сатурн
    Уран
    Нептун

    Серера
    Плутон
    
    Офтоб ё Хуршед (аз оф — ҷирм ва тоб тобанда, тобоӣ), Шамс, Меҳр, Xуршед (астр. ☉) — наздиктарин ситораест, ки дар маркази манзумаи хуршедӣ воқеъ буда, аз плазмаи тафсон таркиб ёфтааст. Аломати астрономиаш Офтоб. Массаи Офтоб 1,990*1030 килограмм буда, аз массаи Замин 332958 маротиба зиёд аст ва 99,866 \% -и массаи ҷирмҳои манзумаи хуршедиро ташкил медиҳад. Масофаи байни Офтоб ва Замни дар давоми сол аз 147,1 миллион километр (январ) то 152,1 миллион километр (июл) тағйир меёбад. Қимати миёнааш 149,6 миллион километр аст, ки онро чун воҳиди астрономӣ қабул кардаанд. Зичии миёнаи моддаи Офтоб 1,41-10® килограмм/метрэ. Тезшавии қувваи вазнинӣ дар сатҳи Офтоб 273,98 м/ооп2. Ҳарорати сатди Офтоб, ки аз рӯи афканиши пурраи он мувофиқи қонуни афканишоти Стефану Болс­ман муайян карда мешавад, ба 57ТО К баробар аст.

Баъд аз ихтирои телескоп мушоҳидаи Офтоб характери илмӣ пайдо кард. Доғҳои Офтоб кашф ва даври чархзании он дар атрофи меҳвараш муайян карда шуд. Соли 1843 астрономи немис Г. Швабе даврияти хурӯҷи Офтобро ошкор кард. Соли 1814 Й. Фра­унгофер дар спектри Офтоб хатҳои тираи фурӯбурдро дарёфт. Аз соли 1836 ин ҷониб гирифти Офтобро мунтазам мушоҳида мекунанд. Дар натиҷа дар Офтоб тоҷ, хромосфера, инчунин протӯберансҳо ошкор гарди­данд. Соли 1913 астрономи америкоӣ Ҷ. Ҳенл спектри доғдои Офтобро омӯхта дар Офтоб мавҷуд будани майдони магнитиро исбот кард. Дар ибтидои солҳои 40 садаи XX радиоафканишоти Офтобро кашф карданд. Дар нимаи дуюми садаи XX инкишофи гидродинамика ва физикаи плазма боиси пешравии физикаи Офтоб шуд. Ҳоло бо ёрии мушакҳо, расадхонаҳои автоматии маҳорӣ, лабораторияҳои кайҳонии пилотдор афканишоти ултрабунафш ва рентгении Офтобро тадқиқ мекунанд.
\end{cyrtranse}
%-------------------------------------------------

\bigskip
{\forig \bfseries Environment: Komi kv Коми кыв}\par
\begin{cyrtranse}
Шонді ылдӧс
Перейти к навигации
Перейти к поиску

Шонді ылдӧс (рочӧн Солнечная система) — планетаяслӧн система, кытчӧ пырӧны медшӧр кодзув — Шонді — да сы гӧгӧр бергалысь космос объектъяс. Сійӧ артмис кӧнкӧ 4,57 миллиард во сайын бус да ру сора кымӧрлӧн гравитационнӧй коллапс отсӧгӧн.

Шонді.

Планет: Меркурий, Венера, Му, Марс, Юпитер, Сатурн, Уран, Нептун.

Карлик планета: Плутон, Церера, Эрида, Макемаке, Хаумеа.

Тӧлысь. 
\end{cyrtranse}
%-------------------------------------------------

\bigskip
{\forig \bfseries Environment: Ossetian os Ирон æвзаг}\par
\begin{cyrtranse}
Хуры системæ
Сæрибар энциклопеди Википедийы æрмæг.
Перейти к навигации
Перейти к поиску
Хуры системæйы планетæтæ

Хуры системæ[1] у планетæты системæ галактикæ Æрфæныфæды. 

Æрфæныфæд
Сæрибар энциклопеди Википедийы æрмæг.
Перейти к навигации
Перейти к поиску
Æрфæныфæд (компьютерон ныв)

Æрфæныфæд (гр. {\forig Γαλαξίας}, лат. {\forig Via Lactea}, уырыс. Млечный Путь) у дун-дунейы галактикæтæй иу. Æрфæныфæды ис Хуры системæ.

Æндæр варианттæ сты — чыс.ныхас. Саг æмæ галы фæд[1]; дыгурон диалект Дон.[2]
Ирон мифологийы
Æрфæн-æрвон — Нарты кадджытæм æрвон бæхты мыггагæй, уыд Нарты хистæр Уырызмæджы æмбисонды бæхы ном. Уый хонынц зæххон бæхты фыдæл, уымæй, дам, равзæрдысты. Ирд æхсæвы арвы астæу иу кæронæй иннæмæ цы урсбын фæтæн тæлм фæзыны, уый дæр уымæ гæсгæ ирон адæм хонынц «Æрфæны фæд». 
\end{cyrtranse}
%-------------------------------------------------

\bigskip
{\forig \bfseries Environment: Ingush inh ГӀалгӀай мотт}\par
\begin{cyrtranse}
Маьлха ков
Перейти к навигации
Перейти к поиску
Маьлха ковна дуненаш

Маьлха ков (лат: {\forig Systema solare}, эрс: Со́лнечная систе́ма, ингал: {\forig Solar system}) — дунений ража я шийна чулоацаш юкъера седкъа — Малх а — цун гоннахьа кхесташ йола шоаш хьахинна айлама объекташ а. Маьлха ков хьахиннад газ-дема хьисапе морхах гравитационни вIашкатаIар хинна 4,57 млрд шу хьалха[1]. 
\end{cyrtranse}
%-------------------------------------------------

\bigskip
{\forig \bfseries Environment: Bulgarian bg български език}\par
\begin{cyrtranse}
Слънчевата система е група астрономически обекти, включваща Слънцето и небесните тела, обикалящи около него – планети, планети-джуджета, спътници, астероиди, комети, междупланетен прах и газ. Всички те са образувани при разпадането на молекулярен облак преди около 4,6 милиарда години.

Най-масивни след Слънцето са осемте планети. Техните орбити са почти кръгови и лежат приблизително в една равнина – равнината на еклиптиката. 
\end{cyrtranse}
%-------------------------------------------------

\bigskip
{\forig \bfseries Environment: Belarusian be Беларуская мова}\par
\begin{cyrtranse}
Сонечная сістэма — зорная сістэма, якая складаецца з Сонца і яго планетнай сістэмы, і якая ўключае ў сябе ўсе натуральныя касмічныя аб'екты, якія абарочваюцца вакол Сонца: планеты і іх спадарожнікі, а таксама малыя целы — астэроіды, метэароіды, каметы, касмічны пыл.

У Сонцы сканцэнтравана пераважная частка ўсёй масы сістэмы (каля 99,866 \%), яно ўтрымлівае сваім прыцягненнем планеты і іншыя целы, якія належаць да Сонечнай сістэмы. Чатыры найбуйнейшыя аб'екты — газавыя гіганты — складаюць 99 \% астатняй масы (пры гэтым большая частка прыпадае на Юпітэр і Сатурн — каля 90 \%). 
\end{cyrtranse}
%-------------------------------------------------

\bigskip
{\forig \bfseries Environment: Karachay-Balkar krc Къарачай-Малкъар тил}\par
\begin{cyrtranse}
Кюн система
Перейти к навигации
Перейти к поиску
Кюн система (масштабы сакъланмагъанды)

Кюн низам — орта джулдузу Кюнден эмда аны тёгерегинде бурулгъан табигъат алам объектледен къуралгъан планета низамды.

Ауетлик себебли Кюн бла байламлы болгъан объектлени ауурлугъуну кёбюсю, шартха кёре энчи тургъан, хазна къалмай тёгерек чорхлары болгъан, эмда хазна къалмай джассы дискни — эклиптиканы джассылыгъыны ичинде тургъан планеталадады.

Тёрт гитчерек ич планетала: Атархан, Тандыса, Джер эмда Мырых, джер къауумну планеталары деген ат бла да белиги болгъанла, кёбюсюне силикатла бла темирден къураладыла. Тёрт тыш планетала: Юпитер, Сатурн, Уран эмда Нептун, газ гигантла деген ат бла да белгили болгъанла, иги кесегине водород бла гелийден къураладыла эмда джер къауумну планеталарындан эсе уллу эм ауурладыла.

Кюн низамда гитче затладан толуб тургъан эки бёлге барды. Мырых бла Юпитерни арасында болгъан астероидлени бели, силикатла бла темирледен къуралгъаны себели къурамына кёре джер къауумну планеталарына ушайды. Астероидлени белини эм уллу объектлери Церера, Паллада эм Юнонады. Нептунну орбитасыны артында бузлагъан суудан, аммиакдан эмда метандан къуралгъан транснептун объектле орналыбдыла, аланы эм уллулары Плутон, Седна, Хаумеа, Макемаке эмда Эридады. Бу эки бёлгеде мингле бла гитче затлагъа къошакъгъа башха тюрлю гитче затла да, сёз ючюн, къуйрукълу джулдузла, учхан джулдузла эмда алам букъу, Кюн низамны ичинде айланадыла.

Планеталаны сегизинден алтысы эмда юч шылаб планета, табигъат дженгерле бла къуршаланыбдыла. Тыш планеталаны хар бириси да букъу бла башха миндеуледен тогъайла бла къуршаланыбдыла.

Кюн низам, Къой Джол мырытны къурамына киреди. 
\end{cyrtranse}
%-------------------------------------------------

\bigskip
{\forig \bfseries Environment: Lezghian lez Лезги чӏал}\par
\begin{cyrtranse}
Ракъинин систе́ма — юкьван гъед тир Рагъ ва Ракъинилай элкъвезвай вири тӀебиатдин космосдин объектар кьазвай планетдин система я. Рагъ галаз гравитациядалди алакъа авай объектрин массадин чӀехи пай муьжуьд нисби тир хелветда гьахьнавай ва саки элкъвей цӀарцӀин орбитаяр авай планетрин къене ава; и планетаяр саки кьулу дискдин сергьятра — эклиптикадин кьулувиле ава:

Кьуд мадни гъвечӀи къенепатан планетаяр: Меркурий, Венера, Ччилни Марс (ибуруз гьакӀни Ччилин кӀеретӀдин планетаярни лугьуда) асул гьисабдалди силикатрикайни металликай ибарат жезва. Кьуд къецепатан планетаяр: Юпитер, Сатурн, Уран ва Нептун (ибуруз гьакӀни газдин гигантарни лугьуда) асул гьисабдалди гьидрогендикайни гьелийдикай ибарат жезва ва Ччилин кӀеретӀдин планетайрилай массив я.

Ракъинин системада гъвечӀи телойрив ацӀурнавай кьве област ава. Марсни Юпитердин арада авай Астероидрин чIул квай затӀариз килигна Ччилин кӀеретӀдин планетаяр галаз сад я, вучиз лагьайтӀа, силикатрикайни металликай ибарат я. Астероидрин чӀулдин виридалайни чӀехи объектар Церера, Паллада ва Веста я. Нептундин орбиталай анихъ муркӀади кьунвай цикай, аммиакдикайни метандикай ибарат тир транснептундин объектар ава, ва и объектрикай виридалайни чӀехи Плутон, Седна, Хаумеа, Макемаке ва Эрида я. И кьве областда агъзурралди гъвечӀи телойриз алава яз, инал гъвечӀи телойрин жуьреба-жуьре популяцияр ава — астероидар, планетрин квазиспутникарни троянар, ччилин мукьва авай астероидар, кентаврар, дамоклоидар, ва гьакӀни Ракъинин системада элячӀна юзазвай кометаяр, метеороидарни космосдин руг. 
\end{cyrtranse}
%-------------------------------------------------

\bigskip
{\forig \bfseries Environment: Ukrainian uk Українська мова}\par
\begin{cyrtranse}
Со́нячна систе́ма — планетна система, що включає в себе центральну зорю — Сонце, і всі природні космічні об'єкти (планети, астероїди, комети, потоки сонячного вітру тощо), які об'єднуються гравітаційною взаємодією[6]. Сонячна система є частиною значно більшого комплексу, який складається із зірок і міжзоряної речовини — галактики Чумацький Шлях[7].

Сонце складає ≈99,85 \% маси Сонячної системи; газові планети-гіганти (Юпітер, Сатурн, Уран і Нептун) складають 99 \% залишкової маси[8]. Як і в інших зір, у надрах Сонця ефективно відбуваються термоядерні реакції з виділенням енергії[9]. Планети за фізичними характеристиками поділяють на дві групи. Ближче до Сонця розташовані планети земної групи: Меркурій, Венера, Земля, Марс; далі від Сонця розташувались планети-гіганти: Юпітер, Сатурн, Уран, Нептун[10]. Планети земної групи порівняно невеликі, їхня густина ≈5 г/см³; вони складаються переважно з важких хімічних елементів; мають гаряче металеве ядро, оточене мантією із силікатних порід, і верхній шар — кору[11]. Планети-гіганти не мають твердої поверхні, бо за хімічним складом (99 \% гідрогену і гелію) і густиною (≈1 г/см³) вони нагадують зорі, а їхня велика маса спричиняє нагрівання ядер до температури понад +10 000 °С[12].

Окрім Сонця й планет, до складу Сонячної системи входять також карликові планети, супутники планет, астероїди, комети, метеорна речовина[13]. 
\end{cyrtranse}
%-------------------------------------------------

\bigskip
{\forig \bfseries Environment: Udmurt udm удмурт кыл}\par
\begin{cyrtranse}
Шунды система — Шундылэсь но со котыртӥ ас спутникъёсынызы бергась 8 бадӟым планетаослэсь, дасо сюрсъёсын пичи планетаослэсь (астероидъёслэсь), быжо кизилиослэсь но метеоръёслэсь кылдэм инмысь система. Со кылдэмын 4,57 млрд пала аръёс талэсь азьло, газ-тузон пилемез гравитациен шымыртыса.

Шунды системалэн ваньмыз массаез луэ ог 1,0014 M☉. Солэн бадӟымез люкетэз Шундылы усе.

Шунды система пыре Лудӟазегсюрес галактикае. 
\end{cyrtranse}
%-------------------------------------------------

%%

Transliteration test:

\begin{multicols}{8}
\testcyrtrans
\end{multicols}

\end{document}

相关内容