![ucharclasses和希腊语](https://linux22.com/image/306726/ucharclasses%E5%92%8C%E5%B8%8C%E8%85%8A%E8%AF%AD.png)
ucharclasses
和希腊语
我发现该包ucharclasses
无法正确识别所有 Unicode 希腊语。
例如如果我使用
\usepackage{fontspec} \usepackage[Greek]{ucharclasses} \setTransitionsForGreek{\fontspec{Palatino Linotype}}{\fontfamily{lmodern}\selectfont}
然后在文档中输入
Πέτρος ἀπόστολος Ἰησοῦ Χριστοῦ ἐκλεκτοῖς παρεπιδήμοις διασπορᾶς Πόντου, Γαλατίας, Καππαδοκίας, Ἀσίας καὶ Βιθυνίας
输出文本为
Πέτρος ἀ Ἰῦ Χριστοῦ ἐῖ παρεπιδήμοις διασπορᾶ Πόντου, Γαλατίας, καππαδοκίας, Ἀ καὶ Βιθυνίας
即缺少一些字符。
更奇怪的是,从文档中我发现Greek
实际上调用了Coptic
,GreekAndCoptic
和GreekExtended
,但是当我单独调用它们时,会呈现更多的字符(但仍然缺少一些)。
我尝试不使用这些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
确实打了电话Coptic
,GreekAndCoptic
并且GreekExtended
……
可能是休息时间位于Coptic
、GreekAndCoptic
和之间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 就不需要了。
我还发现,如果的第二个参数包含我需要输入的内容,则使用Latin
in\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
不支持希腊语。我比较了lmodern
和cm-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)的各种方法,以及如何在需要时切换字体编码。