ucharclasses和希腊语

ucharclasses和希腊语

ucharclasses和希腊语

我发现该包ucharclasses无法正确识别所有 Unicode 希腊语。

例如如果我使用

\usepackage{fontspec} \usepackage[Greek]{ucharclasses} \setTransitionsForGreek{\fontspec{Palatino Linotype}}{\fontfamily{lmodern}\selectfont}

然后在文档中输入

Πέτρος ἀπόστολος Ἰησοῦ Χριστοῦ ἐκλεκτοῖς παρεπιδήμοις διασπορᾶς Πόντου, Γαλατίας, Καππαδοκίας, Ἀσίας καὶ Βιθυνίας

输出文本为

Πέτρος ἀ Ἰῦ Χριστοῦ ἐῖ παρεπιδήμοις διασπορᾶ Πόντου, Γαλατίας, καππαδοκίας, Ἀ καὶ Βιθυνίας

即缺少一些字符。

更奇怪的是,从文档中我发现Greek实际上调用了CopticGreekAndCopticGreekExtended,但是当我单独调用它们时,会呈现更多的字符(但仍然缺少一些)。

我尝试不使用这些ucharclasses而是直接在这些文本上使用\fontspec{Palatino Linotype},结果效果很好。

知道为什么吗?谢谢!

编辑1

谢谢。我使用了字体系列,并且还做了一个测试来说明我的意思:

\usepackage{lmodern} \usepackage{fontspec} \usepackage[Greek]{ucharclasses} \newfontfamily\mylatin{Palatino Linotype} \newfontfamily\mygreek{Palatino Linotype} \setTransitionsForGreek{@EnterGreek@ \mygreek}{\mylatin @ExitGreek@}

输出将是这样的:

@EnterGreek@Πέτρος@ExitGreek@@EnterGreek@ἀ@ExitGreek@πόστολος@ExitGreek@ @EnterGreek@ Ἰ@ExitGreek@ησο@EnterGreek@ ῦ@ExitGreek@ @EnterGreek@ Χριστο@EnterGreek@ ῦ@ExitGreek@ @EnterGreek@ ἐ@ExitGreek@κλεκτο@EnterGreek@ ῖ@ExitGreek@ς@ExitGreek@ @EnterGreek@ παρεπιδήμοις@ExitGreek@ @EnterGreek@ διασπορ@EnterGreek@ ᾶ@ExitGreek@ς@ExitGreek@ @EnterGreek@ Πόντου, @EnterGreek@ Γαλατίας, @EnterGreek@ Καππαδοκίας, @En- terGreek@ Ἀ@ExitGreek@σίας@ExitGreek@ @EnterGreek@ κα@EnterGreek@ ὶ@ExitGreek@ @EnterGreek@ Βιθυνίας@ExitGreek@

比较输入:

Πέτρος ἀπόστολος Ἰησοῦ Χριστοῦ ἐκλεκτοῖς παρεπιδήμοις διασπορᾶς Πόντου, Γαλατίας, Καππαδοκίας, Ἀσίας καὶ Βιθυνίας

以第二个单词ἀπόστολος为例,它之后“退出希腊语”并被视为πόστολος拉丁语。

所以我实际上认为这是一个错误ucharclasses

编辑2

我不确定这是否与 的限制有关,而不是错误ucharclasses。来自文档:

但是,请注意,这只“适用于”Unicode 块。如果您处理的是印刷重叠的语言,例如将英语和越南语合并在一个文档中,如果您想要一种字体用于英语,另一种字体用于越南语,事情就会变得复杂得多。这两种语言都使用拉丁语块,因此从本质上讲,不可能根据单词中的字符属于哪个 Unicode 块来判断其目标语言。

但是它没有提到任何有关希腊语的内容。有什么想法吗?

编辑3

MWE 喜欢这个吗?

\documentclass[a4paper]{article} \usepackage{fontspec} \usepackage[Greek]{ucharclasses} \newfontfamily\mygreek{Palatino Linotype} \setTransitionsForGreek{@Begin@\mygreek}{\fontfamily{lmodern}\selectfont @End@} \begin{document} Πέτρος ἀπόστολος Ἰησοῦ Χριστοῦ ἐκλεκτοῖς παρεπιδήμοις διασπορᾶς Πόντου, Γαλατίας, Καππαδοκίας, Ἀσίας καὶ Βιθυνίας \end{document} 标签@Begin@和@End@是为了显示我正在谈论的错误。

编辑4

感谢您的解答,解决了这个问题。我没有包括,Latin而这正是所有问题的根源。

正确的代码如下:

正确的方式

\documentclass[a4paper]{article} \usepackage{fontspec} \usepackage[Latin, Greek]{ucharclasses} \newfontfamily\mygreek{CMU Serif} \setDefaultTransitions{\fontfamily{lmodern}\selectfont}{} \setTransitionsForGreek{\mygreek}{} \begin{document} \fontfamily{lmodern}\selectfont \section{Testing Greek Πέτρος ἀπόστολος Ἰησοῦ Χριστοῦ ἐκλεκτοῖς παρεπιδήμοις διασπορᾶς Πόντου, Γαλατίας, Καππαδοκίας, Ἀσίας καὶ Βιθυνίας} \begin{itemize} \item Πέτρος ἀπόστολος Ἰησοῦ Χριστοῦ ἐκλεκτοῖς παρεπιδήμοις διασπορᾶς Πόντου, Γαλατίας, Καππαδοκίας, Ἀσίας καὶ Βιθυνίας \end{itemize} testing \end{document}

section但我遇到了另一个问题:标题中的拉丁文Testing Greek不是粗体。

如果我使用旧代码,就会出现无法生成正确希腊字母的错误:

旧方法

\documentclass[a4paper]{article} \usepackage{fontspec} \usepackage[Greek]{ucharclasses} \newfontfamily\mygreek{CMU Serif} % \setDefaultTransitions{\fontfamily{lmodern}\selectfont}{} \setTransitionsForGreek{\mygreek}{\fontfamily{lmodern}\selectfont} \begin{document} \fontfamily{lmodern}\selectfont \section{Testing Greek Πέτρος ἀπόστολος Ἰησοῦ Χριστοῦ ἐκλεκτοῖς παρεπιδήμοις διασπορᾶς Πόντου, Γαλατίας, Καππαδοκίας, Ἀσίας καὶ Βιθυνίας} \begin{itemize} \item Πέτρος ἀπόστολος Ἰησοῦ Χριστοῦ ἐκλεκτοῖς παρεπιδήμοις διασπορᾶς Πόντου, Γαλατίας, Καππαδοκίας, Ἀσίας καὶ Βιθυνίας \end{itemize} testing \end{document}

section尽管缺少了一些希腊文,但标题中的拉丁文Testing Greek现在变为粗体。

控制

像这样的控制测试: \documentclass[a4paper]{article} % \usepackage{fontspec} % \usepackage[Greek]{ucharclasses} % \newfontfamily\mygreek{CMU Serif} % \setDefaultTransitions{\fontfamily{lmodern}\selectfont}{} % \setTransitionsForGreek{\mygreek}{\fontfamily{lmodern}\selectfont} \begin{document} \fontfamily{lmodern}\selectfont \section{Testing Greek }% Πέτρος ἀπόστολος Ἰησοῦ Χριστοῦ ἐκλεκτοῖς παρεπιδήμοις διασπορᾶς Πόντου, Γαλατίας, Καππαδοκίας, Ἀσίας καὶ Βιθυνίας} \begin{itemize} \item testing %Πέτρος ἀπόστολος Ἰησοῦ Χριστοῦ ἐκλεκτοῖς παρεπιδήμοις διασπορᾶς Πόντου, Γαλατίας, Καππαδοκίας, Ἀσίας καὶ Βιθυνίας \end{itemize} testing \end{document}

会给出正确的粗体section标题。

我还注意到“正确方法”中的其他问题:因为当它离开希腊 Unicode 块时,它不会变回默认字体,然后下一个项目item符号将采用希腊字体等。即项目符号将具有不同的字体。在“旧方法”中,当我使用时\setTransitionsForGreek{\mygreek}{\fontfamily{lmodern}\selectfont},由于它总是以 \fontfamily{lmodern}\selectfont 结尾,所以问题不存在。

我想说,所有这些都源于希腊语块在单词之间某处结束的谜团,我仍然认为这是一个错误(参见第 1 次编辑中的测试)。我对这个谜团的可能原因有一个猜测。参考我最初的问题:

Greek确实打了电话CopticGreekAndCoptic并且GreekExtended……

可能是休息时间位于CopticGreekAndCoptic和之间GreekExtended

编辑5

我想我找到了解决办法,尽管我不明白为什么。如果我使用“正确的方法”,而不添加Latin,标题ucharclasses中的拉丁文section将像往常一样加粗。

答案1

尝试以下代码:

\documentclass[12pt,a4paper]{article}
\usepackage[Latin,Greek]{ucharclasses}
\usepackage{fontspec}
\newfontfamily\mynormal{Palatino Linotype}
\setDefaultTransitions{\mynormal}{}
\newfontfamily\mygreek{Junicode} 
\setTransitionsForGreek{\mygreek}{}
\usepackage{lipsum}
\begin{document}
    \lipsum[1]
    Πέτρος ἀπόστολος Ἰησοῦ Χριστοῦ ἐκλεκτοῖς παρεπιδήμοις διασπορᾶς Πόντου, Γαλατίας, Καππαδοκίας, Ἀσίας καὶ Βιθυνίας
\end{document}

字符类

答案2

解决方案 1

最后我找到了答案邮政:

\documentclass{article} \usepackage{fontspec} \usepackage[Greek]{ucharclasses} \newcommand{\mylatin}{\renewcommand\rmdefault{lmr}\renewcommand\sfdefault{lmss}\renewcommand\ttdefault{lmtt}} \newfontfamily\mygreek{CMU Serif} % \setDefaultTransitions{\fontfamily{lmodern}\selectfont}{} \setTransitionsForGreek{\mygreek}{\mylatin} \begin{document} \section{Testing Greek Πέτρος ἀπόστολος Ἰησοῦ Χριστοῦ ἐκλεκτοῖς παρεπιδήμοις διασπορᾶς Πόντου, Γαλατίας, Καππαδοκίας, Ἀσίας καὶ Βιθυνίας} \begin{itemize} \item Πέτρος ἀπόστολος Ἰησοῦ Χριστοῦ ἐκλεκτοῖς παρεπιδήμοις διασπορᾶς Πόντου, Γαλατίας, Καππαδοκίας, Ἀσίας καὶ Βιθυνίας \end{itemize} testing \end{document}

我不明白为什么\renewcommand\rmdefault{lmr}\renewcommand\sfdefault{lmss}\renewcommand\ttdefault{lmtt}比效果更好\fontfamily{lmodern}\selectfont,但事实确实如此。

我发现\setDefaultTransitions如果不存在其他 Unicode 就不需要了。

我还发现,如果的第二个参数包含我需要输入的内容,则使用Latinin\usepackage[latin, Greek]{ucharclasses}也是不必要的。我更喜欢这种方法,因为它可以确保每当离开某个 unicode 块时都会立即切换回默认值,并且项目项目符号等内容将使用相同的字体。\setTransitionsForGreek\setTransitionsForLatin

现在几乎完美了,但处理中文转换时仍然有问题,我不明白为什么。也许我应该稍后再提出一个新问题。

最后,经过数十个小时的研究,我终于搞清楚了如何在 LaTeX 中处理 Unicode,但仍然发现许多谜团和怪癖,并且仍然有未解决的问题(希腊语单词内的断句、中文字体的转换等)……真是令人沮丧

解决方案 2

我发现问题的根源是我使用了newfontfamily,正如一些人所建议的那样。我深入研究了 的文档fontspec,它说\fontspec{}命令只能使用一次。现在,如果我定义newfontfamily,当我让ucharclasses选择它时,它会更改为该字体永远。为了恢复,我最初使用了 ,\fontfamily{lmodern}\selectfont但不知何故不起作用。上面的最终解决方案是使用\renewcommand\rmdefault{lmr}\renewcommand\sfdefault{lmss}\renewcommand\ttdefault{lmtt}。但是,最简单的方法是在一开始就使用fontspec,这样我就不必与“恢复默认”过程作斗争。这就是我的意思:

\documentclass{article} \usepackage{fontspec} \usepackage[Latin, Greek]{ucharclasses} \setTransitionsForGreek{\fontspec{CMU Serif}}{} \begin{document} \section{Testing Greek Πέτρος ἀπόστολος Ἰησοῦ Χριστοῦ ἐκλεκτοῖς παρεπιδήμοις διασπορᾶς Πόντου, Γαλατίας, Καππαδοκίας, Ἀσίας καὶ Βιθυνίας} \begin{itemize} \item Πέτρος ἀπόστολος Ἰησοῦ Χριστοῦ ἐκλεκτοῖς παρεπιδήμοις διασπορᾶς Πόντου, Γαλατίας, Καππαδοκίας, Ἀσίας καὶ Βιθυνίας \end{itemize} testing \end{document}

解决方案 3

所有问题都源于我想要恢复默认的lmodern,并且lmodern不支持希腊语。我比较了lmoderncm-unicode,发现差异很小。如果我不想处理上面提到的混乱,并且不介意使用与略有不同的字体lmodern,那么我可以将默认更改为cm-unicode

\documentclass{article} \usepackage{fontspec} \setmainfont{CMU Serif} \setsansfont{CMU Sans Serif} \setmonofont{CMU Typewriter Text} \begin{document} \section{Testing Greek Πέτρος ἀπόστολος Ἰησοῦ Χριστοῦ ἐκλεκτοῖς παρεπιδήμοις διασπορᾶς Πόντου, Γαλατίας, Καππαδοκίας, Ἀσίας καὶ Βιθυνίας} \begin{itemize} \item Πέτρος ἀπόστολος Ἰησοῦ Χριστοῦ ἐκλεκτοῖς παρεπιδήμοις διασπορᾶς Πόντου, Γαλατίας, Καππαδοκίας, Ἀσίας καὶ Βιθυνίας \end{itemize} testing \end{document}

答案3

“默认”是指“运行应用程序所需的最低要求”;它并不意味着“推荐设置”。您可以选择要用作文档默认的主要字体。查看 TexMF 树中的fonts。拉丁现代字体系列可用作 OpenType 字体( 下\fonts\opentype\public\lm\)。如今,Unicode 系统字体也​​可用,而不仅仅是本地 Tex 字体。例如,Noto Serif包含拉丁语、希腊语和科普特语以及西里尔语,这意味着您不必使用过渡包来管理这些脚本:

全部希腊语

(由于希腊语和科普特语文字有很大的重叠,因此将它们归为一对。)

平均能量损失

\documentclass[12pt]{article} 
\usepackage{fontspec}
\setmainfont{Noto Serif}
\newfontface\fgla{Fedorovsk Unicode TT}
\begin{document}
\section{Testing Greek} Πέτρος ἀπόστολος Ἰησοῦ Χριστοῦ ἐκλεκτοῖς παρεπιδήμοις διασπορᾶς Πόντου, Γαλατίας, Καππαδοκίας, Ἀσίας καὶ Βιθυνίας
\begin{itemize}
\item Πέτρος ἀπόστολος Ἰησοῦ Χριστοῦ ἐκλεκτοῖς παρεπιδήμοις διασπορᾶς Πόντου, Γαλατίας, Καππαδοκίας, Ἀσίας καὶ Βιθυνίας
\item Петр, Апостол Иисуса Христа, пришельцам, рассеянным в Понте, Галатии, Каппадокии, Асии и Вифинии, избранным,

from:
1-е послание Петра 1 глава – Библия: https://bible.by/syn/46/1/
\end{itemize}

A Glagolitic font in the Tex distribution:

{\fgla \huge Петр, Апостол Иисуса Христа, пришельцам,}


\end{document}

问题这里描述了恢复fontspec默认设置(包括拉丁现代;它曾经是 CM)的各种方法,以及如何在需要时切换字体编码。

相关内容