Lulatex - Kesalahan karakter Unicode

Sep 23 2020

Saya menggunakan dokumen \ LaTeX menggunakan font Devnagari dan Latin.

Perintah yang digunakan adalah: lualatex -shell-escape -interaction nonstopmode

Namun, meski memilih font yang sesuai. Kode minimalnya adalah:

Saya juga mencoba menggunakan paket polyglossia, (sesuai https://tex.stackexchange.com/a/24731/50653), namun tetap tidak ada perbedaan.

\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}

Hasil yang diperoleh adalah:

Sementara seseorang mengharapkan karakter Devanagari akan diberikan juga.

Saya sebelumnya juga mencoba

\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}

Jawaban

8 MarcelKrüger Sep 23 2020 at 13:32

Ada dua masalah yang berperan di sini: Masalah utama adalah bahwa font yang dipilih tidak berisi karakter yang dimaksud, masalah lainnya adalah menggunakan perintah fontspec fontloading tanpa secara eksplisit menentukan skrip dan bahasa default ke skrip Latin dan oleh karena itu tidak membentuk indic skrip dengan benar.

Jika Anda tidak ingin mengkhawatirkan parameter skrip / bahasa yang tepat untuk fontspec, Anda dapat menggunakan babel's fontspec wrapper \babelfontuntuk menentukan font untuk bahasa Anda. Agar ini bekerja dengan benar (terutama untuk pembentukan bahasa tertentu untuk bekerja) Anda harus menunjukkan perubahan bahasa dalam dokumen Anda menggunakan \selectlanguage, \foreignlanguageatau otherlanguage/ otherlanguage*lingkungan. Jika Anda menulis seluruh paragraf dalam bahasa lain yang dapat Anda gunakan \selectlanguage{new-language}, ada beberapa bagian paragraf \foreignlanguage{new-language}{text-in-new-language}.

Anda dapat menemukan detail tentang semua ini di manual babel , bagian 1.2 (Dokumen multibahasa), bagian 1.7 & 1.8 (pemilih bahasa Dasar / Tambahan) dan bagian 1.14 (Memilih font).

\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}

Seperti yang disebutkan Davislor dalam komentar, berikut ini memerlukan instalasi TeX yang cukup modern (diperbarui pada Februari 2020 atau lebih baru) dan oleh karena itu mungkin tidak berfungsi di sistem Anda atau rusak jika Anda mencoba mengompilasi dokumen di sistem lain:

Jika Anda benar-benar tidak dapat memasukkan perintah peralihan bahasa seperti itu, Anda hanya menggunakan satu bahasa dari setiap sistem skrip dan Anda tidak peduli tentang spasi paragraf yang tepat dalam teks Devanagari (misalnya karena sebagian besar latin) Anda juga dapat menggunakan onchar=ids fonts: Ganti

\usepackage[hindi, english]{babel}

dengan

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

Kemudian babel secara otomatis mengganti font dan pola tanda hubung ke Hindi ketika bertemu dengan karakter Dewanagari. (Tentu saja, Anda dapat beralih englishdan hindisebagian besar memiliki teks Hindi.)

1 ljrk Sep 23 2020 at 14:38

Selamat datang di TeX.SX!

Pembentuk LuaTeX dev2agak bermasalah dengan skrip Indic, tetapi ada versi lain yang dipanggil deva, seperti yang disebutkan dihttps://tex.stackexchange.com/a/362738/90407. Akan tetapi, baru-baru ini, LuaTeX memiliki dukungan tambahan untuk menggunakan pembentuk HarfBuzz sebagai ganti yang ada di dalamnya. Kedua varian tersebut harus memberikan hasil yang sebanding, meskipun dengan sedikit perbedaan. Dalam kedua kasus kita perlu membuat sakelar font untuk keluarga font baru. Dengan menggunakan poliglosia kita dapat menambahkan bahasa lain dan menentukan keluarga font baru untuk bahasa tersebut yang akan menangani semua font yang beralih antara sans-serif dan serif secara otomatis:

Dewa LuaTeX

\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}

Hasilnya adalah:

LuaTeX dengan HarfBuzz (LuaHBTeX)

Alternatifnya, kami tidak mendefinisikan skrip baru tetapi hanya meminta HarfBuzz untuk melakukan pekerjaan berat:

\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}

Hasil yang mana:


Mengambil rendering browser saya sebagai referensi, ini terlihat cukup oke bagi saya.


Jika Anda tidak peduli dengan jarak yang tepat, Anda dapat melakukannya tanpa poliglosia, dengan sesuatu seperti ini:

\usepackage[Devanagari]{ucharclasses}

\setTransitionsFor{Devanagari}{\devanagarifont}

Namun, ini hanya akan mengganti font dan menghilangkan penyesuaian bahasa lain yang diterapkan oleh poliglosia.