使用 fontspec 定义不同的脚本

使用 fontspec 定义不同的脚本

我的实际问题:我想排版使用埃塞俄比亚文字(吉兹文)的提格里尼亚语文本。但文本中还包含数字(据我所知,是拉丁文字)。

因此,我使用 定义了一个新的字体系列,\newfontfamily{\ethiopicfont}[Script=Ethiopic]{Droid Sans Ethiopic}并使用 为提格里尼亚语引入了一个新环境:\newenvironment{Tigrinya}{\ethiopicfont}{}。但 Droid Sans Ethiopic 字体仅包含埃塞俄比亚文字。

如何使用不同字体/文件的不同脚本来定义字体系列。(我猜这个过程叫做修补字体?)

我的 MWE 是:

\documentclass[a4paper]{scrartcl}

\usepackage{fontspec}
\usepackage{polyglossia}
\setmainlanguage{english}
\setotherlanguage{tigrinya}

\newfontfamily{\ethiopicfont}[Script=Latin, Scale=1]{Droid Sans}
\newfontfamily{\ethiopicfont}[Script=Ethiopic, Scale=1]{Droid Sans Ethiopic}

\newenvironment{Tigrinya}{\ethiopicfont}{}

\begin{document}

\section*{Section}

\begin{Tigrinya}
13 እንሆ ኸኣ በታ መዓልቲ እቲኣ ኽልተ ኻባታቶም ካብ የሩሳሌም ስሳ እስታድዮስ ዝምርሓቓ ኤማሁስ ናብ እትብሃል ዓዲ ይኸዱ ነበሩ።
\end{Tigrinya}

\end{document}

答案1

加载不存在的语言是没用的。只需添加埃塞俄比亚字符的字体系列(我使用了 Kefa,您可以使用任何您喜欢的字体)。

\documentclass[a4paper]{scrartcl}

\usepackage{fontspec}
\usepackage{polyglossia}
\usepackage[Latin,Ethiopic]{ucharclasses}

\setmainlanguage{english}

\newfontfamily{\tigrinyafont}[Script=Ethiopic, Scale=1]{Kefa}

\newenvironment{tigrinya}
  {\tigrinyafont}
  {}

\setTransitionTo{Ethiopic}{\begin{tigrinya}}
\setTransitionFrom{Ethiopic}{\end{tigrinya}}

\begin{document}

\section*{Section}

\begin{tigrinya}
13 እንሆ ኸኣ በታ መዓልቲ እቲኣ ኽልተ ኻባታቶም ካብ የሩሳሌም ስሳ እስታድዮስ ዝምርሓቓ ኤማሁስ ናብ እትብሃል ዓዲ ይኸዱ ነበሩ።
\end{tigrinya}

Text in English with ኻባታቶም ካብ

Whatever follows

\end{document}

在此处输入图片描述

答案2

版本 2

阅读推荐/评论后哈立德·霍斯尼我更改了代码片段的核心,因此它只在需要时切换字体。如果字符是空格,则不会故意更改字体。在之前的版本中,它会包装每个字符(一般不推荐,因为它会破坏连字、字距调整对以及某些字体/语言中可能存在的其他字符关系)。

如果可以,请使用埃格尔回答这个问题(基于特克斯引擎)的帮助下字符类包裹。

如果你想用严肃和类似的方法LuaTeX, 我建议塔科·霍克沃特的回答提到这里

不过,我还是想通过在 Lua 中在字符级别操作 TeX 参数来提出一种替代上述主流解决方案的方法 ( unicode.utf8.*)。

我从这里找到并下载了提到的 Droid 系列字体地点到我的工作目录(Droid SansDroid Sans 埃塞俄比亚语、常规版本)。

Lua 代码片段检查前一个和当前字符,并决定是否需要更改字体。我根据此设置了埃塞俄比亚语范围从 1200(十六进制)到 137F(十六进制)Unicode 图表

除了 TeX 文档之外,该代码片段还将信息写入终端以方便检查,在此示例中为:

\droidsans{}0 123 abc 456 789 \droidsansethiopic{}እንሆ ኸኣ በታ መዓልቲ እቲኣ ኽልተ ኻባታቶም ካብ የሩሳሌም ስሳ እስታድዮስ ዝምርሓቓ ኤማሁስ ናብ እትብሃል ዓዲ ይኸዱ ነበሩ።

字体的更改是在组内完成的,因此我们在处理该命令后返回到拉丁现代字体系列。我们运行lualatex mal-droid.tex。我附上了代码(我abc在数字旁边添加了代码,以查看它是否能像应该的那样与字母配合使用)和结果预览。

文件mal-droid.tex

% lualatex mal-droid.tex
\documentclass[a4paper]{scrartcl}
\pagestyle{empty} % without a page number
\usepackage{polyglossia} % handling languages
\setmainlanguage{english} % setting up a main language
\usepackage{xcolor} % support for colors
\usepackage{luatextra} % loading luacode, fontspec etc.

% http://unicode.org/charts/PDF/U1200.pdf
% I downloaded fonts from https://github.com/jenskutilek/free-fonts/tree/master/Droid.
\newfontfamily{\droidsansethiopic}[Script=Ethiopic, Color=red, ExternalLocation=./]{DroidSansEthiopic-Regular.ttf} % font for Ethiopic
\newfontfamily{\droidsans}[Script=Latin, Color=green, ExternalLocation=./]{DroidSans.ttf} % font for Latin inside Ethiopic

\begin{luacode*}
function changeme()
text=tex.toks[0]
previous=nil
for i=1,unicode.utf8.len(text) do -- glyph by glyph operation
   char=unicode.utf8.sub(text,i,i) -- this glyph is processed right now
   typeit="" -- text to be typeset/displayed, initializing to be sure that string is empty
   if char>=unicode.utf8.char( tonumber("1200",16) ) and char<=unicode.utf8.char( tonumber("137F",16) ) then droid=1 else droid=0 end -- Is there a character in Ethiopic, or not?
   if char==" " then droid=previous end -- don't change a font if character is a space
   if (not previous or previous==1) and droid==0 then -- unused font or a switch, Latin
      typeit="\\droidsans{}" -- core
      end -- if, for Latin
   if (not previous or previous==0) and droid==1 then -- unused font or a switch, Ethiopic
      typeit="\\droidsansethiopic{}" -- core
      end -- if, for Ethiopic
   typeit=typeit..char -- a change in font + processed character
   io.write(typeit) -- print the code to the terminal
   tex.sprint(typeit) -- write a character to a TeX file
   previous=droid -- store an actual font family to avoid repetion 
end
end
\end{luacode*}
\def\maltig#1{\toks0{#1}% Save parameter to be load by Lua.
   \begingroup% Begin of font manipulation.
   \directlua{changeme()}% Processing string at a Lua level.
   \endgroup% End of font manipulation.
   }% End of \maltig command.

\begin{document}
\section*{Section about Tigrinya}
Text before it. \maltig{0 123 abc 456 789 እንሆ ኸኣ በታ መዓልቲ እቲኣ ኽልተ ኻባታቶም ካብ የሩሳሌም ስሳ እስታድዮስ ዝምርሓቓ ኤማሁስ ናብ እትብሃል ዓዲ ይኸዱ ነበሩ።} Text after it.
\end{document}

改进源代码示例


版本 1(旧版;每个字符都换行)

Droid 字体系列采用 Apache 许可证 [下载在我意识到这一点之前,我已经下载并解压了代码2000字体放入我的工作目录。

这是一个使用 LuaTeX 作为 TeX 引擎并对包装的文本块进行字符串操作的示例。一般来说,可以通过回调(不再需要标记外来部分)和在需要时在字体之间切换来简化这部分代码,而不是对每个字符进行分组(这将确保创建连字符和字距调整对)。

我附上了代码(我们运行lualatex mal-droid.tex)和 PDF 文件的预览。

% lualatex mal-droid.tex
\documentclass[a4paper]{scrartcl}
\pagestyle{empty}
\usepackage{fontspec}
\usepackage{xcolor}
\usepackage{luatextra}

% http://www.fonts2u.com/download/code2000.font
\newfontfamily{\ethiopicfont}[Scale=1,Color=red,ExternalLocation=./]{Code2000.TTF}
\begin{luacode*}
function changeme()
text=tex.toks[0]
for i=1,unicode.utf8.len(text) do
   char=unicode.utf8.sub(text,i,i)
   if char<="9" then tex.sprint("{\\setmainfont[Color=green]{Latin Modern Roman}{}"..char.."}") else tex.sprint(char) end
end
end
\end{luacode*}
\def\maltig#1{\toks0{#1}{\ethiopicfont\directlua{changeme()}}}

\begin{document}
\section*{Section about Tigrinya}
Text before it. \maltig{0 123 456 789 እንሆ ኸኣ በታ መዓልቲ እቲኣ ኽልተ ኻባታቶም ካብ የሩሳሌም ስሳ እስታድዮስ ዝምርሓቓ ኤማሁስ ናብ እትብሃል ዓዲ ይኸዱ ነበሩ።} Text after it.
\end{document}

一个例子

相关内容