Lulatex - Lỗi ký tự Unicode

Sep 23 2020

Tôi đang sử dụng tài liệu \ LaTeX sử dụng cả phông chữ Devnagari và Latin.

Lệnh được sử dụng là: lualatex -shell-escape -interaction nonstopmode

Tuy nhiên, mặc dù lựa chọn các phông chữ thích hợp. Mã tối thiểu là:

Tôi cũng đã thử sử dụng gói polyglossia, (theo https://tex.stackexchange.com/a/24731/50653), nhưng vẫn không có sự khác biệt.

\documentclass[10pt]{article}

\usepackage{polyglossia}
\setdefaultlanguage{english}
\setotherlanguage{hindi}

% From https://tex.stackexchange.com/a/37251
\usepackage{fontspec}
\setmainfont{Noto Serif} % sets the roman font
\setsansfont{Noto Sans} % sets the sans font
\setmonofont{Fira Code} % sets the monospace font
\defaultfontfeatures{Ligatures=TeX} % makes this a feature for all selected fonts

\newfontfamily\hindifont[Script=Devanagari]{Noto Serif Devanagari}
\newfontfamily\hindifontsf[Script=Devanagari]{Noto Sans Devanagari}

\begin{document}

All the places marked with red triangles are \emph{sites} from which archaeologists have found evidence of hunter-gatherers. (Hunter-gatherers lived in many more places. Only some are shown on the map). Many sites were located near sources of water, such as rivers and lakes.
येह एक प्रयोग है हिन्दी की लिखावट देखने के लिए।
\end{document}

Kết quả thu được là:

Trong khi người ta mong đợi các ký tự Devanagari cũng được hiển thị.

Trước đó tôi cũng đã thử

\documentclass[10pt]{article}

\usepackage[hindi, english]{babel}

% From https://tex.stackexchange.com/a/37251
\usepackage{fontspec}
\setmainfont{Noto Serif} % sets the roman font
\setsansfont{Noto Sans} % sets the sans font
\setmonofont{Fira Code} % sets the monospace font
\defaultfontfeatures{Ligatures=TeX} % makes this a feature for all selected fonts

\begin{document}

All the places marked with red triangles are \emph{sites} from which archaeologists have found evidence of hunter-gatherers. (Hunter-gatherers lived in many more places. Only some are shown on the map). Many sites were located near sources of water, such as rivers and lakes.
येह एक प्रयोग है हिन्दी की लिखावट देखने के लिए।
\end{document}

Trả lời

8 MarcelKrüger Sep 23 2020 at 13:32

Có hai vấn đề đang diễn ra ở đây: Vấn đề chính là phông chữ được chọn không chứa các ký tự được đề cập, vấn đề khác là việc sử dụng các lệnh tải phông chữ fontspec mà không chỉ định rõ ràng một tập lệnh và ngôn ngữ mặc định là chữ viết Latinh và do đó không định hình được chỉ báo tập lệnh một cách chính xác.

Nếu bạn không muốn lo lắng về các tham số tập lệnh / ngôn ngữ phù hợp cho fontspec, bạn có thể sử dụng trình bao bọc fontspec của babel \babelfontđể chỉ định các phông chữ cho ngôn ngữ của bạn. Để làm việc này một cách chính xác (đặc biệt đối với ngôn ngữ cụ thể hình để làm việc), bạn phải chỉ ra những thay đổi ngôn ngữ trong tài liệu của bạn sử dụng \selectlanguage, \foreignlanguagehoặc otherlanguage/ otherlanguage*môi trường. Nếu bạn viết toàn bộ một đoạn văn bằng một ngôn ngữ khác, bạn có thể sử dụng \selectlanguage{new-language}, đối với các phần của đoạn văn thì có \foreignlanguage{new-language}{text-in-new-language}.

Bạn có thể tìm thấy chi tiết về tất cả những điều này trong sổ tay hướng dẫn sử dụng babel , phần 1.2 (Tài liệu đa ngôn ngữ), phần 1.7 & 1.8 (Bộ chọn ngôn ngữ cơ bản / bổ trợ) và phần 1.14 (Chọn phông chữ).

\documentclass[10pt]{article}

\usepackage[hindi, english]{babel}

\babelfont{rm}{Noto Serif} % sets the roman font
\babelfont{sf}{Noto Sans} % sets the sans font
\babelfont{tt}{Fira Code} % sets the monospace font
\babelfont[hindi]{rm}{Noto Serif Devanagari}
\babelfont[hindi]{sf}{Noto Sans Devanagari}

\begin{document}

All the places marked with red triangles are \emph{sites} from which archaeologists have found evidence of hunter-gatherers. (Hunter-gatherers lived in many more places. Only some are shown on the map). Many sites were located near sources of water, such as rivers and lakes.
\foreignlanguage{hindi}{येह एक प्रयोग है हिन्दी की लिखावट देखने के लिए।}
More English.

\selectlanguage{hindi}

येह एक प्रयोग है हिन्दी की लिखावट देखने के लिए। येह एक प्रयोग है हिन्दी की लिखावट देखने के लिए।
येह एक प्रयोग है हिन्दी की लिखावट देखने के लिए। येह एक प्रयोग है हिन्दी की लिखावट देखने के लिए।
येह एक प्रयोग है हिन्दी की लिखावट देखने के लिए। येह एक प्रयोग है हिन्दी की लिखावट देखने के लिए।

\selectlanguage{english}

And English again.
\end{document}

Như Davislor đã đề cập trong một nhận xét, phần sau yêu cầu cài đặt TeX khá hiện đại (được cập nhật vào tháng 2 năm 2020 trở lên) và do đó có thể không hoạt động trên hệ thống của bạn hoặc bị hỏng nếu bạn cố gắng biên dịch tài liệu của mình trên một hệ thống khác:

Nếu bạn thực sự, thực sự không thể chèn các lệnh chuyển đổi ngôn ngữ như vậy, bạn chỉ sử dụng một ngôn ngữ từ mọi hệ thống tập lệnh và bạn không quan tâm đến khoảng cách đoạn thích hợp trong văn bản Devanagari (ví dụ: vì nó chủ yếu là tiếng latin), bạn cũng có thể sử dụng onchar=ids fonts:

\usepackage[hindi, english]{babel}

với

\usepackage[english]{babel}
\babelprovide[import, onchar=ids fonts]{hindi}

Sau đó, babel tự động chuyển phông chữ và các mẫu gạch nối sang tiếng Hindi khi nó gặp các ký tự Devanagari. (Tất nhiên, bạn có thể chuyển đổi englishvà hindinếu bạn chủ yếu có văn bản tiếng Hindi.)

1 ljrk Sep 23 2020 at 14:38

Chào mừng đến với TeX.SX!

Trình tạo hình LuaTeX dev2có một chút rắc rối với các tập lệnh Indic, nhưng đã có một phiên bản khác được gọi devara, như đã đề cập tronghttps://tex.stackexchange.com/a/362738/90407. Tuy nhiên, gần đây, LuaTeX đã hỗ trợ thêm để sử dụng bộ định hình HarfBuzz thay vì bộ định hình tích hợp sẵn. Cả hai biến thể sẽ cho kết quả tương đương, mặc dù có sự khác biệt nhỏ. Tuy nhiên, trong cả hai trường hợp, chúng ta cần tạo công tắc phông chữ cho họ phông chữ mới. Sử dụng polyglossia, chúng tôi có thể thêm một ngôn ngữ khác và xác định các họ phông chữ mới cho ngôn ngữ đó, điều này sẽ tự động xử lý tất cả việc chuyển đổi phông chữ giữa sans-serif và serif:

LuaTeX deva

\documentclass{article}

\usepackage{polyglossia}
\setdefaultlanguage{english}
\setotherlanguage{hindi}

\usepackage{fontspec}
% define Devanagari script using `deva' backend
\newfontscript{Devanagari}{deva,dev2}

\setmainfont{Noto Serif}
\setsansfont{Noto Sans}
% Create font switches for Devanagari font
% These are hard-coded into polyglossia, if we name them differently
% we get:
%     Package polyglossia Error: The current latin font [...] does
%     not contain the "Devanagari" script!
%     Please define \devanagarifont with \newfontfamily command.
\newfontfamily{\devanagarifont}{Noto Serif Devanagari}[Script=Devanagari]
\newfontfamily{\devanagarifontsf}{Noto Sans Devanagari}[Script=Devanagari]

\defaultfontfeatures{Ligatures=TeX}

\begin{document}

All the places marked with red triangles are \emph{sites} from which archaeologists have found evidence of hunter-gatherers. (Hunter-gatherers lived in many more places. Only some are shown on the map). Many sites were located near sources of water, such as rivers and lakes.
\texthindi{येह एक प्रयोग है हिन्दी की लिखावट देखने के लिए।}


All the places marked with red triangles are \emph{sites} from which archaeologists have found evidence of hunter-gatherers. (Hunter-gatherers lived in many more places. Only some are shown on the map). Many sites were located near sources of water, such as rivers and lakes.
\texthindi{\textsf{येह एक प्रयोग है हिन्दी की लिखावट देखने के लिए।}}
\end{document}

Kết quả là:

LuaTeX với HarfBuzz (LuaHBTeX)

Ngoài ra, chúng tôi không xác định một tập lệnh mới mà chỉ cần yêu cầu HarfBuzz thực hiện công việc nặng nhọc:

\documentclass{article}

\usepackage{polyglossia}
\setdefaultlanguage{english}

\usepackage{fontspec}

\setmainfont{Noto Serif}
\setsansfont{Noto Sans}
% Create font switches for Devanagari font
% These are hard-coded into polyglossia, if we name them differently
% we get:
%     Package polyglossia Error: The current latin font [...] does
%     not contain the "Devanagari" script!
%     Please define \devanagarifont with \newfontfamily command.
\newfontfamily{\devanagarifont}{Noto Serif Devanagari}[Script=Devanagari,Renderer=Harfbuzz]
\newfontfamily{\devanagarifontsf}{Noto Sans Devanagari}[Script=Devanagari,Renderer=Harfbuzz]

\defaultfontfeatures{Ligatures=TeX}

\begin{document}

All the places marked with red triangles are \emph{sites} from which archaeologists have found evidence of hunter-gatherers. (Hunter-gatherers lived in many more places. Only some are shown on the map). Many sites were located near sources of water, such as rivers and lakes.
\texthindi{येह एक प्रयोग है हिन्दी की लिखावट देखने के लिए।}


All the places marked with red triangles are \emph{sites} from which archaeologists have found evidence of hunter-gatherers. (Hunter-gatherers lived in many more places. Only some are shown on the map). Many sites were located near sources of water, such as rivers and lakes.
\texthindi{\textsf{येह एक प्रयोग है हिन्दी की लिखावट देखने के लिए।}}
\end{document}

Kết quả là:


Lấy trình duyệt của tôi hiển thị làm tham chiếu, điều này có vẻ khá ổn đối với tôi.


Nếu bạn không quan tâm đến khoảng cách thích hợp, bạn có thể làm điều này mà không cần polyglossia, với một cái gì đó như sau:

\usepackage[Devanagari]{ucharclasses}

\setTransitionsFor{Devanagari}{\devanagarifont}

Tuy nhiên, điều này sẽ chỉ chuyển đổi phông chữ và loại bỏ bất kỳ điều chỉnh ngôn ngữ nào khác được polyglossia thực hiện.